diff options
author | Andrew Waterman <waterman@eecs.berkeley.edu> | 2012-03-19 17:15:38 -0700 |
---|---|---|
committer | Andrew Waterman <waterman@eecs.berkeley.edu> | 2012-03-19 17:15:38 -0700 |
commit | 672b0eb7de769a72ed7c4f8cd471d433843ef690 (patch) | |
tree | c27f1778c00f68967533c3c9daac63e59c5bee0c /riscv/decode.h | |
parent | 128c0d6d8addf3a2edcc706373838db7e9a8fbc4 (diff) | |
download | spike-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.h | 40 |
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] |