Use CPU register A for single byte parameter and returns
This commit is contained in:
parent
9a64bcc8b6
commit
d6fcb5f9ca
|
@ -8,7 +8,7 @@ LinkerRegion::LinkerRegion(void)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
LinkerSection::LinkerSection(void)
|
LinkerSection::LinkerSection(void)
|
||||||
: mObjects(nullptr), mSections(nullptr)
|
: mObjects(nullptr), mSections(nullptr), mFlags(0)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
@ -248,7 +248,7 @@ bool LinkerRegion::Allocate(Linker * linker, LinkerObject* lobj)
|
||||||
int start = (mFreeChunks[i].mStart + lobj->mAlignment - 1) & ~(lobj->mAlignment - 1);
|
int start = (mFreeChunks[i].mStart + lobj->mAlignment - 1) & ~(lobj->mAlignment - 1);
|
||||||
int end = start + lobj->mSize;
|
int end = start + lobj->mSize;
|
||||||
|
|
||||||
if (!(linker->mCompilerOptions & COPT_OPTIMIZE_CODE_SIZE) && (lobj->mFlags & LOBJF_NO_CROSS) && lobj->mSize <= 256 && (start & 0xff00) != ((end - 1) & 0xff00))
|
if (!(linker->mCompilerOptions & COPT_OPTIMIZE_CODE_SIZE) && (lobj->mFlags & LOBJF_NO_CROSS) && lobj->mSize <= 256 && (start & 0xff00) != ((end - 1) & 0xff00) && !(lobj->mSection->mFlags & LSECF_PACKED))
|
||||||
;
|
;
|
||||||
else if (end <= mFreeChunks[i].mEnd)
|
else if (end <= mFreeChunks[i].mEnd)
|
||||||
{
|
{
|
||||||
|
@ -282,7 +282,7 @@ bool LinkerRegion::Allocate(Linker * linker, LinkerObject* lobj)
|
||||||
int start = (mStart + mUsed + lobj->mAlignment - 1) & ~(lobj->mAlignment - 1);
|
int start = (mStart + mUsed + lobj->mAlignment - 1) & ~(lobj->mAlignment - 1);
|
||||||
int end = start + lobj->mSize;
|
int end = start + lobj->mSize;
|
||||||
|
|
||||||
if (!(linker->mCompilerOptions & COPT_OPTIMIZE_CODE_SIZE) && (lobj->mFlags & LOBJF_NO_CROSS) && lobj->mSize <= 256 && (start & 0xff00) != ((end - 1) & 0xff00))
|
if (!(linker->mCompilerOptions & COPT_OPTIMIZE_CODE_SIZE) && (lobj->mFlags & LOBJF_NO_CROSS) && !(lobj->mFlags & LOBJF_FORCE_ALIGN) && lobj->mSize <= 256 && (start & 0xff00) != ((end - 1) & 0xff00) && !(lobj->mSection->mFlags & LSECF_PACKED))
|
||||||
{
|
{
|
||||||
start = (start + 0x00ff) & 0xff00;
|
start = (start + 0x00ff) & 0xff00;
|
||||||
end = start + lobj->mSize;
|
end = start + lobj->mSize;
|
||||||
|
|
|
@ -111,6 +111,8 @@ public:
|
||||||
uint32 mFlags;
|
uint32 mFlags;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const uint32 LSECF_PACKED = 0x00000001;
|
||||||
|
|
||||||
class LinkerSection
|
class LinkerSection
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
@ -121,6 +123,7 @@ public:
|
||||||
|
|
||||||
int mStart, mEnd, mSize;
|
int mStart, mEnd, mSize;
|
||||||
LinkerSectionType mType;
|
LinkerSectionType mType;
|
||||||
|
uint32 mFlags;
|
||||||
|
|
||||||
LinkerSection(void);
|
LinkerSection(void);
|
||||||
|
|
||||||
|
@ -137,6 +140,15 @@ static const uint32 LOBJF_RELEVANT = 0x00000020;
|
||||||
static const uint32 LOBJF_STATIC_STACK = 0x00000040;
|
static const uint32 LOBJF_STATIC_STACK = 0x00000040;
|
||||||
static const uint32 LOBJF_NO_CROSS = 0x00000080;
|
static const uint32 LOBJF_NO_CROSS = 0x00000080;
|
||||||
static const uint32 LOBJF_ZEROPAGE = 0x00000100;
|
static const uint32 LOBJF_ZEROPAGE = 0x00000100;
|
||||||
|
static const uint32 LOBJF_FORCE_ALIGN = 0x00000200;
|
||||||
|
|
||||||
|
static const uint32 LOBJF_ARG_REG_A = 0x00001000;
|
||||||
|
static const uint32 LOBJF_ARG_REG_X = 0x00002000;
|
||||||
|
static const uint32 LOBJF_ARG_REG_Y = 0x00004000;
|
||||||
|
|
||||||
|
static const uint32 LOBJF_RET_REG_A = 0x00010000;
|
||||||
|
static const uint32 LOBJF_RET_REG_X = 0x00020000;
|
||||||
|
|
||||||
|
|
||||||
class LinkerObject
|
class LinkerObject
|
||||||
{
|
{
|
||||||
|
|
|
@ -284,6 +284,13 @@ bool NativeCodeInstruction::IsUsedResultInstructions(NumberSet& requiredTemps)
|
||||||
requiredTemps -= CPU_REG_X;
|
requiredTemps -= CPU_REG_X;
|
||||||
requiredTemps -= CPU_REG_Y;
|
requiredTemps -= CPU_REG_Y;
|
||||||
|
|
||||||
|
if (mFlags & NCIF_USE_CPU_REG_A)
|
||||||
|
requiredTemps += CPU_REG_A;
|
||||||
|
if (mFlags & NCIF_USE_CPU_REG_X)
|
||||||
|
requiredTemps += CPU_REG_X;
|
||||||
|
if (mFlags & NCIF_USE_CPU_REG_Y)
|
||||||
|
requiredTemps += CPU_REG_Y;
|
||||||
|
|
||||||
if (mFlags & NCIF_RUNTIME)
|
if (mFlags & NCIF_RUNTIME)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < 4; i++)
|
for (int i = 0; i < 4; i++)
|
||||||
|
@ -298,9 +305,6 @@ bool NativeCodeInstruction::IsUsedResultInstructions(NumberSet& requiredTemps)
|
||||||
requiredTemps += mParam + i;
|
requiredTemps += mParam + i;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mFlags & NCIF_USE_CPU_REG_A)
|
|
||||||
requiredTemps += CPU_REG_A;
|
|
||||||
|
|
||||||
if (mFlags & NCIF_FEXEC)
|
if (mFlags & NCIF_FEXEC)
|
||||||
{
|
{
|
||||||
requiredTemps += BC_REG_LOCALS;
|
requiredTemps += BC_REG_LOCALS;
|
||||||
|
@ -3715,6 +3719,22 @@ void NativeCodeInstruction::FilterRegUsage(NumberSet& requiredTemps, NumberSet&
|
||||||
if (mType == ASMIT_JSR)
|
if (mType == ASMIT_JSR)
|
||||||
{
|
{
|
||||||
#if 1
|
#if 1
|
||||||
|
if (mFlags & NCIF_USE_CPU_REG_A)
|
||||||
|
{
|
||||||
|
if (!providedTemps[CPU_REG_A])
|
||||||
|
requiredTemps += CPU_REG_A;
|
||||||
|
}
|
||||||
|
if (mFlags & NCIF_USE_CPU_REG_X)
|
||||||
|
{
|
||||||
|
if (!providedTemps[CPU_REG_X])
|
||||||
|
requiredTemps += CPU_REG_X;
|
||||||
|
}
|
||||||
|
if (mFlags & NCIF_USE_CPU_REG_Y)
|
||||||
|
{
|
||||||
|
if (!providedTemps[CPU_REG_Y])
|
||||||
|
requiredTemps += CPU_REG_Y;
|
||||||
|
}
|
||||||
|
|
||||||
if (mFlags & NCIF_RUNTIME)
|
if (mFlags & NCIF_RUNTIME)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < 4; i++)
|
for (int i = 0; i < 4; i++)
|
||||||
|
@ -3734,11 +3754,6 @@ void NativeCodeInstruction::FilterRegUsage(NumberSet& requiredTemps, NumberSet&
|
||||||
requiredTemps += mParam + i;
|
requiredTemps += mParam + i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (mFlags & NCIF_USE_CPU_REG_A)
|
|
||||||
{
|
|
||||||
if (!providedTemps[CPU_REG_A])
|
|
||||||
requiredTemps += CPU_REG_A;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mFlags & NCIF_FEXEC)
|
if (mFlags & NCIF_FEXEC)
|
||||||
{
|
{
|
||||||
|
@ -11066,10 +11081,24 @@ void NativeCodeBasicBlock::CallAssembler(InterCodeProcedure* proc, NativeCodePro
|
||||||
ins->mSrc[0].mLinkerObject->mNumTemporaries = ins->mNumOperands - 1;
|
ins->mSrc[0].mLinkerObject->mNumTemporaries = ins->mNumOperands - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint32 lf = 0;
|
||||||
|
|
||||||
if (ins->mSrc[0].mTemp < 0)
|
if (ins->mSrc[0].mTemp < 0)
|
||||||
{
|
{
|
||||||
|
uint32 flags = NCIF_LOWER | NCIF_UPPER;
|
||||||
|
if (ins->mSrc[0].mLinkerObject->mFlags & LOBJF_ARG_REG_A)
|
||||||
|
{
|
||||||
|
flags |= NCIF_USE_CPU_REG_A;
|
||||||
|
mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS));
|
||||||
|
}
|
||||||
|
if (ins->mSrc[0].mLinkerObject->mFlags & LOBJF_ARG_REG_X)
|
||||||
|
flags |= NCIF_USE_CPU_REG_X;
|
||||||
|
if (ins->mSrc[0].mLinkerObject->mFlags & LOBJF_ARG_REG_Y)
|
||||||
|
flags |= NCIF_USE_CPU_REG_Y;
|
||||||
|
|
||||||
assert(ins->mSrc[0].mLinkerObject);
|
assert(ins->mSrc[0].mLinkerObject);
|
||||||
mIns.Push(NativeCodeInstruction(ASMIT_JSR, ASMIM_ABSOLUTE, ins->mSrc[0].mIntConst, ins->mSrc[0].mLinkerObject));
|
mIns.Push(NativeCodeInstruction(ASMIT_JSR, ASMIM_ABSOLUTE, ins->mSrc[0].mIntConst, ins->mSrc[0].mLinkerObject, flags));
|
||||||
|
lf = ins->mSrc[0].mLinkerObject->mFlags;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -11097,12 +11126,18 @@ void NativeCodeBasicBlock::CallAssembler(InterCodeProcedure* proc, NativeCodePro
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 0));
|
if (!(lf & LOBJF_RET_REG_A))
|
||||||
|
mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 0));
|
||||||
mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp] + 0));
|
mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp] + 0));
|
||||||
if (InterTypeSize[ins->mDst.mType] > 1)
|
if (InterTypeSize[ins->mDst.mType] > 1)
|
||||||
{
|
{
|
||||||
mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 1));
|
if (lf & LOBJF_RET_REG_X)
|
||||||
mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp] + 1));
|
mIns.Push(NativeCodeInstruction(ASMIT_STX, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp] + 1));
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 1));
|
||||||
|
mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp] + 1));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (InterTypeSize[ins->mDst.mType] > 2)
|
if (InterTypeSize[ins->mDst.mType] > 2)
|
||||||
{
|
{
|
||||||
|
@ -11131,6 +11166,13 @@ void NativeCodeBasicBlock::BuildLocalRegSets(void)
|
||||||
mExitRequiredRegs = NumberSet(NUM_REGS);
|
mExitRequiredRegs = NumberSet(NUM_REGS);
|
||||||
mExitProvidedRegs = NumberSet(NUM_REGS);
|
mExitProvidedRegs = NumberSet(NUM_REGS);
|
||||||
|
|
||||||
|
if (mEntryRegA)
|
||||||
|
mLocalProvidedRegs += CPU_REG_A;
|
||||||
|
if (mEntryRegX)
|
||||||
|
mLocalProvidedRegs += CPU_REG_X;
|
||||||
|
if (mEntryRegY)
|
||||||
|
mLocalProvidedRegs += CPU_REG_Y;
|
||||||
|
|
||||||
for (i = 0; i < mIns.Size(); i++)
|
for (i = 0; i < mIns.Size(); i++)
|
||||||
{
|
{
|
||||||
mIns[i].FilterRegUsage(mLocalRequiredRegs, mLocalProvidedRegs);
|
mIns[i].FilterRegUsage(mLocalRequiredRegs, mLocalProvidedRegs);
|
||||||
|
@ -11152,6 +11194,17 @@ void NativeCodeBasicBlock::BuildLocalRegSets(void)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (mExitRegA)
|
||||||
|
{
|
||||||
|
if (!mLocalProvidedRegs[CPU_REG_A])
|
||||||
|
mLocalRequiredRegs += CPU_REG_A;
|
||||||
|
}
|
||||||
|
if (mExitRegX)
|
||||||
|
{
|
||||||
|
if (!mLocalProvidedRegs[CPU_REG_X])
|
||||||
|
mLocalRequiredRegs += CPU_REG_X;
|
||||||
|
}
|
||||||
|
|
||||||
mEntryRequiredRegs = mLocalRequiredRegs;
|
mEntryRequiredRegs = mLocalRequiredRegs;
|
||||||
mExitProvidedRegs = mLocalProvidedRegs;
|
mExitProvidedRegs = mLocalProvidedRegs;
|
||||||
|
|
||||||
|
@ -11988,7 +12041,6 @@ bool NativeCodeBasicBlock::ReduceLocalYPressure(void)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
int start = 0;
|
int start = 0;
|
||||||
|
|
||||||
while (start < mIns.Size())
|
while (start < mIns.Size())
|
||||||
{
|
{
|
||||||
const NativeCodeInstruction& ins(mIns[start]);
|
const NativeCodeInstruction& ins(mIns[start]);
|
||||||
|
@ -13552,6 +13604,64 @@ bool NativeCodeBasicBlock::Split16BitLoopCount(NativeCodeProcedure* proc)
|
||||||
return changed;
|
return changed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool NativeCodeBasicBlock::CrossBlockStoreLoadBypass(NativeCodeProcedure* proc)
|
||||||
|
{
|
||||||
|
bool changed = false;
|
||||||
|
if (!mVisited)
|
||||||
|
{
|
||||||
|
mVisited = true;
|
||||||
|
|
||||||
|
if (mTrueJump && !mFalseJump && mIns.Size() > 0 && mTrueJump->mIns.Size() > 0)
|
||||||
|
{
|
||||||
|
int sz = mIns.Size();
|
||||||
|
|
||||||
|
if (mTrueJump->mIns[0].mType == ASMIT_LDA && mTrueJump->mIns[0].mMode == ASMIM_ZERO_PAGE && !(mTrueJump->mIns[0].mLive & LIVE_MEM))
|
||||||
|
{
|
||||||
|
if (mIns[sz - 1].mType == ASMIT_STA && mIns[sz - 1].mMode == ASMIM_ZERO_PAGE && mIns[sz - 1].mAddress == mTrueJump->mIns[0].mAddress)
|
||||||
|
{
|
||||||
|
NativeCodeBasicBlock* lblock = proc->AllocateBlock();
|
||||||
|
|
||||||
|
for (int i = 1; i < mTrueJump->mIns.Size(); i++)
|
||||||
|
lblock->mIns.Push(mTrueJump->mIns[i]);
|
||||||
|
mTrueJump->mIns.SetSize(1);
|
||||||
|
|
||||||
|
lblock->mTrueJump = mTrueJump->mTrueJump;
|
||||||
|
lblock->mFalseJump = mTrueJump->mFalseJump;
|
||||||
|
lblock->mBranch = mTrueJump->mBranch;
|
||||||
|
|
||||||
|
lblock->mNumEntries = 2;
|
||||||
|
lblock->mEntryBlocks.Push(this);
|
||||||
|
lblock->mEntryBlocks.Push(mTrueJump);
|
||||||
|
|
||||||
|
lblock->mEntryProvidedRegs = mTrueJump->mEntryRequiredRegs;
|
||||||
|
lblock->mExitRequiredRegs = mTrueJump->mEntryRequiredRegs;
|
||||||
|
lblock->mExitRequiredRegs += CPU_REG_A;
|
||||||
|
|
||||||
|
mTrueJump->mEntryRequiredRegs += CPU_REG_A;
|
||||||
|
|
||||||
|
mTrueJump->mEntryBlocks.Remove(mTrueJump->mEntryBlocks.IndexOf(this));
|
||||||
|
mTrueJump->mNumEntries--;
|
||||||
|
|
||||||
|
mTrueJump->mFalseJump = nullptr;
|
||||||
|
mTrueJump->mTrueJump = lblock;
|
||||||
|
mTrueJump->mBranch = ASMIT_JMP;
|
||||||
|
|
||||||
|
mTrueJump = lblock;
|
||||||
|
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mTrueJump && mTrueJump->CrossBlockStoreLoadBypass(proc))
|
||||||
|
changed = true;
|
||||||
|
if (mFalseJump && mFalseJump->CrossBlockStoreLoadBypass(proc))
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return changed;
|
||||||
|
}
|
||||||
|
|
||||||
bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc)
|
bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc)
|
||||||
{
|
{
|
||||||
bool changed = false;
|
bool changed = false;
|
||||||
|
@ -16207,7 +16317,7 @@ bool NativeCodeBasicBlock::JoinTailCodeSequences(NativeCodeProcedure* proc, bool
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if 1
|
#if 1
|
||||||
if (mIns.Size() >= 1 && mIns[0].mType == ASMIT_TAX && !(mIns[0].mLive & (LIVE_CPU_REG_A | LIVE_CPU_REG_Z)))
|
if (mIns.Size() >= 1 && mIns[0].mType == ASMIT_TAX && !(mIns[0].mLive & (LIVE_CPU_REG_A | LIVE_CPU_REG_Z)) && !mEntryRegA)
|
||||||
{
|
{
|
||||||
int i = 0;
|
int i = 0;
|
||||||
while (i < mEntryBlocks.Size() && mEntryBlocks[i]->mIns.Size() > 0 && mEntryBlocks[i]->mIns.Last().mType == ASMIT_LDA && HasAsmInstructionMode(ASMIT_LDX, mEntryBlocks[i]->mIns.Last().mMode) && !mEntryBlocks[i]->mFalseJump)
|
while (i < mEntryBlocks.Size() && mEntryBlocks[i]->mIns.Size() > 0 && mEntryBlocks[i]->mIns.Last().mType == ASMIT_LDA && HasAsmInstructionMode(ASMIT_LDX, mEntryBlocks[i]->mIns.Last().mMode) && !mEntryBlocks[i]->mFalseJump)
|
||||||
|
@ -19264,6 +19374,10 @@ bool NativeCodeBasicBlock::MoveLoadStoreOutOfXYRangeUp(int at)
|
||||||
return false;
|
return false;
|
||||||
if (mIns[at + 1].mMode == ASMIM_ABSOLUTE_Y && mIns[j].ChangesYReg())
|
if (mIns[at + 1].mMode == ASMIM_ABSOLUTE_Y && mIns[j].ChangesYReg())
|
||||||
return false;
|
return false;
|
||||||
|
if (mIns[at + 1].mMode == ASMIM_ZERO_PAGE && mIns[j].ChangesZeroPage(mIns[at + 1].mAddress))
|
||||||
|
return false;
|
||||||
|
if (mIns[at + 2].mMode == ASMIM_ZERO_PAGE && mIns[j].ChangesZeroPage(mIns[at + 2].mAddress))
|
||||||
|
return false;
|
||||||
|
|
||||||
if (mIns[j].mType == ASMIT_LDA)
|
if (mIns[j].mType == ASMIT_LDA)
|
||||||
{
|
{
|
||||||
|
@ -22092,11 +22206,15 @@ bool NativeCodeBasicBlock::OptimizeSimpleLoopInvariant(NativeCodeProcedure* proc
|
||||||
return OptimizeSimpleLoopInvariant(proc);
|
return OptimizeSimpleLoopInvariant(proc);
|
||||||
|
|
||||||
mIns[sz - 2].mType = ASMIT_LDY; mIns[sz - 2].mLive |= LIVE_CPU_REG_Y;
|
mIns[sz - 2].mType = ASMIT_LDY; mIns[sz - 2].mLive |= LIVE_CPU_REG_Y;
|
||||||
mIns[sz - 1].mType = ASMIT_CPY;
|
mIns[sz - 1].mType = ASMIT_CPY; mIns[sz - 1].mLive |= LIVE_CPU_REG_Y;
|
||||||
|
|
||||||
prevBlock->mIns.Push(mIns[0]);
|
prevBlock->mIns.Push(mIns[0]);
|
||||||
mIns.Remove(0);
|
mIns.Remove(0);
|
||||||
|
|
||||||
|
mExitRequiredRegs += CPU_REG_Y;
|
||||||
|
mEntryRequiredRegs += CPU_REG_Y;
|
||||||
|
prevBlock->mExitRequiredRegs += CPU_REG_Y;
|
||||||
|
|
||||||
CheckLive();
|
CheckLive();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -22112,6 +22230,10 @@ bool NativeCodeBasicBlock::OptimizeSimpleLoopInvariant(NativeCodeProcedure* proc
|
||||||
prevBlock->mIns.Push(mIns[0]);
|
prevBlock->mIns.Push(mIns[0]);
|
||||||
mIns.Remove(0);
|
mIns.Remove(0);
|
||||||
|
|
||||||
|
mExitRequiredRegs += CPU_REG_Y;
|
||||||
|
mEntryRequiredRegs += CPU_REG_Y;
|
||||||
|
prevBlock->mExitRequiredRegs += CPU_REG_Y;
|
||||||
|
|
||||||
CheckLive();
|
CheckLive();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -22124,11 +22246,15 @@ bool NativeCodeBasicBlock::OptimizeSimpleLoopInvariant(NativeCodeProcedure* proc
|
||||||
return OptimizeSimpleLoopInvariant(proc);
|
return OptimizeSimpleLoopInvariant(proc);
|
||||||
|
|
||||||
mIns[sz - 2].mType = ASMIT_LDX; mIns[sz - 2].mLive |= LIVE_CPU_REG_X;
|
mIns[sz - 2].mType = ASMIT_LDX; mIns[sz - 2].mLive |= LIVE_CPU_REG_X;
|
||||||
mIns[sz - 1].mType = ASMIT_CPX;
|
mIns[sz - 1].mType = ASMIT_CPX; mIns[sz - 1].mLive |= LIVE_CPU_REG_X;
|
||||||
|
|
||||||
prevBlock->mIns.Push(mIns[0]);
|
prevBlock->mIns.Push(mIns[0]);
|
||||||
mIns.Remove(0);
|
mIns.Remove(0);
|
||||||
|
|
||||||
|
mExitRequiredRegs += CPU_REG_X;
|
||||||
|
mEntryRequiredRegs += CPU_REG_X;
|
||||||
|
prevBlock->mExitRequiredRegs += CPU_REG_X;
|
||||||
|
|
||||||
CheckLive();
|
CheckLive();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -31108,6 +31234,11 @@ void NativeCodeBasicBlock::CheckLive(void)
|
||||||
if (mBranch == ASMIT_BEQ || mBranch == ASMIT_BNE || mBranch == ASMIT_BPL || mBranch == ASMIT_BMI)
|
if (mBranch == ASMIT_BEQ || mBranch == ASMIT_BNE || mBranch == ASMIT_BPL || mBranch == ASMIT_BMI)
|
||||||
live |= LIVE_CPU_REG_Z;
|
live |= LIVE_CPU_REG_Z;
|
||||||
|
|
||||||
|
if (mIns.Size() > 0 && mIns[0].mMode == ASMIM_INDIRECT_Y && mEntryRequiredRegs.Size() > 0)
|
||||||
|
{
|
||||||
|
assert(mEntryRequiredRegs[CPU_REG_Y]);
|
||||||
|
}
|
||||||
|
|
||||||
for (int j = mIns.Size() - 1; j >= 0; j--)
|
for (int j = mIns.Size() - 1; j >= 0; j--)
|
||||||
{
|
{
|
||||||
assert(mIns[j].mType != ASMIT_INV);
|
assert(mIns[j].mType != ASMIT_INV);
|
||||||
|
@ -31459,6 +31590,12 @@ NativeCodeBasicBlock::NativeCodeBasicBlock(void)
|
||||||
mDominator = nullptr;
|
mDominator = nullptr;
|
||||||
mLoopHeadBlock = nullptr;
|
mLoopHeadBlock = nullptr;
|
||||||
mLoopTailBlock = nullptr;
|
mLoopTailBlock = nullptr;
|
||||||
|
mEntryRegA = false;
|
||||||
|
mEntryRegX = false;
|
||||||
|
mEntryRegY = false;
|
||||||
|
mExitRegA = false;
|
||||||
|
mExitRegX = false;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
NativeCodeBasicBlock::~NativeCodeBasicBlock(void)
|
NativeCodeBasicBlock::~NativeCodeBasicBlock(void)
|
||||||
|
@ -31705,6 +31842,29 @@ void NativeCodeProcedure::Compile(InterCodeProcedure* proc)
|
||||||
mEntryBlock->mTrueJump = CompileBlock(mInterProc, mInterProc->mBlocks[0]);
|
mEntryBlock->mTrueJump = CompileBlock(mInterProc, mInterProc->mBlocks[0]);
|
||||||
mEntryBlock->mBranch = ASMIT_JMP;
|
mEntryBlock->mBranch = ASMIT_JMP;
|
||||||
|
|
||||||
|
if (proc->mLeafProcedure && proc->mFastCallProcedure && !proc->mInterrupt && mNoFrame && mStackExpand == 0 && commonFrameSize == 0 && (mGenerator->mCompilerOptions & COPT_NATIVE))
|
||||||
|
{
|
||||||
|
#if 1
|
||||||
|
if (proc->mParamVars.Size() == 1 && proc->mParamVars[0]->mSize == 1)
|
||||||
|
{
|
||||||
|
proc->mLinkerObject->mFlags |= LOBJF_ARG_REG_A;
|
||||||
|
proc->mLinkerObject->mTemporaries[0]++;
|
||||||
|
proc->mLinkerObject->mTempSizes[0]--;
|
||||||
|
mEntryBlock->mIns.Insert(0, NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_FPARAMS));
|
||||||
|
mEntryBlock->mEntryRegA = true;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#if 1
|
||||||
|
if (mExitBlock->mIns[0].mFlags == NCIF_LOWER)
|
||||||
|
{
|
||||||
|
mExitBlock->mIns[0].mFlags = 0;
|
||||||
|
mExitBlock->mIns.Insert(0, NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_ACCU));
|
||||||
|
mExitBlock->mExitRegA = true;
|
||||||
|
proc->mLinkerObject->mFlags |= LOBJF_RET_REG_A;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
Optimize();
|
Optimize();
|
||||||
|
|
||||||
if (mEntryBlock->mIns.Size() > 0)
|
if (mEntryBlock->mIns.Size() > 0)
|
||||||
|
@ -31727,6 +31887,7 @@ void NativeCodeProcedure::Compile(InterCodeProcedure* proc)
|
||||||
|
|
||||||
bool ignoreExpandCommonFrame = false;
|
bool ignoreExpandCommonFrame = false;
|
||||||
|
|
||||||
|
|
||||||
if (mInterProc->mInterrupt)
|
if (mInterProc->mInterrupt)
|
||||||
{
|
{
|
||||||
if (!mNoFrame || mStackExpand > 0 || commonFrameSize > 0)
|
if (!mNoFrame || mStackExpand > 0 || commonFrameSize > 0)
|
||||||
|
@ -32136,7 +32297,7 @@ void NativeCodeProcedure::RebuildEntry(void)
|
||||||
|
|
||||||
void NativeCodeProcedure::Optimize(void)
|
void NativeCodeProcedure::Optimize(void)
|
||||||
{
|
{
|
||||||
CheckFunc = !strcmp(mInterProc->mIdent->mString, "main");
|
CheckFunc = !strcmp(mInterProc->mIdent->mString, "expand");
|
||||||
|
|
||||||
#if 1
|
#if 1
|
||||||
int step = 0;
|
int step = 0;
|
||||||
|
@ -32256,7 +32417,6 @@ void NativeCodeProcedure::Optimize(void)
|
||||||
mEntryBlock->CheckBlocks();
|
mEntryBlock->CheckBlocks();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#if 1
|
#if 1
|
||||||
ResetVisited();
|
ResetVisited();
|
||||||
if (mEntryBlock->PeepHoleOptimizer(this, step))
|
if (mEntryBlock->PeepHoleOptimizer(this, step))
|
||||||
|
@ -32378,7 +32538,6 @@ void NativeCodeProcedure::Optimize(void)
|
||||||
mEntryBlock->CheckBlocks(true);
|
mEntryBlock->CheckBlocks(true);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#if 1
|
#if 1
|
||||||
if (step == 3)
|
if (step == 3)
|
||||||
{
|
{
|
||||||
|
@ -32426,6 +32585,8 @@ void NativeCodeProcedure::Optimize(void)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (step > 3 && !changed)
|
if (step > 3 && !changed)
|
||||||
{
|
{
|
||||||
ResetVisited();
|
ResetVisited();
|
||||||
|
@ -32478,7 +32639,7 @@ void NativeCodeProcedure::Optimize(void)
|
||||||
{
|
{
|
||||||
ResetVisited();
|
ResetVisited();
|
||||||
mEntryBlock->GlobalRegisterXMap(j);
|
mEntryBlock->GlobalRegisterXMap(j);
|
||||||
if (j >= BC_REG_FPARAMS && j < BC_REG_FPARAMS_END)
|
if (j >= BC_REG_FPARAMS && j < BC_REG_FPARAMS_END && !mEntryBlock->mEntryRegA)
|
||||||
mEntryBlock->mTrueJump->mIns.Insert(0, NativeCodeInstruction(ASMIT_LDX, ASMIM_ZERO_PAGE, j));
|
mEntryBlock->mTrueJump->mIns.Insert(0, NativeCodeInstruction(ASMIT_LDX, ASMIM_ZERO_PAGE, j));
|
||||||
changed = true;
|
changed = true;
|
||||||
xmapped = true;
|
xmapped = true;
|
||||||
|
@ -32496,7 +32657,7 @@ void NativeCodeProcedure::Optimize(void)
|
||||||
{
|
{
|
||||||
ResetVisited();
|
ResetVisited();
|
||||||
mEntryBlock->GlobalRegisterYMap(j);
|
mEntryBlock->GlobalRegisterYMap(j);
|
||||||
if (j >= BC_REG_FPARAMS && j < BC_REG_FPARAMS_END)
|
if (j >= BC_REG_FPARAMS && j < BC_REG_FPARAMS_END && !mEntryBlock->mEntryRegA)
|
||||||
mEntryBlock->mTrueJump->mIns.Insert(0, NativeCodeInstruction(ASMIT_LDY, ASMIM_ZERO_PAGE, j));
|
mEntryBlock->mTrueJump->mIns.Insert(0, NativeCodeInstruction(ASMIT_LDY, ASMIM_ZERO_PAGE, j));
|
||||||
changed = true;
|
changed = true;
|
||||||
ymapped = true;
|
ymapped = true;
|
||||||
|
@ -32623,8 +32784,17 @@ void NativeCodeProcedure::Optimize(void)
|
||||||
changed = true;
|
changed = true;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
#if 1
|
||||||
|
if (step == 2 && !changed)
|
||||||
|
{
|
||||||
|
ResetVisited();
|
||||||
|
if (mEntryBlock->CrossBlockStoreLoadBypass(this))
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if 1
|
#if 1
|
||||||
if (cnt > 190)
|
if (cnt > 190)
|
||||||
{
|
{
|
||||||
|
@ -32650,6 +32820,7 @@ void NativeCodeProcedure::Optimize(void)
|
||||||
else
|
else
|
||||||
cnt++;
|
cnt++;
|
||||||
|
|
||||||
|
|
||||||
} while (changed);
|
} while (changed);
|
||||||
|
|
||||||
#if 1
|
#if 1
|
||||||
|
|
|
@ -173,6 +173,7 @@ public:
|
||||||
|
|
||||||
int mOffset, mSize, mPlace, mNumEntries, mNumEntered, mFrameOffset, mTemp;
|
int mOffset, mSize, mPlace, mNumEntries, mNumEntered, mFrameOffset, mTemp;
|
||||||
bool mPlaced, mCopied, mKnownShortBranch, mBypassed, mAssembled, mNoFrame, mVisited, mLoopHead, mVisiting, mLocked, mPatched, mPatchFail, mPatchChecked, mPatchStart, mPatchLoop, mPatchLoopChanged;
|
bool mPlaced, mCopied, mKnownShortBranch, mBypassed, mAssembled, mNoFrame, mVisited, mLoopHead, mVisiting, mLocked, mPatched, mPatchFail, mPatchChecked, mPatchStart, mPatchLoop, mPatchLoopChanged;
|
||||||
|
bool mEntryRegA, mEntryRegX, mEntryRegY, mExitRegA, mExitRegX;
|
||||||
NativeCodeBasicBlock * mDominator, * mSameBlock;
|
NativeCodeBasicBlock * mDominator, * mSameBlock;
|
||||||
|
|
||||||
NativeCodeBasicBlock* mLoopHeadBlock, * mLoopTailBlock;
|
NativeCodeBasicBlock* mLoopHeadBlock, * mLoopTailBlock;
|
||||||
|
@ -396,6 +397,7 @@ public:
|
||||||
|
|
||||||
bool CrossBlockXYShortcut(void);
|
bool CrossBlockXYShortcut(void);
|
||||||
|
|
||||||
|
|
||||||
bool Check16BitSum(int at, NativeRegisterSum16Info& info);
|
bool Check16BitSum(int at, NativeRegisterSum16Info& info);
|
||||||
bool Propagate16BitSum(void);
|
bool Propagate16BitSum(void);
|
||||||
|
|
||||||
|
@ -431,6 +433,7 @@ public:
|
||||||
bool Split16BitLoopCount(NativeCodeProcedure* proc);
|
bool Split16BitLoopCount(NativeCodeProcedure* proc);
|
||||||
bool SimplifyDiamond(NativeCodeProcedure* proc);
|
bool SimplifyDiamond(NativeCodeProcedure* proc);
|
||||||
bool SimplifyLoopEnd(NativeCodeProcedure* proc);
|
bool SimplifyLoopEnd(NativeCodeProcedure* proc);
|
||||||
|
bool CrossBlockStoreLoadBypass(NativeCodeProcedure* proc);
|
||||||
|
|
||||||
bool CanBytepassLoad(const NativeCodeInstruction& ains) const;
|
bool CanBytepassLoad(const NativeCodeInstruction& ains) const;
|
||||||
|
|
||||||
|
|
|
@ -3695,6 +3695,11 @@ void Parser::ParsePragma(void)
|
||||||
type = LST_BSS;
|
type = LST_BSS;
|
||||||
else if (!strcmp(mScanner->mTokenIdent->mString, "data"))
|
else if (!strcmp(mScanner->mTokenIdent->mString, "data"))
|
||||||
type = LST_DATA;
|
type = LST_DATA;
|
||||||
|
else if (!strcmp(mScanner->mTokenIdent->mString, "packed"))
|
||||||
|
{
|
||||||
|
type = LST_DATA;
|
||||||
|
flags |= LSECF_PACKED;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
mErrors->Error(mScanner->mLocation, EERR_PRAGMA_PARAMETER, "Unknown section type");
|
mErrors->Error(mScanner->mLocation, EERR_PRAGMA_PARAMETER, "Unknown section type");
|
||||||
}
|
}
|
||||||
|
@ -3711,6 +3716,8 @@ void Parser::ParsePragma(void)
|
||||||
if (!lsec)
|
if (!lsec)
|
||||||
lsec = mCompilationUnits->mLinker->AddSection(sectionIdent, type);
|
lsec = mCompilationUnits->mLinker->AddSection(sectionIdent, type);
|
||||||
|
|
||||||
|
lsec->mFlags |= flags;
|
||||||
|
|
||||||
if (dstart)
|
if (dstart)
|
||||||
{
|
{
|
||||||
dstart->mSection = lsec;
|
dstart->mSection = lsec;
|
||||||
|
@ -3808,7 +3815,9 @@ void Parser::ParsePragma(void)
|
||||||
|
|
||||||
Expression * exp = ParseRExpression();
|
Expression * exp = ParseRExpression();
|
||||||
if (exp->mType == EX_CONSTANT && exp->mDecValue->mType == DT_CONST_INTEGER)
|
if (exp->mType == EX_CONSTANT && exp->mDecValue->mType == DT_CONST_INTEGER)
|
||||||
|
{
|
||||||
dec->mAlignment = exp->mDecValue->mInteger;
|
dec->mAlignment = exp->mDecValue->mInteger;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
mErrors->Error(mScanner->mLocation, EERR_PRAGMA_PARAMETER, "Integer number for alignment expected");
|
mErrors->Error(mScanner->mLocation, EERR_PRAGMA_PARAMETER, "Integer number for alignment expected");
|
||||||
}
|
}
|
||||||
|
|
|
@ -74,7 +74,7 @@ int main2(int argc, const char** argv)
|
||||||
|
|
||||||
#else
|
#else
|
||||||
strcpy(strProductName, "oscar64");
|
strcpy(strProductName, "oscar64");
|
||||||
strcpy(strProductVersion, "1.12.176");
|
strcpy(strProductVersion, "1.13.177");
|
||||||
|
|
||||||
#ifdef __APPLE__
|
#ifdef __APPLE__
|
||||||
uint32_t length = sizeof(basePath);
|
uint32_t length = sizeof(basePath);
|
||||||
|
|
|
@ -25,8 +25,8 @@ LANGUAGE LANG_ENGLISH, SUBLANG_NEUTRAL
|
||||||
//
|
//
|
||||||
|
|
||||||
VS_VERSION_INFO VERSIONINFO
|
VS_VERSION_INFO VERSIONINFO
|
||||||
FILEVERSION 1,12,176,0
|
FILEVERSION 1,13,177,0
|
||||||
PRODUCTVERSION 1,12,176,0
|
PRODUCTVERSION 1,13,177,0
|
||||||
FILEFLAGSMASK 0x3fL
|
FILEFLAGSMASK 0x3fL
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
FILEFLAGS 0x1L
|
FILEFLAGS 0x1L
|
||||||
|
@ -43,12 +43,12 @@ BEGIN
|
||||||
BEGIN
|
BEGIN
|
||||||
VALUE "CompanyName", "oscar64"
|
VALUE "CompanyName", "oscar64"
|
||||||
VALUE "FileDescription", "oscar64 compiler"
|
VALUE "FileDescription", "oscar64 compiler"
|
||||||
VALUE "FileVersion", "1.12.176.0"
|
VALUE "FileVersion", "1.13.177.0"
|
||||||
VALUE "InternalName", "oscar64.exe"
|
VALUE "InternalName", "oscar64.exe"
|
||||||
VALUE "LegalCopyright", "Copyright (C) 2021"
|
VALUE "LegalCopyright", "Copyright (C) 2021"
|
||||||
VALUE "OriginalFilename", "oscar64.exe"
|
VALUE "OriginalFilename", "oscar64.exe"
|
||||||
VALUE "ProductName", "oscar64"
|
VALUE "ProductName", "oscar64"
|
||||||
VALUE "ProductVersion", "1.12.176.0"
|
VALUE "ProductVersion", "1.13.177.0"
|
||||||
END
|
END
|
||||||
END
|
END
|
||||||
BLOCK "VarFileInfo"
|
BLOCK "VarFileInfo"
|
||||||
|
|
|
@ -4450,15 +4450,15 @@
|
||||||
{
|
{
|
||||||
"Name" = "8:Microsoft Visual Studio"
|
"Name" = "8:Microsoft Visual Studio"
|
||||||
"ProductName" = "8:oscar64"
|
"ProductName" = "8:oscar64"
|
||||||
"ProductCode" = "8:{E0F08F69-BB99-4D80-9DBA-6C7898ED4DDB}"
|
"ProductCode" = "8:{F395B181-BC67-45F0-ABC6-A1DD8AF53FD3}"
|
||||||
"PackageCode" = "8:{8623BC03-009C-4E14-9DC8-16C927655E48}"
|
"PackageCode" = "8:{9D340FCF-C068-44AE-91FF-DA164F68B9FB}"
|
||||||
"UpgradeCode" = "8:{9AB61EFF-ACAC-4079-9950-8D96615CD4EF}"
|
"UpgradeCode" = "8:{9AB61EFF-ACAC-4079-9950-8D96615CD4EF}"
|
||||||
"AspNetVersion" = "8:2.0.50727.0"
|
"AspNetVersion" = "8:2.0.50727.0"
|
||||||
"RestartWWWService" = "11:FALSE"
|
"RestartWWWService" = "11:FALSE"
|
||||||
"RemovePreviousVersions" = "11:TRUE"
|
"RemovePreviousVersions" = "11:TRUE"
|
||||||
"DetectNewerInstalledVersion" = "11:TRUE"
|
"DetectNewerInstalledVersion" = "11:TRUE"
|
||||||
"InstallAllUsers" = "11:FALSE"
|
"InstallAllUsers" = "11:FALSE"
|
||||||
"ProductVersion" = "8:1.12.176"
|
"ProductVersion" = "8:1.13.177"
|
||||||
"Manufacturer" = "8:oscar64"
|
"Manufacturer" = "8:oscar64"
|
||||||
"ARPHELPTELEPHONE" = "8:"
|
"ARPHELPTELEPHONE" = "8:"
|
||||||
"ARPHELPLINK" = "8:"
|
"ARPHELPLINK" = "8:"
|
||||||
|
|
Loading…
Reference in New Issue