From 82a3d6068bce5ad794b9f2a2a5405f470860568c Mon Sep 17 00:00:00 2001 From: Gleb Koval Date: Thu, 27 Feb 2025 15:46:01 +0000 Subject: [PATCH] fix: zero-out sub-32 bit expressions --- src/main/wacc/backend/asmGenerator.scala | 9 ++++++--- src/test/wacc/examples.scala | 5 ++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/main/wacc/backend/asmGenerator.scala b/src/main/wacc/backend/asmGenerator.scala index cd53b30..8dc67f6 100644 --- a/src/main/wacc/backend/asmGenerator.scala +++ b/src/main/wacc/backend/asmGenerator.scala @@ -41,8 +41,6 @@ object asmGenerator { private val RCX = Register(Q64, CX) private val argRegs = List(DI, SI, DX, CX, R8, R9) - private val _8_BIT_MASK = 0xff - extension [T](chain: Chain[T]) def +(item: T): Chain[T] = chain.append(item) @@ -378,6 +376,7 @@ object asmGenerator { } assert(stack.size == stackSizeStart + 1) + chain ++= zeroRest(MemLocation(stack.head.pointer, Q64), expr.ty.size) chain } @@ -419,7 +418,7 @@ object asmGenerator { chain += Compare(destX, stack.head) chain += Set(Register(B8, AX), cond) - chain += And(RAX, ImmediateVal(_8_BIT_MASK)) + chain ++= zeroRest(RAX, B8) chain += stack.drop() chain += stack.push(B8, RAX) @@ -442,6 +441,10 @@ object asmGenerator { } private def stackAlign: AsmLine = And(Register(Q64, SP), ImmediateVal(-16)) + private def zeroRest(dest: Dest, size: Size): Chain[AsmLine] = size match { + case Q64 | D32 => Chain.empty + case _ => Chain.one(And(dest, ImmediateVal((1 << (size.toInt * 8)) - 1))) + } private val escapedCharsMapping = escapedChars.map { case (k, v) => v -> s"\\$k" } extension (s: String) { diff --git a/src/test/wacc/examples.scala b/src/test/wacc/examples.scala index 87def2a..988a6d0 100644 --- a/src/test/wacc/examples.scala +++ b/src/test/wacc/examples.scala @@ -93,14 +93,13 @@ class ParallelExamplesSpec extends AnyFlatSpec with BeforeAndAfterAll { "^.*wacc-examples/valid/function/nested_functions.*$", "^.*wacc-examples/valid/function/simple_functions.*$", // "^.*wacc-examples/valid/if.*$", - "^.*wacc-examples/valid/IO/print.*$", + // "^.*wacc-examples/valid/IO/print.*$", // "^.*wacc-examples/valid/IO/read.*$", "^.*wacc-examples/valid/IO/IOLoop.wacc.*$", // "^.*wacc-examples/valid/IO/IOSequence.wacc.*$", - "^.*wacc-examples/valid/pairs.*$", + // "^.*wacc-examples/valid/pairs.*$", "^.*wacc-examples/valid/runtimeErr.*$", // "^.*wacc-examples/valid/scope.*$", - "^.*wacc-examples/valid/scope/printAllTypes.wacc$", // while we still don't have arrays implemented // "^.*wacc-examples/valid/sequence.*$", // "^.*wacc-examples/valid/variables.*$", // "^.*wacc-examples/valid/while.*$",