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

SCM Repository

[diderot] Diff of /branches/vis15/src/compiler/cxx-util/tree-to-cxx.sml
ViewVC logotype

Diff of /branches/vis15/src/compiler/cxx-util/tree-to-cxx.sml

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

revision 3926, Sat Jun 4 05:01:29 2016 UTC revision 3927, Sat Jun 4 21:20:01 2016 UTC
# Line 17  Line 17 
17    
18      val trWithLocals : CodeGenEnv.t * TreeVar.t list * (CodeGenEnv.t -> CLang.stm list) -> CLang.stm      val trWithLocals : CodeGenEnv.t * TreeVar.t list * (CodeGenEnv.t -> CLang.stm list) -> CLang.stm
19    
20      val trStms : CodeGenEnv.t * TreeIR.stm list -> CLang.stm list      val trStms : CodeGenEnv.t * TreeIR.stm list -> CodeGenEnv.t * CLang.stm list
21    
22      val trExp : CodeGenEnv.t * TreeIR.exp -> CLang.exp      val trExp : CodeGenEnv.t * TreeIR.exp -> CLang.exp
23    
# Line 29  Line 29 
29      val trAssign : CodeGenEnv.t * CLang.exp * TreeIR.exp -> CLang.stm list      val trAssign : CodeGenEnv.t * CLang.exp * TreeIR.exp -> CLang.stm list
30    
31    (* generate code to register an error message (require that a world pointer "wrld" is in scope) *)    (* generate code to register an error message (require that a world pointer "wrld" is in scope) *)
32      val errorMsgAdd : CLang.exp -> CLang.stm      val errorMsgAdd : CodeGenEnv.t * CLang.exp -> CLang.stm
33    
34      val trParam : CodeGenEnv.t -> TreeIR.var -> CLang.param      val trParam : CodeGenEnv.t * TreeIR.var -> CodeGenEnv.t * CLang.param
35    
36    end = struct    end = struct
37    
# Line 75  Line 75 
75    (* translate a strand state variable that occurs in an r-value context *)    (* translate a strand state variable that occurs in an r-value context *)
76      fun rvalueStateVar (env, x) = CL.mkIndirect(CL.mkVar(Env.selfIn env), TreeStateVar.qname x)      fun rvalueStateVar (env, x) = CL.mkIndirect(CL.mkVar(Env.selfIn env), TreeStateVar.qname x)
77    
78        fun worldVar env = CL.mkVar(Env.world env)
79    
80    (* generate new variables *)    (* generate new variables *)
81      val freshVar = CodeGenUtil.freshVar      val freshVar = CodeGenUtil.freshVar
82    
# Line 186  Line 188 
188              | (Op.BaseAddress info, [img]) => CL.mkDispatch(img, "base_addr", [])              | (Op.BaseAddress info, [img]) => CL.mkDispatch(img, "base_addr", [])
189              | (Op.ControlIndex(info, ctl, d), [img, idx]) =>              | (Op.ControlIndex(info, ctl, d), [img, idx]) =>
190                  CL.mkDispatch(img, IndexCtl.toString ctl, [intExp d, idx])                  CL.mkDispatch(img, IndexCtl.toString ctl, [intExp d, idx])
191                | (Op.LoadVoxel info, [addr, offp]) => let
192                    val voxel = CL.mkSubscript(addr, offp)
193                    in
194                      if RawTypes.same(ImageInfo.sampleTy info, Env.rawRealTy env)
195                        then voxel
196                        else CL.mkStaticCast(Env.realTy env, voxel)
197                    end
198              | (Op.Inside(info, s), [pos, img]) => CL.mkDispatch(img, "inside", [pos, intExp s])              | (Op.Inside(info, s), [pos, img]) => CL.mkDispatch(img, "inside", [pos, intExp s])
199              | (Op.ImageDim(info, i), [img]) => CL.mkDispatch(img, "size", [intExp i])              | (Op.ImageDim(info, i), [img]) => CL.mkDispatch(img, "size", [intExp i])
200              | (Op.MathFn f, args) => mkStdApply(MathFns.toString f, args)              | (Op.MathFn f, args) => mkStdApply(MathFns.toString f, args)
# Line 321  Line 330 
330                          (env, hiInit @ loop :: stms)                          (env, hiInit @ loop :: stms)
331                        end                        end
332                    | IR.S_Foreach(x, e, blk) => raise Fail "Foreach"                    | IR.S_Foreach(x, e, blk) => raise Fail "Foreach"
333                    | IR.S_New(strand, args) => raise Fail "New"                    | IR.S_New(strand, args) => let
334                          val args = List.map (fn e => trExp(env, e)) args
335                          val stm = CL.mkCall(
336                                Atom.toString strand ^ "_new",
337                                worldVar env :: args)
338                          in
339                            (env, stm :: stms)
340                          end
341                    | IR.S_Save(x, exp) => (env, trAssign (env, lvalueStateVar(env, x), exp) @ stms)                    | IR.S_Save(x, exp) => (env, trAssign (env, lvalueStateVar(env, x), exp) @ stms)
342                    | IR.S_LoadNrrd(lhs, ty, nrrd) => let                    | IR.S_LoadNrrd(lhs, ty, nrrd) => let
343                        val stm = (case ty                        val stm = (case ty
# Line 344  Line 360 
360                    | IR.S_Print(tys, args) => let                    | IR.S_Print(tys, args) => let
361                        val args = List.map (fn e => trExp(env, e)) args                        val args = List.map (fn e => trExp(env, e)) args
362                        val stm = trPrintStm (                        val stm = trPrintStm (
363                              CL.mkIndirect(CL.mkVar "wrld", "_output"),                              CL.mkIndirect(worldVar env, "_output"),
364                              tys, args)                              tys, args)
365                        in                        in
366                          (env, stm::stms)                          (env, stm::stms)
# Line 353  Line 369 
369                    | IR.S_Stabilize => (env, CL.mkReturn(SOME(CL.mkVar "diderot::kStabilize")) :: stms)                    | IR.S_Stabilize => (env, CL.mkReturn(SOME(CL.mkVar "diderot::kStabilize")) :: stms)
370                    | IR.S_Die => (env, CL.mkReturn(SOME(CL.mkVar "diderot::kDie")) :: stms)                    | IR.S_Die => (env, CL.mkReturn(SOME(CL.mkVar "diderot::kDie")) :: stms)
371                  (* end case *))                  (* end case *))
372              val (env, stms) = List.foldl trStm (env, []) stms
373            in            in
374              List.rev (#2 (List.foldl trStm (env, []) stms))              (env, List.rev stms)
375            end            end
376    
377      and trBlock (env, IR.Block{locals, body}) = let      and trBlock (env, IR.Block{locals, body}) = let
# Line 365  Line 382 
382                    (Env.insert(env, x, x'), dcl :: dcls)                    (Env.insert(env, x, x'), dcl :: dcls)
383                  end                  end
384            val (env, dcls) = List.foldl trLocal (env, []) (!locals)            val (env, dcls) = List.foldl trLocal (env, []) (!locals)
385              val (_, stms) = trStms (env, body)
386            in            in
387              CL.mkBlock (dcls @ trStms (env, body))              CL.mkBlock (dcls @ stms)
388            end            end
389    
390      and trWithLocals (env, locals, trBody) = let      and trWithLocals (env, locals, trBody) = let
# Line 381  Line 399 
399              CL.mkBlock (dcls @ trBody env)              CL.mkBlock (dcls @ trBody env)
400            end            end
401    
402      fun errorMsgAdd msg =      fun errorMsgAdd (env, msg) =
403            CL.mkCall("biffMsgAdd", [CL.mkIndirect(CL.mkVar "wrld", "_errors"), msg])            CL.mkCall("biffMsgAdd", [CL.mkIndirect(worldVar env, "_errors"), msg])
404    
405      fun trParam env x = let      fun trParam (env, x)= let
406            val x' = V.name x            val x' = V.name x
407            in            in
408              Env.insert (env, x, x');              (Env.insert (env, x, x'), CL.PARAM([], trType(env, V.ty x), x'))
             CL.PARAM([], trType(env, V.ty x), x')  
409            end            end
410    
411    end    end

Legend:
Removed from v.3926  
changed lines
  Added in v.3927

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