Improve reordering of function arguments

This commit is contained in:
drmortalwombat 2024-04-28 20:15:17 +02:00
parent bb8c31bf32
commit 9b47a34840
4 changed files with 49 additions and 3 deletions

View File

@ -898,7 +898,17 @@ bool InterCodeBasicBlock::CanSwapInstructions(const InterInstruction* ins0, cons
ins1->mCode == IC_PUSH_FRAME || ins1->mCode == IC_POP_FRAME || ins1->mCode == IC_MALLOC || ins1->mCode == IC_FREE) ins1->mCode == IC_PUSH_FRAME || ins1->mCode == IC_POP_FRAME || ins1->mCode == IC_MALLOC || ins1->mCode == IC_FREE)
return false; return false;
if (ins1->mCode == IC_LOAD || ins1->mCode == IC_STORE || ins1->mCode == IC_COPY || ins1->mCode == IC_STRCPY || ins1->mCode == IC_FILL) if (ins0->mSrc[0].mMemory == IM_PROCEDURE && ins0->mSrc[0].mLinkerObject && ins0->mSrc[0].mLinkerObject->mProc && ins0->mSrc[0].mLinkerObject->mProc->mParamVars.Size() == 0)
{
if (ins1->mCode == IC_STORE)
{
if (ins1->mSrc[1].mMemory != IM_FRAME && ins1->mSrc[1].mMemory != IM_FFRAME)
return false;
}
else if (ins1->mCode == IC_LOAD || ins1->mCode == IC_STORE || ins1->mCode == IC_COPY || ins1->mCode == IC_STRCPY || ins1->mCode == IC_FILL)
return false;
}
else if (ins1->mCode == IC_LOAD || ins1->mCode == IC_STORE || ins1->mCode == IC_COPY || ins1->mCode == IC_STRCPY || ins1->mCode == IC_FILL)
return false; return false;
} }

View File

@ -656,7 +656,7 @@ public:
InterCodeModule * mModule; InterCodeModule * mModule;
int mID; int mID;
int mLocalSize, mNumLocals; int mLocalSize, mNumLocals, mNumParams;
GrowingVariableArray mLocalVars, mParamVars; GrowingVariableArray mLocalVars, mParamVars;
NumberSet mLocalAliasedSet, mParamAliasedSet; NumberSet mLocalAliasedSet, mParamAliasedSet;

View File

@ -5428,6 +5428,7 @@ InterCodeProcedure* InterCodeGenerator::TranslateProcedure(InterCodeModule * mod
dec->mVarIndex = proc->mID; dec->mVarIndex = proc->mID;
dec->mLinkerObject = proc->mLinkerObject; dec->mLinkerObject = proc->mLinkerObject;
proc->mNumLocals = dec->mNumVars; proc->mNumLocals = dec->mNumVars;
proc->mNumParams = dec->mBase->mSize;
proc->mDeclaration = dec; proc->mDeclaration = dec;
if (dec->mFlags & DTF_NATIVE) if (dec->mFlags & DTF_NATIVE)

View File

@ -10439,7 +10439,39 @@ NativeCodeBasicBlock* NativeCodeBasicBlock::BinaryOperator(InterCodeProcedure* p
} }
else if (ins->mSrc[1].mTemp < 0) else if (ins->mSrc[1].mTemp < 0)
{ {
if (sins0) if ((ins->mSrc[1].mIntConst & (ins->mSrc[1].mIntConst + 1)) == 0 && ins->mSrc[0].IsUnsigned() && ins->mSrc[0].mRange.mMaxValue <= ins->mSrc[1].mIntConst)
{
NativeCodeInstruction insl = NativeCodeInstruction(ins, ASMIT_EOR, ASMIM_IMMEDIATE, ins->mSrc[1].mIntConst & 0xff);
NativeCodeInstruction insh = NativeCodeInstruction(ins, ASMIT_EOR, ASMIM_IMMEDIATE, (ins->mSrc[1].mIntConst >> 8) & 0xff);
if (sins0)
{
if (ins->mDst.IsUByte())
insh = NativeCodeInstruction(ins, ASMIT_LDA, ASMIM_IMMEDIATE, 0);
LoadValueToReg(proc, sins0, treg, &insl, &insh);
}
else
{
mIns.Push(NativeCodeInstruction(ins, ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]));
mIns.Push(insl);
mIns.Push(NativeCodeInstruction(ins, ASMIT_STA, ASMIM_ZERO_PAGE, treg));
if (InterTypeSize[ins->mDst.mType] > 1)
{
if (ins->mDst.IsUByte())
{
mIns.Push(NativeCodeInstruction(ins, ASMIT_LDA, ASMIM_IMMEDIATE, 0));
mIns.Push(NativeCodeInstruction(ins, ASMIT_STA, ASMIM_ZERO_PAGE, treg + 1));
}
else
{
mIns.Push(NativeCodeInstruction(ins, ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 1));
mIns.Push(insh);
mIns.Push(NativeCodeInstruction(ins, ASMIT_STA, ASMIM_ZERO_PAGE, treg + 1));
}
}
}
}
else if (sins0)
{ {
LoadValueToReg(proc, sins0, treg, nullptr, nullptr); LoadValueToReg(proc, sins0, treg, nullptr, nullptr);
@ -31502,6 +31534,9 @@ bool NativeCodeBasicBlock::MoveLoadAddImmStoreUp(int at)
{ {
if (mIns[j].mType == ASMIT_STA && mIns[j].mMode == ASMIM_ZERO_PAGE && mIns[j].mAddress == mIns[at + 1].mAddress) if (mIns[j].mType == ASMIT_STA && mIns[j].mMode == ASMIM_ZERO_PAGE && mIns[j].mAddress == mIns[at + 1].mAddress)
{ {
while (j + 1 < mIns.Size() && mIns[j + 1].mType == ASMIT_STA)
j++;
if (mIns[j].mLive & (LIVE_CPU_REG_A | LIVE_CPU_REG_C)) if (mIns[j].mLive & (LIVE_CPU_REG_A | LIVE_CPU_REG_C))
return false; return false;