diff options
Diffstat (limited to 'riscv/decode_macros.h')
-rw-r--r-- | riscv/decode_macros.h | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/riscv/decode_macros.h b/riscv/decode_macros.h index 4050000..bd871fa 100644 --- a/riscv/decode_macros.h +++ b/riscv/decode_macros.h @@ -60,6 +60,23 @@ #define SP READ_REG(X_SP) #define RA READ_REG(X_RA) +// Zdinx macros +#define READ_REG_PAIR(reg) ({ \ + require((reg) % 2 == 0); \ + (reg) == 0 ? reg_t(0) : \ + (READ_REG((reg) + 1) << 32) + zext32(READ_REG(reg)); }) + +#define RS1_PAIR READ_REG_PAIR(insn.rs1()) +#define RS2_PAIR READ_REG_PAIR(insn.rs2()) +#define RD_PAIR READ_REG_PAIR(insn.rd()) + +#define WRITE_RD_PAIR(value) \ + if (insn.rd() != 0) { \ + require(insn.rd() % 2 == 0); \ + WRITE_REG(insn.rd(), sext32(value)); \ + WRITE_REG(insn.rd() + 1, (sreg_t(value)) >> 32); \ + } + // FPU macros #define READ_ZDINX_REG(reg) (xlen == 32 ? f64(READ_REG_PAIR(reg)) : f64(STATE.XPR[reg] & (uint64_t)-1)) #define READ_FREG_H(reg) (p->extension_enabled(EXT_ZFINX) ? f16(STATE.XPR[reg] & (uint16_t)-1) : f16(READ_FREG(reg))) |