171 lines · c
1// RUN: %clang_cc1 -x c -flax-vector-conversions=none -ffreestanding %s -triple=x86_64-apple-darwin -target-feature +avx512cd -emit-llvm -o - -Wall -Werror | FileCheck %s2// RUN: %clang_cc1 -x c -flax-vector-conversions=none -ffreestanding %s -triple=i386-apple-darwin -target-feature +avx512cd -emit-llvm -o - -Wall -Werror | FileCheck %s3// RUN: %clang_cc1 -x c++ -flax-vector-conversions=none -ffreestanding %s -triple=x86_64-apple-darwin -target-feature +avx512cd -emit-llvm -o - -Wall -Werror | FileCheck %s4// RUN: %clang_cc1 -x c++ -flax-vector-conversions=none -ffreestanding %s -triple=i386-apple-darwin -target-feature +avx512cd -emit-llvm -o - -Wall -Werror | FileCheck %s5// RUN: %clang_cc1 -x c -flax-vector-conversions=none -ffreestanding %s -triple=x86_64-apple-darwin -target-feature +avx512cd -emit-llvm -o - -Wall -Werror -fexperimental-new-constant-interpreter | FileCheck %s6// RUN: %clang_cc1 -x c -flax-vector-conversions=none -ffreestanding %s -triple=i386-apple-darwin -target-feature +avx512cd -emit-llvm -o - -Wall -Werror -fexperimental-new-constant-interpreter | FileCheck %s7// RUN: %clang_cc1 -x c++ -flax-vector-conversions=none -ffreestanding %s -triple=x86_64-apple-darwin -target-feature +avx512cd -emit-llvm -o - -Wall -Werror -fexperimental-new-constant-interpreter | FileCheck %s8// RUN: %clang_cc1 -x c++ -flax-vector-conversions=none -ffreestanding %s -triple=i386-apple-darwin -target-feature +avx512cd -emit-llvm -o - -Wall -Werror -fexperimental-new-constant-interpreter | FileCheck %s9 10 11#include <immintrin.h>12#include "builtin_test_helpers.h"13 14__m512i test_mm512_conflict_epi64(__m512i __A) {15 // CHECK-LABEL: test_mm512_conflict_epi6416 // CHECK: call {{.*}}<8 x i64> @llvm.x86.avx512.conflict.q.512(<8 x i64> %{{.*}})17 return _mm512_conflict_epi64(__A);18}19 20TEST_CONSTEXPR(match_v8di(_mm512_conflict_epi64((__m512i)(__v8di){1, 2, 1, 3, 2, 4, 1, 5}), 0, 0, 1, 0, 2, 0, 5, 0));21TEST_CONSTEXPR(match_v8di(_mm512_conflict_epi64((__m512i)(__v8di){5, 5, 5, 5, 5, 5, 5, 5}), 0, 1, 3, 7, 15, 31, 63, 127));22TEST_CONSTEXPR(match_v8di(_mm512_conflict_epi64((__m512i)(__v8di){1, 2, 3, 4, 5, 6, 7, 8}), 0, 0, 0, 0, 0, 0, 0, 0));23__m512i test_mm512_mask_conflict_epi64(__m512i __W, __mmask8 __U, __m512i __A) {24 // CHECK-LABEL: test_mm512_mask_conflict_epi6425 // CHECK: call {{.*}}<8 x i64> @llvm.x86.avx512.conflict.q.512(<8 x i64> %{{.*}})26 // CHECK: select <8 x i1> %{{.*}}, <8 x i64> %{{.*}}, <8 x i64> %{{.*}}27 return _mm512_mask_conflict_epi64(__W,__U,__A);28}29 30TEST_CONSTEXPR(match_v8di(_mm512_mask_conflict_epi64((__m512i)(__v8di){0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, 0x55, (__m512i)(__v8di){1, 2, 1, 3, 2, 4, 1, 5}), 0, 0xFF, 1, 0xFF, 2, 0xFF, 5, 0xFF));31__m512i test_mm512_maskz_conflict_epi64(__mmask8 __U, __m512i __A) {32 // CHECK-LABEL: test_mm512_maskz_conflict_epi6433 // CHECK: call {{.*}}<8 x i64> @llvm.x86.avx512.conflict.q.512(<8 x i64> %{{.*}})34 // CHECK: select <8 x i1> %{{.*}}, <8 x i64> %{{.*}}, <8 x i64> %{{.*}}35 return _mm512_maskz_conflict_epi64(__U,__A);36}37 38TEST_CONSTEXPR(match_v8di(_mm512_maskz_conflict_epi64(0x55, (__m512i)(__v8di){1, 2, 1, 3, 2, 4, 1, 5}), 0, 0, 1, 0, 2, 0, 5, 0));39__m512i test_mm512_conflict_epi32(__m512i __A) {40 // CHECK-LABEL: test_mm512_conflict_epi3241 // CHECK: call <16 x i32> @llvm.x86.avx512.conflict.d.512(<16 x i32> %{{.*}})42 return _mm512_conflict_epi32(__A);43}44 45TEST_CONSTEXPR(match_v16si(_mm512_conflict_epi32((__m512i)(__v16si){1, 2, 1, 3, 2, 4, 1, 5, 6, 7, 6, 8, 7, 9, 6, 10}), 0, 0, 1, 0, 2, 0, 5, 0, 0, 0, 256, 0, 512, 0, 1280, 0));46TEST_CONSTEXPR(match_v16si(_mm512_conflict_epi32((__m512i)(__v16si){9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9}), 0, 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047, 4095, 8191, 16383, 32767));47TEST_CONSTEXPR(match_v16si(_mm512_conflict_epi32((__m512i)(__v16si){1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0));48__m512i test_mm512_mask_conflict_epi32(__m512i __W, __mmask16 __U, __m512i __A) {49 // CHECK-LABEL: test_mm512_mask_conflict_epi3250 // CHECK: call <16 x i32> @llvm.x86.avx512.conflict.d.512(<16 x i32> %{{.*}})51 // CHECK: select <16 x i1> %{{.*}}, <16 x i32> %{{.*}}, <16 x i32> %{{.*}}52 return _mm512_mask_conflict_epi32(__W,__U,__A);53}54 55TEST_CONSTEXPR(match_v16si(_mm512_mask_conflict_epi32((__m512i)(__v16si){0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}, 0x5555, (__m512i)(__v16si){1, 2, 1, 3, 2, 4, 1, 5, 6, 7, 6, 8, 7, 9, 6, 10}), 0, 0xFF, 1, 0xFF, 2, 0xFF, 5, 0xFF, 0, 0xFF, 256, 0xFF, 512, 0xFF, 1280, 0xFF));56__m512i test_mm512_maskz_conflict_epi32(__mmask16 __U, __m512i __A) {57 // CHECK-LABEL: test_mm512_maskz_conflict_epi3258 // CHECK: call <16 x i32> @llvm.x86.avx512.conflict.d.512(<16 x i32> %{{.*}})59 // CHECK: select <16 x i1> %{{.*}}, <16 x i32> %{{.*}}, <16 x i32> %{{.*}}60 return _mm512_maskz_conflict_epi32(__U,__A);61}62 63TEST_CONSTEXPR(match_v16si(_mm512_maskz_conflict_epi32(0x5555, (__m512i)(__v16si){1, 2, 1, 3, 2, 4, 1, 5, 6, 7, 6, 8, 7, 9, 6, 10}), 0, 0, 1, 0, 2, 0, 5, 0, 0, 0, 256, 0, 512, 0, 1280, 0));64__m512i test_mm512_lzcnt_epi32(__m512i __A) {65 // CHECK-LABEL: test_mm512_lzcnt_epi3266 // CHECK: call <16 x i32> @llvm.ctlz.v16i32(<16 x i32> %{{.*}}, i1 true)67 // CHECK: [[ISZERO:%.+]] = icmp eq <16 x i32> %{{.*}}, zeroinitializer68 // CHECK: select <16 x i1> [[ISZERO]], <16 x i32> %{{.*}}, <16 x i32> %{{.*}}69 return _mm512_lzcnt_epi32(__A); 70}71 72TEST_CONSTEXPR(match_v16si(_mm512_lzcnt_epi32((__m512i)(__v16si){1, 2, 4, 8, 16, 32, 64, 128, 3, 5, 6, 7, 9, 10, 11, 12}), 31, 30, 29, 28, 27, 26, 25, 24, 30, 29, 29, 29, 28, 28, 28, 28));73TEST_CONSTEXPR(match_v16si(_mm512_lzcnt_epi32((__m512i)(__v16si){0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}), 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32));74 75__m512i test_mm512_mask_lzcnt_epi32(__m512i __W, __mmask16 __U, __m512i __A) {76 // CHECK-LABEL: test_mm512_mask_lzcnt_epi3277 // CHECK: call <16 x i32> @llvm.ctlz.v16i32(<16 x i32> %{{.*}}, i1 true)78 // CHECK: [[ISZERO:%.+]] = icmp eq <16 x i32> %{{.*}}, zeroinitializer79 // CHECK: select <16 x i1> [[ISZERO]], <16 x i32> %{{.*}}, <16 x i32> %{{.*}}80 // CHECK: select <16 x i1> %{{.*}}, <16 x i32> %{{.*}}, <16 x i32> %{{.*}}81 return _mm512_mask_lzcnt_epi32(__W,__U,__A); 82}83 84TEST_CONSTEXPR(match_v16si(_mm512_mask_lzcnt_epi32(_mm512_set1_epi32(32), /*1010 1100 1010 1101=*/0xacad, (__m512i)(__v16si){1, 2, 4, 8, 16, 32, 64, 128, 3, 5, 6, 7, 9, 10, 11, 12}), 31, 32, 29, 28, 32, 26, 32, 24, 32, 32, 29, 29, 32, 28, 32, 28));85 86__m512i test_mm512_maskz_lzcnt_epi32(__mmask16 __U, __m512i __A) {87 // CHECK-LABEL: test_mm512_maskz_lzcnt_epi3288 // CHECK: call <16 x i32> @llvm.ctlz.v16i32(<16 x i32> %{{.*}}, i1 true)89 // CHECK: [[ISZERO:%.+]] = icmp eq <16 x i32> %{{.*}}, zeroinitializer90 // CHECK: select <16 x i1> [[ISZERO]], <16 x i32> %{{.*}}, <16 x i32> %{{.*}}91 // CHECK: select <16 x i1> %{{.*}}, <16 x i32> %{{.*}}, <16 x i32> %{{.*}}92 return _mm512_maskz_lzcnt_epi32(__U,__A); 93}94 95TEST_CONSTEXPR(match_v16si(_mm512_maskz_lzcnt_epi32(/*1010 1100 1010 1101=*/0xacad, (__m512i)(__v16si){1, 2, 4, 8, 16, 32, 64, 128, 3, 5, 6, 7, 9, 10, 11, 12}), 31, 0, 29, 28, 0, 26, 0, 24, 0, 0, 29, 29, 0, 28, 0, 28));96 97__m512i test_mm512_lzcnt_epi64(__m512i __A) {98 // CHECK-LABEL: test_mm512_lzcnt_epi6499 // CHECK: call {{.*}}<8 x i64> @llvm.ctlz.v8i64(<8 x i64> %{{.*}}, i1 true)100 // CHECK: [[ISZERO:%.+]] = icmp eq <8 x i64> %{{.*}}, zeroinitializer101 // CHECK: select <8 x i1> [[ISZERO]], <8 x i64> %{{.*}}, <8 x i64> %{{.*}}102 return _mm512_lzcnt_epi64(__A); 103}104 105TEST_CONSTEXPR(match_v8di(_mm512_lzcnt_epi64((__m512i)(__v8di){1, 2, 4, 8, 16, 32, 64, 128}), 63, 62, 61, 60, 59, 58, 57, 56));106TEST_CONSTEXPR(match_v8di(_mm512_lzcnt_epi64((__m512i)(__v8di){0, 0, 0, 0, 0, 0, 0, 0}), 64, 64, 64, 64, 64, 64, 64, 64));107 108__m512i test_mm512_mask_lzcnt_epi64(__m512i __W, __mmask8 __U, __m512i __A) {109 // CHECK-LABEL: test_mm512_mask_lzcnt_epi64110 // CHECK: call {{.*}}<8 x i64> @llvm.ctlz.v8i64(<8 x i64> %{{.*}}, i1 true)111 // CHECK: [[ISZERO:%.+]] = icmp eq <8 x i64> %{{.*}}, zeroinitializer112 // CHECK: select <8 x i1> [[ISZERO]], <8 x i64> %{{.*}}, <8 x i64> %{{.*}}113 // CHECK: select <8 x i1> %{{.*}}, <8 x i64> %{{.*}}, <8 x i64> %{{.*}}114 return _mm512_mask_lzcnt_epi64(__W,__U,__A); 115}116 117TEST_CONSTEXPR(match_v8di(_mm512_mask_lzcnt_epi64(_mm512_set1_epi64((long long) 64), /*0101 0111=*/0x57, (__m512i)(__v8di){1, 2, 4, 8, 16, 32, 64, 128}), 63, 62, 61, 64, 59, 64, 57, 64));118 119__m512i test_mm512_maskz_lzcnt_epi64(__mmask8 __U, __m512i __A) {120 // CHECK-LABEL: test_mm512_maskz_lzcnt_epi64121 // CHECK: call {{.*}}<8 x i64> @llvm.ctlz.v8i64(<8 x i64> %{{.*}}, i1 true)122 // CHECK: [[ISZERO:%.+]] = icmp eq <8 x i64> %{{.*}}, zeroinitializer123 // CHECK: select <8 x i1> [[ISZERO]], <8 x i64> %{{.*}}, <8 x i64> %{{.*}}124 // CHECK: select <8 x i1> %{{.*}}, <8 x i64> %{{.*}}, <8 x i64> %{{.*}}125 return _mm512_maskz_lzcnt_epi64(__U,__A); 126}127 128TEST_CONSTEXPR(match_v8di(_mm512_maskz_lzcnt_epi64(/*0101 0111=*/0x57, (__m512i)(__v8di){1, 2, 4, 8, 16, 32, 64, 128}), 63, 62, 61, 0, 59, 0, 57, 0));129 130__m512i test_mm512_broadcastmb_epi64(__m512i a, __m512i b) {131 // CHECK-LABEL: test_mm512_broadcastmb_epi64132 // CHECK: icmp eq <8 x i64> %{{.*}}, %{{.*}}133 // CHECK: zext i8 %{{.*}} to i64134 // CHECK: insertelement <8 x i64> poison, i64 %{{.*}}, i32 0135 // CHECK: insertelement <8 x i64> %{{.*}}, i64 %{{.*}}, i32 1136 // CHECK: insertelement <8 x i64> %{{.*}}, i64 %{{.*}}, i32 2137 // CHECK: insertelement <8 x i64> %{{.*}}, i64 %{{.*}}, i32 3138 // CHECK: insertelement <8 x i64> %{{.*}}, i64 %{{.*}}, i32 4139 // CHECK: insertelement <8 x i64> %{{.*}}, i64 %{{.*}}, i32 5140 // CHECK: insertelement <8 x i64> %{{.*}}, i64 %{{.*}}, i32 6141 // CHECK: insertelement <8 x i64> %{{.*}}, i64 %{{.*}}, i32 7142 return _mm512_broadcastmb_epi64(_mm512_cmpeq_epu64_mask ( a, b)); 143}144TEST_CONSTEXPR(match_v8di(_mm512_broadcastmb_epi64((__mmask8)(0)), 0,0,0,0, 0,0,0,0));145TEST_CONSTEXPR(match_v8di(_mm512_broadcastmb_epi64((__mmask8)(0xab)), 0xab,0xab,0xab,0xab, 0xab,0xab,0xab,0xab));146 147__m512i test_mm512_broadcastmw_epi32(__m512i a, __m512i b) {148 // CHECK-LABEL: test_mm512_broadcastmw_epi32149 // CHECK: icmp eq <16 x i32> %{{.*}}, %{{.*}}150 // CHECK: zext i16 %{{.*}} to i32151 // CHECK: insertelement <16 x i32> poison, i32 %{{.*}}152 // CHECK: insertelement <16 x i32> %{{.*}}, i32 %{{.*}}153 // CHECK: insertelement <16 x i32> %{{.*}}, i32 %{{.*}}154 // CHECK: insertelement <16 x i32> %{{.*}}, i32 %{{.*}}155 // CHECK: insertelement <16 x i32> %{{.*}}, i32 %{{.*}}156 // CHECK: insertelement <16 x i32> %{{.*}}, i32 %{{.*}}157 // CHECK: insertelement <16 x i32> %{{.*}}, i32 %{{.*}}158 // CHECK: insertelement <16 x i32> %{{.*}}, i32 %{{.*}}159 // CHECK: insertelement <16 x i32> %{{.*}}, i32 %{{.*}}160 // CHECK: insertelement <16 x i32> %{{.*}}, i32 %{{.*}}161 // CHECK: insertelement <16 x i32> %{{.*}}, i32 %{{.*}}162 // CHECK: insertelement <16 x i32> %{{.*}}, i32 %{{.*}}163 // CHECK: insertelement <16 x i32> %{{.*}}, i32 %{{.*}}164 // CHECK: insertelement <16 x i32> %{{.*}}, i32 %{{.*}}165 // CHECK: insertelement <16 x i32> %{{.*}}, i32 %{{.*}}166 // CHECK: insertelement <16 x i32> %{{.*}}, i32 %{{.*}}167 return _mm512_broadcastmw_epi32(_mm512_cmpeq_epi32_mask ( a, b)); 168}169TEST_CONSTEXPR(match_v16si(_mm512_broadcastmw_epi32((__mmask16)(0xff)), 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff));170TEST_CONSTEXPR(match_v16si(_mm512_broadcastmw_epi32((__mmask16)(0x0FA1L)), 0x0FA1L,0x0FA1L,0x0FA1L,0x0FA1L, 0x0FA1L,0x0FA1L,0x0FA1L,0x0FA1L, 0x0FA1L,0x0FA1L,0x0FA1L,0x0FA1L, 0x0FA1L,0x0FA1L,0x0FA1L,0x0FA1L));171