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

SCM Repository

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

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

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

revision 2396, Sun Jun 30 00:01:22 2013 UTC revision 2397, Sat Jul 6 20:50:46 2013 UTC
# Line 106  Line 106 
106                  end                  end
107            (* end case *))            (* end case *))
108    
109      fun imul (r : DstIL.var, a, b) = (r, DstIL.OP(DstOp.Mul DstTy.intTy, [a, b]))          (*Note, do we need types?
110      fun iadd (r : DstIL.var, a, b) = (r, DstIL.OP(DstOp.Add DstTy.intTy, [a, b]))              fun imul (r : DstIL.var, a, b) = (r, DstIL.OP(DstOp.IMul DstTy.intTy, [a, b]))
111                fun iadd (r : DstIL.var, a, b) = (r, DstIL.OP(DstOp.IAdd DstTy.intTy, [a, b]))
112      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)))
113      fun radd (r : DstIL.var, a, b) = (r, DstIL.OP(DstOp.Add DstTy.realTy, [a, b]))              fun radd (r : DstIL.var, a, b) = (r, DstIL.OP(DstOp.IAdd DstTy.realTy, [a, b]))
114            *)
115        fun imul (r : DstIL.var, a, b) = (r, DstIL.OP(DstOp.IMul, [a, b]))
116        fun iadd (r : DstIL.var, a, b) = (r, DstIL.OP(DstOp.IAdd, [a, b]))
117        fun ilit (r : DstIL.var, n) = (r, DstIL.LIT(Literal.Int(IntInf.fromInt n)))
118        fun radd (r : DstIL.var, a, b) = (r, DstIL.OP(DstOp.IAdd, [a, b]))
119    
120    (* expand the EvalKernel operations into vector operations.  The parameters    (* expand the EvalKernel operations into vector operations.  The parameters
121     * are     * are
# Line 139  Line 145 
145     *     *
146     * Note that the coeffient vectors are flipped (cf high-to-low/probe.sml).     * Note that the coeffient vectors are flipped (cf high-to-low/probe.sml).
147     *)     *)
148    
149    
150            (****************************)
151            (*Note, assuming Mult->IMult,
152            since otherwise would have created a tensor multiply or a scale.
153    
154            *)
155            fun decideAdd(n, arg)=  case n
156                    of DstTy.vecTy 1 => DstIL.OP(DstOp.IAdd, arg)
157                    | DstTy.IntTy => DstIL.OP(DstOp.IAdd, arg)
158                |_ =>  let
159                                              val shape = shapeVarToTensor sv
160                                                               val operator = EinOp.addTensors
161                    DSTIL.EINAPP(S.transform(operator,[len(shape), shape]), n )
162    
163    
164            (****************************)
165    
166      fun expandEvalKernel (result, d, h, k, [x]) = let      fun expandEvalKernel (result, d, h, k, [x]) = let
167            val {isCont, segs} = Kernel.curve (h, k)            val {isCont, segs} = Kernel.curve (h, k)
168          (* degree of polynomial *)          (* degree of polynomial *)
# Line 172  Line 196 
196            fun sTmp i = DstIL.Var.new("sum" ^ Int.toString i, ty)            fun sTmp i = DstIL.Var.new("sum" ^ Int.toString i, ty)
197            fun eval (i, [coeff]) = let            fun eval (i, [coeff]) = let
198                  val m = pTmp i                  val m = pTmp i
199    
200                  in                  in
201                    (m, [(m, DstIL.OP(DstOp.Mul ty, [x, coeff]))])                    (*(m, [(m, DstIL.OP(DstOp.Mul ty, [x, coeff])    )])*)
202    
203                              (m, [(m, DstIL.OP(DstOp.IMul, [x, coeff])    )])
204                  end                  end
205              | eval (i, coeff::r) = let              | eval (i, coeff::r) = let
206                  val (m, stms) = eval(i+1, r)                  val (m, stms) = eval(i+1, r)
207                  val s = sTmp i                  val s = sTmp i
208                  val m' = pTmp i                  val m' = pTmp i
209    
210                    (*val stms =
211                          (m', DstIL.OP(DstOp.IMul ty, [x, s])) ::
212                          (s, DstIL.OP(DstOp.IAdd ty, [coeff, m])) ::
213                          stms*)
214    
215                    val replaceAdd= decideAdd(ty, [coeff, m])
216                  val stms =                  val stms =
217                        (m', DstIL.OP(DstOp.Mul ty, [x, s])) ::                                (m', DstIL.OP(DstOp.IMul, [x, s])) ::
218                        (s, DstIL.OP(DstOp.Add ty, [coeff, m])) ::                                (s, replaceAdd) ::
219                        stms                        stms
220    
221    
222                  in                  in
223                    (m', stms)                    (m', stms)
224                  end                  end
# Line 191  Line 227 
227                        [(result, DstIL.VAR a0)]                        [(result, DstIL.VAR a0)]
228                    | a0::r => let                    | a0::r => let
229                        val (m, stms) = eval (1, r)                        val (m, stms) = eval (1, r)
230                    (**COME BACK HERE *)
231                        in                        in
232                          List.rev ((result, DstIL.OP(DstOp.Add ty, [a0, m]))::stms)                          List.rev ((result, DstIL.OP(DstOp.IAdd ty, [a0, m]))::stms)
233                        end                        end
234                  (* end case *))                  (* end case *))
235            in            in
# Line 254  Line 291 
291            val (offp, code) = adjustForStrideAndOffset (stride, offset, ix, [])            val (offp, code) = adjustForStrideAndOffset (stride, offset, ix, [])
292            val addrTy = DstTy.AddrTy info            val addrTy = DstTy.AddrTy info
293            val base = DstIL.Var.new ("imgBaseAddr", addrTy)            val base = DstIL.Var.new ("imgBaseAddr", addrTy)
294            val code = (result, DstIL.OP(DstOp.Add addrTy, [base, offp])) ::            val code = (result, DstIL.OP(DstOp.IAdd addrTy, [base, offp])) ::
295                  (base, DstIL.OP(DstOp.ImageAddress info, [img])) ::                  (base, DstIL.OP(DstOp.ImageAddress info, [img])) ::
296                  code                  code
297            in            in
# Line 298  Line 335 
335            val (offp, code) = adjustForStrideAndOffset (stride, offset, t, code)            val (offp, code) = adjustForStrideAndOffset (stride, offset, t, code)
336            val addrTy = DstTy.AddrTy info            val addrTy = DstTy.AddrTy info
337            val base = DstIL.Var.new ("imgBaseAddr", addrTy)            val base = DstIL.Var.new ("imgBaseAddr", addrTy)
338            val code = (result, DstIL.OP(DstOp.Add addrTy, [base, offp])) ::            val code = (result, DstIL.OP(DstOp.IAdd addrTy, [base, offp])) ::
339                  (base, DstIL.OP(DstOp.ImageAddress info, [img])) ::                  (base, DstIL.OP(DstOp.ImageAddress info, [img])) ::
340                  code                  code
341            in            in
342              List.rev code              List.rev code
343            end            end
344    
345    (* expand trace(M) *)  
     fun expandTrace (y, d, [m]) = let  
           val matTy = DstTy.TensorTy[d,d]  
           val rowTy = DstTy.TensorTy[d]  
           fun f (i, dst) = if (i < d-1)  
                 then let  
                   val i' = Int.toString i  
                   val ix = DstIL.Var.new ("ix" ^ i', DstTy.intTy)  
                   val x = DstIL.Var.new ("x"  ^ i', DstTy.realTy)  
                   val acc = DstIL.Var.new ("acc" ^ i', DstTy.realTy)  
                   val stms = f (i+1, acc)  
                   in  
                     radd(dst, acc, x) ::  
                     (x, DstIL.OP(DstOp.Subscript(matTy), [m, ix, ix])) ::  
                     ilit(ix, i) ::  
                     stms  
                   end  
                 else let  
                   val ix = DstIL.Var.new ("ix" ^ Int.toString i, DstTy.intTy)  
                   in [  
                     (dst, DstIL.OP(DstOp.Subscript(matTy), [m, ix, ix])),  
                     ilit(ix, i)  
                   ] end  
           in  
             List.rev (f (0, y))  
           end  
346    
347      fun expandOp (env, y, rator, args) = let      fun expandOp (env, y, rator, args) = let
348            val args' = Env.renameList (env, args)            val args' = Env.renameList (env, args)
349            fun assign rator' = [(y, DstIL.OP(rator', args'))]            fun assign rator' = [(y, DstIL.OP(rator', args'))]
350            in            in
351              case rator              case rator
352               of SrcOp.Add ty => assign (DstOp.Add ty)               of SrcOp.IAdd ty => assign (DstOp.IAdd ty)
353                | SrcOp.Sub ty => assign (DstOp.Sub ty)                | SrcOp.ISub ty => assign (DstOp.ISub ty)
354                | SrcOp.Mul ty => assign (DstOp.Mul ty)                | SrcOp.IMul ty => assign (DstOp.IMul ty)
355                | SrcOp.Div ty => assign (DstOp.Div ty)                | SrcOp.IDiv ty => assign (DstOp.IDiv ty)
356                | SrcOp.Neg ty => assign (DstOp.Neg ty)                | SrcOp.INeg ty => assign (DstOp.INeg ty)
357                | SrcOp.Abs ty => assign (DstOp.Abs ty)                | SrcOp.Abs ty => assign (DstOp.Abs ty)
358                | SrcOp.LT ty => assign (DstOp.LT ty)                | SrcOp.LT ty => assign (DstOp.LT ty)
359                | SrcOp.LTE ty => assign (DstOp.LTE ty)                | SrcOp.LTE ty => assign (DstOp.LTE ty)
# Line 354  Line 366 
366                | SrcOp.Min => assign (DstOp.Min)                | SrcOp.Min => assign (DstOp.Min)
367                | SrcOp.Clamp ty => assign (DstOp.Clamp ty)                | SrcOp.Clamp ty => assign (DstOp.Clamp ty)
368                | SrcOp.Lerp ty => assign (DstOp.Lerp ty)                | SrcOp.Lerp ty => assign (DstOp.Lerp ty)
               | SrcOp.Dot d => assign (DstOp.Dot d)  
               | SrcOp.MulVecMat(d1, d2) => assign (DstOp.MulVecMat(d1, d2))  
               | SrcOp.MulMatVec(d1, d2) => assign (DstOp.MulMatVec(d1, d2))  
               | SrcOp.MulMatMat(d1, d2, d3) => assign (DstOp.MulMatMat(d1, d2, d3))  
               | SrcOp.MulVecTen3(d1, d2, d3) => assign(DstOp.MulVecTen3(d1, d2, d3))  
               | SrcOp.MulTen3Vec(d1, d2, d3) => assign(DstOp.MulTen3Vec(d1, d2, d3))  
               | SrcOp.ColonMul(ty1, ty2) => assign(DstOp.ColonMul(ty1, ty2))  
               | SrcOp.Cross => assign (DstOp.Cross)  
369                | SrcOp.Norm ty => assign (DstOp.Norm ty)                | SrcOp.Norm ty => assign (DstOp.Norm ty)
370                | SrcOp.Normalize d => assign (DstOp.Normalize d)                | SrcOp.Normalize d => assign (DstOp.Normalize d)
371                | SrcOp.Scale ty => assign (DstOp.Scale ty)                | SrcOp.Scale ty => assign (DstOp.Scale ty)
# Line 369  Line 373 
373                | SrcOp.PrincipleEvec ty => assign (DstOp.PrincipleEvec ty)                | SrcOp.PrincipleEvec ty => assign (DstOp.PrincipleEvec ty)
374                | SrcOp.EigenVals2x2 => assign (DstOp.EigenVals2x2)                | SrcOp.EigenVals2x2 => assign (DstOp.EigenVals2x2)
375                | SrcOp.EigenVals3x3 => assign (DstOp.EigenVals3x3)                | SrcOp.EigenVals3x3 => assign (DstOp.EigenVals3x3)
376                | SrcOp.Identity n => assign (DstOp.Identity n)  
               | SrcOp.Trace d => expandTrace (y, d, args')  
               | SrcOp.Transpose(d1, d2) => assign (DstOp.Transpose(d1, d2))  
377                | SrcOp.Select(ty as SrcTy.TupleTy tys, i) => assign (DstOp.Select(ty, i))                | SrcOp.Select(ty as SrcTy.TupleTy tys, i) => assign (DstOp.Select(ty, i))
378                | SrcOp.Index(ty, i) => assign (DstOp.Index(ty, i))                | SrcOp.Index(ty, i) => assign (DstOp.Index(ty, i))
379                | SrcOp.Subscript ty => assign (DstOp.Subscript ty)                | SrcOp.ISubscript ty => assign (DstOp.ISubscript ty)
380                | SrcOp.Ceiling d => assign (DstOp.Ceiling d)                | SrcOp.Ceiling d => assign (DstOp.Ceiling d)
381                | SrcOp.Floor d => assign (DstOp.Floor d)                | SrcOp.Floor d => assign (DstOp.Floor d)
382                | SrcOp.Round d => assign (DstOp.Round d)                | SrcOp.Round d => assign (DstOp.Round d)

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

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