From c9723f9359c149dd8c0b24ec6a9dc04e433807ad Mon Sep 17 00:00:00 2001 From: Guy C Date: Tue, 25 Feb 2025 21:37:18 +0000 Subject: [PATCH] feat: implements sign extension operation for division --- src/main/wacc/backend/asmGenerator.scala | 12 +++++++++++- src/main/wacc/backend/assemblyIR.scala | 1 + src/test/wacc/examples.scala | 4 ++-- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/main/wacc/backend/asmGenerator.scala b/src/main/wacc/backend/asmGenerator.scala index 6d10b24..d8dd5b0 100644 --- a/src/main/wacc/backend/asmGenerator.scala +++ b/src/main/wacc/backend/asmGenerator.scala @@ -237,8 +237,8 @@ object asmGenerator { } case BinaryOp(x, y, op) => - chain ++= evalExprOntoStack(x) chain ++= evalExprOntoStack(y) + chain ++= evalExprOntoStack(x) chain += stack.pop(RAX) @@ -251,11 +251,21 @@ object asmGenerator { chain += stack.push(RAX) case BinaryOperator.Div => + // chain += stack.pop(RDX) + // chain += stack.pop(RAX) + // chain += stack.push(RDX) + // chain += stack.push(RAX) + chain += CDQ() chain += Divide(stack.head(SizeDir.Word)) chain += stack.drop() chain += stack.push(RAX) case BinaryOperator.Mod => + // chain += stack.pop(RDX) + // chain += stack.pop(RAX) + // chain += stack.push(RDX) + // chain += stack.push(RAX) + chain += CDQ() chain += Divide(stack.head(SizeDir.Word)) chain += stack.drop() chain += stack.push(RDX) diff --git a/src/main/wacc/backend/assemblyIR.scala b/src/main/wacc/backend/assemblyIR.scala index 0921fd8..5a59fd1 100644 --- a/src/main/wacc/backend/assemblyIR.scala +++ b/src/main/wacc/backend/assemblyIR.scala @@ -112,6 +112,7 @@ object assemblyIR { case class Move(op1: Dest, op2: Src) extends Operation("mov", op1, op2) case class Load(op1: Register, op2: MemLocation | IndexAddress) extends Operation("lea ", op1, op2) + case class CDQ() extends Operation("cdq") case class Return() extends Operation("ret") diff --git a/src/test/wacc/examples.scala b/src/test/wacc/examples.scala index dc3f817..c3189bb 100644 --- a/src/test/wacc/examples.scala +++ b/src/test/wacc/examples.scala @@ -88,7 +88,7 @@ class ParallelExamplesSpec extends AnyFlatSpec with BeforeAndAfterAll with Paral "^.*wacc-examples/valid/advanced.*$", "^.*wacc-examples/valid/array.*$", // "^.*wacc-examples/valid/basic/exit.*$", - "^.*wacc-examples/valid/basic/skip.*$", + // "^.*wacc-examples/valid/basic/skip.*$", "^.*wacc-examples/valid/expressions.*$", "^.*wacc-examples/valid/function/nested_functions.*$", "^.*wacc-examples/valid/function/simple_functions.*$", @@ -100,7 +100,7 @@ class ParallelExamplesSpec extends AnyFlatSpec with BeforeAndAfterAll with Paral "^.*wacc-examples/valid/pairs.*$", "^.*wacc-examples/valid/runtimeErr.*$", "^.*wacc-examples/valid/scope.*$", - "^.*wacc-examples/valid/sequence.*$", + // "^.*wacc-examples/valid/sequence.*$", "^.*wacc-examples/valid/variables.*$", "^.*wacc-examples/valid/while.*$", // format: on