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 *)
|
(* Vide la pile et jump vers la fonction *)
|
||||||
function_epilogue fd @ [ Instruction (T.jmpdi ~tgt:f) ]
|
function_epilogue fd @ [ Instruction (T.jmpdi ~tgt:f) ]
|
||||||
| `Normal ->
|
| `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 *)
|
(* 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 *)
|
(* 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 *)
|
(* 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)
|
; 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
|
end
|
||||||
|
|
||||||
|
|
Reference in a new issue