diff --git a/src/main/wacc/backend/Stack.scala b/src/main/wacc/backend/Stack.scala index 0949ecb..94b329a 100644 --- a/src/main/wacc/backend/Stack.scala +++ b/src/main/wacc/backend/Stack.scala @@ -50,7 +50,7 @@ class Stack { * @param sizes * The sizes of the values to reserve space for. */ - def reserve(sizes: List[Size]): AsmLine = { + def reserve(sizes: Size*): AsmLine = { sizes.foreach { itemSize => stack += stack.size -> StackValue(itemSize, sizeBytes) } diff --git a/src/main/wacc/backend/asmGenerator.scala b/src/main/wacc/backend/asmGenerator.scala index 8dc67f6..60e0b47 100644 --- a/src/main/wacc/backend/asmGenerator.scala +++ b/src/main/wacc/backend/asmGenerator.scala @@ -93,7 +93,9 @@ object asmGenerator { ) } - private def wrapBuiltinFunc(labelName: String, funcBody: Chain[AsmLine]): Chain[AsmLine] = { + private def wrapBuiltinFunc(labelName: String, funcBody: Chain[AsmLine])(using + stack: Stack + ): Chain[AsmLine] = { var chain = Chain.one[AsmLine](LabelDef(labelName)) chain ++= funcPrologue() chain ++= funcBody @@ -108,6 +110,7 @@ object asmGenerator { given stack: Stack = Stack() // Setup the stack with param 7 and up func.params.drop(argRegs.size).foreach(stack.reserve(_)) + stack.reserve(Q64) // Reserve return pointer slot var chain = Chain.one[AsmLine](LabelDef(labelGenerator.getLabel(func.name))) chain ++= funcPrologue() // Push the rest of params onto the stack for simplicity @@ -120,6 +123,7 @@ object asmGenerator { } private def generateBuiltInFuncs()(using + stack: Stack, labelGenerator: LabelGenerator ): Chain[AsmLine] = { var chain = Chain.empty[AsmLine] @@ -425,9 +429,9 @@ object asmGenerator { chain } - private def funcPrologue(): Chain[AsmLine] = { + private def funcPrologue()(using stack: Stack): Chain[AsmLine] = { var chain = Chain.empty[AsmLine] - chain += Push(RBP) + chain += stack.push(Q64, RBP) chain += Move(RBP, Register(Q64, SP)) chain } diff --git a/src/test/wacc/examples.scala b/src/test/wacc/examples.scala index 988a6d0..01e4c30 100644 --- a/src/test/wacc/examples.scala +++ b/src/test/wacc/examples.scala @@ -90,8 +90,8 @@ class ParallelExamplesSpec extends AnyFlatSpec with BeforeAndAfterAll { // "^.*wacc-examples/valid/basic/exit.*$", // "^.*wacc-examples/valid/basic/skip.*$", // "^.*wacc-examples/valid/expressions.*$", - "^.*wacc-examples/valid/function/nested_functions.*$", - "^.*wacc-examples/valid/function/simple_functions.*$", + // "^.*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/read.*$",