Fix duplicat check for loop head in native code generator

This commit is contained in:
drmortalwombat 2021-12-08 14:04:32 +01:00
parent 18ab7ce079
commit 1ac0c2f46a

View File

@ -2408,10 +2408,17 @@ void NativeCodeInstruction::Assemble(NativeCodeBasicBlock* block)
} }
else else
{ {
if (mMode == ASMIM_IMMEDIATE_ADDRESS) if (mMode == ASMIM_IMMEDIATE_ADDRESS)
{
assert(HasAsmInstructionMode(mType, ASMIM_IMMEDIATE));
block->PutByte(AsmInsOpcodes[mType][ASMIM_IMMEDIATE]); block->PutByte(AsmInsOpcodes[mType][ASMIM_IMMEDIATE]);
}
else else
{
assert(HasAsmInstructionMode(mType, mMode));
block->PutByte(AsmInsOpcodes[mType][mMode]); block->PutByte(AsmInsOpcodes[mType][mMode]);
}
switch (mMode) switch (mMode)
{ {
@ -2598,6 +2605,18 @@ void NativeCodeBasicBlock::LoadConstantToReg(InterCodeProcedure * proc, const In
mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, 0)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, 0));
mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg + 1)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg + 1));
} }
else if (ins->mConst.mMemory == IM_FRAME)
{
int index = ins->mConst.mVarIndex + ins->mConst.mIntConst + 2;
mIns.Push(NativeCodeInstruction(ASMIT_CLC, ASMIM_IMPLIED));
mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_STACK));
mIns.Push(NativeCodeInstruction(ASMIT_ADC, ASMIM_IMMEDIATE, index & 0xff));
mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg));
mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_STACK + 1));
mIns.Push(NativeCodeInstruction(ASMIT_ADC, ASMIM_IMMEDIATE, (index >> 8) & 0xff));
mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg + 1));
}
else if (ins->mConst.mMemory == IM_LOCAL || ins->mConst.mMemory == IM_PARAM) else if (ins->mConst.mMemory == IM_LOCAL || ins->mConst.mMemory == IM_PARAM)
{ {
int index = ins->mConst.mIntConst; int index = ins->mConst.mIntConst;
@ -7296,6 +7315,8 @@ bool NativeCodeBasicBlock::MergeBasicBlocks(void)
if (!mVisited) if (!mVisited)
{ {
assert(mIns.Size() == 0 || mIns[0].mType != ASMIT_INV);
mVisited = true; mVisited = true;
if (!mLocked) if (!mLocked)
@ -7338,6 +7359,8 @@ bool NativeCodeBasicBlock::MergeBasicBlocks(void)
mTrueJump->MergeBasicBlocks(); mTrueJump->MergeBasicBlocks();
if (mFalseJump) if (mFalseJump)
mFalseJump->MergeBasicBlocks(); mFalseJump->MergeBasicBlocks();
assert(mIns.Size() == 0 || mIns[0].mType != ASMIT_INV);
} }
return changed; return changed;
} }
@ -8262,6 +8285,7 @@ bool NativeCodeBasicBlock::FindAddressSumY(int at, int reg, int & apos, int& bre
while (j >= 0) while (j >= 0)
{ {
if ( if (
#if 1
mIns[j + 0].mType == ASMIT_CLC && mIns[j + 0].mType == ASMIT_CLC &&
mIns[j + 1].mType == ASMIT_LDA && mIns[j + 1].mMode == ASMIM_ZERO_PAGE && mIns[j + 1].mType == ASMIT_LDA && mIns[j + 1].mMode == ASMIM_ZERO_PAGE &&
mIns[j + 2].mType == ASMIT_ADC && mIns[j + 2].mMode == ASMIM_ZERO_PAGE && mIns[j + 2].mType == ASMIT_ADC && mIns[j + 2].mMode == ASMIM_ZERO_PAGE &&
@ -8300,6 +8324,7 @@ bool NativeCodeBasicBlock::FindAddressSumY(int at, int reg, int & apos, int& bre
return true; return true;
} }
else if ( else if (
#endif
mIns[j + 0].mType == ASMIT_CLC && mIns[j + 0].mType == ASMIT_CLC &&
mIns[j + 1].mType == ASMIT_LDA && mIns[j + 1].mMode == ASMIM_ZERO_PAGE && mIns[j + 1].mType == ASMIT_LDA && mIns[j + 1].mMode == ASMIM_ZERO_PAGE &&
mIns[j + 2].mType == ASMIT_ADC && mIns[j + 2].mMode == ASMIM_ZERO_PAGE && mIns[j + 2].mType == ASMIT_ADC && mIns[j + 2].mMode == ASMIM_ZERO_PAGE &&
@ -8548,7 +8573,7 @@ bool NativeCodeBasicBlock::MoveLoadStoreUp(int at)
} }
mIns[j - 1].mLive |= LIVE_CPU_REG_A; mIns[j - 1].mLive |= LIVE_CPU_REG_A;
mIns[j] = mIns[at + 1]; mIns[j] = mIns[at + 1];
mIns[at + 1].mType = ASMIT_NOP; mIns[at + 1].mType = ASMIT_NOP; mIns[at + 1].mMode = ASMIM_IMPLIED;
return true; return true;
} }
@ -8583,7 +8608,7 @@ bool NativeCodeBasicBlock::MoveLoadStoreXUp(int at)
mIns[j - 1].mLive |= LIVE_CPU_REG_A; mIns[j - 1].mLive |= LIVE_CPU_REG_A;
mIns[j] = mIns[at + 1]; mIns[j] = mIns[at + 1];
mIns[j].mType = ASMIT_STA; mIns[j].mType = ASMIT_STA;
mIns[at + 1].mType = ASMIT_NOP; mIns[at + 1].mType = ASMIT_NOP; mIns[at + 1].mMode = ASMIM_IMPLIED;
return true; return true;
} }
@ -8729,8 +8754,7 @@ bool NativeCodeBasicBlock::ValueForwarding(const NativeRegisterDataSet& data, bo
if (i + 1 < mIns.Size() && mIns[i].mType == ASMIT_LDA && mIns[i + 1].IsCommutative() && mIns[i + 1].mMode == ASMIM_ZERO_PAGE && mNDataSet.mRegs[CPU_REG_A].mMode == NRDM_ZERO_PAGE && mNDataSet.mRegs[CPU_REG_A].mValue == mIns[i + 1].mAddress) if (i + 1 < mIns.Size() && mIns[i].mType == ASMIT_LDA && mIns[i + 1].IsCommutative() && mIns[i + 1].mMode == ASMIM_ZERO_PAGE && mNDataSet.mRegs[CPU_REG_A].mMode == NRDM_ZERO_PAGE && mNDataSet.mRegs[CPU_REG_A].mValue == mIns[i + 1].mAddress)
{ {
mIns[i].mType = mIns[i + 1].mType; mIns[i].mType = mIns[i + 1].mType;
mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED;
mIns[i + 1].mMode = ASMIM_IMPLIED;
changed = true; changed = true;
} }
#endif #endif
@ -8839,6 +8863,8 @@ bool NativeCodeBasicBlock::OptimizeSimpleLoop(NativeCodeProcedure * proc)
{ {
mVisited = true; mVisited = true;
assert(mIns.Size() == 0 || mIns[0].mType != ASMIT_INV);
bool changed = false; bool changed = false;
int sz = mIns.Size(); int sz = mIns.Size();
if (sz > 3 && sz < 200 && mNumEntries == 2 && mTrueJump == this) if (sz > 3 && sz < 200 && mNumEntries == 2 && mTrueJump == this)
@ -8918,13 +8944,15 @@ bool NativeCodeBasicBlock::OptimizeSimpleLoop(NativeCodeProcedure * proc)
eblock->mFalseJump = nullptr; eblock->mFalseJump = nullptr;
mIns.Clear(); mIns.SetSize(0);
mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_ZERO_PAGE, zreg)); mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_ZERO_PAGE, zreg));
mBranch = ASMIT_JMP; mBranch = ASMIT_JMP;
mTrueJump = lblock; mTrueJump = lblock;
mFalseJump = nullptr; mFalseJump = nullptr;
changed = true; changed = true;
assert(mIns.Size() == 0 || mIns[0].mType != ASMIT_INV);
} }
else if (!xother) else if (!xother)
{ {
@ -8955,6 +8983,8 @@ bool NativeCodeBasicBlock::OptimizeSimpleLoop(NativeCodeProcedure * proc)
mFalseJump = nullptr; mFalseJump = nullptr;
changed = true; changed = true;
assert(mIns.Size() == 0 || mIns[0].mType != ASMIT_INV);
} }
} }
else if (mIns[sz - 1].mType == ASMIT_DEC && mIns[sz - 1].mMode == ASMIM_ZERO_PAGE && mBranch == ASMIT_BNE) else if (mIns[sz - 1].mType == ASMIT_DEC && mIns[sz - 1].mMode == ASMIM_ZERO_PAGE && mBranch == ASMIT_BNE)
@ -9009,6 +9039,8 @@ bool NativeCodeBasicBlock::OptimizeSimpleLoop(NativeCodeProcedure * proc)
mFalseJump = nullptr; mFalseJump = nullptr;
changed = true; changed = true;
assert(mIns.Size() == 0 || mIns[0].mType != ASMIT_INV);
} }
} }
else if (mIns[sz - 3].mType == ASMIT_INC && mIns[sz - 3].mMode == ASMIM_ZERO_PAGE && else if (mIns[sz - 3].mType == ASMIT_INC && mIns[sz - 3].mMode == ASMIM_ZERO_PAGE &&
@ -9087,6 +9119,8 @@ bool NativeCodeBasicBlock::OptimizeSimpleLoop(NativeCodeProcedure * proc)
mFalseJump = nullptr; mFalseJump = nullptr;
changed = true; changed = true;
assert(mIns.Size() == 0 || mIns[0].mType != ASMIT_INV);
} }
else if (!xother && !lchanged) else if (!xother && !lchanged)
{ {
@ -9117,6 +9151,8 @@ bool NativeCodeBasicBlock::OptimizeSimpleLoop(NativeCodeProcedure * proc)
mFalseJump = nullptr; mFalseJump = nullptr;
changed = true; changed = true;
assert(mIns.Size() == 0 || mIns[0].mType != ASMIT_INV);
} }
} }
} }
@ -9127,6 +9163,8 @@ bool NativeCodeBasicBlock::OptimizeSimpleLoop(NativeCodeProcedure * proc)
if (mFalseJump && mFalseJump->OptimizeSimpleLoop(proc)) if (mFalseJump && mFalseJump->OptimizeSimpleLoop(proc))
changed = true; changed = true;
assert(mIns.Size() == 0 || mIns[0].mType != ASMIT_INV);
return changed; return changed;
} }
@ -9196,6 +9234,7 @@ bool NativeCodeBasicBlock::OptimizeInnerLoop(NativeCodeProcedure* proc, NativeCo
xother = true; xother = true;
else if (block->mIns[i].mType != ASMIT_LDA && block->mIns[i].mMode == ASMIM_ZERO_PAGE && block->mIns[i].mAddress == zreg) else if (block->mIns[i].mType != ASMIT_LDA && block->mIns[i].mMode == ASMIM_ZERO_PAGE && block->mIns[i].mAddress == zreg)
xother = true; xother = true;
} }
} }
#if 1 #if 1
@ -9235,8 +9274,7 @@ bool NativeCodeBasicBlock::OptimizeInnerLoop(NativeCodeProcedure* proc, NativeCo
} }
else if (block->mIns[i].mType == ASMIT_LDY) else if (block->mIns[i].mType == ASMIT_LDY)
{ {
block->mIns[i].mType = ASMIT_NOP; block->mIns[i].mType = ASMIT_NOP; block->mIns[i].mMode = ASMIM_IMPLIED;
block->mIns[i].mMode = ASMIM_IMPLIED;
} }
} }
} }
@ -9303,8 +9341,7 @@ bool NativeCodeBasicBlock::OptimizeInnerLoop(NativeCodeProcedure* proc, NativeCo
} }
else if (block->mIns[i].mType == ASMIT_LDX) else if (block->mIns[i].mType == ASMIT_LDX)
{ {
block->mIns[i].mType = ASMIT_NOP; block->mIns[i].mType = ASMIT_NOP; block->mIns[i].mMode = ASMIM_IMPLIED;
block->mIns[i].mMode = ASMIM_IMPLIED;
} }
} }
} }
@ -9396,7 +9433,11 @@ bool NativeCodeBasicBlock::OptimizeInnerLoops(NativeCodeProcedure* proc)
if (tail) if (tail)
{ {
GrowingArray<NativeCodeBasicBlock*> lblocks(nullptr); GrowingArray<NativeCodeBasicBlock*> lblocks(nullptr);
CollectInnerLoop(this, lblocks);
if (this == tail)
lblocks.Push(this);
else
CollectInnerLoop(this, lblocks);
changed = OptimizeInnerLoop(proc, this, tail, lblocks); changed = OptimizeInnerLoop(proc, this, tail, lblocks);
} }
@ -9649,6 +9690,8 @@ bool NativeCodeBasicBlock::RemoveNops(void)
{ {
bool changed = false; bool changed = false;
assert(mIns.Size() == 0 || mIns[0].mType != ASMIT_INV);
int i = 0; int i = 0;
int j = 0; int j = 0;
while (i < mIns.Size()) while (i < mIns.Size())
@ -9675,6 +9718,8 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
{ {
if (!mVisited) if (!mVisited)
{ {
assert(mIns.Size() == 0 || mIns[0].mType != ASMIT_INV);
bool changed = RemoveNops(); bool changed = RemoveNops();
mVisited = true; mVisited = true;
@ -9913,6 +9958,8 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
do { do {
progress = false; progress = false;
mIns.Reserve(mIns.Size() * 2 + 32);
changed = RemoveNops(); changed = RemoveNops();
// Replace (a & 0x80) != 0 with bpl/bmi // Replace (a & 0x80) != 0 with bpl/bmi
@ -9926,14 +9973,14 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
{ {
mBranch = ASMIT_BPL; mBranch = ASMIT_BPL;
mIns[sz - 2].mLive |= LIVE_CPU_REG_Z; mIns[sz - 2].mLive |= LIVE_CPU_REG_Z;
mIns[sz - 1].mType = ASMIT_NOP; mIns[sz - 1].mType = ASMIT_NOP; mIns[sz - 1].mMode = ASMIM_IMPLIED;
changed = true; changed = true;
} }
else if (mBranch == ASMIT_BNE) else if (mBranch == ASMIT_BNE)
{ {
mBranch = ASMIT_BMI; mBranch = ASMIT_BMI;
mIns[sz - 2].mLive |= LIVE_CPU_REG_Z; mIns[sz - 2].mLive |= LIVE_CPU_REG_Z;
mIns[sz - 1].mType = ASMIT_NOP; mIns[sz - 1].mType = ASMIT_NOP; mIns[sz - 1].mMode = ASMIM_IMPLIED;
changed = true; changed = true;
} }
} }
@ -9947,18 +9994,18 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
if (mBranch == ASMIT_BEQ) if (mBranch == ASMIT_BEQ)
{ {
mBranch = ASMIT_BPL; mBranch = ASMIT_BPL;
mIns[sz - 4] = ASMIT_NOP; mIns[sz - 4].mType = ASMIT_NOP; mIns[sz - 4].mMode = ASMIM_IMPLIED;
mIns[sz - 3] = ASMIT_NOP; mIns[sz - 3].mType = ASMIT_NOP; mIns[sz - 3].mMode = ASMIM_IMPLIED;
mIns[sz - 2] = ASMIT_NOP; mIns[sz - 2].mType = ASMIT_NOP; mIns[sz - 2].mMode = ASMIM_IMPLIED;
mIns[sz - 1].mType = ASMIT_ORA; mIns[sz - 1].mAddress = 0; mIns[sz - 1].mType = ASMIT_ORA; mIns[sz - 1].mAddress = 0;
changed = true; changed = true;
} }
else if (mBranch == ASMIT_BNE) else if (mBranch == ASMIT_BNE)
{ {
mBranch = ASMIT_BMI; mBranch = ASMIT_BMI;
mIns[sz - 4] = ASMIT_NOP; mIns[sz - 4].mType = ASMIT_NOP; mIns[sz - 4].mMode = ASMIM_IMPLIED;
mIns[sz - 3] = ASMIT_NOP; mIns[sz - 3].mType = ASMIT_NOP; mIns[sz - 3].mMode = ASMIM_IMPLIED;
mIns[sz - 2] = ASMIT_NOP; mIns[sz - 2].mType = ASMIT_NOP; mIns[sz - 2].mMode = ASMIM_IMPLIED;
mIns[sz - 1].mType = ASMIT_ORA; mIns[sz - 1].mAddress = 0; mIns[sz - 1].mType = ASMIT_ORA; mIns[sz - 1].mAddress = 0;
changed = true; changed = true;
} }
@ -9975,7 +10022,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
} }
else if (mIns[i].mType == ASMIT_AND && mIns[i].mMode == ASMIM_IMMEDIATE && mIns[i].mAddress == 0xff && (mIns[i].mLive & LIVE_CPU_REG_Z) == 0) else if (mIns[i].mType == ASMIT_AND && mIns[i].mMode == ASMIM_IMMEDIATE && mIns[i].mAddress == 0xff && (mIns[i].mLive & LIVE_CPU_REG_Z) == 0)
{ {
mIns[i].mType = ASMIT_NOP; mIns[i].mType = ASMIT_NOP; mIns[i].mMode = ASMIM_IMPLIED;;
progress = true; progress = true;
} }
else if (mIns[i].mType == ASMIT_ORA && mIns[i].mMode == ASMIM_IMMEDIATE && mIns[i].mAddress == 0xff) else if (mIns[i].mType == ASMIT_ORA && mIns[i].mMode == ASMIM_IMMEDIATE && mIns[i].mAddress == 0xff)
@ -9985,7 +10032,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
} }
else if (mIns[i].mType == ASMIT_ORA && mIns[i].mMode == ASMIM_IMMEDIATE && mIns[i].mAddress == 0x00 && (mIns[i].mLive & LIVE_CPU_REG_Z) == 0) else if (mIns[i].mType == ASMIT_ORA && mIns[i].mMode == ASMIM_IMMEDIATE && mIns[i].mAddress == 0x00 && (mIns[i].mLive & LIVE_CPU_REG_Z) == 0)
{ {
mIns[i].mType = ASMIT_NOP; mIns[i].mType = ASMIT_NOP; mIns[i].mMode = ASMIM_IMPLIED;;
progress = true; progress = true;
} }
#endif #endif
@ -10025,14 +10072,13 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
if (FindAddressSumY(i, sreg, apos, breg, ireg)) if (FindAddressSumY(i, sreg, apos, breg, ireg))
{ {
if (!(breg == sreg || ireg == sreg)|| !(mIns[i + 0].mLive & LIVE_MEM)) if (!(breg == sreg || ireg == sreg)|| !(mIns[i + 0].mLive & LIVE_MEM))
{ {
if (breg == sreg || ireg == sreg) if (breg == sreg || ireg == sreg)
{ {
mIns[apos + 3].mType = ASMIT_NOP; mIns[apos + 3].mType = ASMIT_NOP; mIns[apos + 3].mMode = ASMIM_IMPLIED;
mIns[apos + 3].mMode = ASMIM_IMPLIED; mIns[apos + 6].mType = ASMIT_NOP; mIns[apos + 6].mMode = ASMIM_IMPLIED;
mIns[apos + 6].mType = ASMIT_NOP;
mIns[apos + 6].mMode = ASMIM_IMPLIED;
} }
if (mIns[i + 0].mLive & LIVE_CPU_REG_Y) if (mIns[i + 0].mLive & LIVE_CPU_REG_Y)
{ {
@ -10040,35 +10086,14 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
mIns[i + 1].mLive |= LIVE_CPU_REG_Y; mIns[i + 1].mLive |= LIVE_CPU_REG_Y;
} }
mIns.Insert(i + 0, NativeCodeInstruction(ASMIT_LDY, ASMIM_ZERO_PAGE, ireg)); mIns.Insert(i + 0, NativeCodeInstruction(ASMIT_LDY, ASMIM_ZERO_PAGE, ireg));
mIns[i + 0].mLive |= LIVE_CPU_REG_Y;
mIns[i + 1].mAddress = breg; mIns[i + 1].mAddress = breg;
mIns[i + 1].mFlags &= ~NCIF_YZERO; mIns[i + 1].mFlags &= ~NCIF_YZERO;
progress = true; progress = true;
} }
} }
#if 0
else if (FindGlobalAddressSumY(i, sreg, true, apos, ains, iins, flags) && iins)
{
if (mIns[i + 0].mLive & LIVE_CPU_REG_Y)
{
mIns.Insert(i + 1, NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, 0));
mIns[i + 1].mLive |= LIVE_CPU_REG_Y;
}
mIns[i + 0].mMode = ASMIM_ABSOLUTE_Y;
mIns[i + 0].mLinkerObject = ains->mLinkerObject;
mIns[i + 0].mAddress = ains->mAddress;
mIns[i + 0].mFlags &= ~NCIF_YZERO;
if (iins->mMode != ASMIM_ZERO_PAGE)
mIns.Insert(i + 0, NativeCodeInstruction(ASMIT_LDY, iins->mMode, iins->mAddress, iins->mLinkerObject, iins->mFlags));
else if (iins->mAddress == sreg)
mIns.Insert(apos, NativeCodeInstruction(ASMIT_LDY, ASMIM_ZERO_PAGE, iins->mAddress));
else
mIns.Insert(i + 0, NativeCodeInstruction(ASMIT_LDY, ASMIM_ZERO_PAGE, iins->mAddress));
progress = true;
}
#else
else if (FindGlobalAddressSumY(i, sreg, true, apos, ains, iins, flags)) else if (FindGlobalAddressSumY(i, sreg, true, apos, ains, iins, flags))
{ {
if (iins || (flags & LIVE_CPU_REG_Y) || (flags & LIVE_CPU_REG_X)) //!(mIns[i + 1].mLive & LIVE_CPU_REG_X)) if (iins || (flags & LIVE_CPU_REG_Y) || (flags & LIVE_CPU_REG_X)) //!(mIns[i + 1].mLive & LIVE_CPU_REG_X))
@ -10130,8 +10155,6 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
progress = true; progress = true;
} }
} }
#endif
} }
#endif #endif
@ -10140,56 +10163,56 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
{ {
if (mIns[i].mType == ASMIT_LDA && mIns[i + 1].mType == ASMIT_LDA) if (mIns[i].mType == ASMIT_LDA && mIns[i + 1].mType == ASMIT_LDA)
{ {
mIns[i].mType = ASMIT_NOP; mIns[i].mType = ASMIT_NOP; mIns[i].mMode = ASMIM_IMPLIED;;
progress = true; progress = true;
} }
else if (mIns[i].mType == ASMIT_LDA && mIns[i + 1].mType == ASMIT_STA && mIns[i].mMode == ASMIM_ZERO_PAGE && mIns[i + 1].mMode == ASMIM_ZERO_PAGE && mIns[i].mAddress == mIns[i + 1].mAddress) else if (mIns[i].mType == ASMIT_LDA && mIns[i + 1].mType == ASMIT_STA && mIns[i].mMode == ASMIM_ZERO_PAGE && mIns[i + 1].mMode == ASMIM_ZERO_PAGE && mIns[i].mAddress == mIns[i + 1].mAddress)
{ {
mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED;;
progress = true; progress = true;
} }
else if (mIns[i].mType == ASMIT_STA && mIns[i + 1].mType == ASMIT_LDA && mIns[i].mMode == ASMIM_ZERO_PAGE && mIns[i + 1].mMode == ASMIM_ZERO_PAGE && mIns[i].mAddress == mIns[i + 1].mAddress && (mIns[i + 1].mLive & LIVE_CPU_REG_Z) == 0) else if (mIns[i].mType == ASMIT_STA && mIns[i + 1].mType == ASMIT_LDA && mIns[i].mMode == ASMIM_ZERO_PAGE && mIns[i + 1].mMode == ASMIM_ZERO_PAGE && mIns[i].mAddress == mIns[i + 1].mAddress && (mIns[i + 1].mLive & LIVE_CPU_REG_Z) == 0)
{ {
mIns[i + 1].mLive |= LIVE_CPU_REG_A; mIns[i + 1].mLive |= LIVE_CPU_REG_A;
mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED;
progress = true; progress = true;
} }
else if (mIns[i].mType == ASMIT_AND && mIns[i + 1].mType == ASMIT_AND && mIns[i].mMode == ASMIM_IMMEDIATE && mIns[i + 1].mMode == ASMIM_IMMEDIATE) else if (mIns[i].mType == ASMIT_AND && mIns[i + 1].mType == ASMIT_AND && mIns[i].mMode == ASMIM_IMMEDIATE && mIns[i + 1].mMode == ASMIM_IMMEDIATE)
{ {
mIns[i].mAddress &= mIns[i + 1].mAddress; mIns[i].mAddress &= mIns[i + 1].mAddress;
mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED;
progress = true; progress = true;
} }
else if (mIns[i].mType == ASMIT_ORA && mIns[i + 1].mType == ASMIT_ORA && mIns[i].mMode == ASMIM_IMMEDIATE && mIns[i + 1].mMode == ASMIM_IMMEDIATE) else if (mIns[i].mType == ASMIT_ORA && mIns[i + 1].mType == ASMIT_ORA && mIns[i].mMode == ASMIM_IMMEDIATE && mIns[i + 1].mMode == ASMIM_IMMEDIATE)
{ {
mIns[i].mAddress |= mIns[i + 1].mAddress; mIns[i].mAddress |= mIns[i + 1].mAddress;
mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED;
progress = true; progress = true;
} }
else if (mIns[i].mType == ASMIT_EOR && mIns[i + 1].mType == ASMIT_EOR && mIns[i].mMode == ASMIM_IMMEDIATE && mIns[i + 1].mMode == ASMIM_IMMEDIATE) else if (mIns[i].mType == ASMIT_EOR && mIns[i + 1].mType == ASMIT_EOR && mIns[i].mMode == ASMIM_IMMEDIATE && mIns[i + 1].mMode == ASMIM_IMMEDIATE)
{ {
mIns[i].mAddress ^= mIns[i + 1].mAddress; mIns[i].mAddress ^= mIns[i + 1].mAddress;
mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED;
progress = true; progress = true;
} }
else if (mIns[i].mType == ASMIT_LDA && mIns[i + 1].mType == ASMIT_ORA && mIns[i + 1].mMode == ASMIM_IMMEDIATE && mIns[i + 1].mAddress == 0) else if (mIns[i].mType == ASMIT_LDA && mIns[i + 1].mType == ASMIT_ORA && mIns[i + 1].mMode == ASMIM_IMMEDIATE && mIns[i + 1].mAddress == 0)
{ {
mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED;
progress = true; progress = true;
} }
else if (mIns[i].mType == ASMIT_LDA && mIns[i + 1].mType == ASMIT_EOR && mIns[i + 1].mMode == ASMIM_IMMEDIATE && mIns[i + 1].mAddress == 0) else if (mIns[i].mType == ASMIT_LDA && mIns[i + 1].mType == ASMIT_EOR && mIns[i + 1].mMode == ASMIM_IMMEDIATE && mIns[i + 1].mAddress == 0)
{ {
mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED;
progress = true; progress = true;
} }
else if (mIns[i].mType == ASMIT_LDA && mIns[i + 1].mType == ASMIT_AND && mIns[i + 1].mMode == ASMIM_IMMEDIATE && mIns[i + 1].mAddress == 0xff) else if (mIns[i].mType == ASMIT_LDA && mIns[i + 1].mType == ASMIT_AND && mIns[i + 1].mMode == ASMIM_IMMEDIATE && mIns[i + 1].mAddress == 0xff)
{ {
mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED;
progress = true; progress = true;
} }
else if (mIns[i].mType == ASMIT_CLC && mIns[i + 1].mType == ASMIT_ROR) else if (mIns[i].mType == ASMIT_CLC && mIns[i + 1].mType == ASMIT_ROR)
{ {
mIns[i + 0].mType = ASMIT_NOP; mIns[i + 0].mType = ASMIT_NOP; mIns[i + 0].mMode = ASMIM_IMPLIED;
mIns[i + 1].mType = ASMIT_LSR; mIns[i + 1].mType = ASMIT_LSR;
progress = true; progress = true;
} }
@ -10200,12 +10223,12 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
} }
else if (mIns[i].mType == ASMIT_CLC && mIns[i + 1].mType == ASMIT_ADC && mIns[i + 1].mMode == ASMIM_IMMEDIATE && mIns[i + 1].mAddress == 0 && !(mIns[i + 1].mLive & LIVE_CPU_REG_Z)) else if (mIns[i].mType == ASMIT_CLC && mIns[i + 1].mType == ASMIT_ADC && mIns[i + 1].mMode == ASMIM_IMMEDIATE && mIns[i + 1].mAddress == 0 && !(mIns[i + 1].mLive & LIVE_CPU_REG_Z))
{ {
mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED;
progress = true; progress = true;
} }
else if (mIns[i].mType == ASMIT_SEC && mIns[i + 1].mType == ASMIT_SBC && mIns[i + 1].mMode == ASMIM_IMMEDIATE && mIns[i + 1].mAddress == 0 && !(mIns[i + 1].mLive & LIVE_CPU_REG_Z)) else if (mIns[i].mType == ASMIT_SEC && mIns[i + 1].mType == ASMIT_SBC && mIns[i + 1].mMode == ASMIM_IMMEDIATE && mIns[i + 1].mAddress == 0 && !(mIns[i + 1].mLive & LIVE_CPU_REG_Z))
{ {
mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED;
progress = true; progress = true;
} }
else if (mIns[i + 0].mType == ASMIT_LDA && mIns[i + 1].mType == ASMIT_ADC && mIns[i + 1].SameEffectiveAddress(mIns[i + 0])) else if (mIns[i + 0].mType == ASMIT_LDA && mIns[i + 1].mType == ASMIT_ADC && mIns[i + 1].SameEffectiveAddress(mIns[i + 0]))
@ -10217,15 +10240,16 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
else if (mIns[i + 1].mType == ASMIT_ORA && mIns[i + 1].mMode == ASMIM_IMMEDIATE && mIns[i + 1].mAddress == 0 && mIns[i].ChangesAccuAndFlag()) else if (mIns[i + 1].mType == ASMIT_ORA && mIns[i + 1].mMode == ASMIM_IMMEDIATE && mIns[i + 1].mAddress == 0 && mIns[i].ChangesAccuAndFlag())
{ {
mIns[i + 0].mLive |= (mIns[i + 1].mLive & LIVE_CPU_REG_Z); mIns[i + 0].mLive |= (mIns[i + 1].mLive & LIVE_CPU_REG_Z);
mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED;
progress = true; progress = true;
} }
else if (mIns[i + 1].mType == ASMIT_CMP && mIns[i + 1].mMode == ASMIM_IMMEDIATE && mIns[i + 1].mAddress == 0 && mIns[i].ChangesAccuAndFlag() && !(mIns[i + 1].mLive & LIVE_CPU_REG_C)) else if (mIns[i + 1].mType == ASMIT_CMP && mIns[i + 1].mMode == ASMIM_IMMEDIATE && mIns[i + 1].mAddress == 0 && mIns[i].ChangesAccuAndFlag() && !(mIns[i + 1].mLive & LIVE_CPU_REG_C))
{ {
mIns[i + 0].mLive |= (mIns[i + 1].mLive & LIVE_CPU_REG_Z); mIns[i + 0].mLive |= (mIns[i + 1].mLive & LIVE_CPU_REG_Z);
mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED;
progress = true; progress = true;
} }
#if 1
else if ( else if (
mIns[i + 0].mType == ASMIT_STA && mIns[i + 0].mMode == ASMIM_ZERO_PAGE && mIns[i + 1].mMode == ASMIM_ZERO_PAGE && mIns[i].mAddress == mIns[i + 1].mAddress && mIns[i + 0].mType == ASMIT_STA && mIns[i + 0].mMode == ASMIM_ZERO_PAGE && mIns[i + 1].mMode == ASMIM_ZERO_PAGE && mIns[i].mAddress == mIns[i + 1].mAddress &&
(mIns[i + 1].mType == ASMIT_LSR || mIns[i + 1].mType == ASMIT_ASL || mIns[i + 1].mType == ASMIT_ROL || mIns[i + 1].mType == ASMIT_ROR) && !(mIns[i + 0].mLive & LIVE_CPU_REG_A)) (mIns[i + 1].mType == ASMIT_LSR || mIns[i + 1].mType == ASMIT_ASL || mIns[i + 1].mType == ASMIT_ROL || mIns[i + 1].mType == ASMIT_ROR) && !(mIns[i + 0].mLive & LIVE_CPU_REG_A))
@ -10236,7 +10260,6 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
mIns[i + 1].mType = ASMIT_STA; mIns[i + 1].mType = ASMIT_STA;
progress = true; progress = true;
} }
#if 1
else if ( else if (
mIns[i + 0].mType == ASMIT_ASL && mIns[i + 0].mMode == ASMIM_ZERO_PAGE && mIns[i + 0].mType == ASMIT_ASL && mIns[i + 0].mMode == ASMIM_ZERO_PAGE &&
mIns[i + 1].mType == ASMIT_LDY && mIns[i + 1].mMode == ASMIM_ZERO_PAGE && mIns[i + 0].mAddress == mIns[i + 1].mAddress && !(mIns[i + 1].mLive & (LIVE_MEM | LIVE_CPU_REG_A))) mIns[i + 1].mType == ASMIT_LDY && mIns[i + 1].mMode == ASMIM_ZERO_PAGE && mIns[i + 0].mAddress == mIns[i + 1].mAddress && !(mIns[i + 1].mLive & (LIVE_MEM | LIVE_CPU_REG_A)))
@ -10250,8 +10273,6 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
mIns[i + 1].mLive |= LIVE_CPU_REG_A; mIns[i + 1].mLive |= LIVE_CPU_REG_A;
progress = true; progress = true;
} }
#endif
#if 1
else if ( else if (
mIns[i + 0].mType == ASMIT_STA && mIns[i + 0].mType == ASMIT_STA &&
mIns[i + 1].mType == ASMIT_LDY && mIns[i + 0].SameEffectiveAddress(mIns[i + 1])) mIns[i + 1].mType == ASMIT_LDY && mIns[i + 0].SameEffectiveAddress(mIns[i + 1]))
@ -10270,8 +10291,6 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
mIns[i + 0].mLive |= LIVE_CPU_REG_A; mIns[i + 0].mLive |= LIVE_CPU_REG_A;
progress = true; progress = true;
} }
#endif
else if ( else if (
mIns[i + 0].mType == ASMIT_TXA && mIns[i + 0].mType == ASMIT_TXA &&
mIns[i + 1].mType == ASMIT_STA && (mIns[i + 1].mMode == ASMIM_ZERO_PAGE || mIns[i + 1].mMode == ASMIM_ABSOLUTE)) mIns[i + 1].mType == ASMIT_STA && (mIns[i + 1].mMode == ASMIM_ZERO_PAGE || mIns[i + 1].mMode == ASMIM_ABSOLUTE))
@ -10279,7 +10298,6 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
mIns[i + 1].mType = ASMIT_STX; mIns[i + 1].mType = ASMIT_STX;
progress = true; progress = true;
} }
#if 1
else if ( else if (
mIns[i + 0].mType == ASMIT_TYA && 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)) mIns[i + 1].mType == ASMIT_STA && (mIns[i + 1].mMode == ASMIM_ZERO_PAGE || mIns[i + 1].mMode == ASMIM_ABSOLUTE))
@ -10287,7 +10305,6 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
mIns[i + 1].mType = ASMIT_STY; mIns[i + 1].mType = ASMIT_STY;
progress = true; progress = true;
} }
#endif
else if ( else if (
mIns[i + 0].mType == ASMIT_TAX && 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)) mIns[i + 1].mType == ASMIT_STX && (mIns[i + 1].mMode == ASMIM_ZERO_PAGE || mIns[i + 1].mMode == ASMIM_ABSOLUTE))
@ -10306,28 +10323,28 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
mIns[i + 0].mType == ASMIT_TXA && mIns[i + 0].mType == ASMIT_TXA &&
mIns[i + 1].mType == ASMIT_TAX) mIns[i + 1].mType == ASMIT_TAX)
{ {
mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED;
progress = true; progress = true;
} }
else if ( else if (
mIns[i + 0].mType == ASMIT_TYA && mIns[i + 0].mType == ASMIT_TYA &&
mIns[i + 1].mType == ASMIT_TAY) mIns[i + 1].mType == ASMIT_TAY)
{ {
mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED;
progress = true; progress = true;
} }
else if ( else if (
mIns[i + 0].mType == ASMIT_TAX && mIns[i + 0].mType == ASMIT_TAX &&
mIns[i + 1].mType == ASMIT_TXA) mIns[i + 1].mType == ASMIT_TXA)
{ {
mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED;
progress = true; progress = true;
} }
else if ( else if (
mIns[i + 0].mType == ASMIT_TAY && mIns[i + 0].mType == ASMIT_TAY &&
mIns[i + 1].mType == ASMIT_TYA) mIns[i + 1].mType == ASMIT_TYA)
{ {
mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED;
progress = true; progress = true;
} }
else if ( else if (
@ -10335,7 +10352,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
mIns[i + 1].mType == ASMIT_TAY && !(mIns[i + 1].mLive & LIVE_CPU_REG_A)) mIns[i + 1].mType == ASMIT_TAY && !(mIns[i + 1].mLive & LIVE_CPU_REG_A))
{ {
mIns[i + 0].mType = ASMIT_LDY; mIns[i + 0].mLive |= mIns[i + 1].mLive; mIns[i + 0].mType = ASMIT_LDY; mIns[i + 0].mLive |= mIns[i + 1].mLive;
mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED;
progress = true; progress = true;
} }
else if ( else if (
@ -10343,7 +10360,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
mIns[i + 1].mType == ASMIT_TAX && !(mIns[i + 1].mLive & LIVE_CPU_REG_A)) mIns[i + 1].mType == ASMIT_TAX && !(mIns[i + 1].mLive & LIVE_CPU_REG_A))
{ {
mIns[i + 0].mType = ASMIT_LDX; mIns[i + 0].mLive |= mIns[i + 1].mLive; mIns[i + 0].mType = ASMIT_LDX; mIns[i + 0].mLive |= mIns[i + 1].mLive;
mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED;
progress = true; progress = true;
} }
else if ( else if (
@ -10351,7 +10368,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
mIns[i + 1].mType == ASMIT_TYA && !(mIns[i + 1].mLive & LIVE_CPU_REG_Y)) mIns[i + 1].mType == ASMIT_TYA && !(mIns[i + 1].mLive & LIVE_CPU_REG_Y))
{ {
mIns[i + 0].mType = ASMIT_LDA; mIns[i + 0].mLive |= mIns[i + 1].mLive; mIns[i + 0].mType = ASMIT_LDA; mIns[i + 0].mLive |= mIns[i + 1].mLive;
mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED;
progress = true; progress = true;
} }
else if ( else if (
@ -10359,7 +10376,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
mIns[i + 1].mType == ASMIT_TXA && !(mIns[i + 1].mLive & LIVE_CPU_REG_X)) mIns[i + 1].mType == ASMIT_TXA && !(mIns[i + 1].mLive & LIVE_CPU_REG_X))
{ {
mIns[i + 0].mType = ASMIT_LDA; mIns[i + 0].mLive |= mIns[i + 1].mLive; mIns[i + 0].mType = ASMIT_LDA; mIns[i + 0].mLive |= mIns[i + 1].mLive;
mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED;
progress = true; progress = true;
} }
else if ( else if (
@ -10403,7 +10420,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
mIns[i + 1] = ins; mIns[i + 1] = ins;
progress = true; progress = true;
} }
#endif
#if 1 #if 1
else if ( else if (
@ -10465,7 +10482,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
if (!iins) if (!iins)
{ {
mIns[i + 0].mType = ASMIT_NOP; mIns[i + 0].mType = ASMIT_NOP; mIns[i + 0].mMode = ASMIM_IMPLIED;
if (flags & LIVE_CPU_REG_Y) if (flags & LIVE_CPU_REG_Y)
{ {
mIns.Insert(apos, NativeCodeInstruction(ASMIT_TAY, ASMIM_IMPLIED)); mIns.Insert(apos, NativeCodeInstruction(ASMIT_TAY, ASMIM_IMPLIED));
@ -10490,7 +10507,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
} }
else if (iins->mAddress == sreg) else if (iins->mAddress == sreg)
{ {
mIns[i + 0].mType = ASMIT_NOP; mIns[i + 0].mType = ASMIT_NOP; mIns[i + 0].mMode = ASMIM_IMPLIED;
mIns.Insert(apos, NativeCodeInstruction(ASMIT_LDY, ASMIM_ZERO_PAGE, iins->mAddress)); mIns.Insert(apos, NativeCodeInstruction(ASMIT_LDY, ASMIM_ZERO_PAGE, iins->mAddress));
mIns[apos].mLive = LIVE_CPU_REG_Y | LIVE_MEM; mIns[apos].mLive = LIVE_CPU_REG_Y | LIVE_MEM;
} }
@ -10523,10 +10540,8 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
{ {
if (breg == sreg || ireg == sreg) if (breg == sreg || ireg == sreg)
{ {
mIns[apos + 3].mType = ASMIT_NOP; mIns[apos + 3].mType = ASMIT_NOP; mIns[apos + 3].mMode = ASMIM_IMPLIED;
mIns[apos + 3].mMode = ASMIM_IMPLIED; mIns[apos + 6].mType = ASMIT_NOP; mIns[apos + 6].mMode = ASMIM_IMPLIED;
mIns[apos + 6].mType = ASMIT_NOP;
mIns[apos + 6].mMode = ASMIM_IMPLIED;
} }
if (mIns[i + 1].mLive & LIVE_CPU_REG_Y) if (mIns[i + 1].mLive & LIVE_CPU_REG_Y)
{ {
@ -10555,10 +10570,8 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
if (breg == mIns[i + 1].mAddress) if (breg == mIns[i + 1].mAddress)
{ {
mIns[apos + 3].mType = ASMIT_NOP; mIns[apos + 3].mType = ASMIT_NOP; mIns[apos + 3].mMode = ASMIM_IMPLIED;
mIns[apos + 3].mMode = ASMIM_IMPLIED; mIns[apos + 6].mType = ASMIT_NOP; mIns[apos + 6].mMode = ASMIM_IMPLIED;
mIns[apos + 6].mType = ASMIT_NOP;
mIns[apos + 6].mMode = ASMIM_IMPLIED;
} }
if (mIns[i + 1].mLive & LIVE_CPU_REG_Y) if (mIns[i + 1].mLive & LIVE_CPU_REG_Y)
{ {
@ -10591,7 +10604,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
{ {
if (mIns[i].mType == ASMIT_LDA && mIns[i + 2].mType == ASMIT_LDA && (mIns[i + 1].mType == ASMIT_CLC || mIns[i + 1].mType == ASMIT_SEC)) if (mIns[i].mType == ASMIT_LDA && mIns[i + 2].mType == ASMIT_LDA && (mIns[i + 1].mType == ASMIT_CLC || mIns[i + 1].mType == ASMIT_SEC))
{ {
mIns[i].mType = ASMIT_NOP; mIns[i].mType = ASMIT_NOP; mIns[i].mMode = ASMIM_IMPLIED;
progress = true; progress = true;
} }
else if (mIns[i + 0].mType == ASMIT_STA && mIns[i + 0].mMode == ASMIM_ZERO_PAGE && else if (mIns[i + 0].mType == ASMIT_STA && mIns[i + 0].mMode == ASMIM_ZERO_PAGE &&
@ -10613,8 +10626,8 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
(mIns[i + 2].mLive & LIVE_MEM) == 0) (mIns[i + 2].mLive & LIVE_MEM) == 0)
{ {
mIns[i + 1].mType = mIns[i + 2].mType; mIns[i + 1].mType = mIns[i + 2].mType;
mIns[i + 0].mType = ASMIT_NOP; mIns[i + 0].mType = ASMIT_NOP; mIns[i + 0].mMode = ASMIM_IMPLIED;
mIns[i + 2].mType = ASMIT_NOP; mIns[i + 2].mType = ASMIT_NOP; mIns[i + 2].mMode = ASMIM_IMPLIED;
progress = true; progress = true;
} }
else if ( else if (
@ -10622,7 +10635,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
mIns[i + 1].mType == ASMIT_STA && mIns[i + 2].mType == ASMIT_LDA && mIns[i + 1].mType == ASMIT_STA && mIns[i + 2].mType == ASMIT_LDA &&
mIns[i + 1].SameEffectiveAddress(mIns[i + 2])) mIns[i + 1].SameEffectiveAddress(mIns[i + 2]))
{ {
mIns[i + 2].mType = ASMIT_NOP; mIns[i + 2].mType = ASMIT_NOP; mIns[i + 2].mMode = ASMIM_IMPLIED;
progress = true; progress = true;
} }
else if ( else if (
@ -10640,7 +10653,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
!mIns[i + 1].ChangesAccu() && !mIns[i + 1].RequiresAccu() && !(mIns[i + 1].mLive & LIVE_CPU_REG_Y)) !mIns[i + 1].ChangesAccu() && !mIns[i + 1].RequiresAccu() && !(mIns[i + 1].mLive & LIVE_CPU_REG_Y))
{ {
mIns[i + 0].mType = ASMIT_LDY; mIns[i + 0].mType = ASMIT_LDY;
mIns[i + 2].mType = ASMIT_NOP; mIns[i + 2].mType = ASMIT_NOP; mIns[i + 2].mMode = ASMIM_IMPLIED;
progress = true; progress = true;
} }
else if ( else if (
@ -10727,7 +10740,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
mIns[i + 1].mMode == ASMIM_ZERO_PAGE && mIns[i + 1].mAddress == mIns[i + 1].mAddress && mIns[i + 1].mMode == ASMIM_ZERO_PAGE && mIns[i + 1].mAddress == mIns[i + 1].mAddress &&
(mIns[i + 1].mType == ASMIT_DEC || mIns[i + 1].mType == ASMIT_INC)) (mIns[i + 1].mType == ASMIT_DEC || mIns[i + 1].mType == ASMIT_INC))
{ {
mIns[i + 2].mType = ASMIT_NOP; mIns[i + 2].mType = ASMIT_NOP; mIns[i + 2].mMode = ASMIM_IMPLIED;
mIns[i + 1].mLive |= LIVE_CPU_REG_Z; mIns[i + 1].mLive |= LIVE_CPU_REG_Z;
progress = true; progress = true;
} }
@ -10737,7 +10750,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
!mIns[i + 1].ChangesXReg() && !mIns[i + 1].ChangesXReg() &&
mIns[i + 2].mType == ASMIT_TXA && !(mIns[i + 2].mLive & LIVE_CPU_REG_Z)) mIns[i + 2].mType == ASMIT_TXA && !(mIns[i + 2].mLive & LIVE_CPU_REG_Z))
{ {
mIns[i + 2].mType = ASMIT_NOP; mIns[i + 2].mType = ASMIT_NOP; mIns[i + 2].mMode = ASMIM_IMPLIED;
progress = true; progress = true;
} }
else if ( else if (
@ -10746,7 +10759,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
mIns[i + 2].mType == ASMIT_SBC && mIns[i + 2].mAddress == 1 && !(mIns[i + 2].mLive & (LIVE_CPU_REG_C | LIVE_CPU_REG_X))) mIns[i + 2].mType == ASMIT_SBC && mIns[i + 2].mAddress == 1 && !(mIns[i + 2].mLive & (LIVE_CPU_REG_C | LIVE_CPU_REG_X)))
{ {
mIns[i + 0].mType = ASMIT_DEX; mIns[i + 0].mType = ASMIT_DEX;
mIns[i + 2].mType = ASMIT_NOP; mIns[i + 2].mType = ASMIT_NOP; mIns[i + 2].mMode = ASMIM_IMPLIED;
progress = true; progress = true;
} }
else if ( else if (
@ -10755,7 +10768,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
mIns[i + 2].mType == ASMIT_SBC && mIns[i + 2].mAddress == 1 && !(mIns[i + 2].mLive & (LIVE_CPU_REG_C | LIVE_CPU_REG_Y))) mIns[i + 2].mType == ASMIT_SBC && mIns[i + 2].mAddress == 1 && !(mIns[i + 2].mLive & (LIVE_CPU_REG_C | LIVE_CPU_REG_Y)))
{ {
mIns[i + 0].mType = ASMIT_DEY; mIns[i + 0].mType = ASMIT_DEY;
mIns[i + 2].mType = ASMIT_NOP; mIns[i + 2].mType = ASMIT_NOP; mIns[i + 2].mMode = ASMIM_IMPLIED;
progress = true; progress = true;
} }
else if ( else if (
@ -10814,10 +10827,14 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
int t = mIns[i + 2].mAddress; int t = mIns[i + 2].mAddress;
mIns[i + 0].mType = ASMIT_INY; mIns[i + 0].mType = ASMIT_INY;
if (t > 1) if (t > 1)
{
mIns[i + 1].mType = ASMIT_INY; mIns[i + 1].mType = ASMIT_INY;
mIns[i + 1].mLive |= LIVE_CPU_REG_Y;
}
else else
mIns[i + 1].mType = ASMIT_NOP; {
mIns[i + 1].mLive |= LIVE_CPU_REG_Y; mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED;
}
mIns[i + 2].mType = ASMIT_TYA; mIns[i + 2].mMode = ASMIM_IMPLIED; mIns[i + 2].mType = ASMIT_TYA; mIns[i + 2].mMode = ASMIM_IMPLIED;
progress = true; progress = true;
} }
@ -10838,7 +10855,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
!mIns[i + 1].ChangesAddress() && !mIns[i + 1].ChangesGlobalMemory() && !mIns[i + 1].ChangesAddress() && !mIns[i + 1].ChangesGlobalMemory() &&
!mIns[i + 1].ChangesYReg() && !mIns[i + 1].ChangesXReg()) !mIns[i + 1].ChangesYReg() && !mIns[i + 1].ChangesXReg())
{ {
mIns[i + 0].mType = ASMIT_NOP; mIns[i + 0].mType = ASMIT_NOP; mIns[i + 0].mMode = ASMIM_IMPLIED;
mIns[i + 0].mMode = ASMIM_IMPLIED; mIns[i + 0].mMode = ASMIM_IMPLIED;
progress = true; progress = true;
} }
@ -10925,10 +10942,8 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
if (breg == mIns[i + 2].mAddress) if (breg == mIns[i + 2].mAddress)
{ {
mIns[apos + 3].mType = ASMIT_NOP; mIns[apos + 3].mType = ASMIT_NOP; mIns[apos + 3].mMode = ASMIM_IMPLIED;
mIns[apos + 3].mMode = ASMIM_IMPLIED; mIns[apos + 6].mType = ASMIT_NOP; mIns[apos + 6].mMode = ASMIM_IMPLIED;
mIns[apos + 6].mType = ASMIT_NOP;
mIns[apos + 6].mMode = ASMIM_IMPLIED;
} }
if (mIns[i + 2].mLive & LIVE_CPU_REG_Y) if (mIns[i + 2].mLive & LIVE_CPU_REG_Y)
{ {
@ -10971,9 +10986,9 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
(mIns[i + 0].mMode == ASMIM_ABSOLUTE || mIns[i + 0].mMode == ASMIM_ZERO_PAGE) && (mIns[i + 0].mMode == ASMIM_ABSOLUTE || mIns[i + 0].mMode == ASMIM_ZERO_PAGE) &&
(mIns[i + 3].mLive & (LIVE_CPU_REG_C | LIVE_CPU_REG_A)) == 0) (mIns[i + 3].mLive & (LIVE_CPU_REG_C | LIVE_CPU_REG_A)) == 0)
{ {
mIns[i + 0].mType = ASMIT_NOP; mIns[i + 0].mType = ASMIT_NOP; mIns[i + 0].mMode = ASMIM_IMPLIED;
mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED;
mIns[i + 2].mType = ASMIT_NOP; mIns[i + 2].mType = ASMIT_NOP; mIns[i + 2].mMode = ASMIM_IMPLIED;
mIns[i + 3].mType = ASMIT_INC; mIns[i + 3].mType = ASMIT_INC;
progress = true; progress = true;
} }
@ -10982,9 +10997,9 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
(mIns[i + 0].mMode == ASMIM_ABSOLUTE || mIns[i + 0].mMode == ASMIM_ZERO_PAGE) && (mIns[i + 0].mMode == ASMIM_ABSOLUTE || mIns[i + 0].mMode == ASMIM_ZERO_PAGE) &&
(mIns[i + 3].mLive & (LIVE_CPU_REG_C | LIVE_CPU_REG_A)) == 0) (mIns[i + 3].mLive & (LIVE_CPU_REG_C | LIVE_CPU_REG_A)) == 0)
{ {
mIns[i + 0].mType = ASMIT_NOP; mIns[i + 0].mType = ASMIT_NOP; mIns[i + 0].mMode = ASMIM_IMPLIED;
mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED;
mIns[i + 2].mType = ASMIT_NOP; mIns[i + 2].mType = ASMIT_NOP; mIns[i + 2].mMode = ASMIM_IMPLIED;
mIns[i + 3].mType = ASMIT_DEC; mIns[i + 3].mType = ASMIT_DEC;
progress = true; progress = true;
} }
@ -10994,8 +11009,8 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
(mIns[i + 3].mLive & LIVE_CPU_REG_C) == 0) (mIns[i + 3].mLive & LIVE_CPU_REG_C) == 0)
{ {
mIns[i + 0].mType = ASMIT_DEC; mIns[i + 0].mType = ASMIT_DEC;
mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED;
mIns[i + 2].mType = ASMIT_NOP; mIns[i + 2].mType = ASMIT_NOP; mIns[i + 2].mMode = ASMIM_IMPLIED;
mIns[i + 3].mType = ASMIT_LDA; mIns[i + 3].mType = ASMIT_LDA;
progress = true; progress = true;
} }
@ -11004,9 +11019,9 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
(mIns[i + 1].mMode == ASMIM_ABSOLUTE || mIns[i + 1].mMode == ASMIM_ZERO_PAGE) && (mIns[i + 1].mMode == ASMIM_ABSOLUTE || mIns[i + 1].mMode == ASMIM_ZERO_PAGE) &&
(mIns[i + 3].mLive & (LIVE_CPU_REG_C | LIVE_CPU_REG_A)) == 0) (mIns[i + 3].mLive & (LIVE_CPU_REG_C | LIVE_CPU_REG_A)) == 0)
{ {
mIns[i + 0].mType = ASMIT_NOP; mIns[i + 0].mType = ASMIT_NOP; mIns[i + 0].mMode = ASMIM_IMPLIED;
mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED;
mIns[i + 2].mType = ASMIT_NOP; mIns[i + 2].mType = ASMIT_NOP; mIns[i + 2].mMode = ASMIM_IMPLIED;
mIns[i + 3].mType = ASMIT_INC; mIns[i + 3].mType = ASMIT_INC;
progress = true; progress = true;
} }
@ -11015,9 +11030,9 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
(mIns[i + 1].mMode == ASMIM_ABSOLUTE || mIns[i + 1].mMode == ASMIM_ZERO_PAGE) && (mIns[i + 1].mMode == ASMIM_ABSOLUTE || mIns[i + 1].mMode == ASMIM_ZERO_PAGE) &&
(mIns[i + 3].mLive & (LIVE_CPU_REG_C | LIVE_CPU_REG_A)) == 0) (mIns[i + 3].mLive & (LIVE_CPU_REG_C | LIVE_CPU_REG_A)) == 0)
{ {
mIns[i + 0].mType = ASMIT_NOP; mIns[i + 0].mType = ASMIT_NOP; mIns[i + 0].mMode = ASMIM_IMPLIED;
mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED;
mIns[i + 2].mType = ASMIT_NOP; mIns[i + 2].mType = ASMIT_NOP; mIns[i + 2].mMode = ASMIM_IMPLIED;
mIns[i + 3].mType = ASMIT_DEC; mIns[i + 3].mType = ASMIT_DEC;
progress = true; progress = true;
} }
@ -11026,9 +11041,9 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
(mIns[i + 0].mMode == ASMIM_ABSOLUTE || mIns[i + 0].mMode == ASMIM_ZERO_PAGE) && (mIns[i + 0].mMode == ASMIM_ABSOLUTE || mIns[i + 0].mMode == ASMIM_ZERO_PAGE) &&
(mIns[i + 3].mLive & (LIVE_CPU_REG_C | LIVE_CPU_REG_A)) == 0) (mIns[i + 3].mLive & (LIVE_CPU_REG_C | LIVE_CPU_REG_A)) == 0)
{ {
mIns[i + 0].mType = ASMIT_NOP; mIns[i + 0].mType = ASMIT_NOP; mIns[i + 0].mMode = ASMIM_IMPLIED;
mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED;
mIns[i + 2].mType = ASMIT_NOP; mIns[i + 2].mType = ASMIT_NOP; mIns[i + 2].mMode = ASMIM_IMPLIED;
mIns[i + 3].mType = ASMIT_DEC; mIns[i + 3].mType = ASMIT_DEC;
progress = true; progress = true;
} }
@ -11052,8 +11067,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
{ {
mIns.Insert(i + 1, NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, mIns[i + 3].mAddress)); mIns.Insert(i + 1, NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, mIns[i + 3].mAddress));
mIns[i + 4].mType = ASMIT_NOP; mIns[i + 4].mType = ASMIT_NOP; mIns[i + 4].mMode = ASMIM_IMPLIED;
mIns[i + 4].mMode = ASMIM_IMPLIED;
progress = true; progress = true;
} }
@ -11065,8 +11079,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
mIns[i + 3].mType == ASMIT_EOR && mIns[i + 3].mMode == ASMIM_ZERO_PAGE && mIns[i + 3].mAddress == mIns[i + 0].mAddress) mIns[i + 3].mType == ASMIT_EOR && mIns[i + 3].mMode == ASMIM_ZERO_PAGE && mIns[i + 3].mAddress == mIns[i + 0].mAddress)
{ {
mIns[i + 2].mType = mIns[i + 3].mType; mIns[i + 2].mType = mIns[i + 3].mType;
mIns[i + 3].mType = ASMIT_NOP; mIns[i + 3].mType = ASMIT_NOP; mIns[i + 3].mMode = ASMIM_IMPLIED;
mIns[i + 3].mMode = ASMIM_IMPLIED;
progress = true; progress = true;
} }
@ -11085,8 +11098,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
mIns[i + 3].mType = ASMIT_ADC; mIns[i + 3].mType = ASMIT_ADC;
mIns[i + 3].mAddress = mIns[i + 1].mAddress; mIns[i + 3].mAddress = mIns[i + 1].mAddress;
mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED;
mIns[i + 1].mMode = ASMIM_IMPLIED;
progress = true; progress = true;
} }
@ -11105,8 +11117,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
mIns[i + 3].mType = ASMIT_ADC; mIns[i + 3].mType = ASMIT_ADC;
mIns[i + 3].mAddress = mIns[i + 2].mAddress; mIns[i + 3].mAddress = mIns[i + 2].mAddress;
mIns[i + 2].mType = ASMIT_NOP; mIns[i + 2].mType = ASMIT_NOP; mIns[i + 2].mMode = ASMIM_IMPLIED;
mIns[i + 2].mMode = ASMIM_IMPLIED;
progress = true; progress = true;
} }
@ -11119,8 +11130,8 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
mIns[i + 2].mType == ASMIT_ORA && mIns[i + 2].mMode == ASMIM_IMMEDIATE && mIns[i + 2].mAddress == 1 && !(mIns[i + 3].mLive & LIVE_CPU_REG_A)) mIns[i + 2].mType == ASMIT_ORA && mIns[i + 2].mMode == ASMIM_IMMEDIATE && mIns[i + 2].mAddress == 1 && !(mIns[i + 3].mLive & LIVE_CPU_REG_A))
{ {
mIns[i + 0].mType = ASMIT_NOP; mIns[i + 0].mType = ASMIT_NOP; mIns[i + 0].mMode = ASMIM_IMPLIED;
mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED;
mIns[i + 2].mType = ASMIT_SEC; mIns[i + 2].mType = ASMIT_SEC;
mIns[i + 2].mMode = ASMIM_IMPLIED; mIns[i + 2].mMode = ASMIM_IMPLIED;
mIns[i + 2].mLive |= LIVE_CPU_REG_C; mIns[i + 2].mLive |= LIVE_CPU_REG_C;
@ -11135,7 +11146,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
(mIns[i + 2].mType == ASMIT_ASL || mIns[i + 2].mType == ASMIT_LSR || mIns[i + 2].mType == ASMIT_ROL || mIns[i + 2].mType == ASMIT_ROR) && (mIns[i + 2].mType == ASMIT_ASL || mIns[i + 2].mType == ASMIT_LSR || mIns[i + 2].mType == ASMIT_ROL || mIns[i + 2].mType == ASMIT_ROR) &&
(mIns[i + 3].mType == ASMIT_ORA || mIns[i + 3].mType == ASMIT_AND || mIns[i + 3].mType == ASMIT_EOR || mIns[i + 3].mType == ASMIT_ADC || mIns[i + 3].mType == ASMIT_SBC)) (mIns[i + 3].mType == ASMIT_ORA || mIns[i + 3].mType == ASMIT_AND || mIns[i + 3].mType == ASMIT_EOR || mIns[i + 3].mType == ASMIT_ADC || mIns[i + 3].mType == ASMIT_SBC))
{ {
mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED;
mIns[i + 3].mMode = mIns[i + 0].mMode; mIns[i + 3].mMode = mIns[i + 0].mMode;
mIns[i + 3].mAddress= mIns[i + 0].mAddress; mIns[i + 3].mAddress= mIns[i + 0].mAddress;
mIns[i + 3].mLinkerObject = mIns[i + 0].mLinkerObject; mIns[i + 3].mLinkerObject = mIns[i + 0].mLinkerObject;
@ -11149,10 +11160,10 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
mIns[i + 2].mType == ASMIT_EOR && mIns[i + 2].mMode == ASMIM_IMMEDIATE && mIns[i + 2].mAddress == 0xff && mIns[i + 2].mType == ASMIT_EOR && mIns[i + 2].mMode == ASMIM_IMMEDIATE && mIns[i + 2].mAddress == 0xff &&
mIns[i + 3].mType == ASMIT_LSR && mIns[i + 3].mMode == ASMIM_IMPLIED && !(mIns[i + 3].mLive & (LIVE_CPU_REG_A | LIVE_CPU_REG_Z))) mIns[i + 3].mType == ASMIT_LSR && mIns[i + 3].mMode == ASMIM_IMPLIED && !(mIns[i + 3].mLive & (LIVE_CPU_REG_A | LIVE_CPU_REG_Z)))
{ {
mIns[i + 0].mType = ASMIT_NOP; mIns[i + 0].mType = ASMIT_NOP; mIns[i + 0].mMode = ASMIM_IMPLIED;
mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED;
mIns[i + 2].mType = ASMIT_NOP; mIns[i + 2].mType = ASMIT_NOP; mIns[i + 2].mMode = ASMIM_IMPLIED;
mIns[i + 3].mType = ASMIT_NOP; mIns[i + 3].mType = ASMIT_NOP; mIns[i + 3].mMode = ASMIM_IMPLIED;
progress = true; progress = true;
} }
#endif #endif
@ -11169,10 +11180,8 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
{ {
if (breg == mIns[i + 1].mAddress) if (breg == mIns[i + 1].mAddress)
{ {
mIns[apos + 3].mType = ASMIT_NOP; mIns[apos + 3].mType = ASMIT_NOP; mIns[apos + 3].mMode = ASMIM_IMPLIED;
mIns[apos + 3].mMode = ASMIM_IMPLIED; mIns[apos + 6].mType = ASMIT_NOP; mIns[apos + 6].mMode = ASMIM_IMPLIED;
mIns[apos + 6].mType = ASMIT_NOP;
mIns[apos + 6].mMode = ASMIM_IMPLIED;
} }
if (mIns[i + 3].mLive & LIVE_CPU_REG_Y) if (mIns[i + 3].mLive & LIVE_CPU_REG_Y)
{ {
@ -11219,10 +11228,8 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
{ {
if (breg == mIns[i + 1].mAddress) if (breg == mIns[i + 1].mAddress)
{ {
mIns[apos + 3].mType = ASMIT_NOP; mIns[apos + 3].mType = ASMIT_NOP; mIns[apos + 3].mMode = ASMIM_IMPLIED;
mIns[apos + 3].mMode = ASMIM_IMPLIED; mIns[apos + 6].mType = ASMIT_NOP; mIns[apos + 6].mMode = ASMIM_IMPLIED;
mIns[apos + 6].mType = ASMIT_NOP;
mIns[apos + 6].mMode = ASMIM_IMPLIED;
} }
if (mIns[i + 4].mLive & LIVE_CPU_REG_Y) if (mIns[i + 4].mLive & LIVE_CPU_REG_Y)
{ {
@ -11287,8 +11294,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
{ {
for(int j=0; j<6; j++) for(int j=0; j<6; j++)
{ {
mIns[i + j].mType = ASMIT_NOP; mIns[i + j].mType = ASMIT_NOP; mIns[i + j].mMode = ASMIM_IMPLIED;
mIns[i + j].mMode = ASMIM_IMPLIED;
} }
if (mIns[i + 9].mLive & LIVE_CPU_REG_Y) if (mIns[i + 9].mLive & LIVE_CPU_REG_Y)
@ -11320,6 +11326,8 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass)
if (this->mFalseJump && this->mFalseJump->PeepHoleOptimizer(pass)) if (this->mFalseJump && this->mFalseJump->PeepHoleOptimizer(pass))
changed = true; changed = true;
assert(mIns.Size() == 0 || mIns[0].mType != ASMIT_INV);
return changed; return changed;
} }
@ -11763,6 +11771,8 @@ NativeCodeProcedure::~NativeCodeProcedure(void)
void NativeCodeProcedure::CompressTemporaries(void) void NativeCodeProcedure::CompressTemporaries(void)
{ {
return;
if (mInterProc->mTempSize > 16) if (mInterProc->mTempSize > 16)
{ {
ResetVisited(); ResetVisited();
@ -12131,6 +12141,7 @@ void NativeCodeProcedure::Optimize(void)
{ {
#if 1 #if 1
int step = 0; int step = 0;
int cnt = 0;
bool changed, xmapped = false, ymapped = false; bool changed, xmapped = false, ymapped = false;
do do
@ -12161,10 +12172,12 @@ void NativeCodeProcedure::Optimize(void)
} while (changed); } while (changed);
#endif #endif
#if 1
ResetVisited(); ResetVisited();
if (mEntryBlock->PeepHoleOptimizer(step)) if (mEntryBlock->PeepHoleOptimizer(step))
changed = true; changed = true;
#endif
#if 1
ResetVisited(); ResetVisited();
if (mEntryBlock->OptimizeSimpleLoop(this)) if (mEntryBlock->OptimizeSimpleLoop(this))
changed = true; changed = true;
@ -12190,12 +12203,12 @@ void NativeCodeProcedure::Optimize(void)
if (mEntryBlock->JoinTailCodeSequences()) if (mEntryBlock->JoinTailCodeSequences())
changed = true; changed = true;
} }
if (step == 3) if (step == 3)
{ {
ResetVisited(); ResetVisited();
changed = mEntryBlock->OptimizeInnerLoops(this); changed = mEntryBlock->OptimizeInnerLoops(this);
} }
#if 1
else if (step == 4) else if (step == 4)
{ {
#if 1 #if 1
@ -12269,6 +12282,7 @@ void NativeCodeProcedure::Optimize(void)
} }
#endif #endif
} }
#endif
#if 1 #if 1
ResetVisited(); ResetVisited();
NativeRegisterDataSet data; NativeRegisterDataSet data;
@ -12277,12 +12291,14 @@ void NativeCodeProcedure::Optimize(void)
ResetVisited(); ResetVisited();
if (mEntryBlock->ApplyEntryDataSet()) if (mEntryBlock->ApplyEntryDataSet())
changed = true; changed = true;
#endif
#endif #endif
if (!changed && step < 5) if (!changed && step < 5)
{ {
step++; step++;
changed = true; changed = true;
} }
cnt++;
} while (changed); } while (changed);
#if 1 #if 1
@ -12353,8 +12369,12 @@ void NativeCodeProcedure::ResetVisited(void)
for (i = 0; i < mBlocks.Size(); i++) for (i = 0; i < mBlocks.Size(); i++)
{ {
// assert(mBlocks[i]->mIns.Size() > 0 || (mBlocks[i]->mTrueJump != mBlocks[i] && mBlocks[i]->mFalseJump != mBlocks[i]));
mBlocks[i]->mVisited = false; mBlocks[i]->mVisited = false;
mBlocks[i]->mNumEntered = 0; mBlocks[i]->mNumEntered = 0;
mBlocks[i]->mLoopHeadBlock = nullptr;
} }
} }