diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2025-08-01 11:12:43 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2025-08-01 11:12:43 +0200 |
| commit | a17811f4a615f417a5742dde62ab683cf80020b0 (patch) | |
| tree | f117a109605e5563f734ad075402bcb286b02110 /src/emu | |
| parent | d2c77ddb01a369efafec053de967b5174705d165 (diff) | |
| download | box64-a17811f4a615f417a5742dde62ab683cf80020b0.tar.gz box64-a17811f4a615f417a5742dde62ab683cf80020b0.zip | |
[INTERP] Try to improve aligned LOCK CMPXCHG8B opcode
Diffstat (limited to 'src/emu')
| -rw-r--r-- | src/emu/x64runf0.c | 22 |
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) { |