diff --git a/oscar64/GlobalAnalyzer.cpp b/oscar64/GlobalAnalyzer.cpp index cd086ed..62607c1 100644 --- a/oscar64/GlobalAnalyzer.cpp +++ b/oscar64/GlobalAnalyzer.cpp @@ -393,7 +393,7 @@ void GlobalAnalyzer::CheckFastcall(Declaration* procDec, bool head) if (procDec->mValue && procDec->mValue->mType == EX_DISPATCH) { - Declaration* maxf = nullptr; + Declaration* maxf = nullptr, * reff = nullptr; bool stackCall = false; @@ -402,7 +402,10 @@ void GlobalAnalyzer::CheckFastcall(Declaration* procDec, bool head) Declaration* cf = procDec->mCalled[i]; if (cf->mBase->mFlags & DTF_STACKCALL) + { stackCall = true; + reff = cf; + } if (!maxf) maxf = cf; @@ -410,6 +413,9 @@ void GlobalAnalyzer::CheckFastcall(Declaration* procDec, bool head) maxf = cf; } + if (!reff) + reff = maxf; + for (int i = 0; i < procDec->mCalled.Size(); i++) { Declaration* cf = procDec->mCalled[i]; @@ -420,9 +426,9 @@ void GlobalAnalyzer::CheckFastcall(Declaration* procDec, bool head) cf->mBase->mFlags |= DTF_STACKCALL; } - if (cf != maxf) + if (cf != reff) { - Declaration* fp = cf->mBase->mParams, * mp = maxf->mBase->mParams; + Declaration* fp = cf->mBase->mParams, * mp = reff->mBase->mParams; while (fp) { fp->mVarIndex = mp->mVarIndex; @@ -431,10 +437,11 @@ void GlobalAnalyzer::CheckFastcall(Declaration* procDec, bool head) } assert(!mp); - - cf->mBase->mFastCallBase = cf->mFastCallBase = maxf->mBase->mFastCallBase; cf->mBase->mFastCallSize = cf->mFastCallSize = maxf->mBase->mFastCallSize; } + + if (cf != maxf) + cf->mBase->mFastCallBase = cf->mFastCallBase = maxf->mBase->mFastCallBase; } procDec->mFastCallBase = procDec->mBase->mFastCallBase; diff --git a/oscar64/NativeCodeGenerator.cpp b/oscar64/NativeCodeGenerator.cpp index 9a90708..c7a1172 100644 --- a/oscar64/NativeCodeGenerator.cpp +++ b/oscar64/NativeCodeGenerator.cpp @@ -23229,7 +23229,15 @@ bool NativeCodeBasicBlock::LoopRegisterXYMap(void) { pblock->mIns.Push(NativeCodeInstruction(pblock->mBranchIns, ASMIT_LDX, ASMIM_ZERO_PAGE, mini)); if (pblock->mExitRequiredRegs[CPU_REG_Z]) + { + int i = pblock->mIns.Size() - 1; + while (i >= 0 && !(pblock->mIns[i].ChangesAccu())) + { + pblock->mIns[i].mLive |= LIVE_CPU_REG_A; + i--; + } pblock->mIns.Push(NativeCodeInstruction(pblock->mBranchIns, ASMIT_ORA, ASMIM_IMMEDIATE, 0)); + } pblock->mExitRequiredRegs += CPU_REG_X; for (int i = 0; i < eblocks.Size(); i++) @@ -55417,6 +55425,9 @@ void NativeCodeProcedure::Optimize(void) if (!changed && mEntryBlock->LoopRegisterXYMap()) changed = true; #endif + + CheckBlocks(true); + ResetVisited(); if (!changed && mEntryBlock->OptimizeGenericLoop(this)) changed = true;