- (codegen-expr e si env)
- ; move result to correct param register
- (emit "movq %rax, ~a" (param-register i))))
- args (range argument-start (length args)))
+ (emit "## arg no. ~a" (- i 1))
+ (codegen-expr e (- si (* wordsize i)) env)
+ ; store intermediate result on stack
+ (emit "movq %rax, ~a(%rbp)" (- si (* wordsize i)))))
+
+ args (range 1 (length args)))
+
+ ; now that we have everything we need on the stack,
+ ; move them into the param registers
+
+ (emit "## moving args into place")
+ (for-each
+ (lambda (i) (emit "movq ~a(%rbp), ~a"
+ (- si (* wordsize i))
+ (param-register i)))
+ (range 1 (length args)))
+
+ ; todo: can this be made more efficient
+ (emit "movq ~a(%rbp), %rax" si) ; load back pointer to closure
+
+ (emit "## moving captives into place")
+
+ ; move captives into first argument
+ (emit "movq %rax, %rbx")
+ (emit "addq $8, %rbx")
+ (emit "movq %rbx, ~a" (param-register 0))
+
+ (emit "## performing call")