Empile les arguments + tail fonction

This commit is contained in:
Mylloon 2024-01-02 12:16:36 +01:00
parent f455643dc0
commit 8f164ae774
Signed by: Anri
GPG key ID: A82D63DFF8D1317F

View file

@ -631,9 +631,18 @@ module FrameManager (IS : InstructionSelector) : FrameManager = struct
;;
let call fd ~kind ~f ~args =
(* TODO : Il faut empiler les arguments ? *)
match kind with
| `Tail ->
(* Vide la pile et jump vers la fonction *)
function_epilogue fd @ [ Instruction (T.jmpdi ~tgt:f) ]
| `Normal ->
(* Place les arguments sur la pile, le dernier en premier *)
List.rev_map (fun arg -> T.Instruction (T.pushq ~src:arg)) args
(* Appelle la fonction *)
[ T.Instruction (T.calldi ~tgt:f) ]
@ [ T.Instruction (T.calldi ~tgt:f)
(* Retire les arguments de la pile lorsque l'on quitte la fonction *)
; T.Instruction (T.addq ~src:(T.liti (8 * List.length args)) ~dst:rsp)
]
;;
end