00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef __jack_cycles_h__
00023 #define __jack_cycles_h__
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040 #ifdef __x86_64__
00041
00042 typedef unsigned long cycles_t;
00043 extern cycles_t cacheflush_time;
00044
00045 static inline unsigned long get_cycles(void)
00046 {
00047 unsigned int hi, lo;
00048 __asm__ __volatile__ ("rdtsc" : "=a"(lo), "=d"(hi));
00049 return (((unsigned long)hi)<<32) | ((unsigned long)lo);
00050 }
00051
00052 #endif
00053
00054 #ifdef __sparc_v9__
00055
00056 static inline unsigned long long get_cycles(void)
00057 {
00058 unsigned long long res;
00059 __asm__ __volatile__("rd %%tick, %0" : "=r"(res));
00060 return res;
00061 }
00062 #endif
00063
00064 #ifdef __sparc_v9__
00065
00066 static inline unsigned long long get_cycles(void)
00067 {
00068 unsigned long long res;
00069 __asm__ __volatile__("rd %%tick, %0" : "=r"(res));
00070 return res;
00071 }
00072 #endif
00073
00074 #ifdef __PPC__
00075
00076
00077
00078 #define CPU_FTR_601 0x00000100
00079
00080 typedef unsigned long cycles_t;
00081
00082
00083
00084 extern cycles_t cacheflush_time;
00085
00086 static inline cycles_t get_cycles(void)
00087 {
00088 cycles_t ret = 0;
00089
00090 #ifdef __powerpc64__
00091 # define LONGT ".llong"
00092 #else
00093 # define LONGT ".long"
00094 #endif
00095
00096 __asm__ __volatile__(
00097 "98: mftb %0\n"
00098 "99:\n"
00099 ".section __ftr_fixup,\"a\"\n"
00100 " .long %1\n"
00101 " .long 0\n"
00102 " " LONGT " 98b\n"
00103 " " LONGT " 99b\n"
00104 ".previous"
00105 : "=r" (ret) : "i" (CPU_FTR_601));
00106
00107 #undef LONGT
00108 return ret;
00109 }
00110
00111 #endif
00112
00113 #ifdef __i386__
00114
00115 typedef unsigned long long cycles_t;
00116
00117 extern cycles_t cacheflush_time;
00118
00119 #define rdtscll(val) \
00120 __asm__ __volatile__("rdtsc" : "=A" (val))
00121
00122 static inline cycles_t get_cycles (void)
00123 {
00124 unsigned long long ret;
00125
00126 rdtscll(ret);
00127 return ret;
00128 }
00129
00130 #endif
00131
00132
00133 #if !defined (__PPC__) && !defined (__x86_64__) && !defined (__i386__) && !defined (__sparc_v9__)
00134
00135 #warning No suitable get_cycles() implementation. Returning 0 instead
00136
00137 typedef unsigned long long cycles_t;
00138
00139 static inline cycles_t get_cycles(void)
00140 {
00141 return 0;
00142 }
00143
00144 #endif
00145
00146
00147 #endif