Skip to contentSkip to conversation

Using __builtin_prefetch everywhere

PATCH Andi Kleen 1 participant 1 message Oct 6, 2007 Generic include/asm header files

lore
Share & tools
lore

Andi Kleen

author
#0 lore raw

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
Index: linux/include/asm-x86_64/processor.h
===================================================================
@@ -368,12 +368,6 @@ static inline void sync_core(void)
 	asm volatile("cpuid" : "=a" (tmp) : "0" (1) : "ebx","ecx","edx","memory");
 } 
 
-#define ARCH_HAS_PREFETCH
-static inline void prefetch(void *x) 
-{ 
-	asm volatile("prefetcht0 %0" :: "m" (*(unsigned long *)x));
-} 
-
 #define ARCH_HAS_PREFETCHW 1
 static inline void prefetchw(void *x) 
 { 
include/linux/prefetch.h +2 -7
Index: linux/include/linux/prefetch.h
===================================================================
@@ -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