From dc06ca51a64fbb251e89726a0a0a6f2bbebf7c8c Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Thu, 16 Nov 2023 12:35:41 +0100 Subject: [ARM64_DYNAREC] Improved 0F A4 opcode --- src/emu/x64run_private.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) (limited to 'src/emu') diff --git a/src/emu/x64run_private.c b/src/emu/x64run_private.c index a5a588c2..1eaa6301 100644 --- a/src/emu/x64run_private.c +++ b/src/emu/x64run_private.c @@ -731,6 +731,36 @@ void UpdateFlags(x64emu_t *emu) } } break; + case d_shld32: + cnt = emu->op2.u32; + if (cnt > 0) { + cc = emu->op1.u32 & (1 << (32 - cnt)); + CONDITIONAL_SET_FLAG(cc, F_CF); + CONDITIONAL_SET_FLAG(!emu->res.u32, F_ZF); + CONDITIONAL_SET_FLAG(emu->res.u32 & 0x80000000, F_SF); + CONDITIONAL_SET_FLAG(PARITY(emu->res.u32 & 0xff), F_PF); + if (cnt == 1) { + CONDITIONAL_SET_FLAG((emu->op1.u32 ^ emu->res.u32) & 0x80000000, F_OF); + } else { + CLEAR_FLAG(F_OF); + } + } + break; + case d_shld64: + cnt = emu->op2.u64; + if (cnt > 0) { + cc = emu->op1.u64 & (1LL << (64 - cnt)); + CONDITIONAL_SET_FLAG(cc, F_CF); + CONDITIONAL_SET_FLAG(!emu->res.u64, F_ZF); + CONDITIONAL_SET_FLAG(emu->res.u64 & 0x8000000000000000LL, F_SF); + CONDITIONAL_SET_FLAG(PARITY(emu->res.u64 & 0xff), F_PF); + if (cnt == 1) { + CONDITIONAL_SET_FLAG((emu->op1.u64 ^ emu->res.u64) & 0x8000000000000000LL, F_OF); + } else { + CLEAR_FLAG(F_OF); + } + } + break; case d_sub8: CONDITIONAL_SET_FLAG(emu->res.u8 & 0x80, F_SF); CONDITIONAL_SET_FLAG((emu->res.u8 & 0xff) == 0, F_ZF); @@ -1014,6 +1044,7 @@ 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; -- cgit 1.4.1