Avoid frame pointer in native code if simple stack frame

This commit is contained in:
drmortalwombat 2021-09-29 19:48:57 +02:00
parent 4aa82d539b
commit 9dfbe405a5
4 changed files with 39 additions and 11 deletions

View File

@ -2966,7 +2966,7 @@ void InterCodeBasicBlock::MapVariables(GrowingVariableArray& globalVars, Growing
}
}
void InterCodeBasicBlock::CollectOuterFrame(int level, int& size)
void InterCodeBasicBlock::CollectOuterFrame(int level, int& size, bool &inner, bool &inlineAssembler)
{
int i;
@ -2985,6 +2985,8 @@ void InterCodeBasicBlock::CollectOuterFrame(int level, int& size)
size = mInstructions[i]->mIntValue;
mInstructions[i]->mCode = IC_NONE;
}
else
inner = true;
}
else if (mInstructions[i]->mCode == IC_POP_FRAME)
{
@ -2994,10 +2996,12 @@ void InterCodeBasicBlock::CollectOuterFrame(int level, int& size)
}
level--;
}
else if (mInstructions[i]->mCode == IC_ASSEMBLER)
inlineAssembler = true;
}
if (mTrueJump) mTrueJump->CollectOuterFrame(level, size);
if (mFalseJump) mFalseJump->CollectOuterFrame(level, size);
if (mTrueJump) mTrueJump->CollectOuterFrame(level, size, inner, inlineAssembler);
if (mFalseJump) mFalseJump->CollectOuterFrame(level, size, inner, inlineAssembler);
}
}
@ -3809,12 +3813,14 @@ void InterCodeProcedure::Close(void)
ResetVisited();
mLeafProcedure = mEntryBlock->IsLeafProcedure();
mHasDynamicStack = false;
mHasInlineAssembler = false;
if (!mLeafProcedure)
{
int size = 0;
ResetVisited();
mEntryBlock->CollectOuterFrame(0, size);
mEntryBlock->CollectOuterFrame(0, size, mHasDynamicStack, mHasInlineAssembler);
mCommonFrameSize = size;
}
else

View File

@ -459,7 +459,7 @@ public:
void CollectVariables(GrowingVariableArray & globalVars, GrowingVariableArray & localVars);
void MapVariables(GrowingVariableArray& globalVars, GrowingVariableArray& localVars);
void CollectOuterFrame(int level, int& size);
void CollectOuterFrame(int level, int& size, bool& inner, bool& inlineAssembler);
bool IsLeafProcedure(void);
@ -487,7 +487,7 @@ public:
GrowingTypeArray mTemporaries;
GrowingIntArray mTempOffset, mTempSizes;
int mTempSize, mCommonFrameSize, mCallerSavedTemps;
bool mLeafProcedure, mNativeProcedure, mCallsFunctionPointer;
bool mLeafProcedure, mNativeProcedure, mCallsFunctionPointer, mHasDynamicStack, mHasInlineAssembler;
GrowingInterCodeProcedurePtrArray mCalledFunctions;
InterCodeModule * mModule;

View File

@ -2133,6 +2133,7 @@ void NativeCodeBasicBlock::LoadConstantToReg(InterCodeProcedure * proc, const In
index += proc->mLocalVars[ins->mVarIndex]->mOffset;
else
index += ins->mVarIndex + proc->mLocalSize + 2;
index += mFrameOffset;
CheckFrameIndex(areg, index, 2);
if (index != 0)
@ -2232,6 +2233,7 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr
index += proc->mLocalVars[ins->mVarIndex]->mOffset;
else
index += ins->mVarIndex + proc->mLocalSize + 2;
index += mFrameOffset;
CheckFrameIndex(reg, index, 4);
mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, index));
@ -2306,6 +2308,7 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr
index += proc->mLocalVars[ins->mVarIndex]->mOffset;
else
index += ins->mVarIndex + proc->mLocalSize + 2;
index += mFrameOffset;
CheckFrameIndex(reg, index, 4);
mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, index));
@ -2408,6 +2411,7 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr
index += proc->mLocalVars[ins->mVarIndex]->mOffset;
else
index += ins->mVarIndex + proc->mLocalSize + 2;
index += mFrameOffset;
CheckFrameIndex(reg, index, 2);
mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, index));
@ -2453,6 +2457,7 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr
index += proc->mLocalVars[ins->mVarIndex]->mOffset;
else
index += ins->mVarIndex + proc->mLocalSize + 2;
index += mFrameOffset;
CheckFrameIndex(reg, index, 2);
mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, index));
@ -2529,6 +2534,7 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr
index += proc->mLocalVars[ins->mVarIndex]->mOffset;
else
index += ins->mVarIndex + proc->mLocalSize + 2;
index += mFrameOffset;
CheckFrameIndex(reg, index, 1);
mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, index));
@ -2568,6 +2574,7 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr
index += proc->mLocalVars[ins->mVarIndex]->mOffset;
else
index += ins->mVarIndex + proc->mLocalSize + 2;
index += mFrameOffset;
CheckFrameIndex(reg, index, 2);
mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, index));
@ -2612,6 +2619,7 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr
index += proc->mLocalVars[ins->mVarIndex]->mOffset;
else
index += ins->mVarIndex + proc->mLocalSize + 2;
index += mFrameOffset;
CheckFrameIndex(reg, index, 1);
mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, index));
@ -2652,6 +2660,7 @@ void NativeCodeBasicBlock::StoreValue(InterCodeProcedure* proc, const InterInstr
index += proc->mLocalVars[ins->mVarIndex]->mOffset;
else
index += ins->mVarIndex + proc->mLocalSize + 2;
index += mFrameOffset;
CheckFrameIndex(reg, index, 2);
mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, index));
@ -2748,7 +2757,8 @@ void NativeCodeBasicBlock::LoadStoreValue(InterCodeProcedure* proc, const InterI
index += proc->mLocalVars[rins->mVarIndex]->mOffset;
else
index += rins->mVarIndex + proc->mLocalSize + 2;
CheckFrameIndex(areg, index, 4);
index += mFrameOffset;
CheckFrameIndex(areg, index, 1);
mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, index));
mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_INDIRECT_Y, areg));
@ -2781,6 +2791,7 @@ void NativeCodeBasicBlock::LoadStoreValue(InterCodeProcedure* proc, const InterI
index += proc->mLocalVars[wins->mVarIndex]->mOffset;
else
index += wins->mVarIndex + proc->mLocalSize + 2;
index += mFrameOffset;
CheckFrameIndex(areg, index, 1);
mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, index));
@ -2842,6 +2853,7 @@ void NativeCodeBasicBlock::LoadValueToReg(InterCodeProcedure* proc, const InterI
index += proc->mLocalVars[ins->mVarIndex]->mOffset;
else
index += ins->mVarIndex + proc->mLocalSize + 2;
index += mFrameOffset;
CheckFrameIndex(areg, index, 4);
mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, index));
@ -2921,6 +2933,7 @@ void NativeCodeBasicBlock::LoadValueToReg(InterCodeProcedure* proc, const InterI
index += proc->mLocalVars[ins->mVarIndex]->mOffset;
else
index += ins->mVarIndex + proc->mLocalSize + 2;
index += mFrameOffset;
CheckFrameIndex(areg, index, 2);
mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, index));
@ -2990,7 +3003,8 @@ void NativeCodeBasicBlock::LoadValueToReg(InterCodeProcedure* proc, const InterI
index += proc->mLocalVars[ins->mVarIndex]->mOffset;
else
index += ins->mVarIndex + proc->mLocalSize + 2;
CheckFrameIndex(areg, index, 2);
index += mFrameOffset;
CheckFrameIndex(areg, index, 1);
mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, index));
mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_INDIRECT_Y, areg));
@ -3055,6 +3069,7 @@ void NativeCodeBasicBlock::LoadValueToReg(InterCodeProcedure* proc, const InterI
index += proc->mLocalVars[ins->mVarIndex]->mOffset;
else
index += ins->mVarIndex + proc->mLocalSize + 2;
index += mFrameOffset;
CheckFrameIndex(areg, index, 2);
mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_IMMEDIATE, index));
@ -6186,7 +6201,8 @@ void NativeCodeProcedure::Compile(InterCodeProcedure* proc)
int tempSave = proc->mTempSize > 16 ? proc->mTempSize - 16 : 0;
int stackExpand = tempSave + proc->mLocalSize + 2;
mNoFrame = proc->mLocalSize == 0 && tempSave == 0 && proc->mLeafProcedure;
mFrameOffset = 0;
mNoFrame = proc->mLocalSize == 0 && tempSave == 0 && !proc->mHasDynamicStack && !(proc->mHasInlineAssembler && !proc->mLeafProcedure);
if (mNoFrame)
proc->mLinkerObject->mFlags |= LOBJF_NO_FRAME;
@ -6247,8 +6263,12 @@ void NativeCodeProcedure::Compile(InterCodeProcedure* proc)
entryBlock->mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_STACK + 1));
entryBlock->mIns.Push(NativeCodeInstruction(ASMIT_SBC, ASMIM_IMMEDIATE, ((proc->mCommonFrameSize + 2) >> 8) & 0xff));
entryBlock->mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_STACK + 1));
if (mNoFrame)
mFrameOffset = proc->mCommonFrameSize + 2;
}
entryBlock->mFrameOffset = mFrameOffset;
tblocks[0] = entryBlock;
@ -6412,6 +6432,7 @@ NativeCodeBasicBlock* NativeCodeProcedure::AllocateBlock(void)
{
NativeCodeBasicBlock* block = new NativeCodeBasicBlock();
block->mNoFrame = mNoFrame;
block->mFrameOffset = mFrameOffset;
block->mIndex = mTempBlocks++;
mBlocks.Push(block);
@ -6425,6 +6446,7 @@ NativeCodeBasicBlock* NativeCodeProcedure::CompileBlock(InterCodeProcedure* ipro
NativeCodeBasicBlock* block = new NativeCodeBasicBlock();
block->mNoFrame = mNoFrame;
block->mFrameOffset = mFrameOffset;
mBlocks.Push(block);
tblocks[sblock->mIndex] = block;

View File

@ -81,7 +81,7 @@ public:
GrowingArray<NativeCodeBasicBlock*> mEntryBlocks;
int mOffset, mSize, mNumEntries;
int mOffset, mSize, mNumEntries, mFrameOffset;
bool mPlaced, mCopied, mKnownShortBranch, mBypassed, mAssembled, mNoFrame, mVisited;
int PutBranch(NativeCodeProcedure* proc, AsmInsType code, int offset);
@ -163,7 +163,7 @@ class NativeCodeProcedure
NativeCodeGenerator* mGenerator;
int mProgStart, mProgSize, mIndex;
int mProgStart, mProgSize, mIndex, mFrameOffset;
bool mNoFrame;
int mTempBlocks;