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

SCM Repository

[diderot] Diff of /branches/pure-cfg/src/compiler/c-target/c-target.sml
ViewVC logotype

Diff of /branches/pure-cfg/src/compiler/c-target/c-target.sml

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

revision 550, Thu Feb 17 22:54:44 2011 UTC revision 551, Fri Feb 18 15:02:25 2011 UTC
# Line 10  Line 10 
10    struct    struct
11    
12      structure CL = CLang      structure CL = CLang
13        structure RN = RuntimeNames
14    
15      datatype ty      datatype ty = datatype TargetTy.ty
       = T_Bool  
       | T_String  
       | T_Int                   (* default float type *)  
       | T_Real                  (* default real type *)  
       | T_Vec of int  
       | T_IVec of int  
       | T_Image of int * RawTypes.ty    (* n-dimensional image data *)  
       | T_Ptr of RawTypes.ty            (* pointer type *)  
   
   (* string representation of types (for debugging *)  
     fun tyToString ty = (case ty  
            of T_Bool => "T_Bool"  
             | T_String => "T_String"  
             | T_Int => "T_Int"  
             | T_Real => "T_Real"  
             | T_Vec n => concat["T_Vec(", Int.toString n, ")"]  
             | T_IVec n => concat["T_IVec(", Int.toString n, ")"]  
             | T_Image(n, ty) => concat[  
                   "T_Image", Int.toString n, "D(", RawTypes.toString ty, ")"  
                 ]  
             | T_Ptr ty => concat["T_Ptr(", RawTypes.toString ty, ")"]  
           (* end case *))  
16    
17      datatype strand = Strand of {      datatype strand = Strand of {
18          name : string,          name : string,
# Line 56  Line 35 
35          strands : strand list ref          strands : strand list ref
36        }        }
37    
   (* globals that specify the target characteristics.  These should be initialized  
    * when the program object is created.  
    *)  
     val gVectorWid = ref 4  
     val gIntTy = ref CL.int32  
     val gRealTy = ref CL.float  
     val gRealSuffix = ref "f"  
   
   (* initialize globals based on target precision *)  
     fun initTargetSpec () = if !Controls.doublePrecision  
           then (  
             gVectorWid := 2;  
             gIntTy := CL.int64;  
             gRealTy := CL.double;  
             gRealSuffix := "d")  
           else (  
             gVectorWid := 4;  
             gIntTy := CL.int32;  
             gRealTy := CL.float;  
             gRealSuffix := "f")  
   
38    (* for SSE, we have 128-bit vectors *)    (* for SSE, we have 128-bit vectors *)
39      fun vectorWidth () = !gVectorWid      fun vectorWidth () = !RN.gVectorWid
   
     fun vectorSuffix n = Int.toString n ^ !gRealSuffix  
40    
41    (* target types *)    (* target types *)
42      val boolTy = T_Bool      val boolTy = T_Bool
43      val intTy = T_Int      val intTy = T_Int
44      val realTy = T_Real      val realTy = T_Real
45      fun vecTy 1 = T_Real      fun vecTy 1 = T_Real
46        | vecTy n = if (n < 1) orelse (!gVectorWid < n)        | vecTy n = if (n < 1) orelse (!RN.gVectorWid < n)
47            then raise Size            then raise Size
48            else T_Vec n            else T_Vec n
49      fun ivecTy 1 = T_Int      fun ivecTy 1 = T_Int
50        | ivecTy n = if (n < 1) orelse (!gVectorWid < n)        | ivecTy n = if (n < 1) orelse (!RN.gVectorWid < n)
51            then raise Size            then raise Size
52            else T_IVec n            else T_IVec n
53      fun imageTy (ImageInfo.ImgInfo{ty=([], rTy), dim, ...}) = T_Image(dim, rTy)      fun imageTy (ImageInfo.ImgInfo{ty=([], rTy), dim, ...}) = T_Image(dim, rTy)
# Line 103  Line 59 
59    (* convert target types to CLang types *)    (* convert target types to CLang types *)
60      fun cvtTy T_Bool = CLang.T_Named "bool"      fun cvtTy T_Bool = CLang.T_Named "bool"
61        | cvtTy T_String = CL.charPtr        | cvtTy T_String = CL.charPtr
62        | cvtTy T_Int = !gIntTy        | cvtTy T_Int = !RN.gIntTy
63        | cvtTy T_Real = !gRealTy        | cvtTy T_Real = !RN.gRealTy
64        | cvtTy (T_Vec n) = CLang.T_Named(concat["Diderot_vec", Int.toString n, "D_t"])        | cvtTy (T_Vec n) = CLang.T_Named(RN.vecTy n)
65        | cvtTy (T_IVec n) = raise Fail "FIXME: T_IVec"        | cvtTy (T_IVec n) = CLang.T_Named(RN.ivecTy n)
66        | cvtTy (T_Image(n, _)) = CLang.T_Named(concat["Diderot_image", Int.toString n, "D_t"])        | cvtTy (T_Image(n, _)) = CLang.T_Named(RN.imageTy n)
67        | cvtTy (T_Ptr ty) = CL.T_Ptr(CL.T_Num ty)        | cvtTy (T_Ptr ty) = CL.T_Ptr(CL.T_Num ty)
68    
69    (* report invalid arguments *)    (* report invalid arguments *)
70      fun invalid (name, []) = raise Fail("invaild "^name)      fun invalid (name, []) = raise Fail("invaild "^name)
71        | invalid (name, args) = let        | invalid (name, args) = let
72            fun arg2s (e, ty) = concat["(", CL.expToString e, " : ", tyToString ty, ")"]            fun arg2s (e, ty) = concat["(", CL.expToString e, " : ", TargetTy.toString ty, ")"]
73            val args = String.concatWith ", " (List.map arg2s args)            val args = String.concatWith ", " (List.map arg2s args)
74            in            in
75              raise Fail(concat["invalid arguments to ", name, ": ", args])              raise Fail(concat["invalid arguments to ", name, ": ", args])
# Line 130  Line 86 
86        | numTy _ = false        | numTy _ = false
87    
88      fun newProgram () = (      fun newProgram () = (
89            initTargetSpec();            RN.initTargetSpec();
90            Prog{            Prog{
91                globals = ref [],                globals = ref [],
92                topDecls = ref [],                topDecls = ref [],
# Line 138  Line 94 
94              })              })
95    
96      fun globalInit (Prog{topDecls, ...}, init) = let      fun globalInit (Prog{topDecls, ...}, init) = let
97            val initFn = CL.D_Func([], CL.voidTy, "Diderot_InitGlobals", [], init)            val initFn = CL.D_Func([], CL.voidTy, RN.initGlobals, [], init)
98            in            in
99              topDecls := initFn :: !topDecls              topDecls := initFn :: !topDecls
100            end            end
# Line 169  Line 125 
125          fun var (ty, x) = (CL.mkVar x, ty)          fun var (ty, x) = (CL.mkVar x, ty)
126    
127        (* literals *)        (* literals *)
128          fun intLit n = (CL.mkInt(n, !gIntTy), intTy)          fun intLit n = (CL.mkInt(n, !RN.gIntTy), intTy)
129          fun floatLit f = (CL.mkFlt(f, !gRealTy), realTy)          fun floatLit f = (CL.mkFlt(f, !RN.gRealTy), realTy)
130          fun stringLit s = (CL.mkStr s, stringTy)          fun stringLit s = (CL.mkStr s, stringTy)
131          fun boolLit b = (CL.mkBool b, boolTy)          fun boolLit b = (CL.mkBool b, boolTy)
132    
# Line 201  Line 157 
157            | sub args = binop CL.#- args            | sub args = binop CL.#- args
158        (* NOTE: multiplication and division are also used for scaling *)        (* NOTE: multiplication and division are also used for scaling *)
159          fun mul ((e1, T_Real), (e2, T_Vec n)) =          fun mul ((e1, T_Real), (e2, T_Vec n)) =
160                (CL.E_Apply("Diderot_scale"^vectorSuffix n, [e1, e2]), T_Vec n)                (CL.E_Apply(RN.scale n, [e1, e2]), T_Vec n)
161            | mul args = binop CL.#* args            | mul args = binop CL.#* args
162          fun divide ((e1, T_Vec n), (e2, T_Real)) =          fun divide ((e1, T_Vec n), (e2, T_Real)) =
163                (CL.E_Apply("Diderot_scale"^vectorSuffix n,                (CL.E_Apply(RN.scale n,
164                  [CL.mkBinOp(CL.mkFlt(FloatLit.one, !gRealTy), CL.#/, e2), e1]), T_Vec n)                  [CL.mkBinOp(#1(floatLit FloatLit.one), CL.#/, e2), e1]), T_Vec n)
165            | divide args = binop CL.#/ args            | divide args = binop CL.#/ args
166          end (* local *)          end (* local *)
167          fun neg (e, T_Bool) = raise Fail "invalid argument to neg"          fun neg (e, T_Bool) = raise Fail "invalid argument to neg"
168            | neg (e, ty) = (CL.mkUnOp(CL.%-, e), ty)            | neg (e, ty) = (CL.mkUnOp(CL.%-, e), ty)
169    
170          fun abs (e, T_Int) = (CL.mkApply("abs", [e]), T_Int)    (* FIXME: not the right type for 64-bit ints *)          fun abs (e, T_Int) = (CL.mkApply("abs", [e]), T_Int)    (* FIXME: not the right type for 64-bit ints *)
171            | abs (e, T_Real) = (CL.mkApply("fabs" ^ !gRealSuffix, [e]), T_Real)            | abs (e, T_Real) = (CL.mkApply("fabs" ^ !RN.gRealSuffix, [e]), T_Real)
172            | abs (e, T_Vec n) = raise Fail "FIXME: Expr.abs"            | abs (e, T_Vec n) = raise Fail "FIXME: Expr.abs"
173            | abs (e, T_IVec n) = raise Fail "FIXME: Expr.abs"            | abs (e, T_IVec n) = raise Fail "FIXME: Expr.abs"
174            | abs _ = raise Fail "invalid argument to abs"            | abs _ = raise Fail "invalid argument to abs"
175    
176          fun dot ((e1, T_Vec n1), (e2, T_Vec n2)) =          fun dot ((e1, T_Vec n1), (e2, T_Vec n2)) = (CL.E_Apply(RN.dot n1, [e1, e2]), T_Real)
               (CL.E_Apply("Diderot_dot"^vectorSuffix n1, [e1, e2]), T_Real)  
177            | dot _ = raise Fail "invalid argument to dot"            | dot _ = raise Fail "invalid argument to dot"
178    
179          fun cross ((e1, T_Vec 3), (e2, T_Vec 3)) = raise Fail "FIXME: Expr.cross"          fun cross ((e1, T_Vec 3), (e2, T_Vec 3)) = (CL.E_Apply(RN.cross(), [e1, e2]), T_Vec 3)
180            | cross _ = raise Fail "invalid argument to cross"            | cross _ = raise Fail "invalid argument to cross"
181    
182          fun length (e, T_Vec n) =          fun length (e, T_Vec n) = (CL.E_Apply(RN.length n, [e]), T_Real)
               (CL.E_Apply("Diderot_length"^vectorSuffix n, [e]), T_Real)  
183            | length _ = raise Fail "invalid argument to length"            | length _ = raise Fail "invalid argument to length"
184    
185          fun normalize (e, T_Vec n) =          fun normalize (e, T_Vec n) = (CL.E_Apply(RN.normalize n, [e]), T_Vec n)
               (CL.E_Apply("Diderot_normalize"^vectorSuffix n, [e]), T_Vec n)  
186            | normalize _ = raise Fail "invalid argument to length"            | normalize _ = raise Fail "invalid argument to length"
187    
188        (* comparisons *)        (* comparisons *)
# Line 282  Line 235 
235            fun r2r (ff, fd) (e, T_Real) = if !Controls.doublePrecision            fun r2r (ff, fd) (e, T_Real) = if !Controls.doublePrecision
236                  then (CL.mkApply(fd, [e]), T_Real)                  then (CL.mkApply(fd, [e]), T_Real)
237                  else (CL.mkApply(ff, [e]), T_Real)                  else (CL.mkApply(ff, [e]), T_Real)
238              | r2r (_, fd) _ = raise Fail("invalid argument for "^fd)              | r2r (_, fd) e = invalid (fd, [e])
239          in          in
240          val sin = r2r ("sinf", "sin")          val sin = r2r ("sinf", "sin")
241          val cos = r2r ("cosf", "cos")          val cos = r2r ("cosf", "cos")
242          val sqrt = r2r ("sqrtf", "sqrt")          val sqrt = r2r ("sqrtf", "sqrt")
       (* rounding *)  
         val trunc = r2r ("truncf", "trunc")  
         val round = r2r ("roundf", "round")  
         val floor = r2r ("floorf", "floor")  
         val ceil  = r2r ("ceilf", "ceil")  
243          end (* local *)          end (* local *)
244    
245          (* rounding *)
246            fun trunc (e, ty) = (CL.mkApply(RN.addTySuffix("trunc", ty), [e]), ty)
247            fun round (e, ty) = (CL.mkApply(RN.addTySuffix("round", ty), [e]), ty)
248            fun floor (e, ty) = (CL.mkApply(RN.addTySuffix("floor", ty), [e]), ty)
249            fun ceil (e, ty) = (CL.mkApply(RN.addTySuffix("ceil", ty), [e]), ty)
250    
251        (* conversions *)        (* conversions *)
252          fun toReal (e, T_Int) = (CL.mkCast(!gRealTy, e), T_Real)          fun toReal (e, T_Int) = (CL.mkCast(!RN.gRealTy, e), T_Real)
253            | toReal e = invalid ("toReal", [e])            | toReal e = invalid ("toReal", [e])
254    
255          fun truncToInt (e as (_, T_Real)) = (CL.mkCast(!gIntTy, #1(trunc e)), T_Int)          fun truncToInt (e as (_, T_Real)) = (CL.mkCast(!RN.gIntTy, #1(trunc e)), T_Int)
256              | truncToInt (e, T_Vec n) = (CL.mkApply(RN.truncToInt n, [e]), T_IVec n)
257            | truncToInt e = invalid ("truncToInt", [e])            | truncToInt e = invalid ("truncToInt", [e])
258          fun roundToInt (e as (_, T_Real)) = (CL.mkCast(!gIntTy, #1(round e)), T_Int)          fun roundToInt (e as (_, T_Real)) = (CL.mkCast(!RN.gIntTy, #1(round e)), T_Int)
259            | roundToInt e = invalid ("roundToInt", [e])            | roundToInt e = invalid ("roundToInt", [e])
260          fun ceilToInt (e as (_, T_Real)) = (CL.mkCast(!gIntTy, #1(floor e)), T_Int)          fun ceilToInt (e as (_, T_Real)) = (CL.mkCast(!RN.gIntTy, #1(floor e)), T_Int)
261            | ceilToInt e = invalid ("ceilToInt", [e])            | ceilToInt e = invalid ("ceilToInt", [e])
262          fun floorToInt (e as (_, T_Real)) = (CL.mkCast(!gIntTy, #1(ceil e)), T_Int)          fun floorToInt (e as (_, T_Real)) = (CL.mkCast(!RN.gIntTy, #1(ceil e)), T_Int)
263            | floorToInt e = invalid ("floorToInt", [e])            | floorToInt e = invalid ("floorToInt", [e])
264    
265        (* runtime system hooks *)        (* runtime system hooks *)
266          fun imageAddr (e, T_Image(_, rTy)) = let          fun imageAddr (e, T_Image(_, rTy)) = let
267                val cTy = CL.T_Ptr(!gRealTy)                val cTy = CL.T_Ptr(!RN.gRealTy)
268                in                in
269                  (CL.mkCast(cTy, CL.mkIndirect(e, "data")), T_Ptr rTy)                  (CL.mkCast(cTy, CL.mkIndirect(e, "data")), T_Ptr rTy)
270                end                end
271            | imageAddr a = invalid("imageAddr", [a])            | imageAddr a = invalid("imageAddr", [a])
272          fun getImgData (e, T_Ptr rTy) = let          fun getImgData (e, T_Ptr rTy) = let
273                val realTy as CL.T_Num rTy' = !gRealTy                val realTy as CL.T_Num rTy' = !RN.gRealTy
274                val e = CL.E_UnOp(CL.%*, e)                val e = CL.E_UnOp(CL.%*, e)
275                in                in
276                  if (rTy' = rTy)                  if (rTy' = rTy)
# Line 324  Line 279 
279                end                end
280            | getImgData a = invalid("getImgData", [a])            | getImgData a = invalid("getImgData", [a])
281          fun posToImgSpace ((img, T_Image(d, _)), (pos, T_Vec n)) = let          fun posToImgSpace ((img, T_Image(d, _)), (pos, T_Vec n)) = let
282                val fnName = concat["Diderot_ToImageSpace", Int.toString d, "D"]                val e = CL.mkApply(RN.toImageSpace d, [img, pos])
               val e = CL.mkApply(fnName, [img, pos])  
283                in                in
284                  (e, T_Vec n)                  (e, T_Vec n)
285                end                end
286            | posToImgSpace (a, b) = invalid("posToImgSpace", [a, b])            | posToImgSpace (a, b) = invalid("posToImgSpace", [a, b])
287          fun inside ((pos, T_Vec n), (img, T_Image(d, _)), s) = let          fun inside ((pos, T_Vec n), (img, T_Image(d, _)), s) = let
288                val fnName = concat["Diderot_Inside", Int.toString d, "D"]                val e = CL.mkApply(RN.inside d,
               val e = CL.mkApply(fnName,  
289                      [pos, img, CL.mkInt(IntInf.fromInt n, CL.int32)])                      [pos, img, CL.mkInt(IntInf.fromInt n, CL.int32)])
290                in                in
291                  (e, T_Bool)                  (e, T_Bool)
# Line 358  Line 311 
311          fun getImgData (lhs, n, e) = comment ["**** getImgData ****"] (* FIXME *)          fun getImgData (lhs, n, e) = comment ["**** getImgData ****"] (* FIXME *)
312          fun loadImage (lhs : var, dim, name : exp) = let          fun loadImage (lhs : var, dim, name : exp) = let
313                val sts = "sts"                val sts = "sts"
314                val imgTy = CL.T_Named(concat["Diderot_image", Int.toString dim, "D_t"])                val imgTy = CL.T_Named(RN.imageTy dim)
315                val loadFn = concat["Diderot_LoadImage", Int.toString dim, "D"]                val loadFn = RN.loadImage dim
316                in [                in [
317                  CL.S_Decl(                  CL.S_Decl(
318                    statusTy, sts,                    statusTy, sts,
# Line 367  Line 320 
320                ] end                ] end
321          fun input (lhs : var, name, optDflt) = let          fun input (lhs : var, name, optDflt) = let
322                val sts = "sts"                val sts = "sts"
323                val inputFn = (case #1 lhs                val inputFn = RN.input(#1 lhs)
                      of T_String => "Diderot_InputString"  
                       | T_Real => "Diderot_InputReal"  
                       | T_Vec 3 => "Diderot_InputVec3"  
                       | ty => raise Fail("unsupported input type " ^ tyToString ty)  
                     (* end case *))  
324                val lhs = CL.E_Var(#2 lhs)                val lhs = CL.E_Var(#2 lhs)
325                val (initCode, hasDflt) = (case optDflt                val (initCode, hasDflt) = (case optDflt
326                       of SOME(e, _) => ([CL.S_Assign(lhs, e)], true)                       of SOME(e, _) => ([CL.S_Assign(lhs, e)], true)
# Line 410  Line 358 
358         * parameters.         * parameters.
359         *)         *)
360          fun init (Strand{name, tyName, code, ...}, params, init) = let          fun init (Strand{name, tyName, code, ...}, params, init) = let
361                val fName = name ^ "_InitState"                val fName = RN.strandInit name
362                val params =                val params =
363                      CL.PARAM([], CL.T_Ptr(CL.T_Named tyName), "selfOut") ::                      CL.PARAM([], CL.T_Ptr(CL.T_Named tyName), "selfOut") ::
364                        List.map (fn (ty, x) => CL.PARAM([], cvtTy ty, x)) params                        List.map (fn (ty, x) => CL.PARAM([], cvtTy ty, x)) params

Legend:
Removed from v.550  
changed lines
  Added in v.551

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