eb0987771b3f67417d8b14af8b19e82258303a05
[oota-llvm.git] / test / CodeGen / X86 / avx512-intrinsics.ll
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=knl | FileCheck %s
3
4 declare i32 @llvm.x86.avx512.kortestz.w(i16, i16) nounwind readnone
5 define i32 @test_kortestz(i16 %a0, i16 %a1) {
6 ; CHECK-LABEL: test_kortestz:
7 ; CHECK:       ## BB#0:
8 ; CHECK-NEXT:    kmovw %esi, %k0
9 ; CHECK-NEXT:    kmovw %edi, %k1
10 ; CHECK-NEXT:    kortestw %k0, %k1
11 ; CHECK-NEXT:    sete %al
12 ; CHECK-NEXT:    kmovw %eax, %k0
13 ; CHECK-NEXT:    kmovw %k0, %eax
14 ; CHECK-NEXT:    andl $1, %eax
15 ; CHECK-NEXT:    retq
16   %res = call i32 @llvm.x86.avx512.kortestz.w(i16 %a0, i16 %a1)
17   ret i32 %res
18 }
19
20 declare i32 @llvm.x86.avx512.kortestc.w(i16, i16) nounwind readnone
21 define i32 @test_kortestc(i16 %a0, i16 %a1) {
22 ; CHECK-LABEL: test_kortestc:
23 ; CHECK:       ## BB#0:
24 ; CHECK-NEXT:    kmovw %esi, %k0
25 ; CHECK-NEXT:    kmovw %edi, %k1
26 ; CHECK-NEXT:    kortestw %k0, %k1
27 ; CHECK-NEXT:    sbbl %eax, %eax
28 ; CHECK-NEXT:    andl $1, %eax
29 ; CHECK-NEXT:    retq
30   %res = call i32 @llvm.x86.avx512.kortestc.w(i16 %a0, i16 %a1)
31   ret i32 %res
32 }
33
34 declare i16 @llvm.x86.avx512.kand.w(i16, i16) nounwind readnone
35 define i16 @test_kand(i16 %a0, i16 %a1) {
36 ; CHECK-LABEL: test_kand:
37 ; CHECK:       ## BB#0:
38 ; CHECK-NEXT:    movw $8, %ax
39 ; CHECK-NEXT:    kmovw %eax, %k0
40 ; CHECK-NEXT:    kmovw %edi, %k1
41 ; CHECK-NEXT:    kandw %k0, %k1, %k0
42 ; CHECK-NEXT:    kmovw %esi, %k1
43 ; CHECK-NEXT:    kandw %k1, %k0, %k0
44 ; CHECK-NEXT:    kmovw %k0, %eax
45 ; CHECK-NEXT:    retq
46   %t1 = call i16 @llvm.x86.avx512.kand.w(i16 %a0, i16 8)
47   %t2 = call i16 @llvm.x86.avx512.kand.w(i16 %t1, i16 %a1)
48   ret i16 %t2
49 }
50
51 declare i16 @llvm.x86.avx512.knot.w(i16) nounwind readnone
52 define i16 @test_knot(i16 %a0) {
53 ; CHECK-LABEL: test_knot:
54 ; CHECK:       ## BB#0:
55 ; CHECK-NEXT:    kmovw %edi, %k0
56 ; CHECK-NEXT:    knotw %k0, %k0
57 ; CHECK-NEXT:    kmovw %k0, %eax
58 ; CHECK-NEXT:    retq
59   %res = call i16 @llvm.x86.avx512.knot.w(i16 %a0)
60   ret i16 %res
61 }
62
63 declare i16 @llvm.x86.avx512.kunpck.bw(i16, i16) nounwind readnone
64
65 define i16 @unpckbw_test(i16 %a0, i16 %a1) {
66 ; CHECK-LABEL: unpckbw_test:
67 ; CHECK:       ## BB#0:
68 ; CHECK-NEXT:    kmovw %edi, %k0
69 ; CHECK-NEXT:    kmovw %esi, %k1
70 ; CHECK-NEXT:    kunpckbw %k1, %k0, %k0
71 ; CHECK-NEXT:    kmovw %k0, %eax
72 ; CHECK-NEXT:    retq
73   %res = call i16 @llvm.x86.avx512.kunpck.bw(i16 %a0, i16 %a1)
74   ret i16 %res
75 }
76
77 define <16 x float> @test_rcp_ps_512(<16 x float> %a0) {
78 ; CHECK-LABEL: test_rcp_ps_512:
79 ; CHECK:       ## BB#0:
80 ; CHECK-NEXT:    vrcp14ps %zmm0, %zmm0
81 ; CHECK-NEXT:    retq
82   %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]
83   ret <16 x float> %res
84 }
85 declare <16 x float> @llvm.x86.avx512.rcp14.ps.512(<16 x float>, <16 x float>, i16) nounwind readnone
86
87 define <8 x double> @test_rcp_pd_512(<8 x double> %a0) {
88 ; CHECK-LABEL: test_rcp_pd_512:
89 ; CHECK:       ## BB#0:
90 ; CHECK-NEXT:    vrcp14pd %zmm0, %zmm0
91 ; CHECK-NEXT:    retq
92   %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]
93   ret <8 x double> %res
94 }
95 declare <8 x double> @llvm.x86.avx512.rcp14.pd.512(<8 x double>, <8 x double>, i8) nounwind readnone
96
97 declare <8 x double> @llvm.x86.avx512.mask.rndscale.pd.512(<8 x double>, i32, <8 x double>, i8, i32)
98
99 define <8 x double> @test7(<8 x double> %a) {
100 ; CHECK-LABEL: test7:
101 ; CHECK:       ## BB#0:
102 ; CHECK-NEXT:    vrndscalepd $11, %zmm0, %zmm0
103 ; CHECK-NEXT:    retq
104   %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)
105   ret <8 x double>%res
106 }
107
108 declare <16 x float> @llvm.x86.avx512.mask.rndscale.ps.512(<16 x float>, i32, <16 x float>, i16, i32)
109
110 define <16 x float> @test8(<16 x float> %a) {
111 ; CHECK-LABEL: test8:
112 ; CHECK:       ## BB#0:
113 ; CHECK-NEXT:    vrndscaleps $11, %zmm0, %zmm0
114 ; CHECK-NEXT:    retq
115   %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)
116   ret <16 x float>%res
117 }
118
119 define <16 x float> @test_rsqrt_ps_512(<16 x float> %a0) {
120 ; CHECK-LABEL: test_rsqrt_ps_512:
121 ; CHECK:       ## BB#0:
122 ; CHECK-NEXT:    vrsqrt14ps %zmm0, %zmm0
123 ; CHECK-NEXT:    retq
124   %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]
125   ret <16 x float> %res
126 }
127 declare <16 x float> @llvm.x86.avx512.rsqrt14.ps.512(<16 x float>, <16 x float>, i16) nounwind readnone
128
129 define <4 x float> @test_rsqrt14_ss(<4 x float> %a0) {
130 ; CHECK-LABEL: test_rsqrt14_ss:
131 ; CHECK:       ## BB#0:
132 ; CHECK-NEXT:    vrsqrt14ss %xmm0, %xmm0, %xmm0
133 ; CHECK-NEXT:    retq
134   %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]
135   ret <4 x float> %res
136 }
137 declare <4 x float> @llvm.x86.avx512.rsqrt14.ss(<4 x float>, <4 x float>, <4 x float>, i8) nounwind readnone
138
139 define <4 x float> @test_rcp14_ss(<4 x float> %a0) {
140 ; CHECK-LABEL: test_rcp14_ss:
141 ; CHECK:       ## BB#0:
142 ; CHECK-NEXT:    vrcp14ss %xmm0, %xmm0, %xmm0
143 ; CHECK-NEXT:    retq
144   %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]
145   ret <4 x float> %res
146 }
147 declare <4 x float> @llvm.x86.avx512.rcp14.ss(<4 x float>, <4 x float>, <4 x float>, i8) nounwind readnone
148
149 define <8 x double> @test_sqrt_pd_512(<8 x double> %a0) {
150 ; CHECK-LABEL: test_sqrt_pd_512:
151 ; CHECK:       ## BB#0:
152 ; CHECK-NEXT:    vsqrtpd %zmm0, %zmm0
153 ; CHECK-NEXT:    retq
154   %res = call <8 x double> @llvm.x86.avx512.mask.sqrt.pd.512(<8 x double> %a0,  <8 x double> zeroinitializer, i8 -1, i32 4)
155   ret <8 x double> %res
156 }
157 declare <8 x double> @llvm.x86.avx512.mask.sqrt.pd.512(<8 x double>, <8 x double>, i8, i32) nounwind readnone
158
159 define <16 x float> @test_sqrt_ps_512(<16 x float> %a0) {
160 ; CHECK-LABEL: test_sqrt_ps_512:
161 ; CHECK:       ## BB#0:
162 ; CHECK-NEXT:    vsqrtps %zmm0, %zmm0
163 ; CHECK-NEXT:    retq
164   %res = call <16 x float> @llvm.x86.avx512.mask.sqrt.ps.512(<16 x float> %a0, <16 x float> zeroinitializer, i16 -1, i32 4)
165   ret <16 x float> %res
166 }
167 define <16 x float> @test_sqrt_round_ps_512(<16 x float> %a0) {
168 ; CHECK-LABEL: test_sqrt_round_ps_512:
169 ; CHECK:       ## BB#0:
170 ; CHECK-NEXT:    vsqrtps {rz-sae}, %zmm0, %zmm0
171 ; CHECK-NEXT:    retq
172   %res = call <16 x float> @llvm.x86.avx512.mask.sqrt.ps.512(<16 x float> %a0, <16 x float> zeroinitializer, i16 -1, i32 3)
173   ret <16 x float> %res
174 }
175 declare <16 x float> @llvm.x86.avx512.mask.sqrt.ps.512(<16 x float>, <16 x float>, i16, i32) nounwind readnone
176
177 define <8 x double> @test_getexp_pd_512(<8 x double> %a0) {
178 ; CHECK-LABEL: test_getexp_pd_512:
179 ; CHECK:       ## BB#0:
180 ; CHECK-NEXT:    vgetexppd %zmm0, %zmm0
181 ; CHECK-NEXT:    retq
182   %res = call <8 x double> @llvm.x86.avx512.mask.getexp.pd.512(<8 x double> %a0,  <8 x double> zeroinitializer, i8 -1, i32 4)
183   ret <8 x double> %res
184 }
185 define <8 x double> @test_getexp_round_pd_512(<8 x double> %a0) {
186 ; CHECK-LABEL: test_getexp_round_pd_512:
187 ; CHECK:       ## BB#0:
188 ; CHECK-NEXT:    vgetexppd {sae}, %zmm0, %zmm0
189 ; CHECK-NEXT:    retq
190   %res = call <8 x double> @llvm.x86.avx512.mask.getexp.pd.512(<8 x double> %a0,  <8 x double> zeroinitializer, i8 -1, i32 8)
191   ret <8 x double> %res
192 }
193 declare <8 x double> @llvm.x86.avx512.mask.getexp.pd.512(<8 x double>, <8 x double>, i8, i32) nounwind readnone
194
195 define <16 x float> @test_getexp_ps_512(<16 x float> %a0) {
196 ; CHECK-LABEL: test_getexp_ps_512:
197 ; CHECK:       ## BB#0:
198 ; CHECK-NEXT:    vgetexpps %zmm0, %zmm0
199 ; CHECK-NEXT:    retq
200   %res = call <16 x float> @llvm.x86.avx512.mask.getexp.ps.512(<16 x float> %a0, <16 x float> zeroinitializer, i16 -1, i32 4)
201   ret <16 x float> %res
202 }
203
204 define <16 x float> @test_getexp_round_ps_512(<16 x float> %a0) {
205 ; CHECK-LABEL: test_getexp_round_ps_512:
206 ; CHECK:       ## BB#0:
207 ; CHECK-NEXT:    vgetexpps {sae}, %zmm0, %zmm0
208 ; CHECK-NEXT:    retq
209   %res = call <16 x float> @llvm.x86.avx512.mask.getexp.ps.512(<16 x float> %a0, <16 x float> zeroinitializer, i16 -1, i32 8)
210   ret <16 x float> %res
211 }
212 declare <16 x float> @llvm.x86.avx512.mask.getexp.ps.512(<16 x float>, <16 x float>, i16, i32) nounwind readnone
213
214 declare <4 x float> @llvm.x86.avx512.mask.sqrt.ss(<4 x float>, <4 x float>, <4 x float>, i8, i32) nounwind readnone
215
216 define <4 x float> @test_sqrt_ss(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2, i8 %mask) {
217 ; CHECK-LABEL: test_sqrt_ss:
218 ; CHECK:       ## BB#0:
219 ; CHECK-NEXT:    andl $1, %edi
220 ; CHECK-NEXT:    kmovw %edi, %k1
221 ; CHECK-NEXT:    vmovaps %zmm2, %zmm3
222 ; CHECK-NEXT:    vsqrtss %xmm1, %xmm0, %xmm3 {%k1}
223 ; CHECK-NEXT:    vsqrtss {rd-sae}, %xmm1, %xmm0, %xmm2 {%k1}
224 ; CHECK-NEXT:    vsqrtss {ru-sae}, %xmm1, %xmm0, %xmm4 {%k1} {z}
225 ; CHECK-NEXT:    vsqrtss {rz-sae}, %xmm1, %xmm0, %xmm0
226 ; CHECK-NEXT:    vaddps %xmm2, %xmm3, %xmm1
227 ; CHECK-NEXT:    vaddps %xmm0, %xmm4, %xmm0
228 ; CHECK-NEXT:    vaddps %xmm0, %xmm1, %xmm0
229 ; CHECK-NEXT:    retq
230   %res0 = call <4 x float> @llvm.x86.avx512.mask.sqrt.ss(<4 x float>%a0, <4 x float> %a1, <4 x float> %a2, i8 %mask, i32 4)
231   %res1 = call <4 x float> @llvm.x86.avx512.mask.sqrt.ss(<4 x float>%a0, <4 x float> %a1, <4 x float> %a2, i8 %mask, i32 1)
232   %res2 = call <4 x float> @llvm.x86.avx512.mask.sqrt.ss(<4 x float>%a0, <4 x float> %a1, <4 x float> zeroinitializer, i8 %mask, i32 2)
233   %res3 = call <4 x float> @llvm.x86.avx512.mask.sqrt.ss(<4 x float>%a0, <4 x float> %a1, <4 x float> zeroinitializer, i8 -1, i32 3)
234
235   %res.1 = fadd <4 x float> %res0, %res1
236   %res.2 = fadd <4 x float> %res2, %res3
237   %res   = fadd <4 x float> %res.1, %res.2
238   ret <4 x float> %res
239 }
240
241 declare <2 x double> @llvm.x86.avx512.mask.sqrt.sd(<2 x double>, <2 x double>, <2 x double>, i8, i32) nounwind readnone
242
243 define <2 x double> @test_sqrt_sd(<2 x double> %a0, <2 x double> %a1, <2 x double> %a2, i8 %mask) {
244 ; CHECK-LABEL: test_sqrt_sd:
245 ; CHECK:       ## BB#0:
246 ; CHECK-NEXT:    andl $1, %edi
247 ; CHECK-NEXT:    kmovw %edi, %k1
248 ; CHECK-NEXT:    vmovaps %zmm2, %zmm3
249 ; CHECK-NEXT:    vsqrtsd %xmm1, %xmm0, %xmm3 {%k1}
250 ; CHECK-NEXT:    vsqrtsd {rd-sae}, %xmm1, %xmm0, %xmm2 {%k1}
251 ; CHECK-NEXT:    vsqrtsd {ru-sae}, %xmm1, %xmm0, %xmm4 {%k1} {z}
252 ; CHECK-NEXT:    vsqrtsd {rz-sae}, %xmm1, %xmm0, %xmm0
253 ; CHECK-NEXT:    vaddpd %xmm2, %xmm3, %xmm1
254 ; CHECK-NEXT:    vaddpd %xmm0, %xmm4, %xmm0
255 ; CHECK-NEXT:    vaddpd %xmm0, %xmm1, %xmm0
256 ; CHECK-NEXT:    retq
257   %res0 = call <2 x double> @llvm.x86.avx512.mask.sqrt.sd(<2 x double>%a0, <2 x double> %a1, <2 x double> %a2, i8 %mask, i32 4)
258   %res1 = call <2 x double> @llvm.x86.avx512.mask.sqrt.sd(<2 x double>%a0, <2 x double> %a1, <2 x double> %a2, i8 %mask, i32 1)
259   %res2 = call <2 x double> @llvm.x86.avx512.mask.sqrt.sd(<2 x double>%a0, <2 x double> %a1, <2 x double> zeroinitializer, i8 %mask, i32 2)
260   %res3 = call <2 x double> @llvm.x86.avx512.mask.sqrt.sd(<2 x double>%a0, <2 x double> %a1, <2 x double> zeroinitializer, i8 -1, i32 3)
261
262   %res.1 = fadd <2 x double> %res0, %res1
263   %res.2 = fadd <2 x double> %res2, %res3
264   %res   = fadd <2 x double> %res.1, %res.2
265   ret <2 x double> %res
266 }
267
268 define i64 @test_x86_sse2_cvtsd2si64(<2 x double> %a0) {
269 ; CHECK-LABEL: test_x86_sse2_cvtsd2si64:
270 ; CHECK:       ## BB#0:
271 ; CHECK-NEXT:    vcvtsd2si %xmm0, %rax
272 ; CHECK-NEXT:    retq
273   %res = call i64 @llvm.x86.sse2.cvtsd2si64(<2 x double> %a0) ; <i64> [#uses=1]
274   ret i64 %res
275 }
276 declare i64 @llvm.x86.sse2.cvtsd2si64(<2 x double>) nounwind readnone
277
278 define <2 x double> @test_x86_sse2_cvtsi642sd(<2 x double> %a0, i64 %a1) {
279 ; CHECK-LABEL: test_x86_sse2_cvtsi642sd:
280 ; CHECK:       ## BB#0:
281 ; CHECK-NEXT:    vcvtsi2sdq %rdi, %xmm0, %xmm0
282 ; CHECK-NEXT:    retq
283   %res = call <2 x double> @llvm.x86.sse2.cvtsi642sd(<2 x double> %a0, i64 %a1) ; <<2 x double>> [#uses=1]
284   ret <2 x double> %res
285 }
286 declare <2 x double> @llvm.x86.sse2.cvtsi642sd(<2 x double>, i64) nounwind readnone
287
288 define i64 @test_x86_avx512_cvttsd2si64(<2 x double> %a0) {
289 ; CHECK-LABEL: test_x86_avx512_cvttsd2si64:
290 ; CHECK:       ## BB#0:
291 ; CHECK-NEXT:    vcvttsd2si %xmm0, %rcx
292 ; CHECK-NEXT:    vcvttsd2si {sae}, %xmm0, %rax
293 ; CHECK-NEXT:    addq %rcx, %rax
294 ; CHECK-NEXT:    retq
295   %res0 = call i64 @llvm.x86.avx512.cvttsd2si64(<2 x double> %a0, i32 4) ;
296   %res1 = call i64 @llvm.x86.avx512.cvttsd2si64(<2 x double> %a0, i32 8) ;
297   %res2 = add i64 %res0, %res1
298   ret i64 %res2
299 }
300 declare i64 @llvm.x86.avx512.cvttsd2si64(<2 x double>, i32) nounwind readnone
301
302 define i32 @test_x86_avx512_cvttsd2usi(<2 x double> %a0) {
303 ; CHECK-LABEL: test_x86_avx512_cvttsd2usi:
304 ; CHECK:       ## BB#0:
305 ; CHECK-NEXT:    vcvttsd2usi %xmm0, %ecx
306 ; CHECK-NEXT:    vcvttsd2usi {sae}, %xmm0, %eax
307 ; CHECK-NEXT:    addl %ecx, %eax
308 ; CHECK-NEXT:    retq
309   %res0 = call i32 @llvm.x86.avx512.cvttsd2usi(<2 x double> %a0, i32 4) ;
310   %res1 = call i32 @llvm.x86.avx512.cvttsd2usi(<2 x double> %a0, i32 8) ;
311   %res2 = add i32 %res0, %res1
312   ret i32 %res2
313 }
314 declare i32 @llvm.x86.avx512.cvttsd2usi(<2 x double>, i32) nounwind readnone
315
316 define i32 @test_x86_avx512_cvttsd2si(<2 x double> %a0) {
317 ; CHECK-LABEL: test_x86_avx512_cvttsd2si:
318 ; CHECK:       ## BB#0:
319 ; CHECK-NEXT:    vcvttsd2si %xmm0, %ecx
320 ; CHECK-NEXT:    vcvttsd2si {sae}, %xmm0, %eax
321 ; CHECK-NEXT:    addl %ecx, %eax
322 ; CHECK-NEXT:    retq
323   %res0 = call i32 @llvm.x86.avx512.cvttsd2si(<2 x double> %a0, i32 4) ;
324   %res1 = call i32 @llvm.x86.avx512.cvttsd2si(<2 x double> %a0, i32 8) ;
325   %res2 = add i32 %res0, %res1
326   ret i32 %res2
327 }
328 declare i32 @llvm.x86.avx512.cvttsd2si(<2 x double>, i32) nounwind readnone
329
330
331
332 define i64 @test_x86_avx512_cvttsd2usi64(<2 x double> %a0) {
333 ; CHECK-LABEL: test_x86_avx512_cvttsd2usi64:
334 ; CHECK:       ## BB#0:
335 ; CHECK-NEXT:    vcvttsd2usi %xmm0, %rcx
336 ; CHECK-NEXT:    vcvttsd2usi {sae}, %xmm0, %rax
337 ; CHECK-NEXT:    addq %rcx, %rax
338 ; CHECK-NEXT:    retq
339   %res0 = call i64 @llvm.x86.avx512.cvttsd2usi64(<2 x double> %a0, i32 4) ;
340   %res1 = call i64 @llvm.x86.avx512.cvttsd2usi64(<2 x double> %a0, i32 8) ;
341   %res2 = add i64 %res0, %res1
342   ret i64 %res2
343 }
344 declare i64 @llvm.x86.avx512.cvttsd2usi64(<2 x double>, i32) nounwind readnone
345
346 define i64 @test_x86_sse_cvtss2si64(<4 x float> %a0) {
347 ; CHECK-LABEL: test_x86_sse_cvtss2si64:
348 ; CHECK:       ## BB#0:
349 ; CHECK-NEXT:    vcvtss2si %xmm0, %rax
350 ; CHECK-NEXT:    retq
351   %res = call i64 @llvm.x86.sse.cvtss2si64(<4 x float> %a0) ; <i64> [#uses=1]
352   ret i64 %res
353 }
354 declare i64 @llvm.x86.sse.cvtss2si64(<4 x float>) nounwind readnone
355
356
357 define <4 x float> @test_x86_sse_cvtsi642ss(<4 x float> %a0, i64 %a1) {
358 ; CHECK-LABEL: test_x86_sse_cvtsi642ss:
359 ; CHECK:       ## BB#0:
360 ; CHECK-NEXT:    vcvtsi2ssq %rdi, %xmm0, %xmm0
361 ; CHECK-NEXT:    retq
362   %res = call <4 x float> @llvm.x86.sse.cvtsi642ss(<4 x float> %a0, i64 %a1) ; <<4 x float>> [#uses=1]
363   ret <4 x float> %res
364 }
365 declare <4 x float> @llvm.x86.sse.cvtsi642ss(<4 x float>, i64) nounwind readnone
366
367
368 define i32 @test_x86_avx512_cvttss2si(<4 x float> %a0) {
369 ; CHECK-LABEL: test_x86_avx512_cvttss2si:
370 ; CHECK:       ## BB#0:
371 ; CHECK-NEXT:    vcvttss2si {sae}, %xmm0, %ecx
372 ; CHECK-NEXT:    vcvttss2si %xmm0, %eax
373 ; CHECK-NEXT:    addl %ecx, %eax
374 ; CHECK-NEXT:    retq
375   %res0 = call i32 @llvm.x86.avx512.cvttss2si(<4 x float> %a0, i32 8) ;
376   %res1 = call i32 @llvm.x86.avx512.cvttss2si(<4 x float> %a0, i32 4) ;
377   %res2 = add i32 %res0, %res1
378   ret i32 %res2
379 }
380 declare i32 @llvm.x86.avx512.cvttss2si(<4 x float>, i32) nounwind readnone
381
382 define i64 @test_x86_avx512_cvttss2si64(<4 x float> %a0) {
383 ; CHECK-LABEL: test_x86_avx512_cvttss2si64:
384 ; CHECK:       ## BB#0:
385 ; CHECK-NEXT:    vcvttss2si %xmm0, %rcx
386 ; CHECK-NEXT:    vcvttss2si {sae}, %xmm0, %rax
387 ; CHECK-NEXT:    addq %rcx, %rax
388 ; CHECK-NEXT:    retq
389   %res0 = call i64 @llvm.x86.avx512.cvttss2si64(<4 x float> %a0, i32 4) ;
390   %res1 = call i64 @llvm.x86.avx512.cvttss2si64(<4 x float> %a0, i32 8) ;
391   %res2 = add i64 %res0, %res1
392   ret i64 %res2
393 }
394 declare i64 @llvm.x86.avx512.cvttss2si64(<4 x float>, i32) nounwind readnone
395
396 define i32 @test_x86_avx512_cvttss2usi(<4 x float> %a0) {
397 ; CHECK-LABEL: test_x86_avx512_cvttss2usi:
398 ; CHECK:       ## BB#0:
399 ; CHECK-NEXT:    vcvttss2usi {sae}, %xmm0, %ecx
400 ; CHECK-NEXT:    vcvttss2usi %xmm0, %eax
401 ; CHECK-NEXT:    addl %ecx, %eax
402 ; CHECK-NEXT:    retq
403   %res0 = call i32 @llvm.x86.avx512.cvttss2usi(<4 x float> %a0, i32 8) ;
404   %res1 = call i32 @llvm.x86.avx512.cvttss2usi(<4 x float> %a0, i32 4) ;
405   %res2 = add i32 %res0, %res1
406   ret i32 %res2
407 }
408 declare i32 @llvm.x86.avx512.cvttss2usi(<4 x float>, i32) nounwind readnone
409
410 define i64 @test_x86_avx512_cvttss2usi64(<4 x float> %a0) {
411 ; CHECK-LABEL: test_x86_avx512_cvttss2usi64:
412 ; CHECK:       ## BB#0:
413 ; CHECK-NEXT:    vcvttss2usi %xmm0, %rcx
414 ; CHECK-NEXT:    vcvttss2usi {sae}, %xmm0, %rax
415 ; CHECK-NEXT:    addq %rcx, %rax
416 ; CHECK-NEXT:    retq
417   %res0 = call i64 @llvm.x86.avx512.cvttss2usi64(<4 x float> %a0, i32 4) ;
418   %res1 = call i64 @llvm.x86.avx512.cvttss2usi64(<4 x float> %a0, i32 8) ;
419   %res2 = add i64 %res0, %res1
420   ret i64 %res2
421 }
422 declare i64 @llvm.x86.avx512.cvttss2usi64(<4 x float>, i32) nounwind readnone
423
424 define i64 @test_x86_avx512_cvtsd2usi64(<2 x double> %a0) {
425 ; CHECK-LABEL: test_x86_avx512_cvtsd2usi64:
426 ; CHECK:       ## BB#0:
427 ; CHECK-NEXT:    vcvtsd2usi %xmm0, %rax
428 ; CHECK-NEXT:    retq
429   %res = call i64 @llvm.x86.avx512.cvtsd2usi64(<2 x double> %a0) ; <i64> [#uses=1]
430   ret i64 %res
431 }
432 declare i64 @llvm.x86.avx512.cvtsd2usi64(<2 x double>) nounwind readnone
433
434 define <16 x float> @test_x86_vcvtph2ps_512(<16 x i16> %a0) {
435 ; CHECK-LABEL: test_x86_vcvtph2ps_512:
436 ; CHECK:       ## BB#0:
437 ; CHECK-NEXT:    vcvtph2ps %ymm0, %zmm0
438 ; CHECK-NEXT:    retq
439   %res = call <16 x float> @llvm.x86.avx512.mask.vcvtph2ps.512(<16 x i16> %a0, <16 x float> zeroinitializer, i16 -1, i32 4)
440   ret <16 x float> %res
441 }
442
443 define <16 x float> @test_x86_vcvtph2ps_512_sae(<16 x i16> %a0) {
444 ; CHECK-LABEL: test_x86_vcvtph2ps_512_sae:
445 ; CHECK:       ## BB#0:
446 ; CHECK-NEXT:    vcvtph2ps {sae}, %ymm0, %zmm0
447 ; CHECK-NEXT:    retq
448   %res = call <16 x float> @llvm.x86.avx512.mask.vcvtph2ps.512(<16 x i16> %a0, <16 x float> zeroinitializer, i16 -1, i32 8)
449   ret <16 x float> %res
450 }
451
452 define <16 x float> @test_x86_vcvtph2ps_512_rrk(<16 x i16> %a0,<16 x float> %a1, i16 %mask) {
453 ; CHECK-LABEL: test_x86_vcvtph2ps_512_rrk:
454 ; CHECK:       ## BB#0:
455 ; CHECK-NEXT:    kmovw %edi, %k1
456 ; CHECK-NEXT:    vcvtph2ps %ymm0, %zmm1 {%k1}
457 ; CHECK-NEXT:    vmovaps %zmm1, %zmm0
458 ; CHECK-NEXT:    retq
459   %res = call <16 x float> @llvm.x86.avx512.mask.vcvtph2ps.512(<16 x i16> %a0, <16 x float> %a1, i16 %mask, i32 4)
460   ret <16 x float> %res
461 }
462
463 define <16 x float> @test_x86_vcvtph2ps_512_sae_rrkz(<16 x i16> %a0, i16 %mask) {
464 ; CHECK-LABEL: test_x86_vcvtph2ps_512_sae_rrkz:
465 ; CHECK:       ## BB#0:
466 ; CHECK-NEXT:    kmovw %edi, %k1
467 ; CHECK-NEXT:    vcvtph2ps {sae}, %ymm0, %zmm0 {%k1} {z}
468 ; CHECK-NEXT:    retq
469   %res = call <16 x float> @llvm.x86.avx512.mask.vcvtph2ps.512(<16 x i16> %a0, <16 x float> zeroinitializer, i16 %mask, i32 8)
470   ret <16 x float> %res
471 }
472
473 define <16 x float> @test_x86_vcvtph2ps_512_rrkz(<16 x i16> %a0, i16 %mask) {
474 ; CHECK-LABEL: test_x86_vcvtph2ps_512_rrkz:
475 ; CHECK:       ## BB#0:
476 ; CHECK-NEXT:    kmovw %edi, %k1
477 ; CHECK-NEXT:    vcvtph2ps %ymm0, %zmm0 {%k1} {z}
478 ; CHECK-NEXT:    retq
479   %res = call <16 x float> @llvm.x86.avx512.mask.vcvtph2ps.512(<16 x i16> %a0, <16 x float> zeroinitializer, i16 %mask, i32 4)
480   ret <16 x float> %res
481 }
482
483 declare <16 x float> @llvm.x86.avx512.mask.vcvtph2ps.512(<16 x i16>, <16 x float>, i16, i32) nounwind readonly
484
485
486 define <16 x i16> @test_x86_vcvtps2ph_256(<16 x float> %a0) {
487 ; CHECK-LABEL: test_x86_vcvtps2ph_256:
488 ; CHECK:       ## BB#0:
489 ; CHECK-NEXT:    vcvtps2ph $2, %zmm0, %ymm0
490 ; CHECK-NEXT:    retq
491   %res = call <16 x i16> @llvm.x86.avx512.mask.vcvtps2ph.512(<16 x float> %a0, i32 2, <16 x i16> zeroinitializer, i16 -1)
492   ret <16 x i16> %res
493 }
494
495 declare <16 x i16> @llvm.x86.avx512.mask.vcvtps2ph.512(<16 x float>, i32, <16 x i16>, i16) nounwind readonly
496
497 define <16 x float> @test_x86_vbroadcast_ss_512(i8* %a0) {
498 ; CHECK-LABEL: test_x86_vbroadcast_ss_512:
499 ; CHECK:       ## BB#0:
500 ; CHECK-NEXT:    vbroadcastss (%rdi), %zmm0
501 ; CHECK-NEXT:    retq
502   %res = call <16 x float> @llvm.x86.avx512.vbroadcast.ss.512(i8* %a0) ; <<16 x float>> [#uses=1]
503   ret <16 x float> %res
504 }
505 declare <16 x float> @llvm.x86.avx512.vbroadcast.ss.512(i8*) nounwind readonly
506
507 define <8 x double> @test_x86_vbroadcast_sd_512(i8* %a0) {
508 ; CHECK-LABEL: test_x86_vbroadcast_sd_512:
509 ; CHECK:       ## BB#0:
510 ; CHECK-NEXT:    vbroadcastsd (%rdi), %zmm0
511 ; CHECK-NEXT:    retq
512   %res = call <8 x double> @llvm.x86.avx512.vbroadcast.sd.512(i8* %a0) ; <<8 x double>> [#uses=1]
513   ret <8 x double> %res
514 }
515 declare <8 x double> @llvm.x86.avx512.vbroadcast.sd.512(i8*) nounwind readonly
516
517 define <16 x float> @test_x86_vbroadcast_ss_ps_512(<4 x float> %a0, <16 x float> %a1, i16 %mask ) {
518 ; CHECK-LABEL: test_x86_vbroadcast_ss_ps_512:
519 ; CHECK: kmovw   %edi, %k1
520 ; CHECK-NEXT: vbroadcastss %xmm0, %zmm1 {%k1}
521 ; CHECK-NEXT: vbroadcastss %xmm0, %zmm2 {%k1} {z}
522 ; CHECK-NEXT: vbroadcastss %xmm0, %zmm0
523 ; CHECK-NEXT: vaddps %zmm1, %zmm0, %zmm0
524
525   %res = call <16 x float> @llvm.x86.avx512.mask.broadcast.ss.ps.512(<4 x float> %a0, <16 x float> zeroinitializer, i16 -1) 
526   %res1 = call <16 x float> @llvm.x86.avx512.mask.broadcast.ss.ps.512(<4 x float> %a0, <16 x float> %a1, i16 %mask) 
527   %res2 = call <16 x float> @llvm.x86.avx512.mask.broadcast.ss.ps.512(<4 x float> %a0, <16 x float> zeroinitializer, i16 %mask) 
528   %res3 = fadd <16 x float> %res, %res1
529   %res4 = fadd <16 x float> %res2, %res3
530   ret <16 x float> %res4
531 }
532 declare <16 x float> @llvm.x86.avx512.mask.broadcast.ss.ps.512(<4 x float>, <16 x float>, i16) nounwind readonly
533
534
535 define <8 x double> @test_x86_vbroadcast_sd_pd_512(<2 x double> %a0, <8 x double> %a1, i8 %mask ) {
536 ; CHECK-LABEL: test_x86_vbroadcast_sd_pd_512:
537 ; CHECK: kmovw   %eax, %k1
538 ; CHECK-NEXT: vbroadcastsd %xmm0, %zmm1 {%k1}
539 ; CHECK-NEXT: vbroadcastsd %xmm0, %zmm2 {%k1} {z}
540 ; CHECK-NEXT: vbroadcastsd %xmm0, %zmm0
541 ; CHECK-NEXT: vaddpd %zmm1, %zmm0, %zmm0
542
543   %res = call <8 x double> @llvm.x86.avx512.mask.broadcast.sd.pd.512(<2 x double> %a0, <8 x double> zeroinitializer, i8 -1) 
544   %res1 = call <8 x double> @llvm.x86.avx512.mask.broadcast.sd.pd.512(<2 x double> %a0, <8 x double> %a1, i8 %mask) 
545   %res2 = call <8 x double> @llvm.x86.avx512.mask.broadcast.sd.pd.512(<2 x double> %a0, <8 x double> zeroinitializer, i8 %mask) 
546   %res3 = fadd <8 x double> %res, %res1
547   %res4 = fadd <8 x double> %res2, %res3
548   ret <8 x double> %res4
549 }
550 declare <8 x double> @llvm.x86.avx512.mask.broadcast.sd.pd.512(<2 x double>, <8 x double>, i8) nounwind readonly
551
552 define <16 x i32>@test_int_x86_avx512_pbroadcastd_512(<4 x i32> %x0, <16 x i32> %x1, i16 %mask) {
553 ; CHECK-LABEL: test_int_x86_avx512_pbroadcastd_512:
554 ; CHECK:       ## BB#0:
555 ; CHECK-NEXT:    kmovw %edi, %k1
556 ; CHECK-NEXT:    vpbroadcastd %xmm0, %zmm1 {%k1}
557 ; CHECK-NEXT:    vpbroadcastd %xmm0, %zmm2 {%k1} {z}
558 ; CHECK-NEXT:    vpbroadcastd %xmm0, %zmm0
559 ; CHECK-NEXT:    vpaddd %zmm1, %zmm0, %zmm0
560 ; CHECK-NEXT:    vpaddd %zmm0, %zmm2, %zmm0
561 ; CHECK-NEXT:    retq
562   %res = call <16 x i32> @llvm.x86.avx512.pbroadcastd.512(<4 x i32> %x0, <16 x i32> %x1, i16 -1)
563   %res1 = call <16 x i32> @llvm.x86.avx512.pbroadcastd.512(<4 x i32> %x0, <16 x i32> %x1, i16 %mask)
564   %res2 = call <16 x i32> @llvm.x86.avx512.pbroadcastd.512(<4 x i32> %x0, <16 x i32> zeroinitializer, i16 %mask)
565   %res3 = add <16 x i32> %res, %res1
566   %res4 = add <16 x i32> %res2, %res3
567   ret <16 x i32> %res4
568 }
569 declare <16 x i32> @llvm.x86.avx512.pbroadcastd.512(<4 x i32>, <16 x i32>, i16)
570
571 define <16 x i32> @test_x86_pbroadcastd_i32_512(i32  %a0) {
572 ; CHECK-LABEL: test_x86_pbroadcastd_i32_512:
573 ; CHECK:       ## BB#0:
574 ; CHECK-NEXT:    vpbroadcastd %edi, %zmm0
575 ; CHECK-NEXT:    retq
576   %res = call <16 x i32> @llvm.x86.avx512.pbroadcastd.i32.512(i32 %a0) ; <<16 x i32>> [#uses=1]
577   ret <16 x i32> %res
578 }
579 declare <16 x i32> @llvm.x86.avx512.pbroadcastd.i32.512(i32) nounwind readonly
580
581 define <8 x i64>@test_int_x86_avx512_pbroadcastq_512(<2 x i64> %x0, <8 x i64> %x1, i8 %mask) {
582 ; CHECK-LABEL: test_int_x86_avx512_pbroadcastq_512:
583 ; CHECK:       ## BB#0:
584 ; CHECK-NEXT:    movzbl %dil, %eax
585 ; CHECK-NEXT:    kmovw %eax, %k1
586 ; CHECK-NEXT:    vpbroadcastq %xmm0, %zmm1 {%k1}
587 ; CHECK-NEXT:    vpbroadcastq %xmm0, %zmm2 {%k1} {z}
588 ; CHECK-NEXT:    vpbroadcastq %xmm0, %zmm0
589 ; CHECK-NEXT:    vpaddq %zmm1, %zmm0, %zmm0
590 ; CHECK-NEXT:    vpaddq %zmm0, %zmm2, %zmm0
591 ; CHECK-NEXT:    retq
592   %res = call <8 x i64> @llvm.x86.avx512.pbroadcastq.512(<2 x i64> %x0, <8 x i64> %x1,i8 -1)
593   %res1 = call <8 x i64> @llvm.x86.avx512.pbroadcastq.512(<2 x i64> %x0, <8 x i64> %x1,i8 %mask)
594   %res2 = call <8 x i64> @llvm.x86.avx512.pbroadcastq.512(<2 x i64> %x0, <8 x i64> zeroinitializer,i8 %mask)
595   %res3 = add <8 x i64> %res, %res1
596   %res4 = add <8 x i64> %res2, %res3
597   ret <8 x i64> %res4
598 }
599 declare <8 x i64> @llvm.x86.avx512.pbroadcastq.512(<2 x i64>, <8 x i64>, i8)
600
601 define <8 x i64> @test_x86_pbroadcastq_i64_512(i64 %a0) {
602 ; CHECK-LABEL: test_x86_pbroadcastq_i64_512:
603 ; CHECK:       ## BB#0:
604 ; CHECK-NEXT:    vpbroadcastq %rdi, %zmm0
605 ; CHECK-NEXT:    retq
606   %res = call <8 x i64> @llvm.x86.avx512.pbroadcastq.i64.512(i64 %a0) ; <<8 x i64>> [#uses=1]
607   ret <8 x i64> %res
608 }
609 declare <8 x i64> @llvm.x86.avx512.pbroadcastq.i64.512(i64) nounwind readonly
610
611 define <16 x i32> @test_conflict_d(<16 x i32> %a) {
612 ; CHECK-LABEL: test_conflict_d:
613 ; CHECK:       ## BB#0:
614 ; CHECK-NEXT:    vpconflictd %zmm0, %zmm0
615 ; CHECK-NEXT:    retq
616   %res = call <16 x i32> @llvm.x86.avx512.mask.conflict.d.512(<16 x i32> %a, <16 x i32> zeroinitializer, i16 -1)
617   ret <16 x i32> %res
618 }
619
620 declare <16 x i32> @llvm.x86.avx512.mask.conflict.d.512(<16 x i32>, <16 x i32>, i16) nounwind readonly
621
622 define <8 x i64> @test_conflict_q(<8 x i64> %a) {
623 ; CHECK-LABEL: test_conflict_q:
624 ; CHECK:       ## BB#0:
625 ; CHECK-NEXT:    vpconflictq %zmm0, %zmm0
626 ; CHECK-NEXT:    retq
627   %res = call <8 x i64> @llvm.x86.avx512.mask.conflict.q.512(<8 x i64> %a, <8 x i64> zeroinitializer, i8 -1)
628   ret <8 x i64> %res
629 }
630
631 declare <8 x i64> @llvm.x86.avx512.mask.conflict.q.512(<8 x i64>, <8 x i64>, i8) nounwind readonly
632
633 define <16 x i32> @test_maskz_conflict_d(<16 x i32> %a, i16 %mask) {
634 ; CHECK-LABEL: test_maskz_conflict_d:
635 ; CHECK:       ## BB#0:
636 ; CHECK-NEXT:    kmovw %edi, %k1
637 ; CHECK-NEXT:    vpconflictd %zmm0, %zmm0 {%k1} {z}
638 ; CHECK-NEXT:    retq
639   %res = call <16 x i32> @llvm.x86.avx512.mask.conflict.d.512(<16 x i32> %a, <16 x i32> zeroinitializer, i16 %mask)
640   ret <16 x i32> %res
641 }
642
643 define <8 x i64> @test_mask_conflict_q(<8 x i64> %a, <8 x i64> %b, i8 %mask) {
644 ; CHECK-LABEL: test_mask_conflict_q:
645 ; CHECK:       ## BB#0:
646 ; CHECK-NEXT:    movzbl %dil, %eax
647 ; CHECK-NEXT:    kmovw %eax, %k1
648 ; CHECK-NEXT:    vpconflictq %zmm0, %zmm1 {%k1}
649 ; CHECK-NEXT:    vmovaps %zmm1, %zmm0
650 ; CHECK-NEXT:    retq
651   %res = call <8 x i64> @llvm.x86.avx512.mask.conflict.q.512(<8 x i64> %a, <8 x i64> %b, i8 %mask)
652   ret <8 x i64> %res
653 }
654
655 define <16 x i32> @test_lzcnt_d(<16 x i32> %a) {
656 ; CHECK-LABEL: test_lzcnt_d:
657 ; CHECK:       ## BB#0:
658 ; CHECK-NEXT:    vplzcntd %zmm0, %zmm0
659 ; CHECK-NEXT:    retq
660   %res = call <16 x i32> @llvm.x86.avx512.mask.lzcnt.d.512(<16 x i32> %a, <16 x i32> zeroinitializer, i16 -1)
661   ret <16 x i32> %res
662 }
663
664 declare <16 x i32> @llvm.x86.avx512.mask.lzcnt.d.512(<16 x i32>, <16 x i32>, i16) nounwind readonly
665
666 define <8 x i64> @test_lzcnt_q(<8 x i64> %a) {
667 ; CHECK-LABEL: test_lzcnt_q:
668 ; CHECK:       ## BB#0:
669 ; CHECK-NEXT:    vplzcntq %zmm0, %zmm0
670 ; CHECK-NEXT:    retq
671   %res = call <8 x i64> @llvm.x86.avx512.mask.lzcnt.q.512(<8 x i64> %a, <8 x i64> zeroinitializer, i8 -1)
672   ret <8 x i64> %res
673 }
674
675 declare <8 x i64> @llvm.x86.avx512.mask.lzcnt.q.512(<8 x i64>, <8 x i64>, i8) nounwind readonly
676
677
678 define <16 x i32> @test_mask_lzcnt_d(<16 x i32> %a, <16 x i32> %b, i16 %mask) {
679 ; CHECK-LABEL: test_mask_lzcnt_d:
680 ; CHECK:       ## BB#0:
681 ; CHECK-NEXT:    kmovw %edi, %k1
682 ; CHECK-NEXT:    vplzcntd %zmm0, %zmm1 {%k1}
683 ; CHECK-NEXT:    vmovaps %zmm1, %zmm0
684 ; CHECK-NEXT:    retq
685   %res = call <16 x i32> @llvm.x86.avx512.mask.lzcnt.d.512(<16 x i32> %a, <16 x i32> %b, i16 %mask)
686   ret <16 x i32> %res
687 }
688
689 define <8 x i64> @test_mask_lzcnt_q(<8 x i64> %a, <8 x i64> %b, i8 %mask) {
690 ; CHECK-LABEL: test_mask_lzcnt_q:
691 ; CHECK:       ## BB#0:
692 ; CHECK-NEXT:    movzbl %dil, %eax
693 ; CHECK-NEXT:    kmovw %eax, %k1
694 ; CHECK-NEXT:    vplzcntq %zmm0, %zmm1 {%k1}
695 ; CHECK-NEXT:    vmovaps %zmm1, %zmm0
696 ; CHECK-NEXT:    retq
697   %res = call <8 x i64> @llvm.x86.avx512.mask.lzcnt.q.512(<8 x i64> %a, <8 x i64> %b, i8 %mask)
698   ret <8 x i64> %res
699 }
700
701 define <16 x float> @test_x86_mask_blend_ps_512(i16 %a0, <16 x float> %a1, <16 x float> %a2) {
702 ; CHECK-LABEL: test_x86_mask_blend_ps_512:
703 ; CHECK:       ## BB#0:
704 ; CHECK-NEXT:    kmovw %edi, %k1
705 ; CHECK-NEXT:    vblendmps %zmm1, %zmm0, %zmm0 {%k1}
706 ; CHECK-NEXT:    retq
707   %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]
708   ret <16 x float> %res
709 }
710
711 declare <16 x float> @llvm.x86.avx512.mask.blend.ps.512(<16 x float>, <16 x float>, i16) nounwind readonly
712
713 define <8 x double> @test_x86_mask_blend_pd_512(i8 %a0, <8 x double> %a1, <8 x double> %a2) {
714 ; CHECK-LABEL: test_x86_mask_blend_pd_512:
715 ; CHECK:       ## BB#0:
716 ; CHECK-NEXT:    movzbl %dil, %eax
717 ; CHECK-NEXT:    kmovw %eax, %k1
718 ; CHECK-NEXT:    vblendmpd %zmm1, %zmm0, %zmm0 {%k1}
719 ; CHECK-NEXT:    retq
720   %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]
721   ret <8 x double> %res
722 }
723
724 define <8 x double> @test_x86_mask_blend_pd_512_memop(<8 x double> %a, <8 x double>* %ptr, i8 %mask) {
725 ; CHECK-LABEL: test_x86_mask_blend_pd_512_memop:
726 ; CHECK:       ## BB#0:
727 ; CHECK-NEXT:    movzbl %sil, %eax
728 ; CHECK-NEXT:    kmovw %eax, %k1
729 ; CHECK-NEXT:    vblendmpd (%rdi), %zmm0, %zmm0 {%k1}
730 ; CHECK-NEXT:    retq
731   %b = load <8 x double>, <8 x double>* %ptr
732   %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]
733   ret <8 x double> %res
734 }
735 declare <8 x double> @llvm.x86.avx512.mask.blend.pd.512(<8 x double>, <8 x double>, i8) nounwind readonly
736
737 define <16 x i32> @test_x86_mask_blend_d_512(i16 %a0, <16 x i32> %a1, <16 x i32> %a2) {
738 ; CHECK-LABEL: test_x86_mask_blend_d_512:
739 ; CHECK:       ## BB#0:
740 ; CHECK-NEXT:    kmovw %edi, %k1
741 ; CHECK-NEXT:    vpblendmd %zmm1, %zmm0, %zmm0 {%k1}
742 ; CHECK-NEXT:    retq
743   %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]
744   ret <16 x i32> %res
745 }
746 declare <16 x i32> @llvm.x86.avx512.mask.blend.d.512(<16 x i32>, <16 x i32>, i16) nounwind readonly
747
748 define <8 x i64> @test_x86_mask_blend_q_512(i8 %a0, <8 x i64> %a1, <8 x i64> %a2) {
749 ; CHECK-LABEL: test_x86_mask_blend_q_512:
750 ; CHECK:       ## BB#0:
751 ; CHECK-NEXT:    movzbl %dil, %eax
752 ; CHECK-NEXT:    kmovw %eax, %k1
753 ; CHECK-NEXT:    vpblendmq %zmm1, %zmm0, %zmm0 {%k1}
754 ; CHECK-NEXT:    retq
755   %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]
756   ret <8 x i64> %res
757 }
758 declare <8 x i64> @llvm.x86.avx512.mask.blend.q.512(<8 x i64>, <8 x i64>, i8) nounwind readonly
759
760  define i16 @test_cmpps(<16 x float> %a, <16 x float> %b) {
761 ; CHECK-LABEL: test_cmpps:
762 ; CHECK:       ## BB#0:
763 ; CHECK-NEXT:    vcmpleps {sae}, %zmm1, %zmm0, %k0
764 ; CHECK-NEXT:    kmovw %k0, %eax
765 ; CHECK-NEXT:    retq
766    %res = call i16 @llvm.x86.avx512.mask.cmp.ps.512(<16 x float> %a, <16 x float> %b, i32 2, i16 -1, i32 8)
767    ret i16 %res
768  }
769  declare i16 @llvm.x86.avx512.mask.cmp.ps.512(<16 x float> , <16 x float> , i32, i16, i32)
770
771  define i8 @test_cmppd(<8 x double> %a, <8 x double> %b) {
772 ; CHECK-LABEL: test_cmppd:
773 ; CHECK:       ## BB#0:
774 ; CHECK-NEXT:    vcmpneqpd %zmm1, %zmm0, %k0
775 ; CHECK-NEXT:    kmovw %k0, %eax
776 ; CHECK-NEXT:    retq
777    %res = call i8 @llvm.x86.avx512.mask.cmp.pd.512(<8 x double> %a, <8 x double> %b, i32 4, i8 -1, i32 4)
778    ret i8 %res
779  }
780  declare i8 @llvm.x86.avx512.mask.cmp.pd.512(<8 x double> , <8 x double> , i32, i8, i32)
781
782  ; fp min - max
783 define <8 x double> @test_vmaxpd(<8 x double> %a0, <8 x double> %a1) {
784 ; CHECK-LABEL: test_vmaxpd:
785 ; CHECK:       ## BB#0:
786 ; CHECK-NEXT:    vmaxpd %zmm1, %zmm0, %zmm0
787 ; CHECK-NEXT:    retq
788   %res = call <8 x double> @llvm.x86.avx512.mask.max.pd.512(<8 x double> %a0, <8 x double> %a1,
789                     <8 x double>zeroinitializer, i8 -1, i32 4)
790   ret <8 x double> %res
791 }
792 declare <8 x double> @llvm.x86.avx512.mask.max.pd.512(<8 x double>, <8 x double>,
793                     <8 x double>, i8, i32)
794
795 define <8 x double> @test_vminpd(<8 x double> %a0, <8 x double> %a1) {
796 ; CHECK-LABEL: test_vminpd:
797 ; CHECK:       ## BB#0:
798 ; CHECK-NEXT:    vminpd %zmm1, %zmm0, %zmm0
799 ; CHECK-NEXT:    retq
800   %res = call <8 x double> @llvm.x86.avx512.mask.min.pd.512(<8 x double> %a0, <8 x double> %a1,
801                     <8 x double>zeroinitializer, i8 -1, i32 4)
802   ret <8 x double> %res
803 }
804 declare <8 x double> @llvm.x86.avx512.mask.min.pd.512(<8 x double>, <8 x double>,
805                     <8 x double>, i8, i32)
806
807  declare <16 x i32> @llvm.x86.avx512.mask.pabs.d.512(<16 x i32>, <16 x i32>, i16)
808
809 define <16 x i32>@test_int_x86_avx512_mask_pabs_d_512(<16 x i32> %x0, <16 x i32> %x1, i16 %x2) {
810 ; CHECK-LABEL: test_int_x86_avx512_mask_pabs_d_512:
811 ; CHECK:       ## BB#0:
812 ; CHECK-NEXT:    kmovw %edi, %k1
813 ; CHECK-NEXT:    vpabsd %zmm0, %zmm1 {%k1}
814 ; CHECK-NEXT:    vpabsd %zmm0, %zmm0
815 ; CHECK-NEXT:    vpaddd %zmm0, %zmm1, %zmm0
816 ; CHECK-NEXT:    retq
817   %res = call <16 x i32> @llvm.x86.avx512.mask.pabs.d.512(<16 x i32> %x0, <16 x i32> %x1, i16 %x2)
818   %res1 = call <16 x i32> @llvm.x86.avx512.mask.pabs.d.512(<16 x i32> %x0, <16 x i32> %x1, i16 -1)
819   %res2 = add <16 x i32> %res, %res1
820   ret <16 x i32> %res2
821 }
822
823 declare <8 x i64> @llvm.x86.avx512.mask.pabs.q.512(<8 x i64>, <8 x i64>, i8)
824
825 define <8 x i64>@test_int_x86_avx512_mask_pabs_q_512(<8 x i64> %x0, <8 x i64> %x1, i8 %x2) {
826 ; CHECK-LABEL: test_int_x86_avx512_mask_pabs_q_512:
827 ; CHECK:       ## BB#0:
828 ; CHECK-NEXT:    movzbl %dil, %eax
829 ; CHECK-NEXT:    kmovw %eax, %k1
830 ; CHECK-NEXT:    vpabsq %zmm0, %zmm1 {%k1}
831 ; CHECK-NEXT:    vpabsq %zmm0, %zmm0
832 ; CHECK-NEXT:    vpaddq %zmm0, %zmm1, %zmm0
833 ; CHECK-NEXT:    retq
834   %res = call <8 x i64> @llvm.x86.avx512.mask.pabs.q.512(<8 x i64> %x0, <8 x i64> %x1, i8 %x2)
835   %res1 = call <8 x i64> @llvm.x86.avx512.mask.pabs.q.512(<8 x i64> %x0, <8 x i64> %x1, i8 -1)
836   %res2 = add <8 x i64> %res, %res1
837   ret <8 x i64> %res2
838 }
839
840 define i8 @test_vptestmq(<8 x i64> %a0, <8 x i64> %a1) {
841 ; CHECK-LABEL: test_vptestmq:
842 ; CHECK:       ## BB#0:
843 ; CHECK-NEXT:    vptestmq %zmm1, %zmm0, %k0
844 ; CHECK-NEXT:    kmovw %k0, %eax
845 ; CHECK-NEXT:    retq
846   %res = call i8 @llvm.x86.avx512.mask.ptestm.q.512(<8 x i64> %a0, <8 x i64> %a1, i8 -1)
847   ret i8 %res
848 }
849 declare i8 @llvm.x86.avx512.mask.ptestm.q.512(<8 x i64>, <8 x i64>, i8)
850
851 define i16 @test_vptestmd(<16 x i32> %a0, <16 x i32> %a1) {
852 ; CHECK-LABEL: test_vptestmd:
853 ; CHECK:       ## BB#0:
854 ; CHECK-NEXT:    vptestmd %zmm1, %zmm0, %k0
855 ; CHECK-NEXT:    kmovw %k0, %eax
856 ; CHECK-NEXT:    retq
857   %res = call i16 @llvm.x86.avx512.mask.ptestm.d.512(<16 x i32> %a0, <16 x i32> %a1, i16 -1)
858   ret i16 %res
859 }
860 declare i16 @llvm.x86.avx512.mask.ptestm.d.512(<16 x i32>, <16 x i32>, i16)
861
862 define void @test_store1(<16 x float> %data, i8* %ptr, i16 %mask) {
863 ; CHECK-LABEL: test_store1:
864 ; CHECK:       ## BB#0:
865 ; CHECK-NEXT:    kmovw %esi, %k1
866 ; CHECK-NEXT:    vmovups %zmm0, (%rdi) {%k1}
867 ; CHECK-NEXT:    retq
868   call void @llvm.x86.avx512.mask.storeu.ps.512(i8* %ptr, <16 x float> %data, i16 %mask)
869   ret void
870 }
871
872 declare void @llvm.x86.avx512.mask.storeu.ps.512(i8*, <16 x float>, i16 )
873
874 define void @test_store2(<8 x double> %data, i8* %ptr, i8 %mask) {
875 ; CHECK-LABEL: test_store2:
876 ; CHECK:       ## BB#0:
877 ; CHECK-NEXT:    kmovw %esi, %k1
878 ; CHECK-NEXT:    vmovupd %zmm0, (%rdi) {%k1}
879 ; CHECK-NEXT:    retq
880   call void @llvm.x86.avx512.mask.storeu.pd.512(i8* %ptr, <8 x double> %data, i8 %mask)
881   ret void
882 }
883
884 declare void @llvm.x86.avx512.mask.storeu.pd.512(i8*, <8 x double>, i8)
885
886 define void @test_mask_store_aligned_ps(<16 x float> %data, i8* %ptr, i16 %mask) {
887 ; CHECK-LABEL: test_mask_store_aligned_ps:
888 ; CHECK:       ## BB#0:
889 ; CHECK-NEXT:    kmovw %esi, %k1
890 ; CHECK-NEXT:    vmovaps %zmm0, (%rdi) {%k1}
891 ; CHECK-NEXT:    retq
892   call void @llvm.x86.avx512.mask.store.ps.512(i8* %ptr, <16 x float> %data, i16 %mask)
893   ret void
894 }
895
896 declare void @llvm.x86.avx512.mask.store.ps.512(i8*, <16 x float>, i16 )
897
898 define void @test_mask_store_aligned_pd(<8 x double> %data, i8* %ptr, i8 %mask) {
899 ; CHECK-LABEL: test_mask_store_aligned_pd:
900 ; CHECK:       ## BB#0:
901 ; CHECK-NEXT:    kmovw %esi, %k1
902 ; CHECK-NEXT:    vmovapd %zmm0, (%rdi) {%k1}
903 ; CHECK-NEXT:    retq
904   call void @llvm.x86.avx512.mask.store.pd.512(i8* %ptr, <8 x double> %data, i8 %mask)
905   ret void
906 }
907
908 declare void @llvm.x86.avx512.mask.store.pd.512(i8*, <8 x double>, i8)
909
910 define <16 x float> @test_maskz_load_aligned_ps(<16 x float> %data, i8* %ptr, i16 %mask) {
911 ; CHECK-LABEL: test_maskz_load_aligned_ps:
912 ; CHECK:       ## BB#0:
913 ; CHECK-NEXT:    kmovw %esi, %k1
914 ; CHECK-NEXT:    vmovaps (%rdi), %zmm0 {%k1} {z}
915 ; CHECK-NEXT:    retq
916   %res = call <16 x float> @llvm.x86.avx512.mask.load.ps.512(i8* %ptr, <16 x float> zeroinitializer, i16 %mask)
917   ret <16 x float> %res
918 }
919
920 declare <16 x float> @llvm.x86.avx512.mask.load.ps.512(i8*, <16 x float>, i16)
921
922 define <8 x double> @test_maskz_load_aligned_pd(<8 x double> %data, i8* %ptr, i8 %mask) {
923 ; CHECK-LABEL: test_maskz_load_aligned_pd:
924 ; CHECK:       ## BB#0:
925 ; CHECK-NEXT:    kmovw %esi, %k1
926 ; CHECK-NEXT:    vmovapd (%rdi), %zmm0 {%k1} {z}
927 ; CHECK-NEXT:    retq
928   %res = call <8 x double> @llvm.x86.avx512.mask.load.pd.512(i8* %ptr, <8 x double> zeroinitializer, i8 %mask)
929   ret <8 x double> %res
930 }
931
932 declare <8 x double> @llvm.x86.avx512.mask.load.pd.512(i8*, <8 x double>, i8)
933
934 define <16 x float> @test_load_aligned_ps(<16 x float> %data, i8* %ptr, i16 %mask) {
935 ; CHECK-LABEL: test_load_aligned_ps:
936 ; CHECK:       ## BB#0:
937 ; CHECK-NEXT:    vmovaps (%rdi), %zmm0
938 ; CHECK-NEXT:    retq
939   %res = call <16 x float> @llvm.x86.avx512.mask.load.ps.512(i8* %ptr, <16 x float> zeroinitializer, i16 -1)
940   ret <16 x float> %res
941 }
942
943 define <8 x double> @test_load_aligned_pd(<8 x double> %data, i8* %ptr, i8 %mask) {
944 ; CHECK-LABEL: test_load_aligned_pd:
945 ; CHECK:       ## BB#0:
946 ; CHECK-NEXT:    vmovapd (%rdi), %zmm0
947 ; CHECK-NEXT:    retq
948   %res = call <8 x double> @llvm.x86.avx512.mask.load.pd.512(i8* %ptr, <8 x double> zeroinitializer, i8 -1)
949   ret <8 x double> %res
950 }
951
952 declare <8 x i64> @llvm.x86.avx512.movntdqa(i8*)
953
954 define <8 x i64> @test_valign_q(<8 x i64> %a, <8 x i64> %b) {
955 ; CHECK-LABEL: test_valign_q:
956 ; CHECK:       ## BB#0:
957 ; CHECK-NEXT:    valignq $2, %zmm1, %zmm0, %zmm0
958 ; CHECK-NEXT:    retq
959   %res = call <8 x i64> @llvm.x86.avx512.mask.valign.q.512(<8 x i64> %a, <8 x i64> %b, i32 2, <8 x i64> zeroinitializer, i8 -1)
960   ret <8 x i64> %res
961 }
962
963 define <8 x i64> @test_mask_valign_q(<8 x i64> %a, <8 x i64> %b, <8 x i64> %src, i8 %mask) {
964 ; CHECK-LABEL: test_mask_valign_q:
965 ; CHECK:       ## BB#0:
966 ; CHECK-NEXT:    movzbl %dil, %eax
967 ; CHECK-NEXT:    kmovw %eax, %k1
968 ; CHECK-NEXT:    valignq $2, %zmm1, %zmm0, %zmm2 {%k1}
969 ; CHECK-NEXT:    vmovaps %zmm2, %zmm0
970 ; CHECK-NEXT:    retq
971   %res = call <8 x i64> @llvm.x86.avx512.mask.valign.q.512(<8 x i64> %a, <8 x i64> %b, i32 2, <8 x i64> %src, i8 %mask)
972   ret <8 x i64> %res
973 }
974
975 declare <8 x i64> @llvm.x86.avx512.mask.valign.q.512(<8 x i64>, <8 x i64>, i32, <8 x i64>, i8)
976
977 define <16 x i32> @test_maskz_valign_d(<16 x i32> %a, <16 x i32> %b, i16 %mask) {
978 ; CHECK-LABEL: test_maskz_valign_d:
979 ; CHECK:       ## BB#0:
980 ; CHECK-NEXT:    kmovw %edi, %k1
981 ; CHECK-NEXT:    valignd $5, %zmm1, %zmm0, %zmm0 {%k1} {z}
982 ; CHECK-NEXT:    retq
983   %res = call <16 x i32> @llvm.x86.avx512.mask.valign.d.512(<16 x i32> %a, <16 x i32> %b, i32 5, <16 x i32> zeroinitializer, i16 %mask)
984   ret <16 x i32> %res
985 }
986
987 declare <16 x i32> @llvm.x86.avx512.mask.valign.d.512(<16 x i32>, <16 x i32>, i32, <16 x i32>, i16)
988
989 define void @test_mask_store_ss(i8* %ptr, <4 x float> %data, i8 %mask) {
990 ; CHECK-LABEL: test_mask_store_ss:
991 ; CHECK:       ## BB#0:
992 ; CHECK-NEXT:    kmovw %esi, %k1
993 ; CHECK-NEXT:    vmovss %xmm0, (%rdi) {%k1}
994 ; CHECK-NEXT:    retq
995  call void @llvm.x86.avx512.mask.store.ss(i8* %ptr, <4 x float> %data, i8 %mask)
996  ret void
997 }
998
999 declare void @llvm.x86.avx512.mask.store.ss(i8*, <4 x float>, i8 )
1000
1001 define i16 @test_pcmpeq_d(<16 x i32> %a, <16 x i32> %b) {
1002 ; CHECK-LABEL: test_pcmpeq_d:
1003 ; CHECK:       ## BB#0:
1004 ; CHECK-NEXT:    vpcmpeqd %zmm1, %zmm0, %k0
1005 ; CHECK-NEXT:    kmovw %k0, %eax
1006 ; CHECK-NEXT:    retq
1007   %res = call i16 @llvm.x86.avx512.mask.pcmpeq.d.512(<16 x i32> %a, <16 x i32> %b, i16 -1)
1008   ret i16 %res
1009 }
1010
1011 define i16 @test_mask_pcmpeq_d(<16 x i32> %a, <16 x i32> %b, i16 %mask) {
1012 ; CHECK-LABEL: test_mask_pcmpeq_d:
1013 ; CHECK:       ## BB#0:
1014 ; CHECK-NEXT:    kmovw %edi, %k1
1015 ; CHECK-NEXT:    vpcmpeqd %zmm1, %zmm0, %k0 {%k1}
1016 ; CHECK-NEXT:    kmovw %k0, %eax
1017 ; CHECK-NEXT:    retq
1018   %res = call i16 @llvm.x86.avx512.mask.pcmpeq.d.512(<16 x i32> %a, <16 x i32> %b, i16 %mask)
1019   ret i16 %res
1020 }
1021
1022 declare i16 @llvm.x86.avx512.mask.pcmpeq.d.512(<16 x i32>, <16 x i32>, i16)
1023
1024 define i8 @test_pcmpeq_q(<8 x i64> %a, <8 x i64> %b) {
1025 ; CHECK-LABEL: test_pcmpeq_q:
1026 ; CHECK:       ## BB#0:
1027 ; CHECK-NEXT:    vpcmpeqq %zmm1, %zmm0, %k0
1028 ; CHECK-NEXT:    kmovw %k0, %eax
1029 ; CHECK-NEXT:    retq
1030   %res = call i8 @llvm.x86.avx512.mask.pcmpeq.q.512(<8 x i64> %a, <8 x i64> %b, i8 -1)
1031   ret i8 %res
1032 }
1033
1034 define i8 @test_mask_pcmpeq_q(<8 x i64> %a, <8 x i64> %b, i8 %mask) {
1035 ; CHECK-LABEL: test_mask_pcmpeq_q:
1036 ; CHECK:       ## BB#0:
1037 ; CHECK-NEXT:    movzbl %dil, %eax
1038 ; CHECK-NEXT:    kmovw %eax, %k1
1039 ; CHECK-NEXT:    vpcmpeqq %zmm1, %zmm0, %k0 {%k1}
1040 ; CHECK-NEXT:    kmovw %k0, %eax
1041 ; CHECK-NEXT:    retq
1042   %res = call i8 @llvm.x86.avx512.mask.pcmpeq.q.512(<8 x i64> %a, <8 x i64> %b, i8 %mask)
1043   ret i8 %res
1044 }
1045
1046 declare i8 @llvm.x86.avx512.mask.pcmpeq.q.512(<8 x i64>, <8 x i64>, i8)
1047
1048 define i16 @test_pcmpgt_d(<16 x i32> %a, <16 x i32> %b) {
1049 ; CHECK-LABEL: test_pcmpgt_d:
1050 ; CHECK:       ## BB#0:
1051 ; CHECK-NEXT:    vpcmpgtd %zmm1, %zmm0, %k0
1052 ; CHECK-NEXT:    kmovw %k0, %eax
1053 ; CHECK-NEXT:    retq
1054   %res = call i16 @llvm.x86.avx512.mask.pcmpgt.d.512(<16 x i32> %a, <16 x i32> %b, i16 -1)
1055   ret i16 %res
1056 }
1057
1058 define i16 @test_mask_pcmpgt_d(<16 x i32> %a, <16 x i32> %b, i16 %mask) {
1059 ; CHECK-LABEL: test_mask_pcmpgt_d:
1060 ; CHECK:       ## BB#0:
1061 ; CHECK-NEXT:    kmovw %edi, %k1
1062 ; CHECK-NEXT:    vpcmpgtd %zmm1, %zmm0, %k0 {%k1}
1063 ; CHECK-NEXT:    kmovw %k0, %eax
1064 ; CHECK-NEXT:    retq
1065   %res = call i16 @llvm.x86.avx512.mask.pcmpgt.d.512(<16 x i32> %a, <16 x i32> %b, i16 %mask)
1066   ret i16 %res
1067 }
1068
1069 declare i16 @llvm.x86.avx512.mask.pcmpgt.d.512(<16 x i32>, <16 x i32>, i16)
1070
1071 define i8 @test_pcmpgt_q(<8 x i64> %a, <8 x i64> %b) {
1072 ; CHECK-LABEL: test_pcmpgt_q:
1073 ; CHECK:       ## BB#0:
1074 ; CHECK-NEXT:    vpcmpgtq %zmm1, %zmm0, %k0
1075 ; CHECK-NEXT:    kmovw %k0, %eax
1076 ; CHECK-NEXT:    retq
1077   %res = call i8 @llvm.x86.avx512.mask.pcmpgt.q.512(<8 x i64> %a, <8 x i64> %b, i8 -1)
1078   ret i8 %res
1079 }
1080
1081 define i8 @test_mask_pcmpgt_q(<8 x i64> %a, <8 x i64> %b, i8 %mask) {
1082 ; CHECK-LABEL: test_mask_pcmpgt_q:
1083 ; CHECK:       ## BB#0:
1084 ; CHECK-NEXT:    movzbl %dil, %eax
1085 ; CHECK-NEXT:    kmovw %eax, %k1
1086 ; CHECK-NEXT:    vpcmpgtq %zmm1, %zmm0, %k0 {%k1}
1087 ; CHECK-NEXT:    kmovw %k0, %eax
1088 ; CHECK-NEXT:    retq
1089   %res = call i8 @llvm.x86.avx512.mask.pcmpgt.q.512(<8 x i64> %a, <8 x i64> %b, i8 %mask)
1090   ret i8 %res
1091 }
1092
1093 declare i8 @llvm.x86.avx512.mask.pcmpgt.q.512(<8 x i64>, <8 x i64>, i8)
1094
1095 define <8 x i16> @test_cmp_d_512(<16 x i32> %a0, <16 x i32> %a1) {
1096 ; CHECK-LABEL: test_cmp_d_512:
1097 ; CHECK:       ## BB#0:
1098 ; CHECK-NEXT:    vpcmpeqd %zmm1, %zmm0, %k0
1099 ; CHECK-NEXT:    kmovw %k0, %r8d
1100 ; CHECK-NEXT:    vpcmpltd %zmm1, %zmm0, %k0
1101 ; CHECK-NEXT:    kmovw %k0, %r9d
1102 ; CHECK-NEXT:    vpcmpled %zmm1, %zmm0, %k0
1103 ; CHECK-NEXT:    kmovw %k0, %r10d
1104 ; CHECK-NEXT:    vpcmpunordd %zmm1, %zmm0, %k0
1105 ; CHECK-NEXT:    kmovw %k0, %esi
1106 ; CHECK-NEXT:    vpcmpneqd %zmm1, %zmm0, %k0
1107 ; CHECK-NEXT:    kmovw %k0, %edi
1108 ; CHECK-NEXT:    vpcmpnltd %zmm1, %zmm0, %k0
1109 ; CHECK-NEXT:    kmovw %k0, %eax
1110 ; CHECK-NEXT:    vpcmpnled %zmm1, %zmm0, %k0
1111 ; CHECK-NEXT:    kmovw %k0, %ecx
1112 ; CHECK-NEXT:    vpcmpordd %zmm1, %zmm0, %k0
1113 ; CHECK-NEXT:    kmovw %k0, %edx
1114 ; CHECK-NEXT:    vmovd %r8d, %xmm0
1115 ; CHECK-NEXT:    vpinsrw $1, %r9d, %xmm0, %xmm0
1116 ; CHECK-NEXT:    vpinsrw $2, %r10d, %xmm0, %xmm0
1117 ; CHECK-NEXT:    vpinsrw $3, %esi, %xmm0, %xmm0
1118 ; CHECK-NEXT:    vpinsrw $4, %edi, %xmm0, %xmm0
1119 ; CHECK-NEXT:    vpinsrw $5, %eax, %xmm0, %xmm0
1120 ; CHECK-NEXT:    vpinsrw $6, %ecx, %xmm0, %xmm0
1121 ; CHECK-NEXT:    vpinsrw $7, %edx, %xmm0, %xmm0
1122 ; CHECK-NEXT:    retq
1123   %res0 = call i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 0, i16 -1)
1124   %vec0 = insertelement <8 x i16> undef, i16 %res0, i32 0
1125   %res1 = call i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 1, i16 -1)
1126   %vec1 = insertelement <8 x i16> %vec0, i16 %res1, i32 1
1127   %res2 = call i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 2, i16 -1)
1128   %vec2 = insertelement <8 x i16> %vec1, i16 %res2, i32 2
1129   %res3 = call i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 3, i16 -1)
1130   %vec3 = insertelement <8 x i16> %vec2, i16 %res3, i32 3
1131   %res4 = call i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 4, i16 -1)
1132   %vec4 = insertelement <8 x i16> %vec3, i16 %res4, i32 4
1133   %res5 = call i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 5, i16 -1)
1134   %vec5 = insertelement <8 x i16> %vec4, i16 %res5, i32 5
1135   %res6 = call i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 6, i16 -1)
1136   %vec6 = insertelement <8 x i16> %vec5, i16 %res6, i32 6
1137   %res7 = call i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 7, i16 -1)
1138   %vec7 = insertelement <8 x i16> %vec6, i16 %res7, i32 7
1139   ret <8 x i16> %vec7
1140 }
1141
1142 define <8 x i16> @test_mask_cmp_d_512(<16 x i32> %a0, <16 x i32> %a1, i16 %mask) {
1143 ; CHECK-LABEL: test_mask_cmp_d_512:
1144 ; CHECK:       ## BB#0:
1145 ; CHECK-NEXT:    kmovw %edi, %k1
1146 ; CHECK-NEXT:    vpcmpeqd %zmm1, %zmm0, %k0 {%k1}
1147 ; CHECK-NEXT:    kmovw %k0, %r8d
1148 ; CHECK-NEXT:    vpcmpltd %zmm1, %zmm0, %k0 {%k1}
1149 ; CHECK-NEXT:    kmovw %k0, %r9d
1150 ; CHECK-NEXT:    vpcmpled %zmm1, %zmm0, %k0 {%k1}
1151 ; CHECK-NEXT:    kmovw %k0, %r10d
1152 ; CHECK-NEXT:    vpcmpunordd %zmm1, %zmm0, %k0 {%k1}
1153 ; CHECK-NEXT:    kmovw %k0, %esi
1154 ; CHECK-NEXT:    vpcmpneqd %zmm1, %zmm0, %k0 {%k1}
1155 ; CHECK-NEXT:    kmovw %k0, %edi
1156 ; CHECK-NEXT:    vpcmpnltd %zmm1, %zmm0, %k0 {%k1}
1157 ; CHECK-NEXT:    kmovw %k0, %eax
1158 ; CHECK-NEXT:    vpcmpnled %zmm1, %zmm0, %k0 {%k1}
1159 ; CHECK-NEXT:    kmovw %k0, %ecx
1160 ; CHECK-NEXT:    vpcmpordd %zmm1, %zmm0, %k0 {%k1}
1161 ; CHECK-NEXT:    kmovw %k0, %edx
1162 ; CHECK-NEXT:    vmovd %r8d, %xmm0
1163 ; CHECK-NEXT:    vpinsrw $1, %r9d, %xmm0, %xmm0
1164 ; CHECK-NEXT:    vpinsrw $2, %r10d, %xmm0, %xmm0
1165 ; CHECK-NEXT:    vpinsrw $3, %esi, %xmm0, %xmm0
1166 ; CHECK-NEXT:    vpinsrw $4, %edi, %xmm0, %xmm0
1167 ; CHECK-NEXT:    vpinsrw $5, %eax, %xmm0, %xmm0
1168 ; CHECK-NEXT:    vpinsrw $6, %ecx, %xmm0, %xmm0
1169 ; CHECK-NEXT:    vpinsrw $7, %edx, %xmm0, %xmm0
1170 ; CHECK-NEXT:    retq
1171   %res0 = call i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 0, i16 %mask)
1172   %vec0 = insertelement <8 x i16> undef, i16 %res0, i32 0
1173   %res1 = call i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 1, i16 %mask)
1174   %vec1 = insertelement <8 x i16> %vec0, i16 %res1, i32 1
1175   %res2 = call i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 2, i16 %mask)
1176   %vec2 = insertelement <8 x i16> %vec1, i16 %res2, i32 2
1177   %res3 = call i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 3, i16 %mask)
1178   %vec3 = insertelement <8 x i16> %vec2, i16 %res3, i32 3
1179   %res4 = call i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 4, i16 %mask)
1180   %vec4 = insertelement <8 x i16> %vec3, i16 %res4, i32 4
1181   %res5 = call i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 5, i16 %mask)
1182   %vec5 = insertelement <8 x i16> %vec4, i16 %res5, i32 5
1183   %res6 = call i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 6, i16 %mask)
1184   %vec6 = insertelement <8 x i16> %vec5, i16 %res6, i32 6
1185   %res7 = call i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 7, i16 %mask)
1186   %vec7 = insertelement <8 x i16> %vec6, i16 %res7, i32 7
1187   ret <8 x i16> %vec7
1188 }
1189
1190 declare i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32>, <16 x i32>, i32, i16) nounwind readnone
1191
1192 define <8 x i16> @test_ucmp_d_512(<16 x i32> %a0, <16 x i32> %a1) {
1193 ; CHECK-LABEL: test_ucmp_d_512:
1194 ; CHECK:       ## BB#0:
1195 ; CHECK-NEXT:    vpcmpequd %zmm1, %zmm0, %k0
1196 ; CHECK-NEXT:    kmovw %k0, %r8d
1197 ; CHECK-NEXT:    vpcmpltud %zmm1, %zmm0, %k0
1198 ; CHECK-NEXT:    kmovw %k0, %r9d
1199 ; CHECK-NEXT:    vpcmpleud %zmm1, %zmm0, %k0
1200 ; CHECK-NEXT:    kmovw %k0, %r10d
1201 ; CHECK-NEXT:    vpcmpunordud %zmm1, %zmm0, %k0
1202 ; CHECK-NEXT:    kmovw %k0, %esi
1203 ; CHECK-NEXT:    vpcmpnequd %zmm1, %zmm0, %k0
1204 ; CHECK-NEXT:    kmovw %k0, %edi
1205 ; CHECK-NEXT:    vpcmpnltud %zmm1, %zmm0, %k0
1206 ; CHECK-NEXT:    kmovw %k0, %eax
1207 ; CHECK-NEXT:    vpcmpnleud %zmm1, %zmm0, %k0
1208 ; CHECK-NEXT:    kmovw %k0, %ecx
1209 ; CHECK-NEXT:    vpcmpordud %zmm1, %zmm0, %k0
1210 ; CHECK-NEXT:    kmovw %k0, %edx
1211 ; CHECK-NEXT:    vmovd %r8d, %xmm0
1212 ; CHECK-NEXT:    vpinsrw $1, %r9d, %xmm0, %xmm0
1213 ; CHECK-NEXT:    vpinsrw $2, %r10d, %xmm0, %xmm0
1214 ; CHECK-NEXT:    vpinsrw $3, %esi, %xmm0, %xmm0
1215 ; CHECK-NEXT:    vpinsrw $4, %edi, %xmm0, %xmm0
1216 ; CHECK-NEXT:    vpinsrw $5, %eax, %xmm0, %xmm0
1217 ; CHECK-NEXT:    vpinsrw $6, %ecx, %xmm0, %xmm0
1218 ; CHECK-NEXT:    vpinsrw $7, %edx, %xmm0, %xmm0
1219 ; CHECK-NEXT:    retq
1220   %res0 = call i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 0, i16 -1)
1221   %vec0 = insertelement <8 x i16> undef, i16 %res0, i32 0
1222   %res1 = call i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 1, i16 -1)
1223   %vec1 = insertelement <8 x i16> %vec0, i16 %res1, i32 1
1224   %res2 = call i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 2, i16 -1)
1225   %vec2 = insertelement <8 x i16> %vec1, i16 %res2, i32 2
1226   %res3 = call i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 3, i16 -1)
1227   %vec3 = insertelement <8 x i16> %vec2, i16 %res3, i32 3
1228   %res4 = call i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 4, i16 -1)
1229   %vec4 = insertelement <8 x i16> %vec3, i16 %res4, i32 4
1230   %res5 = call i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 5, i16 -1)
1231   %vec5 = insertelement <8 x i16> %vec4, i16 %res5, i32 5
1232   %res6 = call i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 6, i16 -1)
1233   %vec6 = insertelement <8 x i16> %vec5, i16 %res6, i32 6
1234   %res7 = call i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 7, i16 -1)
1235   %vec7 = insertelement <8 x i16> %vec6, i16 %res7, i32 7
1236   ret <8 x i16> %vec7
1237 }
1238
1239 define <8 x i16> @test_mask_ucmp_d_512(<16 x i32> %a0, <16 x i32> %a1, i16 %mask) {
1240 ; CHECK-LABEL: test_mask_ucmp_d_512:
1241 ; CHECK:       ## BB#0:
1242 ; CHECK-NEXT:    kmovw %edi, %k1
1243 ; CHECK-NEXT:    vpcmpequd %zmm1, %zmm0, %k0 {%k1}
1244 ; CHECK-NEXT:    kmovw %k0, %r8d
1245 ; CHECK-NEXT:    vpcmpltud %zmm1, %zmm0, %k0 {%k1}
1246 ; CHECK-NEXT:    kmovw %k0, %r9d
1247 ; CHECK-NEXT:    vpcmpleud %zmm1, %zmm0, %k0 {%k1}
1248 ; CHECK-NEXT:    kmovw %k0, %r10d
1249 ; CHECK-NEXT:    vpcmpunordud %zmm1, %zmm0, %k0 {%k1}
1250 ; CHECK-NEXT:    kmovw %k0, %esi
1251 ; CHECK-NEXT:    vpcmpnequd %zmm1, %zmm0, %k0 {%k1}
1252 ; CHECK-NEXT:    kmovw %k0, %edi
1253 ; CHECK-NEXT:    vpcmpnltud %zmm1, %zmm0, %k0 {%k1}
1254 ; CHECK-NEXT:    kmovw %k0, %eax
1255 ; CHECK-NEXT:    vpcmpnleud %zmm1, %zmm0, %k0 {%k1}
1256 ; CHECK-NEXT:    kmovw %k0, %ecx
1257 ; CHECK-NEXT:    vpcmpordud %zmm1, %zmm0, %k0 {%k1}
1258 ; CHECK-NEXT:    kmovw %k0, %edx
1259 ; CHECK-NEXT:    vmovd %r8d, %xmm0
1260 ; CHECK-NEXT:    vpinsrw $1, %r9d, %xmm0, %xmm0
1261 ; CHECK-NEXT:    vpinsrw $2, %r10d, %xmm0, %xmm0
1262 ; CHECK-NEXT:    vpinsrw $3, %esi, %xmm0, %xmm0
1263 ; CHECK-NEXT:    vpinsrw $4, %edi, %xmm0, %xmm0
1264 ; CHECK-NEXT:    vpinsrw $5, %eax, %xmm0, %xmm0
1265 ; CHECK-NEXT:    vpinsrw $6, %ecx, %xmm0, %xmm0
1266 ; CHECK-NEXT:    vpinsrw $7, %edx, %xmm0, %xmm0
1267 ; CHECK-NEXT:    retq
1268   %res0 = call i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 0, i16 %mask)
1269   %vec0 = insertelement <8 x i16> undef, i16 %res0, i32 0
1270   %res1 = call i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 1, i16 %mask)
1271   %vec1 = insertelement <8 x i16> %vec0, i16 %res1, i32 1
1272   %res2 = call i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 2, i16 %mask)
1273   %vec2 = insertelement <8 x i16> %vec1, i16 %res2, i32 2
1274   %res3 = call i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 3, i16 %mask)
1275   %vec3 = insertelement <8 x i16> %vec2, i16 %res3, i32 3
1276   %res4 = call i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 4, i16 %mask)
1277   %vec4 = insertelement <8 x i16> %vec3, i16 %res4, i32 4
1278   %res5 = call i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 5, i16 %mask)
1279   %vec5 = insertelement <8 x i16> %vec4, i16 %res5, i32 5
1280   %res6 = call i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 6, i16 %mask)
1281   %vec6 = insertelement <8 x i16> %vec5, i16 %res6, i32 6
1282   %res7 = call i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 7, i16 %mask)
1283   %vec7 = insertelement <8 x i16> %vec6, i16 %res7, i32 7
1284   ret <8 x i16> %vec7
1285 }
1286
1287 declare i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32>, <16 x i32>, i32, i16) nounwind readnone
1288
1289 define <8 x i8> @test_cmp_q_512(<8 x i64> %a0, <8 x i64> %a1) {
1290 ; CHECK-LABEL: test_cmp_q_512:
1291 ; CHECK:       ## BB#0:
1292 ; CHECK-NEXT:    vpcmpeqq %zmm1, %zmm0, %k0
1293 ; CHECK-NEXT:    kmovw %k0, %r8d
1294 ; CHECK-NEXT:    vpcmpltq %zmm1, %zmm0, %k0
1295 ; CHECK-NEXT:    kmovw %k0, %r9d
1296 ; CHECK-NEXT:    vpcmpleq %zmm1, %zmm0, %k0
1297 ; CHECK-NEXT:    kmovw %k0, %r10d
1298 ; CHECK-NEXT:    vpcmpunordq %zmm1, %zmm0, %k0
1299 ; CHECK-NEXT:    kmovw %k0, %r11d
1300 ; CHECK-NEXT:    vpcmpneqq %zmm1, %zmm0, %k0
1301 ; CHECK-NEXT:    kmovw %k0, %edi
1302 ; CHECK-NEXT:    vpcmpnltq %zmm1, %zmm0, %k0
1303 ; CHECK-NEXT:    kmovw %k0, %eax
1304 ; CHECK-NEXT:    vpcmpnleq %zmm1, %zmm0, %k0
1305 ; CHECK-NEXT:    kmovw %k0, %ecx
1306 ; CHECK-NEXT:    vpcmpordq %zmm1, %zmm0, %k0
1307 ; CHECK-NEXT:    kmovw %k0, %edx
1308 ; CHECK-NEXT:    movzbl %r8b, %esi
1309 ; CHECK-NEXT:    vpinsrb $0, %esi, %xmm0, %xmm0
1310 ; CHECK-NEXT:    movzbl %r9b, %esi
1311 ; CHECK-NEXT:    vpinsrb $2, %esi, %xmm0, %xmm0
1312 ; CHECK-NEXT:    movzbl %r10b, %esi
1313 ; CHECK-NEXT:    vpinsrb $4, %esi, %xmm0, %xmm0
1314 ; CHECK-NEXT:    movzbl %r11b, %esi
1315 ; CHECK-NEXT:    vpinsrb $6, %esi, %xmm0, %xmm0
1316 ; CHECK-NEXT:    movzbl %dil, %esi
1317 ; CHECK-NEXT:    vpinsrb $8, %esi, %xmm0, %xmm0
1318 ; CHECK-NEXT:    movzbl %al, %eax
1319 ; CHECK-NEXT:    vpinsrb $10, %eax, %xmm0, %xmm0
1320 ; CHECK-NEXT:    movzbl %cl, %eax
1321 ; CHECK-NEXT:    vpinsrb $12, %eax, %xmm0, %xmm0
1322 ; CHECK-NEXT:    movzbl %dl, %eax
1323 ; CHECK-NEXT:    vpinsrb $14, %eax, %xmm0, %xmm0
1324 ; CHECK-NEXT:    retq
1325   %res0 = call i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 0, i8 -1)
1326   %vec0 = insertelement <8 x i8> undef, i8 %res0, i32 0
1327   %res1 = call i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 1, i8 -1)
1328   %vec1 = insertelement <8 x i8> %vec0, i8 %res1, i32 1
1329   %res2 = call i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 2, i8 -1)
1330   %vec2 = insertelement <8 x i8> %vec1, i8 %res2, i32 2
1331   %res3 = call i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 3, i8 -1)
1332   %vec3 = insertelement <8 x i8> %vec2, i8 %res3, i32 3
1333   %res4 = call i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 4, i8 -1)
1334   %vec4 = insertelement <8 x i8> %vec3, i8 %res4, i32 4
1335   %res5 = call i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 5, i8 -1)
1336   %vec5 = insertelement <8 x i8> %vec4, i8 %res5, i32 5
1337   %res6 = call i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 6, i8 -1)
1338   %vec6 = insertelement <8 x i8> %vec5, i8 %res6, i32 6
1339   %res7 = call i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 7, i8 -1)
1340   %vec7 = insertelement <8 x i8> %vec6, i8 %res7, i32 7
1341   ret <8 x i8> %vec7
1342 }
1343
1344 define <8 x i8> @test_mask_cmp_q_512(<8 x i64> %a0, <8 x i64> %a1, i8 %mask) {
1345 ; CHECK-LABEL: test_mask_cmp_q_512:
1346 ; CHECK:       ## BB#0:
1347 ; CHECK-NEXT:    movzbl %dil, %eax
1348 ; CHECK-NEXT:    kmovw %eax, %k1
1349 ; CHECK-NEXT:    vpcmpeqq %zmm1, %zmm0, %k0 {%k1}
1350 ; CHECK-NEXT:    kmovw %k0, %r8d
1351 ; CHECK-NEXT:    vpcmpltq %zmm1, %zmm0, %k0 {%k1}
1352 ; CHECK-NEXT:    kmovw %k0, %r9d
1353 ; CHECK-NEXT:    vpcmpleq %zmm1, %zmm0, %k0 {%k1}
1354 ; CHECK-NEXT:    kmovw %k0, %r10d
1355 ; CHECK-NEXT:    vpcmpunordq %zmm1, %zmm0, %k0 {%k1}
1356 ; CHECK-NEXT:    kmovw %k0, %r11d
1357 ; CHECK-NEXT:    vpcmpneqq %zmm1, %zmm0, %k0 {%k1}
1358 ; CHECK-NEXT:    kmovw %k0, %edi
1359 ; CHECK-NEXT:    vpcmpnltq %zmm1, %zmm0, %k0 {%k1}
1360 ; CHECK-NEXT:    kmovw %k0, %eax
1361 ; CHECK-NEXT:    vpcmpnleq %zmm1, %zmm0, %k0 {%k1}
1362 ; CHECK-NEXT:    kmovw %k0, %ecx
1363 ; CHECK-NEXT:    vpcmpordq %zmm1, %zmm0, %k0 {%k1}
1364 ; CHECK-NEXT:    kmovw %k0, %edx
1365 ; CHECK-NEXT:    movzbl %r8b, %esi
1366 ; CHECK-NEXT:    vpinsrb $0, %esi, %xmm0, %xmm0
1367 ; CHECK-NEXT:    movzbl %r9b, %esi
1368 ; CHECK-NEXT:    vpinsrb $2, %esi, %xmm0, %xmm0
1369 ; CHECK-NEXT:    movzbl %r10b, %esi
1370 ; CHECK-NEXT:    vpinsrb $4, %esi, %xmm0, %xmm0
1371 ; CHECK-NEXT:    movzbl %r11b, %esi
1372 ; CHECK-NEXT:    vpinsrb $6, %esi, %xmm0, %xmm0
1373 ; CHECK-NEXT:    movzbl %dil, %esi
1374 ; CHECK-NEXT:    vpinsrb $8, %esi, %xmm0, %xmm0
1375 ; CHECK-NEXT:    movzbl %al, %eax
1376 ; CHECK-NEXT:    vpinsrb $10, %eax, %xmm0, %xmm0
1377 ; CHECK-NEXT:    movzbl %cl, %eax
1378 ; CHECK-NEXT:    vpinsrb $12, %eax, %xmm0, %xmm0
1379 ; CHECK-NEXT:    movzbl %dl, %eax
1380 ; CHECK-NEXT:    vpinsrb $14, %eax, %xmm0, %xmm0
1381 ; CHECK-NEXT:    retq
1382   %res0 = call i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 0, i8 %mask)
1383   %vec0 = insertelement <8 x i8> undef, i8 %res0, i32 0
1384   %res1 = call i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 1, i8 %mask)
1385   %vec1 = insertelement <8 x i8> %vec0, i8 %res1, i32 1
1386   %res2 = call i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 2, i8 %mask)
1387   %vec2 = insertelement <8 x i8> %vec1, i8 %res2, i32 2
1388   %res3 = call i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 3, i8 %mask)
1389   %vec3 = insertelement <8 x i8> %vec2, i8 %res3, i32 3
1390   %res4 = call i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 4, i8 %mask)
1391   %vec4 = insertelement <8 x i8> %vec3, i8 %res4, i32 4
1392   %res5 = call i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 5, i8 %mask)
1393   %vec5 = insertelement <8 x i8> %vec4, i8 %res5, i32 5
1394   %res6 = call i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 6, i8 %mask)
1395   %vec6 = insertelement <8 x i8> %vec5, i8 %res6, i32 6
1396   %res7 = call i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 7, i8 %mask)
1397   %vec7 = insertelement <8 x i8> %vec6, i8 %res7, i32 7
1398   ret <8 x i8> %vec7
1399 }
1400
1401 declare i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64>, <8 x i64>, i32, i8) nounwind readnone
1402
1403 define <8 x i8> @test_ucmp_q_512(<8 x i64> %a0, <8 x i64> %a1) {
1404 ; CHECK-LABEL: test_ucmp_q_512:
1405 ; CHECK:       ## BB#0:
1406 ; CHECK-NEXT:    vpcmpequq %zmm1, %zmm0, %k0
1407 ; CHECK-NEXT:    kmovw %k0, %r8d
1408 ; CHECK-NEXT:    vpcmpltuq %zmm1, %zmm0, %k0
1409 ; CHECK-NEXT:    kmovw %k0, %r9d
1410 ; CHECK-NEXT:    vpcmpleuq %zmm1, %zmm0, %k0
1411 ; CHECK-NEXT:    kmovw %k0, %r10d
1412 ; CHECK-NEXT:    vpcmpunorduq %zmm1, %zmm0, %k0
1413 ; CHECK-NEXT:    kmovw %k0, %r11d
1414 ; CHECK-NEXT:    vpcmpnequq %zmm1, %zmm0, %k0
1415 ; CHECK-NEXT:    kmovw %k0, %edi
1416 ; CHECK-NEXT:    vpcmpnltuq %zmm1, %zmm0, %k0
1417 ; CHECK-NEXT:    kmovw %k0, %eax
1418 ; CHECK-NEXT:    vpcmpnleuq %zmm1, %zmm0, %k0
1419 ; CHECK-NEXT:    kmovw %k0, %ecx
1420 ; CHECK-NEXT:    vpcmporduq %zmm1, %zmm0, %k0
1421 ; CHECK-NEXT:    kmovw %k0, %edx
1422 ; CHECK-NEXT:    movzbl %r8b, %esi
1423 ; CHECK-NEXT:    vpinsrb $0, %esi, %xmm0, %xmm0
1424 ; CHECK-NEXT:    movzbl %r9b, %esi
1425 ; CHECK-NEXT:    vpinsrb $2, %esi, %xmm0, %xmm0
1426 ; CHECK-NEXT:    movzbl %r10b, %esi
1427 ; CHECK-NEXT:    vpinsrb $4, %esi, %xmm0, %xmm0
1428 ; CHECK-NEXT:    movzbl %r11b, %esi
1429 ; CHECK-NEXT:    vpinsrb $6, %esi, %xmm0, %xmm0
1430 ; CHECK-NEXT:    movzbl %dil, %esi
1431 ; CHECK-NEXT:    vpinsrb $8, %esi, %xmm0, %xmm0
1432 ; CHECK-NEXT:    movzbl %al, %eax
1433 ; CHECK-NEXT:    vpinsrb $10, %eax, %xmm0, %xmm0
1434 ; CHECK-NEXT:    movzbl %cl, %eax
1435 ; CHECK-NEXT:    vpinsrb $12, %eax, %xmm0, %xmm0
1436 ; CHECK-NEXT:    movzbl %dl, %eax
1437 ; CHECK-NEXT:    vpinsrb $14, %eax, %xmm0, %xmm0
1438 ; CHECK-NEXT:    retq
1439   %res0 = call i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 0, i8 -1)
1440   %vec0 = insertelement <8 x i8> undef, i8 %res0, i32 0
1441   %res1 = call i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 1, i8 -1)
1442   %vec1 = insertelement <8 x i8> %vec0, i8 %res1, i32 1
1443   %res2 = call i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 2, i8 -1)
1444   %vec2 = insertelement <8 x i8> %vec1, i8 %res2, i32 2
1445   %res3 = call i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 3, i8 -1)
1446   %vec3 = insertelement <8 x i8> %vec2, i8 %res3, i32 3
1447   %res4 = call i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 4, i8 -1)
1448   %vec4 = insertelement <8 x i8> %vec3, i8 %res4, i32 4
1449   %res5 = call i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 5, i8 -1)
1450   %vec5 = insertelement <8 x i8> %vec4, i8 %res5, i32 5
1451   %res6 = call i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 6, i8 -1)
1452   %vec6 = insertelement <8 x i8> %vec5, i8 %res6, i32 6
1453   %res7 = call i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 7, i8 -1)
1454   %vec7 = insertelement <8 x i8> %vec6, i8 %res7, i32 7
1455   ret <8 x i8> %vec7
1456 }
1457
1458 define <8 x i8> @test_mask_ucmp_q_512(<8 x i64> %a0, <8 x i64> %a1, i8 %mask) {
1459 ; CHECK-LABEL: test_mask_ucmp_q_512:
1460 ; CHECK:       ## BB#0:
1461 ; CHECK-NEXT:    movzbl %dil, %eax
1462 ; CHECK-NEXT:    kmovw %eax, %k1
1463 ; CHECK-NEXT:    vpcmpequq %zmm1, %zmm0, %k0 {%k1}
1464 ; CHECK-NEXT:    kmovw %k0, %r8d
1465 ; CHECK-NEXT:    vpcmpltuq %zmm1, %zmm0, %k0 {%k1}
1466 ; CHECK-NEXT:    kmovw %k0, %r9d
1467 ; CHECK-NEXT:    vpcmpleuq %zmm1, %zmm0, %k0 {%k1}
1468 ; CHECK-NEXT:    kmovw %k0, %r10d
1469 ; CHECK-NEXT:    vpcmpunorduq %zmm1, %zmm0, %k0 {%k1}
1470 ; CHECK-NEXT:    kmovw %k0, %r11d
1471 ; CHECK-NEXT:    vpcmpnequq %zmm1, %zmm0, %k0 {%k1}
1472 ; CHECK-NEXT:    kmovw %k0, %edi
1473 ; CHECK-NEXT:    vpcmpnltuq %zmm1, %zmm0, %k0 {%k1}
1474 ; CHECK-NEXT:    kmovw %k0, %eax
1475 ; CHECK-NEXT:    vpcmpnleuq %zmm1, %zmm0, %k0 {%k1}
1476 ; CHECK-NEXT:    kmovw %k0, %ecx
1477 ; CHECK-NEXT:    vpcmporduq %zmm1, %zmm0, %k0 {%k1}
1478 ; CHECK-NEXT:    kmovw %k0, %edx
1479 ; CHECK-NEXT:    movzbl %r8b, %esi
1480 ; CHECK-NEXT:    vpinsrb $0, %esi, %xmm0, %xmm0
1481 ; CHECK-NEXT:    movzbl %r9b, %esi
1482 ; CHECK-NEXT:    vpinsrb $2, %esi, %xmm0, %xmm0
1483 ; CHECK-NEXT:    movzbl %r10b, %esi
1484 ; CHECK-NEXT:    vpinsrb $4, %esi, %xmm0, %xmm0
1485 ; CHECK-NEXT:    movzbl %r11b, %esi
1486 ; CHECK-NEXT:    vpinsrb $6, %esi, %xmm0, %xmm0
1487 ; CHECK-NEXT:    movzbl %dil, %esi
1488 ; CHECK-NEXT:    vpinsrb $8, %esi, %xmm0, %xmm0
1489 ; CHECK-NEXT:    movzbl %al, %eax
1490 ; CHECK-NEXT:    vpinsrb $10, %eax, %xmm0, %xmm0
1491 ; CHECK-NEXT:    movzbl %cl, %eax
1492 ; CHECK-NEXT:    vpinsrb $12, %eax, %xmm0, %xmm0
1493 ; CHECK-NEXT:    movzbl %dl, %eax
1494 ; CHECK-NEXT:    vpinsrb $14, %eax, %xmm0, %xmm0
1495 ; CHECK-NEXT:    retq
1496   %res0 = call i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 0, i8 %mask)
1497   %vec0 = insertelement <8 x i8> undef, i8 %res0, i32 0
1498   %res1 = call i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 1, i8 %mask)
1499   %vec1 = insertelement <8 x i8> %vec0, i8 %res1, i32 1
1500   %res2 = call i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 2, i8 %mask)
1501   %vec2 = insertelement <8 x i8> %vec1, i8 %res2, i32 2
1502   %res3 = call i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 3, i8 %mask)
1503   %vec3 = insertelement <8 x i8> %vec2, i8 %res3, i32 3
1504   %res4 = call i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 4, i8 %mask)
1505   %vec4 = insertelement <8 x i8> %vec3, i8 %res4, i32 4
1506   %res5 = call i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 5, i8 %mask)
1507   %vec5 = insertelement <8 x i8> %vec4, i8 %res5, i32 5
1508   %res6 = call i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 6, i8 %mask)
1509   %vec6 = insertelement <8 x i8> %vec5, i8 %res6, i32 6
1510   %res7 = call i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 7, i8 %mask)
1511   %vec7 = insertelement <8 x i8> %vec6, i8 %res7, i32 7
1512   ret <8 x i8> %vec7
1513 }
1514
1515 declare i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64>, <8 x i64>, i32, i8) nounwind readnone
1516
1517 define <4 x float> @test_mask_vextractf32x4(<4 x float> %b, <16 x float> %a, i8 %mask) {
1518 ; CHECK-LABEL: test_mask_vextractf32x4:
1519 ; CHECK:       ## BB#0:
1520 ; CHECK-NEXT:    kmovw %edi, %k1
1521 ; CHECK-NEXT:    vextractf32x4 $2, %zmm1, %xmm0 {%k1}
1522 ; CHECK-NEXT:    retq
1523   %res = call <4 x float> @llvm.x86.avx512.mask.vextractf32x4.512(<16 x float> %a, i32 2, <4 x float> %b, i8 %mask)
1524   ret <4 x float> %res
1525 }
1526
1527 declare <4 x float> @llvm.x86.avx512.mask.vextractf32x4.512(<16 x float>, i32, <4 x float>, i8)
1528
1529 define <4 x i64> @test_mask_vextracti64x4(<4 x i64> %b, <8 x i64> %a, i8 %mask) {
1530 ; CHECK-LABEL: test_mask_vextracti64x4:
1531 ; CHECK:       ## BB#0:
1532 ; CHECK-NEXT:    kmovw %edi, %k1
1533 ; CHECK-NEXT:    vextracti64x4 $2, %zmm1, %ymm0 {%k1}
1534 ; CHECK-NEXT:    retq
1535   %res = call <4 x i64> @llvm.x86.avx512.mask.vextracti64x4.512(<8 x i64> %a, i32 2, <4 x i64> %b, i8 %mask)
1536   ret <4 x i64> %res
1537 }
1538
1539 declare <4 x i64> @llvm.x86.avx512.mask.vextracti64x4.512(<8 x i64>, i32, <4 x i64>, i8)
1540
1541 define <4 x i32> @test_maskz_vextracti32x4(<16 x i32> %a, i8 %mask) {
1542 ; CHECK-LABEL: test_maskz_vextracti32x4:
1543 ; CHECK:       ## BB#0:
1544 ; CHECK-NEXT:    kmovw %edi, %k1
1545 ; CHECK-NEXT:    vextracti32x4 $2, %zmm0, %xmm0 {%k1} {z}
1546 ; CHECK-NEXT:    retq
1547   %res = call <4 x i32> @llvm.x86.avx512.mask.vextracti32x4.512(<16 x i32> %a, i32 2, <4 x i32> zeroinitializer, i8 %mask)
1548   ret <4 x i32> %res
1549 }
1550
1551 declare <4 x i32> @llvm.x86.avx512.mask.vextracti32x4.512(<16 x i32>, i32, <4 x i32>, i8)
1552
1553 define <4 x double> @test_vextractf64x4(<8 x double> %a) {
1554 ; CHECK-LABEL: test_vextractf64x4:
1555 ; CHECK:       ## BB#0:
1556 ; CHECK-NEXT:    vextractf64x4 $2, %zmm0, %ymm0
1557 ; CHECK-NEXT:    retq
1558   %res = call <4 x double> @llvm.x86.avx512.mask.vextractf64x4.512(<8 x double> %a, i32 2, <4 x double> zeroinitializer, i8 -1)
1559   ret <4 x double> %res
1560 }
1561
1562 declare <4 x double> @llvm.x86.avx512.mask.vextractf64x4.512(<8 x double>, i32, <4 x double>, i8)
1563
1564 define <16 x i32> @test_x86_avx512_pslli_d(<16 x i32> %a0) {
1565 ; CHECK-LABEL: test_x86_avx512_pslli_d:
1566 ; CHECK:       ## BB#0:
1567 ; CHECK-NEXT:    vpslld $7, %zmm0, %zmm0
1568 ; CHECK-NEXT:    retq
1569   %res = call <16 x i32> @llvm.x86.avx512.mask.pslli.d(<16 x i32> %a0, i32 7, <16 x i32> zeroinitializer, i16 -1)
1570   ret <16 x i32> %res
1571 }
1572
1573 define <16 x i32> @test_x86_avx512_mask_pslli_d(<16 x i32> %a0, <16 x i32> %a1, i16 %mask) {
1574 ; CHECK-LABEL: test_x86_avx512_mask_pslli_d:
1575 ; CHECK:       ## BB#0:
1576 ; CHECK-NEXT:    kmovw %edi, %k1
1577 ; CHECK-NEXT:    vpslld $7, %zmm0, %zmm1 {%k1}
1578 ; CHECK-NEXT:    vmovaps %zmm1, %zmm0
1579 ; CHECK-NEXT:    retq
1580   %res = call <16 x i32> @llvm.x86.avx512.mask.pslli.d(<16 x i32> %a0, i32 7, <16 x i32> %a1, i16 %mask)
1581   ret <16 x i32> %res
1582 }
1583
1584 define <16 x i32> @test_x86_avx512_maskz_pslli_d(<16 x i32> %a0, i16 %mask) {
1585 ; CHECK-LABEL: test_x86_avx512_maskz_pslli_d:
1586 ; CHECK:       ## BB#0:
1587 ; CHECK-NEXT:    kmovw %edi, %k1
1588 ; CHECK-NEXT:    vpslld $7, %zmm0, %zmm0 {%k1} {z}
1589 ; CHECK-NEXT:    retq
1590   %res = call <16 x i32> @llvm.x86.avx512.mask.pslli.d(<16 x i32> %a0, i32 7, <16 x i32> zeroinitializer, i16 %mask)
1591   ret <16 x i32> %res
1592 }
1593
1594 declare <16 x i32> @llvm.x86.avx512.mask.pslli.d(<16 x i32>, i32, <16 x i32>, i16) nounwind readnone
1595
1596 define <8 x i64> @test_x86_avx512_pslli_q(<8 x i64> %a0) {
1597 ; CHECK-LABEL: test_x86_avx512_pslli_q:
1598 ; CHECK:       ## BB#0:
1599 ; CHECK-NEXT:    vpsllq $7, %zmm0, %zmm0
1600 ; CHECK-NEXT:    retq
1601   %res = call <8 x i64> @llvm.x86.avx512.mask.pslli.q(<8 x i64> %a0, i32 7, <8 x i64> zeroinitializer, i8 -1)
1602   ret <8 x i64> %res
1603 }
1604
1605 define <8 x i64> @test_x86_avx512_mask_pslli_q(<8 x i64> %a0, <8 x i64> %a1, i8 %mask) {
1606 ; CHECK-LABEL: test_x86_avx512_mask_pslli_q:
1607 ; CHECK:       ## BB#0:
1608 ; CHECK-NEXT:    movzbl %dil, %eax
1609 ; CHECK-NEXT:    kmovw %eax, %k1
1610 ; CHECK-NEXT:    vpsllq $7, %zmm0, %zmm1 {%k1}
1611 ; CHECK-NEXT:    vmovaps %zmm1, %zmm0
1612 ; CHECK-NEXT:    retq
1613   %res = call <8 x i64> @llvm.x86.avx512.mask.pslli.q(<8 x i64> %a0, i32 7, <8 x i64> %a1, i8 %mask)
1614   ret <8 x i64> %res
1615 }
1616
1617 define <8 x i64> @test_x86_avx512_maskz_pslli_q(<8 x i64> %a0, i8 %mask) {
1618 ; CHECK-LABEL: test_x86_avx512_maskz_pslli_q:
1619 ; CHECK:       ## BB#0:
1620 ; CHECK-NEXT:    movzbl %dil, %eax
1621 ; CHECK-NEXT:    kmovw %eax, %k1
1622 ; CHECK-NEXT:    vpsllq $7, %zmm0, %zmm0 {%k1} {z}
1623 ; CHECK-NEXT:    retq
1624   %res = call <8 x i64> @llvm.x86.avx512.mask.pslli.q(<8 x i64> %a0, i32 7, <8 x i64> zeroinitializer, i8 %mask)
1625   ret <8 x i64> %res
1626 }
1627
1628 declare <8 x i64> @llvm.x86.avx512.mask.pslli.q(<8 x i64>, i32, <8 x i64>, i8) nounwind readnone
1629
1630 define <16 x i32> @test_x86_avx512_psrli_d(<16 x i32> %a0) {
1631 ; CHECK-LABEL: test_x86_avx512_psrli_d:
1632 ; CHECK:       ## BB#0:
1633 ; CHECK-NEXT:    vpsrld $7, %zmm0, %zmm0
1634 ; CHECK-NEXT:    retq
1635   %res = call <16 x i32> @llvm.x86.avx512.mask.psrli.d(<16 x i32> %a0, i32 7, <16 x i32> zeroinitializer, i16 -1)
1636   ret <16 x i32> %res
1637 }
1638
1639 define <16 x i32> @test_x86_avx512_mask_psrli_d(<16 x i32> %a0, <16 x i32> %a1, i16 %mask) {
1640 ; CHECK-LABEL: test_x86_avx512_mask_psrli_d:
1641 ; CHECK:       ## BB#0:
1642 ; CHECK-NEXT:    kmovw %edi, %k1
1643 ; CHECK-NEXT:    vpsrld $7, %zmm0, %zmm1 {%k1}
1644 ; CHECK-NEXT:    vmovaps %zmm1, %zmm0
1645 ; CHECK-NEXT:    retq
1646   %res = call <16 x i32> @llvm.x86.avx512.mask.psrli.d(<16 x i32> %a0, i32 7, <16 x i32> %a1, i16 %mask)
1647   ret <16 x i32> %res
1648 }
1649
1650 define <16 x i32> @test_x86_avx512_maskz_psrli_d(<16 x i32> %a0, i16 %mask) {
1651 ; CHECK-LABEL: test_x86_avx512_maskz_psrli_d:
1652 ; CHECK:       ## BB#0:
1653 ; CHECK-NEXT:    kmovw %edi, %k1
1654 ; CHECK-NEXT:    vpsrld $7, %zmm0, %zmm0 {%k1} {z}
1655 ; CHECK-NEXT:    retq
1656   %res = call <16 x i32> @llvm.x86.avx512.mask.psrli.d(<16 x i32> %a0, i32 7, <16 x i32> zeroinitializer, i16 %mask)
1657   ret <16 x i32> %res
1658 }
1659
1660 declare <16 x i32> @llvm.x86.avx512.mask.psrli.d(<16 x i32>, i32, <16 x i32>, i16) nounwind readnone
1661
1662 define <8 x i64> @test_x86_avx512_psrli_q(<8 x i64> %a0) {
1663 ; CHECK-LABEL: test_x86_avx512_psrli_q:
1664 ; CHECK:       ## BB#0:
1665 ; CHECK-NEXT:    vpsrlq $7, %zmm0, %zmm0
1666 ; CHECK-NEXT:    retq
1667   %res = call <8 x i64> @llvm.x86.avx512.mask.psrli.q(<8 x i64> %a0, i32 7, <8 x i64> zeroinitializer, i8 -1)
1668   ret <8 x i64> %res
1669 }
1670
1671 define <8 x i64> @test_x86_avx512_mask_psrli_q(<8 x i64> %a0, <8 x i64> %a1, i8 %mask) {
1672 ; CHECK-LABEL: test_x86_avx512_mask_psrli_q:
1673 ; CHECK:       ## BB#0:
1674 ; CHECK-NEXT:    movzbl %dil, %eax
1675 ; CHECK-NEXT:    kmovw %eax, %k1
1676 ; CHECK-NEXT:    vpsrlq $7, %zmm0, %zmm1 {%k1}
1677 ; CHECK-NEXT:    vmovaps %zmm1, %zmm0
1678 ; CHECK-NEXT:    retq
1679   %res = call <8 x i64> @llvm.x86.avx512.mask.psrli.q(<8 x i64> %a0, i32 7, <8 x i64> %a1, i8 %mask)
1680   ret <8 x i64> %res
1681 }
1682
1683 define <8 x i64> @test_x86_avx512_maskz_psrli_q(<8 x i64> %a0, i8 %mask) {
1684 ; CHECK-LABEL: test_x86_avx512_maskz_psrli_q:
1685 ; CHECK:       ## BB#0:
1686 ; CHECK-NEXT:    movzbl %dil, %eax
1687 ; CHECK-NEXT:    kmovw %eax, %k1
1688 ; CHECK-NEXT:    vpsrlq $7, %zmm0, %zmm0 {%k1} {z}
1689 ; CHECK-NEXT:    retq
1690   %res = call <8 x i64> @llvm.x86.avx512.mask.psrli.q(<8 x i64> %a0, i32 7, <8 x i64> zeroinitializer, i8 %mask)
1691   ret <8 x i64> %res
1692 }
1693
1694 declare <8 x i64> @llvm.x86.avx512.mask.psrli.q(<8 x i64>, i32, <8 x i64>, i8) nounwind readnone
1695
1696 define <16 x i32> @test_x86_avx512_psrai_d(<16 x i32> %a0) {
1697 ; CHECK-LABEL: test_x86_avx512_psrai_d:
1698 ; CHECK:       ## BB#0:
1699 ; CHECK-NEXT:    vpsrad $7, %zmm0, %zmm0
1700 ; CHECK-NEXT:    retq
1701   %res = call <16 x i32> @llvm.x86.avx512.mask.psrai.d(<16 x i32> %a0, i32 7, <16 x i32> zeroinitializer, i16 -1)
1702   ret <16 x i32> %res
1703 }
1704
1705 define <16 x i32> @test_x86_avx512_mask_psrai_d(<16 x i32> %a0, <16 x i32> %a1, i16 %mask) {
1706 ; CHECK-LABEL: test_x86_avx512_mask_psrai_d:
1707 ; CHECK:       ## BB#0:
1708 ; CHECK-NEXT:    kmovw %edi, %k1
1709 ; CHECK-NEXT:    vpsrad $7, %zmm0, %zmm1 {%k1}
1710 ; CHECK-NEXT:    vmovaps %zmm1, %zmm0
1711 ; CHECK-NEXT:    retq
1712   %res = call <16 x i32> @llvm.x86.avx512.mask.psrai.d(<16 x i32> %a0, i32 7, <16 x i32> %a1, i16 %mask)
1713   ret <16 x i32> %res
1714 }
1715
1716 define <16 x i32> @test_x86_avx512_maskz_psrai_d(<16 x i32> %a0, i16 %mask) {
1717 ; CHECK-LABEL: test_x86_avx512_maskz_psrai_d:
1718 ; CHECK:       ## BB#0:
1719 ; CHECK-NEXT:    kmovw %edi, %k1
1720 ; CHECK-NEXT:    vpsrad $7, %zmm0, %zmm0 {%k1} {z}
1721 ; CHECK-NEXT:    retq
1722   %res = call <16 x i32> @llvm.x86.avx512.mask.psrai.d(<16 x i32> %a0, i32 7, <16 x i32> zeroinitializer, i16 %mask)
1723   ret <16 x i32> %res
1724 }
1725
1726 declare <16 x i32> @llvm.x86.avx512.mask.psrai.d(<16 x i32>, i32, <16 x i32>, i16) nounwind readnone
1727
1728 define <8 x i64> @test_x86_avx512_psrai_q(<8 x i64> %a0) {
1729 ; CHECK-LABEL: test_x86_avx512_psrai_q:
1730 ; CHECK:       ## BB#0:
1731 ; CHECK-NEXT:    vpsraq $7, %zmm0, %zmm0
1732 ; CHECK-NEXT:    retq
1733   %res = call <8 x i64> @llvm.x86.avx512.mask.psrai.q(<8 x i64> %a0, i32 7, <8 x i64> zeroinitializer, i8 -1)
1734   ret <8 x i64> %res
1735 }
1736
1737 define <8 x i64> @test_x86_avx512_mask_psrai_q(<8 x i64> %a0, <8 x i64> %a1, i8 %mask) {
1738 ; CHECK-LABEL: test_x86_avx512_mask_psrai_q:
1739 ; CHECK:       ## BB#0:
1740 ; CHECK-NEXT:    movzbl %dil, %eax
1741 ; CHECK-NEXT:    kmovw %eax, %k1
1742 ; CHECK-NEXT:    vpsraq $7, %zmm0, %zmm1 {%k1}
1743 ; CHECK-NEXT:    vmovaps %zmm1, %zmm0
1744 ; CHECK-NEXT:    retq
1745   %res = call <8 x i64> @llvm.x86.avx512.mask.psrai.q(<8 x i64> %a0, i32 7, <8 x i64> %a1, i8 %mask)
1746   ret <8 x i64> %res
1747 }
1748
1749 define <8 x i64> @test_x86_avx512_maskz_psrai_q(<8 x i64> %a0, i8 %mask) {
1750 ; CHECK-LABEL: test_x86_avx512_maskz_psrai_q:
1751 ; CHECK:       ## BB#0:
1752 ; CHECK-NEXT:    movzbl %dil, %eax
1753 ; CHECK-NEXT:    kmovw %eax, %k1
1754 ; CHECK-NEXT:    vpsraq $7, %zmm0, %zmm0 {%k1} {z}
1755 ; CHECK-NEXT:    retq
1756   %res = call <8 x i64> @llvm.x86.avx512.mask.psrai.q(<8 x i64> %a0, i32 7, <8 x i64> zeroinitializer, i8 %mask)
1757   ret <8 x i64> %res
1758 }
1759
1760 declare <8 x i64> @llvm.x86.avx512.mask.psrai.q(<8 x i64>, i32, <8 x i64>, i8) nounwind readnone
1761
1762 define <16 x i32> @test_x86_avx512_psll_d(<16 x i32> %a0, <4 x i32> %a1) {
1763 ; CHECK-LABEL: test_x86_avx512_psll_d:
1764 ; CHECK:       ## BB#0:
1765 ; CHECK-NEXT:    vpslld %xmm1, %zmm0, %zmm0
1766 ; CHECK-NEXT:    retq
1767   %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)
1768   ret <16 x i32> %res
1769 }
1770
1771 define <16 x i32> @test_x86_avx512_mask_psll_d(<16 x i32> %a0, <4 x i32> %a1, <16 x i32> %a2, i16 %mask) {
1772 ; CHECK-LABEL: test_x86_avx512_mask_psll_d:
1773 ; CHECK:       ## BB#0:
1774 ; CHECK-NEXT:    kmovw %edi, %k1
1775 ; CHECK-NEXT:    vpslld %xmm1, %zmm0, %zmm2 {%k1}
1776 ; CHECK-NEXT:    vmovaps %zmm2, %zmm0
1777 ; CHECK-NEXT:    retq
1778   %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)
1779   ret <16 x i32> %res
1780 }
1781
1782 define <16 x i32> @test_x86_avx512_maskz_psll_d(<16 x i32> %a0, <4 x i32> %a1, i16 %mask) {
1783 ; CHECK-LABEL: test_x86_avx512_maskz_psll_d:
1784 ; CHECK:       ## BB#0:
1785 ; CHECK-NEXT:    kmovw %edi, %k1
1786 ; CHECK-NEXT:    vpslld %xmm1, %zmm0, %zmm0 {%k1} {z}
1787 ; CHECK-NEXT:    retq
1788   %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)
1789   ret <16 x i32> %res
1790 }
1791
1792 declare <16 x i32> @llvm.x86.avx512.mask.psll.d(<16 x i32>, <4 x i32>, <16 x i32>, i16) nounwind readnone
1793
1794 define <8 x i64> @test_x86_avx512_psll_q(<8 x i64> %a0, <2 x i64> %a1) {
1795 ; CHECK-LABEL: test_x86_avx512_psll_q:
1796 ; CHECK:       ## BB#0:
1797 ; CHECK-NEXT:    vpsllq %xmm1, %zmm0, %zmm0
1798 ; CHECK-NEXT:    retq
1799   %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)
1800   ret <8 x i64> %res
1801 }
1802
1803 define <8 x i64> @test_x86_avx512_mask_psll_q(<8 x i64> %a0, <2 x i64> %a1, <8 x i64> %a2, i8 %mask) {
1804 ; CHECK-LABEL: test_x86_avx512_mask_psll_q:
1805 ; CHECK:       ## BB#0:
1806 ; CHECK-NEXT:    movzbl %dil, %eax
1807 ; CHECK-NEXT:    kmovw %eax, %k1
1808 ; CHECK-NEXT:    vpsllq %xmm1, %zmm0, %zmm2 {%k1}
1809 ; CHECK-NEXT:    vmovaps %zmm2, %zmm0
1810 ; CHECK-NEXT:    retq
1811   %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)
1812   ret <8 x i64> %res
1813 }
1814
1815 define <8 x i64> @test_x86_avx512_maskz_psll_q(<8 x i64> %a0, <2 x i64> %a1, i8 %mask) {
1816 ; CHECK-LABEL: test_x86_avx512_maskz_psll_q:
1817 ; CHECK:       ## BB#0:
1818 ; CHECK-NEXT:    movzbl %dil, %eax
1819 ; CHECK-NEXT:    kmovw %eax, %k1
1820 ; CHECK-NEXT:    vpsllq %xmm1, %zmm0, %zmm0 {%k1} {z}
1821 ; CHECK-NEXT:    retq
1822   %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)
1823   ret <8 x i64> %res
1824 }
1825
1826 declare <8 x i64> @llvm.x86.avx512.mask.psll.q(<8 x i64>, <2 x i64>, <8 x i64>, i8) nounwind readnone
1827
1828 define <16 x i32> @test_x86_avx512_psrl_d(<16 x i32> %a0, <4 x i32> %a1) {
1829 ; CHECK-LABEL: test_x86_avx512_psrl_d:
1830 ; CHECK:       ## BB#0:
1831 ; CHECK-NEXT:    vpsrld %xmm1, %zmm0, %zmm0
1832 ; CHECK-NEXT:    retq
1833   %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)
1834   ret <16 x i32> %res
1835 }
1836
1837 define <16 x i32> @test_x86_avx512_mask_psrl_d(<16 x i32> %a0, <4 x i32> %a1, <16 x i32> %a2, i16 %mask) {
1838 ; CHECK-LABEL: test_x86_avx512_mask_psrl_d:
1839 ; CHECK:       ## BB#0:
1840 ; CHECK-NEXT:    kmovw %edi, %k1
1841 ; CHECK-NEXT:    vpsrld %xmm1, %zmm0, %zmm2 {%k1}
1842 ; CHECK-NEXT:    vmovaps %zmm2, %zmm0
1843 ; CHECK-NEXT:    retq
1844   %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)
1845   ret <16 x i32> %res
1846 }
1847
1848 define <16 x i32> @test_x86_avx512_maskz_psrl_d(<16 x i32> %a0, <4 x i32> %a1, i16 %mask) {
1849 ; CHECK-LABEL: test_x86_avx512_maskz_psrl_d:
1850 ; CHECK:       ## BB#0:
1851 ; CHECK-NEXT:    kmovw %edi, %k1
1852 ; CHECK-NEXT:    vpsrld %xmm1, %zmm0, %zmm0 {%k1} {z}
1853 ; CHECK-NEXT:    retq
1854   %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)
1855   ret <16 x i32> %res
1856 }
1857
1858 declare <16 x i32> @llvm.x86.avx512.mask.psrl.d(<16 x i32>, <4 x i32>, <16 x i32>, i16) nounwind readnone
1859
1860 define <8 x i64> @test_x86_avx512_psrl_q(<8 x i64> %a0, <2 x i64> %a1) {
1861 ; CHECK-LABEL: test_x86_avx512_psrl_q:
1862 ; CHECK:       ## BB#0:
1863 ; CHECK-NEXT:    vpsrlq %xmm1, %zmm0, %zmm0
1864 ; CHECK-NEXT:    retq
1865   %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)
1866   ret <8 x i64> %res
1867 }
1868
1869 define <8 x i64> @test_x86_avx512_mask_psrl_q(<8 x i64> %a0, <2 x i64> %a1, <8 x i64> %a2, i8 %mask) {
1870 ; CHECK-LABEL: test_x86_avx512_mask_psrl_q:
1871 ; CHECK:       ## BB#0:
1872 ; CHECK-NEXT:    movzbl %dil, %eax
1873 ; CHECK-NEXT:    kmovw %eax, %k1
1874 ; CHECK-NEXT:    vpsrlq %xmm1, %zmm0, %zmm2 {%k1}
1875 ; CHECK-NEXT:    vmovaps %zmm2, %zmm0
1876 ; CHECK-NEXT:    retq
1877   %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)
1878   ret <8 x i64> %res
1879 }
1880
1881 define <8 x i64> @test_x86_avx512_maskz_psrl_q(<8 x i64> %a0, <2 x i64> %a1, i8 %mask) {
1882 ; CHECK-LABEL: test_x86_avx512_maskz_psrl_q:
1883 ; CHECK:       ## BB#0:
1884 ; CHECK-NEXT:    movzbl %dil, %eax
1885 ; CHECK-NEXT:    kmovw %eax, %k1
1886 ; CHECK-NEXT:    vpsrlq %xmm1, %zmm0, %zmm0 {%k1} {z}
1887 ; CHECK-NEXT:    retq
1888   %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)
1889   ret <8 x i64> %res
1890 }
1891
1892 declare <8 x i64> @llvm.x86.avx512.mask.psrl.q(<8 x i64>, <2 x i64>, <8 x i64>, i8) nounwind readnone
1893
1894 define <16 x i32> @test_x86_avx512_psra_d(<16 x i32> %a0, <4 x i32> %a1) {
1895 ; CHECK-LABEL: test_x86_avx512_psra_d:
1896 ; CHECK:       ## BB#0:
1897 ; CHECK-NEXT:    vpsrad %xmm1, %zmm0, %zmm0
1898 ; CHECK-NEXT:    retq
1899   %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)
1900   ret <16 x i32> %res
1901 }
1902
1903 define <16 x i32> @test_x86_avx512_mask_psra_d(<16 x i32> %a0, <4 x i32> %a1, <16 x i32> %a2, i16 %mask) {
1904 ; CHECK-LABEL: test_x86_avx512_mask_psra_d:
1905 ; CHECK:       ## BB#0:
1906 ; CHECK-NEXT:    kmovw %edi, %k1
1907 ; CHECK-NEXT:    vpsrad %xmm1, %zmm0, %zmm2 {%k1}
1908 ; CHECK-NEXT:    vmovaps %zmm2, %zmm0
1909 ; CHECK-NEXT:    retq
1910   %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)
1911   ret <16 x i32> %res
1912 }
1913
1914 define <16 x i32> @test_x86_avx512_maskz_psra_d(<16 x i32> %a0, <4 x i32> %a1, i16 %mask) {
1915 ; CHECK-LABEL: test_x86_avx512_maskz_psra_d:
1916 ; CHECK:       ## BB#0:
1917 ; CHECK-NEXT:    kmovw %edi, %k1
1918 ; CHECK-NEXT:    vpsrad %xmm1, %zmm0, %zmm0 {%k1} {z}
1919 ; CHECK-NEXT:    retq
1920   %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)
1921   ret <16 x i32> %res
1922 }
1923
1924 declare <16 x i32> @llvm.x86.avx512.mask.psra.d(<16 x i32>, <4 x i32>, <16 x i32>, i16) nounwind readnone
1925
1926 define <8 x i64> @test_x86_avx512_psra_q(<8 x i64> %a0, <2 x i64> %a1) {
1927 ; CHECK-LABEL: test_x86_avx512_psra_q:
1928 ; CHECK:       ## BB#0:
1929 ; CHECK-NEXT:    vpsraq %xmm1, %zmm0, %zmm0
1930 ; CHECK-NEXT:    retq
1931   %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)
1932   ret <8 x i64> %res
1933 }
1934
1935 define <8 x i64> @test_x86_avx512_mask_psra_q(<8 x i64> %a0, <2 x i64> %a1, <8 x i64> %a2, i8 %mask) {
1936 ; CHECK-LABEL: test_x86_avx512_mask_psra_q:
1937 ; CHECK:       ## BB#0:
1938 ; CHECK-NEXT:    movzbl %dil, %eax
1939 ; CHECK-NEXT:    kmovw %eax, %k1
1940 ; CHECK-NEXT:    vpsraq %xmm1, %zmm0, %zmm2 {%k1}
1941 ; CHECK-NEXT:    vmovaps %zmm2, %zmm0
1942 ; CHECK-NEXT:    retq
1943   %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)
1944   ret <8 x i64> %res
1945 }
1946
1947 define <8 x i64> @test_x86_avx512_maskz_psra_q(<8 x i64> %a0, <2 x i64> %a1, i8 %mask) {
1948 ; CHECK-LABEL: test_x86_avx512_maskz_psra_q:
1949 ; CHECK:       ## BB#0:
1950 ; CHECK-NEXT:    movzbl %dil, %eax
1951 ; CHECK-NEXT:    kmovw %eax, %k1
1952 ; CHECK-NEXT:    vpsraq %xmm1, %zmm0, %zmm0 {%k1} {z}
1953 ; CHECK-NEXT:    retq
1954   %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)
1955   ret <8 x i64> %res
1956 }
1957
1958 declare <8 x i64> @llvm.x86.avx512.mask.psra.q(<8 x i64>, <2 x i64>, <8 x i64>, i8) nounwind readnone
1959
1960 define <16 x i32> @test_x86_avx512_psllv_d(<16 x i32> %a0, <16 x i32> %a1) {
1961 ; CHECK-LABEL: test_x86_avx512_psllv_d:
1962 ; CHECK:       ## BB#0:
1963 ; CHECK-NEXT:    vpsllvd %zmm1, %zmm0, %zmm0
1964 ; CHECK-NEXT:    retq
1965   %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)
1966   ret <16 x i32> %res
1967 }
1968
1969 define <16 x i32> @test_x86_avx512_mask_psllv_d(<16 x i32> %a0, <16 x i32> %a1, <16 x i32> %a2, i16 %mask) {
1970 ; CHECK-LABEL: test_x86_avx512_mask_psllv_d:
1971 ; CHECK:       ## BB#0:
1972 ; CHECK-NEXT:    kmovw %edi, %k1
1973 ; CHECK-NEXT:    vpsllvd %zmm1, %zmm0, %zmm2 {%k1}
1974 ; CHECK-NEXT:    vmovaps %zmm2, %zmm0
1975 ; CHECK-NEXT:    retq
1976   %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)
1977   ret <16 x i32> %res
1978 }
1979
1980 define <16 x i32> @test_x86_avx512_maskz_psllv_d(<16 x i32> %a0, <16 x i32> %a1, i16 %mask) {
1981 ; CHECK-LABEL: test_x86_avx512_maskz_psllv_d:
1982 ; CHECK:       ## BB#0:
1983 ; CHECK-NEXT:    kmovw %edi, %k1
1984 ; CHECK-NEXT:    vpsllvd %zmm1, %zmm0, %zmm0 {%k1} {z}
1985 ; CHECK-NEXT:    retq
1986   %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)
1987   ret <16 x i32> %res
1988 }
1989
1990 declare <16 x i32> @llvm.x86.avx512.mask.psllv.d(<16 x i32>, <16 x i32>, <16 x i32>, i16) nounwind readnone
1991
1992 define <8 x i64> @test_x86_avx512_psllv_q(<8 x i64> %a0, <8 x i64> %a1) {
1993 ; CHECK-LABEL: test_x86_avx512_psllv_q:
1994 ; CHECK:       ## BB#0:
1995 ; CHECK-NEXT:    vpsllvq %zmm1, %zmm0, %zmm0
1996 ; CHECK-NEXT:    retq
1997   %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)
1998   ret <8 x i64> %res
1999 }
2000
2001 define <8 x i64> @test_x86_avx512_mask_psllv_q(<8 x i64> %a0, <8 x i64> %a1, <8 x i64> %a2, i8 %mask) {
2002 ; CHECK-LABEL: test_x86_avx512_mask_psllv_q:
2003 ; CHECK:       ## BB#0:
2004 ; CHECK-NEXT:    movzbl %dil, %eax
2005 ; CHECK-NEXT:    kmovw %eax, %k1
2006 ; CHECK-NEXT:    vpsllvq %zmm1, %zmm0, %zmm2 {%k1}
2007 ; CHECK-NEXT:    vmovaps %zmm2, %zmm0
2008 ; CHECK-NEXT:    retq
2009   %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)
2010   ret <8 x i64> %res
2011 }
2012
2013 define <8 x i64> @test_x86_avx512_maskz_psllv_q(<8 x i64> %a0, <8 x i64> %a1, i8 %mask) {
2014 ; CHECK-LABEL: test_x86_avx512_maskz_psllv_q:
2015 ; CHECK:       ## BB#0:
2016 ; CHECK-NEXT:    movzbl %dil, %eax
2017 ; CHECK-NEXT:    kmovw %eax, %k1
2018 ; CHECK-NEXT:    vpsllvq %zmm1, %zmm0, %zmm0 {%k1} {z}
2019 ; CHECK-NEXT:    retq
2020   %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)
2021   ret <8 x i64> %res
2022 }
2023
2024 declare <8 x i64> @llvm.x86.avx512.mask.psllv.q(<8 x i64>, <8 x i64>, <8 x i64>, i8) nounwind readnone
2025
2026
2027 define <16 x i32> @test_x86_avx512_psrav_d(<16 x i32> %a0, <16 x i32> %a1) {
2028 ; CHECK-LABEL: test_x86_avx512_psrav_d:
2029 ; CHECK:       ## BB#0:
2030 ; CHECK-NEXT:    vpsravd %zmm1, %zmm0, %zmm0
2031 ; CHECK-NEXT:    retq
2032   %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)
2033   ret <16 x i32> %res
2034 }
2035
2036 define <16 x i32> @test_x86_avx512_mask_psrav_d(<16 x i32> %a0, <16 x i32> %a1, <16 x i32> %a2, i16 %mask) {
2037 ; CHECK-LABEL: test_x86_avx512_mask_psrav_d:
2038 ; CHECK:       ## BB#0:
2039 ; CHECK-NEXT:    kmovw %edi, %k1
2040 ; CHECK-NEXT:    vpsravd %zmm1, %zmm0, %zmm2 {%k1}
2041 ; CHECK-NEXT:    vmovaps %zmm2, %zmm0
2042 ; CHECK-NEXT:    retq
2043   %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)
2044   ret <16 x i32> %res
2045 }
2046
2047 define <16 x i32> @test_x86_avx512_maskz_psrav_d(<16 x i32> %a0, <16 x i32> %a1, i16 %mask) {
2048 ; CHECK-LABEL: test_x86_avx512_maskz_psrav_d:
2049 ; CHECK:       ## BB#0:
2050 ; CHECK-NEXT:    kmovw %edi, %k1
2051 ; CHECK-NEXT:    vpsravd %zmm1, %zmm0, %zmm0 {%k1} {z}
2052 ; CHECK-NEXT:    retq
2053   %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)
2054   ret <16 x i32> %res
2055 }
2056
2057 declare <16 x i32> @llvm.x86.avx512.mask.psrav.d(<16 x i32>, <16 x i32>, <16 x i32>, i16) nounwind readnone
2058
2059 define <8 x i64> @test_x86_avx512_psrav_q(<8 x i64> %a0, <8 x i64> %a1) {
2060 ; CHECK-LABEL: test_x86_avx512_psrav_q:
2061 ; CHECK:       ## BB#0:
2062 ; CHECK-NEXT:    vpsravq %zmm1, %zmm0, %zmm0
2063 ; CHECK-NEXT:    retq
2064   %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)
2065   ret <8 x i64> %res
2066 }
2067
2068 define <8 x i64> @test_x86_avx512_mask_psrav_q(<8 x i64> %a0, <8 x i64> %a1, <8 x i64> %a2, i8 %mask) {
2069 ; CHECK-LABEL: test_x86_avx512_mask_psrav_q:
2070 ; CHECK:       ## BB#0:
2071 ; CHECK-NEXT:    movzbl %dil, %eax
2072 ; CHECK-NEXT:    kmovw %eax, %k1
2073 ; CHECK-NEXT:    vpsravq %zmm1, %zmm0, %zmm2 {%k1}
2074 ; CHECK-NEXT:    vmovaps %zmm2, %zmm0
2075 ; CHECK-NEXT:    retq
2076   %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)
2077   ret <8 x i64> %res
2078 }
2079
2080 define <8 x i64> @test_x86_avx512_maskz_psrav_q(<8 x i64> %a0, <8 x i64> %a1, i8 %mask) {
2081 ; CHECK-LABEL: test_x86_avx512_maskz_psrav_q:
2082 ; CHECK:       ## BB#0:
2083 ; CHECK-NEXT:    movzbl %dil, %eax
2084 ; CHECK-NEXT:    kmovw %eax, %k1
2085 ; CHECK-NEXT:    vpsravq %zmm1, %zmm0, %zmm0 {%k1} {z}
2086 ; CHECK-NEXT:    retq
2087   %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)
2088   ret <8 x i64> %res
2089 }
2090
2091 declare <8 x i64> @llvm.x86.avx512.mask.psrav.q(<8 x i64>, <8 x i64>, <8 x i64>, i8) nounwind readnone
2092
2093 define <16 x i32> @test_x86_avx512_psrlv_d(<16 x i32> %a0, <16 x i32> %a1) {
2094 ; CHECK-LABEL: test_x86_avx512_psrlv_d:
2095 ; CHECK:       ## BB#0:
2096 ; CHECK-NEXT:    vpsrlvd %zmm1, %zmm0, %zmm0
2097 ; CHECK-NEXT:    retq
2098   %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)
2099   ret <16 x i32> %res
2100 }
2101
2102 define <16 x i32> @test_x86_avx512_mask_psrlv_d(<16 x i32> %a0, <16 x i32> %a1, <16 x i32> %a2, i16 %mask) {
2103 ; CHECK-LABEL: test_x86_avx512_mask_psrlv_d:
2104 ; CHECK:       ## BB#0:
2105 ; CHECK-NEXT:    kmovw %edi, %k1
2106 ; CHECK-NEXT:    vpsrlvd %zmm1, %zmm0, %zmm2 {%k1}
2107 ; CHECK-NEXT:    vmovaps %zmm2, %zmm0
2108 ; CHECK-NEXT:    retq
2109   %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)
2110   ret <16 x i32> %res
2111 }
2112
2113 define <16 x i32> @test_x86_avx512_maskz_psrlv_d(<16 x i32> %a0, <16 x i32> %a1, i16 %mask) {
2114 ; CHECK-LABEL: test_x86_avx512_maskz_psrlv_d:
2115 ; CHECK:       ## BB#0:
2116 ; CHECK-NEXT:    kmovw %edi, %k1
2117 ; CHECK-NEXT:    vpsrlvd %zmm1, %zmm0, %zmm0 {%k1} {z}
2118 ; CHECK-NEXT:    retq
2119   %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)
2120   ret <16 x i32> %res
2121 }
2122
2123 declare <16 x i32> @llvm.x86.avx512.mask.psrlv.d(<16 x i32>, <16 x i32>, <16 x i32>, i16) nounwind readnone
2124
2125 define <8 x i64> @test_x86_avx512_psrlv_q(<8 x i64> %a0, <8 x i64> %a1) {
2126 ; CHECK-LABEL: test_x86_avx512_psrlv_q:
2127 ; CHECK:       ## BB#0:
2128 ; CHECK-NEXT:    vpsrlvq %zmm1, %zmm0, %zmm0
2129 ; CHECK-NEXT:    retq
2130   %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)
2131   ret <8 x i64> %res
2132 }
2133
2134 define <8 x i64> @test_x86_avx512_mask_psrlv_q(<8 x i64> %a0, <8 x i64> %a1, <8 x i64> %a2, i8 %mask) {
2135 ; CHECK-LABEL: test_x86_avx512_mask_psrlv_q:
2136 ; CHECK:       ## BB#0:
2137 ; CHECK-NEXT:    movzbl %dil, %eax
2138 ; CHECK-NEXT:    kmovw %eax, %k1
2139 ; CHECK-NEXT:    vpsrlvq %zmm1, %zmm0, %zmm2 {%k1}
2140 ; CHECK-NEXT:    vmovaps %zmm2, %zmm0
2141 ; CHECK-NEXT:    retq
2142   %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)
2143   ret <8 x i64> %res
2144 }
2145
2146 define <8 x i64> @test_x86_avx512_maskz_psrlv_q(<8 x i64> %a0, <8 x i64> %a1, i8 %mask) {
2147 ; CHECK-LABEL: test_x86_avx512_maskz_psrlv_q:
2148 ; CHECK:       ## BB#0:
2149 ; CHECK-NEXT:    movzbl %dil, %eax
2150 ; CHECK-NEXT:    kmovw %eax, %k1
2151 ; CHECK-NEXT:    vpsrlvq %zmm1, %zmm0, %zmm0 {%k1} {z}
2152 ; CHECK-NEXT:    retq
2153   %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)
2154   ret <8 x i64> %res
2155 }
2156
2157 declare <8 x i64> @llvm.x86.avx512.mask.psrlv.q(<8 x i64>, <8 x i64>, <8 x i64>, i8) nounwind readnone
2158
2159 define <8 x i64> @test_x86_avx512_psrlv_q_memop(<8 x i64> %a0, <8 x i64>* %ptr) {
2160 ; CHECK-LABEL: test_x86_avx512_psrlv_q_memop:
2161 ; CHECK:       ## BB#0:
2162 ; CHECK-NEXT:    vpsrlvq (%rdi), %zmm0, %zmm0
2163 ; CHECK-NEXT:    retq
2164   %b = load <8 x i64>, <8 x i64>* %ptr
2165   %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)
2166   ret <8 x i64> %res
2167 }
2168
2169 declare <16 x float> @llvm.x86.avx512.mask.sub.ps.512(<16 x float>, <16 x float>, <16 x float>, i16, i32)
2170 declare <16 x float> @llvm.x86.avx512.mask.mul.ps.512(<16 x float>, <16 x float>, <16 x float>, i16, i32)
2171 declare <8 x double> @llvm.x86.avx512.mask.mul.pd.512(<8 x double>, <8 x double>, <8 x double>, i8, i32)
2172
2173 define <16 x float> @test_vsubps_rn(<16 x float> %a0, <16 x float> %a1) {
2174 ; CHECK-LABEL: test_vsubps_rn:
2175 ; CHECK:       ## BB#0:
2176 ; CHECK-NEXT:    vsubps {rn-sae}, %zmm1, %zmm0, %zmm0
2177 ; CHECK-NEXT:    retq
2178   %res = call <16 x float> @llvm.x86.avx512.mask.sub.ps.512(<16 x float> %a0, <16 x float> %a1,
2179                     <16 x float> zeroinitializer, i16 -1, i32 0)
2180   ret <16 x float> %res
2181 }
2182
2183 define <16 x float> @test_vsubps_rd(<16 x float> %a0, <16 x float> %a1) {
2184 ; CHECK-LABEL: test_vsubps_rd:
2185 ; CHECK:       ## BB#0:
2186 ; CHECK-NEXT:    vsubps {rd-sae}, %zmm1, %zmm0, %zmm0
2187 ; CHECK-NEXT:    retq
2188   %res = call <16 x float> @llvm.x86.avx512.mask.sub.ps.512(<16 x float> %a0, <16 x float> %a1,
2189                     <16 x float> zeroinitializer, i16 -1, i32 1)
2190   ret <16 x float> %res
2191 }
2192
2193 define <16 x float> @test_vsubps_ru(<16 x float> %a0, <16 x float> %a1) {
2194 ; CHECK-LABEL: test_vsubps_ru:
2195 ; CHECK:       ## BB#0:
2196 ; CHECK-NEXT:    vsubps {ru-sae}, %zmm1, %zmm0, %zmm0
2197 ; CHECK-NEXT:    retq
2198   %res = call <16 x float> @llvm.x86.avx512.mask.sub.ps.512(<16 x float> %a0, <16 x float> %a1,
2199                     <16 x float> zeroinitializer, i16 -1, i32 2)
2200   ret <16 x float> %res
2201 }
2202
2203 define <16 x float> @test_vsubps_rz(<16 x float> %a0, <16 x float> %a1) {
2204 ; CHECK-LABEL: test_vsubps_rz:
2205 ; CHECK:       ## BB#0:
2206 ; CHECK-NEXT:    vsubps {rz-sae}, %zmm1, %zmm0, %zmm0
2207 ; CHECK-NEXT:    retq
2208   %res = call <16 x float> @llvm.x86.avx512.mask.sub.ps.512(<16 x float> %a0, <16 x float> %a1,
2209                     <16 x float> zeroinitializer, i16 -1, i32 3)
2210   ret <16 x float> %res
2211 }
2212
2213 define <16 x float> @test_vmulps_rn(<16 x float> %a0, <16 x float> %a1) {
2214 ; CHECK-LABEL: test_vmulps_rn:
2215 ; CHECK:       ## BB#0:
2216 ; CHECK-NEXT:    vmulps {rn-sae}, %zmm1, %zmm0, %zmm0
2217 ; CHECK-NEXT:    retq
2218   %res = call <16 x float> @llvm.x86.avx512.mask.mul.ps.512(<16 x float> %a0, <16 x float> %a1,
2219                     <16 x float> zeroinitializer, i16 -1, i32 0)
2220   ret <16 x float> %res
2221 }
2222
2223 define <16 x float> @test_vmulps_rd(<16 x float> %a0, <16 x float> %a1) {
2224 ; CHECK-LABEL: test_vmulps_rd:
2225 ; CHECK:       ## BB#0:
2226 ; CHECK-NEXT:    vmulps {rd-sae}, %zmm1, %zmm0, %zmm0
2227 ; CHECK-NEXT:    retq
2228   %res = call <16 x float> @llvm.x86.avx512.mask.mul.ps.512(<16 x float> %a0, <16 x float> %a1,
2229                     <16 x float> zeroinitializer, i16 -1, i32 1)
2230   ret <16 x float> %res
2231 }
2232
2233 define <16 x float> @test_vmulps_ru(<16 x float> %a0, <16 x float> %a1) {
2234 ; CHECK-LABEL: test_vmulps_ru:
2235 ; CHECK:       ## BB#0:
2236 ; CHECK-NEXT:    vmulps {ru-sae}, %zmm1, %zmm0, %zmm0
2237 ; CHECK-NEXT:    retq
2238   %res = call <16 x float> @llvm.x86.avx512.mask.mul.ps.512(<16 x float> %a0, <16 x float> %a1,
2239                     <16 x float> zeroinitializer, i16 -1, i32 2)
2240   ret <16 x float> %res
2241 }
2242
2243 define <16 x float> @test_vmulps_rz(<16 x float> %a0, <16 x float> %a1) {
2244 ; CHECK-LABEL: test_vmulps_rz:
2245 ; CHECK:       ## BB#0:
2246 ; CHECK-NEXT:    vmulps {rz-sae}, %zmm1, %zmm0, %zmm0
2247 ; CHECK-NEXT:    retq
2248   %res = call <16 x float> @llvm.x86.avx512.mask.mul.ps.512(<16 x float> %a0, <16 x float> %a1,
2249                     <16 x float> zeroinitializer, i16 -1, i32 3)
2250   ret <16 x float> %res
2251 }
2252
2253 ;; mask float
2254 define <16 x float> @test_vmulps_mask_rn(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2255 ; CHECK-LABEL: test_vmulps_mask_rn:
2256 ; CHECK:       ## BB#0:
2257 ; CHECK-NEXT:    kmovw %edi, %k1
2258 ; CHECK-NEXT:    vmulps {rn-sae}, %zmm1, %zmm0, %zmm0 {%k1} {z}
2259 ; CHECK-NEXT:    retq
2260   %res = call <16 x float> @llvm.x86.avx512.mask.mul.ps.512(<16 x float> %a0, <16 x float> %a1,
2261                     <16 x float> zeroinitializer, i16 %mask, i32 0)
2262   ret <16 x float> %res
2263 }
2264
2265 define <16 x float> @test_vmulps_mask_rd(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2266 ; CHECK-LABEL: test_vmulps_mask_rd:
2267 ; CHECK:       ## BB#0:
2268 ; CHECK-NEXT:    kmovw %edi, %k1
2269 ; CHECK-NEXT:    vmulps {rd-sae}, %zmm1, %zmm0, %zmm0 {%k1} {z}
2270 ; CHECK-NEXT:    retq
2271   %res = call <16 x float> @llvm.x86.avx512.mask.mul.ps.512(<16 x float> %a0, <16 x float> %a1,
2272                     <16 x float> zeroinitializer, i16 %mask, i32 1)
2273   ret <16 x float> %res
2274 }
2275
2276 define <16 x float> @test_vmulps_mask_ru(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2277 ; CHECK-LABEL: test_vmulps_mask_ru:
2278 ; CHECK:       ## BB#0:
2279 ; CHECK-NEXT:    kmovw %edi, %k1
2280 ; CHECK-NEXT:    vmulps {ru-sae}, %zmm1, %zmm0, %zmm0 {%k1} {z}
2281 ; CHECK-NEXT:    retq
2282   %res = call <16 x float> @llvm.x86.avx512.mask.mul.ps.512(<16 x float> %a0, <16 x float> %a1,
2283                     <16 x float> zeroinitializer, i16 %mask, i32 2)
2284   ret <16 x float> %res
2285 }
2286
2287 define <16 x float> @test_vmulps_mask_rz(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2288 ; CHECK-LABEL: test_vmulps_mask_rz:
2289 ; CHECK:       ## BB#0:
2290 ; CHECK-NEXT:    kmovw %edi, %k1
2291 ; CHECK-NEXT:    vmulps {rz-sae}, %zmm1, %zmm0, %zmm0 {%k1} {z}
2292 ; CHECK-NEXT:    retq
2293   %res = call <16 x float> @llvm.x86.avx512.mask.mul.ps.512(<16 x float> %a0, <16 x float> %a1,
2294                     <16 x float> zeroinitializer, i16 %mask, i32 3)
2295   ret <16 x float> %res
2296 }
2297
2298 ;; With Passthru value
2299 define <16 x float> @test_vmulps_mask_passthru_rn(<16 x float> %a0, <16 x float> %a1, <16 x float> %passthru, i16 %mask) {
2300 ; CHECK-LABEL: test_vmulps_mask_passthru_rn:
2301 ; CHECK:       ## BB#0:
2302 ; CHECK-NEXT:    kmovw %edi, %k1
2303 ; CHECK-NEXT:    vmulps {rn-sae}, %zmm1, %zmm0, %zmm2 {%k1}
2304 ; CHECK-NEXT:    vmovaps %zmm2, %zmm0
2305 ; CHECK-NEXT:    retq
2306   %res = call <16 x float> @llvm.x86.avx512.mask.mul.ps.512(<16 x float> %a0, <16 x float> %a1,
2307                     <16 x float> %passthru, i16 %mask, i32 0)
2308   ret <16 x float> %res
2309 }
2310
2311 define <16 x float> @test_vmulps_mask_passthru_rd(<16 x float> %a0, <16 x float> %a1, <16 x float> %passthru, i16 %mask) {
2312 ; CHECK-LABEL: test_vmulps_mask_passthru_rd:
2313 ; CHECK:       ## BB#0:
2314 ; CHECK-NEXT:    kmovw %edi, %k1
2315 ; CHECK-NEXT:    vmulps {rd-sae}, %zmm1, %zmm0, %zmm2 {%k1}
2316 ; CHECK-NEXT:    vmovaps %zmm2, %zmm0
2317 ; CHECK-NEXT:    retq
2318   %res = call <16 x float> @llvm.x86.avx512.mask.mul.ps.512(<16 x float> %a0, <16 x float> %a1,
2319                     <16 x float> %passthru, i16 %mask, i32 1)
2320   ret <16 x float> %res
2321 }
2322
2323 define <16 x float> @test_vmulps_mask_passthru_ru(<16 x float> %a0, <16 x float> %a1, <16 x float> %passthru, i16 %mask) {
2324 ; CHECK-LABEL: test_vmulps_mask_passthru_ru:
2325 ; CHECK:       ## BB#0:
2326 ; CHECK-NEXT:    kmovw %edi, %k1
2327 ; CHECK-NEXT:    vmulps {ru-sae}, %zmm1, %zmm0, %zmm2 {%k1}
2328 ; CHECK-NEXT:    vmovaps %zmm2, %zmm0
2329 ; CHECK-NEXT:    retq
2330   %res = call <16 x float> @llvm.x86.avx512.mask.mul.ps.512(<16 x float> %a0, <16 x float> %a1,
2331                     <16 x float> %passthru, i16 %mask, i32 2)
2332   ret <16 x float> %res
2333 }
2334
2335 define <16 x float> @test_vmulps_mask_passthru_rz(<16 x float> %a0, <16 x float> %a1, <16 x float> %passthru, i16 %mask) {
2336 ; CHECK-LABEL: test_vmulps_mask_passthru_rz:
2337 ; CHECK:       ## BB#0:
2338 ; CHECK-NEXT:    kmovw %edi, %k1
2339 ; CHECK-NEXT:    vmulps {rz-sae}, %zmm1, %zmm0, %zmm2 {%k1}
2340 ; CHECK-NEXT:    vmovaps %zmm2, %zmm0
2341 ; CHECK-NEXT:    retq
2342   %res = call <16 x float> @llvm.x86.avx512.mask.mul.ps.512(<16 x float> %a0, <16 x float> %a1,
2343                     <16 x float> %passthru, i16 %mask, i32 3)
2344   ret <16 x float> %res
2345 }
2346
2347 ;; mask double
2348 define <8 x double> @test_vmulpd_mask_rn(<8 x double> %a0, <8 x double> %a1, i8 %mask) {
2349 ; CHECK-LABEL: test_vmulpd_mask_rn:
2350 ; CHECK:       ## BB#0:
2351 ; CHECK-NEXT:    movzbl %dil, %eax
2352 ; CHECK-NEXT:    kmovw %eax, %k1
2353 ; CHECK-NEXT:    vmulpd {rn-sae}, %zmm1, %zmm0, %zmm0 {%k1} {z}
2354 ; CHECK-NEXT:    retq
2355   %res = call <8 x double> @llvm.x86.avx512.mask.mul.pd.512(<8 x double> %a0, <8 x double> %a1,
2356                     <8 x double> zeroinitializer, i8 %mask, i32 0)
2357   ret <8 x double> %res
2358 }
2359
2360 define <8 x double> @test_vmulpd_mask_rd(<8 x double> %a0, <8 x double> %a1, i8 %mask) {
2361 ; CHECK-LABEL: test_vmulpd_mask_rd:
2362 ; CHECK:       ## BB#0:
2363 ; CHECK-NEXT:    movzbl %dil, %eax
2364 ; CHECK-NEXT:    kmovw %eax, %k1
2365 ; CHECK-NEXT:    vmulpd {rd-sae}, %zmm1, %zmm0, %zmm0 {%k1} {z}
2366 ; CHECK-NEXT:    retq
2367   %res = call <8 x double> @llvm.x86.avx512.mask.mul.pd.512(<8 x double> %a0, <8 x double> %a1,
2368                     <8 x double> zeroinitializer, i8 %mask, i32 1)
2369   ret <8 x double> %res
2370 }
2371
2372 define <8 x double> @test_vmulpd_mask_ru(<8 x double> %a0, <8 x double> %a1, i8 %mask) {
2373 ; CHECK-LABEL: test_vmulpd_mask_ru:
2374 ; CHECK:       ## BB#0:
2375 ; CHECK-NEXT:    movzbl %dil, %eax
2376 ; CHECK-NEXT:    kmovw %eax, %k1
2377 ; CHECK-NEXT:    vmulpd {ru-sae}, %zmm1, %zmm0, %zmm0 {%k1} {z}
2378 ; CHECK-NEXT:    retq
2379   %res = call <8 x double> @llvm.x86.avx512.mask.mul.pd.512(<8 x double> %a0, <8 x double> %a1,
2380                     <8 x double> zeroinitializer, i8 %mask, i32 2)
2381   ret <8 x double> %res
2382 }
2383
2384 define <8 x double> @test_vmulpd_mask_rz(<8 x double> %a0, <8 x double> %a1, i8 %mask) {
2385 ; CHECK-LABEL: test_vmulpd_mask_rz:
2386 ; CHECK:       ## BB#0:
2387 ; CHECK-NEXT:    movzbl %dil, %eax
2388 ; CHECK-NEXT:    kmovw %eax, %k1
2389 ; CHECK-NEXT:    vmulpd {rz-sae}, %zmm1, %zmm0, %zmm0 {%k1} {z}
2390 ; CHECK-NEXT:    retq
2391   %res = call <8 x double> @llvm.x86.avx512.mask.mul.pd.512(<8 x double> %a0, <8 x double> %a1,
2392                     <8 x double> zeroinitializer, i8 %mask, i32 3)
2393   ret <8 x double> %res
2394 }
2395
2396 define <16 x i32> @test_xor_epi32(<16 x i32> %a, <16 x i32> %b) {
2397 ; CHECK-LABEL: test_xor_epi32:
2398 ; CHECK:       ## BB#0:
2399 ; CHECK-NEXT:    vpxord %zmm1, %zmm0, %zmm0
2400 ; CHECK-NEXT:    retq
2401   %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)
2402   ret < 16 x i32> %res
2403 }
2404
2405 define <16 x i32> @test_mask_xor_epi32(<16 x i32> %a,<16 x i32> %b, <16 x i32> %passThru, i16 %mask) {
2406 ; CHECK-LABEL: test_mask_xor_epi32:
2407 ; CHECK:       ## BB#0:
2408 ; CHECK-NEXT:    kmovw %edi, %k1
2409 ; CHECK-NEXT:    vpxord %zmm1, %zmm0, %zmm2 {%k1}
2410 ; CHECK-NEXT:    vmovaps %zmm2, %zmm0
2411 ; CHECK-NEXT:    retq
2412   %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)
2413   ret < 16 x i32> %res
2414 }
2415
2416 declare <16 x i32> @llvm.x86.avx512.mask.pxor.d.512(<16 x i32>, <16 x i32>, <16 x i32>, i16)
2417
2418 define <16 x i32> @test_or_epi32(<16 x i32> %a, <16 x i32> %b) {
2419 ; CHECK-LABEL: test_or_epi32:
2420 ; CHECK:       ## BB#0:
2421 ; CHECK-NEXT:    vpord %zmm1, %zmm0, %zmm0
2422 ; CHECK-NEXT:    retq
2423   %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)
2424   ret < 16 x i32> %res
2425 }
2426
2427 define <16 x i32> @test_mask_or_epi32(<16 x i32> %a,<16 x i32> %b, <16 x i32> %passThru, i16 %mask) {
2428 ; CHECK-LABEL: test_mask_or_epi32:
2429 ; CHECK:       ## BB#0:
2430 ; CHECK-NEXT:    kmovw %edi, %k1
2431 ; CHECK-NEXT:    vpord %zmm1, %zmm0, %zmm2 {%k1}
2432 ; CHECK-NEXT:    vmovaps %zmm2, %zmm0
2433 ; CHECK-NEXT:    retq
2434   %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)
2435   ret < 16 x i32> %res
2436 }
2437
2438 declare <16 x i32> @llvm.x86.avx512.mask.por.d.512(<16 x i32>, <16 x i32>, <16 x i32>, i16)
2439
2440 define <16 x i32> @test_and_epi32(<16 x i32> %a, <16 x i32> %b) {
2441 ; CHECK-LABEL: test_and_epi32:
2442 ; CHECK:       ## BB#0:
2443 ; CHECK-NEXT:    vpandd %zmm1, %zmm0, %zmm0
2444 ; CHECK-NEXT:    retq
2445   %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)
2446   ret < 16 x i32> %res
2447 }
2448
2449 define <16 x i32> @test_mask_and_epi32(<16 x i32> %a,<16 x i32> %b, <16 x i32> %passThru, i16 %mask) {
2450 ; CHECK-LABEL: test_mask_and_epi32:
2451 ; CHECK:       ## BB#0:
2452 ; CHECK-NEXT:    kmovw %edi, %k1
2453 ; CHECK-NEXT:    vpandd %zmm1, %zmm0, %zmm2 {%k1}
2454 ; CHECK-NEXT:    vmovaps %zmm2, %zmm0
2455 ; CHECK-NEXT:    retq
2456   %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)
2457   ret < 16 x i32> %res
2458 }
2459
2460 declare <16 x i32> @llvm.x86.avx512.mask.pand.d.512(<16 x i32>, <16 x i32>, <16 x i32>, i16)
2461
2462 define <8 x i64> @test_xor_epi64(<8 x i64> %a, <8 x i64> %b) {
2463 ; CHECK-LABEL: test_xor_epi64:
2464 ; CHECK:       ## BB#0:
2465 ; CHECK-NEXT:    vpxorq %zmm1, %zmm0, %zmm0
2466 ; CHECK-NEXT:    retq
2467   %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)
2468   ret < 8 x i64> %res
2469 }
2470
2471 define <8 x i64> @test_mask_xor_epi64(<8 x i64> %a,<8 x i64> %b, <8 x i64> %passThru, i8 %mask) {
2472 ; CHECK-LABEL: test_mask_xor_epi64:
2473 ; CHECK:       ## BB#0:
2474 ; CHECK-NEXT:    movzbl %dil, %eax
2475 ; CHECK-NEXT:    kmovw %eax, %k1
2476 ; CHECK-NEXT:    vpxorq %zmm1, %zmm0, %zmm2 {%k1}
2477 ; CHECK-NEXT:    vmovaps %zmm2, %zmm0
2478 ; CHECK-NEXT:    retq
2479   %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)
2480   ret < 8 x i64> %res
2481 }
2482
2483 declare <8 x i64> @llvm.x86.avx512.mask.pxor.q.512(<8 x i64>, <8 x i64>, <8 x i64>, i8)
2484
2485 define <8 x i64> @test_or_epi64(<8 x i64> %a, <8 x i64> %b) {
2486 ; CHECK-LABEL: test_or_epi64:
2487 ; CHECK:       ## BB#0:
2488 ; CHECK-NEXT:    vporq %zmm1, %zmm0, %zmm0
2489 ; CHECK-NEXT:    retq
2490   %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)
2491   ret < 8 x i64> %res
2492 }
2493
2494 define <8 x i64> @test_mask_or_epi64(<8 x i64> %a,<8 x i64> %b, <8 x i64> %passThru, i8 %mask) {
2495 ; CHECK-LABEL: test_mask_or_epi64:
2496 ; CHECK:       ## BB#0:
2497 ; CHECK-NEXT:    movzbl %dil, %eax
2498 ; CHECK-NEXT:    kmovw %eax, %k1
2499 ; CHECK-NEXT:    vporq %zmm1, %zmm0, %zmm2 {%k1}
2500 ; CHECK-NEXT:    vmovaps %zmm2, %zmm0
2501 ; CHECK-NEXT:    retq
2502   %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)
2503   ret < 8 x i64> %res
2504 }
2505
2506 declare <8 x i64> @llvm.x86.avx512.mask.por.q.512(<8 x i64>, <8 x i64>, <8 x i64>, i8)
2507
2508 define <8 x i64> @test_and_epi64(<8 x i64> %a, <8 x i64> %b) {
2509 ; CHECK-LABEL: test_and_epi64:
2510 ; CHECK:       ## BB#0:
2511 ; CHECK-NEXT:    vpandq %zmm1, %zmm0, %zmm0
2512 ; CHECK-NEXT:    retq
2513   %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)
2514   ret < 8 x i64> %res
2515 }
2516
2517 define <8 x i64> @test_mask_and_epi64(<8 x i64> %a,<8 x i64> %b, <8 x i64> %passThru, i8 %mask) {
2518 ; CHECK-LABEL: test_mask_and_epi64:
2519 ; CHECK:       ## BB#0:
2520 ; CHECK-NEXT:    movzbl %dil, %eax
2521 ; CHECK-NEXT:    kmovw %eax, %k1
2522 ; CHECK-NEXT:    vpandq %zmm1, %zmm0, %zmm2 {%k1}
2523 ; CHECK-NEXT:    vmovaps %zmm2, %zmm0
2524 ; CHECK-NEXT:    retq
2525   %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)
2526   ret < 8 x i64> %res
2527 }
2528
2529 declare <8 x i64> @llvm.x86.avx512.mask.pand.q.512(<8 x i64>, <8 x i64>, <8 x i64>, i8)
2530
2531
2532 define <16 x i32> @test_mask_add_epi32_rr(<16 x i32> %a, <16 x i32> %b) {
2533 ; CHECK-LABEL: test_mask_add_epi32_rr:
2534 ; CHECK:       ## BB#0:
2535 ; CHECK-NEXT:    vpaddd %zmm1, %zmm0, %zmm0
2536 ; CHECK-NEXT:    retq
2537   %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)
2538   ret < 16 x i32> %res
2539 }
2540
2541 define <16 x i32> @test_mask_add_epi32_rrk(<16 x i32> %a, <16 x i32> %b, <16 x i32> %passThru, i16 %mask) {
2542 ; CHECK-LABEL: test_mask_add_epi32_rrk:
2543 ; CHECK:       ## BB#0:
2544 ; CHECK-NEXT:    kmovw %edi, %k1
2545 ; CHECK-NEXT:    vpaddd %zmm1, %zmm0, %zmm2 {%k1}
2546 ; CHECK-NEXT:    vmovaps %zmm2, %zmm0
2547 ; CHECK-NEXT:    retq
2548   %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)
2549   ret < 16 x i32> %res
2550 }
2551
2552 define <16 x i32> @test_mask_add_epi32_rrkz(<16 x i32> %a, <16 x i32> %b, i16 %mask) {
2553 ; CHECK-LABEL: test_mask_add_epi32_rrkz:
2554 ; CHECK:       ## BB#0:
2555 ; CHECK-NEXT:    kmovw %edi, %k1
2556 ; CHECK-NEXT:    vpaddd %zmm1, %zmm0, %zmm0 {%k1} {z}
2557 ; CHECK-NEXT:    retq
2558   %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)
2559   ret < 16 x i32> %res
2560 }
2561
2562 define <16 x i32> @test_mask_add_epi32_rm(<16 x i32> %a, <16 x i32>* %ptr_b) {
2563 ; CHECK-LABEL: test_mask_add_epi32_rm:
2564 ; CHECK:       ## BB#0:
2565 ; CHECK-NEXT:    vpaddd (%rdi), %zmm0, %zmm0
2566 ; CHECK-NEXT:    retq
2567   %b = load <16 x i32>, <16 x i32>* %ptr_b
2568   %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)
2569   ret < 16 x i32> %res
2570 }
2571
2572 define <16 x i32> @test_mask_add_epi32_rmk(<16 x i32> %a, <16 x i32>* %ptr_b, <16 x i32> %passThru, i16 %mask) {
2573 ; CHECK-LABEL: test_mask_add_epi32_rmk:
2574 ; CHECK:       ## BB#0:
2575 ; CHECK-NEXT:    kmovw %esi, %k1
2576 ; CHECK-NEXT:    vpaddd (%rdi), %zmm0, %zmm1 {%k1}
2577 ; CHECK-NEXT:    vmovaps %zmm1, %zmm0
2578 ; CHECK-NEXT:    retq
2579   %b = load <16 x i32>, <16 x i32>* %ptr_b
2580   %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)
2581   ret < 16 x i32> %res
2582 }
2583
2584 define <16 x i32> @test_mask_add_epi32_rmkz(<16 x i32> %a, <16 x i32>* %ptr_b, i16 %mask) {
2585 ; CHECK-LABEL: test_mask_add_epi32_rmkz:
2586 ; CHECK:       ## BB#0:
2587 ; CHECK-NEXT:    kmovw %esi, %k1
2588 ; CHECK-NEXT:    vpaddd (%rdi), %zmm0, %zmm0 {%k1} {z}
2589 ; CHECK-NEXT:    retq
2590   %b = load <16 x i32>, <16 x i32>* %ptr_b
2591   %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)
2592   ret < 16 x i32> %res
2593 }
2594
2595 define <16 x i32> @test_mask_add_epi32_rmb(<16 x i32> %a, i32* %ptr_b) {
2596 ; CHECK-LABEL: test_mask_add_epi32_rmb:
2597 ; CHECK:       ## BB#0:
2598 ; CHECK-NEXT:    vpaddd (%rdi){1to16}, %zmm0, %zmm0
2599 ; CHECK-NEXT:    retq
2600   %q = load i32, i32* %ptr_b
2601   %vecinit.i = insertelement <16 x i32> undef, i32 %q, i32 0
2602   %b = shufflevector <16 x i32> %vecinit.i, <16 x i32> undef, <16 x i32> zeroinitializer
2603   %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)
2604   ret < 16 x i32> %res
2605 }
2606
2607 define <16 x i32> @test_mask_add_epi32_rmbk(<16 x i32> %a, i32* %ptr_b, <16 x i32> %passThru, i16 %mask) {
2608 ; CHECK-LABEL: test_mask_add_epi32_rmbk:
2609 ; CHECK:       ## BB#0:
2610 ; CHECK-NEXT:    kmovw %esi, %k1
2611 ; CHECK-NEXT:    vpaddd (%rdi){1to16}, %zmm0, %zmm1 {%k1}
2612 ; CHECK-NEXT:    vmovaps %zmm1, %zmm0
2613 ; CHECK-NEXT:    retq
2614   %q = load i32, i32* %ptr_b
2615   %vecinit.i = insertelement <16 x i32> undef, i32 %q, i32 0
2616   %b = shufflevector <16 x i32> %vecinit.i, <16 x i32> undef, <16 x i32> zeroinitializer
2617   %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)
2618   ret < 16 x i32> %res
2619 }
2620
2621 define <16 x i32> @test_mask_add_epi32_rmbkz(<16 x i32> %a, i32* %ptr_b, i16 %mask) {
2622 ; CHECK-LABEL: test_mask_add_epi32_rmbkz:
2623 ; CHECK:       ## BB#0:
2624 ; CHECK-NEXT:    kmovw %esi, %k1
2625 ; CHECK-NEXT:    vpaddd (%rdi){1to16}, %zmm0, %zmm0 {%k1} {z}
2626 ; CHECK-NEXT:    retq
2627   %q = load i32, i32* %ptr_b
2628   %vecinit.i = insertelement <16 x i32> undef, i32 %q, i32 0
2629   %b = shufflevector <16 x i32> %vecinit.i, <16 x i32> undef, <16 x i32> zeroinitializer
2630   %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)
2631   ret < 16 x i32> %res
2632 }
2633
2634 declare <16 x i32> @llvm.x86.avx512.mask.padd.d.512(<16 x i32>, <16 x i32>, <16 x i32>, i16)
2635
2636 define <16 x i32> @test_mask_sub_epi32_rr(<16 x i32> %a, <16 x i32> %b) {
2637 ; CHECK-LABEL: test_mask_sub_epi32_rr:
2638 ; CHECK:       ## BB#0:
2639 ; CHECK-NEXT:    vpsubd %zmm1, %zmm0, %zmm0
2640 ; CHECK-NEXT:    retq
2641   %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)
2642   ret < 16 x i32> %res
2643 }
2644
2645 define <16 x i32> @test_mask_sub_epi32_rrk(<16 x i32> %a, <16 x i32> %b, <16 x i32> %passThru, i16 %mask) {
2646 ; CHECK-LABEL: test_mask_sub_epi32_rrk:
2647 ; CHECK:       ## BB#0:
2648 ; CHECK-NEXT:    kmovw %edi, %k1
2649 ; CHECK-NEXT:    vpsubd %zmm1, %zmm0, %zmm2 {%k1}
2650 ; CHECK-NEXT:    vmovaps %zmm2, %zmm0
2651 ; CHECK-NEXT:    retq
2652   %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)
2653   ret < 16 x i32> %res
2654 }
2655
2656 define <16 x i32> @test_mask_sub_epi32_rrkz(<16 x i32> %a, <16 x i32> %b, i16 %mask) {
2657 ; CHECK-LABEL: test_mask_sub_epi32_rrkz:
2658 ; CHECK:       ## BB#0:
2659 ; CHECK-NEXT:    kmovw %edi, %k1
2660 ; CHECK-NEXT:    vpsubd %zmm1, %zmm0, %zmm0 {%k1} {z}
2661 ; CHECK-NEXT:    retq
2662   %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)
2663   ret < 16 x i32> %res
2664 }
2665
2666 define <16 x i32> @test_mask_sub_epi32_rm(<16 x i32> %a, <16 x i32>* %ptr_b) {
2667 ; CHECK-LABEL: test_mask_sub_epi32_rm:
2668 ; CHECK:       ## BB#0:
2669 ; CHECK-NEXT:    vpsubd (%rdi), %zmm0, %zmm0
2670 ; CHECK-NEXT:    retq
2671   %b = load <16 x i32>, <16 x i32>* %ptr_b
2672   %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)
2673   ret < 16 x i32> %res
2674 }
2675
2676 define <16 x i32> @test_mask_sub_epi32_rmk(<16 x i32> %a, <16 x i32>* %ptr_b, <16 x i32> %passThru, i16 %mask) {
2677 ; CHECK-LABEL: test_mask_sub_epi32_rmk:
2678 ; CHECK:       ## BB#0:
2679 ; CHECK-NEXT:    kmovw %esi, %k1
2680 ; CHECK-NEXT:    vpsubd (%rdi), %zmm0, %zmm1 {%k1}
2681 ; CHECK-NEXT:    vmovaps %zmm1, %zmm0
2682 ; CHECK-NEXT:    retq
2683   %b = load <16 x i32>, <16 x i32>* %ptr_b
2684   %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)
2685   ret < 16 x i32> %res
2686 }
2687
2688 define <16 x i32> @test_mask_sub_epi32_rmkz(<16 x i32> %a, <16 x i32>* %ptr_b, i16 %mask) {
2689 ; CHECK-LABEL: test_mask_sub_epi32_rmkz:
2690 ; CHECK:       ## BB#0:
2691 ; CHECK-NEXT:    kmovw %esi, %k1
2692 ; CHECK-NEXT:    vpsubd (%rdi), %zmm0, %zmm0 {%k1} {z}
2693 ; CHECK-NEXT:    retq
2694   %b = load <16 x i32>, <16 x i32>* %ptr_b
2695   %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)
2696   ret < 16 x i32> %res
2697 }
2698
2699 define <16 x i32> @test_mask_sub_epi32_rmb(<16 x i32> %a, i32* %ptr_b) {
2700 ; CHECK-LABEL: test_mask_sub_epi32_rmb:
2701 ; CHECK:       ## BB#0:
2702 ; CHECK-NEXT:    vpsubd (%rdi){1to16}, %zmm0, %zmm0
2703 ; CHECK-NEXT:    retq
2704   %q = load i32, i32* %ptr_b
2705   %vecinit.i = insertelement <16 x i32> undef, i32 %q, i32 0
2706   %b = shufflevector <16 x i32> %vecinit.i, <16 x i32> undef, <16 x i32> zeroinitializer
2707   %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)
2708   ret < 16 x i32> %res
2709 }
2710
2711 define <16 x i32> @test_mask_sub_epi32_rmbk(<16 x i32> %a, i32* %ptr_b, <16 x i32> %passThru, i16 %mask) {
2712 ; CHECK-LABEL: test_mask_sub_epi32_rmbk:
2713 ; CHECK:       ## BB#0:
2714 ; CHECK-NEXT:    kmovw %esi, %k1
2715 ; CHECK-NEXT:    vpsubd (%rdi){1to16}, %zmm0, %zmm1 {%k1}
2716 ; CHECK-NEXT:    vmovaps %zmm1, %zmm0
2717 ; CHECK-NEXT:    retq
2718   %q = load i32, i32* %ptr_b
2719   %vecinit.i = insertelement <16 x i32> undef, i32 %q, i32 0
2720   %b = shufflevector <16 x i32> %vecinit.i, <16 x i32> undef, <16 x i32> zeroinitializer
2721   %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)
2722   ret < 16 x i32> %res
2723 }
2724
2725 define <16 x i32> @test_mask_sub_epi32_rmbkz(<16 x i32> %a, i32* %ptr_b, i16 %mask) {
2726 ; CHECK-LABEL: test_mask_sub_epi32_rmbkz:
2727 ; CHECK:       ## BB#0:
2728 ; CHECK-NEXT:    kmovw %esi, %k1
2729 ; CHECK-NEXT:    vpsubd (%rdi){1to16}, %zmm0, %zmm0 {%k1} {z}
2730 ; CHECK-NEXT:    retq
2731   %q = load i32, i32* %ptr_b
2732   %vecinit.i = insertelement <16 x i32> undef, i32 %q, i32 0
2733   %b = shufflevector <16 x i32> %vecinit.i, <16 x i32> undef, <16 x i32> zeroinitializer
2734   %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)
2735   ret < 16 x i32> %res
2736 }
2737
2738 declare <16 x i32> @llvm.x86.avx512.mask.psub.d.512(<16 x i32>, <16 x i32>, <16 x i32>, i16)
2739
2740 define <8 x i64> @test_mask_add_epi64_rr(<8 x i64> %a, <8 x i64> %b) {
2741 ; CHECK-LABEL: test_mask_add_epi64_rr:
2742 ; CHECK:       ## BB#0:
2743 ; CHECK-NEXT:    vpaddq %zmm1, %zmm0, %zmm0
2744 ; CHECK-NEXT:    retq
2745   %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)
2746   ret < 8 x i64> %res
2747 }
2748
2749 define <8 x i64> @test_mask_add_epi64_rrk(<8 x i64> %a, <8 x i64> %b, <8 x i64> %passThru, i8 %mask) {
2750 ; CHECK-LABEL: test_mask_add_epi64_rrk:
2751 ; CHECK:       ## BB#0:
2752 ; CHECK-NEXT:    movzbl %dil, %eax
2753 ; CHECK-NEXT:    kmovw %eax, %k1
2754 ; CHECK-NEXT:    vpaddq %zmm1, %zmm0, %zmm2 {%k1}
2755 ; CHECK-NEXT:    vmovaps %zmm2, %zmm0
2756 ; CHECK-NEXT:    retq
2757   %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)
2758   ret < 8 x i64> %res
2759 }
2760
2761 define <8 x i64> @test_mask_add_epi64_rrkz(<8 x i64> %a, <8 x i64> %b, i8 %mask) {
2762 ; CHECK-LABEL: test_mask_add_epi64_rrkz:
2763 ; CHECK:       ## BB#0:
2764 ; CHECK-NEXT:    movzbl %dil, %eax
2765 ; CHECK-NEXT:    kmovw %eax, %k1
2766 ; CHECK-NEXT:    vpaddq %zmm1, %zmm0, %zmm0 {%k1} {z}
2767 ; CHECK-NEXT:    retq
2768   %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)
2769   ret < 8 x i64> %res
2770 }
2771
2772 define <8 x i64> @test_mask_add_epi64_rm(<8 x i64> %a, <8 x i64>* %ptr_b) {
2773 ; CHECK-LABEL: test_mask_add_epi64_rm:
2774 ; CHECK:       ## BB#0:
2775 ; CHECK-NEXT:    vpaddq (%rdi), %zmm0, %zmm0
2776 ; CHECK-NEXT:    retq
2777   %b = load <8 x i64>, <8 x i64>* %ptr_b
2778   %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)
2779   ret < 8 x i64> %res
2780 }
2781
2782 define <8 x i64> @test_mask_add_epi64_rmk(<8 x i64> %a, <8 x i64>* %ptr_b, <8 x i64> %passThru, i8 %mask) {
2783 ; CHECK-LABEL: test_mask_add_epi64_rmk:
2784 ; CHECK:       ## BB#0:
2785 ; CHECK-NEXT:    movzbl %sil, %eax
2786 ; CHECK-NEXT:    kmovw %eax, %k1
2787 ; CHECK-NEXT:    vpaddq (%rdi), %zmm0, %zmm1 {%k1}
2788 ; CHECK-NEXT:    vmovaps %zmm1, %zmm0
2789 ; CHECK-NEXT:    retq
2790   %b = load <8 x i64>, <8 x i64>* %ptr_b
2791   %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)
2792   ret < 8 x i64> %res
2793 }
2794
2795 define <8 x i64> @test_mask_add_epi64_rmkz(<8 x i64> %a, <8 x i64>* %ptr_b, i8 %mask) {
2796 ; CHECK-LABEL: test_mask_add_epi64_rmkz:
2797 ; CHECK:       ## BB#0:
2798 ; CHECK-NEXT:    movzbl %sil, %eax
2799 ; CHECK-NEXT:    kmovw %eax, %k1
2800 ; CHECK-NEXT:    vpaddq (%rdi), %zmm0, %zmm0 {%k1} {z}
2801 ; CHECK-NEXT:    retq
2802   %b = load <8 x i64>, <8 x i64>* %ptr_b
2803   %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)
2804   ret < 8 x i64> %res
2805 }
2806
2807 define <8 x i64> @test_mask_add_epi64_rmb(<8 x i64> %a, i64* %ptr_b) {
2808 ; CHECK-LABEL: test_mask_add_epi64_rmb:
2809 ; CHECK:       ## BB#0:
2810 ; CHECK-NEXT:    vpaddq (%rdi){1to8}, %zmm0, %zmm0
2811 ; CHECK-NEXT:    retq
2812   %q = load i64, i64* %ptr_b
2813   %vecinit.i = insertelement <8 x i64> undef, i64 %q, i32 0
2814   %b = shufflevector <8 x i64> %vecinit.i, <8 x i64> undef, <8 x i32> zeroinitializer
2815   %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)
2816   ret < 8 x i64> %res
2817 }
2818
2819 define <8 x i64> @test_mask_add_epi64_rmbk(<8 x i64> %a, i64* %ptr_b, <8 x i64> %passThru, i8 %mask) {
2820 ; CHECK-LABEL: test_mask_add_epi64_rmbk:
2821 ; CHECK:       ## BB#0:
2822 ; CHECK-NEXT:    movzbl %sil, %eax
2823 ; CHECK-NEXT:    kmovw %eax, %k1
2824 ; CHECK-NEXT:    vpaddq (%rdi){1to8}, %zmm0, %zmm1 {%k1}
2825 ; CHECK-NEXT:    vmovaps %zmm1, %zmm0
2826 ; CHECK-NEXT:    retq
2827   %q = load i64, i64* %ptr_b
2828   %vecinit.i = insertelement <8 x i64> undef, i64 %q, i32 0
2829   %b = shufflevector <8 x i64> %vecinit.i, <8 x i64> undef, <8 x i32> zeroinitializer
2830   %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)
2831   ret < 8 x i64> %res
2832 }
2833
2834 define <8 x i64> @test_mask_add_epi64_rmbkz(<8 x i64> %a, i64* %ptr_b, i8 %mask) {
2835 ; CHECK-LABEL: test_mask_add_epi64_rmbkz:
2836 ; CHECK:       ## BB#0:
2837 ; CHECK-NEXT:    movzbl %sil, %eax
2838 ; CHECK-NEXT:    kmovw %eax, %k1
2839 ; CHECK-NEXT:    vpaddq (%rdi){1to8}, %zmm0, %zmm0 {%k1} {z}
2840 ; CHECK-NEXT:    retq
2841   %q = load i64, i64* %ptr_b
2842   %vecinit.i = insertelement <8 x i64> undef, i64 %q, i32 0
2843   %b = shufflevector <8 x i64> %vecinit.i, <8 x i64> undef, <8 x i32> zeroinitializer
2844   %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)
2845   ret < 8 x i64> %res
2846 }
2847
2848 declare <8 x i64> @llvm.x86.avx512.mask.padd.q.512(<8 x i64>, <8 x i64>, <8 x i64>, i8)
2849
2850 define <8 x i64> @test_mask_sub_epi64_rr(<8 x i64> %a, <8 x i64> %b) {
2851 ; CHECK-LABEL: test_mask_sub_epi64_rr:
2852 ; CHECK:       ## BB#0:
2853 ; CHECK-NEXT:    vpsubq %zmm1, %zmm0, %zmm0
2854 ; CHECK-NEXT:    retq
2855   %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)
2856   ret < 8 x i64> %res
2857 }
2858
2859 define <8 x i64> @test_mask_sub_epi64_rrk(<8 x i64> %a, <8 x i64> %b, <8 x i64> %passThru, i8 %mask) {
2860 ; CHECK-LABEL: test_mask_sub_epi64_rrk:
2861 ; CHECK:       ## BB#0:
2862 ; CHECK-NEXT:    movzbl %dil, %eax
2863 ; CHECK-NEXT:    kmovw %eax, %k1
2864 ; CHECK-NEXT:    vpsubq %zmm1, %zmm0, %zmm2 {%k1}
2865 ; CHECK-NEXT:    vmovaps %zmm2, %zmm0
2866 ; CHECK-NEXT:    retq
2867   %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)
2868   ret < 8 x i64> %res
2869 }
2870
2871 define <8 x i64> @test_mask_sub_epi64_rrkz(<8 x i64> %a, <8 x i64> %b, i8 %mask) {
2872 ; CHECK-LABEL: test_mask_sub_epi64_rrkz:
2873 ; CHECK:       ## BB#0:
2874 ; CHECK-NEXT:    movzbl %dil, %eax
2875 ; CHECK-NEXT:    kmovw %eax, %k1
2876 ; CHECK-NEXT:    vpsubq %zmm1, %zmm0, %zmm0 {%k1} {z}
2877 ; CHECK-NEXT:    retq
2878   %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)
2879   ret < 8 x i64> %res
2880 }
2881
2882 define <8 x i64> @test_mask_sub_epi64_rm(<8 x i64> %a, <8 x i64>* %ptr_b) {
2883 ; CHECK-LABEL: test_mask_sub_epi64_rm:
2884 ; CHECK:       ## BB#0:
2885 ; CHECK-NEXT:    vpsubq (%rdi), %zmm0, %zmm0
2886 ; CHECK-NEXT:    retq
2887   %b = load <8 x i64>, <8 x i64>* %ptr_b
2888   %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)
2889   ret < 8 x i64> %res
2890 }
2891
2892 define <8 x i64> @test_mask_sub_epi64_rmk(<8 x i64> %a, <8 x i64>* %ptr_b, <8 x i64> %passThru, i8 %mask) {
2893 ; CHECK-LABEL: test_mask_sub_epi64_rmk:
2894 ; CHECK:       ## BB#0:
2895 ; CHECK-NEXT:    movzbl %sil, %eax
2896 ; CHECK-NEXT:    kmovw %eax, %k1
2897 ; CHECK-NEXT:    vpsubq (%rdi), %zmm0, %zmm1 {%k1}
2898 ; CHECK-NEXT:    vmovaps %zmm1, %zmm0
2899 ; CHECK-NEXT:    retq
2900   %b = load <8 x i64>, <8 x i64>* %ptr_b
2901   %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)
2902   ret < 8 x i64> %res
2903 }
2904
2905 define <8 x i64> @test_mask_sub_epi64_rmkz(<8 x i64> %a, <8 x i64>* %ptr_b, i8 %mask) {
2906 ; CHECK-LABEL: test_mask_sub_epi64_rmkz:
2907 ; CHECK:       ## BB#0:
2908 ; CHECK-NEXT:    movzbl %sil, %eax
2909 ; CHECK-NEXT:    kmovw %eax, %k1
2910 ; CHECK-NEXT:    vpsubq (%rdi), %zmm0, %zmm0 {%k1} {z}
2911 ; CHECK-NEXT:    retq
2912   %b = load <8 x i64>, <8 x i64>* %ptr_b
2913   %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)
2914   ret < 8 x i64> %res
2915 }
2916
2917 define <8 x i64> @test_mask_sub_epi64_rmb(<8 x i64> %a, i64* %ptr_b) {
2918 ; CHECK-LABEL: test_mask_sub_epi64_rmb:
2919 ; CHECK:       ## BB#0:
2920 ; CHECK-NEXT:    vpsubq (%rdi){1to8}, %zmm0, %zmm0
2921 ; CHECK-NEXT:    retq
2922   %q = load i64, i64* %ptr_b
2923   %vecinit.i = insertelement <8 x i64> undef, i64 %q, i32 0
2924   %b = shufflevector <8 x i64> %vecinit.i, <8 x i64> undef, <8 x i32> zeroinitializer
2925   %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)
2926   ret < 8 x i64> %res
2927 }
2928
2929 define <8 x i64> @test_mask_sub_epi64_rmbk(<8 x i64> %a, i64* %ptr_b, <8 x i64> %passThru, i8 %mask) {
2930 ; CHECK-LABEL: test_mask_sub_epi64_rmbk:
2931 ; CHECK:       ## BB#0:
2932 ; CHECK-NEXT:    movzbl %sil, %eax
2933 ; CHECK-NEXT:    kmovw %eax, %k1
2934 ; CHECK-NEXT:    vpsubq (%rdi){1to8}, %zmm0, %zmm1 {%k1}
2935 ; CHECK-NEXT:    vmovaps %zmm1, %zmm0
2936 ; CHECK-NEXT:    retq
2937   %q = load i64, i64* %ptr_b
2938   %vecinit.i = insertelement <8 x i64> undef, i64 %q, i32 0
2939   %b = shufflevector <8 x i64> %vecinit.i, <8 x i64> undef, <8 x i32> zeroinitializer
2940   %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)
2941   ret < 8 x i64> %res
2942 }
2943
2944 define <8 x i64> @test_mask_sub_epi64_rmbkz(<8 x i64> %a, i64* %ptr_b, i8 %mask) {
2945 ; CHECK-LABEL: test_mask_sub_epi64_rmbkz:
2946 ; CHECK:       ## BB#0:
2947 ; CHECK-NEXT:    movzbl %sil, %eax
2948 ; CHECK-NEXT:    kmovw %eax, %k1
2949 ; CHECK-NEXT:    vpsubq (%rdi){1to8}, %zmm0, %zmm0 {%k1} {z}
2950 ; CHECK-NEXT:    retq
2951   %q = load i64, i64* %ptr_b
2952   %vecinit.i = insertelement <8 x i64> undef, i64 %q, i32 0
2953   %b = shufflevector <8 x i64> %vecinit.i, <8 x i64> undef, <8 x i32> zeroinitializer
2954   %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)
2955   ret < 8 x i64> %res
2956 }
2957
2958 declare <8 x i64> @llvm.x86.avx512.mask.psub.q.512(<8 x i64>, <8 x i64>, <8 x i64>, i8)
2959
2960 define <8 x i64> @test_mask_mul_epi32_rr(<16 x i32> %a, <16 x i32> %b) {
2961 ; CHECK-LABEL: test_mask_mul_epi32_rr:
2962 ; CHECK:       ## BB#0:
2963 ; CHECK-NEXT:    vpmuldq %zmm1, %zmm0, %zmm0
2964 ; CHECK-NEXT:    retq
2965   %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)
2966   ret < 8 x i64> %res
2967 }
2968
2969 define <8 x i64> @test_mask_mul_epi32_rrk(<16 x i32> %a, <16 x i32> %b, <8 x i64> %passThru, i8 %mask) {
2970 ; CHECK-LABEL: test_mask_mul_epi32_rrk:
2971 ; CHECK:       ## BB#0:
2972 ; CHECK-NEXT:    movzbl %dil, %eax
2973 ; CHECK-NEXT:    kmovw %eax, %k1
2974 ; CHECK-NEXT:    vpmuldq %zmm1, %zmm0, %zmm2 {%k1}
2975 ; CHECK-NEXT:    vmovaps %zmm2, %zmm0
2976 ; CHECK-NEXT:    retq
2977   %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)
2978   ret < 8 x i64> %res
2979 }
2980
2981 define <8 x i64> @test_mask_mul_epi32_rrkz(<16 x i32> %a, <16 x i32> %b, i8 %mask) {
2982 ; CHECK-LABEL: test_mask_mul_epi32_rrkz:
2983 ; CHECK:       ## BB#0:
2984 ; CHECK-NEXT:    movzbl %dil, %eax
2985 ; CHECK-NEXT:    kmovw %eax, %k1
2986 ; CHECK-NEXT:    vpmuldq %zmm1, %zmm0, %zmm0 {%k1} {z}
2987 ; CHECK-NEXT:    retq
2988   %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)
2989   ret < 8 x i64> %res
2990 }
2991
2992 define <8 x i64> @test_mask_mul_epi32_rm(<16 x i32> %a, <16 x i32>* %ptr_b) {
2993 ; CHECK-LABEL: test_mask_mul_epi32_rm:
2994 ; CHECK:       ## BB#0:
2995 ; CHECK-NEXT:    vpmuldq (%rdi), %zmm0, %zmm0
2996 ; CHECK-NEXT:    retq
2997   %b = load <16 x i32>, <16 x i32>* %ptr_b
2998   %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)
2999   ret < 8 x i64> %res
3000 }
3001
3002 define <8 x i64> @test_mask_mul_epi32_rmk(<16 x i32> %a, <16 x i32>* %ptr_b, <8 x i64> %passThru, i8 %mask) {
3003 ; CHECK-LABEL: test_mask_mul_epi32_rmk:
3004 ; CHECK:       ## BB#0:
3005 ; CHECK-NEXT:    movzbl %sil, %eax
3006 ; CHECK-NEXT:    kmovw %eax, %k1
3007 ; CHECK-NEXT:    vpmuldq (%rdi), %zmm0, %zmm1 {%k1}
3008 ; CHECK-NEXT:    vmovaps %zmm1, %zmm0
3009 ; CHECK-NEXT:    retq
3010   %b = load <16 x i32>, <16 x i32>* %ptr_b
3011   %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)
3012   ret < 8 x i64> %res
3013 }
3014
3015 define <8 x i64> @test_mask_mul_epi32_rmkz(<16 x i32> %a, <16 x i32>* %ptr_b, i8 %mask) {
3016 ; CHECK-LABEL: test_mask_mul_epi32_rmkz:
3017 ; CHECK:       ## BB#0:
3018 ; CHECK-NEXT:    movzbl %sil, %eax
3019 ; CHECK-NEXT:    kmovw %eax, %k1
3020 ; CHECK-NEXT:    vpmuldq (%rdi), %zmm0, %zmm0 {%k1} {z}
3021 ; CHECK-NEXT:    retq
3022   %b = load <16 x i32>, <16 x i32>* %ptr_b
3023   %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)
3024   ret < 8 x i64> %res
3025 }
3026
3027 define <8 x i64> @test_mask_mul_epi32_rmb(<16 x i32> %a, i64* %ptr_b) {
3028 ; CHECK-LABEL: test_mask_mul_epi32_rmb:
3029 ; CHECK:       ## BB#0:
3030 ; CHECK-NEXT:    vpmuldq (%rdi){1to8}, %zmm0, %zmm0
3031 ; CHECK-NEXT:    retq
3032   %q = load i64, i64* %ptr_b
3033   %vecinit.i = insertelement <8 x i64> undef, i64 %q, i32 0
3034   %b64 = shufflevector <8 x i64> %vecinit.i, <8 x i64> undef, <8 x i32> zeroinitializer
3035   %b = bitcast <8 x i64> %b64 to <16 x i32>
3036   %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)
3037   ret < 8 x i64> %res
3038 }
3039
3040 define <8 x i64> @test_mask_mul_epi32_rmbk(<16 x i32> %a, i64* %ptr_b, <8 x i64> %passThru, i8 %mask) {
3041 ; CHECK-LABEL: test_mask_mul_epi32_rmbk:
3042 ; CHECK:       ## BB#0:
3043 ; CHECK-NEXT:    movzbl %sil, %eax
3044 ; CHECK-NEXT:    kmovw %eax, %k1
3045 ; CHECK-NEXT:    vpmuldq (%rdi){1to8}, %zmm0, %zmm1 {%k1}
3046 ; CHECK-NEXT:    vmovaps %zmm1, %zmm0
3047 ; CHECK-NEXT:    retq
3048   %q = load i64, i64* %ptr_b
3049   %vecinit.i = insertelement <8 x i64> undef, i64 %q, i32 0
3050   %b64 = shufflevector <8 x i64> %vecinit.i, <8 x i64> undef, <8 x i32> zeroinitializer
3051   %b = bitcast <8 x i64> %b64 to <16 x i32>
3052   %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)
3053   ret < 8 x i64> %res
3054 }
3055
3056 define <8 x i64> @test_mask_mul_epi32_rmbkz(<16 x i32> %a, i64* %ptr_b, i8 %mask) {
3057 ; CHECK-LABEL: test_mask_mul_epi32_rmbkz:
3058 ; CHECK:       ## BB#0:
3059 ; CHECK-NEXT:    movzbl %sil, %eax
3060 ; CHECK-NEXT:    kmovw %eax, %k1
3061 ; CHECK-NEXT:    vpmuldq (%rdi){1to8}, %zmm0, %zmm0 {%k1} {z}
3062 ; CHECK-NEXT:    retq
3063   %q = load i64, i64* %ptr_b
3064   %vecinit.i = insertelement <8 x i64> undef, i64 %q, i32 0
3065   %b64 = shufflevector <8 x i64> %vecinit.i, <8 x i64> undef, <8 x i32> zeroinitializer
3066   %b = bitcast <8 x i64> %b64 to <16 x i32>
3067   %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)
3068   ret < 8 x i64> %res
3069 }
3070
3071 declare <8 x i64> @llvm.x86.avx512.mask.pmul.dq.512(<16 x i32>, <16 x i32>, <8 x i64>, i8)
3072
3073 define <8 x i64> @test_mask_mul_epu32_rr(<16 x i32> %a, <16 x i32> %b) {
3074 ; CHECK-LABEL: test_mask_mul_epu32_rr:
3075 ; CHECK:       ## BB#0:
3076 ; CHECK-NEXT:    vpmuludq %zmm1, %zmm0, %zmm0
3077 ; CHECK-NEXT:    retq
3078   %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)
3079   ret < 8 x i64> %res
3080 }
3081
3082 define <8 x i64> @test_mask_mul_epu32_rrk(<16 x i32> %a, <16 x i32> %b, <8 x i64> %passThru, i8 %mask) {
3083 ; CHECK-LABEL: test_mask_mul_epu32_rrk:
3084 ; CHECK:       ## BB#0:
3085 ; CHECK-NEXT:    movzbl %dil, %eax
3086 ; CHECK-NEXT:    kmovw %eax, %k1
3087 ; CHECK-NEXT:    vpmuludq %zmm1, %zmm0, %zmm2 {%k1}
3088 ; CHECK-NEXT:    vmovaps %zmm2, %zmm0
3089 ; CHECK-NEXT:    retq
3090   %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)
3091   ret < 8 x i64> %res
3092 }
3093
3094 define <8 x i64> @test_mask_mul_epu32_rrkz(<16 x i32> %a, <16 x i32> %b, i8 %mask) {
3095 ; CHECK-LABEL: test_mask_mul_epu32_rrkz:
3096 ; CHECK:       ## BB#0:
3097 ; CHECK-NEXT:    movzbl %dil, %eax
3098 ; CHECK-NEXT:    kmovw %eax, %k1
3099 ; CHECK-NEXT:    vpmuludq %zmm1, %zmm0, %zmm0 {%k1} {z}
3100 ; CHECK-NEXT:    retq
3101   %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)
3102   ret < 8 x i64> %res
3103 }
3104
3105 define <8 x i64> @test_mask_mul_epu32_rm(<16 x i32> %a, <16 x i32>* %ptr_b) {
3106 ; CHECK-LABEL: test_mask_mul_epu32_rm:
3107 ; CHECK:       ## BB#0:
3108 ; CHECK-NEXT:    vpmuludq (%rdi), %zmm0, %zmm0
3109 ; CHECK-NEXT:    retq
3110   %b = load <16 x i32>, <16 x i32>* %ptr_b
3111   %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)
3112   ret < 8 x i64> %res
3113 }
3114
3115 define <8 x i64> @test_mask_mul_epu32_rmk(<16 x i32> %a, <16 x i32>* %ptr_b, <8 x i64> %passThru, i8 %mask) {
3116 ; CHECK-LABEL: test_mask_mul_epu32_rmk:
3117 ; CHECK:       ## BB#0:
3118 ; CHECK-NEXT:    movzbl %sil, %eax
3119 ; CHECK-NEXT:    kmovw %eax, %k1
3120 ; CHECK-NEXT:    vpmuludq (%rdi), %zmm0, %zmm1 {%k1}
3121 ; CHECK-NEXT:    vmovaps %zmm1, %zmm0
3122 ; CHECK-NEXT:    retq
3123   %b = load <16 x i32>, <16 x i32>* %ptr_b
3124   %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)
3125   ret < 8 x i64> %res
3126 }
3127
3128 define <8 x i64> @test_mask_mul_epu32_rmkz(<16 x i32> %a, <16 x i32>* %ptr_b, i8 %mask) {
3129 ; CHECK-LABEL: test_mask_mul_epu32_rmkz:
3130 ; CHECK:       ## BB#0:
3131 ; CHECK-NEXT:    movzbl %sil, %eax
3132 ; CHECK-NEXT:    kmovw %eax, %k1
3133 ; CHECK-NEXT:    vpmuludq (%rdi), %zmm0, %zmm0 {%k1} {z}
3134 ; CHECK-NEXT:    retq
3135   %b = load <16 x i32>, <16 x i32>* %ptr_b
3136   %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)
3137   ret < 8 x i64> %res
3138 }
3139
3140 define <8 x i64> @test_mask_mul_epu32_rmb(<16 x i32> %a, i64* %ptr_b) {
3141 ; CHECK-LABEL: test_mask_mul_epu32_rmb:
3142 ; CHECK:       ## BB#0:
3143 ; CHECK-NEXT:    vpmuludq (%rdi){1to8}, %zmm0, %zmm0
3144 ; CHECK-NEXT:    retq
3145   %q = load i64, i64* %ptr_b
3146   %vecinit.i = insertelement <8 x i64> undef, i64 %q, i32 0
3147   %b64 = shufflevector <8 x i64> %vecinit.i, <8 x i64> undef, <8 x i32> zeroinitializer
3148   %b = bitcast <8 x i64> %b64 to <16 x i32>
3149   %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)
3150   ret < 8 x i64> %res
3151 }
3152
3153 define <8 x i64> @test_mask_mul_epu32_rmbk(<16 x i32> %a, i64* %ptr_b, <8 x i64> %passThru, i8 %mask) {
3154 ; CHECK-LABEL: test_mask_mul_epu32_rmbk:
3155 ; CHECK:       ## BB#0:
3156 ; CHECK-NEXT:    movzbl %sil, %eax
3157 ; CHECK-NEXT:    kmovw %eax, %k1
3158 ; CHECK-NEXT:    vpmuludq (%rdi){1to8}, %zmm0, %zmm1 {%k1}
3159 ; CHECK-NEXT:    vmovaps %zmm1, %zmm0
3160 ; CHECK-NEXT:    retq
3161   %q = load i64, i64* %ptr_b
3162   %vecinit.i = insertelement <8 x i64> undef, i64 %q, i32 0
3163   %b64 = shufflevector <8 x i64> %vecinit.i, <8 x i64> undef, <8 x i32> zeroinitializer
3164   %b = bitcast <8 x i64> %b64 to <16 x i32>
3165   %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)
3166   ret < 8 x i64> %res
3167 }
3168
3169 define <8 x i64> @test_mask_mul_epu32_rmbkz(<16 x i32> %a, i64* %ptr_b, i8 %mask) {
3170 ; CHECK-LABEL: test_mask_mul_epu32_rmbkz:
3171 ; CHECK:       ## BB#0:
3172 ; CHECK-NEXT:    movzbl %sil, %eax
3173 ; CHECK-NEXT:    kmovw %eax, %k1
3174 ; CHECK-NEXT:    vpmuludq (%rdi){1to8}, %zmm0, %zmm0 {%k1} {z}
3175 ; CHECK-NEXT:    retq
3176   %q = load i64, i64* %ptr_b
3177   %vecinit.i = insertelement <8 x i64> undef, i64 %q, i32 0
3178   %b64 = shufflevector <8 x i64> %vecinit.i, <8 x i64> undef, <8 x i32> zeroinitializer
3179   %b = bitcast <8 x i64> %b64 to <16 x i32>
3180   %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)
3181   ret < 8 x i64> %res
3182 }
3183
3184 declare <8 x i64> @llvm.x86.avx512.mask.pmulu.dq.512(<16 x i32>, <16 x i32>, <8 x i64>, i8)
3185
3186 define <16 x i32> @test_mask_mullo_epi32_rr_512(<16 x i32> %a, <16 x i32> %b) {
3187 ; CHECK-LABEL: test_mask_mullo_epi32_rr_512:
3188 ; CHECK:       ## BB#0:
3189 ; CHECK-NEXT:    vpmulld %zmm1, %zmm0, %zmm0
3190 ; CHECK-NEXT:    retq
3191   %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)
3192   ret <16 x i32> %res
3193 }
3194
3195 define <16 x i32> @test_mask_mullo_epi32_rrk_512(<16 x i32> %a, <16 x i32> %b, <16 x i32> %passThru, i16 %mask) {
3196 ; CHECK-LABEL: test_mask_mullo_epi32_rrk_512:
3197 ; CHECK:       ## BB#0:
3198 ; CHECK-NEXT:    kmovw %edi, %k1
3199 ; CHECK-NEXT:    vpmulld %zmm1, %zmm0, %zmm2 {%k1}
3200 ; CHECK-NEXT:    vmovaps %zmm2, %zmm0
3201 ; CHECK-NEXT:    retq
3202   %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)
3203   ret < 16 x i32> %res
3204 }
3205
3206 define <16 x i32> @test_mask_mullo_epi32_rrkz_512(<16 x i32> %a, <16 x i32> %b, i16 %mask) {
3207 ; CHECK-LABEL: test_mask_mullo_epi32_rrkz_512:
3208 ; CHECK:       ## BB#0:
3209 ; CHECK-NEXT:    kmovw %edi, %k1
3210 ; CHECK-NEXT:    vpmulld %zmm1, %zmm0, %zmm0 {%k1} {z}
3211 ; CHECK-NEXT:    retq
3212   %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)
3213   ret < 16 x i32> %res
3214 }
3215
3216 define <16 x i32> @test_mask_mullo_epi32_rm_512(<16 x i32> %a, <16 x i32>* %ptr_b) {
3217 ; CHECK-LABEL: test_mask_mullo_epi32_rm_512:
3218 ; CHECK:       ## BB#0:
3219 ; CHECK-NEXT:    vpmulld (%rdi), %zmm0, %zmm0
3220 ; CHECK-NEXT:    retq
3221   %b = load <16 x i32>, <16 x i32>* %ptr_b
3222   %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)
3223   ret < 16 x i32> %res
3224 }
3225
3226 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) {
3227 ; CHECK-LABEL: test_mask_mullo_epi32_rmk_512:
3228 ; CHECK:       ## BB#0:
3229 ; CHECK-NEXT:    kmovw %esi, %k1
3230 ; CHECK-NEXT:    vpmulld (%rdi), %zmm0, %zmm1 {%k1}
3231 ; CHECK-NEXT:    vmovaps %zmm1, %zmm0
3232 ; CHECK-NEXT:    retq
3233   %b = load <16 x i32>, <16 x i32>* %ptr_b
3234   %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)
3235   ret < 16 x i32> %res
3236 }
3237
3238 define <16 x i32> @test_mask_mullo_epi32_rmkz_512(<16 x i32> %a, <16 x i32>* %ptr_b, i16 %mask) {
3239 ; CHECK-LABEL: test_mask_mullo_epi32_rmkz_512:
3240 ; CHECK:       ## BB#0:
3241 ; CHECK-NEXT:    kmovw %esi, %k1
3242 ; CHECK-NEXT:    vpmulld (%rdi), %zmm0, %zmm0 {%k1} {z}
3243 ; CHECK-NEXT:    retq
3244   %b = load <16 x i32>, <16 x i32>* %ptr_b
3245   %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)
3246   ret < 16 x i32> %res
3247 }
3248
3249 define <16 x i32> @test_mask_mullo_epi32_rmb_512(<16 x i32> %a, i32* %ptr_b) {
3250 ; CHECK-LABEL: test_mask_mullo_epi32_rmb_512:
3251 ; CHECK:       ## BB#0:
3252 ; CHECK-NEXT:    vpmulld (%rdi){1to16}, %zmm0, %zmm0
3253 ; CHECK-NEXT:    retq
3254   %q = load i32, i32* %ptr_b
3255   %vecinit.i = insertelement <16 x i32> undef, i32 %q, i32 0
3256   %b = shufflevector <16 x i32> %vecinit.i, <16 x i32> undef, <16 x i32> zeroinitializer
3257   %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)
3258   ret < 16 x i32> %res
3259 }
3260
3261 define <16 x i32> @test_mask_mullo_epi32_rmbk_512(<16 x i32> %a, i32* %ptr_b, <16 x i32> %passThru, i16 %mask) {
3262 ; CHECK-LABEL: test_mask_mullo_epi32_rmbk_512:
3263 ; CHECK:       ## BB#0:
3264 ; CHECK-NEXT:    kmovw %esi, %k1
3265 ; CHECK-NEXT:    vpmulld (%rdi){1to16}, %zmm0, %zmm1 {%k1}
3266 ; CHECK-NEXT:    vmovaps %zmm1, %zmm0
3267 ; CHECK-NEXT:    retq
3268   %q = load i32, i32* %ptr_b
3269   %vecinit.i = insertelement <16 x i32> undef, i32 %q, i32 0
3270   %b = shufflevector <16 x i32> %vecinit.i, <16 x i32> undef, <16 x i32> zeroinitializer
3271   %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)
3272   ret < 16 x i32> %res
3273 }
3274
3275 define <16 x i32> @test_mask_mullo_epi32_rmbkz_512(<16 x i32> %a, i32* %ptr_b, i16 %mask) {
3276 ; CHECK-LABEL: test_mask_mullo_epi32_rmbkz_512:
3277 ; CHECK:       ## BB#0:
3278 ; CHECK-NEXT:    kmovw %esi, %k1
3279 ; CHECK-NEXT:    vpmulld (%rdi){1to16}, %zmm0, %zmm0 {%k1} {z}
3280 ; CHECK-NEXT:    retq
3281   %q = load i32, i32* %ptr_b
3282   %vecinit.i = insertelement <16 x i32> undef, i32 %q, i32 0
3283   %b = shufflevector <16 x i32> %vecinit.i, <16 x i32> undef, <16 x i32> zeroinitializer
3284   %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)
3285   ret < 16 x i32> %res
3286 }
3287
3288 declare <16 x i32> @llvm.x86.avx512.mask.pmull.d.512(<16 x i32>, <16 x i32>, <16 x i32>, i16)
3289
3290 define <16 x float> @test_mm512_maskz_add_round_ps_rn_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
3291 ; CHECK-LABEL: test_mm512_maskz_add_round_ps_rn_sae:
3292 ; CHECK:       ## BB#0:
3293 ; CHECK-NEXT:    kmovw %edi, %k1
3294 ; CHECK-NEXT:    vaddps {rn-sae}, %zmm1, %zmm0, %zmm0 {%k1} {z}
3295 ; CHECK-NEXT:    retq
3296   %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)
3297   ret <16 x float> %res
3298 }
3299 define <16 x float> @test_mm512_maskz_add_round_ps_rd_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
3300 ; CHECK-LABEL: test_mm512_maskz_add_round_ps_rd_sae:
3301 ; CHECK:       ## BB#0:
3302 ; CHECK-NEXT:    kmovw %edi, %k1
3303 ; CHECK-NEXT:    vaddps {rd-sae}, %zmm1, %zmm0, %zmm0 {%k1} {z}
3304 ; CHECK-NEXT:    retq
3305   %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)
3306   ret <16 x float> %res
3307 }
3308 define <16 x float> @test_mm512_maskz_add_round_ps_ru_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
3309 ; CHECK-LABEL: test_mm512_maskz_add_round_ps_ru_sae:
3310 ; CHECK:       ## BB#0:
3311 ; CHECK-NEXT:    kmovw %edi, %k1
3312 ; CHECK-NEXT:    vaddps {ru-sae}, %zmm1, %zmm0, %zmm0 {%k1} {z}
3313 ; CHECK-NEXT:    retq
3314   %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)
3315   ret <16 x float> %res
3316 }
3317
3318 define <16 x float> @test_mm512_maskz_add_round_ps_rz_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
3319 ; CHECK-LABEL: test_mm512_maskz_add_round_ps_rz_sae:
3320 ; CHECK:       ## BB#0:
3321 ; CHECK-NEXT:    kmovw %edi, %k1
3322 ; CHECK-NEXT:    vaddps {rz-sae}, %zmm1, %zmm0, %zmm0 {%k1} {z}
3323 ; CHECK-NEXT:    retq
3324   %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)
3325   ret <16 x float> %res
3326 }
3327
3328
3329 define <16 x float> @test_mm512_maskz_add_round_ps_current(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
3330 ; CHECK-LABEL: test_mm512_maskz_add_round_ps_current:
3331 ; CHECK:       ## BB#0:
3332 ; CHECK-NEXT:    kmovw %edi, %k1
3333 ; CHECK-NEXT:    vaddps %zmm1, %zmm0, %zmm0 {%k1} {z}
3334 ; CHECK-NEXT:    retq
3335   %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)
3336   ret <16 x float> %res
3337 }
3338
3339 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) {
3340 ; CHECK-LABEL: test_mm512_mask_add_round_ps_rn_sae:
3341 ; CHECK:       ## BB#0:
3342 ; CHECK-NEXT:    kmovw %edi, %k1
3343 ; CHECK-NEXT:    vaddps {rn-sae}, %zmm1, %zmm0, %zmm2 {%k1}
3344 ; CHECK-NEXT:    vmovaps %zmm2, %zmm0
3345 ; CHECK-NEXT:    retq
3346   %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)
3347   ret <16 x float> %res
3348 }
3349 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) {
3350 ; CHECK-LABEL: test_mm512_mask_add_round_ps_rd_sae:
3351 ; CHECK:       ## BB#0:
3352 ; CHECK-NEXT:    kmovw %edi, %k1
3353 ; CHECK-NEXT:    vaddps {rd-sae}, %zmm1, %zmm0, %zmm2 {%k1}
3354 ; CHECK-NEXT:    vmovaps %zmm2, %zmm0
3355 ; CHECK-NEXT:    retq
3356   %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)
3357   ret <16 x float> %res
3358 }
3359 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) {
3360 ; CHECK-LABEL: test_mm512_mask_add_round_ps_ru_sae:
3361 ; CHECK:       ## BB#0:
3362 ; CHECK-NEXT:    kmovw %edi, %k1
3363 ; CHECK-NEXT:    vaddps {ru-sae}, %zmm1, %zmm0, %zmm2 {%k1}
3364 ; CHECK-NEXT:    vmovaps %zmm2, %zmm0
3365 ; CHECK-NEXT:    retq
3366   %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)
3367   ret <16 x float> %res
3368 }
3369
3370 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) {
3371 ; CHECK-LABEL: test_mm512_mask_add_round_ps_rz_sae:
3372 ; CHECK:       ## BB#0:
3373 ; CHECK-NEXT:    kmovw %edi, %k1
3374 ; CHECK-NEXT:    vaddps {rz-sae}, %zmm1, %zmm0, %zmm2 {%k1}
3375 ; CHECK-NEXT:    vmovaps %zmm2, %zmm0
3376 ; CHECK-NEXT:    retq
3377   %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)
3378   ret <16 x float> %res
3379 }
3380
3381
3382 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) {
3383 ; CHECK-LABEL: test_mm512_mask_add_round_ps_current:
3384 ; CHECK:       ## BB#0:
3385 ; CHECK-NEXT:    kmovw %edi, %k1
3386 ; CHECK-NEXT:    vaddps %zmm1, %zmm0, %zmm2 {%k1}
3387 ; CHECK-NEXT:    vmovaps %zmm2, %zmm0
3388 ; CHECK-NEXT:    retq
3389   %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)
3390   ret <16 x float> %res
3391 }
3392
3393
3394 define <16 x float> @test_mm512_add_round_ps_rn_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
3395 ; CHECK-LABEL: test_mm512_add_round_ps_rn_sae:
3396 ; CHECK:       ## BB#0:
3397 ; CHECK-NEXT:    vaddps {rn-sae}, %zmm1, %zmm0, %zmm0
3398 ; CHECK-NEXT:    retq
3399   %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)
3400   ret <16 x float> %res
3401 }
3402 define <16 x float> @test_mm512_add_round_ps_rd_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
3403 ; CHECK-LABEL: test_mm512_add_round_ps_rd_sae:
3404 ; CHECK:       ## BB#0:
3405 ; CHECK-NEXT:    vaddps {rd-sae}, %zmm1, %zmm0, %zmm0
3406 ; CHECK-NEXT:    retq
3407   %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)
3408   ret <16 x float> %res
3409 }
3410 define <16 x float> @test_mm512_add_round_ps_ru_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
3411 ; CHECK-LABEL: test_mm512_add_round_ps_ru_sae:
3412 ; CHECK:       ## BB#0:
3413 ; CHECK-NEXT:    vaddps {ru-sae}, %zmm1, %zmm0, %zmm0
3414 ; CHECK-NEXT:    retq
3415   %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)
3416   ret <16 x float> %res
3417 }
3418
3419 define <16 x float> @test_mm512_add_round_ps_rz_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
3420 ; CHECK-LABEL: test_mm512_add_round_ps_rz_sae:
3421 ; CHECK:       ## BB#0:
3422 ; CHECK-NEXT:    vaddps {rz-sae}, %zmm1, %zmm0, %zmm0
3423 ; CHECK-NEXT:    retq
3424   %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)
3425   ret <16 x float> %res
3426 }
3427
3428 define <16 x float> @test_mm512_add_round_ps_current(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
3429 ; CHECK-LABEL: test_mm512_add_round_ps_current:
3430 ; CHECK:       ## BB#0:
3431 ; CHECK-NEXT:    vaddps %zmm1, %zmm0, %zmm0
3432 ; CHECK-NEXT:    retq
3433   %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)
3434   ret <16 x float> %res
3435 }
3436 declare <16 x float> @llvm.x86.avx512.mask.add.ps.512(<16 x float>, <16 x float>, <16 x float>, i16, i32)
3437
3438 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) {
3439 ; CHECK-LABEL: test_mm512_mask_sub_round_ps_rn_sae:
3440 ; CHECK:       ## BB#0:
3441 ; CHECK-NEXT:    kmovw %edi, %k1
3442 ; CHECK-NEXT:    vsubps {rn-sae}, %zmm1, %zmm0, %zmm2 {%k1}
3443 ; CHECK-NEXT:    vmovaps %zmm2, %zmm0
3444 ; CHECK-NEXT:    retq
3445   %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)
3446   ret <16 x float> %res
3447 }
3448 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) {
3449 ; CHECK-LABEL: test_mm512_mask_sub_round_ps_rd_sae:
3450 ; CHECK:       ## BB#0:
3451 ; CHECK-NEXT:    kmovw %edi, %k1
3452 ; CHECK-NEXT:    vsubps {rd-sae}, %zmm1, %zmm0, %zmm2 {%k1}
3453 ; CHECK-NEXT:    vmovaps %zmm2, %zmm0
3454 ; CHECK-NEXT:    retq
3455   %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)
3456   ret <16 x float> %res
3457 }
3458 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) {
3459 ; CHECK-LABEL: test_mm512_mask_sub_round_ps_ru_sae:
3460 ; CHECK:       ## BB#0:
3461 ; CHECK-NEXT:    kmovw %edi, %k1
3462 ; CHECK-NEXT:    vsubps {ru-sae}, %zmm1, %zmm0, %zmm2 {%k1}
3463 ; CHECK-NEXT:    vmovaps %zmm2, %zmm0
3464 ; CHECK-NEXT:    retq
3465   %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)
3466   ret <16 x float> %res
3467 }
3468
3469 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) {
3470 ; CHECK-LABEL: test_mm512_mask_sub_round_ps_rz_sae:
3471 ; CHECK:       ## BB#0:
3472 ; CHECK-NEXT:    kmovw %edi, %k1
3473 ; CHECK-NEXT:    vsubps {rz-sae}, %zmm1, %zmm0, %zmm2 {%k1}
3474 ; CHECK-NEXT:    vmovaps %zmm2, %zmm0
3475 ; CHECK-NEXT:    retq
3476   %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)
3477   ret <16 x float> %res
3478 }
3479
3480
3481 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) {
3482 ; CHECK-LABEL: test_mm512_mask_sub_round_ps_current:
3483 ; CHECK:       ## BB#0:
3484 ; CHECK-NEXT:    kmovw %edi, %k1
3485 ; CHECK-NEXT:    vsubps %zmm1, %zmm0, %zmm2 {%k1}
3486 ; CHECK-NEXT:    vmovaps %zmm2, %zmm0
3487 ; CHECK-NEXT:    retq
3488   %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)
3489   ret <16 x float> %res
3490 }
3491
3492 define <16 x float> @test_mm512_sub_round_ps_rn_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
3493 ; CHECK-LABEL: test_mm512_sub_round_ps_rn_sae:
3494 ; CHECK:       ## BB#0:
3495 ; CHECK-NEXT:    vsubps {rn-sae}, %zmm1, %zmm0, %zmm0
3496 ; CHECK-NEXT:    retq
3497   %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)
3498   ret <16 x float> %res
3499 }
3500 define <16 x float> @test_mm512_sub_round_ps_rd_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
3501 ; CHECK-LABEL: test_mm512_sub_round_ps_rd_sae:
3502 ; CHECK:       ## BB#0:
3503 ; CHECK-NEXT:    vsubps {rd-sae}, %zmm1, %zmm0, %zmm0
3504 ; CHECK-NEXT:    retq
3505   %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)
3506   ret <16 x float> %res
3507 }
3508 define <16 x float> @test_mm512_sub_round_ps_ru_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
3509 ; CHECK-LABEL: test_mm512_sub_round_ps_ru_sae:
3510 ; CHECK:       ## BB#0:
3511 ; CHECK-NEXT:    vsubps {ru-sae}, %zmm1, %zmm0, %zmm0
3512 ; CHECK-NEXT:    retq
3513   %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)
3514   ret <16 x float> %res
3515 }
3516
3517 define <16 x float> @test_mm512_sub_round_ps_rz_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
3518 ; CHECK-LABEL: test_mm512_sub_round_ps_rz_sae:
3519 ; CHECK:       ## BB#0:
3520 ; CHECK-NEXT:    vsubps {rz-sae}, %zmm1, %zmm0, %zmm0
3521 ; CHECK-NEXT:    retq
3522   %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)
3523   ret <16 x float> %res
3524 }
3525
3526 define <16 x float> @test_mm512_sub_round_ps_current(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
3527 ; CHECK-LABEL: test_mm512_sub_round_ps_current:
3528 ; CHECK:       ## BB#0:
3529 ; CHECK-NEXT:    vsubps %zmm1, %zmm0, %zmm0
3530 ; CHECK-NEXT:    retq
3531   %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)
3532   ret <16 x float> %res
3533 }
3534
3535 define <16 x float> @test_mm512_maskz_div_round_ps_rn_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
3536 ; CHECK-LABEL: test_mm512_maskz_div_round_ps_rn_sae:
3537 ; CHECK:       ## BB#0:
3538 ; CHECK-NEXT:    kmovw %edi, %k1
3539 ; CHECK-NEXT:    vdivps {rn-sae}, %zmm1, %zmm0, %zmm0 {%k1} {z}
3540 ; CHECK-NEXT:    retq
3541   %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)
3542   ret <16 x float> %res
3543 }
3544 define <16 x float> @test_mm512_maskz_div_round_ps_rd_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
3545 ; CHECK-LABEL: test_mm512_maskz_div_round_ps_rd_sae:
3546 ; CHECK:       ## BB#0:
3547 ; CHECK-NEXT:    kmovw %edi, %k1
3548 ; CHECK-NEXT:    vdivps {rd-sae}, %zmm1, %zmm0, %zmm0 {%k1} {z}
3549 ; CHECK-NEXT:    retq
3550   %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)
3551   ret <16 x float> %res
3552 }
3553 define <16 x float> @test_mm512_maskz_div_round_ps_ru_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
3554 ; CHECK-LABEL: test_mm512_maskz_div_round_ps_ru_sae:
3555 ; CHECK:       ## BB#0:
3556 ; CHECK-NEXT:    kmovw %edi, %k1
3557 ; CHECK-NEXT:    vdivps {ru-sae}, %zmm1, %zmm0, %zmm0 {%k1} {z}
3558 ; CHECK-NEXT:    retq
3559   %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)
3560   ret <16 x float> %res
3561 }
3562
3563 define <16 x float> @test_mm512_maskz_div_round_ps_rz_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
3564 ; CHECK-LABEL: test_mm512_maskz_div_round_ps_rz_sae:
3565 ; CHECK:       ## BB#0:
3566 ; CHECK-NEXT:    kmovw %edi, %k1
3567 ; CHECK-NEXT:    vdivps {rz-sae}, %zmm1, %zmm0, %zmm0 {%k1} {z}
3568 ; CHECK-NEXT:    retq
3569   %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)
3570   ret <16 x float> %res
3571 }
3572
3573
3574 define <16 x float> @test_mm512_maskz_div_round_ps_current(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
3575 ; CHECK-LABEL: test_mm512_maskz_div_round_ps_current:
3576 ; CHECK:       ## BB#0:
3577 ; CHECK-NEXT:    kmovw %edi, %k1
3578 ; CHECK-NEXT:    vdivps %zmm1, %zmm0, %zmm0 {%k1} {z}
3579 ; CHECK-NEXT:    retq
3580   %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)
3581   ret <16 x float> %res
3582 }
3583
3584 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) {
3585 ; CHECK-LABEL: test_mm512_mask_div_round_ps_rn_sae:
3586 ; CHECK:       ## BB#0:
3587 ; CHECK-NEXT:    kmovw %edi, %k1
3588 ; CHECK-NEXT:    vdivps {rn-sae}, %zmm1, %zmm0, %zmm2 {%k1}
3589 ; CHECK-NEXT:    vmovaps %zmm2, %zmm0
3590 ; CHECK-NEXT:    retq
3591   %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)
3592   ret <16 x float> %res
3593 }
3594 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) {
3595 ; CHECK-LABEL: test_mm512_mask_div_round_ps_rd_sae:
3596 ; CHECK:       ## BB#0:
3597 ; CHECK-NEXT:    kmovw %edi, %k1
3598 ; CHECK-NEXT:    vdivps {rd-sae}, %zmm1, %zmm0, %zmm2 {%k1}
3599 ; CHECK-NEXT:    vmovaps %zmm2, %zmm0
3600 ; CHECK-NEXT:    retq
3601   %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)
3602   ret <16 x float> %res
3603 }
3604 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) {
3605 ; CHECK-LABEL: test_mm512_mask_div_round_ps_ru_sae:
3606 ; CHECK:       ## BB#0:
3607 ; CHECK-NEXT:    kmovw %edi, %k1
3608 ; CHECK-NEXT:    vdivps {ru-sae}, %zmm1, %zmm0, %zmm2 {%k1}
3609 ; CHECK-NEXT:    vmovaps %zmm2, %zmm0
3610 ; CHECK-NEXT:    retq
3611   %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)
3612   ret <16 x float> %res
3613 }
3614
3615 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) {
3616 ; CHECK-LABEL: test_mm512_mask_div_round_ps_rz_sae:
3617 ; CHECK:       ## BB#0:
3618 ; CHECK-NEXT:    kmovw %edi, %k1
3619 ; CHECK-NEXT:    vdivps {rz-sae}, %zmm1, %zmm0, %zmm2 {%k1}
3620 ; CHECK-NEXT:    vmovaps %zmm2, %zmm0
3621 ; CHECK-NEXT:    retq
3622   %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)
3623   ret <16 x float> %res
3624 }
3625
3626
3627 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) {
3628 ; CHECK-LABEL: test_mm512_mask_div_round_ps_current:
3629 ; CHECK:       ## BB#0:
3630 ; CHECK-NEXT:    kmovw %edi, %k1
3631 ; CHECK-NEXT:    vdivps %zmm1, %zmm0, %zmm2 {%k1}
3632 ; CHECK-NEXT:    vmovaps %zmm2, %zmm0
3633 ; CHECK-NEXT:    retq
3634   %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)
3635   ret <16 x float> %res
3636 }
3637
3638
3639 define <16 x float> @test_mm512_div_round_ps_rn_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
3640 ; CHECK-LABEL: test_mm512_div_round_ps_rn_sae:
3641 ; CHECK:       ## BB#0:
3642 ; CHECK-NEXT:    vdivps {rn-sae}, %zmm1, %zmm0, %zmm0
3643 ; CHECK-NEXT:    retq
3644   %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)
3645   ret <16 x float> %res
3646 }
3647 define <16 x float> @test_mm512_div_round_ps_rd_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
3648 ; CHECK-LABEL: test_mm512_div_round_ps_rd_sae:
3649 ; CHECK:       ## BB#0:
3650 ; CHECK-NEXT:    vdivps {rd-sae}, %zmm1, %zmm0, %zmm0
3651 ; CHECK-NEXT:    retq
3652   %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)
3653   ret <16 x float> %res
3654 }
3655 define <16 x float> @test_mm512_div_round_ps_ru_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
3656 ; CHECK-LABEL: test_mm512_div_round_ps_ru_sae:
3657 ; CHECK:       ## BB#0:
3658 ; CHECK-NEXT:    vdivps {ru-sae}, %zmm1, %zmm0, %zmm0
3659 ; CHECK-NEXT:    retq
3660   %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)
3661   ret <16 x float> %res
3662 }
3663
3664 define <16 x float> @test_mm512_div_round_ps_rz_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
3665 ; CHECK-LABEL: test_mm512_div_round_ps_rz_sae:
3666 ; CHECK:       ## BB#0:
3667 ; CHECK-NEXT:    vdivps {rz-sae}, %zmm1, %zmm0, %zmm0
3668 ; CHECK-NEXT:    retq
3669   %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)
3670   ret <16 x float> %res
3671 }
3672
3673 define <16 x float> @test_mm512_div_round_ps_current(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
3674 ; CHECK-LABEL: test_mm512_div_round_ps_current:
3675 ; CHECK:       ## BB#0:
3676 ; CHECK-NEXT:    vdivps %zmm1, %zmm0, %zmm0
3677 ; CHECK-NEXT:    retq
3678   %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)
3679   ret <16 x float> %res
3680 }
3681 declare <16 x float> @llvm.x86.avx512.mask.div.ps.512(<16 x float>, <16 x float>, <16 x float>, i16, i32)
3682
3683 define <16 x float> @test_mm512_maskz_min_round_ps_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
3684 ; CHECK-LABEL: test_mm512_maskz_min_round_ps_sae:
3685 ; CHECK:       ## BB#0:
3686 ; CHECK-NEXT:    kmovw %edi, %k1
3687 ; CHECK-NEXT:    vminps {sae}, %zmm1, %zmm0, %zmm0 {%k1} {z}
3688 ; CHECK-NEXT:    retq
3689   %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)
3690   ret <16 x float> %res
3691 }
3692
3693 define <16 x float> @test_mm512_maskz_min_round_ps_current(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
3694 ; CHECK-LABEL: test_mm512_maskz_min_round_ps_current:
3695 ; CHECK:       ## BB#0:
3696 ; CHECK-NEXT:    kmovw %edi, %k1
3697 ; CHECK-NEXT:    vminps %zmm1, %zmm0, %zmm0 {%k1} {z}
3698 ; CHECK-NEXT:    retq
3699   %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)
3700   ret <16 x float> %res
3701 }
3702
3703 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) {
3704 ; CHECK-LABEL: test_mm512_mask_min_round_ps_sae:
3705 ; CHECK:       ## BB#0:
3706 ; CHECK-NEXT:    kmovw %edi, %k1
3707 ; CHECK-NEXT:    vminps {sae}, %zmm1, %zmm0, %zmm2 {%k1}
3708 ; CHECK-NEXT:    vmovaps %zmm2, %zmm0
3709 ; CHECK-NEXT:    retq
3710   %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)
3711   ret <16 x float> %res
3712 }
3713
3714 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) {
3715 ; CHECK-LABEL: test_mm512_mask_min_round_ps_current:
3716 ; CHECK:       ## BB#0:
3717 ; CHECK-NEXT:    kmovw %edi, %k1
3718 ; CHECK-NEXT:    vminps %zmm1, %zmm0, %zmm2 {%k1}
3719 ; CHECK-NEXT:    vmovaps %zmm2, %zmm0
3720 ; CHECK-NEXT:    retq
3721   %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)
3722   ret <16 x float> %res
3723 }
3724
3725 define <16 x float> @test_mm512_min_round_ps_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
3726 ; CHECK-LABEL: test_mm512_min_round_ps_sae:
3727 ; CHECK:       ## BB#0:
3728 ; CHECK-NEXT:    vminps {sae}, %zmm1, %zmm0, %zmm0
3729 ; CHECK-NEXT:    retq
3730   %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)
3731   ret <16 x float> %res
3732 }
3733
3734 define <16 x float> @test_mm512_min_round_ps_current(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
3735 ; CHECK-LABEL: test_mm512_min_round_ps_current:
3736 ; CHECK:       ## BB#0:
3737 ; CHECK-NEXT:    vminps %zmm1, %zmm0, %zmm0
3738 ; CHECK-NEXT:    retq
3739   %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)
3740   ret <16 x float> %res
3741 }
3742 declare <16 x float> @llvm.x86.avx512.mask.min.ps.512(<16 x float>, <16 x float>, <16 x float>, i16, i32)
3743
3744 define <16 x float> @test_mm512_maskz_max_round_ps_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
3745 ; CHECK-LABEL: test_mm512_maskz_max_round_ps_sae:
3746 ; CHECK:       ## BB#0:
3747 ; CHECK-NEXT:    kmovw %edi, %k1
3748 ; CHECK-NEXT:    vmaxps {sae}, %zmm1, %zmm0, %zmm0 {%k1} {z}
3749 ; CHECK-NEXT:    retq
3750   %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)
3751   ret <16 x float> %res
3752 }
3753
3754 define <16 x float> @test_mm512_maskz_max_round_ps_current(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
3755 ; CHECK-LABEL: test_mm512_maskz_max_round_ps_current:
3756 ; CHECK:       ## BB#0:
3757 ; CHECK-NEXT:    kmovw %edi, %k1
3758 ; CHECK-NEXT:    vmaxps %zmm1, %zmm0, %zmm0 {%k1} {z}
3759 ; CHECK-NEXT:    retq
3760   %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)
3761   ret <16 x float> %res
3762 }
3763
3764 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) {
3765 ; CHECK-LABEL: test_mm512_mask_max_round_ps_sae:
3766 ; CHECK:       ## BB#0:
3767 ; CHECK-NEXT:    kmovw %edi, %k1
3768 ; CHECK-NEXT:    vmaxps {sae}, %zmm1, %zmm0, %zmm2 {%k1}
3769 ; CHECK-NEXT:    vmovaps %zmm2, %zmm0
3770 ; CHECK-NEXT:    retq
3771   %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)
3772   ret <16 x float> %res
3773 }
3774
3775 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) {
3776 ; CHECK-LABEL: test_mm512_mask_max_round_ps_current:
3777 ; CHECK:       ## BB#0:
3778 ; CHECK-NEXT:    kmovw %edi, %k1
3779 ; CHECK-NEXT:    vmaxps %zmm1, %zmm0, %zmm2 {%k1}
3780 ; CHECK-NEXT:    vmovaps %zmm2, %zmm0
3781 ; CHECK-NEXT:    retq
3782   %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)
3783   ret <16 x float> %res
3784 }
3785
3786 define <16 x float> @test_mm512_max_round_ps_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
3787 ; CHECK-LABEL: test_mm512_max_round_ps_sae:
3788 ; CHECK:       ## BB#0:
3789 ; CHECK-NEXT:    vmaxps {sae}, %zmm1, %zmm0, %zmm0
3790 ; CHECK-NEXT:    retq
3791   %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)
3792   ret <16 x float> %res
3793 }
3794
3795 define <16 x float> @test_mm512_max_round_ps_current(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
3796 ; CHECK-LABEL: test_mm512_max_round_ps_current:
3797 ; CHECK:       ## BB#0:
3798 ; CHECK-NEXT:    vmaxps %zmm1, %zmm0, %zmm0
3799 ; CHECK-NEXT:    retq
3800   %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)
3801   ret <16 x float> %res
3802 }
3803 declare <16 x float> @llvm.x86.avx512.mask.max.ps.512(<16 x float>, <16 x float>, <16 x float>, i16, i32)
3804
3805 declare <4 x float> @llvm.x86.avx512.mask.add.ss.round(<4 x float>, <4 x float>, <4 x float>, i8, i32) nounwind readnone
3806
3807 define <4 x float> @test_mask_add_ss_rn(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2, i8 %mask) {
3808 ; CHECK-LABEL: test_mask_add_ss_rn:
3809 ; CHECK:       ## BB#0:
3810 ; CHECK-NEXT:    andl $1, %edi
3811 ; CHECK-NEXT:    kmovw %edi, %k1
3812 ; CHECK-NEXT:    vaddss {rn-sae}, %xmm1, %xmm0, %xmm2 {%k1}
3813 ; CHECK-NEXT:    vmovaps %zmm2, %zmm0
3814 ; CHECK-NEXT:    retq
3815   %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)
3816   ret <4 x float> %res
3817 }
3818
3819 define <4 x float> @test_mask_add_ss_rd(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2, i8 %mask) {
3820 ; CHECK-LABEL: test_mask_add_ss_rd:
3821 ; CHECK:       ## BB#0:
3822 ; CHECK-NEXT:    andl $1, %edi
3823 ; CHECK-NEXT:    kmovw %edi, %k1
3824 ; CHECK-NEXT:    vaddss {rd-sae}, %xmm1, %xmm0, %xmm2 {%k1}
3825 ; CHECK-NEXT:    vmovaps %zmm2, %zmm0
3826 ; CHECK-NEXT:    retq
3827   %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)
3828   ret <4 x float> %res
3829 }
3830
3831 define <4 x float> @test_mask_add_ss_ru(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2, i8 %mask) {
3832 ; CHECK-LABEL: test_mask_add_ss_ru:
3833 ; CHECK:       ## BB#0:
3834 ; CHECK-NEXT:    andl $1, %edi
3835 ; CHECK-NEXT:    kmovw %edi, %k1
3836 ; CHECK-NEXT:    vaddss {ru-sae}, %xmm1, %xmm0, %xmm2 {%k1}
3837 ; CHECK-NEXT:    vmovaps %zmm2, %zmm0
3838 ; CHECK-NEXT:    retq
3839   %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)
3840   ret <4 x float> %res
3841 }
3842
3843 define <4 x float> @test_mask_add_ss_rz(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2, i8 %mask) {
3844 ; CHECK-LABEL: test_mask_add_ss_rz:
3845 ; CHECK:       ## BB#0:
3846 ; CHECK-NEXT:    andl $1, %edi
3847 ; CHECK-NEXT:    kmovw %edi, %k1
3848 ; CHECK-NEXT:    vaddss {rz-sae}, %xmm1, %xmm0, %xmm2 {%k1}
3849 ; CHECK-NEXT:    vmovaps %zmm2, %zmm0
3850 ; CHECK-NEXT:    retq
3851   %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)
3852   ret <4 x float> %res
3853 }
3854
3855 define <4 x float> @test_mask_add_ss_current(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2, i8 %mask) {
3856 ; CHECK-LABEL: test_mask_add_ss_current:
3857 ; CHECK:       ## BB#0:
3858 ; CHECK-NEXT:    andl $1, %edi
3859 ; CHECK-NEXT:    kmovw %edi, %k1
3860 ; CHECK-NEXT:    vaddss %xmm1, %xmm0, %xmm2 {%k1}
3861 ; CHECK-NEXT:    vmovaps %zmm2, %zmm0
3862 ; CHECK-NEXT:    retq
3863   %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)
3864   ret <4 x float> %res
3865 }
3866
3867 define <4 x float> @test_maskz_add_ss_rn(<4 x float> %a0, <4 x float> %a1, i8 %mask) {
3868 ; CHECK-LABEL: test_maskz_add_ss_rn:
3869 ; CHECK:       ## BB#0:
3870 ; CHECK-NEXT:    andl $1, %edi
3871 ; CHECK-NEXT:    kmovw %edi, %k1
3872 ; CHECK-NEXT:    vaddss {rn-sae}, %xmm1, %xmm0, %xmm0 {%k1} {z}
3873 ; CHECK-NEXT:    retq
3874   %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)
3875   ret <4 x float> %res
3876 }
3877
3878 define <4 x float> @test_add_ss_rn(<4 x float> %a0, <4 x float> %a1) {
3879 ; CHECK-LABEL: test_add_ss_rn:
3880 ; CHECK:       ## BB#0:
3881 ; CHECK-NEXT:    vaddss {rn-sae}, %xmm1, %xmm0, %xmm0
3882 ; CHECK-NEXT:    retq
3883   %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)
3884   ret <4 x float> %res
3885 }
3886
3887 declare <2 x double> @llvm.x86.avx512.mask.add.sd.round(<2 x double>, <2 x double>, <2 x double>, i8, i32) nounwind readnone
3888
3889 define <2 x double> @test_mask_add_sd_rn(<2 x double> %a0, <2 x double> %a1, <2 x double> %a2, i8 %mask) {
3890 ; CHECK-LABEL: test_mask_add_sd_rn:
3891 ; CHECK:       ## BB#0:
3892 ; CHECK-NEXT:    andl $1, %edi
3893 ; CHECK-NEXT:    kmovw %edi, %k1
3894 ; CHECK-NEXT:    vaddsd {rn-sae}, %xmm1, %xmm0, %xmm2 {%k1}
3895 ; CHECK-NEXT:    vmovaps %zmm2, %zmm0
3896 ; CHECK-NEXT:    retq
3897   %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)
3898   ret <2 x double> %res
3899 }
3900
3901 define <2 x double> @test_mask_add_sd_rd(<2 x double> %a0, <2 x double> %a1, <2 x double> %a2, i8 %mask) {
3902 ; CHECK-LABEL: test_mask_add_sd_rd:
3903 ; CHECK:       ## BB#0:
3904 ; CHECK-NEXT:    andl $1, %edi
3905 ; CHECK-NEXT:    kmovw %edi, %k1
3906 ; CHECK-NEXT:    vaddsd {rd-sae}, %xmm1, %xmm0, %xmm2 {%k1}
3907 ; CHECK-NEXT:    vmovaps %zmm2, %zmm0
3908 ; CHECK-NEXT:    retq
3909   %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)
3910   ret <2 x double> %res
3911 }
3912
3913 define <2 x double> @test_mask_add_sd_ru(<2 x double> %a0, <2 x double> %a1, <2 x double> %a2, i8 %mask) {
3914 ; CHECK-LABEL: test_mask_add_sd_ru:
3915 ; CHECK:       ## BB#0:
3916 ; CHECK-NEXT:    andl $1, %edi
3917 ; CHECK-NEXT:    kmovw %edi, %k1
3918 ; CHECK-NEXT:    vaddsd {ru-sae}, %xmm1, %xmm0, %xmm2 {%k1}
3919 ; CHECK-NEXT:    vmovaps %zmm2, %zmm0
3920 ; CHECK-NEXT:    retq
3921   %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)
3922   ret <2 x double> %res
3923 }
3924
3925 define <2 x double> @test_mask_add_sd_rz(<2 x double> %a0, <2 x double> %a1, <2 x double> %a2, i8 %mask) {
3926 ; CHECK-LABEL: test_mask_add_sd_rz:
3927 ; CHECK:       ## BB#0:
3928 ; CHECK-NEXT:    andl $1, %edi
3929 ; CHECK-NEXT:    kmovw %edi, %k1
3930 ; CHECK-NEXT:    vaddsd {rz-sae}, %xmm1, %xmm0, %xmm2 {%k1}
3931 ; CHECK-NEXT:    vmovaps %zmm2, %zmm0
3932 ; CHECK-NEXT:    retq
3933   %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)
3934   ret <2 x double> %res
3935 }
3936
3937 define <2 x double> @test_mask_add_sd_current(<2 x double> %a0, <2 x double> %a1, <2 x double> %a2, i8 %mask) {
3938 ; CHECK-LABEL: test_mask_add_sd_current:
3939 ; CHECK:       ## BB#0:
3940 ; CHECK-NEXT:    andl $1, %edi
3941 ; CHECK-NEXT:    kmovw %edi, %k1
3942 ; CHECK-NEXT:    vaddsd %xmm1, %xmm0, %xmm2 {%k1}
3943 ; CHECK-NEXT:    vmovaps %zmm2, %zmm0
3944 ; CHECK-NEXT:    retq
3945   %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)
3946   ret <2 x double> %res
3947 }
3948
3949 define <2 x double> @test_maskz_add_sd_rn(<2 x double> %a0, <2 x double> %a1, i8 %mask) {
3950 ; CHECK-LABEL: test_maskz_add_sd_rn:
3951 ; CHECK:       ## BB#0:
3952 ; CHECK-NEXT:    andl $1, %edi
3953 ; CHECK-NEXT:    kmovw %edi, %k1
3954 ; CHECK-NEXT:    vaddsd {rn-sae}, %xmm1, %xmm0, %xmm0 {%k1} {z}
3955 ; CHECK-NEXT:    retq
3956   %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)
3957   ret <2 x double> %res
3958 }
3959
3960 define <2 x double> @test_add_sd_rn(<2 x double> %a0, <2 x double> %a1) {
3961 ; CHECK-LABEL: test_add_sd_rn:
3962 ; CHECK:       ## BB#0:
3963 ; CHECK-NEXT:    vaddsd {rn-sae}, %xmm1, %xmm0, %xmm0
3964 ; CHECK-NEXT:    retq
3965   %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)
3966   ret <2 x double> %res
3967 }
3968
3969 declare <4 x float> @llvm.x86.avx512.mask.max.ss.round(<4 x float>, <4 x float>, <4 x float>, i8, i32) nounwind readnone
3970
3971 define <4 x float> @test_mask_max_ss_sae(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2, i8 %mask) {
3972 ; CHECK-LABEL: test_mask_max_ss_sae:
3973 ; CHECK:       ## BB#0:
3974 ; CHECK-NEXT:    andl $1, %edi
3975 ; CHECK-NEXT:    kmovw %edi, %k1
3976 ; CHECK-NEXT:    vmaxss {sae}, %xmm1, %xmm0, %xmm2 {%k1}
3977 ; CHECK-NEXT:    vmovaps %zmm2, %zmm0
3978 ; CHECK-NEXT:    retq
3979   %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)
3980   ret <4 x float> %res
3981 }
3982
3983 define <4 x float> @test_maskz_max_ss_sae(<4 x float> %a0, <4 x float> %a1, i8 %mask) {
3984 ; CHECK-LABEL: test_maskz_max_ss_sae:
3985 ; CHECK:       ## BB#0:
3986 ; CHECK-NEXT:    andl $1, %edi
3987 ; CHECK-NEXT:    kmovw %edi, %k1
3988 ; CHECK-NEXT:    vmaxss {sae}, %xmm1, %xmm0, %xmm0 {%k1} {z}
3989 ; CHECK-NEXT:    retq
3990   %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)
3991   ret <4 x float> %res
3992 }
3993
3994 define <4 x float> @test_max_ss_sae(<4 x float> %a0, <4 x float> %a1) {
3995 ; CHECK-LABEL: test_max_ss_sae:
3996 ; CHECK:       ## BB#0:
3997 ; CHECK-NEXT:    vmaxss {sae}, %xmm1, %xmm0, %xmm0
3998 ; CHECK-NEXT:    retq
3999   %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)
4000   ret <4 x float> %res
4001 }
4002
4003 define <4 x float> @test_mask_max_ss(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2, i8 %mask) {
4004 ; CHECK-LABEL: test_mask_max_ss:
4005 ; CHECK:       ## BB#0:
4006 ; CHECK-NEXT:    andl $1, %edi
4007 ; CHECK-NEXT:    kmovw %edi, %k1
4008 ; CHECK-NEXT:    vmaxss %xmm1, %xmm0, %xmm2 {%k1}
4009 ; CHECK-NEXT:    vmovaps %zmm2, %zmm0
4010 ; CHECK-NEXT:    retq
4011   %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)
4012   ret <4 x float> %res
4013 }
4014
4015 define <4 x float> @test_maskz_max_ss(<4 x float> %a0, <4 x float> %a1, i8 %mask) {
4016 ; CHECK-LABEL: test_maskz_max_ss:
4017 ; CHECK:       ## BB#0:
4018 ; CHECK-NEXT:    andl $1, %edi
4019 ; CHECK-NEXT:    kmovw %edi, %k1
4020 ; CHECK-NEXT:    vmaxss %xmm1, %xmm0, %xmm0 {%k1} {z}
4021 ; CHECK-NEXT:    retq
4022   %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)
4023   ret <4 x float> %res
4024 }
4025
4026 define <4 x float> @test_max_ss(<4 x float> %a0, <4 x float> %a1) {
4027 ; CHECK-LABEL: test_max_ss:
4028 ; CHECK:       ## BB#0:
4029 ; CHECK-NEXT:    vmaxss %xmm1, %xmm0, %xmm0
4030 ; CHECK-NEXT:    retq
4031   %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)
4032   ret <4 x float> %res
4033 }
4034 declare <2 x double> @llvm.x86.avx512.mask.max.sd.round(<2 x double>, <2 x double>, <2 x double>, i8, i32) nounwind readnone
4035
4036 define <2 x double> @test_mask_max_sd_sae(<2 x double> %a0, <2 x double> %a1, <2 x double> %a2, i8 %mask) {
4037 ; CHECK-LABEL: test_mask_max_sd_sae:
4038 ; CHECK:       ## BB#0:
4039 ; CHECK-NEXT:    andl $1, %edi
4040 ; CHECK-NEXT:    kmovw %edi, %k1
4041 ; CHECK-NEXT:    vmaxsd {sae}, %xmm1, %xmm0, %xmm2 {%k1}
4042 ; CHECK-NEXT:    vmovaps %zmm2, %zmm0
4043 ; CHECK-NEXT:    retq
4044   %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)
4045   ret <2 x double> %res
4046 }
4047
4048 define <2 x double> @test_maskz_max_sd_sae(<2 x double> %a0, <2 x double> %a1, i8 %mask) {
4049 ; CHECK-LABEL: test_maskz_max_sd_sae:
4050 ; CHECK:       ## BB#0:
4051 ; CHECK-NEXT:    andl $1, %edi
4052 ; CHECK-NEXT:    kmovw %edi, %k1
4053 ; CHECK-NEXT:    vmaxsd {sae}, %xmm1, %xmm0, %xmm0 {%k1} {z}
4054 ; CHECK-NEXT:    retq
4055   %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)
4056   ret <2 x double> %res
4057 }
4058
4059 define <2 x double> @test_max_sd_sae(<2 x double> %a0, <2 x double> %a1) {
4060 ; CHECK-LABEL: test_max_sd_sae:
4061 ; CHECK:       ## BB#0:
4062 ; CHECK-NEXT:    vmaxsd {sae}, %xmm1, %xmm0, %xmm0
4063 ; CHECK-NEXT:    retq
4064   %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)
4065   ret <2 x double> %res
4066 }
4067
4068 define <2 x double> @test_mask_max_sd(<2 x double> %a0, <2 x double> %a1, <2 x double> %a2, i8 %mask) {
4069 ; CHECK-LABEL: test_mask_max_sd:
4070 ; CHECK:       ## BB#0:
4071 ; CHECK-NEXT:    andl $1, %edi
4072 ; CHECK-NEXT:    kmovw %edi, %k1
4073 ; CHECK-NEXT:    vmaxsd %xmm1, %xmm0, %xmm2 {%k1}
4074 ; CHECK-NEXT:    vmovaps %zmm2, %zmm0
4075 ; CHECK-NEXT:    retq
4076   %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)
4077   ret <2 x double> %res
4078 }
4079
4080 define <2 x double> @test_maskz_max_sd(<2 x double> %a0, <2 x double> %a1, i8 %mask) {
4081 ; CHECK-LABEL: test_maskz_max_sd:
4082 ; CHECK:       ## BB#0:
4083 ; CHECK-NEXT:    andl $1, %edi
4084 ; CHECK-NEXT:    kmovw %edi, %k1
4085 ; CHECK-NEXT:    vmaxsd %xmm1, %xmm0, %xmm0 {%k1} {z}
4086 ; CHECK-NEXT:    retq
4087   %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)
4088   ret <2 x double> %res
4089 }
4090
4091 define <2 x double> @test_max_sd(<2 x double> %a0, <2 x double> %a1) {
4092 ; CHECK-LABEL: test_max_sd:
4093 ; CHECK:       ## BB#0:
4094 ; CHECK-NEXT:    vmaxsd %xmm1, %xmm0, %xmm0
4095 ; CHECK-NEXT:    retq
4096   %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)
4097   ret <2 x double> %res
4098 }
4099
4100 define <2 x double> @test_x86_avx512_cvtsi2sd32(<2 x double> %a, i32 %b) {
4101 ; CHECK-LABEL: test_x86_avx512_cvtsi2sd32:
4102 ; CHECK:       ## BB#0:
4103 ; CHECK-NEXT:    vcvtsi2sdl %edi, {rz-sae}, %xmm0, %xmm0
4104 ; CHECK-NEXT:    retq
4105   %res = call <2 x double> @llvm.x86.avx512.cvtsi2sd32(<2 x double> %a, i32 %b, i32 3) ; <<<2 x double>> [#uses=1]
4106   ret <2 x double> %res
4107 }
4108 declare <2 x double> @llvm.x86.avx512.cvtsi2sd32(<2 x double>, i32, i32) nounwind readnone
4109
4110 define <2 x double> @test_x86_avx512_cvtsi2sd64(<2 x double> %a, i64 %b) {
4111 ; CHECK-LABEL: test_x86_avx512_cvtsi2sd64:
4112 ; CHECK:       ## BB#0:
4113 ; CHECK-NEXT:    vcvtsi2sdq %rdi, {rz-sae}, %xmm0, %xmm0
4114 ; CHECK-NEXT:    retq
4115   %res = call <2 x double> @llvm.x86.avx512.cvtsi2sd64(<2 x double> %a, i64 %b, i32 3) ; <<<2 x double>> [#uses=1]
4116   ret <2 x double> %res
4117 }
4118 declare <2 x double> @llvm.x86.avx512.cvtsi2sd64(<2 x double>, i64, i32) nounwind readnone
4119
4120 define <4 x float> @test_x86_avx512_cvtsi2ss32(<4 x float> %a, i32 %b) {
4121 ; CHECK-LABEL: test_x86_avx512_cvtsi2ss32:
4122 ; CHECK:       ## BB#0:
4123 ; CHECK-NEXT:    vcvtsi2ssl %edi, {rz-sae}, %xmm0, %xmm0
4124 ; CHECK-NEXT:    retq
4125   %res = call <4 x float> @llvm.x86.avx512.cvtsi2ss32(<4 x float> %a, i32 %b, i32 3) ; <<<4 x float>> [#uses=1]
4126   ret <4 x float> %res
4127 }
4128 declare <4 x float> @llvm.x86.avx512.cvtsi2ss32(<4 x float>, i32, i32) nounwind readnone
4129
4130 define <4 x float> @test_x86_avx512_cvtsi2ss64(<4 x float> %a, i64 %b) {
4131 ; CHECK-LABEL: test_x86_avx512_cvtsi2ss64:
4132 ; CHECK:       ## BB#0:
4133 ; CHECK-NEXT:    vcvtsi2ssq %rdi, {rz-sae}, %xmm0, %xmm0
4134 ; CHECK-NEXT:    retq
4135   %res = call <4 x float> @llvm.x86.avx512.cvtsi2ss64(<4 x float> %a, i64 %b, i32 3) ; <<<4 x float>> [#uses=1]
4136   ret <4 x float> %res
4137 }
4138 declare <4 x float> @llvm.x86.avx512.cvtsi2ss64(<4 x float>, i64, i32) nounwind readnone
4139
4140 define <4 x float> @test_x86_avx512__mm_cvt_roundu32_ss (<4 x float> %a, i32 %b)
4141 ; CHECK-LABEL: test_x86_avx512__mm_cvt_roundu32_ss:
4142 ; CHECK:       ## BB#0:
4143 ; CHECK-NEXT:    vcvtusi2ssl %edi, {rd-sae}, %xmm0, %xmm0
4144 ; CHECK-NEXT:    retq
4145 {
4146   %res = call <4 x float> @llvm.x86.avx512.cvtusi2ss(<4 x float> %a, i32 %b, i32 1) ; <<<4 x float>> [#uses=1]
4147   ret <4 x float> %res
4148 }
4149
4150 define <4 x float> @test_x86_avx512__mm_cvt_roundu32_ss_mem(<4 x float> %a, i32* %ptr)
4151 ; CHECK-LABEL: test_x86_avx512__mm_cvt_roundu32_ss_mem:
4152 ; CHECK:       ## BB#0:
4153 ; CHECK-NEXT:    movl (%rdi), %eax
4154 ; CHECK-NEXT:    vcvtusi2ssl %eax, {rd-sae}, %xmm0, %xmm0
4155 ; CHECK-NEXT:    retq
4156 {
4157   %b = load i32, i32* %ptr
4158   %res = call <4 x float> @llvm.x86.avx512.cvtusi2ss(<4 x float> %a, i32 %b, i32 1) ; <<<4 x float>> [#uses=1]
4159   ret <4 x float> %res
4160 }
4161
4162 define <4 x float> @test_x86_avx512__mm_cvtu32_ss(<4 x float> %a, i32 %b)
4163 ; CHECK-LABEL: test_x86_avx512__mm_cvtu32_ss:
4164 ; CHECK:       ## BB#0:
4165 ; CHECK-NEXT:    vcvtusi2ssl %edi, %xmm0, %xmm0
4166 ; CHECK-NEXT:    retq
4167 {
4168   %res = call <4 x float> @llvm.x86.avx512.cvtusi2ss(<4 x float> %a, i32 %b, i32 4) ; <<<4 x float>> [#uses=1]
4169   ret <4 x float> %res
4170 }
4171
4172 define <4 x float> @test_x86_avx512__mm_cvtu32_ss_mem(<4 x float> %a, i32* %ptr)
4173 ; CHECK-LABEL: test_x86_avx512__mm_cvtu32_ss_mem:
4174 ; CHECK:       ## BB#0:
4175 ; CHECK-NEXT:    vcvtusi2ssl (%rdi), %xmm0, %xmm0
4176 ; CHECK-NEXT:    retq
4177 {
4178   %b = load i32, i32* %ptr
4179   %res = call <4 x float> @llvm.x86.avx512.cvtusi2ss(<4 x float> %a, i32 %b, i32 4) ; <<<4 x float>> [#uses=1]
4180   ret <4 x float> %res
4181 }
4182 declare <4 x float> @llvm.x86.avx512.cvtusi2ss(<4 x float>, i32, i32) nounwind readnone
4183
4184 define <4 x float> @_mm_cvt_roundu64_ss (<4 x float> %a, i64 %b)
4185 ; CHECK-LABEL: _mm_cvt_roundu64_ss:
4186 ; CHECK:       ## BB#0:
4187 ; CHECK-NEXT:    vcvtusi2ssq %rdi, {rd-sae}, %xmm0, %xmm0
4188 ; CHECK-NEXT:    retq
4189 {
4190   %res = call <4 x float> @llvm.x86.avx512.cvtusi642ss(<4 x float> %a, i64 %b, i32 1) ; <<<4 x float>> [#uses=1]
4191   ret <4 x float> %res
4192 }
4193
4194 define <4 x float> @_mm_cvtu64_ss(<4 x float> %a, i64 %b)
4195 ; CHECK-LABEL: _mm_cvtu64_ss:
4196 ; CHECK:       ## BB#0:
4197 ; CHECK-NEXT:    vcvtusi2ssq %rdi, %xmm0, %xmm0
4198 ; CHECK-NEXT:    retq
4199 {
4200   %res = call <4 x float> @llvm.x86.avx512.cvtusi642ss(<4 x float> %a, i64 %b, i32 4) ; <<<4 x float>> [#uses=1]
4201   ret <4 x float> %res
4202 }
4203 declare <4 x float> @llvm.x86.avx512.cvtusi642ss(<4 x float>, i64, i32) nounwind readnone
4204
4205 define <2 x double> @test_x86_avx512_mm_cvtu32_sd(<2 x double> %a, i32 %b)
4206 ; CHECK-LABEL: test_x86_avx512_mm_cvtu32_sd:
4207 ; CHECK:       ## BB#0:
4208 ; CHECK-NEXT:    vcvtusi2sdl %edi, %xmm0, %xmm0
4209 ; CHECK-NEXT:    retq
4210 {
4211   %res = call <2 x double> @llvm.x86.avx512.cvtusi2sd(<2 x double> %a, i32 %b) ; <<<2 x double>> [#uses=1]
4212   ret <2 x double> %res
4213 }
4214 declare <2 x double> @llvm.x86.avx512.cvtusi2sd(<2 x double>, i32) nounwind readnone
4215
4216 define <2 x double> @test_x86_avx512_mm_cvtu64_sd(<2 x double> %a, i64 %b)
4217 ; CHECK-LABEL: test_x86_avx512_mm_cvtu64_sd:
4218 ; CHECK:       ## BB#0:
4219 ; CHECK-NEXT:    vcvtusi2sdq %rdi, {rd-sae}, %xmm0, %xmm0
4220 ; CHECK-NEXT:    retq
4221 {
4222   %res = call <2 x double> @llvm.x86.avx512.cvtusi642sd(<2 x double> %a, i64 %b, i32 1) ; <<<2 x double>> [#uses=1]
4223   ret <2 x double> %res
4224 }
4225
4226 define <2 x double> @test_x86_avx512__mm_cvt_roundu64_sd(<2 x double> %a, i64 %b)
4227 ; CHECK-LABEL: test_x86_avx512__mm_cvt_roundu64_sd:
4228 ; CHECK:       ## BB#0:
4229 ; CHECK-NEXT:    vcvtusi2sdq %rdi, %xmm0, %xmm0
4230 ; CHECK-NEXT:    retq
4231 {
4232   %res = call <2 x double> @llvm.x86.avx512.cvtusi642sd(<2 x double> %a, i64 %b, i32 4) ; <<<2 x double>> [#uses=1]
4233   ret <2 x double> %res
4234 }
4235 declare <2 x double> @llvm.x86.avx512.cvtusi642sd(<2 x double>, i64, i32) nounwind readnone
4236
4237 define <8 x i64> @test_vpmaxq(<8 x i64> %a0, <8 x i64> %a1) {
4238 ; CHECK-LABEL: test_vpmaxq:
4239 ; CHECK:       ## BB#0:
4240 ; CHECK-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
4241 ; CHECK-NEXT:    retq
4242   %res = call <8 x i64> @llvm.x86.avx512.mask.pmaxs.q.512(<8 x i64> %a0, <8 x i64> %a1,
4243                     <8 x i64>zeroinitializer, i8 -1)
4244   ret <8 x i64> %res
4245 }
4246 declare <8 x i64> @llvm.x86.avx512.mask.pmaxs.q.512(<8 x i64>, <8 x i64>, <8 x i64>, i8)
4247
4248 define <16 x i32> @test_vpminud(<16 x i32> %a0, <16 x i32> %a1) {
4249 ; CHECK-LABEL: test_vpminud:
4250 ; CHECK:       ## BB#0:
4251 ; CHECK-NEXT:    vpminud %zmm1, %zmm0, %zmm0
4252 ; CHECK-NEXT:    retq
4253   %res = call <16 x i32> @llvm.x86.avx512.mask.pminu.d.512(<16 x i32> %a0, <16 x i32> %a1,
4254                     <16 x i32>zeroinitializer, i16 -1)
4255   ret <16 x i32> %res
4256 }
4257 declare <16 x i32> @llvm.x86.avx512.mask.pminu.d.512(<16 x i32>, <16 x i32>, <16 x i32>, i16)
4258
4259 define <16 x i32> @test_vpmaxsd(<16 x i32> %a0, <16 x i32> %a1) {
4260 ; CHECK-LABEL: test_vpmaxsd:
4261 ; CHECK:       ## BB#0:
4262 ; CHECK-NEXT:    vpmaxsd %zmm1, %zmm0, %zmm0
4263 ; CHECK-NEXT:    retq
4264   %res = call <16 x i32> @llvm.x86.avx512.mask.pmaxs.d.512(<16 x i32> %a0, <16 x i32> %a1,
4265                     <16 x i32>zeroinitializer, i16 -1)
4266   ret <16 x i32> %res
4267 }
4268 declare <16 x i32> @llvm.x86.avx512.mask.pmaxs.d.512(<16 x i32>, <16 x i32>, <16 x i32>, i16)
4269
4270 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) {
4271 ; CHECK-LABEL: test_int_x86_avx512_mask_pmaxs_d_512:
4272 ; CHECK:       ## BB#0:
4273 ; CHECK-NEXT:    kmovw %edi, %k1
4274 ; CHECK-NEXT:    vpmaxsd %zmm1, %zmm0, %zmm2 {%k1}
4275 ; CHECK-NEXT:    vpmaxsd %zmm1, %zmm0, %zmm0
4276 ; CHECK-NEXT:    vpaddd %zmm0, %zmm2, %zmm0
4277 ; CHECK-NEXT:    retq
4278   %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)
4279   %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)
4280   %res2 = add <16 x i32> %res, %res1
4281   ret <16 x i32> %res2
4282 }
4283
4284 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) {
4285 ; CHECK-LABEL: test_int_x86_avx512_mask_pmaxs_q_512:
4286 ; CHECK:       ## BB#0:
4287 ; CHECK-NEXT:    movzbl %dil, %eax
4288 ; CHECK-NEXT:    kmovw %eax, %k1
4289 ; CHECK-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm2 {%k1}
4290 ; CHECK-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
4291 ; CHECK-NEXT:    vpaddq %zmm0, %zmm2, %zmm0
4292 ; CHECK-NEXT:    retq
4293   %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)
4294   %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)
4295   %res2 = add <8 x i64> %res, %res1
4296   ret <8 x i64> %res2
4297 }
4298
4299 declare <16 x i32> @llvm.x86.avx512.mask.pmaxu.d.512(<16 x i32>, <16 x i32>, <16 x i32>, i16)
4300
4301 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) {
4302 ; CHECK-LABEL: test_int_x86_avx512_mask_pmaxu_d_512:
4303 ; CHECK:       ## BB#0:
4304 ; CHECK-NEXT:    kmovw %edi, %k1
4305 ; CHECK-NEXT:    vpmaxud %zmm1, %zmm0, %zmm2 {%k1}
4306 ; CHECK-NEXT:    vpmaxud %zmm1, %zmm0, %zmm0
4307 ; CHECK-NEXT:    vpaddd %zmm0, %zmm2, %zmm0
4308 ; CHECK-NEXT:    retq
4309   %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)
4310   %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)
4311   %res2 = add <16 x i32> %res, %res1
4312   ret <16 x i32> %res2
4313 }
4314
4315 declare <8 x i64> @llvm.x86.avx512.mask.pmaxu.q.512(<8 x i64>, <8 x i64>, <8 x i64>, i8)
4316
4317 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) {
4318 ; CHECK-LABEL: test_int_x86_avx512_mask_pmaxu_q_512:
4319 ; CHECK:       ## BB#0:
4320 ; CHECK-NEXT:    movzbl %dil, %eax
4321 ; CHECK-NEXT:    kmovw %eax, %k1
4322 ; CHECK-NEXT:    vpmaxuq %zmm1, %zmm0, %zmm2 {%k1}
4323 ; CHECK-NEXT:    vpmaxuq %zmm1, %zmm0, %zmm0
4324 ; CHECK-NEXT:    vpaddq %zmm0, %zmm2, %zmm0
4325 ; CHECK-NEXT:    retq
4326   %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)
4327   %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)
4328   %res2 = add <8 x i64> %res, %res1
4329   ret <8 x i64> %res2
4330 }
4331
4332 declare <16 x i32> @llvm.x86.avx512.mask.pmins.d.512(<16 x i32>, <16 x i32>, <16 x i32>, i16)
4333
4334 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) {
4335 ; CHECK-LABEL: test_int_x86_avx512_mask_pmins_d_512:
4336 ; CHECK:       ## BB#0:
4337 ; CHECK-NEXT:    kmovw %edi, %k1
4338 ; CHECK-NEXT:    vpminsd %zmm1, %zmm0, %zmm2 {%k1}
4339 ; CHECK-NEXT:    vpminsd %zmm1, %zmm0, %zmm0
4340 ; CHECK-NEXT:    vpaddd %zmm0, %zmm2, %zmm0
4341 ; CHECK-NEXT:    retq
4342   %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)
4343   %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)
4344   %res2 = add <16 x i32> %res, %res1
4345   ret <16 x i32> %res2
4346 }
4347
4348 declare <8 x i64> @llvm.x86.avx512.mask.pmins.q.512(<8 x i64>, <8 x i64>, <8 x i64>, i8)
4349
4350 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) {
4351 ; CHECK-LABEL: test_int_x86_avx512_mask_pmins_q_512:
4352 ; CHECK:       ## BB#0:
4353 ; CHECK-NEXT:    movzbl %dil, %eax
4354 ; CHECK-NEXT:    kmovw %eax, %k1
4355 ; CHECK-NEXT:    vpminsq %zmm1, %zmm0, %zmm2 {%k1}
4356 ; CHECK-NEXT:    vpminsq %zmm1, %zmm0, %zmm0
4357 ; CHECK-NEXT:    vpaddq %zmm0, %zmm2, %zmm0
4358 ; CHECK-NEXT:    retq
4359   %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)
4360   %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)
4361   %res2 = add <8 x i64> %res, %res1
4362   ret <8 x i64> %res2
4363 }
4364
4365 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) {
4366 ; CHECK-LABEL: test_int_x86_avx512_mask_pminu_d_512:
4367 ; CHECK:       ## BB#0:
4368 ; CHECK-NEXT:    kmovw %edi, %k1
4369 ; CHECK-NEXT:    vpminud %zmm1, %zmm0, %zmm2 {%k1}
4370 ; CHECK-NEXT:    vpminud %zmm1, %zmm0, %zmm0
4371 ; CHECK-NEXT:    vpaddd %zmm0, %zmm2, %zmm0
4372 ; CHECK-NEXT:    retq
4373   %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)
4374   %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)
4375   %res2 = add <16 x i32> %res, %res1
4376   ret <16 x i32> %res2
4377 }
4378
4379 declare <8 x i64> @llvm.x86.avx512.mask.pminu.q.512(<8 x i64>, <8 x i64>, <8 x i64>, i8)
4380
4381 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) {
4382 ; CHECK-LABEL: test_int_x86_avx512_mask_pminu_q_512:
4383 ; CHECK:       ## BB#0:
4384 ; CHECK-NEXT:    movzbl %dil, %eax
4385 ; CHECK-NEXT:    kmovw %eax, %k1
4386 ; CHECK-NEXT:    vpminuq %zmm1, %zmm0, %zmm2 {%k1}
4387 ; CHECK-NEXT:    vpminuq %zmm1, %zmm0, %zmm0
4388 ; CHECK-NEXT:    vpaddq %zmm0, %zmm2, %zmm0
4389 ; CHECK-NEXT:    retq
4390   %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)
4391   %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)
4392   %res2 = add <8 x i64> %res, %res1
4393   ret <8 x i64> %res2
4394 }
4395
4396 declare <16 x i32> @llvm.x86.avx512.mask.vpermi2var.d.512(<16 x i32>, <16 x i32>, <16 x i32>, i16)
4397
4398 define <16 x i32>@test_int_x86_avx512_mask_vpermi2var_d_512(<16 x i32> %x0, <16 x i32> %x1, <16 x i32>* %x2p, <16 x i32> %x4, i16 %x3) {
4399 ; CHECK-LABEL: test_int_x86_avx512_mask_vpermi2var_d_512:
4400 ; CHECK:       ## BB#0:
4401 ; CHECK-NEXT:    kmovw %esi, %k1
4402 ; CHECK-NEXT:    vmovaps %zmm1, %zmm3
4403 ; CHECK-NEXT:    vpermi2d (%rdi), %zmm0, %zmm3 {%k1}
4404 ; CHECK-NEXT:    vpermi2d %zmm2, %zmm0, %zmm1
4405 ; CHECK-NEXT:    vpaddd %zmm1, %zmm3, %zmm0
4406 ; CHECK-NEXT:    retq
4407   %x2 = load <16 x i32>, <16 x i32>* %x2p
4408   %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)
4409   %res1 = call <16 x i32> @llvm.x86.avx512.mask.vpermi2var.d.512(<16 x i32> %x0, <16 x i32> %x1, <16 x i32> %x4, i16 -1)
4410   %res2 = add <16 x i32> %res, %res1
4411   ret <16 x i32> %res2
4412 }
4413
4414 declare <8 x double> @llvm.x86.avx512.mask.vpermi2var.pd.512(<8 x double>, <8 x i64>, <8 x double>, i8)
4415
4416 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) {
4417 ; CHECK-LABEL: test_int_x86_avx512_mask_vpermi2var_pd_512:
4418 ; CHECK:       ## BB#0:
4419 ; CHECK-NEXT:    movzbl %dil, %eax
4420 ; CHECK-NEXT:    kmovw %eax, %k1
4421 ; CHECK-NEXT:    vmovaps %zmm1, %zmm3
4422 ; CHECK-NEXT:    vpermi2pd %zmm2, %zmm0, %zmm3 {%k1}
4423 ; CHECK-NEXT:    vpermi2pd %zmm2, %zmm0, %zmm1
4424 ; CHECK-NEXT:    vaddpd %zmm1, %zmm3, %zmm0
4425 ; CHECK-NEXT:    retq
4426   %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)
4427   %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)
4428   %res2 = fadd <8 x double> %res, %res1
4429   ret <8 x double> %res2
4430 }
4431
4432 declare <16 x float> @llvm.x86.avx512.mask.vpermi2var.ps.512(<16 x float>, <16 x i32>, <16 x float>, i16)
4433
4434 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) {
4435 ; CHECK-LABEL: test_int_x86_avx512_mask_vpermi2var_ps_512:
4436 ; CHECK:       ## BB#0:
4437 ; CHECK-NEXT:    kmovw %edi, %k1
4438 ; CHECK-NEXT:    vmovaps %zmm1, %zmm3
4439 ; CHECK-NEXT:    vpermi2ps %zmm2, %zmm0, %zmm3 {%k1}
4440 ; CHECK-NEXT:    vpermi2ps %zmm2, %zmm0, %zmm1
4441 ; CHECK-NEXT:    vaddps %zmm1, %zmm3, %zmm0
4442 ; CHECK-NEXT:    retq
4443   %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)
4444   %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)
4445   %res2 = fadd <16 x float> %res, %res1
4446   ret <16 x float> %res2
4447 }
4448
4449 declare <8 x i64> @llvm.x86.avx512.mask.vpermi2var.q.512(<8 x i64>, <8 x i64>, <8 x i64>, i8)
4450
4451 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) {
4452 ; CHECK-LABEL: test_int_x86_avx512_mask_vpermi2var_q_512:
4453 ; CHECK:       ## BB#0:
4454 ; CHECK-NEXT:    movzbl %dil, %eax
4455 ; CHECK-NEXT:    kmovw %eax, %k1
4456 ; CHECK-NEXT:    vmovaps %zmm1, %zmm3
4457 ; CHECK-NEXT:    vpermi2q %zmm2, %zmm0, %zmm3 {%k1}
4458 ; CHECK-NEXT:    vpermi2q %zmm2, %zmm0, %zmm1
4459 ; CHECK-NEXT:    vpaddq %zmm1, %zmm3, %zmm0
4460 ; CHECK-NEXT:    retq
4461   %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)
4462   %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)
4463   %res2 = add <8 x i64> %res, %res1
4464   ret <8 x i64> %res2
4465 }
4466
4467 declare <16 x i32> @llvm.x86.avx512.maskz.vpermt2var.d.512(<16 x i32>, <16 x i32>, <16 x i32>, i16)
4468
4469 define <16 x i32>@test_int_x86_avx512_maskz_vpermt2var_d_512(<16 x i32> %x0, <16 x i32> %x1, <16 x i32>* %x2p, i16 %x3) {
4470 ; CHECK-LABEL: test_int_x86_avx512_maskz_vpermt2var_d_512:
4471 ; CHECK:       ## BB#0:
4472 ; CHECK-NEXT:    kmovw %esi, %k1
4473 ; CHECK-NEXT:    vmovaps %zmm1, %zmm2
4474 ; CHECK-NEXT:    vpermt2d (%rdi), %zmm0, %zmm2 {%k1} {z}
4475 ; CHECK-NEXT:    vpermt2d %zmm1, %zmm0, %zmm1
4476 ; CHECK-NEXT:    vpaddd %zmm1, %zmm2, %zmm0
4477 ; CHECK-NEXT:    retq
4478   %x2 = load <16 x i32>, <16 x i32>* %x2p
4479   %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)
4480   %res1 = call <16 x i32> @llvm.x86.avx512.maskz.vpermt2var.d.512(<16 x i32> %x0, <16 x i32> %x1, <16 x i32> %x1, i16 -1)
4481   %res2 = add <16 x i32> %res, %res1
4482   ret <16 x i32> %res2
4483 }
4484
4485 declare <8 x double> @llvm.x86.avx512.maskz.vpermt2var.pd.512(<8 x i64>, <8 x double>, <8 x double>, i8)
4486
4487 define <8 x double>@test_int_x86_avx512_maskz_vpermt2var_pd_512(<8 x i64> %x0, <8 x double> %x1, double* %x2ptr, i8 %x3) {
4488 ; CHECK-LABEL: test_int_x86_avx512_maskz_vpermt2var_pd_512:
4489 ; CHECK:       ## BB#0:
4490 ; CHECK-NEXT:    movzbl %sil, %eax
4491 ; CHECK-NEXT:    kmovw %eax, %k1
4492 ; CHECK-NEXT:    vmovaps %zmm1, %zmm2
4493 ; CHECK-NEXT:    vpermt2pd (%rdi){1to8}, %zmm0, %zmm2 {%k1} {z}
4494 ; CHECK-NEXT:    vpermt2pd %zmm1, %zmm0, %zmm1
4495 ; CHECK-NEXT:    vaddpd %zmm1, %zmm2, %zmm0
4496 ; CHECK-NEXT:    retq
4497   %x2s = load double, double* %x2ptr
4498   %x2ins = insertelement <8 x double> undef, double %x2s, i32 0
4499   %x2 = shufflevector <8 x double> %x2ins, <8 x double> undef, <8 x i32> zeroinitializer
4500   %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)
4501   %res1 = call <8 x double> @llvm.x86.avx512.maskz.vpermt2var.pd.512(<8 x i64> %x0, <8 x double> %x1, <8 x double> %x1, i8 -1)
4502   %res2 = fadd <8 x double> %res, %res1
4503   ret <8 x double> %res2
4504 }
4505
4506 declare <16 x float> @llvm.x86.avx512.maskz.vpermt2var.ps.512(<16 x i32>, <16 x float>, <16 x float>, i16)
4507
4508 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) {
4509 ; CHECK-LABEL: test_int_x86_avx512_maskz_vpermt2var_ps_512:
4510 ; CHECK:       ## BB#0:
4511 ; CHECK-NEXT:    kmovw %edi, %k1
4512 ; CHECK-NEXT:    vmovaps %zmm1, %zmm3
4513 ; CHECK-NEXT:    vpermt2ps %zmm2, %zmm0, %zmm3 {%k1} {z}
4514 ; CHECK-NEXT:    vpermt2ps %zmm2, %zmm0, %zmm1
4515 ; CHECK-NEXT:    vaddps %zmm1, %zmm3, %zmm0
4516 ; CHECK-NEXT:    retq
4517   %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)
4518   %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)
4519   %res2 = fadd <16 x float> %res, %res1
4520   ret <16 x float> %res2
4521 }
4522
4523
4524 declare <8 x i64> @llvm.x86.avx512.maskz.vpermt2var.q.512(<8 x i64>, <8 x i64>, <8 x i64>, i8)
4525
4526 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) {
4527 ; CHECK-LABEL: test_int_x86_avx512_maskz_vpermt2var_q_512:
4528 ; CHECK:       ## BB#0:
4529 ; CHECK-NEXT:    movzbl %dil, %eax
4530 ; CHECK-NEXT:    kmovw %eax, %k1
4531 ; CHECK-NEXT:    vmovaps %zmm1, %zmm3
4532 ; CHECK-NEXT:    vpermt2q %zmm2, %zmm0, %zmm3 {%k1} {z}
4533 ; CHECK-NEXT:    vpermt2q %zmm2, %zmm0, %zmm1
4534 ; CHECK-NEXT:    vpaddq %zmm1, %zmm3, %zmm0
4535 ; CHECK-NEXT:    retq
4536   %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)
4537   %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)
4538   %res2 = add <8 x i64> %res, %res1
4539   ret <8 x i64> %res2
4540 }
4541
4542 declare <16 x i32> @llvm.x86.avx512.mask.vpermt2var.d.512(<16 x i32>, <16 x i32>, <16 x i32>, i16)
4543
4544 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) {
4545 ; CHECK-LABEL: test_int_x86_avx512_mask_vpermt2var_d_512:
4546 ; CHECK:       ## BB#0:
4547 ; CHECK-NEXT:    kmovw %edi, %k1
4548 ; CHECK-NEXT:    vmovaps %zmm1, %zmm3
4549 ; CHECK-NEXT:    vpermt2d %zmm2, %zmm0, %zmm3 {%k1}
4550 ; CHECK-NEXT:    vpermt2d %zmm2, %zmm0, %zmm1
4551 ; CHECK-NEXT:    vpaddd %zmm1, %zmm3, %zmm0
4552 ; CHECK-NEXT:    retq
4553   %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)
4554   %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)
4555   %res2 = add <16 x i32> %res, %res1
4556   ret <16 x i32> %res2
4557 }
4558
4559 declare <8 x double> @llvm.x86.avx512.mask.scalef.pd.512(<8 x double>, <8 x double>, <8 x double>, i8, i32)
4560 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) {
4561 ; CHECK-LABEL: test_int_x86_avx512_mask_scalef_pd_512:
4562 ; CHECK:       ## BB#0:
4563 ; CHECK-NEXT:    movzbl %dil, %eax
4564 ; CHECK-NEXT:    kmovw %eax, %k1
4565 ; CHECK-NEXT:    vscalefpd {rz-sae}, %zmm1, %zmm0, %zmm2 {%k1}
4566 ; CHECK-NEXT:    vscalefpd {rn-sae}, %zmm1, %zmm0, %zmm0
4567 ; CHECK-NEXT:    vaddpd %zmm0, %zmm2, %zmm0
4568 ; CHECK-NEXT:    retq
4569   %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)
4570   %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)
4571   %res2 = fadd <8 x double> %res, %res1
4572   ret <8 x double> %res2
4573 }
4574
4575 declare <16 x float> @llvm.x86.avx512.mask.scalef.ps.512(<16 x float>, <16 x float>, <16 x float>, i16, i32)
4576 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) {
4577 ; CHECK-LABEL: test_int_x86_avx512_mask_scalef_ps_512:
4578 ; CHECK:       ## BB#0:
4579 ; CHECK-NEXT:    kmovw %edi, %k1
4580 ; CHECK-NEXT:    vscalefps {ru-sae}, %zmm1, %zmm0, %zmm2 {%k1}
4581 ; CHECK-NEXT:    vscalefps {rn-sae}, %zmm1, %zmm0, %zmm0
4582 ; CHECK-NEXT:    vaddps %zmm0, %zmm2, %zmm0
4583 ; CHECK-NEXT:    retq
4584   %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)
4585   %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)
4586   %res2 = fadd <16 x float> %res, %res1
4587   ret <16 x float> %res2
4588 }
4589
4590 declare <8 x double> @llvm.x86.avx512.mask.unpckh.pd.512(<8 x double>, <8 x double>, <8 x double>, i8)
4591
4592 define <8 x double>@test_int_x86_avx512_mask_unpckh_pd_512(<8 x double> %x0, <8 x double> %x1, <8 x double> %x2, i8 %x3) {
4593 ; CHECK-LABEL: test_int_x86_avx512_mask_unpckh_pd_512:
4594 ; CHECK:       ## BB#0:
4595 ; CHECK-NEXT:    movzbl %dil, %eax
4596 ; CHECK-NEXT:    kmovw %eax, %k1
4597 ; CHECK-NEXT:    vunpckhpd {{.*#+}} zmm2 = zmm2[1],k1[1],zmm2[3],k1[3],zmm2[5],k1[5],zmm2[7],k1[7]
4598 ; CHECK-NEXT:    vunpckhpd {{.*#+}} zmm0 = zmm0[1],zmm1[1],zmm0[3],zmm1[3],zmm0[5],zmm1[5],zmm0[7],zmm1[7]
4599 ; CHECK-NEXT:    vaddpd %zmm0, %zmm2, %zmm0
4600 ; CHECK-NEXT:    retq
4601   %res = call <8 x double> @llvm.x86.avx512.mask.unpckh.pd.512(<8 x double> %x0, <8 x double> %x1, <8 x double> %x2, i8 %x3)
4602   %res1 = call <8 x double> @llvm.x86.avx512.mask.unpckh.pd.512(<8 x double> %x0, <8 x double> %x1, <8 x double> %x2, i8 -1)
4603   %res2 = fadd <8 x double> %res, %res1
4604   ret <8 x double> %res2
4605 }
4606
4607 declare <16 x float> @llvm.x86.avx512.mask.unpckh.ps.512(<16 x float>, <16 x float>, <16 x float>, i16)
4608
4609 define <16 x float>@test_int_x86_avx512_mask_unpckh_ps_512(<16 x float> %x0, <16 x float> %x1, <16 x float> %x2, i16 %x3) {
4610 ; CHECK-LABEL: test_int_x86_avx512_mask_unpckh_ps_512:
4611 ; CHECK:       ## BB#0:
4612 ; CHECK-NEXT:    kmovw %edi, %k1
4613 ; CHECK-NEXT:    vunpckhps {{.*#+}} zmm2 = zmm2[2],k1[2],zmm2[3],k1[3],zmm2[6],k1[6],zmm2[7],k1[7],zmm2[10],k1[10],zmm2[11],k1[11],zmm2[14],k1[14],zmm2[15],k1[15]
4614 ; CHECK-NEXT:    vunpckhps {{.*#+}} zmm0 = zmm0[2],zmm1[2],zmm0[3],zmm1[3],zmm0[6],zmm1[6],zmm0[7],zmm1[7],zmm0[10],zmm1[10],zmm0[11],zmm1[11],zmm0[14],zmm1[14],zmm0[15],zmm1[15]
4615 ; CHECK-NEXT:    vaddps %zmm0, %zmm2, %zmm0
4616 ; CHECK-NEXT:    retq
4617   %res = call <16 x float> @llvm.x86.avx512.mask.unpckh.ps.512(<16 x float> %x0, <16 x float> %x1, <16 x float> %x2, i16 %x3)
4618   %res1 = call <16 x float> @llvm.x86.avx512.mask.unpckh.ps.512(<16 x float> %x0, <16 x float> %x1, <16 x float> %x2, i16 -1)
4619   %res2 = fadd <16 x float> %res, %res1
4620   ret <16 x float> %res2
4621 }
4622
4623 declare <8 x double> @llvm.x86.avx512.mask.unpckl.pd.512(<8 x double>, <8 x double>, <8 x double>, i8)
4624
4625 define <8 x double>@test_int_x86_avx512_mask_unpckl_pd_512(<8 x double> %x0, <8 x double> %x1, <8 x double> %x2, i8 %x3) {
4626 ; CHECK-LABEL: test_int_x86_avx512_mask_unpckl_pd_512:
4627 ; CHECK:       ## BB#0:
4628 ; CHECK-NEXT:    movzbl %dil, %eax
4629 ; CHECK-NEXT:    kmovw %eax, %k1
4630 ; CHECK-NEXT:    vunpcklpd {{.*#+}} zmm2 = zmm2[0],k1[0],zmm2[2],k1[2],zmm2[4],k1[4],zmm2[6],k1[6]
4631 ; CHECK-NEXT:    vunpcklpd {{.*#+}} zmm0 = zmm0[0],zmm1[0],zmm0[2],zmm1[2],zmm0[4],zmm1[4],zmm0[6],zmm1[6]
4632 ; CHECK-NEXT:    vaddpd %zmm0, %zmm2, %zmm0
4633 ; CHECK-NEXT:    retq
4634   %res = call <8 x double> @llvm.x86.avx512.mask.unpckl.pd.512(<8 x double> %x0, <8 x double> %x1, <8 x double> %x2, i8 %x3)
4635   %res1 = call <8 x double> @llvm.x86.avx512.mask.unpckl.pd.512(<8 x double> %x0, <8 x double> %x1, <8 x double> %x2, i8 -1)
4636   %res2 = fadd <8 x double> %res, %res1
4637   ret <8 x double> %res2
4638 }
4639
4640 declare <16 x float> @llvm.x86.avx512.mask.unpckl.ps.512(<16 x float>, <16 x float>, <16 x float>, i16)
4641
4642 define <16 x float>@test_int_x86_avx512_mask_unpckl_ps_512(<16 x float> %x0, <16 x float> %x1, <16 x float> %x2, i16 %x3) {
4643 ; CHECK-LABEL: test_int_x86_avx512_mask_unpckl_ps_512:
4644 ; CHECK:       ## BB#0:
4645 ; CHECK-NEXT:    kmovw %edi, %k1
4646 ; CHECK-NEXT:    vunpcklps {{.*#+}} zmm2 = zmm2[0],k1[0],zmm2[1],k1[1],zmm2[4],k1[4],zmm2[5],k1[5],zmm2[8],k1[8],zmm2[9],k1[9],zmm2[12],k1[12],zmm2[13],k1[13]
4647 ; CHECK-NEXT:    vunpcklps {{.*#+}} zmm0 = zmm0[0],zmm1[0],zmm0[1],zmm1[1],zmm0[4],zmm1[4],zmm0[5],zmm1[5],zmm0[8],zmm1[8],zmm0[9],zmm1[9],zmm0[12],zmm1[12],zmm0[13],zmm1[13]
4648 ; CHECK-NEXT:    vaddps %zmm0, %zmm2, %zmm0
4649 ; CHECK-NEXT:    retq
4650   %res = call <16 x float> @llvm.x86.avx512.mask.unpckl.ps.512(<16 x float> %x0, <16 x float> %x1, <16 x float> %x2, i16 %x3)
4651   %res1 = call <16 x float> @llvm.x86.avx512.mask.unpckl.ps.512(<16 x float> %x0, <16 x float> %x1, <16 x float> %x2, i16 -1)
4652   %res2 = fadd <16 x float> %res, %res1
4653   ret <16 x float> %res2
4654 }
4655
4656 declare <8 x i64> @llvm.x86.avx512.mask.punpcklqd.q.512(<8 x i64>, <8 x i64>, <8 x i64>, i8)
4657
4658 define <8 x i64>@test_int_x86_avx512_mask_punpcklqd_q_512(<8 x i64> %x0, <8 x i64> %x1, <8 x i64> %x2, i8 %x3) {
4659 ; CHECK-LABEL: test_int_x86_avx512_mask_punpcklqd_q_512:
4660 ; CHECK:       ## BB#0:
4661 ; CHECK-NEXT:    movzbl %dil, %eax
4662 ; CHECK-NEXT:    kmovw %eax, %k1
4663 ; CHECK-NEXT:    vpunpcklqdq {{.*#+}} zmm2 = zmm2[0],k1[0],zmm2[2],k1[2],zmm2[4],k1[4],zmm2[6],k1[6]
4664 ; CHECK-NEXT:    vpunpcklqdq {{.*#+}} zmm3 = k1[0],zmm0[0],k1[2],zmm0[2],k1[4],zmm0[4],k1[6],zmm0[6]
4665 ; CHECK-NEXT:    vpunpcklqdq {{.*#+}} zmm0 = zmm0[0],zmm1[0],zmm0[2],zmm1[2],zmm0[4],zmm1[4],zmm0[6],zmm1[6]
4666 ; CHECK-NEXT:    vpaddq %zmm0, %zmm2, %zmm0
4667 ; CHECK-NEXT:    vpaddq %zmm0, %zmm3, %zmm0
4668 ; CHECK-NEXT:    retq
4669   %res = call <8 x i64> @llvm.x86.avx512.mask.punpcklqd.q.512(<8 x i64> %x0, <8 x i64> %x1, <8 x i64> %x2, i8 %x3)
4670   %res1 = call <8 x i64> @llvm.x86.avx512.mask.punpcklqd.q.512(<8 x i64> %x0, <8 x i64> %x1, <8 x i64> %x2, i8 -1)
4671   %res2 = call <8 x i64> @llvm.x86.avx512.mask.punpcklqd.q.512(<8 x i64> %x0, <8 x i64> %x1, <8 x i64> zeroinitializer,i8 %x3)
4672   %res3 = add <8 x i64> %res, %res1
4673   %res4 = add <8 x i64> %res2, %res3
4674   ret <8 x i64> %res4
4675 }
4676
4677 declare <8 x i64> @llvm.x86.avx512.mask.punpckhqd.q.512(<8 x i64>, <8 x i64>, <8 x i64>, i8)
4678
4679 define <8 x i64>@test_int_x86_avx512_mask_punpckhqd_q_512(<8 x i64> %x0, <8 x i64> %x1, <8 x i64> %x2, i8 %x3) {
4680 ; CHECK-LABEL: test_int_x86_avx512_mask_punpckhqd_q_512:
4681 ; CHECK:       ## BB#0:
4682 ; CHECK-NEXT:    movzbl %dil, %eax
4683 ; CHECK-NEXT:    kmovw %eax, %k1
4684 ; CHECK-NEXT:    vpunpckhqdq {{.*#+}} zmm2 = zmm2[1],k1[1],zmm2[3],k1[3],zmm2[5],k1[5],zmm2[7],k1[7]
4685 ; CHECK-NEXT:    vpunpckhqdq {{.*#+}} zmm0 = zmm0[1],zmm1[1],zmm0[3],zmm1[3],zmm0[5],zmm1[5],zmm0[7],zmm1[7]
4686 ; CHECK-NEXT:    vpaddq %zmm0, %zmm2, %zmm0
4687 ; CHECK-NEXT:    retq
4688   %res = call <8 x i64> @llvm.x86.avx512.mask.punpckhqd.q.512(<8 x i64> %x0, <8 x i64> %x1, <8 x i64> %x2, i8 %x3)
4689   %res1 = call <8 x i64> @llvm.x86.avx512.mask.punpckhqd.q.512(<8 x i64> %x0, <8 x i64> %x1, <8 x i64> %x2, i8 -1)
4690   %res2 = add <8 x i64> %res, %res1
4691   ret <8 x i64> %res2
4692 }
4693
4694 declare <16 x i32> @llvm.x86.avx512.mask.punpckhd.q.512(<16 x i32>, <16 x i32>, <16 x i32>, i16)
4695
4696 define <16 x i32>@test_int_x86_avx512_mask_punpckhd_q_512(<16 x i32> %x0, <16 x i32> %x1, <16 x i32> %x2, i16 %x3) {
4697 ; CHECK-LABEL: test_int_x86_avx512_mask_punpckhd_q_512:
4698 ; CHECK:       ## BB#0:
4699 ; CHECK-NEXT:    kmovw %edi, %k1
4700 ; CHECK-NEXT:    vpunpckhdq {{.*#+}} zmm2 = zmm2[2],k1[2],zmm2[3],k1[3],zmm2[6],k1[6],zmm2[7],k1[7],zmm2[10],k1[10],zmm2[11],k1[11],zmm2[14],k1[14],zmm2[15],k1[15]
4701 ; CHECK-NEXT:    vpunpckhdq {{.*#+}} zmm0 = zmm0[2],zmm1[2],zmm0[3],zmm1[3],zmm0[6],zmm1[6],zmm0[7],zmm1[7],zmm0[10],zmm1[10],zmm0[11],zmm1[11],zmm0[14],zmm1[14],zmm0[15],zmm1[15]
4702 ; CHECK-NEXT:    vpaddd %zmm0, %zmm2, %zmm0
4703 ; CHECK-NEXT:    retq
4704   %res = call <16 x i32> @llvm.x86.avx512.mask.punpckhd.q.512(<16 x i32> %x0, <16 x i32> %x1, <16 x i32> %x2, i16 %x3)
4705   %res1 = call <16 x i32> @llvm.x86.avx512.mask.punpckhd.q.512(<16 x i32> %x0, <16 x i32> %x1, <16 x i32> %x2, i16 -1)
4706   %res2 = add <16 x i32> %res, %res1
4707   ret <16 x i32> %res2
4708 }
4709
4710 declare <16 x i32> @llvm.x86.avx512.mask.punpckld.q.512(<16 x i32>, <16 x i32>, <16 x i32>, i16)
4711
4712 define <16 x i32>@test_int_x86_avx512_mask_punpckld_q_512(<16 x i32> %x0, <16 x i32> %x1, <16 x i32> %x2, i16 %x3) {
4713 ; CHECK-LABEL: test_int_x86_avx512_mask_punpckld_q_512:
4714 ; CHECK:       ## BB#0:
4715 ; CHECK-NEXT:    kmovw %edi, %k1
4716 ; CHECK-NEXT:    vpunpckldq {{.*#+}} zmm2 = zmm2[0],k1[0],zmm2[1],k1[1],zmm2[4],k1[4],zmm2[5],k1[5],zmm2[8],k1[8],zmm2[9],k1[9],zmm2[12],k1[12],zmm2[13],k1[13]
4717 ; CHECK-NEXT:    vpunpckldq {{.*#+}} zmm0 = zmm0[0],zmm1[0],zmm0[1],zmm1[1],zmm0[4],zmm1[4],zmm0[5],zmm1[5],zmm0[8],zmm1[8],zmm0[9],zmm1[9],zmm0[12],zmm1[12],zmm0[13],zmm1[13]
4718 ; CHECK-NEXT:    vpaddd %zmm0, %zmm2, %zmm0
4719 ; CHECK-NEXT:    retq
4720   %res = call <16 x i32> @llvm.x86.avx512.mask.punpckld.q.512(<16 x i32> %x0, <16 x i32> %x1, <16 x i32> %x2, i16 %x3)
4721   %res1 = call <16 x i32> @llvm.x86.avx512.mask.punpckld.q.512(<16 x i32> %x0, <16 x i32> %x1, <16 x i32> %x2, i16 -1)
4722   %res2 = add <16 x i32> %res, %res1
4723   ret <16 x i32> %res2
4724 }
4725
4726 declare <16 x i8> @llvm.x86.avx512.mask.pmov.qb.512(<8 x i64>, <16 x i8>, i8)
4727
4728 define <16 x i8>@test_int_x86_avx512_mask_pmov_qb_512(<8 x i64> %x0, <16 x i8> %x1, i8 %x2) {
4729 ; CHECK-LABEL: test_int_x86_avx512_mask_pmov_qb_512:
4730 ; CHECK:       ## BB#0:
4731 ; CHECK-NEXT:    kmovw %edi, %k1
4732 ; CHECK-NEXT:    vpmovqb %zmm0, %xmm1 {%k1}
4733 ; CHECK-NEXT:    vpmovqb %zmm0, %xmm2 {%k1} {z}
4734 ; CHECK-NEXT:    vpmovqb %zmm0, %xmm0
4735 ; CHECK-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
4736 ; CHECK-NEXT:    vpaddb %xmm2, %xmm0, %xmm0
4737 ; CHECK-NEXT:    retq
4738     %res0 = call <16 x i8> @llvm.x86.avx512.mask.pmov.qb.512(<8 x i64> %x0, <16 x i8> %x1, i8 -1)
4739     %res1 = call <16 x i8> @llvm.x86.avx512.mask.pmov.qb.512(<8 x i64> %x0, <16 x i8> %x1, i8 %x2)
4740     %res2 = call <16 x i8> @llvm.x86.avx512.mask.pmov.qb.512(<8 x i64> %x0, <16 x i8> zeroinitializer, i8 %x2)
4741     %res3 = add <16 x i8> %res0, %res1
4742     %res4 = add <16 x i8> %res3, %res2
4743     ret <16 x i8> %res4
4744 }
4745
4746 declare void @llvm.x86.avx512.mask.pmov.qb.mem.512(i8* %ptr, <8 x i64>, i8)
4747
4748 define void @test_int_x86_avx512_mask_pmov_qb_mem_512(i8* %ptr, <8 x i64> %x1, i8 %x2) {
4749 ; CHECK-LABEL: test_int_x86_avx512_mask_pmov_qb_mem_512:
4750 ; CHECK:       ## BB#0:
4751 ; CHECK-NEXT:    movzbl %sil, %eax
4752 ; CHECK-NEXT:    kmovw %eax, %k1
4753 ; CHECK-NEXT:    vpmovqb %zmm0, (%rdi)
4754 ; CHECK-NEXT:    vpmovqb %zmm0, (%rdi) {%k1}
4755 ; CHECK-NEXT:    retq
4756     call void @llvm.x86.avx512.mask.pmov.qb.mem.512(i8* %ptr, <8 x i64> %x1, i8 -1)
4757     call void @llvm.x86.avx512.mask.pmov.qb.mem.512(i8* %ptr, <8 x i64> %x1, i8 %x2)
4758     ret void
4759 }
4760
4761 declare <16 x i8> @llvm.x86.avx512.mask.pmovs.qb.512(<8 x i64>, <16 x i8>, i8)
4762
4763 define <16 x i8>@test_int_x86_avx512_mask_pmovs_qb_512(<8 x i64> %x0, <16 x i8> %x1, i8 %x2) {
4764 ; CHECK-LABEL: test_int_x86_avx512_mask_pmovs_qb_512:
4765 ; CHECK:       ## BB#0:
4766 ; CHECK-NEXT:    kmovw %edi, %k1
4767 ; CHECK-NEXT:    vpmovsqb %zmm0, %xmm1 {%k1}
4768 ; CHECK-NEXT:    vpmovsqb %zmm0, %xmm2 {%k1} {z}
4769 ; CHECK-NEXT:    vpmovsqb %zmm0, %xmm0
4770 ; CHECK-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
4771 ; CHECK-NEXT:    vpaddb %xmm2, %xmm0, %xmm0
4772 ; CHECK-NEXT:    retq
4773     %res0 = call <16 x i8> @llvm.x86.avx512.mask.pmovs.qb.512(<8 x i64> %x0, <16 x i8> %x1, i8 -1)
4774     %res1 = call <16 x i8> @llvm.x86.avx512.mask.pmovs.qb.512(<8 x i64> %x0, <16 x i8> %x1, i8 %x2)
4775     %res2 = call <16 x i8> @llvm.x86.avx512.mask.pmovs.qb.512(<8 x i64> %x0, <16 x i8> zeroinitializer, i8 %x2)
4776     %res3 = add <16 x i8> %res0, %res1
4777     %res4 = add <16 x i8> %res3, %res2
4778     ret <16 x i8> %res4
4779 }
4780
4781 declare void @llvm.x86.avx512.mask.pmovs.qb.mem.512(i8* %ptr, <8 x i64>, i8)
4782
4783 define void @test_int_x86_avx512_mask_pmovs_qb_mem_512(i8* %ptr, <8 x i64> %x1, i8 %x2) {
4784 ; CHECK-LABEL: test_int_x86_avx512_mask_pmovs_qb_mem_512:
4785 ; CHECK:       ## BB#0:
4786 ; CHECK-NEXT:    vpmovsqb %zmm0, (%rdi)
4787 ; CHECK-NEXT:    kmovw %esi, %k1
4788 ; CHECK-NEXT:    vpmovsqb %zmm0, (%rdi) {%k1}
4789 ; CHECK-NEXT:    retq
4790     call void @llvm.x86.avx512.mask.pmovs.qb.mem.512(i8* %ptr, <8 x i64> %x1, i8 -1)
4791     call void @llvm.x86.avx512.mask.pmovs.qb.mem.512(i8* %ptr, <8 x i64> %x1, i8 %x2)
4792     ret void
4793 }
4794
4795 declare <16 x i8> @llvm.x86.avx512.mask.pmovus.qb.512(<8 x i64>, <16 x i8>, i8)
4796
4797 define <16 x i8>@test_int_x86_avx512_mask_pmovus_qb_512(<8 x i64> %x0, <16 x i8> %x1, i8 %x2) {
4798 ; CHECK-LABEL: test_int_x86_avx512_mask_pmovus_qb_512:
4799 ; CHECK:       ## BB#0:
4800 ; CHECK-NEXT:    kmovw %edi, %k1
4801 ; CHECK-NEXT:    vpmovusqb %zmm0, %xmm1 {%k1}
4802 ; CHECK-NEXT:    vpmovusqb %zmm0, %xmm2 {%k1} {z}
4803 ; CHECK-NEXT:    vpmovusqb %zmm0, %xmm0
4804 ; CHECK-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
4805 ; CHECK-NEXT:    vpaddb %xmm2, %xmm0, %xmm0
4806 ; CHECK-NEXT:    retq
4807     %res0 = call <16 x i8> @llvm.x86.avx512.mask.pmovus.qb.512(<8 x i64> %x0, <16 x i8> %x1, i8 -1)
4808     %res1 = call <16 x i8> @llvm.x86.avx512.mask.pmovus.qb.512(<8 x i64> %x0, <16 x i8> %x1, i8 %x2)
4809     %res2 = call <16 x i8> @llvm.x86.avx512.mask.pmovus.qb.512(<8 x i64> %x0, <16 x i8> zeroinitializer, i8 %x2)
4810     %res3 = add <16 x i8> %res0, %res1
4811     %res4 = add <16 x i8> %res3, %res2
4812     ret <16 x i8> %res4
4813 }
4814
4815 declare void @llvm.x86.avx512.mask.pmovus.qb.mem.512(i8* %ptr, <8 x i64>, i8)
4816
4817 define void @test_int_x86_avx512_mask_pmovus_qb_mem_512(i8* %ptr, <8 x i64> %x1, i8 %x2) {
4818 ; CHECK-LABEL: test_int_x86_avx512_mask_pmovus_qb_mem_512:
4819 ; CHECK:       ## BB#0:
4820 ; CHECK-NEXT:    vpmovusqb %zmm0, (%rdi)
4821 ; CHECK-NEXT:    kmovw %esi, %k1
4822 ; CHECK-NEXT:    vpmovusqb %zmm0, (%rdi) {%k1}
4823 ; CHECK-NEXT:    retq
4824     call void @llvm.x86.avx512.mask.pmovus.qb.mem.512(i8* %ptr, <8 x i64> %x1, i8 -1)
4825     call void @llvm.x86.avx512.mask.pmovus.qb.mem.512(i8* %ptr, <8 x i64> %x1, i8 %x2)
4826     ret void
4827 }
4828
4829 declare <8 x i16> @llvm.x86.avx512.mask.pmov.qw.512(<8 x i64>, <8 x i16>, i8)
4830
4831 define <8 x i16>@test_int_x86_avx512_mask_pmov_qw_512(<8 x i64> %x0, <8 x i16> %x1, i8 %x2) {
4832 ; CHECK-LABEL: test_int_x86_avx512_mask_pmov_qw_512:
4833 ; CHECK:       ## BB#0:
4834 ; CHECK-NEXT:    movzbl %dil, %eax
4835 ; CHECK-NEXT:    kmovw %eax, %k1
4836 ; CHECK-NEXT:    vpmovqw %zmm0, %xmm1 {%k1}
4837 ; CHECK-NEXT:    vpmovqw %zmm0, %xmm2 {%k1} {z}
4838 ; CHECK-NEXT:    vpmovqw %zmm0, %xmm0
4839 ; CHECK-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
4840 ; CHECK-NEXT:    vpaddw %xmm2, %xmm0, %xmm0
4841 ; CHECK-NEXT:    retq
4842     %res0 = call <8 x i16> @llvm.x86.avx512.mask.pmov.qw.512(<8 x i64> %x0, <8 x i16> %x1, i8 -1)
4843     %res1 = call <8 x i16> @llvm.x86.avx512.mask.pmov.qw.512(<8 x i64> %x0, <8 x i16> %x1, i8 %x2)
4844     %res2 = call <8 x i16> @llvm.x86.avx512.mask.pmov.qw.512(<8 x i64> %x0, <8 x i16> zeroinitializer, i8 %x2)
4845     %res3 = add <8 x i16> %res0, %res1
4846     %res4 = add <8 x i16> %res3, %res2
4847     ret <8 x i16> %res4
4848 }
4849
4850 declare void @llvm.x86.avx512.mask.pmov.qw.mem.512(i8* %ptr, <8 x i64>, i8)
4851
4852 define void @test_int_x86_avx512_mask_pmov_qw_mem_512(i8* %ptr, <8 x i64> %x1, i8 %x2) {
4853 ; CHECK-LABEL: test_int_x86_avx512_mask_pmov_qw_mem_512:
4854 ; CHECK:       ## BB#0:
4855 ; CHECK-NEXT:    movzbl %sil, %eax
4856 ; CHECK-NEXT:    kmovw %eax, %k1
4857 ; CHECK-NEXT:    vpmovqw %zmm0, (%rdi)
4858 ; CHECK-NEXT:    vpmovqw %zmm0, (%rdi) {%k1}
4859 ; CHECK-NEXT:    retq
4860     call void @llvm.x86.avx512.mask.pmov.qw.mem.512(i8* %ptr, <8 x i64> %x1, i8 -1)
4861     call void @llvm.x86.avx512.mask.pmov.qw.mem.512(i8* %ptr, <8 x i64> %x1, i8 %x2)
4862     ret void
4863 }
4864
4865 declare <8 x i16> @llvm.x86.avx512.mask.pmovs.qw.512(<8 x i64>, <8 x i16>, i8)
4866
4867 define <8 x i16>@test_int_x86_avx512_mask_pmovs_qw_512(<8 x i64> %x0, <8 x i16> %x1, i8 %x2) {
4868 ; CHECK-LABEL: test_int_x86_avx512_mask_pmovs_qw_512:
4869 ; CHECK:       ## BB#0:
4870 ; CHECK-NEXT:    movzbl %dil, %eax
4871 ; CHECK-NEXT:    kmovw %eax, %k1
4872 ; CHECK-NEXT:    vpmovsqw %zmm0, %xmm1 {%k1}
4873 ; CHECK-NEXT:    vpmovsqw %zmm0, %xmm2 {%k1} {z}
4874 ; CHECK-NEXT:    vpmovsqw %zmm0, %xmm0
4875 ; CHECK-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
4876 ; CHECK-NEXT:    vpaddw %xmm2, %xmm0, %xmm0
4877 ; CHECK-NEXT:    retq
4878     %res0 = call <8 x i16> @llvm.x86.avx512.mask.pmovs.qw.512(<8 x i64> %x0, <8 x i16> %x1, i8 -1)
4879     %res1 = call <8 x i16> @llvm.x86.avx512.mask.pmovs.qw.512(<8 x i64> %x0, <8 x i16> %x1, i8 %x2)
4880     %res2 = call <8 x i16> @llvm.x86.avx512.mask.pmovs.qw.512(<8 x i64> %x0, <8 x i16> zeroinitializer, i8 %x2)
4881     %res3 = add <8 x i16> %res0, %res1
4882     %res4 = add <8 x i16> %res3, %res2
4883     ret <8 x i16> %res4
4884 }
4885
4886 declare void @llvm.x86.avx512.mask.pmovs.qw.mem.512(i8* %ptr, <8 x i64>, i8)
4887
4888 define void @test_int_x86_avx512_mask_pmovs_qw_mem_512(i8* %ptr, <8 x i64> %x1, i8 %x2) {
4889 ; CHECK-LABEL: test_int_x86_avx512_mask_pmovs_qw_mem_512:
4890 ; CHECK:       ## BB#0:
4891 ; CHECK-NEXT:    vpmovsqw %zmm0, (%rdi)
4892 ; CHECK-NEXT:    kmovw %esi, %k1
4893 ; CHECK-NEXT:    vpmovsqw %zmm0, (%rdi) {%k1}
4894 ; CHECK-NEXT:    retq
4895     call void @llvm.x86.avx512.mask.pmovs.qw.mem.512(i8* %ptr, <8 x i64> %x1, i8 -1)
4896     call void @llvm.x86.avx512.mask.pmovs.qw.mem.512(i8* %ptr, <8 x i64> %x1, i8 %x2)
4897     ret void
4898 }
4899
4900 declare <8 x i16> @llvm.x86.avx512.mask.pmovus.qw.512(<8 x i64>, <8 x i16>, i8)
4901
4902 define <8 x i16>@test_int_x86_avx512_mask_pmovus_qw_512(<8 x i64> %x0, <8 x i16> %x1, i8 %x2) {
4903 ; CHECK-LABEL: test_int_x86_avx512_mask_pmovus_qw_512:
4904 ; CHECK:       ## BB#0:
4905 ; CHECK-NEXT:    movzbl %dil, %eax
4906 ; CHECK-NEXT:    kmovw %eax, %k1
4907 ; CHECK-NEXT:    vpmovusqw %zmm0, %xmm1 {%k1}
4908 ; CHECK-NEXT:    vpmovusqw %zmm0, %xmm2 {%k1} {z}
4909 ; CHECK-NEXT:    vpmovusqw %zmm0, %xmm0
4910 ; CHECK-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
4911 ; CHECK-NEXT:    vpaddw %xmm2, %xmm0, %xmm0
4912 ; CHECK-NEXT:    retq
4913     %res0 = call <8 x i16> @llvm.x86.avx512.mask.pmovus.qw.512(<8 x i64> %x0, <8 x i16> %x1, i8 -1)
4914     %res1 = call <8 x i16> @llvm.x86.avx512.mask.pmovus.qw.512(<8 x i64> %x0, <8 x i16> %x1, i8 %x2)
4915     %res2 = call <8 x i16> @llvm.x86.avx512.mask.pmovus.qw.512(<8 x i64> %x0, <8 x i16> zeroinitializer, i8 %x2)
4916     %res3 = add <8 x i16> %res0, %res1
4917     %res4 = add <8 x i16> %res3, %res2
4918     ret <8 x i16> %res4
4919 }
4920
4921 declare void @llvm.x86.avx512.mask.pmovus.qw.mem.512(i8* %ptr, <8 x i64>, i8)
4922
4923 define void @test_int_x86_avx512_mask_pmovus_qw_mem_512(i8* %ptr, <8 x i64> %x1, i8 %x2) {
4924 ; CHECK-LABEL: test_int_x86_avx512_mask_pmovus_qw_mem_512:
4925 ; CHECK:       ## BB#0:
4926 ; CHECK-NEXT:    vpmovusqw %zmm0, (%rdi)
4927 ; CHECK-NEXT:    kmovw %esi, %k1
4928 ; CHECK-NEXT:    vpmovusqw %zmm0, (%rdi) {%k1}
4929 ; CHECK-NEXT:    retq
4930     call void @llvm.x86.avx512.mask.pmovus.qw.mem.512(i8* %ptr, <8 x i64> %x1, i8 -1)
4931     call void @llvm.x86.avx512.mask.pmovus.qw.mem.512(i8* %ptr, <8 x i64> %x1, i8 %x2)
4932     ret void
4933 }
4934
4935 declare <8 x i32> @llvm.x86.avx512.mask.pmov.qd.512(<8 x i64>, <8 x i32>, i8)
4936
4937 define <8 x i32>@test_int_x86_avx512_mask_pmov_qd_512(<8 x i64> %x0, <8 x i32> %x1, i8 %x2) {
4938 ; CHECK-LABEL: test_int_x86_avx512_mask_pmov_qd_512:
4939 ; CHECK:       ## BB#0:
4940 ; CHECK-NEXT:    movzbl %dil, %eax
4941 ; CHECK-NEXT:    kmovw %eax, %k1
4942 ; CHECK-NEXT:    vpmovqd %zmm0, %ymm1 {%k1}
4943 ; CHECK-NEXT:    vpmovqd %zmm0, %ymm2 {%k1} {z}
4944 ; CHECK-NEXT:    vpmovqd %zmm0, %ymm0
4945 ; CHECK-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
4946 ; CHECK-NEXT:    vpaddd %ymm2, %ymm0, %ymm0
4947 ; CHECK-NEXT:    retq
4948     %res0 = call <8 x i32> @llvm.x86.avx512.mask.pmov.qd.512(<8 x i64> %x0, <8 x i32> %x1, i8 -1)
4949     %res1 = call <8 x i32> @llvm.x86.avx512.mask.pmov.qd.512(<8 x i64> %x0, <8 x i32> %x1, i8 %x2)
4950     %res2 = call <8 x i32> @llvm.x86.avx512.mask.pmov.qd.512(<8 x i64> %x0, <8 x i32> zeroinitializer, i8 %x2)
4951     %res3 = add <8 x i32> %res0, %res1
4952     %res4 = add <8 x i32> %res3, %res2
4953     ret <8 x i32> %res4
4954 }
4955
4956 declare void @llvm.x86.avx512.mask.pmov.qd.mem.512(i8* %ptr, <8 x i64>, i8)
4957
4958 define void @test_int_x86_avx512_mask_pmov_qd_mem_512(i8* %ptr, <8 x i64> %x1, i8 %x2) {
4959 ; CHECK-LABEL: test_int_x86_avx512_mask_pmov_qd_mem_512:
4960 ; CHECK:       ## BB#0:
4961 ; CHECK-NEXT:    movzbl %sil, %eax
4962 ; CHECK-NEXT:    kmovw %eax, %k1
4963 ; CHECK-NEXT:    vpmovqd %zmm0, (%rdi)
4964 ; CHECK-NEXT:    vpmovqd %zmm0, (%rdi) {%k1}
4965 ; CHECK-NEXT:    retq
4966     call void @llvm.x86.avx512.mask.pmov.qd.mem.512(i8* %ptr, <8 x i64> %x1, i8 -1)
4967     call void @llvm.x86.avx512.mask.pmov.qd.mem.512(i8* %ptr, <8 x i64> %x1, i8 %x2)
4968     ret void
4969 }
4970
4971 declare <8 x i32> @llvm.x86.avx512.mask.pmovs.qd.512(<8 x i64>, <8 x i32>, i8)
4972
4973 define <8 x i32>@test_int_x86_avx512_mask_pmovs_qd_512(<8 x i64> %x0, <8 x i32> %x1, i8 %x2) {
4974 ; CHECK-LABEL: test_int_x86_avx512_mask_pmovs_qd_512:
4975 ; CHECK:       ## BB#0:
4976 ; CHECK-NEXT:    movzbl %dil, %eax
4977 ; CHECK-NEXT:    kmovw %eax, %k1
4978 ; CHECK-NEXT:    vpmovsqd %zmm0, %ymm1 {%k1}
4979 ; CHECK-NEXT:    vpmovsqd %zmm0, %ymm2 {%k1} {z}
4980 ; CHECK-NEXT:    vpmovsqd %zmm0, %ymm0
4981 ; CHECK-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
4982 ; CHECK-NEXT:    vpaddd %ymm2, %ymm0, %ymm0
4983 ; CHECK-NEXT:    retq
4984     %res0 = call <8 x i32> @llvm.x86.avx512.mask.pmovs.qd.512(<8 x i64> %x0, <8 x i32> %x1, i8 -1)
4985     %res1 = call <8 x i32> @llvm.x86.avx512.mask.pmovs.qd.512(<8 x i64> %x0, <8 x i32> %x1, i8 %x2)
4986     %res2 = call <8 x i32> @llvm.x86.avx512.mask.pmovs.qd.512(<8 x i64> %x0, <8 x i32> zeroinitializer, i8 %x2)
4987     %res3 = add <8 x i32> %res0, %res1
4988     %res4 = add <8 x i32> %res3, %res2
4989     ret <8 x i32> %res4
4990 }
4991
4992 declare void @llvm.x86.avx512.mask.pmovs.qd.mem.512(i8* %ptr, <8 x i64>, i8)
4993
4994 define void @test_int_x86_avx512_mask_pmovs_qd_mem_512(i8* %ptr, <8 x i64> %x1, i8 %x2) {
4995 ; CHECK-LABEL: test_int_x86_avx512_mask_pmovs_qd_mem_512:
4996 ; CHECK:       ## BB#0:
4997 ; CHECK-NEXT:    vpmovsqd %zmm0, (%rdi)
4998 ; CHECK-NEXT:    kmovw %esi, %k1
4999 ; CHECK-NEXT:    vpmovsqd %zmm0, (%rdi) {%k1}
5000 ; CHECK-NEXT:    retq
5001     call void @llvm.x86.avx512.mask.pmovs.qd.mem.512(i8* %ptr, <8 x i64> %x1, i8 -1)
5002     call void @llvm.x86.avx512.mask.pmovs.qd.mem.512(i8* %ptr, <8 x i64> %x1, i8 %x2)
5003     ret void
5004 }
5005
5006 declare <8 x i32> @llvm.x86.avx512.mask.pmovus.qd.512(<8 x i64>, <8 x i32>, i8)
5007
5008 define <8 x i32>@test_int_x86_avx512_mask_pmovus_qd_512(<8 x i64> %x0, <8 x i32> %x1, i8 %x2) {
5009 ; CHECK-LABEL: test_int_x86_avx512_mask_pmovus_qd_512:
5010 ; CHECK:       ## BB#0:
5011 ; CHECK-NEXT:    movzbl %dil, %eax
5012 ; CHECK-NEXT:    kmovw %eax, %k1
5013 ; CHECK-NEXT:    vpmovusqd %zmm0, %ymm1 {%k1}
5014 ; CHECK-NEXT:    vpmovusqd %zmm0, %ymm2 {%k1} {z}
5015 ; CHECK-NEXT:    vpmovusqd %zmm0, %ymm0
5016 ; CHECK-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
5017 ; CHECK-NEXT:    vpaddd %ymm2, %ymm0, %ymm0
5018 ; CHECK-NEXT:    retq
5019     %res0 = call <8 x i32> @llvm.x86.avx512.mask.pmovus.qd.512(<8 x i64> %x0, <8 x i32> %x1, i8 -1)
5020     %res1 = call <8 x i32> @llvm.x86.avx512.mask.pmovus.qd.512(<8 x i64> %x0, <8 x i32> %x1, i8 %x2)
5021     %res2 = call <8 x i32> @llvm.x86.avx512.mask.pmovus.qd.512(<8 x i64> %x0, <8 x i32> zeroinitializer, i8 %x2)
5022     %res3 = add <8 x i32> %res0, %res1
5023     %res4 = add <8 x i32> %res3, %res2
5024     ret <8 x i32> %res4
5025 }
5026
5027 declare void @llvm.x86.avx512.mask.pmovus.qd.mem.512(i8* %ptr, <8 x i64>, i8)
5028
5029 define void @test_int_x86_avx512_mask_pmovus_qd_mem_512(i8* %ptr, <8 x i64> %x1, i8 %x2) {
5030 ; CHECK-LABEL: test_int_x86_avx512_mask_pmovus_qd_mem_512:
5031 ; CHECK:       ## BB#0:
5032 ; CHECK-NEXT:    vpmovusqd %zmm0, (%rdi)
5033 ; CHECK-NEXT:    kmovw %esi, %k1
5034 ; CHECK-NEXT:    vpmovusqd %zmm0, (%rdi) {%k1}
5035 ; CHECK-NEXT:    retq
5036     call void @llvm.x86.avx512.mask.pmovus.qd.mem.512(i8* %ptr, <8 x i64> %x1, i8 -1)
5037     call void @llvm.x86.avx512.mask.pmovus.qd.mem.512(i8* %ptr, <8 x i64> %x1, i8 %x2)
5038     ret void
5039 }
5040
5041 declare <16 x i8> @llvm.x86.avx512.mask.pmov.db.512(<16 x i32>, <16 x i8>, i16)
5042
5043 define <16 x i8>@test_int_x86_avx512_mask_pmov_db_512(<16 x i32> %x0, <16 x i8> %x1, i16 %x2) {
5044 ; CHECK-LABEL: test_int_x86_avx512_mask_pmov_db_512:
5045 ; CHECK:       ## BB#0:
5046 ; CHECK-NEXT:    kmovw %edi, %k1
5047 ; CHECK-NEXT:    vpmovdb %zmm0, %xmm1 {%k1}
5048 ; CHECK-NEXT:    vpmovdb %zmm0, %xmm2 {%k1} {z}
5049 ; CHECK-NEXT:    vpmovdb %zmm0, %xmm0
5050 ; CHECK-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
5051 ; CHECK-NEXT:    vpaddb %xmm2, %xmm0, %xmm0
5052 ; CHECK-NEXT:    retq
5053     %res0 = call <16 x i8> @llvm.x86.avx512.mask.pmov.db.512(<16 x i32> %x0, <16 x i8> %x1, i16 -1)
5054     %res1 = call <16 x i8> @llvm.x86.avx512.mask.pmov.db.512(<16 x i32> %x0, <16 x i8> %x1, i16 %x2)
5055     %res2 = call <16 x i8> @llvm.x86.avx512.mask.pmov.db.512(<16 x i32> %x0, <16 x i8> zeroinitializer, i16 %x2)
5056     %res3 = add <16 x i8> %res0, %res1
5057     %res4 = add <16 x i8> %res3, %res2
5058     ret <16 x i8> %res4
5059 }
5060
5061 declare void @llvm.x86.avx512.mask.pmov.db.mem.512(i8* %ptr, <16 x i32>, i16)
5062
5063 define void @test_int_x86_avx512_mask_pmov_db_mem_512(i8* %ptr, <16 x i32> %x1, i16 %x2) {
5064 ; CHECK-LABEL: test_int_x86_avx512_mask_pmov_db_mem_512:
5065 ; CHECK:       ## BB#0:
5066 ; CHECK-NEXT:    kmovw %esi, %k1
5067 ; CHECK-NEXT:    vpmovdb %zmm0, (%rdi)
5068 ; CHECK-NEXT:    vpmovdb %zmm0, (%rdi) {%k1}
5069 ; CHECK-NEXT:    retq
5070     call void @llvm.x86.avx512.mask.pmov.db.mem.512(i8* %ptr, <16 x i32> %x1, i16 -1)
5071     call void @llvm.x86.avx512.mask.pmov.db.mem.512(i8* %ptr, <16 x i32> %x1, i16 %x2)
5072     ret void
5073 }
5074
5075 declare <16 x i8> @llvm.x86.avx512.mask.pmovs.db.512(<16 x i32>, <16 x i8>, i16)
5076
5077 define <16 x i8>@test_int_x86_avx512_mask_pmovs_db_512(<16 x i32> %x0, <16 x i8> %x1, i16 %x2) {
5078 ; CHECK-LABEL: test_int_x86_avx512_mask_pmovs_db_512:
5079 ; CHECK:       ## BB#0:
5080 ; CHECK-NEXT:    kmovw %edi, %k1
5081 ; CHECK-NEXT:    vpmovsdb %zmm0, %xmm1 {%k1}
5082 ; CHECK-NEXT:    vpmovsdb %zmm0, %xmm2 {%k1} {z}
5083 ; CHECK-NEXT:    vpmovsdb %zmm0, %xmm0
5084 ; CHECK-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
5085 ; CHECK-NEXT:    vpaddb %xmm2, %xmm0, %xmm0
5086 ; CHECK-NEXT:    retq
5087     %res0 = call <16 x i8> @llvm.x86.avx512.mask.pmovs.db.512(<16 x i32> %x0, <16 x i8> %x1, i16 -1)
5088     %res1 = call <16 x i8> @llvm.x86.avx512.mask.pmovs.db.512(<16 x i32> %x0, <16 x i8> %x1, i16 %x2)
5089     %res2 = call <16 x i8> @llvm.x86.avx512.mask.pmovs.db.512(<16 x i32> %x0, <16 x i8> zeroinitializer, i16 %x2)
5090     %res3 = add <16 x i8> %res0, %res1
5091     %res4 = add <16 x i8> %res3, %res2
5092     ret <16 x i8> %res4
5093 }
5094
5095 declare void @llvm.x86.avx512.mask.pmovs.db.mem.512(i8* %ptr, <16 x i32>, i16)
5096
5097 define void @test_int_x86_avx512_mask_pmovs_db_mem_512(i8* %ptr, <16 x i32> %x1, i16 %x2) {
5098 ; CHECK-LABEL: test_int_x86_avx512_mask_pmovs_db_mem_512:
5099 ; CHECK:       ## BB#0:
5100 ; CHECK-NEXT:    vpmovsdb %zmm0, (%rdi)
5101 ; CHECK-NEXT:    kmovw %esi, %k1
5102 ; CHECK-NEXT:    vpmovsdb %zmm0, (%rdi) {%k1}
5103 ; CHECK-NEXT:    retq
5104     call void @llvm.x86.avx512.mask.pmovs.db.mem.512(i8* %ptr, <16 x i32> %x1, i16 -1)
5105     call void @llvm.x86.avx512.mask.pmovs.db.mem.512(i8* %ptr, <16 x i32> %x1, i16 %x2)
5106     ret void
5107 }
5108
5109 declare <16 x i8> @llvm.x86.avx512.mask.pmovus.db.512(<16 x i32>, <16 x i8>, i16)
5110
5111 define <16 x i8>@test_int_x86_avx512_mask_pmovus_db_512(<16 x i32> %x0, <16 x i8> %x1, i16 %x2) {
5112 ; CHECK-LABEL: test_int_x86_avx512_mask_pmovus_db_512:
5113 ; CHECK:       ## BB#0:
5114 ; CHECK-NEXT:    kmovw %edi, %k1
5115 ; CHECK-NEXT:    vpmovusdb %zmm0, %xmm1 {%k1}
5116 ; CHECK-NEXT:    vpmovusdb %zmm0, %xmm2 {%k1} {z}
5117 ; CHECK-NEXT:    vpmovusdb %zmm0, %xmm0
5118 ; CHECK-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
5119 ; CHECK-NEXT:    vpaddb %xmm2, %xmm0, %xmm0
5120 ; CHECK-NEXT:    retq
5121     %res0 = call <16 x i8> @llvm.x86.avx512.mask.pmovus.db.512(<16 x i32> %x0, <16 x i8> %x1, i16 -1)
5122     %res1 = call <16 x i8> @llvm.x86.avx512.mask.pmovus.db.512(<16 x i32> %x0, <16 x i8> %x1, i16 %x2)
5123     %res2 = call <16 x i8> @llvm.x86.avx512.mask.pmovus.db.512(<16 x i32> %x0, <16 x i8> zeroinitializer, i16 %x2)
5124     %res3 = add <16 x i8> %res0, %res1
5125     %res4 = add <16 x i8> %res3, %res2
5126     ret <16 x i8> %res4
5127 }
5128
5129 declare void @llvm.x86.avx512.mask.pmovus.db.mem.512(i8* %ptr, <16 x i32>, i16)
5130
5131 define void @test_int_x86_avx512_mask_pmovus_db_mem_512(i8* %ptr, <16 x i32> %x1, i16 %x2) {
5132 ; CHECK-LABEL: test_int_x86_avx512_mask_pmovus_db_mem_512:
5133 ; CHECK:       ## BB#0:
5134 ; CHECK-NEXT:    vpmovusdb %zmm0, (%rdi)
5135 ; CHECK-NEXT:    kmovw %esi, %k1
5136 ; CHECK-NEXT:    vpmovusdb %zmm0, (%rdi) {%k1}
5137 ; CHECK-NEXT:    retq
5138     call void @llvm.x86.avx512.mask.pmovus.db.mem.512(i8* %ptr, <16 x i32> %x1, i16 -1)
5139     call void @llvm.x86.avx512.mask.pmovus.db.mem.512(i8* %ptr, <16 x i32> %x1, i16 %x2)
5140     ret void
5141 }
5142
5143 declare <16 x i16> @llvm.x86.avx512.mask.pmov.dw.512(<16 x i32>, <16 x i16>, i16)
5144
5145 define <16 x i16>@test_int_x86_avx512_mask_pmov_dw_512(<16 x i32> %x0, <16 x i16> %x1, i16 %x2) {
5146 ; CHECK-LABEL: test_int_x86_avx512_mask_pmov_dw_512:
5147 ; CHECK:       ## BB#0:
5148 ; CHECK-NEXT:    kmovw %edi, %k1
5149 ; CHECK-NEXT:    vpmovdw %zmm0, %ymm1 {%k1}
5150 ; CHECK-NEXT:    vpmovdw %zmm0, %ymm2 {%k1} {z}
5151 ; CHECK-NEXT:    vpmovdw %zmm0, %ymm0
5152 ; CHECK-NEXT:    vpaddw %ymm1, %ymm0, %ymm0
5153 ; CHECK-NEXT:    vpaddw %ymm2, %ymm0, %ymm0
5154 ; CHECK-NEXT:    retq
5155     %res0 = call <16 x i16> @llvm.x86.avx512.mask.pmov.dw.512(<16 x i32> %x0, <16 x i16> %x1, i16 -1)
5156     %res1 = call <16 x i16> @llvm.x86.avx512.mask.pmov.dw.512(<16 x i32> %x0, <16 x i16> %x1, i16 %x2)
5157     %res2 = call <16 x i16> @llvm.x86.avx512.mask.pmov.dw.512(<16 x i32> %x0, <16 x i16> zeroinitializer, i16 %x2)
5158     %res3 = add <16 x i16> %res0, %res1
5159     %res4 = add <16 x i16> %res3, %res2
5160     ret <16 x i16> %res4
5161 }
5162
5163 declare void @llvm.x86.avx512.mask.pmov.dw.mem.512(i8* %ptr, <16 x i32>, i16)
5164
5165 define void @test_int_x86_avx512_mask_pmov_dw_mem_512(i8* %ptr, <16 x i32> %x1, i16 %x2) {
5166 ; CHECK-LABEL: test_int_x86_avx512_mask_pmov_dw_mem_512:
5167 ; CHECK:       ## BB#0:
5168 ; CHECK-NEXT:    kmovw %esi, %k1
5169 ; CHECK-NEXT:    vpmovdw %zmm0, (%rdi)
5170 ; CHECK-NEXT:    vpmovdw %zmm0, (%rdi) {%k1}
5171 ; CHECK-NEXT:    retq
5172     call void @llvm.x86.avx512.mask.pmov.dw.mem.512(i8* %ptr, <16 x i32> %x1, i16 -1)
5173     call void @llvm.x86.avx512.mask.pmov.dw.mem.512(i8* %ptr, <16 x i32> %x1, i16 %x2)
5174     ret void
5175 }
5176
5177 declare <16 x i16> @llvm.x86.avx512.mask.pmovs.dw.512(<16 x i32>, <16 x i16>, i16)
5178
5179 define <16 x i16>@test_int_x86_avx512_mask_pmovs_dw_512(<16 x i32> %x0, <16 x i16> %x1, i16 %x2) {
5180 ; CHECK-LABEL: test_int_x86_avx512_mask_pmovs_dw_512:
5181 ; CHECK:       ## BB#0:
5182 ; CHECK-NEXT:    kmovw %edi, %k1
5183 ; CHECK-NEXT:    vpmovsdw %zmm0, %ymm1 {%k1}
5184 ; CHECK-NEXT:    vpmovsdw %zmm0, %ymm2 {%k1} {z}
5185 ; CHECK-NEXT:    vpmovsdw %zmm0, %ymm0
5186 ; CHECK-NEXT:    vpaddw %ymm1, %ymm0, %ymm0
5187 ; CHECK-NEXT:    vpaddw %ymm2, %ymm0, %ymm0
5188 ; CHECK-NEXT:    retq
5189     %res0 = call <16 x i16> @llvm.x86.avx512.mask.pmovs.dw.512(<16 x i32> %x0, <16 x i16> %x1, i16 -1)
5190     %res1 = call <16 x i16> @llvm.x86.avx512.mask.pmovs.dw.512(<16 x i32> %x0, <16 x i16> %x1, i16 %x2)
5191     %res2 = call <16 x i16> @llvm.x86.avx512.mask.pmovs.dw.512(<16 x i32> %x0, <16 x i16> zeroinitializer, i16 %x2)
5192     %res3 = add <16 x i16> %res0, %res1
5193     %res4 = add <16 x i16> %res3, %res2
5194     ret <16 x i16> %res4
5195 }
5196
5197 declare void @llvm.x86.avx512.mask.pmovs.dw.mem.512(i8* %ptr, <16 x i32>, i16)
5198
5199 define void @test_int_x86_avx512_mask_pmovs_dw_mem_512(i8* %ptr, <16 x i32> %x1, i16 %x2) {
5200 ; CHECK-LABEL: test_int_x86_avx512_mask_pmovs_dw_mem_512:
5201 ; CHECK:       ## BB#0:
5202 ; CHECK-NEXT:    vpmovsdw %zmm0, (%rdi)
5203 ; CHECK-NEXT:    kmovw %esi, %k1
5204 ; CHECK-NEXT:    vpmovsdw %zmm0, (%rdi) {%k1}
5205 ; CHECK-NEXT:    retq
5206     call void @llvm.x86.avx512.mask.pmovs.dw.mem.512(i8* %ptr, <16 x i32> %x1, i16 -1)
5207     call void @llvm.x86.avx512.mask.pmovs.dw.mem.512(i8* %ptr, <16 x i32> %x1, i16 %x2)
5208     ret void
5209 }
5210
5211 declare <16 x i16> @llvm.x86.avx512.mask.pmovus.dw.512(<16 x i32>, <16 x i16>, i16)
5212
5213 define <16 x i16>@test_int_x86_avx512_mask_pmovus_dw_512(<16 x i32> %x0, <16 x i16> %x1, i16 %x2) {
5214 ; CHECK-LABEL: test_int_x86_avx512_mask_pmovus_dw_512:
5215 ; CHECK:       ## BB#0:
5216 ; CHECK-NEXT:    kmovw %edi, %k1
5217 ; CHECK-NEXT:    vpmovusdw %zmm0, %ymm1 {%k1}
5218 ; CHECK-NEXT:    vpmovusdw %zmm0, %ymm2 {%k1} {z}
5219 ; CHECK-NEXT:    vpmovusdw %zmm0, %ymm0
5220 ; CHECK-NEXT:    vpaddw %ymm1, %ymm0, %ymm0
5221 ; CHECK-NEXT:    vpaddw %ymm2, %ymm0, %ymm0
5222 ; CHECK-NEXT:    retq
5223     %res0 = call <16 x i16> @llvm.x86.avx512.mask.pmovus.dw.512(<16 x i32> %x0, <16 x i16> %x1, i16 -1)
5224     %res1 = call <16 x i16> @llvm.x86.avx512.mask.pmovus.dw.512(<16 x i32> %x0, <16 x i16> %x1, i16 %x2)
5225     %res2 = call <16 x i16> @llvm.x86.avx512.mask.pmovus.dw.512(<16 x i32> %x0, <16 x i16> zeroinitializer, i16 %x2)
5226     %res3 = add <16 x i16> %res0, %res1
5227     %res4 = add <16 x i16> %res3, %res2
5228     ret <16 x i16> %res4
5229 }
5230
5231 declare void @llvm.x86.avx512.mask.pmovus.dw.mem.512(i8* %ptr, <16 x i32>, i16)
5232
5233 define void @test_int_x86_avx512_mask_pmovus_dw_mem_512(i8* %ptr, <16 x i32> %x1, i16 %x2) {
5234 ; CHECK-LABEL: test_int_x86_avx512_mask_pmovus_dw_mem_512:
5235 ; CHECK:       ## BB#0:
5236 ; CHECK-NEXT:    vpmovusdw %zmm0, (%rdi)
5237 ; CHECK-NEXT:    kmovw %esi, %k1
5238 ; CHECK-NEXT:    vpmovusdw %zmm0, (%rdi) {%k1}
5239 ; CHECK-NEXT:    retq
5240     call void @llvm.x86.avx512.mask.pmovus.dw.mem.512(i8* %ptr, <16 x i32> %x1, i16 -1)
5241     call void @llvm.x86.avx512.mask.pmovus.dw.mem.512(i8* %ptr, <16 x i32> %x1, i16 %x2)
5242     ret void
5243 }
5244
5245 declare <8 x double> @llvm.x86.avx512.mask.cvtdq2pd.512(<8 x i32>, <8 x double>, i8)
5246
5247 define <8 x double>@test_int_x86_avx512_mask_cvt_dq2pd_512(<8 x i32> %x0, <8 x double> %x1, i8 %x2) {
5248 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_dq2pd_512:
5249 ; CHECK:       ## BB#0:
5250 ; CHECK-NEXT:    movzbl %dil, %eax
5251 ; CHECK-NEXT:    kmovw %eax, %k1
5252 ; CHECK-NEXT:    vcvtdq2pd %ymm0, %zmm1 {%k1}
5253 ; CHECK-NEXT:    vcvtdq2pd %ymm0, %zmm0
5254 ; CHECK-NEXT:    vaddpd %zmm0, %zmm1, %zmm0
5255 ; CHECK-NEXT:    retq
5256   %res = call <8 x double> @llvm.x86.avx512.mask.cvtdq2pd.512(<8 x i32> %x0, <8 x double> %x1, i8 %x2)
5257   %res1 = call <8 x double> @llvm.x86.avx512.mask.cvtdq2pd.512(<8 x i32> %x0, <8 x double> %x1, i8 -1)
5258   %res2 = fadd <8 x double> %res, %res1
5259   ret <8 x double> %res2
5260 }
5261
5262 declare <16 x float> @llvm.x86.avx512.mask.cvtdq2ps.512(<16 x i32>, <16 x float>, i16, i32)
5263
5264 define <16 x float>@test_int_x86_avx512_mask_cvt_dq2ps_512(<16 x i32> %x0, <16 x float> %x1, i16 %x2) {
5265 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_dq2ps_512:
5266 ; CHECK:       ## BB#0:
5267 ; CHECK-NEXT:    kmovw %edi, %k1
5268 ; CHECK-NEXT:    vcvtdq2ps %zmm0, %zmm1 {%k1}
5269 ; CHECK-NEXT:    vcvtdq2ps {rn-sae}, %zmm0, %zmm0
5270 ; CHECK-NEXT:    vaddps %zmm0, %zmm1, %zmm0
5271 ; CHECK-NEXT:    retq
5272   %res = call <16 x float> @llvm.x86.avx512.mask.cvtdq2ps.512(<16 x i32> %x0, <16 x float> %x1, i16 %x2, i32 4)
5273   %res1 = call <16 x float> @llvm.x86.avx512.mask.cvtdq2ps.512(<16 x i32> %x0, <16 x float> %x1, i16 -1, i32 0)
5274   %res2 = fadd <16 x float> %res, %res1
5275   ret <16 x float> %res2
5276 }
5277
5278 declare <8 x i32> @llvm.x86.avx512.mask.cvtpd2dq.512(<8 x double>, <8 x i32>, i8, i32)
5279
5280 define <8 x i32>@test_int_x86_avx512_mask_cvt_pd2dq_512(<8 x double> %x0, <8 x i32> %x1, i8 %x2) {
5281 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_pd2dq_512:
5282 ; CHECK:       ## BB#0:
5283 ; CHECK-NEXT:    movzbl %dil, %eax
5284 ; CHECK-NEXT:    kmovw %eax, %k1
5285 ; CHECK-NEXT:    vcvtpd2dq %zmm0, %ymm1 {%k1}
5286 ; CHECK-NEXT:    vcvtpd2dq {rn-sae}, %zmm0, %ymm0
5287 ; CHECK-NEXT:    vpaddd %ymm0, %ymm1, %ymm0
5288 ; CHECK-NEXT:    retq
5289   %res = call <8 x i32> @llvm.x86.avx512.mask.cvtpd2dq.512(<8 x double> %x0, <8 x i32> %x1, i8 %x2, i32 4)
5290   %res1 = call <8 x i32> @llvm.x86.avx512.mask.cvtpd2dq.512(<8 x double> %x0, <8 x i32> %x1, i8 -1, i32 0)
5291   %res2 = add <8 x i32> %res, %res1
5292   ret <8 x i32> %res2
5293 }
5294
5295 declare <8 x float> @llvm.x86.avx512.mask.cvtpd2ps.512(<8 x double>, <8 x float>, i8, i32)
5296
5297 define <8 x float>@test_int_x86_avx512_mask_cvt_pd2ps_512(<8 x double> %x0, <8 x float> %x1, i8 %x2) {
5298 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_pd2ps_512:
5299 ; CHECK:       ## BB#0:
5300 ; CHECK-NEXT:    movzbl %dil, %eax
5301 ; CHECK-NEXT:    kmovw %eax, %k1
5302 ; CHECK-NEXT:    vcvtpd2ps %zmm0, %ymm1 {%k1}
5303 ; CHECK-NEXT:    vcvtpd2ps {ru-sae}, %zmm0, %ymm0
5304 ; CHECK-NEXT:    vaddps %ymm0, %ymm1, %ymm0
5305 ; CHECK-NEXT:    retq
5306   %res = call <8 x float> @llvm.x86.avx512.mask.cvtpd2ps.512(<8 x double> %x0, <8 x float> %x1, i8 %x2, i32 4)
5307   %res1 = call <8 x float> @llvm.x86.avx512.mask.cvtpd2ps.512(<8 x double> %x0, <8 x float> %x1, i8 -1, i32 2)
5308   %res2 = fadd <8 x float> %res, %res1
5309   ret <8 x float> %res2
5310 }
5311
5312 declare <8 x i32> @llvm.x86.avx512.mask.cvtpd2udq.512(<8 x double>, <8 x i32>, i8, i32)
5313
5314 define <8 x i32>@test_int_x86_avx512_mask_cvt_pd2udq_512(<8 x double> %x0, <8 x i32> %x1, i8 %x2) {
5315 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_pd2udq_512:
5316 ; CHECK:       ## BB#0:
5317 ; CHECK-NEXT:    movzbl %dil, %eax
5318 ; CHECK-NEXT:    kmovw %eax, %k1
5319 ; CHECK-NEXT:    vcvtpd2udq {ru-sae}, %zmm0, %ymm1 {%k1}
5320 ; CHECK-NEXT:    vcvtpd2udq {rn-sae}, %zmm0, %ymm0
5321 ; CHECK-NEXT:    vpaddd %ymm0, %ymm1, %ymm0
5322 ; CHECK-NEXT:    retq
5323   %res = call <8 x i32> @llvm.x86.avx512.mask.cvtpd2udq.512(<8 x double> %x0, <8 x i32> %x1, i8 %x2, i32 2)
5324   %res1 = call <8 x i32> @llvm.x86.avx512.mask.cvtpd2udq.512(<8 x double> %x0, <8 x i32> %x1, i8 -1, i32 0)
5325   %res2 = add <8 x i32> %res, %res1
5326   ret <8 x i32> %res2
5327 }
5328
5329 declare <16 x i32> @llvm.x86.avx512.mask.cvtps2dq.512(<16 x float>, <16 x i32>, i16, i32)
5330
5331 define <16 x i32>@test_int_x86_avx512_mask_cvt_ps2dq_512(<16 x float> %x0, <16 x i32> %x1, i16 %x2) {
5332 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_ps2dq_512:
5333 ; CHECK:       ## BB#0:
5334 ; CHECK-NEXT:    kmovw %edi, %k1
5335 ; CHECK-NEXT:    vcvtps2dq {ru-sae}, %zmm0, %zmm1 {%k1}
5336 ; CHECK-NEXT:    vcvtps2dq {rn-sae}, %zmm0, %zmm0
5337 ; CHECK-NEXT:    vpaddd %zmm0, %zmm1, %zmm0
5338 ; CHECK-NEXT:    retq
5339   %res = call <16 x i32> @llvm.x86.avx512.mask.cvtps2dq.512(<16 x float> %x0, <16 x i32> %x1, i16 %x2, i32 2)
5340   %res1 = call <16 x i32> @llvm.x86.avx512.mask.cvtps2dq.512(<16 x float> %x0, <16 x i32> %x1, i16 -1, i32 0)
5341   %res2 = add <16 x i32> %res, %res1
5342   ret <16 x i32> %res2
5343 }
5344
5345 declare <8 x double> @llvm.x86.avx512.mask.cvtps2pd.512(<8 x float>, <8 x double>, i8, i32)
5346
5347 define <8 x double>@test_int_x86_avx512_mask_cvt_ps2pd_512(<8 x float> %x0, <8 x double> %x1, i8 %x2) {
5348 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_ps2pd_512:
5349 ; CHECK:       ## BB#0:
5350 ; CHECK-NEXT:    movzbl %dil, %eax
5351 ; CHECK-NEXT:    kmovw %eax, %k1
5352 ; CHECK-NEXT:    vcvtps2pd %ymm0, %zmm1 {%k1}
5353 ; CHECK-NEXT:    vcvtps2pd {sae}, %ymm0, %zmm0
5354 ; CHECK-NEXT:    vaddpd %zmm0, %zmm1, %zmm0
5355 ; CHECK-NEXT:    retq
5356   %res = call <8 x double> @llvm.x86.avx512.mask.cvtps2pd.512(<8 x float> %x0, <8 x double> %x1, i8 %x2, i32 4)
5357   %res1 = call <8 x double> @llvm.x86.avx512.mask.cvtps2pd.512(<8 x float> %x0, <8 x double> %x1, i8 -1, i32 8)
5358   %res2 = fadd <8 x double> %res, %res1
5359   ret <8 x double> %res2
5360 }
5361
5362 declare <16 x i32> @llvm.x86.avx512.mask.cvtps2udq.512(<16 x float>, <16 x i32>, i16, i32)
5363
5364 define <16 x i32>@test_int_x86_avx512_mask_cvt_ps2udq_512(<16 x float> %x0, <16 x i32> %x1, i16 %x2) {
5365 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_ps2udq_512:
5366 ; CHECK:       ## BB#0:
5367 ; CHECK-NEXT:    kmovw %edi, %k1
5368 ; CHECK-NEXT:    vcvtps2udq {ru-sae}, %zmm0, %zmm1 {%k1}
5369 ; CHECK-NEXT:    vcvtps2udq {rn-sae}, %zmm0, %zmm0
5370 ; CHECK-NEXT:    vpaddd %zmm0, %zmm1, %zmm0
5371 ; CHECK-NEXT:    retq
5372   %res = call <16 x i32> @llvm.x86.avx512.mask.cvtps2udq.512(<16 x float> %x0, <16 x i32> %x1, i16 %x2, i32 2)
5373   %res1 = call <16 x i32> @llvm.x86.avx512.mask.cvtps2udq.512(<16 x float> %x0, <16 x i32> %x1, i16 -1, i32 0)
5374   %res2 = add <16 x i32> %res, %res1
5375   ret <16 x i32> %res2
5376 }
5377
5378 declare <8 x i32> @llvm.x86.avx512.mask.cvttpd2dq.512(<8 x double>, <8 x i32>, i8, i32)
5379
5380 define <8 x i32>@test_int_x86_avx512_mask_cvtt_pd2dq_512(<8 x double> %x0, <8 x i32> %x1, i8 %x2) {
5381 ; CHECK-LABEL: test_int_x86_avx512_mask_cvtt_pd2dq_512:
5382 ; CHECK:       ## BB#0:
5383 ; CHECK-NEXT:    movzbl %dil, %eax
5384 ; CHECK-NEXT:    kmovw %eax, %k1
5385 ; CHECK-NEXT:    vcvttpd2dq %zmm0, %ymm1 {%k1}
5386 ; CHECK-NEXT:    vcvttpd2dq {sae}, %zmm0, %ymm0
5387 ; CHECK-NEXT:    vpaddd %ymm0, %ymm1, %ymm0
5388 ; CHECK-NEXT:    retq
5389   %res = call <8 x i32> @llvm.x86.avx512.mask.cvttpd2dq.512(<8 x double> %x0, <8 x i32> %x1, i8 %x2, i32 4)
5390   %res1 = call <8 x i32> @llvm.x86.avx512.mask.cvttpd2dq.512(<8 x double> %x0, <8 x i32> %x1, i8 -1, i32 8)
5391   %res2 = add <8 x i32> %res, %res1
5392   ret <8 x i32> %res2
5393 }
5394
5395 declare <8 x double> @llvm.x86.avx512.mask.cvtudq2pd.512(<8 x i32>, <8 x double>, i8)
5396
5397 define <8 x double>@test_int_x86_avx512_mask_cvt_udq2pd_512(<8 x i32> %x0, <8 x double> %x1, i8 %x2) {
5398 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_udq2pd_512:
5399 ; CHECK:       ## BB#0:
5400 ; CHECK-NEXT:    movzbl %dil, %eax
5401 ; CHECK-NEXT:    kmovw %eax, %k1
5402 ; CHECK-NEXT:    vcvtudq2pd %ymm0, %zmm1 {%k1}
5403 ; CHECK-NEXT:    vcvtudq2pd %ymm0, %zmm0
5404 ; CHECK-NEXT:    vaddpd %zmm0, %zmm1, %zmm0
5405 ; CHECK-NEXT:    retq
5406   %res = call <8 x double> @llvm.x86.avx512.mask.cvtudq2pd.512(<8 x i32> %x0, <8 x double> %x1, i8 %x2)
5407   %res1 = call <8 x double> @llvm.x86.avx512.mask.cvtudq2pd.512(<8 x i32> %x0, <8 x double> %x1, i8 -1)
5408   %res2 = fadd <8 x double> %res, %res1
5409   ret <8 x double> %res2
5410 }
5411
5412
5413 declare <16 x float> @llvm.x86.avx512.mask.cvtudq2ps.512(<16 x i32>, <16 x float>, i16, i32)
5414
5415 define <16 x float>@test_int_x86_avx512_mask_cvt_udq2ps_512(<16 x i32> %x0, <16 x float> %x1, i16 %x2) {
5416 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_udq2ps_512:
5417 ; CHECK:       ## BB#0:
5418 ; CHECK-NEXT:    kmovw %edi, %k1
5419 ; CHECK-NEXT:    vcvtudq2ps %zmm0, %zmm1 {%k1}
5420 ; CHECK-NEXT:    vcvtudq2ps {rn-sae}, %zmm0, %zmm0
5421 ; CHECK-NEXT:    vaddps %zmm0, %zmm1, %zmm0
5422 ; CHECK-NEXT:    retq
5423   %res = call <16 x float> @llvm.x86.avx512.mask.cvtudq2ps.512(<16 x i32> %x0, <16 x float> %x1, i16 %x2, i32 4)
5424   %res1 = call <16 x float> @llvm.x86.avx512.mask.cvtudq2ps.512(<16 x i32> %x0, <16 x float> %x1, i16 -1, i32 0)
5425   %res2 = fadd <16 x float> %res, %res1
5426   ret <16 x float> %res2
5427 }
5428
5429 declare <8 x i32> @llvm.x86.avx512.mask.cvttpd2udq.512(<8 x double>, <8 x i32>, i8, i32)
5430
5431 define <8 x i32>@test_int_x86_avx512_mask_cvtt_pd2udq_512(<8 x double> %x0, <8 x i32> %x1, i8 %x2) {
5432 ; CHECK-LABEL: test_int_x86_avx512_mask_cvtt_pd2udq_512:
5433 ; CHECK:       ## BB#0:
5434 ; CHECK-NEXT:    movzbl %dil, %eax
5435 ; CHECK-NEXT:    kmovw %eax, %k1
5436 ; CHECK-NEXT:    vcvttpd2udq %zmm0, %ymm1 {%k1}
5437 ; CHECK-NEXT:    vcvttpd2udq {sae}, %zmm0, %ymm0
5438 ; CHECK-NEXT:    vpaddd %ymm0, %ymm1, %ymm0
5439 ; CHECK-NEXT:    retq
5440   %res = call <8 x i32> @llvm.x86.avx512.mask.cvttpd2udq.512(<8 x double> %x0, <8 x i32> %x1, i8 %x2, i32 4)
5441   %res1 = call <8 x i32> @llvm.x86.avx512.mask.cvttpd2udq.512(<8 x double> %x0, <8 x i32> %x1, i8 -1, i32 8)
5442   %res2 = add <8 x i32> %res, %res1
5443   ret <8 x i32> %res2
5444 }
5445
5446 declare <16 x i32> @llvm.x86.avx512.mask.cvttps2dq.512(<16 x float>, <16 x i32>, i16, i32)
5447
5448 define <16 x i32>@test_int_x86_avx512_mask_cvtt_ps2dq_512(<16 x float> %x0, <16 x i32> %x1, i16 %x2) {
5449 ; CHECK-LABEL: test_int_x86_avx512_mask_cvtt_ps2dq_512:
5450 ; CHECK:       ## BB#0:
5451 ; CHECK-NEXT:    kmovw %edi, %k1
5452 ; CHECK-NEXT:    vcvttps2dq %zmm0, %zmm1 {%k1}
5453 ; CHECK-NEXT:    vcvttps2dq {sae}, %zmm0, %zmm0
5454 ; CHECK-NEXT:    vpaddd %zmm0, %zmm1, %zmm0
5455 ; CHECK-NEXT:    retq
5456   %res = call <16 x i32> @llvm.x86.avx512.mask.cvttps2dq.512(<16 x float> %x0, <16 x i32> %x1, i16 %x2, i32 4)
5457   %res1 = call <16 x i32> @llvm.x86.avx512.mask.cvttps2dq.512(<16 x float> %x0, <16 x i32> %x1, i16 -1, i32 8)
5458   %res2 = add <16 x i32> %res, %res1
5459   ret <16 x i32> %res2
5460 }
5461
5462 declare <16 x i32> @llvm.x86.avx512.mask.cvttps2udq.512(<16 x float>, <16 x i32>, i16, i32)
5463
5464 define <16 x i32>@test_int_x86_avx512_mask_cvtt_ps2udq_512(<16 x float> %x0, <16 x i32> %x1, i16 %x2) {
5465 ; CHECK-LABEL: test_int_x86_avx512_mask_cvtt_ps2udq_512:
5466 ; CHECK:       ## BB#0:
5467 ; CHECK-NEXT:    kmovw %edi, %k1
5468 ; CHECK-NEXT:    vcvttps2udq %zmm0, %zmm1 {%k1}
5469 ; CHECK-NEXT:    vcvttps2udq {sae}, %zmm0, %zmm0
5470 ; CHECK-NEXT:    vpaddd %zmm0, %zmm1, %zmm0
5471 ; CHECK-NEXT:    retq
5472   %res = call <16 x i32> @llvm.x86.avx512.mask.cvttps2udq.512(<16 x float> %x0, <16 x i32> %x1, i16 %x2, i32 4)
5473   %res1 = call <16 x i32> @llvm.x86.avx512.mask.cvttps2udq.512(<16 x float> %x0, <16 x i32> %x1, i16 -1, i32 8)
5474   %res2 = add <16 x i32> %res, %res1
5475   ret <16 x i32> %res2
5476 }
5477
5478
5479 declare <4 x float> @llvm.x86.avx512.mask.scalef.ss(<4 x float>, <4 x float>,<4 x float>, i8, i32)
5480 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) {
5481 ; CHECK-LABEL: test_int_x86_avx512_mask_scalef_ss:
5482 ; CHECK:       ## BB#0:
5483 ; CHECK-NEXT:    andl $1, %edi
5484 ; CHECK-NEXT:    kmovw %edi, %k1
5485 ; CHECK-NEXT:    vscalefss %xmm1, %xmm0, %xmm2 {%k1}
5486 ; CHECK-NEXT:    vscalefss {rn-sae}, %xmm1, %xmm0, %xmm0
5487 ; CHECK-NEXT:    vaddps %xmm0, %xmm2, %xmm0
5488 ; CHECK-NEXT:    retq
5489   %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)
5490   %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)
5491   %res2 = fadd <4 x float> %res, %res1
5492   ret <4 x float> %res2
5493 }
5494
5495 declare <2 x double> @llvm.x86.avx512.mask.scalef.sd(<2 x double>, <2 x double>,<2 x double>, i8, i32)
5496 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) {
5497 ; CHECK-LABEL: test_int_x86_avx512_mask_scalef_sd:
5498 ; CHECK:       ## BB#0:
5499 ; CHECK-NEXT:    andl $1, %edi
5500 ; CHECK-NEXT:    kmovw %edi, %k1
5501 ; CHECK-NEXT:    vscalefsd %xmm1, %xmm0, %xmm2 {%k1}
5502 ; CHECK-NEXT:    vscalefsd {rn-sae}, %xmm1, %xmm0, %xmm0
5503 ; CHECK-NEXT:    vaddpd %xmm0, %xmm2, %xmm0
5504 ; CHECK-NEXT:    retq
5505   %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)
5506   %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)
5507   %res2 = fadd <2 x double> %res, %res1
5508   ret <2 x double> %res2
5509 }
5510
5511 declare <4 x float> @llvm.x86.avx512.mask.getexp.ss(<4 x float>, <4 x float>, <4 x float>, i8, i32) nounwind readnone
5512
5513 define <4 x float> @test_getexp_ss(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2, i8 %mask) {
5514 ; CHECK-LABEL: test_getexp_ss:
5515 ; CHECK:       ## BB#0:
5516 ; CHECK-NEXT:    andl $1, %edi
5517 ; CHECK-NEXT:    kmovw %edi, %k1
5518 ; CHECK-NEXT:    vmovaps %zmm2, %zmm3
5519 ; CHECK-NEXT:    vgetexpss %xmm1, %xmm0, %xmm3 {%k1}
5520 ; CHECK-NEXT:    vgetexpss {sae}, %xmm1, %xmm0, %xmm2 {%k1}
5521 ; CHECK-NEXT:    vgetexpss {sae}, %xmm1, %xmm0, %xmm4 {%k1} {z}
5522 ; CHECK-NEXT:    vgetexpss {sae}, %xmm1, %xmm0, %xmm0
5523 ; CHECK-NEXT:    vaddps %xmm2, %xmm3, %xmm1
5524 ; CHECK-NEXT:    vaddps %xmm0, %xmm4, %xmm0
5525 ; CHECK-NEXT:    vaddps %xmm0, %xmm1, %xmm0
5526 ; CHECK-NEXT:    retq
5527   %res0 = call <4 x float> @llvm.x86.avx512.mask.getexp.ss(<4 x float>%a0, <4 x float> %a1, <4 x float> %a2, i8 %mask, i32 4)
5528   %res1 = call <4 x float> @llvm.x86.avx512.mask.getexp.ss(<4 x float>%a0, <4 x float> %a1, <4 x float> %a2, i8 %mask, i32 8)
5529   %res2 = call <4 x float> @llvm.x86.avx512.mask.getexp.ss(<4 x float>%a0, <4 x float> %a1, <4 x float> zeroinitializer, i8 %mask, i32 8)
5530   %res3 = call <4 x float> @llvm.x86.avx512.mask.getexp.ss(<4 x float>%a0, <4 x float> %a1, <4 x float> zeroinitializer, i8 -1, i32 8)
5531
5532   %res.1 = fadd <4 x float> %res0, %res1
5533   %res.2 = fadd <4 x float> %res2, %res3
5534   %res   = fadd <4 x float> %res.1, %res.2
5535   ret <4 x float> %res
5536 }
5537
5538 declare <2 x double> @llvm.x86.avx512.mask.getexp.sd(<2 x double>, <2 x double>, <2 x double>, i8, i32) nounwind readnone
5539
5540 define <2 x double> @test_getexp_sd(<2 x double> %a0, <2 x double> %a1, <2 x double> %a2, i8 %mask) {
5541 ; CHECK-LABEL: test_getexp_sd:
5542 ; CHECK:       ## BB#0:
5543 ; CHECK-NEXT:    andl $1, %edi
5544 ; CHECK-NEXT:    kmovw %edi, %k1
5545 ; CHECK-NEXT:    vmovaps %zmm2, %zmm3
5546 ; CHECK-NEXT:    vgetexpsd %xmm1, %xmm0, %xmm3 {%k1}
5547 ; CHECK-NEXT:    vgetexpsd %xmm1, %xmm0, %xmm4
5548 ; CHECK-NEXT:    vgetexpsd {sae}, %xmm1, %xmm0, %xmm2 {%k1}
5549 ; CHECK-NEXT:    vgetexpsd {sae}, %xmm1, %xmm0, %xmm0 {%k1} {z}
5550 ; CHECK-NEXT:    vaddpd %xmm2, %xmm3, %xmm1
5551 ; CHECK-NEXT:    vaddpd %xmm4, %xmm0, %xmm0
5552 ; CHECK-NEXT:    vaddpd %xmm0, %xmm1, %xmm0
5553 ; CHECK-NEXT:    retq
5554   %res0 = call <2 x double> @llvm.x86.avx512.mask.getexp.sd(<2 x double>%a0, <2 x double> %a1, <2 x double> %a2, i8 %mask, i32 4)
5555   %res1 = call <2 x double> @llvm.x86.avx512.mask.getexp.sd(<2 x double>%a0, <2 x double> %a1, <2 x double> %a2, i8 %mask, i32 8)
5556   %res2 = call <2 x double> @llvm.x86.avx512.mask.getexp.sd(<2 x double>%a0, <2 x double> %a1, <2 x double> zeroinitializer, i8 %mask, i32 8)
5557   %res3 = call <2 x double> @llvm.x86.avx512.mask.getexp.sd(<2 x double>%a0, <2 x double> %a1, <2 x double> zeroinitializer, i8 -1, i32 4)
5558
5559   %res.1 = fadd <2 x double> %res0, %res1
5560   %res.2 = fadd <2 x double> %res2, %res3
5561   %res   = fadd <2 x double> %res.1, %res.2
5562   ret <2 x double> %res
5563 }
5564
5565 declare i8 @llvm.x86.avx512.mask.cmp.sd(<2 x double>, <2 x double>, i32, i8, i32)
5566
5567 define i8@test_int_x86_avx512_mask_cmp_sd(<2 x double> %x0, <2 x double> %x1, i8 %x3, i32 %x4) {
5568 ; CHECK-LABEL: test_int_x86_avx512_mask_cmp_sd:
5569 ; CHECK:       ## BB#0:
5570 ; CHECK-NEXT:    andl $1, %edi
5571 ; CHECK-NEXT:    kmovw %edi, %k1
5572 ; CHECK-NEXT:    vcmpnltsd {sae}, %xmm1, %xmm0, %k0 {%k1}
5573 ; CHECK-NEXT:    kmovw %k0, %eax
5574 ; CHECK-NEXT:    shlb $7, %al
5575 ; CHECK-NEXT:    sarb $7, %al
5576 ; CHECK-NEXT:    retq
5577
5578   %res4 = call i8 @llvm.x86.avx512.mask.cmp.sd(<2 x double> %x0, <2 x double> %x1, i32 5, i8 %x3, i32 8)
5579   ret i8 %res4
5580 }
5581
5582 define i8@test_int_x86_avx512_mask_cmp_sd_all(<2 x double> %x0, <2 x double> %x1, i8 %x3, i32 %x4) {
5583 ; CHECK-LABEL: test_int_x86_avx512_mask_cmp_sd_all:
5584 ; CHECK:       ## BB#0:
5585 ; CHECK-NEXT:    vcmpunordsd {sae}, %xmm1, %xmm0, %k0
5586 ; CHECK-NEXT:    vcmplesd %xmm1, %xmm0, %k1
5587 ; CHECK-NEXT:    korw %k0, %k1, %k0
5588 ; CHECK-NEXT:    vcmpnltsd {sae}, %xmm1, %xmm0, %k1
5589 ; CHECK-NEXT:    vcmpneqsd %xmm1, %xmm0, %k2
5590 ; CHECK-NEXT:    korw %k1, %k2, %k1
5591 ; CHECK-NEXT:    andl $1, %edi
5592 ; CHECK-NEXT:    kmovw %edi, %k2
5593 ; CHECK-NEXT:    kandw %k2, %k1, %k1
5594 ; CHECK-NEXT:    korw %k1, %k0, %k0
5595 ; CHECK-NEXT:    kmovw %k0, %eax
5596 ; CHECK-NEXT:    shlb $7, %al
5597 ; CHECK-NEXT:    sarb $7, %al
5598 ; CHECK-NEXT:    retq
5599
5600   %res1 = call i8 @llvm.x86.avx512.mask.cmp.sd(<2 x double> %x0, <2 x double> %x1, i32 2, i8 -1, i32 4)
5601   %res2 = call i8 @llvm.x86.avx512.mask.cmp.sd(<2 x double> %x0, <2 x double> %x1, i32 3, i8 -1, i32 8)
5602   %res3 = call i8 @llvm.x86.avx512.mask.cmp.sd(<2 x double> %x0, <2 x double> %x1, i32 4, i8 %x3, i32 4)
5603   %res4 = call i8 @llvm.x86.avx512.mask.cmp.sd(<2 x double> %x0, <2 x double> %x1, i32 5, i8 %x3, i32 8)
5604
5605   %res11 = or i8 %res1, %res2
5606   %res12 = or i8 %res3, %res4
5607   %res13 = or i8 %res11, %res12
5608   ret i8 %res13
5609 }
5610
5611 declare i8 @llvm.x86.avx512.mask.cmp.ss(<4 x float>, <4 x float>, i32, i8, i32)
5612
5613 define i8@test_int_x86_avx512_mask_cmp_ss(<4 x float> %x0, <4 x float> %x1, i8 %x3, i32 %x4) {
5614 ; CHECK-LABEL: test_int_x86_avx512_mask_cmp_ss:
5615 ; CHECK:       ## BB#0:
5616 ; CHECK-NEXT:    andl $1, %edi
5617 ; CHECK-NEXT:    kmovw %edi, %k1
5618 ; CHECK-NEXT:    vcmpunordss %xmm1, %xmm0, %k0 {%k1}
5619 ; CHECK-NEXT:    kmovw %k0, %eax
5620 ; CHECK-NEXT:    shlb $7, %al
5621 ; CHECK-NEXT:    sarb $7, %al
5622 ; CHECK-NEXT:    retq
5623
5624   %res2 = call i8 @llvm.x86.avx512.mask.cmp.ss(<4 x float> %x0, <4 x float> %x1, i32 3, i8 %x3, i32 4)
5625   ret i8 %res2
5626 }
5627
5628
5629 define i8@test_int_x86_avx512_mask_cmp_ss_all(<4 x float> %x0, <4 x float> %x1, i8 %x3, i32 %x4) {
5630 ; CHECK-LABEL: test_int_x86_avx512_mask_cmp_ss_all:
5631 ; CHECK:       ## BB#0:
5632 ; CHECK-NEXT:    vcmpless %xmm1, %xmm0, %k1
5633 ; CHECK-NEXT:    vcmpunordss {sae}, %xmm1, %xmm0, %k0 {%k1}
5634 ; CHECK-NEXT:    vcmpneqss %xmm1, %xmm0, %k1
5635 ; CHECK-NEXT:    vcmpnltss {sae}, %xmm1, %xmm0, %k1 {%k1}
5636 ; CHECK-NEXT:    andl $1, %edi
5637 ; CHECK-NEXT:    kmovw %edi, %k2
5638 ; CHECK-NEXT:    kandw %k2, %k1, %k1
5639 ; CHECK-NEXT:    kandw %k1, %k0, %k0
5640 ; CHECK-NEXT:    kmovw %k0, %eax
5641 ; CHECK-NEXT:    shlb $7, %al
5642 ; CHECK-NEXT:    sarb $7, %al
5643 ; CHECK-NEXT:    retq
5644   %res1 = call i8 @llvm.x86.avx512.mask.cmp.ss(<4 x float> %x0, <4 x float> %x1, i32 2, i8 -1, i32 4)
5645   %res2 = call i8 @llvm.x86.avx512.mask.cmp.ss(<4 x float> %x0, <4 x float> %x1, i32 3, i8 -1, i32 8)
5646   %res3 = call i8 @llvm.x86.avx512.mask.cmp.ss(<4 x float> %x0, <4 x float> %x1, i32 4, i8 %x3, i32 4)
5647   %res4 = call i8 @llvm.x86.avx512.mask.cmp.ss(<4 x float> %x0, <4 x float> %x1, i32 5, i8 %x3, i32 8)
5648
5649   %res11 = and i8 %res1, %res2
5650   %res12 = and i8 %res3, %res4
5651   %res13 = and i8 %res11, %res12
5652   ret i8 %res13
5653 }
5654
5655 declare <16 x float> @llvm.x86.avx512.mask.shuf.f32x4(<16 x float>, <16 x float>, i32, <16 x float>, i16)
5656
5657 define <16 x float>@test_int_x86_avx512_mask_shuf_f32x4(<16 x float> %x0, <16 x float> %x1, <16 x float> %x3, i16 %x4) {
5658 ; CHECK-LABEL: test_int_x86_avx512_mask_shuf_f32x4:
5659 ; CHECK:       ## BB#0:
5660 ; CHECK-NEXT:    kmovw %edi, %k1
5661 ; CHECK-NEXT:    vshuff32x4 {{.*#+}} zmm2 = zmm0[8,9,10,11,4,5,6,7],zmm1[4,5,6,7,0,1,2,3]
5662 ; CHECK-NEXT:    vshuff32x4 {{.*#+}} zmm0 = zmm0[8,9,10,11,4,5,6,7],zmm1[4,5,6,7,0,1,2,3]
5663 ; CHECK-NEXT:    vaddps %zmm0, %zmm2, %zmm0
5664 ; CHECK-NEXT:    retq
5665   %res = call <16 x float> @llvm.x86.avx512.mask.shuf.f32x4(<16 x float> %x0, <16 x float> %x1, i32 22, <16 x float> %x3, i16 %x4)
5666   %res1 = call <16 x float> @llvm.x86.avx512.mask.shuf.f32x4(<16 x float> %x0, <16 x float> %x1, i32 22, <16 x float> %x3, i16 -1)
5667   %res2 = fadd <16 x float> %res, %res1
5668   ret <16 x float> %res2
5669 }
5670
5671 declare <8 x double> @llvm.x86.avx512.mask.shuf.f64x2(<8 x double>, <8 x double>, i32, <8 x double>, i8)
5672
5673 define <8 x double>@test_int_x86_avx512_mask_shuf_f64x2(<8 x double> %x0, <8 x double> %x1, <8 x double> %x3, i8 %x4) {
5674 ; CHECK-LABEL: test_int_x86_avx512_mask_shuf_f64x2:
5675 ; CHECK:       ## BB#0:
5676 ; CHECK-NEXT:    movzbl %dil, %eax
5677 ; CHECK-NEXT:    kmovw %eax, %k1
5678 ; CHECK-NEXT:    vshuff64x2 {{.*#+}} zmm2 = zmm0[4,5,2,3],zmm1[2,3,0,1]
5679 ; CHECK-NEXT:    vshuff64x2 {{.*#+}} zmm3 = zmm0[4,5,2,3],zmm1[2,3,0,1]
5680 ; CHECK-NEXT:    vshuff64x2 {{.*#+}} zmm0 = zmm0[4,5,2,3],zmm1[2,3,0,1]
5681 ; CHECK-NEXT:    vaddpd %zmm0, %zmm2, %zmm0
5682 ; CHECK-NEXT:    vaddpd %zmm3, %zmm0, %zmm0
5683 ; CHECK-NEXT:    retq
5684   %res = call <8 x double> @llvm.x86.avx512.mask.shuf.f64x2(<8 x double> %x0, <8 x double> %x1, i32 22, <8 x double> %x3, i8 %x4)
5685   %res1 = call <8 x double> @llvm.x86.avx512.mask.shuf.f64x2(<8 x double> %x0, <8 x double> %x1, i32 22, <8 x double> %x3, i8 -1)
5686   %res2 = call <8 x double> @llvm.x86.avx512.mask.shuf.f64x2(<8 x double> %x0, <8 x double> %x1, i32 22, <8 x double> zeroinitializer, i8 %x4)
5687
5688   %res3 = fadd <8 x double> %res, %res1
5689   %res4 = fadd <8 x double> %res3, %res2
5690   ret <8 x double> %res4
5691 }
5692
5693 declare <16 x i32> @llvm.x86.avx512.mask.shuf.i32x4(<16 x i32>, <16 x i32>, i32, <16 x i32>, i16)
5694
5695 define <16 x i32>@test_int_x86_avx512_mask_shuf_i32x4(<16 x i32> %x0, <16 x i32> %x1, <16 x i32> %x3, i16 %x4) {
5696 ; CHECK-LABEL: test_int_x86_avx512_mask_shuf_i32x4:
5697 ; CHECK:       ## BB#0:
5698 ; CHECK-NEXT:    kmovw %edi, %k1
5699 ; CHECK-NEXT:    vshufi32x4 {{.*#+}} zmm2 = zmm0[8,9,10,11,4,5,6,7],zmm1[4,5,6,7,0,1,2,3]
5700 ; CHECK-NEXT:    vshufi32x4 {{.*#+}} zmm0 = zmm0[8,9,10,11,4,5,6,7],zmm1[4,5,6,7,0,1,2,3]
5701 ; CHECK-NEXT:    vpaddd %zmm0, %zmm2, %zmm0
5702 ; CHECK-NEXT:    retq
5703   %res = call <16 x i32> @llvm.x86.avx512.mask.shuf.i32x4(<16 x i32> %x0, <16 x i32> %x1, i32 22, <16 x i32> %x3, i16 %x4)
5704   %res1 = call <16 x i32> @llvm.x86.avx512.mask.shuf.i32x4(<16 x i32> %x0, <16 x i32> %x1, i32 22, <16 x i32> %x3, i16 -1)
5705   %res2 = add <16 x i32> %res, %res1
5706   ret <16 x i32> %res2
5707 }
5708
5709 declare <8 x i64> @llvm.x86.avx512.mask.shuf.i64x2(<8 x i64>, <8 x i64>, i32, <8 x i64>, i8)
5710
5711 define <8 x i64>@test_int_x86_avx512_mask_shuf_i64x2(<8 x i64> %x0, <8 x i64> %x1, <8 x i64> %x3, i8 %x4) {
5712 ; CHECK-LABEL: test_int_x86_avx512_mask_shuf_i64x2:
5713 ; CHECK:       ## BB#0:
5714 ; CHECK-NEXT:    movzbl %dil, %eax
5715 ; CHECK-NEXT:    kmovw %eax, %k1
5716 ; CHECK-NEXT:    vshufi64x2 {{.*#+}} zmm2 = zmm0[4,5,2,3],zmm1[2,3,0,1]
5717 ; CHECK-NEXT:    vshufi64x2 {{.*#+}} zmm0 = zmm0[4,5,2,3],zmm1[2,3,0,1]
5718 ; CHECK-NEXT:    vpaddq %zmm0, %zmm2, %zmm0
5719 ; CHECK-NEXT:    retq
5720   %res = call <8 x i64> @llvm.x86.avx512.mask.shuf.i64x2(<8 x i64> %x0, <8 x i64> %x1, i32 22, <8 x i64> %x3, i8 %x4)
5721   %res1 = call <8 x i64> @llvm.x86.avx512.mask.shuf.i64x2(<8 x i64> %x0, <8 x i64> %x1, i32 22, <8 x i64> %x3, i8 -1)
5722   %res2 = add <8 x i64> %res, %res1
5723   ret <8 x i64> %res2
5724 }
5725
5726 declare <8 x double> @llvm.x86.avx512.mask.getmant.pd.512(<8 x double>, i32, <8 x double>, i8, i32)
5727
5728 define <8 x double>@test_int_x86_avx512_mask_getmant_pd_512(<8 x double> %x0, <8 x double> %x2, i8 %x3) {
5729 ; CHECK-LABEL: test_int_x86_avx512_mask_getmant_pd_512:
5730 ; CHECK:       ## BB#0:
5731 ; CHECK-NEXT:    movzbl %dil, %eax
5732 ; CHECK-NEXT:    kmovw %eax, %k1
5733 ; CHECK-NEXT:    vgetmantpd $11, %zmm0, %zmm1 {%k1}
5734 ; CHECK-NEXT:    vgetmantpd $11,{sae}, %zmm0, %zmm0
5735 ; CHECK-NEXT:    vaddpd %zmm0, %zmm1, %zmm0
5736 ; CHECK-NEXT:    retq
5737   %res = call <8 x double> @llvm.x86.avx512.mask.getmant.pd.512(<8 x double> %x0, i32 11, <8 x double> %x2, i8 %x3, i32 4)
5738   %res1 = call <8 x double> @llvm.x86.avx512.mask.getmant.pd.512(<8 x double> %x0, i32 11, <8 x double> %x2, i8 -1, i32 8)
5739   %res2 = fadd <8 x double> %res, %res1
5740   ret <8 x double> %res2
5741 }
5742
5743 declare <16 x float> @llvm.x86.avx512.mask.getmant.ps.512(<16 x float>, i32, <16 x float>, i16, i32)
5744
5745 define <16 x float>@test_int_x86_avx512_mask_getmant_ps_512(<16 x float> %x0, <16 x float> %x2, i16 %x3) {
5746 ; CHECK-LABEL: test_int_x86_avx512_mask_getmant_ps_512:
5747 ; CHECK:       ## BB#0:
5748 ; CHECK-NEXT:    kmovw %edi, %k1
5749 ; CHECK-NEXT:    vgetmantps $11, %zmm0, %zmm1 {%k1}
5750 ; CHECK-NEXT:    vgetmantps $11,{sae}, %zmm0, %zmm0
5751 ; CHECK-NEXT:    vaddps %zmm0, %zmm1, %zmm0
5752 ; CHECK-NEXT:    retq
5753   %res = call <16 x float> @llvm.x86.avx512.mask.getmant.ps.512(<16 x float> %x0, i32 11, <16 x float> %x2, i16 %x3, i32 4)
5754   %res1 = call <16 x float> @llvm.x86.avx512.mask.getmant.ps.512(<16 x float> %x0, i32 11, <16 x float> %x2, i16 -1, i32 8)
5755   %res2 = fadd <16 x float> %res, %res1
5756   ret <16 x float> %res2
5757 }
5758
5759 declare <2 x double> @llvm.x86.avx512.mask.getmant.sd(<2 x double>, <2 x double>, i32, <2 x double>, i8, i32)
5760
5761 define <2 x double>@test_int_x86_avx512_mask_getmant_sd(<2 x double> %x0, <2 x double> %x1, <2 x double> %x2, i8 %x3) {
5762 ; CHECK-LABEL: test_int_x86_avx512_mask_getmant_sd:
5763 ; CHECK:       ## BB#0:
5764 ; CHECK-NEXT:    andl $1, %edi
5765 ; CHECK-NEXT:    kmovw %edi, %k1
5766 ; CHECK-NEXT:    vmovaps %zmm2, %zmm3
5767 ; CHECK-NEXT:    vgetmantsd $11, %xmm1, %xmm0, %xmm3 {%k1}
5768 ; CHECK-NEXT:    vgetmantsd $11, %xmm1, %xmm0, %xmm4 {%k1} {z}
5769 ; CHECK-NEXT:    vgetmantsd $11, %xmm1, %xmm0, %xmm5
5770 ; CHECK-NEXT:    vgetmantsd $11,{sae}, %xmm1, %xmm0, %xmm2 {%k1}
5771 ; CHECK-NEXT:    vaddpd %xmm4, %xmm3, %xmm0
5772 ; CHECK-NEXT:    vaddpd %xmm5, %xmm2, %xmm1
5773 ; CHECK-NEXT:    vaddpd %xmm1, %xmm0, %xmm0
5774 ; CHECK-NEXT:    retq
5775   %res  = call <2 x double> @llvm.x86.avx512.mask.getmant.sd(<2 x double> %x0, <2 x double> %x1, i32 11, <2 x double> %x2, i8 %x3, i32 4)
5776   %res1 = call <2 x double> @llvm.x86.avx512.mask.getmant.sd(<2 x double> %x0, <2 x double> %x1, i32 11, <2 x double> zeroinitializer, i8 %x3, i32 4)
5777   %res2 = call <2 x double> @llvm.x86.avx512.mask.getmant.sd(<2 x double> %x0, <2 x double> %x1, i32 11, <2 x double> %x2, i8 %x3, i32 8)
5778   %res3 = call <2 x double> @llvm.x86.avx512.mask.getmant.sd(<2 x double> %x0, <2 x double> %x1, i32 11, <2 x double> %x2, i8 -1, i32 4)
5779   %res11 = fadd <2 x double> %res, %res1
5780   %res12 = fadd <2 x double> %res2, %res3
5781   %res13 = fadd <2 x double> %res11, %res12
5782   ret <2 x double> %res13
5783 }
5784
5785 declare <4 x float> @llvm.x86.avx512.mask.getmant.ss(<4 x float>, <4 x float>, i32, <4 x float>, i8, i32)
5786
5787 define <4 x float>@test_int_x86_avx512_mask_getmant_ss(<4 x float> %x0, <4 x float> %x1, <4 x float> %x2, i8 %x3) {
5788 ; CHECK-LABEL: test_int_x86_avx512_mask_getmant_ss:
5789 ; CHECK:       ## BB#0:
5790 ; CHECK-NEXT:    andl $1, %edi
5791 ; CHECK-NEXT:    kmovw %edi, %k1
5792 ; CHECK-NEXT:    vgetmantss $11, %xmm1, %xmm0, %xmm2 {%k1}
5793 ; CHECK-NEXT:    vgetmantss $11, %xmm1, %xmm0, %xmm3 {%k1} {z}
5794 ; CHECK-NEXT:    vgetmantss $11, %xmm1, %xmm0, %xmm4
5795 ; CHECK-NEXT:    vgetmantss $11,{sae}, %xmm1, %xmm0, %xmm0
5796 ; CHECK-NEXT:    vaddps %xmm3, %xmm2, %xmm1
5797 ; CHECK-NEXT:    vaddps %xmm4, %xmm0, %xmm0
5798 ; CHECK-NEXT:    vaddps %xmm0, %xmm1, %xmm0
5799 ; CHECK-NEXT:    retq
5800   %res  = call <4 x float> @llvm.x86.avx512.mask.getmant.ss(<4 x float> %x0, <4 x float> %x1, i32 11, <4 x float> %x2, i8 %x3, i32 4)
5801   %res1 = call <4 x float> @llvm.x86.avx512.mask.getmant.ss(<4 x float> %x0, <4 x float> %x1, i32 11, <4 x float> zeroinitializer, i8 %x3, i32 4)
5802   %res2 = call <4 x float> @llvm.x86.avx512.mask.getmant.ss(<4 x float> %x0, <4 x float> %x1, i32 11, <4 x float> %x2, i8 -1, i32 8)
5803   %res3 = call <4 x float> @llvm.x86.avx512.mask.getmant.ss(<4 x float> %x0, <4 x float> %x1, i32 11, <4 x float> %x2, i8 -1, i32 4)
5804   %res11 = fadd <4 x float> %res, %res1
5805   %res12 = fadd <4 x float> %res2, %res3
5806   %res13 = fadd <4 x float> %res11, %res12
5807   ret <4 x float> %res13
5808 }
5809
5810 declare <8 x double> @llvm.x86.avx512.mask.shuf.pd.512(<8 x double>, <8 x double>, i32, <8 x double>, i8)
5811
5812 define <8 x double>@test_int_x86_avx512_mask_shuf_pd_512(<8 x double> %x0, <8 x double> %x1, <8 x double> %x3, i8 %x4) {
5813 ; CHECK-LABEL: test_int_x86_avx512_mask_shuf_pd_512:
5814 ; CHECK:       ## BB#0:
5815 ; CHECK-NEXT:    movzbl %dil, %eax
5816 ; CHECK-NEXT:    kmovw %eax, %k1
5817 ; CHECK-NEXT:    vshufpd {{.*#+}} zmm2 = zmm2[0],k1[1],zmm2[3],k1[2],zmm2[5],k1[4],zmm2[6],k1[6]
5818 ; CHECK-NEXT:    vshufpd {{.*#+}} zmm3 = k1[0],zmm0[1],k1[3],zmm0[2],k1[5],zmm0[4],k1[6],zmm0[6]
5819 ; CHECK-NEXT:    vshufpd {{.*#+}} zmm0 = zmm0[0],zmm1[1],zmm0[3],zmm1[2],zmm0[5],zmm1[4],zmm0[6],zmm1[6]
5820 ; CHECK-NEXT:    vaddpd %zmm0, %zmm2, %zmm0
5821 ; CHECK-NEXT:    vaddpd %zmm3, %zmm0, %zmm0
5822 ; CHECK-NEXT:    retq
5823   %res = call <8 x double> @llvm.x86.avx512.mask.shuf.pd.512(<8 x double> %x0, <8 x double> %x1, i32 22, <8 x double> %x3, i8 %x4)
5824   %res1 = call <8 x double> @llvm.x86.avx512.mask.shuf.pd.512(<8 x double> %x0, <8 x double> %x1, i32 22, <8 x double> %x3, i8 -1)
5825   %res2 = call <8 x double> @llvm.x86.avx512.mask.shuf.pd.512(<8 x double> %x0, <8 x double> %x1, i32 22, <8 x double> zeroinitializer, i8 %x4)
5826
5827   %res3 = fadd <8 x double> %res, %res1
5828   %res4 = fadd <8 x double> %res3, %res2
5829   ret <8 x double> %res4
5830 }
5831
5832 declare <16 x float> @llvm.x86.avx512.mask.shuf.ps.512(<16 x float>, <16 x float>, i32, <16 x float>, i16)
5833
5834 define <16 x float>@test_int_x86_avx512_mask_shuf_ps_512(<16 x float> %x0, <16 x float> %x1, <16 x float> %x3, i16 %x4) {
5835 ; CHECK-LABEL: test_int_x86_avx512_mask_shuf_ps_512:
5836 ; CHECK:       ## BB#0:
5837 ; CHECK-NEXT:    kmovw %edi, %k1
5838 ; CHECK-NEXT:    vshufps {{.*#+}} zmm2 = zmm2[2,1],k1[1,0],zmm2[6,5],k1[5,4],zmm2[10,9],k1[9,8],zmm2[14,13],k1[13,12]
5839 ; CHECK-NEXT:    vshufps {{.*#+}} zmm0 = zmm0[2,1],zmm1[1,0],zmm0[6,5],zmm1[5,4],zmm0[10,9],zmm1[9,8],zmm0[14,13],zmm1[13,12]
5840 ; CHECK-NEXT:    vaddps %zmm0, %zmm2, %zmm0
5841 ; CHECK-NEXT:    retq
5842   %res = call <16 x float> @llvm.x86.avx512.mask.shuf.ps.512(<16 x float> %x0, <16 x float> %x1, i32 22, <16 x float> %x3, i16 %x4)
5843   %res1 = call <16 x float> @llvm.x86.avx512.mask.shuf.ps.512(<16 x float> %x0, <16 x float> %x1, i32 22, <16 x float> %x3, i16 -1)
5844   %res2 = fadd <16 x float> %res, %res1
5845   ret <16 x float> %res2
5846 }
5847
5848 declare <8 x double> @llvm.x86.avx512.mask.vpermil.pd.512(<8 x double>, i32, <8 x double>, i8)
5849
5850 define <8 x double>@test_int_x86_avx512_mask_vpermil_pd_512(<8 x double> %x0, <8 x double> %x2, i8 %x3) {
5851 ; CHECK-LABEL: test_int_x86_avx512_mask_vpermil_pd_512:
5852 ; CHECK:       ## BB#0:
5853 ; CHECK-NEXT:    movzbl %dil, %eax
5854 ; CHECK-NEXT:    kmovw %eax, %k1
5855 ; CHECK-NEXT:    vpermilpd {{.*#+}} zmm1 = zmm1[0,1,3,2,5,4,6,6]
5856 ; CHECK-NEXT:    vpermilpd {{.*#+}} zmm2 = k1[0,1,3,2,5,4,6,6]
5857 ; CHECK-NEXT:    vpermilpd {{.*#+}} zmm0 = zmm0[0,1,3,2,5,4,6,6]
5858 ; CHECK-NEXT:    vaddpd %zmm2, %zmm1, %zmm1
5859 ; CHECK-NEXT:    vaddpd %zmm0, %zmm1, %zmm0
5860 ; CHECK-NEXT:    retq
5861   %res = call <8 x double> @llvm.x86.avx512.mask.vpermil.pd.512(<8 x double> %x0, i32 22, <8 x double> %x2, i8 %x3)
5862   %res1 = call <8 x double> @llvm.x86.avx512.mask.vpermil.pd.512(<8 x double> %x0, i32 22, <8 x double> zeroinitializer, i8 %x3)
5863   %res2 = call <8 x double> @llvm.x86.avx512.mask.vpermil.pd.512(<8 x double> %x0, i32 22, <8 x double> %x2, i8 -1)
5864   %res3 = fadd <8 x double> %res, %res1
5865   %res4 = fadd <8 x double> %res3, %res2
5866   ret <8 x double> %res4
5867 }
5868
5869 declare <16 x float> @llvm.x86.avx512.mask.vpermil.ps.512(<16 x float>, i32, <16 x float>, i16)
5870
5871 define <16 x float>@test_int_x86_avx512_mask_vpermil_ps_512(<16 x float> %x0, <16 x float> %x2, i16 %x3) {
5872 ; CHECK-LABEL: test_int_x86_avx512_mask_vpermil_ps_512:
5873 ; CHECK:       ## BB#0:
5874 ; CHECK-NEXT:    kmovw %edi, %k1
5875 ; CHECK-NEXT:    vpermilps {{.*#+}} zmm1 = zmm1[2,1,1,0,6,5,5,4,10,9,9,8,14,13,13,12]
5876 ; CHECK-NEXT:    vpermilps {{.*#+}} zmm2 = k1[2,1,1,0,6,5,5,4,10,9,9,8,14,13,13,12]
5877 ; CHECK-NEXT:    vpermilps {{.*#+}} zmm0 = zmm0[2,1,1,0,6,5,5,4,10,9,9,8,14,13,13,12]
5878 ; CHECK-NEXT:    vaddps %zmm2, %zmm1, %zmm1
5879 ; CHECK-NEXT:    vaddps %zmm0, %zmm1, %zmm0
5880 ; CHECK-NEXT:    retq
5881   %res = call <16 x float> @llvm.x86.avx512.mask.vpermil.ps.512(<16 x float> %x0, i32 22, <16 x float> %x2, i16 %x3)
5882   %res1 = call <16 x float> @llvm.x86.avx512.mask.vpermil.ps.512(<16 x float> %x0, i32 22, <16 x float> zeroinitializer, i16 %x3)
5883   %res2 = call <16 x float> @llvm.x86.avx512.mask.vpermil.ps.512(<16 x float> %x0, i32 22, <16 x float> %x2, i16 -1)
5884   %res3 = fadd <16 x float> %res, %res1
5885   %res4 = fadd <16 x float> %res3, %res2
5886   ret <16 x float> %res4
5887 }
5888
5889 declare <8 x double> @llvm.x86.avx512.mask.vpermilvar.pd.512(<8 x double>, <8 x i64>, <8 x double>, i8)
5890
5891 define <8 x double>@test_int_x86_avx512_mask_vpermilvar_pd_512(<8 x double> %x0, <8 x i64> %x1, <8 x double> %x2, i8 %x3) {
5892 ; CHECK-LABEL: test_int_x86_avx512_mask_vpermilvar_pd_512:
5893 ; CHECK:       ## BB#0:
5894 ; CHECK-NEXT:    movzbl %dil, %eax
5895 ; CHECK-NEXT:    kmovw %eax, %k1
5896 ; CHECK-NEXT:    vpermilpd %zmm1, %zmm0, %zmm2 {%k1}
5897 ; CHECK-NEXT:    vpermilpd %zmm1, %zmm0, %zmm3 {%k1} {z}
5898 ; CHECK-NEXT:    vpermilpd %zmm1, %zmm0, %zmm0
5899 ; CHECK-NEXT:    vaddpd %zmm3, %zmm2, %zmm1
5900 ; CHECK-NEXT:    vaddpd %zmm1, %zmm0, %zmm0
5901 ; CHECK-NEXT:    retq
5902   %res = call <8 x double> @llvm.x86.avx512.mask.vpermilvar.pd.512(<8 x double> %x0, <8 x i64> %x1, <8 x double> %x2, i8 %x3)
5903   %res1 = call <8 x double> @llvm.x86.avx512.mask.vpermilvar.pd.512(<8 x double> %x0, <8 x i64> %x1, <8 x double> zeroinitializer, i8 %x3)
5904   %res2 = call <8 x double> @llvm.x86.avx512.mask.vpermilvar.pd.512(<8 x double> %x0, <8 x i64> %x1, <8 x double> %x2, i8 -1)
5905   %res3 = fadd <8 x double> %res, %res1
5906   %res4 = fadd <8 x double> %res2, %res3
5907   ret <8 x double> %res4
5908 }
5909
5910 declare <16 x float> @llvm.x86.avx512.mask.vpermilvar.ps.512(<16 x float>, <16 x i32>, <16 x float>, i16)
5911
5912 define <16 x float>@test_int_x86_avx512_mask_vpermilvar_ps_512(<16 x float> %x0, <16 x i32> %x1, <16 x float> %x2, i16 %x3) {
5913 ; CHECK-LABEL: test_int_x86_avx512_mask_vpermilvar_ps_512:
5914 ; CHECK:       ## BB#0:
5915 ; CHECK-NEXT:    kmovw %edi, %k1
5916 ; CHECK-NEXT:    vpermilps %zmm1, %zmm0, %zmm2 {%k1}
5917 ; CHECK-NEXT:    vpermilps %zmm1, %zmm0, %zmm3 {%k1} {z}
5918 ; CHECK-NEXT:    vpermilps %zmm1, %zmm0, %zmm0
5919 ; CHECK-NEXT:    vaddps %zmm3, %zmm2, %zmm1
5920 ; CHECK-NEXT:    vaddps %zmm1, %zmm0, %zmm0
5921 ; CHECK-NEXT:    retq
5922   %res = call <16 x float> @llvm.x86.avx512.mask.vpermilvar.ps.512(<16 x float> %x0, <16 x i32> %x1, <16 x float> %x2, i16 %x3)
5923   %res1 = call <16 x float> @llvm.x86.avx512.mask.vpermilvar.ps.512(<16 x float> %x0, <16 x i32> %x1, <16 x float> zeroinitializer, i16 %x3)
5924   %res2 = call <16 x float> @llvm.x86.avx512.mask.vpermilvar.ps.512(<16 x float> %x0, <16 x i32> %x1, <16 x float> %x2, i16 -1)
5925   %res3 = fadd <16 x float> %res, %res1
5926   %res4 = fadd <16 x float> %res2, %res3
5927   ret <16 x float> %res4
5928 }
5929
5930 declare <16 x float> @llvm.x86.avx512.mask.insertf32x4.512(<16 x float>, <4 x float>, i32, <16 x float>, i8)
5931
5932 define <16 x float>@test_int_x86_avx512_mask_insertf32x4_512(<16 x float> %x0, <4 x float> %x1, <16 x float> %x3, i8 %x4) {
5933 ; CHECK-LABEL: test_int_x86_avx512_mask_insertf32x4_512:
5934 ; CHECK:       ## BB#0:
5935 ; CHECK-NEXT:    kmovw %edi, %k1
5936 ; CHECK-NEXT:    vinsertf32x4 $1, %xmm1, %zmm0, %zmm2 {%k1}
5937 ; CHECK-NEXT:    vinsertf32x4 $1, %xmm1, %zmm0, %zmm3 {%k1} {z}
5938 ; CHECK-NEXT:    vinsertf32x4 $1, %xmm1, %zmm0, %zmm0
5939 ; CHECK-NEXT:    vaddps %zmm0, %zmm2, %zmm0
5940 ; CHECK-NEXT:    vaddps %zmm0, %zmm3, %zmm0
5941 ; CHECK-NEXT:    retq
5942   %res = call <16 x float> @llvm.x86.avx512.mask.insertf32x4.512(<16 x float> %x0, <4 x float> %x1, i32 1, <16 x float> %x3, i8 %x4)
5943   %res1 = call <16 x float> @llvm.x86.avx512.mask.insertf32x4.512(<16 x float> %x0, <4 x float> %x1, i32 1, <16 x float> %x3, i8 -1)
5944   %res2 = call <16 x float> @llvm.x86.avx512.mask.insertf32x4.512(<16 x float> %x0, <4 x float> %x1, i32 1, <16 x float> zeroinitializer, i8 %x4)
5945   %res3 = fadd <16 x float> %res, %res1
5946   %res4 = fadd <16 x float> %res2, %res3
5947   ret <16 x float> %res4
5948 }
5949
5950 declare <16 x i32> @llvm.x86.avx512.mask.inserti32x4.512(<16 x i32>, <4 x i32>, i32, <16 x i32>, i8)
5951
5952 define <16 x i32>@test_int_x86_avx512_mask_inserti32x4_512(<16 x i32> %x0, <4 x i32> %x1, <16 x i32> %x3, i8 %x4) {
5953 ; CHECK-LABEL: test_int_x86_avx512_mask_inserti32x4_512:
5954 ; CHECK:       ## BB#0:
5955 ; CHECK-NEXT:    kmovw %edi, %k1
5956 ; CHECK-NEXT:    vinserti32x4 $1, %xmm1, %zmm0, %zmm2 {%k1}
5957 ; CHECK-NEXT:    vinserti32x4 $1, %xmm1, %zmm0, %zmm3 {%k1} {z}
5958 ; CHECK-NEXT:    vinserti32x4 $1, %xmm1, %zmm0, %zmm0
5959 ; CHECK-NEXT:    vpaddd %zmm0, %zmm2, %zmm0
5960 ; CHECK-NEXT:    vpaddd %zmm0, %zmm3, %zmm0
5961 ; CHECK-NEXT:    retq
5962   %res = call <16 x i32> @llvm.x86.avx512.mask.inserti32x4.512(<16 x i32> %x0, <4 x i32> %x1, i32 1, <16 x i32> %x3, i8 %x4)
5963   %res1 = call <16 x i32> @llvm.x86.avx512.mask.inserti32x4.512(<16 x i32> %x0, <4 x i32> %x1, i32 1, <16 x i32> %x3, i8 -1)
5964   %res2 = call <16 x i32> @llvm.x86.avx512.mask.inserti32x4.512(<16 x i32> %x0, <4 x i32> %x1, i32 1, <16 x i32> zeroinitializer, i8 %x4)
5965   %res3 = add <16 x i32> %res, %res1
5966   %res4 = add <16 x i32> %res2, %res3
5967   ret <16 x i32> %res4
5968 }
5969
5970 declare <8 x double> @llvm.x86.avx512.mask.insertf64x4.512(<8 x double>, <4 x double>, i32, <8 x double>, i8)
5971
5972 define <8 x double>@test_int_x86_avx512_mask_insertf64x4_512(<8 x double> %x0, <4 x double> %x1, <8 x double> %x3, i8 %x4) {
5973 ; CHECK-LABEL: test_int_x86_avx512_mask_insertf64x4_512:
5974 ; CHECK:       ## BB#0:
5975 ; CHECK-NEXT:    movzbl %dil, %eax
5976 ; CHECK-NEXT:    kmovw %eax, %k1
5977 ; CHECK-NEXT:    vinsertf64x4 $1, %ymm1, %zmm0, %zmm2 {%k1}
5978 ; CHECK-NEXT:    vinsertf64x4 $1, %ymm1, %zmm0, %zmm3 {%k1} {z}
5979 ; CHECK-NEXT:    vinsertf64x4 $1, %ymm1, %zmm0, %zmm0
5980 ; CHECK-NEXT:    vaddpd %zmm0, %zmm2, %zmm0
5981 ; CHECK-NEXT:    vaddpd %zmm0, %zmm3, %zmm0
5982 ; CHECK-NEXT:    retq
5983   %res = call <8 x double> @llvm.x86.avx512.mask.insertf64x4.512(<8 x double> %x0, <4 x double> %x1, i32 1, <8 x double> %x3, i8 %x4)
5984   %res1 = call <8 x double> @llvm.x86.avx512.mask.insertf64x4.512(<8 x double> %x0, <4 x double> %x1, i32 1, <8 x double> %x3, i8 -1)
5985   %res2 = call <8 x double> @llvm.x86.avx512.mask.insertf64x4.512(<8 x double> %x0, <4 x double> %x1, i32 1, <8 x double> zeroinitializer, i8 %x4)
5986   %res3 = fadd <8 x double> %res, %res1
5987   %res4 = fadd <8 x double> %res2, %res3
5988   ret <8 x double> %res4
5989 }
5990
5991 declare <8 x i64> @llvm.x86.avx512.mask.inserti64x4.512(<8 x i64>, <4 x i64>, i32, <8 x i64>, i8)
5992
5993 define <8 x i64>@test_int_x86_avx512_mask_inserti64x4_512(<8 x i64> %x0, <4 x i64> %x1, <8 x i64> %x3, i8 %x4) {
5994 ; CHECK-LABEL: test_int_x86_avx512_mask_inserti64x4_512:
5995 ; CHECK:       ## BB#0:
5996 ; CHECK-NEXT:    movzbl %dil, %eax
5997 ; CHECK-NEXT:    kmovw %eax, %k1
5998 ; CHECK-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm2 {%k1}
5999 ; CHECK-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm3 {%k1} {z}
6000 ; CHECK-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
6001 ; CHECK-NEXT:    vpaddq %zmm0, %zmm2, %zmm0
6002 ; CHECK-NEXT:    vpaddq %zmm0, %zmm3, %zmm0
6003 ; CHECK-NEXT:    retq
6004   %res = call <8 x i64> @llvm.x86.avx512.mask.inserti64x4.512(<8 x i64> %x0, <4 x i64> %x1, i32 1, <8 x i64> %x3, i8 %x4)
6005   %res1 = call <8 x i64> @llvm.x86.avx512.mask.inserti64x4.512(<8 x i64> %x0, <4 x i64> %x1, i32 1, <8 x i64> %x3, i8 -1)
6006   %res2 = call <8 x i64> @llvm.x86.avx512.mask.inserti64x4.512(<8 x i64> %x0, <4 x i64> %x1, i32 1, <8 x i64> zeroinitializer, i8 %x4)
6007   %res3 = add <8 x i64> %res, %res1
6008   %res4 = add <8 x i64> %res2, %res3
6009   ret <8 x i64> %res4
6010 }
6011
6012 declare <2 x double> @llvm.x86.avx512.mask.cvtss2sd.round(<4 x float>, <4 x float>, <2 x double>, i8, i32)
6013
6014 define <2 x double>@test_int_x86_avx512_mask_cvt_ss2sd_round(<4 x float> %x0,<4 x float> %x1, <2 x double> %x2, i8 %x3) {
6015 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_ss2sd_round:
6016 ; CHECK:       ## BB#0:
6017 ; CHECK-NEXT:    andl $1, %edi
6018 ; CHECK-NEXT:    kmovw %edi, %k1
6019 ; CHECK-NEXT:    vcvtss2sd %xmm1, %xmm0, %xmm2 {%k1}
6020 ; CHECK-NEXT:    vcvtss2sd {sae}, %xmm1, %xmm0, %xmm0
6021 ; CHECK-NEXT:    vaddpd %xmm0, %xmm2, %xmm0
6022 ; CHECK-NEXT:    retq
6023   %res = call <2 x double> @llvm.x86.avx512.mask.cvtss2sd.round(<4 x float> %x0, <4 x float> %x1, <2 x double> %x2, i8 %x3, i32 4)
6024   %res1 = call <2 x double> @llvm.x86.avx512.mask.cvtss2sd.round(<4 x float> %x0, <4 x float> %x1, <2 x double> %x2, i8 -1, i32 8)
6025   %res2 = fadd <2 x double> %res, %res1
6026   ret <2 x double> %res2
6027 }
6028
6029 declare <4 x float> @llvm.x86.avx512.mask.cvtsd2ss.round(<2 x double>, <2 x double>, <4 x float>, i8, i32)
6030
6031 define <4 x float>@test_int_x86_avx512_mask_cvt_sd2ss_round(<2 x double> %x0,<2 x double> %x1, <4 x float> %x2, i8 %x3) {
6032 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_sd2ss_round:
6033 ; CHECK:       ## BB#0:
6034 ; CHECK-NEXT:    andl $1, %edi
6035 ; CHECK-NEXT:    kmovw %edi, %k1
6036 ; CHECK-NEXT:    vcvtsd2ss {rz-sae}, %xmm1, %xmm0, %xmm2 {%k1}
6037 ; CHECK-NEXT:    vcvtsd2ss {rn-sae}, %xmm1, %xmm0, %xmm0
6038 ; CHECK-NEXT:    vaddps %xmm0, %xmm2, %xmm0
6039 ; CHECK-NEXT:    retq
6040   %res = call <4 x float> @llvm.x86.avx512.mask.cvtsd2ss.round(<2 x double> %x0, <2 x double> %x1, <4 x float> %x2, i8 %x3, i32 3)
6041   %res1 = call <4 x float> @llvm.x86.avx512.mask.cvtsd2ss.round(<2 x double> %x0, <2 x double> %x1, <4 x float> %x2, i8 -1, i32 8)
6042   %res2 = fadd <4 x float> %res, %res1
6043   ret <4 x float> %res2
6044 }
6045
6046 declare <16 x i32> @llvm.x86.avx512.mask.pternlog.d.512(<16 x i32>, <16 x i32>, <16 x i32>, i32, i16)
6047
6048 define <16 x i32>@test_int_x86_avx512_mask_pternlog_d_512(<16 x i32> %x0, <16 x i32> %x1, <16 x i32> %x2, i16 %x4) {
6049 ; CHECK-LABEL: test_int_x86_avx512_mask_pternlog_d_512:
6050 ; CHECK:       ## BB#0:
6051 ; CHECK-NEXT:    kmovw %edi, %k1
6052 ; CHECK-NEXT:    vmovaps %zmm0, %zmm3
6053 ; CHECK-NEXT:    vpternlogd $33, %zmm2, %zmm1, %zmm3 {%k1}
6054 ; CHECK-NEXT:    vpternlogd $33, %zmm2, %zmm1, %zmm0
6055 ; CHECK-NEXT:    vpaddd %zmm0, %zmm3, %zmm0
6056 ; CHECK-NEXT:    retq
6057   %res = call <16 x i32> @llvm.x86.avx512.mask.pternlog.d.512(<16 x i32> %x0, <16 x i32> %x1, <16 x i32> %x2, i32 33, i16 %x4)
6058   %res1 = call <16 x i32> @llvm.x86.avx512.mask.pternlog.d.512(<16 x i32> %x0, <16 x i32> %x1, <16 x i32> %x2, i32 33, i16 -1)
6059   %res2 = add <16 x i32> %res, %res1
6060   ret <16 x i32> %res2
6061 }
6062
6063 declare <16 x i32> @llvm.x86.avx512.maskz.pternlog.d.512(<16 x i32>, <16 x i32>, <16 x i32>, i32, i16)
6064
6065 define <16 x i32>@test_int_x86_avx512_maskz_pternlog_d_512(<16 x i32> %x0, <16 x i32> %x1, <16 x i32> %x2, i16 %x4) {
6066 ; CHECK-LABEL: test_int_x86_avx512_maskz_pternlog_d_512:
6067 ; CHECK:       ## BB#0:
6068 ; CHECK-NEXT:    kmovw %edi, %k1
6069 ; CHECK-NEXT:    vmovaps %zmm0, %zmm3
6070 ; CHECK-NEXT:    vpternlogd $33, %zmm2, %zmm1, %zmm3 {%k1} {z}
6071 ; CHECK-NEXT:    vpternlogd $33, %zmm2, %zmm1, %zmm0
6072 ; CHECK-NEXT:    vpaddd %zmm0, %zmm3, %zmm0
6073 ; CHECK-NEXT:    retq
6074   %res = call <16 x i32> @llvm.x86.avx512.maskz.pternlog.d.512(<16 x i32> %x0, <16 x i32> %x1, <16 x i32> %x2, i32 33, i16 %x4)
6075   %res1 = call <16 x i32> @llvm.x86.avx512.maskz.pternlog.d.512(<16 x i32> %x0, <16 x i32> %x1, <16 x i32> %x2, i32 33, i16 -1)
6076   %res2 = add <16 x i32> %res, %res1
6077   ret <16 x i32> %res2
6078 }
6079
6080 declare <8 x i64> @llvm.x86.avx512.mask.pternlog.q.512(<8 x i64>, <8 x i64>, <8 x i64>, i32, i8)
6081
6082 define <8 x i64>@test_int_x86_avx512_mask_pternlog_q_512(<8 x i64> %x0, <8 x i64> %x1, <8 x i64> %x2, i8 %x4) {
6083 ; CHECK-LABEL: test_int_x86_avx512_mask_pternlog_q_512:
6084 ; CHECK:       ## BB#0:
6085 ; CHECK-NEXT:    movzbl %dil, %eax
6086 ; CHECK-NEXT:    kmovw %eax, %k1
6087 ; CHECK-NEXT:    vmovaps %zmm0, %zmm3
6088 ; CHECK-NEXT:    vpternlogq $33, %zmm2, %zmm1, %zmm3 {%k1}
6089 ; CHECK-NEXT:    vpternlogq $33, %zmm2, %zmm1, %zmm0
6090 ; CHECK-NEXT:    vpaddq %zmm0, %zmm3, %zmm0
6091 ; CHECK-NEXT:    retq
6092   %res = call <8 x i64> @llvm.x86.avx512.mask.pternlog.q.512(<8 x i64> %x0, <8 x i64> %x1, <8 x i64> %x2, i32 33, i8 %x4)
6093   %res1 = call <8 x i64> @llvm.x86.avx512.mask.pternlog.q.512(<8 x i64> %x0, <8 x i64> %x1, <8 x i64> %x2, i32 33, i8 -1)
6094   %res2 = add <8 x i64> %res, %res1
6095   ret <8 x i64> %res2
6096 }
6097
6098 declare <8 x i64> @llvm.x86.avx512.maskz.pternlog.q.512(<8 x i64>, <8 x i64>, <8 x i64>, i32, i8)
6099
6100 define <8 x i64>@test_int_x86_avx512_maskz_pternlog_q_512(<8 x i64> %x0, <8 x i64> %x1, <8 x i64> %x2, i8 %x4) {
6101 ; CHECK-LABEL: test_int_x86_avx512_maskz_pternlog_q_512:
6102 ; CHECK:       ## BB#0:
6103 ; CHECK-NEXT:    movzbl %dil, %eax
6104 ; CHECK-NEXT:    kmovw %eax, %k1
6105 ; CHECK-NEXT:    vmovaps %zmm0, %zmm3
6106 ; CHECK-NEXT:    vpternlogq $33, %zmm2, %zmm1, %zmm3 {%k1} {z}
6107 ; CHECK-NEXT:    vpternlogq $33, %zmm2, %zmm1, %zmm0
6108 ; CHECK-NEXT:    vpaddq %zmm0, %zmm3, %zmm0
6109 ; CHECK-NEXT:    retq
6110   %res = call <8 x i64> @llvm.x86.avx512.maskz.pternlog.q.512(<8 x i64> %x0, <8 x i64> %x1, <8 x i64> %x2, i32 33, i8 %x4)
6111   %res1 = call <8 x i64> @llvm.x86.avx512.maskz.pternlog.q.512(<8 x i64> %x0, <8 x i64> %x1, <8 x i64> %x2, i32 33, i8 -1)
6112   %res2 = add <8 x i64> %res, %res1
6113   ret <8 x i64> %res2
6114 }
6115
6116 declare <16 x float> @llvm.x86.avx512.mask.movsldup.512(<16 x float>, <16 x float>, i16)
6117
6118 define <16 x float>@test_int_x86_avx512_mask_movsldup_512(<16 x float> %x0, <16 x float> %x1, i16 %x2) {
6119 ; CHECK-LABEL: test_int_x86_avx512_mask_movsldup_512:
6120 ; CHECK:       ## BB#0:
6121 ; CHECK-NEXT:    kmovw %edi, %k1
6122 ; CHECK-NEXT:    vmovsldup {{.*#+}} zmm1 = zmm0[0,0,2,2,4,4,6,6,8,8,10,10,12,12,14,14]
6123 ; CHECK-NEXT:    vmovsldup {{.*#+}} zmm2 = zmm0[0,0,2,2,4,4,6,6,8,8,10,10,12,12,14,14]
6124 ; CHECK-NEXT:    vmovsldup {{.*#+}} zmm0 = zmm0[0,0,2,2,4,4,6,6,8,8,10,10,12,12,14,14]
6125 ; CHECK-NEXT:    vaddps %zmm0, %zmm1, %zmm0
6126 ; CHECK-NEXT:    vaddps %zmm0, %zmm2, %zmm0
6127 ; CHECK-NEXT:    retq
6128   %res = call <16 x float> @llvm.x86.avx512.mask.movsldup.512(<16 x float> %x0, <16 x float> %x1, i16 %x2)
6129   %res1 = call <16 x float> @llvm.x86.avx512.mask.movsldup.512(<16 x float> %x0, <16 x float> %x1, i16 -1)
6130   %res2 = call <16 x float> @llvm.x86.avx512.mask.movsldup.512(<16 x float> %x0, <16 x float> zeroinitializer, i16 %x2)
6131   %res3 = fadd <16 x float> %res, %res1
6132   %res4 = fadd <16 x float> %res2, %res3
6133   ret <16 x float> %res4
6134 }
6135
6136 declare <16 x float> @llvm.x86.avx512.mask.movshdup.512(<16 x float>, <16 x float>, i16)
6137
6138 define <16 x float>@test_int_x86_avx512_mask_movshdup_512(<16 x float> %x0, <16 x float> %x1, i16 %x2) {
6139 ; CHECK-LABEL: test_int_x86_avx512_mask_movshdup_512:
6140 ; CHECK:       ## BB#0:
6141 ; CHECK-NEXT:    kmovw %edi, %k1
6142 ; CHECK-NEXT:    vmovshdup {{.*#+}} zmm1 = zmm0[1,1,3,3,5,5,7,7,9,9,11,11,13,13,15,15]
6143 ; CHECK-NEXT:    vmovshdup {{.*#+}} zmm2 = zmm0[1,1,3,3,5,5,7,7,9,9,11,11,13,13,15,15]
6144 ; CHECK-NEXT:    vmovshdup {{.*#+}} zmm0 = zmm0[1,1,3,3,5,5,7,7,9,9,11,11,13,13,15,15]
6145 ; CHECK-NEXT:    vaddps %zmm0, %zmm1, %zmm0
6146 ; CHECK-NEXT:    vaddps %zmm0, %zmm2, %zmm0
6147 ; CHECK-NEXT:    retq
6148   %res = call <16 x float> @llvm.x86.avx512.mask.movshdup.512(<16 x float> %x0, <16 x float> %x1, i16 %x2)
6149   %res1 = call <16 x float> @llvm.x86.avx512.mask.movshdup.512(<16 x float> %x0, <16 x float> %x1, i16 -1)
6150   %res2 = call <16 x float> @llvm.x86.avx512.mask.movshdup.512(<16 x float> %x0, <16 x float> zeroinitializer, i16 %x2)
6151   %res3 = fadd <16 x float> %res, %res1
6152   %res4 = fadd <16 x float> %res2, %res3
6153   ret <16 x float> %res4
6154 }
6155
6156 declare <8 x double> @llvm.x86.avx512.mask.movddup.512(<8 x double>, <8 x double>, i8)
6157
6158 define <8 x double>@test_int_x86_avx512_mask_movddup_512(<8 x double> %x0, <8 x double> %x1, i8 %x2) {
6159 ; CHECK-LABEL: test_int_x86_avx512_mask_movddup_512:
6160 ; CHECK:       ## BB#0:
6161 ; CHECK-NEXT:    movzbl %dil, %eax
6162 ; CHECK-NEXT:    kmovw %eax, %k1
6163 ; CHECK-NEXT:    vmovddup {{.*#+}} zmm1 = zmm0[0,0,2,2,4,4,6,6]
6164 ; CHECK-NEXT:    vmovddup {{.*#+}} zmm2 = zmm0[0,0,2,2,4,4,6,6]
6165 ; CHECK-NEXT:    vmovddup {{.*#+}} zmm0 = zmm0[0,0,2,2,4,4,6,6]
6166 ; CHECK-NEXT:    vaddpd %zmm0, %zmm1, %zmm0
6167 ; CHECK-NEXT:    vaddpd %zmm0, %zmm2, %zmm0
6168 ; CHECK-NEXT:    retq
6169   %res = call <8 x double> @llvm.x86.avx512.mask.movddup.512(<8 x double> %x0, <8 x double> %x1, i8 %x2)
6170   %res1 = call <8 x double> @llvm.x86.avx512.mask.movddup.512(<8 x double> %x0, <8 x double> %x1, i8 -1)
6171   %res2 = call <8 x double> @llvm.x86.avx512.mask.movddup.512(<8 x double> %x0, <8 x double> zeroinitializer, i8 %x2)
6172   %res3 = fadd <8 x double> %res, %res1
6173   %res4 = fadd <8 x double> %res2, %res3
6174   ret <8 x double> %res4
6175 }
6176
6177 define i32 @test_x86_avx512_comi_sd_eq_sae(<2 x double> %a0, <2 x double> %a1) {
6178 ; CHECK-LABEL: test_x86_avx512_comi_sd_eq_sae:
6179 ; CHECK:       ## BB#0:
6180 ; CHECK-NEXT:    vcomisd {sae}, %xmm1, %xmm0
6181 ; CHECK-NEXT:    sete %al
6182 ; CHECK-NEXT:    movzbl %al, %eax
6183 ; CHECK-NEXT:    retq
6184   %res = call i32 @llvm.x86.avx512.vcomi.sd(<2 x double> %a0, <2 x double> %a1, i32 0, i32 8)
6185   ret i32 %res
6186 }
6187
6188 define i32 @test_x86_avx512_ucomi_sd_eq_sae(<2 x double> %a0, <2 x double> %a1) {
6189 ; CHECK-LABEL: test_x86_avx512_ucomi_sd_eq_sae:
6190 ; CHECK:       ## BB#0:
6191 ; CHECK-NEXT:    vucomisd {sae}, %xmm1, %xmm0
6192 ; CHECK-NEXT:    sete %al
6193 ; CHECK-NEXT:    movzbl %al, %eax
6194 ; CHECK-NEXT:    retq
6195   %res = call i32 @llvm.x86.avx512.vcomi.sd(<2 x double> %a0, <2 x double> %a1, i32 8, i32 8)
6196   ret i32 %res
6197 }
6198
6199 define i32 @test_x86_avx512_comi_sd_eq(<2 x double> %a0, <2 x double> %a1) {
6200 ; CHECK-LABEL: test_x86_avx512_comi_sd_eq:
6201 ; CHECK:       ## BB#0:
6202 ; CHECK-NEXT:    vcomisd %xmm1, %xmm0
6203 ; CHECK-NEXT:    sete %al
6204 ; CHECK-NEXT:    movzbl %al, %eax
6205 ; CHECK-NEXT:    retq
6206   %res = call i32 @llvm.x86.avx512.vcomi.sd(<2 x double> %a0, <2 x double> %a1, i32 0, i32 4)
6207   ret i32 %res
6208 }
6209
6210 define i32 @test_x86_avx512_ucomi_sd_eq(<2 x double> %a0, <2 x double> %a1) {
6211 ; CHECK-LABEL: test_x86_avx512_ucomi_sd_eq:
6212 ; CHECK:       ## BB#0:
6213 ; CHECK-NEXT:    vucomisd %xmm1, %xmm0
6214 ; CHECK-NEXT:    sete %al
6215 ; CHECK-NEXT:    movzbl %al, %eax
6216 ; CHECK-NEXT:    retq
6217   %res = call i32 @llvm.x86.avx512.vcomi.sd(<2 x double> %a0, <2 x double> %a1, i32 8, i32 4)
6218   ret i32 %res
6219 }
6220
6221 define i32 @test_x86_avx512_comi_sd_lt_sae(<2 x double> %a0, <2 x double> %a1) {
6222 ; CHECK-LABEL: test_x86_avx512_comi_sd_lt_sae:
6223 ; CHECK:       ## BB#0:
6224 ; CHECK-NEXT:    vcomisd {sae}, %xmm1, %xmm0
6225 ; CHECK-NEXT:    sbbl %eax, %eax
6226 ; CHECK-NEXT:    andl $1, %eax
6227 ; CHECK-NEXT:    retq
6228   %res = call i32 @llvm.x86.avx512.vcomi.sd(<2 x double> %a0, <2 x double> %a1, i32 1, i32 8)
6229   ret i32 %res
6230 }
6231
6232 define i32 @test_x86_avx512_ucomi_sd_lt_sae(<2 x double> %a0, <2 x double> %a1) {
6233 ; CHECK-LABEL: test_x86_avx512_ucomi_sd_lt_sae:
6234 ; CHECK:       ## BB#0:
6235 ; CHECK-NEXT:    vucomisd {sae}, %xmm1, %xmm0
6236 ; CHECK-NEXT:    sbbl %eax, %eax
6237 ; CHECK-NEXT:    andl $1, %eax
6238 ; CHECK-NEXT:    retq
6239   %res = call i32 @llvm.x86.avx512.vcomi.sd(<2 x double> %a0, <2 x double> %a1, i32 9, i32 8)
6240   ret i32 %res
6241 }
6242
6243 define i32 @test_x86_avx512_comi_sd_lt(<2 x double> %a0, <2 x double> %a1) {
6244 ; CHECK-LABEL: test_x86_avx512_comi_sd_lt:
6245 ; CHECK:       ## BB#0:
6246 ; CHECK-NEXT:    vcomisd %xmm1, %xmm0
6247 ; CHECK-NEXT:    sbbl %eax, %eax
6248 ; CHECK-NEXT:    andl $1, %eax
6249 ; CHECK-NEXT:    retq
6250   %res = call i32 @llvm.x86.avx512.vcomi.sd(<2 x double> %a0, <2 x double> %a1, i32 1, i32 4)
6251   ret i32 %res
6252 }
6253
6254 define i32 @test_x86_avx512_ucomi_sd_lt(<2 x double> %a0, <2 x double> %a1) {
6255 ; CHECK-LABEL: test_x86_avx512_ucomi_sd_lt:
6256 ; CHECK:       ## BB#0:
6257 ; CHECK-NEXT:    vucomisd %xmm1, %xmm0
6258 ; CHECK-NEXT:    sbbl %eax, %eax
6259 ; CHECK-NEXT:    andl $1, %eax
6260 ; CHECK-NEXT:    retq
6261   %res = call i32 @llvm.x86.avx512.vcomi.sd(<2 x double> %a0, <2 x double> %a1, i32 9, i32 4)
6262   ret i32 %res
6263 }
6264
6265 declare i32 @llvm.x86.avx512.vcomi.sd(<2 x double>, <2 x double>, i32, i32)
6266
6267 define i32 @test_x86_avx512_ucomi_ss_lt(<4 x float> %a0, <4 x float> %a1) {
6268 ; CHECK-LABEL: test_x86_avx512_ucomi_ss_lt:
6269 ; CHECK:       ## BB#0:
6270 ; CHECK-NEXT:    vucomiss %xmm1, %xmm0
6271 ; CHECK-NEXT:    sbbl %eax, %eax
6272 ; CHECK-NEXT:    andl $1, %eax
6273 ; CHECK-NEXT:    retq
6274   %res = call i32 @llvm.x86.avx512.vcomi.ss(<4 x float> %a0, <4 x float> %a1, i32 9, i32 4)
6275   ret i32 %res
6276 }
6277
6278 declare i32 @llvm.x86.avx512.vcomi.ss(<4 x float>, <4 x float>, i32, i32)
6279 declare <4 x float> @llvm.x86.avx512.mask.move.ss(<4 x float>, <4 x float>, <4 x float>, i8)
6280
6281 define <4 x float>@test_int_x86_avx512_mask_move_ss_rrk(<4 x float> %x0, <4 x float> %x1, <4 x float> %x2, i8 %x3) {
6282 ; CHECK-LABEL: test_int_x86_avx512_mask_move_ss_rrk:
6283 ; CHECK:       ## BB#0:
6284 ; CHECK-NEXT:    andl $1, %edi
6285 ; CHECK-NEXT:    kmovw %edi, %k1
6286 ; CHECK-NEXT:    vmovss %xmm1, %xmm0, %xmm2 {%k1}
6287 ; CHECK-NEXT:    vmovaps %zmm2, %zmm0
6288 ; CHECK-NEXT:    retq
6289   %res = call <4 x float> @llvm.x86.avx512.mask.move.ss(<4 x float> %x0, <4 x float> %x1, <4 x float> %x2, i8 %x3)
6290   ret <4 x float> %res
6291 }
6292
6293 define <4 x float>@test_int_x86_avx512_mask_move_ss_rrkz(<4 x float> %x0, <4 x float> %x1, i8 %x2) {
6294 ; CHECK-LABEL: test_int_x86_avx512_mask_move_ss_rrkz:
6295 ; CHECK:       ## BB#0:
6296 ; CHECK-NEXT:    andl $1, %edi
6297 ; CHECK-NEXT:    kmovw %edi, %k1
6298 ; CHECK-NEXT:    vmovss %xmm1, %xmm0, %xmm0 {%k1} {z}
6299 ; CHECK-NEXT:    retq
6300   %res = call <4 x float> @llvm.x86.avx512.mask.move.ss(<4 x float> %x0, <4 x float> %x1, <4 x float> zeroinitializer, i8 %x2)
6301   ret <4 x float> %res
6302 }
6303
6304 define <4 x float>@test_int_x86_avx512_mask_move_ss_rr(<4 x float> %x0, <4 x float> %x1, i8 %x2) {
6305 ; CHECK-LABEL: test_int_x86_avx512_mask_move_ss_rr:
6306 ; CHECK:       ## BB#0:
6307 ; CHECK-NEXT:    vmovss %xmm1, %xmm0, %xmm0
6308 ; CHECK-NEXT:    retq
6309   %res = call <4 x float> @llvm.x86.avx512.mask.move.ss(<4 x float> %x0, <4 x float> %x1, <4 x float> zeroinitializer, i8 -1)
6310   ret <4 x float> %res
6311 }
6312
6313 declare <2 x double> @llvm.x86.avx512.mask.move.sd(<2 x double>, <2 x double>, <2 x double>, i8)
6314 define <2 x double>@test_int_x86_avx512_mask_move_sd_rr(<2 x double> %x0, <2 x double> %x1, i8 %x2) {
6315 ; CHECK-LABEL: test_int_x86_avx512_mask_move_sd_rr:
6316 ; CHECK:       ## BB#0:
6317 ; CHECK-NEXT:    vmovsd %xmm1, %xmm0, %xmm0
6318 ; CHECK-NEXT:    retq
6319   %res = call <2 x double> @llvm.x86.avx512.mask.move.sd(<2 x double> %x0, <2 x double> %x1, <2 x double> zeroinitializer, i8 -1)
6320   ret <2 x double> %res
6321 }
6322
6323 define <2 x double>@test_int_x86_avx512_mask_move_sd_rrkz(<2 x double> %x0, <2 x double> %x1, i8 %x2) {
6324 ; CHECK-LABEL: test_int_x86_avx512_mask_move_sd_rrkz:
6325 ; CHECK:       ## BB#0:
6326 ; CHECK-NEXT:    andl $1, %edi
6327 ; CHECK-NEXT:    kmovw %edi, %k1
6328 ; CHECK-NEXT:    vmovsd %xmm1, %xmm0, %xmm0 {%k1} {z}
6329 ; CHECK-NEXT:    retq
6330   %res = call <2 x double> @llvm.x86.avx512.mask.move.sd(<2 x double> %x0, <2 x double> %x1, <2 x double> zeroinitializer, i8 %x2)
6331   ret <2 x double> %res
6332 }
6333
6334 define <2 x double>@test_int_x86_avx512_mask_move_sd_rrk(<2 x double> %x0, <2 x double> %x1, <2 x double> %x2, i8 %x3) {
6335 ; CHECK-LABEL: test_int_x86_avx512_mask_move_sd_rrk:
6336 ; CHECK:       ## BB#0:
6337 ; CHECK-NEXT:    andl $1, %edi
6338 ; CHECK-NEXT:    kmovw %edi, %k1
6339 ; CHECK-NEXT:    vmovsd %xmm1, %xmm0, %xmm2 {%k1}
6340 ; CHECK-NEXT:    vmovaps %zmm2, %zmm0
6341 ; CHECK-NEXT:    retq
6342   %res = call <2 x double> @llvm.x86.avx512.mask.move.sd(<2 x double> %x0, <2 x double> %x1, <2 x double> %x2, i8 %x3)
6343   ret <2 x double> %res
6344 }
6345
6346 declare <16 x float> @llvm.x86.avx512.mask.broadcastf32x4.512(<4 x float>, <16 x float>, i16)
6347
6348 define <16 x float>@test_int_x86_avx512_mask_broadcastf32x4_512(<4 x float> %x0, <16 x float> %x2, i16 %mask) {
6349 ; CHECK-LABEL: test_int_x86_avx512_mask_broadcastf32x4_512:
6350 ; CHECK: kmovw %edi, %k1
6351 ; CHECK: vshuff32x4 $0, %zmm0, %zmm0, %zmm2 {%k1} {z}
6352 ; CHECK: vshuff32x4 $0, %zmm0, %zmm0, %zmm1 {%k1}
6353 ; CHECK: vshuff32x4 $0, %zmm0, %zmm0, %zmm0
6354 ; CHECK: vaddps %zmm1, %zmm0, %zmm0
6355 ; CHECK: vaddps %zmm0, %zmm2, %zmm0
6356
6357   %res1 = call <16 x float> @llvm.x86.avx512.mask.broadcastf32x4.512(<4 x float> %x0, <16 x float> %x2, i16 -1)
6358   %res2 = call <16 x float> @llvm.x86.avx512.mask.broadcastf32x4.512(<4 x float> %x0, <16 x float> %x2, i16 %mask)
6359   %res3 = call <16 x float> @llvm.x86.avx512.mask.broadcastf32x4.512(<4 x float> %x0, <16 x float> zeroinitializer, i16 %mask)
6360   %res4 = fadd <16 x float> %res1, %res2
6361   %res5 = fadd <16 x float> %res3, %res4
6362   ret <16 x float> %res5
6363 }
6364
6365 declare <8 x double> @llvm.x86.avx512.mask.broadcastf64x4.512(<4 x double>, <8 x double>, i8)
6366
6367 define <8 x double>@test_int_x86_avx512_mask_broadcastf64x4_512(<4 x double> %x0, <8 x double> %x2, i8 %mask) {
6368 ; CHECK-LABEL: test_int_x86_avx512_mask_broadcastf64x4_512:
6369 ; CHECK: kmovw %eax, %k1
6370 ; CHECK: vshuff64x2 $68, %zmm0, %zmm0, %zmm2 {%k1} {z}
6371 ; CHECK: vshuff64x2 $68, %zmm0, %zmm0, %zmm1 {%k1}
6372 ; CHECK: vshuff64x2 $68, %zmm0, %zmm0, %zmm0
6373 ; CHECK: vaddpd %zmm1, %zmm0, %zmm0
6374 ; CHECK: vaddpd %zmm0, %zmm2, %zmm0
6375
6376   %res1 = call <8 x double> @llvm.x86.avx512.mask.broadcastf64x4.512(<4 x double> %x0, <8 x double> %x2, i8 -1)
6377   %res2 = call <8 x double> @llvm.x86.avx512.mask.broadcastf64x4.512(<4 x double> %x0, <8 x double> %x2, i8 %mask)
6378   %res3 = call <8 x double> @llvm.x86.avx512.mask.broadcastf64x4.512(<4 x double> %x0, <8 x double> zeroinitializer, i8 %mask)
6379   %res4 = fadd <8 x double> %res1, %res2
6380   %res5 = fadd <8 x double> %res3, %res4
6381   ret <8 x double> %res5
6382 }
6383
6384 declare <16 x i32> @llvm.x86.avx512.mask.broadcasti32x4.512(<4 x i32>, <16 x i32>, i16)
6385
6386 define <16 x i32>@test_int_x86_avx512_mask_broadcasti32x4_512(<4 x i32> %x0, <16 x i32> %x2, i16 %mask) {
6387 ; CHECK-LABEL: test_int_x86_avx512_mask_broadcasti32x4_512:
6388 ; CHECK: kmovw %edi, %k1
6389 ; CHECK: vshufi32x4 $0, %zmm0, %zmm0, %zmm2 {%k1} {z}
6390 ; CHECK: vshufi32x4 $0, %zmm0, %zmm0, %zmm1 {%k1}
6391 ; CHECK: vshufi32x4 $0, %zmm0, %zmm0, %zmm0
6392 ; CHECK: vpaddd %zmm1, %zmm0, %zmm0
6393 ; CHECK: vpaddd %zmm0, %zmm2, %zmm0
6394
6395   %res1 = call <16 x i32> @llvm.x86.avx512.mask.broadcasti32x4.512(<4 x i32> %x0, <16 x i32> %x2, i16 -1)
6396   %res2 = call <16 x i32> @llvm.x86.avx512.mask.broadcasti32x4.512(<4 x i32> %x0, <16 x i32> %x2, i16 %mask)
6397   %res3 = call <16 x i32> @llvm.x86.avx512.mask.broadcasti32x4.512(<4 x i32> %x0, <16 x i32> zeroinitializer, i16 %mask)
6398   %res4 = add <16 x i32> %res1, %res2
6399   %res5 = add <16 x i32> %res3, %res4
6400   ret <16 x i32> %res5
6401 }
6402
6403 declare <8 x i64> @llvm.x86.avx512.mask.broadcasti64x4.512(<4 x i64>, <8 x i64>, i8)
6404
6405 define <8 x i64>@test_int_x86_avx512_mask_broadcasti64x4_512(<4 x i64> %x0, <8 x i64> %x2, i8 %mask) {
6406 ; CHECK-LABEL: test_int_x86_avx512_mask_broadcasti64x4_512:
6407 ; CHECK: kmovw %eax, %k1
6408 ; CHECK: vshufi64x2 $68, %zmm0, %zmm0, %zmm2 {%k1} {z}
6409 ; CHECK: vshufi64x2 $68, %zmm0, %zmm0, %zmm1 {%k1}
6410 ; CHECK: vshufi64x2 $68, %zmm0, %zmm0, %zmm0
6411 ; CHECK: vpaddq %zmm1, %zmm0, %zmm0
6412 ; CHECK: vpaddq %zmm0, %zmm2, %zmm0
6413
6414   %res1 = call <8 x i64> @llvm.x86.avx512.mask.broadcasti64x4.512(<4 x i64> %x0, <8 x i64> %x2, i8 -1)
6415   %res2 = call <8 x i64> @llvm.x86.avx512.mask.broadcasti64x4.512(<4 x i64> %x0, <8 x i64> %x2, i8 %mask)
6416   %res3 = call <8 x i64> @llvm.x86.avx512.mask.broadcasti64x4.512(<4 x i64> %x0, <8 x i64> zeroinitializer, i8 %mask)
6417   %res4 = add <8 x i64> %res1, %res2
6418   %res5 = add <8 x i64> %res3, %res4
6419   ret <8 x i64> %res5
6420 }
6421
6422 declare <8 x i64> @llvm.x86.avx512.mask.psrl.qi.512(<8 x i64>, i8, <8 x i64>, i8)
6423
6424 define <8 x i64>@test_int_x86_avx512_mask_psrl_qi_512(<8 x i64> %x0, i8 %x1, <8 x i64> %x2, i8 %x3) {
6425 ; CHECK-LABEL: test_int_x86_avx512_mask_psrl_qi_512:
6426 ; CHECK:       ## BB#0:
6427 ; CHECK-NEXT:    movzbl %sil, %eax
6428 ; CHECK-NEXT:    kmovw %eax, %k1
6429 ; CHECK-NEXT:    vpsrlq $255, %zmm0, %zmm1 {%k1}
6430 ; CHECK-NEXT:    vpsrlq $255, %zmm0, %zmm2 {%k1} {z}
6431 ; CHECK-NEXT:    vpsrlq $255, %zmm0, %zmm0
6432 ; CHECK-NEXT:    vpaddq %zmm0, %zmm1, %zmm0
6433 ; CHECK-NEXT:    vpaddq %zmm2, %zmm0, %zmm0
6434 ; CHECK-NEXT:    retq
6435   %res = call <8 x i64> @llvm.x86.avx512.mask.psrl.qi.512(<8 x i64> %x0, i8 255, <8 x i64> %x2, i8 %x3)
6436   %res1 = call <8 x i64> @llvm.x86.avx512.mask.psrl.qi.512(<8 x i64> %x0, i8 255, <8 x i64> %x2, i8 -1)
6437   %res2 = call <8 x i64> @llvm.x86.avx512.mask.psrl.qi.512(<8 x i64> %x0, i8 255, <8 x i64> zeroinitializer, i8 %x3)
6438   %res3 = add <8 x i64> %res, %res1
6439   %res4 = add <8 x i64> %res3, %res2
6440   ret <8 x i64> %res4
6441 }
6442
6443 declare <16 x i32> @llvm.x86.avx512.mask.psrl.di.512(<16 x i32>, i8, <16 x i32>, i16)
6444
6445 define <16 x i32>@test_int_x86_avx512_mask_psrl_di_512(<16 x i32> %x0, i8 %x1, <16 x i32> %x2, i16 %x3) {
6446 ; CHECK-LABEL: test_int_x86_avx512_mask_psrl_di_512:
6447 ; CHECK:       ## BB#0:
6448 ; CHECK-NEXT:    kmovw %esi, %k1
6449 ; CHECK-NEXT:    vpsrld $255, %zmm0, %zmm1 {%k1}
6450 ; CHECK-NEXT:    vpsrld $255, %zmm0, %zmm2 {%k1} {z}
6451 ; CHECK-NEXT:    vpsrld $255, %zmm0, %zmm0
6452 ; CHECK-NEXT:    vpaddd %zmm0, %zmm1, %zmm0
6453 ; CHECK-NEXT:    vpaddd %zmm2, %zmm0, %zmm0
6454 ; CHECK-NEXT:    retq
6455   %res = call <16 x i32> @llvm.x86.avx512.mask.psrl.di.512(<16 x i32> %x0, i8 255, <16 x i32> %x2, i16 %x3)
6456   %res1 = call <16 x i32> @llvm.x86.avx512.mask.psrl.di.512(<16 x i32> %x0, i8 255, <16 x i32> %x2, i16 -1)
6457   %res2 = call <16 x i32> @llvm.x86.avx512.mask.psrl.di.512(<16 x i32> %x0, i8 255, <16 x i32> zeroinitializer, i16 %x3)
6458   %res3 = add <16 x i32> %res, %res1
6459   %res4 = add <16 x i32> %res3, %res2
6460   ret <16 x i32> %res4
6461 }
6462