diff --git a/spike_main/disasm.cc b/spike_main/disasm.cc index 2841f6e7..150250ee 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});