abstract regfile behind object
authorAndrew Waterman <waterman@eecs.berkeley.edu>
Tue, 20 Mar 2012 00:15:38 +0000 (17:15 -0700)
committerAndrew Waterman <waterman@eecs.berkeley.edu>
Tue, 20 Mar 2012 00:15:38 +0000 (17:15 -0700)
riscv/decode.h
riscv/htif.cc
riscv/processor.cc
riscv/processor.h

index 6fa0a4bb47b850376a5ac1ee9d2efc33d784f139..eb13b53751f5ce64d9b44915468901ac63cb297c 100644 (file)
@@ -137,26 +137,26 @@ union insn_t
 };
 
 #include <stdio.h>
-class do_writeback
+template <class T, size_t N, bool zero_reg>
+class regfile_t
 {
 public:
-  do_writeback(reg_t* _rf, int _rd) : rf(_rf), rd(_rd) {}
-
-  const do_writeback& operator = (reg_t rhs)
+  void reset()
   {
-#if 0
-    printf("R[%x] <= %llx\n",rd,(long long)rhs);
-#endif
-    rf[rd] = rhs;
-    rf[0] = 0;
-    return *this;
+    memset(data, 0, sizeof(data));
+  }
+  T& operator [] (size_t i)
+  {
+    if (zero_reg)
+      data[0] = 0;
+    return data[i];
+  }
+  const T& operator [] (size_t i) const
+  {
+    return const_cast<regfile_t<T,N,zero_reg>&>(*this)[i];
   }
-
-  operator reg_t() { return rf[rd]; }
-
 private:
-  reg_t* rf;
-  int rd;
+  T data[N];
 };
 
 #define throw_illegal_instruction \
@@ -166,8 +166,8 @@ private:
 // helpful macros, etc
 #define RS1 XPR[insn.rtype.rs1]
 #define RS2 XPR[insn.rtype.rs2]
-#define RD do_writeback(XPR,insn.rtype.rd)
-#define RA do_writeback(XPR,1)
+#define RD XPR[insn.rtype.rd]
+#define RA XPR[1]
 #define FRS1 FPR[insn.ftype.rs1]
 #define FRS2 FPR[insn.ftype.rs2]
 #define FRS3 FPR[insn.ftype.rs3]
@@ -211,7 +211,7 @@ private:
 #define require_rvc if(!(sr & SR_EC)) throw_illegal_instruction
 
 #define CRD_REGNUM ((insn.bits >> 5) & 0x1f)
-#define CRD do_writeback(XPR, CRD_REGNUM)
+#define CRD XPR[CRD_REGNUM]
 #define CRS1 XPR[(insn.bits >> 10) & 0x1f]
 #define CRS2 XPR[(insn.bits >> 5) & 0x1f]
 #define CIMM6 ((int32_t)((insn.bits >> 10) & 0x3f) << 26 >> 26)
@@ -237,8 +237,8 @@ static const int rvc_rs2_regmap[8] = { 20, 21, 2, 3, 4, 5, 6, 0 };
 
 #define UT_RS1(idx) uts[idx]->XPR[insn.rtype.rs1]
 #define UT_RS2(idx) uts[idx]->XPR[insn.rtype.rs2]
-#define UT_RD(idx) do_writeback(uts[idx]->XPR,insn.rtype.rd)
-#define UT_RA(idx) do_writeback(uts[idx]->XPR,1)
+#define UT_RD(idx) uts[idx]->XPR[insn.rtype.rd]
+#define UT_RA(idx) uts[idx]->XPR[1]
 #define UT_FRS1(idx) uts[idx]->FPR[insn.ftype.rs1]
 #define UT_FRS2(idx) uts[idx]->FPR[insn.ftype.rs2]
 #define UT_FRS3(idx) uts[idx]->FPR[insn.ftype.rs3]
index 043923694a1527c4be6c4e0a18021c95c254432d..9aa9a7c22cf0bb1a5c60ba72c88410fa1ebbb1b8 100644 (file)
@@ -32,8 +32,8 @@ struct packet
 };
 
 htif_t::htif_t(int _tohost_fd, int _fromhost_fd)
-  : sim(NULL), tohost_fd(_tohost_fd), fromhost_fd(_fromhost_fd), seqno(1),
-    reset(true)
+  : sim(NULL), tohost_fd(_tohost_fd), fromhost_fd(_fromhost_fd),
+    reset(true), seqno(1)
 {
 }
 
index 6df910cd423c976d7889085c76a87f0c3ac23454..9785799f974f85efef64929e48ab5dc611d3a3d8 100644 (file)
@@ -48,8 +48,8 @@ void processor_t::reset()
 
   // the following state is undefined upon boot-up,
   // but we zero it for determinism
-  memset(XPR,0,sizeof(XPR));
-  memset(FPR,0,sizeof(FPR));
+  XPR.reset();
+  FPR.reset();
 
   pc = 0;
   epc = 0;
index 1e007a8fbdbb1829bdfbb673feaa4687578dbbb4..09fac00277b6796023b359e868ddd5192c21b57c 100644 (file)
@@ -28,8 +28,8 @@ private:
   mmu_t& mmu; // main memory is always accessed via the mmu
 
   // user-visible architected state
-  reg_t XPR[NXPR];
-  freg_t FPR[NFPR];
+  regfile_t<reg_t, NXPR, true> XPR;
+  regfile_t<freg_t, NFPR, false> FPR;
   reg_t pc;
 
   // counters