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 3879, Thu May 19 16:03:34 2016 UTC revision 3880, Thu May 19 18:49:42 2016 UTC
# Line 181  Line 181 
181            fun bindOp rator = Env.TREE(T.E_Op(rator, List.map (scalarArg env) args))            fun bindOp rator = Env.TREE(T.E_Op(rator, List.map (scalarArg env) args))
182            fun bindVOp rator = let            fun bindVOp rator = let
183                  val (layout, argss) = vectorArgs (env, args)                  val (layout, argss) = vectorArgs (env, args)
184                  val exps = ListPair.map                  fun mkArgs (_, [], []) = []
185                        (fn (w, args) => T.E_Op(rator w, args))                    | mkArgs (w, p::ps, args::argss) =
186                          (#pieces layout, argss)                        T.E_Op(rator(w, p), args) :: mkArgs (w-p, ps, argss)
187                    val exps = mkArgs (#wid layout, #pieces layout, argss)
188                  in                  in
189                    Env.VEC(layout, exps)                    Env.VEC(layout, exps)
190                  end                  end
191              fun mkArgs f ({wid, pieces, ...} : TTy.vec_layout, args) = let
192                    fun mk (w, [p], [x]) = [T.E_Op(f(w, p, x))]
193                      | mk (w, p::ps, x::xs) = T.E_Op(f(p, p, x)) :: mk (w-p, ps, xs)
194                      | mk _ = raise Fail "mkArgs: arity mismatch"
195                    in
196                      mk (wid, pieces, args)
197                    end
198            in            in
199              case srcRator              case srcRator
200               of Op.IAdd => bindOp TOp.IAdd               of Op.IAdd => bindOp TOp.IAdd
# Line 219  Line 227 
227                    val [s, v] = args                    val [s, v] = args
228                    val s = scalarArg env s                    val s = scalarArg env s
229                    val (layout, vs) = vectorArg (env, v)                    val (layout, vs) = vectorArg (env, v)
230                    val exps = ListPair.map                    val exps = mkArgs (fn (w, p, x) => (TOp.VScale(w, p), [s, x])) (layout, vs)
                       (fn (w, x) => T.E_Op(TOp.VScale w, [s, x]))  
                         (#pieces layout, vs)  
231                    in                    in
232                      Env.VEC(layout, exps)                      Env.VEC(layout, exps)
233                    end                    end
# Line 229  Line 235 
235                | Op.VNeg _ => bindVOp TOp.VNeg                | Op.VNeg _ => bindVOp TOp.VNeg
236                | Op.VSum _ => let                | Op.VSum _ => let
237                    val [v] = args                    val [v] = args
238                    val ({pieces, ...}, es) = vectorArg (env, v)                    val e::es = mkArgs (fn (w, p, x) => (TOp.VSum(w, p), [x])) (vectorArg (env, v))
                   val e::es = ListPair.map (fn (w, v) => T.E_Op(TOp.VSum w, [v])) (pieces, es)  
239                    in                    in
240                      Env.TREE(List.foldr (fn (e, es) => T.E_Op(TOp.RAdd, [e, es])) e es)                      Env.TREE(List.foldr (fn (e, es) => T.E_Op(TOp.RAdd, [e, es])) e es)
241                    end                    end
242                | Op.VIndex(_, i) => let                | Op.VIndex(_, i) => let
243                    val [v] = args                    val [v] = args
244  (* FIXME: more efficient to lookup the variable and avoid expanding TREE args *)  (* FIXME: more efficient to lookup the variable and avoid expanding TREE args *)
245                    val ({pieces, ...}, es) = vectorArg (env, v)                    val ({wid, pieces, ...}, es) = vectorArg (env, v)
246                    fun select (i, w::ws, e::es) =                    fun select (_, wid, [w], [e]) = Env.TREE(T.E_Op(TOp.VIndex(wid, w, i), [e]))
247                        | select (i, wid, w::ws, e::es) =
248                          if (i < w)                          if (i < w)
249                            then Env.TREE(T.E_Op(TOp.VIndex(w, i), [e]))                            then Env.TREE(T.E_Op(TOp.VIndex(w, w, i), [e]))
250                            else select (i-w, ws, es)                            else select (i-w, wid-w, ws, es)
251                      | select _ = raise Fail("bogus " ^ Op.toString srcRator)                      | select _ = raise Fail("bogus " ^ Op.toString srcRator)
252                    in                    in
253                      select (i, pieces, es)                      select (i, wid, pieces, es)
254                    end                    end
255                | Op.VClamp n => let                | Op.VClamp n => let
256                    val [v, lo, hi] = args                    val [v, lo, hi] = args
257                    val (layout, vs) = vectorArg (env, v)                    val (layout, vs) = vectorArg (env, v)
258                    val lo = scalarArg env lo                    val lo = scalarArg env lo
259                    val hi = scalarArg env hi                    val hi = scalarArg env hi
260                    val exps = ListPair.map                    val exps = mkArgs
261                        (fn (w, x) => T.E_Op(TOp.VClamp w, [x, lo, hi]))                          (fn (w, p, x) => (TOp.VClamp(w, p), [x, lo, hi]))
262                          (#pieces layout, vs)                            (layout, vs)
263                    in                    in
264                      Env.VEC(layout, exps)                      Env.VEC(layout, exps)
265                    end                    end
# Line 278  Line 284 
284                | Op.ArcSin => bindOp TOp.ArcSin                | Op.ArcSin => bindOp TOp.ArcSin
285                | Op.Tan => bindOp TOp.Tan                | Op.Tan => bindOp TOp.Tan
286                | Op.ArcTan => bindOp TOp.ArcTan                | Op.ArcTan => bindOp TOp.ArcTan
287                | Op.Ceiling 1 => bindOp (TOp.Ceiling 1)                | Op.Ceiling 1 => bindOp TOp.RCeiling
288                | Op.Ceiling d => bindVOp TOp.Ceiling                | Op.Ceiling d => bindVOp TOp.VCeiling
289                | Op.Floor 1 => bindOp (TOp.Floor 1)                | Op.Floor 1 => bindOp TOp.RFloor
290                | Op.Floor d => bindVOp TOp.Floor                | Op.Floor d => bindVOp TOp.VFloor
291                | Op.Round 1 => bindOp (TOp.Round 1)                | Op.Round 1 => bindOp TOp.RRound
292                | Op.Round d => bindVOp TOp.Round                | Op.Round d => bindVOp TOp.VRound
293                | Op.Trunc 1 => bindOp (TOp.Trunc 1)                | Op.Trunc 1 => bindOp TOp.RTrunc
294                | Op.Trunc d => bindVOp TOp.Trunc                | Op.Trunc d => bindVOp TOp.VTrunc
295                | Op.IntToReal => bindOp TOp.IntToReal                | Op.IntToReal => bindOp TOp.IntToReal
296                | Op.RealToInt 1 => bindOp (TOp.RealToInt 1)                | Op.RealToInt 1 => bindOp TOp.RealToInt
297                | Op.RealToInt d => Env.TREE(T.E_Op(TOp.RealToInt d, List.map (singleArg env) args))                | Op.RealToInt d => let
298                      val layout = Env.layoutVec env d
299                      in
300                        case #pieces layout
301                         of [w] => Env.TREE(T.E_Op(TOp.VToInt(d, w), List.map (singleArg env) args))
302                          | _ => raise Fail(concat["FIXME: RealToInt<", Int.toString d, ">"])
303                        (* end case *)
304                      end
305  (* FIXME  (* FIXME
306                | Op.R_All ty => ??                | Op.R_All ty => ??
307                | Op.R_Exists ty => ??                | Op.R_Exists ty => ??

Legend:
Removed from v.3879  
changed lines
  Added in v.3880

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