X-Git-Url: http://git.joshuawise.com/snipe.git/blobdiff_plain/12aa4087bee3e70f170d7457794921de4e385227..6ade8b0a3251e44b34c6bdbbd9403e36d6fd6231:/codegen/peephole.sml diff --git a/codegen/peephole.sml b/codegen/peephole.sml index cdbba9c..7fa4554 100644 --- a/codegen/peephole.sml +++ b/codegen/peephole.sml @@ -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 @@ -11,33 +11,36 @@ neg a neg a - * Author: Chris Lu + * Author: Chris Lu *) 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