Browse Source

insn_t: don't rely on sign-extension of internal encoding

pull/1027/head
Andrew Waterman 4 years ago
parent
commit
fea4a75d37
  1. 6
      riscv/decode.h

6
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>

Loading…
Cancel
Save