From 8287f03f494e936ee3376f06b72caf9e69aaae24 Mon Sep 17 00:00:00 2001 From: drmortalwombat <90205530+drmortalwombat@users.noreply.github.com> Date: Sun, 4 Sep 2022 23:05:52 +0200 Subject: [PATCH] Fix shortcut moves violating carry dependencies --- oscar64/NativeCodeGenerator.cpp | 55 +++++++++++++++++++++++++++++++++ oscar64/NativeCodeGenerator.h | 2 ++ 2 files changed, 57 insertions(+) diff --git a/oscar64/NativeCodeGenerator.cpp b/oscar64/NativeCodeGenerator.cpp index d824384..7bc2f1d 100644 --- a/oscar64/NativeCodeGenerator.cpp +++ b/oscar64/NativeCodeGenerator.cpp @@ -12445,6 +12445,21 @@ bool NativeCodeBasicBlock::SimplifyLoopEnd(NativeCodeProcedure* proc) return changed; } +bool NativeCodeBasicBlock::CanBytepassLoad(const NativeCodeInstruction& ains) const +{ + for (int i = 0; i < mIns.Size(); i++) + { + if (ains.MayBeChangedOnAddress(mIns[i])) + return false; + + if (ains.mType == ASMIT_LDY && mIns[i].ReferencesYReg() || + ains.mType == ASMIT_LDX && mIns[i].ReferencesXReg()) + return false; + } + + return true; +} + bool NativeCodeBasicBlock::SimplifyDiamond(NativeCodeProcedure* proc) { bool changed = false; @@ -12473,6 +12488,36 @@ bool NativeCodeBasicBlock::SimplifyDiamond(NativeCodeProcedure* proc) changed = true; } } + + if (mTrueJump->mEntryRequiredRegs[CPU_REG_Y] && mFalseJump->mEntryRequiredRegs[CPU_REG_Y] && mTrueJump->mTrueJump->mEntryRequiredRegs[CPU_REG_Y]) + { + int sz = mIns.Size() - 1; + while (sz >= 0 && !mIns[sz].ReferencesYReg()) + sz--; + if (sz >= 0 && mIns[sz].mType == ASMIT_LDY && (mIns[sz].mMode == ASMIM_ZERO_PAGE || mIns[sz].mMode == ASMIM_ABSOLUTE) && !(mIns[sz].mLive & LIVE_CPU_REG_Z)) + { + if (mTrueJump->CanBytepassLoad(mIns[sz]) && mFalseJump->CanBytepassLoad(mIns[sz])) + { + mTrueJump->mTrueJump->mIns.Insert(0, NativeCodeInstruction(ASMIT_LDY, mIns[sz])); + changed = true; + } + } + } + + if (mTrueJump->mEntryRequiredRegs[CPU_REG_X] && mFalseJump->mEntryRequiredRegs[CPU_REG_X] && mTrueJump->mTrueJump->mEntryRequiredRegs[CPU_REG_X]) + { + int sz = mIns.Size() - 1; + while (sz >= 0 && !mIns[sz].ReferencesXReg()) + sz--; + if (sz >= 0 && mIns[sz].mType == ASMIT_LDX && (mIns[sz].mMode == ASMIM_ZERO_PAGE || mIns[sz].mMode == ASMIM_ABSOLUTE) && !(mIns[sz].mLive & LIVE_CPU_REG_Z)) + { + if (mTrueJump->CanBytepassLoad(mIns[sz]) && mFalseJump->CanBytepassLoad(mIns[sz])) + { + mTrueJump->mTrueJump->mIns.Insert(0, NativeCodeInstruction(ASMIT_LDX, mIns[sz])); + changed = true; + } + } + } } #if 1 if (mTrueJump->mEntryRequiredRegs[CPU_REG_Y] && !mFalseJump->mEntryRequiredRegs[CPU_REG_Y] && !mTrueJump->mEntryRequiredRegs[CPU_REG_Z] && mTrueJump->mNumEntries == 1) @@ -16121,6 +16166,8 @@ bool NativeCodeBasicBlock::JoinTAXARange(int from, int to) { if (mIns[start].MayBeChangedOnAddress(mIns[i]) || mIns[start + 1].MayBeChangedOnAddress(mIns[i])) return false; + if (mIns[start + 1].RequiresCarry() && mIns[i].ChangesCarry()) + return false; } int live = mIns[to].mLive; @@ -29129,6 +29176,7 @@ void NativeCodeProcedure::Optimize(void) mEntryBlock->CheckBlocks(); #endif +#if 1 if (step == 5) { ResetVisited(); @@ -29139,6 +29187,13 @@ void NativeCodeProcedure::Optimize(void) if (mEntryBlock->SimplifyLoopEnd(this)) changed = true; } +#endif + if (step == 7) + { + ResetVisited(); + if (mEntryBlock->SimplifyDiamond(this)) + changed = true; + } #if 1 if (step >= 6) diff --git a/oscar64/NativeCodeGenerator.h b/oscar64/NativeCodeGenerator.h index f5b5312..8e6a23b 100644 --- a/oscar64/NativeCodeGenerator.h +++ b/oscar64/NativeCodeGenerator.h @@ -400,6 +400,8 @@ public: bool SimplifyDiamond(NativeCodeProcedure* proc); bool SimplifyLoopEnd(NativeCodeProcedure* proc); + bool CanBytepassLoad(const NativeCodeInstruction& ains) const; + bool MoveAccuTrainUp(int at, int end); bool MoveAccuTrainsUp(void);