Optimizing some pointer arithmetic
This commit is contained in:
parent
92e01b6298
commit
84648fbd88
|
@ -4444,7 +4444,7 @@ bool ByteCodeBasicBlock::PeepHoleOptimizer(int phase)
|
|||
if (mIns[i].mCode >= BC_LOAD_ADDR_8 && mIns[i].mCode <= BC_STORE_ADDR_32)
|
||||
{
|
||||
int j = i;
|
||||
while (j > 0 && !mIns[j - 1].ChangesAddr() && !mIns[j - 1].ChangesRegister(mIns[j].mRegister) && !mIns[j - 1].UsesRegister(mIns[j].mRegister))
|
||||
while (j > 0 && !mIns[j - 1].ChangesAddr() && !mIns[j - 1].UsesAddr() && !mIns[j - 1].ChangesRegister(mIns[j].mRegister) && !mIns[j - 1].UsesRegister(mIns[j].mRegister))
|
||||
{
|
||||
ByteCodeInstruction bins = mIns[j - 1];
|
||||
mIns[j - 1] = mIns[j];
|
||||
|
|
|
@ -8123,13 +8123,20 @@ bool NativeCodeBasicBlock::FindAddressSumY(int at, int reg, int & apos, int& bre
|
|||
{
|
||||
if (mIns[k].mMode == ASMIM_ZERO_PAGE && (mIns[k].mAddress == breg || mIns[k].mAddress == breg + 1 || mIns[k].mAddress == ireg) && mIns[k].ChangesAddress())
|
||||
return false;
|
||||
if (breg == reg)
|
||||
if (breg == reg || ireg == breg)
|
||||
{
|
||||
if (mIns[k].mMode == ASMIM_ZERO_PAGE && (mIns[k].mAddress == breg || mIns[k].mAddress == breg + 1))
|
||||
return false;
|
||||
if (mIns[k].mMode == ASMIM_INDIRECT_Y && mIns[k].mAddress == breg)
|
||||
return false;
|
||||
}
|
||||
else if (ireg == reg)
|
||||
{
|
||||
if (mIns[k].mMode == ASMIM_ZERO_PAGE && mIns[k].mAddress == ireg)
|
||||
return false;
|
||||
if (mIns[k].mMode == ASMIM_INDIRECT_Y && mIns[k].mAddress == ireg)
|
||||
return false;
|
||||
}
|
||||
k++;
|
||||
}
|
||||
|
||||
|
@ -8154,13 +8161,20 @@ bool NativeCodeBasicBlock::FindAddressSumY(int at, int reg, int & apos, int& bre
|
|||
{
|
||||
if (mIns[k].mMode == ASMIM_ZERO_PAGE && (mIns[k].mAddress == breg || mIns[k].mAddress == breg + 1 || mIns[k].mAddress == ireg) && mIns[k].ChangesAddress())
|
||||
return false;
|
||||
if (breg == reg)
|
||||
if (breg == reg || ireg == breg)
|
||||
{
|
||||
if (mIns[k].mMode == ASMIM_ZERO_PAGE && (mIns[k].mAddress == breg || mIns[k].mAddress == breg + 1))
|
||||
return false;
|
||||
if (mIns[k].mMode == ASMIM_INDIRECT_Y && mIns[k].mAddress == breg)
|
||||
return false;
|
||||
}
|
||||
else if (ireg == reg)
|
||||
{
|
||||
if (mIns[k].mMode == ASMIM_ZERO_PAGE && mIns[k].mAddress == ireg)
|
||||
return false;
|
||||
if (mIns[k].mMode == ASMIM_INDIRECT_Y && mIns[k].mAddress == ireg)
|
||||
return false;
|
||||
}
|
||||
k++;
|
||||
}
|
||||
|
||||
|
@ -8185,7 +8199,7 @@ bool NativeCodeBasicBlock::FindAddressSumY(int at, int reg, int & apos, int& bre
|
|||
{
|
||||
if (mIns[k].mMode == ASMIM_ZERO_PAGE && (mIns[k].mAddress == breg || mIns[k].mAddress == breg + 1 || mIns[k].mAddress == ireg) && mIns[k].ChangesAddress())
|
||||
return false;
|
||||
if (breg == reg)
|
||||
if (breg == reg || ireg == breg)
|
||||
{
|
||||
if (mIns[k].mMode == ASMIM_ZERO_PAGE && (mIns[k].mAddress == breg || mIns[k].mAddress == breg + 1))
|
||||
return false;
|
||||
|
@ -9963,6 +9977,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
|
|||
mIns[i + 1].mType = ASMIT_STX;
|
||||
progress = true;
|
||||
}
|
||||
#if 1
|
||||
else if (
|
||||
mIns[i + 0].mType == ASMIT_TYA &&
|
||||
mIns[i + 1].mType == ASMIT_STA && (mIns[i + 1].mMode == ASMIM_ZERO_PAGE || mIns[i + 1].mMode == ASMIM_ABSOLUTE))
|
||||
|
@ -9970,6 +9985,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
|
|||
mIns[i + 1].mType = ASMIT_STY;
|
||||
progress = true;
|
||||
}
|
||||
#endif
|
||||
else if (
|
||||
mIns[i + 0].mType == ASMIT_TAX &&
|
||||
mIns[i + 1].mType == ASMIT_STX && (mIns[i + 1].mMode == ASMIM_ZERO_PAGE || mIns[i + 1].mMode == ASMIM_ABSOLUTE))
|
||||
|
@ -10139,6 +10155,43 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
|
|||
}
|
||||
}
|
||||
#endif
|
||||
#if 1
|
||||
if (
|
||||
mIns[i + 0].mMode == ASMIM_INDIRECT_Y && (mIns[i + 0].mFlags & NCIF_YZERO) &&
|
||||
mIns[i + 1].mMode == ASMIM_INDIRECT_Y && mIns[i + 0].mAddress == mIns[i + 1].mAddress)
|
||||
{
|
||||
const NativeCodeInstruction* ains, * iins;
|
||||
|
||||
int sreg = mIns[i + 0].mAddress;
|
||||
|
||||
int apos, breg, ireg;
|
||||
uint32 flags;
|
||||
|
||||
if (FindAddressSumY(i, sreg, apos, breg, ireg))
|
||||
{
|
||||
if (!(breg == sreg || ireg == sreg) || !(mIns[i + 1].mLive & LIVE_MEM))
|
||||
{
|
||||
if (breg == sreg || ireg == sreg)
|
||||
{
|
||||
mIns[apos + 3].mType = ASMIT_NOP;
|
||||
mIns[apos + 3].mMode = ASMIM_IMPLIED;
|
||||
mIns[apos + 6].mType = ASMIT_NOP;
|
||||
mIns[apos + 6].mMode = ASMIM_IMPLIED;
|
||||
}
|
||||
if (mIns[i + 1].mLive & LIVE_CPU_REG_Y)
|
||||
{
|
||||
mIns.Insert(i + 2, NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, 0));
|
||||
mIns[i + 2].mLive |= LIVE_CPU_REG_Y;
|
||||
}
|
||||
mIns.Insert(i + 0, NativeCodeInstruction(ASMIT_LDY, ASMIM_ZERO_PAGE, ireg));
|
||||
mIns[i + 1].mAddress = breg; mIns[i + 1].mFlags &= ~NCIF_YZERO;
|
||||
mIns[i + 2].mAddress = breg; mIns[i + 2].mFlags &= ~NCIF_YZERO;
|
||||
progress = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
@ -10333,6 +10386,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
|
|||
mIns[i + 1].mLive |= LIVE_CPU_REG_C;
|
||||
progress = true;
|
||||
}
|
||||
#if 1
|
||||
else if (
|
||||
mIns[i + 0].mType == ASMIT_CLC &&
|
||||
mIns[i + 1].mType == ASMIT_TYA &&
|
||||
|
@ -10348,6 +10402,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
|
|||
mIns[i + 2].mType = ASMIT_TYA; mIns[i + 2].mMode = ASMIM_IMPLIED;
|
||||
progress = true;
|
||||
}
|
||||
#endif
|
||||
else if (
|
||||
mIns[i + 0].mType == ASMIT_STA &&
|
||||
mIns[i + 2].mType == ASMIT_STA && mIns[i + 0].SameEffectiveAddress(mIns[i + 2]) &&
|
||||
|
@ -10699,6 +10754,34 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
|
|||
#endif
|
||||
}
|
||||
|
||||
#if 0
|
||||
if (i + 8 < mIns.Size())
|
||||
{
|
||||
if (
|
||||
mIns[i + 0].mType == ASMIT_TYA &&
|
||||
mIns[i + 1].mType == ASMIT_CLC &&
|
||||
mIns[i + 2].mType == ASMIT_ADC && mIns[i + 2].mMode == ASMIM_ZERO_PAGE &&
|
||||
mIns[i + 3].mType == ASMIT_STA && mIns[i + 3].mMode == ASMIM_ZERO_PAGE &&
|
||||
mIns[i + 4].mType == ASMIT_LDA && mIns[i + 4].mMode == ASMIM_ZERO_PAGE && mIns[i + 4].mAddress == mIns[i + 2].mAddress + 1 &&
|
||||
mIns[i + 5].mType == ASMIT_ADC && mIns[i + 5].mMode == ASMIM_IMMEDIATE && mIns[i + 5].mAddress == 0 &&
|
||||
mIns[i + 6].mType == ASMIT_STA && mIns[i + 6].mMode == ASMIM_ZERO_PAGE && mIns[i + 6].mAddress == mIns[i + 3].mAddress + 1 &&
|
||||
|
||||
mIns[i + 7].mType == ASMIT_LDY && mIns[i + 7].mMode == ASMIM_IMMEDIATE && mIns[i + 7].mAddress == 0 &&
|
||||
mIns[i + 8].mMode == ASMIM_INDIRECT_Y && mIns[i + 8].mAddress == mIns[i + 3].mAddress)
|
||||
{
|
||||
mIns[i + 7].mType = ASMIT_NOP;
|
||||
mIns[i + 7].mMode = ASMIM_IMPLIED;
|
||||
mIns[i + 8].mAddress = mIns[i + 2].mAddress;
|
||||
|
||||
if (mIns[i + 8].mLive & LIVE_CPU_REG_Y)
|
||||
{
|
||||
mIns.Insert(i + 9, NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, 0));
|
||||
mIns[i + 9].mLive |= LIVE_CPU_REG_Y;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if 1
|
||||
if (i + 9 < mIns.Size())
|
||||
{
|
||||
|
@ -11048,27 +11131,35 @@ void NativeCodeProcedure::CompressTemporaries(void)
|
|||
for (int i = 0; i < 256; i++)
|
||||
remap[i] = i;
|
||||
|
||||
int tpos = BC_REG_TMP_SAVED;
|
||||
int tpos = BC_REG_TMP_SAVED;
|
||||
if (mInterProc->mLeafProcedure)
|
||||
tpos = BC_REG_TMP;
|
||||
|
||||
for (int i = 0; i < mInterProc->mTempOffset.Size(); i++)
|
||||
{
|
||||
bool tused = false;
|
||||
|
||||
int reg = BC_REG_TMP + mInterProc->mTempOffset[i];
|
||||
if (reg >= BC_REG_TMP_SAVED)
|
||||
if (mInterProc->mLeafProcedure || reg >= BC_REG_TMP_SAVED)
|
||||
{
|
||||
int size = mInterProc->mTempSizes[i];
|
||||
int usize = 0;
|
||||
|
||||
for (int j = 0; j < size; j++)
|
||||
if (used[reg + j])
|
||||
tused = true;
|
||||
usize = j + 1;
|
||||
|
||||
if (tused)
|
||||
if (usize)
|
||||
{
|
||||
for (int j = 0; j < size; j++)
|
||||
if (tpos < BC_REG_TMP_SAVED && tpos + usize > BC_REG_TMP + mInterProc->mCallerSavedTemps)
|
||||
tpos = BC_REG_TMP_SAVED;
|
||||
|
||||
for (int j = 0; j < usize; j++)
|
||||
remap[reg + j] = tpos + j;
|
||||
|
||||
mInterProc->mTempOffset[i] = tpos - BC_REG_TMP;
|
||||
tpos += size;
|
||||
mInterProc->mTempSizes[i] = usize;
|
||||
tpos += usize;
|
||||
|
||||
}
|
||||
else
|
||||
|
@ -11531,9 +11622,12 @@ void NativeCodeProcedure::Optimize(void)
|
|||
}
|
||||
} while (changed);
|
||||
|
||||
#if 1
|
||||
ResetVisited();
|
||||
mEntryBlock->BlockSizeReduction();
|
||||
#endif
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
void NativeCodeProcedure::BuildDataFlowSets(void)
|
||||
|
|
Loading…
Reference in New Issue