diff --git a/oscar64/NativeCodeGenerator.cpp b/oscar64/NativeCodeGenerator.cpp index 4335266..d463532 100644 --- a/oscar64/NativeCodeGenerator.cpp +++ b/oscar64/NativeCodeGenerator.cpp @@ -1123,9 +1123,9 @@ bool NativeCodeInstruction::CanSwapXYReg(void) if (mMode == ASMIM_INDIRECT_X || mMode == ASMIM_INDIRECT_Y || mMode == ASMIM_ZERO_PAGE_X || mMode == ASMIM_ZERO_PAGE_Y) return false; else if (mMode == ASMIM_ABSOLUTE_X) - return HasAsmInstructionMode(mType, ASMIM_ABSOLUTE_Y); + return mType == ASMIT_LDY || HasAsmInstructionMode(mType, ASMIM_ABSOLUTE_Y); else if (mMode == ASMIM_ABSOLUTE_Y) - return HasAsmInstructionMode(mType, ASMIM_ABSOLUTE_X); + return mType == ASMIT_LDX || HasAsmInstructionMode(mType, ASMIM_ABSOLUTE_X); else if (mType == ASMIT_JSR && (mFlags & (NCIF_USE_CPU_REG_X | NCIF_USE_CPU_REG_Y))) return false; else @@ -34857,7 +34857,7 @@ bool NativeCodeBasicBlock::IndexXYValueForwarding(int xreg, int xoffset, int xva xoffset = 0; } else if (i + 1 < mIns.Size() && mIns[i].mAddress == yreg && yoffset == 0 && - mIns[i + 1].mType == ASMIT_LDY && mIns[i + 1].mMode == ASMIM_ABSOLUTE_X && !(mIns[i].mLive & LIVE_CPU_REG_A)) + mIns[i + 1].mType == ASMIT_LDY && mIns[i + 1].mMode == ASMIM_ABSOLUTE_X && !(mIns[i].mLive & (LIVE_CPU_REG_A | LIVE_CPU_REG_X))) { mIns[i] = NativeCodeInstruction(mIns[i + 1].mIns, ASMIT_LDA, mIns[i + 1]); mIns[i].mMode = ASMIM_ABSOLUTE_Y; @@ -38585,6 +38585,33 @@ bool NativeCodeBasicBlock::OptimizeXYSimpleLoop(void) } } } + else if (sz > 5 && + mIns[0].mType == ASMIT_STY && mIns[0].mMode == ASMIM_ZERO_PAGE && + mIns[sz - 3].mType == ASMIT_LDY && mIns[sz - 3].mMode == ASMIM_ZERO_PAGE && mIns[0].mAddress == mIns[sz - 3].mAddress && + !ChangesZeroPage(mIns[0].mAddress, 1, sz - 3) && !(mIns[sz - 3].mLive & LIVE_CPU_REG_X)) + { + int j = 0; + while (j < sz - 3 && !(mIns[j].ChangesYReg() || mIns[j].mType == ASMIT_LDX && mIns[j].mMode == ASMIM_ZERO_PAGE && mIns[j].mAddress == mIns[0].mAddress)) + j++; + if (mIns[j].mType == ASMIT_LDX && !ChangesXReg(j + 1, sz - 3)) + { + int k = j + 1; + while (k < sz - 3 && mIns[k].CanSwapXYReg()) + k++; + if (k == sz - 3) + { + for (k = j + 1; k < sz - 3; k++) + mIns[k].SwapXYReg(); + + for (k = 0; k < sz; k++) + mIns[k].mLive |= LIVE_CPU_REG_Y; + + mIns[j].mType = ASMIT_NOP; mIns[j].mMode = ASMIM_IMPLIED; + mIns[sz - 3].mType = ASMIT_NOP; mIns[sz - 3].mMode = ASMIM_IMPLIED; + changed = true; + } + } + } } #endif } @@ -51174,7 +51201,7 @@ void NativeCodeProcedure::Compile(InterCodeProcedure* proc) mInterProc = proc; mInterProc->mLinkerObject->mNativeProc = this; - CheckFunc = !strcmp(mInterProc->mIdent->mString, "main"); + CheckFunc = !strcmp(mInterProc->mIdent->mString, "_showFrame1"); int nblocks = proc->mBlocks.Size(); tblocks = new NativeCodeBasicBlock * [nblocks]; @@ -52958,6 +52985,7 @@ void NativeCodeProcedure::Optimize(void) mEntryBlock->CheckAsmCode(); #endif + #if 1 if (cnt > 190) {