From d59d579df9c6ad753c92de5aebf06e595d8f1632 Mon Sep 17 00:00:00 2001 From: Nicolas PENELOUX Date: Sun, 31 Dec 2023 17:00:00 +0100 Subject: [PATCH] ajout mov mul et sub --- flap/src/x86-64/retrolixToX86_64.ml | 57 ++++++++++++++++++++++++----- 1 file changed, 47 insertions(+), 10 deletions(-) diff --git a/flap/src/x86-64/retrolixToX86_64.ml b/flap/src/x86-64/retrolixToX86_64.ml index 48a92cb..f3be4f3 100644 --- a/flap/src/x86-64/retrolixToX86_64.ml +++ b/flap/src/x86-64/retrolixToX86_64.ml @@ -425,17 +425,54 @@ end module InstructionSelector : InstructionSelector = struct open T +open T + let R15 = `Reg X86_64_Architecture.R15 (* Registre R15 que nous utilisons pour le compilateur *) - let mov ~(dst : dst) ~(src : src) = failwith "Students! This is your job!" - let bin ins ~dst ~srcl ~srcr = failwith "Students! This is your job!" - let add ~dst ~srcl ~srcr = failwith "Students! This is your job!" - let sub ~dst ~srcl ~srcr = failwith "Students! This is your job!" - let mul ~dst ~srcl ~srcr = failwith "Students! This is your job!" - let div ~dst ~srcl ~srcr = failwith "Students! This is your job!" - let andl ~dst ~srcl ~srcr = failwith "Students! This is your job!" - let orl ~dst ~srcl ~srcr = failwith "Students! This is your job!" - let conditional_jump ~cc ~srcl ~srcr ~ll ~lr = failwith "Students! This is your job!" - let switch ?default ~discriminant ~cases () = failwith "Students! This is your job!" + let mov ~(dst : dst) ~(src : src) = + (* SI les sources sont égaux (même adresse ou même registre), on ne bouge rien*) + match src, dst with + | `Reg x, `Reg y when x = y -> [] + | `Addr x, `Addr y when x = y -> [] + (*Si au moins un des deux est un accès mémoire, on créé une instruction movq*) + | (`Imm _ | `Reg _), _ | _, `Reg _-> [Instruction (movq ~src ~dst)] + (*Si la destination est pas un registre, on effectue une copie vers r15 puis on effectue l'instruction movq*) + | _ -> execute ~dst (movq ~src) + + + let bin ins ~dst ~srcl ~srcr = + failwith "Students! This is your job!" + + let add ~dst ~srcl ~srcr = + failwith "Students! This is your job!" + + let sub ~dst ~srcl ~srcr = + move_execute imulq ~dst:dst ~srcl:srcl ~srcr:srcr + + let mul ~dst ~srcl ~srcr = + move_execute imulq ~dst:dst ~srcl:srcl ~srcr:srcr + + let div ~dst ~srcl ~srcr = + failwith "Students! This is your job!" + + let andl ~dst ~srcl ~srcr = + failwith "Students! This is your job!" + + let orl ~dst ~srcl ~srcr = + failwith "Students! This is your job!" + + let conditional_jump ~cc ~srcl ~srcr ~ll ~lr = + failwith "Students! This is your job!" + + let switch ?default ~discriminant ~cases () = + failwith "Students! This is your job!" + + + let execute ~(dst : dst) f = (* On créer une instruction f puis on créer un movq *) + Instruction (f ~dst:r15) :: (if dst = r15 [] else [Instruction (movq ~src:r15 ~dst)]) + + let move_execute f ~dst ~srcl ~srcr = + mov ~src:srcr ~dst:r15 + @ (execute ~dst (f ~src:srcl)) end module FrameManager (IS : InstructionSelector) : FrameManager = struct