Empile les arguments + tail fonction
This commit is contained in:
parent
f455643dc0
commit
8f164ae774
1 changed files with 12 additions and 3 deletions
|
@ -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
|
||||
|
||||
|
|
Reference in a new issue