[X86][AVX512] add reduce/range/scalef/rndScale
[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 <16 x float> @llvm.x86.avx512.mask.rndscale.ps.512(<16 x float>, i32, <16 x float>, i16, i32)
72
73 define <16 x float> @test8(<16 x float> %a) {
74 ; CHECK: vrndscaleps {{.*}}encoding: [0x62,0xf3,0x7d,0x48,0x08,0xc0,0x0b]
75   %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)
76   ret <16 x float>%res
77 }
78
79 define <16 x float> @test_rsqrt_ps_512(<16 x float> %a0) {
80   ; CHECK: vrsqrt14ps {{.*}}encoding: [0x62,0xf2,0x7d,0x48,0x4e,0xc0]
81   %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]
82   ret <16 x float> %res
83 }
84 declare <16 x float> @llvm.x86.avx512.rsqrt14.ps.512(<16 x float>, <16 x float>, i16) nounwind readnone
85
86 define <4 x float> @test_rsqrt14_ss(<4 x float> %a0) {
87   ; CHECK: vrsqrt14ss {{.*}}encoding: [0x62,0xf2,0x7d,0x08,0x4f,0xc0]
88   %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]
89   ret <4 x float> %res
90 }
91 declare <4 x float> @llvm.x86.avx512.rsqrt14.ss(<4 x float>, <4 x float>, <4 x float>, i8) nounwind readnone
92
93 define <4 x float> @test_rcp14_ss(<4 x float> %a0) {
94   ; CHECK: vrcp14ss {{.*}}encoding: [0x62,0xf2,0x7d,0x08,0x4d,0xc0]
95   %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]
96   ret <4 x float> %res
97 }
98 declare <4 x float> @llvm.x86.avx512.rcp14.ss(<4 x float>, <4 x float>, <4 x float>, i8) nounwind readnone
99
100 define <8 x double> @test_sqrt_pd_512(<8 x double> %a0) {
101   ; CHECK-LABEL: test_sqrt_pd_512
102   ; CHECK: vsqrtpd
103   %res = call <8 x double> @llvm.x86.avx512.mask.sqrt.pd.512(<8 x double> %a0,  <8 x double> zeroinitializer, i8 -1, i32 4) 
104   ret <8 x double> %res
105 }
106 declare <8 x double> @llvm.x86.avx512.mask.sqrt.pd.512(<8 x double>, <8 x double>, i8, i32) nounwind readnone
107
108 define <16 x float> @test_sqrt_ps_512(<16 x float> %a0) {
109   ; CHECK-LABEL: test_sqrt_ps_512
110   ; CHECK: vsqrtps
111   %res = call <16 x float> @llvm.x86.avx512.mask.sqrt.ps.512(<16 x float> %a0, <16 x float> zeroinitializer, i16 -1, i32 4) 
112   ret <16 x float> %res
113 }
114 define <16 x float> @test_sqrt_round_ps_512(<16 x float> %a0) {
115   ; CHECK-LABEL: test_sqrt_round_ps_512
116   ; CHECK: vsqrtps {rz-sae}
117   %res = call <16 x float> @llvm.x86.avx512.mask.sqrt.ps.512(<16 x float> %a0, <16 x float> zeroinitializer, i16 -1, i32 3) 
118   ret <16 x float> %res
119 }
120 declare <16 x float> @llvm.x86.avx512.mask.sqrt.ps.512(<16 x float>, <16 x float>, i16, i32) nounwind readnone
121
122 define <8 x double> @test_getexp_pd_512(<8 x double> %a0) {
123   ; CHECK-LABEL: test_getexp_pd_512
124   ; CHECK: vgetexppd
125   %res = call <8 x double> @llvm.x86.avx512.mask.getexp.pd.512(<8 x double> %a0,  <8 x double> zeroinitializer, i8 -1, i32 4) 
126   ret <8 x double> %res
127 }
128 define <8 x double> @test_getexp_round_pd_512(<8 x double> %a0) {
129   ; CHECK-LABEL: test_getexp_round_pd_512
130   ; CHECK: vgetexppd {sae}
131   %res = call <8 x double> @llvm.x86.avx512.mask.getexp.pd.512(<8 x double> %a0,  <8 x double> zeroinitializer, i8 -1, i32 8) 
132   ret <8 x double> %res
133 }
134 declare <8 x double> @llvm.x86.avx512.mask.getexp.pd.512(<8 x double>, <8 x double>, i8, i32) nounwind readnone
135
136 define <16 x float> @test_getexp_ps_512(<16 x float> %a0) {
137   ; CHECK-LABEL: test_getexp_ps_512
138   ; CHECK: vgetexpps
139   %res = call <16 x float> @llvm.x86.avx512.mask.getexp.ps.512(<16 x float> %a0, <16 x float> zeroinitializer, i16 -1, i32 4) 
140   ret <16 x float> %res
141 }
142
143 define <16 x float> @test_getexp_round_ps_512(<16 x float> %a0) {
144   ; CHECK-LABEL: test_getexp_round_ps_512
145   ; CHECK: vgetexpps {sae}
146   %res = call <16 x float> @llvm.x86.avx512.mask.getexp.ps.512(<16 x float> %a0, <16 x float> zeroinitializer, i16 -1, i32 8) 
147   ret <16 x float> %res
148 }
149 declare <16 x float> @llvm.x86.avx512.mask.getexp.ps.512(<16 x float>, <16 x float>, i16, i32) nounwind readnone
150
151 define <4 x float> @test_sqrt_ss(<4 x float> %a0, <4 x float> %a1) {
152   ; CHECK: vsqrtss {{.*}}encoding: [0x62
153   %res = call <4 x float> @llvm.x86.avx512.sqrt.ss(<4 x float> %a0, <4 x float> %a1) ; <<4 x float>> [#uses=1]
154   ret <4 x float> %res
155 }
156 declare <4 x float> @llvm.x86.avx512.sqrt.ss(<4 x float>, <4 x float>) nounwind readnone
157
158 define <2 x double> @test_sqrt_sd(<2 x double> %a0, <2 x double> %a1) {
159   ; CHECK: vsqrtsd {{.*}}encoding: [0x62
160   %res = call <2 x double> @llvm.x86.avx512.sqrt.sd(<2 x double> %a0, <2 x double> %a1) ; <<2 x double>> [#uses=1]
161   ret <2 x double> %res
162 }
163 declare <2 x double> @llvm.x86.avx512.sqrt.sd(<2 x double>, <2 x double>) nounwind readnone
164
165 define i64 @test_x86_sse2_cvtsd2si64(<2 x double> %a0) {
166   ; CHECK: vcvtsd2si {{.*}}encoding: [0x62
167   %res = call i64 @llvm.x86.sse2.cvtsd2si64(<2 x double> %a0) ; <i64> [#uses=1]
168   ret i64 %res
169 }
170 declare i64 @llvm.x86.sse2.cvtsd2si64(<2 x double>) nounwind readnone
171
172 define <2 x double> @test_x86_sse2_cvtsi642sd(<2 x double> %a0, i64 %a1) {
173   ; CHECK: vcvtsi2sdq {{.*}}encoding: [0x62
174   %res = call <2 x double> @llvm.x86.sse2.cvtsi642sd(<2 x double> %a0, i64 %a1) ; <<2 x double>> [#uses=1]
175   ret <2 x double> %res
176 }
177 declare <2 x double> @llvm.x86.sse2.cvtsi642sd(<2 x double>, i64) nounwind readnone
178
179 define i64 @test_x86_sse2_cvttsd2si64(<2 x double> %a0) {
180   ; CHECK: vcvttsd2si {{.*}}encoding: [0x62
181   %res = call i64 @llvm.x86.sse2.cvttsd2si64(<2 x double> %a0) ; <i64> [#uses=1]
182   ret i64 %res
183 }
184 declare i64 @llvm.x86.sse2.cvttsd2si64(<2 x double>) nounwind readnone
185
186
187 define i64 @test_x86_sse_cvtss2si64(<4 x float> %a0) {
188   ; CHECK: vcvtss2si {{.*}}encoding: [0x62
189   %res = call i64 @llvm.x86.sse.cvtss2si64(<4 x float> %a0) ; <i64> [#uses=1]
190   ret i64 %res
191 }
192 declare i64 @llvm.x86.sse.cvtss2si64(<4 x float>) nounwind readnone
193
194
195 define <4 x float> @test_x86_sse_cvtsi642ss(<4 x float> %a0, i64 %a1) {
196   ; CHECK: vcvtsi2ssq {{.*}}encoding: [0x62
197   %res = call <4 x float> @llvm.x86.sse.cvtsi642ss(<4 x float> %a0, i64 %a1) ; <<4 x float>> [#uses=1]
198   ret <4 x float> %res
199 }
200 declare <4 x float> @llvm.x86.sse.cvtsi642ss(<4 x float>, i64) nounwind readnone
201
202
203 define i64 @test_x86_sse_cvttss2si64(<4 x float> %a0) {
204   ; CHECK: vcvttss2si {{.*}}encoding: [0x62
205   %res = call i64 @llvm.x86.sse.cvttss2si64(<4 x float> %a0) ; <i64> [#uses=1]
206   ret i64 %res
207 }
208 declare i64 @llvm.x86.sse.cvttss2si64(<4 x float>) nounwind readnone
209
210 define i64 @test_x86_avx512_cvtsd2usi64(<2 x double> %a0) {
211   ; CHECK: vcvtsd2usi {{.*}}encoding: [0x62
212   %res = call i64 @llvm.x86.avx512.cvtsd2usi64(<2 x double> %a0) ; <i64> [#uses=1]
213   ret i64 %res
214 }
215 declare i64 @llvm.x86.avx512.cvtsd2usi64(<2 x double>) nounwind readnone
216
217 define <16 x float> @test_x86_vcvtph2ps_512(<16 x i16> %a0) {
218   ; CHECK: vcvtph2ps  %ymm0, %zmm0    ## encoding: [0x62,0xf2,0x7d,0x48,0x13,0xc0]
219   %res = call <16 x float> @llvm.x86.avx512.mask.vcvtph2ps.512(<16 x i16> %a0, <16 x float> zeroinitializer, i16 -1, i32 4)
220   ret <16 x float> %res
221 }
222 declare <16 x float> @llvm.x86.avx512.mask.vcvtph2ps.512(<16 x i16>, <16 x float>, i16, i32) nounwind readonly
223
224
225 define <16 x i16> @test_x86_vcvtps2ph_256(<16 x float> %a0) {
226   ; CHECK: vcvtps2ph $2, %zmm0, %ymm0  ## encoding: [0x62,0xf3,0x7d,0x48,0x1d,0xc0,0x02]
227   %res = call <16 x i16> @llvm.x86.avx512.mask.vcvtps2ph.512(<16 x float> %a0, i32 2, <16 x i16> zeroinitializer, i16 -1)
228   ret <16 x i16> %res
229 }
230
231 declare <16 x i16> @llvm.x86.avx512.mask.vcvtps2ph.512(<16 x float>, i32, <16 x i16>, i16) nounwind readonly
232
233 define <16 x float> @test_x86_vbroadcast_ss_512(i8* %a0) {
234   ; CHECK: vbroadcastss
235   %res = call <16 x float> @llvm.x86.avx512.vbroadcast.ss.512(i8* %a0) ; <<16 x float>> [#uses=1]
236   ret <16 x float> %res
237 }
238 declare <16 x float> @llvm.x86.avx512.vbroadcast.ss.512(i8*) nounwind readonly
239
240 define <8 x double> @test_x86_vbroadcast_sd_512(i8* %a0) {
241   ; CHECK: vbroadcastsd
242   %res = call <8 x double> @llvm.x86.avx512.vbroadcast.sd.512(i8* %a0) ; <<8 x double>> [#uses=1]
243   ret <8 x double> %res
244 }
245 declare <8 x double> @llvm.x86.avx512.vbroadcast.sd.512(i8*) nounwind readonly
246
247 define <16 x float> @test_x86_vbroadcast_ss_ps_512(<4 x float> %a0) {
248   ; CHECK: vbroadcastss
249   %res = call <16 x float> @llvm.x86.avx512.vbroadcast.ss.ps.512(<4 x float> %a0) ; <<16 x float>> [#uses=1]
250   ret <16 x float> %res
251 }
252 declare <16 x float> @llvm.x86.avx512.vbroadcast.ss.ps.512(<4 x float>) nounwind readonly
253
254 define <8 x double> @test_x86_vbroadcast_sd_pd_512(<2 x double> %a0) {
255   ; CHECK: vbroadcastsd
256   %res = call <8 x double> @llvm.x86.avx512.vbroadcast.sd.pd.512(<2 x double> %a0) ; <<8 x double>> [#uses=1]
257   ret <8 x double> %res
258 }
259 declare <8 x double> @llvm.x86.avx512.vbroadcast.sd.pd.512(<2 x double>) nounwind readonly
260
261 define <16 x i32> @test_x86_pbroadcastd_512(<4 x i32>  %a0) {
262   ; CHECK: vpbroadcastd
263   %res = call <16 x i32> @llvm.x86.avx512.pbroadcastd.512(<4 x i32> %a0) ; <<16 x i32>> [#uses=1]
264   ret <16 x i32> %res
265 }
266 declare <16 x i32> @llvm.x86.avx512.pbroadcastd.512(<4 x i32>) nounwind readonly
267
268 define <16 x i32> @test_x86_pbroadcastd_i32_512(i32  %a0) {
269   ; CHECK: vpbroadcastd
270   %res = call <16 x i32> @llvm.x86.avx512.pbroadcastd.i32.512(i32 %a0) ; <<16 x i32>> [#uses=1]
271   ret <16 x i32> %res
272 }
273 declare <16 x i32> @llvm.x86.avx512.pbroadcastd.i32.512(i32) nounwind readonly
274
275 define <8 x i64> @test_x86_pbroadcastq_512(<2 x i64> %a0) {
276   ; CHECK: vpbroadcastq
277   %res = call <8 x i64> @llvm.x86.avx512.pbroadcastq.512(<2 x i64> %a0) ; <<8 x i64>> [#uses=1]
278   ret <8 x i64> %res
279 }
280 declare <8 x i64> @llvm.x86.avx512.pbroadcastq.512(<2 x i64>) nounwind readonly
281
282 define <8 x i64> @test_x86_pbroadcastq_i64_512(i64 %a0) {
283   ; CHECK: vpbroadcastq
284   %res = call <8 x i64> @llvm.x86.avx512.pbroadcastq.i64.512(i64 %a0) ; <<8 x i64>> [#uses=1]
285   ret <8 x i64> %res
286 }
287 declare <8 x i64> @llvm.x86.avx512.pbroadcastq.i64.512(i64) nounwind readonly
288
289 define <16 x i32> @test_conflict_d(<16 x i32> %a) {
290   ; CHECK: movw $-1, %ax
291   ; CHECK: vpxor
292   ; CHECK: vpconflictd
293   %res = call <16 x i32> @llvm.x86.avx512.mask.conflict.d.512(<16 x i32> %a, <16 x i32> zeroinitializer, i16 -1)
294   ret <16 x i32> %res
295 }
296
297 declare <16 x i32> @llvm.x86.avx512.mask.conflict.d.512(<16 x i32>, <16 x i32>, i16) nounwind readonly
298
299 define <8 x i64> @test_conflict_q(<8 x i64> %a) {
300   ; CHECK: movb $-1, %al
301   ; CHECK: vpxor
302   ; CHECK: vpconflictq
303   %res = call <8 x i64> @llvm.x86.avx512.mask.conflict.q.512(<8 x i64> %a, <8 x i64> zeroinitializer, i8 -1)
304   ret <8 x i64> %res
305 }
306
307 declare <8 x i64> @llvm.x86.avx512.mask.conflict.q.512(<8 x i64>, <8 x i64>, i8) nounwind readonly
308
309 define <16 x i32> @test_maskz_conflict_d(<16 x i32> %a, i16 %mask) {
310   ; CHECK: vpconflictd
311   %res = call <16 x i32> @llvm.x86.avx512.mask.conflict.d.512(<16 x i32> %a, <16 x i32> zeroinitializer, i16 %mask)
312   ret <16 x i32> %res
313 }
314
315 define <8 x i64> @test_mask_conflict_q(<8 x i64> %a, <8 x i64> %b, i8 %mask) {
316   ; CHECK: vpconflictq
317   %res = call <8 x i64> @llvm.x86.avx512.mask.conflict.q.512(<8 x i64> %a, <8 x i64> %b, i8 %mask)
318   ret <8 x i64> %res
319 }
320
321 define <16 x i32> @test_lzcnt_d(<16 x i32> %a) {
322   ; CHECK: movw $-1, %ax
323   ; CHECK: vpxor
324   ; CHECK: vplzcntd
325   %res = call <16 x i32> @llvm.x86.avx512.mask.lzcnt.d.512(<16 x i32> %a, <16 x i32> zeroinitializer, i16 -1)
326   ret <16 x i32> %res
327 }
328
329 declare <16 x i32> @llvm.x86.avx512.mask.lzcnt.d.512(<16 x i32>, <16 x i32>, i16) nounwind readonly
330
331 define <8 x i64> @test_lzcnt_q(<8 x i64> %a) {
332   ; CHECK: movb $-1, %al
333   ; CHECK: vpxor
334   ; CHECK: vplzcntq
335   %res = call <8 x i64> @llvm.x86.avx512.mask.lzcnt.q.512(<8 x i64> %a, <8 x i64> zeroinitializer, i8 -1)
336   ret <8 x i64> %res
337 }
338
339 declare <8 x i64> @llvm.x86.avx512.mask.lzcnt.q.512(<8 x i64>, <8 x i64>, i8) nounwind readonly
340
341
342 define <16 x i32> @test_mask_lzcnt_d(<16 x i32> %a, <16 x i32> %b, i16 %mask) {
343   ; CHECK: vplzcntd
344   %res = call <16 x i32> @llvm.x86.avx512.mask.lzcnt.d.512(<16 x i32> %a, <16 x i32> %b, i16 %mask)
345   ret <16 x i32> %res
346 }
347
348 define <8 x i64> @test_mask_lzcnt_q(<8 x i64> %a, <8 x i64> %b, i8 %mask) {
349   ; CHECK: vplzcntq
350   %res = call <8 x i64> @llvm.x86.avx512.mask.lzcnt.q.512(<8 x i64> %a, <8 x i64> %b, i8 %mask)
351   ret <8 x i64> %res
352 }
353
354 define <16 x i32> @test_ctlz_d(<16 x i32> %a) {
355   ; CHECK-LABEL: test_ctlz_d
356   ; CHECK: vplzcntd
357   %res = call <16 x i32> @llvm.ctlz.v16i32(<16 x i32> %a, i1 false)
358   ret <16 x i32> %res
359 }
360
361 declare <16 x i32> @llvm.ctlz.v16i32(<16 x i32>, i1) nounwind readonly
362
363 define <8 x i64> @test_ctlz_q(<8 x i64> %a) {
364   ; CHECK-LABEL: test_ctlz_q
365   ; CHECK: vplzcntq
366   %res = call <8 x i64> @llvm.ctlz.v8i64(<8 x i64> %a, i1 false)
367   ret <8 x i64> %res
368 }
369
370 declare <8 x i64> @llvm.ctlz.v8i64(<8 x i64>, i1) nounwind readonly
371
372 define <16 x float> @test_x86_mask_blend_ps_512(i16 %a0, <16 x float> %a1, <16 x float> %a2) {
373   ; CHECK: vblendmps %zmm1, %zmm0
374   %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]
375   ret <16 x float> %res
376 }
377
378 declare <16 x float> @llvm.x86.avx512.mask.blend.ps.512(<16 x float>, <16 x float>, i16) nounwind readonly
379
380 define <8 x double> @test_x86_mask_blend_pd_512(i8 %a0, <8 x double> %a1, <8 x double> %a2) {
381   ; CHECK: vblendmpd %zmm1, %zmm0
382   %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]
383   ret <8 x double> %res
384 }
385
386 define <8 x double> @test_x86_mask_blend_pd_512_memop(<8 x double> %a, <8 x double>* %ptr, i8 %mask) {
387   ; CHECK-LABEL: test_x86_mask_blend_pd_512_memop
388   ; CHECK: vblendmpd (%
389   %b = load <8 x double>, <8 x double>* %ptr
390   %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]
391   ret <8 x double> %res
392 }
393 declare <8 x double> @llvm.x86.avx512.mask.blend.pd.512(<8 x double>, <8 x double>, i8) nounwind readonly
394
395 define <16 x i32> @test_x86_mask_blend_d_512(i16 %a0, <16 x i32> %a1, <16 x i32> %a2) {
396   ; CHECK: vpblendmd
397   %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]
398   ret <16 x i32> %res
399 }
400 declare <16 x i32> @llvm.x86.avx512.mask.blend.d.512(<16 x i32>, <16 x i32>, i16) nounwind readonly
401
402 define <8 x i64> @test_x86_mask_blend_q_512(i8 %a0, <8 x i64> %a1, <8 x i64> %a2) {
403   ; CHECK: vpblendmq
404   %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]
405   ret <8 x i64> %res
406 }
407 declare <8 x i64> @llvm.x86.avx512.mask.blend.q.512(<8 x i64>, <8 x i64>, i8) nounwind readonly
408
409  define i16 @test_cmpps(<16 x float> %a, <16 x float> %b) {
410  ;CHECK: vcmpleps {sae}{{.*}}encoding: [0x62,0xf1,0x7c,0x18,0xc2,0xc1,0x02]
411    %res = call i16 @llvm.x86.avx512.mask.cmp.ps.512(<16 x float> %a, <16 x float> %b, i32 2, i16 -1, i32 8)
412    ret i16 %res
413  }
414  declare i16 @llvm.x86.avx512.mask.cmp.ps.512(<16 x float> , <16 x float> , i32, i16, i32)
415
416  define i8 @test_cmppd(<8 x double> %a, <8 x double> %b) {
417  ;CHECK: vcmpneqpd %zmm{{.*}}encoding: [0x62,0xf1,0xfd,0x48,0xc2,0xc1,0x04]
418    %res = call i8 @llvm.x86.avx512.mask.cmp.pd.512(<8 x double> %a, <8 x double> %b, i32 4, i8 -1, i32 4)
419    ret i8 %res
420  }
421  declare i8 @llvm.x86.avx512.mask.cmp.pd.512(<8 x double> , <8 x double> , i32, i8, i32)
422
423  ; fp min - max
424 define <8 x double> @test_vmaxpd(<8 x double> %a0, <8 x double> %a1) {
425   ; CHECK: vmaxpd
426   %res = call <8 x double> @llvm.x86.avx512.mask.max.pd.512(<8 x double> %a0, <8 x double> %a1,
427                     <8 x double>zeroinitializer, i8 -1, i32 4)
428   ret <8 x double> %res
429 }
430 declare <8 x double> @llvm.x86.avx512.mask.max.pd.512(<8 x double>, <8 x double>,
431                     <8 x double>, i8, i32)
432
433 define <8 x double> @test_vminpd(<8 x double> %a0, <8 x double> %a1) {
434   ; CHECK: vminpd
435   %res = call <8 x double> @llvm.x86.avx512.mask.min.pd.512(<8 x double> %a0, <8 x double> %a1,
436                     <8 x double>zeroinitializer, i8 -1, i32 4)
437   ret <8 x double> %res
438 }
439 declare <8 x double> @llvm.x86.avx512.mask.min.pd.512(<8 x double>, <8 x double>,
440                     <8 x double>, i8, i32)
441
442  declare <16 x i32> @llvm.x86.avx512.mask.pabs.d.512(<16 x i32>, <16 x i32>, i16)
443
444 ; CHECK-LABEL: @test_int_x86_avx512_mask_pabs_d_512
445 ; CHECK-NOT: call 
446 ; CHECK: kmov 
447 ; CHECK: vpabsd{{.*}}{%k1} 
448 define <16 x i32>@test_int_x86_avx512_mask_pabs_d_512(<16 x i32> %x0, <16 x i32> %x1, i16 %x2) {
449   %res = call <16 x i32> @llvm.x86.avx512.mask.pabs.d.512(<16 x i32> %x0, <16 x i32> %x1, i16 %x2)
450   %res1 = call <16 x i32> @llvm.x86.avx512.mask.pabs.d.512(<16 x i32> %x0, <16 x i32> %x1, i16 -1)
451   %res2 = add <16 x i32> %res, %res1
452   ret <16 x i32> %res2
453 }
454
455 declare <8 x i64> @llvm.x86.avx512.mask.pabs.q.512(<8 x i64>, <8 x i64>, i8)
456
457 ; CHECK-LABEL: @test_int_x86_avx512_mask_pabs_q_512
458 ; CHECK-NOT: call 
459 ; CHECK: kmov 
460 ; CHECK: vpabsq{{.*}}{%k1} 
461 define <8 x i64>@test_int_x86_avx512_mask_pabs_q_512(<8 x i64> %x0, <8 x i64> %x1, i8 %x2) {
462   %res = call <8 x i64> @llvm.x86.avx512.mask.pabs.q.512(<8 x i64> %x0, <8 x i64> %x1, i8 %x2)
463   %res1 = call <8 x i64> @llvm.x86.avx512.mask.pabs.q.512(<8 x i64> %x0, <8 x i64> %x1, i8 -1)
464   %res2 = add <8 x i64> %res, %res1
465   ret <8 x i64> %res2
466 }
467
468 define i8 @test_vptestmq(<8 x i64> %a0, <8 x i64> %a1) {
469   ; CHECK: vptestmq {{.*}}encoding: [0x62,0xf2,0xfd,0x48,0x27,0xc1]
470   %res = call i8 @llvm.x86.avx512.mask.ptestm.q.512(<8 x i64> %a0, <8 x i64> %a1, i8 -1)
471   ret i8 %res
472 }
473 declare i8 @llvm.x86.avx512.mask.ptestm.q.512(<8 x i64>, <8 x i64>, i8)
474
475 define i16 @test_vptestmd(<16 x i32> %a0, <16 x i32> %a1) {
476   ; CHECK: vptestmd {{.*}}encoding: [0x62,0xf2,0x7d,0x48,0x27,0xc1]
477   %res = call i16 @llvm.x86.avx512.mask.ptestm.d.512(<16 x i32> %a0, <16 x i32> %a1, i16 -1)
478   ret i16 %res
479 }
480 declare i16 @llvm.x86.avx512.mask.ptestm.d.512(<16 x i32>, <16 x i32>, i16)
481
482 define void @test_store1(<16 x float> %data, i8* %ptr, i16 %mask) {
483 ; CHECK: vmovups {{.*}}encoding: [0x62,0xf1,0x7c,0x49,0x11,0x07]
484   call void @llvm.x86.avx512.mask.storeu.ps.512(i8* %ptr, <16 x float> %data, i16 %mask)
485   ret void
486 }
487
488 declare void @llvm.x86.avx512.mask.storeu.ps.512(i8*, <16 x float>, i16 )
489
490 define void @test_store2(<8 x double> %data, i8* %ptr, i8 %mask) {
491 ; CHECK: vmovupd {{.*}}encoding: [0x62,0xf1,0xfd,0x49,0x11,0x07]
492   call void @llvm.x86.avx512.mask.storeu.pd.512(i8* %ptr, <8 x double> %data, i8 %mask)
493   ret void
494 }
495
496 declare void @llvm.x86.avx512.mask.storeu.pd.512(i8*, <8 x double>, i8)
497
498 define void @test_mask_store_aligned_ps(<16 x float> %data, i8* %ptr, i16 %mask) {
499 ; CHECK-LABEL: test_mask_store_aligned_ps:
500 ; CHECK:       ## BB#0:
501 ; CHECK-NEXT:    kmovw %esi, %k1
502 ; CHECK-NEXT:    vmovaps %zmm0, (%rdi) {%k1}
503 ; CHECK-NEXT:    retq
504   call void @llvm.x86.avx512.mask.store.ps.512(i8* %ptr, <16 x float> %data, i16 %mask)
505   ret void
506 }
507
508 declare void @llvm.x86.avx512.mask.store.ps.512(i8*, <16 x float>, i16 )
509
510 define void @test_mask_store_aligned_pd(<8 x double> %data, i8* %ptr, i8 %mask) {
511 ; CHECK-LABEL: test_mask_store_aligned_pd:
512 ; CHECK:       ## BB#0:
513 ; CHECK-NEXT:    kmovw %esi, %k1
514 ; CHECK-NEXT:    vmovapd %zmm0, (%rdi) {%k1}
515 ; CHECK-NEXT:    retq
516   call void @llvm.x86.avx512.mask.store.pd.512(i8* %ptr, <8 x double> %data, i8 %mask)
517   ret void
518 }
519
520 declare void @llvm.x86.avx512.mask.store.pd.512(i8*, <8 x double>, i8)
521
522 define <16 x float> @test_maskz_load_aligned_ps(<16 x float> %data, i8* %ptr, i16 %mask) {
523 ; CHECK-LABEL: test_maskz_load_aligned_ps:
524 ; CHECK:       ## BB#0:
525 ; CHECK-NEXT:    kmovw %esi, %k1
526 ; CHECK-NEXT:    vmovaps (%rdi), %zmm0 {%k1} {z}
527 ; CHECK-NEXT:    retq
528   %res = call <16 x float> @llvm.x86.avx512.mask.load.ps.512(i8* %ptr, <16 x float> zeroinitializer, i16 %mask)
529   ret <16 x float> %res
530 }
531
532 declare <16 x float> @llvm.x86.avx512.mask.load.ps.512(i8*, <16 x float>, i16)
533
534 define <8 x double> @test_maskz_load_aligned_pd(<8 x double> %data, i8* %ptr, i8 %mask) {
535 ; CHECK-LABEL: test_maskz_load_aligned_pd:
536 ; CHECK:       ## BB#0:
537 ; CHECK-NEXT:    kmovw %esi, %k1
538 ; CHECK-NEXT:    vmovapd (%rdi), %zmm0 {%k1} {z}
539 ; CHECK-NEXT:    retq
540   %res = call <8 x double> @llvm.x86.avx512.mask.load.pd.512(i8* %ptr, <8 x double> zeroinitializer, i8 %mask)
541   ret <8 x double> %res
542 }
543
544 declare <8 x double> @llvm.x86.avx512.mask.load.pd.512(i8*, <8 x double>, i8)
545
546 define <16 x float> @test_load_aligned_ps(<16 x float> %data, i8* %ptr, i16 %mask) {
547 ; CHECK-LABEL: test_load_aligned_ps:
548 ; CHECK:       ## BB#0:
549 ; CHECK-NEXT:    vmovaps (%rdi), %zmm0
550 ; CHECK-NEXT:    retq
551   %res = call <16 x float> @llvm.x86.avx512.mask.load.ps.512(i8* %ptr, <16 x float> zeroinitializer, i16 -1)
552   ret <16 x float> %res
553 }
554
555 define <8 x double> @test_load_aligned_pd(<8 x double> %data, i8* %ptr, i8 %mask) {
556 ; CHECK-LABEL: test_load_aligned_pd:
557 ; CHECK:       ## BB#0:
558 ; CHECK-NEXT:    vmovapd (%rdi), %zmm0
559 ; CHECK-NEXT:    retq
560   %res = call <8 x double> @llvm.x86.avx512.mask.load.pd.512(i8* %ptr, <8 x double> zeroinitializer, i8 -1)
561   ret <8 x double> %res
562 }
563
564 declare <8 x i64> @llvm.x86.avx512.movntdqa(i8*)
565
566 define <8 x i64> @test_valign_q(<8 x i64> %a, <8 x i64> %b) {
567 ; CHECK-LABEL: test_valign_q:
568 ; CHECK: valignq $2, %zmm1, %zmm0, %zmm0
569   %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)
570   ret <8 x i64> %res
571 }
572
573 define <8 x i64> @test_mask_valign_q(<8 x i64> %a, <8 x i64> %b, <8 x i64> %src, i8 %mask) {
574 ; CHECK-LABEL: test_mask_valign_q:
575 ; CHECK: valignq $2, %zmm1, %zmm0, %zmm2 {%k1}
576   %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)
577   ret <8 x i64> %res
578 }
579
580 declare <8 x i64> @llvm.x86.avx512.mask.valign.q.512(<8 x i64>, <8 x i64>, i8, <8 x i64>, i8)
581
582 define <16 x i32> @test_maskz_valign_d(<16 x i32> %a, <16 x i32> %b, i16 %mask) {
583 ; CHECK-LABEL: test_maskz_valign_d:
584 ; CHECK: valignd $5, %zmm1, %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf3,0x7d,0xc9,0x03,0xc1,0x05]
585   %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)
586   ret <16 x i32> %res
587 }
588
589 declare <16 x i32> @llvm.x86.avx512.mask.valign.d.512(<16 x i32>, <16 x i32>, i8, <16 x i32>, i16)
590
591 define void @test_mask_store_ss(i8* %ptr, <4 x float> %data, i8 %mask) {
592  ; CHECK-LABEL: test_mask_store_ss
593  ; CHECK: vmovss %xmm0, (%rdi) {%k1}     ## encoding: [0x62,0xf1,0x7e,0x09,0x11,0x07]
594  call void @llvm.x86.avx512.mask.store.ss(i8* %ptr, <4 x float> %data, i8 %mask)
595  ret void
596 }
597
598 declare void @llvm.x86.avx512.mask.store.ss(i8*, <4 x float>, i8 )
599
600 define i16 @test_pcmpeq_d(<16 x i32> %a, <16 x i32> %b) {
601 ; CHECK-LABEL: test_pcmpeq_d
602 ; CHECK: vpcmpeqd %zmm1, %zmm0, %k0 ##
603   %res = call i16 @llvm.x86.avx512.mask.pcmpeq.d.512(<16 x i32> %a, <16 x i32> %b, i16 -1)
604   ret i16 %res
605 }
606
607 define i16 @test_mask_pcmpeq_d(<16 x i32> %a, <16 x i32> %b, i16 %mask) {
608 ; CHECK-LABEL: test_mask_pcmpeq_d
609 ; CHECK: vpcmpeqd %zmm1, %zmm0, %k0 {%k1} ##
610   %res = call i16 @llvm.x86.avx512.mask.pcmpeq.d.512(<16 x i32> %a, <16 x i32> %b, i16 %mask)
611   ret i16 %res
612 }
613
614 declare i16 @llvm.x86.avx512.mask.pcmpeq.d.512(<16 x i32>, <16 x i32>, i16)
615
616 define i8 @test_pcmpeq_q(<8 x i64> %a, <8 x i64> %b) {
617 ; CHECK-LABEL: test_pcmpeq_q
618 ; CHECK: vpcmpeqq %zmm1, %zmm0, %k0 ##
619   %res = call i8 @llvm.x86.avx512.mask.pcmpeq.q.512(<8 x i64> %a, <8 x i64> %b, i8 -1)
620   ret i8 %res
621 }
622
623 define i8 @test_mask_pcmpeq_q(<8 x i64> %a, <8 x i64> %b, i8 %mask) {
624 ; CHECK-LABEL: test_mask_pcmpeq_q
625 ; CHECK: vpcmpeqq %zmm1, %zmm0, %k0 {%k1} ##
626   %res = call i8 @llvm.x86.avx512.mask.pcmpeq.q.512(<8 x i64> %a, <8 x i64> %b, i8 %mask)
627   ret i8 %res
628 }
629
630 declare i8 @llvm.x86.avx512.mask.pcmpeq.q.512(<8 x i64>, <8 x i64>, i8)
631
632 define i16 @test_pcmpgt_d(<16 x i32> %a, <16 x i32> %b) {
633 ; CHECK-LABEL: test_pcmpgt_d
634 ; CHECK: vpcmpgtd %zmm1, %zmm0, %k0 ##
635   %res = call i16 @llvm.x86.avx512.mask.pcmpgt.d.512(<16 x i32> %a, <16 x i32> %b, i16 -1)
636   ret i16 %res
637 }
638
639 define i16 @test_mask_pcmpgt_d(<16 x i32> %a, <16 x i32> %b, i16 %mask) {
640 ; CHECK-LABEL: test_mask_pcmpgt_d
641 ; CHECK: vpcmpgtd %zmm1, %zmm0, %k0 {%k1} ##
642   %res = call i16 @llvm.x86.avx512.mask.pcmpgt.d.512(<16 x i32> %a, <16 x i32> %b, i16 %mask)
643   ret i16 %res
644 }
645
646 declare i16 @llvm.x86.avx512.mask.pcmpgt.d.512(<16 x i32>, <16 x i32>, i16)
647
648 define i8 @test_pcmpgt_q(<8 x i64> %a, <8 x i64> %b) {
649 ; CHECK-LABEL: test_pcmpgt_q
650 ; CHECK: vpcmpgtq %zmm1, %zmm0, %k0 ##
651   %res = call i8 @llvm.x86.avx512.mask.pcmpgt.q.512(<8 x i64> %a, <8 x i64> %b, i8 -1)
652   ret i8 %res
653 }
654
655 define i8 @test_mask_pcmpgt_q(<8 x i64> %a, <8 x i64> %b, i8 %mask) {
656 ; CHECK-LABEL: test_mask_pcmpgt_q
657 ; CHECK: vpcmpgtq %zmm1, %zmm0, %k0 {%k1} ##
658   %res = call i8 @llvm.x86.avx512.mask.pcmpgt.q.512(<8 x i64> %a, <8 x i64> %b, i8 %mask)
659   ret i8 %res
660 }
661
662 declare i8 @llvm.x86.avx512.mask.pcmpgt.q.512(<8 x i64>, <8 x i64>, i8)
663
664 define <8 x i16> @test_cmp_d_512(<16 x i32> %a0, <16 x i32> %a1) {
665 ; CHECK_LABEL: test_cmp_d_512
666 ; CHECK: vpcmpeqd %zmm1, %zmm0, %k0 ##
667   %res0 = call i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 0, i16 -1)
668   %vec0 = insertelement <8 x i16> undef, i16 %res0, i32 0
669 ; CHECK: vpcmpltd %zmm1, %zmm0, %k0 ##
670   %res1 = call i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 1, i16 -1)
671   %vec1 = insertelement <8 x i16> %vec0, i16 %res1, i32 1
672 ; CHECK: vpcmpled %zmm1, %zmm0, %k0 ##
673   %res2 = call i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 2, i16 -1)
674   %vec2 = insertelement <8 x i16> %vec1, i16 %res2, i32 2
675 ; CHECK: vpcmpunordd %zmm1, %zmm0, %k0 ##
676   %res3 = call i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 3, i16 -1)
677   %vec3 = insertelement <8 x i16> %vec2, i16 %res3, i32 3
678 ; CHECK: vpcmpneqd %zmm1, %zmm0, %k0 ##
679   %res4 = call i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 4, i16 -1)
680   %vec4 = insertelement <8 x i16> %vec3, i16 %res4, i32 4
681 ; CHECK: vpcmpnltd %zmm1, %zmm0, %k0 ##
682   %res5 = call i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 5, i16 -1)
683   %vec5 = insertelement <8 x i16> %vec4, i16 %res5, i32 5
684 ; CHECK: vpcmpnled %zmm1, %zmm0, %k0 ##
685   %res6 = call i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 6, i16 -1)
686   %vec6 = insertelement <8 x i16> %vec5, i16 %res6, i32 6
687 ; CHECK: vpcmpordd %zmm1, %zmm0, %k0 ##
688   %res7 = call i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 7, i16 -1)
689   %vec7 = insertelement <8 x i16> %vec6, i16 %res7, i32 7
690   ret <8 x i16> %vec7
691 }
692
693 define <8 x i16> @test_mask_cmp_d_512(<16 x i32> %a0, <16 x i32> %a1, i16 %mask) {
694 ; CHECK_LABEL: test_mask_cmp_d_512
695 ; CHECK: vpcmpeqd %zmm1, %zmm0, %k0 {%k1} ##
696   %res0 = call i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 0, i16 %mask)
697   %vec0 = insertelement <8 x i16> undef, i16 %res0, i32 0
698 ; CHECK: vpcmpltd %zmm1, %zmm0, %k0 {%k1} ##
699   %res1 = call i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 1, i16 %mask)
700   %vec1 = insertelement <8 x i16> %vec0, i16 %res1, i32 1
701 ; CHECK: vpcmpled %zmm1, %zmm0, %k0 {%k1} ##
702   %res2 = call i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 2, i16 %mask)
703   %vec2 = insertelement <8 x i16> %vec1, i16 %res2, i32 2
704 ; CHECK: vpcmpunordd %zmm1, %zmm0, %k0 {%k1} ##
705   %res3 = call i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 3, i16 %mask)
706   %vec3 = insertelement <8 x i16> %vec2, i16 %res3, i32 3
707 ; CHECK: vpcmpneqd %zmm1, %zmm0, %k0 {%k1} ##
708   %res4 = call i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 4, i16 %mask)
709   %vec4 = insertelement <8 x i16> %vec3, i16 %res4, i32 4
710 ; CHECK: vpcmpnltd %zmm1, %zmm0, %k0 {%k1} ##
711   %res5 = call i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 5, i16 %mask)
712   %vec5 = insertelement <8 x i16> %vec4, i16 %res5, i32 5
713 ; CHECK: vpcmpnled %zmm1, %zmm0, %k0 {%k1} ##
714   %res6 = call i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 6, i16 %mask)
715   %vec6 = insertelement <8 x i16> %vec5, i16 %res6, i32 6
716 ; CHECK: vpcmpordd %zmm1, %zmm0, %k0 {%k1} ##
717   %res7 = call i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 7, i16 %mask)
718   %vec7 = insertelement <8 x i16> %vec6, i16 %res7, i32 7
719   ret <8 x i16> %vec7
720 }
721
722 declare i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32>, <16 x i32>, i32, i16) nounwind readnone
723
724 define <8 x i16> @test_ucmp_d_512(<16 x i32> %a0, <16 x i32> %a1) {
725 ; CHECK_LABEL: test_ucmp_d_512
726 ; CHECK: vpcmpequd %zmm1, %zmm0, %k0 ##
727   %res0 = call i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 0, i16 -1)
728   %vec0 = insertelement <8 x i16> undef, i16 %res0, i32 0
729 ; CHECK: vpcmpltud %zmm1, %zmm0, %k0 ##
730   %res1 = call i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 1, i16 -1)
731   %vec1 = insertelement <8 x i16> %vec0, i16 %res1, i32 1
732 ; CHECK: vpcmpleud %zmm1, %zmm0, %k0 ##
733   %res2 = call i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 2, i16 -1)
734   %vec2 = insertelement <8 x i16> %vec1, i16 %res2, i32 2
735 ; CHECK: vpcmpunordud %zmm1, %zmm0, %k0 ##
736   %res3 = call i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 3, i16 -1)
737   %vec3 = insertelement <8 x i16> %vec2, i16 %res3, i32 3
738 ; CHECK: vpcmpnequd %zmm1, %zmm0, %k0 ##
739   %res4 = call i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 4, i16 -1)
740   %vec4 = insertelement <8 x i16> %vec3, i16 %res4, i32 4
741 ; CHECK: vpcmpnltud %zmm1, %zmm0, %k0 ##
742   %res5 = call i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 5, i16 -1)
743   %vec5 = insertelement <8 x i16> %vec4, i16 %res5, i32 5
744 ; CHECK: vpcmpnleud %zmm1, %zmm0, %k0 ##
745   %res6 = call i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 6, i16 -1)
746   %vec6 = insertelement <8 x i16> %vec5, i16 %res6, i32 6
747 ; CHECK: vpcmpordud %zmm1, %zmm0, %k0 ##
748   %res7 = call i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 7, i16 -1)
749   %vec7 = insertelement <8 x i16> %vec6, i16 %res7, i32 7
750   ret <8 x i16> %vec7
751 }
752
753 define <8 x i16> @test_mask_ucmp_d_512(<16 x i32> %a0, <16 x i32> %a1, i16 %mask) {
754 ; CHECK_LABEL: test_mask_ucmp_d_512
755 ; CHECK: vpcmpequd %zmm1, %zmm0, %k0 {%k1} ##
756   %res0 = call i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 0, i16 %mask)
757   %vec0 = insertelement <8 x i16> undef, i16 %res0, i32 0
758 ; CHECK: vpcmpltud %zmm1, %zmm0, %k0 {%k1} ##
759   %res1 = call i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 1, i16 %mask)
760   %vec1 = insertelement <8 x i16> %vec0, i16 %res1, i32 1
761 ; CHECK: vpcmpleud %zmm1, %zmm0, %k0 {%k1} ##
762   %res2 = call i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 2, i16 %mask)
763   %vec2 = insertelement <8 x i16> %vec1, i16 %res2, i32 2
764 ; CHECK: vpcmpunordud %zmm1, %zmm0, %k0 {%k1} ##
765   %res3 = call i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 3, i16 %mask)
766   %vec3 = insertelement <8 x i16> %vec2, i16 %res3, i32 3
767 ; CHECK: vpcmpnequd %zmm1, %zmm0, %k0 {%k1} ##
768   %res4 = call i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 4, i16 %mask)
769   %vec4 = insertelement <8 x i16> %vec3, i16 %res4, i32 4
770 ; CHECK: vpcmpnltud %zmm1, %zmm0, %k0 {%k1} ##
771   %res5 = call i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 5, i16 %mask)
772   %vec5 = insertelement <8 x i16> %vec4, i16 %res5, i32 5
773 ; CHECK: vpcmpnleud %zmm1, %zmm0, %k0 {%k1} ##
774   %res6 = call i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 6, i16 %mask)
775   %vec6 = insertelement <8 x i16> %vec5, i16 %res6, i32 6
776 ; CHECK: vpcmpordud %zmm1, %zmm0, %k0 {%k1} ##
777   %res7 = call i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 7, i16 %mask)
778   %vec7 = insertelement <8 x i16> %vec6, i16 %res7, i32 7
779   ret <8 x i16> %vec7
780 }
781
782 declare i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32>, <16 x i32>, i32, i16) nounwind readnone
783
784 define <8 x i8> @test_cmp_q_512(<8 x i64> %a0, <8 x i64> %a1) {
785 ; CHECK_LABEL: test_cmp_q_512
786 ; CHECK: vpcmpeqq %zmm1, %zmm0, %k0 ##
787   %res0 = call i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 0, i8 -1)
788   %vec0 = insertelement <8 x i8> undef, i8 %res0, i32 0
789 ; CHECK: vpcmpltq %zmm1, %zmm0, %k0 ##
790   %res1 = call i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 1, i8 -1)
791   %vec1 = insertelement <8 x i8> %vec0, i8 %res1, i32 1
792 ; CHECK: vpcmpleq %zmm1, %zmm0, %k0 ##
793   %res2 = call i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 2, i8 -1)
794   %vec2 = insertelement <8 x i8> %vec1, i8 %res2, i32 2
795 ; CHECK: vpcmpunordq %zmm1, %zmm0, %k0 ##
796   %res3 = call i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 3, i8 -1)
797   %vec3 = insertelement <8 x i8> %vec2, i8 %res3, i32 3
798 ; CHECK: vpcmpneqq %zmm1, %zmm0, %k0 ##
799   %res4 = call i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 4, i8 -1)
800   %vec4 = insertelement <8 x i8> %vec3, i8 %res4, i32 4
801 ; CHECK: vpcmpnltq %zmm1, %zmm0, %k0 ##
802   %res5 = call i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 5, i8 -1)
803   %vec5 = insertelement <8 x i8> %vec4, i8 %res5, i32 5
804 ; CHECK: vpcmpnleq %zmm1, %zmm0, %k0 ##
805   %res6 = call i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 6, i8 -1)
806   %vec6 = insertelement <8 x i8> %vec5, i8 %res6, i32 6
807 ; CHECK: vpcmpordq %zmm1, %zmm0, %k0 ##
808   %res7 = call i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 7, i8 -1)
809   %vec7 = insertelement <8 x i8> %vec6, i8 %res7, i32 7
810   ret <8 x i8> %vec7
811 }
812
813 define <8 x i8> @test_mask_cmp_q_512(<8 x i64> %a0, <8 x i64> %a1, i8 %mask) {
814 ; CHECK_LABEL: test_mask_cmp_q_512
815 ; CHECK: vpcmpeqq %zmm1, %zmm0, %k0 {%k1} ##
816   %res0 = call i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 0, i8 %mask)
817   %vec0 = insertelement <8 x i8> undef, i8 %res0, i32 0
818 ; CHECK: vpcmpltq %zmm1, %zmm0, %k0 {%k1} ##
819   %res1 = call i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 1, i8 %mask)
820   %vec1 = insertelement <8 x i8> %vec0, i8 %res1, i32 1
821 ; CHECK: vpcmpleq %zmm1, %zmm0, %k0 {%k1} ##
822   %res2 = call i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 2, i8 %mask)
823   %vec2 = insertelement <8 x i8> %vec1, i8 %res2, i32 2
824 ; CHECK: vpcmpunordq %zmm1, %zmm0, %k0 {%k1} ##
825   %res3 = call i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 3, i8 %mask)
826   %vec3 = insertelement <8 x i8> %vec2, i8 %res3, i32 3
827 ; CHECK: vpcmpneqq %zmm1, %zmm0, %k0 {%k1} ##
828   %res4 = call i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 4, i8 %mask)
829   %vec4 = insertelement <8 x i8> %vec3, i8 %res4, i32 4
830 ; CHECK: vpcmpnltq %zmm1, %zmm0, %k0 {%k1} ##
831   %res5 = call i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 5, i8 %mask)
832   %vec5 = insertelement <8 x i8> %vec4, i8 %res5, i32 5
833 ; CHECK: vpcmpnleq %zmm1, %zmm0, %k0 {%k1} ##
834   %res6 = call i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 6, i8 %mask)
835   %vec6 = insertelement <8 x i8> %vec5, i8 %res6, i32 6
836 ; CHECK: vpcmpordq %zmm1, %zmm0, %k0 {%k1} ##
837   %res7 = call i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 7, i8 %mask)
838   %vec7 = insertelement <8 x i8> %vec6, i8 %res7, i32 7
839   ret <8 x i8> %vec7
840 }
841
842 declare i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64>, <8 x i64>, i32, i8) nounwind readnone
843
844 define <8 x i8> @test_ucmp_q_512(<8 x i64> %a0, <8 x i64> %a1) {
845 ; CHECK_LABEL: test_ucmp_q_512
846 ; CHECK: vpcmpequq %zmm1, %zmm0, %k0 ##
847   %res0 = call i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 0, i8 -1)
848   %vec0 = insertelement <8 x i8> undef, i8 %res0, i32 0
849 ; CHECK: vpcmpltuq %zmm1, %zmm0, %k0 ##
850   %res1 = call i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 1, i8 -1)
851   %vec1 = insertelement <8 x i8> %vec0, i8 %res1, i32 1
852 ; CHECK: vpcmpleuq %zmm1, %zmm0, %k0 ##
853   %res2 = call i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 2, i8 -1)
854   %vec2 = insertelement <8 x i8> %vec1, i8 %res2, i32 2
855 ; CHECK: vpcmpunorduq %zmm1, %zmm0, %k0 ##
856   %res3 = call i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 3, i8 -1)
857   %vec3 = insertelement <8 x i8> %vec2, i8 %res3, i32 3
858 ; CHECK: vpcmpnequq %zmm1, %zmm0, %k0 ##
859   %res4 = call i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 4, i8 -1)
860   %vec4 = insertelement <8 x i8> %vec3, i8 %res4, i32 4
861 ; CHECK: vpcmpnltuq %zmm1, %zmm0, %k0 ##
862   %res5 = call i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 5, i8 -1)
863   %vec5 = insertelement <8 x i8> %vec4, i8 %res5, i32 5
864 ; CHECK: vpcmpnleuq %zmm1, %zmm0, %k0 ##
865   %res6 = call i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 6, i8 -1)
866   %vec6 = insertelement <8 x i8> %vec5, i8 %res6, i32 6
867 ; CHECK: vpcmporduq %zmm1, %zmm0, %k0 ##
868   %res7 = call i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 7, i8 -1)
869   %vec7 = insertelement <8 x i8> %vec6, i8 %res7, i32 7
870   ret <8 x i8> %vec7
871 }
872
873 define <8 x i8> @test_mask_ucmp_q_512(<8 x i64> %a0, <8 x i64> %a1, i8 %mask) {
874 ; CHECK_LABEL: test_mask_ucmp_q_512
875 ; CHECK: vpcmpequq %zmm1, %zmm0, %k0 {%k1} ##
876   %res0 = call i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 0, i8 %mask)
877   %vec0 = insertelement <8 x i8> undef, i8 %res0, i32 0
878 ; CHECK: vpcmpltuq %zmm1, %zmm0, %k0 {%k1} ##
879   %res1 = call i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 1, i8 %mask)
880   %vec1 = insertelement <8 x i8> %vec0, i8 %res1, i32 1
881 ; CHECK: vpcmpleuq %zmm1, %zmm0, %k0 {%k1} ##
882   %res2 = call i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 2, i8 %mask)
883   %vec2 = insertelement <8 x i8> %vec1, i8 %res2, i32 2
884 ; CHECK: vpcmpunorduq %zmm1, %zmm0, %k0 {%k1} ##
885   %res3 = call i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 3, i8 %mask)
886   %vec3 = insertelement <8 x i8> %vec2, i8 %res3, i32 3
887 ; CHECK: vpcmpnequq %zmm1, %zmm0, %k0 {%k1} ##
888   %res4 = call i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 4, i8 %mask)
889   %vec4 = insertelement <8 x i8> %vec3, i8 %res4, i32 4
890 ; CHECK: vpcmpnltuq %zmm1, %zmm0, %k0 {%k1} ##
891   %res5 = call i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 5, i8 %mask)
892   %vec5 = insertelement <8 x i8> %vec4, i8 %res5, i32 5
893 ; CHECK: vpcmpnleuq %zmm1, %zmm0, %k0 {%k1} ##
894   %res6 = call i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 6, i8 %mask)
895   %vec6 = insertelement <8 x i8> %vec5, i8 %res6, i32 6
896 ; CHECK: vpcmporduq %zmm1, %zmm0, %k0 {%k1} ##
897   %res7 = call i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 7, i8 %mask)
898   %vec7 = insertelement <8 x i8> %vec6, i8 %res7, i32 7
899   ret <8 x i8> %vec7
900 }
901
902 declare i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64>, <8 x i64>, i32, i8) nounwind readnone
903
904 define <4 x float> @test_mask_vextractf32x4(<4 x float> %b, <16 x float> %a, i8 %mask) {
905 ; CHECK-LABEL: test_mask_vextractf32x4:
906 ; CHECK: vextractf32x4 $2, %zmm1, %xmm0 {%k1}
907   %res = call <4 x float> @llvm.x86.avx512.mask.vextractf32x4.512(<16 x float> %a, i8 2, <4 x float> %b, i8 %mask)
908   ret <4 x float> %res
909 }
910
911 declare <4 x float> @llvm.x86.avx512.mask.vextractf32x4.512(<16 x float>, i8, <4 x float>, i8)
912
913 define <4 x i64> @test_mask_vextracti64x4(<4 x i64> %b, <8 x i64> %a, i8 %mask) {
914 ; CHECK-LABEL: test_mask_vextracti64x4:
915 ; CHECK: vextracti64x4 $2, %zmm1, %ymm0 {%k1}
916   %res = call <4 x i64> @llvm.x86.avx512.mask.vextracti64x4.512(<8 x i64> %a, i8 2, <4 x i64> %b, i8 %mask)
917   ret <4 x i64> %res
918 }
919
920 declare <4 x i64> @llvm.x86.avx512.mask.vextracti64x4.512(<8 x i64>, i8, <4 x i64>, i8)
921
922 define <4 x i32> @test_maskz_vextracti32x4(<16 x i32> %a, i8 %mask) {
923 ; CHECK-LABEL: test_maskz_vextracti32x4:
924 ; CHECK: vextracti32x4 $2, %zmm0, %xmm0 {%k1} {z}
925   %res = call <4 x i32> @llvm.x86.avx512.mask.vextracti32x4.512(<16 x i32> %a, i8 2, <4 x i32> zeroinitializer, i8 %mask)
926   ret <4 x i32> %res
927 }
928
929 declare <4 x i32> @llvm.x86.avx512.mask.vextracti32x4.512(<16 x i32>, i8, <4 x i32>, i8)
930
931 define <4 x double> @test_vextractf64x4(<8 x double> %a) {
932 ; CHECK-LABEL: test_vextractf64x4:
933 ; CHECK: vextractf64x4 $2, %zmm0, %ymm0 ##
934   %res = call <4 x double> @llvm.x86.avx512.mask.vextractf64x4.512(<8 x double> %a, i8 2, <4 x double> zeroinitializer, i8 -1)
935   ret <4 x double> %res
936 }
937
938 declare <4 x double> @llvm.x86.avx512.mask.vextractf64x4.512(<8 x double>, i8, <4 x double>, i8)
939
940 define <16 x i32> @test_x86_avx512_pslli_d(<16 x i32> %a0) {
941   ; CHECK-LABEL: test_x86_avx512_pslli_d
942   ; CHECK: vpslld
943   %res = call <16 x i32> @llvm.x86.avx512.mask.pslli.d(<16 x i32> %a0, i32 7, <16 x i32> zeroinitializer, i16 -1)
944   ret <16 x i32> %res
945 }
946
947 define <16 x i32> @test_x86_avx512_mask_pslli_d(<16 x i32> %a0, <16 x i32> %a1, i16 %mask) {
948   ; CHECK-LABEL: test_x86_avx512_mask_pslli_d
949   ; CHECK: vpslld $7, %zmm0, %zmm1 {%k1}
950   %res = call <16 x i32> @llvm.x86.avx512.mask.pslli.d(<16 x i32> %a0, i32 7, <16 x i32> %a1, i16 %mask)
951   ret <16 x i32> %res
952 }
953
954 define <16 x i32> @test_x86_avx512_maskz_pslli_d(<16 x i32> %a0, i16 %mask) {
955   ; CHECK-LABEL: test_x86_avx512_maskz_pslli_d
956   ; CHECK: vpslld $7, %zmm0, %zmm0 {%k1} {z}
957   %res = call <16 x i32> @llvm.x86.avx512.mask.pslli.d(<16 x i32> %a0, i32 7, <16 x i32> zeroinitializer, i16 %mask)
958   ret <16 x i32> %res
959 }
960
961 declare <16 x i32> @llvm.x86.avx512.mask.pslli.d(<16 x i32>, i32, <16 x i32>, i16) nounwind readnone
962
963 define <8 x i64> @test_x86_avx512_pslli_q(<8 x i64> %a0) {
964   ; CHECK-LABEL: test_x86_avx512_pslli_q
965   ; CHECK: vpsllq
966   %res = call <8 x i64> @llvm.x86.avx512.mask.pslli.q(<8 x i64> %a0, i32 7, <8 x i64> zeroinitializer, i8 -1)
967   ret <8 x i64> %res
968 }
969
970 define <8 x i64> @test_x86_avx512_mask_pslli_q(<8 x i64> %a0, <8 x i64> %a1, i8 %mask) {
971   ; CHECK-LABEL: test_x86_avx512_mask_pslli_q
972   ; CHECK: vpsllq $7, %zmm0, %zmm1 {%k1}
973   %res = call <8 x i64> @llvm.x86.avx512.mask.pslli.q(<8 x i64> %a0, i32 7, <8 x i64> %a1, i8 %mask)
974   ret <8 x i64> %res
975 }
976
977 define <8 x i64> @test_x86_avx512_maskz_pslli_q(<8 x i64> %a0, i8 %mask) {
978   ; CHECK-LABEL: test_x86_avx512_maskz_pslli_q
979   ; CHECK: vpsllq $7, %zmm0, %zmm0 {%k1} {z}
980   %res = call <8 x i64> @llvm.x86.avx512.mask.pslli.q(<8 x i64> %a0, i32 7, <8 x i64> zeroinitializer, i8 %mask)
981   ret <8 x i64> %res
982 }
983
984 declare <8 x i64> @llvm.x86.avx512.mask.pslli.q(<8 x i64>, i32, <8 x i64>, i8) nounwind readnone
985
986 define <16 x i32> @test_x86_avx512_psrli_d(<16 x i32> %a0) {
987   ; CHECK-LABEL: test_x86_avx512_psrli_d
988   ; CHECK: vpsrld
989   %res = call <16 x i32> @llvm.x86.avx512.mask.psrli.d(<16 x i32> %a0, i32 7, <16 x i32> zeroinitializer, i16 -1)
990   ret <16 x i32> %res
991 }
992
993 define <16 x i32> @test_x86_avx512_mask_psrli_d(<16 x i32> %a0, <16 x i32> %a1, i16 %mask) {
994   ; CHECK-LABEL: test_x86_avx512_mask_psrli_d
995   ; CHECK: vpsrld $7, %zmm0, %zmm1 {%k1}
996   %res = call <16 x i32> @llvm.x86.avx512.mask.psrli.d(<16 x i32> %a0, i32 7, <16 x i32> %a1, i16 %mask)
997   ret <16 x i32> %res
998 }
999
1000 define <16 x i32> @test_x86_avx512_maskz_psrli_d(<16 x i32> %a0, i16 %mask) {
1001   ; CHECK-LABEL: test_x86_avx512_maskz_psrli_d
1002   ; CHECK: vpsrld $7, %zmm0, %zmm0 {%k1} {z}
1003   %res = call <16 x i32> @llvm.x86.avx512.mask.psrli.d(<16 x i32> %a0, i32 7, <16 x i32> zeroinitializer, i16 %mask)
1004   ret <16 x i32> %res
1005 }
1006
1007 declare <16 x i32> @llvm.x86.avx512.mask.psrli.d(<16 x i32>, i32, <16 x i32>, i16) nounwind readnone
1008
1009 define <8 x i64> @test_x86_avx512_psrli_q(<8 x i64> %a0) {
1010   ; CHECK-LABEL: test_x86_avx512_psrli_q
1011   ; CHECK: vpsrlq
1012   %res = call <8 x i64> @llvm.x86.avx512.mask.psrli.q(<8 x i64> %a0, i32 7, <8 x i64> zeroinitializer, i8 -1)
1013   ret <8 x i64> %res
1014 }
1015
1016 define <8 x i64> @test_x86_avx512_mask_psrli_q(<8 x i64> %a0, <8 x i64> %a1, i8 %mask) {
1017   ; CHECK-LABEL: test_x86_avx512_mask_psrli_q
1018   ; CHECK: vpsrlq $7, %zmm0, %zmm1 {%k1}
1019   %res = call <8 x i64> @llvm.x86.avx512.mask.psrli.q(<8 x i64> %a0, i32 7, <8 x i64> %a1, i8 %mask)
1020   ret <8 x i64> %res
1021 }
1022
1023 define <8 x i64> @test_x86_avx512_maskz_psrli_q(<8 x i64> %a0, i8 %mask) {
1024   ; CHECK-LABEL: test_x86_avx512_maskz_psrli_q
1025   ; CHECK: vpsrlq $7, %zmm0, %zmm0 {%k1} {z}
1026   %res = call <8 x i64> @llvm.x86.avx512.mask.psrli.q(<8 x i64> %a0, i32 7, <8 x i64> zeroinitializer, i8 %mask)
1027   ret <8 x i64> %res
1028 }
1029
1030 declare <8 x i64> @llvm.x86.avx512.mask.psrli.q(<8 x i64>, i32, <8 x i64>, i8) nounwind readnone
1031
1032 define <16 x i32> @test_x86_avx512_psrai_d(<16 x i32> %a0) {
1033   ; CHECK-LABEL: test_x86_avx512_psrai_d
1034   ; CHECK: vpsrad
1035   %res = call <16 x i32> @llvm.x86.avx512.mask.psrai.d(<16 x i32> %a0, i32 7, <16 x i32> zeroinitializer, i16 -1)
1036   ret <16 x i32> %res
1037 }
1038
1039 define <16 x i32> @test_x86_avx512_mask_psrai_d(<16 x i32> %a0, <16 x i32> %a1, i16 %mask) {
1040   ; CHECK-LABEL: test_x86_avx512_mask_psrai_d
1041   ; CHECK: vpsrad $7, %zmm0, %zmm1 {%k1}
1042   %res = call <16 x i32> @llvm.x86.avx512.mask.psrai.d(<16 x i32> %a0, i32 7, <16 x i32> %a1, i16 %mask)
1043   ret <16 x i32> %res
1044 }
1045
1046 define <16 x i32> @test_x86_avx512_maskz_psrai_d(<16 x i32> %a0, i16 %mask) {
1047   ; CHECK-LABEL: test_x86_avx512_maskz_psrai_d
1048   ; CHECK: vpsrad $7, %zmm0, %zmm0 {%k1} {z}
1049   %res = call <16 x i32> @llvm.x86.avx512.mask.psrai.d(<16 x i32> %a0, i32 7, <16 x i32> zeroinitializer, i16 %mask)
1050   ret <16 x i32> %res
1051 }
1052
1053 declare <16 x i32> @llvm.x86.avx512.mask.psrai.d(<16 x i32>, i32, <16 x i32>, i16) nounwind readnone
1054
1055 define <8 x i64> @test_x86_avx512_psrai_q(<8 x i64> %a0) {
1056   ; CHECK-LABEL: test_x86_avx512_psrai_q
1057   ; CHECK: vpsraq
1058   %res = call <8 x i64> @llvm.x86.avx512.mask.psrai.q(<8 x i64> %a0, i32 7, <8 x i64> zeroinitializer, i8 -1)
1059   ret <8 x i64> %res
1060 }
1061
1062 define <8 x i64> @test_x86_avx512_mask_psrai_q(<8 x i64> %a0, <8 x i64> %a1, i8 %mask) {
1063   ; CHECK-LABEL: test_x86_avx512_mask_psrai_q
1064   ; CHECK: vpsraq $7, %zmm0, %zmm1 {%k1}
1065   %res = call <8 x i64> @llvm.x86.avx512.mask.psrai.q(<8 x i64> %a0, i32 7, <8 x i64> %a1, i8 %mask)
1066   ret <8 x i64> %res
1067 }
1068
1069 define <8 x i64> @test_x86_avx512_maskz_psrai_q(<8 x i64> %a0, i8 %mask) {
1070   ; CHECK-LABEL: test_x86_avx512_maskz_psrai_q
1071   ; CHECK: vpsraq $7, %zmm0, %zmm0 {%k1} {z}
1072   %res = call <8 x i64> @llvm.x86.avx512.mask.psrai.q(<8 x i64> %a0, i32 7, <8 x i64> zeroinitializer, i8 %mask)
1073   ret <8 x i64> %res
1074 }
1075
1076 declare <8 x i64> @llvm.x86.avx512.mask.psrai.q(<8 x i64>, i32, <8 x i64>, i8) nounwind readnone
1077
1078 define <16 x i32> @test_x86_avx512_psll_d(<16 x i32> %a0, <4 x i32> %a1) {
1079   ; CHECK-LABEL: test_x86_avx512_psll_d
1080   ; CHECK: vpslld
1081   %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)
1082   ret <16 x i32> %res
1083 }
1084
1085 define <16 x i32> @test_x86_avx512_mask_psll_d(<16 x i32> %a0, <4 x i32> %a1, <16 x i32> %a2, i16 %mask) {
1086   ; CHECK-LABEL: test_x86_avx512_mask_psll_d
1087   ; CHECK: vpslld %xmm1, %zmm0, %zmm2 {%k1}
1088   %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)
1089   ret <16 x i32> %res
1090 }
1091
1092 define <16 x i32> @test_x86_avx512_maskz_psll_d(<16 x i32> %a0, <4 x i32> %a1, i16 %mask) {
1093   ; CHECK-LABEL: test_x86_avx512_maskz_psll_d
1094   ; CHECK: vpslld %xmm1, %zmm0, %zmm0 {%k1} {z}
1095   %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)
1096   ret <16 x i32> %res
1097 }
1098
1099 declare <16 x i32> @llvm.x86.avx512.mask.psll.d(<16 x i32>, <4 x i32>, <16 x i32>, i16) nounwind readnone
1100
1101 define <8 x i64> @test_x86_avx512_psll_q(<8 x i64> %a0, <2 x i64> %a1) {
1102   ; CHECK-LABEL: test_x86_avx512_psll_q
1103   ; CHECK: vpsllq
1104   %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)
1105   ret <8 x i64> %res
1106 }
1107
1108 define <8 x i64> @test_x86_avx512_mask_psll_q(<8 x i64> %a0, <2 x i64> %a1, <8 x i64> %a2, i8 %mask) {
1109   ; CHECK-LABEL: test_x86_avx512_mask_psll_q
1110   ; CHECK: vpsllq %xmm1, %zmm0, %zmm2 {%k1}
1111   %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)
1112   ret <8 x i64> %res
1113 }
1114
1115 define <8 x i64> @test_x86_avx512_maskz_psll_q(<8 x i64> %a0, <2 x i64> %a1, i8 %mask) {
1116   ; CHECK-LABEL: test_x86_avx512_maskz_psll_q
1117   ; CHECK: vpsllq %xmm1, %zmm0, %zmm0 {%k1} {z}
1118   %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)
1119   ret <8 x i64> %res
1120 }
1121
1122 declare <8 x i64> @llvm.x86.avx512.mask.psll.q(<8 x i64>, <2 x i64>, <8 x i64>, i8) nounwind readnone
1123
1124 define <16 x i32> @test_x86_avx512_psrl_d(<16 x i32> %a0, <4 x i32> %a1) {
1125   ; CHECK-LABEL: test_x86_avx512_psrl_d
1126   ; CHECK: vpsrld
1127   %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)
1128   ret <16 x i32> %res
1129 }
1130
1131 define <16 x i32> @test_x86_avx512_mask_psrl_d(<16 x i32> %a0, <4 x i32> %a1, <16 x i32> %a2, i16 %mask) {
1132   ; CHECK-LABEL: test_x86_avx512_mask_psrl_d
1133   ; CHECK: vpsrld %xmm1, %zmm0, %zmm2 {%k1}
1134   %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)
1135   ret <16 x i32> %res
1136 }
1137
1138 define <16 x i32> @test_x86_avx512_maskz_psrl_d(<16 x i32> %a0, <4 x i32> %a1, i16 %mask) {
1139   ; CHECK-LABEL: test_x86_avx512_maskz_psrl_d
1140   ; CHECK: vpsrld %xmm1, %zmm0, %zmm0 {%k1} {z}
1141   %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)
1142   ret <16 x i32> %res
1143 }
1144
1145 declare <16 x i32> @llvm.x86.avx512.mask.psrl.d(<16 x i32>, <4 x i32>, <16 x i32>, i16) nounwind readnone
1146
1147 define <8 x i64> @test_x86_avx512_psrl_q(<8 x i64> %a0, <2 x i64> %a1) {
1148   ; CHECK-LABEL: test_x86_avx512_psrl_q
1149   ; CHECK: vpsrlq
1150   %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)
1151   ret <8 x i64> %res
1152 }
1153
1154 define <8 x i64> @test_x86_avx512_mask_psrl_q(<8 x i64> %a0, <2 x i64> %a1, <8 x i64> %a2, i8 %mask) {
1155   ; CHECK-LABEL: test_x86_avx512_mask_psrl_q
1156   ; CHECK: vpsrlq %xmm1, %zmm0, %zmm2 {%k1}
1157   %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)
1158   ret <8 x i64> %res
1159 }
1160
1161 define <8 x i64> @test_x86_avx512_maskz_psrl_q(<8 x i64> %a0, <2 x i64> %a1, i8 %mask) {
1162   ; CHECK-LABEL: test_x86_avx512_maskz_psrl_q
1163   ; CHECK: vpsrlq %xmm1, %zmm0, %zmm0 {%k1} {z}
1164   %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)
1165   ret <8 x i64> %res
1166 }
1167
1168 declare <8 x i64> @llvm.x86.avx512.mask.psrl.q(<8 x i64>, <2 x i64>, <8 x i64>, i8) nounwind readnone
1169
1170 define <16 x i32> @test_x86_avx512_psra_d(<16 x i32> %a0, <4 x i32> %a1) {
1171   ; CHECK-LABEL: test_x86_avx512_psra_d
1172   ; CHECK: vpsrad
1173   %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)
1174   ret <16 x i32> %res
1175 }
1176
1177 define <16 x i32> @test_x86_avx512_mask_psra_d(<16 x i32> %a0, <4 x i32> %a1, <16 x i32> %a2, i16 %mask) {
1178   ; CHECK-LABEL: test_x86_avx512_mask_psra_d
1179   ; CHECK: vpsrad %xmm1, %zmm0, %zmm2 {%k1}
1180   %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)
1181   ret <16 x i32> %res
1182 }
1183
1184 define <16 x i32> @test_x86_avx512_maskz_psra_d(<16 x i32> %a0, <4 x i32> %a1, i16 %mask) {
1185   ; CHECK-LABEL: test_x86_avx512_maskz_psra_d
1186   ; CHECK: vpsrad %xmm1, %zmm0, %zmm0 {%k1} {z}
1187   %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)
1188   ret <16 x i32> %res
1189 }
1190
1191 declare <16 x i32> @llvm.x86.avx512.mask.psra.d(<16 x i32>, <4 x i32>, <16 x i32>, i16) nounwind readnone
1192
1193 define <8 x i64> @test_x86_avx512_psra_q(<8 x i64> %a0, <2 x i64> %a1) {
1194   ; CHECK-LABEL: test_x86_avx512_psra_q
1195   ; CHECK: vpsraq
1196   %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)
1197   ret <8 x i64> %res
1198 }
1199
1200 define <8 x i64> @test_x86_avx512_mask_psra_q(<8 x i64> %a0, <2 x i64> %a1, <8 x i64> %a2, i8 %mask) {
1201   ; CHECK-LABEL: test_x86_avx512_mask_psra_q
1202   ; CHECK: vpsraq %xmm1, %zmm0, %zmm2 {%k1}
1203   %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)
1204   ret <8 x i64> %res
1205 }
1206
1207 define <8 x i64> @test_x86_avx512_maskz_psra_q(<8 x i64> %a0, <2 x i64> %a1, i8 %mask) {
1208   ; CHECK-LABEL: test_x86_avx512_maskz_psra_q
1209   ; CHECK: vpsraq %xmm1, %zmm0, %zmm0 {%k1} {z}
1210   %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)
1211   ret <8 x i64> %res
1212 }
1213
1214 declare <8 x i64> @llvm.x86.avx512.mask.psra.q(<8 x i64>, <2 x i64>, <8 x i64>, i8) nounwind readnone
1215
1216 define <16 x i32> @test_x86_avx512_psllv_d(<16 x i32> %a0, <16 x i32> %a1) {
1217   ; CHECK-LABEL: test_x86_avx512_psllv_d
1218   ; CHECK: vpsllvd
1219   %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)
1220   ret <16 x i32> %res
1221 }
1222
1223 define <16 x i32> @test_x86_avx512_mask_psllv_d(<16 x i32> %a0, <16 x i32> %a1, <16 x i32> %a2, i16 %mask) {
1224   ; CHECK-LABEL: test_x86_avx512_mask_psllv_d
1225   ; CHECK: vpsllvd %zmm1, %zmm0, %zmm2 {%k1}
1226   %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)
1227   ret <16 x i32> %res
1228 }
1229
1230 define <16 x i32> @test_x86_avx512_maskz_psllv_d(<16 x i32> %a0, <16 x i32> %a1, i16 %mask) {
1231   ; CHECK-LABEL: test_x86_avx512_maskz_psllv_d
1232   ; CHECK: vpsllvd %zmm1, %zmm0, %zmm0 {%k1} {z}
1233   %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)
1234   ret <16 x i32> %res
1235 }
1236
1237 declare <16 x i32> @llvm.x86.avx512.mask.psllv.d(<16 x i32>, <16 x i32>, <16 x i32>, i16) nounwind readnone
1238
1239 define <8 x i64> @test_x86_avx512_psllv_q(<8 x i64> %a0, <8 x i64> %a1) {
1240   ; CHECK-LABEL: test_x86_avx512_psllv_q
1241   ; CHECK: vpsllvq
1242   %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)
1243   ret <8 x i64> %res
1244 }
1245
1246 define <8 x i64> @test_x86_avx512_mask_psllv_q(<8 x i64> %a0, <8 x i64> %a1, <8 x i64> %a2, i8 %mask) {
1247   ; CHECK-LABEL: test_x86_avx512_mask_psllv_q
1248   ; CHECK: vpsllvq %zmm1, %zmm0, %zmm2 {%k1}
1249   %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)
1250   ret <8 x i64> %res
1251 }
1252
1253 define <8 x i64> @test_x86_avx512_maskz_psllv_q(<8 x i64> %a0, <8 x i64> %a1, i8 %mask) {
1254   ; CHECK-LABEL: test_x86_avx512_maskz_psllv_q
1255   ; CHECK: vpsllvq %zmm1, %zmm0, %zmm0 {%k1} {z}
1256   %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)
1257   ret <8 x i64> %res
1258 }
1259
1260 declare <8 x i64> @llvm.x86.avx512.mask.psllv.q(<8 x i64>, <8 x i64>, <8 x i64>, i8) nounwind readnone
1261
1262
1263 define <16 x i32> @test_x86_avx512_psrav_d(<16 x i32> %a0, <16 x i32> %a1) {
1264   ; CHECK-LABEL: test_x86_avx512_psrav_d
1265   ; CHECK: vpsravd
1266   %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)
1267   ret <16 x i32> %res
1268 }
1269
1270 define <16 x i32> @test_x86_avx512_mask_psrav_d(<16 x i32> %a0, <16 x i32> %a1, <16 x i32> %a2, i16 %mask) {
1271   ; CHECK-LABEL: test_x86_avx512_mask_psrav_d
1272   ; CHECK: vpsravd %zmm1, %zmm0, %zmm2 {%k1}
1273   %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)
1274   ret <16 x i32> %res
1275 }
1276
1277 define <16 x i32> @test_x86_avx512_maskz_psrav_d(<16 x i32> %a0, <16 x i32> %a1, i16 %mask) {
1278   ; CHECK-LABEL: test_x86_avx512_maskz_psrav_d
1279   ; CHECK: vpsravd %zmm1, %zmm0, %zmm0 {%k1} {z}
1280   %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)
1281   ret <16 x i32> %res
1282 }
1283
1284 declare <16 x i32> @llvm.x86.avx512.mask.psrav.d(<16 x i32>, <16 x i32>, <16 x i32>, i16) nounwind readnone
1285
1286 define <8 x i64> @test_x86_avx512_psrav_q(<8 x i64> %a0, <8 x i64> %a1) {
1287   ; CHECK-LABEL: test_x86_avx512_psrav_q
1288   ; CHECK: vpsravq
1289   %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)
1290   ret <8 x i64> %res
1291 }
1292
1293 define <8 x i64> @test_x86_avx512_mask_psrav_q(<8 x i64> %a0, <8 x i64> %a1, <8 x i64> %a2, i8 %mask) {
1294   ; CHECK-LABEL: test_x86_avx512_mask_psrav_q
1295   ; CHECK: vpsravq %zmm1, %zmm0, %zmm2 {%k1}
1296   %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)
1297   ret <8 x i64> %res
1298 }
1299
1300 define <8 x i64> @test_x86_avx512_maskz_psrav_q(<8 x i64> %a0, <8 x i64> %a1, i8 %mask) {
1301   ; CHECK-LABEL: test_x86_avx512_maskz_psrav_q
1302   ; CHECK: vpsravq %zmm1, %zmm0, %zmm0 {%k1} {z}
1303   %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)
1304   ret <8 x i64> %res
1305 }
1306
1307 declare <8 x i64> @llvm.x86.avx512.mask.psrav.q(<8 x i64>, <8 x i64>, <8 x i64>, i8) nounwind readnone
1308
1309 define <16 x i32> @test_x86_avx512_psrlv_d(<16 x i32> %a0, <16 x i32> %a1) {
1310   ; CHECK-LABEL: test_x86_avx512_psrlv_d
1311   ; CHECK: vpsrlvd
1312   %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)
1313   ret <16 x i32> %res
1314 }
1315
1316 define <16 x i32> @test_x86_avx512_mask_psrlv_d(<16 x i32> %a0, <16 x i32> %a1, <16 x i32> %a2, i16 %mask) {
1317   ; CHECK-LABEL: test_x86_avx512_mask_psrlv_d
1318   ; CHECK: vpsrlvd %zmm1, %zmm0, %zmm2 {%k1}
1319   %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)
1320   ret <16 x i32> %res
1321 }
1322
1323 define <16 x i32> @test_x86_avx512_maskz_psrlv_d(<16 x i32> %a0, <16 x i32> %a1, i16 %mask) {
1324   ; CHECK-LABEL: test_x86_avx512_maskz_psrlv_d
1325   ; CHECK: vpsrlvd %zmm1, %zmm0, %zmm0 {%k1} {z}
1326   %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)
1327   ret <16 x i32> %res
1328 }
1329
1330 declare <16 x i32> @llvm.x86.avx512.mask.psrlv.d(<16 x i32>, <16 x i32>, <16 x i32>, i16) nounwind readnone
1331
1332 define <8 x i64> @test_x86_avx512_psrlv_q(<8 x i64> %a0, <8 x i64> %a1) {
1333   ; CHECK-LABEL: test_x86_avx512_psrlv_q
1334   ; CHECK: vpsrlvq
1335   %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)
1336   ret <8 x i64> %res
1337 }
1338
1339 define <8 x i64> @test_x86_avx512_mask_psrlv_q(<8 x i64> %a0, <8 x i64> %a1, <8 x i64> %a2, i8 %mask) {
1340   ; CHECK-LABEL: test_x86_avx512_mask_psrlv_q
1341   ; CHECK: vpsrlvq %zmm1, %zmm0, %zmm2 {%k1}
1342   %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)
1343   ret <8 x i64> %res
1344 }
1345
1346 define <8 x i64> @test_x86_avx512_maskz_psrlv_q(<8 x i64> %a0, <8 x i64> %a1, i8 %mask) {
1347   ; CHECK-LABEL: test_x86_avx512_maskz_psrlv_q
1348   ; CHECK: vpsrlvq %zmm1, %zmm0, %zmm0 {%k1} {z}
1349   %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)
1350   ret <8 x i64> %res
1351 }
1352
1353 declare <8 x i64> @llvm.x86.avx512.mask.psrlv.q(<8 x i64>, <8 x i64>, <8 x i64>, i8) nounwind readnone
1354
1355 define <8 x i64> @test_x86_avx512_psrlv_q_memop(<8 x i64> %a0, <8 x i64>* %ptr) {
1356   ; CHECK-LABEL: test_x86_avx512_psrlv_q_memop
1357   ; CHECK: vpsrlvq (%
1358   %b = load <8 x i64>, <8 x i64>* %ptr
1359   %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)
1360   ret <8 x i64> %res
1361 }
1362
1363 declare <16 x float> @llvm.x86.avx512.mask.sub.ps.512(<16 x float>, <16 x float>, <16 x float>, i16, i32)
1364 declare <16 x float> @llvm.x86.avx512.mask.mul.ps.512(<16 x float>, <16 x float>, <16 x float>, i16, i32)
1365 declare <8 x double> @llvm.x86.avx512.mask.mul.pd.512(<8 x double>, <8 x double>, <8 x double>, i8, i32)
1366
1367 define <16 x float> @test_vsubps_rn(<16 x float> %a0, <16 x float> %a1) {
1368   ; CHECK-LABEL: test_vsubps_rn
1369   ; CHECK: vsubps {rn-sae}{{.*}} ## encoding: [0x62,0xf1,0x7c,0x18,0x5c,0xc1]
1370   %res = call <16 x float> @llvm.x86.avx512.mask.sub.ps.512(<16 x float> %a0, <16 x float> %a1,
1371                     <16 x float> zeroinitializer, i16 -1, i32 0)
1372   ret <16 x float> %res
1373 }
1374
1375 define <16 x float> @test_vsubps_rd(<16 x float> %a0, <16 x float> %a1) {
1376   ; CHECK-LABEL: test_vsubps_rd
1377   ; CHECK: vsubps {rd-sae}{{.*}} ## encoding: [0x62,0xf1,0x7c,0x38,0x5c,0xc1]
1378   %res = call <16 x float> @llvm.x86.avx512.mask.sub.ps.512(<16 x float> %a0, <16 x float> %a1,
1379                     <16 x float> zeroinitializer, i16 -1, i32 1)
1380   ret <16 x float> %res
1381 }
1382
1383 define <16 x float> @test_vsubps_ru(<16 x float> %a0, <16 x float> %a1) {
1384   ; CHECK-LABEL: test_vsubps_ru
1385   ; CHECK: vsubps {ru-sae}{{.*}} ## encoding: [0x62,0xf1,0x7c,0x58,0x5c,0xc1]
1386   %res = call <16 x float> @llvm.x86.avx512.mask.sub.ps.512(<16 x float> %a0, <16 x float> %a1,
1387                     <16 x float> zeroinitializer, i16 -1, i32 2)
1388   ret <16 x float> %res
1389 }
1390
1391 define <16 x float> @test_vsubps_rz(<16 x float> %a0, <16 x float> %a1) {
1392   ; CHECK-LABEL: test_vsubps_rz
1393   ; CHECK: vsubps {rz-sae}{{.*}} ## encoding: [0x62,0xf1,0x7c,0x78,0x5c,0xc1]
1394   %res = call <16 x float> @llvm.x86.avx512.mask.sub.ps.512(<16 x float> %a0, <16 x float> %a1,
1395                     <16 x float> zeroinitializer, i16 -1, i32 3)
1396   ret <16 x float> %res
1397 }
1398
1399 define <16 x float> @test_vmulps_rn(<16 x float> %a0, <16 x float> %a1) {
1400   ; CHECK-LABEL: test_vmulps_rn
1401   ; CHECK: vmulps {rn-sae}{{.*}} ## encoding: [0x62,0xf1,0x7c,0x18,0x59,0xc1]
1402   %res = call <16 x float> @llvm.x86.avx512.mask.mul.ps.512(<16 x float> %a0, <16 x float> %a1,
1403                     <16 x float> zeroinitializer, i16 -1, i32 0)
1404   ret <16 x float> %res
1405 }
1406
1407 define <16 x float> @test_vmulps_rd(<16 x float> %a0, <16 x float> %a1) {
1408   ; CHECK-LABEL: test_vmulps_rd
1409   ; CHECK: vmulps {rd-sae}{{.*}} ## encoding: [0x62,0xf1,0x7c,0x38,0x59,0xc1]
1410   %res = call <16 x float> @llvm.x86.avx512.mask.mul.ps.512(<16 x float> %a0, <16 x float> %a1,
1411                     <16 x float> zeroinitializer, i16 -1, i32 1)
1412   ret <16 x float> %res
1413 }
1414
1415 define <16 x float> @test_vmulps_ru(<16 x float> %a0, <16 x float> %a1) {
1416   ; CHECK-LABEL: test_vmulps_ru
1417   ; CHECK: vmulps {ru-sae}{{.*}} ## encoding: [0x62,0xf1,0x7c,0x58,0x59,0xc1]
1418   %res = call <16 x float> @llvm.x86.avx512.mask.mul.ps.512(<16 x float> %a0, <16 x float> %a1,
1419                     <16 x float> zeroinitializer, i16 -1, i32 2)
1420   ret <16 x float> %res
1421 }
1422
1423 define <16 x float> @test_vmulps_rz(<16 x float> %a0, <16 x float> %a1) {
1424   ; CHECK-LABEL: test_vmulps_rz
1425   ; CHECK: vmulps {rz-sae}{{.*}} ## encoding: [0x62,0xf1,0x7c,0x78,0x59,0xc1]
1426   %res = call <16 x float> @llvm.x86.avx512.mask.mul.ps.512(<16 x float> %a0, <16 x float> %a1,
1427                     <16 x float> zeroinitializer, i16 -1, i32 3)
1428   ret <16 x float> %res
1429 }
1430
1431 ;; mask float
1432 define <16 x float> @test_vmulps_mask_rn(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
1433   ; CHECK-LABEL: test_vmulps_mask_rn
1434   ; CHECK: vmulps {rn-sae}{{.*}}{%k1} {z} ## encoding: [0x62,0xf1,0x7c,0x99,0x59,0xc1]
1435   %res = call <16 x float> @llvm.x86.avx512.mask.mul.ps.512(<16 x float> %a0, <16 x float> %a1,
1436                     <16 x float> zeroinitializer, i16 %mask, i32 0)
1437   ret <16 x float> %res
1438 }
1439
1440 define <16 x float> @test_vmulps_mask_rd(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
1441   ; CHECK-LABEL: test_vmulps_mask_rd
1442   ; CHECK: vmulps {rd-sae}{{.*}}{%k1} {z} ## encoding: [0x62,0xf1,0x7c,0xb9,0x59,0xc1]
1443   %res = call <16 x float> @llvm.x86.avx512.mask.mul.ps.512(<16 x float> %a0, <16 x float> %a1,
1444                     <16 x float> zeroinitializer, i16 %mask, i32 1)
1445   ret <16 x float> %res
1446 }
1447
1448 define <16 x float> @test_vmulps_mask_ru(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
1449   ; CHECK-LABEL: test_vmulps_mask_ru
1450   ; CHECK: vmulps {ru-sae}{{.*}}{%k1} {z} ## encoding: [0x62,0xf1,0x7c,0xd9,0x59,0xc1]
1451   %res = call <16 x float> @llvm.x86.avx512.mask.mul.ps.512(<16 x float> %a0, <16 x float> %a1,
1452                     <16 x float> zeroinitializer, i16 %mask, i32 2)
1453   ret <16 x float> %res
1454 }
1455
1456 define <16 x float> @test_vmulps_mask_rz(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
1457   ; CHECK-LABEL: test_vmulps_mask_rz
1458   ; CHECK: vmulps {rz-sae}{{.*}}{%k1} {z} ## encoding: [0x62,0xf1,0x7c,0xf9,0x59,0xc1]
1459   %res = call <16 x float> @llvm.x86.avx512.mask.mul.ps.512(<16 x float> %a0, <16 x float> %a1,
1460                     <16 x float> zeroinitializer, i16 %mask, i32 3)
1461   ret <16 x float> %res
1462 }
1463
1464 ;; With Passthru value
1465 define <16 x float> @test_vmulps_mask_passthru_rn(<16 x float> %a0, <16 x float> %a1, <16 x float> %passthru, i16 %mask) {
1466   ; CHECK-LABEL: test_vmulps_mask_passthru_rn
1467   ; CHECK: vmulps {rn-sae}{{.*}}{%k1} ## encoding: [0x62,0xf1,0x7c,0x19,0x59,0xd1]
1468   %res = call <16 x float> @llvm.x86.avx512.mask.mul.ps.512(<16 x float> %a0, <16 x float> %a1,
1469                     <16 x float> %passthru, i16 %mask, i32 0)
1470   ret <16 x float> %res
1471 }
1472
1473 define <16 x float> @test_vmulps_mask_passthru_rd(<16 x float> %a0, <16 x float> %a1, <16 x float> %passthru, i16 %mask) {
1474   ; CHECK-LABEL: test_vmulps_mask_passthru_rd
1475   ; CHECK: vmulps {rd-sae}{{.*}}{%k1} ## encoding: [0x62,0xf1,0x7c,0x39,0x59,0xd1]
1476   %res = call <16 x float> @llvm.x86.avx512.mask.mul.ps.512(<16 x float> %a0, <16 x float> %a1,
1477                     <16 x float> %passthru, i16 %mask, i32 1)
1478   ret <16 x float> %res
1479 }
1480
1481 define <16 x float> @test_vmulps_mask_passthru_ru(<16 x float> %a0, <16 x float> %a1, <16 x float> %passthru, i16 %mask) {
1482   ; CHECK-LABEL: test_vmulps_mask_passthru_ru
1483   ; CHECK: vmulps {ru-sae}{{.*}}{%k1} ## encoding: [0x62,0xf1,0x7c,0x59,0x59,0xd1]
1484   %res = call <16 x float> @llvm.x86.avx512.mask.mul.ps.512(<16 x float> %a0, <16 x float> %a1,
1485                     <16 x float> %passthru, i16 %mask, i32 2)
1486   ret <16 x float> %res
1487 }
1488
1489 define <16 x float> @test_vmulps_mask_passthru_rz(<16 x float> %a0, <16 x float> %a1, <16 x float> %passthru, i16 %mask) {
1490   ; CHECK-LABEL: test_vmulps_mask_passthru_rz
1491   ; CHECK: vmulps {rz-sae}{{.*}}{%k1} ## encoding: [0x62,0xf1,0x7c,0x79,0x59,0xd1]
1492   %res = call <16 x float> @llvm.x86.avx512.mask.mul.ps.512(<16 x float> %a0, <16 x float> %a1,
1493                     <16 x float> %passthru, i16 %mask, i32 3)
1494   ret <16 x float> %res
1495 }
1496
1497 ;; mask double
1498 define <8 x double> @test_vmulpd_mask_rn(<8 x double> %a0, <8 x double> %a1, i8 %mask) {
1499   ; CHECK-LABEL: test_vmulpd_mask_rn
1500   ; CHECK: vmulpd {rn-sae}{{.*}}{%k1} {z} ## encoding: [0x62,0xf1,0xfd,0x99,0x59,0xc1]
1501   %res = call <8 x double> @llvm.x86.avx512.mask.mul.pd.512(<8 x double> %a0, <8 x double> %a1,
1502                     <8 x double> zeroinitializer, i8 %mask, i32 0)
1503   ret <8 x double> %res
1504 }
1505
1506 define <8 x double> @test_vmulpd_mask_rd(<8 x double> %a0, <8 x double> %a1, i8 %mask) {
1507   ; CHECK-LABEL: test_vmulpd_mask_rd
1508   ; CHECK: vmulpd {rd-sae}{{.*}}{%k1} {z} ## encoding: [0x62,0xf1,0xfd,0xb9,0x59,0xc1]
1509   %res = call <8 x double> @llvm.x86.avx512.mask.mul.pd.512(<8 x double> %a0, <8 x double> %a1,
1510                     <8 x double> zeroinitializer, i8 %mask, i32 1)
1511   ret <8 x double> %res
1512 }
1513
1514 define <8 x double> @test_vmulpd_mask_ru(<8 x double> %a0, <8 x double> %a1, i8 %mask) {
1515   ; CHECK-LABEL: test_vmulpd_mask_ru
1516   ; CHECK: vmulpd {ru-sae}{{.*}}{%k1} {z} ## encoding: [0x62,0xf1,0xfd,0xd9,0x59,0xc1]
1517   %res = call <8 x double> @llvm.x86.avx512.mask.mul.pd.512(<8 x double> %a0, <8 x double> %a1,
1518                     <8 x double> zeroinitializer, i8 %mask, i32 2)
1519   ret <8 x double> %res
1520 }
1521
1522 define <8 x double> @test_vmulpd_mask_rz(<8 x double> %a0, <8 x double> %a1, i8 %mask) {
1523   ; CHECK-LABEL: test_vmulpd_mask_rz
1524   ; CHECK: vmulpd {rz-sae}{{.*}}{%k1} {z} ## encoding: [0x62,0xf1,0xfd,0xf9,0x59,0xc1]
1525   %res = call <8 x double> @llvm.x86.avx512.mask.mul.pd.512(<8 x double> %a0, <8 x double> %a1,
1526                     <8 x double> zeroinitializer, i8 %mask, i32 3)
1527   ret <8 x double> %res
1528 }
1529
1530 define <16 x i32> @test_xor_epi32(<16 x i32> %a, <16 x i32> %b) {
1531   ;CHECK-LABEL: test_xor_epi32
1532   ;CHECK: vpxord {{.*}}encoding: [0x62,0xf1,0x7d,0x48,0xef,0xc1]
1533   %res = call <16 x i32> @llvm.x86.avx512.mask.pxor.d.512(<16 x i32> %a,<16 x i32> %b, <16 x i32>zeroinitializer, i16 -1)
1534   ret < 16 x i32> %res
1535 }
1536
1537 define <16 x i32> @test_mask_xor_epi32(<16 x i32> %a,<16 x i32> %b, <16 x i32> %passThru, i16 %mask) {
1538   ;CHECK-LABEL: test_mask_xor_epi32
1539   ;CHECK: vpxord %zmm1, %zmm0, %zmm2 {%k1} ## encoding: [0x62,0xf1,0x7d,0x49,0xef,0xd1]
1540   %res = call <16 x i32> @llvm.x86.avx512.mask.pxor.d.512(<16 x i32> %a, <16 x i32> %b, <16 x i32> %passThru, i16 %mask)
1541   ret < 16 x i32> %res
1542 }
1543
1544 declare <16 x i32> @llvm.x86.avx512.mask.pxor.d.512(<16 x i32>, <16 x i32>, <16 x i32>, i16)
1545
1546 define <16 x i32> @test_or_epi32(<16 x i32> %a, <16 x i32> %b) {
1547   ;CHECK-LABEL: test_or_epi32
1548   ;CHECK: vpord {{.*}}encoding: [0x62,0xf1,0x7d,0x48,0xeb,0xc1]
1549   %res = call <16 x i32> @llvm.x86.avx512.mask.por.d.512(<16 x i32> %a,<16 x i32> %b, <16 x i32>zeroinitializer, i16 -1)
1550   ret < 16 x i32> %res
1551 }
1552
1553 define <16 x i32> @test_mask_or_epi32(<16 x i32> %a,<16 x i32> %b, <16 x i32> %passThru, i16 %mask) {
1554   ;CHECK-LABEL: test_mask_or_epi32
1555   ;CHECK: vpord %zmm1, %zmm0, %zmm2 {%k1} ## encoding: [0x62,0xf1,0x7d,0x49,0xeb,0xd1]
1556   %res = call <16 x i32> @llvm.x86.avx512.mask.por.d.512(<16 x i32> %a, <16 x i32> %b, <16 x i32> %passThru, i16 %mask)
1557   ret < 16 x i32> %res
1558 }
1559
1560 declare <16 x i32> @llvm.x86.avx512.mask.por.d.512(<16 x i32>, <16 x i32>, <16 x i32>, i16)
1561
1562 define <16 x i32> @test_and_epi32(<16 x i32> %a, <16 x i32> %b) {
1563   ;CHECK-LABEL: test_and_epi32
1564   ;CHECK: vpandd {{.*}}encoding: [0x62,0xf1,0x7d,0x48,0xdb,0xc1]
1565   %res = call <16 x i32> @llvm.x86.avx512.mask.pand.d.512(<16 x i32> %a,<16 x i32> %b, <16 x i32>zeroinitializer, i16 -1)
1566   ret < 16 x i32> %res
1567 }
1568
1569 define <16 x i32> @test_mask_and_epi32(<16 x i32> %a,<16 x i32> %b, <16 x i32> %passThru, i16 %mask) {
1570   ;CHECK-LABEL: test_mask_and_epi32
1571   ;CHECK: vpandd %zmm1, %zmm0, %zmm2 {%k1} ## encoding: [0x62,0xf1,0x7d,0x49,0xdb,0xd1]
1572   %res = call <16 x i32> @llvm.x86.avx512.mask.pand.d.512(<16 x i32> %a, <16 x i32> %b, <16 x i32> %passThru, i16 %mask)
1573   ret < 16 x i32> %res
1574 }
1575
1576 declare <16 x i32> @llvm.x86.avx512.mask.pand.d.512(<16 x i32>, <16 x i32>, <16 x i32>, i16)
1577
1578 define <8 x i64> @test_xor_epi64(<8 x i64> %a, <8 x i64> %b) {
1579   ;CHECK-LABEL: test_xor_epi64
1580   ;CHECK: vpxorq {{.*}}encoding: [0x62,0xf1,0xfd,0x48,0xef,0xc1]
1581   %res = call <8 x i64> @llvm.x86.avx512.mask.pxor.q.512(<8 x i64> %a,<8 x i64> %b, <8 x i64>zeroinitializer, i8 -1)
1582   ret < 8 x i64> %res
1583 }
1584
1585 define <8 x i64> @test_mask_xor_epi64(<8 x i64> %a,<8 x i64> %b, <8 x i64> %passThru, i8 %mask) {
1586   ;CHECK-LABEL: test_mask_xor_epi64
1587   ;CHECK: vpxorq %zmm1, %zmm0, %zmm2 {%k1} ## encoding: [0x62,0xf1,0xfd,0x49,0xef,0xd1]
1588   %res = call <8 x i64> @llvm.x86.avx512.mask.pxor.q.512(<8 x i64> %a, <8 x i64> %b, <8 x i64> %passThru, i8 %mask)
1589   ret < 8 x i64> %res
1590 }
1591
1592 declare <8 x i64> @llvm.x86.avx512.mask.pxor.q.512(<8 x i64>, <8 x i64>, <8 x i64>, i8)
1593
1594 define <8 x i64> @test_or_epi64(<8 x i64> %a, <8 x i64> %b) {
1595   ;CHECK-LABEL: test_or_epi64
1596   ;CHECK: vporq {{.*}}encoding: [0x62,0xf1,0xfd,0x48,0xeb,0xc1]
1597   %res = call <8 x i64> @llvm.x86.avx512.mask.por.q.512(<8 x i64> %a,<8 x i64> %b, <8 x i64>zeroinitializer, i8 -1)
1598   ret < 8 x i64> %res
1599 }
1600
1601 define <8 x i64> @test_mask_or_epi64(<8 x i64> %a,<8 x i64> %b, <8 x i64> %passThru, i8 %mask) {
1602   ;CHECK-LABEL: test_mask_or_epi64
1603   ;CHECK: vporq %zmm1, %zmm0, %zmm2 {%k1} ## encoding: [0x62,0xf1,0xfd,0x49,0xeb,0xd1]
1604   %res = call <8 x i64> @llvm.x86.avx512.mask.por.q.512(<8 x i64> %a, <8 x i64> %b, <8 x i64> %passThru, i8 %mask)
1605   ret < 8 x i64> %res
1606 }
1607
1608 declare <8 x i64> @llvm.x86.avx512.mask.por.q.512(<8 x i64>, <8 x i64>, <8 x i64>, i8)
1609
1610 define <8 x i64> @test_and_epi64(<8 x i64> %a, <8 x i64> %b) {
1611   ;CHECK-LABEL: test_and_epi64
1612   ;CHECK: vpandq {{.*}}encoding: [0x62,0xf1,0xfd,0x48,0xdb,0xc1]
1613   %res = call <8 x i64> @llvm.x86.avx512.mask.pand.q.512(<8 x i64> %a,<8 x i64> %b, <8 x i64>zeroinitializer, i8 -1)
1614   ret < 8 x i64> %res
1615 }
1616
1617 define <8 x i64> @test_mask_and_epi64(<8 x i64> %a,<8 x i64> %b, <8 x i64> %passThru, i8 %mask) {
1618   ;CHECK-LABEL: test_mask_and_epi64
1619   ;CHECK: vpandq %zmm1, %zmm0, %zmm2 {%k1} ## encoding: [0x62,0xf1,0xfd,0x49,0xdb,0xd1]
1620   %res = call <8 x i64> @llvm.x86.avx512.mask.pand.q.512(<8 x i64> %a, <8 x i64> %b, <8 x i64> %passThru, i8 %mask)
1621   ret < 8 x i64> %res
1622 }
1623
1624 declare <8 x i64> @llvm.x86.avx512.mask.pand.q.512(<8 x i64>, <8 x i64>, <8 x i64>, i8)
1625
1626
1627 define <16 x i32> @test_mask_add_epi32_rr(<16 x i32> %a, <16 x i32> %b) {
1628   ;CHECK-LABEL: test_mask_add_epi32_rr
1629   ;CHECK: vpaddd %zmm1, %zmm0, %zmm0     ## encoding: [0x62,0xf1,0x7d,0x48,0xfe,0xc1]
1630   %res = call <16 x i32> @llvm.x86.avx512.mask.padd.d.512(<16 x i32> %a, <16 x i32> %b, <16 x i32> zeroinitializer, i16 -1)
1631   ret < 16 x i32> %res
1632 }
1633
1634 define <16 x i32> @test_mask_add_epi32_rrk(<16 x i32> %a, <16 x i32> %b, <16 x i32> %passThru, i16 %mask) {
1635   ;CHECK-LABEL: test_mask_add_epi32_rrk
1636   ;CHECK: vpaddd %zmm1, %zmm0, %zmm2 {%k1} ## encoding: [0x62,0xf1,0x7d,0x49,0xfe,0xd1]
1637   %res = call <16 x i32> @llvm.x86.avx512.mask.padd.d.512(<16 x i32> %a, <16 x i32> %b, <16 x i32> %passThru, i16 %mask)
1638   ret < 16 x i32> %res
1639 }
1640
1641 define <16 x i32> @test_mask_add_epi32_rrkz(<16 x i32> %a, <16 x i32> %b, i16 %mask) {
1642   ;CHECK-LABEL: test_mask_add_epi32_rrkz
1643   ;CHECK: vpaddd %zmm1, %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf1,0x7d,0xc9,0xfe,0xc1]
1644   %res = call <16 x i32> @llvm.x86.avx512.mask.padd.d.512(<16 x i32> %a, <16 x i32> %b, <16 x i32> zeroinitializer, i16 %mask)
1645   ret < 16 x i32> %res
1646 }
1647
1648 define <16 x i32> @test_mask_add_epi32_rm(<16 x i32> %a, <16 x i32>* %ptr_b) {
1649   ;CHECK-LABEL: test_mask_add_epi32_rm
1650   ;CHECK: vpaddd (%rdi), %zmm0, %zmm0    ## encoding: [0x62,0xf1,0x7d,0x48,0xfe,0x07]
1651   %b = load <16 x i32>, <16 x i32>* %ptr_b
1652   %res = call <16 x i32> @llvm.x86.avx512.mask.padd.d.512(<16 x i32> %a, <16 x i32> %b, <16 x i32> zeroinitializer, i16 -1)
1653   ret < 16 x i32> %res
1654 }
1655
1656 define <16 x i32> @test_mask_add_epi32_rmk(<16 x i32> %a, <16 x i32>* %ptr_b, <16 x i32> %passThru, i16 %mask) {
1657   ;CHECK-LABEL: test_mask_add_epi32_rmk
1658   ;CHECK: vpaddd (%rdi), %zmm0, %zmm1 {%k1} ## encoding: [0x62,0xf1,0x7d,0x49,0xfe,0x0f]
1659   %b = load <16 x i32>, <16 x i32>* %ptr_b
1660   %res = call <16 x i32> @llvm.x86.avx512.mask.padd.d.512(<16 x i32> %a, <16 x i32> %b, <16 x i32> %passThru, i16 %mask)
1661   ret < 16 x i32> %res
1662 }
1663
1664 define <16 x i32> @test_mask_add_epi32_rmkz(<16 x i32> %a, <16 x i32>* %ptr_b, i16 %mask) {
1665   ;CHECK-LABEL: test_mask_add_epi32_rmkz
1666   ;CHECK: vpaddd (%rdi), %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf1,0x7d,0xc9,0xfe,0x07]
1667   %b = load <16 x i32>, <16 x i32>* %ptr_b
1668   %res = call <16 x i32> @llvm.x86.avx512.mask.padd.d.512(<16 x i32> %a, <16 x i32> %b, <16 x i32> zeroinitializer, i16 %mask)
1669   ret < 16 x i32> %res
1670 }
1671
1672 define <16 x i32> @test_mask_add_epi32_rmb(<16 x i32> %a, i32* %ptr_b) {
1673   ;CHECK-LABEL: test_mask_add_epi32_rmb
1674   ;CHECK: vpaddd (%rdi){1to16}, %zmm0, %zmm0  ## encoding: [0x62,0xf1,0x7d,0x58,0xfe,0x07]
1675   %q = load i32, i32* %ptr_b
1676   %vecinit.i = insertelement <16 x i32> undef, i32 %q, i32 0
1677   %b = shufflevector <16 x i32> %vecinit.i, <16 x i32> undef, <16 x i32> zeroinitializer
1678   %res = call <16 x i32> @llvm.x86.avx512.mask.padd.d.512(<16 x i32> %a, <16 x i32> %b, <16 x i32> zeroinitializer, i16 -1)
1679   ret < 16 x i32> %res
1680 }
1681
1682 define <16 x i32> @test_mask_add_epi32_rmbk(<16 x i32> %a, i32* %ptr_b, <16 x i32> %passThru, i16 %mask) {
1683   ;CHECK-LABEL: test_mask_add_epi32_rmbk
1684   ;CHECK: vpaddd (%rdi){1to16}, %zmm0, %zmm1 {%k1} ## encoding: [0x62,0xf1,0x7d,0x59,0xfe,0x0f]
1685   %q = load i32, i32* %ptr_b
1686   %vecinit.i = insertelement <16 x i32> undef, i32 %q, i32 0
1687   %b = shufflevector <16 x i32> %vecinit.i, <16 x i32> undef, <16 x i32> zeroinitializer
1688   %res = call <16 x i32> @llvm.x86.avx512.mask.padd.d.512(<16 x i32> %a, <16 x i32> %b, <16 x i32> %passThru, i16 %mask)
1689   ret < 16 x i32> %res
1690 }
1691
1692 define <16 x i32> @test_mask_add_epi32_rmbkz(<16 x i32> %a, i32* %ptr_b, i16 %mask) {
1693   ;CHECK-LABEL: test_mask_add_epi32_rmbkz
1694   ;CHECK: vpaddd (%rdi){1to16}, %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf1,0x7d,0xd9,0xfe,0x07]
1695   %q = load i32, i32* %ptr_b
1696   %vecinit.i = insertelement <16 x i32> undef, i32 %q, i32 0
1697   %b = shufflevector <16 x i32> %vecinit.i, <16 x i32> undef, <16 x i32> zeroinitializer
1698   %res = call <16 x i32> @llvm.x86.avx512.mask.padd.d.512(<16 x i32> %a, <16 x i32> %b, <16 x i32> zeroinitializer, i16 %mask)
1699   ret < 16 x i32> %res
1700 }
1701
1702 declare <16 x i32> @llvm.x86.avx512.mask.padd.d.512(<16 x i32>, <16 x i32>, <16 x i32>, i16)
1703
1704 define <16 x i32> @test_mask_sub_epi32_rr(<16 x i32> %a, <16 x i32> %b) {
1705   ;CHECK-LABEL: test_mask_sub_epi32_rr
1706   ;CHECK: vpsubd %zmm1, %zmm0, %zmm0     ## encoding: [0x62,0xf1,0x7d,0x48,0xfa,0xc1]
1707   %res = call <16 x i32> @llvm.x86.avx512.mask.psub.d.512(<16 x i32> %a, <16 x i32> %b, <16 x i32> zeroinitializer, i16 -1)
1708   ret < 16 x i32> %res
1709 }
1710
1711 define <16 x i32> @test_mask_sub_epi32_rrk(<16 x i32> %a, <16 x i32> %b, <16 x i32> %passThru, i16 %mask) {
1712   ;CHECK-LABEL: test_mask_sub_epi32_rrk
1713   ;CHECK: vpsubd %zmm1, %zmm0, %zmm2 {%k1} ## encoding: [0x62,0xf1,0x7d,0x49,0xfa,0xd1]
1714   %res = call <16 x i32> @llvm.x86.avx512.mask.psub.d.512(<16 x i32> %a, <16 x i32> %b, <16 x i32> %passThru, i16 %mask)
1715   ret < 16 x i32> %res
1716 }
1717
1718 define <16 x i32> @test_mask_sub_epi32_rrkz(<16 x i32> %a, <16 x i32> %b, i16 %mask) {
1719   ;CHECK-LABEL: test_mask_sub_epi32_rrkz
1720   ;CHECK: vpsubd %zmm1, %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf1,0x7d,0xc9,0xfa,0xc1]
1721   %res = call <16 x i32> @llvm.x86.avx512.mask.psub.d.512(<16 x i32> %a, <16 x i32> %b, <16 x i32> zeroinitializer, i16 %mask)
1722   ret < 16 x i32> %res
1723 }
1724
1725 define <16 x i32> @test_mask_sub_epi32_rm(<16 x i32> %a, <16 x i32>* %ptr_b) {
1726   ;CHECK-LABEL: test_mask_sub_epi32_rm
1727   ;CHECK: vpsubd (%rdi), %zmm0, %zmm0    ## encoding: [0x62,0xf1,0x7d,0x48,0xfa,0x07]
1728   %b = load <16 x i32>, <16 x i32>* %ptr_b
1729   %res = call <16 x i32> @llvm.x86.avx512.mask.psub.d.512(<16 x i32> %a, <16 x i32> %b, <16 x i32> zeroinitializer, i16 -1)
1730   ret < 16 x i32> %res
1731 }
1732
1733 define <16 x i32> @test_mask_sub_epi32_rmk(<16 x i32> %a, <16 x i32>* %ptr_b, <16 x i32> %passThru, i16 %mask) {
1734   ;CHECK-LABEL: test_mask_sub_epi32_rmk
1735   ;CHECK: vpsubd (%rdi), %zmm0, %zmm1 {%k1} ## encoding: [0x62,0xf1,0x7d,0x49,0xfa,0x0f]
1736   %b = load <16 x i32>, <16 x i32>* %ptr_b
1737   %res = call <16 x i32> @llvm.x86.avx512.mask.psub.d.512(<16 x i32> %a, <16 x i32> %b, <16 x i32> %passThru, i16 %mask)
1738   ret < 16 x i32> %res
1739 }
1740
1741 define <16 x i32> @test_mask_sub_epi32_rmkz(<16 x i32> %a, <16 x i32>* %ptr_b, i16 %mask) {
1742   ;CHECK-LABEL: test_mask_sub_epi32_rmkz
1743   ;CHECK: vpsubd (%rdi), %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf1,0x7d,0xc9,0xfa,0x07]
1744   %b = load <16 x i32>, <16 x i32>* %ptr_b
1745   %res = call <16 x i32> @llvm.x86.avx512.mask.psub.d.512(<16 x i32> %a, <16 x i32> %b, <16 x i32> zeroinitializer, i16 %mask)
1746   ret < 16 x i32> %res
1747 }
1748
1749 define <16 x i32> @test_mask_sub_epi32_rmb(<16 x i32> %a, i32* %ptr_b) {
1750   ;CHECK-LABEL: test_mask_sub_epi32_rmb
1751   ;CHECK: vpsubd (%rdi){1to16}, %zmm0, %zmm0  ## encoding: [0x62,0xf1,0x7d,0x58,0xfa,0x07]
1752   %q = load i32, i32* %ptr_b
1753   %vecinit.i = insertelement <16 x i32> undef, i32 %q, i32 0
1754   %b = shufflevector <16 x i32> %vecinit.i, <16 x i32> undef, <16 x i32> zeroinitializer
1755   %res = call <16 x i32> @llvm.x86.avx512.mask.psub.d.512(<16 x i32> %a, <16 x i32> %b, <16 x i32> zeroinitializer, i16 -1)
1756   ret < 16 x i32> %res
1757 }
1758
1759 define <16 x i32> @test_mask_sub_epi32_rmbk(<16 x i32> %a, i32* %ptr_b, <16 x i32> %passThru, i16 %mask) {
1760   ;CHECK-LABEL: test_mask_sub_epi32_rmbk
1761   ;CHECK: vpsubd (%rdi){1to16}, %zmm0, %zmm1 {%k1} ## encoding: [0x62,0xf1,0x7d,0x59,0xfa,0x0f]
1762   %q = load i32, i32* %ptr_b
1763   %vecinit.i = insertelement <16 x i32> undef, i32 %q, i32 0
1764   %b = shufflevector <16 x i32> %vecinit.i, <16 x i32> undef, <16 x i32> zeroinitializer
1765   %res = call <16 x i32> @llvm.x86.avx512.mask.psub.d.512(<16 x i32> %a, <16 x i32> %b, <16 x i32> %passThru, i16 %mask)
1766   ret < 16 x i32> %res
1767 }
1768
1769 define <16 x i32> @test_mask_sub_epi32_rmbkz(<16 x i32> %a, i32* %ptr_b, i16 %mask) {
1770   ;CHECK-LABEL: test_mask_sub_epi32_rmbkz
1771   ;CHECK: vpsubd (%rdi){1to16}, %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf1,0x7d,0xd9,0xfa,0x07]
1772   %q = load i32, i32* %ptr_b
1773   %vecinit.i = insertelement <16 x i32> undef, i32 %q, i32 0
1774   %b = shufflevector <16 x i32> %vecinit.i, <16 x i32> undef, <16 x i32> zeroinitializer
1775   %res = call <16 x i32> @llvm.x86.avx512.mask.psub.d.512(<16 x i32> %a, <16 x i32> %b, <16 x i32> zeroinitializer, i16 %mask)
1776   ret < 16 x i32> %res
1777 }
1778
1779 declare <16 x i32> @llvm.x86.avx512.mask.psub.d.512(<16 x i32>, <16 x i32>, <16 x i32>, i16)
1780
1781 define <8 x i64> @test_mask_add_epi64_rr(<8 x i64> %a, <8 x i64> %b) {
1782   ;CHECK-LABEL: test_mask_add_epi64_rr
1783   ;CHECK: vpaddq %zmm1, %zmm0, %zmm0     ## encoding: [0x62,0xf1,0xfd,0x48,0xd4,0xc1]
1784   %res = call <8 x i64> @llvm.x86.avx512.mask.padd.q.512(<8 x i64> %a, <8 x i64> %b, <8 x i64> zeroinitializer, i8 -1)
1785   ret < 8 x i64> %res
1786 }
1787
1788 define <8 x i64> @test_mask_add_epi64_rrk(<8 x i64> %a, <8 x i64> %b, <8 x i64> %passThru, i8 %mask) {
1789   ;CHECK-LABEL: test_mask_add_epi64_rrk
1790   ;CHECK: vpaddq %zmm1, %zmm0, %zmm2 {%k1} ## encoding: [0x62,0xf1,0xfd,0x49,0xd4,0xd1]
1791   %res = call <8 x i64> @llvm.x86.avx512.mask.padd.q.512(<8 x i64> %a, <8 x i64> %b, <8 x i64> %passThru, i8 %mask)
1792   ret < 8 x i64> %res
1793 }
1794
1795 define <8 x i64> @test_mask_add_epi64_rrkz(<8 x i64> %a, <8 x i64> %b, i8 %mask) {
1796   ;CHECK-LABEL: test_mask_add_epi64_rrkz
1797   ;CHECK: vpaddq %zmm1, %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf1,0xfd,0xc9,0xd4,0xc1]
1798   %res = call <8 x i64> @llvm.x86.avx512.mask.padd.q.512(<8 x i64> %a, <8 x i64> %b, <8 x i64> zeroinitializer, i8 %mask)
1799   ret < 8 x i64> %res
1800 }
1801
1802 define <8 x i64> @test_mask_add_epi64_rm(<8 x i64> %a, <8 x i64>* %ptr_b) {
1803   ;CHECK-LABEL: test_mask_add_epi64_rm
1804   ;CHECK: vpaddq (%rdi), %zmm0, %zmm0    ## encoding: [0x62,0xf1,0xfd,0x48,0xd4,0x07]
1805   %b = load <8 x i64>, <8 x i64>* %ptr_b
1806   %res = call <8 x i64> @llvm.x86.avx512.mask.padd.q.512(<8 x i64> %a, <8 x i64> %b, <8 x i64> zeroinitializer, i8 -1)
1807   ret < 8 x i64> %res
1808 }
1809
1810 define <8 x i64> @test_mask_add_epi64_rmk(<8 x i64> %a, <8 x i64>* %ptr_b, <8 x i64> %passThru, i8 %mask) {
1811   ;CHECK-LABEL: test_mask_add_epi64_rmk
1812   ;CHECK: vpaddq (%rdi), %zmm0, %zmm1 {%k1} ## encoding: [0x62,0xf1,0xfd,0x49,0xd4,0x0f]
1813   %b = load <8 x i64>, <8 x i64>* %ptr_b
1814   %res = call <8 x i64> @llvm.x86.avx512.mask.padd.q.512(<8 x i64> %a, <8 x i64> %b, <8 x i64> %passThru, i8 %mask)
1815   ret < 8 x i64> %res
1816 }
1817
1818 define <8 x i64> @test_mask_add_epi64_rmkz(<8 x i64> %a, <8 x i64>* %ptr_b, i8 %mask) {
1819   ;CHECK-LABEL: test_mask_add_epi64_rmkz
1820   ;CHECK: vpaddq (%rdi), %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf1,0xfd,0xc9,0xd4,0x07]
1821   %b = load <8 x i64>, <8 x i64>* %ptr_b
1822   %res = call <8 x i64> @llvm.x86.avx512.mask.padd.q.512(<8 x i64> %a, <8 x i64> %b, <8 x i64> zeroinitializer, i8 %mask)
1823   ret < 8 x i64> %res
1824 }
1825
1826 define <8 x i64> @test_mask_add_epi64_rmb(<8 x i64> %a, i64* %ptr_b) {
1827   ;CHECK-LABEL: test_mask_add_epi64_rmb
1828   ;CHECK: vpaddq (%rdi){1to8}, %zmm0, %zmm0  ## encoding: [0x62,0xf1,0xfd,0x58,0xd4,0x07]
1829   %q = load i64, i64* %ptr_b
1830   %vecinit.i = insertelement <8 x i64> undef, i64 %q, i32 0
1831   %b = shufflevector <8 x i64> %vecinit.i, <8 x i64> undef, <8 x i32> zeroinitializer
1832   %res = call <8 x i64> @llvm.x86.avx512.mask.padd.q.512(<8 x i64> %a, <8 x i64> %b, <8 x i64> zeroinitializer, i8 -1)
1833   ret < 8 x i64> %res
1834 }
1835
1836 define <8 x i64> @test_mask_add_epi64_rmbk(<8 x i64> %a, i64* %ptr_b, <8 x i64> %passThru, i8 %mask) {
1837   ;CHECK-LABEL: test_mask_add_epi64_rmbk
1838   ;CHECK: vpaddq (%rdi){1to8}, %zmm0, %zmm1 {%k1} ## encoding: [0x62,0xf1,0xfd,0x59,0xd4,0x0f]
1839   %q = load i64, i64* %ptr_b
1840   %vecinit.i = insertelement <8 x i64> undef, i64 %q, i32 0
1841   %b = shufflevector <8 x i64> %vecinit.i, <8 x i64> undef, <8 x i32> zeroinitializer
1842   %res = call <8 x i64> @llvm.x86.avx512.mask.padd.q.512(<8 x i64> %a, <8 x i64> %b, <8 x i64> %passThru, i8 %mask)
1843   ret < 8 x i64> %res
1844 }
1845
1846 define <8 x i64> @test_mask_add_epi64_rmbkz(<8 x i64> %a, i64* %ptr_b, i8 %mask) {
1847   ;CHECK-LABEL: test_mask_add_epi64_rmbkz
1848   ;CHECK: vpaddq (%rdi){1to8}, %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf1,0xfd,0xd9,0xd4,0x07]
1849   %q = load i64, i64* %ptr_b
1850   %vecinit.i = insertelement <8 x i64> undef, i64 %q, i32 0
1851   %b = shufflevector <8 x i64> %vecinit.i, <8 x i64> undef, <8 x i32> zeroinitializer
1852   %res = call <8 x i64> @llvm.x86.avx512.mask.padd.q.512(<8 x i64> %a, <8 x i64> %b, <8 x i64> zeroinitializer, i8 %mask)
1853   ret < 8 x i64> %res
1854 }
1855
1856 declare <8 x i64> @llvm.x86.avx512.mask.padd.q.512(<8 x i64>, <8 x i64>, <8 x i64>, i8)
1857
1858 define <8 x i64> @test_mask_sub_epi64_rr(<8 x i64> %a, <8 x i64> %b) {
1859   ;CHECK-LABEL: test_mask_sub_epi64_rr
1860   ;CHECK: vpsubq %zmm1, %zmm0, %zmm0     ## encoding: [0x62,0xf1,0xfd,0x48,0xfb,0xc1]
1861   %res = call <8 x i64> @llvm.x86.avx512.mask.psub.q.512(<8 x i64> %a, <8 x i64> %b, <8 x i64> zeroinitializer, i8 -1)
1862   ret < 8 x i64> %res
1863 }
1864
1865 define <8 x i64> @test_mask_sub_epi64_rrk(<8 x i64> %a, <8 x i64> %b, <8 x i64> %passThru, i8 %mask) {
1866   ;CHECK-LABEL: test_mask_sub_epi64_rrk
1867   ;CHECK: vpsubq %zmm1, %zmm0, %zmm2 {%k1} ## encoding: [0x62,0xf1,0xfd,0x49,0xfb,0xd1]
1868   %res = call <8 x i64> @llvm.x86.avx512.mask.psub.q.512(<8 x i64> %a, <8 x i64> %b, <8 x i64> %passThru, i8 %mask)
1869   ret < 8 x i64> %res
1870 }
1871
1872 define <8 x i64> @test_mask_sub_epi64_rrkz(<8 x i64> %a, <8 x i64> %b, i8 %mask) {
1873   ;CHECK-LABEL: test_mask_sub_epi64_rrkz
1874   ;CHECK: vpsubq %zmm1, %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf1,0xfd,0xc9,0xfb,0xc1]
1875   %res = call <8 x i64> @llvm.x86.avx512.mask.psub.q.512(<8 x i64> %a, <8 x i64> %b, <8 x i64> zeroinitializer, i8 %mask)
1876   ret < 8 x i64> %res
1877 }
1878
1879 define <8 x i64> @test_mask_sub_epi64_rm(<8 x i64> %a, <8 x i64>* %ptr_b) {
1880   ;CHECK-LABEL: test_mask_sub_epi64_rm
1881   ;CHECK: vpsubq (%rdi), %zmm0, %zmm0    ## encoding: [0x62,0xf1,0xfd,0x48,0xfb,0x07]
1882   %b = load <8 x i64>, <8 x i64>* %ptr_b
1883   %res = call <8 x i64> @llvm.x86.avx512.mask.psub.q.512(<8 x i64> %a, <8 x i64> %b, <8 x i64> zeroinitializer, i8 -1)
1884   ret < 8 x i64> %res
1885 }
1886
1887 define <8 x i64> @test_mask_sub_epi64_rmk(<8 x i64> %a, <8 x i64>* %ptr_b, <8 x i64> %passThru, i8 %mask) {
1888   ;CHECK-LABEL: test_mask_sub_epi64_rmk
1889   ;CHECK: vpsubq (%rdi), %zmm0, %zmm1 {%k1} ## encoding: [0x62,0xf1,0xfd,0x49,0xfb,0x0f]
1890   %b = load <8 x i64>, <8 x i64>* %ptr_b
1891   %res = call <8 x i64> @llvm.x86.avx512.mask.psub.q.512(<8 x i64> %a, <8 x i64> %b, <8 x i64> %passThru, i8 %mask)
1892   ret < 8 x i64> %res
1893 }
1894
1895 define <8 x i64> @test_mask_sub_epi64_rmkz(<8 x i64> %a, <8 x i64>* %ptr_b, i8 %mask) {
1896   ;CHECK-LABEL: test_mask_sub_epi64_rmkz
1897   ;CHECK: vpsubq (%rdi), %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf1,0xfd,0xc9,0xfb,0x07]
1898   %b = load <8 x i64>, <8 x i64>* %ptr_b
1899   %res = call <8 x i64> @llvm.x86.avx512.mask.psub.q.512(<8 x i64> %a, <8 x i64> %b, <8 x i64> zeroinitializer, i8 %mask)
1900   ret < 8 x i64> %res
1901 }
1902
1903 define <8 x i64> @test_mask_sub_epi64_rmb(<8 x i64> %a, i64* %ptr_b) {
1904   ;CHECK-LABEL: test_mask_sub_epi64_rmb
1905   ;CHECK: vpsubq (%rdi){1to8}, %zmm0, %zmm0  ## encoding: [0x62,0xf1,0xfd,0x58,0xfb,0x07]
1906   %q = load i64, i64* %ptr_b
1907   %vecinit.i = insertelement <8 x i64> undef, i64 %q, i32 0
1908   %b = shufflevector <8 x i64> %vecinit.i, <8 x i64> undef, <8 x i32> zeroinitializer
1909   %res = call <8 x i64> @llvm.x86.avx512.mask.psub.q.512(<8 x i64> %a, <8 x i64> %b, <8 x i64> zeroinitializer, i8 -1)
1910   ret < 8 x i64> %res
1911 }
1912
1913 define <8 x i64> @test_mask_sub_epi64_rmbk(<8 x i64> %a, i64* %ptr_b, <8 x i64> %passThru, i8 %mask) {
1914   ;CHECK-LABEL: test_mask_sub_epi64_rmbk
1915   ;CHECK: vpsubq (%rdi){1to8}, %zmm0, %zmm1 {%k1} ## encoding: [0x62,0xf1,0xfd,0x59,0xfb,0x0f]
1916   %q = load i64, i64* %ptr_b
1917   %vecinit.i = insertelement <8 x i64> undef, i64 %q, i32 0
1918   %b = shufflevector <8 x i64> %vecinit.i, <8 x i64> undef, <8 x i32> zeroinitializer
1919   %res = call <8 x i64> @llvm.x86.avx512.mask.psub.q.512(<8 x i64> %a, <8 x i64> %b, <8 x i64> %passThru, i8 %mask)
1920   ret < 8 x i64> %res
1921 }
1922
1923 define <8 x i64> @test_mask_sub_epi64_rmbkz(<8 x i64> %a, i64* %ptr_b, i8 %mask) {
1924   ;CHECK-LABEL: test_mask_sub_epi64_rmbkz
1925   ;CHECK: vpsubq (%rdi){1to8}, %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf1,0xfd,0xd9,0xfb,0x07]
1926   %q = load i64, i64* %ptr_b
1927   %vecinit.i = insertelement <8 x i64> undef, i64 %q, i32 0
1928   %b = shufflevector <8 x i64> %vecinit.i, <8 x i64> undef, <8 x i32> zeroinitializer
1929   %res = call <8 x i64> @llvm.x86.avx512.mask.psub.q.512(<8 x i64> %a, <8 x i64> %b, <8 x i64> zeroinitializer, i8 %mask)
1930   ret < 8 x i64> %res
1931 }
1932
1933 declare <8 x i64> @llvm.x86.avx512.mask.psub.q.512(<8 x i64>, <8 x i64>, <8 x i64>, i8)
1934
1935 define <8 x i64> @test_mask_mul_epi32_rr(<16 x i32> %a, <16 x i32> %b) {
1936   ;CHECK-LABEL: test_mask_mul_epi32_rr
1937   ;CHECK: vpmuldq %zmm1, %zmm0, %zmm0     ## encoding: [0x62,0xf2,0xfd,0x48,0x28,0xc1]
1938   %res = call <8 x i64> @llvm.x86.avx512.mask.pmul.dq.512(<16 x i32> %a, <16 x i32> %b, <8 x i64> zeroinitializer, i8 -1)
1939   ret < 8 x i64> %res
1940 }
1941
1942 define <8 x i64> @test_mask_mul_epi32_rrk(<16 x i32> %a, <16 x i32> %b, <8 x i64> %passThru, i8 %mask) {
1943   ;CHECK-LABEL: test_mask_mul_epi32_rrk
1944   ;CHECK: vpmuldq %zmm1, %zmm0, %zmm2 {%k1} ## encoding: [0x62,0xf2,0xfd,0x49,0x28,0xd1]
1945   %res = call <8 x i64> @llvm.x86.avx512.mask.pmul.dq.512(<16 x i32> %a, <16 x i32> %b, <8 x i64> %passThru, i8 %mask)
1946   ret < 8 x i64> %res
1947 }
1948
1949 define <8 x i64> @test_mask_mul_epi32_rrkz(<16 x i32> %a, <16 x i32> %b, i8 %mask) {
1950   ;CHECK-LABEL: test_mask_mul_epi32_rrkz
1951   ;CHECK: vpmuldq %zmm1, %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf2,0xfd,0xc9,0x28,0xc1]
1952   %res = call <8 x i64> @llvm.x86.avx512.mask.pmul.dq.512(<16 x i32> %a, <16 x i32> %b, <8 x i64> zeroinitializer, i8 %mask)
1953   ret < 8 x i64> %res
1954 }
1955
1956 define <8 x i64> @test_mask_mul_epi32_rm(<16 x i32> %a, <16 x i32>* %ptr_b) {
1957   ;CHECK-LABEL: test_mask_mul_epi32_rm
1958   ;CHECK: vpmuldq (%rdi), %zmm0, %zmm0    ## encoding: [0x62,0xf2,0xfd,0x48,0x28,0x07]
1959   %b = load <16 x i32>, <16 x i32>* %ptr_b
1960   %res = call <8 x i64> @llvm.x86.avx512.mask.pmul.dq.512(<16 x i32> %a, <16 x i32> %b, <8 x i64> zeroinitializer, i8 -1)
1961   ret < 8 x i64> %res
1962 }
1963
1964 define <8 x i64> @test_mask_mul_epi32_rmk(<16 x i32> %a, <16 x i32>* %ptr_b, <8 x i64> %passThru, i8 %mask) {
1965   ;CHECK-LABEL: test_mask_mul_epi32_rmk
1966   ;CHECK: vpmuldq (%rdi), %zmm0, %zmm1 {%k1} ## encoding: [0x62,0xf2,0xfd,0x49,0x28,0x0f]
1967   %b = load <16 x i32>, <16 x i32>* %ptr_b
1968   %res = call <8 x i64> @llvm.x86.avx512.mask.pmul.dq.512(<16 x i32> %a, <16 x i32> %b, <8 x i64> %passThru, i8 %mask)
1969   ret < 8 x i64> %res
1970 }
1971
1972 define <8 x i64> @test_mask_mul_epi32_rmkz(<16 x i32> %a, <16 x i32>* %ptr_b, i8 %mask) {
1973   ;CHECK-LABEL: test_mask_mul_epi32_rmkz
1974   ;CHECK: vpmuldq (%rdi), %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf2,0xfd,0xc9,0x28,0x07]
1975   %b = load <16 x i32>, <16 x i32>* %ptr_b
1976   %res = call <8 x i64> @llvm.x86.avx512.mask.pmul.dq.512(<16 x i32> %a, <16 x i32> %b, <8 x i64> zeroinitializer, i8 %mask)
1977   ret < 8 x i64> %res
1978 }
1979
1980 define <8 x i64> @test_mask_mul_epi32_rmb(<16 x i32> %a, i64* %ptr_b) {
1981   ;CHECK-LABEL: test_mask_mul_epi32_rmb
1982   ;CHECK: vpmuldq (%rdi){1to8}, %zmm0, %zmm0  ## encoding: [0x62,0xf2,0xfd,0x58,0x28,0x07]
1983   %q = load i64, i64* %ptr_b
1984   %vecinit.i = insertelement <8 x i64> undef, i64 %q, i32 0
1985   %b64 = shufflevector <8 x i64> %vecinit.i, <8 x i64> undef, <8 x i32> zeroinitializer
1986   %b = bitcast <8 x i64> %b64 to <16 x i32>
1987   %res = call <8 x i64> @llvm.x86.avx512.mask.pmul.dq.512(<16 x i32> %a, <16 x i32> %b, <8 x i64> zeroinitializer, i8 -1)
1988   ret < 8 x i64> %res
1989 }
1990
1991 define <8 x i64> @test_mask_mul_epi32_rmbk(<16 x i32> %a, i64* %ptr_b, <8 x i64> %passThru, i8 %mask) {
1992   ;CHECK-LABEL: test_mask_mul_epi32_rmbk
1993   ;CHECK: vpmuldq (%rdi){1to8}, %zmm0, %zmm1 {%k1} ## encoding: [0x62,0xf2,0xfd,0x59,0x28,0x0f]
1994   %q = load i64, i64* %ptr_b
1995   %vecinit.i = insertelement <8 x i64> undef, i64 %q, i32 0
1996   %b64 = shufflevector <8 x i64> %vecinit.i, <8 x i64> undef, <8 x i32> zeroinitializer
1997   %b = bitcast <8 x i64> %b64 to <16 x i32>
1998   %res = call <8 x i64> @llvm.x86.avx512.mask.pmul.dq.512(<16 x i32> %a, <16 x i32> %b, <8 x i64> %passThru, i8 %mask)
1999   ret < 8 x i64> %res
2000 }
2001
2002 define <8 x i64> @test_mask_mul_epi32_rmbkz(<16 x i32> %a, i64* %ptr_b, i8 %mask) {
2003   ;CHECK-LABEL: test_mask_mul_epi32_rmbkz
2004   ;CHECK: vpmuldq (%rdi){1to8}, %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf2,0xfd,0xd9,0x28,0x07]
2005   %q = load i64, i64* %ptr_b
2006   %vecinit.i = insertelement <8 x i64> undef, i64 %q, i32 0
2007   %b64 = shufflevector <8 x i64> %vecinit.i, <8 x i64> undef, <8 x i32> zeroinitializer
2008   %b = bitcast <8 x i64> %b64 to <16 x i32>
2009   %res = call <8 x i64> @llvm.x86.avx512.mask.pmul.dq.512(<16 x i32> %a, <16 x i32> %b, <8 x i64> zeroinitializer, i8 %mask)
2010   ret < 8 x i64> %res
2011 }
2012
2013 declare <8 x i64> @llvm.x86.avx512.mask.pmul.dq.512(<16 x i32>, <16 x i32>, <8 x i64>, i8)
2014
2015 define <8 x i64> @test_mask_mul_epu32_rr(<16 x i32> %a, <16 x i32> %b) {
2016   ;CHECK-LABEL: test_mask_mul_epu32_rr
2017   ;CHECK: vpmuludq %zmm1, %zmm0, %zmm0  ## encoding: [0x62,0xf1,0xfd,0x48,0xf4,0xc1]
2018   %res = call <8 x i64> @llvm.x86.avx512.mask.pmulu.dq.512(<16 x i32> %a, <16 x i32> %b, <8 x i64> zeroinitializer, i8 -1)
2019   ret < 8 x i64> %res
2020 }
2021
2022 define <8 x i64> @test_mask_mul_epu32_rrk(<16 x i32> %a, <16 x i32> %b, <8 x i64> %passThru, i8 %mask) {
2023   ;CHECK-LABEL: test_mask_mul_epu32_rrk
2024   ;CHECK: vpmuludq %zmm1, %zmm0, %zmm2 {%k1} ## encoding: [0x62,0xf1,0xfd,0x49,0xf4,0xd1]
2025   %res = call <8 x i64> @llvm.x86.avx512.mask.pmulu.dq.512(<16 x i32> %a, <16 x i32> %b, <8 x i64> %passThru, i8 %mask)
2026   ret < 8 x i64> %res
2027 }
2028
2029 define <8 x i64> @test_mask_mul_epu32_rrkz(<16 x i32> %a, <16 x i32> %b, i8 %mask) {
2030   ;CHECK-LABEL: test_mask_mul_epu32_rrkz
2031   ;CHECK: vpmuludq %zmm1, %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf1,0xfd,0xc9,0xf4,0xc1]
2032   %res = call <8 x i64> @llvm.x86.avx512.mask.pmulu.dq.512(<16 x i32> %a, <16 x i32> %b, <8 x i64> zeroinitializer, i8 %mask)
2033   ret < 8 x i64> %res
2034 }
2035
2036 define <8 x i64> @test_mask_mul_epu32_rm(<16 x i32> %a, <16 x i32>* %ptr_b) {
2037   ;CHECK-LABEL: test_mask_mul_epu32_rm
2038   ;CHECK: vpmuludq (%rdi), %zmm0, %zmm0  ## encoding: [0x62,0xf1,0xfd,0x48,0xf4,0x07]
2039   %b = load <16 x i32>, <16 x i32>* %ptr_b
2040   %res = call <8 x i64> @llvm.x86.avx512.mask.pmulu.dq.512(<16 x i32> %a, <16 x i32> %b, <8 x i64> zeroinitializer, i8 -1)
2041   ret < 8 x i64> %res
2042 }
2043
2044 define <8 x i64> @test_mask_mul_epu32_rmk(<16 x i32> %a, <16 x i32>* %ptr_b, <8 x i64> %passThru, i8 %mask) {
2045   ;CHECK-LABEL: test_mask_mul_epu32_rmk
2046   ;CHECK: vpmuludq (%rdi), %zmm0, %zmm1 {%k1} ## encoding: [0x62,0xf1,0xfd,0x49,0xf4,0x0f]
2047   %b = load <16 x i32>, <16 x i32>* %ptr_b
2048   %res = call <8 x i64> @llvm.x86.avx512.mask.pmulu.dq.512(<16 x i32> %a, <16 x i32> %b, <8 x i64> %passThru, i8 %mask)
2049   ret < 8 x i64> %res
2050 }
2051
2052 define <8 x i64> @test_mask_mul_epu32_rmkz(<16 x i32> %a, <16 x i32>* %ptr_b, i8 %mask) {
2053   ;CHECK-LABEL: test_mask_mul_epu32_rmkz
2054   ;CHECK: vpmuludq (%rdi), %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf1,0xfd,0xc9,0xf4,0x07]
2055   %b = load <16 x i32>, <16 x i32>* %ptr_b
2056   %res = call <8 x i64> @llvm.x86.avx512.mask.pmulu.dq.512(<16 x i32> %a, <16 x i32> %b, <8 x i64> zeroinitializer, i8 %mask)
2057   ret < 8 x i64> %res
2058 }
2059
2060 define <8 x i64> @test_mask_mul_epu32_rmb(<16 x i32> %a, i64* %ptr_b) {
2061   ;CHECK-LABEL: test_mask_mul_epu32_rmb
2062   ;CHECK: vpmuludq (%rdi){1to8}, %zmm0, %zmm0  ## encoding: [0x62,0xf1,0xfd,0x58,0xf4,0x07]
2063   %q = load i64, i64* %ptr_b
2064   %vecinit.i = insertelement <8 x i64> undef, i64 %q, i32 0
2065   %b64 = shufflevector <8 x i64> %vecinit.i, <8 x i64> undef, <8 x i32> zeroinitializer
2066   %b = bitcast <8 x i64> %b64 to <16 x i32>
2067   %res = call <8 x i64> @llvm.x86.avx512.mask.pmulu.dq.512(<16 x i32> %a, <16 x i32> %b, <8 x i64> zeroinitializer, i8 -1)
2068   ret < 8 x i64> %res
2069 }
2070
2071 define <8 x i64> @test_mask_mul_epu32_rmbk(<16 x i32> %a, i64* %ptr_b, <8 x i64> %passThru, i8 %mask) {
2072   ;CHECK-LABEL: test_mask_mul_epu32_rmbk
2073   ;CHECK: vpmuludq (%rdi){1to8}, %zmm0, %zmm1 {%k1} ## encoding: [0x62,0xf1,0xfd,0x59,0xf4,0x0f]
2074   %q = load i64, i64* %ptr_b
2075   %vecinit.i = insertelement <8 x i64> undef, i64 %q, i32 0
2076   %b64 = shufflevector <8 x i64> %vecinit.i, <8 x i64> undef, <8 x i32> zeroinitializer
2077   %b = bitcast <8 x i64> %b64 to <16 x i32>
2078   %res = call <8 x i64> @llvm.x86.avx512.mask.pmulu.dq.512(<16 x i32> %a, <16 x i32> %b, <8 x i64> %passThru, i8 %mask)
2079   ret < 8 x i64> %res
2080 }
2081
2082 define <8 x i64> @test_mask_mul_epu32_rmbkz(<16 x i32> %a, i64* %ptr_b, i8 %mask) {
2083   ;CHECK-LABEL: test_mask_mul_epu32_rmbkz
2084   ;CHECK: vpmuludq (%rdi){1to8}, %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf1,0xfd,0xd9,0xf4,0x07]
2085   %q = load i64, i64* %ptr_b
2086   %vecinit.i = insertelement <8 x i64> undef, i64 %q, i32 0
2087   %b64 = shufflevector <8 x i64> %vecinit.i, <8 x i64> undef, <8 x i32> zeroinitializer
2088   %b = bitcast <8 x i64> %b64 to <16 x i32>
2089   %res = call <8 x i64> @llvm.x86.avx512.mask.pmulu.dq.512(<16 x i32> %a, <16 x i32> %b, <8 x i64> zeroinitializer, i8 %mask)
2090   ret < 8 x i64> %res
2091 }
2092
2093 declare <8 x i64> @llvm.x86.avx512.mask.pmulu.dq.512(<16 x i32>, <16 x i32>, <8 x i64>, i8)
2094
2095 define <16 x i32> @test_mask_mullo_epi32_rr_512(<16 x i32> %a, <16 x i32> %b) {
2096   ;CHECK-LABEL: test_mask_mullo_epi32_rr_512
2097   ;CHECK: vpmulld %zmm1, %zmm0, %zmm0 ## encoding: [0x62,0xf2,0x7d,0x48,0x40,0xc1]
2098   %res = call <16 x i32> @llvm.x86.avx512.mask.pmull.d.512(<16 x i32> %a, <16 x i32> %b, <16 x i32> zeroinitializer, i16 -1)
2099   ret <16 x i32> %res
2100 }
2101
2102 define <16 x i32> @test_mask_mullo_epi32_rrk_512(<16 x i32> %a, <16 x i32> %b, <16 x i32> %passThru, i16 %mask) {
2103   ;CHECK-LABEL: test_mask_mullo_epi32_rrk_512
2104   ;CHECK: vpmulld %zmm1, %zmm0, %zmm2 {%k1} ## encoding: [0x62,0xf2,0x7d,0x49,0x40,0xd1]
2105   %res = call <16 x i32> @llvm.x86.avx512.mask.pmull.d.512(<16 x i32> %a, <16 x i32> %b, <16 x i32> %passThru, i16 %mask)
2106   ret < 16 x i32> %res
2107 }
2108
2109 define <16 x i32> @test_mask_mullo_epi32_rrkz_512(<16 x i32> %a, <16 x i32> %b, i16 %mask) {
2110   ;CHECK-LABEL: test_mask_mullo_epi32_rrkz_512
2111   ;CHECK: vpmulld %zmm1, %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf2,0x7d,0xc9,0x40,0xc1]
2112   %res = call <16 x i32> @llvm.x86.avx512.mask.pmull.d.512(<16 x i32> %a, <16 x i32> %b, <16 x i32> zeroinitializer, i16 %mask)
2113   ret < 16 x i32> %res
2114 }
2115
2116 define <16 x i32> @test_mask_mullo_epi32_rm_512(<16 x i32> %a, <16 x i32>* %ptr_b) {
2117   ;CHECK-LABEL: test_mask_mullo_epi32_rm_512
2118   ;CHECK: vpmulld (%rdi), %zmm0, %zmm0 ## encoding: [0x62,0xf2,0x7d,0x48,0x40,0x07]
2119   %b = load <16 x i32>, <16 x i32>* %ptr_b
2120   %res = call <16 x i32> @llvm.x86.avx512.mask.pmull.d.512(<16 x i32> %a, <16 x i32> %b, <16 x i32> zeroinitializer, i16 -1)
2121   ret < 16 x i32> %res
2122 }
2123
2124 define <16 x i32> @test_mask_mullo_epi32_rmk_512(<16 x i32> %a, <16 x i32>* %ptr_b, <16 x i32> %passThru, i16 %mask) {
2125   ;CHECK-LABEL: test_mask_mullo_epi32_rmk_512
2126   ;CHECK: vpmulld (%rdi), %zmm0, %zmm1 {%k1} ## encoding: [0x62,0xf2,0x7d,0x49,0x40,0x0f]
2127   %b = load <16 x i32>, <16 x i32>* %ptr_b
2128   %res = call <16 x i32> @llvm.x86.avx512.mask.pmull.d.512(<16 x i32> %a, <16 x i32> %b, <16 x i32> %passThru, i16 %mask)
2129   ret < 16 x i32> %res
2130 }
2131
2132 define <16 x i32> @test_mask_mullo_epi32_rmkz_512(<16 x i32> %a, <16 x i32>* %ptr_b, i16 %mask) {
2133   ;CHECK-LABEL: test_mask_mullo_epi32_rmkz_512
2134   ;CHECK: vpmulld (%rdi), %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf2,0x7d,0xc9,0x40,0x07]
2135   %b = load <16 x i32>, <16 x i32>* %ptr_b
2136   %res = call <16 x i32> @llvm.x86.avx512.mask.pmull.d.512(<16 x i32> %a, <16 x i32> %b, <16 x i32> zeroinitializer, i16 %mask)
2137   ret < 16 x i32> %res
2138 }
2139
2140 define <16 x i32> @test_mask_mullo_epi32_rmb_512(<16 x i32> %a, i32* %ptr_b) {
2141   ;CHECK-LABEL: test_mask_mullo_epi32_rmb_512
2142   ;CHECK: vpmulld (%rdi){1to16}, %zmm0, %zmm0 ## encoding: [0x62,0xf2,0x7d,0x58,0x40,0x07]
2143   %q = load i32, i32* %ptr_b
2144   %vecinit.i = insertelement <16 x i32> undef, i32 %q, i32 0
2145   %b = shufflevector <16 x i32> %vecinit.i, <16 x i32> undef, <16 x i32> zeroinitializer
2146   %res = call <16 x i32> @llvm.x86.avx512.mask.pmull.d.512(<16 x i32> %a, <16 x i32> %b, <16 x i32> zeroinitializer, i16 -1)
2147   ret < 16 x i32> %res
2148 }
2149
2150 define <16 x i32> @test_mask_mullo_epi32_rmbk_512(<16 x i32> %a, i32* %ptr_b, <16 x i32> %passThru, i16 %mask) {
2151   ;CHECK-LABEL: test_mask_mullo_epi32_rmbk_512
2152   ;CHECK: vpmulld (%rdi){1to16}, %zmm0, %zmm1 {%k1} ## encoding: [0x62,0xf2,0x7d,0x59,0x40,0x0f]
2153   %q = load i32, i32* %ptr_b
2154   %vecinit.i = insertelement <16 x i32> undef, i32 %q, i32 0
2155   %b = shufflevector <16 x i32> %vecinit.i, <16 x i32> undef, <16 x i32> zeroinitializer
2156   %res = call <16 x i32> @llvm.x86.avx512.mask.pmull.d.512(<16 x i32> %a, <16 x i32> %b, <16 x i32> %passThru, i16 %mask)
2157   ret < 16 x i32> %res
2158 }
2159
2160 define <16 x i32> @test_mask_mullo_epi32_rmbkz_512(<16 x i32> %a, i32* %ptr_b, i16 %mask) {
2161   ;CHECK-LABEL: test_mask_mullo_epi32_rmbkz_512
2162   ;CHECK: vpmulld (%rdi){1to16}, %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf2,0x7d,0xd9,0x40,0x07]
2163   %q = load i32, i32* %ptr_b
2164   %vecinit.i = insertelement <16 x i32> undef, i32 %q, i32 0
2165   %b = shufflevector <16 x i32> %vecinit.i, <16 x i32> undef, <16 x i32> zeroinitializer
2166   %res = call <16 x i32> @llvm.x86.avx512.mask.pmull.d.512(<16 x i32> %a, <16 x i32> %b, <16 x i32> zeroinitializer, i16 %mask)
2167   ret < 16 x i32> %res
2168 }
2169
2170 declare <16 x i32> @llvm.x86.avx512.mask.pmull.d.512(<16 x i32>, <16 x i32>, <16 x i32>, i16)
2171
2172 define <16 x float> @test_mm512_maskz_add_round_ps_rn_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2173   ;CHECK-LABEL: test_mm512_maskz_add_round_ps_rn_sae
2174   ;CHECK: vaddps {rn-sae}, %zmm1, %zmm0, %zmm0 {%k1} {z}
2175   %res = call <16 x float> @llvm.x86.avx512.mask.add.ps.512(<16 x float> %a0, <16 x float> %a1, <16 x float>zeroinitializer, i16 %mask, i32 0)
2176   ret <16 x float> %res
2177 }
2178 define <16 x float> @test_mm512_maskz_add_round_ps_rd_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2179   ;CHECK-LABEL: test_mm512_maskz_add_round_ps_rd_sae
2180   ;CHECK: vaddps {rd-sae}, %zmm1, %zmm0, %zmm0
2181   %res = call <16 x float> @llvm.x86.avx512.mask.add.ps.512(<16 x float> %a0, <16 x float> %a1, <16 x float>zeroinitializer, i16 %mask, i32 1)
2182   ret <16 x float> %res
2183 }
2184 define <16 x float> @test_mm512_maskz_add_round_ps_ru_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2185   ;CHECK-LABEL: test_mm512_maskz_add_round_ps_ru_sae
2186   ;CHECK: vaddps  {ru-sae}, %zmm1, %zmm0, %zmm0  {%k1} {z}
2187   %res = call <16 x float> @llvm.x86.avx512.mask.add.ps.512(<16 x float> %a0, <16 x float> %a1, <16 x float>zeroinitializer, i16 %mask, i32 2)
2188   ret <16 x float> %res
2189 }
2190
2191 define <16 x float> @test_mm512_maskz_add_round_ps_rz_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2192   ;CHECK-LABEL: test_mm512_maskz_add_round_ps_rz_sae
2193   ;CHECK: vaddps  {rz-sae}, %zmm1, %zmm0, %zmm0 {%k1} {z}
2194   %res = call <16 x float> @llvm.x86.avx512.mask.add.ps.512(<16 x float> %a0, <16 x float> %a1, <16 x float>zeroinitializer, i16 %mask, i32 3)
2195   ret <16 x float> %res
2196 }
2197
2198
2199 define <16 x float> @test_mm512_maskz_add_round_ps_current(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2200   ;CHECK-LABEL: test_mm512_maskz_add_round_ps_current
2201   ;CHECK: vaddps %zmm1, %zmm0, %zmm0 {%k1} {z}
2202   %res = call <16 x float> @llvm.x86.avx512.mask.add.ps.512(<16 x float> %a0, <16 x float> %a1, <16 x float>zeroinitializer, i16 %mask, i32 4)
2203   ret <16 x float> %res
2204 }
2205
2206 define <16 x float> @test_mm512_mask_add_round_ps_rn_sae(<16 x float> %a0, <16 x float> %a1, <16 x float> %src, i16 %mask) {
2207   ;CHECK-LABEL: test_mm512_mask_add_round_ps_rn_sae
2208   ;CHECK: vaddps {rn-sae}, %zmm1, %zmm0, %zmm2 {%k1} 
2209   %res = call <16 x float> @llvm.x86.avx512.mask.add.ps.512(<16 x float> %a0, <16 x float> %a1, <16 x float> %src, i16 %mask, i32 0)
2210   ret <16 x float> %res
2211 }
2212 define <16 x float> @test_mm512_mask_add_round_ps_rd_sae(<16 x float> %a0, <16 x float> %a1, <16 x float> %src, i16 %mask) {
2213   ;CHECK-LABEL: test_mm512_mask_add_round_ps_rd_sae
2214   ;CHECK: vaddps {rd-sae}, %zmm1, %zmm0, %zmm2 {%k1} 
2215   %res = call <16 x float> @llvm.x86.avx512.mask.add.ps.512(<16 x float> %a0, <16 x float> %a1, <16 x float> %src, i16 %mask, i32 1)
2216   ret <16 x float> %res
2217 }
2218 define <16 x float> @test_mm512_mask_add_round_ps_ru_sae(<16 x float> %a0, <16 x float> %a1, <16 x float> %src, i16 %mask) {
2219   ;CHECK-LABEL: test_mm512_mask_add_round_ps_ru_sae
2220   ;CHECK: vaddps  {ru-sae}, %zmm1, %zmm0, %zmm2 {%k1} 
2221   %res = call <16 x float> @llvm.x86.avx512.mask.add.ps.512(<16 x float> %a0, <16 x float> %a1, <16 x float> %src, i16 %mask, i32 2)
2222   ret <16 x float> %res
2223 }
2224
2225 define <16 x float> @test_mm512_mask_add_round_ps_rz_sae(<16 x float> %a0, <16 x float> %a1, <16 x float> %src, i16 %mask) {
2226   ;CHECK-LABEL: test_mm512_mask_add_round_ps_rz_sae
2227   ;CHECK: vaddps  {rz-sae}, %zmm1, %zmm0, %zmm2 {%k1} 
2228   %res = call <16 x float> @llvm.x86.avx512.mask.add.ps.512(<16 x float> %a0, <16 x float> %a1, <16 x float> %src, i16 %mask, i32 3)
2229   ret <16 x float> %res
2230 }
2231
2232
2233 define <16 x float> @test_mm512_mask_add_round_ps_current(<16 x float> %a0, <16 x float> %a1, <16 x float> %src, i16 %mask) {
2234   ;CHECK-LABEL: test_mm512_mask_add_round_ps_current
2235   ;CHECK: vaddps %zmm1, %zmm0, %zmm2 {%k1} 
2236   %res = call <16 x float> @llvm.x86.avx512.mask.add.ps.512(<16 x float> %a0, <16 x float> %a1, <16 x float> %src, i16 %mask, i32 4)
2237   ret <16 x float> %res
2238 }
2239
2240
2241 define <16 x float> @test_mm512_add_round_ps_rn_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2242   ;CHECK-LABEL: test_mm512_add_round_ps_rn_sae
2243   ;CHECK: vaddps {rn-sae}, %zmm1, %zmm0, %zmm0
2244   %res = call <16 x float> @llvm.x86.avx512.mask.add.ps.512(<16 x float> %a0, <16 x float> %a1, <16 x float>zeroinitializer, i16 -1, i32 0)
2245   ret <16 x float> %res
2246 }
2247 define <16 x float> @test_mm512_add_round_ps_rd_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2248   ;CHECK-LABEL: test_mm512_add_round_ps_rd_sae
2249   ;CHECK: vaddps {rd-sae}, %zmm1, %zmm0, %zmm0
2250   %res = call <16 x float> @llvm.x86.avx512.mask.add.ps.512(<16 x float> %a0, <16 x float> %a1, <16 x float>zeroinitializer, i16 -1, i32 1)
2251   ret <16 x float> %res
2252 }
2253 define <16 x float> @test_mm512_add_round_ps_ru_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2254   ;CHECK-LABEL: test_mm512_add_round_ps_ru_sae
2255   ;CHECK: vaddps  {ru-sae}, %zmm1, %zmm0, %zmm0
2256   %res = call <16 x float> @llvm.x86.avx512.mask.add.ps.512(<16 x float> %a0, <16 x float> %a1, <16 x float>zeroinitializer, i16 -1, i32 2)
2257   ret <16 x float> %res
2258 }
2259
2260 define <16 x float> @test_mm512_add_round_ps_rz_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2261   ;CHECK-LABEL: test_mm512_add_round_ps_rz_sae
2262   ;CHECK: vaddps  {rz-sae}, %zmm1, %zmm0, %zmm0
2263   %res = call <16 x float> @llvm.x86.avx512.mask.add.ps.512(<16 x float> %a0, <16 x float> %a1, <16 x float>zeroinitializer, i16 -1, i32 3)
2264   ret <16 x float> %res
2265 }
2266
2267 define <16 x float> @test_mm512_add_round_ps_current(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2268   ;CHECK-LABEL: test_mm512_add_round_ps_current
2269   ;CHECK: vaddps %zmm1, %zmm0, %zmm0
2270   %res = call <16 x float> @llvm.x86.avx512.mask.add.ps.512(<16 x float> %a0, <16 x float> %a1, <16 x float>zeroinitializer, i16 -1, i32 4)
2271   ret <16 x float> %res
2272 }
2273 declare <16 x float> @llvm.x86.avx512.mask.add.ps.512(<16 x float>, <16 x float>, <16 x float>, i16, i32)
2274
2275 define <16 x float> @test_mm512_mask_sub_round_ps_rn_sae(<16 x float> %a0, <16 x float> %a1, <16 x float> %src, i16 %mask) {
2276   ;CHECK-LABEL: test_mm512_mask_sub_round_ps_rn_sae
2277   ;CHECK: vsubps {rn-sae}, %zmm1, %zmm0, %zmm2 {%k1} 
2278   %res = call <16 x float> @llvm.x86.avx512.mask.sub.ps.512(<16 x float> %a0, <16 x float> %a1, <16 x float> %src, i16 %mask, i32 0)
2279   ret <16 x float> %res
2280 }
2281 define <16 x float> @test_mm512_mask_sub_round_ps_rd_sae(<16 x float> %a0, <16 x float> %a1, <16 x float> %src, i16 %mask) {
2282   ;CHECK-LABEL: test_mm512_mask_sub_round_ps_rd_sae
2283   ;CHECK: vsubps {rd-sae}, %zmm1, %zmm0, %zmm2 {%k1} 
2284   %res = call <16 x float> @llvm.x86.avx512.mask.sub.ps.512(<16 x float> %a0, <16 x float> %a1, <16 x float> %src, i16 %mask, i32 1)
2285   ret <16 x float> %res
2286 }
2287 define <16 x float> @test_mm512_mask_sub_round_ps_ru_sae(<16 x float> %a0, <16 x float> %a1, <16 x float> %src, i16 %mask) {
2288   ;CHECK-LABEL: test_mm512_mask_sub_round_ps_ru_sae
2289   ;CHECK: vsubps  {ru-sae}, %zmm1, %zmm0, %zmm2 {%k1} 
2290   %res = call <16 x float> @llvm.x86.avx512.mask.sub.ps.512(<16 x float> %a0, <16 x float> %a1, <16 x float> %src, i16 %mask, i32 2)
2291   ret <16 x float> %res
2292 }
2293
2294 define <16 x float> @test_mm512_mask_sub_round_ps_rz_sae(<16 x float> %a0, <16 x float> %a1, <16 x float> %src, i16 %mask) {
2295   ;CHECK-LABEL: test_mm512_mask_sub_round_ps_rz_sae
2296   ;CHECK: vsubps  {rz-sae}, %zmm1, %zmm0, %zmm2 {%k1} 
2297   %res = call <16 x float> @llvm.x86.avx512.mask.sub.ps.512(<16 x float> %a0, <16 x float> %a1, <16 x float> %src, i16 %mask, i32 3)
2298   ret <16 x float> %res
2299 }
2300
2301
2302 define <16 x float> @test_mm512_mask_sub_round_ps_current(<16 x float> %a0, <16 x float> %a1, <16 x float> %src, i16 %mask) {
2303   ;CHECK-LABEL: test_mm512_mask_sub_round_ps_current
2304   ;CHECK: vsubps %zmm1, %zmm0, %zmm2 {%k1} 
2305   %res = call <16 x float> @llvm.x86.avx512.mask.sub.ps.512(<16 x float> %a0, <16 x float> %a1, <16 x float> %src, i16 %mask, i32 4)
2306   ret <16 x float> %res
2307 }
2308
2309 define <16 x float> @test_mm512_sub_round_ps_rn_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2310   ;CHECK-LABEL: test_mm512_sub_round_ps_rn_sae
2311   ;CHECK: vsubps {rn-sae}, %zmm1, %zmm0, %zmm0
2312   %res = call <16 x float> @llvm.x86.avx512.mask.sub.ps.512(<16 x float> %a0, <16 x float> %a1, <16 x float>zeroinitializer, i16 -1, i32 0)
2313   ret <16 x float> %res
2314 }
2315 define <16 x float> @test_mm512_sub_round_ps_rd_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2316   ;CHECK-LABEL: test_mm512_sub_round_ps_rd_sae
2317   ;CHECK: vsubps {rd-sae}, %zmm1, %zmm0, %zmm0
2318   %res = call <16 x float> @llvm.x86.avx512.mask.sub.ps.512(<16 x float> %a0, <16 x float> %a1, <16 x float>zeroinitializer, i16 -1, i32 1)
2319   ret <16 x float> %res
2320 }
2321 define <16 x float> @test_mm512_sub_round_ps_ru_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2322   ;CHECK-LABEL: test_mm512_sub_round_ps_ru_sae
2323   ;CHECK: vsubps  {ru-sae}, %zmm1, %zmm0, %zmm0
2324   %res = call <16 x float> @llvm.x86.avx512.mask.sub.ps.512(<16 x float> %a0, <16 x float> %a1, <16 x float>zeroinitializer, i16 -1, i32 2)
2325   ret <16 x float> %res
2326 }
2327
2328 define <16 x float> @test_mm512_sub_round_ps_rz_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2329   ;CHECK-LABEL: test_mm512_sub_round_ps_rz_sae
2330   ;CHECK: vsubps  {rz-sae}, %zmm1, %zmm0, %zmm0
2331   %res = call <16 x float> @llvm.x86.avx512.mask.sub.ps.512(<16 x float> %a0, <16 x float> %a1, <16 x float>zeroinitializer, i16 -1, i32 3)
2332   ret <16 x float> %res
2333 }
2334
2335 define <16 x float> @test_mm512_sub_round_ps_current(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2336   ;CHECK-LABEL: test_mm512_sub_round_ps_current
2337   ;CHECK: vsubps %zmm1, %zmm0, %zmm0
2338   %res = call <16 x float> @llvm.x86.avx512.mask.sub.ps.512(<16 x float> %a0, <16 x float> %a1, <16 x float>zeroinitializer, i16 -1, i32 4)
2339   ret <16 x float> %res
2340 }
2341
2342 define <16 x float> @test_mm512_maskz_div_round_ps_rn_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2343   ;CHECK-LABEL: test_mm512_maskz_div_round_ps_rn_sae
2344   ;CHECK: vdivps {rn-sae}, %zmm1, %zmm0, %zmm0 {%k1} {z}
2345   %res = call <16 x float> @llvm.x86.avx512.mask.div.ps.512(<16 x float> %a0, <16 x float> %a1, <16 x float>zeroinitializer, i16 %mask, i32 0)
2346   ret <16 x float> %res
2347 }
2348 define <16 x float> @test_mm512_maskz_div_round_ps_rd_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2349   ;CHECK-LABEL: test_mm512_maskz_div_round_ps_rd_sae
2350   ;CHECK: vdivps {rd-sae}, %zmm1, %zmm0, %zmm0
2351   %res = call <16 x float> @llvm.x86.avx512.mask.div.ps.512(<16 x float> %a0, <16 x float> %a1, <16 x float>zeroinitializer, i16 %mask, i32 1)
2352   ret <16 x float> %res
2353 }
2354 define <16 x float> @test_mm512_maskz_div_round_ps_ru_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2355   ;CHECK-LABEL: test_mm512_maskz_div_round_ps_ru_sae
2356   ;CHECK: vdivps  {ru-sae}, %zmm1, %zmm0, %zmm0  {%k1} {z}
2357   %res = call <16 x float> @llvm.x86.avx512.mask.div.ps.512(<16 x float> %a0, <16 x float> %a1, <16 x float>zeroinitializer, i16 %mask, i32 2)
2358   ret <16 x float> %res
2359 }
2360
2361 define <16 x float> @test_mm512_maskz_div_round_ps_rz_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2362   ;CHECK-LABEL: test_mm512_maskz_div_round_ps_rz_sae
2363   ;CHECK: vdivps  {rz-sae}, %zmm1, %zmm0, %zmm0 {%k1} {z}
2364   %res = call <16 x float> @llvm.x86.avx512.mask.div.ps.512(<16 x float> %a0, <16 x float> %a1, <16 x float>zeroinitializer, i16 %mask, i32 3)
2365   ret <16 x float> %res
2366 }
2367
2368
2369 define <16 x float> @test_mm512_maskz_div_round_ps_current(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2370   ;CHECK-LABEL: test_mm512_maskz_div_round_ps_current
2371   ;CHECK: vdivps %zmm1, %zmm0, %zmm0 {%k1} {z}
2372   %res = call <16 x float> @llvm.x86.avx512.mask.div.ps.512(<16 x float> %a0, <16 x float> %a1, <16 x float>zeroinitializer, i16 %mask, i32 4)
2373   ret <16 x float> %res
2374 }
2375
2376 define <16 x float> @test_mm512_mask_div_round_ps_rn_sae(<16 x float> %a0, <16 x float> %a1, <16 x float> %src, i16 %mask) {
2377   ;CHECK-LABEL: test_mm512_mask_div_round_ps_rn_sae
2378   ;CHECK: vdivps {rn-sae}, %zmm1, %zmm0, %zmm2 {%k1} 
2379   %res = call <16 x float> @llvm.x86.avx512.mask.div.ps.512(<16 x float> %a0, <16 x float> %a1, <16 x float> %src, i16 %mask, i32 0)
2380   ret <16 x float> %res
2381 }
2382 define <16 x float> @test_mm512_mask_div_round_ps_rd_sae(<16 x float> %a0, <16 x float> %a1, <16 x float> %src, i16 %mask) {
2383   ;CHECK-LABEL: test_mm512_mask_div_round_ps_rd_sae
2384   ;CHECK: vdivps {rd-sae}, %zmm1, %zmm0, %zmm2 {%k1} 
2385   %res = call <16 x float> @llvm.x86.avx512.mask.div.ps.512(<16 x float> %a0, <16 x float> %a1, <16 x float> %src, i16 %mask, i32 1)
2386   ret <16 x float> %res
2387 }
2388 define <16 x float> @test_mm512_mask_div_round_ps_ru_sae(<16 x float> %a0, <16 x float> %a1, <16 x float> %src, i16 %mask) {
2389   ;CHECK-LABEL: test_mm512_mask_div_round_ps_ru_sae
2390   ;CHECK: vdivps  {ru-sae}, %zmm1, %zmm0, %zmm2 {%k1} 
2391   %res = call <16 x float> @llvm.x86.avx512.mask.div.ps.512(<16 x float> %a0, <16 x float> %a1, <16 x float> %src, i16 %mask, i32 2)
2392   ret <16 x float> %res
2393 }
2394
2395 define <16 x float> @test_mm512_mask_div_round_ps_rz_sae(<16 x float> %a0, <16 x float> %a1, <16 x float> %src, i16 %mask) {
2396   ;CHECK-LABEL: test_mm512_mask_div_round_ps_rz_sae
2397   ;CHECK: vdivps  {rz-sae}, %zmm1, %zmm0, %zmm2 {%k1} 
2398   %res = call <16 x float> @llvm.x86.avx512.mask.div.ps.512(<16 x float> %a0, <16 x float> %a1, <16 x float> %src, i16 %mask, i32 3)
2399   ret <16 x float> %res
2400 }
2401
2402
2403 define <16 x float> @test_mm512_mask_div_round_ps_current(<16 x float> %a0, <16 x float> %a1, <16 x float> %src, i16 %mask) {
2404   ;CHECK-LABEL: test_mm512_mask_div_round_ps_current
2405   ;CHECK: vdivps %zmm1, %zmm0, %zmm2 {%k1} 
2406   %res = call <16 x float> @llvm.x86.avx512.mask.div.ps.512(<16 x float> %a0, <16 x float> %a1, <16 x float> %src, i16 %mask, i32 4)
2407   ret <16 x float> %res
2408 }
2409
2410
2411 define <16 x float> @test_mm512_div_round_ps_rn_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2412   ;CHECK-LABEL: test_mm512_div_round_ps_rn_sae
2413   ;CHECK: vdivps {rn-sae}, %zmm1, %zmm0, %zmm0
2414   %res = call <16 x float> @llvm.x86.avx512.mask.div.ps.512(<16 x float> %a0, <16 x float> %a1, <16 x float>zeroinitializer, i16 -1, i32 0)
2415   ret <16 x float> %res
2416 }
2417 define <16 x float> @test_mm512_div_round_ps_rd_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2418   ;CHECK-LABEL: test_mm512_div_round_ps_rd_sae
2419   ;CHECK: vdivps {rd-sae}, %zmm1, %zmm0, %zmm0
2420   %res = call <16 x float> @llvm.x86.avx512.mask.div.ps.512(<16 x float> %a0, <16 x float> %a1, <16 x float>zeroinitializer, i16 -1, i32 1)
2421   ret <16 x float> %res
2422 }
2423 define <16 x float> @test_mm512_div_round_ps_ru_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2424   ;CHECK-LABEL: test_mm512_div_round_ps_ru_sae
2425   ;CHECK: vdivps  {ru-sae}, %zmm1, %zmm0, %zmm0
2426   %res = call <16 x float> @llvm.x86.avx512.mask.div.ps.512(<16 x float> %a0, <16 x float> %a1, <16 x float>zeroinitializer, i16 -1, i32 2)
2427   ret <16 x float> %res
2428 }
2429
2430 define <16 x float> @test_mm512_div_round_ps_rz_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2431   ;CHECK-LABEL: test_mm512_div_round_ps_rz_sae
2432   ;CHECK: vdivps  {rz-sae}, %zmm1, %zmm0, %zmm0
2433   %res = call <16 x float> @llvm.x86.avx512.mask.div.ps.512(<16 x float> %a0, <16 x float> %a1, <16 x float>zeroinitializer, i16 -1, i32 3)
2434   ret <16 x float> %res
2435 }
2436
2437 define <16 x float> @test_mm512_div_round_ps_current(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2438   ;CHECK-LABEL: test_mm512_div_round_ps_current
2439   ;CHECK: vdivps %zmm1, %zmm0, %zmm0
2440   %res = call <16 x float> @llvm.x86.avx512.mask.div.ps.512(<16 x float> %a0, <16 x float> %a1, <16 x float>zeroinitializer, i16 -1, i32 4)
2441   ret <16 x float> %res
2442 }
2443 declare <16 x float> @llvm.x86.avx512.mask.div.ps.512(<16 x float>, <16 x float>, <16 x float>, i16, i32)
2444
2445 define <16 x float> @test_mm512_maskz_min_round_ps_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2446   ;CHECK-LABEL: test_mm512_maskz_min_round_ps_sae
2447   ;CHECK: vminps {sae}, %zmm1, %zmm0, %zmm0 {%k1} {z}
2448   %res = call <16 x float> @llvm.x86.avx512.mask.min.ps.512(<16 x float> %a0, <16 x float> %a1, <16 x float>zeroinitializer, i16 %mask, i32 8)
2449   ret <16 x float> %res
2450 }
2451
2452 define <16 x float> @test_mm512_maskz_min_round_ps_current(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2453   ;CHECK-LABEL: test_mm512_maskz_min_round_ps_current
2454   ;CHECK: vminps %zmm1, %zmm0, %zmm0 {%k1} {z}
2455   %res = call <16 x float> @llvm.x86.avx512.mask.min.ps.512(<16 x float> %a0, <16 x float> %a1, <16 x float>zeroinitializer, i16 %mask, i32 4)
2456   ret <16 x float> %res
2457 }
2458
2459 define <16 x float> @test_mm512_mask_min_round_ps_sae(<16 x float> %a0, <16 x float> %a1, <16 x float> %src, i16 %mask) {
2460   ;CHECK-LABEL: test_mm512_mask_min_round_ps_sae
2461   ;CHECK: vminps {sae}, %zmm1, %zmm0, %zmm2 {%k1}
2462   %res = call <16 x float> @llvm.x86.avx512.mask.min.ps.512(<16 x float> %a0, <16 x float> %a1, <16 x float> %src, i16 %mask, i32 8)
2463   ret <16 x float> %res
2464 }
2465
2466 define <16 x float> @test_mm512_mask_min_round_ps_current(<16 x float> %a0, <16 x float> %a1, <16 x float> %src, i16 %mask) {
2467   ;CHECK-LABEL: test_mm512_mask_min_round_ps_current
2468   ;CHECK: vminps %zmm1, %zmm0, %zmm2 {%k1} 
2469   %res = call <16 x float> @llvm.x86.avx512.mask.min.ps.512(<16 x float> %a0, <16 x float> %a1, <16 x float> %src, i16 %mask, i32 4)
2470   ret <16 x float> %res
2471 }
2472
2473 define <16 x float> @test_mm512_min_round_ps_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2474   ;CHECK-LABEL: test_mm512_min_round_ps_sae
2475   ;CHECK: vminps {sae}, %zmm1, %zmm0, %zmm0
2476   %res = call <16 x float> @llvm.x86.avx512.mask.min.ps.512(<16 x float> %a0, <16 x float> %a1, <16 x float>zeroinitializer, i16 -1, i32 8)
2477   ret <16 x float> %res
2478 }
2479
2480 define <16 x float> @test_mm512_min_round_ps_current(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2481   ;CHECK-LABEL: test_mm512_min_round_ps_current
2482   ;CHECK: vminps %zmm1, %zmm0, %zmm0
2483   %res = call <16 x float> @llvm.x86.avx512.mask.min.ps.512(<16 x float> %a0, <16 x float> %a1, <16 x float>zeroinitializer, i16 -1, i32 4)
2484   ret <16 x float> %res
2485 }
2486 declare <16 x float> @llvm.x86.avx512.mask.min.ps.512(<16 x float>, <16 x float>, <16 x float>, i16, i32)
2487
2488 define <16 x float> @test_mm512_maskz_max_round_ps_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2489   ;CHECK-LABEL: test_mm512_maskz_max_round_ps_sae
2490   ;CHECK: vmaxps {sae}, %zmm1, %zmm0, %zmm0 {%k1} {z}
2491   %res = call <16 x float> @llvm.x86.avx512.mask.max.ps.512(<16 x float> %a0, <16 x float> %a1, <16 x float>zeroinitializer, i16 %mask, i32 8)
2492   ret <16 x float> %res
2493 }
2494
2495 define <16 x float> @test_mm512_maskz_max_round_ps_current(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2496   ;CHECK-LABEL: test_mm512_maskz_max_round_ps_current
2497   ;CHECK: vmaxps %zmm1, %zmm0, %zmm0 {%k1} {z}
2498   %res = call <16 x float> @llvm.x86.avx512.mask.max.ps.512(<16 x float> %a0, <16 x float> %a1, <16 x float>zeroinitializer, i16 %mask, i32 4)
2499   ret <16 x float> %res
2500 }
2501
2502 define <16 x float> @test_mm512_mask_max_round_ps_sae(<16 x float> %a0, <16 x float> %a1, <16 x float> %src, i16 %mask) {
2503   ;CHECK-LABEL: test_mm512_mask_max_round_ps_sae
2504   ;CHECK: vmaxps {sae}, %zmm1, %zmm0, %zmm2 {%k1}
2505   %res = call <16 x float> @llvm.x86.avx512.mask.max.ps.512(<16 x float> %a0, <16 x float> %a1, <16 x float> %src, i16 %mask, i32 8)
2506   ret <16 x float> %res
2507 }
2508
2509 define <16 x float> @test_mm512_mask_max_round_ps_current(<16 x float> %a0, <16 x float> %a1, <16 x float> %src, i16 %mask) {
2510   ;CHECK-LABEL: test_mm512_mask_max_round_ps_current
2511   ;CHECK: vmaxps %zmm1, %zmm0, %zmm2 {%k1} 
2512   %res = call <16 x float> @llvm.x86.avx512.mask.max.ps.512(<16 x float> %a0, <16 x float> %a1, <16 x float> %src, i16 %mask, i32 4)
2513   ret <16 x float> %res
2514 }
2515
2516 define <16 x float> @test_mm512_max_round_ps_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2517   ;CHECK-LABEL: test_mm512_max_round_ps_sae
2518   ;CHECK: vmaxps {sae}, %zmm1, %zmm0, %zmm0 
2519   %res = call <16 x float> @llvm.x86.avx512.mask.max.ps.512(<16 x float> %a0, <16 x float> %a1, <16 x float>zeroinitializer, i16 -1, i32 8)
2520   ret <16 x float> %res
2521 }
2522
2523 define <16 x float> @test_mm512_max_round_ps_current(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2524   ;CHECK-LABEL: test_mm512_max_round_ps_current
2525   ;CHECK: vmaxps %zmm1, %zmm0, %zmm0
2526   %res = call <16 x float> @llvm.x86.avx512.mask.max.ps.512(<16 x float> %a0, <16 x float> %a1, <16 x float>zeroinitializer, i16 -1, i32 4)
2527   ret <16 x float> %res
2528 }
2529 declare <16 x float> @llvm.x86.avx512.mask.max.ps.512(<16 x float>, <16 x float>, <16 x float>, i16, i32)
2530
2531 declare <4 x float> @llvm.x86.avx512.mask.add.ss.round(<4 x float>, <4 x float>, <4 x float>, i8, i32) nounwind readnone
2532
2533 define <4 x float> @test_mask_add_ss_rn(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2, i8 %mask) {
2534 ; CHECK-LABEL: test_mask_add_ss_rn
2535 ; CHECK: vaddss  {rn-sae}, %xmm1, %xmm0, %xmm2 {%k1}
2536   %res = call <4 x float> @llvm.x86.avx512.mask.add.ss.round(<4 x float>%a0, <4 x float> %a1, <4 x float> %a2, i8 %mask, i32 0)
2537   ret <4 x float> %res
2538 }
2539
2540 define <4 x float> @test_mask_add_ss_rd(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2, i8 %mask) {
2541 ; CHECK-LABEL: test_mask_add_ss_rd
2542 ; CHECK: vaddss  {rd-sae}, %xmm1, %xmm0, %xmm2 {%k1}
2543   %res = call <4 x float> @llvm.x86.avx512.mask.add.ss.round(<4 x float>%a0, <4 x float> %a1, <4 x float> %a2, i8 %mask, i32 1)
2544   ret <4 x float> %res
2545 }
2546
2547 define <4 x float> @test_mask_add_ss_ru(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2, i8 %mask) {
2548 ; CHECK-LABEL: test_mask_add_ss_ru
2549 ; CHECK: vaddss  {ru-sae}, %xmm1, %xmm0, %xmm2 {%k1}
2550   %res = call <4 x float> @llvm.x86.avx512.mask.add.ss.round(<4 x float>%a0, <4 x float> %a1, <4 x float> %a2, i8 %mask, i32 2)
2551   ret <4 x float> %res
2552 }
2553
2554 define <4 x float> @test_mask_add_ss_rz(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2, i8 %mask) {
2555 ; CHECK-LABEL: test_mask_add_ss_rz
2556 ; CHECK: vaddss  {rz-sae}, %xmm1, %xmm0, %xmm2 {%k1}
2557   %res = call <4 x float> @llvm.x86.avx512.mask.add.ss.round(<4 x float>%a0, <4 x float> %a1, <4 x float> %a2, i8 %mask, i32 3)
2558   ret <4 x float> %res
2559 }
2560
2561 define <4 x float> @test_mask_add_ss_current(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2, i8 %mask) {
2562 ; CHECK-LABEL: test_mask_add_ss_current
2563 ; CHECK: vaddss %xmm1, %xmm0, %xmm2 {%k1}
2564   %res = call <4 x float> @llvm.x86.avx512.mask.add.ss.round(<4 x float>%a0, <4 x float> %a1, <4 x float> %a2, i8 %mask, i32 4)
2565   ret <4 x float> %res
2566 }
2567
2568 define <4 x float> @test_maskz_add_ss_rn(<4 x float> %a0, <4 x float> %a1, i8 %mask) {
2569 ; CHECK-LABEL: test_maskz_add_ss_rn
2570 ; CHECK: vaddss  {rn-sae}, %xmm1, %xmm0, %xmm0 {%k1} {z}
2571   %res = call <4 x float> @llvm.x86.avx512.mask.add.ss.round(<4 x float>%a0, <4 x float> %a1, <4 x float> zeroinitializer, i8 %mask, i32 0)
2572   ret <4 x float> %res
2573 }
2574
2575 define <4 x float> @test_add_ss_rn(<4 x float> %a0, <4 x float> %a1) {
2576 ; CHECK-LABEL: test_add_ss_rn
2577 ; CHECK: vaddss  {rn-sae}, %xmm1, %xmm0, %xmm0
2578   %res = call <4 x float> @llvm.x86.avx512.mask.add.ss.round(<4 x float>%a0, <4 x float> %a1, <4 x float> zeroinitializer, i8 -1, i32 0)
2579   ret <4 x float> %res
2580 }
2581
2582 declare <2 x double> @llvm.x86.avx512.mask.add.sd.round(<2 x double>, <2 x double>, <2 x double>, i8, i32) nounwind readnone
2583
2584 define <2 x double> @test_mask_add_sd_rn(<2 x double> %a0, <2 x double> %a1, <2 x double> %a2, i8 %mask) {
2585 ; CHECK-LABEL: test_mask_add_sd_rn
2586 ; CHECK: vaddsd  {rn-sae}, %xmm1, %xmm0, %xmm2 {%k1}
2587   %res = call <2 x double> @llvm.x86.avx512.mask.add.sd.round(<2 x double>%a0, <2 x double> %a1, <2 x double> %a2, i8 %mask, i32 0)
2588   ret <2 x double> %res
2589 }
2590
2591 define <2 x double> @test_mask_add_sd_rd(<2 x double> %a0, <2 x double> %a1, <2 x double> %a2, i8 %mask) {
2592 ; CHECK-LABEL: test_mask_add_sd_rd
2593 ; CHECK: vaddsd  {rd-sae}, %xmm1, %xmm0, %xmm2 {%k1}
2594   %res = call <2 x double> @llvm.x86.avx512.mask.add.sd.round(<2 x double>%a0, <2 x double> %a1, <2 x double> %a2, i8 %mask, i32 1)
2595   ret <2 x double> %res
2596 }
2597
2598 define <2 x double> @test_mask_add_sd_ru(<2 x double> %a0, <2 x double> %a1, <2 x double> %a2, i8 %mask) {
2599 ; CHECK-LABEL: test_mask_add_sd_ru
2600 ; CHECK: vaddsd  {ru-sae}, %xmm1, %xmm0, %xmm2 {%k1}
2601   %res = call <2 x double> @llvm.x86.avx512.mask.add.sd.round(<2 x double>%a0, <2 x double> %a1, <2 x double> %a2, i8 %mask, i32 2)
2602   ret <2 x double> %res
2603 }
2604
2605 define <2 x double> @test_mask_add_sd_rz(<2 x double> %a0, <2 x double> %a1, <2 x double> %a2, i8 %mask) {
2606 ; CHECK-LABEL: test_mask_add_sd_rz
2607 ; CHECK: vaddsd  {rz-sae}, %xmm1, %xmm0, %xmm2 {%k1}
2608   %res = call <2 x double> @llvm.x86.avx512.mask.add.sd.round(<2 x double>%a0, <2 x double> %a1, <2 x double> %a2, i8 %mask, i32 3)
2609   ret <2 x double> %res
2610 }
2611
2612 define <2 x double> @test_mask_add_sd_current(<2 x double> %a0, <2 x double> %a1, <2 x double> %a2, i8 %mask) {
2613 ; CHECK-LABEL: test_mask_add_sd_current
2614 ; CHECK: vaddsd %xmm1, %xmm0, %xmm2 {%k1}
2615   %res = call <2 x double> @llvm.x86.avx512.mask.add.sd.round(<2 x double>%a0, <2 x double> %a1, <2 x double> %a2, i8 %mask, i32 4)
2616   ret <2 x double> %res
2617 }
2618
2619 define <2 x double> @test_maskz_add_sd_rn(<2 x double> %a0, <2 x double> %a1, i8 %mask) {
2620 ; CHECK-LABEL: test_maskz_add_sd_rn
2621 ; CHECK: vaddsd  {rn-sae}, %xmm1, %xmm0, %xmm0 {%k1} {z}
2622   %res = call <2 x double> @llvm.x86.avx512.mask.add.sd.round(<2 x double>%a0, <2 x double> %a1, <2 x double> zeroinitializer, i8 %mask, i32 0)
2623   ret <2 x double> %res
2624 }
2625
2626 define <2 x double> @test_add_sd_rn(<2 x double> %a0, <2 x double> %a1) {
2627 ; CHECK-LABEL: test_add_sd_rn
2628 ; CHECK: vaddsd  {rn-sae}, %xmm1, %xmm0, %xmm0
2629   %res = call <2 x double> @llvm.x86.avx512.mask.add.sd.round(<2 x double>%a0, <2 x double> %a1, <2 x double> zeroinitializer, i8 -1, i32 0)
2630   ret <2 x double> %res
2631 }
2632
2633 declare <4 x float> @llvm.x86.avx512.mask.max.ss.round(<4 x float>, <4 x float>, <4 x float>, i8, i32) nounwind readnone
2634
2635 define <4 x float> @test_mask_max_ss_sae(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2, i8 %mask) {
2636 ; CHECK-LABEL: test_mask_max_ss_sae
2637 ; CHECK: vmaxss  {sae}, %xmm1, %xmm0, %xmm2 {%k1}
2638   %res = call <4 x float> @llvm.x86.avx512.mask.max.ss.round(<4 x float>%a0, <4 x float> %a1, <4 x float> %a2, i8 %mask, i32 8)
2639   ret <4 x float> %res
2640 }
2641
2642 define <4 x float> @test_maskz_max_ss_sae(<4 x float> %a0, <4 x float> %a1, i8 %mask) {
2643 ; CHECK-LABEL: test_maskz_max_ss_sae
2644 ; CHECK: vmaxss  {sae}, %xmm1, %xmm0, %xmm0 {%k1} {z}
2645   %res = call <4 x float> @llvm.x86.avx512.mask.max.ss.round(<4 x float>%a0, <4 x float> %a1, <4 x float> zeroinitializer, i8 %mask, i32 8)
2646   ret <4 x float> %res
2647 }
2648
2649 define <4 x float> @test_max_ss_sae(<4 x float> %a0, <4 x float> %a1) {
2650 ; CHECK-LABEL: test_max_ss_sae
2651 ; CHECK: vmaxss  {sae}, %xmm1, %xmm0, %xmm0
2652   %res = call <4 x float> @llvm.x86.avx512.mask.max.ss.round(<4 x float>%a0, <4 x float> %a1, <4 x float> zeroinitializer, i8 -1, i32 8)
2653   ret <4 x float> %res
2654 }
2655
2656 define <4 x float> @test_mask_max_ss(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2, i8 %mask) {
2657 ; CHECK-LABEL: test_mask_max_ss
2658 ; CHECK: vmaxss  %xmm1, %xmm0, %xmm2 {%k1}
2659   %res = call <4 x float> @llvm.x86.avx512.mask.max.ss.round(<4 x float>%a0, <4 x float> %a1, <4 x float> %a2, i8 %mask, i32 4)
2660   ret <4 x float> %res
2661 }
2662
2663 define <4 x float> @test_maskz_max_ss(<4 x float> %a0, <4 x float> %a1, i8 %mask) {
2664 ; CHECK-LABEL: test_maskz_max_ss
2665 ; CHECK: vmaxss  %xmm1, %xmm0, %xmm0 {%k1} {z}
2666   %res = call <4 x float> @llvm.x86.avx512.mask.max.ss.round(<4 x float>%a0, <4 x float> %a1, <4 x float> zeroinitializer, i8 %mask, i32 4)
2667   ret <4 x float> %res
2668 }
2669
2670 define <4 x float> @test_max_ss(<4 x float> %a0, <4 x float> %a1) {
2671 ; CHECK-LABEL: test_max_ss
2672 ; CHECK: vmaxss  %xmm1, %xmm0, %xmm0
2673   %res = call <4 x float> @llvm.x86.avx512.mask.max.ss.round(<4 x float>%a0, <4 x float> %a1, <4 x float> zeroinitializer, i8 -1, i32 4)
2674   ret <4 x float> %res
2675 }
2676 declare <2 x double> @llvm.x86.avx512.mask.max.sd.round(<2 x double>, <2 x double>, <2 x double>, i8, i32) nounwind readnone
2677
2678 define <2 x double> @test_mask_max_sd_sae(<2 x double> %a0, <2 x double> %a1, <2 x double> %a2, i8 %mask) {
2679 ; CHECK-LABEL: test_mask_max_sd_sae
2680 ; CHECK: vmaxsd  {sae}, %xmm1, %xmm0, %xmm2 {%k1}
2681   %res = call <2 x double> @llvm.x86.avx512.mask.max.sd.round(<2 x double>%a0, <2 x double> %a1, <2 x double> %a2, i8 %mask, i32 8)
2682   ret <2 x double> %res
2683 }
2684
2685 define <2 x double> @test_maskz_max_sd_sae(<2 x double> %a0, <2 x double> %a1, i8 %mask) {
2686 ; CHECK-LABEL: test_maskz_max_sd_sae
2687 ; CHECK: vmaxsd  {sae}, %xmm1, %xmm0, %xmm0 {%k1} {z}
2688   %res = call <2 x double> @llvm.x86.avx512.mask.max.sd.round(<2 x double>%a0, <2 x double> %a1, <2 x double> zeroinitializer, i8 %mask, i32 8)
2689   ret <2 x double> %res
2690 }
2691
2692 define <2 x double> @test_max_sd_sae(<2 x double> %a0, <2 x double> %a1) {
2693 ; CHECK-LABEL: test_max_sd_sae
2694 ; CHECK: vmaxsd  {sae}, %xmm1, %xmm0, %xmm0
2695   %res = call <2 x double> @llvm.x86.avx512.mask.max.sd.round(<2 x double>%a0, <2 x double> %a1, <2 x double> zeroinitializer, i8 -1, i32 8)
2696   ret <2 x double> %res
2697 }
2698
2699 define <2 x double> @test_mask_max_sd(<2 x double> %a0, <2 x double> %a1, <2 x double> %a2, i8 %mask) {
2700 ; CHECK-LABEL: test_mask_max_sd
2701 ; CHECK: vmaxsd  %xmm1, %xmm0, %xmm2 {%k1}
2702   %res = call <2 x double> @llvm.x86.avx512.mask.max.sd.round(<2 x double>%a0, <2 x double> %a1, <2 x double> %a2, i8 %mask, i32 4)
2703   ret <2 x double> %res
2704 }
2705
2706 define <2 x double> @test_maskz_max_sd(<2 x double> %a0, <2 x double> %a1, i8 %mask) {
2707 ; CHECK-LABEL: test_maskz_max_sd
2708 ; CHECK: vmaxsd  %xmm1, %xmm0, %xmm0 {%k1} {z}
2709   %res = call <2 x double> @llvm.x86.avx512.mask.max.sd.round(<2 x double>%a0, <2 x double> %a1, <2 x double> zeroinitializer, i8 %mask, i32 4)
2710   ret <2 x double> %res
2711 }
2712
2713 define <2 x double> @test_max_sd(<2 x double> %a0, <2 x double> %a1) {
2714 ; CHECK-LABEL: test_max_sd
2715 ; CHECK: vmaxsd  %xmm1, %xmm0, %xmm0
2716   %res = call <2 x double> @llvm.x86.avx512.mask.max.sd.round(<2 x double>%a0, <2 x double> %a1, <2 x double> zeroinitializer, i8 -1, i32 4)
2717   ret <2 x double> %res
2718 }
2719
2720 define <2 x double> @test_x86_avx512_cvtsi2sd32(<2 x double> %a, i32 %b) {
2721 ; CHECK-LABEL: test_x86_avx512_cvtsi2sd32:
2722 ; CHECK:       ## BB#0:
2723 ; CHECK-NEXT:    vcvtsi2sdl %edi, {rz-sae}, %xmm0, %xmm0 
2724 ; CHECK-NEXT:    retq 
2725   %res = call <2 x double> @llvm.x86.avx512.cvtsi2sd32(<2 x double> %a, i32 %b, i32 3) ; <<<2 x double>> [#uses=1]
2726   ret <2 x double> %res
2727 }
2728 declare <2 x double> @llvm.x86.avx512.cvtsi2sd32(<2 x double>, i32, i32) nounwind readnone
2729
2730 define <2 x double> @test_x86_avx512_cvtsi2sd64(<2 x double> %a, i64 %b) {
2731 ; CHECK-LABEL: test_x86_avx512_cvtsi2sd64:
2732 ; CHECK:       ## BB#0:
2733 ; CHECK-NEXT:    vcvtsi2sdq %rdi, {rz-sae}, %xmm0, %xmm0 
2734 ; CHECK-NEXT:    retq 
2735   %res = call <2 x double> @llvm.x86.avx512.cvtsi2sd64(<2 x double> %a, i64 %b, i32 3) ; <<<2 x double>> [#uses=1]
2736   ret <2 x double> %res
2737 }
2738 declare <2 x double> @llvm.x86.avx512.cvtsi2sd64(<2 x double>, i64, i32) nounwind readnone
2739
2740 define <4 x float> @test_x86_avx512_cvtsi2ss32(<4 x float> %a, i32 %b) {
2741 ; CHECK-LABEL: test_x86_avx512_cvtsi2ss32:
2742 ; CHECK:       ## BB#0:
2743 ; CHECK-NEXT:    vcvtsi2ssl %edi, {rz-sae}, %xmm0, %xmm0 
2744 ; CHECK-NEXT:    retq 
2745   %res = call <4 x float> @llvm.x86.avx512.cvtsi2ss32(<4 x float> %a, i32 %b, i32 3) ; <<<4 x float>> [#uses=1]
2746   ret <4 x float> %res
2747 }
2748 declare <4 x float> @llvm.x86.avx512.cvtsi2ss32(<4 x float>, i32, i32) nounwind readnone
2749
2750 define <4 x float> @test_x86_avx512_cvtsi2ss64(<4 x float> %a, i64 %b) {
2751 ; CHECK-LABEL: test_x86_avx512_cvtsi2ss64:
2752 ; CHECK:       ## BB#0:
2753 ; CHECK-NEXT:    vcvtsi2ssq %rdi, {rz-sae}, %xmm0, %xmm0 
2754 ; CHECK-NEXT:    retq 
2755   %res = call <4 x float> @llvm.x86.avx512.cvtsi2ss64(<4 x float> %a, i64 %b, i32 3) ; <<<4 x float>> [#uses=1]
2756   ret <4 x float> %res
2757 }
2758 declare <4 x float> @llvm.x86.avx512.cvtsi2ss64(<4 x float>, i64, i32) nounwind readnone
2759
2760 define <4 x float> @test_x86_avx512__mm_cvt_roundu32_ss (<4 x float> %a, i32 %b)
2761 ; CHECK-LABEL: test_x86_avx512__mm_cvt_roundu32_ss:
2762 ; CHECK:       ## BB#0:
2763 ; CHECK-NEXT:    vcvtusi2ssl %edi, {rd-sae}, %xmm0, %xmm0 
2764 ; CHECK-NEXT:    retq 
2765 {
2766   %res = call <4 x float> @llvm.x86.avx512.cvtusi2ss(<4 x float> %a, i32 %b, i32 1) ; <<<4 x float>> [#uses=1]
2767   ret <4 x float> %res
2768 }
2769
2770 define <4 x float> @test_x86_avx512__mm_cvt_roundu32_ss_mem(<4 x float> %a, i32* %ptr)
2771 ; CHECK-LABEL: test_x86_avx512__mm_cvt_roundu32_ss_mem:
2772 ; CHECK:       ## BB#0:
2773 ; CHECK-NEXT:    movl (%rdi), %eax 
2774 ; CHECK-NEXT:    vcvtusi2ssl %eax, {rd-sae}, %xmm0, %xmm0 
2775 ; CHECK-NEXT:    retq 
2776 {
2777   %b = load i32, i32* %ptr
2778   %res = call <4 x float> @llvm.x86.avx512.cvtusi2ss(<4 x float> %a, i32 %b, i32 1) ; <<<4 x float>> [#uses=1]
2779   ret <4 x float> %res
2780 }
2781
2782 define <4 x float> @test_x86_avx512__mm_cvtu32_ss(<4 x float> %a, i32 %b)
2783 ; CHECK-LABEL: test_x86_avx512__mm_cvtu32_ss:
2784 ; CHECK:       ## BB#0:
2785 ; CHECK-NEXT:    vcvtusi2ssl %edi, %xmm0, %xmm0 
2786 ; CHECK-NEXT:    retq 
2787 {
2788   %res = call <4 x float> @llvm.x86.avx512.cvtusi2ss(<4 x float> %a, i32 %b, i32 4) ; <<<4 x float>> [#uses=1]
2789   ret <4 x float> %res
2790 }
2791
2792 define <4 x float> @test_x86_avx512__mm_cvtu32_ss_mem(<4 x float> %a, i32* %ptr)
2793 ; CHECK-LABEL: test_x86_avx512__mm_cvtu32_ss_mem:
2794 ; CHECK:       ## BB#0:
2795 ; CHECK-NEXT:    vcvtusi2ssl (%rdi), %xmm0, %xmm0
2796 ; CHECK-NEXT:    retq 
2797 {
2798   %b = load i32, i32* %ptr
2799   %res = call <4 x float> @llvm.x86.avx512.cvtusi2ss(<4 x float> %a, i32 %b, i32 4) ; <<<4 x float>> [#uses=1]
2800   ret <4 x float> %res
2801 }
2802 declare <4 x float> @llvm.x86.avx512.cvtusi2ss(<4 x float>, i32, i32) nounwind readnone
2803
2804 define <4 x float> @_mm_cvt_roundu64_ss (<4 x float> %a, i64 %b)
2805 ; CHECK-LABEL: _mm_cvt_roundu64_ss:
2806 ; CHECK:       ## BB#0:
2807 ; CHECK-NEXT:    vcvtusi2ssq %rdi, {rd-sae}, %xmm0, %xmm0 
2808 ; CHECK-NEXT:    retq 
2809 {
2810   %res = call <4 x float> @llvm.x86.avx512.cvtusi642ss(<4 x float> %a, i64 %b, i32 1) ; <<<4 x float>> [#uses=1]
2811   ret <4 x float> %res
2812 }
2813
2814 define <4 x float> @_mm_cvtu64_ss(<4 x float> %a, i64 %b)
2815 ; CHECK-LABEL: _mm_cvtu64_ss:
2816 ; CHECK:       ## BB#0:
2817 ; CHECK-NEXT:    vcvtusi2ssq %rdi, %xmm0, %xmm0 
2818 ; CHECK-NEXT:    retq 
2819 {
2820   %res = call <4 x float> @llvm.x86.avx512.cvtusi642ss(<4 x float> %a, i64 %b, i32 4) ; <<<4 x float>> [#uses=1]
2821   ret <4 x float> %res
2822 }
2823 declare <4 x float> @llvm.x86.avx512.cvtusi642ss(<4 x float>, i64, i32) nounwind readnone
2824
2825 define <2 x double> @test_x86_avx512_mm_cvtu32_sd(<2 x double> %a, i32 %b)
2826 ; CHECK-LABEL: test_x86_avx512_mm_cvtu32_sd:
2827 ; CHECK:       ## BB#0:
2828 ; CHECK-NEXT:    vcvtusi2sdl %edi, %xmm0, %xmm0 
2829 ; CHECK-NEXT:    retq 
2830 {
2831   %res = call <2 x double> @llvm.x86.avx512.cvtusi2sd(<2 x double> %a, i32 %b) ; <<<2 x double>> [#uses=1]
2832   ret <2 x double> %res
2833 }
2834 declare <2 x double> @llvm.x86.avx512.cvtusi2sd(<2 x double>, i32) nounwind readnone
2835
2836 define <2 x double> @test_x86_avx512_mm_cvtu64_sd(<2 x double> %a, i64 %b)
2837 ; CHECK-LABEL: test_x86_avx512_mm_cvtu64_sd:
2838 ; CHECK:       ## BB#0:
2839 ; CHECK-NEXT:    vcvtusi2sdq %rdi, {rd-sae}, %xmm0, %xmm0 
2840 ; CHECK-NEXT:    retq 
2841 {
2842   %res = call <2 x double> @llvm.x86.avx512.cvtusi642sd(<2 x double> %a, i64 %b, i32 1) ; <<<2 x double>> [#uses=1]
2843   ret <2 x double> %res
2844 }
2845
2846 define <2 x double> @test_x86_avx512__mm_cvt_roundu64_sd(<2 x double> %a, i64 %b)
2847 ; CHECK-LABEL: test_x86_avx512__mm_cvt_roundu64_sd:
2848 ; CHECK:       ## BB#0:
2849 ; CHECK-NEXT:    vcvtusi2sdq %rdi, %xmm0, %xmm0 
2850 ; CHECK-NEXT:    retq 
2851 {
2852   %res = call <2 x double> @llvm.x86.avx512.cvtusi642sd(<2 x double> %a, i64 %b, i32 4) ; <<<2 x double>> [#uses=1]
2853   ret <2 x double> %res
2854 }
2855 declare <2 x double> @llvm.x86.avx512.cvtusi642sd(<2 x double>, i64, i32) nounwind readnone
2856
2857 define <8 x i64> @test_vpmaxq(<8 x i64> %a0, <8 x i64> %a1) {
2858   ; CHECK: vpmaxsq {{.*}}encoding: [0x62,0xf2,0xfd,0x48,0x3d,0xc1]
2859   %res = call <8 x i64> @llvm.x86.avx512.mask.pmaxs.q.512(<8 x i64> %a0, <8 x i64> %a1,
2860                     <8 x i64>zeroinitializer, i8 -1)
2861   ret <8 x i64> %res
2862 }
2863 declare <8 x i64> @llvm.x86.avx512.mask.pmaxs.q.512(<8 x i64>, <8 x i64>, <8 x i64>, i8)
2864
2865 define <16 x i32> @test_vpminud(<16 x i32> %a0, <16 x i32> %a1) {
2866   ; CHECK: vpminud {{.*}}encoding: [0x62,0xf2,0x7d,0x48,0x3b,0xc1]
2867   %res = call <16 x i32> @llvm.x86.avx512.mask.pminu.d.512(<16 x i32> %a0, <16 x i32> %a1,
2868                     <16 x i32>zeroinitializer, i16 -1)
2869   ret <16 x i32> %res
2870 }
2871 declare <16 x i32> @llvm.x86.avx512.mask.pminu.d.512(<16 x i32>, <16 x i32>, <16 x i32>, i16)
2872
2873 define <16 x i32> @test_vpmaxsd(<16 x i32> %a0, <16 x i32> %a1) {
2874   ; CHECK: vpmaxsd {{.*}}encoding: [0x62,0xf2,0x7d,0x48,0x3d,0xc1]
2875   %res = call <16 x i32> @llvm.x86.avx512.mask.pmaxs.d.512(<16 x i32> %a0, <16 x i32> %a1,
2876                     <16 x i32>zeroinitializer, i16 -1)
2877   ret <16 x i32> %res
2878 }
2879 declare <16 x i32> @llvm.x86.avx512.mask.pmaxs.d.512(<16 x i32>, <16 x i32>, <16 x i32>, i16)
2880
2881 ; CHECK-LABEL: @test_int_x86_avx512_mask_pmaxs_d_512
2882 ; CHECK-NOT: call 
2883 ; CHECK: vpmaxsd %zmm
2884 ; CHECK: {%k1} 
2885 define <16 x i32>@test_int_x86_avx512_mask_pmaxs_d_512(<16 x i32> %x0, <16 x i32> %x1, <16 x i32> %x2, i16 %x3) {
2886   %res = call <16 x i32> @llvm.x86.avx512.mask.pmaxs.d.512(<16 x i32> %x0, <16 x i32> %x1, <16 x i32> %x2, i16 %x3)
2887   %res1 = call <16 x i32> @llvm.x86.avx512.mask.pmaxs.d.512(<16 x i32> %x0, <16 x i32> %x1, <16 x i32> %x2, i16 -1)
2888   %res2 = add <16 x i32> %res, %res1
2889   ret <16 x i32> %res2
2890 }
2891
2892 ; CHECK-LABEL: @test_int_x86_avx512_mask_pmaxs_q_512
2893 ; CHECK-NOT: call 
2894 ; CHECK: vpmaxsq %zmm
2895 ; CHECK: {%k1} 
2896 define <8 x i64>@test_int_x86_avx512_mask_pmaxs_q_512(<8 x i64> %x0, <8 x i64> %x1, <8 x i64> %x2, i8 %x3) {
2897   %res = call <8 x i64> @llvm.x86.avx512.mask.pmaxs.q.512(<8 x i64> %x0, <8 x i64> %x1, <8 x i64> %x2, i8 %x3)
2898   %res1 = call <8 x i64> @llvm.x86.avx512.mask.pmaxs.q.512(<8 x i64> %x0, <8 x i64> %x1, <8 x i64> %x2, i8 -1)
2899   %res2 = add <8 x i64> %res, %res1
2900   ret <8 x i64> %res2
2901 }
2902
2903 declare <16 x i32> @llvm.x86.avx512.mask.pmaxu.d.512(<16 x i32>, <16 x i32>, <16 x i32>, i16)
2904
2905 ; CHECK-LABEL: @test_int_x86_avx512_mask_pmaxu_d_512
2906 ; CHECK-NOT: call 
2907 ; CHECK: vpmaxud %zmm
2908 ; CHECK: {%k1} 
2909 define <16 x i32>@test_int_x86_avx512_mask_pmaxu_d_512(<16 x i32> %x0, <16 x i32> %x1, <16 x i32> %x2, i16 %x3) {
2910   %res = call <16 x i32> @llvm.x86.avx512.mask.pmaxu.d.512(<16 x i32> %x0, <16 x i32> %x1, <16 x i32> %x2, i16 %x3)
2911   %res1 = call <16 x i32> @llvm.x86.avx512.mask.pmaxu.d.512(<16 x i32> %x0, <16 x i32> %x1, <16 x i32> %x2, i16 -1)
2912   %res2 = add <16 x i32> %res, %res1
2913   ret <16 x i32> %res2
2914 }
2915
2916 declare <8 x i64> @llvm.x86.avx512.mask.pmaxu.q.512(<8 x i64>, <8 x i64>, <8 x i64>, i8)
2917
2918 ; CHECK-LABEL: @test_int_x86_avx512_mask_pmaxu_q_512
2919 ; CHECK-NOT: call 
2920 ; CHECK: vpmaxuq %zmm
2921 ; CHECK: {%k1} 
2922 define <8 x i64>@test_int_x86_avx512_mask_pmaxu_q_512(<8 x i64> %x0, <8 x i64> %x1, <8 x i64> %x2, i8 %x3) {
2923   %res = call <8 x i64> @llvm.x86.avx512.mask.pmaxu.q.512(<8 x i64> %x0, <8 x i64> %x1, <8 x i64> %x2, i8 %x3)
2924   %res1 = call <8 x i64> @llvm.x86.avx512.mask.pmaxu.q.512(<8 x i64> %x0, <8 x i64> %x1, <8 x i64> %x2, i8 -1)
2925   %res2 = add <8 x i64> %res, %res1
2926   ret <8 x i64> %res2
2927 }
2928
2929 declare <16 x i32> @llvm.x86.avx512.mask.pmins.d.512(<16 x i32>, <16 x i32>, <16 x i32>, i16)
2930
2931 ; CHECK-LABEL: @test_int_x86_avx512_mask_pmins_d_512
2932 ; CHECK-NOT: call 
2933 ; CHECK: vpminsd %zmm
2934 ; CHECK: {%k1} 
2935 define <16 x i32>@test_int_x86_avx512_mask_pmins_d_512(<16 x i32> %x0, <16 x i32> %x1, <16 x i32> %x2, i16 %x3) {
2936   %res = call <16 x i32> @llvm.x86.avx512.mask.pmins.d.512(<16 x i32> %x0, <16 x i32> %x1, <16 x i32> %x2, i16 %x3)
2937   %res1 = call <16 x i32> @llvm.x86.avx512.mask.pmins.d.512(<16 x i32> %x0, <16 x i32> %x1, <16 x i32> %x2, i16 -1)
2938   %res2 = add <16 x i32> %res, %res1
2939   ret <16 x i32> %res2
2940 }
2941
2942 declare <8 x i64> @llvm.x86.avx512.mask.pmins.q.512(<8 x i64>, <8 x i64>, <8 x i64>, i8)
2943
2944 ; CHECK-LABEL: @test_int_x86_avx512_mask_pmins_q_512
2945 ; CHECK-NOT: call 
2946 ; CHECK: vpminsq %zmm
2947 ; CHECK: {%k1} 
2948 define <8 x i64>@test_int_x86_avx512_mask_pmins_q_512(<8 x i64> %x0, <8 x i64> %x1, <8 x i64> %x2, i8 %x3) {
2949   %res = call <8 x i64> @llvm.x86.avx512.mask.pmins.q.512(<8 x i64> %x0, <8 x i64> %x1, <8 x i64> %x2, i8 %x3)
2950   %res1 = call <8 x i64> @llvm.x86.avx512.mask.pmins.q.512(<8 x i64> %x0, <8 x i64> %x1, <8 x i64> %x2, i8 -1)
2951   %res2 = add <8 x i64> %res, %res1
2952   ret <8 x i64> %res2
2953 }
2954
2955 ; CHECK-LABEL: @test_int_x86_avx512_mask_pminu_d_512
2956 ; CHECK-NOT: call 
2957 ; CHECK: vpminud %zmm
2958 ; CHECK: {%k1} 
2959 define <16 x i32>@test_int_x86_avx512_mask_pminu_d_512(<16 x i32> %x0, <16 x i32> %x1, <16 x i32> %x2, i16 %x3) {
2960   %res = call <16 x i32> @llvm.x86.avx512.mask.pminu.d.512(<16 x i32> %x0, <16 x i32> %x1, <16 x i32> %x2, i16 %x3)
2961   %res1 = call <16 x i32> @llvm.x86.avx512.mask.pminu.d.512(<16 x i32> %x0, <16 x i32> %x1, <16 x i32> %x2, i16 -1)
2962   %res2 = add <16 x i32> %res, %res1
2963   ret <16 x i32> %res2
2964 }
2965
2966 declare <8 x i64> @llvm.x86.avx512.mask.pminu.q.512(<8 x i64>, <8 x i64>, <8 x i64>, i8)
2967
2968 ; CHECK-LABEL: @test_int_x86_avx512_mask_pminu_q_512
2969 ; CHECK-NOT: call 
2970 ; CHECK: vpminuq %zmm
2971 ; CHECK: {%k1} 
2972 define <8 x i64>@test_int_x86_avx512_mask_pminu_q_512(<8 x i64> %x0, <8 x i64> %x1, <8 x i64> %x2, i8 %x3) {
2973   %res = call <8 x i64> @llvm.x86.avx512.mask.pminu.q.512(<8 x i64> %x0, <8 x i64> %x1, <8 x i64> %x2, i8 %x3)
2974   %res1 = call <8 x i64> @llvm.x86.avx512.mask.pminu.q.512(<8 x i64> %x0, <8 x i64> %x1, <8 x i64> %x2, i8 -1)
2975   %res2 = add <8 x i64> %res, %res1
2976   ret <8 x i64> %res2
2977 }
2978
2979 declare <16 x i32> @llvm.x86.avx512.mask.vpermi2var.d.512(<16 x i32>, <16 x i32>, <16 x i32>, i16)
2980
2981 ; CHECK-LABEL: @test_int_x86_avx512_mask_vpermi2var_d_512
2982 ; CHECK-NOT: call 
2983 ; CHECK: kmov 
2984 ; CHECK: vpermi2d {{.*}}{%k1} 
2985 define <16 x i32>@test_int_x86_avx512_mask_vpermi2var_d_512(<16 x i32> %x0, <16 x i32> %x1, <16 x i32> %x2, i16 %x3) {
2986   %res = call <16 x i32> @llvm.x86.avx512.mask.vpermi2var.d.512(<16 x i32> %x0, <16 x i32> %x1, <16 x i32> %x2, i16 %x3)
2987   %res1 = call <16 x i32> @llvm.x86.avx512.mask.vpermi2var.d.512(<16 x i32> %x0, <16 x i32> %x1, <16 x i32> %x2, i16 -1)
2988   %res2 = add <16 x i32> %res, %res1
2989   ret <16 x i32> %res2
2990 }
2991
2992 declare <8 x double> @llvm.x86.avx512.mask.vpermi2var.pd.512(<8 x double>, <8 x i64>, <8 x double>, i8)
2993
2994 ; CHECK-LABEL: @test_int_x86_avx512_mask_vpermi2var_pd_512
2995 ; CHECK-NOT: call 
2996 ; CHECK: kmov 
2997 ; CHECK:  vpermi2pd {{.*}}{%k1} 
2998 define <8 x double>@test_int_x86_avx512_mask_vpermi2var_pd_512(<8 x double> %x0, <8 x i64> %x1, <8 x double> %x2, i8 %x3) {
2999   %res = call <8 x double> @llvm.x86.avx512.mask.vpermi2var.pd.512(<8 x double> %x0, <8 x i64> %x1, <8 x double> %x2, i8 %x3)
3000   %res1 = call <8 x double> @llvm.x86.avx512.mask.vpermi2var.pd.512(<8 x double> %x0, <8 x i64> %x1, <8 x double> %x2, i8 -1)
3001   %res2 = fadd <8 x double> %res, %res1
3002   ret <8 x double> %res2
3003 }
3004
3005 declare <16 x float> @llvm.x86.avx512.mask.vpermi2var.ps.512(<16 x float>, <16 x i32>, <16 x float>, i16)
3006
3007 ; CHECK-LABEL: @test_int_x86_avx512_mask_vpermi2var_ps_512
3008 ; CHECK-NOT: call 
3009 ; CHECK: kmov 
3010 ; CHECK: vpermi2ps {{.*}}{%k1} 
3011 define <16 x float>@test_int_x86_avx512_mask_vpermi2var_ps_512(<16 x float> %x0, <16 x i32> %x1, <16 x float> %x2, i16 %x3) {
3012   %res = call <16 x float> @llvm.x86.avx512.mask.vpermi2var.ps.512(<16 x float> %x0, <16 x i32> %x1, <16 x float> %x2, i16 %x3)
3013   %res1 = call <16 x float> @llvm.x86.avx512.mask.vpermi2var.ps.512(<16 x float> %x0, <16 x i32> %x1, <16 x float> %x2, i16 -1)
3014   %res2 = fadd <16 x float> %res, %res1
3015   ret <16 x float> %res2
3016 }
3017
3018 declare <8 x i64> @llvm.x86.avx512.mask.vpermi2var.q.512(<8 x i64>, <8 x i64>, <8 x i64>, i8)
3019
3020 ; CHECK-LABEL: @test_int_x86_avx512_mask_vpermi2var_q_512
3021 ; CHECK-NOT: call 
3022 ; CHECK: kmov 
3023 ; CHECK: vpermi2q {{.*}}{%k1} 
3024 define <8 x i64>@test_int_x86_avx512_mask_vpermi2var_q_512(<8 x i64> %x0, <8 x i64> %x1, <8 x i64> %x2, i8 %x3) {
3025   %res = call <8 x i64> @llvm.x86.avx512.mask.vpermi2var.q.512(<8 x i64> %x0, <8 x i64> %x1, <8 x i64> %x2, i8 %x3)
3026   %res1 = call <8 x i64> @llvm.x86.avx512.mask.vpermi2var.q.512(<8 x i64> %x0, <8 x i64> %x1, <8 x i64> %x2, i8 -1)
3027   %res2 = add <8 x i64> %res, %res1
3028   ret <8 x i64> %res2
3029 }
3030
3031 declare <16 x i32> @llvm.x86.avx512.maskz.vpermt2var.d.512(<16 x i32>, <16 x i32>, <16 x i32>, i16)
3032
3033 ; CHECK-LABEL: @test_int_x86_avx512_maskz_vpermt2var_d_512
3034 ; CHECK-NOT: call 
3035 ; CHECK: kmov 
3036 ; CHECK: vpermt2d {{.*}}{%k1} {z}
3037 define <16 x i32>@test_int_x86_avx512_maskz_vpermt2var_d_512(<16 x i32> %x0, <16 x i32> %x1, <16 x i32> %x2, i16 %x3) {
3038   %res = call <16 x i32> @llvm.x86.avx512.maskz.vpermt2var.d.512(<16 x i32> %x0, <16 x i32> %x1, <16 x i32> %x2, i16 %x3)
3039   %res1 = call <16 x i32> @llvm.x86.avx512.maskz.vpermt2var.d.512(<16 x i32> %x0, <16 x i32> %x1, <16 x i32> %x2, i16 -1)
3040   %res2 = add <16 x i32> %res, %res1
3041   ret <16 x i32> %res2
3042 }
3043
3044 declare <8 x double> @llvm.x86.avx512.maskz.vpermt2var.pd.512(<8 x i64>, <8 x double>, <8 x double>, i8)
3045
3046 ; CHECK-LABEL: @test_int_x86_avx512_maskz_vpermt2var_pd_512
3047 ; CHECK-NOT: call 
3048 ; CHECK: kmov 
3049 ; CHECK: vpermt2pd {{.*}}{%k1} {z}
3050 define <8 x double>@test_int_x86_avx512_maskz_vpermt2var_pd_512(<8 x i64> %x0, <8 x double> %x1, <8 x double> %x2, i8 %x3) {
3051   %res = call <8 x double> @llvm.x86.avx512.maskz.vpermt2var.pd.512(<8 x i64> %x0, <8 x double> %x1, <8 x double> %x2, i8 %x3)
3052   %res1 = call <8 x double> @llvm.x86.avx512.maskz.vpermt2var.pd.512(<8 x i64> %x0, <8 x double> %x1, <8 x double> %x2, i8 -1)
3053   %res2 = fadd <8 x double> %res, %res1
3054   ret <8 x double> %res2
3055 }
3056
3057 declare <16 x float> @llvm.x86.avx512.maskz.vpermt2var.ps.512(<16 x i32>, <16 x float>, <16 x float>, i16)
3058
3059 ; CHECK-LABEL: @test_int_x86_avx512_maskz_vpermt2var_ps_512
3060 ; CHECK-NOT: call 
3061 ; CHECK: kmov 
3062 ; CHECK: vpermt2ps {{.*}}{%k1} {z}
3063 define <16 x float>@test_int_x86_avx512_maskz_vpermt2var_ps_512(<16 x i32> %x0, <16 x float> %x1, <16 x float> %x2, i16 %x3) {
3064   %res = call <16 x float> @llvm.x86.avx512.maskz.vpermt2var.ps.512(<16 x i32> %x0, <16 x float> %x1, <16 x float> %x2, i16 %x3)
3065   %res1 = call <16 x float> @llvm.x86.avx512.maskz.vpermt2var.ps.512(<16 x i32> %x0, <16 x float> %x1, <16 x float> %x2, i16 -1)
3066   %res2 = fadd <16 x float> %res, %res1
3067   ret <16 x float> %res2
3068 }
3069
3070
3071 declare <8 x i64> @llvm.x86.avx512.maskz.vpermt2var.q.512(<8 x i64>, <8 x i64>, <8 x i64>, i8)
3072
3073 ; CHECK-LABEL: @test_int_x86_avx512_maskz_vpermt2var_q_512
3074 ; CHECK-NOT: call 
3075 ; CHECK: kmov 
3076 ; CHECK: vpermt2q {{.*}}{%k1} {z}
3077 define <8 x i64>@test_int_x86_avx512_maskz_vpermt2var_q_512(<8 x i64> %x0, <8 x i64> %x1, <8 x i64> %x2, i8 %x3) {
3078   %res = call <8 x i64> @llvm.x86.avx512.maskz.vpermt2var.q.512(<8 x i64> %x0, <8 x i64> %x1, <8 x i64> %x2, i8 %x3)
3079   %res1 = call <8 x i64> @llvm.x86.avx512.maskz.vpermt2var.q.512(<8 x i64> %x0, <8 x i64> %x1, <8 x i64> %x2, i8 -1)
3080   %res2 = add <8 x i64> %res, %res1
3081   ret <8 x i64> %res2
3082 }
3083
3084 declare <16 x i32> @llvm.x86.avx512.mask.vpermt2var.d.512(<16 x i32>, <16 x i32>, <16 x i32>, i16)
3085
3086 ; CHECK-LABEL: @test_int_x86_avx512_mask_vpermt2var_d_512
3087 ; CHECK-NOT: call 
3088 ; CHECK: kmov 
3089 ; CHECK: vpermt2d {{.*}}{%k1}
3090 ; CHECK-NOT: {z}
3091 define <16 x i32>@test_int_x86_avx512_mask_vpermt2var_d_512(<16 x i32> %x0, <16 x i32> %x1, <16 x i32> %x2, i16 %x3) {
3092   %res = call <16 x i32> @llvm.x86.avx512.mask.vpermt2var.d.512(<16 x i32> %x0, <16 x i32> %x1, <16 x i32> %x2, i16 %x3)
3093   %res1 = call <16 x i32> @llvm.x86.avx512.mask.vpermt2var.d.512(<16 x i32> %x0, <16 x i32> %x1, <16 x i32> %x2, i16 -1)
3094   %res2 = add <16 x i32> %res, %res1
3095   ret <16 x i32> %res2
3096 }
3097
3098 declare <8 x double> @llvm.x86.avx512.mask.scalef.pd.512(<8 x double>, <8 x double>, <8 x double>, i8, i32)
3099 ; CHECK-LABEL: @test_int_x86_avx512_mask_scalef_pd_512
3100 ; CHECK-NOT: call 
3101 ; CHECK: kmov 
3102 ; CHECK: vscalefpd{{.*}}{%k1} 
3103 define <8 x double>@test_int_x86_avx512_mask_scalef_pd_512(<8 x double> %x0, <8 x double> %x1, <8 x double> %x2, i8 %x3) {
3104   %res = call <8 x double> @llvm.x86.avx512.mask.scalef.pd.512(<8 x double> %x0, <8 x double> %x1, <8 x double> %x2, i8 %x3, i32 3)
3105   %res1 = call <8 x double> @llvm.x86.avx512.mask.scalef.pd.512(<8 x double> %x0, <8 x double> %x1, <8 x double> %x2, i8 -1, i32 0)
3106   %res2 = fadd <8 x double> %res, %res1
3107   ret <8 x double> %res2
3108 }
3109
3110 declare <16 x float> @llvm.x86.avx512.mask.scalef.ps.512(<16 x float>, <16 x float>, <16 x float>, i16, i32)
3111 ; CHECK-LABEL: @test_int_x86_avx512_mask_scalef_ps_512
3112 ; CHECK-NOT: call 
3113 ; CHECK: kmov 
3114 ; CHECK: vscalefps{{.*}}{%k1} 
3115 define <16 x float>@test_int_x86_avx512_mask_scalef_ps_512(<16 x float> %x0, <16 x float> %x1, <16 x float> %x2, i16 %x3) {
3116   %res = call <16 x float> @llvm.x86.avx512.mask.scalef.ps.512(<16 x float> %x0, <16 x float> %x1, <16 x float> %x2, i16 %x3, i32 2)
3117   %res1 = call <16 x float> @llvm.x86.avx512.mask.scalef.ps.512(<16 x float> %x0, <16 x float> %x1, <16 x float> %x2, i16 -1, i32 0)
3118   %res2 = fadd <16 x float> %res, %res1
3119   ret <16 x float> %res2
3120 }
3121
3122 declare <8 x double> @llvm.x86.avx512.mask.cvtdq2pd.512(<8 x i32>, <8 x double>, i8)
3123
3124 define <8 x double>@test_int_x86_avx512_mask_cvt_dq2pd_512(<8 x i32> %x0, <8 x double> %x1, i8 %x2) {
3125 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_dq2pd_512:
3126 ; CHECK:       ## BB#0:
3127 ; CHECK-NEXT:    movzbl %dil, %eax
3128 ; CHECK-NEXT:    kmovw %eax, %k1
3129 ; CHECK-NEXT:    vcvtdq2pd %ymm0, %zmm1 {%k1}
3130 ; CHECK-NEXT:    vcvtdq2pd %ymm0, %zmm0
3131 ; CHECK-NEXT:    vaddpd %zmm0, %zmm1, %zmm0
3132 ; CHECK-NEXT:    retq
3133   %res = call <8 x double> @llvm.x86.avx512.mask.cvtdq2pd.512(<8 x i32> %x0, <8 x double> %x1, i8 %x2)
3134   %res1 = call <8 x double> @llvm.x86.avx512.mask.cvtdq2pd.512(<8 x i32> %x0, <8 x double> %x1, i8 -1)
3135   %res2 = fadd <8 x double> %res, %res1
3136   ret <8 x double> %res2
3137 }
3138
3139 declare <16 x float> @llvm.x86.avx512.mask.cvtdq2ps.512(<16 x i32>, <16 x float>, i16, i32)
3140
3141 define <16 x float>@test_int_x86_avx512_mask_cvt_dq2ps_512(<16 x i32> %x0, <16 x float> %x1, i16 %x2) {
3142 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_dq2ps_512:
3143 ; CHECK:       ## BB#0:
3144 ; CHECK-NEXT:    kmovw %edi, %k1
3145 ; CHECK-NEXT:    vcvtdq2ps %zmm0, %zmm1 {%k1}
3146 ; CHECK-NEXT:    vcvtdq2ps {rn-sae}, %zmm0, %zmm0
3147 ; CHECK-NEXT:    vaddps %zmm0, %zmm1, %zmm0
3148 ; CHECK-NEXT:    retq
3149   %res = call <16 x float> @llvm.x86.avx512.mask.cvtdq2ps.512(<16 x i32> %x0, <16 x float> %x1, i16 %x2, i32 4)
3150   %res1 = call <16 x float> @llvm.x86.avx512.mask.cvtdq2ps.512(<16 x i32> %x0, <16 x float> %x1, i16 -1, i32 0)
3151   %res2 = fadd <16 x float> %res, %res1
3152   ret <16 x float> %res2
3153 }
3154
3155 declare <8 x i32> @llvm.x86.avx512.mask.cvtpd2dq.512(<8 x double>, <8 x i32>, i8, i32)
3156
3157 define <8 x i32>@test_int_x86_avx512_mask_cvt_pd2dq_512(<8 x double> %x0, <8 x i32> %x1, i8 %x2) {
3158 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_pd2dq_512:
3159 ; CHECK:       ## BB#0:
3160 ; CHECK-NEXT:    movzbl %dil, %eax
3161 ; CHECK-NEXT:    kmovw %eax, %k1
3162 ; CHECK-NEXT:    vcvtpd2dq %zmm0, %ymm1 {%k1}
3163 ; CHECK-NEXT:    vcvtpd2dq {rn-sae}, %zmm0, %ymm0
3164 ; CHECK-NEXT:    vpaddd %ymm0, %ymm1, %ymm0
3165 ; CHECK-NEXT:    retq
3166   %res = call <8 x i32> @llvm.x86.avx512.mask.cvtpd2dq.512(<8 x double> %x0, <8 x i32> %x1, i8 %x2, i32 4)
3167   %res1 = call <8 x i32> @llvm.x86.avx512.mask.cvtpd2dq.512(<8 x double> %x0, <8 x i32> %x1, i8 -1, i32 0)
3168   %res2 = add <8 x i32> %res, %res1
3169   ret <8 x i32> %res2
3170 }
3171
3172 declare <8 x float> @llvm.x86.avx512.mask.cvtpd2ps.512(<8 x double>, <8 x float>, i8, i32)
3173
3174 define <8 x float>@test_int_x86_avx512_mask_cvt_pd2ps_512(<8 x double> %x0, <8 x float> %x1, i8 %x2) {
3175 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_pd2ps_512:
3176 ; CHECK:       ## BB#0:
3177 ; CHECK-NEXT:    movzbl %dil, %eax
3178 ; CHECK-NEXT:    kmovw %eax, %k1
3179 ; CHECK-NEXT:    vcvtpd2ps %zmm0, %ymm1 {%k1}
3180 ; CHECK-NEXT:    vcvtpd2ps {ru-sae}, %zmm0, %ymm0
3181 ; CHECK-NEXT:    vaddps %ymm0, %ymm1, %ymm0
3182 ; CHECK-NEXT:    retq
3183   %res = call <8 x float> @llvm.x86.avx512.mask.cvtpd2ps.512(<8 x double> %x0, <8 x float> %x1, i8 %x2, i32 4)
3184   %res1 = call <8 x float> @llvm.x86.avx512.mask.cvtpd2ps.512(<8 x double> %x0, <8 x float> %x1, i8 -1, i32 2)
3185   %res2 = fadd <8 x float> %res, %res1
3186   ret <8 x float> %res2
3187 }
3188
3189 declare <8 x i32> @llvm.x86.avx512.mask.cvtpd2udq.512(<8 x double>, <8 x i32>, i8, i32)
3190
3191 define <8 x i32>@test_int_x86_avx512_mask_cvt_pd2udq_512(<8 x double> %x0, <8 x i32> %x1, i8 %x2) {
3192 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_pd2udq_512:
3193 ; CHECK:       ## BB#0:
3194 ; CHECK-NEXT:    movzbl %dil, %eax
3195 ; CHECK-NEXT:    kmovw %eax, %k1
3196 ; CHECK-NEXT:    vcvtpd2udq {ru-sae}, %zmm0, %ymm1 {%k1}
3197 ; CHECK-NEXT:    vcvtpd2udq {rn-sae}, %zmm0, %ymm0
3198 ; CHECK-NEXT:    vpaddd %ymm0, %ymm1, %ymm0
3199 ; CHECK-NEXT:    retq
3200   %res = call <8 x i32> @llvm.x86.avx512.mask.cvtpd2udq.512(<8 x double> %x0, <8 x i32> %x1, i8 %x2, i32 2)
3201   %res1 = call <8 x i32> @llvm.x86.avx512.mask.cvtpd2udq.512(<8 x double> %x0, <8 x i32> %x1, i8 -1, i32 0)
3202   %res2 = add <8 x i32> %res, %res1
3203   ret <8 x i32> %res2
3204 }
3205
3206 declare <16 x i32> @llvm.x86.avx512.mask.cvtps2dq.512(<16 x float>, <16 x i32>, i16, i32)
3207
3208 define <16 x i32>@test_int_x86_avx512_mask_cvt_ps2dq_512(<16 x float> %x0, <16 x i32> %x1, i16 %x2) {
3209 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_ps2dq_512:
3210 ; CHECK:       ## BB#0:
3211 ; CHECK-NEXT:    kmovw %edi, %k1
3212 ; CHECK-NEXT:    vcvtps2dq {ru-sae}, %zmm0, %zmm1 {%k1}
3213 ; CHECK-NEXT:    vcvtps2dq {rn-sae}, %zmm0, %zmm0
3214 ; CHECK-NEXT:    vpaddd %zmm0, %zmm1, %zmm0
3215 ; CHECK-NEXT:    retq
3216   %res = call <16 x i32> @llvm.x86.avx512.mask.cvtps2dq.512(<16 x float> %x0, <16 x i32> %x1, i16 %x2, i32 2)
3217   %res1 = call <16 x i32> @llvm.x86.avx512.mask.cvtps2dq.512(<16 x float> %x0, <16 x i32> %x1, i16 -1, i32 0)
3218   %res2 = add <16 x i32> %res, %res1
3219   ret <16 x i32> %res2
3220 }
3221
3222 declare <8 x double> @llvm.x86.avx512.mask.cvtps2pd.512(<8 x float>, <8 x double>, i8, i32)
3223
3224 define <8 x double>@test_int_x86_avx512_mask_cvt_ps2pd_512(<8 x float> %x0, <8 x double> %x1, i8 %x2) {
3225 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_ps2pd_512:
3226 ; CHECK:       ## BB#0:
3227 ; CHECK-NEXT:    movzbl %dil, %eax
3228 ; CHECK-NEXT:    kmovw %eax, %k1
3229 ; CHECK-NEXT:    vcvtps2pd %ymm0, %zmm1 {%k1}
3230 ; CHECK-NEXT:    vcvtps2pd {sae}, %ymm0, %zmm0
3231 ; CHECK-NEXT:    vaddpd %zmm0, %zmm1, %zmm0
3232 ; CHECK-NEXT:    retq
3233   %res = call <8 x double> @llvm.x86.avx512.mask.cvtps2pd.512(<8 x float> %x0, <8 x double> %x1, i8 %x2, i32 4)
3234   %res1 = call <8 x double> @llvm.x86.avx512.mask.cvtps2pd.512(<8 x float> %x0, <8 x double> %x1, i8 -1, i32 8)
3235   %res2 = fadd <8 x double> %res, %res1
3236   ret <8 x double> %res2
3237 }
3238
3239 declare <16 x i32> @llvm.x86.avx512.mask.cvtps2udq.512(<16 x float>, <16 x i32>, i16, i32)
3240
3241 define <16 x i32>@test_int_x86_avx512_mask_cvt_ps2udq_512(<16 x float> %x0, <16 x i32> %x1, i16 %x2) {
3242 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_ps2udq_512:
3243 ; CHECK:       ## BB#0:
3244 ; CHECK-NEXT:    kmovw %edi, %k1
3245 ; CHECK-NEXT:    vcvtps2udq {ru-sae}, %zmm0, %zmm1 {%k1}
3246 ; CHECK-NEXT:    vcvtps2udq {rn-sae}, %zmm0, %zmm0
3247 ; CHECK-NEXT:    vpaddd %zmm0, %zmm1, %zmm0
3248 ; CHECK-NEXT:    retq
3249   %res = call <16 x i32> @llvm.x86.avx512.mask.cvtps2udq.512(<16 x float> %x0, <16 x i32> %x1, i16 %x2, i32 2)
3250   %res1 = call <16 x i32> @llvm.x86.avx512.mask.cvtps2udq.512(<16 x float> %x0, <16 x i32> %x1, i16 -1, i32 0)
3251   %res2 = add <16 x i32> %res, %res1
3252   ret <16 x i32> %res2
3253 }
3254
3255 declare <8 x i32> @llvm.x86.avx512.mask.cvttpd2dq.512(<8 x double>, <8 x i32>, i8, i32)
3256
3257 define <8 x i32>@test_int_x86_avx512_mask_cvtt_pd2dq_512(<8 x double> %x0, <8 x i32> %x1, i8 %x2) {
3258 ; CHECK-LABEL: test_int_x86_avx512_mask_cvtt_pd2dq_512:
3259 ; CHECK:       ## BB#0:
3260 ; CHECK-NEXT:    movzbl %dil, %eax
3261 ; CHECK-NEXT:    kmovw %eax, %k1
3262 ; CHECK-NEXT:    vcvttpd2dq %zmm0, %ymm1 {%k1}
3263 ; CHECK-NEXT:    vcvttpd2dq {sae}, %zmm0, %ymm0
3264 ; CHECK-NEXT:    vpaddd %ymm0, %ymm1, %ymm0
3265 ; CHECK-NEXT:    retq
3266   %res = call <8 x i32> @llvm.x86.avx512.mask.cvttpd2dq.512(<8 x double> %x0, <8 x i32> %x1, i8 %x2, i32 4)
3267   %res1 = call <8 x i32> @llvm.x86.avx512.mask.cvttpd2dq.512(<8 x double> %x0, <8 x i32> %x1, i8 -1, i32 8)
3268   %res2 = add <8 x i32> %res, %res1
3269   ret <8 x i32> %res2
3270 }
3271
3272 declare <8 x double> @llvm.x86.avx512.mask.cvtudq2pd.512(<8 x i32>, <8 x double>, i8)
3273
3274 define <8 x double>@test_int_x86_avx512_mask_cvt_udq2pd_512(<8 x i32> %x0, <8 x double> %x1, i8 %x2) {
3275 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_udq2pd_512:
3276 ; CHECK:       ## BB#0:
3277 ; CHECK-NEXT:    movzbl %dil, %eax
3278 ; CHECK-NEXT:    kmovw %eax, %k1
3279 ; CHECK-NEXT:    vcvtudq2pd %ymm0, %zmm1 {%k1}
3280 ; CHECK-NEXT:    vcvtudq2pd %ymm0, %zmm0
3281 ; CHECK-NEXT:    vaddpd %zmm0, %zmm1, %zmm0
3282 ; CHECK-NEXT:    retq
3283   %res = call <8 x double> @llvm.x86.avx512.mask.cvtudq2pd.512(<8 x i32> %x0, <8 x double> %x1, i8 %x2)
3284   %res1 = call <8 x double> @llvm.x86.avx512.mask.cvtudq2pd.512(<8 x i32> %x0, <8 x double> %x1, i8 -1)
3285   %res2 = fadd <8 x double> %res, %res1
3286   ret <8 x double> %res2
3287 }
3288
3289
3290 declare <16 x float> @llvm.x86.avx512.mask.cvtudq2ps.512(<16 x i32>, <16 x float>, i16, i32)
3291
3292 define <16 x float>@test_int_x86_avx512_mask_cvt_udq2ps_512(<16 x i32> %x0, <16 x float> %x1, i16 %x2) {
3293 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_udq2ps_512:
3294 ; CHECK:       ## BB#0:
3295 ; CHECK-NEXT:    kmovw %edi, %k1
3296 ; CHECK-NEXT:    vcvtudq2ps %zmm0, %zmm1 {%k1}
3297 ; CHECK-NEXT:    vcvtudq2ps {rn-sae}, %zmm0, %zmm0
3298 ; CHECK-NEXT:    vaddps %zmm0, %zmm1, %zmm0
3299 ; CHECK-NEXT:    retq
3300   %res = call <16 x float> @llvm.x86.avx512.mask.cvtudq2ps.512(<16 x i32> %x0, <16 x float> %x1, i16 %x2, i32 4)
3301   %res1 = call <16 x float> @llvm.x86.avx512.mask.cvtudq2ps.512(<16 x i32> %x0, <16 x float> %x1, i16 -1, i32 0)
3302   %res2 = fadd <16 x float> %res, %res1
3303   ret <16 x float> %res2
3304 }
3305
3306 declare <8 x i32> @llvm.x86.avx512.mask.cvttpd2udq.512(<8 x double>, <8 x i32>, i8, i32)
3307
3308 define <8 x i32>@test_int_x86_avx512_mask_cvtt_pd2udq_512(<8 x double> %x0, <8 x i32> %x1, i8 %x2) {
3309 ; CHECK-LABEL: test_int_x86_avx512_mask_cvtt_pd2udq_512:
3310 ; CHECK:       ## BB#0:
3311 ; CHECK-NEXT:    movzbl %dil, %eax
3312 ; CHECK-NEXT:    kmovw %eax, %k1
3313 ; CHECK-NEXT:    vcvttpd2udq %zmm0, %ymm1 {%k1}
3314 ; CHECK-NEXT:    vcvttpd2udq {sae}, %zmm0, %ymm0
3315 ; CHECK-NEXT:    vpaddd %ymm0, %ymm1, %ymm0
3316 ; CHECK-NEXT:    retq
3317   %res = call <8 x i32> @llvm.x86.avx512.mask.cvttpd2udq.512(<8 x double> %x0, <8 x i32> %x1, i8 %x2, i32 4)
3318   %res1 = call <8 x i32> @llvm.x86.avx512.mask.cvttpd2udq.512(<8 x double> %x0, <8 x i32> %x1, i8 -1, i32 8)
3319   %res2 = add <8 x i32> %res, %res1
3320   ret <8 x i32> %res2
3321 }
3322
3323 declare <16 x i32> @llvm.x86.avx512.mask.cvttps2dq.512(<16 x float>, <16 x i32>, i16, i32)
3324
3325 define <16 x i32>@test_int_x86_avx512_mask_cvtt_ps2dq_512(<16 x float> %x0, <16 x i32> %x1, i16 %x2) {
3326 ; CHECK-LABEL: test_int_x86_avx512_mask_cvtt_ps2dq_512:
3327 ; CHECK:       ## BB#0:
3328 ; CHECK-NEXT:    kmovw %edi, %k1
3329 ; CHECK-NEXT:    vcvttps2dq %zmm0, %zmm1 {%k1}
3330 ; CHECK-NEXT:    vcvttps2dq {sae}, %zmm0, %zmm0
3331 ; CHECK-NEXT:    vpaddd %zmm0, %zmm1, %zmm0
3332 ; CHECK-NEXT:    retq
3333   %res = call <16 x i32> @llvm.x86.avx512.mask.cvttps2dq.512(<16 x float> %x0, <16 x i32> %x1, i16 %x2, i32 4)
3334   %res1 = call <16 x i32> @llvm.x86.avx512.mask.cvttps2dq.512(<16 x float> %x0, <16 x i32> %x1, i16 -1, i32 8)
3335   %res2 = add <16 x i32> %res, %res1
3336   ret <16 x i32> %res2
3337 }
3338
3339 declare <16 x i32> @llvm.x86.avx512.mask.cvttps2udq.512(<16 x float>, <16 x i32>, i16, i32)
3340
3341 define <16 x i32>@test_int_x86_avx512_mask_cvtt_ps2udq_512(<16 x float> %x0, <16 x i32> %x1, i16 %x2) {
3342 ; CHECK-LABEL: test_int_x86_avx512_mask_cvtt_ps2udq_512:
3343 ; CHECK:       ## BB#0:
3344 ; CHECK-NEXT:    kmovw %edi, %k1
3345 ; CHECK-NEXT:    vcvttps2udq %zmm0, %zmm1 {%k1}
3346 ; CHECK-NEXT:    vcvttps2udq {sae}, %zmm0, %zmm0
3347 ; CHECK-NEXT:    vpaddd %zmm0, %zmm1, %zmm0
3348 ; CHECK-NEXT:    retq
3349   %res = call <16 x i32> @llvm.x86.avx512.mask.cvttps2udq.512(<16 x float> %x0, <16 x i32> %x1, i16 %x2, i32 4)
3350   %res1 = call <16 x i32> @llvm.x86.avx512.mask.cvttps2udq.512(<16 x float> %x0, <16 x i32> %x1, i16 -1, i32 8)
3351   %res2 = add <16 x i32> %res, %res1
3352   ret <16 x i32> %res2
3353 }
3354
3355
3356 declare <4 x float> @llvm.x86.avx512.mask.scalef.ss(<4 x float>, <4 x float>,<4 x float>, i8, i32)
3357 ; CHECK-LABEL: @test_int_x86_avx512_mask_scalef_ss
3358 ; CHECK-NOT: call 
3359 ; CHECK: kmov 
3360 ; CHECK: vscalefss {{.*}}{%k1} 
3361 ; CHECK: vscalefss      {rn-sae}
3362 define <4 x float>@test_int_x86_avx512_mask_scalef_ss(<4 x float> %x0, <4 x float> %x1, <4 x float> %x3, i8 %x4) {
3363   %res = call <4 x float> @llvm.x86.avx512.mask.scalef.ss(<4 x float> %x0, <4 x float> %x1, <4 x float> %x3, i8 %x4, i32 4)
3364   %res1 = call <4 x float> @llvm.x86.avx512.mask.scalef.ss(<4 x float> %x0, <4 x float> %x1, <4 x float> %x3, i8 -1, i32 8)
3365   %res2 = fadd <4 x float> %res, %res1
3366   ret <4 x float> %res2
3367 }
3368
3369 declare <2 x double> @llvm.x86.avx512.mask.scalef.sd(<2 x double>, <2 x double>,<2 x double>, i8, i32)
3370 ; CHECK-LABEL: @test_int_x86_avx512_mask_scalef_sd
3371 ; CHECK-NOT: call 
3372 ; CHECK: kmov 
3373 ; CHECK: vscalefsd {{.*}}{%k1} 
3374 ; CHECK: vscalefsd      {rn-sae}
3375 define <2 x double>@test_int_x86_avx512_mask_scalef_sd(<2 x double> %x0, <2 x double> %x1, <2 x double> %x3, i8 %x4) {
3376   %res = call <2 x double> @llvm.x86.avx512.mask.scalef.sd(<2 x double> %x0, <2 x double> %x1, <2 x double> %x3, i8 %x4, i32 4)
3377   %res1 = call <2 x double> @llvm.x86.avx512.mask.scalef.sd(<2 x double> %x0, <2 x double> %x1, <2 x double> %x3, i8 -1, i32 8)
3378   %res2 = fadd <2 x double> %res, %res1
3379   ret <2 x double> %res2
3380 }