about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2023-07-23 13:04:14 +0200
committerptitSeb <sebastien.chev@gmail.com>2023-07-23 13:04:14 +0200
commit50032affcf022e8e3259324e1a159b51424ef935 (patch)
tree4429deb5f22e62eea55b2da1f904d974d609bd32 /src
parent784cc3ba9cf4ea807cb91de68d43b9b855c1993e (diff)
downloadbox64-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.c21
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;
+                        }
                     }
                 }
             }