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

SCM Repository

[diderot] Annotation of /branches/pure-cfg/src/compiler/codegen/codegen-fn.sml
ViewVC logotype

Annotation of /branches/pure-cfg/src/compiler/codegen/codegen-fn.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 532 - (view) (download)

1 : jhr 454 (* codegen-fn.sml
2 :     *
3 :     * COPYRIGHT (c) 2010 The Diderot Project (http://diderot-language.cs.uchicago.edu)
4 :     * All rights reserved.
5 : jhr 455 *
6 :     * Generic support for translating LowIL code to the target representation. We
7 :     * assume that the LowIL has first been run through the splitting pass to match
8 :     * the target's vector widths.
9 : jhr 454 *)
10 :    
11 :     functor CodeGenFn (T : TARGET) : sig
12 :    
13 : jhr 518 val generate : string * LowIL.program -> unit
14 : jhr 454
15 :     end = struct
16 :    
17 : jhr 532 structure IL = TreeIL
18 :     structure Ty = IL.Ty
19 :     structure Op = IL.Op
20 :     structure V = IL.Var
21 : jhr 454
22 : jhr 525 (* convert LowIL types to T types *)
23 :     fun cvtTy ty = (case ty
24 :     of Ty.BoolTy => T.boolTy
25 :     | Ty.StringTy => raise Fail "FIXME: StringTy"
26 :     | Ty.IVecTy 1 => T.intTy
27 :     | Ty.IVecTy n => T.ivecTy n (* FIXME: what about vector splits? *)
28 :     | Ty.VecTy 1 => T.realTy
29 :     | Ty.VecTy n => T.vecTy n (* FIXME: what about vector splits? *)
30 :     | Ty.AddrTy => raise Fail "FIXME: AddrTy"
31 :     | Ty.ImageTy => raise Fail "FIXME: ImageTy"
32 :     (* end case *))
33 :    
34 : jhr 532 fun lookup (env, x) = (case V.Map.find (env, x)
35 :     of SOME x' => x'
36 :     | NONE => raise Fail "lookup"
37 :     (* end case *))
38 :    
39 :     fun trExp (env, e) = (case e
40 :     of IL.E_Var x => (case V.kind x
41 :     of IL.VK_Global => T.Expr.global(lookup(env, x))
42 :     | IL.VK_State strand => raise Fail "FIXME: state var"
43 :     | IL.VK_Local => T.Expr.var(lookup(env, x))
44 :     (* end case *))
45 :     | IL.E_Lit(Literal.Int n) => T.Expr.intLit n
46 :     | IL.E_Lit(Literal.Bool b) => T.Expr.boolLit b
47 :     | IL.E_Lit(Literal.Float f) => T.Expr.floatLit f
48 :     | IL.E_Lit(Literal.String s) => T.Expr.stringLit s
49 :     | IL.E_Op(rator, args) => (case (rator, trExps(env, args))
50 :     of (Op.Add ty, [a, b]) => T.Expr.add(a, b)
51 :     | (Op.Sub ty, [a, b]) => T.Expr.sub(a, b)
52 :     | (Op.Mul ty, [a, b]) => T.Expr.mul(a, b)
53 :     | (Op.Div ty, [a, b]) => T.Expr.divide(a, b)
54 :     | (Op.Neg ty, [a]) => T.Expr.neg a
55 :     | (Op.LT ty, [a, b]) => T.Expr.lt(a, b)
56 :     | (Op.LTE ty, [a, b]) => T.Expr.lte(a, b)
57 :     | (Op.EQ ty, [a, b]) => T.Expr.equ(a, b)
58 :     | (Op.NEQ ty, [a, b]) => T.Expr.neq(a, b)
59 :     | (Op.GT ty, [a, b]) => T.Expr.gt(a, b)
60 :     | (Op.GTE ty, [a, b]) => T.Expr.gte(a, b)
61 :     | (Op.Not, [a]) => T.Expr.not a
62 :     | (Op.Max, [a, b]) => T.Expr.max(a, b)
63 :     | (Op.Min, [a, b]) => T.Expr.min(a, b)
64 :     | (Op.Sin, [a]) => T.Expr.sin a
65 :     | (Op.Cos, [a]) => T.Expr.cos a
66 :     | (Op.Pow, [a, b]) => T.Expr.pow(a, b)
67 :     | (Op.Dot d, [a, b]) => T.Expr.dot(a, b)
68 :     | (Op.Cross, [a, b]) => T.Expr.cross(a, b)
69 :     | (Op.Select(ty, i), [a]) => T.Expr.select(i, a)
70 :     | (Op.Norm d, [a]) => T.Expr.length a
71 :     | (Op.Scale d, [a, b]) => T.Expr.mul(a, b)
72 :     | (Op.InvScale d, [a, b]) => T.Expr.divide(a, b)
73 : jhr 518 | (Op.CL, _) => raise Fail "CL unimplemented"
74 :     | (Op.PrincipleEvec ty, _) => raise Fail "PrincipleEvec unimplemented"
75 : jhr 514 (*
76 : jhr 518 | (Op.Subscript ty,
77 : jhr 514 *)
78 : jhr 532 | (Op.Floor d, [a]) => T.Expr.floor a
79 :     | (Op.IntToReal, [a]) => T.Expr.toReal a
80 :     | (Op.TruncToInt d, [a]) => T.Expr.truncToInt a
81 :     | (Op.RoundToInt d, [a]) => T.Expr.roundToInt a
82 :     | (Op.CeilToInt d, [a]) => T.Expr.ceilToInt a
83 :     | (Op.FloorToInt d, [a]) => T.Expr.floorToInt a
84 :     | (Op.ImageAddress, [a]) => T.Expr.imageAddr a
85 :     | (Op.LoadVoxels(rTy, n), [a]) => T.Expr.intLit 0 (* FIXME *)
86 :     | (Op.PosToImgSpace d, [v, x]) => T.Expr.intLit 0 (* FIXME *)
87 :     | (Op.GradToWorldSpace d, [v, x]) => T.Expr.intLit 0 (* FIXME *)
88 :     | (Op.LoadImage info, [a]) => T.Expr.intLit 0 (* FIXME *)
89 :     | (Op.Inside d, [v, x]) => T.Expr.intLit 0 (* FIXME *)
90 :     | (Op.Input(ty, name), []) => T.Expr.intLit 0 (* FIXME *)
91 :     | (Op.InputWithDefault(ty, name), [a]) => T.Expr.intLit 0 (* FIXME *)
92 : jhr 528 | _ => raise Fail(concat[
93 :     "incorrect number of arguments for ", Op.toString rator
94 :     ])
95 : jhr 518 (* end case *))
96 : jhr 532 | IL.E_Cons args => T.Expr.intLit 0 (* FIXME *)
97 :     (* end case *))
98 : jhr 454
99 : jhr 532 and trExps (env, exps) = List.map (fn exp => trExp(env, exp)) exps
100 : jhr 455
101 : jhr 532 fun trStmt (env, stm) = (case stm
102 :     of IL.S_Comment text => T.Stmt.comment text
103 :     (* FIXME: special case for when x is a strand-state variable *)
104 :     | IL.S_Assign(x, exp) => (case V.kind x
105 :     of IL.VK_Global => T.Stmt.assignState(lookup(env, x), trExp(env, exp))
106 :     | IL.VK_State strand => raise Fail "FIXME: state var"
107 :     | IL.VK_Local => T.Stmt.assign(lookup(env, x), trExp(env, exp))
108 : jhr 512 (* end case *))
109 : jhr 532 | IL.S_IfThen(cond, thenBlk) =>
110 :     T.Stmt.ifthen(trExp(env, cond), trBlock(env, thenBlk))
111 :     | IL.S_IfThenElse(cond, thenBlk, elseBlk) =>
112 :     T.Stmt.ifthenelse(trExp(env, cond),
113 :     trBlock(env, thenBlk),
114 :     trBlock(env, elseBlk))
115 :     | IL.S_Die => T.Stmt.die()
116 :     | IL.S_Stabilize => T.Stmt.stabilize()
117 :     (* end case *))
118 : jhr 512
119 : jhr 532 and trBlock (env, IL.Block{locals, body}) = (
120 :     (* what about the locals?? *)
121 :     T.Stmt.block(List.map (fn stm => trStmt(env, stm)) body))
122 : jhr 528
123 : jhr 531 fun generate (fileStem, srcProg) = let
124 :     val TreeIL.Program{globals, globalInit, strands} = LowToTree.translate srcProg
125 : jhr 527 val prog = T.newProgram ()
126 : jhr 532 (* define the globals and initialize the environment *)
127 :     val env = let
128 :     fun gvar (x, env) =
129 :     V.Map.insert(env, x, T.Var.global(prog, cvtTy(V.ty x), V.name x))
130 :     in
131 :     List.foldl gvar V.Map.empty globals
132 :     end
133 :     val globalInit = trBlock (env, globalInit)
134 : jhr 527 in
135 : jhr 528 (* output the program *)
136 : jhr 527 T.generate (fileStem, prog)
137 :     end
138 : jhr 518
139 : jhr 454 end

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