From 56e161d1ff2c1aef1d4f54d030b5f07354d20554 Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Sat, 25 Mar 2023 22:23:02 +0000 Subject: [RV64_DYNAREC] Fixed CreateJumpNext function --- src/dynarec/rv64/dynarec_rv64_helper.c | 10 +++++----- src/dynarec/rv64/dynarec_rv64_jmpnext.c | 10 ++++++++-- 2 files changed, 13 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/dynarec/rv64/dynarec_rv64_helper.c b/src/dynarec/rv64/dynarec_rv64_helper.c index bcdf9cc7..140bac68 100644 --- a/src/dynarec/rv64/dynarec_rv64_helper.c +++ b/src/dynarec/rv64/dynarec_rv64_helper.c @@ -235,19 +235,19 @@ void jump_to_next(dynarec_rv64_t* dyn, uintptr_t ip, int reg, int ninst) SRLI(x2, xRIP, JMPTABL_START3); SLLI(x2, x2, 3); ADD(x3, x3, x2); - LD(x3, x3, 0); + LD(x3, x3, 0); // could be LR_D(x3, x3, 1, 1); for better safety MOV64x(x4, JMPTABLE_MASK2<<3); // x4 = mask SRLI(x2, xRIP, JMPTABL_START2-3); AND(x2, x2, x4); ADD(x3, x3, x2); - LD(x3, x3, 0); + LD(x3, x3, 0); //LR_D(x3, x3, 1, 1); if(JMPTABLE_MASK2!=JMPTABLE_MASK1) { MOV64x(x4, JMPTABLE_MASK1<<3); // x4 = mask } SRLI(x2, xRIP, JMPTABL_START1-3); AND(x2, x2, x4); ADD(x3, x3, x2); - LD(x3, x3, 0); + LD(x3, x3, 0); //LR_D(x3, x3, 1, 1); if(JMPTABLE_MASK0<2048) { ANDI(x2, xRIP, JMPTABLE_MASK0); } else { @@ -258,13 +258,13 @@ void jump_to_next(dynarec_rv64_t* dyn, uintptr_t ip, int reg, int ninst) } SLLI(x2, x2, 3); ADD(x3, x3, x2); - LD(x2, x3, 0); + LD(x2, x3, 0); //LR_D(x2, x3, 1, 1); } else { uintptr_t p = getJumpTableAddress64(ip); MAYUSE(p); TABLE64(x3, p); GETIP_(ip); - LD(x2, x3, 0); + LD(x2, x3, 0); //LR_D(x2, x3, 1, 1); } if(reg!=A1) { MV(A1, xRIP); diff --git a/src/dynarec/rv64/dynarec_rv64_jmpnext.c b/src/dynarec/rv64/dynarec_rv64_jmpnext.c index 5f58183f..9150dd44 100644 --- a/src/dynarec/rv64/dynarec_rv64_jmpnext.c +++ b/src/dynarec/rv64/dynarec_rv64_jmpnext.c @@ -7,7 +7,13 @@ void CreateJmpNext(void* addr, void* next) { uint32_t* block = (uint32_t*)addr; uintptr_t diff = (intptr_t)next - (intptr_t)addr; - AUIPC(x2, diff>>12); - LD(x2, x2, diff&0b111111111111); + AUIPC(x2, SPLIT20(diff)); + #if 1 + LD(x2, x2, SPLIT12(diff)); + #else + // Probably not usefull, but keeping the code, just in case + ADDI(x2, x2, SPLIT12(diff)); + LR_D(x2, x2, 1, 1); + #endif BR(x2); } \ No newline at end of file -- cgit 1.4.1