PPCAnalyst: Fix gprBlockInputs calculation
This analysis needs to scan backwards, not forwards.
This commit is contained in:
parent
17fa9dfc4e
commit
8c2d73e8c2
|
@ -947,7 +947,7 @@ u32 PPCAnalyzer::Analyze(u32 address, CodeBlock* block, CodeBuffer* buffer,
|
||||||
BitSet8 wantsCR = BitSet8(0xFF);
|
BitSet8 wantsCR = BitSet8(0xFF);
|
||||||
bool wantsFPRF = true;
|
bool wantsFPRF = true;
|
||||||
bool wantsCA = true;
|
bool wantsCA = true;
|
||||||
BitSet32 fprInUse, gprInUse, gprDiscardable, fprDiscardable, fprInXmm;
|
BitSet32 gprDefined, gprBlockInputs, gprInUse, fprInUse, gprDiscardable, fprDiscardable, fprInXmm;
|
||||||
for (int i = block->m_num_instructions - 1; i >= 0; i--)
|
for (int i = block->m_num_instructions - 1; i >= 0; i--)
|
||||||
{
|
{
|
||||||
CodeOp& op = code[i];
|
CodeOp& op = code[i];
|
||||||
|
@ -969,6 +969,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;
|
||||||
|
gprBlockInputs |= op.regsIn & ~gprDefined;
|
||||||
|
gprDefined |= op.regsOut;
|
||||||
gprInUse |= op.regsIn | op.regsOut;
|
gprInUse |= op.regsIn | op.regsOut;
|
||||||
fprInUse |= op.fregsIn | op.GetFregsOut();
|
fprInUse |= op.fregsIn | op.GetFregsOut();
|
||||||
if (op.canEndBlock || op.canCauseException)
|
if (op.canEndBlock || op.canCauseException)
|
||||||
|
@ -988,15 +990,12 @@ u32 PPCAnalyzer::Analyze(u32 address, CodeBlock* block, CodeBuffer* buffer,
|
||||||
}
|
}
|
||||||
|
|
||||||
// Forward scan, for flags that need the other direction for calculation.
|
// Forward scan, for flags that need the other direction for calculation.
|
||||||
BitSet32 fprIsSingle, fprIsDuplicated, fprIsStoreSafe, gprDefined, gprBlockInputs;
|
BitSet32 fprIsSingle, fprIsDuplicated, fprIsStoreSafe;
|
||||||
BitSet8 gqrUsed, gqrModified;
|
BitSet8 gqrUsed, gqrModified;
|
||||||
for (u32 i = 0; i < block->m_num_instructions; i++)
|
for (u32 i = 0; i < block->m_num_instructions; i++)
|
||||||
{
|
{
|
||||||
CodeOp& op = code[i];
|
CodeOp& op = code[i];
|
||||||
|
|
||||||
gprBlockInputs |= op.regsIn & ~gprDefined;
|
|
||||||
gprDefined |= op.regsOut;
|
|
||||||
|
|
||||||
op.fprIsSingle = fprIsSingle;
|
op.fprIsSingle = fprIsSingle;
|
||||||
op.fprIsDuplicated = fprIsDuplicated;
|
op.fprIsDuplicated = fprIsDuplicated;
|
||||||
op.fprIsStoreSafeBeforeInst = fprIsStoreSafe;
|
op.fprIsStoreSafeBeforeInst = fprIsStoreSafe;
|
||||||
|
|
Loading…
Reference in New Issue