Native code optimizations

This commit is contained in:
drmortalwombat 2021-10-01 15:54:07 +02:00
parent 02305e8bc5
commit 0c9992f549
2 changed files with 67 additions and 19 deletions

View File

@ -3237,13 +3237,13 @@ void NativeCodeBasicBlock::ShiftRegisterLeft(InterCodeProcedure* proc, int reg,
} }
else else
{ {
mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, reg + 0)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, reg + 1));
for (int i = 0; i < shift; i++) for (int i = 0; i < shift; i++)
{ {
mIns.Push(NativeCodeInstruction(ASMIT_ASL, ASMIM_IMPLIED)); mIns.Push(NativeCodeInstruction(ASMIT_ASL, ASMIM_ZERO_PAGE, reg));
mIns.Push(NativeCodeInstruction(ASMIT_ROL, ASMIM_ZERO_PAGE, reg + 1)); mIns.Push(NativeCodeInstruction(ASMIT_ROL, ASMIM_IMPLIED));
} }
mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg + 0)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, reg + 1));
} }
} }
@ -5055,8 +5055,12 @@ bool NativeCodeBasicBlock::RemoveUnusedResultInstructions(void)
return changed; return changed;
} }
void NativeCodeBasicBlock::CountEntries(void) void NativeCodeBasicBlock::CountEntries(NativeCodeBasicBlock * fromJump)
{ {
if (mNumEntries == 0)
mFromJump = fromJump;
else
mFromJump = nullptr;
mNumEntries++; mNumEntries++;
if (!mVisited) if (!mVisited)
@ -5064,9 +5068,9 @@ void NativeCodeBasicBlock::CountEntries(void)
mVisited = true; mVisited = true;
if (mTrueJump) if (mTrueJump)
mTrueJump->CountEntries(); mTrueJump->CountEntries(this);
if (mFalseJump) if (mFalseJump)
mFalseJump->CountEntries(); mFalseJump->CountEntries(this);
} }
} }
@ -5258,7 +5262,7 @@ bool NativeCodeBasicBlock::FindGlobalAddress(int at, int reg, int& apos)
return false; return false;
} }
bool NativeCodeBasicBlock::FindGlobalAddressSumY(int at, int reg, int& apos, int& ireg) bool NativeCodeBasicBlock::FindGlobalAddressSumY(int at, int reg, const NativeCodeInstruction*& ains, int& ireg)
{ {
int j = at - 7; int j = at - 7;
while (j >= 0) while (j >= 0)
@ -5271,8 +5275,17 @@ bool NativeCodeBasicBlock::FindGlobalAddressSumY(int at, int reg, int& apos, int
mIns[j + 5].mType == ASMIT_ADC && mIns[j + 5].mMode == ASMIM_IMMEDIATE && mIns[j + 5].mAddress == 0 && mIns[j + 5].mType == ASMIT_ADC && mIns[j + 5].mMode == ASMIM_IMMEDIATE && mIns[j + 5].mAddress == 0 &&
mIns[j + 6].mType == ASMIT_STA && mIns[j + 6].mMode == ASMIM_ZERO_PAGE && mIns[j + 6].mAddress == reg + 1) mIns[j + 6].mType == ASMIT_STA && mIns[j + 6].mMode == ASMIM_ZERO_PAGE && mIns[j + 6].mAddress == reg + 1)
{ {
apos = j + 0; ains = &(mIns[j + 1]);
ireg = mIns[j + 2].mAddress; ireg = mIns[j + 2].mAddress;
int k = j + 7;
while (k < at)
{
if (mIns[k].mMode == ASMIM_ZERO_PAGE && mIns[k].mAddress == ireg && mIns[k].ChangesAddress())
return false;
k++;
}
return true; return true;
} }
if (mIns[j + 6].mMode == ASMIM_ZERO_PAGE && (mIns[j + 6].mAddress == reg || mIns[j + 6].mAddress == reg + 1) && mIns[j + 6].ChangesAddress()) if (mIns[j + 6].mMode == ASMIM_ZERO_PAGE && (mIns[j + 6].mAddress == reg || mIns[j + 6].mAddress == reg + 1) && mIns[j + 6].ChangesAddress())
@ -5281,6 +5294,27 @@ bool NativeCodeBasicBlock::FindGlobalAddressSumY(int at, int reg, int& apos, int
j--; j--;
} }
if (mFromJump)
{
while (j >= -6)
{
if (mIns[j + 6].mMode == ASMIM_ZERO_PAGE && (mIns[j + 6].mAddress == reg || mIns[j + 6].mAddress == reg + 1) && mIns[j + 6].ChangesAddress())
return false;
j--;
}
if (mFromJump->FindGlobalAddressSumY(mFromJump->mIns.Size(), reg, ains, ireg))
{
int k = 0;
while (k < at)
{
if (mIns[k].mMode == ASMIM_ZERO_PAGE && mIns[k].mAddress == ireg && mIns[k].ChangesAddress())
return false;
k++;
}
return true;
}
}
return false; return false;
} }
@ -5940,10 +5974,12 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(void)
#if 1 #if 1
if ( if (
mIns[i + 0].mType == ASMIT_LDY && mIns[i + 0].mMode == ASMIM_IMMEDIATE && mIns[i + 0].mAddress == 0 && mIns[i + 0].mType == ASMIT_LDY && mIns[i + 0].mMode == ASMIM_IMMEDIATE && mIns[i + 0].mAddress == 0 &&
mIns[i + 1].mMode == ASMIM_INDIRECT_Y && !(mIns[i + 1].mLive & LIVE_MEM )) mIns[i + 1].mMode == ASMIM_INDIRECT_Y)
{ {
const NativeCodeInstruction* ains;
int apos, breg, ireg; int apos, breg, ireg;
if (FindAddressSumY(i, mIns[i + 1].mAddress, apos, breg, ireg)) if (!(mIns[i + 1].mLive & LIVE_MEM) && FindAddressSumY(i, mIns[i + 1].mAddress, apos, breg, ireg))
{ {
if (breg == mIns[i + 1].mAddress) if (breg == mIns[i + 1].mAddress)
{ {
@ -5962,7 +5998,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(void)
mIns[i + 1].mAddress = breg; mIns[i + 1].mAddress = breg;
progress = true; progress = true;
} }
else if (FindGlobalAddressSumY(i, mIns[i + 1].mAddress, apos, ireg)) else if (FindGlobalAddressSumY(i, mIns[i + 1].mAddress, ains, ireg))
{ {
if (mIns[i + 1].mLive & LIVE_CPU_REG_Y) if (mIns[i + 1].mLive & LIVE_CPU_REG_Y)
{ {
@ -5974,8 +6010,8 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(void)
mIns[i + 0].mAddress = ireg; mIns[i + 0].mAddress = ireg;
mIns[i + 1].mMode = ASMIM_ABSOLUTE_Y; mIns[i + 1].mMode = ASMIM_ABSOLUTE_Y;
mIns[i + 1].mLinkerObject = mIns[apos + 1].mLinkerObject; mIns[i + 1].mLinkerObject = ains->mLinkerObject;
mIns[i + 1].mAddress = mIns[apos + 1].mAddress; mIns[i + 1].mAddress = ains->mAddress;
progress = true; progress = true;
} }
} }
@ -6060,6 +6096,15 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(void)
mIns[i + 2].mType = ASMIT_CLC; mIns[i + 2].mMode = ASMIM_IMPLIED; mIns[i + 2].mType = ASMIT_CLC; mIns[i + 2].mMode = ASMIM_IMPLIED;
progress = true; progress = true;
} }
else if (
mIns[i + 0].mType == ASMIT_LDA &&
mIns[i + 1].mType == ASMIT_STA &&
mIns[i + 2].mType == ASMIT_ORA && mIns[i + 2].mMode == ASMIM_IMMEDIATE && mIns[i + 2].mAddress == 0)
{
mIns[i + 2].mType = ASMIT_NOP; mIns[i + 2].mMode = ASMIM_IMPLIED;
mIns[i + 1].mLive |= mIns[i + 2].mLive & (LIVE_CPU_REG_A | LIVE_CPU_REG_Z);
progress = true;
}
#if 1 #if 1
else if ( else if (
mIns[i + 0].mMode != ASMIM_RELATIVE && mIns[i + 0].mMode != ASMIM_RELATIVE &&
@ -6602,8 +6647,11 @@ void NativeCodeProcedure::Compile(InterCodeProcedure* proc)
{ {
ResetVisited(); ResetVisited();
for (int i = 0; i < mBlocks.Size(); i++) for (int i = 0; i < mBlocks.Size(); i++)
{
mBlocks[i]->mNumEntries = 0; mBlocks[i]->mNumEntries = 0;
entryBlock->CountEntries(); mBlocks[i]->mFromJump = nullptr;
}
entryBlock->CountEntries(nullptr);
do do
{ {

View File

@ -73,7 +73,7 @@ public:
DynamicArray<uint8> mCode; DynamicArray<uint8> mCode;
int mIndex; int mIndex;
NativeCodeBasicBlock* mTrueJump, * mFalseJump; NativeCodeBasicBlock* mTrueJump, * mFalseJump, * mFromJump;
AsmInsType mBranch; AsmInsType mBranch;
GrowingArray<NativeCodeInstruction> mIns; GrowingArray<NativeCodeInstruction> mIns;
@ -132,13 +132,13 @@ public:
bool BuildGlobalRequiredRegSet(NumberSet& fromRequiredTemps); bool BuildGlobalRequiredRegSet(NumberSet& fromRequiredTemps);
bool RemoveUnusedResultInstructions(void); bool RemoveUnusedResultInstructions(void);
void CountEntries(void); void CountEntries(NativeCodeBasicBlock* fromJump);
bool MergeBasicBlocks(void); bool MergeBasicBlocks(void);
bool MoveLoadStoreUp(int at); bool MoveLoadStoreUp(int at);
bool FindAddressSumY(int at, int reg, int & apos, int& breg, int& ireg); bool FindAddressSumY(int at, int reg, int & apos, int& breg, int& ireg);
bool FindGlobalAddress(int at, int reg, int& apos); bool FindGlobalAddress(int at, int reg, int& apos);
bool FindGlobalAddressSumY(int at, int reg, int& apos, int& ireg); bool FindGlobalAddressSumY(int at, int reg, const NativeCodeInstruction * & ains, int& ireg);
bool ValueForwarding(const NativeRegisterDataSet& data); bool ValueForwarding(const NativeRegisterDataSet& data);