xref: /llvm-project/clang/test/CodeGen/X86/avx512vlcd-builtins.c (revision a3d2d34e844ac3b9186d9ebc7696b48e717ecb76)
1 // RUN: %clang_cc1 -flax-vector-conversions=none -ffreestanding %s -triple=x86_64-apple-darwin -target-feature +avx512vl -target-feature +avx512cd -emit-llvm -o - -Wall -Werror | FileCheck %s
2 
3 
4 #include <immintrin.h>
5 
test_mm_broadcastmb_epi64(__m128i a,__m128i b)6 __m128i test_mm_broadcastmb_epi64(__m128i a,__m128i b) {
7   // CHECK-LABEL: @test_mm_broadcastmb_epi64
8   // CHECK: icmp eq <4 x i32> %{{.*}}, %{{.*}}
9   // CHECK: shufflevector <4 x i1> %{{.*}}, <4 x i1> zeroinitializer, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
10   // CHECK: zext i8 %{{.*}} to i64
11   // CHECK: insertelement <2 x i64> poison, i64 %{{.*}}, i32 0
12   // CHECK: insertelement <2 x i64> %{{.*}}, i64 %{{.*}}, i32 1
13   return _mm_broadcastmb_epi64(_mm_cmpeq_epi32_mask (a, b));
14 }
15 
test_mm256_broadcastmb_epi64(__m256i a,__m256i b)16 __m256i test_mm256_broadcastmb_epi64(__m256i a, __m256i b) {
17   // CHECK-LABEL: @test_mm256_broadcastmb_epi64
18   // CHECK: icmp eq <4 x i64> %{{.*}}, %{{.*}}
19   // CHECK: shufflevector <4 x i1> %{{.*}}, <4 x i1> zeroinitializer, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
20   // CHECK: zext i8 %{{.*}} to i64
21   // CHECK: insertelement <4 x i64> poison, i64 %{{.*}}, i32 0
22   // CHECK: insertelement <4 x i64> %{{.*}}, i64 %{{.*}}, i32 1
23   // CHECK: insertelement <4 x i64> %{{.*}}, i64 %{{.*}}, i32 2
24   // CHECK: insertelement <4 x i64> %{{.*}}, i64 %{{.*}}, i32 3
25   return _mm256_broadcastmb_epi64(_mm256_cmpeq_epi64_mask ( a, b));
26 }
27 
test_mm_broadcastmw_epi32(__m512i a,__m512i b)28 __m128i test_mm_broadcastmw_epi32(__m512i a, __m512i b) {
29   // CHECK-LABEL: @test_mm_broadcastmw_epi32
30   // CHECK: icmp eq <16 x i32> %{{.*}}, %{{.*}}
31   // CHECK: zext i16 %{{.*}} to i32
32   // CHECK: insertelement <4 x i32> poison, i32 %{{.*}}, i32 0
33   // CHECK: insertelement <4 x i32> %{{.*}}, i32 %{{.*}}, i32 1
34   // CHECK: insertelement <4 x i32> %{{.*}}, i32 %{{.*}}, i32 2
35   // CHECK: insertelement <4 x i32> %{{.*}}, i32 %{{.*}}, i32 3
36   return _mm_broadcastmw_epi32(_mm512_cmpeq_epi32_mask ( a, b));
37 }
38 
test_mm256_broadcastmw_epi32(__m512i a,__m512i b)39 __m256i test_mm256_broadcastmw_epi32(__m512i a, __m512i b) {
40   // CHECK-LABEL: @test_mm256_broadcastmw_epi32
41   // CHECK: icmp eq <16 x i32> %{{.*}}, %{{.*}}
42   // CHECK: zext i16 %{{.*}} to i32
43   // CHECK: insertelement <8 x i32> poison, i32 %{{.*}}, i32 0
44   // CHECK: insertelement <8 x i32> %{{.*}}, i32 %{{.*}}, i32 1
45   // CHECK: insertelement <8 x i32> %{{.*}}, i32 %{{.*}}, i32 2
46   // CHECK: insertelement <8 x i32> %{{.*}}, i32 %{{.*}}, i32 3
47   // CHECK: insertelement <8 x i32> %{{.*}}, i32 %{{.*}}, i32 4
48   // CHECK: insertelement <8 x i32> %{{.*}}, i32 %{{.*}}, i32 5
49   // CHECK: insertelement <8 x i32> %{{.*}}, i32 %{{.*}}, i32 6
50   // CHECK: insertelement <8 x i32> %{{.*}}, i32 %{{.*}}, i32 7
51   return _mm256_broadcastmw_epi32(_mm512_cmpeq_epi32_mask ( a, b));
52 }
53 
test_mm_conflict_epi64(__m128i __A)54 __m128i test_mm_conflict_epi64(__m128i __A) {
55   // CHECK-LABEL: @test_mm_conflict_epi64
56   // CHECK: @llvm.x86.avx512.conflict.q.128
57   return _mm_conflict_epi64(__A);
58 }
59 
test_mm_mask_conflict_epi64(__m128i __W,__mmask8 __U,__m128i __A)60 __m128i test_mm_mask_conflict_epi64(__m128i __W, __mmask8 __U, __m128i __A) {
61   // CHECK-LABEL: @test_mm_mask_conflict_epi64
62   // CHECK: @llvm.x86.avx512.conflict.q.128
63   // CHECK: select <2 x i1> %{{.*}}, <2 x i64> %{{.*}}, <2 x i64> %{{.*}}
64   return _mm_mask_conflict_epi64(__W, __U, __A);
65 }
66 
test_mm_maskz_conflict_epi64(__mmask8 __U,__m128i __A)67 __m128i test_mm_maskz_conflict_epi64(__mmask8 __U, __m128i __A) {
68   // CHECK-LABEL: @test_mm_maskz_conflict_epi64
69   // CHECK: @llvm.x86.avx512.conflict.q.128
70   // CHECK: select <2 x i1> %{{.*}}, <2 x i64> %{{.*}}, <2 x i64> %{{.*}}
71   return _mm_maskz_conflict_epi64(__U, __A);
72 }
73 
test_mm256_conflict_epi64(__m256i __A)74 __m256i test_mm256_conflict_epi64(__m256i __A) {
75   // CHECK-LABEL: @test_mm256_conflict_epi64
76   // CHECK: @llvm.x86.avx512.conflict.q.256
77   return _mm256_conflict_epi64(__A);
78 }
79 
test_mm256_mask_conflict_epi64(__m256i __W,__mmask8 __U,__m256i __A)80 __m256i test_mm256_mask_conflict_epi64(__m256i __W, __mmask8 __U, __m256i __A) {
81   // CHECK-LABEL: @test_mm256_mask_conflict_epi64
82   // CHECK: @llvm.x86.avx512.conflict.q.256
83   // CHECK: select <4 x i1> %{{.*}}, <4 x i64> %{{.*}}, <4 x i64> %{{.*}}
84   return _mm256_mask_conflict_epi64(__W, __U, __A);
85 }
86 
test_mm256_maskz_conflict_epi64(__mmask8 __U,__m256i __A)87 __m256i test_mm256_maskz_conflict_epi64(__mmask8 __U, __m256i __A) {
88   // CHECK-LABEL: @test_mm256_maskz_conflict_epi64
89   // CHECK: @llvm.x86.avx512.conflict.q.256
90   // CHECK: select <4 x i1> %{{.*}}, <4 x i64> %{{.*}}, <4 x i64> %{{.*}}
91   return _mm256_maskz_conflict_epi64(__U, __A);
92 }
93 
test_mm_conflict_epi32(__m128i __A)94 __m128i test_mm_conflict_epi32(__m128i __A) {
95   // CHECK-LABEL: @test_mm_conflict_epi32
96   // CHECK: @llvm.x86.avx512.conflict.d.128
97   return _mm_conflict_epi32(__A);
98 }
99 
test_mm_mask_conflict_epi32(__m128i __W,__mmask8 __U,__m128i __A)100 __m128i test_mm_mask_conflict_epi32(__m128i __W, __mmask8 __U, __m128i __A) {
101   // CHECK-LABEL: @test_mm_mask_conflict_epi32
102   // CHECK: @llvm.x86.avx512.conflict.d.128
103   // CHECK: select <4 x i1> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> %{{.*}}
104   return _mm_mask_conflict_epi32(__W, __U, __A);
105 }
106 
test_mm_maskz_conflict_epi32(__mmask8 __U,__m128i __A)107 __m128i test_mm_maskz_conflict_epi32(__mmask8 __U, __m128i __A) {
108   // CHECK-LABEL: @test_mm_maskz_conflict_epi32
109   // CHECK: @llvm.x86.avx512.conflict.d.128
110   // CHECK: select <4 x i1> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> %{{.*}}
111   return _mm_maskz_conflict_epi32(__U, __A);
112 }
113 
test_mm256_conflict_epi32(__m256i __A)114 __m256i test_mm256_conflict_epi32(__m256i __A) {
115   // CHECK-LABEL: @test_mm256_conflict_epi32
116   // CHECK: @llvm.x86.avx512.conflict.d.256
117   return _mm256_conflict_epi32(__A);
118 }
119 
test_mm256_mask_conflict_epi32(__m256i __W,__mmask8 __U,__m256i __A)120 __m256i test_mm256_mask_conflict_epi32(__m256i __W, __mmask8 __U, __m256i __A) {
121   // CHECK-LABEL: @test_mm256_mask_conflict_epi32
122   // CHECK: @llvm.x86.avx512.conflict.d.256
123   // CHECK: select <8 x i1> %{{.*}}, <8 x i32> %{{.*}}, <8 x i32> %{{.*}}
124   return _mm256_mask_conflict_epi32(__W, __U, __A);
125 }
126 
test_mm256_maskz_conflict_epi32(__mmask8 __U,__m256i __A)127 __m256i test_mm256_maskz_conflict_epi32(__mmask8 __U, __m256i __A) {
128   // CHECK-LABEL: @test_mm256_maskz_conflict_epi32
129   // CHECK: @llvm.x86.avx512.conflict.d.256
130   // CHECK: select <8 x i1> %{{.*}}, <8 x i32> %{{.*}}, <8 x i32> %{{.*}}
131   return _mm256_maskz_conflict_epi32(__U, __A);
132 }
133 
test_mm_lzcnt_epi32(__m128i __A)134 __m128i test_mm_lzcnt_epi32(__m128i __A) {
135   // CHECK-LABEL: @test_mm_lzcnt_epi32
136   // CHECK: call <4 x i32> @llvm.ctlz.v4i32(<4 x i32> %{{.*}}, i1 false)
137   return _mm_lzcnt_epi32(__A);
138 }
139 
test_mm_mask_lzcnt_epi32(__m128i __W,__mmask8 __U,__m128i __A)140 __m128i test_mm_mask_lzcnt_epi32(__m128i __W, __mmask8 __U, __m128i __A) {
141   // CHECK-LABEL: @test_mm_mask_lzcnt_epi32
142   // CHECK: call <4 x i32> @llvm.ctlz.v4i32(<4 x i32> %{{.*}}, i1 false)
143   // CHECK: select <4 x i1> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> %{{.*}}
144   return _mm_mask_lzcnt_epi32(__W, __U, __A);
145 }
146 
test_mm_maskz_lzcnt_epi32(__mmask8 __U,__m128i __A)147 __m128i test_mm_maskz_lzcnt_epi32(__mmask8 __U, __m128i __A) {
148   // CHECK-LABEL: @test_mm_maskz_lzcnt_epi32
149   // CHECK: call <4 x i32> @llvm.ctlz.v4i32(<4 x i32> %{{.*}}, i1 false)
150   // CHECK: select <4 x i1> %{{.*}}, <4 x i32> %{{.*}}, <4 x i32> %{{.*}}
151   return _mm_maskz_lzcnt_epi32(__U, __A);
152 }
153 
test_mm256_lzcnt_epi32(__m256i __A)154 __m256i test_mm256_lzcnt_epi32(__m256i __A) {
155   // CHECK-LABEL: @test_mm256_lzcnt_epi32
156   // CHECK: call <8 x i32> @llvm.ctlz.v8i32(<8 x i32> %{{.*}}, i1 false)
157   return _mm256_lzcnt_epi32(__A);
158 }
159 
test_mm256_mask_lzcnt_epi32(__m256i __W,__mmask8 __U,__m256i __A)160 __m256i test_mm256_mask_lzcnt_epi32(__m256i __W, __mmask8 __U, __m256i __A) {
161   // CHECK-LABEL: @test_mm256_mask_lzcnt_epi32
162   // CHECK: call <8 x i32> @llvm.ctlz.v8i32(<8 x i32> %{{.*}}, i1 false)
163   // CHECK: select <8 x i1> %{{.*}}, <8 x i32> %{{.*}}, <8 x i32> %{{.*}}
164   return _mm256_mask_lzcnt_epi32(__W, __U, __A);
165 }
166 
test_mm256_maskz_lzcnt_epi32(__mmask8 __U,__m256i __A)167 __m256i test_mm256_maskz_lzcnt_epi32(__mmask8 __U, __m256i __A) {
168   // CHECK-LABEL: @test_mm256_maskz_lzcnt_epi32
169   // CHECK: call <8 x i32> @llvm.ctlz.v8i32(<8 x i32> %{{.*}}, i1 false)
170   // CHECK: select <8 x i1> %{{.*}}, <8 x i32> %{{.*}}, <8 x i32> %{{.*}}
171   return _mm256_maskz_lzcnt_epi32(__U, __A);
172 }
173 
test_mm_lzcnt_epi64(__m128i __A)174 __m128i test_mm_lzcnt_epi64(__m128i __A) {
175   // CHECK-LABEL: @test_mm_lzcnt_epi64
176   // CHECK: call <2 x i64> @llvm.ctlz.v2i64(<2 x i64> %{{.*}}, i1 false)
177   return _mm_lzcnt_epi64(__A);
178 }
179 
test_mm_mask_lzcnt_epi64(__m128i __W,__mmask8 __U,__m128i __A)180 __m128i test_mm_mask_lzcnt_epi64(__m128i __W, __mmask8 __U, __m128i __A) {
181   // CHECK-LABEL: @test_mm_mask_lzcnt_epi64
182   // CHECK: call <2 x i64> @llvm.ctlz.v2i64(<2 x i64> %{{.*}}, i1 false)
183   // CHECK: select <2 x i1> %{{.*}}, <2 x i64> %{{.*}}, <2 x i64> %{{.*}}
184   return _mm_mask_lzcnt_epi64(__W, __U, __A);
185 }
186 
test_mm_maskz_lzcnt_epi64(__mmask8 __U,__m128i __A)187 __m128i test_mm_maskz_lzcnt_epi64(__mmask8 __U, __m128i __A) {
188   // CHECK-LABEL: @test_mm_maskz_lzcnt_epi64
189   // CHECK: call <2 x i64> @llvm.ctlz.v2i64(<2 x i64> %{{.*}}, i1 false)
190   // CHECK: select <2 x i1> %{{.*}}, <2 x i64> %{{.*}}, <2 x i64> %{{.*}}
191   return _mm_maskz_lzcnt_epi64(__U, __A);
192 }
193 
test_mm256_lzcnt_epi64(__m256i __A)194 __m256i test_mm256_lzcnt_epi64(__m256i __A) {
195   // CHECK-LABEL: @test_mm256_lzcnt_epi64
196   // CHECK: call <4 x i64> @llvm.ctlz.v4i64(<4 x i64> %{{.*}}, i1 false)
197   return _mm256_lzcnt_epi64(__A);
198 }
199 
test_mm256_mask_lzcnt_epi64(__m256i __W,__mmask8 __U,__m256i __A)200 __m256i test_mm256_mask_lzcnt_epi64(__m256i __W, __mmask8 __U, __m256i __A) {
201   // CHECK-LABEL: @test_mm256_mask_lzcnt_epi64
202   // CHECK: call <4 x i64> @llvm.ctlz.v4i64(<4 x i64> %{{.*}}, i1 false)
203   // CHECK: select <4 x i1> %{{.*}}, <4 x i64> %{{.*}}, <4 x i64> %{{.*}}
204   return _mm256_mask_lzcnt_epi64(__W, __U, __A);
205 }
206 
test_mm256_maskz_lzcnt_epi64(__mmask8 __U,__m256i __A)207 __m256i test_mm256_maskz_lzcnt_epi64(__mmask8 __U, __m256i __A) {
208   // CHECK-LABEL: @test_mm256_maskz_lzcnt_epi64
209   // CHECK: call <4 x i64> @llvm.ctlz.v4i64(<4 x i64> %{{.*}}, i1 false)
210   // CHECK: select <4 x i1> %{{.*}}, <4 x i64> %{{.*}}, <4 x i64> %{{.*}}
211   return _mm256_maskz_lzcnt_epi64(__U, __A);
212 }
213