about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2022-07-16 21:57:55 +0200
committerptitSeb <sebastien.chev@gmail.com>2022-07-16 21:57:55 +0200
commit6e82268704457fb1172e02bab7b9e551a092473c (patch)
tree5aeb00a09db7388b5c01bf3b246aa775ead81479 /src
parent4142cc296bc17f0ac7de45f22685e2d2d027a7ef (diff)
downloadbox64-6e82268704457fb1172e02bab7b9e551a092473c.tar.gz
box64-6e82268704457fb1172e02bab7b9e551a092473c.zip
[DYNAREC] Improved handlinf of RIP value
Diffstat (limited to 'src')
-rwxr-xr-xsrc/dynarec/arm64/dynarec_arm64_00.c8
-rwxr-xr-xsrc/dynarec/arm64/dynarec_arm64_pass2.h2
-rwxr-xr-xsrc/dynarec/arm64/dynarec_arm64_pass3.h2
-rwxr-xr-xsrc/dynarec/dynarec_native_pass.c2
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) {