-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathprint_rtl.ml
More file actions
151 lines (139 loc) · 4.43 KB
/
Copy pathprint_rtl.ml
File metadata and controls
151 lines (139 loc) · 4.43 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
open Format
open Rtl
open Register
(* Affichage *)
let p_label f = fprintf f "L%d"
let p_pseudoreg f x =
fprintf f "%s" (match x with
| Pseudo n -> sprintf "%%%d" n
| ZERO -> "$0"
| V0 -> "V0"
| V1 -> "V1"
| T0 -> "T0"
| T1 -> "T1"
| T2 -> "T2"
| T3 -> "T3"
| T4 -> "T4"
| T5 -> "T5"
| T6 -> "T6"
| T7 -> "T7"
| SP -> "SP"
| FP -> "FP"
| S0 -> "S0"
| S1 -> "S1"
| S2 -> "S2"
| S3 -> "S3"
| S4 -> "S4"
| S5 -> "S5"
| S6 -> "S6"
| S7 -> "S7"
| A0 -> "A0"
| A1 -> "A1"
| A2 -> "A2"
| RA -> "RA")
let p_address f = function
| Alab s -> fprintf f "%s" s
| Areg (n,pr) -> fprintf f "%ld(%a)" n p_pseudoreg pr
let p_operand f = function
| Oimm n -> fprintf f "%d" (Int32.to_int n)
| Oreg pr -> p_pseudoreg f pr
let rec p_list sep printer f = function
| [] -> ()
| [h] -> printer f h
| h::t -> fprintf f "%a%s%a"
printer h
sep
(p_list sep printer) t
let p_instr f = function
| Move(r1,r2,l) -> fprintf f "move\t%a\t%a\t-> %a"
p_pseudoreg r1 p_pseudoreg r2 p_label l
| Li(r,n,l) -> fprintf f "li \t%a\t%d\t-> %a"
p_pseudoreg r (Int32.to_int n) p_label l
| La(r,s,l) -> fprintf f "str\t%a\t%a\t-> %a"
p_pseudoreg r p_address s p_label l
| Lw(r,a,l) -> fprintf f "lw\t%a\t%a\t\t-> %a"
p_pseudoreg r p_address a p_label l
| Sw(r,a,l) -> fprintf f "sw\t%a\t%a\t\t-> %a"
p_pseudoreg r p_address a p_label l
| Lb(r,a,l) -> fprintf f "lb\t%a\t%a\t\t-> %a"
p_pseudoreg r p_address a p_label l
| Sb(r,a,l) -> fprintf f "sb\t%a\t%a\t\t-> %a"
p_pseudoreg r p_address a p_label l
| Address(pr1,pr2,l) -> fprintf f "addr\t%a\t[%a]\t\t-> %a"
p_pseudoreg pr1 p_pseudoreg pr2 p_label l
| Arith(ar,r1,r2,op,l) -> fprintf f "%a %a\t%a\t%a\t-> %a"
Mips.print_arith ar p_pseudoreg r1 p_pseudoreg r2 p_operand op p_label l
| Set(cond,r1,r2,op,l) -> fprintf f "%a %a\t%a\t%a\t-> %a"
(Mips.print_condition (Rtl.is_oimm op))
cond p_pseudoreg r1 p_pseudoreg r2 p_operand op p_label l
| Neg(r1,r2,l) -> fprintf f "neg\t%a\t%a\t\t-> %a"
p_pseudoreg r1 p_pseudoreg r2 p_label l
| B(l) -> fprintf f "b\t\t\t-> %a"
p_label l
| Beq(r1,r2,l1,l2) -> fprintf f "beq\t%a\t%a\t%a\t-> %a"
p_pseudoreg r1 p_pseudoreg r2 p_label l1 p_label l2
| Bne(r1,r2,l1,l2) -> fprintf f "bne\t%a\t%a\t%a\t-> %a"
p_pseudoreg r1 p_pseudoreg r2 p_label l1 p_label l2
| Beqz(r,l1,l2) -> fprintf f "beqz\t%a\t%a\t\t-> %a"
p_pseudoreg r p_label l1 p_label l2
| Bnez(r,l1,l2) -> fprintf f "bnez\t%a\t%a\t-> %a"
p_pseudoreg r p_label l1 p_label l2
| Return(Some r,lbl) -> fprintf f "return\t%a\t\t-> %a"
p_pseudoreg r p_label lbl
| Return(None,lbl) -> fprintf f "return\t\t\t-> %a"
p_label lbl
| Loop_begin lbl -> fprintf f "loop_begin\t\t\t-> %a"
p_label lbl
| Loop_end lbl -> fprintf f "loop_begin\t\t\t-> %a"
p_label lbl
| Call (name,args,destreg,lbl) -> fprintf f "%a := %s(%a)\t\t-> %a"
p_pseudoreg destreg name (p_list "," p_pseudoreg) args p_label lbl
| Putchar(arg,retval,lbl) -> fprintf f "%a := putchar(%a)\t\t-> %a"
p_pseudoreg retval p_pseudoreg arg p_label lbl
| Sbrk(arg,retval,lbl) -> fprintf f "%a := sbrk(%a)\t\t-> %a"
p_pseudoreg retval p_pseudoreg arg p_label lbl
let print_rtl f g =
let p_binding l i =
fprintf f "%a : %a\n" p_label l p_instr i in
iter_instr g p_binding
let rec rtl_dfs dejavu g f start =
try
if not (dejavu.(start)) then
begin
let instr = find_instr g start in
fprintf f "%a : %a\n" p_label start p_instr instr;
dejavu.(start) <- true;
(match instr with
| Move(_,_,l)
| Li(_,_,l)
| La(_,_,l)
| Lw(_,_,l)
| Sw(_,_,l)
| Lb(_,_,l)
| Sb(_,_,l)
| Address(_,_,l)
| Arith(_,_,_,_,l)
| Set(_,_,_,_,l)
| Neg (_,_,l)
| B l
| Loop_begin l
| Loop_end l
| Call (_,_,_,l)
| Putchar (_,_,l)
| Sbrk (_,_,l) -> rtl_dfs dejavu g f l
| Beqz (_,l1,l2)
| Bnez (_,l1,l2)
| Bne (_,_,l1,l2)
| Beq (_,_,l1,l2) -> rtl_dfs dejavu g f l1; rtl_dfs dejavu g f l2
| Return _ -> ())
end
with Not_found -> ()
let p_decl f d =
let dejavu = Array.make (max_label ()) false in
let gr = d.g in
fprintf f "%a %s(%a):\nentry : %a\nexit : %a\n%a\n\n"
p_pseudoreg d.retval d.name (p_list ", " p_pseudoreg) d.args
p_label d.entry p_label d.exit
(rtl_dfs dejavu gr) d.entry
let p_decl_list f =
List.iter (p_decl f)