about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2025-01-18 12:19:33 +0100
committerptitSeb <sebastien.chev@gmail.com>2025-01-18 12:19:33 +0100
commitc24f04088861fe10a09c32ebd029d7a9209e305d (patch)
tree39d79e91080febdada1d9455ac9a72505e6a98e7 /src
parent0f225fc1a0989e6369c1ecb64efdafa5d0d17158 (diff)
downloadbox64-c24f04088861fe10a09c32ebd029d7a9209e305d.tar.gz
box64-c24f04088861fe10a09c32ebd029d7a9209e305d.zip
[INTERPRETER] Fixed AVX.66.0F38 17 opcode and improved AVX.66.0F38 0E/0F opcodes
Diffstat (limited to 'src')
-rw-r--r--src/emu/x64runavx660f38.c56
1 files changed, 20 insertions, 36 deletions
diff --git a/src/emu/x64runavx660f38.c b/src/emu/x64runavx660f38.c
index 849506b0..514977f4 100644
--- a/src/emu/x64runavx660f38.c
+++ b/src/emu/x64runavx660f38.c
@@ -472,23 +472,15 @@ uintptr_t RunAVX_660F38(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step)
             nextop = F8;
             GETEX(0);
             GETGX;
-            if(vex.l) {GETEY; GETGY;}
-            // ZF
-            u8 = 0;
-            for(int i=0; i<4 && !u8; ++i)
-                u8 |= ((EX->ud[i]>>31)&(GX->ud[i]>>31));
-            if(vex.l && !u8)
-                for(int i=0; i<4 && !u8; ++i)
-                    u8 |= ((EY->ud[i]>>31)&(GY->ud[i]>>31));
-            CONDITIONAL_SET_FLAG(!u8, F_ZF);
-            // CF
-            u8 = 0;
-            for(int i=0; i<4 && !u8; ++i)
-                u8 |= ((EX->ud[i]>>31)&((~GX->ud[i])>>31));
-            if(vex.l && !u8)
-                for(int i=0; i<4 && !u8; ++i)
-                    u8 |= ((EY->ud[i]>>31)&((~GY->ud[i])>>31));
-            CONDITIONAL_SET_FLAG(!u8, F_CF);
+            RESET_FLAGS(emu);
+            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);
+            }
             CLEAR_FLAG(F_AF);
             CLEAR_FLAG(F_OF);
             CLEAR_FLAG(F_SF);
@@ -498,23 +490,15 @@ uintptr_t RunAVX_660F38(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step)
             nextop = F8;
             GETEX(0);
             GETGX;
-            if(vex.l) {GETEY; GETGY;}
-            // ZF
-            u8 = 0;
-            for(int i=0; i<2 && !u8; ++i)
-                u8 |= ((EX->q[i]>>63)&(GX->q[i]>>63));
-            if(vex.l && !u8)
-                for(int i=0; i<2 && !u8; ++i)
-                    u8 |= ((EY->q[i]>>63)&(GY->q[i]>>63));
-            CONDITIONAL_SET_FLAG(!u8, F_ZF);
-            // CF
-            u8 = 0;
-            for(int i=0; i<2 && !u8; ++i)
-                u8 |= ((EX->q[i]>>63)&((~GX->q[i])>>63));
-            if(vex.l && !u8)
-                for(int i=0; i<2 && !u8; ++i)
-                    u8 |= ((EY->q[i]>>63)&((~GY->q[i])>>63));
-            CONDITIONAL_SET_FLAG(!u8, F_CF);
+            RESET_FLAGS(emu);
+            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);
+            }
             CLEAR_FLAG(F_AF);
             CLEAR_FLAG(F_OF);
             CLEAR_FLAG(F_SF);
@@ -572,8 +556,8 @@ uintptr_t RunAVX_660F38(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step)
             RESET_FLAGS(emu);
             if(vex.l) {
                 GETEY; GETGY;
-                CONDITIONAL_SET_FLAG(!(GY->u128&EY->u128), F_ZF);
-                CONDITIONAL_SET_FLAG(!((~GY->u128)&EY->u128), F_CF);
+                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);