projects
/
libfirm
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
scripts: Generate accessor functions for nodes with a variable/dynamic number of...
[libfirm]
/
ir
/
stat
/
stat_timing.h
diff --git
a/ir/stat/stat_timing.h
b/ir/stat/stat_timing.h
index
517f201
..
645b768
100644
(file)
--- a/
ir/stat/stat_timing.h
+++ b/
ir/stat/stat_timing.h
@@
-21,20
+21,27
@@
* @file
* @brief OS abstraction from time measurement
* @author Sebastian Hack, Michael Beck, Matthias Braun
* @file
* @brief OS abstraction from time measurement
* @author Sebastian Hack, Michael Beck, Matthias Braun
- * @version $Id$
*/
#ifndef FIRM_STAT_TIMING_H
#define FIRM_STAT_TIMING_H
*/
#ifndef FIRM_STAT_TIMING_H
#define FIRM_STAT_TIMING_H
-#if defined(__i386__) || defined(_M_IX86)
+#if defined(__i386__) || defined(_M_IX86)
|| defined(_M_X64)
#if defined(__GNUC__)
typedef unsigned long long timing_ticks_t;
#if defined(__GNUC__)
typedef unsigned long long timing_ticks_t;
-static inline timing_ticks_t __timing_ticks(void) { timing_ticks_t result; __asm__ __volatile__ ("rdtsc" : "=A" (result)); return result; }
+static inline timing_ticks_t __timing_ticks(void)
+{
+ unsigned h;
+ unsigned l;
+ __asm__ volatile("rdtsc" : "=a" (l), "=d" (h));
+ return (timing_ticks_t)h << 32 | l;
+}
+
#elif defined(_MSC_VER)
#elif defined(_MSC_VER)
-/* win32 implementation using rdtsc */
+#include <intrin.h>
+
typedef unsigned __int64 timing_ticks_t;
typedef unsigned __int64 timing_ticks_t;
-static __inline timing_ticks_t __timing_ticks(void) {
__asm { rdtsc }
}
+static __inline timing_ticks_t __timing_ticks(void) {
return __rdtsc();
}
#else
#error need a 64bit int type
#endif
#else
#error need a 64bit int type
#endif
@@
-47,7
+54,7
@@
static __inline timing_ticks_t __timing_ticks(void) { __asm { rdtsc } }
#define timing_ticks_ulong(t) ((unsigned long) (t))
#define timing_ticks_dbl(t) ((double) (t))
#define timing_ticks_ulong(t) ((unsigned long) (t))
#define timing_ticks_dbl(t) ((double) (t))
-#else /* !__i386__ */
+#else /* !__i386__
&& !__x86_64
*/
#include <sys/time.h>
#include <sys/time.h>
@@
-60,28
+67,28
@@
typedef struct timeval timing_ticks_t;
* /usr/include/sys/time.h
*/
#define timing_ticks_cmp(a, b, CMP) \
* /usr/include/sys/time.h
*/
#define timing_ticks_cmp(a, b, CMP) \
- (((a).tv_sec == (b).tv_sec) ?
\
+ (((a).tv_sec == (b).tv_sec) ? \
((a).tv_usec CMP (b).tv_usec) : \
((a).tv_sec CMP (b).tv_sec))
#define timing_ticks_add(r, a) \
((a).tv_usec CMP (b).tv_usec) : \
((a).tv_sec CMP (b).tv_sec))
#define timing_ticks_add(r, a) \
- do {
\
+ do { \
(r).tv_sec = (r).tv_sec + (a).tv_sec; \
(r).tv_usec = (r).tv_usec + (a).tv_usec; \
(r).tv_sec = (r).tv_sec + (a).tv_sec; \
(r).tv_usec = (r).tv_usec + (a).tv_usec; \
- if ((r).tv_usec >= 1000000) {
\
+ if ((r).tv_usec >= 1000000) { \
++(r).tv_sec; \
(r).tv_usec -= 1000000; \
++(r).tv_sec; \
(r).tv_usec -= 1000000; \
- }
\
+ } \
} while (0)
#define timing_ticks_sub(r, a) \
} while (0)
#define timing_ticks_sub(r, a) \
- do {
\
- (r).tv_sec = (r).tv_sec - (a).tv_sec; \
+ do { \
+ (r).tv_sec = (r).tv_sec - (a).tv_sec; \
(r).tv_usec = (r).tv_usec - (a).tv_usec; \
(r).tv_usec = (r).tv_usec - (a).tv_usec; \
- if ((r).tv_usec < 0) {
\
- --(r).tv_sec;
\
- (r).tv_usec += 1000000;
\
- }
\
+ if ((r).tv_usec < 0) { \
+ --(r).tv_sec; \
+ (r).tv_usec += 1000000; \
+ } \
} while (0)
#define timing_ticks_ulong(t) ((unsigned long) ((t).tv_usec + 1000000 * (t).tv_sec))
} while (0)
#define timing_ticks_ulong(t) ((unsigned long) ((t).tv_usec + 1000000 * (t).tv_sec))