From 259abf4c4b2f6073229ec82a9a6881382c4a163a Mon Sep 17 00:00:00 2001 From: drmortalwombat <90205530+drmortalwombat@users.noreply.github.com> Date: Tue, 20 Sep 2022 15:01:47 +0200 Subject: [PATCH] Improve compiler speed --- .gitignore | 4 +++ include/c64/keyboard.h | 4 ++- oscar64/Array.h | 12 ++++++-- oscar64/InterCode.cpp | 61 ++++++++++++++++++++--------------------- oscar64/InterCode.h | 4 +-- oscar64/NumberSet.cpp | 26 +++++++++++------- oscar64/oscar64.vcxproj | 6 ++++ 7 files changed, 69 insertions(+), 48 deletions(-) diff --git a/.gitignore b/.gitignore index d9366ad..f3941e5 100644 --- a/.gitignore +++ b/.gitignore @@ -345,3 +345,7 @@ make/oscar64 *.crt *.crt *.d64 +*.tlog +*.res +*.recipe +*.exe diff --git a/include/c64/keyboard.h b/include/c64/keyboard.h index d00981a..2c7e287 100644 --- a/include/c64/keyboard.h +++ b/include/c64/keyboard.h @@ -103,7 +103,9 @@ enum KeyScanCode KSCAN_STOP, KSCAN_QUAL_SHIFT = 0x40, - KSCAN_QUAL_DOWN = 0x80 + KSCAN_QUAL_DOWN = 0x80, + + KSCAN_MAX = 0xff }; // map of keyboard codes to PETSCII, first 64 without shift diff --git a/oscar64/Array.h b/oscar64/Array.h index 5fe9ed4..f9151ef 100644 --- a/oscar64/Array.h +++ b/oscar64/Array.h @@ -196,11 +196,14 @@ public: GrowingArray(const GrowingArray& a) : empty(a.empty) { - int i; size = a.size; range = a.range; array = new T[range]; - for (i = 0; i < size; i++) array[i] = a.array[i]; + + int lsize = size; + const T* sap = a.array; + T* dap = array; + for (int i = 0; i < lsize; i++) dap[i] = sap[i]; } GrowingArray & operator=(const GrowingArray& a) @@ -208,7 +211,10 @@ public: if (a.size != size) Grow(a.size, true); - for (int i = 0; i < size; i++) array[i] = a.array[i]; + int lsize = size; + const T* sap = a.array; + T* dap = array; + for (int i = 0; i < lsize; i++) dap[i] = sap[i]; return *this; } diff --git a/oscar64/InterCode.cpp b/oscar64/InterCode.cpp index ef04ac4..7a1f440 100644 --- a/oscar64/InterCode.cpp +++ b/oscar64/InterCode.cpp @@ -1279,18 +1279,23 @@ TempForwardingTable::TempForwardingTable(void) : mAssoc(Assoc(-1, -1, -1)) { } -TempForwardingTable::TempForwardingTable(const TempForwardingTable& table) : mAssoc(Assoc(-1, -1, -1)) +TempForwardingTable::TempForwardingTable(const TempForwardingTable& table) : mAssoc(table.mAssoc) { +#if 0 + mAssoc.Reserve(table.mAssoc.Size()); for (int i = 0; i < table.mAssoc.Size(); i++) { mAssoc[i].mAssoc = table.mAssoc[i].mAssoc; mAssoc[i].mSucc = table.mAssoc[i].mSucc; mAssoc[i].mPred = table.mAssoc[i].mPred; } +#endif } TempForwardingTable& TempForwardingTable::operator=(const TempForwardingTable& table) { + mAssoc = table.mAssoc; +#if 0 mAssoc.SetSize(table.mAssoc.Size()); for (int i = 0; i < table.mAssoc.Size(); i++) { @@ -1298,7 +1303,7 @@ TempForwardingTable& TempForwardingTable::operator=(const TempForwardingTable& t mAssoc[i].mSucc = table.mAssoc[i].mSucc; mAssoc[i].mPred = table.mAssoc[i].mPred; } - +#endif return *this; } @@ -6341,7 +6346,7 @@ void InterCodeBasicBlock::BuildLocalTempSets(int num) } } -void InterCodeBasicBlock::BuildGlobalProvidedTempSet(NumberSet fromProvidedTemps) +void InterCodeBasicBlock::BuildGlobalProvidedTempSet(const NumberSet & fromProvidedTemps) { bool changed = false; @@ -6555,61 +6560,50 @@ bool InterCodeBasicBlock::CalculateSingleAssignmentTemps(FastNumberSet& tassigne return changed; } -void InterCodeBasicBlock::PerformTempForwarding(TempForwardingTable& forwardingTable) +void InterCodeBasicBlock::PerformTempForwarding(const TempForwardingTable& forwardingTable) { int i; if (!mVisited) { - TempForwardingTable localForwardingTable(forwardingTable); - if (mLoopHead) { if (mNumEntries == 2 && (mTrueJump == this || mFalseJump == this) && mLocalModifiedTemps.Size()) { - assert(localForwardingTable.Size() == mLocalModifiedTemps.Size()); + mMergeForwardingTable = forwardingTable; + assert(mMergeForwardingTable.Size() == mLocalModifiedTemps.Size()); for (int i = 0; i < mLocalModifiedTemps.Size(); i++) { if (mLocalModifiedTemps[i]) - localForwardingTable.Destroy(i); + mMergeForwardingTable.Destroy(i); } } else - localForwardingTable.Reset(); + mMergeForwardingTable.SetSize(forwardingTable.Size()); } -#if 0 - else if (mNumEntries > 1) + else { - lvalues.FlushAll(); - ltvalue.Clear(); - } -#endif - else if (mNumEntries > 0) - { - if (mNumEntered > 0) - { - localForwardingTable.Intersect(mMergeForwardingTable); - } + if (mNumEntered == 0) + mMergeForwardingTable = forwardingTable; + else + mMergeForwardingTable.Intersect(forwardingTable); mNumEntered++; if (mNumEntered < mNumEntries) - { - mMergeForwardingTable = localForwardingTable; return; - } } mVisited = true; for (i = 0; i < mInstructions.Size(); i++) { - mInstructions[i]->PerformTempForwarding(localForwardingTable); + mInstructions[i]->PerformTempForwarding(mMergeForwardingTable); } - if (mTrueJump) mTrueJump->PerformTempForwarding(localForwardingTable); - if (mFalseJump) mFalseJump->PerformTempForwarding(localForwardingTable); + if (mTrueJump) mTrueJump->PerformTempForwarding(mMergeForwardingTable); + if (mFalseJump) mFalseJump->PerformTempForwarding(mMergeForwardingTable); } } @@ -12440,13 +12434,16 @@ void InterCodeProcedure::SimplifyIntegerNumeric(FastNumberSet& activeSet) silvused = activeSet.Num(); silvalues.SetSize(silvused + 16, true); - mTemporaries.SetSize(activeSet.Num(), true); + if (silvused != mTemporaries.Size()) + { + mTemporaries.SetSize(activeSet.Num(), true); - ResetVisited(); - mEntryBlock->ShrinkActiveTemporaries(activeSet, mTemporaries); + ResetVisited(); + mEntryBlock->ShrinkActiveTemporaries(activeSet, mTemporaries); - ResetVisited(); - mEntryBlock->RemapActiveTemporaries(activeSet); + ResetVisited(); + mEntryBlock->RemapActiveTemporaries(activeSet); + } ResetVisited(); } while (mEntryBlock->SimplifyIntegerNumeric(silvalues, silvused)); diff --git a/oscar64/InterCode.h b/oscar64/InterCode.h index 3ad783e..6c413c8 100644 --- a/oscar64/InterCode.h +++ b/oscar64/InterCode.h @@ -394,7 +394,7 @@ public: bool PropagateVariableCopy(const GrowingInstructionPtrArray& ctemps, const GrowingVariableArray& staticVars); void BuildLocalTempSets(int num); - void BuildGlobalProvidedTempSet(NumberSet fromProvidedTemps); + void BuildGlobalProvidedTempSet(const NumberSet & fromProvidedTemps); bool BuildGlobalRequiredTempSet(NumberSet& fromRequiredTemps); bool RemoveUnusedResultInstructions(void); void BuildCallerSaveTempSet(NumberSet& callerSaveTemps); @@ -427,7 +427,7 @@ public: void GlobalRenameRegister(const GrowingIntArray& renameTable, GrowingTypeArray& temporaries); void CheckValueUsage(InterInstruction * ins, const GrowingInstructionPtrArray& tvalue, const GrowingVariableArray& staticVars); - void PerformTempForwarding(TempForwardingTable& forwardingTable); + void PerformTempForwarding(const TempForwardingTable& forwardingTable); void PerformValueForwarding(const GrowingInstructionPtrArray& tvalue, const ValueSet& values, FastNumberSet& tvalid, const NumberSet& aliasedLocals, const NumberSet& aliasedParams, int & spareTemps, const GrowingVariableArray& staticVars); void PerformMachineSpecificValueUsageCheck(const GrowingInstructionPtrArray& tvalue, FastNumberSet& tvalid, const GrowingVariableArray& staticVars); bool EliminateDeadBranches(void); diff --git a/oscar64/NumberSet.cpp b/oscar64/NumberSet.cpp index aeacfb2..9cf3792 100644 --- a/oscar64/NumberSet.cpp +++ b/oscar64/NumberSet.cpp @@ -94,8 +94,6 @@ void NumberSet::Clear(void) NumberSet& NumberSet::operator=(const NumberSet& set) { - int i; - this->size = set.size; if (dwsize != set.dwsize) @@ -105,28 +103,36 @@ NumberSet& NumberSet::operator=(const NumberSet& set) this->bits = new uint32[dwsize]; } - for (i = 0; i < dwsize; i++) - bits[i] = set.bits[i]; + int size = dwsize; + const uint32* sbits = set.bits; + uint32* dbits = bits; + + for (int i = 0; i < size; i++) + dbits[i] = sbits[i]; return *this; } NumberSet& NumberSet::operator&=(const NumberSet& set) { - int i; + int size = dwsize; + const uint32* sbits = set.bits; + uint32* dbits = bits; - for (i = 0; i < dwsize; i++) - bits[i] &= set.bits[i]; + for (int i = 0; i < size; i++) + dbits[i] &= sbits[i]; return *this; } NumberSet& NumberSet::operator|=(const NumberSet& set) { - int i; + int size = dwsize; + const uint32* sbits = set.bits; + uint32* dbits = bits; - for (i = 0; i < dwsize; i++) - bits[i] |= set.bits[i]; + for (int i = 0; i < size; i++) + dbits[i] |= sbits[i]; return *this; } diff --git a/oscar64/oscar64.vcxproj b/oscar64/oscar64.vcxproj index 382416e..92b3377 100644 --- a/oscar64/oscar64.vcxproj +++ b/oscar64/oscar64.vcxproj @@ -38,6 +38,7 @@ v142 true Unicode + false Application @@ -81,6 +82,8 @@ false + $(SolutionDir)\$(Configuration)$(Platform)\ + $(Configuration)$(Platform)\ @@ -104,6 +107,7 @@ true WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) true + false Console @@ -127,6 +131,7 @@ Console true + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;version.lib;%(AdditionalDependencies) @@ -143,6 +148,7 @@ true true true + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;version.lib;%(AdditionalDependencies)