Optimize pointer increment dereference combos

This commit is contained in:
drmortalwombat 2021-09-29 17:34:38 +02:00
parent ef5cb81a18
commit 4aa82d539b
3 changed files with 21 additions and 1 deletions

View File

@ -628,7 +628,7 @@ void NativeCodeDisassembler::Disassemble(FILE* file, const uint8* memory, int st
addr = addr + ip - 256;
else
addr = addr + ip;
fprintf(file, "%04x : %02x %02x __ %s $%02x\n", iip, memory[iip], memory[iip + 1], AsmInstructionNames[d.mType], addr);
fprintf(file, "%04x : %02x %02x __ %s $%04x\n", iip, memory[iip], memory[iip + 1], AsmInstructionNames[d.mType], addr);
break;
}
}

View File

@ -1804,6 +1804,16 @@ static void OptimizeAddress(InterInstruction * ins, const GrowingInstructionPtrA
ins->mSIntConst[offset] = ains->mSIntConst[0];
ins->mSTemp[offset] = ains->mSTemp[1];
}
else if (ains->mCode == IC_BINARY_OPERATOR && ains->mOperator == IA_ADD && ains->mSTemp[0] < 0 && ains->mSTemp[1] >= 0 && tvalue[ains->mSTemp[1]] && ains->mSIntConst[0] >= 0)
{
ins->mSIntConst[offset] = ains->mSIntConst[0];
ins->mSTemp[offset] = ains->mSTemp[1];
}
else if (ains->mCode == IC_BINARY_OPERATOR && ains->mOperator == IA_ADD && ains->mSTemp[1] < 0 && ains->mSTemp[0] >= 0 && tvalue[ains->mSTemp[0]] && ains->mSIntConst[1] >= 0)
{
ins->mSIntConst[offset] = ains->mSIntConst[1];
ins->mSTemp[offset] = ains->mSTemp[0];
}
}
}

View File

@ -5645,6 +5645,16 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(void)
mIns[i + 1].mType = ASMIT_LSR;
progress = true;
}
else if (mIns[i].mType == ASMIT_CLC && mIns[i + 1].mType == ASMIT_ADC && mIns[i + 1].mMode == ASMIM_IMMEDIATE && mIns[i + 1].mAddress == 0 && !(mIns[i + 1].mLive & LIVE_CPU_REG_Z))
{
mIns[i + 1].mType = ASMIT_NOP;
progress = true;
}
else if (mIns[i].mType == ASMIT_SEC && mIns[i + 1].mType == ASMIT_SBC && mIns[i + 1].mMode == ASMIM_IMMEDIATE && mIns[i + 1].mAddress == 0 && !(mIns[i + 1].mLive & LIVE_CPU_REG_Z))
{
mIns[i + 1].mType = ASMIT_NOP;
progress = true;
}
else if (
mIns[i + 0].mType == ASMIT_STA && mIns[i + 0].mMode == ASMIM_ZERO_PAGE && mIns[i + 1].mMode == ASMIM_ZERO_PAGE && mIns[i].mAddress == mIns[i + 1].mAddress &&
(mIns[i + 1].mType == ASMIT_LSR || mIns[i + 1].mType == ASMIT_ASL || mIns[i + 1].mType == ASMIT_ROL || mIns[i + 1].mType == ASMIT_ROR))