about summary refs log tree commit diff stats
path: root/src/dynarec/dynarec_native_pass.c
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2023-12-13 13:05:38 +0100
committerptitSeb <sebastien.chev@gmail.com>2023-12-13 13:05:38 +0100
commit88575ebc5d0df38c709f199e85030fa5435a1a4a (patch)
tree5c4e32ac6eb266f3085bb3a9c2583ce9a5031a78 /src/dynarec/dynarec_native_pass.c
parentd8a19e98327e723588bfac16d6d96e8730c30199 (diff)
downloadbox64-88575ebc5d0df38c709f199e85030fa5435a1a4a.tar.gz
box64-88575ebc5d0df38c709f199e85030fa5435a1a4a.zip
[DYNAREC] Made callret default, improved callret efficiency, and dynarec speed on larger blocks
Diffstat (limited to 'src/dynarec/dynarec_native_pass.c')
-rw-r--r--src/dynarec/dynarec_native_pass.c10
1 files changed, 4 insertions, 6 deletions
diff --git a/src/dynarec/dynarec_native_pass.c b/src/dynarec/dynarec_native_pass.c
index e67a9848..5686e322 100644
--- a/src/dynarec/dynarec_native_pass.c
+++ b/src/dynarec/dynarec_native_pass.c
@@ -77,9 +77,11 @@ uintptr_t native_pass(dynarec_native_t* dyn, uintptr_t addr, int alternate, int
             dyn->last_ip = 0;   // reset IP if some jump are coming here
         fpu_propagate_stack(dyn, ninst);
         NEW_INST;
+        #if STEP == 0
         if(ninst && dyn->insts[ninst-1].x64.barrier_next) {
             BARRIER(dyn->insts[ninst-1].x64.barrier_next);
         }
+        #endif
         if(!ninst) {
             GOTEST(x1, x2);
         }
@@ -214,12 +216,8 @@ uintptr_t native_pass(dynarec_native_t* dyn, uintptr_t addr, int alternate, int
                         dyn->insts[ninst].x64.has_next = 1;  // this block actually continue
                     } else {
                         // need to find back that instruction to copy the caches, as previous version cannot be used anymore
-                        reset_n = -2;
-                        for(int ii=0; ii<ninst; ++ii)
-                            if(dyn->insts[ii].x64.jmp == next) {
-                                reset_n = ii;
-                                ii=ninst;
-                            }
+                        // and pred table is not ready yet
+                        reset_n = get_first_jump(dyn, next);
                     }
                     if(box64_dynarec_dump) dynarec_log(LOG_NONE, "Extend block %p, %s%p -> %p (ninst=%d, jump from %d)\n", dyn, dyn->insts[ninst].x64.has_callret?"(opt. call) ":"", (void*)addr, (void*)next, ninst, dyn->insts[ninst].x64.has_callret?ninst:reset_n);
                 } else if(next && (next-addr)<box64_dynarec_forward && (getProtection(next)&PROT_READ)/*box64_dynarec_bigblock>=stopblock*/) {