diff --git a/src/main/scala/millfork/compiler/z80/Z80Comparisons.scala b/src/main/scala/millfork/compiler/z80/Z80Comparisons.scala index 8c0b01ad..e4c53677 100644 --- a/src/main/scala/millfork/compiler/z80/Z80Comparisons.scala +++ b/src/main/scala/millfork/compiler/z80/Z80Comparisons.scala @@ -26,9 +26,13 @@ object Z80Comparisons { return compile8BitComparison(ctx, ComparisonType.flip(compType), r, l, branches) case _ => () } - val prepareAE = Z80ExpressionCompiler.compileToA(ctx, r) ++ - List(ZLine.ld8(ZRegister.E, ZRegister.A)) ++ - Z80ExpressionCompiler.stashDEIfChanged(ctx, Z80ExpressionCompiler.compileToA(ctx, l)) + val prepareAE = Z80ExpressionCompiler.compileToA(ctx, r) match { + case List(ZLine0(ZOpcode.LD, TwoRegisters(ZRegister.A, ZRegister.IMM_8), param)) => + Z80ExpressionCompiler.compileToA(ctx, l) :+ ZLine.ldImm8(ZRegister.E, param) + case compiledR => compiledR ++ + List(ZLine.ld8(ZRegister.E, ZRegister.A)) ++ + Z80ExpressionCompiler.stashDEIfChanged(ctx, Z80ExpressionCompiler.compileToA(ctx, l)) + } val calculateFlags = if (ComparisonType.isSigned(compType) && ctx.options.flag(CompilationFlag.EmitZ80Opcodes)) { val fixup = ctx.nextLabel("co") List( diff --git a/src/test/scala/millfork/test/AssemblyOptimizationSuite.scala b/src/test/scala/millfork/test/AssemblyOptimizationSuite.scala index 3213c90e..be88e638 100644 --- a/src/test/scala/millfork/test/AssemblyOptimizationSuite.scala +++ b/src/test/scala/millfork/test/AssemblyOptimizationSuite.scala @@ -691,4 +691,21 @@ class AssemblyOptimizationSuite extends FunSuite with Matchers { } } + test("Simple flags") { + EmuCrossPlatformBenchmarkRun(Cpu.Mos, Cpu.Intel8080)( + """ + | byte output @ $c000 + | void main() { + | output = 0 + | if f() & 1 != 0 { + | output += 1 + | } + | } + | noinline byte f() = 1 + """.stripMargin + ) { m => + m.readByte(0xc000) should equal(1) + } + } + }