Fix loss of zero flag in 16bit optimization
This commit is contained in:
parent
f0b7cddeb1
commit
740762d4a1
|
@ -13974,10 +13974,10 @@ bool NativeCodeBasicBlock::MergeBasicBlocks(void)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mTrueJump)
|
if (mTrueJump && mTrueJump->MergeBasicBlocks())
|
||||||
mTrueJump->MergeBasicBlocks();
|
changed = true;
|
||||||
if (mFalseJump)
|
if (mFalseJump && mFalseJump->MergeBasicBlocks())
|
||||||
mFalseJump->MergeBasicBlocks();
|
changed = true;
|
||||||
|
|
||||||
assert(mIns.Size() == 0 || mIns[0].mType != ASMIT_INV);
|
assert(mIns.Size() == 0 || mIns[0].mType != ASMIT_INV);
|
||||||
}
|
}
|
||||||
|
@ -23091,6 +23091,7 @@ bool NativeCodeBasicBlock::JoinTailCodeSequences(NativeCodeProcedure* proc, bool
|
||||||
pblock->mIns.Push(mIns[0]);
|
pblock->mIns.Push(mIns[0]);
|
||||||
mIns.Remove(0);
|
mIns.Remove(0);
|
||||||
|
|
||||||
|
lblock->mExitRequiredRegs += CPU_REG_Y;
|
||||||
pblock->mExitRequiredRegs += CPU_REG_Y;
|
pblock->mExitRequiredRegs += CPU_REG_Y;
|
||||||
mEntryRequiredRegs += CPU_REG_Y;
|
mEntryRequiredRegs += CPU_REG_Y;
|
||||||
mExitRequiredRegs += CPU_REG_Y;
|
mExitRequiredRegs += CPU_REG_Y;
|
||||||
|
@ -23107,6 +23108,7 @@ bool NativeCodeBasicBlock::JoinTailCodeSequences(NativeCodeProcedure* proc, bool
|
||||||
pblock->mIns.Push(mIns[0]);
|
pblock->mIns.Push(mIns[0]);
|
||||||
mIns.Remove(0);
|
mIns.Remove(0);
|
||||||
|
|
||||||
|
lblock->mExitRequiredRegs += CPU_REG_Y;
|
||||||
pblock->mExitRequiredRegs += CPU_REG_Y;
|
pblock->mExitRequiredRegs += CPU_REG_Y;
|
||||||
mEntryRequiredRegs += CPU_REG_Y;
|
mEntryRequiredRegs += CPU_REG_Y;
|
||||||
mExitRequiredRegs += CPU_REG_Y;
|
mExitRequiredRegs += CPU_REG_Y;
|
||||||
|
@ -23127,6 +23129,7 @@ bool NativeCodeBasicBlock::JoinTailCodeSequences(NativeCodeProcedure* proc, bool
|
||||||
pblock->mIns.Push(mIns[0]);
|
pblock->mIns.Push(mIns[0]);
|
||||||
mIns.Remove(0);
|
mIns.Remove(0);
|
||||||
|
|
||||||
|
lblock->mExitRequiredRegs += CPU_REG_X;
|
||||||
pblock->mExitRequiredRegs += CPU_REG_X;
|
pblock->mExitRequiredRegs += CPU_REG_X;
|
||||||
mEntryRequiredRegs += CPU_REG_X;
|
mEntryRequiredRegs += CPU_REG_X;
|
||||||
mExitRequiredRegs += CPU_REG_X;
|
mExitRequiredRegs += CPU_REG_X;
|
||||||
|
@ -23144,6 +23147,7 @@ bool NativeCodeBasicBlock::JoinTailCodeSequences(NativeCodeProcedure* proc, bool
|
||||||
pblock->mIns.Push(mIns[0]);
|
pblock->mIns.Push(mIns[0]);
|
||||||
mIns.Remove(0);
|
mIns.Remove(0);
|
||||||
|
|
||||||
|
lblock->mExitRequiredRegs += CPU_REG_A;
|
||||||
pblock->mExitRequiredRegs += CPU_REG_A;
|
pblock->mExitRequiredRegs += CPU_REG_A;
|
||||||
mEntryRequiredRegs += CPU_REG_A;
|
mEntryRequiredRegs += CPU_REG_A;
|
||||||
mExitRequiredRegs += CPU_REG_A;
|
mExitRequiredRegs += CPU_REG_A;
|
||||||
|
@ -23227,7 +23231,17 @@ bool NativeCodeBasicBlock::JoinTailCodeSequences(NativeCodeProcedure* proc, bool
|
||||||
{
|
{
|
||||||
mTrueJump->mEntryBlocks[j]->mIns.Push(mTrueJump->mIns[0]);
|
mTrueJump->mEntryBlocks[j]->mIns.Push(mTrueJump->mIns[0]);
|
||||||
mTrueJump->mEntryBlocks[j]->mExitRequiredRegs += CPU_REG_A;
|
mTrueJump->mEntryBlocks[j]->mExitRequiredRegs += CPU_REG_A;
|
||||||
mTrueJump->mEntryBlocks[j]->mExitRequiredRegs += CPU_REG_Z;
|
}
|
||||||
|
|
||||||
|
mTrueJump->mEntryBlocks[j]->mExitRequiredRegs += CPU_REG_Z;
|
||||||
|
|
||||||
|
int k = mTrueJump->mEntryBlocks[j]->mIns.Size();
|
||||||
|
while (k > 0)
|
||||||
|
{
|
||||||
|
k--;
|
||||||
|
mTrueJump->mEntryBlocks[j]->mIns[k].mLive |= LIVE_CPU_REG_Z;
|
||||||
|
if (mTrueJump->mEntryBlocks[j]->mIns[k].ChangesZFlag())
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
mExitRequiredRegs += CPU_REG_A;
|
mExitRequiredRegs += CPU_REG_A;
|
||||||
|
@ -36906,7 +36920,7 @@ NativeCodeBasicBlock* NativeCodeBasicBlock::BuildSingleEntry(NativeCodeProcedure
|
||||||
NativeCodeBasicBlock* nblock = proc->AllocateBlock();
|
NativeCodeBasicBlock* nblock = proc->AllocateBlock();
|
||||||
nblock->mTrueJump = block;
|
nblock->mTrueJump = block;
|
||||||
nblock->mEntryRequiredRegs = block->mEntryRequiredRegs;
|
nblock->mEntryRequiredRegs = block->mEntryRequiredRegs;
|
||||||
nblock->mExitRequiredRegs = block->mExitRequiredRegs;
|
nblock->mExitRequiredRegs = block->mEntryRequiredRegs;
|
||||||
int k = block->mEntryBlocks.IndexOf(this);
|
int k = block->mEntryBlocks.IndexOf(this);
|
||||||
block->mEntryBlocks[k] = nblock;
|
block->mEntryBlocks[k] = nblock;
|
||||||
nblock->mEntryBlocks.Push(this);
|
nblock->mEntryBlocks.Push(this);
|
||||||
|
@ -37494,16 +37508,19 @@ bool NativeCodeBasicBlock::OptimizeGenericLoop(NativeCodeProcedure* proc)
|
||||||
{
|
{
|
||||||
if (areg < 256)
|
if (areg < 256)
|
||||||
block->mTrueJump->mIns.Insert(0, NativeCodeInstruction(block->mBranchIns, ASMIT_STA, ASMIM_ZERO_PAGE, areg));
|
block->mTrueJump->mIns.Insert(0, NativeCodeInstruction(block->mBranchIns, ASMIT_STA, ASMIM_ZERO_PAGE, areg));
|
||||||
|
block->mExitRequiredRegs += CPU_REG_A;
|
||||||
block->mTrueJump->mEntryRequiredRegs += CPU_REG_A;
|
block->mTrueJump->mEntryRequiredRegs += CPU_REG_A;
|
||||||
}
|
}
|
||||||
if (yreg >= 0 && block->mTrueJump->mEntryRequiredRegs[yreg])
|
if (yreg >= 0 && block->mTrueJump->mEntryRequiredRegs[yreg])
|
||||||
{
|
{
|
||||||
block->mTrueJump->mIns.Insert(0, NativeCodeInstruction(block->mBranchIns, ASMIT_STY, ASMIM_ZERO_PAGE, yreg));
|
block->mTrueJump->mIns.Insert(0, NativeCodeInstruction(block->mBranchIns, ASMIT_STY, ASMIM_ZERO_PAGE, yreg));
|
||||||
|
block->mExitRequiredRegs += CPU_REG_Y;
|
||||||
block->mTrueJump->mEntryRequiredRegs += CPU_REG_Y;
|
block->mTrueJump->mEntryRequiredRegs += CPU_REG_Y;
|
||||||
}
|
}
|
||||||
if (xreg >= 0 && block->mTrueJump->mEntryRequiredRegs[xreg])
|
if (xreg >= 0 && block->mTrueJump->mEntryRequiredRegs[xreg])
|
||||||
{
|
{
|
||||||
block->mTrueJump->mIns.Insert(0, NativeCodeInstruction(block->mBranchIns, ASMIT_STX, ASMIM_ZERO_PAGE, xreg));
|
block->mTrueJump->mIns.Insert(0, NativeCodeInstruction(block->mBranchIns, ASMIT_STX, ASMIM_ZERO_PAGE, xreg));
|
||||||
|
block->mExitRequiredRegs += CPU_REG_X;
|
||||||
block->mTrueJump->mEntryRequiredRegs += CPU_REG_X;
|
block->mTrueJump->mEntryRequiredRegs += CPU_REG_X;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -37514,16 +37531,19 @@ bool NativeCodeBasicBlock::OptimizeGenericLoop(NativeCodeProcedure* proc)
|
||||||
{
|
{
|
||||||
if (areg < 256)
|
if (areg < 256)
|
||||||
block->mFalseJump->mIns.Insert(0, NativeCodeInstruction(block->mBranchIns, ASMIT_STA, ASMIM_ZERO_PAGE, areg));
|
block->mFalseJump->mIns.Insert(0, NativeCodeInstruction(block->mBranchIns, ASMIT_STA, ASMIM_ZERO_PAGE, areg));
|
||||||
|
block->mExitRequiredRegs += CPU_REG_A;
|
||||||
block->mFalseJump->mEntryRequiredRegs += CPU_REG_A;
|
block->mFalseJump->mEntryRequiredRegs += CPU_REG_A;
|
||||||
}
|
}
|
||||||
if (yreg >= 0 && block->mFalseJump->mEntryRequiredRegs[yreg])
|
if (yreg >= 0 && block->mFalseJump->mEntryRequiredRegs[yreg])
|
||||||
{
|
{
|
||||||
block->mFalseJump->mIns.Insert(0, NativeCodeInstruction(block->mBranchIns, ASMIT_STY, ASMIM_ZERO_PAGE, yreg));
|
block->mFalseJump->mIns.Insert(0, NativeCodeInstruction(block->mBranchIns, ASMIT_STY, ASMIM_ZERO_PAGE, yreg));
|
||||||
|
block->mExitRequiredRegs += CPU_REG_Y;
|
||||||
block->mFalseJump->mEntryRequiredRegs += CPU_REG_Y;
|
block->mFalseJump->mEntryRequiredRegs += CPU_REG_Y;
|
||||||
}
|
}
|
||||||
if (xreg >= 0 && block->mFalseJump->mEntryRequiredRegs[xreg])
|
if (xreg >= 0 && block->mFalseJump->mEntryRequiredRegs[xreg])
|
||||||
{
|
{
|
||||||
block->mFalseJump->mIns.Insert(0, NativeCodeInstruction(block->mBranchIns, ASMIT_STX, ASMIM_ZERO_PAGE, xreg));
|
block->mFalseJump->mIns.Insert(0, NativeCodeInstruction(block->mBranchIns, ASMIT_STX, ASMIM_ZERO_PAGE, xreg));
|
||||||
|
block->mExitRequiredRegs += CPU_REG_X;
|
||||||
block->mFalseJump->mEntryRequiredRegs += CPU_REG_X;
|
block->mFalseJump->mEntryRequiredRegs += CPU_REG_X;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -37531,6 +37551,8 @@ bool NativeCodeBasicBlock::OptimizeGenericLoop(NativeCodeProcedure* proc)
|
||||||
block->CheckLive();
|
block->CheckLive();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CheckLive();
|
||||||
|
|
||||||
changed = true;
|
changed = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -46621,6 +46643,11 @@ void NativeCodeBasicBlock::CheckLive(void)
|
||||||
if (mFalseJump->mIns.Size() > 0 && mFalseJump->mIns[0].RequiresXReg())
|
if (mFalseJump->mIns.Size() > 0 && mFalseJump->mIns[0].RequiresXReg())
|
||||||
assert(mExitRequiredRegs[CPU_REG_X]);
|
assert(mExitRequiredRegs[CPU_REG_X]);
|
||||||
}
|
}
|
||||||
|
if (mTrueJump && mTrueJump->mEntryRequiredRegs.Size() > 0 && mTrueJump->mEntryRequiredRegs[CPU_REG_X] && mExitRequiredRegs.Size() > 0)
|
||||||
|
{
|
||||||
|
if (mTrueJump->mIns.Size() > 0 && mTrueJump->mIns[0].RequiresXReg())
|
||||||
|
assert(mExitRequiredRegs[CPU_REG_X]);
|
||||||
|
}
|
||||||
|
|
||||||
assert(mBranch == ASMIT_RTS || (mBranch == ASMIT_JMP) == (mFalseJump == nullptr));
|
assert(mBranch == ASMIT_RTS || (mBranch == ASMIT_JMP) == (mFalseJump == nullptr));
|
||||||
|
|
||||||
|
@ -46634,6 +46661,11 @@ void NativeCodeBasicBlock::CheckLive(void)
|
||||||
assert(mEntryRequiredRegs[CPU_REG_Y]);
|
assert(mEntryRequiredRegs[CPU_REG_Y]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (mExitRequiredRegs.Size() > 0 && mExitRequiredRegs[CPU_REG_Z])
|
||||||
|
live |= LIVE_CPU_REG_Z;
|
||||||
|
if (mExitRequiredRegs.Size() > 0 && mExitRequiredRegs[CPU_REG_C])
|
||||||
|
live |= LIVE_CPU_REG_C;
|
||||||
|
|
||||||
for (int j = mIns.Size() - 1; j >= 0; j--)
|
for (int j = mIns.Size() - 1; j >= 0; j--)
|
||||||
{
|
{
|
||||||
assert(mIns[j].mType != ASMIT_INV);
|
assert(mIns[j].mType != ASMIT_INV);
|
||||||
|
@ -47359,7 +47391,7 @@ void NativeCodeProcedure::Compile(InterCodeProcedure* proc)
|
||||||
{
|
{
|
||||||
mInterProc = proc;
|
mInterProc = proc;
|
||||||
|
|
||||||
CheckFunc = !strcmp(mInterProc->mIdent->mString, "rirq_build");
|
CheckFunc = !strcmp(mInterProc->mIdent->mString, "disp_put_price");
|
||||||
|
|
||||||
int nblocks = proc->mBlocks.Size();
|
int nblocks = proc->mBlocks.Size();
|
||||||
tblocks = new NativeCodeBasicBlock * [nblocks];
|
tblocks = new NativeCodeBasicBlock * [nblocks];
|
||||||
|
@ -48228,6 +48260,8 @@ void NativeCodeProcedure::Optimize(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 1
|
#if 1
|
||||||
|
CheckBlocks();
|
||||||
|
|
||||||
if (step > 0)
|
if (step > 0)
|
||||||
{
|
{
|
||||||
RebuildEntry();
|
RebuildEntry();
|
||||||
|
@ -48243,9 +48277,16 @@ void NativeCodeProcedure::Optimize(void)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if 1
|
#if 1
|
||||||
|
CheckBlocks();
|
||||||
|
|
||||||
ResetVisited();
|
ResetVisited();
|
||||||
if (mEntryBlock->MergeBasicBlocks())
|
if (mEntryBlock->MergeBasicBlocks())
|
||||||
changed = true;
|
{
|
||||||
|
// changed = true;
|
||||||
|
BuildDataFlowSets();
|
||||||
|
CheckBlocks();
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
RebuildEntry();
|
RebuildEntry();
|
||||||
|
|
Loading…
Reference in New Issue