fix mixup of stack and fast call in virtual function parameter offsets
This commit is contained in:
parent
6caed58be4
commit
347898ea53
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue