Fix volatile violation when recycling immediates

This commit is contained in:
drmortalwombat 2024-04-10 15:15:22 +02:00
parent 2cdc95ba05
commit 0184a550c5

View File

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