func GNUSyntax(inst Inst) string
GNUSyntax returns the GNU assembler syntax for the instruction, as defined by GNU binutils. This form typically matches the syntax defined in the RISC-V Instruction Set Manual. See https://github.com/riscv/riscv-isa-manual/releases/download/Ratified-IMAFDQC/riscv-spec-20191213.pdf
func GoSyntax(inst Inst, pc uint64, symname func(uint64) (string, uint64), text io.ReaderAt) string
GoSyntax returns the Go assembler syntax for the instruction. The syntax was originally defined by Plan 9. The pc is the program counter of the instruction, used for expanding PC-relative addresses into absolute ones. The symname function queries the symbol table for the program being disassembled. Given a target address it returns the name and base address of the symbol containing the target, if any; otherwise it returns "", 0. The reader text should read from the text segment using text addresses as offsets; it is used to display pc-relative loads as constant loads.
An AmoReg is an atomic address register used in AMO instructions
type AmoReg struct {
// contains filtered or unexported fields
}
func (amoReg AmoReg) String() string
An Arg is a single instruction argument.
type Arg interface {
String() string
}
An Args holds the instruction arguments. If an instruction has fewer than 6 arguments, the final elements in the array are nil.
type Args [6]Arg
A CSR is a single control and status register. Use stringer to generate CSR match table.
type CSR uint16
const (
// Control status register
USTATUS CSR = 0x0000
FFLAGS CSR = 0x0001
FRM CSR = 0x0002
FCSR CSR = 0x0003
UIE CSR = 0x0004
UTVEC CSR = 0x0005
UTVT CSR = 0x0007
VSTART CSR = 0x0008
VXSAT CSR = 0x0009
VXRM CSR = 0x000a
VCSR CSR = 0x000f
USCRATCH CSR = 0x0040
UEPC CSR = 0x0041
UCAUSE CSR = 0x0042
UTVAL CSR = 0x0043
UIP CSR = 0x0044
UNXTI CSR = 0x0045
UINTSTATUS CSR = 0x0046
USCRATCHCSW CSR = 0x0048
USCRATCHCSWL CSR = 0x0049
SSTATUS CSR = 0x0100
SEDELEG CSR = 0x0102
SIDELEG CSR = 0x0103
SIE CSR = 0x0104
STVEC CSR = 0x0105
SCOUNTEREN CSR = 0x0106
STVT CSR = 0x0107
SSCRATCH CSR = 0x0140
SEPC CSR = 0x0141
SCAUSE CSR = 0x0142
STVAL CSR = 0x0143
SIP CSR = 0x0144
SNXTI CSR = 0x0145
SINTSTATUS CSR = 0x0146
SSCRATCHCSW CSR = 0x0148
SSCRATCHCSWL CSR = 0x0149
SATP CSR = 0x0180
VSSTATUS CSR = 0x0200
VSIE CSR = 0x0204
VSTVEC CSR = 0x0205
VSSCRATCH CSR = 0x0240
VSEPC CSR = 0x0241
VSCAUSE CSR = 0x0242
VSTVAL CSR = 0x0243
VSIP CSR = 0x0244
VSATP CSR = 0x0280
MSTATUS CSR = 0x0300
MISA CSR = 0x0301
MEDELEG CSR = 0x0302
MIDELEG CSR = 0x0303
MIE CSR = 0x0304
MTVEC CSR = 0x0305
MCOUNTEREN CSR = 0x0306
MTVT CSR = 0x0307
MSTATUSH CSR = 0x0310
MCOUNTINHIBIT CSR = 0x0320
MHPMEVENT3 CSR = 0x0323
MHPMEVENT4 CSR = 0x0324
MHPMEVENT5 CSR = 0x0325
MHPMEVENT6 CSR = 0x0326
MHPMEVENT7 CSR = 0x0327
MHPMEVENT8 CSR = 0x0328
MHPMEVENT9 CSR = 0x0329
MHPMEVENT10 CSR = 0x032a
MHPMEVENT11 CSR = 0x032b
MHPMEVENT12 CSR = 0x032c
MHPMEVENT13 CSR = 0x032d
MHPMEVENT14 CSR = 0x032e
MHPMEVENT15 CSR = 0x032f
MHPMEVENT16 CSR = 0x0330
MHPMEVENT17 CSR = 0x0331
MHPMEVENT18 CSR = 0x0332
MHPMEVENT19 CSR = 0x0333
MHPMEVENT20 CSR = 0x0334
MHPMEVENT21 CSR = 0x0335
MHPMEVENT22 CSR = 0x0336
MHPMEVENT23 CSR = 0x0337
MHPMEVENT24 CSR = 0x0338
MHPMEVENT25 CSR = 0x0339
MHPMEVENT26 CSR = 0x033a
MHPMEVENT27 CSR = 0x033b
MHPMEVENT28 CSR = 0x033c
MHPMEVENT29 CSR = 0x033d
MHPMEVENT30 CSR = 0x033e
MHPMEVENT31 CSR = 0x033f
MSCRATCH CSR = 0x0340
MEPC CSR = 0x0341
MCAUSE CSR = 0x0342
MTVAL CSR = 0x0343
MIP CSR = 0x0344
MNXTI CSR = 0x0345
MINTSTATUS CSR = 0x0346
MSCRATCHCSW CSR = 0x0348
MSCRATCHCSWL CSR = 0x0349
MTINST CSR = 0x034a
MTVAL2 CSR = 0x034b
PMPCFG0 CSR = 0x03a0
PMPCFG1 CSR = 0x03a1
PMPCFG2 CSR = 0x03a2
PMPCFG3 CSR = 0x03a3
PMPADDR0 CSR = 0x03b0
PMPADDR1 CSR = 0x03b1
PMPADDR2 CSR = 0x03b2
PMPADDR3 CSR = 0x03b3
PMPADDR4 CSR = 0x03b4
PMPADDR5 CSR = 0x03b5
PMPADDR6 CSR = 0x03b6
PMPADDR7 CSR = 0x03b7
PMPADDR8 CSR = 0x03b8
PMPADDR9 CSR = 0x03b9
PMPADDR10 CSR = 0x03ba
PMPADDR11 CSR = 0x03bb
PMPADDR12 CSR = 0x03bc
PMPADDR13 CSR = 0x03bd
PMPADDR14 CSR = 0x03be
PMPADDR15 CSR = 0x03bf
HSTATUS CSR = 0x0600
HEDELEG CSR = 0x0602
HIDELEG CSR = 0x0603
HIE CSR = 0x0604
HTIMEDELTA CSR = 0x0605
HCOUNTEREN CSR = 0x0606
HGEIE CSR = 0x0607
HTIMEDELTAH CSR = 0x0615
HTVAL CSR = 0x0643
HIP CSR = 0x0644
HVIP CSR = 0x0645
HTINST CSR = 0x064a
HGATP CSR = 0x0680
TSELECT CSR = 0x07a0
TDATA1 CSR = 0x07a1
TDATA2 CSR = 0x07a2
TDATA3 CSR = 0x07a3
TINFO CSR = 0x07a4
TCONTROL CSR = 0x07a5
MCONTEXT CSR = 0x07a8
MNOISE CSR = 0x07a9
SCONTEXT CSR = 0x07aa
DCSR CSR = 0x07b0
DPC CSR = 0x07b1
DSCRATCH0 CSR = 0x07b2
DSCRATCH1 CSR = 0x07b3
MCYCLE CSR = 0x0b00
MINSTRET CSR = 0x0b02
MHPMCOUNTER3 CSR = 0x0b03
MHPMCOUNTER4 CSR = 0x0b04
MHPMCOUNTER5 CSR = 0x0b05
MHPMCOUNTER6 CSR = 0x0b06
MHPMCOUNTER7 CSR = 0x0b07
MHPMCOUNTER8 CSR = 0x0b08
MHPMCOUNTER9 CSR = 0x0b09
MHPMCOUNTER10 CSR = 0x0b0a
MHPMCOUNTER11 CSR = 0x0b0b
MHPMCOUNTER12 CSR = 0x0b0c
MHPMCOUNTER13 CSR = 0x0b0d
MHPMCOUNTER14 CSR = 0x0b0e
MHPMCOUNTER15 CSR = 0x0b0f
MHPMCOUNTER16 CSR = 0x0b10
MHPMCOUNTER17 CSR = 0x0b11
MHPMCOUNTER18 CSR = 0x0b12
MHPMCOUNTER19 CSR = 0x0b13
MHPMCOUNTER20 CSR = 0x0b14
MHPMCOUNTER21 CSR = 0x0b15
MHPMCOUNTER22 CSR = 0x0b16
MHPMCOUNTER23 CSR = 0x0b17
MHPMCOUNTER24 CSR = 0x0b18
MHPMCOUNTER25 CSR = 0x0b19
MHPMCOUNTER26 CSR = 0x0b1a
MHPMCOUNTER27 CSR = 0x0b1b
MHPMCOUNTER28 CSR = 0x0b1c
MHPMCOUNTER29 CSR = 0x0b1d
MHPMCOUNTER30 CSR = 0x0b1e
MHPMCOUNTER31 CSR = 0x0b1f
MCYCLEH CSR = 0x0b80
MINSTRETH CSR = 0x0b82
MHPMCOUNTER3H CSR = 0x0b83
MHPMCOUNTER4H CSR = 0x0b84
MHPMCOUNTER5H CSR = 0x0b85
MHPMCOUNTER6H CSR = 0x0b86
MHPMCOUNTER7H CSR = 0x0b87
MHPMCOUNTER8H CSR = 0x0b88
MHPMCOUNTER9H CSR = 0x0b89
MHPMCOUNTER10H CSR = 0x0b8a
MHPMCOUNTER11H CSR = 0x0b8b
MHPMCOUNTER12H CSR = 0x0b8c
MHPMCOUNTER13H CSR = 0x0b8d
MHPMCOUNTER14H CSR = 0x0b8e
MHPMCOUNTER15H CSR = 0x0b8f
MHPMCOUNTER16H CSR = 0x0b90
MHPMCOUNTER17H CSR = 0x0b91
MHPMCOUNTER18H CSR = 0x0b92
MHPMCOUNTER19H CSR = 0x0b93
MHPMCOUNTER20H CSR = 0x0b94
MHPMCOUNTER21H CSR = 0x0b95
MHPMCOUNTER22H CSR = 0x0b96
MHPMCOUNTER23H CSR = 0x0b97
MHPMCOUNTER24H CSR = 0x0b98
MHPMCOUNTER25H CSR = 0x0b99
MHPMCOUNTER26H CSR = 0x0b9a
MHPMCOUNTER27H CSR = 0x0b9b
MHPMCOUNTER28H CSR = 0x0b9c
MHPMCOUNTER29H CSR = 0x0b9d
MHPMCOUNTER30H CSR = 0x0b9e
MHPMCOUNTER31H CSR = 0x0b9f
CYCLE CSR = 0x0c00
TIME CSR = 0x0c01
INSTRET CSR = 0x0c02
HPMCOUNTER3 CSR = 0x0c03
HPMCOUNTER4 CSR = 0x0c04
HPMCOUNTER5 CSR = 0x0c05
HPMCOUNTER6 CSR = 0x0c06
HPMCOUNTER7 CSR = 0x0c07
HPMCOUNTER8 CSR = 0x0c08
HPMCOUNTER9 CSR = 0x0c09
HPMCOUNTER10 CSR = 0x0c0a
HPMCOUNTER11 CSR = 0x0c0b
HPMCOUNTER12 CSR = 0x0c0c
HPMCOUNTER13 CSR = 0x0c0d
HPMCOUNTER14 CSR = 0x0c0e
HPMCOUNTER15 CSR = 0x0c0f
HPMCOUNTER16 CSR = 0x0c10
HPMCOUNTER17 CSR = 0x0c11
HPMCOUNTER18 CSR = 0x0c12
HPMCOUNTER19 CSR = 0x0c13
HPMCOUNTER20 CSR = 0x0c14
HPMCOUNTER21 CSR = 0x0c15
HPMCOUNTER22 CSR = 0x0c16
HPMCOUNTER23 CSR = 0x0c17
HPMCOUNTER24 CSR = 0x0c18
HPMCOUNTER25 CSR = 0x0c19
HPMCOUNTER26 CSR = 0x0c1a
HPMCOUNTER27 CSR = 0x0c1b
HPMCOUNTER28 CSR = 0x0c1c
HPMCOUNTER29 CSR = 0x0c1d
HPMCOUNTER30 CSR = 0x0c1e
HPMCOUNTER31 CSR = 0x0c1f
VL CSR = 0x0c20
VTYPE CSR = 0x0c21
VLENB CSR = 0x0c22
CYCLEH CSR = 0x0c80
TIMEH CSR = 0x0c81
INSTRETH CSR = 0x0c82
HPMCOUNTER3H CSR = 0x0c83
HPMCOUNTER4H CSR = 0x0c84
HPMCOUNTER5H CSR = 0x0c85
HPMCOUNTER6H CSR = 0x0c86
HPMCOUNTER7H CSR = 0x0c87
HPMCOUNTER8H CSR = 0x0c88
HPMCOUNTER9H CSR = 0x0c89
HPMCOUNTER10H CSR = 0x0c8a
HPMCOUNTER11H CSR = 0x0c8b
HPMCOUNTER12H CSR = 0x0c8c
HPMCOUNTER13H CSR = 0x0c8d
HPMCOUNTER14H CSR = 0x0c8e
HPMCOUNTER15H CSR = 0x0c8f
HPMCOUNTER16H CSR = 0x0c90
HPMCOUNTER17H CSR = 0x0c91
HPMCOUNTER18H CSR = 0x0c92
HPMCOUNTER19H CSR = 0x0c93
HPMCOUNTER20H CSR = 0x0c94
HPMCOUNTER21H CSR = 0x0c95
HPMCOUNTER22H CSR = 0x0c96
HPMCOUNTER23H CSR = 0x0c97
HPMCOUNTER24H CSR = 0x0c98
HPMCOUNTER25H CSR = 0x0c99
HPMCOUNTER26H CSR = 0x0c9a
HPMCOUNTER27H CSR = 0x0c9b
HPMCOUNTER28H CSR = 0x0c9c
HPMCOUNTER29H CSR = 0x0c9d
HPMCOUNTER30H CSR = 0x0c9e
HPMCOUNTER31H CSR = 0x0c9f
HGEIP CSR = 0x0e12
MVENDORID CSR = 0x0f11
MARCHID CSR = 0x0f12
MIMPID CSR = 0x0f13
MHARTID CSR = 0x0f14
MENTROPY CSR = 0x0f15
)
func (i CSR) String() string
An Inst is a single instruction.
type Inst struct {
Op Op // Opcode mnemonic.
Enc uint32 // Raw encoding bits.
Args Args // Instruction arguments, in RISC-V mamual order.
Len int // Length of encoded instruction in bytes
}
func Decode(src []byte) (Inst, error)
Decode decodes the 4 bytes in src as a single instruction.
func (i Inst) String() string
A MemOrder is a memory order hint in fence instruction
type MemOrder uint8
func (memOrder MemOrder) String() string
An Op is a RISC-V opcode.
type Op uint16
const (
ADD Op
ADDI
ADDIW
ADDW
ADD_UW
AMOADD_D
AMOADD_D_AQ
AMOADD_D_AQRL
AMOADD_D_RL
AMOADD_W
AMOADD_W_AQ
AMOADD_W_AQRL
AMOADD_W_RL
AMOAND_D
AMOAND_D_AQ
AMOAND_D_AQRL
AMOAND_D_RL
AMOAND_W
AMOAND_W_AQ
AMOAND_W_AQRL
AMOAND_W_RL
AMOMAXU_D
AMOMAXU_D_AQ
AMOMAXU_D_AQRL
AMOMAXU_D_RL
AMOMAXU_W
AMOMAXU_W_AQ
AMOMAXU_W_AQRL
AMOMAXU_W_RL
AMOMAX_D
AMOMAX_D_AQ
AMOMAX_D_AQRL
AMOMAX_D_RL
AMOMAX_W
AMOMAX_W_AQ
AMOMAX_W_AQRL
AMOMAX_W_RL
AMOMINU_D
AMOMINU_D_AQ
AMOMINU_D_AQRL
AMOMINU_D_RL
AMOMINU_W
AMOMINU_W_AQ
AMOMINU_W_AQRL
AMOMINU_W_RL
AMOMIN_D
AMOMIN_D_AQ
AMOMIN_D_AQRL
AMOMIN_D_RL
AMOMIN_W
AMOMIN_W_AQ
AMOMIN_W_AQRL
AMOMIN_W_RL
AMOOR_D
AMOOR_D_AQ
AMOOR_D_AQRL
AMOOR_D_RL
AMOOR_W
AMOOR_W_AQ
AMOOR_W_AQRL
AMOOR_W_RL
AMOSWAP_D
AMOSWAP_D_AQ
AMOSWAP_D_AQRL
AMOSWAP_D_RL
AMOSWAP_W
AMOSWAP_W_AQ
AMOSWAP_W_AQRL
AMOSWAP_W_RL
AMOXOR_D
AMOXOR_D_AQ
AMOXOR_D_AQRL
AMOXOR_D_RL
AMOXOR_W
AMOXOR_W_AQ
AMOXOR_W_AQRL
AMOXOR_W_RL
AND
ANDI
ANDN
AUIPC
BCLR
BCLRI
BEQ
BEXT
BEXTI
BGE
BGEU
BINV
BINVI
BLT
BLTU
BNE
BSET
BSETI
CLZ
CLZW
CPOP
CPOPW
CSRRC
CSRRCI
CSRRS
CSRRSI
CSRRW
CSRRWI
CTZ
CTZW
C_ADD
C_ADDI
C_ADDI16SP
C_ADDI4SPN
C_ADDIW
C_ADDW
C_AND
C_ANDI
C_BEQZ
C_BNEZ
C_EBREAK
C_FLD
C_FLDSP
C_FSD
C_FSDSP
C_J
C_JALR
C_JR
C_LD
C_LDSP
C_LI
C_LUI
C_LW
C_LWSP
C_MV
C_NOP
C_OR
C_SD
C_SDSP
C_SLLI
C_SRAI
C_SRLI
C_SUB
C_SUBW
C_SW
C_SWSP
C_UNIMP
C_XOR
DIV
DIVU
DIVUW
DIVW
EBREAK
ECALL
FADD_D
FADD_H
FADD_Q
FADD_S
FCLASS_D
FCLASS_H
FCLASS_Q
FCLASS_S
FCVT_D_L
FCVT_D_LU
FCVT_D_Q
FCVT_D_S
FCVT_D_W
FCVT_D_WU
FCVT_H_L
FCVT_H_LU
FCVT_H_S
FCVT_H_W
FCVT_H_WU
FCVT_LU_D
FCVT_LU_H
FCVT_LU_Q
FCVT_LU_S
FCVT_L_D
FCVT_L_H
FCVT_L_Q
FCVT_L_S
FCVT_Q_D
FCVT_Q_L
FCVT_Q_LU
FCVT_Q_S
FCVT_Q_W
FCVT_Q_WU
FCVT_S_D
FCVT_S_H
FCVT_S_L
FCVT_S_LU
FCVT_S_Q
FCVT_S_W
FCVT_S_WU
FCVT_WU_D
FCVT_WU_H
FCVT_WU_Q
FCVT_WU_S
FCVT_W_D
FCVT_W_H
FCVT_W_Q
FCVT_W_S
FDIV_D
FDIV_H
FDIV_Q
FDIV_S
FENCE
FENCE_I
FEQ_D
FEQ_H
FEQ_Q
FEQ_S
FLD
FLE_D
FLE_H
FLE_Q
FLE_S
FLH
FLQ
FLT_D
FLT_H
FLT_Q
FLT_S
FLW
FMADD_D
FMADD_H
FMADD_Q
FMADD_S
FMAX_D
FMAX_H
FMAX_Q
FMAX_S
FMIN_D
FMIN_H
FMIN_Q
FMIN_S
FMSUB_D
FMSUB_H
FMSUB_Q
FMSUB_S
FMUL_D
FMUL_H
FMUL_Q
FMUL_S
FMV_D_X
FMV_H_X
FMV_W_X
FMV_X_D
FMV_X_H
FMV_X_W
FNMADD_D
FNMADD_H
FNMADD_Q
FNMADD_S
FNMSUB_D
FNMSUB_H
FNMSUB_Q
FNMSUB_S
FSD
FSGNJN_D
FSGNJN_H
FSGNJN_Q
FSGNJN_S
FSGNJX_D
FSGNJX_H
FSGNJX_Q
FSGNJX_S
FSGNJ_D
FSGNJ_H
FSGNJ_Q
FSGNJ_S
FSH
FSQ
FSQRT_D
FSQRT_H
FSQRT_Q
FSQRT_S
FSUB_D
FSUB_H
FSUB_Q
FSUB_S
FSW
JAL
JALR
LB
LBU
LD
LH
LHU
LR_D
LR_D_AQ
LR_D_AQRL
LR_D_RL
LR_W
LR_W_AQ
LR_W_AQRL
LR_W_RL
LUI
LW
LWU
MAX
MAXU
MIN
MINU
MUL
MULH
MULHSU
MULHU
MULW
OR
ORC_B
ORI
ORN
REM
REMU
REMUW
REMW
REV8
ROL
ROLW
ROR
RORI
RORIW
RORW
SB
SC_D
SC_D_AQ
SC_D_AQRL
SC_D_RL
SC_W
SC_W_AQ
SC_W_AQRL
SC_W_RL
SD
SEXT_B
SEXT_H
SH
SH1ADD
SH1ADD_UW
SH2ADD
SH2ADD_UW
SH3ADD
SH3ADD_UW
SLL
SLLI
SLLIW
SLLI_UW
SLLW
SLT
SLTI
SLTIU
SLTU
SRA
SRAI
SRAIW
SRAW
SRL
SRLI
SRLIW
SRLW
SUB
SUBW
SW
XNOR
XOR
XORI
ZEXT_H
)
func (op Op) String() string
NOTE: The actual Op values are defined in tables.go.
A Reg is a single register. The zero value denotes X0, not the absence of a register.
type Reg uint16
const (
// General-purpose register
X0 Reg = iota
X1
X2
X3
X4
X5
X6
X7
X8
X9
X10
X11
X12
X13
X14
X15
X16
X17
X18
X19
X20
X21
X22
X23
X24
X25
X26
X27
X28
X29
X30
X31
//Float point register
F0
F1
F2
F3
F4
F5
F6
F7
F8
F9
F10
F11
F12
F13
F14
F15
F16
F17
F18
F19
F20
F21
F22
F23
F24
F25
F26
F27
F28
F29
F30
F31
)
func (r Reg) String() string
A RegOffset is a register with offset value
type RegOffset struct {
OfsReg Reg
Ofs Simm
}
func (regofs RegOffset) String() string
A Simm is a signed immediate number
type Simm struct {
Imm int32 // 32-bit signed integer
Decimal bool // Print format of the immediate, either decimal or hexadecimal
Width uint8 // Actual width of the Simm
}
func (si Simm) String() string
An Uimm is an unsigned immediate number
type Uimm struct {
Imm uint32 // 32-bit unsigned integer
Decimal bool // Print format of the immediate, either decimal or hexadecimal
}
func (ui Uimm) String() string