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

SCM Repository

[diderot] Diff of /branches/vis12/src/compiler/high-to-mid/high-to-mid.sml
ViewVC logotype

Diff of /branches/vis12/src/compiler/high-to-mid/high-to-mid.sml

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

revision 2983, Fri Mar 6 23:16:15 2015 UTC revision 2984, Sat Mar 7 00:05:29 2015 UTC
# Line 21  Line 21 
21      structure DstTy = MidILTypes      structure DstTy = MidILTypes
22      structure DstOp = MidOps      structure DstOp = MidOps
23      structure InP = Inputs      structure InP = Inputs
24        structure BCtl = BorderCtl
25    
26      fun getRHS x  = (case SrcIL.Var.binding x      fun getRHS x  = (case SrcIL.Var.binding x
27             of SrcIL.VB_RHS(SrcIL.OP(rator, args)) => (rator, args)             of SrcIL.VB_RHS(SrcIL.OP(rator, args)) => (rator, args)
# Line 32  Line 33 
33                  ])                  ])
34            (* end case *))            (* end case *))
35    
36      fun getRHSImage x = (case getRHS x    (* get the image referenced on a RHS and its border control (if any) *)
37        fun getRHSImage x = let
38              fun get x = (case getRHS x
39             of (SrcOp.LoadImage(SrcTy.ImageTy v, _), _) => v             of (SrcOp.LoadImage(SrcTy.ImageTy v, _), _) => v
40              | (SrcOp.Input(InP.INP{init=SOME(InP.Proxy(_, v)), ...}), _) => v              | (SrcOp.Input(InP.INP{init=SOME(InP.Proxy(_, v)), ...}), _) => v
41              | (SrcOp.Input(InP.INP{init=SOME(InP.Image v), ...}), _) => v              | (SrcOp.Input(InP.INP{init=SOME(InP.Image v), ...}), _) => v
42              | _ => raise Fail "bogus image variable"              | _ => raise Fail "bogus image variable"
43            (* end case *))            (* end case *))
44              in
45                case getRHS x
46                 of (SrcOp.BorderCtlDefault _, [img, v]) => (get img, BCtl.Default v)
47                  | (SrcOp.BorderCtlClamp _, [img]) => (get img, BCtl.Clamp)
48                  | (SrcOp.BorderCtlMirror _, [img]) => (get img, BCtl.Mirror)
49                  | (SrcOp.BorderCtlWrap _, [img]) => (get img, BCtl.Wrap)
50                  | (SrcOp.LoadImage(SrcTy.ImageTy v, _), _) => (v, BCtl.None)
51                  | (SrcOp.Input(InP.INP{init=SOME(InP.Proxy(_, v)), ...}), _) => (v, BCtl.None)
52                  | (SrcOp.Input(InP.INP{init=SOME(InP.Image v), ...}), _) => (v, BCtl.None)
53                  | _ => raise Fail "bogus image variable"
54                (* end case *)
55              end
56    
57      fun cvtTy SrcTy.BoolTy = DstTy.BoolTy      fun cvtTy SrcTy.BoolTy = DstTy.BoolTy
58        | cvtTy SrcTy.StringTy = DstTy.StringTy        | cvtTy SrcTy.StringTy = DstTy.StringTy
# Line 87  Line 102 
102                      (y, DstIL.OP(DstOp.Div DstTy.realTy, [t, x]))                      (y, DstIL.OP(DstOp.Div DstTy.realTy, [t, x]))
103                    ] end                    ] end
104                | SOME 2 => [(y, DstIL.OP(DstOp.Mul DstTy.realTy, [x, x]))]                | SOME 2 => [(y, DstIL.OP(DstOp.Mul DstTy.realTy, [x, x]))]
105  (* FIXME: expand into multiplications; ~2 ==> sqrt  (* FIXME: expand into multiplications
106                | SOME n =>                | SOME n =>
107  *) | SOME _ => pow()  *) | SOME _ => pow()
108                | NONE => pow()                | NONE => pow()
# Line 96  Line 111 
111    (* expand the field Inside operator into a image-space test *)    (* expand the field Inside operator into a image-space test *)
112      fun expandInside (env, result, pos, fld) = (case getRHS fld      fun expandInside (env, result, pos, fld) = (case getRHS fld
113             of (SrcOp.Field(SrcTy.TensorTy[d], _), [img, h]) => (case (getRHSImage img, getRHS h)             of (SrcOp.Field(SrcTy.TensorTy[d], _), [img, h]) => (case (getRHSImage img, getRHS h)
114                   of (v, (SrcOp.Kernel(h, _), [])) => let                   of ((v, _), (SrcOp.Kernel(h, _), [])) => let
115                        val pos = Env.rename (env, pos)                        val pos = Env.rename (env, pos)
116                        val img = Env.rename (env, img)                        val img = Env.rename (env, img)
117                        val imgPos = DstIL.Var.new ("x", DstTy.vecTy d)                        val imgPos = DstIL.Var.new ("x", DstTy.vecTy d)
# Line 110  Line 125 
125              | _ => raise Fail "bogus field binding"              | _ => raise Fail "bogus field binding"
126            (* end case *))            (* end case *))
127    
128      fun expandProbe (env, result, fld, pos) = (case getRHS fld      fun expandProbe (env, result, fld, pos, hasCtl) = (case getRHS fld
129             of (SrcOp.Field _, [img, h]) => (case (getRHSImage img, getRHS h)             of (SrcOp.Field _, [img, h]) => let
130                   of (v, (SrcOp.Kernel(h, k), _)) => Probe.expand {                  val (v, ctl) = getRHSImage img
131                    val ctl = if hasCtl
132                          then BCtl.map (fn x => Env.rename (env, x)) ctl
133                          else BCtl.None
134                    in
135                      case getRHS h
136                       of (SrcOp.Kernel(h, k), _) => Probe.expand {
137                          result = result,                          result = result,
138                          img = Env.rename (env, img),                          img = Env.rename (env, img),
139                          v = v, h = h, k = k,                          v = v, h = h, k = k,
140                          pos = Env.rename (env, pos)                            pos = Env.rename (env, pos),
141                              ctl = ctl
142                        }                        }
143                    | _ => raise Fail "bogus image/kernel binding"                    | _ => raise Fail "bogus image/kernel binding"
144                  (* end case *))                    (* end case *)
145                    end
146              | _ => raise Fail "bogus field binding"              | _ => raise Fail "bogus field binding"
147            (* end case *))            (* end case *))
148    
# Line 171  Line 194 
194                    (y, DstIL.OP(DstOp.RealToInt 1, [t]))                    (y, DstIL.OP(DstOp.RealToInt 1, [t]))
195                  ] end                  ] end
196            fun dummy () = [(y, DstIL.LIT(Literal.Int 0))]            fun dummy () = [(y, DstIL.LIT(Literal.Int 0))]
197              fun copy () = let val [x] = args
198                    in
199                      [(y, DstIL.VAR(Env.rename(env, x)))]
200                    end
201            in            in
202              case rator              case rator
203               of SrcOp.Add ty => assign (DstOp.Add(cvtTy ty))               of SrcOp.Add ty => assign (DstOp.Add(cvtTy ty))
# Line 232  Line 259 
259                     of [pos, fld] => expandInside(env, y, pos, fld)                     of [pos, fld] => expandInside(env, y, pos, fld)
260                    (* end case *))                    (* end case *))
261                | SrcOp.Probe _ => (case args                | SrcOp.Probe _ => (case args
262                     of [fld, pos] => expandProbe(env, y, fld, pos)                     of [fld, pos] => expandProbe(env, y, fld, pos, false)
263                      (* end case *))
264                  | SrcOp.ProbeWithCtl _ => (case args
265                       of [fld, pos] => expandProbe(env, y, fld, pos, true)
266                    (* end case *))                    (* end case *))
267              (* fields are used in the Inside and Probe operations, but are otherwise ignored *)              (* fields are used in the Inside and Probe operations, but are otherwise ignored *)
268                | SrcOp.Field _ => dummy()                | SrcOp.Field _ => dummy()
# Line 243  Line 273 
273                | SrcOp.DiffField => dummy()                | SrcOp.DiffField => dummy()
274                | SrcOp.OffsetField => dummy()                | SrcOp.OffsetField => dummy()
275                | SrcOp.ImageDim(info, i) => assign (DstOp.ImageDim(info, i))                | SrcOp.ImageDim(info, i) => assign (DstOp.ImageDim(info, i))
276                  | SrcOp.BorderCtlDefault info => (case args
277                       of [x, _] => [(y, DstIL.VAR(Env.rename(env, x)))]
278                      (* end case *))
279                  | SrcOp.BorderCtlClamp info => copy()
280                  | SrcOp.BorderCtlMirror info => copy()
281                  | SrcOp.BorderCtlWrap info => copy()
282                | SrcOp.LoadSeq(ty, nrrd) => assign (DstOp.LoadSeq(cvtTy ty, nrrd))                | SrcOp.LoadSeq(ty, nrrd) => assign (DstOp.LoadSeq(cvtTy ty, nrrd))
283                | SrcOp.LoadImage(ty, nrrd) =>                | SrcOp.LoadImage(ty, nrrd) =>
284                    assign (DstOp.LoadImage(cvtTy ty, nrrd))                    assign (DstOp.LoadImage(cvtTy ty, nrrd))

Legend:
Removed from v.2983  
changed lines
  Added in v.2984

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