about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2025-01-19 13:58:06 +0100
committerptitSeb <sebastien.chev@gmail.com>2025-01-19 13:58:06 +0100
commit5654e77625cb7ed8ecdad4378700f56251242176 (patch)
treedd5ae3c52cff7a63f0685b6cb9cdc991cb59f00f /src
parentc9f01d975dbfd4d093009109c769d28758771465 (diff)
downloadbox64-5654e77625cb7ed8ecdad4378700f56251242176.tar.gz
box64-5654e77625cb7ed8ecdad4378700f56251242176.zip
[INTERPRETER] Fixed AVX.66.0F38 0E/0F opcodes
Diffstat (limited to 'src')
-rw-r--r--src/emu/x64runavx660f38.c32
1 files changed, 22 insertions, 10 deletions
diff --git a/src/emu/x64runavx660f38.c b/src/emu/x64runavx660f38.c
index 514977f4..d7d4b914 100644
--- a/src/emu/x64runavx660f38.c
+++ b/src/emu/x64runavx660f38.c
@@ -473,14 +473,20 @@ uintptr_t RunAVX_660F38(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step)
             GETEX(0);
             GETGX;
             RESET_FLAGS(emu);
+            u8 = 0; tmp8u = 0;
+            for(int i=0; i<4; ++i) {
+                if((GX->ud[i]&EX->ud[i])>>31) u8 = 1;
+                if(((~GX->ud[i])&EX->ud[i])>>31) tmp8u = 1;
+            }
             if(vex.l) {
                 GETEY; GETGY;
-                CONDITIONAL_SET_FLAG(!(GY->u128&EY->u128) && !(GX->u128&EX->u128), F_ZF);
-                CONDITIONAL_SET_FLAG(!((~GY->u128)&EY->u128) && !((~GX->u128)&EX->u128), F_CF);
-            } else {
-                CONDITIONAL_SET_FLAG(!(GX->u128&EX->u128), F_ZF);
-                CONDITIONAL_SET_FLAG(!((~GX->u128)&EX->u128), F_CF);
+                for(int i=0; i<4; ++i) {
+                    if((GY->ud[i]&EY->ud[i])>>31) u8 = 1;
+                    if(((~GY->ud[i])&EY->ud[i])>>31) tmp8u = 1;
+                }
             }
+            CONDITIONAL_SET_FLAG(!u8, F_ZF);
+            CONDITIONAL_SET_FLAG(!tmp8u, F_CF);
             CLEAR_FLAG(F_AF);
             CLEAR_FLAG(F_OF);
             CLEAR_FLAG(F_SF);
@@ -491,14 +497,20 @@ uintptr_t RunAVX_660F38(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step)
             GETEX(0);
             GETGX;
             RESET_FLAGS(emu);
+            u8 = 0; tmp8u = 0;
+            for(int i=0; i<2; ++i) {
+                if((GX->q[i]&EX->q[i])>>63) u8 = 1;
+                if(((~GX->q[i])&EX->q[i])>>63) tmp8u = 1;
+            }
             if(vex.l) {
                 GETEY; GETGY;
-                CONDITIONAL_SET_FLAG(!(GY->u128&EY->u128) && !(GX->u128&EX->u128), F_ZF);
-                CONDITIONAL_SET_FLAG(!((~GY->u128)&EY->u128) && !((~GX->u128)&EX->u128), F_CF);
-            } else {
-                CONDITIONAL_SET_FLAG(!(GX->u128&EX->u128), F_ZF);
-                CONDITIONAL_SET_FLAG(!((~GX->u128)&EX->u128), F_CF);
+                for(int i=0; i<2; ++i) {
+                    if((GY->q[i]&EY->q[i])>>63) u8 = 1;
+                    if(((~GY->q[i])&EY->q[i])>>63) tmp8u = 1;
+                }
             }
+            CONDITIONAL_SET_FLAG(!u8, F_ZF);
+            CONDITIONAL_SET_FLAG(!tmp8u, F_CF);
             CLEAR_FLAG(F_AF);
             CLEAR_FLAG(F_OF);
             CLEAR_FLAG(F_SF);