diff --git a/oscar64/InterCode.cpp b/oscar64/InterCode.cpp index 6a5ab98..b0caa94 100644 --- a/oscar64/InterCode.cpp +++ b/oscar64/InterCode.cpp @@ -1984,6 +1984,7 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr ins->mSrc[0] = ins->mSrc[1]; ins->mSrc[1].mTemp = -1; ins->mSrc[1].mType = IT_NONE; + ins->mNumOperands = 1; UpdateValue(ins, tvalue, aliasedLocals, aliasedParams, staticVars); @@ -2024,6 +2025,7 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr ins->mOperator = IA_NEG; ins->mSrc[1].mTemp = -1; ins->mSrc[1].mType = IT_NONE; + ins->mNumOperands = 1; UpdateValue(ins, tvalue, aliasedLocals, aliasedParams, staticVars); @@ -2034,6 +2036,7 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr ins->mCode = IC_UNARY_OPERATOR; ins->mOperator = IA_NEG; ins->mSrc[1].mTemp = -1; + ins->mNumOperands = 1; UpdateValue(ins, tvalue, aliasedLocals, aliasedParams, staticVars); diff --git a/oscar64/NativeCodeGenerator.cpp b/oscar64/NativeCodeGenerator.cpp index 94b7bf5..a865f4c 100644 --- a/oscar64/NativeCodeGenerator.cpp +++ b/oscar64/NativeCodeGenerator.cpp @@ -3702,66 +3702,63 @@ bool NativeCodeInstruction::ValueForwarding(NativeRegisterDataSet& data, AsmInsT } else if (mMode == ASMIM_INDIRECT_Y) { - if (!(mFlags & NCIF_VOLATILE)) + if (data.mRegs[mAddress].mMode == NRDM_ZERO_PAGE && data.mRegs[mAddress + 1].mMode == NRDM_ZERO_PAGE && data.mRegs[mAddress].mValue + 1 == data.mRegs[mAddress + 1].mValue) { - if (data.mRegs[mAddress].mMode == NRDM_ZERO_PAGE && data.mRegs[mAddress + 1].mMode == NRDM_ZERO_PAGE && data.mRegs[mAddress].mValue + 1 == data.mRegs[mAddress + 1].mValue) + mFlags |= NICT_ZPFLIPPED; + mAddress = data.mRegs[mAddress].mValue; + if (mType == ASMIT_LDA) + data.mRegs[CPU_REG_A].Reset(); + } + else if (data.mRegs[mAddress].mMode == NRDM_IMMEDIATE_ADDRESS && data.mRegs[mAddress + 1].mMode == NRDM_IMMEDIATE_ADDRESS && data.mRegs[mAddress].mLinkerObject == data.mRegs[mAddress + 1].mLinkerObject) + { + mMode = ASMIM_ABSOLUTE_Y; + mLinkerObject = data.mRegs[mAddress].mLinkerObject; + mAddress = data.mRegs[mAddress + 1].mValue; + if (mType == ASMIT_LDA) + data.mRegs[CPU_REG_A].Reset(); + } + else if (mType == ASMIT_LDA) + { + if (!(mFlags & NCIF_VOLATILE)) { - mFlags |= NICT_ZPFLIPPED; - mAddress = data.mRegs[mAddress].mValue; - if (mType == ASMIT_LDA) - data.mRegs[CPU_REG_A].Reset(); - } - else if (data.mRegs[mAddress].mMode == NRDM_IMMEDIATE_ADDRESS && data.mRegs[mAddress + 1].mMode == NRDM_IMMEDIATE_ADDRESS && data.mRegs[mAddress].mLinkerObject == data.mRegs[mAddress + 1].mLinkerObject) - { - mMode = ASMIM_ABSOLUTE_Y; - mLinkerObject = data.mRegs[mAddress].mLinkerObject; - mAddress = data.mRegs[mAddress + 1].mValue; - if (mType == ASMIT_LDA) - data.mRegs[CPU_REG_A].Reset(); - } - else if (mType == ASMIT_LDA) - { - if (!(mFlags & NCIF_VOLATILE)) + if (data.mRegs[CPU_REG_A].mMode == NRDM_INDIRECT_Y && data.mRegs[CPU_REG_A].mValue == mAddress) { - if (data.mRegs[CPU_REG_A].mMode == NRDM_INDIRECT_Y && data.mRegs[CPU_REG_A].mValue == mAddress) + if (mLive & LIVE_CPU_REG_Z) { - if (mLive & LIVE_CPU_REG_Z) - { - mType = ASMIT_ORA; - mMode = ASMIM_IMMEDIATE; - mAddress = 0; - } - else - { - mType = ASMIT_NOP; - mMode = ASMIM_IMPLIED; - } - changed = true; - } - else if (data.mRegs[CPU_REG_X].SameData(*this)) - { - mType = ASMIT_TXA; - mMode = ASMIM_IMPLIED; - data.mRegs[CPU_REG_A] = data.mRegs[CPU_REG_X]; - changed = true; - } - else if (data.mRegs[CPU_REG_Y].SameData(*this)) - { - mType = ASMIT_TYA; - mMode = ASMIM_IMPLIED; - data.mRegs[CPU_REG_A] = data.mRegs[CPU_REG_Y]; - changed = true; + mType = ASMIT_ORA; + mMode = ASMIM_IMMEDIATE; + mAddress = 0; } else { - data.mRegs[CPU_REG_A].mMode = NRDM_INDIRECT_Y; - data.mRegs[CPU_REG_A].mValue = mAddress; - data.mRegs[CPU_REG_A].mFlags = mFlags; + mType = ASMIT_NOP; + mMode = ASMIM_IMPLIED; } + changed = true; + } + else if (data.mRegs[CPU_REG_X].SameData(*this)) + { + mType = ASMIT_TXA; + mMode = ASMIM_IMPLIED; + data.mRegs[CPU_REG_A] = data.mRegs[CPU_REG_X]; + changed = true; + } + else if (data.mRegs[CPU_REG_Y].SameData(*this)) + { + mType = ASMIT_TYA; + mMode = ASMIM_IMPLIED; + data.mRegs[CPU_REG_A] = data.mRegs[CPU_REG_Y]; + changed = true; } else - data.mRegs[CPU_REG_A].Reset(); + { + data.mRegs[CPU_REG_A].mMode = NRDM_INDIRECT_Y; + data.mRegs[CPU_REG_A].mValue = mAddress; + data.mRegs[CPU_REG_A].mFlags = mFlags; + } } + else + data.mRegs[CPU_REG_A].Reset(); } if (ChangesAddress()) @@ -37341,7 +37338,7 @@ void NativeCodeProcedure::RebuildEntry(void) void NativeCodeProcedure::Optimize(void) { - CheckFunc = !strcmp(mInterProc->mIdent->mString, "mmc3_bank_prg"); + CheckFunc = !strcmp(mInterProc->mIdent->mString, "diggers_list"); #if 1 int step = 0;