aboutsummaryrefslogtreecommitdiff
path: root/riscv/decode_macros.h
diff options
context:
space:
mode:
Diffstat (limited to 'riscv/decode_macros.h')
-rw-r--r--riscv/decode_macros.h17
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)))