2 * This file is part of libFirm.
3 * Copyright (C) 2012 University of Karlsruhe.
8 * @brief OS abstraction from time measurement
9 * @author Sebastian Hack, Michael Beck, Matthias Braun
11 #ifndef FIRM_STAT_TIMING_H
12 #define FIRM_STAT_TIMING_H
14 #if defined(__i386__) || defined(_M_IX86) || defined(_M_X64)
17 typedef unsigned long long timing_ticks_t;
18 static inline timing_ticks_t __timing_ticks(void)
22 __asm__ volatile("rdtsc" : "=a" (l), "=d" (h));
23 return (timing_ticks_t)h << 32 | l;
26 #elif defined(_MSC_VER)
29 typedef unsigned __int64 timing_ticks_t;
30 static __inline timing_ticks_t __timing_ticks(void) { return __rdtsc(); }
32 #error need a 64bit int type
35 #define timing_ticks(t) ((t) = __timing_ticks())
36 #define timing_ticks_init(t) ((t) = 0)
37 #define timing_ticks_cmp(a, b, cmp) ((a) cmp (b))
38 #define timing_ticks_sub(r, a) ((r) = (r) - (a))
39 #define timing_ticks_add(r, a) ((r) = (r) + (a))
40 #define timing_ticks_ulong(t) ((unsigned long) (t))
41 #define timing_ticks_dbl(t) ((double) (t))
43 #else /* !__i386__ && !__x86_64 */
47 typedef struct timeval timing_ticks_t;
48 #define timing_ticks(t) (gettimeofday(&(t), NULL))
49 #define timing_ticks_init(t) memset(&(t), 0, sizeof(t))
52 * This shamelessly stolen and modified from glibc's
53 * /usr/include/sys/time.h
55 #define timing_ticks_cmp(a, b, CMP) \
56 (((a).tv_sec == (b).tv_sec) ? \
57 ((a).tv_usec CMP (b).tv_usec) : \
58 ((a).tv_sec CMP (b).tv_sec))
60 #define timing_ticks_add(r, a) \
62 (r).tv_sec = (r).tv_sec + (a).tv_sec; \
63 (r).tv_usec = (r).tv_usec + (a).tv_usec; \
64 if ((r).tv_usec >= 1000000) { \
66 (r).tv_usec -= 1000000; \
70 #define timing_ticks_sub(r, a) \
72 (r).tv_sec = (r).tv_sec - (a).tv_sec; \
73 (r).tv_usec = (r).tv_usec - (a).tv_usec; \
74 if ((r).tv_usec < 0) { \
76 (r).tv_usec += 1000000; \
80 #define timing_ticks_ulong(t) ((unsigned long) ((t).tv_usec + 1000000 * (t).tv_sec))
81 #define timing_ticks_dbl(t) (((t).tv_usec + 1000000.0 * (t).tv_sec))
85 void timing_enter_max_prio(void);
86 void timing_leave_max_prio(void);