diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2023-03-25 22:23:02 +0000 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2023-03-25 22:23:02 +0000 |
| commit | 56e161d1ff2c1aef1d4f54d030b5f07354d20554 (patch) | |
| tree | 7f7ced5a7f82a602c5c2cd0ec3c7841b4ba66a62 /src | |
| parent | 85da2b7e235a1d289ca957cbe926896ed882a094 (diff) | |
| download | box64-56e161d1ff2c1aef1d4f54d030b5f07354d20554.tar.gz box64-56e161d1ff2c1aef1d4f54d030b5f07354d20554.zip | |
[RV64_DYNAREC] Fixed CreateJumpNext function
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_helper.c | 10 | ||||
| -rw-r--r-- | src/dynarec/rv64/dynarec_rv64_jmpnext.c | 10 |
2 files changed, 13 insertions, 7 deletions
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 |