aboutsummaryrefslogtreecommitdiff
path: root/riscv/decode.h
diff options
context:
space:
mode:
authorAndrew Waterman <waterman@eecs.berkeley.edu>2012-03-19 17:15:38 -0700
committerAndrew Waterman <waterman@eecs.berkeley.edu>2012-03-19 17:15:38 -0700
commit672b0eb7de769a72ed7c4f8cd471d433843ef690 (patch)
treec27f1778c00f68967533c3c9daac63e59c5bee0c /riscv/decode.h
parent128c0d6d8addf3a2edcc706373838db7e9a8fbc4 (diff)
downloadspike-672b0eb7de769a72ed7c4f8cd471d433843ef690.zip
spike-672b0eb7de769a72ed7c4f8cd471d433843ef690.tar.gz
spike-672b0eb7de769a72ed7c4f8cd471d433843ef690.tar.bz2
abstract regfile behind object
Diffstat (limited to 'riscv/decode.h')
-rw-r--r--riscv/decode.h40
1 files changed, 20 insertions, 20 deletions
diff --git a/riscv/decode.h b/riscv/decode.h
index 6fa0a4b..eb13b53 100644
--- a/riscv/decode.h
+++ b/riscv/decode.h
@@ -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]