From 656dbef1845fc85ca766d45e162b5137aaf8fe03 Mon Sep 17 00:00:00 2001 From: Karol Stasiak Date: Mon, 5 Mar 2018 11:32:31 +0100 Subject: [PATCH] Optimize pulling a known constant from the stack in more cases --- .../assembly/opt/AlwaysGoodOptimizations.scala | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/main/scala/millfork/assembly/opt/AlwaysGoodOptimizations.scala b/src/main/scala/millfork/assembly/opt/AlwaysGoodOptimizations.scala index 199f7ae6..8500efbe 100644 --- a/src/main/scala/millfork/assembly/opt/AlwaysGoodOptimizations.scala +++ b/src/main/scala/millfork/assembly/opt/AlwaysGoodOptimizations.scala @@ -260,6 +260,24 @@ object AlwaysGoodOptimizations { val PointlessStackStashing = new RuleBasedAssemblyOptimization("Pointless stack stashing", needsFlowInfo = FlowInfoRequirement.NoRequirement, + (Elidable & HasOpcode(LDA) & HasAddrMode(Immediate)) ~ + (Elidable & HasOpcode(PHA)) ~ + (Linear & Not(ConcernsStack) | HasOpcodeIn(Set(JSR, BSR))).* ~ + (Elidable & HasOpcode(PLA)) ~~> { code => + code.head :: (code.drop(2).init :+ code.head) + }, + (Elidable & HasOpcode(LDX) & HasAddrMode(Immediate)) ~ + (Elidable & HasOpcode(PHX)) ~ + (Linear & Not(ConcernsStack) | HasOpcodeIn(Set(JSR, BSR))).* ~ + (Elidable & HasOpcode(PLX)) ~~> { code => + code.head :: (code.drop(2).init :+ code.head) + }, + (Elidable & HasOpcode(LDY) & HasAddrMode(Immediate)) ~ + (Elidable & HasOpcode(PHY)) ~ + (Linear & Not(ConcernsStack) | HasOpcodeIn(Set(JSR, BSR))).* ~ + (Elidable & HasOpcode(PLY)) ~~> { code => + code.head :: (code.drop(2).init :+ code.head) + }, (Elidable & HasOpcode(LDA) & MatchAddrMode(0) & MatchParameter(1)) ~ (Elidable & HasOpcode(PHA)) ~ (Linear & Not(ConcernsStack) & DoesntChangeIndexingInAddrMode(0) & DoesntChangeMemoryAt(0, 1)).* ~