mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-12-06 07:12:28 +01:00
SPU: Optimize check for args sharing page with Effective-Address
This commit is contained in:
parent
1250e428a7
commit
e6dc0d98f5
|
|
@ -4125,7 +4125,7 @@ bool spu_thread::process_mfc_cmd()
|
|||
if (raddr != addr)
|
||||
{
|
||||
// Last check for event before we replace the reservation with a new one
|
||||
if (reservation_check(raddr, rdata))
|
||||
if (~ch_events.load().events & SPU_EVENT_LR && reservation_check(raddr, rdata, addr))
|
||||
{
|
||||
set_events(SPU_EVENT_LR);
|
||||
}
|
||||
|
|
@ -4821,7 +4821,7 @@ bool spu_thread::process_mfc_cmd()
|
|||
ch_mfc_cmd.cmd, ch_mfc_cmd.lsa, ch_mfc_cmd.eal, ch_mfc_cmd.tag, ch_mfc_cmd.size);
|
||||
}
|
||||
|
||||
bool spu_thread::reservation_check(u32 addr, const decltype(rdata)& data) const
|
||||
bool spu_thread::reservation_check(u32 addr, const decltype(rdata)& data, u32 current_eal) const
|
||||
{
|
||||
if (!addr)
|
||||
{
|
||||
|
|
@ -4840,6 +4840,21 @@ bool spu_thread::reservation_check(u32 addr, const decltype(rdata)& data) const
|
|||
return !cmp_rdata(data, *vm::get_super_ptr<decltype(rdata)>(addr));
|
||||
}
|
||||
|
||||
if ((addr >> 20) == (current_eal >> 20))
|
||||
{
|
||||
if (vm::check_addr(addr, vm::page_1m_size))
|
||||
{
|
||||
// Same random-access-memory page as the current MFC command, assume allocated
|
||||
return !cmp_rdata(data, vm::_ref<decltype(rdata)>(addr));
|
||||
}
|
||||
|
||||
if ((addr >> 16) == (current_eal >> 16) && vm::check_addr(addr, vm::page_64k_size))
|
||||
{
|
||||
// Same random-access-memory page as the current MFC command, assume allocated
|
||||
return !cmp_rdata(data, vm::_ref<decltype(rdata)>(addr));
|
||||
}
|
||||
}
|
||||
|
||||
// Ensure data is allocated (HACK: would raise LR event if not)
|
||||
// Set range_lock first optimistically
|
||||
range_lock->store(u64{128} << 32 | addr | vm::range_readable);
|
||||
|
|
|
|||
|
|
@ -901,7 +901,8 @@ public:
|
|||
|
||||
// Returns true if reservation existed but was just discovered to be lost
|
||||
// It is safe to use on any address, even if not directly accessed by SPU (so it's slower)
|
||||
bool reservation_check(u32 addr, const decltype(rdata)& data) const;
|
||||
// Optionally pass a known allocated address for internal optimization (the current Effective-Address of the MFC command)
|
||||
bool reservation_check(u32 addr, const decltype(rdata)& data, u32 current_eal = 0) const;
|
||||
static bool reservation_check(u32 addr, u32 hash, atomic_t<u64, 64>* range_lock);
|
||||
usz register_cache_line_waiter(u32 addr);
|
||||
void deregister_cache_line_waiter(usz index);
|
||||
|
|
|
|||
Loading…
Reference in a new issue