+ fun opereq (REG a, REG b) = a = b
+ | opereq (TEMP a, TEMP b) = Temp.eq (a, b)
+ | opereq (CONST a, CONST b) = a = b
+ | opereq (REL (a1, b1), REL (a2, b2)) = opereq (a1,a2) andalso opereq (b1,b2)
+(* | opereq (OSIZE (s1, o1), OSIZE (s2, o2)) = (s1 = s2) andalso opereq (o1, o2)*) (* This breaks the peepholer, shit *)
+ | opereq (_, _) = false
+
+ structure OperSet = ListSetFn (
+ struct
+ type ord_key = oper
+ val compare = cmpoper
+ end)
+
+ structure LiveMap = SplayMapFn(struct
+ type ord_key = int
+ val compare = Int.compare
+ end)
+
+ fun opsused nil = OperSet.empty
+ | opsused ((DIRECTIVE _)::l) = opsused l
+ | opsused ((COMMENT _)::l) = opsused l
+ | opsused ((LABEL _)::l) = opsused l
+ | opsused ((MOV (dst, src))::l) = OperSet.addList (opsused l, [dst, src])
+ | opsused ((LEA (dst, src))::l) = OperSet.addList (opsused l, [dst, src])
+ | opsused ((SUB (dst, src))::l) = OperSet.addList (opsused l, [dst, src])
+ | opsused ((IMUL (dst, src))::l) = OperSet.addList (opsused l, [dst, src])
+ | opsused ((IMUL3 (dst, src, _))::l) = OperSet.addList (opsused l, [dst, src])
+ | opsused ((ADD (dst, src))::l) = OperSet.addList (opsused l, [dst, src])
+ | opsused ((IDIV (src))::l) = OperSet.addList (opsused l, [src, REG EDX, REG EAX])
+ | opsused ((NEG (dst))::l) = OperSet.addList (opsused l, [dst])
+ | opsused ((NOT (dst))::l) = OperSet.addList (opsused l, [dst])
+ | opsused ((SAL (dst, shft))::l) = OperSet.addList (opsused l, [dst, shft])
+ | opsused ((SAR (dst, shft))::l) = OperSet.addList (opsused l, [dst, shft])
+ | opsused ((AND (dst, src))::l) = OperSet.addList (opsused l, [dst, src])
+ | opsused ((OR (dst, src))::l) = OperSet.addList (opsused l, [dst, src])
+ | opsused ((XOR (dst, src))::l) = OperSet.addList (opsused l, [dst, src])
+ | opsused ((CMP (dst, src))::l) = OperSet.addList (opsused l, [dst, src])
+ | opsused ((TEST (dst, src))::l) = OperSet.addList (opsused l, [dst, src])
+ | opsused ((SETcc (c, dst))::l) = OperSet.addList (opsused l, [dst])
+ | opsused ((JMP _)::l) = opsused l
+ | opsused ((Jcc _)::l) = opsused l
+ | opsused ((CALL _)::l) = opsused l
+ | opsused ((MOVZB (dst, src))::l) = OperSet.addList (opsused l, [dst, src])
+ | opsused ((CLTD)::l) = opsused l
+ | opsused ((RET)::l) = opsused l
+ | opsused ((LIVEIGN i)::l) = opsused (i::l)