diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2025-01-31 16:29:09 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2025-01-31 16:29:09 +0100 |
| commit | 09e07973ddb305c851d99ff9cc247545322e79f6 (patch) | |
| tree | 5505d70ab4ddafeb4cd7f3ac12cfde237fa93c06 /src | |
| parent | 6b7afd7f8ef3404757c30ea73861c0fc00a5407c (diff) | |
| download | box64-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.c | 22 |
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); |