diff options
author | Andrew Waterman <andrew@sifive.com> | 2022-06-06 20:27:35 -0700 |
---|---|---|
committer | Andrew Waterman <andrew@sifive.com> | 2022-06-06 20:54:10 -0700 |
commit | fea4a75d37a0d63e0df41efaea53114248c790c5 (patch) | |
tree | 6c28ed6bd470c04bc03ca832e1d730ac1f42a5c5 | |
parent | caf5a420ef7414031368739e16d60f3f418aa6ac (diff) | |
download | spike-fea4a75d37a0d63e0df41efaea53114248c790c5.zip spike-fea4a75d37a0d63e0df41efaea53114248c790c5.tar.gz spike-fea4a75d37a0d63e0df41efaea53114248c790c5.tar.bz2 |
insn_t: don't rely on sign-extension of internal encoding
-rw-r--r-- | riscv/decode.h | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/riscv/decode.h b/riscv/decode.h index 6c90e21..d56d496 100644 --- a/riscv/decode.h +++ b/riscv/decode.h @@ -81,11 +81,11 @@ public: insn_t(insn_bits_t bits) : b(bits) {} insn_bits_t bits() { return b & ~((UINT64_MAX) << (length() * 8)); } int length() { return insn_length(b); } - int64_t i_imm() { return int64_t(b) >> 20; } + int64_t i_imm() { return xs(20, 12); } int64_t shamt() { return x(20, 6); } int64_t s_imm() { return x(7, 5) + (xs(25, 7) << 5); } int64_t sb_imm() { return (x(8, 4) << 1) + (x(25, 6) << 5) + (x(7, 1) << 11) + (imm_sign() << 12); } - int64_t u_imm() { return int64_t(b) >> 12 << 12; } + int64_t u_imm() { return xs(12, 20) << 12; } int64_t uj_imm() { return (x(21, 10) << 1) + (x(20, 1) << 11) + (x(12, 8) << 12) + (imm_sign() << 20); } uint64_t rd() { return x(7, 5); } uint64_t rs1() { return x(15, 5); } @@ -144,7 +144,7 @@ private: insn_bits_t b; uint64_t x(int lo, int len) { return (b >> lo) & ((insn_bits_t(1) << len) - 1); } uint64_t xs(int lo, int len) { return int64_t(b) << (64 - lo - len) >> (64 - len); } - uint64_t imm_sign() { return xs(63, 1); } + uint64_t imm_sign() { return xs(31, 1); } }; template <class T, size_t N, bool zero_reg> |