about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2025-06-25 10:59:04 +0200
committerptitSeb <sebastien.chev@gmail.com>2025-06-25 10:59:04 +0200
commit3698763bbe08dbc1f5d22894e1f8f1e13c51c765 (patch)
tree87701654b93a1044beb824befcf8c60fd51ac52e
parentd67bc08d2dde39ae87befa2d4c031629a7c1ee62 (diff)
downloadbox64-3698763bbe08dbc1f5d22894e1f8f1e13c51c765.tar.gz
box64-3698763bbe08dbc1f5d22894e1f8f1e13c51c765.zip
[INTERP] More work on UD flags
-rw-r--r--src/emu/x64runavx0f38.c17
1 files changed, 11 insertions, 6 deletions
diff --git a/src/emu/x64runavx0f38.c b/src/emu/x64runavx0f38.c
index 8c943c6b..a96b8f6b 100644
--- a/src/emu/x64runavx0f38.c
+++ b/src/emu/x64runavx0f38.c
@@ -95,9 +95,9 @@ uintptr_t RunAVX_0F38(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step)
                     CLEAR_FLAG(F_OF);
                     CLEAR_FLAG(F_AF);   // Undef
                     if(BOX64ENV(cputype)) {
-                        CLEAR_FLAG(F_PF);   // Undef
+                        CLEAR_FLAG(F_PF);
                     } else {
-                        SET_FLAG(F_PF);   // Undef
+                        CONDITIONAL_SET_FLAG(PARITY(VD->byte[0] & 0xff), F_PF);
                     }
                     break;
                 case 2:     /* BLSMSK Vd, Ed */
@@ -138,9 +138,9 @@ uintptr_t RunAVX_0F38(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step)
                     CLEAR_FLAG(F_OF);
                     CLEAR_FLAG(F_AF);   // Undef
                     if(BOX64ENV(cputype)) {
-                        CLEAR_FLAG(F_PF);   // Undef
+                        CLEAR_FLAG(F_PF);
                     } else {
-                        SET_FLAG(F_PF);   // Undef
+                        CONDITIONAL_SET_FLAG(PARITY(VD->byte[0] & 0xff), F_PF);
                     }
 
                     break;
@@ -168,8 +168,13 @@ uintptr_t RunAVX_0F38(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step)
             CONDITIONAL_SET_FLAG(rex.w?(GD->q[0]==0):(GD->dword[0]==0), F_ZF);
             CONDITIONAL_SET_FLAG(rex.w?(VD->q[0]>>63):(VD->dword[0]>>31), F_SF);
             CLEAR_FLAG(F_OF);
-            CLEAR_FLAG(F_AF);   // Undef
-            CLEAR_FLAG(F_PF);   // Undef
+            // UD flags
+            CLEAR_FLAG(F_AF);
+            if(BOX64ENV(cputype)) {
+                CLEAR_FLAG(F_PF);
+            } else {
+                CONDITIONAL_SET_FLAG(PARITY(VD->byte[0] & 0xff), F_PF);
+            }
             break;
 
         case 0xF7:  /* BEXTR Gd, Ed, Vd */