aboutsummaryrefslogtreecommitdiff
path: root/disasm/disasm.cc
diff options
context:
space:
mode:
Diffstat (limited to 'disasm/disasm.cc')
-rw-r--r--disasm/disasm.cc487
1 files changed, 242 insertions, 245 deletions
diff --git a/disasm/disasm.cc b/disasm/disasm.cc
index c3ba62a..49f2794 100644
--- a/disasm/disasm.cc
+++ b/disasm/disasm.cc
@@ -2,6 +2,7 @@
#include "disasm.h"
#include "decode_macros.h"
+#include "platform.h"
#include <cassert>
#include <string>
#include <vector>
@@ -705,44 +706,39 @@ static void NOINLINE add_sfence_insn(disassembler_t* d, const char* name, uint32
d->add_insn(new disasm_insn_t(name, match, mask, {&xrs1, &xrs2}));
}
-static void NOINLINE add_pitype3_insn(disassembler_t* d, const char* name, uint32_t match, uint32_t mask)
+static void NOINLINE add_vector_v_insn(disassembler_t* d, const char* name, uint32_t match, uint32_t mask)
{
- d->add_insn(new disasm_insn_t(name, match, mask, {&xrd, &xrs1, &p_imm3}));
+ d->add_insn(new disasm_insn_t(name, match, mask, {&vd, &vs2, opt, &vm}));
}
-static void NOINLINE add_pitype4_insn(disassembler_t* d, const char* name, uint32_t match, uint32_t mask)
+static void NOINLINE add_vector_vv_insn(disassembler_t* d, const char* name, uint32_t match, uint32_t mask)
{
- d->add_insn(new disasm_insn_t(name, match, mask, {&xrd, &xrs1, &p_imm4}));
+ d->add_insn(new disasm_insn_t(name, match, mask, {&vd, &vs2, &vs1, opt, &vm}));
}
-static void NOINLINE add_pitype5_insn(disassembler_t* d, const char* name, uint32_t match, uint32_t mask)
+static void NOINLINE add_vector_multiplyadd_vv_insn(disassembler_t* d, const char* name, uint32_t match, uint32_t mask)
{
- d->add_insn(new disasm_insn_t(name, match, mask, {&xrd, &xrs1, &p_imm5}));
+ d->add_insn(new disasm_insn_t(name, match, mask, {&vd, &vs1, &vs2, opt, &vm}));
}
-static void NOINLINE add_pitype6_insn(disassembler_t* d, const char* name, uint32_t match, uint32_t mask)
+static void NOINLINE add_vector_vx_insn(disassembler_t* d, const char* name, uint32_t match, uint32_t mask)
{
- d->add_insn(new disasm_insn_t(name, match, mask, {&xrd, &xrs1, &p_imm6}));
+ d->add_insn(new disasm_insn_t(name, match, mask, {&vd, &vs2, &xrs1, opt, &vm}));
}
-static void NOINLINE add_vector_v_insn(disassembler_t* d, const char* name, uint32_t match, uint32_t mask)
+static void NOINLINE add_vector_multiplyadd_vx_insn(disassembler_t* d, const char* name, uint32_t match, uint32_t mask)
{
- d->add_insn(new disasm_insn_t(name, match, mask, {&vd, &vs2, opt, &vm}));
+ d->add_insn(new disasm_insn_t(name, match, mask, {&vd, &xrs1, &vs2, opt, &vm}));
}
-static void NOINLINE add_vector_vv_insn(disassembler_t* d, const char* name, uint32_t match, uint32_t mask)
+static void NOINLINE add_vector_vf_insn(disassembler_t* d, const char* name, uint32_t match, uint32_t mask)
{
- d->add_insn(new disasm_insn_t(name, match, mask, {&vd, &vs2, &vs1, opt, &vm}));
+ d->add_insn(new disasm_insn_t(name, match, mask, {&vd, &vs2, &frs1, opt, &vm}));
}
-static void NOINLINE add_vector_vx_insn(disassembler_t* d, const char* name, uint32_t match, uint32_t mask)
+static void NOINLINE add_vector_multiplyadd_vf_insn(disassembler_t* d, const char* name, uint32_t match, uint32_t mask)
{
- d->add_insn(new disasm_insn_t(name, match, mask, {&vd, &vs2, &xrs1, opt, &vm}));
-}
-
-static void NOINLINE add_vector_vf_insn(disassembler_t* d, const char* name, uint32_t match, uint32_t mask)
-{
- d->add_insn(new disasm_insn_t(name, match, mask, {&vd, &vs2, &frs1, opt, &vm}));
+ d->add_insn(new disasm_insn_t(name, match, mask, {&vd, &frs1, &vs2, opt, &vm}));
}
static void NOINLINE add_vector_vi_insn(disassembler_t* d, const char* name, uint32_t match, uint32_t mask)
@@ -793,7 +789,12 @@ static void NOINLINE add_unknown_insns(disassembler_t* d)
#undef DECLARE_INSN
}
-void disassembler_t::add_instructions(const isa_parser_t* isa)
+#define ext_enabled_strict(x) (isa->extension_enabled(x))
+#define ext_enabled(x) (ext_enabled_strict(x) || !strict)
+#define xlen_eq(x) (xlen_eq_strict(x) || !strict)
+#define xlen_eq_strict(x) (isa->get_max_xlen() == (x))
+
+void disassembler_t::add_instructions(const isa_parser_t* isa, bool strict)
{
const uint32_t mask_rd = 0x1fUL << 7;
const uint32_t match_rd_ra = 1UL << 7;
@@ -866,16 +867,19 @@ void disassembler_t::add_instructions(const isa_parser_t* isa)
DEFINE_XLOAD(lh)
DEFINE_XLOAD(lhu)
DEFINE_XLOAD(lw)
- DEFINE_XLOAD(lwu)
- DEFINE_XLOAD(ld)
DEFINE_XSTORE(sb)
DEFINE_XSTORE(sh)
DEFINE_XSTORE(sw)
- DEFINE_XSTORE(sd)
- if (isa->extension_enabled('A') ||
- isa->extension_enabled(EXT_ZAAMO)) {
+ if (xlen_eq(64)) {
+ DEFINE_XLOAD(lwu)
+ DEFINE_XLOAD(ld)
+
+ DEFINE_XSTORE(sd)
+ }
+
+ if (ext_enabled(EXT_ZAAMO)) {
DEFINE_XAMO(amoadd_w)
DEFINE_XAMO(amoswap_w)
DEFINE_XAMO(amoand_w)
@@ -885,32 +889,39 @@ void disassembler_t::add_instructions(const isa_parser_t* isa)
DEFINE_XAMO(amomax_w)
DEFINE_XAMO(amominu_w)
DEFINE_XAMO(amomaxu_w)
- DEFINE_XAMO(amoadd_d)
- DEFINE_XAMO(amoswap_d)
- DEFINE_XAMO(amoand_d)
- DEFINE_XAMO(amoor_d)
- DEFINE_XAMO(amoxor_d)
- DEFINE_XAMO(amomin_d)
- DEFINE_XAMO(amomax_d)
- DEFINE_XAMO(amominu_d)
- DEFINE_XAMO(amomaxu_d)
- }
-
- if (isa->extension_enabled('A') ||
- isa->extension_enabled(EXT_ZALRSC)) {
+
+ if (xlen_eq(64)) {
+ DEFINE_XAMO(amoadd_d)
+ DEFINE_XAMO(amoswap_d)
+ DEFINE_XAMO(amoand_d)
+ DEFINE_XAMO(amoor_d)
+ DEFINE_XAMO(amoxor_d)
+ DEFINE_XAMO(amomin_d)
+ DEFINE_XAMO(amomax_d)
+ DEFINE_XAMO(amominu_d)
+ DEFINE_XAMO(amomaxu_d)
+ }
+ }
+
+ if (ext_enabled(EXT_ZALRSC)) {
DEFINE_XLOAD_BASE(lr_w)
DEFINE_XAMO(sc_w)
- DEFINE_XLOAD_BASE(lr_d)
- DEFINE_XAMO(sc_d)
+
+ if (xlen_eq(64)) {
+ DEFINE_XLOAD_BASE(lr_d)
+ DEFINE_XAMO(sc_d)
+ }
}
- if (isa->extension_enabled(EXT_ZACAS)) {
+ if (ext_enabled(EXT_ZACAS)) {
DEFINE_XAMO(amocas_w)
DEFINE_XAMO(amocas_d)
- DEFINE_XAMO(amocas_q)
+
+ if (xlen_eq(64))
+ DEFINE_XAMO(amocas_q)
}
- if (isa->extension_enabled(EXT_ZABHA)) {
+ if (ext_enabled(EXT_ZABHA)) {
DEFINE_XAMO(amoadd_b)
DEFINE_XAMO(amoswap_b)
DEFINE_XAMO(amoand_b)
@@ -933,12 +944,12 @@ void disassembler_t::add_instructions(const isa_parser_t* isa)
DEFINE_XAMO(amocas_h)
}
- if (isa->extension_enabled(EXT_ZAWRS)) {
+ if (ext_enabled(EXT_ZAWRS)) {
DEFINE_NOARG(wrs_sto);
DEFINE_NOARG(wrs_nto);
}
- if (isa->extension_enabled(EXT_ZICFILP)) {
+ if (ext_enabled(EXT_ZICFILP)) {
// lpad encodes as `auipc x0, label`, so it needs to be added before auipc
// for higher disassembling priority
DISASM_INSN("lpad", lpad, 0, {&bigimm});
@@ -983,12 +994,21 @@ void disassembler_t::add_instructions(const isa_parser_t* isa)
DEFINE_ITYPE(ori);
DEFINE_ITYPE(andi);
- DEFINE_I1TYPE("sext.w", addiw);
- DEFINE_ITYPE(addiw);
- DEFINE_ITYPE_SHIFT(slliw);
- DEFINE_ITYPE_SHIFT(srliw);
- DEFINE_ITYPE_SHIFT(sraiw);
+ if (xlen_eq(64)) {
+ DEFINE_I1TYPE("sext.w", addiw);
+ DEFINE_ITYPE(addiw);
+
+ DEFINE_ITYPE_SHIFT(slliw);
+ DEFINE_ITYPE_SHIFT(srliw);
+ DEFINE_ITYPE_SHIFT(sraiw);
+
+ DEFINE_RTYPE(addw);
+ DEFINE_RTYPE(subw);
+ DEFINE_RTYPE(sllw);
+ DEFINE_RTYPE(srlw);
+ DEFINE_RTYPE(sraw);
+ }
DEFINE_RTYPE(add);
DEFINE_RTYPE(sub);
@@ -1001,11 +1021,6 @@ void disassembler_t::add_instructions(const isa_parser_t* isa)
DEFINE_RTYPE(sra);
DEFINE_RTYPE(or);
DEFINE_RTYPE(and);
- DEFINE_RTYPE(addw);
- DEFINE_RTYPE(subw);
- DEFINE_RTYPE(sllw);
- DEFINE_RTYPE(srlw);
- DEFINE_RTYPE(sraw);
DEFINE_NOARG(ecall);
DEFINE_NOARG(ebreak);
@@ -1029,32 +1044,35 @@ void disassembler_t::add_instructions(const isa_parser_t* isa)
add_insn(new disasm_insn_t("csrrsi", match_csrrsi, mask_csrrsi, {&xrd, &csr, &zimm5}));
add_insn(new disasm_insn_t("csrrci", match_csrrci, mask_csrrci, {&xrd, &csr, &zimm5}));
- if (isa->extension_enabled('S')) {
+ if (ext_enabled('S')) {
DEFINE_NOARG(sret);
DEFINE_SFENCE_TYPE(sfence_vma);
}
- if (isa->extension_enabled('M')) {
+ if (ext_enabled('M')) {
DEFINE_RTYPE(mul);
DEFINE_RTYPE(mulh);
DEFINE_RTYPE(mulhu);
DEFINE_RTYPE(mulhsu);
- DEFINE_RTYPE(mulw);
DEFINE_RTYPE(div);
DEFINE_RTYPE(divu);
DEFINE_RTYPE(rem);
DEFINE_RTYPE(remu);
- DEFINE_RTYPE(divw);
- DEFINE_RTYPE(divuw);
- DEFINE_RTYPE(remw);
- DEFINE_RTYPE(remuw);
+
+ if (xlen_eq(64)) {
+ DEFINE_RTYPE(mulw);
+ DEFINE_RTYPE(divw);
+ DEFINE_RTYPE(divuw);
+ DEFINE_RTYPE(remw);
+ DEFINE_RTYPE(remuw);
+ }
}
- if (isa->extension_enabled(EXT_ZBA)) {
+ if (ext_enabled(EXT_ZBA)) {
DEFINE_RTYPE(sh1add);
DEFINE_RTYPE(sh2add);
DEFINE_RTYPE(sh3add);
- if (isa->get_max_xlen() == 64) {
+ if (xlen_eq(64)) {
DEFINE_ITYPE_SHIFT(slli_uw);
add_insn(new disasm_insn_t("zext.w", match_add_uw, mask_add_uw | mask_rs2, {&xrd, &xrs1}));
DEFINE_RTYPE(add_uw);
@@ -1064,7 +1082,7 @@ void disassembler_t::add_instructions(const isa_parser_t* isa)
}
}
- if (isa->extension_enabled(EXT_ZBB)) {
+ if (ext_enabled(EXT_ZBB)) {
DEFINE_RTYPE(ror);
DEFINE_RTYPE(rol);
DEFINE_ITYPE_SHIFT(rori);
@@ -1083,7 +1101,7 @@ void disassembler_t::add_instructions(const isa_parser_t* isa)
add_insn(new disasm_insn_t("rev8", match_grevi | ((isa->get_max_xlen() - 8) << imm_shift), mask_grevi | mask_imm, {&xrd, &xrs1}));
add_insn(new disasm_insn_t("orc.b", match_gorci | (0x7 << imm_shift), mask_grevi | mask_imm, {&xrd, &xrs1}));
add_insn(new disasm_insn_t("zext.h", (isa->get_max_xlen() == 32 ? match_pack : match_packw), mask_pack | mask_rs2, {&xrd, &xrs1}));
- if (isa->get_max_xlen() == 64) {
+ if (xlen_eq(64)) {
DEFINE_RTYPE(rorw);
DEFINE_RTYPE(rolw);
DEFINE_ITYPE_SHIFT(roriw);
@@ -1093,13 +1111,13 @@ void disassembler_t::add_instructions(const isa_parser_t* isa)
}
}
- if (isa->extension_enabled(EXT_ZBC)) {
+ if (ext_enabled(EXT_ZBC)) {
DEFINE_RTYPE(clmul);
DEFINE_RTYPE(clmulh);
DEFINE_RTYPE(clmulr);
}
- if (isa->extension_enabled(EXT_ZBS)) {
+ if (ext_enabled(EXT_ZBS)) {
DEFINE_RTYPE(bclr);
DEFINE_RTYPE(binv);
DEFINE_RTYPE(bset);
@@ -1110,17 +1128,17 @@ void disassembler_t::add_instructions(const isa_parser_t* isa)
DEFINE_ITYPE_SHIFT(bexti);
}
- if (isa->extension_enabled(EXT_ZBKB)) {
+ if (ext_enabled(EXT_ZBKB)) {
add_insn(new disasm_insn_t("brev8", match_grevi | (0x7 << imm_shift), mask_grevi | mask_imm, {&xrd, &xrs1})); // brev8
add_insn(new disasm_insn_t("rev8", match_grevi | ((isa->get_max_xlen() - 8) << imm_shift), mask_grevi | mask_imm, {&xrd, &xrs1}));
DEFINE_RTYPE(pack);
DEFINE_RTYPE(packh);
- if (isa->get_max_xlen() == 64) {
+ if (xlen_eq(64)) {
DEFINE_RTYPE(packw);
}
}
- if (isa->extension_enabled(EXT_SVINVAL)) {
+ if (ext_enabled(EXT_SVINVAL)) {
DEFINE_NOARG(sfence_w_inval);
DEFINE_NOARG(sfence_inval_ir);
DEFINE_SFENCE_TYPE(sinval_vma);
@@ -1128,9 +1146,14 @@ void disassembler_t::add_instructions(const isa_parser_t* isa)
DEFINE_SFENCE_TYPE(hinval_gvma);
}
- if (isa->extension_enabled('F')) {
+ if (ext_enabled('F')) {
DEFINE_FLOAD(flw)
DEFINE_FSTORE(fsw)
+ DEFINE_XFTYPE(fmv_w_x);
+ DEFINE_FXTYPE(fmv_x_w);
+ }
+
+ if (ext_enabled('F') || ext_enabled(EXT_ZFINX)) {
DEFINE_FRTYPE(fadd_s);
DEFINE_FRTYPE(fsub_s);
DEFINE_FRTYPE(fmul_s);
@@ -1147,58 +1170,35 @@ void disassembler_t::add_instructions(const isa_parser_t* isa)
DEFINE_FRTYPE(fsgnjx_s);
DEFINE_FR1TYPE(fcvt_s_d);
DEFINE_FR1TYPE(fcvt_s_q);
- DEFINE_XFTYPE(fcvt_s_l);
- DEFINE_XFTYPE(fcvt_s_lu);
DEFINE_XFTYPE(fcvt_s_w);
DEFINE_XFTYPE(fcvt_s_wu);
DEFINE_XFTYPE(fcvt_s_wu);
- DEFINE_XFTYPE(fmv_w_x);
- DEFINE_FXTYPE(fcvt_l_s);
- DEFINE_FXTYPE(fcvt_lu_s);
DEFINE_FXTYPE(fcvt_w_s);
DEFINE_FXTYPE(fcvt_wu_s);
DEFINE_FXTYPE(fclass_s);
- DEFINE_FXTYPE(fmv_x_w);
DEFINE_FX2TYPE(feq_s);
DEFINE_FX2TYPE(flt_s);
DEFINE_FX2TYPE(fle_s);
+
+ if (xlen_eq(64)) {
+ DEFINE_XFTYPE(fcvt_s_l);
+ DEFINE_XFTYPE(fcvt_s_lu);
+ DEFINE_FXTYPE(fcvt_l_s);
+ DEFINE_FXTYPE(fcvt_lu_s);
+ }
}
- if (isa->extension_enabled(EXT_ZFINX)) {
- DEFINE_RTYPE(fadd_s);
- DEFINE_RTYPE(fsub_s);
- DEFINE_RTYPE(fmul_s);
- DEFINE_RTYPE(fdiv_s);
- DEFINE_R1TYPE(fsqrt_s);
- DEFINE_RTYPE(fmin_s);
- DEFINE_RTYPE(fmax_s);
- DEFINE_R3TYPE(fmadd_s);
- DEFINE_R3TYPE(fmsub_s);
- DEFINE_R3TYPE(fnmadd_s);
- DEFINE_R3TYPE(fnmsub_s);
- DEFINE_RTYPE(fsgnj_s);
- DEFINE_RTYPE(fsgnjn_s);
- DEFINE_RTYPE(fsgnjx_s);
- DEFINE_R1TYPE(fcvt_s_d);
- //DEFINE_R1TYPE(fcvt_s_q);
- DEFINE_R1TYPE(fcvt_s_l);
- DEFINE_R1TYPE(fcvt_s_lu);
- DEFINE_R1TYPE(fcvt_s_w);
- DEFINE_R1TYPE(fcvt_s_wu);
- DEFINE_R1TYPE(fcvt_s_wu);
- DEFINE_R1TYPE(fcvt_l_s);
- DEFINE_R1TYPE(fcvt_lu_s);
- DEFINE_R1TYPE(fcvt_w_s);
- DEFINE_R1TYPE(fcvt_wu_s);
- DEFINE_R1TYPE(fclass_s);
- DEFINE_RTYPE(feq_s);
- DEFINE_RTYPE(flt_s);
- DEFINE_RTYPE(fle_s);
- }
-
- if (isa->extension_enabled('D')) {
+ if (ext_enabled('D')) {
DEFINE_FLOAD(fld)
DEFINE_FSTORE(fsd)
+
+ if (xlen_eq(64)) {
+ DEFINE_XFTYPE(fmv_d_x);
+ DEFINE_FXTYPE(fmv_x_d);
+ }
+ }
+
+ if (ext_enabled('D') || ext_enabled(EXT_ZDINX)) {
DEFINE_FRTYPE(fadd_d);
DEFINE_FRTYPE(fsub_d);
DEFINE_FRTYPE(fmul_d);
@@ -1215,24 +1215,25 @@ void disassembler_t::add_instructions(const isa_parser_t* isa)
DEFINE_FRTYPE(fsgnjx_d);
DEFINE_FR1TYPE(fcvt_d_s);
DEFINE_FR1TYPE(fcvt_d_q);
- DEFINE_XFTYPE(fcvt_d_l);
- DEFINE_XFTYPE(fcvt_d_lu);
DEFINE_XFTYPE(fcvt_d_w);
DEFINE_XFTYPE(fcvt_d_wu);
DEFINE_XFTYPE(fcvt_d_wu);
- DEFINE_XFTYPE(fmv_d_x);
- DEFINE_FXTYPE(fcvt_l_d);
- DEFINE_FXTYPE(fcvt_lu_d);
DEFINE_FXTYPE(fcvt_w_d);
DEFINE_FXTYPE(fcvt_wu_d);
DEFINE_FXTYPE(fclass_d);
- DEFINE_FXTYPE(fmv_x_d);
DEFINE_FX2TYPE(feq_d);
DEFINE_FX2TYPE(flt_d);
DEFINE_FX2TYPE(fle_d);
+
+ if (xlen_eq(64)) {
+ DEFINE_XFTYPE(fcvt_d_l);
+ DEFINE_XFTYPE(fcvt_d_lu);
+ DEFINE_FXTYPE(fcvt_l_d);
+ DEFINE_FXTYPE(fcvt_lu_d);
+ }
}
- if (isa->extension_enabled(EXT_ZFA)) {
+ if (ext_enabled(EXT_ZFA)) {
DEFINE_FLITYPE(fli_s);
DEFINE_FRTYPE(fminm_s);
DEFINE_FRTYPE(fmaxm_s);
@@ -1241,7 +1242,7 @@ void disassembler_t::add_instructions(const isa_parser_t* isa)
DEFINE_FX2TYPE(fleq_s);
DEFINE_FX2TYPE(fltq_s);
- if (isa->extension_enabled(EXT_ZFH) || isa->extension_enabled(EXT_ZVFH)) {
+ if (ext_enabled(EXT_ZFH) || ext_enabled(EXT_ZVFH)) {
DEFINE_FLITYPE(fli_h);
DEFINE_FRTYPE(fminm_h);
DEFINE_FRTYPE(fmaxm_h);
@@ -1251,7 +1252,7 @@ void disassembler_t::add_instructions(const isa_parser_t* isa)
DEFINE_FX2TYPE(fltq_h);
}
- if (isa->extension_enabled('D')) {
+ if (ext_enabled('D')) {
DEFINE_FLITYPE(fli_d);
DEFINE_FRTYPE(fminm_d);
DEFINE_FRTYPE(fmaxm_d);
@@ -1260,13 +1261,13 @@ void disassembler_t::add_instructions(const isa_parser_t* isa)
DEFINE_FX2TYPE(fleq_d);
DEFINE_FX2TYPE(fltq_d);
- if (isa->get_max_xlen() == 32) {
+ if (xlen_eq(32)) {
DEFINE_XF2TYPE(fmvp_d_x);
DEFINE_FXTYPE(fmvh_x_d);
}
}
- if (isa->extension_enabled('Q')) {
+ if (ext_enabled('Q')) {
DEFINE_FLITYPE(fli_q);
DEFINE_FRTYPE(fminm_q);
DEFINE_FRTYPE(fmaxm_q);
@@ -1275,46 +1276,14 @@ void disassembler_t::add_instructions(const isa_parser_t* isa)
DEFINE_FX2TYPE(fleq_q);
DEFINE_FX2TYPE(fltq_q);
- if (isa->get_max_xlen() == 64) {
+ if (xlen_eq(64)) {
DEFINE_XF2TYPE(fmvp_q_x);
DEFINE_FXTYPE(fmvh_x_q);
}
}
}
- if (isa->extension_enabled(EXT_ZDINX)) {
- DEFINE_RTYPE(fadd_d);
- DEFINE_RTYPE(fsub_d);
- DEFINE_RTYPE(fmul_d);
- DEFINE_RTYPE(fdiv_d);
- DEFINE_R1TYPE(fsqrt_d);
- DEFINE_RTYPE(fmin_d);
- DEFINE_RTYPE(fmax_d);
- DEFINE_R3TYPE(fmadd_d);
- DEFINE_R3TYPE(fmsub_d);
- DEFINE_R3TYPE(fnmadd_d);
- DEFINE_R3TYPE(fnmsub_d);
- DEFINE_RTYPE(fsgnj_d);
- DEFINE_RTYPE(fsgnjn_d);
- DEFINE_RTYPE(fsgnjx_d);
- DEFINE_R1TYPE(fcvt_d_s);
- //DEFINE_R1TYPE(fcvt_d_q);
- DEFINE_R1TYPE(fcvt_d_l);
- DEFINE_R1TYPE(fcvt_d_lu);
- DEFINE_R1TYPE(fcvt_d_w);
- DEFINE_R1TYPE(fcvt_d_wu);
- DEFINE_R1TYPE(fcvt_d_wu);
- DEFINE_R1TYPE(fcvt_l_d);
- DEFINE_R1TYPE(fcvt_lu_d);
- DEFINE_R1TYPE(fcvt_w_d);
- DEFINE_R1TYPE(fcvt_wu_d);
- DEFINE_R1TYPE(fclass_d);
- DEFINE_RTYPE(feq_d);
- DEFINE_RTYPE(flt_d);
- DEFINE_RTYPE(fle_d);
- }
-
- if (isa->extension_enabled(EXT_ZFH)) {
+ if (ext_enabled(EXT_ZFH)) {
DEFINE_FRTYPE(fadd_h);
DEFINE_FRTYPE(fsub_h);
DEFINE_FRTYPE(fmul_h);
@@ -1344,7 +1313,7 @@ void disassembler_t::add_instructions(const isa_parser_t* isa)
DEFINE_FX2TYPE(fle_h);
}
- if (isa->extension_enabled(EXT_ZHINX)) {
+ if (ext_enabled(EXT_ZHINX)) {
DEFINE_RTYPE(fadd_h);
DEFINE_RTYPE(fsub_h);
DEFINE_RTYPE(fmul_h);
@@ -1374,7 +1343,7 @@ void disassembler_t::add_instructions(const isa_parser_t* isa)
DEFINE_RTYPE(fle_h);
}
- if (isa->extension_enabled(EXT_ZFHMIN)) {
+ if (ext_enabled(EXT_ZFHMIN)) {
DEFINE_FR1TYPE(fcvt_h_s);
DEFINE_FR1TYPE(fcvt_h_d);
DEFINE_FR1TYPE(fcvt_h_q);
@@ -1383,14 +1352,14 @@ void disassembler_t::add_instructions(const isa_parser_t* isa)
DEFINE_FR1TYPE(fcvt_q_h);
}
- if (isa->extension_enabled(EXT_INTERNAL_ZFH_MOVE)) {
+ if (ext_enabled(EXT_INTERNAL_ZFH_MOVE)) {
DEFINE_FLOAD(flh)
DEFINE_FSTORE(fsh)
DEFINE_XFTYPE(fmv_h_x);
DEFINE_FXTYPE(fmv_x_h);
}
- if (isa->extension_enabled(EXT_ZHINXMIN)) {
+ if (ext_enabled(EXT_ZHINXMIN)) {
DEFINE_R1TYPE(fcvt_h_s);
DEFINE_R1TYPE(fcvt_h_d);
//DEFINE_R1TYPE(fcvt_h_q);
@@ -1399,7 +1368,7 @@ void disassembler_t::add_instructions(const isa_parser_t* isa)
//DEFINE_R1TYPE(fcvt_q_h);
}
- if (isa->extension_enabled('Q')) {
+ if (ext_enabled('Q')) {
DEFINE_FLOAD(flq)
DEFINE_FSTORE(fsq)
DEFINE_FRTYPE(fadd_q);
@@ -1433,13 +1402,13 @@ void disassembler_t::add_instructions(const isa_parser_t* isa)
DEFINE_FX2TYPE(fle_q);
}
- if (isa->extension_enabled(EXT_ZFBFMIN)) {
+ if (ext_enabled(EXT_ZFBFMIN)) {
DEFINE_FR1TYPE(fcvt_bf16_s);
DEFINE_FR1TYPE(fcvt_s_bf16);
}
// ext-h
- if (isa->extension_enabled('H')) {
+ if (ext_enabled('H')) {
DEFINE_XLOAD_BASE(hlv_b)
DEFINE_XLOAD_BASE(hlv_bu)
DEFINE_XLOAD_BASE(hlv_h)
@@ -1461,7 +1430,7 @@ void disassembler_t::add_instructions(const isa_parser_t* isa)
}
// ext-c
- if (isa->extension_enabled(EXT_ZCA)) {
+ if (ext_enabled(EXT_ZCA)) {
DISASM_INSN("c.ebreak", c_add, mask_rd | mask_rvc_rs2, {});
add_insn(new disasm_insn_t("ret", match_c_jr | match_rd_ra, mask_c_jr | mask_rd | mask_rvc_imm, {}));
DISASM_INSN("c.jr", c_jr, mask_rvc_imm, {&rvc_rs1});
@@ -1478,9 +1447,7 @@ void disassembler_t::add_instructions(const isa_parser_t* isa)
DISASM_INSN("c.andi", c_andi, 0, {&rvc_rs1s, &rvc_imm});
DISASM_INSN("c.mv", c_mv, 0, {&xrd, &rvc_rs2});
DISASM_INSN("c.add", c_add, 0, {&xrd, &rvc_rs2});
- DISASM_INSN("c.addw", c_addw, 0, {&rvc_rs1s, &rvc_rs2s});
DISASM_INSN("c.sub", c_sub, 0, {&rvc_rs1s, &rvc_rs2s});
- DISASM_INSN("c.subw", c_subw, 0, {&rvc_rs1s, &rvc_rs2s});
DISASM_INSN("c.and", c_and, 0, {&rvc_rs1s, &rvc_rs2s});
DISASM_INSN("c.or", c_or, 0, {&rvc_rs1s, &rvc_rs2s});
DISASM_INSN("c.xor", c_xor, 0, {&rvc_rs1s, &rvc_rs2s});
@@ -1491,13 +1458,18 @@ void disassembler_t::add_instructions(const isa_parser_t* isa)
DISASM_INSN("c.beqz", c_beqz, 0, {&rvc_rs1s, &rvc_branch_target});
DISASM_INSN("c.bnez", c_bnez, 0, {&rvc_rs1s, &rvc_branch_target});
DISASM_INSN("c.j", c_j, 0, {&rvc_jump_target});
- if (isa->get_max_xlen() == 32) {
+ if (xlen_eq_strict(32)) {
DISASM_INSN("c.jal", c_jal, 0, {&rvc_jump_target});
} else {
DISASM_INSN("c.addiw", c_addiw, 0, {&xrd, &rvc_imm});
}
- if (isa->get_max_xlen() == 64 || isa->extension_enabled(EXT_ZCMLSD)) {
+ if (xlen_eq(64)) {
+ DISASM_INSN("c.addw", c_addw, 0, {&rvc_rs1s, &rvc_rs2s});
+ DISASM_INSN("c.subw", c_subw, 0, {&rvc_rs1s, &rvc_rs2s});
+ }
+
+ if (xlen_eq_strict(64) || ext_enabled_strict(EXT_ZCLSD)) {
DISASM_INSN("c.ld", c_ld, 0, {&rvc_rs2s, &rvc_ld_address});
DISASM_INSN("c.ldsp", c_ldsp, 0, {&xrd, &rvc_ldsp_address});
DISASM_INSN("c.sd", c_sd, 0, {&rvc_rs2s, &rvc_ld_address});
@@ -1505,26 +1477,26 @@ void disassembler_t::add_instructions(const isa_parser_t* isa)
}
}
- if (isa->extension_enabled(EXT_ZCD) && isa->extension_enabled('D')) {
+ if (ext_enabled(EXT_ZCD)) {
DISASM_INSN("c.fld", c_fld, 0, {&rvc_fp_rs2s, &rvc_ld_address});
DISASM_INSN("c.fldsp", c_fldsp, 0, {&frd, &rvc_ldsp_address});
DISASM_INSN("c.fsd", c_fsd, 0, {&rvc_fp_rs2s, &rvc_ld_address});
DISASM_INSN("c.fsdsp", c_fsdsp, 0, {&rvc_fp_rs2, &rvc_sdsp_address});
}
- if (isa->extension_enabled(EXT_ZCF) && isa->extension_enabled('F')) {
+ if (ext_enabled(EXT_ZCF)) {
DISASM_INSN("c.flw", c_flw, 0, {&rvc_fp_rs2s, &rvc_lw_address});
DISASM_INSN("c.flwsp", c_flwsp, 0, {&frd, &rvc_lwsp_address});
DISASM_INSN("c.fsw", c_fsw, 0, {&rvc_fp_rs2s, &rvc_lw_address});
DISASM_INSN("c.fswsp", c_fswsp, 0, {&rvc_fp_rs2, &rvc_swsp_address});
}
- if (isa->extension_enabled(EXT_ZCB)) {
+ if (ext_enabled(EXT_ZCB)) {
DISASM_INSN("c.zext.b", c_zext_b, 0, {&rvc_rs1s});
DISASM_INSN("c.sext.b", c_sext_b, 0, {&rvc_rs1s});
DISASM_INSN("c.zext.h", c_zext_h, 0, {&rvc_rs1s});
DISASM_INSN("c.sext.h", c_sext_h, 0, {&rvc_rs1s});
- if (isa->get_max_xlen() == 64) {
+ if (xlen_eq(64)) {
DISASM_INSN("c.zext.w", c_zext_w, 0, {&rvc_rs1s});
}
DISASM_INSN("c.not", c_not, 0, {&rvc_rs1s});
@@ -1536,8 +1508,8 @@ void disassembler_t::add_instructions(const isa_parser_t* isa)
DISASM_INSN("c.sh", c_sh, 0, {&rvc_rs2s, &rvb_h_address});
}
- if (isa->extension_enabled(EXT_ZCMP)) {
- if (isa->get_max_xlen() == 32) {
+ if (ext_enabled(EXT_ZCMP)) {
+ if (xlen_eq_strict(32)) {
DISASM_INSN("cm.push", cm_push, 0, {&rvcm_pushpop_rlist, &rvcm_push_stack_adj_32});
DISASM_INSN("cm.pop", cm_pop, 0, {&rvcm_pushpop_rlist, &rvcm_pop_stack_adj_32});
DISASM_INSN("cm.popret", cm_popret, 0, {&rvcm_pushpop_rlist, &rvcm_pop_stack_adj_32});
@@ -1553,12 +1525,12 @@ void disassembler_t::add_instructions(const isa_parser_t* isa)
DISASM_INSN("cm.mvsa01", cm_mvsa01, 0, {&rvc_r1s, &rvc_r2s});
}
- if (isa->extension_enabled(EXT_ZCMT)) {
+ if (ext_enabled(EXT_ZCMT)) {
DISASM_INSN("cm.jt", cm_jalt, 0x380, {&rvcm_jt_index});
DISASM_INSN("cm.jalt", cm_jalt, 0, {&rvcm_jt_index});
}
- if (isa->has_any_vector()) {
+ if (isa->has_any_vector() || !strict) {
DISASM_INSN("vsetivli", vsetivli, 0, {&xrd, &zimm5, &v_vtype});
DISASM_INSN("vsetvli", vsetvli, 0, {&xrd, &xrs1, &v_vtype});
DEFINE_RTYPE(vsetvl);
@@ -1642,8 +1614,11 @@ void disassembler_t::add_instructions(const isa_parser_t* isa)
#define DEFINE_VECTOR_V(code) add_vector_v_insn(this, #code, match_##code, mask_##code)
#define DEFINE_VECTOR_VV(code) add_vector_vv_insn(this, #code, match_##code, mask_##code)
+ #define DEFINE_VECTOR_MULTIPLYADD_VV(code) add_vector_multiplyadd_vv_insn(this, #code, match_##code, mask_##code)
#define DEFINE_VECTOR_VX(code) add_vector_vx_insn(this, #code, match_##code, mask_##code)
+ #define DEFINE_VECTOR_MULTIPLYADD_VX(code) add_vector_multiplyadd_vx_insn(this, #code, match_##code, mask_##code)
#define DEFINE_VECTOR_VF(code) add_vector_vf_insn(this, #code, match_##code, mask_##code)
+ #define DEFINE_VECTOR_MULTIPLYADD_VF(code) add_vector_multiplyadd_vf_insn(this, #code, match_##code, mask_##code)
#define DEFINE_VECTOR_VI(code) add_vector_vi_insn(this, #code, match_##code, mask_##code)
#define DEFINE_VECTOR_VIU(code) add_vector_viu_insn(this, #code, match_##code, mask_##code)
@@ -1659,6 +1634,10 @@ void disassembler_t::add_instructions(const isa_parser_t* isa)
DEFINE_VECTOR_VV(name##_vv); \
DEFINE_VECTOR_VX(name##_vx)
+ #define DISASM_OPIV_MULTIPLYADD_VX__INSN(name, sign) \
+ DEFINE_VECTOR_MULTIPLYADD_VV(name##_vv); \
+ DEFINE_VECTOR_MULTIPLYADD_VX(name##_vx)
+
#define DISASM_OPIV__XI_INSN(name, sign) \
DEFINE_VECTOR_VX(name##_vx); \
if (sign) \
@@ -1678,6 +1657,8 @@ void disassembler_t::add_instructions(const isa_parser_t* isa)
#define DISASM_OPIV__X__INSN(name, sign) DEFINE_VECTOR_VX(name##_vx)
+ #define DISASM_OPIV_MULTIPLYADD__X__INSN(name, sign) DEFINE_VECTOR_MULTIPLYADD_VX(name##_vx)
+
#define DEFINE_VECTOR_VVM(name) \
add_vector_vvm_insn(this, #name, match_##name, mask_##name | mask_vm)
@@ -1821,10 +1802,10 @@ void disassembler_t::add_instructions(const isa_parser_t* isa)
DISASM_OPIV_VX__INSN(vmul, 1);
DISASM_OPIV_VX__INSN(vmulhsu, 0);
DISASM_OPIV_VX__INSN(vmulh, 1);
- DISASM_OPIV_VX__INSN(vmadd, 1);
- DISASM_OPIV_VX__INSN(vnmsub, 1);
- DISASM_OPIV_VX__INSN(vmacc, 1);
- DISASM_OPIV_VX__INSN(vnmsac, 1);
+ DISASM_OPIV_MULTIPLYADD_VX__INSN(vmadd, 1);
+ DISASM_OPIV_MULTIPLYADD_VX__INSN(vnmsub, 1);
+ DISASM_OPIV_MULTIPLYADD_VX__INSN(vmacc, 1);
+ DISASM_OPIV_MULTIPLYADD_VX__INSN(vnmsac, 1);
//0b11_0000
DISASM_OPIV_VX__INSN(vwaddu, 0);
@@ -1838,10 +1819,17 @@ void disassembler_t::add_instructions(const isa_parser_t* isa)
DISASM_OPIV_VX__INSN(vwmulu, 0);
DISASM_OPIV_VX__INSN(vwmulsu, 0);
DISASM_OPIV_VX__INSN(vwmul, 1);
- DISASM_OPIV_VX__INSN(vwmaccu, 0);
- DISASM_OPIV_VX__INSN(vwmacc, 1);
- DISASM_OPIV__X__INSN(vwmaccus, 1);
- DISASM_OPIV_VX__INSN(vwmaccsu, 0);
+ DISASM_OPIV_MULTIPLYADD_VX__INSN(vwmaccu, 0);
+ DISASM_OPIV_MULTIPLYADD_VX__INSN(vwmacc, 1);
+ DISASM_OPIV_MULTIPLYADD__X__INSN(vwmaccus, 1);
+ DISASM_OPIV_MULTIPLYADD_VX__INSN(vwmaccsu, 0);
+
+ if (ext_enabled(EXT_ZVQDOTQ)) {
+ DISASM_OPIV_VX__INSN(vqdot, 0);
+ DISASM_OPIV_VX__INSN(vqdotu, 0);
+ DISASM_OPIV_VX__INSN(vqdotsu, 0);
+ DISASM_OPIV__X__INSN(vqdotus, 0);
+ }
#undef DISASM_OPIV_VXI_INSN
#undef DISASM_OPIV_VX__INSN
@@ -1858,6 +1846,10 @@ void disassembler_t::add_instructions(const isa_parser_t* isa)
DEFINE_VECTOR_VV(name##_vv); \
DEFINE_VECTOR_VF(name##_vf)
+ #define DISASM_OPIV_MULTIPLYADD_VF_INSN(name) \
+ DEFINE_VECTOR_MULTIPLYADD_VV(name##_vv); \
+ DEFINE_VECTOR_MULTIPLYADD_VF(name##_vf)
+
#define DISASM_OPIV_WF_INSN(name) \
DEFINE_VECTOR_VV(name##_wv); \
DEFINE_VECTOR_VF(name##_wf)
@@ -1925,14 +1917,14 @@ void disassembler_t::add_instructions(const isa_parser_t* isa)
DISASM_OPIV_VF_INSN(vfmul);
DISASM_OPIV__F_INSN(vfrsub);
- DISASM_OPIV_VF_INSN(vfmadd);
- DISASM_OPIV_VF_INSN(vfnmadd);
- DISASM_OPIV_VF_INSN(vfmsub);
- DISASM_OPIV_VF_INSN(vfnmsub);
- DISASM_OPIV_VF_INSN(vfmacc);
- DISASM_OPIV_VF_INSN(vfnmacc);
- DISASM_OPIV_VF_INSN(vfmsac);
- DISASM_OPIV_VF_INSN(vfnmsac);
+ DISASM_OPIV_MULTIPLYADD_VF_INSN(vfmadd);
+ DISASM_OPIV_MULTIPLYADD_VF_INSN(vfnmadd);
+ DISASM_OPIV_MULTIPLYADD_VF_INSN(vfmsub);
+ DISASM_OPIV_MULTIPLYADD_VF_INSN(vfnmsub);
+ DISASM_OPIV_MULTIPLYADD_VF_INSN(vfmacc);
+ DISASM_OPIV_MULTIPLYADD_VF_INSN(vfnmacc);
+ DISASM_OPIV_MULTIPLYADD_VF_INSN(vfmsac);
+ DISASM_OPIV_MULTIPLYADD_VF_INSN(vfnmsac);
//0b11_0000
DISASM_OPIV_VF_INSN(vfwadd);
@@ -1942,10 +1934,10 @@ void disassembler_t::add_instructions(const isa_parser_t* isa)
DISASM_OPIV_WF_INSN(vfwadd);
DISASM_OPIV_WF_INSN(vfwsub);
DISASM_OPIV_VF_INSN(vfwmul);
- DISASM_OPIV_VF_INSN(vfwmacc);
- DISASM_OPIV_VF_INSN(vfwnmacc);
- DISASM_OPIV_VF_INSN(vfwmsac);
- DISASM_OPIV_VF_INSN(vfwnmsac);
+ DISASM_OPIV_MULTIPLYADD_VF_INSN(vfwmacc);
+ DISASM_OPIV_MULTIPLYADD_VF_INSN(vfwnmacc);
+ DISASM_OPIV_MULTIPLYADD_VF_INSN(vfwmsac);
+ DISASM_OPIV_MULTIPLYADD_VF_INSN(vfwnmsac);
#undef DISASM_OPIV_VF_INSN
#undef DISASM_OPIV__F_INSN
@@ -1954,40 +1946,42 @@ void disassembler_t::add_instructions(const isa_parser_t* isa)
#undef DISASM_VFUNARY0_INSN
}
- if (isa->extension_enabled(EXT_ZVFBFMIN)) {
+ if (ext_enabled(EXT_ZVFBFMIN)) {
DEFINE_VECTOR_V(vfncvtbf16_f_f_w);
DEFINE_VECTOR_V(vfwcvtbf16_f_f_v);
}
- if (isa->extension_enabled(EXT_ZVFBFWMA)) {
+ if (ext_enabled(EXT_ZVFBFWMA)) {
DEFINE_VECTOR_VV(vfwmaccbf16_vv);
DEFINE_VECTOR_VF(vfwmaccbf16_vf);
}
-
- if (isa->extension_enabled(EXT_ZMMUL)) {
+
+ if (ext_enabled(EXT_ZMMUL)) {
DEFINE_RTYPE(mul);
DEFINE_RTYPE(mulh);
DEFINE_RTYPE(mulhu);
DEFINE_RTYPE(mulhsu);
- DEFINE_RTYPE(mulw);
+
+ if (xlen_eq(64))
+ DEFINE_RTYPE(mulw);
}
- if (isa->extension_enabled(EXT_ZICBOM)) {
+ if (ext_enabled(EXT_ZICBOM)) {
DISASM_INSN("cbo.clean", cbo_clean, 0, {&base_only_address});
DISASM_INSN("cbo.flush", cbo_flush, 0, {&base_only_address});
DISASM_INSN("cbo.inval", cbo_inval, 0, {&base_only_address});
}
- if (isa->extension_enabled(EXT_ZICBOZ)) {
+ if (ext_enabled(EXT_ZICBOZ)) {
DISASM_INSN("cbo.zero", cbo_zero, 0, {&base_only_address});
}
- if (isa->extension_enabled(EXT_ZICOND)) {
+ if (ext_enabled(EXT_ZICOND)) {
DEFINE_RTYPE(czero_eqz);
DEFINE_RTYPE(czero_nez);
}
- if (isa->extension_enabled(EXT_ZIMOP)) {
+ if (ext_enabled(EXT_ZIMOP)) {
#define DISASM_MOP_R(name, rs1, rd) \
add_insn(new disasm_insn_t(#name, match_##name | (rs1 << 15) | (rd << 7), \
0xFFFFFFFF, {&xrd, &xrs1}));
@@ -2023,7 +2017,7 @@ void disassembler_t::add_instructions(const isa_parser_t* isa)
DEFINE_R1TYPE(mop_r_25);
DEFINE_R1TYPE(mop_r_26);
DEFINE_R1TYPE(mop_r_27);
- if (!isa->extension_enabled(EXT_ZICFISS)) {
+ if (!ext_enabled_strict(EXT_ZICFISS)) {
DEFINE_R1TYPE(mop_r_28);
} else {
// Add code points of mop_r_28 not used by Zicfiss
@@ -2043,7 +2037,7 @@ void disassembler_t::add_instructions(const isa_parser_t* isa)
DEFINE_RTYPE(mop_rr_5);
DEFINE_RTYPE(mop_rr_6);
DEFINE_RTYPE(mop_rr_7);
- if (!isa->extension_enabled(EXT_ZICFISS)) {
+ if (!ext_enabled_strict(EXT_ZICFISS)) {
DEFINE_RTYPE(mop_rr_7);
} else {
// Add code points of mop_rr_7 not used by Zicfiss
@@ -2055,11 +2049,11 @@ void disassembler_t::add_instructions(const isa_parser_t* isa)
}
}
- if (isa->extension_enabled(EXT_ZCMOP)) {
- if (!isa->extension_enabled(EXT_ZICFISS))
+ if (ext_enabled(EXT_ZCMOP)) {
+ if (!ext_enabled_strict(EXT_ZICFISS))
DISASM_INSN("c.mop.1", c_mop_1, 0, {});
DISASM_INSN("c.mop.3", c_mop_3, 0, {});
- if (!isa->extension_enabled(EXT_ZICFISS))
+ if (!ext_enabled_strict(EXT_ZICFISS))
DISASM_INSN("c.mop.5", c_mop_5, 0, {});
DISASM_INSN("c.mop.7", c_mop_7, 0, {});
DISASM_INSN("c.mop.9", c_mop_9, 0, {});
@@ -2068,44 +2062,50 @@ void disassembler_t::add_instructions(const isa_parser_t* isa)
DISASM_INSN("c.mop.15", c_mop_15, 0, {});
}
- if (isa->extension_enabled(EXT_ZKND) ||
- isa->extension_enabled(EXT_ZKNE)) {
+ if (ext_enabled(EXT_ZKND) || ext_enabled(EXT_ZKNE)) {
DISASM_INSN("aes64ks1i", aes64ks1i, 0, {&xrd, &xrs1, &rcon});
DEFINE_RTYPE(aes64ks2);
}
- if (isa->extension_enabled(EXT_ZKND)) {
- if(isa->get_max_xlen() == 64) {
+ if (ext_enabled(EXT_ZKND)) {
+ if (xlen_eq(64)) {
DEFINE_RTYPE(aes64ds);
DEFINE_RTYPE(aes64dsm);
DEFINE_R1TYPE(aes64im);
- } else if (isa->get_max_xlen() == 32) {
+ }
+
+ if (xlen_eq(32)) {
DISASM_INSN("aes32dsi", aes32dsi, 0, {&xrd, &xrs1, &xrs2, &bs});
DISASM_INSN("aes32dsmi", aes32dsmi, 0, {&xrd, &xrs1, &xrs2, &bs});
}
}
- if (isa->extension_enabled(EXT_ZKNE)) {
- if(isa->get_max_xlen() == 64) {
+ if (ext_enabled(EXT_ZKNE)) {
+ if (xlen_eq(64)) {
DEFINE_RTYPE(aes64es);
DEFINE_RTYPE(aes64esm);
- } else if (isa->get_max_xlen() == 32) {
+ }
+
+ if (xlen_eq(32)) {
DISASM_INSN("aes32esi", aes32esi, 0, {&xrd, &xrs1, &xrs2, &bs});
DISASM_INSN("aes32esmi", aes32esmi, 0, {&xrd, &xrs1, &xrs2, &bs});
}
}
- if (isa->extension_enabled(EXT_ZKNH)) {
+ if (ext_enabled(EXT_ZKNH)) {
DEFINE_R1TYPE(sha256sig0);
DEFINE_R1TYPE(sha256sig1);
DEFINE_R1TYPE(sha256sum0);
DEFINE_R1TYPE(sha256sum1);
- if(isa->get_max_xlen() == 64) {
+
+ if (xlen_eq(64)) {
DEFINE_R1TYPE(sha512sig0);
DEFINE_R1TYPE(sha512sig1);
DEFINE_R1TYPE(sha512sum0);
DEFINE_R1TYPE(sha512sum1);
- } else if (isa->get_max_xlen() == 32) {
+ }
+
+ if (xlen_eq(32)) {
DEFINE_RTYPE(sha512sig0h);
DEFINE_RTYPE(sha512sig0l);
DEFINE_RTYPE(sha512sig1h);
@@ -2115,17 +2115,17 @@ void disassembler_t::add_instructions(const isa_parser_t* isa)
}
}
- if (isa->extension_enabled(EXT_ZKSED)) {
+ if (ext_enabled(EXT_ZKSED)) {
DISASM_INSN("sm4ed", sm4ed, 0, {&xrd, &xrs1, &xrs2, &bs});
DISASM_INSN("sm4ks", sm4ks, 0, {&xrd, &xrs1, &xrs2, &bs});
}
- if (isa->extension_enabled(EXT_ZKSH)) {
+ if (ext_enabled(EXT_ZKSH)) {
DEFINE_R1TYPE(sm3p0);
DEFINE_R1TYPE(sm3p1);
}
- if (isa->extension_enabled(EXT_ZVBB)) {
+ if (ext_enabled(EXT_ZVBB)) {
#define DEFINE_VECTOR_VIU_ZIMM6(code) \
add_vector_viu_z6_insn(this, #code, match_##code, mask_##code)
#define DISASM_VECTOR_VV_VX(name) \
@@ -2157,7 +2157,7 @@ void disassembler_t::add_instructions(const isa_parser_t* isa)
#undef DISASM_VECTOR_VV_VX_VIU_ZIMM6
}
- if (isa->extension_enabled(EXT_ZVBC)) {
+ if (ext_enabled(EXT_ZVBC)) {
#define DISASM_VECTOR_VV_VX(name) \
DEFINE_VECTOR_VV(name##_vv); \
DEFINE_VECTOR_VX(name##_vx)
@@ -2168,14 +2168,14 @@ void disassembler_t::add_instructions(const isa_parser_t* isa)
#undef DISASM_VECTOR_VV_VX
}
- if (isa->extension_enabled(EXT_ZVKG)) {
+ if (ext_enabled(EXT_ZVKG)) {
// Despite its suffix, the vgmul.vv instruction
// is really ".v", with the form "vgmul.vv vd, vs2".
DEFINE_VECTOR_V(vgmul_vv);
DEFINE_VECTOR_VV(vghsh_vv);
}
- if (isa->extension_enabled(EXT_ZVKNED)) {
+ if (ext_enabled(EXT_ZVKNED)) {
// Despite their suffixes, the vaes*.{vv,vs} instructions
// are really ".v", with the form "<op>.{vv,vs} vd, vs2".
#define DISASM_VECTOR_VV_VS(name) \
@@ -2193,14 +2193,13 @@ void disassembler_t::add_instructions(const isa_parser_t* isa)
#undef DISASM_VECTOR_VV_VS
}
- if (isa->extension_enabled(EXT_ZVKNHA) ||
- isa->extension_enabled(EXT_ZVKNHB)) {
+ if (ext_enabled(EXT_ZVKNHA) || ext_enabled(EXT_ZVKNHB)) {
DEFINE_VECTOR_VV(vsha2ms_vv);
DEFINE_VECTOR_VV(vsha2ch_vv);
DEFINE_VECTOR_VV(vsha2cl_vv);
}
- if (isa->extension_enabled(EXT_ZVKSED)) {
+ if (ext_enabled(EXT_ZVKSED)) {
DEFINE_VECTOR_VIU(vsm4k_vi);
// Despite their suffixes, the vsm4r.{vv,vs} instructions
// are really ".v", with the form "vsm4r.{vv,vs} vd, vs2".
@@ -2208,12 +2207,12 @@ void disassembler_t::add_instructions(const isa_parser_t* isa)
DEFINE_VECTOR_V(vsm4r_vs);
}
- if (isa->extension_enabled(EXT_ZVKSH)) {
+ if (ext_enabled(EXT_ZVKSH)) {
DEFINE_VECTOR_VIU(vsm3c_vi);
DEFINE_VECTOR_VV(vsm3me_vv);
}
- if (isa->extension_enabled(EXT_ZALASR)) {
+ if (ext_enabled(EXT_ZALASR)) {
DEFINE_XLOAD_BASE(lb_aq);
DEFINE_XLOAD_BASE(lh_aq);
DEFINE_XLOAD_BASE(lw_aq);
@@ -2224,7 +2223,7 @@ void disassembler_t::add_instructions(const isa_parser_t* isa)
DEFINE_XSTORE_BASE(sd_rl);
}
- if(isa->extension_enabled(EXT_ZICFISS)) {
+ if (ext_enabled(EXT_ZICFISS)) {
DISASM_INSN("sspush", sspush_x1, 0, {&xrs2});
DISASM_INSN("sspush", sspush_x5, 0, {&xrs2});
DISASM_INSN("sspopchk", sspopchk_x1, 0, {&xrs1});
@@ -2232,30 +2231,28 @@ void disassembler_t::add_instructions(const isa_parser_t* isa)
DISASM_INSN("ssrdp", ssrdp, 0, {&xrd});
DEFINE_XAMO(ssamoswap_w);
- if(isa->get_max_xlen() == 64)
+ if (xlen_eq(64))
DEFINE_XAMO(ssamoswap_d)
- if (isa->extension_enabled(EXT_ZCA)) {
+ if (ext_enabled(EXT_ZCA)) {
DISASM_INSN("c.sspush", c_sspush_x1, 0, {&rvc_ra});
DISASM_INSN("c.sspopchk", c_sspopchk_x5, 0, {&rvc_t0});
}
}
}
-disassembler_t::disassembler_t(const isa_parser_t *isa)
+disassembler_t::disassembler_t(const isa_parser_t *isa, bool strict)
{
// highest priority: instructions explicitly enabled
- add_instructions(isa);
+ add_instructions(isa, true);
- // next-highest priority: other instructions in same base ISA
- std::string fallback_isa_string = std::string("rv") + std::to_string(isa->get_max_xlen()) +
- "gqcvh_zfh_zfa_zba_zbb_zbc_zbs_zcb_zicbom_zicboz_zicond_zk_zks_svinval_"
- "zcmop_zimop_zawrs_zicfiss_zicfilp_zvknc_zvkg_zvfbfmin_zvfbfwma_zfbfmin";
- isa_parser_t fallback_isa(fallback_isa_string.c_str(), DEFAULT_PRIV);
- add_instructions(&fallback_isa);
+ if (!strict) {
+ // next-highest priority: other instructions in same base ISA
+ add_instructions(isa, false);
- // finally: instructions with known opcodes but unknown arguments
- add_unknown_insns(this);
+ // finally: instructions with known opcodes but unknown arguments
+ add_unknown_insns(this);
+ }
// Now, reverse the lists, because we search them back-to-front (so that
// custom instructions later added with add_insn have highest priority).