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 =
|
let call fd ~kind ~f ~args =
|
||||||
(* TODO : Il faut empiler les arguments ? *)
|
match kind with
|
||||||
(* Appelle la fonction *)
|
| `Tail ->
|
||||||
[ T.Instruction (T.calldi ~tgt:f) ]
|
(* 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
|
end
|
||||||
|
|
||||||
|
|
Reference in a new issue