File: alphaPeephole.sml

package info (click to toggle)
mlton 20210117%2Bdfsg-3
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 58,464 kB
  • sloc: ansic: 27,682; sh: 4,455; asm: 3,569; lisp: 2,879; makefile: 2,347; perl: 1,169; python: 191; pascal: 68; javascript: 7
file content (169 lines) | stat: -rw-r--r-- 6,791 bytes parent folder | download | duplicates (6)
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
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
(* WARNING: this is generated by running 'nowhere alphaPeephole.peep'.
 * Do not edit this file directly.
 * Version 1.2.2
 *)

(*#line 8.1 "alphaPeephole.peep"*)
functor AlphaPeephole(
(*#line 9.5 "alphaPeephole.peep"*)
                      structure Instr : ALPHAINSTR

(*#line 10.5 "alphaPeephole.peep"*)
                      structure Eval : MLTREE_EVAL

(*#line 11.7 "alphaPeephole.peep"*)
                      sharing Instr.T = Eval.T
                     ): PEEPHOLE =
struct

(*#line 14.4 "alphaPeephole.peep"*)
   structure I = Instr

(*#line 15.4 "alphaPeephole.peep"*)
   structure CB = CellsBasis

(*#line 18.4 "alphaPeephole.peep"*)
   fun peephole instrs = 
       let 
(*#line 19.8 "alphaPeephole.peep"*)
           fun isZero (I.LABop le) = (((Eval.valueOf le) = 0) handle _ => false
)
             | isZero (I.REGop r) = (CB.registerNum r) = 31
             | isZero (I.IMMop i) = i = 0
             | isZero _ = false

(*#line 24.8 "alphaPeephole.peep"*)
           fun removable p_0 = 
               let val v_12 = p_0
                   fun state_7 () = false
                   fun state_4 (v_0, v_1, v_2) = 
                       let val ra = v_0
                           and rb = v_1
                           and rc = v_2
                       in (CB.sameColor (ra, rc)) andalso (isZero rb)
                       end
               in 
                  let val v_11 = v_12
                  in 
                     (case v_11 of
                       I.ANNOTATION v_8 => 
                       let val {a=v_10, i=v_9, ...} = v_8
                       in 
                          let val a = v_10
                              and i = v_9
                          in removable i
                          end
                       end
                     | I.INSTR v_8 => 
                       (case v_8 of
                         I.LDA v_4 => 
                         let val {b=v_7, d=v_6, r=v_5, ...} = v_4
                         in 
                            let val b = v_7
                                and d = v_6
                                and r = v_5
                            in (isZero d) andalso (CB.sameColor (r, b))
                            end
                         end
                       | I.OPERATE v_4 => 
                         let val {oper=v_3, ra=v_0, rb=v_1, rc=v_2, ...} = v_4
                         in 
                            (case v_3 of
                              I.ADDQ => state_4 (v_0, v_1, v_2)
                            | I.SUBQ => state_4 (v_0, v_1, v_2)
                            | _ => state_7 ()
                            )
                         end
                       | _ => state_7 ()
                       )
                     | _ => state_7 ()
                     )
                  end
               end

(*#line 31.8 "alphaPeephole.peep"*)
           fun symmetric (I.STQ, I.LDQ) = true
             | symmetric (I.STL, I.LDL) = true
             | symmetric (I.STW, I.LDW) = true
             | symmetric (I.STB, I.LDB) = true
             | symmetric _ = false

(*#line 37.8 "alphaPeephole.peep"*)
           fun sameOperand (I.REGop r1, I.REGop r2) = CB.sameColor (r1, r2)
             | sameOperand (I.IMMop i1, I.IMMop i2) = i1 = i2
             | sameOperand (I.LABop l1, I.LABop l2) = (((Eval.valueOf l1) = (Eval.valueOf l2)) handle _ => false
)
             | sameOperand _ = false

(*#line 43.8 "alphaPeephole.peep"*)
           fun loop (current, instrs) = 
               let val v_31 = current
                   fun state_7 (v_13, v_14) = 
                       let val i = v_13
                           and rest = v_14
                       in (if (removable i)
                             then (loop (rest, instrs))
                             else 
                             let val i = v_13
                                 and rest = v_14
                             in loop (rest, i :: instrs)
                             end)
                       end
               in 
                  (case v_31 of
                    op :: v_30 => 
                    let val (v_13, v_14) = v_30
                    in 
                       (case v_13 of
                         I.INSTR v_29 => 
                         (case v_29 of
                           I.STORE v_28 => 
                           let val {b=v_24, d=v_22, r=v_18, stOp=v_15, ...} = v_28
                           in 
                              (case v_14 of
                                op :: v_27 => 
                                let val (v_20, v_16) = v_27
                                in 
                                   (case v_20 of
                                     I.INSTR v_26 => 
                                     (case v_26 of
                                       I.LOAD v_25 => 
                                       let val {b=v_23, d=v_21, ldOp=v_19, r=v_17, ...} = v_25
                                       in 
                                          let val b1 = v_24
                                              and b2 = v_23
                                              and d1 = v_22
                                              and d2 = v_21
                                              and ld = v_20
                                              and ldOp = v_19
                                              and r1 = v_18
                                              and r2 = v_17
                                              and rest = v_16
                                              and st = v_13
                                              and stOp = v_15
                                          in (if ((((symmetric (stOp, ldOp)) andalso (CB.sameColor (r1, r2))) andalso (CB.sameColor (b1, b2))) andalso (sameOperand (d1, 
                                                d2)))
                                                then (loop (rest, st :: instrs))
                                                else (state_7 (v_13, v_14)))
                                          end
                                       end
                                     | _ => state_7 (v_13, v_14)
                                     )
                                   | _ => state_7 (v_13, v_14)
                                   )
                                end
                              | nil => state_7 (v_13, v_14)
                              )
                           end
                         | _ => state_7 (v_13, v_14)
                         )
                       | _ => state_7 (v_13, v_14)
                       )
                    end
                  | nil => instrs
                  )
               end
       in loop (instrs, [])
       end
end