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

SCM Repository

[diderot] Diff of /branches/pure-cfg/src/compiler/cl-target/tree-to-cl.sml
ViewVC logotype

Diff of /branches/pure-cfg/src/compiler/cl-target/tree-to-cl.sml

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

revision 1272, Mon Jun 6 09:19:11 2011 UTC revision 1273, Mon Jun 6 10:46:20 2011 UTC
# Line 22  Line 22 
22    
23      val trExp : env * TreeIL.exp -> CLang.exp      val trExp : env * TreeIL.exp -> CLang.exp
24    
25    (* vector indexing support.  Arguments are: vector, arity, index *)    (* vector indexing support.  Arguments are: vector, index *)
26      val ivecIndex : CLang.exp * int * int -> CLang.exp      val vecIndex : CLang.exp * int -> CLang.exp
     val vecIndex : CLang.exp * int * int -> CLang.exp  
27    
28    end = struct    end = struct
29    
# Line 94  Line 93 
93            end            end
94      end (* local *)      end (* local *)
95    
96    (* vector indexing support.  Arguments are: vector, arity, index *)    (* vector indexing support.  Arguments are: vector, index *)
97      fun ivecIndex (v, n, ix) = let      local
98            val unionTy = CL.T_Named(concat["union", Int.toString n, !RN.gIntSuffix, "_t"])        val fields = Vector.fromList [
99            val e1 = CL.mkCast(unionTy, v)                "s0", "s1", "s2", "s3",
100            val e2 = CL.mkSelect(e1, "i")                "s4", "s5", "s6", "s7",
101            in                "s8", "s9", "sa", "sb",
102              CL.mkSubscript(e2, intExp ix)                "sc", "sd", "se", "sf"
103            end              ]
   
     fun vecIndex (v, n, ix) = let  
           val unionTy = CL.T_Named(concat["union", Int.toString n, !RN.gRealSuffix, "_t"])  
           val e1 = CL.mkCast(unionTy, v)  
           val e2 = CL.mkSelect(e1, "r")  
104            in            in
105              CL.mkSubscript(e2, intExp ix)      fun vecIndex (v, ix) = CL.mkSelect(v, Vector.sub(fields, ix))
106            end            end
107    
108    (* translate a variable use *)    (* translate a variable use *)
# Line 120  Line 114 
114    
115    (* Translate a TreeIL operator application to a CLang expression *)    (* Translate a TreeIL operator application to a CLang expression *)
116      fun trOp (rator, args) = (case (rator, args)      fun trOp (rator, args) = (case (rator, args)
117             of (Op.Add ty, [a, b]) =>             of (Op.Add ty, [a, b]) => CL.mkBinOp(a, CL.#+, b)
118                  CL.mkBinOp(a, CL.#+, b)              | (Op.Sub ty, [a, b]) => CL.mkBinOp(a, CL.#-, b)
119              | (Op.Sub ty, [a, b]) =>              | (Op.Mul ty, [a, b]) => CL.mkBinOp(a, CL.#*, b)
120                  CL.mkBinOp(a, CL.#-, b)              | (Op.Div ty, [a, b]) => CL.mkBinOp(a, CL.#/, b)
121              | (Op.Mul ty, [a, b]) =>              | (Op.Neg ty, [a]) => CL.mkUnOp(CL.%-, a)
122                  CL.mkBinOp(a, CL.#*, b)              | (Op.Abs(Ty.IVecTy 1), args) => CL.mkApply("abs", args)
123              | (Op.Div ty, [a, b]) =>              | (Op.Abs(Ty.TensorTy[]), args) => CL.mkApply(RN.fabs, args)
124                  CL.mkBinOp(a, CL.#/, b)              | (Op.Abs(Ty.TensorTy[_]), args) => CL.mkApply(RN.fabs, args)
125              | (Op.Neg ty, [a]) =>              | (Op.Abs ty, [a]) => raise Fail(concat["Abs<", Ty.toString ty, ">"])
126                  CL.mkUnOp(CL.%-, a)              | (Op.LT ty, [a, b]) => CL.mkBinOp(a, CL.#<, b)
127              | (Op.Abs(Ty.IVecTy 1), args) =>              | (Op.LTE ty, [a, b]) => CL.mkBinOp(a, CL.#<=, b)
128                  CL.mkApply("abs", args)              | (Op.EQ ty, [a, b]) => CL.mkBinOp(a, CL.#==, b)
129              | (Op.Abs(Ty.TensorTy[]), args) =>              | (Op.NEQ ty, [a, b]) => CL.mkBinOp(a, CL.#!=, b)
130                  CL.mkApply(RN.fabs(), args)              | (Op.GTE ty, [a, b]) => CL.mkBinOp(a, CL.#>=, b)
131              | (Op.Abs ty, [a]) =>              | (Op.GT ty, [a, b]) => CL.mkBinOp(a, CL.#>, b)
132                  raise Fail(concat["Abs<", Ty.toString ty, ">"])              | (Op.Not, [a]) => CL.mkUnOp(CL.%!, a)
133              | (Op.LT ty, [a, b]) =>              | (Op.Max, args) => CL.mkApply(RN.max, args)
134                  CL.mkBinOp(a, CL.#<, b)              | (Op.Min, args) => CL.mkApply(RN.min, args)
             | (Op.LTE ty, [a, b]) =>  
                 CL.mkBinOp(a, CL.#<=, b)  
             | (Op.EQ ty, [a, b]) =>  
                 CL.mkBinOp(a, CL.#==, b)  
             | (Op.NEQ ty, [a, b]) =>  
                 CL.mkBinOp(a, CL.#!=, b)  
             | (Op.GTE ty, [a, b]) =>  
                 CL.mkBinOp(a, CL.#>=, b)  
             | (Op.GT ty, [a, b]) =>  
                 CL.mkBinOp(a, CL.#>, b)  
             | (Op.Not, [a]) =>  
                 CL.mkUnOp(CL.%!, a)  
             | (Op.Max, args) =>  
                 CL.mkApply(RN.max(), args)  
             | (Op.Min, args) =>  
                 CL.mkApply(RN.min(), args)  
135              | (Op.Lerp ty, args) => (case ty              | (Op.Lerp ty, args) => (case ty
136                   of Ty.TensorTy[] => CL.mkApply(RN.lerp 1, args)                   of Ty.TensorTy[] => CL.mkApply(RN.lerp, args)
137                    | Ty.TensorTy[n] => CL.mkApply(RN.lerp n, args)                    | Ty.TensorTy[n] => CL.mkApply(RN.lerp, args)
138                    | _ => raise Fail(concat[                    | _ => raise Fail(concat[
139                          "lerp<", Ty.toString ty, "> not supported"                          "lerp<", Ty.toString ty, "> not supported"
140                        ])                        ])
141                  (* end case *))                  (* end case *))
142              | (Op.Dot d, args) =>              | (Op.Dot d, args) => CL.E_Apply(RN.dot, args)
                 CL.E_Apply(RN.dot d, args)  
143              | (Op.MulVecMat(m, n), args) =>              | (Op.MulVecMat(m, n), args) =>
144                  if (1 < m) andalso (m < 4) andalso (m = n)                  if (1 < m) andalso (m < 4) andalso (m = n)
145                    then CL.E_Apply(RN.mulVecMat(m,n), args)                    then CL.E_Apply(RN.mulVecMat(m,n), args)
# Line 175  Line 152 
152                  if (1 < m) andalso (m < 4) andalso (m = n) andalso (n = p)                  if (1 < m) andalso (m < 4) andalso (m = n) andalso (n = p)
153                    then CL.E_Apply(RN.mulMatMat(m,n,p), args)                    then CL.E_Apply(RN.mulMatMat(m,n,p), args)
154                    else raise Fail "unsupported matrix-matrix multiply"                    else raise Fail "unsupported matrix-matrix multiply"
155              | (Op.Cross, args) =>              | (Op.Cross, args) => CL.E_Apply(RN.cross, args)
156                  CL.E_Apply(RN.cross(), args)              | (Op.Select(Ty.IVecTy n, i), [a]) => vecIndex (a, i)
157              | (Op.Select(Ty.IVecTy n, i), [a]) =>              | (Op.Select(Ty.TensorTy[n], i), [a]) => vecIndex (a, i)
158                  ivecIndex (a, n, i)              | (Op.Norm(Ty.TensorTy[n]), args) => CL.E_Apply(RN.length, args)
159              | (Op.Select(Ty.TensorTy[n], i), [a]) =>              | (Op.Norm(Ty.TensorTy[m,n]), args) => CL.E_Apply(RN.norm(m,n), args)
160                  vecIndex (a, n, i)              | (Op.Normalize d, args) => CL.E_Apply(RN.normalize, args)
161              | (Op.Norm(Ty.TensorTy[n]), args) =>              | (Op.Trace n, args) => CL.E_Apply(RN.trace n, args)
162                  CL.E_Apply(RN.length n, args)              | (Op.Scale(Ty.TensorTy[n]), [s, v]) => CL.mkBinOp(s, CL.#*, v)
163              | (Op.Norm(Ty.TensorTy[m,n]), args) =>              | (Op.CL, _) => raise Fail "CL unimplemented"
164                  CL.E_Apply(RN.norm(m,n), args)              | (Op.PrincipleEvec ty, _) => raise Fail "PrincipleEvec unimplemented"
165              | (Op.Normalize d, args) =>  (*
                 CL.E_Apply(RN.normalize d, args)  
             | (Op.Trace n, args) =>  
                 CL.E_Apply(RN.trace n, args)  
             | (Op.Scale(Ty.TensorTy[n]), args) =>  
                 CL.E_Apply(RN.scale n, args)  
             | (Op.CL, _) =>  
                 raise Fail "CL unimplemented"  
             | (Op.PrincipleEvec ty, _) =>  
                 raise Fail "PrincipleEvec unimplemented"  
166              | (Op.Subscript(Ty.IVecTy n), [v, ix]) => let              | (Op.Subscript(Ty.IVecTy n), [v, ix]) => let
167                  val unionTy = CL.T_Named(concat["union", Int.toString n, !RN.gIntSuffix, "_t"])                  val unionTy = CL.T_Named(concat["union", Int.toString n, !RN.gIntSuffix, "_t"])
168                  val vecExp = CL.mkSelect(CL.mkCast(unionTy, v), "i")                  val vecExp = CL.mkSelect(CL.mkCast(unionTy, v), "i")
# Line 209  Line 177 
177                  end                  end
178              | (Op.Subscript(Ty.TensorTy[_,_]), [m, ix, jx]) =>              | (Op.Subscript(Ty.TensorTy[_,_]), [m, ix, jx]) =>
179                  CL.mkSubscript(CL.mkSelect(CL.mkSubscript(m, ix), "r"), jx)                  CL.mkSubscript(CL.mkSelect(CL.mkSubscript(m, ix), "r"), jx)
180    *)
181              | (Op.Subscript ty, t::(ixs as _::_)) =>              | (Op.Subscript ty, t::(ixs as _::_)) =>
182                  raise Fail(concat["Subscript<", Ty.toString ty, "> unsupported"])                  raise Fail(concat["Subscript<", Ty.toString ty, "> unsupported"])
183              | (Op.Ceiling d, args) =>              | (Op.Ceiling d, args) => CL.mkApply("ceil", args)
184                  CL.mkApply(RN.addTySuffix("ceil", d), args)              | (Op.Floor d, args) => CL.mkApply("floor", args)
185              | (Op.Floor d, args) =>              | (Op.Round d, args) => CL.mkApply("round", args)
186                  CL.mkApply(RN.addTySuffix("floor", d), args)              | (Op.Trunc d, args) => CL.mkApply("trunc", args)
187              | (Op.Round d, args) =>              | (Op.IntToReal, [a]) => CL.mkCast(!RN.gRealTy, a)
188                  CL.mkApply(RN.addTySuffix("round", d), args)              | (Op.RealToInt 1, [a]) => CL.mkCast(!RN.gIntTy, a)
             | (Op.Trunc d, args) =>  
                 CL.mkApply(RN.addTySuffix("trunc", d), args)  
             | (Op.IntToReal, [a]) =>  
                 CL.mkCast(!RN.gRealTy, a)  
             | (Op.RealToInt 1, [a]) =>  
                 CL.mkCast(!RN.gIntTy, a)  
189              | (Op.RealToInt d, args) =>              | (Op.RealToInt d, args) =>
190                  CL.mkApply(RN.vecftoi d, args)                  CL.mkApply(RN.vecftoi d, args)
191  (* FIXME: need type info *)  (* FIXME: need type info *)

Legend:
Removed from v.1272  
changed lines
  Added in v.1273

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