aboutsummaryrefslogtreecommitdiff
path: root/pk/mtrap.h
diff options
context:
space:
mode:
authorAndrew Waterman <waterman@cs.berkeley.edu>2015-03-14 02:06:21 -0700
committerAndrew Waterman <waterman@cs.berkeley.edu>2015-03-14 02:06:21 -0700
commit40668501fa8d52054f5678db4e6dd32b5ed7fe15 (patch)
tree3e3815cca73f9afd872e251e4ab206f3badcf425 /pk/mtrap.h
parent438823e1308b219aa7daf11cf86e3028e9b8667d (diff)
downloadpk-40668501fa8d52054f5678db4e6dd32b5ed7fe15.zip
pk-40668501fa8d52054f5678db4e6dd32b5ed7fe15.tar.gz
pk-40668501fa8d52054f5678db4e6dd32b5ed7fe15.tar.bz2
Fix some bugs in FP emulation
Diffstat (limited to 'pk/mtrap.h')
-rw-r--r--pk/mtrap.h5
1 files changed, 3 insertions, 2 deletions
diff --git a/pk/mtrap.h b/pk/mtrap.h
index f5b0cfa..844935b 100644
--- a/pk/mtrap.h
+++ b/pk/mtrap.h
@@ -106,6 +106,7 @@ typedef uintptr_t (*emulation_func)(uintptr_t, uintptr_t*, insn_t, uintptr_t, ui
uintptr_t offset = ((insn) >> ((pos)-3)) & 0xf8; \
uintptr_t tmp; \
asm volatile ("1: auipc %0, %%pcrel_hi(put_f32_reg); add %0, %0, %2; jalr t0, %0, %%pcrel_lo(1b)" : "=&r"(tmp) : "r"(value), "r"(offset) : "t0"); })
+# define init_fp_reg(i) SET_F32_REG((i) << 3, 3, 0, 0)
# define GET_F64_REG(insn, pos, regs) ({ \
register uintptr_t value asm("a0") = ((insn) >> ((pos)-3)) & 0xf8; \
uintptr_t tmp; \
@@ -160,8 +161,8 @@ typedef uintptr_t (*emulation_func)(uintptr_t, uintptr_t*, insn_t, uintptr_t, ui
#define GET_F64_RS1(insn, regs) (GET_F64_REG(insn, 15, regs))
#define GET_F64_RS2(insn, regs) (GET_F64_REG(insn, 20, regs))
#define GET_F64_RS3(insn, regs) (GET_F64_REG(insn, 27, regs))
-#define SET_F32_RD(insn, regs, val) (SET_F32_REG(insn, 15, regs, val), SET_FS_DIRTY())
-#define SET_F64_RD(insn, regs, val) (SET_F64_REG(insn, 15, regs, val), SET_FS_DIRTY())
+#define SET_F32_RD(insn, regs, val) (SET_F32_REG(insn, 7, regs, val), SET_FS_DIRTY())
+#define SET_F64_RD(insn, regs, val) (SET_F64_REG(insn, 7, regs, val), SET_FS_DIRTY())
#define SET_FS_DIRTY() set_csr(mstatus, MSTATUS_FS)
typedef struct {