about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2023-03-18 21:18:12 +0000
committerptitSeb <sebastien.chev@gmail.com>2023-03-18 21:18:12 +0000
commit59ada379e2c3cfb0ade2bba2592661f3612ce70b (patch)
treedab81f1222e75e96a9365d584fd743987f1ae10d /src
parent52715c92207da1e96e5eb973027e458479fd6968 (diff)
downloadbox64-59ada379e2c3cfb0ade2bba2592661f3612ce70b.tar.gz
box64-59ada379e2c3cfb0ade2bba2592661f3612ce70b.zip
[RV64_DYNAREC] Small optim on last_ip
Diffstat (limited to 'src')
-rwxr-xr-xsrc/dynarec/dynarec_native_pass.c2
-rw-r--r--src/dynarec/rv64/dynarec_rv64_helper.c16
2 files changed, 14 insertions, 4 deletions
diff --git a/src/dynarec/dynarec_native_pass.c b/src/dynarec/dynarec_native_pass.c
index 6694e3ca..c76c8020 100755
--- a/src/dynarec/dynarec_native_pass.c
+++ b/src/dynarec/dynarec_native_pass.c
@@ -74,7 +74,7 @@ uintptr_t native_pass(dynarec_native_t* dyn, uintptr_t addr)
                 }
             }
             reset_n = -1;
-        } else if(ninst && (dyn->insts[ninst].pred_sz!=1 || dyn->insts[ninst].pred[0]!=ninst-1))
+        } else if(ninst && (dyn->insts[ninst].pred_sz>1 || (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
         fpu_propagate_stack(dyn, ninst);
         NEW_INST;
diff --git a/src/dynarec/rv64/dynarec_rv64_helper.c b/src/dynarec/rv64/dynarec_rv64_helper.c
index ca0628fe..41343cf2 100644
--- a/src/dynarec/rv64/dynarec_rv64_helper.c
+++ b/src/dynarec/rv64/dynarec_rv64_helper.c
@@ -82,18 +82,28 @@ uintptr_t geted(dynarec_rv64_t* dyn, uintptr_t addr, int ninst, uint8_t nextop,
             }
         } else if((nextop&7)==5) {
             int64_t tmp = F32S64;
-            if(i12 && (tmp>=-2048) && (tmp<=2047)) {
+            int64_t adj = dyn->last_ip?((addr+delta)-dyn->last_ip):0;
+            if(i12 && adj && (tmp+adj>=-2048) && (tmp+adj<=2047)) {
+                ret = xRIP;
+                *fixaddress = tmp+adj;
+            } else if(i12 && (tmp>=-2048) && (tmp<=2047)) {
                 GETIP(addr+delta);
                 ret = xRIP;
                 *fixaddress = tmp;
+            } else if(adj && (tmp+adj>=-2048) && (tmp+adj<=2047)) {
+                ADDI(ret, xRIP, tmp+adj);
             } else if((tmp>=-2048) && (tmp<=2047)) {
                 GETIP(addr+delta);
                 ADDI(ret, xRIP, tmp);
             } else if(tmp+addr+delta<0x100000000LL) {
                 MOV64x(ret, tmp+addr+delta);
             } else {
-                MOV64x(ret, tmp);
-                GETIP(addr+delta);
+                if(adj) {
+                    MOV64x(ret, tmp+adj);
+                } else {
+                    MOV64x(ret, tmp);
+                    GETIP(addr+delta);
+                }
                 ADD(ret, ret, xRIP);
             }
             switch(lock) {