From f81966d04bedc6a03b4874c827cf5956639623ea Mon Sep 17 00:00:00 2001 From: Simon Pilgrim Date: Mon, 27 Jul 2015 19:01:52 +0000 Subject: [PATCH] [X86] Add missing _m_prefetch intrinsic 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 llvm-svn: 243305 --- clang/lib/Headers/prfchwintrin.h | 6 ++++++ clang/test/CodeGen/prefetchw-builtins.c | 10 ++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/clang/lib/Headers/prfchwintrin.h b/clang/lib/Headers/prfchwintrin.h index 9825bd8..ba02857 100644 --- a/clang/lib/Headers/prfchwintrin.h +++ b/clang/lib/Headers/prfchwintrin.h @@ -30,6 +30,12 @@ #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) { __builtin_prefetch (__P, 1, 3 /* _MM_HINT_T0 */); diff --git a/clang/test/CodeGen/prefetchw-builtins.c b/clang/test/CodeGen/prefetchw-builtins.c index 9c5fdc7..a422062 100644 --- a/clang/test/CodeGen/prefetchw-builtins.c +++ b/clang/test/CodeGen/prefetchw-builtins.c @@ -5,8 +5,14 @@ #include -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) } -- 2.7.4