Fix broken volatile check in (),y
This commit is contained in:
parent
aed086bdb9
commit
7d6f637948
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue