Fix volatile violation when recycling immediates
This commit is contained in:
parent
2cdc95ba05
commit
0184a550c5
|
@ -16708,6 +16708,7 @@ bool NativeCodeBasicBlock::MoveImmediateStoreUp(int at)
|
||||||
{
|
{
|
||||||
bool usex = mIns[at + 1].mMode == ASMIM_ABSOLUTE_X || mIns[at + 1].mMode == ASMIM_INDIRECT_X || mIns[at + 1].mMode == ASMIM_ZERO_PAGE_X;
|
bool usex = mIns[at + 1].mMode == ASMIM_ABSOLUTE_X || mIns[at + 1].mMode == ASMIM_INDIRECT_X || mIns[at + 1].mMode == ASMIM_ZERO_PAGE_X;
|
||||||
bool usey = mIns[at + 1].mMode == ASMIM_ABSOLUTE_Y || mIns[at + 1].mMode == ASMIM_INDIRECT_Y || mIns[at + 1].mMode == ASMIM_ZERO_PAGE_Y;
|
bool usey = mIns[at + 1].mMode == ASMIM_ABSOLUTE_Y || mIns[at + 1].mMode == ASMIM_INDIRECT_Y || mIns[at + 1].mMode == ASMIM_ZERO_PAGE_Y;
|
||||||
|
bool vol = mIns[at + 1].mFlags & NCIF_VOLATILE;
|
||||||
|
|
||||||
int val = mIns[at].mAddress;
|
int val = mIns[at].mAddress;
|
||||||
int i = at;
|
int i = at;
|
||||||
|
@ -16744,6 +16745,8 @@ bool NativeCodeBasicBlock::MoveImmediateStoreUp(int at)
|
||||||
return false;
|
return false;
|
||||||
else if (mIns[at + 1].mMode == ASMIM_INDIRECT_Y && (mIns[i].ChangesZeroPage(mIns[at + 1].mAddress) || mIns[i].ChangesZeroPage(mIns[at + 1].mAddress + 1)))
|
else if (mIns[at + 1].mMode == ASMIM_INDIRECT_Y && (mIns[i].ChangesZeroPage(mIns[at + 1].mAddress) || mIns[i].ChangesZeroPage(mIns[at + 1].mAddress + 1)))
|
||||||
return false;
|
return false;
|
||||||
|
else if (vol && (mIns[i].mFlags & NCIF_VOLATILE))
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -16752,6 +16755,7 @@ bool NativeCodeBasicBlock::MoveImmediateStoreDown(int at)
|
||||||
{
|
{
|
||||||
bool usex = mIns[at + 1].mMode == ASMIM_ABSOLUTE_X || mIns[at + 1].mMode == ASMIM_INDIRECT_X || mIns[at + 1].mMode == ASMIM_ZERO_PAGE_X;
|
bool usex = mIns[at + 1].mMode == ASMIM_ABSOLUTE_X || mIns[at + 1].mMode == ASMIM_INDIRECT_X || mIns[at + 1].mMode == ASMIM_ZERO_PAGE_X;
|
||||||
bool usey = mIns[at + 1].mMode == ASMIM_ABSOLUTE_Y || mIns[at + 1].mMode == ASMIM_INDIRECT_Y || mIns[at + 1].mMode == ASMIM_ZERO_PAGE_Y;
|
bool usey = mIns[at + 1].mMode == ASMIM_ABSOLUTE_Y || mIns[at + 1].mMode == ASMIM_INDIRECT_Y || mIns[at + 1].mMode == ASMIM_ZERO_PAGE_Y;
|
||||||
|
bool vol = mIns[at + 1].mFlags & NCIF_VOLATILE;
|
||||||
|
|
||||||
int val = mIns[at].mAddress;
|
int val = mIns[at].mAddress;
|
||||||
int i = at + 2;
|
int i = at + 2;
|
||||||
|
@ -16808,6 +16812,8 @@ bool NativeCodeBasicBlock::MoveImmediateStoreDown(int at)
|
||||||
return false;
|
return false;
|
||||||
else if (mIns[at + 1].mMode == ASMIM_INDIRECT_Y && (mIns[i].ChangesZeroPage(mIns[at + 1].mAddress) || mIns[i].ChangesZeroPage(mIns[at + 1].mAddress + 1)))
|
else if (mIns[at + 1].mMode == ASMIM_INDIRECT_Y && (mIns[i].ChangesZeroPage(mIns[at + 1].mAddress) || mIns[i].ChangesZeroPage(mIns[at + 1].mAddress + 1)))
|
||||||
return false;
|
return false;
|
||||||
|
else if (vol && (mIns[i].mFlags & NCIF_VOLATILE))
|
||||||
|
return false;
|
||||||
|
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
@ -47133,7 +47139,7 @@ void NativeCodeProcedure::Compile(InterCodeProcedure* proc)
|
||||||
{
|
{
|
||||||
mInterProc = proc;
|
mInterProc = proc;
|
||||||
|
|
||||||
CheckFunc = !strcmp(mInterProc->mIdent->mString, "memmove");
|
CheckFunc = !strcmp(mInterProc->mIdent->mString, "reu_count_pages");
|
||||||
|
|
||||||
int nblocks = proc->mBlocks.Size();
|
int nblocks = proc->mBlocks.Size();
|
||||||
tblocks = new NativeCodeBasicBlock * [nblocks];
|
tblocks = new NativeCodeBasicBlock * [nblocks];
|
||||||
|
@ -48618,7 +48624,6 @@ void NativeCodeProcedure::Optimize(void)
|
||||||
else
|
else
|
||||||
cnt++;
|
cnt++;
|
||||||
|
|
||||||
|
|
||||||
} while (changed);
|
} while (changed);
|
||||||
|
|
||||||
#if 1
|
#if 1
|
||||||
|
|
Loading…
Reference in New Issue