bechordal_draw: Remove the write-only attribute max_color from struct draw_chordal_env_t.
[libfirm] / ir / stat / stat_timing.h
1 /*
2  * This file is part of libFirm.
3  * Copyright (C) 2012 University of Karlsruhe.
4  */
5
6 /**
7  * @file
8  * @brief   OS abstraction from time measurement
9  * @author  Sebastian Hack, Michael Beck, Matthias Braun
10  */
11 #ifndef FIRM_STAT_TIMING_H
12 #define FIRM_STAT_TIMING_H
13
14 #if defined(__i386__) || defined(_M_IX86) || defined(_M_X64)
15
16 #if defined(__GNUC__)
17 typedef unsigned long long timing_ticks_t;
18 static inline timing_ticks_t __timing_ticks(void)
19 {
20         unsigned h;
21         unsigned l;
22         __asm__ volatile("rdtsc" : "=a" (l), "=d" (h));
23         return (timing_ticks_t)h << 32 | l;
24 }
25
26 #elif defined(_MSC_VER)
27 #include <intrin.h>
28
29 typedef unsigned __int64 timing_ticks_t;
30 static __inline timing_ticks_t __timing_ticks(void) { return __rdtsc(); }
31 #else
32 #error need a 64bit int type
33 #endif
34
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))
42
43 #else /* !__i386__ && !__x86_64 */
44
45 #include <sys/time.h>
46
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))
50
51 /*
52  * This shamelessly stolen and modified from glibc's
53  * /usr/include/sys/time.h
54  */
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))
59
60 #define timing_ticks_add(r, a)                       \
61         do {                                             \
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) {                \
65                         ++(r).tv_sec;                            \
66                         (r).tv_usec -= 1000000;                  \
67                 }                                            \
68         } while (0)
69
70 #define timing_ticks_sub(r, a)                        \
71         do {                                              \
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) {                        \
75                         --(r).tv_sec;                             \
76                         (r).tv_usec += 1000000;                   \
77                 }                                             \
78         } while (0)
79
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))
82
83 #endif
84
85 void timing_enter_max_prio(void);
86 void timing_leave_max_prio(void);
87
88 #endif