diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2023-07-23 13:04:14 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2023-07-23 13:04:14 +0200 |
| commit | 50032affcf022e8e3259324e1a159b51424ef935 (patch) | |
| tree | 4429deb5f22e62eea55b2da1f904d974d609bd32 /src | |
| parent | 784cc3ba9cf4ea807cb91de68d43b9b855c1993e (diff) | |
| download | box64-50032affcf022e8e3259324e1a159b51424ef935.tar.gz box64-50032affcf022e8e3259324e1a159b51424ef935.zip | |
[DYNAREC] Improvments to BOX64_DYNAREC_FORWARD handling
Diffstat (limited to 'src')
| -rw-r--r-- | src/dynarec/dynarec_native_pass.c | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/src/dynarec/dynarec_native_pass.c b/src/dynarec/dynarec_native_pass.c index 3e947e61..b5389f43 100644 --- a/src/dynarec/dynarec_native_pass.c +++ b/src/dynarec/dynarec_native_pass.c @@ -213,13 +213,20 @@ uintptr_t native_pass(dynarec_native_t* dyn, uintptr_t addr, int alternate, int } if(box64_dynarec_dump) dynarec_log(LOG_NONE, "Extend block %p, %p -> %p (ninst=%d, jump from %d)\n", dyn, (void*)addr, (void*)next, ninst, reset_n); } else if(next && (next-addr)<box64_dynarec_forward && (getProtection(next)&PROT_READ)/*box64_dynarec_bigblock>=stopblock*/) { - if(!((box64_dynarec_bigblock<stopblock) && !isJumpTableDefault64((void*)next)) && !dyn->forward) { - dyn->forward = addr; - dyn->forward_to = next; - dyn->forward_size = dyn->size; - dyn->forward_ninst = ninst; - reset_n = -2; - ok = 1; + if(!((box64_dynarec_bigblock<stopblock) && !isJumpTableDefault64((void*)next))) { + if(dyn->forward) { + if(next<dyn->forward_to) + dyn->forward_to = next; + reset_n = -2; + ok = 1; + } else { + dyn->forward = addr; + dyn->forward_to = next; + dyn->forward_size = dyn->size; + dyn->forward_ninst = ninst; + reset_n = -2; + ok = 1; + } } } } |