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

SCM Repository

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

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

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

revision 1670, Sun Dec 4 10:45:43 2011 UTC revision 1671, Sun Dec 4 10:56:10 2011 UTC
# Line 59  Line 59 
59              | Ty.TensorTy[n, m] => CL.T_Named(RN.matTy(n,m))              | Ty.TensorTy[n, m] => CL.T_Named(RN.matTy(n,m))
60              | Ty.SeqTy(Ty.IntTy, n) => CL.T_Named(RN.ivecTy n)              | Ty.SeqTy(Ty.IntTy, n) => CL.T_Named(RN.ivecTy n)
61              | Ty.SeqTy(Ty.TensorTy[] , n) => CL.T_Named(RN.vecTy n)              | Ty.SeqTy(Ty.TensorTy[] , n) => CL.T_Named(RN.vecTy n)
62                | Ty.SeqTy(ty, n) => CL.T_Array(trType ty, SOME n)
63              | Ty.AddrTy(ImageInfo.ImgInfo{ty=(_, rTy), ...}) => imageDataPtrTy rTy              | Ty.AddrTy(ImageInfo.ImgInfo{ty=(_, rTy), ...}) => imageDataPtrTy rTy
64              | Ty.ImageTy(ImageInfo.ImgInfo{dim, ...}) => CL.T_Named(RN.imageTy dim)              | Ty.ImageTy(ImageInfo.ImgInfo{dim, ...}) => CL.T_Named(RN.imageTy dim)
65              | _ => raise Fail(concat["TreeToC.trType(", Ty.toString ty, ")"])              | _ => raise Fail(concat["TreeToC.trType(", Ty.toString ty, ")"])
# Line 99  Line 100 
100              | IL.VK_Local => CL.mkVar(lookup(env, x))              | IL.VK_Local => CL.mkVar(lookup(env, x))
101            (* end case *))            (* end case *))
102    
103      (* matrix indexing *)
104        fun matIndex (m, ix, jx) = CL.mkSelect(CL.mkSubscript(m, ix), concat["s",jx])
105    
106    (* translate a state-variable use *)    (* translate a state-variable use *)
107      fun trStateVar (IL.SV{name, ...}) = CL.mkIndirect(CL.mkVar "selfIn", name)      fun trStateVar (IL.SV{name, ...}) = CL.mkIndirect(CL.mkVar "selfIn", name)
108    
# Line 161  Line 165 
165                  in                  in
166                    CL.mkSubscript(vecExp, ix)                    CL.mkSubscript(vecExp, ix)
167                  end                  end
168                | (Op.Subscript(Ty.SeqTy(ty, n)), [v, ix]) => CL.mkSubscript(v, ix)
169              | (Op.Subscript(Ty.TensorTy[n]), [v, CL.E_Int(ix, _)]) => vecIndex (v, Int.fromLarge ix)              | (Op.Subscript(Ty.TensorTy[n]), [v, CL.E_Int(ix, _)]) => vecIndex (v, Int.fromLarge ix)
170              | (Op.Subscript(Ty.TensorTy[n]), [v, ix]) => let              | (Op.Subscript(Ty.TensorTy[n]), [v, ix]) => let
171                  val unionTy = CL.T_Named(concat["union", Int.toString n, !RN.gRealSuffix, "_t"])                  val unionTy = CL.T_Named(concat["union", Int.toString n, !RN.gRealSuffix, "_t"])
# Line 234  Line 239 
239    
240      and trExps (env, exps) = List.map (fn exp => trExp(env, exp)) exps      and trExps (env, exps) = List.map (fn exp => trExp(env, exp)) exps
241    
242      (* translate an expression to a variable form; return the variable and the
243       * (optional) declaration.
244       *)
245        fun expToVar (env, ty, name, exp) = (case trExp(env, exp)
246               of x as CL.E_Var _ => (x, [])
247                | exp => let
248                    val x = freshVar name
249                    in
250                      (CL.mkVar x, [CL.mkDecl(ty, x, SOME(CL.I_Exp exp))])
251                    end
252              (* end case *))
253    
254      fun trLHSVar (env, lhs) = (case V.kind lhs      fun trLHSVar (env, lhs) = (case V.kind lhs
255             of IL.VK_Global => CL.mkIndirect(CL.mkVar RN.globalsVarName, lookup(env, lhs))             of IL.VK_Global => CL.mkIndirect(CL.mkVar RN.globalsVarName, lookup(env, lhs))
256              | IL.VK_Local => CL.mkVar(lookup(env, lhs))              | IL.VK_Local => CL.mkVar(lookup(env, lhs))
# Line 280  Line 297 
297                        CL.mkApply(RN.mkVec n, List.tabulate (n, mkLoad)))                        CL.mkApply(RN.mkVec n, List.tabulate (n, mkLoad)))
298                      ] end                      ] end
299                  else [CL.mkAssign(lhs, trExp(env, rhs))]                  else [CL.mkAssign(lhs, trExp(env, rhs))]
300                | IL.E_Op(Op.EigenVals2x2, [m]) => let
301                    val (m, stms) = expToVar (env, CL.T_Named(RN.matTy(2,2)), "m", m)
302                    in
303                      stms @ [CL.mkCall(RN.evals2x2, [
304                          CL.mkUnOp(CL.%&,lhs),
305                          matIndex (m, CL.mkInt 0,  "0"),
306                          matIndex (m, CL.mkInt 0, "1"),
307                          matIndex (m, CL.mkInt 1, "1")
308                        ])]
309                    end
310                | IL.E_Op(Op.EigenVals3x3, [m]) => let
311                    val (m, stms) = expToVar (env, CL.T_Named(RN.matTy(3,3)), "m", m)
312                    in
313                      stms @ [CL.mkCall(RN.evals3x3, [
314                          CL.mkUnOp(CL.%&,lhs),
315                          matIndex (m, CL.mkInt 0, "0"),
316                          matIndex (m, CL.mkInt 0, "1"),
317                          matIndex (m, CL.mkInt 0, "2"),
318                          matIndex (m, CL.mkInt 1, "1"),
319                          matIndex (m, CL.mkInt 1, "2"),
320                          matIndex (m, CL.mkInt 2, "2")
321                        ])]
322                    end
323    
324              | IL.E_Cons(Ty.TensorTy[n,m], args) => let              | IL.E_Cons(Ty.TensorTy[n,m], args) => let
325                (* matrices are represented as arrays of union<d><ty>_t vectors *)                (* matrices are represented as arrays of union<d><ty>_t vectors *)
326                  fun doRows (_, []) = []                  fun doRows (_, []) = []
# Line 298  Line 339 
339    
340      fun trAssign (env, lhs, rhs) = trSet (env, trLHSVar (env, lhs), rhs)      fun trAssign (env, lhs, rhs) = trSet (env, trLHSVar (env, lhs), rhs)
341    
342        fun trMultiAssign (env, lhs, IL.E_Op(rator, args)) = (case (lhs, rator, args)
343               of ([vals, vecs], Op.EigenVecs2x2, [m]) => let
344                    val (m, stms) = expToVar (env, CL.T_Named(RN.matTy(2,2)), "m", m)
345                    in
346                      stms @ [CL.mkCall(RN.evecs2x2, [
347                          CL.mkUnOp(CL.%&,vals), vecs,
348                          matIndex (m, CL.mkInt 0, "0"),
349                          matIndex (m, CL.mkInt 0, "1"),
350                          matIndex (m, CL.mkInt 1, "1")
351                        ])]
352                    end
353                | ([vals, vecs], Op.EigenVecs3x3, [m]) => let
354                    val (m, stms) = expToVar (env, CL.T_Named(RN.matTy(3,3)), "m", m)
355                    in
356                      stms @ [CL.mkCall(RN.evecs3x3, [
357                          CL.mkUnOp(CL.%&,vals), vecs,
358                          matIndex (m, CL.mkInt 0, "0"),
359                          matIndex (m, CL.mkInt 0, "1"),
360                          matIndex (m, CL.mkInt 0, "2"),
361                          matIndex (m, CL.mkInt 1, "1"),
362                          matIndex (m, CL.mkInt 1, "2"),
363                          matIndex (m, CL.mkInt 2, "2")
364                        ])]
365                    end
366                | _ => raise Fail "bogus multi-assignment"
367              (* end case *))
368          | trMultiAssign (env, lhs, rhs) = raise Fail "bogus multi-assignment"
369    
370      fun trLocals (env : env, locals) =      fun trLocals (env : env, locals) =
371            List.foldl            List.foldl
372              (fn (x, env) => V.Map.insert(env, x, V(trType(V.ty x), V.name x)))              (fn (x, env) => V.Map.insert(env, x, V(trType(V.ty x), V.name x)))
# Line 317  Line 386 
386            fun trStmt (env, stm) = (case stm            fun trStmt (env, stm) = (case stm
387               of IL.S_Comment text => [CL.mkComment text]               of IL.S_Comment text => [CL.mkComment text]
388                | IL.S_Assign([x], exp) => trAssign (env, x, exp)                | IL.S_Assign([x], exp) => trAssign (env, x, exp)
389                  | IL.S_Assign(xs, exp) =>
390                          trMultiAssign (env, List.map (fn x => trVar (env, x)) xs, exp)
391                | IL.S_IfThen(cond, thenBlk) =>                | IL.S_IfThen(cond, thenBlk) =>
392                    [CL.mkIfThen(trExp(env, cond), trBlk(env, thenBlk))]                    [CL.mkIfThen(trExp(env, cond), trBlk(env, thenBlk))]
393                | IL.S_IfThenElse(cond, thenBlk, elseBlk) =>                | IL.S_IfThenElse(cond, thenBlk, elseBlk) =>
# Line 348  Line 419 
419                        CL.mkDecl(                        CL.mkDecl(
420                          CL.T_Named RN.statusTy, sts,                          CL.T_Named RN.statusTy, sts,
421                          SOME(CL.I_Exp(CL.E_Apply(inputFn, [                          SOME(CL.I_Exp(CL.E_Apply(inputFn, [
422                          CL.E_Str name, CL.mkUnOp(CL.%&, CL.mkIndirect(CL.mkVar (RN.globalsVarName), lhs)), CL.mkBool hasDflt                              CL.mkStr name,
423                                CL.mkUnOp(CL.%&, CL.mkIndirect(CL.mkVar RN.globalsVarName, lhs)),
424                                CL.mkBool hasDflt
425                        ]))))                        ]))))
426                      ]                      ]
427                    in                    in

Legend:
Removed from v.1670  
changed lines
  Added in v.1671

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