Remove dangling tail recursion rts after jmp
This commit is contained in:
parent
bcc59a9afb
commit
eb55b2f55d
|
@ -194,7 +194,7 @@ The compiler can be provided with additional information using the built in func
|
||||||
|
|
||||||
### Loop unrolling
|
### Loop unrolling
|
||||||
|
|
||||||
Loop unrolling on 6502 is hard to decide for the compiler. Memory is usually scarce, so it only does it in realy obvious cases (and in less obbious cases for O3). On the other hand unrolling is required to get good performance in e.g. scrolling code. Therefore the compiler offers an unrolling pragma, that can be used to specifiy the amount of unrolling either as a number or "full" for complete.
|
Loop unrolling on 6502 is hard to decide for the compiler. Memory is usually scarce, so it only does it in realy obvious cases (and in less obvious cases for O3). On the other hand unrolling is required to get good performance in e.g. scrolling code. Therefore the compiler offers an unrolling pragma, that can be used to specifiy the amount of unrolling either as a number or "full" for complete.
|
||||||
|
|
||||||
The following code scrolls the screen to the left, and completely unrolls the inner vertical loop.
|
The following code scrolls the screen to the left, and completely unrolls the inner vertical loop.
|
||||||
|
|
||||||
|
|
|
@ -10781,6 +10781,19 @@ void InterCodeBasicBlock::PeepholeOptimization(const GrowingVariableArray& stati
|
||||||
mInstructions[i + 0]->mNumOperands = 0;
|
mInstructions[i + 0]->mNumOperands = 0;
|
||||||
changed = true;
|
changed = true;
|
||||||
}
|
}
|
||||||
|
else if (
|
||||||
|
mInstructions[i + 0]->mCode == IC_BINARY_OPERATOR && mInstructions[i + 0]->mOperator == IA_MUL && mInstructions[i + 0]->mSrc[0].mTemp < 0 &&
|
||||||
|
mInstructions[i + 1]->mCode == IC_BINARY_OPERATOR && mInstructions[i + 1]->mOperator == IA_SHL && mInstructions[i + 1]->mSrc[0].mTemp < 0 &&
|
||||||
|
mInstructions[i + 1]->mSrc[1].mTemp == mInstructions[i + 0]->mDst.mTemp && mInstructions[i + 1]->mSrc[1].mFinal &&
|
||||||
|
(mInstructions[i + 0]->mSrc[0].mIntConst << mInstructions[i + 1]->mSrc[0].mIntConst) < 65536)
|
||||||
|
{
|
||||||
|
mInstructions[i + 1]->mSrc[0].mIntConst = mInstructions[i + 0]->mSrc[0].mIntConst << mInstructions[i + 1]->mSrc[0].mIntConst;
|
||||||
|
mInstructions[i + 1]->mSrc[1] = mInstructions[i + 0]->mSrc[1];
|
||||||
|
mInstructions[i + 1]->mOperator = IA_MUL;
|
||||||
|
mInstructions[i + 0]->mCode = IC_NONE;
|
||||||
|
mInstructions[i + 0]->mNumOperands = 0;
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
#if 1
|
#if 1
|
||||||
else if (
|
else if (
|
||||||
mInstructions[i + 0]->mCode == IC_BINARY_OPERATOR && mInstructions[i + 0]->mOperator == IA_OR && mInstructions[i + 0]->mSrc[0].mTemp < 0 &&
|
mInstructions[i + 0]->mCode == IC_BINARY_OPERATOR && mInstructions[i + 0]->mOperator == IA_OR && mInstructions[i + 0]->mSrc[0].mTemp < 0 &&
|
||||||
|
|
|
@ -25240,6 +25240,23 @@ bool NativeCodeBasicBlock::CalculateOffset(int& total)
|
||||||
return changed;
|
return changed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void NativeCodeBasicBlock::ShortcutTailRecursion()
|
||||||
|
{
|
||||||
|
if (!mVisited)
|
||||||
|
{
|
||||||
|
mVisited = true;
|
||||||
|
if (!mFalseJump && mTrueJump && mTrueJump->mIns.Size() == 1 && mTrueJump->mIns[0].mType == ASMIT_RTS && mIns.Size() > 0 && mIns.Last().IsSimpleJSR())
|
||||||
|
{
|
||||||
|
this->mCode[this->mCode.Size() - 3] = 0x4c;
|
||||||
|
mTrueJump->mNumEntries--;
|
||||||
|
mTrueJump = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mTrueJump) mTrueJump->ShortcutTailRecursion();
|
||||||
|
if (mFalseJump) mFalseJump->ShortcutTailRecursion();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void NativeCodeBasicBlock::CopyCode(NativeCodeProcedure * proc, uint8* target)
|
void NativeCodeBasicBlock::CopyCode(NativeCodeProcedure * proc, uint8* target)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
@ -25822,7 +25839,10 @@ void NativeCodeProcedure::Compile(InterCodeProcedure* proc)
|
||||||
|
|
||||||
mEntryBlock->Assemble();
|
mEntryBlock->Assemble();
|
||||||
|
|
||||||
NativeCodeBasicBlock* lentryBlock = mEntryBlock->BypassEmptyBlocks();
|
mEntryBlock = mEntryBlock->BypassEmptyBlocks();
|
||||||
|
|
||||||
|
ResetVisited();
|
||||||
|
mEntryBlock->ShortcutTailRecursion();
|
||||||
|
|
||||||
proc->mLinkerObject->mType = LOT_NATIVE_CODE;
|
proc->mLinkerObject->mType = LOT_NATIVE_CODE;
|
||||||
|
|
||||||
|
@ -25831,7 +25851,7 @@ void NativeCodeProcedure::Compile(InterCodeProcedure* proc)
|
||||||
int total;
|
int total;
|
||||||
total = 0;
|
total = 0;
|
||||||
|
|
||||||
lentryBlock->BuildPlacement(placement);
|
mEntryBlock->BuildPlacement(placement);
|
||||||
|
|
||||||
for (int i = 0; i < placement.Size(); i++)
|
for (int i = 0; i < placement.Size(); i++)
|
||||||
placement[i]->InitialOffset(total);
|
placement[i]->InitialOffset(total);
|
||||||
|
|
|
@ -182,6 +182,8 @@ public:
|
||||||
void Assemble(void);
|
void Assemble(void);
|
||||||
void Close(NativeCodeBasicBlock* trueJump, NativeCodeBasicBlock* falseJump, AsmInsType branch);
|
void Close(NativeCodeBasicBlock* trueJump, NativeCodeBasicBlock* falseJump, AsmInsType branch);
|
||||||
|
|
||||||
|
void ShortcutTailRecursion();
|
||||||
|
|
||||||
bool RemoveNops(void);
|
bool RemoveNops(void);
|
||||||
bool PeepHoleOptimizer(NativeCodeProcedure* proc, int pass);
|
bool PeepHoleOptimizer(NativeCodeProcedure* proc, int pass);
|
||||||
void BlockSizeReduction(NativeCodeProcedure* proc);
|
void BlockSizeReduction(NativeCodeProcedure* proc);
|
||||||
|
|
Loading…
Reference in New Issue