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 3873, Wed May 18 13:38:23 2016 UTC revision 3876, Wed May 18 17:25:47 2016 UTC
# Line 20  Line 20 
20    (* translate an expression to a variable form; return the variable (as an expression)    (* translate an expression to a variable form; return the variable (as an expression)
21     * and the (optional) declaration.     * and the (optional) declaration.
22     *)     *)
23      val expToVar : CodeGenEnv.t * CLang.ty * string * TreeIR.exp -> CLang.exp * CLang.stm list      val trExpToVar : CodeGenEnv.t * CLang.ty * string * TreeIR.exp -> CLang.exp * CLang.stm list
24    
25      val trAssign : CodeGenEnv.t * CLang.exp * TreeIR.exp -> CLang.stm list      val trAssign : CodeGenEnv.t * CLang.exp * TreeIR.exp -> CLang.stm list
26    
# Line 41  Line 41 
41      fun rvalueVar (env, x) = CL.mkVar(Env.lookup(env, x))      fun rvalueVar (env, x) = CL.mkVar(Env.lookup(env, x))
42    
43    (* translate a global variable that occurs in an l-value context *)    (* translate a global variable that occurs in an l-value context *)
44      fun lvalueGlobalVar (env, x) = CL.mkIndirect(Env.global env, TreeGlobalVar.name x)      fun lvalueGlobalVar (env, x) = CL.mkIndirect(CL.mkVar(Env.global env), TreeGlobalVar.name x)
45    (* translate a global variable that occurs in an r-value context *)    (* translate a global variable that occurs in an r-value context *)
46      val rvalueGlobalVar = lvalueGlobalVar      val rvalueGlobalVar = lvalueGlobalVar
47    
48    (* translate a strand state variable that occurs in an l-value context *)    (* translate a strand state variable that occurs in an l-value context *)
49      fun lvalueStateVar (env, x) = CL.mkIndirect(Env.selfOut env, TreeStateVar.name x)      fun lvalueStateVar (env, x) = CL.mkIndirect(CL.mkVar(Env.selfOut env), TreeStateVar.name x)
50    (* translate a strand state variable that occurs in an r-value context *)    (* translate a strand state variable that occurs in an r-value context *)
51      fun rvalueStateVar (env, x) = CL.mkIndirect(Env.selfIn env, TreeStateVar.name x)      fun rvalueStateVar (env, x) = CL.mkIndirect(CL.mkVar(Env.selfIn env), TreeStateVar.name x)
52    
53    (* generate new variables *)    (* generate new variables *)
54      local      local
# Line 173  Line 173 
173              | IR.E_State(NONE, x) => rvalueStateVar (env, x)              | IR.E_State(NONE, x) => rvalueStateVar (env, x)
174              | IR.E_State(SOME e, x) => CL.mkIndirect(trExp(env, e), TreeStateVar.name x)              | IR.E_State(SOME e, x) => CL.mkIndirect(trExp(env, e), TreeStateVar.name x)
175              | IR.E_Var x => rvalueVar (env, x)              | IR.E_Var x => rvalueVar (env, x)
176              | IR.E_Lit(Literal.Int n) => CL.mkIntTy(n, !CTyN.gIntTy)              | IR.E_Lit(Literal.Int n) => CL.mkIntTy(n, Env.intTy env)
177              | IR.E_Lit(Literal.Bool b) => CL.mkBool b              | IR.E_Lit(Literal.Bool b) => CL.mkBool b
178              | IR.E_Lit(Literal.Real f) => CL.mkFlt(f, !CTyN.gRealTy)              | IR.E_Lit(Literal.Real f) => CL.mkFlt(f, Env.realTy env)
179              | IR.E_Lit(Literal.String s) => CL.mkStr s              | IR.E_Lit(Literal.String s) => CL.mkStr s
180              | IR.E_Op(rator, args) => trOp (rator, trExps(env, args))              | IR.E_Op(rator, args) => trOp (rator, trExps(env, args))
181              | IR.E_Vec(d, args) => ??              | IR.E_Vec(d, args) => ??
# Line 193  Line 193 
193              | e => let              | e => let
194                  val x = freshName name                  val x = freshName name
195                  in                  in
196                    (CL.mkVar x, pCL.mkDeclInit(ty, x, e))                    (CL.mkVar x, [CL.mkDeclInit(ty, x, e)])
197                  end                  end
198            (* end case *))            (* end case *))
199    
# Line 211  Line 211 
211            trRHS (fn rhs => CL.mkDeclInit(ty, lhs, rhs)) (env, rhs)            trRHS (fn rhs => CL.mkDeclInit(ty, lhs, rhs)) (env, rhs)
212    
213      fun trMultiAssign (env, lhs, IR.E_Op(rator, args)) = (case (lhs, rator, args)      fun trMultiAssign (env, lhs, IR.E_Op(rator, args)) = (case (lhs, rator, args)
214             of ([vals, vecs], Op.EigenVecs2x2, [m]) =>             of ([vals, vecs], Op.EigenVecs2x2, [exp]) =>
215                  mkDiderotCall("eigenvecs", [trExp (env, exp), vals, vecs])                  mkDiderotCall("eigenvecs", [trExp (env, exp), vals, vecs])
216              | ([vals, vecs], Op.EigenVecs3x3, [m]) =>              | ([vals, vecs], Op.EigenVecs3x3, [exp]) =>
217                  mkDiderotCall("eigenvecs", [trExp (env, exp), vals, vecs])                  mkDiderotCall("eigenvecs", [trExp (env, exp), vals, vecs])
218              | _ => raise Fail "bogus multi-assignment"              | _ => raise Fail "bogus multi-assignment"
219            (* end case *))            (* end case *))
# Line 245  Line 245 
245                        in                        in
246                          (env, stm :: stms)                          (env, stm :: stms)
247                        end                        end
248                    | IR.S_Foreach(x, IR.E_Op(Op.Range, [lo, hi]), blk) => ??                    | IR.S_Foreach(x, IR.E_Op(Op.Range, [lo, hi]), blk) => let
249                          val x' = V.name x
250                          val env' = Env.insert (env, x, x')
251                          val loop = CL.mkFor(
252                                [(CL.int32, x', lo')],
253                                CL.mkBinOp(CL.mkVar x', CL.#<=, hi'),
254                                CL.mkUnOp(CL.%++, CL.mkVar x'),
255                                trBlock (env', blk))
256                          in
257                            (env, loop :: stms)
258                          end
259                    | IR.S_Foreach(x, e, blk) => ??                    | IR.S_Foreach(x, e, blk) => ??
260                    | IR.S_New(strand, args) => ??                    | IR.S_New(strand, args) => ??
261                    | IR.S_Save(x, exp) => trAssign (env, lvalueStateVar(env, x), exp)                    | IR.S_Save(x, exp) => trAssign (env, lvalueStateVar(env, x), exp)
# Line 266  Line 276 
276                        in                        in
277                          (env, stm::stms)                          (env, stm::stms)
278                        end                        end
279                    | IR.S_Active => (env, CL.mkReturn(SOME(CL.mkVar RN.kActive)) :: stms)                    | IR.S_Active => (env, CL.mkReturn(SOME(CL.mkVar "diderot::kActive")) :: stms)
280                    | IR.S_Stabilize => (env, CL.mkReturn(SOME(CL.mkVar RN.kStabilize)) :: stms)                    | IR.S_Stabilize => (env, CL.mkReturn(SOME(CL.mkVar "diderot::kStabilize")) :: stms)
281                    | IR.S_Die => (env, CL.mkReturn(SOME(CL.mkVar RN.kDie)) :: stms)                    | IR.S_Die => (env, CL.mkReturn(SOME(CL.mkVar "diderot::kDie")) :: stms)
282                  (* end case *))                  (* end case *))
283            in            in
284              List.rev (#2 (List.foldl trStm (env, []) stms))              List.rev (#2 (List.foldl trStm (env, []) stms))

Legend:
Removed from v.3873  
changed lines
  Added in v.3876

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