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 3853, Fri May 13 18:14:10 2016 UTC revision 3854, Fri May 13 19:21:27 2016 UTC
# Line 287  Line 287 
287                    bindSimple (T.E_State(NONE, getStateVar fld))                    bindSimple (T.E_State(NONE, getStateVar fld))
288                | IR.STATE(SOME x, fld) =>                | IR.STATE(SOME x, fld) =>
289                    bindSimple (T.E_State(SOME(scalarArg env x), getStateVar fld))                    bindSimple (T.E_State(SOME(scalarArg env x), getStateVar fld))
290                | IR.VAR x => (case Env.useVar env x                | IR.VAR x => raise Fail "FIXME: VAR"
                    of Env.TREE e => ??  
                     | Env.VEC(layout, es) => ??  
                   (* end case *))  
291                | IR.LIT lit => bindSimple (T.E_Lit lit)                | IR.LIT lit => bindSimple (T.E_Lit lit)
292                | IR.OP(Op.EigenVecs2x2, args) => assignOp (TOp.EigenVecs2x2, args)                | IR.OP(Op.EigenVecs2x2, args) => assignOp (TOp.EigenVecs2x2, args)
293                | IR.OP(Op.EigenVecs3x3, args) => assignOp (TOp.EigenVecs3x3, args)                | IR.OP(Op.EigenVecs3x3, args) => assignOp (TOp.EigenVecs3x3, args)
# Line 298  Line 295 
295                | IR.OP(Op.EigenVals3x3, args) => assignOp (TOp.EigenVals3x3, args)                | IR.OP(Op.EigenVals3x3, args) => assignOp (TOp.EigenVals3x3, args)
296                | IR.OP(rator, args) => let                | IR.OP(rator, args) => let
297                    val rhs = trOp (env, rator, args)                    val rhs = trOp (env, rator, args)
298                      val needAssignment = (V.useCount lhs > 1) orelse (Env.isInlineOp env rator)
299                    in                    in
300                      if Env.isInlineOp env rator                      case (rhs, eqClassRepOf(env, lhs), needAssignment)
                       then (case (rhs, eqClassRepOf(env, lhs), V.useCount lhs > 1)  
301                            of (_, NOEQ, false) => (Env.bindSimple (env, lhs, rhs); [])                            of (_, NOEQ, false) => (Env.bindSimple (env, lhs, rhs); [])
302                             | (Env.TREE e, NOEQ, true) => let                             | (Env.TREE e, NOEQ, true) => let
303                                  val t = Util.newLocalVar lhs                                  val t = Util.newLocalVar lhs
# Line 315  Line 312 
312                                    Env.bindSimple (env, lhs, Env.VEC(layout, List.map T.E_Var vs));                                    Env.bindSimple (env, lhs, Env.VEC(layout, List.map T.E_Var vs));
313                                    ListPair.mapEq T.S_Assign (vs, es)                                    ListPair.mapEq T.S_Assign (vs, es)
314                                  end                                  end
315                             | (Env.VEC(layout, es), VEC xs, _) => ??                        | (Env.VEC(layout, es), VEC xs, _) => ListPair.mapEq T.S_Assign (xs, es)
316                             | _ => raise Fail "inconsistent"                             | _ => raise Fail "inconsistent"
317                           (* end case *))                      (* end case *)
                       else ??  
318                    end                    end
319                | IR.CONS(args, Ty.TensorTy[d]) => let                | IR.CONS(args, Ty.TensorTy[d]) => let
320                    val {padded, pieces, ...} = Env.layoutVec env d                    val layout = Env.layoutVec env d
321                      fun mkVecs (args, w::ws) = let
322    (* FIXME: what about padding? *)
323                            fun take (0, args, es) = T.E_Vec(List.rev es) :: mkVecs (args, ws)
324                              | take (i, arg::args, es) = take (i-1, args, scalarArg env arg :: es)
325                              | take _ = raise Fail "too few arguments for CONS"
326                            in
327                              take (w, args, [])
328                            end
329                        | mkVecs ([], []) = []
330                        | mkVecs (_, []) = raise Fail "too many arguments for CONS"
331                      val es = mkVecs (args, #pieces layout)
332                      in
333                        case (eqClassRepOf(env, lhs), V.useCount lhs > 1)
334                         of (NOEQ, false) => (Env.bindVar(env, lhs, Env.VEC(layout, es)); [])
335                          | (NOEQ, true) => let
336                              val vs = Util.newVectorVars layout
337                    in                    in
338                      ??                              Env.bindSimple (env, lhs, Env.VEC(layout, List.map T.E_Var vs));
339                                ListPair.mapEq T.S_Assign (vs, es)
340                              end
341                          | (VEC xs, _) => ListPair.mapEq T.S_Assign (xs, es)
342                          | _ => raise Fail "inconsistent"
343                        (* end case *)
344                    end                    end
345                | IR.CONS(args, Ty.TensorTy shape) => ??                | IR.CONS(args, Ty.TensorTy shape) => raise Fail "FIXME: CONS"
346                | IR.SEQ(args, ty) => ??                | IR.SEQ(args, ty) => raise Fail "FIXME: SEQ"
347                | rhs => raise Fail(concat["unexpected ", IR.RHS.toString rhs, " in LowIR code"])                | rhs => raise Fail(concat["unexpected ", IR.RHS.toString rhs, " in LowIR code"])
348              (* end case *)              (* end case *)
349            end            end

Legend:
Removed from v.3853  
changed lines
  Added in v.3854

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