diff --git a/oscar64/GlobalAnalyzer.cpp b/oscar64/GlobalAnalyzer.cpp index bc0ba29..a627ce8 100644 --- a/oscar64/GlobalAnalyzer.cpp +++ b/oscar64/GlobalAnalyzer.cpp @@ -289,6 +289,8 @@ void GlobalAnalyzer::CheckFastcall(Declaration* procDec, bool head) { if (!(procDec->mBase->mFlags & DTF_FASTCALL) && (procDec->mType == DT_CONST_FUNCTION) && !(procDec->mFlags & DTF_FUNC_ANALYZING)) { +// printf("CheckFastcall1 %s %08llx %08llx\n", procDec->mQualIdent->mString, procDec->mFlags, procDec->mBase->mFlags); + procDec->mFlags |= DTF_FUNC_ANALYZING; int nbase = 0; for (int i = 0; i < procDec->mCalled.Size(); i++) @@ -328,6 +330,8 @@ void GlobalAnalyzer::CheckFastcall(Declaration* procDec, bool head) nbase = n; } +// printf("CheckFastcall2 %s %08llx %08llx\n", procDec->mQualIdent->mString, procDec->mFlags, procDec->mBase->mFlags); + if (procDec->mValue && procDec->mValue->mType == EX_DISPATCH) { Declaration* maxf = nullptr; @@ -388,6 +392,8 @@ void GlobalAnalyzer::CheckFastcall(Declaration* procDec, bool head) procDec->mFlags &= ~DTF_FUNC_ANALYZING; +// printf("CheckFastcall3 %s %08llx %08llx\n", procDec->mQualIdent->mString, procDec->mFlags, procDec->mBase->mFlags); + if (procDec->mBase->mFlags & DTF_STACKCALL) { procDec->mBase->mFlags |= DTF_STACKCALL; @@ -461,19 +467,17 @@ void GlobalAnalyzer::CheckFastcall(Declaration* procDec, bool head) procDec->mBase->mFastCallSize = nparams; procDec->mBase->mFlags |= DTF_FASTCALL; -#if 0 - printf("FASTCALL %s\n", f->mIdent->mString); -#endif +// printf("FASTCALL %s\n", procDec->mQualIdent->mString); } else { -// printf("STACKCALL %s, %d %d\n", procDec->mIdent->mString, cnparams, fplimit); +// printf("STACKCALL %s, %d %d\n", procDec->mQualIdent->mString, cnparams, fplimit); procDec->mBase->mFlags |= DTF_STACKCALL; } } else { -// printf("STACKCALL %s, F%d\n", procDec->mIdent->mString, !!(procDec->mFlags& DTF_FUNC_VARIABLE)); +// printf("STACKCALL %s, F%d\n", procDec->mQualIdent->mString, !!(procDec->mFlags& DTF_FUNC_VARIABLE)); procDec->mBase->mFlags |= DTF_STACKCALL; } } diff --git a/oscar64/InterCode.cpp b/oscar64/InterCode.cpp index e9f9f36..b6f4851 100644 --- a/oscar64/InterCode.cpp +++ b/oscar64/InterCode.cpp @@ -6964,6 +6964,13 @@ void InterCodeBasicBlock::UpdateLocalIntegerRangeSets(const GrowingVariableArray tempChain[ins->mDst.mTemp].mBaseTemp = tempChain[ins->mSrc[1].mTemp].mBaseTemp; tempChain[ins->mDst.mTemp].mOffset = tempChain[ins->mSrc[1].mTemp].mOffset + ins->mSrc[0].mIntConst; } + else if (ins->mCode == IC_BINARY_OPERATOR && ins->mOperator == IA_ADD && + ins->mSrc[0].mTemp >= 0 && ins->mSrc[1].mTemp < 0 && ins->mSrc[1].mIntConst > 0 && + tempChain[ins->mSrc[0].mTemp].mBaseTemp >= 0) + { + tempChain[ins->mDst.mTemp].mBaseTemp = tempChain[ins->mSrc[0].mTemp].mBaseTemp; + tempChain[ins->mDst.mTemp].mOffset = tempChain[ins->mSrc[0].mTemp].mOffset + ins->mSrc[1].mIntConst; + } else if (ins->mCode == IC_CONVERSION_OPERATOR && ins->mOperator == IA_EXT8TO16U && ins->mSrc[0].mTemp >= 0) tempChain[ins->mDst.mTemp] = tempChain[ins->mSrc[0].mTemp]; else if (ins->mDst.mTemp >= 0) @@ -9654,7 +9661,16 @@ bool InterCodeBasicBlock::SimplifyIntegerNumeric(const GrowingInstructionPtrArra nins->mSrc[1] = cins->mDst; nins->mDst.mTemp = spareTemps++; nins->mDst.mType = IT_INT16; - nins->mDst.mRange = ins->mDst.mRange; + if (cins->mDst.mRange.mMinState == IntegerValueRange::S_BOUND) + { + nins->mDst.mRange.mMinState = IntegerValueRange::S_BOUND; + nins->mDst.mRange.mMinValue = cins->mDst.mRange.mMinValue << nins->mSrc[0].mIntConst; + } + if (cins->mDst.mRange.mMaxState == IntegerValueRange::S_BOUND) + { + nins->mDst.mRange.mMaxState = IntegerValueRange::S_BOUND; + nins->mDst.mRange.mMaxValue = cins->mDst.mRange.mMaxValue << nins->mSrc[0].mIntConst; + } mInstructions.Insert(i + 1, nins); ins->mOperator = ains->mOperator; @@ -15560,6 +15576,8 @@ void InterCodeBasicBlock::SingleBlockLoopOptimisation(const NumberSet& aliasedPa ins->mOperator = IA_ADD; ins->mSrc[0].mIntConst = indexStep[ins->mSrc[1].mTemp] << ins->mSrc[0].mIntConst; ins->mSrc[1] = ins->mDst; + if (ins->mDst.mRange.mMaxState == IntegerValueRange::S_BOUND) + ins->mDst.mRange.mMaxValue += ins->mSrc[0].mIntConst; indexins.Push(ins); } @@ -15577,6 +15595,8 @@ void InterCodeBasicBlock::SingleBlockLoopOptimisation(const NumberSet& aliasedPa ains->mSrc[1] = ins->mDst; ains->mSrc[1].mTemp = -1; ains->mSrc[1].mIntConst = indexStep[ins->mSrc[1].mTemp]; + if (ains->mDst.mRange.mMaxState == IntegerValueRange::S_BOUND) + ains->mDst.mRange.mMaxValue += ains->mSrc[1].mIntConst; indexins.Push(ains); } @@ -15595,8 +15615,14 @@ void InterCodeBasicBlock::SingleBlockLoopOptimisation(const NumberSet& aliasedPa ains->mSrc[0].mTemp = -1; ains->mSrc[0].mIntConst = indexStep[ins->mSrc[0].mTemp]; + if (ains->mDst.mRange.mMaxState == IntegerValueRange::S_BOUND) + ains->mDst.mRange.mMaxValue += ains->mSrc[0].mIntConst; indexins.Push(ains); } + else if (ins->mCode == IC_LEA && ins->mSrc[1].mTemp < 0 && ins->mSrc[0].IsUByte() && (ins->mSrc[1].mMemory == IM_ABSOLUTE || ins->mSrc[1].mMemory == IM_GLOBAL)) + { + mInstructions[j++] = ins; + } else if (ins->mCode == IC_LEA && (ins->mSrc[1].mTemp < 0 || dep[ins->mSrc[1].mTemp] == DEP_UNKNOWN || dep[ins->mSrc[1].mTemp] == DEP_DEFINED) && dep[ins->mSrc[0].mTemp] == DEP_INDEX_DERIVED) { #if 1 @@ -19145,7 +19171,7 @@ void InterCodeProcedure::Close(void) { GrowingTypeArray tstack(IT_NONE); - CheckFunc = !strcmp(mIdent->mString, "tile_collide"); + CheckFunc = !strcmp(mIdent->mString, "_menuShowSprites"); CheckCase = false; mEntryBlock = mBlocks[0]; @@ -19544,6 +19570,12 @@ void InterCodeProcedure::Close(void) #endif +#if 1 + LoadStoreForwarding(paramMemory); + + RebuildIntegerRangeSet(); +#endif + #if 1 BuildLoopPrefix(); DisassembleDebug("added dominators");