xref: /phasta/phastaIO/rdtsc.h (revision 595995161822a203c8467e0e4a253d7bd7d6df32)
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. Jansen static __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. Jansen static __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. Jansen static __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