Skip to content
Snippets Groups Projects
Commit c150a11f authored by Putegnat Theo's avatar Putegnat Theo
Browse files

RTL fonctionne - TP5

parent 20afe797
No related branches found
No related tags found
No related merge requests found
......@@ -43,7 +43,18 @@ let find_var (next_reg, var2reg) v =
- [var2reg] est la nouvelle association nom de variable/registre.
*)
let rec rtl_instrs_of_cfg_expr (next_reg, var2reg) (e: expr) =
(next_reg, [], next_reg, var2reg)
match e with
| Ebinop (b,e1,e2) ->
let (r1, rtlinstr1, next_reg1, var2reg1) = rtl_instrs_of_cfg_expr (next_reg, var2reg) e1 in
let (r2, rtlinstr2, next_reg2, var2reg2) = rtl_instrs_of_cfg_expr (next_reg1 ,var2reg1) e2 in
(next_reg2, rtlinstr1 @ rtlinstr2 @ [Rbinop (b,next_reg2,r1,r2)], next_reg2+1, var2reg2)
| Eunop (u,e) ->
let (r1,rtlinstr1, next_reg1,var2reg1) = rtl_instrs_of_cfg_expr (next_reg, var2reg) e in
(next_reg1, rtlinstr1 @ [Runop (u,next_reg,r1)],next_reg1+1,var2reg1)
| Eint (i) -> next_reg, [Rconst (next_reg,i)] , next_reg + 1 , var2reg
| Evar (s) ->
let r, next_reg',var2reg' = find_var (next_reg, var2reg) s in
(r, [], next_reg', var2reg')
let is_cmp_op =
function Eclt -> Some Rclt
......@@ -65,7 +76,19 @@ let rtl_cmp_of_cfg_expr (e: expr) =
let rtl_instrs_of_cfg_node ((next_reg:int), (var2reg: (string*int) list)) (c: cfg_node) =
(* TODO *)
([], next_reg, var2reg)
match c with
| Cassign (s,e,i) -> let rexpr, lexpr, next_regexpr, var2regexpr = rtl_instrs_of_cfg_expr (next_reg, var2reg) e in
let rass, next_regass, var2regass = find_var (next_regexpr, var2regexpr) s in
(lexpr @ [Rmov(rass,rexpr);Rjmp (i)], next_regass, var2regass)
| Creturn e -> let a,b,c,d = rtl_instrs_of_cfg_expr (next_reg,var2reg) e in
(b @[(Rret a)],c,d)
| Cprint (e,i) -> let a,b,c,d = rtl_instrs_of_cfg_expr (next_reg,var2reg) e in
(b @[(Rprint a);Rjmp(i)],c ,d)
| Ccmp (e,i1,i2) -> let rop,e1,e2 = rtl_cmp_of_cfg_expr e in
let r1,rtlinstr1, next_reg1,var2reg1 = rtl_instrs_of_cfg_expr (next_reg, var2reg) e1 in
let r2,rtlinstr2, next_reg2,var2reg2 = rtl_instrs_of_cfg_expr (next_reg1, var2reg1) e2 in
(rtlinstr1 @ rtlinstr2 @ [Rbranch (rop,r1,r2,i1); Rjmp(i2)],next_reg2,var2reg2 )
| Cnop i -> ([Rjmp(i)],next_reg,var2reg)
let rtl_instrs_of_cfg_fun cfgfunname ({ cfgfunargs; cfgfunbody; cfgentry }: cfg_fun) =
let (rargs, next_reg, var2reg) =
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment