about summary refs log tree commit diff stats
path: root/src/emu
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-05-09 22:03:25 +0200
committerptitSeb <sebastien.chev@gmail.com>2024-05-09 22:03:25 +0200
commitff755facc0c0ec502b4476d1144b61055abb3e7b (patch)
tree911d30c96c337df8fa401cb405eed1e24ecd6bf9 /src/emu
parentd38f659f428544de524fe6f2a49355a104055555 (diff)
downloadbox64-ff755facc0c0ec502b4476d1144b61055abb3e7b.tar.gz
box64-ff755facc0c0ec502b4476d1144b61055abb3e7b.zip
[ARM64_DYNAREC] Fix and improvments on rcl/rcr helper
Diffstat (limited to 'src/emu')
-rw-r--r--src/emu/x64run_private.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/src/emu/x64run_private.c b/src/emu/x64run_private.c
index 2891b04c..016092b3 100644
--- a/src/emu/x64run_private.c
+++ b/src/emu/x64run_private.c
@@ -1064,11 +1064,22 @@ void UpdateFlags(x64emu_t *emu)
             // new CF
             CONDITIONAL_SET_FLAG(((cnt==1)?emu->op1.u8:(emu->op1.u8>>(cnt-1))) & 1, F_CF);
             break;
-
         case d_rcl16:
+            cnt = emu->op2.u16%17;
+            CONDITIONAL_SET_FLAG(emu->op1.u16>>(17-cnt) & 1, F_CF);
+            // should for cnt==1
+            CONDITIONAL_SET_FLAG(((emu->res.u16>>15) ^ ACCESS_FLAG(F_CF)) & 1, F_OF);
+            break;
+        case d_rcr16:
+            cnt = emu->op2.u16%17;
+            // should for cnt==1, using "before" CF
+            CONDITIONAL_SET_FLAG(((emu->res.u16>>15) ^ ACCESS_FLAG(F_CF)) & 1, F_OF);
+            // new CF
+            CONDITIONAL_SET_FLAG(((cnt==1)?emu->op1.u16:(emu->op1.u16>>(cnt-1))) & 1, F_CF);
+            break;
+
         case d_rcl32:
         case d_rcl64:
-        case d_rcr16:
         case d_rcr32:
         case d_rcr64:
         case d_unknown: