* Removed all Id tags.
[cacao.git] / src / vm / cycles-stats.h
index e8136116609a3cdeae396cb7e8f5ea72a8a99c50..d70c9d1cbde582cad5bc9ce380875dd45a1c1a64 100644 (file)
@@ -28,8 +28,6 @@
 
    Changes:
 
-   $Id$
-
 */
 
 #ifndef _CYCLES_STATS_H
@@ -47,6 +45,7 @@
     static const int CYCLES_STATS_##name##_DIV = (divisor);                 \
     static u4 cycles_stats_##name##_bins[(nbins) + 1] = { 0 };              \
     static u4 cycles_stats_##name##_count = 0;                              \
+    static u8 cycles_stats_##name##_total = 0;                              \
     static u8 cycles_stats_##name##_max = 0;                                \
     static u8 cycles_stats_##name##_min = 1000000000;
 
@@ -56,6 +55,7 @@
 #define CYCLES_STATS_COUNT(name,cyclesexpr)                                 \
     do {                                                                    \
         u8 cyc = (cyclesexpr);                                              \
+               cycles_stats_##name##_total += cyc;                                 \
         if (cyc > cycles_stats_##name##_max)                                \
             cycles_stats_##name##_max = cyc;                                \
         if (cyc < cycles_stats_##name##_min)                                \
         cycles_stats_##name##_count++;                                      \
     } while (0)
 
+#define CYCLES_STATS_COUNT_OVER(name,ovname,cyclesexpr)                     \
+    do {                                                                    \
+        u8 cyc = (cyclesexpr);                                              \
+        if (cyc / CYCLES_STATS_##name##_DIV >= CYCLES_STATS_##name##_MAX)   \
+            CYCLES_STATS_COUNT(ovname,cyc);                                 \
+    } while (0)
+
 #define CYCLES_STATS_PRINT(name,file)                                       \
     do {                                                                    \
         cycles_stats_print((file), #name,                                   \
             CYCLES_STATS_##name##_MAX, CYCLES_STATS_##name##_DIV,           \
             cycles_stats_##name##_bins, cycles_stats_##name##_count,        \
+            cycles_stats_##name##_total,                                    \
             cycles_stats_##name##_min, cycles_stats_##name##_max, 0);       \
     } while (0)
 
         cycles_stats_print((file), #name,                                   \
             CYCLES_STATS_##name##_MAX, CYCLES_STATS_##name##_DIV,           \
             cycles_stats_##name##_bins, cycles_stats_##name##_count,        \
+            cycles_stats_##name##_total,                                    \
             cycles_stats_##name##_min, cycles_stats_##name##_max, 1);       \
     } while (0)
 
+#define CYCLES_STATS_DECLARE_AND_START                                      \
+    u8 cycles_start = asm_get_cycle_count();                                \
+    u8 cycles_end;
+
+#define CYCLES_STATS_DECLARE_AND_START_WITH_OVERHEAD                        \
+    u8 cycles_start = asm_get_cycle_count();                                \
+    u8 cycles_overhead = asm_get_cycle_count();                             \
+    u8 cycles_end;
+
+#define CYCLES_STATS_END(name)                                              \
+    cycles_end = asm_get_cycle_count();                                     \
+    CYCLES_STATS_COUNT(name, cycles_end - cycles_start);
+
+#define CYCLES_STATS_END_WITH_OVERHEAD(name,ovname)                         \
+    cycles_end = asm_get_cycle_count();                                     \
+    CYCLES_STATS_COUNT(ovname, cycles_overhead - cycles_start);             \
+    CYCLES_STATS_COUNT(name, cycles_end - cycles_overhead);
+
 void cycles_stats_print(FILE *file,
                                            const char *name, int nbins, int div,
-                                           u4 *bins, u8 count, u8 min, u8 max,
+                                           u4 *bins, u8 count, u8 total, u8 min, u8 max,
                                                int overhead);
 
 
@@ -95,8 +122,13 @@ void cycles_stats_print(FILE *file,
 #define CYCLES_STATS_DECLARE(name,nbins,divisor)
 #define CYCLES_STATS_GET(var)
 #define CYCLES_STATS_COUNT(name,cyclesexpr)
+#define CYCLES_STATS_COUNT_OVER(name,ovname,cyclesexpr)
 #define CYCLES_STATS_PRINT(name,file)
 #define CYCLES_STATS_PRINT_OVERHEAD(name,file)
+#define CYCLES_STATS_DECLARE_AND_START
+#define CYCLES_STATS_DECLARE_AND_START_WITH_OVERHEAD
+#define CYCLES_STATS_END(name)
+#define CYCLES_STATS_END_WITH_OVERHEAD(name,ovname)
 
 #endif /* defined(ENABLE_CYCLES_STATS) */