diff --git a/flap/src/x86-64/retrolixToX86_64.ml b/flap/src/x86-64/retrolixToX86_64.ml index 09e6ece..8f0c7d1 100644 --- a/flap/src/x86-64/retrolixToX86_64.ml +++ b/flap/src/x86-64/retrolixToX86_64.ml @@ -631,9 +631,18 @@ module FrameManager (IS : InstructionSelector) : FrameManager = struct ;; let call fd ~kind ~f ~args = - (* TODO : Il faut empiler les arguments ? *) - (* Appelle la fonction *) - [ T.Instruction (T.calldi ~tgt:f) ] + 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) + (* 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