From 41f76e50e0c4561355dbb40f40fa6ac02cdc3149 Mon Sep 17 00:00:00 2001 From: Gleb Koval Date: Fri, 28 Feb 2025 00:27:26 +0000 Subject: [PATCH] fix: evaluate all function call arguments before setting registers --- src/main/wacc/backend/asmGenerator.scala | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/main/wacc/backend/asmGenerator.scala b/src/main/wacc/backend/asmGenerator.scala index 60e0b47..249d109 100644 --- a/src/main/wacc/backend/asmGenerator.scala +++ b/src/main/wacc/backend/asmGenerator.scala @@ -392,10 +392,16 @@ object asmGenerator { var chain = Chain.empty[AsmLine] val microWacc.Call(target, args) = call - argRegs.zip(args).foldMap { (reg, expr) => - chain ++= evalExprOntoStack(expr) - chain += stack.pop(Register(Q64, reg)) - } + argRegs + .zip(args) + .map { (reg, expr) => + chain ++= evalExprOntoStack(expr) + reg + } + .reverse + .foreach { reg => + chain += stack.pop(Register(Q64, reg)) + } args.drop(argRegs.size).foldMap { chain ++= evalExprOntoStack(_)