From 47085bb9c9bde482b7852cd11e86dee3925b3fe5 Mon Sep 17 00:00:00 2001 From: ptitSeb Date: Sun, 19 May 2024 19:19:57 +0200 Subject: [INTERPRETER] Added unaligned handling for 32bits F0 83 /0 opcode --- src/emu/x64runf0.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/emu/x64runf0.c b/src/emu/x64runf0.c index 58c03f16..70d945ec 100644 --- a/src/emu/x64runf0.c +++ b/src/emu/x64runf0.c @@ -941,7 +941,11 @@ uintptr_t RunF0(x64emu_t *emu, rex_t rex, uintptr_t addr) } else switch((nextop>>3)&7) { - case 0: do { tmp32u2 = native_lock_read_d(ED); tmp32u2 = add32(emu, tmp32u2, tmp64u);} while(native_lock_write_d(ED, tmp32u2)); break; + case 0: if(((uintptr_t)ED)&3) { + // unaligned case + do { tmp32u2 = native_lock_read_b(ED); tmp32u2=ED->dword[0]; tmp32u2 = add32(emu, tmp32u2, tmp64u);} while(native_lock_write_b(ED, tmp32u2)); ED->dword[0]=tmp32u2; break; + } else + do { tmp32u2 = native_lock_read_d(ED); tmp32u2 = add32(emu, tmp32u2, tmp64u);} while(native_lock_write_d(ED, tmp32u2)); break; case 1: do { tmp32u2 = native_lock_read_d(ED); tmp32u2 = or32(emu, tmp32u2, tmp64u);} while(native_lock_write_d(ED, tmp32u2)); break; case 2: do { tmp32u2 = native_lock_read_d(ED); tmp32u2 = adc32(emu, tmp32u2, tmp64u);} while(native_lock_write_d(ED, tmp32u2)); break; case 3: do { tmp32u2 = native_lock_read_d(ED); tmp32u2 = sbb32(emu, tmp32u2, tmp64u);} while(native_lock_write_d(ED, tmp32u2)); break; -- cgit 1.4.1