about summary refs log tree commit diff stats
path: root/src/emu
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-11-15 21:05:41 +0100
committerptitSeb <sebastien.chev@gmail.com>2024-11-15 21:05:41 +0100
commit385a31ec1183eeed8ed357ab58bf5a6da582622c (patch)
tree00c9ef97d02d76777c500ad5ec49aa6d7a7500a3 /src/emu
parent5c49954f6993959d425aee316b391e6221e35165 (diff)
downloadbox64-385a31ec1183eeed8ed357ab58bf5a6da582622c.tar.gz
box64-385a31ec1183eeed8ed357ab58bf5a6da582622c.zip
[ARM64_DYNAREC] Various fixes and improvments to a few random opcodes
Diffstat (limited to 'src/emu')
-rw-r--r--src/emu/x64run_private.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/src/emu/x64run_private.c b/src/emu/x64run_private.c
index 6027a744..a2bc6020 100644
--- a/src/emu/x64run_private.c
+++ b/src/emu/x64run_private.c
@@ -216,6 +216,15 @@ void UpdateFlags(x64emu_t *emu)
             CONDITIONAL_SET_FLAG(XOR2(cc >> 6), F_OF);
             CONDITIONAL_SET_FLAG(cc & 0x8, F_AF);
             break;
+        case d_add8b:
+            CONDITIONAL_SET_FLAG(((uint16_t)emu->op1.u8+emu->op2.u8) & 0x100, F_CF);
+            CONDITIONAL_SET_FLAG(!emu->res.u8, F_ZF);
+            CONDITIONAL_SET_FLAG(emu->res.u8 & 0x80, F_SF);
+            CONDITIONAL_SET_FLAG(PARITY(emu->res.u8), F_PF);
+            cc = (emu->op1.u8 & emu->op2.u8) | ((~emu->res.u8) & (emu->op1.u8 | emu->op2.u8));
+            CONDITIONAL_SET_FLAG(XOR2(cc >> 6), F_OF);
+            CONDITIONAL_SET_FLAG(cc & 0x8, F_AF);
+            break;
         case d_add16:
             CONDITIONAL_SET_FLAG(emu->res.u32 & 0x10000, F_CF);
             CONDITIONAL_SET_FLAG(!emu->res.u16, F_ZF);
@@ -225,6 +234,15 @@ void UpdateFlags(x64emu_t *emu)
             CONDITIONAL_SET_FLAG(XOR2(cc >> 14), F_OF);
             CONDITIONAL_SET_FLAG(cc & 0x8, F_AF);
             break;
+        case d_add16b:
+            CONDITIONAL_SET_FLAG(((uint32_t)emu->op1.u16+emu->op2.u16) & 0x10000, 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.u8), F_PF);
+            cc = (emu->op1.u16 & emu->op2.u16) | ((~emu->res.u16) & (emu->op1.u16 | emu->op2.u16));
+            CONDITIONAL_SET_FLAG(XOR2(cc >> 14), F_OF);
+            CONDITIONAL_SET_FLAG(cc & 0x8, F_AF);
+            break;
         case d_add32:
             CONDITIONAL_SET_FLAG(emu->res.u64 & 0x100000000LL, F_CF);
             CONDITIONAL_SET_FLAG(!emu->res.u32, F_ZF);