Jack2 1.9.10
|
00001 /* 00002 Copyright (C) 2001 Paul Davis 00003 Code derived from various headers from the Linux kernel 00004 00005 This program is free software; you can redistribute it and/or modify 00006 it under the terms of the GNU General Public License as published by 00007 the Free Software Foundation; either version 2 of the License, or 00008 (at your option) any later version. 00009 00010 This program is distributed in the hope that it will be useful, 00011 but WITHOUT ANY WARRANTY; without even the implied warranty of 00012 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00013 GNU General Public License for more details. 00014 00015 You should have received a copy of the GNU General Public License 00016 along with this program; if not, write to the Free Software 00017 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 00018 00019 $Id: cycles.h,v 1.4.2.1 2006/06/20 14:44:00 letz Exp $ 00020 */ 00021 00022 #ifndef __jack_cycles_h__ 00023 #define __jack_cycles_h__ 00024 00025 /* 00026 * Standard way to access the cycle counter on i586+ CPUs. 00027 * Currently only used on SMP. 00028 * 00029 * If you really have a SMP machine with i486 chips or older, 00030 * compile for that, and this will just always return zero. 00031 * That's ok, it just means that the nicer scheduling heuristics 00032 * won't work for you. 00033 * 00034 * We only use the low 32 bits, and we'd simply better make sure 00035 * that we reschedule before that wraps. Scheduling at least every 00036 * four billion cycles just basically sounds like a good idea, 00037 * regardless of how fast the machine is. 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 /* __x86_64__ */ 00053 00054 #ifdef __sparc_v9__ 00055 /* rd is V9 only */ 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 /* __sparc_v9__ */ 00063 00064 #ifdef __sparc_v9__ 00065 /* rd is V9 only */ 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 /* PowerPC */ 00077 00078 #define CPU_FTR_601 0x00000100 00079 00080 typedef unsigned long cycles_t; 00081 00082 /* For the "cycle" counter we use the timebase lower half. */ 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 /* __PPC__ */ 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 /* __i386__ */ 00131 00132 /* everything else but x86, amd64, sparcv9 or ppc */ 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 /* everything else but x86, amd64, sparcv9 or ppc */ 00145 00146 00147 #endif /* __jack_cycles_h__ */