+ | munch_exp d (T.BINOP(T.MUL, e1, e2)) =
+ let
+ val t1 = Temp.new ()
+ in
+ (munch_exp d e1) @ (munch_exp (X.TEMP t1) e2) @ [X.IMUL(d, X.TEMP t1)]
+ end
+ | munch_exp d (T.BINOP(T.DIV, e1, e2)) =
+ let
+ val t1 = Temp.new ()
+ in
+ (munch_exp (X.TEMP t1) e1) @ (munch_exp d e2) @
+ [X.MOVL (X.REG X.EAX, X.TEMP t1), X.CLTD, X.IDIVL d, X.MOVL (d, X.REG X.EAX)]
+ end
+ | munch_exp d (T.BINOP(T.MOD, e1, e2)) =
+ let
+ val t1 = Temp.new ()
+ in
+ (munch_exp (X.TEMP t1) e1) @ (munch_exp d e2) @
+ [X.MOVL (X.REG X.EAX, X.TEMP t1), X.CLTD, X.IDIVL d, X.MOVL (d, X.REG X.EDX)]
+ end
+ | munch_exp d (T.BINOP(T.LSH, e1, T.CONST n)) = (munch_exp d e1) @ [X.SALL (d, X.CONST n)]
+ | munch_exp d (T.BINOP(T.LSH, e1, e2)) =
+ let
+ val t1 = Temp.new()
+ in
+ (munch_exp d e1) @ (munch_exp (X.TEMP t1) e2) @
+ [X.MOVL (X.REG X.ECX, X.TEMP t1), X.SALL (d, X.REG X.ECX)]
+ end
+ | munch_exp d (T.BINOP(T.RSH, e1, T.CONST n)) = (munch_exp d e1) @ [X.SARL (d, X.CONST n)]
+ | munch_exp d (T.BINOP(T.RSH, e1, e2)) =
+ let
+ val t1 = Temp.new()
+ in
+ (munch_exp d e1) @ (munch_exp (X.TEMP t1) e2) @
+ [X.MOVL (X.REG X.ECX, X.TEMP t1), X.SARL (d, X.REG X.ECX)]
+ end
+ | munch_exp d (T.BINOP(T.LOGOR, e1, e2)) =
+ let
+ val l1 = Label.new()
+ in
+ (munch_exp d e1) @ [X.CMPL (d, X.CONST(0w0)), X.JNE l1] @ (munch_exp d e2) @ [X.CMPL (d, X.CONST(0w0)), X.LABEL l1, X.SETNE d, X.MOVZBL(d,d)]
+ end
+ | munch_exp d (T.BINOP(T.LOGAND, e1, e2)) =
+ let
+ val l1 = Label.new()
+ in
+ (munch_exp d e1) @ [X.CMPL (d, X.CONST(0w0)), X.JE l1] @ (munch_exp d e2) @ [X.CMPL (d, X.CONST(0w0)), X.LABEL l1, X.SETNE d, X.MOVZBL(d,d)]
+ end
+ | munch_exp d (T.BINOP(T.BITAND, e1, e2)) =
+ let
+ val t1 = Temp.new ()
+ in
+ (munch_exp d e1) @ (munch_exp (X.TEMP t1) e2) @ [X.ANDL(d, X.TEMP t1)]
+ end
+ | munch_exp d (T.BINOP(T.BITOR, e1, e2)) =
+ let
+ val t1 = Temp.new ()
+ in
+ (munch_exp d e1) @ (munch_exp (X.TEMP t1) e2) @ [X.ORL(d, X.TEMP t1)]
+ end
+ | munch_exp d (T.BINOP(T.BITXOR, e1, e2)) =
+ let
+ val t1 = Temp.new ()
+ in
+ (munch_exp d e1) @ (munch_exp (X.TEMP t1) e2) @ [X.XORL(d, X.TEMP t1)]
+ end
+ | munch_exp d (T.BINOP(T.NEQ, e1, e2)) =
+ let
+ val t1 = Temp.new ()
+ in
+ (munch_exp d e1) @ (munch_exp (X.TEMP t1) e2) @
+ [X.CMPL(d, X.TEMP t1), X.SETNE(d), X.MOVZBL(d, d)]
+ end
+ | munch_exp d (T.BINOP(T.EQ, e1, e2)) =
+ let
+ val t1 = Temp.new ()
+ in
+ (munch_exp d e1) @ (munch_exp (X.TEMP t1) e2) @
+ [X.CMPL(d, X.TEMP t1), X.SETE(d), X.MOVZBL(d, d)]
+ end
+ | munch_exp d (T.BINOP(T.LE, e1, e2)) =
+ let
+ val t1 = Temp.new ()
+ in
+ (munch_exp d e1) @ (munch_exp (X.TEMP t1) e2) @
+ [X.CMPL(d, X.TEMP t1), X.SETLE(d), X.MOVZBL(d, d)]
+ end
+ | munch_exp d (T.BINOP(T.LT, e1, e2)) =
+ let
+ val t1 = Temp.new ()
+ in
+ (munch_exp d e1) @ (munch_exp (X.TEMP t1) e2) @
+ [X.CMPL(d, X.TEMP t1), X.SETL(d), X.MOVZBL(d, d)]
+ end
+ | munch_exp d (T.BINOP(T.GE, e1, e2)) =
+ let
+ val t1 = Temp.new ()
+ in
+ (munch_exp d e1) @ (munch_exp (X.TEMP t1) e2) @
+ [X.CMPL(d, X.TEMP t1), X.SETGE(d), X.MOVZBL(d, d)]
+ end
+ | munch_exp d (T.BINOP(T.GT, e1, e2)) =
+ let
+ val t1 = Temp.new ()
+ in
+ (munch_exp d e1) @ (munch_exp (X.TEMP t1) e2) @
+ [X.CMPL(d, X.TEMP t1), X.SETG(d), X.MOVZBL(d, d)]
+ end
+ | munch_exp d (T.UNOP(T.NEG, e1)) = (munch_exp d e1) @ [X.NEG d]
+ | munch_exp d (T.UNOP(T.BITNOT, e1)) = (munch_exp d e1) @ [X.NOTL d]
+ | munch_exp d (T.UNOP(T.BANG, e1)) = (munch_exp d e1) @
+ [X.TEST(d,d), X.SETE(d), X.MOVZBL(d, d)]