aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Waterman <andrew@sifive.com>2022-06-06 20:27:35 -0700
committerAndrew Waterman <andrew@sifive.com>2022-06-06 20:54:10 -0700
commitfea4a75d37a0d63e0df41efaea53114248c790c5 (patch)
tree6c28ed6bd470c04bc03ca832e1d730ac1f42a5c5
parentcaf5a420ef7414031368739e16d60f3f418aa6ac (diff)
downloadspike-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.h6
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>