diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2022-07-16 21:57:55 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2022-07-16 21:57:55 +0200 |
| commit | 6e82268704457fb1172e02bab7b9e551a092473c (patch) | |
| tree | 5aeb00a09db7388b5c01bf3b246aa775ead81479 /src | |
| parent | 4142cc296bc17f0ac7de45f22685e2d2d027a7ef (diff) | |
| download | box64-6e82268704457fb1172e02bab7b9e551a092473c.tar.gz box64-6e82268704457fb1172e02bab7b9e551a092473c.zip | |
[DYNAREC] Improved handlinf of RIP value
Diffstat (limited to 'src')
| -rwxr-xr-x | src/dynarec/arm64/dynarec_arm64_00.c | 8 | ||||
| -rwxr-xr-x | src/dynarec/arm64/dynarec_arm64_pass2.h | 2 | ||||
| -rwxr-xr-x | src/dynarec/arm64/dynarec_arm64_pass3.h | 2 | ||||
| -rwxr-xr-x | src/dynarec/dynarec_native_pass.c | 2 |
4 files changed, 10 insertions, 4 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_00.c b/src/dynarec/arm64/dynarec_arm64_00.c index 97a0b996..37ec3fa8 100755 --- a/src/dynarec/arm64/dynarec_arm64_00.c +++ b/src/dynarec/arm64/dynarec_arm64_00.c @@ -2082,7 +2082,11 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin SETFLAGS(X_ALL, SF_SET); // Hack to set flags to "dont'care" state BARRIER(BARRIER_FULL); //BARRIER_NEXT(BARRIER_FULL); - TABLE64(x2, addr); + if(dyn->last_ip && (addr-dyn->last_ip<0x1000)) { + ADDx_U12(x2, xRIP, addr-dyn->last_ip); + } else { + TABLE64(x2, addr); + } PUSH1(x2); MESSAGE(LOG_DUMP, "Native Call to %s (retn=%d)\n", GetNativeName(GetNativeFnc(dyn->insts[ninst].natcall-1)), dyn->insts[ninst].retn); // calling a native function @@ -2091,6 +2095,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin //GETIP(ip+3+8+8); // read the 0xCC call_n(dyn, ninst, *(void**)(dyn->insts[ninst].natcall+2+8), tmp); POP1(xRIP); // pop the return address + dyn->last_ip = addr; } else { GETIP_(dyn->insts[ninst].natcall); // read the 0xCC already STORE_XEMU_CALL(xRIP); @@ -2112,6 +2117,7 @@ uintptr_t dynarec64_00(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, int nin MARK; LOAD_XEMU_REM(); // load remaining register, has they have changed jump_to_epilog(dyn, 0, xRIP, ninst); + dyn->last_ip = addr; } break; default: diff --git a/src/dynarec/arm64/dynarec_arm64_pass2.h b/src/dynarec/arm64/dynarec_arm64_pass2.h index 3de38aad..4a5122c2 100755 --- a/src/dynarec/arm64/dynarec_arm64_pass2.h +++ b/src/dynarec/arm64/dynarec_arm64_pass2.h @@ -7,7 +7,7 @@ if(ninst) { \ dyn->insts[ninst].address = (dyn->insts[ninst-1].address+dyn->insts[ninst-1].size); \ if(ninst && isInstClean(dyn, ninst)) { \ - dyn->last_ip = 0; \ + if(dyn->last_ip!=ip) dyn->last_ip = 0; \ ++dyn->sons_size; \ } \ } diff --git a/src/dynarec/arm64/dynarec_arm64_pass3.h b/src/dynarec/arm64/dynarec_arm64_pass3.h index 8b69098f..099ef09a 100755 --- a/src/dynarec/arm64/dynarec_arm64_pass3.h +++ b/src/dynarec/arm64/dynarec_arm64_pass3.h @@ -9,7 +9,7 @@ #define MESSAGE(A, ...) if(box64_dynarec_dump) dynarec_log(LOG_NONE, __VA_ARGS__) #define NEW_INST \ if(ninst && isInstClean(dyn, ninst)) { \ - dyn->last_ip = 0; \ + if(dyn->last_ip!=ip) dyn->last_ip = 0; \ dyn->sons_x64[dyn->sons_size] = (uintptr_t)ip; \ dyn->sons_native[dyn->sons_size] = dyn->block; \ MESSAGE(LOG_DUMP, "----> potential Son here %p/%p\n", (void*)ip, dyn->block); \ diff --git a/src/dynarec/dynarec_native_pass.c b/src/dynarec/dynarec_native_pass.c index 69bd5f83..02b55774 100755 --- a/src/dynarec/dynarec_native_pass.c +++ b/src/dynarec/dynarec_native_pass.c @@ -104,7 +104,7 @@ uintptr_t native_pass(dynarec_native_t* dyn, uintptr_t addr) } } reset_n = -1; - } else if(dyn->insts[ninst].pred_sz!=1) + } else if(ninst && (dyn->insts[ninst].pred_sz!=1 || dyn->insts[ninst].pred[0]!=ninst-1)) dyn->last_ip = 0; // reset IP if some jump are comming here // propagate ST stack state, especial stack pop that are defered if(dyn->n.stack_pop) { |