about summary refs log tree commit diff stats
path: root/src/emu
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2023-11-16 15:10:56 +0100
committerptitSeb <sebastien.chev@gmail.com>2023-11-16 15:10:56 +0100
commitc17e37b6e0c4d686702aa9abfdcc58b227626a2b (patch)
tree9470193ca07e676ae1e80cb48764894844e012b7 /src/emu
parentdf25986597a6c24984fd81a5eb14b95754ed6973 (diff)
downloadbox64-c17e37b6e0c4d686702aa9abfdcc58b227626a2b.tar.gz
box64-c17e37b6e0c4d686702aa9abfdcc58b227626a2b.zip
[ARM64_DYNAREC] Optimized 66 0F A4 opcode
Diffstat (limited to 'src/emu')
-rw-r--r--src/emu/x64run_private.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/src/emu/x64run_private.c b/src/emu/x64run_private.c
index 1eaa6301..6400e06c 100644
--- a/src/emu/x64run_private.c
+++ b/src/emu/x64run_private.c
@@ -731,6 +731,21 @@ void UpdateFlags(x64emu_t *emu)
                 }
             }
             break;
+        case d_shld16:
+            cnt = emu->op2.u16;
+            if (cnt > 0) {
+                cc = emu->op1.u16 & (1 << (16 - cnt));
+                CONDITIONAL_SET_FLAG(cc, F_CF);
+                CONDITIONAL_SET_FLAG(!emu->res.u16, F_ZF);
+                CONDITIONAL_SET_FLAG(emu->res.u16 & 0x8000, F_SF);
+                CONDITIONAL_SET_FLAG(PARITY(emu->res.u16 & 0xff), F_PF);
+                if (cnt == 1) {
+                    CONDITIONAL_SET_FLAG((emu->op1.u16 ^ emu->res.u16) & 0x8000, F_OF);
+                } else {
+                    CLEAR_FLAG(F_OF);
+                }
+            }
+            break;
         case d_shld32:
             cnt = emu->op2.u32;
             if (cnt > 0) {
@@ -1044,7 +1059,6 @@ 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;