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

SCM Repository

[diderot] Diff of /branches/vis15/src/compiler/low-to-tree/low-to-tree.sml
ViewVC logotype

Diff of /branches/vis15/src/compiler/low-to-tree/low-to-tree.sml

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

revision 4045, Sun Jun 26 14:54:01 2016 UTC revision 4077, Tue Jun 28 14:56:14 2016 UTC
# Line 123  Line 123 
123              | _ => e              | _ => e
124           (* end case *))           (* end case *))
125    
126      (* turn an expression of type TensorRefTy to one of TensorRef *)
127        fun mkDeref e = (case TreeTypeOf.exp e
128               of TTy.TensorRefTy(shp as _::_) => T.E_Op(TOp.TensorCopy shp, [e])
129                | _ => e
130             (* end case *))
131    
132      fun cvtScalarTy Ty.BoolTy = TTy.BoolTy      fun cvtScalarTy Ty.BoolTy = TTy.BoolTy
133        | cvtScalarTy Ty.IntTy = TTy.IntTy        | cvtScalarTy Ty.IntTy = TTy.IntTy
134        | cvtScalarTy (Ty.TensorTy[]) = TTy.realTy        | cvtScalarTy (Ty.TensorTy[]) = TTy.realTy
# Line 257  Line 263 
263                  in                  in
264                    (Env.TREE(T.E_Op(rator, args)), stms)                    (Env.TREE(T.E_Op(rator, args)), stms)
265                  end                  end
266              fun bindTREE' rator = let
267                    val (args, stms) = singleArgs (env, args)
268                    in
269                      (Env.TREE(T.E_Op(rator, args)), stms)
270                    end
271            fun bindRHS (ty, rator) = let            fun bindRHS (ty, rator) = let
272                  val (args, stms) = simpleArgs (env, args)                  val (args, stms) = simpleArgs (env, args)
273                  in                  in
# Line 264  Line 275 
275                  end                  end
276            fun bindVOp rator = let            fun bindVOp rator = let
277                  val (layout, argss, stms) = vectorArgs (env, args)                  val (layout, argss, stms) = vectorArgs (env, args)
278                  fun mkArgs (_, [], []) = []                  fun mkArgs (w, [p], [args]) = [T.E_Op(rator(w, p), args)]
279                    | mkArgs (w, p::ps, args::argss) =                    | mkArgs (w, p::ps, args::argss) =
280                        T.E_Op(rator(w, p), args) :: mkArgs (w-p, ps, argss)                        T.E_Op(rator(p, p), args) :: mkArgs (w-p, ps, argss)
281                      | mkArgs _ = raise Fail "bindVOp: arity mismatch"
282                  val exps = mkArgs (#wid layout, #pieces layout, argss)                  val exps = mkArgs (#wid layout, #pieces layout, argss)
283                  in                  in
284                    (Env.VEC(layout, exps), stms)                    (Env.VEC(layout, exps), stms)
# Line 323  Line 335 
335                    in                    in
336                      (Env.TREE(List.foldr (fn (e, es) => T.E_Op(TOp.RAdd, [e, es])) e es), stms)                      (Env.TREE(List.foldr (fn (e, es) => T.E_Op(TOp.RAdd, [e, es])) e es), stms)
337                    end                    end
338                  | Op.VDot _ => let
339                      val (layout, argss, stms) = vectorArgs (env, args)
340                      fun mkArgs (w, [p], [args]) = [T.E_Op(TOp.VDot(w, p), args)]
341                        | mkArgs (w, p::ps, args::argss) =
342                            T.E_Op(TOp.VDot(p, p), args) :: mkArgs (w-p, ps, argss)
343                        | mkArgs _ = raise Fail "VDot: arity mismatch"
344                      val e::es = mkArgs (#wid layout, #pieces layout, argss)
345                      in
346                        (Env.TREE(List.foldr (fn (e, es) => T.E_Op(TOp.RAdd, [e, es])) e es), stms)
347                      end
348                | Op.VIndex(_, i) => let                | Op.VIndex(_, i) => let
349                    val [v] = args                    val [v] = args
350                    val ({wid, pieces, ...}, es, stms) = vectorArg (env, v)                    val ({wid, pieces, ...}, es, stms) = vectorArg (env, v)
# Line 347  Line 369 
369                      (Env.VEC(layout, exps), List.rev stms)                      (Env.VEC(layout, exps), List.rev stms)
370                    end                    end
371                | Op.VMapClamp n => bindVOp TOp.VMapClamp                | Op.VMapClamp n => bindVOp TOp.VMapClamp
372                | Op.VLerp n => bindVOp TOp.VLerp                | Op.VLerp n => let
373                      val [u, v, t] = args
374                      val (layout, us, stms1) = vectorArg (env, u)
375                      val (_, vs, stms2) = vectorArg (env, v)
376                      val (t, stms) = simpleArg env (t, stms2 @ stms1)
377                      val exps = let
378                            fun mkArgs (w, [p], [u], [v]) = [T.E_Op(TOp.VLerp(w, p), [u, v, t])]
379                              | mkArgs (w, p::ps, u::ur, v::vr) =
380                                  T.E_Op(TOp.VLerp(p, p), [u, v, t]) :: mkArgs (w-p, ps, ur, vr)
381                              | mkArgs _ = raise Fail "VLerp: arity mismatch"
382                            in
383                              mkArgs (#wid layout, #pieces layout, us, vs)
384                            end
385                      in
386                        (Env.VEC(layout, exps), stms)
387                      end
388                | Op.TensorIndex(ty, idxs) => let                | Op.TensorIndex(ty, idxs) => let
389                    val ([arg], stms) = simpleArgs (env, args)                    val ([arg], stms) = simpleArgs (env, args)
390                    val ty = TreeTypeOf.exp arg                    val ty = TreeTypeOf.exp arg
# Line 363  Line 400 
400                | Op.Select(ty, i) => bindTREE (TOp.Select(U.trType ty, i))                | Op.Select(ty, i) => bindTREE (TOp.Select(U.trType ty, i))
401                | Op.Subscript ty => bindTREE (TOp.Subscript(U.trType ty))                | Op.Subscript ty => bindTREE (TOp.Subscript(U.trType ty))
402                | Op.MkDynamic(ty, n) => bindTREE (TOp.MkDynamic(U.trType ty, n))                | Op.MkDynamic(ty, n) => bindTREE (TOp.MkDynamic(U.trType ty, n))
403                | Op.Append ty => bindTREE (TOp.Append(U.trType ty))                | Op.Append ty => bindTREE' (TOp.Append(U.trType ty))
404                | Op.Prepend ty => bindTREE (TOp.Prepend(U.trType ty))                | Op.Prepend ty => bindTREE' (TOp.Prepend(U.trType ty))
405                | Op.Concat ty => bindTREE (TOp.Concat(U.trType ty))                | Op.Concat ty => bindTREE (TOp.Concat(U.trType ty))
406                | Op.Range => bindTREE TOp.Range                | Op.Range => bindTREE TOp.Range
407                | Op.Length ty => bindTREE (TOp.Length(U.trType ty))                | Op.Length ty => bindTREE (TOp.Length(U.trType ty))
408                | Op.SphereQuery(ty1, ty2) => bindTREE (TOp.SphereQuery(U.trType ty1, U.trType ty2))                | Op.SphereQuery(ty1, ty2) => bindTREE' (TOp.SphereQuery(U.trType ty1, U.trType ty2))
409                | Op.Sqrt => bindTREE TOp.Sqrt                | Op.Sqrt => bindTREE TOp.Sqrt
410                | Op.Cos => bindTREE TOp.Cos                | Op.Cos => bindTREE TOp.Cos
411                | Op.ArcCos => bindTREE TOp.ArcCos                | Op.ArcCos => bindTREE TOp.ArcCos
# Line 567  Line 604 
604                | IR.SEQ(args, ty) => let                | IR.SEQ(args, ty) => let
605                    val (es, stms) = singleArgs (env, args)                    val (es, stms) = singleArgs (env, args)
606                    val ty = U.trType ty                    val ty = U.trType ty
607                    (* if we are dealing with a sequence of tensors, then we need to copy references *)
608                      val es = (case ty
609                             of TTy.SeqTy(TTy.TensorTy _, _) => List.map mkDeref es
610                              | _ => es
611                            (* end case *))
612                    in                    in
613                      Env.bindVar (env, getLHS (), Env.RHS(ty, T.E_Seq(es, ty)));                      Env.bindVar (env, getLHS (), Env.RHS(ty, T.E_Seq(es, ty)));
614                      stms                      stms

Legend:
Removed from v.4045  
changed lines
  Added in v.4077

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