00001 #ifndef TBX_TIMING_H
00002 #define TBX_TIMING_H
00003
00004 #include <sys/types.h>
00005 #include <sys/time.h>
00006
00007
00008
00009
00010
00011
00012
00013 typedef union u_tbx_tick
00014 {
00015 unsigned long long tick;
00016
00017 struct
00018 {
00019 unsigned long low;
00020 unsigned long high;
00021 } sub;
00022
00023 struct timeval timev;
00024 } tbx_tick_t, *p_tbx_tick_t;
00025
00026 #if defined(SCS_TYPECPU_ITANIUM)
00027 #define TBX_GET_TICK(t) \
00028 __asm__ __volatile__("mov %0=ar.itc" : "=r"((t).tick) :: "memory")
00029 #define TBX_TICK_RAW_DIFF(t1, t2) \
00030 ((t2).tick - (t1).tick)
00031
00032
00033 #elif defined(SCS_TYPECPU_X86)
00034 #define TBX_GET_TICK(t) \
00035 __asm__ volatile("cpuid; rdtsc" : "=a" ((t).sub.low), "=d" ((t).sub.high))
00036 #define TBX_TICK_RAW_DIFF(t1, t2) \
00037 ((t2).tick - (t1).tick)
00038
00039 #elif defined(SCS_TYPECPU_ALPHA)
00040 #define TBX_GET_TICK(t) \
00041 __asm__ volatile("rpcc %0\n\t" : "=r"((t).tick))
00042 #define TBX_TICK_RAW_DIFF(t1, t2) \
00043 (((t2).tick & 0xFFFFFFFF) - ((t1).tick & 0xFFFFFFFF))
00044
00045 #elif defined(SCS_TYPECPU_SPARC)
00046 #define TBX_GET_TICK(t) \
00047 (t).tick = gethrtime()
00048 #define TBX_TICK_RAW_DIFF(t1, t2) \
00049 ((t2).tick - (t1).tick)
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069 #define TBX_TICK_RAW_DIFF(t1, t2) \
00070 ((t2).tick - (t1).tick)
00071
00072 #else
00073 #define TBX_GET_TICK(t) \
00074 gettimeofday(&(t).timev, 0)
00075 #define TBX_TICK_RAW_DIFF(t1, t2) \
00076 ((t2.timev.tv_sec * 1000000L + t2.timev.tv_usec) - \
00077 (t1.timev.tv_sec * 1000000L + t1.timev.tv_usec))
00078
00079 #endif
00080
00081 #define TBX_TICK_DIFF(t1, t2) (TBX_TICK_RAW_DIFF(t1, t2) - tbx_residual + 1)
00082 #define TBX_TIMING_DELAY(t1, t2) tbx_tick2usec(TBX_TICK_DIFF(t1, t2))
00083
00084 extern unsigned long long tbx_residual;
00085 extern tbx_tick_t tbx_new_event;
00086 extern tbx_tick_t tbx_last_event;
00087
00088 #endif