From 80abcdfe9530096919bebb206e532191ebec9ec2 Mon Sep 17 00:00:00 2001 From: drmortalwombat <90205530+drmortalwombat@users.noreply.github.com> Date: Sun, 30 Mar 2025 20:22:50 +0200 Subject: [PATCH] Optimize local struct variable usage --- oscar64/NativeCodeGenerator.cpp | 240 +++++++++++++++++++++----------- oscar64/NativeCodeGenerator.h | 4 + 2 files changed, 162 insertions(+), 82 deletions(-) diff --git a/oscar64/NativeCodeGenerator.cpp b/oscar64/NativeCodeGenerator.cpp index 768000d..249f01d 100644 --- a/oscar64/NativeCodeGenerator.cpp +++ b/oscar64/NativeCodeGenerator.cpp @@ -29785,6 +29785,73 @@ bool NativeCodeBasicBlock::PatchCrossBlockY2XFloodExit(const NativeCodeBasicBloc return false; } +bool NativeCodeBasicBlock::CheckNonAliasedLocalStore(int at, const NativeCodeInstruction& sins) +{ + if (mPatched) + return true; + + if (!at) + mPatched = true; + + while (at < mIns.Size()) + { + NativeCodeInstruction& ins(mIns[at]); + + if (ins.mMode == ASMIM_ABSOLUTE && ins.mAddress == sins.mAddress && ins.mLinkerObject == sins.mLinkerObject) + { + if (ins.UsesAddress()) + return false; + if (ins.ChangesAddress()) + break; + } + else if ((ins.mMode == ASMIM_ABSOLUTE_X || ins.mMode == ASMIM_ABSOLUTE_Y) && ins.mLinkerObject == sins.mLinkerObject) + return false; + + at++; + } + + if (mTrueJump && !mTrueJump->CheckNonAliasedLocalStore(0, sins)) + return false; + if (mFalseJump && !mFalseJump->CheckNonAliasedLocalStore(0, sins)) + return false; + + return true; +} + +bool NativeCodeBasicBlock::EliminateNonAliasedLocalStores(void) +{ + bool changed = false; + + if (!mVisited) + { + mVisited = true; + + for (int i = 0; i < mIns.Size(); i++) + { + NativeCodeInstruction& ins(mIns[i]); + + if ((ins.mType == ASMIT_STA || ins.mType == ASMIT_STX || ins.mType == ASMIT_STY) && ins.mMode == ASMIM_ABSOLUTE && ins.mLinkerObject && (ins.mLinkerObject->mFlags & LOBJF_LOCAL_VAR) && ins.mLinkerObject->mVariable && !ins.mLinkerObject->mVariable->mAliased) + { + mProc->ResetPatched(); + if (CheckNonAliasedLocalStore(i + 1, ins)) + { + ins.mType = ASMIT_NOP; + ins.mMode = ASMIM_IMPLIED; + changed = true; + } + } + } + + if (mTrueJump && mTrueJump->EliminateNonAliasedLocalStores()) + changed = true; + if (mFalseJump && mFalseJump->EliminateNonAliasedLocalStores()) + changed = true; + + } + + return changed; +} + void NativeCodeBasicBlock::PropagateAddGlobalCarry(void) { if (!mVisited) @@ -47561,7 +47628,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) mIns[i + 3].mType = ASMIT_LDA; mIns[i + 3].mLive |= LIVE_CPU_REG_A | LIVE_CPU_REG_Z; return true; } - else if (mIns[i + 0].mType == ASMIT_LDA && mIns[i + 3].mType == ASMIT_STA && mIns[i + 0].SameEffectiveAddress(mIns[i + 3]) && + if (mIns[i + 0].mType == ASMIT_LDA && mIns[i + 3].mType == ASMIT_STA && mIns[i + 0].SameEffectiveAddress(mIns[i + 3]) && mIns[i + 1].mType == ASMIT_SEC && mIns[i + 2].mType == ASMIT_SBC && mIns[i + 2].mMode == ASMIM_IMMEDIATE && mIns[i + 2].mAddress == 1 && HasAsmInstructionMode(ASMIT_DEC, mIns[i + 0].mMode) && (mIns[i + 3].mLive & LIVE_CPU_REG_C) == 0) @@ -47572,7 +47639,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) mIns[i + 3].mType = ASMIT_LDA; mIns[i + 3].mLive |= LIVE_CPU_REG_A | LIVE_CPU_REG_Z; return true; } - else if (mIns[i + 1].mType == ASMIT_LDA && mIns[i + 3].mType == ASMIT_STA && mIns[i + 1].SameEffectiveAddress(mIns[i + 3]) && + if (mIns[i + 1].mType == ASMIT_LDA && mIns[i + 3].mType == ASMIT_STA && mIns[i + 1].SameEffectiveAddress(mIns[i + 3]) && mIns[i + 0].mType == ASMIT_CLC && mIns[i + 2].mType == ASMIT_ADC && mIns[i + 2].mMode == ASMIM_IMMEDIATE && mIns[i + 2].mAddress == 1 && HasAsmInstructionMode(ASMIT_INC, mIns[i + 1].mMode) && (mIns[i + 3].mLive & LIVE_CPU_REG_C) == 0) @@ -47583,7 +47650,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) mIns[i + 3].mType = ASMIT_LDA; mIns[i + 3].mLive |= LIVE_CPU_REG_A | LIVE_CPU_REG_Z; return true; } - else if (mIns[i + 1].mType == ASMIT_LDA && mIns[i + 3].mType == ASMIT_STA && mIns[i + 1].SameEffectiveAddress(mIns[i + 3]) && + if (mIns[i + 1].mType == ASMIT_LDA && mIns[i + 3].mType == ASMIT_STA && mIns[i + 1].SameEffectiveAddress(mIns[i + 3]) && mIns[i + 0].mType == ASMIT_SEC && mIns[i + 2].mType == ASMIT_SBC && mIns[i + 2].mMode == ASMIM_IMMEDIATE && mIns[i + 2].mAddress == 1 && HasAsmInstructionMode(ASMIT_DEC, mIns[i + 1].mMode) && (mIns[i + 3].mLive & LIVE_CPU_REG_C) == 0) @@ -47594,7 +47661,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) mIns[i + 3].mType = ASMIT_LDA; mIns[i + 3].mLive |= LIVE_CPU_REG_A | LIVE_CPU_REG_Z; return true; } - else if (mIns[i + 0].mType == ASMIT_LDA && mIns[i + 3].mType == ASMIT_STA && mIns[i + 0].SameEffectiveAddress(mIns[i + 3]) && + if (mIns[i + 0].mType == ASMIT_LDA && mIns[i + 3].mType == ASMIT_STA && mIns[i + 0].SameEffectiveAddress(mIns[i + 3]) && mIns[i + 1].mType == ASMIT_CLC && mIns[i + 2].mType == ASMIT_ADC && mIns[i + 2].mMode == ASMIM_IMMEDIATE && (mIns[i + 2].mAddress & 0xff) == 0xff && HasAsmInstructionMode(ASMIT_DEC, mIns[i + 0].mMode) && (mIns[i + 3].mLive & LIVE_CPU_REG_C) == 0) @@ -47605,7 +47672,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) mIns[i + 3].mType = ASMIT_LDA; mIns[i + 3].mLive |= LIVE_CPU_REG_A | LIVE_CPU_REG_Z; return true; } - else if (mIns[i + 0].mType == ASMIT_LDA && mIns[i + 3].mType == ASMIT_STA && mIns[i + 0].SameEffectiveAddress(mIns[i + 3]) && + if (mIns[i + 0].mType == ASMIT_LDA && mIns[i + 3].mType == ASMIT_STA && mIns[i + 0].SameEffectiveAddress(mIns[i + 3]) && mIns[i + 1].mType == ASMIT_SEC && mIns[i + 2].mType == ASMIT_SBC && mIns[i + 2].mMode == ASMIM_IMMEDIATE && (mIns[i + 2].mAddress & 0xff) == 0xff && HasAsmInstructionMode(ASMIT_INC, mIns[i + 0].mMode) && (mIns[i + 3].mLive & LIVE_CPU_REG_C) == 0) @@ -47616,7 +47683,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) mIns[i + 3].mType = ASMIT_LDA; mIns[i + 3].mLive |= LIVE_CPU_REG_A | LIVE_CPU_REG_Z; return true; } - else if (mIns[i + 1].mType == ASMIT_LDA && mIns[i + 3].mType == ASMIT_STA && mIns[i + 1].SameEffectiveAddress(mIns[i + 3]) && + if (mIns[i + 1].mType == ASMIT_LDA && mIns[i + 3].mType == ASMIT_STA && mIns[i + 1].SameEffectiveAddress(mIns[i + 3]) && mIns[i + 0].mType == ASMIT_CLC && mIns[i + 2].mType == ASMIT_ADC && mIns[i + 2].mMode == ASMIM_IMMEDIATE && (mIns[i + 2].mAddress & 0xff) == 0xff && HasAsmInstructionMode(ASMIT_DEC, mIns[i + 1].mMode) && (mIns[i + 3].mLive & LIVE_CPU_REG_C) == 0) @@ -47627,7 +47694,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) mIns[i + 3].mType = ASMIT_LDA; mIns[i + 3].mLive |= LIVE_CPU_REG_A | LIVE_CPU_REG_Z; return true; } - else if (mIns[i + 1].mType == ASMIT_LDA && mIns[i + 3].mType == ASMIT_STA && mIns[i + 1].SameEffectiveAddress(mIns[i + 3]) && + if (mIns[i + 1].mType == ASMIT_LDA && mIns[i + 3].mType == ASMIT_STA && mIns[i + 1].SameEffectiveAddress(mIns[i + 3]) && mIns[i + 0].mType == ASMIT_SEC && mIns[i + 2].mType == ASMIT_SBC && mIns[i + 2].mMode == ASMIM_IMMEDIATE && (mIns[i + 2].mAddress & 0xff) == 0xff && HasAsmInstructionMode(ASMIT_INC, mIns[i + 1].mMode) && (mIns[i + 3].mLive & LIVE_CPU_REG_C) == 0) @@ -47638,7 +47705,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) mIns[i + 3].mType = ASMIT_LDA; mIns[i + 3].mLive |= LIVE_CPU_REG_A | LIVE_CPU_REG_Z; return true; } - else if ( + if ( mIns[i + 0].mType == ASMIT_LDA && mIns[i + 0].mMode == ASMIM_IMMEDIATE && mIns[i + 0].mAddress == 0 && mIns[i + 1].mType == ASMIT_ROL && mIns[i + 1].mMode == ASMIM_IMPLIED && mIns[i + 2].mType == ASMIT_CLC && @@ -47648,7 +47715,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) mIns[i + 2].mType = ASMIT_NOP; return true; } - else if ( + if ( mIns[i + 0].mType == ASMIT_LDA && mIns[i + 1].mType == ASMIT_STA && mIns[i + 1].mMode == ASMIM_ZERO_PAGE && mIns[i + 2].mType == ASMIT_LDA && mIns[i + 2].mMode == ASMIM_ZERO_PAGE && mIns[i + 2].mAddress != mIns[i + 1].mAddress && @@ -47667,9 +47734,11 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) mIns[i + 1].mLive |= LIVE_CPU_REG_X; mIns[i + 2].mLive |= LIVE_CPU_REG_X; } + mIns[i + 0].mType = ASMIT_NOP; mIns[i + 0].mMode = ASMIM_IMPLIED; + mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED; return true; } - else if ( + if ( mIns[i + 0].mType == ASMIT_LDA && mIns[i + 1].IsShift() && mIns[i + 1].mMode == ASMIM_IMPLIED && mIns[i + 2].mType == mIns[i + 1].mType && mIns[i + 2].SameEffectiveAddress(mIns[i + 0]) && @@ -47679,7 +47748,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) mIns[i + 1].mLive |= LIVE_CPU_REG_C; return true; } - else if ( + if ( mIns[i + 0].mType == ASMIT_STA && mIns[i + 0].mMode == ASMIM_ZERO_PAGE && mIns[i + 2].mType == ASMIT_LDX && mIns[i + 2].mMode == ASMIM_ZERO_PAGE && mIns[i + 2].mAddress == mIns[i + 0].mAddress && mIns[i + 3].mType == ASMIT_STX && mIns[i + 3].mMode == ASMIM_ZERO_PAGE && @@ -47695,7 +47764,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) return true; } - else if ( + if ( mIns[i + 0].mType == ASMIT_STA && mIns[i + 1].mType == ASMIT_LDA && HasAsmInstructionMode(ASMIT_LDX, mIns[i + 1].mMode) && mIns[i + 2].mType == ASMIT_STA && HasAsmInstructionMode(ASMIT_STX, mIns[i + 2].mMode) && @@ -47708,7 +47777,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) return true; } - else if ( + if ( mIns[i + 0].mType == ASMIT_STA && mIns[i + 1].mType == ASMIT_LDA && HasAsmInstructionMode(ASMIT_LDY, mIns[i + 1].mMode) && mIns[i + 2].mType == ASMIT_STA && HasAsmInstructionMode(ASMIT_STY, mIns[i + 2].mMode) && @@ -47721,7 +47790,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) return true; } - else if ( + if ( mIns[i + 0].mType == ASMIT_STA && mIns[i + 0].mMode == ASMIM_ZERO_PAGE && mIns[i + 1].mType == ASMIT_LDY && mIns[i + 1].mMode == ASMIM_IMMEDIATE && mIns[i + 2].mType == ASMIT_LDA && mIns[i + 2].mMode == ASMIM_INDIRECT_Y && @@ -47732,7 +47801,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) return true; } - else if ( + if ( mIns[i + 0].mType == ASMIT_LDA && mIns[i + 1].mType == ASMIT_STA && mIns[i + 1].mMode == ASMIM_ZERO_PAGE && !mIns[i + 0].MayBeChangedOnAddress(mIns[i + 1]) && mIns[i + 2].mType == ASMIT_LDA && mIns[i + 2].mMode == ASMIM_ZERO_PAGE && @@ -47744,7 +47813,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) return true; } - else if ( + if ( mIns[i + 0].mType == ASMIT_LDA && mIns[i + 1].mType == ASMIT_EOR && mIns[i + 1].mMode == ASMIM_IMMEDIATE && mIns[i + 1].mAddress == 0xff && (mIns[i + 2].mType == ASMIT_SEC || mIns[i + 2].mType == ASMIT_CLC) && @@ -47770,7 +47839,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) return true; } - else if ( + if ( mIns[i + 0].mType == ASMIT_STA && mIns[i + 0].mMode == ASMIM_ZERO_PAGE && mIns[i + 1].mType == ASMIT_LDA && mIns[i + 1].mMode == ASMIM_ZERO_PAGE && mIns[i + 0].mAddress != mIns[i + 1].mAddress && mIns[i + 2].mType == ASMIT_SEC && @@ -47788,7 +47857,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) return true; } - else if ( + if ( mIns[i + 0].mType == ASMIT_STA && mIns[i + 0].mMode == ASMIM_ZERO_PAGE && mIns[i + 1].mType == ASMIT_SEC && mIns[i + 2].mType == ASMIT_LDA && mIns[i + 2].mMode == ASMIM_ZERO_PAGE && mIns[i + 0].mAddress != mIns[i + 2].mAddress && @@ -47807,7 +47876,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) return true; } - else if ( + if ( mIns[i + 0].mType == ASMIT_STA && mIns[i + 0].mMode == ASMIM_ZERO_PAGE && mIns[i + 1].mType == ASMIT_LDA && (mIns[i + 1].mMode == ASMIM_ZERO_PAGE && mIns[i + 0].mAddress != mIns[i + 2].mAddress || mIns[i + 1].mMode == ASMIM_ABSOLUTE) && mIns[i + 2].mType == ASMIT_CLC && @@ -47822,7 +47891,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) return true; } - else if ( + if ( mIns[i + 0].mType == ASMIT_LDA && mIns[i + 0].mMode == ASMIM_IMMEDIATE && mIns[i + 1].mType == ASMIT_ADC && mIns[i + 2].mType == ASMIT_CLC && @@ -47836,7 +47905,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) return true; } - else if ( + if ( mIns[i + 0].mType == ASMIT_LDA && mIns[i + 0].mMode == ASMIM_IMMEDIATE && mIns[i + 0].mAddress == 0x00 && mIns[i + 1].mType == ASMIT_ADC && mIns[i + 1].mMode == ASMIM_IMMEDIATE && mIns[i + 1].mAddress == 0xff && mIns[i + 2].mType == ASMIT_AND && mIns[i + 2].mMode == ASMIM_IMMEDIATE && mIns[i + 2].mAddress == 0x01 && @@ -47849,7 +47918,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) return true; } - else if ( + if ( mIns[i + 0].mType == ASMIT_LDA && mIns[i + 3].mType == ASMIT_STA && mIns[i + 0].SameEffectiveAddress(mIns[i + 3]) && (mIns[i + 0].mMode == ASMIM_ABSOLUTE || mIns[i + 0].mMode == ASMIM_ZERO_PAGE) && @@ -47865,7 +47934,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) mIns[i + 3].mType = ASMIT_ROL; return true; } - else if ( + if ( mIns[i + 0].mType == ASMIT_LDA && mIns[i + 1].mType == ASMIT_STA && mIns[i + 1].mMode == ASMIM_ZERO_PAGE && mIns[i + 3].mMode == ASMIM_ZERO_PAGE && mIns[i + 1].mAddress == mIns[i + 3].mAddress && @@ -47896,7 +47965,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) } return true; } - else if ( + if ( mIns[i + 0].mType == ASMIT_LDA && mIns[i + 0].mMode == ASMIM_IMMEDIATE && mIns[i + 0].mAddress == 0 && mIns[i + 1].mType == ASMIT_ADC && mIns[i + 1].mMode == ASMIM_IMMEDIATE && mIns[i + 1].mAddress == 0xff && mIns[i + 2].mType == ASMIT_EOR && mIns[i + 2].mMode == ASMIM_IMMEDIATE && mIns[i + 2].mAddress == 0xff && @@ -47908,7 +47977,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) mIns[i + 3].mType = ASMIT_NOP; mIns[i + 3].mMode = ASMIM_IMPLIED; return true; } - else if ( + if ( mIns[i + 0].mType == ASMIT_CLC && mIns[i + 1].mType == ASMIT_LDA && HasAsmInstructionMode(ASMIT_LDY, mIns[i + 1].mMode) && mIns[i + 2].mType == ASMIT_ADC && mIns[i + 2].mMode == ASMIM_IMMEDIATE && mIns[i + 2].mAddress <= 2 && @@ -47924,7 +47993,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) mIns[i + 3].mMode = ASMIM_IMPLIED; return true; } - else if ( + if ( mIns[i + 0].mType == ASMIT_CLC && mIns[i + 1].mType == ASMIT_LDA && HasAsmInstructionMode(ASMIT_LDY, mIns[i + 1].mMode) && mIns[i + 2].mType == ASMIT_ADC && mIns[i + 2].mMode == ASMIM_IMMEDIATE && mIns[i + 2].mAddress >= 0xfe && @@ -47940,7 +48009,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) mIns[i + 3].mMode = ASMIM_IMPLIED; return true; } - else if ( + if ( mIns[i + 0].mType == ASMIT_SEC && mIns[i + 1].mType == ASMIT_LDA && HasAsmInstructionMode(ASMIT_LDY, mIns[i + 1].mMode) && mIns[i + 2].mType == ASMIT_SBC && mIns[i + 2].mMode == ASMIM_IMMEDIATE && mIns[i + 2].mAddress <= 2 && @@ -47956,7 +48025,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) mIns[i + 3].mMode = ASMIM_IMPLIED; return true; } - else if ( + if ( mIns[i + 0].mType == ASMIT_CLC && mIns[i + 1].mType == ASMIT_LDA && HasAsmInstructionMode(ASMIT_LDX, mIns[i + 1].mMode) && mIns[i + 2].mType == ASMIT_ADC && mIns[i + 2].mMode == ASMIM_IMMEDIATE && mIns[i + 2].mAddress <= 2 && @@ -47972,7 +48041,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) mIns[i + 3].mMode = ASMIM_IMPLIED; return true; } - else if ( + if ( mIns[i + 0].mType == ASMIT_CLC && mIns[i + 1].mType == ASMIT_LDA && HasAsmInstructionMode(ASMIT_LDX, mIns[i + 1].mMode) && mIns[i + 2].mType == ASMIT_ADC && mIns[i + 2].mMode == ASMIM_IMMEDIATE && mIns[i + 2].mAddress >= 0xfe && @@ -47988,7 +48057,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) mIns[i + 3].mMode = ASMIM_IMPLIED; return true; } - else if ( + if ( mIns[i + 0].mType == ASMIT_SEC && mIns[i + 1].mType == ASMIT_LDA && HasAsmInstructionMode(ASMIT_LDX, mIns[i + 1].mMode) && mIns[i + 2].mType == ASMIT_SBC && mIns[i + 2].mMode == ASMIM_IMMEDIATE && mIns[i + 2].mAddress <= 2 && @@ -48004,7 +48073,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) mIns[i + 3].mMode = ASMIM_IMPLIED; return true; } - else if ( + if ( mIns[i + 0].mType == ASMIT_TXA && mIns[i + 1].mType == ASMIT_CLC && mIns[i + 2].mType == ASMIT_ADC && mIns[i + 2].mMode == ASMIM_IMMEDIATE && mIns[i + 2].mAddress <= 2 && @@ -48023,7 +48092,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) mIns[i + 3].mType = ASMIT_NOP; return true; } - else if ( + if ( mIns[i + 0].mType == ASMIT_TXA && mIns[i + 1].mType == ASMIT_CLC && mIns[i + 2].mType == ASMIT_ADC && mIns[i + 2].mMode == ASMIM_IMMEDIATE && mIns[i + 2].mAddress >= 0xfe && @@ -48042,7 +48111,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) mIns[i + 3].mType = ASMIT_NOP; return true; } - else if ( + if ( mIns[i + 0].mType == ASMIT_TXA && mIns[i + 1].mType == ASMIT_SEC && mIns[i + 2].mType == ASMIT_SBC && mIns[i + 2].mMode == ASMIM_IMMEDIATE && mIns[i + 2].mAddress <= 3 && @@ -48066,7 +48135,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) return true; } - else if ( + if ( mIns[i + 0].mType == ASMIT_TYA && mIns[i + 1].mType == ASMIT_CLC && mIns[i + 2].mType == ASMIT_ADC && mIns[i + 2].mMode == ASMIM_IMMEDIATE && mIns[i + 2].mAddress <= 2 && @@ -48082,7 +48151,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) mIns[i + 3].mMode = ASMIM_IMPLIED; return true; } - else if ( + if ( mIns[i + 0].mType == ASMIT_TYA && mIns[i + 1].mType == ASMIT_CLC && mIns[i + 2].mType == ASMIT_ADC && mIns[i + 2].mMode == ASMIM_IMMEDIATE && mIns[i + 2].mAddress >= 0xfe && @@ -48101,7 +48170,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) mIns[i + 3].mType = ASMIT_NOP; return true; } - else if ( + if ( mIns[i + 0].mType == ASMIT_TYA && mIns[i + 1].mType == ASMIT_SEC && mIns[i + 2].mType == ASMIT_SBC && mIns[i + 2].mMode == ASMIM_IMMEDIATE && mIns[i + 2].mAddress <= 2 && @@ -48117,7 +48186,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) mIns[i + 3].mMode = ASMIM_IMPLIED; return true; } - else if ( + if ( mIns[i + 0].mType == ASMIT_TXA && mIns[i + 1].mType == ASMIT_CLC && mIns[i + 2].mType == ASMIT_ADC && mIns[i + 2].mMode == ASMIM_IMMEDIATE && mIns[i + 2].mAddress <= 2 && @@ -48134,7 +48203,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) mIns[i + 3].mType = ASMIT_STX; return true; } - else if ( + if ( mIns[i + 0].mType == ASMIT_TXA && mIns[i + 1].mType == ASMIT_SEC && mIns[i + 2].mType == ASMIT_SBC && mIns[i + 2].mMode == ASMIM_IMMEDIATE && mIns[i + 2].mAddress <= 2 && @@ -48151,7 +48220,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) mIns[i + 3].mType = ASMIT_STX; return true; } - else if ( + if ( mIns[i + 0].mType == ASMIT_TYA && mIns[i + 1].mType == ASMIT_CLC && mIns[i + 2].mType == ASMIT_ADC && mIns[i + 2].mMode == ASMIM_IMMEDIATE && mIns[i + 2].mAddress <= 2 && @@ -48170,7 +48239,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) mIns[i + 3].mType = ASMIT_STY; return true; } - else if ( + if ( mIns[i + 0].mType == ASMIT_TYA && mIns[i + 1].mType == ASMIT_SEC && mIns[i + 2].mType == ASMIT_SBC && mIns[i + 2].mMode == ASMIM_IMMEDIATE && mIns[i + 2].mAddress <= 2 && @@ -48187,7 +48256,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) mIns[i + 3].mType = ASMIT_STY; return true; } - else if ( + if ( mIns[i + 0].mType == ASMIT_TYA && mIns[i + 1].mType == ASMIT_CLC && mIns[i + 2].mType == ASMIT_ADC && mIns[i + 2].mMode == ASMIM_IMMEDIATE && mIns[i + 2].mAddress == 0xff && @@ -48200,7 +48269,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) mIns[i + 3].mType = ASMIT_STY; return true; } - else if ( + if ( mIns[i + 0].mType == ASMIT_TXA && mIns[i + 1].mType == ASMIT_CLC && mIns[i + 2].mType == ASMIT_ADC && mIns[i + 2].mMode == ASMIM_IMMEDIATE && mIns[i + 2].mAddress == 0xff && @@ -48213,7 +48282,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) mIns[i + 3].mType = ASMIT_STX; return true; } - else if ( + if ( mIns[i + 0].mType == ASMIT_TAX && mIns[i + 1].mType == ASMIT_LDA && HasAsmInstructionMode(ASMIT_LDX, mIns[i + 1].mMode) && mIns[i + 2].mType == ASMIT_STA && HasAsmInstructionMode(ASMIT_STX, mIns[i + 2].mMode) && @@ -48225,7 +48294,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) mIns[i + 3].mType = ASMIT_NOP; mIns[i + 3].mMode = ASMIM_IMPLIED; return true; } - else if ( + if ( mIns[i + 0].mType == ASMIT_TAY && mIns[i + 1].mType == ASMIT_LDA && HasAsmInstructionMode(ASMIT_LDY, mIns[i + 1].mMode) && mIns[i + 2].mType == ASMIT_STA && HasAsmInstructionMode(ASMIT_STY, mIns[i + 2].mMode) && @@ -48237,7 +48306,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) mIns[i + 3].mType = ASMIT_NOP; mIns[i + 3].mMode = ASMIM_IMPLIED; return true; } - else if ( + if ( mIns[i + 0].mType == ASMIT_LDA && HasAsmInstructionMode(ASMIT_LDX, mIns[i + 0].mMode) && mIns[i + 1].mType == ASMIT_LDX && HasAsmInstructionMode(ASMIT_LDA, mIns[i + 1].mMode) && mIns[i + 2].mType == ASMIT_STA && HasAsmInstructionMode(ASMIT_STX, mIns[i + 2].mMode) && @@ -48249,7 +48318,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) mIns[i + 3].mType = ASMIT_NOP; mIns[i + 3].mMode = ASMIM_IMPLIED; return true; } - else if ( + if ( mIns[i + 0].mType == ASMIT_LDA && mIns[i + 0].mMode == ASMIM_ZERO_PAGE && mIns[i + 1].IsShift() && mIns[i + 1].mMode == ASMIM_IMPLIED && mIns[i + 2].mType == ASMIT_STA && mIns[i + 2].mMode == ASMIM_ZERO_PAGE && mIns[i + 2].mAddress == mIns[i + 0].mAddress && @@ -48263,7 +48332,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) mIns[i + 3].mType = ASMIT_NOP; mIns[i + 3].mMode = ASMIM_IMPLIED; return true; } - else if ( + if ( mIns[i + 0].mType == ASMIT_LDX && mIns[i + 1].mType == ASMIT_INX && mIns[i + 2].mType == ASMIT_INX && mIns[i + 3].mType == ASMIT_STX && mIns[i + 3].SameEffectiveAddress(mIns[i + 0]) && !(mIns[i + 3].mLive & LIVE_CPU_REG_X)) @@ -48275,7 +48344,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) return true; } - else if ( + if ( mIns[i + 0].mType == ASMIT_LDX && mIns[i + 1].mType == ASMIT_DEX && mIns[i + 2].mType == ASMIT_DEX && mIns[i + 3].mType == ASMIT_STX && mIns[i + 3].SameEffectiveAddress(mIns[i + 0]) && !(mIns[i + 3].mLive & LIVE_CPU_REG_X)) @@ -48287,7 +48356,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) return true; } - else if (pass > 10 && + if (pass > 10 && mIns[i + 0].mType == ASMIT_LDA && HasAsmInstructionMode(ASMIT_INC, mIns[i + 0].mMode) && mIns[i + 1].mType == ASMIT_CLC && mIns[i + 2].mType == ASMIT_ADC && mIns[i + 2].mMode == ASMIM_IMMEDIATE && mIns[i + 2].mAddress == 2 && @@ -48300,7 +48369,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) return true; } - else if (pass > 10 && + if (pass > 10 && mIns[i + 0].mType == ASMIT_LDA && HasAsmInstructionMode(ASMIT_DEC, mIns[i + 0].mMode) && mIns[i + 1].mType == ASMIT_SEC && mIns[i + 2].mType == ASMIT_SBC && mIns[i + 2].mMode == ASMIM_IMMEDIATE && mIns[i + 2].mAddress == 2 && @@ -48313,7 +48382,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) return true; } - else if ( + if ( mIns[i + 0].mType == ASMIT_LDY && mIns[i + 0].mMode == ASMIM_ZERO_PAGE && !(mIns[i + 1].ChangesYReg() || mIns[i + 1].mMode == ASMIM_INDIRECT_Y || mIns[i + 1].RequiresXReg()) && mIns[i + 2].mType == ASMIT_TYA && @@ -48326,7 +48395,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) mIns[i + 3].mType = ASMIT_NOP; mIns[i + 3].mMode = ASMIM_IMPLIED; return true; } - else if ( + if ( mIns[i + 0].IsShift() && mIns[i + 0].mMode == ASMIM_ZERO_PAGE && mIns[i + 1].mType == ASMIT_CLC && mIns[i + 2].mType == ASMIT_LDA && (mIns[i + 2].mMode == ASMIM_IMMEDIATE || mIns[i + 2].mMode == ASMIM_IMMEDIATE_ADDRESS || mIns[i + 2].mMode == ASMIM_ZERO_PAGE && mIns[i + 2].mAddress != mIns[i + 0].mAddress) && @@ -48344,7 +48413,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) mIns[i + 2].mLive |= LIVE_CPU_REG_A; return true; } - else if ( + if ( mIns[i + 0].mType == ASMIT_STA && mIns[i + 0].mMode == ASMIM_ZERO_PAGE && mIns[i + 1].mType == ASMIT_SEC && mIns[i + 2].mType == ASMIT_LDA && !mIns[i + 2].SameEffectiveAddress(mIns[i + 0]) && @@ -48359,7 +48428,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) mIns[i + 3].mType = ASMIT_NOP; mIns[i + 3].mMode = ASMIM_IMPLIED; return true; } - else if ( + if ( mIns[i + 0].mType == ASMIT_CLC && mIns[i + 1].mType == ASMIT_ADC && mIns[i + 1].mMode == ASMIM_IMMEDIATE && mIns[i + 1].mAddress < 4 && mIns[i + 2].mType == ASMIT_TAX && @@ -48370,7 +48439,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) mIns[i + 3].mAddress += mIns[i + 1].mAddress; return true; } - else if ( + if ( mIns[i + 0].mType == ASMIT_CLC && mIns[i + 1].mType == ASMIT_ADC && mIns[i + 2].mType == ASMIT_CLC && @@ -48381,7 +48450,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) mIns[i + 3].mType = ASMIT_NOP; mIns[i + 3].mMode = ASMIM_IMPLIED; return true; } - else if ( + if ( mIns[i + 0].mType == ASMIT_SEC && mIns[i + 1].mType == ASMIT_SBC && mIns[i + 2].mType == ASMIT_SEC && @@ -48392,7 +48461,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) mIns[i + 3].mType = ASMIT_NOP; mIns[i + 3].mMode = ASMIM_IMPLIED; return true; } - else if ( + if ( mIns[i + 0].mType == ASMIT_SEC && mIns[i + 1].mType == ASMIT_SBC && mIns[i + 1].mMode == ASMIM_IMMEDIATE && mIns[i + 2].mType == ASMIT_CLC && @@ -48404,7 +48473,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) mIns[i + 3].mAddress = (mIns[i + 3].mAddress - mIns[i + 1].mAddress) & 0xff; return true; } - else if ( + if ( mIns[i + 0].mType == ASMIT_CLC && mIns[i + 1].mType == ASMIT_LDA && mIns[i + 1].mMode == ASMIM_ZERO_PAGE && mIns[i + 2].mType == ASMIT_ADC && mIns[i + 2].mMode == ASMIM_IMMEDIATE && @@ -48421,7 +48490,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) mIns[i + 3].mType = ASMIT_NOP; mIns[i + 3].mMode = ASMIM_IMPLIED; return true; } - else if ( + if ( mIns[i + 0].mType == ASMIT_LSR && mIns[i + 0].mMode == ASMIM_IMPLIED && mIns[i + 1].mType == ASMIT_EOR && mIns[i + 1].mMode == ASMIM_IMMEDIATE && mIns[i + 1].mAddress == 0x40 && mIns[i + 2].mType == ASMIT_SEC && @@ -48438,7 +48507,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) return true; } - else if ( + if ( mIns[i + 0].mType == ASMIT_LDA && mIns[i + 0].mMode == ASMIM_IMMEDIATE && mIns[i + 0].mAddress == 0 && mIns[i + 1].mType == ASMIT_SBC && mIns[i + 1].mMode == ASMIM_IMMEDIATE && mIns[i + 1].mAddress == 0 && mIns[i + 2].mType == ASMIT_CLC && @@ -48449,7 +48518,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) mIns[i + 2].mType = ASMIT_NOP; mIns[i + 2].mMode = ASMIM_IMPLIED; return true; } - else if ( + if ( mIns[i + 0].mType == ASMIT_LDX && mIns[i + 0].mMode == ASMIM_ABSOLUTE_Y && mIns[i + 1].mType == ASMIT_LDY && mIns[i + 1].mMode == ASMIM_ZERO_PAGE && mIns[i + 2].mType == ASMIT_STA && mIns[i + 2].mMode == ASMIM_ABSOLUTE_Y && mIns[i + 0].mLinkerObject != mIns[i + 2].mLinkerObject && @@ -48467,7 +48536,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) return true; } - else if ( + if ( mIns[i + 0].mType == ASMIT_LDA && mIns[i + 0].mMode == ASMIM_ZERO_PAGE && mIns[i + 1].mType == ASMIT_STA && mIns[i + 1].mMode == ASMIM_ZERO_PAGE && mIns[i + 2].mType == ASMIT_LDA && mIns[i + 2].mMode == ASMIM_ZERO_PAGE && mIns[i + 2].mAddress != mIns[i + 1].mAddress && @@ -48485,7 +48554,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) return true; } - else if ( + 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]) && @@ -48497,7 +48566,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) return true; } - else if ( + if ( mIns[i + 0].mType == ASMIT_LDA && mIns[i + 1].mType == ASMIT_ASL && mIns[i + 1].mMode == ASMIM_ZERO_PAGE && mIns[i + 2].mType == ASMIT_ROL && mIns[i + 2].mMode == ASMIM_IMPLIED && HasAsmInstructionMode(ASMIT_ROL, mIns[i + 0].mMode) && @@ -48511,7 +48580,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) return true; } - else if ( + if ( mIns[i + 0].mType == ASMIT_STA && !(mIns[i + 0].mLive & LIVE_CPU_REG_A) && !mIns[i + 1].ReferencesAccu() && !mIns[i + 0].MayBeSameAddress(mIns[i + 1]) && !mIns[i + 2].ReferencesAccu() && !mIns[i + 0].MayBeSameAddress(mIns[i + 2]) && @@ -48525,7 +48594,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) return true; } - else if ( + if ( mIns[i + 0].IsShift() && (mIns[i + 0].mMode == ASMIM_ZERO_PAGE || mIns[i + 0].mMode == ASMIM_ABSOLUTE) && mIns[i + 3].mType == ASMIT_LDA && mIns[i + 3].SameEffectiveAddress(mIns[i + 0]) && !(mIns[i + 3].mLive & LIVE_MEM) && !mIns[i + 1].ChangesCarry() && !mIns[i + 2].ChangesCarry() && @@ -48540,7 +48609,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) mIns[i + 0].mType = ASMIT_NOP; mIns[i + 0].mMode = ASMIM_IMPLIED; return true; } - else if ( + if ( mIns[i + 0].mType == ASMIT_STX && mIns[i + 0].mMode == ASMIM_ZERO_PAGE && mIns[i + 1].mType == ASMIT_LDX && mIns[i + 1].mMode == ASMIM_ZERO_PAGE && mIns[i + 2].mType == ASMIT_LDA && mIns[i + 2].mMode == ASMIM_ABSOLUTE_X && @@ -48558,7 +48627,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) return true; } - else if ( + if ( mIns[i + 0].mType == ASMIT_STY && mIns[i + 0].mMode == ASMIM_ZERO_PAGE && mIns[i + 1].mType == ASMIT_LDY && mIns[i + 1].mMode == ASMIM_ZERO_PAGE && mIns[i + 2].mType == ASMIT_LDA && mIns[i + 2].mMode == ASMIM_ABSOLUTE_Y && @@ -48576,7 +48645,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) return true; } - else if ( + if ( mIns[i + 0].mType == ASMIT_STY && mIns[i + 1].mType == ASMIT_CLC && mIns[i + 2].mType == ASMIT_LDA && @@ -48590,7 +48659,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) return true; } - else if ( + if ( mIns[i + 0].mType == ASMIT_STX && mIns[i + 1].mType == ASMIT_CLC && mIns[i + 2].mType == ASMIT_LDA && @@ -48604,7 +48673,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) return true; } - else if ( + if ( mIns[i + 0].mType == ASMIT_EOR && mIns[i + 0].mMode == ASMIM_IMMEDIATE && mIns[i + 0].mAddress == 0xff && mIns[i + 1].mType == ASMIT_CLC && mIns[i + 2].mType == ASMIT_ADC && @@ -48618,7 +48687,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) return true; } - else if ( + if ( mIns[i + 0].mType == ASMIT_LDX && mIns[i + 1].mType == ASMIT_DEX && mIns[i + 2].mType == ASMIT_STX && mIns[i + 2].SameEffectiveAddress(mIns[i + 0]) && HasAsmInstructionMode(ASMIT_DEC, mIns[i + 0].mMode) && @@ -48631,7 +48700,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) return true; } - else if ( + if ( mIns[i + 0].mType == ASMIT_LDA && mIns[i + 0].mMode == ASMIM_IMMEDIATE && mIns[i + 1].mType == ASMIT_STA && mIns[i + 2].mType == ASMIT_LDA && @@ -48643,7 +48712,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) return true; } - else if ( + if ( mIns[i + 0].mType == ASMIT_STA && mIns[i + 0].mMode == ASMIM_ZERO_PAGE && !(mIns[i + 0].mLive & LIVE_CPU_REG_A) && !mIns[i + 1].ReferencesZeroPage(mIns[i + 0].mAddress) && !mIns[i + 1].ChangesCarry() && !mIns[i + 2].ReferencesZeroPage(mIns[i + 0].mAddress) && !mIns[i + 2].ChangesCarry() && @@ -48660,7 +48729,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) return true; } - else if ( + if ( mIns[i + 0].ChangesAccuAndFlag() && mIns[i + 1].mType == ASMIT_STA && mIns[i + 2].MayBeMovedBefore(mIns[i + 1]) && mIns[i + 2].MayBeMovedBefore(mIns[i + 0]) && @@ -48675,7 +48744,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) mIns[i + 3].mType = ASMIT_NOP; mIns[i + 3].mMode = ASMIM_IMPLIED; return true; } - else if ( + if ( mIns[i + 0].ChangesAccuAndFlag() && (mIns[i + 1].mType == ASMIT_LDY && !mIns[i + 0].RequiresYReg() || mIns[i + 1].mType == ASMIT_LDX && !mIns[i + 0].RequiresXReg()) && @@ -48691,7 +48760,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate4(int i, int pass) mIns[i + 3].mType = ASMIT_NOP; mIns[i + 3].mMode = ASMIM_IMPLIED; return true; } - else if ( + if ( mIns[i + 0].mType == ASMIT_STX && mIns[i + 0].mMode == ASMIM_ZERO_PAGE && mIns[i + 1].mType == ASMIT_STA && mIns[i + 1].mMode == ASMIM_ZERO_PAGE && mIns[i + 1].mAddress != mIns[i + 0].mAddress && mIns[i + 2].mType == ASMIT_TXA && @@ -51552,7 +51621,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerExits(int pass) } else if (sz >= 2 && mIns[sz - 2].mType == ASMIT_LDA && mIns[sz - 2].mMode == ASMIM_IMMEDIATE && mIns[sz - 2].mAddress == 0 && - mIns[sz - 1].mType == ASMIT_ROL && mIns[sz - 1].mMode == ASMIM_IMPLIED && !(mIns[sz - 1].mLive & (LIVE_CPU_REG_A | LIVE_CPU_REG_C)) && !mExitRequiredRegs[CPU_REG_Z]) + (mIns[sz - 1].mType == ASMIT_ROL || mIns[sz - 1].mType == ASMIT_ROR) && mIns[sz - 1].mMode == ASMIM_IMPLIED && !(mIns[sz - 1].mLive & (LIVE_CPU_REG_A | LIVE_CPU_REG_C)) && !mExitRequiredRegs[CPU_REG_Z]) { if (mBranch == ASMIT_BNE) { @@ -51571,7 +51640,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerExits(int pass) } else if (sz >= 2 && mIns[sz - 2].mType == ASMIT_LDA && mIns[sz - 2].mMode == ASMIM_IMMEDIATE && mIns[sz - 2].mAddress == 0 && - mIns[sz - 1].mType == ASMIT_ROL && mIns[sz - 1].mMode == ASMIM_IMPLIED && !(mIns[sz - 1].mLive & LIVE_CPU_REG_C) && !mExitRequiredRegs[CPU_REG_Z] && + (mIns[sz - 1].mType == ASMIT_ROL || mIns[sz - 1].mType == ASMIT_ROR) && mIns[sz - 1].mMode == ASMIM_IMPLIED && !(mIns[sz - 1].mLive & LIVE_CPU_REG_C) && !mExitRequiredRegs[CPU_REG_Z] && mBranch == ASMIT_BNE && !mTrueJump->mEntryRequiredRegs[CPU_REG_A]) { mBranch = ASMIT_BCS; @@ -51581,7 +51650,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerExits(int pass) } else if (sz >= 2 && mIns[sz - 2].mType == ASMIT_LDA && mIns[sz - 2].mMode == ASMIM_IMMEDIATE && mIns[sz - 2].mAddress == 0 && - mIns[sz - 1].mType == ASMIT_ROL && mIns[sz - 1].mMode == ASMIM_IMPLIED && !(mIns[sz - 1].mLive & LIVE_CPU_REG_C) && !mExitRequiredRegs[CPU_REG_Z] && + (mIns[sz - 1].mType == ASMIT_ROL || mIns[sz - 1].mType == ASMIT_ROR) && mIns[sz - 1].mMode == ASMIM_IMPLIED && !(mIns[sz - 1].mLive & LIVE_CPU_REG_C) && !mExitRequiredRegs[CPU_REG_Z] && mBranch == ASMIT_BEQ && !mFalseJump->mEntryRequiredRegs[CPU_REG_A]) { mBranch = ASMIT_BCC; @@ -53338,7 +53407,7 @@ void NativeCodeProcedure::Compile(InterCodeProcedure* proc) mInterProc->mLinkerObject->mNativeProc = this; - CheckFunc = !strcmp(mIdent->mString, "equipment_scroll_down"); + CheckFunc = !strcmp(mIdent->mString, "vic_waitBelow"); int nblocks = proc->mBlocks.Size(); tblocks = new NativeCodeBasicBlock * [nblocks]; @@ -55180,6 +55249,13 @@ void NativeCodeProcedure::Optimize(void) changed = true; } + if (step == 21 && (mCompilerOptions & COPT_OPTIMIZE_BASIC)) + { + ResetVisited(); + if (mEntryBlock->EliminateNonAliasedLocalStores()) + changed = true; + } + #if _DEBUG ResetVisited(); mEntryBlock->CheckAsmCode(); @@ -55205,7 +55281,7 @@ void NativeCodeProcedure::Optimize(void) } #if 1 - if (!changed && step < 21) + if (!changed && step < 22) { ResetIndexFlipped(); diff --git a/oscar64/NativeCodeGenerator.h b/oscar64/NativeCodeGenerator.h index d34b889..569c553 100644 --- a/oscar64/NativeCodeGenerator.h +++ b/oscar64/NativeCodeGenerator.h @@ -840,6 +840,10 @@ public: void PropagateAddGlobalCarry(void); + bool EliminateNonAliasedLocalStores(void); + bool CheckNonAliasedLocalStore(int at, const NativeCodeInstruction& sins); + + void RegisterFunctionCalls(void); bool MergeFunctionCalls(void);