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 __linux__
00041
00042 #ifdef __x86_64__
00043
00044 typedef unsigned long cycles_t;
00045 extern cycles_t cacheflush_time;
00046
00047 static inline unsigned long get_cycles(void)
00048 {
00049 unsigned int hi, lo;
00050 __asm__ __volatile__ ("rdtsc" : "=a"(lo), "=d"(hi));
00051 return (((unsigned long)hi)<<32) | ((unsigned long)lo);
00052 }
00053
00054 #endif
00055
00056 #ifdef __sparc_v9__
00057
00058 static inline unsigned long long get_cycles(void)
00059 {
00060 unsigned long long res;
00061 __asm__ __volatile__("rd %%tick, %0" : "=r"(res));
00062 return res;
00063 }
00064 #endif
00065
00066 #ifdef __PPC__
00067
00068
00069
00070 #define CPU_FTR_601 0x00000100
00071
00072 typedef unsigned long cycles_t;
00073
00074
00075
00076 extern cycles_t cacheflush_time;
00077
00078 static inline cycles_t get_cycles(void)
00079 {
00080 cycles_t ret = 0;
00081
00082 __asm__ __volatile__(
00083 "98: mftb %0\n"
00084 "99:\n"
00085 ".section __ftr_fixup,\"a\"\n"
00086 " .long %1\n"
00087 " .long 0\n"
00088 " .long 98b\n"
00089 " .long 99b\n"
00090 ".previous"
00091 : "=r" (ret) : "i" (CPU_FTR_601));
00092 return ret;
00093 }
00094
00095 #endif
00096
00097 #ifdef __i386__
00098
00099 typedef unsigned long long cycles_t;
00100
00101 extern cycles_t cacheflush_time;
00102
00103 #define rdtscll(val) \
00104 __asm__ __volatile__("rdtsc" : "=A" (val))
00105
00106 static inline cycles_t get_cycles (void)
00107 {
00108 unsigned long long ret;
00109
00110 rdtscll(ret);
00111 return ret;
00112 }
00113
00114 #endif
00115
00116
00117 #if !defined (__PPC__) && !defined (__x86_64__) && !defined (__i386__) && !defined (__sparc_v9__)
00118
00119 #warning No suitable get_cycles() implementation. Returning 0 instead
00120
00121 typedef unsigned long long cycles_t;
00122
00123 static inline cycles_t get_cycles(void)
00124 {
00125 return 0;
00126 }
00127
00128 #endif
00129
00130 #endif
00131
00132
00133 #if defined(__FreeBSD_kernel__)
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