aboutsummaryrefslogtreecommitdiff
path: root/spike_main
diff options
context:
space:
mode:
Diffstat (limited to 'spike_main')
-rw-r--r--spike_main/disasm.cc27
1 files changed, 25 insertions, 2 deletions
diff --git a/spike_main/disasm.cc b/spike_main/disasm.cc
index e30ff52..5125b17 100644
--- a/spike_main/disasm.cc
+++ b/spike_main/disasm.cc
@@ -794,10 +794,33 @@ disassembler_t::disassembler_t(int xlen)
));
}
}
+
+ const custom_fmt_t template_insn2[] = {
+ {match_vl1re8_v, mask_vl1re8_v, "vl%dre%d.v", v_ld_unit},
+ };
+
+ for (reg_t i = 0, nf = 7; nf < 4; i++, nf >>= 1) {
+ for (auto item : template_insn) {
+ const reg_t match_nf = nf << 29;
+ char buf[128];
+ sprintf(buf, item.fmt, nf + 1, 8 << elt);
+ add_insn(new disasm_insn_t(
+ buf, item.match | match_nf, item.mask | mask_nf, item.arg
+ ));
+ }
+ }
}
- DISASM_INSN("vl1r.v", vl1r_v, 0, {&vd, &v_address});
- DISASM_INSN("vs1r.v", vs1r_v, 0, {&vs3, &v_address});
+ #define DISASM_ST_WHOLE_INSN(name, nf) \
+ add_insn(new disasm_insn_t(#name, match_vs1r_v | (nf << 29), \
+ mask_vs1r_v | mask_nf, \
+ {&vs3, &v_address}));
+ DISASM_ST_WHOLE_INSN(vs1r.v, 0);
+ DISASM_ST_WHOLE_INSN(vs2r.v, 1);
+ DISASM_ST_WHOLE_INSN(vs4r.v, 3);
+ DISASM_ST_WHOLE_INSN(vs8r.v, 7);
+
+ #undef DISASM_ST_WHOLE_INSN
#define DISASM_OPIV_VXI_INSN(name, sign, suf) \
add_insn(new disasm_insn_t(#name "." #suf "v", \