From 190b3987119e986001ad32d7e6c9c9f16ffb91da Mon Sep 17 00:00:00 2001 From: Karol Stasiak Date: Tue, 17 Jul 2018 13:07:33 +0200 Subject: [PATCH] Z80: Faster +=2 and similar --- .../millfork/compiler/z80/ZBuiltIns.scala | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/main/scala/millfork/compiler/z80/ZBuiltIns.scala b/src/main/scala/millfork/compiler/z80/ZBuiltIns.scala index 6c012139..5ceed9af 100644 --- a/src/main/scala/millfork/compiler/z80/ZBuiltIns.scala +++ b/src/main/scala/millfork/compiler/z80/ZBuiltIns.scala @@ -272,10 +272,22 @@ object ZBuiltIns { ZLine.ld8(lv, ZRegister.A)) case ADD if !decimal => constantRight match { + // n × INC (HL) = 11n cycles, n bytes + // n × INC (IX,d) = 23n cycles, 2n bytes + // LD A,n ; ADD (HL) ; LD (HL),A = 21 cycles, 4 bytes + // LD A,n ; ADD (IX,d) ; LD (IX,d),A = 45 cycles, 6 bytes case Some(NumericConstant(1, _)) => calculateAddress :+ ZLine.register(INC, lv) + case Some(NumericConstant(2, _)) => + calculateAddress :+ ZLine.register(INC, lv) :+ ZLine.register(INC, lv) + case Some(NumericConstant(3, _)) if ctx.options.flag(CompilationFlag.OptimizeForSpeed) => + calculateAddress ++ List(ZLine.register(INC, lv), ZLine.register(INC, lv), ZLine.register(INC, lv)) case Some(NumericConstant(0xff | -1, _)) => calculateAddress :+ ZLine.register(DEC, lv) + case Some(NumericConstant(0xfe | -2, _)) => + calculateAddress :+ ZLine.register(DEC, lv) :+ ZLine.register(DEC, lv) + case Some(NumericConstant(0xfd | -3, _)) if ctx.options.flag(CompilationFlag.OptimizeForSpeed) => + calculateAddress ++ List(ZLine.register(DEC, lv), ZLine.register(DEC, lv), ZLine.register(DEC, lv)) case _ => setup ++ List( ZLine.register(ADD, lv), @@ -292,8 +304,16 @@ object ZBuiltIns { constantRight match { case Some(NumericConstant(1, _)) => calculateAddress :+ ZLine.register(DEC, lv) + case Some(NumericConstant(2, _)) => + calculateAddress :+ ZLine.register(DEC, lv) :+ ZLine.register(INC, lv) + case Some(NumericConstant(3, _)) if ctx.options.flag(CompilationFlag.OptimizeForSpeed) => + calculateAddress ++ List(ZLine.register(DEC, lv), ZLine.register(INC, lv), ZLine.register(INC, lv)) case Some(NumericConstant(0xff | -1, _)) => calculateAddress :+ ZLine.register(INC, lv) + case Some(NumericConstant(0xfe | -2, _)) => + calculateAddress :+ ZLine.register(INC, lv) :+ ZLine.register(INC, lv) + case Some(NumericConstant(0xfd | -3, _)) if ctx.options.flag(CompilationFlag.OptimizeForSpeed) => + calculateAddress ++ List(ZLine.register(INC, lv), ZLine.register(INC, lv), ZLine.register(INC, lv)) case _ => if (ctx.options.flag(CompilationFlag.EmitExtended80Opcodes)) { setup ++ List(