AVX512: Implemented encoding and intrinsics for vpternlogd/q.
[oota-llvm.git] / test / CodeGen / X86 / avx512-intrinsics.ll
1 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=knl --show-mc-encoding| FileCheck %s
2
3 declare i32 @llvm.x86.avx512.kortestz.w(i16, i16) nounwind readnone
4 ; CHECK-LABEL: test_kortestz
5 ; CHECK: kortestw
6 ; CHECK: sete
7 define i32 @test_kortestz(i16 %a0, i16 %a1) {
8   %res = call i32 @llvm.x86.avx512.kortestz.w(i16 %a0, i16 %a1)
9   ret i32 %res
10 }
11
12 declare i32 @llvm.x86.avx512.kortestc.w(i16, i16) nounwind readnone
13 ; CHECK-LABEL: test_kortestc
14 ; CHECK: kortestw
15 ; CHECK: sbbl
16 define i32 @test_kortestc(i16 %a0, i16 %a1) {
17   %res = call i32 @llvm.x86.avx512.kortestc.w(i16 %a0, i16 %a1)
18   ret i32 %res
19 }
20
21 declare i16 @llvm.x86.avx512.kand.w(i16, i16) nounwind readnone
22 ; CHECK-LABEL: test_kand
23 ; CHECK: kandw
24 ; CHECK: kandw
25 define i16 @test_kand(i16 %a0, i16 %a1) {
26   %t1 = call i16 @llvm.x86.avx512.kand.w(i16 %a0, i16 8)
27   %t2 = call i16 @llvm.x86.avx512.kand.w(i16 %t1, i16 %a1)
28   ret i16 %t2
29 }
30
31 declare i16 @llvm.x86.avx512.knot.w(i16) nounwind readnone
32 ; CHECK-LABEL: test_knot
33 ; CHECK: knotw
34 define i16 @test_knot(i16 %a0) {
35   %res = call i16 @llvm.x86.avx512.knot.w(i16 %a0)
36   ret i16 %res
37 }
38
39 declare i16 @llvm.x86.avx512.kunpck.bw(i16, i16) nounwind readnone
40
41 ; CHECK-LABEL: unpckbw_test
42 ; CHECK: kunpckbw
43 ; CHECK:ret
44 define i16 @unpckbw_test(i16 %a0, i16 %a1) {
45   %res = call i16 @llvm.x86.avx512.kunpck.bw(i16 %a0, i16 %a1)
46   ret i16 %res
47 }
48
49 define <16 x float> @test_rcp_ps_512(<16 x float> %a0) {
50   ; CHECK: vrcp14ps {{.*}}encoding: [0x62,0xf2,0x7d,0x48,0x4c,0xc0]
51   %res = call <16 x float> @llvm.x86.avx512.rcp14.ps.512(<16 x float> %a0, <16 x float> zeroinitializer, i16 -1) ; <<16 x float>> [#uses=1]
52   ret <16 x float> %res
53 }
54 declare <16 x float> @llvm.x86.avx512.rcp14.ps.512(<16 x float>, <16 x float>, i16) nounwind readnone
55
56 define <8 x double> @test_rcp_pd_512(<8 x double> %a0) {
57   ; CHECK: vrcp14pd {{.*}}encoding: [0x62,0xf2,0xfd,0x48,0x4c,0xc0]
58   %res = call <8 x double> @llvm.x86.avx512.rcp14.pd.512(<8 x double> %a0, <8 x double> zeroinitializer, i8 -1) ; <<8 x double>> [#uses=1]
59   ret <8 x double> %res
60 }
61 declare <8 x double> @llvm.x86.avx512.rcp14.pd.512(<8 x double>, <8 x double>, i8) nounwind readnone
62
63 declare <8 x double> @llvm.x86.avx512.mask.rndscale.pd.512(<8 x double>, i32, <8 x double>, i8, i32)
64
65 define <8 x double> @test7(<8 x double> %a) {
66 ; CHECK: vrndscalepd {{.*}}encoding: [0x62,0xf3,0xfd,0x48,0x09,0xc0,0x0b]
67   %res = call <8 x double> @llvm.x86.avx512.mask.rndscale.pd.512(<8 x double> %a, i32 11, <8 x double> %a, i8 -1, i32 4)
68   ret <8 x double>%res
69 }
70
71 declare <16 x float> @llvm.x86.avx512.mask.rndscale.ps.512(<16 x float>, i32, <16 x float>, i16, i32)
72
73 define <16 x float> @test8(<16 x float> %a) {
74 ; CHECK: vrndscaleps {{.*}}encoding: [0x62,0xf3,0x7d,0x48,0x08,0xc0,0x0b]
75   %res = call <16 x float> @llvm.x86.avx512.mask.rndscale.ps.512(<16 x float> %a, i32 11, <16 x float> %a, i16 -1, i32 4)
76   ret <16 x float>%res
77 }
78
79 define <16 x float> @test_rsqrt_ps_512(<16 x float> %a0) {
80   ; CHECK: vrsqrt14ps {{.*}}encoding: [0x62,0xf2,0x7d,0x48,0x4e,0xc0]
81   %res = call <16 x float> @llvm.x86.avx512.rsqrt14.ps.512(<16 x float> %a0, <16 x float> zeroinitializer, i16 -1) ; <<16 x float>> [#uses=1]
82   ret <16 x float> %res
83 }
84 declare <16 x float> @llvm.x86.avx512.rsqrt14.ps.512(<16 x float>, <16 x float>, i16) nounwind readnone
85
86 define <4 x float> @test_rsqrt14_ss(<4 x float> %a0) {
87   ; CHECK: vrsqrt14ss {{.*}}encoding: [0x62,0xf2,0x7d,0x08,0x4f,0xc0]
88   %res = call <4 x float> @llvm.x86.avx512.rsqrt14.ss(<4 x float> %a0, <4 x float> %a0, <4 x float> zeroinitializer, i8 -1) ; <<4 x float>> [#uses=1]
89   ret <4 x float> %res
90 }
91 declare <4 x float> @llvm.x86.avx512.rsqrt14.ss(<4 x float>, <4 x float>, <4 x float>, i8) nounwind readnone
92
93 define <4 x float> @test_rcp14_ss(<4 x float> %a0) {
94   ; CHECK: vrcp14ss {{.*}}encoding: [0x62,0xf2,0x7d,0x08,0x4d,0xc0]
95   %res = call <4 x float> @llvm.x86.avx512.rcp14.ss(<4 x float> %a0, <4 x float> %a0, <4 x float> zeroinitializer, i8 -1) ; <<4 x float>> [#uses=1]
96   ret <4 x float> %res
97 }
98 declare <4 x float> @llvm.x86.avx512.rcp14.ss(<4 x float>, <4 x float>, <4 x float>, i8) nounwind readnone
99
100 define <8 x double> @test_sqrt_pd_512(<8 x double> %a0) {
101   ; CHECK-LABEL: test_sqrt_pd_512
102   ; CHECK: vsqrtpd
103   %res = call <8 x double> @llvm.x86.avx512.mask.sqrt.pd.512(<8 x double> %a0,  <8 x double> zeroinitializer, i8 -1, i32 4) 
104   ret <8 x double> %res
105 }
106 declare <8 x double> @llvm.x86.avx512.mask.sqrt.pd.512(<8 x double>, <8 x double>, i8, i32) nounwind readnone
107
108 define <16 x float> @test_sqrt_ps_512(<16 x float> %a0) {
109   ; CHECK-LABEL: test_sqrt_ps_512
110   ; CHECK: vsqrtps
111   %res = call <16 x float> @llvm.x86.avx512.mask.sqrt.ps.512(<16 x float> %a0, <16 x float> zeroinitializer, i16 -1, i32 4) 
112   ret <16 x float> %res
113 }
114 define <16 x float> @test_sqrt_round_ps_512(<16 x float> %a0) {
115   ; CHECK-LABEL: test_sqrt_round_ps_512
116   ; CHECK: vsqrtps {rz-sae}
117   %res = call <16 x float> @llvm.x86.avx512.mask.sqrt.ps.512(<16 x float> %a0, <16 x float> zeroinitializer, i16 -1, i32 3) 
118   ret <16 x float> %res
119 }
120 declare <16 x float> @llvm.x86.avx512.mask.sqrt.ps.512(<16 x float>, <16 x float>, i16, i32) nounwind readnone
121
122 define <8 x double> @test_getexp_pd_512(<8 x double> %a0) {
123   ; CHECK-LABEL: test_getexp_pd_512
124   ; CHECK: vgetexppd
125   %res = call <8 x double> @llvm.x86.avx512.mask.getexp.pd.512(<8 x double> %a0,  <8 x double> zeroinitializer, i8 -1, i32 4) 
126   ret <8 x double> %res
127 }
128 define <8 x double> @test_getexp_round_pd_512(<8 x double> %a0) {
129   ; CHECK-LABEL: test_getexp_round_pd_512
130   ; CHECK: vgetexppd {sae}
131   %res = call <8 x double> @llvm.x86.avx512.mask.getexp.pd.512(<8 x double> %a0,  <8 x double> zeroinitializer, i8 -1, i32 8) 
132   ret <8 x double> %res
133 }
134 declare <8 x double> @llvm.x86.avx512.mask.getexp.pd.512(<8 x double>, <8 x double>, i8, i32) nounwind readnone
135
136 define <16 x float> @test_getexp_ps_512(<16 x float> %a0) {
137   ; CHECK-LABEL: test_getexp_ps_512
138   ; CHECK: vgetexpps
139   %res = call <16 x float> @llvm.x86.avx512.mask.getexp.ps.512(<16 x float> %a0, <16 x float> zeroinitializer, i16 -1, i32 4) 
140   ret <16 x float> %res
141 }
142
143 define <16 x float> @test_getexp_round_ps_512(<16 x float> %a0) {
144   ; CHECK-LABEL: test_getexp_round_ps_512
145   ; CHECK: vgetexpps {sae}
146   %res = call <16 x float> @llvm.x86.avx512.mask.getexp.ps.512(<16 x float> %a0, <16 x float> zeroinitializer, i16 -1, i32 8) 
147   ret <16 x float> %res
148 }
149 declare <16 x float> @llvm.x86.avx512.mask.getexp.ps.512(<16 x float>, <16 x float>, i16, i32) nounwind readnone
150
151 declare <4 x float> @llvm.x86.avx512.mask.sqrt.ss(<4 x float>, <4 x float>, <4 x float>, i8, i32) nounwind readnone
152
153 define <4 x float> @test_sqrt_ss(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2, i8 %mask) {
154 ; CHECK-LABEL: test_sqrt_ss:
155 ; CHECK:       ## BB#0:
156 ; CHECK-NEXT:    andl $1, %edi
157 ; CHECK-NEXT:    kmovw %edi, %k1
158 ; CHECK-NEXT:    vmovaps %zmm2, %zmm3
159 ; CHECK-NEXT:    vsqrtss %xmm1, %xmm0, %xmm3 {%k1}
160 ; CHECK-NEXT:    vsqrtss {rd-sae}, %xmm1, %xmm0, %xmm2 {%k1}
161 ; CHECK-NEXT:    vsqrtss {ru-sae}, %xmm1, %xmm0, %xmm4 {%k1} {z}
162 ; CHECK-NEXT:    vsqrtss {rz-sae}, %xmm1, %xmm0, %xmm0
163 ; CHECK-NEXT:    vaddps %xmm2, %xmm3, %xmm1
164 ; CHECK-NEXT:    vaddps %xmm0, %xmm4, %xmm0
165 ; CHECK-NEXT:    vaddps %xmm0, %xmm1, %xmm0
166 ; CHECK-NEXT:    retq
167   %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)
168   %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)
169   %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)
170   %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)
171
172   %res.1 = fadd <4 x float> %res0, %res1
173   %res.2 = fadd <4 x float> %res2, %res3
174   %res   = fadd <4 x float> %res.1, %res.2
175   ret <4 x float> %res
176 }
177
178 declare <2 x double> @llvm.x86.avx512.mask.sqrt.sd(<2 x double>, <2 x double>, <2 x double>, i8, i32) nounwind readnone
179
180 define <2 x double> @test_sqrt_sd(<2 x double> %a0, <2 x double> %a1, <2 x double> %a2, i8 %mask) {
181 ; CHECK-LABEL: test_sqrt_sd:
182 ; CHECK:       ## BB#0:
183 ; CHECK-NEXT:    andl $1, %edi
184 ; CHECK-NEXT:    kmovw %edi, %k1
185 ; CHECK-NEXT:    vmovaps %zmm2, %zmm3
186 ; CHECK-NEXT:    vsqrtsd %xmm1, %xmm0, %xmm3 {%k1}
187 ; CHECK-NEXT:    vsqrtsd {rd-sae}, %xmm1, %xmm0, %xmm2 {%k1}
188 ; CHECK-NEXT:    vsqrtsd {ru-sae}, %xmm1, %xmm0, %xmm4 {%k1} {z}
189 ; CHECK-NEXT:    vsqrtsd {rz-sae}, %xmm1, %xmm0, %xmm0
190 ; CHECK-NEXT:    vaddpd %xmm2, %xmm3, %xmm1
191 ; CHECK-NEXT:    vaddpd %xmm0, %xmm4, %xmm0
192 ; CHECK-NEXT:    vaddpd %xmm0, %xmm1, %xmm0
193 ; CHECK-NEXT:    retq
194   %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)
195   %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)
196   %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)
197   %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)
198
199   %res.1 = fadd <2 x double> %res0, %res1
200   %res.2 = fadd <2 x double> %res2, %res3
201   %res   = fadd <2 x double> %res.1, %res.2
202   ret <2 x double> %res
203 }
204
205 define i64 @test_x86_sse2_cvtsd2si64(<2 x double> %a0) {
206   ; CHECK: vcvtsd2si {{.*}}encoding: [0x62
207   %res = call i64 @llvm.x86.sse2.cvtsd2si64(<2 x double> %a0) ; <i64> [#uses=1]
208   ret i64 %res
209 }
210 declare i64 @llvm.x86.sse2.cvtsd2si64(<2 x double>) nounwind readnone
211
212 define <2 x double> @test_x86_sse2_cvtsi642sd(<2 x double> %a0, i64 %a1) {
213   ; CHECK: vcvtsi2sdq {{.*}}encoding: [0x62
214   %res = call <2 x double> @llvm.x86.sse2.cvtsi642sd(<2 x double> %a0, i64 %a1) ; <<2 x double>> [#uses=1]
215   ret <2 x double> %res
216 }
217 declare <2 x double> @llvm.x86.sse2.cvtsi642sd(<2 x double>, i64) nounwind readnone
218
219 define i64 @test_x86_avx512_cvttsd2si64(<2 x double> %a0) {
220   ; CHECK: vcvttsd2si {{.*}}encoding: [0x62
221   ; CHECK: vcvttsd2si {sae}{{.*}}encoding: [0x62
222   %res0 = call i64 @llvm.x86.avx512.cvttsd2si64(<2 x double> %a0, i32 4) ;
223   %res1 = call i64 @llvm.x86.avx512.cvttsd2si64(<2 x double> %a0, i32 8) ;
224   %res2 = add i64 %res0, %res1
225   ret i64 %res2
226 }
227 declare i64 @llvm.x86.avx512.cvttsd2si64(<2 x double>, i32) nounwind readnone
228
229 define i32 @test_x86_avx512_cvttsd2usi(<2 x double> %a0) {
230   ; CHECK: vcvttsd2usi {{.*}}encoding: [0x62
231   ; CHECK: vcvttsd2usi {sae}{{.*}}encoding: [0x62
232   %res0 = call i32 @llvm.x86.avx512.cvttsd2usi(<2 x double> %a0, i32 4) ;
233   %res1 = call i32 @llvm.x86.avx512.cvttsd2usi(<2 x double> %a0, i32 8) ;
234   %res2 = add i32 %res0, %res1
235   ret i32 %res2
236 }
237 declare i32 @llvm.x86.avx512.cvttsd2usi(<2 x double>, i32) nounwind readnone
238
239 define i32 @test_x86_avx512_cvttsd2si(<2 x double> %a0) {
240   ; CHECK: vcvttsd2si {{.*}}encoding: [0x62
241   ; CHECK: vcvttsd2si {sae}{{.*}}encoding: [0x62
242   %res0 = call i32 @llvm.x86.avx512.cvttsd2si(<2 x double> %a0, i32 4) ;
243   %res1 = call i32 @llvm.x86.avx512.cvttsd2si(<2 x double> %a0, i32 8) ;
244   %res2 = add i32 %res0, %res1
245   ret i32 %res2
246 }
247 declare i32 @llvm.x86.avx512.cvttsd2si(<2 x double>, i32) nounwind readnone
248
249
250
251 define i64 @test_x86_avx512_cvttsd2usi64(<2 x double> %a0) {
252   ; CHECK: vcvttsd2usi {{.*}}encoding: [0x62
253   ; CHECK: vcvttsd2usi {sae}{{.*}}encoding: [0x62
254   %res0 = call i64 @llvm.x86.avx512.cvttsd2usi64(<2 x double> %a0, i32 4) ;
255   %res1 = call i64 @llvm.x86.avx512.cvttsd2usi64(<2 x double> %a0, i32 8) ;
256   %res2 = add i64 %res0, %res1
257   ret i64 %res2
258 }
259 declare i64 @llvm.x86.avx512.cvttsd2usi64(<2 x double>, i32) nounwind readnone
260
261 define i64 @test_x86_sse_cvtss2si64(<4 x float> %a0) {
262   ; CHECK: vcvtss2si {{.*}}encoding: [0x62
263   %res = call i64 @llvm.x86.sse.cvtss2si64(<4 x float> %a0) ; <i64> [#uses=1]
264   ret i64 %res
265 }
266 declare i64 @llvm.x86.sse.cvtss2si64(<4 x float>) nounwind readnone
267
268
269 define <4 x float> @test_x86_sse_cvtsi642ss(<4 x float> %a0, i64 %a1) {
270   ; CHECK: vcvtsi2ssq {{.*}}encoding: [0x62
271   %res = call <4 x float> @llvm.x86.sse.cvtsi642ss(<4 x float> %a0, i64 %a1) ; <<4 x float>> [#uses=1]
272   ret <4 x float> %res
273 }
274 declare <4 x float> @llvm.x86.sse.cvtsi642ss(<4 x float>, i64) nounwind readnone
275
276
277 define i32 @test_x86_avx512_cvttss2si(<4 x float> %a0) {
278   ; CHECK: vcvttss2si {sae}{{.*}}encoding: [0x62
279   ; CHECK: vcvttss2si {{.*}}encoding: [0x62
280   %res0 = call i32 @llvm.x86.avx512.cvttss2si(<4 x float> %a0, i32 8) ;
281   %res1 = call i32 @llvm.x86.avx512.cvttss2si(<4 x float> %a0, i32 4) ;
282   %res2 = add i32 %res0, %res1
283   ret i32 %res2
284 }
285 declare i32 @llvm.x86.avx512.cvttss2si(<4 x float>, i32) nounwind readnone
286
287 define i64 @test_x86_avx512_cvttss2si64(<4 x float> %a0) {
288   ; CHECK: vcvttss2si {{.*}}encoding: [0x62
289   ; CHECK: vcvttss2si {sae}{{.*}}encoding: [0x62
290   %res0 = call i64 @llvm.x86.avx512.cvttss2si64(<4 x float> %a0, i32 4) ;
291   %res1 = call i64 @llvm.x86.avx512.cvttss2si64(<4 x float> %a0, i32 8) ;
292   %res2 = add i64 %res0, %res1
293   ret i64 %res2
294 }
295 declare i64 @llvm.x86.avx512.cvttss2si64(<4 x float>, i32) nounwind readnone
296
297 define i32 @test_x86_avx512_cvttss2usi(<4 x float> %a0) {
298   ; CHECK: vcvttss2usi {sae}{{.*}}encoding: [0x62
299   ; CHECK: vcvttss2usi {{.*}}encoding: [0x62
300   %res0 = call i32 @llvm.x86.avx512.cvttss2usi(<4 x float> %a0, i32 8) ;
301   %res1 = call i32 @llvm.x86.avx512.cvttss2usi(<4 x float> %a0, i32 4) ;
302   %res2 = add i32 %res0, %res1
303   ret i32 %res2
304 }
305 declare i32 @llvm.x86.avx512.cvttss2usi(<4 x float>, i32) nounwind readnone
306
307 define i64 @test_x86_avx512_cvttss2usi64(<4 x float> %a0) {
308   ; CHECK: vcvttss2usi {{.*}}encoding: [0x62
309   ; CHECK: vcvttss2usi {sae}{{.*}}encoding: [0x62
310   %res0 = call i64 @llvm.x86.avx512.cvttss2usi64(<4 x float> %a0, i32 4) ;
311   %res1 = call i64 @llvm.x86.avx512.cvttss2usi64(<4 x float> %a0, i32 8) ;
312   %res2 = add i64 %res0, %res1
313   ret i64 %res2
314 }
315 declare i64 @llvm.x86.avx512.cvttss2usi64(<4 x float>, i32) nounwind readnone
316
317 define i64 @test_x86_avx512_cvtsd2usi64(<2 x double> %a0) {
318   ; CHECK: vcvtsd2usi {{.*}}encoding: [0x62
319   %res = call i64 @llvm.x86.avx512.cvtsd2usi64(<2 x double> %a0) ; <i64> [#uses=1]
320   ret i64 %res
321 }
322 declare i64 @llvm.x86.avx512.cvtsd2usi64(<2 x double>) nounwind readnone
323
324 define <16 x float> @test_x86_vcvtph2ps_512(<16 x i16> %a0) {
325   ; CHECK: vcvtph2ps  %ymm0, %zmm0    ## encoding: [0x62,0xf2,0x7d,0x48,0x13,0xc0]
326   %res = call <16 x float> @llvm.x86.avx512.mask.vcvtph2ps.512(<16 x i16> %a0, <16 x float> zeroinitializer, i16 -1, i32 4)
327   ret <16 x float> %res
328 }
329 declare <16 x float> @llvm.x86.avx512.mask.vcvtph2ps.512(<16 x i16>, <16 x float>, i16, i32) nounwind readonly
330
331
332 define <16 x i16> @test_x86_vcvtps2ph_256(<16 x float> %a0) {
333   ; CHECK: vcvtps2ph $2, %zmm0, %ymm0  ## encoding: [0x62,0xf3,0x7d,0x48,0x1d,0xc0,0x02]
334   %res = call <16 x i16> @llvm.x86.avx512.mask.vcvtps2ph.512(<16 x float> %a0, i32 2, <16 x i16> zeroinitializer, i16 -1)
335   ret <16 x i16> %res
336 }
337
338 declare <16 x i16> @llvm.x86.avx512.mask.vcvtps2ph.512(<16 x float>, i32, <16 x i16>, i16) nounwind readonly
339
340 define <16 x float> @test_x86_vbroadcast_ss_512(i8* %a0) {
341   ; CHECK: vbroadcastss
342   %res = call <16 x float> @llvm.x86.avx512.vbroadcast.ss.512(i8* %a0) ; <<16 x float>> [#uses=1]
343   ret <16 x float> %res
344 }
345 declare <16 x float> @llvm.x86.avx512.vbroadcast.ss.512(i8*) nounwind readonly
346
347 define <8 x double> @test_x86_vbroadcast_sd_512(i8* %a0) {
348   ; CHECK: vbroadcastsd
349   %res = call <8 x double> @llvm.x86.avx512.vbroadcast.sd.512(i8* %a0) ; <<8 x double>> [#uses=1]
350   ret <8 x double> %res
351 }
352 declare <8 x double> @llvm.x86.avx512.vbroadcast.sd.512(i8*) nounwind readonly
353
354 define <16 x float> @test_x86_vbroadcast_ss_ps_512(<4 x float> %a0) {
355   ; CHECK: vbroadcastss
356   %res = call <16 x float> @llvm.x86.avx512.vbroadcast.ss.ps.512(<4 x float> %a0) ; <<16 x float>> [#uses=1]
357   ret <16 x float> %res
358 }
359 declare <16 x float> @llvm.x86.avx512.vbroadcast.ss.ps.512(<4 x float>) nounwind readonly
360
361 define <8 x double> @test_x86_vbroadcast_sd_pd_512(<2 x double> %a0) {
362   ; CHECK: vbroadcastsd
363   %res = call <8 x double> @llvm.x86.avx512.vbroadcast.sd.pd.512(<2 x double> %a0) ; <<8 x double>> [#uses=1]
364   ret <8 x double> %res
365 }
366 declare <8 x double> @llvm.x86.avx512.vbroadcast.sd.pd.512(<2 x double>) nounwind readonly
367
368 define <16 x i32> @test_x86_pbroadcastd_512(<4 x i32>  %a0) {
369   ; CHECK: vpbroadcastd
370   %res = call <16 x i32> @llvm.x86.avx512.pbroadcastd.512(<4 x i32> %a0) ; <<16 x i32>> [#uses=1]
371   ret <16 x i32> %res
372 }
373 declare <16 x i32> @llvm.x86.avx512.pbroadcastd.512(<4 x i32>) nounwind readonly
374
375 define <16 x i32> @test_x86_pbroadcastd_i32_512(i32  %a0) {
376   ; CHECK: vpbroadcastd
377   %res = call <16 x i32> @llvm.x86.avx512.pbroadcastd.i32.512(i32 %a0) ; <<16 x i32>> [#uses=1]
378   ret <16 x i32> %res
379 }
380 declare <16 x i32> @llvm.x86.avx512.pbroadcastd.i32.512(i32) nounwind readonly
381
382 define <8 x i64> @test_x86_pbroadcastq_512(<2 x i64> %a0) {
383   ; CHECK: vpbroadcastq
384   %res = call <8 x i64> @llvm.x86.avx512.pbroadcastq.512(<2 x i64> %a0) ; <<8 x i64>> [#uses=1]
385   ret <8 x i64> %res
386 }
387 declare <8 x i64> @llvm.x86.avx512.pbroadcastq.512(<2 x i64>) nounwind readonly
388
389 define <8 x i64> @test_x86_pbroadcastq_i64_512(i64 %a0) {
390   ; CHECK: vpbroadcastq
391   %res = call <8 x i64> @llvm.x86.avx512.pbroadcastq.i64.512(i64 %a0) ; <<8 x i64>> [#uses=1]
392   ret <8 x i64> %res
393 }
394 declare <8 x i64> @llvm.x86.avx512.pbroadcastq.i64.512(i64) nounwind readonly
395
396 define <16 x i32> @test_conflict_d(<16 x i32> %a) {
397 ; CHECK-LABEL: test_conflict_d:
398 ; CHECK:       ## BB#0:
399 ; CHECK-NEXT:    vpconflictd %zmm0, %zmm0
400 ; CHECK-NEXT:    retq ## encoding: [0xc3]
401   %res = call <16 x i32> @llvm.x86.avx512.mask.conflict.d.512(<16 x i32> %a, <16 x i32> zeroinitializer, i16 -1)
402   ret <16 x i32> %res
403 }
404
405 declare <16 x i32> @llvm.x86.avx512.mask.conflict.d.512(<16 x i32>, <16 x i32>, i16) nounwind readonly
406
407 define <8 x i64> @test_conflict_q(<8 x i64> %a) {
408 ; CHECK-LABEL: test_conflict_q:
409 ; CHECK:       ## BB#0:
410 ; CHECK-NEXT:    vpconflictq %zmm0, %zmm0
411 ; CHECK-NEXT:    retq
412   %res = call <8 x i64> @llvm.x86.avx512.mask.conflict.q.512(<8 x i64> %a, <8 x i64> zeroinitializer, i8 -1)
413   ret <8 x i64> %res
414 }
415
416 declare <8 x i64> @llvm.x86.avx512.mask.conflict.q.512(<8 x i64>, <8 x i64>, i8) nounwind readonly
417
418 define <16 x i32> @test_maskz_conflict_d(<16 x i32> %a, i16 %mask) {
419 ; CHECK-LABEL: test_maskz_conflict_d:
420 ; CHECK:       ## BB#0:
421 ; CHECK-NEXT:    kmovw %edi, %k1
422 ; CHECK-NEXT:    vpconflictd %zmm0, %zmm0 {%k1} {z}
423 ; CHECK-NEXT:    retq
424   %res = call <16 x i32> @llvm.x86.avx512.mask.conflict.d.512(<16 x i32> %a, <16 x i32> zeroinitializer, i16 %mask)
425   ret <16 x i32> %res
426 }
427
428 define <8 x i64> @test_mask_conflict_q(<8 x i64> %a, <8 x i64> %b, i8 %mask) {
429 ; CHECK-LABEL: test_mask_conflict_q:
430 ; CHECK:       ## BB#0:
431 ; CHECK-NEXT:    movzbl %dil, %eax
432 ; CHECK-NEXT:    kmovw %eax, %k1
433 ; CHECK-NEXT:    vpconflictq %zmm0, %zmm1 {%k1}
434 ; CHECK-NEXT:    vmovaps %zmm1, %zmm0
435 ; CHECK-NEXT:    retq
436   %res = call <8 x i64> @llvm.x86.avx512.mask.conflict.q.512(<8 x i64> %a, <8 x i64> %b, i8 %mask)
437   ret <8 x i64> %res
438 }
439
440 define <16 x i32> @test_lzcnt_d(<16 x i32> %a) {
441 ; CHECK-LABEL: test_lzcnt_d:
442 ; CHECK:       ## BB#0:
443 ; CHECK-NEXT:    vplzcntd %zmm0, %zmm0
444 ; CHECK-NEXT:    retq
445   %res = call <16 x i32> @llvm.x86.avx512.mask.lzcnt.d.512(<16 x i32> %a, <16 x i32> zeroinitializer, i16 -1)
446   ret <16 x i32> %res
447 }
448
449 declare <16 x i32> @llvm.x86.avx512.mask.lzcnt.d.512(<16 x i32>, <16 x i32>, i16) nounwind readonly
450
451 define <8 x i64> @test_lzcnt_q(<8 x i64> %a) {
452 ; CHECK-LABEL: test_lzcnt_q:
453 ; CHECK:       ## BB#0:
454 ; CHECK-NEXT:    vplzcntq %zmm0, %zmm0
455 ; CHECK-NEXT:    retq
456   %res = call <8 x i64> @llvm.x86.avx512.mask.lzcnt.q.512(<8 x i64> %a, <8 x i64> zeroinitializer, i8 -1)
457   ret <8 x i64> %res
458 }
459
460 declare <8 x i64> @llvm.x86.avx512.mask.lzcnt.q.512(<8 x i64>, <8 x i64>, i8) nounwind readonly
461
462
463 define <16 x i32> @test_mask_lzcnt_d(<16 x i32> %a, <16 x i32> %b, i16 %mask) {
464 ; CHECK-LABEL: test_mask_lzcnt_d:
465 ; CHECK:       ## BB#0:
466 ; CHECK-NEXT:    kmovw %edi, %k1
467 ; CHECK-NEXT:    vplzcntd %zmm0, %zmm1 {%k1}
468 ; CHECK-NEXT:    vmovaps %zmm1, %zmm0
469 ; CHECK-NEXT:    retq
470   %res = call <16 x i32> @llvm.x86.avx512.mask.lzcnt.d.512(<16 x i32> %a, <16 x i32> %b, i16 %mask)
471   ret <16 x i32> %res
472 }
473
474 define <8 x i64> @test_mask_lzcnt_q(<8 x i64> %a, <8 x i64> %b, i8 %mask) {
475 ; CHECK-LABEL: test_mask_lzcnt_q:
476 ; CHECK:       ## BB#0:
477 ; CHECK-NEXT:    movzbl %dil, %eax
478 ; CHECK-NEXT:    kmovw %eax, %k1
479 ; CHECK-NEXT:    vplzcntq %zmm0, %zmm1 {%k1}
480 ; CHECK-NEXT:    vmovaps %zmm1, %zmm0
481 ; CHECK-NEXT:    retq ## encoding: [0xc3]
482   %res = call <8 x i64> @llvm.x86.avx512.mask.lzcnt.q.512(<8 x i64> %a, <8 x i64> %b, i8 %mask)
483   ret <8 x i64> %res
484 }
485
486 define <16 x float> @test_x86_mask_blend_ps_512(i16 %a0, <16 x float> %a1, <16 x float> %a2) {
487   ; CHECK: vblendmps %zmm1, %zmm0
488   %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]
489   ret <16 x float> %res
490 }
491
492 declare <16 x float> @llvm.x86.avx512.mask.blend.ps.512(<16 x float>, <16 x float>, i16) nounwind readonly
493
494 define <8 x double> @test_x86_mask_blend_pd_512(i8 %a0, <8 x double> %a1, <8 x double> %a2) {
495   ; CHECK: vblendmpd %zmm1, %zmm0
496   %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]
497   ret <8 x double> %res
498 }
499
500 define <8 x double> @test_x86_mask_blend_pd_512_memop(<8 x double> %a, <8 x double>* %ptr, i8 %mask) {
501   ; CHECK-LABEL: test_x86_mask_blend_pd_512_memop
502   ; CHECK: vblendmpd (%
503   %b = load <8 x double>, <8 x double>* %ptr
504   %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]
505   ret <8 x double> %res
506 }
507 declare <8 x double> @llvm.x86.avx512.mask.blend.pd.512(<8 x double>, <8 x double>, i8) nounwind readonly
508
509 define <16 x i32> @test_x86_mask_blend_d_512(i16 %a0, <16 x i32> %a1, <16 x i32> %a2) {
510   ; CHECK: vpblendmd
511   %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]
512   ret <16 x i32> %res
513 }
514 declare <16 x i32> @llvm.x86.avx512.mask.blend.d.512(<16 x i32>, <16 x i32>, i16) nounwind readonly
515
516 define <8 x i64> @test_x86_mask_blend_q_512(i8 %a0, <8 x i64> %a1, <8 x i64> %a2) {
517   ; CHECK: vpblendmq
518   %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]
519   ret <8 x i64> %res
520 }
521 declare <8 x i64> @llvm.x86.avx512.mask.blend.q.512(<8 x i64>, <8 x i64>, i8) nounwind readonly
522
523  define i16 @test_cmpps(<16 x float> %a, <16 x float> %b) {
524  ;CHECK: vcmpleps {sae}{{.*}}encoding: [0x62,0xf1,0x7c,0x18,0xc2,0xc1,0x02]
525    %res = call i16 @llvm.x86.avx512.mask.cmp.ps.512(<16 x float> %a, <16 x float> %b, i32 2, i16 -1, i32 8)
526    ret i16 %res
527  }
528  declare i16 @llvm.x86.avx512.mask.cmp.ps.512(<16 x float> , <16 x float> , i32, i16, i32)
529
530  define i8 @test_cmppd(<8 x double> %a, <8 x double> %b) {
531  ;CHECK: vcmpneqpd %zmm{{.*}}encoding: [0x62,0xf1,0xfd,0x48,0xc2,0xc1,0x04]
532    %res = call i8 @llvm.x86.avx512.mask.cmp.pd.512(<8 x double> %a, <8 x double> %b, i32 4, i8 -1, i32 4)
533    ret i8 %res
534  }
535  declare i8 @llvm.x86.avx512.mask.cmp.pd.512(<8 x double> , <8 x double> , i32, i8, i32)
536
537  ; fp min - max
538 define <8 x double> @test_vmaxpd(<8 x double> %a0, <8 x double> %a1) {
539   ; CHECK: vmaxpd
540   %res = call <8 x double> @llvm.x86.avx512.mask.max.pd.512(<8 x double> %a0, <8 x double> %a1,
541                     <8 x double>zeroinitializer, i8 -1, i32 4)
542   ret <8 x double> %res
543 }
544 declare <8 x double> @llvm.x86.avx512.mask.max.pd.512(<8 x double>, <8 x double>,
545                     <8 x double>, i8, i32)
546
547 define <8 x double> @test_vminpd(<8 x double> %a0, <8 x double> %a1) {
548   ; CHECK: vminpd
549   %res = call <8 x double> @llvm.x86.avx512.mask.min.pd.512(<8 x double> %a0, <8 x double> %a1,
550                     <8 x double>zeroinitializer, i8 -1, i32 4)
551   ret <8 x double> %res
552 }
553 declare <8 x double> @llvm.x86.avx512.mask.min.pd.512(<8 x double>, <8 x double>,
554                     <8 x double>, i8, i32)
555
556  declare <16 x i32> @llvm.x86.avx512.mask.pabs.d.512(<16 x i32>, <16 x i32>, i16)
557
558 ; CHECK-LABEL: @test_int_x86_avx512_mask_pabs_d_512
559 ; CHECK-NOT: call 
560 ; CHECK: kmov 
561 ; CHECK: vpabsd{{.*}}{%k1} 
562 define <16 x i32>@test_int_x86_avx512_mask_pabs_d_512(<16 x i32> %x0, <16 x i32> %x1, i16 %x2) {
563   %res = call <16 x i32> @llvm.x86.avx512.mask.pabs.d.512(<16 x i32> %x0, <16 x i32> %x1, i16 %x2)
564   %res1 = call <16 x i32> @llvm.x86.avx512.mask.pabs.d.512(<16 x i32> %x0, <16 x i32> %x1, i16 -1)
565   %res2 = add <16 x i32> %res, %res1
566   ret <16 x i32> %res2
567 }
568
569 declare <8 x i64> @llvm.x86.avx512.mask.pabs.q.512(<8 x i64>, <8 x i64>, i8)
570
571 ; CHECK-LABEL: @test_int_x86_avx512_mask_pabs_q_512
572 ; CHECK-NOT: call 
573 ; CHECK: kmov 
574 ; CHECK: vpabsq{{.*}}{%k1} 
575 define <8 x i64>@test_int_x86_avx512_mask_pabs_q_512(<8 x i64> %x0, <8 x i64> %x1, i8 %x2) {
576   %res = call <8 x i64> @llvm.x86.avx512.mask.pabs.q.512(<8 x i64> %x0, <8 x i64> %x1, i8 %x2)
577   %res1 = call <8 x i64> @llvm.x86.avx512.mask.pabs.q.512(<8 x i64> %x0, <8 x i64> %x1, i8 -1)
578   %res2 = add <8 x i64> %res, %res1
579   ret <8 x i64> %res2
580 }
581
582 define i8 @test_vptestmq(<8 x i64> %a0, <8 x i64> %a1) {
583   ; CHECK: vptestmq {{.*}}encoding: [0x62,0xf2,0xfd,0x48,0x27,0xc1]
584   %res = call i8 @llvm.x86.avx512.mask.ptestm.q.512(<8 x i64> %a0, <8 x i64> %a1, i8 -1)
585   ret i8 %res
586 }
587 declare i8 @llvm.x86.avx512.mask.ptestm.q.512(<8 x i64>, <8 x i64>, i8)
588
589 define i16 @test_vptestmd(<16 x i32> %a0, <16 x i32> %a1) {
590   ; CHECK: vptestmd {{.*}}encoding: [0x62,0xf2,0x7d,0x48,0x27,0xc1]
591   %res = call i16 @llvm.x86.avx512.mask.ptestm.d.512(<16 x i32> %a0, <16 x i32> %a1, i16 -1)
592   ret i16 %res
593 }
594 declare i16 @llvm.x86.avx512.mask.ptestm.d.512(<16 x i32>, <16 x i32>, i16)
595
596 define void @test_store1(<16 x float> %data, i8* %ptr, i16 %mask) {
597 ; CHECK: vmovups {{.*}}encoding: [0x62,0xf1,0x7c,0x49,0x11,0x07]
598   call void @llvm.x86.avx512.mask.storeu.ps.512(i8* %ptr, <16 x float> %data, i16 %mask)
599   ret void
600 }
601
602 declare void @llvm.x86.avx512.mask.storeu.ps.512(i8*, <16 x float>, i16 )
603
604 define void @test_store2(<8 x double> %data, i8* %ptr, i8 %mask) {
605 ; CHECK: vmovupd {{.*}}encoding: [0x62,0xf1,0xfd,0x49,0x11,0x07]
606   call void @llvm.x86.avx512.mask.storeu.pd.512(i8* %ptr, <8 x double> %data, i8 %mask)
607   ret void
608 }
609
610 declare void @llvm.x86.avx512.mask.storeu.pd.512(i8*, <8 x double>, i8)
611
612 define void @test_mask_store_aligned_ps(<16 x float> %data, i8* %ptr, i16 %mask) {
613 ; CHECK-LABEL: test_mask_store_aligned_ps:
614 ; CHECK:       ## BB#0:
615 ; CHECK-NEXT:    kmovw %esi, %k1
616 ; CHECK-NEXT:    vmovaps %zmm0, (%rdi) {%k1}
617 ; CHECK-NEXT:    retq
618   call void @llvm.x86.avx512.mask.store.ps.512(i8* %ptr, <16 x float> %data, i16 %mask)
619   ret void
620 }
621
622 declare void @llvm.x86.avx512.mask.store.ps.512(i8*, <16 x float>, i16 )
623
624 define void @test_mask_store_aligned_pd(<8 x double> %data, i8* %ptr, i8 %mask) {
625 ; CHECK-LABEL: test_mask_store_aligned_pd:
626 ; CHECK:       ## BB#0:
627 ; CHECK-NEXT:    kmovw %esi, %k1
628 ; CHECK-NEXT:    vmovapd %zmm0, (%rdi) {%k1}
629 ; CHECK-NEXT:    retq
630   call void @llvm.x86.avx512.mask.store.pd.512(i8* %ptr, <8 x double> %data, i8 %mask)
631   ret void
632 }
633
634 declare void @llvm.x86.avx512.mask.store.pd.512(i8*, <8 x double>, i8)
635
636 define <16 x float> @test_maskz_load_aligned_ps(<16 x float> %data, i8* %ptr, i16 %mask) {
637 ; CHECK-LABEL: test_maskz_load_aligned_ps:
638 ; CHECK:       ## BB#0:
639 ; CHECK-NEXT:    kmovw %esi, %k1
640 ; CHECK-NEXT:    vmovaps (%rdi), %zmm0 {%k1} {z}
641 ; CHECK-NEXT:    retq
642   %res = call <16 x float> @llvm.x86.avx512.mask.load.ps.512(i8* %ptr, <16 x float> zeroinitializer, i16 %mask)
643   ret <16 x float> %res
644 }
645
646 declare <16 x float> @llvm.x86.avx512.mask.load.ps.512(i8*, <16 x float>, i16)
647
648 define <8 x double> @test_maskz_load_aligned_pd(<8 x double> %data, i8* %ptr, i8 %mask) {
649 ; CHECK-LABEL: test_maskz_load_aligned_pd:
650 ; CHECK:       ## BB#0:
651 ; CHECK-NEXT:    kmovw %esi, %k1
652 ; CHECK-NEXT:    vmovapd (%rdi), %zmm0 {%k1} {z}
653 ; CHECK-NEXT:    retq
654   %res = call <8 x double> @llvm.x86.avx512.mask.load.pd.512(i8* %ptr, <8 x double> zeroinitializer, i8 %mask)
655   ret <8 x double> %res
656 }
657
658 declare <8 x double> @llvm.x86.avx512.mask.load.pd.512(i8*, <8 x double>, i8)
659
660 define <16 x float> @test_load_aligned_ps(<16 x float> %data, i8* %ptr, i16 %mask) {
661 ; CHECK-LABEL: test_load_aligned_ps:
662 ; CHECK:       ## BB#0:
663 ; CHECK-NEXT:    vmovaps (%rdi), %zmm0
664 ; CHECK-NEXT:    retq
665   %res = call <16 x float> @llvm.x86.avx512.mask.load.ps.512(i8* %ptr, <16 x float> zeroinitializer, i16 -1)
666   ret <16 x float> %res
667 }
668
669 define <8 x double> @test_load_aligned_pd(<8 x double> %data, i8* %ptr, i8 %mask) {
670 ; CHECK-LABEL: test_load_aligned_pd:
671 ; CHECK:       ## BB#0:
672 ; CHECK-NEXT:    vmovapd (%rdi), %zmm0
673 ; CHECK-NEXT:    retq
674   %res = call <8 x double> @llvm.x86.avx512.mask.load.pd.512(i8* %ptr, <8 x double> zeroinitializer, i8 -1)
675   ret <8 x double> %res
676 }
677
678 declare <8 x i64> @llvm.x86.avx512.movntdqa(i8*)
679
680 define <8 x i64> @test_valign_q(<8 x i64> %a, <8 x i64> %b) {
681 ; CHECK-LABEL: test_valign_q:
682 ; CHECK: valignq $2, %zmm1, %zmm0, %zmm0
683   %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)
684   ret <8 x i64> %res
685 }
686
687 define <8 x i64> @test_mask_valign_q(<8 x i64> %a, <8 x i64> %b, <8 x i64> %src, i8 %mask) {
688 ; CHECK-LABEL: test_mask_valign_q:
689 ; CHECK: valignq $2, %zmm1, %zmm0, %zmm2 {%k1}
690   %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)
691   ret <8 x i64> %res
692 }
693
694 declare <8 x i64> @llvm.x86.avx512.mask.valign.q.512(<8 x i64>, <8 x i64>, i32, <8 x i64>, i8)
695
696 define <16 x i32> @test_maskz_valign_d(<16 x i32> %a, <16 x i32> %b, i16 %mask) {
697 ; CHECK-LABEL: test_maskz_valign_d:
698 ; CHECK: valignd $5, %zmm1, %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf3,0x7d,0xc9,0x03,0xc1,0x05]
699   %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)
700   ret <16 x i32> %res
701 }
702
703 declare <16 x i32> @llvm.x86.avx512.mask.valign.d.512(<16 x i32>, <16 x i32>, i32, <16 x i32>, i16)
704
705 define void @test_mask_store_ss(i8* %ptr, <4 x float> %data, i8 %mask) {
706  ; CHECK-LABEL: test_mask_store_ss
707  ; CHECK: vmovss %xmm0, (%rdi) {%k1}     ## encoding: [0x62,0xf1,0x7e,0x09,0x11,0x07]
708  call void @llvm.x86.avx512.mask.store.ss(i8* %ptr, <4 x float> %data, i8 %mask)
709  ret void
710 }
711
712 declare void @llvm.x86.avx512.mask.store.ss(i8*, <4 x float>, i8 )
713
714 define i16 @test_pcmpeq_d(<16 x i32> %a, <16 x i32> %b) {
715 ; CHECK-LABEL: test_pcmpeq_d
716 ; CHECK: vpcmpeqd %zmm1, %zmm0, %k0 ##
717   %res = call i16 @llvm.x86.avx512.mask.pcmpeq.d.512(<16 x i32> %a, <16 x i32> %b, i16 -1)
718   ret i16 %res
719 }
720
721 define i16 @test_mask_pcmpeq_d(<16 x i32> %a, <16 x i32> %b, i16 %mask) {
722 ; CHECK-LABEL: test_mask_pcmpeq_d
723 ; CHECK: vpcmpeqd %zmm1, %zmm0, %k0 {%k1} ##
724   %res = call i16 @llvm.x86.avx512.mask.pcmpeq.d.512(<16 x i32> %a, <16 x i32> %b, i16 %mask)
725   ret i16 %res
726 }
727
728 declare i16 @llvm.x86.avx512.mask.pcmpeq.d.512(<16 x i32>, <16 x i32>, i16)
729
730 define i8 @test_pcmpeq_q(<8 x i64> %a, <8 x i64> %b) {
731 ; CHECK-LABEL: test_pcmpeq_q
732 ; CHECK: vpcmpeqq %zmm1, %zmm0, %k0 ##
733   %res = call i8 @llvm.x86.avx512.mask.pcmpeq.q.512(<8 x i64> %a, <8 x i64> %b, i8 -1)
734   ret i8 %res
735 }
736
737 define i8 @test_mask_pcmpeq_q(<8 x i64> %a, <8 x i64> %b, i8 %mask) {
738 ; CHECK-LABEL: test_mask_pcmpeq_q
739 ; CHECK: vpcmpeqq %zmm1, %zmm0, %k0 {%k1} ##
740   %res = call i8 @llvm.x86.avx512.mask.pcmpeq.q.512(<8 x i64> %a, <8 x i64> %b, i8 %mask)
741   ret i8 %res
742 }
743
744 declare i8 @llvm.x86.avx512.mask.pcmpeq.q.512(<8 x i64>, <8 x i64>, i8)
745
746 define i16 @test_pcmpgt_d(<16 x i32> %a, <16 x i32> %b) {
747 ; CHECK-LABEL: test_pcmpgt_d
748 ; CHECK: vpcmpgtd %zmm1, %zmm0, %k0 ##
749   %res = call i16 @llvm.x86.avx512.mask.pcmpgt.d.512(<16 x i32> %a, <16 x i32> %b, i16 -1)
750   ret i16 %res
751 }
752
753 define i16 @test_mask_pcmpgt_d(<16 x i32> %a, <16 x i32> %b, i16 %mask) {
754 ; CHECK-LABEL: test_mask_pcmpgt_d
755 ; CHECK: vpcmpgtd %zmm1, %zmm0, %k0 {%k1} ##
756   %res = call i16 @llvm.x86.avx512.mask.pcmpgt.d.512(<16 x i32> %a, <16 x i32> %b, i16 %mask)
757   ret i16 %res
758 }
759
760 declare i16 @llvm.x86.avx512.mask.pcmpgt.d.512(<16 x i32>, <16 x i32>, i16)
761
762 define i8 @test_pcmpgt_q(<8 x i64> %a, <8 x i64> %b) {
763 ; CHECK-LABEL: test_pcmpgt_q
764 ; CHECK: vpcmpgtq %zmm1, %zmm0, %k0 ##
765   %res = call i8 @llvm.x86.avx512.mask.pcmpgt.q.512(<8 x i64> %a, <8 x i64> %b, i8 -1)
766   ret i8 %res
767 }
768
769 define i8 @test_mask_pcmpgt_q(<8 x i64> %a, <8 x i64> %b, i8 %mask) {
770 ; CHECK-LABEL: test_mask_pcmpgt_q
771 ; CHECK: vpcmpgtq %zmm1, %zmm0, %k0 {%k1} ##
772   %res = call i8 @llvm.x86.avx512.mask.pcmpgt.q.512(<8 x i64> %a, <8 x i64> %b, i8 %mask)
773   ret i8 %res
774 }
775
776 declare i8 @llvm.x86.avx512.mask.pcmpgt.q.512(<8 x i64>, <8 x i64>, i8)
777
778 define <8 x i16> @test_cmp_d_512(<16 x i32> %a0, <16 x i32> %a1) {
779 ; CHECK_LABEL: test_cmp_d_512
780 ; CHECK: vpcmpeqd %zmm1, %zmm0, %k0 ##
781   %res0 = call i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 0, i16 -1)
782   %vec0 = insertelement <8 x i16> undef, i16 %res0, i32 0
783 ; CHECK: vpcmpltd %zmm1, %zmm0, %k0 ##
784   %res1 = call i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 1, i16 -1)
785   %vec1 = insertelement <8 x i16> %vec0, i16 %res1, i32 1
786 ; CHECK: vpcmpled %zmm1, %zmm0, %k0 ##
787   %res2 = call i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 2, i16 -1)
788   %vec2 = insertelement <8 x i16> %vec1, i16 %res2, i32 2
789 ; CHECK: vpcmpunordd %zmm1, %zmm0, %k0 ##
790   %res3 = call i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 3, i16 -1)
791   %vec3 = insertelement <8 x i16> %vec2, i16 %res3, i32 3
792 ; CHECK: vpcmpneqd %zmm1, %zmm0, %k0 ##
793   %res4 = call i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 4, i16 -1)
794   %vec4 = insertelement <8 x i16> %vec3, i16 %res4, i32 4
795 ; CHECK: vpcmpnltd %zmm1, %zmm0, %k0 ##
796   %res5 = call i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 5, i16 -1)
797   %vec5 = insertelement <8 x i16> %vec4, i16 %res5, i32 5
798 ; CHECK: vpcmpnled %zmm1, %zmm0, %k0 ##
799   %res6 = call i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 6, i16 -1)
800   %vec6 = insertelement <8 x i16> %vec5, i16 %res6, i32 6
801 ; CHECK: vpcmpordd %zmm1, %zmm0, %k0 ##
802   %res7 = call i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 7, i16 -1)
803   %vec7 = insertelement <8 x i16> %vec6, i16 %res7, i32 7
804   ret <8 x i16> %vec7
805 }
806
807 define <8 x i16> @test_mask_cmp_d_512(<16 x i32> %a0, <16 x i32> %a1, i16 %mask) {
808 ; CHECK_LABEL: test_mask_cmp_d_512
809 ; CHECK: vpcmpeqd %zmm1, %zmm0, %k0 {%k1} ##
810   %res0 = call i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 0, i16 %mask)
811   %vec0 = insertelement <8 x i16> undef, i16 %res0, i32 0
812 ; CHECK: vpcmpltd %zmm1, %zmm0, %k0 {%k1} ##
813   %res1 = call i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 1, i16 %mask)
814   %vec1 = insertelement <8 x i16> %vec0, i16 %res1, i32 1
815 ; CHECK: vpcmpled %zmm1, %zmm0, %k0 {%k1} ##
816   %res2 = call i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 2, i16 %mask)
817   %vec2 = insertelement <8 x i16> %vec1, i16 %res2, i32 2
818 ; CHECK: vpcmpunordd %zmm1, %zmm0, %k0 {%k1} ##
819   %res3 = call i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 3, i16 %mask)
820   %vec3 = insertelement <8 x i16> %vec2, i16 %res3, i32 3
821 ; CHECK: vpcmpneqd %zmm1, %zmm0, %k0 {%k1} ##
822   %res4 = call i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 4, i16 %mask)
823   %vec4 = insertelement <8 x i16> %vec3, i16 %res4, i32 4
824 ; CHECK: vpcmpnltd %zmm1, %zmm0, %k0 {%k1} ##
825   %res5 = call i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 5, i16 %mask)
826   %vec5 = insertelement <8 x i16> %vec4, i16 %res5, i32 5
827 ; CHECK: vpcmpnled %zmm1, %zmm0, %k0 {%k1} ##
828   %res6 = call i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 6, i16 %mask)
829   %vec6 = insertelement <8 x i16> %vec5, i16 %res6, i32 6
830 ; CHECK: vpcmpordd %zmm1, %zmm0, %k0 {%k1} ##
831   %res7 = call i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 7, i16 %mask)
832   %vec7 = insertelement <8 x i16> %vec6, i16 %res7, i32 7
833   ret <8 x i16> %vec7
834 }
835
836 declare i16 @llvm.x86.avx512.mask.cmp.d.512(<16 x i32>, <16 x i32>, i32, i16) nounwind readnone
837
838 define <8 x i16> @test_ucmp_d_512(<16 x i32> %a0, <16 x i32> %a1) {
839 ; CHECK_LABEL: test_ucmp_d_512
840 ; CHECK: vpcmpequd %zmm1, %zmm0, %k0 ##
841   %res0 = call i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 0, i16 -1)
842   %vec0 = insertelement <8 x i16> undef, i16 %res0, i32 0
843 ; CHECK: vpcmpltud %zmm1, %zmm0, %k0 ##
844   %res1 = call i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 1, i16 -1)
845   %vec1 = insertelement <8 x i16> %vec0, i16 %res1, i32 1
846 ; CHECK: vpcmpleud %zmm1, %zmm0, %k0 ##
847   %res2 = call i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 2, i16 -1)
848   %vec2 = insertelement <8 x i16> %vec1, i16 %res2, i32 2
849 ; CHECK: vpcmpunordud %zmm1, %zmm0, %k0 ##
850   %res3 = call i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 3, i16 -1)
851   %vec3 = insertelement <8 x i16> %vec2, i16 %res3, i32 3
852 ; CHECK: vpcmpnequd %zmm1, %zmm0, %k0 ##
853   %res4 = call i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 4, i16 -1)
854   %vec4 = insertelement <8 x i16> %vec3, i16 %res4, i32 4
855 ; CHECK: vpcmpnltud %zmm1, %zmm0, %k0 ##
856   %res5 = call i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 5, i16 -1)
857   %vec5 = insertelement <8 x i16> %vec4, i16 %res5, i32 5
858 ; CHECK: vpcmpnleud %zmm1, %zmm0, %k0 ##
859   %res6 = call i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 6, i16 -1)
860   %vec6 = insertelement <8 x i16> %vec5, i16 %res6, i32 6
861 ; CHECK: vpcmpordud %zmm1, %zmm0, %k0 ##
862   %res7 = call i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 7, i16 -1)
863   %vec7 = insertelement <8 x i16> %vec6, i16 %res7, i32 7
864   ret <8 x i16> %vec7
865 }
866
867 define <8 x i16> @test_mask_ucmp_d_512(<16 x i32> %a0, <16 x i32> %a1, i16 %mask) {
868 ; CHECK_LABEL: test_mask_ucmp_d_512
869 ; CHECK: vpcmpequd %zmm1, %zmm0, %k0 {%k1} ##
870   %res0 = call i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 0, i16 %mask)
871   %vec0 = insertelement <8 x i16> undef, i16 %res0, i32 0
872 ; CHECK: vpcmpltud %zmm1, %zmm0, %k0 {%k1} ##
873   %res1 = call i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 1, i16 %mask)
874   %vec1 = insertelement <8 x i16> %vec0, i16 %res1, i32 1
875 ; CHECK: vpcmpleud %zmm1, %zmm0, %k0 {%k1} ##
876   %res2 = call i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 2, i16 %mask)
877   %vec2 = insertelement <8 x i16> %vec1, i16 %res2, i32 2
878 ; CHECK: vpcmpunordud %zmm1, %zmm0, %k0 {%k1} ##
879   %res3 = call i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 3, i16 %mask)
880   %vec3 = insertelement <8 x i16> %vec2, i16 %res3, i32 3
881 ; CHECK: vpcmpnequd %zmm1, %zmm0, %k0 {%k1} ##
882   %res4 = call i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 4, i16 %mask)
883   %vec4 = insertelement <8 x i16> %vec3, i16 %res4, i32 4
884 ; CHECK: vpcmpnltud %zmm1, %zmm0, %k0 {%k1} ##
885   %res5 = call i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 5, i16 %mask)
886   %vec5 = insertelement <8 x i16> %vec4, i16 %res5, i32 5
887 ; CHECK: vpcmpnleud %zmm1, %zmm0, %k0 {%k1} ##
888   %res6 = call i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 6, i16 %mask)
889   %vec6 = insertelement <8 x i16> %vec5, i16 %res6, i32 6
890 ; CHECK: vpcmpordud %zmm1, %zmm0, %k0 {%k1} ##
891   %res7 = call i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32> %a0, <16 x i32> %a1, i32 7, i16 %mask)
892   %vec7 = insertelement <8 x i16> %vec6, i16 %res7, i32 7
893   ret <8 x i16> %vec7
894 }
895
896 declare i16 @llvm.x86.avx512.mask.ucmp.d.512(<16 x i32>, <16 x i32>, i32, i16) nounwind readnone
897
898 define <8 x i8> @test_cmp_q_512(<8 x i64> %a0, <8 x i64> %a1) {
899 ; CHECK_LABEL: test_cmp_q_512
900 ; CHECK: vpcmpeqq %zmm1, %zmm0, %k0 ##
901   %res0 = call i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 0, i8 -1)
902   %vec0 = insertelement <8 x i8> undef, i8 %res0, i32 0
903 ; CHECK: vpcmpltq %zmm1, %zmm0, %k0 ##
904   %res1 = call i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 1, i8 -1)
905   %vec1 = insertelement <8 x i8> %vec0, i8 %res1, i32 1
906 ; CHECK: vpcmpleq %zmm1, %zmm0, %k0 ##
907   %res2 = call i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 2, i8 -1)
908   %vec2 = insertelement <8 x i8> %vec1, i8 %res2, i32 2
909 ; CHECK: vpcmpunordq %zmm1, %zmm0, %k0 ##
910   %res3 = call i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 3, i8 -1)
911   %vec3 = insertelement <8 x i8> %vec2, i8 %res3, i32 3
912 ; CHECK: vpcmpneqq %zmm1, %zmm0, %k0 ##
913   %res4 = call i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 4, i8 -1)
914   %vec4 = insertelement <8 x i8> %vec3, i8 %res4, i32 4
915 ; CHECK: vpcmpnltq %zmm1, %zmm0, %k0 ##
916   %res5 = call i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 5, i8 -1)
917   %vec5 = insertelement <8 x i8> %vec4, i8 %res5, i32 5
918 ; CHECK: vpcmpnleq %zmm1, %zmm0, %k0 ##
919   %res6 = call i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 6, i8 -1)
920   %vec6 = insertelement <8 x i8> %vec5, i8 %res6, i32 6
921 ; CHECK: vpcmpordq %zmm1, %zmm0, %k0 ##
922   %res7 = call i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 7, i8 -1)
923   %vec7 = insertelement <8 x i8> %vec6, i8 %res7, i32 7
924   ret <8 x i8> %vec7
925 }
926
927 define <8 x i8> @test_mask_cmp_q_512(<8 x i64> %a0, <8 x i64> %a1, i8 %mask) {
928 ; CHECK_LABEL: test_mask_cmp_q_512
929 ; CHECK: vpcmpeqq %zmm1, %zmm0, %k0 {%k1} ##
930   %res0 = call i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 0, i8 %mask)
931   %vec0 = insertelement <8 x i8> undef, i8 %res0, i32 0
932 ; CHECK: vpcmpltq %zmm1, %zmm0, %k0 {%k1} ##
933   %res1 = call i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 1, i8 %mask)
934   %vec1 = insertelement <8 x i8> %vec0, i8 %res1, i32 1
935 ; CHECK: vpcmpleq %zmm1, %zmm0, %k0 {%k1} ##
936   %res2 = call i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 2, i8 %mask)
937   %vec2 = insertelement <8 x i8> %vec1, i8 %res2, i32 2
938 ; CHECK: vpcmpunordq %zmm1, %zmm0, %k0 {%k1} ##
939   %res3 = call i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 3, i8 %mask)
940   %vec3 = insertelement <8 x i8> %vec2, i8 %res3, i32 3
941 ; CHECK: vpcmpneqq %zmm1, %zmm0, %k0 {%k1} ##
942   %res4 = call i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 4, i8 %mask)
943   %vec4 = insertelement <8 x i8> %vec3, i8 %res4, i32 4
944 ; CHECK: vpcmpnltq %zmm1, %zmm0, %k0 {%k1} ##
945   %res5 = call i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 5, i8 %mask)
946   %vec5 = insertelement <8 x i8> %vec4, i8 %res5, i32 5
947 ; CHECK: vpcmpnleq %zmm1, %zmm0, %k0 {%k1} ##
948   %res6 = call i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 6, i8 %mask)
949   %vec6 = insertelement <8 x i8> %vec5, i8 %res6, i32 6
950 ; CHECK: vpcmpordq %zmm1, %zmm0, %k0 {%k1} ##
951   %res7 = call i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 7, i8 %mask)
952   %vec7 = insertelement <8 x i8> %vec6, i8 %res7, i32 7
953   ret <8 x i8> %vec7
954 }
955
956 declare i8 @llvm.x86.avx512.mask.cmp.q.512(<8 x i64>, <8 x i64>, i32, i8) nounwind readnone
957
958 define <8 x i8> @test_ucmp_q_512(<8 x i64> %a0, <8 x i64> %a1) {
959 ; CHECK_LABEL: test_ucmp_q_512
960 ; CHECK: vpcmpequq %zmm1, %zmm0, %k0 ##
961   %res0 = call i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 0, i8 -1)
962   %vec0 = insertelement <8 x i8> undef, i8 %res0, i32 0
963 ; CHECK: vpcmpltuq %zmm1, %zmm0, %k0 ##
964   %res1 = call i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 1, i8 -1)
965   %vec1 = insertelement <8 x i8> %vec0, i8 %res1, i32 1
966 ; CHECK: vpcmpleuq %zmm1, %zmm0, %k0 ##
967   %res2 = call i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 2, i8 -1)
968   %vec2 = insertelement <8 x i8> %vec1, i8 %res2, i32 2
969 ; CHECK: vpcmpunorduq %zmm1, %zmm0, %k0 ##
970   %res3 = call i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 3, i8 -1)
971   %vec3 = insertelement <8 x i8> %vec2, i8 %res3, i32 3
972 ; CHECK: vpcmpnequq %zmm1, %zmm0, %k0 ##
973   %res4 = call i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 4, i8 -1)
974   %vec4 = insertelement <8 x i8> %vec3, i8 %res4, i32 4
975 ; CHECK: vpcmpnltuq %zmm1, %zmm0, %k0 ##
976   %res5 = call i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 5, i8 -1)
977   %vec5 = insertelement <8 x i8> %vec4, i8 %res5, i32 5
978 ; CHECK: vpcmpnleuq %zmm1, %zmm0, %k0 ##
979   %res6 = call i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 6, i8 -1)
980   %vec6 = insertelement <8 x i8> %vec5, i8 %res6, i32 6
981 ; CHECK: vpcmporduq %zmm1, %zmm0, %k0 ##
982   %res7 = call i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 7, i8 -1)
983   %vec7 = insertelement <8 x i8> %vec6, i8 %res7, i32 7
984   ret <8 x i8> %vec7
985 }
986
987 define <8 x i8> @test_mask_ucmp_q_512(<8 x i64> %a0, <8 x i64> %a1, i8 %mask) {
988 ; CHECK_LABEL: test_mask_ucmp_q_512
989 ; CHECK: vpcmpequq %zmm1, %zmm0, %k0 {%k1} ##
990   %res0 = call i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 0, i8 %mask)
991   %vec0 = insertelement <8 x i8> undef, i8 %res0, i32 0
992 ; CHECK: vpcmpltuq %zmm1, %zmm0, %k0 {%k1} ##
993   %res1 = call i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 1, i8 %mask)
994   %vec1 = insertelement <8 x i8> %vec0, i8 %res1, i32 1
995 ; CHECK: vpcmpleuq %zmm1, %zmm0, %k0 {%k1} ##
996   %res2 = call i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 2, i8 %mask)
997   %vec2 = insertelement <8 x i8> %vec1, i8 %res2, i32 2
998 ; CHECK: vpcmpunorduq %zmm1, %zmm0, %k0 {%k1} ##
999   %res3 = call i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 3, i8 %mask)
1000   %vec3 = insertelement <8 x i8> %vec2, i8 %res3, i32 3
1001 ; CHECK: vpcmpnequq %zmm1, %zmm0, %k0 {%k1} ##
1002   %res4 = call i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 4, i8 %mask)
1003   %vec4 = insertelement <8 x i8> %vec3, i8 %res4, i32 4
1004 ; CHECK: vpcmpnltuq %zmm1, %zmm0, %k0 {%k1} ##
1005   %res5 = call i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 5, i8 %mask)
1006   %vec5 = insertelement <8 x i8> %vec4, i8 %res5, i32 5
1007 ; CHECK: vpcmpnleuq %zmm1, %zmm0, %k0 {%k1} ##
1008   %res6 = call i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 6, i8 %mask)
1009   %vec6 = insertelement <8 x i8> %vec5, i8 %res6, i32 6
1010 ; CHECK: vpcmporduq %zmm1, %zmm0, %k0 {%k1} ##
1011   %res7 = call i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64> %a0, <8 x i64> %a1, i32 7, i8 %mask)
1012   %vec7 = insertelement <8 x i8> %vec6, i8 %res7, i32 7
1013   ret <8 x i8> %vec7
1014 }
1015
1016 declare i8 @llvm.x86.avx512.mask.ucmp.q.512(<8 x i64>, <8 x i64>, i32, i8) nounwind readnone
1017
1018 define <4 x float> @test_mask_vextractf32x4(<4 x float> %b, <16 x float> %a, i8 %mask) {
1019 ; CHECK-LABEL: test_mask_vextractf32x4:
1020 ; CHECK: vextractf32x4 $2, %zmm1, %xmm0 {%k1}
1021   %res = call <4 x float> @llvm.x86.avx512.mask.vextractf32x4.512(<16 x float> %a, i32 2, <4 x float> %b, i8 %mask)
1022   ret <4 x float> %res
1023 }
1024
1025 declare <4 x float> @llvm.x86.avx512.mask.vextractf32x4.512(<16 x float>, i32, <4 x float>, i8)
1026
1027 define <4 x i64> @test_mask_vextracti64x4(<4 x i64> %b, <8 x i64> %a, i8 %mask) {
1028 ; CHECK-LABEL: test_mask_vextracti64x4:
1029 ; CHECK: vextracti64x4 $2, %zmm1, %ymm0 {%k1}
1030   %res = call <4 x i64> @llvm.x86.avx512.mask.vextracti64x4.512(<8 x i64> %a, i32 2, <4 x i64> %b, i8 %mask)
1031   ret <4 x i64> %res
1032 }
1033
1034 declare <4 x i64> @llvm.x86.avx512.mask.vextracti64x4.512(<8 x i64>, i32, <4 x i64>, i8)
1035
1036 define <4 x i32> @test_maskz_vextracti32x4(<16 x i32> %a, i8 %mask) {
1037 ; CHECK-LABEL: test_maskz_vextracti32x4:
1038 ; CHECK: vextracti32x4 $2, %zmm0, %xmm0 {%k1} {z}
1039   %res = call <4 x i32> @llvm.x86.avx512.mask.vextracti32x4.512(<16 x i32> %a, i32 2, <4 x i32> zeroinitializer, i8 %mask)
1040   ret <4 x i32> %res
1041 }
1042
1043 declare <4 x i32> @llvm.x86.avx512.mask.vextracti32x4.512(<16 x i32>, i32, <4 x i32>, i8)
1044
1045 define <4 x double> @test_vextractf64x4(<8 x double> %a) {
1046 ; CHECK-LABEL: test_vextractf64x4:
1047 ; CHECK: vextractf64x4 $2, %zmm0, %ymm0 ##
1048   %res = call <4 x double> @llvm.x86.avx512.mask.vextractf64x4.512(<8 x double> %a, i32 2, <4 x double> zeroinitializer, i8 -1)
1049   ret <4 x double> %res
1050 }
1051
1052 declare <4 x double> @llvm.x86.avx512.mask.vextractf64x4.512(<8 x double>, i32, <4 x double>, i8)
1053
1054 define <16 x i32> @test_x86_avx512_pslli_d(<16 x i32> %a0) {
1055   ; CHECK-LABEL: test_x86_avx512_pslli_d
1056   ; CHECK: vpslld
1057   %res = call <16 x i32> @llvm.x86.avx512.mask.pslli.d(<16 x i32> %a0, i32 7, <16 x i32> zeroinitializer, i16 -1)
1058   ret <16 x i32> %res
1059 }
1060
1061 define <16 x i32> @test_x86_avx512_mask_pslli_d(<16 x i32> %a0, <16 x i32> %a1, i16 %mask) {
1062   ; CHECK-LABEL: test_x86_avx512_mask_pslli_d
1063   ; CHECK: vpslld $7, %zmm0, %zmm1 {%k1}
1064   %res = call <16 x i32> @llvm.x86.avx512.mask.pslli.d(<16 x i32> %a0, i32 7, <16 x i32> %a1, i16 %mask)
1065   ret <16 x i32> %res
1066 }
1067
1068 define <16 x i32> @test_x86_avx512_maskz_pslli_d(<16 x i32> %a0, i16 %mask) {
1069   ; CHECK-LABEL: test_x86_avx512_maskz_pslli_d
1070   ; CHECK: vpslld $7, %zmm0, %zmm0 {%k1} {z}
1071   %res = call <16 x i32> @llvm.x86.avx512.mask.pslli.d(<16 x i32> %a0, i32 7, <16 x i32> zeroinitializer, i16 %mask)
1072   ret <16 x i32> %res
1073 }
1074
1075 declare <16 x i32> @llvm.x86.avx512.mask.pslli.d(<16 x i32>, i32, <16 x i32>, i16) nounwind readnone
1076
1077 define <8 x i64> @test_x86_avx512_pslli_q(<8 x i64> %a0) {
1078   ; CHECK-LABEL: test_x86_avx512_pslli_q
1079   ; CHECK: vpsllq
1080   %res = call <8 x i64> @llvm.x86.avx512.mask.pslli.q(<8 x i64> %a0, i32 7, <8 x i64> zeroinitializer, i8 -1)
1081   ret <8 x i64> %res
1082 }
1083
1084 define <8 x i64> @test_x86_avx512_mask_pslli_q(<8 x i64> %a0, <8 x i64> %a1, i8 %mask) {
1085   ; CHECK-LABEL: test_x86_avx512_mask_pslli_q
1086   ; CHECK: vpsllq $7, %zmm0, %zmm1 {%k1}
1087   %res = call <8 x i64> @llvm.x86.avx512.mask.pslli.q(<8 x i64> %a0, i32 7, <8 x i64> %a1, i8 %mask)
1088   ret <8 x i64> %res
1089 }
1090
1091 define <8 x i64> @test_x86_avx512_maskz_pslli_q(<8 x i64> %a0, i8 %mask) {
1092   ; CHECK-LABEL: test_x86_avx512_maskz_pslli_q
1093   ; CHECK: vpsllq $7, %zmm0, %zmm0 {%k1} {z}
1094   %res = call <8 x i64> @llvm.x86.avx512.mask.pslli.q(<8 x i64> %a0, i32 7, <8 x i64> zeroinitializer, i8 %mask)
1095   ret <8 x i64> %res
1096 }
1097
1098 declare <8 x i64> @llvm.x86.avx512.mask.pslli.q(<8 x i64>, i32, <8 x i64>, i8) nounwind readnone
1099
1100 define <16 x i32> @test_x86_avx512_psrli_d(<16 x i32> %a0) {
1101   ; CHECK-LABEL: test_x86_avx512_psrli_d
1102   ; CHECK: vpsrld
1103   %res = call <16 x i32> @llvm.x86.avx512.mask.psrli.d(<16 x i32> %a0, i32 7, <16 x i32> zeroinitializer, i16 -1)
1104   ret <16 x i32> %res
1105 }
1106
1107 define <16 x i32> @test_x86_avx512_mask_psrli_d(<16 x i32> %a0, <16 x i32> %a1, i16 %mask) {
1108   ; CHECK-LABEL: test_x86_avx512_mask_psrli_d
1109   ; CHECK: vpsrld $7, %zmm0, %zmm1 {%k1}
1110   %res = call <16 x i32> @llvm.x86.avx512.mask.psrli.d(<16 x i32> %a0, i32 7, <16 x i32> %a1, i16 %mask)
1111   ret <16 x i32> %res
1112 }
1113
1114 define <16 x i32> @test_x86_avx512_maskz_psrli_d(<16 x i32> %a0, i16 %mask) {
1115   ; CHECK-LABEL: test_x86_avx512_maskz_psrli_d
1116   ; CHECK: vpsrld $7, %zmm0, %zmm0 {%k1} {z}
1117   %res = call <16 x i32> @llvm.x86.avx512.mask.psrli.d(<16 x i32> %a0, i32 7, <16 x i32> zeroinitializer, i16 %mask)
1118   ret <16 x i32> %res
1119 }
1120
1121 declare <16 x i32> @llvm.x86.avx512.mask.psrli.d(<16 x i32>, i32, <16 x i32>, i16) nounwind readnone
1122
1123 define <8 x i64> @test_x86_avx512_psrli_q(<8 x i64> %a0) {
1124   ; CHECK-LABEL: test_x86_avx512_psrli_q
1125   ; CHECK: vpsrlq
1126   %res = call <8 x i64> @llvm.x86.avx512.mask.psrli.q(<8 x i64> %a0, i32 7, <8 x i64> zeroinitializer, i8 -1)
1127   ret <8 x i64> %res
1128 }
1129
1130 define <8 x i64> @test_x86_avx512_mask_psrli_q(<8 x i64> %a0, <8 x i64> %a1, i8 %mask) {
1131   ; CHECK-LABEL: test_x86_avx512_mask_psrli_q
1132   ; CHECK: vpsrlq $7, %zmm0, %zmm1 {%k1}
1133   %res = call <8 x i64> @llvm.x86.avx512.mask.psrli.q(<8 x i64> %a0, i32 7, <8 x i64> %a1, i8 %mask)
1134   ret <8 x i64> %res
1135 }
1136
1137 define <8 x i64> @test_x86_avx512_maskz_psrli_q(<8 x i64> %a0, i8 %mask) {
1138   ; CHECK-LABEL: test_x86_avx512_maskz_psrli_q
1139   ; CHECK: vpsrlq $7, %zmm0, %zmm0 {%k1} {z}
1140   %res = call <8 x i64> @llvm.x86.avx512.mask.psrli.q(<8 x i64> %a0, i32 7, <8 x i64> zeroinitializer, i8 %mask)
1141   ret <8 x i64> %res
1142 }
1143
1144 declare <8 x i64> @llvm.x86.avx512.mask.psrli.q(<8 x i64>, i32, <8 x i64>, i8) nounwind readnone
1145
1146 define <16 x i32> @test_x86_avx512_psrai_d(<16 x i32> %a0) {
1147   ; CHECK-LABEL: test_x86_avx512_psrai_d
1148   ; CHECK: vpsrad
1149   %res = call <16 x i32> @llvm.x86.avx512.mask.psrai.d(<16 x i32> %a0, i32 7, <16 x i32> zeroinitializer, i16 -1)
1150   ret <16 x i32> %res
1151 }
1152
1153 define <16 x i32> @test_x86_avx512_mask_psrai_d(<16 x i32> %a0, <16 x i32> %a1, i16 %mask) {
1154   ; CHECK-LABEL: test_x86_avx512_mask_psrai_d
1155   ; CHECK: vpsrad $7, %zmm0, %zmm1 {%k1}
1156   %res = call <16 x i32> @llvm.x86.avx512.mask.psrai.d(<16 x i32> %a0, i32 7, <16 x i32> %a1, i16 %mask)
1157   ret <16 x i32> %res
1158 }
1159
1160 define <16 x i32> @test_x86_avx512_maskz_psrai_d(<16 x i32> %a0, i16 %mask) {
1161   ; CHECK-LABEL: test_x86_avx512_maskz_psrai_d
1162   ; CHECK: vpsrad $7, %zmm0, %zmm0 {%k1} {z}
1163   %res = call <16 x i32> @llvm.x86.avx512.mask.psrai.d(<16 x i32> %a0, i32 7, <16 x i32> zeroinitializer, i16 %mask)
1164   ret <16 x i32> %res
1165 }
1166
1167 declare <16 x i32> @llvm.x86.avx512.mask.psrai.d(<16 x i32>, i32, <16 x i32>, i16) nounwind readnone
1168
1169 define <8 x i64> @test_x86_avx512_psrai_q(<8 x i64> %a0) {
1170   ; CHECK-LABEL: test_x86_avx512_psrai_q
1171   ; CHECK: vpsraq
1172   %res = call <8 x i64> @llvm.x86.avx512.mask.psrai.q(<8 x i64> %a0, i32 7, <8 x i64> zeroinitializer, i8 -1)
1173   ret <8 x i64> %res
1174 }
1175
1176 define <8 x i64> @test_x86_avx512_mask_psrai_q(<8 x i64> %a0, <8 x i64> %a1, i8 %mask) {
1177   ; CHECK-LABEL: test_x86_avx512_mask_psrai_q
1178   ; CHECK: vpsraq $7, %zmm0, %zmm1 {%k1}
1179   %res = call <8 x i64> @llvm.x86.avx512.mask.psrai.q(<8 x i64> %a0, i32 7, <8 x i64> %a1, i8 %mask)
1180   ret <8 x i64> %res
1181 }
1182
1183 define <8 x i64> @test_x86_avx512_maskz_psrai_q(<8 x i64> %a0, i8 %mask) {
1184   ; CHECK-LABEL: test_x86_avx512_maskz_psrai_q
1185   ; CHECK: vpsraq $7, %zmm0, %zmm0 {%k1} {z}
1186   %res = call <8 x i64> @llvm.x86.avx512.mask.psrai.q(<8 x i64> %a0, i32 7, <8 x i64> zeroinitializer, i8 %mask)
1187   ret <8 x i64> %res
1188 }
1189
1190 declare <8 x i64> @llvm.x86.avx512.mask.psrai.q(<8 x i64>, i32, <8 x i64>, i8) nounwind readnone
1191
1192 define <16 x i32> @test_x86_avx512_psll_d(<16 x i32> %a0, <4 x i32> %a1) {
1193   ; CHECK-LABEL: test_x86_avx512_psll_d
1194   ; CHECK: vpslld
1195   %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)
1196   ret <16 x i32> %res
1197 }
1198
1199 define <16 x i32> @test_x86_avx512_mask_psll_d(<16 x i32> %a0, <4 x i32> %a1, <16 x i32> %a2, i16 %mask) {
1200   ; CHECK-LABEL: test_x86_avx512_mask_psll_d
1201   ; CHECK: vpslld %xmm1, %zmm0, %zmm2 {%k1}
1202   %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)
1203   ret <16 x i32> %res
1204 }
1205
1206 define <16 x i32> @test_x86_avx512_maskz_psll_d(<16 x i32> %a0, <4 x i32> %a1, i16 %mask) {
1207   ; CHECK-LABEL: test_x86_avx512_maskz_psll_d
1208   ; CHECK: vpslld %xmm1, %zmm0, %zmm0 {%k1} {z}
1209   %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)
1210   ret <16 x i32> %res
1211 }
1212
1213 declare <16 x i32> @llvm.x86.avx512.mask.psll.d(<16 x i32>, <4 x i32>, <16 x i32>, i16) nounwind readnone
1214
1215 define <8 x i64> @test_x86_avx512_psll_q(<8 x i64> %a0, <2 x i64> %a1) {
1216   ; CHECK-LABEL: test_x86_avx512_psll_q
1217   ; CHECK: vpsllq
1218   %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)
1219   ret <8 x i64> %res
1220 }
1221
1222 define <8 x i64> @test_x86_avx512_mask_psll_q(<8 x i64> %a0, <2 x i64> %a1, <8 x i64> %a2, i8 %mask) {
1223   ; CHECK-LABEL: test_x86_avx512_mask_psll_q
1224   ; CHECK: vpsllq %xmm1, %zmm0, %zmm2 {%k1}
1225   %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)
1226   ret <8 x i64> %res
1227 }
1228
1229 define <8 x i64> @test_x86_avx512_maskz_psll_q(<8 x i64> %a0, <2 x i64> %a1, i8 %mask) {
1230   ; CHECK-LABEL: test_x86_avx512_maskz_psll_q
1231   ; CHECK: vpsllq %xmm1, %zmm0, %zmm0 {%k1} {z}
1232   %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)
1233   ret <8 x i64> %res
1234 }
1235
1236 declare <8 x i64> @llvm.x86.avx512.mask.psll.q(<8 x i64>, <2 x i64>, <8 x i64>, i8) nounwind readnone
1237
1238 define <16 x i32> @test_x86_avx512_psrl_d(<16 x i32> %a0, <4 x i32> %a1) {
1239   ; CHECK-LABEL: test_x86_avx512_psrl_d
1240   ; CHECK: vpsrld
1241   %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)
1242   ret <16 x i32> %res
1243 }
1244
1245 define <16 x i32> @test_x86_avx512_mask_psrl_d(<16 x i32> %a0, <4 x i32> %a1, <16 x i32> %a2, i16 %mask) {
1246   ; CHECK-LABEL: test_x86_avx512_mask_psrl_d
1247   ; CHECK: vpsrld %xmm1, %zmm0, %zmm2 {%k1}
1248   %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)
1249   ret <16 x i32> %res
1250 }
1251
1252 define <16 x i32> @test_x86_avx512_maskz_psrl_d(<16 x i32> %a0, <4 x i32> %a1, i16 %mask) {
1253   ; CHECK-LABEL: test_x86_avx512_maskz_psrl_d
1254   ; CHECK: vpsrld %xmm1, %zmm0, %zmm0 {%k1} {z}
1255   %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)
1256   ret <16 x i32> %res
1257 }
1258
1259 declare <16 x i32> @llvm.x86.avx512.mask.psrl.d(<16 x i32>, <4 x i32>, <16 x i32>, i16) nounwind readnone
1260
1261 define <8 x i64> @test_x86_avx512_psrl_q(<8 x i64> %a0, <2 x i64> %a1) {
1262   ; CHECK-LABEL: test_x86_avx512_psrl_q
1263   ; CHECK: vpsrlq
1264   %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)
1265   ret <8 x i64> %res
1266 }
1267
1268 define <8 x i64> @test_x86_avx512_mask_psrl_q(<8 x i64> %a0, <2 x i64> %a1, <8 x i64> %a2, i8 %mask) {
1269   ; CHECK-LABEL: test_x86_avx512_mask_psrl_q
1270   ; CHECK: vpsrlq %xmm1, %zmm0, %zmm2 {%k1}
1271   %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)
1272   ret <8 x i64> %res
1273 }
1274
1275 define <8 x i64> @test_x86_avx512_maskz_psrl_q(<8 x i64> %a0, <2 x i64> %a1, i8 %mask) {
1276   ; CHECK-LABEL: test_x86_avx512_maskz_psrl_q
1277   ; CHECK: vpsrlq %xmm1, %zmm0, %zmm0 {%k1} {z}
1278   %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)
1279   ret <8 x i64> %res
1280 }
1281
1282 declare <8 x i64> @llvm.x86.avx512.mask.psrl.q(<8 x i64>, <2 x i64>, <8 x i64>, i8) nounwind readnone
1283
1284 define <16 x i32> @test_x86_avx512_psra_d(<16 x i32> %a0, <4 x i32> %a1) {
1285   ; CHECK-LABEL: test_x86_avx512_psra_d
1286   ; CHECK: vpsrad
1287   %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)
1288   ret <16 x i32> %res
1289 }
1290
1291 define <16 x i32> @test_x86_avx512_mask_psra_d(<16 x i32> %a0, <4 x i32> %a1, <16 x i32> %a2, i16 %mask) {
1292   ; CHECK-LABEL: test_x86_avx512_mask_psra_d
1293   ; CHECK: vpsrad %xmm1, %zmm0, %zmm2 {%k1}
1294   %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)
1295   ret <16 x i32> %res
1296 }
1297
1298 define <16 x i32> @test_x86_avx512_maskz_psra_d(<16 x i32> %a0, <4 x i32> %a1, i16 %mask) {
1299   ; CHECK-LABEL: test_x86_avx512_maskz_psra_d
1300   ; CHECK: vpsrad %xmm1, %zmm0, %zmm0 {%k1} {z}
1301   %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)
1302   ret <16 x i32> %res
1303 }
1304
1305 declare <16 x i32> @llvm.x86.avx512.mask.psra.d(<16 x i32>, <4 x i32>, <16 x i32>, i16) nounwind readnone
1306
1307 define <8 x i64> @test_x86_avx512_psra_q(<8 x i64> %a0, <2 x i64> %a1) {
1308   ; CHECK-LABEL: test_x86_avx512_psra_q
1309   ; CHECK: vpsraq
1310   %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)
1311   ret <8 x i64> %res
1312 }
1313
1314 define <8 x i64> @test_x86_avx512_mask_psra_q(<8 x i64> %a0, <2 x i64> %a1, <8 x i64> %a2, i8 %mask) {
1315   ; CHECK-LABEL: test_x86_avx512_mask_psra_q
1316   ; CHECK: vpsraq %xmm1, %zmm0, %zmm2 {%k1}
1317   %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)
1318   ret <8 x i64> %res
1319 }
1320
1321 define <8 x i64> @test_x86_avx512_maskz_psra_q(<8 x i64> %a0, <2 x i64> %a1, i8 %mask) {
1322   ; CHECK-LABEL: test_x86_avx512_maskz_psra_q
1323   ; CHECK: vpsraq %xmm1, %zmm0, %zmm0 {%k1} {z}
1324   %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)
1325   ret <8 x i64> %res
1326 }
1327
1328 declare <8 x i64> @llvm.x86.avx512.mask.psra.q(<8 x i64>, <2 x i64>, <8 x i64>, i8) nounwind readnone
1329
1330 define <16 x i32> @test_x86_avx512_psllv_d(<16 x i32> %a0, <16 x i32> %a1) {
1331   ; CHECK-LABEL: test_x86_avx512_psllv_d
1332   ; CHECK: vpsllvd
1333   %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)
1334   ret <16 x i32> %res
1335 }
1336
1337 define <16 x i32> @test_x86_avx512_mask_psllv_d(<16 x i32> %a0, <16 x i32> %a1, <16 x i32> %a2, i16 %mask) {
1338   ; CHECK-LABEL: test_x86_avx512_mask_psllv_d
1339   ; CHECK: vpsllvd %zmm1, %zmm0, %zmm2 {%k1}
1340   %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)
1341   ret <16 x i32> %res
1342 }
1343
1344 define <16 x i32> @test_x86_avx512_maskz_psllv_d(<16 x i32> %a0, <16 x i32> %a1, i16 %mask) {
1345   ; CHECK-LABEL: test_x86_avx512_maskz_psllv_d
1346   ; CHECK: vpsllvd %zmm1, %zmm0, %zmm0 {%k1} {z}
1347   %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)
1348   ret <16 x i32> %res
1349 }
1350
1351 declare <16 x i32> @llvm.x86.avx512.mask.psllv.d(<16 x i32>, <16 x i32>, <16 x i32>, i16) nounwind readnone
1352
1353 define <8 x i64> @test_x86_avx512_psllv_q(<8 x i64> %a0, <8 x i64> %a1) {
1354   ; CHECK-LABEL: test_x86_avx512_psllv_q
1355   ; CHECK: vpsllvq
1356   %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)
1357   ret <8 x i64> %res
1358 }
1359
1360 define <8 x i64> @test_x86_avx512_mask_psllv_q(<8 x i64> %a0, <8 x i64> %a1, <8 x i64> %a2, i8 %mask) {
1361   ; CHECK-LABEL: test_x86_avx512_mask_psllv_q
1362   ; CHECK: vpsllvq %zmm1, %zmm0, %zmm2 {%k1}
1363   %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)
1364   ret <8 x i64> %res
1365 }
1366
1367 define <8 x i64> @test_x86_avx512_maskz_psllv_q(<8 x i64> %a0, <8 x i64> %a1, i8 %mask) {
1368   ; CHECK-LABEL: test_x86_avx512_maskz_psllv_q
1369   ; CHECK: vpsllvq %zmm1, %zmm0, %zmm0 {%k1} {z}
1370   %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)
1371   ret <8 x i64> %res
1372 }
1373
1374 declare <8 x i64> @llvm.x86.avx512.mask.psllv.q(<8 x i64>, <8 x i64>, <8 x i64>, i8) nounwind readnone
1375
1376
1377 define <16 x i32> @test_x86_avx512_psrav_d(<16 x i32> %a0, <16 x i32> %a1) {
1378   ; CHECK-LABEL: test_x86_avx512_psrav_d
1379   ; CHECK: vpsravd
1380   %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)
1381   ret <16 x i32> %res
1382 }
1383
1384 define <16 x i32> @test_x86_avx512_mask_psrav_d(<16 x i32> %a0, <16 x i32> %a1, <16 x i32> %a2, i16 %mask) {
1385   ; CHECK-LABEL: test_x86_avx512_mask_psrav_d
1386   ; CHECK: vpsravd %zmm1, %zmm0, %zmm2 {%k1}
1387   %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)
1388   ret <16 x i32> %res
1389 }
1390
1391 define <16 x i32> @test_x86_avx512_maskz_psrav_d(<16 x i32> %a0, <16 x i32> %a1, i16 %mask) {
1392   ; CHECK-LABEL: test_x86_avx512_maskz_psrav_d
1393   ; CHECK: vpsravd %zmm1, %zmm0, %zmm0 {%k1} {z}
1394   %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)
1395   ret <16 x i32> %res
1396 }
1397
1398 declare <16 x i32> @llvm.x86.avx512.mask.psrav.d(<16 x i32>, <16 x i32>, <16 x i32>, i16) nounwind readnone
1399
1400 define <8 x i64> @test_x86_avx512_psrav_q(<8 x i64> %a0, <8 x i64> %a1) {
1401   ; CHECK-LABEL: test_x86_avx512_psrav_q
1402   ; CHECK: vpsravq
1403   %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)
1404   ret <8 x i64> %res
1405 }
1406
1407 define <8 x i64> @test_x86_avx512_mask_psrav_q(<8 x i64> %a0, <8 x i64> %a1, <8 x i64> %a2, i8 %mask) {
1408   ; CHECK-LABEL: test_x86_avx512_mask_psrav_q
1409   ; CHECK: vpsravq %zmm1, %zmm0, %zmm2 {%k1}
1410   %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)
1411   ret <8 x i64> %res
1412 }
1413
1414 define <8 x i64> @test_x86_avx512_maskz_psrav_q(<8 x i64> %a0, <8 x i64> %a1, i8 %mask) {
1415   ; CHECK-LABEL: test_x86_avx512_maskz_psrav_q
1416   ; CHECK: vpsravq %zmm1, %zmm0, %zmm0 {%k1} {z}
1417   %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)
1418   ret <8 x i64> %res
1419 }
1420
1421 declare <8 x i64> @llvm.x86.avx512.mask.psrav.q(<8 x i64>, <8 x i64>, <8 x i64>, i8) nounwind readnone
1422
1423 define <16 x i32> @test_x86_avx512_psrlv_d(<16 x i32> %a0, <16 x i32> %a1) {
1424   ; CHECK-LABEL: test_x86_avx512_psrlv_d
1425   ; CHECK: vpsrlvd
1426   %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)
1427   ret <16 x i32> %res
1428 }
1429
1430 define <16 x i32> @test_x86_avx512_mask_psrlv_d(<16 x i32> %a0, <16 x i32> %a1, <16 x i32> %a2, i16 %mask) {
1431   ; CHECK-LABEL: test_x86_avx512_mask_psrlv_d
1432   ; CHECK: vpsrlvd %zmm1, %zmm0, %zmm2 {%k1}
1433   %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)
1434   ret <16 x i32> %res
1435 }
1436
1437 define <16 x i32> @test_x86_avx512_maskz_psrlv_d(<16 x i32> %a0, <16 x i32> %a1, i16 %mask) {
1438   ; CHECK-LABEL: test_x86_avx512_maskz_psrlv_d
1439   ; CHECK: vpsrlvd %zmm1, %zmm0, %zmm0 {%k1} {z}
1440   %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)
1441   ret <16 x i32> %res
1442 }
1443
1444 declare <16 x i32> @llvm.x86.avx512.mask.psrlv.d(<16 x i32>, <16 x i32>, <16 x i32>, i16) nounwind readnone
1445
1446 define <8 x i64> @test_x86_avx512_psrlv_q(<8 x i64> %a0, <8 x i64> %a1) {
1447   ; CHECK-LABEL: test_x86_avx512_psrlv_q
1448   ; CHECK: vpsrlvq
1449   %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)
1450   ret <8 x i64> %res
1451 }
1452
1453 define <8 x i64> @test_x86_avx512_mask_psrlv_q(<8 x i64> %a0, <8 x i64> %a1, <8 x i64> %a2, i8 %mask) {
1454   ; CHECK-LABEL: test_x86_avx512_mask_psrlv_q
1455   ; CHECK: vpsrlvq %zmm1, %zmm0, %zmm2 {%k1}
1456   %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)
1457   ret <8 x i64> %res
1458 }
1459
1460 define <8 x i64> @test_x86_avx512_maskz_psrlv_q(<8 x i64> %a0, <8 x i64> %a1, i8 %mask) {
1461   ; CHECK-LABEL: test_x86_avx512_maskz_psrlv_q
1462   ; CHECK: vpsrlvq %zmm1, %zmm0, %zmm0 {%k1} {z}
1463   %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)
1464   ret <8 x i64> %res
1465 }
1466
1467 declare <8 x i64> @llvm.x86.avx512.mask.psrlv.q(<8 x i64>, <8 x i64>, <8 x i64>, i8) nounwind readnone
1468
1469 define <8 x i64> @test_x86_avx512_psrlv_q_memop(<8 x i64> %a0, <8 x i64>* %ptr) {
1470   ; CHECK-LABEL: test_x86_avx512_psrlv_q_memop
1471   ; CHECK: vpsrlvq (%
1472   %b = load <8 x i64>, <8 x i64>* %ptr
1473   %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)
1474   ret <8 x i64> %res
1475 }
1476
1477 declare <16 x float> @llvm.x86.avx512.mask.sub.ps.512(<16 x float>, <16 x float>, <16 x float>, i16, i32)
1478 declare <16 x float> @llvm.x86.avx512.mask.mul.ps.512(<16 x float>, <16 x float>, <16 x float>, i16, i32)
1479 declare <8 x double> @llvm.x86.avx512.mask.mul.pd.512(<8 x double>, <8 x double>, <8 x double>, i8, i32)
1480
1481 define <16 x float> @test_vsubps_rn(<16 x float> %a0, <16 x float> %a1) {
1482   ; CHECK-LABEL: test_vsubps_rn
1483   ; CHECK: vsubps {rn-sae}{{.*}} ## encoding: [0x62,0xf1,0x7c,0x18,0x5c,0xc1]
1484   %res = call <16 x float> @llvm.x86.avx512.mask.sub.ps.512(<16 x float> %a0, <16 x float> %a1,
1485                     <16 x float> zeroinitializer, i16 -1, i32 0)
1486   ret <16 x float> %res
1487 }
1488
1489 define <16 x float> @test_vsubps_rd(<16 x float> %a0, <16 x float> %a1) {
1490   ; CHECK-LABEL: test_vsubps_rd
1491   ; CHECK: vsubps {rd-sae}{{.*}} ## encoding: [0x62,0xf1,0x7c,0x38,0x5c,0xc1]
1492   %res = call <16 x float> @llvm.x86.avx512.mask.sub.ps.512(<16 x float> %a0, <16 x float> %a1,
1493                     <16 x float> zeroinitializer, i16 -1, i32 1)
1494   ret <16 x float> %res
1495 }
1496
1497 define <16 x float> @test_vsubps_ru(<16 x float> %a0, <16 x float> %a1) {
1498   ; CHECK-LABEL: test_vsubps_ru
1499   ; CHECK: vsubps {ru-sae}{{.*}} ## encoding: [0x62,0xf1,0x7c,0x58,0x5c,0xc1]
1500   %res = call <16 x float> @llvm.x86.avx512.mask.sub.ps.512(<16 x float> %a0, <16 x float> %a1,
1501                     <16 x float> zeroinitializer, i16 -1, i32 2)
1502   ret <16 x float> %res
1503 }
1504
1505 define <16 x float> @test_vsubps_rz(<16 x float> %a0, <16 x float> %a1) {
1506   ; CHECK-LABEL: test_vsubps_rz
1507   ; CHECK: vsubps {rz-sae}{{.*}} ## encoding: [0x62,0xf1,0x7c,0x78,0x5c,0xc1]
1508   %res = call <16 x float> @llvm.x86.avx512.mask.sub.ps.512(<16 x float> %a0, <16 x float> %a1,
1509                     <16 x float> zeroinitializer, i16 -1, i32 3)
1510   ret <16 x float> %res
1511 }
1512
1513 define <16 x float> @test_vmulps_rn(<16 x float> %a0, <16 x float> %a1) {
1514   ; CHECK-LABEL: test_vmulps_rn
1515   ; CHECK: vmulps {rn-sae}{{.*}} ## encoding: [0x62,0xf1,0x7c,0x18,0x59,0xc1]
1516   %res = call <16 x float> @llvm.x86.avx512.mask.mul.ps.512(<16 x float> %a0, <16 x float> %a1,
1517                     <16 x float> zeroinitializer, i16 -1, i32 0)
1518   ret <16 x float> %res
1519 }
1520
1521 define <16 x float> @test_vmulps_rd(<16 x float> %a0, <16 x float> %a1) {
1522   ; CHECK-LABEL: test_vmulps_rd
1523   ; CHECK: vmulps {rd-sae}{{.*}} ## encoding: [0x62,0xf1,0x7c,0x38,0x59,0xc1]
1524   %res = call <16 x float> @llvm.x86.avx512.mask.mul.ps.512(<16 x float> %a0, <16 x float> %a1,
1525                     <16 x float> zeroinitializer, i16 -1, i32 1)
1526   ret <16 x float> %res
1527 }
1528
1529 define <16 x float> @test_vmulps_ru(<16 x float> %a0, <16 x float> %a1) {
1530   ; CHECK-LABEL: test_vmulps_ru
1531   ; CHECK: vmulps {ru-sae}{{.*}} ## encoding: [0x62,0xf1,0x7c,0x58,0x59,0xc1]
1532   %res = call <16 x float> @llvm.x86.avx512.mask.mul.ps.512(<16 x float> %a0, <16 x float> %a1,
1533                     <16 x float> zeroinitializer, i16 -1, i32 2)
1534   ret <16 x float> %res
1535 }
1536
1537 define <16 x float> @test_vmulps_rz(<16 x float> %a0, <16 x float> %a1) {
1538   ; CHECK-LABEL: test_vmulps_rz
1539   ; CHECK: vmulps {rz-sae}{{.*}} ## encoding: [0x62,0xf1,0x7c,0x78,0x59,0xc1]
1540   %res = call <16 x float> @llvm.x86.avx512.mask.mul.ps.512(<16 x float> %a0, <16 x float> %a1,
1541                     <16 x float> zeroinitializer, i16 -1, i32 3)
1542   ret <16 x float> %res
1543 }
1544
1545 ;; mask float
1546 define <16 x float> @test_vmulps_mask_rn(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
1547   ; CHECK-LABEL: test_vmulps_mask_rn
1548   ; CHECK: vmulps {rn-sae}{{.*}}{%k1} {z} ## encoding: [0x62,0xf1,0x7c,0x99,0x59,0xc1]
1549   %res = call <16 x float> @llvm.x86.avx512.mask.mul.ps.512(<16 x float> %a0, <16 x float> %a1,
1550                     <16 x float> zeroinitializer, i16 %mask, i32 0)
1551   ret <16 x float> %res
1552 }
1553
1554 define <16 x float> @test_vmulps_mask_rd(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
1555   ; CHECK-LABEL: test_vmulps_mask_rd
1556   ; CHECK: vmulps {rd-sae}{{.*}}{%k1} {z} ## encoding: [0x62,0xf1,0x7c,0xb9,0x59,0xc1]
1557   %res = call <16 x float> @llvm.x86.avx512.mask.mul.ps.512(<16 x float> %a0, <16 x float> %a1,
1558                     <16 x float> zeroinitializer, i16 %mask, i32 1)
1559   ret <16 x float> %res
1560 }
1561
1562 define <16 x float> @test_vmulps_mask_ru(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
1563   ; CHECK-LABEL: test_vmulps_mask_ru
1564   ; CHECK: vmulps {ru-sae}{{.*}}{%k1} {z} ## encoding: [0x62,0xf1,0x7c,0xd9,0x59,0xc1]
1565   %res = call <16 x float> @llvm.x86.avx512.mask.mul.ps.512(<16 x float> %a0, <16 x float> %a1,
1566                     <16 x float> zeroinitializer, i16 %mask, i32 2)
1567   ret <16 x float> %res
1568 }
1569
1570 define <16 x float> @test_vmulps_mask_rz(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
1571   ; CHECK-LABEL: test_vmulps_mask_rz
1572   ; CHECK: vmulps {rz-sae}{{.*}}{%k1} {z} ## encoding: [0x62,0xf1,0x7c,0xf9,0x59,0xc1]
1573   %res = call <16 x float> @llvm.x86.avx512.mask.mul.ps.512(<16 x float> %a0, <16 x float> %a1,
1574                     <16 x float> zeroinitializer, i16 %mask, i32 3)
1575   ret <16 x float> %res
1576 }
1577
1578 ;; With Passthru value
1579 define <16 x float> @test_vmulps_mask_passthru_rn(<16 x float> %a0, <16 x float> %a1, <16 x float> %passthru, i16 %mask) {
1580   ; CHECK-LABEL: test_vmulps_mask_passthru_rn
1581   ; CHECK: vmulps {rn-sae}{{.*}}{%k1} ## encoding: [0x62,0xf1,0x7c,0x19,0x59,0xd1]
1582   %res = call <16 x float> @llvm.x86.avx512.mask.mul.ps.512(<16 x float> %a0, <16 x float> %a1,
1583                     <16 x float> %passthru, i16 %mask, i32 0)
1584   ret <16 x float> %res
1585 }
1586
1587 define <16 x float> @test_vmulps_mask_passthru_rd(<16 x float> %a0, <16 x float> %a1, <16 x float> %passthru, i16 %mask) {
1588   ; CHECK-LABEL: test_vmulps_mask_passthru_rd
1589   ; CHECK: vmulps {rd-sae}{{.*}}{%k1} ## encoding: [0x62,0xf1,0x7c,0x39,0x59,0xd1]
1590   %res = call <16 x float> @llvm.x86.avx512.mask.mul.ps.512(<16 x float> %a0, <16 x float> %a1,
1591                     <16 x float> %passthru, i16 %mask, i32 1)
1592   ret <16 x float> %res
1593 }
1594
1595 define <16 x float> @test_vmulps_mask_passthru_ru(<16 x float> %a0, <16 x float> %a1, <16 x float> %passthru, i16 %mask) {
1596   ; CHECK-LABEL: test_vmulps_mask_passthru_ru
1597   ; CHECK: vmulps {ru-sae}{{.*}}{%k1} ## encoding: [0x62,0xf1,0x7c,0x59,0x59,0xd1]
1598   %res = call <16 x float> @llvm.x86.avx512.mask.mul.ps.512(<16 x float> %a0, <16 x float> %a1,
1599                     <16 x float> %passthru, i16 %mask, i32 2)
1600   ret <16 x float> %res
1601 }
1602
1603 define <16 x float> @test_vmulps_mask_passthru_rz(<16 x float> %a0, <16 x float> %a1, <16 x float> %passthru, i16 %mask) {
1604   ; CHECK-LABEL: test_vmulps_mask_passthru_rz
1605   ; CHECK: vmulps {rz-sae}{{.*}}{%k1} ## encoding: [0x62,0xf1,0x7c,0x79,0x59,0xd1]
1606   %res = call <16 x float> @llvm.x86.avx512.mask.mul.ps.512(<16 x float> %a0, <16 x float> %a1,
1607                     <16 x float> %passthru, i16 %mask, i32 3)
1608   ret <16 x float> %res
1609 }
1610
1611 ;; mask double
1612 define <8 x double> @test_vmulpd_mask_rn(<8 x double> %a0, <8 x double> %a1, i8 %mask) {
1613   ; CHECK-LABEL: test_vmulpd_mask_rn
1614   ; CHECK: vmulpd {rn-sae}{{.*}}{%k1} {z} ## encoding: [0x62,0xf1,0xfd,0x99,0x59,0xc1]
1615   %res = call <8 x double> @llvm.x86.avx512.mask.mul.pd.512(<8 x double> %a0, <8 x double> %a1,
1616                     <8 x double> zeroinitializer, i8 %mask, i32 0)
1617   ret <8 x double> %res
1618 }
1619
1620 define <8 x double> @test_vmulpd_mask_rd(<8 x double> %a0, <8 x double> %a1, i8 %mask) {
1621   ; CHECK-LABEL: test_vmulpd_mask_rd
1622   ; CHECK: vmulpd {rd-sae}{{.*}}{%k1} {z} ## encoding: [0x62,0xf1,0xfd,0xb9,0x59,0xc1]
1623   %res = call <8 x double> @llvm.x86.avx512.mask.mul.pd.512(<8 x double> %a0, <8 x double> %a1,
1624                     <8 x double> zeroinitializer, i8 %mask, i32 1)
1625   ret <8 x double> %res
1626 }
1627
1628 define <8 x double> @test_vmulpd_mask_ru(<8 x double> %a0, <8 x double> %a1, i8 %mask) {
1629   ; CHECK-LABEL: test_vmulpd_mask_ru
1630   ; CHECK: vmulpd {ru-sae}{{.*}}{%k1} {z} ## encoding: [0x62,0xf1,0xfd,0xd9,0x59,0xc1]
1631   %res = call <8 x double> @llvm.x86.avx512.mask.mul.pd.512(<8 x double> %a0, <8 x double> %a1,
1632                     <8 x double> zeroinitializer, i8 %mask, i32 2)
1633   ret <8 x double> %res
1634 }
1635
1636 define <8 x double> @test_vmulpd_mask_rz(<8 x double> %a0, <8 x double> %a1, i8 %mask) {
1637   ; CHECK-LABEL: test_vmulpd_mask_rz
1638   ; CHECK: vmulpd {rz-sae}{{.*}}{%k1} {z} ## encoding: [0x62,0xf1,0xfd,0xf9,0x59,0xc1]
1639   %res = call <8 x double> @llvm.x86.avx512.mask.mul.pd.512(<8 x double> %a0, <8 x double> %a1,
1640                     <8 x double> zeroinitializer, i8 %mask, i32 3)
1641   ret <8 x double> %res
1642 }
1643
1644 define <16 x i32> @test_xor_epi32(<16 x i32> %a, <16 x i32> %b) {
1645   ;CHECK-LABEL: test_xor_epi32
1646   ;CHECK: vpxord {{.*}}encoding: [0x62,0xf1,0x7d,0x48,0xef,0xc1]
1647   %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)
1648   ret < 16 x i32> %res
1649 }
1650
1651 define <16 x i32> @test_mask_xor_epi32(<16 x i32> %a,<16 x i32> %b, <16 x i32> %passThru, i16 %mask) {
1652   ;CHECK-LABEL: test_mask_xor_epi32
1653   ;CHECK: vpxord %zmm1, %zmm0, %zmm2 {%k1} ## encoding: [0x62,0xf1,0x7d,0x49,0xef,0xd1]
1654   %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)
1655   ret < 16 x i32> %res
1656 }
1657
1658 declare <16 x i32> @llvm.x86.avx512.mask.pxor.d.512(<16 x i32>, <16 x i32>, <16 x i32>, i16)
1659
1660 define <16 x i32> @test_or_epi32(<16 x i32> %a, <16 x i32> %b) {
1661   ;CHECK-LABEL: test_or_epi32
1662   ;CHECK: vpord {{.*}}encoding: [0x62,0xf1,0x7d,0x48,0xeb,0xc1]
1663   %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)
1664   ret < 16 x i32> %res
1665 }
1666
1667 define <16 x i32> @test_mask_or_epi32(<16 x i32> %a,<16 x i32> %b, <16 x i32> %passThru, i16 %mask) {
1668   ;CHECK-LABEL: test_mask_or_epi32
1669   ;CHECK: vpord %zmm1, %zmm0, %zmm2 {%k1} ## encoding: [0x62,0xf1,0x7d,0x49,0xeb,0xd1]
1670   %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)
1671   ret < 16 x i32> %res
1672 }
1673
1674 declare <16 x i32> @llvm.x86.avx512.mask.por.d.512(<16 x i32>, <16 x i32>, <16 x i32>, i16)
1675
1676 define <16 x i32> @test_and_epi32(<16 x i32> %a, <16 x i32> %b) {
1677   ;CHECK-LABEL: test_and_epi32
1678   ;CHECK: vpandd {{.*}}encoding: [0x62,0xf1,0x7d,0x48,0xdb,0xc1]
1679   %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)
1680   ret < 16 x i32> %res
1681 }
1682
1683 define <16 x i32> @test_mask_and_epi32(<16 x i32> %a,<16 x i32> %b, <16 x i32> %passThru, i16 %mask) {
1684   ;CHECK-LABEL: test_mask_and_epi32
1685   ;CHECK: vpandd %zmm1, %zmm0, %zmm2 {%k1} ## encoding: [0x62,0xf1,0x7d,0x49,0xdb,0xd1]
1686   %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)
1687   ret < 16 x i32> %res
1688 }
1689
1690 declare <16 x i32> @llvm.x86.avx512.mask.pand.d.512(<16 x i32>, <16 x i32>, <16 x i32>, i16)
1691
1692 define <8 x i64> @test_xor_epi64(<8 x i64> %a, <8 x i64> %b) {
1693   ;CHECK-LABEL: test_xor_epi64
1694   ;CHECK: vpxorq {{.*}}encoding: [0x62,0xf1,0xfd,0x48,0xef,0xc1]
1695   %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)
1696   ret < 8 x i64> %res
1697 }
1698
1699 define <8 x i64> @test_mask_xor_epi64(<8 x i64> %a,<8 x i64> %b, <8 x i64> %passThru, i8 %mask) {
1700   ;CHECK-LABEL: test_mask_xor_epi64
1701   ;CHECK: vpxorq %zmm1, %zmm0, %zmm2 {%k1} ## encoding: [0x62,0xf1,0xfd,0x49,0xef,0xd1]
1702   %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)
1703   ret < 8 x i64> %res
1704 }
1705
1706 declare <8 x i64> @llvm.x86.avx512.mask.pxor.q.512(<8 x i64>, <8 x i64>, <8 x i64>, i8)
1707
1708 define <8 x i64> @test_or_epi64(<8 x i64> %a, <8 x i64> %b) {
1709   ;CHECK-LABEL: test_or_epi64
1710   ;CHECK: vporq {{.*}}encoding: [0x62,0xf1,0xfd,0x48,0xeb,0xc1]
1711   %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)
1712   ret < 8 x i64> %res
1713 }
1714
1715 define <8 x i64> @test_mask_or_epi64(<8 x i64> %a,<8 x i64> %b, <8 x i64> %passThru, i8 %mask) {
1716   ;CHECK-LABEL: test_mask_or_epi64
1717   ;CHECK: vporq %zmm1, %zmm0, %zmm2 {%k1} ## encoding: [0x62,0xf1,0xfd,0x49,0xeb,0xd1]
1718   %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)
1719   ret < 8 x i64> %res
1720 }
1721
1722 declare <8 x i64> @llvm.x86.avx512.mask.por.q.512(<8 x i64>, <8 x i64>, <8 x i64>, i8)
1723
1724 define <8 x i64> @test_and_epi64(<8 x i64> %a, <8 x i64> %b) {
1725   ;CHECK-LABEL: test_and_epi64
1726   ;CHECK: vpandq {{.*}}encoding: [0x62,0xf1,0xfd,0x48,0xdb,0xc1]
1727   %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)
1728   ret < 8 x i64> %res
1729 }
1730
1731 define <8 x i64> @test_mask_and_epi64(<8 x i64> %a,<8 x i64> %b, <8 x i64> %passThru, i8 %mask) {
1732   ;CHECK-LABEL: test_mask_and_epi64
1733   ;CHECK: vpandq %zmm1, %zmm0, %zmm2 {%k1} ## encoding: [0x62,0xf1,0xfd,0x49,0xdb,0xd1]
1734   %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)
1735   ret < 8 x i64> %res
1736 }
1737
1738 declare <8 x i64> @llvm.x86.avx512.mask.pand.q.512(<8 x i64>, <8 x i64>, <8 x i64>, i8)
1739
1740
1741 define <16 x i32> @test_mask_add_epi32_rr(<16 x i32> %a, <16 x i32> %b) {
1742   ;CHECK-LABEL: test_mask_add_epi32_rr
1743   ;CHECK: vpaddd %zmm1, %zmm0, %zmm0     ## encoding: [0x62,0xf1,0x7d,0x48,0xfe,0xc1]
1744   %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)
1745   ret < 16 x i32> %res
1746 }
1747
1748 define <16 x i32> @test_mask_add_epi32_rrk(<16 x i32> %a, <16 x i32> %b, <16 x i32> %passThru, i16 %mask) {
1749   ;CHECK-LABEL: test_mask_add_epi32_rrk
1750   ;CHECK: vpaddd %zmm1, %zmm0, %zmm2 {%k1} ## encoding: [0x62,0xf1,0x7d,0x49,0xfe,0xd1]
1751   %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)
1752   ret < 16 x i32> %res
1753 }
1754
1755 define <16 x i32> @test_mask_add_epi32_rrkz(<16 x i32> %a, <16 x i32> %b, i16 %mask) {
1756   ;CHECK-LABEL: test_mask_add_epi32_rrkz
1757   ;CHECK: vpaddd %zmm1, %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf1,0x7d,0xc9,0xfe,0xc1]
1758   %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)
1759   ret < 16 x i32> %res
1760 }
1761
1762 define <16 x i32> @test_mask_add_epi32_rm(<16 x i32> %a, <16 x i32>* %ptr_b) {
1763   ;CHECK-LABEL: test_mask_add_epi32_rm
1764   ;CHECK: vpaddd (%rdi), %zmm0, %zmm0    ## encoding: [0x62,0xf1,0x7d,0x48,0xfe,0x07]
1765   %b = load <16 x i32>, <16 x i32>* %ptr_b
1766   %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)
1767   ret < 16 x i32> %res
1768 }
1769
1770 define <16 x i32> @test_mask_add_epi32_rmk(<16 x i32> %a, <16 x i32>* %ptr_b, <16 x i32> %passThru, i16 %mask) {
1771   ;CHECK-LABEL: test_mask_add_epi32_rmk
1772   ;CHECK: vpaddd (%rdi), %zmm0, %zmm1 {%k1} ## encoding: [0x62,0xf1,0x7d,0x49,0xfe,0x0f]
1773   %b = load <16 x i32>, <16 x i32>* %ptr_b
1774   %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)
1775   ret < 16 x i32> %res
1776 }
1777
1778 define <16 x i32> @test_mask_add_epi32_rmkz(<16 x i32> %a, <16 x i32>* %ptr_b, i16 %mask) {
1779   ;CHECK-LABEL: test_mask_add_epi32_rmkz
1780   ;CHECK: vpaddd (%rdi), %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf1,0x7d,0xc9,0xfe,0x07]
1781   %b = load <16 x i32>, <16 x i32>* %ptr_b
1782   %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)
1783   ret < 16 x i32> %res
1784 }
1785
1786 define <16 x i32> @test_mask_add_epi32_rmb(<16 x i32> %a, i32* %ptr_b) {
1787   ;CHECK-LABEL: test_mask_add_epi32_rmb
1788   ;CHECK: vpaddd (%rdi){1to16}, %zmm0, %zmm0  ## encoding: [0x62,0xf1,0x7d,0x58,0xfe,0x07]
1789   %q = load i32, i32* %ptr_b
1790   %vecinit.i = insertelement <16 x i32> undef, i32 %q, i32 0
1791   %b = shufflevector <16 x i32> %vecinit.i, <16 x i32> undef, <16 x i32> zeroinitializer
1792   %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)
1793   ret < 16 x i32> %res
1794 }
1795
1796 define <16 x i32> @test_mask_add_epi32_rmbk(<16 x i32> %a, i32* %ptr_b, <16 x i32> %passThru, i16 %mask) {
1797   ;CHECK-LABEL: test_mask_add_epi32_rmbk
1798   ;CHECK: vpaddd (%rdi){1to16}, %zmm0, %zmm1 {%k1} ## encoding: [0x62,0xf1,0x7d,0x59,0xfe,0x0f]
1799   %q = load i32, i32* %ptr_b
1800   %vecinit.i = insertelement <16 x i32> undef, i32 %q, i32 0
1801   %b = shufflevector <16 x i32> %vecinit.i, <16 x i32> undef, <16 x i32> zeroinitializer
1802   %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)
1803   ret < 16 x i32> %res
1804 }
1805
1806 define <16 x i32> @test_mask_add_epi32_rmbkz(<16 x i32> %a, i32* %ptr_b, i16 %mask) {
1807   ;CHECK-LABEL: test_mask_add_epi32_rmbkz
1808   ;CHECK: vpaddd (%rdi){1to16}, %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf1,0x7d,0xd9,0xfe,0x07]
1809   %q = load i32, i32* %ptr_b
1810   %vecinit.i = insertelement <16 x i32> undef, i32 %q, i32 0
1811   %b = shufflevector <16 x i32> %vecinit.i, <16 x i32> undef, <16 x i32> zeroinitializer
1812   %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)
1813   ret < 16 x i32> %res
1814 }
1815
1816 declare <16 x i32> @llvm.x86.avx512.mask.padd.d.512(<16 x i32>, <16 x i32>, <16 x i32>, i16)
1817
1818 define <16 x i32> @test_mask_sub_epi32_rr(<16 x i32> %a, <16 x i32> %b) {
1819   ;CHECK-LABEL: test_mask_sub_epi32_rr
1820   ;CHECK: vpsubd %zmm1, %zmm0, %zmm0     ## encoding: [0x62,0xf1,0x7d,0x48,0xfa,0xc1]
1821   %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)
1822   ret < 16 x i32> %res
1823 }
1824
1825 define <16 x i32> @test_mask_sub_epi32_rrk(<16 x i32> %a, <16 x i32> %b, <16 x i32> %passThru, i16 %mask) {
1826   ;CHECK-LABEL: test_mask_sub_epi32_rrk
1827   ;CHECK: vpsubd %zmm1, %zmm0, %zmm2 {%k1} ## encoding: [0x62,0xf1,0x7d,0x49,0xfa,0xd1]
1828   %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)
1829   ret < 16 x i32> %res
1830 }
1831
1832 define <16 x i32> @test_mask_sub_epi32_rrkz(<16 x i32> %a, <16 x i32> %b, i16 %mask) {
1833   ;CHECK-LABEL: test_mask_sub_epi32_rrkz
1834   ;CHECK: vpsubd %zmm1, %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf1,0x7d,0xc9,0xfa,0xc1]
1835   %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)
1836   ret < 16 x i32> %res
1837 }
1838
1839 define <16 x i32> @test_mask_sub_epi32_rm(<16 x i32> %a, <16 x i32>* %ptr_b) {
1840   ;CHECK-LABEL: test_mask_sub_epi32_rm
1841   ;CHECK: vpsubd (%rdi), %zmm0, %zmm0    ## encoding: [0x62,0xf1,0x7d,0x48,0xfa,0x07]
1842   %b = load <16 x i32>, <16 x i32>* %ptr_b
1843   %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)
1844   ret < 16 x i32> %res
1845 }
1846
1847 define <16 x i32> @test_mask_sub_epi32_rmk(<16 x i32> %a, <16 x i32>* %ptr_b, <16 x i32> %passThru, i16 %mask) {
1848   ;CHECK-LABEL: test_mask_sub_epi32_rmk
1849   ;CHECK: vpsubd (%rdi), %zmm0, %zmm1 {%k1} ## encoding: [0x62,0xf1,0x7d,0x49,0xfa,0x0f]
1850   %b = load <16 x i32>, <16 x i32>* %ptr_b
1851   %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)
1852   ret < 16 x i32> %res
1853 }
1854
1855 define <16 x i32> @test_mask_sub_epi32_rmkz(<16 x i32> %a, <16 x i32>* %ptr_b, i16 %mask) {
1856   ;CHECK-LABEL: test_mask_sub_epi32_rmkz
1857   ;CHECK: vpsubd (%rdi), %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf1,0x7d,0xc9,0xfa,0x07]
1858   %b = load <16 x i32>, <16 x i32>* %ptr_b
1859   %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)
1860   ret < 16 x i32> %res
1861 }
1862
1863 define <16 x i32> @test_mask_sub_epi32_rmb(<16 x i32> %a, i32* %ptr_b) {
1864   ;CHECK-LABEL: test_mask_sub_epi32_rmb
1865   ;CHECK: vpsubd (%rdi){1to16}, %zmm0, %zmm0  ## encoding: [0x62,0xf1,0x7d,0x58,0xfa,0x07]
1866   %q = load i32, i32* %ptr_b
1867   %vecinit.i = insertelement <16 x i32> undef, i32 %q, i32 0
1868   %b = shufflevector <16 x i32> %vecinit.i, <16 x i32> undef, <16 x i32> zeroinitializer
1869   %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)
1870   ret < 16 x i32> %res
1871 }
1872
1873 define <16 x i32> @test_mask_sub_epi32_rmbk(<16 x i32> %a, i32* %ptr_b, <16 x i32> %passThru, i16 %mask) {
1874   ;CHECK-LABEL: test_mask_sub_epi32_rmbk
1875   ;CHECK: vpsubd (%rdi){1to16}, %zmm0, %zmm1 {%k1} ## encoding: [0x62,0xf1,0x7d,0x59,0xfa,0x0f]
1876   %q = load i32, i32* %ptr_b
1877   %vecinit.i = insertelement <16 x i32> undef, i32 %q, i32 0
1878   %b = shufflevector <16 x i32> %vecinit.i, <16 x i32> undef, <16 x i32> zeroinitializer
1879   %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)
1880   ret < 16 x i32> %res
1881 }
1882
1883 define <16 x i32> @test_mask_sub_epi32_rmbkz(<16 x i32> %a, i32* %ptr_b, i16 %mask) {
1884   ;CHECK-LABEL: test_mask_sub_epi32_rmbkz
1885   ;CHECK: vpsubd (%rdi){1to16}, %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf1,0x7d,0xd9,0xfa,0x07]
1886   %q = load i32, i32* %ptr_b
1887   %vecinit.i = insertelement <16 x i32> undef, i32 %q, i32 0
1888   %b = shufflevector <16 x i32> %vecinit.i, <16 x i32> undef, <16 x i32> zeroinitializer
1889   %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)
1890   ret < 16 x i32> %res
1891 }
1892
1893 declare <16 x i32> @llvm.x86.avx512.mask.psub.d.512(<16 x i32>, <16 x i32>, <16 x i32>, i16)
1894
1895 define <8 x i64> @test_mask_add_epi64_rr(<8 x i64> %a, <8 x i64> %b) {
1896   ;CHECK-LABEL: test_mask_add_epi64_rr
1897   ;CHECK: vpaddq %zmm1, %zmm0, %zmm0     ## encoding: [0x62,0xf1,0xfd,0x48,0xd4,0xc1]
1898   %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)
1899   ret < 8 x i64> %res
1900 }
1901
1902 define <8 x i64> @test_mask_add_epi64_rrk(<8 x i64> %a, <8 x i64> %b, <8 x i64> %passThru, i8 %mask) {
1903   ;CHECK-LABEL: test_mask_add_epi64_rrk
1904   ;CHECK: vpaddq %zmm1, %zmm0, %zmm2 {%k1} ## encoding: [0x62,0xf1,0xfd,0x49,0xd4,0xd1]
1905   %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)
1906   ret < 8 x i64> %res
1907 }
1908
1909 define <8 x i64> @test_mask_add_epi64_rrkz(<8 x i64> %a, <8 x i64> %b, i8 %mask) {
1910   ;CHECK-LABEL: test_mask_add_epi64_rrkz
1911   ;CHECK: vpaddq %zmm1, %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf1,0xfd,0xc9,0xd4,0xc1]
1912   %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)
1913   ret < 8 x i64> %res
1914 }
1915
1916 define <8 x i64> @test_mask_add_epi64_rm(<8 x i64> %a, <8 x i64>* %ptr_b) {
1917   ;CHECK-LABEL: test_mask_add_epi64_rm
1918   ;CHECK: vpaddq (%rdi), %zmm0, %zmm0    ## encoding: [0x62,0xf1,0xfd,0x48,0xd4,0x07]
1919   %b = load <8 x i64>, <8 x i64>* %ptr_b
1920   %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)
1921   ret < 8 x i64> %res
1922 }
1923
1924 define <8 x i64> @test_mask_add_epi64_rmk(<8 x i64> %a, <8 x i64>* %ptr_b, <8 x i64> %passThru, i8 %mask) {
1925   ;CHECK-LABEL: test_mask_add_epi64_rmk
1926   ;CHECK: vpaddq (%rdi), %zmm0, %zmm1 {%k1} ## encoding: [0x62,0xf1,0xfd,0x49,0xd4,0x0f]
1927   %b = load <8 x i64>, <8 x i64>* %ptr_b
1928   %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)
1929   ret < 8 x i64> %res
1930 }
1931
1932 define <8 x i64> @test_mask_add_epi64_rmkz(<8 x i64> %a, <8 x i64>* %ptr_b, i8 %mask) {
1933   ;CHECK-LABEL: test_mask_add_epi64_rmkz
1934   ;CHECK: vpaddq (%rdi), %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf1,0xfd,0xc9,0xd4,0x07]
1935   %b = load <8 x i64>, <8 x i64>* %ptr_b
1936   %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)
1937   ret < 8 x i64> %res
1938 }
1939
1940 define <8 x i64> @test_mask_add_epi64_rmb(<8 x i64> %a, i64* %ptr_b) {
1941   ;CHECK-LABEL: test_mask_add_epi64_rmb
1942   ;CHECK: vpaddq (%rdi){1to8}, %zmm0, %zmm0  ## encoding: [0x62,0xf1,0xfd,0x58,0xd4,0x07]
1943   %q = load i64, i64* %ptr_b
1944   %vecinit.i = insertelement <8 x i64> undef, i64 %q, i32 0
1945   %b = shufflevector <8 x i64> %vecinit.i, <8 x i64> undef, <8 x i32> zeroinitializer
1946   %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)
1947   ret < 8 x i64> %res
1948 }
1949
1950 define <8 x i64> @test_mask_add_epi64_rmbk(<8 x i64> %a, i64* %ptr_b, <8 x i64> %passThru, i8 %mask) {
1951   ;CHECK-LABEL: test_mask_add_epi64_rmbk
1952   ;CHECK: vpaddq (%rdi){1to8}, %zmm0, %zmm1 {%k1} ## encoding: [0x62,0xf1,0xfd,0x59,0xd4,0x0f]
1953   %q = load i64, i64* %ptr_b
1954   %vecinit.i = insertelement <8 x i64> undef, i64 %q, i32 0
1955   %b = shufflevector <8 x i64> %vecinit.i, <8 x i64> undef, <8 x i32> zeroinitializer
1956   %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)
1957   ret < 8 x i64> %res
1958 }
1959
1960 define <8 x i64> @test_mask_add_epi64_rmbkz(<8 x i64> %a, i64* %ptr_b, i8 %mask) {
1961   ;CHECK-LABEL: test_mask_add_epi64_rmbkz
1962   ;CHECK: vpaddq (%rdi){1to8}, %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf1,0xfd,0xd9,0xd4,0x07]
1963   %q = load i64, i64* %ptr_b
1964   %vecinit.i = insertelement <8 x i64> undef, i64 %q, i32 0
1965   %b = shufflevector <8 x i64> %vecinit.i, <8 x i64> undef, <8 x i32> zeroinitializer
1966   %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)
1967   ret < 8 x i64> %res
1968 }
1969
1970 declare <8 x i64> @llvm.x86.avx512.mask.padd.q.512(<8 x i64>, <8 x i64>, <8 x i64>, i8)
1971
1972 define <8 x i64> @test_mask_sub_epi64_rr(<8 x i64> %a, <8 x i64> %b) {
1973   ;CHECK-LABEL: test_mask_sub_epi64_rr
1974   ;CHECK: vpsubq %zmm1, %zmm0, %zmm0     ## encoding: [0x62,0xf1,0xfd,0x48,0xfb,0xc1]
1975   %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)
1976   ret < 8 x i64> %res
1977 }
1978
1979 define <8 x i64> @test_mask_sub_epi64_rrk(<8 x i64> %a, <8 x i64> %b, <8 x i64> %passThru, i8 %mask) {
1980   ;CHECK-LABEL: test_mask_sub_epi64_rrk
1981   ;CHECK: vpsubq %zmm1, %zmm0, %zmm2 {%k1} ## encoding: [0x62,0xf1,0xfd,0x49,0xfb,0xd1]
1982   %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)
1983   ret < 8 x i64> %res
1984 }
1985
1986 define <8 x i64> @test_mask_sub_epi64_rrkz(<8 x i64> %a, <8 x i64> %b, i8 %mask) {
1987   ;CHECK-LABEL: test_mask_sub_epi64_rrkz
1988   ;CHECK: vpsubq %zmm1, %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf1,0xfd,0xc9,0xfb,0xc1]
1989   %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)
1990   ret < 8 x i64> %res
1991 }
1992
1993 define <8 x i64> @test_mask_sub_epi64_rm(<8 x i64> %a, <8 x i64>* %ptr_b) {
1994   ;CHECK-LABEL: test_mask_sub_epi64_rm
1995   ;CHECK: vpsubq (%rdi), %zmm0, %zmm0    ## encoding: [0x62,0xf1,0xfd,0x48,0xfb,0x07]
1996   %b = load <8 x i64>, <8 x i64>* %ptr_b
1997   %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)
1998   ret < 8 x i64> %res
1999 }
2000
2001 define <8 x i64> @test_mask_sub_epi64_rmk(<8 x i64> %a, <8 x i64>* %ptr_b, <8 x i64> %passThru, i8 %mask) {
2002   ;CHECK-LABEL: test_mask_sub_epi64_rmk
2003   ;CHECK: vpsubq (%rdi), %zmm0, %zmm1 {%k1} ## encoding: [0x62,0xf1,0xfd,0x49,0xfb,0x0f]
2004   %b = load <8 x i64>, <8 x i64>* %ptr_b
2005   %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)
2006   ret < 8 x i64> %res
2007 }
2008
2009 define <8 x i64> @test_mask_sub_epi64_rmkz(<8 x i64> %a, <8 x i64>* %ptr_b, i8 %mask) {
2010   ;CHECK-LABEL: test_mask_sub_epi64_rmkz
2011   ;CHECK: vpsubq (%rdi), %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf1,0xfd,0xc9,0xfb,0x07]
2012   %b = load <8 x i64>, <8 x i64>* %ptr_b
2013   %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)
2014   ret < 8 x i64> %res
2015 }
2016
2017 define <8 x i64> @test_mask_sub_epi64_rmb(<8 x i64> %a, i64* %ptr_b) {
2018   ;CHECK-LABEL: test_mask_sub_epi64_rmb
2019   ;CHECK: vpsubq (%rdi){1to8}, %zmm0, %zmm0  ## encoding: [0x62,0xf1,0xfd,0x58,0xfb,0x07]
2020   %q = load i64, i64* %ptr_b
2021   %vecinit.i = insertelement <8 x i64> undef, i64 %q, i32 0
2022   %b = shufflevector <8 x i64> %vecinit.i, <8 x i64> undef, <8 x i32> zeroinitializer
2023   %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)
2024   ret < 8 x i64> %res
2025 }
2026
2027 define <8 x i64> @test_mask_sub_epi64_rmbk(<8 x i64> %a, i64* %ptr_b, <8 x i64> %passThru, i8 %mask) {
2028   ;CHECK-LABEL: test_mask_sub_epi64_rmbk
2029   ;CHECK: vpsubq (%rdi){1to8}, %zmm0, %zmm1 {%k1} ## encoding: [0x62,0xf1,0xfd,0x59,0xfb,0x0f]
2030   %q = load i64, i64* %ptr_b
2031   %vecinit.i = insertelement <8 x i64> undef, i64 %q, i32 0
2032   %b = shufflevector <8 x i64> %vecinit.i, <8 x i64> undef, <8 x i32> zeroinitializer
2033   %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)
2034   ret < 8 x i64> %res
2035 }
2036
2037 define <8 x i64> @test_mask_sub_epi64_rmbkz(<8 x i64> %a, i64* %ptr_b, i8 %mask) {
2038   ;CHECK-LABEL: test_mask_sub_epi64_rmbkz
2039   ;CHECK: vpsubq (%rdi){1to8}, %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf1,0xfd,0xd9,0xfb,0x07]
2040   %q = load i64, i64* %ptr_b
2041   %vecinit.i = insertelement <8 x i64> undef, i64 %q, i32 0
2042   %b = shufflevector <8 x i64> %vecinit.i, <8 x i64> undef, <8 x i32> zeroinitializer
2043   %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)
2044   ret < 8 x i64> %res
2045 }
2046
2047 declare <8 x i64> @llvm.x86.avx512.mask.psub.q.512(<8 x i64>, <8 x i64>, <8 x i64>, i8)
2048
2049 define <8 x i64> @test_mask_mul_epi32_rr(<16 x i32> %a, <16 x i32> %b) {
2050   ;CHECK-LABEL: test_mask_mul_epi32_rr
2051   ;CHECK: vpmuldq %zmm1, %zmm0, %zmm0     ## encoding: [0x62,0xf2,0xfd,0x48,0x28,0xc1]
2052   %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)
2053   ret < 8 x i64> %res
2054 }
2055
2056 define <8 x i64> @test_mask_mul_epi32_rrk(<16 x i32> %a, <16 x i32> %b, <8 x i64> %passThru, i8 %mask) {
2057   ;CHECK-LABEL: test_mask_mul_epi32_rrk
2058   ;CHECK: vpmuldq %zmm1, %zmm0, %zmm2 {%k1} ## encoding: [0x62,0xf2,0xfd,0x49,0x28,0xd1]
2059   %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)
2060   ret < 8 x i64> %res
2061 }
2062
2063 define <8 x i64> @test_mask_mul_epi32_rrkz(<16 x i32> %a, <16 x i32> %b, i8 %mask) {
2064   ;CHECK-LABEL: test_mask_mul_epi32_rrkz
2065   ;CHECK: vpmuldq %zmm1, %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf2,0xfd,0xc9,0x28,0xc1]
2066   %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)
2067   ret < 8 x i64> %res
2068 }
2069
2070 define <8 x i64> @test_mask_mul_epi32_rm(<16 x i32> %a, <16 x i32>* %ptr_b) {
2071   ;CHECK-LABEL: test_mask_mul_epi32_rm
2072   ;CHECK: vpmuldq (%rdi), %zmm0, %zmm0    ## encoding: [0x62,0xf2,0xfd,0x48,0x28,0x07]
2073   %b = load <16 x i32>, <16 x i32>* %ptr_b
2074   %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)
2075   ret < 8 x i64> %res
2076 }
2077
2078 define <8 x i64> @test_mask_mul_epi32_rmk(<16 x i32> %a, <16 x i32>* %ptr_b, <8 x i64> %passThru, i8 %mask) {
2079   ;CHECK-LABEL: test_mask_mul_epi32_rmk
2080   ;CHECK: vpmuldq (%rdi), %zmm0, %zmm1 {%k1} ## encoding: [0x62,0xf2,0xfd,0x49,0x28,0x0f]
2081   %b = load <16 x i32>, <16 x i32>* %ptr_b
2082   %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)
2083   ret < 8 x i64> %res
2084 }
2085
2086 define <8 x i64> @test_mask_mul_epi32_rmkz(<16 x i32> %a, <16 x i32>* %ptr_b, i8 %mask) {
2087   ;CHECK-LABEL: test_mask_mul_epi32_rmkz
2088   ;CHECK: vpmuldq (%rdi), %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf2,0xfd,0xc9,0x28,0x07]
2089   %b = load <16 x i32>, <16 x i32>* %ptr_b
2090   %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)
2091   ret < 8 x i64> %res
2092 }
2093
2094 define <8 x i64> @test_mask_mul_epi32_rmb(<16 x i32> %a, i64* %ptr_b) {
2095   ;CHECK-LABEL: test_mask_mul_epi32_rmb
2096   ;CHECK: vpmuldq (%rdi){1to8}, %zmm0, %zmm0  ## encoding: [0x62,0xf2,0xfd,0x58,0x28,0x07]
2097   %q = load i64, i64* %ptr_b
2098   %vecinit.i = insertelement <8 x i64> undef, i64 %q, i32 0
2099   %b64 = shufflevector <8 x i64> %vecinit.i, <8 x i64> undef, <8 x i32> zeroinitializer
2100   %b = bitcast <8 x i64> %b64 to <16 x i32>
2101   %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)
2102   ret < 8 x i64> %res
2103 }
2104
2105 define <8 x i64> @test_mask_mul_epi32_rmbk(<16 x i32> %a, i64* %ptr_b, <8 x i64> %passThru, i8 %mask) {
2106   ;CHECK-LABEL: test_mask_mul_epi32_rmbk
2107   ;CHECK: vpmuldq (%rdi){1to8}, %zmm0, %zmm1 {%k1} ## encoding: [0x62,0xf2,0xfd,0x59,0x28,0x0f]
2108   %q = load i64, i64* %ptr_b
2109   %vecinit.i = insertelement <8 x i64> undef, i64 %q, i32 0
2110   %b64 = shufflevector <8 x i64> %vecinit.i, <8 x i64> undef, <8 x i32> zeroinitializer
2111   %b = bitcast <8 x i64> %b64 to <16 x i32>
2112   %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)
2113   ret < 8 x i64> %res
2114 }
2115
2116 define <8 x i64> @test_mask_mul_epi32_rmbkz(<16 x i32> %a, i64* %ptr_b, i8 %mask) {
2117   ;CHECK-LABEL: test_mask_mul_epi32_rmbkz
2118   ;CHECK: vpmuldq (%rdi){1to8}, %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf2,0xfd,0xd9,0x28,0x07]
2119   %q = load i64, i64* %ptr_b
2120   %vecinit.i = insertelement <8 x i64> undef, i64 %q, i32 0
2121   %b64 = shufflevector <8 x i64> %vecinit.i, <8 x i64> undef, <8 x i32> zeroinitializer
2122   %b = bitcast <8 x i64> %b64 to <16 x i32>
2123   %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)
2124   ret < 8 x i64> %res
2125 }
2126
2127 declare <8 x i64> @llvm.x86.avx512.mask.pmul.dq.512(<16 x i32>, <16 x i32>, <8 x i64>, i8)
2128
2129 define <8 x i64> @test_mask_mul_epu32_rr(<16 x i32> %a, <16 x i32> %b) {
2130   ;CHECK-LABEL: test_mask_mul_epu32_rr
2131   ;CHECK: vpmuludq %zmm1, %zmm0, %zmm0  ## encoding: [0x62,0xf1,0xfd,0x48,0xf4,0xc1]
2132   %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)
2133   ret < 8 x i64> %res
2134 }
2135
2136 define <8 x i64> @test_mask_mul_epu32_rrk(<16 x i32> %a, <16 x i32> %b, <8 x i64> %passThru, i8 %mask) {
2137   ;CHECK-LABEL: test_mask_mul_epu32_rrk
2138   ;CHECK: vpmuludq %zmm1, %zmm0, %zmm2 {%k1} ## encoding: [0x62,0xf1,0xfd,0x49,0xf4,0xd1]
2139   %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)
2140   ret < 8 x i64> %res
2141 }
2142
2143 define <8 x i64> @test_mask_mul_epu32_rrkz(<16 x i32> %a, <16 x i32> %b, i8 %mask) {
2144   ;CHECK-LABEL: test_mask_mul_epu32_rrkz
2145   ;CHECK: vpmuludq %zmm1, %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf1,0xfd,0xc9,0xf4,0xc1]
2146   %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)
2147   ret < 8 x i64> %res
2148 }
2149
2150 define <8 x i64> @test_mask_mul_epu32_rm(<16 x i32> %a, <16 x i32>* %ptr_b) {
2151   ;CHECK-LABEL: test_mask_mul_epu32_rm
2152   ;CHECK: vpmuludq (%rdi), %zmm0, %zmm0  ## encoding: [0x62,0xf1,0xfd,0x48,0xf4,0x07]
2153   %b = load <16 x i32>, <16 x i32>* %ptr_b
2154   %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)
2155   ret < 8 x i64> %res
2156 }
2157
2158 define <8 x i64> @test_mask_mul_epu32_rmk(<16 x i32> %a, <16 x i32>* %ptr_b, <8 x i64> %passThru, i8 %mask) {
2159   ;CHECK-LABEL: test_mask_mul_epu32_rmk
2160   ;CHECK: vpmuludq (%rdi), %zmm0, %zmm1 {%k1} ## encoding: [0x62,0xf1,0xfd,0x49,0xf4,0x0f]
2161   %b = load <16 x i32>, <16 x i32>* %ptr_b
2162   %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)
2163   ret < 8 x i64> %res
2164 }
2165
2166 define <8 x i64> @test_mask_mul_epu32_rmkz(<16 x i32> %a, <16 x i32>* %ptr_b, i8 %mask) {
2167   ;CHECK-LABEL: test_mask_mul_epu32_rmkz
2168   ;CHECK: vpmuludq (%rdi), %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf1,0xfd,0xc9,0xf4,0x07]
2169   %b = load <16 x i32>, <16 x i32>* %ptr_b
2170   %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)
2171   ret < 8 x i64> %res
2172 }
2173
2174 define <8 x i64> @test_mask_mul_epu32_rmb(<16 x i32> %a, i64* %ptr_b) {
2175   ;CHECK-LABEL: test_mask_mul_epu32_rmb
2176   ;CHECK: vpmuludq (%rdi){1to8}, %zmm0, %zmm0  ## encoding: [0x62,0xf1,0xfd,0x58,0xf4,0x07]
2177   %q = load i64, i64* %ptr_b
2178   %vecinit.i = insertelement <8 x i64> undef, i64 %q, i32 0
2179   %b64 = shufflevector <8 x i64> %vecinit.i, <8 x i64> undef, <8 x i32> zeroinitializer
2180   %b = bitcast <8 x i64> %b64 to <16 x i32>
2181   %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)
2182   ret < 8 x i64> %res
2183 }
2184
2185 define <8 x i64> @test_mask_mul_epu32_rmbk(<16 x i32> %a, i64* %ptr_b, <8 x i64> %passThru, i8 %mask) {
2186   ;CHECK-LABEL: test_mask_mul_epu32_rmbk
2187   ;CHECK: vpmuludq (%rdi){1to8}, %zmm0, %zmm1 {%k1} ## encoding: [0x62,0xf1,0xfd,0x59,0xf4,0x0f]
2188   %q = load i64, i64* %ptr_b
2189   %vecinit.i = insertelement <8 x i64> undef, i64 %q, i32 0
2190   %b64 = shufflevector <8 x i64> %vecinit.i, <8 x i64> undef, <8 x i32> zeroinitializer
2191   %b = bitcast <8 x i64> %b64 to <16 x i32>
2192   %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)
2193   ret < 8 x i64> %res
2194 }
2195
2196 define <8 x i64> @test_mask_mul_epu32_rmbkz(<16 x i32> %a, i64* %ptr_b, i8 %mask) {
2197   ;CHECK-LABEL: test_mask_mul_epu32_rmbkz
2198   ;CHECK: vpmuludq (%rdi){1to8}, %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf1,0xfd,0xd9,0xf4,0x07]
2199   %q = load i64, i64* %ptr_b
2200   %vecinit.i = insertelement <8 x i64> undef, i64 %q, i32 0
2201   %b64 = shufflevector <8 x i64> %vecinit.i, <8 x i64> undef, <8 x i32> zeroinitializer
2202   %b = bitcast <8 x i64> %b64 to <16 x i32>
2203   %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)
2204   ret < 8 x i64> %res
2205 }
2206
2207 declare <8 x i64> @llvm.x86.avx512.mask.pmulu.dq.512(<16 x i32>, <16 x i32>, <8 x i64>, i8)
2208
2209 define <16 x i32> @test_mask_mullo_epi32_rr_512(<16 x i32> %a, <16 x i32> %b) {
2210   ;CHECK-LABEL: test_mask_mullo_epi32_rr_512
2211   ;CHECK: vpmulld %zmm1, %zmm0, %zmm0 ## encoding: [0x62,0xf2,0x7d,0x48,0x40,0xc1]
2212   %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)
2213   ret <16 x i32> %res
2214 }
2215
2216 define <16 x i32> @test_mask_mullo_epi32_rrk_512(<16 x i32> %a, <16 x i32> %b, <16 x i32> %passThru, i16 %mask) {
2217   ;CHECK-LABEL: test_mask_mullo_epi32_rrk_512
2218   ;CHECK: vpmulld %zmm1, %zmm0, %zmm2 {%k1} ## encoding: [0x62,0xf2,0x7d,0x49,0x40,0xd1]
2219   %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)
2220   ret < 16 x i32> %res
2221 }
2222
2223 define <16 x i32> @test_mask_mullo_epi32_rrkz_512(<16 x i32> %a, <16 x i32> %b, i16 %mask) {
2224   ;CHECK-LABEL: test_mask_mullo_epi32_rrkz_512
2225   ;CHECK: vpmulld %zmm1, %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf2,0x7d,0xc9,0x40,0xc1]
2226   %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)
2227   ret < 16 x i32> %res
2228 }
2229
2230 define <16 x i32> @test_mask_mullo_epi32_rm_512(<16 x i32> %a, <16 x i32>* %ptr_b) {
2231   ;CHECK-LABEL: test_mask_mullo_epi32_rm_512
2232   ;CHECK: vpmulld (%rdi), %zmm0, %zmm0 ## encoding: [0x62,0xf2,0x7d,0x48,0x40,0x07]
2233   %b = load <16 x i32>, <16 x i32>* %ptr_b
2234   %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)
2235   ret < 16 x i32> %res
2236 }
2237
2238 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) {
2239   ;CHECK-LABEL: test_mask_mullo_epi32_rmk_512
2240   ;CHECK: vpmulld (%rdi), %zmm0, %zmm1 {%k1} ## encoding: [0x62,0xf2,0x7d,0x49,0x40,0x0f]
2241   %b = load <16 x i32>, <16 x i32>* %ptr_b
2242   %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)
2243   ret < 16 x i32> %res
2244 }
2245
2246 define <16 x i32> @test_mask_mullo_epi32_rmkz_512(<16 x i32> %a, <16 x i32>* %ptr_b, i16 %mask) {
2247   ;CHECK-LABEL: test_mask_mullo_epi32_rmkz_512
2248   ;CHECK: vpmulld (%rdi), %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf2,0x7d,0xc9,0x40,0x07]
2249   %b = load <16 x i32>, <16 x i32>* %ptr_b
2250   %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)
2251   ret < 16 x i32> %res
2252 }
2253
2254 define <16 x i32> @test_mask_mullo_epi32_rmb_512(<16 x i32> %a, i32* %ptr_b) {
2255   ;CHECK-LABEL: test_mask_mullo_epi32_rmb_512
2256   ;CHECK: vpmulld (%rdi){1to16}, %zmm0, %zmm0 ## encoding: [0x62,0xf2,0x7d,0x58,0x40,0x07]
2257   %q = load i32, i32* %ptr_b
2258   %vecinit.i = insertelement <16 x i32> undef, i32 %q, i32 0
2259   %b = shufflevector <16 x i32> %vecinit.i, <16 x i32> undef, <16 x i32> zeroinitializer
2260   %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)
2261   ret < 16 x i32> %res
2262 }
2263
2264 define <16 x i32> @test_mask_mullo_epi32_rmbk_512(<16 x i32> %a, i32* %ptr_b, <16 x i32> %passThru, i16 %mask) {
2265   ;CHECK-LABEL: test_mask_mullo_epi32_rmbk_512
2266   ;CHECK: vpmulld (%rdi){1to16}, %zmm0, %zmm1 {%k1} ## encoding: [0x62,0xf2,0x7d,0x59,0x40,0x0f]
2267   %q = load i32, i32* %ptr_b
2268   %vecinit.i = insertelement <16 x i32> undef, i32 %q, i32 0
2269   %b = shufflevector <16 x i32> %vecinit.i, <16 x i32> undef, <16 x i32> zeroinitializer
2270   %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)
2271   ret < 16 x i32> %res
2272 }
2273
2274 define <16 x i32> @test_mask_mullo_epi32_rmbkz_512(<16 x i32> %a, i32* %ptr_b, i16 %mask) {
2275   ;CHECK-LABEL: test_mask_mullo_epi32_rmbkz_512
2276   ;CHECK: vpmulld (%rdi){1to16}, %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf2,0x7d,0xd9,0x40,0x07]
2277   %q = load i32, i32* %ptr_b
2278   %vecinit.i = insertelement <16 x i32> undef, i32 %q, i32 0
2279   %b = shufflevector <16 x i32> %vecinit.i, <16 x i32> undef, <16 x i32> zeroinitializer
2280   %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)
2281   ret < 16 x i32> %res
2282 }
2283
2284 declare <16 x i32> @llvm.x86.avx512.mask.pmull.d.512(<16 x i32>, <16 x i32>, <16 x i32>, i16)
2285
2286 define <16 x float> @test_mm512_maskz_add_round_ps_rn_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2287   ;CHECK-LABEL: test_mm512_maskz_add_round_ps_rn_sae
2288   ;CHECK: vaddps {rn-sae}, %zmm1, %zmm0, %zmm0 {%k1} {z}
2289   %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)
2290   ret <16 x float> %res
2291 }
2292 define <16 x float> @test_mm512_maskz_add_round_ps_rd_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2293   ;CHECK-LABEL: test_mm512_maskz_add_round_ps_rd_sae
2294   ;CHECK: vaddps {rd-sae}, %zmm1, %zmm0, %zmm0
2295   %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)
2296   ret <16 x float> %res
2297 }
2298 define <16 x float> @test_mm512_maskz_add_round_ps_ru_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2299   ;CHECK-LABEL: test_mm512_maskz_add_round_ps_ru_sae
2300   ;CHECK: vaddps  {ru-sae}, %zmm1, %zmm0, %zmm0  {%k1} {z}
2301   %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)
2302   ret <16 x float> %res
2303 }
2304
2305 define <16 x float> @test_mm512_maskz_add_round_ps_rz_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2306   ;CHECK-LABEL: test_mm512_maskz_add_round_ps_rz_sae
2307   ;CHECK: vaddps  {rz-sae}, %zmm1, %zmm0, %zmm0 {%k1} {z}
2308   %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)
2309   ret <16 x float> %res
2310 }
2311
2312
2313 define <16 x float> @test_mm512_maskz_add_round_ps_current(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2314   ;CHECK-LABEL: test_mm512_maskz_add_round_ps_current
2315   ;CHECK: vaddps %zmm1, %zmm0, %zmm0 {%k1} {z}
2316   %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)
2317   ret <16 x float> %res
2318 }
2319
2320 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) {
2321   ;CHECK-LABEL: test_mm512_mask_add_round_ps_rn_sae
2322   ;CHECK: vaddps {rn-sae}, %zmm1, %zmm0, %zmm2 {%k1} 
2323   %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)
2324   ret <16 x float> %res
2325 }
2326 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) {
2327   ;CHECK-LABEL: test_mm512_mask_add_round_ps_rd_sae
2328   ;CHECK: vaddps {rd-sae}, %zmm1, %zmm0, %zmm2 {%k1} 
2329   %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)
2330   ret <16 x float> %res
2331 }
2332 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) {
2333   ;CHECK-LABEL: test_mm512_mask_add_round_ps_ru_sae
2334   ;CHECK: vaddps  {ru-sae}, %zmm1, %zmm0, %zmm2 {%k1} 
2335   %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)
2336   ret <16 x float> %res
2337 }
2338
2339 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) {
2340   ;CHECK-LABEL: test_mm512_mask_add_round_ps_rz_sae
2341   ;CHECK: vaddps  {rz-sae}, %zmm1, %zmm0, %zmm2 {%k1} 
2342   %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)
2343   ret <16 x float> %res
2344 }
2345
2346
2347 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) {
2348   ;CHECK-LABEL: test_mm512_mask_add_round_ps_current
2349   ;CHECK: vaddps %zmm1, %zmm0, %zmm2 {%k1} 
2350   %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)
2351   ret <16 x float> %res
2352 }
2353
2354
2355 define <16 x float> @test_mm512_add_round_ps_rn_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2356   ;CHECK-LABEL: test_mm512_add_round_ps_rn_sae
2357   ;CHECK: vaddps {rn-sae}, %zmm1, %zmm0, %zmm0
2358   %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)
2359   ret <16 x float> %res
2360 }
2361 define <16 x float> @test_mm512_add_round_ps_rd_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2362   ;CHECK-LABEL: test_mm512_add_round_ps_rd_sae
2363   ;CHECK: vaddps {rd-sae}, %zmm1, %zmm0, %zmm0
2364   %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)
2365   ret <16 x float> %res
2366 }
2367 define <16 x float> @test_mm512_add_round_ps_ru_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2368   ;CHECK-LABEL: test_mm512_add_round_ps_ru_sae
2369   ;CHECK: vaddps  {ru-sae}, %zmm1, %zmm0, %zmm0
2370   %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)
2371   ret <16 x float> %res
2372 }
2373
2374 define <16 x float> @test_mm512_add_round_ps_rz_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2375   ;CHECK-LABEL: test_mm512_add_round_ps_rz_sae
2376   ;CHECK: vaddps  {rz-sae}, %zmm1, %zmm0, %zmm0
2377   %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)
2378   ret <16 x float> %res
2379 }
2380
2381 define <16 x float> @test_mm512_add_round_ps_current(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2382   ;CHECK-LABEL: test_mm512_add_round_ps_current
2383   ;CHECK: vaddps %zmm1, %zmm0, %zmm0
2384   %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)
2385   ret <16 x float> %res
2386 }
2387 declare <16 x float> @llvm.x86.avx512.mask.add.ps.512(<16 x float>, <16 x float>, <16 x float>, i16, i32)
2388
2389 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) {
2390   ;CHECK-LABEL: test_mm512_mask_sub_round_ps_rn_sae
2391   ;CHECK: vsubps {rn-sae}, %zmm1, %zmm0, %zmm2 {%k1} 
2392   %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)
2393   ret <16 x float> %res
2394 }
2395 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) {
2396   ;CHECK-LABEL: test_mm512_mask_sub_round_ps_rd_sae
2397   ;CHECK: vsubps {rd-sae}, %zmm1, %zmm0, %zmm2 {%k1} 
2398   %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)
2399   ret <16 x float> %res
2400 }
2401 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) {
2402   ;CHECK-LABEL: test_mm512_mask_sub_round_ps_ru_sae
2403   ;CHECK: vsubps  {ru-sae}, %zmm1, %zmm0, %zmm2 {%k1} 
2404   %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)
2405   ret <16 x float> %res
2406 }
2407
2408 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) {
2409   ;CHECK-LABEL: test_mm512_mask_sub_round_ps_rz_sae
2410   ;CHECK: vsubps  {rz-sae}, %zmm1, %zmm0, %zmm2 {%k1} 
2411   %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)
2412   ret <16 x float> %res
2413 }
2414
2415
2416 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) {
2417   ;CHECK-LABEL: test_mm512_mask_sub_round_ps_current
2418   ;CHECK: vsubps %zmm1, %zmm0, %zmm2 {%k1} 
2419   %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)
2420   ret <16 x float> %res
2421 }
2422
2423 define <16 x float> @test_mm512_sub_round_ps_rn_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2424   ;CHECK-LABEL: test_mm512_sub_round_ps_rn_sae
2425   ;CHECK: vsubps {rn-sae}, %zmm1, %zmm0, %zmm0
2426   %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)
2427   ret <16 x float> %res
2428 }
2429 define <16 x float> @test_mm512_sub_round_ps_rd_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2430   ;CHECK-LABEL: test_mm512_sub_round_ps_rd_sae
2431   ;CHECK: vsubps {rd-sae}, %zmm1, %zmm0, %zmm0
2432   %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)
2433   ret <16 x float> %res
2434 }
2435 define <16 x float> @test_mm512_sub_round_ps_ru_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2436   ;CHECK-LABEL: test_mm512_sub_round_ps_ru_sae
2437   ;CHECK: vsubps  {ru-sae}, %zmm1, %zmm0, %zmm0
2438   %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)
2439   ret <16 x float> %res
2440 }
2441
2442 define <16 x float> @test_mm512_sub_round_ps_rz_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2443   ;CHECK-LABEL: test_mm512_sub_round_ps_rz_sae
2444   ;CHECK: vsubps  {rz-sae}, %zmm1, %zmm0, %zmm0
2445   %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)
2446   ret <16 x float> %res
2447 }
2448
2449 define <16 x float> @test_mm512_sub_round_ps_current(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2450   ;CHECK-LABEL: test_mm512_sub_round_ps_current
2451   ;CHECK: vsubps %zmm1, %zmm0, %zmm0
2452   %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)
2453   ret <16 x float> %res
2454 }
2455
2456 define <16 x float> @test_mm512_maskz_div_round_ps_rn_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2457   ;CHECK-LABEL: test_mm512_maskz_div_round_ps_rn_sae
2458   ;CHECK: vdivps {rn-sae}, %zmm1, %zmm0, %zmm0 {%k1} {z}
2459   %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)
2460   ret <16 x float> %res
2461 }
2462 define <16 x float> @test_mm512_maskz_div_round_ps_rd_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2463   ;CHECK-LABEL: test_mm512_maskz_div_round_ps_rd_sae
2464   ;CHECK: vdivps {rd-sae}, %zmm1, %zmm0, %zmm0
2465   %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)
2466   ret <16 x float> %res
2467 }
2468 define <16 x float> @test_mm512_maskz_div_round_ps_ru_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2469   ;CHECK-LABEL: test_mm512_maskz_div_round_ps_ru_sae
2470   ;CHECK: vdivps  {ru-sae}, %zmm1, %zmm0, %zmm0  {%k1} {z}
2471   %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)
2472   ret <16 x float> %res
2473 }
2474
2475 define <16 x float> @test_mm512_maskz_div_round_ps_rz_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2476   ;CHECK-LABEL: test_mm512_maskz_div_round_ps_rz_sae
2477   ;CHECK: vdivps  {rz-sae}, %zmm1, %zmm0, %zmm0 {%k1} {z}
2478   %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)
2479   ret <16 x float> %res
2480 }
2481
2482
2483 define <16 x float> @test_mm512_maskz_div_round_ps_current(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2484   ;CHECK-LABEL: test_mm512_maskz_div_round_ps_current
2485   ;CHECK: vdivps %zmm1, %zmm0, %zmm0 {%k1} {z}
2486   %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)
2487   ret <16 x float> %res
2488 }
2489
2490 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) {
2491   ;CHECK-LABEL: test_mm512_mask_div_round_ps_rn_sae
2492   ;CHECK: vdivps {rn-sae}, %zmm1, %zmm0, %zmm2 {%k1} 
2493   %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)
2494   ret <16 x float> %res
2495 }
2496 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) {
2497   ;CHECK-LABEL: test_mm512_mask_div_round_ps_rd_sae
2498   ;CHECK: vdivps {rd-sae}, %zmm1, %zmm0, %zmm2 {%k1} 
2499   %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)
2500   ret <16 x float> %res
2501 }
2502 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) {
2503   ;CHECK-LABEL: test_mm512_mask_div_round_ps_ru_sae
2504   ;CHECK: vdivps  {ru-sae}, %zmm1, %zmm0, %zmm2 {%k1} 
2505   %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)
2506   ret <16 x float> %res
2507 }
2508
2509 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) {
2510   ;CHECK-LABEL: test_mm512_mask_div_round_ps_rz_sae
2511   ;CHECK: vdivps  {rz-sae}, %zmm1, %zmm0, %zmm2 {%k1} 
2512   %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)
2513   ret <16 x float> %res
2514 }
2515
2516
2517 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) {
2518   ;CHECK-LABEL: test_mm512_mask_div_round_ps_current
2519   ;CHECK: vdivps %zmm1, %zmm0, %zmm2 {%k1} 
2520   %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)
2521   ret <16 x float> %res
2522 }
2523
2524
2525 define <16 x float> @test_mm512_div_round_ps_rn_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2526   ;CHECK-LABEL: test_mm512_div_round_ps_rn_sae
2527   ;CHECK: vdivps {rn-sae}, %zmm1, %zmm0, %zmm0
2528   %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)
2529   ret <16 x float> %res
2530 }
2531 define <16 x float> @test_mm512_div_round_ps_rd_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2532   ;CHECK-LABEL: test_mm512_div_round_ps_rd_sae
2533   ;CHECK: vdivps {rd-sae}, %zmm1, %zmm0, %zmm0
2534   %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)
2535   ret <16 x float> %res
2536 }
2537 define <16 x float> @test_mm512_div_round_ps_ru_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2538   ;CHECK-LABEL: test_mm512_div_round_ps_ru_sae
2539   ;CHECK: vdivps  {ru-sae}, %zmm1, %zmm0, %zmm0
2540   %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)
2541   ret <16 x float> %res
2542 }
2543
2544 define <16 x float> @test_mm512_div_round_ps_rz_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2545   ;CHECK-LABEL: test_mm512_div_round_ps_rz_sae
2546   ;CHECK: vdivps  {rz-sae}, %zmm1, %zmm0, %zmm0
2547   %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)
2548   ret <16 x float> %res
2549 }
2550
2551 define <16 x float> @test_mm512_div_round_ps_current(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2552   ;CHECK-LABEL: test_mm512_div_round_ps_current
2553   ;CHECK: vdivps %zmm1, %zmm0, %zmm0
2554   %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)
2555   ret <16 x float> %res
2556 }
2557 declare <16 x float> @llvm.x86.avx512.mask.div.ps.512(<16 x float>, <16 x float>, <16 x float>, i16, i32)
2558
2559 define <16 x float> @test_mm512_maskz_min_round_ps_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2560   ;CHECK-LABEL: test_mm512_maskz_min_round_ps_sae
2561   ;CHECK: vminps {sae}, %zmm1, %zmm0, %zmm0 {%k1} {z}
2562   %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)
2563   ret <16 x float> %res
2564 }
2565
2566 define <16 x float> @test_mm512_maskz_min_round_ps_current(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2567   ;CHECK-LABEL: test_mm512_maskz_min_round_ps_current
2568   ;CHECK: vminps %zmm1, %zmm0, %zmm0 {%k1} {z}
2569   %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)
2570   ret <16 x float> %res
2571 }
2572
2573 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) {
2574   ;CHECK-LABEL: test_mm512_mask_min_round_ps_sae
2575   ;CHECK: vminps {sae}, %zmm1, %zmm0, %zmm2 {%k1}
2576   %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)
2577   ret <16 x float> %res
2578 }
2579
2580 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) {
2581   ;CHECK-LABEL: test_mm512_mask_min_round_ps_current
2582   ;CHECK: vminps %zmm1, %zmm0, %zmm2 {%k1} 
2583   %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)
2584   ret <16 x float> %res
2585 }
2586
2587 define <16 x float> @test_mm512_min_round_ps_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2588   ;CHECK-LABEL: test_mm512_min_round_ps_sae
2589   ;CHECK: vminps {sae}, %zmm1, %zmm0, %zmm0
2590   %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)
2591   ret <16 x float> %res
2592 }
2593
2594 define <16 x float> @test_mm512_min_round_ps_current(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2595   ;CHECK-LABEL: test_mm512_min_round_ps_current
2596   ;CHECK: vminps %zmm1, %zmm0, %zmm0
2597   %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)
2598   ret <16 x float> %res
2599 }
2600 declare <16 x float> @llvm.x86.avx512.mask.min.ps.512(<16 x float>, <16 x float>, <16 x float>, i16, i32)
2601
2602 define <16 x float> @test_mm512_maskz_max_round_ps_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2603   ;CHECK-LABEL: test_mm512_maskz_max_round_ps_sae
2604   ;CHECK: vmaxps {sae}, %zmm1, %zmm0, %zmm0 {%k1} {z}
2605   %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)
2606   ret <16 x float> %res
2607 }
2608
2609 define <16 x float> @test_mm512_maskz_max_round_ps_current(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2610   ;CHECK-LABEL: test_mm512_maskz_max_round_ps_current
2611   ;CHECK: vmaxps %zmm1, %zmm0, %zmm0 {%k1} {z}
2612   %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)
2613   ret <16 x float> %res
2614 }
2615
2616 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) {
2617   ;CHECK-LABEL: test_mm512_mask_max_round_ps_sae
2618   ;CHECK: vmaxps {sae}, %zmm1, %zmm0, %zmm2 {%k1}
2619   %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)
2620   ret <16 x float> %res
2621 }
2622
2623 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) {
2624   ;CHECK-LABEL: test_mm512_mask_max_round_ps_current
2625   ;CHECK: vmaxps %zmm1, %zmm0, %zmm2 {%k1} 
2626   %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)
2627   ret <16 x float> %res
2628 }
2629
2630 define <16 x float> @test_mm512_max_round_ps_sae(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2631   ;CHECK-LABEL: test_mm512_max_round_ps_sae
2632   ;CHECK: vmaxps {sae}, %zmm1, %zmm0, %zmm0 
2633   %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)
2634   ret <16 x float> %res
2635 }
2636
2637 define <16 x float> @test_mm512_max_round_ps_current(<16 x float> %a0, <16 x float> %a1, i16 %mask) {
2638   ;CHECK-LABEL: test_mm512_max_round_ps_current
2639   ;CHECK: vmaxps %zmm1, %zmm0, %zmm0
2640   %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)
2641   ret <16 x float> %res
2642 }
2643 declare <16 x float> @llvm.x86.avx512.mask.max.ps.512(<16 x float>, <16 x float>, <16 x float>, i16, i32)
2644
2645 declare <4 x float> @llvm.x86.avx512.mask.add.ss.round(<4 x float>, <4 x float>, <4 x float>, i8, i32) nounwind readnone
2646
2647 define <4 x float> @test_mask_add_ss_rn(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2, i8 %mask) {
2648 ; CHECK-LABEL: test_mask_add_ss_rn
2649 ; CHECK: vaddss  {rn-sae}, %xmm1, %xmm0, %xmm2 {%k1}
2650   %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)
2651   ret <4 x float> %res
2652 }
2653
2654 define <4 x float> @test_mask_add_ss_rd(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2, i8 %mask) {
2655 ; CHECK-LABEL: test_mask_add_ss_rd
2656 ; CHECK: vaddss  {rd-sae}, %xmm1, %xmm0, %xmm2 {%k1}
2657   %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)
2658   ret <4 x float> %res
2659 }
2660
2661 define <4 x float> @test_mask_add_ss_ru(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2, i8 %mask) {
2662 ; CHECK-LABEL: test_mask_add_ss_ru
2663 ; CHECK: vaddss  {ru-sae}, %xmm1, %xmm0, %xmm2 {%k1}
2664   %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)
2665   ret <4 x float> %res
2666 }
2667
2668 define <4 x float> @test_mask_add_ss_rz(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2, i8 %mask) {
2669 ; CHECK-LABEL: test_mask_add_ss_rz
2670 ; CHECK: vaddss  {rz-sae}, %xmm1, %xmm0, %xmm2 {%k1}
2671   %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)
2672   ret <4 x float> %res
2673 }
2674
2675 define <4 x float> @test_mask_add_ss_current(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2, i8 %mask) {
2676 ; CHECK-LABEL: test_mask_add_ss_current
2677 ; CHECK: vaddss %xmm1, %xmm0, %xmm2 {%k1}
2678   %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)
2679   ret <4 x float> %res
2680 }
2681
2682 define <4 x float> @test_maskz_add_ss_rn(<4 x float> %a0, <4 x float> %a1, i8 %mask) {
2683 ; CHECK-LABEL: test_maskz_add_ss_rn
2684 ; CHECK: vaddss  {rn-sae}, %xmm1, %xmm0, %xmm0 {%k1} {z}
2685   %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)
2686   ret <4 x float> %res
2687 }
2688
2689 define <4 x float> @test_add_ss_rn(<4 x float> %a0, <4 x float> %a1) {
2690 ; CHECK-LABEL: test_add_ss_rn
2691 ; CHECK: vaddss  {rn-sae}, %xmm1, %xmm0, %xmm0
2692   %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)
2693   ret <4 x float> %res
2694 }
2695
2696 declare <2 x double> @llvm.x86.avx512.mask.add.sd.round(<2 x double>, <2 x double>, <2 x double>, i8, i32) nounwind readnone
2697
2698 define <2 x double> @test_mask_add_sd_rn(<2 x double> %a0, <2 x double> %a1, <2 x double> %a2, i8 %mask) {
2699 ; CHECK-LABEL: test_mask_add_sd_rn
2700 ; CHECK: vaddsd  {rn-sae}, %xmm1, %xmm0, %xmm2 {%k1}
2701   %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)
2702   ret <2 x double> %res
2703 }
2704
2705 define <2 x double> @test_mask_add_sd_rd(<2 x double> %a0, <2 x double> %a1, <2 x double> %a2, i8 %mask) {
2706 ; CHECK-LABEL: test_mask_add_sd_rd
2707 ; CHECK: vaddsd  {rd-sae}, %xmm1, %xmm0, %xmm2 {%k1}
2708   %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)
2709   ret <2 x double> %res
2710 }
2711
2712 define <2 x double> @test_mask_add_sd_ru(<2 x double> %a0, <2 x double> %a1, <2 x double> %a2, i8 %mask) {
2713 ; CHECK-LABEL: test_mask_add_sd_ru
2714 ; CHECK: vaddsd  {ru-sae}, %xmm1, %xmm0, %xmm2 {%k1}
2715   %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)
2716   ret <2 x double> %res
2717 }
2718
2719 define <2 x double> @test_mask_add_sd_rz(<2 x double> %a0, <2 x double> %a1, <2 x double> %a2, i8 %mask) {
2720 ; CHECK-LABEL: test_mask_add_sd_rz
2721 ; CHECK: vaddsd  {rz-sae}, %xmm1, %xmm0, %xmm2 {%k1}
2722   %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)
2723   ret <2 x double> %res
2724 }
2725
2726 define <2 x double> @test_mask_add_sd_current(<2 x double> %a0, <2 x double> %a1, <2 x double> %a2, i8 %mask) {
2727 ; CHECK-LABEL: test_mask_add_sd_current
2728 ; CHECK: vaddsd %xmm1, %xmm0, %xmm2 {%k1}
2729   %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)
2730   ret <2 x double> %res
2731 }
2732
2733 define <2 x double> @test_maskz_add_sd_rn(<2 x double> %a0, <2 x double> %a1, i8 %mask) {
2734 ; CHECK-LABEL: test_maskz_add_sd_rn
2735 ; CHECK: vaddsd  {rn-sae}, %xmm1, %xmm0, %xmm0 {%k1} {z}
2736   %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)
2737   ret <2 x double> %res
2738 }
2739
2740 define <2 x double> @test_add_sd_rn(<2 x double> %a0, <2 x double> %a1) {
2741 ; CHECK-LABEL: test_add_sd_rn
2742 ; CHECK: vaddsd  {rn-sae}, %xmm1, %xmm0, %xmm0
2743   %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)
2744   ret <2 x double> %res
2745 }
2746
2747 declare <4 x float> @llvm.x86.avx512.mask.max.ss.round(<4 x float>, <4 x float>, <4 x float>, i8, i32) nounwind readnone
2748
2749 define <4 x float> @test_mask_max_ss_sae(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2, i8 %mask) {
2750 ; CHECK-LABEL: test_mask_max_ss_sae
2751 ; CHECK: vmaxss  {sae}, %xmm1, %xmm0, %xmm2 {%k1}
2752   %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)
2753   ret <4 x float> %res
2754 }
2755
2756 define <4 x float> @test_maskz_max_ss_sae(<4 x float> %a0, <4 x float> %a1, i8 %mask) {
2757 ; CHECK-LABEL: test_maskz_max_ss_sae
2758 ; CHECK: vmaxss  {sae}, %xmm1, %xmm0, %xmm0 {%k1} {z}
2759   %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)
2760   ret <4 x float> %res
2761 }
2762
2763 define <4 x float> @test_max_ss_sae(<4 x float> %a0, <4 x float> %a1) {
2764 ; CHECK-LABEL: test_max_ss_sae
2765 ; CHECK: vmaxss  {sae}, %xmm1, %xmm0, %xmm0
2766   %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)
2767   ret <4 x float> %res
2768 }
2769
2770 define <4 x float> @test_mask_max_ss(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2, i8 %mask) {
2771 ; CHECK-LABEL: test_mask_max_ss
2772 ; CHECK: vmaxss  %xmm1, %xmm0, %xmm2 {%k1}
2773   %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)
2774   ret <4 x float> %res
2775 }
2776
2777 define <4 x float> @test_maskz_max_ss(<4 x float> %a0, <4 x float> %a1, i8 %mask) {
2778 ; CHECK-LABEL: test_maskz_max_ss
2779 ; CHECK: vmaxss  %xmm1, %xmm0, %xmm0 {%k1} {z}
2780   %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)
2781   ret <4 x float> %res
2782 }
2783
2784 define <4 x float> @test_max_ss(<4 x float> %a0, <4 x float> %a1) {
2785 ; CHECK-LABEL: test_max_ss
2786 ; CHECK: vmaxss  %xmm1, %xmm0, %xmm0
2787   %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)
2788   ret <4 x float> %res
2789 }
2790 declare <2 x double> @llvm.x86.avx512.mask.max.sd.round(<2 x double>, <2 x double>, <2 x double>, i8, i32) nounwind readnone
2791
2792 define <2 x double> @test_mask_max_sd_sae(<2 x double> %a0, <2 x double> %a1, <2 x double> %a2, i8 %mask) {
2793 ; CHECK-LABEL: test_mask_max_sd_sae
2794 ; CHECK: vmaxsd  {sae}, %xmm1, %xmm0, %xmm2 {%k1}
2795   %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)
2796   ret <2 x double> %res
2797 }
2798
2799 define <2 x double> @test_maskz_max_sd_sae(<2 x double> %a0, <2 x double> %a1, i8 %mask) {
2800 ; CHECK-LABEL: test_maskz_max_sd_sae
2801 ; CHECK: vmaxsd  {sae}, %xmm1, %xmm0, %xmm0 {%k1} {z}
2802   %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)
2803   ret <2 x double> %res
2804 }
2805
2806 define <2 x double> @test_max_sd_sae(<2 x double> %a0, <2 x double> %a1) {
2807 ; CHECK-LABEL: test_max_sd_sae
2808 ; CHECK: vmaxsd  {sae}, %xmm1, %xmm0, %xmm0
2809   %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)
2810   ret <2 x double> %res
2811 }
2812
2813 define <2 x double> @test_mask_max_sd(<2 x double> %a0, <2 x double> %a1, <2 x double> %a2, i8 %mask) {
2814 ; CHECK-LABEL: test_mask_max_sd
2815 ; CHECK: vmaxsd  %xmm1, %xmm0, %xmm2 {%k1}
2816   %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)
2817   ret <2 x double> %res
2818 }
2819
2820 define <2 x double> @test_maskz_max_sd(<2 x double> %a0, <2 x double> %a1, i8 %mask) {
2821 ; CHECK-LABEL: test_maskz_max_sd
2822 ; CHECK: vmaxsd  %xmm1, %xmm0, %xmm0 {%k1} {z}
2823   %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)
2824   ret <2 x double> %res
2825 }
2826
2827 define <2 x double> @test_max_sd(<2 x double> %a0, <2 x double> %a1) {
2828 ; CHECK-LABEL: test_max_sd
2829 ; CHECK: vmaxsd  %xmm1, %xmm0, %xmm0
2830   %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)
2831   ret <2 x double> %res
2832 }
2833
2834 define <2 x double> @test_x86_avx512_cvtsi2sd32(<2 x double> %a, i32 %b) {
2835 ; CHECK-LABEL: test_x86_avx512_cvtsi2sd32:
2836 ; CHECK:       ## BB#0:
2837 ; CHECK-NEXT:    vcvtsi2sdl %edi, {rz-sae}, %xmm0, %xmm0 
2838 ; CHECK-NEXT:    retq 
2839   %res = call <2 x double> @llvm.x86.avx512.cvtsi2sd32(<2 x double> %a, i32 %b, i32 3) ; <<<2 x double>> [#uses=1]
2840   ret <2 x double> %res
2841 }
2842 declare <2 x double> @llvm.x86.avx512.cvtsi2sd32(<2 x double>, i32, i32) nounwind readnone
2843
2844 define <2 x double> @test_x86_avx512_cvtsi2sd64(<2 x double> %a, i64 %b) {
2845 ; CHECK-LABEL: test_x86_avx512_cvtsi2sd64:
2846 ; CHECK:       ## BB#0:
2847 ; CHECK-NEXT:    vcvtsi2sdq %rdi, {rz-sae}, %xmm0, %xmm0 
2848 ; CHECK-NEXT:    retq 
2849   %res = call <2 x double> @llvm.x86.avx512.cvtsi2sd64(<2 x double> %a, i64 %b, i32 3) ; <<<2 x double>> [#uses=1]
2850   ret <2 x double> %res
2851 }
2852 declare <2 x double> @llvm.x86.avx512.cvtsi2sd64(<2 x double>, i64, i32) nounwind readnone
2853
2854 define <4 x float> @test_x86_avx512_cvtsi2ss32(<4 x float> %a, i32 %b) {
2855 ; CHECK-LABEL: test_x86_avx512_cvtsi2ss32:
2856 ; CHECK:       ## BB#0:
2857 ; CHECK-NEXT:    vcvtsi2ssl %edi, {rz-sae}, %xmm0, %xmm0 
2858 ; CHECK-NEXT:    retq 
2859   %res = call <4 x float> @llvm.x86.avx512.cvtsi2ss32(<4 x float> %a, i32 %b, i32 3) ; <<<4 x float>> [#uses=1]
2860   ret <4 x float> %res
2861 }
2862 declare <4 x float> @llvm.x86.avx512.cvtsi2ss32(<4 x float>, i32, i32) nounwind readnone
2863
2864 define <4 x float> @test_x86_avx512_cvtsi2ss64(<4 x float> %a, i64 %b) {
2865 ; CHECK-LABEL: test_x86_avx512_cvtsi2ss64:
2866 ; CHECK:       ## BB#0:
2867 ; CHECK-NEXT:    vcvtsi2ssq %rdi, {rz-sae}, %xmm0, %xmm0 
2868 ; CHECK-NEXT:    retq 
2869   %res = call <4 x float> @llvm.x86.avx512.cvtsi2ss64(<4 x float> %a, i64 %b, i32 3) ; <<<4 x float>> [#uses=1]
2870   ret <4 x float> %res
2871 }
2872 declare <4 x float> @llvm.x86.avx512.cvtsi2ss64(<4 x float>, i64, i32) nounwind readnone
2873
2874 define <4 x float> @test_x86_avx512__mm_cvt_roundu32_ss (<4 x float> %a, i32 %b)
2875 ; CHECK-LABEL: test_x86_avx512__mm_cvt_roundu32_ss:
2876 ; CHECK:       ## BB#0:
2877 ; CHECK-NEXT:    vcvtusi2ssl %edi, {rd-sae}, %xmm0, %xmm0 
2878 ; CHECK-NEXT:    retq 
2879 {
2880   %res = call <4 x float> @llvm.x86.avx512.cvtusi2ss(<4 x float> %a, i32 %b, i32 1) ; <<<4 x float>> [#uses=1]
2881   ret <4 x float> %res
2882 }
2883
2884 define <4 x float> @test_x86_avx512__mm_cvt_roundu32_ss_mem(<4 x float> %a, i32* %ptr)
2885 ; CHECK-LABEL: test_x86_avx512__mm_cvt_roundu32_ss_mem:
2886 ; CHECK:       ## BB#0:
2887 ; CHECK-NEXT:    movl (%rdi), %eax 
2888 ; CHECK-NEXT:    vcvtusi2ssl %eax, {rd-sae}, %xmm0, %xmm0 
2889 ; CHECK-NEXT:    retq 
2890 {
2891   %b = load i32, i32* %ptr
2892   %res = call <4 x float> @llvm.x86.avx512.cvtusi2ss(<4 x float> %a, i32 %b, i32 1) ; <<<4 x float>> [#uses=1]
2893   ret <4 x float> %res
2894 }
2895
2896 define <4 x float> @test_x86_avx512__mm_cvtu32_ss(<4 x float> %a, i32 %b)
2897 ; CHECK-LABEL: test_x86_avx512__mm_cvtu32_ss:
2898 ; CHECK:       ## BB#0:
2899 ; CHECK-NEXT:    vcvtusi2ssl %edi, %xmm0, %xmm0 
2900 ; CHECK-NEXT:    retq 
2901 {
2902   %res = call <4 x float> @llvm.x86.avx512.cvtusi2ss(<4 x float> %a, i32 %b, i32 4) ; <<<4 x float>> [#uses=1]
2903   ret <4 x float> %res
2904 }
2905
2906 define <4 x float> @test_x86_avx512__mm_cvtu32_ss_mem(<4 x float> %a, i32* %ptr)
2907 ; CHECK-LABEL: test_x86_avx512__mm_cvtu32_ss_mem:
2908 ; CHECK:       ## BB#0:
2909 ; CHECK-NEXT:    vcvtusi2ssl (%rdi), %xmm0, %xmm0
2910 ; CHECK-NEXT:    retq 
2911 {
2912   %b = load i32, i32* %ptr
2913   %res = call <4 x float> @llvm.x86.avx512.cvtusi2ss(<4 x float> %a, i32 %b, i32 4) ; <<<4 x float>> [#uses=1]
2914   ret <4 x float> %res
2915 }
2916 declare <4 x float> @llvm.x86.avx512.cvtusi2ss(<4 x float>, i32, i32) nounwind readnone
2917
2918 define <4 x float> @_mm_cvt_roundu64_ss (<4 x float> %a, i64 %b)
2919 ; CHECK-LABEL: _mm_cvt_roundu64_ss:
2920 ; CHECK:       ## BB#0:
2921 ; CHECK-NEXT:    vcvtusi2ssq %rdi, {rd-sae}, %xmm0, %xmm0 
2922 ; CHECK-NEXT:    retq 
2923 {
2924   %res = call <4 x float> @llvm.x86.avx512.cvtusi642ss(<4 x float> %a, i64 %b, i32 1) ; <<<4 x float>> [#uses=1]
2925   ret <4 x float> %res
2926 }
2927
2928 define <4 x float> @_mm_cvtu64_ss(<4 x float> %a, i64 %b)
2929 ; CHECK-LABEL: _mm_cvtu64_ss:
2930 ; CHECK:       ## BB#0:
2931 ; CHECK-NEXT:    vcvtusi2ssq %rdi, %xmm0, %xmm0 
2932 ; CHECK-NEXT:    retq 
2933 {
2934   %res = call <4 x float> @llvm.x86.avx512.cvtusi642ss(<4 x float> %a, i64 %b, i32 4) ; <<<4 x float>> [#uses=1]
2935   ret <4 x float> %res
2936 }
2937 declare <4 x float> @llvm.x86.avx512.cvtusi642ss(<4 x float>, i64, i32) nounwind readnone
2938
2939 define <2 x double> @test_x86_avx512_mm_cvtu32_sd(<2 x double> %a, i32 %b)
2940 ; CHECK-LABEL: test_x86_avx512_mm_cvtu32_sd:
2941 ; CHECK:       ## BB#0:
2942 ; CHECK-NEXT:    vcvtusi2sdl %edi, %xmm0, %xmm0 
2943 ; CHECK-NEXT:    retq 
2944 {
2945   %res = call <2 x double> @llvm.x86.avx512.cvtusi2sd(<2 x double> %a, i32 %b) ; <<<2 x double>> [#uses=1]
2946   ret <2 x double> %res
2947 }
2948 declare <2 x double> @llvm.x86.avx512.cvtusi2sd(<2 x double>, i32) nounwind readnone
2949
2950 define <2 x double> @test_x86_avx512_mm_cvtu64_sd(<2 x double> %a, i64 %b)
2951 ; CHECK-LABEL: test_x86_avx512_mm_cvtu64_sd:
2952 ; CHECK:       ## BB#0:
2953 ; CHECK-NEXT:    vcvtusi2sdq %rdi, {rd-sae}, %xmm0, %xmm0 
2954 ; CHECK-NEXT:    retq 
2955 {
2956   %res = call <2 x double> @llvm.x86.avx512.cvtusi642sd(<2 x double> %a, i64 %b, i32 1) ; <<<2 x double>> [#uses=1]
2957   ret <2 x double> %res
2958 }
2959
2960 define <2 x double> @test_x86_avx512__mm_cvt_roundu64_sd(<2 x double> %a, i64 %b)
2961 ; CHECK-LABEL: test_x86_avx512__mm_cvt_roundu64_sd:
2962 ; CHECK:       ## BB#0:
2963 ; CHECK-NEXT:    vcvtusi2sdq %rdi, %xmm0, %xmm0 
2964 ; CHECK-NEXT:    retq 
2965 {
2966   %res = call <2 x double> @llvm.x86.avx512.cvtusi642sd(<2 x double> %a, i64 %b, i32 4) ; <<<2 x double>> [#uses=1]
2967   ret <2 x double> %res
2968 }
2969 declare <2 x double> @llvm.x86.avx512.cvtusi642sd(<2 x double>, i64, i32) nounwind readnone
2970
2971 define <8 x i64> @test_vpmaxq(<8 x i64> %a0, <8 x i64> %a1) {
2972   ; CHECK: vpmaxsq {{.*}}encoding: [0x62,0xf2,0xfd,0x48,0x3d,0xc1]
2973   %res = call <8 x i64> @llvm.x86.avx512.mask.pmaxs.q.512(<8 x i64> %a0, <8 x i64> %a1,
2974                     <8 x i64>zeroinitializer, i8 -1)
2975   ret <8 x i64> %res
2976 }
2977 declare <8 x i64> @llvm.x86.avx512.mask.pmaxs.q.512(<8 x i64>, <8 x i64>, <8 x i64>, i8)
2978
2979 define <16 x i32> @test_vpminud(<16 x i32> %a0, <16 x i32> %a1) {
2980   ; CHECK: vpminud {{.*}}encoding: [0x62,0xf2,0x7d,0x48,0x3b,0xc1]
2981   %res = call <16 x i32> @llvm.x86.avx512.mask.pminu.d.512(<16 x i32> %a0, <16 x i32> %a1,
2982                     <16 x i32>zeroinitializer, i16 -1)
2983   ret <16 x i32> %res
2984 }
2985 declare <16 x i32> @llvm.x86.avx512.mask.pminu.d.512(<16 x i32>, <16 x i32>, <16 x i32>, i16)
2986
2987 define <16 x i32> @test_vpmaxsd(<16 x i32> %a0, <16 x i32> %a1) {
2988   ; CHECK: vpmaxsd {{.*}}encoding: [0x62,0xf2,0x7d,0x48,0x3d,0xc1]
2989   %res = call <16 x i32> @llvm.x86.avx512.mask.pmaxs.d.512(<16 x i32> %a0, <16 x i32> %a1,
2990                     <16 x i32>zeroinitializer, i16 -1)
2991   ret <16 x i32> %res
2992 }
2993 declare <16 x i32> @llvm.x86.avx512.mask.pmaxs.d.512(<16 x i32>, <16 x i32>, <16 x i32>, i16)
2994
2995 ; CHECK-LABEL: @test_int_x86_avx512_mask_pmaxs_d_512
2996 ; CHECK-NOT: call 
2997 ; CHECK: vpmaxsd %zmm
2998 ; CHECK: {%k1} 
2999 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) {
3000   %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)
3001   %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)
3002   %res2 = add <16 x i32> %res, %res1
3003   ret <16 x i32> %res2
3004 }
3005
3006 ; CHECK-LABEL: @test_int_x86_avx512_mask_pmaxs_q_512
3007 ; CHECK-NOT: call 
3008 ; CHECK: vpmaxsq %zmm
3009 ; CHECK: {%k1} 
3010 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) {
3011   %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)
3012   %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)
3013   %res2 = add <8 x i64> %res, %res1
3014   ret <8 x i64> %res2
3015 }
3016
3017 declare <16 x i32> @llvm.x86.avx512.mask.pmaxu.d.512(<16 x i32>, <16 x i32>, <16 x i32>, i16)
3018
3019 ; CHECK-LABEL: @test_int_x86_avx512_mask_pmaxu_d_512
3020 ; CHECK-NOT: call 
3021 ; CHECK: vpmaxud %zmm
3022 ; CHECK: {%k1} 
3023 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) {
3024   %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)
3025   %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)
3026   %res2 = add <16 x i32> %res, %res1
3027   ret <16 x i32> %res2
3028 }
3029
3030 declare <8 x i64> @llvm.x86.avx512.mask.pmaxu.q.512(<8 x i64>, <8 x i64>, <8 x i64>, i8)
3031
3032 ; CHECK-LABEL: @test_int_x86_avx512_mask_pmaxu_q_512
3033 ; CHECK-NOT: call 
3034 ; CHECK: vpmaxuq %zmm
3035 ; CHECK: {%k1} 
3036 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) {
3037   %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)
3038   %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)
3039   %res2 = add <8 x i64> %res, %res1
3040   ret <8 x i64> %res2
3041 }
3042
3043 declare <16 x i32> @llvm.x86.avx512.mask.pmins.d.512(<16 x i32>, <16 x i32>, <16 x i32>, i16)
3044
3045 ; CHECK-LABEL: @test_int_x86_avx512_mask_pmins_d_512
3046 ; CHECK-NOT: call 
3047 ; CHECK: vpminsd %zmm
3048 ; CHECK: {%k1} 
3049 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) {
3050   %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)
3051   %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)
3052   %res2 = add <16 x i32> %res, %res1
3053   ret <16 x i32> %res2
3054 }
3055
3056 declare <8 x i64> @llvm.x86.avx512.mask.pmins.q.512(<8 x i64>, <8 x i64>, <8 x i64>, i8)
3057
3058 ; CHECK-LABEL: @test_int_x86_avx512_mask_pmins_q_512
3059 ; CHECK-NOT: call 
3060 ; CHECK: vpminsq %zmm
3061 ; CHECK: {%k1} 
3062 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) {
3063   %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)
3064   %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)
3065   %res2 = add <8 x i64> %res, %res1
3066   ret <8 x i64> %res2
3067 }
3068
3069 ; CHECK-LABEL: @test_int_x86_avx512_mask_pminu_d_512
3070 ; CHECK-NOT: call 
3071 ; CHECK: vpminud %zmm
3072 ; CHECK: {%k1} 
3073 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) {
3074   %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)
3075   %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)
3076   %res2 = add <16 x i32> %res, %res1
3077   ret <16 x i32> %res2
3078 }
3079
3080 declare <8 x i64> @llvm.x86.avx512.mask.pminu.q.512(<8 x i64>, <8 x i64>, <8 x i64>, i8)
3081
3082 ; CHECK-LABEL: @test_int_x86_avx512_mask_pminu_q_512
3083 ; CHECK-NOT: call 
3084 ; CHECK: vpminuq %zmm
3085 ; CHECK: {%k1} 
3086 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) {
3087   %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)
3088   %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)
3089   %res2 = add <8 x i64> %res, %res1
3090   ret <8 x i64> %res2
3091 }
3092
3093 declare <16 x i32> @llvm.x86.avx512.mask.vpermi2var.d.512(<16 x i32>, <16 x i32>, <16 x i32>, i16)
3094
3095 ; CHECK-LABEL: @test_int_x86_avx512_mask_vpermi2var_d_512
3096 ; CHECK-NOT: call 
3097 ; CHECK: kmov 
3098 ; CHECK: vpermi2d {{.*}}{%k1} 
3099 define <16 x i32>@test_int_x86_avx512_mask_vpermi2var_d_512(<16 x i32> %x0, <16 x i32> %x1, <16 x i32> %x2, i16 %x3) {
3100   %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)
3101   %res1 = call <16 x i32> @llvm.x86.avx512.mask.vpermi2var.d.512(<16 x i32> %x0, <16 x i32> %x1, <16 x i32> %x2, i16 -1)
3102   %res2 = add <16 x i32> %res, %res1
3103   ret <16 x i32> %res2
3104 }
3105
3106 declare <8 x double> @llvm.x86.avx512.mask.vpermi2var.pd.512(<8 x double>, <8 x i64>, <8 x double>, i8)
3107
3108 ; CHECK-LABEL: @test_int_x86_avx512_mask_vpermi2var_pd_512
3109 ; CHECK-NOT: call 
3110 ; CHECK: kmov 
3111 ; CHECK:  vpermi2pd {{.*}}{%k1} 
3112 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) {
3113   %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)
3114   %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)
3115   %res2 = fadd <8 x double> %res, %res1
3116   ret <8 x double> %res2
3117 }
3118
3119 declare <16 x float> @llvm.x86.avx512.mask.vpermi2var.ps.512(<16 x float>, <16 x i32>, <16 x float>, i16)
3120
3121 ; CHECK-LABEL: @test_int_x86_avx512_mask_vpermi2var_ps_512
3122 ; CHECK-NOT: call 
3123 ; CHECK: kmov 
3124 ; CHECK: vpermi2ps {{.*}}{%k1} 
3125 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) {
3126   %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)
3127   %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)
3128   %res2 = fadd <16 x float> %res, %res1
3129   ret <16 x float> %res2
3130 }
3131
3132 declare <8 x i64> @llvm.x86.avx512.mask.vpermi2var.q.512(<8 x i64>, <8 x i64>, <8 x i64>, i8)
3133
3134 ; CHECK-LABEL: @test_int_x86_avx512_mask_vpermi2var_q_512
3135 ; CHECK-NOT: call 
3136 ; CHECK: kmov 
3137 ; CHECK: vpermi2q {{.*}}{%k1} 
3138 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) {
3139   %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)
3140   %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)
3141   %res2 = add <8 x i64> %res, %res1
3142   ret <8 x i64> %res2
3143 }
3144
3145 declare <16 x i32> @llvm.x86.avx512.maskz.vpermt2var.d.512(<16 x i32>, <16 x i32>, <16 x i32>, i16)
3146
3147 ; CHECK-LABEL: @test_int_x86_avx512_maskz_vpermt2var_d_512
3148 ; CHECK-NOT: call 
3149 ; CHECK: kmov 
3150 ; CHECK: vpermt2d {{.*}}{%k1} {z}
3151 define <16 x i32>@test_int_x86_avx512_maskz_vpermt2var_d_512(<16 x i32> %x0, <16 x i32> %x1, <16 x i32> %x2, i16 %x3) {
3152   %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)
3153   %res1 = call <16 x i32> @llvm.x86.avx512.maskz.vpermt2var.d.512(<16 x i32> %x0, <16 x i32> %x1, <16 x i32> %x2, i16 -1)
3154   %res2 = add <16 x i32> %res, %res1
3155   ret <16 x i32> %res2
3156 }
3157
3158 declare <8 x double> @llvm.x86.avx512.maskz.vpermt2var.pd.512(<8 x i64>, <8 x double>, <8 x double>, i8)
3159
3160 ; CHECK-LABEL: @test_int_x86_avx512_maskz_vpermt2var_pd_512
3161 ; CHECK-NOT: call 
3162 ; CHECK: kmov 
3163 ; CHECK: vpermt2pd {{.*}}{%k1} {z}
3164 define <8 x double>@test_int_x86_avx512_maskz_vpermt2var_pd_512(<8 x i64> %x0, <8 x double> %x1, <8 x double> %x2, i8 %x3) {
3165   %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)
3166   %res1 = call <8 x double> @llvm.x86.avx512.maskz.vpermt2var.pd.512(<8 x i64> %x0, <8 x double> %x1, <8 x double> %x2, i8 -1)
3167   %res2 = fadd <8 x double> %res, %res1
3168   ret <8 x double> %res2
3169 }
3170
3171 declare <16 x float> @llvm.x86.avx512.maskz.vpermt2var.ps.512(<16 x i32>, <16 x float>, <16 x float>, i16)
3172
3173 ; CHECK-LABEL: @test_int_x86_avx512_maskz_vpermt2var_ps_512
3174 ; CHECK-NOT: call 
3175 ; CHECK: kmov 
3176 ; CHECK: vpermt2ps {{.*}}{%k1} {z}
3177 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) {
3178   %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)
3179   %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)
3180   %res2 = fadd <16 x float> %res, %res1
3181   ret <16 x float> %res2
3182 }
3183
3184
3185 declare <8 x i64> @llvm.x86.avx512.maskz.vpermt2var.q.512(<8 x i64>, <8 x i64>, <8 x i64>, i8)
3186
3187 ; CHECK-LABEL: @test_int_x86_avx512_maskz_vpermt2var_q_512
3188 ; CHECK-NOT: call 
3189 ; CHECK: kmov 
3190 ; CHECK: vpermt2q {{.*}}{%k1} {z}
3191 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) {
3192   %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)
3193   %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)
3194   %res2 = add <8 x i64> %res, %res1
3195   ret <8 x i64> %res2
3196 }
3197
3198 declare <16 x i32> @llvm.x86.avx512.mask.vpermt2var.d.512(<16 x i32>, <16 x i32>, <16 x i32>, i16)
3199
3200 ; CHECK-LABEL: @test_int_x86_avx512_mask_vpermt2var_d_512
3201 ; CHECK-NOT: call 
3202 ; CHECK: kmov 
3203 ; CHECK: vpermt2d {{.*}}{%k1}
3204 ; CHECK-NOT: {z}
3205 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) {
3206   %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)
3207   %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)
3208   %res2 = add <16 x i32> %res, %res1
3209   ret <16 x i32> %res2
3210 }
3211
3212 declare <8 x double> @llvm.x86.avx512.mask.scalef.pd.512(<8 x double>, <8 x double>, <8 x double>, i8, i32)
3213 ; CHECK-LABEL: @test_int_x86_avx512_mask_scalef_pd_512
3214 ; CHECK-NOT: call 
3215 ; CHECK: kmov 
3216 ; CHECK: vscalefpd{{.*}}{%k1} 
3217 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) {
3218   %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)
3219   %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)
3220   %res2 = fadd <8 x double> %res, %res1
3221   ret <8 x double> %res2
3222 }
3223
3224 declare <16 x float> @llvm.x86.avx512.mask.scalef.ps.512(<16 x float>, <16 x float>, <16 x float>, i16, i32)
3225 ; CHECK-LABEL: @test_int_x86_avx512_mask_scalef_ps_512
3226 ; CHECK-NOT: call 
3227 ; CHECK: kmov 
3228 ; CHECK: vscalefps{{.*}}{%k1} 
3229 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) {
3230   %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)
3231   %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)
3232   %res2 = fadd <16 x float> %res, %res1
3233   ret <16 x float> %res2
3234 }
3235
3236 declare <8 x double> @llvm.x86.avx512.mask.unpckh.pd.512(<8 x double>, <8 x double>, <8 x double>, i8)
3237
3238 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) {
3239 ; CHECK-LABEL: test_int_x86_avx512_mask_unpckh_pd_512:
3240 ; CHECK:       ## BB#0:
3241 ; CHECK-NEXT:    movzbl %dil, %eax
3242 ; CHECK-NEXT:    kmovw %eax, %k1
3243 ; CHECK-NEXT:    vunpckhpd %zmm1, %zmm0, %zmm2 {%k1}
3244 ; CHECK-NEXT:    vunpckhpd %zmm1, %zmm0, %zmm0
3245   %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)
3246   %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)
3247   %res2 = fadd <8 x double> %res, %res1
3248   ret <8 x double> %res2
3249 }
3250
3251 declare <16 x float> @llvm.x86.avx512.mask.unpckh.ps.512(<16 x float>, <16 x float>, <16 x float>, i16)
3252
3253 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) {
3254 ; CHECK-LABEL: test_int_x86_avx512_mask_unpckh_ps_512:
3255 ; CHECK:       ## BB#0:
3256 ; CHECK-NEXT:    kmovw %edi, %k1
3257 ; CHECK-NEXT:    vunpckhps %zmm1, %zmm0, %zmm2 {%k1}
3258 ; CHECK-NEXT:    vunpckhps %zmm1, %zmm0, %zmm0
3259   %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)
3260   %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)
3261   %res2 = fadd <16 x float> %res, %res1
3262   ret <16 x float> %res2
3263 }
3264
3265 declare <8 x double> @llvm.x86.avx512.mask.unpckl.pd.512(<8 x double>, <8 x double>, <8 x double>, i8)
3266
3267 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) {
3268 ; CHECK-LABEL: test_int_x86_avx512_mask_unpckl_pd_512:
3269 ; CHECK:       ## BB#0:
3270 ; CHECK-NEXT:    movzbl %dil, %eax
3271 ; CHECK-NEXT:    kmovw %eax, %k1
3272 ; CHECK-NEXT:    vunpcklpd %zmm1, %zmm0, %zmm2 {%k1}
3273 ; CHECK-NEXT:    vunpcklpd %zmm1, %zmm0, %zmm0
3274   %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)
3275   %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)
3276   %res2 = fadd <8 x double> %res, %res1
3277   ret <8 x double> %res2
3278 }
3279
3280 declare <16 x float> @llvm.x86.avx512.mask.unpckl.ps.512(<16 x float>, <16 x float>, <16 x float>, i16)
3281
3282 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) {
3283 ; CHECK-LABEL: test_int_x86_avx512_mask_unpckl_ps_512:
3284 ; CHECK:       ## BB#0:
3285 ; CHECK-NEXT:    kmovw %edi, %k1
3286 ; CHECK-NEXT:    vunpcklps %zmm1, %zmm0, %zmm2 {%k1}
3287 ; CHECK-NEXT:    vunpcklps %zmm1, %zmm0, %zmm0
3288   %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)
3289   %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)
3290   %res2 = fadd <16 x float> %res, %res1
3291   ret <16 x float> %res2
3292 }
3293
3294 declare <8 x i64> @llvm.x86.avx512.mask.punpcklqd.q.512(<8 x i64>, <8 x i64>, <8 x i64>, i8)
3295
3296 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) {
3297 ; CHECK-LABEL: test_int_x86_avx512_mask_punpcklqd_q_512:
3298 ; CHECK:       ## BB#0:
3299 ; CHECK-NEXT:    movzbl %dil, %eax
3300 ; CHECK-NEXT:    kmovw %eax, %k1
3301 ; CHECK-NEXT:    vpunpcklqdq %zmm1, %zmm0, %zmm2 {%k1}
3302 ; CHECK-NEXT:    vpunpcklqdq %zmm1, %zmm0, %zmm3 {%k1} {z}
3303 ; CHECK-NEXT:    vpunpcklqdq {{.*#+}} 
3304 ; CHECK:         vpaddq %zmm0, %zmm2, %zmm0
3305 ; CHECK-NEXT:    vpaddq %zmm0, %zmm3, %zmm0
3306 ; CHECK-NEXT:    retq
3307   %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)
3308   %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)
3309   %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)
3310   %res3 = add <8 x i64> %res, %res1
3311   %res4 = add <8 x i64> %res2, %res3
3312   ret <8 x i64> %res4
3313 }
3314
3315 declare <8 x i64> @llvm.x86.avx512.mask.punpckhqd.q.512(<8 x i64>, <8 x i64>, <8 x i64>, i8)
3316
3317 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) {
3318 ; CHECK-LABEL: test_int_x86_avx512_mask_punpckhqd_q_512:
3319 ; CHECK:       ## BB#0:
3320 ; CHECK-NEXT:    movzbl %dil, %eax
3321 ; CHECK-NEXT:    kmovw %eax, %k1
3322 ; CHECK-NEXT:    vpunpckhqdq %zmm1, %zmm0, %zmm2 {%k1}
3323 ; CHECK-NEXT:    vpunpckhqdq {{.*#+}}
3324 ; CHECK:         vpaddq %zmm0, %zmm2, %zmm0
3325 ; CHECK-NEXT:    retq
3326   %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)
3327   %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)
3328   %res2 = add <8 x i64> %res, %res1
3329   ret <8 x i64> %res2
3330 }
3331
3332 declare <16 x i32> @llvm.x86.avx512.mask.punpckhd.q.512(<16 x i32>, <16 x i32>, <16 x i32>, i16)
3333
3334 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) {
3335 ; CHECK-LABEL: test_int_x86_avx512_mask_punpckhd_q_512:
3336 ; CHECK:       ## BB#0:
3337 ; CHECK-NEXT:    kmovw %edi, %k1
3338 ; CHECK-NEXT:    vpunpckhdq %zmm1, %zmm0, %zmm2 {%k1}
3339 ; CHECK-NEXT:    vpunpckhdq {{.*#+}}
3340 ; CHECK:         vpaddd %zmm0, %zmm2, %zmm0
3341 ; CHECK-NEXT:    retq
3342   %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)
3343   %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)
3344   %res2 = add <16 x i32> %res, %res1
3345   ret <16 x i32> %res2
3346 }
3347
3348 declare <16 x i32> @llvm.x86.avx512.mask.punpckld.q.512(<16 x i32>, <16 x i32>, <16 x i32>, i16)
3349
3350 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) {
3351 ; CHECK-LABEL: test_int_x86_avx512_mask_punpckld_q_512:
3352 ; CHECK:       ## BB#0:
3353 ; CHECK-NEXT:    kmovw %edi, %k1
3354 ; CHECK-NEXT:    vpunpckldq %zmm1, %zmm0, %zmm2 {%k1}
3355 ; CHECK-NEXT:    vpunpckldq {{.*#+}} 
3356 ; CHECK:         vpaddd %zmm0, %zmm2, %zmm0
3357 ; CHECK-NEXT:    retq
3358   %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)
3359   %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)
3360   %res2 = add <16 x i32> %res, %res1
3361   ret <16 x i32> %res2
3362 }
3363
3364 declare <16 x i8> @llvm.x86.avx512.mask.pmov.qb.512(<8 x i64>, <16 x i8>, i8)
3365
3366 define <16 x i8>@test_int_x86_avx512_mask_pmov_qb_512(<8 x i64> %x0, <16 x i8> %x1, i8 %x2) {
3367 ; CHECK-LABEL: test_int_x86_avx512_mask_pmov_qb_512:
3368 ; CHECK:       vpmovqb %zmm0, %xmm1 {%k1}
3369 ; CHECK-NEXT:  vpmovqb %zmm0, %xmm2 {%k1} {z}
3370 ; CHECK-NEXT:  vpmovqb %zmm0, %xmm0
3371     %res0 = call <16 x i8> @llvm.x86.avx512.mask.pmov.qb.512(<8 x i64> %x0, <16 x i8> %x1, i8 -1)
3372     %res1 = call <16 x i8> @llvm.x86.avx512.mask.pmov.qb.512(<8 x i64> %x0, <16 x i8> %x1, i8 %x2)
3373     %res2 = call <16 x i8> @llvm.x86.avx512.mask.pmov.qb.512(<8 x i64> %x0, <16 x i8> zeroinitializer, i8 %x2)
3374     %res3 = add <16 x i8> %res0, %res1
3375     %res4 = add <16 x i8> %res3, %res2
3376     ret <16 x i8> %res4
3377 }
3378
3379 declare void @llvm.x86.avx512.mask.pmov.qb.mem.512(i8* %ptr, <8 x i64>, i8)
3380
3381 define void @test_int_x86_avx512_mask_pmov_qb_mem_512(i8* %ptr, <8 x i64> %x1, i8 %x2) {
3382 ; CHECK-LABEL: test_int_x86_avx512_mask_pmov_qb_mem_512:
3383 ; CHECK:  vpmovqb %zmm0, (%rdi)
3384 ; CHECK:  vpmovqb %zmm0, (%rdi) {%k1}
3385     call void @llvm.x86.avx512.mask.pmov.qb.mem.512(i8* %ptr, <8 x i64> %x1, i8 -1)
3386     call void @llvm.x86.avx512.mask.pmov.qb.mem.512(i8* %ptr, <8 x i64> %x1, i8 %x2)
3387     ret void
3388 }
3389
3390 declare <16 x i8> @llvm.x86.avx512.mask.pmovs.qb.512(<8 x i64>, <16 x i8>, i8)
3391
3392 define <16 x i8>@test_int_x86_avx512_mask_pmovs_qb_512(<8 x i64> %x0, <16 x i8> %x1, i8 %x2) {
3393 ; CHECK-LABEL: test_int_x86_avx512_mask_pmovs_qb_512:
3394 ; CHECK:       vpmovsqb %zmm0, %xmm1 {%k1}
3395 ; CHECK-NEXT:  vpmovsqb %zmm0, %xmm2 {%k1} {z}
3396 ; CHECK-NEXT:  vpmovsqb %zmm0, %xmm0
3397     %res0 = call <16 x i8> @llvm.x86.avx512.mask.pmovs.qb.512(<8 x i64> %x0, <16 x i8> %x1, i8 -1)
3398     %res1 = call <16 x i8> @llvm.x86.avx512.mask.pmovs.qb.512(<8 x i64> %x0, <16 x i8> %x1, i8 %x2)
3399     %res2 = call <16 x i8> @llvm.x86.avx512.mask.pmovs.qb.512(<8 x i64> %x0, <16 x i8> zeroinitializer, i8 %x2)
3400     %res3 = add <16 x i8> %res0, %res1
3401     %res4 = add <16 x i8> %res3, %res2
3402     ret <16 x i8> %res4
3403 }
3404
3405 declare void @llvm.x86.avx512.mask.pmovs.qb.mem.512(i8* %ptr, <8 x i64>, i8)
3406
3407 define void @test_int_x86_avx512_mask_pmovs_qb_mem_512(i8* %ptr, <8 x i64> %x1, i8 %x2) {
3408 ; CHECK-LABEL: test_int_x86_avx512_mask_pmovs_qb_mem_512:
3409 ; CHECK:  vpmovsqb %zmm0, (%rdi)
3410 ; CHECK:  vpmovsqb %zmm0, (%rdi) {%k1}
3411     call void @llvm.x86.avx512.mask.pmovs.qb.mem.512(i8* %ptr, <8 x i64> %x1, i8 -1)
3412     call void @llvm.x86.avx512.mask.pmovs.qb.mem.512(i8* %ptr, <8 x i64> %x1, i8 %x2)
3413     ret void
3414 }
3415
3416 declare <16 x i8> @llvm.x86.avx512.mask.pmovus.qb.512(<8 x i64>, <16 x i8>, i8)
3417
3418 define <16 x i8>@test_int_x86_avx512_mask_pmovus_qb_512(<8 x i64> %x0, <16 x i8> %x1, i8 %x2) {
3419 ; CHECK-LABEL: test_int_x86_avx512_mask_pmovus_qb_512:
3420 ; CHECK:       vpmovusqb %zmm0, %xmm1 {%k1}
3421 ; CHECK-NEXT:  vpmovusqb %zmm0, %xmm2 {%k1} {z}
3422 ; CHECK-NEXT:  vpmovusqb %zmm0, %xmm0
3423     %res0 = call <16 x i8> @llvm.x86.avx512.mask.pmovus.qb.512(<8 x i64> %x0, <16 x i8> %x1, i8 -1)
3424     %res1 = call <16 x i8> @llvm.x86.avx512.mask.pmovus.qb.512(<8 x i64> %x0, <16 x i8> %x1, i8 %x2)
3425     %res2 = call <16 x i8> @llvm.x86.avx512.mask.pmovus.qb.512(<8 x i64> %x0, <16 x i8> zeroinitializer, i8 %x2)
3426     %res3 = add <16 x i8> %res0, %res1
3427     %res4 = add <16 x i8> %res3, %res2
3428     ret <16 x i8> %res4
3429 }
3430
3431 declare void @llvm.x86.avx512.mask.pmovus.qb.mem.512(i8* %ptr, <8 x i64>, i8)
3432
3433 define void @test_int_x86_avx512_mask_pmovus_qb_mem_512(i8* %ptr, <8 x i64> %x1, i8 %x2) {
3434 ; CHECK-LABEL: test_int_x86_avx512_mask_pmovus_qb_mem_512:
3435 ; CHECK:  vpmovusqb %zmm0, (%rdi)
3436 ; CHECK:  vpmovusqb %zmm0, (%rdi) {%k1}
3437     call void @llvm.x86.avx512.mask.pmovus.qb.mem.512(i8* %ptr, <8 x i64> %x1, i8 -1)
3438     call void @llvm.x86.avx512.mask.pmovus.qb.mem.512(i8* %ptr, <8 x i64> %x1, i8 %x2)
3439     ret void
3440 }
3441
3442 declare <8 x i16> @llvm.x86.avx512.mask.pmov.qw.512(<8 x i64>, <8 x i16>, i8)
3443
3444 define <8 x i16>@test_int_x86_avx512_mask_pmov_qw_512(<8 x i64> %x0, <8 x i16> %x1, i8 %x2) {
3445 ; CHECK-LABEL: test_int_x86_avx512_mask_pmov_qw_512:
3446 ; CHECK:       vpmovqw %zmm0, %xmm1 {%k1}
3447 ; CHECK-NEXT:  vpmovqw %zmm0, %xmm2 {%k1} {z}
3448 ; CHECK-NEXT:  vpmovqw %zmm0, %xmm0
3449     %res0 = call <8 x i16> @llvm.x86.avx512.mask.pmov.qw.512(<8 x i64> %x0, <8 x i16> %x1, i8 -1)
3450     %res1 = call <8 x i16> @llvm.x86.avx512.mask.pmov.qw.512(<8 x i64> %x0, <8 x i16> %x1, i8 %x2)
3451     %res2 = call <8 x i16> @llvm.x86.avx512.mask.pmov.qw.512(<8 x i64> %x0, <8 x i16> zeroinitializer, i8 %x2)
3452     %res3 = add <8 x i16> %res0, %res1
3453     %res4 = add <8 x i16> %res3, %res2
3454     ret <8 x i16> %res4
3455 }
3456
3457 declare void @llvm.x86.avx512.mask.pmov.qw.mem.512(i8* %ptr, <8 x i64>, i8)
3458
3459 define void @test_int_x86_avx512_mask_pmov_qw_mem_512(i8* %ptr, <8 x i64> %x1, i8 %x2) {
3460 ; CHECK-LABEL: test_int_x86_avx512_mask_pmov_qw_mem_512:
3461 ; CHECK:  vpmovqw %zmm0, (%rdi)
3462 ; CHECK:  vpmovqw %zmm0, (%rdi) {%k1}
3463     call void @llvm.x86.avx512.mask.pmov.qw.mem.512(i8* %ptr, <8 x i64> %x1, i8 -1)
3464     call void @llvm.x86.avx512.mask.pmov.qw.mem.512(i8* %ptr, <8 x i64> %x1, i8 %x2)
3465     ret void
3466 }
3467
3468 declare <8 x i16> @llvm.x86.avx512.mask.pmovs.qw.512(<8 x i64>, <8 x i16>, i8)
3469
3470 define <8 x i16>@test_int_x86_avx512_mask_pmovs_qw_512(<8 x i64> %x0, <8 x i16> %x1, i8 %x2) {
3471 ; CHECK-LABEL: test_int_x86_avx512_mask_pmovs_qw_512:
3472 ; CHECK:       vpmovsqw %zmm0, %xmm1 {%k1}
3473 ; CHECK-NEXT:  vpmovsqw %zmm0, %xmm2 {%k1} {z}
3474 ; CHECK-NEXT:  vpmovsqw %zmm0, %xmm0
3475     %res0 = call <8 x i16> @llvm.x86.avx512.mask.pmovs.qw.512(<8 x i64> %x0, <8 x i16> %x1, i8 -1)
3476     %res1 = call <8 x i16> @llvm.x86.avx512.mask.pmovs.qw.512(<8 x i64> %x0, <8 x i16> %x1, i8 %x2)
3477     %res2 = call <8 x i16> @llvm.x86.avx512.mask.pmovs.qw.512(<8 x i64> %x0, <8 x i16> zeroinitializer, i8 %x2)
3478     %res3 = add <8 x i16> %res0, %res1
3479     %res4 = add <8 x i16> %res3, %res2
3480     ret <8 x i16> %res4
3481 }
3482
3483 declare void @llvm.x86.avx512.mask.pmovs.qw.mem.512(i8* %ptr, <8 x i64>, i8)
3484
3485 define void @test_int_x86_avx512_mask_pmovs_qw_mem_512(i8* %ptr, <8 x i64> %x1, i8 %x2) {
3486 ; CHECK-LABEL: test_int_x86_avx512_mask_pmovs_qw_mem_512:
3487 ; CHECK:  vpmovsqw %zmm0, (%rdi)
3488 ; CHECK:  vpmovsqw %zmm0, (%rdi) {%k1}
3489     call void @llvm.x86.avx512.mask.pmovs.qw.mem.512(i8* %ptr, <8 x i64> %x1, i8 -1)
3490     call void @llvm.x86.avx512.mask.pmovs.qw.mem.512(i8* %ptr, <8 x i64> %x1, i8 %x2)
3491     ret void
3492 }
3493
3494 declare <8 x i16> @llvm.x86.avx512.mask.pmovus.qw.512(<8 x i64>, <8 x i16>, i8)
3495
3496 define <8 x i16>@test_int_x86_avx512_mask_pmovus_qw_512(<8 x i64> %x0, <8 x i16> %x1, i8 %x2) {
3497 ; CHECK-LABEL: test_int_x86_avx512_mask_pmovus_qw_512:
3498 ; CHECK:       vpmovusqw %zmm0, %xmm1 {%k1}
3499 ; CHECK-NEXT:  vpmovusqw %zmm0, %xmm2 {%k1} {z}
3500 ; CHECK-NEXT:  vpmovusqw %zmm0, %xmm0
3501     %res0 = call <8 x i16> @llvm.x86.avx512.mask.pmovus.qw.512(<8 x i64> %x0, <8 x i16> %x1, i8 -1)
3502     %res1 = call <8 x i16> @llvm.x86.avx512.mask.pmovus.qw.512(<8 x i64> %x0, <8 x i16> %x1, i8 %x2)
3503     %res2 = call <8 x i16> @llvm.x86.avx512.mask.pmovus.qw.512(<8 x i64> %x0, <8 x i16> zeroinitializer, i8 %x2)
3504     %res3 = add <8 x i16> %res0, %res1
3505     %res4 = add <8 x i16> %res3, %res2
3506     ret <8 x i16> %res4
3507 }
3508
3509 declare void @llvm.x86.avx512.mask.pmovus.qw.mem.512(i8* %ptr, <8 x i64>, i8)
3510
3511 define void @test_int_x86_avx512_mask_pmovus_qw_mem_512(i8* %ptr, <8 x i64> %x1, i8 %x2) {
3512 ; CHECK-LABEL: test_int_x86_avx512_mask_pmovus_qw_mem_512:
3513 ; CHECK:  vpmovusqw %zmm0, (%rdi)
3514 ; CHECK:  vpmovusqw %zmm0, (%rdi) {%k1}
3515     call void @llvm.x86.avx512.mask.pmovus.qw.mem.512(i8* %ptr, <8 x i64> %x1, i8 -1)
3516     call void @llvm.x86.avx512.mask.pmovus.qw.mem.512(i8* %ptr, <8 x i64> %x1, i8 %x2)
3517     ret void
3518 }
3519
3520 declare <8 x i32> @llvm.x86.avx512.mask.pmov.qd.512(<8 x i64>, <8 x i32>, i8)
3521
3522 define <8 x i32>@test_int_x86_avx512_mask_pmov_qd_512(<8 x i64> %x0, <8 x i32> %x1, i8 %x2) {
3523 ; CHECK-LABEL: test_int_x86_avx512_mask_pmov_qd_512:
3524 ; CHECK:       vpmovqd %zmm0, %ymm1 {%k1}
3525 ; CHECK-NEXT:  vpmovqd %zmm0, %ymm2 {%k1} {z}
3526 ; CHECK-NEXT:  vpmovqd %zmm0, %ymm0
3527     %res0 = call <8 x i32> @llvm.x86.avx512.mask.pmov.qd.512(<8 x i64> %x0, <8 x i32> %x1, i8 -1)
3528     %res1 = call <8 x i32> @llvm.x86.avx512.mask.pmov.qd.512(<8 x i64> %x0, <8 x i32> %x1, i8 %x2)
3529     %res2 = call <8 x i32> @llvm.x86.avx512.mask.pmov.qd.512(<8 x i64> %x0, <8 x i32> zeroinitializer, i8 %x2)
3530     %res3 = add <8 x i32> %res0, %res1
3531     %res4 = add <8 x i32> %res3, %res2
3532     ret <8 x i32> %res4
3533 }
3534
3535 declare void @llvm.x86.avx512.mask.pmov.qd.mem.512(i8* %ptr, <8 x i64>, i8)
3536
3537 define void @test_int_x86_avx512_mask_pmov_qd_mem_512(i8* %ptr, <8 x i64> %x1, i8 %x2) {
3538 ; CHECK-LABEL: test_int_x86_avx512_mask_pmov_qd_mem_512:
3539 ; CHECK:  vpmovqd %zmm0, (%rdi)
3540 ; CHECK:  vpmovqd %zmm0, (%rdi) {%k1}
3541     call void @llvm.x86.avx512.mask.pmov.qd.mem.512(i8* %ptr, <8 x i64> %x1, i8 -1)
3542     call void @llvm.x86.avx512.mask.pmov.qd.mem.512(i8* %ptr, <8 x i64> %x1, i8 %x2)
3543     ret void
3544 }
3545
3546 declare <8 x i32> @llvm.x86.avx512.mask.pmovs.qd.512(<8 x i64>, <8 x i32>, i8)
3547
3548 define <8 x i32>@test_int_x86_avx512_mask_pmovs_qd_512(<8 x i64> %x0, <8 x i32> %x1, i8 %x2) {
3549 ; CHECK-LABEL: test_int_x86_avx512_mask_pmovs_qd_512:
3550 ; CHECK:       vpmovsqd %zmm0, %ymm1 {%k1}
3551 ; CHECK-NEXT:  vpmovsqd %zmm0, %ymm2 {%k1} {z}
3552 ; CHECK-NEXT:  vpmovsqd %zmm0, %ymm0
3553     %res0 = call <8 x i32> @llvm.x86.avx512.mask.pmovs.qd.512(<8 x i64> %x0, <8 x i32> %x1, i8 -1)
3554     %res1 = call <8 x i32> @llvm.x86.avx512.mask.pmovs.qd.512(<8 x i64> %x0, <8 x i32> %x1, i8 %x2)
3555     %res2 = call <8 x i32> @llvm.x86.avx512.mask.pmovs.qd.512(<8 x i64> %x0, <8 x i32> zeroinitializer, i8 %x2)
3556     %res3 = add <8 x i32> %res0, %res1
3557     %res4 = add <8 x i32> %res3, %res2
3558     ret <8 x i32> %res4
3559 }
3560
3561 declare void @llvm.x86.avx512.mask.pmovs.qd.mem.512(i8* %ptr, <8 x i64>, i8)
3562
3563 define void @test_int_x86_avx512_mask_pmovs_qd_mem_512(i8* %ptr, <8 x i64> %x1, i8 %x2) {
3564 ; CHECK-LABEL: test_int_x86_avx512_mask_pmovs_qd_mem_512:
3565 ; CHECK:  vpmovsqd %zmm0, (%rdi)
3566 ; CHECK:  vpmovsqd %zmm0, (%rdi) {%k1}
3567     call void @llvm.x86.avx512.mask.pmovs.qd.mem.512(i8* %ptr, <8 x i64> %x1, i8 -1)
3568     call void @llvm.x86.avx512.mask.pmovs.qd.mem.512(i8* %ptr, <8 x i64> %x1, i8 %x2)
3569     ret void
3570 }
3571
3572 declare <8 x i32> @llvm.x86.avx512.mask.pmovus.qd.512(<8 x i64>, <8 x i32>, i8)
3573
3574 define <8 x i32>@test_int_x86_avx512_mask_pmovus_qd_512(<8 x i64> %x0, <8 x i32> %x1, i8 %x2) {
3575 ; CHECK-LABEL: test_int_x86_avx512_mask_pmovus_qd_512:
3576 ; CHECK:       vpmovusqd %zmm0, %ymm1 {%k1}
3577 ; CHECK-NEXT:  vpmovusqd %zmm0, %ymm2 {%k1} {z}
3578 ; CHECK-NEXT:  vpmovusqd %zmm0, %ymm0
3579     %res0 = call <8 x i32> @llvm.x86.avx512.mask.pmovus.qd.512(<8 x i64> %x0, <8 x i32> %x1, i8 -1)
3580     %res1 = call <8 x i32> @llvm.x86.avx512.mask.pmovus.qd.512(<8 x i64> %x0, <8 x i32> %x1, i8 %x2)
3581     %res2 = call <8 x i32> @llvm.x86.avx512.mask.pmovus.qd.512(<8 x i64> %x0, <8 x i32> zeroinitializer, i8 %x2)
3582     %res3 = add <8 x i32> %res0, %res1
3583     %res4 = add <8 x i32> %res3, %res2
3584     ret <8 x i32> %res4
3585 }
3586
3587 declare void @llvm.x86.avx512.mask.pmovus.qd.mem.512(i8* %ptr, <8 x i64>, i8)
3588
3589 define void @test_int_x86_avx512_mask_pmovus_qd_mem_512(i8* %ptr, <8 x i64> %x1, i8 %x2) {
3590 ; CHECK-LABEL: test_int_x86_avx512_mask_pmovus_qd_mem_512:
3591 ; CHECK:  vpmovusqd %zmm0, (%rdi)
3592 ; CHECK:  vpmovusqd %zmm0, (%rdi) {%k1}
3593     call void @llvm.x86.avx512.mask.pmovus.qd.mem.512(i8* %ptr, <8 x i64> %x1, i8 -1)
3594     call void @llvm.x86.avx512.mask.pmovus.qd.mem.512(i8* %ptr, <8 x i64> %x1, i8 %x2)
3595     ret void
3596 }
3597
3598 declare <16 x i8> @llvm.x86.avx512.mask.pmov.db.512(<16 x i32>, <16 x i8>, i16)
3599
3600 define <16 x i8>@test_int_x86_avx512_mask_pmov_db_512(<16 x i32> %x0, <16 x i8> %x1, i16 %x2) {
3601 ; CHECK-LABEL: test_int_x86_avx512_mask_pmov_db_512:
3602 ; CHECK:       vpmovdb %zmm0, %xmm1 {%k1}
3603 ; CHECK-NEXT:  vpmovdb %zmm0, %xmm2 {%k1} {z}
3604 ; CHECK-NEXT:  vpmovdb %zmm0, %xmm0
3605     %res0 = call <16 x i8> @llvm.x86.avx512.mask.pmov.db.512(<16 x i32> %x0, <16 x i8> %x1, i16 -1)
3606     %res1 = call <16 x i8> @llvm.x86.avx512.mask.pmov.db.512(<16 x i32> %x0, <16 x i8> %x1, i16 %x2)
3607     %res2 = call <16 x i8> @llvm.x86.avx512.mask.pmov.db.512(<16 x i32> %x0, <16 x i8> zeroinitializer, i16 %x2)
3608     %res3 = add <16 x i8> %res0, %res1
3609     %res4 = add <16 x i8> %res3, %res2
3610     ret <16 x i8> %res4
3611 }
3612
3613 declare void @llvm.x86.avx512.mask.pmov.db.mem.512(i8* %ptr, <16 x i32>, i16)
3614
3615 define void @test_int_x86_avx512_mask_pmov_db_mem_512(i8* %ptr, <16 x i32> %x1, i16 %x2) {
3616 ; CHECK-LABEL: test_int_x86_avx512_mask_pmov_db_mem_512:
3617 ; CHECK:  vpmovdb %zmm0, (%rdi)
3618 ; CHECK:  vpmovdb %zmm0, (%rdi) {%k1}
3619     call void @llvm.x86.avx512.mask.pmov.db.mem.512(i8* %ptr, <16 x i32> %x1, i16 -1)
3620     call void @llvm.x86.avx512.mask.pmov.db.mem.512(i8* %ptr, <16 x i32> %x1, i16 %x2)
3621     ret void
3622 }
3623
3624 declare <16 x i8> @llvm.x86.avx512.mask.pmovs.db.512(<16 x i32>, <16 x i8>, i16)
3625
3626 define <16 x i8>@test_int_x86_avx512_mask_pmovs_db_512(<16 x i32> %x0, <16 x i8> %x1, i16 %x2) {
3627 ; CHECK-LABEL: test_int_x86_avx512_mask_pmovs_db_512:
3628 ; CHECK:       vpmovsdb %zmm0, %xmm1 {%k1}
3629 ; CHECK-NEXT:  vpmovsdb %zmm0, %xmm2 {%k1} {z}
3630 ; CHECK-NEXT:  vpmovsdb %zmm0, %xmm0
3631     %res0 = call <16 x i8> @llvm.x86.avx512.mask.pmovs.db.512(<16 x i32> %x0, <16 x i8> %x1, i16 -1)
3632     %res1 = call <16 x i8> @llvm.x86.avx512.mask.pmovs.db.512(<16 x i32> %x0, <16 x i8> %x1, i16 %x2)
3633     %res2 = call <16 x i8> @llvm.x86.avx512.mask.pmovs.db.512(<16 x i32> %x0, <16 x i8> zeroinitializer, i16 %x2)
3634     %res3 = add <16 x i8> %res0, %res1
3635     %res4 = add <16 x i8> %res3, %res2
3636     ret <16 x i8> %res4
3637 }
3638
3639 declare void @llvm.x86.avx512.mask.pmovs.db.mem.512(i8* %ptr, <16 x i32>, i16)
3640
3641 define void @test_int_x86_avx512_mask_pmovs_db_mem_512(i8* %ptr, <16 x i32> %x1, i16 %x2) {
3642 ; CHECK-LABEL: test_int_x86_avx512_mask_pmovs_db_mem_512:
3643 ; CHECK:  vpmovsdb %zmm0, (%rdi)
3644 ; CHECK:  vpmovsdb %zmm0, (%rdi) {%k1}
3645     call void @llvm.x86.avx512.mask.pmovs.db.mem.512(i8* %ptr, <16 x i32> %x1, i16 -1)
3646     call void @llvm.x86.avx512.mask.pmovs.db.mem.512(i8* %ptr, <16 x i32> %x1, i16 %x2)
3647     ret void
3648 }
3649
3650 declare <16 x i8> @llvm.x86.avx512.mask.pmovus.db.512(<16 x i32>, <16 x i8>, i16)
3651
3652 define <16 x i8>@test_int_x86_avx512_mask_pmovus_db_512(<16 x i32> %x0, <16 x i8> %x1, i16 %x2) {
3653 ; CHECK-LABEL: test_int_x86_avx512_mask_pmovus_db_512:
3654 ; CHECK:       vpmovusdb %zmm0, %xmm1 {%k1}
3655 ; CHECK-NEXT:  vpmovusdb %zmm0, %xmm2 {%k1} {z}
3656 ; CHECK-NEXT:  vpmovusdb %zmm0, %xmm0
3657     %res0 = call <16 x i8> @llvm.x86.avx512.mask.pmovus.db.512(<16 x i32> %x0, <16 x i8> %x1, i16 -1)
3658     %res1 = call <16 x i8> @llvm.x86.avx512.mask.pmovus.db.512(<16 x i32> %x0, <16 x i8> %x1, i16 %x2)
3659     %res2 = call <16 x i8> @llvm.x86.avx512.mask.pmovus.db.512(<16 x i32> %x0, <16 x i8> zeroinitializer, i16 %x2)
3660     %res3 = add <16 x i8> %res0, %res1
3661     %res4 = add <16 x i8> %res3, %res2
3662     ret <16 x i8> %res4
3663 }
3664
3665 declare void @llvm.x86.avx512.mask.pmovus.db.mem.512(i8* %ptr, <16 x i32>, i16)
3666
3667 define void @test_int_x86_avx512_mask_pmovus_db_mem_512(i8* %ptr, <16 x i32> %x1, i16 %x2) {
3668 ; CHECK-LABEL: test_int_x86_avx512_mask_pmovus_db_mem_512:
3669 ; CHECK:  vpmovusdb %zmm0, (%rdi)
3670 ; CHECK:  vpmovusdb %zmm0, (%rdi) {%k1}
3671     call void @llvm.x86.avx512.mask.pmovus.db.mem.512(i8* %ptr, <16 x i32> %x1, i16 -1)
3672     call void @llvm.x86.avx512.mask.pmovus.db.mem.512(i8* %ptr, <16 x i32> %x1, i16 %x2)
3673     ret void
3674 }
3675
3676 declare <16 x i16> @llvm.x86.avx512.mask.pmov.dw.512(<16 x i32>, <16 x i16>, i16)
3677
3678 define <16 x i16>@test_int_x86_avx512_mask_pmov_dw_512(<16 x i32> %x0, <16 x i16> %x1, i16 %x2) {
3679 ; CHECK-LABEL: test_int_x86_avx512_mask_pmov_dw_512:
3680 ; CHECK:       vpmovdw %zmm0, %ymm1 {%k1}
3681 ; CHECK-NEXT:  vpmovdw %zmm0, %ymm2 {%k1} {z}
3682 ; CHECK-NEXT:  vpmovdw %zmm0, %ymm0
3683     %res0 = call <16 x i16> @llvm.x86.avx512.mask.pmov.dw.512(<16 x i32> %x0, <16 x i16> %x1, i16 -1)
3684     %res1 = call <16 x i16> @llvm.x86.avx512.mask.pmov.dw.512(<16 x i32> %x0, <16 x i16> %x1, i16 %x2)
3685     %res2 = call <16 x i16> @llvm.x86.avx512.mask.pmov.dw.512(<16 x i32> %x0, <16 x i16> zeroinitializer, i16 %x2)
3686     %res3 = add <16 x i16> %res0, %res1
3687     %res4 = add <16 x i16> %res3, %res2
3688     ret <16 x i16> %res4
3689 }
3690
3691 declare void @llvm.x86.avx512.mask.pmov.dw.mem.512(i8* %ptr, <16 x i32>, i16)
3692
3693 define void @test_int_x86_avx512_mask_pmov_dw_mem_512(i8* %ptr, <16 x i32> %x1, i16 %x2) {
3694 ; CHECK-LABEL: test_int_x86_avx512_mask_pmov_dw_mem_512:
3695 ; CHECK:  vpmovdw %zmm0, (%rdi)
3696 ; CHECK:  vpmovdw %zmm0, (%rdi) {%k1}
3697     call void @llvm.x86.avx512.mask.pmov.dw.mem.512(i8* %ptr, <16 x i32> %x1, i16 -1)
3698     call void @llvm.x86.avx512.mask.pmov.dw.mem.512(i8* %ptr, <16 x i32> %x1, i16 %x2)
3699     ret void
3700 }
3701
3702 declare <16 x i16> @llvm.x86.avx512.mask.pmovs.dw.512(<16 x i32>, <16 x i16>, i16)
3703
3704 define <16 x i16>@test_int_x86_avx512_mask_pmovs_dw_512(<16 x i32> %x0, <16 x i16> %x1, i16 %x2) {
3705 ; CHECK-LABEL: test_int_x86_avx512_mask_pmovs_dw_512:
3706 ; CHECK:       vpmovsdw %zmm0, %ymm1 {%k1}
3707 ; CHECK-NEXT:  vpmovsdw %zmm0, %ymm2 {%k1} {z}
3708 ; CHECK-NEXT:  vpmovsdw %zmm0, %ymm0
3709     %res0 = call <16 x i16> @llvm.x86.avx512.mask.pmovs.dw.512(<16 x i32> %x0, <16 x i16> %x1, i16 -1)
3710     %res1 = call <16 x i16> @llvm.x86.avx512.mask.pmovs.dw.512(<16 x i32> %x0, <16 x i16> %x1, i16 %x2)
3711     %res2 = call <16 x i16> @llvm.x86.avx512.mask.pmovs.dw.512(<16 x i32> %x0, <16 x i16> zeroinitializer, i16 %x2)
3712     %res3 = add <16 x i16> %res0, %res1
3713     %res4 = add <16 x i16> %res3, %res2
3714     ret <16 x i16> %res4
3715 }
3716
3717 declare void @llvm.x86.avx512.mask.pmovs.dw.mem.512(i8* %ptr, <16 x i32>, i16)
3718
3719 define void @test_int_x86_avx512_mask_pmovs_dw_mem_512(i8* %ptr, <16 x i32> %x1, i16 %x2) {
3720 ; CHECK-LABEL: test_int_x86_avx512_mask_pmovs_dw_mem_512:
3721 ; CHECK:  vpmovsdw %zmm0, (%rdi)
3722 ; CHECK:  vpmovsdw %zmm0, (%rdi) {%k1}
3723     call void @llvm.x86.avx512.mask.pmovs.dw.mem.512(i8* %ptr, <16 x i32> %x1, i16 -1)
3724     call void @llvm.x86.avx512.mask.pmovs.dw.mem.512(i8* %ptr, <16 x i32> %x1, i16 %x2)
3725     ret void
3726 }
3727
3728 declare <16 x i16> @llvm.x86.avx512.mask.pmovus.dw.512(<16 x i32>, <16 x i16>, i16)
3729
3730 define <16 x i16>@test_int_x86_avx512_mask_pmovus_dw_512(<16 x i32> %x0, <16 x i16> %x1, i16 %x2) {
3731 ; CHECK-LABEL: test_int_x86_avx512_mask_pmovus_dw_512:
3732 ; CHECK:       vpmovusdw %zmm0, %ymm1 {%k1}
3733 ; CHECK-NEXT:  vpmovusdw %zmm0, %ymm2 {%k1} {z}
3734 ; CHECK-NEXT:  vpmovusdw %zmm0, %ymm0
3735     %res0 = call <16 x i16> @llvm.x86.avx512.mask.pmovus.dw.512(<16 x i32> %x0, <16 x i16> %x1, i16 -1)
3736     %res1 = call <16 x i16> @llvm.x86.avx512.mask.pmovus.dw.512(<16 x i32> %x0, <16 x i16> %x1, i16 %x2)
3737     %res2 = call <16 x i16> @llvm.x86.avx512.mask.pmovus.dw.512(<16 x i32> %x0, <16 x i16> zeroinitializer, i16 %x2)
3738     %res3 = add <16 x i16> %res0, %res1
3739     %res4 = add <16 x i16> %res3, %res2
3740     ret <16 x i16> %res4
3741 }
3742
3743 declare void @llvm.x86.avx512.mask.pmovus.dw.mem.512(i8* %ptr, <16 x i32>, i16)
3744
3745 define void @test_int_x86_avx512_mask_pmovus_dw_mem_512(i8* %ptr, <16 x i32> %x1, i16 %x2) {
3746 ; CHECK-LABEL: test_int_x86_avx512_mask_pmovus_dw_mem_512:
3747 ; CHECK:  vpmovusdw %zmm0, (%rdi)
3748 ; CHECK:  vpmovusdw %zmm0, (%rdi) {%k1}
3749     call void @llvm.x86.avx512.mask.pmovus.dw.mem.512(i8* %ptr, <16 x i32> %x1, i16 -1)
3750     call void @llvm.x86.avx512.mask.pmovus.dw.mem.512(i8* %ptr, <16 x i32> %x1, i16 %x2)
3751     ret void
3752 }
3753
3754 declare <8 x double> @llvm.x86.avx512.mask.cvtdq2pd.512(<8 x i32>, <8 x double>, i8)
3755
3756 define <8 x double>@test_int_x86_avx512_mask_cvt_dq2pd_512(<8 x i32> %x0, <8 x double> %x1, i8 %x2) {
3757 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_dq2pd_512:
3758 ; CHECK:       ## BB#0:
3759 ; CHECK-NEXT:    movzbl %dil, %eax
3760 ; CHECK-NEXT:    kmovw %eax, %k1
3761 ; CHECK-NEXT:    vcvtdq2pd %ymm0, %zmm1 {%k1}
3762 ; CHECK-NEXT:    vcvtdq2pd %ymm0, %zmm0
3763 ; CHECK-NEXT:    vaddpd %zmm0, %zmm1, %zmm0
3764 ; CHECK-NEXT:    retq
3765   %res = call <8 x double> @llvm.x86.avx512.mask.cvtdq2pd.512(<8 x i32> %x0, <8 x double> %x1, i8 %x2)
3766   %res1 = call <8 x double> @llvm.x86.avx512.mask.cvtdq2pd.512(<8 x i32> %x0, <8 x double> %x1, i8 -1)
3767   %res2 = fadd <8 x double> %res, %res1
3768   ret <8 x double> %res2
3769 }
3770
3771 declare <16 x float> @llvm.x86.avx512.mask.cvtdq2ps.512(<16 x i32>, <16 x float>, i16, i32)
3772
3773 define <16 x float>@test_int_x86_avx512_mask_cvt_dq2ps_512(<16 x i32> %x0, <16 x float> %x1, i16 %x2) {
3774 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_dq2ps_512:
3775 ; CHECK:       ## BB#0:
3776 ; CHECK-NEXT:    kmovw %edi, %k1
3777 ; CHECK-NEXT:    vcvtdq2ps %zmm0, %zmm1 {%k1}
3778 ; CHECK-NEXT:    vcvtdq2ps {rn-sae}, %zmm0, %zmm0
3779 ; CHECK-NEXT:    vaddps %zmm0, %zmm1, %zmm0
3780 ; CHECK-NEXT:    retq
3781   %res = call <16 x float> @llvm.x86.avx512.mask.cvtdq2ps.512(<16 x i32> %x0, <16 x float> %x1, i16 %x2, i32 4)
3782   %res1 = call <16 x float> @llvm.x86.avx512.mask.cvtdq2ps.512(<16 x i32> %x0, <16 x float> %x1, i16 -1, i32 0)
3783   %res2 = fadd <16 x float> %res, %res1
3784   ret <16 x float> %res2
3785 }
3786
3787 declare <8 x i32> @llvm.x86.avx512.mask.cvtpd2dq.512(<8 x double>, <8 x i32>, i8, i32)
3788
3789 define <8 x i32>@test_int_x86_avx512_mask_cvt_pd2dq_512(<8 x double> %x0, <8 x i32> %x1, i8 %x2) {
3790 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_pd2dq_512:
3791 ; CHECK:       ## BB#0:
3792 ; CHECK-NEXT:    movzbl %dil, %eax
3793 ; CHECK-NEXT:    kmovw %eax, %k1
3794 ; CHECK-NEXT:    vcvtpd2dq %zmm0, %ymm1 {%k1}
3795 ; CHECK-NEXT:    vcvtpd2dq {rn-sae}, %zmm0, %ymm0
3796 ; CHECK-NEXT:    vpaddd %ymm0, %ymm1, %ymm0
3797 ; CHECK-NEXT:    retq
3798   %res = call <8 x i32> @llvm.x86.avx512.mask.cvtpd2dq.512(<8 x double> %x0, <8 x i32> %x1, i8 %x2, i32 4)
3799   %res1 = call <8 x i32> @llvm.x86.avx512.mask.cvtpd2dq.512(<8 x double> %x0, <8 x i32> %x1, i8 -1, i32 0)
3800   %res2 = add <8 x i32> %res, %res1
3801   ret <8 x i32> %res2
3802 }
3803
3804 declare <8 x float> @llvm.x86.avx512.mask.cvtpd2ps.512(<8 x double>, <8 x float>, i8, i32)
3805
3806 define <8 x float>@test_int_x86_avx512_mask_cvt_pd2ps_512(<8 x double> %x0, <8 x float> %x1, i8 %x2) {
3807 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_pd2ps_512:
3808 ; CHECK:       ## BB#0:
3809 ; CHECK-NEXT:    movzbl %dil, %eax
3810 ; CHECK-NEXT:    kmovw %eax, %k1
3811 ; CHECK-NEXT:    vcvtpd2ps %zmm0, %ymm1 {%k1}
3812 ; CHECK-NEXT:    vcvtpd2ps {ru-sae}, %zmm0, %ymm0
3813 ; CHECK-NEXT:    vaddps %ymm0, %ymm1, %ymm0
3814 ; CHECK-NEXT:    retq
3815   %res = call <8 x float> @llvm.x86.avx512.mask.cvtpd2ps.512(<8 x double> %x0, <8 x float> %x1, i8 %x2, i32 4)
3816   %res1 = call <8 x float> @llvm.x86.avx512.mask.cvtpd2ps.512(<8 x double> %x0, <8 x float> %x1, i8 -1, i32 2)
3817   %res2 = fadd <8 x float> %res, %res1
3818   ret <8 x float> %res2
3819 }
3820
3821 declare <8 x i32> @llvm.x86.avx512.mask.cvtpd2udq.512(<8 x double>, <8 x i32>, i8, i32)
3822
3823 define <8 x i32>@test_int_x86_avx512_mask_cvt_pd2udq_512(<8 x double> %x0, <8 x i32> %x1, i8 %x2) {
3824 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_pd2udq_512:
3825 ; CHECK:       ## BB#0:
3826 ; CHECK-NEXT:    movzbl %dil, %eax
3827 ; CHECK-NEXT:    kmovw %eax, %k1
3828 ; CHECK-NEXT:    vcvtpd2udq {ru-sae}, %zmm0, %ymm1 {%k1}
3829 ; CHECK-NEXT:    vcvtpd2udq {rn-sae}, %zmm0, %ymm0
3830 ; CHECK-NEXT:    vpaddd %ymm0, %ymm1, %ymm0
3831 ; CHECK-NEXT:    retq
3832   %res = call <8 x i32> @llvm.x86.avx512.mask.cvtpd2udq.512(<8 x double> %x0, <8 x i32> %x1, i8 %x2, i32 2)
3833   %res1 = call <8 x i32> @llvm.x86.avx512.mask.cvtpd2udq.512(<8 x double> %x0, <8 x i32> %x1, i8 -1, i32 0)
3834   %res2 = add <8 x i32> %res, %res1
3835   ret <8 x i32> %res2
3836 }
3837
3838 declare <16 x i32> @llvm.x86.avx512.mask.cvtps2dq.512(<16 x float>, <16 x i32>, i16, i32)
3839
3840 define <16 x i32>@test_int_x86_avx512_mask_cvt_ps2dq_512(<16 x float> %x0, <16 x i32> %x1, i16 %x2) {
3841 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_ps2dq_512:
3842 ; CHECK:       ## BB#0:
3843 ; CHECK-NEXT:    kmovw %edi, %k1
3844 ; CHECK-NEXT:    vcvtps2dq {ru-sae}, %zmm0, %zmm1 {%k1}
3845 ; CHECK-NEXT:    vcvtps2dq {rn-sae}, %zmm0, %zmm0
3846 ; CHECK-NEXT:    vpaddd %zmm0, %zmm1, %zmm0
3847 ; CHECK-NEXT:    retq
3848   %res = call <16 x i32> @llvm.x86.avx512.mask.cvtps2dq.512(<16 x float> %x0, <16 x i32> %x1, i16 %x2, i32 2)
3849   %res1 = call <16 x i32> @llvm.x86.avx512.mask.cvtps2dq.512(<16 x float> %x0, <16 x i32> %x1, i16 -1, i32 0)
3850   %res2 = add <16 x i32> %res, %res1
3851   ret <16 x i32> %res2
3852 }
3853
3854 declare <8 x double> @llvm.x86.avx512.mask.cvtps2pd.512(<8 x float>, <8 x double>, i8, i32)
3855
3856 define <8 x double>@test_int_x86_avx512_mask_cvt_ps2pd_512(<8 x float> %x0, <8 x double> %x1, i8 %x2) {
3857 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_ps2pd_512:
3858 ; CHECK:       ## BB#0:
3859 ; CHECK-NEXT:    movzbl %dil, %eax
3860 ; CHECK-NEXT:    kmovw %eax, %k1
3861 ; CHECK-NEXT:    vcvtps2pd %ymm0, %zmm1 {%k1}
3862 ; CHECK-NEXT:    vcvtps2pd {sae}, %ymm0, %zmm0
3863 ; CHECK-NEXT:    vaddpd %zmm0, %zmm1, %zmm0
3864 ; CHECK-NEXT:    retq
3865   %res = call <8 x double> @llvm.x86.avx512.mask.cvtps2pd.512(<8 x float> %x0, <8 x double> %x1, i8 %x2, i32 4)
3866   %res1 = call <8 x double> @llvm.x86.avx512.mask.cvtps2pd.512(<8 x float> %x0, <8 x double> %x1, i8 -1, i32 8)
3867   %res2 = fadd <8 x double> %res, %res1
3868   ret <8 x double> %res2
3869 }
3870
3871 declare <16 x i32> @llvm.x86.avx512.mask.cvtps2udq.512(<16 x float>, <16 x i32>, i16, i32)
3872
3873 define <16 x i32>@test_int_x86_avx512_mask_cvt_ps2udq_512(<16 x float> %x0, <16 x i32> %x1, i16 %x2) {
3874 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_ps2udq_512:
3875 ; CHECK:       ## BB#0:
3876 ; CHECK-NEXT:    kmovw %edi, %k1
3877 ; CHECK-NEXT:    vcvtps2udq {ru-sae}, %zmm0, %zmm1 {%k1}
3878 ; CHECK-NEXT:    vcvtps2udq {rn-sae}, %zmm0, %zmm0
3879 ; CHECK-NEXT:    vpaddd %zmm0, %zmm1, %zmm0
3880 ; CHECK-NEXT:    retq
3881   %res = call <16 x i32> @llvm.x86.avx512.mask.cvtps2udq.512(<16 x float> %x0, <16 x i32> %x1, i16 %x2, i32 2)
3882   %res1 = call <16 x i32> @llvm.x86.avx512.mask.cvtps2udq.512(<16 x float> %x0, <16 x i32> %x1, i16 -1, i32 0)
3883   %res2 = add <16 x i32> %res, %res1
3884   ret <16 x i32> %res2
3885 }
3886
3887 declare <8 x i32> @llvm.x86.avx512.mask.cvttpd2dq.512(<8 x double>, <8 x i32>, i8, i32)
3888
3889 define <8 x i32>@test_int_x86_avx512_mask_cvtt_pd2dq_512(<8 x double> %x0, <8 x i32> %x1, i8 %x2) {
3890 ; CHECK-LABEL: test_int_x86_avx512_mask_cvtt_pd2dq_512:
3891 ; CHECK:       ## BB#0:
3892 ; CHECK-NEXT:    movzbl %dil, %eax
3893 ; CHECK-NEXT:    kmovw %eax, %k1
3894 ; CHECK-NEXT:    vcvttpd2dq %zmm0, %ymm1 {%k1}
3895 ; CHECK-NEXT:    vcvttpd2dq {sae}, %zmm0, %ymm0
3896 ; CHECK-NEXT:    vpaddd %ymm0, %ymm1, %ymm0
3897 ; CHECK-NEXT:    retq
3898   %res = call <8 x i32> @llvm.x86.avx512.mask.cvttpd2dq.512(<8 x double> %x0, <8 x i32> %x1, i8 %x2, i32 4)
3899   %res1 = call <8 x i32> @llvm.x86.avx512.mask.cvttpd2dq.512(<8 x double> %x0, <8 x i32> %x1, i8 -1, i32 8)
3900   %res2 = add <8 x i32> %res, %res1
3901   ret <8 x i32> %res2
3902 }
3903
3904 declare <8 x double> @llvm.x86.avx512.mask.cvtudq2pd.512(<8 x i32>, <8 x double>, i8)
3905
3906 define <8 x double>@test_int_x86_avx512_mask_cvt_udq2pd_512(<8 x i32> %x0, <8 x double> %x1, i8 %x2) {
3907 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_udq2pd_512:
3908 ; CHECK:       ## BB#0:
3909 ; CHECK-NEXT:    movzbl %dil, %eax
3910 ; CHECK-NEXT:    kmovw %eax, %k1
3911 ; CHECK-NEXT:    vcvtudq2pd %ymm0, %zmm1 {%k1}
3912 ; CHECK-NEXT:    vcvtudq2pd %ymm0, %zmm0
3913 ; CHECK-NEXT:    vaddpd %zmm0, %zmm1, %zmm0
3914 ; CHECK-NEXT:    retq
3915   %res = call <8 x double> @llvm.x86.avx512.mask.cvtudq2pd.512(<8 x i32> %x0, <8 x double> %x1, i8 %x2)
3916   %res1 = call <8 x double> @llvm.x86.avx512.mask.cvtudq2pd.512(<8 x i32> %x0, <8 x double> %x1, i8 -1)
3917   %res2 = fadd <8 x double> %res, %res1
3918   ret <8 x double> %res2
3919 }
3920
3921
3922 declare <16 x float> @llvm.x86.avx512.mask.cvtudq2ps.512(<16 x i32>, <16 x float>, i16, i32)
3923
3924 define <16 x float>@test_int_x86_avx512_mask_cvt_udq2ps_512(<16 x i32> %x0, <16 x float> %x1, i16 %x2) {
3925 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_udq2ps_512:
3926 ; CHECK:       ## BB#0:
3927 ; CHECK-NEXT:    kmovw %edi, %k1
3928 ; CHECK-NEXT:    vcvtudq2ps %zmm0, %zmm1 {%k1}
3929 ; CHECK-NEXT:    vcvtudq2ps {rn-sae}, %zmm0, %zmm0
3930 ; CHECK-NEXT:    vaddps %zmm0, %zmm1, %zmm0
3931 ; CHECK-NEXT:    retq
3932   %res = call <16 x float> @llvm.x86.avx512.mask.cvtudq2ps.512(<16 x i32> %x0, <16 x float> %x1, i16 %x2, i32 4)
3933   %res1 = call <16 x float> @llvm.x86.avx512.mask.cvtudq2ps.512(<16 x i32> %x0, <16 x float> %x1, i16 -1, i32 0)
3934   %res2 = fadd <16 x float> %res, %res1
3935   ret <16 x float> %res2
3936 }
3937
3938 declare <8 x i32> @llvm.x86.avx512.mask.cvttpd2udq.512(<8 x double>, <8 x i32>, i8, i32)
3939
3940 define <8 x i32>@test_int_x86_avx512_mask_cvtt_pd2udq_512(<8 x double> %x0, <8 x i32> %x1, i8 %x2) {
3941 ; CHECK-LABEL: test_int_x86_avx512_mask_cvtt_pd2udq_512:
3942 ; CHECK:       ## BB#0:
3943 ; CHECK-NEXT:    movzbl %dil, %eax
3944 ; CHECK-NEXT:    kmovw %eax, %k1
3945 ; CHECK-NEXT:    vcvttpd2udq %zmm0, %ymm1 {%k1}
3946 ; CHECK-NEXT:    vcvttpd2udq {sae}, %zmm0, %ymm0
3947 ; CHECK-NEXT:    vpaddd %ymm0, %ymm1, %ymm0
3948 ; CHECK-NEXT:    retq
3949   %res = call <8 x i32> @llvm.x86.avx512.mask.cvttpd2udq.512(<8 x double> %x0, <8 x i32> %x1, i8 %x2, i32 4)
3950   %res1 = call <8 x i32> @llvm.x86.avx512.mask.cvttpd2udq.512(<8 x double> %x0, <8 x i32> %x1, i8 -1, i32 8)
3951   %res2 = add <8 x i32> %res, %res1
3952   ret <8 x i32> %res2
3953 }
3954
3955 declare <16 x i32> @llvm.x86.avx512.mask.cvttps2dq.512(<16 x float>, <16 x i32>, i16, i32)
3956
3957 define <16 x i32>@test_int_x86_avx512_mask_cvtt_ps2dq_512(<16 x float> %x0, <16 x i32> %x1, i16 %x2) {
3958 ; CHECK-LABEL: test_int_x86_avx512_mask_cvtt_ps2dq_512:
3959 ; CHECK:       ## BB#0:
3960 ; CHECK-NEXT:    kmovw %edi, %k1
3961 ; CHECK-NEXT:    vcvttps2dq %zmm0, %zmm1 {%k1}
3962 ; CHECK-NEXT:    vcvttps2dq {sae}, %zmm0, %zmm0
3963 ; CHECK-NEXT:    vpaddd %zmm0, %zmm1, %zmm0
3964 ; CHECK-NEXT:    retq
3965   %res = call <16 x i32> @llvm.x86.avx512.mask.cvttps2dq.512(<16 x float> %x0, <16 x i32> %x1, i16 %x2, i32 4)
3966   %res1 = call <16 x i32> @llvm.x86.avx512.mask.cvttps2dq.512(<16 x float> %x0, <16 x i32> %x1, i16 -1, i32 8)
3967   %res2 = add <16 x i32> %res, %res1
3968   ret <16 x i32> %res2
3969 }
3970
3971 declare <16 x i32> @llvm.x86.avx512.mask.cvttps2udq.512(<16 x float>, <16 x i32>, i16, i32)
3972
3973 define <16 x i32>@test_int_x86_avx512_mask_cvtt_ps2udq_512(<16 x float> %x0, <16 x i32> %x1, i16 %x2) {
3974 ; CHECK-LABEL: test_int_x86_avx512_mask_cvtt_ps2udq_512:
3975 ; CHECK:       ## BB#0:
3976 ; CHECK-NEXT:    kmovw %edi, %k1
3977 ; CHECK-NEXT:    vcvttps2udq %zmm0, %zmm1 {%k1}
3978 ; CHECK-NEXT:    vcvttps2udq {sae}, %zmm0, %zmm0
3979 ; CHECK-NEXT:    vpaddd %zmm0, %zmm1, %zmm0
3980 ; CHECK-NEXT:    retq
3981   %res = call <16 x i32> @llvm.x86.avx512.mask.cvttps2udq.512(<16 x float> %x0, <16 x i32> %x1, i16 %x2, i32 4)
3982   %res1 = call <16 x i32> @llvm.x86.avx512.mask.cvttps2udq.512(<16 x float> %x0, <16 x i32> %x1, i16 -1, i32 8)
3983   %res2 = add <16 x i32> %res, %res1
3984   ret <16 x i32> %res2
3985 }
3986
3987
3988 declare <4 x float> @llvm.x86.avx512.mask.scalef.ss(<4 x float>, <4 x float>,<4 x float>, i8, i32)
3989 ; CHECK-LABEL: @test_int_x86_avx512_mask_scalef_ss
3990 ; CHECK-NOT: call 
3991 ; CHECK: kmov 
3992 ; CHECK: vscalefss {{.*}}{%k1} 
3993 ; CHECK: vscalefss      {rn-sae}
3994 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) {
3995   %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)
3996   %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)
3997   %res2 = fadd <4 x float> %res, %res1
3998   ret <4 x float> %res2
3999 }
4000
4001 declare <2 x double> @llvm.x86.avx512.mask.scalef.sd(<2 x double>, <2 x double>,<2 x double>, i8, i32)
4002 ; CHECK-LABEL: @test_int_x86_avx512_mask_scalef_sd
4003 ; CHECK-NOT: call 
4004 ; CHECK: kmov 
4005 ; CHECK: vscalefsd {{.*}}{%k1} 
4006 ; CHECK: vscalefsd      {rn-sae}
4007 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) {
4008   %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)
4009   %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)
4010   %res2 = fadd <2 x double> %res, %res1
4011   ret <2 x double> %res2
4012 }
4013
4014 declare <4 x float> @llvm.x86.avx512.mask.getexp.ss(<4 x float>, <4 x float>, <4 x float>, i8, i32) nounwind readnone
4015
4016 define <4 x float> @test_getexp_ss(<4 x float> %a0, <4 x float> %a1, <4 x float> %a2, i8 %mask) {
4017 ; CHECK-LABEL: test_getexp_ss:
4018 ; CHECK:       ## BB#0:
4019 ; CHECK-NEXT:    andl $1, %edi
4020 ; CHECK-NEXT:    kmovw %edi, %k1
4021 ; CHECK-NEXT:    vmovaps %zmm2, %zmm3
4022 ; CHECK-NEXT:    vgetexpss %xmm1, %xmm0, %xmm3 {%k1}
4023 ; CHECK-NEXT:    vgetexpss {sae}, %xmm1, %xmm0, %xmm2 {%k1}
4024 ; CHECK-NEXT:    vgetexpss {sae}, %xmm1, %xmm0, %xmm4 {%k1} {z}
4025 ; CHECK-NEXT:    vgetexpss {sae}, %xmm1, %xmm0, %xmm0
4026 ; CHECK-NEXT:    vaddps %xmm2, %xmm3, %xmm1
4027 ; CHECK-NEXT:    vaddps %xmm0, %xmm4, %xmm0
4028 ; CHECK-NEXT:    vaddps %xmm0, %xmm1, %xmm0
4029 ; CHECK-NEXT:    retq
4030   %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)
4031   %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)
4032   %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)
4033   %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)
4034
4035   %res.1 = fadd <4 x float> %res0, %res1
4036   %res.2 = fadd <4 x float> %res2, %res3
4037   %res   = fadd <4 x float> %res.1, %res.2
4038   ret <4 x float> %res
4039 }
4040
4041 declare <2 x double> @llvm.x86.avx512.mask.getexp.sd(<2 x double>, <2 x double>, <2 x double>, i8, i32) nounwind readnone
4042
4043 define <2 x double> @test_getexp_sd(<2 x double> %a0, <2 x double> %a1, <2 x double> %a2, i8 %mask) {
4044 ; CHECK-LABEL: test_getexp_sd:
4045 ; CHECK:       ## BB#0:
4046 ; CHECK-NEXT:    andl $1, %edi
4047 ; CHECK-NEXT:    kmovw %edi, %k1
4048 ; CHECK-NEXT:    vmovaps %zmm2, %zmm3
4049 ; CHECK-NEXT:    vgetexpsd %xmm1, %xmm0, %xmm3 {%k1}
4050 ; CHECK-NEXT:    vgetexpsd %xmm1, %xmm0, %xmm4
4051 ; CHECK-NEXT:    vgetexpsd {sae}, %xmm1, %xmm0, %xmm2 {%k1}
4052 ; CHECK-NEXT:    vgetexpsd {sae}, %xmm1, %xmm0, %xmm0 {%k1} {z}
4053 ; CHECK-NEXT:    vaddpd %xmm2, %xmm3, %xmm1
4054 ; CHECK-NEXT:    vaddpd %xmm4, %xmm0, %xmm0
4055 ; CHECK-NEXT:    vaddpd %xmm0, %xmm1, %xmm0
4056 ; CHECK-NEXT:    retq
4057   %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)
4058   %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)
4059   %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)
4060   %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)
4061
4062   %res.1 = fadd <2 x double> %res0, %res1
4063   %res.2 = fadd <2 x double> %res2, %res3
4064   %res   = fadd <2 x double> %res.1, %res.2
4065   ret <2 x double> %res
4066 }
4067
4068 declare i8 @llvm.x86.avx512.mask.cmp.sd(<2 x double>, <2 x double>, i32, i8, i32)
4069
4070 define i8@test_int_x86_avx512_mask_cmp_sd(<2 x double> %x0, <2 x double> %x1, i8 %x3, i32 %x4) {
4071 ; CHECK-LABEL: test_int_x86_avx512_mask_cmp_sd:
4072 ; CHECK:       ## BB#0:
4073 ; CHECK-NEXT:    andl $1, %edi
4074 ; CHECK-NEXT:    kmovw %edi, %k1
4075 ; CHECK-NEXT:    vcmpnltsd {sae}, %xmm1, %xmm0, %k0 {%k1}
4076 ; CHECK-NEXT:    kmovw %k0, %eax
4077 ; CHECK-NEXT:    shlb $7, %al
4078 ; CHECK-NEXT:    sarb $7, %al
4079 ; CHECK-NEXT:    retq
4080
4081   %res4 = call i8 @llvm.x86.avx512.mask.cmp.sd(<2 x double> %x0, <2 x double> %x1, i32 5, i8 %x3, i32 8)
4082   ret i8 %res4
4083 }
4084
4085 define i8@test_int_x86_avx512_mask_cmp_sd_all(<2 x double> %x0, <2 x double> %x1, i8 %x3, i32 %x4) {
4086 ; CHECK-LABEL: test_int_x86_avx512_mask_cmp_sd_all:
4087 ; CHECK:       ## BB#0:
4088 ; CHECK-NEXT:    vcmpunordsd {sae}, %xmm1, %xmm0, %k0
4089 ; CHECK-NEXT:    vcmplesd %xmm1, %xmm0, %k1
4090 ; CHECK-NEXT:    korw %k0, %k1, %k0
4091 ; CHECK-NEXT:    vcmpnltsd {sae}, %xmm1, %xmm0, %k1
4092 ; CHECK-NEXT:    vcmpneqsd %xmm1, %xmm0, %k2
4093 ; CHECK-NEXT:    korw %k1, %k2, %k1
4094 ; CHECK-NEXT:    andl $1, %edi
4095 ; CHECK-NEXT:    kmovw %edi, %k2
4096 ; CHECK-NEXT:    kandw %k2, %k1, %k1
4097 ; CHECK-NEXT:    korw %k1, %k0, %k0
4098 ; CHECK-NEXT:    kmovw %k0, %eax
4099 ; CHECK-NEXT:    shlb $7, %al
4100 ; CHECK-NEXT:    sarb $7, %al
4101 ; CHECK-NEXT:    retq
4102
4103   %res1 = call i8 @llvm.x86.avx512.mask.cmp.sd(<2 x double> %x0, <2 x double> %x1, i32 2, i8 -1, i32 4)
4104   %res2 = call i8 @llvm.x86.avx512.mask.cmp.sd(<2 x double> %x0, <2 x double> %x1, i32 3, i8 -1, i32 8)
4105   %res3 = call i8 @llvm.x86.avx512.mask.cmp.sd(<2 x double> %x0, <2 x double> %x1, i32 4, i8 %x3, i32 4)
4106   %res4 = call i8 @llvm.x86.avx512.mask.cmp.sd(<2 x double> %x0, <2 x double> %x1, i32 5, i8 %x3, i32 8)
4107
4108   %res11 = or i8 %res1, %res2
4109   %res12 = or i8 %res3, %res4
4110   %res13 = or i8 %res11, %res12
4111   ret i8 %res13
4112 }
4113
4114 declare i8 @llvm.x86.avx512.mask.cmp.ss(<4 x float>, <4 x float>, i32, i8, i32)
4115
4116 define i8@test_int_x86_avx512_mask_cmp_ss(<4 x float> %x0, <4 x float> %x1, i8 %x3, i32 %x4) {
4117 ; CHECK-LABEL: test_int_x86_avx512_mask_cmp_ss:
4118 ; CHECK:       ## BB#0:
4119 ; CHECK-NEXT:    andl $1, %edi
4120 ; CHECK-NEXT:    kmovw %edi, %k1
4121 ; CHECK-NEXT:    vcmpunordss %xmm1, %xmm0, %k0 {%k1}
4122 ; CHECK-NEXT:    kmovw %k0, %eax
4123 ; CHECK-NEXT:    shlb $7, %al
4124 ; CHECK-NEXT:    sarb $7, %al
4125 ; CHECK-NEXT:    retq
4126
4127   %res2 = call i8 @llvm.x86.avx512.mask.cmp.ss(<4 x float> %x0, <4 x float> %x1, i32 3, i8 %x3, i32 4)
4128   ret i8 %res2
4129 }
4130
4131
4132 define i8@test_int_x86_avx512_mask_cmp_ss_all(<4 x float> %x0, <4 x float> %x1, i8 %x3, i32 %x4) {
4133 ; CHECK-LABEL: test_int_x86_avx512_mask_cmp_ss_all:
4134 ; CHECK:       ## BB#0:
4135 ; CHECK-NEXT:    vcmpless %xmm1, %xmm0, %k1
4136 ; CHECK-NEXT:    vcmpunordss {sae}, %xmm1, %xmm0, %k0 {%k1}
4137 ; CHECK-NEXT:    vcmpneqss %xmm1, %xmm0, %k1
4138 ; CHECK-NEXT:    vcmpnltss {sae}, %xmm1, %xmm0, %k1 {%k1}
4139 ; CHECK-NEXT:    andl $1, %edi
4140 ; CHECK-NEXT:    kmovw %edi, %k2
4141 ; CHECK-NEXT:    kandw %k2, %k1, %k1
4142 ; CHECK-NEXT:    kandw %k1, %k0, %k0
4143 ; CHECK-NEXT:    kmovw %k0, %eax
4144 ; CHECK-NEXT:    shlb $7, %al
4145 ; CHECK-NEXT:    sarb $7, %al
4146 ; CHECK-NEXT:    retq
4147   %res1 = call i8 @llvm.x86.avx512.mask.cmp.ss(<4 x float> %x0, <4 x float> %x1, i32 2, i8 -1, i32 4)
4148   %res2 = call i8 @llvm.x86.avx512.mask.cmp.ss(<4 x float> %x0, <4 x float> %x1, i32 3, i8 -1, i32 8)
4149   %res3 = call i8 @llvm.x86.avx512.mask.cmp.ss(<4 x float> %x0, <4 x float> %x1, i32 4, i8 %x3, i32 4)
4150   %res4 = call i8 @llvm.x86.avx512.mask.cmp.ss(<4 x float> %x0, <4 x float> %x1, i32 5, i8 %x3, i32 8)
4151
4152   %res11 = and i8 %res1, %res2
4153   %res12 = and i8 %res3, %res4
4154   %res13 = and i8 %res11, %res12
4155   ret i8 %res13
4156 }
4157
4158 declare <16 x float> @llvm.x86.avx512.mask.shuf.f32x4(<16 x float>, <16 x float>, i32, <16 x float>, i16)
4159
4160 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) {
4161 ; CHECK-LABEL: test_int_x86_avx512_mask_shuf_f32x4:
4162 ; CHECK:       ## BB#0:
4163 ; CHECK-NEXT:    kmovw %edi, %k1
4164 ; CHECK-NEXT:    vshuff32x4 $22, %zmm1, %zmm0, %zmm2 {%k1}
4165 ; CHECK-NEXT:    vshuff32x4 $22, %zmm1, %zmm0, %zmm0
4166 ; CHECK-NEXT:    vaddps %zmm0, %zmm2, %zmm0
4167 ; CHECK-NEXT:    retq
4168   %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)
4169   %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)
4170   %res2 = fadd <16 x float> %res, %res1
4171   ret <16 x float> %res2
4172 }
4173
4174 declare <8 x double> @llvm.x86.avx512.mask.shuf.f64x2(<8 x double>, <8 x double>, i32, <8 x double>, i8)
4175
4176 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) {
4177 ; CHECK-LABEL: test_int_x86_avx512_mask_shuf_f64x2:
4178 ; CHECK:       ## BB#0:
4179 ; CHECK-NEXT:    movzbl %dil, %eax
4180 ; CHECK-NEXT:    kmovw %eax, %k1
4181 ; CHECK-NEXT:    vshuff64x2 $22, %zmm1, %zmm0, %zmm2 {%k1}
4182 ; CHECK-NEXT:    vshuff64x2 $22, %zmm1, %zmm0, %zmm3 {%k1} {z}
4183 ; CHECK-NEXT:    vshuff64x2 $22, %zmm1, %zmm0, %zmm0
4184 ; CHECK-NEXT:    vaddpd %zmm0, %zmm2, %zmm0
4185 ; CHECK-NEXT:    vaddpd %zmm3, %zmm0, %zmm0
4186 ; CHECK-NEXT:    retq
4187   %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)
4188   %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)
4189   %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)
4190
4191   %res3 = fadd <8 x double> %res, %res1
4192   %res4 = fadd <8 x double> %res3, %res2
4193   ret <8 x double> %res4
4194 }
4195
4196 declare <16 x i32> @llvm.x86.avx512.mask.shuf.i32x4(<16 x i32>, <16 x i32>, i32, <16 x i32>, i16)
4197
4198 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) {
4199 ; CHECK-LABEL: test_int_x86_avx512_mask_shuf_i32x4:
4200 ; CHECK:       ## BB#0:
4201 ; CHECK-NEXT:    kmovw %edi, %k1
4202 ; CHECK-NEXT:    vshufi32x4 $22, %zmm1, %zmm0, %zmm2 {%k1}
4203 ; CHECK-NEXT:    vshufi32x4 $22, %zmm1, %zmm0, %zmm0
4204 ; CHECK-NEXT:    vpaddd %zmm0, %zmm2, %zmm0
4205 ; CHECK-NEXT:    retq
4206   %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)
4207   %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)
4208   %res2 = add <16 x i32> %res, %res1
4209   ret <16 x i32> %res2
4210 }
4211
4212 declare <8 x i64> @llvm.x86.avx512.mask.shuf.i64x2(<8 x i64>, <8 x i64>, i32, <8 x i64>, i8)
4213
4214 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) {
4215 ; CHECK-LABEL: test_int_x86_avx512_mask_shuf_i64x2:
4216 ; CHECK:       ## BB#0:
4217 ; CHECK-NEXT:    movzbl %dil, %eax
4218 ; CHECK-NEXT:    kmovw %eax, %k1
4219 ; CHECK-NEXT:    vshufi64x2 $22, %zmm1, %zmm0, %zmm2 {%k1}
4220 ; CHECK-NEXT:    vshufi64x2 $22, %zmm1, %zmm0, %zmm0
4221 ; CHECK-NEXT:    vpaddq %zmm0, %zmm2, %zmm0
4222 ; CHECK-NEXT:    retq
4223   %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)
4224   %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)
4225   %res2 = add <8 x i64> %res, %res1
4226   ret <8 x i64> %res2
4227 }
4228
4229 declare <8 x double> @llvm.x86.avx512.mask.getmant.pd.512(<8 x double>, i32, <8 x double>, i8, i32)
4230
4231 define <8 x double>@test_int_x86_avx512_mask_getmant_pd_512(<8 x double> %x0, <8 x double> %x2, i8 %x3) {
4232 ; CHECK-LABEL: test_int_x86_avx512_mask_getmant_pd_512:
4233 ; CHECK:       ## BB#0:
4234 ; CHECK-NEXT:    movzbl %dil, %eax
4235 ; CHECK-NEXT:    kmovw %eax, %k1
4236 ; CHECK-NEXT:    vgetmantpd $11, %zmm0, %zmm1 {%k1}
4237 ; CHECK-NEXT:    vgetmantpd $11,{sae}, %zmm0, %zmm0
4238 ; CHECK-NEXT:    vaddpd %zmm0, %zmm1, %zmm0
4239 ; CHECK-NEXT:    retq
4240   %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)
4241   %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)
4242   %res2 = fadd <8 x double> %res, %res1
4243   ret <8 x double> %res2
4244 }
4245
4246 declare <16 x float> @llvm.x86.avx512.mask.getmant.ps.512(<16 x float>, i32, <16 x float>, i16, i32)
4247
4248 define <16 x float>@test_int_x86_avx512_mask_getmant_ps_512(<16 x float> %x0, <16 x float> %x2, i16 %x3) {
4249 ; CHECK-LABEL: test_int_x86_avx512_mask_getmant_ps_512:
4250 ; CHECK:       ## BB#0:
4251 ; CHECK-NEXT:    kmovw %edi, %k1
4252 ; CHECK-NEXT:    vgetmantps $11, %zmm0, %zmm1 {%k1}
4253 ; CHECK-NEXT:    vgetmantps $11,{sae}, %zmm0, %zmm0
4254 ; CHECK-NEXT:    vaddps %zmm0, %zmm1, %zmm0
4255 ; CHECK-NEXT:    retq
4256   %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)
4257   %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)
4258   %res2 = fadd <16 x float> %res, %res1
4259   ret <16 x float> %res2
4260 }
4261
4262 declare <2 x double> @llvm.x86.avx512.mask.getmant.sd(<2 x double>, <2 x double>, i32, <2 x double>, i8, i32)
4263
4264 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) {
4265 ; CHECK-LABEL: test_int_x86_avx512_mask_getmant_sd:
4266 ; CHECK:       ## BB#0:
4267 ; CHECK-NEXT:    andl $1, %edi
4268 ; CHECK-NEXT:    kmovw %edi, %k1
4269 ; CHECK-NEXT:    vmovaps %zmm2, %zmm3
4270 ; CHECK-NEXT:    vgetmantsd $11, %xmm1, %xmm0, %xmm3 {%k1}
4271 ; CHECK-NEXT:    vgetmantsd $11, %xmm1, %xmm0, %xmm4 {%k1} {z}
4272 ; CHECK-NEXT:    vgetmantsd $11, %xmm1, %xmm0, %xmm5
4273 ; CHECK-NEXT:    vgetmantsd $11,{sae}, %xmm1, %xmm0, %xmm2 {%k1}
4274 ; CHECK-NEXT:    vaddpd %xmm4, %xmm3, %xmm0
4275 ; CHECK-NEXT:    vaddpd %xmm5, %xmm2, %xmm1
4276 ; CHECK-NEXT:    vaddpd %xmm1, %xmm0, %xmm0
4277 ; CHECK-NEXT:    retq
4278   %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)
4279   %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)
4280   %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)
4281   %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)
4282   %res11 = fadd <2 x double> %res, %res1
4283   %res12 = fadd <2 x double> %res2, %res3
4284   %res13 = fadd <2 x double> %res11, %res12
4285   ret <2 x double> %res13
4286 }
4287
4288 declare <4 x float> @llvm.x86.avx512.mask.getmant.ss(<4 x float>, <4 x float>, i32, <4 x float>, i8, i32)
4289
4290 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) {
4291 ; CHECK-LABEL: test_int_x86_avx512_mask_getmant_ss:
4292 ; CHECK:       ## BB#0:
4293 ; CHECK-NEXT:    andl $1, %edi
4294 ; CHECK-NEXT:    kmovw %edi, %k1
4295 ; CHECK-NEXT:    vgetmantss $11, %xmm1, %xmm0, %xmm2 {%k1}
4296 ; CHECK-NEXT:    vgetmantss $11, %xmm1, %xmm0, %xmm3 {%k1} {z}
4297 ; CHECK-NEXT:    vgetmantss $11, %xmm1, %xmm0, %xmm4
4298 ; CHECK-NEXT:    vgetmantss $11,{sae}, %xmm1, %xmm0, %xmm0
4299 ; CHECK-NEXT:    vaddps %xmm3, %xmm2, %xmm1
4300 ; CHECK-NEXT:    vaddps %xmm4, %xmm0, %xmm0
4301 ; CHECK-NEXT:    vaddps %xmm0, %xmm1, %xmm0
4302 ; CHECK-NEXT:    retq
4303   %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)
4304   %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)
4305   %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)
4306   %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)
4307   %res11 = fadd <4 x float> %res, %res1
4308   %res12 = fadd <4 x float> %res2, %res3
4309   %res13 = fadd <4 x float> %res11, %res12
4310   ret <4 x float> %res13
4311 }
4312
4313 declare <8 x double> @llvm.x86.avx512.mask.shuf.pd.512(<8 x double>, <8 x double>, i32, <8 x double>, i8)
4314
4315 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) {
4316 ; CHECK-LABEL: test_int_x86_avx512_mask_shuf_pd_512:
4317 ; CHECK:       ## BB#0:
4318 ; CHECK-NEXT:    movzbl %dil, %eax
4319 ; CHECK-NEXT:    kmovw %eax, %k1
4320 ; CHECK-NEXT:    vshufpd $22, %zmm1, %zmm0, %zmm2 {%k1}
4321 ; CHECK-NEXT:    vshufpd $22, %zmm1, %zmm0, %zmm3 {%k1} {z}
4322 ; CHECK-NEXT:    vshufpd $22, %zmm1, %zmm0, %zmm0
4323 ; CHECK-NEXT:    vaddpd %zmm0, %zmm2, %zmm0
4324 ; CHECK-NEXT:    vaddpd %zmm3, %zmm0, %zmm0
4325 ; CHECK-NEXT:    retq
4326   %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)
4327   %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)
4328   %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)
4329
4330   %res3 = fadd <8 x double> %res, %res1
4331   %res4 = fadd <8 x double> %res3, %res2
4332   ret <8 x double> %res4
4333 }
4334
4335 declare <16 x float> @llvm.x86.avx512.mask.shuf.ps.512(<16 x float>, <16 x float>, i32, <16 x float>, i16)
4336
4337 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) {
4338 ; CHECK-LABEL: test_int_x86_avx512_mask_shuf_ps_512:
4339 ; CHECK:       ## BB#0:
4340 ; CHECK-NEXT:    kmovw %edi, %k1
4341 ; CHECK-NEXT:    vshufps $22, %zmm1, %zmm0, %zmm2 {%k1}
4342 ; CHECK-NEXT:    vshufps $22, %zmm1, %zmm0, %zmm0
4343 ; CHECK-NEXT:    vaddps %zmm0, %zmm2, %zmm0
4344 ; CHECK-NEXT:    retq
4345   %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)
4346   %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)  
4347   %res2 = fadd <16 x float> %res, %res1
4348   ret <16 x float> %res2
4349 }
4350
4351 declare <8 x double> @llvm.x86.avx512.mask.vpermil.pd.512(<8 x double>, i32, <8 x double>, i8)
4352
4353 define <8 x double>@test_int_x86_avx512_mask_vpermil_pd_512(<8 x double> %x0, <8 x double> %x2, i8 %x3) {
4354 ; CHECK-LABEL: test_int_x86_avx512_mask_vpermil_pd_512:
4355 ; CHECK:       ## BB#0:
4356 ; CHECK-NEXT:    movzbl %dil, %eax
4357 ; CHECK-NEXT:    kmovw %eax, %k1 
4358 ; CHECK-NEXT:    vpermilpd $22, %zmm0, %zmm1 {%k1} 
4359 ; CHECK-NEXT:    vpermilpd $22, %zmm0, %zmm2 {%k1} {z} 
4360 ; CHECK-NEXT:    vpermilpd $22, %zmm0, %zmm0 
4361 ; CHECK-NEXT:    vaddpd %zmm2, %zmm1, %zmm1 
4362 ; CHECK-NEXT:    vaddpd %zmm0, %zmm1, %zmm0 
4363 ; CHECK-NEXT:    retq 
4364   %res = call <8 x double> @llvm.x86.avx512.mask.vpermil.pd.512(<8 x double> %x0, i32 22, <8 x double> %x2, i8 %x3)
4365   %res1 = call <8 x double> @llvm.x86.avx512.mask.vpermil.pd.512(<8 x double> %x0, i32 22, <8 x double> zeroinitializer, i8 %x3)
4366   %res2 = call <8 x double> @llvm.x86.avx512.mask.vpermil.pd.512(<8 x double> %x0, i32 22, <8 x double> %x2, i8 -1)
4367   %res3 = fadd <8 x double> %res, %res1
4368   %res4 = fadd <8 x double> %res3, %res2
4369   ret <8 x double> %res4
4370 }
4371
4372 declare <16 x float> @llvm.x86.avx512.mask.vpermil.ps.512(<16 x float>, i32, <16 x float>, i16)
4373
4374 define <16 x float>@test_int_x86_avx512_mask_vpermil_ps_512(<16 x float> %x0, <16 x float> %x2, i16 %x3) {
4375 ; CHECK-LABEL: test_int_x86_avx512_mask_vpermil_ps_512:
4376 ; CHECK:       ## BB#0:
4377 ; CHECK-NEXT:    kmovw %edi, %k1 
4378 ; CHECK-NEXT:    vpermilps $22, %zmm0, %zmm1 {%k1} 
4379 ; CHECK-NEXT:    vpermilps $22, %zmm0, %zmm2 {%k1} {z} 
4380 ; CHECK-NEXT:    vpermilps $22, %zmm0, %zmm0 
4381 ; CHECK-NEXT:    vaddps %zmm2, %zmm1, %zmm1 
4382 ; CHECK-NEXT:    vaddps %zmm0, %zmm1, %zmm0 
4383 ; CHECK-NEXT:    retq 
4384   %res = call <16 x float> @llvm.x86.avx512.mask.vpermil.ps.512(<16 x float> %x0, i32 22, <16 x float> %x2, i16 %x3)
4385   %res1 = call <16 x float> @llvm.x86.avx512.mask.vpermil.ps.512(<16 x float> %x0, i32 22, <16 x float> zeroinitializer, i16 %x3)
4386   %res2 = call <16 x float> @llvm.x86.avx512.mask.vpermil.ps.512(<16 x float> %x0, i32 22, <16 x float> %x2, i16 -1)
4387   %res3 = fadd <16 x float> %res, %res1
4388   %res4 = fadd <16 x float> %res3, %res2
4389   ret <16 x float> %res4
4390 }
4391
4392 declare <8 x double> @llvm.x86.avx512.mask.vpermilvar.pd.512(<8 x double>, <8 x i64>, <8 x double>, i8)
4393
4394 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) {
4395 ; CHECK-LABEL: test_int_x86_avx512_mask_vpermilvar_pd_512:
4396 ; CHECK:       ## BB#0:
4397 ; CHECK-NEXT:    movzbl %dil, %eax
4398 ; CHECK-NEXT:    kmovw %eax, %k1
4399 ; CHECK-NEXT:    vpermilpd %zmm1, %zmm0, %zmm2 {%k1}
4400 ; CHECK-NEXT:    vpermilpd %zmm1, %zmm0, %zmm3 {%k1} {z}
4401 ; CHECK-NEXT:    vpermilpd %zmm1, %zmm0, %zmm0
4402 ; CHECK-NEXT:    vaddpd %zmm3, %zmm2, %zmm1
4403 ; CHECK-NEXT:    vaddpd %zmm1, %zmm0, %zmm0
4404 ; CHECK-NEXT:    retq
4405   %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)
4406   %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)
4407   %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)
4408   %res3 = fadd <8 x double> %res, %res1
4409   %res4 = fadd <8 x double> %res2, %res3
4410   ret <8 x double> %res4
4411 }
4412
4413 declare <16 x float> @llvm.x86.avx512.mask.vpermilvar.ps.512(<16 x float>, <16 x i32>, <16 x float>, i16)
4414
4415 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) {
4416 ; CHECK-LABEL: test_int_x86_avx512_mask_vpermilvar_ps_512:
4417 ; CHECK:       ## BB#0:
4418 ; CHECK-NEXT:    kmovw %edi, %k1
4419 ; CHECK-NEXT:    vpermilps %zmm1, %zmm0, %zmm2 {%k1}
4420 ; CHECK-NEXT:    vpermilps %zmm1, %zmm0, %zmm3 {%k1} {z}
4421 ; CHECK-NEXT:    vpermilps %zmm1, %zmm0, %zmm0
4422 ; CHECK-NEXT:    vaddps %zmm3, %zmm2, %zmm1
4423 ; CHECK-NEXT:    vaddps %zmm1, %zmm0, %zmm0
4424 ; CHECK-NEXT:    retq
4425   %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)
4426   %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)
4427   %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)
4428   %res3 = fadd <16 x float> %res, %res1
4429   %res4 = fadd <16 x float> %res2, %res3
4430   ret <16 x float> %res4
4431 }
4432
4433 declare <16 x float> @llvm.x86.avx512.mask.insertf32x4.512(<16 x float>, <4 x float>, i32, <16 x float>, i8)
4434
4435 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) {
4436 ; CHECK-LABEL: test_int_x86_avx512_mask_insertf32x4_512:
4437 ; CHECK:       ## BB#0:
4438 ; CHECK-NEXT:    kmovw %edi, %k1
4439 ; CHECK-NEXT:    vinsertf32x4 $1, %xmm1, %zmm0, %zmm2 {%k1}
4440 ; CHECK-NEXT:    vinsertf32x4 $1, %xmm1, %zmm0, %zmm3 {%k1} {z}
4441 ; CHECK-NEXT:    vinsertf32x4 $1, %xmm1, %zmm0, %zmm0
4442 ; CHECK-NEXT:    vaddps %zmm0, %zmm2, %zmm0
4443 ; CHECK-NEXT:    vaddps %zmm0, %zmm3, %zmm0
4444 ; CHECK-NEXT:    retq
4445   %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)
4446   %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)
4447   %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)
4448   %res3 = fadd <16 x float> %res, %res1
4449   %res4 = fadd <16 x float> %res2, %res3
4450   ret <16 x float> %res4
4451 }
4452
4453 declare <16 x i32> @llvm.x86.avx512.mask.inserti32x4.512(<16 x i32>, <4 x i32>, i32, <16 x i32>, i8)
4454
4455 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) {
4456 ; CHECK-LABEL: test_int_x86_avx512_mask_inserti32x4_512:
4457 ; CHECK:       ## BB#0:
4458 ; CHECK-NEXT:    kmovw %edi, %k1
4459 ; CHECK-NEXT:    vinserti32x4 $1, %xmm1, %zmm0, %zmm2 {%k1}
4460 ; CHECK-NEXT:    vinserti32x4 $1, %xmm1, %zmm0, %zmm3 {%k1} {z}
4461 ; CHECK-NEXT:    vinserti32x4 $1, %xmm1, %zmm0, %zmm0
4462 ; CHECK-NEXT:    vpaddd %zmm0, %zmm2, %zmm0
4463 ; CHECK-NEXT:    vpaddd %zmm0, %zmm3, %zmm0
4464 ; CHECK-NEXT:    retq
4465   %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)
4466   %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)
4467   %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)
4468   %res3 = add <16 x i32> %res, %res1
4469   %res4 = add <16 x i32> %res2, %res3
4470   ret <16 x i32> %res4
4471 }
4472
4473 declare <8 x double> @llvm.x86.avx512.mask.insertf64x4.512(<8 x double>, <4 x double>, i32, <8 x double>, i8)
4474
4475 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) {
4476 ; CHECK-LABEL: test_int_x86_avx512_mask_insertf64x4_512:
4477 ; CHECK:       ## BB#0:
4478 ; CHECK-NEXT:    movzbl %dil, %eax
4479 ; CHECK-NEXT:    kmovw %eax, %k1
4480 ; CHECK-NEXT:    vinsertf64x4 $1, %ymm1, %zmm0, %zmm2 {%k1}
4481 ; CHECK-NEXT:    vinsertf64x4 $1, %ymm1, %zmm0, %zmm3 {%k1} {z}
4482 ; CHECK-NEXT:    vinsertf64x4 $1, %ymm1, %zmm0, %zmm0
4483 ; CHECK-NEXT:    vaddpd %zmm0, %zmm2, %zmm0
4484 ; CHECK-NEXT:    vaddpd %zmm0, %zmm3, %zmm0
4485 ; CHECK-NEXT:    retq
4486   %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)
4487   %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)
4488   %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)
4489   %res3 = fadd <8 x double> %res, %res1
4490   %res4 = fadd <8 x double> %res2, %res3
4491   ret <8 x double> %res4
4492 }
4493
4494 declare <8 x i64> @llvm.x86.avx512.mask.inserti64x4.512(<8 x i64>, <4 x i64>, i32, <8 x i64>, i8)
4495
4496 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) {
4497 ; CHECK-LABEL: test_int_x86_avx512_mask_inserti64x4_512:
4498 ; CHECK:       ## BB#0:
4499 ; CHECK-NEXT:    movzbl %dil, %eax
4500 ; CHECK-NEXT:    kmovw %eax, %k1
4501 ; CHECK-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm2 {%k1}
4502 ; CHECK-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm3 {%k1} {z}
4503 ; CHECK-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
4504 ; CHECK-NEXT:    vpaddq %zmm0, %zmm2, %zmm0
4505 ; CHECK-NEXT:    vpaddq %zmm0, %zmm3, %zmm0
4506 ; CHECK-NEXT:    retq
4507   %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)
4508   %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)
4509   %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)
4510   %res3 = add <8 x i64> %res, %res1
4511   %res4 = add <8 x i64> %res2, %res3
4512   ret <8 x i64> %res4
4513 }
4514
4515 declare <2 x double> @llvm.x86.avx512.mask.cvtss2sd.round(<4 x float>, <4 x float>, <2 x double>, i8, i32)
4516
4517 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) {
4518 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_ss2sd_round:
4519 ; CHECK:    kmovw %edi, %k1    
4520 ; CHECK-NEXT:    vcvtss2sd %xmm1, %xmm0, %xmm2 {%k1} 
4521 ; CHECK-NEXT:    vcvtss2sd {sae}, %xmm1, %xmm0, %xmm0
4522 ; CHECK-NEXT:    %xmm0, %xmm2, %xmm0
4523 ; CHECK-NEXT:    retq
4524   %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)
4525   %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)
4526   %res2 = fadd <2 x double> %res, %res1
4527   ret <2 x double> %res2
4528 }
4529
4530 declare <4 x float> @llvm.x86.avx512.mask.cvtsd2ss.round(<2 x double>, <2 x double>, <4 x float>, i8, i32)
4531
4532 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) {
4533 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_sd2ss_round:
4534 ; CHECK:    kmovw %edi, %k1
4535 ; CHECK-NEXT:    vcvtsd2ss {rz-sae}, %xmm1, %xmm0, %xmm2 {%k1}
4536 ; CHECK-NEXT:    vcvtsd2ss {rn-sae}, %xmm1, %xmm0, %xmm0
4537 ; CHECK-NEXT:    vaddps %xmm0, %xmm2, %xmm0
4538 ; CHECK-NEXT:    retq
4539   %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)
4540   %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)
4541   %res2 = fadd <4 x float> %res, %res1
4542   ret <4 x float> %res2
4543 }
4544
4545 declare <16 x i32> @llvm.x86.avx512.mask.pternlog.d.512(<16 x i32>, <16 x i32>, <16 x i32>, i32, i16)
4546
4547 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) {
4548 ; CHECK-LABEL: test_int_x86_avx512_mask_pternlog_d_512:
4549 ; CHECK:       ## BB#0:
4550 ; CHECK-NEXT:    kmovw %edi, %k1
4551 ; CHECK-NEXT:    vmovaps %zmm0, %zmm3
4552 ; CHECK-NEXT:    vpternlogd $33, %zmm2, %zmm1, %zmm3 {%k1}
4553 ; CHECK-NEXT:    vpternlogd $33, %zmm2, %zmm1, %zmm0
4554 ; CHECK-NEXT:    vpaddd %zmm0, %zmm3, %zmm0
4555 ; CHECK-NEXT:    retq
4556   %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)
4557   %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)
4558   %res2 = add <16 x i32> %res, %res1
4559   ret <16 x i32> %res2
4560 }
4561
4562 declare <16 x i32> @llvm.x86.avx512.maskz.pternlog.d.512(<16 x i32>, <16 x i32>, <16 x i32>, i32, i16)
4563
4564 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) {
4565 ; CHECK-LABEL: test_int_x86_avx512_maskz_pternlog_d_512:
4566 ; CHECK:       ## BB#0:
4567 ; CHECK-NEXT:    kmovw %edi, %k1
4568 ; CHECK-NEXT:    vmovaps %zmm0, %zmm3
4569 ; CHECK-NEXT:    vpternlogd $33, %zmm2, %zmm1, %zmm3 {%k1} {z}
4570 ; CHECK-NEXT:    vpternlogd $33, %zmm2, %zmm1, %zmm0
4571 ; CHECK-NEXT:    vpaddd %zmm0, %zmm3, %zmm0
4572 ; CHECK-NEXT:    retq
4573   %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)
4574   %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)
4575   %res2 = add <16 x i32> %res, %res1
4576   ret <16 x i32> %res2
4577 }
4578
4579 declare <8 x i64> @llvm.x86.avx512.mask.pternlog.q.512(<8 x i64>, <8 x i64>, <8 x i64>, i32, i8)
4580
4581 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) {
4582 ; CHECK-LABEL: test_int_x86_avx512_mask_pternlog_q_512:
4583 ; CHECK:       ## BB#0:
4584 ; CHECK-NEXT:    movzbl %dil, %eax
4585 ; CHECK-NEXT:    kmovw %eax, %k1
4586 ; CHECK-NEXT:    vmovaps %zmm0, %zmm3
4587 ; CHECK-NEXT:    vpternlogq $33, %zmm2, %zmm1, %zmm3 {%k1}
4588 ; CHECK-NEXT:    vpternlogq $33, %zmm2, %zmm1, %zmm0
4589 ; CHECK-NEXT:    vpaddq %zmm0, %zmm3, %zmm0
4590 ; CHECK-NEXT:    retq
4591   %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)
4592   %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)
4593   %res2 = add <8 x i64> %res, %res1
4594   ret <8 x i64> %res2
4595 }
4596
4597 declare <8 x i64> @llvm.x86.avx512.maskz.pternlog.q.512(<8 x i64>, <8 x i64>, <8 x i64>, i32, i8)
4598
4599 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) {
4600 ; CHECK-LABEL: test_int_x86_avx512_maskz_pternlog_q_512:
4601 ; CHECK:       ## BB#0:
4602 ; CHECK-NEXT:    movzbl %dil, %eax
4603 ; CHECK-NEXT:    kmovw %eax, %k1
4604 ; CHECK-NEXT:    vmovaps %zmm0, %zmm3
4605 ; CHECK-NEXT:    vpternlogq $33, %zmm2, %zmm1, %zmm3 {%k1} {z}
4606 ; CHECK-NEXT:    vpternlogq $33, %zmm2, %zmm1, %zmm0
4607 ; CHECK-NEXT:    vpaddq %zmm0, %zmm3, %zmm0
4608 ; CHECK-NEXT:    retq
4609   %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)
4610   %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)
4611   %res2 = add <8 x i64> %res, %res1
4612   ret <8 x i64> %res2
4613 }
4614