From 82997a5a389d67f09ff4bbe484d4f2937a3979a5 Mon Sep 17 00:00:00 2001 From: Gleb Koval Date: Fri, 28 Feb 2025 15:29:41 +0000 Subject: [PATCH] docs: clarify evalExprOntoStack sanity check, explanation comments for generateCall --- src/main/wacc/backend/asmGenerator.scala | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/wacc/backend/asmGenerator.scala b/src/main/wacc/backend/asmGenerator.scala index 938efa1..2a7366d 100644 --- a/src/main/wacc/backend/asmGenerator.scala +++ b/src/main/wacc/backend/asmGenerator.scala @@ -372,7 +372,10 @@ object asmGenerator { asm += stack.push(call.ty.size, RAX) } - assert(stack.size == stackSizeStart + 1) + assert( + stack.size == stackSizeStart + 1, + "Sanity check: ONLY the evaluated expression should have been pushed onto the stack" + ) asm ++= zeroRest(MemLocation(stack.head.pointer, Q64), expr.ty.size) asm } @@ -384,17 +387,20 @@ object asmGenerator { var asm = Chain.empty[AsmLine] val microWacc.Call(target, args) = call + // Evaluate arguments 0-6 argRegs .zip(args) .map { (reg, expr) => asm ++= evalExprOntoStack(expr) reg } + // And set the appropriate registers .reverse .foreach { reg => asm += stack.pop(Register(Q64, reg)) } + // Evaluate arguments 7 and up and push them onto the stack args.drop(argRegs.size).foldMap { asm ++= evalExprOntoStack(_) } @@ -406,6 +412,7 @@ object asmGenerator { asm += assemblyIR.Call(labelGenerator.getLabelArg(target)) // regular call } + // Remove arguments 7 and up from the stack if (args.size > argRegs.size) { asm += stack.drop(args.size - argRegs.size) }