123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644 |
- // Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved.
- // Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net)
- // Portions Copyright © 1997-1999 Vita Nuova Limited
- // Portions Copyright © 2000-2008 Vita Nuova Holdings Limited (www.vitanuova.com)
- // Portions Copyright © 2004,2006 Bruce Ellis
- // Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net)
- // Revisions Copyright © 2000-2008 Lucent Technologies Inc. and others
- // Portions Copyright © 2009 The Go Authors. All rights reserved.
- // Portions Copyright © 2019 The Go Authors. All rights reserved.
- //
- // Permission is hereby granted, free of charge, to any person obtaining a copy
- // of this software and associated documentation files (the "Software"), to deal
- // in the Software without restriction, including without limitation the rights
- // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- // copies of the Software, and to permit persons to whom the Software is
- // furnished to do so, subject to the following conditions:
- //
- // The above copyright notice and this permission notice shall be included in
- // all copies or substantial portions of the Software.
- //
- // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- // THE SOFTWARE.
- package riscv
- import "github.com/twitchyliquid64/golang-asm/obj"
- //go:generate go run ../stringer.go -i $GOFILE -o anames.go -p riscv
- const (
- // Base register numberings.
- REG_X0 = obj.RBaseRISCV + iota
- REG_X1
- REG_X2
- REG_X3
- REG_X4
- REG_X5
- REG_X6
- REG_X7
- REG_X8
- REG_X9
- REG_X10
- REG_X11
- REG_X12
- REG_X13
- REG_X14
- REG_X15
- REG_X16
- REG_X17
- REG_X18
- REG_X19
- REG_X20
- REG_X21
- REG_X22
- REG_X23
- REG_X24
- REG_X25
- REG_X26
- REG_X27
- REG_X28
- REG_X29
- REG_X30
- REG_X31
- // FP register numberings.
- REG_F0
- REG_F1
- REG_F2
- REG_F3
- REG_F4
- REG_F5
- REG_F6
- REG_F7
- REG_F8
- REG_F9
- REG_F10
- REG_F11
- REG_F12
- REG_F13
- REG_F14
- REG_F15
- REG_F16
- REG_F17
- REG_F18
- REG_F19
- REG_F20
- REG_F21
- REG_F22
- REG_F23
- REG_F24
- REG_F25
- REG_F26
- REG_F27
- REG_F28
- REG_F29
- REG_F30
- REG_F31
- // This marks the end of the register numbering.
- REG_END
- // General registers reassigned to ABI names.
- REG_ZERO = REG_X0
- REG_RA = REG_X1 // aka REG_LR
- REG_SP = REG_X2
- REG_GP = REG_X3 // aka REG_SB
- REG_TP = REG_X4 // aka REG_G
- REG_T0 = REG_X5
- REG_T1 = REG_X6
- REG_T2 = REG_X7
- REG_S0 = REG_X8
- REG_S1 = REG_X9
- REG_A0 = REG_X10
- REG_A1 = REG_X11
- REG_A2 = REG_X12
- REG_A3 = REG_X13
- REG_A4 = REG_X14
- REG_A5 = REG_X15
- REG_A6 = REG_X16
- REG_A7 = REG_X17
- REG_S2 = REG_X18
- REG_S3 = REG_X19
- REG_S4 = REG_X20 // aka REG_CTXT
- REG_S5 = REG_X21
- REG_S6 = REG_X22
- REG_S7 = REG_X23
- REG_S8 = REG_X24
- REG_S9 = REG_X25
- REG_S10 = REG_X26
- REG_S11 = REG_X27
- REG_T3 = REG_X28
- REG_T4 = REG_X29
- REG_T5 = REG_X30
- REG_T6 = REG_X31 // aka REG_TMP
- // Go runtime register names.
- REG_G = REG_TP // G pointer.
- REG_CTXT = REG_S4 // Context for closures.
- REG_LR = REG_RA // Link register.
- REG_TMP = REG_T6 // Reserved for assembler use.
- // ABI names for floating point registers.
- REG_FT0 = REG_F0
- REG_FT1 = REG_F1
- REG_FT2 = REG_F2
- REG_FT3 = REG_F3
- REG_FT4 = REG_F4
- REG_FT5 = REG_F5
- REG_FT6 = REG_F6
- REG_FT7 = REG_F7
- REG_FS0 = REG_F8
- REG_FS1 = REG_F9
- REG_FA0 = REG_F10
- REG_FA1 = REG_F11
- REG_FA2 = REG_F12
- REG_FA3 = REG_F13
- REG_FA4 = REG_F14
- REG_FA5 = REG_F15
- REG_FA6 = REG_F16
- REG_FA7 = REG_F17
- REG_FS2 = REG_F18
- REG_FS3 = REG_F19
- REG_FS4 = REG_F20
- REG_FS5 = REG_F21
- REG_FS6 = REG_F22
- REG_FS7 = REG_F23
- REG_FS8 = REG_F24
- REG_FS9 = REG_F25
- REG_FS10 = REG_F26
- REG_FS11 = REG_F27
- REG_FT8 = REG_F28
- REG_FT9 = REG_F29
- REG_FT10 = REG_F30
- REG_FT11 = REG_F31
- // Names generated by the SSA compiler.
- REGSP = REG_SP
- REGG = REG_G
- )
- // https://github.com/riscv/riscv-elf-psabi-doc/blob/master/riscv-elf.md#dwarf-register-numbers
- var RISCV64DWARFRegisters = map[int16]int16{
- // Integer Registers.
- REG_X0: 0,
- REG_X1: 1,
- REG_X2: 2,
- REG_X3: 3,
- REG_X4: 4,
- REG_X5: 5,
- REG_X6: 6,
- REG_X7: 7,
- REG_X8: 8,
- REG_X9: 9,
- REG_X10: 10,
- REG_X11: 11,
- REG_X12: 12,
- REG_X13: 13,
- REG_X14: 14,
- REG_X15: 15,
- REG_X16: 16,
- REG_X17: 17,
- REG_X18: 18,
- REG_X19: 19,
- REG_X20: 20,
- REG_X21: 21,
- REG_X22: 22,
- REG_X23: 23,
- REG_X24: 24,
- REG_X25: 25,
- REG_X26: 26,
- REG_X27: 27,
- REG_X28: 28,
- REG_X29: 29,
- REG_X30: 30,
- REG_X31: 31,
- // Floating-Point Registers.
- REG_F0: 32,
- REG_F1: 33,
- REG_F2: 34,
- REG_F3: 35,
- REG_F4: 36,
- REG_F5: 37,
- REG_F6: 38,
- REG_F7: 39,
- REG_F8: 40,
- REG_F9: 41,
- REG_F10: 42,
- REG_F11: 43,
- REG_F12: 44,
- REG_F13: 45,
- REG_F14: 46,
- REG_F15: 47,
- REG_F16: 48,
- REG_F17: 49,
- REG_F18: 50,
- REG_F19: 51,
- REG_F20: 52,
- REG_F21: 53,
- REG_F22: 54,
- REG_F23: 55,
- REG_F24: 56,
- REG_F25: 57,
- REG_F26: 58,
- REG_F27: 59,
- REG_F28: 60,
- REG_F29: 61,
- REG_F30: 62,
- REG_F31: 63,
- }
- // Prog.Mark flags.
- const (
- // NEED_PCREL_ITYPE_RELOC is set on AUIPC instructions to indicate that
- // it is the first instruction in an AUIPC + I-type pair that needs a
- // R_RISCV_PCREL_ITYPE relocation.
- NEED_PCREL_ITYPE_RELOC = 1 << 0
- // NEED_PCREL_STYPE_RELOC is set on AUIPC instructions to indicate that
- // it is the first instruction in an AUIPC + S-type pair that needs a
- // R_RISCV_PCREL_STYPE relocation.
- NEED_PCREL_STYPE_RELOC = 1 << 1
- )
- // RISC-V mnemonics, as defined in the "opcodes" and "opcodes-pseudo" files
- // from:
- //
- // https://github.com/riscv/riscv-opcodes
- //
- // As well as some pseudo-mnemonics (e.g. MOV) used only in the assembler.
- //
- // See also "The RISC-V Instruction Set Manual" at:
- //
- // https://riscv.org/specifications/
- //
- // If you modify this table, you MUST run 'go generate' to regenerate anames.go!
- const (
- // Unprivileged ISA (Document Version 20190608-Base-Ratified)
- // 2.4: Integer Computational Instructions
- AADDI = obj.ABaseRISCV + obj.A_ARCHSPECIFIC + iota
- ASLTI
- ASLTIU
- AANDI
- AORI
- AXORI
- ASLLI
- ASRLI
- ASRAI
- ALUI
- AAUIPC
- AADD
- ASLT
- ASLTU
- AAND
- AOR
- AXOR
- ASLL
- ASRL
- ASUB
- ASRA
- // The SLL/SRL/SRA instructions differ slightly between RV32 and RV64,
- // hence there are pseudo-opcodes for the RV32 specific versions.
- ASLLIRV32
- ASRLIRV32
- ASRAIRV32
- // 2.5: Control Transfer Instructions
- AJAL
- AJALR
- ABEQ
- ABNE
- ABLT
- ABLTU
- ABGE
- ABGEU
- // 2.6: Load and Store Instructions
- ALW
- ALWU
- ALH
- ALHU
- ALB
- ALBU
- ASW
- ASH
- ASB
- // 2.7: Memory Ordering Instructions
- AFENCE
- AFENCEI
- AFENCETSO
- // 5.2: Integer Computational Instructions (RV64I)
- AADDIW
- ASLLIW
- ASRLIW
- ASRAIW
- AADDW
- ASLLW
- ASRLW
- ASUBW
- ASRAW
- // 5.3: Load and Store Instructions (RV64I)
- ALD
- ASD
- // 7.1: Multiplication Operations
- AMUL
- AMULH
- AMULHU
- AMULHSU
- AMULW
- ADIV
- ADIVU
- AREM
- AREMU
- ADIVW
- ADIVUW
- AREMW
- AREMUW
- // 8.2: Load-Reserved/Store-Conditional Instructions
- ALRD
- ASCD
- ALRW
- ASCW
- // 8.3: Atomic Memory Operations
- AAMOSWAPD
- AAMOADDD
- AAMOANDD
- AAMOORD
- AAMOXORD
- AAMOMAXD
- AAMOMAXUD
- AAMOMIND
- AAMOMINUD
- AAMOSWAPW
- AAMOADDW
- AAMOANDW
- AAMOORW
- AAMOXORW
- AAMOMAXW
- AAMOMAXUW
- AAMOMINW
- AAMOMINUW
- // 10.1: Base Counters and Timers
- ARDCYCLE
- ARDCYCLEH
- ARDTIME
- ARDTIMEH
- ARDINSTRET
- ARDINSTRETH
- // 11.2: Floating-Point Control and Status Register
- AFRCSR
- AFSCSR
- AFRRM
- AFSRM
- AFRFLAGS
- AFSFLAGS
- AFSRMI
- AFSFLAGSI
- // 11.5: Single-Precision Load and Store Instructions
- AFLW
- AFSW
- // 11.6: Single-Precision Floating-Point Computational Instructions
- AFADDS
- AFSUBS
- AFMULS
- AFDIVS
- AFMINS
- AFMAXS
- AFSQRTS
- AFMADDS
- AFMSUBS
- AFNMADDS
- AFNMSUBS
- // 11.7: Single-Precision Floating-Point Conversion and Move Instructions
- AFCVTWS
- AFCVTLS
- AFCVTSW
- AFCVTSL
- AFCVTWUS
- AFCVTLUS
- AFCVTSWU
- AFCVTSLU
- AFSGNJS
- AFSGNJNS
- AFSGNJXS
- AFMVXS
- AFMVSX
- AFMVXW
- AFMVWX
- // 11.8: Single-Precision Floating-Point Compare Instructions
- AFEQS
- AFLTS
- AFLES
- // 11.9: Single-Precision Floating-Point Classify Instruction
- AFCLASSS
- // 12.3: Double-Precision Load and Store Instructions
- AFLD
- AFSD
- // 12.4: Double-Precision Floating-Point Computational Instructions
- AFADDD
- AFSUBD
- AFMULD
- AFDIVD
- AFMIND
- AFMAXD
- AFSQRTD
- AFMADDD
- AFMSUBD
- AFNMADDD
- AFNMSUBD
- // 12.5: Double-Precision Floating-Point Conversion and Move Instructions
- AFCVTWD
- AFCVTLD
- AFCVTDW
- AFCVTDL
- AFCVTWUD
- AFCVTLUD
- AFCVTDWU
- AFCVTDLU
- AFCVTSD
- AFCVTDS
- AFSGNJD
- AFSGNJND
- AFSGNJXD
- AFMVXD
- AFMVDX
- // 12.6: Double-Precision Floating-Point Compare Instructions
- AFEQD
- AFLTD
- AFLED
- // 12.7: Double-Precision Floating-Point Classify Instruction
- AFCLASSD
- // 13.1 Quad-Precision Load and Store Instructions
- AFLQ
- AFSQ
- // 13.2: Quad-Precision Computational Instructions
- AFADDQ
- AFSUBQ
- AFMULQ
- AFDIVQ
- AFMINQ
- AFMAXQ
- AFSQRTQ
- AFMADDQ
- AFMSUBQ
- AFNMADDQ
- AFNMSUBQ
- // 13.3 Quad-Precision Convert and Move Instructions
- AFCVTWQ
- AFCVTLQ
- AFCVTSQ
- AFCVTDQ
- AFCVTQW
- AFCVTQL
- AFCVTQS
- AFCVTQD
- AFCVTWUQ
- AFCVTLUQ
- AFCVTQWU
- AFCVTQLU
- AFSGNJQ
- AFSGNJNQ
- AFSGNJXQ
- AFMVXQ
- AFMVQX
- // 13.4 Quad-Precision Floating-Point Compare Instructions
- AFEQQ
- AFLEQ
- AFLTQ
- // 13.5 Quad-Precision Floating-Point Classify Instruction
- AFCLASSQ
- // Privileged ISA (Version 20190608-Priv-MSU-Ratified)
- // 3.1.9: Instructions to Access CSRs
- ACSRRW
- ACSRRS
- ACSRRC
- ACSRRWI
- ACSRRSI
- ACSRRCI
- // 3.2.1: Environment Call and Breakpoint
- AECALL
- ASCALL
- AEBREAK
- ASBREAK
- // 3.2.2: Trap-Return Instructions
- AMRET
- ASRET
- AURET
- ADRET
- // 3.2.3: Wait for Interrupt
- AWFI
- // 4.2.1: Supervisor Memory-Management Fence Instruction
- ASFENCEVMA
- // Hypervisor Memory-Management Instructions
- AHFENCEGVMA
- AHFENCEVVMA
- // The escape hatch. Inserts a single 32-bit word.
- AWORD
- // Pseudo-instructions. These get translated by the assembler into other
- // instructions, based on their operands.
- ABEQZ
- ABGEZ
- ABGT
- ABGTU
- ABGTZ
- ABLE
- ABLEU
- ABLEZ
- ABLTZ
- ABNEZ
- AFNEGD
- AFNEGS
- AFNED
- AFNES
- AMOV
- AMOVB
- AMOVBU
- AMOVF
- AMOVD
- AMOVH
- AMOVHU
- AMOVW
- AMOVWU
- ANEG
- ANEGW
- ANOT
- ASEQZ
- ASNEZ
- // End marker
- ALAST
- )
- // All unary instructions which write to their arguments (as opposed to reading
- // from them) go here. The assembly parser uses this information to populate
- // its AST in a semantically reasonable way.
- //
- // Any instructions not listed here are assumed to either be non-unary or to read
- // from its argument.
- var unaryDst = map[obj.As]bool{
- ARDCYCLE: true,
- ARDCYCLEH: true,
- ARDTIME: true,
- ARDTIMEH: true,
- ARDINSTRET: true,
- ARDINSTRETH: true,
- }
- // Instruction encoding masks.
- const (
- // ITypeImmMask is a mask including only the immediate portion of
- // I-type instructions.
- ITypeImmMask = 0xfff00000
- // STypeImmMask is a mask including only the immediate portion of
- // S-type instructions.
- STypeImmMask = 0xfe000f80
- // UTypeImmMask is a mask including only the immediate portion of
- // U-type instructions.
- UTypeImmMask = 0xfffff000
- // UJTypeImmMask is a mask including only the immediate portion of
- // UJ-type instructions.
- UJTypeImmMask = UTypeImmMask
- )
|