about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
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);