Using __builtin_prefetch everywhere
Hallo,
Since there were some issues with the x86-64 prefetch I decided to switch the standard prefetch over to gcc's __builtin_prefetch. Since gcc supports this on all architectures I did that change for everybody: if you don't define a ARCH_HAS_PREFETCH it will use __builtin_prefetch(x) and the same with ARCH_HAS_PREFETCHW.
If you know of any problems with the __builtin_prefetch (e.g. gcc miscompiling it) please complain now. The right fix would be then to define a ARCH_HAS_PREFETCH{,w}
-Andi
Use __builtin_prefetch
gcc 3.2+ supports __builtin_prefetch, so it's possible to use it on all architectures. Change the generic fallback in linux/prefetch.h to use it instead of noping it out. gcc should do the right thing when the architecture doesn't support prefetching
Undefine the x86-64 inline assembler version and use the fallback.
include/asm-x86_64/processor.h +0 -6
@@ -368,12 +368,6 @@ static inline void sync_core(void) asmvolatile ("cpuid" :"=a" (tmp) :"0" (1 ) :"ebx" ,"ecx" ,"edx" ,"memory" ); } -#define ARCH_HAS_PREFETCH -static inline void prefetch (void *x) -{ - asmvolatile ("prefetcht0 %0" ::"m" (*(unsigned long *)x)); -} -#define ARCH_HAS_PREFETCHW 1static inline void prefetchw (void *x) {
include/linux/prefetch.h +2 -7
@@ -34,17 +34,12 @@*/ -/* -* These cannot be do{}while(0) macros. See the mental gymnastics in -* the loop macro. -*/ -#ifndef ARCH_HAS_PREFETCH -static inline void prefetch (const void *x) {;} +#define prefetch (x) __builtin_prefetch(x)#endif #ifndef ARCH_HAS_PREFETCHW -static inline void prefetchw (const void *x) {;} +#define prefetchw (x) __builtin_prefetch(x,1)#endif #ifndef ARCH_HAS_SPINLOCK_PREFETCH