diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2023-11-16 15:10:56 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2023-11-16 15:10:56 +0100 |
| commit | c17e37b6e0c4d686702aa9abfdcc58b227626a2b (patch) | |
| tree | 9470193ca07e676ae1e80cb48764894844e012b7 /src/emu | |
| parent | df25986597a6c24984fd81a5eb14b95754ed6973 (diff) | |
| download | box64-c17e37b6e0c4d686702aa9abfdcc58b227626a2b.tar.gz box64-c17e37b6e0c4d686702aa9abfdcc58b227626a2b.zip | |
[ARM64_DYNAREC] Optimized 66 0F A4 opcode
Diffstat (limited to 'src/emu')
| -rw-r--r-- | src/emu/x64run_private.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/src/emu/x64run_private.c b/src/emu/x64run_private.c index 1eaa6301..6400e06c 100644 --- a/src/emu/x64run_private.c +++ b/src/emu/x64run_private.c @@ -731,6 +731,21 @@ void UpdateFlags(x64emu_t *emu) } } break; + case d_shld16: + cnt = emu->op2.u16; + if (cnt > 0) { + cc = emu->op1.u16 & (1 << (16 - cnt)); + CONDITIONAL_SET_FLAG(cc, F_CF); + CONDITIONAL_SET_FLAG(!emu->res.u16, F_ZF); + CONDITIONAL_SET_FLAG(emu->res.u16 & 0x8000, F_SF); + CONDITIONAL_SET_FLAG(PARITY(emu->res.u16 & 0xff), F_PF); + if (cnt == 1) { + CONDITIONAL_SET_FLAG((emu->op1.u16 ^ emu->res.u16) & 0x8000, F_OF); + } else { + CLEAR_FLAG(F_OF); + } + } + break; case d_shld32: cnt = emu->op2.u32; if (cnt > 0) { @@ -1044,7 +1059,6 @@ void UpdateFlags(x64emu_t *emu) case d_rcr16: case d_rcr32: case d_rcr64: - case d_shld16: case d_unknown: printf_log(LOG_NONE, "Box64: %p trying to evaluate Unknown deferred Flags\n", (void*)R_RIP); break; |