From: Elena Demikhovsky Date: Wed, 1 Apr 2015 06:54:16 +0000 (+0000) Subject: AVX-512: added clang intrinsics for logical and, or xor for 512 bits X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=edb3608f8ec782f42b1512ef7659229331bd8020;p=clang AVX-512: added clang intrinsics for logical and, or xor for 512 bits by Asaf Badouh (asaf.badouh@intel.com) git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@233794 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/BuiltinsX86.def b/include/clang/Basic/BuiltinsX86.def index a60e44242a..b99e0f491a 100644 --- a/include/clang/Basic/BuiltinsX86.def +++ b/include/clang/Basic/BuiltinsX86.def @@ -868,6 +868,12 @@ BUILTIN(__builtin_ia32_cvtudq2pd512_mask, "V8dV8iV8dUc", "") BUILTIN(__builtin_ia32_cvtpd2ps512_mask, "V8fV8dV8fUcIi", "") BUILTIN(__builtin_ia32_vcvtps2ph512_mask, "V16sV16fIiV16sUs", "") BUILTIN(__builtin_ia32_vcvtph2ps512_mask, "V16fV16sV16fUsIi", "") +BUILTIN(__builtin_ia32_pandd512_mask, "V16iV16iV16iV16iUs", "") +BUILTIN(__builtin_ia32_pandq512_mask, "V8LLiV8LLiV8LLiV8LLiUc", "") +BUILTIN(__builtin_ia32_pord512_mask, "V16iV16iV16iV16iUs", "") +BUILTIN(__builtin_ia32_porq512_mask, "V8LLiV8LLiV8LLiV8LLiUc", "") +BUILTIN(__builtin_ia32_pxord512_mask, "V16iV16iV16iV16iUs", "") +BUILTIN(__builtin_ia32_pxorq512_mask, "V8LLiV8LLiV8LLiV8LLiUc", "") BUILTIN(__builtin_ia32_pabsd512_mask, "V16iV16iV16iUs", "") BUILTIN(__builtin_ia32_pabsq512_mask, "V8LLiV8LLiV8LLiUc", "") BUILTIN(__builtin_ia32_pmaxsd512_mask, "V16iV16iV16iV16iUs", "") diff --git a/lib/Headers/avx512fintrin.h b/lib/Headers/avx512fintrin.h index c6d46cb0ab..72af2811b7 100644 --- a/lib/Headers/avx512fintrin.h +++ b/lib/Headers/avx512fintrin.h @@ -162,6 +162,168 @@ _mm512_castps512_ps128(__m512 __a) return __builtin_shufflevector(__a, __a, 0, 1, 2, 3); } +/* Bitwise operators */ +static __inline__ __m512i __attribute__((__always_inline__, __nodebug__)) +_mm512_and_epi32(__m512i __a, __m512i __b) +{ + return __a & __b; +} + +static __inline__ __m512i __attribute__((__always_inline__, __nodebug__)) +_mm512_mask_and_epi32(__m512i __src, __mmask16 __k, __m512i __a, __m512i __b) +{ + return (__m512i) __builtin_ia32_pandd512_mask((__v16si) __a, + (__v16si) __b, + (__v16si) __src, + (__mmask16) __k); +} +static __inline__ __m512i __attribute__((__always_inline__, __nodebug__)) +_mm512_maskz_and_epi32(__mmask16 __k, __m512i __a, __m512i __b) +{ + return (__m512i) __builtin_ia32_pandd512_mask((__v16si) __a, + (__v16si) __b, + (__v16si) + _mm512_setzero_si512 (), + (__mmask16) __k); +} + +static __inline__ __m512i __attribute__((__always_inline__, __nodebug__)) +_mm512_and_epi64(__m512i __a, __m512i __b) +{ + return __a & __b; +} + +static __inline__ __m512i __attribute__((__always_inline__, __nodebug__)) +_mm512_mask_and_epi64(__m512i __src, __mmask8 __k, __m512i __a, __m512i __b) +{ + return (__m512i) __builtin_ia32_pandq512_mask ((__v8di) __a, + (__v8di) __b, + (__v8di) __src, + (__mmask8) __k); +} +static __inline__ __m512i __attribute__((__always_inline__, __nodebug__)) +_mm512_maskz_and_epi64(__mmask8 __k, __m512i __a, __m512i __b) +{ + return (__m512i) __builtin_ia32_pandq512_mask ((__v8di) __a, + (__v8di) __b, + (__v8di) + _mm512_setzero_si512 (), + (__mmask8) __k); +} + +static __inline__ __m512i __attribute__((__always_inline__, __nodebug__)) +_mm512_or_epi32(__m512i __a, __m512i __b) +{ + return __a | __b; +} + +static __inline__ __m512i __attribute__((__always_inline__, __nodebug__)) +_mm512_mask_or_epi32(__m512i __src, __mmask16 __k, __m512i __a, __m512i __b) +{ + return (__m512i) __builtin_ia32_pord512_mask((__v16si) __a, + (__v16si) __b, + (__v16si) __src, + (__mmask16) __k); +} +static __inline__ __m512i __attribute__((__always_inline__, __nodebug__)) +_mm512_maskz_or_epi32(__mmask16 __k, __m512i __a, __m512i __b) +{ + return (__m512i) __builtin_ia32_pord512_mask((__v16si) __a, + (__v16si) __b, + (__v16si) + _mm512_setzero_si512 (), + (__mmask16) __k); +} + +static __inline__ __m512i __attribute__((__always_inline__, __nodebug__)) +_mm512_or_epi64(__m512i __a, __m512i __b) +{ + return __a | __b; +} + +static __inline__ __m512i __attribute__((__always_inline__, __nodebug__)) +_mm512_mask_or_epi64(__m512i __src, __mmask8 __k, __m512i __a, __m512i __b) +{ + return (__m512i) __builtin_ia32_porq512_mask ((__v8di) __a, + (__v8di) __b, + (__v8di) __src, + (__mmask8) __k); +} +static __inline__ __m512i __attribute__((__always_inline__, __nodebug__)) +_mm512_maskz_or_epi64(__mmask8 __k, __m512i __a, __m512i __b) +{ + return (__m512i) __builtin_ia32_porq512_mask ((__v8di) __a, + (__v8di) __b, + (__v8di) + _mm512_setzero_si512 (), + (__mmask8) __k); +} + +static __inline__ __m512i __attribute__((__always_inline__, __nodebug__)) +_mm512_xor_epi32(__m512i __a, __m512i __b) +{ + return __a ^ __b; +} + +static __inline__ __m512i __attribute__((__always_inline__, __nodebug__)) +_mm512_mask_xor_epi32(__m512i __src, __mmask16 __k, __m512i __a, __m512i __b) +{ + return (__m512i) __builtin_ia32_pxord512_mask((__v16si) __a, + (__v16si) __b, + (__v16si) __src, + (__mmask16) __k); +} +static __inline__ __m512i __attribute__((__always_inline__, __nodebug__)) +_mm512_maskz_xor_epi32(__mmask16 __k, __m512i __a, __m512i __b) +{ + return (__m512i) __builtin_ia32_pxord512_mask((__v16si) __a, + (__v16si) __b, + (__v16si) + _mm512_setzero_si512 (), + (__mmask16) __k); +} + +static __inline__ __m512i __attribute__((__always_inline__, __nodebug__)) +_mm512_xor_epi64(__m512i __a, __m512i __b) +{ + return __a ^ __b; +} + +static __inline__ __m512i __attribute__((__always_inline__, __nodebug__)) +_mm512_mask_xor_epi64(__m512i __src, __mmask8 __k, __m512i __a, __m512i __b) +{ + return (__m512i) __builtin_ia32_pxorq512_mask ((__v8di) __a, + (__v8di) __b, + (__v8di) __src, + (__mmask8) __k); +} +static __inline__ __m512i __attribute__((__always_inline__, __nodebug__)) +_mm512_maskz_xor_epi64(__mmask8 __k, __m512i __a, __m512i __b) +{ + return (__m512i) __builtin_ia32_pxorq512_mask ((__v8di) __a, + (__v8di) __b, + (__v8di) + _mm512_setzero_si512 (), + (__mmask8) __k); +} + +static __inline__ __m512i __attribute__((__always_inline__, __nodebug__)) +_mm512_and_si512(__m512i __a, __m512i __b) +{ + return __a & __b; +} + +static __inline__ __m512i __attribute__((__always_inline__, __nodebug__)) +_mm512_or_si512(__m512i __a, __m512i __b) +{ + return __a | __b; +} + +static __inline__ __m512i __attribute__((__always_inline__, __nodebug__)) +_mm512_xor_si512(__m512i __a, __m512i __b) +{ + return __a ^ __b; +} /* Arithmetic */ static __inline __m512d __attribute__((__always_inline__, __nodebug__)) diff --git a/test/CodeGen/avx512f-builtins.c b/test/CodeGen/avx512f-builtins.c index 89f8a535ee..340beb8f01 100644 --- a/test/CodeGen/avx512f-builtins.c +++ b/test/CodeGen/avx512f-builtins.c @@ -633,3 +633,112 @@ __mmask8 test_mm512_mask_cmp_epu64_mask(__mmask8 __u, __m512i __a, __m512i __b) // CHECK: @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64> {{.*}}, <8 x i64> {{.*}}, i8 3, i8 {{.*}}) return (__mmask8)_mm512_mask_cmp_epu64_mask(__u, __a, __b, 3); } + +__m512i test_mm512_mask_and_epi32(__m512i __src,__mmask16 __k, __m512i __a, __m512i __b) { + // CHECK-LABEL: @test_mm512_mask_and_epi32 + // CHECK: @llvm.x86.avx512.mask.pand.d.512 + return _mm512_mask_and_epi32(__src, __k,__a, __b); +} + +__m512i test_mm512_maskz_and_epi32(__mmask16 __k, __m512i __a, __m512i __b) { + // CHECK-LABEL: @test_mm512_maskz_and_epi32 + // CHECK: @llvm.x86.avx512.mask.pand.d.512 + return _mm512_maskz_and_epi32(__k,__a, __b); +} + +__m512i test_mm512_mask_and_epi64(__m512i __src,__mmask8 __k, __m512i __a, __m512i __b) { + // CHECK-LABEL: @test_mm512_mask_and_epi64 + // CHECK: @llvm.x86.avx512.mask.pand.q.512 + return _mm512_mask_and_epi64(__src, __k,__a, __b); +} + +__m512i test_mm512_maskz_and_epi64(__mmask8 __k, __m512i __a, __m512i __b) { + // CHECK-LABEL: @test_mm512_maskz_and_epi64 + // CHECK: @llvm.x86.avx512.mask.pand.q.512 + return _mm512_maskz_and_epi64(__k,__a, __b); +} + +__m512i test_mm512_mask_or_epi32(__m512i __src,__mmask16 __k, __m512i __a, __m512i __b) { + // CHECK-LABEL: @test_mm512_mask_or_epi32 + // CHECK: @llvm.x86.avx512.mask.por.d.512 + return _mm512_mask_or_epi32(__src, __k,__a, __b); +} + +__m512i test_mm512_maskz_or_epi32(__mmask16 __k, __m512i __a, __m512i __b) { + // CHECK-LABEL: @test_mm512_maskz_or_epi32 + // CHECK: @llvm.x86.avx512.mask.por.d.512 + return _mm512_maskz_or_epi32(__k,__a, __b); +} + +__m512i test_mm512_mask_or_epi64(__m512i __src,__mmask8 __k, __m512i __a, __m512i __b) { + // CHECK-LABEL: @test_mm512_mask_or_epi64 + // CHECK: @llvm.x86.avx512.mask.por.q.512 + return _mm512_mask_or_epi64(__src, __k,__a, __b); +} + +__m512i test_mm512_maskz_or_epi64(__mmask8 __k, __m512i __a, __m512i __b) { + // CHECK-LABEL: @test_mm512_maskz_or_epi64 + // CHECK: @llvm.x86.avx512.mask.por.q.512 + return _mm512_maskz_or_epi64(__k,__a, __b); +} + +__m512i test_mm512_mask_xor_epi32(__m512i __src,__mmask16 __k, __m512i __a, __m512i __b) { + // CHECK-LABEL: @test_mm512_mask_xor_epi32 + // CHECK: @llvm.x86.avx512.mask.pxor.d.512 + return _mm512_mask_xor_epi32(__src, __k,__a, __b); +} + +__m512i test_mm512_maskz_xor_epi32(__mmask16 __k, __m512i __a, __m512i __b) { + // CHECK-LABEL: @test_mm512_maskz_xor_epi32 + // CHECK: @llvm.x86.avx512.mask.pxor.d.512 + return _mm512_maskz_xor_epi32(__k,__a, __b); +} + +__m512i test_mm512_mask_xor_epi64(__m512i __src,__mmask8 __k, __m512i __a, __m512i __b) { + // CHECK-LABEL: @test_mm512_mask_xor_epi64 + // CHECK: @llvm.x86.avx512.mask.pxor.q.512 + return _mm512_mask_xor_epi64(__src, __k,__a, __b); +} + +__m512i test_mm512_maskz_xor_epi64(__mmask8 __k, __m512i __a, __m512i __b) { + // CHECK-LABEL: @test_mm512_maskz_xor_epi64 + // CHECK: @llvm.x86.avx512.mask.pxor.q.512 + return _mm512_maskz_xor_epi64(__k,__a, __b); +} + +__m512i test_mm512_and_epi32(__m512i __src,__mmask16 __k, __m512i __a, __m512i __b) { + // CHECK-LABEL: @test_mm512_and_epi32 + // CHECK: and <8 x i64> + return _mm512_and_epi32(__a, __b); +} + +__m512i test_mm512_and_epi64(__m512i __src,__mmask8 __k, __m512i __a, __m512i __b) { + // CHECK-LABEL: @test_mm512_and_epi64 + // CHECK: and <8 x i64> + return _mm512_and_epi64(__a, __b); +} + +__m512i test_mm512_or_epi32(__m512i __src,__mmask16 __k, __m512i __a, __m512i __b) { + // CHECK-LABEL: @test_mm512_or_epi32 + // CHECK: or <8 x i64> + return _mm512_or_epi32(__a, __b); +} + +__m512i test_mm512_or_epi64(__m512i __src,__mmask8 __k, __m512i __a, __m512i __b) { + // CHECK-LABEL: @test_mm512_or_epi64 + // CHECK: or <8 x i64> + return _mm512_or_epi64(__a, __b); +} + +__m512i test_mm512_xor_epi32(__m512i __src,__mmask16 __k, __m512i __a, __m512i __b) { + // CHECK-LABEL: @test_mm512_xor_epi32 + // CHECK: xor <8 x i64> + return _mm512_xor_epi32(__a, __b); +} + +__m512i test_mm512_xor_epi64(__m512i __src,__mmask8 __k, __m512i __a, __m512i __b) { + // CHECK-LABEL: @test_mm512_xor_epi64 + // CHECK: xor <8 x i64> + return _mm512_xor_epi64(__a, __b); +} +