aboutsummaryrefslogtreecommitdiff
path: root/spike_main
diff options
context:
space:
mode:
authorChih-Min Chao <chihmin.chao@sifive.com>2019-04-24 00:20:26 -0700
committerChih-Min Chao <chihmin.chao@sifive.com>2019-04-24 00:22:29 -0700
commit8bde6429b8b271d33ea889bee16b14cd61f2ce6c (patch)
tree76705e0d76b0e9f05c32b4c90860ee2092dd09df /spike_main
parent5ea03e63bcb4b5cdb83c342aa3c7fdf44206a1d4 (diff)
downloadspike-8bde6429b8b271d33ea889bee16b14cd61f2ce6c.zip
spike-8bde6429b8b271d33ea889bee16b14cd61f2ce6c.tar.gz
spike-8bde6429b8b271d33ea889bee16b14cd61f2ce6c.tar.bz2
rvv: disas: add vfunary0/1
Signed-off-by: Chih-Min Chao <chihmin.chao@sifive.com>
Diffstat (limited to 'spike_main')
-rw-r--r--spike_main/disasm.cc28
1 files changed, 26 insertions, 2 deletions
diff --git a/spike_main/disasm.cc b/spike_main/disasm.cc
index afcce42..a892b56 100644
--- a/spike_main/disasm.cc
+++ b/spike_main/disasm.cc
@@ -981,6 +981,19 @@ disassembler_t::disassembler_t(int xlen)
add_insn(new disasm_insn_t(#name ".vf", match_##name##_vf, mask_##name##_vf, \
{&vd, &vs2, &frs1, &opt, &vm})); \
+ #define DISASM_VFUNARY0_INSN(name, pre, extra) \
+ add_insn(new disasm_insn_t(#name "cvt.xu.f.v", match_vfunary0_vv | ((pre << 3) | 0x0ul) << 15, \
+ mask_vfunary0_vv, {&vd, &vs2, &opt, &vm})); \
+ add_insn(new disasm_insn_t(#name "cvt.x.f.v", match_vfunary0_vv | ((pre << 3) | 0x1ul) << 15, \
+ mask_vfunary0_vv, {&vd, &vs2, &opt, &vm})); \
+ add_insn(new disasm_insn_t(#name "cvt.f.xu.v", match_vfunary0_vv | ((pre << 3) | 0x2ul) << 15, \
+ mask_vfunary0_vv, {&vd, &vs2, &opt, &vm})); \
+ add_insn(new disasm_insn_t(#name "cvt.f.x.v", match_vfunary0_vv | ((pre << 3) | 0x3ul) << 15, \
+ mask_vfunary0_vv, {&vd, &vs2, &opt, &vm})); \
+ if (extra) \
+ add_insn(new disasm_insn_t(#name "cvt.f.f.v", match_vfunary0_vv | ((pre << 3) | 0x4ul) << 15, \
+ mask_vfunary0_vv, {&vd, &vs2, &opt, &vm}));
+
//OPFVV/OPFVF
//0b01_0000
DISASM_OPIV_VF_INSN(vfadd);
@@ -1010,8 +1023,18 @@ disassembler_t::disassembler_t(int xlen)
//0b10_0000
DISASM_OPIV_VF_INSN(vfdiv);
DISASM_OPIV__F_INSN(vfrdiv);
- DISASM_OPIV_V__INSN(vfunary0);
- DISASM_OPIV_V__INSN(vfunary1);
+
+ //vfunary0
+ DISASM_VFUNARY0_INSN(vf, 0x0, 0);
+ DISASM_VFUNARY0_INSN(vfw, 0x1, 1);
+ DISASM_VFUNARY0_INSN(vfn, 0x2, 1);
+
+ //vfunary1
+ add_insn(new disasm_insn_t("vfsqrt.v", match_vfunary1_vv, mask_vfunary1_vv, \
+ {&vd, &vs2, &opt, &vm}));
+ add_insn(new disasm_insn_t("vfclass.v", match_vfunary1_vv, mask_vfunary1_vv, \
+ {&vd, &vs2, &opt, &vm}));
+
DISASM_OPIV_VF_INSN(vfmul);
DISASM_OPIV_VF_INSN(vfmadd);
DISASM_OPIV_VF_INSN(vfnmadd);
@@ -1041,6 +1064,7 @@ disassembler_t::disassembler_t(int xlen)
#undef DISASM_OPIV__F_INSN
#undef DISASM_OPIV_S__INSN
#undef DISASM_OPIV_W__INSN
+ #undef DISASM_VFUNARY0_INSN
if (xlen == 32) {
DISASM_INSN("c.flw", c_flw, 0, {&rvc_fp_rs2s, &rvc_lw_address});