about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2025-01-31 16:29:09 +0100
committerptitSeb <sebastien.chev@gmail.com>2025-01-31 16:29:09 +0100
commit09e07973ddb305c851d99ff9cc247545322e79f6 (patch)
tree5505d70ab4ddafeb4cd7f3ac12cfde237fa93c06 /src
parent6b7afd7f8ef3404757c30ea73861c0fc00a5407c (diff)
downloadbox64-09e07973ddb305c851d99ff9cc247545322e79f6.tar.gz
box64-09e07973ddb305c851d99ff9cc247545322e79f6.zip
[INTERPRETER] Fixed some AVX opcode that would not zero upper part of register when not using vex.w
Diffstat (limited to 'src')
-rw-r--r--src/emu/x64runavx0f38.c22
1 files changed, 7 insertions, 15 deletions
diff --git a/src/emu/x64runavx0f38.c b/src/emu/x64runavx0f38.c
index c18b5c44..011491c4 100644
--- a/src/emu/x64runavx0f38.c
+++ b/src/emu/x64runavx0f38.c
@@ -68,13 +68,9 @@ uintptr_t RunAVX_0F38(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step)
             GETVD;
             if(rex.w)
                 GD->q[0] = ED->q[0] & ~VD->q[0];
-            else {
-                if(MODREG)
-                    GD->q[0] = ED->dword[0] & ~VD->dword[0];
-                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);
+            else
+                GD->q[0] = ED->dword[0] & ~VD->dword[0];
+            CONDITIONAL_SET_FLAG(GD->q[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);
@@ -93,10 +89,8 @@ uintptr_t RunAVX_0F38(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step)
                     if(rex.w)
                         VD->q[0] = ED->q[0] & (ED->q[0]-1LL);
                     else
-                        VD->dword[0] = ED->dword[0] & (ED->dword[0]-1);
-                    if(MODREG && !rex.w)
-                        VD->dword[1] = 0;
-                    CONDITIONAL_SET_FLAG(rex.w?(VD->q[0]==0):(VD->dword[0]==0), F_ZF);
+                        VD->q[0] = ED->dword[0] & (ED->dword[0]-1);
+                    CONDITIONAL_SET_FLAG(VD->q[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
@@ -111,9 +105,7 @@ uintptr_t RunAVX_0F38(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step)
                     if(rex.w)
                         VD->q[0] = ED->q[0] ^ (ED->q[0]-1LL);
                     else
-                        VD->dword[0] = ED->dword[0] ^ (ED->dword[0]-1);
-                    if(MODREG && !rex.w)
-                        VD->dword[1] = 0;
+                        VD->q[0] = ED->dword[0] ^ (ED->dword[0]-1);
                     CONDITIONAL_SET_FLAG(rex.w?(VD->q[0]>>63):(VD->dword[0]>>31), F_SF);
                     CLEAR_FLAG(F_ZF);
                     CLEAR_FLAG(F_OF);
@@ -130,7 +122,7 @@ uintptr_t RunAVX_0F38(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step)
                         VD->sq[0] = ED->sq[0] & (-ED->sq[0]);
                     else
                         VD->sdword[0] = ED->sdword[0] & (-ED->sdword[0]);
-                    if(MODREG && !rex.w)
+                    if(!rex.w)
                         VD->dword[1] = 0;
                     CONDITIONAL_SET_FLAG(rex.w?(VD->q[0]==0):(VD->dword[0]==0), F_ZF);
                     CONDITIONAL_SET_FLAG(rex.w?(VD->q[0]>>63):(VD->dword[0]>>31), F_SF);