From d2511b558cf3bbb01594a8ad8cb55eb1f2f548f7 Mon Sep 17 00:00:00 2001 From: drmortalwombat <90205530+drmortalwombat@users.noreply.github.com> Date: Wed, 5 Jan 2022 20:06:25 +0100 Subject: [PATCH] Reoder eight bit adds --- oscar64/InterCode.cpp | 52 +++++++++++++++++++++++++++++++++ oscar64/NativeCodeGenerator.cpp | 10 +++++++ 2 files changed, 62 insertions(+) diff --git a/oscar64/InterCode.cpp b/oscar64/InterCode.cpp index a465144..547b402 100644 --- a/oscar64/InterCode.cpp +++ b/oscar64/InterCode.cpp @@ -3411,6 +3411,53 @@ void InterCodeBasicBlock::SimplifyIntegerRangeRelops(void) } } } +#endif +#if 1 + for (int i = 0; i < sz; i++) + { + if (i + 1 < sz) + { + if ( + mInstructions[i + 0]->mCode == IC_LEA && mInstructions[i + 0]->mSrc[1].mTemp >= 0 && + mInstructions[i + 1]->mCode == IC_LEA && + mInstructions[i + 0]->mSrc[1].mTemp != mInstructions[i + 0]->mDst.mTemp && + mInstructions[i + 1]->mSrc[1].mTemp == mInstructions[i + 0]->mDst.mTemp && mInstructions[i + 1]->mSrc[1].mFinal && + mInstructions[i + 0]->mSrc[0].IsUByte() && mInstructions[i + 1]->mSrc[0].IsUByte() && + mInstructions[i + 0]->mSrc[0].mRange.mMaxValue + mInstructions[i + 1]->mSrc[0].mRange.mMaxValue < 256) + { + mInstructions[i + 0]->mCode = IC_BINARY_OPERATOR; + mInstructions[i + 0]->mOperator = IA_ADD; + + mInstructions[i + 1]->mSrc[1] = mInstructions[i + 0]->mSrc[1]; + mInstructions[i + 0]->mSrc[1] = mInstructions[i + 1]->mSrc[0]; + mInstructions[i + 1]->mSrc[0].mTemp = mInstructions[i + 0]->mDst.mTemp; + mInstructions[i + 0]->mDst.mType = IT_INT16; + mInstructions[i + 1]->mSrc[0].mType = IT_INT16; + mInstructions[i + 1]->mSrc[0].mRange.mMaxValue += mInstructions[i + 0]->mSrc[0].mRange.mMaxValue; + mInstructions[i + 0]->mDst.mRange = mInstructions[i + 1]->mSrc[0].mRange; + } + } + if (i + 2 < sz) + { + if ( + mInstructions[i + 0]->mCode == IC_LEA && mInstructions[i + 0]->mSrc[1].mTemp >= 0 && + mInstructions[i + 2]->mCode == IC_LEA && + mInstructions[i + 0]->mSrc[1].mTemp != mInstructions[i + 0]->mDst.mTemp && + mInstructions[i + 2]->mSrc[1].mTemp == mInstructions[i + 0]->mDst.mTemp && mInstructions[i + 2]->mSrc[1].mFinal && + mInstructions[i + 0]->mSrc[0].IsUByte() && mInstructions[i + 2]->mSrc[0].IsUByte() && + mInstructions[i + 0]->mSrc[0].mRange.mMaxValue + mInstructions[i + 2]->mSrc[0].mRange.mMaxValue < 256 && + + mInstructions[i + 1]->mCode == IC_CONVERSION_OPERATOR && mInstructions[i + 1]->mOperator == IA_EXT8TO16U && + mInstructions[i + 1]->mDst.mTemp != mInstructions[0]->mSrc[0].mTemp && + mInstructions[i + 1]->mDst.mTemp != mInstructions[0]->mSrc[1].mTemp&& + mInstructions[i + 1]->mDst.mTemp != mInstructions[0]->mDst.mTemp) + { + InterInstruction* ins = mInstructions[i + 1]; + mInstructions[i + 1] = mInstructions[i + 0]; + mInstructions[i + 0] = ins; + } + } + } #endif if (mTrueJump) mTrueJump->SimplifyIntegerRangeRelops(); @@ -3509,6 +3556,11 @@ void InterCodeBasicBlock::UpdateLocalIntegerRangeSets(void) { if (ins->mSrc[i].mTemp >= 0) ins->mSrc[i].mRange = mLocalValueRange[ins->mSrc[i].mTemp]; + else if (IsIntegerType(ins->mSrc[i].mType)) + { + ins->mSrc[i].mRange.mMaxState = ins->mSrc[i].mRange.mMinState = IntegerValueRange::S_BOUND; + ins->mSrc[i].mRange.mMinValue = ins->mSrc[i].mRange.mMaxValue = ins->mSrc[i].mIntConst; + } } if (ins->mDst.mTemp >= 0 && IsIntegerType(ins->mDst.mType)) diff --git a/oscar64/NativeCodeGenerator.cpp b/oscar64/NativeCodeGenerator.cpp index 274840a..9919eda 100644 --- a/oscar64/NativeCodeGenerator.cpp +++ b/oscar64/NativeCodeGenerator.cpp @@ -13331,6 +13331,16 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(int pass) progress = true; } } + + if (mIns[i + 0].mMode == ASMIM_INDIRECT_Y && (mIns[i + 0].mFlags & NCIF_YZERO)) + { + int apos, breg; + if (FindDirectAddressSumY(i, mIns[i].mAddress, apos, breg)) + { + if (PatchDirectAddressSumY(i, mIns[i].mAddress, apos, breg)) + progress = true; + } + } #endif #if 0