]> Joshua Wise's Git repositories - snipe.git/blobdiff - codegen/peephole.sml
Initial import of l3c
[snipe.git] / codegen / peephole.sml
index cdbba9c09c486165488b55618188d8fc7d20fc1e..7fa4554b305d5721dfbbedf8d305a8e8ed169c95 100644 (file)
@@ -1,5 +1,5 @@
-(* peephole optimizer
- * Gathers tiberium, fires rockets
+(* L3 compiler
+ * peephole optimizer
  * optimizes away redundant insns such as:
      mov a, b
      mov a, b
      
      neg a
      neg a
- * Author: Chris Lu <czl@andrew>
+ * Author: Chris Lu <czl@andrew.cmu.edu>
  *)
 
 signature PEEPHOLE =
 sig
-  type tiberium = x86.insn list
-  type rockets = x86.insn list
-  val peephole : tiberium -> rockets
+  val peephole : x86.insn list -> x86.insn list
 end
 
 structure Peephole :> PEEPHOLE =
 struct
-  type tiberium = x86.insn list
-  type rockets = x86.insn list
   structure X = x86
 
-  (* val peephole : tiberium -> rockets *)
+  (* val peephole : x86.insn list -> x86.insn list *)
 
-  fun peephole ((insn1 as X.MOVL(a1,b1))::(insn2 as X.MOVL(a2,b2))::l) =
+  fun peephole ((insn1 as X.MOV(a1,b1))::(insn2 as X.MOV(a2,b2))::l) =
         if(x86.opereq(a1, b1) orelse (x86.opereq(a1, a2) andalso x86.opereq(b1, b2))) then
           peephole (insn2::l)
         else if(x86.opereq(a2, b2) orelse (x86.opereq(a1, b2) andalso x86.opereq(b1, a2))) then
           peephole (insn1::l)
         else
           insn1::(peephole (insn2::l))
-    | peephole ((insn as X.MOVL(a,b))::l) = if x86.opereq(a, b) then peephole l else insn::(peephole l)
+    | peephole (X.MOV (X.REG r, X.CONST 0w0)::l) = (X.XOR (X.REG r, X.REG r))::(peephole l)
+    | peephole ((insn as X.MOV(a,b))::l) = if x86.opereq(a, b) then peephole l else insn::(peephole l)
     | 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))
+    | peephole (X.ADD (_, X.CONST 0w0)::l) = peephole l
+    | peephole (X.SUB (_, X.CONST 0w0)::l) = peephole l
+    | peephole (X.CMP (X.REG r, X.CONST 0w0)::l) = (X.TEST (X.REG r, X.REG r))::(peephole l)
+    | peephole ((X.JMP a)::(X.JMP b)::l) = peephole ((X.JMP a)::l) (* What the cock? Yes, we actually generate this. *)
+    | 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)
+    | peephole (X.SIZE (s, i)::l) = map (fn i => X.SIZE (s, i)) (peephole [i]) @ (peephole l)  (* :/ that kind of sucks, but oh well *)
     | peephole (a::l) = a::(peephole l)
     | peephole nil = nil
 
This page took 0.023972 seconds and 4 git commands to generate.