diff --git a/codeGenCpu6502/src/prog8/codegen/cpu6502/AsmOptimizer.kt b/codeGenCpu6502/src/prog8/codegen/cpu6502/AsmOptimizer.kt index 42459abb5..5180b8583 100644 --- a/codeGenCpu6502/src/prog8/codegen/cpu6502/AsmOptimizer.kt +++ b/codeGenCpu6502/src/prog8/codegen/cpu6502/AsmOptimizer.kt @@ -43,7 +43,14 @@ internal fun optimizeAssembly(lines: MutableList, machine: IMachineDefin numberOfOptimizations++ } - mods= optimizeJsrRtsAndOtherCombinations(linesByFour) + mods = optimizeJsrRtsAndOtherCombinations(linesByFour) + if(mods.isNotEmpty()) { + apply(mods, lines) + linesByFour = getLinesBy(lines, 4) + numberOfOptimizations++ + } + + mods = optimizeUselessPushPopStack(linesByFour) if(mods.isNotEmpty()) { apply(mods, lines) linesByFour = getLinesBy(lines, 4) @@ -517,3 +524,40 @@ private fun optimizeJsrRtsAndOtherCombinations(linesByFour: List>>): List { + val mods = mutableListOf() + + fun optimize(register: Char, lines: List>) { + if(lines[0].value.trimStart().startsWith("ph$register")) { + if(lines[2].value.trimStart().startsWith("pl$register")) { + val second = lines[1].value.trimStart().take(6).lowercase() + if(register!in second + && !second.startsWith("jsr") + && !second.startsWith("pl") + && !second.startsWith("ph")) { + mods.add(Modification(lines[0].index, true, null)) + mods.add(Modification(lines[2].index, true, null)) + } + } + else if (lines[3].value.trimStart().startsWith("pl$register")) { + val second = lines[1].value.trimStart().take(6).lowercase() + val third = lines[2].value.trimStart().take(6).lowercase() + if(register !in second && register !in third + && !second.startsWith("jsr") && !third.startsWith("jsr") + && !second.startsWith("pl") && !third.startsWith("pl") + && !second.startsWith("ph") && !third.startsWith("ph")) { + mods.add(Modification(lines[0].index, true, null)) + mods.add(Modification(lines[3].index, true, null)) + } + } + } + } + + for (lines in linesByFour) { + optimize('a', lines) + optimize('x', lines) + optimize('y', lines) + } + return mods +} \ No newline at end of file diff --git a/examples/test.p8 b/examples/test.p8 index 001a38bcd..9d4d528e3 100644 --- a/examples/test.p8 +++ b/examples/test.p8 @@ -3,14 +3,15 @@ main { - ; 00f9 sub start() { - bool rasterIrqAfterSubs=false - when rasterIrqAfterSubs { - false -> txt.print("false\n") - true -> txt.print("true\n") - } - txt.print("done") + ubyte a=1 + ubyte b=2 + ubyte c=3 + ubyte d=4 + + ubyte xx = (a*b)+(c*d) + xx++ + } }