about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-09-14 08:46:23 +0200
committerptitSeb <sebastien.chev@gmail.com>2024-09-14 08:46:23 +0200
commitb361a0d2ffd11f12cc59757e86dc2e63c92dfdf3 (patch)
tree017937173fa1e17a1f3147aa00485ba99c6e4a01
parent0acd849f18bf12b4d170b0ab0d80d2f76d02af93 (diff)
downloadbox64-b361a0d2ffd11f12cc59757e86dc2e63c92dfdf3.tar.gz
box64-b361a0d2ffd11f12cc59757e86dc2e63c92dfdf3.zip
Fixed flags for AVX.0F38 F2 opcode ([ARM64_DYNAREC] too)
-rw-r--r--src/dynarec/arm64/dynarec_arm64_avx_0f38.c17
-rw-r--r--src/emu/x64runavx0f38.c7
2 files changed, 23 insertions, 1 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_avx_0f38.c b/src/dynarec/arm64/dynarec_arm64_avx_0f38.c
index 484c7b10..fa18d943 100644
--- a/src/dynarec/arm64/dynarec_arm64_avx_0f38.c
+++ b/src/dynarec/arm64/dynarec_arm64_avx_0f38.c
@@ -68,7 +68,22 @@ uintptr_t dynarec64_AVX_0F38(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, i
             GETGD;
             GETED(0);
             GETVD;
-            BICxw(gd, ed, vd);
+            IFX(X_ZF)
+                BICSxw(gd, ed, vd);
+            else
+                BICxw(gd, ed, vd);
+            IFX(X_ZF) {
+                CSETw(x1, cEQ);
+                BFIw(xFlags, x1, F_ZF, 1);
+            }
+            IFX(X_OF)
+                BFCw(xFlags, F_OF, 1);
+            IFX(X_CF)
+                BFCw(xFlags, F_CF, 1);
+            IFX(X_SF) {
+                LSRxw_IMM(x1, gd, rex.w?63:31);
+                BFIw(xFlags, x1, F_SF, 1);
+            }
             break;
         case 0xF3:
             nextop = F8;
diff --git a/src/emu/x64runavx0f38.c b/src/emu/x64runavx0f38.c
index 11e324c9..c18b5c44 100644
--- a/src/emu/x64runavx0f38.c
+++ b/src/emu/x64runavx0f38.c
@@ -62,6 +62,7 @@ uintptr_t RunAVX_0F38(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step)
         case 0xF2:  /* ANDN Gd, Vd, Ed */
             nextop = F8;
             if(vex.l) emit_signal(emu, SIGILL, (void*)R_RIP, 0);
+            ResetFlags(emu);
             GETGD;
             GETED(0);
             GETVD;
@@ -73,6 +74,12 @@ uintptr_t RunAVX_0F38(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step)
                 else
                     GD->dword[0] = ED->dword[0] & ~VD->dword[0];
             }
+            CONDITIONAL_SET_FLAG(rex.w?(GD->q[0]==0):(GD->dword[0]==0), F_ZF);
+            CONDITIONAL_SET_FLAG(rex.w?(GD->q[0]>>63):(GD->dword[0]>>31), F_SF);
+            CLEAR_FLAG(F_CF);
+            CLEAR_FLAG(F_OF);
+            CLEAR_FLAG(F_AF);   // Undef
+            CLEAR_FLAG(F_PF);   // Undef
             break;
         case 0xF3:
             nextop = F8;