diff --git a/rpcs3/Emu/Cell/PPUThread.cpp b/rpcs3/Emu/Cell/PPUThread.cpp index 1952bcd80c..9ef9545194 100644 --- a/rpcs3/Emu/Cell/PPUThread.cpp +++ b/rpcs3/Emu/Cell/PPUThread.cpp @@ -999,13 +999,6 @@ const auto ppu_stwcx_tx = build_function_asm& data = vm::_ref>(addr); - if (ppu.raddr != addr || ppu.rdata != data.load()) + if (ppu.raddr != addr || ppu.rdata != data.load() || ppu.rtime != vm::reservation_acquire(addr, sizeof(u32))) { ppu.raddr = 0; return false; @@ -1101,13 +1096,6 @@ const auto ppu_stdcx_tx = build_function_asm& data = vm::_ref>(addr); - if (ppu.raddr != addr || ppu.rdata != data.load()) + if (ppu.raddr != addr || ppu.rdata != data.load() || ppu.rtime != vm::reservation_acquire(addr, sizeof(u64))) { ppu.raddr = 0; return false; diff --git a/rpcs3/Emu/Cell/SPUThread.cpp b/rpcs3/Emu/Cell/SPUThread.cpp index 0e681c5d63..5d56997b5b 100644 --- a/rpcs3/Emu/Cell/SPUThread.cpp +++ b/rpcs3/Emu/Cell/SPUThread.cpp @@ -229,13 +229,6 @@ const auto spu_putllc_tx = build_function_asm([](asmjit::X86Assembler& c, auto& args) @@ -312,10 +307,6 @@ const auto spu_getll_tx = build_function_asm([]( c.shr(args[0], 4); c.lea(x86::r10, x86::qword_ptr(x86::r10, args[0])); - // Touch memory - c.mov(x86::rax, x86::qword_ptr(x86::r11)); - c.mov(x86::rax, x86::qword_ptr(x86::r10)); - // Begin transaction build_transaction_enter(c, fall); c.mov(x86::rax, x86::qword_ptr(x86::r10)); @@ -331,7 +322,10 @@ const auto spu_getll_tx = build_function_asm([]( c.vzeroupper(); c.ret(); + // Touch memory after transaction failure c.bind(fall); + c.mov(x86::rax, x86::qword_ptr(x86::r11)); + c.mov(x86::rax, x86::qword_ptr(x86::r10)); c.mov(x86::eax, 1); c.ret(); }); @@ -351,10 +345,6 @@ const auto spu_putlluc_tx = build_function_asm