about summary refs log tree commit diff stats
path: root/src/emu/x64runf0.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/emu/x64runf0.c')
-rw-r--r--src/emu/x64runf0.c22
1 files changed, 11 insertions, 11 deletions
diff --git a/src/emu/x64runf0.c b/src/emu/x64runf0.c
index b4af10c1..43b6b1d7 100644
--- a/src/emu/x64runf0.c
+++ b/src/emu/x64runf0.c
@@ -942,34 +942,34 @@ uintptr_t RunF0(x64emu_t *emu, rex_t rex, uintptr_t addr)
 #endif

                             } else

                                 if(((uintptr_t)ED)&0x7) {

+                                    tmp64u = R_EAX | (((uint64_t)R_EDX)<<32);

                                     do {

                                         native_lock_get_b(ED);

-                                        tmp64u = ED->q[0];

-                                        if((R_EAX == (tmp64u&0xffffffff)) && (R_EDX == ((tmp64u>>32)&0xffffffff))) {

+                                        tmp64u2 = ED->q[0];

+                                        if(tmp64u == tmp64u2) {

                                             SET_FLAG(F_ZF);

                                             tmp32s = native_lock_write_b(ED, emu->regs[_BX].byte[0]);

                                             if(!tmp32s)

                                                 ED->q[0] = R_EBX|(((uint64_t)R_ECX)<<32);

                                         } else {

                                             CLEAR_FLAG(F_ZF);

-                                            R_RAX = tmp64u&0xffffffff;

-                                            R_RDX = (tmp64u>>32)&0xffffffff;

+                                            R_RAX = tmp64u2&0xffffffff;

+                                            R_RDX = (tmp64u2>>32)&0xffffffff;

                                             tmp32s = 0;

                                         }

                                     } while(tmp32s);

-                                } else

-                                do {

-                                    tmp64u = native_lock_read_dd(ED);

-                                    if((R_EAX == (tmp64u&0xffffffff)) && (R_EDX == ((tmp64u>>32)&0xffffffff))) {

+                                } else {

+                                    tmp64u = R_EAX | (((uint64_t)R_EDX)<<32);

+                                    tmp64u2 = R_EBX | (((uint64_t)R_ECX)<<32);

+                                    tmp64u2 = (uint64_t)native_lock_storeifref2(ED, (void*)tmp64u2, (void*)tmp64u);

+                                    if(tmp64u2==tmp64u) {

                                         SET_FLAG(F_ZF);

-                                        tmp32s = native_lock_write_dd(ED, R_EBX|(((uint64_t)R_ECX)<<32));

                                     } else {

                                         CLEAR_FLAG(F_ZF);

                                         R_RAX = tmp64u&0xffffffff;

                                         R_RDX = (tmp64u>>32)&0xffffffff;

-                                        tmp32s = 0;

                                     }

-                                } while(tmp32s);

+                                }

 #else

                             pthread_mutex_lock(&my_context->mutex_lock);

                             if(rex.w) {