AVX-512: Full implementation for VRNDSCALESS/SD instructions and intrinsics.
[oota-llvm.git] / test / CodeGen / X86 / avx512-intrinsics.ll
1 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=knl --show-mc-encoding| FileCheck %s
2
3 declare i32 @llvm.x86.avx512.kortestz.w(i16, i16) nounwind readnone
4 ; CHECK-LABEL: 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.w(i16 %a0, i16 %a1)
9   ret i32 %res
10 }
11
12 declare i32 @llvm.x86.avx512.kortestc.w(i16, i16) nounwind readnone
13 ; CHECK-LABEL: 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.w(i16 %a0, i16 %a1)
18   ret i32 %res
19 }
20
21 declare i16 @llvm.x86.avx512.kand.w(i16, i16) nounwind readnone
22 ; CHECK-LABEL: test_kand
23 ; CHECK: kandw
24 ; CHECK: kandw
25 define i16 @test_kand(i16 %a0, i16 %a1) {
26   %t1 = call i16 @llvm.x86.avx512.kand.w(i16 %a0, i16 8)
27   %t2 = call i16 @llvm.x86.avx512.kand.w(i16 %t1, i16 %a1)
28   ret i16 %t2
29 }
30
31 declare i16 @llvm.x86.avx512.knot.w(i16) nounwind readnone
32 ; CHECK-LABEL: test_knot
33 ; CHECK: knotw
34 define i16 @test_knot(i16 %a0) {
35   %res = call i16 @llvm.x86.avx512.knot.w(i16 %a0)
36   ret i16 %res
37 }
38
39 declare i16 @llvm.x86.avx512.kunpck.bw(i16, i16) nounwind readnone
40
41 ; CHECK-LABEL: unpckbw_test
42 ; CHECK: kunpckbw
43 ; CHECK:ret
44 define i16 @unpckbw_test(i16 %a0, i16 %a1) {
45   %res = call i16 @llvm.x86.avx512.kunpck.bw(i16 %a0, i16 %a1)
46   ret i16 %res
47 }
48
49 define <16 x float> @test_rcp_ps_512(<16 x float> %a0) {
50   ; CHECK: vrcp14ps {{.*}}encoding: [0x62,0xf2,0x7d,0x48,0x4c,0xc0]
51   %res = call <16 x float> @llvm.x86.avx512.rcp14.ps.512(<16 x float> %a0, <16 x float> zeroinitializer, i16 -1) ; <<16 x float>> [#uses=1]
52   ret <16 x float> %res
53 }
54 declare <16 x float> @llvm.x86.avx512.rcp14.ps.512(<16 x float>, <16 x float>, i16) nounwind readnone
55
56 define <8 x double> @test_rcp_pd_512(<8 x double> %a0) {
57   ; CHECK: vrcp14pd {{.*}}encoding: [0x62,0xf2,0xfd,0x48,0x4c,0xc0]
58   %res = call <8 x double> @llvm.x86.avx512.rcp14.pd.512(<8 x double> %a0, <8 x double> zeroinitializer, i8 -1) ; <<8 x double>> [#uses=1]
59   ret <8 x double> %res
60 }
61 declare <8 x double> @llvm.x86.avx512.rcp14.pd.512(<8 x double>, <8 x double>, i8) nounwind readnone
62
63 declare <8 x double> @llvm.x86.avx512.mask.rndscale.pd.512(<8 x double>, i32, <8 x double>, i8, i32)
64
65 define <8 x double> @test7(<8 x double> %a) {
66 ; CHECK: vrndscalepd {{.*}}encoding: [0x62,0xf3,0xfd,0x48,0x09,0xc0,0x0b]
67   %res = call <8 x double> @llvm.x86.avx512.mask.rndscale.pd.512(<8 x double> %a, i32 11, <8 x double> %a, i8 -1, i32 4)
68   ret <8 x double>%res
69 }
70
71 declare <2 x double> @llvm.x86.avx512.mask.rndscale.sd(<2 x double>, <2 x double>, <2 x double>, i8, i32, i32)
72
73 define <2 x double> @test_rndsc_sd(<2 x double> %a, <2 x double> %b, <2 x double> %c) {
74 ; CHECK: vrndscalesd $11, %xmm{{.*}} {%k1} ## encoding: [0x62,0xf3,0xfd,0x09,0x0b,0xd1,0x0b]
75   %res = call <2 x double> @llvm.x86.avx512.mask.rndscale.sd(<2 x double> %a, <2 x double> %b, <2 x double> %c, i8 5, i32 11, i32 4)
76   ret <2 x double>%res
77 }
78
79 declare <16 x float> @llvm.x86.avx512.mask.rndscale.ps.512(<16 x float>, i32, <16 x float>, i16, i32)
80
81 define <16 x float> @test8(<16 x float> %a) {
82 ; CHECK: vrndscaleps {{.*}}encoding: [0x62,0xf3,0x7d,0x48,0x08,0xc0,0x0b]
83   %res = call <16 x float> @llvm.x86.avx512.mask.rndscale.ps.512(<16 x float> %a, i32 11, <16 x float> %a, i16 -1, i32 4)
84   ret <16 x float>%res
85 }
86
87 define <16 x float> @test_rsqrt_ps_512(<16 x float> %a0) {
88   ; CHECK: vrsqrt14ps {{.*}}encoding: [0x62,0xf2,0x7d,0x48,0x4e,0xc0]
89   %res = call <16 x float> @llvm.x86.avx512.rsqrt14.ps.512(<16 x float> %a0, <16 x float> zeroinitializer, i16 -1) ; <<16 x float>> [#uses=1]
90   ret <16 x float> %res
91 }
92 declare <16 x float> @llvm.x86.avx512.rsqrt14.ps.512(<16 x float>, <16 x float>, i16) nounwind readnone
93
94 define <4 x float> @test_rsqrt14_ss(<4 x float> %a0) {
95   ; CHECK: vrsqrt14ss {{.*}}encoding: [0x62,0xf2,0x7d,0x08,0x4f,0xc0]
96   %res = call <4 x float> @llvm.x86.avx512.rsqrt14.ss(<4 x float> %a0, <4 x float> %a0, <4 x float> zeroinitializer, i8 -1) ; <<4 x float>> [#uses=1]
97   ret <4 x float> %res
98 }
99 declare <4 x float> @llvm.x86.avx512.rsqrt14.ss(<4 x float>, <4 x float>, <4 x float>, i8) nounwind readnone
100
101 define <4 x float> @test_rcp14_ss(<4 x float> %a0) {
102   ; CHECK: vrcp14ss {{.*}}encoding: [0x62,0xf2,0x7d,0x08,0x4d,0xc0]
103   %res = call <4 x float> @llvm.x86.avx512.rcp14.ss(<4 x float> %a0, <4 x float> %a0, <4 x float> zeroinitializer, i8 -1) ; <<4 x float>> [#uses=1]
104   ret <4 x float> %res
105 }
106 declare <4 x float> @llvm.x86.avx512.rcp14.ss(<4 x float>, <4 x float>, <4 x float>, i8) nounwind readnone
107
108 define <8 x double> @test_sqrt_pd_512(<8 x double> %a0) {
109   ; CHECK: vsqrtpd
110   %res = call <8 x double> @llvm.x86.avx512.sqrt.pd.512(<8 x double> %a0,  <8 x double> zeroinitializer, i8 -1, i32 4) ; <<8 x double>> [#uses=1]
111   ret <8 x double> %res
112 }
113 declare <8 x double> @llvm.x86.avx512.sqrt.pd.512(<8 x double>, <8 x double>, i8, i32) nounwind readnone
114
115 define <16 x float> @test_sqrt_ps_512(<16 x float> %a0) {
116   ; CHECK: vsqrtps
117   %res = call <16 x float> @llvm.x86.avx512.sqrt.ps.512(<16 x float> %a0, <16 x float> zeroinitializer, i16 -1, i32 4) ; <<16 x float>> [#uses=1]
118   ret <16 x float> %res
119 }
120 declare <16 x float> @llvm.x86.avx512.sqrt.ps.512(<16 x float>, <16 x float>, i16, i32) nounwind readnone
121
122 define <4 x float> @test_sqrt_ss(<4 x float> %a0, <4 x float> %a1) {
123   ; CHECK: vsqrtss {{.*}}encoding: [0x62
124   %res = call <4 x float> @llvm.x86.avx512.sqrt.ss(<4 x float> %a0, <4 x float> %a1) ; <<4 x float>> [#uses=1]
125   ret <4 x float> %res
126 }
127 declare <4 x float> @llvm.x86.avx512.sqrt.ss(<4 x float>, <4 x float>) nounwind readnone
128
129 define <2 x double> @test_sqrt_sd(<2 x double> %a0, <2 x double> %a1) {
130   ; CHECK: vsqrtsd {{.*}}encoding: [0x62
131   %res = call <2 x double> @llvm.x86.avx512.sqrt.sd(<2 x double> %a0, <2 x double> %a1) ; <<2 x double>> [#uses=1]
132   ret <2 x double> %res
133 }
134 declare <2 x double> @llvm.x86.avx512.sqrt.sd(<2 x double>, <2 x double>) nounwind readnone
135
136 define i64 @test_x86_sse2_cvtsd2si64(<2 x double> %a0) {
137   ; CHECK: vcvtsd2si {{.*}}encoding: [0x62
138   %res = call i64 @llvm.x86.sse2.cvtsd2si64(<2 x double> %a0) ; <i64> [#uses=1]
139   ret i64 %res
140 }
141 declare i64 @llvm.x86.sse2.cvtsd2si64(<2 x double>) nounwind readnone
142
143 define <2 x double> @test_x86_sse2_cvtsi642sd(<2 x double> %a0, i64 %a1) {
144   ; CHECK: vcvtsi2sdq {{.*}}encoding: [0x62
145   %res = call <2 x double> @llvm.x86.sse2.cvtsi642sd(<2 x double> %a0, i64 %a1) ; <<2 x double>> [#uses=1]
146   ret <2 x double> %res
147 }
148 declare <2 x double> @llvm.x86.sse2.cvtsi642sd(<2 x double>, i64) nounwind readnone
149
150 define <2 x double> @test_x86_avx512_cvtusi642sd(<2 x double> %a0, i64 %a1) {
151   ; CHECK: vcvtusi2sdq {{.*}}encoding: [0x62
152   %res = call <2 x double> @llvm.x86.avx512.cvtusi642sd(<2 x double> %a0, i64 %a1) ; <<2 x double>> [#uses=1]
153   ret <2 x double> %res
154 }
155 declare <2 x double> @llvm.x86.avx512.cvtusi642sd(<2 x double>, i64) nounwind readnone
156
157 define i64 @test_x86_sse2_cvttsd2si64(<2 x double> %a0) {
158   ; CHECK: vcvttsd2si {{.*}}encoding: [0x62
159   %res = call i64 @llvm.x86.sse2.cvttsd2si64(<2 x double> %a0) ; <i64> [#uses=1]
160   ret i64 %res
161 }
162 declare i64 @llvm.x86.sse2.cvttsd2si64(<2 x double>) nounwind readnone
163
164
165 define i64 @test_x86_sse_cvtss2si64(<4 x float> %a0) {
166   ; CHECK: vcvtss2si {{.*}}encoding: [0x62
167   %res = call i64 @llvm.x86.sse.cvtss2si64(<4 x float> %a0) ; <i64> [#uses=1]
168   ret i64 %res
169 }
170 declare i64 @llvm.x86.sse.cvtss2si64(<4 x float>) nounwind readnone
171
172
173 define <4 x float> @test_x86_sse_cvtsi642ss(<4 x float> %a0, i64 %a1) {
174   ; CHECK: vcvtsi2ssq {{.*}}encoding: [0x62
175   %res = call <4 x float> @llvm.x86.sse.cvtsi642ss(<4 x float> %a0, i64 %a1) ; <<4 x float>> [#uses=1]
176   ret <4 x float> %res
177 }
178 declare <4 x float> @llvm.x86.sse.cvtsi642ss(<4 x float>, i64) nounwind readnone
179
180
181 define i64 @test_x86_sse_cvttss2si64(<4 x float> %a0) {
182   ; CHECK: vcvttss2si {{.*}}encoding: [0x62
183   %res = call i64 @llvm.x86.sse.cvttss2si64(<4 x float> %a0) ; <i64> [#uses=1]
184   ret i64 %res
185 }
186 declare i64 @llvm.x86.sse.cvttss2si64(<4 x float>) nounwind readnone
187
188 define i64 @test_x86_avx512_cvtsd2usi64(<2 x double> %a0) {
189   ; CHECK: vcvtsd2usi {{.*}}encoding: [0x62
190   %res = call i64 @llvm.x86.avx512.cvtsd2usi64(<2 x double> %a0) ; <i64> [#uses=1]
191   ret i64 %res
192 }
193 declare i64 @llvm.x86.avx512.cvtsd2usi64(<2 x double>) nounwind readnone
194
195 define <16 x float> @test_x86_vcvtph2ps_512(<16 x i16> %a0) {
196   ; CHECK: vcvtph2ps  %ymm0, %zmm0    ## encoding: [0x62,0xf2,0x7d,0x48,0x13,0xc0]
197   %res = call <16 x float> @llvm.x86.avx512.mask.vcvtph2ps.512(<16 x i16> %a0, <16 x float> zeroinitializer, i16 -1, i32 4)
198   ret <16 x float> %res
199 }
200 declare <16 x float> @llvm.x86.avx512.mask.vcvtph2ps.512(<16 x i16>, <16 x float>, i16, i32) nounwind readonly
201
202
203 define <16 x i16> @test_x86_vcvtps2ph_256(<16 x float> %a0) {
204   ; CHECK: vcvtps2ph $2, %zmm0, %ymm0  ## encoding: [0x62,0xf3,0x7d,0x48,0x1d,0xc0,0x02]
205   %res = call <16 x i16> @llvm.x86.avx512.mask.vcvtps2ph.512(<16 x float> %a0, i32 2, <16 x i16> zeroinitializer, i16 -1)
206   ret <16 x i16> %res
207 }
208
209 declare <16 x i16> @llvm.x86.avx512.mask.vcvtps2ph.512(<16 x float>, i32, <16 x i16>, i16) nounwind readonly
210
211 define <16 x float> @test_x86_vbroadcast_ss_512(i8* %a0) {
212   ; CHECK: vbroadcastss
213   %res = call <16 x float> @llvm.x86.avx512.vbroadcast.ss.512(i8* %a0) ; <<16 x float>> [#uses=1]
214   ret <16 x float> %res
215 }
216 declare <16 x float> @llvm.x86.avx512.vbroadcast.ss.512(i8*) nounwind readonly
217
218 define <8 x double> @test_x86_vbroadcast_sd_512(i8* %a0) {
219   ; CHECK: vbroadcastsd
220   %res = call <8 x double> @llvm.x86.avx512.vbroadcast.sd.512(i8* %a0) ; <<8 x double>> [#uses=1]
221   ret <8 x double> %res
222 }
223 declare <8 x double> @llvm.x86.avx512.vbroadcast.sd.512(i8*) nounwind readonly
224
225 define <16 x float> @test_x86_vbroadcast_ss_ps_512(<4 x float> %a0) {
226   ; CHECK: vbroadcastss
227   %res = call <16 x float> @llvm.x86.avx512.vbroadcast.ss.ps.512(<4 x float> %a0) ; <<16 x float>> [#uses=1]
228   ret <16 x float> %res
229 }
230 declare <16 x float> @llvm.x86.avx512.vbroadcast.ss.ps.512(<4 x float>) nounwind readonly
231
232 define <8 x double> @test_x86_vbroadcast_sd_pd_512(<2 x double> %a0) {
233   ; CHECK: vbroadcastsd
234   %res = call <8 x double> @llvm.x86.avx512.vbroadcast.sd.pd.512(<2 x double> %a0) ; <<8 x double>> [#uses=1]
235   ret <8 x double> %res
236 }
237 declare <8 x double> @llvm.x86.avx512.vbroadcast.sd.pd.512(<2 x double>) nounwind readonly
238
239 define <16 x i32> @test_x86_pbroadcastd_512(<4 x i32>  %a0) {
240   ; CHECK: vpbroadcastd
241   %res = call <16 x i32> @llvm.x86.avx512.pbroadcastd.512(<4 x i32> %a0) ; <<16 x i32>> [#uses=1]
242   ret <16 x i32> %res
243 }
244 declare <16 x i32> @llvm.x86.avx512.pbroadcastd.512(<4 x i32>) nounwind readonly
245
246 define <16 x i32> @test_x86_pbroadcastd_i32_512(i32  %a0) {
247   ; CHECK: vpbroadcastd
248   %res = call <16 x i32> @llvm.x86.avx512.pbroadcastd.i32.512(i32 %a0) ; <<16 x i32>> [#uses=1]
249   ret <16 x i32> %res
250 }
251 declare <16 x i32> @llvm.x86.avx512.pbroadcastd.i32.512(i32) nounwind readonly
252
253 define <8 x i64> @test_x86_pbroadcastq_512(<2 x i64> %a0) {
254   ; CHECK: vpbroadcastq
255   %res = call <8 x i64> @llvm.x86.avx512.pbroadcastq.512(<2 x i64> %a0) ; <<8 x i64>> [#uses=1]
256   ret <8 x i64> %res
257 }
258 declare <8 x i64> @llvm.x86.avx512.pbroadcastq.512(<2 x i64>) nounwind readonly
259
260 define <8 x i64> @test_x86_pbroadcastq_i64_512(i64 %a0) {
261   ; CHECK: vpbroadcastq
262   %res = call <8 x i64> @llvm.x86.avx512.pbroadcastq.i64.512(i64 %a0) ; <<8 x i64>> [#uses=1]
263   ret <8 x i64> %res
264 }
265 declare <8 x i64> @llvm.x86.avx512.pbroadcastq.i64.512(i64) nounwind readonly
266
267 define <16 x i32> @test_conflict_d(<16 x i32> %a) {
268   ; CHECK: movw $-1, %ax
269   ; CHECK: vpxor
270   ; CHECK: vpconflictd
271   %res = call <16 x i32> @llvm.x86.avx512.mask.conflict.d.512(<16 x i32> %a, <16 x i32> zeroinitializer, i16 -1)
272   ret <16 x i32> %res
273 }
274
275 declare <16 x i32> @llvm.x86.avx512.mask.conflict.d.512(<16 x i32>, <16 x i32>, i16) nounwind readonly
276
277 define <8 x i64> @test_conflict_q(<8 x i64> %a) {
278   ; CHECK: movb $-1, %al
279   ; CHECK: vpxor
280   ; CHECK: vpconflictq
281   %res = call <8 x i64> @llvm.x86.avx512.mask.conflict.q.512(<8 x i64> %a, <8 x i64> zeroinitializer, i8 -1)
282   ret <8 x i64> %res
283 }
284
285 declare <8 x i64> @llvm.x86.avx512.mask.conflict.q.512(<8 x i64>, <8 x i64>, i8) nounwind readonly
286
287 define <16 x i32> @test_maskz_conflict_d(<16 x i32> %a, i16 %mask) {
288   ; CHECK: vpconflictd
289   %res = call <16 x i32> @llvm.x86.avx512.mask.conflict.d.512(<16 x i32> %a, <16 x i32> zeroinitializer, i16 %mask)
290   ret <16 x i32> %res
291 }
292
293 define <8 x i64> @test_mask_conflict_q(<8 x i64> %a, <8 x i64> %b, i8 %mask) {
294   ; CHECK: vpconflictq
295   %res = call <8 x i64> @llvm.x86.avx512.mask.conflict.q.512(<8 x i64> %a, <8 x i64> %b, i8 %mask)
296   ret <8 x i64> %res
297 }
298
299 define <16 x i32> @test_lzcnt_d(<16 x i32> %a) {
300   ; CHECK: movw $-1, %ax
301   ; CHECK: vpxor
302   ; CHECK: vplzcntd
303   %res = call <16 x i32> @llvm.x86.avx512.mask.lzcnt.d.512(<16 x i32> %a, <16 x i32> zeroinitializer, i16 -1)
304   ret <16 x i32> %res
305 }
306
307 declare <16 x i32> @llvm.x86.avx512.mask.lzcnt.d.512(<16 x i32>, <16 x i32>, i16) nounwind readonly
308
309 define <8 x i64> @test_lzcnt_q(<8 x i64> %a) {
310   ; CHECK: movb $-1, %al
311   ; CHECK: vpxor
312   ; CHECK: vplzcntq
313   %res = call <8 x i64> @llvm.x86.avx512.mask.lzcnt.q.512(<8 x i64> %a, <8 x i64> zeroinitializer, i8 -1)
314   ret <8 x i64> %res
315 }
316
317 declare <8 x i64> @llvm.x86.avx512.mask.lzcnt.q.512(<8 x i64>, <8 x i64>, i8) nounwind readonly
318
319
320 define <16 x i32> @test_mask_lzcnt_d(<16 x i32> %a, <16 x i32> %b, i16 %mask) {
321   ; CHECK: vplzcntd
322   %res = call <16 x i32> @llvm.x86.avx512.mask.lzcnt.d.512(<16 x i32> %a, <16 x i32> %b, i16 %mask)
323   ret <16 x i32> %res
324 }
325
326 define <8 x i64> @test_mask_lzcnt_q(<8 x i64> %a, <8 x i64> %b, i8 %mask) {
327   ; CHECK: vplzcntq
328   %res = call <8 x i64> @llvm.x86.avx512.mask.lzcnt.q.512(<8 x i64> %a, <8 x i64> %b, i8 %mask)
329   ret <8 x i64> %res
330 }
331
332 define <16 x i32> @test_ctlz_d(<16 x i32> %a) {
333   ; CHECK-LABEL: test_ctlz_d
334   ; CHECK: vplzcntd
335   %res = call <16 x i32> @llvm.ctlz.v16i32(<16 x i32> %a, i1 false)
336   ret <16 x i32> %res
337 }
338
339 declare <16 x i32> @llvm.ctlz.v16i32(<16 x i32>, i1) nounwind readonly
340
341 define <8 x i64> @test_ctlz_q(<8 x i64> %a) {
342   ; CHECK-LABEL: test_ctlz_q
343   ; CHECK: vplzcntq
344   %res = call <8 x i64> @llvm.ctlz.v8i64(<8 x i64> %a, i1 false)
345   ret <8 x i64> %res
346 }
347
348 declare <8 x i64> @llvm.ctlz.v8i64(<8 x i64>, i1) nounwind readonly
349
350 define <16 x float> @test_x86_mask_blend_ps_512(i16 %a0, <16 x float> %a1, <16 x float> %a2) {
351   ; CHECK: vblendmps %zmm1, %zmm0
352   %res = call <16 x float> @llvm.x86.avx512.mask.blend.ps.512(<16 x float> %a1, <16 x float> %a2, i16 %a0) ; <<16 x float>> [#uses=1]
353   ret <16 x float> %res
354 }
355
356 declare <16 x float> @llvm.x86.avx512.mask.blend.ps.512(<16 x float>, <16 x float>, i16) nounwind readonly
357
358 define <8 x double> @test_x86_mask_blend_pd_512(i8 %a0, <8 x double> %a1, <8 x double> %a2) {
359   ; CHECK: vblendmpd %zmm1, %zmm0
360   %res = call <8 x double> @llvm.x86.avx512.mask.blend.pd.512(<8 x double> %a1, <8 x double> %a2, i8 %a0) ; <<8 x double>> [#uses=1]
361   ret <8 x double> %res
362 }
363
364 define <8 x double> @test_x86_mask_blend_pd_512_memop(<8 x double> %a, <8 x double>* %ptr, i8 %mask) {
365   ; CHECK-LABEL: test_x86_mask_blend_pd_512_memop
366   ; CHECK: vblendmpd (%
367   %b = load <8 x double>* %ptr
368   %res = call <8 x double> @llvm.x86.avx512.mask.blend.pd.512(<8 x double> %a, <8 x double> %b, i8 %mask) ; <<8 x double>> [#uses=1]
369   ret <8 x double> %res
370 }
371 declare <8 x double> @llvm.x86.avx512.mask.blend.pd.512(<8 x double>, <8 x double>, i8) nounwind readonly
372
373 define <16 x i32> @test_x86_mask_blend_d_512(i16 %a0, <16 x i32> %a1, <16 x i32> %a2) {
374   ; CHECK: vpblendmd
375   %res = call <16 x i32> @llvm.x86.avx512.mask.blend.d.512(<16 x i32> %a1, <16 x i32> %a2, i16 %a0) ; <<16 x i32>> [#uses=1]
376   ret <16 x i32> %res
377 }
378 declare <16 x i32> @llvm.x86.avx512.mask.blend.d.512(<16 x i32>, <16 x i32>, i16) nounwind readonly
379
380 define <8 x i64> @test_x86_mask_blend_q_512(i8 %a0, <8 x i64> %a1, <8 x i64> %a2) {
381   ; CHECK: vpblendmq
382   %res = call <8 x i64> @llvm.x86.avx512.mask.blend.q.512(<8 x i64> %a1, <8 x i64> %a2, i8 %a0) ; <<8 x i64>> [#uses=1]
383   ret <8 x i64> %res
384 }
385 declare <8 x i64> @llvm.x86.avx512.mask.blend.q.512(<8 x i64>, <8 x i64>, i8) nounwind readonly
386
387  define <8 x i32> @test_cvtpd2udq(<8 x double> %a) {
388  ;CHECK: vcvtpd2udq {ru-sae}{{.*}}encoding: [0x62,0xf1,0xfc,0x58,0x79,0xc0]
389   %res = call <8 x i32> @llvm.x86.avx512.mask.cvtpd2udq.512(<8 x double> %a, <8 x i32>zeroinitializer, i8 -1, i32 2)
390   ret <8 x i32>%res
391  }
392  declare <8 x i32> @llvm.x86.avx512.mask.cvtpd2udq.512(<8 x double>, <8 x i32>, i8, i32)
393
394  define <16 x i32> @test_cvtps2udq(<16 x float> %a) {
395  ;CHECK: vcvtps2udq {rd-sae}{{.*}}encoding: [0x62,0xf1,0x7c,0x38,0x79,0xc0]
396   %res = call <16 x i32> @llvm.x86.avx512.mask.cvtps2udq.512(<16 x float> %a, <16 x i32>zeroinitializer, i16 -1, i32 1)
397   ret <16 x i32>%res
398  }
399  declare <16 x i32> @llvm.x86.avx512.mask.cvtps2udq.512(<16 x float>, <16 x i32>, i16, i32)
400
401  define i16 @test_cmpps(<16 x float> %a, <16 x float> %b) {
402  ;CHECK: vcmpleps {sae}{{.*}}encoding: [0x62,0xf1,0x7c,0x18,0xc2,0xc1,0x02]
403    %res = call i16 @llvm.x86.avx512.mask.cmp.ps.512(<16 x float> %a, <16 x float> %b, i8 2, i16 -1, i32 8)
404    ret i16 %res
405  }
406  declare i16 @llvm.x86.avx512.mask.cmp.ps.512(<16 x float> , <16 x float> , i8, i16, i32)
407
408  define i8 @test_cmppd(<8 x double> %a, <8 x double> %b) {
409  ;CHECK: vcmpneqpd %zmm{{.*}}encoding: [0x62,0xf1,0xfd,0x48,0xc2,0xc1,0x04]
410    %res = call i8 @llvm.x86.avx512.mask.cmp.pd.512(<8 x double> %a, <8 x double> %b, i8 4, i8 -1, i32 4)
411    ret i8 %res
412  }
413  declare i8 @llvm.x86.avx512.mask.cmp.pd.512(<8 x double> , <8 x double> , i8, i8, i32)
414
415  ; cvt intrinsics
416  define <16 x float> @test_cvtdq2ps(<16 x i32> %a) {
417  ;CHECK: vcvtdq2ps {rd-sae}{{.*}}encoding: [0x62,0xf1,0x7c,0x38,0x5b,0xc0]
418   %res = call <16 x float> @llvm.x86.avx512.mask.cvtdq2ps.512(<16 x i32> %a, <16 x float>zeroinitializer, i16 -1, i32 1)
419   ret <16 x float>%res
420  }
421  declare <16 x float> @llvm.x86.avx512.mask.cvtdq2ps.512(<16 x i32>, <16 x float>, i16, i32)
422
423  define <16 x float> @test_cvtudq2ps(<16 x i32> %a) {
424  ;CHECK: vcvtudq2ps {rd-sae}{{.*}}encoding: [0x62,0xf1,0x7f,0x38,0x7a,0xc0]
425   %res = call <16 x float> @llvm.x86.avx512.mask.cvtudq2ps.512(<16 x i32> %a, <16 x float>zeroinitializer, i16 -1, i32 1)
426   ret <16 x float>%res
427  }
428  declare <16 x float> @llvm.x86.avx512.mask.cvtudq2ps.512(<16 x i32>, <16 x float>, i16, i32)
429
430  define <8 x double> @test_cvtdq2pd(<8 x i32> %a) {
431  ;CHECK: vcvtdq2pd {{.*}}encoding: [0x62,0xf1,0x7e,0x48,0xe6,0xc0]
432   %res = call <8 x double> @llvm.x86.avx512.mask.cvtdq2pd.512(<8 x i32> %a, <8 x double>zeroinitializer, i8 -1)
433   ret <8 x double>%res
434  }
435  declare <8 x double> @llvm.x86.avx512.mask.cvtdq2pd.512(<8 x i32>, <8 x double>, i8)
436
437  define <8 x double> @test_cvtudq2pd(<8 x i32> %a) {
438  ;CHECK: vcvtudq2pd {{.*}}encoding: [0x62,0xf1,0x7e,0x48,0x7a,0xc0]
439   %res = call <8 x double> @llvm.x86.avx512.mask.cvtudq2pd.512(<8 x i32> %a, <8 x double>zeroinitializer, i8 -1)
440   ret <8 x double>%res
441  }
442  declare <8 x double> @llvm.x86.avx512.mask.cvtudq2pd.512(<8 x i32>, <8 x double>, i8)
443
444  ; fp min - max
445 define <16 x float> @test_vmaxps(<16 x float> %a0, <16 x float> %a1) {
446   ; CHECK: vmaxps
447   %res = call <16 x float> @llvm.x86.avx512.mask.max.ps.512(<16 x float> %a0, <16 x float> %a1,
448                     <16 x float>zeroinitializer, i16 -1, i32 4)
449   ret <16 x float> %res
450 }
451 declare <16 x float> @llvm.x86.avx512.mask.max.ps.512(<16 x float>, <16 x float>,
452                     <16 x float>, i16, i32)
453
454 define <8 x double> @test_vmaxpd(<8 x double> %a0, <8 x double> %a1) {
455   ; CHECK: vmaxpd
456   %res = call <8 x double> @llvm.x86.avx512.mask.max.pd.512(<8 x double> %a0, <8 x double> %a1,
457                     <8 x double>zeroinitializer, i8 -1, i32 4)
458   ret <8 x double> %res
459 }
460 declare <8 x double> @llvm.x86.avx512.mask.max.pd.512(<8 x double>, <8 x double>,
461                     <8 x double>, i8, i32)
462
463 define <16 x float> @test_vminps(<16 x float> %a0, <16 x float> %a1) {
464   ; CHECK: vminps
465   %res = call <16 x float> @llvm.x86.avx512.mask.min.ps.512(<16 x float> %a0, <16 x float> %a1,
466                     <16 x float>zeroinitializer, i16 -1, i32 4)
467   ret <16 x float> %res
468 }
469 declare <16 x float> @llvm.x86.avx512.mask.min.ps.512(<16 x float>, <16 x float>,
470                     <16 x float>, i16, i32)
471
472 define <8 x double> @test_vminpd(<8 x double> %a0, <8 x double> %a1) {
473   ; CHECK: vminpd
474   %res = call <8 x double> @llvm.x86.avx512.mask.min.pd.512(<8 x double> %a0, <8 x double> %a1,
475                     <8 x double>zeroinitializer, i8 -1, i32 4)
476   ret <8 x double> %res
477 }
478 declare <8 x double> @llvm.x86.avx512.mask.min.pd.512(<8 x double>, <8 x double>,
479                     <8 x double>, i8, i32)
480
481  define <8 x float> @test_cvtpd2ps(<8 x double> %a) {
482  ;CHECK: vcvtpd2ps {rd-sae}{{.*}}encoding: [0x62,0xf1,0xfd,0x38,0x5a,0xc0]
483   %res = call <8 x float> @llvm.x86.avx512.mask.cvtpd2ps.512(<8 x double> %a, <8 x float>zeroinitializer, i8 -1, i32 1)
484   ret <8 x float>%res
485  }
486  declare <8 x float> @llvm.x86.avx512.mask.cvtpd2ps.512(<8 x double>, <8 x float>, i8, i32)
487
488  define <16 x i32> @test_pabsd(<16 x i32> %a) {
489  ;CHECK: vpabsd {{.*}}encoding: [0x62,0xf2,0x7d,0x48,0x1e,0xc0]
490  %res = call <16 x i32> @llvm.x86.avx512.mask.pabs.d.512(<16 x i32> %a, <16 x i32>zeroinitializer, i16 -1)
491  ret < 16 x i32> %res
492  }
493  declare <16 x i32> @llvm.x86.avx512.mask.pabs.d.512(<16 x i32>, <16 x i32>, i16)
494
495  define <8 x i64> @test_pabsq(<8 x i64> %a) {
496  ;CHECK: vpabsq {{.*}}encoding: [0x62,0xf2,0xfd,0x48,0x1f,0xc0]
497  %res = call <8 x i64> @llvm.x86.avx512.mask.pabs.q.512(<8 x i64> %a, <8 x i64>zeroinitializer, i8 -1)
498  ret <8 x i64> %res
499  }
500  declare <8 x i64> @llvm.x86.avx512.mask.pabs.q.512(<8 x i64>, <8 x i64>, i8)
501
502 define <8 x i64> @test_vpmaxq(<8 x i64> %a0, <8 x i64> %a1) {
503   ; CHECK: vpmaxsq {{.*}}encoding: [0x62,0xf2,0xfd,0x48,0x3d,0xc1]
504   %res = call <8 x i64> @llvm.x86.avx512.mask.pmaxs.q.512(<8 x i64> %a0, <8 x i64> %a1,
505                     <8 x i64>zeroinitializer, i8 -1)
506   ret <8 x i64> %res
507 }
508 declare <8 x i64> @llvm.x86.avx512.mask.pmaxs.q.512(<8 x i64>, <8 x i64>, <8 x i64>, i8)
509
510 define <16 x i32> @test_vpminud(<16 x i32> %a0, <16 x i32> %a1) {
511   ; CHECK: vpminud {{.*}}encoding: [0x62,0xf2,0x7d,0x48,0x3b,0xc1]
512   %res = call <16 x i32> @llvm.x86.avx512.mask.pminu.d.512(<16 x i32> %a0, <16 x i32> %a1,
513                     <16 x i32>zeroinitializer, i16 -1)
514   ret <16 x i32> %res
515 }
516 declare <16 x i32> @llvm.x86.avx512.mask.pminu.d.512(<16 x i32>, <16 x i32>, <16 x i32>, i16)
517
518 define <16 x i32> @test_vpmaxsd(<16 x i32> %a0, <16 x i32> %a1) {
519   ; CHECK: vpmaxsd {{.*}}encoding: [0x62,0xf2,0x7d,0x48,0x3d,0xc1]
520   %res = call <16 x i32> @llvm.x86.avx512.mask.pmaxs.d.512(<16 x i32> %a0, <16 x i32> %a1,
521                     <16 x i32>zeroinitializer, i16 -1)
522   ret <16 x i32> %res
523 }
524 declare <16 x i32> @llvm.x86.avx512.mask.pmaxs.d.512(<16 x i32>, <16 x i32>, <16 x i32>, i16)
525
526 define <8 x i64> @test_vpmuludq(<16 x i32> %a0, <16 x i32> %a1) {
527   ; CHECK: vpmuludq {{.*}}encoding: [0x62,0xf1,0xfd,0x48,0xf4,0xc1]
528   %res = call <8 x i64> @llvm.x86.avx512.mask.pmulu.dq.512(<16 x i32> %a0, <16 x i32> %a1,
529                     <8 x i64>zeroinitializer, i8 -1)
530   ret <8 x i64> %res
531 }
532 declare <8 x i64> @llvm.x86.avx512.mask.pmulu.dq.512(<16 x i32>, <16 x i32>, <8 x i64>, i8)
533
534 define i8 @test_vptestmq(<8 x i64> %a0, <8 x i64> %a1) {
535   ; CHECK: vptestmq {{.*}}encoding: [0x62,0xf2,0xfd,0x48,0x27,0xc1]
536   %res = call i8 @llvm.x86.avx512.mask.ptestm.q.512(<8 x i64> %a0, <8 x i64> %a1, i8 -1)
537   ret i8 %res
538 }
539 declare i8 @llvm.x86.avx512.mask.ptestm.q.512(<8 x i64>, <8 x i64>, i8)
540
541 define i16 @test_vptestmd(<16 x i32> %a0, <16 x i32> %a1) {
542   ; CHECK: vptestmd {{.*}}encoding: [0x62,0xf2,0x7d,0x48,0x27,0xc1]
543   %res = call i16 @llvm.x86.avx512.mask.ptestm.d.512(<16 x i32> %a0, <16 x i32> %a1, i16 -1)
544   ret i16 %res
545 }
546 declare i16 @llvm.x86.avx512.mask.ptestm.d.512(<16 x i32>, <16 x i32>, i16)
547
548 define void @test_store1(<16 x float> %data, i8* %ptr, i16 %mask) {
549 ; CHECK: vmovups {{.*}}encoding: [0x62,0xf1,0x7c,0x49,0x11,0x07]
550   call void @llvm.x86.avx512.mask.storeu.ps.512(i8* %ptr, <16 x float> %data, i16 %mask)
551   ret void
552 }
553
554 declare void @llvm.x86.avx512.mask.storeu.ps.512(i8*, <16 x float>, i16 )
555
556 define void @test_store2(<8 x double> %data, i8* %ptr, i8 %mask) {
557 ; CHECK: vmovupd {{.*}}encoding: [0x62,0xf1,0xfd,0x49,0x11,0x07]
558   call void @llvm.x86.avx512.mask.storeu.pd.512(i8* %ptr, <8 x double> %data, i8 %mask)
559   ret void
560 }
561
562 declare void @llvm.x86.avx512.mask.storeu.pd.512(i8*, <8 x double>, i8)
563
564 define void @test_mask_store_aligned_ps(<16 x float> %data, i8* %ptr, i16 %mask) {
565 ; CHECK-LABEL: test_mask_store_aligned_ps:
566 ; CHECK:       ## BB#0:
567 ; CHECK-NEXT:    kmovw %esi, %k1
568 ; CHECK-NEXT:    vmovaps %zmm0, (%rdi) {%k1}
569 ; CHECK-NEXT:    retq
570   call void @llvm.x86.avx512.mask.store.ps.512(i8* %ptr, <16 x float> %data, i16 %mask)
571   ret void
572 }
573
574 declare void @llvm.x86.avx512.mask.store.ps.512(i8*, <16 x float>, i16 )
575
576 define void @test_mask_store_aligned_pd(<8 x double> %data, i8* %ptr, i8 %mask) {
577 ; CHECK-LABEL: test_mask_store_aligned_pd:
578 ; CHECK:       ## BB#0:
579 ; CHECK-NEXT:    kmovw %esi, %k1
580 ; CHECK-NEXT:    vmovapd %zmm0, (%rdi) {%k1}
581 ; CHECK-NEXT:    retq
582   call void @llvm.x86.avx512.mask.store.pd.512(i8* %ptr, <8 x double> %data, i8 %mask)
583   ret void
584 }
585
586 declare void @llvm.x86.avx512.mask.store.pd.512(i8*, <8 x double>, i8)
587
588 define <16 x float> @test_maskz_load_aligned_ps(<16 x float> %data, i8* %ptr, i16 %mask) {
589 ; CHECK-LABEL: test_maskz_load_aligned_ps:
590 ; CHECK:       ## BB#0:
591 ; CHECK-NEXT:    kmovw %esi, %k1
592 ; CHECK-NEXT:    vmovaps (%rdi), %zmm0 {%k1} {z}
593 ; CHECK-NEXT:    retq
594   %res = call <16 x float> @llvm.x86.avx512.mask.load.ps.512(i8* %ptr, <16 x float> zeroinitializer, i16 %mask)
595   ret <16 x float> %res
596 }
597
598 declare <16 x float> @llvm.x86.avx512.mask.load.ps.512(i8*, <16 x float>, i16)
599
600 define <8 x double> @test_maskz_load_aligned_pd(<8 x double> %data, i8* %ptr, i8 %mask) {
601 ; CHECK-LABEL: test_maskz_load_aligned_pd:
602 ; CHECK:       ## BB#0:
603 ; CHECK-NEXT:    kmovw %esi, %k1
604 ; CHECK-NEXT:    vmovapd (%rdi), %zmm0 {%k1} {z}
605 ; CHECK-NEXT:    retq
606   %res = call <8 x double> @llvm.x86.avx512.mask.load.pd.512(i8* %ptr, <8 x double> zeroinitializer, i8 %mask)
607   ret <8 x double> %res
608 }
609
610 declare <8 x double> @llvm.x86.avx512.mask.load.pd.512(i8*, <8 x double>, i8)
611
612 define <16 x float> @test_load_aligned_ps(<16 x float> %data, i8* %ptr, i16 %mask) {
613 ; CHECK-LABEL: test_load_aligned_ps:
614 ; CHECK:       ## BB#0:
615 ; CHECK-NEXT:    vmovaps (%rdi), %zmm0
616 ; CHECK-NEXT:    retq
617   %res = call <16 x float> @llvm.x86.avx512.mask.load.ps.512(i8* %ptr, <16 x float> zeroinitializer, i16 -1)
618   ret <16 x float> %res
619 }
620
621 define <8 x double> @test_load_aligned_pd(<8 x double> %data, i8* %ptr, i8 %mask) {
622 ; CHECK-LABEL: test_load_aligned_pd:
623 ; CHECK:       ## BB#0:
624 ; CHECK-NEXT:    vmovapd (%rdi), %zmm0
625 ; CHECK-NEXT:    retq
626   %res = call <8 x double> @llvm.x86.avx512.mask.load.pd.512(i8* %ptr, <8 x double> zeroinitializer, i8 -1)
627   ret <8 x double> %res
628 }
629
630 define <16 x float> @test_vpermt2ps(<16 x float>%x, <16 x float>%y, <16 x i32>%perm) {
631 ; CHECK: vpermt2ps {{.*}}encoding: [0x62,0xf2,0x6d,0x48,0x7f,0xc1]
632   %res = call <16 x float> @llvm.x86.avx512.mask.vpermt.ps.512(<16 x i32>%perm, <16 x float>%x, <16 x float>%y, i16 -1)
633   ret <16 x float> %res
634 }
635
636 define <16 x float> @test_vpermt2ps_mask(<16 x float>%x, <16 x float>%y, <16 x i32>%perm, i16 %mask) {
637 ; CHECK-LABEL: test_vpermt2ps_mask:
638 ; CHECK: vpermt2ps %zmm1, %zmm2, %zmm0 {%k1} ## encoding: [0x62,0xf2,0x6d,0x49,0x7f,0xc1]
639   %res = call <16 x float> @llvm.x86.avx512.mask.vpermt.ps.512(<16 x i32>%perm, <16 x float>%x, <16 x float>%y, i16 %mask)
640   ret <16 x float> %res
641 }
642
643 declare <16 x float> @llvm.x86.avx512.mask.vpermt.ps.512(<16 x i32>, <16 x float>, <16 x float>, i16)
644
645 define <8 x i64> @test_vmovntdqa(i8 *%x) {
646 ; CHECK-LABEL: test_vmovntdqa:
647 ; CHECK: vmovntdqa (%rdi), %zmm0 ## encoding: [0x62,0xf2,0x7d,0x48,0x2a,0x07]
648   %res = call <8 x i64> @llvm.x86.avx512.movntdqa(i8* %x)
649   ret <8 x i64> %res
650 }
651
652 declare <8 x i64> @llvm.x86.avx512.movntdqa(i8*)
653
654 define <8 x i64> @test_valign_q(<8 x i64> %a, <8 x i64> %b) {
655 ; CHECK-LABEL: test_valign_q:
656 ; CHECK: valignq $2, %zmm1, %zmm0, %zmm0
657   %res = call <8 x i64> @llvm.x86.avx512.mask.valign.q.512(<8 x i64> %a, <8 x i64> %b, i8 2, <8 x i64> zeroinitializer, i8 -1)
658   ret <8 x i64> %res
659 }
660
661 define <8 x i64> @test_mask_valign_q(<8 x i64> %a, <8 x i64> %b, <8 x i64> %src, i8 %mask) {
662 ; CHECK-LABEL: test_mask_valign_q:
663 ; CHECK: valignq $2, %zmm1, %zmm0, %zmm2 {%k1}
664   %res = call <8 x i64> @llvm.x86.avx512.mask.valign.q.512(<8 x i64> %a, <8 x i64> %b, i8 2, <8 x i64> %src, i8 %mask)
665   ret <8 x i64> %res
666 }
667
668 declare <8 x i64> @llvm.x86.avx512.mask.valign.q.512(<8 x i64>, <8 x i64>, i8, <8 x i64>, i8)
669
670 define <16 x i32> @test_maskz_valign_d(<16 x i32> %a, <16 x i32> %b, i16 %mask) {
671 ; CHECK-LABEL: test_maskz_valign_d:
672 ; CHECK: valignd $5, %zmm1, %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf3,0x7d,0xc9,0x03,0xc1,0x05]
673   %res = call <16 x i32> @llvm.x86.avx512.mask.valign.d.512(<16 x i32> %a, <16 x i32> %b, i8 5, <16 x i32> zeroinitializer, i16 %mask)
674   ret <16 x i32> %res
675 }
676
677 declare <16 x i32> @llvm.x86.avx512.mask.valign.d.512(<16 x i32>, <16 x i32>, i8, <16 x i32>, i16)
678
679 define void @test_mask_store_ss(i8* %ptr, <4 x float> %data, i8 %mask) {
680  ; CHECK-LABEL: test_mask_store_ss
681  ; CHECK: vmovss %xmm0, (%rdi) {%k1}     ## encoding: [0x62,0xf1,0x7e,0x09,0x11,0x07]
682  call void @llvm.x86.avx512.mask.store.ss(i8* %ptr, <4 x float> %data, i8 %mask)
683  ret void
684 }
685
686 declare void @llvm.x86.avx512.mask.store.ss(i8*, <4 x float>, i8 )
687
688 define i16 @test_pcmpeq_d(<16 x i32> %a, <16 x i32> %b) {
689 ; CHECK-LABEL: test_pcmpeq_d
690 ; CHECK: vpcmpeqd %zmm1, %zmm0, %k0 ##
691   %res = call i16 @llvm.x86.avx512.mask.pcmpeq.d.512(<16 x i32> %a, <16 x i32> %b, i16 -1)
692   ret i16 %res
693 }
694
695 define i16 @test_mask_pcmpeq_d(<16 x i32> %a, <16 x i32> %b, i16 %mask) {
696 ; CHECK-LABEL: test_mask_pcmpeq_d
697 ; CHECK: vpcmpeqd %zmm1, %zmm0, %k0 {%k1} ##
698   %res = call i16 @llvm.x86.avx512.mask.pcmpeq.d.512(<16 x i32> %a, <16 x i32> %b, i16 %mask)
699   ret i16 %res
700 }
701
702 declare i16 @llvm.x86.avx512.mask.pcmpeq.d.512(<16 x i32>, <16 x i32>, i16)
703
704 define i8 @test_pcmpeq_q(<8 x i64> %a, <8 x i64> %b) {
705 ; CHECK-LABEL: test_pcmpeq_q
706 ; CHECK: vpcmpeqq %zmm1, %zmm0, %k0 ##
707   %res = call i8 @llvm.x86.avx512.mask.pcmpeq.q.512(<8 x i64> %a, <8 x i64> %b, i8 -1)
708   ret i8 %res
709 }
710
711 define i8 @test_mask_pcmpeq_q(<8 x i64> %a, <8 x i64> %b, i8 %mask) {
712 ; CHECK-LABEL: test_mask_pcmpeq_q
713 ; CHECK: vpcmpeqq %zmm1, %zmm0, %k0 {%k1} ##
714   %res = call i8 @llvm.x86.avx512.mask.pcmpeq.q.512(<8 x i64> %a, <8 x i64> %b, i8 %mask)
715   ret i8 %res
716 }
717
718 declare i8 @llvm.x86.avx512.mask.pcmpeq.q.512(<8 x i64>, <8 x i64>, i8)
719
720 define i16 @test_pcmpgt_d(<16 x i32> %a, <16 x i32> %b) {
721 ; CHECK-LABEL: test_pcmpgt_d
722 ; CHECK: vpcmpgtd %zmm1, %zmm0, %k0 ##
723   %res = call i16 @llvm.x86.avx512.mask.pcmpgt.d.512(<16 x i32> %a, <16 x i32> %b, i16 -1)
724   ret i16 %res
725 }
726
727 define i16 @test_mask_pcmpgt_d(<16 x i32> %a, <16 x i32> %b, i16 %mask) {
728 ; CHECK-LABEL: test_mask_pcmpgt_d
729 ; CHECK: vpcmpgtd %zmm1, %zmm0, %k0 {%k1} ##
730   %res = call i16 @llvm.x86.avx512.mask.pcmpgt.d.512(<16 x i32> %a, <16 x i32> %b, i16 %mask)
731   ret i16 %res
732 }
733
734 declare i16 @llvm.x86.avx512.mask.pcmpgt.d.512(<16 x i32>, <16 x i32>, i16)
735
736 define i8 @test_pcmpgt_q(<8 x i64> %a, <8 x i64> %b) {
737 ; CHECK-LABEL: test_pcmpgt_q
738 ; CHECK: vpcmpgtq %zmm1, %zmm0, %k0 ##
739   %res = call i8 @llvm.x86.avx512.mask.pcmpgt.q.512(<8 x i64> %a, <8 x i64> %b, i8 -1)
740   ret i8 %res
741 }
742
743 define i8 @test_mask_pcmpgt_q(<8 x i64> %a, <8 x i64> %b, i8 %mask) {
744 ; CHECK-LABEL: test_mask_pcmpgt_q
745 ; CHECK: vpcmpgtq %zmm1, %zmm0, %k0 {%k1} ##
746   %res = call i8 @llvm.x86.avx512.mask.pcmpgt.q.512(<8 x i64> %a, <8 x i64> %b, i8 %mask)
747   ret i8 %res
748 }
749
750 declare i8 @llvm.x86.avx512.mask.pcmpgt.q.512(<8 x i64>, <8 x i64>, i8)
751
752 define <8 x i16> @test_cmp_d_512(<16 x i32> %a0, <16 x i32> %a1) {
753 ; CHECK_LABEL: test_cmp_d_512
754 ; CHECK: vpcmpeqd %zmm1, %zmm0, %k0 ##
755   %res0 = call i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i8 0, i16 -1)
756   %vec0 = insertelement <8 x i16> undef, i16 %res0, i32 0
757 ; CHECK: vpcmpltd %zmm1, %zmm0, %k0 ##
758   %res1 = call i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i8 1, i16 -1)
759   %vec1 = insertelement <8 x i16> %vec0, i16 %res1, i32 1
760 ; CHECK: vpcmpled %zmm1, %zmm0, %k0 ##
761   %res2 = call i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i8 2, i16 -1)
762   %vec2 = insertelement <8 x i16> %vec1, i16 %res2, i32 2
763 ; CHECK: vpcmpunordd %zmm1, %zmm0, %k0 ##
764   %res3 = call i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i8 3, i16 -1)
765   %vec3 = insertelement <8 x i16> %vec2, i16 %res3, i32 3
766 ; CHECK: vpcmpneqd %zmm1, %zmm0, %k0 ##
767   %res4 = call i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i8 4, i16 -1)
768   %vec4 = insertelement <8 x i16> %vec3, i16 %res4, i32 4
769 ; CHECK: vpcmpnltd %zmm1, %zmm0, %k0 ##
770   %res5 = call i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i8 5, i16 -1)
771   %vec5 = insertelement <8 x i16> %vec4, i16 %res5, i32 5
772 ; CHECK: vpcmpnled %zmm1, %zmm0, %k0 ##
773   %res6 = call i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i8 6, i16 -1)
774   %vec6 = insertelement <8 x i16> %vec5, i16 %res6, i32 6
775 ; CHECK: vpcmpordd %zmm1, %zmm0, %k0 ##
776   %res7 = call i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i8 7, i16 -1)
777   %vec7 = insertelement <8 x i16> %vec6, i16 %res7, i32 7
778   ret <8 x i16> %vec7
779 }
780
781 define <8 x i16> @test_mask_cmp_d_512(<16 x i32> %a0, <16 x i32> %a1, i16 %mask) {
782 ; CHECK_LABEL: test_mask_cmp_d_512
783 ; CHECK: vpcmpeqd %zmm1, %zmm0, %k0 {%k1} ##
784   %res0 = call i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i8 0, i16 %mask)
785   %vec0 = insertelement <8 x i16> undef, i16 %res0, i32 0
786 ; CHECK: vpcmpltd %zmm1, %zmm0, %k0 {%k1} ##
787   %res1 = call i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i8 1, i16 %mask)
788   %vec1 = insertelement <8 x i16> %vec0, i16 %res1, i32 1
789 ; CHECK: vpcmpled %zmm1, %zmm0, %k0 {%k1} ##
790   %res2 = call i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i8 2, i16 %mask)
791   %vec2 = insertelement <8 x i16> %vec1, i16 %res2, i32 2
792 ; CHECK: vpcmpunordd %zmm1, %zmm0, %k0 {%k1} ##
793   %res3 = call i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i8 3, i16 %mask)
794   %vec3 = insertelement <8 x i16> %vec2, i16 %res3, i32 3
795 ; CHECK: vpcmpneqd %zmm1, %zmm0, %k0 {%k1} ##
796   %res4 = call i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i8 4, i16 %mask)
797   %vec4 = insertelement <8 x i16> %vec3, i16 %res4, i32 4
798 ; CHECK: vpcmpnltd %zmm1, %zmm0, %k0 {%k1} ##
799   %res5 = call i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i8 5, i16 %mask)
800   %vec5 = insertelement <8 x i16> %vec4, i16 %res5, i32 5
801 ; CHECK: vpcmpnled %zmm1, %zmm0, %k0 {%k1} ##
802   %res6 = call i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i8 6, i16 %mask)
803   %vec6 = insertelement <8 x i16> %vec5, i16 %res6, i32 6
804 ; CHECK: vpcmpordd %zmm1, %zmm0, %k0 {%k1} ##
805   %res7 = call i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i8 7, i16 %mask)
806   %vec7 = insertelement <8 x i16> %vec6, i16 %res7, i32 7
807   ret <8 x i16> %vec7
808 }
809
810 declare i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32>, <16 x i32>, i8, i16) nounwind readnone
811
812 define <8 x i16> @test_ucmp_d_512(<16 x i32> %a0, <16 x i32> %a1) {
813 ; CHECK_LABEL: test_ucmp_d_512
814 ; CHECK: vpcmpequd %zmm1, %zmm0, %k0 ##
815   %res0 = call i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i8 0, i16 -1)
816   %vec0 = insertelement <8 x i16> undef, i16 %res0, i32 0
817 ; CHECK: vpcmpltud %zmm1, %zmm0, %k0 ##
818   %res1 = call i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i8 1, i16 -1)
819   %vec1 = insertelement <8 x i16> %vec0, i16 %res1, i32 1
820 ; CHECK: vpcmpleud %zmm1, %zmm0, %k0 ##
821   %res2 = call i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i8 2, i16 -1)
822   %vec2 = insertelement <8 x i16> %vec1, i16 %res2, i32 2
823 ; CHECK: vpcmpunordud %zmm1, %zmm0, %k0 ##
824   %res3 = call i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i8 3, i16 -1)
825   %vec3 = insertelement <8 x i16> %vec2, i16 %res3, i32 3
826 ; CHECK: vpcmpnequd %zmm1, %zmm0, %k0 ##
827   %res4 = call i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i8 4, i16 -1)
828   %vec4 = insertelement <8 x i16> %vec3, i16 %res4, i32 4
829 ; CHECK: vpcmpnltud %zmm1, %zmm0, %k0 ##
830   %res5 = call i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i8 5, i16 -1)
831   %vec5 = insertelement <8 x i16> %vec4, i16 %res5, i32 5
832 ; CHECK: vpcmpnleud %zmm1, %zmm0, %k0 ##
833   %res6 = call i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i8 6, i16 -1)
834   %vec6 = insertelement <8 x i16> %vec5, i16 %res6, i32 6
835 ; CHECK: vpcmpordud %zmm1, %zmm0, %k0 ##
836   %res7 = call i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i8 7, i16 -1)
837   %vec7 = insertelement <8 x i16> %vec6, i16 %res7, i32 7
838   ret <8 x i16> %vec7
839 }
840
841 define <8 x i16> @test_mask_ucmp_d_512(<16 x i32> %a0, <16 x i32> %a1, i16 %mask) {
842 ; CHECK_LABEL: test_mask_ucmp_d_512
843 ; CHECK: vpcmpequd %zmm1, %zmm0, %k0 {%k1} ##
844   %res0 = call i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i8 0, i16 %mask)
845   %vec0 = insertelement <8 x i16> undef, i16 %res0, i32 0
846 ; CHECK: vpcmpltud %zmm1, %zmm0, %k0 {%k1} ##
847   %res1 = call i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i8 1, i16 %mask)
848   %vec1 = insertelement <8 x i16> %vec0, i16 %res1, i32 1
849 ; CHECK: vpcmpleud %zmm1, %zmm0, %k0 {%k1} ##
850   %res2 = call i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i8 2, i16 %mask)
851   %vec2 = insertelement <8 x i16> %vec1, i16 %res2, i32 2
852 ; CHECK: vpcmpunordud %zmm1, %zmm0, %k0 {%k1} ##
853   %res3 = call i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i8 3, i16 %mask)
854   %vec3 = insertelement <8 x i16> %vec2, i16 %res3, i32 3
855 ; CHECK: vpcmpnequd %zmm1, %zmm0, %k0 {%k1} ##
856   %res4 = call i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i8 4, i16 %mask)
857   %vec4 = insertelement <8 x i16> %vec3, i16 %res4, i32 4
858 ; CHECK: vpcmpnltud %zmm1, %zmm0, %k0 {%k1} ##
859   %res5 = call i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i8 5, i16 %mask)
860   %vec5 = insertelement <8 x i16> %vec4, i16 %res5, i32 5
861 ; CHECK: vpcmpnleud %zmm1, %zmm0, %k0 {%k1} ##
862   %res6 = call i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i8 6, i16 %mask)
863   %vec6 = insertelement <8 x i16> %vec5, i16 %res6, i32 6
864 ; CHECK: vpcmpordud %zmm1, %zmm0, %k0 {%k1} ##
865   %res7 = call i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i8 7, i16 %mask)
866   %vec7 = insertelement <8 x i16> %vec6, i16 %res7, i32 7
867   ret <8 x i16> %vec7
868 }
869
870 declare i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32>, <16 x i32>, i8, i16) nounwind readnone
871
872 define <8 x i8> @test_cmp_q_512(<8 x i64> %a0, <8 x i64> %a1) {
873 ; CHECK_LABEL: test_cmp_q_512
874 ; CHECK: vpcmpeqq %zmm1, %zmm0, %k0 ##
875   %res0 = call i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i8 0, i8 -1)
876   %vec0 = insertelement <8 x i8> undef, i8 %res0, i32 0
877 ; CHECK: vpcmpltq %zmm1, %zmm0, %k0 ##
878   %res1 = call i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i8 1, i8 -1)
879   %vec1 = insertelement <8 x i8> %vec0, i8 %res1, i32 1
880 ; CHECK: vpcmpleq %zmm1, %zmm0, %k0 ##
881   %res2 = call i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i8 2, i8 -1)
882   %vec2 = insertelement <8 x i8> %vec1, i8 %res2, i32 2
883 ; CHECK: vpcmpunordq %zmm1, %zmm0, %k0 ##
884   %res3 = call i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i8 3, i8 -1)
885   %vec3 = insertelement <8 x i8> %vec2, i8 %res3, i32 3
886 ; CHECK: vpcmpneqq %zmm1, %zmm0, %k0 ##
887   %res4 = call i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i8 4, i8 -1)
888   %vec4 = insertelement <8 x i8> %vec3, i8 %res4, i32 4
889 ; CHECK: vpcmpnltq %zmm1, %zmm0, %k0 ##
890   %res5 = call i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i8 5, i8 -1)
891   %vec5 = insertelement <8 x i8> %vec4, i8 %res5, i32 5
892 ; CHECK: vpcmpnleq %zmm1, %zmm0, %k0 ##
893   %res6 = call i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i8 6, i8 -1)
894   %vec6 = insertelement <8 x i8> %vec5, i8 %res6, i32 6
895 ; CHECK: vpcmpordq %zmm1, %zmm0, %k0 ##
896   %res7 = call i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i8 7, i8 -1)
897   %vec7 = insertelement <8 x i8> %vec6, i8 %res7, i32 7
898   ret <8 x i8> %vec7
899 }
900
901 define <8 x i8> @test_mask_cmp_q_512(<8 x i64> %a0, <8 x i64> %a1, i8 %mask) {
902 ; CHECK_LABEL: test_mask_cmp_q_512
903 ; CHECK: vpcmpeqq %zmm1, %zmm0, %k0 {%k1} ##
904   %res0 = call i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i8 0, i8 %mask)
905   %vec0 = insertelement <8 x i8> undef, i8 %res0, i32 0
906 ; CHECK: vpcmpltq %zmm1, %zmm0, %k0 {%k1} ##
907   %res1 = call i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i8 1, i8 %mask)
908   %vec1 = insertelement <8 x i8> %vec0, i8 %res1, i32 1
909 ; CHECK: vpcmpleq %zmm1, %zmm0, %k0 {%k1} ##
910   %res2 = call i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i8 2, i8 %mask)
911   %vec2 = insertelement <8 x i8> %vec1, i8 %res2, i32 2
912 ; CHECK: vpcmpunordq %zmm1, %zmm0, %k0 {%k1} ##
913   %res3 = call i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i8 3, i8 %mask)
914   %vec3 = insertelement <8 x i8> %vec2, i8 %res3, i32 3
915 ; CHECK: vpcmpneqq %zmm1, %zmm0, %k0 {%k1} ##
916   %res4 = call i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i8 4, i8 %mask)
917   %vec4 = insertelement <8 x i8> %vec3, i8 %res4, i32 4
918 ; CHECK: vpcmpnltq %zmm1, %zmm0, %k0 {%k1} ##
919   %res5 = call i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i8 5, i8 %mask)
920   %vec5 = insertelement <8 x i8> %vec4, i8 %res5, i32 5
921 ; CHECK: vpcmpnleq %zmm1, %zmm0, %k0 {%k1} ##
922   %res6 = call i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i8 6, i8 %mask)
923   %vec6 = insertelement <8 x i8> %vec5, i8 %res6, i32 6
924 ; CHECK: vpcmpordq %zmm1, %zmm0, %k0 {%k1} ##
925   %res7 = call i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i8 7, i8 %mask)
926   %vec7 = insertelement <8 x i8> %vec6, i8 %res7, i32 7
927   ret <8 x i8> %vec7
928 }
929
930 declare i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64>, <8 x i64>, i8, i8) nounwind readnone
931
932 define <8 x i8> @test_ucmp_q_512(<8 x i64> %a0, <8 x i64> %a1) {
933 ; CHECK_LABEL: test_ucmp_q_512
934 ; CHECK: vpcmpequq %zmm1, %zmm0, %k0 ##
935   %res0 = call i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i8 0, i8 -1)
936   %vec0 = insertelement <8 x i8> undef, i8 %res0, i32 0
937 ; CHECK: vpcmpltuq %zmm1, %zmm0, %k0 ##
938   %res1 = call i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i8 1, i8 -1)
939   %vec1 = insertelement <8 x i8> %vec0, i8 %res1, i32 1
940 ; CHECK: vpcmpleuq %zmm1, %zmm0, %k0 ##
941   %res2 = call i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i8 2, i8 -1)
942   %vec2 = insertelement <8 x i8> %vec1, i8 %res2, i32 2
943 ; CHECK: vpcmpunorduq %zmm1, %zmm0, %k0 ##
944   %res3 = call i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i8 3, i8 -1)
945   %vec3 = insertelement <8 x i8> %vec2, i8 %res3, i32 3
946 ; CHECK: vpcmpnequq %zmm1, %zmm0, %k0 ##
947   %res4 = call i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i8 4, i8 -1)
948   %vec4 = insertelement <8 x i8> %vec3, i8 %res4, i32 4
949 ; CHECK: vpcmpnltuq %zmm1, %zmm0, %k0 ##
950   %res5 = call i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i8 5, i8 -1)
951   %vec5 = insertelement <8 x i8> %vec4, i8 %res5, i32 5
952 ; CHECK: vpcmpnleuq %zmm1, %zmm0, %k0 ##
953   %res6 = call i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i8 6, i8 -1)
954   %vec6 = insertelement <8 x i8> %vec5, i8 %res6, i32 6
955 ; CHECK: vpcmporduq %zmm1, %zmm0, %k0 ##
956   %res7 = call i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i8 7, i8 -1)
957   %vec7 = insertelement <8 x i8> %vec6, i8 %res7, i32 7
958   ret <8 x i8> %vec7
959 }
960
961 define <8 x i8> @test_mask_ucmp_q_512(<8 x i64> %a0, <8 x i64> %a1, i8 %mask) {
962 ; CHECK_LABEL: test_mask_ucmp_q_512
963 ; CHECK: vpcmpequq %zmm1, %zmm0, %k0 {%k1} ##
964   %res0 = call i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i8 0, i8 %mask)
965   %vec0 = insertelement <8 x i8> undef, i8 %res0, i32 0
966 ; CHECK: vpcmpltuq %zmm1, %zmm0, %k0 {%k1} ##
967   %res1 = call i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i8 1, i8 %mask)
968   %vec1 = insertelement <8 x i8> %vec0, i8 %res1, i32 1
969 ; CHECK: vpcmpleuq %zmm1, %zmm0, %k0 {%k1} ##
970   %res2 = call i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i8 2, i8 %mask)
971   %vec2 = insertelement <8 x i8> %vec1, i8 %res2, i32 2
972 ; CHECK: vpcmpunorduq %zmm1, %zmm0, %k0 {%k1} ##
973   %res3 = call i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i8 3, i8 %mask)
974   %vec3 = insertelement <8 x i8> %vec2, i8 %res3, i32 3
975 ; CHECK: vpcmpnequq %zmm1, %zmm0, %k0 {%k1} ##
976   %res4 = call i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i8 4, i8 %mask)
977   %vec4 = insertelement <8 x i8> %vec3, i8 %res4, i32 4
978 ; CHECK: vpcmpnltuq %zmm1, %zmm0, %k0 {%k1} ##
979   %res5 = call i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i8 5, i8 %mask)
980   %vec5 = insertelement <8 x i8> %vec4, i8 %res5, i32 5
981 ; CHECK: vpcmpnleuq %zmm1, %zmm0, %k0 {%k1} ##
982   %res6 = call i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i8 6, i8 %mask)
983   %vec6 = insertelement <8 x i8> %vec5, i8 %res6, i32 6
984 ; CHECK: vpcmporduq %zmm1, %zmm0, %k0 {%k1} ##
985   %res7 = call i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i8 7, i8 %mask)
986   %vec7 = insertelement <8 x i8> %vec6, i8 %res7, i32 7
987   ret <8 x i8> %vec7
988 }
989
990 declare i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64>, <8 x i64>, i8, i8) nounwind readnone
991
992 define <4 x float> @test_mask_vextractf32x4(<4 x float> %b, <16 x float> %a, i8 %mask) {
993 ; CHECK-LABEL: test_mask_vextractf32x4:
994 ; CHECK: vextractf32x4 $2, %zmm1, %xmm0 {%k1}
995   %res = call <4 x float> @llvm.x86.avx512.mask.vextractf32x4.512(<16 x float> %a, i8 2, <4 x float> %b, i8 %mask)
996   ret <4 x float> %res
997 }
998
999 declare <4 x float> @llvm.x86.avx512.mask.vextractf32x4.512(<16 x float>, i8, <4 x float>, i8)
1000
1001 define <4 x i64> @test_mask_vextracti64x4(<4 x i64> %b, <8 x i64> %a, i8 %mask) {
1002 ; CHECK-LABEL: test_mask_vextracti64x4:
1003 ; CHECK: vextracti64x4 $2, %zmm1, %ymm0 {%k1}
1004   %res = call <4 x i64> @llvm.x86.avx512.mask.vextracti64x4.512(<8 x i64> %a, i8 2, <4 x i64> %b, i8 %mask)
1005   ret <4 x i64> %res
1006 }
1007
1008 declare <4 x i64> @llvm.x86.avx512.mask.vextracti64x4.512(<8 x i64>, i8, <4 x i64>, i8)
1009
1010 define <4 x i32> @test_maskz_vextracti32x4(<16 x i32> %a, i8 %mask) {
1011 ; CHECK-LABEL: test_maskz_vextracti32x4:
1012 ; CHECK: vextracti32x4 $2, %zmm0, %xmm0 {%k1} {z}
1013   %res = call <4 x i32> @llvm.x86.avx512.mask.vextracti32x4.512(<16 x i32> %a, i8 2, <4 x i32> zeroinitializer, i8 %mask)
1014   ret <4 x i32> %res
1015 }
1016
1017 declare <4 x i32> @llvm.x86.avx512.mask.vextracti32x4.512(<16 x i32>, i8, <4 x i32>, i8)
1018
1019 define <4 x double> @test_vextractf64x4(<8 x double> %a) {
1020 ; CHECK-LABEL: test_vextractf64x4:
1021 ; CHECK: vextractf64x4 $2, %zmm0, %ymm0 ##
1022   %res = call <4 x double> @llvm.x86.avx512.mask.vextractf64x4.512(<8 x double> %a, i8 2, <4 x double> zeroinitializer, i8 -1)
1023   ret <4 x double> %res
1024 }
1025
1026 declare <4 x double> @llvm.x86.avx512.mask.vextractf64x4.512(<8 x double>, i8, <4 x double>, i8)
1027
1028 define <16 x i32> @test_x86_avx512_pslli_d(<16 x i32> %a0) {
1029   ; CHECK-LABEL: test_x86_avx512_pslli_d
1030   ; CHECK: vpslld
1031   %res = call <16 x i32> @llvm.x86.avx512.mask.pslli.d(<16 x i32> %a0, i32 7, <16 x i32> zeroinitializer, i16 -1)
1032   ret <16 x i32> %res
1033 }
1034
1035 define <16 x i32> @test_x86_avx512_mask_pslli_d(<16 x i32> %a0, <16 x i32> %a1, i16 %mask) {
1036   ; CHECK-LABEL: test_x86_avx512_mask_pslli_d
1037   ; CHECK: vpslld $7, %zmm0, %zmm1 {%k1}
1038   %res = call <16 x i32> @llvm.x86.avx512.mask.pslli.d(<16 x i32> %a0, i32 7, <16 x i32> %a1, i16 %mask)
1039   ret <16 x i32> %res
1040 }
1041
1042 define <16 x i32> @test_x86_avx512_maskz_pslli_d(<16 x i32> %a0, i16 %mask) {
1043   ; CHECK-LABEL: test_x86_avx512_maskz_pslli_d
1044   ; CHECK: vpslld $7, %zmm0, %zmm0 {%k1} {z}
1045   %res = call <16 x i32> @llvm.x86.avx512.mask.pslli.d(<16 x i32> %a0, i32 7, <16 x i32> zeroinitializer, i16 %mask)
1046   ret <16 x i32> %res
1047 }
1048
1049 declare <16 x i32> @llvm.x86.avx512.mask.pslli.d(<16 x i32>, i32, <16 x i32>, i16) nounwind readnone
1050
1051 define <8 x i64> @test_x86_avx512_pslli_q(<8 x i64> %a0) {
1052   ; CHECK-LABEL: test_x86_avx512_pslli_q
1053   ; CHECK: vpsllq
1054   %res = call <8 x i64> @llvm.x86.avx512.mask.pslli.q(<8 x i64> %a0, i32 7, <8 x i64> zeroinitializer, i8 -1)
1055   ret <8 x i64> %res
1056 }
1057
1058 define <8 x i64> @test_x86_avx512_mask_pslli_q(<8 x i64> %a0, <8 x i64> %a1, i8 %mask) {
1059   ; CHECK-LABEL: test_x86_avx512_mask_pslli_q
1060   ; CHECK: vpsllq $7, %zmm0, %zmm1 {%k1}
1061   %res = call <8 x i64> @llvm.x86.avx512.mask.pslli.q(<8 x i64> %a0, i32 7, <8 x i64> %a1, i8 %mask)
1062   ret <8 x i64> %res
1063 }
1064
1065 define <8 x i64> @test_x86_avx512_maskz_pslli_q(<8 x i64> %a0, i8 %mask) {
1066   ; CHECK-LABEL: test_x86_avx512_maskz_pslli_q
1067   ; CHECK: vpsllq $7, %zmm0, %zmm0 {%k1} {z}
1068   %res = call <8 x i64> @llvm.x86.avx512.mask.pslli.q(<8 x i64> %a0, i32 7, <8 x i64> zeroinitializer, i8 %mask)
1069   ret <8 x i64> %res
1070 }
1071
1072 declare <8 x i64> @llvm.x86.avx512.mask.pslli.q(<8 x i64>, i32, <8 x i64>, i8) nounwind readnone
1073
1074 define <16 x i32> @test_x86_avx512_psrli_d(<16 x i32> %a0) {
1075   ; CHECK-LABEL: test_x86_avx512_psrli_d
1076   ; CHECK: vpsrld
1077   %res = call <16 x i32> @llvm.x86.avx512.mask.psrli.d(<16 x i32> %a0, i32 7, <16 x i32> zeroinitializer, i16 -1)
1078   ret <16 x i32> %res
1079 }
1080
1081 define <16 x i32> @test_x86_avx512_mask_psrli_d(<16 x i32> %a0, <16 x i32> %a1, i16 %mask) {
1082   ; CHECK-LABEL: test_x86_avx512_mask_psrli_d
1083   ; CHECK: vpsrld $7, %zmm0, %zmm1 {%k1}
1084   %res = call <16 x i32> @llvm.x86.avx512.mask.psrli.d(<16 x i32> %a0, i32 7, <16 x i32> %a1, i16 %mask)
1085   ret <16 x i32> %res
1086 }
1087
1088 define <16 x i32> @test_x86_avx512_maskz_psrli_d(<16 x i32> %a0, i16 %mask) {
1089   ; CHECK-LABEL: test_x86_avx512_maskz_psrli_d
1090   ; CHECK: vpsrld $7, %zmm0, %zmm0 {%k1} {z}
1091   %res = call <16 x i32> @llvm.x86.avx512.mask.psrli.d(<16 x i32> %a0, i32 7, <16 x i32> zeroinitializer, i16 %mask)
1092   ret <16 x i32> %res
1093 }
1094
1095 declare <16 x i32> @llvm.x86.avx512.mask.psrli.d(<16 x i32>, i32, <16 x i32>, i16) nounwind readnone
1096
1097 define <8 x i64> @test_x86_avx512_psrli_q(<8 x i64> %a0) {
1098   ; CHECK-LABEL: test_x86_avx512_psrli_q
1099   ; CHECK: vpsrlq
1100   %res = call <8 x i64> @llvm.x86.avx512.mask.psrli.q(<8 x i64> %a0, i32 7, <8 x i64> zeroinitializer, i8 -1)
1101   ret <8 x i64> %res
1102 }
1103
1104 define <8 x i64> @test_x86_avx512_mask_psrli_q(<8 x i64> %a0, <8 x i64> %a1, i8 %mask) {
1105   ; CHECK-LABEL: test_x86_avx512_mask_psrli_q
1106   ; CHECK: vpsrlq $7, %zmm0, %zmm1 {%k1}
1107   %res = call <8 x i64> @llvm.x86.avx512.mask.psrli.q(<8 x i64> %a0, i32 7, <8 x i64> %a1, i8 %mask)
1108   ret <8 x i64> %res
1109 }
1110
1111 define <8 x i64> @test_x86_avx512_maskz_psrli_q(<8 x i64> %a0, i8 %mask) {
1112   ; CHECK-LABEL: test_x86_avx512_maskz_psrli_q
1113   ; CHECK: vpsrlq $7, %zmm0, %zmm0 {%k1} {z}
1114   %res = call <8 x i64> @llvm.x86.avx512.mask.psrli.q(<8 x i64> %a0, i32 7, <8 x i64> zeroinitializer, i8 %mask)
1115   ret <8 x i64> %res
1116 }
1117
1118 declare <8 x i64> @llvm.x86.avx512.mask.psrli.q(<8 x i64>, i32, <8 x i64>, i8) nounwind readnone
1119
1120 define <16 x i32> @test_x86_avx512_psrai_d(<16 x i32> %a0) {
1121   ; CHECK-LABEL: test_x86_avx512_psrai_d
1122   ; CHECK: vpsrad
1123   %res = call <16 x i32> @llvm.x86.avx512.mask.psrai.d(<16 x i32> %a0, i32 7, <16 x i32> zeroinitializer, i16 -1)
1124   ret <16 x i32> %res
1125 }
1126
1127 define <16 x i32> @test_x86_avx512_mask_psrai_d(<16 x i32> %a0, <16 x i32> %a1, i16 %mask) {
1128   ; CHECK-LABEL: test_x86_avx512_mask_psrai_d
1129   ; CHECK: vpsrad $7, %zmm0, %zmm1 {%k1}
1130   %res = call <16 x i32> @llvm.x86.avx512.mask.psrai.d(<16 x i32> %a0, i32 7, <16 x i32> %a1, i16 %mask)
1131   ret <16 x i32> %res
1132 }
1133
1134 define <16 x i32> @test_x86_avx512_maskz_psrai_d(<16 x i32> %a0, i16 %mask) {
1135   ; CHECK-LABEL: test_x86_avx512_maskz_psrai_d
1136   ; CHECK: vpsrad $7, %zmm0, %zmm0 {%k1} {z}
1137   %res = call <16 x i32> @llvm.x86.avx512.mask.psrai.d(<16 x i32> %a0, i32 7, <16 x i32> zeroinitializer, i16 %mask)
1138   ret <16 x i32> %res
1139 }
1140
1141 declare <16 x i32> @llvm.x86.avx512.mask.psrai.d(<16 x i32>, i32, <16 x i32>, i16) nounwind readnone
1142
1143 define <8 x i64> @test_x86_avx512_psrai_q(<8 x i64> %a0) {
1144   ; CHECK-LABEL: test_x86_avx512_psrai_q
1145   ; CHECK: vpsraq
1146   %res = call <8 x i64> @llvm.x86.avx512.mask.psrai.q(<8 x i64> %a0, i32 7, <8 x i64> zeroinitializer, i8 -1)
1147   ret <8 x i64> %res
1148 }
1149
1150 define <8 x i64> @test_x86_avx512_mask_psrai_q(<8 x i64> %a0, <8 x i64> %a1, i8 %mask) {
1151   ; CHECK-LABEL: test_x86_avx512_mask_psrai_q
1152   ; CHECK: vpsraq $7, %zmm0, %zmm1 {%k1}
1153   %res = call <8 x i64> @llvm.x86.avx512.mask.psrai.q(<8 x i64> %a0, i32 7, <8 x i64> %a1, i8 %mask)
1154   ret <8 x i64> %res
1155 }
1156
1157 define <8 x i64> @test_x86_avx512_maskz_psrai_q(<8 x i64> %a0, i8 %mask) {
1158   ; CHECK-LABEL: test_x86_avx512_maskz_psrai_q
1159   ; CHECK: vpsraq $7, %zmm0, %zmm0 {%k1} {z}
1160   %res = call <8 x i64> @llvm.x86.avx512.mask.psrai.q(<8 x i64> %a0, i32 7, <8 x i64> zeroinitializer, i8 %mask)
1161   ret <8 x i64> %res
1162 }
1163
1164 declare <8 x i64> @llvm.x86.avx512.mask.psrai.q(<8 x i64>, i32, <8 x i64>, i8) nounwind readnone
1165
1166 define <16 x i32> @test_x86_avx512_psll_d(<16 x i32> %a0, <4 x i32> %a1) {
1167   ; CHECK-LABEL: test_x86_avx512_psll_d
1168   ; CHECK: vpslld
1169   %res = call <16 x i32> @llvm.x86.avx512.mask.psll.d(<16 x i32> %a0, <4 x i32> %a1, <16 x i32> zeroinitializer, i16 -1)
1170   ret <16 x i32> %res
1171 }
1172
1173 define <16 x i32> @test_x86_avx512_mask_psll_d(<16 x i32> %a0, <4 x i32> %a1, <16 x i32> %a2, i16 %mask) {
1174   ; CHECK-LABEL: test_x86_avx512_mask_psll_d
1175   ; CHECK: vpslld %xmm1, %zmm0, %zmm2 {%k1}
1176   %res = call <16 x i32> @llvm.x86.avx512.mask.psll.d(<16 x i32> %a0, <4 x i32> %a1, <16 x i32> %a2, i16 %mask)
1177   ret <16 x i32> %res
1178 }
1179
1180 define <16 x i32> @test_x86_avx512_maskz_psll_d(<16 x i32> %a0, <4 x i32> %a1, i16 %mask) {
1181   ; CHECK-LABEL: test_x86_avx512_maskz_psll_d
1182   ; CHECK: vpslld %xmm1, %zmm0, %zmm0 {%k1} {z}
1183   %res = call <16 x i32> @llvm.x86.avx512.mask.psll.d(<16 x i32> %a0, <4 x i32> %a1, <16 x i32> zeroinitializer, i16 %mask)
1184   ret <16 x i32> %res
1185 }
1186
1187 declare <16 x i32> @llvm.x86.avx512.mask.psll.d(<16 x i32>, <4 x i32>, <16 x i32>, i16) nounwind readnone
1188
1189 define <8 x i64> @test_x86_avx512_psll_q(<8 x i64> %a0, <2 x i64> %a1) {
1190   ; CHECK-LABEL: test_x86_avx512_psll_q
1191   ; CHECK: vpsllq
1192   %res = call <8 x i64> @llvm.x86.avx512.mask.psll.q(<8 x i64> %a0, <2 x i64> %a1, <8 x i64> zeroinitializer, i8 -1)
1193   ret <8 x i64> %res
1194 }
1195
1196 define <8 x i64> @test_x86_avx512_mask_psll_q(<8 x i64> %a0, <2 x i64> %a1, <8 x i64> %a2, i8 %mask) {
1197   ; CHECK-LABEL: test_x86_avx512_mask_psll_q
1198   ; CHECK: vpsllq %xmm1, %zmm0, %zmm2 {%k1}
1199   %res = call <8 x i64> @llvm.x86.avx512.mask.psll.q(<8 x i64> %a0, <2 x i64> %a1, <8 x i64> %a2, i8 %mask)
1200   ret <8 x i64> %res
1201 }
1202
1203 define <8 x i64> @test_x86_avx512_maskz_psll_q(<8 x i64> %a0, <2 x i64> %a1, i8 %mask) {
1204   ; CHECK-LABEL: test_x86_avx512_maskz_psll_q
1205   ; CHECK: vpsllq %xmm1, %zmm0, %zmm0 {%k1} {z}
1206   %res = call <8 x i64> @llvm.x86.avx512.mask.psll.q(<8 x i64> %a0, <2 x i64> %a1, <8 x i64> zeroinitializer, i8 %mask)
1207   ret <8 x i64> %res
1208 }
1209
1210 declare <8 x i64> @llvm.x86.avx512.mask.psll.q(<8 x i64>, <2 x i64>, <8 x i64>, i8) nounwind readnone
1211
1212 define <16 x i32> @test_x86_avx512_psrl_d(<16 x i32> %a0, <4 x i32> %a1) {
1213   ; CHECK-LABEL: test_x86_avx512_psrl_d
1214   ; CHECK: vpsrld
1215   %res = call <16 x i32> @llvm.x86.avx512.mask.psrl.d(<16 x i32> %a0, <4 x i32> %a1, <16 x i32> zeroinitializer, i16 -1)
1216   ret <16 x i32> %res
1217 }
1218
1219 define <16 x i32> @test_x86_avx512_mask_psrl_d(<16 x i32> %a0, <4 x i32> %a1, <16 x i32> %a2, i16 %mask) {
1220   ; CHECK-LABEL: test_x86_avx512_mask_psrl_d
1221   ; CHECK: vpsrld %xmm1, %zmm0, %zmm2 {%k1}
1222   %res = call <16 x i32> @llvm.x86.avx512.mask.psrl.d(<16 x i32> %a0, <4 x i32> %a1, <16 x i32> %a2, i16 %mask)
1223   ret <16 x i32> %res
1224 }
1225
1226 define <16 x i32> @test_x86_avx512_maskz_psrl_d(<16 x i32> %a0, <4 x i32> %a1, i16 %mask) {
1227   ; CHECK-LABEL: test_x86_avx512_maskz_psrl_d
1228   ; CHECK: vpsrld %xmm1, %zmm0, %zmm0 {%k1} {z}
1229   %res = call <16 x i32> @llvm.x86.avx512.mask.psrl.d(<16 x i32> %a0, <4 x i32> %a1, <16 x i32> zeroinitializer, i16 %mask)
1230   ret <16 x i32> %res
1231 }
1232
1233 declare <16 x i32> @llvm.x86.avx512.mask.psrl.d(<16 x i32>, <4 x i32>, <16 x i32>, i16) nounwind readnone
1234
1235 define <8 x i64> @test_x86_avx512_psrl_q(<8 x i64> %a0, <2 x i64> %a1) {
1236   ; CHECK-LABEL: test_x86_avx512_psrl_q
1237   ; CHECK: vpsrlq
1238   %res = call <8 x i64> @llvm.x86.avx512.mask.psrl.q(<8 x i64> %a0, <2 x i64> %a1, <8 x i64> zeroinitializer, i8 -1)
1239   ret <8 x i64> %res
1240 }
1241
1242 define <8 x i64> @test_x86_avx512_mask_psrl_q(<8 x i64> %a0, <2 x i64> %a1, <8 x i64> %a2, i8 %mask) {
1243   ; CHECK-LABEL: test_x86_avx512_mask_psrl_q
1244   ; CHECK: vpsrlq %xmm1, %zmm0, %zmm2 {%k1}
1245   %res = call <8 x i64> @llvm.x86.avx512.mask.psrl.q(<8 x i64> %a0, <2 x i64> %a1, <8 x i64> %a2, i8 %mask)
1246   ret <8 x i64> %res
1247 }
1248
1249 define <8 x i64> @test_x86_avx512_maskz_psrl_q(<8 x i64> %a0, <2 x i64> %a1, i8 %mask) {
1250   ; CHECK-LABEL: test_x86_avx512_maskz_psrl_q
1251   ; CHECK: vpsrlq %xmm1, %zmm0, %zmm0 {%k1} {z}
1252   %res = call <8 x i64> @llvm.x86.avx512.mask.psrl.q(<8 x i64> %a0, <2 x i64> %a1, <8 x i64> zeroinitializer, i8 %mask)
1253   ret <8 x i64> %res
1254 }
1255
1256 declare <8 x i64> @llvm.x86.avx512.mask.psrl.q(<8 x i64>, <2 x i64>, <8 x i64>, i8) nounwind readnone
1257
1258 define <16 x i32> @test_x86_avx512_psra_d(<16 x i32> %a0, <4 x i32> %a1) {
1259   ; CHECK-LABEL: test_x86_avx512_psra_d
1260   ; CHECK: vpsrad
1261   %res = call <16 x i32> @llvm.x86.avx512.mask.psra.d(<16 x i32> %a0, <4 x i32> %a1, <16 x i32> zeroinitializer, i16 -1)
1262   ret <16 x i32> %res
1263 }
1264
1265 define <16 x i32> @test_x86_avx512_mask_psra_d(<16 x i32> %a0, <4 x i32> %a1, <16 x i32> %a2, i16 %mask) {
1266   ; CHECK-LABEL: test_x86_avx512_mask_psra_d
1267   ; CHECK: vpsrad %xmm1, %zmm0, %zmm2 {%k1}
1268   %res = call <16 x i32> @llvm.x86.avx512.mask.psra.d(<16 x i32> %a0, <4 x i32> %a1, <16 x i32> %a2, i16 %mask)
1269   ret <16 x i32> %res
1270 }
1271
1272 define <16 x i32> @test_x86_avx512_maskz_psra_d(<16 x i32> %a0, <4 x i32> %a1, i16 %mask) {
1273   ; CHECK-LABEL: test_x86_avx512_maskz_psra_d
1274   ; CHECK: vpsrad %xmm1, %zmm0, %zmm0 {%k1} {z}
1275   %res = call <16 x i32> @llvm.x86.avx512.mask.psra.d(<16 x i32> %a0, <4 x i32> %a1, <16 x i32> zeroinitializer, i16 %mask)
1276   ret <16 x i32> %res
1277 }
1278
1279 declare <16 x i32> @llvm.x86.avx512.mask.psra.d(<16 x i32>, <4 x i32>, <16 x i32>, i16) nounwind readnone
1280
1281 define <8 x i64> @test_x86_avx512_psra_q(<8 x i64> %a0, <2 x i64> %a1) {
1282   ; CHECK-LABEL: test_x86_avx512_psra_q
1283   ; CHECK: vpsraq
1284   %res = call <8 x i64> @llvm.x86.avx512.mask.psra.q(<8 x i64> %a0, <2 x i64> %a1, <8 x i64> zeroinitializer, i8 -1)
1285   ret <8 x i64> %res
1286 }
1287
1288 define <8 x i64> @test_x86_avx512_mask_psra_q(<8 x i64> %a0, <2 x i64> %a1, <8 x i64> %a2, i8 %mask) {
1289   ; CHECK-LABEL: test_x86_avx512_mask_psra_q
1290   ; CHECK: vpsraq %xmm1, %zmm0, %zmm2 {%k1}
1291   %res = call <8 x i64> @llvm.x86.avx512.mask.psra.q(<8 x i64> %a0, <2 x i64> %a1, <8 x i64> %a2, i8 %mask)
1292   ret <8 x i64> %res
1293 }
1294
1295 define <8 x i64> @test_x86_avx512_maskz_psra_q(<8 x i64> %a0, <2 x i64> %a1, i8 %mask) {
1296   ; CHECK-LABEL: test_x86_avx512_maskz_psra_q
1297   ; CHECK: vpsraq %xmm1, %zmm0, %zmm0 {%k1} {z}
1298   %res = call <8 x i64> @llvm.x86.avx512.mask.psra.q(<8 x i64> %a0, <2 x i64> %a1, <8 x i64> zeroinitializer, i8 %mask)
1299   ret <8 x i64> %res
1300 }
1301
1302 declare <8 x i64> @llvm.x86.avx512.mask.psra.q(<8 x i64>, <2 x i64>, <8 x i64>, i8) nounwind readnone
1303
1304 define <16 x i32> @test_x86_avx512_psllv_d(<16 x i32> %a0, <16 x i32> %a1) {
1305   ; CHECK-LABEL: test_x86_avx512_psllv_d
1306   ; CHECK: vpsllvd
1307   %res = call <16 x i32> @llvm.x86.avx512.mask.psllv.d(<16 x i32> %a0, <16 x i32> %a1, <16 x i32> zeroinitializer, i16 -1)
1308   ret <16 x i32> %res
1309 }
1310
1311 define <16 x i32> @test_x86_avx512_mask_psllv_d(<16 x i32> %a0, <16 x i32> %a1, <16 x i32> %a2, i16 %mask) {
1312   ; CHECK-LABEL: test_x86_avx512_mask_psllv_d
1313   ; CHECK: vpsllvd %zmm1, %zmm0, %zmm2 {%k1}
1314   %res = call <16 x i32> @llvm.x86.avx512.mask.psllv.d(<16 x i32> %a0, <16 x i32> %a1, <16 x i32> %a2, i16 %mask)
1315   ret <16 x i32> %res
1316 }
1317
1318 define <16 x i32> @test_x86_avx512_maskz_psllv_d(<16 x i32> %a0, <16 x i32> %a1, i16 %mask) {
1319   ; CHECK-LABEL: test_x86_avx512_maskz_psllv_d
1320   ; CHECK: vpsllvd %zmm1, %zmm0, %zmm0 {%k1} {z}
1321   %res = call <16 x i32> @llvm.x86.avx512.mask.psllv.d(<16 x i32> %a0, <16 x i32> %a1, <16 x i32> zeroinitializer, i16 %mask)
1322   ret <16 x i32> %res
1323 }
1324
1325 declare <16 x i32> @llvm.x86.avx512.mask.psllv.d(<16 x i32>, <16 x i32>, <16 x i32>, i16) nounwind readnone
1326
1327 define <8 x i64> @test_x86_avx512_psllv_q(<8 x i64> %a0, <8 x i64> %a1) {
1328   ; CHECK-LABEL: test_x86_avx512_psllv_q
1329   ; CHECK: vpsllvq
1330   %res = call <8 x i64> @llvm.x86.avx512.mask.psllv.q(<8 x i64> %a0, <8 x i64> %a1, <8 x i64> zeroinitializer, i8 -1)
1331   ret <8 x i64> %res
1332 }
1333
1334 define <8 x i64> @test_x86_avx512_mask_psllv_q(<8 x i64> %a0, <8 x i64> %a1, <8 x i64> %a2, i8 %mask) {
1335   ; CHECK-LABEL: test_x86_avx512_mask_psllv_q
1336   ; CHECK: vpsllvq %zmm1, %zmm0, %zmm2 {%k1}
1337   %res = call <8 x i64> @llvm.x86.avx512.mask.psllv.q(<8 x i64> %a0, <8 x i64> %a1, <8 x i64> %a2, i8 %mask)
1338   ret <8 x i64> %res
1339 }
1340
1341 define <8 x i64> @test_x86_avx512_maskz_psllv_q(<8 x i64> %a0, <8 x i64> %a1, i8 %mask) {
1342   ; CHECK-LABEL: test_x86_avx512_maskz_psllv_q
1343   ; CHECK: vpsllvq %zmm1, %zmm0, %zmm0 {%k1} {z}
1344   %res = call <8 x i64> @llvm.x86.avx512.mask.psllv.q(<8 x i64> %a0, <8 x i64> %a1, <8 x i64> zeroinitializer, i8 %mask)
1345   ret <8 x i64> %res
1346 }
1347
1348 declare <8 x i64> @llvm.x86.avx512.mask.psllv.q(<8 x i64>, <8 x i64>, <8 x i64>, i8) nounwind readnone
1349
1350
1351 define <16 x i32> @test_x86_avx512_psrav_d(<16 x i32> %a0, <16 x i32> %a1) {
1352   ; CHECK-LABEL: test_x86_avx512_psrav_d
1353   ; CHECK: vpsravd
1354   %res = call <16 x i32> @llvm.x86.avx512.mask.psrav.d(<16 x i32> %a0, <16 x i32> %a1, <16 x i32> zeroinitializer, i16 -1)
1355   ret <16 x i32> %res
1356 }
1357
1358 define <16 x i32> @test_x86_avx512_mask_psrav_d(<16 x i32> %a0, <16 x i32> %a1, <16 x i32> %a2, i16 %mask) {
1359   ; CHECK-LABEL: test_x86_avx512_mask_psrav_d
1360   ; CHECK: vpsravd %zmm1, %zmm0, %zmm2 {%k1}
1361   %res = call <16 x i32> @llvm.x86.avx512.mask.psrav.d(<16 x i32> %a0, <16 x i32> %a1, <16 x i32> %a2, i16 %mask)
1362   ret <16 x i32> %res
1363 }
1364
1365 define <16 x i32> @test_x86_avx512_maskz_psrav_d(<16 x i32> %a0, <16 x i32> %a1, i16 %mask) {
1366   ; CHECK-LABEL: test_x86_avx512_maskz_psrav_d
1367   ; CHECK: vpsravd %zmm1, %zmm0, %zmm0 {%k1} {z}
1368   %res = call <16 x i32> @llvm.x86.avx512.mask.psrav.d(<16 x i32> %a0, <16 x i32> %a1, <16 x i32> zeroinitializer, i16 %mask)
1369   ret <16 x i32> %res
1370 }
1371
1372 declare <16 x i32> @llvm.x86.avx512.mask.psrav.d(<16 x i32>, <16 x i32>, <16 x i32>, i16) nounwind readnone
1373
1374 define <8 x i64> @test_x86_avx512_psrav_q(<8 x i64> %a0, <8 x i64> %a1) {
1375   ; CHECK-LABEL: test_x86_avx512_psrav_q
1376   ; CHECK: vpsravq
1377   %res = call <8 x i64> @llvm.x86.avx512.mask.psrav.q(<8 x i64> %a0, <8 x i64> %a1, <8 x i64> zeroinitializer, i8 -1)
1378   ret <8 x i64> %res
1379 }
1380
1381 define <8 x i64> @test_x86_avx512_mask_psrav_q(<8 x i64> %a0, <8 x i64> %a1, <8 x i64> %a2, i8 %mask) {
1382   ; CHECK-LABEL: test_x86_avx512_mask_psrav_q
1383   ; CHECK: vpsravq %zmm1, %zmm0, %zmm2 {%k1}
1384   %res = call <8 x i64> @llvm.x86.avx512.mask.psrav.q(<8 x i64> %a0, <8 x i64> %a1, <8 x i64> %a2, i8 %mask)
1385   ret <8 x i64> %res
1386 }
1387
1388 define <8 x i64> @test_x86_avx512_maskz_psrav_q(<8 x i64> %a0, <8 x i64> %a1, i8 %mask) {
1389   ; CHECK-LABEL: test_x86_avx512_maskz_psrav_q
1390   ; CHECK: vpsravq %zmm1, %zmm0, %zmm0 {%k1} {z}
1391   %res = call <8 x i64> @llvm.x86.avx512.mask.psrav.q(<8 x i64> %a0, <8 x i64> %a1, <8 x i64> zeroinitializer, i8 %mask)
1392   ret <8 x i64> %res
1393 }
1394
1395 declare <8 x i64> @llvm.x86.avx512.mask.psrav.q(<8 x i64>, <8 x i64>, <8 x i64>, i8) nounwind readnone
1396
1397 define <16 x i32> @test_x86_avx512_psrlv_d(<16 x i32> %a0, <16 x i32> %a1) {
1398   ; CHECK-LABEL: test_x86_avx512_psrlv_d
1399   ; CHECK: vpsrlvd
1400   %res = call <16 x i32> @llvm.x86.avx512.mask.psrlv.d(<16 x i32> %a0, <16 x i32> %a1, <16 x i32> zeroinitializer, i16 -1)
1401   ret <16 x i32> %res
1402 }
1403
1404 define <16 x i32> @test_x86_avx512_mask_psrlv_d(<16 x i32> %a0, <16 x i32> %a1, <16 x i32> %a2, i16 %mask) {
1405   ; CHECK-LABEL: test_x86_avx512_mask_psrlv_d
1406   ; CHECK: vpsrlvd %zmm1, %zmm0, %zmm2 {%k1}
1407   %res = call <16 x i32> @llvm.x86.avx512.mask.psrlv.d(<16 x i32> %a0, <16 x i32> %a1, <16 x i32> %a2, i16 %mask)
1408   ret <16 x i32> %res
1409 }
1410
1411 define <16 x i32> @test_x86_avx512_maskz_psrlv_d(<16 x i32> %a0, <16 x i32> %a1, i16 %mask) {
1412   ; CHECK-LABEL: test_x86_avx512_maskz_psrlv_d
1413   ; CHECK: vpsrlvd %zmm1, %zmm0, %zmm0 {%k1} {z}
1414   %res = call <16 x i32> @llvm.x86.avx512.mask.psrlv.d(<16 x i32> %a0, <16 x i32> %a1, <16 x i32> zeroinitializer, i16 %mask)
1415   ret <16 x i32> %res
1416 }
1417
1418 declare <16 x i32> @llvm.x86.avx512.mask.psrlv.d(<16 x i32>, <16 x i32>, <16 x i32>, i16) nounwind readnone
1419
1420 define <8 x i64> @test_x86_avx512_psrlv_q(<8 x i64> %a0, <8 x i64> %a1) {
1421   ; CHECK-LABEL: test_x86_avx512_psrlv_q
1422   ; CHECK: vpsrlvq
1423   %res = call <8 x i64> @llvm.x86.avx512.mask.psrlv.q(<8 x i64> %a0, <8 x i64> %a1, <8 x i64> zeroinitializer, i8 -1)
1424   ret <8 x i64> %res
1425 }
1426
1427 define <8 x i64> @test_x86_avx512_mask_psrlv_q(<8 x i64> %a0, <8 x i64> %a1, <8 x i64> %a2, i8 %mask) {
1428   ; CHECK-LABEL: test_x86_avx512_mask_psrlv_q
1429   ; CHECK: vpsrlvq %zmm1, %zmm0, %zmm2 {%k1}
1430   %res = call <8 x i64> @llvm.x86.avx512.mask.psrlv.q(<8 x i64> %a0, <8 x i64> %a1, <8 x i64> %a2, i8 %mask)
1431   ret <8 x i64> %res
1432 }
1433
1434 define <8 x i64> @test_x86_avx512_maskz_psrlv_q(<8 x i64> %a0, <8 x i64> %a1, i8 %mask) {
1435   ; CHECK-LABEL: test_x86_avx512_maskz_psrlv_q
1436   ; CHECK: vpsrlvq %zmm1, %zmm0, %zmm0 {%k1} {z}
1437   %res = call <8 x i64> @llvm.x86.avx512.mask.psrlv.q(<8 x i64> %a0, <8 x i64> %a1, <8 x i64> zeroinitializer, i8 %mask)
1438   ret <8 x i64> %res
1439 }
1440
1441 declare <8 x i64> @llvm.x86.avx512.mask.psrlv.q(<8 x i64>, <8 x i64>, <8 x i64>, i8) nounwind readnone
1442
1443 define <8 x i64> @test_x86_avx512_psrlv_q_memop(<8 x i64> %a0, <8 x i64>* %ptr) {
1444   ; CHECK-LABEL: test_x86_avx512_psrlv_q_memop
1445   ; CHECK: vpsrlvq (%
1446   %b = load <8 x i64>* %ptr
1447   %res = call <8 x i64> @llvm.x86.avx512.mask.psrlv.q(<8 x i64> %a0, <8 x i64> %b, <8 x i64> zeroinitializer, i8 -1)
1448   ret <8 x i64> %res
1449 }
1450
1451 declare <16 x float> @llvm.x86.avx512.mask.sub.ps.512(<16 x float>, <16 x float>, <16 x float>, i16, i32)
1452 declare <16 x float> @llvm.x86.avx512.mask.mul.ps.512(<16 x float>, <16 x float>, <16 x float>, i16, i32)
1453 declare <8 x double> @llvm.x86.avx512.mask.mul.pd.512(<8 x double>, <8 x double>, <8 x double>, i8, i32)
1454
1455 define <16 x float> @test_vsubps_rn(<16 x float> %a0, <16 x float> %a1) {
1456   ; CHECK-LABEL: test_vsubps_rn
1457   ; CHECK: vsubps {rn-sae}{{.*}} ## encoding: [0x62,0xf1,0x7c,0x18,0x5c,0xc1]
1458   %res = call <16 x float> @llvm.x86.avx512.mask.sub.ps.512(<16 x float> %a0, <16 x float> %a1,
1459                     <16 x float> zeroinitializer, i16 -1, i32 0)
1460   ret <16 x float> %res
1461 }
1462
1463 define <16 x float> @test_vsubps_rd(<16 x float> %a0, <16 x float> %a1) {
1464   ; CHECK-LABEL: test_vsubps_rd
1465   ; CHECK: vsubps {rd-sae}{{.*}} ## encoding: [0x62,0xf1,0x7c,0x38,0x5c,0xc1]
1466   %res = call <16 x float> @llvm.x86.avx512.mask.sub.ps.512(<16 x float> %a0, <16 x float> %a1,
1467                     <16 x float> zeroinitializer, i16 -1, i32 1)
1468   ret <16 x float> %res
1469 }
1470
1471 define <16 x float> @test_vsubps_ru(<16 x float> %a0, <16 x float> %a1) {
1472   ; CHECK-LABEL: test_vsubps_ru
1473   ; CHECK: vsubps {ru-sae}{{.*}} ## encoding: [0x62,0xf1,0x7c,0x58,0x5c,0xc1]
1474   %res = call <16 x float> @llvm.x86.avx512.mask.sub.ps.512(<16 x float> %a0, <16 x float> %a1,
1475                     <16 x float> zeroinitializer, i16 -1, i32 2)
1476   ret <16 x float> %res
1477 }
1478
1479 define <16 x float> @test_vsubps_rz(<16 x float> %a0, <16 x float> %a1) {
1480   ; CHECK-LABEL: test_vsubps_rz
1481   ; CHECK: vsubps {rz-sae}{{.*}} ## encoding: [0x62,0xf1,0x7c,0x78,0x5c,0xc1]
1482   %res = call <16 x float> @llvm.x86.avx512.mask.sub.ps.512(<16 x float> %a0, <16 x float> %a1,
1483                     <16 x float> zeroinitializer, i16 -1, i32 3)
1484   ret <16 x float> %res
1485 }
1486
1487 define <16 x float> @test_vmulps_rn(<16 x float> %a0, <16 x float> %a1) {
1488   ; CHECK-LABEL: test_vmulps_rn
1489   ; CHECK: vmulps {rn-sae}{{.*}} ## encoding: [0x62,0xf1,0x7c,0x18,0x59,0xc1]
1490   %res = call <16 x float> @llvm.x86.avx512.mask.mul.ps.512(<16 x float> %a0, <16 x float> %a1,
1491                     <16 x float> zeroinitializer, i16 -1, i32 0)
1492   ret <16 x float> %res
1493 }
1494
1495 define <16 x float> @test_vmulps_rd(<16 x float> %a0, <16 x float> %a1) {
1496   ; CHECK-LABEL: test_vmulps_rd
1497   ; CHECK: vmulps {rd-sae}{{.*}} ## encoding: [0x62,0xf1,0x7c,0x38,0x59,0xc1]
1498   %res = call <16 x float> @llvm.x86.avx512.mask.mul.ps.512(<16 x float> %a0, <16 x float> %a1,
1499                     <16 x float> zeroinitializer, i16 -1, i32 1)
1500   ret <16 x float> %res
1501 }
1502
1503 define <16 x float> @test_vmulps_ru(<16 x float> %a0, <16 x float> %a1) {
1504   ; CHECK-LABEL: test_vmulps_ru
1505   ; CHECK: vmulps {ru-sae}{{.*}} ## encoding: [0x62,0xf1,0x7c,0x58,0x59,0xc1]
1506   %res = call <16 x float> @llvm.x86.avx512.mask.mul.ps.512(<16 x float> %a0, <16 x float> %a1,
1507                     <16 x float> zeroinitializer, i16 -1, i32 2)
1508   ret <16 x float> %res
1509 }
1510
1511 define <16 x float> @test_vmulps_rz(<16 x float> %a0, <16 x float> %a1) {
1512   ; CHECK-LABEL: test_vmulps_rz
1513   ; CHECK: vmulps {rz-sae}{{.*}} ## encoding: [0x62,0xf1,0x7c,0x78,0x59,0xc1]
1514   %res = call <16 x float> @llvm.x86.avx512.mask.mul.ps.512(<16 x float> %a0, <16 x float> %a1,
1515                     <16 x float> zeroinitializer, i16 -1, i32 3)
1516   ret <16 x float> %res
1517 }
1518
1519 ;; mask float
1520 define <16 x float> @test_vmulps_mask_rn(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
1521   ; CHECK-LABEL: test_vmulps_mask_rn
1522   ; CHECK: vmulps {rn-sae}{{.*}}{%k1} {z} ## encoding: [0x62,0xf1,0x7c,0x99,0x59,0xc1]
1523   %res = call <16 x float> @llvm.x86.avx512.mask.mul.ps.512(<16 x float> %a0, <16 x float> %a1,
1524                     <16 x float> zeroinitializer, i16 %mask, i32 0)
1525   ret <16 x float> %res
1526 }
1527
1528 define <16 x float> @test_vmulps_mask_rd(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
1529   ; CHECK-LABEL: test_vmulps_mask_rd
1530   ; CHECK: vmulps {rd-sae}{{.*}}{%k1} {z} ## encoding: [0x62,0xf1,0x7c,0xb9,0x59,0xc1]
1531   %res = call <16 x float> @llvm.x86.avx512.mask.mul.ps.512(<16 x float> %a0, <16 x float> %a1,
1532                     <16 x float> zeroinitializer, i16 %mask, i32 1)
1533   ret <16 x float> %res
1534 }
1535
1536 define <16 x float> @test_vmulps_mask_ru(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
1537   ; CHECK-LABEL: test_vmulps_mask_ru
1538   ; CHECK: vmulps {ru-sae}{{.*}}{%k1} {z} ## encoding: [0x62,0xf1,0x7c,0xd9,0x59,0xc1]
1539   %res = call <16 x float> @llvm.x86.avx512.mask.mul.ps.512(<16 x float> %a0, <16 x float> %a1,
1540                     <16 x float> zeroinitializer, i16 %mask, i32 2)
1541   ret <16 x float> %res
1542 }
1543
1544 define <16 x float> @test_vmulps_mask_rz(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
1545   ; CHECK-LABEL: test_vmulps_mask_rz
1546   ; CHECK: vmulps {rz-sae}{{.*}}{%k1} {z} ## encoding: [0x62,0xf1,0x7c,0xf9,0x59,0xc1]
1547   %res = call <16 x float> @llvm.x86.avx512.mask.mul.ps.512(<16 x float> %a0, <16 x float> %a1,
1548                     <16 x float> zeroinitializer, i16 %mask, i32 3)
1549   ret <16 x float> %res
1550 }
1551
1552 ;; With Passthru value
1553 define <16 x float> @test_vmulps_mask_passthru_rn(<16 x float> %a0, <16 x float> %a1, <16 x float> %passthru, i16 %mask) {
1554   ; CHECK-LABEL: test_vmulps_mask_passthru_rn
1555   ; CHECK: vmulps {rn-sae}{{.*}}{%k1} ## encoding: [0x62,0xf1,0x7c,0x19,0x59,0xd1]
1556   %res = call <16 x float> @llvm.x86.avx512.mask.mul.ps.512(<16 x float> %a0, <16 x float> %a1,
1557                     <16 x float> %passthru, i16 %mask, i32 0)
1558   ret <16 x float> %res
1559 }
1560
1561 define <16 x float> @test_vmulps_mask_passthru_rd(<16 x float> %a0, <16 x float> %a1, <16 x float> %passthru, i16 %mask) {
1562   ; CHECK-LABEL: test_vmulps_mask_passthru_rd
1563   ; CHECK: vmulps {rd-sae}{{.*}}{%k1} ## encoding: [0x62,0xf1,0x7c,0x39,0x59,0xd1]
1564   %res = call <16 x float> @llvm.x86.avx512.mask.mul.ps.512(<16 x float> %a0, <16 x float> %a1,
1565                     <16 x float> %passthru, i16 %mask, i32 1)
1566   ret <16 x float> %res
1567 }
1568
1569 define <16 x float> @test_vmulps_mask_passthru_ru(<16 x float> %a0, <16 x float> %a1, <16 x float> %passthru, i16 %mask) {
1570   ; CHECK-LABEL: test_vmulps_mask_passthru_ru
1571   ; CHECK: vmulps {ru-sae}{{.*}}{%k1} ## encoding: [0x62,0xf1,0x7c,0x59,0x59,0xd1]
1572   %res = call <16 x float> @llvm.x86.avx512.mask.mul.ps.512(<16 x float> %a0, <16 x float> %a1,
1573                     <16 x float> %passthru, i16 %mask, i32 2)
1574   ret <16 x float> %res
1575 }
1576
1577 define <16 x float> @test_vmulps_mask_passthru_rz(<16 x float> %a0, <16 x float> %a1, <16 x float> %passthru, i16 %mask) {
1578   ; CHECK-LABEL: test_vmulps_mask_passthru_rz
1579   ; CHECK: vmulps {rz-sae}{{.*}}{%k1} ## encoding: [0x62,0xf1,0x7c,0x79,0x59,0xd1]
1580   %res = call <16 x float> @llvm.x86.avx512.mask.mul.ps.512(<16 x float> %a0, <16 x float> %a1,
1581                     <16 x float> %passthru, i16 %mask, i32 3)
1582   ret <16 x float> %res
1583 }
1584
1585 ;; mask double
1586 define <8 x double> @test_vmulpd_mask_rn(<8 x double> %a0, <8 x double> %a1, i8 %mask) {
1587   ; CHECK-LABEL: test_vmulpd_mask_rn
1588   ; CHECK: vmulpd {rn-sae}{{.*}}{%k1} {z} ## encoding: [0x62,0xf1,0xfd,0x99,0x59,0xc1]
1589   %res = call <8 x double> @llvm.x86.avx512.mask.mul.pd.512(<8 x double> %a0, <8 x double> %a1,
1590                     <8 x double> zeroinitializer, i8 %mask, i32 0)
1591   ret <8 x double> %res
1592 }
1593
1594 define <8 x double> @test_vmulpd_mask_rd(<8 x double> %a0, <8 x double> %a1, i8 %mask) {
1595   ; CHECK-LABEL: test_vmulpd_mask_rd
1596   ; CHECK: vmulpd {rd-sae}{{.*}}{%k1} {z} ## encoding: [0x62,0xf1,0xfd,0xb9,0x59,0xc1]
1597   %res = call <8 x double> @llvm.x86.avx512.mask.mul.pd.512(<8 x double> %a0, <8 x double> %a1,
1598                     <8 x double> zeroinitializer, i8 %mask, i32 1)
1599   ret <8 x double> %res
1600 }
1601
1602 define <8 x double> @test_vmulpd_mask_ru(<8 x double> %a0, <8 x double> %a1, i8 %mask) {
1603   ; CHECK-LABEL: test_vmulpd_mask_ru
1604   ; CHECK: vmulpd {ru-sae}{{.*}}{%k1} {z} ## encoding: [0x62,0xf1,0xfd,0xd9,0x59,0xc1]
1605   %res = call <8 x double> @llvm.x86.avx512.mask.mul.pd.512(<8 x double> %a0, <8 x double> %a1,
1606                     <8 x double> zeroinitializer, i8 %mask, i32 2)
1607   ret <8 x double> %res
1608 }
1609
1610 define <8 x double> @test_vmulpd_mask_rz(<8 x double> %a0, <8 x double> %a1, i8 %mask) {
1611   ; CHECK-LABEL: test_vmulpd_mask_rz
1612   ; CHECK: vmulpd {rz-sae}{{.*}}{%k1} {z} ## encoding: [0x62,0xf1,0xfd,0xf9,0x59,0xc1]
1613   %res = call <8 x double> @llvm.x86.avx512.mask.mul.pd.512(<8 x double> %a0, <8 x double> %a1,
1614                     <8 x double> zeroinitializer, i8 %mask, i32 3)
1615   ret <8 x double> %res
1616 }