From ad310f8484c05e7fb1b6da6d757b6a50cc4a9232 Mon Sep 17 00:00:00 2001 From: drmortalwombat <90205530+drmortalwombat@users.noreply.github.com> Date: Sun, 30 Jun 2024 21:28:35 +0200 Subject: [PATCH] Fix sign flag propagationa after immediate ora --- oscar64/NativeCodeGenerator.cpp | 71 ++++++++++++++++++++++++++++----- oscar64/NativeCodeGenerator.h | 1 + 2 files changed, 62 insertions(+), 10 deletions(-) diff --git a/oscar64/NativeCodeGenerator.cpp b/oscar64/NativeCodeGenerator.cpp index f77873f..d91955a 100644 --- a/oscar64/NativeCodeGenerator.cpp +++ b/oscar64/NativeCodeGenerator.cpp @@ -3444,7 +3444,7 @@ bool NativeCodeInstruction::ValueForwarding(NativeRegisterDataSet& data, AsmInsT else if (mMode == ASMIM_IMMEDIATE && mType == ASMIT_ORA && mAddress != 0x00) { data.mRegs[CPU_REG_Z].mMode = NRDM_IMMEDIATE; - data.mRegs[CPU_REG_Z].mValue = 1; + data.mRegs[CPU_REG_Z].mValue = mAddress; data.mRegs[CPU_REG_A].Reset(); } else if (mMode == ASMIM_IMMEDIATE && ((mAddress == 0 && (mType == ASMIT_ORA || mType == ASMIT_EOR)) || (mAddress == 0xff && mType == ASMIT_AND))) @@ -18830,6 +18830,46 @@ bool NativeCodeBasicBlock::SimpleInlineCalls(void) return changed; } +bool NativeCodeBasicBlock::Expand16BitLoopBranch(void) +{ + bool changed = false; + + if (!mVisited) + { + mVisited = true; + + if (mTrueJump && mFalseJump && mBranch == ASMIT_BNE && mTrueJump->mIns.Size() == 0 && mTrueJump->mBranch == ASMIT_BCC) + { + int sz = mIns.Size(); + if (sz >= 1 && mIns[sz - 1].mType == ASMIT_CMP) + { + if (mTrueJump->mTrueJump->mLoopHead && IsDominatedBy(mTrueJump->mTrueJump) || + mLoopHead && !mTrueJump->mTrueJump->mFalseJump && mTrueJump->mTrueJump->mTrueJump == this) + { + NativeCodeBasicBlock* tblock = mTrueJump->mTrueJump; + NativeCodeBasicBlock* nblock = mProc->AllocateBlock(); + nblock->Close(mIns[sz - 1].mIns, mFalseJump, mTrueJump->mFalseJump, ASMIT_BEQ); + mBranch = ASMIT_BCC; + mFalseJump->RemEntryBlock(this); + mFalseJump->AddEntryBlock(nblock); + mTrueJump->RemEntryBlock(this); + tblock->AddEntryBlock(this); + mFalseJump = nblock; + mTrueJump = tblock; + changed = true; + } + } + } + + if (mTrueJump && mTrueJump->Expand16BitLoopBranch()) + changed = true; + if (mFalseJump && mFalseJump->Expand16BitLoopBranch()) + changed = true; + } + + return changed; +} + bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc) { bool changed = false; @@ -35597,7 +35637,7 @@ bool NativeCodeBasicBlock::OptimizeSimpleLoopInvariant(NativeCodeProcedure* proc if (mIns[i + 0].mType == ASMIT_LDA && mIns[i + 0].mMode == ASMIM_ZERO_PAGE && mIns[i + 0].mAddress == mIns[1].mAddress && mIns[i + 1].mType == ASMIT_STA && mIns[i + 1].mMode == ASMIM_ZERO_PAGE && mIns[i + 1].mAddress == mIns[0].mAddress && !(mIns[1].mLive & (LIVE_CPU_REG_A | LIVE_CPU_REG_Z))) { - if ((!mEntryRequiredRegs[CPU_REG_A] || !mEntryRequiredRegs[CPU_REG_X]) && (!mExitRequiredRegs[CPU_REG_A] || !mExitRequiredRegs[CPU_REG_X])) + if ((!mEntryRequiredRegs[CPU_REG_A] || !mEntryRequiredRegs[CPU_REG_X]) && (!mExitRequiredRegs[CPU_REG_A] || !mExitRequiredRegs[CPU_REG_X]) && !mExitRequiredRegs[CPU_REG_Z]) { if (!prevBlock) return OptimizeSimpleLoopInvariant(proc, full); @@ -35848,7 +35888,7 @@ bool NativeCodeBasicBlock::OptimizeSimpleLoopInvariant(NativeCodeProcedure* proc } #if 1 - if (mEntryRequiredRegs.Size() && (!mEntryRequiredRegs[CPU_REG_A] || !mEntryRequiredRegs[CPU_REG_X]) && (!mExitRequiredRegs[CPU_REG_A] || !mExitRequiredRegs[CPU_REG_X])) + if (mEntryRequiredRegs.Size() && (!mEntryRequiredRegs[CPU_REG_A] || !mEntryRequiredRegs[CPU_REG_X]) && (!mExitRequiredRegs[CPU_REG_A] || !mExitRequiredRegs[CPU_REG_X]) && !mExitRequiredRegs[CPU_REG_Z]) { for (int i = 0; i + 1 < mIns.Size(); i++) { @@ -36796,7 +36836,7 @@ bool NativeCodeBasicBlock::OptimizeSimpleLoop(NativeCodeProcedure * proc, bool f bool changed = false; int sz = mIns.Size(); - + assert(mBranch != ASMIT_JMP || mFalseJump == nullptr); CheckLive(); @@ -43312,8 +43352,8 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate3(int i, int pass) mIns[i + 1].mType == ASMIT_STX && mIns[i + 2].mType == ASMIT_TXA && !(mIns[i + 2].mLive & LIVE_CPU_REG_X)) { - mIns[i + 0].mType = ASMIT_LDA; mIns[i + 0].mLive |= LIVE_CPU_REG_A; - mIns[i + 1].mType = ASMIT_STA; mIns[i + 1].mLive |= LIVE_CPU_REG_A; + mIns[i + 0].mType = ASMIT_LDA; mIns[i + 0].mLive |= LIVE_CPU_REG_A | (mIns[i + 2].mLive & LIVE_CPU_REG_Z); + mIns[i + 1].mType = ASMIT_STA; mIns[i + 1].mLive |= LIVE_CPU_REG_A | (mIns[i + 2].mLive & LIVE_CPU_REG_Z); mIns[i + 2].mType = ASMIT_NOP; mIns[i + 2].mMode = ASMIM_IMPLIED; return true; } @@ -43322,8 +43362,8 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate3(int i, int pass) mIns[i + 1].mType == ASMIT_STY && mIns[i + 2].mType == ASMIT_TYA && !(mIns[i + 2].mLive & LIVE_CPU_REG_Y)) { - mIns[i + 0].mType = ASMIT_LDA; mIns[i + 0].mLive |= LIVE_CPU_REG_A; - mIns[i + 1].mType = ASMIT_STA; mIns[i + 1].mLive |= LIVE_CPU_REG_A; + mIns[i + 0].mType = ASMIT_LDA; mIns[i + 0].mLive |= LIVE_CPU_REG_A | (mIns[i + 2].mLive & LIVE_CPU_REG_Z); + mIns[i + 1].mType = ASMIT_STA; mIns[i + 1].mLive |= LIVE_CPU_REG_A | (mIns[i + 2].mLive & LIVE_CPU_REG_Z); mIns[i + 2].mType = ASMIT_NOP; mIns[i + 2].mMode = ASMIM_IMPLIED; return true; } @@ -50393,7 +50433,6 @@ void NativeCodeProcedure::Optimize(void) } #endif - if (step == 16) { if (mInterProc->mCompilerOptions & COPT_OPTIMIZE_INLINE) @@ -50404,6 +50443,17 @@ void NativeCodeProcedure::Optimize(void) } } + if (step == 17) + { + if (!(mInterProc->mCompilerOptions & COPT_OPTIMIZE_CODE_SIZE)) + { + ResetVisited(); + if (mEntryBlock->Expand16BitLoopBranch()) + changed = true; + + } + } + #if _DEBUG ResetVisited(); mEntryBlock->CheckAsmCode(); @@ -50423,7 +50473,7 @@ void NativeCodeProcedure::Optimize(void) } #if 1 - if (!changed && step < 16) + if (!changed && step < 17) { ResetIndexFlipped(); @@ -50436,6 +50486,7 @@ void NativeCodeProcedure::Optimize(void) else cnt++; + } while (changed); #if 1 diff --git a/oscar64/NativeCodeGenerator.h b/oscar64/NativeCodeGenerator.h index 78f728b..72547b9 100644 --- a/oscar64/NativeCodeGenerator.h +++ b/oscar64/NativeCodeGenerator.h @@ -651,6 +651,7 @@ public: bool RemoveDoubleZPStore(void); bool ExpandADCToBranch(NativeCodeProcedure* proc); + bool Expand16BitLoopBranch(void); bool SimpleInlineCalls(void); bool Split16BitLoopCount(NativeCodeProcedure* proc);