diff options
author | Andrew Waterman <waterman@cs.berkeley.edu> | 2016-04-29 00:06:43 -0700 |
---|---|---|
committer | Andrew Waterman <waterman@cs.berkeley.edu> | 2016-04-29 00:06:43 -0700 |
commit | de16a763e6bf266ad49384fa131a502a6174e7ba (patch) | |
tree | 3dc646fc74f93864456f51467eabd4bb1d621ac2 /machine | |
parent | 1baf122e28fc19af687033358d078bf8e6bab741 (diff) | |
download | pk-de16a763e6bf266ad49384fa131a502a6174e7ba.zip pk-de16a763e6bf266ad49384fa131a502a6174e7ba.tar.gz pk-de16a763e6bf266ad49384fa131a502a6174e7ba.tar.bz2 |
Use mbadaddr to speed up misaligned ld/st emulation
Diffstat (limited to 'machine')
-rw-r--r-- | machine/misaligned_ldst.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/machine/misaligned_ldst.c b/machine/misaligned_ldst.c index cf6b1d6..2225ea1 100644 --- a/machine/misaligned_ldst.c +++ b/machine/misaligned_ldst.c @@ -14,7 +14,7 @@ void misaligned_load_trap(uintptr_t* regs, uintptr_t mcause, uintptr_t mepc) union byte_array val; uintptr_t mstatus; insn_t insn = get_insn(mepc, &mstatus); - uintptr_t addr = GET_RS1(insn, regs) + IMM_I(insn); + uintptr_t addr = read_csr(mbadaddr); int shift = 0, fp = 0, len; if ((insn & MASK_LW) == MATCH_LW) @@ -77,7 +77,7 @@ void misaligned_store_trap(uintptr_t* regs, uintptr_t mcause, uintptr_t mepc) else return truly_illegal_insn(regs, mcause, mepc, mstatus, insn); - uintptr_t addr = GET_RS1(insn, regs) + IMM_S(insn); + uintptr_t addr = read_csr(mbadaddr); for (int i = 0; i < len; i++) store_uint8_t((void *)(addr + i), val.bytes[i], mepc); |