1*59599516SKenneth E. Jansen #ifndef __RDTSC_H_DEFINED__ 2*59599516SKenneth E. Jansen #define __RDTSC_H_DEFINED__ 3*59599516SKenneth E. Jansen 4*59599516SKenneth E. Jansen 5*59599516SKenneth E. Jansen #if defined(__i386__) 6*59599516SKenneth E. Jansen rdtsc(void)7*59599516SKenneth E. Jansenstatic __inline__ unsigned long long rdtsc(void) 8*59599516SKenneth E. Jansen { 9*59599516SKenneth E. Jansen unsigned long long int x; 10*59599516SKenneth E. Jansen __asm__ volatile (".byte 0x0f, 0x31" : "=A" (x)); 11*59599516SKenneth E. Jansen return x; 12*59599516SKenneth E. Jansen } 13*59599516SKenneth E. Jansen #elif defined(__x86_64__) 14*59599516SKenneth E. Jansen 15*59599516SKenneth E. Jansen // typedef unsigned long long int unsigned long long; 16*59599516SKenneth E. Jansen rdtsc(void)17*59599516SKenneth E. Jansenstatic __inline__ unsigned long long rdtsc(void) 18*59599516SKenneth E. Jansen { 19*59599516SKenneth E. Jansen unsigned hi, lo; 20*59599516SKenneth E. Jansen __asm__ __volatile__ ("rdtsc" : "=a"(lo), "=d"(hi)); 21*59599516SKenneth E. Jansen return ( (unsigned long long)lo)|( ((unsigned long long)hi)<<32 ); 22*59599516SKenneth E. Jansen } 23*59599516SKenneth E. Jansen 24*59599516SKenneth E. Jansen #elif defined(__powerpc__) 25*59599516SKenneth E. Jansen 26*59599516SKenneth E. Jansen // typedef unsigned long long int unsigned long long; 27*59599516SKenneth E. Jansen rdtsc(void)28*59599516SKenneth E. Jansenstatic __inline__ unsigned long long rdtsc(void) 29*59599516SKenneth E. Jansen { 30*59599516SKenneth E. Jansen unsigned long long int result=0; 31*59599516SKenneth E. Jansen unsigned long int upper, lower,tmp; 32*59599516SKenneth E. Jansen __asm__ volatile( 33*59599516SKenneth E. Jansen "0: \n" 34*59599516SKenneth E. Jansen "\tmftbu %0 \n" 35*59599516SKenneth E. Jansen "\tmftb %1 \n" 36*59599516SKenneth E. Jansen "\tmftbu %2 \n" 37*59599516SKenneth E. Jansen "\tcmpw %2,%0 \n" 38*59599516SKenneth E. Jansen "\tbne 0b \n" 39*59599516SKenneth E. Jansen : "=r"(upper),"=r"(lower),"=r"(tmp) 40*59599516SKenneth E. Jansen ); 41*59599516SKenneth E. Jansen result = upper; 42*59599516SKenneth E. Jansen result = result<<32; 43*59599516SKenneth E. Jansen result = result|lower; 44*59599516SKenneth E. Jansen 45*59599516SKenneth E. Jansen return(result); 46*59599516SKenneth E. Jansen } 47*59599516SKenneth E. Jansen 48*59599516SKenneth E. Jansen #else 49*59599516SKenneth E. Jansen 50*59599516SKenneth E. Jansen #error "No tick counter is available!" 51*59599516SKenneth E. Jansen 52*59599516SKenneth E. Jansen #endif 53*59599516SKenneth E. Jansen 54*59599516SKenneth E. Jansen #endif 55