Fix movement of accu train across JSR that uses the same register
This commit is contained in:
parent
30680777f3
commit
2959016496
|
@ -530,6 +530,7 @@ unsigned char rand2(void)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
RAND_SEED[1] <<= 1;
|
RAND_SEED[1] <<= 1;
|
||||||
|
return RAND_SEED[1];
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned char rand8(void)
|
unsigned char rand8(void)
|
||||||
|
|
|
@ -1139,11 +1139,10 @@ bool NativeCodeInstruction::ChangesZeroPage(int address) const
|
||||||
|
|
||||||
if (!(mFlags & NCIF_RUNTIME) || (mFlags & NCIF_FEXEC))
|
if (!(mFlags & NCIF_RUNTIME) || (mFlags & NCIF_FEXEC))
|
||||||
{
|
{
|
||||||
if (address >= BC_REG_FPARAMS && address < BC_REG_FPARAMS_END)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
if (mLinkerObject && mLinkerObject->mProc)
|
if (mLinkerObject && mLinkerObject->mProc)
|
||||||
{
|
{
|
||||||
|
if (!(mFlags & NCIF_FEXEC) && (mLinkerObject->mFlags & LOBJF_ZEROPAGESET))
|
||||||
|
return mLinkerObject->mZeroPageSet[address];
|
||||||
if (address >= BC_REG_TMP && address < BC_REG_TMP + mLinkerObject->mProc->mCallerSavedTemps)
|
if (address >= BC_REG_TMP && address < BC_REG_TMP + mLinkerObject->mProc->mCallerSavedTemps)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -1153,6 +1152,8 @@ bool NativeCodeInstruction::ChangesZeroPage(int address) const
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (address >= BC_REG_FPARAMS && address < BC_REG_FPARAMS_END)
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
@ -7563,6 +7564,15 @@ int NativeCodeBasicBlock::ShortMultiply(InterCodeProcedure* proc, NativeCodeProc
|
||||||
mIns.Push(NativeCodeInstruction(ASMIT_ASL, ASMIM_IMPLIED));
|
mIns.Push(NativeCodeInstruction(ASMIT_ASL, ASMIM_IMPLIED));
|
||||||
mIns.Push(NativeCodeInstruction(ASMIT_ADC, ASMIM_ZERO_PAGE, dreg + 0));
|
mIns.Push(NativeCodeInstruction(ASMIT_ADC, ASMIM_ZERO_PAGE, dreg + 0));
|
||||||
mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, dreg + 0));
|
mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, dreg + 0));
|
||||||
|
|
||||||
|
if (ins->mDst.IsUByte())
|
||||||
|
{
|
||||||
|
ShiftRegisterLeftByte(proc, dreg, lshift);
|
||||||
|
mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, 0));
|
||||||
|
mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, dreg + 1));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
ShiftRegisterLeftFromByte(proc, dreg, lshift, ins->mSrc[index].mRange.mMaxValue * 5);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -7581,15 +7591,16 @@ int NativeCodeBasicBlock::ShortMultiply(InterCodeProcedure* proc, NativeCodeProc
|
||||||
mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, wreg + 1));
|
mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, wreg + 1));
|
||||||
mIns.Push(NativeCodeInstruction(ASMIT_ADC, ASMIM_ZERO_PAGE, dreg + 1));
|
mIns.Push(NativeCodeInstruction(ASMIT_ADC, ASMIM_ZERO_PAGE, dreg + 1));
|
||||||
mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, dreg + 1));
|
mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, dreg + 1));
|
||||||
|
|
||||||
|
if (ins->mDst.IsUByte())
|
||||||
|
{
|
||||||
|
ShiftRegisterLeftByte(proc, dreg, lshift);
|
||||||
|
mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, 0));
|
||||||
|
mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, dreg + 1));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
ShiftRegisterLeft(proc, dreg, lshift);
|
||||||
}
|
}
|
||||||
if (ins->mDst.IsUByte())
|
|
||||||
{
|
|
||||||
ShiftRegisterLeftByte(proc, dreg, lshift);
|
|
||||||
mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, 0));
|
|
||||||
mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, dreg + 1));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
ShiftRegisterLeft(proc, dreg, lshift);
|
|
||||||
return dreg;
|
return dreg;
|
||||||
case 7:
|
case 7:
|
||||||
if (ins->mSrc[index].IsUByte() && ins->mSrc[index].mRange.mMaxValue < 64)
|
if (ins->mSrc[index].IsUByte() && ins->mSrc[index].mRange.mMaxValue < 64)
|
||||||
|
@ -14018,8 +14029,12 @@ bool NativeCodeBasicBlock::MoveAccuTrainUp(int at, int end)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mIns[i].mType == ASMIT_JSR && needXY)
|
if (mIns[i].mType == ASMIT_JSR)
|
||||||
return false;
|
{
|
||||||
|
if (needXY)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
for (int j = at; j < end; j++)
|
for (int j = at; j < end; j++)
|
||||||
{
|
{
|
||||||
|
@ -14029,6 +14044,8 @@ bool NativeCodeBasicBlock::MoveAccuTrainUp(int at, int end)
|
||||||
return false;
|
return false;
|
||||||
if (mIns[j].MayBeChangedOnAddress(mIns[i], true) || mIns[i].MayBeChangedOnAddress(mIns[j], true))
|
if (mIns[j].MayBeChangedOnAddress(mIns[i], true) || mIns[i].MayBeChangedOnAddress(mIns[j], true))
|
||||||
return false;
|
return false;
|
||||||
|
if (mIns[i].mType == ASMIT_JSR && mIns[j].mMode == ASMIM_ZERO_PAGE && mIns[j].ChangesAddress() && mIns[i].ReferencesZeroPage(mIns[j].mAddress))
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -14084,6 +14101,12 @@ bool NativeCodeBasicBlock::MoveAccuTrainsUp(void)
|
||||||
}
|
}
|
||||||
else if (mIns[i].mType == ASMIT_JSR)
|
else if (mIns[i].mType == ASMIT_JSR)
|
||||||
{
|
{
|
||||||
|
for (int j = 0; j < 256; j++)
|
||||||
|
{
|
||||||
|
if (wzero[j] && mIns[i].ChangesZeroPage(j))
|
||||||
|
wzero -= j;
|
||||||
|
}
|
||||||
|
#if 0
|
||||||
for (int j = 0; j < 4; j++)
|
for (int j = 0; j < 4; j++)
|
||||||
{
|
{
|
||||||
wzero -= BC_REG_ACCU + j;
|
wzero -= BC_REG_ACCU + j;
|
||||||
|
@ -14097,6 +14120,7 @@ bool NativeCodeBasicBlock::MoveAccuTrainsUp(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
// wzero.Clear();
|
// wzero.Clear();
|
||||||
|
#endif
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
else if (mIns[i].mMode == ASMIM_ZERO_PAGE && mIns[i].ChangesAddress())
|
else if (mIns[i].mMode == ASMIM_ZERO_PAGE && mIns[i].ChangesAddress())
|
||||||
|
@ -26578,6 +26602,22 @@ bool NativeCodeBasicBlock::OptimizeSimpleLoopInvariant(NativeCodeProcedure* proc
|
||||||
mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED;
|
mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (mIns[i + 0].mType == ASMIT_LDA && mIns[i + 0].mMode == ASMIM_IMMEDIATE &&
|
||||||
|
mIns[i + 1].mType == ASMIT_STA && mIns[i + 1].mMode == ASMIM_ZERO_PAGE)
|
||||||
|
{
|
||||||
|
int j = 0;
|
||||||
|
while (j < mIns.Size() &&
|
||||||
|
(j == i + 1 || !mIns[j].ChangesZeroPage(mIns[i + 1].mAddress)))
|
||||||
|
j++;
|
||||||
|
if (j == mIns.Size())
|
||||||
|
{
|
||||||
|
if (!prevBlock)
|
||||||
|
return OptimizeSimpleLoopInvariant(proc, full);
|
||||||
|
prevBlock->mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, mIns[i + 0].mAddress));
|
||||||
|
prevBlock->mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, mIns[i + 1].mAddress));
|
||||||
|
mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -29880,7 +29920,6 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(NativeCodeProcedure* proc, int pass
|
||||||
if (mFalseJump)
|
if (mFalseJump)
|
||||||
mFalseJump->CheckLive();
|
mFalseJump->CheckLive();
|
||||||
|
|
||||||
|
|
||||||
#if 1
|
#if 1
|
||||||
#if 1
|
#if 1
|
||||||
// move load store pairs up to initial store
|
// move load store pairs up to initial store
|
||||||
|
@ -35332,8 +35371,9 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(NativeCodeProcedure* proc, int pass
|
||||||
if (mFalseJump)
|
if (mFalseJump)
|
||||||
mFalseJump->CheckLive();
|
mFalseJump->CheckLive();
|
||||||
|
|
||||||
int sz = mIns.Size();
|
|
||||||
#if 1
|
#if 1
|
||||||
|
int sz = mIns.Size();
|
||||||
|
|
||||||
if (sz >= 2 &&
|
if (sz >= 2 &&
|
||||||
mIns[sz - 2].mType == ASMIT_LDA && mIns[sz - 2].mMode == ASMIM_IMMEDIATE && mIns[sz - 2].mAddress == 0 &&
|
mIns[sz - 2].mType == ASMIT_LDA && mIns[sz - 2].mMode == ASMIM_IMMEDIATE && mIns[sz - 2].mAddress == 0 &&
|
||||||
mIns[sz - 1].mType == ASMIT_CMP)
|
mIns[sz - 1].mType == ASMIT_CMP)
|
||||||
|
@ -35365,7 +35405,6 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(NativeCodeProcedure* proc, int pass
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
else if (sz >= 2 &&
|
else if (sz >= 2 &&
|
||||||
mIns[sz - 2].ChangesAccuAndFlag() &&
|
mIns[sz - 2].ChangesAccuAndFlag() &&
|
||||||
mIns[sz - 1].mType == ASMIT_CMP && mIns[sz - 1].mMode == ASMIM_IMMEDIATE && mIns[sz - 1].mAddress == 1 &&
|
mIns[sz - 1].mType == ASMIT_CMP && mIns[sz - 1].mMode == ASMIM_IMMEDIATE && mIns[sz - 1].mAddress == 1 &&
|
||||||
|
@ -35623,6 +35662,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(NativeCodeProcedure* proc, int pass
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
CheckLive();
|
CheckLive();
|
||||||
|
@ -36915,7 +36955,7 @@ void NativeCodeProcedure::RebuildEntry(void)
|
||||||
|
|
||||||
void NativeCodeProcedure::Optimize(void)
|
void NativeCodeProcedure::Optimize(void)
|
||||||
{
|
{
|
||||||
CheckFunc = !strcmp(mInterProc->mIdent->mString, "pad_poll");
|
CheckFunc = !strcmp(mInterProc->mIdent->mString, "main");
|
||||||
|
|
||||||
#if 1
|
#if 1
|
||||||
int step = 0;
|
int step = 0;
|
||||||
|
@ -37231,7 +37271,6 @@ void NativeCodeProcedure::Optimize(void)
|
||||||
changed = true;
|
changed = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#if 1
|
#if 1
|
||||||
if (step == 5 || step == 6)
|
if (step == 5 || step == 6)
|
||||||
{
|
{
|
||||||
|
@ -37352,6 +37391,11 @@ void NativeCodeProcedure::Optimize(void)
|
||||||
changed = true;
|
changed = true;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#if 1
|
#if 1
|
||||||
if (step == 6)
|
if (step == 6)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue