Add support for AVX512 masked vector blend intrinsics.
[oota-llvm.git] / test / CodeGen / X86 / avx512-intrinsics.ll
1 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=knl | FileCheck %s
2
3 declare i32 @llvm.x86.avx512.kortestz(i16, i16) nounwind readnone
4 ; CHECK: test_kortestz
5 ; CHECK: kortestw
6 ; CHECK: sete
7 define i32 @test_kortestz(i16 %a0, i16 %a1) {
8   %res = call i32 @llvm.x86.avx512.kortestz(i16 %a0, i16 %a1) 
9   ret i32 %res
10 }
11
12 declare i32 @llvm.x86.avx512.kortestc(i16, i16) nounwind readnone
13 ; CHECK: test_kortestc
14 ; CHECK: kortestw
15 ; CHECK: sbbl
16 define i32 @test_kortestc(i16 %a0, i16 %a1) {
17   %res = call i32 @llvm.x86.avx512.kortestc(i16 %a0, i16 %a1) 
18   ret i32 %res
19 }
20
21 define <16 x float> @test_rcp_ps_512(<16 x float> %a0) {
22   ; CHECK: vrcp14ps
23   %res = call <16 x float> @llvm.x86.avx512.rcp14.ps.512(<16 x float> %a0) ; <<16 x float>> [#uses=1]
24   ret <16 x float> %res
25 }
26 declare <16 x float> @llvm.x86.avx512.rcp14.ps.512(<16 x float>) nounwind readnone
27
28 define <8 x double> @test_rcp_pd_512(<8 x double> %a0) {
29   ; CHECK: vrcp14pd
30   %res = call <8 x double> @llvm.x86.avx512.rcp14.pd.512(<8 x double> %a0) ; <<8 x double>> [#uses=1]
31   ret <8 x double> %res
32 }
33 declare <8 x double> @llvm.x86.avx512.rcp14.pd.512(<8 x double>) nounwind readnone
34
35 define <16 x float> @test_rcp28_ps_512(<16 x float> %a0) {
36   ; CHECK: vrcp28ps
37   %res = call <16 x float> @llvm.x86.avx512.rcp28.ps.512(<16 x float> %a0) ; <<16 x float>> [#uses=1]
38   ret <16 x float> %res
39 }
40 declare <16 x float> @llvm.x86.avx512.rcp28.ps.512(<16 x float>) nounwind readnone
41
42 define <8 x double> @test_rcp28_pd_512(<8 x double> %a0) {
43   ; CHECK: vrcp28pd
44   %res = call <8 x double> @llvm.x86.avx512.rcp28.pd.512(<8 x double> %a0) ; <<8 x double>> [#uses=1]
45   ret <8 x double> %res
46 }
47 declare <8 x double> @llvm.x86.avx512.rcp28.pd.512(<8 x double>) nounwind readnone
48
49 define <8 x double> @test_rndscale_pd_512(<8 x double> %a0) {
50   ; CHECK: vrndscale
51   %res = call <8 x double> @llvm.x86.avx512.rndscale.pd.512(<8 x double> %a0, i32 7) ; <<8 x double>> [#uses=1]
52   ret <8 x double> %res
53 }
54 declare <8 x double> @llvm.x86.avx512.rndscale.pd.512(<8 x double>, i32) nounwind readnone
55
56
57 define <16 x float> @test_rndscale_ps_512(<16 x float> %a0) {
58   ; CHECK: vrndscale
59   %res = call <16 x float> @llvm.x86.avx512.rndscale.ps.512(<16 x float> %a0, i32 7) ; <<16 x float>> [#uses=1]
60   ret <16 x float> %res
61 }
62 declare <16 x float> @llvm.x86.avx512.rndscale.ps.512(<16 x float>, i32) nounwind readnone
63
64
65 define <16 x float> @test_rsqrt_ps_512(<16 x float> %a0) {
66   ; CHECK: vrsqrt14ps
67   %res = call <16 x float> @llvm.x86.avx512.rsqrt14.ps.512(<16 x float> %a0) ; <<16 x float>> [#uses=1]
68   ret <16 x float> %res
69 }
70 declare <16 x float> @llvm.x86.avx512.rsqrt14.ps.512(<16 x float>) nounwind readnone
71
72 define <16 x float> @test_rsqrt28_ps_512(<16 x float> %a0) {
73   ; CHECK: vrsqrt28ps
74   %res = call <16 x float> @llvm.x86.avx512.rsqrt28.ps.512(<16 x float> %a0) ; <<16 x float>> [#uses=1]
75   ret <16 x float> %res
76 }
77 declare <16 x float> @llvm.x86.avx512.rsqrt28.ps.512(<16 x float>) nounwind readnone
78
79 define <4 x float> @test_rsqrt14_ss(<4 x float> %a0) {
80   ; CHECK: vrsqrt14ss
81   %res = call <4 x float> @llvm.x86.avx512.rsqrt14.ss(<4 x float> %a0) ; <<4 x float>> [#uses=1]
82   ret <4 x float> %res
83 }
84 declare <4 x float> @llvm.x86.avx512.rsqrt14.ss(<4 x float>) nounwind readnone
85
86 define <4 x float> @test_rsqrt28_ss(<4 x float> %a0) {
87   ; CHECK: vrsqrt28ss
88   %res = call <4 x float> @llvm.x86.avx512.rsqrt28.ss(<4 x float> %a0) ; <<4 x float>> [#uses=1]
89   ret <4 x float> %res
90 }
91 declare <4 x float> @llvm.x86.avx512.rsqrt28.ss(<4 x float>) nounwind readnone
92
93 define <4 x float> @test_rcp14_ss(<4 x float> %a0) {
94   ; CHECK: vrcp14ss
95   %res = call <4 x float> @llvm.x86.avx512.rcp14.ss(<4 x float> %a0) ; <<4 x float>> [#uses=1]
96   ret <4 x float> %res
97 }
98 declare <4 x float> @llvm.x86.avx512.rcp14.ss(<4 x float>) nounwind readnone
99
100 define <4 x float> @test_rcp28_ss(<4 x float> %a0) {
101   ; CHECK: vrcp28ss
102   %res = call <4 x float> @llvm.x86.avx512.rcp28.ss(<4 x float> %a0) ; <<4 x float>> [#uses=1]
103   ret <4 x float> %res
104 }
105 declare <4 x float> @llvm.x86.avx512.rcp28.ss(<4 x float>) nounwind readnone
106
107 define <8 x double> @test_sqrt_pd_512(<8 x double> %a0) {
108   ; CHECK: vsqrtpd
109   %res = call <8 x double> @llvm.x86.avx512.sqrt.pd.512(<8 x double> %a0) ; <<8 x double>> [#uses=1]
110   ret <8 x double> %res
111 }
112 declare <8 x double> @llvm.x86.avx512.sqrt.pd.512(<8 x double>) nounwind readnone
113
114 define <16 x float> @test_sqrt_ps_512(<16 x float> %a0) {
115   ; CHECK: vsqrtps
116   %res = call <16 x float> @llvm.x86.avx512.sqrt.ps.512(<16 x float> %a0) ; <<16 x float>> [#uses=1]
117   ret <16 x float> %res
118 }
119 declare <16 x float> @llvm.x86.avx512.sqrt.ps.512(<16 x float>) nounwind readnone
120
121 define <4 x float> @test_sqrt_ss(<4 x float> %a0, <4 x float> %a1) {
122   ; CHECK: vsqrtssz
123   %res = call <4 x float> @llvm.x86.avx512.sqrt.ss(<4 x float> %a0, <4 x float> %a1) ; <<4 x float>> [#uses=1]
124   ret <4 x float> %res
125 }
126 declare <4 x float> @llvm.x86.avx512.sqrt.ss(<4 x float>, <4 x float>) nounwind readnone
127
128 define <2 x double> @test_sqrt_sd(<2 x double> %a0, <2 x double> %a1) {
129   ; CHECK: vsqrtsdz
130   %res = call <2 x double> @llvm.x86.avx512.sqrt.sd(<2 x double> %a0, <2 x double> %a1) ; <<2 x double>> [#uses=1]
131   ret <2 x double> %res
132 }
133 declare <2 x double> @llvm.x86.avx512.sqrt.sd(<2 x double>, <2 x double>) nounwind readnone
134
135 define i64 @test_x86_sse2_cvtsd2si64(<2 x double> %a0) {
136   ; CHECK: vcvtsd2siz
137   %res = call i64 @llvm.x86.sse2.cvtsd2si64(<2 x double> %a0) ; <i64> [#uses=1]
138   ret i64 %res
139 }
140 declare i64 @llvm.x86.sse2.cvtsd2si64(<2 x double>) nounwind readnone
141
142 define <2 x double> @test_x86_sse2_cvtsi642sd(<2 x double> %a0, i64 %a1) {
143   ; CHECK: vcvtsi2sdqz
144   %res = call <2 x double> @llvm.x86.sse2.cvtsi642sd(<2 x double> %a0, i64 %a1) ; <<2 x double>> [#uses=1]
145   ret <2 x double> %res
146 }
147 declare <2 x double> @llvm.x86.sse2.cvtsi642sd(<2 x double>, i64) nounwind readnone
148
149 define <2 x double> @test_x86_avx512_cvtusi642sd(<2 x double> %a0, i64 %a1) {
150   ; CHECK: vcvtusi2sdqz
151   %res = call <2 x double> @llvm.x86.avx512.cvtusi642sd(<2 x double> %a0, i64 %a1) ; <<2 x double>> [#uses=1]
152   ret <2 x double> %res
153 }
154 declare <2 x double> @llvm.x86.avx512.cvtusi642sd(<2 x double>, i64) nounwind readnone
155
156 define i64 @test_x86_sse2_cvttsd2si64(<2 x double> %a0) {
157   ; CHECK: vcvttsd2siz
158   %res = call i64 @llvm.x86.sse2.cvttsd2si64(<2 x double> %a0) ; <i64> [#uses=1]
159   ret i64 %res
160 }
161 declare i64 @llvm.x86.sse2.cvttsd2si64(<2 x double>) nounwind readnone
162
163
164 define i64 @test_x86_sse_cvtss2si64(<4 x float> %a0) {
165   ; CHECK: vcvtss2siz
166   %res = call i64 @llvm.x86.sse.cvtss2si64(<4 x float> %a0) ; <i64> [#uses=1]
167   ret i64 %res
168 }
169 declare i64 @llvm.x86.sse.cvtss2si64(<4 x float>) nounwind readnone
170
171
172 define <4 x float> @test_x86_sse_cvtsi642ss(<4 x float> %a0, i64 %a1) {
173   ; CHECK: vcvtsi2ssqz
174   %res = call <4 x float> @llvm.x86.sse.cvtsi642ss(<4 x float> %a0, i64 %a1) ; <<4 x float>> [#uses=1]
175   ret <4 x float> %res
176 }
177 declare <4 x float> @llvm.x86.sse.cvtsi642ss(<4 x float>, i64) nounwind readnone
178
179
180 define i64 @test_x86_sse_cvttss2si64(<4 x float> %a0) {
181   ; CHECK: vcvttss2siz
182   %res = call i64 @llvm.x86.sse.cvttss2si64(<4 x float> %a0) ; <i64> [#uses=1]
183   ret i64 %res
184 }
185 declare i64 @llvm.x86.sse.cvttss2si64(<4 x float>) nounwind readnone
186
187 define i64 @test_x86_avx512_cvtsd2usi64(<2 x double> %a0) {
188   ; CHECK: vcvtsd2usiz
189   %res = call i64 @llvm.x86.avx512.cvtsd2usi64(<2 x double> %a0) ; <i64> [#uses=1]
190   ret i64 %res
191 }
192 declare i64 @llvm.x86.avx512.cvtsd2usi64(<2 x double>) nounwind readnone
193
194 define <16 x float> @test_x86_vcvtph2ps_512(<16 x i16> %a0) {
195   ; CHECK: vcvtph2ps
196   %res = call <16 x float> @llvm.x86.avx512.vcvtph2ps.512(<16 x i16> %a0)
197   ret <16 x float> %res
198 }
199 declare <16 x float> @llvm.x86.avx512.vcvtph2ps.512(<16 x i16>) nounwind readonly
200
201
202 define <16 x i16> @test_x86_vcvtps2ph_256(<16 x float> %a0) {
203   ; CHECK: vcvtps2ph
204   %res = call <16 x i16> @llvm.x86.avx512.vcvtps2ph.512(<16 x float> %a0, i32 0)
205   ret <16 x i16> %res
206 }
207 declare <16 x i16> @llvm.x86.avx512.vcvtps2ph.512(<16 x float>, i32) nounwind readonly
208
209 define <16 x float> @test_x86_vbroadcast_ss_512(i8* %a0) {
210   ; CHECK: vbroadcastss
211   %res = call <16 x float> @llvm.x86.avx512.vbroadcast.ss.512(i8* %a0) ; <<16 x float>> [#uses=1]
212   ret <16 x float> %res
213 }
214 declare <16 x float> @llvm.x86.avx512.vbroadcast.ss.512(i8*) nounwind readonly
215
216 define <8 x double> @test_x86_vbroadcast_sd_512(i8* %a0) {
217   ; CHECK: vbroadcastsd
218   %res = call <8 x double> @llvm.x86.avx512.vbroadcast.sd.512(i8* %a0) ; <<8 x double>> [#uses=1]
219   ret <8 x double> %res
220 }
221 declare <8 x double> @llvm.x86.avx512.vbroadcast.sd.512(i8*) nounwind readonly
222
223 define <16 x float> @test_x86_vbroadcast_ss_ps_512(<4 x float> %a0) {
224   ; CHECK: vbroadcastss
225   %res = call <16 x float> @llvm.x86.avx512.vbroadcast.ss.ps.512(<4 x float> %a0) ; <<16 x float>> [#uses=1]
226   ret <16 x float> %res
227 }
228 declare <16 x float> @llvm.x86.avx512.vbroadcast.ss.ps.512(<4 x float>) nounwind readonly
229
230 define <8 x double> @test_x86_vbroadcast_sd_pd_512(<2 x double> %a0) {
231   ; CHECK: vbroadcastsd
232   %res = call <8 x double> @llvm.x86.avx512.vbroadcast.sd.pd.512(<2 x double> %a0) ; <<8 x double>> [#uses=1]
233   ret <8 x double> %res
234 }
235 declare <8 x double> @llvm.x86.avx512.vbroadcast.sd.pd.512(<2 x double>) nounwind readonly
236
237 define <16 x i32> @test_x86_pbroadcastd_512(<4 x i32>  %a0) {
238   ; CHECK: vpbroadcastd
239   %res = call <16 x i32> @llvm.x86.avx512.pbroadcastd.512(<4 x i32> %a0) ; <<16 x i32>> [#uses=1]
240   ret <16 x i32> %res
241 }
242 declare <16 x i32> @llvm.x86.avx512.pbroadcastd.512(<4 x i32>) nounwind readonly
243
244 define <16 x i32> @test_x86_pbroadcastd_i32_512(i32  %a0) {
245   ; CHECK: vpbroadcastd
246   %res = call <16 x i32> @llvm.x86.avx512.pbroadcastd.i32.512(i32 %a0) ; <<16 x i32>> [#uses=1]
247   ret <16 x i32> %res
248 }
249 declare <16 x i32> @llvm.x86.avx512.pbroadcastd.i32.512(i32) nounwind readonly
250
251 define <8 x i64> @test_x86_pbroadcastq_512(<2 x i64> %a0) {
252   ; CHECK: vpbroadcastq
253   %res = call <8 x i64> @llvm.x86.avx512.pbroadcastq.512(<2 x i64> %a0) ; <<8 x i64>> [#uses=1]
254   ret <8 x i64> %res
255 }
256 declare <8 x i64> @llvm.x86.avx512.pbroadcastq.512(<2 x i64>) nounwind readonly
257
258 define <8 x i64> @test_x86_pbroadcastq_i64_512(i64 %a0) {
259   ; CHECK: vpbroadcastq
260   %res = call <8 x i64> @llvm.x86.avx512.pbroadcastq.i64.512(i64 %a0) ; <<8 x i64>> [#uses=1]
261   ret <8 x i64> %res
262 }
263 declare <8 x i64> @llvm.x86.avx512.pbroadcastq.i64.512(i64) nounwind readonly
264
265 define <16 x i32> @test_x86_pmaxu_d(<16 x i32> %a0, <16 x i32> %a1) {
266   ; CHECK: vpmaxud 
267   %res = call <16 x i32> @llvm.x86.avx512.pmaxu.d(<16 x i32> %a0, <16 x i32> %a1) ; <<16 x i32>> [#uses=1]
268   ret <16 x i32> %res
269 }
270 declare <16 x i32> @llvm.x86.avx512.pmaxu.d(<16 x i32>, <16 x i32>) nounwind readonly
271
272 define <8 x i64> @test_x86_pmaxu_q(<8 x i64> %a0, <8 x i64> %a1) {
273   ; CHECK: vpmaxuq
274   %res = call <8 x i64> @llvm.x86.avx512.pmaxu.q(<8 x i64> %a0, <8 x i64> %a1) ; <<8 x i64>> [#uses=1]
275   ret <8 x i64> %res
276 }
277 declare <8 x i64> @llvm.x86.avx512.pmaxu.q(<8 x i64>, <8 x i64>) nounwind readonly
278
279 define <16 x i32> @test_x86_pmaxs_d(<16 x i32> %a0, <16 x i32> %a1) {
280   ; CHECK: vpmaxsd
281   %res = call <16 x i32> @llvm.x86.avx512.pmaxs.d(<16 x i32> %a0, <16 x i32> %a1) ; <<16 x i32>> [#uses=1]
282   ret <16 x i32> %res
283 }
284 declare <16 x i32> @llvm.x86.avx512.pmaxs.d(<16 x i32>, <16 x i32>) nounwind readonly
285
286 define <8 x i64> @test_x86_pmaxs_q(<8 x i64> %a0, <8 x i64> %a1) {
287   ; CHECK: vpmaxsq
288   %res = call <8 x i64> @llvm.x86.avx512.pmaxs.q(<8 x i64> %a0, <8 x i64> %a1) ; <<8 x i64>> [#uses=1]
289   ret <8 x i64> %res
290 }
291 declare <8 x i64> @llvm.x86.avx512.pmaxs.q(<8 x i64>, <8 x i64>) nounwind readonly
292
293 define <16 x i32> @test_x86_pminu_d(<16 x i32> %a0, <16 x i32> %a1) {
294   ; CHECK: vpminud
295   %res = call <16 x i32> @llvm.x86.avx512.pminu.d(<16 x i32> %a0, <16 x i32> %a1) ; <<16 x i32>> [#uses=1]
296   ret <16 x i32> %res
297 }
298 declare <16 x i32> @llvm.x86.avx512.pminu.d(<16 x i32>, <16 x i32>) nounwind readonly
299
300 define <8 x i64> @test_x86_pminu_q(<8 x i64> %a0, <8 x i64> %a1) {
301   ; CHECK: vpminuq
302   %res = call <8 x i64> @llvm.x86.avx512.pminu.q(<8 x i64> %a0, <8 x i64> %a1) ; <<8 x i64>> [#uses=1]
303   ret <8 x i64> %res
304 }
305 declare <8 x i64> @llvm.x86.avx512.pminu.q(<8 x i64>, <8 x i64>) nounwind readonly
306
307 define <16 x i32> @test_x86_pmins_d(<16 x i32> %a0, <16 x i32> %a1) {
308   ; CHECK: vpminsd
309   %res = call <16 x i32> @llvm.x86.avx512.pmins.d(<16 x i32> %a0, <16 x i32> %a1) ; <<16 x i32>> [#uses=1]
310   ret <16 x i32> %res
311 }
312 declare <16 x i32> @llvm.x86.avx512.pmins.d(<16 x i32>, <16 x i32>) nounwind readonly
313
314 define <8 x i64> @test_x86_pmins_q(<8 x i64> %a0, <8 x i64> %a1) {
315   ; CHECK: vpminsq
316   %res = call <8 x i64> @llvm.x86.avx512.pmins.q(<8 x i64> %a0, <8 x i64> %a1) ; <<8 x i64>> [#uses=1]
317   ret <8 x i64> %res
318 }
319 declare <8 x i64> @llvm.x86.avx512.pmins.q(<8 x i64>, <8 x i64>) nounwind readonly
320
321 define <16 x i32> @test_conflict_d(<16 x i32> %a) {
322   ; CHECK: vpconflictd
323   %res = call <16 x i32> @llvm.x86.avx512.conflict.d.512(<16 x i32> %a)
324   ret <16 x i32> %res
325 }
326 declare <16 x i32> @llvm.x86.avx512.conflict.d.512(<16 x i32>) nounwind readonly
327
328 define <16 x i32> @test_maskz_conflict_d(<16 x i32> %a, i16 %mask) {
329   ; CHECK: vpconflictd %zmm0, %zmm0 {%k1} {z}
330   %vmask = bitcast i16 %mask to <16 x i1>
331   %res = call <16 x i32> @llvm.x86.avx512.conflict.d.maskz.512(<16 x i1> %vmask, <16 x i32> %a)
332   ret <16 x i32> %res
333 }
334 declare <16 x i32> @llvm.x86.avx512.conflict.d.maskz.512(<16 x i1>,<16 x i32>) nounwind readonly
335
336 define <8 x i64> @test_mask_conflict_q(<8 x i64> %a, <8 x i64> %b, i8 %mask) {
337   ; CHECK: vpconflictq {{.*}} {%k1}
338   %vmask = bitcast i8 %mask to <8 x i1>
339   %res = call <8 x i64> @llvm.x86.avx512.conflict.q.mask.512(<8 x i64> %b, <8 x i1> %vmask, <8 x i64> %a)
340   ret <8 x i64> %res
341 }
342 declare <8 x i64> @llvm.x86.avx512.conflict.q.mask.512(<8 x i64>, <8 x i1>,<8 x i64>) nounwind readonly
343
344 define <16 x float> @test_x86_mskblend_ps_512(i16 %a0, <16 x float> %a1, <16 x float> %a2) {
345   ; CHECK: vblendmps
346   %m0 = bitcast i16 %a0 to <16 x i1>
347   %res = call <16 x float> @llvm.x86.avx512.mskblend.ps.512(<16 x i1> %m0, <16 x float> %a1, <16 x float> %a2) ; <<16 x float>> [#uses=1]
348   ret <16 x float> %res
349 }
350 declare <16 x float> @llvm.x86.avx512.mskblend.ps.512(<16 x i1> %a0, <16 x float> %a1, <16 x float> %a2) nounwind readonly
351
352 define <8 x double> @test_x86_mskblend_pd_512(i8 %a0, <8 x double> %a1, <8 x double> %a2) {
353   ; CHECK: vblendmpd
354   %m0 = bitcast i8 %a0 to <8 x i1>
355   %res = call <8 x double> @llvm.x86.avx512.mskblend.pd.512(<8 x i1> %m0, <8 x double> %a1, <8 x double> %a2) ; <<8 x double>> [#uses=1]
356   ret <8 x double> %res
357 }
358 declare <8 x double> @llvm.x86.avx512.mskblend.pd.512(<8 x i1> %a0, <8 x double> %a1, <8 x double> %a2) nounwind readonly
359
360 define <16 x i32> @test_x86_mskblend_d_512(i16 %a0, <16 x i32> %a1, <16 x i32> %a2) {
361   ; CHECK: vpblendmd
362   %m0 = bitcast i16 %a0 to <16 x i1>
363   %res = call <16 x i32> @llvm.x86.avx512.mskblend.d.512(<16 x i1> %m0, <16 x i32> %a1, <16 x i32> %a2) ; <<16 x i32>> [#uses=1]
364   ret <16 x i32> %res
365 }
366 declare <16 x i32> @llvm.x86.avx512.mskblend.d.512(<16 x i1> %a0, <16 x i32> %a1, <16 x i32> %a2) nounwind readonly
367
368 define <8 x i64> @test_x86_mskblend_q_512(i8 %a0, <8 x i64> %a1, <8 x i64> %a2) {
369   ; CHECK: vpblendmq
370   %m0 = bitcast i8 %a0 to <8 x i1>
371   %res = call <8 x i64> @llvm.x86.avx512.mskblend.q.512(<8 x i1> %m0, <8 x i64> %a1, <8 x i64> %a2) ; <<8 x i64>> [#uses=1]
372   ret <8 x i64> %res
373 }
374 declare <8 x i64> @llvm.x86.avx512.mskblend.q.512(<8 x i1> %a0, <8 x i64> %a1, <8 x i64> %a2) nounwind readonly