diff 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
line wrap: on
line diff
--- a/runtime/func.h	Wed Aug 11 03:13:28 2010 -0400
+++ b/runtime/func.h	Tue Aug 24 23:22:17 2010 -0400
@@ -33,12 +33,58 @@
 
 #define MethodName(name,type) f_ ## name ## AT_ ## type
 
+#ifdef ENABLE_PROFILING
+
+#define START_PROFILE \
+		gettimeofday(&time, NULL);\
+		cdata->accum = cdata->self_accum = 0;\
+		cdata->self_start = cdata->start = ((uint64_t)time.tv_sec) * 1000000ULL + ((uint64_t)time.tv_usec);
+
+#define PAUSE_SELF \
+		gettimeofday(&time, NULL);\
+		my_cdata->self_accum += ((uint64_t)time.tv_sec) * 1000000ULL + ((uint64_t)time.tv_usec) - my_cdata->self_start;
+		
+#define AND_TOTAL \
+		my_cdata->accum += ((uint64_t)time.tv_sec) * 1000000ULL + ((uint64_t)time.tv_usec) - my_cdata->start;
+
+#define RESUME_SELF \
+		gettimeofday(&time, NULL);\
+		my_cdata->self_start = ((uint64_t)time.tv_sec) * 1000000ULL + ((uint64_t)time.tv_usec);
+		
+#define AND_RESUME_TOTAL my_cdata->start = my_cdata->self_start;
+		
+#define EndFunc(name)	\
+		free_stack(ct, lv_ ## name);\
+		func = cdata->func;\
+		gettimeofday(&time, NULL);\
+		profile_counts[FUNC_ ## name]++;\
+		profile_totals[FUNC_ ## name] += ((uint64_t)time.tv_sec) * 1000000ULL + ((uint64_t)time.tv_usec) - cdata->start + cdata->accum;\
+		profile_selftotals[FUNC_ ## name] +=  ((uint64_t)time.tv_sec) * 1000000ULL + ((uint64_t)time.tv_usec) - cdata->self_start + cdata->self_accum;
+
+#else
+
+#define START_PROFILE
+#define PAUSE_SELF
+#define RESUME_SELF
+#define AND_TOTAL
+#define AND_RESUME_TOTAL
+
+#define EndFunc(name)	\
+		free_stack(ct, lv_ ## name);\
+		func = cdata->func;
+
+
+#endif
+
+#define EndFuncNoLocals	\
+		func = cdata->func;
 
 #define Func(name,numparams) \
 f_ ## name:\
 		for(idx = numparams; idx < cdata->num_params; ++idx)\
 			release_ref(cdata->params[idx]); cdata->num_params = numparams;\
 sf_ ## name:\
+		START_PROFILE\
 		lv_ ## name = alloc_stack(ct, sizeof(lt_ ## name));\
 		my_cdata = cdata;
 
@@ -50,32 +96,6 @@
 sf_ ## name:\
 		my_cdata = cdata;		
 
-#define EndFunc(name)	\
-		free_stack(ct, lv_ ## name);\
-		func = cdata->func;
-	
-#define EndFuncNoLocals	\
-		func = cdata->func;
-
-#define Method(name) \
-f_ ## name:\
-sf_ ## name:\
-		switch(get_blueprint(cdata->params[0])->type_id)\
-		{
-			
-#define EndMethod(name) \
-		default:\
-			printf("Type %d does not implement method %s\n", get_blueprint(cdata->params[0])->type_id, #name);\
-			cdata = alloc_cdata(ct, cdata, 0);\
-			cdata->func = FUNC_ ## name;\
-			goto _exception;\
-		}
-			
-			
-#define MethodDispatch(type_id,name,type_name) \
-		case type_id:\
-			goto m_ ## name ## AT_ ## type_name;
-			
 #define MethodImpl(name,type_name,mytype_id,numparams) \
 f_ ## name ## AT_ ## type_name:\
 sf_ ## name ## AT_ ## type_name:\
@@ -91,6 +111,7 @@
 			exit(1);\
 		}\
 m_ ## name ## AT_ ## type_name:\
+		START_PROFILE\
 		for(idx = numparams; idx < cdata->num_params; ++idx)\
 			release_ref(cdata->params[idx]); cdata->num_params = numparams;\
 		lv_ ## name ## AT_ ## type_name = alloc_stack(ct, sizeof(lt_ ## name ## AT_ ## type_name));\
@@ -113,6 +134,26 @@
 		for(idx = numparams; idx < cdata->num_params; ++idx)\
 			release_ref(cdata->params[idx]); cdata->num_params = numparams;\
 		my_cdata = cdata;
+
+		
+#define Method(name) \
+f_ ## name:\
+sf_ ## name:\
+		switch(get_blueprint(cdata->params[0])->type_id)\
+		{
+			
+#define EndMethod(name) \
+		default:\
+			printf("Type %d does not implement method %s\n", get_blueprint(cdata->params[0])->type_id, #name);\
+			cdata = alloc_cdata(ct, cdata, 0);\
+			cdata->func = FUNC_ ## name;\
+			goto _exception;\
+		}
+			
+			
+#define MethodDispatch(type_id,name,type_name) \
+		case type_id:\
+			goto m_ ## name ## AT_ ## type_name;
 			
 #define NumParams
 #define CallSpace
@@ -175,11 +216,13 @@
 	cdata->func = RES_  ## resumeto ## _ ## myname;\
 	cdata->num_params = numparams + ((t_Worker *)tocall)->payload.Count;\
 	cdata->vars = lv_ ## myname;\
-	func = ((t_Worker *)tocall)->payload.Index;
+	func = ((t_Worker *)tocall)->payload.Index;\
+	PAUSE_SELF
 
 #define ValCallPostlude(resumeto,myname)\
 r ## resumeto ## _ ## myname:\
 	my_cdata = cdata->lastframe;\
+	RESUME_SELF\
 	lv_ ## myname = cdata->vars;
 
 
@@ -187,9 +230,21 @@
 			cdata->func = RES_  ## resumeto ## _ ## myname;\
 			cdata->num_params = numparams;\
 			cdata->vars = lv_ ## myname;\
+			if(FUNC_ ## tocall == FUNC_ ## myname) {\
+				PAUSE_SELF\
+				AND_TOTAL\
+			} else if (FUNC_ ## tocall != FUNC_PL_ && FUNC_ ## tocall != FUNC_MN_ && FUNC_ ## tocall != FUNC_TM_ && FUNC_ ## tocall != FUNC_DV_ && FUNC_ ## tocall != FUNC_If) {\
+				PAUSE_SELF\
+			}\
 			goto sf_ ## tocall;\
 r ## resumeto ## _ ## myname:\
 			my_cdata = cdata->lastframe;\
+			if(FUNC_ ## tocall == FUNC_ ## myname) {\
+				RESUME_SELF\
+				AND_RESUME_TOTAL\
+			} else if (FUNC_ ## tocall != FUNC_PL_ && FUNC_ ## tocall != FUNC_MN_ && FUNC_ ## tocall != FUNC_TM_ && FUNC_ ## tocall != FUNC_DV_ && FUNC_ ## tocall != FUNC_If) {\
+				RESUME_SELF\
+			}\
 			lv_ ## myname = cdata->vars;