aboutsummaryrefslogtreecommitdiff
path: root/spike_main
diff options
context:
space:
mode:
authorChih-Min Chao <chihmin.chao@sifive.com>2020-05-07 21:09:47 -0700
committerChih-Min Chao <chihmin.chao@sifive.com>2020-05-13 22:08:50 -0700
commit7e75ab9f7417a1c31b1f97bd69a9683251b5224a (patch)
treeac38830cb4aa8a400a00375ea05c8f53086d5e19 /spike_main
parent6fe796c4443749169a224358c62a2068d679126d (diff)
downloadspike-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.cc27
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});