redirect mmu load function(s) through sv_proc_t
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Sun, 28 Oct 2018 13:16:14 +0000 (13:16 +0000)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Sun, 28 Oct 2018 13:16:14 +0000 (13:16 +0000)
riscv/mmu.h
riscv/sv_insn_redirect.cc
riscv/sv_insn_redirect.h
riscv/sv_mmu.cc

index fc8d5b3ea100b7606b1071ebd7fe2375d4cb6dd1..e3e8d0b0655bb5ce581bf35ebb8bb5164ab46f1b 100644 (file)
@@ -360,6 +360,7 @@ private:
   trigger_matched_t *matched_trigger;
 
   friend class processor_t;
+  friend class sv_mmu_t;
 };
 
 struct vm_info {
index 90eaf246f61ee3875a6eafc04d5f0c222c8ceb2c..3ee1ad84a4a74a56f2044532e6be0f4a856072f9 100644 (file)
@@ -923,3 +923,10 @@ sv_float128_t sv_proc_t::f64_to_f128( sv_float64_t a)
     return ::f64_to_f128(a);
 }
 
+//-----
+
+sv_reg_t sv_proc_t::adjust_load(sv_reg_t const& v, size_t width, bool ext)
+{
+    return v;
+}
+
index a23d1bdf354e3c17d85a0205d6e9a07c7ff6c75a..30a00bcf4ecb6cda2e4bd986d59f2d1d9511458f 100644 (file)
@@ -266,6 +266,7 @@ public:
 
     sv_freg_t fsgnj128(sv_freg_t a, sv_freg_t b, bool n, bool x);
 
+    sv_reg_t adjust_load(sv_reg_t const& v, size_t width, bool ext);
 
 #include "sv_insn_decl.h"
 };
index 4205397c37db1690b7cc7246528e793eff23bcef..fa2065158c9e5199d9c6a29380cc5bdbf9f87af4 100644 (file)
@@ -1,22 +1,22 @@
 #include "sv_mmu.h"
 
-#define sv_load_func(type) \
+#define sv_load_func(type, ext) \
 sv_reg_t sv_mmu_t::load_##type(reg_t const& addr) { \
   type##_t v = mmu_t::load_##type(addr); \
-  return sv_reg_t(v); \
+  return proc->s.adjust_load(sv_reg_t(v), sizeof(type##_t), ext); \
 } 
 
 // load value from memory at aligned address; zero extend to register width
-sv_load_func(uint8)
-sv_load_func(uint16)
-sv_load_func(uint32)
-sv_load_func(uint64)
+sv_load_func(uint8, true )
+sv_load_func(uint16, true )
+sv_load_func(uint32, true )
+sv_load_func(uint64, true )
 
 // load value from memory at aligned address; sign extend to register width
-sv_load_func(int8)
-sv_load_func(int16)
-sv_load_func(int32)
-sv_load_func(int64)
+sv_load_func(int8, false )
+sv_load_func(int16, false )
+sv_load_func(int32, false )
+sv_load_func(int64, false )
 
 #define sv_store_func(type) \
 void sv_mmu_t::store_##type(sv_reg_t const& addr, type##_t val) { \