docs: clarify evalExprOntoStack sanity check, explanation comments for generateCall

This commit is contained in:
2025-02-28 15:29:41 +00:00
parent 720d9320e2
commit 82997a5a38

View File

@@ -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)
}