From 10c76dcc9c53bd9fef8f67a876eb4dc64dc1de80 Mon Sep 17 00:00:00 2001 From: Karol Stasiak Date: Sat, 3 Aug 2019 16:42:40 +0200 Subject: [PATCH] Z80: Fix optimizations around multiplication --- .../assembly/z80/opt/ReverseFlowAnalyzer.scala | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/main/scala/millfork/assembly/z80/opt/ReverseFlowAnalyzer.scala b/src/main/scala/millfork/assembly/z80/opt/ReverseFlowAnalyzer.scala index a68479f8..0f2bf84b 100644 --- a/src/main/scala/millfork/assembly/z80/opt/ReverseFlowAnalyzer.scala +++ b/src/main/scala/millfork/assembly/z80/opt/ReverseFlowAnalyzer.scala @@ -191,6 +191,9 @@ object ReverseFlowAnalyzer { val readsH: Set[String] = Set("__divmod_u16u8u16u8", "call") val readsL: Set[String] = Set("__divmod_u16u8u16u8", "call") + val preservesH: Set[String] = Set("__mul_u8u8u8") + val preservesL: Set[String] = Set("__mul_u8u8u8") + //noinspection RedundantNewCaseClass def analyze(f: NormalFunction, code: List[ZLine]): List[CpuImportance] = { cache.get(code).foreach(return _) @@ -366,9 +369,9 @@ object ReverseFlowAnalyzer { c = if (readsC(n)) Important else Unimportant, d = if (readsD(n)) Important else Unimportant, e = if (readsE(n)) Important else Unimportant, - h = if (readsH(n)) Important else Unimportant, - l = if (readsL(n)) Important else Unimportant, - hlNumeric = Unimportant, + h = if (readsH(n)) Important else if (preservesH(n)) currentImportance.h else Unimportant, + l = if (readsL(n)) Important else if (preservesL(n)) currentImportance.l else Unimportant, + hlNumeric = if (preservesH(n) && preservesL(n)) currentImportance.hlNumeric else Unimportant, iyh = Unimportant, iyl = Unimportant, zf = Unimportant, @@ -438,9 +441,9 @@ object ReverseFlowAnalyzer { c = if (readsC(n)) Important else Unimportant, d = if (readsD(n)) Important else Unimportant, e = if (readsE(n)) Important else Unimportant, - h = if (readsH(n)) Important else Unimportant, - l = if (readsL(n)) Important else Unimportant, - hlNumeric = Unimportant, + h = if (readsH(n)) Important else if (preservesH(n)) currentImportance.h else Unimportant, + l = if (readsL(n)) Important else if (preservesL(n)) currentImportance.l else Unimportant, + hlNumeric = if (preservesH(n) && preservesL(n)) currentImportance.hlNumeric else Unimportant, iyh = Unimportant, iyl = Unimportant, zf = Unimportant,