riscv64: implement RV64GC_zba_zbb_zbs GNU/Plan9 format disassembler
Support decoding RV64GC_zba_zbb_zbs instructions as GNU & Plan9 format,
relies on riscv64spec/spec.go to generate instruction tables
Change-Id: I3b2793a7dd9faa3ac18d85361a8627eba0923068
Reviewed-on: https://go-review.googlesource.com/c/arch/+/602915
Reviewed-by: Meng Zhuo <mengzhuo1203@gmail.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
Reviewed-by: Joel Sing <joel@sing.id.au>
diff --git a/riscv64/riscv64asm/arg.go b/riscv64/riscv64asm/arg.go
new file mode 100644
index 0000000..7898c27
--- /dev/null
+++ b/riscv64/riscv64asm/arg.go
@@ -0,0 +1,116 @@
+// Copyright 2024 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package riscv64asm
+
+// Naming for Go decoder arguments:
+//
+// - arg_rd: a general purpose register rd encoded in rd[11:7] field
+//
+// - arg_rs1: a general purpose register rs1 encoded in rs1[19:15] field
+//
+// - arg_rs2: a general purpose register rs2 encoded in rs2[24:20] field
+//
+// - arg_rs3: a general purpose register rs3 encoded in rs3[31:27] field
+//
+// - arg_fd: a floating point register rd encoded in rd[11:7] field
+//
+// - arg_fs1: a floating point register rs1 encoded in rs1[19:15] field
+//
+// - arg_fs2: a floating point register rs2 encoded in rs2[24:20] field
+//
+// - arg_fs3: a floating point register rs3 encoded in rs3[31:27] field
+//
+// - arg_csr: a control status register encoded in csr[31:20] field
+//
+// - arg_rs1_mem: source register with offset in load commands
+//
+// - arg_rs1_store: source register with offset in store commands
+//
+// - arg_rs1_amo: source register with offset in atomic commands
+//
+// - arg_pred: predecessor memory ordering information encoded in pred[27:24] field
+// For details, please refer to chapter 2.7 of ISA manual volume 1
+//
+// - arg_succ: successor memory ordering information encoded in succ[23:20] field
+// For details, please refer to chapter 2.7 of ISA manual volume 1
+//
+// - arg_zimm: a unsigned immediate encoded in zimm[19:15] field
+//
+// - arg_imm12: an I-type immediate encoded in imm12[31:20] field
+//
+// - arg_simm12: a S-type immediate encoded in simm12[31:25|11:7] field
+//
+// - arg_bimm12: a B-type immediate encoded in bimm12[31:25|11:7] field
+//
+// - arg_imm20: an U-type immediate encoded in imm20[31:12] field
+//
+// - arg_jimm20: a J-type immediate encoded in jimm20[31:12] field
+//
+// - arg_shamt5: a shift amount encoded in shamt5[24:20] field
+//
+// - arg_shamt6: a shift amount encoded in shamt6[25:20] field
+//
+
+type argType uint16
+
+const (
+ _ argType = iota
+ arg_rd
+ arg_rs1
+ arg_rs2
+ arg_rs3
+ arg_fd
+ arg_fs1
+ arg_fs2
+ arg_fs3
+ arg_csr
+
+ arg_rs1_amo
+ arg_rs1_mem
+ arg_rs1_store
+
+ arg_pred
+ arg_succ
+
+ arg_zimm
+ arg_imm12
+ arg_simm12
+ arg_bimm12
+ arg_imm20
+ arg_jimm20
+ arg_shamt5
+ arg_shamt6
+
+ // RISC-V Compressed Extension Args
+ arg_rd_p
+ arg_fd_p
+ arg_rs1_p
+ arg_rd_rs1_p
+ arg_fs2_p
+ arg_rs2_p
+ arg_rd_n0
+ arg_rs1_n0
+ arg_rd_rs1_n0
+ arg_c_rs1_n0
+ arg_c_rs2_n0
+ arg_c_fs2
+ arg_c_rs2
+ arg_rd_n2
+
+ arg_c_imm6
+ arg_c_nzimm6
+ arg_c_nzuimm6
+ arg_c_uimm7
+ arg_c_uimm8
+ arg_c_uimm8sp_s
+ arg_c_uimm8sp
+ arg_c_uimm9sp_s
+ arg_c_uimm9sp
+ arg_c_bimm9
+ arg_c_nzimm10
+ arg_c_nzuimm10
+ arg_c_imm12
+ arg_c_nzimm18
+)
diff --git a/riscv64/riscv64asm/csr_string.go b/riscv64/riscv64asm/csr_string.go
new file mode 100644
index 0000000..addf91a
--- /dev/null
+++ b/riscv64/riscv64asm/csr_string.go
@@ -0,0 +1,577 @@
+// Code generated by "stringer -type=CSR"; DO NOT EDIT.
+
+package riscv64asm
+
+import "strconv"
+
+func _() {
+ // An "invalid array index" compiler error signifies that the constant values have changed.
+ // Re-run the stringer command to generate them again.
+ var x [1]struct{}
+ _ = x[USTATUS-0]
+ _ = x[FFLAGS-1]
+ _ = x[FRM-2]
+ _ = x[FCSR-3]
+ _ = x[UIE-4]
+ _ = x[UTVEC-5]
+ _ = x[UTVT-7]
+ _ = x[VSTART-8]
+ _ = x[VXSAT-9]
+ _ = x[VXRM-10]
+ _ = x[VCSR-15]
+ _ = x[USCRATCH-64]
+ _ = x[UEPC-65]
+ _ = x[UCAUSE-66]
+ _ = x[UTVAL-67]
+ _ = x[UIP-68]
+ _ = x[UNXTI-69]
+ _ = x[UINTSTATUS-70]
+ _ = x[USCRATCHCSW-72]
+ _ = x[USCRATCHCSWL-73]
+ _ = x[SSTATUS-256]
+ _ = x[SEDELEG-258]
+ _ = x[SIDELEG-259]
+ _ = x[SIE-260]
+ _ = x[STVEC-261]
+ _ = x[SCOUNTEREN-262]
+ _ = x[STVT-263]
+ _ = x[SSCRATCH-320]
+ _ = x[SEPC-321]
+ _ = x[SCAUSE-322]
+ _ = x[STVAL-323]
+ _ = x[SIP-324]
+ _ = x[SNXTI-325]
+ _ = x[SINTSTATUS-326]
+ _ = x[SSCRATCHCSW-328]
+ _ = x[SSCRATCHCSWL-329]
+ _ = x[SATP-384]
+ _ = x[VSSTATUS-512]
+ _ = x[VSIE-516]
+ _ = x[VSTVEC-517]
+ _ = x[VSSCRATCH-576]
+ _ = x[VSEPC-577]
+ _ = x[VSCAUSE-578]
+ _ = x[VSTVAL-579]
+ _ = x[VSIP-580]
+ _ = x[VSATP-640]
+ _ = x[MSTATUS-768]
+ _ = x[MISA-769]
+ _ = x[MEDELEG-770]
+ _ = x[MIDELEG-771]
+ _ = x[MIE-772]
+ _ = x[MTVEC-773]
+ _ = x[MCOUNTEREN-774]
+ _ = x[MTVT-775]
+ _ = x[MSTATUSH-784]
+ _ = x[MCOUNTINHIBIT-800]
+ _ = x[MHPMEVENT3-803]
+ _ = x[MHPMEVENT4-804]
+ _ = x[MHPMEVENT5-805]
+ _ = x[MHPMEVENT6-806]
+ _ = x[MHPMEVENT7-807]
+ _ = x[MHPMEVENT8-808]
+ _ = x[MHPMEVENT9-809]
+ _ = x[MHPMEVENT10-810]
+ _ = x[MHPMEVENT11-811]
+ _ = x[MHPMEVENT12-812]
+ _ = x[MHPMEVENT13-813]
+ _ = x[MHPMEVENT14-814]
+ _ = x[MHPMEVENT15-815]
+ _ = x[MHPMEVENT16-816]
+ _ = x[MHPMEVENT17-817]
+ _ = x[MHPMEVENT18-818]
+ _ = x[MHPMEVENT19-819]
+ _ = x[MHPMEVENT20-820]
+ _ = x[MHPMEVENT21-821]
+ _ = x[MHPMEVENT22-822]
+ _ = x[MHPMEVENT23-823]
+ _ = x[MHPMEVENT24-824]
+ _ = x[MHPMEVENT25-825]
+ _ = x[MHPMEVENT26-826]
+ _ = x[MHPMEVENT27-827]
+ _ = x[MHPMEVENT28-828]
+ _ = x[MHPMEVENT29-829]
+ _ = x[MHPMEVENT30-830]
+ _ = x[MHPMEVENT31-831]
+ _ = x[MSCRATCH-832]
+ _ = x[MEPC-833]
+ _ = x[MCAUSE-834]
+ _ = x[MTVAL-835]
+ _ = x[MIP-836]
+ _ = x[MNXTI-837]
+ _ = x[MINTSTATUS-838]
+ _ = x[MSCRATCHCSW-840]
+ _ = x[MSCRATCHCSWL-841]
+ _ = x[MTINST-842]
+ _ = x[MTVAL2-843]
+ _ = x[PMPCFG0-928]
+ _ = x[PMPCFG1-929]
+ _ = x[PMPCFG2-930]
+ _ = x[PMPCFG3-931]
+ _ = x[PMPADDR0-944]
+ _ = x[PMPADDR1-945]
+ _ = x[PMPADDR2-946]
+ _ = x[PMPADDR3-947]
+ _ = x[PMPADDR4-948]
+ _ = x[PMPADDR5-949]
+ _ = x[PMPADDR6-950]
+ _ = x[PMPADDR7-951]
+ _ = x[PMPADDR8-952]
+ _ = x[PMPADDR9-953]
+ _ = x[PMPADDR10-954]
+ _ = x[PMPADDR11-955]
+ _ = x[PMPADDR12-956]
+ _ = x[PMPADDR13-957]
+ _ = x[PMPADDR14-958]
+ _ = x[PMPADDR15-959]
+ _ = x[HSTATUS-1536]
+ _ = x[HEDELEG-1538]
+ _ = x[HIDELEG-1539]
+ _ = x[HIE-1540]
+ _ = x[HTIMEDELTA-1541]
+ _ = x[HCOUNTEREN-1542]
+ _ = x[HGEIE-1543]
+ _ = x[HTIMEDELTAH-1557]
+ _ = x[HTVAL-1603]
+ _ = x[HIP-1604]
+ _ = x[HVIP-1605]
+ _ = x[HTINST-1610]
+ _ = x[HGATP-1664]
+ _ = x[TSELECT-1952]
+ _ = x[TDATA1-1953]
+ _ = x[TDATA2-1954]
+ _ = x[TDATA3-1955]
+ _ = x[TINFO-1956]
+ _ = x[TCONTROL-1957]
+ _ = x[MCONTEXT-1960]
+ _ = x[MNOISE-1961]
+ _ = x[SCONTEXT-1962]
+ _ = x[DCSR-1968]
+ _ = x[DPC-1969]
+ _ = x[DSCRATCH0-1970]
+ _ = x[DSCRATCH1-1971]
+ _ = x[MCYCLE-2816]
+ _ = x[MINSTRET-2818]
+ _ = x[MHPMCOUNTER3-2819]
+ _ = x[MHPMCOUNTER4-2820]
+ _ = x[MHPMCOUNTER5-2821]
+ _ = x[MHPMCOUNTER6-2822]
+ _ = x[MHPMCOUNTER7-2823]
+ _ = x[MHPMCOUNTER8-2824]
+ _ = x[MHPMCOUNTER9-2825]
+ _ = x[MHPMCOUNTER10-2826]
+ _ = x[MHPMCOUNTER11-2827]
+ _ = x[MHPMCOUNTER12-2828]
+ _ = x[MHPMCOUNTER13-2829]
+ _ = x[MHPMCOUNTER14-2830]
+ _ = x[MHPMCOUNTER15-2831]
+ _ = x[MHPMCOUNTER16-2832]
+ _ = x[MHPMCOUNTER17-2833]
+ _ = x[MHPMCOUNTER18-2834]
+ _ = x[MHPMCOUNTER19-2835]
+ _ = x[MHPMCOUNTER20-2836]
+ _ = x[MHPMCOUNTER21-2837]
+ _ = x[MHPMCOUNTER22-2838]
+ _ = x[MHPMCOUNTER23-2839]
+ _ = x[MHPMCOUNTER24-2840]
+ _ = x[MHPMCOUNTER25-2841]
+ _ = x[MHPMCOUNTER26-2842]
+ _ = x[MHPMCOUNTER27-2843]
+ _ = x[MHPMCOUNTER28-2844]
+ _ = x[MHPMCOUNTER29-2845]
+ _ = x[MHPMCOUNTER30-2846]
+ _ = x[MHPMCOUNTER31-2847]
+ _ = x[MCYCLEH-2944]
+ _ = x[MINSTRETH-2946]
+ _ = x[MHPMCOUNTER3H-2947]
+ _ = x[MHPMCOUNTER4H-2948]
+ _ = x[MHPMCOUNTER5H-2949]
+ _ = x[MHPMCOUNTER6H-2950]
+ _ = x[MHPMCOUNTER7H-2951]
+ _ = x[MHPMCOUNTER8H-2952]
+ _ = x[MHPMCOUNTER9H-2953]
+ _ = x[MHPMCOUNTER10H-2954]
+ _ = x[MHPMCOUNTER11H-2955]
+ _ = x[MHPMCOUNTER12H-2956]
+ _ = x[MHPMCOUNTER13H-2957]
+ _ = x[MHPMCOUNTER14H-2958]
+ _ = x[MHPMCOUNTER15H-2959]
+ _ = x[MHPMCOUNTER16H-2960]
+ _ = x[MHPMCOUNTER17H-2961]
+ _ = x[MHPMCOUNTER18H-2962]
+ _ = x[MHPMCOUNTER19H-2963]
+ _ = x[MHPMCOUNTER20H-2964]
+ _ = x[MHPMCOUNTER21H-2965]
+ _ = x[MHPMCOUNTER22H-2966]
+ _ = x[MHPMCOUNTER23H-2967]
+ _ = x[MHPMCOUNTER24H-2968]
+ _ = x[MHPMCOUNTER25H-2969]
+ _ = x[MHPMCOUNTER26H-2970]
+ _ = x[MHPMCOUNTER27H-2971]
+ _ = x[MHPMCOUNTER28H-2972]
+ _ = x[MHPMCOUNTER29H-2973]
+ _ = x[MHPMCOUNTER30H-2974]
+ _ = x[MHPMCOUNTER31H-2975]
+ _ = x[CYCLE-3072]
+ _ = x[TIME-3073]
+ _ = x[INSTRET-3074]
+ _ = x[HPMCOUNTER3-3075]
+ _ = x[HPMCOUNTER4-3076]
+ _ = x[HPMCOUNTER5-3077]
+ _ = x[HPMCOUNTER6-3078]
+ _ = x[HPMCOUNTER7-3079]
+ _ = x[HPMCOUNTER8-3080]
+ _ = x[HPMCOUNTER9-3081]
+ _ = x[HPMCOUNTER10-3082]
+ _ = x[HPMCOUNTER11-3083]
+ _ = x[HPMCOUNTER12-3084]
+ _ = x[HPMCOUNTER13-3085]
+ _ = x[HPMCOUNTER14-3086]
+ _ = x[HPMCOUNTER15-3087]
+ _ = x[HPMCOUNTER16-3088]
+ _ = x[HPMCOUNTER17-3089]
+ _ = x[HPMCOUNTER18-3090]
+ _ = x[HPMCOUNTER19-3091]
+ _ = x[HPMCOUNTER20-3092]
+ _ = x[HPMCOUNTER21-3093]
+ _ = x[HPMCOUNTER22-3094]
+ _ = x[HPMCOUNTER23-3095]
+ _ = x[HPMCOUNTER24-3096]
+ _ = x[HPMCOUNTER25-3097]
+ _ = x[HPMCOUNTER26-3098]
+ _ = x[HPMCOUNTER27-3099]
+ _ = x[HPMCOUNTER28-3100]
+ _ = x[HPMCOUNTER29-3101]
+ _ = x[HPMCOUNTER30-3102]
+ _ = x[HPMCOUNTER31-3103]
+ _ = x[VL-3104]
+ _ = x[VTYPE-3105]
+ _ = x[VLENB-3106]
+ _ = x[CYCLEH-3200]
+ _ = x[TIMEH-3201]
+ _ = x[INSTRETH-3202]
+ _ = x[HPMCOUNTER3H-3203]
+ _ = x[HPMCOUNTER4H-3204]
+ _ = x[HPMCOUNTER5H-3205]
+ _ = x[HPMCOUNTER6H-3206]
+ _ = x[HPMCOUNTER7H-3207]
+ _ = x[HPMCOUNTER8H-3208]
+ _ = x[HPMCOUNTER9H-3209]
+ _ = x[HPMCOUNTER10H-3210]
+ _ = x[HPMCOUNTER11H-3211]
+ _ = x[HPMCOUNTER12H-3212]
+ _ = x[HPMCOUNTER13H-3213]
+ _ = x[HPMCOUNTER14H-3214]
+ _ = x[HPMCOUNTER15H-3215]
+ _ = x[HPMCOUNTER16H-3216]
+ _ = x[HPMCOUNTER17H-3217]
+ _ = x[HPMCOUNTER18H-3218]
+ _ = x[HPMCOUNTER19H-3219]
+ _ = x[HPMCOUNTER20H-3220]
+ _ = x[HPMCOUNTER21H-3221]
+ _ = x[HPMCOUNTER22H-3222]
+ _ = x[HPMCOUNTER23H-3223]
+ _ = x[HPMCOUNTER24H-3224]
+ _ = x[HPMCOUNTER25H-3225]
+ _ = x[HPMCOUNTER26H-3226]
+ _ = x[HPMCOUNTER27H-3227]
+ _ = x[HPMCOUNTER28H-3228]
+ _ = x[HPMCOUNTER29H-3229]
+ _ = x[HPMCOUNTER30H-3230]
+ _ = x[HPMCOUNTER31H-3231]
+ _ = x[HGEIP-3602]
+ _ = x[MVENDORID-3857]
+ _ = x[MARCHID-3858]
+ _ = x[MIMPID-3859]
+ _ = x[MHARTID-3860]
+ _ = x[MENTROPY-3861]
+}
+
+const _CSR_name = "USTATUSFFLAGSFRMFCSRUIEUTVECUTVTVSTARTVXSATVXRMVCSRUSCRATCHUEPCUCAUSEUTVALUIPUNXTIUINTSTATUSUSCRATCHCSWUSCRATCHCSWLSSTATUSSEDELEGSIDELEGSIESTVECSCOUNTERENSTVTSSCRATCHSEPCSCAUSESTVALSIPSNXTISINTSTATUSSSCRATCHCSWSSCRATCHCSWLSATPVSSTATUSVSIEVSTVECVSSCRATCHVSEPCVSCAUSEVSTVALVSIPVSATPMSTATUSMISAMEDELEGMIDELEGMIEMTVECMCOUNTERENMTVTMSTATUSHMCOUNTINHIBITMHPMEVENT3MHPMEVENT4MHPMEVENT5MHPMEVENT6MHPMEVENT7MHPMEVENT8MHPMEVENT9MHPMEVENT10MHPMEVENT11MHPMEVENT12MHPMEVENT13MHPMEVENT14MHPMEVENT15MHPMEVENT16MHPMEVENT17MHPMEVENT18MHPMEVENT19MHPMEVENT20MHPMEVENT21MHPMEVENT22MHPMEVENT23MHPMEVENT24MHPMEVENT25MHPMEVENT26MHPMEVENT27MHPMEVENT28MHPMEVENT29MHPMEVENT30MHPMEVENT31MSCRATCHMEPCMCAUSEMTVALMIPMNXTIMINTSTATUSMSCRATCHCSWMSCRATCHCSWLMTINSTMTVAL2PMPCFG0PMPCFG1PMPCFG2PMPCFG3PMPADDR0PMPADDR1PMPADDR2PMPADDR3PMPADDR4PMPADDR5PMPADDR6PMPADDR7PMPADDR8PMPADDR9PMPADDR10PMPADDR11PMPADDR12PMPADDR13PMPADDR14PMPADDR15HSTATUSHEDELEGHIDELEGHIEHTIMEDELTAHCOUNTERENHGEIEHTIMEDELTAHHTVALHIPHVIPHTINSTHGATPTSELECTTDATA1TDATA2TDATA3TINFOTCONTROLMCONTEXTMNOISESCONTEXTDCSRDPCDSCRATCH0DSCRATCH1MCYCLEMINSTRETMHPMCOUNTER3MHPMCOUNTER4MHPMCOUNTER5MHPMCOUNTER6MHPMCOUNTER7MHPMCOUNTER8MHPMCOUNTER9MHPMCOUNTER10MHPMCOUNTER11MHPMCOUNTER12MHPMCOUNTER13MHPMCOUNTER14MHPMCOUNTER15MHPMCOUNTER16MHPMCOUNTER17MHPMCOUNTER18MHPMCOUNTER19MHPMCOUNTER20MHPMCOUNTER21MHPMCOUNTER22MHPMCOUNTER23MHPMCOUNTER24MHPMCOUNTER25MHPMCOUNTER26MHPMCOUNTER27MHPMCOUNTER28MHPMCOUNTER29MHPMCOUNTER30MHPMCOUNTER31MCYCLEHMINSTRETHMHPMCOUNTER3HMHPMCOUNTER4HMHPMCOUNTER5HMHPMCOUNTER6HMHPMCOUNTER7HMHPMCOUNTER8HMHPMCOUNTER9HMHPMCOUNTER10HMHPMCOUNTER11HMHPMCOUNTER12HMHPMCOUNTER13HMHPMCOUNTER14HMHPMCOUNTER15HMHPMCOUNTER16HMHPMCOUNTER17HMHPMCOUNTER18HMHPMCOUNTER19HMHPMCOUNTER20HMHPMCOUNTER21HMHPMCOUNTER22HMHPMCOUNTER23HMHPMCOUNTER24HMHPMCOUNTER25HMHPMCOUNTER26HMHPMCOUNTER27HMHPMCOUNTER28HMHPMCOUNTER29HMHPMCOUNTER30HMHPMCOUNTER31HCYCLETIMEINSTRETHPMCOUNTER3HPMCOUNTER4HPMCOUNTER5HPMCOUNTER6HPMCOUNTER7HPMCOUNTER8HPMCOUNTER9HPMCOUNTER10HPMCOUNTER11HPMCOUNTER12HPMCOUNTER13HPMCOUNTER14HPMCOUNTER15HPMCOUNTER16HPMCOUNTER17HPMCOUNTER18HPMCOUNTER19HPMCOUNTER20HPMCOUNTER21HPMCOUNTER22HPMCOUNTER23HPMCOUNTER24HPMCOUNTER25HPMCOUNTER26HPMCOUNTER27HPMCOUNTER28HPMCOUNTER29HPMCOUNTER30HPMCOUNTER31VLVTYPEVLENBCYCLEHTIMEHINSTRETHHPMCOUNTER3HHPMCOUNTER4HHPMCOUNTER5HHPMCOUNTER6HHPMCOUNTER7HHPMCOUNTER8HHPMCOUNTER9HHPMCOUNTER10HHPMCOUNTER11HHPMCOUNTER12HHPMCOUNTER13HHPMCOUNTER14HHPMCOUNTER15HHPMCOUNTER16HHPMCOUNTER17HHPMCOUNTER18HHPMCOUNTER19HHPMCOUNTER20HHPMCOUNTER21HHPMCOUNTER22HHPMCOUNTER23HHPMCOUNTER24HHPMCOUNTER25HHPMCOUNTER26HHPMCOUNTER27HHPMCOUNTER28HHPMCOUNTER29HHPMCOUNTER30HHPMCOUNTER31HHGEIPMVENDORIDMARCHIDMIMPIDMHARTIDMENTROPY"
+
+var _CSR_map = map[CSR]string{
+ 0: _CSR_name[0:7],
+ 1: _CSR_name[7:13],
+ 2: _CSR_name[13:16],
+ 3: _CSR_name[16:20],
+ 4: _CSR_name[20:23],
+ 5: _CSR_name[23:28],
+ 7: _CSR_name[28:32],
+ 8: _CSR_name[32:38],
+ 9: _CSR_name[38:43],
+ 10: _CSR_name[43:47],
+ 15: _CSR_name[47:51],
+ 64: _CSR_name[51:59],
+ 65: _CSR_name[59:63],
+ 66: _CSR_name[63:69],
+ 67: _CSR_name[69:74],
+ 68: _CSR_name[74:77],
+ 69: _CSR_name[77:82],
+ 70: _CSR_name[82:92],
+ 72: _CSR_name[92:103],
+ 73: _CSR_name[103:115],
+ 256: _CSR_name[115:122],
+ 258: _CSR_name[122:129],
+ 259: _CSR_name[129:136],
+ 260: _CSR_name[136:139],
+ 261: _CSR_name[139:144],
+ 262: _CSR_name[144:154],
+ 263: _CSR_name[154:158],
+ 320: _CSR_name[158:166],
+ 321: _CSR_name[166:170],
+ 322: _CSR_name[170:176],
+ 323: _CSR_name[176:181],
+ 324: _CSR_name[181:184],
+ 325: _CSR_name[184:189],
+ 326: _CSR_name[189:199],
+ 328: _CSR_name[199:210],
+ 329: _CSR_name[210:222],
+ 384: _CSR_name[222:226],
+ 512: _CSR_name[226:234],
+ 516: _CSR_name[234:238],
+ 517: _CSR_name[238:244],
+ 576: _CSR_name[244:253],
+ 577: _CSR_name[253:258],
+ 578: _CSR_name[258:265],
+ 579: _CSR_name[265:271],
+ 580: _CSR_name[271:275],
+ 640: _CSR_name[275:280],
+ 768: _CSR_name[280:287],
+ 769: _CSR_name[287:291],
+ 770: _CSR_name[291:298],
+ 771: _CSR_name[298:305],
+ 772: _CSR_name[305:308],
+ 773: _CSR_name[308:313],
+ 774: _CSR_name[313:323],
+ 775: _CSR_name[323:327],
+ 784: _CSR_name[327:335],
+ 800: _CSR_name[335:348],
+ 803: _CSR_name[348:358],
+ 804: _CSR_name[358:368],
+ 805: _CSR_name[368:378],
+ 806: _CSR_name[378:388],
+ 807: _CSR_name[388:398],
+ 808: _CSR_name[398:408],
+ 809: _CSR_name[408:418],
+ 810: _CSR_name[418:429],
+ 811: _CSR_name[429:440],
+ 812: _CSR_name[440:451],
+ 813: _CSR_name[451:462],
+ 814: _CSR_name[462:473],
+ 815: _CSR_name[473:484],
+ 816: _CSR_name[484:495],
+ 817: _CSR_name[495:506],
+ 818: _CSR_name[506:517],
+ 819: _CSR_name[517:528],
+ 820: _CSR_name[528:539],
+ 821: _CSR_name[539:550],
+ 822: _CSR_name[550:561],
+ 823: _CSR_name[561:572],
+ 824: _CSR_name[572:583],
+ 825: _CSR_name[583:594],
+ 826: _CSR_name[594:605],
+ 827: _CSR_name[605:616],
+ 828: _CSR_name[616:627],
+ 829: _CSR_name[627:638],
+ 830: _CSR_name[638:649],
+ 831: _CSR_name[649:660],
+ 832: _CSR_name[660:668],
+ 833: _CSR_name[668:672],
+ 834: _CSR_name[672:678],
+ 835: _CSR_name[678:683],
+ 836: _CSR_name[683:686],
+ 837: _CSR_name[686:691],
+ 838: _CSR_name[691:701],
+ 840: _CSR_name[701:712],
+ 841: _CSR_name[712:724],
+ 842: _CSR_name[724:730],
+ 843: _CSR_name[730:736],
+ 928: _CSR_name[736:743],
+ 929: _CSR_name[743:750],
+ 930: _CSR_name[750:757],
+ 931: _CSR_name[757:764],
+ 944: _CSR_name[764:772],
+ 945: _CSR_name[772:780],
+ 946: _CSR_name[780:788],
+ 947: _CSR_name[788:796],
+ 948: _CSR_name[796:804],
+ 949: _CSR_name[804:812],
+ 950: _CSR_name[812:820],
+ 951: _CSR_name[820:828],
+ 952: _CSR_name[828:836],
+ 953: _CSR_name[836:844],
+ 954: _CSR_name[844:853],
+ 955: _CSR_name[853:862],
+ 956: _CSR_name[862:871],
+ 957: _CSR_name[871:880],
+ 958: _CSR_name[880:889],
+ 959: _CSR_name[889:898],
+ 1536: _CSR_name[898:905],
+ 1538: _CSR_name[905:912],
+ 1539: _CSR_name[912:919],
+ 1540: _CSR_name[919:922],
+ 1541: _CSR_name[922:932],
+ 1542: _CSR_name[932:942],
+ 1543: _CSR_name[942:947],
+ 1557: _CSR_name[947:958],
+ 1603: _CSR_name[958:963],
+ 1604: _CSR_name[963:966],
+ 1605: _CSR_name[966:970],
+ 1610: _CSR_name[970:976],
+ 1664: _CSR_name[976:981],
+ 1952: _CSR_name[981:988],
+ 1953: _CSR_name[988:994],
+ 1954: _CSR_name[994:1000],
+ 1955: _CSR_name[1000:1006],
+ 1956: _CSR_name[1006:1011],
+ 1957: _CSR_name[1011:1019],
+ 1960: _CSR_name[1019:1027],
+ 1961: _CSR_name[1027:1033],
+ 1962: _CSR_name[1033:1041],
+ 1968: _CSR_name[1041:1045],
+ 1969: _CSR_name[1045:1048],
+ 1970: _CSR_name[1048:1057],
+ 1971: _CSR_name[1057:1066],
+ 2816: _CSR_name[1066:1072],
+ 2818: _CSR_name[1072:1080],
+ 2819: _CSR_name[1080:1092],
+ 2820: _CSR_name[1092:1104],
+ 2821: _CSR_name[1104:1116],
+ 2822: _CSR_name[1116:1128],
+ 2823: _CSR_name[1128:1140],
+ 2824: _CSR_name[1140:1152],
+ 2825: _CSR_name[1152:1164],
+ 2826: _CSR_name[1164:1177],
+ 2827: _CSR_name[1177:1190],
+ 2828: _CSR_name[1190:1203],
+ 2829: _CSR_name[1203:1216],
+ 2830: _CSR_name[1216:1229],
+ 2831: _CSR_name[1229:1242],
+ 2832: _CSR_name[1242:1255],
+ 2833: _CSR_name[1255:1268],
+ 2834: _CSR_name[1268:1281],
+ 2835: _CSR_name[1281:1294],
+ 2836: _CSR_name[1294:1307],
+ 2837: _CSR_name[1307:1320],
+ 2838: _CSR_name[1320:1333],
+ 2839: _CSR_name[1333:1346],
+ 2840: _CSR_name[1346:1359],
+ 2841: _CSR_name[1359:1372],
+ 2842: _CSR_name[1372:1385],
+ 2843: _CSR_name[1385:1398],
+ 2844: _CSR_name[1398:1411],
+ 2845: _CSR_name[1411:1424],
+ 2846: _CSR_name[1424:1437],
+ 2847: _CSR_name[1437:1450],
+ 2944: _CSR_name[1450:1457],
+ 2946: _CSR_name[1457:1466],
+ 2947: _CSR_name[1466:1479],
+ 2948: _CSR_name[1479:1492],
+ 2949: _CSR_name[1492:1505],
+ 2950: _CSR_name[1505:1518],
+ 2951: _CSR_name[1518:1531],
+ 2952: _CSR_name[1531:1544],
+ 2953: _CSR_name[1544:1557],
+ 2954: _CSR_name[1557:1571],
+ 2955: _CSR_name[1571:1585],
+ 2956: _CSR_name[1585:1599],
+ 2957: _CSR_name[1599:1613],
+ 2958: _CSR_name[1613:1627],
+ 2959: _CSR_name[1627:1641],
+ 2960: _CSR_name[1641:1655],
+ 2961: _CSR_name[1655:1669],
+ 2962: _CSR_name[1669:1683],
+ 2963: _CSR_name[1683:1697],
+ 2964: _CSR_name[1697:1711],
+ 2965: _CSR_name[1711:1725],
+ 2966: _CSR_name[1725:1739],
+ 2967: _CSR_name[1739:1753],
+ 2968: _CSR_name[1753:1767],
+ 2969: _CSR_name[1767:1781],
+ 2970: _CSR_name[1781:1795],
+ 2971: _CSR_name[1795:1809],
+ 2972: _CSR_name[1809:1823],
+ 2973: _CSR_name[1823:1837],
+ 2974: _CSR_name[1837:1851],
+ 2975: _CSR_name[1851:1865],
+ 3072: _CSR_name[1865:1870],
+ 3073: _CSR_name[1870:1874],
+ 3074: _CSR_name[1874:1881],
+ 3075: _CSR_name[1881:1892],
+ 3076: _CSR_name[1892:1903],
+ 3077: _CSR_name[1903:1914],
+ 3078: _CSR_name[1914:1925],
+ 3079: _CSR_name[1925:1936],
+ 3080: _CSR_name[1936:1947],
+ 3081: _CSR_name[1947:1958],
+ 3082: _CSR_name[1958:1970],
+ 3083: _CSR_name[1970:1982],
+ 3084: _CSR_name[1982:1994],
+ 3085: _CSR_name[1994:2006],
+ 3086: _CSR_name[2006:2018],
+ 3087: _CSR_name[2018:2030],
+ 3088: _CSR_name[2030:2042],
+ 3089: _CSR_name[2042:2054],
+ 3090: _CSR_name[2054:2066],
+ 3091: _CSR_name[2066:2078],
+ 3092: _CSR_name[2078:2090],
+ 3093: _CSR_name[2090:2102],
+ 3094: _CSR_name[2102:2114],
+ 3095: _CSR_name[2114:2126],
+ 3096: _CSR_name[2126:2138],
+ 3097: _CSR_name[2138:2150],
+ 3098: _CSR_name[2150:2162],
+ 3099: _CSR_name[2162:2174],
+ 3100: _CSR_name[2174:2186],
+ 3101: _CSR_name[2186:2198],
+ 3102: _CSR_name[2198:2210],
+ 3103: _CSR_name[2210:2222],
+ 3104: _CSR_name[2222:2224],
+ 3105: _CSR_name[2224:2229],
+ 3106: _CSR_name[2229:2234],
+ 3200: _CSR_name[2234:2240],
+ 3201: _CSR_name[2240:2245],
+ 3202: _CSR_name[2245:2253],
+ 3203: _CSR_name[2253:2265],
+ 3204: _CSR_name[2265:2277],
+ 3205: _CSR_name[2277:2289],
+ 3206: _CSR_name[2289:2301],
+ 3207: _CSR_name[2301:2313],
+ 3208: _CSR_name[2313:2325],
+ 3209: _CSR_name[2325:2337],
+ 3210: _CSR_name[2337:2350],
+ 3211: _CSR_name[2350:2363],
+ 3212: _CSR_name[2363:2376],
+ 3213: _CSR_name[2376:2389],
+ 3214: _CSR_name[2389:2402],
+ 3215: _CSR_name[2402:2415],
+ 3216: _CSR_name[2415:2428],
+ 3217: _CSR_name[2428:2441],
+ 3218: _CSR_name[2441:2454],
+ 3219: _CSR_name[2454:2467],
+ 3220: _CSR_name[2467:2480],
+ 3221: _CSR_name[2480:2493],
+ 3222: _CSR_name[2493:2506],
+ 3223: _CSR_name[2506:2519],
+ 3224: _CSR_name[2519:2532],
+ 3225: _CSR_name[2532:2545],
+ 3226: _CSR_name[2545:2558],
+ 3227: _CSR_name[2558:2571],
+ 3228: _CSR_name[2571:2584],
+ 3229: _CSR_name[2584:2597],
+ 3230: _CSR_name[2597:2610],
+ 3231: _CSR_name[2610:2623],
+ 3602: _CSR_name[2623:2628],
+ 3857: _CSR_name[2628:2637],
+ 3858: _CSR_name[2637:2644],
+ 3859: _CSR_name[2644:2650],
+ 3860: _CSR_name[2650:2657],
+ 3861: _CSR_name[2657:2665],
+}
+
+func (i CSR) String() string {
+ if str, ok := _CSR_map[i]; ok {
+ return str
+ }
+ return "CSR(" + strconv.FormatInt(int64(i), 10) + ")"
+}
diff --git a/riscv64/riscv64asm/decode.go b/riscv64/riscv64asm/decode.go
new file mode 100644
index 0000000..d78fef9
--- /dev/null
+++ b/riscv64/riscv64asm/decode.go
@@ -0,0 +1,550 @@
+// Copyright 2024 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package riscv64asm
+
+import (
+ "encoding/binary"
+ "errors"
+)
+
+type argTypeList [6]argType
+
+// An instFormat describes the format of an instruction encoding.
+type instFormat struct {
+ mask uint32
+ value uint32
+ op Op
+ // args describe how to decode the instruction arguments.
+ // args is stored as a fixed-size array.
+ // if there are fewer than len(args) arguments, args[i] == 0 marks
+ // the end of the argument list.
+ args argTypeList
+}
+
+var (
+ errShort = errors.New("truncated instruction")
+ errUnknown = errors.New("unknown instruction")
+)
+
+var decoderCover []bool
+
+func init() {
+ decoderCover = make([]bool, len(instFormats))
+}
+
+// Decode decodes the 4 bytes in src as a single instruction.
+func Decode(src []byte) (Inst, error) {
+ length := len(src)
+ if length < 2 {
+ return Inst{}, errShort
+ }
+
+ var x uint32
+ // Non-RVC instructions always starts with 0x11
+ // So check whether src[0] & 3 == 3
+ if src[0]&3 == 3 {
+ if length < 4 {
+ return Inst{}, errShort
+ }
+ length = 4
+ x = binary.LittleEndian.Uint32(src)
+ } else {
+ length = 2
+ x = uint32(binary.LittleEndian.Uint16(src))
+ }
+
+Search:
+ for i, f := range instFormats {
+ if (x & f.mask) != f.value {
+ continue
+ }
+
+ // Decode args.
+ var args Args
+ for j, aop := range f.args {
+ if aop == 0 {
+ break
+ }
+ arg := decodeArg(aop, x, i)
+ if arg == nil && f.op != C_NOP {
+ // Cannot decode argument.
+ continue Search
+ }
+ args[j] = arg
+ }
+
+ if length == 2 {
+ args = convertCompressedIns(&f, args)
+ }
+
+ decoderCover[i] = true
+ inst := Inst{
+ Op: f.op,
+ Args: args,
+ Enc: x,
+ Len: length,
+ }
+ return inst, nil
+ }
+ return Inst{}, errUnknown
+}
+
+// decodeArg decodes the arg described by aop from the instruction bits x.
+// It returns nil if x cannot be decoded according to aop.
+func decodeArg(aop argType, x uint32, index int) Arg {
+ switch aop {
+ case arg_rd:
+ return X0 + Reg((x>>7)&((1<<5)-1))
+
+ case arg_rs1:
+ return X0 + Reg((x>>15)&((1<<5)-1))
+
+ case arg_rs2:
+ return X0 + Reg((x>>20)&((1<<5)-1))
+
+ case arg_rs3:
+ return X0 + Reg((x>>27)&((1<<5)-1))
+
+ case arg_fd:
+ return F0 + Reg((x>>7)&((1<<5)-1))
+
+ case arg_fs1:
+ return F0 + Reg((x>>15)&((1<<5)-1))
+
+ case arg_fs2:
+ return F0 + Reg((x>>20)&((1<<5)-1))
+
+ case arg_fs3:
+ return F0 + Reg((x>>27)&((1<<5)-1))
+
+ case arg_rs1_amo:
+ return AmoReg{X0 + Reg((x>>15)&((1<<5)-1))}
+
+ case arg_rs1_mem:
+ imm := x >> 20
+ // Sign-extend
+ if imm>>uint32(12-1) == 1 {
+ imm |= 0xfffff << 12
+ }
+ return RegOffset{X0 + Reg((x>>15)&((1<<5)-1)), Simm{int32(imm), true, 12}}
+
+ case arg_rs1_store:
+ imm := (x<<20)>>27 | (x>>25)<<5
+ // Sign-extend
+ if imm>>uint32(12-1) == 1 {
+ imm |= 0xfffff << 12
+ }
+ return RegOffset{X0 + Reg((x>>15)&((1<<5)-1)), Simm{int32(imm), true, 12}}
+
+ case arg_pred:
+ imm := x << 4 >> 28
+ return MemOrder(uint8(imm))
+
+ case arg_succ:
+ imm := x << 8 >> 28
+ return MemOrder(uint8(imm))
+
+ case arg_csr:
+ imm := x >> 20
+ return CSR(imm)
+
+ case arg_zimm:
+ imm := x << 12 >> 27
+ return Uimm{imm, true}
+
+ case arg_shamt5:
+ imm := x << 7 >> 27
+ return Uimm{imm, false}
+
+ case arg_shamt6:
+ imm := x << 6 >> 26
+ return Uimm{imm, false}
+
+ case arg_imm12:
+ imm := x >> 20
+ // Sign-extend
+ if imm>>uint32(12-1) == 1 {
+ imm |= 0xfffff << 12
+ }
+ return Simm{int32(imm), true, 12}
+
+ case arg_imm20:
+ imm := x >> 12
+ return Uimm{imm, false}
+
+ case arg_jimm20:
+ imm := (x>>31)<<20 | (x<<1)>>22<<1 | (x<<11)>>31<<11 | (x<<12)>>24<<12
+ // Sign-extend
+ if imm>>uint32(21-1) == 1 {
+ imm |= 0x7ff << 21
+ }
+ return Simm{int32(imm), true, 21}
+
+ case arg_simm12:
+ imm := (x<<20)>>27 | (x>>25)<<5
+ // Sign-extend
+ if imm>>uint32(12-1) == 1 {
+ imm |= 0xfffff << 12
+ }
+ return Simm{int32(imm), true, 12}
+
+ case arg_bimm12:
+ imm := (x<<20)>>28<<1 | (x<<1)>>26<<5 | (x<<24)>>31<<11 | (x>>31)<<12
+ // Sign-extend
+ if imm>>uint32(13-1) == 1 {
+ imm |= 0x7ffff << 13
+ }
+ return Simm{int32(imm), true, 13}
+
+ case arg_rd_p, arg_rs2_p:
+ return X8 + Reg((x>>2)&((1<<3)-1))
+
+ case arg_fd_p, arg_fs2_p:
+ return F8 + Reg((x>>2)&((1<<3)-1))
+
+ case arg_rs1_p, arg_rd_rs1_p:
+ return X8 + Reg((x>>7)&((1<<3)-1))
+
+ case arg_rd_n0, arg_rs1_n0, arg_rd_rs1_n0, arg_c_rs1_n0:
+ if X0+Reg((x>>7)&((1<<5)-1)) == X0 {
+ return nil
+ }
+ return X0 + Reg((x>>7)&((1<<5)-1))
+
+ case arg_c_rs2_n0:
+ if X0+Reg((x>>2)&((1<<5)-1)) == X0 {
+ return nil
+ }
+ return X0 + Reg((x>>2)&((1<<5)-1))
+
+ case arg_c_fs2:
+ return F0 + Reg((x>>2)&((1<<5)-1))
+
+ case arg_c_rs2:
+ return X0 + Reg((x>>2)&((1<<5)-1))
+
+ case arg_rd_n2:
+ if X0+Reg((x>>7)&((1<<5)-1)) == X0 || X0+Reg((x>>7)&((1<<5)-1)) == X2 {
+ return nil
+ }
+ return X0 + Reg((x>>7)&((1<<5)-1))
+
+ case arg_c_imm6:
+ imm := (x<<25)>>27 | (x<<19)>>31<<5
+ // Sign-extend
+ if imm>>uint32(6-1) == 1 {
+ imm |= 0x3ffffff << 6
+ }
+ return Simm{int32(imm), true, 6}
+
+ case arg_c_nzimm6:
+ imm := (x<<25)>>27 | (x<<19)>>31<<5
+ // Sign-extend
+ if imm>>uint32(6-1) == 1 {
+ imm |= 0x3ffffff << 6
+ }
+ if int32(imm) == 0 {
+ return nil
+ }
+ return Simm{int32(imm), true, 6}
+
+ case arg_c_nzuimm6:
+ imm := (x<<25)>>27 | (x<<19)>>31<<5
+ if int32(imm) == 0 {
+ return nil
+ }
+ return Uimm{imm, false}
+
+ case arg_c_uimm7:
+ imm := (x<<26)>>31<<6 | (x<<25)>>31<<2 | (x<<19)>>29<<3
+ return Uimm{imm, false}
+
+ case arg_c_uimm8:
+ imm := (x<<25)>>30<<6 | (x<<19)>>29<<3
+ return Uimm{imm, false}
+
+ case arg_c_uimm8sp_s:
+ imm := (x<<23)>>30<<6 | (x<<19)>>28<<2
+ return Uimm{imm, false}
+
+ case arg_c_uimm8sp:
+ imm := (x<<25)>>29<<2 | (x<<19)>>31<<5 | (x<<28)>>30<<6
+ return Uimm{imm, false}
+
+ case arg_c_uimm9sp_s:
+ imm := (x<<22)>>29<<6 | (x<<19)>>29<<3
+ return Uimm{imm, false}
+
+ case arg_c_uimm9sp:
+ imm := (x<<25)>>30<<3 | (x<<19)>>31<<5 | (x<<27)>>29<<6
+ return Uimm{imm, false}
+
+ case arg_c_bimm9:
+ imm := (x<<29)>>31<<5 | (x<<27)>>30<<1 | (x<<25)>>30<<6 | (x<<19)>>31<<8 | (x<<20)>>30<<3
+ // Sign-extend
+ if imm>>uint32(9-1) == 1 {
+ imm |= 0x7fffff << 9
+ }
+ return Simm{int32(imm), true, 9}
+
+ case arg_c_nzimm10:
+ imm := (x<<29)>>31<<5 | (x<<27)>>30<<7 | (x<<26)>>31<<6 | (x<<25)>>31<<4 | (x<<19)>>31<<9
+ // Sign-extend
+ if imm>>uint32(10-1) == 1 {
+ imm |= 0x3fffff << 10
+ }
+ if int32(imm) == 0 {
+ return nil
+ }
+ return Simm{int32(imm), true, 10}
+
+ case arg_c_nzuimm10:
+ imm := (x<<26)>>31<<3 | (x<<25)>>31<<2 | (x<<21)>>28<<6 | (x<<19)>>30<<4
+ if int32(imm) == 0 {
+ return nil
+ }
+ return Uimm{imm, false}
+
+ case arg_c_imm12:
+ imm := (x<<29)>>31<<5 | (x<<26)>>28<<1 | (x<<25)>>31<<7 | (x<<24)>>31<<6 | (x<<23)>>31<<10 | (x<<21)>>30<<8 | (x<<20)>>31<<4 | (x<<19)>>31<<11
+ // Sign-extend
+ if imm>>uint32(12-1) == 1 {
+ imm |= 0xfffff << 12
+ }
+ return Simm{int32(imm), true, 12}
+
+ case arg_c_nzimm18:
+ imm := (x<<25)>>27<<12 | (x<<19)>>31<<17
+ // Sign-extend
+ if imm>>uint32(18-1) == 1 {
+ imm |= 0x3fff << 18
+ }
+ if int32(imm) == 0 {
+ return nil
+ }
+ return Simm{int32(imm), true, 18}
+
+ default:
+ return nil
+ }
+}
+
+// convertCompressedIns rewrites the RVC Instruction to regular Instructions
+func convertCompressedIns(f *instFormat, args Args) Args {
+ var newargs Args
+ switch f.op {
+ case C_ADDI4SPN:
+ f.op = ADDI
+ newargs[0] = args[0]
+ newargs[1] = Reg(X2)
+ newargs[2] = Simm{int32(args[1].(Uimm).Imm), true, 12}
+
+ case C_LW:
+ f.op = LW
+ newargs[0] = args[0]
+ newargs[1] = RegOffset{args[1].(Reg), Simm{int32(args[2].(Uimm).Imm), true, 12}}
+
+ case C_SW:
+ f.op = SW
+ newargs[0] = args[1]
+ newargs[1] = RegOffset{args[0].(Reg), Simm{int32(args[2].(Uimm).Imm), true, 12}}
+
+ case C_NOP:
+ f.op = ADDI
+ newargs[0] = X0
+ newargs[1] = X0
+ newargs[2] = Simm{0, true, 12}
+
+ case C_ADDI:
+ f.op = ADDI
+ newargs[0] = args[0]
+ newargs[1] = args[0]
+ newargs[2] = Simm{args[1].(Simm).Imm, true, 12}
+
+ case C_LI:
+ f.op = ADDI
+ newargs[0] = args[0]
+ newargs[1] = Reg(X0)
+ newargs[2] = Simm{args[1].(Simm).Imm, true, 12}
+
+ case C_ADDI16SP:
+ f.op = ADDI
+ newargs[0] = Reg(X2)
+ newargs[1] = Reg(X2)
+ newargs[2] = Simm{args[0].(Simm).Imm, true, 12}
+
+ case C_LUI:
+ f.op = LUI
+ newargs[0] = args[0]
+ newargs[1] = Uimm{uint32(args[1].(Simm).Imm >> 12), false}
+
+ case C_ANDI:
+ f.op = ANDI
+ newargs[0] = args[0]
+ newargs[1] = args[0]
+ newargs[2] = Simm{args[1].(Simm).Imm, true, 12}
+
+ case C_SUB:
+ f.op = SUB
+ newargs[0] = args[0]
+ newargs[1] = args[0]
+ newargs[2] = args[1]
+
+ case C_XOR:
+ f.op = XOR
+ newargs[0] = args[0]
+ newargs[1] = args[0]
+ newargs[2] = args[1]
+
+ case C_OR:
+ f.op = OR
+ newargs[0] = args[0]
+ newargs[1] = args[0]
+ newargs[2] = args[1]
+
+ case C_AND:
+ f.op = AND
+ newargs[0] = args[0]
+ newargs[1] = args[0]
+ newargs[2] = args[1]
+
+ case C_J:
+ f.op = JAL
+ newargs[0] = Reg(X0)
+ newargs[1] = Simm{args[0].(Simm).Imm, true, 21}
+
+ case C_BEQZ:
+ f.op = BEQ
+ newargs[0] = args[0]
+ newargs[1] = Reg(X0)
+ newargs[2] = Simm{args[1].(Simm).Imm, true, 13}
+
+ case C_BNEZ:
+ f.op = BNE
+ newargs[0] = args[0]
+ newargs[1] = Reg(X0)
+ newargs[2] = Simm{args[1].(Simm).Imm, true, 13}
+
+ case C_LWSP:
+ f.op = LW
+ newargs[0] = args[0]
+ newargs[1] = RegOffset{Reg(X2), Simm{int32(args[1].(Uimm).Imm), true, 12}}
+
+ case C_JR:
+ f.op = JALR
+ newargs[0] = Reg(X0)
+ newargs[1] = RegOffset{args[0].(Reg), Simm{0, true, 12}}
+
+ case C_MV:
+ f.op = ADD
+ newargs[0] = args[0]
+ newargs[1] = Reg(X0)
+ newargs[2] = args[1]
+
+ case C_EBREAK:
+ f.op = EBREAK
+
+ case C_JALR:
+ f.op = JALR
+ newargs[0] = Reg(X1)
+ newargs[1] = RegOffset{args[0].(Reg), Simm{0, true, 12}}
+
+ case C_ADD:
+ f.op = ADD
+ newargs[0] = args[0]
+ newargs[1] = args[0]
+ newargs[2] = args[1]
+
+ case C_SWSP:
+ f.op = SW
+ newargs[0] = args[0]
+ newargs[1] = RegOffset{Reg(X2), Simm{int32(args[1].(Uimm).Imm), true, 12}}
+
+ // riscv64 compressed instructions
+ case C_LD:
+ f.op = LD
+ newargs[0] = args[0]
+ newargs[1] = RegOffset{args[1].(Reg), Simm{int32(args[2].(Uimm).Imm), true, 12}}
+
+ case C_SD:
+ f.op = SD
+ newargs[0] = args[1]
+ newargs[1] = RegOffset{args[0].(Reg), Simm{int32(args[2].(Uimm).Imm), true, 12}}
+
+ case C_ADDIW:
+ f.op = ADDIW
+ newargs[0] = args[0]
+ newargs[1] = args[0]
+ newargs[2] = Simm{args[1].(Simm).Imm, true, 12}
+
+ case C_SRLI:
+ f.op = SRLI
+ newargs[0] = args[0]
+ newargs[1] = args[0]
+ newargs[2] = args[1]
+
+ case C_SRAI:
+ f.op = SRAI
+ newargs[0] = args[0]
+ newargs[1] = args[0]
+ newargs[2] = args[1]
+
+ case C_SUBW:
+ f.op = SUBW
+ newargs[0] = args[0]
+ newargs[1] = args[0]
+ newargs[2] = args[1]
+
+ case C_ADDW:
+ f.op = ADDW
+ newargs[0] = args[0]
+ newargs[1] = args[0]
+ newargs[2] = args[1]
+
+ case C_SLLI:
+ f.op = SLLI
+ newargs[0] = args[0]
+ newargs[1] = args[0]
+ newargs[2] = args[1]
+
+ case C_LDSP:
+ f.op = LD
+ newargs[0] = args[0]
+ newargs[1] = RegOffset{Reg(X2), Simm{int32(args[1].(Uimm).Imm), true, 12}}
+
+ case C_SDSP:
+ f.op = SD
+ newargs[0] = args[0]
+ newargs[1] = RegOffset{Reg(X2), Simm{int32(args[1].(Uimm).Imm), true, 12}}
+
+ // riscv double precision floating point compressed instructions
+ case C_FLD:
+ f.op = FLD
+ newargs[0] = args[0]
+ newargs[1] = RegOffset{args[1].(Reg), Simm{int32(args[2].(Uimm).Imm), true, 12}}
+
+ case C_FSD:
+ f.op = FSD
+ newargs[0] = args[1]
+ newargs[1] = RegOffset{args[0].(Reg), Simm{int32(args[2].(Uimm).Imm), true, 12}}
+
+ case C_FLDSP:
+ f.op = FLD
+ newargs[0] = args[0]
+ newargs[1] = RegOffset{Reg(X2), Simm{int32(args[1].(Uimm).Imm), true, 12}}
+
+ case C_FSDSP:
+ f.op = FSD
+ newargs[0] = args[0]
+ newargs[1] = RegOffset{Reg(X2), Simm{int32(args[1].(Uimm).Imm), true, 12}}
+
+ case C_UNIMP:
+ f.op = CSRRW
+ newargs[0] = Reg(X0)
+ newargs[1] = CSR(CYCLE)
+ newargs[2] = Reg(X0)
+ }
+ return newargs
+}
diff --git a/riscv64/riscv64asm/gnu.go b/riscv64/riscv64asm/gnu.go
new file mode 100644
index 0000000..d6b3dc0
--- /dev/null
+++ b/riscv64/riscv64asm/gnu.go
@@ -0,0 +1,328 @@
+// Copyright 2024 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package riscv64asm
+
+import (
+ "strings"
+)
+
+// 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 GNUSyntax(inst Inst) string {
+ op := strings.ToLower(inst.Op.String())
+ var args []string
+ for _, a := range inst.Args {
+ if a == nil {
+ break
+ }
+ args = append(args, strings.ToLower(a.String()))
+ }
+
+ switch inst.Op {
+ case ADDI, ADDIW, ANDI, ORI, SLLI, SLLIW, SRAI, SRAIW, SRLI, SRLIW, XORI:
+ if inst.Op == ADDI {
+ if inst.Args[1].(Reg) == X0 && inst.Args[0].(Reg) != X0 {
+ op = "li"
+ args[1] = args[2]
+ args = args[:len(args)-1]
+ break
+ }
+
+ if inst.Args[2].(Simm).Imm == 0 {
+ if inst.Args[0].(Reg) == X0 && inst.Args[1].(Reg) == X0 {
+ op = "nop"
+ args = nil
+ } else {
+ op = "mv"
+ args = args[:len(args)-1]
+ }
+ }
+ }
+
+ if inst.Op == ADDIW && inst.Args[2].(Simm).Imm == 0 {
+ op = "sext.w"
+ args = args[:len(args)-1]
+ }
+
+ if inst.Op == XORI && inst.Args[2].(Simm).String() == "-1" {
+ op = "not"
+ args = args[:len(args)-1]
+ }
+
+ case ADD:
+ if inst.Args[1].(Reg) == X0 {
+ op = "mv"
+ args[1] = args[2]
+ args = args[:len(args)-1]
+ }
+
+ case BEQ:
+ if inst.Args[1].(Reg) == X0 {
+ op = "beqz"
+ args[1] = args[2]
+ args = args[:len(args)-1]
+ }
+
+ case BGE:
+ if inst.Args[1].(Reg) == X0 {
+ op = "bgez"
+ args[1] = args[2]
+ args = args[:len(args)-1]
+ } else if inst.Args[0].(Reg) == X0 {
+ op = "blez"
+ args[0], args[1] = args[1], args[2]
+ args = args[:len(args)-1]
+ }
+
+ case BLT:
+ if inst.Args[1].(Reg) == X0 {
+ op = "bltz"
+ args[1] = args[2]
+ args = args[:len(args)-1]
+ } else if inst.Args[0].(Reg) == X0 {
+ op = "bgtz"
+ args[0], args[1] = args[1], args[2]
+ args = args[:len(args)-1]
+ }
+
+ case BNE:
+ if inst.Args[1].(Reg) == X0 {
+ op = "bnez"
+ args[1] = args[2]
+ args = args[:len(args)-1]
+ }
+
+ case CSRRC:
+ if inst.Args[0].(Reg) == X0 {
+ op = "csrc"
+ args[0], args[1] = args[1], args[2]
+ args = args[:len(args)-1]
+ }
+
+ case CSRRCI:
+ if inst.Args[0].(Reg) == X0 {
+ op = "csrci"
+ args[0], args[1] = args[1], args[2]
+ args = args[:len(args)-1]
+ }
+
+ case CSRRS:
+ if inst.Args[2].(Reg) == X0 {
+ switch inst.Args[1].(CSR) {
+ case FCSR:
+ op = "frcsr"
+ args = args[:len(args)-2]
+
+ case FFLAGS:
+ op = "frflags"
+ args = args[:len(args)-2]
+
+ case FRM:
+ op = "frrm"
+ args = args[:len(args)-2]
+
+ // rdcycleh, rdinstreth and rdtimeh are RV-32 only instructions.
+ // So not included there.
+ case CYCLE:
+ op = "rdcycle"
+ args = args[:len(args)-2]
+
+ case INSTRET:
+ op = "rdinstret"
+ args = args[:len(args)-2]
+
+ case TIME:
+ op = "rdtime"
+ args = args[:len(args)-2]
+
+ default:
+ op = "csrr"
+ args = args[:len(args)-1]
+ }
+ } else if inst.Args[0].(Reg) == X0 {
+ op = "csrs"
+ args[0], args[1] = args[1], args[2]
+ args = args[:len(args)-1]
+ }
+
+ case CSRRSI:
+ if inst.Args[0].(Reg) == X0 {
+ op = "csrsi"
+ args[0], args[1] = args[1], args[2]
+ args = args[:len(args)-1]
+ }
+
+ case CSRRW:
+ switch inst.Args[1].(CSR) {
+ case FCSR:
+ op = "fscsr"
+ if inst.Args[0].(Reg) == X0 {
+ args[0] = args[2]
+ args = args[:len(args)-2]
+ } else {
+ args[1] = args[2]
+ args = args[:len(args)-1]
+ }
+
+ case FFLAGS:
+ op = "fsflags"
+ if inst.Args[0].(Reg) == X0 {
+ args[0] = args[2]
+ args = args[:len(args)-2]
+ } else {
+ args[1] = args[2]
+ args = args[:len(args)-1]
+ }
+
+ case FRM:
+ op = "fsrm"
+ if inst.Args[0].(Reg) == X0 {
+ args[0] = args[2]
+ args = args[:len(args)-2]
+ } else {
+ args[1] = args[2]
+ args = args[:len(args)-1]
+ }
+
+ case CYCLE:
+ if inst.Args[0].(Reg) == X0 && inst.Args[2].(Reg) == X0 {
+ op = "unimp"
+ args = nil
+ }
+
+ default:
+ if inst.Args[0].(Reg) == X0 {
+ op = "csrw"
+ args[0], args[1] = args[1], args[2]
+ args = args[:len(args)-1]
+ }
+ }
+
+ case CSRRWI:
+ if inst.Args[0].(Reg) == X0 {
+ op = "csrwi"
+ args[0], args[1] = args[1], args[2]
+ args = args[:len(args)-1]
+ }
+
+ // When both pred and succ equals to iorw, the GNU objdump will omit them.
+ case FENCE:
+ if inst.Args[0].(MemOrder).String() == "iorw" &&
+ inst.Args[1].(MemOrder).String() == "iorw" {
+ args = nil
+ }
+
+ case FSGNJX_D:
+ if inst.Args[1].(Reg) == inst.Args[2].(Reg) {
+ op = "fabs.d"
+ args = args[:len(args)-1]
+ }
+
+ case FSGNJX_S:
+ if inst.Args[1].(Reg) == inst.Args[2].(Reg) {
+ op = "fabs.s"
+ args = args[:len(args)-1]
+ }
+
+ case FSGNJ_D:
+ if inst.Args[1].(Reg) == inst.Args[2].(Reg) {
+ op = "fmv.d"
+ args = args[:len(args)-1]
+ }
+
+ case FSGNJ_S:
+ if inst.Args[1].(Reg) == inst.Args[2].(Reg) {
+ op = "fmv.s"
+ args = args[:len(args)-1]
+ }
+
+ case FSGNJN_D:
+ if inst.Args[1].(Reg) == inst.Args[2].(Reg) {
+ op = "fneg.d"
+ args = args[:len(args)-1]
+ }
+
+ case FSGNJN_S:
+ if inst.Args[1].(Reg) == inst.Args[2].(Reg) {
+ op = "fneg.s"
+ args = args[:len(args)-1]
+ }
+
+ case JAL:
+ if inst.Args[0].(Reg) == X0 {
+ op = "j"
+ args[0] = args[1]
+ args = args[:len(args)-1]
+ } else if inst.Args[0].(Reg) == X1 {
+ op = "jal"
+ args[0] = args[1]
+ args = args[:len(args)-1]
+ }
+
+ case JALR:
+ if inst.Args[0].(Reg) == X1 && inst.Args[1].(RegOffset).Ofs.Imm == 0 {
+ args[0] = inst.Args[1].(RegOffset).OfsReg.String()
+ args = args[:len(args)-1]
+ }
+
+ if inst.Args[0].(Reg) == X0 {
+ if inst.Args[1].(RegOffset).OfsReg == X1 && inst.Args[1].(RegOffset).Ofs.Imm == 0 {
+ op = "ret"
+ args = nil
+ } else if inst.Args[1].(RegOffset).Ofs.Imm == 0 {
+ op = "jr"
+ args[0] = inst.Args[1].(RegOffset).OfsReg.String()
+ args = args[:len(args)-1]
+ } else {
+ op = "jr"
+ args[0] = inst.Args[1].(RegOffset).String()
+ args = args[:len(args)-1]
+ }
+ }
+
+ case SLTIU:
+ if inst.Args[2].(Simm).String() == "1" {
+ op = "seqz"
+ args = args[:len(args)-1]
+ }
+
+ case SLT:
+ if inst.Args[1].(Reg) == X0 {
+ op = "sgtz"
+ args[1] = args[2]
+ args = args[:len(args)-1]
+ } else if inst.Args[2].(Reg) == X0 {
+ op = "sltz"
+ args = args[:len(args)-1]
+ }
+
+ case SLTU:
+ if inst.Args[1].(Reg) == X0 {
+ op = "snez"
+ args[1] = args[2]
+ args = args[:len(args)-1]
+ }
+
+ case SUB:
+ if inst.Args[1].(Reg) == X0 {
+ op = "neg"
+ args[1] = args[2]
+ args = args[:len(args)-1]
+ }
+
+ case SUBW:
+ if inst.Args[1].(Reg) == X0 {
+ op = "negw"
+ args[1] = args[2]
+ args = args[:len(args)-1]
+ }
+ }
+
+ if args != nil {
+ op += " " + strings.Join(args, ",")
+ }
+ return op
+}
diff --git a/riscv64/riscv64asm/inst.go b/riscv64/riscv64asm/inst.go
new file mode 100644
index 0000000..3c13567
--- /dev/null
+++ b/riscv64/riscv64asm/inst.go
@@ -0,0 +1,495 @@
+// Copyright 2024 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package riscv64asm
+
+import (
+ "fmt"
+ "strings"
+)
+
+// An Op is a RISC-V opcode.
+type Op uint16
+
+// NOTE: The actual Op values are defined in tables.go.
+func (op Op) String() string {
+ if op >= Op(len(opstr)) || opstr[op] == "" {
+ return fmt.Sprintf("Op(%d)", op)
+ }
+
+ return opstr[op]
+}
+
+// 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
+
+// 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 (i Inst) String() string {
+ var args []string
+ for _, arg := range i.Args {
+ if arg == nil {
+ break
+ }
+ args = append(args, arg.String())
+ }
+
+ if len(args) == 0 {
+ return i.Op.String()
+ }
+ return i.Op.String() + " " + strings.Join(args, ",")
+}
+
+// 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 {
+ switch {
+ case r >= X0 && r <= X31:
+ return fmt.Sprintf("x%d", r)
+
+ case r >= F0 && r <= F31:
+ return fmt.Sprintf("f%d", r-F0)
+
+ default:
+ return fmt.Sprintf("Unknown(%d)", r)
+ }
+}
+
+// A CSR is a single control and status register.
+// Use stringer to generate CSR match table.
+//
+//go:generate stringer -type=CSR
+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
+)
+
+// 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 {
+ if ui.Decimal {
+ return fmt.Sprintf("%d", ui.Imm)
+ }
+ return fmt.Sprintf("%#x", ui.Imm)
+}
+
+// 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 {
+ if si.Decimal {
+ return fmt.Sprintf("%d", si.Imm)
+ }
+ return fmt.Sprintf("%#x", si.Imm)
+}
+
+// An AmoReg is an atomic address register used in AMO instructions
+type AmoReg struct {
+ reg Reg // Avoid promoted String method
+}
+
+func (amoReg AmoReg) String() string {
+ return fmt.Sprintf("(%s)", amoReg.reg)
+}
+
+// A RegOffset is a register with offset value
+type RegOffset struct {
+ OfsReg Reg
+ Ofs Simm
+}
+
+func (regofs RegOffset) String() string {
+ return fmt.Sprintf("%s(%s)", regofs.Ofs, regofs.OfsReg)
+}
+
+// A MemOrder is a memory order hint in fence instruction
+type MemOrder uint8
+
+func (memOrder MemOrder) String() string {
+ var str string
+ if memOrder<<7>>7 == 1 {
+ str += "i"
+ }
+ if memOrder>>1<<7>>7 == 1 {
+ str += "o"
+ }
+ if memOrder>>2<<7>>7 == 1 {
+ str += "r"
+ }
+ if memOrder>>3<<7>>7 == 1 {
+ str += "w"
+ }
+ return str
+}
diff --git a/riscv64/riscv64asm/plan9x.go b/riscv64/riscv64asm/plan9x.go
new file mode 100644
index 0000000..367122d
--- /dev/null
+++ b/riscv64/riscv64asm/plan9x.go
@@ -0,0 +1,377 @@
+// Copyright 2024 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package riscv64asm
+
+import (
+ "fmt"
+ "io"
+ "strconv"
+ "strings"
+)
+
+// 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.
+func GoSyntax(inst Inst, pc uint64, symname func(uint64) (string, uint64), text io.ReaderAt) string {
+ if symname == nil {
+ symname = func(uint64) (string, uint64) { return "", 0 }
+ }
+
+ var args []string
+ for _, a := range inst.Args {
+ if a == nil {
+ break
+ }
+ args = append(args, plan9Arg(&inst, pc, symname, a))
+ }
+
+ op := inst.Op.String()
+
+ switch inst.Op {
+
+ case AMOADD_D, AMOADD_D_AQ, AMOADD_D_RL, AMOADD_D_AQRL, AMOADD_W, AMOADD_W_AQ,
+ AMOADD_W_RL, AMOADD_W_AQRL, AMOAND_D, AMOAND_D_AQ, AMOAND_D_RL, AMOAND_D_AQRL,
+ AMOAND_W, AMOAND_W_AQ, AMOAND_W_RL, AMOAND_W_AQRL, AMOMAXU_D, AMOMAXU_D_AQ,
+ AMOMAXU_D_RL, AMOMAXU_D_AQRL, AMOMAXU_W, AMOMAXU_W_AQ, AMOMAXU_W_RL, AMOMAXU_W_AQRL,
+ AMOMAX_D, AMOMAX_D_AQ, AMOMAX_D_RL, AMOMAX_D_AQRL, AMOMAX_W, AMOMAX_W_AQ, AMOMAX_W_RL,
+ AMOMAX_W_AQRL, AMOMINU_D, AMOMINU_D_AQ, AMOMINU_D_RL, AMOMINU_D_AQRL, AMOMINU_W,
+ AMOMINU_W_AQ, AMOMINU_W_RL, AMOMINU_W_AQRL, AMOMIN_D, AMOMIN_D_AQ, AMOMIN_D_RL,
+ AMOMIN_D_AQRL, AMOMIN_W, AMOMIN_W_AQ, AMOMIN_W_RL, AMOMIN_W_AQRL, AMOOR_D, AMOOR_D_AQ,
+ AMOOR_D_RL, AMOOR_D_AQRL, AMOOR_W, AMOOR_W_AQ, AMOOR_W_RL, AMOOR_W_AQRL, AMOSWAP_D,
+ AMOSWAP_D_AQ, AMOSWAP_D_RL, AMOSWAP_D_AQRL, AMOSWAP_W, AMOSWAP_W_AQ, AMOSWAP_W_RL,
+ AMOSWAP_W_AQRL, AMOXOR_D, AMOXOR_D_AQ, AMOXOR_D_RL, AMOXOR_D_AQRL, AMOXOR_W,
+ AMOXOR_W_AQ, AMOXOR_W_RL, AMOXOR_W_AQRL, SC_D, SC_D_AQ, SC_D_RL, SC_D_AQRL,
+ SC_W, SC_W_AQ, SC_W_RL, SC_W_AQRL:
+ // Atomic instructions have special operand order.
+ args[2], args[1] = args[1], args[2]
+
+ case ADDI:
+ if inst.Args[2].(Simm).Imm == 0 {
+ op = "MOV"
+ args = args[:len(args)-1]
+ }
+
+ case ADDIW:
+ if inst.Args[2].(Simm).Imm == 0 {
+ op = "MOVW"
+ args = args[:len(args)-1]
+ }
+
+ case ANDI:
+ if inst.Args[2].(Simm).Imm == 255 {
+ op = "MOVBU"
+ args = args[:len(args)-1]
+ }
+
+ case BEQ:
+ if inst.Args[1].(Reg) == X0 {
+ op = "BEQZ"
+ args[1] = args[2]
+ args = args[:len(args)-1]
+ }
+ for i, j := 0, len(args)-1; i < j; i, j = i+1, j-1 {
+ args[i], args[j] = args[j], args[i]
+ }
+
+ case BGE:
+ if inst.Args[1].(Reg) == X0 {
+ op = "BGEZ"
+ args[1] = args[2]
+ args = args[:len(args)-1]
+ }
+ for i, j := 0, len(args)-1; i < j; i, j = i+1, j-1 {
+ args[i], args[j] = args[j], args[i]
+ }
+
+ case BLT:
+ if inst.Args[1].(Reg) == X0 {
+ op = "BLTZ"
+ args[1] = args[2]
+ args = args[:len(args)-1]
+ }
+ for i, j := 0, len(args)-1; i < j; i, j = i+1, j-1 {
+ args[i], args[j] = args[j], args[i]
+ }
+
+ case BNE:
+ if inst.Args[1].(Reg) == X0 {
+ op = "BNEZ"
+ args[1] = args[2]
+ args = args[:len(args)-1]
+ }
+ for i, j := 0, len(args)-1; i < j; i, j = i+1, j-1 {
+ args[i], args[j] = args[j], args[i]
+ }
+
+ case BLTU, BGEU:
+ for i, j := 0, len(args)-1; i < j; i, j = i+1, j-1 {
+ args[i], args[j] = args[j], args[i]
+ }
+
+ case CSRRW:
+ switch inst.Args[1].(CSR) {
+ case FCSR:
+ op = "FSCSR"
+ args[1] = args[2]
+ args = args[:len(args)-1]
+ case FFLAGS:
+ op = "FSFLAGS"
+ args[1] = args[2]
+ args = args[:len(args)-1]
+ case FRM:
+ op = "FSRM"
+ args[1] = args[2]
+ args = args[:len(args)-1]
+ case CYCLE:
+ if inst.Args[0].(Reg) == X0 && inst.Args[2].(Reg) == X0 {
+ op = "UNIMP"
+ args = nil
+ }
+ }
+
+ case CSRRS:
+ if inst.Args[2].(Reg) == X0 {
+ switch inst.Args[1].(CSR) {
+ case FCSR:
+ op = "FRCSR"
+ args = args[:len(args)-2]
+ case FFLAGS:
+ op = "FRFLAGS"
+ args = args[:len(args)-2]
+ case FRM:
+ op = "FRRM"
+ args = args[:len(args)-2]
+ case CYCLE:
+ op = "RDCYCLE"
+ args = args[:len(args)-2]
+ case CYCLEH:
+ op = "RDCYCLEH"
+ args = args[:len(args)-2]
+ case INSTRET:
+ op = "RDINSTRET"
+ args = args[:len(args)-2]
+ case INSTRETH:
+ op = "RDINSTRETH"
+ args = args[:len(args)-2]
+ case TIME:
+ op = "RDTIME"
+ args = args[:len(args)-2]
+ case TIMEH:
+ op = "RDTIMEH"
+ args = args[:len(args)-2]
+ }
+ }
+
+ // Fence instruction in plan9 doesn't have any operands.
+ case FENCE:
+ args = nil
+
+ case FMADD_D, FMADD_H, FMADD_Q, FMADD_S, FMSUB_D, FMSUB_H,
+ FMSUB_Q, FMSUB_S, FNMADD_D, FNMADD_H, FNMADD_Q, FNMADD_S,
+ FNMSUB_D, FNMSUB_H, FNMSUB_Q, FNMSUB_S:
+ args[1], args[3] = args[3], args[1]
+
+ case FSGNJ_S:
+ if inst.Args[2] == inst.Args[1] {
+ op = "MOVF"
+ args = args[:len(args)-1]
+ }
+
+ case FSGNJ_D:
+ if inst.Args[2] == inst.Args[1] {
+ op = "MOVD"
+ args = args[:len(args)-1]
+ }
+
+ case FSGNJX_S:
+ if inst.Args[2] == inst.Args[1] {
+ op = "FABSS"
+ args = args[:len(args)-1]
+ }
+
+ case FSGNJX_D:
+ if inst.Args[2] == inst.Args[1] {
+ op = "FABSD"
+ args = args[:len(args)-1]
+ }
+
+ case FSGNJN_S:
+ if inst.Args[2] == inst.Args[1] {
+ op = "FNEGS"
+ args = args[:len(args)-1]
+ }
+
+ case FSGNJN_D:
+ if inst.Args[2] == inst.Args[1] {
+ op = "FNESD"
+ args = args[:len(args)-1]
+ }
+
+ case LD, SD:
+ op = "MOV"
+ if inst.Op == SD {
+ args[0], args[1] = args[1], args[0]
+ }
+
+ case LB, SB:
+ op = "MOVB"
+ if inst.Op == SB {
+ args[0], args[1] = args[1], args[0]
+ }
+
+ case LH, SH:
+ op = "MOVH"
+ if inst.Op == SH {
+ args[0], args[1] = args[1], args[0]
+ }
+
+ case LW, SW:
+ op = "MOVW"
+ if inst.Op == SW {
+ args[0], args[1] = args[1], args[0]
+ }
+
+ case LBU:
+ op = "MOVBU"
+
+ case LHU:
+ op = "MOVHU"
+
+ case LWU:
+ op = "MOVWU"
+
+ case FLW, FSW:
+ op = "MOVF"
+ if inst.Op == FLW {
+ args[0], args[1] = args[1], args[0]
+ }
+
+ case FLD, FSD:
+ op = "MOVD"
+ if inst.Op == FLD {
+ args[0], args[1] = args[1], args[0]
+ }
+
+ case SUB:
+ if inst.Args[1].(Reg) == X0 {
+ op = "NEG"
+ args[1] = args[2]
+ args = args[:len(args)-1]
+ }
+
+ case XORI:
+ if inst.Args[2].(Simm).String() == "-1" {
+ op = "NOT"
+ args = args[:len(args)-1]
+ }
+
+ case SLTIU:
+ if inst.Args[2].(Simm).Imm == 1 {
+ op = "SEQZ"
+ args = args[:len(args)-1]
+ }
+
+ case SLTU:
+ if inst.Args[1].(Reg) == X0 {
+ op = "SNEZ"
+ args[1] = args[2]
+ args = args[:len(args)-1]
+ }
+
+ case JAL:
+ if inst.Args[0].(Reg) == X0 {
+ op = "JMP"
+ args[0] = args[1]
+ args = args[:len(args)-1]
+ } else if inst.Args[0].(Reg) == X1 {
+ op = "CALL"
+ args[0] = args[1]
+ args = args[:len(args)-1]
+ } else {
+ args[0], args[1] = args[1], args[0]
+ }
+
+ case JALR:
+ if inst.Args[0].(Reg) == X0 {
+ if inst.Args[1].(RegOffset).OfsReg == X1 && inst.Args[1].(RegOffset).Ofs.Imm == 0 {
+ op = "RET"
+ args = nil
+ break
+ }
+ op = "JMP"
+ args[0] = args[1]
+ args = args[:len(args)-1]
+ } else if inst.Args[0].(Reg) == X1 {
+ op = "CALL"
+ args[0] = args[1]
+ args = args[:len(args)-1]
+ } else {
+ args[0], args[1] = args[1], args[0]
+ }
+ }
+
+ // Reverse args, placing dest last.
+ for i, j := 0, len(args)-1; i < j; i, j = i+1, j-1 {
+ args[i], args[j] = args[j], args[i]
+ }
+
+ // Change to plan9 opcode format
+ // Atomic instructions do not have reorder suffix, so remove them
+ op = strings.Replace(op, ".AQRL", "", -1)
+ op = strings.Replace(op, ".AQ", "", -1)
+ op = strings.Replace(op, ".RL", "", -1)
+ op = strings.Replace(op, ".", "", -1)
+
+ if args != nil {
+ op += " " + strings.Join(args, ", ")
+ }
+
+ return op
+}
+
+func plan9Arg(inst *Inst, pc uint64, symname func(uint64) (string, uint64), arg Arg) string {
+ switch a := arg.(type) {
+ case Uimm:
+ return fmt.Sprintf("$%d", uint32(a.Imm))
+
+ case Simm:
+ imm, _ := strconv.Atoi(a.String())
+ if a.Width == 13 || a.Width == 21 {
+ addr := int64(pc) + int64(imm)
+ if s, base := symname(uint64(addr)); s != "" && uint64(addr) == base {
+ return fmt.Sprintf("%s(SB)", s)
+ }
+ return fmt.Sprintf("%d(PC)", imm/4)
+ }
+ return fmt.Sprintf("$%d", int32(imm))
+
+ case Reg:
+ if a <= 31 {
+ return fmt.Sprintf("X%d", a)
+ } else {
+ return fmt.Sprintf("F%d", a-32)
+ }
+
+ case RegOffset:
+ if a.Ofs.Imm == 0 {
+ return fmt.Sprintf("(X%d)", a.OfsReg)
+ } else {
+ return fmt.Sprintf("%s(X%d)", a.Ofs.String(), a.OfsReg)
+ }
+
+ case AmoReg:
+ return fmt.Sprintf("(X%d)", a.reg)
+
+ default:
+ return strings.ToUpper(arg.String())
+ }
+}
diff --git a/riscv64/riscv64asm/tables.go b/riscv64/riscv64asm/tables.go
new file mode 100644
index 0000000..3e5db41
--- /dev/null
+++ b/riscv64/riscv64asm/tables.go
@@ -0,0 +1,1474 @@
+// Code generated by riscv64spec riscv-opcodes
+// DO NOT EDIT
+
+// Copyright 2024 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package riscv64asm
+
+const (
+ _ Op = iota
+ ADD
+ 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
+)
+
+var opstr = [...]string{
+ ADD: "ADD",
+ ADDI: "ADDI",
+ ADDIW: "ADDIW",
+ ADDW: "ADDW",
+ ADD_UW: "ADD.UW",
+ AMOADD_D: "AMOADD.D",
+ AMOADD_D_AQ: "AMOADD.D.AQ",
+ AMOADD_D_AQRL: "AMOADD.D.AQRL",
+ AMOADD_D_RL: "AMOADD.D.RL",
+ AMOADD_W: "AMOADD.W",
+ AMOADD_W_AQ: "AMOADD.W.AQ",
+ AMOADD_W_AQRL: "AMOADD.W.AQRL",
+ AMOADD_W_RL: "AMOADD.W.RL",
+ AMOAND_D: "AMOAND.D",
+ AMOAND_D_AQ: "AMOAND.D.AQ",
+ AMOAND_D_AQRL: "AMOAND.D.AQRL",
+ AMOAND_D_RL: "AMOAND.D.RL",
+ AMOAND_W: "AMOAND.W",
+ AMOAND_W_AQ: "AMOAND.W.AQ",
+ AMOAND_W_AQRL: "AMOAND.W.AQRL",
+ AMOAND_W_RL: "AMOAND.W.RL",
+ AMOMAXU_D: "AMOMAXU.D",
+ AMOMAXU_D_AQ: "AMOMAXU.D.AQ",
+ AMOMAXU_D_AQRL: "AMOMAXU.D.AQRL",
+ AMOMAXU_D_RL: "AMOMAXU.D.RL",
+ AMOMAXU_W: "AMOMAXU.W",
+ AMOMAXU_W_AQ: "AMOMAXU.W.AQ",
+ AMOMAXU_W_AQRL: "AMOMAXU.W.AQRL",
+ AMOMAXU_W_RL: "AMOMAXU.W.RL",
+ AMOMAX_D: "AMOMAX.D",
+ AMOMAX_D_AQ: "AMOMAX.D.AQ",
+ AMOMAX_D_AQRL: "AMOMAX.D.AQRL",
+ AMOMAX_D_RL: "AMOMAX.D.RL",
+ AMOMAX_W: "AMOMAX.W",
+ AMOMAX_W_AQ: "AMOMAX.W.AQ",
+ AMOMAX_W_AQRL: "AMOMAX.W.AQRL",
+ AMOMAX_W_RL: "AMOMAX.W.RL",
+ AMOMINU_D: "AMOMINU.D",
+ AMOMINU_D_AQ: "AMOMINU.D.AQ",
+ AMOMINU_D_AQRL: "AMOMINU.D.AQRL",
+ AMOMINU_D_RL: "AMOMINU.D.RL",
+ AMOMINU_W: "AMOMINU.W",
+ AMOMINU_W_AQ: "AMOMINU.W.AQ",
+ AMOMINU_W_AQRL: "AMOMINU.W.AQRL",
+ AMOMINU_W_RL: "AMOMINU.W.RL",
+ AMOMIN_D: "AMOMIN.D",
+ AMOMIN_D_AQ: "AMOMIN.D.AQ",
+ AMOMIN_D_AQRL: "AMOMIN.D.AQRL",
+ AMOMIN_D_RL: "AMOMIN.D.RL",
+ AMOMIN_W: "AMOMIN.W",
+ AMOMIN_W_AQ: "AMOMIN.W.AQ",
+ AMOMIN_W_AQRL: "AMOMIN.W.AQRL",
+ AMOMIN_W_RL: "AMOMIN.W.RL",
+ AMOOR_D: "AMOOR.D",
+ AMOOR_D_AQ: "AMOOR.D.AQ",
+ AMOOR_D_AQRL: "AMOOR.D.AQRL",
+ AMOOR_D_RL: "AMOOR.D.RL",
+ AMOOR_W: "AMOOR.W",
+ AMOOR_W_AQ: "AMOOR.W.AQ",
+ AMOOR_W_AQRL: "AMOOR.W.AQRL",
+ AMOOR_W_RL: "AMOOR.W.RL",
+ AMOSWAP_D: "AMOSWAP.D",
+ AMOSWAP_D_AQ: "AMOSWAP.D.AQ",
+ AMOSWAP_D_AQRL: "AMOSWAP.D.AQRL",
+ AMOSWAP_D_RL: "AMOSWAP.D.RL",
+ AMOSWAP_W: "AMOSWAP.W",
+ AMOSWAP_W_AQ: "AMOSWAP.W.AQ",
+ AMOSWAP_W_AQRL: "AMOSWAP.W.AQRL",
+ AMOSWAP_W_RL: "AMOSWAP.W.RL",
+ AMOXOR_D: "AMOXOR.D",
+ AMOXOR_D_AQ: "AMOXOR.D.AQ",
+ AMOXOR_D_AQRL: "AMOXOR.D.AQRL",
+ AMOXOR_D_RL: "AMOXOR.D.RL",
+ AMOXOR_W: "AMOXOR.W",
+ AMOXOR_W_AQ: "AMOXOR.W.AQ",
+ AMOXOR_W_AQRL: "AMOXOR.W.AQRL",
+ AMOXOR_W_RL: "AMOXOR.W.RL",
+ AND: "AND",
+ ANDI: "ANDI",
+ ANDN: "ANDN",
+ AUIPC: "AUIPC",
+ BCLR: "BCLR",
+ BCLRI: "BCLRI",
+ BEQ: "BEQ",
+ BEXT: "BEXT",
+ BEXTI: "BEXTI",
+ BGE: "BGE",
+ BGEU: "BGEU",
+ BINV: "BINV",
+ BINVI: "BINVI",
+ BLT: "BLT",
+ BLTU: "BLTU",
+ BNE: "BNE",
+ BSET: "BSET",
+ BSETI: "BSETI",
+ CLZ: "CLZ",
+ CLZW: "CLZW",
+ CPOP: "CPOP",
+ CPOPW: "CPOPW",
+ CSRRC: "CSRRC",
+ CSRRCI: "CSRRCI",
+ CSRRS: "CSRRS",
+ CSRRSI: "CSRRSI",
+ CSRRW: "CSRRW",
+ CSRRWI: "CSRRWI",
+ CTZ: "CTZ",
+ CTZW: "CTZW",
+ C_ADD: "C.ADD",
+ C_ADDI: "C.ADDI",
+ C_ADDI16SP: "C.ADDI16SP",
+ C_ADDI4SPN: "C.ADDI4SPN",
+ C_ADDIW: "C.ADDIW",
+ C_ADDW: "C.ADDW",
+ C_AND: "C.AND",
+ C_ANDI: "C.ANDI",
+ C_BEQZ: "C.BEQZ",
+ C_BNEZ: "C.BNEZ",
+ C_EBREAK: "C.EBREAK",
+ C_FLD: "C.FLD",
+ C_FLDSP: "C.FLDSP",
+ C_FSD: "C.FSD",
+ C_FSDSP: "C.FSDSP",
+ C_J: "C.J",
+ C_JALR: "C.JALR",
+ C_JR: "C.JR",
+ C_LD: "C.LD",
+ C_LDSP: "C.LDSP",
+ C_LI: "C.LI",
+ C_LUI: "C.LUI",
+ C_LW: "C.LW",
+ C_LWSP: "C.LWSP",
+ C_MV: "C.MV",
+ C_NOP: "C.NOP",
+ C_OR: "C.OR",
+ C_SD: "C.SD",
+ C_SDSP: "C.SDSP",
+ C_SLLI: "C.SLLI",
+ C_SRAI: "C.SRAI",
+ C_SRLI: "C.SRLI",
+ C_SUB: "C.SUB",
+ C_SUBW: "C.SUBW",
+ C_SW: "C.SW",
+ C_SWSP: "C.SWSP",
+ C_UNIMP: "C.UNIMP",
+ C_XOR: "C.XOR",
+ DIV: "DIV",
+ DIVU: "DIVU",
+ DIVUW: "DIVUW",
+ DIVW: "DIVW",
+ EBREAK: "EBREAK",
+ ECALL: "ECALL",
+ FADD_D: "FADD.D",
+ FADD_H: "FADD.H",
+ FADD_Q: "FADD.Q",
+ FADD_S: "FADD.S",
+ FCLASS_D: "FCLASS.D",
+ FCLASS_H: "FCLASS.H",
+ FCLASS_Q: "FCLASS.Q",
+ FCLASS_S: "FCLASS.S",
+ FCVT_D_L: "FCVT.D.L",
+ FCVT_D_LU: "FCVT.D.LU",
+ FCVT_D_Q: "FCVT.D.Q",
+ FCVT_D_S: "FCVT.D.S",
+ FCVT_D_W: "FCVT.D.W",
+ FCVT_D_WU: "FCVT.D.WU",
+ FCVT_H_L: "FCVT.H.L",
+ FCVT_H_LU: "FCVT.H.LU",
+ FCVT_H_S: "FCVT.H.S",
+ FCVT_H_W: "FCVT.H.W",
+ FCVT_H_WU: "FCVT.H.WU",
+ FCVT_LU_D: "FCVT.LU.D",
+ FCVT_LU_H: "FCVT.LU.H",
+ FCVT_LU_Q: "FCVT.LU.Q",
+ FCVT_LU_S: "FCVT.LU.S",
+ FCVT_L_D: "FCVT.L.D",
+ FCVT_L_H: "FCVT.L.H",
+ FCVT_L_Q: "FCVT.L.Q",
+ FCVT_L_S: "FCVT.L.S",
+ FCVT_Q_D: "FCVT.Q.D",
+ FCVT_Q_L: "FCVT.Q.L",
+ FCVT_Q_LU: "FCVT.Q.LU",
+ FCVT_Q_S: "FCVT.Q.S",
+ FCVT_Q_W: "FCVT.Q.W",
+ FCVT_Q_WU: "FCVT.Q.WU",
+ FCVT_S_D: "FCVT.S.D",
+ FCVT_S_H: "FCVT.S.H",
+ FCVT_S_L: "FCVT.S.L",
+ FCVT_S_LU: "FCVT.S.LU",
+ FCVT_S_Q: "FCVT.S.Q",
+ FCVT_S_W: "FCVT.S.W",
+ FCVT_S_WU: "FCVT.S.WU",
+ FCVT_WU_D: "FCVT.WU.D",
+ FCVT_WU_H: "FCVT.WU.H",
+ FCVT_WU_Q: "FCVT.WU.Q",
+ FCVT_WU_S: "FCVT.WU.S",
+ FCVT_W_D: "FCVT.W.D",
+ FCVT_W_H: "FCVT.W.H",
+ FCVT_W_Q: "FCVT.W.Q",
+ FCVT_W_S: "FCVT.W.S",
+ FDIV_D: "FDIV.D",
+ FDIV_H: "FDIV.H",
+ FDIV_Q: "FDIV.Q",
+ FDIV_S: "FDIV.S",
+ FENCE: "FENCE",
+ FENCE_I: "FENCE.I",
+ FEQ_D: "FEQ.D",
+ FEQ_H: "FEQ.H",
+ FEQ_Q: "FEQ.Q",
+ FEQ_S: "FEQ.S",
+ FLD: "FLD",
+ FLE_D: "FLE.D",
+ FLE_H: "FLE.H",
+ FLE_Q: "FLE.Q",
+ FLE_S: "FLE.S",
+ FLH: "FLH",
+ FLQ: "FLQ",
+ FLT_D: "FLT.D",
+ FLT_H: "FLT.H",
+ FLT_Q: "FLT.Q",
+ FLT_S: "FLT.S",
+ FLW: "FLW",
+ FMADD_D: "FMADD.D",
+ FMADD_H: "FMADD.H",
+ FMADD_Q: "FMADD.Q",
+ FMADD_S: "FMADD.S",
+ FMAX_D: "FMAX.D",
+ FMAX_H: "FMAX.H",
+ FMAX_Q: "FMAX.Q",
+ FMAX_S: "FMAX.S",
+ FMIN_D: "FMIN.D",
+ FMIN_H: "FMIN.H",
+ FMIN_Q: "FMIN.Q",
+ FMIN_S: "FMIN.S",
+ FMSUB_D: "FMSUB.D",
+ FMSUB_H: "FMSUB.H",
+ FMSUB_Q: "FMSUB.Q",
+ FMSUB_S: "FMSUB.S",
+ FMUL_D: "FMUL.D",
+ FMUL_H: "FMUL.H",
+ FMUL_Q: "FMUL.Q",
+ FMUL_S: "FMUL.S",
+ FMV_D_X: "FMV.D.X",
+ FMV_H_X: "FMV.H.X",
+ FMV_W_X: "FMV.W.X",
+ FMV_X_D: "FMV.X.D",
+ FMV_X_H: "FMV.X.H",
+ FMV_X_W: "FMV.X.W",
+ FNMADD_D: "FNMADD.D",
+ FNMADD_H: "FNMADD.H",
+ FNMADD_Q: "FNMADD.Q",
+ FNMADD_S: "FNMADD.S",
+ FNMSUB_D: "FNMSUB.D",
+ FNMSUB_H: "FNMSUB.H",
+ FNMSUB_Q: "FNMSUB.Q",
+ FNMSUB_S: "FNMSUB.S",
+ FSD: "FSD",
+ FSGNJN_D: "FSGNJN.D",
+ FSGNJN_H: "FSGNJN.H",
+ FSGNJN_Q: "FSGNJN.Q",
+ FSGNJN_S: "FSGNJN.S",
+ FSGNJX_D: "FSGNJX.D",
+ FSGNJX_H: "FSGNJX.H",
+ FSGNJX_Q: "FSGNJX.Q",
+ FSGNJX_S: "FSGNJX.S",
+ FSGNJ_D: "FSGNJ.D",
+ FSGNJ_H: "FSGNJ.H",
+ FSGNJ_Q: "FSGNJ.Q",
+ FSGNJ_S: "FSGNJ.S",
+ FSH: "FSH",
+ FSQ: "FSQ",
+ FSQRT_D: "FSQRT.D",
+ FSQRT_H: "FSQRT.H",
+ FSQRT_Q: "FSQRT.Q",
+ FSQRT_S: "FSQRT.S",
+ FSUB_D: "FSUB.D",
+ FSUB_H: "FSUB.H",
+ FSUB_Q: "FSUB.Q",
+ FSUB_S: "FSUB.S",
+ FSW: "FSW",
+ JAL: "JAL",
+ JALR: "JALR",
+ LB: "LB",
+ LBU: "LBU",
+ LD: "LD",
+ LH: "LH",
+ LHU: "LHU",
+ LR_D: "LR.D",
+ LR_D_AQ: "LR.D.AQ",
+ LR_D_AQRL: "LR.D.AQRL",
+ LR_D_RL: "LR.D.RL",
+ LR_W: "LR.W",
+ LR_W_AQ: "LR.W.AQ",
+ LR_W_AQRL: "LR.W.AQRL",
+ LR_W_RL: "LR.W.RL",
+ LUI: "LUI",
+ LW: "LW",
+ LWU: "LWU",
+ MAX: "MAX",
+ MAXU: "MAXU",
+ MIN: "MIN",
+ MINU: "MINU",
+ MUL: "MUL",
+ MULH: "MULH",
+ MULHSU: "MULHSU",
+ MULHU: "MULHU",
+ MULW: "MULW",
+ OR: "OR",
+ ORC_B: "ORC.B",
+ ORI: "ORI",
+ ORN: "ORN",
+ REM: "REM",
+ REMU: "REMU",
+ REMUW: "REMUW",
+ REMW: "REMW",
+ REV8: "REV8",
+ ROL: "ROL",
+ ROLW: "ROLW",
+ ROR: "ROR",
+ RORI: "RORI",
+ RORIW: "RORIW",
+ RORW: "RORW",
+ SB: "SB",
+ SC_D: "SC.D",
+ SC_D_AQ: "SC.D.AQ",
+ SC_D_AQRL: "SC.D.AQRL",
+ SC_D_RL: "SC.D.RL",
+ SC_W: "SC.W",
+ SC_W_AQ: "SC.W.AQ",
+ SC_W_AQRL: "SC.W.AQRL",
+ SC_W_RL: "SC.W.RL",
+ SD: "SD",
+ SEXT_B: "SEXT.B",
+ SEXT_H: "SEXT.H",
+ SH: "SH",
+ SH1ADD: "SH1ADD",
+ SH1ADD_UW: "SH1ADD.UW",
+ SH2ADD: "SH2ADD",
+ SH2ADD_UW: "SH2ADD.UW",
+ SH3ADD: "SH3ADD",
+ SH3ADD_UW: "SH3ADD.UW",
+ SLL: "SLL",
+ SLLI: "SLLI",
+ SLLIW: "SLLIW",
+ SLLI_UW: "SLLI.UW",
+ SLLW: "SLLW",
+ SLT: "SLT",
+ SLTI: "SLTI",
+ SLTIU: "SLTIU",
+ SLTU: "SLTU",
+ SRA: "SRA",
+ SRAI: "SRAI",
+ SRAIW: "SRAIW",
+ SRAW: "SRAW",
+ SRL: "SRL",
+ SRLI: "SRLI",
+ SRLIW: "SRLIW",
+ SRLW: "SRLW",
+ SUB: "SUB",
+ SUBW: "SUBW",
+ SW: "SW",
+ XNOR: "XNOR",
+ XOR: "XOR",
+ XORI: "XORI",
+ ZEXT_H: "ZEXT.H",
+}
+
+var instFormats = [...]instFormat{
+ // ADD rd, rs1, rs2
+ {mask: 0xfe00707f, value: 0x00000033, op: ADD, args: argTypeList{arg_rd, arg_rs1, arg_rs2}},
+ // ADDI rd, rs1, imm12
+ {mask: 0x0000707f, value: 0x00000013, op: ADDI, args: argTypeList{arg_rd, arg_rs1, arg_imm12}},
+ // ADDIW rd, rs1, imm12
+ {mask: 0x0000707f, value: 0x0000001b, op: ADDIW, args: argTypeList{arg_rd, arg_rs1, arg_imm12}},
+ // ADDW rd, rs1, rs2
+ {mask: 0xfe00707f, value: 0x0000003b, op: ADDW, args: argTypeList{arg_rd, arg_rs1, arg_rs2}},
+ // ADD.UW rd, rs1, rs2
+ {mask: 0xfe00707f, value: 0x0800003b, op: ADD_UW, args: argTypeList{arg_rd, arg_rs1, arg_rs2}},
+ // AMOADD.D rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0x0000302f, op: AMOADD_D, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOADD.D.AQ rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0x0400302f, op: AMOADD_D_AQ, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOADD.D.AQRL rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0x0600302f, op: AMOADD_D_AQRL, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOADD.D.RL rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0x0200302f, op: AMOADD_D_RL, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOADD.W rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0x0000202f, op: AMOADD_W, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOADD.W.AQ rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0x0400202f, op: AMOADD_W_AQ, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOADD.W.AQRL rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0x0600202f, op: AMOADD_W_AQRL, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOADD.W.RL rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0x0200202f, op: AMOADD_W_RL, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOAND.D rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0x6000302f, op: AMOAND_D, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOAND.D.AQ rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0x6400302f, op: AMOAND_D_AQ, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOAND.D.AQRL rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0x6600302f, op: AMOAND_D_AQRL, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOAND.D.RL rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0x6200302f, op: AMOAND_D_RL, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOAND.W rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0x6000202f, op: AMOAND_W, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOAND.W.AQ rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0x6400202f, op: AMOAND_W_AQ, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOAND.W.AQRL rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0x6600202f, op: AMOAND_W_AQRL, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOAND.W.RL rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0x6200202f, op: AMOAND_W_RL, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOMAXU.D rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0xe000302f, op: AMOMAXU_D, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOMAXU.D.AQ rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0xe400302f, op: AMOMAXU_D_AQ, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOMAXU.D.AQRL rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0xe600302f, op: AMOMAXU_D_AQRL, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOMAXU.D.RL rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0xe200302f, op: AMOMAXU_D_RL, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOMAXU.W rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0xe000202f, op: AMOMAXU_W, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOMAXU.W.AQ rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0xe400202f, op: AMOMAXU_W_AQ, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOMAXU.W.AQRL rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0xe600202f, op: AMOMAXU_W_AQRL, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOMAXU.W.RL rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0xe200202f, op: AMOMAXU_W_RL, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOMAX.D rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0xa000302f, op: AMOMAX_D, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOMAX.D.AQ rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0xa400302f, op: AMOMAX_D_AQ, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOMAX.D.AQRL rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0xa600302f, op: AMOMAX_D_AQRL, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOMAX.D.RL rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0xa200302f, op: AMOMAX_D_RL, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOMAX.W rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0xa000202f, op: AMOMAX_W, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOMAX.W.AQ rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0xa400202f, op: AMOMAX_W_AQ, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOMAX.W.AQRL rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0xa600202f, op: AMOMAX_W_AQRL, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOMAX.W.RL rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0xa200202f, op: AMOMAX_W_RL, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOMINU.D rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0xc000302f, op: AMOMINU_D, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOMINU.D.AQ rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0xc400302f, op: AMOMINU_D_AQ, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOMINU.D.AQRL rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0xc600302f, op: AMOMINU_D_AQRL, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOMINU.D.RL rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0xc200302f, op: AMOMINU_D_RL, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOMINU.W rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0xc000202f, op: AMOMINU_W, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOMINU.W.AQ rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0xc400202f, op: AMOMINU_W_AQ, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOMINU.W.AQRL rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0xc600202f, op: AMOMINU_W_AQRL, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOMINU.W.RL rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0xc200202f, op: AMOMINU_W_RL, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOMIN.D rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0x8000302f, op: AMOMIN_D, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOMIN.D.AQ rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0x8400302f, op: AMOMIN_D_AQ, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOMIN.D.AQRL rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0x8600302f, op: AMOMIN_D_AQRL, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOMIN.D.RL rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0x8200302f, op: AMOMIN_D_RL, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOMIN.W rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0x8000202f, op: AMOMIN_W, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOMIN.W.AQ rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0x8400202f, op: AMOMIN_W_AQ, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOMIN.W.AQRL rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0x8600202f, op: AMOMIN_W_AQRL, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOMIN.W.RL rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0x8200202f, op: AMOMIN_W_RL, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOOR.D rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0x4000302f, op: AMOOR_D, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOOR.D.AQ rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0x4400302f, op: AMOOR_D_AQ, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOOR.D.AQRL rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0x4600302f, op: AMOOR_D_AQRL, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOOR.D.RL rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0x4200302f, op: AMOOR_D_RL, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOOR.W rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0x4000202f, op: AMOOR_W, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOOR.W.AQ rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0x4400202f, op: AMOOR_W_AQ, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOOR.W.AQRL rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0x4600202f, op: AMOOR_W_AQRL, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOOR.W.RL rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0x4200202f, op: AMOOR_W_RL, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOSWAP.D rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0x0800302f, op: AMOSWAP_D, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOSWAP.D.AQ rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0x0c00302f, op: AMOSWAP_D_AQ, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOSWAP.D.AQRL rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0x0e00302f, op: AMOSWAP_D_AQRL, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOSWAP.D.RL rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0x0a00302f, op: AMOSWAP_D_RL, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOSWAP.W rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0x0800202f, op: AMOSWAP_W, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOSWAP.W.AQ rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0x0c00202f, op: AMOSWAP_W_AQ, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOSWAP.W.AQRL rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0x0e00202f, op: AMOSWAP_W_AQRL, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOSWAP.W.RL rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0x0a00202f, op: AMOSWAP_W_RL, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOXOR.D rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0x2000302f, op: AMOXOR_D, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOXOR.D.AQ rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0x2400302f, op: AMOXOR_D_AQ, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOXOR.D.AQRL rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0x2600302f, op: AMOXOR_D_AQRL, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOXOR.D.RL rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0x2200302f, op: AMOXOR_D_RL, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOXOR.W rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0x2000202f, op: AMOXOR_W, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOXOR.W.AQ rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0x2400202f, op: AMOXOR_W_AQ, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOXOR.W.AQRL rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0x2600202f, op: AMOXOR_W_AQRL, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AMOXOR.W.RL rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0x2200202f, op: AMOXOR_W_RL, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // AND rd, rs1, rs2
+ {mask: 0xfe00707f, value: 0x00007033, op: AND, args: argTypeList{arg_rd, arg_rs1, arg_rs2}},
+ // ANDI rd, rs1, imm12
+ {mask: 0x0000707f, value: 0x00007013, op: ANDI, args: argTypeList{arg_rd, arg_rs1, arg_imm12}},
+ // ANDN rd, rs1, rs2
+ {mask: 0xfe00707f, value: 0x40007033, op: ANDN, args: argTypeList{arg_rd, arg_rs1, arg_rs2}},
+ // AUIPC rd, imm20
+ {mask: 0x0000007f, value: 0x00000017, op: AUIPC, args: argTypeList{arg_rd, arg_imm20}},
+ // BCLR rd, rs1, rs2
+ {mask: 0xfe00707f, value: 0x48001033, op: BCLR, args: argTypeList{arg_rd, arg_rs1, arg_rs2}},
+ // BCLRI rd, rs1, shamt6
+ {mask: 0xfc00707f, value: 0x48001013, op: BCLRI, args: argTypeList{arg_rd, arg_rs1, arg_shamt6}},
+ // BEQ rs1, rs2, bimm12
+ {mask: 0x0000707f, value: 0x00000063, op: BEQ, args: argTypeList{arg_rs1, arg_rs2, arg_bimm12}},
+ // BEXT rd, rs1, rs2
+ {mask: 0xfe00707f, value: 0x48005033, op: BEXT, args: argTypeList{arg_rd, arg_rs1, arg_rs2}},
+ // BEXTI rd, rs1, shamt6
+ {mask: 0xfc00707f, value: 0x48005013, op: BEXTI, args: argTypeList{arg_rd, arg_rs1, arg_shamt6}},
+ // BGE rs1, rs2, bimm12
+ {mask: 0x0000707f, value: 0x00005063, op: BGE, args: argTypeList{arg_rs1, arg_rs2, arg_bimm12}},
+ // BGEU rs1, rs2, bimm12
+ {mask: 0x0000707f, value: 0x00007063, op: BGEU, args: argTypeList{arg_rs1, arg_rs2, arg_bimm12}},
+ // BINV rd, rs1, rs2
+ {mask: 0xfe00707f, value: 0x68001033, op: BINV, args: argTypeList{arg_rd, arg_rs1, arg_rs2}},
+ // BINVI rd, rs1, shamt6
+ {mask: 0xfc00707f, value: 0x68001013, op: BINVI, args: argTypeList{arg_rd, arg_rs1, arg_shamt6}},
+ // BLT rs1, rs2, bimm12
+ {mask: 0x0000707f, value: 0x00004063, op: BLT, args: argTypeList{arg_rs1, arg_rs2, arg_bimm12}},
+ // BLTU rs1, rs2, bimm12
+ {mask: 0x0000707f, value: 0x00006063, op: BLTU, args: argTypeList{arg_rs1, arg_rs2, arg_bimm12}},
+ // BNE rs1, rs2, bimm12
+ {mask: 0x0000707f, value: 0x00001063, op: BNE, args: argTypeList{arg_rs1, arg_rs2, arg_bimm12}},
+ // BSET rd, rs1, rs2
+ {mask: 0xfe00707f, value: 0x28001033, op: BSET, args: argTypeList{arg_rd, arg_rs1, arg_rs2}},
+ // BSETI rd, rs1, shamt6
+ {mask: 0xfc00707f, value: 0x28001013, op: BSETI, args: argTypeList{arg_rd, arg_rs1, arg_shamt6}},
+ // CLZ rd, rs1
+ {mask: 0xfff0707f, value: 0x60001013, op: CLZ, args: argTypeList{arg_rd, arg_rs1}},
+ // CLZW rd, rs1
+ {mask: 0xfff0707f, value: 0x6000101b, op: CLZW, args: argTypeList{arg_rd, arg_rs1}},
+ // CPOP rd, rs1
+ {mask: 0xfff0707f, value: 0x60201013, op: CPOP, args: argTypeList{arg_rd, arg_rs1}},
+ // CPOPW rd, rs1
+ {mask: 0xfff0707f, value: 0x6020101b, op: CPOPW, args: argTypeList{arg_rd, arg_rs1}},
+ // CSRRC rd, csr, rs1
+ {mask: 0x0000707f, value: 0x00003073, op: CSRRC, args: argTypeList{arg_rd, arg_csr, arg_rs1}},
+ // CSRRCI rd, csr, zimm
+ {mask: 0x0000707f, value: 0x00007073, op: CSRRCI, args: argTypeList{arg_rd, arg_csr, arg_zimm}},
+ // CSRRS rd, csr, rs1
+ {mask: 0x0000707f, value: 0x00002073, op: CSRRS, args: argTypeList{arg_rd, arg_csr, arg_rs1}},
+ // CSRRSI rd, csr, zimm
+ {mask: 0x0000707f, value: 0x00006073, op: CSRRSI, args: argTypeList{arg_rd, arg_csr, arg_zimm}},
+ // CSRRW rd, csr, rs1
+ {mask: 0x0000707f, value: 0x00001073, op: CSRRW, args: argTypeList{arg_rd, arg_csr, arg_rs1}},
+ // CSRRWI rd, csr, zimm
+ {mask: 0x0000707f, value: 0x00005073, op: CSRRWI, args: argTypeList{arg_rd, arg_csr, arg_zimm}},
+ // CTZ rd, rs1
+ {mask: 0xfff0707f, value: 0x60101013, op: CTZ, args: argTypeList{arg_rd, arg_rs1}},
+ // CTZW rd, rs1
+ {mask: 0xfff0707f, value: 0x6010101b, op: CTZW, args: argTypeList{arg_rd, arg_rs1}},
+ // C.ADD rd_rs1_n0, c_rs2_n0
+ {mask: 0x0000f003, value: 0x00009002, op: C_ADD, args: argTypeList{arg_rd_rs1_n0, arg_c_rs2_n0}},
+ // C.ADDI rd_rs1_n0, c_nzimm6
+ {mask: 0x0000e003, value: 0x00000001, op: C_ADDI, args: argTypeList{arg_rd_rs1_n0, arg_c_nzimm6}},
+ // C.ADDI16SP c_nzimm10
+ {mask: 0x0000ef83, value: 0x00006101, op: C_ADDI16SP, args: argTypeList{arg_c_nzimm10}},
+ // C.ADDI4SPN rd_p, c_nzuimm10
+ {mask: 0x0000e003, value: 0x00000000, op: C_ADDI4SPN, args: argTypeList{arg_rd_p, arg_c_nzuimm10}},
+ // C.ADDIW rd_rs1_n0, c_imm6
+ {mask: 0x0000e003, value: 0x00002001, op: C_ADDIW, args: argTypeList{arg_rd_rs1_n0, arg_c_imm6}},
+ // C.ADDW rd_rs1_p, rs2_p
+ {mask: 0x0000fc63, value: 0x00009c21, op: C_ADDW, args: argTypeList{arg_rd_rs1_p, arg_rs2_p}},
+ // C.AND rd_rs1_p, rs2_p
+ {mask: 0x0000fc63, value: 0x00008c61, op: C_AND, args: argTypeList{arg_rd_rs1_p, arg_rs2_p}},
+ // C.ANDI rd_rs1_p, c_imm6
+ {mask: 0x0000ec03, value: 0x00008801, op: C_ANDI, args: argTypeList{arg_rd_rs1_p, arg_c_imm6}},
+ // C.BEQZ rs1_p, c_bimm9
+ {mask: 0x0000e003, value: 0x0000c001, op: C_BEQZ, args: argTypeList{arg_rs1_p, arg_c_bimm9}},
+ // C.BNEZ rs1_p, c_bimm9
+ {mask: 0x0000e003, value: 0x0000e001, op: C_BNEZ, args: argTypeList{arg_rs1_p, arg_c_bimm9}},
+ // C.EBREAK
+ {mask: 0x0000ffff, value: 0x00009002, op: C_EBREAK, args: argTypeList{}},
+ // C.FLD fd_p, rs1_p, c_uimm8
+ {mask: 0x0000e003, value: 0x00002000, op: C_FLD, args: argTypeList{arg_fd_p, arg_rs1_p, arg_c_uimm8}},
+ // C.FLDSP fd, c_uimm9sp
+ {mask: 0x0000e003, value: 0x00002002, op: C_FLDSP, args: argTypeList{arg_fd, arg_c_uimm9sp}},
+ // C.FSD rs1_p, fs2_p, c_uimm8
+ {mask: 0x0000e003, value: 0x0000a000, op: C_FSD, args: argTypeList{arg_rs1_p, arg_fs2_p, arg_c_uimm8}},
+ // C.FSDSP c_fs2, c_uimm9sp_s
+ {mask: 0x0000e003, value: 0x0000a002, op: C_FSDSP, args: argTypeList{arg_c_fs2, arg_c_uimm9sp_s}},
+ // C.J c_imm12
+ {mask: 0x0000e003, value: 0x0000a001, op: C_J, args: argTypeList{arg_c_imm12}},
+ // C.JALR c_rs1_n0
+ {mask: 0x0000f07f, value: 0x00009002, op: C_JALR, args: argTypeList{arg_c_rs1_n0}},
+ // C.JR rs1_n0
+ {mask: 0x0000f07f, value: 0x00008002, op: C_JR, args: argTypeList{arg_rs1_n0}},
+ // C.LD rd_p, rs1_p, c_uimm8
+ {mask: 0x0000e003, value: 0x00006000, op: C_LD, args: argTypeList{arg_rd_p, arg_rs1_p, arg_c_uimm8}},
+ // C.LDSP rd_n0, c_uimm9sp
+ {mask: 0x0000e003, value: 0x00006002, op: C_LDSP, args: argTypeList{arg_rd_n0, arg_c_uimm9sp}},
+ // C.LI rd_n0, c_imm6
+ {mask: 0x0000e003, value: 0x00004001, op: C_LI, args: argTypeList{arg_rd_n0, arg_c_imm6}},
+ // C.LUI rd_n2, c_nzimm18
+ {mask: 0x0000e003, value: 0x00006001, op: C_LUI, args: argTypeList{arg_rd_n2, arg_c_nzimm18}},
+ // C.LW rd_p, rs1_p, c_uimm7
+ {mask: 0x0000e003, value: 0x00004000, op: C_LW, args: argTypeList{arg_rd_p, arg_rs1_p, arg_c_uimm7}},
+ // C.LWSP rd_n0, c_uimm8sp
+ {mask: 0x0000e003, value: 0x00004002, op: C_LWSP, args: argTypeList{arg_rd_n0, arg_c_uimm8sp}},
+ // C.MV rd_n0, c_rs2_n0
+ {mask: 0x0000f003, value: 0x00008002, op: C_MV, args: argTypeList{arg_rd_n0, arg_c_rs2_n0}},
+ // C.NOP c_nzimm6
+ {mask: 0x0000ef83, value: 0x00000001, op: C_NOP, args: argTypeList{arg_c_nzimm6}},
+ // C.OR rd_rs1_p, rs2_p
+ {mask: 0x0000fc63, value: 0x00008c41, op: C_OR, args: argTypeList{arg_rd_rs1_p, arg_rs2_p}},
+ // C.SD rs1_p, rs2_p, c_uimm8
+ {mask: 0x0000e003, value: 0x0000e000, op: C_SD, args: argTypeList{arg_rs1_p, arg_rs2_p, arg_c_uimm8}},
+ // C.SDSP c_rs2, c_uimm9sp_s
+ {mask: 0x0000e003, value: 0x0000e002, op: C_SDSP, args: argTypeList{arg_c_rs2, arg_c_uimm9sp_s}},
+ // C.SLLI rd_rs1_n0, c_nzuimm6
+ {mask: 0x0000e003, value: 0x00000002, op: C_SLLI, args: argTypeList{arg_rd_rs1_n0, arg_c_nzuimm6}},
+ // C.SRAI rd_rs1_p, c_nzuimm6
+ {mask: 0x0000ec03, value: 0x00008401, op: C_SRAI, args: argTypeList{arg_rd_rs1_p, arg_c_nzuimm6}},
+ // C.SRLI rd_rs1_p, c_nzuimm6
+ {mask: 0x0000ec03, value: 0x00008001, op: C_SRLI, args: argTypeList{arg_rd_rs1_p, arg_c_nzuimm6}},
+ // C.SUB rd_rs1_p, rs2_p
+ {mask: 0x0000fc63, value: 0x00008c01, op: C_SUB, args: argTypeList{arg_rd_rs1_p, arg_rs2_p}},
+ // C.SUBW rd_rs1_p, rs2_p
+ {mask: 0x0000fc63, value: 0x00009c01, op: C_SUBW, args: argTypeList{arg_rd_rs1_p, arg_rs2_p}},
+ // C.SW rs1_p, rs2_p, c_uimm7
+ {mask: 0x0000e003, value: 0x0000c000, op: C_SW, args: argTypeList{arg_rs1_p, arg_rs2_p, arg_c_uimm7}},
+ // C.SWSP c_rs2, c_uimm8sp_s
+ {mask: 0x0000e003, value: 0x0000c002, op: C_SWSP, args: argTypeList{arg_c_rs2, arg_c_uimm8sp_s}},
+ // C.UNIMP
+ {mask: 0x0000ffff, value: 0x00000000, op: C_UNIMP, args: argTypeList{}},
+ // C.XOR rd_rs1_p, rs2_p
+ {mask: 0x0000fc63, value: 0x00008c21, op: C_XOR, args: argTypeList{arg_rd_rs1_p, arg_rs2_p}},
+ // DIV rd, rs1, rs2
+ {mask: 0xfe00707f, value: 0x02004033, op: DIV, args: argTypeList{arg_rd, arg_rs1, arg_rs2}},
+ // DIVU rd, rs1, rs2
+ {mask: 0xfe00707f, value: 0x02005033, op: DIVU, args: argTypeList{arg_rd, arg_rs1, arg_rs2}},
+ // DIVUW rd, rs1, rs2
+ {mask: 0xfe00707f, value: 0x0200503b, op: DIVUW, args: argTypeList{arg_rd, arg_rs1, arg_rs2}},
+ // DIVW rd, rs1, rs2
+ {mask: 0xfe00707f, value: 0x0200403b, op: DIVW, args: argTypeList{arg_rd, arg_rs1, arg_rs2}},
+ // EBREAK
+ {mask: 0xffffffff, value: 0x00100073, op: EBREAK, args: argTypeList{}},
+ // ECALL
+ {mask: 0xffffffff, value: 0x00000073, op: ECALL, args: argTypeList{}},
+ // FADD.D fd, fs1, fs2
+ {mask: 0xfe00007f, value: 0x02000053, op: FADD_D, args: argTypeList{arg_fd, arg_fs1, arg_fs2}},
+ // FADD.H fd, fs1, fs2
+ {mask: 0xfe00007f, value: 0x04000053, op: FADD_H, args: argTypeList{arg_fd, arg_fs1, arg_fs2}},
+ // FADD.Q fd, fs1, fs2
+ {mask: 0xfe00007f, value: 0x06000053, op: FADD_Q, args: argTypeList{arg_fd, arg_fs1, arg_fs2}},
+ // FADD.S fd, fs1, fs2
+ {mask: 0xfe00007f, value: 0x00000053, op: FADD_S, args: argTypeList{arg_fd, arg_fs1, arg_fs2}},
+ // FCLASS.D rd, fs1
+ {mask: 0xfff0707f, value: 0xe2001053, op: FCLASS_D, args: argTypeList{arg_rd, arg_fs1}},
+ // FCLASS.H rd, fs1
+ {mask: 0xfff0707f, value: 0xe4001053, op: FCLASS_H, args: argTypeList{arg_rd, arg_fs1}},
+ // FCLASS.Q rd, fs1
+ {mask: 0xfff0707f, value: 0xe6001053, op: FCLASS_Q, args: argTypeList{arg_rd, arg_fs1}},
+ // FCLASS.S rd, fs1
+ {mask: 0xfff0707f, value: 0xe0001053, op: FCLASS_S, args: argTypeList{arg_rd, arg_fs1}},
+ // FCVT.D.L fd, rs1
+ {mask: 0xfff0007f, value: 0xd2200053, op: FCVT_D_L, args: argTypeList{arg_fd, arg_rs1}},
+ // FCVT.D.LU fd, rs1
+ {mask: 0xfff0007f, value: 0xd2300053, op: FCVT_D_LU, args: argTypeList{arg_fd, arg_rs1}},
+ // FCVT.D.Q fd, fs1
+ {mask: 0xfff0007f, value: 0x42300053, op: FCVT_D_Q, args: argTypeList{arg_fd, arg_fs1}},
+ // FCVT.D.S fd, fs1
+ {mask: 0xfff0007f, value: 0x42000053, op: FCVT_D_S, args: argTypeList{arg_fd, arg_fs1}},
+ // FCVT.D.W fd, rs1
+ {mask: 0xfff0007f, value: 0xd2000053, op: FCVT_D_W, args: argTypeList{arg_fd, arg_rs1}},
+ // FCVT.D.WU fd, rs1
+ {mask: 0xfff0007f, value: 0xd2100053, op: FCVT_D_WU, args: argTypeList{arg_fd, arg_rs1}},
+ // FCVT.H.L fd, rs1
+ {mask: 0xfff0007f, value: 0xd4200053, op: FCVT_H_L, args: argTypeList{arg_fd, arg_rs1}},
+ // FCVT.H.LU fd, rs1
+ {mask: 0xfff0007f, value: 0xd4300053, op: FCVT_H_LU, args: argTypeList{arg_fd, arg_rs1}},
+ // FCVT.H.S fd, fs1
+ {mask: 0xfff0007f, value: 0x44000053, op: FCVT_H_S, args: argTypeList{arg_fd, arg_fs1}},
+ // FCVT.H.W fd, rs1
+ {mask: 0xfff0007f, value: 0xd4000053, op: FCVT_H_W, args: argTypeList{arg_fd, arg_rs1}},
+ // FCVT.H.WU fd, rs1
+ {mask: 0xfff0007f, value: 0xd4100053, op: FCVT_H_WU, args: argTypeList{arg_fd, arg_rs1}},
+ // FCVT.LU.D rd, fs1
+ {mask: 0xfff0007f, value: 0xc2300053, op: FCVT_LU_D, args: argTypeList{arg_rd, arg_fs1}},
+ // FCVT.LU.H rd, fs1
+ {mask: 0xfff0007f, value: 0xc4300053, op: FCVT_LU_H, args: argTypeList{arg_rd, arg_fs1}},
+ // FCVT.LU.Q rd, fs1
+ {mask: 0xfff0007f, value: 0xc6300053, op: FCVT_LU_Q, args: argTypeList{arg_rd, arg_fs1}},
+ // FCVT.LU.S rd, fs1
+ {mask: 0xfff0007f, value: 0xc0300053, op: FCVT_LU_S, args: argTypeList{arg_rd, arg_fs1}},
+ // FCVT.L.D rd, fs1
+ {mask: 0xfff0007f, value: 0xc2200053, op: FCVT_L_D, args: argTypeList{arg_rd, arg_fs1}},
+ // FCVT.L.H rd, fs1
+ {mask: 0xfff0007f, value: 0xc4200053, op: FCVT_L_H, args: argTypeList{arg_rd, arg_fs1}},
+ // FCVT.L.Q rd, fs1
+ {mask: 0xfff0007f, value: 0xc6200053, op: FCVT_L_Q, args: argTypeList{arg_rd, arg_fs1}},
+ // FCVT.L.S rd, fs1
+ {mask: 0xfff0007f, value: 0xc0200053, op: FCVT_L_S, args: argTypeList{arg_rd, arg_fs1}},
+ // FCVT.Q.D fd, fs1
+ {mask: 0xfff0007f, value: 0x46100053, op: FCVT_Q_D, args: argTypeList{arg_fd, arg_fs1}},
+ // FCVT.Q.L fd, rs1
+ {mask: 0xfff0007f, value: 0xd6200053, op: FCVT_Q_L, args: argTypeList{arg_fd, arg_rs1}},
+ // FCVT.Q.LU fd, rs1
+ {mask: 0xfff0007f, value: 0xd6300053, op: FCVT_Q_LU, args: argTypeList{arg_fd, arg_rs1}},
+ // FCVT.Q.S fd, fs1
+ {mask: 0xfff0007f, value: 0x46000053, op: FCVT_Q_S, args: argTypeList{arg_fd, arg_fs1}},
+ // FCVT.Q.W fd, rs1
+ {mask: 0xfff0007f, value: 0xd6000053, op: FCVT_Q_W, args: argTypeList{arg_fd, arg_rs1}},
+ // FCVT.Q.WU fd, rs1
+ {mask: 0xfff0007f, value: 0xd6100053, op: FCVT_Q_WU, args: argTypeList{arg_fd, arg_rs1}},
+ // FCVT.S.D fd, fs1
+ {mask: 0xfff0007f, value: 0x40100053, op: FCVT_S_D, args: argTypeList{arg_fd, arg_fs1}},
+ // FCVT.S.H fd, fs1
+ {mask: 0xfff0007f, value: 0x40200053, op: FCVT_S_H, args: argTypeList{arg_fd, arg_fs1}},
+ // FCVT.S.L fd, rs1
+ {mask: 0xfff0007f, value: 0xd0200053, op: FCVT_S_L, args: argTypeList{arg_fd, arg_rs1}},
+ // FCVT.S.LU fd, rs1
+ {mask: 0xfff0007f, value: 0xd0300053, op: FCVT_S_LU, args: argTypeList{arg_fd, arg_rs1}},
+ // FCVT.S.Q fd, fs1
+ {mask: 0xfff0007f, value: 0x40300053, op: FCVT_S_Q, args: argTypeList{arg_fd, arg_fs1}},
+ // FCVT.S.W fd, rs1
+ {mask: 0xfff0007f, value: 0xd0000053, op: FCVT_S_W, args: argTypeList{arg_fd, arg_rs1}},
+ // FCVT.S.WU fd, rs1
+ {mask: 0xfff0007f, value: 0xd0100053, op: FCVT_S_WU, args: argTypeList{arg_fd, arg_rs1}},
+ // FCVT.WU.D rd, fs1
+ {mask: 0xfff0007f, value: 0xc2100053, op: FCVT_WU_D, args: argTypeList{arg_rd, arg_fs1}},
+ // FCVT.WU.H rd, fs1
+ {mask: 0xfff0007f, value: 0xc4100053, op: FCVT_WU_H, args: argTypeList{arg_rd, arg_fs1}},
+ // FCVT.WU.Q rd, fs1
+ {mask: 0xfff0007f, value: 0xc6100053, op: FCVT_WU_Q, args: argTypeList{arg_rd, arg_fs1}},
+ // FCVT.WU.S rd, fs1
+ {mask: 0xfff0007f, value: 0xc0100053, op: FCVT_WU_S, args: argTypeList{arg_rd, arg_fs1}},
+ // FCVT.W.D rd, fs1
+ {mask: 0xfff0007f, value: 0xc2000053, op: FCVT_W_D, args: argTypeList{arg_rd, arg_fs1}},
+ // FCVT.W.H rd, fs1
+ {mask: 0xfff0007f, value: 0xc4000053, op: FCVT_W_H, args: argTypeList{arg_rd, arg_fs1}},
+ // FCVT.W.Q rd, fs1
+ {mask: 0xfff0007f, value: 0xc6000053, op: FCVT_W_Q, args: argTypeList{arg_rd, arg_fs1}},
+ // FCVT.W.S rd, fs1
+ {mask: 0xfff0007f, value: 0xc0000053, op: FCVT_W_S, args: argTypeList{arg_rd, arg_fs1}},
+ // FDIV.D fd, fs1, fs2
+ {mask: 0xfe00007f, value: 0x1a000053, op: FDIV_D, args: argTypeList{arg_fd, arg_fs1, arg_fs2}},
+ // FDIV.H fd, fs1, fs2
+ {mask: 0xfe00007f, value: 0x1c000053, op: FDIV_H, args: argTypeList{arg_fd, arg_fs1, arg_fs2}},
+ // FDIV.Q fd, fs1, fs2
+ {mask: 0xfe00007f, value: 0x1e000053, op: FDIV_Q, args: argTypeList{arg_fd, arg_fs1, arg_fs2}},
+ // FDIV.S fd, fs1, fs2
+ {mask: 0xfe00007f, value: 0x18000053, op: FDIV_S, args: argTypeList{arg_fd, arg_fs1, arg_fs2}},
+ // FENCE pred, succ
+ {mask: 0x0000707f, value: 0x0000000f, op: FENCE, args: argTypeList{arg_pred, arg_succ}},
+ // FENCE.I
+ {mask: 0x0000707f, value: 0x0000100f, op: FENCE_I, args: argTypeList{}},
+ // FEQ.D rd, fs1, fs2
+ {mask: 0xfe00707f, value: 0xa2002053, op: FEQ_D, args: argTypeList{arg_rd, arg_fs1, arg_fs2}},
+ // FEQ.H rd, fs1, fs2
+ {mask: 0xfe00707f, value: 0xa4002053, op: FEQ_H, args: argTypeList{arg_rd, arg_fs1, arg_fs2}},
+ // FEQ.Q rd, fs1, fs2
+ {mask: 0xfe00707f, value: 0xa6002053, op: FEQ_Q, args: argTypeList{arg_rd, arg_fs1, arg_fs2}},
+ // FEQ.S rd, fs1, fs2
+ {mask: 0xfe00707f, value: 0xa0002053, op: FEQ_S, args: argTypeList{arg_rd, arg_fs1, arg_fs2}},
+ // FLD fd, rs1_mem
+ {mask: 0x0000707f, value: 0x00003007, op: FLD, args: argTypeList{arg_fd, arg_rs1_mem}},
+ // FLE.D rd, fs1, fs2
+ {mask: 0xfe00707f, value: 0xa2000053, op: FLE_D, args: argTypeList{arg_rd, arg_fs1, arg_fs2}},
+ // FLE.H rd, fs1, fs2
+ {mask: 0xfe00707f, value: 0xa4000053, op: FLE_H, args: argTypeList{arg_rd, arg_fs1, arg_fs2}},
+ // FLE.Q rd, fs1, fs2
+ {mask: 0xfe00707f, value: 0xa6000053, op: FLE_Q, args: argTypeList{arg_rd, arg_fs1, arg_fs2}},
+ // FLE.S rd, fs1, fs2
+ {mask: 0xfe00707f, value: 0xa0000053, op: FLE_S, args: argTypeList{arg_rd, arg_fs1, arg_fs2}},
+ // FLH fd, rs1_mem
+ {mask: 0x0000707f, value: 0x00001007, op: FLH, args: argTypeList{arg_fd, arg_rs1_mem}},
+ // FLQ fd, rs1_mem
+ {mask: 0x0000707f, value: 0x00004007, op: FLQ, args: argTypeList{arg_fd, arg_rs1_mem}},
+ // FLT.D rd, fs1, fs2
+ {mask: 0xfe00707f, value: 0xa2001053, op: FLT_D, args: argTypeList{arg_rd, arg_fs1, arg_fs2}},
+ // FLT.H rd, fs1, fs2
+ {mask: 0xfe00707f, value: 0xa4001053, op: FLT_H, args: argTypeList{arg_rd, arg_fs1, arg_fs2}},
+ // FLT.Q rd, fs1, fs2
+ {mask: 0xfe00707f, value: 0xa6001053, op: FLT_Q, args: argTypeList{arg_rd, arg_fs1, arg_fs2}},
+ // FLT.S rd, fs1, fs2
+ {mask: 0xfe00707f, value: 0xa0001053, op: FLT_S, args: argTypeList{arg_rd, arg_fs1, arg_fs2}},
+ // FLW fd, rs1_mem
+ {mask: 0x0000707f, value: 0x00002007, op: FLW, args: argTypeList{arg_fd, arg_rs1_mem}},
+ // FMADD.D fd, fs1, fs2, fs3
+ {mask: 0x0600007f, value: 0x02000043, op: FMADD_D, args: argTypeList{arg_fd, arg_fs1, arg_fs2, arg_fs3}},
+ // FMADD.H fd, fs1, fs2, fs3
+ {mask: 0x0600007f, value: 0x04000043, op: FMADD_H, args: argTypeList{arg_fd, arg_fs1, arg_fs2, arg_fs3}},
+ // FMADD.Q fd, fs1, fs2, fs3
+ {mask: 0x0600007f, value: 0x06000043, op: FMADD_Q, args: argTypeList{arg_fd, arg_fs1, arg_fs2, arg_fs3}},
+ // FMADD.S fd, fs1, fs2, fs3
+ {mask: 0x0600007f, value: 0x00000043, op: FMADD_S, args: argTypeList{arg_fd, arg_fs1, arg_fs2, arg_fs3}},
+ // FMAX.D fd, fs1, fs2
+ {mask: 0xfe00707f, value: 0x2a001053, op: FMAX_D, args: argTypeList{arg_fd, arg_fs1, arg_fs2}},
+ // FMAX.H fd, fs1, fs2
+ {mask: 0xfe00707f, value: 0x2c001053, op: FMAX_H, args: argTypeList{arg_fd, arg_fs1, arg_fs2}},
+ // FMAX.Q fd, fs1, fs2
+ {mask: 0xfe00707f, value: 0x2e001053, op: FMAX_Q, args: argTypeList{arg_fd, arg_fs1, arg_fs2}},
+ // FMAX.S fd, fs1, fs2
+ {mask: 0xfe00707f, value: 0x28001053, op: FMAX_S, args: argTypeList{arg_fd, arg_fs1, arg_fs2}},
+ // FMIN.D fd, fs1, fs2
+ {mask: 0xfe00707f, value: 0x2a000053, op: FMIN_D, args: argTypeList{arg_fd, arg_fs1, arg_fs2}},
+ // FMIN.H fd, fs1, fs2
+ {mask: 0xfe00707f, value: 0x2c000053, op: FMIN_H, args: argTypeList{arg_fd, arg_fs1, arg_fs2}},
+ // FMIN.Q fd, fs1, fs2
+ {mask: 0xfe00707f, value: 0x2e000053, op: FMIN_Q, args: argTypeList{arg_fd, arg_fs1, arg_fs2}},
+ // FMIN.S fd, fs1, fs2
+ {mask: 0xfe00707f, value: 0x28000053, op: FMIN_S, args: argTypeList{arg_fd, arg_fs1, arg_fs2}},
+ // FMSUB.D fd, fs1, fs2, fs3
+ {mask: 0x0600007f, value: 0x02000047, op: FMSUB_D, args: argTypeList{arg_fd, arg_fs1, arg_fs2, arg_fs3}},
+ // FMSUB.H fd, fs1, fs2, fs3
+ {mask: 0x0600007f, value: 0x04000047, op: FMSUB_H, args: argTypeList{arg_fd, arg_fs1, arg_fs2, arg_fs3}},
+ // FMSUB.Q fd, fs1, fs2, fs3
+ {mask: 0x0600007f, value: 0x06000047, op: FMSUB_Q, args: argTypeList{arg_fd, arg_fs1, arg_fs2, arg_fs3}},
+ // FMSUB.S fd, fs1, fs2, fs3
+ {mask: 0x0600007f, value: 0x00000047, op: FMSUB_S, args: argTypeList{arg_fd, arg_fs1, arg_fs2, arg_fs3}},
+ // FMUL.D fd, fs1, fs2
+ {mask: 0xfe00007f, value: 0x12000053, op: FMUL_D, args: argTypeList{arg_fd, arg_fs1, arg_fs2}},
+ // FMUL.H fd, fs1, fs2
+ {mask: 0xfe00007f, value: 0x14000053, op: FMUL_H, args: argTypeList{arg_fd, arg_fs1, arg_fs2}},
+ // FMUL.Q fd, fs1, fs2
+ {mask: 0xfe00007f, value: 0x16000053, op: FMUL_Q, args: argTypeList{arg_fd, arg_fs1, arg_fs2}},
+ // FMUL.S fd, fs1, fs2
+ {mask: 0xfe00007f, value: 0x10000053, op: FMUL_S, args: argTypeList{arg_fd, arg_fs1, arg_fs2}},
+ // FMV.D.X fd, rs1
+ {mask: 0xfff0707f, value: 0xf2000053, op: FMV_D_X, args: argTypeList{arg_fd, arg_rs1}},
+ // FMV.H.X fd, rs1
+ {mask: 0xfff0707f, value: 0xf4000053, op: FMV_H_X, args: argTypeList{arg_fd, arg_rs1}},
+ // FMV.W.X fd, rs1
+ {mask: 0xfff0707f, value: 0xf0000053, op: FMV_W_X, args: argTypeList{arg_fd, arg_rs1}},
+ // FMV.X.D rd, fs1
+ {mask: 0xfff0707f, value: 0xe2000053, op: FMV_X_D, args: argTypeList{arg_rd, arg_fs1}},
+ // FMV.X.H rd, fs1
+ {mask: 0xfff0707f, value: 0xe4000053, op: FMV_X_H, args: argTypeList{arg_rd, arg_fs1}},
+ // FMV.X.W rd, fs1
+ {mask: 0xfff0707f, value: 0xe0000053, op: FMV_X_W, args: argTypeList{arg_rd, arg_fs1}},
+ // FNMADD.D fd, fs1, fs2, fs3
+ {mask: 0x0600007f, value: 0x0200004f, op: FNMADD_D, args: argTypeList{arg_fd, arg_fs1, arg_fs2, arg_fs3}},
+ // FNMADD.H fd, fs1, fs2, fs3
+ {mask: 0x0600007f, value: 0x0400004f, op: FNMADD_H, args: argTypeList{arg_fd, arg_fs1, arg_fs2, arg_fs3}},
+ // FNMADD.Q fd, fs1, fs2, fs3
+ {mask: 0x0600007f, value: 0x0600004f, op: FNMADD_Q, args: argTypeList{arg_fd, arg_fs1, arg_fs2, arg_fs3}},
+ // FNMADD.S fd, fs1, fs2, fs3
+ {mask: 0x0600007f, value: 0x0000004f, op: FNMADD_S, args: argTypeList{arg_fd, arg_fs1, arg_fs2, arg_fs3}},
+ // FNMSUB.D fd, fs1, fs2, fs3
+ {mask: 0x0600007f, value: 0x0200004b, op: FNMSUB_D, args: argTypeList{arg_fd, arg_fs1, arg_fs2, arg_fs3}},
+ // FNMSUB.H fd, fs1, fs2, fs3
+ {mask: 0x0600007f, value: 0x0400004b, op: FNMSUB_H, args: argTypeList{arg_fd, arg_fs1, arg_fs2, arg_fs3}},
+ // FNMSUB.Q fd, fs1, fs2, fs3
+ {mask: 0x0600007f, value: 0x0600004b, op: FNMSUB_Q, args: argTypeList{arg_fd, arg_fs1, arg_fs2, arg_fs3}},
+ // FNMSUB.S fd, fs1, fs2, fs3
+ {mask: 0x0600007f, value: 0x0000004b, op: FNMSUB_S, args: argTypeList{arg_fd, arg_fs1, arg_fs2, arg_fs3}},
+ // FSD fs2, rs1_store
+ {mask: 0x0000707f, value: 0x00003027, op: FSD, args: argTypeList{arg_fs2, arg_rs1_store}},
+ // FSGNJN.D fd, fs1, fs2
+ {mask: 0xfe00707f, value: 0x22001053, op: FSGNJN_D, args: argTypeList{arg_fd, arg_fs1, arg_fs2}},
+ // FSGNJN.H fd, fs1, fs2
+ {mask: 0xfe00707f, value: 0x24001053, op: FSGNJN_H, args: argTypeList{arg_fd, arg_fs1, arg_fs2}},
+ // FSGNJN.Q fd, fs1, fs2
+ {mask: 0xfe00707f, value: 0x26001053, op: FSGNJN_Q, args: argTypeList{arg_fd, arg_fs1, arg_fs2}},
+ // FSGNJN.S fd, fs1, fs2
+ {mask: 0xfe00707f, value: 0x20001053, op: FSGNJN_S, args: argTypeList{arg_fd, arg_fs1, arg_fs2}},
+ // FSGNJX.D fd, fs1, fs2
+ {mask: 0xfe00707f, value: 0x22002053, op: FSGNJX_D, args: argTypeList{arg_fd, arg_fs1, arg_fs2}},
+ // FSGNJX.H fd, fs1, fs2
+ {mask: 0xfe00707f, value: 0x24002053, op: FSGNJX_H, args: argTypeList{arg_fd, arg_fs1, arg_fs2}},
+ // FSGNJX.Q fd, fs1, fs2
+ {mask: 0xfe00707f, value: 0x26002053, op: FSGNJX_Q, args: argTypeList{arg_fd, arg_fs1, arg_fs2}},
+ // FSGNJX.S fd, fs1, fs2
+ {mask: 0xfe00707f, value: 0x20002053, op: FSGNJX_S, args: argTypeList{arg_fd, arg_fs1, arg_fs2}},
+ // FSGNJ.D fd, fs1, fs2
+ {mask: 0xfe00707f, value: 0x22000053, op: FSGNJ_D, args: argTypeList{arg_fd, arg_fs1, arg_fs2}},
+ // FSGNJ.H fd, fs1, fs2
+ {mask: 0xfe00707f, value: 0x24000053, op: FSGNJ_H, args: argTypeList{arg_fd, arg_fs1, arg_fs2}},
+ // FSGNJ.Q fd, fs1, fs2
+ {mask: 0xfe00707f, value: 0x26000053, op: FSGNJ_Q, args: argTypeList{arg_fd, arg_fs1, arg_fs2}},
+ // FSGNJ.S fd, fs1, fs2
+ {mask: 0xfe00707f, value: 0x20000053, op: FSGNJ_S, args: argTypeList{arg_fd, arg_fs1, arg_fs2}},
+ // FSH fs2, rs1_store
+ {mask: 0x0000707f, value: 0x00001027, op: FSH, args: argTypeList{arg_fs2, arg_rs1_store}},
+ // FSQ fs2, rs1_store
+ {mask: 0x0000707f, value: 0x00004027, op: FSQ, args: argTypeList{arg_fs2, arg_rs1_store}},
+ // FSQRT.D fd, fs1
+ {mask: 0xfff0007f, value: 0x5a000053, op: FSQRT_D, args: argTypeList{arg_fd, arg_fs1}},
+ // FSQRT.H fd, fs1
+ {mask: 0xfff0007f, value: 0x5c000053, op: FSQRT_H, args: argTypeList{arg_fd, arg_fs1}},
+ // FSQRT.Q fd, fs1
+ {mask: 0xfff0007f, value: 0x5e000053, op: FSQRT_Q, args: argTypeList{arg_fd, arg_fs1}},
+ // FSQRT.S fd, fs1
+ {mask: 0xfff0007f, value: 0x58000053, op: FSQRT_S, args: argTypeList{arg_fd, arg_fs1}},
+ // FSUB.D fd, fs1, fs2
+ {mask: 0xfe00007f, value: 0x0a000053, op: FSUB_D, args: argTypeList{arg_fd, arg_fs1, arg_fs2}},
+ // FSUB.H fd, fs1, fs2
+ {mask: 0xfe00007f, value: 0x0c000053, op: FSUB_H, args: argTypeList{arg_fd, arg_fs1, arg_fs2}},
+ // FSUB.Q fd, fs1, fs2
+ {mask: 0xfe00007f, value: 0x0e000053, op: FSUB_Q, args: argTypeList{arg_fd, arg_fs1, arg_fs2}},
+ // FSUB.S fd, fs1, fs2
+ {mask: 0xfe00007f, value: 0x08000053, op: FSUB_S, args: argTypeList{arg_fd, arg_fs1, arg_fs2}},
+ // FSW fs2, rs1_store
+ {mask: 0x0000707f, value: 0x00002027, op: FSW, args: argTypeList{arg_fs2, arg_rs1_store}},
+ // JAL rd, jimm20
+ {mask: 0x0000007f, value: 0x0000006f, op: JAL, args: argTypeList{arg_rd, arg_jimm20}},
+ // JALR rd, rs1_mem
+ {mask: 0x0000707f, value: 0x00000067, op: JALR, args: argTypeList{arg_rd, arg_rs1_mem}},
+ // LB rd, rs1_mem
+ {mask: 0x0000707f, value: 0x00000003, op: LB, args: argTypeList{arg_rd, arg_rs1_mem}},
+ // LBU rd, rs1_mem
+ {mask: 0x0000707f, value: 0x00004003, op: LBU, args: argTypeList{arg_rd, arg_rs1_mem}},
+ // LD rd, rs1_mem
+ {mask: 0x0000707f, value: 0x00003003, op: LD, args: argTypeList{arg_rd, arg_rs1_mem}},
+ // LH rd, rs1_mem
+ {mask: 0x0000707f, value: 0x00001003, op: LH, args: argTypeList{arg_rd, arg_rs1_mem}},
+ // LHU rd, rs1_mem
+ {mask: 0x0000707f, value: 0x00005003, op: LHU, args: argTypeList{arg_rd, arg_rs1_mem}},
+ // LR.D rd, rs1_amo
+ {mask: 0xfff0707f, value: 0x1000302f, op: LR_D, args: argTypeList{arg_rd, arg_rs1_amo}},
+ // LR.D.AQ rd, rs1_amo
+ {mask: 0xfff0707f, value: 0x1400302f, op: LR_D_AQ, args: argTypeList{arg_rd, arg_rs1_amo}},
+ // LR.D.AQRL rd, rs1_amo
+ {mask: 0xfff0707f, value: 0x1600302f, op: LR_D_AQRL, args: argTypeList{arg_rd, arg_rs1_amo}},
+ // LR.D.RL rd, rs1_amo
+ {mask: 0xfff0707f, value: 0x1200302f, op: LR_D_RL, args: argTypeList{arg_rd, arg_rs1_amo}},
+ // LR.W rd, rs1_amo
+ {mask: 0xfff0707f, value: 0x1000202f, op: LR_W, args: argTypeList{arg_rd, arg_rs1_amo}},
+ // LR.W.AQ rd, rs1_amo
+ {mask: 0xfff0707f, value: 0x1400202f, op: LR_W_AQ, args: argTypeList{arg_rd, arg_rs1_amo}},
+ // LR.W.AQRL rd, rs1_amo
+ {mask: 0xfff0707f, value: 0x1600202f, op: LR_W_AQRL, args: argTypeList{arg_rd, arg_rs1_amo}},
+ // LR.W.RL rd, rs1_amo
+ {mask: 0xfff0707f, value: 0x1200202f, op: LR_W_RL, args: argTypeList{arg_rd, arg_rs1_amo}},
+ // LUI rd, imm20
+ {mask: 0x0000007f, value: 0x00000037, op: LUI, args: argTypeList{arg_rd, arg_imm20}},
+ // LW rd, rs1_mem
+ {mask: 0x0000707f, value: 0x00002003, op: LW, args: argTypeList{arg_rd, arg_rs1_mem}},
+ // LWU rd, rs1_mem
+ {mask: 0x0000707f, value: 0x00006003, op: LWU, args: argTypeList{arg_rd, arg_rs1_mem}},
+ // MAX rd, rs1, rs2
+ {mask: 0xfe00707f, value: 0x0a006033, op: MAX, args: argTypeList{arg_rd, arg_rs1, arg_rs2}},
+ // MAXU rd, rs1, rs2
+ {mask: 0xfe00707f, value: 0x0a007033, op: MAXU, args: argTypeList{arg_rd, arg_rs1, arg_rs2}},
+ // MIN rd, rs1, rs2
+ {mask: 0xfe00707f, value: 0x0a004033, op: MIN, args: argTypeList{arg_rd, arg_rs1, arg_rs2}},
+ // MINU rd, rs1, rs2
+ {mask: 0xfe00707f, value: 0x0a005033, op: MINU, args: argTypeList{arg_rd, arg_rs1, arg_rs2}},
+ // MUL rd, rs1, rs2
+ {mask: 0xfe00707f, value: 0x02000033, op: MUL, args: argTypeList{arg_rd, arg_rs1, arg_rs2}},
+ // MULH rd, rs1, rs2
+ {mask: 0xfe00707f, value: 0x02001033, op: MULH, args: argTypeList{arg_rd, arg_rs1, arg_rs2}},
+ // MULHSU rd, rs1, rs2
+ {mask: 0xfe00707f, value: 0x02002033, op: MULHSU, args: argTypeList{arg_rd, arg_rs1, arg_rs2}},
+ // MULHU rd, rs1, rs2
+ {mask: 0xfe00707f, value: 0x02003033, op: MULHU, args: argTypeList{arg_rd, arg_rs1, arg_rs2}},
+ // MULW rd, rs1, rs2
+ {mask: 0xfe00707f, value: 0x0200003b, op: MULW, args: argTypeList{arg_rd, arg_rs1, arg_rs2}},
+ // OR rd, rs1, rs2
+ {mask: 0xfe00707f, value: 0x00006033, op: OR, args: argTypeList{arg_rd, arg_rs1, arg_rs2}},
+ // ORC.B rd, rs1
+ {mask: 0xfff0707f, value: 0x28705013, op: ORC_B, args: argTypeList{arg_rd, arg_rs1}},
+ // ORI rd, rs1, imm12
+ {mask: 0x0000707f, value: 0x00006013, op: ORI, args: argTypeList{arg_rd, arg_rs1, arg_imm12}},
+ // ORN rd, rs1, rs2
+ {mask: 0xfe00707f, value: 0x40006033, op: ORN, args: argTypeList{arg_rd, arg_rs1, arg_rs2}},
+ // REM rd, rs1, rs2
+ {mask: 0xfe00707f, value: 0x02006033, op: REM, args: argTypeList{arg_rd, arg_rs1, arg_rs2}},
+ // REMU rd, rs1, rs2
+ {mask: 0xfe00707f, value: 0x02007033, op: REMU, args: argTypeList{arg_rd, arg_rs1, arg_rs2}},
+ // REMUW rd, rs1, rs2
+ {mask: 0xfe00707f, value: 0x0200703b, op: REMUW, args: argTypeList{arg_rd, arg_rs1, arg_rs2}},
+ // REMW rd, rs1, rs2
+ {mask: 0xfe00707f, value: 0x0200603b, op: REMW, args: argTypeList{arg_rd, arg_rs1, arg_rs2}},
+ // REV8 rd, rs1
+ {mask: 0xfff0707f, value: 0x6b805013, op: REV8, args: argTypeList{arg_rd, arg_rs1}},
+ // ROL rd, rs1, rs2
+ {mask: 0xfe00707f, value: 0x60001033, op: ROL, args: argTypeList{arg_rd, arg_rs1, arg_rs2}},
+ // ROLW rd, rs1, rs2
+ {mask: 0xfe00707f, value: 0x6000103b, op: ROLW, args: argTypeList{arg_rd, arg_rs1, arg_rs2}},
+ // ROR rd, rs1, rs2
+ {mask: 0xfe00707f, value: 0x60005033, op: ROR, args: argTypeList{arg_rd, arg_rs1, arg_rs2}},
+ // RORI rd, rs1, shamt6
+ {mask: 0xfc00707f, value: 0x60005013, op: RORI, args: argTypeList{arg_rd, arg_rs1, arg_shamt6}},
+ // RORIW rd, rs1, shamt5
+ {mask: 0xfe00707f, value: 0x6000501b, op: RORIW, args: argTypeList{arg_rd, arg_rs1, arg_shamt5}},
+ // RORW rd, rs1, rs2
+ {mask: 0xfe00707f, value: 0x6000503b, op: RORW, args: argTypeList{arg_rd, arg_rs1, arg_rs2}},
+ // SB rs2, rs1_store
+ {mask: 0x0000707f, value: 0x00000023, op: SB, args: argTypeList{arg_rs2, arg_rs1_store}},
+ // SC.D rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0x1800302f, op: SC_D, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // SC.D.AQ rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0x1c00302f, op: SC_D_AQ, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // SC.D.AQRL rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0x1e00302f, op: SC_D_AQRL, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // SC.D.RL rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0x1a00302f, op: SC_D_RL, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // SC.W rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0x1800202f, op: SC_W, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // SC.W.AQ rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0x1c00202f, op: SC_W_AQ, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // SC.W.AQRL rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0x1e00202f, op: SC_W_AQRL, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // SC.W.RL rd, rs2, rs1_amo
+ {mask: 0xfe00707f, value: 0x1a00202f, op: SC_W_RL, args: argTypeList{arg_rd, arg_rs2, arg_rs1_amo}},
+ // SD rs2, rs1_store
+ {mask: 0x0000707f, value: 0x00003023, op: SD, args: argTypeList{arg_rs2, arg_rs1_store}},
+ // SEXT.B rd, rs1
+ {mask: 0xfff0707f, value: 0x60401013, op: SEXT_B, args: argTypeList{arg_rd, arg_rs1}},
+ // SEXT.H rd, rs1
+ {mask: 0xfff0707f, value: 0x60501013, op: SEXT_H, args: argTypeList{arg_rd, arg_rs1}},
+ // SH rs2, rs1_store
+ {mask: 0x0000707f, value: 0x00001023, op: SH, args: argTypeList{arg_rs2, arg_rs1_store}},
+ // SH1ADD rd, rs1, rs2
+ {mask: 0xfe00707f, value: 0x20002033, op: SH1ADD, args: argTypeList{arg_rd, arg_rs1, arg_rs2}},
+ // SH1ADD.UW rd, rs1, rs2
+ {mask: 0xfe00707f, value: 0x2000203b, op: SH1ADD_UW, args: argTypeList{arg_rd, arg_rs1, arg_rs2}},
+ // SH2ADD rd, rs1, rs2
+ {mask: 0xfe00707f, value: 0x20004033, op: SH2ADD, args: argTypeList{arg_rd, arg_rs1, arg_rs2}},
+ // SH2ADD.UW rd, rs1, rs2
+ {mask: 0xfe00707f, value: 0x2000403b, op: SH2ADD_UW, args: argTypeList{arg_rd, arg_rs1, arg_rs2}},
+ // SH3ADD rd, rs1, rs2
+ {mask: 0xfe00707f, value: 0x20006033, op: SH3ADD, args: argTypeList{arg_rd, arg_rs1, arg_rs2}},
+ // SH3ADD.UW rd, rs1, rs2
+ {mask: 0xfe00707f, value: 0x2000603b, op: SH3ADD_UW, args: argTypeList{arg_rd, arg_rs1, arg_rs2}},
+ // SLL rd, rs1, rs2
+ {mask: 0xfe00707f, value: 0x00001033, op: SLL, args: argTypeList{arg_rd, arg_rs1, arg_rs2}},
+ // SLLI rd, rs1, shamt6
+ {mask: 0xfc00707f, value: 0x00001013, op: SLLI, args: argTypeList{arg_rd, arg_rs1, arg_shamt6}},
+ // SLLIW rd, rs1, shamt5
+ {mask: 0xfe00707f, value: 0x0000101b, op: SLLIW, args: argTypeList{arg_rd, arg_rs1, arg_shamt5}},
+ // SLLI.UW rd, rs1, shamt6
+ {mask: 0xfc00707f, value: 0x0800101b, op: SLLI_UW, args: argTypeList{arg_rd, arg_rs1, arg_shamt6}},
+ // SLLW rd, rs1, rs2
+ {mask: 0xfe00707f, value: 0x0000103b, op: SLLW, args: argTypeList{arg_rd, arg_rs1, arg_rs2}},
+ // SLT rd, rs1, rs2
+ {mask: 0xfe00707f, value: 0x00002033, op: SLT, args: argTypeList{arg_rd, arg_rs1, arg_rs2}},
+ // SLTI rd, rs1, imm12
+ {mask: 0x0000707f, value: 0x00002013, op: SLTI, args: argTypeList{arg_rd, arg_rs1, arg_imm12}},
+ // SLTIU rd, rs1, imm12
+ {mask: 0x0000707f, value: 0x00003013, op: SLTIU, args: argTypeList{arg_rd, arg_rs1, arg_imm12}},
+ // SLTU rd, rs1, rs2
+ {mask: 0xfe00707f, value: 0x00003033, op: SLTU, args: argTypeList{arg_rd, arg_rs1, arg_rs2}},
+ // SRA rd, rs1, rs2
+ {mask: 0xfe00707f, value: 0x40005033, op: SRA, args: argTypeList{arg_rd, arg_rs1, arg_rs2}},
+ // SRAI rd, rs1, shamt6
+ {mask: 0xfc00707f, value: 0x40005013, op: SRAI, args: argTypeList{arg_rd, arg_rs1, arg_shamt6}},
+ // SRAIW rd, rs1, shamt5
+ {mask: 0xfe00707f, value: 0x4000501b, op: SRAIW, args: argTypeList{arg_rd, arg_rs1, arg_shamt5}},
+ // SRAW rd, rs1, rs2
+ {mask: 0xfe00707f, value: 0x4000503b, op: SRAW, args: argTypeList{arg_rd, arg_rs1, arg_rs2}},
+ // SRL rd, rs1, rs2
+ {mask: 0xfe00707f, value: 0x00005033, op: SRL, args: argTypeList{arg_rd, arg_rs1, arg_rs2}},
+ // SRLI rd, rs1, shamt6
+ {mask: 0xfc00707f, value: 0x00005013, op: SRLI, args: argTypeList{arg_rd, arg_rs1, arg_shamt6}},
+ // SRLIW rd, rs1, shamt5
+ {mask: 0xfe00707f, value: 0x0000501b, op: SRLIW, args: argTypeList{arg_rd, arg_rs1, arg_shamt5}},
+ // SRLW rd, rs1, rs2
+ {mask: 0xfe00707f, value: 0x0000503b, op: SRLW, args: argTypeList{arg_rd, arg_rs1, arg_rs2}},
+ // SUB rd, rs1, rs2
+ {mask: 0xfe00707f, value: 0x40000033, op: SUB, args: argTypeList{arg_rd, arg_rs1, arg_rs2}},
+ // SUBW rd, rs1, rs2
+ {mask: 0xfe00707f, value: 0x4000003b, op: SUBW, args: argTypeList{arg_rd, arg_rs1, arg_rs2}},
+ // SW rs2, rs1_store
+ {mask: 0x0000707f, value: 0x00002023, op: SW, args: argTypeList{arg_rs2, arg_rs1_store}},
+ // XNOR rd, rs1, rs2
+ {mask: 0xfe00707f, value: 0x40004033, op: XNOR, args: argTypeList{arg_rd, arg_rs1, arg_rs2}},
+ // XOR rd, rs1, rs2
+ {mask: 0xfe00707f, value: 0x00004033, op: XOR, args: argTypeList{arg_rd, arg_rs1, arg_rs2}},
+ // XORI rd, rs1, imm12
+ {mask: 0x0000707f, value: 0x00004013, op: XORI, args: argTypeList{arg_rd, arg_rs1, arg_imm12}},
+ // ZEXT.H rd, rs1
+ {mask: 0xfff0707f, value: 0x0800403b, op: ZEXT_H, args: argTypeList{arg_rd, arg_rs1}},
+}
diff --git a/riscv64/riscv64spec/spec.go b/riscv64/riscv64spec/spec.go
index 53c0f1d..55c498a 100644
--- a/riscv64/riscv64spec/spec.go
+++ b/riscv64/riscv64spec/spec.go
@@ -51,7 +51,7 @@
}
const (
- prologueSec = "// Generated by riscv64spec riscv-opcodes\n// DO NOT EDIT\n\n// Copyright 2024 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage riscv64asm\n\n"
+ prologueSec = "// Code generated by riscv64spec riscv-opcodes\n// DO NOT EDIT\n\n// Copyright 2024 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage riscv64asm\n\n"
opSec = "const (\n\t_ Op = iota\n"
opstrSec = "var opstr = [...]string{\n"
instFormatsSec = "var instFormats = [...]instFormat{\n"
@@ -175,7 +175,7 @@
var value uint32
var mask uint32
- var instArgs []string
+ var argTypeList []string
for i := 1; i < len(words); i++ {
if strings.Contains(words[i], "=") {
@@ -188,13 +188,13 @@
value |= subval
mask |= submsk
} else if len(words[i]) > 0 {
- instArgs = append(instArgs, words[i])
+ argTypeList = append(argTypeList, words[i])
}
}
- instArgsStr := inferFormats(instArgs, op)
+ instArgsStr := inferFormats(argTypeList, op)
instFormatComment := "// " + strings.Replace(op, "_", ".", -1) + " " + strings.Replace(instArgsStr, "arg_", "", -1)
- instFormat := fmt.Sprintf("{mask: %#08x, value: %#08x, op: %s, args: instArgs{%s}},", mask, value, op, instArgsStr)
+ instFormat := fmt.Sprintf("{mask: %#08x, value: %#08x, op: %s, args: argTypeList{%s}},", mask, value, op, instArgsStr)
// Handle the suffix of atomic instruction.
if isAtomic(op) {
@@ -206,7 +206,7 @@
avalue := value | (uint32(i) << 25)
amask := mask | 0x06000000
ainstFormatComment := "// " + strings.Replace(aop, "_", ".", -1) + " " + strings.Replace(instArgsStr, "arg_", "", -1)
- ainstFormat := fmt.Sprintf("{mask: %#08x, value: %#08x, op: %s, args: instArgs{%s}},", amask, avalue, aop, instArgsStr)
+ ainstFormat := fmt.Sprintf("{mask: %#08x, value: %#08x, op: %s, args: argTypeList{%s}},", amask, avalue, aop, instArgsStr)
ops = append(ops, aop)
opstrs[aop] = aopstr
instFormats[aop] = ainstFormat
@@ -227,7 +227,7 @@
// U-Type (inst rd, imm),
// SB-Type (inst rs1, rs2, offset)
// S-Type (inst rs2, offset(rs1))
-func inferFormats(instArgs []string, op string) string {
+func inferFormats(argTypeList []string, op string) string {
switch {
case strings.Contains(op, "AMO") || strings.Contains(op, "SC_"):
return "arg_rd, arg_rs2, arg_rs1_amo"
@@ -265,7 +265,7 @@
default:
var instStr []string
- for _, arg := range instArgs {
+ for _, arg := range argTypeList {
if decodeArgs(arg, op) != "" {
instStr = append(instStr, decodeArgs(arg, op))
}