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

SCM Repository

[diderot] Diff of /branches/lamont/src/compiler/c-util/tree-to-c-fn.sml
ViewVC logotype

Diff of /branches/lamont/src/compiler/c-util/tree-to-c-fn.sml

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

revision 2083, Thu Nov 8 18:42:05 2012 UTC revision 2084, Fri Nov 9 21:55:00 2012 UTC
# Line 217  Line 217 
217              | (Op.IntToReal, [a]) => CL.mkCast(!N.gRealTy, a)              | (Op.IntToReal, [a]) => CL.mkCast(!N.gRealTy, a)
218              | (Op.RealToInt 1, [a]) => CL.mkCast(!N.gIntTy, a)              | (Op.RealToInt 1, [a]) => CL.mkCast(!N.gIntTy, a)
219              | (Op.RealToInt d, args) => CL.mkApply(N.vecftoi d, args)              | (Op.RealToInt d, args) => CL.mkApply(N.vecftoi d, args)
             | (Op.SphereQuery(_),[arg])=> CL.mkSubscript(CL.E_Var N.strandsName,CL.mkIndirect(CL.E_Var N.sequenceName,"strandId"))  
220              | (Op.ImageAddress info, [a]) => let              | (Op.ImageAddress info, [a]) => let
221                  val cTy = CL.T_Ptr(CL.T_Num(ImageInfo.sampleTy info))                  val cTy = CL.T_Ptr(CL.T_Num(ImageInfo.sampleTy info))
222                  in                  in
# Line 363  Line 362 
362                  [CL.mkCall(N.scaleMat(m,n),  lhs :: trExps(env, args))]                  [CL.mkCall(N.scaleMat(m,n),  lhs :: trExps(env, args))]
363              | IL.E_Op(Op.MulMatMat(m,n,p), args) =>              | IL.E_Op(Op.MulMatMat(m,n,p), args) =>
364                  [CL.mkCall(N.mulMatMat(m,n,p), lhs :: trExps(env, args))]                  [CL.mkCall(N.mulMatMat(m,n,p), lhs :: trExps(env, args))]
365                | IL.E_Op(Op.SphereQuery(_),args)=>  let
366                        val [radius] =  trExps(env, args)
367                        in
368                         [CL.mkDeclInit(CL.T_Ptr(CL.T_Named (N.strandItemTy)),
369                                        N.sequenceName,
370                            CL.mkApply(N.sphereQuery,[CL.E_Var N.strandsName,
371                                                      CL.E_Var "selfIn",
372                                                      CL.E_Var N.gridCxtName,
373                                                      radius]))]
374                        end
375              | IL.E_Op(Op.MulVecTen3(m, n, p), args) =>              | IL.E_Op(Op.MulVecTen3(m, n, p), args) =>
376                  if (1 < m) andalso (m <= 4) andalso (m = n) andalso (n = p)                  if (1 < m) andalso (m <= 4) andalso (m = n) andalso (n = p)
377                    then [CL.mkCall(N.mulVecTen3(m,n,p), lhs :: trExps(env, args))]                    then [CL.mkCall(N.mulVecTen3(m,n,p), lhs :: trExps(env, args))]
# Line 561  Line 570 
570                        [CL.mkIfThenElse(trExp(env, cond),                        [CL.mkIfThenElse(trExp(env, cond),
571                          trBlk(env, thenBlk),                          trBlk(env, thenBlk),
572                          trBlk(env, elseBlk))]                          trBlk(env, elseBlk))]
573                    | IL.S_Foreach(block,_) => trForeach(env,block)                    | IL.S_Foreach(cond,block,_) => trForeach(env,cond,block)
574                    | IL.S_New _ => raise Fail "new not supported yet" (* FIXME *)                    | IL.S_New _ => raise Fail "new not supported yet" (* FIXME *)
575                    | IL.S_Save([x], exp) => trAssign (env, VarToC.lvalueStateVar x, exp)                    | IL.S_Save([x], exp) => trAssign (env, VarToC.lvalueStateVar x, exp)
576                    | IL.S_Save(xs, exp) =>                    | IL.S_Save(xs, exp) =>
# Line 584  Line 593 
593              List.foldr (fn (stm, stms) => trStmt(env, stm)@stms) [] stms              List.foldr (fn (stm, stms) => trStmt(env, stm)@stms) [] stms
594            end            end
595    
596      and trForeach(env, b as IL.Block{locals,body}) = let      and trForeach(env,cond,b as IL.Block{locals,body}) = let
597             val cond = (case body             val neighborStm = CL.mkAssign(trExp(env,cond),CL.mkSubscript(CL.E_Var N.strandsName,CL.mkIndirect(CL.E_Var N.sequenceName,"strandId")))
                 of IL.S_Assign(_,IL.E_Op(Op.SphereQuery(_),[arg]))::rest => let  
                     val radius = trExp(env,arg)  
                     in  
                          CL.mkDecl(CL.T_Ptr(CL.T_Named N.strandItemTy),  
                                   N.sequenceName,  
                                   SOME(CL.I_Exp(CL.mkApply(N.sphereQuery,[CL.E_Var N.strandsName,  
                                                   CL.E_Var "selfin",  
                                                   CL.E_Var N.gridCxtName,  
                                                   radius]))))  
                     end  
                | _ => raise Fail "could not find foreach cond in body"  
                (* end of case *))  
   
598                 val foreachStms = trBlk(env,b)                 val foreachStms = trBlk(env,b)
   
599                  val loop = CL.mkWhile(CL.mkBinOp(CL.E_Var N.sequenceName, CL.#!=, CL.E_Var "NULL"),                  val loop = CL.mkWhile(CL.mkBinOp(CL.E_Var N.sequenceName, CL.#!=, CL.E_Var "NULL"),
600                                        CL.mkBlock([foreachStms]))                                        CL.mkBlock([neighborStm,foreachStms]))
601           in           in
602              [cond,loop]              [loop]
603           end           end
604    
605    

Legend:
Removed from v.2083  
changed lines
  Added in v.2084

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