diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2025-06-25 10:48:47 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2025-06-25 10:48:47 +0200 |
| commit | e2b97768601209ba6769bd05dce7f8cfbd40d674 (patch) | |
| tree | a480366957eb93145447f2ab21ef5b983a8ea964 | |
| parent | 208a84bebbf316e87797d6201204ce38bf3074f1 (diff) | |
| download | box64-e2b97768601209ba6769bd05dce7f8cfbd40d674.tar.gz box64-e2b97768601209ba6769bd05dce7f8cfbd40d674.zip | |
[INTERP] Adjusted some UD flags in BLSMSK opcode
| -rw-r--r-- | src/emu/x64runavx0f38.c | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/src/emu/x64runavx0f38.c b/src/emu/x64runavx0f38.c index 3ff1ba49..8c943c6b 100644 --- a/src/emu/x64runavx0f38.c +++ b/src/emu/x64runavx0f38.c @@ -94,7 +94,11 @@ uintptr_t RunAVX_0F38(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step) CONDITIONAL_SET_FLAG(rex.w?(VD->q[0]>>63):(VD->dword[0]>>31), F_SF); CLEAR_FLAG(F_OF); CLEAR_FLAG(F_AF); // Undef - CLEAR_FLAG(F_PF); // Undef + if(BOX64ENV(cputype)) { + CLEAR_FLAG(F_PF); // Undef + } else { + SET_FLAG(F_PF); // Undef + } break; case 2: /* BLSMSK Vd, Ed */ if(vex.l) EmitSignal(emu, SIGILL, (void*)R_RIP, 0); @@ -109,8 +113,13 @@ uintptr_t RunAVX_0F38(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step) CONDITIONAL_SET_FLAG(rex.w?(VD->q[0]>>63):(VD->dword[0]>>31), F_SF); CLEAR_FLAG(F_ZF); CLEAR_FLAG(F_OF); - CLEAR_FLAG(F_AF); // Undef - CLEAR_FLAG(F_PF); // Undef + // Undef flags + CLEAR_FLAG(F_AF); + if(BOX64ENV(cputype)) { + CLEAR_FLAG(F_PF); + } else { + CONDITIONAL_SET_FLAG(PARITY(VD->byte[0] & 0xff), F_PF); + } break; case 3: /* BLSI Vd, Ed */ if(vex.l) EmitSignal(emu, SIGILL, (void*)R_RIP, 0); @@ -128,7 +137,12 @@ uintptr_t RunAVX_0F38(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step) CONDITIONAL_SET_FLAG(rex.w?(VD->q[0]>>63):(VD->dword[0]>>31), F_SF); CLEAR_FLAG(F_OF); CLEAR_FLAG(F_AF); // Undef - CLEAR_FLAG(F_PF); // Undef + if(BOX64ENV(cputype)) { + CLEAR_FLAG(F_PF); // Undef + } else { + SET_FLAG(F_PF); // Undef + } + break; default: return 0; |