alignement RSP sur 16

This commit is contained in:
Anri Kennel 2024-01-02 12:30:28 +01:00
parent 9465bb9898
commit cc21e95e20
Signed by: Anri
GPG key ID: A82D63DFF8D1317F

View file

@ -636,14 +636,26 @@ module FrameManager (IS : InstructionSelector) : FrameManager = struct
(* Vide la pile et jump vers la fonction *)
function_epilogue fd @ [ Instruction (T.jmpdi ~tgt:f) ]
| `Normal ->
(* TODO: Vérifier l'alignement de RSP sur 16 octets *)
(* Alignement de RSP sur 16 octets si besoin *)
let align_stack_open, align_stack_close =
if fd.locals_space mod 16 = 0
then [], []
else (
let src = T.liti 8 in
( [ T.Instruction (T.subq ~src ~dst:rsp) ]
, [ T.Instruction (T.addq ~src ~dst:rsp) ] ))
in
(* Aligne la pile si besoin *)
align_stack_open
(* Place les arguments sur la pile, le dernier en premier *)
List.rev_map (fun arg -> T.Instruction (T.pushq ~src:arg)) args
@ 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)
]
(* Si on a aligné la pile, on la remet comme c'était avant de partir *)
@ align_stack_close
;;
end