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) 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 ++= zeroRest(MemLocation(stack.head.pointer, Q64), expr.ty.size)
asm asm
} }
@@ -384,17 +387,20 @@ object asmGenerator {
var asm = Chain.empty[AsmLine] var asm = Chain.empty[AsmLine]
val microWacc.Call(target, args) = call val microWacc.Call(target, args) = call
// Evaluate arguments 0-6
argRegs argRegs
.zip(args) .zip(args)
.map { (reg, expr) => .map { (reg, expr) =>
asm ++= evalExprOntoStack(expr) asm ++= evalExprOntoStack(expr)
reg reg
} }
// And set the appropriate registers
.reverse .reverse
.foreach { reg => .foreach { reg =>
asm += stack.pop(Register(Q64, reg)) asm += stack.pop(Register(Q64, reg))
} }
// Evaluate arguments 7 and up and push them onto the stack
args.drop(argRegs.size).foldMap { args.drop(argRegs.size).foldMap {
asm ++= evalExprOntoStack(_) asm ++= evalExprOntoStack(_)
} }
@@ -406,6 +412,7 @@ object asmGenerator {
asm += assemblyIR.Call(labelGenerator.getLabelArg(target)) // regular call asm += assemblyIR.Call(labelGenerator.getLabelArg(target)) // regular call
} }
// Remove arguments 7 and up from the stack
if (args.size > argRegs.size) { if (args.size > argRegs.size) {
asm += stack.drop(args.size - argRegs.size) asm += stack.drop(args.size - argRegs.size)
} }