X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;ds=sidebyside;f=ir%2Fstat%2Fstat_timing.h;h=645b76845109df93b4becc6adbd97f93885628c0;hb=76a6cf6ff4e6fdcf17c8e8530f006b538f1d954c;hp=e93d5e66aa6913c92fd4cd3824626d044866ef66;hpb=bd0527dc2b3757a255a5375a6815b26919a7852c;p=libfirm diff --git a/ir/stat/stat_timing.h b/ir/stat/stat_timing.h index e93d5e66a..645b76845 100644 --- a/ir/stat/stat_timing.h +++ b/ir/stat/stat_timing.h @@ -21,26 +21,30 @@ * @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 -#ifdef __i386__ - -#ifdef __GNUC__ +#if defined(__i386__) || defined(_M_IX86) || defined(_M_X64) +#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; } -#else -#if define _MSC_VER -/* win32 implementation using rdtsc */ +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) +#include + 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 -#endif #define timing_ticks(t) ((t) = __timing_ticks()) #define timing_ticks_init(t) ((t) = 0) @@ -50,41 +54,41 @@ 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)) -#else /* !__i386__ */ +#else /* !__i386__ && !__x86_64 */ #include typedef struct timeval timing_ticks_t; #define timing_ticks(t) (gettimeofday(&(t), NULL)) -#define timing_ticks_init(t) ((t).tv_sec = 0, (t).tv_usec = 0) +#define timing_ticks_init(t) memset(&(t), 0, sizeof(t)) /* * This shamelessly stolen and modified from glibc's * /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) \ - do { \ + do { \ (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; \ - } \ + } \ } 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; \ - 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))