linux-arch.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* Using __builtin_prefetch everywhere
@ 2007-10-06 10:44 Andi Kleen
  0 siblings, 0 replies; only message in thread
From: Andi Kleen @ 2007-10-06 10:44 UTC (permalink / raw)
  To: linux-arch


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.

Signed-off-by: Andi Kleen <ak@suse.de>

Index: linux/include/asm-x86_64/processor.h
===================================================================
--- linux.orig/include/asm-x86_64/processor.h
+++ 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) 
 { 
Index: linux/include/linux/prefetch.h
===================================================================
--- linux.orig/include/linux/prefetch.h
+++ 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

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2007-10-06 10:44 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-10-06 10:44 Using __builtin_prefetch everywhere Andi Kleen

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).