Fixed copy with offset
This commit is contained in:
parent
38e1cd0bab
commit
0309fcb286
|
@ -41,7 +41,6 @@ void dispmode80col(void);
|
||||||
#define PETSCII_F7 0x88
|
#define PETSCII_F7 0x88
|
||||||
#define PETSCII_F8 0x8c
|
#define PETSCII_F8 0x8c
|
||||||
|
|
||||||
|
|
||||||
int kbhit(void);
|
int kbhit(void);
|
||||||
|
|
||||||
int getche(void);
|
int getche(void);
|
||||||
|
|
|
@ -604,8 +604,16 @@ Declaration* GlobalOptimizer::Analyze(Expression* exp, Declaration* procDec, uin
|
||||||
return exp->mDecValue;
|
return exp->mDecValue;
|
||||||
case EX_INITIALIZATION:
|
case EX_INITIALIZATION:
|
||||||
case EX_ASSIGNMENT:
|
case EX_ASSIGNMENT:
|
||||||
ldec = Analyze(exp->mLeft, procDec, ANAFL_LHS | flags);
|
if (exp->mToken == TK_ASSIGN)
|
||||||
rdec = Analyze(exp->mRight, procDec, ANAFL_RHS);
|
ldec = Analyze(exp->mLeft, procDec, ANAFL_LHS | flags);
|
||||||
|
else
|
||||||
|
ldec = Analyze(exp->mLeft, procDec, ANAFL_LHS | ANAFL_RHS | flags);
|
||||||
|
|
||||||
|
if (exp->mLeft->mDecType->IsReference())
|
||||||
|
rdec = Analyze(exp->mRight, procDec, ANAFL_LHS | ANAFL_RHS);
|
||||||
|
else
|
||||||
|
rdec = Analyze(exp->mRight, procDec, ANAFL_RHS);
|
||||||
|
|
||||||
RegisterProc(rdec);
|
RegisterProc(rdec);
|
||||||
return ldec;
|
return ldec;
|
||||||
|
|
||||||
|
|
|
@ -9446,6 +9446,76 @@ static bool IsValidSignedIntRange(InterType t, int64 value)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool InterCodeBasicBlock::ForwardShortLoadStoreOffsets(void)
|
||||||
|
{
|
||||||
|
bool changed = false;
|
||||||
|
|
||||||
|
if (!mVisited)
|
||||||
|
{
|
||||||
|
mVisited = true;
|
||||||
|
|
||||||
|
for (int i = 0; i < mInstructions.Size(); i++)
|
||||||
|
{
|
||||||
|
InterInstruction* lins = mInstructions[i];
|
||||||
|
if (lins->mCode == IC_LEA && lins->mSrc[1].mTemp >= 0 && lins->mSrc[0].mTemp < 0 && lins->mSrc[0].IsUByte())
|
||||||
|
{
|
||||||
|
for (int j = i + 1; j < mInstructions.Size(); j++)
|
||||||
|
{
|
||||||
|
InterInstruction* lins2 = mInstructions[j];
|
||||||
|
if (lins2->mCode == IC_LEA && lins2->mSrc[1].mTemp == lins->mDst.mTemp && lins2->mSrc[0].mTemp >= 0)
|
||||||
|
{
|
||||||
|
int k = j + 1;
|
||||||
|
while (k < mInstructions.Size() && !mInstructions[k]->ReferencesTemp(lins2->mDst.mTemp) && !mInstructions[k]->ReferencesTemp(lins->mSrc[1].mTemp))
|
||||||
|
k++;
|
||||||
|
if (k < mInstructions.Size())
|
||||||
|
{
|
||||||
|
InterInstruction* mins = mInstructions[k];
|
||||||
|
if (mins->mCode == IC_LOAD && mins->mSrc[0].mTemp == lins2->mDst.mTemp && mins->mSrc[0].mFinal)
|
||||||
|
{
|
||||||
|
lins2->mSrc[1].mTemp = lins->mSrc[1].mTemp;
|
||||||
|
lins->mSrc[1].mFinal = false;
|
||||||
|
mins->mSrc[0].mIntConst += lins->mSrc[0].mIntConst;
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
else if (mins->mCode == IC_STORE && mins->mSrc[1].mTemp == lins2->mDst.mTemp && mins->mSrc[1].mFinal)
|
||||||
|
{
|
||||||
|
lins2->mSrc[1].mTemp = lins->mSrc[1].mTemp;
|
||||||
|
lins->mSrc[1].mFinal = false;
|
||||||
|
mins->mSrc[1].mIntConst += lins->mSrc[0].mIntConst;
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
else if (mins->mCode == IC_COPY && mins->mSrc[0].mTemp == lins2->mDst.mTemp && mins->mSrc[0].mFinal)
|
||||||
|
{
|
||||||
|
lins2->mSrc[1].mTemp = lins->mSrc[1].mTemp;
|
||||||
|
lins->mSrc[1].mFinal = false;
|
||||||
|
mins->mSrc[0].mIntConst += lins->mSrc[0].mIntConst;
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
else if (mins->mCode == IC_COPY && mins->mSrc[1].mTemp == lins2->mDst.mTemp && mins->mSrc[1].mFinal)
|
||||||
|
{
|
||||||
|
lins2->mSrc[1].mTemp = lins->mSrc[1].mTemp;
|
||||||
|
lins->mSrc[1].mFinal = false;
|
||||||
|
mins->mSrc[1].mIntConst += lins->mSrc[0].mIntConst;
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lins2->mDst.mTemp == lins->mDst.mTemp)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mTrueJump && mTrueJump->ForwardShortLoadStoreOffsets())
|
||||||
|
changed = true;
|
||||||
|
if (mFalseJump && mFalseJump->ForwardShortLoadStoreOffsets())
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return changed;
|
||||||
|
}
|
||||||
|
|
||||||
bool InterCodeBasicBlock::SimplifyIntegerNumeric(const GrowingInstructionPtrArray& tvalue, int& spareTemps)
|
bool InterCodeBasicBlock::SimplifyIntegerNumeric(const GrowingInstructionPtrArray& tvalue, int& spareTemps)
|
||||||
{
|
{
|
||||||
bool changed = false;
|
bool changed = false;
|
||||||
|
@ -16375,7 +16445,6 @@ bool InterCodeBasicBlock::PeepholeReplaceOptimization(const GrowingVariableArray
|
||||||
mInstructions[i + 0]->mCode = IC_NONE; mInstructions[i + 0]->mNumOperands = 0;
|
mInstructions[i + 0]->mCode = IC_NONE; mInstructions[i + 0]->mNumOperands = 0;
|
||||||
changed = true;
|
changed = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -18525,7 +18594,7 @@ void InterCodeProcedure::Close(void)
|
||||||
{
|
{
|
||||||
GrowingTypeArray tstack(IT_NONE);
|
GrowingTypeArray tstack(IT_NONE);
|
||||||
|
|
||||||
CheckFunc = !strcmp(mIdent->mString, "interpret_builtin");
|
CheckFunc = !strcmp(mIdent->mString, "test");
|
||||||
CheckCase = false;
|
CheckCase = false;
|
||||||
|
|
||||||
mEntryBlock = mBlocks[0];
|
mEntryBlock = mBlocks[0];
|
||||||
|
@ -19273,6 +19342,12 @@ void InterCodeProcedure::Close(void)
|
||||||
|
|
||||||
CombineIndirectAddressing();
|
CombineIndirectAddressing();
|
||||||
|
|
||||||
|
BuildDataFlowSets();
|
||||||
|
ResetVisited();
|
||||||
|
mEntryBlock->ForwardShortLoadStoreOffsets();
|
||||||
|
|
||||||
|
DisassembleDebug("ForwardShortLoadStoreOffsets");
|
||||||
|
|
||||||
#if 1
|
#if 1
|
||||||
for (int i = 0; i < 8; i++)
|
for (int i = 0; i < 8; i++)
|
||||||
{
|
{
|
||||||
|
@ -19613,21 +19688,47 @@ void InterCodeProcedure::MapVariables(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool IsReadModifyWrite(const InterCodeBasicBlock* block, int at)
|
||||||
|
{
|
||||||
|
if (block->mInstructions[at]->mCode == IC_LOAD &&
|
||||||
|
block->mInstructions[at + 2]->mCode == IC_STORE &&
|
||||||
|
block->mInstructions[at + 1]->mDst.mTemp == block->mInstructions[at + 2]->mSrc[0].mTemp &&
|
||||||
|
block->mInstructions[at]->mSrc[0].IsEqual(block->mInstructions[at + 2]->mSrc[1]))
|
||||||
|
{
|
||||||
|
if (block->mInstructions[at + 1]->mCode == IC_BINARY_OPERATOR)
|
||||||
|
{
|
||||||
|
return
|
||||||
|
block->mInstructions[at + 1]->mSrc[0].mTemp == block->mInstructions[at]->mDst.mTemp ||
|
||||||
|
block->mInstructions[at + 1]->mSrc[1].mTemp == block->mInstructions[at]->mDst.mTemp;
|
||||||
|
}
|
||||||
|
else if (block->mInstructions[at + 1]->mCode == IC_UNARY_OPERATOR)
|
||||||
|
{
|
||||||
|
return
|
||||||
|
block->mInstructions[at + 1]->mSrc[0].mTemp == block->mInstructions[at]->mDst.mTemp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
bool InterCodeBasicBlock::SameExitCode(const InterCodeBasicBlock* block) const
|
bool InterCodeBasicBlock::SameExitCode(const InterCodeBasicBlock* block) const
|
||||||
{
|
{
|
||||||
if (mInstructions.Size() > 1 && block->mInstructions.Size() > 1)
|
int sz0 = mInstructions.Size();
|
||||||
|
int sz1 = block->mInstructions.Size();
|
||||||
|
|
||||||
|
if (sz0 > 1 && sz1 > 1)
|
||||||
{
|
{
|
||||||
InterInstruction* ins0 = mInstructions[mInstructions.Size() - 2];
|
InterInstruction* ins0 = mInstructions[sz0 - 2];
|
||||||
InterInstruction* ins1 = block->mInstructions[block->mInstructions.Size() - 2];
|
InterInstruction* ins1 = block->mInstructions[sz1 - 2];
|
||||||
|
|
||||||
if (ins0->IsEqual(ins1))
|
if (ins0->IsEqual(ins1))
|
||||||
{
|
{
|
||||||
if (ins0->mCode == IC_STORE && ins0->mSrc[1].mTemp >= 0)
|
if (ins0->mCode == IC_STORE && ins0->mSrc[1].mTemp >= 0)
|
||||||
{
|
{
|
||||||
int j0 = mInstructions.Size() - 3;
|
int j0 = sz0 - 3;
|
||||||
while (j0 >= 0 && mInstructions[j0]->mDst.mTemp != ins0->mSrc[1].mTemp)
|
while (j0 >= 0 && mInstructions[j0]->mDst.mTemp != ins0->mSrc[1].mTemp)
|
||||||
j0--;
|
j0--;
|
||||||
int j1 = block->mInstructions.Size() - 3;
|
int j1 = sz1 - 3;
|
||||||
while (j1 >= 0 && block->mInstructions[j1]->mDst.mTemp != ins0->mSrc[1].mTemp)
|
while (j1 >= 0 && block->mInstructions[j1]->mDst.mTemp != ins0->mSrc[1].mTemp)
|
||||||
j1--;
|
j1--;
|
||||||
|
|
||||||
|
@ -19641,6 +19742,20 @@ bool InterCodeBasicBlock::SameExitCode(const InterCodeBasicBlock* block) const
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (InterTypeSize[ins0->mSrc[0].mType] == 4)
|
||||||
|
{
|
||||||
|
bool rm0 = sz0 >= 4 && IsReadModifyWrite(this, sz0 - 4);
|
||||||
|
bool rm1 = sz1 >= 4 && IsReadModifyWrite(block, sz1 - 4);
|
||||||
|
|
||||||
|
if (rm0 && rm1)
|
||||||
|
{
|
||||||
|
if (!(mInstructions[sz0 - 3]->IsEqual(block->mInstructions[sz1 - 3])))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else if (rm0 || rm1)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (ins0->mCode == IC_LOAD && ins0->mSrc[0].mTemp >= 0)
|
else if (ins0->mCode == IC_LOAD && ins0->mSrc[0].mTemp >= 0)
|
||||||
{
|
{
|
||||||
|
|
|
@ -484,6 +484,8 @@ public:
|
||||||
bool SimplifyPointerOffsets(void);
|
bool SimplifyPointerOffsets(void);
|
||||||
bool EliminateAliasValues(const GrowingInstructionPtrArray& tvalue, const GrowingInstructionPtrArray& avalue);
|
bool EliminateAliasValues(const GrowingInstructionPtrArray& tvalue, const GrowingInstructionPtrArray& avalue);
|
||||||
|
|
||||||
|
bool ForwardShortLoadStoreOffsets(void);
|
||||||
|
|
||||||
void CalculateSingleUsedTemps(FastNumberSet& fused, FastNumberSet& fsingle);
|
void CalculateSingleUsedTemps(FastNumberSet& fused, FastNumberSet& fsingle);
|
||||||
|
|
||||||
bool CalculateSingleAssignmentTemps(FastNumberSet& tassigned, GrowingInstructionPtrArray& tvalue, NumberSet& modifiedParams, InterMemory paramMemory);
|
bool CalculateSingleAssignmentTemps(FastNumberSet& tassigned, GrowingInstructionPtrArray& tvalue, NumberSet& modifiedParams, InterMemory paramMemory);
|
||||||
|
|
|
@ -5934,7 +5934,7 @@ void NativeCodeBasicBlock::StoreByteIndexedValue(InterCodeProcedure* proc, const
|
||||||
void NativeCodeBasicBlock::LoadAbsoluteByteIndexedValue(InterCodeProcedure* proc, const InterInstruction* iins, const InterInstruction* rins)
|
void NativeCodeBasicBlock::LoadAbsoluteByteIndexedValue(InterCodeProcedure* proc, const InterInstruction* iins, const InterInstruction* rins)
|
||||||
{
|
{
|
||||||
mIns.Push(NativeCodeInstruction(iins, ASMIT_LDX, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[iins->mSrc[0].mTemp]));
|
mIns.Push(NativeCodeInstruction(iins, ASMIT_LDX, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[iins->mSrc[0].mTemp]));
|
||||||
int address = iins->mSrc[1].mIntConst + rins->mSrc[0].mIntConst;
|
int address = int(iins->mSrc[1].mIntConst + rins->mSrc[0].mIntConst);
|
||||||
|
|
||||||
uint32 flags = NCIF_LOWER | NCIF_UPPER;
|
uint32 flags = NCIF_LOWER | NCIF_UPPER;
|
||||||
if (rins->mVolatile)
|
if (rins->mVolatile)
|
||||||
|
@ -5950,7 +5950,7 @@ void NativeCodeBasicBlock::LoadAbsoluteByteIndexedValue(InterCodeProcedure* proc
|
||||||
void NativeCodeBasicBlock::StoreAbsoluteByteIndexedValue(InterCodeProcedure* proc, const InterInstruction* iins, const InterInstruction* wins)
|
void NativeCodeBasicBlock::StoreAbsoluteByteIndexedValue(InterCodeProcedure* proc, const InterInstruction* iins, const InterInstruction* wins)
|
||||||
{
|
{
|
||||||
mIns.Push(NativeCodeInstruction(iins, ASMIT_LDX, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[iins->mSrc[0].mTemp]));
|
mIns.Push(NativeCodeInstruction(iins, ASMIT_LDX, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[iins->mSrc[0].mTemp]));
|
||||||
int address = iins->mSrc[1].mIntConst + wins->mSrc[1].mIntConst;
|
int address = int(iins->mSrc[1].mIntConst + wins->mSrc[1].mIntConst);
|
||||||
|
|
||||||
uint32 flags = NCIF_LOWER | NCIF_UPPER;
|
uint32 flags = NCIF_LOWER | NCIF_UPPER;
|
||||||
if (wins->mVolatile)
|
if (wins->mVolatile)
|
||||||
|
@ -7037,7 +7037,7 @@ void NativeCodeBasicBlock::LoadValueToReg(InterCodeProcedure* proc, const InterI
|
||||||
|
|
||||||
for (int i = 0; i < size; i++)
|
for (int i = 0; i < size; i++)
|
||||||
{
|
{
|
||||||
CheckFrameIndex(ins, areg, index, i * stride);
|
CheckFrameIndex(ins, areg, index, 1);
|
||||||
if (reg == areg)
|
if (reg == areg)
|
||||||
accu = true;
|
accu = true;
|
||||||
|
|
||||||
|
@ -7287,7 +7287,7 @@ NativeCodeBasicBlock * NativeCodeBasicBlock::CopyValue(InterCodeProcedure* proc,
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int sreg, dreg;
|
int sreg, dreg;
|
||||||
|
int si = 0, di = 0;
|
||||||
|
|
||||||
if (ins->mSrc[0].mTemp < 0)
|
if (ins->mSrc[0].mTemp < 0)
|
||||||
{
|
{
|
||||||
|
@ -7330,14 +7330,22 @@ NativeCodeBasicBlock * NativeCodeBasicBlock::CopyValue(InterCodeProcedure* proc,
|
||||||
else if (ins->mSrc[0].mIntConst != 0)
|
else if (ins->mSrc[0].mIntConst != 0)
|
||||||
{
|
{
|
||||||
int index = int(ins->mSrc[0].mIntConst);
|
int index = int(ins->mSrc[0].mIntConst);
|
||||||
mIns.Push(NativeCodeInstruction(ins, ASMIT_CLC, ASMIM_IMPLIED));
|
if (size <= msize && (size - 1) * sstride + 1 + index <= 256)
|
||||||
mIns.Push(NativeCodeInstruction(ins, ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]));
|
{
|
||||||
mIns.Push(NativeCodeInstruction(ins, ASMIT_ADC, ASMIM_IMMEDIATE, index & 0xff));
|
si = index;
|
||||||
mIns.Push(NativeCodeInstruction(ins, ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU));
|
sreg = BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp];
|
||||||
mIns.Push(NativeCodeInstruction(ins, ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 1));
|
}
|
||||||
mIns.Push(NativeCodeInstruction(ins, ASMIT_ADC, ASMIM_IMMEDIATE, (index >> 8) & 0xff));
|
else
|
||||||
mIns.Push(NativeCodeInstruction(ins, ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 1));
|
{
|
||||||
sreg = BC_REG_ACCU;
|
mIns.Push(NativeCodeInstruction(ins, ASMIT_CLC, ASMIM_IMPLIED));
|
||||||
|
mIns.Push(NativeCodeInstruction(ins, ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp]));
|
||||||
|
mIns.Push(NativeCodeInstruction(ins, ASMIT_ADC, ASMIM_IMMEDIATE, index & 0xff));
|
||||||
|
mIns.Push(NativeCodeInstruction(ins, ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU));
|
||||||
|
mIns.Push(NativeCodeInstruction(ins, ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[0].mTemp] + 1));
|
||||||
|
mIns.Push(NativeCodeInstruction(ins, ASMIT_ADC, ASMIM_IMMEDIATE, (index >> 8) & 0xff));
|
||||||
|
mIns.Push(NativeCodeInstruction(ins, ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 1));
|
||||||
|
sreg = BC_REG_ACCU;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (size * sstride > 256 && !ins->mSrc[0].mFinal)
|
else if (size * sstride > 256 && !ins->mSrc[0].mFinal)
|
||||||
{
|
{
|
||||||
|
@ -7406,14 +7414,22 @@ NativeCodeBasicBlock * NativeCodeBasicBlock::CopyValue(InterCodeProcedure* proc,
|
||||||
else if (ins->mSrc[1].mIntConst != 0)
|
else if (ins->mSrc[1].mIntConst != 0)
|
||||||
{
|
{
|
||||||
int index = int(ins->mSrc[1].mIntConst);
|
int index = int(ins->mSrc[1].mIntConst);
|
||||||
mIns.Push(NativeCodeInstruction(ins, ASMIT_CLC, ASMIM_IMPLIED));
|
if (size <= msize && (size - 1) * dstride + 1 + index <= 256)
|
||||||
mIns.Push(NativeCodeInstruction(ins, ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp]));
|
{
|
||||||
mIns.Push(NativeCodeInstruction(ins, ASMIT_ADC, ASMIM_IMMEDIATE, index & 0xff));
|
di = index;
|
||||||
mIns.Push(NativeCodeInstruction(ins, ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ADDR));
|
dreg = BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp];
|
||||||
mIns.Push(NativeCodeInstruction(ins, ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + 1));
|
}
|
||||||
mIns.Push(NativeCodeInstruction(ins, ASMIT_ADC, ASMIM_IMMEDIATE, (index >> 8) & 0xff));
|
else
|
||||||
mIns.Push(NativeCodeInstruction(ins, ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ADDR + 1));
|
{
|
||||||
dreg = BC_REG_ADDR;
|
mIns.Push(NativeCodeInstruction(ins, ASMIT_CLC, ASMIM_IMPLIED));
|
||||||
|
mIns.Push(NativeCodeInstruction(ins, ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp]));
|
||||||
|
mIns.Push(NativeCodeInstruction(ins, ASMIT_ADC, ASMIM_IMMEDIATE, index & 0xff));
|
||||||
|
mIns.Push(NativeCodeInstruction(ins, ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ADDR));
|
||||||
|
mIns.Push(NativeCodeInstruction(ins, ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[1].mTemp] + 1));
|
||||||
|
mIns.Push(NativeCodeInstruction(ins, ASMIT_ADC, ASMIM_IMMEDIATE, (index >> 8) & 0xff));
|
||||||
|
mIns.Push(NativeCodeInstruction(ins, ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ADDR + 1));
|
||||||
|
dreg = BC_REG_ADDR;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (size * dstride > 256 && !ins->mSrc[1].mFinal)
|
else if (size * dstride > 256 && !ins->mSrc[1].mFinal)
|
||||||
{
|
{
|
||||||
|
@ -7430,8 +7446,6 @@ NativeCodeBasicBlock * NativeCodeBasicBlock::CopyValue(InterCodeProcedure* proc,
|
||||||
|
|
||||||
if (size <= msize)
|
if (size <= msize)
|
||||||
{
|
{
|
||||||
int si = 0;
|
|
||||||
int di = 0;
|
|
||||||
for (int i = 0; i < size; i++)
|
for (int i = 0; i < size; i++)
|
||||||
{
|
{
|
||||||
mIns.Push(NativeCodeInstruction(ins, ASMIT_LDY, ASMIM_IMMEDIATE, si));
|
mIns.Push(NativeCodeInstruction(ins, ASMIT_LDY, ASMIM_IMMEDIATE, si));
|
||||||
|
@ -16670,6 +16684,30 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
else if (i + 4 == mIns.Size() &&
|
||||||
|
mIns[i + 0].mType == ASMIT_LDA &&
|
||||||
|
mIns[i + 1].mType == ASMIT_CLC &&
|
||||||
|
mIns[i + 2].mType == ASMIT_ADC && mIns[i + 2].mMode == ASMIM_IMMEDIATE && mIns[i + 2].mAddress == 1 &&
|
||||||
|
mIns[i + 3].mType == ASMIT_STA && mIns[i + 0].SameEffectiveAddress(mIns[i + 3]) &&
|
||||||
|
!(mIns[i + 3].mLive & LIVE_CPU_REG_A) &&
|
||||||
|
mExitRequiredRegs.Size() && !mExitRequiredRegs[CPU_REG_C] &&
|
||||||
|
(mBranch == ASMIT_BCC || mBranch == ASMIT_BCS))
|
||||||
|
{
|
||||||
|
mIns[i + 3].mType = ASMIT_INC;
|
||||||
|
mIns[i + 3].mLive |= LIVE_CPU_REG_Z;
|
||||||
|
mIns[i + 0].mType = ASMIT_NOP; mIns[i + 0].mMode = ASMIM_IMPLIED;
|
||||||
|
mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED;
|
||||||
|
mIns[i + 2].mType = ASMIT_NOP; mIns[i + 2].mMode = ASMIM_IMPLIED;
|
||||||
|
|
||||||
|
if (mBranch == ASMIT_BCC)
|
||||||
|
mBranch = ASMIT_BNE;
|
||||||
|
else
|
||||||
|
mBranch = ASMIT_BEQ;
|
||||||
|
|
||||||
|
changed = true;
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
#if 1
|
#if 1
|
||||||
if (i + 6 < mIns.Size())
|
if (i + 6 < mIns.Size())
|
||||||
|
@ -17873,6 +17911,31 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (mIns.Size() >= 3 && mFalseJump && mBranch == ASMIT_BCC && mExitRequiredRegs.Size())
|
||||||
|
{
|
||||||
|
int sz = mIns.Size();
|
||||||
|
if (mIns[sz - 3].mType == ASMIT_LDA &&
|
||||||
|
mIns[sz - 2].mType == ASMIT_ADC && mIns[sz - 2].mMode == ASMIM_IMMEDIATE && mIns[sz - 2].mAddress == 0 &&
|
||||||
|
mIns[sz - 1].mType == ASMIT_STA && mIns[sz - 1].SameEffectiveAddress(mIns[sz - 3]) &&
|
||||||
|
HasAsmInstructionMode(ASMIT_INC, mIns[sz - 1].mMode) &&
|
||||||
|
!(mIns[sz - 1].mLive & LIVE_CPU_REG_A) && !mExitRequiredRegs[CPU_REG_C])
|
||||||
|
{
|
||||||
|
NativeCodeBasicBlock* tblock = this->SplitAt(sz - 3);
|
||||||
|
|
||||||
|
tblock->mBranch = ASMIT_BNE;
|
||||||
|
tblock->mIns[0].mType = ASMIT_INC;
|
||||||
|
tblock->mIns.SetSize(1);
|
||||||
|
|
||||||
|
mBranch = ASMIT_BCC;
|
||||||
|
mFalseJump = tblock;
|
||||||
|
mTrueJump = tblock->mTrueJump;
|
||||||
|
mTrueJump->mNumEntries++;
|
||||||
|
mTrueJump->mEntryBlocks.Push(this);
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
if (mIns.Size() >= 8 && mFalseJump && (mBranch == ASMIT_BNE || mBranch == ASMIT_BEQ))
|
if (mIns.Size() >= 8 && mFalseJump && (mBranch == ASMIT_BNE || mBranch == ASMIT_BEQ))
|
||||||
{
|
{
|
||||||
int sz = mIns.Size();
|
int sz = mIns.Size();
|
||||||
|
@ -27210,7 +27273,7 @@ bool NativeCodeBasicBlock::ReplaceFinalZeroPageUse(NativeCodeProcedure* nproc)
|
||||||
mIns[i + 2].mAddress >= BC_REG_TMP)
|
mIns[i + 2].mAddress >= BC_REG_TMP)
|
||||||
{
|
{
|
||||||
nproc->ResetPatched();
|
nproc->ResetPatched();
|
||||||
if (IsFinalZeroPageUse(this, i + 6, mIns[i + 2].mAddress, mIns[i + 0].mAddress, true, false))
|
if (IsFinalZeroPageUse(this, i + 6, mIns[i + 2].mAddress, mIns[i + 0].mAddress, true, true))
|
||||||
{
|
{
|
||||||
nproc->ResetPatched();
|
nproc->ResetPatched();
|
||||||
if (ForwardReplaceZeroPage(i + 6, mIns[i + 2].mAddress, mIns[i + 0].mAddress, true))
|
if (ForwardReplaceZeroPage(i + 6, mIns[i + 2].mAddress, mIns[i + 0].mAddress, true))
|
||||||
|
@ -27236,7 +27299,7 @@ bool NativeCodeBasicBlock::ReplaceFinalZeroPageUse(NativeCodeProcedure* nproc)
|
||||||
mIns[i + 1].mAddress >= BC_REG_TMP)
|
mIns[i + 1].mAddress >= BC_REG_TMP)
|
||||||
{
|
{
|
||||||
nproc->ResetPatched();
|
nproc->ResetPatched();
|
||||||
if (IsFinalZeroPageUse(this, i + 5, mIns[i + 1].mAddress, mIns[i + 0].mAddress, true, false))
|
if (IsFinalZeroPageUse(this, i + 5, mIns[i + 1].mAddress, mIns[i + 0].mAddress, true, true))
|
||||||
{
|
{
|
||||||
nproc->ResetPatched();
|
nproc->ResetPatched();
|
||||||
if (ForwardReplaceZeroPage(i + 5, mIns[i + 1].mAddress, mIns[i + 0].mAddress, true))
|
if (ForwardReplaceZeroPage(i + 5, mIns[i + 1].mAddress, mIns[i + 0].mAddress, true))
|
||||||
|
@ -42726,7 +42789,7 @@ void NativeCodeProcedure::Compile(InterCodeProcedure* proc)
|
||||||
{
|
{
|
||||||
mInterProc = proc;
|
mInterProc = proc;
|
||||||
|
|
||||||
CheckFunc = !strcmp(mInterProc->mIdent->mString, "interpret_builtin");
|
CheckFunc = !strcmp(mInterProc->mIdent->mString, "interpret_expression");
|
||||||
|
|
||||||
int nblocks = proc->mBlocks.Size();
|
int nblocks = proc->mBlocks.Size();
|
||||||
tblocks = new NativeCodeBasicBlock * [nblocks];
|
tblocks = new NativeCodeBasicBlock * [nblocks];
|
||||||
|
@ -43519,13 +43582,13 @@ void NativeCodeProcedure::Optimize(void)
|
||||||
mEntryBlock->CheckBlocks();
|
mEntryBlock->CheckBlocks();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#if 1
|
#if 1
|
||||||
ResetVisited();
|
ResetVisited();
|
||||||
if (mEntryBlock->PeepHoleOptimizer(this, step))
|
if (mEntryBlock->PeepHoleOptimizer(this, step))
|
||||||
changed = true;
|
changed = true;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (step == 2)
|
if (step == 2)
|
||||||
{
|
{
|
||||||
ResetVisited();
|
ResetVisited();
|
||||||
|
|
Loading…
Reference in New Issue