about summary refs log tree commit diff stats
path: root/src/dynarec/dynarec_native_functions.c
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2023-11-28 18:50:22 +0100
committerptitSeb <sebastien.chev@gmail.com>2023-11-28 18:50:22 +0100
commit994971b08f59c5868ae25333e4421fc12598b6e2 (patch)
tree46a1491b830344010f766c607e795a46155e62e3 /src/dynarec/dynarec_native_functions.c
parent019c0fabe14df7ca1ca0ef8e8a5670f3fbd5cefe (diff)
downloadbox64-994971b08f59c5868ae25333e4421fc12598b6e2.tar.gz
box64-994971b08f59c5868ae25333e4421fc12598b6e2.zip
[ARM64_DYNAREC] Fixes some rare-case of flags not correctly propagated on forward-jump
Diffstat (limited to 'src/dynarec/dynarec_native_functions.c')
-rw-r--r--src/dynarec/dynarec_native_functions.c23
1 files changed, 7 insertions, 16 deletions
diff --git a/src/dynarec/dynarec_native_functions.c b/src/dynarec/dynarec_native_functions.c
index d70beca9..94a6f521 100644
--- a/src/dynarec/dynarec_native_functions.c
+++ b/src/dynarec/dynarec_native_functions.c
@@ -394,9 +394,8 @@ static int flagsCacheNeedsTransform(dynarec_native_t* dyn, int ninst) {
         return 0;
     if(dyn->insts[ninst].f_exit.dfnone)  // flags are fully known, nothing we can do more
         return 0;
-/*    if((dyn->f.pending!=SF_SET)
-    && (dyn->f.pending!=SF_SET_PENDING)) {
-        if(dyn->f.pending!=SF_PENDING) {*/
+    if(dyn->insts[jmp].f_entry.dfnone && !dyn->insts[ninst].f_exit.dfnone)
+        return 1;
     switch (dyn->insts[jmp].f_entry.pending) {
         case SF_UNKNOWN: return 0;
         case SF_SET:
@@ -405,22 +404,14 @@ static int flagsCacheNeedsTransform(dynarec_native_t* dyn, int ninst) {
             else
                 return 0;
         case SF_SET_PENDING:
-            if(dyn->insts[ninst].f_exit.pending!=SF_SET
-            && dyn->insts[ninst].f_exit.pending!=SF_SET_PENDING
-            && dyn->insts[ninst].f_exit.pending!=SF_PENDING)
-                return 1;
-            else
+            if(dyn->insts[ninst].f_exit.pending==SF_SET_PENDING)
                 return 0;
+            return 1;
         case SF_PENDING:
-            if(dyn->insts[ninst].f_exit.pending!=SF_SET
-            && dyn->insts[ninst].f_exit.pending!=SF_SET_PENDING
-            && dyn->insts[ninst].f_exit.pending!=SF_PENDING)
-                return 1;
-            else
-                return (dyn->insts[jmp].f_entry.dfnone  == dyn->insts[ninst].f_exit.dfnone)?0:1;
+            if(dyn->insts[ninst].f_exit.pending==SF_PENDING || dyn->insts[ninst].f_exit.pending==SF_SET_PENDING)
+                return 0;
+            return (dyn->insts[jmp].f_entry.dfnone  == dyn->insts[ninst].f_exit.dfnone)?0:1;
     }
-    if(dyn->insts[jmp].f_entry.dfnone && !dyn->insts[ninst].f_exit.dfnone)
-        return 1;
     return 0;
 }