]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/CodeGen/X86/avx512-intrinsics-upgrade.ll
Vendor import of llvm trunk r291274:
[FreeBSD/FreeBSD.git] / test / CodeGen / X86 / avx512-intrinsics-upgrade.ll
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=knl | FileCheck %s
3
4 declare <16 x float> @llvm.x86.avx512.mask.broadcast.ss.ps.512(<4 x float>, <16 x float>, i16) nounwind readonly
5
6 define <16 x float> @test_x86_vbroadcast_ss_ps_512(<4 x float> %a0, <16 x float> %a1, i16 %mask ) {
7 ; CHECK-LABEL: test_x86_vbroadcast_ss_ps_512:
8 ; CHECK:       ## BB#0:
9 ; CHECK-NEXT:    vbroadcastss %xmm0, %zmm2
10 ; CHECK-NEXT:    kmovw %edi, %k1
11 ; CHECK-NEXT:    vbroadcastss %xmm0, %zmm1 {%k1}
12 ; CHECK-NEXT:    vbroadcastss %xmm0, %zmm0 {%k1} {z}
13 ; CHECK-NEXT:    vaddps %zmm1, %zmm2, %zmm1
14 ; CHECK-NEXT:    vaddps %zmm1, %zmm0, %zmm0
15 ; CHECK-NEXT:    retq
16
17   %res = call <16 x float> @llvm.x86.avx512.mask.broadcast.ss.ps.512(<4 x float> %a0, <16 x float> zeroinitializer, i16 -1)
18   %res1 = call <16 x float> @llvm.x86.avx512.mask.broadcast.ss.ps.512(<4 x float> %a0, <16 x float> %a1, i16 %mask)
19   %res2 = call <16 x float> @llvm.x86.avx512.mask.broadcast.ss.ps.512(<4 x float> %a0, <16 x float> zeroinitializer, i16 %mask)
20   %res3 = fadd <16 x float> %res, %res1
21   %res4 = fadd <16 x float> %res2, %res3
22   ret <16 x float> %res4
23 }
24
25 declare <8 x double> @llvm.x86.avx512.mask.broadcast.sd.pd.512(<2 x double>, <8 x double>, i8) nounwind readonly
26
27 define <8 x double> @test_x86_vbroadcast_sd_pd_512(<2 x double> %a0, <8 x double> %a1, i8 %mask ) {
28 ; CHECK-LABEL: test_x86_vbroadcast_sd_pd_512:
29 ; CHECK:       ## BB#0:
30 ; CHECK-NEXT:    vbroadcastsd %xmm0, %zmm2
31 ; CHECK-NEXT:    kmovw %edi, %k1
32 ; CHECK-NEXT:    vbroadcastsd %xmm0, %zmm1 {%k1}
33 ; CHECK-NEXT:    vbroadcastsd %xmm0, %zmm0 {%k1} {z}
34 ; CHECK-NEXT:    vaddpd %zmm1, %zmm2, %zmm1
35 ; CHECK-NEXT:    vaddpd %zmm1, %zmm0, %zmm0
36 ; CHECK-NEXT:    retq
37
38   %res = call <8 x double> @llvm.x86.avx512.mask.broadcast.sd.pd.512(<2 x double> %a0, <8 x double> zeroinitializer, i8 -1)
39   %res1 = call <8 x double> @llvm.x86.avx512.mask.broadcast.sd.pd.512(<2 x double> %a0, <8 x double> %a1, i8 %mask)
40   %res2 = call <8 x double> @llvm.x86.avx512.mask.broadcast.sd.pd.512(<2 x double> %a0, <8 x double> zeroinitializer, i8 %mask)
41   %res3 = fadd <8 x double> %res, %res1
42   %res4 = fadd <8 x double> %res2, %res3
43   ret <8 x double> %res4
44 }
45
46 declare <16 x i32> @llvm.x86.avx512.pbroadcastd.512(<4 x i32>, <16 x i32>, i16)
47
48 define <16 x i32>@test_int_x86_avx512_pbroadcastd_512(<4 x i32> %x0, <16 x i32> %x1, i16 %mask) {
49 ; CHECK-LABEL: test_int_x86_avx512_pbroadcastd_512:
50 ; CHECK:       ## BB#0:
51 ; CHECK-NEXT:    vpbroadcastd %xmm0, %zmm2
52 ; CHECK-NEXT:    kmovw %edi, %k1
53 ; CHECK-NEXT:    vpbroadcastd %xmm0, %zmm1 {%k1}
54 ; CHECK-NEXT:    vpbroadcastd %xmm0, %zmm0 {%k1} {z}
55 ; CHECK-NEXT:    vpaddd %zmm1, %zmm2, %zmm1
56 ; CHECK-NEXT:    vpaddd %zmm1, %zmm0, %zmm0
57 ; CHECK-NEXT:    retq
58   %res = call <16 x i32> @llvm.x86.avx512.pbroadcastd.512(<4 x i32> %x0, <16 x i32> %x1, i16 -1)
59   %res1 = call <16 x i32> @llvm.x86.avx512.pbroadcastd.512(<4 x i32> %x0, <16 x i32> %x1, i16 %mask)
60   %res2 = call <16 x i32> @llvm.x86.avx512.pbroadcastd.512(<4 x i32> %x0, <16 x i32> zeroinitializer, i16 %mask)
61   %res3 = add <16 x i32> %res, %res1
62   %res4 = add <16 x i32> %res2, %res3
63   ret <16 x i32> %res4
64 }
65
66 declare <8 x i64> @llvm.x86.avx512.pbroadcastq.512(<2 x i64>, <8 x i64>, i8)
67
68 define <8 x i64>@test_int_x86_avx512_pbroadcastq_512(<2 x i64> %x0, <8 x i64> %x1, i8 %mask) {
69 ; CHECK-LABEL: test_int_x86_avx512_pbroadcastq_512:
70 ; CHECK:       ## BB#0:
71 ; CHECK-NEXT:    vpbroadcastq %xmm0, %zmm2
72 ; CHECK-NEXT:    kmovw %edi, %k1
73 ; CHECK-NEXT:    vpbroadcastq %xmm0, %zmm1 {%k1}
74 ; CHECK-NEXT:    vpbroadcastq %xmm0, %zmm0 {%k1} {z}
75 ; CHECK-NEXT:    vpaddq %zmm1, %zmm2, %zmm1
76 ; CHECK-NEXT:    vpaddq %zmm1, %zmm0, %zmm0
77 ; CHECK-NEXT:    retq
78   %res = call <8 x i64> @llvm.x86.avx512.pbroadcastq.512(<2 x i64> %x0, <8 x i64> %x1,i8 -1)
79   %res1 = call <8 x i64> @llvm.x86.avx512.pbroadcastq.512(<2 x i64> %x0, <8 x i64> %x1,i8 %mask)
80   %res2 = call <8 x i64> @llvm.x86.avx512.pbroadcastq.512(<2 x i64> %x0, <8 x i64> zeroinitializer,i8 %mask)
81   %res3 = add <8 x i64> %res, %res1
82   %res4 = add <8 x i64> %res2, %res3
83   ret <8 x i64> %res4
84 }
85
86 declare <16 x float> @llvm.x86.avx512.mask.movsldup.512(<16 x float>, <16 x float>, i16)
87
88 define <16 x float>@test_int_x86_avx512_mask_movsldup_512(<16 x float> %x0, <16 x float> %x1, i16 %x2) {
89 ; CHECK-LABEL: test_int_x86_avx512_mask_movsldup_512:
90 ; CHECK:       ## BB#0:
91 ; CHECK-NEXT:    vmovsldup {{.*#+}} zmm2 = zmm0[0,0,2,2,4,4,6,6,8,8,10,10,12,12,14,14]
92 ; CHECK-NEXT:    kmovw %edi, %k1
93 ; CHECK-NEXT:    vmovsldup {{.*#+}} zmm1 {%k1} = zmm0[0,0,2,2,4,4,6,6,8,8,10,10,12,12,14,14]
94 ; CHECK-NEXT:    vmovsldup {{.*#+}} zmm0 {%k1} {z} = zmm0[0,0,2,2,4,4,6,6,8,8,10,10,12,12,14,14]
95 ; CHECK-NEXT:    vaddps %zmm2, %zmm1, %zmm1
96 ; CHECK-NEXT:    vaddps %zmm1, %zmm0, %zmm0
97 ; CHECK-NEXT:    retq
98   %res = call <16 x float> @llvm.x86.avx512.mask.movsldup.512(<16 x float> %x0, <16 x float> %x1, i16 %x2)
99   %res1 = call <16 x float> @llvm.x86.avx512.mask.movsldup.512(<16 x float> %x0, <16 x float> %x1, i16 -1)
100   %res2 = call <16 x float> @llvm.x86.avx512.mask.movsldup.512(<16 x float> %x0, <16 x float> zeroinitializer, i16 %x2)
101   %res3 = fadd <16 x float> %res, %res1
102   %res4 = fadd <16 x float> %res2, %res3
103   ret <16 x float> %res4
104 }
105
106 declare <16 x float> @llvm.x86.avx512.mask.movshdup.512(<16 x float>, <16 x float>, i16)
107
108 define <16 x float>@test_int_x86_avx512_mask_movshdup_512(<16 x float> %x0, <16 x float> %x1, i16 %x2) {
109 ; CHECK-LABEL: test_int_x86_avx512_mask_movshdup_512:
110 ; CHECK:       ## BB#0:
111 ; CHECK-NEXT:    vmovshdup {{.*#+}} zmm2 = zmm0[1,1,3,3,5,5,7,7,9,9,11,11,13,13,15,15]
112 ; CHECK-NEXT:    kmovw %edi, %k1
113 ; CHECK-NEXT:    vmovshdup {{.*#+}} zmm1 {%k1} = zmm0[1,1,3,3,5,5,7,7,9,9,11,11,13,13,15,15]
114 ; CHECK-NEXT:    vmovshdup {{.*#+}} zmm0 {%k1} {z} = zmm0[1,1,3,3,5,5,7,7,9,9,11,11,13,13,15,15]
115 ; CHECK-NEXT:    vaddps %zmm2, %zmm1, %zmm1
116 ; CHECK-NEXT:    vaddps %zmm1, %zmm0, %zmm0
117 ; CHECK-NEXT:    retq
118   %res = call <16 x float> @llvm.x86.avx512.mask.movshdup.512(<16 x float> %x0, <16 x float> %x1, i16 %x2)
119   %res1 = call <16 x float> @llvm.x86.avx512.mask.movshdup.512(<16 x float> %x0, <16 x float> %x1, i16 -1)
120   %res2 = call <16 x float> @llvm.x86.avx512.mask.movshdup.512(<16 x float> %x0, <16 x float> zeroinitializer, i16 %x2)
121   %res3 = fadd <16 x float> %res, %res1
122   %res4 = fadd <16 x float> %res2, %res3
123   ret <16 x float> %res4
124 }
125
126 declare <8 x double> @llvm.x86.avx512.mask.movddup.512(<8 x double>, <8 x double>, i8)
127
128 define <8 x double>@test_int_x86_avx512_mask_movddup_512(<8 x double> %x0, <8 x double> %x1, i8 %x2) {
129 ; CHECK-LABEL: test_int_x86_avx512_mask_movddup_512:
130 ; CHECK:       ## BB#0:
131 ; CHECK-NEXT:    vmovddup {{.*#+}} zmm2 = zmm0[0,0,2,2,4,4,6,6]
132 ; CHECK-NEXT:    kmovw %edi, %k1
133 ; CHECK-NEXT:    vmovddup {{.*#+}} zmm1 {%k1} = zmm0[0,0,2,2,4,4,6,6]
134 ; CHECK-NEXT:    vmovddup {{.*#+}} zmm0 {%k1} {z} = zmm0[0,0,2,2,4,4,6,6]
135 ; CHECK-NEXT:    vaddpd %zmm2, %zmm1, %zmm1
136 ; CHECK-NEXT:    vaddpd %zmm1, %zmm0, %zmm0
137 ; CHECK-NEXT:    retq
138   %res = call <8 x double> @llvm.x86.avx512.mask.movddup.512(<8 x double> %x0, <8 x double> %x1, i8 %x2)
139   %res1 = call <8 x double> @llvm.x86.avx512.mask.movddup.512(<8 x double> %x0, <8 x double> %x1, i8 -1)
140   %res2 = call <8 x double> @llvm.x86.avx512.mask.movddup.512(<8 x double> %x0, <8 x double> zeroinitializer, i8 %x2)
141   %res3 = fadd <8 x double> %res, %res1
142   %res4 = fadd <8 x double> %res2, %res3
143   ret <8 x double> %res4
144 }
145
146 declare <8 x double> @llvm.x86.avx512.mask.perm.df.512(<8 x double>, i32, <8 x double>, i8)
147
148 define <8 x double>@test_int_x86_avx512_mask_perm_df_512(<8 x double> %x0, i32 %x1, <8 x double> %x2, i8 %x3) {
149 ; CHECK-LABEL: test_int_x86_avx512_mask_perm_df_512:
150 ; CHECK:       ## BB#0:
151 ; CHECK-NEXT:    vpermpd {{.*#+}} zmm2 = zmm0[3,0,0,0,7,4,4,4]
152 ; CHECK-NEXT:    kmovw %esi, %k1
153 ; CHECK-NEXT:    vpermpd {{.*#+}} zmm1 {%k1} = zmm0[3,0,0,0,7,4,4,4]
154 ; CHECK-NEXT:    vpermpd {{.*#+}} zmm0 {%k1} {z} = zmm0[3,0,0,0,7,4,4,4]
155 ; CHECK-NEXT:    vaddpd %zmm0, %zmm1, %zmm0
156 ; CHECK-NEXT:    vaddpd %zmm2, %zmm0, %zmm0
157 ; CHECK-NEXT:    retq
158   %res = call <8 x double> @llvm.x86.avx512.mask.perm.df.512(<8 x double> %x0, i32 3, <8 x double> %x2, i8 %x3)
159   %res1 = call <8 x double> @llvm.x86.avx512.mask.perm.df.512(<8 x double> %x0, i32 3, <8 x double> zeroinitializer, i8 %x3)
160   %res2 = call <8 x double> @llvm.x86.avx512.mask.perm.df.512(<8 x double> %x0, i32 3, <8 x double> %x2, i8 -1)
161   %res3 = fadd <8 x double> %res, %res1
162   %res4 = fadd <8 x double> %res3, %res2
163   ret <8 x double> %res4
164 }
165
166 declare <8 x i64> @llvm.x86.avx512.mask.perm.di.512(<8 x i64>, i32, <8 x i64>, i8)
167
168 define <8 x i64>@test_int_x86_avx512_mask_perm_di_512(<8 x i64> %x0, i32 %x1, <8 x i64> %x2, i8 %x3) {
169 ; CHECK-LABEL: test_int_x86_avx512_mask_perm_di_512:
170 ; CHECK:       ## BB#0:
171 ; CHECK-NEXT:    vpermq {{.*#+}} zmm2 = zmm0[3,0,0,0,7,4,4,4]
172 ; CHECK-NEXT:    kmovw %esi, %k1
173 ; CHECK-NEXT:    vpermq {{.*#+}} zmm1 {%k1} = zmm0[3,0,0,0,7,4,4,4]
174 ; CHECK-NEXT:    vpermq {{.*#+}} zmm0 {%k1} {z} = zmm0[3,0,0,0,7,4,4,4]
175 ; CHECK-NEXT:    vpaddq %zmm0, %zmm1, %zmm0
176 ; CHECK-NEXT:    vpaddq %zmm2, %zmm0, %zmm0
177 ; CHECK-NEXT:    retq
178   %res = call <8 x i64> @llvm.x86.avx512.mask.perm.di.512(<8 x i64> %x0, i32 3, <8 x i64> %x2, i8 %x3)
179   %res1 = call <8 x i64> @llvm.x86.avx512.mask.perm.di.512(<8 x i64> %x0, i32 3, <8 x i64> zeroinitializer, i8 %x3)
180   %res2 = call <8 x i64> @llvm.x86.avx512.mask.perm.di.512(<8 x i64> %x0, i32 3, <8 x i64> %x2, i8 -1)
181   %res3 = add <8 x i64> %res, %res1
182   %res4 = add <8 x i64> %res3, %res2
183   ret <8 x i64> %res4
184 }
185
186 define void @test_store1(<16 x float> %data, i8* %ptr, i8* %ptr2, i16 %mask) {
187 ; CHECK-LABEL: test_store1:
188 ; CHECK:       ## BB#0:
189 ; CHECK-NEXT:    kmovw %edx, %k1
190 ; CHECK-NEXT:    vmovups %zmm0, (%rdi) {%k1}
191 ; CHECK-NEXT:    vmovups %zmm0, (%rsi)
192 ; CHECK-NEXT:    retq
193   call void @llvm.x86.avx512.mask.storeu.ps.512(i8* %ptr, <16 x float> %data, i16 %mask)
194   call void @llvm.x86.avx512.mask.storeu.ps.512(i8* %ptr2, <16 x float> %data, i16 -1)
195   ret void
196 }
197
198 declare void @llvm.x86.avx512.mask.storeu.ps.512(i8*, <16 x float>, i16 )
199
200 define void @test_store2(<8 x double> %data, i8* %ptr, i8* %ptr2, i8 %mask) {
201 ; CHECK-LABEL: test_store2:
202 ; CHECK:       ## BB#0:
203 ; CHECK-NEXT:    kmovw %edx, %k1
204 ; CHECK-NEXT:    vmovupd %zmm0, (%rdi) {%k1}
205 ; CHECK-NEXT:    vmovupd %zmm0, (%rsi)
206 ; CHECK-NEXT:    retq
207   call void @llvm.x86.avx512.mask.storeu.pd.512(i8* %ptr, <8 x double> %data, i8 %mask)
208   call void @llvm.x86.avx512.mask.storeu.pd.512(i8* %ptr2, <8 x double> %data, i8 -1)
209   ret void
210 }
211
212 declare void @llvm.x86.avx512.mask.storeu.pd.512(i8*, <8 x double>, i8)
213
214 define void @test_mask_store_aligned_ps(<16 x float> %data, i8* %ptr, i8* %ptr2, i16 %mask) {
215 ; CHECK-LABEL: test_mask_store_aligned_ps:
216 ; CHECK:       ## BB#0:
217 ; CHECK-NEXT:    kmovw %edx, %k1
218 ; CHECK-NEXT:    vmovaps %zmm0, (%rdi) {%k1}
219 ; CHECK-NEXT:    vmovaps %zmm0, (%rsi)
220 ; CHECK-NEXT:    retq
221   call void @llvm.x86.avx512.mask.store.ps.512(i8* %ptr, <16 x float> %data, i16 %mask)
222   call void @llvm.x86.avx512.mask.store.ps.512(i8* %ptr2, <16 x float> %data, i16 -1)
223   ret void
224 }
225
226 declare void @llvm.x86.avx512.mask.store.ps.512(i8*, <16 x float>, i16 )
227
228 define void @test_mask_store_aligned_pd(<8 x double> %data, i8* %ptr, i8* %ptr2, i8 %mask) {
229 ; CHECK-LABEL: test_mask_store_aligned_pd:
230 ; CHECK:       ## BB#0:
231 ; CHECK-NEXT:    kmovw %edx, %k1
232 ; CHECK-NEXT:    vmovapd %zmm0, (%rdi) {%k1}
233 ; CHECK-NEXT:    vmovapd %zmm0, (%rsi)
234 ; CHECK-NEXT:    retq
235   call void @llvm.x86.avx512.mask.store.pd.512(i8* %ptr, <8 x double> %data, i8 %mask)
236   call void @llvm.x86.avx512.mask.store.pd.512(i8* %ptr2, <8 x double> %data, i8 -1)
237   ret void
238 }
239
240 declare void @llvm.x86.avx512.mask.store.pd.512(i8*, <8 x double>, i8)
241
242 define void@test_int_x86_avx512_mask_storeu_q_512(i8* %ptr1, i8* %ptr2, <8 x i64> %x1, i8 %x2) {
243 ; CHECK-LABEL: test_int_x86_avx512_mask_storeu_q_512:
244 ; CHECK:       ## BB#0:
245 ; CHECK-NEXT:    kmovw %edx, %k1
246 ; CHECK-NEXT:    vmovdqu64 %zmm0, (%rdi) {%k1}
247 ; CHECK-NEXT:    vmovdqu64 %zmm0, (%rsi)
248 ; CHECK-NEXT:    retq
249   call void @llvm.x86.avx512.mask.storeu.q.512(i8* %ptr1, <8 x i64> %x1, i8 %x2)
250   call void @llvm.x86.avx512.mask.storeu.q.512(i8* %ptr2, <8 x i64> %x1, i8 -1)
251   ret void
252 }
253
254 declare void @llvm.x86.avx512.mask.storeu.q.512(i8*, <8 x i64>, i8)
255
256 define void@test_int_x86_avx512_mask_storeu_d_512(i8* %ptr1, i8* %ptr2, <16 x i32> %x1, i16 %x2) {
257 ; CHECK-LABEL: test_int_x86_avx512_mask_storeu_d_512:
258 ; CHECK:       ## BB#0:
259 ; CHECK-NEXT:    kmovw %edx, %k1
260 ; CHECK-NEXT:    vmovdqu32 %zmm0, (%rdi) {%k1}
261 ; CHECK-NEXT:    vmovdqu32 %zmm0, (%rsi)
262 ; CHECK-NEXT:    retq
263   call void @llvm.x86.avx512.mask.storeu.d.512(i8* %ptr1, <16 x i32> %x1, i16 %x2)
264   call void @llvm.x86.avx512.mask.storeu.d.512(i8* %ptr2, <16 x i32> %x1, i16 -1)
265   ret void
266 }
267
268 declare void @llvm.x86.avx512.mask.storeu.d.512(i8*, <16 x i32>, i16)
269
270 define void@test_int_x86_avx512_mask_store_q_512(i8* %ptr1, i8* %ptr2, <8 x i64> %x1, i8 %x2) {
271 ; CHECK-LABEL: test_int_x86_avx512_mask_store_q_512:
272 ; CHECK:       ## BB#0:
273 ; CHECK-NEXT:    kmovw %edx, %k1
274 ; CHECK-NEXT:    vmovdqa64 %zmm0, (%rdi) {%k1}
275 ; CHECK-NEXT:    vmovdqa64 %zmm0, (%rsi)
276 ; CHECK-NEXT:    retq
277   call void @llvm.x86.avx512.mask.store.q.512(i8* %ptr1, <8 x i64> %x1, i8 %x2)
278   call void @llvm.x86.avx512.mask.store.q.512(i8* %ptr2, <8 x i64> %x1, i8 -1)
279   ret void
280 }
281
282 declare void @llvm.x86.avx512.mask.store.q.512(i8*, <8 x i64>, i8)
283
284 define void@test_int_x86_avx512_mask_store_d_512(i8* %ptr1, i8* %ptr2, <16 x i32> %x1, i16 %x2) {
285 ; CHECK-LABEL: test_int_x86_avx512_mask_store_d_512:
286 ; CHECK:       ## BB#0:
287 ; CHECK-NEXT:    kmovw %edx, %k1
288 ; CHECK-NEXT:    vmovdqa32 %zmm0, (%rdi) {%k1}
289 ; CHECK-NEXT:    vmovdqa32 %zmm0, (%rsi)
290 ; CHECK-NEXT:    retq
291   call void @llvm.x86.avx512.mask.store.d.512(i8* %ptr1, <16 x i32> %x1, i16 %x2)
292   call void @llvm.x86.avx512.mask.store.d.512(i8* %ptr2, <16 x i32> %x1, i16 -1)
293   ret void
294 }
295
296 declare void @llvm.x86.avx512.mask.store.d.512(i8*, <16 x i32>, i16)
297
298 define <16 x float> @test_mask_load_aligned_ps(<16 x float> %data, i8* %ptr, i16 %mask) {
299 ; CHECK-LABEL: test_mask_load_aligned_ps:
300 ; CHECK:       ## BB#0:
301 ; CHECK-NEXT:    vmovaps (%rdi), %zmm0
302 ; CHECK-NEXT:    kmovw %esi, %k1
303 ; CHECK-NEXT:    vmovaps (%rdi), %zmm0 {%k1}
304 ; CHECK-NEXT:    vmovaps (%rdi), %zmm1 {%k1} {z}
305 ; CHECK-NEXT:    vaddps %zmm0, %zmm1, %zmm0
306 ; CHECK-NEXT:    retq
307   %res = call <16 x float> @llvm.x86.avx512.mask.load.ps.512(i8* %ptr, <16 x float> zeroinitializer, i16 -1)
308   %res1 = call <16 x float> @llvm.x86.avx512.mask.load.ps.512(i8* %ptr, <16 x float> %res, i16 %mask)
309   %res2 = call <16 x float> @llvm.x86.avx512.mask.load.ps.512(i8* %ptr, <16 x float> zeroinitializer, i16 %mask)
310   %res4 = fadd <16 x float> %res2, %res1
311   ret <16 x float> %res4
312 }
313
314 declare <16 x float> @llvm.x86.avx512.mask.load.ps.512(i8*, <16 x float>, i16)
315
316 define <16 x float> @test_mask_load_unaligned_ps(<16 x float> %data, i8* %ptr, i16 %mask) {
317 ; CHECK-LABEL: test_mask_load_unaligned_ps:
318 ; CHECK:       ## BB#0:
319 ; CHECK-NEXT:    vmovups (%rdi), %zmm0
320 ; CHECK-NEXT:    kmovw %esi, %k1
321 ; CHECK-NEXT:    vmovups (%rdi), %zmm0 {%k1}
322 ; CHECK-NEXT:    vmovups (%rdi), %zmm1 {%k1} {z}
323 ; CHECK-NEXT:    vaddps %zmm0, %zmm1, %zmm0
324 ; CHECK-NEXT:    retq
325   %res = call <16 x float> @llvm.x86.avx512.mask.loadu.ps.512(i8* %ptr, <16 x float> zeroinitializer, i16 -1)
326   %res1 = call <16 x float> @llvm.x86.avx512.mask.loadu.ps.512(i8* %ptr, <16 x float> %res, i16 %mask)
327   %res2 = call <16 x float> @llvm.x86.avx512.mask.loadu.ps.512(i8* %ptr, <16 x float> zeroinitializer, i16 %mask)
328   %res4 = fadd <16 x float> %res2, %res1
329   ret <16 x float> %res4
330 }
331
332 declare <16 x float> @llvm.x86.avx512.mask.loadu.ps.512(i8*, <16 x float>, i16)
333
334 define <8 x double> @test_mask_load_aligned_pd(<8 x double> %data, i8* %ptr, i8 %mask) {
335 ; CHECK-LABEL: test_mask_load_aligned_pd:
336 ; CHECK:       ## BB#0:
337 ; CHECK-NEXT:    vmovapd (%rdi), %zmm0
338 ; CHECK-NEXT:    kmovw %esi, %k1
339 ; CHECK-NEXT:    vmovapd (%rdi), %zmm0 {%k1}
340 ; CHECK-NEXT:    vmovapd (%rdi), %zmm1 {%k1} {z}
341 ; CHECK-NEXT:    vaddpd %zmm0, %zmm1, %zmm0
342 ; CHECK-NEXT:    retq
343   %res = call <8 x double> @llvm.x86.avx512.mask.load.pd.512(i8* %ptr, <8 x double> zeroinitializer, i8 -1)
344   %res1 = call <8 x double> @llvm.x86.avx512.mask.load.pd.512(i8* %ptr, <8 x double> %res, i8 %mask)
345   %res2 = call <8 x double> @llvm.x86.avx512.mask.load.pd.512(i8* %ptr, <8 x double> zeroinitializer, i8 %mask)
346   %res4 = fadd <8 x double> %res2, %res1
347   ret <8 x double> %res4
348 }
349
350 declare <8 x double> @llvm.x86.avx512.mask.load.pd.512(i8*, <8 x double>, i8)
351
352 define <8 x double> @test_mask_load_unaligned_pd(<8 x double> %data, i8* %ptr, i8 %mask) {
353 ; CHECK-LABEL: test_mask_load_unaligned_pd:
354 ; CHECK:       ## BB#0:
355 ; CHECK-NEXT:    vmovupd (%rdi), %zmm0
356 ; CHECK-NEXT:    kmovw %esi, %k1
357 ; CHECK-NEXT:    vmovupd (%rdi), %zmm0 {%k1}
358 ; CHECK-NEXT:    vmovupd (%rdi), %zmm1 {%k1} {z}
359 ; CHECK-NEXT:    vaddpd %zmm0, %zmm1, %zmm0
360 ; CHECK-NEXT:    retq
361   %res = call <8 x double> @llvm.x86.avx512.mask.loadu.pd.512(i8* %ptr, <8 x double> zeroinitializer, i8 -1)
362   %res1 = call <8 x double> @llvm.x86.avx512.mask.loadu.pd.512(i8* %ptr, <8 x double> %res, i8 %mask)
363   %res2 = call <8 x double> @llvm.x86.avx512.mask.loadu.pd.512(i8* %ptr, <8 x double> zeroinitializer, i8 %mask)
364   %res4 = fadd <8 x double> %res2, %res1
365   ret <8 x double> %res4
366 }
367
368 declare <8 x double> @llvm.x86.avx512.mask.loadu.pd.512(i8*, <8 x double>, i8)
369
370 declare <16 x i32> @llvm.x86.avx512.mask.loadu.d.512(i8*, <16 x i32>, i16)
371
372 define <16 x i32> @test_mask_load_unaligned_d(i8* %ptr, i8* %ptr2, <16 x i32> %data, i16 %mask) {
373 ; CHECK-LABEL: test_mask_load_unaligned_d:
374 ; CHECK:       ## BB#0:
375 ; CHECK-NEXT:    vmovdqu32 (%rdi), %zmm0
376 ; CHECK-NEXT:    kmovw %edx, %k1
377 ; CHECK-NEXT:    vmovdqu32 (%rsi), %zmm0 {%k1}
378 ; CHECK-NEXT:    vmovdqu32 (%rdi), %zmm1 {%k1} {z}
379 ; CHECK-NEXT:    vpaddd %zmm0, %zmm1, %zmm0
380 ; CHECK-NEXT:    retq
381   %res = call <16 x i32> @llvm.x86.avx512.mask.loadu.d.512(i8* %ptr, <16 x i32> zeroinitializer, i16 -1)
382   %res1 = call <16 x i32> @llvm.x86.avx512.mask.loadu.d.512(i8* %ptr2, <16 x i32> %res, i16 %mask)
383   %res2 = call <16 x i32> @llvm.x86.avx512.mask.loadu.d.512(i8* %ptr, <16 x i32> zeroinitializer, i16 %mask)
384   %res4 = add <16 x i32> %res2, %res1
385   ret <16 x i32> %res4
386 }
387
388 declare <8 x i64> @llvm.x86.avx512.mask.loadu.q.512(i8*, <8 x i64>, i8)
389
390 define <8 x i64> @test_mask_load_unaligned_q(i8* %ptr, i8* %ptr2, <8 x i64> %data, i8 %mask) {
391 ; CHECK-LABEL: test_mask_load_unaligned_q:
392 ; CHECK:       ## BB#0:
393 ; CHECK-NEXT:    vmovdqu64 (%rdi), %zmm0
394 ; CHECK-NEXT:    kmovw %edx, %k1
395 ; CHECK-NEXT:    vmovdqu64 (%rsi), %zmm0 {%k1}
396 ; CHECK-NEXT:    vmovdqu64 (%rdi), %zmm1 {%k1} {z}
397 ; CHECK-NEXT:    vpaddq %zmm0, %zmm1, %zmm0
398 ; CHECK-NEXT:    retq
399   %res = call <8 x i64> @llvm.x86.avx512.mask.loadu.q.512(i8* %ptr, <8 x i64> zeroinitializer, i8 -1)
400   %res1 = call <8 x i64> @llvm.x86.avx512.mask.loadu.q.512(i8* %ptr2, <8 x i64> %res, i8 %mask)
401   %res2 = call <8 x i64> @llvm.x86.avx512.mask.loadu.q.512(i8* %ptr, <8 x i64> zeroinitializer, i8 %mask)
402   %res4 = add <8 x i64> %res2, %res1
403   ret <8 x i64> %res4
404 }
405
406 declare <16 x i32> @llvm.x86.avx512.mask.load.d.512(i8*, <16 x i32>, i16)
407
408 define <16 x i32> @test_mask_load_aligned_d(<16 x i32> %data, i8* %ptr, i16 %mask) {
409 ; CHECK-LABEL: test_mask_load_aligned_d:
410 ; CHECK:       ## BB#0:
411 ; CHECK-NEXT:    vmovdqa32 (%rdi), %zmm0
412 ; CHECK-NEXT:    kmovw %esi, %k1
413 ; CHECK-NEXT:    vmovdqa32 (%rdi), %zmm0 {%k1}
414 ; CHECK-NEXT:    vmovdqa32 (%rdi), %zmm1 {%k1} {z}
415 ; CHECK-NEXT:    vpaddd %zmm0, %zmm1, %zmm0
416 ; CHECK-NEXT:    retq
417   %res = call <16 x i32> @llvm.x86.avx512.mask.load.d.512(i8* %ptr, <16 x i32> zeroinitializer, i16 -1)
418   %res1 = call <16 x i32> @llvm.x86.avx512.mask.load.d.512(i8* %ptr, <16 x i32> %res, i16 %mask)
419   %res2 = call <16 x i32> @llvm.x86.avx512.mask.load.d.512(i8* %ptr, <16 x i32> zeroinitializer, i16 %mask)
420   %res4 = add <16 x i32> %res2, %res1
421   ret <16 x i32> %res4
422 }
423
424 declare <8 x i64> @llvm.x86.avx512.mask.load.q.512(i8*, <8 x i64>, i8)
425
426 define <8 x i64> @test_mask_load_aligned_q(<8 x i64> %data, i8* %ptr, i8 %mask) {
427 ; CHECK-LABEL: test_mask_load_aligned_q:
428 ; CHECK:       ## BB#0:
429 ; CHECK-NEXT:    vmovdqa64 (%rdi), %zmm0
430 ; CHECK-NEXT:    kmovw %esi, %k1
431 ; CHECK-NEXT:    vmovdqa64 (%rdi), %zmm0 {%k1}
432 ; CHECK-NEXT:    vmovdqa64 (%rdi), %zmm1 {%k1} {z}
433 ; CHECK-NEXT:    vpaddq %zmm0, %zmm1, %zmm0
434 ; CHECK-NEXT:    retq
435   %res = call <8 x i64> @llvm.x86.avx512.mask.load.q.512(i8* %ptr, <8 x i64> zeroinitializer, i8 -1)
436   %res1 = call <8 x i64> @llvm.x86.avx512.mask.load.q.512(i8* %ptr, <8 x i64> %res, i8 %mask)
437   %res2 = call <8 x i64> @llvm.x86.avx512.mask.load.q.512(i8* %ptr, <8 x i64> zeroinitializer, i8 %mask)
438   %res4 = add <8 x i64> %res2, %res1
439   ret <8 x i64> %res4
440 }
441
442 declare <8 x double> @llvm.x86.avx512.mask.vpermil.pd.512(<8 x double>, i32, <8 x double>, i8)
443
444 define <8 x double>@test_int_x86_avx512_mask_vpermil_pd_512(<8 x double> %x0, <8 x double> %x2, i8 %x3) {
445 ; CHECK-LABEL: test_int_x86_avx512_mask_vpermil_pd_512:
446 ; CHECK:       ## BB#0:
447 ; CHECK-NEXT:    vpermilpd {{.*#+}} zmm2 = zmm0[0,1,3,2,5,4,6,6]
448 ; CHECK-NEXT:    kmovw %edi, %k1
449 ; CHECK-NEXT:    vpermilpd {{.*#+}} zmm1 {%k1} = zmm0[0,1,3,2,5,4,6,6]
450 ; CHECK-NEXT:    vpermilpd {{.*#+}} zmm0 {%k1} {z} = zmm0[0,1,3,2,5,4,6,6]
451 ; CHECK-NEXT:    vaddpd %zmm0, %zmm1, %zmm0
452 ; CHECK-NEXT:    vaddpd %zmm2, %zmm0, %zmm0
453 ; CHECK-NEXT:    retq
454   %res = call <8 x double> @llvm.x86.avx512.mask.vpermil.pd.512(<8 x double> %x0, i32 22, <8 x double> %x2, i8 %x3)
455   %res1 = call <8 x double> @llvm.x86.avx512.mask.vpermil.pd.512(<8 x double> %x0, i32 22, <8 x double> zeroinitializer, i8 %x3)
456   %res2 = call <8 x double> @llvm.x86.avx512.mask.vpermil.pd.512(<8 x double> %x0, i32 22, <8 x double> %x2, i8 -1)
457   %res3 = fadd <8 x double> %res, %res1
458   %res4 = fadd <8 x double> %res3, %res2
459   ret <8 x double> %res4
460 }
461
462 declare <16 x float> @llvm.x86.avx512.mask.vpermil.ps.512(<16 x float>, i32, <16 x float>, i16)
463
464 define <16 x float>@test_int_x86_avx512_mask_vpermil_ps_512(<16 x float> %x0, <16 x float> %x2, i16 %x3) {
465 ; CHECK-LABEL: test_int_x86_avx512_mask_vpermil_ps_512:
466 ; CHECK:       ## BB#0:
467 ; CHECK-NEXT:    vpermilps {{.*#+}} zmm2 = zmm0[2,1,1,0,6,5,5,4,10,9,9,8,14,13,13,12]
468 ; CHECK-NEXT:    kmovw %edi, %k1
469 ; CHECK-NEXT:    vpermilps {{.*#+}} zmm1 {%k1} = zmm0[2,1,1,0,6,5,5,4,10,9,9,8,14,13,13,12]
470 ; CHECK-NEXT:    vpermilps {{.*#+}} zmm0 {%k1} {z} = zmm0[2,1,1,0,6,5,5,4,10,9,9,8,14,13,13,12]
471 ; CHECK-NEXT:    vaddps %zmm0, %zmm1, %zmm0
472 ; CHECK-NEXT:    vaddps %zmm2, %zmm0, %zmm0
473 ; CHECK-NEXT:    retq
474   %res = call <16 x float> @llvm.x86.avx512.mask.vpermil.ps.512(<16 x float> %x0, i32 22, <16 x float> %x2, i16 %x3)
475   %res1 = call <16 x float> @llvm.x86.avx512.mask.vpermil.ps.512(<16 x float> %x0, i32 22, <16 x float> zeroinitializer, i16 %x3)
476   %res2 = call <16 x float> @llvm.x86.avx512.mask.vpermil.ps.512(<16 x float> %x0, i32 22, <16 x float> %x2, i16 -1)
477   %res3 = fadd <16 x float> %res, %res1
478   %res4 = fadd <16 x float> %res3, %res2
479   ret <16 x float> %res4
480 }
481
482 declare <16 x i32> @llvm.x86.avx512.mask.pshuf.d.512(<16 x i32>, i32, <16 x i32>, i16)
483
484 define <16 x i32>@test_int_x86_avx512_mask_pshuf_d_512(<16 x i32> %x0, i32 %x1, <16 x i32> %x2, i16 %x3) {
485 ; CHECK-LABEL: test_int_x86_avx512_mask_pshuf_d_512:
486 ; CHECK:       ## BB#0:
487 ; CHECK-NEXT:    vpshufd {{.*#+}} zmm2 = zmm0[3,0,0,0,7,4,4,4,11,8,8,8,15,12,12,12]
488 ; CHECK-NEXT:    kmovw %esi, %k1
489 ; CHECK-NEXT:    vpshufd {{.*#+}} zmm1 {%k1} = zmm0[3,0,0,0,7,4,4,4,11,8,8,8,15,12,12,12]
490 ; CHECK-NEXT:    vpshufd {{.*#+}} zmm0 {%k1} {z} = zmm0[3,0,0,0,7,4,4,4,11,8,8,8,15,12,12,12]
491 ; CHECK-NEXT:    vpaddd %zmm0, %zmm1, %zmm0
492 ; CHECK-NEXT:    vpaddd %zmm2, %zmm0, %zmm0
493 ; CHECK-NEXT:    retq
494         %res = call <16 x i32> @llvm.x86.avx512.mask.pshuf.d.512(<16 x i32> %x0, i32 3, <16 x i32> %x2, i16 %x3)
495         %res1 = call <16 x i32> @llvm.x86.avx512.mask.pshuf.d.512(<16 x i32> %x0, i32 3, <16 x i32> zeroinitializer, i16 %x3)
496         %res2 = call <16 x i32> @llvm.x86.avx512.mask.pshuf.d.512(<16 x i32> %x0, i32 3, <16 x i32> %x2, i16 -1)
497         %res3 = add <16 x i32> %res, %res1
498         %res4 = add <16 x i32> %res3, %res2
499         ret <16 x i32> %res4
500 }
501
502 define i16 @test_pcmpeq_d(<16 x i32> %a, <16 x i32> %b) {
503 ; CHECK-LABEL: test_pcmpeq_d:
504 ; CHECK:       ## BB#0:
505 ; CHECK-NEXT:    vpcmpeqd %zmm1, %zmm0, %k0
506 ; CHECK-NEXT:    kmovw %k0, %eax
507 ; CHECK-NEXT:    retq
508   %res = call i16 @llvm.x86.avx512.mask.pcmpeq.d.512(<16 x i32> %a, <16 x i32> %b, i16 -1)
509   ret i16 %res
510 }
511
512 define i16 @test_mask_pcmpeq_d(<16 x i32> %a, <16 x i32> %b, i16 %mask) {
513 ; CHECK-LABEL: test_mask_pcmpeq_d:
514 ; CHECK:       ## BB#0:
515 ; CHECK-NEXT:    kmovw %edi, %k1
516 ; CHECK-NEXT:    vpcmpeqd %zmm1, %zmm0, %k0 {%k1}
517 ; CHECK-NEXT:    kmovw %k0, %eax
518 ; CHECK-NEXT:    retq
519   %res = call i16 @llvm.x86.avx512.mask.pcmpeq.d.512(<16 x i32> %a, <16 x i32> %b, i16 %mask)
520   ret i16 %res
521 }
522
523 declare i16 @llvm.x86.avx512.mask.pcmpeq.d.512(<16 x i32>, <16 x i32>, i16)
524
525 define i8 @test_pcmpeq_q(<8 x i64> %a, <8 x i64> %b) {
526 ; CHECK-LABEL: test_pcmpeq_q:
527 ; CHECK:       ## BB#0:
528 ; CHECK-NEXT:    vpcmpeqq %zmm1, %zmm0, %k0
529 ; CHECK-NEXT:    kmovw %k0, %eax
530 ; CHECK-NEXT:    retq
531   %res = call i8 @llvm.x86.avx512.mask.pcmpeq.q.512(<8 x i64> %a, <8 x i64> %b, i8 -1)
532   ret i8 %res
533 }
534
535 define i8 @test_mask_pcmpeq_q(<8 x i64> %a, <8 x i64> %b, i8 %mask) {
536 ; CHECK-LABEL: test_mask_pcmpeq_q:
537 ; CHECK:       ## BB#0:
538 ; CHECK-NEXT:    kmovw %edi, %k1
539 ; CHECK-NEXT:    vpcmpeqq %zmm1, %zmm0, %k0 {%k1}
540 ; CHECK-NEXT:    kmovw %k0, %eax
541 ; CHECK-NEXT:    retq
542   %res = call i8 @llvm.x86.avx512.mask.pcmpeq.q.512(<8 x i64> %a, <8 x i64> %b, i8 %mask)
543   ret i8 %res
544 }
545
546 declare i8 @llvm.x86.avx512.mask.pcmpeq.q.512(<8 x i64>, <8 x i64>, i8)
547
548 define i16 @test_pcmpgt_d(<16 x i32> %a, <16 x i32> %b) {
549 ; CHECK-LABEL: test_pcmpgt_d:
550 ; CHECK:       ## BB#0:
551 ; CHECK-NEXT:    vpcmpgtd %zmm1, %zmm0, %k0
552 ; CHECK-NEXT:    kmovw %k0, %eax
553 ; CHECK-NEXT:    retq
554   %res = call i16 @llvm.x86.avx512.mask.pcmpgt.d.512(<16 x i32> %a, <16 x i32> %b, i16 -1)
555   ret i16 %res
556 }
557
558 define i16 @test_mask_pcmpgt_d(<16 x i32> %a, <16 x i32> %b, i16 %mask) {
559 ; CHECK-LABEL: test_mask_pcmpgt_d:
560 ; CHECK:       ## BB#0:
561 ; CHECK-NEXT:    kmovw %edi, %k1
562 ; CHECK-NEXT:    vpcmpgtd %zmm1, %zmm0, %k0 {%k1}
563 ; CHECK-NEXT:    kmovw %k0, %eax
564 ; CHECK-NEXT:    retq
565   %res = call i16 @llvm.x86.avx512.mask.pcmpgt.d.512(<16 x i32> %a, <16 x i32> %b, i16 %mask)
566   ret i16 %res
567 }
568
569 declare i16 @llvm.x86.avx512.mask.pcmpgt.d.512(<16 x i32>, <16 x i32>, i16)
570
571 define i8 @test_pcmpgt_q(<8 x i64> %a, <8 x i64> %b) {
572 ; CHECK-LABEL: test_pcmpgt_q:
573 ; CHECK:       ## BB#0:
574 ; CHECK-NEXT:    vpcmpgtq %zmm1, %zmm0, %k0
575 ; CHECK-NEXT:    kmovw %k0, %eax
576 ; CHECK-NEXT:    retq
577   %res = call i8 @llvm.x86.avx512.mask.pcmpgt.q.512(<8 x i64> %a, <8 x i64> %b, i8 -1)
578   ret i8 %res
579 }
580
581 define i8 @test_mask_pcmpgt_q(<8 x i64> %a, <8 x i64> %b, i8 %mask) {
582 ; CHECK-LABEL: test_mask_pcmpgt_q:
583 ; CHECK:       ## BB#0:
584 ; CHECK-NEXT:    kmovw %edi, %k1
585 ; CHECK-NEXT:    vpcmpgtq %zmm1, %zmm0, %k0 {%k1}
586 ; CHECK-NEXT:    kmovw %k0, %eax
587 ; CHECK-NEXT:    retq
588   %res = call i8 @llvm.x86.avx512.mask.pcmpgt.q.512(<8 x i64> %a, <8 x i64> %b, i8 %mask)
589   ret i8 %res
590 }
591
592 declare i8 @llvm.x86.avx512.mask.pcmpgt.q.512(<8 x i64>, <8 x i64>, i8)
593
594 declare <8 x double> @llvm.x86.avx512.mask.unpckh.pd.512(<8 x double>, <8 x double>, <8 x double>, i8)
595
596 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) {
597 ; CHECK-LABEL: test_int_x86_avx512_mask_unpckh_pd_512:
598 ; CHECK:       ## BB#0:
599 ; CHECK-NEXT:    vunpckhpd {{.*#+}} zmm3 = zmm0[1],zmm1[1],zmm0[3],zmm1[3],zmm0[5],zmm1[5],zmm0[7],zmm1[7]
600 ; CHECK-NEXT:    kmovw %edi, %k1
601 ; CHECK-NEXT:    vunpckhpd {{.*#+}} zmm2 {%k1} = zmm0[1],zmm1[1],zmm0[3],zmm1[3],zmm0[5],zmm1[5],zmm0[7],zmm1[7]
602 ; CHECK-NEXT:    vaddpd %zmm3, %zmm2, %zmm0
603 ; CHECK-NEXT:    retq
604   %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)
605   %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)
606   %res2 = fadd <8 x double> %res, %res1
607   ret <8 x double> %res2
608 }
609
610 declare <16 x float> @llvm.x86.avx512.mask.unpckh.ps.512(<16 x float>, <16 x float>, <16 x float>, i16)
611
612 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) {
613 ; CHECK-LABEL: test_int_x86_avx512_mask_unpckh_ps_512:
614 ; CHECK:       ## BB#0:
615 ; CHECK-NEXT:    vunpckhps {{.*#+}} zmm3 = zmm0[2],zmm1[2],zmm0[3],zmm1[3],zmm0[6],zmm1[6],zmm0[7],zmm1[7],zmm0[10],zmm1[10],zmm0[11],zmm1[11],zmm0[14],zmm1[14],zmm0[15],zmm1[15]
616 ; CHECK-NEXT:    kmovw %edi, %k1
617 ; CHECK-NEXT:    vunpckhps {{.*#+}} zmm2 {%k1} = zmm0[2],zmm1[2],zmm0[3],zmm1[3],zmm0[6],zmm1[6],zmm0[7],zmm1[7],zmm0[10],zmm1[10],zmm0[11],zmm1[11],zmm0[14],zmm1[14],zmm0[15],zmm1[15]
618 ; CHECK-NEXT:    vaddps %zmm3, %zmm2, %zmm0
619 ; CHECK-NEXT:    retq
620   %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)
621   %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)
622   %res2 = fadd <16 x float> %res, %res1
623   ret <16 x float> %res2
624 }
625
626 declare <8 x double> @llvm.x86.avx512.mask.unpckl.pd.512(<8 x double>, <8 x double>, <8 x double>, i8)
627
628 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) {
629 ; CHECK-LABEL: test_int_x86_avx512_mask_unpckl_pd_512:
630 ; CHECK:       ## BB#0:
631 ; CHECK-NEXT:    vunpcklpd {{.*#+}} zmm3 = zmm0[0],zmm1[0],zmm0[2],zmm1[2],zmm0[4],zmm1[4],zmm0[6],zmm1[6]
632 ; CHECK-NEXT:    kmovw %edi, %k1
633 ; CHECK-NEXT:    vunpcklpd {{.*#+}} zmm2 {%k1} = zmm0[0],zmm1[0],zmm0[2],zmm1[2],zmm0[4],zmm1[4],zmm0[6],zmm1[6]
634 ; CHECK-NEXT:    vaddpd %zmm3, %zmm2, %zmm0
635 ; CHECK-NEXT:    retq
636   %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)
637   %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)
638   %res2 = fadd <8 x double> %res, %res1
639   ret <8 x double> %res2
640 }
641
642 declare <16 x float> @llvm.x86.avx512.mask.unpckl.ps.512(<16 x float>, <16 x float>, <16 x float>, i16)
643
644 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) {
645 ; CHECK-LABEL: test_int_x86_avx512_mask_unpckl_ps_512:
646 ; CHECK:       ## BB#0:
647 ; CHECK-NEXT:    vunpcklps {{.*#+}} zmm3 = zmm0[0],zmm1[0],zmm0[1],zmm1[1],zmm0[4],zmm1[4],zmm0[5],zmm1[5],zmm0[8],zmm1[8],zmm0[9],zmm1[9],zmm0[12],zmm1[12],zmm0[13],zmm1[13]
648 ; CHECK-NEXT:    kmovw %edi, %k1
649 ; CHECK-NEXT:    vunpcklps {{.*#+}} zmm2 {%k1} = zmm0[0],zmm1[0],zmm0[1],zmm1[1],zmm0[4],zmm1[4],zmm0[5],zmm1[5],zmm0[8],zmm1[8],zmm0[9],zmm1[9],zmm0[12],zmm1[12],zmm0[13],zmm1[13]
650 ; CHECK-NEXT:    vaddps %zmm3, %zmm2, %zmm0
651 ; CHECK-NEXT:    retq
652   %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)
653   %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)
654   %res2 = fadd <16 x float> %res, %res1
655   ret <16 x float> %res2
656 }
657
658 declare <8 x i64> @llvm.x86.avx512.mask.punpcklqd.q.512(<8 x i64>, <8 x i64>, <8 x i64>, i8)
659
660 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) {
661 ; CHECK-LABEL: test_int_x86_avx512_mask_punpcklqd_q_512:
662 ; CHECK:       ## BB#0:
663 ; CHECK-NEXT:    vpunpcklqdq {{.*#+}} zmm3 = zmm0[0],zmm1[0],zmm0[2],zmm1[2],zmm0[4],zmm1[4],zmm0[6],zmm1[6]
664 ; CHECK-NEXT:    kmovw %edi, %k1
665 ; CHECK-NEXT:    vpunpcklqdq {{.*#+}} zmm2 = zmm0[0],zmm1[0],zmm0[2],zmm1[2],zmm0[4],zmm1[4],zmm0[6],zmm1[6]
666 ; CHECK-NEXT:    vpunpcklqdq {{.*#+}} zmm0 = zmm0[0],zmm1[0],zmm0[2],zmm1[2],zmm0[4],zmm1[4],zmm0[6],zmm1[6]
667 ; CHECK-NEXT:    vpaddq %zmm3, %zmm2, %zmm1
668 ; CHECK-NEXT:    vpaddq %zmm1, %zmm0, %zmm0
669 ; CHECK-NEXT:    retq
670   %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)
671   %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)
672   %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)
673   %res3 = add <8 x i64> %res, %res1
674   %res4 = add <8 x i64> %res2, %res3
675   ret <8 x i64> %res4
676 }
677
678 declare <8 x i64> @llvm.x86.avx512.mask.punpckhqd.q.512(<8 x i64>, <8 x i64>, <8 x i64>, i8)
679
680 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) {
681 ; CHECK-LABEL: test_int_x86_avx512_mask_punpckhqd_q_512:
682 ; CHECK:       ## BB#0:
683 ; CHECK-NEXT:    vpunpckhqdq {{.*#+}} zmm3 = zmm0[1],zmm1[1],zmm0[3],zmm1[3],zmm0[5],zmm1[5],zmm0[7],zmm1[7]
684 ; CHECK-NEXT:    kmovw %edi, %k1
685 ; CHECK-NEXT:    vpunpckhqdq {{.*#+}} zmm2 = zmm0[1],zmm1[1],zmm0[3],zmm1[3],zmm0[5],zmm1[5],zmm0[7],zmm1[7]
686 ; CHECK-NEXT:    vpaddq %zmm3, %zmm2, %zmm0
687 ; CHECK-NEXT:    retq
688   %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)
689   %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)
690   %res2 = add <8 x i64> %res, %res1
691   ret <8 x i64> %res2
692 }
693
694 declare <16 x i32> @llvm.x86.avx512.mask.punpckhd.q.512(<16 x i32>, <16 x i32>, <16 x i32>, i16)
695
696 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) {
697 ; CHECK-LABEL: test_int_x86_avx512_mask_punpckhd_q_512:
698 ; CHECK:       ## BB#0:
699 ; CHECK-NEXT:    vpunpckhdq {{.*#+}} zmm3 = zmm0[2],zmm1[2],zmm0[3],zmm1[3],zmm0[6],zmm1[6],zmm0[7],zmm1[7],zmm0[10],zmm1[10],zmm0[11],zmm1[11],zmm0[14],zmm1[14],zmm0[15],zmm1[15]
700 ; CHECK-NEXT:    kmovw %edi, %k1
701 ; CHECK-NEXT:    vpunpckhdq {{.*#+}} zmm2 {%k1} = zmm0[2],zmm1[2],zmm0[3],zmm1[3],zmm0[6],zmm1[6],zmm0[7],zmm1[7],zmm0[10],zmm1[10],zmm0[11],zmm1[11],zmm0[14],zmm1[14],zmm0[15],zmm1[15]
702 ; CHECK-NEXT:    vpaddd %zmm3, %zmm2, %zmm0
703 ; CHECK-NEXT:    retq
704   %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)
705   %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)
706   %res2 = add <16 x i32> %res, %res1
707   ret <16 x i32> %res2
708 }
709
710 declare <16 x i32> @llvm.x86.avx512.mask.punpckld.q.512(<16 x i32>, <16 x i32>, <16 x i32>, i16)
711
712 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) {
713 ; CHECK-LABEL: test_int_x86_avx512_mask_punpckld_q_512:
714 ; CHECK:       ## BB#0:
715 ; CHECK-NEXT:    vpunpckldq {{.*#+}} zmm3 = zmm0[0],zmm1[0],zmm0[1],zmm1[1],zmm0[4],zmm1[4],zmm0[5],zmm1[5],zmm0[8],zmm1[8],zmm0[9],zmm1[9],zmm0[12],zmm1[12],zmm0[13],zmm1[13]
716 ; CHECK-NEXT:    kmovw %edi, %k1
717 ; CHECK-NEXT:    vpunpckldq {{.*#+}} zmm2 {%k1} = zmm0[0],zmm1[0],zmm0[1],zmm1[1],zmm0[4],zmm1[4],zmm0[5],zmm1[5],zmm0[8],zmm1[8],zmm0[9],zmm1[9],zmm0[12],zmm1[12],zmm0[13],zmm1[13]
718 ; CHECK-NEXT:    vpaddd %zmm3, %zmm2, %zmm0
719 ; CHECK-NEXT:    retq
720   %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)
721   %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)
722   %res2 = add <16 x i32> %res, %res1
723   ret <16 x i32> %res2
724 }
725
726 define <16 x i32> @test_x86_avx512_pslli_d(<16 x i32> %a0) {
727 ; CHECK-LABEL: test_x86_avx512_pslli_d:
728 ; CHECK:       ## BB#0:
729 ; CHECK-NEXT:    vpslld $7, %zmm0, %zmm0
730 ; CHECK-NEXT:    retq
731   %res = call <16 x i32> @llvm.x86.avx512.mask.pslli.d(<16 x i32> %a0, i32 7, <16 x i32> zeroinitializer, i16 -1)
732   ret <16 x i32> %res
733 }
734
735 define <16 x i32> @test_x86_avx512_mask_pslli_d(<16 x i32> %a0, <16 x i32> %a1, i16 %mask) {
736 ; CHECK-LABEL: test_x86_avx512_mask_pslli_d:
737 ; CHECK:       ## BB#0:
738 ; CHECK-NEXT:    kmovw %edi, %k1
739 ; CHECK-NEXT:    vpslld $7, %zmm0, %zmm1 {%k1}
740 ; CHECK-NEXT:    vmovdqa64 %zmm1, %zmm0
741 ; CHECK-NEXT:    retq
742   %res = call <16 x i32> @llvm.x86.avx512.mask.pslli.d(<16 x i32> %a0, i32 7, <16 x i32> %a1, i16 %mask)
743   ret <16 x i32> %res
744 }
745
746 define <16 x i32> @test_x86_avx512_maskz_pslli_d(<16 x i32> %a0, i16 %mask) {
747 ; CHECK-LABEL: test_x86_avx512_maskz_pslli_d:
748 ; CHECK:       ## BB#0:
749 ; CHECK-NEXT:    kmovw %edi, %k1
750 ; CHECK-NEXT:    vpslld $7, %zmm0, %zmm0 {%k1} {z}
751 ; CHECK-NEXT:    retq
752   %res = call <16 x i32> @llvm.x86.avx512.mask.pslli.d(<16 x i32> %a0, i32 7, <16 x i32> zeroinitializer, i16 %mask)
753   ret <16 x i32> %res
754 }
755
756 declare <16 x i32> @llvm.x86.avx512.mask.pslli.d(<16 x i32>, i32, <16 x i32>, i16) nounwind readnone
757
758 define <8 x i64> @test_x86_avx512_pslli_q(<8 x i64> %a0) {
759 ; CHECK-LABEL: test_x86_avx512_pslli_q:
760 ; CHECK:       ## BB#0:
761 ; CHECK-NEXT:    vpsllq $7, %zmm0, %zmm0
762 ; CHECK-NEXT:    retq
763   %res = call <8 x i64> @llvm.x86.avx512.mask.pslli.q(<8 x i64> %a0, i32 7, <8 x i64> zeroinitializer, i8 -1)
764   ret <8 x i64> %res
765 }
766
767 define <8 x i64> @test_x86_avx512_mask_pslli_q(<8 x i64> %a0, <8 x i64> %a1, i8 %mask) {
768 ; CHECK-LABEL: test_x86_avx512_mask_pslli_q:
769 ; CHECK:       ## BB#0:
770 ; CHECK-NEXT:    kmovw %edi, %k1
771 ; CHECK-NEXT:    vpsllq $7, %zmm0, %zmm1 {%k1}
772 ; CHECK-NEXT:    vmovdqa64 %zmm1, %zmm0
773 ; CHECK-NEXT:    retq
774   %res = call <8 x i64> @llvm.x86.avx512.mask.pslli.q(<8 x i64> %a0, i32 7, <8 x i64> %a1, i8 %mask)
775   ret <8 x i64> %res
776 }
777
778 define <8 x i64> @test_x86_avx512_maskz_pslli_q(<8 x i64> %a0, i8 %mask) {
779 ; CHECK-LABEL: test_x86_avx512_maskz_pslli_q:
780 ; CHECK:       ## BB#0:
781 ; CHECK-NEXT:    kmovw %edi, %k1
782 ; CHECK-NEXT:    vpsllq $7, %zmm0, %zmm0 {%k1} {z}
783 ; CHECK-NEXT:    retq
784   %res = call <8 x i64> @llvm.x86.avx512.mask.pslli.q(<8 x i64> %a0, i32 7, <8 x i64> zeroinitializer, i8 %mask)
785   ret <8 x i64> %res
786 }
787
788 declare <8 x i64> @llvm.x86.avx512.mask.pslli.q(<8 x i64>, i32, <8 x i64>, i8) nounwind readnone
789
790 define <16 x i32> @test_x86_avx512_psrli_d(<16 x i32> %a0) {
791 ; CHECK-LABEL: test_x86_avx512_psrli_d:
792 ; CHECK:       ## BB#0:
793 ; CHECK-NEXT:    vpsrld $7, %zmm0, %zmm0
794 ; CHECK-NEXT:    retq
795   %res = call <16 x i32> @llvm.x86.avx512.mask.psrli.d(<16 x i32> %a0, i32 7, <16 x i32> zeroinitializer, i16 -1)
796   ret <16 x i32> %res
797 }
798
799 define <16 x i32> @test_x86_avx512_mask_psrli_d(<16 x i32> %a0, <16 x i32> %a1, i16 %mask) {
800 ; CHECK-LABEL: test_x86_avx512_mask_psrli_d:
801 ; CHECK:       ## BB#0:
802 ; CHECK-NEXT:    kmovw %edi, %k1
803 ; CHECK-NEXT:    vpsrld $7, %zmm0, %zmm1 {%k1}
804 ; CHECK-NEXT:    vmovdqa64 %zmm1, %zmm0
805 ; CHECK-NEXT:    retq
806   %res = call <16 x i32> @llvm.x86.avx512.mask.psrli.d(<16 x i32> %a0, i32 7, <16 x i32> %a1, i16 %mask)
807   ret <16 x i32> %res
808 }
809
810 define <16 x i32> @test_x86_avx512_maskz_psrli_d(<16 x i32> %a0, i16 %mask) {
811 ; CHECK-LABEL: test_x86_avx512_maskz_psrli_d:
812 ; CHECK:       ## BB#0:
813 ; CHECK-NEXT:    kmovw %edi, %k1
814 ; CHECK-NEXT:    vpsrld $7, %zmm0, %zmm0 {%k1} {z}
815 ; CHECK-NEXT:    retq
816   %res = call <16 x i32> @llvm.x86.avx512.mask.psrli.d(<16 x i32> %a0, i32 7, <16 x i32> zeroinitializer, i16 %mask)
817   ret <16 x i32> %res
818 }
819
820 declare <16 x i32> @llvm.x86.avx512.mask.psrli.d(<16 x i32>, i32, <16 x i32>, i16) nounwind readnone
821
822 define <8 x i64> @test_x86_avx512_psrli_q(<8 x i64> %a0) {
823 ; CHECK-LABEL: test_x86_avx512_psrli_q:
824 ; CHECK:       ## BB#0:
825 ; CHECK-NEXT:    vpsrlq $7, %zmm0, %zmm0
826 ; CHECK-NEXT:    retq
827   %res = call <8 x i64> @llvm.x86.avx512.mask.psrli.q(<8 x i64> %a0, i32 7, <8 x i64> zeroinitializer, i8 -1)
828   ret <8 x i64> %res
829 }
830
831 define <8 x i64> @test_x86_avx512_mask_psrli_q(<8 x i64> %a0, <8 x i64> %a1, i8 %mask) {
832 ; CHECK-LABEL: test_x86_avx512_mask_psrli_q:
833 ; CHECK:       ## BB#0:
834 ; CHECK-NEXT:    kmovw %edi, %k1
835 ; CHECK-NEXT:    vpsrlq $7, %zmm0, %zmm1 {%k1}
836 ; CHECK-NEXT:    vmovdqa64 %zmm1, %zmm0
837 ; CHECK-NEXT:    retq
838   %res = call <8 x i64> @llvm.x86.avx512.mask.psrli.q(<8 x i64> %a0, i32 7, <8 x i64> %a1, i8 %mask)
839   ret <8 x i64> %res
840 }
841
842 define <8 x i64> @test_x86_avx512_maskz_psrli_q(<8 x i64> %a0, i8 %mask) {
843 ; CHECK-LABEL: test_x86_avx512_maskz_psrli_q:
844 ; CHECK:       ## BB#0:
845 ; CHECK-NEXT:    kmovw %edi, %k1
846 ; CHECK-NEXT:    vpsrlq $7, %zmm0, %zmm0 {%k1} {z}
847 ; CHECK-NEXT:    retq
848   %res = call <8 x i64> @llvm.x86.avx512.mask.psrli.q(<8 x i64> %a0, i32 7, <8 x i64> zeroinitializer, i8 %mask)
849   ret <8 x i64> %res
850 }
851
852 declare <8 x i64> @llvm.x86.avx512.mask.psrli.q(<8 x i64>, i32, <8 x i64>, i8) nounwind readnone
853
854 define <16 x i32> @test_x86_avx512_psrai_d(<16 x i32> %a0) {
855 ; CHECK-LABEL: test_x86_avx512_psrai_d:
856 ; CHECK:       ## BB#0:
857 ; CHECK-NEXT:    vpsrad $7, %zmm0, %zmm0
858 ; CHECK-NEXT:    retq
859   %res = call <16 x i32> @llvm.x86.avx512.mask.psrai.d(<16 x i32> %a0, i32 7, <16 x i32> zeroinitializer, i16 -1)
860   ret <16 x i32> %res
861 }
862
863 define <16 x i32> @test_x86_avx512_mask_psrai_d(<16 x i32> %a0, <16 x i32> %a1, i16 %mask) {
864 ; CHECK-LABEL: test_x86_avx512_mask_psrai_d:
865 ; CHECK:       ## BB#0:
866 ; CHECK-NEXT:    kmovw %edi, %k1
867 ; CHECK-NEXT:    vpsrad $7, %zmm0, %zmm1 {%k1}
868 ; CHECK-NEXT:    vmovdqa64 %zmm1, %zmm0
869 ; CHECK-NEXT:    retq
870   %res = call <16 x i32> @llvm.x86.avx512.mask.psrai.d(<16 x i32> %a0, i32 7, <16 x i32> %a1, i16 %mask)
871   ret <16 x i32> %res
872 }
873
874 define <16 x i32> @test_x86_avx512_maskz_psrai_d(<16 x i32> %a0, i16 %mask) {
875 ; CHECK-LABEL: test_x86_avx512_maskz_psrai_d:
876 ; CHECK:       ## BB#0:
877 ; CHECK-NEXT:    kmovw %edi, %k1
878 ; CHECK-NEXT:    vpsrad $7, %zmm0, %zmm0 {%k1} {z}
879 ; CHECK-NEXT:    retq
880   %res = call <16 x i32> @llvm.x86.avx512.mask.psrai.d(<16 x i32> %a0, i32 7, <16 x i32> zeroinitializer, i16 %mask)
881   ret <16 x i32> %res
882 }
883
884 declare <16 x i32> @llvm.x86.avx512.mask.psrai.d(<16 x i32>, i32, <16 x i32>, i16) nounwind readnone
885
886 define <8 x i64> @test_x86_avx512_psrai_q(<8 x i64> %a0) {
887 ; CHECK-LABEL: test_x86_avx512_psrai_q:
888 ; CHECK:       ## BB#0:
889 ; CHECK-NEXT:    vpsraq $7, %zmm0, %zmm0
890 ; CHECK-NEXT:    retq
891   %res = call <8 x i64> @llvm.x86.avx512.mask.psrai.q(<8 x i64> %a0, i32 7, <8 x i64> zeroinitializer, i8 -1)
892   ret <8 x i64> %res
893 }
894
895 define <8 x i64> @test_x86_avx512_mask_psrai_q(<8 x i64> %a0, <8 x i64> %a1, i8 %mask) {
896 ; CHECK-LABEL: test_x86_avx512_mask_psrai_q:
897 ; CHECK:       ## BB#0:
898 ; CHECK-NEXT:    kmovw %edi, %k1
899 ; CHECK-NEXT:    vpsraq $7, %zmm0, %zmm1 {%k1}
900 ; CHECK-NEXT:    vmovdqa64 %zmm1, %zmm0
901 ; CHECK-NEXT:    retq
902   %res = call <8 x i64> @llvm.x86.avx512.mask.psrai.q(<8 x i64> %a0, i32 7, <8 x i64> %a1, i8 %mask)
903   ret <8 x i64> %res
904 }
905
906 define <8 x i64> @test_x86_avx512_maskz_psrai_q(<8 x i64> %a0, i8 %mask) {
907 ; CHECK-LABEL: test_x86_avx512_maskz_psrai_q:
908 ; CHECK:       ## BB#0:
909 ; CHECK-NEXT:    kmovw %edi, %k1
910 ; CHECK-NEXT:    vpsraq $7, %zmm0, %zmm0 {%k1} {z}
911 ; CHECK-NEXT:    retq
912   %res = call <8 x i64> @llvm.x86.avx512.mask.psrai.q(<8 x i64> %a0, i32 7, <8 x i64> zeroinitializer, i8 %mask)
913   ret <8 x i64> %res
914 }
915
916 declare <8 x i64> @llvm.x86.avx512.mask.psrai.q(<8 x i64>, i32, <8 x i64>, i8) nounwind readnone
917
918 declare void @llvm.x86.avx512.storent.q.512(i8*, <8 x i64>)
919
920 define void@test_storent_q_512(<8 x i64> %data, i8* %ptr) {
921 ; CHECK-LABEL: test_storent_q_512:
922 ; CHECK:       ## BB#0:
923 ; CHECK-NEXT:    vmovntps %zmm0, (%rdi)
924 ; CHECK-NEXT:    retq
925   call void @llvm.x86.avx512.storent.q.512(i8* %ptr, <8 x i64> %data)
926   ret void
927 }
928
929 declare void @llvm.x86.avx512.storent.pd.512(i8*, <8 x double>)
930
931 define void @test_storent_pd_512(<8 x double> %data, i8* %ptr) {
932 ; CHECK-LABEL: test_storent_pd_512:
933 ; CHECK:       ## BB#0:
934 ; CHECK-NEXT:    vmovntps %zmm0, (%rdi)
935 ; CHECK-NEXT:    retq
936   call void @llvm.x86.avx512.storent.pd.512(i8* %ptr, <8 x double> %data)
937   ret void
938 }
939
940 declare void @llvm.x86.avx512.storent.ps.512(i8*, <16 x float>)
941
942 define void @test_storent_ps_512(<16 x float> %data, i8* %ptr) {
943 ; CHECK-LABEL: test_storent_ps_512:
944 ; CHECK:       ## BB#0:
945 ; CHECK-NEXT:    vmovntps %zmm0, (%rdi)
946 ; CHECK-NEXT:    retq
947   call void @llvm.x86.avx512.storent.ps.512(i8* %ptr, <16 x float> %data)
948   ret void
949 }
950
951 define <16 x i32> @test_xor_epi32(<16 x i32> %a, <16 x i32> %b) {
952 ; CHECK-LABEL: test_xor_epi32:
953 ; CHECK:       ## BB#0:
954 ; CHECK-NEXT:    vpxord %zmm1, %zmm0, %zmm0
955 ; CHECK-NEXT:    retq
956   %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)
957   ret < 16 x i32> %res
958 }
959
960 define <16 x i32> @test_mask_xor_epi32(<16 x i32> %a,<16 x i32> %b, <16 x i32> %passThru, i16 %mask) {
961 ; CHECK-LABEL: test_mask_xor_epi32:
962 ; CHECK:       ## BB#0:
963 ; CHECK-NEXT:    kmovw %edi, %k1
964 ; CHECK-NEXT:    vpxord %zmm1, %zmm0, %zmm2 {%k1}
965 ; CHECK-NEXT:    vmovdqa64 %zmm2, %zmm0
966 ; CHECK-NEXT:    retq
967   %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)
968   ret < 16 x i32> %res
969 }
970
971 declare <16 x i32> @llvm.x86.avx512.mask.pxor.d.512(<16 x i32>, <16 x i32>, <16 x i32>, i16)
972
973 define <16 x i32> @test_or_epi32(<16 x i32> %a, <16 x i32> %b) {
974 ; CHECK-LABEL: test_or_epi32:
975 ; CHECK:       ## BB#0:
976 ; CHECK-NEXT:    vpord %zmm1, %zmm0, %zmm0
977 ; CHECK-NEXT:    retq
978   %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)
979   ret < 16 x i32> %res
980 }
981
982 define <16 x i32> @test_mask_or_epi32(<16 x i32> %a,<16 x i32> %b, <16 x i32> %passThru, i16 %mask) {
983 ; CHECK-LABEL: test_mask_or_epi32:
984 ; CHECK:       ## BB#0:
985 ; CHECK-NEXT:    kmovw %edi, %k1
986 ; CHECK-NEXT:    vpord %zmm1, %zmm0, %zmm2 {%k1}
987 ; CHECK-NEXT:    vmovdqa64 %zmm2, %zmm0
988 ; CHECK-NEXT:    retq
989   %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)
990   ret < 16 x i32> %res
991 }
992
993 declare <16 x i32> @llvm.x86.avx512.mask.por.d.512(<16 x i32>, <16 x i32>, <16 x i32>, i16)
994
995 define <16 x i32> @test_and_epi32(<16 x i32> %a, <16 x i32> %b) {
996 ; CHECK-LABEL: test_and_epi32:
997 ; CHECK:       ## BB#0:
998 ; CHECK-NEXT:    vpandd %zmm1, %zmm0, %zmm0
999 ; CHECK-NEXT:    retq
1000   %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)
1001   ret < 16 x i32> %res
1002 }
1003
1004 define <16 x i32> @test_mask_and_epi32(<16 x i32> %a,<16 x i32> %b, <16 x i32> %passThru, i16 %mask) {
1005 ; CHECK-LABEL: test_mask_and_epi32:
1006 ; CHECK:       ## BB#0:
1007 ; CHECK-NEXT:    kmovw %edi, %k1
1008 ; CHECK-NEXT:    vpandd %zmm1, %zmm0, %zmm2 {%k1}
1009 ; CHECK-NEXT:    vmovdqa64 %zmm2, %zmm0
1010 ; CHECK-NEXT:    retq
1011   %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)
1012   ret < 16 x i32> %res
1013 }
1014
1015 declare <16 x i32> @llvm.x86.avx512.mask.pand.d.512(<16 x i32>, <16 x i32>, <16 x i32>, i16)
1016
1017 define <8 x i64> @test_xor_epi64(<8 x i64> %a, <8 x i64> %b) {
1018 ; CHECK-LABEL: test_xor_epi64:
1019 ; CHECK:       ## BB#0:
1020 ; CHECK-NEXT:    vpxorq %zmm1, %zmm0, %zmm0
1021 ; CHECK-NEXT:    retq
1022   %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)
1023   ret < 8 x i64> %res
1024 }
1025
1026 define <8 x i64> @test_mask_xor_epi64(<8 x i64> %a,<8 x i64> %b, <8 x i64> %passThru, i8 %mask) {
1027 ; CHECK-LABEL: test_mask_xor_epi64:
1028 ; CHECK:       ## BB#0:
1029 ; CHECK-NEXT:    kmovw %edi, %k1
1030 ; CHECK-NEXT:    vpxorq %zmm1, %zmm0, %zmm2 {%k1}
1031 ; CHECK-NEXT:    vmovdqa64 %zmm2, %zmm0
1032 ; CHECK-NEXT:    retq
1033   %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)
1034   ret < 8 x i64> %res
1035 }
1036
1037 declare <8 x i64> @llvm.x86.avx512.mask.pxor.q.512(<8 x i64>, <8 x i64>, <8 x i64>, i8)
1038
1039 define <8 x i64> @test_or_epi64(<8 x i64> %a, <8 x i64> %b) {
1040 ; CHECK-LABEL: test_or_epi64:
1041 ; CHECK:       ## BB#0:
1042 ; CHECK-NEXT:    vporq %zmm1, %zmm0, %zmm0
1043 ; CHECK-NEXT:    retq
1044   %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)
1045   ret < 8 x i64> %res
1046 }
1047
1048 define <8 x i64> @test_mask_or_epi64(<8 x i64> %a,<8 x i64> %b, <8 x i64> %passThru, i8 %mask) {
1049 ; CHECK-LABEL: test_mask_or_epi64:
1050 ; CHECK:       ## BB#0:
1051 ; CHECK-NEXT:    kmovw %edi, %k1
1052 ; CHECK-NEXT:    vporq %zmm1, %zmm0, %zmm2 {%k1}
1053 ; CHECK-NEXT:    vmovdqa64 %zmm2, %zmm0
1054 ; CHECK-NEXT:    retq
1055   %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)
1056   ret < 8 x i64> %res
1057 }
1058
1059 declare <8 x i64> @llvm.x86.avx512.mask.por.q.512(<8 x i64>, <8 x i64>, <8 x i64>, i8)
1060
1061 define <8 x i64> @test_and_epi64(<8 x i64> %a, <8 x i64> %b) {
1062 ; CHECK-LABEL: test_and_epi64:
1063 ; CHECK:       ## BB#0:
1064 ; CHECK-NEXT:    vpandq %zmm1, %zmm0, %zmm0
1065 ; CHECK-NEXT:    retq
1066   %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)
1067   ret < 8 x i64> %res
1068 }
1069
1070 define <8 x i64> @test_mask_and_epi64(<8 x i64> %a,<8 x i64> %b, <8 x i64> %passThru, i8 %mask) {
1071 ; CHECK-LABEL: test_mask_and_epi64:
1072 ; CHECK:       ## BB#0:
1073 ; CHECK-NEXT:    kmovw %edi, %k1
1074 ; CHECK-NEXT:    vpandq %zmm1, %zmm0, %zmm2 {%k1}
1075 ; CHECK-NEXT:    vmovdqa64 %zmm2, %zmm0
1076 ; CHECK-NEXT:    retq
1077   %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)
1078   ret < 8 x i64> %res
1079 }
1080
1081 declare <8 x i64> @llvm.x86.avx512.mask.pand.q.512(<8 x i64>, <8 x i64>, <8 x i64>, i8)
1082
1083 define <16 x i32> @test_mask_add_epi32_rr(<16 x i32> %a, <16 x i32> %b) {
1084 ; CHECK-LABEL: test_mask_add_epi32_rr:
1085 ; CHECK:       ## BB#0:
1086 ; CHECK-NEXT:    vpaddd %zmm1, %zmm0, %zmm0
1087 ; CHECK-NEXT:    retq
1088   %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)
1089   ret < 16 x i32> %res
1090 }
1091
1092 define <16 x i32> @test_mask_add_epi32_rrk(<16 x i32> %a, <16 x i32> %b, <16 x i32> %passThru, i16 %mask) {
1093 ; CHECK-LABEL: test_mask_add_epi32_rrk:
1094 ; CHECK:       ## BB#0:
1095 ; CHECK-NEXT:    kmovw %edi, %k1
1096 ; CHECK-NEXT:    vpaddd %zmm1, %zmm0, %zmm2 {%k1}
1097 ; CHECK-NEXT:    vmovdqa64 %zmm2, %zmm0
1098 ; CHECK-NEXT:    retq
1099   %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)
1100   ret < 16 x i32> %res
1101 }
1102
1103 define <16 x i32> @test_mask_add_epi32_rrkz(<16 x i32> %a, <16 x i32> %b, i16 %mask) {
1104 ; CHECK-LABEL: test_mask_add_epi32_rrkz:
1105 ; CHECK:       ## BB#0:
1106 ; CHECK-NEXT:    kmovw %edi, %k1
1107 ; CHECK-NEXT:    vpaddd %zmm1, %zmm0, %zmm0 {%k1} {z}
1108 ; CHECK-NEXT:    retq
1109   %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)
1110   ret < 16 x i32> %res
1111 }
1112
1113 define <16 x i32> @test_mask_add_epi32_rm(<16 x i32> %a, <16 x i32>* %ptr_b) {
1114 ; CHECK-LABEL: test_mask_add_epi32_rm:
1115 ; CHECK:       ## BB#0:
1116 ; CHECK-NEXT:    vpaddd (%rdi), %zmm0, %zmm0
1117 ; CHECK-NEXT:    retq
1118   %b = load <16 x i32>, <16 x i32>* %ptr_b
1119   %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)
1120   ret < 16 x i32> %res
1121 }
1122
1123 define <16 x i32> @test_mask_add_epi32_rmk(<16 x i32> %a, <16 x i32>* %ptr_b, <16 x i32> %passThru, i16 %mask) {
1124 ; CHECK-LABEL: test_mask_add_epi32_rmk:
1125 ; CHECK:       ## BB#0:
1126 ; CHECK-NEXT:    kmovw %esi, %k1
1127 ; CHECK-NEXT:    vpaddd (%rdi), %zmm0, %zmm1 {%k1}
1128 ; CHECK-NEXT:    vmovdqa64 %zmm1, %zmm0
1129 ; CHECK-NEXT:    retq
1130   %b = load <16 x i32>, <16 x i32>* %ptr_b
1131   %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)
1132   ret < 16 x i32> %res
1133 }
1134
1135 define <16 x i32> @test_mask_add_epi32_rmkz(<16 x i32> %a, <16 x i32>* %ptr_b, i16 %mask) {
1136 ; CHECK-LABEL: test_mask_add_epi32_rmkz:
1137 ; CHECK:       ## BB#0:
1138 ; CHECK-NEXT:    kmovw %esi, %k1
1139 ; CHECK-NEXT:    vpaddd (%rdi), %zmm0, %zmm0 {%k1} {z}
1140 ; CHECK-NEXT:    retq
1141   %b = load <16 x i32>, <16 x i32>* %ptr_b
1142   %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)
1143   ret < 16 x i32> %res
1144 }
1145
1146 define <16 x i32> @test_mask_add_epi32_rmb(<16 x i32> %a, i32* %ptr_b) {
1147 ; CHECK-LABEL: test_mask_add_epi32_rmb:
1148 ; CHECK:       ## BB#0:
1149 ; CHECK-NEXT:    vpaddd (%rdi){1to16}, %zmm0, %zmm0
1150 ; CHECK-NEXT:    retq
1151   %q = load i32, i32* %ptr_b
1152   %vecinit.i = insertelement <16 x i32> undef, i32 %q, i32 0
1153   %b = shufflevector <16 x i32> %vecinit.i, <16 x i32> undef, <16 x i32> zeroinitializer
1154   %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)
1155   ret < 16 x i32> %res
1156 }
1157
1158 define <16 x i32> @test_mask_add_epi32_rmbk(<16 x i32> %a, i32* %ptr_b, <16 x i32> %passThru, i16 %mask) {
1159 ; CHECK-LABEL: test_mask_add_epi32_rmbk:
1160 ; CHECK:       ## BB#0:
1161 ; CHECK-NEXT:    kmovw %esi, %k1
1162 ; CHECK-NEXT:    vpaddd (%rdi){1to16}, %zmm0, %zmm1 {%k1}
1163 ; CHECK-NEXT:    vmovdqa64 %zmm1, %zmm0
1164 ; CHECK-NEXT:    retq
1165   %q = load i32, i32* %ptr_b
1166   %vecinit.i = insertelement <16 x i32> undef, i32 %q, i32 0
1167   %b = shufflevector <16 x i32> %vecinit.i, <16 x i32> undef, <16 x i32> zeroinitializer
1168   %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)
1169   ret < 16 x i32> %res
1170 }
1171
1172 define <16 x i32> @test_mask_add_epi32_rmbkz(<16 x i32> %a, i32* %ptr_b, i16 %mask) {
1173 ; CHECK-LABEL: test_mask_add_epi32_rmbkz:
1174 ; CHECK:       ## BB#0:
1175 ; CHECK-NEXT:    kmovw %esi, %k1
1176 ; CHECK-NEXT:    vpaddd (%rdi){1to16}, %zmm0, %zmm0 {%k1} {z}
1177 ; CHECK-NEXT:    retq
1178   %q = load i32, i32* %ptr_b
1179   %vecinit.i = insertelement <16 x i32> undef, i32 %q, i32 0
1180   %b = shufflevector <16 x i32> %vecinit.i, <16 x i32> undef, <16 x i32> zeroinitializer
1181   %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)
1182   ret < 16 x i32> %res
1183 }
1184
1185 declare <16 x i32> @llvm.x86.avx512.mask.padd.d.512(<16 x i32>, <16 x i32>, <16 x i32>, i16)
1186
1187 define <16 x i32> @test_mask_sub_epi32_rr(<16 x i32> %a, <16 x i32> %b) {
1188 ; CHECK-LABEL: test_mask_sub_epi32_rr:
1189 ; CHECK:       ## BB#0:
1190 ; CHECK-NEXT:    vpsubd %zmm1, %zmm0, %zmm0
1191 ; CHECK-NEXT:    retq
1192   %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)
1193   ret < 16 x i32> %res
1194 }
1195
1196 define <16 x i32> @test_mask_sub_epi32_rrk(<16 x i32> %a, <16 x i32> %b, <16 x i32> %passThru, i16 %mask) {
1197 ; CHECK-LABEL: test_mask_sub_epi32_rrk:
1198 ; CHECK:       ## BB#0:
1199 ; CHECK-NEXT:    kmovw %edi, %k1
1200 ; CHECK-NEXT:    vpsubd %zmm1, %zmm0, %zmm2 {%k1}
1201 ; CHECK-NEXT:    vmovdqa64 %zmm2, %zmm0
1202 ; CHECK-NEXT:    retq
1203   %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)
1204   ret < 16 x i32> %res
1205 }
1206
1207 define <16 x i32> @test_mask_sub_epi32_rrkz(<16 x i32> %a, <16 x i32> %b, i16 %mask) {
1208 ; CHECK-LABEL: test_mask_sub_epi32_rrkz:
1209 ; CHECK:       ## BB#0:
1210 ; CHECK-NEXT:    kmovw %edi, %k1
1211 ; CHECK-NEXT:    vpsubd %zmm1, %zmm0, %zmm0 {%k1} {z}
1212 ; CHECK-NEXT:    retq
1213   %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)
1214   ret < 16 x i32> %res
1215 }
1216
1217 define <16 x i32> @test_mask_sub_epi32_rm(<16 x i32> %a, <16 x i32>* %ptr_b) {
1218 ; CHECK-LABEL: test_mask_sub_epi32_rm:
1219 ; CHECK:       ## BB#0:
1220 ; CHECK-NEXT:    vpsubd (%rdi), %zmm0, %zmm0
1221 ; CHECK-NEXT:    retq
1222   %b = load <16 x i32>, <16 x i32>* %ptr_b
1223   %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)
1224   ret < 16 x i32> %res
1225 }
1226
1227 define <16 x i32> @test_mask_sub_epi32_rmk(<16 x i32> %a, <16 x i32>* %ptr_b, <16 x i32> %passThru, i16 %mask) {
1228 ; CHECK-LABEL: test_mask_sub_epi32_rmk:
1229 ; CHECK:       ## BB#0:
1230 ; CHECK-NEXT:    kmovw %esi, %k1
1231 ; CHECK-NEXT:    vpsubd (%rdi), %zmm0, %zmm1 {%k1}
1232 ; CHECK-NEXT:    vmovdqa64 %zmm1, %zmm0
1233 ; CHECK-NEXT:    retq
1234   %b = load <16 x i32>, <16 x i32>* %ptr_b
1235   %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)
1236   ret < 16 x i32> %res
1237 }
1238
1239 define <16 x i32> @test_mask_sub_epi32_rmkz(<16 x i32> %a, <16 x i32>* %ptr_b, i16 %mask) {
1240 ; CHECK-LABEL: test_mask_sub_epi32_rmkz:
1241 ; CHECK:       ## BB#0:
1242 ; CHECK-NEXT:    kmovw %esi, %k1
1243 ; CHECK-NEXT:    vpsubd (%rdi), %zmm0, %zmm0 {%k1} {z}
1244 ; CHECK-NEXT:    retq
1245   %b = load <16 x i32>, <16 x i32>* %ptr_b
1246   %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)
1247   ret < 16 x i32> %res
1248 }
1249
1250 define <16 x i32> @test_mask_sub_epi32_rmb(<16 x i32> %a, i32* %ptr_b) {
1251 ; CHECK-LABEL: test_mask_sub_epi32_rmb:
1252 ; CHECK:       ## BB#0:
1253 ; CHECK-NEXT:    vpsubd (%rdi){1to16}, %zmm0, %zmm0
1254 ; CHECK-NEXT:    retq
1255   %q = load i32, i32* %ptr_b
1256   %vecinit.i = insertelement <16 x i32> undef, i32 %q, i32 0
1257   %b = shufflevector <16 x i32> %vecinit.i, <16 x i32> undef, <16 x i32> zeroinitializer
1258   %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)
1259   ret < 16 x i32> %res
1260 }
1261
1262 define <16 x i32> @test_mask_sub_epi32_rmbk(<16 x i32> %a, i32* %ptr_b, <16 x i32> %passThru, i16 %mask) {
1263 ; CHECK-LABEL: test_mask_sub_epi32_rmbk:
1264 ; CHECK:       ## BB#0:
1265 ; CHECK-NEXT:    kmovw %esi, %k1
1266 ; CHECK-NEXT:    vpsubd (%rdi){1to16}, %zmm0, %zmm1 {%k1}
1267 ; CHECK-NEXT:    vmovdqa64 %zmm1, %zmm0
1268 ; CHECK-NEXT:    retq
1269   %q = load i32, i32* %ptr_b
1270   %vecinit.i = insertelement <16 x i32> undef, i32 %q, i32 0
1271   %b = shufflevector <16 x i32> %vecinit.i, <16 x i32> undef, <16 x i32> zeroinitializer
1272   %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)
1273   ret < 16 x i32> %res
1274 }
1275
1276 define <16 x i32> @test_mask_sub_epi32_rmbkz(<16 x i32> %a, i32* %ptr_b, i16 %mask) {
1277 ; CHECK-LABEL: test_mask_sub_epi32_rmbkz:
1278 ; CHECK:       ## BB#0:
1279 ; CHECK-NEXT:    kmovw %esi, %k1
1280 ; CHECK-NEXT:    vpsubd (%rdi){1to16}, %zmm0, %zmm0 {%k1} {z}
1281 ; CHECK-NEXT:    retq
1282   %q = load i32, i32* %ptr_b
1283   %vecinit.i = insertelement <16 x i32> undef, i32 %q, i32 0
1284   %b = shufflevector <16 x i32> %vecinit.i, <16 x i32> undef, <16 x i32> zeroinitializer
1285   %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)
1286   ret < 16 x i32> %res
1287 }
1288
1289 declare <16 x i32> @llvm.x86.avx512.mask.psub.d.512(<16 x i32>, <16 x i32>, <16 x i32>, i16)
1290
1291 define <8 x i64> @test_mask_add_epi64_rr(<8 x i64> %a, <8 x i64> %b) {
1292 ; CHECK-LABEL: test_mask_add_epi64_rr:
1293 ; CHECK:       ## BB#0:
1294 ; CHECK-NEXT:    vpaddq %zmm1, %zmm0, %zmm0
1295 ; CHECK-NEXT:    retq
1296   %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)
1297   ret < 8 x i64> %res
1298 }
1299
1300 define <8 x i64> @test_mask_add_epi64_rrk(<8 x i64> %a, <8 x i64> %b, <8 x i64> %passThru, i8 %mask) {
1301 ; CHECK-LABEL: test_mask_add_epi64_rrk:
1302 ; CHECK:       ## BB#0:
1303 ; CHECK-NEXT:    kmovw %edi, %k1
1304 ; CHECK-NEXT:    vpaddq %zmm1, %zmm0, %zmm2 {%k1}
1305 ; CHECK-NEXT:    vmovdqa64 %zmm2, %zmm0
1306 ; CHECK-NEXT:    retq
1307   %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)
1308   ret < 8 x i64> %res
1309 }
1310
1311 define <8 x i64> @test_mask_add_epi64_rrkz(<8 x i64> %a, <8 x i64> %b, i8 %mask) {
1312 ; CHECK-LABEL: test_mask_add_epi64_rrkz:
1313 ; CHECK:       ## BB#0:
1314 ; CHECK-NEXT:    kmovw %edi, %k1
1315 ; CHECK-NEXT:    vpaddq %zmm1, %zmm0, %zmm0 {%k1} {z}
1316 ; CHECK-NEXT:    retq
1317   %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)
1318   ret < 8 x i64> %res
1319 }
1320
1321 define <8 x i64> @test_mask_add_epi64_rm(<8 x i64> %a, <8 x i64>* %ptr_b) {
1322 ; CHECK-LABEL: test_mask_add_epi64_rm:
1323 ; CHECK:       ## BB#0:
1324 ; CHECK-NEXT:    vpaddq (%rdi), %zmm0, %zmm0
1325 ; CHECK-NEXT:    retq
1326   %b = load <8 x i64>, <8 x i64>* %ptr_b
1327   %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)
1328   ret < 8 x i64> %res
1329 }
1330
1331 define <8 x i64> @test_mask_add_epi64_rmk(<8 x i64> %a, <8 x i64>* %ptr_b, <8 x i64> %passThru, i8 %mask) {
1332 ; CHECK-LABEL: test_mask_add_epi64_rmk:
1333 ; CHECK:       ## BB#0:
1334 ; CHECK-NEXT:    kmovw %esi, %k1
1335 ; CHECK-NEXT:    vpaddq (%rdi), %zmm0, %zmm1 {%k1}
1336 ; CHECK-NEXT:    vmovdqa64 %zmm1, %zmm0
1337 ; CHECK-NEXT:    retq
1338   %b = load <8 x i64>, <8 x i64>* %ptr_b
1339   %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)
1340   ret < 8 x i64> %res
1341 }
1342
1343 define <8 x i64> @test_mask_add_epi64_rmkz(<8 x i64> %a, <8 x i64>* %ptr_b, i8 %mask) {
1344 ; CHECK-LABEL: test_mask_add_epi64_rmkz:
1345 ; CHECK:       ## BB#0:
1346 ; CHECK-NEXT:    kmovw %esi, %k1
1347 ; CHECK-NEXT:    vpaddq (%rdi), %zmm0, %zmm0 {%k1} {z}
1348 ; CHECK-NEXT:    retq
1349   %b = load <8 x i64>, <8 x i64>* %ptr_b
1350   %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)
1351   ret < 8 x i64> %res
1352 }
1353
1354 define <8 x i64> @test_mask_add_epi64_rmb(<8 x i64> %a, i64* %ptr_b) {
1355 ; CHECK-LABEL: test_mask_add_epi64_rmb:
1356 ; CHECK:       ## BB#0:
1357 ; CHECK-NEXT:    vpaddq (%rdi){1to8}, %zmm0, %zmm0
1358 ; CHECK-NEXT:    retq
1359   %q = load i64, i64* %ptr_b
1360   %vecinit.i = insertelement <8 x i64> undef, i64 %q, i32 0
1361   %b = shufflevector <8 x i64> %vecinit.i, <8 x i64> undef, <8 x i32> zeroinitializer
1362   %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)
1363   ret < 8 x i64> %res
1364 }
1365
1366 define <8 x i64> @test_mask_add_epi64_rmbk(<8 x i64> %a, i64* %ptr_b, <8 x i64> %passThru, i8 %mask) {
1367 ; CHECK-LABEL: test_mask_add_epi64_rmbk:
1368 ; CHECK:       ## BB#0:
1369 ; CHECK-NEXT:    kmovw %esi, %k1
1370 ; CHECK-NEXT:    vpaddq (%rdi){1to8}, %zmm0, %zmm1 {%k1}
1371 ; CHECK-NEXT:    vmovdqa64 %zmm1, %zmm0
1372 ; CHECK-NEXT:    retq
1373   %q = load i64, i64* %ptr_b
1374   %vecinit.i = insertelement <8 x i64> undef, i64 %q, i32 0
1375   %b = shufflevector <8 x i64> %vecinit.i, <8 x i64> undef, <8 x i32> zeroinitializer
1376   %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)
1377   ret < 8 x i64> %res
1378 }
1379
1380 define <8 x i64> @test_mask_add_epi64_rmbkz(<8 x i64> %a, i64* %ptr_b, i8 %mask) {
1381 ; CHECK-LABEL: test_mask_add_epi64_rmbkz:
1382 ; CHECK:       ## BB#0:
1383 ; CHECK-NEXT:    kmovw %esi, %k1
1384 ; CHECK-NEXT:    vpaddq (%rdi){1to8}, %zmm0, %zmm0 {%k1} {z}
1385 ; CHECK-NEXT:    retq
1386   %q = load i64, i64* %ptr_b
1387   %vecinit.i = insertelement <8 x i64> undef, i64 %q, i32 0
1388   %b = shufflevector <8 x i64> %vecinit.i, <8 x i64> undef, <8 x i32> zeroinitializer
1389   %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)
1390   ret < 8 x i64> %res
1391 }
1392
1393 declare <8 x i64> @llvm.x86.avx512.mask.padd.q.512(<8 x i64>, <8 x i64>, <8 x i64>, i8)
1394
1395 define <8 x i64> @test_mask_sub_epi64_rr(<8 x i64> %a, <8 x i64> %b) {
1396 ; CHECK-LABEL: test_mask_sub_epi64_rr:
1397 ; CHECK:       ## BB#0:
1398 ; CHECK-NEXT:    vpsubq %zmm1, %zmm0, %zmm0
1399 ; CHECK-NEXT:    retq
1400   %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)
1401   ret < 8 x i64> %res
1402 }
1403
1404 define <8 x i64> @test_mask_sub_epi64_rrk(<8 x i64> %a, <8 x i64> %b, <8 x i64> %passThru, i8 %mask) {
1405 ; CHECK-LABEL: test_mask_sub_epi64_rrk:
1406 ; CHECK:       ## BB#0:
1407 ; CHECK-NEXT:    kmovw %edi, %k1
1408 ; CHECK-NEXT:    vpsubq %zmm1, %zmm0, %zmm2 {%k1}
1409 ; CHECK-NEXT:    vmovdqa64 %zmm2, %zmm0
1410 ; CHECK-NEXT:    retq
1411   %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)
1412   ret < 8 x i64> %res
1413 }
1414
1415 define <8 x i64> @test_mask_sub_epi64_rrkz(<8 x i64> %a, <8 x i64> %b, i8 %mask) {
1416 ; CHECK-LABEL: test_mask_sub_epi64_rrkz:
1417 ; CHECK:       ## BB#0:
1418 ; CHECK-NEXT:    kmovw %edi, %k1
1419 ; CHECK-NEXT:    vpsubq %zmm1, %zmm0, %zmm0 {%k1} {z}
1420 ; CHECK-NEXT:    retq
1421   %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)
1422   ret < 8 x i64> %res
1423 }
1424
1425 define <8 x i64> @test_mask_sub_epi64_rm(<8 x i64> %a, <8 x i64>* %ptr_b) {
1426 ; CHECK-LABEL: test_mask_sub_epi64_rm:
1427 ; CHECK:       ## BB#0:
1428 ; CHECK-NEXT:    vpsubq (%rdi), %zmm0, %zmm0
1429 ; CHECK-NEXT:    retq
1430   %b = load <8 x i64>, <8 x i64>* %ptr_b
1431   %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)
1432   ret < 8 x i64> %res
1433 }
1434
1435 define <8 x i64> @test_mask_sub_epi64_rmk(<8 x i64> %a, <8 x i64>* %ptr_b, <8 x i64> %passThru, i8 %mask) {
1436 ; CHECK-LABEL: test_mask_sub_epi64_rmk:
1437 ; CHECK:       ## BB#0:
1438 ; CHECK-NEXT:    kmovw %esi, %k1
1439 ; CHECK-NEXT:    vpsubq (%rdi), %zmm0, %zmm1 {%k1}
1440 ; CHECK-NEXT:    vmovdqa64 %zmm1, %zmm0
1441 ; CHECK-NEXT:    retq
1442   %b = load <8 x i64>, <8 x i64>* %ptr_b
1443   %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)
1444   ret < 8 x i64> %res
1445 }
1446
1447 define <8 x i64> @test_mask_sub_epi64_rmkz(<8 x i64> %a, <8 x i64>* %ptr_b, i8 %mask) {
1448 ; CHECK-LABEL: test_mask_sub_epi64_rmkz:
1449 ; CHECK:       ## BB#0:
1450 ; CHECK-NEXT:    kmovw %esi, %k1
1451 ; CHECK-NEXT:    vpsubq (%rdi), %zmm0, %zmm0 {%k1} {z}
1452 ; CHECK-NEXT:    retq
1453   %b = load <8 x i64>, <8 x i64>* %ptr_b
1454   %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)
1455   ret < 8 x i64> %res
1456 }
1457
1458 define <8 x i64> @test_mask_sub_epi64_rmb(<8 x i64> %a, i64* %ptr_b) {
1459 ; CHECK-LABEL: test_mask_sub_epi64_rmb:
1460 ; CHECK:       ## BB#0:
1461 ; CHECK-NEXT:    vpsubq (%rdi){1to8}, %zmm0, %zmm0
1462 ; CHECK-NEXT:    retq
1463   %q = load i64, i64* %ptr_b
1464   %vecinit.i = insertelement <8 x i64> undef, i64 %q, i32 0
1465   %b = shufflevector <8 x i64> %vecinit.i, <8 x i64> undef, <8 x i32> zeroinitializer
1466   %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)
1467   ret < 8 x i64> %res
1468 }
1469
1470 define <8 x i64> @test_mask_sub_epi64_rmbk(<8 x i64> %a, i64* %ptr_b, <8 x i64> %passThru, i8 %mask) {
1471 ; CHECK-LABEL: test_mask_sub_epi64_rmbk:
1472 ; CHECK:       ## BB#0:
1473 ; CHECK-NEXT:    kmovw %esi, %k1
1474 ; CHECK-NEXT:    vpsubq (%rdi){1to8}, %zmm0, %zmm1 {%k1}
1475 ; CHECK-NEXT:    vmovdqa64 %zmm1, %zmm0
1476 ; CHECK-NEXT:    retq
1477   %q = load i64, i64* %ptr_b
1478   %vecinit.i = insertelement <8 x i64> undef, i64 %q, i32 0
1479   %b = shufflevector <8 x i64> %vecinit.i, <8 x i64> undef, <8 x i32> zeroinitializer
1480   %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)
1481   ret < 8 x i64> %res
1482 }
1483
1484 define <8 x i64> @test_mask_sub_epi64_rmbkz(<8 x i64> %a, i64* %ptr_b, i8 %mask) {
1485 ; CHECK-LABEL: test_mask_sub_epi64_rmbkz:
1486 ; CHECK:       ## BB#0:
1487 ; CHECK-NEXT:    kmovw %esi, %k1
1488 ; CHECK-NEXT:    vpsubq (%rdi){1to8}, %zmm0, %zmm0 {%k1} {z}
1489 ; CHECK-NEXT:    retq
1490   %q = load i64, i64* %ptr_b
1491   %vecinit.i = insertelement <8 x i64> undef, i64 %q, i32 0
1492   %b = shufflevector <8 x i64> %vecinit.i, <8 x i64> undef, <8 x i32> zeroinitializer
1493   %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)
1494   ret < 8 x i64> %res
1495 }
1496
1497 declare <8 x i64> @llvm.x86.avx512.mask.psub.q.512(<8 x i64>, <8 x i64>, <8 x i64>, i8)
1498
1499 define <16 x i32> @test_mask_mullo_epi32_rr_512(<16 x i32> %a, <16 x i32> %b) {
1500 ; CHECK-LABEL: test_mask_mullo_epi32_rr_512:
1501 ; CHECK:       ## BB#0:
1502 ; CHECK-NEXT:    vpmulld %zmm1, %zmm0, %zmm0
1503 ; CHECK-NEXT:    retq
1504   %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)
1505   ret <16 x i32> %res
1506 }
1507
1508 define <16 x i32> @test_mask_mullo_epi32_rrk_512(<16 x i32> %a, <16 x i32> %b, <16 x i32> %passThru, i16 %mask) {
1509 ; CHECK-LABEL: test_mask_mullo_epi32_rrk_512:
1510 ; CHECK:       ## BB#0:
1511 ; CHECK-NEXT:    kmovw %edi, %k1
1512 ; CHECK-NEXT:    vpmulld %zmm1, %zmm0, %zmm2 {%k1}
1513 ; CHECK-NEXT:    vmovdqa64 %zmm2, %zmm0
1514 ; CHECK-NEXT:    retq
1515   %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)
1516   ret < 16 x i32> %res
1517 }
1518
1519 define <16 x i32> @test_mask_mullo_epi32_rrkz_512(<16 x i32> %a, <16 x i32> %b, i16 %mask) {
1520 ; CHECK-LABEL: test_mask_mullo_epi32_rrkz_512:
1521 ; CHECK:       ## BB#0:
1522 ; CHECK-NEXT:    kmovw %edi, %k1
1523 ; CHECK-NEXT:    vpmulld %zmm1, %zmm0, %zmm0 {%k1} {z}
1524 ; CHECK-NEXT:    retq
1525   %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)
1526   ret < 16 x i32> %res
1527 }
1528
1529 define <16 x i32> @test_mask_mullo_epi32_rm_512(<16 x i32> %a, <16 x i32>* %ptr_b) {
1530 ; CHECK-LABEL: test_mask_mullo_epi32_rm_512:
1531 ; CHECK:       ## BB#0:
1532 ; CHECK-NEXT:    vpmulld (%rdi), %zmm0, %zmm0
1533 ; CHECK-NEXT:    retq
1534   %b = load <16 x i32>, <16 x i32>* %ptr_b
1535   %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)
1536   ret < 16 x i32> %res
1537 }
1538
1539 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) {
1540 ; CHECK-LABEL: test_mask_mullo_epi32_rmk_512:
1541 ; CHECK:       ## BB#0:
1542 ; CHECK-NEXT:    kmovw %esi, %k1
1543 ; CHECK-NEXT:    vpmulld (%rdi), %zmm0, %zmm1 {%k1}
1544 ; CHECK-NEXT:    vmovdqa64 %zmm1, %zmm0
1545 ; CHECK-NEXT:    retq
1546   %b = load <16 x i32>, <16 x i32>* %ptr_b
1547   %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)
1548   ret < 16 x i32> %res
1549 }
1550
1551 define <16 x i32> @test_mask_mullo_epi32_rmkz_512(<16 x i32> %a, <16 x i32>* %ptr_b, i16 %mask) {
1552 ; CHECK-LABEL: test_mask_mullo_epi32_rmkz_512:
1553 ; CHECK:       ## BB#0:
1554 ; CHECK-NEXT:    kmovw %esi, %k1
1555 ; CHECK-NEXT:    vpmulld (%rdi), %zmm0, %zmm0 {%k1} {z}
1556 ; CHECK-NEXT:    retq
1557   %b = load <16 x i32>, <16 x i32>* %ptr_b
1558   %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)
1559   ret < 16 x i32> %res
1560 }
1561
1562 define <16 x i32> @test_mask_mullo_epi32_rmb_512(<16 x i32> %a, i32* %ptr_b) {
1563 ; CHECK-LABEL: test_mask_mullo_epi32_rmb_512:
1564 ; CHECK:       ## BB#0:
1565 ; CHECK-NEXT:    vpmulld (%rdi){1to16}, %zmm0, %zmm0
1566 ; CHECK-NEXT:    retq
1567   %q = load i32, i32* %ptr_b
1568   %vecinit.i = insertelement <16 x i32> undef, i32 %q, i32 0
1569   %b = shufflevector <16 x i32> %vecinit.i, <16 x i32> undef, <16 x i32> zeroinitializer
1570   %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)
1571   ret < 16 x i32> %res
1572 }
1573
1574 define <16 x i32> @test_mask_mullo_epi32_rmbk_512(<16 x i32> %a, i32* %ptr_b, <16 x i32> %passThru, i16 %mask) {
1575 ; CHECK-LABEL: test_mask_mullo_epi32_rmbk_512:
1576 ; CHECK:       ## BB#0:
1577 ; CHECK-NEXT:    kmovw %esi, %k1
1578 ; CHECK-NEXT:    vpmulld (%rdi){1to16}, %zmm0, %zmm1 {%k1}
1579 ; CHECK-NEXT:    vmovdqa64 %zmm1, %zmm0
1580 ; CHECK-NEXT:    retq
1581   %q = load i32, i32* %ptr_b
1582   %vecinit.i = insertelement <16 x i32> undef, i32 %q, i32 0
1583   %b = shufflevector <16 x i32> %vecinit.i, <16 x i32> undef, <16 x i32> zeroinitializer
1584   %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)
1585   ret < 16 x i32> %res
1586 }
1587
1588 define <16 x i32> @test_mask_mullo_epi32_rmbkz_512(<16 x i32> %a, i32* %ptr_b, i16 %mask) {
1589 ; CHECK-LABEL: test_mask_mullo_epi32_rmbkz_512:
1590 ; CHECK:       ## BB#0:
1591 ; CHECK-NEXT:    kmovw %esi, %k1
1592 ; CHECK-NEXT:    vpmulld (%rdi){1to16}, %zmm0, %zmm0 {%k1} {z}
1593 ; CHECK-NEXT:    retq
1594   %q = load i32, i32* %ptr_b
1595   %vecinit.i = insertelement <16 x i32> undef, i32 %q, i32 0
1596   %b = shufflevector <16 x i32> %vecinit.i, <16 x i32> undef, <16 x i32> zeroinitializer
1597   %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)
1598   ret < 16 x i32> %res
1599 }
1600
1601 declare <16 x i32> @llvm.x86.avx512.mask.pmull.d.512(<16 x i32>, <16 x i32>, <16 x i32>, i16)
1602
1603 declare <8 x double> @llvm.x86.avx512.mask.shuf.pd.512(<8 x double>, <8 x double>, i32, <8 x double>, i8)
1604
1605 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) {
1606 ; CHECK-LABEL: test_int_x86_avx512_mask_shuf_pd_512:
1607 ; CHECK:       ## BB#0:
1608 ; CHECK-NEXT:    vshufpd {{.*#+}} zmm3 = zmm0[0],zmm1[1],zmm0[3],zmm1[2],zmm0[5],zmm1[4],zmm0[6],zmm1[6]
1609 ; CHECK-NEXT:    kmovw %edi, %k1
1610 ; CHECK-NEXT:    vshufpd {{.*#+}} zmm2 {%k1} = zmm0[0],zmm1[1],zmm0[3],zmm1[2],zmm0[5],zmm1[4],zmm0[6],zmm1[6]
1611 ; CHECK-NEXT:    vshufpd {{.*#+}} zmm0 {%k1} {z} = zmm0[0],zmm1[1],zmm0[3],zmm1[2],zmm0[5],zmm1[4],zmm0[6],zmm1[6]
1612 ; CHECK-NEXT:    vaddpd %zmm3, %zmm2, %zmm1
1613 ; CHECK-NEXT:    vaddpd %zmm0, %zmm1, %zmm0
1614 ; CHECK-NEXT:    retq
1615   %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)
1616   %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)
1617   %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)
1618
1619   %res3 = fadd <8 x double> %res, %res1
1620   %res4 = fadd <8 x double> %res3, %res2
1621   ret <8 x double> %res4
1622 }
1623
1624 declare <16 x float> @llvm.x86.avx512.mask.shuf.ps.512(<16 x float>, <16 x float>, i32, <16 x float>, i16)
1625
1626 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) {
1627 ; CHECK-LABEL: test_int_x86_avx512_mask_shuf_ps_512:
1628 ; CHECK:       ## BB#0:
1629 ; CHECK-NEXT:    vshufps {{.*#+}} zmm3 = zmm0[2,1],zmm1[1,0],zmm0[6,5],zmm1[5,4],zmm0[10,9],zmm1[9,8],zmm0[14,13],zmm1[13,12]
1630 ; CHECK-NEXT:    kmovw %edi, %k1
1631 ; CHECK-NEXT:    vshufps {{.*#+}} zmm2 {%k1} = zmm0[2,1],zmm1[1,0],zmm0[6,5],zmm1[5,4],zmm0[10,9],zmm1[9,8],zmm0[14,13],zmm1[13,12]
1632 ; CHECK-NEXT:    vaddps %zmm3, %zmm2, %zmm0
1633 ; CHECK-NEXT:    retq
1634   %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)
1635   %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)
1636   %res2 = fadd <16 x float> %res, %res1
1637   ret <16 x float> %res2
1638 }
1639
1640 declare <16 x i32> @llvm.x86.avx512.mask.pmaxs.d.512(<16 x i32>, <16 x i32>, <16 x i32>, i16)
1641
1642 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) {
1643 ; CHECK-LABEL: test_int_x86_avx512_mask_pmaxs_d_512:
1644 ; CHECK:       ## BB#0:
1645 ; CHECK-NEXT:    vpmaxsd %zmm1, %zmm0, %zmm3
1646 ; CHECK-NEXT:    kmovw %edi, %k1
1647 ; CHECK-NEXT:    vpmaxsd %zmm1, %zmm0, %zmm2 {%k1}
1648 ; CHECK-NEXT:    vpaddd %zmm3, %zmm2, %zmm0
1649 ; CHECK-NEXT:    retq
1650   %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)
1651   %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)
1652   %res2 = add <16 x i32> %res, %res1
1653   ret <16 x i32> %res2
1654 }
1655
1656 declare <8 x i64> @llvm.x86.avx512.mask.pmaxs.q.512(<8 x i64>, <8 x i64>, <8 x i64>, i8)
1657
1658 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) {
1659 ; CHECK-LABEL: test_int_x86_avx512_mask_pmaxs_q_512:
1660 ; CHECK:       ## BB#0:
1661 ; CHECK-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm3
1662 ; CHECK-NEXT:    kmovw %edi, %k1
1663 ; CHECK-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm2 {%k1}
1664 ; CHECK-NEXT:    vpaddq %zmm3, %zmm2, %zmm0
1665 ; CHECK-NEXT:    retq
1666   %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)
1667   %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)
1668   %res2 = add <8 x i64> %res, %res1
1669   ret <8 x i64> %res2
1670 }
1671
1672 declare <16 x i32> @llvm.x86.avx512.mask.pmaxu.d.512(<16 x i32>, <16 x i32>, <16 x i32>, i16)
1673
1674 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) {
1675 ; CHECK-LABEL: test_int_x86_avx512_mask_pmaxu_d_512:
1676 ; CHECK:       ## BB#0:
1677 ; CHECK-NEXT:    vpmaxud %zmm1, %zmm0, %zmm3
1678 ; CHECK-NEXT:    kmovw %edi, %k1
1679 ; CHECK-NEXT:    vpmaxud %zmm1, %zmm0, %zmm2 {%k1}
1680 ; CHECK-NEXT:    vpaddd %zmm3, %zmm2, %zmm0
1681 ; CHECK-NEXT:    retq
1682   %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)
1683   %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)
1684   %res2 = add <16 x i32> %res, %res1
1685   ret <16 x i32> %res2
1686 }
1687
1688 declare <8 x i64> @llvm.x86.avx512.mask.pmaxu.q.512(<8 x i64>, <8 x i64>, <8 x i64>, i8)
1689
1690 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) {
1691 ; CHECK-LABEL: test_int_x86_avx512_mask_pmaxu_q_512:
1692 ; CHECK:       ## BB#0:
1693 ; CHECK-NEXT:    vpmaxuq %zmm1, %zmm0, %zmm3
1694 ; CHECK-NEXT:    kmovw %edi, %k1
1695 ; CHECK-NEXT:    vpmaxuq %zmm1, %zmm0, %zmm2 {%k1}
1696 ; CHECK-NEXT:    vpaddq %zmm3, %zmm2, %zmm0
1697 ; CHECK-NEXT:    retq
1698   %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)
1699   %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)
1700   %res2 = add <8 x i64> %res, %res1
1701   ret <8 x i64> %res2
1702 }
1703
1704 declare <16 x i32> @llvm.x86.avx512.mask.pmins.d.512(<16 x i32>, <16 x i32>, <16 x i32>, i16)
1705
1706 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) {
1707 ; CHECK-LABEL: test_int_x86_avx512_mask_pmins_d_512:
1708 ; CHECK:       ## BB#0:
1709 ; CHECK-NEXT:    vpminsd %zmm1, %zmm0, %zmm3
1710 ; CHECK-NEXT:    kmovw %edi, %k1
1711 ; CHECK-NEXT:    vpminsd %zmm1, %zmm0, %zmm2 {%k1}
1712 ; CHECK-NEXT:    vpaddd %zmm3, %zmm2, %zmm0
1713 ; CHECK-NEXT:    retq
1714   %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)
1715   %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)
1716   %res2 = add <16 x i32> %res, %res1
1717   ret <16 x i32> %res2
1718 }
1719
1720 declare <8 x i64> @llvm.x86.avx512.mask.pmins.q.512(<8 x i64>, <8 x i64>, <8 x i64>, i8)
1721
1722 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) {
1723 ; CHECK-LABEL: test_int_x86_avx512_mask_pmins_q_512:
1724 ; CHECK:       ## BB#0:
1725 ; CHECK-NEXT:    vpminsq %zmm1, %zmm0, %zmm3
1726 ; CHECK-NEXT:    kmovw %edi, %k1
1727 ; CHECK-NEXT:    vpminsq %zmm1, %zmm0, %zmm2 {%k1}
1728 ; CHECK-NEXT:    vpaddq %zmm3, %zmm2, %zmm0
1729 ; CHECK-NEXT:    retq
1730   %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)
1731   %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)
1732   %res2 = add <8 x i64> %res, %res1
1733   ret <8 x i64> %res2
1734 }
1735
1736 declare <16 x i32> @llvm.x86.avx512.mask.pminu.d.512(<16 x i32>, <16 x i32>, <16 x i32>, i16)
1737
1738 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) {
1739 ; CHECK-LABEL: test_int_x86_avx512_mask_pminu_d_512:
1740 ; CHECK:       ## BB#0:
1741 ; CHECK-NEXT:    vpminud %zmm1, %zmm0, %zmm3
1742 ; CHECK-NEXT:    kmovw %edi, %k1
1743 ; CHECK-NEXT:    vpminud %zmm1, %zmm0, %zmm2 {%k1}
1744 ; CHECK-NEXT:    vpaddd %zmm3, %zmm2, %zmm0
1745 ; CHECK-NEXT:    retq
1746   %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)
1747   %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)
1748   %res2 = add <16 x i32> %res, %res1
1749   ret <16 x i32> %res2
1750 }
1751
1752 declare <8 x i64> @llvm.x86.avx512.mask.pminu.q.512(<8 x i64>, <8 x i64>, <8 x i64>, i8)
1753
1754 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) {
1755 ; CHECK-LABEL: test_int_x86_avx512_mask_pminu_q_512:
1756 ; CHECK:       ## BB#0:
1757 ; CHECK-NEXT:    vpminuq %zmm1, %zmm0, %zmm3
1758 ; CHECK-NEXT:    kmovw %edi, %k1
1759 ; CHECK-NEXT:    vpminuq %zmm1, %zmm0, %zmm2 {%k1}
1760 ; CHECK-NEXT:    vpaddq %zmm3, %zmm2, %zmm0
1761 ; CHECK-NEXT:    retq
1762   %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)
1763   %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)
1764   %res2 = add <8 x i64> %res, %res1
1765   ret <8 x i64> %res2
1766 }
1767
1768 define <4 x float> @test_mm_mask_move_ss(<4 x float> %__W, i8 zeroext %__U, <4 x float> %__A, <4 x float> %__B) {
1769 ; CHECK-LABEL: test_mm_mask_move_ss:
1770 ; CHECK:       ## BB#0: ## %entry
1771 ; CHECK-NEXT:    kmovw %edi, %k1
1772 ; CHECK-NEXT:    vmovss %xmm2, %xmm1, %xmm0 {%k1}
1773 ; CHECK-NEXT:    retq
1774 entry:
1775   %res = call <4 x float> @llvm.x86.avx512.mask.move.ss(<4 x float> %__A, <4 x float> %__B, <4 x float> %__W, i8 %__U)
1776   ret <4 x float> %res
1777 }
1778
1779
1780 define <4 x float> @test_mm_maskz_move_ss(i8 zeroext %__U, <4 x float> %__A, <4 x float> %__B) {
1781 ; CHECK-LABEL: test_mm_maskz_move_ss:
1782 ; CHECK:       ## BB#0: ## %entry
1783 ; CHECK-NEXT:    kmovw %edi, %k1
1784 ; CHECK-NEXT:    vmovss %xmm1, %xmm0, %xmm0 {%k1} {z}
1785 ; CHECK-NEXT:    retq
1786 entry:
1787   %res = call <4 x float> @llvm.x86.avx512.mask.move.ss(<4 x float> %__A, <4 x float> %__B, <4 x float> zeroinitializer, i8 %__U)
1788   ret <4 x float> %res
1789 }
1790
1791 define <2 x double> @test_mm_mask_move_sd(<2 x double> %__W, i8 zeroext %__U, <2 x double> %__A, <2 x double> %__B) {
1792 ; CHECK-LABEL: test_mm_mask_move_sd:
1793 ; CHECK:       ## BB#0: ## %entry
1794 ; CHECK-NEXT:    kmovw %edi, %k1
1795 ; CHECK-NEXT:    vmovsd %xmm2, %xmm1, %xmm0 {%k1}
1796 ; CHECK-NEXT:    retq
1797 entry:
1798   %res = call <2 x double> @llvm.x86.avx512.mask.move.sd(<2 x double> %__A, <2 x double> %__B, <2 x double> %__W, i8 %__U)
1799   ret <2 x double> %res
1800 }
1801
1802 define <2 x double> @test_mm_maskz_move_sd(i8 zeroext %__U, <2 x double> %__A, <2 x double> %__B) {
1803 ; CHECK-LABEL: test_mm_maskz_move_sd:
1804 ; CHECK:       ## BB#0: ## %entry
1805 ; CHECK-NEXT:    kmovw %edi, %k1
1806 ; CHECK-NEXT:    vmovsd %xmm1, %xmm0, %xmm0 {%k1} {z}
1807 ; CHECK-NEXT:    retq
1808 entry:
1809   %res = call <2 x double> @llvm.x86.avx512.mask.move.sd(<2 x double> %__A, <2 x double> %__B, <2 x double> zeroinitializer, i8 %__U)
1810   ret <2 x double> %res
1811 }
1812
1813 declare <4 x float> @llvm.x86.avx512.mask.move.ss(<4 x float>, <4 x float>, <4 x float>, i8)
1814 declare <2 x double> @llvm.x86.avx512.mask.move.sd(<2 x double>, <2 x double>, <2 x double>, i8)
1815
1816 declare <16 x i32> @llvm.x86.avx512.mask.pmovzxb.d.512(<16 x i8>, <16 x i32>, i16)
1817
1818 define <16 x i32>@test_int_x86_avx512_mask_pmovzxb_d_512(<16 x i8> %x0, <16 x i32> %x1, i16 %x2) {
1819 ; CHECK-LABEL: test_int_x86_avx512_mask_pmovzxb_d_512:
1820 ; CHECK:       ## BB#0:
1821 ; CHECK-NEXT:    vpmovzxbd {{.*#+}} zmm2 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero
1822 ; CHECK-NEXT:    kmovw %edi, %k1
1823 ; CHECK-NEXT:    vpmovzxbd {{.*#+}} zmm1 {%k1} = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero
1824 ; CHECK-NEXT:    vpmovzxbd {{.*#+}} zmm0 {%k1} {z} = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero
1825 ; CHECK-NEXT:    vpaddd %zmm0, %zmm1, %zmm0
1826 ; CHECK-NEXT:    vpaddd %zmm2, %zmm0, %zmm0
1827 ; CHECK-NEXT:    retq
1828   %res = call <16 x i32> @llvm.x86.avx512.mask.pmovzxb.d.512(<16 x i8> %x0, <16 x i32> %x1, i16 %x2)
1829   %res1 = call <16 x i32> @llvm.x86.avx512.mask.pmovzxb.d.512(<16 x i8> %x0, <16 x i32> zeroinitializer, i16 %x2)
1830   %res2 = call <16 x i32> @llvm.x86.avx512.mask.pmovzxb.d.512(<16 x i8> %x0, <16 x i32> %x1, i16 -1)
1831   %res3 = add <16 x i32> %res, %res1
1832   %res4 = add <16 x i32> %res3, %res2
1833   ret <16 x i32> %res4
1834 }
1835
1836 declare <8 x i64> @llvm.x86.avx512.mask.pmovzxb.q.512(<16 x i8>, <8 x i64>, i8)
1837
1838 define <8 x i64>@test_int_x86_avx512_mask_pmovzxb_q_512(<16 x i8> %x0, <8 x i64> %x1, i8 %x2) {
1839 ; CHECK-LABEL: test_int_x86_avx512_mask_pmovzxb_q_512:
1840 ; CHECK:       ## BB#0:
1841 ; CHECK-NEXT:    vpmovzxbq {{.*#+}} zmm2 = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero,xmm0[2],zero,zero,zero,zero,zero,zero,zero,xmm0[3],zero,zero,zero,zero,zero,zero,zero,xmm0[4],zero,zero,zero,zero,zero,zero,zero,xmm0[5],zero,zero,zero,zero,zero,zero,zero,xmm0[6],zero,zero,zero,zero,zero,zero,zero,xmm0[7],zero,zero,zero,zero,zero,zero,zero
1842 ; CHECK-NEXT:    kmovw %edi, %k1
1843 ; CHECK-NEXT:    vpmovzxbq {{.*#+}} zmm1 {%k1} = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero,xmm0[2],zero,zero,zero,zero,zero,zero,zero,xmm0[3],zero,zero,zero,zero,zero,zero,zero,xmm0[4],zero,zero,zero,zero,zero,zero,zero,xmm0[5],zero,zero,zero,zero,zero,zero,zero,xmm0[6],zero,zero,zero,zero,zero,zero,zero,xmm0[7],zero,zero,zero,zero,zero,zero,zero
1844 ; CHECK-NEXT:    vpmovzxbq {{.*#+}} zmm0 {%k1} {z} = xmm0[0],zero,zero,zero,zero,zero,zero,zero,xmm0[1],zero,zero,zero,zero,zero,zero,zero,xmm0[2],zero,zero,zero,zero,zero,zero,zero,xmm0[3],zero,zero,zero,zero,zero,zero,zero,xmm0[4],zero,zero,zero,zero,zero,zero,zero,xmm0[5],zero,zero,zero,zero,zero,zero,zero,xmm0[6],zero,zero,zero,zero,zero,zero,zero,xmm0[7],zero,zero,zero,zero,zero,zero,zero
1845 ; CHECK-NEXT:    vpaddq %zmm0, %zmm1, %zmm0
1846 ; CHECK-NEXT:    vpaddq %zmm2, %zmm0, %zmm0
1847 ; CHECK-NEXT:    retq
1848   %res = call <8 x i64> @llvm.x86.avx512.mask.pmovzxb.q.512(<16 x i8> %x0, <8 x i64> %x1, i8 %x2)
1849   %res1 = call <8 x i64> @llvm.x86.avx512.mask.pmovzxb.q.512(<16 x i8> %x0, <8 x i64> zeroinitializer, i8 %x2)
1850   %res2 = call <8 x i64> @llvm.x86.avx512.mask.pmovzxb.q.512(<16 x i8> %x0, <8 x i64> %x1, i8 -1)
1851   %res3 = add <8 x i64> %res, %res1
1852   %res4 = add <8 x i64> %res3, %res2
1853   ret <8 x i64> %res4
1854 }
1855
1856 declare <8 x i64> @llvm.x86.avx512.mask.pmovzxd.q.512(<8 x i32>, <8 x i64>, i8)
1857
1858 define <8 x i64>@test_int_x86_avx512_mask_pmovzxd_q_512(<8 x i32> %x0, <8 x i64> %x1, i8 %x2) {
1859 ; CHECK-LABEL: test_int_x86_avx512_mask_pmovzxd_q_512:
1860 ; CHECK:       ## BB#0:
1861 ; CHECK-NEXT:    vpmovzxdq {{.*#+}} zmm2 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero
1862 ; CHECK-NEXT:    kmovw %edi, %k1
1863 ; CHECK-NEXT:    vpmovzxdq {{.*#+}} zmm1 {%k1} = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero
1864 ; CHECK-NEXT:    vpmovzxdq {{.*#+}} zmm0 {%k1} {z} = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero
1865 ; CHECK-NEXT:    vpaddq %zmm0, %zmm1, %zmm0
1866 ; CHECK-NEXT:    vpaddq %zmm2, %zmm0, %zmm0
1867 ; CHECK-NEXT:    retq
1868   %res = call <8 x i64> @llvm.x86.avx512.mask.pmovzxd.q.512(<8 x i32> %x0, <8 x i64> %x1, i8 %x2)
1869   %res1 = call <8 x i64> @llvm.x86.avx512.mask.pmovzxd.q.512(<8 x i32> %x0, <8 x i64> zeroinitializer, i8 %x2)
1870   %res2 = call <8 x i64> @llvm.x86.avx512.mask.pmovzxd.q.512(<8 x i32> %x0, <8 x i64> %x1, i8 -1)
1871   %res3 = add <8 x i64> %res, %res1
1872   %res4 = add <8 x i64> %res3, %res2
1873   ret <8 x i64> %res4
1874 }
1875
1876 declare <16 x i32> @llvm.x86.avx512.mask.pmovzxw.d.512(<16 x i16>, <16 x i32>, i16)
1877
1878 define <16 x i32>@test_int_x86_avx512_mask_pmovzxw_d_512(<16 x i16> %x0, <16 x i32> %x1, i16 %x2) {
1879 ; CHECK-LABEL: test_int_x86_avx512_mask_pmovzxw_d_512:
1880 ; CHECK:       ## BB#0:
1881 ; CHECK-NEXT:    vpmovzxwd {{.*#+}} zmm2 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
1882 ; CHECK-NEXT:    kmovw %edi, %k1
1883 ; CHECK-NEXT:    vpmovzxwd {{.*#+}} zmm1 {%k1} = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
1884 ; CHECK-NEXT:    vpmovzxwd {{.*#+}} zmm0 {%k1} {z} = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
1885 ; CHECK-NEXT:    vpaddd %zmm0, %zmm1, %zmm0
1886 ; CHECK-NEXT:    vpaddd %zmm2, %zmm0, %zmm0
1887 ; CHECK-NEXT:    retq
1888   %res = call <16 x i32> @llvm.x86.avx512.mask.pmovzxw.d.512(<16 x i16> %x0, <16 x i32> %x1, i16 %x2)
1889   %res1 = call <16 x i32> @llvm.x86.avx512.mask.pmovzxw.d.512(<16 x i16> %x0, <16 x i32> zeroinitializer, i16 %x2)
1890   %res2 = call <16 x i32> @llvm.x86.avx512.mask.pmovzxw.d.512(<16 x i16> %x0, <16 x i32> %x1, i16 -1)
1891   %res3 = add <16 x i32> %res, %res1
1892   %res4 = add <16 x i32> %res3, %res2
1893   ret <16 x i32> %res4
1894 }
1895
1896 declare <8 x i64> @llvm.x86.avx512.mask.pmovzxw.q.512(<8 x i16>, <8 x i64>, i8)
1897
1898 define <8 x i64>@test_int_x86_avx512_mask_pmovzxw_q_512(<8 x i16> %x0, <8 x i64> %x1, i8 %x2) {
1899 ; CHECK-LABEL: test_int_x86_avx512_mask_pmovzxw_q_512:
1900 ; CHECK:       ## BB#0:
1901 ; CHECK-NEXT:    vpmovzxwq {{.*#+}} zmm2 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero
1902 ; CHECK-NEXT:    kmovw %edi, %k1
1903 ; CHECK-NEXT:    vpmovzxwq {{.*#+}} zmm1 {%k1} = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero
1904 ; CHECK-NEXT:    vpmovzxwq {{.*#+}} zmm0 {%k1} {z} = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero
1905 ; CHECK-NEXT:    vpaddq %zmm0, %zmm1, %zmm0
1906 ; CHECK-NEXT:    vpaddq %zmm2, %zmm0, %zmm0
1907 ; CHECK-NEXT:    retq
1908   %res = call <8 x i64> @llvm.x86.avx512.mask.pmovzxw.q.512(<8 x i16> %x0, <8 x i64> %x1, i8 %x2)
1909   %res1 = call <8 x i64> @llvm.x86.avx512.mask.pmovzxw.q.512(<8 x i16> %x0, <8 x i64> zeroinitializer, i8 %x2)
1910   %res2 = call <8 x i64> @llvm.x86.avx512.mask.pmovzxw.q.512(<8 x i16> %x0, <8 x i64> %x1, i8 -1)
1911   %res3 = add <8 x i64> %res, %res1
1912   %res4 = add <8 x i64> %res3, %res2
1913   ret <8 x i64> %res4
1914 }
1915
1916 declare <16 x i32> @llvm.x86.avx512.mask.pmovsxb.d.512(<16 x i8>, <16 x i32>, i16)
1917
1918 define <16 x i32>@test_int_x86_avx512_mask_pmovsxb_d_512(<16 x i8> %x0, <16 x i32> %x1, i16 %x2) {
1919 ; CHECK-LABEL: test_int_x86_avx512_mask_pmovsxb_d_512:
1920 ; CHECK:       ## BB#0:
1921 ; CHECK-NEXT:    vpmovsxbd %xmm0, %zmm2
1922 ; CHECK-NEXT:    kmovw %edi, %k1
1923 ; CHECK-NEXT:    vpmovsxbd %xmm0, %zmm1 {%k1}
1924 ; CHECK-NEXT:    vpmovsxbd %xmm0, %zmm0 {%k1} {z}
1925 ; CHECK-NEXT:    vpaddd %zmm0, %zmm1, %zmm0
1926 ; CHECK-NEXT:    vpaddd %zmm2, %zmm0, %zmm0
1927 ; CHECK-NEXT:    retq
1928   %res = call <16 x i32> @llvm.x86.avx512.mask.pmovsxb.d.512(<16 x i8> %x0, <16 x i32> %x1, i16 %x2)
1929   %res1 = call <16 x i32> @llvm.x86.avx512.mask.pmovsxb.d.512(<16 x i8> %x0, <16 x i32> zeroinitializer, i16 %x2)
1930   %res2 = call <16 x i32> @llvm.x86.avx512.mask.pmovsxb.d.512(<16 x i8> %x0, <16 x i32> %x1, i16 -1)
1931   %res3 = add <16 x i32> %res, %res1
1932   %res4 = add <16 x i32> %res3, %res2
1933   ret <16 x i32> %res4
1934 }
1935
1936 declare <8 x i64> @llvm.x86.avx512.mask.pmovsxb.q.512(<16 x i8>, <8 x i64>, i8)
1937
1938 define <8 x i64>@test_int_x86_avx512_mask_pmovsxb_q_512(<16 x i8> %x0, <8 x i64> %x1, i8 %x2) {
1939 ; CHECK-LABEL: test_int_x86_avx512_mask_pmovsxb_q_512:
1940 ; CHECK:       ## BB#0:
1941 ; CHECK-NEXT:    vpmovsxbq %xmm0, %zmm2
1942 ; CHECK-NEXT:    kmovw %edi, %k1
1943 ; CHECK-NEXT:    vpmovsxbq %xmm0, %zmm1 {%k1}
1944 ; CHECK-NEXT:    vpmovsxbq %xmm0, %zmm0 {%k1} {z}
1945 ; CHECK-NEXT:    vpaddq %zmm0, %zmm1, %zmm0
1946 ; CHECK-NEXT:    vpaddq %zmm2, %zmm0, %zmm0
1947 ; CHECK-NEXT:    retq
1948   %res = call <8 x i64> @llvm.x86.avx512.mask.pmovsxb.q.512(<16 x i8> %x0, <8 x i64> %x1, i8 %x2)
1949   %res1 = call <8 x i64> @llvm.x86.avx512.mask.pmovsxb.q.512(<16 x i8> %x0, <8 x i64> zeroinitializer, i8 %x2)
1950   %res2 = call <8 x i64> @llvm.x86.avx512.mask.pmovsxb.q.512(<16 x i8> %x0, <8 x i64> %x1, i8 -1)
1951   %res3 = add <8 x i64> %res, %res1
1952   %res4 = add <8 x i64> %res3, %res2
1953   ret <8 x i64> %res4
1954 }
1955
1956 declare <8 x i64> @llvm.x86.avx512.mask.pmovsxd.q.512(<8 x i32>, <8 x i64>, i8)
1957
1958 define <8 x i64>@test_int_x86_avx512_mask_pmovsxd_q_512(<8 x i32> %x0, <8 x i64> %x1, i8 %x2) {
1959 ; CHECK-LABEL: test_int_x86_avx512_mask_pmovsxd_q_512:
1960 ; CHECK:       ## BB#0:
1961 ; CHECK-NEXT:    vpmovsxdq %ymm0, %zmm2
1962 ; CHECK-NEXT:    kmovw %edi, %k1
1963 ; CHECK-NEXT:    vpmovsxdq %ymm0, %zmm1 {%k1}
1964 ; CHECK-NEXT:    vpmovsxdq %ymm0, %zmm0 {%k1} {z}
1965 ; CHECK-NEXT:    vpaddq %zmm0, %zmm1, %zmm0
1966 ; CHECK-NEXT:    vpaddq %zmm2, %zmm0, %zmm0
1967 ; CHECK-NEXT:    retq
1968   %res = call <8 x i64> @llvm.x86.avx512.mask.pmovsxd.q.512(<8 x i32> %x0, <8 x i64> %x1, i8 %x2)
1969   %res1 = call <8 x i64> @llvm.x86.avx512.mask.pmovsxd.q.512(<8 x i32> %x0, <8 x i64> zeroinitializer, i8 %x2)
1970   %res2 = call <8 x i64> @llvm.x86.avx512.mask.pmovsxd.q.512(<8 x i32> %x0, <8 x i64> %x1, i8 -1)
1971   %res3 = add <8 x i64> %res, %res1
1972   %res4 = add <8 x i64> %res3, %res2
1973   ret <8 x i64> %res4
1974 }
1975
1976
1977 declare <16 x i32> @llvm.x86.avx512.mask.pmovsxw.d.512(<16 x i16>, <16 x i32>, i16)
1978
1979 define <16 x i32>@test_int_x86_avx512_mask_pmovsxw_d_512(<16 x i16> %x0, <16 x i32> %x1, i16 %x2) {
1980 ; CHECK-LABEL: test_int_x86_avx512_mask_pmovsxw_d_512:
1981 ; CHECK:       ## BB#0:
1982 ; CHECK-NEXT:    vpmovsxwd %ymm0, %zmm2
1983 ; CHECK-NEXT:    kmovw %edi, %k1
1984 ; CHECK-NEXT:    vpmovsxwd %ymm0, %zmm1 {%k1}
1985 ; CHECK-NEXT:    vpmovsxwd %ymm0, %zmm0 {%k1} {z}
1986 ; CHECK-NEXT:    vpaddd %zmm0, %zmm1, %zmm0
1987 ; CHECK-NEXT:    vpaddd %zmm2, %zmm0, %zmm0
1988 ; CHECK-NEXT:    retq
1989   %res = call <16 x i32> @llvm.x86.avx512.mask.pmovsxw.d.512(<16 x i16> %x0, <16 x i32> %x1, i16 %x2)
1990   %res1 = call <16 x i32> @llvm.x86.avx512.mask.pmovsxw.d.512(<16 x i16> %x0, <16 x i32> zeroinitializer, i16 %x2)
1991   %res2 = call <16 x i32> @llvm.x86.avx512.mask.pmovsxw.d.512(<16 x i16> %x0, <16 x i32> %x1, i16 -1)
1992   %res3 = add <16 x i32> %res, %res1
1993   %res4 = add <16 x i32> %res3, %res2
1994   ret <16 x i32> %res4
1995 }
1996
1997
1998 declare <8 x i64> @llvm.x86.avx512.mask.pmovsxw.q.512(<8 x i16>, <8 x i64>, i8)
1999
2000 define <8 x i64>@test_int_x86_avx512_mask_pmovsxw_q_512(<8 x i16> %x0, <8 x i64> %x1, i8 %x2) {
2001 ; CHECK-LABEL: test_int_x86_avx512_mask_pmovsxw_q_512:
2002 ; CHECK:       ## BB#0:
2003 ; CHECK-NEXT:    vpmovsxwq %xmm0, %zmm2
2004 ; CHECK-NEXT:    kmovw %edi, %k1
2005 ; CHECK-NEXT:    vpmovsxwq %xmm0, %zmm1 {%k1}
2006 ; CHECK-NEXT:    vpmovsxwq %xmm0, %zmm0 {%k1} {z}
2007 ; CHECK-NEXT:    vpaddq %zmm0, %zmm1, %zmm0
2008 ; CHECK-NEXT:    vpaddq %zmm2, %zmm0, %zmm0
2009 ; CHECK-NEXT:    retq
2010   %res = call <8 x i64> @llvm.x86.avx512.mask.pmovsxw.q.512(<8 x i16> %x0, <8 x i64> %x1, i8 %x2)
2011   %res1 = call <8 x i64> @llvm.x86.avx512.mask.pmovsxw.q.512(<8 x i16> %x0, <8 x i64> zeroinitializer, i8 %x2)
2012   %res2 = call <8 x i64> @llvm.x86.avx512.mask.pmovsxw.q.512(<8 x i16> %x0, <8 x i64> %x1, i8 -1)
2013   %res3 = add <8 x i64> %res, %res1
2014   %res4 = add <8 x i64> %res3, %res2
2015   ret <8 x i64> %res4
2016 }
2017
2018 declare <8 x i64> @llvm.x86.avx512.mask.psrl.qi.512(<8 x i64>, i32, <8 x i64>, i8)
2019
2020 define <8 x i64>@test_int_x86_avx512_mask_psrl_qi_512(<8 x i64> %x0, i32 %x1, <8 x i64> %x2, i8 %x3) {
2021 ; CHECK-LABEL: test_int_x86_avx512_mask_psrl_qi_512:
2022 ; CHECK:       ## BB#0:
2023 ; CHECK-NEXT:    vpsrlq $4, %zmm0, %zmm2
2024 ; CHECK-NEXT:    kmovw %esi, %k1
2025 ; CHECK-NEXT:    vpsrlq $4, %zmm0, %zmm1 {%k1}
2026 ; CHECK-NEXT:    vpsrlq $4, %zmm0, %zmm0 {%k1} {z}
2027 ; CHECK-NEXT:    vpaddq %zmm2, %zmm1, %zmm1
2028 ; CHECK-NEXT:    vpaddq %zmm0, %zmm1, %zmm0
2029 ; CHECK-NEXT:    retq
2030   %res = call <8 x i64> @llvm.x86.avx512.mask.psrl.qi.512(<8 x i64> %x0, i32 4, <8 x i64> %x2, i8 %x3)
2031   %res1 = call <8 x i64> @llvm.x86.avx512.mask.psrl.qi.512(<8 x i64> %x0, i32 4, <8 x i64> %x2, i8 -1)
2032   %res2 = call <8 x i64> @llvm.x86.avx512.mask.psrl.qi.512(<8 x i64> %x0, i32 4, <8 x i64> zeroinitializer, i8 %x3)
2033   %res3 = add <8 x i64> %res, %res1
2034   %res4 = add <8 x i64> %res3, %res2
2035   ret <8 x i64> %res4
2036 }
2037
2038 declare <16 x i32> @llvm.x86.avx512.mask.psrl.di.512(<16 x i32>, i32, <16 x i32>, i16)
2039
2040 define <16 x i32>@test_int_x86_avx512_mask_psrl_di_512(<16 x i32> %x0, i32 %x1, <16 x i32> %x2, i16 %x3) {
2041 ; CHECK-LABEL: test_int_x86_avx512_mask_psrl_di_512:
2042 ; CHECK:       ## BB#0:
2043 ; CHECK-NEXT:    vpsrld $4, %zmm0, %zmm2
2044 ; CHECK-NEXT:    kmovw %esi, %k1
2045 ; CHECK-NEXT:    vpsrld $4, %zmm0, %zmm1 {%k1}
2046 ; CHECK-NEXT:    vpsrld $4, %zmm0, %zmm0 {%k1} {z}
2047 ; CHECK-NEXT:    vpaddd %zmm2, %zmm1, %zmm1
2048 ; CHECK-NEXT:    vpaddd %zmm0, %zmm1, %zmm0
2049 ; CHECK-NEXT:    retq
2050   %res = call <16 x i32> @llvm.x86.avx512.mask.psrl.di.512(<16 x i32> %x0, i32 4, <16 x i32> %x2, i16 %x3)
2051   %res1 = call <16 x i32> @llvm.x86.avx512.mask.psrl.di.512(<16 x i32> %x0, i32 4, <16 x i32> %x2, i16 -1)
2052   %res2 = call <16 x i32> @llvm.x86.avx512.mask.psrl.di.512(<16 x i32> %x0, i32 4, <16 x i32> zeroinitializer, i16 %x3)
2053   %res3 = add <16 x i32> %res, %res1
2054   %res4 = add <16 x i32> %res3, %res2
2055   ret <16 x i32> %res4
2056 }
2057
2058 declare <16 x i32> @llvm.x86.avx512.mask.psra.di.512(<16 x i32>, i32, <16 x i32>, i16)
2059
2060 define <16 x i32>@test_int_x86_avx512_mask_psra_di_512(<16 x i32> %x0, i32 %x1, <16 x i32> %x2, i16 %x3) {
2061 ; CHECK-LABEL: test_int_x86_avx512_mask_psra_di_512:
2062 ; CHECK:       ## BB#0:
2063 ; CHECK-NEXT:    vpsrad $3, %zmm0, %zmm2
2064 ; CHECK-NEXT:    kmovw %esi, %k1
2065 ; CHECK-NEXT:    vpsrad $3, %zmm0, %zmm1 {%k1}
2066 ; CHECK-NEXT:    vpsrad $3, %zmm0, %zmm0 {%k1} {z}
2067 ; CHECK-NEXT:    vpaddd %zmm0, %zmm1, %zmm0
2068 ; CHECK-NEXT:    vpaddd %zmm2, %zmm0, %zmm0
2069 ; CHECK-NEXT:    retq
2070   %res = call <16 x i32> @llvm.x86.avx512.mask.psra.di.512(<16 x i32> %x0, i32 3, <16 x i32> %x2, i16 %x3)
2071   %res1 = call <16 x i32> @llvm.x86.avx512.mask.psra.di.512(<16 x i32> %x0, i32 3, <16 x i32> zeroinitializer, i16 %x3)
2072   %res2 = call <16 x i32> @llvm.x86.avx512.mask.psra.di.512(<16 x i32> %x0, i32 3, <16 x i32> %x2, i16 -1)
2073   %res3 = add <16 x i32> %res, %res1
2074   %res4 = add <16 x i32> %res3, %res2
2075   ret <16 x i32> %res4
2076 }
2077
2078 declare <8 x i64> @llvm.x86.avx512.mask.psra.qi.512(<8 x i64>, i32, <8 x i64>, i8)
2079
2080 define <8 x i64>@test_int_x86_avx512_mask_psra_qi_512(<8 x i64> %x0, i32 %x1, <8 x i64> %x2, i8 %x3) {
2081 ; CHECK-LABEL: test_int_x86_avx512_mask_psra_qi_512:
2082 ; CHECK:       ## BB#0:
2083 ; CHECK-NEXT:    vpsraq $3, %zmm0, %zmm2
2084 ; CHECK-NEXT:    kmovw %esi, %k1
2085 ; CHECK-NEXT:    vpsraq $3, %zmm0, %zmm1 {%k1}
2086 ; CHECK-NEXT:    vpsraq $3, %zmm0, %zmm0 {%k1} {z}
2087 ; CHECK-NEXT:    vpaddq %zmm0, %zmm1, %zmm0
2088 ; CHECK-NEXT:    vpaddq %zmm2, %zmm0, %zmm0
2089 ; CHECK-NEXT:    retq
2090   %res = call <8 x i64> @llvm.x86.avx512.mask.psra.qi.512(<8 x i64> %x0, i32 3, <8 x i64> %x2, i8 %x3)
2091   %res1 = call <8 x i64> @llvm.x86.avx512.mask.psra.qi.512(<8 x i64> %x0, i32 3, <8 x i64> zeroinitializer, i8 %x3)
2092   %res2 = call <8 x i64> @llvm.x86.avx512.mask.psra.qi.512(<8 x i64> %x0, i32 3, <8 x i64> %x2, i8 -1)
2093   %res3 = add <8 x i64> %res, %res1
2094   %res4 = add <8 x i64> %res3, %res2
2095   ret <8 x i64> %res4
2096 }
2097
2098 declare <16 x i32> @llvm.x86.avx512.mask.psll.di.512(<16 x i32>, i32, <16 x i32>, i16)
2099
2100 define <16 x i32>@test_int_x86_avx512_mask_psll_di_512(<16 x i32> %x0, i32 %x1, <16 x i32> %x2, i16 %x3) {
2101 ; CHECK-LABEL: test_int_x86_avx512_mask_psll_di_512:
2102 ; CHECK:       ## BB#0:
2103 ; CHECK-NEXT:    vpslld $3, %zmm0, %zmm2
2104 ; CHECK-NEXT:    kmovw %esi, %k1
2105 ; CHECK-NEXT:    vpslld $3, %zmm0, %zmm1 {%k1}
2106 ; CHECK-NEXT:    vpslld $3, %zmm0, %zmm0 {%k1} {z}
2107 ; CHECK-NEXT:    vpaddd %zmm0, %zmm1, %zmm0
2108 ; CHECK-NEXT:    vpaddd %zmm2, %zmm0, %zmm0
2109 ; CHECK-NEXT:    retq
2110   %res = call <16 x i32> @llvm.x86.avx512.mask.psll.di.512(<16 x i32> %x0, i32 3, <16 x i32> %x2, i16 %x3)
2111   %res1 = call <16 x i32> @llvm.x86.avx512.mask.psll.di.512(<16 x i32> %x0, i32 3, <16 x i32> zeroinitializer, i16 %x3)
2112   %res2 = call <16 x i32> @llvm.x86.avx512.mask.psll.di.512(<16 x i32> %x0, i32 3, <16 x i32> %x2, i16 -1)
2113   %res3 = add <16 x i32> %res, %res1
2114   %res4 = add <16 x i32> %res3, %res2
2115   ret <16 x i32> %res4
2116 }
2117
2118 declare <8 x i64> @llvm.x86.avx512.mask.psll.qi.512(<8 x i64>, i32, <8 x i64>, i8)
2119
2120 define <8 x i64>@test_int_x86_avx512_mask_psll_qi_512(<8 x i64> %x0, i32 %x1, <8 x i64> %x2, i8 %x3) {
2121 ; CHECK-LABEL: test_int_x86_avx512_mask_psll_qi_512:
2122 ; CHECK:       ## BB#0:
2123 ; CHECK-NEXT:    vpsllq $3, %zmm0, %zmm2
2124 ; CHECK-NEXT:    kmovw %esi, %k1
2125 ; CHECK-NEXT:    vpsllq $3, %zmm0, %zmm1 {%k1}
2126 ; CHECK-NEXT:    vpsllq $3, %zmm0, %zmm0 {%k1} {z}
2127 ; CHECK-NEXT:    vpaddq %zmm0, %zmm1, %zmm0
2128 ; CHECK-NEXT:    vpaddq %zmm2, %zmm0, %zmm0
2129 ; CHECK-NEXT:    retq
2130   %res = call <8 x i64> @llvm.x86.avx512.mask.psll.qi.512(<8 x i64> %x0, i32 3, <8 x i64> %x2, i8 %x3)
2131   %res1 = call <8 x i64> @llvm.x86.avx512.mask.psll.qi.512(<8 x i64> %x0, i32 3, <8 x i64> zeroinitializer, i8 %x3)
2132   %res2 = call <8 x i64> @llvm.x86.avx512.mask.psll.qi.512(<8 x i64> %x0, i32 3, <8 x i64> %x2, i8 -1)
2133   %res3 = add <8 x i64> %res, %res1
2134   %res4 = add <8 x i64> %res3, %res2
2135   ret <8 x i64> %res4
2136 }
2137
2138 define <16 x i32> @test_x86_avx512_psll_d(<16 x i32> %a0, <4 x i32> %a1) {
2139 ; CHECK-LABEL: test_x86_avx512_psll_d:
2140 ; CHECK:       ## BB#0:
2141 ; CHECK-NEXT:    vpslld %xmm1, %zmm0, %zmm0
2142 ; CHECK-NEXT:    retq
2143   %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)
2144   ret <16 x i32> %res
2145 }
2146
2147 define <16 x i32> @test_x86_avx512_mask_psll_d(<16 x i32> %a0, <4 x i32> %a1, <16 x i32> %a2, i16 %mask) {
2148 ; CHECK-LABEL: test_x86_avx512_mask_psll_d:
2149 ; CHECK:       ## BB#0:
2150 ; CHECK-NEXT:    kmovw %edi, %k1
2151 ; CHECK-NEXT:    vpslld %xmm1, %zmm0, %zmm2 {%k1}
2152 ; CHECK-NEXT:    vmovdqa64 %zmm2, %zmm0
2153 ; CHECK-NEXT:    retq
2154   %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)
2155   ret <16 x i32> %res
2156 }
2157
2158 define <16 x i32> @test_x86_avx512_maskz_psll_d(<16 x i32> %a0, <4 x i32> %a1, i16 %mask) {
2159 ; CHECK-LABEL: test_x86_avx512_maskz_psll_d:
2160 ; CHECK:       ## BB#0:
2161 ; CHECK-NEXT:    kmovw %edi, %k1
2162 ; CHECK-NEXT:    vpslld %xmm1, %zmm0, %zmm0 {%k1} {z}
2163 ; CHECK-NEXT:    retq
2164   %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)
2165   ret <16 x i32> %res
2166 }
2167
2168 declare <16 x i32> @llvm.x86.avx512.mask.psll.d(<16 x i32>, <4 x i32>, <16 x i32>, i16) nounwind readnone
2169
2170 define <8 x i64> @test_x86_avx512_psll_q(<8 x i64> %a0, <2 x i64> %a1) {
2171 ; CHECK-LABEL: test_x86_avx512_psll_q:
2172 ; CHECK:       ## BB#0:
2173 ; CHECK-NEXT:    vpsllq %xmm1, %zmm0, %zmm0
2174 ; CHECK-NEXT:    retq
2175   %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)
2176   ret <8 x i64> %res
2177 }
2178
2179 define <8 x i64> @test_x86_avx512_mask_psll_q(<8 x i64> %a0, <2 x i64> %a1, <8 x i64> %a2, i8 %mask) {
2180 ; CHECK-LABEL: test_x86_avx512_mask_psll_q:
2181 ; CHECK:       ## BB#0:
2182 ; CHECK-NEXT:    kmovw %edi, %k1
2183 ; CHECK-NEXT:    vpsllq %xmm1, %zmm0, %zmm2 {%k1}
2184 ; CHECK-NEXT:    vmovdqa64 %zmm2, %zmm0
2185 ; CHECK-NEXT:    retq
2186   %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)
2187   ret <8 x i64> %res
2188 }
2189
2190 define <8 x i64> @test_x86_avx512_maskz_psll_q(<8 x i64> %a0, <2 x i64> %a1, i8 %mask) {
2191 ; CHECK-LABEL: test_x86_avx512_maskz_psll_q:
2192 ; CHECK:       ## BB#0:
2193 ; CHECK-NEXT:    kmovw %edi, %k1
2194 ; CHECK-NEXT:    vpsllq %xmm1, %zmm0, %zmm0 {%k1} {z}
2195 ; CHECK-NEXT:    retq
2196   %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)
2197   ret <8 x i64> %res
2198 }
2199
2200 declare <8 x i64> @llvm.x86.avx512.mask.psll.q(<8 x i64>, <2 x i64>, <8 x i64>, i8) nounwind readnone
2201
2202 define <16 x i32> @test_x86_avx512_psrl_d(<16 x i32> %a0, <4 x i32> %a1) {
2203 ; CHECK-LABEL: test_x86_avx512_psrl_d:
2204 ; CHECK:       ## BB#0:
2205 ; CHECK-NEXT:    vpsrld %xmm1, %zmm0, %zmm0
2206 ; CHECK-NEXT:    retq
2207   %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)
2208   ret <16 x i32> %res
2209 }
2210
2211 define <16 x i32> @test_x86_avx512_mask_psrl_d(<16 x i32> %a0, <4 x i32> %a1, <16 x i32> %a2, i16 %mask) {
2212 ; CHECK-LABEL: test_x86_avx512_mask_psrl_d:
2213 ; CHECK:       ## BB#0:
2214 ; CHECK-NEXT:    kmovw %edi, %k1
2215 ; CHECK-NEXT:    vpsrld %xmm1, %zmm0, %zmm2 {%k1}
2216 ; CHECK-NEXT:    vmovdqa64 %zmm2, %zmm0
2217 ; CHECK-NEXT:    retq
2218   %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)
2219   ret <16 x i32> %res
2220 }
2221
2222 define <16 x i32> @test_x86_avx512_maskz_psrl_d(<16 x i32> %a0, <4 x i32> %a1, i16 %mask) {
2223 ; CHECK-LABEL: test_x86_avx512_maskz_psrl_d:
2224 ; CHECK:       ## BB#0:
2225 ; CHECK-NEXT:    kmovw %edi, %k1
2226 ; CHECK-NEXT:    vpsrld %xmm1, %zmm0, %zmm0 {%k1} {z}
2227 ; CHECK-NEXT:    retq
2228   %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)
2229   ret <16 x i32> %res
2230 }
2231
2232 declare <16 x i32> @llvm.x86.avx512.mask.psrl.d(<16 x i32>, <4 x i32>, <16 x i32>, i16) nounwind readnone
2233
2234 define <8 x i64> @test_x86_avx512_psrl_q(<8 x i64> %a0, <2 x i64> %a1) {
2235 ; CHECK-LABEL: test_x86_avx512_psrl_q:
2236 ; CHECK:       ## BB#0:
2237 ; CHECK-NEXT:    vpsrlq %xmm1, %zmm0, %zmm0
2238 ; CHECK-NEXT:    retq
2239   %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)
2240   ret <8 x i64> %res
2241 }
2242
2243 define <8 x i64> @test_x86_avx512_mask_psrl_q(<8 x i64> %a0, <2 x i64> %a1, <8 x i64> %a2, i8 %mask) {
2244 ; CHECK-LABEL: test_x86_avx512_mask_psrl_q:
2245 ; CHECK:       ## BB#0:
2246 ; CHECK-NEXT:    kmovw %edi, %k1
2247 ; CHECK-NEXT:    vpsrlq %xmm1, %zmm0, %zmm2 {%k1}
2248 ; CHECK-NEXT:    vmovdqa64 %zmm2, %zmm0
2249 ; CHECK-NEXT:    retq
2250   %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)
2251   ret <8 x i64> %res
2252 }
2253
2254 define <8 x i64> @test_x86_avx512_maskz_psrl_q(<8 x i64> %a0, <2 x i64> %a1, i8 %mask) {
2255 ; CHECK-LABEL: test_x86_avx512_maskz_psrl_q:
2256 ; CHECK:       ## BB#0:
2257 ; CHECK-NEXT:    kmovw %edi, %k1
2258 ; CHECK-NEXT:    vpsrlq %xmm1, %zmm0, %zmm0 {%k1} {z}
2259 ; CHECK-NEXT:    retq
2260   %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)
2261   ret <8 x i64> %res
2262 }
2263
2264 declare <8 x i64> @llvm.x86.avx512.mask.psrl.q(<8 x i64>, <2 x i64>, <8 x i64>, i8) nounwind readnone
2265
2266 define <16 x i32> @test_x86_avx512_psra_d(<16 x i32> %a0, <4 x i32> %a1) {
2267 ; CHECK-LABEL: test_x86_avx512_psra_d:
2268 ; CHECK:       ## BB#0:
2269 ; CHECK-NEXT:    vpsrad %xmm1, %zmm0, %zmm0
2270 ; CHECK-NEXT:    retq
2271   %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)
2272   ret <16 x i32> %res
2273 }
2274
2275 define <16 x i32> @test_x86_avx512_mask_psra_d(<16 x i32> %a0, <4 x i32> %a1, <16 x i32> %a2, i16 %mask) {
2276 ; CHECK-LABEL: test_x86_avx512_mask_psra_d:
2277 ; CHECK:       ## BB#0:
2278 ; CHECK-NEXT:    kmovw %edi, %k1
2279 ; CHECK-NEXT:    vpsrad %xmm1, %zmm0, %zmm2 {%k1}
2280 ; CHECK-NEXT:    vmovdqa64 %zmm2, %zmm0
2281 ; CHECK-NEXT:    retq
2282   %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)
2283   ret <16 x i32> %res
2284 }
2285
2286 define <16 x i32> @test_x86_avx512_maskz_psra_d(<16 x i32> %a0, <4 x i32> %a1, i16 %mask) {
2287 ; CHECK-LABEL: test_x86_avx512_maskz_psra_d:
2288 ; CHECK:       ## BB#0:
2289 ; CHECK-NEXT:    kmovw %edi, %k1
2290 ; CHECK-NEXT:    vpsrad %xmm1, %zmm0, %zmm0 {%k1} {z}
2291 ; CHECK-NEXT:    retq
2292   %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)
2293   ret <16 x i32> %res
2294 }
2295
2296 declare <16 x i32> @llvm.x86.avx512.mask.psra.d(<16 x i32>, <4 x i32>, <16 x i32>, i16) nounwind readnone
2297
2298 define <8 x i64> @test_x86_avx512_psra_q(<8 x i64> %a0, <2 x i64> %a1) {
2299 ; CHECK-LABEL: test_x86_avx512_psra_q:
2300 ; CHECK:       ## BB#0:
2301 ; CHECK-NEXT:    vpsraq %xmm1, %zmm0, %zmm0
2302 ; CHECK-NEXT:    retq
2303   %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)
2304   ret <8 x i64> %res
2305 }
2306
2307 define <8 x i64> @test_x86_avx512_mask_psra_q(<8 x i64> %a0, <2 x i64> %a1, <8 x i64> %a2, i8 %mask) {
2308 ; CHECK-LABEL: test_x86_avx512_mask_psra_q:
2309 ; CHECK:       ## BB#0:
2310 ; CHECK-NEXT:    kmovw %edi, %k1
2311 ; CHECK-NEXT:    vpsraq %xmm1, %zmm0, %zmm2 {%k1}
2312 ; CHECK-NEXT:    vmovdqa64 %zmm2, %zmm0
2313 ; CHECK-NEXT:    retq
2314   %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)
2315   ret <8 x i64> %res
2316 }
2317
2318 define <8 x i64> @test_x86_avx512_maskz_psra_q(<8 x i64> %a0, <2 x i64> %a1, i8 %mask) {
2319 ; CHECK-LABEL: test_x86_avx512_maskz_psra_q:
2320 ; CHECK:       ## BB#0:
2321 ; CHECK-NEXT:    kmovw %edi, %k1
2322 ; CHECK-NEXT:    vpsraq %xmm1, %zmm0, %zmm0 {%k1} {z}
2323 ; CHECK-NEXT:    retq
2324   %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)
2325   ret <8 x i64> %res
2326 }
2327
2328 declare <8 x i64> @llvm.x86.avx512.mask.psra.q(<8 x i64>, <2 x i64>, <8 x i64>, i8) nounwind readnone
2329
2330 define <16 x i32> @test_x86_avx512_psllv_d(<16 x i32> %a0, <16 x i32> %a1) {
2331 ; CHECK-LABEL: test_x86_avx512_psllv_d:
2332 ; CHECK:       ## BB#0:
2333 ; CHECK-NEXT:    vpsllvd %zmm1, %zmm0, %zmm0
2334 ; CHECK-NEXT:    retq
2335   %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)
2336   ret <16 x i32> %res
2337 }
2338
2339 define <16 x i32> @test_x86_avx512_mask_psllv_d(<16 x i32> %a0, <16 x i32> %a1, <16 x i32> %a2, i16 %mask) {
2340 ; CHECK-LABEL: test_x86_avx512_mask_psllv_d:
2341 ; CHECK:       ## BB#0:
2342 ; CHECK-NEXT:    kmovw %edi, %k1
2343 ; CHECK-NEXT:    vpsllvd %zmm1, %zmm0, %zmm2 {%k1}
2344 ; CHECK-NEXT:    vmovdqa64 %zmm2, %zmm0
2345 ; CHECK-NEXT:    retq
2346   %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)
2347   ret <16 x i32> %res
2348 }
2349
2350 define <16 x i32> @test_x86_avx512_maskz_psllv_d(<16 x i32> %a0, <16 x i32> %a1, i16 %mask) {
2351 ; CHECK-LABEL: test_x86_avx512_maskz_psllv_d:
2352 ; CHECK:       ## BB#0:
2353 ; CHECK-NEXT:    kmovw %edi, %k1
2354 ; CHECK-NEXT:    vpsllvd %zmm1, %zmm0, %zmm0 {%k1} {z}
2355 ; CHECK-NEXT:    retq
2356   %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)
2357   ret <16 x i32> %res
2358 }
2359
2360 declare <16 x i32> @llvm.x86.avx512.mask.psllv.d(<16 x i32>, <16 x i32>, <16 x i32>, i16) nounwind readnone
2361
2362 define <8 x i64> @test_x86_avx512_psllv_q(<8 x i64> %a0, <8 x i64> %a1) {
2363 ; CHECK-LABEL: test_x86_avx512_psllv_q:
2364 ; CHECK:       ## BB#0:
2365 ; CHECK-NEXT:    vpsllvq %zmm1, %zmm0, %zmm0
2366 ; CHECK-NEXT:    retq
2367   %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)
2368   ret <8 x i64> %res
2369 }
2370
2371 define <8 x i64> @test_x86_avx512_mask_psllv_q(<8 x i64> %a0, <8 x i64> %a1, <8 x i64> %a2, i8 %mask) {
2372 ; CHECK-LABEL: test_x86_avx512_mask_psllv_q:
2373 ; CHECK:       ## BB#0:
2374 ; CHECK-NEXT:    kmovw %edi, %k1
2375 ; CHECK-NEXT:    vpsllvq %zmm1, %zmm0, %zmm2 {%k1}
2376 ; CHECK-NEXT:    vmovdqa64 %zmm2, %zmm0
2377 ; CHECK-NEXT:    retq
2378   %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)
2379   ret <8 x i64> %res
2380 }
2381
2382 define <8 x i64> @test_x86_avx512_maskz_psllv_q(<8 x i64> %a0, <8 x i64> %a1, i8 %mask) {
2383 ; CHECK-LABEL: test_x86_avx512_maskz_psllv_q:
2384 ; CHECK:       ## BB#0:
2385 ; CHECK-NEXT:    kmovw %edi, %k1
2386 ; CHECK-NEXT:    vpsllvq %zmm1, %zmm0, %zmm0 {%k1} {z}
2387 ; CHECK-NEXT:    retq
2388   %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)
2389   ret <8 x i64> %res
2390 }
2391
2392 declare <8 x i64> @llvm.x86.avx512.mask.psllv.q(<8 x i64>, <8 x i64>, <8 x i64>, i8) nounwind readnone
2393
2394
2395 define <16 x i32> @test_x86_avx512_psrav_d(<16 x i32> %a0, <16 x i32> %a1) {
2396 ; CHECK-LABEL: test_x86_avx512_psrav_d:
2397 ; CHECK:       ## BB#0:
2398 ; CHECK-NEXT:    vpsravd %zmm1, %zmm0, %zmm0
2399 ; CHECK-NEXT:    retq
2400   %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)
2401   ret <16 x i32> %res
2402 }
2403
2404 define <16 x i32> @test_x86_avx512_mask_psrav_d(<16 x i32> %a0, <16 x i32> %a1, <16 x i32> %a2, i16 %mask) {
2405 ; CHECK-LABEL: test_x86_avx512_mask_psrav_d:
2406 ; CHECK:       ## BB#0:
2407 ; CHECK-NEXT:    kmovw %edi, %k1
2408 ; CHECK-NEXT:    vpsravd %zmm1, %zmm0, %zmm2 {%k1}
2409 ; CHECK-NEXT:    vmovdqa64 %zmm2, %zmm0
2410 ; CHECK-NEXT:    retq
2411   %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)
2412   ret <16 x i32> %res
2413 }
2414
2415 define <16 x i32> @test_x86_avx512_maskz_psrav_d(<16 x i32> %a0, <16 x i32> %a1, i16 %mask) {
2416 ; CHECK-LABEL: test_x86_avx512_maskz_psrav_d:
2417 ; CHECK:       ## BB#0:
2418 ; CHECK-NEXT:    kmovw %edi, %k1
2419 ; CHECK-NEXT:    vpsravd %zmm1, %zmm0, %zmm0 {%k1} {z}
2420 ; CHECK-NEXT:    retq
2421   %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)
2422   ret <16 x i32> %res
2423 }
2424
2425 declare <16 x i32> @llvm.x86.avx512.mask.psrav.d(<16 x i32>, <16 x i32>, <16 x i32>, i16) nounwind readnone
2426
2427 define <8 x i64> @test_x86_avx512_psrav_q(<8 x i64> %a0, <8 x i64> %a1) {
2428 ; CHECK-LABEL: test_x86_avx512_psrav_q:
2429 ; CHECK:       ## BB#0:
2430 ; CHECK-NEXT:    vpsravq %zmm1, %zmm0, %zmm0
2431 ; CHECK-NEXT:    retq
2432   %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)
2433   ret <8 x i64> %res
2434 }
2435
2436 define <8 x i64> @test_x86_avx512_mask_psrav_q(<8 x i64> %a0, <8 x i64> %a1, <8 x i64> %a2, i8 %mask) {
2437 ; CHECK-LABEL: test_x86_avx512_mask_psrav_q:
2438 ; CHECK:       ## BB#0:
2439 ; CHECK-NEXT:    kmovw %edi, %k1
2440 ; CHECK-NEXT:    vpsravq %zmm1, %zmm0, %zmm2 {%k1}
2441 ; CHECK-NEXT:    vmovdqa64 %zmm2, %zmm0
2442 ; CHECK-NEXT:    retq
2443   %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)
2444   ret <8 x i64> %res
2445 }
2446
2447 define <8 x i64> @test_x86_avx512_maskz_psrav_q(<8 x i64> %a0, <8 x i64> %a1, i8 %mask) {
2448 ; CHECK-LABEL: test_x86_avx512_maskz_psrav_q:
2449 ; CHECK:       ## BB#0:
2450 ; CHECK-NEXT:    kmovw %edi, %k1
2451 ; CHECK-NEXT:    vpsravq %zmm1, %zmm0, %zmm0 {%k1} {z}
2452 ; CHECK-NEXT:    retq
2453   %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)
2454   ret <8 x i64> %res
2455 }
2456
2457 declare <8 x i64> @llvm.x86.avx512.mask.psrav.q(<8 x i64>, <8 x i64>, <8 x i64>, i8) nounwind readnone
2458
2459 define <16 x i32> @test_x86_avx512_psrlv_d(<16 x i32> %a0, <16 x i32> %a1) {
2460 ; CHECK-LABEL: test_x86_avx512_psrlv_d:
2461 ; CHECK:       ## BB#0:
2462 ; CHECK-NEXT:    vpsrlvd %zmm1, %zmm0, %zmm0
2463 ; CHECK-NEXT:    retq
2464   %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)
2465   ret <16 x i32> %res
2466 }
2467
2468 define <16 x i32> @test_x86_avx512_mask_psrlv_d(<16 x i32> %a0, <16 x i32> %a1, <16 x i32> %a2, i16 %mask) {
2469 ; CHECK-LABEL: test_x86_avx512_mask_psrlv_d:
2470 ; CHECK:       ## BB#0:
2471 ; CHECK-NEXT:    kmovw %edi, %k1
2472 ; CHECK-NEXT:    vpsrlvd %zmm1, %zmm0, %zmm2 {%k1}
2473 ; CHECK-NEXT:    vmovdqa64 %zmm2, %zmm0
2474 ; CHECK-NEXT:    retq
2475   %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)
2476   ret <16 x i32> %res
2477 }
2478
2479 define <16 x i32> @test_x86_avx512_maskz_psrlv_d(<16 x i32> %a0, <16 x i32> %a1, i16 %mask) {
2480 ; CHECK-LABEL: test_x86_avx512_maskz_psrlv_d:
2481 ; CHECK:       ## BB#0:
2482 ; CHECK-NEXT:    kmovw %edi, %k1
2483 ; CHECK-NEXT:    vpsrlvd %zmm1, %zmm0, %zmm0 {%k1} {z}
2484 ; CHECK-NEXT:    retq
2485   %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)
2486   ret <16 x i32> %res
2487 }
2488
2489 declare <16 x i32> @llvm.x86.avx512.mask.psrlv.d(<16 x i32>, <16 x i32>, <16 x i32>, i16) nounwind readnone
2490
2491 define <8 x i64> @test_x86_avx512_psrlv_q(<8 x i64> %a0, <8 x i64> %a1) {
2492 ; CHECK-LABEL: test_x86_avx512_psrlv_q:
2493 ; CHECK:       ## BB#0:
2494 ; CHECK-NEXT:    vpsrlvq %zmm1, %zmm0, %zmm0
2495 ; CHECK-NEXT:    retq
2496   %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)
2497   ret <8 x i64> %res
2498 }
2499
2500 define <8 x i64> @test_x86_avx512_mask_psrlv_q(<8 x i64> %a0, <8 x i64> %a1, <8 x i64> %a2, i8 %mask) {
2501 ; CHECK-LABEL: test_x86_avx512_mask_psrlv_q:
2502 ; CHECK:       ## BB#0:
2503 ; CHECK-NEXT:    kmovw %edi, %k1
2504 ; CHECK-NEXT:    vpsrlvq %zmm1, %zmm0, %zmm2 {%k1}
2505 ; CHECK-NEXT:    vmovdqa64 %zmm2, %zmm0
2506 ; CHECK-NEXT:    retq
2507   %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)
2508   ret <8 x i64> %res
2509 }
2510
2511 define <8 x i64> @test_x86_avx512_maskz_psrlv_q(<8 x i64> %a0, <8 x i64> %a1, i8 %mask) {
2512 ; CHECK-LABEL: test_x86_avx512_maskz_psrlv_q:
2513 ; CHECK:       ## BB#0:
2514 ; CHECK-NEXT:    kmovw %edi, %k1
2515 ; CHECK-NEXT:    vpsrlvq %zmm1, %zmm0, %zmm0 {%k1} {z}
2516 ; CHECK-NEXT:    retq
2517   %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)
2518   ret <8 x i64> %res
2519 }
2520
2521 declare <8 x i64> @llvm.x86.avx512.mask.psrlv.q(<8 x i64>, <8 x i64>, <8 x i64>, i8) nounwind readnone
2522
2523 define <8 x i64> @test_x86_avx512_psrlv_q_memop(<8 x i64> %a0, <8 x i64>* %ptr) {
2524 ; CHECK-LABEL: test_x86_avx512_psrlv_q_memop:
2525 ; CHECK:       ## BB#0:
2526 ; CHECK-NEXT:    vpsrlvq (%rdi), %zmm0, %zmm0
2527 ; CHECK-NEXT:    retq
2528   %b = load <8 x i64>, <8 x i64>* %ptr
2529   %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)
2530   ret <8 x i64> %res
2531 }
2532
2533 declare <8 x double> @llvm.x86.avx512.mask.cvtdq2pd.512(<8 x i32>, <8 x double>, i8)
2534
2535 define <8 x double>@test_int_x86_avx512_mask_cvt_dq2pd_512(<8 x i32> %x0, <8 x double> %x1, i8 %x2) {
2536 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_dq2pd_512:
2537 ; CHECK:       ## BB#0:
2538 ; CHECK-NEXT:    vcvtdq2pd %ymm0, %zmm2
2539 ; CHECK-NEXT:    kmovw %edi, %k1
2540 ; CHECK-NEXT:    vcvtdq2pd %ymm0, %zmm1 {%k1}
2541 ; CHECK-NEXT:    vaddpd %zmm2, %zmm1, %zmm0
2542 ; CHECK-NEXT:    retq
2543   %res = call <8 x double> @llvm.x86.avx512.mask.cvtdq2pd.512(<8 x i32> %x0, <8 x double> %x1, i8 %x2)
2544   %res1 = call <8 x double> @llvm.x86.avx512.mask.cvtdq2pd.512(<8 x i32> %x0, <8 x double> %x1, i8 -1)
2545   %res2 = fadd <8 x double> %res, %res1
2546   ret <8 x double> %res2
2547 }
2548
2549 declare <8 x double> @llvm.x86.avx512.mask.cvtudq2pd.512(<8 x i32>, <8 x double>, i8)
2550
2551 define <8 x double>@test_int_x86_avx512_mask_cvt_udq2pd_512(<8 x i32> %x0, <8 x double> %x1, i8 %x2) {
2552 ; CHECK-LABEL: test_int_x86_avx512_mask_cvt_udq2pd_512:
2553 ; CHECK:       ## BB#0:
2554 ; CHECK-NEXT:    vcvtudq2pd %ymm0, %zmm2
2555 ; CHECK-NEXT:    kmovw %edi, %k1
2556 ; CHECK-NEXT:    vcvtudq2pd %ymm0, %zmm1 {%k1}
2557 ; CHECK-NEXT:    vaddpd %zmm2, %zmm1, %zmm0
2558 ; CHECK-NEXT:    retq
2559   %res = call <8 x double> @llvm.x86.avx512.mask.cvtudq2pd.512(<8 x i32> %x0, <8 x double> %x1, i8 %x2)
2560   %res1 = call <8 x double> @llvm.x86.avx512.mask.cvtudq2pd.512(<8 x i32> %x0, <8 x double> %x1, i8 -1)
2561   %res2 = fadd <8 x double> %res, %res1
2562   ret <8 x double> %res2
2563 }
2564
2565 define <8 x i64> @test_valign_q(<8 x i64> %a, <8 x i64> %b) {
2566 ; CHECK-LABEL: test_valign_q:
2567 ; CHECK:       ## BB#0:
2568 ; CHECK-NEXT:    valignq {{.*#+}} zmm0 = zmm1[2,3,4,5,6,7],zmm0[0,1]
2569 ; CHECK-NEXT:    retq
2570   %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)
2571   ret <8 x i64> %res
2572 }
2573
2574 define <8 x i64> @test_mask_valign_q(<8 x i64> %a, <8 x i64> %b, <8 x i64> %src, i8 %mask) {
2575 ; CHECK-LABEL: test_mask_valign_q:
2576 ; CHECK:       ## BB#0:
2577 ; CHECK-NEXT:    kmovw %edi, %k1
2578 ; CHECK-NEXT:    valignq {{.*#+}} zmm2 {%k1} = zmm1[2,3,4,5,6,7],zmm0[0,1]
2579 ; CHECK-NEXT:    vmovdqa64 %zmm2, %zmm0
2580 ; CHECK-NEXT:    retq
2581   %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)
2582   ret <8 x i64> %res
2583 }
2584
2585 declare <8 x i64> @llvm.x86.avx512.mask.valign.q.512(<8 x i64>, <8 x i64>, i32, <8 x i64>, i8)
2586
2587 define <16 x i32> @test_maskz_valign_d(<16 x i32> %a, <16 x i32> %b, i16 %mask) {
2588 ; CHECK-LABEL: test_maskz_valign_d:
2589 ; CHECK:       ## BB#0:
2590 ; CHECK-NEXT:    kmovw %edi, %k1
2591 ; CHECK-NEXT:    valignd {{.*#+}} zmm0 {%k1} {z} = zmm1[5,6,7,8,9,10,11,12,13,14,15],zmm0[0,1,2,3,4]
2592 ; CHECK-NEXT:    retq
2593   %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)
2594   ret <16 x i32> %res
2595 }
2596
2597 declare <16 x i32> @llvm.x86.avx512.mask.valign.d.512(<16 x i32>, <16 x i32>, i32, <16 x i32>, i16)
2598
2599 declare <8 x double> @llvm.x86.avx512.mask.vpermilvar.pd.512(<8 x double>, <8 x i64>, <8 x double>, i8)
2600
2601 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) {
2602 ; CHECK-LABEL: test_int_x86_avx512_mask_vpermilvar_pd_512:
2603 ; CHECK:       ## BB#0:
2604 ; CHECK-NEXT:    vpermilpd %zmm1, %zmm0, %zmm3
2605 ; CHECK-NEXT:    kmovw %edi, %k1
2606 ; CHECK-NEXT:    vpermilpd %zmm1, %zmm0, %zmm2 {%k1}
2607 ; CHECK-NEXT:    vpermilpd %zmm1, %zmm0, %zmm0 {%k1} {z}
2608 ; CHECK-NEXT:    vaddpd %zmm0, %zmm2, %zmm0
2609 ; CHECK-NEXT:    vaddpd %zmm0, %zmm3, %zmm0
2610 ; CHECK-NEXT:    retq
2611   %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)
2612   %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)
2613   %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)
2614   %res3 = fadd <8 x double> %res, %res1
2615   %res4 = fadd <8 x double> %res2, %res3
2616   ret <8 x double> %res4
2617 }
2618
2619 declare <16 x float> @llvm.x86.avx512.mask.vpermilvar.ps.512(<16 x float>, <16 x i32>, <16 x float>, i16)
2620
2621 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) {
2622 ; CHECK-LABEL: test_int_x86_avx512_mask_vpermilvar_ps_512:
2623 ; CHECK:       ## BB#0:
2624 ; CHECK-NEXT:    vpermilps %zmm1, %zmm0, %zmm3
2625 ; CHECK-NEXT:    kmovw %edi, %k1
2626 ; CHECK-NEXT:    vpermilps %zmm1, %zmm0, %zmm2 {%k1}
2627 ; CHECK-NEXT:    vpermilps %zmm1, %zmm0, %zmm0 {%k1} {z}
2628 ; CHECK-NEXT:    vaddps %zmm0, %zmm2, %zmm0
2629 ; CHECK-NEXT:    vaddps %zmm0, %zmm3, %zmm0
2630 ; CHECK-NEXT:    retq
2631   %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)
2632   %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)
2633   %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)
2634   %res3 = fadd <16 x float> %res, %res1
2635   %res4 = fadd <16 x float> %res2, %res3
2636   ret <16 x float> %res4
2637 }
2638
2639 ; Test case to make sure we can print shuffle decode comments for constant pool loads.
2640 define <16 x float>@test_int_x86_avx512_mask_vpermilvar_ps_512_constant_pool(<16 x float> %x0, <16 x i32> %x1, <16 x float> %x2, i16 %x3) {
2641 ; CHECK-LABEL: test_int_x86_avx512_mask_vpermilvar_ps_512_constant_pool:
2642 ; CHECK:       ## BB#0:
2643 ; CHECK-NEXT:    kmovw %edi, %k1
2644 ; CHECK-NEXT:    vpermilps {{.*#+}} zmm2 {%k1} = zmm0[2,3,0,1,7,6,5,4,9,8,11,10,12,13,14,15]
2645 ; CHECK-NEXT:    vpermilps {{.*#+}} zmm1 {%k1} {z} = zmm0[1,0,3,2,4,5,6,7,9,8,11,10,12,13,14,15]
2646 ; CHECK-NEXT:    vpermilps {{.*#+}} zmm0 = zmm0[1,0,3,2,4,5,6,7,10,11,8,9,14,15,13,12]
2647 ; CHECK-NEXT:    vaddps %zmm1, %zmm2, %zmm1
2648 ; CHECK-NEXT:    vaddps %zmm1, %zmm0, %zmm0
2649 ; CHECK-NEXT:    retq
2650   %res = call <16 x float> @llvm.x86.avx512.mask.vpermilvar.ps.512(<16 x float> %x0, <16 x i32> <i32 2, i32 3, i32 0, i32 1, i32 3, i32 2, i32 1, i32 0, i32 1, i32 0, i32 3, i32 2, i32 0, i32 1, i32 2, i32 3>, <16 x float> %x2, i16 %x3)
2651   %res1 = call <16 x float> @llvm.x86.avx512.mask.vpermilvar.ps.512(<16 x float> %x0, <16 x i32> <i32 1, i32 0, i32 3, i32 2, i32 0, i32 1, i32 2, i32 3, i32 1, i32 0, i32 3, i32 2, i32 0, i32 1, i32 2, i32 3>, <16 x float> zeroinitializer, i16 %x3)
2652   %res2 = call <16 x float> @llvm.x86.avx512.mask.vpermilvar.ps.512(<16 x float> %x0, <16 x i32> <i32 1, i32 0, i32 3, i32 2, i32 0, i32 1, i32 2, i32 3, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3, i32 1, i32 0>, <16 x float> %x2, i16 -1)
2653   %res3 = fadd <16 x float> %res, %res1
2654   %res4 = fadd <16 x float> %res2, %res3
2655   ret <16 x float> %res4
2656 }
2657
2658 define <8 x i64> @test_mask_mul_epi32_rr(<16 x i32> %a, <16 x i32> %b) {
2659 ; CHECK-LABEL: test_mask_mul_epi32_rr:
2660 ; CHECK:       ## BB#0:
2661 ; CHECK-NEXT:    vpmuldq %zmm1, %zmm0, %zmm0
2662 ; CHECK-NEXT:    retq
2663   %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)
2664   ret < 8 x i64> %res
2665 }
2666
2667 define <8 x i64> @test_mask_mul_epi32_rrk(<16 x i32> %a, <16 x i32> %b, <8 x i64> %passThru, i8 %mask) {
2668 ; CHECK-LABEL: test_mask_mul_epi32_rrk:
2669 ; CHECK:       ## BB#0:
2670 ; CHECK-NEXT:    kmovw %edi, %k1
2671 ; CHECK-NEXT:    vpmuldq %zmm1, %zmm0, %zmm2 {%k1}
2672 ; CHECK-NEXT:    vmovdqa64 %zmm2, %zmm0
2673 ; CHECK-NEXT:    retq
2674   %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)
2675   ret < 8 x i64> %res
2676 }
2677
2678 define <8 x i64> @test_mask_mul_epi32_rrkz(<16 x i32> %a, <16 x i32> %b, i8 %mask) {
2679 ; CHECK-LABEL: test_mask_mul_epi32_rrkz:
2680 ; CHECK:       ## BB#0:
2681 ; CHECK-NEXT:    kmovw %edi, %k1
2682 ; CHECK-NEXT:    vpmuldq %zmm1, %zmm0, %zmm0 {%k1} {z}
2683 ; CHECK-NEXT:    retq
2684   %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)
2685   ret < 8 x i64> %res
2686 }
2687
2688 define <8 x i64> @test_mask_mul_epi32_rm(<16 x i32> %a, <16 x i32>* %ptr_b) {
2689 ; CHECK-LABEL: test_mask_mul_epi32_rm:
2690 ; CHECK:       ## BB#0:
2691 ; CHECK-NEXT:    vpmuldq (%rdi), %zmm0, %zmm0
2692 ; CHECK-NEXT:    retq
2693   %b = load <16 x i32>, <16 x i32>* %ptr_b
2694   %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)
2695   ret < 8 x i64> %res
2696 }
2697
2698 define <8 x i64> @test_mask_mul_epi32_rmk(<16 x i32> %a, <16 x i32>* %ptr_b, <8 x i64> %passThru, i8 %mask) {
2699 ; CHECK-LABEL: test_mask_mul_epi32_rmk:
2700 ; CHECK:       ## BB#0:
2701 ; CHECK-NEXT:    kmovw %esi, %k1
2702 ; CHECK-NEXT:    vpmuldq (%rdi), %zmm0, %zmm1 {%k1}
2703 ; CHECK-NEXT:    vmovdqa64 %zmm1, %zmm0
2704 ; CHECK-NEXT:    retq
2705   %b = load <16 x i32>, <16 x i32>* %ptr_b
2706   %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)
2707   ret < 8 x i64> %res
2708 }
2709
2710 define <8 x i64> @test_mask_mul_epi32_rmkz(<16 x i32> %a, <16 x i32>* %ptr_b, i8 %mask) {
2711 ; CHECK-LABEL: test_mask_mul_epi32_rmkz:
2712 ; CHECK:       ## BB#0:
2713 ; CHECK-NEXT:    kmovw %esi, %k1
2714 ; CHECK-NEXT:    vpmuldq (%rdi), %zmm0, %zmm0 {%k1} {z}
2715 ; CHECK-NEXT:    retq
2716   %b = load <16 x i32>, <16 x i32>* %ptr_b
2717   %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)
2718   ret < 8 x i64> %res
2719 }
2720
2721 define <8 x i64> @test_mask_mul_epi32_rmb(<16 x i32> %a, i64* %ptr_b) {
2722 ; CHECK-LABEL: test_mask_mul_epi32_rmb:
2723 ; CHECK:       ## BB#0:
2724 ; CHECK-NEXT:    vpmuldq (%rdi){1to8}, %zmm0, %zmm0
2725 ; CHECK-NEXT:    retq
2726   %q = load i64, i64* %ptr_b
2727   %vecinit.i = insertelement <8 x i64> undef, i64 %q, i32 0
2728   %b64 = shufflevector <8 x i64> %vecinit.i, <8 x i64> undef, <8 x i32> zeroinitializer
2729   %b = bitcast <8 x i64> %b64 to <16 x i32>
2730   %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)
2731   ret < 8 x i64> %res
2732 }
2733
2734 define <8 x i64> @test_mask_mul_epi32_rmbk(<16 x i32> %a, i64* %ptr_b, <8 x i64> %passThru, i8 %mask) {
2735 ; CHECK-LABEL: test_mask_mul_epi32_rmbk:
2736 ; CHECK:       ## BB#0:
2737 ; CHECK-NEXT:    kmovw %esi, %k1
2738 ; CHECK-NEXT:    vpmuldq (%rdi){1to8}, %zmm0, %zmm1 {%k1}
2739 ; CHECK-NEXT:    vmovdqa64 %zmm1, %zmm0
2740 ; CHECK-NEXT:    retq
2741   %q = load i64, i64* %ptr_b
2742   %vecinit.i = insertelement <8 x i64> undef, i64 %q, i32 0
2743   %b64 = shufflevector <8 x i64> %vecinit.i, <8 x i64> undef, <8 x i32> zeroinitializer
2744   %b = bitcast <8 x i64> %b64 to <16 x i32>
2745   %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)
2746   ret < 8 x i64> %res
2747 }
2748
2749 define <8 x i64> @test_mask_mul_epi32_rmbkz(<16 x i32> %a, i64* %ptr_b, i8 %mask) {
2750 ; CHECK-LABEL: test_mask_mul_epi32_rmbkz:
2751 ; CHECK:       ## BB#0:
2752 ; CHECK-NEXT:    kmovw %esi, %k1
2753 ; CHECK-NEXT:    vpmuldq (%rdi){1to8}, %zmm0, %zmm0 {%k1} {z}
2754 ; CHECK-NEXT:    retq
2755   %q = load i64, i64* %ptr_b
2756   %vecinit.i = insertelement <8 x i64> undef, i64 %q, i32 0
2757   %b64 = shufflevector <8 x i64> %vecinit.i, <8 x i64> undef, <8 x i32> zeroinitializer
2758   %b = bitcast <8 x i64> %b64 to <16 x i32>
2759   %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)
2760   ret < 8 x i64> %res
2761 }
2762
2763 declare <8 x i64> @llvm.x86.avx512.mask.pmul.dq.512(<16 x i32>, <16 x i32>, <8 x i64>, i8)
2764
2765 define <8 x i64> @test_mask_mul_epu32_rr(<16 x i32> %a, <16 x i32> %b) {
2766 ; CHECK-LABEL: test_mask_mul_epu32_rr:
2767 ; CHECK:       ## BB#0:
2768 ; CHECK-NEXT:    vpmuludq %zmm1, %zmm0, %zmm0
2769 ; CHECK-NEXT:    retq
2770   %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)
2771   ret < 8 x i64> %res
2772 }
2773
2774 define <8 x i64> @test_mask_mul_epu32_rrk(<16 x i32> %a, <16 x i32> %b, <8 x i64> %passThru, i8 %mask) {
2775 ; CHECK-LABEL: test_mask_mul_epu32_rrk:
2776 ; CHECK:       ## BB#0:
2777 ; CHECK-NEXT:    kmovw %edi, %k1
2778 ; CHECK-NEXT:    vpmuludq %zmm1, %zmm0, %zmm2 {%k1}
2779 ; CHECK-NEXT:    vmovdqa64 %zmm2, %zmm0
2780 ; CHECK-NEXT:    retq
2781   %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)
2782   ret < 8 x i64> %res
2783 }
2784
2785 define <8 x i64> @test_mask_mul_epu32_rrkz(<16 x i32> %a, <16 x i32> %b, i8 %mask) {
2786 ; CHECK-LABEL: test_mask_mul_epu32_rrkz:
2787 ; CHECK:       ## BB#0:
2788 ; CHECK-NEXT:    kmovw %edi, %k1
2789 ; CHECK-NEXT:    vpmuludq %zmm1, %zmm0, %zmm0 {%k1} {z}
2790 ; CHECK-NEXT:    retq
2791   %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)
2792   ret < 8 x i64> %res
2793 }
2794
2795 define <8 x i64> @test_mask_mul_epu32_rm(<16 x i32> %a, <16 x i32>* %ptr_b) {
2796 ; CHECK-LABEL: test_mask_mul_epu32_rm:
2797 ; CHECK:       ## BB#0:
2798 ; CHECK-NEXT:    vpmuludq (%rdi), %zmm0, %zmm0
2799 ; CHECK-NEXT:    retq
2800   %b = load <16 x i32>, <16 x i32>* %ptr_b
2801   %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)
2802   ret < 8 x i64> %res
2803 }
2804
2805 define <8 x i64> @test_mask_mul_epu32_rmk(<16 x i32> %a, <16 x i32>* %ptr_b, <8 x i64> %passThru, i8 %mask) {
2806 ; CHECK-LABEL: test_mask_mul_epu32_rmk:
2807 ; CHECK:       ## BB#0:
2808 ; CHECK-NEXT:    kmovw %esi, %k1
2809 ; CHECK-NEXT:    vpmuludq (%rdi), %zmm0, %zmm1 {%k1}
2810 ; CHECK-NEXT:    vmovdqa64 %zmm1, %zmm0
2811 ; CHECK-NEXT:    retq
2812   %b = load <16 x i32>, <16 x i32>* %ptr_b
2813   %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)
2814   ret < 8 x i64> %res
2815 }
2816
2817 define <8 x i64> @test_mask_mul_epu32_rmkz(<16 x i32> %a, <16 x i32>* %ptr_b, i8 %mask) {
2818 ; CHECK-LABEL: test_mask_mul_epu32_rmkz:
2819 ; CHECK:       ## BB#0:
2820 ; CHECK-NEXT:    kmovw %esi, %k1
2821 ; CHECK-NEXT:    vpmuludq (%rdi), %zmm0, %zmm0 {%k1} {z}
2822 ; CHECK-NEXT:    retq
2823   %b = load <16 x i32>, <16 x i32>* %ptr_b
2824   %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)
2825   ret < 8 x i64> %res
2826 }
2827
2828 define <8 x i64> @test_mask_mul_epu32_rmb(<16 x i32> %a, i64* %ptr_b) {
2829 ; CHECK-LABEL: test_mask_mul_epu32_rmb:
2830 ; CHECK:       ## BB#0:
2831 ; CHECK-NEXT:    vpmuludq (%rdi){1to8}, %zmm0, %zmm0
2832 ; CHECK-NEXT:    retq
2833   %q = load i64, i64* %ptr_b
2834   %vecinit.i = insertelement <8 x i64> undef, i64 %q, i32 0
2835   %b64 = shufflevector <8 x i64> %vecinit.i, <8 x i64> undef, <8 x i32> zeroinitializer
2836   %b = bitcast <8 x i64> %b64 to <16 x i32>
2837   %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)
2838   ret < 8 x i64> %res
2839 }
2840
2841 define <8 x i64> @test_mask_mul_epu32_rmbk(<16 x i32> %a, i64* %ptr_b, <8 x i64> %passThru, i8 %mask) {
2842 ; CHECK-LABEL: test_mask_mul_epu32_rmbk:
2843 ; CHECK:       ## BB#0:
2844 ; CHECK-NEXT:    kmovw %esi, %k1
2845 ; CHECK-NEXT:    vpmuludq (%rdi){1to8}, %zmm0, %zmm1 {%k1}
2846 ; CHECK-NEXT:    vmovdqa64 %zmm1, %zmm0
2847 ; CHECK-NEXT:    retq
2848   %q = load i64, i64* %ptr_b
2849   %vecinit.i = insertelement <8 x i64> undef, i64 %q, i32 0
2850   %b64 = shufflevector <8 x i64> %vecinit.i, <8 x i64> undef, <8 x i32> zeroinitializer
2851   %b = bitcast <8 x i64> %b64 to <16 x i32>
2852   %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)
2853   ret < 8 x i64> %res
2854 }
2855
2856 define <8 x i64> @test_mask_mul_epu32_rmbkz(<16 x i32> %a, i64* %ptr_b, i8 %mask) {
2857 ; CHECK-LABEL: test_mask_mul_epu32_rmbkz:
2858 ; CHECK:       ## BB#0:
2859 ; CHECK-NEXT:    kmovw %esi, %k1
2860 ; CHECK-NEXT:    vpmuludq (%rdi){1to8}, %zmm0, %zmm0 {%k1} {z}
2861 ; CHECK-NEXT:    retq
2862   %q = load i64, i64* %ptr_b
2863   %vecinit.i = insertelement <8 x i64> undef, i64 %q, i32 0
2864   %b64 = shufflevector <8 x i64> %vecinit.i, <8 x i64> undef, <8 x i32> zeroinitializer
2865   %b = bitcast <8 x i64> %b64 to <16 x i32>
2866   %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)
2867   ret < 8 x i64> %res
2868 }
2869
2870 declare <8 x i64> @llvm.x86.avx512.mask.pmulu.dq.512(<16 x i32>, <16 x i32>, <8 x i64>, i8)
2871
2872 define <4 x float> @test_mask_vextractf32x4(<4 x float> %b, <16 x float> %a, i8 %mask) {
2873 ; CHECK-LABEL: test_mask_vextractf32x4:
2874 ; CHECK:       ## BB#0:
2875 ; CHECK-NEXT:    vextractf32x4 $2, %zmm1, %xmm1
2876 ; CHECK-NEXT:    kmovw %edi, %k1
2877 ; CHECK-NEXT:    kshiftlw $12, %k1, %k0
2878 ; CHECK-NEXT:    kshiftrw $15, %k0, %k0
2879 ; CHECK-NEXT:    kshiftlw $13, %k1, %k2
2880 ; CHECK-NEXT:    kshiftrw $15, %k2, %k2
2881 ; CHECK-NEXT:    kshiftlw $15, %k1, %k3
2882 ; CHECK-NEXT:    kshiftrw $15, %k3, %k3
2883 ; CHECK-NEXT:    kshiftlw $14, %k1, %k1
2884 ; CHECK-NEXT:    kshiftrw $15, %k1, %k1
2885 ; CHECK-NEXT:    kmovw %k1, %eax
2886 ; CHECK-NEXT:    kmovw %k3, %ecx
2887 ; CHECK-NEXT:    vmovd %ecx, %xmm2
2888 ; CHECK-NEXT:    vpinsrd $1, %eax, %xmm2, %xmm2
2889 ; CHECK-NEXT:    kmovw %k2, %eax
2890 ; CHECK-NEXT:    vpinsrd $2, %eax, %xmm2, %xmm2
2891 ; CHECK-NEXT:    kmovw %k0, %eax
2892 ; CHECK-NEXT:    vpinsrd $3, %eax, %xmm2, %xmm2
2893 ; CHECK-NEXT:    vpslld $31, %xmm2, %xmm2
2894 ; CHECK-NEXT:    vblendvps %xmm2, %xmm1, %xmm0, %xmm0
2895 ; CHECK-NEXT:    retq
2896   %res = call <4 x float> @llvm.x86.avx512.mask.vextractf32x4.512(<16 x float> %a, i32 2, <4 x float> %b, i8 %mask)
2897   ret <4 x float> %res
2898 }
2899
2900 declare <4 x float> @llvm.x86.avx512.mask.vextractf32x4.512(<16 x float>, i32, <4 x float>, i8)
2901
2902 define <4 x i64> @test_mask_vextracti64x4(<4 x i64> %b, <8 x i64> %a, i8 %mask) {
2903 ; CHECK-LABEL: test_mask_vextracti64x4:
2904 ; CHECK:       ## BB#0:
2905 ; CHECK-NEXT:    vextracti64x4 $1, %zmm1, %ymm1
2906 ; CHECK-NEXT:    kmovw %edi, %k1
2907 ; CHECK-NEXT:    kshiftlw $12, %k1, %k0
2908 ; CHECK-NEXT:    kshiftrw $15, %k0, %k0
2909 ; CHECK-NEXT:    kshiftlw $13, %k1, %k2
2910 ; CHECK-NEXT:    kshiftrw $15, %k2, %k2
2911 ; CHECK-NEXT:    kshiftlw $15, %k1, %k3
2912 ; CHECK-NEXT:    kshiftrw $15, %k3, %k3
2913 ; CHECK-NEXT:    kshiftlw $14, %k1, %k1
2914 ; CHECK-NEXT:    kshiftrw $15, %k1, %k1
2915 ; CHECK-NEXT:    kmovw %k1, %eax
2916 ; CHECK-NEXT:    kmovw %k3, %ecx
2917 ; CHECK-NEXT:    vmovd %ecx, %xmm2
2918 ; CHECK-NEXT:    vpinsrd $1, %eax, %xmm2, %xmm2
2919 ; CHECK-NEXT:    kmovw %k2, %eax
2920 ; CHECK-NEXT:    vpinsrd $2, %eax, %xmm2, %xmm2
2921 ; CHECK-NEXT:    kmovw %k0, %eax
2922 ; CHECK-NEXT:    vpinsrd $3, %eax, %xmm2, %xmm2
2923 ; CHECK-NEXT:    vpslld $31, %xmm2, %xmm2
2924 ; CHECK-NEXT:    vpmovsxdq %xmm2, %ymm2
2925 ; CHECK-NEXT:    vblendvpd %ymm2, %ymm1, %ymm0, %ymm0
2926 ; CHECK-NEXT:    retq
2927   %res = call <4 x i64> @llvm.x86.avx512.mask.vextracti64x4.512(<8 x i64> %a, i32 1, <4 x i64> %b, i8 %mask)
2928   ret <4 x i64> %res
2929 }
2930
2931 declare <4 x i64> @llvm.x86.avx512.mask.vextracti64x4.512(<8 x i64>, i32, <4 x i64>, i8)
2932
2933 define <4 x i32> @test_maskz_vextracti32x4(<16 x i32> %a, i8 %mask) {
2934 ; CHECK-LABEL: test_maskz_vextracti32x4:
2935 ; CHECK:       ## BB#0:
2936 ; CHECK-NEXT:    vextracti32x4 $2, %zmm0, %xmm0
2937 ; CHECK-NEXT:    kmovw %edi, %k1
2938 ; CHECK-NEXT:    kshiftlw $12, %k1, %k0
2939 ; CHECK-NEXT:    kshiftrw $15, %k0, %k0
2940 ; CHECK-NEXT:    kshiftlw $13, %k1, %k2
2941 ; CHECK-NEXT:    kshiftrw $15, %k2, %k2
2942 ; CHECK-NEXT:    kshiftlw $15, %k1, %k3
2943 ; CHECK-NEXT:    kshiftrw $15, %k3, %k3
2944 ; CHECK-NEXT:    kshiftlw $14, %k1, %k1
2945 ; CHECK-NEXT:    kshiftrw $15, %k1, %k1
2946 ; CHECK-NEXT:    kmovw %k1, %eax
2947 ; CHECK-NEXT:    kmovw %k3, %ecx
2948 ; CHECK-NEXT:    vmovd %ecx, %xmm1
2949 ; CHECK-NEXT:    vpinsrd $1, %eax, %xmm1, %xmm1
2950 ; CHECK-NEXT:    kmovw %k2, %eax
2951 ; CHECK-NEXT:    vpinsrd $2, %eax, %xmm1, %xmm1
2952 ; CHECK-NEXT:    kmovw %k0, %eax
2953 ; CHECK-NEXT:    vpinsrd $3, %eax, %xmm1, %xmm1
2954 ; CHECK-NEXT:    vpslld $31, %xmm1, %xmm1
2955 ; CHECK-NEXT:    vpsrad $31, %xmm1, %xmm1
2956 ; CHECK-NEXT:    vpand %xmm0, %xmm1, %xmm0
2957 ; CHECK-NEXT:    retq
2958   %res = call <4 x i32> @llvm.x86.avx512.mask.vextracti32x4.512(<16 x i32> %a, i32 2, <4 x i32> zeroinitializer, i8 %mask)
2959   ret <4 x i32> %res
2960 }
2961
2962 declare <4 x i32> @llvm.x86.avx512.mask.vextracti32x4.512(<16 x i32>, i32, <4 x i32>, i8)
2963
2964 define <4 x double> @test_vextractf64x4(<8 x double> %a) {
2965 ; CHECK-LABEL: test_vextractf64x4:
2966 ; CHECK:       ## BB#0:
2967 ; CHECK-NEXT:    vextractf64x4 $1, %zmm0, %ymm0
2968 ; CHECK-NEXT:    retq
2969   %res = call <4 x double> @llvm.x86.avx512.mask.vextractf64x4.512(<8 x double> %a, i32 1, <4 x double> zeroinitializer, i8 -1)
2970   ret <4 x double> %res
2971 }
2972
2973 declare <4 x double> @llvm.x86.avx512.mask.vextractf64x4.512(<8 x double>, i32, <4 x double>, i8)
2974
2975 declare <16 x float> @llvm.x86.avx512.mask.insertf32x4.512(<16 x float>, <4 x float>, i32, <16 x float>, i16)
2976
2977 define <16 x float>@test_int_x86_avx512_mask_insertf32x4_512(<16 x float> %x0, <4 x float> %x1, <16 x float> %x3, i16 %x4) {
2978 ; CHECK-LABEL: test_int_x86_avx512_mask_insertf32x4_512:
2979 ; CHECK:       ## BB#0:
2980 ; CHECK-NEXT:    ## kill: %XMM1<def> %XMM1<kill> %ZMM1<def>
2981 ; CHECK-NEXT:    vinsertf32x4 $1, %xmm1, %zmm0, %zmm3
2982 ; CHECK-NEXT:    kmovw %edi, %k1
2983 ; CHECK-NEXT:    vinsertf32x4 $1, %xmm1, %zmm0, %zmm2 {%k1}
2984 ; CHECK-NEXT:    vinsertf32x4 $1, %xmm1, %zmm0, %zmm0 {%k1} {z}
2985 ; CHECK-NEXT:    vaddps %zmm3, %zmm2, %zmm1
2986 ; CHECK-NEXT:    vaddps %zmm1, %zmm0, %zmm0
2987 ; CHECK-NEXT:    retq
2988   %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, i16 %x4)
2989   %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, i16 -1)
2990   %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, i16 %x4)
2991   %res3 = fadd <16 x float> %res, %res1
2992   %res4 = fadd <16 x float> %res2, %res3
2993   ret <16 x float> %res4
2994 }
2995
2996 declare <16 x i32> @llvm.x86.avx512.mask.inserti32x4.512(<16 x i32>, <4 x i32>, i32, <16 x i32>, i16)
2997
2998 define <16 x i32>@test_int_x86_avx512_mask_inserti32x4_512(<16 x i32> %x0, <4 x i32> %x1, <16 x i32> %x3, i16 %x4) {
2999 ; CHECK-LABEL: test_int_x86_avx512_mask_inserti32x4_512:
3000 ; CHECK:       ## BB#0:
3001 ; CHECK-NEXT:    ## kill: %XMM1<def> %XMM1<kill> %ZMM1<def>
3002 ; CHECK-NEXT:    vinserti32x4 $1, %xmm1, %zmm0, %zmm3
3003 ; CHECK-NEXT:    kmovw %edi, %k1
3004 ; CHECK-NEXT:    vinserti32x4 $1, %xmm1, %zmm0, %zmm2 {%k1}
3005 ; CHECK-NEXT:    vinserti32x4 $1, %xmm1, %zmm0, %zmm0 {%k1} {z}
3006 ; CHECK-NEXT:    vpaddd %zmm3, %zmm2, %zmm1
3007 ; CHECK-NEXT:    vpaddd %zmm1, %zmm0, %zmm0
3008 ; CHECK-NEXT:    retq
3009   %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, i16 %x4)
3010   %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, i16 -1)
3011   %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, i16 %x4)
3012   %res3 = add <16 x i32> %res, %res1
3013   %res4 = add <16 x i32> %res2, %res3
3014   ret <16 x i32> %res4
3015 }
3016
3017 declare <8 x double> @llvm.x86.avx512.mask.insertf64x4.512(<8 x double>, <4 x double>, i32, <8 x double>, i8)
3018
3019 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) {
3020 ; CHECK-LABEL: test_int_x86_avx512_mask_insertf64x4_512:
3021 ; CHECK:       ## BB#0:
3022 ; CHECK-NEXT:    vinsertf64x4 $1, %ymm1, %zmm0, %zmm3
3023 ; CHECK-NEXT:    kmovw %edi, %k1
3024 ; CHECK-NEXT:    vinsertf64x4 $1, %ymm1, %zmm0, %zmm2 {%k1}
3025 ; CHECK-NEXT:    vinsertf64x4 $1, %ymm1, %zmm0, %zmm0 {%k1} {z}
3026 ; CHECK-NEXT:    vaddpd %zmm3, %zmm2, %zmm1
3027 ; CHECK-NEXT:    vaddpd %zmm1, %zmm0, %zmm0
3028 ; CHECK-NEXT:    retq
3029   %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)
3030   %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)
3031   %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)
3032   %res3 = fadd <8 x double> %res, %res1
3033   %res4 = fadd <8 x double> %res2, %res3
3034   ret <8 x double> %res4
3035 }
3036
3037 declare <8 x i64> @llvm.x86.avx512.mask.inserti64x4.512(<8 x i64>, <4 x i64>, i32, <8 x i64>, i8)
3038
3039 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) {
3040 ; CHECK-LABEL: test_int_x86_avx512_mask_inserti64x4_512:
3041 ; CHECK:       ## BB#0:
3042 ; CHECK-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm3
3043 ; CHECK-NEXT:    kmovw %edi, %k1
3044 ; CHECK-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm2 {%k1}
3045 ; CHECK-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0 {%k1} {z}
3046 ; CHECK-NEXT:    vpaddq %zmm3, %zmm2, %zmm1
3047 ; CHECK-NEXT:    vpaddq %zmm1, %zmm0, %zmm0
3048 ; CHECK-NEXT:    retq
3049   %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)
3050   %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)
3051   %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)
3052   %res3 = add <8 x i64> %res, %res1
3053   %res4 = add <8 x i64> %res2, %res3
3054   ret <8 x i64> %res4
3055 }