mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-01-09 15:49:25 +01:00
Jit: Further improve flushing for skipped instructions
Now we no longer have to wait until we've compiled the next instruction after a skipped instruction before we can flush registers. This commit is easier to read using "Ignore whitespace".
This commit is contained in:
parent
c04d8415b3
commit
7dddc39068
@ -979,6 +979,12 @@ bool Jit64::DoJit(u32 em_address, JitBlock* b, u32 nextPC)
|
||||
js.isLastInstruction = true;
|
||||
}
|
||||
|
||||
if (js.skipInstructions != 0)
|
||||
{
|
||||
js.skipInstructions--;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (i != 0)
|
||||
{
|
||||
// Gather pipe writes using a non-immediate address are discovered by profiling.
|
||||
@ -1161,6 +1167,16 @@ bool Jit64::DoJit(u32 em_address, JitBlock* b, u32 nextPC)
|
||||
gpr.Commit();
|
||||
fpr.Commit();
|
||||
|
||||
if (opinfo->flags & FL_LOADSTORE)
|
||||
++js.numLoadStoreInst;
|
||||
|
||||
if (opinfo->flags & FL_USE_FPU)
|
||||
++js.numFloatingPointInst;
|
||||
}
|
||||
}
|
||||
|
||||
js.fpr_is_store_safe = op.fprIsStoreSafeAfterInst;
|
||||
|
||||
// If we have a register that will never be used again, discard or flush it.
|
||||
if (!bJITRegisterCacheOff)
|
||||
{
|
||||
@ -1173,13 +1189,6 @@ bool Jit64::DoJit(u32 em_address, JitBlock* b, u32 nextPC)
|
||||
previous_gpr_in_use = op.gprInUse;
|
||||
previous_fpr_in_use = op.fprInUse;
|
||||
|
||||
if (opinfo->flags & FL_LOADSTORE)
|
||||
++js.numLoadStoreInst;
|
||||
|
||||
if (opinfo->flags & FL_USE_FPU)
|
||||
++js.numFloatingPointInst;
|
||||
}
|
||||
|
||||
#if defined(_DEBUG) || defined(DEBUGFAST)
|
||||
if (!gpr.SanityCheck() || !fpr.SanityCheck())
|
||||
{
|
||||
@ -1187,8 +1196,6 @@ bool Jit64::DoJit(u32 em_address, JitBlock* b, u32 nextPC)
|
||||
NOTICE_LOG_FMT(DYNA_REC, "Unflushed register: {}", ppc_inst);
|
||||
}
|
||||
#endif
|
||||
i += js.skipInstructions;
|
||||
js.skipInstructions = 0;
|
||||
}
|
||||
|
||||
if (code_block.m_broken)
|
||||
|
@ -1188,6 +1188,12 @@ bool JitArm64::DoJit(u32 em_address, JitBlock* b, u32 nextPC)
|
||||
js.downcountAmount += opinfo->num_cycles;
|
||||
js.isLastInstruction = i == (code_block.m_num_instructions - 1);
|
||||
|
||||
if (js.skipInstructions != 0)
|
||||
{
|
||||
js.skipInstructions--;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Skip calling UpdateLastUsed for lmw/stmw - it usually hurts more than it helps
|
||||
if (op.inst.OPCD != 46 && op.inst.OPCD != 47)
|
||||
gpr.UpdateLastUsed(op.regsIn | op.regsOut);
|
||||
@ -1346,6 +1352,14 @@ bool JitArm64::DoJit(u32 em_address, JitBlock* b, u32 nextPC)
|
||||
|
||||
CompileInstruction(op);
|
||||
|
||||
if (opinfo->flags & FL_LOADSTORE)
|
||||
++js.numLoadStoreInst;
|
||||
|
||||
if (opinfo->flags & FL_USE_FPU)
|
||||
++js.numFloatingPointInst;
|
||||
}
|
||||
}
|
||||
|
||||
js.fpr_is_store_safe = op.fprIsStoreSafeAfterInst;
|
||||
|
||||
if (!CanMergeNextInstructions(1) || js.op[1].opinfo->type != ::OpType::Integer)
|
||||
@ -1365,16 +1379,6 @@ bool JitArm64::DoJit(u32 em_address, JitBlock* b, u32 nextPC)
|
||||
previous_gpr_in_use = op.gprInUse;
|
||||
previous_fpr_in_use = op.fprInUse;
|
||||
previous_cr_in_use = op.crInUse;
|
||||
|
||||
if (opinfo->flags & FL_LOADSTORE)
|
||||
++js.numLoadStoreInst;
|
||||
|
||||
if (opinfo->flags & FL_USE_FPU)
|
||||
++js.numFloatingPointInst;
|
||||
}
|
||||
|
||||
i += js.skipInstructions;
|
||||
js.skipInstructions = 0;
|
||||
}
|
||||
|
||||
if (code_block.m_broken)
|
||||
|
Loading…
x
Reference in New Issue
Block a user