File: sparcPeephole.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 (40 lines) | stat: -rw-r--r-- 994 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
local

   structure I =
   struct
     include "sparcInstr.sml"
   end

in

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

   (* IMPORTANT: instructions are now given in forward order *)
   fun peephole instrs =
   let fun isZero(I.LAB le)  = ((Eval.valueOf le = 0) handle _ => false)
         | isZero(I.REG r)   = CB.registerNum r = 0
         | isZero(I.IMMED i) = i = 0
         | isZero _ = false

       fun removable(I.INSTR(I.ARITH{a=(I.ADD | I.SUB), r, i, d})) =
             CB.sameColor(r,d) andalso isZero i
         | removable(I.ANNOTATION{i,a}) = removable i
         | removable _ = false

       fun loop(current, instrs) = 
           case current of
             [] => instrs
           | i::rest where removable i => loop(rest, instrs)
           | i::rest => loop(rest, i::instrs)
   in  loop(instrs, [])
   end
end 

end