From 9f7d4c0ab09ce5d7e9a60b5b25fe47663fb480f3 Mon Sep 17 00:00:00 2001 From: drmortalwombat <90205530+drmortalwombat@users.noreply.github.com> Date: Sun, 16 Feb 2025 17:16:27 +0100 Subject: [PATCH] Improved index register use in short loops --- oscar64/NativeCodeGenerator.cpp | 41 ++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/oscar64/NativeCodeGenerator.cpp b/oscar64/NativeCodeGenerator.cpp index 1debec2..048b20d 100644 --- a/oscar64/NativeCodeGenerator.cpp +++ b/oscar64/NativeCodeGenerator.cpp @@ -36972,6 +36972,15 @@ bool NativeCodeBasicBlock::OptimizeSimpleLoopInvariant(NativeCodeProcedure* proc mTrueJump = lblock; mFalseJump = nullptr; + mNumEntries -= mEntryBlocks.RemoveAll(this); + + lblock->mEntryBlocks.Push(this); + lblock->mEntryBlocks.Push(lblock); + lblock->mNumEntries = 2; + + eblock->mEntryBlocks.Push(this); + eblock->mNumEntries = 1; + return lblock->OptimizeSimpleLoopInvariant(proc, this, eblock, full); } @@ -39190,6 +39199,36 @@ bool NativeCodeBasicBlock::OptimizeSimpleLoopInvariant(NativeCodeProcedure* proc } } + if (!changed && mIns.Size() >= 3) + { + int sz = mIns.Size(); + if (mIns[sz - 3].mType == ASMIT_INC && mIns[sz - 3].mMode == ASMIM_ZERO_PAGE && + mIns[sz - 2].mType == ASMIT_LDX && mIns[sz - 2].mMode == ASMIM_ZERO_PAGE && mIns[sz - 2].mAddress == mIns[sz - 3].mAddress && + mIns[sz - 1].mType == ASMIT_CPX) + { + int reg = mIns[sz - 3].mAddress; + int index; + NativeCodeBasicBlock* xblock = mEntryBlocks[0] == this ? mEntryBlocks[1] : mEntryBlocks[0]; + if (!ReferencesZeroPage(reg, 0, sz - 3) && !ChangesXReg(0, sz - 3) && xblock->IsExitXRegZP(reg, index, xblock)) + { + if (!prevBlock) + return OptimizeSimpleLoopInvariant(proc, full); + + exitBlock->mIns.Insert(0, NativeCodeInstruction(mBranchIns, ASMIT_STX, ASMIM_ZERO_PAGE, reg)); + mIns[sz - 3].mType = ASMIT_NOP; mIns[sz - 3].mMode = ASMIM_IMPLIED; + mIns[sz - 2].mType = ASMIT_INX; mIns[sz - 2].mMode = ASMIM_IMPLIED; + + for (int i = 0; i < mIns.Size(); i++) + mIns[i].mLive |= LIVE_CPU_REG_X; + mEntryRequiredRegs += CPU_REG_X; + mExitRequiredRegs += CPU_REG_X; + exitBlock->mEntryRequiredRegs += CPU_REG_X; + changed = true; + } + } + + } + return changed; } @@ -52932,7 +52971,7 @@ void NativeCodeProcedure::Compile(InterCodeProcedure* proc) mInterProc->mLinkerObject->mNativeProc = this; - CheckFunc = !strcmp(mIdent->mString, "equipment_cost"); + CheckFunc = !strcmp(mIdent->mString, "station_slider"); int nblocks = proc->mBlocks.Size(); tblocks = new NativeCodeBasicBlock * [nblocks];