From 9dfbe405a59bc657bc111b66dba3712cd0055c21 Mon Sep 17 00:00:00 2001 From: drmortalwombat <90205530+drmortalwombat@users.noreply.github.com> Date: Wed, 29 Sep 2021 19:48:57 +0200 Subject: [PATCH] Avoid frame pointer in native code if simple stack frame --- oscar64/InterCode.cpp | 14 ++++++++++---- oscar64/InterCode.h | 4 ++-- oscar64/NativeCodeGenerator.cpp | 28 +++++++++++++++++++++++++--- oscar64/NativeCodeGenerator.h | 4 ++-- 4 files changed, 39 insertions(+), 11 deletions(-) diff --git a/oscar64/InterCode.cpp b/oscar64/InterCode.cpp index 6cdbb19..7f4576a 100644 --- a/oscar64/InterCode.cpp +++ b/oscar64/InterCode.cpp @@ -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 diff --git a/oscar64/InterCode.h b/oscar64/InterCode.h index 353e99f..68e9e27 100644 --- a/oscar64/InterCode.h +++ b/oscar64/InterCode.h @@ -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; diff --git a/oscar64/NativeCodeGenerator.cpp b/oscar64/NativeCodeGenerator.cpp index 750c5b9..1bc2690 100644 --- a/oscar64/NativeCodeGenerator.cpp +++ b/oscar64/NativeCodeGenerator.cpp @@ -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; diff --git a/oscar64/NativeCodeGenerator.h b/oscar64/NativeCodeGenerator.h index 5353f7e..cb218d9 100644 --- a/oscar64/NativeCodeGenerator.h +++ b/oscar64/NativeCodeGenerator.h @@ -81,7 +81,7 @@ public: GrowingArray 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;