diff options
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); |