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>2024-11-15 14:27:43 +0100
committerptitSeb <sebastien.chev@gmail.com>2024-11-15 14:27:43 +0100
commit64b213fe425e335171ba04839fdd94460b3bf205 (patch)
treedc0a8e38b1ec62bbf15050dce5d6f810895c4d31 /src/dynarec/dynarec_native_functions.c
parenteaca84e9ba632e9ae22a95e3271db2febb1c3c5f (diff)
downloadbox64-64b213fe425e335171ba04839fdd94460b3bf205.tar.gz
box64-64b213fe425e335171ba04839fdd94460b3bf205.zip
[ARM64_DYNAREC] Try to not call UpdateFlags when switching to a DFNONE state but dfnone is not needed
Diffstat (limited to 'src/dynarec/dynarec_native_functions.c')
-rw-r--r--src/dynarec/dynarec_native_functions.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/src/dynarec/dynarec_native_functions.c b/src/dynarec/dynarec_native_functions.c
index c6ea65b0..f0bf3d08 100644
--- a/src/dynarec/dynarec_native_functions.c
+++ b/src/dynarec/dynarec_native_functions.c
@@ -513,7 +513,7 @@ 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->insts[jmp].f_entry.dfnone && !dyn->insts[ninst].f_exit.dfnone)
+    if(dyn->insts[jmp].f_entry.dfnone && !dyn->insts[ninst].f_exit.dfnone && !dyn->insts[jmp].df_notneeded)
         return 1;
     switch (dyn->insts[jmp].f_entry.pending) {
         case SF_UNKNOWN: return 0;
@@ -648,3 +648,15 @@ void avx_unmark_zero(dynarec_native_t* dyn, int ninst, int reg)
 {
     dyn->ymm_zero &= ~(1<<reg);
 }
+
+void propagate_nodf(dynarec_native_t* dyn, int ninst)
+{
+    while(ninst>=0) {
+        if(dyn->insts[ninst].df_notneeded)
+            return; // already flagged
+        if(dyn->insts[ninst].x64.gen_flags || dyn->insts[ninst].x64.use_flags)
+            return; // flags are use, so maybe it's needed
+        dyn->insts[ninst].df_notneeded = 1;
+        --ninst;       
+    }
+}
\ No newline at end of file