Home My Page Projects Code Snippets Project Openings SML/NJ
Summary Activity Forums Tracker Lists Tasks Docs Surveys News SCM Files

SCM Repository

[smlnj] Annotation of /MLRISC/trunk/amd64/instructions/amd64Peephole.sml
ViewVC logotype

Annotation of /MLRISC/trunk/amd64/instructions/amd64Peephole.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2623 - (view) (download)

1 : mrainey 2623 (* WARNING: this is generated by running 'nowhere amd64Peephole.peep'.
2 :     * Do not edit this file directly.
3 :     * Version 1.2.2
4 :     *)
5 :    
6 :     (*#line 20.1 "amd64Peephole.peep"*)
7 :     functor AMD64Peephole(
8 :     (*#line 21.5 "amd64Peephole.peep"*)
9 :     structure Instr : AMD64INSTR
10 :    
11 :     (*#line 22.5 "amd64Peephole.peep"*)
12 :     structure Eval : MLTREE_EVAL
13 :    
14 :     (*#line 23.7 "amd64Peephole.peep"*)
15 :     sharing Instr.T = Eval.T
16 :     ): PEEPHOLE =
17 :     struct
18 :    
19 :     (*#line 26.4 "amd64Peephole.peep"*)
20 :     structure I = Instr
21 :    
22 :     (*#line 27.4 "amd64Peephole.peep"*)
23 :     structure C = I.C
24 :    
25 :     (*#line 28.4 "amd64Peephole.peep"*)
26 :     structure CBase = CellsBasis
27 :    
28 :     (*#line 31.4 "amd64Peephole.peep"*)
29 :     fun peephole instrs =
30 :     let
31 :     (*#line 32.8 "amd64Peephole.peep"*)
32 :     fun isStackPtr (I.Direct(_, r)) = CBase.sameColor (r, C.rsp)
33 :     | isStackPtr _ = false
34 :    
35 :     (*#line 35.8 "amd64Peephole.peep"*)
36 :     fun isZeroLE le = (((Eval.valueOf le) = 0) handle _ => false
37 :     )
38 :    
39 :     (*#line 37.8 "amd64Peephole.peep"*)
40 :     fun isZero (I.Immed n) = n = 0
41 :     | isZero (I.ImmedLabel le) = isZeroLE le
42 :     | isZero _ = false
43 :    
44 :     (*#line 41.8 "amd64Peephole.peep"*)
45 :     fun isZeroOpt NONE = true
46 :     | isZeroOpt (SOME opn) = isZero opn
47 :    
48 :     (*#line 44.8 "amd64Peephole.peep"*)
49 :     fun loop (code, instrs) =
50 :     let val v_39 = code
51 :     fun state_10 (v_0, v_3) =
52 :     let val i = v_0
53 :     and rest = v_3
54 :     in loop (rest, i :: instrs)
55 :     end
56 :     fun state_12 (v_0, v_19, v_3) =
57 :     let val le = v_19
58 :     and rest = v_3
59 :     in (if (isZeroLE le)
60 :     then (loop (rest, instrs))
61 :     else (state_10 (v_0, v_3)))
62 :     end
63 :     fun state_67 (v_0, v_1, v_2, v_3) =
64 :     (case v_1 of
65 :     I.Direct v_35 =>
66 :     let val dst = v_1
67 :     and rest = v_3
68 :     and src = v_2
69 :     in (if (isZero src)
70 :     then (loop (rest, (I.binary {binOp=I.XORQ, src=dst, dst=dst}) :: instrs))
71 :     else (state_10 (v_0, v_3)))
72 :     end
73 :     | _ => state_10 (v_0, v_3)
74 :     )
75 :     fun state_13 (v_0, v_2, v_3) =
76 :     (case v_2 of
77 :     I.ImmedLabel v_19 => state_12 (v_0, v_19, v_3)
78 :     | _ => state_10 (v_0, v_3)
79 :     )
80 :     in
81 :     (case v_39 of
82 :     op :: v_38 =>
83 :     let val (v_0, v_3) = v_38
84 :     in
85 :     (case v_0 of
86 :     I.INSTR v_37 =>
87 :     (case v_37 of
88 :     I.BINARY v_21 =>
89 :     let val {binOp=v_36, dst=v_1, src=v_2, ...} = v_21
90 :     in
91 :     (case v_36 of
92 :     I.ADDL => state_13 (v_0, v_2, v_3)
93 :     | I.ADDQ =>
94 :     (case v_2 of
95 :     I.Immed v_19 =>
96 :     (case v_1 of
97 :     I.Direct v_35 =>
98 :     let val (v_34, v_29) = v_35
99 :     in
100 :     (case v_3 of
101 :     op :: v_16 =>
102 :     let val (v_15, v_4) = v_16
103 :     in
104 :     (case v_15 of
105 :     I.INSTR v_14 =>
106 :     (case v_14 of
107 :     I.BINARY v_13 =>
108 :     let val {binOp=v_12, dst=v_11, src=v_8, ...} = v_13
109 :     in
110 :     (case v_12 of
111 :     I.SUBQ =>
112 :     (case v_11 of
113 :     I.Direct v_10 =>
114 :     let val (v_9, v_5) = v_10
115 :     in
116 :     (case v_8 of
117 :     I.Immed v_7 =>
118 :     let val d_i = v_29
119 :     and d_j = v_5
120 :     and m = v_7
121 :     and n = v_19
122 :     and rest = v_4
123 :     and ty = v_9
124 :     in (if ((CBase.sameColor (d_i, C.rsp)) andalso (CBase.sameColor (d_j, C.rsp)))
125 :     then (if (m = n)
126 :     then (loop (rest, instrs))
127 :     else (if (m < n)
128 :     then (loop (rest, (I.binary {binOp=I.ADDQ, src=I.Immed (n - m), dst=I.Direct (ty, C.rsp)}) :: instrs))
129 :     else (loop (rest, (I.binary {binOp=I.SUBQ, src=I.Immed (m - n), dst=I.Direct (ty, C.rsp)}) :: instrs))))
130 :     else (state_10 (v_0, v_3)))
131 :     end
132 :     | _ => state_10 (v_0, v_3)
133 :     )
134 :     end
135 :     | _ => state_10 (v_0, v_3)
136 :     )
137 :     | _ => state_10 (v_0, v_3)
138 :     )
139 :     end
140 :     | _ => state_10 (v_0, v_3)
141 :     )
142 :     | _ => state_10 (v_0, v_3)
143 :     )
144 :     end
145 :     | nil => state_10 (v_0, v_3)
146 :     )
147 :     end
148 :     | _ => state_10 (v_0, v_3)
149 :     )
150 :     | I.ImmedLabel v_19 => state_12 (v_0, v_19, v_3)
151 :     | _ => state_10 (v_0, v_3)
152 :     )
153 :     | I.SUBL => state_13 (v_0, v_2, v_3)
154 :     | I.SUBQ =>
155 :     (case v_2 of
156 :     I.Immed v_19 =>
157 :     (case v_1 of
158 :     I.Direct v_35 =>
159 :     let val (v_34, v_29) = v_35
160 :     in
161 :     (case v_19 of
162 :     4 =>
163 :     (case v_3 of
164 :     op :: v_16 =>
165 :     let val (v_15, v_4) = v_16
166 :     in
167 :     (case v_15 of
168 :     I.INSTR v_14 =>
169 :     (case v_14 of
170 :     I.MOVE v_13 =>
171 :     let val {dst=v_11, mvOp=v_31, src=v_8, ...} = v_13
172 :     in
173 :     (case v_11 of
174 :     I.Displace v_10 =>
175 :     let val {base=v_30, disp=v_33, ...} = v_10
176 :     in
177 :     (case v_33 of
178 :     I.Immed v_32 =>
179 :     (case v_32 of
180 :     0 =>
181 :     (case v_31 of
182 :     I.MOVQ =>
183 :     let val base = v_30
184 :     and dst_i = v_29
185 :     and rest = v_4
186 :     and src = v_8
187 :     in (if (((CBase.sameColor (base, C.rsp)) andalso (CBase.sameColor (dst_i, C.rsp))) andalso (not (isStackPtr src)))
188 :     then (loop (rest, (I.pushq src) :: instrs))
189 :     else (state_10 (v_0, v_3)))
190 :     end
191 :     | _ => state_10 (v_0, v_3)
192 :     )
193 :     | _ => state_10 (v_0, v_3)
194 :     )
195 :     | _ => state_10 (v_0, v_3)
196 :     )
197 :     end
198 :     | _ => state_10 (v_0, v_3)
199 :     )
200 :     end
201 :     | _ => state_10 (v_0, v_3)
202 :     )
203 :     | _ => state_10 (v_0, v_3)
204 :     )
205 :     end
206 :     | nil => state_10 (v_0, v_3)
207 :     )
208 :     | _ => state_10 (v_0, v_3)
209 :     )
210 :     end
211 :     | _ => state_10 (v_0, v_3)
212 :     )
213 :     | I.ImmedLabel v_19 => state_12 (v_0, v_19, v_3)
214 :     | _ => state_10 (v_0, v_3)
215 :     )
216 :     | _ => state_10 (v_0, v_3)
217 :     )
218 :     end
219 :     | I.LEAL v_21 =>
220 :     let val {addr=v_27, r32=v_28, ...} = v_21
221 :     in
222 :     (case v_27 of
223 :     I.Displace v_26 =>
224 :     let val {base=v_24, disp=v_25, ...} = v_26
225 :     in
226 :     (case v_25 of
227 :     I.ImmedLabel v_23 =>
228 :     let val base = v_24
229 :     and le = v_23
230 :     and r32 = v_28
231 :     and rest = v_3
232 :     in (if ((isZeroLE le) andalso (CBase.sameColor (r32, base)))
233 :     then (loop (rest, instrs))
234 :     else (state_10 (v_0, v_3)))
235 :     end
236 :     | _ => state_10 (v_0, v_3)
237 :     )
238 :     end
239 :     | _ => state_10 (v_0, v_3)
240 :     )
241 :     end
242 :     | I.LEAQ v_21 =>
243 :     let val {addr=v_27, r64=v_22, ...} = v_21
244 :     in
245 :     (case v_27 of
246 :     I.Displace v_26 =>
247 :     let val {base=v_24, disp=v_25, ...} = v_26
248 :     in
249 :     (case v_25 of
250 :     I.ImmedLabel v_23 =>
251 :     let val base = v_24
252 :     and le = v_23
253 :     and r64 = v_22
254 :     and rest = v_3
255 :     in (if ((isZeroLE le) andalso (CBase.sameColor (r64, base)))
256 :     then (loop (rest, instrs))
257 :     else (state_10 (v_0, v_3)))
258 :     end
259 :     | _ => state_10 (v_0, v_3)
260 :     )
261 :     end
262 :     | _ => state_10 (v_0, v_3)
263 :     )
264 :     end
265 :     | I.MOVE v_21 =>
266 :     let val {dst=v_1, mvOp=v_20, src=v_2, ...} = v_21
267 :     in
268 :     (case v_20 of
269 :     I.MOVQ =>
270 :     (case v_2 of
271 :     I.Displace v_19 =>
272 :     let val {base=v_6, disp=v_18, ...} = v_19
273 :     in
274 :     (case v_18 of
275 :     I.Immed v_17 =>
276 :     (case v_17 of
277 :     0 =>
278 :     (case v_3 of
279 :     op :: v_16 =>
280 :     let val (v_15, v_4) = v_16
281 :     in
282 :     (case v_15 of
283 :     I.INSTR v_14 =>
284 :     (case v_14 of
285 :     I.BINARY v_13 =>
286 :     let val {binOp=v_12, dst=v_11, src=v_8, ...} = v_13
287 :     in
288 :     (case v_12 of
289 :     I.ADDQ =>
290 :     (case v_11 of
291 :     I.Direct v_10 =>
292 :     let val (v_9, v_5) = v_10
293 :     in
294 :     (case v_8 of
295 :     I.Immed v_7 =>
296 :     (case v_7 of
297 :     4 =>
298 :     let val base = v_6
299 :     and dst = v_1
300 :     and dst_i = v_5
301 :     and rest = v_4
302 :     in (if (((CBase.sameColor (base, C.rsp)) andalso (CBase.sameColor (dst_i, C.rsp))) andalso (not (isStackPtr dst)))
303 :     then (loop (rest, (I.pop dst) :: instrs))
304 :     else (state_67 (v_0, v_1, v_2, v_3)))
305 :     end
306 :     | _ => state_67 (v_0, v_1, v_2, v_3)
307 :     )
308 :     | _ => state_67 (v_0, v_1, v_2, v_3)
309 :     )
310 :     end
311 :     | _ => state_67 (v_0, v_1, v_2, v_3)
312 :     )
313 :     | _ => state_67 (v_0, v_1, v_2, v_3)
314 :     )
315 :     end
316 :     | _ => state_67 (v_0, v_1, v_2, v_3)
317 :     )
318 :     | _ => state_67 (v_0, v_1, v_2, v_3)
319 :     )
320 :     end
321 :     | nil => state_67 (v_0, v_1, v_2, v_3)
322 :     )
323 :     | _ => state_67 (v_0, v_1, v_2, v_3)
324 :     )
325 :     | _ => state_67 (v_0, v_1, v_2, v_3)
326 :     )
327 :     end
328 :     | _ => state_67 (v_0, v_1, v_2, v_3)
329 :     )
330 :     | _ => state_10 (v_0, v_3)
331 :     )
332 :     end
333 :     | _ => state_10 (v_0, v_3)
334 :     )
335 :     | _ => state_10 (v_0, v_3)
336 :     )
337 :     end
338 :     | nil => instrs
339 :     )
340 :     end
341 :     in loop (instrs, [])
342 :     end
343 :     end
344 :    

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0