From 138ff8b82d781e17b21b3bc7819e9084230fb2cb Mon Sep 17 00:00:00 2001 From: Karol Stasiak Date: Wed, 27 Dec 2017 22:25:39 +0100 Subject: [PATCH] Reserve flow analyser shouldn't mark parameters passed in registers as unimportant --- .gitignore | 1 + .../assembly/opt/ReverseFlowAnalyzer.scala | 28 +++++++++++++++++-- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 316480d0..60124fa7 100644 --- a/.gitignore +++ b/.gitignore @@ -15,6 +15,7 @@ stuff # compiled Millfork files *.prg *.asm +*.lbl *.xex *.nes *.a2 diff --git a/src/main/scala/millfork/assembly/opt/ReverseFlowAnalyzer.scala b/src/main/scala/millfork/assembly/opt/ReverseFlowAnalyzer.scala index 00d8ff91..b92b71f0 100644 --- a/src/main/scala/millfork/assembly/opt/ReverseFlowAnalyzer.scala +++ b/src/main/scala/millfork/assembly/opt/ReverseFlowAnalyzer.scala @@ -1,7 +1,8 @@ package millfork.assembly.opt import millfork.assembly.{AssemblyLine, OpcodeClasses, State} -import millfork.env.{Label, MemoryAddressConstant, NormalFunction, NumericConstant} +import millfork.env._ +import millfork.node.Register import scala.collection.immutable @@ -96,7 +97,30 @@ object ReverseFlowAnalyzer { case _ => } codeArray(i) match { - // TODO: JSR? + case AssemblyLine(JSR, _, MemoryAddressConstant(fun:FunctionInMemory), _) => + var result = new CpuImportance().copy(d = Important) + fun.params match { + case AssemblyParamSignature(params) => + params.foreach(_.variable match { + case RegisterVariable(Register.A, _) => + result = result.copy(a = Important) + case RegisterVariable(Register.X, _) => + result = result.copy(x = Important) + case RegisterVariable(Register.Y, _) => + result = result.copy(y = Important) + case RegisterVariable(Register.AX | Register.XA, _) => + result = result.copy(a = Important, x = Important) + case RegisterVariable(Register.YA | Register.YA, _) => + result = result.copy(a = Important, y = Important) + case RegisterVariable(Register.XY | Register.YX, _) => + result = result.copy(x = Important, y=Important) + case _ => + }) + case _ => + } + currentImportance = result + case AssemblyLine(JSR, _, _, _) => + currentImportance = finalImportance case AssemblyLine(JMP, Absolute, MemoryAddressConstant(Label(l)), _) => val L = l val labelIndex = codeArray.indexWhere {