comparison runtime/func.h @ 105:43cc42df26cc

Various compiler improvements
author Mike Pavone <pavone@retrodev.com>
date Tue, 24 Aug 2010 23:22:17 -0400
parents f4fc0a98088a
children e5627038b7e7 60906f8803ef
comparison
equal deleted inserted replaced
103:7428aa5d6ade 105:43cc42df26cc
31 #endif 31 #endif
32 32
33 33
34 #define MethodName(name,type) f_ ## name ## AT_ ## type 34 #define MethodName(name,type) f_ ## name ## AT_ ## type
35 35
36 36 #ifdef ENABLE_PROFILING
37 #define Func(name,numparams) \ 37
38 f_ ## name:\ 38 #define START_PROFILE \
39 for(idx = numparams; idx < cdata->num_params; ++idx)\ 39 gettimeofday(&time, NULL);\
40 release_ref(cdata->params[idx]); cdata->num_params = numparams;\ 40 cdata->accum = cdata->self_accum = 0;\
41 sf_ ## name:\ 41 cdata->self_start = cdata->start = ((uint64_t)time.tv_sec) * 1000000ULL + ((uint64_t)time.tv_usec);
42 lv_ ## name = alloc_stack(ct, sizeof(lt_ ## name));\ 42
43 my_cdata = cdata; 43 #define PAUSE_SELF \
44 44 gettimeofday(&time, NULL);\
45 45 my_cdata->self_accum += ((uint64_t)time.tv_sec) * 1000000ULL + ((uint64_t)time.tv_usec) - my_cdata->self_start;
46 #define FuncNoLocals(name,numparams) \ 46
47 f_ ## name:\ 47 #define AND_TOTAL \
48 for(idx = numparams; idx < cdata->num_params; ++idx)\ 48 my_cdata->accum += ((uint64_t)time.tv_sec) * 1000000ULL + ((uint64_t)time.tv_usec) - my_cdata->start;
49 release_ref(cdata->params[idx]); cdata->num_params = numparams;\ 49
50 sf_ ## name:\ 50 #define RESUME_SELF \
51 my_cdata = cdata; 51 gettimeofday(&time, NULL);\
52 my_cdata->self_start = ((uint64_t)time.tv_sec) * 1000000ULL + ((uint64_t)time.tv_usec);
53
54 #define AND_RESUME_TOTAL my_cdata->start = my_cdata->self_start;
55
56 #define EndFunc(name) \
57 free_stack(ct, lv_ ## name);\
58 func = cdata->func;\
59 gettimeofday(&time, NULL);\
60 profile_counts[FUNC_ ## name]++;\
61 profile_totals[FUNC_ ## name] += ((uint64_t)time.tv_sec) * 1000000ULL + ((uint64_t)time.tv_usec) - cdata->start + cdata->accum;\
62 profile_selftotals[FUNC_ ## name] += ((uint64_t)time.tv_sec) * 1000000ULL + ((uint64_t)time.tv_usec) - cdata->self_start + cdata->self_accum;
63
64 #else
65
66 #define START_PROFILE
67 #define PAUSE_SELF
68 #define RESUME_SELF
69 #define AND_TOTAL
70 #define AND_RESUME_TOTAL
52 71
53 #define EndFunc(name) \ 72 #define EndFunc(name) \
54 free_stack(ct, lv_ ## name);\ 73 free_stack(ct, lv_ ## name);\
55 func = cdata->func; 74 func = cdata->func;
56 75
76
77 #endif
78
57 #define EndFuncNoLocals \ 79 #define EndFuncNoLocals \
58 func = cdata->func; 80 func = cdata->func;
59 81
60 #define Method(name) \ 82 #define Func(name,numparams) \
61 f_ ## name:\ 83 f_ ## name:\
84 for(idx = numparams; idx < cdata->num_params; ++idx)\
85 release_ref(cdata->params[idx]); cdata->num_params = numparams;\
62 sf_ ## name:\ 86 sf_ ## name:\
63 switch(get_blueprint(cdata->params[0])->type_id)\ 87 START_PROFILE\
64 { 88 lv_ ## name = alloc_stack(ct, sizeof(lt_ ## name));\
65 89 my_cdata = cdata;
66 #define EndMethod(name) \ 90
67 default:\ 91
68 printf("Type %d does not implement method %s\n", get_blueprint(cdata->params[0])->type_id, #name);\ 92 #define FuncNoLocals(name,numparams) \
69 cdata = alloc_cdata(ct, cdata, 0);\ 93 f_ ## name:\
70 cdata->func = FUNC_ ## name;\ 94 for(idx = numparams; idx < cdata->num_params; ++idx)\
71 goto _exception;\ 95 release_ref(cdata->params[idx]); cdata->num_params = numparams;\
72 } 96 sf_ ## name:\
73 97 my_cdata = cdata;
74 98
75 #define MethodDispatch(type_id,name,type_name) \
76 case type_id:\
77 goto m_ ## name ## AT_ ## type_name;
78
79 #define MethodImpl(name,type_name,mytype_id,numparams) \ 99 #define MethodImpl(name,type_name,mytype_id,numparams) \
80 f_ ## name ## AT_ ## type_name:\ 100 f_ ## name ## AT_ ## type_name:\
81 sf_ ## name ## AT_ ## type_name:\ 101 sf_ ## name ## AT_ ## type_name:\
82 if (cdata->num_params < 1)\ 102 if (cdata->num_params < 1)\
83 {\ 103 {\
89 {\ 109 {\
90 puts("uh oh, need conversion and that's not implemented yet!");\ 110 puts("uh oh, need conversion and that's not implemented yet!");\
91 exit(1);\ 111 exit(1);\
92 }\ 112 }\
93 m_ ## name ## AT_ ## type_name:\ 113 m_ ## name ## AT_ ## type_name:\
114 START_PROFILE\
94 for(idx = numparams; idx < cdata->num_params; ++idx)\ 115 for(idx = numparams; idx < cdata->num_params; ++idx)\
95 release_ref(cdata->params[idx]); cdata->num_params = numparams;\ 116 release_ref(cdata->params[idx]); cdata->num_params = numparams;\
96 lv_ ## name ## AT_ ## type_name = alloc_stack(ct, sizeof(lt_ ## name ## AT_ ## type_name));\ 117 lv_ ## name ## AT_ ## type_name = alloc_stack(ct, sizeof(lt_ ## name ## AT_ ## type_name));\
97 my_cdata = cdata; 118 my_cdata = cdata;
98 119
111 }\ 132 }\
112 m_ ## name ## AT_ ## type_name:\ 133 m_ ## name ## AT_ ## type_name:\
113 for(idx = numparams; idx < cdata->num_params; ++idx)\ 134 for(idx = numparams; idx < cdata->num_params; ++idx)\
114 release_ref(cdata->params[idx]); cdata->num_params = numparams;\ 135 release_ref(cdata->params[idx]); cdata->num_params = numparams;\
115 my_cdata = cdata; 136 my_cdata = cdata;
137
138
139 #define Method(name) \
140 f_ ## name:\
141 sf_ ## name:\
142 switch(get_blueprint(cdata->params[0])->type_id)\
143 {
144
145 #define EndMethod(name) \
146 default:\
147 printf("Type %d does not implement method %s\n", get_blueprint(cdata->params[0])->type_id, #name);\
148 cdata = alloc_cdata(ct, cdata, 0);\
149 cdata->func = FUNC_ ## name;\
150 goto _exception;\
151 }
152
153
154 #define MethodDispatch(type_id,name,type_name) \
155 case type_id:\
156 goto m_ ## name ## AT_ ## type_name;
116 157
117 #define NumParams 158 #define NumParams
118 #define CallSpace 159 #define CallSpace
119 160
120 #define Param(num,convtypeid) \ 161 #define Param(num,convtypeid) \
173 ++last_vcparam;\ 214 ++last_vcparam;\
174 }\ 215 }\
175 cdata->func = RES_ ## resumeto ## _ ## myname;\ 216 cdata->func = RES_ ## resumeto ## _ ## myname;\
176 cdata->num_params = numparams + ((t_Worker *)tocall)->payload.Count;\ 217 cdata->num_params = numparams + ((t_Worker *)tocall)->payload.Count;\
177 cdata->vars = lv_ ## myname;\ 218 cdata->vars = lv_ ## myname;\
178 func = ((t_Worker *)tocall)->payload.Index; 219 func = ((t_Worker *)tocall)->payload.Index;\
220 PAUSE_SELF
179 221
180 #define ValCallPostlude(resumeto,myname)\ 222 #define ValCallPostlude(resumeto,myname)\
181 r ## resumeto ## _ ## myname:\ 223 r ## resumeto ## _ ## myname:\
182 my_cdata = cdata->lastframe;\ 224 my_cdata = cdata->lastframe;\
225 RESUME_SELF\
183 lv_ ## myname = cdata->vars; 226 lv_ ## myname = cdata->vars;
184 227
185 228
186 #define Call(tocall, numparams, resumeto, myname)\ 229 #define Call(tocall, numparams, resumeto, myname)\
187 cdata->func = RES_ ## resumeto ## _ ## myname;\ 230 cdata->func = RES_ ## resumeto ## _ ## myname;\
188 cdata->num_params = numparams;\ 231 cdata->num_params = numparams;\
189 cdata->vars = lv_ ## myname;\ 232 cdata->vars = lv_ ## myname;\
233 if(FUNC_ ## tocall == FUNC_ ## myname) {\
234 PAUSE_SELF\
235 AND_TOTAL\
236 } else if (FUNC_ ## tocall != FUNC_PL_ && FUNC_ ## tocall != FUNC_MN_ && FUNC_ ## tocall != FUNC_TM_ && FUNC_ ## tocall != FUNC_DV_ && FUNC_ ## tocall != FUNC_If) {\
237 PAUSE_SELF\
238 }\
190 goto sf_ ## tocall;\ 239 goto sf_ ## tocall;\
191 r ## resumeto ## _ ## myname:\ 240 r ## resumeto ## _ ## myname:\
192 my_cdata = cdata->lastframe;\ 241 my_cdata = cdata->lastframe;\
242 if(FUNC_ ## tocall == FUNC_ ## myname) {\
243 RESUME_SELF\
244 AND_RESUME_TOTAL\
245 } else if (FUNC_ ## tocall != FUNC_PL_ && FUNC_ ## tocall != FUNC_MN_ && FUNC_ ## tocall != FUNC_TM_ && FUNC_ ## tocall != FUNC_DV_ && FUNC_ ## tocall != FUNC_If) {\
246 RESUME_SELF\
247 }\
193 lv_ ## myname = cdata->vars; 248 lv_ ## myname = cdata->vars;
194 249
195 250
196 #define FreeCall\ 251 #define FreeCall\
197 temp_cdata = cdata->lastframe;\ 252 temp_cdata = cdata->lastframe;\