diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2024-01-29 19:58:58 +0100 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2024-01-29 19:58:58 +0100 |
| commit | 37be26e539e3664ec771064879c11c8155097231 (patch) | |
| tree | ea00829ebcdb9c93f07dfbae654e34766502b8ce /src | |
| parent | 96023f2274c56a53630c686c6dc07744c038c01a (diff) | |
| download | box64-37be26e539e3664ec771064879c11c8155097231.tar.gz box64-37be26e539e3664ec771064879c11c8155097231.zip | |
[INTERPRETER] Small improvements to shr/shl to limit fals-positive on DYNAREC_TEST
Diffstat (limited to 'src')
| -rw-r--r-- | src/emu/x64primop.c | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/src/emu/x64primop.c b/src/emu/x64primop.c index 2e9c555b..94bb4348 100644 --- a/src/emu/x64primop.c +++ b/src/emu/x64primop.c @@ -977,7 +977,7 @@ uint16_t shld16 (x64emu_t *emu, uint16_t d, uint16_t fill, uint8_t s) if (cnt == 1) { CONDITIONAL_SET_FLAG(((res ^ d) >> 15)&1, F_OF); } else { - CLEAR_FLAG(F_OF); + CONDITIONAL_SET_FLAG((d >> 15)&1, F_OF); } } else { res = (fill << (cnt)) | (d >> (16 - cnt)); @@ -1014,7 +1014,7 @@ uint32_t shld32 (x64emu_t *emu, uint32_t d, uint32_t fill, uint8_t s) if (cnt == 1) { CONDITIONAL_SET_FLAG(((res ^ d) >> 31)&1, F_OF); } else { - CLEAR_FLAG(F_OF); + CONDITIONAL_SET_FLAG((d >> 31)&1, F_OF); } return res; } @@ -1039,7 +1039,7 @@ uint64_t shld64 (x64emu_t *emu, uint64_t d, uint64_t fill, uint8_t s) if (cnt == 1) { CONDITIONAL_SET_FLAG(((res ^ d) >> 63)&1, F_OF); } else { - CLEAR_FLAG(F_OF); + CONDITIONAL_SET_FLAG((d >> 63)&1, F_OF); } return res; } @@ -1055,7 +1055,7 @@ uint16_t shrd16 (x64emu_t *emu, uint16_t d, uint16_t fill, uint8_t s) s = s&0x1f; cnt = s % 16; - if (s < 16) { + if (s <= 16) { if (cnt > 0) { cf = d & (1 << (cnt - 1)); res = (d >> cnt) | (fill << (16 - cnt)); @@ -1070,7 +1070,7 @@ uint16_t shrd16 (x64emu_t *emu, uint16_t d, uint16_t fill, uint8_t s) if (cnt == 1) { CONDITIONAL_SET_FLAG(((res ^ d) >> 15)&1, F_OF); } else { - CLEAR_FLAG(F_OF); + CONDITIONAL_SET_FLAG((d >> 15)&1, F_OF); } } else { cf = fill & (1 << (cnt - 1)); @@ -1112,7 +1112,7 @@ uint32_t shrd32 (x64emu_t *emu, uint32_t d, uint32_t fill, uint8_t s) if (cnt == 1) { CONDITIONAL_SET_FLAG(((res ^ d) >> 31)&1, F_OF); } else { - CLEAR_FLAG(F_OF); + CONDITIONAL_SET_FLAG((d >> 31)&1, F_OF); } return res; } @@ -1138,7 +1138,7 @@ uint64_t shrd64 (x64emu_t *emu, uint64_t d, uint64_t fill, uint8_t s) if (cnt == 1) { CONDITIONAL_SET_FLAG(((res ^ d) >> 63)&1, F_OF); } else { - CLEAR_FLAG(F_OF); + CONDITIONAL_SET_FLAG((d >> 63)&1, F_OF); } return res; } |