fix mixup of stack and fast call in virtual function parameter offsets

This commit is contained in:
drmortalwombat 2025-05-01 10:21:35 +02:00
parent 6caed58be4
commit 347898ea53
2 changed files with 23 additions and 5 deletions

View File

@ -393,7 +393,7 @@ void GlobalAnalyzer::CheckFastcall(Declaration* procDec, bool head)
if (procDec->mValue && procDec->mValue->mType == EX_DISPATCH) if (procDec->mValue && procDec->mValue->mType == EX_DISPATCH)
{ {
Declaration* maxf = nullptr; Declaration* maxf = nullptr, * reff = nullptr;
bool stackCall = false; bool stackCall = false;
@ -402,7 +402,10 @@ void GlobalAnalyzer::CheckFastcall(Declaration* procDec, bool head)
Declaration* cf = procDec->mCalled[i]; Declaration* cf = procDec->mCalled[i];
if (cf->mBase->mFlags & DTF_STACKCALL) if (cf->mBase->mFlags & DTF_STACKCALL)
{
stackCall = true; stackCall = true;
reff = cf;
}
if (!maxf) if (!maxf)
maxf = cf; maxf = cf;
@ -410,6 +413,9 @@ void GlobalAnalyzer::CheckFastcall(Declaration* procDec, bool head)
maxf = cf; maxf = cf;
} }
if (!reff)
reff = maxf;
for (int i = 0; i < procDec->mCalled.Size(); i++) for (int i = 0; i < procDec->mCalled.Size(); i++)
{ {
Declaration* cf = procDec->mCalled[i]; Declaration* cf = procDec->mCalled[i];
@ -420,9 +426,9 @@ void GlobalAnalyzer::CheckFastcall(Declaration* procDec, bool head)
cf->mBase->mFlags |= DTF_STACKCALL; 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) while (fp)
{ {
fp->mVarIndex = mp->mVarIndex; fp->mVarIndex = mp->mVarIndex;
@ -431,10 +437,11 @@ void GlobalAnalyzer::CheckFastcall(Declaration* procDec, bool head)
} }
assert(!mp); assert(!mp);
cf->mBase->mFastCallBase = cf->mFastCallBase = maxf->mBase->mFastCallBase;
cf->mBase->mFastCallSize = cf->mFastCallSize = maxf->mBase->mFastCallSize; cf->mBase->mFastCallSize = cf->mFastCallSize = maxf->mBase->mFastCallSize;
} }
if (cf != maxf)
cf->mBase->mFastCallBase = cf->mFastCallBase = maxf->mBase->mFastCallBase;
} }
procDec->mFastCallBase = procDec->mBase->mFastCallBase; procDec->mFastCallBase = procDec->mBase->mFastCallBase;

View File

@ -23229,7 +23229,15 @@ bool NativeCodeBasicBlock::LoopRegisterXYMap(void)
{ {
pblock->mIns.Push(NativeCodeInstruction(pblock->mBranchIns, ASMIT_LDX, ASMIM_ZERO_PAGE, mini)); pblock->mIns.Push(NativeCodeInstruction(pblock->mBranchIns, ASMIT_LDX, ASMIM_ZERO_PAGE, mini));
if (pblock->mExitRequiredRegs[CPU_REG_Z]) 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->mIns.Push(NativeCodeInstruction(pblock->mBranchIns, ASMIT_ORA, ASMIM_IMMEDIATE, 0));
}
pblock->mExitRequiredRegs += CPU_REG_X; pblock->mExitRequiredRegs += CPU_REG_X;
for (int i = 0; i < eblocks.Size(); i++) for (int i = 0; i < eblocks.Size(); i++)
@ -55417,6 +55425,9 @@ void NativeCodeProcedure::Optimize(void)
if (!changed && mEntryBlock->LoopRegisterXYMap()) if (!changed && mEntryBlock->LoopRegisterXYMap())
changed = true; changed = true;
#endif #endif
CheckBlocks(true);
ResetVisited(); ResetVisited();
if (!changed && mEntryBlock->OptimizeGenericLoop(this)) if (!changed && mEntryBlock->OptimizeGenericLoop(this))
changed = true; changed = true;