CPU/Recompiler: Check downcount in interpret block

Fixes application locking up with CDS=Max in Driver.
pull/3526/head
Stenzek 2 months ago
parent 6e926041e5
commit 34e0eab9f1
No known key found for this signature in database

@ -259,6 +259,7 @@ u32 CPU::CodeCache::EmitASMFunctions(void* code, u32 code_size)
#endif
Label dispatch;
Label run_events_and_dispatch;
g_enter_recompiler = armAsm->GetCursorAddress<decltype(g_enter_recompiler)>();
{
@ -276,6 +277,7 @@ u32 CPU::CodeCache::EmitASMFunctions(void* code, u32 code_size)
armAsm->b(lt, &skip_event_check);
g_run_events_and_dispatch = armAsm->GetCursorAddress<const void*>();
armAsm->bind(&run_events_and_dispatch);
armEmitCall(armAsm, reinterpret_cast<const void*>(&TimingEvents::RunEvents), true);
armAsm->bind(&skip_event_check);
@ -315,6 +317,10 @@ u32 CPU::CodeCache::EmitASMFunctions(void* code, u32 code_size)
g_interpret_block = armAsm->GetCursorAddress<const void*>();
{
armEmitCall(armAsm, reinterpret_cast<const void*>(GetInterpretUncachedBlockFunction()), true);
armAsm->ldr(RARG1, PTR(&g_state.pending_ticks));
armAsm->ldr(RARG2, PTR(&g_state.downcount));
armAsm->cmp(RARG1, RARG2);
armAsm->b(ge, &run_events_and_dispatch);
armAsm->b(&dispatch);
}

@ -453,6 +453,7 @@ u32 CPU::CodeCache::EmitASMFunctions(void* code, u32 code_size)
#endif
Label dispatch;
Label run_events_and_dispatch;
g_enter_recompiler = armAsm->GetCursorAddress<decltype(g_enter_recompiler)>();
{
@ -476,6 +477,7 @@ u32 CPU::CodeCache::EmitASMFunctions(void* code, u32 code_size)
armAsm->b(&dispatch, lt);
g_run_events_and_dispatch = armAsm->GetCursorAddress<const void*>();
armAsm->bind(&run_events_and_dispatch);
armEmitCall(armAsm, reinterpret_cast<const void*>(&TimingEvents::RunEvents), true);
}
@ -516,6 +518,10 @@ u32 CPU::CodeCache::EmitASMFunctions(void* code, u32 code_size)
g_interpret_block = armAsm->GetCursorAddress<const void*>();
{
armEmitCall(armAsm, reinterpret_cast<const void*>(GetInterpretUncachedBlockFunction()), true);
armAsm->ldr(RWARG1, PTR(&g_state.pending_ticks));
armAsm->ldr(RWARG2, PTR(&g_state.downcount));
armAsm->cmp(RWARG1, RWARG2);
armAsm->b(&run_events_and_dispatch, ge);
armAsm->b(&dispatch);
}

@ -241,6 +241,7 @@ u32 CPU::CodeCache::EmitASMFunctions(void* code, u32 code_size)
Assembler* rvAsm = &actual_asm;
Label dispatch;
Label run_events_and_dispatch;
g_enter_recompiler = reinterpret_cast<decltype(g_enter_recompiler)>(rvAsm->GetCursorPointer());
{
@ -264,6 +265,7 @@ u32 CPU::CodeCache::EmitASMFunctions(void* code, u32 code_size)
rvAsm->LW(RARG2, PTR(&g_state.downcount));
rvAsm->BLTU(RARG1, RARG2, &skip_event_check);
rvAsm->Bind(&run_events_and_dispatch);
g_run_events_and_dispatch = rvAsm->GetCursorPointer();
rvEmitCall(rvAsm, reinterpret_cast<const void*>(&TimingEvents::RunEvents));
@ -309,6 +311,9 @@ u32 CPU::CodeCache::EmitASMFunctions(void* code, u32 code_size)
g_interpret_block = rvAsm->GetCursorPointer();
{
rvEmitCall(rvAsm, CodeCache::GetInterpretUncachedBlockFunction());
rvAsm->LW(RARG1, PTR(&g_state.pending_ticks));
rvAsm->LW(RARG2, PTR(&g_state.downcount));
rvAsm->BGE(RARG1, RARG2, &run_events_and_dispatch);
rvAsm->J(&dispatch);
}

@ -118,6 +118,7 @@ u32 CPU::CodeCache::EmitASMFunctions(void* code, u32 code_size)
Label dispatch;
Label exit_recompiler;
Label run_events_and_dispatch;
g_enter_recompiler = reinterpret_cast<decltype(g_enter_recompiler)>(const_cast<u8*>(cg->getCurr()));
{
@ -143,6 +144,7 @@ u32 CPU::CodeCache::EmitASMFunctions(void* code, u32 code_size)
cg->jl(dispatch);
g_run_events_and_dispatch = cg->getCurr();
cg->L(run_events_and_dispatch);
cg->call(reinterpret_cast<const void*>(&TimingEvents::RunEvents));
}
@ -183,6 +185,9 @@ u32 CPU::CodeCache::EmitASMFunctions(void* code, u32 code_size)
g_interpret_block = cg->getCurr();
{
cg->call(CodeCache::GetInterpretUncachedBlockFunction());
cg->mov(RWARG1, cg->dword[PTR(&g_state.pending_ticks)]);
cg->cmp(RWARG1, cg->dword[PTR(&g_state.downcount)]);
cg->jge(run_events_and_dispatch);
cg->jmp(dispatch);
}

Loading…
Cancel
Save