about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-05-19 19:19:57 +0200
committerptitSeb <sebastien.chev@gmail.com>2024-05-19 19:19:57 +0200
commit47085bb9c9bde482b7852cd11e86dee3925b3fe5 (patch)
treeb71d59b6fa96ef2dceda5a94334f5fe4cd712335 /src
parent73619f4d75e2ee502748b641450ebc90398d7fce (diff)
downloadbox64-47085bb9c9bde482b7852cd11e86dee3925b3fe5.tar.gz
box64-47085bb9c9bde482b7852cd11e86dee3925b3fe5.zip
[INTERPRETER] Added unaligned handling for 32bits F0 83 /0 opcode
Diffstat (limited to 'src')
-rw-r--r--src/emu/x64runf0.c6
1 files changed, 5 insertions, 1 deletions
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;