]> granicus.if.org Git - clang/commitdiff
[X86] Add missing _m_prefetch intrinsic
authorSimon Pilgrim <llvm-dev@redking.me.uk>
Mon, 27 Jul 2015 19:01:52 +0000 (19:01 +0000)
committerSimon Pilgrim <llvm-dev@redking.me.uk>
Mon, 27 Jul 2015 19:01:52 +0000 (19:01 +0000)
The 3DNOW/PRFCHW cpu targets define both the PREFETCHW (set cache line modified) and PREFETCH (set cache line exclusive) instructions but only the _m_prefetchw (PREFETCHW) intrinsic is included in the header. This patch adds the missing _m_prefetch intrinsic.

I'm basing this off AMD documentation - the intel docs on the support for PREFETCHW isn't clear whether Silvermont/Broadwell properly support PREFETCH but given that the intrinsic implementation is a default __builtin_prefetch call, it is safe whatever.

Fix for PR23648

Differential Revision: http://reviews.llvm.org/D11338

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@243305 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Headers/prfchwintrin.h
test/CodeGen/prefetchw-builtins.c

index 9825bd8c9700f0e9ea08d9cb6cab5e6ed77d55f1..ba02857518234ca38b1d8ea31e43a5f4e5703a8a 100644 (file)
 #define __PRFCHWINTRIN_H
 
 #if defined(__PRFCHW__) || defined(__3dNOW__)
+static __inline__ void __attribute__((__always_inline__, __nodebug__))
+_m_prefetch(void *__P)
+{
+  __builtin_prefetch (__P, 0, 3 /* _MM_HINT_T0 */);
+}
+
 static __inline__ void __attribute__((__always_inline__, __nodebug__))
 _m_prefetchw(void *__P)
 {
index 9c5fdc723322967dd1c81a4319398098376306e9..a4220621572826506a1a145f0b680f093623caca 100644 (file)
@@ -5,8 +5,14 @@
 
 #include <x86intrin.h>
 
-void prefetch_w(void *p) {
+void test_m_prefetch(void *p) {
+  return _m_prefetch(p);
+  // CHECK-LABEL: define void @test_m_prefetch
+  // CHECK: call void @llvm.prefetch({{.*}}, i32 0, i32 3, i32 1)
+}
+
+void test_m_prefetch_w(void *p) {
   return _m_prefetchw(p);
-// CHECK: @prefetch_w
+// CHECK-LABEL: define void : @test_m_prefetch_w
 // CHECK: call void @llvm.prefetch({{.*}}, i32 1, i32 3, i32 1)
 }