X-Git-Url: http://git.joshuawise.com/snipe.git/blobdiff_plain/1144856ba9d6018d9922c6ede7e97779a0fe6373..5c79bb689ab446551bc7ec4497e6c9b75582837e:/codegen/peephole.sml diff --git a/codegen/peephole.sml b/codegen/peephole.sml deleted file mode 100644 index 7bf55a1..0000000 --- a/codegen/peephole.sml +++ /dev/null @@ -1,46 +0,0 @@ -(* L3 compiler - * peephole optimizer - * optimizes away redundant insns such as: - mov a, b - mov a, b - - mov a, b - mov b, a - - mov a, a - - neg a - neg a - * Author: Chris Lu - *) - -signature PEEPHOLE = -sig - val peephole : x86.insn list -> x86.insn list -end - -structure Peephole :> PEEPHOLE = -struct - structure X = x86 - - (* val peephole : x86.insn list -> x86.insn list *) - - 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 (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 (a::l) = a::(peephole l) - | peephole nil = nil - -end