about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-11-17 11:02:21 +0100
committerptitSeb <sebastien.chev@gmail.com>2024-11-17 11:02:21 +0100
commit8a180e3892b31417c6bdec0355788605b0dca0e6 (patch)
tree4f9c4344d4cb41cc397a762993fc99c94ab98958 /src
parentc4d3d734b1a625ab5142a3f43ff955945a783faa (diff)
downloadbox64-8a180e3892b31417c6bdec0355788605b0dca0e6.tar.gz
box64-8a180e3892b31417c6bdec0355788605b0dca0e6.zip
[ARM64_DYNAREC] Cancel native flags when an opcode use native flags not fully covered by the generated ones
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_functions.c15
1 files changed, 9 insertions, 6 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_functions.c b/src/dynarec/arm64/dynarec_arm64_functions.c
index 96a17c21..a37434d0 100644
--- a/src/dynarec/arm64/dynarec_arm64_functions.c
+++ b/src/dynarec/arm64/dynarec_arm64_functions.c
@@ -884,13 +884,10 @@ static uint8_t getNativeFlagsUsed(dynarec_arm_t* dyn, int start, uint8_t flags)
         if(ninst!=start && dyn->insts[ninst].x64.use_flags) {
             if((flag2native(dyn->insts[ninst].x64.use_flags)&~(dyn->insts[ninst].use_nat_flags))&used_flags)
                 return 0;
+            // also check if the gen flags are compatible
+            if((dyn->insts[ninst].use_nat_flags)&~flags)
+                return 0;
         }
-        // check if flags are still needed
-        if(!(flag2native(dyn->insts[ninst].x64.need_after)&flags))
-            return used_flags;
-        // check if flags are destroyed, cancel the use then
-        if(dyn->insts[ninst].nat_flags_op && (start!=ninst))
-            return 0;
         // check if flags are generated without native option
         if((start!=ninst) && dyn->insts[ninst].x64.gen_flags && (flag2native(dyn->insts[ninst].x64.gen_flags&dyn->insts[ninst].x64.need_after)&used_flags)) {
             if(used_flags&~flag2native(dyn->insts[ninst].x64.gen_flags&dyn->insts[ninst].x64.need_after))
@@ -898,6 +895,12 @@ static uint8_t getNativeFlagsUsed(dynarec_arm_t* dyn, int start, uint8_t flags)
             else
                 return used_flags;  // full covert... End of propagation
         }
+        // check if flags are still needed
+        if(!(flag2native(dyn->insts[ninst].x64.need_after)&flags))
+            return used_flags;
+        // check if flags are destroyed, cancel the use then
+        if(dyn->insts[ninst].nat_flags_op && (start!=ninst))
+            return 0;
         // update used flags
         used_flags |= (flag2native(dyn->insts[ninst].x64.need_after)&flags);
         // go next