Home My Page Projects Code Snippets Project Openings diderot

# SCM Repository

[diderot] Diff of /branches/charisee/src/compiler/mid-to-low/mid-to-low.sml
 [diderot] / branches / charisee / src / compiler / mid-to-low / mid-to-low.sml

# Diff of /branches/charisee/src/compiler/mid-to-low/mid-to-low.sml

revision 2397, Sat Jul 6 20:50:46 2013 UTC revision 2398, Sat Jul 6 23:07:40 2013 UTC
# Line 60  Line 60
60    (* convert a rational to a FloatLit.float value.  We do this by long division    (* convert a rational to a FloatLit.float value.  We do this by long division
61     * with a cutoff when we get to 12 digits.     * with a cutoff when we get to 12 digits.
62     *)     *)
63
64      fun ratToFloat r = (case Rational.explode r      fun ratToFloat r = (case Rational.explode r
65             of {sign=0, ...} => FloatLit.zero false             of {sign=0, ...} => FloatLit.zero false
66              | {sign, num, denom=1} => FloatLit.fromInt(IntInf.fromInt sign * num)              | {sign, num, denom=1} => FloatLit.fromInt(IntInf.fromInt sign * num)
# Line 112  Line 113
113              fun ilit (r : DstIL.var, n) = (r, DstIL.LIT(Literal.Int(IntInf.fromInt n)))              fun ilit (r : DstIL.var, n) = (r, DstIL.LIT(Literal.Int(IntInf.fromInt n)))
114              fun radd (r : DstIL.var, a, b) = (r, DstIL.OP(DstOp.IAdd DstTy.realTy, [a, b]))              fun radd (r : DstIL.var, a, b) = (r, DstIL.OP(DstOp.IAdd DstTy.realTy, [a, b]))
115          *)          *)
116
117      fun imul (r : DstIL.var, a, b) = (r, DstIL.OP(DstOp.IMul, [a, b]))      fun imul (r : DstIL.var, a, b) = (r, DstIL.OP(DstOp.IMul, [a, b]))
118      fun iadd (r : DstIL.var, a, b) = (r, DstIL.OP(DstOp.IAdd, [a, b]))      fun iadd (r : DstIL.var, a, b) = (r, DstIL.OP(DstOp.IAdd, [a, b]))
119      fun ilit (r : DstIL.var, n) = (r, DstIL.LIT(Literal.Int(IntInf.fromInt n)))      fun ilit (r : DstIL.var, n) = (r, DstIL.LIT(Literal.Int(IntInf.fromInt n)))
120      fun radd (r : DstIL.var, a, b) = (r, DstIL.OP(DstOp.IAdd, [a, b]))      fun radd (r : DstIL.var, a, b) = (r, DstIL.OP(DstOp.IAdd, [a, b]))
121
122
123
124    (* expand the EvalKernel operations into vector operations.  The parameters    (* expand the EvalKernel operations into vector operations.  The parameters
125     * are     * are
126     *    result  -- the lhs variable to store the result     *    result  -- the lhs variable to store the result
# Line 158  Line 162
162              |_ =>  let              |_ =>  let
163                                            val shape = shapeVarToTensor sv                                            val shape = shapeVarToTensor sv
165                                                            in
166                  DSTIL.EINAPP(S.transform(operator,[len(shape), shape]), n )                  DSTIL.EINAPP(S.transform(operator,[len(shape), shape]), n )
167                    end
168
169
170          (****************************)          (****************************)
# Line 227  Line 233
233                        [(result, DstIL.VAR a0)]                        [(result, DstIL.VAR a0)]
234                    | a0::r => let                    | a0::r => let
235                        val (m, stms) = eval (1, r)                        val (m, stms) = eval (1, r)
237                        in                        in
239                            (*List.rev ((result, DstIL.OP(DstOp.IAdd ty, [a0, m]))::stms)*)
240
241                        end                        end
242                  (* end case *))                  (* end case *))
243            in            in
# Line 284  Line 292
292     * arithmetic, where the offset will be automatically scaled by the size of the     * arithmetic, where the offset will be automatically scaled by the size of the
293     * elements.     * elements.
294     *)     *)
295
296
297      fun expandVoxelAddress (result, info, offset, [img, ix]) = let      fun expandVoxelAddress (result, info, offset, [img, ix]) = let
298            val dim = ImageInfo.dim info            val dim = ImageInfo.dim info
299            val stride = ImageInfo.stride info            val stride = ImageInfo.stride info
# Line 291  Line 301
301            val (offp, code) = adjustForStrideAndOffset (stride, offset, ix, [])            val (offp, code) = adjustForStrideAndOffset (stride, offset, ix, [])
304
305            (*Add here is of address type, assume it is okay to keep IADD since not tensors*)
308                  code                  code
# Line 368  Line 380
380                | SrcOp.Lerp ty => assign (DstOp.Lerp ty)                | SrcOp.Lerp ty => assign (DstOp.Lerp ty)
381                    | SrcOp.Norm ty => assign (DstOp.Norm ty)                    | SrcOp.Norm ty => assign (DstOp.Norm ty)
382                | SrcOp.Normalize d => assign (DstOp.Normalize d)                | SrcOp.Normalize d => assign (DstOp.Normalize d)
383                | SrcOp.Scale ty => assign (DstOp.Scale ty)
384                | SrcOp.Zero ty => assign (DstOp.Zero ty)                | SrcOp.Zero ty => assign (DstOp.Zero ty)
385                | SrcOp.PrincipleEvec ty => assign (DstOp.PrincipleEvec ty)                | SrcOp.PrincipleEvec ty => assign (DstOp.PrincipleEvec ty)
386                | SrcOp.EigenVals2x2 => assign (DstOp.EigenVals2x2)                | SrcOp.EigenVals2x2 => assign (DstOp.EigenVals2x2)
# Line 397  Line 409
409              (* end case *)              (* end case *)
410            end            end
411
412              fun expandEinOp (env, y, Ein.EIN{params, index, body}, args) = let
413                        fun assign2 rator' =
414                          [(y, DstIL.EINAPP(rator', Env.renameList(env, args)))]
415
416                        fun assign params'=
417                          assign2 Ein.EIN{params=params', index=index, body=body}
418                          fun cvtToInt rator' = let
419                          val t = DstIL.Var.new ("t", DstTy.realTy)
420                          in [
421                            (t, DstIL.OP(rator', Env.renameList(env, args))),
422                            (y, DstIL.OP(DstOp.RealToInt 1, [t]))
423                            ] end
424                          fun dummy () = [(y, DstIL.LIT(Literal.Int 0))]
425
426                        in
427                          case params
428                          of E.Const _ => assign params
429                          | E.Tensor _ => assign params
430                          | E.Field _ => dummy()
431                          | E.Add _ => assign params
432                          | E.Sum _ => assign params
433                          | E.Prod _ => assign params
434                          | E.Div _ => assign params
435                          | E.Sub _ => assign params
436                          | E.Neg _ => assign params
437                          | E.Delta _ => assign params
438                          | E.Epsilon _=> assign params
439                          | E.Conv _ =>  dummy()
440                          | E.Partial _ => assign params
441                          | E.Probe _=> dummy()
442                          | E.Apply _ => assign params
443
444                    (* end case *)
445                    end
446            handle ex => (print(concat["error converting ", SrcOp.toString rator, "\n"]); raise ex)
447
448
449
450    (* expand a SrcIL assignment to a DstIL CFG *)    (* expand a SrcIL assignment to a DstIL CFG *)
451      fun expand (env, (y, rhs)) = let      fun expand (env, (y, rhs)) = let
452            val y' = Env.rename (env, y)            val y' = Env.rename (env, y)
# Line 409  Line 459
459                | SrcIL.OP(rator, args) => List.map DstIL.ASSGN (expandOp (env, y', rator, args))                | SrcIL.OP(rator, args) => List.map DstIL.ASSGN (expandOp (env, y', rator, args))
460                | SrcIL.APPLY(f, args) => assign (DstIL.APPLY(f, Env.renameList(env, args)))                | SrcIL.APPLY(f, args) => assign (DstIL.APPLY(f, Env.renameList(env, args)))
461                | SrcIL.CONS(ty, args) => assign (DstIL.CONS(ty, Env.renameList(env, args)))                | SrcIL.CONS(ty, args) => assign (DstIL.CONS(ty, Env.renameList(env, args)))
462                       | SrcIL.EINAPP(rator, args) =>
463                             List.map DstIL.EINAPP (expandEinOp (env, Env.rename (env, y), rator, args))
464              (* end case *)              (* end case *)
465            end            end
466
467
468    (* expand a SrcIL multi-assignment to a DstIL CFG *)    (* expand a SrcIL multi-assignment to a DstIL CFG *)
469      fun mexpand (env, (ys, rator, xs)) = let      fun mexpand (env, (ys, rator, xs)) = let
470            val ys' = Env.renameList(env, ys)            val ys' = Env.renameList(env, ys)

Legend:
 Removed from v.2397 changed lines Added in v.2398