Optimize enums in bitfield usage
This commit is contained in:
parent
0959a15b10
commit
e27075955d
|
@ -11,7 +11,7 @@ int CompressLZO(uint8* dst, const uint8* source, int size)
|
|||
while (pi < 127 && pos < size)
|
||||
{
|
||||
int bi = pi, bj = 0;
|
||||
for (int i = 1; i < (pos < 255 ? pos : 255); i++)
|
||||
for (int i = 1; i <= (pos < 255 ? pos : 255); i++)
|
||||
{
|
||||
int j = 0;
|
||||
while (j < 127 && pos + j < size && source[pos - i + j] == source[pos + j])
|
||||
|
|
|
@ -21227,6 +21227,43 @@ void InterCodeBasicBlock::PeepholeOptimization(const GrowingVariableArray& stati
|
|||
CheckFinalLocal();
|
||||
#endif
|
||||
|
||||
// Bubble up unrelated instructions
|
||||
i = mInstructions.Size() - 2;
|
||||
while (i >= 0)
|
||||
{
|
||||
if (mInstructions[i]->mCode == IC_LOAD ||
|
||||
mInstructions[i]->mCode == IC_UNARY_OPERATOR ||
|
||||
mInstructions[i]->mCode == IC_CONVERSION_OPERATOR ||
|
||||
mInstructions[i]->mCode == IC_BINARY_OPERATOR && (mInstructions[i]->mSrc[0].mTemp < 0 || mInstructions[i]->mSrc[1].mTemp < 0))
|
||||
{
|
||||
InterInstruction* ins(mInstructions[i]);
|
||||
|
||||
if (mInstructions[i + 1]->mCode == IC_CONSTANT && CanSwapInstructions(ins, mInstructions[i + 1]))
|
||||
{
|
||||
if (mInstructions[i + 2]->mNumOperands >= 1 && mInstructions[i + 2]->mSrc[0].mTemp == mInstructions[i]->mDst.mTemp && mInstructions[i + 2]->mSrc[0].mFinal ||
|
||||
mInstructions[i + 2]->mNumOperands == 2 && mInstructions[i + 2]->mSrc[1].mTemp == mInstructions[i]->mDst.mTemp && mInstructions[i + 2]->mSrc[1].mFinal)
|
||||
{
|
||||
SwapInstructions(ins, mInstructions[i + 1]);
|
||||
mInstructions[i] = mInstructions[i + 1];
|
||||
mInstructions[i + 1] = ins;
|
||||
}
|
||||
}
|
||||
}
|
||||
i--;
|
||||
}
|
||||
|
||||
#if 1
|
||||
do {} while (PeepholeReplaceOptimization(staticVars, staticProcs));
|
||||
#endif
|
||||
|
||||
limit = mInstructions.Size() - 1;
|
||||
if (limit >= 0 && mInstructions[limit]->mCode == IC_BRANCH)
|
||||
{
|
||||
limit--;
|
||||
if (limit > 0 && mInstructions[limit]->mCode == IC_RELATIONAL_OPERATOR)
|
||||
limit--;
|
||||
}
|
||||
|
||||
#if 1
|
||||
i = limit;
|
||||
while (i >= 0)
|
||||
|
@ -23226,7 +23263,7 @@ void InterCodeProcedure::Close(void)
|
|||
{
|
||||
GrowingTypeArray tstack(IT_NONE);
|
||||
|
||||
CheckFunc = !strcmp(mIdent->mString, "shipyard_navigate");
|
||||
CheckFunc = !strcmp(mIdent->mString, "test_char_fit");
|
||||
CheckCase = false;
|
||||
|
||||
mEntryBlock = mBlocks[0];
|
||||
|
|
|
@ -23750,6 +23750,7 @@ bool NativeCodeBasicBlock::PropagateSinglePath(void)
|
|||
if (mTrueJump->mEntryRequiredRegs[mIns[i + 3].mAddress] && mTrueJump->mEntryRequiredRegs[mIns[i + 6].mAddress] &&
|
||||
!mFalseJump->mEntryRequiredRegs[mIns[i + 3].mAddress] && !mFalseJump->mEntryRequiredRegs[mIns[i + 6].mAddress] &&
|
||||
!mTrueJump->mEntryRequiredRegs[CPU_REG_C] &&
|
||||
!mTrueJump->mEntryRequiredRegs[CPU_REG_Z] &&
|
||||
mTrueJump->mNumEntries == 1)
|
||||
{
|
||||
mTrueJump->mEntryRequiredRegs += mIns[i + 1].mAddress;
|
||||
|
@ -23769,6 +23770,7 @@ bool NativeCodeBasicBlock::PropagateSinglePath(void)
|
|||
else if (mFalseJump->mEntryRequiredRegs[mIns[i + 3].mAddress] && mFalseJump->mEntryRequiredRegs[mIns[i + 6].mAddress] &&
|
||||
!mTrueJump->mEntryRequiredRegs[mIns[i + 3].mAddress] && !mTrueJump->mEntryRequiredRegs[mIns[i + 6].mAddress] &&
|
||||
!mFalseJump->mEntryRequiredRegs[CPU_REG_C] &&
|
||||
!mFalseJump->mEntryRequiredRegs[CPU_REG_Z] &&
|
||||
mFalseJump->mNumEntries == 1)
|
||||
{
|
||||
mFalseJump->mEntryRequiredRegs += mIns[i + 1].mAddress;
|
||||
|
@ -23808,6 +23810,7 @@ bool NativeCodeBasicBlock::PropagateSinglePath(void)
|
|||
if (mTrueJump->mEntryRequiredRegs[mIns[i + 3].mAddress] && mTrueJump->mEntryRequiredRegs[mIns[i + 6].mAddress] &&
|
||||
!mFalseJump->mEntryRequiredRegs[mIns[i + 3].mAddress] && !mFalseJump->mEntryRequiredRegs[mIns[i + 6].mAddress] &&
|
||||
!mTrueJump->mEntryRequiredRegs[CPU_REG_C] &&
|
||||
!mTrueJump->mEntryRequiredRegs[CPU_REG_Z] &&
|
||||
mTrueJump->mNumEntries == 1)
|
||||
{
|
||||
mTrueJump->mEntryRequiredRegs += mIns[i + 1].mAddress;
|
||||
|
@ -23825,6 +23828,7 @@ bool NativeCodeBasicBlock::PropagateSinglePath(void)
|
|||
else if (mFalseJump->mEntryRequiredRegs[mIns[i + 3].mAddress] && mFalseJump->mEntryRequiredRegs[mIns[i + 6].mAddress] &&
|
||||
!mTrueJump->mEntryRequiredRegs[mIns[i + 3].mAddress] && !mTrueJump->mEntryRequiredRegs[mIns[i + 6].mAddress] &&
|
||||
!mFalseJump->mEntryRequiredRegs[CPU_REG_C] &&
|
||||
!mFalseJump->mEntryRequiredRegs[CPU_REG_Z] &&
|
||||
mFalseJump->mNumEntries == 1)
|
||||
{
|
||||
mFalseJump->mEntryRequiredRegs += mIns[i + 1].mAddress;
|
||||
|
@ -42879,6 +42883,11 @@ void NativeCodeBasicBlock::BlockSizeReduction(NativeCodeProcedure* proc, int xen
|
|||
else
|
||||
carrySet = false;
|
||||
}
|
||||
|
||||
else if (mEntryBlocks[i]->mBranch == ASMIT_BEQ && mEntryBlocks[i]->mTrueJump == this && mEntryBlocks[i]->mIns.Size() > 0 && mEntryBlocks[i]->mIns.Last().mType == ASMIT_CMP)
|
||||
carryClear = false;
|
||||
else if (mEntryBlocks[i]->mBranch == ASMIT_BNE && mEntryBlocks[i]->mFalseJump == this && mEntryBlocks[i]->mIns.Size() > 0 && mEntryBlocks[i]->mIns.Last().mType == ASMIT_CMP)
|
||||
carryClear = false;
|
||||
else
|
||||
carryClear = carrySet = false;
|
||||
}
|
||||
|
@ -44433,6 +44442,11 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate1(int i, int pass)
|
|||
mIns[i].mType = ASMIT_NOP; mIns[i].mMode = ASMIM_IMPLIED;;
|
||||
return true;
|
||||
}
|
||||
else if (mIns[i].mType == ASMIT_CMP && mIns[i].mMode == ASMIM_IMMEDIATE && mIns[i].mAddress == 0x00 && (mIns[i].mLive & LIVE_CPU_REG_Z) == 0)
|
||||
{
|
||||
mIns[i].mType = ASMIT_SEC; mIns[i].mMode = ASMIM_IMPLIED;;
|
||||
return true;
|
||||
}
|
||||
else if (mIns[i].mType == ASMIT_ROR && mIns[i].mMode == ASMIM_IMPLIED && (mIns[i].mLive & (LIVE_CPU_REG_A | LIVE_CPU_REG_Z)) == 0)
|
||||
{
|
||||
mIns[i].mType = ASMIT_LSR;
|
||||
|
@ -44590,6 +44604,12 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerIterate2(int i, int pass)
|
|||
mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED;
|
||||
return true;
|
||||
}
|
||||
else if (mIns[i + 1].mType == ASMIT_CMP && mIns[i + 1].mMode == ASMIM_IMMEDIATE && mIns[i + 1].mAddress == 0 && mIns[i].ChangesAccuAndFlag())
|
||||
{
|
||||
mIns[i + 0].mLive |= (mIns[i + 1].mLive & LIVE_CPU_REG_Z);
|
||||
mIns[i + 1].mType = ASMIT_SEC; mIns[i + 1].mMode = ASMIM_IMPLIED;
|
||||
return true;
|
||||
}
|
||||
else if (mIns[i + 0].mType == ASMIT_LDA && mIns[i + 0].mMode == ASMIM_IMMEDIATE && mIns[i + 0].mAddress == 0 &&
|
||||
mIns[i + 1].mType == ASMIT_CMP && !(mIns[i + 1].mLive & (LIVE_CPU_REG_C | LIVE_CPU_REG_A)))
|
||||
{
|
||||
|
@ -50776,6 +50796,22 @@ bool NativeCodeBasicBlock::PeepHoleOptimizerExits(int pass)
|
|||
#if 1
|
||||
int sz = mIns.Size();
|
||||
|
||||
if (sz >= 1 && (mIns[sz - 1].mType == ASMIT_SEC || mIns[sz - 1].mType == ASMIT_CLC) && mExitRequiredRegs[CPU_REG_C])
|
||||
{
|
||||
if (mTrueJump && mTrueJump->mIns.Size() == 1 && mTrueJump->mNumEntries == 1 && mTrueJump->mIns[0].mType == mIns[sz - 1].mType)
|
||||
{
|
||||
mTrueJump->mIns[0].mType = ASMIT_NOP;
|
||||
mTrueJump->mEntryRequiredRegs += CPU_REG_C;
|
||||
changed = true;
|
||||
}
|
||||
if (mFalseJump && mFalseJump->mIns.Size() == 1 && mFalseJump->mNumEntries == 1 && mFalseJump->mIns[0].mType == mIns[sz - 1].mType)
|
||||
{
|
||||
mFalseJump->mIns[0].mType = ASMIT_NOP;
|
||||
mFalseJump->mEntryRequiredRegs += CPU_REG_C;
|
||||
changed = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (sz >= 2 &&
|
||||
mIns[sz - 2].mType == ASMIT_LDA && mIns[sz - 2].mMode == ASMIM_IMMEDIATE && mIns[sz - 2].mAddress == 0 &&
|
||||
mIns[sz - 1].mType == ASMIT_CMP)
|
||||
|
@ -52657,7 +52693,7 @@ void NativeCodeProcedure::Compile(InterCodeProcedure* proc)
|
|||
|
||||
mInterProc->mLinkerObject->mNativeProc = this;
|
||||
|
||||
CheckFunc = !strcmp(mIdent->mString, "renderTileScroll");
|
||||
CheckFunc = !strcmp(mIdent->mString, "bar");
|
||||
|
||||
int nblocks = proc->mBlocks.Size();
|
||||
tblocks = new NativeCodeBasicBlock * [nblocks];
|
||||
|
@ -53632,6 +53668,7 @@ void NativeCodeProcedure::Optimize(void)
|
|||
if (mEntryBlock->PeepHoleOptimizer(step))
|
||||
changed = true;
|
||||
#endif
|
||||
|
||||
if (step == 2)
|
||||
{
|
||||
ResetVisited();
|
||||
|
@ -53775,7 +53812,6 @@ void NativeCodeProcedure::Optimize(void)
|
|||
ResetVisited();
|
||||
if (mEntryBlock->PropagateSinglePath())
|
||||
changed = true;
|
||||
|
||||
}
|
||||
|
||||
#if _DEBUG
|
||||
|
|
|
@ -44,7 +44,7 @@ bool SourceFile::ReadLineLZO(char* line, ptrdiff_t limit)
|
|||
while (pi < 127 && mPos < mFill)
|
||||
{
|
||||
int bi = pi, bj = 0;
|
||||
for (int i = 1; i < mPos; i++)
|
||||
for (int i = 1; i <= (mPos < 255 ? mPos : 255); i++)
|
||||
{
|
||||
int j = 0;
|
||||
while (j < 127 && mPos + j < mFill && mBuffer[mPos - i + j] == mBuffer[mPos + j])
|
||||
|
|
Loading…
Reference in New Issue