sparc: use AddCC, SubCC, MulCC
[libfirm] / ir / stat / stat_timing.h
1 /*
2  * Copyright (C) 1995-2008 University of Karlsruhe.  All right reserved.
3  *
4  * This file is part of libFirm.
5  *
6  * This file may be distributed and/or modified under the terms of the
7  * GNU General Public License version 2 as published by the Free Software
8  * Foundation and appearing in the file LICENSE.GPL included in the
9  * packaging of this file.
10  *
11  * Licensees holding valid libFirm Professional Edition licenses may use
12  * this file in accordance with the libFirm Commercial License.
13  * Agreement provided with the Software.
14  *
15  * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
16  * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE.
18  */
19
20 /**
21  * @file
22  * @brief   OS abstraction from time measurement
23  * @author  Sebastian Hack, Michael Beck, Matthias Braun
24  * @version $Id$
25  */
26 #ifndef FIRM_STAT_TIMING_H
27 #define FIRM_STAT_TIMING_H
28
29 #if defined(__i386__) || defined(_M_IX86) || defined(_M_X64)
30
31 #if defined(__GNUC__)
32 typedef unsigned long long timing_ticks_t;
33 static inline timing_ticks_t __timing_ticks(void)
34 {
35         unsigned h;
36         unsigned l;
37         __asm__ volatile("rdtsc" : "=a" (l), "=d" (h));
38         return (timing_ticks_t)h << 32 | l;
39 }
40
41 #elif defined(_MSC_VER)
42 #include <intrin.h>
43
44 typedef unsigned __int64 timing_ticks_t;
45 static __inline timing_ticks_t __timing_ticks(void) { return __rdtsc(); }
46 #else
47 #error need a 64bit int type
48 #endif
49
50 #define timing_ticks(t)              ((t) = __timing_ticks())
51 #define timing_ticks_init(t)         ((t) = 0)
52 #define timing_ticks_cmp(a, b, cmp)  ((a) cmp (b))
53 #define timing_ticks_sub(r, a)       ((r) = (r) - (a))
54 #define timing_ticks_add(r, a)       ((r) = (r) + (a))
55 #define timing_ticks_ulong(t)        ((unsigned long) (t))
56 #define timing_ticks_dbl(t)          ((double) (t))
57
58 #else /* !__i386__ && !__x86_64 */
59
60 #include <sys/time.h>
61
62 typedef struct timeval timing_ticks_t;
63 #define timing_ticks(t)              (gettimeofday(&(t), NULL))
64 #define timing_ticks_init(t)         memset(&(t), 0, sizeof(t))
65
66 /*
67  * This shamelessly stolen and modified from glibc's
68  * /usr/include/sys/time.h
69  */
70 #define timing_ticks_cmp(a, b, CMP)   \
71   (((a).tv_sec == (b).tv_sec) ?       \
72    ((a).tv_usec CMP (b).tv_usec) :    \
73    ((a).tv_sec CMP (b).tv_sec))
74
75 #define timing_ticks_add(r, a)                       \
76         do {                                             \
77                 (r).tv_sec = (r).tv_sec + (a).tv_sec;        \
78                 (r).tv_usec = (r).tv_usec + (a).tv_usec;     \
79                 if ((r).tv_usec >= 1000000) {                \
80                         ++(r).tv_sec;                            \
81                         (r).tv_usec -= 1000000;                  \
82                 }                                            \
83         } while (0)
84
85 #define timing_ticks_sub(r, a)                        \
86         do {                                              \
87                 (r).tv_sec = (r).tv_sec - (a).tv_sec;         \
88                 (r).tv_usec = (r).tv_usec - (a).tv_usec;      \
89                 if ((r).tv_usec < 0) {                        \
90                         --(r).tv_sec;                             \
91                         (r).tv_usec += 1000000;                   \
92                 }                                             \
93         } while (0)
94
95 #define timing_ticks_ulong(t)        ((unsigned long) ((t).tv_usec + 1000000 * (t).tv_sec))
96 #define timing_ticks_dbl(t)          (((t).tv_usec + 1000000.0 * (t).tv_sec))
97
98 #endif
99
100 void timing_enter_max_prio(void);
101 void timing_leave_max_prio(void);
102
103 #endif