Known zero register value propagation
This commit is contained in:
parent
ebe9476bcc
commit
bc058a1c80
|
@ -20937,6 +20937,37 @@ bool NativeCodeBasicBlock::ValueForwarding(const NativeRegisterDataSet& data, bo
|
|||
|
||||
}
|
||||
}
|
||||
else if (lins.mType == ASMIT_LDX)
|
||||
{
|
||||
mFDataSet.mRegs[CPU_REG_X].mMode = NRDM_IMMEDIATE;
|
||||
mFDataSet.mRegs[CPU_REG_X].mValue = 0;
|
||||
|
||||
if (lins.mMode == ASMIM_ZERO_PAGE)
|
||||
{
|
||||
mFDataSet.mRegs[lins.mAddress].mMode = NRDM_IMMEDIATE;
|
||||
mFDataSet.mRegs[lins.mAddress].mValue = 0;
|
||||
|
||||
}
|
||||
}
|
||||
else if (lins.mType == ASMIT_LDA)
|
||||
{
|
||||
mFDataSet.mRegs[CPU_REG_A].mMode = NRDM_IMMEDIATE;
|
||||
mFDataSet.mRegs[CPU_REG_A].mValue = 0;
|
||||
|
||||
if (lins.mMode == ASMIM_ZERO_PAGE)
|
||||
{
|
||||
mFDataSet.mRegs[lins.mAddress].mMode = NRDM_IMMEDIATE;
|
||||
mFDataSet.mRegs[lins.mAddress].mValue = 0;
|
||||
|
||||
}
|
||||
}
|
||||
else if (lins.mType == ASMIT_TXA || lins.mType == ASMIT_TAX)
|
||||
{
|
||||
mFDataSet.mRegs[CPU_REG_A].mMode = NRDM_IMMEDIATE;
|
||||
mFDataSet.mRegs[CPU_REG_A].mValue = 0;
|
||||
mFDataSet.mRegs[CPU_REG_X].mMode = NRDM_IMMEDIATE;
|
||||
mFDataSet.mRegs[CPU_REG_X].mValue = 0;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case ASMIT_BEQ:
|
||||
|
@ -20959,6 +20990,53 @@ bool NativeCodeBasicBlock::ValueForwarding(const NativeRegisterDataSet& data, bo
|
|||
mFalseJump = nullptr;
|
||||
changed = true;
|
||||
}
|
||||
else if (global && mIns.Size() > 0)
|
||||
{
|
||||
NativeCodeInstruction& lins(mIns[mIns.Size() - 1]);
|
||||
|
||||
if (lins.mType == ASMIT_LDY)
|
||||
{
|
||||
mNDataSet.mRegs[CPU_REG_Y].mMode = NRDM_IMMEDIATE;
|
||||
mNDataSet.mRegs[CPU_REG_Y].mValue = 0;
|
||||
|
||||
if (lins.mMode == ASMIM_ZERO_PAGE)
|
||||
{
|
||||
mNDataSet.mRegs[lins.mAddress].mMode = NRDM_IMMEDIATE;
|
||||
mNDataSet.mRegs[lins.mAddress].mValue = 0;
|
||||
|
||||
}
|
||||
}
|
||||
else if (lins.mType == ASMIT_LDX)
|
||||
{
|
||||
mNDataSet.mRegs[CPU_REG_X].mMode = NRDM_IMMEDIATE;
|
||||
mNDataSet.mRegs[CPU_REG_X].mValue = 0;
|
||||
|
||||
if (lins.mMode == ASMIM_ZERO_PAGE)
|
||||
{
|
||||
mNDataSet.mRegs[lins.mAddress].mMode = NRDM_IMMEDIATE;
|
||||
mNDataSet.mRegs[lins.mAddress].mValue = 0;
|
||||
|
||||
}
|
||||
}
|
||||
else if (lins.mType == ASMIT_LDA)
|
||||
{
|
||||
mNDataSet.mRegs[CPU_REG_A].mMode = NRDM_IMMEDIATE;
|
||||
mNDataSet.mRegs[CPU_REG_A].mValue = 0;
|
||||
|
||||
if (lins.mMode == ASMIM_ZERO_PAGE)
|
||||
{
|
||||
mNDataSet.mRegs[lins.mAddress].mMode = NRDM_IMMEDIATE;
|
||||
mNDataSet.mRegs[lins.mAddress].mValue = 0;
|
||||
}
|
||||
}
|
||||
else if (lins.mType == ASMIT_TXA || lins.mType == ASMIT_TAX)
|
||||
{
|
||||
mNDataSet.mRegs[CPU_REG_A].mMode = NRDM_IMMEDIATE;
|
||||
mNDataSet.mRegs[CPU_REG_A].mValue = 0;
|
||||
mNDataSet.mRegs[CPU_REG_X].mMode = NRDM_IMMEDIATE;
|
||||
mNDataSet.mRegs[CPU_REG_X].mValue = 0;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case ASMIT_BPL:
|
||||
if (mNDataSet.mRegs[CPU_REG_Z].mMode == NRDM_IMMEDIATE)
|
||||
|
@ -23995,6 +24073,31 @@ void NativeCodeBasicBlock::BlockSizeReduction(NativeCodeProcedure* proc, int xen
|
|||
i += 4;
|
||||
}
|
||||
|
||||
else if (i + 3 < mIns.Size() &&
|
||||
mIns[i + 0].mType == ASMIT_LDA && mIns[i + 0].mMode == ASMIM_ABSOLUTE &&
|
||||
mIns[i + 1].mType == ASMIT_CLC &&
|
||||
mIns[i + 2].mType == ASMIT_ADC && mIns[i + 2].mMode == ASMIM_IMMEDIATE && mIns[i + 2].mAddress == 2 &&
|
||||
mIns[i + 3].mType == ASMIT_STA && mIns[i + 3].mMode == ASMIM_ABSOLUTE && mIns[i + 0].mAddress == mIns[i + 3].mAddress &&
|
||||
!(mIns[i + 3].mLive & (LIVE_CPU_REG_A | LIVE_CPU_REG_C | LIVE_CPU_REG_Z)))
|
||||
{
|
||||
mIns[j + 0].mType = ASMIT_INC; mIns[j + 0].CopyMode(mIns[i + 0]);
|
||||
mIns[j + 1].mType = ASMIT_INC; mIns[j + 1].CopyMode(mIns[i + 0]);
|
||||
j += 2;
|
||||
i += 4;
|
||||
}
|
||||
else if (i + 3 < mIns.Size() &&
|
||||
mIns[i + 1].mType == ASMIT_LDA && mIns[i + 1].mMode == ASMIM_ABSOLUTE &&
|
||||
mIns[i + 0].mType == ASMIT_SEC &&
|
||||
mIns[i + 2].mType == ASMIT_SBC && mIns[i + 2].mMode == ASMIM_IMMEDIATE && mIns[i + 2].mAddress == 2 &&
|
||||
mIns[i + 3].mType == ASMIT_STA && mIns[i + 3].mMode == ASMIM_ABSOLUTE && mIns[i + 0].mAddress == mIns[i + 3].mAddress &&
|
||||
!(mIns[i + 3].mLive & (LIVE_CPU_REG_A | LIVE_CPU_REG_C | LIVE_CPU_REG_Z)))
|
||||
{
|
||||
mIns[j + 0].mType = ASMIT_DEC; mIns[j + 0].CopyMode(mIns[i + 0]);
|
||||
mIns[j + 1].mType = ASMIT_DEC; mIns[j + 1].CopyMode(mIns[i + 0]);
|
||||
j += 2;
|
||||
i += 4;
|
||||
}
|
||||
|
||||
else if (i + 1 < mIns.Size() &&
|
||||
mIns[i + 0].mType == ASMIT_LDA && mIns[i + 0].mMode == ASMIM_ABSOLUTE_X &&
|
||||
mIns[i + 1].mType == ASMIT_TAY && !(mIns[i + 1].mLive & LIVE_CPU_REG_A))
|
||||
|
|
Loading…
Reference in New Issue