From e8e3a3b2a2ebd8619c72ab1921df22b3fed03606 Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Sat, 10 Oct 2020 17:36:41 +0300 Subject: [PATCH] PPU: improve LWARX/LDARX progression Should reduce spam ("...took too long") --- rpcs3/Emu/Cell/PPUThread.cpp | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/rpcs3/Emu/Cell/PPUThread.cpp b/rpcs3/Emu/Cell/PPUThread.cpp index a070e86c67..1555457580 100644 --- a/rpcs3/Emu/Cell/PPUThread.cpp +++ b/rpcs3/Emu/Cell/PPUThread.cpp @@ -1176,15 +1176,20 @@ static T ppu_load_acquire_reservation(ppu_thread& ppu, u32 addr) { ppu.rtime = vm::reservation_acquire(addr, sizeof(T)); - if (ppu.rtime & 127) + if (ppu.rtime & vm::rsrv_unique_lock) { continue; } - const auto rdata = data.load(); + const be_t rdata = data.load(); if (ppu.use_full_rdata) { + if (ppu.rtime & 127) + { + continue; + } + mov_rdata(ppu.rdata, vm::_ref(addr & -128)); } @@ -1195,7 +1200,20 @@ static T ppu_load_acquire_reservation(ppu_thread& ppu, u32 addr) ppu_log.warning("%s took too long: %u", sizeof(T) == 4 ? "LWARX" : "LDARX", count); } - std::memcpy(&ppu.rdata[addr & 0x78], &rdata, 8); // Store atomic 64bits of rdata + if (!ppu.use_full_rdata) + { + if (data.load() != rdata) + { + continue; + } + + // Clear some possible lock bits which are permitted + ppu.rtime &= -128; + + // Store only 64 bits of reservation data + std::memcpy(&ppu.rdata[addr & 0x78], &rdata, 8); + } + return static_cast(rdata << data_off >> size_off); } }