make common function for getting bitwidth
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Wed, 24 Oct 2018 04:39:20 +0000 (05:39 +0100)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Wed, 24 Oct 2018 04:39:20 +0000 (05:39 +0100)
riscv/sv.cc
riscv/sv_insn_redirect.cc
riscv/sv_reg.h

index 3947fc6ecc02c196048f85625a2c1d0d9ac9b11f..53abaf46f71a3b8c4762fd9503ad861bfb34e581 100644 (file)
@@ -2,12 +2,12 @@
 #include "sv_decode.h"
 #include "processor.h"
 
-static int get_bitwidth(uint8_t elwidth, int xlen)
+int get_bitwidth(uint8_t elwidth, int xlen)
 {
   switch (elwidth) {
-      case 0: return xlen;
-      case 1: return xlen / 2;
-      case 2: return xlen * 2;
+      case 0: return (xlen == 32)? 64 : 32;
+      case 1: return (xlen == 32)? 32 : 64;
+      case 2: return 16;
       default: return 8;
   }
 }
index 6dd6b414fadb13580613d979e6b6fdfaa87316c8..ac2f58179bc76bf121e39351ecce71ed9ab6221f 100644 (file)
@@ -102,9 +102,9 @@ sv_reg_t (sv_proc_t::READ_REG)(uint64_t i)
 
 sv_reg_t sv_proc_t::get_intreg(reg_t reg)
 {
-    uint8_t elwidth = _insn->reg_elwidth(reg, true);
+    //uint8_t elwidth = _insn->reg_elwidth(reg, true);
     uint64_t data = _insn->p->get_state()->XPR[reg];
-    return sv_reg_t(data, xlen, elwidth);
+    return sv_reg_t(data, xlen, _insn->src_bitwidth);
 }
 
 #define GET_REG(name) \
@@ -268,7 +268,7 @@ sv_reg_t::operator sv_reg_t ()
 
 sv_reg_t sv_proc_t::rv_add(sv_reg_t const & lhs, sv_reg_t const & rhs)
 {
-    uint8_t elwidth = lhs.get_width(rhs);
+    uint8_t bitwidth = _insn->src_bitwidth;
     return lhs + rhs;
 }
 
index 07d411194ecaea76edcd62bafa9316563e526944..08fa686d879c99c6d80f638ec11a0a69996d2ffe 100644 (file)
@@ -6,6 +6,9 @@
 #define sext_bwid(x,wid) (((sreg_t)(x) << (64-wid)) >> (64-wid))
 #define zext_bwid(x,wid) (((reg_t)(x) << (64-wid)) >> (64-wid))
 
+extern int get_bitwidth(uint8_t elwidth, int xlen);
+
+
 class sv_sreg_t;
 
 class sv_regbase_t {
@@ -21,37 +24,10 @@ public:
     uint8_t elwidth;
 public:
   int get_xlen() const { return xlen; }
-  uint8_t get_width() const { return elwidth; }
-  uint8_t get_width(sv_regbase_t const&r) const
-  {
-    // bitfield 0b00=default, 0b01=default/2, 0b10=default*2, 0b11=8-bit
-    uint8_t tb[16] = { 0x0, // default-default: default
-                       0x0, // default-default/2: default
-                       0x2, // default-default*2: default*2
-                       0x0, // default-8: default
-                       0x0, // default/2-default: default
-                       0x1, // default/2-default/2: default/2
-                       0x2, // default/2-default*2: default*2
-                       0x1, // default/2-8: default*2
-                       0x2, // default*2-default: default*2
-                       0x2, // default*2-default/2: default*2
-                       0x2, // default*2-default*2: default*2
-                       0x2, // default*2-8: default*2
-                       0x0, // 8-default: default
-                       0x1, // 8-default/2: default/2
-                       0x2, // 8-default*2: default*2
-                       0x3  // 8-8: 8
-                    };
-    return tb[elwidth|(r.elwidth<<2)];
-  }
+  uint8_t get_elwidth() const { return elwidth; }
   int get_bitwidth() const
   {
-    switch (elwidth) {
-        case 0: return xlen;
-        case 1: return xlen / 2;
-        case 2: return xlen * 2;
-        default: return 8;
-    }
+    return ::get_bitwidth(elwidth, xlen);
   }
   int get_bitwidth(sv_regbase_t const&r) const
   {
@@ -88,7 +64,7 @@ public:
 public:
 
   operator int64_t() const& { return reg; }
-  operator sv_reg_t() const& { return sv_reg_t((uint64_t)reg, get_width()); }
+  operator sv_reg_t() const& { return sv_reg_t((uint64_t)reg, get_elwidth()); }
 };
 
 inline sv_reg_t::operator sv_sreg_t() const &