about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-01-29 19:58:58 +0100
committerptitSeb <sebastien.chev@gmail.com>2024-01-29 19:58:58 +0100
commit37be26e539e3664ec771064879c11c8155097231 (patch)
treeea00829ebcdb9c93f07dfbae654e34766502b8ce /src
parent96023f2274c56a53630c686c6dc07744c038c01a (diff)
downloadbox64-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.c14
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;
 }