// 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 ( "errors" "fmt" "cmd/internal/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 // Floating Point 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 // Vector register numberings. REG_V0 REG_V1 REG_V2 REG_V3 REG_V4 REG_V5 REG_V6 REG_V7 REG_V8 REG_V9 REG_V10 REG_V11 REG_V12 REG_V13 REG_V14 REG_V15 REG_V16 REG_V17 REG_V18 REG_V19 REG_V20 REG_V21 REG_V22 REG_V23 REG_V24 REG_V25 REG_V26 REG_V27 REG_V28 REG_V29 REG_V30 REG_V31 // 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 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 REG_S5 = REG_X21 REG_S6 = REG_X22 REG_S7 = REG_X23 REG_S8 = REG_X24 REG_S9 = REG_X25 REG_S10 = REG_X26 // aka REG_CTXT REG_S11 = REG_X27 // aka REG_G REG_T3 = REG_X28 REG_T4 = REG_X29 REG_T5 = REG_X30 REG_T6 = REG_X31 // aka REG_TMP // Go runtime register names. REG_CTXT = REG_S10 // Context for closures. REG_G = REG_S11 // G pointer. 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-non-isa/riscv-elf-psabi-doc/blob/master/riscv-dwarf.adoc#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 ( // USES_REG_TMP indicates that a machine instruction generated from the // corresponding *obj.Prog uses the temporary register. USES_REG_TMP = 1 << iota // NEED_JAL_RELOC is set on JAL instructions to indicate that a // R_RISCV_JAL relocation is needed. NEED_JAL_RELOC // NEED_CALL_RELOC is set on an AUIPC instruction to indicate that it // is the first instruction in an AUIPC + JAL pair that needs a // R_RISCV_CALL relocation. NEED_CALL_RELOC // 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 // 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 ) // RISC-V mnemonics, as defined in the "opcodes" and "opcodes-pseudo" files // at 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/technical/specifications/. // // If you modify this table, you MUST run 'go generate' to regenerate anames.go! const ( // // Unprivileged ISA (version 20240411) // // 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 // 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 // 4.2: Integer Computational Instructions (RV64I) AADDIW ASLLIW ASRLIW ASRAIW AADDW ASLLW ASRLW ASUBW ASRAW // 4.3: Load and Store Instructions (RV64I) ALD ASD // 7.1: CSR Instructions (Zicsr) ACSRRW ACSRRS ACSRRC ACSRRWI ACSRRSI ACSRRCI // 13.1: Multiplication Operations AMUL AMULH AMULHU AMULHSU AMULW // 13.2: Division Operations ADIV ADIVU AREM AREMU ADIVW ADIVUW AREMW AREMUW // 14.2: Load-Reserved/Store-Conditional Instructions (Zalrsc) ALRD ASCD ALRW ASCW // 14.4: Atomic Memory Operations (Zaamo) AAMOSWAPD AAMOADDD AAMOANDD AAMOORD AAMOXORD AAMOMAXD AAMOMAXUD AAMOMIND AAMOMINUD AAMOSWAPW AAMOADDW AAMOANDW AAMOORW AAMOXORW AAMOMAXW AAMOMAXUW AAMOMINW AAMOMINUW // 20.5: Single-Precision Load and Store Instructions AFLW AFSW // 20.6: Single-Precision Floating-Point Computational Instructions AFADDS AFSUBS AFMULS AFDIVS AFMINS AFMAXS AFSQRTS AFMADDS AFMSUBS AFNMADDS AFNMSUBS // 20.7: Single-Precision Floating-Point Conversion and Move Instructions AFCVTWS AFCVTLS AFCVTSW AFCVTSL AFCVTWUS AFCVTLUS AFCVTSWU AFCVTSLU AFSGNJS AFSGNJNS AFSGNJXS AFMVXS AFMVSX AFMVXW AFMVWX // 20.8: Single-Precision Floating-Point Compare Instructions AFEQS AFLTS AFLES // 20.9: Single-Precision Floating-Point Classify Instruction AFCLASSS // 21.3: Double-Precision Load and Store Instructions AFLD AFSD // 21.4: Double-Precision Floating-Point Computational Instructions AFADDD AFSUBD AFMULD AFDIVD AFMIND AFMAXD AFSQRTD AFMADDD AFMSUBD AFNMADDD AFNMSUBD // 21.5: Double-Precision Floating-Point Conversion and Move Instructions AFCVTWD AFCVTLD AFCVTDW AFCVTDL AFCVTWUD AFCVTLUD AFCVTDWU AFCVTDLU AFCVTSD AFCVTDS AFSGNJD AFSGNJND AFSGNJXD AFMVXD AFMVDX // 21.6: Double-Precision Floating-Point Compare Instructions AFEQD AFLTD AFLED // 21.7: Double-Precision Floating-Point Classify Instruction AFCLASSD // 22.1 Quad-Precision Load and Store Instructions AFLQ AFSQ // 22.2: Quad-Precision Computational Instructions AFADDQ AFSUBQ AFMULQ AFDIVQ AFMINQ AFMAXQ AFSQRTQ AFMADDQ AFMSUBQ AFNMADDQ AFNMSUBQ // 22.3 Quad-Precision Convert and Move Instructions AFCVTWQ AFCVTLQ AFCVTSQ AFCVTDQ AFCVTQW AFCVTQL AFCVTQS AFCVTQD AFCVTWUQ AFCVTLUQ AFCVTQWU AFCVTQLU AFSGNJQ AFSGNJNQ AFSGNJXQ // 22.4 Quad-Precision Floating-Point Compare Instructions AFEQQ AFLEQ AFLTQ // 22.5 Quad-Precision Floating-Point Classify Instruction AFCLASSQ // 28.4.1: Address Generation Instructions (Zba) AADDUW ASH1ADD ASH1ADDUW ASH2ADD ASH2ADDUW ASH3ADD ASH3ADDUW ASLLIUW // 28.4.2: Basic Bit Manipulation (Zbb) AANDN AORN AXNOR ACLZ ACLZW ACTZ ACTZW ACPOP ACPOPW AMAX AMAXU AMIN AMINU ASEXTB ASEXTH AZEXTH // 28.4.3: Bitwise Rotation (Zbb) AROL AROLW AROR ARORI ARORIW ARORW AORCB AREV8 // 28.4.4: Single-bit Instructions (Zbs) ABCLR ABCLRI ABEXT ABEXTI ABINV ABINVI ABSET ABSETI // // RISC-V Vector ISA-extension (1.0) (Unprivileged 20240411) // // 31.6. Configuration-Setting Instructions AVSETVLI AVSETIVLI AVSETVL // 31.7.4. Vector Unit-Stride Instructions AVLE8V AVLE16V AVLE32V AVLE64V AVSE8V AVSE16V AVSE32V AVSE64V AVLMV AVSMV // 31.7.5. Vector Strided Instructions AVLSE8V AVLSE16V AVLSE32V AVLSE64V AVSSE8V AVSSE16V AVSSE32V AVSSE64V // 31.7.6. Vector Indexed Instructions AVLUXEI8V AVLUXEI16V AVLUXEI32V AVLUXEI64V AVLOXEI8V AVLOXEI16V AVLOXEI32V AVLOXEI64V AVSUXEI8V AVSUXEI16V AVSUXEI32V AVSUXEI64V AVSOXEI8V AVSOXEI16V AVSOXEI32V AVSOXEI64V // 31.7.7. Unit-stride Fault-Only-First Loads AVLE8FFV AVLE16FFV AVLE32FFV AVLE64FFV // 31.7.9. Vector Load/Store Whole Register Instructions AVL1RE8V AVL1RE16V AVL1RE32V AVL1RE64V AVL2RE8V AVL2RE16V AVL2RE32V AVL2RE64V AVL4RE8V AVL4RE16V AVL4RE32V AVL4RE64V AVL8RE8V AVL8RE16V AVL8RE32V AVL8RE64V AVS1RV AVS2RV AVS4RV AVS8RV // 31.11.1. Vector Single-Width Integer Add and Subtract AVADDVV AVADDVX AVADDVI AVSUBVV AVSUBVX AVRSUBVX AVRSUBVI // 31.11.2. Vector Widening Integer Add/Subtract AVWADDUVV AVWADDUVX AVWSUBUVV AVWSUBUVX AVWADDVV AVWADDVX AVWSUBVV AVWSUBVX AVWADDUWV AVWADDUWX AVWSUBUWV AVWSUBUWX AVWADDWV AVWADDWX AVWSUBWV AVWSUBWX // 31.11.3. Vector Integer Extension AVZEXTVF2 AVSEXTVF2 AVZEXTVF4 AVSEXTVF4 AVZEXTVF8 AVSEXTVF8 // 31.11.4. Vector Integer Add-with-Carry / Subtract-with-Borrow Instructions AVADCVVM AVADCVXM AVADCVIM AVMADCVVM AVMADCVXM AVMADCVIM AVMADCVV AVMADCVX AVMADCVI AVSBCVVM AVSBCVXM AVMSBCVVM AVMSBCVXM AVMSBCVV AVMSBCVX // 31.11.5. Vector Bitwise Logical Instructions AVANDVV AVANDVX AVANDVI AVORVV AVORVX AVORVI AVXORVV AVXORVX AVXORVI // 31.11.6. Vector Single-Width Shift Instructions AVSLLVV AVSLLVX AVSLLVI AVSRLVV AVSRLVX AVSRLVI AVSRAVV AVSRAVX AVSRAVI // 31.11.7. Vector Narrowing Integer Right Shift Instructions AVNSRLWV AVNSRLWX AVNSRLWI AVNSRAWV AVNSRAWX AVNSRAWI // 31.11.8. Vector Integer Compare Instructions AVMSEQVV AVMSEQVX AVMSEQVI AVMSNEVV AVMSNEVX AVMSNEVI AVMSLTUVV AVMSLTUVX AVMSLTVV AVMSLTVX AVMSLEUVV AVMSLEUVX AVMSLEUVI AVMSLEVV AVMSLEVX AVMSLEVI AVMSGTUVX AVMSGTUVI AVMSGTVX AVMSGTVI // 31.11.9. Vector Integer Min/Max Instructions AVMINUVV AVMINUVX AVMINVV AVMINVX AVMAXUVV AVMAXUVX AVMAXVV AVMAXVX // 31.11.10. Vector Single-Width Integer Multiply Instructions AVMULVV AVMULVX AVMULHVV AVMULHVX AVMULHUVV AVMULHUVX AVMULHSUVV AVMULHSUVX // 31.11.11. Vector Integer Divide Instructions AVDIVUVV AVDIVUVX AVDIVVV AVDIVVX AVREMUVV AVREMUVX AVREMVV AVREMVX // 31.11.12. Vector Widening Integer Multiply Instructions AVWMULVV AVWMULVX AVWMULUVV AVWMULUVX AVWMULSUVV AVWMULSUVX // 31.11.13. Vector Single-Width Integer Multiply-Add Instructions AVMACCVV AVMACCVX AVNMSACVV AVNMSACVX AVMADDVV AVMADDVX AVNMSUBVV AVNMSUBVX // 31.11.14. Vector Widening Integer Multiply-Add Instructions AVWMACCUVV AVWMACCUVX AVWMACCVV AVWMACCVX AVWMACCSUVV AVWMACCSUVX AVWMACCUSVX // 31.11.15. Vector Integer Merge Instructions AVMERGEVVM AVMERGEVXM AVMERGEVIM // 31.11.16. Vector Integer Move Instructions AVMVVV AVMVVX AVMVVI // 31.12.1. Vector Single-Width Saturating Add and Subtract AVSADDUVV AVSADDUVX AVSADDUVI AVSADDVV AVSADDVX AVSADDVI AVSSUBUVV AVSSUBUVX AVSSUBVV AVSSUBVX // 31.12.2. Vector Single-Width Averaging Add and Subtract AVAADDUVV AVAADDUVX AVAADDVV AVAADDVX AVASUBUVV AVASUBUVX AVASUBVV AVASUBVX // 31.12.3. Vector Single-Width Fractional Multiply with Rounding and Saturation AVSMULVV AVSMULVX // 31.12.4. Vector Single-Width Scaling Shift Instructions AVSSRLVV AVSSRLVX AVSSRLVI AVSSRAVV AVSSRAVX AVSSRAVI // 31.12.5. Vector Narrowing Fixed-Point Clip Instructions AVNCLIPUWV AVNCLIPUWX AVNCLIPUWI AVNCLIPWV AVNCLIPWX AVNCLIPWI // 31.13.2. Vector Single-Width Floating-Point Add/Subtract Instructions AVFADDVV AVFADDVF AVFSUBVV AVFSUBVF AVFRSUBVF // 31.13.3. Vector Widening Floating-Point Add/Subtract Instructions AVFWADDVV AVFWADDVF AVFWSUBVV AVFWSUBVF AVFWADDWV AVFWADDWF AVFWSUBWV AVFWSUBWF // 31.13.4. Vector Single-Width Floating-Point Multiply/Divide Instructions AVFMULVV AVFMULVF AVFDIVVV AVFDIVVF AVFRDIVVF // 31.13.5. Vector Widening Floating-Point Multiply AVFWMULVV AVFWMULVF // 31.13.6. Vector Single-Width Floating-Point Fused Multiply-Add Instructions AVFMACCVV AVFMACCVF AVFNMACCVV AVFNMACCVF AVFMSACVV AVFMSACVF AVFNMSACVV AVFNMSACVF AVFMADDVV AVFMADDVF AVFNMADDVV AVFNMADDVF AVFMSUBVV AVFMSUBVF AVFNMSUBVV AVFNMSUBVF // 31.13.7. Vector Widening Floating-Point Fused Multiply-Add Instructions AVFWMACCVV AVFWMACCVF AVFWNMACCVV AVFWNMACCVF AVFWMSACVV AVFWMSACVF AVFWNMSACVV AVFWNMSACVF // 31.13.8. Vector Floating-Point Square-Root Instruction AVFSQRTV // 31.13.9. Vector Floating-Point Reciprocal Square-Root Estimate Instruction AVFRSQRT7V // 31.13.10. Vector Floating-Point Reciprocal Estimate Instruction AVFREC7V // 31.13.11. Vector Floating-Point MIN/MAX Instructions AVFMINVV AVFMINVF AVFMAXVV AVFMAXVF // 31.13.12. Vector Floating-Point Sign-Injection Instructions AVFSGNJVV AVFSGNJVF AVFSGNJNVV AVFSGNJNVF AVFSGNJXVV AVFSGNJXVF // 31.13.13. Vector Floating-Point Compare Instructions AVMFEQVV AVMFEQVF AVMFNEVV AVMFNEVF AVMFLTVV AVMFLTVF AVMFLEVV AVMFLEVF AVMFGTVF AVMFGEVF // 31.13.14. Vector Floating-Point Classify Instruction AVFCLASSV // 31.13.15. Vector Floating-Point Merge Instruction AVFMERGEVFM // 31.13.16. Vector Floating-Point Move Instruction AVFMVVF // 31.13.17. Single-Width Floating-Point/Integer Type-Convert Instructions AVFCVTXUFV AVFCVTXFV AVFCVTRTZXUFV AVFCVTRTZXFV AVFCVTFXUV AVFCVTFXV // 31.13.18. Widening Floating-Point/Integer Type-Convert Instructions AVFWCVTXUFV AVFWCVTXFV AVFWCVTRTZXUFV AVFWCVTRTZXFV AVFWCVTFXUV AVFWCVTFXV AVFWCVTFFV // 31.13.19. Narrowing Floating-Point/Integer Type-Convert Instructions AVFNCVTXUFW AVFNCVTXFW AVFNCVTRTZXUFW AVFNCVTRTZXFW AVFNCVTFXUW AVFNCVTFXW AVFNCVTFFW AVFNCVTRODFFW // 31.14.1. Vector Single-Width Integer Reduction Instructions AVREDSUMVS AVREDMAXUVS AVREDMAXVS AVREDMINUVS AVREDMINVS AVREDANDVS AVREDORVS AVREDXORVS // 31.14.2. Vector Widening Integer Reduction Instructions AVWREDSUMUVS AVWREDSUMVS // 31.14.3. Vector Single-Width Floating-Point Reduction Instructions AVFREDOSUMVS AVFREDUSUMVS AVFREDMAXVS AVFREDMINVS // 31.14.4. Vector Widening Floating-Point Reduction Instructions AVFWREDOSUMVS AVFWREDUSUMVS // 31.15. Vector Mask Instructions AVMANDMM AVMNANDMM AVMANDNMM AVMXORMM AVMORMM AVMNORMM AVMORNMM AVMXNORMM AVCPOPM AVFIRSTM AVMSBFM AVMSIFM AVMSOFM AVIOTAM AVIDV // 31.16.1. Integer Scalar Move Instructions AVMVXS AVMVSX // 31.16.2. Floating-Point Scalar Move Instructions AVFMVFS AVFMVSF // 31.16.3. Vector Slide Instructions AVSLIDEUPVX AVSLIDEUPVI AVSLIDEDOWNVX AVSLIDEDOWNVI AVSLIDE1UPVX AVFSLIDE1UPVF AVSLIDE1DOWNVX AVFSLIDE1DOWNVF // 31.16.4. Vector Register Gather Instructions AVRGATHERVV AVRGATHEREI16VV AVRGATHERVX AVRGATHERVI // 31.16.5. Vector Compress Instruction AVCOMPRESSVM // 31.16.6. Whole Vector Register Move AVMV1RV AVMV2RV AVMV4RV AVMV8RV // // Privileged ISA (version 20240411) // // 3.3.1: Environment Call and Breakpoint AECALL ASCALL AEBREAK ASBREAK // 3.3.2: Trap-Return Instructions AMRET ASRET ADRET // 3.3.3: Wait for Interrupt AWFI // 10.2: Supervisor Memory-Management Fence Instruction ASFENCEVMA // 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 AFABSD AFABSS AFNED AFNEGD AFNEGS AFNES AMOV AMOVB AMOVBU AMOVD AMOVF AMOVH AMOVHU AMOVW AMOVWU ANEG ANEGW ANOT ARDCYCLE ARDINSTRET ARDTIME ASEQZ ASNEZ // End marker ALAST ) // opSuffix encoding to uint8 which fit into p.Scond var rmSuffixSet = map[string]uint8{ "RNE": RM_RNE, "RTZ": RM_RTZ, "RDN": RM_RDN, "RUP": RM_RUP, "RMM": RM_RMM, } const rmSuffixBit uint8 = 1 << 7 func rmSuffixEncode(s string) (uint8, error) { if s == "" { return 0, errors.New("empty suffix") } enc, ok := rmSuffixSet[s] if !ok { return 0, fmt.Errorf("invalid encoding for unknown suffix:%q", s) } return enc | rmSuffixBit, nil } func rmSuffixString(u uint8) (string, error) { if u&rmSuffixBit == 0 { return "", fmt.Errorf("invalid suffix, require round mode bit:%x", u) } u &^= rmSuffixBit for k, v := range rmSuffixSet { if v == u { return k, nil } } return "", fmt.Errorf("unknown suffix:%x", u) } const ( RM_RNE uint8 = iota // Round to Nearest, ties to Even RM_RTZ // Round towards Zero RM_RDN // Round Down RM_RUP // Round Up RM_RMM // Round to Nearest, ties to Max Magnitude ) // 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, ARDTIME: true, ARDINSTRET: true, } // Instruction encoding masks. const ( // BTypeImmMask is a mask including only the immediate portion of // B-type instructions. BTypeImmMask = 0xfe000f80 // CBTypeImmMask is a mask including only the immediate portion of // CB-type instructions. CBTypeImmMask = 0x1c7c // CJTypeImmMask is a mask including only the immediate portion of // CJ-type instructions. CJTypeImmMask = 0x1f7c // ITypeImmMask is a mask including only the immediate portion of // I-type instructions. ITypeImmMask = 0xfff00000 // JTypeImmMask is a mask including only the immediate portion of // J-type instructions. JTypeImmMask = 0xfffff000 // 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 )