From: Adam Nemet Date: Thu, 14 Aug 2014 17:17:57 +0000 (+0000) Subject: [AVX512] Add FMA intrinsics X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=42a4388e580f437b97ddfc211f35cc81b0cbc86a;p=clang [AVX512] Add FMA intrinsics Part of git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@215666 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/BuiltinsX86.def b/include/clang/Basic/BuiltinsX86.def index 117232cfc4..8c591713d9 100644 --- a/include/clang/Basic/BuiltinsX86.def +++ b/include/clang/Basic/BuiltinsX86.def @@ -655,7 +655,7 @@ BUILTIN(__builtin_ia32_sha256rnds2, "V4iV4iV4iV4i", "") BUILTIN(__builtin_ia32_sha256msg1, "V4iV4iV4i", "") BUILTIN(__builtin_ia32_sha256msg2, "V4iV4iV4i", "") -// FMA4 +// FMA BUILTIN(__builtin_ia32_vfmaddps, "V4fV4fV4fV4f", "") BUILTIN(__builtin_ia32_vfmaddpd, "V2dV2dV2dV2d", "") BUILTIN(__builtin_ia32_vfmaddss, "V4fV4fV4fV4f", "") @@ -688,6 +688,12 @@ BUILTIN(__builtin_ia32_vfmaddsubps256, "V8fV8fV8fV8f", "") BUILTIN(__builtin_ia32_vfmaddsubpd256, "V4dV4dV4dV4d", "") BUILTIN(__builtin_ia32_vfmsubaddps256, "V8fV8fV8fV8f", "") BUILTIN(__builtin_ia32_vfmsubaddpd256, "V4dV4dV4dV4d", "") +BUILTIN(__builtin_ia32_vfmaddpd512_mask, "V8dV8dV8dV8dUci", "") +BUILTIN(__builtin_ia32_vfmsubpd512_mask, "V8dV8dV8dV8dUci", "") +BUILTIN(__builtin_ia32_vfnmaddpd512_mask, "V8dV8dV8dV8dUci", "") +BUILTIN(__builtin_ia32_vfmaddps512_mask, "V16fV16fV16fV16fUsi", "") +BUILTIN(__builtin_ia32_vfmsubps512_mask, "V16fV16fV16fV16fUsi", "") +BUILTIN(__builtin_ia32_vfnmaddps512_mask, "V16fV16fV16fV16fUsi", "") // XOP BUILTIN(__builtin_ia32_vpmacssww, "V8sV8sV8sV8s", "") diff --git a/lib/Headers/avx512fintrin.h b/lib/Headers/avx512fintrin.h index 1b558a0404..5736fbe555 100644 --- a/lib/Headers/avx512fintrin.h +++ b/lib/Headers/avx512fintrin.h @@ -507,6 +507,72 @@ _mm512_roundscale_pd(__m512d __A, const int __imm) _MM_FROUND_CUR_DIRECTION); } +static __inline__ __m512d __attribute__((__always_inline__, __nodebug__)) +_mm512_fmadd_pd(__m512d __A, __m512d __B, __m512d __C) +{ + return (__m512d) + __builtin_ia32_vfmaddpd512_mask(__A, + __B, + __C, + (__mmask8) -1, + _MM_FROUND_CUR_DIRECTION); +} + +static __inline__ __m512d __attribute__((__always_inline__, __nodebug__)) +_mm512_fmsub_pd(__m512d __A, __m512d __B, __m512d __C) +{ + return (__m512d) + __builtin_ia32_vfmsubpd512_mask(__A, + __B, + __C, + (__mmask8) -1, + _MM_FROUND_CUR_DIRECTION); +} + +static __inline__ __m512d __attribute__((__always_inline__, __nodebug__)) +_mm512_fnmadd_pd(__m512d __A, __m512d __B, __m512d __C) +{ + return (__m512d) + __builtin_ia32_vfnmaddpd512_mask(__A, + __B, + __C, + (__mmask8) -1, + _MM_FROUND_CUR_DIRECTION); +} + +static __inline__ __m512 __attribute__((__always_inline__, __nodebug__)) +_mm512_fmadd_ps(__m512 __A, __m512 __B, __m512 __C) +{ + return (__m512) + __builtin_ia32_vfmaddps512_mask(__A, + __B, + __C, + (__mmask16) -1, + _MM_FROUND_CUR_DIRECTION); +} + +static __inline__ __m512 __attribute__((__always_inline__, __nodebug__)) +_mm512_fmsub_ps(__m512 __A, __m512 __B, __m512 __C) +{ + return (__m512) + __builtin_ia32_vfmsubps512_mask(__A, + __B, + __C, + (__mmask16) -1, + _MM_FROUND_CUR_DIRECTION); +} + +static __inline__ __m512 __attribute__((__always_inline__, __nodebug__)) +_mm512_fnmadd_ps(__m512 __A, __m512 __B, __m512 __C) +{ + return (__m512) + __builtin_ia32_vfnmaddps512_mask(__A, + __B, + __C, + (__mmask16) -1, + _MM_FROUND_CUR_DIRECTION); +} + /* Vector permutations */ static __inline __m512i __attribute__ ((__always_inline__, __nodebug__)) diff --git a/test/CodeGen/avx512f-builtins.c b/test/CodeGen/avx512f-builtins.c index b5b4ff2391..bde93fb271 100644 --- a/test/CodeGen/avx512f-builtins.c +++ b/test/CodeGen/avx512f-builtins.c @@ -151,3 +151,10 @@ __m512d test_mm512_broadcastsd_pd(__m128d a) // CHECK: insertelement <8 x double> {{.*}}, i32 7 return _mm512_broadcastsd_pd(a); } + +__m512i test_mm512_fmadd_pd(__m512d a, __m512d b, __m512d c) +{ + // CHECK-LABEL: @test_mm512_fmadd_pd + // CHECK: @llvm.x86.fma.mask.vfmadd.pd.512 + return _mm512_fmadd_pd(a, b, c); +}