about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2025-06-25 10:59:15 +0200
committerptitSeb <sebastien.chev@gmail.com>2025-06-25 10:59:15 +0200
commit48a1b112819d3a4a7b48025236b36845c2b077e4 (patch)
tree34043077ea7dd730c8f116f272db8c2737d25abc /src
parent3698763bbe08dbc1f5d22894e1f8f1e13c51c765 (diff)
downloadbox64-48a1b112819d3a4a7b48025236b36845c2b077e4.tar.gz
box64-48a1b112819d3a4a7b48025236b36845c2b077e4.zip
[INTERP] More work on UD flags
Diffstat (limited to 'src')
-rw-r--r--src/dynarec/arm64/dynarec_arm64_avx_0f38.c22
1 files changed, 17 insertions, 5 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_avx_0f38.c b/src/dynarec/arm64/dynarec_arm64_avx_0f38.c
index cf5db08c..66ea1753 100644
--- a/src/dynarec/arm64/dynarec_arm64_avx_0f38.c
+++ b/src/dynarec/arm64/dynarec_arm64_avx_0f38.c
@@ -132,9 +132,14 @@ uintptr_t dynarec64_AVX_0F38(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, i
                     IFX(X_OF) {
                         IFNATIVE(NF_VF) {} else { BFCw(xFlags, F_OF, 1); }
                     }
-                    if (BOX64ENV(dynarec_test)) {
+                    if (BOX64ENV(dynarec_safeflags)) {
+                        // those are UD flags
                         IFX(X_AF) BFCw(xFlags, F_AF, 1);
-                        IFX(X_PF) BFCw(xFlags, F_PF, 1);
+                        if(BOX64ENV(cputype)) {
+                            IFX(X_PF) BFCw(xFlags, F_PF, 1);
+                        } else {
+                            IFX(X_PF) emit_pf(dyn, ninst, vd, x3);
+                        }
                     }
                     break;
 
@@ -222,7 +227,7 @@ uintptr_t dynarec64_AVX_0F38(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, i
                         if(BOX64ENV(cputype)) {
                             IFX(X_PF) BFCw(xFlags, F_PF, 1);
                         } else {
-                            IFX(X_PF) ORRw_mask(xFlags, xFlags, 30, 0);   //mask=0x04
+                            IFX(X_PF) emit_pf(dyn, ninst, vd, x3);
                         }
                     }
                     break;
@@ -269,11 +274,18 @@ uintptr_t dynarec64_AVX_0F38(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, i
                     BFIw(xFlags, x3, F_SF, 1);
                 }
             }
-            IFX(X_AF) BFCw(xFlags, F_AF, 1);
-            IFX(X_PF) BFCw(xFlags, F_PF, 1);
             IFX(X_OF) {
                 IFNATIVE(NF_VF) {} else { BFCw(xFlags, F_OF, 1); }
             }
+            if (BOX64ENV(dynarec_safeflags)) {
+                // those are UD flags
+                IFX(X_AF) BFCw(xFlags, F_AF, 1);
+                if(BOX64ENV(cputype)) {
+                    IFX(X_PF) BFCw(xFlags, F_PF, 1);
+                } else {
+                    IFX(X_PF) emit_pf(dyn, ninst, vd, x3);
+                }
+            }
             break;
 
         case 0xF7: