about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-09-08 14:18:03 +0200
committerptitSeb <sebastien.chev@gmail.com>2024-09-08 14:18:03 +0200
commit8f855f5ddeb4de303085757b7c417b66665e1c3e (patch)
tree7adf25ba44a920644543d0ac21a8346af37d6cb6 /src
parent6d3fa25d5fc41ad5066b565ade8f24e74cb8e1ae (diff)
downloadbox64-8f855f5ddeb4de303085757b7c417b66665e1c3e.tar.gz
box64-8f855f5ddeb4de303085757b7c417b66665e1c3e.zip
[ARM64_DYNAREC] Avoid computing flags if they are just recomputed at jump point
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_helper.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_helper.c b/src/dynarec/arm64/dynarec_arm64_helper.c
index c33c9aa2..c332b40a 100644
--- a/src/dynarec/arm64/dynarec_arm64_helper.c
+++ b/src/dynarec/arm64/dynarec_arm64_helper.c
@@ -2332,8 +2332,17 @@ static void flagsCacheTransform(dynarec_arm_t* dyn, int ninst, int s1)
         case SF_SET_PENDING:
             if(dyn->f.pending!=SF_SET
             && dyn->f.pending!=SF_SET_PENDING
-            && dyn->f.pending!=SF_PENDING)
-                go = 1;
+            && dyn->f.pending!=SF_PENDING
+            ) {
+                // only sync if some previous flags are used or if all flags are not regenerated at the instuction
+                if(dyn->insts[jmp].x64.use_flags || (dyn->insts[jmp].x64.set_flags!=X_ALL))
+                    go = 1;
+                else if(go) {
+                    // just clear df flags
+                    go = 0;
+                    STRw_U12(xZR, xEmu, offsetof(x64emu_t, df));
+                }
+            }
             break;
         case SF_PENDING:
             if(dyn->f.pending!=SF_SET