]> Joshua Wise's Git repositories - snipe.git/blob - codegen/peephole.sml
7bf55a1c9a9235e6b1888f9e06b652998d440d5c
[snipe.git] / codegen / peephole.sml
1 (* L3 compiler
2  * peephole optimizer
3  * optimizes away redundant insns such as:
4      mov a, b
5      mov a, b
6
7      mov a, b
8      mov b, a
9
10      mov a, a
11      
12      neg a
13      neg a
14  * Author: Chris Lu <czl@andrew.cmu.edu>
15  *)
16
17 signature PEEPHOLE =
18 sig
19   val peephole : x86.insn list -> x86.insn list
20 end
21
22 structure Peephole :> PEEPHOLE =
23 struct
24   structure X = x86
25
26   (* val peephole : x86.insn list -> x86.insn list *)
27
28   fun peephole ((insn1 as X.MOV(a1,b1))::(insn2 as X.MOV(a2,b2))::l) =
29         if(x86.opereq(a1, b1) orelse (x86.opereq(a1, a2) andalso x86.opereq(b1, b2))) then
30           peephole (insn2::l)
31         else if(x86.opereq(a2, b2) orelse (x86.opereq(a1, b2) andalso x86.opereq(b1, a2))) then
32           peephole (insn1::l)
33         else
34           insn1::(peephole (insn2::l))
35     | peephole (X.MOV (X.REG r, X.CONST 0w0)::l) = (X.XOR (X.REG r, X.REG r))::(peephole l)
36     | peephole ((insn as X.MOV(a,b))::l) = if x86.opereq(a, b) then peephole l else insn::(peephole l)
37     | peephole ((insn1 as X.NEG(a))::(insn2 as X.NEG(b))::l) = if x86.opereq(a, b) then peephole l else insn1::(peephole (insn2::l))
38     | peephole (X.ADD (_, X.CONST 0w0)::l) = peephole l
39     | peephole (X.SUB (_, X.CONST 0w0)::l) = peephole l
40     | peephole (X.CMP (X.REG r, X.CONST 0w0)::l) = (X.TEST (X.REG r, X.REG r))::(peephole l)
41     | peephole ((X.JMP a)::(X.JMP b)::l) = peephole ((X.JMP a)::l) (* What the cock? Yes, we actually generate this. *)
42     | peephole ((X.JMP l1)::(X.LABEL l2)::l) = if (Label.compare (l1,l2) = EQUAL) then (X.LABEL l2)::(peephole l) else (X.JMP l1)::(X.LABEL l2)::(peephole l)
43     | peephole (a::l) = a::(peephole l)
44     | peephole nil = nil
45
46 end
This page took 0.016633 seconds and 2 git commands to generate.