aboutsummaryrefslogtreecommitdiff
path: root/riscv/decode.h
diff options
context:
space:
mode:
authorAndrew Waterman <waterman@eecs.berkeley.edu>2013-12-17 10:18:47 -0800
committerAndrew Waterman <waterman@eecs.berkeley.edu>2013-12-17 10:18:47 -0800
commit7f457c47b339cc7c79f56bb277ed8ed989e88ae1 (patch)
tree4a3cc949c4a5631699c69443b1a24049ca01fbb4 /riscv/decode.h
parente85cb99c5e042ebce78f64213677a48ee7ba0491 (diff)
downloadspike-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.h22
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: