diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2025-01-19 13:58:06 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2025-01-19 13:58:06 +0100 |
| commit | 5654e77625cb7ed8ecdad4378700f56251242176 (patch) | |
| tree | dd5ae3c52cff7a63f0685b6cb9cdc991cb59f00f /src | |
| parent | c9f01d975dbfd4d093009109c769d28758771465 (diff) | |
| download | box64-5654e77625cb7ed8ecdad4378700f56251242176.tar.gz box64-5654e77625cb7ed8ecdad4378700f56251242176.zip | |
[INTERPRETER] Fixed AVX.66.0F38 0E/0F opcodes
Diffstat (limited to 'src')
| -rw-r--r-- | src/emu/x64runavx660f38.c | 32 |
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); |