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[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);

View File

@ -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;