Fix over eager zp parameter reuse
This commit is contained in:
parent
a59f55c1f3
commit
ee03f08f52
|
@ -19228,6 +19228,9 @@ void InterCodeProcedure::Close(void)
|
||||||
mEntryBlock->ForwardLoopMovedTemp();
|
mEntryBlock->ForwardLoopMovedTemp();
|
||||||
DisassembleDebug("PostLoopTemp");
|
DisassembleDebug("PostLoopTemp");
|
||||||
|
|
||||||
|
BuildDataFlowSets();
|
||||||
|
RemoveUnusedInstructions();
|
||||||
|
|
||||||
CheckFinal();
|
CheckFinal();
|
||||||
DisassembleDebug("PreConstP");
|
DisassembleDebug("PreConstP");
|
||||||
#if 1
|
#if 1
|
||||||
|
|
|
@ -17776,7 +17776,7 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mIns.Size() >= 2 && !mFalseJump && mTrueJump && mTrueJump->mIns.Size() > 0)
|
if (mIns.Size() >= 2 && !mFalseJump && mTrueJump && mTrueJump->mTrueJump && mTrueJump->mIns.Size() > 0)
|
||||||
{
|
{
|
||||||
int sz = mIns.Size();
|
int sz = mIns.Size();
|
||||||
if (mIns[sz - 2].mType == ASMIT_LDA && mIns[sz - 2].mMode == ASMIM_ZERO_PAGE &&
|
if (mIns[sz - 2].mType == ASMIT_LDA && mIns[sz - 2].mMode == ASMIM_ZERO_PAGE &&
|
||||||
|
@ -26815,6 +26815,67 @@ bool NativeCodeBasicBlock::Check16BitSum(int at, NativeRegisterSum16Info& info)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool NativeCodeBasicBlock::IsFinalZeroPageUseTail(const NativeCodeBasicBlock* block, int from, int to, bool pair)
|
||||||
|
{
|
||||||
|
if (!mPatched)
|
||||||
|
{
|
||||||
|
mPatched = true;
|
||||||
|
|
||||||
|
for (int i = 0; i < mIns.Size(); i++)
|
||||||
|
{
|
||||||
|
if (mIns[i].mMode == ASMIM_ZERO_PAGE)
|
||||||
|
{
|
||||||
|
if (mIns[i].mAddress == to)
|
||||||
|
return false;
|
||||||
|
if (pair && mIns[i].mAddress == to + 1)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else if (mIns[i].mMode == ASMIM_INDIRECT_Y)
|
||||||
|
{
|
||||||
|
if (mIns[i].mAddress == to || mIns[i].mAddress + 1 == to)
|
||||||
|
return false;
|
||||||
|
if (pair && mIns[i].mAddress == to + 1)
|
||||||
|
return false;
|
||||||
|
if (!pair && (mIns[i].mAddress == from || mIns[i].mAddress + 1 == from))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else if (mIns[i].ReferencesZeroPage(to) || (pair && mIns[i].ReferencesZeroPage(to + 1)))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mTrueJump && !mTrueJump->IsFinalZeroPageUseTail(block, from, to, pair))
|
||||||
|
return false;
|
||||||
|
if (mFalseJump && !mFalseJump->IsFinalZeroPageUseTail(block, from, to, pair))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool ZeroPageMayBeChangedOnBlockPathUp(const NativeCodeBasicBlock* block, const NativeCodeBasicBlock* head, int reg)
|
||||||
|
{
|
||||||
|
ExpandingArray<const NativeCodeBasicBlock*> blocks;
|
||||||
|
blocks.Push(block);
|
||||||
|
int i = 0;
|
||||||
|
while (i < blocks.Size())
|
||||||
|
{
|
||||||
|
block = blocks[i++];
|
||||||
|
if (block != head)
|
||||||
|
{
|
||||||
|
if (block->ChangesZeroPage(reg))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
for (int j = 0; j < block->mEntryBlocks.Size(); j++)
|
||||||
|
{
|
||||||
|
if (!blocks.Contains(block->mEntryBlocks[j]))
|
||||||
|
blocks.Push(block->mEntryBlocks[j]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
bool NativeCodeBasicBlock::IsFinalZeroPageUse(const NativeCodeBasicBlock* block, int at, int from, int to, bool pair, bool fchanged)
|
bool NativeCodeBasicBlock::IsFinalZeroPageUse(const NativeCodeBasicBlock* block, int at, int from, int to, bool pair, bool fchanged)
|
||||||
{
|
{
|
||||||
if (at == 0 && mVisited)
|
if (at == 0 && mVisited)
|
||||||
|
@ -26822,20 +26883,21 @@ bool NativeCodeBasicBlock::IsFinalZeroPageUse(const NativeCodeBasicBlock* block,
|
||||||
|
|
||||||
if (!mPatched)
|
if (!mPatched)
|
||||||
{
|
{
|
||||||
mPatched = true;
|
|
||||||
|
|
||||||
if (at != 0 || (mEntryRequiredRegs[from] || mEntryRequiredRegs[to] || (pair && (mEntryRequiredRegs[from + 1] || mEntryRequiredRegs[to + 1]))))
|
if (at != 0 || (mEntryRequiredRegs[from] || mEntryRequiredRegs[to] || (pair && (mEntryRequiredRegs[from + 1] || mEntryRequiredRegs[to + 1]))))
|
||||||
{
|
|
||||||
if (at == 0)
|
|
||||||
{
|
{
|
||||||
mPatched = true;
|
mPatched = true;
|
||||||
|
|
||||||
|
if (at == 0)
|
||||||
|
{
|
||||||
if (mNumEntries > 1)
|
if (mNumEntries > 1)
|
||||||
{
|
{
|
||||||
fchanged = true;
|
|
||||||
for (int i = 0; i < mEntryBlocks.Size(); i++)
|
for (int i = 0; i < mEntryBlocks.Size(); i++)
|
||||||
|
{
|
||||||
if (mEntryBlocks[i] != block && !mEntryBlocks[i]->IsDominatedBy(block))
|
if (mEntryBlocks[i] != block && !mEntryBlocks[i]->IsDominatedBy(block))
|
||||||
return false;
|
return false;
|
||||||
|
if (!fchanged && (ZeroPageMayBeChangedOnBlockPathUp(mEntryBlocks[i], block, from) || pair && ZeroPageMayBeChangedOnBlockPathUp(mEntryBlocks[i], block, from + 1)))
|
||||||
|
fchanged = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -26854,7 +26916,9 @@ bool NativeCodeBasicBlock::IsFinalZeroPageUse(const NativeCodeBasicBlock* block,
|
||||||
}
|
}
|
||||||
else if (mIns[at].mMode == ASMIM_INDIRECT_Y)
|
else if (mIns[at].mMode == ASMIM_INDIRECT_Y)
|
||||||
{
|
{
|
||||||
if (mIns[at].mAddress == to)
|
if (!pair && mIns[at].mAddress == to)
|
||||||
|
return false;
|
||||||
|
if (mIns[at].mAddress == to && (fchanged || mIns[at].ChangesAddress()))
|
||||||
return false;
|
return false;
|
||||||
if (mIns[at].mAddress + 1 == to)
|
if (mIns[at].mAddress + 1 == to)
|
||||||
return false;
|
return false;
|
||||||
|
@ -26898,6 +26962,8 @@ bool NativeCodeBasicBlock::IsFinalZeroPageUse(const NativeCodeBasicBlock* block,
|
||||||
if (mFalseJump && !mFalseJump->IsFinalZeroPageUse(block, 0, from, to, pair, fchanged))
|
if (mFalseJump && !mFalseJump->IsFinalZeroPageUse(block, 0, from, to, pair, fchanged))
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
return IsFinalZeroPageUseTail(block, from, to, pair);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -26925,7 +26991,7 @@ bool NativeCodeBasicBlock::ReplaceFinalZeroPageUse(NativeCodeProcedure* nproc)
|
||||||
if (IsFinalZeroPageUse(this, i + 2, mIns[i + 1].mAddress, mIns[i + 0].mAddress, false, false))
|
if (IsFinalZeroPageUse(this, i + 2, mIns[i + 1].mAddress, mIns[i + 0].mAddress, false, false))
|
||||||
{
|
{
|
||||||
nproc->ResetPatched();
|
nproc->ResetPatched();
|
||||||
if (ForwardReplaceZeroPage(i + 2, mIns[i + 1].mAddress, mIns[i + 0].mAddress))
|
if (ForwardReplaceZeroPage(i + 2, mIns[i + 1].mAddress, mIns[i + 0].mAddress, false))
|
||||||
changed = true;
|
changed = true;
|
||||||
|
|
||||||
mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED;
|
mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED;
|
||||||
|
@ -26944,10 +27010,10 @@ bool NativeCodeBasicBlock::ReplaceFinalZeroPageUse(NativeCodeProcedure* nproc)
|
||||||
if (IsFinalZeroPageUse(this, i + 4, mIns[i + 1].mAddress, mIns[i + 0].mAddress, true, false))
|
if (IsFinalZeroPageUse(this, i + 4, mIns[i + 1].mAddress, mIns[i + 0].mAddress, true, false))
|
||||||
{
|
{
|
||||||
nproc->ResetPatched();
|
nproc->ResetPatched();
|
||||||
if (ForwardReplaceZeroPage(i + 4, mIns[i + 1].mAddress, mIns[i + 0].mAddress))
|
if (ForwardReplaceZeroPage(i + 4, mIns[i + 1].mAddress, mIns[i + 0].mAddress, true))
|
||||||
changed = true;
|
changed = true;
|
||||||
nproc->ResetPatched();
|
nproc->ResetPatched();
|
||||||
if (ForwardReplaceZeroPage(i + 4, mIns[i + 3].mAddress, mIns[i + 2].mAddress))
|
if (ForwardReplaceZeroPage(i + 4, mIns[i + 3].mAddress, mIns[i + 2].mAddress, false))
|
||||||
changed = true;
|
changed = true;
|
||||||
|
|
||||||
mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED;
|
mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED;
|
||||||
|
@ -26970,10 +27036,10 @@ bool NativeCodeBasicBlock::ReplaceFinalZeroPageUse(NativeCodeProcedure* nproc)
|
||||||
if (IsFinalZeroPageUse(this, i + 6, mIns[i + 2].mAddress, mIns[i + 0].mAddress, true, false))
|
if (IsFinalZeroPageUse(this, i + 6, mIns[i + 2].mAddress, mIns[i + 0].mAddress, true, false))
|
||||||
{
|
{
|
||||||
nproc->ResetPatched();
|
nproc->ResetPatched();
|
||||||
if (ForwardReplaceZeroPage(i + 6, mIns[i + 2].mAddress, mIns[i + 0].mAddress))
|
if (ForwardReplaceZeroPage(i + 6, mIns[i + 2].mAddress, mIns[i + 0].mAddress, true))
|
||||||
changed = true;
|
changed = true;
|
||||||
nproc->ResetPatched();
|
nproc->ResetPatched();
|
||||||
if (ForwardReplaceZeroPage(i + 6, mIns[i + 5].mAddress, mIns[i + 3].mAddress))
|
if (ForwardReplaceZeroPage(i + 6, mIns[i + 5].mAddress, mIns[i + 3].mAddress, false))
|
||||||
changed = true;
|
changed = true;
|
||||||
|
|
||||||
mIns[i + 2].mAddress = mIns[i + 0].mAddress;
|
mIns[i + 2].mAddress = mIns[i + 0].mAddress;
|
||||||
|
@ -26982,6 +27048,7 @@ bool NativeCodeBasicBlock::ReplaceFinalZeroPageUse(NativeCodeProcedure* nproc)
|
||||||
changed = true;
|
changed = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i + 4 < mIns.Size() &&
|
if (i + 4 < mIns.Size() &&
|
||||||
mIns[i + 0].mType == ASMIT_ADC && mIns[i + 0].mMode == ASMIM_ZERO_PAGE &&
|
mIns[i + 0].mType == ASMIT_ADC && mIns[i + 0].mMode == ASMIM_ZERO_PAGE &&
|
||||||
mIns[i + 1].mType == ASMIT_STA && mIns[i + 1].mMode == ASMIM_ZERO_PAGE &&
|
mIns[i + 1].mType == ASMIT_STA && mIns[i + 1].mMode == ASMIM_ZERO_PAGE &&
|
||||||
|
@ -26995,10 +27062,10 @@ bool NativeCodeBasicBlock::ReplaceFinalZeroPageUse(NativeCodeProcedure* nproc)
|
||||||
if (IsFinalZeroPageUse(this, i + 5, mIns[i + 1].mAddress, mIns[i + 0].mAddress, true, false))
|
if (IsFinalZeroPageUse(this, i + 5, mIns[i + 1].mAddress, mIns[i + 0].mAddress, true, false))
|
||||||
{
|
{
|
||||||
nproc->ResetPatched();
|
nproc->ResetPatched();
|
||||||
if (ForwardReplaceZeroPage(i + 5, mIns[i + 1].mAddress, mIns[i + 0].mAddress))
|
if (ForwardReplaceZeroPage(i + 5, mIns[i + 1].mAddress, mIns[i + 0].mAddress, true))
|
||||||
changed = true;
|
changed = true;
|
||||||
nproc->ResetPatched();
|
nproc->ResetPatched();
|
||||||
if (ForwardReplaceZeroPage(i + 5, mIns[i + 4].mAddress, mIns[i + 2].mAddress))
|
if (ForwardReplaceZeroPage(i + 5, mIns[i + 4].mAddress, mIns[i + 2].mAddress, false))
|
||||||
changed = true;
|
changed = true;
|
||||||
|
|
||||||
mIns[i + 1].mAddress = mIns[i + 0].mAddress;
|
mIns[i + 1].mAddress = mIns[i + 0].mAddress;
|
||||||
|
@ -27007,6 +27074,7 @@ bool NativeCodeBasicBlock::ReplaceFinalZeroPageUse(NativeCodeProcedure* nproc)
|
||||||
changed = true;
|
changed = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mTrueJump && mTrueJump->ReplaceFinalZeroPageUse(nproc))
|
if (mTrueJump && mTrueJump->ReplaceFinalZeroPageUse(nproc))
|
||||||
|
@ -27166,7 +27234,7 @@ bool NativeCodeBasicBlock::Propagate16BitHighSum(void)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool NativeCodeBasicBlock::ForwardReplaceZeroPage(int at, int from, int to)
|
bool NativeCodeBasicBlock::ForwardReplaceZeroPage(int at, int from, int to, bool pair)
|
||||||
{
|
{
|
||||||
bool changed = false;
|
bool changed = false;
|
||||||
|
|
||||||
|
@ -27186,9 +27254,9 @@ bool NativeCodeBasicBlock::ForwardReplaceZeroPage(int at, int from, int to)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mTrueJump && mTrueJump->ForwardReplaceZeroPage(0, from, to))
|
if (mTrueJump && mTrueJump->ForwardReplaceZeroPage(0, from, to, pair))
|
||||||
changed = true;
|
changed = true;
|
||||||
if (mFalseJump && mFalseJump->ForwardReplaceZeroPage(0, from, to))
|
if (mFalseJump && mFalseJump->ForwardReplaceZeroPage(0, from, to, pair))
|
||||||
changed = true;
|
changed = true;
|
||||||
|
|
||||||
if (mEntryRequiredRegs[from])
|
if (mEntryRequiredRegs[from])
|
||||||
|
@ -42535,7 +42603,7 @@ void NativeCodeProcedure::Compile(InterCodeProcedure* proc)
|
||||||
{
|
{
|
||||||
mInterProc = proc;
|
mInterProc = proc;
|
||||||
|
|
||||||
CheckFunc = !strcmp(mInterProc->mIdent->mString, "A::draw");
|
CheckFunc = !strcmp(mInterProc->mIdent->mString, "nformi");
|
||||||
|
|
||||||
int nblocks = proc->mBlocks.Size();
|
int nblocks = proc->mBlocks.Size();
|
||||||
tblocks = new NativeCodeBasicBlock * [nblocks];
|
tblocks = new NativeCodeBasicBlock * [nblocks];
|
||||||
|
|
|
@ -560,8 +560,9 @@ public:
|
||||||
bool EliminateUpper16BitSum(NativeCodeProcedure* nproc);
|
bool EliminateUpper16BitSum(NativeCodeProcedure* nproc);
|
||||||
|
|
||||||
bool IsFinalZeroPageUse(const NativeCodeBasicBlock* block, int at, int from, int to, bool pair, bool fchanged);
|
bool IsFinalZeroPageUse(const NativeCodeBasicBlock* block, int at, int from, int to, bool pair, bool fchanged);
|
||||||
|
bool IsFinalZeroPageUseTail(const NativeCodeBasicBlock* block, int from, int to, bool pair);
|
||||||
bool ReplaceFinalZeroPageUse(NativeCodeProcedure* nproc);
|
bool ReplaceFinalZeroPageUse(NativeCodeProcedure* nproc);
|
||||||
bool ForwardReplaceZeroPage(int at, int from, int to);
|
bool ForwardReplaceZeroPage(int at, int from, int to, bool pair);
|
||||||
|
|
||||||
bool CanZeroPageCopyUp(int at, int from, int to, bool diamond);
|
bool CanZeroPageCopyUp(int at, int from, int to, bool diamond);
|
||||||
bool ShortcutZeroPageCopyUp(NativeCodeProcedure* nproc);
|
bool ShortcutZeroPageCopyUp(NativeCodeProcedure* nproc);
|
||||||
|
|
Loading…
Reference in New Issue