alignement RSP sur 16
This commit is contained in:
parent
9465bb9898
commit
cc21e95e20
1 changed files with 14 additions and 2 deletions
|
@ -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
|
||||
|
||||
|
|
Reference in a new issue