From 1c0dc8ec7c2d06a1c14c5c7349e08fe89fd00470 Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Sun, 2 Feb 2025 16:10:56 +0100 Subject: [COSIM] Reduce false negative on rcl/rcr OF flag --- src/emu/x64primop.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/emu/x64primop.c b/src/emu/x64primop.c index 129069ad..85abdd07 100644 --- a/src/emu/x64primop.c +++ b/src/emu/x64primop.c @@ -568,6 +568,8 @@ uint32_t rcl32(x64emu_t *emu, uint32_t d, uint8_t s) CONDITIONAL_SET_FLAG(cf, F_CF); if(cnt == 1) CONDITIONAL_SET_FLAG((cf ^ (res >> 31)) & 0x1, F_OF); + else + CLEAR_FLAG(F_OF); // UND, but clear for dynarec_test } return res; } @@ -590,6 +592,8 @@ uint64_t rcl64(x64emu_t *emu, uint64_t d, uint8_t s) CONDITIONAL_SET_FLAG(cf, F_CF); if(cnt == 1) CONDITIONAL_SET_FLAG((cf ^ (res >> 63)) & 0x1, F_OF); + else + CLEAR_FLAG(F_OF); // UND, but clear for dynarec_test } return res; } @@ -720,8 +724,10 @@ uint32_t rcr32(x64emu_t *emu, uint32_t d, uint8_t s) ocf = ACCESS_FLAG(F_CF) != 0; CONDITIONAL_SET_FLAG((ocf ^ (d >> 31)) & 0x1, F_OF); - } else + } else { cf = (d >> (cnt - 1)) & 0x1; + CLEAR_FLAG(F_OF); // UND, but clear for dynarec_test + } mask = (1 << (32 - cnt)) - 1; res = (d >> cnt) & mask; if (cnt != 1) @@ -749,8 +755,10 @@ uint64_t rcr64(x64emu_t *emu, uint64_t d, uint8_t s) ocf = ACCESS_FLAG(F_CF) != 0; CONDITIONAL_SET_FLAG((ocf ^ (d >> 63)) & 0x1, F_OF); - } else + } else { cf = (d >> (cnt - 1)) & 0x1; + CLEAR_FLAG(F_OF); // UND, but clear for dynarec_test + } mask = (1LL << (64 - cnt)) - 1; res = (d >> cnt) & mask; if (cnt != 1) -- cgit 1.4.1