File: alphaPeephole.peep

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 (58 lines) | stat: -rw-r--r-- 1,960 bytes parent folder | download | duplicates (7)
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
local
   structure I = 
   struct
      include "alphaInstr.sml"
   end
in

functor AlphaPeephole
   (structure Instr : ALPHAINSTR
    structure Eval : MLTREE_EVAL 
      sharing Instr.T = Eval.T
   ) : PEEPHOLE =
struct
   structure I = Instr
   structure CB = CellsBasis

   (* IMPORTANT: instructions are now given in forward order *)
   fun peephole instrs =
   let 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

       fun removable(I.INSTR(I.LDA{r, b, d})) = 
             isZero d andalso CB.sameColor(r,b)
         | removable(I.INSTR(I.OPERATE{oper=(I.ADDQ | I.SUBQ), ra, rb, rc})) =
             CB.sameColor(ra,rc) andalso isZero rb
         | removable(I.ANNOTATION{i,a}) = removable i
         | removable _ = false

       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

       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

       fun loop(current, instrs) = 
           case current of
             [] => instrs
           | (st as I.INSTR(I.STORE{stOp, r=r1, b=b1, d=d1, ...}))::
             (ld as I.INSTR(I.LOAD {ldOp, r=r2, b=b2, d=d2, ...}))::rest 
              where symmetric(stOp, ldOp) andalso 
                    CB.sameColor(r1,r2) andalso 
                    CB.sameColor(b1,b2) andalso 
                    sameOperand(d1,d2) => loop(rest, st::instrs)
           | i::rest where removable i => loop(rest, instrs)
           | i::rest => loop(rest, i::instrs)
   in  loop(instrs, [])
   end
end 

end