about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-04-21 13:42:15 +0200
committerptitSeb <sebastien.chev@gmail.com>2021-04-21 13:42:15 +0200
commit3b4de7152c82747526caa29ac5299ef318b77aa1 (patch)
tree752f755d16830cca6e4f595ac0fdc2331448228c /src
parent5520dae2e795dc9a2f38e7e6076a79dcac2b2e7f (diff)
downloadbox64-3b4de7152c82747526caa29ac5299ef318b77aa1.tar.gz
box64-3b4de7152c82747526caa29ac5299ef318b77aa1.zip
Added special case for unaligned LOCK DEC QWord ptr[ED]
Diffstat (limited to 'src')
-rw-r--r--src/emu/x64runf0.c16
1 files changed, 13 insertions, 3 deletions
diff --git a/src/emu/x64runf0.c b/src/emu/x64runf0.c
index 41b51362..d126313f 100644
--- a/src/emu/x64runf0.c
+++ b/src/emu/x64runf0.c
@@ -667,9 +667,19 @@ int RunF0(x64emu_t *emu, rex_t rex)
                 case 1:                 /* DEC Ed */

 #ifdef DYNAREC

                     if(rex.w)

-                        do {

-                            tmp64u = arm64_lock_read_dd(ED);

-                        } while(arm64_lock_write_dd(ED, dec64(emu, tmp64u)));

+                        if(((uintptr_t)ED)&7) {

+                            // unaligned

+                            do {

+                                tmp64u = ED->q[0] & 0xffffffffffffff00LL;

+                                tmp64u |= arm64_lock_read_b(ED);

+                                tmp64u = dec64(emu, tmp64u);

+                            } while(arm64_lock_write_b(ED, tmp64u&0xff));

+                            ED->q[0] = tmp64u;

+                        }

+                        else

+                            do {

+                                tmp64u = arm64_lock_read_dd(ED);

+                            } while(arm64_lock_write_dd(ED, dec64(emu, tmp64u)));

                     else {

                         do {

                             tmp32u = arm64_lock_read_d(ED);