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/gen-tys-and-ops.sml
ViewVC logotype

Diff of /branches/vis15/src/compiler/cxx-util/gen-tys-and-ops.sml

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

revision 4303, Fri Jul 29 13:31:42 2016 UTC revision 4304, Fri Jul 29 15:01:34 2016 UTC
# Line 53  Line 53 
53                        end                        end
54                    | Ty.TensorRefTy shape => let                    | Ty.TensorRefTy shape => let
55                        val name = RN.tensorRefStruct shape                        val name = RN.tensorRefStruct shape
56                        val thisData = CL.mkIndirect(CL.mkVar "this", "_data")                        val baseCls = concat[
57                                  "diderot::tensor_ref<", realTyName, ",",
58                                  Int.toString(List.foldl Int.* 1 shape), ">"
59                                ]
60                          fun mkConstr' (paramTy, paramId, arg) = mkConstr (
61                                name,
62                                [CL.PARAM([], paramTy, paramId)],
63                                [CL.mkApply(baseCls, [arg])])
64                      (* constructor from float/double pointer *)                      (* constructor from float/double pointer *)
65                        val (constrProto1, constrDef1) = mkConstr (name,                        val (constrProto1, constrDef1) = mkConstr' (
66                              [CL.PARAM([], CL.constPtrTy realTy, "src")],                              CL.constPtrTy realTy, "src", CL.mkVar "src")
                             [CL.mkApply("_data", [CL.mkVar "src"])])  
67                      (* constructor from tensor struct *)                      (* constructor from tensor struct *)
68                        val (constrProto2, constrDef2) = mkConstr(name,                        val (constrProto2, constrDef2) = mkConstr' (
                             [CL.PARAM([],  
69                                  CL.T_Named(concat["struct ", RN.tensorStruct shape, " const &"]),                                  CL.T_Named(concat["struct ", RN.tensorStruct shape, " const &"]),
70                                  "ten")                              "ten", CL.mkSelect(CL.mkVar "ten", "_data"))
                               ],  
                             [CL.mkApply("_data", [CL.mkSelect(CL.mkVar "ten", "_data")])])  
71                      (* copy constructor *)                      (* copy constructor *)
72                        val (constrProto3, constrDef3) = mkConstr (name,                        val (constrProto3, constrDef3) = mkConstr' (
73                              [CL.PARAM([], CL.T_Named(name ^ " const &"), "ten")],                              CL.T_Named(name ^ " const &"), "ten",
74                              [CL.mkApply("_data", [CL.mkSelect(CL.mkVar "ten", "_data")])])                              CL.mkSelect(CL.mkVar "ten", "_data"))
75                      (* subscript operator *)                        val thisData = CL.mkIndirect(CL.mkVar "this", "_data")
                       val subscriptDcl = CL.D_Func([], CL.T_Named(realTyName ^ " const &"),  
                             [], "operator[]",  
                             [CL.PARAM([], CL.uint32, "i")],  
                             CL.mkReturn(SOME(CL.mkSubscript(thisData, CL.mkVar "i"))))  
                     (* address at function *)  
                       val addrAtDcl = CL.D_Func([], CL.constPtrTy(realTy), [], "addr",  
                             [CL.PARAM([], CL.uint32, "i")],  
                             CL.mkReturn(SOME(CL.mkAddrOf(CL.mkSubscript(thisData, CL.mkVar "i")))))  
76                      (* last vector as tensor_ref *)                      (* last vector as tensor_ref *)
77                        val lastDcl = (case shape                        val lastDcl = (case shape
78                              of [] => raise Fail "unexpected TensorRef[]"                              of [] => raise Fail "unexpected TensorRef[]"
# Line 92  Line 87 
87                                  ] end                                  ] end
88                              (* end case *))                              (* end case *))
89                        val members = CL.mkVarDcl(CL.constPtrTy realTy, "_data") ::                        val members = CL.mkVarDcl(CL.constPtrTy realTy, "_data") ::
90                                    constrProto1 :: constrProto2 :: constrProto3 ::                                    constrProto1 :: constrProto2 :: constrProto3 :: lastDcl
                                   subscriptDcl ::  
                                   addrAtDcl :: lastDcl  
91                        val structDcl = CL.D_ClassDef{                        val structDcl = CL.D_ClassDef{
92                                name = name,                                name = name,
93                                args = NONE,                                args = NONE,
94                                from = NONE,                                from = SOME baseCls,
95                                public = members,                                public = members,
96                                protected = [],                                protected = [],
97                                private = []                                private = []
# Line 109  Line 102 
102                    | Ty.TensorTy shape => let                    | Ty.TensorTy shape => let
103                        val len = List.foldl Int.* 1 shape                        val len = List.foldl Int.* 1 shape
104                        val name = RN.tensorStruct shape                        val name = RN.tensorStruct shape
105                        val thisData = CL.mkIndirect(CL.mkVar "this", "_data")                        val baseCls = concat[
106                        val returnThis = CL.mkReturn(SOME(CL.mkUnOp(CL.%*, CL.mkVar "this")))                                "diderot::tensor<", realTyName, ",",
107                      (* code for initializing a tensor from pointer (src). *)                                Int.toString(List.foldl Int.* 1 shape), ">"
                       fun copyFromArray src = if (len < 4)  
                             then let  
                               fun cpy i = CL.mkAssign(  
                                     CL.mkSubscript(thisData, mkInt i),  
                                     CL.mkSubscript(src, mkInt i))  
                               in  
                                 CL.mkBlock (List.tabulate (len, cpy))  
                               end  
                             else CL.mkCall("std::memcpy", [  
                                 thisData, src,  
                                 CL.mkBinOp(mkInt len, CL.#*, CL.mkSizeof realTy)  
                               ])  
                     (* loop for initializing tensor from an initializer_list *)  
                       val copyFromInitializerList = [  
                               CL.mkDeclInit(CL.int32, "i", CL.mkInt 0),  
                               CL.mkFor(  
                                 CL.T_Named "auto",  
                                 [("it", CL.mkDispatch(CL.mkVar "il", "begin", []))],  
                                 CL.mkBinOp(CL.mkVar "it", CL.#!=, CL.mkDispatch(CL.mkVar "il", "end", [])),  
                                 [CL.mkUnOp(CL.%++, CL.mkVar "i"), CL.mkUnOp(CL.%++, CL.mkVar "it")],  
                                 CL.mkAssign(  
                                   CL.mkSubscript(thisData, CL.mkVar "i"),  
                                   CL.mkUnOp(CL.%*, CL.mkVar "it")))  
108                              ]                              ]
109                          fun mkConstr (paramTy, paramId, arg) = CL.D_Constr (
110                                [], [], name,
111                                [CL.PARAM([], paramTy, paramId)],
112                                SOME([CL.mkApply(baseCls, [arg])], CL.mkBlock[]))
113                      (* default constructor *)                      (* default constructor *)
114                        val constrDcl1 = CL.D_Constr ([], [], name, [], SOME([], CL.mkBlock[]))                        val constrDcl1 = CL.D_Constr (
115                                [], [], name, [], SOME([CL.mkApply(baseCls, [])], CL.mkBlock[]))
116                      (* constructor from initializer list *)                      (* constructor from initializer list *)
117                        val constrDcl2 = CL.D_Constr([], [], name,                        val constrDcl2 = mkConstr (
118                              [CL.PARAM([], CL.T_Template("std::initializer_list", [realTy]), "il")],                              CL.T_Template("std::initializer_list", [realTy]), "const & il",
119                              SOME([], CL.mkBlock copyFromInitializerList))                              CL.mkVar "il")
120                      (* constructor from float/double pointer *)                      (* constructor from float/double pointer *)
121                        val constrDcl3 = CL.D_Constr([], [], name,                        val constrDcl3 = mkConstr (
122                              [CL.PARAM([], CL.constPtrTy realTy, "src")],                              CL.constPtrTy realTy, "src", CL.mkVar "src")
                             SOME([], copyFromArray (CL.mkVar "src")))  
123                      (* copy constructor *)                      (* copy constructor *)
124                        val constrDcl4 = CL.D_Constr([], [], name,                        val constrDcl4 = mkConstr (
125                              [CL.PARAM([], CL.T_Named(name ^ " const &"), "ten")],                              CL.T_Named(name ^ " const &"), "ten",
126                              SOME([], copyFromArray (CL.mkSelect(CL.mkVar "ten", "_data"))))                              CL.mkSelect(CL.mkVar "ten", "_data"))
127                      (* destructor *)                      (* destructor *)
128                        val destrDcl = CL.D_Destr([], [], name, SOME(CL.mkBlock[]))                        val destrDcl = CL.D_Destr([], [], name, SOME(CL.mkBlock[]))
129                          val thisData = CL.mkIndirect(CL.mkVar "this", "_data")
130                          val returnThis = CL.mkReturn(SOME(CL.mkUnOp(CL.%*, CL.mkVar "this")))
131                      (* assignment from Tensor *)                      (* assignment from Tensor *)
132                        val (assignProto1, assignDef1) = mkMemberFn(name,                        val (assignProto1, assignDef1) = mkMemberFn(name,
133                                CL.T_Named(name ^ " &"), "operator=",                                CL.T_Named(name ^ " &"), "operator=",
134                                [CL.PARAM([], CL.T_Named name, "const & src")],                                [CL.PARAM([], CL.T_Named name, "const & src")],
135                                CL.mkBlock[                                CL.mkBlock[
136                                    copyFromArray(CL.mkSelect(CL.mkVar "src", "_data")),                                    CL.mkCall("this->copy", [CL.mkSelect(CL.mkVar "src", "_data")]),
137                                    returnThis                                    returnThis
138                                  ])                                  ])
139                      (* assignment from TensorRef *)                      (* assignment from TensorRef *)
# Line 165  Line 141 
141                                CL.T_Named(name ^ " &"), "operator=",                                CL.T_Named(name ^ " &"), "operator=",
142                                [CL.PARAM([], CL.T_Named(RN.tensorRefStruct shape), "const & src")],                                [CL.PARAM([], CL.T_Named(RN.tensorRefStruct shape), "const & src")],
143                                CL.mkBlock[                                CL.mkBlock[
144                                    copyFromArray(CL.mkSelect(CL.mkVar "src", "_data")),                                    CL.mkCall("this->copy", [CL.mkSelect(CL.mkVar "src", "_data")]),
145                                    returnThis                                    returnThis
146                                  ])                                  ])
147                      (* assignment from initializer list *)                      (* assignment from initializer list *)
148                        val (assignProto3, assignDef3) = mkMemberFn(name,                        val (assignProto3, assignDef3) = mkMemberFn(name,
149                                CL.T_Named(name ^ " &"), "operator=",                                CL.T_Named(name ^ " &"), "operator=",
150                                [CL.PARAM([], CL.T_Template("std::initializer_list", [realTy]), "il")],                                [CL.PARAM([], CL.T_Template("std::initializer_list", [realTy]), "const & il")],
151                                CL.mkBlock(copyFromInitializerList @ [returnThis]))                                CL.mkBlock[
152                                      CL.mkCall("this->copy", [CL.mkVar "il"]),
153                                      returnThis
154                                    ])
155                      (* assignment from array *)                      (* assignment from array *)
156                        val (assignProto4, assignDef4) = mkMemberFn(name,                        val (assignProto4, assignDef4) = mkMemberFn(name,
157                                CL.T_Named(name ^ " &"), "operator=",                                CL.T_Named(name ^ " &"), "operator=",
158                                [CL.PARAM([], CL.constPtrTy realTy, "src")],                                [CL.PARAM([], CL.constPtrTy realTy, "src")],
159                                CL.mkBlock[                                CL.mkBlock[
160                                    copyFromArray(CL.mkVar "src"),                                    CL.mkCall("this->copy", [CL.mkVar "src"]),
161                                    returnThis                                    returnThis
162                                  ])                                  ])
                     (* subscript operator *)  
                       val subscriptDcl = CL.D_Func([], CL.T_Named(realTyName ^ " &"), [], "operator[]",  
                             [CL.PARAM([], CL.uint32, "i")],  
                             CL.mkReturn(SOME(CL.mkSubscript(thisData, CL.mkVar "i"))))  
                     (* address at function *)  
                       val addrAtDcl = CL.D_Func([], CL.constPtrTy realTy, [], "addr",  
                             [CL.PARAM([], CL.uint32, "i")],  
                             CL.mkReturn(SOME(CL.mkAddrOf(CL.mkSubscript(thisData, CL.mkVar "i")))))  
163                      (* last vector as tensor_ref *)                      (* last vector as tensor_ref *)
164                        val lastDcl = (case shape                        val lastDcl = (case shape
165                              of [] => raise Fail "unexpected TensorTy[]"                              of [] => raise Fail "unexpected TensorTy[]"
# Line 205  Line 176 
176                        val structDcl = CL.D_ClassDef{                        val structDcl = CL.D_ClassDef{
177                                name = name,                                name = name,
178                                args = NONE,                                args = NONE,
179                                from = NONE,                                from = SOME baseCls,
180                                public =                                public =
181                                    CL.mkVarDcl(CL.T_Array(realTy, SOME len), "_data") ::                                    CL.mkVarDcl(CL.T_Array(realTy, SOME len), "_data") ::
182                                    constrDcl1 :: constrDcl2 :: constrDcl3 :: constrDcl4 ::                                    constrDcl1 :: constrDcl2 :: constrDcl3 :: constrDcl4 ::
183                                    destrDcl ::                                    destrDcl ::
184                                    assignProto1 :: assignProto2 :: assignProto3 :: assignProto4 ::                                    assignProto1 :: assignProto2 :: assignProto3 :: assignProto4 ::
                                   subscriptDcl ::  
                                   addrAtDcl ::  
185                                    lastDcl,                                    lastDcl,
186                                protected = [],                                protected = [],
187                                private = []                                private = []
188                              }                              }
189                        val fnDefs = assignDef4 :: assignDef3 :: assignDef2 :: assignDef1 :: fnDefs                        val fnDefs = assignDef1 :: assignDef2 :: assignDef3 :: assignDef4 :: fnDefs
190                        in                        in
191                          (structDcl :: tyDcls, fnDefs)                          (structDcl :: tyDcls, fnDefs)
192                        end                        end

Legend:
Removed from v.4303  
changed lines
  Added in v.4304

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