| // Codes from: http://www.mcs.anl.gov/~kazutomo/rdtsc.h |
| |
| #ifndef __RDTSC_H_DEFINED__ |
| #define __RDTSC_H_DEFINED__ |
| |
| #if defined(__i386__) |
| |
| static __inline__ unsigned long long rdtsc(void) |
| { |
| unsigned long long int x; |
| __asm__ volatile (".byte 0x0f, 0x31" : "=A" (x)); |
| return x; |
| } |
| #elif defined(__x86_64__) |
| |
| static __inline__ unsigned long rdtsc(void) |
| { |
| unsigned hi, lo; |
| __asm__ __volatile__ ("rdtsc" : "=a"(lo), "=d"(hi)); |
| return ( (unsigned long)lo)|( ((unsigned long)hi)<<32 ); |
| } |
| |
| #elif defined(__powerpc__) |
| |
| typedef unsigned long long int unsigned long long; |
| |
| static __inline__ unsigned long long rdtsc(void) |
| { |
| unsigned long long int result=0; |
| unsigned long int upper, lower,tmp; |
| __asm__ volatile( |
| "0: \n" |
| "\tmftbu %0 \n" |
| "\tmftb %1 \n" |
| "\tmftbu %2 \n" |
| "\tcmpw %2,%0 \n" |
| "\tbne 0b \n" |
| : "=r"(upper),"=r"(lower),"=r"(tmp) |
| ); |
| result = upper; |
| result = result<<32; |
| result = result|lower; |
| |
| return(result); |
| } |
| |
| #else |
| |
| #error "No tick counter is available!" |
| |
| #endif |
| |
| |
| /* $RCSfile: rdtsc.h,v $ $Author: alenhar2 $ |
| * $Revision: 1.3 $ $Date: 2008-10-13 22:04:20 $ |
| */ |
| |
| #endif |