From 4aa82d539bb491f7f3e6cbbcc35b46d5404d357e Mon Sep 17 00:00:00 2001 From: drmortalwombat <90205530+drmortalwombat@users.noreply.github.com> Date: Wed, 29 Sep 2021 17:34:38 +0200 Subject: [PATCH] Optimize pointer increment dereference combos --- oscar64/Disassembler.cpp | 2 +- oscar64/InterCode.cpp | 10 ++++++++++ oscar64/NativeCodeGenerator.cpp | 10 ++++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/oscar64/Disassembler.cpp b/oscar64/Disassembler.cpp index 394c91a..403c3ff 100644 --- a/oscar64/Disassembler.cpp +++ b/oscar64/Disassembler.cpp @@ -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; } } diff --git a/oscar64/InterCode.cpp b/oscar64/InterCode.cpp index f4aec16..6cdbb19 100644 --- a/oscar64/InterCode.cpp +++ b/oscar64/InterCode.cpp @@ -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]; + } } } diff --git a/oscar64/NativeCodeGenerator.cpp b/oscar64/NativeCodeGenerator.cpp index 4e96ebe..750c5b9 100644 --- a/oscar64/NativeCodeGenerator.cpp +++ b/oscar64/NativeCodeGenerator.cpp @@ -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))