Fix usage of "ldx abs,x" in some corner cases
This commit is contained in:
parent
04d1abd803
commit
3ea44d1979
|
@ -1060,7 +1060,6 @@ bool NativeCodeInstruction::ReplaceYRegWithXReg(void)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (mMode == ASMIM_ABSOLUTE_Y)
|
if (mMode == ASMIM_ABSOLUTE_Y)
|
||||||
{
|
{
|
||||||
assert(HasAsmInstructionMode(mType, ASMIM_ABSOLUTE_X));
|
assert(HasAsmInstructionMode(mType, ASMIM_ABSOLUTE_X));
|
||||||
|
@ -4284,6 +4283,31 @@ bool NativeCodeInstruction::ValueForwarding(NativeRegisterDataSet& data, AsmInsT
|
||||||
else
|
else
|
||||||
data.mRegs[CPU_REG_A].Reset();
|
data.mRegs[CPU_REG_A].Reset();
|
||||||
break;
|
break;
|
||||||
|
#if 1
|
||||||
|
case ASMIT_STA:
|
||||||
|
if (!(mFlags & NCIF_VOLATILE) && mLinkerObject)
|
||||||
|
{
|
||||||
|
if (data.mRegs[CPU_REG_A].mMode == NRDM_ABSOLUTE && data.mRegs[CPU_REG_A].mLinkerObject == mLinkerObject && data.mRegs[CPU_REG_A].mValue == mAddress)
|
||||||
|
{
|
||||||
|
mType = ASMIT_NOP;
|
||||||
|
mMode = ASMIM_IMPLIED;
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
else if (data.mRegs[CPU_REG_A].mMode == NRDM_UNKNOWN)
|
||||||
|
{
|
||||||
|
data.ResetAbsolute(mLinkerObject, mAddress);
|
||||||
|
data.mRegs[CPU_REG_A].mMode = NRDM_ABSOLUTE;
|
||||||
|
data.mRegs[CPU_REG_A].mLinkerObject = mLinkerObject;
|
||||||
|
data.mRegs[CPU_REG_A].mValue = mAddress;
|
||||||
|
data.mRegs[CPU_REG_A].mFlags = mFlags;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
data.ResetAbsolute(mLinkerObject, mAddress);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
data.ResetAbsolute(mLinkerObject, mAddress);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
case ASMIT_LDY:
|
case ASMIT_LDY:
|
||||||
if (!(mFlags & NCIF_VOLATILE))
|
if (!(mFlags & NCIF_VOLATILE))
|
||||||
{
|
{
|
||||||
|
@ -4315,6 +4339,31 @@ bool NativeCodeInstruction::ValueForwarding(NativeRegisterDataSet& data, AsmInsT
|
||||||
else
|
else
|
||||||
data.mRegs[CPU_REG_Y].Reset();
|
data.mRegs[CPU_REG_Y].Reset();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case ASMIT_STY:
|
||||||
|
if (!(mFlags & NCIF_VOLATILE) && mLinkerObject)
|
||||||
|
{
|
||||||
|
if (data.mRegs[CPU_REG_Y].mMode == NRDM_ABSOLUTE && data.mRegs[CPU_REG_Y].mLinkerObject == mLinkerObject && data.mRegs[CPU_REG_Y].mValue == mAddress)
|
||||||
|
{
|
||||||
|
mType = ASMIT_NOP;
|
||||||
|
mMode = ASMIM_IMPLIED;
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
else if (data.mRegs[CPU_REG_Y].mMode == NRDM_UNKNOWN)
|
||||||
|
{
|
||||||
|
data.ResetAbsolute(mLinkerObject, mAddress);
|
||||||
|
data.mRegs[CPU_REG_Y].mMode = NRDM_ABSOLUTE;
|
||||||
|
data.mRegs[CPU_REG_Y].mLinkerObject = mLinkerObject;
|
||||||
|
data.mRegs[CPU_REG_Y].mValue = mAddress;
|
||||||
|
data.mRegs[CPU_REG_Y].mFlags = mFlags;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
data.ResetAbsolute(mLinkerObject, mAddress);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
data.ResetAbsolute(mLinkerObject, mAddress);
|
||||||
|
break;
|
||||||
|
|
||||||
case ASMIT_LDX:
|
case ASMIT_LDX:
|
||||||
if (!(mFlags & NCIF_VOLATILE))
|
if (!(mFlags & NCIF_VOLATILE))
|
||||||
{
|
{
|
||||||
|
@ -4346,6 +4395,31 @@ bool NativeCodeInstruction::ValueForwarding(NativeRegisterDataSet& data, AsmInsT
|
||||||
else
|
else
|
||||||
data.mRegs[CPU_REG_X].Reset();
|
data.mRegs[CPU_REG_X].Reset();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case ASMIT_STX:
|
||||||
|
if (!(mFlags & NCIF_VOLATILE) && mLinkerObject)
|
||||||
|
{
|
||||||
|
if (data.mRegs[CPU_REG_X].mMode == NRDM_ABSOLUTE && data.mRegs[CPU_REG_X].mLinkerObject == mLinkerObject && data.mRegs[CPU_REG_X].mValue == mAddress)
|
||||||
|
{
|
||||||
|
mType = ASMIT_NOP;
|
||||||
|
mMode = ASMIM_IMPLIED;
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
else if (data.mRegs[CPU_REG_X].mMode == NRDM_UNKNOWN)
|
||||||
|
{
|
||||||
|
data.ResetAbsolute(mLinkerObject, mAddress);
|
||||||
|
data.mRegs[CPU_REG_X].mMode = NRDM_ABSOLUTE;
|
||||||
|
data.mRegs[CPU_REG_X].mLinkerObject = mLinkerObject;
|
||||||
|
data.mRegs[CPU_REG_X].mValue = mAddress;
|
||||||
|
data.mRegs[CPU_REG_X].mFlags = mFlags;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
data.ResetAbsolute(mLinkerObject, mAddress);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
data.ResetAbsolute(mLinkerObject, mAddress);
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
if (ChangesAddress())
|
if (ChangesAddress())
|
||||||
data.ResetAbsolute(mLinkerObject, mAddress);
|
data.ResetAbsolute(mLinkerObject, mAddress);
|
||||||
|
@ -16127,7 +16201,10 @@ bool NativeCodeBasicBlock::CanReplaceYRegWithXReg(int start, int end)
|
||||||
|
|
||||||
if ((ins.mLive & LIVE_CPU_REG_X) && (ins.mLive & LIVE_CPU_REG_Y))
|
if ((ins.mLive & LIVE_CPU_REG_X) && (ins.mLive & LIVE_CPU_REG_Y))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
if (mIns[i].mType == ASMIT_LDY && mIns[i].mMode == ASMIM_ABSOLUTE_X)
|
||||||
|
return false;
|
||||||
|
|
||||||
if (ins.mMode == ASMIM_INDIRECT_Y)
|
if (ins.mMode == ASMIM_INDIRECT_Y)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
@ -16147,6 +16224,9 @@ bool NativeCodeBasicBlock::CanReplaceXRegWithYReg(int start, int end)
|
||||||
if ((ins.mLive & LIVE_CPU_REG_X) && (ins.mLive & LIVE_CPU_REG_Y))
|
if ((ins.mLive & LIVE_CPU_REG_X) && (ins.mLive & LIVE_CPU_REG_Y))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
if (mIns[i].mType == ASMIT_LDX && mIns[i].mMode == ASMIM_ABSOLUTE_Y)
|
||||||
|
return false;
|
||||||
|
|
||||||
if (ins.mMode == ASMIM_INDIRECT_X)
|
if (ins.mMode == ASMIM_INDIRECT_X)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
@ -24149,6 +24229,25 @@ bool NativeCodeBasicBlock::JoinTailCodeSequences(NativeCodeProcedure* proc, bool
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (mEntryBlocks.Size() == 1 && mIns.Size() > 0 && mIns[0].mType == ASMIT_TAX && !(mIns[0].mLive & (LIVE_CPU_REG_A | LIVE_CPU_REG_Z)))
|
||||||
|
{
|
||||||
|
NativeCodeBasicBlock* pblock = mEntryBlocks[0];
|
||||||
|
NativeCodeBasicBlock* nblock = pblock->mTrueJump == this ? pblock->mFalseJump : pblock->mTrueJump;
|
||||||
|
if (!nblock || (!nblock->mEntryRequiredRegs[CPU_REG_A] && !nblock->mEntryRequiredRegs[CPU_REG_X]))
|
||||||
|
{
|
||||||
|
int ps = pblock->mIns.Size();
|
||||||
|
if (ps > 0 && pblock->mIns[ps - 1].mType == ASMIT_LDA && HasAsmInstructionMode(ASMIT_LDX, pblock->mIns[ps - 1].mMode))
|
||||||
|
{
|
||||||
|
pblock->mIns[ps - 1].mType = ASMIT_LDX;
|
||||||
|
pblock->mIns[ps - 1].mLive |= LIVE_CPU_REG_X;
|
||||||
|
pblock->mExitRequiredRegs += CPU_REG_X;
|
||||||
|
mEntryRequiredRegs += CPU_REG_X;
|
||||||
|
mIns[0].mType = ASMIT_NOP;
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
CheckLive();
|
CheckLive();
|
||||||
mProc->CheckBlocks();
|
mProc->CheckBlocks();
|
||||||
|
|
||||||
|
@ -44045,6 +44144,20 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(NativeCodeProcedure* proc, int pass
|
||||||
progress = true;
|
progress = true;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
#if 1
|
||||||
|
else if (
|
||||||
|
mIns[i + 0].mType == ASMIT_LDA && mIns[i + 0].mMode == ASMIM_ZERO_PAGE &&
|
||||||
|
mIns[i + 1].mType == ASMIT_STA &&
|
||||||
|
mIns[i + 2].mType == ASMIT_LDA && mIns[i + 2].mMode == ASMIM_ZERO_PAGE && !mIns[i + 1].SameEffectiveAddress(mIns[i + 2]) &&
|
||||||
|
mIns[i + 3].mType == ASMIT_CMP && mIns[i + 3].mMode == ASMIM_ZERO_PAGE && mIns[i + 3].mAddress == mIns[i + 0].mAddress && !(mIns[i + 3].mLive & (LIVE_CPU_REG_A | LIVE_CPU_REG_C)))
|
||||||
|
{
|
||||||
|
mIns[i + 3].mAddress = mIns[i + 2].mAddress;
|
||||||
|
mIns[i + 1].mLive |= LIVE_CPU_REG_A;
|
||||||
|
mIns[i + 2].mType = ASMIT_NOP; mIns[i + 2].mMode = ASMIM_IMPLIED;
|
||||||
|
|
||||||
|
progress = true;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
#if 1
|
#if 1
|
||||||
else if (
|
else if (
|
||||||
mIns[i + 0].mType == ASMIT_LDA &&
|
mIns[i + 0].mType == ASMIT_LDA &&
|
||||||
|
@ -48865,6 +48978,11 @@ void NativeCodeProcedure::Optimize(void)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if _DEBUG
|
||||||
|
ResetVisited();
|
||||||
|
mEntryBlock->CheckAsmCode();
|
||||||
|
#endif
|
||||||
|
|
||||||
#if 1
|
#if 1
|
||||||
if (step == 6)
|
if (step == 6)
|
||||||
{
|
{
|
||||||
|
@ -48882,6 +49000,11 @@ void NativeCodeProcedure::Optimize(void)
|
||||||
|
|
||||||
CheckBlocks();
|
CheckBlocks();
|
||||||
|
|
||||||
|
#if _DEBUG
|
||||||
|
ResetVisited();
|
||||||
|
mEntryBlock->CheckAsmCode();
|
||||||
|
#endif
|
||||||
|
|
||||||
#if 1
|
#if 1
|
||||||
ResetVisited();
|
ResetVisited();
|
||||||
if (mEntryBlock->ForwardAccuAddSub())
|
if (mEntryBlock->ForwardAccuAddSub())
|
||||||
|
@ -48919,6 +49042,12 @@ void NativeCodeProcedure::Optimize(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if _DEBUG
|
||||||
|
ResetVisited();
|
||||||
|
mEntryBlock->CheckAsmCode();
|
||||||
|
#endif
|
||||||
|
|
||||||
if (step >= 6)
|
if (step >= 6)
|
||||||
{
|
{
|
||||||
ResetVisited();
|
ResetVisited();
|
||||||
|
|
Loading…
Reference in New Issue