diff --git a/rpcs3/Emu/Cell/PPUThread.cpp b/rpcs3/Emu/Cell/PPUThread.cpp index a1a0a427b6..0d9269af04 100644 --- a/rpcs3/Emu/Cell/PPUThread.cpp +++ b/rpcs3/Emu/Cell/PPUThread.cpp @@ -1227,7 +1227,7 @@ static bool ppu_store_reservation(ppu_thread& ppu, u32 addr, T reg_value) const T old_data = static_cast(ppu.rdata << ((addr & 7) * 8) >> size_off); auto& res = vm::reservation_acquire(addr, sizeof(T)); - if (std::exchange(ppu.raddr, 0) != addr || addr % sizeof(T) || old_data != data || ppu.rtime != res) + if (std::exchange(ppu.raddr, 0) != addr || addr % sizeof(T) || old_data != data || ppu.rtime != (res & -128)) { return false; } diff --git a/rpcs3/Emu/Cell/SPUThread.cpp b/rpcs3/Emu/Cell/SPUThread.cpp index 5ab587c1a6..b931bec5c4 100644 --- a/rpcs3/Emu/Cell/SPUThread.cpp +++ b/rpcs3/Emu/Cell/SPUThread.cpp @@ -2021,7 +2021,7 @@ bool spu_thread::process_mfc_cmd() if (raddr && raddr != addr) { // Last check for event before we replace the reservation with a new one - if (vm::reservation_acquire(raddr, 128) != rtime || !cmp_rdata(rdata, vm::_ref(raddr))) + if ((vm::reservation_acquire(raddr, 128) & -128) != rtime || !cmp_rdata(rdata, vm::_ref(raddr))) { ch_event_stat |= SPU_EVENT_LR; } @@ -2063,7 +2063,7 @@ bool spu_thread::process_mfc_cmd() return false; } - if (cmp_rdata(to_write, rdata)) + if (!g_use_rtm && cmp_rdata(to_write, rdata)) { // Writeback of unchanged data. Only check memory change return cmp_rdata(rdata, vm::_ref(addr)) && res.compare_and_swap_test(rtime, rtime + 128);