docs: clarify evalExprOntoStack sanity check, explanation comments for generateCall
This commit is contained in:
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user