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
|
||||
}
|
||||
|
||||
if (mTrueJump)
|
||||
mTrueJump->MergeBasicBlocks();
|
||||
if (mFalseJump)
|
||||
mFalseJump->MergeBasicBlocks();
|
||||
if (mTrueJump && mTrueJump->MergeBasicBlocks())
|
||||
changed = true;
|
||||
if (mFalseJump && mFalseJump->MergeBasicBlocks())
|
||||
changed = true;
|
||||
|
||||
assert(mIns.Size() == 0 || mIns[0].mType != ASMIT_INV);
|
||||
}
|
||||
|
@ -23091,6 +23091,7 @@ bool NativeCodeBasicBlock::JoinTailCodeSequences(NativeCodeProcedure* proc, bool
|
|||
pblock->mIns.Push(mIns[0]);
|
||||
mIns.Remove(0);
|
||||
|
||||
lblock->mExitRequiredRegs += CPU_REG_Y;
|
||||
pblock->mExitRequiredRegs += CPU_REG_Y;
|
||||
mEntryRequiredRegs += CPU_REG_Y;
|
||||
mExitRequiredRegs += CPU_REG_Y;
|
||||
|
@ -23107,6 +23108,7 @@ bool NativeCodeBasicBlock::JoinTailCodeSequences(NativeCodeProcedure* proc, bool
|
|||
pblock->mIns.Push(mIns[0]);
|
||||
mIns.Remove(0);
|
||||
|
||||
lblock->mExitRequiredRegs += CPU_REG_Y;
|
||||
pblock->mExitRequiredRegs += CPU_REG_Y;
|
||||
mEntryRequiredRegs += CPU_REG_Y;
|
||||
mExitRequiredRegs += CPU_REG_Y;
|
||||
|
@ -23127,6 +23129,7 @@ bool NativeCodeBasicBlock::JoinTailCodeSequences(NativeCodeProcedure* proc, bool
|
|||
pblock->mIns.Push(mIns[0]);
|
||||
mIns.Remove(0);
|
||||
|
||||
lblock->mExitRequiredRegs += CPU_REG_X;
|
||||
pblock->mExitRequiredRegs += CPU_REG_X;
|
||||
mEntryRequiredRegs += CPU_REG_X;
|
||||
mExitRequiredRegs += CPU_REG_X;
|
||||
|
@ -23144,6 +23147,7 @@ bool NativeCodeBasicBlock::JoinTailCodeSequences(NativeCodeProcedure* proc, bool
|
|||
pblock->mIns.Push(mIns[0]);
|
||||
mIns.Remove(0);
|
||||
|
||||
lblock->mExitRequiredRegs += CPU_REG_A;
|
||||
pblock->mExitRequiredRegs += CPU_REG_A;
|
||||
mEntryRequiredRegs += 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]->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;
|
||||
|
@ -36906,7 +36920,7 @@ NativeCodeBasicBlock* NativeCodeBasicBlock::BuildSingleEntry(NativeCodeProcedure
|
|||
NativeCodeBasicBlock* nblock = proc->AllocateBlock();
|
||||
nblock->mTrueJump = block;
|
||||
nblock->mEntryRequiredRegs = block->mEntryRequiredRegs;
|
||||
nblock->mExitRequiredRegs = block->mExitRequiredRegs;
|
||||
nblock->mExitRequiredRegs = block->mEntryRequiredRegs;
|
||||
int k = block->mEntryBlocks.IndexOf(this);
|
||||
block->mEntryBlocks[k] = nblock;
|
||||
nblock->mEntryBlocks.Push(this);
|
||||
|
@ -37494,16 +37508,19 @@ bool NativeCodeBasicBlock::OptimizeGenericLoop(NativeCodeProcedure* proc)
|
|||
{
|
||||
if (areg < 256)
|
||||
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;
|
||||
}
|
||||
if (yreg >= 0 && block->mTrueJump->mEntryRequiredRegs[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;
|
||||
}
|
||||
if (xreg >= 0 && block->mTrueJump->mEntryRequiredRegs[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;
|
||||
}
|
||||
}
|
||||
|
@ -37514,16 +37531,19 @@ bool NativeCodeBasicBlock::OptimizeGenericLoop(NativeCodeProcedure* proc)
|
|||
{
|
||||
if (areg < 256)
|
||||
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;
|
||||
}
|
||||
if (yreg >= 0 && block->mFalseJump->mEntryRequiredRegs[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;
|
||||
}
|
||||
if (xreg >= 0 && block->mFalseJump->mEntryRequiredRegs[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;
|
||||
}
|
||||
}
|
||||
|
@ -37531,6 +37551,8 @@ bool NativeCodeBasicBlock::OptimizeGenericLoop(NativeCodeProcedure* proc)
|
|||
block->CheckLive();
|
||||
}
|
||||
|
||||
CheckLive();
|
||||
|
||||
changed = true;
|
||||
}
|
||||
}
|
||||
|
@ -46621,6 +46643,11 @@ void NativeCodeBasicBlock::CheckLive(void)
|
|||
if (mFalseJump->mIns.Size() > 0 && mFalseJump->mIns[0].RequiresXReg())
|
||||
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));
|
||||
|
||||
|
@ -46634,6 +46661,11 @@ void NativeCodeBasicBlock::CheckLive(void)
|
|||
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--)
|
||||
{
|
||||
assert(mIns[j].mType != ASMIT_INV);
|
||||
|
@ -47359,7 +47391,7 @@ void NativeCodeProcedure::Compile(InterCodeProcedure* proc)
|
|||
{
|
||||
mInterProc = proc;
|
||||
|
||||
CheckFunc = !strcmp(mInterProc->mIdent->mString, "rirq_build");
|
||||
CheckFunc = !strcmp(mInterProc->mIdent->mString, "disp_put_price");
|
||||
|
||||
int nblocks = proc->mBlocks.Size();
|
||||
tblocks = new NativeCodeBasicBlock * [nblocks];
|
||||
|
@ -48228,6 +48260,8 @@ void NativeCodeProcedure::Optimize(void)
|
|||
}
|
||||
|
||||
#if 1
|
||||
CheckBlocks();
|
||||
|
||||
if (step > 0)
|
||||
{
|
||||
RebuildEntry();
|
||||
|
@ -48243,9 +48277,16 @@ void NativeCodeProcedure::Optimize(void)
|
|||
#endif
|
||||
|
||||
#if 1
|
||||
CheckBlocks();
|
||||
|
||||
ResetVisited();
|
||||
if (mEntryBlock->MergeBasicBlocks())
|
||||
changed = true;
|
||||
{
|
||||
// changed = true;
|
||||
BuildDataFlowSets();
|
||||
CheckBlocks();
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
RebuildEntry();
|
||||
|
|
Loading…
Reference in New Issue