mirror of
https://github.com/irmen/prog8.git
synced 2025-08-14 22:27:48 +00:00
added optimizer to remove needless pha/pla pairs
This commit is contained in:
@@ -43,7 +43,14 @@ internal fun optimizeAssembly(lines: MutableList<String>, machine: IMachineDefin
|
|||||||
numberOfOptimizations++
|
numberOfOptimizations++
|
||||||
}
|
}
|
||||||
|
|
||||||
mods= optimizeJsrRtsAndOtherCombinations(linesByFour)
|
mods = optimizeJsrRtsAndOtherCombinations(linesByFour)
|
||||||
|
if(mods.isNotEmpty()) {
|
||||||
|
apply(mods, lines)
|
||||||
|
linesByFour = getLinesBy(lines, 4)
|
||||||
|
numberOfOptimizations++
|
||||||
|
}
|
||||||
|
|
||||||
|
mods = optimizeUselessPushPopStack(linesByFour)
|
||||||
if(mods.isNotEmpty()) {
|
if(mods.isNotEmpty()) {
|
||||||
apply(mods, lines)
|
apply(mods, lines)
|
||||||
linesByFour = getLinesBy(lines, 4)
|
linesByFour = getLinesBy(lines, 4)
|
||||||
@@ -517,3 +524,40 @@ private fun optimizeJsrRtsAndOtherCombinations(linesByFour: List<List<IndexedVal
|
|||||||
}
|
}
|
||||||
return mods
|
return mods
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun optimizeUselessPushPopStack(linesByFour: List<List<IndexedValue<String>>>): List<Modification> {
|
||||||
|
val mods = mutableListOf<Modification>()
|
||||||
|
|
||||||
|
fun optimize(register: Char, lines: List<IndexedValue<String>>) {
|
||||||
|
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
|
||||||
|
}
|
@@ -3,14 +3,15 @@
|
|||||||
|
|
||||||
main
|
main
|
||||||
{
|
{
|
||||||
; 00f9
|
|
||||||
sub start()
|
sub start()
|
||||||
{
|
{
|
||||||
bool rasterIrqAfterSubs=false
|
ubyte a=1
|
||||||
when rasterIrqAfterSubs {
|
ubyte b=2
|
||||||
false -> txt.print("false\n")
|
ubyte c=3
|
||||||
true -> txt.print("true\n")
|
ubyte d=4
|
||||||
}
|
|
||||||
txt.print("done")
|
ubyte xx = (a*b)+(c*d)
|
||||||
|
xx++
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user