diff --git a/rpcs3/Emu/Cell/PPUThread.cpp b/rpcs3/Emu/Cell/PPUThread.cpp index 9ce7f07f3e..702c470266 100644 --- a/rpcs3/Emu/Cell/PPUThread.cpp +++ b/rpcs3/Emu/Cell/PPUThread.cpp @@ -1263,10 +1263,10 @@ static T ppu_load_acquire_reservation(ppu_thread& ppu, u32 addr) { if (!ppu.use_full_rdata) { - if (ppu.rtime & vm::rsrv_shared_mask) + if (ppu.rtime & 127) { // Let the ongoing operation some tiny time to complete - busy_wait(100); + busy_wait(200); } if (data.load() != rdata) @@ -1378,14 +1378,10 @@ const auto ppu_stcx_accurate_tx = build_function_asm(cpu_flag::pause)); - c.mov(x86::eax, _XABORT_EXPLICIT); - c.jc(fall); c.xbegin(tx0); c.mov(x86::rax, x86::qword_ptr(x86::rbx)); - c.test(x86::eax, vm::rsrv_unique_lock); + c.test(x86::eax, 127); c.jnz(skip); - c.and_(x86::rax, -128); c.cmp(x86::rax, x86::r13); c.jne(fail); @@ -1475,19 +1471,19 @@ const auto ppu_stcx_accurate_tx = build_function_asm(cpu_flag::pause)); c.jc(fall2); c.mov(x86::rax, x86::qword_ptr(x86::rbx)); - c.test(x86::eax, vm::rsrv_shared_mask); - c.jnz(fall2); + c.and_(x86::rax, -128); c.cmp(x86::rax, x86::r13); - c.jne(fail4); + c.jne(fail2); c.xbegin(tx1); if (s_tsx_avx) @@ -1540,7 +1535,7 @@ const auto ppu_stcx_accurate_tx = build_function_asm(&ppu, [&] + return cpu_thread::suspend_all(&ppu, [&] { if ((res & -128) == rtime && cmp_rdata(ppu.rdata, vm::_ref(addr & -128))) { data.release(reg_value); - res += 64; + res += 127; return true; } - res -= vm::rsrv_unique_lock; + res -= 1; return false; }); } diff --git a/rpcs3/Emu/Cell/SPUThread.cpp b/rpcs3/Emu/Cell/SPUThread.cpp index 27591f9d03..35d702a860 100644 --- a/rpcs3/Emu/Cell/SPUThread.cpp +++ b/rpcs3/Emu/Cell/SPUThread.cpp @@ -398,14 +398,10 @@ const auto spu_putllc_tx = build_function_asm(cpu_flag::pause)); - c.mov(x86::eax, _XABORT_EXPLICIT); - c.jc(fall); c.xbegin(tx0); c.mov(x86::rax, x86::qword_ptr(x86::rbx)); - c.test(x86::eax, vm::rsrv_unique_lock); + c.test(x86::eax, 127); c.jnz(skip); - c.and_(x86::rax, -128); c.cmp(x86::rax, x86::r13); c.jne(fail); @@ -510,19 +506,19 @@ const auto spu_putllc_tx = build_function_asm(cpu_flag::pause)); c.jc(fall2); c.mov(x86::rax, x86::qword_ptr(x86::rbx)); - c.test(x86::eax, vm::rsrv_shared_mask); - c.jnz(fall2); + c.and_(x86::rax, -128); c.cmp(x86::rax, x86::r13); - c.jne(fail4); + c.jne(fail2); c.xbegin(tx1); if (s_tsx_avx) @@ -591,7 +586,7 @@ const auto spu_putllc_tx = build_function_asm(cpu_flag::pause)); c.jc(fall2); - // Check contention - c.test(x86::qword_ptr(x86::rbx), 127 - 1); - c.jc(fall2); c.xbegin(tx1); if (s_tsx_avx) @@ -2300,12 +2292,12 @@ bool spu_thread::do_putllc(const spu_mfc_cmd& args) if (cmp_rdata(rdata, data)) { mov_rdata(data, to_write); - res += 64; + res += 127; return true; } } - res -= vm::rsrv_unique_lock; + res -= 1; return false; }); @@ -2405,7 +2397,7 @@ void do_cell_atomic_128_store(u32 addr, const void* to_write) if (result == 0) { // Execute with increased priority - cpu_thread::suspend_all<0>(cpu, [&] + cpu_thread::suspend_all<+1>(cpu, [&] { mov_rdata(vm::_ref(addr), *static_cast(to_write)); vm::reservation_acquire(addr, 128) += 127;