+ 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 (ra, ia), REL (rb, ib)) = (ra = rb) andalso (ia = ib)
+ | 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 ((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)
+ | opsused ((SIZE (_, i))::l) = opsused (i::l)