Skip to content

Commit

Permalink
SPU: Extend Inaccurate SPU reservations
Browse files Browse the repository at this point in the history
  • Loading branch information
elad335 committed Sep 9, 2022
1 parent 60fc90b commit 8464708
Showing 1 changed file with 33 additions and 11 deletions.
44 changes: 33 additions & 11 deletions rpcs3/Emu/Cell/SPUThread.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2804,16 +2804,25 @@ bool spu_thread::do_putllc(const spu_mfc_cmd& args)
const auto& to_write = _ref<spu_rdata_t>(args.lsa & 0x3ff80);
auto& res = vm::reservation_acquire(addr);

// TODO: Limit scope!!
rsx::reservation_lock rsx_lock(addr, 128);

if (rtime != res)
{
if (!g_cfg.core.spu_accurate_reservations && cmp_rdata(to_write, rdata))
{
raddr = 0;
return true;
}

return false;
}

if (cmp_rdata(to_write, rdata))
{
if (!g_cfg.core.spu_accurate_reservations)
{
raddr = 0;
return true;
}

// Writeback of unchanged data. Only check memory change
if (cmp_rdata(rdata, vm::_ref<spu_rdata_t>(addr)) && res.compare_and_swap_test(rtime, rtime + 128))
{
Expand All @@ -2824,6 +2833,9 @@ bool spu_thread::do_putllc(const spu_mfc_cmd& args)
return false;
}

// TODO: Limit scope!!
rsx::reservation_lock rsx_lock(addr, 128);

auto [_oldd, _ok] = res.fetch_op([&](u64& r)
{
if ((r & -128) != rtime || (r & 127))
Expand All @@ -2841,11 +2853,18 @@ bool spu_thread::do_putllc(const spu_mfc_cmd& args)
return false;
}

if (!g_cfg.core.spu_accurate_reservations && addr - spurs_addr <= 0x80)
if (!g_cfg.core.spu_accurate_reservations)
{
mov_rdata(vm::_ref<spu_rdata_t>(addr), to_write);
res += 64;
return true;
if (addr - spurs_addr <= 0x80)
{
mov_rdata(vm::_ref<spu_rdata_t>(addr), to_write);
res += 64;
return true;
}
}
else if (!g_use_rtm)
{
vm::_ref<atomic_t<u32>>(addr) += 0;
}

if (g_use_rtm) [[likely]]
Expand Down Expand Up @@ -2929,8 +2948,6 @@ bool spu_thread::do_putllc(const spu_mfc_cmd& args)
return true;
}

vm::_ref<atomic_t<u32>>(addr) += 0;

auto& super_data = *vm::get_super_ptr<spu_rdata_t>(addr);
const bool success = [&]()
{
Expand Down Expand Up @@ -3068,7 +3085,12 @@ void do_cell_atomic_128_store(u32 addr, const void* to_write)

u64 result = 1;

if (cpu->state & cpu_flag::pause)
if (!g_cfg.core.spu_accurate_reservations)
{
mov_rdata(sdata, *static_cast<const spu_rdata_t*>(to_write));
vm::reservation_acquire(addr) += 32;
}
else if (cpu->state & cpu_flag::pause)
{
result = 0;
}
Expand Down Expand Up @@ -3119,7 +3141,7 @@ void spu_thread::do_putlluc(const spu_mfc_cmd& args)

const u32 addr = args.eal & -128;

if (raddr && addr == raddr)
if (raddr && addr == raddr && g_cfg.core.spu_accurate_reservations)
{
// Try to process PUTLLUC using PUTLLC when a reservation is active:
// If it fails the reservation is cleared, LR event is set and we fallback to the main implementation
Expand Down

0 comments on commit 8464708

Please sign in to comment.