Use CPU register A for single byte parameter and returns

This commit is contained in:
drmortalwombat 2023-01-10 20:41:55 +01:00
parent 9a64bcc8b6
commit d6fcb5f9ca
8 changed files with 227 additions and 32 deletions

View File

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

View File

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

View File

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

View File

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

View File

@ -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");
} }

View File

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

View File

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

View File

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