about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-01-06 10:56:59 +0100
committerptitSeb <sebastien.chev@gmail.com>2024-01-06 10:56:59 +0100
commit18e0af6b3844253d4c8214e458427e863df0204d (patch)
treee0d54f4af56506bcf3437eae1ed3f87230a9bfad /src
parented87cc1b1ead7129da93a09a6cbdbbf11d2c5e40 (diff)
downloadbox64-18e0af6b3844253d4c8214e458427e863df0204d.tar.gz
box64-18e0af6b3844253d4c8214e458427e863df0204d.zip
[INTERPRETER] Added support for unaligned F0 0F BA /5 opcode
Diffstat (limited to 'src')
-rw-r--r--src/emu/x64runf0.c36
1 files changed, 25 insertions, 11 deletions
diff --git a/src/emu/x64runf0.c b/src/emu/x64runf0.c
index a7ff67b8..10747155 100644
--- a/src/emu/x64runf0.c
+++ b/src/emu/x64runf0.c
@@ -494,17 +494,31 @@ uintptr_t RunF0(x64emu_t *emu, rex_t rex, uintptr_t addr)
                                     } while(tmp32s);

                                 } else {

                                     tmp8u&=31;

-                                    do {

-                                        tmp32u = native_lock_read_d(ED);

-                                        if(tmp32u & (1<<tmp8u)) {

-                                            SET_FLAG(F_CF);

-                                            tmp32s = 0;

-                                        } else {

-                                            tmp32u ^= (1<<tmp8u);

-                                            tmp32s = native_lock_write_d(ED, tmp32u);

-                                            CLEAR_FLAG(F_CF);

-                                        }

-                                    } while(tmp32s);

+                                    if((uintptr_t)ED&3) {

+                                        do {

+                                            tmp32u = native_lock_read_b(ED+(tmp8u>>3));

+                                            if(tmp32u & (1<<(tmp8u&7))) {

+                                                SET_FLAG(F_CF);

+                                                tmp32s = 0;

+                                            } else {

+                                                tmp32u ^= (1<<(tmp8u&7));

+                                                tmp32s = native_lock_write_b(ED+(tmp8u>>3), tmp32u);

+                                                CLEAR_FLAG(F_CF);

+                                            }

+                                        } while(tmp32s);

+                                    } else {

+                                        do {

+                                            tmp32u = native_lock_read_d(ED);

+                                            if(tmp32u & (1<<tmp8u)) {

+                                                SET_FLAG(F_CF);

+                                                tmp32s = 0;

+                                            } else {

+                                                tmp32u ^= (1<<tmp8u);

+                                                tmp32s = native_lock_write_d(ED, tmp32u);

+                                                CLEAR_FLAG(F_CF);

+                                            }

+                                        } while(tmp32s);

+                                    }

                                 }

 #else

                                 pthread_mutex_lock(&my_context->mutex_lock);