Home My Page Projects Code Snippets Project Openings diderot
Summary Activity Tracker Tasks SCM

SCM Repository

[diderot] Diff of /branches/pure-cfg/src/compiler/codegen/codegen-fn.sml
ViewVC logotype

Diff of /branches/pure-cfg/src/compiler/codegen/codegen-fn.sml

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 530, Mon Feb 14 16:34:57 2011 UTC revision 531, Mon Feb 14 17:45:57 2011 UTC
# Line 14  Line 14 
14    
15    end = struct    end = struct
16    
17      structure IL = LowIL      structure Ty = TreeIL.Ty
     structure Ty = LowILTypes  
     structure V = LowIL.Var  
     structure Op = LowOps  
     structure Nd = LowIL.Node  
     structure CFG = LowIL.CFG  
18    
19    (* convert LowIL types to T types *)    (* convert LowIL types to T types *)
20      fun cvtTy ty = (case ty      fun cvtTy ty = (case ty
# Line 33  Line 28 
28              | Ty.ImageTy =>  raise Fail "FIXME: ImageTy"              | Ty.ImageTy =>  raise Fail "FIXME: ImageTy"
29            (* end case *))            (* end case *))
30    
31    (* a flag to mark global IL variables, since they need to be treated differently *)  (*
     local  
       val {getFn, setFn} = V.newFlag ()  
     in  
     val isGlobal = getFn  
     fun markGlobal x = setFn(x, true)  
     end  
   
   (* a mapping from LowIL variables to target expressions.  Variables get  
    * removed when the expressions are used as arguments.  
    *)  
     structure VDefTbl : sig  
         type tbl  
   
         val newTbl : T.program -> tbl  
         val getDefOf : tbl -> IL.var -> T.exp  
         val useDefOf : tbl -> IL.var -> T.exp  
         val setDefOf : tbl -> (IL.var * T.exp) -> unit  
   
         val clear : tbl -> unit  
   
         val assign : tbl -> (IL.var * T.exp) -> T.stm list  
         val bind : tbl -> (IL.var * T.exp) -> T.stm list  
   
       (* force all pending expressions into variables *)  
         val flush : tbl -> T.stm list  
   
       end = struct  
   
         type info = {  
             cnt : int ref,      (* count of oustanding uses (usually 1) *)  
             bind : T.exp  
           }  
   
         datatype tbl = VT of  
             prog : T.program,  
             defs : info V.Tbl.hash_table  
           }  
   
         fun newTbl prog = VT{  
                 prog = prog,  
                 defs = V.Tbl.mkTable (512, Fail "vtbl")  
               }  
   
         fun getDefOf (VT{defs, ...}) x = (case V.Tbl.find defs x  
                of NONE => raise Fail(concat["getDefOf(", V.toString x, ")"])  
                 | SOME{bind, cnt} => bind  
               (* end case *))  
   
         fun useDefOf (VT{defs, ...}) x = (case V.Tbl.find defs x  
                of NONE => raise Fail(concat["useDefOf(", V.toString x, ")"])  
                 | SOME{cnt=ref 1, bind} => (  
                     ignore (V.Tbl.remove defs x);  
                     bind)  
                 | SOME{cnt, bind} => (  
                     cnt := !cnt - 1;  
                     bind)  
               (* end case *))  
   
         fun defineGlobal ((VT{prog, defs}), x, rhs) = let  
               val x' = T.Var.global (prog, cvtTy(V.ty x), V.name x)  
               in  
   
         fun setDefOf tbl (x, exp) =  
               V.Tbl.insert tbl (x, {cnt = ref(V.useCount x), bind = exp})  
   
         fun assign tbl (x, exp) = let  
                     val lhs = T.Var.tmp(cvtTy(V.ty x))  
                     in  
                       V.Tbl.insert tbl  
                         (x, {cnt = ref(V.useCount x), bind = T.Expr.var lhs});  
                       [T.Stmt.assign(lhs, exp)]  
                     end  
   
         fun bind tbl (x, exp) = if isGlobal x  
               then  
               else (case V.useCount x  
                  of 1 => (V.Tbl.insert tbl (x, {cnt = ref 1, bind = exp}); [])  
                   | n => let (* bind exp to a new target variable *)  
                       val lhs = T.Var.tmp(cvtTy(V.ty x))  
                       in  
                         V.Tbl.insert tbl (x, {cnt = ref n, bind = T.Expr.var lhs});  
                         [T.Stmt.assign(lhs, exp)]  
                       end  
                 (* end case *))  
   
         val clear = V.Tbl.clear  
   
         fun flush tbl = raise Fail "flush"  
   
       end (*  VDefTbl *)  
   
32  (* FIXME: what about splitting code where the target width doesn't match the  (* FIXME: what about splitting code where the target width doesn't match the
33   * source width?   * source width?
34   *)   *)
# Line 251  Line 155 
155              List.app markGlobal globals;              List.app markGlobal globals;
156              gen (vtbl, globalInit)              gen (vtbl, globalInit)
157            end            end
158    *)
159    
160      fun generate (fileStem, IL.Program{globals, globalInit, strands}) = let      fun generate (fileStem, srcProg) = let
161              val TreeIL.Program{globals, globalInit, strands} = LowToTree.translate srcProg
162            val prog = T.newProgram ()            val prog = T.newProgram ()
           val vtbl = VDefTbl.newTbl prog  
163            in            in
             genGlobals (vtbl, prog, globals, globalInit);  
164            (* output the program *)            (* output the program *)
165              T.generate (fileStem, prog)              T.generate (fileStem, prog)
166            end            end

Legend:
Removed from v.530  
changed lines
  Added in v.531

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0