redirect freg through getter macro, to keep elwidth state
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Sat, 27 Oct 2018 07:19:54 +0000 (08:19 +0100)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Sat, 27 Oct 2018 07:19:54 +0000 (08:19 +0100)
riscv/sv_insn_redirect.cc
riscv/sv_insn_redirect.h

index d94671ee5cefc4d7efe03b4342813484eb3482eb..893a4888c8b002e88b8e2fc19730b615216734b0 100644 (file)
@@ -168,6 +168,13 @@ sv_reg_t sv_proc_t::get_intreg(reg_spec_t const&spec)
     return sv_reg_t(data, xlen, bitwidth);
 }
 
+sv_freg_t sv_proc_t::get_fpreg(reg_spec_t const&spec)
+{
+    freg_t data = READ_FREG(spec);
+    uint8_t bitwidth = _insn->src_bitwidth;
+    return sv_freg_t(data, xlen, bitwidth);
+}
+
 #define GET_REG(name) \
     sv_reg_t sv_proc_t::get_##name() \
     { \
@@ -188,31 +195,18 @@ sv_reg_t sv_proc_t::get_rvc_sp()
     return get_intreg({X_SP, _insn->get_sp_offs()});
 }
 
-sv_freg_t sv_proc_t::get_frs1()
-{
-    reg_spec_t spec = _insn->rs1();
-    return READ_FREG(spec);
-}
-
-sv_freg_t sv_proc_t::get_frs3()
-{
-    return READ_FREG(_insn->rs3());
-}
-
-sv_freg_t sv_proc_t::get_frs2()
-{
-    return READ_FREG(_insn->rs2());
-}
-
-sv_freg_t sv_proc_t::get_rvc_frs2s()
-{
-    return READ_FREG(_insn->rvc_rs2s());
-}
+#define GET_FPREG(name, getter) \
+    sv_freg_t sv_proc_t::get_##name() \
+    { \
+        reg_spec_t reg = _insn->getter (); \
+        return get_fpreg(reg); \
+    }
 
-sv_freg_t sv_proc_t::get_rvc_frs2()
-{
-    return READ_FREG(_insn->rvc_rs2());
-}
+GET_FPREG(frs1, rs1)
+GET_FPREG(frs2, rs2)
+GET_FPREG(frs3, rs3)
+GET_FPREG(rvc_frs2, rvc_rs2)
+GET_FPREG(rvc_frs2s, rvc_rs2s)
 
 sv_reg_t sv_proc_t::get_shamt()
 {
index bbf62f3cb523c63ac184f0060f26604acbb25aa0..159a10b0a894e0765351a41cfc0746403f4992fd 100644 (file)
@@ -107,6 +107,7 @@ public:
 
 private:
     sv_reg_t get_intreg(reg_spec_t const&reg);
+    sv_freg_t get_fpreg(reg_spec_t const&reg);
 
 public:
     sv_reg_t get_rs1();