diff --git a/oscar64/InterCode.cpp b/oscar64/InterCode.cpp index 0888e87..a5e47de 100644 --- a/oscar64/InterCode.cpp +++ b/oscar64/InterCode.cpp @@ -8295,10 +8295,44 @@ InterCodeBasicBlock* InterCodeBasicBlock::BuildLoopPrefix(InterCodeProcedure* pr { mLoopPrefix = new InterCodeBasicBlock(); proc->Append(mLoopPrefix); - InterInstruction * jins = new InterInstruction(); + InterInstruction* jins = new InterInstruction(); jins->mCode = IC_JUMP; mLoopPrefix->Append(jins); mLoopPrefix->Close(this, nullptr); + + if (mNumEntries == 2 && mFalseJump) + { + if (mTrueJump == this && mFalseJump != this) + { + if (mFalseJump->mNumEntries > 1) + { + InterCodeBasicBlock* suffix = new InterCodeBasicBlock(); + proc->Append(suffix); + InterInstruction* jins = new InterInstruction(); + jins->mCode = IC_JUMP; + suffix->Append(jins); + suffix->Close(mFalseJump, nullptr); + mFalseJump->mNumEntries--; + mFalseJump = suffix; + suffix->mNumEntries = 1; + } + } + else if (mFalseJump == this && mTrueJump != this) + { + if (mTrueJump->mNumEntries > 1) + { + InterCodeBasicBlock* suffix = new InterCodeBasicBlock(); + proc->Append(suffix); + InterInstruction* jins = new InterInstruction(); + jins->mCode = IC_JUMP; + suffix->Append(jins); + suffix->Close(mTrueJump, nullptr); + mTrueJump->mNumEntries--; + mTrueJump = suffix; + suffix->mNumEntries = 1; + } + } + } } } @@ -8729,6 +8763,71 @@ void InterCodeBasicBlock::SingleBlockLoopOptimisation(const NumberSet& aliasedPa hasCall = true; } +#if 1 + if (!hasCall) + { + // Check forwarding globals + + int i = 0; + for (int i = 0; i < mInstructions.Size(); i++) + { + InterInstruction* ins = mInstructions[i]; + + // A global load + if (ins->mCode == IC_LOAD && ins->mSrc[0].mTemp < 0 && ins->mSrc[0].mMemory == IM_GLOBAL) + { + // Find the last store that overlaps the load + int j = mInstructions.Size() - 1; + while (j > i && !(mInstructions[j]->mCode == IC_STORE && CollidingMem(ins->mSrc[0], mInstructions[j]->mSrc[1]))) + j--; + + if (j > i) + { + InterInstruction* sins = mInstructions[j]; + + // Does a full store + if (SameMem(ins->mSrc[0], sins->mSrc[1])) + { + if (sins->mSrc[0].mTemp >= 0) + { + // Check temp not used before load + int k = 0; + while (k < i && !mInstructions[k]->UsesTemp(sins->mSrc[0].mTemp)) + k++; + if (k == i) + { + // Check temp not modified after load + k = j + 1; + while (k < mInstructions.Size() && mInstructions[k]->mDst.mTemp != sins->mSrc[0].mTemp) + k++; + if (k == mInstructions.Size()) + { + // Move load before loop + mLoopPrefix->mInstructions.Insert(mLoopPrefix->mInstructions.Size() - 1, ins); + InterInstruction* nins = new InterInstruction(); + mInstructions[i] = nins; + nins->mCode = IC_LOAD_TEMPORARY; + nins->mDst.Forward(ins->mDst); + nins->mSrc[0].Forward(sins->mSrc[0]); + ins->mDst.Forward(sins->mSrc[0]); + sins->mSrc[0].mFinal = false; + + // Move store behind loop + if (mTrueJump == this) + mFalseJump->mInstructions.Insert(0, sins); + else + mTrueJump->mInstructions.Insert(0, sins); + mInstructions.Remove(j); + } + } + } + } + } + } + } + } +#endif + GrowingArray tvalues(nullptr); GrowingArray nassigns(0); @@ -8792,7 +8891,7 @@ void InterCodeBasicBlock::SingleBlockLoopOptimisation(const NumberSet& aliasedPa ins->mInvariant = false; } } - else if (ins->mSrc[0].mMemory == sins->mSrc[1].mMemory && ins->mSrc[0].mVarIndex == sins->mSrc[1].mVarIndex && ins->mSrc[0].mLinkerObject == sins->mSrc[1].mLinkerObject) + else if (CollidingMem(ins->mSrc[0], sins->mSrc[1])) { ins->mInvariant = false; } diff --git a/oscar64/NativeCodeGenerator.cpp b/oscar64/NativeCodeGenerator.cpp index 30c05a6..ae2a5fe 100644 --- a/oscar64/NativeCodeGenerator.cpp +++ b/oscar64/NativeCodeGenerator.cpp @@ -172,6 +172,12 @@ NativeCodeInstruction::NativeCodeInstruction(AsmInsType type, AsmInsMode mode, i } } +NativeCodeInstruction::NativeCodeInstruction(AsmInsType type, const NativeCodeInstruction& addr) + : mType(type), mMode(addr.mMode), mAddress(addr.mAddress), mLinkerObject(addr.mLinkerObject), mFlags(addr.mFlags), mParam(addr.mParam), mLive(LIVE_ALL) +{ +} + + bool NativeCodeInstruction::IsUsedResultInstructions(NumberSet& requiredTemps) { bool used = false; @@ -11285,6 +11291,46 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc) mBranch = ASMIT_BNE; break; } + + if (mIns[i + 0].mType == ASMIT_LDA && + mIns[i + 1].mType == ASMIT_CLC && + mIns[i + 2].mType == ASMIT_ADC && mIns[i + 2].mMode == ASMIM_IMMEDIATE && mIns[i + 2].mAddress == 1 && + mIns[i + 3].mType == ASMIT_STA && mIns[i + 0].SameEffectiveAddress(mIns[i + 3]) && + mIns[i + 4].mType == ASMIT_LDA && + mIns[i + 5].mType == ASMIT_ADC && mIns[i + 5].mMode == ASMIM_IMMEDIATE && mIns[i + 5].mAddress == 0 && + mIns[i + 6].mType == ASMIT_STA && mIns[i + 4].SameEffectiveAddress(mIns[i + 6]) && + HasAsmInstructionMode(ASMIT_INC, mIns[i + 3].mMode) && + HasAsmInstructionMode(ASMIT_INC, mIns[i + 6].mMode) && + !(mIns[i + 6].mLive & (LIVE_CPU_REG_A | LIVE_CPU_REG_C | LIVE_CPU_REG_Z))) + { + changed = true; + + NativeCodeBasicBlock* iblock = proc->AllocateBlock(); + NativeCodeBasicBlock* fblock = proc->AllocateBlock(); + + fblock->mTrueJump = mTrueJump; + fblock->mFalseJump = mFalseJump; + fblock->mBranch = mBranch; + + mIns[i + 0].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED; + mIns[i + 1].mType = ASMIT_NOP; + mIns[i + 2].mType = ASMIT_NOP; mIns[i + 2].mMode = ASMIM_IMPLIED; + mIns[i + 3].mType = ASMIT_INC; mIns[i + 3].mLive |= LIVE_CPU_REG_Z; + + for (int j = i + 7; j < mIns.Size(); j++) + fblock->mIns.Push(mIns[j]); + iblock->mIns.Push(mIns[i + 6]); + mIns.SetSize(i + 4); + iblock->mIns[0].mType = ASMIT_INC; + iblock->mTrueJump = fblock; + iblock->mBranch = ASMIT_JMP; + + mTrueJump = fblock; + mFalseJump = iblock; + mBranch = ASMIT_BNE; + break; + } + if (mIns[i + 0].mType == ASMIT_CLC && mIns[i + 1].mType == ASMIT_LDA && mIns[i + 2].mType == ASMIT_ADC && mIns[i + 2].mMode == ASMIM_IMMEDIATE && mIns[i + 2].mAddress == 0xff && @@ -11329,6 +11375,44 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc) } #endif +#if 1 + if (i + 5 < mIns.Size() && + mIns[i + 0].ChangesAccuAndFlag() && + mIns[i + 1].mType == ASMIT_CMP && mIns[i + 1].mMode == ASMIM_IMMEDIATE && mIns[i + 1].mAddress == 0x01 && + mIns[i + 2].mType == ASMIT_LDA && mIns[i + 2].mMode == ASMIM_IMMEDIATE && mIns[i + 2].mAddress == 0x00 && + mIns[i + 3].mType == ASMIT_ADC && mIns[i + 3].mMode == ASMIM_IMMEDIATE && mIns[i + 3].mAddress == 0xff && + mIns[i + 4].mType == ASMIT_AND && mIns[i + 4].mMode == ASMIM_IMMEDIATE && + mIns[i + 5].mType == ASMIT_EOR && mIns[i + 5].mMode == ASMIM_IMMEDIATE) + { + char veq = mIns[i + 4].mAddress ^ mIns[i + 5].mAddress, vne = mIns[i + 5].mAddress; + + changed = true; + + NativeCodeBasicBlock* eblock = proc->AllocateBlock(); + NativeCodeBasicBlock* neblock = proc->AllocateBlock(); + NativeCodeBasicBlock* rblock = proc->AllocateBlock(); + + rblock->mTrueJump = mTrueJump; + rblock->mFalseJump = mFalseJump; + rblock->mBranch = mBranch; + + for (int j = i + 6; j < mIns.Size(); j++) + rblock->mIns.Push(mIns[j]); + mIns.SetSize(i + 1); + + mTrueJump = neblock; + mFalseJump = eblock; + mBranch = ASMIT_BNE; + + if (veq != 0) + eblock->mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, veq)); + neblock->mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, vne)); + + eblock->Close(rblock, nullptr, ASMIT_JMP); + neblock->Close(rblock, nullptr, ASMIT_JMP); + break; + } +#endif #if 1 if (i + 12 < mIns.Size()) { @@ -11537,6 +11621,91 @@ bool NativeCodeBasicBlock::ExpandADCToBranch(NativeCodeProcedure* proc) } + if (mIns.Size() >= 8 && mFalseJump && (mBranch == ASMIT_BNE || mBranch == ASMIT_BEQ)) + { + int sz = mIns.Size(); + + if (mIns[sz - 8].mType == ASMIT_LDA && + mIns[sz - 7].mType == ASMIT_CLC && + mIns[sz - 6].mType == ASMIT_ADC && mIns[sz - 6].mMode == ASMIM_IMMEDIATE && mIns[sz - 6].mAddress == 0xff && + mIns[sz - 5].mType == ASMIT_STA && mIns[sz - 5].SameEffectiveAddress(mIns[sz - 8]) && + mIns[sz - 4].mType == ASMIT_LDA && + mIns[sz - 3].mType == ASMIT_ADC && mIns[sz - 3].mMode == ASMIM_IMMEDIATE && mIns[sz - 3].mAddress == 0xff && + mIns[sz - 2].mType == ASMIT_STA && mIns[sz - 2].SameEffectiveAddress(mIns[sz - 4]) && + mIns[sz - 1].mType == ASMIT_ORA && mIns[sz - 1].SameEffectiveAddress(mIns[sz - 5]) && + HasAsmInstructionMode(ASMIT_DEC, mIns[sz - 5].mMode) && + HasAsmInstructionMode(ASMIT_DEC, mIns[sz - 2].mMode) && + !(mIns[sz - 1].mLive & (LIVE_CPU_REG_A | LIVE_CPU_REG_C))) + { + changed = true; + + NativeCodeBasicBlock* eblock, * neblock; + if (mBranch == ASMIT_BEQ) + { + eblock = mTrueJump; + neblock = mFalseJump; + } + else + { + eblock = mFalseJump; + neblock = mTrueJump; + } + + NativeCodeBasicBlock* hblock = proc->AllocateBlock(); + NativeCodeBasicBlock* lblock = proc->AllocateBlock(); + NativeCodeBasicBlock* oblock = proc->AllocateBlock(); + + mBranch = ASMIT_BNE; + mTrueJump = lblock; + mFalseJump = hblock; + + hblock->mBranch = ASMIT_JMP; + hblock->mTrueJump = lblock; + + lblock->mBranch = ASMIT_BNE; + lblock->mTrueJump = neblock; + lblock->mFalseJump = oblock; + + oblock->mBranch = ASMIT_BNE; + oblock->mTrueJump = neblock; + oblock->mFalseJump = eblock; + + hblock->mIns.Push(NativeCodeInstruction(ASMIT_DEC, mIns[sz - 4])); + lblock->mIns.Push(NativeCodeInstruction(ASMIT_DEC, mIns[sz - 5])); + oblock->mIns.Push(NativeCodeInstruction(ASMIT_LDA, mIns[sz - 4])); + + mIns[sz - 8].mLive |= LIVE_CPU_REG_Z; + mIns.SetSize(sz - 7); + +#if 0 + fblock->mTrueJump = mTrueJump; + fblock->mFalseJump = mFalseJump; + fblock->mBranch = mBranch; + + fblock->mIns.Push(mIns[i + 1]); + fblock->mIns[0].mType = ASMIT_DEC; + + mIns[i + 0].mType = ASMIT_NOP; + mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED; + mIns[i + 2].mType = ASMIT_NOP; mIns[i + 2].mMode = ASMIM_IMPLIED; + mIns[i + 3].mType = ASMIT_LDA; mIns[i + 3].mLive |= LIVE_CPU_REG_Z; + + for (int j = i + 7; j < mIns.Size(); j++) + fblock->mIns.Push(mIns[j]); + iblock->mIns.Push(mIns[i + 6]); + mIns.SetSize(i + 4); + iblock->mIns[0].mType = ASMIT_DEC; + iblock->mTrueJump = fblock; + iblock->mBranch = ASMIT_JMP; + + mTrueJump = fblock; + mFalseJump = iblock; + mBranch = ASMIT_BNE; +#endif + } + + } + #if 1 if (mIns.Size() >= 1 && mFalseJump) { @@ -12145,6 +12314,123 @@ NativeCodeBasicBlock* NativeCodeBasicBlock::AddDominatorBlock(NativeCodeProcedur return pblock; } +static bool ReferencedOnPath(const NativeCodeBasicBlock* block, int start, int end, int address) +{ + for (int i = start; i < end; i++) + if (block->mIns[i].ReferencesZeroPage(address)) + return true; + return false; +} + +static bool ChangedOnPath(const NativeCodeBasicBlock* block, int start, int end, int address) +{ + for (int i = start; i < end; i++) + if (block->mIns[i].ChangesZeroPage(address)) + return true; + return false; +} + +bool NativeCodeBasicBlock::PropagateSinglePath(void) +{ + bool changed = false; + + if (!mVisited) + { + mVisited = true; + + CheckLive(); + + if (mTrueJump && mFalseJump && mTrueJump->mNumEntries == 1 && mFalseJump->mNumEntries == 1) + { + int i = 0; + while (i < mIns.Size()) + { +#if 1 + if (!mExitRequiredRegs[CPU_REG_A] && + i + 1 < mIns.Size() && + mIns[i + 0].mType == ASMIT_LDA && mIns[i + 0].mMode == ASMIM_ZERO_PAGE && + mIns[i + 1].mType == ASMIT_STA && mIns[i + 1].mMode == ASMIM_ZERO_PAGE) + { + if (!ReferencedOnPath(this, i + 2, mIns.Size(), mIns[i + 1].mAddress) && + !ChangedOnPath(this, i + 2, mIns.Size(), mIns[i + 0].mAddress)) + { + if (mTrueJump->mEntryRequiredRegs[mIns[i + 1].mAddress] && + !mFalseJump->mEntryRequiredRegs[mIns[i + 1].mAddress]) + { + for (int j = 0; j < 2; j++) + mTrueJump->mIns.Insert(j, mIns[i + j]); + mIns.Remove(i + 1); + changed = true; + } + else if (mFalseJump->mEntryRequiredRegs[mIns[i + 1].mAddress] && + !mTrueJump->mEntryRequiredRegs[mIns[i + 1].mAddress]) + { + for (int j = 0; j < 2; j++) + mFalseJump->mIns.Insert(j, mIns[i + j]); + mIns.Remove(i + 1); + changed = true; + } + } + } +#endif +#if 1 + if (!mExitRequiredRegs[CPU_REG_A] && + i + 6 < mIns.Size() && + mIns[i + 0].mType == ASMIT_CLC && + mIns[i + 1].mType == ASMIT_LDA && mIns[i + 1].mMode == ASMIM_ZERO_PAGE && + mIns[i + 2].mType == ASMIT_ADC && mIns[i + 2].mMode == ASMIM_ZERO_PAGE && + mIns[i + 3].mType == ASMIT_STA && mIns[i + 3].mMode == ASMIM_ZERO_PAGE && + mIns[i + 4].mType == ASMIT_LDA && mIns[i + 4].mMode == ASMIM_ZERO_PAGE && + mIns[i + 5].mType == ASMIT_ADC && mIns[i + 5].mMode == ASMIM_IMMEDIATE && + mIns[i + 6].mType == ASMIT_STA && mIns[i + 6].mMode == ASMIM_ZERO_PAGE && + !(mIns[i + 6].mLive & (LIVE_CPU_REG_A | LIVE_CPU_REG_C | LIVE_CPU_REG_Z))) + { + if (!ReferencedOnPath(this, i + 7, mIns.Size(), mIns[i + 3].mAddress) && + !ReferencedOnPath(this, i + 7, mIns.Size(), mIns[i + 6].mAddress) && + !ChangedOnPath(this, i + 7, mIns.Size(), mIns[i + 1].mAddress) && + !ChangedOnPath(this, i + 7, mIns.Size(), mIns[i + 2].mAddress) && + !ChangedOnPath(this, i + 7, mIns.Size(), mIns[i + 4].mAddress)) + { + if (mTrueJump->mEntryRequiredRegs[mIns[i + 3].mAddress] && mTrueJump->mEntryRequiredRegs[mIns[i + 6].mAddress] && + !mFalseJump->mEntryRequiredRegs[mIns[i + 3].mAddress] && !mFalseJump->mEntryRequiredRegs[mIns[i + 6].mAddress]) + { + for (int j = 0; j < 7; j++) + { + mTrueJump->mIns.Insert(j, mIns[i]); + mIns.Remove(i); + } + changed = true; + i--; + } + else if (mFalseJump->mEntryRequiredRegs[mIns[i + 3].mAddress] && mFalseJump->mEntryRequiredRegs[mIns[i + 6].mAddress] && + !mTrueJump->mEntryRequiredRegs[mIns[i + 3].mAddress] && !mTrueJump->mEntryRequiredRegs[mIns[i + 6].mAddress]) + { + for (int j = 0; j < 7; j++) + { + mFalseJump->mIns.Insert(j, mIns[i]); + mIns.Remove(i); + } + changed = true; + i--; + } + } + } +#endif + + i++; + } + } + + if (mTrueJump && mTrueJump->PropagateSinglePath()) + changed = true; + if (mFalseJump && mFalseJump->PropagateSinglePath()) + changed = true; + } + + return changed; +} + + bool NativeCodeBasicBlock::JoinTailCodeSequences(NativeCodeProcedure* proc, bool loops) { bool changed = false; @@ -12712,7 +12998,7 @@ bool NativeCodeBasicBlock::CheckForwardSumYPointer(const NativeCodeBasicBlock* b yval = (yval - 1) & 255; else if (ins.mType == ASMIT_JSR) { - if (ins.UsesZeroPage(reg) || ins.UsesZeroPage(reg + 1)) + if (ins.UsesZeroPage(reg) || ins.UsesZeroPage(reg + 1) || ins.ChangesZeroPage(base) || ins.ChangesZeroPage(base + 1) || ins.ChangesZeroPage(index)) return false; yval = -1; } @@ -14802,6 +15088,10 @@ bool NativeCodeBasicBlock::MoveLoadAddImmStoreUp(int at) for (int i = j + 1; i < at; i++) mIns[i].mLive |= LIVE_CPU_REG_C; + mIns[at + 0].mLive |= mIns[j].mLive; + mIns[at + 2].mLive |= mIns[j].mLive; + mIns[at + 3].mLive |= mIns[j].mLive; + mIns.Insert(j + 1, mIns[at + 3]); // STA mIns.Insert(j + 1, mIns[at + 3]); // ADC mIns.Insert(j + 1, mIns[at + 2]); // CLC @@ -14839,6 +15129,10 @@ bool NativeCodeBasicBlock::MoveCLCLoadAddZPStoreUp(int at) for (int i = j + 1; i < at; i++) mIns[i].mLive |= LIVE_CPU_REG_C; + mIns[at + 0].mLive |= mIns[j].mLive; + mIns[at + 2].mLive |= mIns[j].mLive; + mIns[at + 3].mLive |= mIns[j].mLive; + mIns.Insert(j + 1, mIns[at + 3]); // STA mIns.Insert(j + 1, mIns[at + 3]); // ADC mIns.Insert(j + 1, mIns[at + 2]); // CLC @@ -14998,6 +15292,9 @@ bool NativeCodeBasicBlock::MoveLoadAddZPStoreUp(int at) { if (mIns[j].mType == ASMIT_STA && mIns[j].mMode == ASMIM_ZERO_PAGE && mIns[j].mAddress == mIns[at + 0].mAddress) { + mIns[at + 1].mLive |= mIns[j].mLive; + mIns[at + 2].mLive |= mIns[j].mLive; + mIns.Insert(j + 1, mIns[at + 2]); // STA mIns.Insert(j + 1, mIns[at + 2]); // ADC @@ -18511,6 +18808,46 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(NativeCodeProcedure* proc, int pass #endif +#if 1 + // move ldy, sty down if live + + for (int i = 0; i + 2 < mIns.Size(); i++) + { + if (mIns[i + 0].mType == ASMIT_LDY && (mIns[i + 0].mMode == ASMIM_ZERO_PAGE || mIns[i + 0].mMode == ASMIM_ABSOLUTE) && + mIns[i + 1].mType == ASMIT_STY && (mIns[i + 1].mMode == ASMIM_ZERO_PAGE || mIns[i + 1].mMode == ASMIM_ABSOLUTE) && + (mIns[i + 2].mLive & LIVE_CPU_REG_Y)) + { + int j = i; + while (j + 2 < mIns.Size() && + !mIns[j + 2].ReferencesYReg() && !(mIns[j + 2].SameEffectiveAddress(mIns[j + 0]) && mIns[j + 2].ChangesAddress()) && !mIns[j + 2].SameEffectiveAddress(mIns[j + 1])) + { + mIns[j + 0].mLive |= mIns[j + 2].mLive; + mIns[j + 1].mLive |= mIns[j + 2].mLive; + mIns[j + 2].mLive &= ~LIVE_CPU_REG_Y; + mIns.Insert(j, mIns[j + 2]); + mIns.Remove(j + 3); + j++; + } + } + else if (mIns[i + 0].mType == ASMIT_LDX && (mIns[i + 0].mMode == ASMIM_ZERO_PAGE || mIns[i + 0].mMode == ASMIM_ABSOLUTE) && + mIns[i + 1].mType == ASMIT_STX && (mIns[i + 1].mMode == ASMIM_ZERO_PAGE || mIns[i + 1].mMode == ASMIM_ABSOLUTE) && + (mIns[i + 2].mLive & LIVE_CPU_REG_X)) + { + int j = i; + while (j + 2 < mIns.Size() && + !mIns[j + 2].ReferencesXReg() && !(mIns[j + 2].SameEffectiveAddress(mIns[j + 0]) && mIns[j + 2].ChangesAddress()) && !mIns[j + 2].SameEffectiveAddress(mIns[j + 1])) + { + mIns[j + 0].mLive |= mIns[j + 2].mLive; + mIns[j + 1].mLive |= mIns[j + 2].mLive; + mIns[j + 2].mLive &= ~LIVE_CPU_REG_X; + mIns.Insert(j, mIns[j + 2]); + mIns.Remove(j + 3); + j++; + } + } + } +#endif + #if 1 // move clc and sec down for (int i = 0; i + 1 < mIns.Size(); i++) @@ -19294,7 +19631,6 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(NativeCodeProcedure* proc, int pass mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED; progress = true; } -#if 1 else if (mIns[i + 0].mType == ASMIT_LDA && mIns[i + 0].mMode == ASMIM_IMMEDIATE && mIns[i + 0].mAddress == 0 && mIns[i + 1].mType == ASMIT_CMP && !(mIns[i + 1].mLive & (LIVE_CPU_REG_C | LIVE_CPU_REG_A))) { @@ -19302,7 +19638,6 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(NativeCodeProcedure* proc, int pass mIns[i + 1].mType = ASMIT_LDA; progress = true; } -#endif else if (mIns[i + 0].mType == ASMIT_LDA && mIns[i + 0].mMode == ASMIM_IMMEDIATE && mIns[i + 1].mType == ASMIT_ASL && mIns[i + 1].mMode == ASMIM_IMPLIED) { int aval = mIns[i + 0].mAddress << 1; @@ -20616,6 +20951,28 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(NativeCodeProcedure* proc, int pass mIns[i + 2].mType = ASMIT_DEX; mIns[i + 2].mMode = ASMIM_IMPLIED; progress = true; } + else if ( + mIns[i + 0].mType == ASMIT_LDA && (mIns[i + 0].mMode == ASMIM_ZERO_PAGE || mIns[i + 0].mMode == ASMIM_ABSOLUTE) && + mIns[i + 1].mType == ASMIT_TAX && + mIns[i + 2].mType == ASMIT_STA && (mIns[i + 2].mMode == ASMIM_ZERO_PAGE || mIns[i + 2].mMode == ASMIM_ABSOLUTE) && + !(mIns[i + 2].mLive & LIVE_CPU_REG_A)) + { + mIns[i + 0].mType = ASMIT_LDX; mIns[i + 0].mLive |= LIVE_CPU_REG_X; + mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED; + mIns[i + 2].mType = ASMIT_STX; + progress = true; + } + else if ( + mIns[i + 0].mType == ASMIT_LDA && (mIns[i + 0].mMode == ASMIM_ZERO_PAGE || mIns[i + 0].mMode == ASMIM_ABSOLUTE) && + mIns[i + 1].mType == ASMIT_TAY && + mIns[i + 2].mType == ASMIT_STA && (mIns[i + 2].mMode == ASMIM_ZERO_PAGE || mIns[i + 2].mMode == ASMIM_ABSOLUTE) && + !(mIns[i + 2].mLive & LIVE_CPU_REG_A)) + { + mIns[i + 0].mType = ASMIT_LDY; mIns[i + 0].mLive |= LIVE_CPU_REG_Y; + mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED; + mIns[i + 2].mType = ASMIT_STY; + progress = true; + } if ( mIns[i + 0].mType == ASMIT_LDY && mIns[i + 0].mMode == ASMIM_IMMEDIATE && mIns[i + 0].mAddress <= 1 && @@ -21840,7 +22197,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(NativeCodeProcedure* proc, int pass #endif -#if 1 +#if 0 if (mIns[i + 0].mType == ASMIT_CLC && mIns[i + 1].mType == ASMIT_LDA && mIns[i + 1].mMode == ASMIM_ZERO_PAGE && mIns[i + 2].mType == ASMIT_ADC && mIns[i + 2].mMode == ASMIM_ZERO_PAGE && @@ -21867,6 +22224,34 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(NativeCodeProcedure* proc, int pass } } #endif +#if 1 + if (mIns[i + 0].mType == ASMIT_CLC && + mIns[i + 1].mType == ASMIT_LDA && mIns[i + 1].mMode == ASMIM_ZERO_PAGE && + mIns[i + 2].mType == ASMIT_ADC && mIns[i + 2].mMode == ASMIM_ZERO_PAGE && + mIns[i + 3].mType == ASMIT_STA && mIns[i + 3].mMode == ASMIM_ZERO_PAGE && mIns[i + 3].mAddress != mIns[i + 1].mAddress && mIns[i + 3].mAddress != mIns[i + 2].mAddress && + mIns[i + 4].mType == ASMIT_LDA && mIns[i + 4].mMode == ASMIM_ZERO_PAGE && mIns[i + 4].mAddress == mIns[i + 1].mAddress + 1 && + mIns[i + 5].mType == ASMIT_ADC && mIns[i + 5].mMode == ASMIM_IMMEDIATE && mIns[i + 5].mAddress == 0 && + mIns[i + 6].mType == ASMIT_STA && mIns[i + 6].mMode == ASMIM_ZERO_PAGE && mIns[i + 6].mAddress == mIns[i + 3].mAddress + 1 && + !(mIns[i + 6].mLive & LIVE_CPU_REG_A)) + { + proc->ResetPatched(); + if (CheckForwardSumYPointer(this, mIns[i + 3].mAddress, mIns[i + 1].mAddress, mIns[i + 2].mAddress, i + 7, -1)) + { +#if 0 + mIns[i + 0].mType = ASMIT_NOP; mIns[i + 0].mMode = ASMIM_IMPLIED; + mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED; + mIns[i + 2].mType = ASMIT_LDA; mIns[i + 2].mLive |= LIVE_CPU_REG_A; + + mIns[i + 4].mType = ASMIT_NOP; mIns[i + 4].mMode = ASMIM_IMPLIED; + mIns[i + 5].mType = ASMIT_NOP; mIns[i + 5].mMode = ASMIM_IMPLIED; + mIns[i + 6].mType = ASMIT_NOP; mIns[i + 6].mMode = ASMIM_IMPLIED; +#endif + proc->ResetPatched(); + if (PatchForwardSumYPointer(this, mIns[i + 3].mAddress, mIns[i + 1].mAddress, mIns[i + 2].mAddress, i + 7, -1)) + progress = true; + } + } +#endif #if 1 if ( mIns[i + 0].mType == ASMIT_STA && mIns[i + 0].mMode == ASMIM_ZERO_PAGE && @@ -21881,13 +22266,14 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(NativeCodeProcedure* proc, int pass proc->ResetPatched(); if (CheckForwardSumYPointer(this, mIns[i + 3].mAddress, mIns[i + 2].mAddress, mIns[i + 0].mAddress, i + 7, -1)) { +#if 0 mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED; mIns[i + 2].mType = ASMIT_NOP; mIns[i + 2].mMode = ASMIM_IMPLIED; mIns[i + 3].mType = ASMIT_NOP; mIns[i + 3].mMode = ASMIM_IMPLIED; mIns[i + 4].mType = ASMIT_NOP; mIns[i + 4].mMode = ASMIM_IMPLIED; mIns[i + 5].mType = ASMIT_NOP; mIns[i + 5].mMode = ASMIM_IMPLIED; mIns[i + 6].mType = ASMIT_NOP; mIns[i + 6].mMode = ASMIM_IMPLIED; - +#endif proc->ResetPatched(); if (PatchForwardSumYPointer(this, mIns[i + 3].mAddress, mIns[i + 2].mAddress, mIns[i + 0].mAddress, i + 7, -1)) progress = true; @@ -23160,10 +23546,13 @@ void NativeCodeProcedure::Optimize(void) #endif #if 1 - ResetVisited(); - if (mEntryBlock->OptimizeSelect(this)) + if (step < 6) { - changed = true; + ResetVisited(); + if (mEntryBlock->OptimizeSelect(this)) + { + changed = true; + } } #if 1 if (step == 3) @@ -23207,6 +23596,10 @@ void NativeCodeProcedure::Optimize(void) ResetVisited(); if (mEntryBlock->JoinTailCodeSequences(this, step > 3)) changed = true; + + ResetVisited(); + if (mEntryBlock->PropagateSinglePath()) + changed = true; } #endif #if 1 diff --git a/oscar64/NativeCodeGenerator.h b/oscar64/NativeCodeGenerator.h index 3662005..fd06ae2 100644 --- a/oscar64/NativeCodeGenerator.h +++ b/oscar64/NativeCodeGenerator.h @@ -66,6 +66,7 @@ class NativeCodeInstruction { public: NativeCodeInstruction(AsmInsType type = ASMIT_INV, AsmInsMode mode = ASMIM_IMPLIED, int address = 0, LinkerObject * linkerObject = nullptr, uint32 flags = NCIF_LOWER | NCIF_UPPER, int param = 0); + NativeCodeInstruction(AsmInsType type, const NativeCodeInstruction & addr); AsmInsType mType; AsmInsMode mMode; @@ -310,6 +311,7 @@ public: NativeCodeBasicBlock* AddDominatorBlock(NativeCodeProcedure* proc, NativeCodeBasicBlock* pblock); bool JoinTailCodeSequences(NativeCodeProcedure* proc, bool loops); bool SameTail(const NativeCodeInstruction& ins) const; + bool PropagateSinglePath(void); NativeRegisterDataSet mEntryRegisterDataSet; diff --git a/oscar64/oscar64.cpp b/oscar64/oscar64.cpp index 0a5e155..13203d0 100644 --- a/oscar64/oscar64.cpp +++ b/oscar64/oscar64.cpp @@ -74,7 +74,7 @@ int main2(int argc, const char** argv) #else strcpy(strProductName, "oscar64"); - strcpy(strProductVersion, "1.7.126"); + strcpy(strProductVersion, "1.7.127"); #ifdef __APPLE__ uint32_t length = sizeof(basePath); diff --git a/oscar64/oscar64.rc b/oscar64/oscar64.rc index 9f0fe70..23e238e 100644 --- a/oscar64/oscar64.rc +++ b/oscar64/oscar64.rc @@ -25,8 +25,8 @@ LANGUAGE LANG_ENGLISH, SUBLANG_NEUTRAL // VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,7,126,0 - PRODUCTVERSION 1,7,126,0 + FILEVERSION 1,7,127,0 + PRODUCTVERSION 1,7,127,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -43,12 +43,12 @@ BEGIN BEGIN VALUE "CompanyName", "oscar64" VALUE "FileDescription", "oscar64 compiler" - VALUE "FileVersion", "1.7.126.0" + VALUE "FileVersion", "1.7.127.0" VALUE "InternalName", "oscar64.exe" VALUE "LegalCopyright", "Copyright (C) 2021" VALUE "OriginalFilename", "oscar64.exe" VALUE "ProductName", "oscar64" - VALUE "ProductVersion", "1.7.126.0" + VALUE "ProductVersion", "1.7.127.0" END END BLOCK "VarFileInfo" diff --git a/oscar64setup/oscar64setup.vdproj b/oscar64setup/oscar64setup.vdproj index 9d27c4d..8e13855 100644 --- a/oscar64setup/oscar64setup.vdproj +++ b/oscar64setup/oscar64setup.vdproj @@ -34,12 +34,6 @@ } "Entry" { - "MsmKey" = "8:_03D7013B0D39A89CEA9D267005ADCE39" - "OwnerKey" = "8:_FB2E467BC172457785F4279BB0BFE8B6" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { "MsmKey" = "8:_04ABABC55200450383686DD782DD1548" "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" @@ -166,12 +160,6 @@ } "Entry" { - "MsmKey" = "8:_326B44043E3720E0A341FB5627DA8873" - "OwnerKey" = "8:_FB2E467BC172457785F4279BB0BFE8B6" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { "MsmKey" = "8:_3277DE1463544F67B7E7390175F8A9CF" "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" @@ -184,12 +172,6 @@ } "Entry" { - "MsmKey" = "8:_36B4A1247BFCE001E1BAE7560E9CFEEA" - "OwnerKey" = "8:_FB2E467BC172457785F4279BB0BFE8B6" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { "MsmKey" = "8:_379EE3C17FEC4C5EA79D07668CD05FC4" "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" @@ -262,12 +244,6 @@ } "Entry" { - "MsmKey" = "8:_458189403F0009BC49371204B74F3BD3" - "OwnerKey" = "8:_FB2E467BC172457785F4279BB0BFE8B6" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { "MsmKey" = "8:_47A877D439EE429BAB64C52FEF69EDA4" "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" @@ -394,12 +370,6 @@ } "Entry" { - "MsmKey" = "8:_749A2BA18335F50EB53CCE7029861FBC" - "OwnerKey" = "8:_FB2E467BC172457785F4279BB0BFE8B6" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { "MsmKey" = "8:_749F54DFBD4D404DA9C2E2D5BA7CDDBF" "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" @@ -460,12 +430,6 @@ } "Entry" { - "MsmKey" = "8:_8667075410229C38BF63AC1CC776055E" - "OwnerKey" = "8:_FB2E467BC172457785F4279BB0BFE8B6" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { "MsmKey" = "8:_8827B6B07A1C4B32B08DF784E090381D" "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" @@ -796,12 +760,6 @@ } "Entry" { - "MsmKey" = "8:_DD5A4DD822437085CD584319732F2D4D" - "OwnerKey" = "8:_FB2E467BC172457785F4279BB0BFE8B6" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { "MsmKey" = "8:_DEADBEA270134B77800770802B21859C" "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" @@ -862,12 +820,6 @@ } "Entry" { - "MsmKey" = "8:_EA3C0BCB01F2639DFA2E37EC8436E5F6" - "OwnerKey" = "8:_FB2E467BC172457785F4279BB0BFE8B6" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { "MsmKey" = "8:_ED872D39D58443D590B7C80604BC0FF4" "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" @@ -898,12 +850,6 @@ } "Entry" { - "MsmKey" = "8:_F20F5618C7576D758C01D89C87469AF8" - "OwnerKey" = "8:_FB2E467BC172457785F4279BB0BFE8B6" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { "MsmKey" = "8:_F35970F9D8FA46B09F36D7E9DE5532CA" "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" @@ -1085,26 +1031,6 @@ "IsDependency" = "11:FALSE" "IsolateTo" = "8:" } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_03D7013B0D39A89CEA9D267005ADCE39" - { - "SourcePath" = "8:VCRUNTIME140.dll" - "TargetName" = "8:VCRUNTIME140.dll" - "Tag" = "8:" - "Folder" = "8:_607E75AF0E2A4CB9908C4C39DF8FE6E4" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_04ABABC55200450383686DD782DD1548" { "SourcePath" = "8:..\\samples\\games\\lander.c" @@ -1525,26 +1451,6 @@ "IsDependency" = "11:FALSE" "IsolateTo" = "8:" } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_326B44043E3720E0A341FB5627DA8873" - { - "SourcePath" = "8:api-ms-win-crt-stdio-l1-1-0.dll" - "TargetName" = "8:api-ms-win-crt-stdio-l1-1-0.dll" - "Tag" = "8:" - "Folder" = "8:_607E75AF0E2A4CB9908C4C39DF8FE6E4" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_3277DE1463544F67B7E7390175F8A9CF" { "SourcePath" = "8:..\\samples\\rasterirq\\autocrawler.c" @@ -1585,26 +1491,6 @@ "IsDependency" = "11:FALSE" "IsolateTo" = "8:" } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_36B4A1247BFCE001E1BAE7560E9CFEEA" - { - "SourcePath" = "8:api-ms-win-crt-math-l1-1-0.dll" - "TargetName" = "8:api-ms-win-crt-math-l1-1-0.dll" - "Tag" = "8:" - "Folder" = "8:_607E75AF0E2A4CB9908C4C39DF8FE6E4" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_379EE3C17FEC4C5EA79D07668CD05FC4" { "SourcePath" = "8:..\\samples\\memmap\\easyflash.c" @@ -1845,26 +1731,6 @@ "IsDependency" = "11:FALSE" "IsolateTo" = "8:" } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_458189403F0009BC49371204B74F3BD3" - { - "SourcePath" = "8:api-ms-win-crt-string-l1-1-0.dll" - "TargetName" = "8:api-ms-win-crt-string-l1-1-0.dll" - "Tag" = "8:" - "Folder" = "8:_607E75AF0E2A4CB9908C4C39DF8FE6E4" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_47A877D439EE429BAB64C52FEF69EDA4" { "SourcePath" = "8:..\\samples\\memmap\\largemem.c" @@ -2285,26 +2151,6 @@ "IsDependency" = "11:FALSE" "IsolateTo" = "8:" } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_749A2BA18335F50EB53CCE7029861FBC" - { - "SourcePath" = "8:api-ms-win-crt-runtime-l1-1-0.dll" - "TargetName" = "8:api-ms-win-crt-runtime-l1-1-0.dll" - "Tag" = "8:" - "Folder" = "8:_607E75AF0E2A4CB9908C4C39DF8FE6E4" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_749F54DFBD4D404DA9C2E2D5BA7CDDBF" { "SourcePath" = "8:..\\samples\\resources\\breakoutchars.bin" @@ -2505,26 +2351,6 @@ "IsDependency" = "11:FALSE" "IsolateTo" = "8:" } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_8667075410229C38BF63AC1CC776055E" - { - "SourcePath" = "8:api-ms-win-crt-filesystem-l1-1-0.dll" - "TargetName" = "8:api-ms-win-crt-filesystem-l1-1-0.dll" - "Tag" = "8:" - "Folder" = "8:_607E75AF0E2A4CB9908C4C39DF8FE6E4" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_8827B6B07A1C4B32B08DF784E090381D" { "SourcePath" = "8:..\\samples\\memmap\\tsr.c" @@ -3625,26 +3451,6 @@ "IsDependency" = "11:FALSE" "IsolateTo" = "8:" } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_DD5A4DD822437085CD584319732F2D4D" - { - "SourcePath" = "8:api-ms-win-crt-heap-l1-1-0.dll" - "TargetName" = "8:api-ms-win-crt-heap-l1-1-0.dll" - "Tag" = "8:" - "Folder" = "8:_607E75AF0E2A4CB9908C4C39DF8FE6E4" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_DEADBEA270134B77800770802B21859C" { "SourcePath" = "8:..\\samples\\games\\connectfour.c" @@ -3845,26 +3651,6 @@ "IsDependency" = "11:FALSE" "IsolateTo" = "8:" } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_EA3C0BCB01F2639DFA2E37EC8436E5F6" - { - "SourcePath" = "8:VERSION.dll" - "TargetName" = "8:VERSION.dll" - "Tag" = "8:" - "Folder" = "8:_607E75AF0E2A4CB9908C4C39DF8FE6E4" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_ED872D39D58443D590B7C80604BC0FF4" { "SourcePath" = "8:..\\samples\\kernalio\\fileread.c" @@ -3965,26 +3751,6 @@ "IsDependency" = "11:FALSE" "IsolateTo" = "8:" } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_F20F5618C7576D758C01D89C87469AF8" - { - "SourcePath" = "8:api-ms-win-crt-locale-l1-1-0.dll" - "TargetName" = "8:api-ms-win-crt-locale-l1-1-0.dll" - "Tag" = "8:" - "Folder" = "8:_607E75AF0E2A4CB9908C4C39DF8FE6E4" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_F35970F9D8FA46B09F36D7E9DE5532CA" { "SourcePath" = "8:..\\include\\c64\\charwin.h" @@ -4361,15 +4127,15 @@ { "Name" = "8:Microsoft Visual Studio" "ProductName" = "8:oscar64" - "ProductCode" = "8:{75E6858C-F4C7-408B-A9E2-E1DC9B2FD03B}" - "PackageCode" = "8:{B04A68D8-DF4C-49FC-A0A4-2C51B24676B9}" + "ProductCode" = "8:{DF3630AB-F113-4BB0-8CDF-4EC257D6F55B}" + "PackageCode" = "8:{6ECF2FD0-FB99-4AF4-9F9D-D8B11EB77A29}" "UpgradeCode" = "8:{9AB61EFF-ACAC-4079-9950-8D96615CD4EF}" "AspNetVersion" = "8:2.0.50727.0" "RestartWWWService" = "11:FALSE" "RemovePreviousVersions" = "11:TRUE" "DetectNewerInstalledVersion" = "11:TRUE" "InstallAllUsers" = "11:FALSE" - "ProductVersion" = "8:1.7.126" + "ProductVersion" = "8:1.7.127" "Manufacturer" = "8:oscar64" "ARPHELPTELEPHONE" = "8:" "ARPHELPLINK" = "8:"