diff --git a/rpcs3/Emu/Cell/PPUThread.cpp b/rpcs3/Emu/Cell/PPUThread.cpp index 9844471289..9ce7f07f3e 100644 --- a/rpcs3/Emu/Cell/PPUThread.cpp +++ b/rpcs3/Emu/Cell/PPUThread.cpp @@ -1378,10 +1378,14 @@ 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, 127); + c.test(x86::eax, vm::rsrv_unique_lock); c.jnz(skip); + c.and_(x86::rax, -128); c.cmp(x86::rax, x86::r13); c.jne(fail); @@ -1471,19 +1475,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.and_(x86::rax, -128); + c.test(x86::eax, vm::rsrv_shared_mask); + c.jnz(fall2); c.cmp(x86::rax, x86::r13); - c.jne(fail2); + c.jne(fail4); c.xbegin(tx1); if (s_tsx_avx) @@ -1535,7 +1540,7 @@ const auto ppu_stcx_accurate_tx = build_function_asm(&ppu, [&] { if ((res & -128) == rtime && cmp_rdata(ppu.rdata, vm::_ref(addr & -128))) { data.release(reg_value); - res += 127; + res += 64; return true; } - res -= 1; + res -= vm::rsrv_unique_lock; return false; }); } diff --git a/rpcs3/Emu/Cell/SPUThread.cpp b/rpcs3/Emu/Cell/SPUThread.cpp index 35d702a860..27591f9d03 100644 --- a/rpcs3/Emu/Cell/SPUThread.cpp +++ b/rpcs3/Emu/Cell/SPUThread.cpp @@ -398,10 +398,14 @@ 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, 127); + c.test(x86::eax, vm::rsrv_unique_lock); c.jnz(skip); + c.and_(x86::rax, -128); c.cmp(x86::rax, x86::r13); c.jne(fail); @@ -506,19 +510,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.and_(x86::rax, -128); + c.test(x86::eax, vm::rsrv_shared_mask); + c.jnz(fall2); c.cmp(x86::rax, x86::r13); - c.jne(fail2); + c.jne(fail4); c.xbegin(tx1); if (s_tsx_avx) @@ -586,7 +591,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) @@ -2292,12 +2300,12 @@ bool spu_thread::do_putllc(const spu_mfc_cmd& args) if (cmp_rdata(rdata, data)) { mov_rdata(data, to_write); - res += 127; + res += 64; return true; } } - res -= 1; + res -= vm::rsrv_unique_lock; return false; }); @@ -2397,7 +2405,7 @@ void do_cell_atomic_128_store(u32 addr, const void* to_write) if (result == 0) { // Execute with increased priority - cpu_thread::suspend_all<+1>(cpu, [&] + cpu_thread::suspend_all<0>(cpu, [&] { mov_rdata(vm::_ref(addr), *static_cast(to_write)); vm::reservation_acquire(addr, 128) += 127;