Fix broken volatile check in (),y

This commit is contained in:
drmortalwombat 2023-03-11 11:29:35 +01:00
parent aed086bdb9
commit 7d6f637948
2 changed files with 50 additions and 50 deletions

View File

@ -1984,6 +1984,7 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr
ins->mSrc[0] = ins->mSrc[1]; ins->mSrc[0] = ins->mSrc[1];
ins->mSrc[1].mTemp = -1; ins->mSrc[1].mTemp = -1;
ins->mSrc[1].mType = IT_NONE; ins->mSrc[1].mType = IT_NONE;
ins->mNumOperands = 1;
UpdateValue(ins, tvalue, aliasedLocals, aliasedParams, staticVars); UpdateValue(ins, tvalue, aliasedLocals, aliasedParams, staticVars);
@ -2024,6 +2025,7 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr
ins->mOperator = IA_NEG; ins->mOperator = IA_NEG;
ins->mSrc[1].mTemp = -1; ins->mSrc[1].mTemp = -1;
ins->mSrc[1].mType = IT_NONE; ins->mSrc[1].mType = IT_NONE;
ins->mNumOperands = 1;
UpdateValue(ins, tvalue, aliasedLocals, aliasedParams, staticVars); UpdateValue(ins, tvalue, aliasedLocals, aliasedParams, staticVars);
@ -2034,6 +2036,7 @@ void ValueSet::UpdateValue(InterInstruction * ins, const GrowingInstructionPtrAr
ins->mCode = IC_UNARY_OPERATOR; ins->mCode = IC_UNARY_OPERATOR;
ins->mOperator = IA_NEG; ins->mOperator = IA_NEG;
ins->mSrc[1].mTemp = -1; ins->mSrc[1].mTemp = -1;
ins->mNumOperands = 1;
UpdateValue(ins, tvalue, aliasedLocals, aliasedParams, staticVars); UpdateValue(ins, tvalue, aliasedLocals, aliasedParams, staticVars);

View File

@ -3702,66 +3702,63 @@ bool NativeCodeInstruction::ValueForwarding(NativeRegisterDataSet& data, AsmInsT
} }
else if (mMode == ASMIM_INDIRECT_Y) 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; if (data.mRegs[CPU_REG_A].mMode == NRDM_INDIRECT_Y && data.mRegs[CPU_REG_A].mValue == mAddress)
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 (mLive & LIVE_CPU_REG_Z)
{ {
if (mLive & LIVE_CPU_REG_Z) mType = ASMIT_ORA;
{ mMode = ASMIM_IMMEDIATE;
mType = ASMIT_ORA; mAddress = 0;
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;
} }
else else
{ {
data.mRegs[CPU_REG_A].mMode = NRDM_INDIRECT_Y; mType = ASMIT_NOP;
data.mRegs[CPU_REG_A].mValue = mAddress; mMode = ASMIM_IMPLIED;
data.mRegs[CPU_REG_A].mFlags = mFlags;
} }
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 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()) if (ChangesAddress())
@ -37341,7 +37338,7 @@ void NativeCodeProcedure::RebuildEntry(void)
void NativeCodeProcedure::Optimize(void) void NativeCodeProcedure::Optimize(void)
{ {
CheckFunc = !strcmp(mInterProc->mIdent->mString, "mmc3_bank_prg"); CheckFunc = !strcmp(mInterProc->mIdent->mString, "diggers_list");
#if 1 #if 1
int step = 0; int step = 0;