diff --git a/oscar64/InterCode.cpp b/oscar64/InterCode.cpp index 55b2367..43b6fbe 100644 --- a/oscar64/InterCode.cpp +++ b/oscar64/InterCode.cpp @@ -12845,10 +12845,12 @@ void InterCodeProcedure::Close(void) DisassembleDebug("Estimated value range 2"); #endif +#if 1 ResetVisited(); mEntryBlock->SimplifyIntegerRangeRelops(); DisassembleDebug("Simplified range limited relational ops"); +#endif #if 1 if (mModule->mCompilerOptions & COPT_OPTIMIZE_AUTO_UNROLL) diff --git a/oscar64/NativeCodeGenerator.cpp b/oscar64/NativeCodeGenerator.cpp index 9e3329a..a8cf622 100644 --- a/oscar64/NativeCodeGenerator.cpp +++ b/oscar64/NativeCodeGenerator.cpp @@ -1,6 +1,9 @@ #include "NativeCodeGenerator.h" #include "CompilerTypes.h" +static bool CheckFunc; + + static const int CPU_REG_A = 256; static const int CPU_REG_X = 257; static const int CPU_REG_Y = 258; @@ -21772,17 +21775,29 @@ bool NativeCodeBasicBlock::OptimizeGenericLoop(NativeCodeProcedure* proc) { block->mTrueJump = block->BuildSingleEntry(proc, block->mTrueJump); if (yreg >= 0) + { block->mTrueJump->mIns.Insert(0, NativeCodeInstruction(ASMIT_STY, ASMIM_ZERO_PAGE, yreg)); + block->mTrueJump->mEntryRequiredRegs += CPU_REG_Y; + } if (xreg >= 0) + { block->mTrueJump->mIns.Insert(0, NativeCodeInstruction(ASMIT_STX, ASMIM_ZERO_PAGE, xreg)); + block->mTrueJump->mEntryRequiredRegs += CPU_REG_X; + } } if (block->mFalseJump && !lblocks.Contains(block->mFalseJump)) { block->mFalseJump = block->BuildSingleEntry(proc, block->mFalseJump); if (yreg >= 0) + { block->mFalseJump->mIns.Insert(0, NativeCodeInstruction(ASMIT_STY, ASMIM_ZERO_PAGE, yreg)); + block->mFalseJump->mEntryRequiredRegs += CPU_REG_Y; + } if (xreg >= 0) + { block->mFalseJump->mIns.Insert(0, NativeCodeInstruction(ASMIT_STX, ASMIM_ZERO_PAGE, xreg)); + block->mFalseJump->mEntryRequiredRegs += CPU_REG_X; + } } for (int j = 0; j < block->mEntryBlocks.Size(); j++) @@ -21791,9 +21806,15 @@ bool NativeCodeBasicBlock::OptimizeGenericLoop(NativeCodeProcedure* proc) { block->mEntryBlocks[j] = block->BuildSingleExit(proc, block->mEntryBlocks[j]); if (yreg >= 0) + { block->mEntryBlocks[j]->mIns.Push(NativeCodeInstruction(ASMIT_LDY, ASMIM_ZERO_PAGE, yreg)); + block->mEntryBlocks[j]->mExitRequiredRegs += CPU_REG_Y; + } if (xreg >= 0) + { block->mEntryBlocks[j]->mIns.Push(NativeCodeInstruction(ASMIT_LDX, ASMIM_ZERO_PAGE, xreg)); + block->mEntryBlocks[j]->mExitRequiredRegs += CPU_REG_X; + } } } @@ -21901,6 +21922,9 @@ bool NativeCodeBasicBlock::OptimizeGenericLoop(NativeCodeProcedure* proc) block->mIns.Insert(j, NativeCodeInstruction(ASMIT_INY)); yoffset++; } + + if (j + 1 == block->mIns.Size() && (ins.mLive & LIVE_CPU_REG_Z) && ins.ChangesAccuAndFlag()) + block->mIns.Push(NativeCodeInstruction(ASMIT_ORA, ASMIM_IMMEDIATE, 0)); } if (xoffset && xreg >= 0 && !(ins.mLive & LIVE_CPU_REG_X)) @@ -21917,6 +21941,9 @@ bool NativeCodeBasicBlock::OptimizeGenericLoop(NativeCodeProcedure* proc) block->mIns.Insert(j, NativeCodeInstruction(ASMIT_INX)); xoffset++; } + + if (j + 1 == block->mIns.Size() && (ins.mLive & LIVE_CPU_REG_Z) && ins.ChangesAccuAndFlag()) + block->mIns.Push(NativeCodeInstruction(ASMIT_ORA, ASMIM_IMMEDIATE, 0)); } if (yreg >= 0) @@ -23212,8 +23239,6 @@ bool NativeCodeBasicBlock::RemoveNops(void) return changed; } -static bool CheckFunc; - bool NativeCodeBasicBlock::PeepHoleOptimizer(NativeCodeProcedure* proc, int pass) { if (!mVisited) @@ -24628,6 +24653,21 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(NativeCodeProcedure* proc, int pass progress = true; } + else if ( + (mIns[i + 0].mType == ASMIT_INX || mIns[i + 0].mType == ASMIT_DEX) && + mIns[i + 1].mType == ASMIT_TXA && !(mIns[i + 1].mLive & LIVE_CPU_REG_A)) + { + mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED; + progress = true; + } + else if ( + (mIns[i + 0].mType == ASMIT_INY || mIns[i + 0].mType == ASMIT_DEY) && + mIns[i + 1].mType == ASMIT_TYA && !(mIns[i + 1].mLive & LIVE_CPU_REG_A)) + { + mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED; + progress = true; + } + else if ( mIns[i + 0].mType == ASMIT_TXA && mIns[i + 1].mType == ASMIT_TAX) @@ -29351,8 +29391,7 @@ void NativeCodeProcedure::RebuildEntry(void) void NativeCodeProcedure::Optimize(void) { -// CheckFunc = !strcmp(mInterProc->mIdent->mString, "bmmc_circle2"); - + CheckFunc = !strcmp(mInterProc->mIdent->mString, "dungeon_rand_path"); #if 1 int step = 0; int cnt = 0; @@ -29470,6 +29509,8 @@ void NativeCodeProcedure::Optimize(void) if (mEntryBlock->PeepHoleOptimizer(this, step)) changed = true; #endif + + // if (cnt == 2) // return; #if 1 @@ -29603,7 +29644,6 @@ void NativeCodeProcedure::Optimize(void) } #endif - #if 1 if (step == 4 || step == 5) { @@ -29811,6 +29851,9 @@ void NativeCodeProcedure::Optimize(void) else cnt++; +// if (CheckFunc && step == 4) +// return; + } while (changed); #if 1