X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fstat%2Fstat_timing.h;h=d50addbc9bd8ba88c812f0dc40c5280c611e4273;hb=d2b8adc12afc99ec5f04d530638803356f8be9f6;hp=76826188e94ba9a36d70d136b9fa608db2167a43;hpb=e736ec171f5a02484ec01a2cebc93cf5b84aeec4;p=libfirm diff --git a/ir/stat/stat_timing.h b/ir/stat/stat_timing.h index 76826188e..d50addbc9 100644 --- a/ir/stat/stat_timing.h +++ b/ir/stat/stat_timing.h @@ -1,64 +1,38 @@ - -#ifndef _TICKS_H -#define _TICKS_H - /* - * To use the Pentium RDTSC timer - * define TIMING_USE_RDTSC when including + * This file is part of libFirm. + * Copyright (C) 2012 University of Karlsruhe. */ -#define TIMING_USE_RDTSC - -#if defined(_WIN32) -#ifdef TIMING_USE_RDTSC +/** + * @file + * @brief OS abstraction from time measurement + * @author Sebastian Hack, Michael Beck, Matthias Braun + */ +#ifndef FIRM_STAT_TIMING_H +#define FIRM_STAT_TIMING_H -typedef unsigned __int64 timing_ticks_t; +#if defined(__i386__) || defined(_M_IX86) || defined(_M_X64) -__inline timing_ticks_t __timing_ticks(void) { __asm { rdtsc } } +#if defined(__GNUC__) +typedef unsigned long long timing_ticks_t; +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; +} -#define timing_ticks(t) ((t) = __timing_ticks()) -#define timing_ticks_init(t) ((t) = 0) -#define timing_ticks_cmp(a, b, cmp) ((a) cmp (b)) -#define timing_ticks_sub(r, a) ((r) = (r) - (a)) -#define timing_ticks_add(r, a) ((r) = (r) + (a)) -#define timing_ticks_ulong(t) ((unsigned long) (t)) -#define timing_ticks_dbl(t) ((double) (t)) +#elif defined(_MSC_VER) +#include +typedef unsigned __int64 timing_ticks_t; +static __inline timing_ticks_t __timing_ticks(void) { return __rdtsc(); } #else -#error NOT IMPLEMENTED YET -#endif /* TIMING_USE_RDTSC */ - -typedef struct { - int dummy; -} timing_sched_env_t; - -#else /* POSIX/Linux stuff */ - -#include -#include -#include - -/* define GNU macro for processor affinity stuff if on linux */ -#if defined __linux__ && !defined __USE_GNU -#define __USE_GNU +#error need a 64bit int type #endif -#include -typedef struct { -#ifdef _POSIX_PRIORITY_SCHEDULING - struct sched_param params; -#endif - int scheduler; -#ifdef __linux__ - cpu_set_t affinity; -#endif -} timing_sched_env_t; - -/* only use rdtsc on GNU C with x86 */ -#if defined TIMING_USE_RDTSC && defined __GNUC__ && defined __i386__ - -typedef unsigned long long timing_ticks_t; -#define timing_ticks(t) __asm__ __volatile__ ("rdtsc" : "=A" (t)) +#define timing_ticks(t) ((t) = __timing_ticks()) #define timing_ticks_init(t) ((t) = 0) #define timing_ticks_cmp(a, b, cmp) ((a) cmp (b)) #define timing_ticks_sub(r, a) ((r) = (r) - (a)) @@ -66,65 +40,49 @@ typedef unsigned long long timing_ticks_t; #define timing_ticks_ulong(t) ((unsigned long) (t)) #define timing_ticks_dbl(t) ((double) (t)) -#else +#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)) #define timing_ticks_dbl(t) (((t).tv_usec + 1000000.0 * (t).tv_sec)) -#endif /* TIMING_USE_RDTSC ... */ - -#endif /* _WIN32 */ - -/** - * Set the current schedule parameters. - * @return 1, if succeeded, 0 if not (see errno, for details). - */ -int timing_sched_set(const timing_sched_env_t *env); - -/** - * Get the schedule parameters. - * @return 1, if succeeded, 0 if not (see errno, for details). - */ -timing_sched_env_t *timing_sched_get(timing_sched_env_t *env); +#endif -/** - * Prepare schedule parameters which limit the process on one CPU - * and set the maximum task priority. - * @return The paramter @p env. - */ -timing_sched_env_t *timing_sched_prepare_max_prio(timing_sched_env_t *env); +void timing_enter_max_prio(void); +void timing_leave_max_prio(void); -#endif /* _TICKS_H */ +#endif