From 02e91070aa9119b11c074b8dd2f863be3c9b2662 Mon Sep 17 00:00:00 2001 From: Karol Stasiak Date: Fri, 21 Dec 2018 22:36:53 +0100 Subject: [PATCH] Accept bytes as LHS for >>>> --- .../compiler/mos/MosExpressionCompiler.scala | 13 ++++++++++--- .../compiler/z80/Z80ExpressionCompiler.scala | 10 ++++++++-- src/test/scala/millfork/test/NonetSuite.scala | 15 +++++++++++++++ 3 files changed, 33 insertions(+), 5 deletions(-) diff --git a/src/main/scala/millfork/compiler/mos/MosExpressionCompiler.scala b/src/main/scala/millfork/compiler/mos/MosExpressionCompiler.scala index bba6b991..30bfa2ea 100644 --- a/src/main/scala/millfork/compiler/mos/MosExpressionCompiler.scala +++ b/src/main/scala/millfork/compiler/mos/MosExpressionCompiler.scala @@ -865,9 +865,16 @@ object MosExpressionCompiler extends AbstractExpressionCompiler[AssemblyLine] { case 2 => PseudoregisterBuiltIns.compileWordBitOpsToAX(ctx, params, EOR) } case ">>>>" => - val (l, r, 2) = assertArithmeticBinary(ctx, params) - zeroExtend = true - BuiltIns.compileNonetOps(ctx, l, r) + val (l, r, size) = assertArithmeticBinary(ctx, params) + size match { + case 2 => + zeroExtend = true + BuiltIns.compileNonetOps(ctx, l, r) + case 1 => + zeroExtend = true + BuiltIns.compileShiftOps(LSR, ctx, l ,r) + case _ => ??? + } case "<<" => val (l, r, size) = assertArithmeticBinary(ctx, params) size match { diff --git a/src/main/scala/millfork/compiler/z80/Z80ExpressionCompiler.scala b/src/main/scala/millfork/compiler/z80/Z80ExpressionCompiler.scala index e13ce416..29cc1a14 100644 --- a/src/main/scala/millfork/compiler/z80/Z80ExpressionCompiler.scala +++ b/src/main/scala/millfork/compiler/z80/Z80ExpressionCompiler.scala @@ -644,8 +644,14 @@ object Z80ExpressionCompiler extends AbstractExpressionCompiler[ZLine] { case 2 => targetifyHL(ctx, target, ZBuiltIns.compile16BitOperation(ctx, XOR, params)) } case ">>>>" => - val (l, r, 2) = assertArithmeticBinary(ctx, params) - targetifyA(ctx, target, compileToHL(ctx, l) ++ Z80Shifting.compileNonetShiftRight(ctx, r), isSigned = false) + val (l, r, size) = assertArithmeticBinary(ctx, params) + size match { + case 2 => + targetifyA (ctx, target, compileToHL (ctx, l) ++ Z80Shifting.compileNonetShiftRight (ctx, r), isSigned = false) + case 1 => + targetifyA(ctx, target, Z80Shifting.compile8BitShift(ctx, l, r, left = false), isSigned = false) + case _ => ??? + } case "<<" => val (l, r, size) = assertArithmeticBinary(ctx, params) size match { diff --git a/src/test/scala/millfork/test/NonetSuite.scala b/src/test/scala/millfork/test/NonetSuite.scala index 51fe584f..23b4cc12 100644 --- a/src/test/scala/millfork/test/NonetSuite.scala +++ b/src/test/scala/millfork/test/NonetSuite.scala @@ -29,6 +29,21 @@ class NonetSuite extends FunSuite with Matchers { } } + test("Nonet operations on bytes") { + EmuUnoptimizedCrossPlatformRun(Cpu.Mos, Cpu.Z80, Cpu.Intel8080, Cpu.Sharp)( + """ + | byte output @$c000 + | + | noinline byte five() { return 5} + | noinline byte one() { return 1 } + | void main () { + | output = five() >>>> one() + | } + """.stripMargin) { m => + m.readByte(0xc000) should equal(2) + } + } + test("Nonet left shift") { EmuCrossPlatformBenchmarkRun(Cpu.Mos, Cpu.Z80, Cpu.Intel8080, Cpu.Sharp)( """