From c5135423f80d42f8e223a85ed9a65f2f5c5294a7 Mon Sep 17 00:00:00 2001 From: Karol Stasiak Date: Tue, 9 Jul 2019 22:39:57 +0200 Subject: [PATCH] Fix: don't swap BC and DE if jumping outside the function --- .../assembly/z80/opt/ChangeRegisterPair.scala | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/main/scala/millfork/assembly/z80/opt/ChangeRegisterPair.scala b/src/main/scala/millfork/assembly/z80/opt/ChangeRegisterPair.scala index e540a47f..6bc37104 100644 --- a/src/main/scala/millfork/assembly/z80/opt/ChangeRegisterPair.scala +++ b/src/main/scala/millfork/assembly/z80/opt/ChangeRegisterPair.scala @@ -2,7 +2,7 @@ package millfork.assembly.z80.opt import millfork.assembly.{AssemblyOptimization, Elidability, OptimizationContext} import millfork.assembly.z80._ -import millfork.env.{AssemblyParamSignature, NormalFunction, NormalParamSignature} +import millfork.env.{AssemblyParam, AssemblyParamSignature, FunctionInMemory, MemoryAddressConstant, NormalFunction, NormalParamSignature, NumericConstant, ParamSignature, ZRegisterVariable} import millfork.error.Logger import millfork.node.ZRegister @@ -99,8 +99,22 @@ class ChangeRegisterPair(preferBC2DE: Boolean) extends AssemblyOptimization[ZLin } } + private def readsBCorDE(params: ParamSignature): Boolean = { + import ZRegister._ + params match { + case AssemblyParamSignature(ps) => ps.exists { + case AssemblyParam(_, ZRegisterVariable(B | C | D | E | BC | DE, _), _) => true + case _ => false + } + case NormalParamSignature(List(p)) => p.typ.size == 3 || p.typ.size == 4 + case _ => false + } + } + private def canOptimize(code: List[ZLine], dir: PairDirection, loaded: Loaded): Boolean = code match { case ZLine0(CALL, _, _) :: xs => false // TODO + case ZLine0(JP, _, MemoryAddressConstant(f: FunctionInMemory)) :: xs if readsBCorDE(f.params) => false + case ZLine0(JP, _, NumericConstant(_, _)) :: xs => false case ZLine0(LD_16, TwoRegisters(r, IMM_16), _) :: xs => canOptimize(xs, dir, loaded = loaded.load(r)) case ZLine0(LD, TwoRegisters(B, C) |