diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2025-01-18 12:19:33 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2025-01-18 12:19:33 +0100 |
| commit | c24f04088861fe10a09c32ebd029d7a9209e305d (patch) | |
| tree | 39d79e91080febdada1d9455ac9a72505e6a98e7 /src | |
| parent | 0f225fc1a0989e6369c1ecb64efdafa5d0d17158 (diff) | |
| download | box64-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.c | 56 |
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); |