PPCAnalyst: Count outputs as being in use
In a code block where a guest register is accessed at least twice and the last access is a write and the register is not discardable immediately after the second-to-last instruction (perhaps there is an instruction in between that can cause an exception), currently Dolphin's JITs will flush the register after the second-to-last instruction. It would be better if we replaced the flush after the second-to-last instruction with a flush that only happens if the exception path is taken. This change accomplishes that by marking guest registers as "in use" not just when they are used as inputs but also when they are used as outputs, preventing the loop in DoJit from flushing the register until after the last access.
This commit is contained in:
parent
86dbf768b9
commit
20b2300ce1
|
@ -946,8 +946,8 @@ u32 PPCAnalyzer::Analyze(u32 address, CodeBlock* block, CodeBuffer* buffer,
|
||||||
op.gprDiscardable = gprDiscardable;
|
op.gprDiscardable = gprDiscardable;
|
||||||
op.fprDiscardable = fprDiscardable;
|
op.fprDiscardable = fprDiscardable;
|
||||||
op.fprInXmm = fprInXmm;
|
op.fprInXmm = fprInXmm;
|
||||||
gprInUse |= op.regsIn;
|
gprInUse |= op.regsIn | op.regsOut;
|
||||||
fprInUse |= op.fregsIn;
|
fprInUse |= op.fregsIn | op.GetFregsOut();
|
||||||
if (op.canEndBlock || op.canCauseException)
|
if (op.canEndBlock || op.canCauseException)
|
||||||
{
|
{
|
||||||
gprDiscardable = BitSet32{};
|
gprDiscardable = BitSet32{};
|
||||||
|
|
Loading…
Reference in New Issue