X-Git-Url: http://git.joshuawise.com/snipe.git/blobdiff_plain/12aa4087bee3e70f170d7457794921de4e385227..1144856ba9d6018d9922c6ede7e97779a0fe6373:/trans/tree.sml diff --git a/trans/tree.sml b/trans/tree.sml index 1cfc4eb..d3e8c0d 100644 --- a/trans/tree.sml +++ b/trans/tree.sml @@ -1,24 +1,40 @@ -(* L1 Compiler +(* L3 Compiler * IR Trees * Author: Kaustuv Chaudhuri * Modified: Alex Vaynberg * Modified: Frank Pfenning + * Modified: Joshua Wise + * Modified: Chris Lu *) 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 + + type Blarg = int datatype exp = CONST of Word32.word | TEMP of Temp.temp + | ARG of Blarg * int (* I am j4cbo *) | BINOP of binop * exp * exp + | UNOP of unop * exp + | CALL of Ast.ident * (exp * int) list * int + | MEMORY of exp + | ALLOC of exp and stm = - MOVE of exp * exp - | RETURN of exp + MOVE of exp * exp * int + | RETURN of exp * int + | EFFECT of exp * int + | LABEL of Label.label + | JUMPIFN of exp * Label.label + | JUMP of Label.label + and func = + FUNCTION of Ast.ident * stm list - type program = stm list + type program = func list structure Print : sig @@ -31,38 +47,90 @@ end 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 + + type Blarg = int datatype exp = CONST of Word32.word | TEMP of Temp.temp + | ARG of Blarg * int | BINOP of binop * exp * exp + | UNOP of unop * exp + | CALL of Ast.ident * (exp * int) list * int + | MEMORY of exp + | ALLOC of exp and stm = - MOVE of exp * exp - | RETURN of exp + MOVE of exp * exp * int + | RETURN of exp * int + | EFFECT of exp * int + | LABEL of Label.label + | JUMPIFN of exp * Label.label + | JUMP of Label.label + and func = + FUNCTION of Ast.ident * stm list - type program = stm list + type program = func list structure Print = struct + exception Aaaasssssss + fun pp_binop ADD = "+" | pp_binop SUB = "-" | 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 (ARG(n, sz)) = "arg#"^Int.toString n | 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 ^ ")" + | pp_exp (CALL (f, l, sz)) = + Symbol.name f ^ "(" ^ (String.concatWith ", " (List.map (fn (e, _) => pp_exp e) l)) ^ ")" + | pp_exp (MEMORY exp) = "M[" ^ pp_exp exp ^ "]" + | pp_exp (ALLOC(e)) = "NEW(" ^ pp_exp e ^ ")" - fun pp_stm (MOVE (e1,e2)) = + fun pp_stm (MOVE (e1,e2, sz)) = pp_exp e1 ^ " <-- " ^ pp_exp e2 - | pp_stm (RETURN e) = + | pp_stm (RETURN (e, sz)) = "return " ^ pp_exp e + | pp_stm (EFFECT (e, sz)) = 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 + | pp_program (FUNCTION(id, stms)::funcs) = + (Symbol.name id) ^ + "\n{\n" ^ + (foldr (fn (a,b) => (pp_stm a) ^ "\n" ^ b) "" stms) ^ + "}\n" ^ + pp_program funcs end end