From 1b8e1f40488f57fc5350c27f46c81370d441af01 Mon Sep 17 00:00:00 2001 From: drmortalwombat <90205530+drmortalwombat@users.noreply.github.com> Date: Mon, 30 May 2022 22:28:36 +0200 Subject: [PATCH] Optimize cmp#0 always has carry set --- oscar64/NativeCodeGenerator.cpp | 78 +++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) diff --git a/oscar64/NativeCodeGenerator.cpp b/oscar64/NativeCodeGenerator.cpp index ad04070..dbce3d9 100644 --- a/oscar64/NativeCodeGenerator.cpp +++ b/oscar64/NativeCodeGenerator.cpp @@ -1640,6 +1640,12 @@ void NativeCodeInstruction::Simulate(NativeRegisterDataSet& data) data.mRegs[CPU_REG_Z].Reset(); } } + else if (mMode == ASMIM_IMMEDIATE && mAddress == 0) + { + data.mRegs[CPU_REG_C].mValue = 1; + data.mRegs[CPU_REG_C].mMode = NRDM_IMMEDIATE; + data.mRegs[CPU_REG_Z].Reset(); + } else { data.mRegs[CPU_REG_C].Reset(); @@ -1664,6 +1670,12 @@ void NativeCodeInstruction::Simulate(NativeRegisterDataSet& data) data.mRegs[CPU_REG_Z].Reset(); } } + else if (mMode == ASMIM_IMMEDIATE && mAddress == 0) + { + data.mRegs[CPU_REG_C].mValue = 1; + data.mRegs[CPU_REG_C].mMode = NRDM_IMMEDIATE; + data.mRegs[CPU_REG_Z].Reset(); + } else { data.mRegs[CPU_REG_C].Reset(); @@ -1688,6 +1700,12 @@ void NativeCodeInstruction::Simulate(NativeRegisterDataSet& data) data.mRegs[CPU_REG_Z].Reset(); } } + else if (mMode == ASMIM_IMMEDIATE && mAddress == 0) + { + data.mRegs[CPU_REG_C].mValue = 1; + data.mRegs[CPU_REG_C].mMode = NRDM_IMMEDIATE; + data.mRegs[CPU_REG_Z].Reset(); + } else { data.mRegs[CPU_REG_C].Reset(); @@ -11967,6 +11985,36 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc) { if (mBranch == ASMIT_BEQ) { + if (mIns[sz - 1].mMode == ASMIM_IMMEDIATE && mIns[sz - 1].mAddress == 0) + { + if (mFalseJump->mIns.Size() == 0) + { + if (mFalseJump->mBranch == ASMIT_BCC) + { + mFalseJump = mFalseJump->mFalseJump; + changed = true; + } + else if (mFalseJump->mBranch == ASMIT_BCS) + { + mFalseJump = mFalseJump->mTrueJump; + changed = true; + } + } + if (mTrueJump->mIns.Size() == 0) + { + if (mTrueJump->mBranch == ASMIT_BCC) + { + mTrueJump = mTrueJump->mFalseJump; + changed = true; + } + else if (mTrueJump->mBranch == ASMIT_BCS) + { + mTrueJump = mTrueJump->mTrueJump; + changed = true; + } + } + } + if (mFalseJump->mNumEntries == 1 && mTrueJump->mNumEntries == 2 && mFalseJump->mIns.Size() == 0) { if (mFalseJump->mBranch == ASMIT_BCC) @@ -11991,6 +12039,36 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc) } else if (mBranch == ASMIT_BNE) { + if (mIns[sz - 1].mMode == ASMIM_IMMEDIATE && mIns[sz - 1].mAddress == 0) + { + if (mFalseJump->mIns.Size() == 0) + { + if (mFalseJump->mBranch == ASMIT_BCC) + { + mFalseJump = mFalseJump->mFalseJump; + changed = true; + } + else if (mFalseJump->mBranch == ASMIT_BCS) + { + mFalseJump = mFalseJump->mTrueJump; + changed = true; + } + } + if (mTrueJump->mIns.Size() == 0) + { + if (mTrueJump->mBranch == ASMIT_BCC) + { + mTrueJump = mTrueJump->mFalseJump; + changed = true; + } + else if (mTrueJump->mBranch == ASMIT_BCS) + { + mTrueJump = mTrueJump->mTrueJump; + changed = true; + } + } + } + if (mTrueJump->mNumEntries == 1 && mFalseJump->mNumEntries == 2 && mTrueJump->mIns.Size() == 0) { if (mTrueJump->mBranch == ASMIT_BCC)