Fix move of 16 bit shft lower part across carry boundary

This commit is contained in:
drmortalwombat 2022-08-06 18:45:37 +02:00
parent f0deaab394
commit 4d274f46d7

View File

@ -12024,7 +12024,7 @@ bool NativeCodeBasicBlock::MoveAccuTrainsUp(void)
{ {
if (mIns[i].mType == ASMIT_STA && mIns[i].mMode == ASMIM_ZERO_PAGE) if (mIns[i].mType == ASMIT_STA && mIns[i].mMode == ASMIM_ZERO_PAGE)
{ {
if (mIns[i].mLive & (LIVE_CPU_REG_A | LIVE_CPU_REG_Z)) if (mIns[i].mLive & (LIVE_CPU_REG_A | LIVE_CPU_REG_C | LIVE_CPU_REG_Z))
wzero -= mIns[i].mAddress; wzero -= mIns[i].mAddress;
else else
wzero += mIns[i].mAddress; wzero += mIns[i].mAddress;
@ -17871,7 +17871,7 @@ bool NativeCodeBasicBlock::MoveLoadAddImmStoreUp(int at)
{ {
if (mIns[j].mType == ASMIT_STA && mIns[j].mMode == ASMIM_ZERO_PAGE && mIns[j].mAddress == mIns[at + 1].mAddress) if (mIns[j].mType == ASMIT_STA && mIns[j].mMode == ASMIM_ZERO_PAGE && mIns[j].mAddress == mIns[at + 1].mAddress)
{ {
if (mIns[j].mLive & LIVE_CPU_REG_A) if (mIns[j].mLive & (LIVE_CPU_REG_A | LIVE_CPU_REG_C))
return false; return false;
for (int i = j + 1; i < at; i++) for (int i = j + 1; i < at; i++)
@ -17912,7 +17912,7 @@ bool NativeCodeBasicBlock::MoveCLCLoadAddZPStoreUp(int at)
{ {
if (mIns[j].mType == ASMIT_STA && mIns[j].mMode == ASMIM_ZERO_PAGE && mIns[j].mAddress == mIns[at + 1].mAddress) if (mIns[j].mType == ASMIT_STA && mIns[j].mMode == ASMIM_ZERO_PAGE && mIns[j].mAddress == mIns[at + 1].mAddress)
{ {
if (mIns[j].mLive & LIVE_CPU_REG_A) if (mIns[j].mLive & (LIVE_CPU_REG_A | LIVE_CPU_REG_C))
return false; return false;
for (int i = j + 1; i < at; i++) for (int i = j + 1; i < at; i++)
@ -18027,7 +18027,7 @@ bool NativeCodeBasicBlock::MoveLoadShiftStoreUp(int at)
return true; return true;
} }
if (mIns[at + 1].RequiresCarry() && mIns[j].ChangesCarry()) if ((mIns[at + 1].RequiresCarry() || (mIns[at + 2].mLive & LIVE_CPU_REG_C) != 0) && mIns[j].ChangesCarry())
return false; return false;
if (mIns[j].ChangesZeroPage(mIns[at + 0].mAddress)) if (mIns[j].ChangesZeroPage(mIns[at + 0].mAddress))
return false; return false;
@ -21704,6 +21704,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(NativeCodeProcedure* proc, int pass
changed = true; changed = true;
} }
#endif #endif
#if 1
else if ( else if (
mIns[i + 0].mType == ASMIT_LDA && mIns[i + 0].mMode == ASMIM_ZERO_PAGE && mIns[i + 0].mType == ASMIT_LDA && mIns[i + 0].mMode == ASMIM_ZERO_PAGE &&
(mIns[i + 1].mType == ASMIT_LSR || mIns[i + 1].mType == ASMIT_ASL) && mIns[i + 1].mMode == ASMIM_IMPLIED && (mIns[i + 1].mType == ASMIT_LSR || mIns[i + 1].mType == ASMIT_ASL) && mIns[i + 1].mMode == ASMIM_IMPLIED &&
@ -21712,6 +21713,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(NativeCodeProcedure* proc, int pass
if (MoveLoadShiftRotateUp(i)) if (MoveLoadShiftRotateUp(i))
changed = true; changed = true;
} }
#endif
} }
CheckLive(); CheckLive();