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