-(* L1 Compiler
+(* L2 Compiler
* IR Trees
* Author: Kaustuv Chaudhuri <kaustuv+@cs.cmu.edu>
* Modified: Alex Vaynberg <alv@andrew.cmu.edu>
signature TREE =
sig
- datatype binop = ADD | SUB | MUL | DIV | MOD
+ datatype binop = ADD | SUB | MUL | DIV | MOD | LSH | RSH | LOGOR | LOGAND | BITOR | BITAND | BITXOR | NEQ | EQ | LT | GT | LE | GE
+ datatype unop = NEG | BITNOT | BANG
datatype exp =
CONST of Word32.word
| TEMP of Temp.temp
| BINOP of binop * exp * exp
+ | UNOP of unop * exp
and stm =
MOVE of exp * exp
| RETURN of exp
+ | LABEL of Label.label
+ | JUMPIFN of exp * Label.label
+ | JUMP of Label.label
type program = stm list
structure Tree :> TREE =
struct
- datatype binop = ADD | SUB | MUL | DIV | MOD
+ datatype binop = ADD | SUB | MUL | DIV | MOD | LSH | RSH | LOGOR | LOGAND | BITOR | BITAND | BITXOR | NEQ | EQ | LT | GT | LE | GE
+ datatype unop = NEG | BITNOT | BANG
datatype exp =
CONST of Word32.word
| TEMP of Temp.temp
| BINOP of binop * exp * exp
+ | UNOP of unop * exp
and stm =
MOVE of exp * exp
| RETURN of exp
+ | LABEL of Label.label
+ | JUMPIFN of exp * Label.label
+ | JUMP of Label.label
type program = stm list
| pp_binop MUL = "*"
| pp_binop DIV = "/"
| pp_binop MOD = "%"
+ | pp_binop LSH = "<<"
+ | pp_binop RSH = ">>"
+ | pp_binop LOGOR = "||"
+ | pp_binop LOGAND = "&&"
+ | pp_binop BITOR = "|"
+ | pp_binop BITAND = "&"
+ | pp_binop BITXOR = "^"
+ | pp_binop NEQ = "!="
+ | pp_binop EQ = "=="
+ | pp_binop LE = "<="
+ | pp_binop LT = "<"
+ | pp_binop GE = ">="
+ | pp_binop GT = ">"
+
+ fun pp_unop NEG = "-"
+ | pp_unop BITNOT = "~"
+ | pp_unop BANG = "!"
fun pp_exp (CONST(x)) = Word32Signed.toString x
| pp_exp (TEMP(t)) = Temp.name t
| pp_exp (BINOP (binop, e1, e2)) =
"(" ^ pp_exp e1 ^ " " ^ pp_binop binop ^ " " ^ pp_exp e2 ^ ")"
+ | pp_exp (UNOP (unop, e1)) =
+ pp_unop unop ^ "(" ^ pp_exp e1 ^ ")"
fun pp_stm (MOVE (e1,e2)) =
pp_exp e1 ^ " <-- " ^ pp_exp e2
| pp_stm (RETURN e) =
"return " ^ pp_exp e
+ | pp_stm (LABEL l) =
+ Label.name l ^ ":"
+ | pp_stm (JUMP l) =
+ "jump "^Label.name l
+ | pp_stm (JUMPIFN (e, l)) =
+ "jump "^Label.name l^" if! "^pp_exp e
fun pp_program (nil) = ""
| pp_program (stm::stms) = pp_stm stm ^ "\n" ^ pp_program stms