aboutsummaryrefslogtreecommitdiff
path: root/spike_main
diff options
context:
space:
mode:
authorChih-Min Chao <chihmin.chao@sifive.com>2020-09-08 00:00:13 -0700
committerChih-Min Chao <chihmin.chao@sifive.com>2020-09-08 03:22:51 -0700
commit57fbf0eeb1db6fab93faf56480f4f42f9b83f7e4 (patch)
tree7dc8596363e84e202e546145037c8795aaaa36f8 /spike_main
parentf398f0af9b4740eb6cc3666d87225a1cbb27f312 (diff)
downloadspike-57fbf0eeb1db6fab93faf56480f4f42f9b83f7e4.zip
spike-57fbf0eeb1db6fab93faf56480f4f42f9b83f7e4.tar.gz
spike-57fbf0eeb1db6fab93faf56480f4f42f9b83f7e4.tar.bz2
rvv: disasm: separate vvm and vv
Signed-off-by: Chih-Min Chao <chihmin.chao@sifive.com>
Diffstat (limited to 'spike_main')
-rw-r--r--spike_main/disasm.cc58
1 files changed, 44 insertions, 14 deletions
diff --git a/spike_main/disasm.cc b/spike_main/disasm.cc
index 2841f6e..150250e 100644
--- a/spike_main/disasm.cc
+++ b/spike_main/disasm.cc
@@ -379,6 +379,7 @@ disassembler_t::disassembler_t(int xlen)
const uint32_t mask_rvc_imm = mask_rvc_rs2 | 0x1000UL;
const uint32_t mask_nf = 0x7Ul << 29;
const uint32_t mask_wd = 0x1Ul << 26;
+ const uint32_t mask_vm = 0x1Ul << 25;
const uint32_t mask_vldst = 0x7Ul << 12 | 0x1UL << 28;
const uint32_t mask_amoop = 0x1fUl << 27;
const uint32_t mask_width = 0x7Ul << 12;
@@ -883,19 +884,48 @@ disassembler_t::disassembler_t(int xlen)
add_insn(new disasm_insn_t(#name ".vx", match_##name##_vx, mask_##name##_vx, \
{&vd, &vs2, &xrs1, &opt, &vm}));
- #define DISASM_OPIV_VXIM_INSN(name, sign) \
- add_insn(new disasm_insn_t(#name ".vvm", match_##name##_vvm, mask_##name##_vvm, \
+ #define DISASM_OPIV_VXIM_INSN(name, sign, has_vm) \
+ add_insn(new disasm_insn_t(#name ".vvm", match_##name##_vvm, \
+ mask_##name##_vvm | mask_vm, \
{&vd, &vs2, &vs1, &v0})); \
- add_insn(new disasm_insn_t(#name ".vxm", match_##name##_vxm, mask_##name##_vxm, \
+ add_insn(new disasm_insn_t(#name ".vxm", match_##name##_vxm, \
+ mask_##name##_vxm | mask_vm, \
{&vd, &vs2, &xrs1, &v0})); \
- add_insn(new disasm_insn_t(#name ".vim", match_##name##_vim, mask_##name##_vim, \
- {&vd, &vs2, &v_simm5, &v0}));
+ add_insn(new disasm_insn_t(#name ".vim", match_##name##_vim, \
+ mask_##name##_vim | mask_vm, \
+ {&vd, &vs2, &v_simm5, &v0})); \
+ if (has_vm) { \
+ add_insn(new disasm_insn_t(#name ".vv", \
+ match_##name##_vvm | mask_vm, \
+ mask_##name##_vvm | mask_vm, \
+ {&vd, &vs2, &vs1})); \
+ add_insn(new disasm_insn_t(#name ".vx", \
+ match_##name##_vxm | mask_vm, \
+ mask_##name##_vxm | mask_vm, \
+ {&vd, &vs2, &xrs1})); \
+ add_insn(new disasm_insn_t(#name ".vi", \
+ match_##name##_vim | mask_vm, \
+ mask_##name##_vim | mask_vm, \
+ {&vd, &vs2, &v_simm5})); \
+ }
- #define DISASM_OPIV_VX_M_INSN(name, sign) \
- add_insn(new disasm_insn_t(#name ".vvm", match_##name##_vvm, mask_##name##_vvm, \
+ #define DISASM_OPIV_VX_M_INSN(name, sign, has_vm) \
+ add_insn(new disasm_insn_t(#name ".vvm", match_##name##_vvm, \
+ mask_##name##_vvm | mask_vm, \
{&vd, &vs2, &vs1, &v0})); \
- add_insn(new disasm_insn_t(#name ".vxm", match_##name##_vxm, mask_##name##_vxm, \
- {&vd, &vs2, &xrs1, &v0}));
+ add_insn(new disasm_insn_t(#name ".vxm", match_##name##_vxm, \
+ mask_##name##_vxm | mask_vm, \
+ {&vd, &vs2, &xrs1, &v0})); \
+ if (has_vm) { \
+ add_insn(new disasm_insn_t(#name ".vv", \
+ match_##name##_vvm | mask_vm, \
+ mask_##name##_vvm | mask_vm, \
+ {&vd, &vs2, &vs1})); \
+ add_insn(new disasm_insn_t(#name ".vx", \
+ match_##name##_vxm | mask_vm, \
+ mask_##name##_vxm | mask_vm, \
+ {&vd, &vs2, &xrs1})); \
+ } \
//OPFVV/OPFVF
//0b00_0000
@@ -915,11 +945,11 @@ disassembler_t::disassembler_t(int xlen)
DISASM_OPIV__XI_INSN(vslidedown, 0);
//0b01_0000
- DISASM_OPIV_VXIM_INSN(vadc, 1);
- DISASM_OPIV_VXIM_INSN(vmadc, 1);
- DISASM_OPIV_VX_M_INSN(vsbc, 1);
- DISASM_OPIV_VX_M_INSN(vmsbc, 1);
- DISASM_OPIV_VXIM_INSN(vmerge, 1);
+ DISASM_OPIV_VXIM_INSN(vadc, 1, 0);
+ DISASM_OPIV_VXIM_INSN(vmadc, 1, 1);
+ DISASM_OPIV_VX_M_INSN(vsbc, 1, 0);
+ DISASM_OPIV_VX_M_INSN(vmsbc, 1, 1);
+ DISASM_OPIV_VXIM_INSN(vmerge, 1, 0);
DISASM_INSN("vmv.v.i", vmv_v_i, 0, {&vd, &v_simm5});
DISASM_INSN("vmv.v.v", vmv_v_v, 0, {&vd, &vs1});
DISASM_INSN("vmv.v.x", vmv_v_x, 0, {&vd, &xrs1});