Fix compile order based on dependency graph
This commit is contained in:
parent
6bd3ecb689
commit
6ac606c91b
|
@ -108,6 +108,30 @@ void Compiler::RegisterRuntime(const Location & loc, const Ident* ident)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Compiler::CompileProcedure(InterCodeProcedure* proc)
|
||||||
|
{
|
||||||
|
if (!proc->mCompiled)
|
||||||
|
{
|
||||||
|
proc->mCompiled = true;
|
||||||
|
|
||||||
|
for (int i = 0; i < proc->mCalledFunctions.Size(); i++)
|
||||||
|
CompileProcedure(proc->mCalledFunctions[i]);
|
||||||
|
|
||||||
|
if (proc->mNativeProcedure)
|
||||||
|
{
|
||||||
|
NativeCodeProcedure* ncproc = new NativeCodeProcedure(mNativeCodeGenerator);
|
||||||
|
ncproc->Compile(proc);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ByteCodeProcedure* bgproc = new ByteCodeProcedure();
|
||||||
|
|
||||||
|
bgproc->Compile(mByteCodeGenerator, proc);
|
||||||
|
mByteCodeFunctions.Push(bgproc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool Compiler::GenerateCode(void)
|
bool Compiler::GenerateCode(void)
|
||||||
{
|
{
|
||||||
Location loc;
|
Location loc;
|
||||||
|
@ -274,7 +298,7 @@ bool Compiler::GenerateCode(void)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
for (int i = mInterCodeModule->mProcedures.Size() - 1; i >=0; i--)
|
for (int i = 0; i < mInterCodeModule->mProcedures.Size(); i++)
|
||||||
{
|
{
|
||||||
InterCodeProcedure* proc = mInterCodeModule->mProcedures[i];
|
InterCodeProcedure* proc = mInterCodeModule->mProcedures[i];
|
||||||
|
|
||||||
|
@ -284,19 +308,7 @@ bool Compiler::GenerateCode(void)
|
||||||
proc->Disassemble("final");
|
proc->Disassemble("final");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
CompileProcedure(proc);
|
||||||
if (proc->mNativeProcedure)
|
|
||||||
{
|
|
||||||
NativeCodeProcedure* ncproc = new NativeCodeProcedure(mNativeCodeGenerator);
|
|
||||||
ncproc->Compile(proc);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ByteCodeProcedure* bgproc = new ByteCodeProcedure();
|
|
||||||
|
|
||||||
bgproc->Compile(mByteCodeGenerator, proc);
|
|
||||||
mByteCodeFunctions.Push(bgproc);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
LinkerObject* byteCodeObject = nullptr;
|
LinkerObject* byteCodeObject = nullptr;
|
||||||
|
|
|
@ -46,4 +46,6 @@ public:
|
||||||
void AddDefine(const Ident* ident, const char* value);
|
void AddDefine(const Ident* ident, const char* value);
|
||||||
|
|
||||||
void RegisterRuntime(const Location& loc, const Ident* ident);
|
void RegisterRuntime(const Location& loc, const Ident* ident);
|
||||||
|
|
||||||
|
void CompileProcedure(InterCodeProcedure* proc);
|
||||||
};
|
};
|
||||||
|
|
|
@ -8320,7 +8320,8 @@ InterCodeProcedure::InterCodeProcedure(InterCodeModule * mod, const Location & l
|
||||||
mRenameTable(-1), mRenameUnionTable(-1), mGlobalRenameTable(-1),
|
mRenameTable(-1), mRenameUnionTable(-1), mGlobalRenameTable(-1),
|
||||||
mValueForwardingTable(nullptr), mLocalVars(nullptr), mParamVars(nullptr), mModule(mod),
|
mValueForwardingTable(nullptr), mLocalVars(nullptr), mParamVars(nullptr), mModule(mod),
|
||||||
mIdent(ident), mLinkerObject(linkerObject),
|
mIdent(ident), mLinkerObject(linkerObject),
|
||||||
mNativeProcedure(false), mLeafProcedure(false), mCallsFunctionPointer(false), mCalledFunctions(nullptr), mFastCallProcedure(false), mInterrupt(false), mHardwareInterrupt(false)
|
mNativeProcedure(false), mLeafProcedure(false), mCallsFunctionPointer(false), mCalledFunctions(nullptr), mFastCallProcedure(false),
|
||||||
|
mInterrupt(false), mHardwareInterrupt(false), mCompiled(false)
|
||||||
{
|
{
|
||||||
mID = mModule->mProcedures.Size();
|
mID = mModule->mProcedures.Size();
|
||||||
mModule->mProcedures.Push(this);
|
mModule->mProcedures.Push(this);
|
||||||
|
|
|
@ -476,7 +476,7 @@ public:
|
||||||
GrowingTypeArray mTemporaries;
|
GrowingTypeArray mTemporaries;
|
||||||
GrowingIntArray mTempOffset, mTempSizes;
|
GrowingIntArray mTempOffset, mTempSizes;
|
||||||
int mTempSize, mCommonFrameSize, mCallerSavedTemps;
|
int mTempSize, mCommonFrameSize, mCallerSavedTemps;
|
||||||
bool mLeafProcedure, mNativeProcedure, mCallsFunctionPointer, mHasDynamicStack, mHasInlineAssembler, mCallsByteCode, mFastCallProcedure, mInterrupt, mHardwareInterrupt;
|
bool mLeafProcedure, mNativeProcedure, mCallsFunctionPointer, mHasDynamicStack, mHasInlineAssembler, mCallsByteCode, mFastCallProcedure, mInterrupt, mHardwareInterrupt, mCompiled;
|
||||||
GrowingInterCodeProcedurePtrArray mCalledFunctions;
|
GrowingInterCodeProcedurePtrArray mCalledFunctions;
|
||||||
|
|
||||||
InterCodeModule * mModule;
|
InterCodeModule * mModule;
|
||||||
|
|
|
@ -11227,8 +11227,9 @@ bool NativeCodeBasicBlock::OptimizeSimpleLoopInvariant(NativeCodeProcedure* proc
|
||||||
{
|
{
|
||||||
bool changed = false;
|
bool changed = false;
|
||||||
|
|
||||||
|
int sz = mIns.Size();
|
||||||
|
|
||||||
if (mIns.Size() == 2 && (mBranch == ASMIT_BEQ || mBranch == ASMIT_BNE) && mIns[0].mType == ASMIT_LDA && mIns[1].mType == ASMIT_CMP && !(mIns[1].mFlags & NCIF_VOLATILE) && !(mIns[1].mLive & (LIVE_CPU_REG_A | LIVE_CPU_REG_C)))
|
if (sz == 2 && (mBranch == ASMIT_BEQ || mBranch == ASMIT_BNE) && mIns[0].mType == ASMIT_LDA && mIns[1].mType == ASMIT_CMP && !(mIns[1].mFlags & NCIF_VOLATILE) && !(mIns[1].mLive & (LIVE_CPU_REG_A | LIVE_CPU_REG_C)))
|
||||||
{
|
{
|
||||||
if (!prevBlock)
|
if (!prevBlock)
|
||||||
return OptimizeSimpleLoopInvariant(proc);
|
return OptimizeSimpleLoopInvariant(proc);
|
||||||
|
@ -11239,6 +11240,21 @@ bool NativeCodeBasicBlock::OptimizeSimpleLoopInvariant(NativeCodeProcedure* proc
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (sz >= 3 && mIns[0].mType == ASMIT_LDY && mIns[sz - 2].mType == ASMIT_LDA && mIns[0].SameEffectiveAddress(mIns[sz - 2]) &&
|
||||||
|
mIns[sz - 1].mType == ASMIT_CMP && HasAsmInstructionMode(ASMIT_CPY, mIns[sz - 1].mMode) && !(mIns[sz - 1].mLive & LIVE_CPU_REG_A))
|
||||||
|
{
|
||||||
|
if (!prevBlock)
|
||||||
|
return OptimizeSimpleLoopInvariant(proc);
|
||||||
|
|
||||||
|
mIns[sz - 2].mType = ASMIT_LDY;
|
||||||
|
mIns[sz - 1].mType = ASMIT_CPY;
|
||||||
|
|
||||||
|
prevBlock->mIns.Push(mIns[0]);
|
||||||
|
mIns.Remove(0);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int ai = 0;
|
int ai = 0;
|
||||||
while (ai < mIns.Size() && !mIns[ai].ChangesAccu())
|
while (ai < mIns.Size() && !mIns[ai].ChangesAccu())
|
||||||
ai++;
|
ai++;
|
||||||
|
|
|
@ -73,7 +73,7 @@ int main2(int argc, const char** argv)
|
||||||
|
|
||||||
#else
|
#else
|
||||||
strcpy(strProductName, "oscar64");
|
strcpy(strProductName, "oscar64");
|
||||||
strcpy(strProductVersion, "1.4.91");
|
strcpy(strProductVersion, "1.4.92");
|
||||||
|
|
||||||
#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,4,91,0
|
FILEVERSION 1,4,92,0
|
||||||
PRODUCTVERSION 1,4,91,0
|
PRODUCTVERSION 1,4,92,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.4.91.0"
|
VALUE "FileVersion", "1.4.92.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.4.91.0"
|
VALUE "ProductVersion", "1.4.92.0"
|
||||||
END
|
END
|
||||||
END
|
END
|
||||||
BLOCK "VarFileInfo"
|
BLOCK "VarFileInfo"
|
||||||
|
|
|
@ -3752,15 +3752,15 @@
|
||||||
{
|
{
|
||||||
"Name" = "8:Microsoft Visual Studio"
|
"Name" = "8:Microsoft Visual Studio"
|
||||||
"ProductName" = "8:oscar64"
|
"ProductName" = "8:oscar64"
|
||||||
"ProductCode" = "8:{957F0E7A-5C0E-4F4D-B6B3-21C4459CA152}"
|
"ProductCode" = "8:{D70ACED5-5DDD-460B-B934-8B2F6C3F112B}"
|
||||||
"PackageCode" = "8:{C53FBC0A-F69A-4403-AF50-EED9DCFBF363}"
|
"PackageCode" = "8:{E84DF4CA-580F-413D-A830-4499B996E9EC}"
|
||||||
"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.4.91"
|
"ProductVersion" = "8:1.4.92"
|
||||||
"Manufacturer" = "8:oscar64"
|
"Manufacturer" = "8:oscar64"
|
||||||
"ARPHELPTELEPHONE" = "8:"
|
"ARPHELPTELEPHONE" = "8:"
|
||||||
"ARPHELPLINK" = "8:"
|
"ARPHELPLINK" = "8:"
|
||||||
|
@ -4274,7 +4274,7 @@
|
||||||
{
|
{
|
||||||
"{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_FB2E467BC172457785F4279BB0BFE8B6"
|
"{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_FB2E467BC172457785F4279BB0BFE8B6"
|
||||||
{
|
{
|
||||||
"SourcePath" = "8:..\\Release\\oscar64.exe"
|
"SourcePath" = "8:..\\Debug\\oscar64.exe"
|
||||||
"TargetName" = "8:"
|
"TargetName" = "8:"
|
||||||
"Tag" = "8:"
|
"Tag" = "8:"
|
||||||
"Folder" = "8:_607E75AF0E2A4CB9908C4C39DF8FE6E4"
|
"Folder" = "8:_607E75AF0E2A4CB9908C4C39DF8FE6E4"
|
||||||
|
|
|
@ -833,7 +833,7 @@ int main(void)
|
||||||
|
|
||||||
// Build to multicolor highres at top of screen
|
// Build to multicolor highres at top of screen
|
||||||
rirq_build(&top, 3);
|
rirq_build(&top, 3);
|
||||||
rirq_delay(&top, 10);
|
rirq_delay(&top, 9);
|
||||||
rirq_write(&top, 1, &vic.ctrl1, VIC_CTRL1_BMM | VIC_CTRL1_DEN | VIC_CTRL1_RSEL | 3);
|
rirq_write(&top, 1, &vic.ctrl1, VIC_CTRL1_BMM | VIC_CTRL1_DEN | VIC_CTRL1_RSEL | 3);
|
||||||
rirq_write(&top, 2, &vic.memptr, 0x28);
|
rirq_write(&top, 2, &vic.memptr, 0x28);
|
||||||
rirq_set(0, 57, &top);
|
rirq_set(0, 57, &top);
|
||||||
|
|
Binary file not shown.
Loading…
Reference in New Issue