diff options
author | Chih-Min Chao <chihmin.chao@sifive.com> | 2020-05-07 21:09:47 -0700 |
---|---|---|
committer | Chih-Min Chao <chihmin.chao@sifive.com> | 2020-05-13 22:08:50 -0700 |
commit | 7e75ab9f7417a1c31b1f97bd69a9683251b5224a (patch) | |
tree | ac38830cb4aa8a400a00375ea05c8f53086d5e19 /spike_main | |
parent | 6fe796c4443749169a224358c62a2068d679126d (diff) | |
download | spike-7e75ab9f7417a1c31b1f97bd69a9683251b5224a.zip spike-7e75ab9f7417a1c31b1f97bd69a9683251b5224a.tar.gz spike-7e75ab9f7417a1c31b1f97bd69a9683251b5224a.tar.bz2 |
rvv: amo pre-0.9
Signed-off-by: Chih-Min Chao <chihmin.chao@sifive.com>
Diffstat (limited to 'spike_main')
-rw-r--r-- | spike_main/disasm.cc | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/spike_main/disasm.cc b/spike_main/disasm.cc index e62c985..571ec23 100644 --- a/spike_main/disasm.cc +++ b/spike_main/disasm.cc @@ -349,6 +349,12 @@ struct : public arg_t { } } v_vtype; +struct : public arg_t { + std::string to_string(insn_t insn) const { + return "x0"; + } +} x0; + typedef struct { reg_t match; reg_t mask; @@ -374,6 +380,7 @@ disassembler_t::disassembler_t(int xlen) const uint32_t mask_rvc_rs2 = 0x1fUL << 2; 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_vldst = 0x7Ul << 12 | 0x1UL << 28; #define DECLARE_INSN(code, match, mask) \ @@ -1142,6 +1149,26 @@ disassembler_t::disassembler_t(int xlen) #undef DISASM_OPIV_W__INSN #undef DISASM_VFUNARY0_INSN + #define DISASM_VAMO_INSN(name) \ + add_insn(new disasm_insn_t(#name "e.v", match_##name##e_v | mask_wd, \ + mask_##name##e_v | mask_wd, \ + {&vd, &v_address, &vs2, &vd, &opt, &vm})); \ + add_insn(new disasm_insn_t(#name "e.v", match_##name##e_v, \ + mask_##name##e_v | mask_wd, \ + {&x0, &v_address, &vs2, &vd, &opt, &vm})); + + DISASM_VAMO_INSN(vamoswap); + DISASM_VAMO_INSN(vamoadd); + DISASM_VAMO_INSN(vamoxor); + DISASM_VAMO_INSN(vamoand); + DISASM_VAMO_INSN(vamoor); + DISASM_VAMO_INSN(vamomin); + DISASM_VAMO_INSN(vamomax); + DISASM_VAMO_INSN(vamominu); + DISASM_VAMO_INSN(vamomaxu); + + #undef DISASM_VAMO_INSN + if (xlen == 32) { DISASM_INSN("c.flw", c_flw, 0, {&rvc_fp_rs2s, &rvc_lw_address}); DISASM_INSN("c.flwsp", c_flwsp, 0, {&frd, &rvc_lwsp_address}); |