From 2beabb7bed86e2a7ccde7d145586498c6cd16d87 Mon Sep 17 00:00:00 2001 From: Karol Stasiak Date: Thu, 18 Feb 2021 00:36:13 +0100 Subject: [PATCH] Improvements to constant folding --- src/main/scala/millfork/env/Constant.scala | 5 ++++- src/test/scala/millfork/test/ConstantSuite.scala | 11 +++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/main/scala/millfork/env/Constant.scala b/src/main/scala/millfork/env/Constant.scala index 7776c572..97ca1510 100644 --- a/src/main/scala/millfork/env/Constant.scala +++ b/src/main/scala/millfork/env/Constant.scala @@ -522,7 +522,10 @@ case class CompoundConstant(operator: MathOperator.Value, lhs: Constant, rhs: Co case MathOperator.Plus9 => c case MathOperator.DecimalPlus => c case MathOperator.DecimalPlus9 => c - case MathOperator.Minus => CompoundConstant(operator, l, r) + case MathOperator.Minus => c match { + case NumericConstant(rv, rs) => NumericConstant(-rv, rs) + case _ => CompoundConstant(operator, l, r) + } case MathOperator.Times => Constant.Zero case MathOperator.Shl => Constant.Zero case MathOperator.Shr => Constant.Zero diff --git a/src/test/scala/millfork/test/ConstantSuite.scala b/src/test/scala/millfork/test/ConstantSuite.scala index e94a7678..4d404647 100644 --- a/src/test/scala/millfork/test/ConstantSuite.scala +++ b/src/test/scala/millfork/test/ConstantSuite.scala @@ -178,4 +178,15 @@ class ConstantSuite extends FunSuite with Matchers { m.readMedium(0xc003) should equal(200/8) } } + + test("Negative constant evaluation") { + EmuUnoptimizedCrossPlatformRun(Cpu.Mos, Cpu.Z80, Cpu.Intel8080, Cpu.Sharp, Cpu.Intel8086, Cpu.Motorola6809)(""" + | word output @$c000 + | void main () { + | output = -1 * -1 + | } + """.stripMargin){m => + m.readWord(0xc000) should equal(1) + } + } }