diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-09-14 08:46:23 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-09-14 08:46:23 +0200 |
| commit | b361a0d2ffd11f12cc59757e86dc2e63c92dfdf3 (patch) | |
| tree | 017937173fa1e17a1f3147aa00485ba99c6e4a01 | |
| parent | 0acd849f18bf12b4d170b0ab0d80d2f76d02af93 (diff) | |
| download | box64-b361a0d2ffd11f12cc59757e86dc2e63c92dfdf3.tar.gz box64-b361a0d2ffd11f12cc59757e86dc2e63c92dfdf3.zip | |
Fixed flags for AVX.0F38 F2 opcode ([ARM64_DYNAREC] too)
| -rw-r--r-- | src/dynarec/arm64/dynarec_arm64_avx_0f38.c | 17 | ||||
| -rw-r--r-- | src/emu/x64runavx0f38.c | 7 |
2 files changed, 23 insertions, 1 deletions
diff --git a/src/dynarec/arm64/dynarec_arm64_avx_0f38.c b/src/dynarec/arm64/dynarec_arm64_avx_0f38.c index 484c7b10..fa18d943 100644 --- a/src/dynarec/arm64/dynarec_arm64_avx_0f38.c +++ b/src/dynarec/arm64/dynarec_arm64_avx_0f38.c @@ -68,7 +68,22 @@ uintptr_t dynarec64_AVX_0F38(dynarec_arm_t* dyn, uintptr_t addr, uintptr_t ip, i GETGD; GETED(0); GETVD; - BICxw(gd, ed, vd); + IFX(X_ZF) + BICSxw(gd, ed, vd); + else + BICxw(gd, ed, vd); + IFX(X_ZF) { + CSETw(x1, cEQ); + BFIw(xFlags, x1, F_ZF, 1); + } + IFX(X_OF) + BFCw(xFlags, F_OF, 1); + IFX(X_CF) + BFCw(xFlags, F_CF, 1); + IFX(X_SF) { + LSRxw_IMM(x1, gd, rex.w?63:31); + BFIw(xFlags, x1, F_SF, 1); + } break; case 0xF3: nextop = F8; diff --git a/src/emu/x64runavx0f38.c b/src/emu/x64runavx0f38.c index 11e324c9..c18b5c44 100644 --- a/src/emu/x64runavx0f38.c +++ b/src/emu/x64runavx0f38.c @@ -62,6 +62,7 @@ uintptr_t RunAVX_0F38(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step) case 0xF2: /* ANDN Gd, Vd, Ed */ nextop = F8; if(vex.l) emit_signal(emu, SIGILL, (void*)R_RIP, 0); + ResetFlags(emu); GETGD; GETED(0); GETVD; @@ -73,6 +74,12 @@ uintptr_t RunAVX_0F38(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step) 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); + CONDITIONAL_SET_FLAG(rex.w?(GD->q[0]>>63):(GD->dword[0]>>31), F_SF); + CLEAR_FLAG(F_CF); + CLEAR_FLAG(F_OF); + CLEAR_FLAG(F_AF); // Undef + CLEAR_FLAG(F_PF); // Undef break; case 0xF3: nextop = F8; |