diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2021-04-21 13:42:15 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2021-04-21 13:42:15 +0200 |
| commit | 3b4de7152c82747526caa29ac5299ef318b77aa1 (patch) | |
| tree | 752f755d16830cca6e4f595ac0fdc2331448228c /src | |
| parent | 5520dae2e795dc9a2f38e7e6076a79dcac2b2e7f (diff) | |
| download | box64-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.c | 16 |
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); |