mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-05 06:21:26 +12:00
SPU: Improved GETLLAR spin detection conditions
This commit is contained in:
parent
a9b911750f
commit
208c4e2af2
2 changed files with 22 additions and 0 deletions
|
@ -4781,6 +4781,26 @@ bool spu_thread::process_mfc_cmd()
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (last_getllar != pc || last_getllar_lsa != ch_mfc_cmd.lsa)
|
||||||
|
{
|
||||||
|
getllar_busy_waiting_switch = umax;
|
||||||
|
getllar_spin_count = 0;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if LSA points to an OUT buffer on the stack from a caller - unlikely to be a loop
|
||||||
|
if (last_getllar_lsa >= SPU_LS_SIZE - 0x10000 && last_getllar_lsa > last_getllar_gpr1)
|
||||||
|
{
|
||||||
|
auto cs = dump_callstack_list();
|
||||||
|
|
||||||
|
if (!cs.empty() && last_getllar_lsa > cs[0].second)
|
||||||
|
{
|
||||||
|
getllar_busy_waiting_switch = umax;
|
||||||
|
getllar_spin_count = 0;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
getllar_spin_count = std::min<u32>(getllar_spin_count + 1, u16{umax});
|
getllar_spin_count = std::min<u32>(getllar_spin_count + 1, u16{umax});
|
||||||
|
|
||||||
if (getllar_busy_waiting_switch == umax && getllar_spin_count == 4)
|
if (getllar_busy_waiting_switch == umax && getllar_spin_count == 4)
|
||||||
|
@ -4826,6 +4846,7 @@ bool spu_thread::process_mfc_cmd()
|
||||||
|
|
||||||
last_getllar = pc;
|
last_getllar = pc;
|
||||||
last_getllar_gpr1 = gpr[1]._u32[3];
|
last_getllar_gpr1 = gpr[1]._u32[3];
|
||||||
|
last_getllar_lsa = ch_mfc_cmd.lsa;
|
||||||
|
|
||||||
if (getllar_busy_waiting_switch == 1)
|
if (getllar_busy_waiting_switch == 1)
|
||||||
{
|
{
|
||||||
|
|
|
@ -802,6 +802,7 @@ public:
|
||||||
u32 last_getllar = umax; // LS address of last GETLLAR (if matches current GETLLAR we can let the thread rest)
|
u32 last_getllar = umax; // LS address of last GETLLAR (if matches current GETLLAR we can let the thread rest)
|
||||||
u32 last_getllar_gpr1 = umax;
|
u32 last_getllar_gpr1 = umax;
|
||||||
u32 last_getllar_addr = umax;
|
u32 last_getllar_addr = umax;
|
||||||
|
u32 last_getllar_lsa = umax;
|
||||||
u32 getllar_spin_count = 0;
|
u32 getllar_spin_count = 0;
|
||||||
u32 getllar_busy_waiting_switch = umax; // umax means the test needs evaluation, otherwise it's a boolean
|
u32 getllar_busy_waiting_switch = umax; // umax means the test needs evaluation, otherwise it's a boolean
|
||||||
u64 getllar_evaluate_time = 0;
|
u64 getllar_evaluate_time = 0;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue