diff options
author | Andrew Waterman <waterman@eecs.berkeley.edu> | 2013-12-17 10:18:47 -0800 |
---|---|---|
committer | Andrew Waterman <waterman@eecs.berkeley.edu> | 2013-12-17 10:18:47 -0800 |
commit | 7f457c47b339cc7c79f56bb277ed8ed989e88ae1 (patch) | |
tree | 4a3cc949c4a5631699c69443b1a24049ca01fbb4 /riscv/decode.h | |
parent | e85cb99c5e042ebce78f64213677a48ee7ba0491 (diff) | |
download | spike-7f457c47b339cc7c79f56bb277ed8ed989e88ae1.zip spike-7f457c47b339cc7c79f56bb277ed8ed989e88ae1.tar.gz spike-7f457c47b339cc7c79f56bb277ed8ed989e88ae1.tar.bz2 |
Speed things up quite a bit
Diffstat (limited to 'riscv/decode.h')
-rw-r--r-- | riscv/decode.h | 22 |
1 files changed, 11 insertions, 11 deletions
diff --git a/riscv/decode.h b/riscv/decode.h index 8e506e2..6c26a68 100644 --- a/riscv/decode.h +++ b/riscv/decode.h @@ -52,21 +52,22 @@ class insn_t { public: uint32_t bits() { return b; } - reg_t i_imm() { return int64_t(int32_t(b) >> 20); } - reg_t s_imm() { return x(7, 5) | (x(25, 7) << 5) | (imm_sign() << 12); } - reg_t sb_imm() { return (x(8, 4) << 1) | (x(25,6) << 5) | (x(7,1) << 11) | (imm_sign() << 12); } - reg_t u_imm() { return int64_t(int32_t(b) >> 12 << 12); } - reg_t uj_imm() { return (x(21, 10) << 1) | (x(20, 1) << 11) | (x(12, 8) << 12) | (imm_sign() << 20); } + int32_t i_imm() { return int32_t(b) >> 20; } + int32_t s_imm() { return x(7, 5) + (xs(25, 7) << 5); } + int32_t sb_imm() { return (x(8, 4) << 1) + (x(25,6) << 5) + (x(7,1) << 11) + (imm_sign() << 12); } + int32_t u_imm() { return int32_t(b) >> 12 << 12; } + int32_t uj_imm() { return (x(21, 10) << 1) + (x(20, 1) << 11) + (x(12, 8) << 12) + (imm_sign() << 20); } uint32_t rd() { return x(7, 5); } uint32_t rs1() { return x(15, 5); } uint32_t rs2() { return x(20, 5); } uint32_t rs3() { return x(27, 5); } uint32_t rm() { return x(12, 3); } - reg_t csr() { return x(20, 12); } + uint32_t csr() { return x(20, 12); } private: uint32_t b; - reg_t x(int lo, int len) { return b << (32-lo-len) >> (32-len); } - reg_t imm_sign() { return int64_t(int32_t(b) >> 31); } + uint32_t x(int lo, int len) { return b << (32-lo-len) >> (32-len); } + uint32_t xs(int lo, int len) { return int32_t(b) << (32-lo-len) >> (32-len); } + uint32_t imm_sign() { return xs(31, 1); } }; template <class T, size_t N, bool zero_reg> @@ -79,12 +80,11 @@ public: } void write(size_t i, T value) { - data[i] = value; + if (!(zero_reg && i == 0)) + data[i] = value; } const T& operator [] (size_t i) const { - if (zero_reg) - const_cast<T&>(data[0]) = 0; return data[i]; } private: |