[MIPS GlobalISel] Select MSA vector generic and builtin add
[llvm-complete.git] / test / CodeGen / X86 / avx512-mask-op.ll
blobb9724f8c4d6db6d0f9d4ff4f20e80ac44b7f60e4
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -stack-symbol-ordering=0 -mtriple=x86_64-apple-darwin -mattr=+avx512f | FileCheck %s --check-prefix=CHECK --check-prefix=KNL
3 ; RUN: llc < %s -stack-symbol-ordering=0 -mtriple=x86_64-apple-darwin -mattr=+avx512f,+avx512bw,+avx512vl,+avx512dq | FileCheck %s --check-prefix=CHECK --check-prefix=SKX
4 ; RUN: llc < %s -stack-symbol-ordering=0 -mtriple=x86_64-apple-darwin -mattr=+avx512bw  | FileCheck %s --check-prefix=CHECK --check-prefix=AVX512BW
5 ; RUN: llc < %s -stack-symbol-ordering=0 -mtriple=x86_64-apple-darwin -mattr=+avx512dq  | FileCheck %s --check-prefix=CHECK --check-prefix=AVX512DQ
6 ; RUN: llc < %s -stack-symbol-ordering=0 -mtriple=i686-apple-darwin -mattr=+avx512f,+avx512bw,+avx512vl,+avx512dq | FileCheck %s --check-prefix=X86
9 define i16 @mask16(i16 %x) {
10 ; CHECK-LABEL: mask16:
11 ; CHECK:       ## %bb.0:
12 ; CHECK-NEXT:    movl %edi, %eax
13 ; CHECK-NEXT:    notl %eax
14 ; CHECK-NEXT:    ## kill: def $ax killed $ax killed $eax
15 ; CHECK-NEXT:    retq
17 ; X86-LABEL: mask16:
18 ; X86:       ## %bb.0:
19 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
20 ; X86-NEXT:    notl %eax
21 ; X86-NEXT:    ## kill: def $ax killed $ax killed $eax
22 ; X86-NEXT:    retl
23   %m0 = bitcast i16 %x to <16 x i1>
24   %m1 = xor <16 x i1> %m0, <i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1>
25   %ret = bitcast <16 x i1> %m1 to i16
26   ret i16 %ret
29 define i32 @mask16_zext(i16 %x) {
30 ; CHECK-LABEL: mask16_zext:
31 ; CHECK:       ## %bb.0:
32 ; CHECK-NEXT:    notl %edi
33 ; CHECK-NEXT:    movzwl %di, %eax
34 ; CHECK-NEXT:    retq
36 ; X86-LABEL: mask16_zext:
37 ; X86:       ## %bb.0:
38 ; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
39 ; X86-NEXT:    xorl $65535, %eax ## imm = 0xFFFF
40 ; X86-NEXT:    retl
41   %m0 = bitcast i16 %x to <16 x i1>
42   %m1 = xor <16 x i1> %m0, <i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1>
43   %m2 = bitcast <16 x i1> %m1 to i16
44   %ret = zext i16 %m2 to i32
45   ret i32 %ret
48 define i8 @mask8(i8 %x) {
49 ; CHECK-LABEL: mask8:
50 ; CHECK:       ## %bb.0:
51 ; CHECK-NEXT:    movl %edi, %eax
52 ; CHECK-NEXT:    notb %al
53 ; CHECK-NEXT:    ## kill: def $al killed $al killed $eax
54 ; CHECK-NEXT:    retq
56 ; X86-LABEL: mask8:
57 ; X86:       ## %bb.0:
58 ; X86-NEXT:    movb {{[0-9]+}}(%esp), %al
59 ; X86-NEXT:    notb %al
60 ; X86-NEXT:    retl
61   %m0 = bitcast i8 %x to <8 x i1>
62   %m1 = xor <8 x i1> %m0, <i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1>
63   %ret = bitcast <8 x i1> %m1 to i8
64   ret i8 %ret
67 define i32 @mask8_zext(i8 %x) {
68 ; CHECK-LABEL: mask8_zext:
69 ; CHECK:       ## %bb.0:
70 ; CHECK-NEXT:    notb %dil
71 ; CHECK-NEXT:    movzbl %dil, %eax
72 ; CHECK-NEXT:    retq
74 ; X86-LABEL: mask8_zext:
75 ; X86:       ## %bb.0:
76 ; X86-NEXT:    movb {{[0-9]+}}(%esp), %al
77 ; X86-NEXT:    notb %al
78 ; X86-NEXT:    movzbl %al, %eax
79 ; X86-NEXT:    retl
80   %m0 = bitcast i8 %x to <8 x i1>
81   %m1 = xor <8 x i1> %m0, <i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1>
82   %m2 = bitcast <8 x i1> %m1 to i8
83   %ret = zext i8 %m2 to i32
84   ret i32 %ret
87 define void @mask16_mem(i16* %ptr) {
88 ; CHECK-LABEL: mask16_mem:
89 ; CHECK:       ## %bb.0:
90 ; CHECK-NEXT:    kmovw (%rdi), %k0
91 ; CHECK-NEXT:    knotw %k0, %k0
92 ; CHECK-NEXT:    kmovw %k0, (%rdi)
93 ; CHECK-NEXT:    retq
95 ; X86-LABEL: mask16_mem:
96 ; X86:       ## %bb.0:
97 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
98 ; X86-NEXT:    kmovw (%eax), %k0
99 ; X86-NEXT:    knotw %k0, %k0
100 ; X86-NEXT:    kmovw %k0, (%eax)
101 ; X86-NEXT:    retl
102   %x = load i16, i16* %ptr, align 4
103   %m0 = bitcast i16 %x to <16 x i1>
104   %m1 = xor <16 x i1> %m0, <i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1>
105   %ret = bitcast <16 x i1> %m1 to i16
106   store i16 %ret, i16* %ptr, align 4
107   ret void
110 define void @mask8_mem(i8* %ptr) {
111 ; KNL-LABEL: mask8_mem:
112 ; KNL:       ## %bb.0:
113 ; KNL-NEXT:    notb (%rdi)
114 ; KNL-NEXT:    retq
116 ; SKX-LABEL: mask8_mem:
117 ; SKX:       ## %bb.0:
118 ; SKX-NEXT:    kmovb (%rdi), %k0
119 ; SKX-NEXT:    knotb %k0, %k0
120 ; SKX-NEXT:    kmovb %k0, (%rdi)
121 ; SKX-NEXT:    retq
123 ; AVX512BW-LABEL: mask8_mem:
124 ; AVX512BW:       ## %bb.0:
125 ; AVX512BW-NEXT:    notb (%rdi)
126 ; AVX512BW-NEXT:    retq
128 ; AVX512DQ-LABEL: mask8_mem:
129 ; AVX512DQ:       ## %bb.0:
130 ; AVX512DQ-NEXT:    kmovb (%rdi), %k0
131 ; AVX512DQ-NEXT:    knotb %k0, %k0
132 ; AVX512DQ-NEXT:    kmovb %k0, (%rdi)
133 ; AVX512DQ-NEXT:    retq
135 ; X86-LABEL: mask8_mem:
136 ; X86:       ## %bb.0:
137 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
138 ; X86-NEXT:    kmovb (%eax), %k0
139 ; X86-NEXT:    knotb %k0, %k0
140 ; X86-NEXT:    kmovb %k0, (%eax)
141 ; X86-NEXT:    retl
142   %x = load i8, i8* %ptr, align 4
143   %m0 = bitcast i8 %x to <8 x i1>
144   %m1 = xor <8 x i1> %m0, <i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1>
145   %ret = bitcast <8 x i1> %m1 to i8
146   store i8 %ret, i8* %ptr, align 4
147   ret void
150 define i16 @mand16(i16 %x, i16 %y) {
151 ; CHECK-LABEL: mand16:
152 ; CHECK:       ## %bb.0:
153 ; CHECK-NEXT:    movl %edi, %eax
154 ; CHECK-NEXT:    movl %edi, %ecx
155 ; CHECK-NEXT:    andl %esi, %ecx
156 ; CHECK-NEXT:    xorl %esi, %eax
157 ; CHECK-NEXT:    orl %ecx, %eax
158 ; CHECK-NEXT:    ## kill: def $ax killed $ax killed $eax
159 ; CHECK-NEXT:    retq
161 ; X86-LABEL: mand16:
162 ; X86:       ## %bb.0:
163 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
164 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
165 ; X86-NEXT:    movl %eax, %edx
166 ; X86-NEXT:    andl %ecx, %edx
167 ; X86-NEXT:    xorl %ecx, %eax
168 ; X86-NEXT:    orl %edx, %eax
169 ; X86-NEXT:    ## kill: def $ax killed $ax killed $eax
170 ; X86-NEXT:    retl
171   %ma = bitcast i16 %x to <16 x i1>
172   %mb = bitcast i16 %y to <16 x i1>
173   %mc = and <16 x i1> %ma, %mb
174   %md = xor <16 x i1> %ma, %mb
175   %me = or <16 x i1> %mc, %md
176   %ret = bitcast <16 x i1> %me to i16
177   ret i16 %ret
180 define i16 @mand16_mem(<16 x i1>* %x, <16 x i1>* %y) {
181 ; KNL-LABEL: mand16_mem:
182 ; KNL:       ## %bb.0:
183 ; KNL-NEXT:    kmovw (%rdi), %k0
184 ; KNL-NEXT:    kmovw (%rsi), %k1
185 ; KNL-NEXT:    kandw %k1, %k0, %k2
186 ; KNL-NEXT:    kxorw %k1, %k0, %k0
187 ; KNL-NEXT:    korw %k0, %k2, %k0
188 ; KNL-NEXT:    kmovw %k0, %eax
189 ; KNL-NEXT:    ## kill: def $ax killed $ax killed $eax
190 ; KNL-NEXT:    retq
192 ; SKX-LABEL: mand16_mem:
193 ; SKX:       ## %bb.0:
194 ; SKX-NEXT:    kmovw (%rdi), %k0
195 ; SKX-NEXT:    kmovw (%rsi), %k1
196 ; SKX-NEXT:    kandw %k1, %k0, %k2
197 ; SKX-NEXT:    kxorw %k1, %k0, %k0
198 ; SKX-NEXT:    korw %k0, %k2, %k0
199 ; SKX-NEXT:    kmovd %k0, %eax
200 ; SKX-NEXT:    ## kill: def $ax killed $ax killed $eax
201 ; SKX-NEXT:    retq
203 ; AVX512BW-LABEL: mand16_mem:
204 ; AVX512BW:       ## %bb.0:
205 ; AVX512BW-NEXT:    kmovw (%rdi), %k0
206 ; AVX512BW-NEXT:    kmovw (%rsi), %k1
207 ; AVX512BW-NEXT:    kandw %k1, %k0, %k2
208 ; AVX512BW-NEXT:    kxorw %k1, %k0, %k0
209 ; AVX512BW-NEXT:    korw %k0, %k2, %k0
210 ; AVX512BW-NEXT:    kmovd %k0, %eax
211 ; AVX512BW-NEXT:    ## kill: def $ax killed $ax killed $eax
212 ; AVX512BW-NEXT:    retq
214 ; AVX512DQ-LABEL: mand16_mem:
215 ; AVX512DQ:       ## %bb.0:
216 ; AVX512DQ-NEXT:    kmovw (%rdi), %k0
217 ; AVX512DQ-NEXT:    kmovw (%rsi), %k1
218 ; AVX512DQ-NEXT:    kandw %k1, %k0, %k2
219 ; AVX512DQ-NEXT:    kxorw %k1, %k0, %k0
220 ; AVX512DQ-NEXT:    korw %k0, %k2, %k0
221 ; AVX512DQ-NEXT:    kmovw %k0, %eax
222 ; AVX512DQ-NEXT:    ## kill: def $ax killed $ax killed $eax
223 ; AVX512DQ-NEXT:    retq
225 ; X86-LABEL: mand16_mem:
226 ; X86:       ## %bb.0:
227 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
228 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
229 ; X86-NEXT:    kmovw (%ecx), %k0
230 ; X86-NEXT:    kmovw (%eax), %k1
231 ; X86-NEXT:    kandw %k1, %k0, %k2
232 ; X86-NEXT:    kxorw %k1, %k0, %k0
233 ; X86-NEXT:    korw %k0, %k2, %k0
234 ; X86-NEXT:    kmovd %k0, %eax
235 ; X86-NEXT:    ## kill: def $ax killed $ax killed $eax
236 ; X86-NEXT:    retl
237   %ma = load <16 x i1>, <16 x i1>* %x
238   %mb = load <16 x i1>, <16 x i1>* %y
239   %mc = and <16 x i1> %ma, %mb
240   %md = xor <16 x i1> %ma, %mb
241   %me = or <16 x i1> %mc, %md
242   %ret = bitcast <16 x i1> %me to i16
243   ret i16 %ret
246 define i8 @shuf_test1(i16 %v) nounwind {
247 ; KNL-LABEL: shuf_test1:
248 ; KNL:       ## %bb.0:
249 ; KNL-NEXT:    kmovw %edi, %k0
250 ; KNL-NEXT:    kshiftrw $8, %k0, %k0
251 ; KNL-NEXT:    kmovw %k0, %eax
252 ; KNL-NEXT:    ## kill: def $al killed $al killed $eax
253 ; KNL-NEXT:    retq
255 ; SKX-LABEL: shuf_test1:
256 ; SKX:       ## %bb.0:
257 ; SKX-NEXT:    kmovd %edi, %k0
258 ; SKX-NEXT:    kshiftrw $8, %k0, %k0
259 ; SKX-NEXT:    kmovd %k0, %eax
260 ; SKX-NEXT:    ## kill: def $al killed $al killed $eax
261 ; SKX-NEXT:    retq
263 ; AVX512BW-LABEL: shuf_test1:
264 ; AVX512BW:       ## %bb.0:
265 ; AVX512BW-NEXT:    kmovd %edi, %k0
266 ; AVX512BW-NEXT:    kshiftrw $8, %k0, %k0
267 ; AVX512BW-NEXT:    kmovd %k0, %eax
268 ; AVX512BW-NEXT:    ## kill: def $al killed $al killed $eax
269 ; AVX512BW-NEXT:    retq
271 ; AVX512DQ-LABEL: shuf_test1:
272 ; AVX512DQ:       ## %bb.0:
273 ; AVX512DQ-NEXT:    kmovw %edi, %k0
274 ; AVX512DQ-NEXT:    kshiftrw $8, %k0, %k0
275 ; AVX512DQ-NEXT:    kmovw %k0, %eax
276 ; AVX512DQ-NEXT:    ## kill: def $al killed $al killed $eax
277 ; AVX512DQ-NEXT:    retq
279 ; X86-LABEL: shuf_test1:
280 ; X86:       ## %bb.0:
281 ; X86-NEXT:    movb {{[0-9]+}}(%esp), %al
282 ; X86-NEXT:    retl
283    %v1 = bitcast i16 %v to <16 x i1>
284    %mask = shufflevector <16 x i1> %v1, <16 x i1> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
285    %mask1 = bitcast <8 x i1> %mask to i8
286    ret i8 %mask1
289 define i32 @zext_test1(<16 x i32> %a, <16 x i32> %b) {
290 ; KNL-LABEL: zext_test1:
291 ; KNL:       ## %bb.0:
292 ; KNL-NEXT:    vpcmpnleud %zmm1, %zmm0, %k0
293 ; KNL-NEXT:    kshiftrw $5, %k0, %k0
294 ; KNL-NEXT:    kmovw %k0, %eax
295 ; KNL-NEXT:    andl $1, %eax
296 ; KNL-NEXT:    vzeroupper
297 ; KNL-NEXT:    retq
299 ; SKX-LABEL: zext_test1:
300 ; SKX:       ## %bb.0:
301 ; SKX-NEXT:    vpcmpnleud %zmm1, %zmm0, %k0
302 ; SKX-NEXT:    kshiftrw $5, %k0, %k0
303 ; SKX-NEXT:    kmovd %k0, %eax
304 ; SKX-NEXT:    andl $1, %eax
305 ; SKX-NEXT:    vzeroupper
306 ; SKX-NEXT:    retq
308 ; AVX512BW-LABEL: zext_test1:
309 ; AVX512BW:       ## %bb.0:
310 ; AVX512BW-NEXT:    vpcmpnleud %zmm1, %zmm0, %k0
311 ; AVX512BW-NEXT:    kshiftrw $5, %k0, %k0
312 ; AVX512BW-NEXT:    kmovd %k0, %eax
313 ; AVX512BW-NEXT:    andl $1, %eax
314 ; AVX512BW-NEXT:    vzeroupper
315 ; AVX512BW-NEXT:    retq
317 ; AVX512DQ-LABEL: zext_test1:
318 ; AVX512DQ:       ## %bb.0:
319 ; AVX512DQ-NEXT:    vpcmpnleud %zmm1, %zmm0, %k0
320 ; AVX512DQ-NEXT:    kshiftrw $5, %k0, %k0
321 ; AVX512DQ-NEXT:    kmovw %k0, %eax
322 ; AVX512DQ-NEXT:    andl $1, %eax
323 ; AVX512DQ-NEXT:    vzeroupper
324 ; AVX512DQ-NEXT:    retq
326 ; X86-LABEL: zext_test1:
327 ; X86:       ## %bb.0:
328 ; X86-NEXT:    vpcmpnleud %zmm1, %zmm0, %k0
329 ; X86-NEXT:    kshiftrw $5, %k0, %k0
330 ; X86-NEXT:    kmovd %k0, %eax
331 ; X86-NEXT:    andl $1, %eax
332 ; X86-NEXT:    vzeroupper
333 ; X86-NEXT:    retl
334   %cmp_res = icmp ugt <16 x i32> %a, %b
335   %cmp_res.i1 = extractelement <16 x i1> %cmp_res, i32 5
336   %res = zext i1 %cmp_res.i1 to i32
337   ret i32 %res
340 define i16 @zext_test2(<16 x i32> %a, <16 x i32> %b) {
341 ; KNL-LABEL: zext_test2:
342 ; KNL:       ## %bb.0:
343 ; KNL-NEXT:    vpcmpnleud %zmm1, %zmm0, %k0
344 ; KNL-NEXT:    kshiftrw $5, %k0, %k0
345 ; KNL-NEXT:    kmovw %k0, %eax
346 ; KNL-NEXT:    andl $1, %eax
347 ; KNL-NEXT:    ## kill: def $ax killed $ax killed $eax
348 ; KNL-NEXT:    vzeroupper
349 ; KNL-NEXT:    retq
351 ; SKX-LABEL: zext_test2:
352 ; SKX:       ## %bb.0:
353 ; SKX-NEXT:    vpcmpnleud %zmm1, %zmm0, %k0
354 ; SKX-NEXT:    kshiftrw $5, %k0, %k0
355 ; SKX-NEXT:    kmovd %k0, %eax
356 ; SKX-NEXT:    andl $1, %eax
357 ; SKX-NEXT:    ## kill: def $ax killed $ax killed $eax
358 ; SKX-NEXT:    vzeroupper
359 ; SKX-NEXT:    retq
361 ; AVX512BW-LABEL: zext_test2:
362 ; AVX512BW:       ## %bb.0:
363 ; AVX512BW-NEXT:    vpcmpnleud %zmm1, %zmm0, %k0
364 ; AVX512BW-NEXT:    kshiftrw $5, %k0, %k0
365 ; AVX512BW-NEXT:    kmovd %k0, %eax
366 ; AVX512BW-NEXT:    andl $1, %eax
367 ; AVX512BW-NEXT:    ## kill: def $ax killed $ax killed $eax
368 ; AVX512BW-NEXT:    vzeroupper
369 ; AVX512BW-NEXT:    retq
371 ; AVX512DQ-LABEL: zext_test2:
372 ; AVX512DQ:       ## %bb.0:
373 ; AVX512DQ-NEXT:    vpcmpnleud %zmm1, %zmm0, %k0
374 ; AVX512DQ-NEXT:    kshiftrw $5, %k0, %k0
375 ; AVX512DQ-NEXT:    kmovw %k0, %eax
376 ; AVX512DQ-NEXT:    andl $1, %eax
377 ; AVX512DQ-NEXT:    ## kill: def $ax killed $ax killed $eax
378 ; AVX512DQ-NEXT:    vzeroupper
379 ; AVX512DQ-NEXT:    retq
381 ; X86-LABEL: zext_test2:
382 ; X86:       ## %bb.0:
383 ; X86-NEXT:    vpcmpnleud %zmm1, %zmm0, %k0
384 ; X86-NEXT:    kshiftrw $5, %k0, %k0
385 ; X86-NEXT:    kmovd %k0, %eax
386 ; X86-NEXT:    andl $1, %eax
387 ; X86-NEXT:    ## kill: def $ax killed $ax killed $eax
388 ; X86-NEXT:    vzeroupper
389 ; X86-NEXT:    retl
390   %cmp_res = icmp ugt <16 x i32> %a, %b
391   %cmp_res.i1 = extractelement <16 x i1> %cmp_res, i32 5
392   %res = zext i1 %cmp_res.i1 to i16
393   ret i16 %res
396 define i8 @zext_test3(<16 x i32> %a, <16 x i32> %b) {
397 ; KNL-LABEL: zext_test3:
398 ; KNL:       ## %bb.0:
399 ; KNL-NEXT:    vpcmpnleud %zmm1, %zmm0, %k0
400 ; KNL-NEXT:    kshiftrw $5, %k0, %k0
401 ; KNL-NEXT:    kmovw %k0, %eax
402 ; KNL-NEXT:    andb $1, %al
403 ; KNL-NEXT:    ## kill: def $al killed $al killed $eax
404 ; KNL-NEXT:    vzeroupper
405 ; KNL-NEXT:    retq
407 ; SKX-LABEL: zext_test3:
408 ; SKX:       ## %bb.0:
409 ; SKX-NEXT:    vpcmpnleud %zmm1, %zmm0, %k0
410 ; SKX-NEXT:    kshiftrw $5, %k0, %k0
411 ; SKX-NEXT:    kmovd %k0, %eax
412 ; SKX-NEXT:    andb $1, %al
413 ; SKX-NEXT:    ## kill: def $al killed $al killed $eax
414 ; SKX-NEXT:    vzeroupper
415 ; SKX-NEXT:    retq
417 ; AVX512BW-LABEL: zext_test3:
418 ; AVX512BW:       ## %bb.0:
419 ; AVX512BW-NEXT:    vpcmpnleud %zmm1, %zmm0, %k0
420 ; AVX512BW-NEXT:    kshiftrw $5, %k0, %k0
421 ; AVX512BW-NEXT:    kmovd %k0, %eax
422 ; AVX512BW-NEXT:    andb $1, %al
423 ; AVX512BW-NEXT:    ## kill: def $al killed $al killed $eax
424 ; AVX512BW-NEXT:    vzeroupper
425 ; AVX512BW-NEXT:    retq
427 ; AVX512DQ-LABEL: zext_test3:
428 ; AVX512DQ:       ## %bb.0:
429 ; AVX512DQ-NEXT:    vpcmpnleud %zmm1, %zmm0, %k0
430 ; AVX512DQ-NEXT:    kshiftrw $5, %k0, %k0
431 ; AVX512DQ-NEXT:    kmovw %k0, %eax
432 ; AVX512DQ-NEXT:    andb $1, %al
433 ; AVX512DQ-NEXT:    ## kill: def $al killed $al killed $eax
434 ; AVX512DQ-NEXT:    vzeroupper
435 ; AVX512DQ-NEXT:    retq
437 ; X86-LABEL: zext_test3:
438 ; X86:       ## %bb.0:
439 ; X86-NEXT:    vpcmpnleud %zmm1, %zmm0, %k0
440 ; X86-NEXT:    kshiftrw $5, %k0, %k0
441 ; X86-NEXT:    kmovd %k0, %eax
442 ; X86-NEXT:    andb $1, %al
443 ; X86-NEXT:    ## kill: def $al killed $al killed $eax
444 ; X86-NEXT:    vzeroupper
445 ; X86-NEXT:    retl
446   %cmp_res = icmp ugt <16 x i32> %a, %b
447   %cmp_res.i1 = extractelement <16 x i1> %cmp_res, i32 5
448   %res = zext i1 %cmp_res.i1 to i8
449   ret i8 %res
452 define i8 @conv1(<8 x i1>* %R) {
453 ; CHECK-LABEL: conv1:
454 ; CHECK:       ## %bb.0: ## %entry
455 ; CHECK-NEXT:    movb $-1, (%rdi)
456 ; CHECK-NEXT:    movb $-2, -{{[0-9]+}}(%rsp)
457 ; CHECK-NEXT:    movb $-2, %al
458 ; CHECK-NEXT:    retq
460 ; X86-LABEL: conv1:
461 ; X86:       ## %bb.0: ## %entry
462 ; X86-NEXT:    subl $12, %esp
463 ; X86-NEXT:    .cfi_def_cfa_offset 16
464 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
465 ; X86-NEXT:    movb $-1, (%eax)
466 ; X86-NEXT:    movb $-2, (%esp)
467 ; X86-NEXT:    movb $-2, %al
468 ; X86-NEXT:    addl $12, %esp
469 ; X86-NEXT:    retl
470 entry:
471   store <8 x i1> <i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1>, <8 x i1>* %R
473   %maskPtr = alloca <8 x i1>
474   store <8 x i1> <i1 0, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1>, <8 x i1>* %maskPtr
475   %mask = load <8 x i1>, <8 x i1>* %maskPtr
476   %mask_convert = bitcast <8 x i1> %mask to i8
477   ret i8 %mask_convert
480 define <4 x i32> @test4(<4 x i64> %x, <4 x i64> %y, <4 x i64> %x1, <4 x i64> %y1) {
481 ; KNL-LABEL: test4:
482 ; KNL:       ## %bb.0:
483 ; KNL-NEXT:    ## kill: def $ymm3 killed $ymm3 def $zmm3
484 ; KNL-NEXT:    ## kill: def $ymm2 killed $ymm2 def $zmm2
485 ; KNL-NEXT:    ## kill: def $ymm1 killed $ymm1 def $zmm1
486 ; KNL-NEXT:    ## kill: def $ymm0 killed $ymm0 def $zmm0
487 ; KNL-NEXT:    vpcmpgtq %zmm3, %zmm2, %k1
488 ; KNL-NEXT:    vpcmpleq %zmm1, %zmm0, %k1 {%k1}
489 ; KNL-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
490 ; KNL-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $zmm0
491 ; KNL-NEXT:    vzeroupper
492 ; KNL-NEXT:    retq
494 ; SKX-LABEL: test4:
495 ; SKX:       ## %bb.0:
496 ; SKX-NEXT:    vpcmpgtq %ymm3, %ymm2, %k1
497 ; SKX-NEXT:    vpcmpleq %ymm1, %ymm0, %k0 {%k1}
498 ; SKX-NEXT:    vpmovm2d %k0, %xmm0
499 ; SKX-NEXT:    vzeroupper
500 ; SKX-NEXT:    retq
502 ; AVX512BW-LABEL: test4:
503 ; AVX512BW:       ## %bb.0:
504 ; AVX512BW-NEXT:    ## kill: def $ymm3 killed $ymm3 def $zmm3
505 ; AVX512BW-NEXT:    ## kill: def $ymm2 killed $ymm2 def $zmm2
506 ; AVX512BW-NEXT:    ## kill: def $ymm1 killed $ymm1 def $zmm1
507 ; AVX512BW-NEXT:    ## kill: def $ymm0 killed $ymm0 def $zmm0
508 ; AVX512BW-NEXT:    vpcmpgtq %zmm3, %zmm2, %k1
509 ; AVX512BW-NEXT:    vpcmpleq %zmm1, %zmm0, %k1 {%k1}
510 ; AVX512BW-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
511 ; AVX512BW-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $zmm0
512 ; AVX512BW-NEXT:    vzeroupper
513 ; AVX512BW-NEXT:    retq
515 ; AVX512DQ-LABEL: test4:
516 ; AVX512DQ:       ## %bb.0:
517 ; AVX512DQ-NEXT:    ## kill: def $ymm3 killed $ymm3 def $zmm3
518 ; AVX512DQ-NEXT:    ## kill: def $ymm2 killed $ymm2 def $zmm2
519 ; AVX512DQ-NEXT:    ## kill: def $ymm1 killed $ymm1 def $zmm1
520 ; AVX512DQ-NEXT:    ## kill: def $ymm0 killed $ymm0 def $zmm0
521 ; AVX512DQ-NEXT:    vpcmpgtq %zmm3, %zmm2, %k1
522 ; AVX512DQ-NEXT:    vpcmpleq %zmm1, %zmm0, %k0 {%k1}
523 ; AVX512DQ-NEXT:    vpmovm2d %k0, %zmm0
524 ; AVX512DQ-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $zmm0
525 ; AVX512DQ-NEXT:    vzeroupper
526 ; AVX512DQ-NEXT:    retq
528 ; X86-LABEL: test4:
529 ; X86:       ## %bb.0:
530 ; X86-NEXT:    vpcmpgtq %ymm3, %ymm2, %k1
531 ; X86-NEXT:    vpcmpleq %ymm1, %ymm0, %k0 {%k1}
532 ; X86-NEXT:    vpmovm2d %k0, %xmm0
533 ; X86-NEXT:    vzeroupper
534 ; X86-NEXT:    retl
535   %x_gt_y = icmp sgt <4 x i64> %x, %y
536   %x1_gt_y1 = icmp sgt <4 x i64> %x1, %y1
537   %res = icmp sgt <4 x i1>%x_gt_y, %x1_gt_y1
538   %resse = sext <4 x i1>%res to <4 x i32>
539   ret <4 x i32> %resse
542 define <2 x i64> @test5(<2 x i64> %x, <2 x i64> %y, <2 x i64> %x1, <2 x i64> %y1) {
543 ; KNL-LABEL: test5:
544 ; KNL:       ## %bb.0:
545 ; KNL-NEXT:    ## kill: def $xmm3 killed $xmm3 def $zmm3
546 ; KNL-NEXT:    ## kill: def $xmm2 killed $xmm2 def $zmm2
547 ; KNL-NEXT:    ## kill: def $xmm1 killed $xmm1 def $zmm1
548 ; KNL-NEXT:    ## kill: def $xmm0 killed $xmm0 def $zmm0
549 ; KNL-NEXT:    vpcmpgtq %zmm0, %zmm1, %k1
550 ; KNL-NEXT:    vpcmpleq %zmm3, %zmm2, %k1 {%k1}
551 ; KNL-NEXT:    vpternlogq $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
552 ; KNL-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $zmm0
553 ; KNL-NEXT:    vzeroupper
554 ; KNL-NEXT:    retq
556 ; SKX-LABEL: test5:
557 ; SKX:       ## %bb.0:
558 ; SKX-NEXT:    vpcmpgtq %xmm0, %xmm1, %k1
559 ; SKX-NEXT:    vpcmpleq %xmm3, %xmm2, %k0 {%k1}
560 ; SKX-NEXT:    vpmovm2q %k0, %xmm0
561 ; SKX-NEXT:    retq
563 ; AVX512BW-LABEL: test5:
564 ; AVX512BW:       ## %bb.0:
565 ; AVX512BW-NEXT:    ## kill: def $xmm3 killed $xmm3 def $zmm3
566 ; AVX512BW-NEXT:    ## kill: def $xmm2 killed $xmm2 def $zmm2
567 ; AVX512BW-NEXT:    ## kill: def $xmm1 killed $xmm1 def $zmm1
568 ; AVX512BW-NEXT:    ## kill: def $xmm0 killed $xmm0 def $zmm0
569 ; AVX512BW-NEXT:    vpcmpgtq %zmm0, %zmm1, %k1
570 ; AVX512BW-NEXT:    vpcmpleq %zmm3, %zmm2, %k1 {%k1}
571 ; AVX512BW-NEXT:    vpternlogq $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
572 ; AVX512BW-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $zmm0
573 ; AVX512BW-NEXT:    vzeroupper
574 ; AVX512BW-NEXT:    retq
576 ; AVX512DQ-LABEL: test5:
577 ; AVX512DQ:       ## %bb.0:
578 ; AVX512DQ-NEXT:    ## kill: def $xmm3 killed $xmm3 def $zmm3
579 ; AVX512DQ-NEXT:    ## kill: def $xmm2 killed $xmm2 def $zmm2
580 ; AVX512DQ-NEXT:    ## kill: def $xmm1 killed $xmm1 def $zmm1
581 ; AVX512DQ-NEXT:    ## kill: def $xmm0 killed $xmm0 def $zmm0
582 ; AVX512DQ-NEXT:    vpcmpgtq %zmm0, %zmm1, %k1
583 ; AVX512DQ-NEXT:    vpcmpleq %zmm3, %zmm2, %k0 {%k1}
584 ; AVX512DQ-NEXT:    vpmovm2q %k0, %zmm0
585 ; AVX512DQ-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $zmm0
586 ; AVX512DQ-NEXT:    vzeroupper
587 ; AVX512DQ-NEXT:    retq
589 ; X86-LABEL: test5:
590 ; X86:       ## %bb.0:
591 ; X86-NEXT:    vpcmpgtq %xmm0, %xmm1, %k1
592 ; X86-NEXT:    vpcmpleq %xmm3, %xmm2, %k0 {%k1}
593 ; X86-NEXT:    vpmovm2q %k0, %xmm0
594 ; X86-NEXT:    retl
595   %x_gt_y = icmp slt <2 x i64> %x, %y
596   %x1_gt_y1 = icmp sgt <2 x i64> %x1, %y1
597   %res = icmp slt <2 x i1>%x_gt_y, %x1_gt_y1
598   %resse = sext <2 x i1>%res to <2 x i64>
599   ret <2 x i64> %resse
600 }define void @test6(<16 x i1> %mask)  {
601 allocas:
602   %a= and <16 x i1> %mask, <i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false>
603   %b = bitcast <16 x i1> %a to i16
604   %c = icmp eq i16 %b, 0
605   br i1 %c, label %true, label %false
607 true:
608   ret void
610 false:
611   ret void
613 define void @test7(<8 x i1> %mask)  {
614 ; KNL-LABEL: test7:
615 ; KNL:       ## %bb.0: ## %allocas
616 ; KNL-NEXT:    vpmovsxwq %xmm0, %zmm0
617 ; KNL-NEXT:    vpsllq $63, %zmm0, %zmm0
618 ; KNL-NEXT:    vptestmq %zmm0, %zmm0, %k0
619 ; KNL-NEXT:    kmovw %k0, %eax
620 ; KNL-NEXT:    orb $85, %al
621 ; KNL-NEXT:    vzeroupper
622 ; KNL-NEXT:    retq
624 ; SKX-LABEL: test7:
625 ; SKX:       ## %bb.0: ## %allocas
626 ; SKX-NEXT:    vpsllw $15, %xmm0, %xmm0
627 ; SKX-NEXT:    vpmovw2m %xmm0, %k0
628 ; SKX-NEXT:    kmovd %k0, %eax
629 ; SKX-NEXT:    orb $85, %al
630 ; SKX-NEXT:    retq
632 ; AVX512BW-LABEL: test7:
633 ; AVX512BW:       ## %bb.0: ## %allocas
634 ; AVX512BW-NEXT:    vpsllw $15, %xmm0, %xmm0
635 ; AVX512BW-NEXT:    vpmovw2m %zmm0, %k0
636 ; AVX512BW-NEXT:    kmovd %k0, %eax
637 ; AVX512BW-NEXT:    orb $85, %al
638 ; AVX512BW-NEXT:    vzeroupper
639 ; AVX512BW-NEXT:    retq
641 ; AVX512DQ-LABEL: test7:
642 ; AVX512DQ:       ## %bb.0: ## %allocas
643 ; AVX512DQ-NEXT:    vpmovsxwq %xmm0, %zmm0
644 ; AVX512DQ-NEXT:    vpsllq $63, %zmm0, %zmm0
645 ; AVX512DQ-NEXT:    vpmovq2m %zmm0, %k0
646 ; AVX512DQ-NEXT:    kmovw %k0, %eax
647 ; AVX512DQ-NEXT:    orb $85, %al
648 ; AVX512DQ-NEXT:    vzeroupper
649 ; AVX512DQ-NEXT:    retq
651 ; X86-LABEL: test7:
652 ; X86:       ## %bb.0: ## %allocas
653 ; X86-NEXT:    vpsllw $15, %xmm0, %xmm0
654 ; X86-NEXT:    vpmovw2m %xmm0, %k0
655 ; X86-NEXT:    kmovd %k0, %eax
656 ; X86-NEXT:    orb $85, %al
657 ; X86-NEXT:    retl
658 allocas:
659   %a= or <8 x i1> %mask, <i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false>
660   %b = bitcast <8 x i1> %a to i8
661   %c = icmp eq i8 %b, 0
662   br i1 %c, label %true, label %false
664 true:
665   ret void
667 false:
668   ret void
670 define <16 x i8> @test8(<16 x i32>%a, <16 x i32>%b, i32 %a1, i32 %b1) {
671 ; KNL-LABEL: test8:
672 ; KNL:       ## %bb.0:
673 ; KNL-NEXT:    cmpl %esi, %edi
674 ; KNL-NEXT:    jg LBB17_1
675 ; KNL-NEXT:  ## %bb.2:
676 ; KNL-NEXT:    kxorw %k0, %k0, %k1
677 ; KNL-NEXT:    jmp LBB17_3
678 ; KNL-NEXT:  LBB17_1:
679 ; KNL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
680 ; KNL-NEXT:    vpcmpgtd %zmm1, %zmm0, %k1
681 ; KNL-NEXT:  LBB17_3:
682 ; KNL-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
683 ; KNL-NEXT:    vpmovdb %zmm0, %xmm0
684 ; KNL-NEXT:    vzeroupper
685 ; KNL-NEXT:    retq
687 ; SKX-LABEL: test8:
688 ; SKX:       ## %bb.0:
689 ; SKX-NEXT:    cmpl %esi, %edi
690 ; SKX-NEXT:    jg LBB17_1
691 ; SKX-NEXT:  ## %bb.2:
692 ; SKX-NEXT:    kxorw %k0, %k0, %k0
693 ; SKX-NEXT:    vpmovm2b %k0, %xmm0
694 ; SKX-NEXT:    vzeroupper
695 ; SKX-NEXT:    retq
696 ; SKX-NEXT:  LBB17_1:
697 ; SKX-NEXT:    vpxor %xmm1, %xmm1, %xmm1
698 ; SKX-NEXT:    vpcmpgtd %zmm1, %zmm0, %k0
699 ; SKX-NEXT:    vpmovm2b %k0, %xmm0
700 ; SKX-NEXT:    vzeroupper
701 ; SKX-NEXT:    retq
703 ; AVX512BW-LABEL: test8:
704 ; AVX512BW:       ## %bb.0:
705 ; AVX512BW-NEXT:    cmpl %esi, %edi
706 ; AVX512BW-NEXT:    jg LBB17_1
707 ; AVX512BW-NEXT:  ## %bb.2:
708 ; AVX512BW-NEXT:    kxorw %k0, %k0, %k0
709 ; AVX512BW-NEXT:    vpmovm2b %k0, %zmm0
710 ; AVX512BW-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $zmm0
711 ; AVX512BW-NEXT:    vzeroupper
712 ; AVX512BW-NEXT:    retq
713 ; AVX512BW-NEXT:  LBB17_1:
714 ; AVX512BW-NEXT:    vpxor %xmm1, %xmm1, %xmm1
715 ; AVX512BW-NEXT:    vpcmpgtd %zmm1, %zmm0, %k0
716 ; AVX512BW-NEXT:    vpmovm2b %k0, %zmm0
717 ; AVX512BW-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $zmm0
718 ; AVX512BW-NEXT:    vzeroupper
719 ; AVX512BW-NEXT:    retq
721 ; AVX512DQ-LABEL: test8:
722 ; AVX512DQ:       ## %bb.0:
723 ; AVX512DQ-NEXT:    cmpl %esi, %edi
724 ; AVX512DQ-NEXT:    jg LBB17_1
725 ; AVX512DQ-NEXT:  ## %bb.2:
726 ; AVX512DQ-NEXT:    kxorw %k0, %k0, %k0
727 ; AVX512DQ-NEXT:    jmp LBB17_3
728 ; AVX512DQ-NEXT:  LBB17_1:
729 ; AVX512DQ-NEXT:    vpxor %xmm1, %xmm1, %xmm1
730 ; AVX512DQ-NEXT:    vpcmpgtd %zmm1, %zmm0, %k0
731 ; AVX512DQ-NEXT:  LBB17_3:
732 ; AVX512DQ-NEXT:    vpmovm2d %k0, %zmm0
733 ; AVX512DQ-NEXT:    vpmovdb %zmm0, %xmm0
734 ; AVX512DQ-NEXT:    vzeroupper
735 ; AVX512DQ-NEXT:    retq
737 ; X86-LABEL: test8:
738 ; X86:       ## %bb.0:
739 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
740 ; X86-NEXT:    cmpl {{[0-9]+}}(%esp), %eax
741 ; X86-NEXT:    jg LBB17_1
742 ; X86-NEXT:  ## %bb.2:
743 ; X86-NEXT:    kxorw %k0, %k0, %k0
744 ; X86-NEXT:    vpmovm2b %k0, %xmm0
745 ; X86-NEXT:    vzeroupper
746 ; X86-NEXT:    retl
747 ; X86-NEXT:  LBB17_1:
748 ; X86-NEXT:    vpxor %xmm1, %xmm1, %xmm1
749 ; X86-NEXT:    vpcmpgtd %zmm1, %zmm0, %k0
750 ; X86-NEXT:    vpmovm2b %k0, %xmm0
751 ; X86-NEXT:    vzeroupper
752 ; X86-NEXT:    retl
753   %cond = icmp sgt i32 %a1, %b1
754   %cmp1 = icmp sgt <16 x i32> %a, zeroinitializer
755   %cmp2 = icmp ult <16 x i32> %b, zeroinitializer
756   %mix = select i1 %cond, <16 x i1> %cmp1, <16 x i1> %cmp2
757   %res = sext <16 x i1> %mix to <16 x i8>
758   ret <16 x i8> %res
760 define <16 x i1> @test9(<16 x i1>%a, <16 x i1>%b, i32 %a1, i32 %b1) {
761 ; KNL-LABEL: test9:
762 ; KNL:       ## %bb.0:
763 ; KNL-NEXT:    cmpl %esi, %edi
764 ; KNL-NEXT:    jg LBB18_1
765 ; KNL-NEXT:  ## %bb.2:
766 ; KNL-NEXT:    vpmovsxbd %xmm1, %zmm0
767 ; KNL-NEXT:    jmp LBB18_3
768 ; KNL-NEXT:  LBB18_1:
769 ; KNL-NEXT:    vpmovsxbd %xmm0, %zmm0
770 ; KNL-NEXT:  LBB18_3:
771 ; KNL-NEXT:    vpslld $31, %zmm0, %zmm0
772 ; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k1
773 ; KNL-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
774 ; KNL-NEXT:    vpmovdb %zmm0, %xmm0
775 ; KNL-NEXT:    vzeroupper
776 ; KNL-NEXT:    retq
778 ; SKX-LABEL: test9:
779 ; SKX:       ## %bb.0:
780 ; SKX-NEXT:    cmpl %esi, %edi
781 ; SKX-NEXT:    jg LBB18_1
782 ; SKX-NEXT:  ## %bb.2:
783 ; SKX-NEXT:    vpsllw $7, %xmm1, %xmm0
784 ; SKX-NEXT:    jmp LBB18_3
785 ; SKX-NEXT:  LBB18_1:
786 ; SKX-NEXT:    vpsllw $7, %xmm0, %xmm0
787 ; SKX-NEXT:  LBB18_3:
788 ; SKX-NEXT:    vpmovb2m %xmm0, %k0
789 ; SKX-NEXT:    vpmovm2b %k0, %xmm0
790 ; SKX-NEXT:    retq
792 ; AVX512BW-LABEL: test9:
793 ; AVX512BW:       ## %bb.0:
794 ; AVX512BW-NEXT:    cmpl %esi, %edi
795 ; AVX512BW-NEXT:    jg LBB18_1
796 ; AVX512BW-NEXT:  ## %bb.2:
797 ; AVX512BW-NEXT:    vpsllw $7, %xmm1, %xmm0
798 ; AVX512BW-NEXT:    jmp LBB18_3
799 ; AVX512BW-NEXT:  LBB18_1:
800 ; AVX512BW-NEXT:    vpsllw $7, %xmm0, %xmm0
801 ; AVX512BW-NEXT:  LBB18_3:
802 ; AVX512BW-NEXT:    vpmovb2m %zmm0, %k0
803 ; AVX512BW-NEXT:    vpmovm2b %k0, %zmm0
804 ; AVX512BW-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $zmm0
805 ; AVX512BW-NEXT:    vzeroupper
806 ; AVX512BW-NEXT:    retq
808 ; AVX512DQ-LABEL: test9:
809 ; AVX512DQ:       ## %bb.0:
810 ; AVX512DQ-NEXT:    cmpl %esi, %edi
811 ; AVX512DQ-NEXT:    jg LBB18_1
812 ; AVX512DQ-NEXT:  ## %bb.2:
813 ; AVX512DQ-NEXT:    vpmovsxbd %xmm1, %zmm0
814 ; AVX512DQ-NEXT:    jmp LBB18_3
815 ; AVX512DQ-NEXT:  LBB18_1:
816 ; AVX512DQ-NEXT:    vpmovsxbd %xmm0, %zmm0
817 ; AVX512DQ-NEXT:  LBB18_3:
818 ; AVX512DQ-NEXT:    vpslld $31, %zmm0, %zmm0
819 ; AVX512DQ-NEXT:    vpmovd2m %zmm0, %k0
820 ; AVX512DQ-NEXT:    vpmovm2d %k0, %zmm0
821 ; AVX512DQ-NEXT:    vpmovdb %zmm0, %xmm0
822 ; AVX512DQ-NEXT:    vzeroupper
823 ; AVX512DQ-NEXT:    retq
825 ; X86-LABEL: test9:
826 ; X86:       ## %bb.0:
827 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
828 ; X86-NEXT:    cmpl {{[0-9]+}}(%esp), %eax
829 ; X86-NEXT:    jg LBB18_1
830 ; X86-NEXT:  ## %bb.2:
831 ; X86-NEXT:    vpsllw $7, %xmm1, %xmm0
832 ; X86-NEXT:    jmp LBB18_3
833 ; X86-NEXT:  LBB18_1:
834 ; X86-NEXT:    vpsllw $7, %xmm0, %xmm0
835 ; X86-NEXT:  LBB18_3:
836 ; X86-NEXT:    vpmovb2m %xmm0, %k0
837 ; X86-NEXT:    vpmovm2b %k0, %xmm0
838 ; X86-NEXT:    retl
839   %mask = icmp sgt i32 %a1, %b1
840   %c = select i1 %mask, <16 x i1>%a, <16 x i1>%b
841   ret <16 x i1>%c
842 }define <8 x i1> @test10(<8 x i1>%a, <8 x i1>%b, i32 %a1, i32 %b1) {
843   %mask = icmp sgt i32 %a1, %b1
844   %c = select i1 %mask, <8 x i1>%a, <8 x i1>%b
845   ret <8 x i1>%c
848 define <4 x i1> @test11(<4 x i1>%a, <4 x i1>%b, i32 %a1, i32 %b1) {
849 ; KNL-LABEL: test11:
850 ; KNL:       ## %bb.0:
851 ; KNL-NEXT:    cmpl %esi, %edi
852 ; KNL-NEXT:    jg LBB20_1
853 ; KNL-NEXT:  ## %bb.2:
854 ; KNL-NEXT:    vpslld $31, %xmm1, %xmm0
855 ; KNL-NEXT:    jmp LBB20_3
856 ; KNL-NEXT:  LBB20_1:
857 ; KNL-NEXT:    vpslld $31, %xmm0, %xmm0
858 ; KNL-NEXT:  LBB20_3:
859 ; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k1
860 ; KNL-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
861 ; KNL-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $zmm0
862 ; KNL-NEXT:    vzeroupper
863 ; KNL-NEXT:    retq
865 ; SKX-LABEL: test11:
866 ; SKX:       ## %bb.0:
867 ; SKX-NEXT:    cmpl %esi, %edi
868 ; SKX-NEXT:    jg LBB20_1
869 ; SKX-NEXT:  ## %bb.2:
870 ; SKX-NEXT:    vpslld $31, %xmm1, %xmm0
871 ; SKX-NEXT:    jmp LBB20_3
872 ; SKX-NEXT:  LBB20_1:
873 ; SKX-NEXT:    vpslld $31, %xmm0, %xmm0
874 ; SKX-NEXT:  LBB20_3:
875 ; SKX-NEXT:    vpmovd2m %xmm0, %k0
876 ; SKX-NEXT:    vpmovm2d %k0, %xmm0
877 ; SKX-NEXT:    retq
879 ; AVX512BW-LABEL: test11:
880 ; AVX512BW:       ## %bb.0:
881 ; AVX512BW-NEXT:    cmpl %esi, %edi
882 ; AVX512BW-NEXT:    jg LBB20_1
883 ; AVX512BW-NEXT:  ## %bb.2:
884 ; AVX512BW-NEXT:    vpslld $31, %xmm1, %xmm0
885 ; AVX512BW-NEXT:    jmp LBB20_3
886 ; AVX512BW-NEXT:  LBB20_1:
887 ; AVX512BW-NEXT:    vpslld $31, %xmm0, %xmm0
888 ; AVX512BW-NEXT:  LBB20_3:
889 ; AVX512BW-NEXT:    vptestmd %zmm0, %zmm0, %k1
890 ; AVX512BW-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
891 ; AVX512BW-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $zmm0
892 ; AVX512BW-NEXT:    vzeroupper
893 ; AVX512BW-NEXT:    retq
895 ; AVX512DQ-LABEL: test11:
896 ; AVX512DQ:       ## %bb.0:
897 ; AVX512DQ-NEXT:    cmpl %esi, %edi
898 ; AVX512DQ-NEXT:    jg LBB20_1
899 ; AVX512DQ-NEXT:  ## %bb.2:
900 ; AVX512DQ-NEXT:    vpslld $31, %xmm1, %xmm0
901 ; AVX512DQ-NEXT:    jmp LBB20_3
902 ; AVX512DQ-NEXT:  LBB20_1:
903 ; AVX512DQ-NEXT:    vpslld $31, %xmm0, %xmm0
904 ; AVX512DQ-NEXT:  LBB20_3:
905 ; AVX512DQ-NEXT:    vpmovd2m %zmm0, %k0
906 ; AVX512DQ-NEXT:    vpmovm2d %k0, %zmm0
907 ; AVX512DQ-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $zmm0
908 ; AVX512DQ-NEXT:    vzeroupper
909 ; AVX512DQ-NEXT:    retq
911 ; X86-LABEL: test11:
912 ; X86:       ## %bb.0:
913 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
914 ; X86-NEXT:    cmpl {{[0-9]+}}(%esp), %eax
915 ; X86-NEXT:    jg LBB20_1
916 ; X86-NEXT:  ## %bb.2:
917 ; X86-NEXT:    vpslld $31, %xmm1, %xmm0
918 ; X86-NEXT:    jmp LBB20_3
919 ; X86-NEXT:  LBB20_1:
920 ; X86-NEXT:    vpslld $31, %xmm0, %xmm0
921 ; X86-NEXT:  LBB20_3:
922 ; X86-NEXT:    vpmovd2m %xmm0, %k0
923 ; X86-NEXT:    vpmovm2d %k0, %xmm0
924 ; X86-NEXT:    retl
925   %mask = icmp sgt i32 %a1, %b1
926   %c = select i1 %mask, <4 x i1>%a, <4 x i1>%b
927   ret <4 x i1>%c
930 define i32 @test12(i32 %x, i32 %y)  {
931 ; CHECK-LABEL: test12:
932 ; CHECK:       ## %bb.0:
933 ; CHECK-NEXT:    movl %edi, %eax
934 ; CHECK-NEXT:    retq
936 ; X86-LABEL: test12:
937 ; X86:       ## %bb.0:
938 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
939 ; X86-NEXT:    retl
940   %a = bitcast i16 21845 to <16 x i1>
941   %b = extractelement <16 x i1> %a, i32 0
942   %c = select i1 %b, i32 %x, i32 %y
943   ret i32 %c
946 define i32 @test13(i32 %x, i32 %y)  {
947 ; CHECK-LABEL: test13:
948 ; CHECK:       ## %bb.0:
949 ; CHECK-NEXT:    movl %esi, %eax
950 ; CHECK-NEXT:    retq
952 ; X86-LABEL: test13:
953 ; X86:       ## %bb.0:
954 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
955 ; X86-NEXT:    retl
956   %a = bitcast i16 21845 to <16 x i1>
957   %b = extractelement <16 x i1> %a, i32 3
958   %c = select i1 %b, i32 %x, i32 %y
959   ret i32 %c
962 ; Make sure we don't crash on a large vector.
963 define i32 @test13_crash(i32 %x, i32 %y)  {
964 ; CHECK-LABEL: test13_crash:
965 ; CHECK:       ## %bb.0:
966 ; CHECK-NEXT:    movl %edi, %eax
967 ; CHECK-NEXT:    retq
969 ; X86-LABEL: test13_crash:
970 ; X86:       ## %bb.0:
971 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
972 ; X86-NEXT:    retl
973   %a = bitcast i128 2184568686868686868686868686 to <128 x i1>
974   %b = extractelement <128 x i1> %a, i32 3
975   %c = select i1 %b, i32 %x, i32 %y
976   ret i32 %c
979 define <4 x i1> @test14()  {
980 ; CHECK-LABEL: test14:
981 ; CHECK:       ## %bb.0:
982 ; CHECK-NEXT:    vmovaps {{.*#+}} xmm0 = [1,1,0,1]
983 ; CHECK-NEXT:    retq
985 ; X86-LABEL: test14:
986 ; X86:       ## %bb.0:
987 ; X86-NEXT:    vmovaps {{.*#+}} xmm0 = [1,1,0,1]
988 ; X86-NEXT:    retl
989   %a = bitcast i16 21845 to <16 x i1>
990   %b = extractelement <16 x i1> %a, i32 2
991   %c = insertelement <4 x i1> <i1 true, i1 false, i1 false, i1 true>, i1 %b, i32 1
992   ret <4 x i1> %c
995 define <16 x i1> @test15(i32 %x, i32 %y)  {
996 ; KNL-LABEL: test15:
997 ; KNL:       ## %bb.0:
998 ; KNL-NEXT:    cmpl %esi, %edi
999 ; KNL-NEXT:    movl $21845, %eax ## imm = 0x5555
1000 ; KNL-NEXT:    movl $1, %ecx
1001 ; KNL-NEXT:    cmovgl %eax, %ecx
1002 ; KNL-NEXT:    kmovw %ecx, %k1
1003 ; KNL-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
1004 ; KNL-NEXT:    vpmovdb %zmm0, %xmm0
1005 ; KNL-NEXT:    vzeroupper
1006 ; KNL-NEXT:    retq
1008 ; SKX-LABEL: test15:
1009 ; SKX:       ## %bb.0:
1010 ; SKX-NEXT:    cmpl %esi, %edi
1011 ; SKX-NEXT:    movl $21845, %eax ## imm = 0x5555
1012 ; SKX-NEXT:    movl $1, %ecx
1013 ; SKX-NEXT:    cmovgl %eax, %ecx
1014 ; SKX-NEXT:    kmovd %ecx, %k0
1015 ; SKX-NEXT:    vpmovm2b %k0, %xmm0
1016 ; SKX-NEXT:    retq
1018 ; AVX512BW-LABEL: test15:
1019 ; AVX512BW:       ## %bb.0:
1020 ; AVX512BW-NEXT:    cmpl %esi, %edi
1021 ; AVX512BW-NEXT:    movl $21845, %eax ## imm = 0x5555
1022 ; AVX512BW-NEXT:    movl $1, %ecx
1023 ; AVX512BW-NEXT:    cmovgl %eax, %ecx
1024 ; AVX512BW-NEXT:    kmovd %ecx, %k0
1025 ; AVX512BW-NEXT:    vpmovm2b %k0, %zmm0
1026 ; AVX512BW-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $zmm0
1027 ; AVX512BW-NEXT:    vzeroupper
1028 ; AVX512BW-NEXT:    retq
1030 ; AVX512DQ-LABEL: test15:
1031 ; AVX512DQ:       ## %bb.0:
1032 ; AVX512DQ-NEXT:    cmpl %esi, %edi
1033 ; AVX512DQ-NEXT:    movl $21845, %eax ## imm = 0x5555
1034 ; AVX512DQ-NEXT:    movl $1, %ecx
1035 ; AVX512DQ-NEXT:    cmovgl %eax, %ecx
1036 ; AVX512DQ-NEXT:    kmovw %ecx, %k0
1037 ; AVX512DQ-NEXT:    vpmovm2d %k0, %zmm0
1038 ; AVX512DQ-NEXT:    vpmovdb %zmm0, %xmm0
1039 ; AVX512DQ-NEXT:    vzeroupper
1040 ; AVX512DQ-NEXT:    retq
1042 ; X86-LABEL: test15:
1043 ; X86:       ## %bb.0:
1044 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1045 ; X86-NEXT:    cmpl {{[0-9]+}}(%esp), %eax
1046 ; X86-NEXT:    movl $21845, %eax ## imm = 0x5555
1047 ; X86-NEXT:    movl $1, %ecx
1048 ; X86-NEXT:    cmovgl %eax, %ecx
1049 ; X86-NEXT:    kmovd %ecx, %k0
1050 ; X86-NEXT:    vpmovm2b %k0, %xmm0
1051 ; X86-NEXT:    retl
1052   %a = bitcast i16 21845 to <16 x i1>
1053   %b = bitcast i16 1 to <16 x i1>
1054   %mask = icmp sgt i32 %x, %y
1055   %c = select i1 %mask, <16 x i1> %a, <16 x i1> %b
1056   ret <16 x i1> %c
1059 define <64 x i8> @test16(i64 %x) {
1061 ; KNL-LABEL: test16:
1062 ; KNL:       ## %bb.0:
1063 ; KNL-NEXT:    movq %rdi, %rax
1064 ; KNL-NEXT:    movl %edi, %ecx
1065 ; KNL-NEXT:    kmovw %edi, %k0
1066 ; KNL-NEXT:    shrq $32, %rdi
1067 ; KNL-NEXT:    shrq $48, %rax
1068 ; KNL-NEXT:    shrl $16, %ecx
1069 ; KNL-NEXT:    kmovw %ecx, %k1
1070 ; KNL-NEXT:    kmovw %eax, %k2
1071 ; KNL-NEXT:    kmovw %edi, %k3
1072 ; KNL-NEXT:    kshiftrw $6, %k0, %k4
1073 ; KNL-NEXT:    kshiftlw $6, %k4, %k4
1074 ; KNL-NEXT:    kshiftlw $11, %k0, %k0
1075 ; KNL-NEXT:    kshiftrw $11, %k0, %k0
1076 ; KNL-NEXT:    movb $1, %al
1077 ; KNL-NEXT:    kmovw %eax, %k5
1078 ; KNL-NEXT:    kshiftlw $15, %k5, %k5
1079 ; KNL-NEXT:    kshiftrw $10, %k5, %k5
1080 ; KNL-NEXT:    korw %k5, %k4, %k4
1081 ; KNL-NEXT:    korw %k4, %k0, %k4
1082 ; KNL-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k3} {z}
1083 ; KNL-NEXT:    vpmovdb %zmm0, %xmm0
1084 ; KNL-NEXT:    vpternlogd $255, %zmm1, %zmm1, %zmm1 {%k2} {z}
1085 ; KNL-NEXT:    vpmovdb %zmm1, %xmm1
1086 ; KNL-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
1087 ; KNL-NEXT:    vpternlogd $255, %zmm1, %zmm1, %zmm1 {%k4} {z}
1088 ; KNL-NEXT:    vpmovdb %zmm1, %xmm1
1089 ; KNL-NEXT:    vpternlogd $255, %zmm2, %zmm2, %zmm2 {%k1} {z}
1090 ; KNL-NEXT:    vpmovdb %zmm2, %xmm2
1091 ; KNL-NEXT:    vinserti128 $1, %xmm2, %ymm1, %ymm1
1092 ; KNL-NEXT:    vinserti64x4 $1, %ymm0, %zmm1, %zmm0
1093 ; KNL-NEXT:    retq
1095 ; SKX-LABEL: test16:
1096 ; SKX:       ## %bb.0:
1097 ; SKX-NEXT:    kmovq %rdi, %k0
1098 ; SKX-NEXT:    kshiftrq $6, %k0, %k1
1099 ; SKX-NEXT:    kshiftlq $6, %k1, %k1
1100 ; SKX-NEXT:    kshiftlq $59, %k0, %k0
1101 ; SKX-NEXT:    kshiftrq $59, %k0, %k0
1102 ; SKX-NEXT:    movb $1, %al
1103 ; SKX-NEXT:    kmovd %eax, %k2
1104 ; SKX-NEXT:    kshiftlq $63, %k2, %k2
1105 ; SKX-NEXT:    kshiftrq $58, %k2, %k2
1106 ; SKX-NEXT:    korq %k2, %k1, %k1
1107 ; SKX-NEXT:    korq %k1, %k0, %k0
1108 ; SKX-NEXT:    vpmovm2b %k0, %zmm0
1109 ; SKX-NEXT:    retq
1111 ; AVX512BW-LABEL: test16:
1112 ; AVX512BW:       ## %bb.0:
1113 ; AVX512BW-NEXT:    kmovq %rdi, %k0
1114 ; AVX512BW-NEXT:    kshiftrq $6, %k0, %k1
1115 ; AVX512BW-NEXT:    kshiftlq $6, %k1, %k1
1116 ; AVX512BW-NEXT:    kshiftlq $59, %k0, %k0
1117 ; AVX512BW-NEXT:    kshiftrq $59, %k0, %k0
1118 ; AVX512BW-NEXT:    movb $1, %al
1119 ; AVX512BW-NEXT:    kmovd %eax, %k2
1120 ; AVX512BW-NEXT:    kshiftlq $63, %k2, %k2
1121 ; AVX512BW-NEXT:    kshiftrq $58, %k2, %k2
1122 ; AVX512BW-NEXT:    korq %k2, %k1, %k1
1123 ; AVX512BW-NEXT:    korq %k1, %k0, %k0
1124 ; AVX512BW-NEXT:    vpmovm2b %k0, %zmm0
1125 ; AVX512BW-NEXT:    retq
1127 ; AVX512DQ-LABEL: test16:
1128 ; AVX512DQ:       ## %bb.0:
1129 ; AVX512DQ-NEXT:    movq %rdi, %rax
1130 ; AVX512DQ-NEXT:    movl %edi, %ecx
1131 ; AVX512DQ-NEXT:    kmovw %edi, %k1
1132 ; AVX512DQ-NEXT:    shrq $32, %rdi
1133 ; AVX512DQ-NEXT:    shrq $48, %rax
1134 ; AVX512DQ-NEXT:    shrl $16, %ecx
1135 ; AVX512DQ-NEXT:    kmovw %ecx, %k0
1136 ; AVX512DQ-NEXT:    kmovw %eax, %k2
1137 ; AVX512DQ-NEXT:    kmovw %edi, %k3
1138 ; AVX512DQ-NEXT:    kshiftrw $6, %k1, %k4
1139 ; AVX512DQ-NEXT:    kshiftlw $6, %k4, %k4
1140 ; AVX512DQ-NEXT:    kshiftlw $11, %k1, %k1
1141 ; AVX512DQ-NEXT:    kshiftrw $11, %k1, %k1
1142 ; AVX512DQ-NEXT:    movb $1, %al
1143 ; AVX512DQ-NEXT:    kmovw %eax, %k5
1144 ; AVX512DQ-NEXT:    kshiftlw $15, %k5, %k5
1145 ; AVX512DQ-NEXT:    kshiftrw $10, %k5, %k5
1146 ; AVX512DQ-NEXT:    korw %k5, %k4, %k4
1147 ; AVX512DQ-NEXT:    korw %k4, %k1, %k1
1148 ; AVX512DQ-NEXT:    vpmovm2d %k3, %zmm0
1149 ; AVX512DQ-NEXT:    vpmovdb %zmm0, %xmm0
1150 ; AVX512DQ-NEXT:    vpmovm2d %k2, %zmm1
1151 ; AVX512DQ-NEXT:    vpmovdb %zmm1, %xmm1
1152 ; AVX512DQ-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
1153 ; AVX512DQ-NEXT:    vpmovm2d %k1, %zmm1
1154 ; AVX512DQ-NEXT:    vpmovdb %zmm1, %xmm1
1155 ; AVX512DQ-NEXT:    vpmovm2d %k0, %zmm2
1156 ; AVX512DQ-NEXT:    vpmovdb %zmm2, %xmm2
1157 ; AVX512DQ-NEXT:    vinserti128 $1, %xmm2, %ymm1, %ymm1
1158 ; AVX512DQ-NEXT:    vinserti64x4 $1, %ymm0, %zmm1, %zmm0
1159 ; AVX512DQ-NEXT:    retq
1161 ; X86-LABEL: test16:
1162 ; X86:       ## %bb.0:
1163 ; X86-NEXT:    kmovq {{[0-9]+}}(%esp), %k0
1164 ; X86-NEXT:    kshiftrq $6, %k0, %k1
1165 ; X86-NEXT:    kshiftlq $6, %k1, %k1
1166 ; X86-NEXT:    kshiftlq $59, %k0, %k0
1167 ; X86-NEXT:    kshiftrq $59, %k0, %k0
1168 ; X86-NEXT:    movb $1, %al
1169 ; X86-NEXT:    kmovd %eax, %k2
1170 ; X86-NEXT:    kshiftlq $63, %k2, %k2
1171 ; X86-NEXT:    kshiftrq $58, %k2, %k2
1172 ; X86-NEXT:    korq %k2, %k1, %k1
1173 ; X86-NEXT:    korq %k1, %k0, %k0
1174 ; X86-NEXT:    vpmovm2b %k0, %zmm0
1175 ; X86-NEXT:    retl
1176   %a = bitcast i64 %x to <64 x i1>
1177   %b = insertelement <64 x i1>%a, i1 true, i32 5
1178   %c = sext <64 x i1>%b to <64 x i8>
1179   ret <64 x i8>%c
1182 define <64 x i8> @test17(i64 %x, i32 %y, i32 %z) {
1184 ; KNL-LABEL: test17:
1185 ; KNL:       ## %bb.0:
1186 ; KNL-NEXT:    movq %rdi, %rax
1187 ; KNL-NEXT:    movl %edi, %ecx
1188 ; KNL-NEXT:    kmovw %edi, %k0
1189 ; KNL-NEXT:    shrq $32, %rdi
1190 ; KNL-NEXT:    shrq $48, %rax
1191 ; KNL-NEXT:    shrl $16, %ecx
1192 ; KNL-NEXT:    kmovw %ecx, %k1
1193 ; KNL-NEXT:    kmovw %eax, %k2
1194 ; KNL-NEXT:    kmovw %edi, %k3
1195 ; KNL-NEXT:    cmpl %edx, %esi
1196 ; KNL-NEXT:    setg %al
1197 ; KNL-NEXT:    kshiftrw $6, %k0, %k4
1198 ; KNL-NEXT:    kshiftlw $6, %k4, %k4
1199 ; KNL-NEXT:    kshiftlw $11, %k0, %k0
1200 ; KNL-NEXT:    kshiftrw $11, %k0, %k0
1201 ; KNL-NEXT:    kmovw %eax, %k5
1202 ; KNL-NEXT:    kshiftlw $15, %k5, %k5
1203 ; KNL-NEXT:    kshiftrw $10, %k5, %k5
1204 ; KNL-NEXT:    korw %k5, %k4, %k4
1205 ; KNL-NEXT:    korw %k4, %k0, %k4
1206 ; KNL-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k3} {z}
1207 ; KNL-NEXT:    vpmovdb %zmm0, %xmm0
1208 ; KNL-NEXT:    vpternlogd $255, %zmm1, %zmm1, %zmm1 {%k2} {z}
1209 ; KNL-NEXT:    vpmovdb %zmm1, %xmm1
1210 ; KNL-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
1211 ; KNL-NEXT:    vpternlogd $255, %zmm1, %zmm1, %zmm1 {%k4} {z}
1212 ; KNL-NEXT:    vpmovdb %zmm1, %xmm1
1213 ; KNL-NEXT:    vpternlogd $255, %zmm2, %zmm2, %zmm2 {%k1} {z}
1214 ; KNL-NEXT:    vpmovdb %zmm2, %xmm2
1215 ; KNL-NEXT:    vinserti128 $1, %xmm2, %ymm1, %ymm1
1216 ; KNL-NEXT:    vinserti64x4 $1, %ymm0, %zmm1, %zmm0
1217 ; KNL-NEXT:    retq
1219 ; SKX-LABEL: test17:
1220 ; SKX:       ## %bb.0:
1221 ; SKX-NEXT:    kmovq %rdi, %k0
1222 ; SKX-NEXT:    cmpl %edx, %esi
1223 ; SKX-NEXT:    setg %al
1224 ; SKX-NEXT:    kshiftrq $6, %k0, %k1
1225 ; SKX-NEXT:    kshiftlq $6, %k1, %k1
1226 ; SKX-NEXT:    kshiftlq $59, %k0, %k0
1227 ; SKX-NEXT:    kshiftrq $59, %k0, %k0
1228 ; SKX-NEXT:    kmovd %eax, %k2
1229 ; SKX-NEXT:    kshiftlq $63, %k2, %k2
1230 ; SKX-NEXT:    kshiftrq $58, %k2, %k2
1231 ; SKX-NEXT:    korq %k2, %k1, %k1
1232 ; SKX-NEXT:    korq %k1, %k0, %k0
1233 ; SKX-NEXT:    vpmovm2b %k0, %zmm0
1234 ; SKX-NEXT:    retq
1236 ; AVX512BW-LABEL: test17:
1237 ; AVX512BW:       ## %bb.0:
1238 ; AVX512BW-NEXT:    kmovq %rdi, %k0
1239 ; AVX512BW-NEXT:    cmpl %edx, %esi
1240 ; AVX512BW-NEXT:    setg %al
1241 ; AVX512BW-NEXT:    kshiftrq $6, %k0, %k1
1242 ; AVX512BW-NEXT:    kshiftlq $6, %k1, %k1
1243 ; AVX512BW-NEXT:    kshiftlq $59, %k0, %k0
1244 ; AVX512BW-NEXT:    kshiftrq $59, %k0, %k0
1245 ; AVX512BW-NEXT:    kmovd %eax, %k2
1246 ; AVX512BW-NEXT:    kshiftlq $63, %k2, %k2
1247 ; AVX512BW-NEXT:    kshiftrq $58, %k2, %k2
1248 ; AVX512BW-NEXT:    korq %k2, %k1, %k1
1249 ; AVX512BW-NEXT:    korq %k1, %k0, %k0
1250 ; AVX512BW-NEXT:    vpmovm2b %k0, %zmm0
1251 ; AVX512BW-NEXT:    retq
1253 ; AVX512DQ-LABEL: test17:
1254 ; AVX512DQ:       ## %bb.0:
1255 ; AVX512DQ-NEXT:    movq %rdi, %rax
1256 ; AVX512DQ-NEXT:    movl %edi, %ecx
1257 ; AVX512DQ-NEXT:    kmovw %edi, %k1
1258 ; AVX512DQ-NEXT:    shrq $32, %rdi
1259 ; AVX512DQ-NEXT:    shrq $48, %rax
1260 ; AVX512DQ-NEXT:    shrl $16, %ecx
1261 ; AVX512DQ-NEXT:    kmovw %ecx, %k0
1262 ; AVX512DQ-NEXT:    kmovw %eax, %k2
1263 ; AVX512DQ-NEXT:    kmovw %edi, %k3
1264 ; AVX512DQ-NEXT:    cmpl %edx, %esi
1265 ; AVX512DQ-NEXT:    setg %al
1266 ; AVX512DQ-NEXT:    kshiftrw $6, %k1, %k4
1267 ; AVX512DQ-NEXT:    kshiftlw $6, %k4, %k4
1268 ; AVX512DQ-NEXT:    kshiftlw $11, %k1, %k1
1269 ; AVX512DQ-NEXT:    kshiftrw $11, %k1, %k1
1270 ; AVX512DQ-NEXT:    kmovw %eax, %k5
1271 ; AVX512DQ-NEXT:    kshiftlw $15, %k5, %k5
1272 ; AVX512DQ-NEXT:    kshiftrw $10, %k5, %k5
1273 ; AVX512DQ-NEXT:    korw %k5, %k4, %k4
1274 ; AVX512DQ-NEXT:    korw %k4, %k1, %k1
1275 ; AVX512DQ-NEXT:    vpmovm2d %k3, %zmm0
1276 ; AVX512DQ-NEXT:    vpmovdb %zmm0, %xmm0
1277 ; AVX512DQ-NEXT:    vpmovm2d %k2, %zmm1
1278 ; AVX512DQ-NEXT:    vpmovdb %zmm1, %xmm1
1279 ; AVX512DQ-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
1280 ; AVX512DQ-NEXT:    vpmovm2d %k1, %zmm1
1281 ; AVX512DQ-NEXT:    vpmovdb %zmm1, %xmm1
1282 ; AVX512DQ-NEXT:    vpmovm2d %k0, %zmm2
1283 ; AVX512DQ-NEXT:    vpmovdb %zmm2, %xmm2
1284 ; AVX512DQ-NEXT:    vinserti128 $1, %xmm2, %ymm1, %ymm1
1285 ; AVX512DQ-NEXT:    vinserti64x4 $1, %ymm0, %zmm1, %zmm0
1286 ; AVX512DQ-NEXT:    retq
1288 ; X86-LABEL: test17:
1289 ; X86:       ## %bb.0:
1290 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1291 ; X86-NEXT:    kmovq {{[0-9]+}}(%esp), %k0
1292 ; X86-NEXT:    cmpl {{[0-9]+}}(%esp), %eax
1293 ; X86-NEXT:    setg %al
1294 ; X86-NEXT:    kshiftrq $6, %k0, %k1
1295 ; X86-NEXT:    kshiftlq $6, %k1, %k1
1296 ; X86-NEXT:    kshiftlq $59, %k0, %k0
1297 ; X86-NEXT:    kshiftrq $59, %k0, %k0
1298 ; X86-NEXT:    kmovd %eax, %k2
1299 ; X86-NEXT:    kshiftlq $63, %k2, %k2
1300 ; X86-NEXT:    kshiftrq $58, %k2, %k2
1301 ; X86-NEXT:    korq %k2, %k1, %k1
1302 ; X86-NEXT:    korq %k1, %k0, %k0
1303 ; X86-NEXT:    vpmovm2b %k0, %zmm0
1304 ; X86-NEXT:    retl
1305   %a = bitcast i64 %x to <64 x i1>
1306   %b = icmp sgt i32 %y, %z
1307   %c = insertelement <64 x i1>%a, i1 %b, i32 5
1308   %d = sext <64 x i1>%c to <64 x i8>
1309   ret <64 x i8>%d
1312 define <8 x i1> @test18(i8 %a, i16 %y) {
1313 ; KNL-LABEL: test18:
1314 ; KNL:       ## %bb.0:
1315 ; KNL-NEXT:    kmovw %edi, %k0
1316 ; KNL-NEXT:    kmovw %esi, %k1
1317 ; KNL-NEXT:    kshiftrw $8, %k1, %k2
1318 ; KNL-NEXT:    kshiftrw $9, %k1, %k1
1319 ; KNL-NEXT:    kshiftlw $10, %k0, %k0
1320 ; KNL-NEXT:    kshiftrw $10, %k0, %k0
1321 ; KNL-NEXT:    kshiftlw $7, %k0, %k3
1322 ; KNL-NEXT:    kshiftlw $6, %k1, %k1
1323 ; KNL-NEXT:    korw %k1, %k3, %k1
1324 ; KNL-NEXT:    korw %k1, %k0, %k0
1325 ; KNL-NEXT:    kshiftlw $9, %k0, %k0
1326 ; KNL-NEXT:    kshiftrw $9, %k0, %k0
1327 ; KNL-NEXT:    kshiftlw $7, %k2, %k1
1328 ; KNL-NEXT:    korw %k1, %k0, %k1
1329 ; KNL-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
1330 ; KNL-NEXT:    vpmovdw %zmm0, %ymm0
1331 ; KNL-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $ymm0
1332 ; KNL-NEXT:    vzeroupper
1333 ; KNL-NEXT:    retq
1335 ; SKX-LABEL: test18:
1336 ; SKX:       ## %bb.0:
1337 ; SKX-NEXT:    kmovd %edi, %k0
1338 ; SKX-NEXT:    kmovd %esi, %k1
1339 ; SKX-NEXT:    kshiftrw $8, %k1, %k2
1340 ; SKX-NEXT:    kshiftrw $9, %k1, %k1
1341 ; SKX-NEXT:    kshiftlb $2, %k0, %k0
1342 ; SKX-NEXT:    kshiftrb $2, %k0, %k0
1343 ; SKX-NEXT:    kshiftlb $7, %k0, %k3
1344 ; SKX-NEXT:    kshiftlb $6, %k1, %k1
1345 ; SKX-NEXT:    korb %k1, %k3, %k1
1346 ; SKX-NEXT:    korb %k1, %k0, %k0
1347 ; SKX-NEXT:    kshiftlb $1, %k0, %k0
1348 ; SKX-NEXT:    kshiftrb $1, %k0, %k0
1349 ; SKX-NEXT:    kshiftlb $7, %k2, %k1
1350 ; SKX-NEXT:    korb %k1, %k0, %k0
1351 ; SKX-NEXT:    vpmovm2w %k0, %xmm0
1352 ; SKX-NEXT:    retq
1354 ; AVX512BW-LABEL: test18:
1355 ; AVX512BW:       ## %bb.0:
1356 ; AVX512BW-NEXT:    kmovd %edi, %k0
1357 ; AVX512BW-NEXT:    kmovd %esi, %k1
1358 ; AVX512BW-NEXT:    kshiftrw $8, %k1, %k2
1359 ; AVX512BW-NEXT:    kshiftrw $9, %k1, %k1
1360 ; AVX512BW-NEXT:    kshiftlw $10, %k0, %k0
1361 ; AVX512BW-NEXT:    kshiftrw $10, %k0, %k0
1362 ; AVX512BW-NEXT:    kshiftlw $7, %k0, %k3
1363 ; AVX512BW-NEXT:    kshiftlw $6, %k1, %k1
1364 ; AVX512BW-NEXT:    korw %k1, %k3, %k1
1365 ; AVX512BW-NEXT:    korw %k1, %k0, %k0
1366 ; AVX512BW-NEXT:    kshiftlw $9, %k0, %k0
1367 ; AVX512BW-NEXT:    kshiftrw $9, %k0, %k0
1368 ; AVX512BW-NEXT:    kshiftlw $7, %k2, %k1
1369 ; AVX512BW-NEXT:    korw %k1, %k0, %k0
1370 ; AVX512BW-NEXT:    vpmovm2w %k0, %zmm0
1371 ; AVX512BW-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $zmm0
1372 ; AVX512BW-NEXT:    vzeroupper
1373 ; AVX512BW-NEXT:    retq
1375 ; AVX512DQ-LABEL: test18:
1376 ; AVX512DQ:       ## %bb.0:
1377 ; AVX512DQ-NEXT:    kmovw %edi, %k0
1378 ; AVX512DQ-NEXT:    kmovw %esi, %k1
1379 ; AVX512DQ-NEXT:    kshiftrw $8, %k1, %k2
1380 ; AVX512DQ-NEXT:    kshiftrw $9, %k1, %k1
1381 ; AVX512DQ-NEXT:    kshiftlb $2, %k0, %k0
1382 ; AVX512DQ-NEXT:    kshiftrb $2, %k0, %k0
1383 ; AVX512DQ-NEXT:    kshiftlb $7, %k0, %k3
1384 ; AVX512DQ-NEXT:    kshiftlb $6, %k1, %k1
1385 ; AVX512DQ-NEXT:    korb %k1, %k3, %k1
1386 ; AVX512DQ-NEXT:    korb %k1, %k0, %k0
1387 ; AVX512DQ-NEXT:    kshiftlb $1, %k0, %k0
1388 ; AVX512DQ-NEXT:    kshiftrb $1, %k0, %k0
1389 ; AVX512DQ-NEXT:    kshiftlb $7, %k2, %k1
1390 ; AVX512DQ-NEXT:    korb %k1, %k0, %k0
1391 ; AVX512DQ-NEXT:    vpmovm2d %k0, %zmm0
1392 ; AVX512DQ-NEXT:    vpmovdw %zmm0, %ymm0
1393 ; AVX512DQ-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $ymm0
1394 ; AVX512DQ-NEXT:    vzeroupper
1395 ; AVX512DQ-NEXT:    retq
1397 ; X86-LABEL: test18:
1398 ; X86:       ## %bb.0:
1399 ; X86-NEXT:    kmovb {{[0-9]+}}(%esp), %k0
1400 ; X86-NEXT:    kmovw {{[0-9]+}}(%esp), %k1
1401 ; X86-NEXT:    kshiftrw $8, %k1, %k2
1402 ; X86-NEXT:    kshiftrw $9, %k1, %k1
1403 ; X86-NEXT:    kshiftlb $7, %k0, %k3
1404 ; X86-NEXT:    kshiftlb $2, %k0, %k0
1405 ; X86-NEXT:    kshiftrb $2, %k0, %k0
1406 ; X86-NEXT:    kshiftlb $6, %k1, %k1
1407 ; X86-NEXT:    korb %k1, %k3, %k1
1408 ; X86-NEXT:    korb %k1, %k0, %k0
1409 ; X86-NEXT:    kshiftlb $1, %k0, %k0
1410 ; X86-NEXT:    kshiftrb $1, %k0, %k0
1411 ; X86-NEXT:    kshiftlb $7, %k2, %k1
1412 ; X86-NEXT:    korb %k1, %k0, %k0
1413 ; X86-NEXT:    vpmovm2w %k0, %xmm0
1414 ; X86-NEXT:    retl
1415   %b = bitcast i8 %a to <8 x i1>
1416   %b1 = bitcast i16 %y to <16 x i1>
1417   %el1 = extractelement <16 x i1>%b1, i32 8
1418   %el2 = extractelement <16 x i1>%b1, i32 9
1419   %c = insertelement <8 x i1>%b, i1 %el1, i32 7
1420   %d = insertelement <8 x i1>%c, i1 %el2, i32 6
1421   ret <8 x i1>%d
1423 define <32 x i16> @test21(<32 x i16> %x , <32 x i1> %mask) nounwind readnone {
1424 ; KNL-LABEL: test21:
1425 ; KNL:       ## %bb.0:
1426 ; KNL-NEXT:    vpmovzxbw {{.*#+}} ymm2 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
1427 ; KNL-NEXT:    vextracti64x4 $1, %zmm0, %ymm3
1428 ; KNL-NEXT:    vextracti128 $1, %ymm1, %xmm1
1429 ; KNL-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
1430 ; KNL-NEXT:    vpsllw $15, %ymm1, %ymm1
1431 ; KNL-NEXT:    vpsraw $15, %ymm1, %ymm1
1432 ; KNL-NEXT:    vpand %ymm3, %ymm1, %ymm1
1433 ; KNL-NEXT:    vpsllw $15, %ymm2, %ymm2
1434 ; KNL-NEXT:    vpsraw $15, %ymm2, %ymm2
1435 ; KNL-NEXT:    vpand %ymm0, %ymm2, %ymm0
1436 ; KNL-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
1437 ; KNL-NEXT:    retq
1439 ; SKX-LABEL: test21:
1440 ; SKX:       ## %bb.0:
1441 ; SKX-NEXT:    vpsllw $7, %ymm1, %ymm1
1442 ; SKX-NEXT:    vpmovb2m %ymm1, %k1
1443 ; SKX-NEXT:    vmovdqu16 %zmm0, %zmm0 {%k1} {z}
1444 ; SKX-NEXT:    retq
1446 ; AVX512BW-LABEL: test21:
1447 ; AVX512BW:       ## %bb.0:
1448 ; AVX512BW-NEXT:    vpsllw $7, %ymm1, %ymm1
1449 ; AVX512BW-NEXT:    vpmovb2m %zmm1, %k1
1450 ; AVX512BW-NEXT:    vmovdqu16 %zmm0, %zmm0 {%k1} {z}
1451 ; AVX512BW-NEXT:    retq
1453 ; AVX512DQ-LABEL: test21:
1454 ; AVX512DQ:       ## %bb.0:
1455 ; AVX512DQ-NEXT:    vpmovzxbw {{.*#+}} ymm2 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
1456 ; AVX512DQ-NEXT:    vextracti64x4 $1, %zmm0, %ymm3
1457 ; AVX512DQ-NEXT:    vextracti128 $1, %ymm1, %xmm1
1458 ; AVX512DQ-NEXT:    vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero
1459 ; AVX512DQ-NEXT:    vpsllw $15, %ymm1, %ymm1
1460 ; AVX512DQ-NEXT:    vpsraw $15, %ymm1, %ymm1
1461 ; AVX512DQ-NEXT:    vpand %ymm3, %ymm1, %ymm1
1462 ; AVX512DQ-NEXT:    vpsllw $15, %ymm2, %ymm2
1463 ; AVX512DQ-NEXT:    vpsraw $15, %ymm2, %ymm2
1464 ; AVX512DQ-NEXT:    vpand %ymm0, %ymm2, %ymm0
1465 ; AVX512DQ-NEXT:    vinserti64x4 $1, %ymm1, %zmm0, %zmm0
1466 ; AVX512DQ-NEXT:    retq
1468 ; X86-LABEL: test21:
1469 ; X86:       ## %bb.0:
1470 ; X86-NEXT:    vpsllw $7, %ymm1, %ymm1
1471 ; X86-NEXT:    vpmovb2m %ymm1, %k1
1472 ; X86-NEXT:    vmovdqu16 %zmm0, %zmm0 {%k1} {z}
1473 ; X86-NEXT:    retl
1474   %ret = select <32 x i1> %mask, <32 x i16> %x, <32 x i16> zeroinitializer
1475   ret <32 x i16> %ret
1478 define void @test22(<4 x i1> %a, <4 x i1>* %addr) {
1479 ; KNL-LABEL: test22:
1480 ; KNL:       ## %bb.0:
1481 ; KNL-NEXT:    vpslld $31, %xmm0, %xmm0
1482 ; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k0
1483 ; KNL-NEXT:    kmovw %k0, %eax
1484 ; KNL-NEXT:    movb %al, (%rdi)
1485 ; KNL-NEXT:    vzeroupper
1486 ; KNL-NEXT:    retq
1488 ; SKX-LABEL: test22:
1489 ; SKX:       ## %bb.0:
1490 ; SKX-NEXT:    vpslld $31, %xmm0, %xmm0
1491 ; SKX-NEXT:    vpmovd2m %xmm0, %k0
1492 ; SKX-NEXT:    kmovb %k0, (%rdi)
1493 ; SKX-NEXT:    retq
1495 ; AVX512BW-LABEL: test22:
1496 ; AVX512BW:       ## %bb.0:
1497 ; AVX512BW-NEXT:    vpslld $31, %xmm0, %xmm0
1498 ; AVX512BW-NEXT:    vptestmd %zmm0, %zmm0, %k0
1499 ; AVX512BW-NEXT:    kmovd %k0, %eax
1500 ; AVX512BW-NEXT:    movb %al, (%rdi)
1501 ; AVX512BW-NEXT:    vzeroupper
1502 ; AVX512BW-NEXT:    retq
1504 ; AVX512DQ-LABEL: test22:
1505 ; AVX512DQ:       ## %bb.0:
1506 ; AVX512DQ-NEXT:    vpslld $31, %xmm0, %xmm0
1507 ; AVX512DQ-NEXT:    vpmovd2m %zmm0, %k0
1508 ; AVX512DQ-NEXT:    kmovb %k0, (%rdi)
1509 ; AVX512DQ-NEXT:    vzeroupper
1510 ; AVX512DQ-NEXT:    retq
1512 ; X86-LABEL: test22:
1513 ; X86:       ## %bb.0:
1514 ; X86-NEXT:    vpslld $31, %xmm0, %xmm0
1515 ; X86-NEXT:    vpmovd2m %xmm0, %k0
1516 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1517 ; X86-NEXT:    kmovb %k0, (%eax)
1518 ; X86-NEXT:    retl
1519   store <4 x i1> %a, <4 x i1>* %addr
1520   ret void
1523 define void @test23(<2 x i1> %a, <2 x i1>* %addr) {
1524 ; KNL-LABEL: test23:
1525 ; KNL:       ## %bb.0:
1526 ; KNL-NEXT:    vpsllq $63, %xmm0, %xmm0
1527 ; KNL-NEXT:    vptestmq %zmm0, %zmm0, %k0
1528 ; KNL-NEXT:    kmovw %k0, %eax
1529 ; KNL-NEXT:    movb %al, (%rdi)
1530 ; KNL-NEXT:    vzeroupper
1531 ; KNL-NEXT:    retq
1533 ; SKX-LABEL: test23:
1534 ; SKX:       ## %bb.0:
1535 ; SKX-NEXT:    vpsllq $63, %xmm0, %xmm0
1536 ; SKX-NEXT:    vpmovq2m %xmm0, %k0
1537 ; SKX-NEXT:    kmovb %k0, (%rdi)
1538 ; SKX-NEXT:    retq
1540 ; AVX512BW-LABEL: test23:
1541 ; AVX512BW:       ## %bb.0:
1542 ; AVX512BW-NEXT:    vpsllq $63, %xmm0, %xmm0
1543 ; AVX512BW-NEXT:    vptestmq %zmm0, %zmm0, %k0
1544 ; AVX512BW-NEXT:    kmovd %k0, %eax
1545 ; AVX512BW-NEXT:    movb %al, (%rdi)
1546 ; AVX512BW-NEXT:    vzeroupper
1547 ; AVX512BW-NEXT:    retq
1549 ; AVX512DQ-LABEL: test23:
1550 ; AVX512DQ:       ## %bb.0:
1551 ; AVX512DQ-NEXT:    vpsllq $63, %xmm0, %xmm0
1552 ; AVX512DQ-NEXT:    vpmovq2m %zmm0, %k0
1553 ; AVX512DQ-NEXT:    kmovb %k0, (%rdi)
1554 ; AVX512DQ-NEXT:    vzeroupper
1555 ; AVX512DQ-NEXT:    retq
1557 ; X86-LABEL: test23:
1558 ; X86:       ## %bb.0:
1559 ; X86-NEXT:    vpsllq $63, %xmm0, %xmm0
1560 ; X86-NEXT:    vpmovq2m %xmm0, %k0
1561 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1562 ; X86-NEXT:    kmovb %k0, (%eax)
1563 ; X86-NEXT:    retl
1564   store <2 x i1> %a, <2 x i1>* %addr
1565   ret void
1568 define void @store_v1i1(<1 x i1> %c , <1 x i1>* %ptr) {
1569 ; KNL-LABEL: store_v1i1:
1570 ; KNL:       ## %bb.0:
1571 ; KNL-NEXT:    kmovw %edi, %k0
1572 ; KNL-NEXT:    kxnorw %k0, %k0, %k1
1573 ; KNL-NEXT:    kxorw %k1, %k0, %k0
1574 ; KNL-NEXT:    kmovw %k0, %eax
1575 ; KNL-NEXT:    movb %al, (%rsi)
1576 ; KNL-NEXT:    retq
1578 ; SKX-LABEL: store_v1i1:
1579 ; SKX:       ## %bb.0:
1580 ; SKX-NEXT:    kmovd %edi, %k0
1581 ; SKX-NEXT:    kxnorw %k0, %k0, %k1
1582 ; SKX-NEXT:    kxorw %k1, %k0, %k0
1583 ; SKX-NEXT:    kmovb %k0, (%rsi)
1584 ; SKX-NEXT:    retq
1586 ; AVX512BW-LABEL: store_v1i1:
1587 ; AVX512BW:       ## %bb.0:
1588 ; AVX512BW-NEXT:    kmovd %edi, %k0
1589 ; AVX512BW-NEXT:    kxnorw %k0, %k0, %k1
1590 ; AVX512BW-NEXT:    kxorw %k1, %k0, %k0
1591 ; AVX512BW-NEXT:    kmovd %k0, %eax
1592 ; AVX512BW-NEXT:    movb %al, (%rsi)
1593 ; AVX512BW-NEXT:    retq
1595 ; AVX512DQ-LABEL: store_v1i1:
1596 ; AVX512DQ:       ## %bb.0:
1597 ; AVX512DQ-NEXT:    kmovw %edi, %k0
1598 ; AVX512DQ-NEXT:    kxnorw %k0, %k0, %k1
1599 ; AVX512DQ-NEXT:    kxorw %k1, %k0, %k0
1600 ; AVX512DQ-NEXT:    kmovb %k0, (%rsi)
1601 ; AVX512DQ-NEXT:    retq
1603 ; X86-LABEL: store_v1i1:
1604 ; X86:       ## %bb.0:
1605 ; X86-NEXT:    kmovd {{[0-9]+}}(%esp), %k0
1606 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1607 ; X86-NEXT:    kxnorw %k0, %k0, %k1
1608 ; X86-NEXT:    kxorw %k1, %k0, %k0
1609 ; X86-NEXT:    kmovb %k0, (%eax)
1610 ; X86-NEXT:    retl
1611   %x = xor <1 x i1> %c, <i1 1>
1612   store <1 x i1> %x, <1 x i1>*  %ptr, align 4
1613   ret void
1616 define void @store_v2i1(<2 x i1> %c , <2 x i1>* %ptr) {
1617 ; KNL-LABEL: store_v2i1:
1618 ; KNL:       ## %bb.0:
1619 ; KNL-NEXT:    vpsllq $63, %xmm0, %xmm0
1620 ; KNL-NEXT:    vptestnmq %zmm0, %zmm0, %k0
1621 ; KNL-NEXT:    kmovw %k0, %eax
1622 ; KNL-NEXT:    movb %al, (%rdi)
1623 ; KNL-NEXT:    vzeroupper
1624 ; KNL-NEXT:    retq
1626 ; SKX-LABEL: store_v2i1:
1627 ; SKX:       ## %bb.0:
1628 ; SKX-NEXT:    vpsllq $63, %xmm0, %xmm0
1629 ; SKX-NEXT:    vpmovq2m %xmm0, %k0
1630 ; SKX-NEXT:    knotw %k0, %k0
1631 ; SKX-NEXT:    kmovb %k0, (%rdi)
1632 ; SKX-NEXT:    retq
1634 ; AVX512BW-LABEL: store_v2i1:
1635 ; AVX512BW:       ## %bb.0:
1636 ; AVX512BW-NEXT:    vpsllq $63, %xmm0, %xmm0
1637 ; AVX512BW-NEXT:    vptestnmq %zmm0, %zmm0, %k0
1638 ; AVX512BW-NEXT:    kmovd %k0, %eax
1639 ; AVX512BW-NEXT:    movb %al, (%rdi)
1640 ; AVX512BW-NEXT:    vzeroupper
1641 ; AVX512BW-NEXT:    retq
1643 ; AVX512DQ-LABEL: store_v2i1:
1644 ; AVX512DQ:       ## %bb.0:
1645 ; AVX512DQ-NEXT:    vpsllq $63, %xmm0, %xmm0
1646 ; AVX512DQ-NEXT:    vpmovq2m %zmm0, %k0
1647 ; AVX512DQ-NEXT:    knotw %k0, %k0
1648 ; AVX512DQ-NEXT:    kmovb %k0, (%rdi)
1649 ; AVX512DQ-NEXT:    vzeroupper
1650 ; AVX512DQ-NEXT:    retq
1652 ; X86-LABEL: store_v2i1:
1653 ; X86:       ## %bb.0:
1654 ; X86-NEXT:    vpsllq $63, %xmm0, %xmm0
1655 ; X86-NEXT:    vpmovq2m %xmm0, %k0
1656 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1657 ; X86-NEXT:    knotw %k0, %k0
1658 ; X86-NEXT:    kmovb %k0, (%eax)
1659 ; X86-NEXT:    retl
1660   %x = xor <2 x i1> %c, <i1 1, i1 1>
1661   store <2 x i1> %x, <2 x i1>*  %ptr, align 4
1662   ret void
1665 define void @store_v4i1(<4 x i1> %c , <4 x i1>* %ptr) {
1666 ; KNL-LABEL: store_v4i1:
1667 ; KNL:       ## %bb.0:
1668 ; KNL-NEXT:    vpslld $31, %xmm0, %xmm0
1669 ; KNL-NEXT:    vptestnmd %zmm0, %zmm0, %k0
1670 ; KNL-NEXT:    kmovw %k0, %eax
1671 ; KNL-NEXT:    movb %al, (%rdi)
1672 ; KNL-NEXT:    vzeroupper
1673 ; KNL-NEXT:    retq
1675 ; SKX-LABEL: store_v4i1:
1676 ; SKX:       ## %bb.0:
1677 ; SKX-NEXT:    vpslld $31, %xmm0, %xmm0
1678 ; SKX-NEXT:    vpmovd2m %xmm0, %k0
1679 ; SKX-NEXT:    knotw %k0, %k0
1680 ; SKX-NEXT:    kmovb %k0, (%rdi)
1681 ; SKX-NEXT:    retq
1683 ; AVX512BW-LABEL: store_v4i1:
1684 ; AVX512BW:       ## %bb.0:
1685 ; AVX512BW-NEXT:    vpslld $31, %xmm0, %xmm0
1686 ; AVX512BW-NEXT:    vptestnmd %zmm0, %zmm0, %k0
1687 ; AVX512BW-NEXT:    kmovd %k0, %eax
1688 ; AVX512BW-NEXT:    movb %al, (%rdi)
1689 ; AVX512BW-NEXT:    vzeroupper
1690 ; AVX512BW-NEXT:    retq
1692 ; AVX512DQ-LABEL: store_v4i1:
1693 ; AVX512DQ:       ## %bb.0:
1694 ; AVX512DQ-NEXT:    vpslld $31, %xmm0, %xmm0
1695 ; AVX512DQ-NEXT:    vpmovd2m %zmm0, %k0
1696 ; AVX512DQ-NEXT:    knotw %k0, %k0
1697 ; AVX512DQ-NEXT:    kmovb %k0, (%rdi)
1698 ; AVX512DQ-NEXT:    vzeroupper
1699 ; AVX512DQ-NEXT:    retq
1701 ; X86-LABEL: store_v4i1:
1702 ; X86:       ## %bb.0:
1703 ; X86-NEXT:    vpslld $31, %xmm0, %xmm0
1704 ; X86-NEXT:    vpmovd2m %xmm0, %k0
1705 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1706 ; X86-NEXT:    knotw %k0, %k0
1707 ; X86-NEXT:    kmovb %k0, (%eax)
1708 ; X86-NEXT:    retl
1709   %x = xor <4 x i1> %c, <i1 1, i1 1, i1 1, i1 1>
1710   store <4 x i1> %x, <4 x i1>*  %ptr, align 4
1711   ret void
1714 define void @store_v8i1(<8 x i1> %c , <8 x i1>* %ptr) {
1715 ; KNL-LABEL: store_v8i1:
1716 ; KNL:       ## %bb.0:
1717 ; KNL-NEXT:    vpmovsxwq %xmm0, %zmm0
1718 ; KNL-NEXT:    vpsllq $63, %zmm0, %zmm0
1719 ; KNL-NEXT:    vptestnmq %zmm0, %zmm0, %k0
1720 ; KNL-NEXT:    kmovw %k0, %eax
1721 ; KNL-NEXT:    movb %al, (%rdi)
1722 ; KNL-NEXT:    vzeroupper
1723 ; KNL-NEXT:    retq
1725 ; SKX-LABEL: store_v8i1:
1726 ; SKX:       ## %bb.0:
1727 ; SKX-NEXT:    vpsllw $15, %xmm0, %xmm0
1728 ; SKX-NEXT:    vpmovw2m %xmm0, %k0
1729 ; SKX-NEXT:    knotb %k0, %k0
1730 ; SKX-NEXT:    kmovb %k0, (%rdi)
1731 ; SKX-NEXT:    retq
1733 ; AVX512BW-LABEL: store_v8i1:
1734 ; AVX512BW:       ## %bb.0:
1735 ; AVX512BW-NEXT:    vpsllw $15, %xmm0, %xmm0
1736 ; AVX512BW-NEXT:    vpmovw2m %zmm0, %k0
1737 ; AVX512BW-NEXT:    knotw %k0, %k0
1738 ; AVX512BW-NEXT:    kmovd %k0, %eax
1739 ; AVX512BW-NEXT:    movb %al, (%rdi)
1740 ; AVX512BW-NEXT:    vzeroupper
1741 ; AVX512BW-NEXT:    retq
1743 ; AVX512DQ-LABEL: store_v8i1:
1744 ; AVX512DQ:       ## %bb.0:
1745 ; AVX512DQ-NEXT:    vpmovsxwq %xmm0, %zmm0
1746 ; AVX512DQ-NEXT:    vpsllq $63, %zmm0, %zmm0
1747 ; AVX512DQ-NEXT:    vpmovq2m %zmm0, %k0
1748 ; AVX512DQ-NEXT:    knotb %k0, %k0
1749 ; AVX512DQ-NEXT:    kmovb %k0, (%rdi)
1750 ; AVX512DQ-NEXT:    vzeroupper
1751 ; AVX512DQ-NEXT:    retq
1753 ; X86-LABEL: store_v8i1:
1754 ; X86:       ## %bb.0:
1755 ; X86-NEXT:    vpsllw $15, %xmm0, %xmm0
1756 ; X86-NEXT:    vpmovw2m %xmm0, %k0
1757 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1758 ; X86-NEXT:    knotb %k0, %k0
1759 ; X86-NEXT:    kmovb %k0, (%eax)
1760 ; X86-NEXT:    retl
1761   %x = xor <8 x i1> %c, <i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1>
1762   store <8 x i1> %x, <8 x i1>*  %ptr, align 4
1763   ret void
1766 define void @store_v16i1(<16 x i1> %c , <16 x i1>* %ptr) {
1767 ; KNL-LABEL: store_v16i1:
1768 ; KNL:       ## %bb.0:
1769 ; KNL-NEXT:    vpmovsxbd %xmm0, %zmm0
1770 ; KNL-NEXT:    vpslld $31, %zmm0, %zmm0
1771 ; KNL-NEXT:    vptestnmd %zmm0, %zmm0, %k0
1772 ; KNL-NEXT:    kmovw %k0, (%rdi)
1773 ; KNL-NEXT:    vzeroupper
1774 ; KNL-NEXT:    retq
1776 ; SKX-LABEL: store_v16i1:
1777 ; SKX:       ## %bb.0:
1778 ; SKX-NEXT:    vpsllw $7, %xmm0, %xmm0
1779 ; SKX-NEXT:    vpmovb2m %xmm0, %k0
1780 ; SKX-NEXT:    knotw %k0, %k0
1781 ; SKX-NEXT:    kmovw %k0, (%rdi)
1782 ; SKX-NEXT:    retq
1784 ; AVX512BW-LABEL: store_v16i1:
1785 ; AVX512BW:       ## %bb.0:
1786 ; AVX512BW-NEXT:    vpsllw $7, %xmm0, %xmm0
1787 ; AVX512BW-NEXT:    vpmovb2m %zmm0, %k0
1788 ; AVX512BW-NEXT:    knotw %k0, %k0
1789 ; AVX512BW-NEXT:    kmovw %k0, (%rdi)
1790 ; AVX512BW-NEXT:    vzeroupper
1791 ; AVX512BW-NEXT:    retq
1793 ; AVX512DQ-LABEL: store_v16i1:
1794 ; AVX512DQ:       ## %bb.0:
1795 ; AVX512DQ-NEXT:    vpmovsxbd %xmm0, %zmm0
1796 ; AVX512DQ-NEXT:    vpslld $31, %zmm0, %zmm0
1797 ; AVX512DQ-NEXT:    vpmovd2m %zmm0, %k0
1798 ; AVX512DQ-NEXT:    knotw %k0, %k0
1799 ; AVX512DQ-NEXT:    kmovw %k0, (%rdi)
1800 ; AVX512DQ-NEXT:    vzeroupper
1801 ; AVX512DQ-NEXT:    retq
1803 ; X86-LABEL: store_v16i1:
1804 ; X86:       ## %bb.0:
1805 ; X86-NEXT:    vpsllw $7, %xmm0, %xmm0
1806 ; X86-NEXT:    vpmovb2m %xmm0, %k0
1807 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1808 ; X86-NEXT:    knotw %k0, %k0
1809 ; X86-NEXT:    kmovw %k0, (%eax)
1810 ; X86-NEXT:    retl
1811   %x = xor <16 x i1> %c, <i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1>
1812   store <16 x i1> %x, <16 x i1>*  %ptr, align 4
1813   ret void
1816 ;void f2(int);
1817 ;void f1(int c)
1819 ;  static int v = 0;
1820 ;  if (v == 0)
1821 ;    v = 1;
1822 ;  else
1823 ;    v = 0;
1824 ;  f2(v);
1827 @f1.v = internal unnamed_addr global i1 false, align 4
1829 define void @f1(i32 %c) {
1830 ; CHECK-LABEL: f1:
1831 ; CHECK:       ## %bb.0: ## %entry
1832 ; CHECK-NEXT:    movzbl {{.*}}(%rip), %edi
1833 ; CHECK-NEXT:    xorl $1, %edi
1834 ; CHECK-NEXT:    movb %dil, {{.*}}(%rip)
1835 ; CHECK-NEXT:    jmp _f2 ## TAILCALL
1837 ; X86-LABEL: f1:
1838 ; X86:       ## %bb.0: ## %entry
1839 ; X86-NEXT:    subl $12, %esp
1840 ; X86-NEXT:    .cfi_def_cfa_offset 16
1841 ; X86-NEXT:    movzbl _f1.v, %eax
1842 ; X86-NEXT:    xorl $1, %eax
1843 ; X86-NEXT:    movb %al, _f1.v
1844 ; X86-NEXT:    movl %eax, (%esp)
1845 ; X86-NEXT:    calll _f2
1846 ; X86-NEXT:    addl $12, %esp
1847 ; X86-NEXT:    retl
1848 entry:
1849   %.b1 = load i1, i1* @f1.v, align 4
1850   %not..b1 = xor i1 %.b1, true
1851   store i1 %not..b1, i1* @f1.v, align 4
1852   %0 = zext i1 %not..b1 to i32
1853   tail call void @f2(i32 %0) #2
1854   ret void
1857 declare void @f2(i32) #1
1859 define void @store_i16_i1(i16 %x, i1 *%y) {
1860 ; CHECK-LABEL: store_i16_i1:
1861 ; CHECK:       ## %bb.0:
1862 ; CHECK-NEXT:    andl $1, %edi
1863 ; CHECK-NEXT:    movb %dil, (%rsi)
1864 ; CHECK-NEXT:    retq
1866 ; X86-LABEL: store_i16_i1:
1867 ; X86:       ## %bb.0:
1868 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1869 ; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %ecx
1870 ; X86-NEXT:    andl $1, %ecx
1871 ; X86-NEXT:    movb %cl, (%eax)
1872 ; X86-NEXT:    retl
1873   %c = trunc i16 %x to i1
1874   store i1 %c, i1* %y
1875   ret void
1878 define void @store_i8_i1(i8 %x, i1 *%y) {
1879 ; CHECK-LABEL: store_i8_i1:
1880 ; CHECK:       ## %bb.0:
1881 ; CHECK-NEXT:    andl $1, %edi
1882 ; CHECK-NEXT:    movb %dil, (%rsi)
1883 ; CHECK-NEXT:    retq
1885 ; X86-LABEL: store_i8_i1:
1886 ; X86:       ## %bb.0:
1887 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1888 ; X86-NEXT:    movb {{[0-9]+}}(%esp), %cl
1889 ; X86-NEXT:    andb $1, %cl
1890 ; X86-NEXT:    movb %cl, (%eax)
1891 ; X86-NEXT:    retl
1892   %c = trunc i8 %x to i1
1893   store i1 %c, i1* %y
1894   ret void
1897 define <32 x i16> @test_build_vec_v32i1(<32 x i16> %x) {
1898 ; KNL-LABEL: test_build_vec_v32i1:
1899 ; KNL:       ## %bb.0:
1900 ; KNL-NEXT:    vextractf64x4 $1, %zmm0, %ymm1
1901 ; KNL-NEXT:    vandps {{.*}}(%rip), %ymm1, %ymm1
1902 ; KNL-NEXT:    vandps {{.*}}(%rip), %ymm0, %ymm0
1903 ; KNL-NEXT:    vinsertf64x4 $1, %ymm1, %zmm0, %zmm0
1904 ; KNL-NEXT:    retq
1906 ; SKX-LABEL: test_build_vec_v32i1:
1907 ; SKX:       ## %bb.0:
1908 ; SKX-NEXT:    vandps {{.*}}(%rip), %zmm0, %zmm0
1909 ; SKX-NEXT:    retq
1911 ; AVX512BW-LABEL: test_build_vec_v32i1:
1912 ; AVX512BW:       ## %bb.0:
1913 ; AVX512BW-NEXT:    vpandq {{.*}}(%rip), %zmm0, %zmm0
1914 ; AVX512BW-NEXT:    retq
1916 ; AVX512DQ-LABEL: test_build_vec_v32i1:
1917 ; AVX512DQ:       ## %bb.0:
1918 ; AVX512DQ-NEXT:    vextractf64x4 $1, %zmm0, %ymm1
1919 ; AVX512DQ-NEXT:    vandps {{.*}}(%rip), %ymm1, %ymm1
1920 ; AVX512DQ-NEXT:    vandps {{.*}}(%rip), %ymm0, %ymm0
1921 ; AVX512DQ-NEXT:    vinsertf64x4 $1, %ymm1, %zmm0, %zmm0
1922 ; AVX512DQ-NEXT:    retq
1924 ; X86-LABEL: test_build_vec_v32i1:
1925 ; X86:       ## %bb.0:
1926 ; X86-NEXT:    vandps LCPI40_0, %zmm0, %zmm0
1927 ; X86-NEXT:    retl
1928   %ret = select <32 x i1> <i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 false, i1 true, i1 false, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 false, i1 false, i1 true, i1 false, i1 true, i1 false, i1 false, i1 true, i1 true, i1 false, i1 true, i1 false>, <32 x i16> %x, <32 x i16> zeroinitializer
1929   ret <32 x i16> %ret
1932 define <32 x i16> @test_build_vec_v32i1_optsize(<32 x i16> %x) optsize {
1933 ; KNL-LABEL: test_build_vec_v32i1_optsize:
1934 ; KNL:       ## %bb.0:
1935 ; KNL-NEXT:    vextractf64x4 $1, %zmm0, %ymm1
1936 ; KNL-NEXT:    vandps {{.*}}(%rip), %ymm1, %ymm1
1937 ; KNL-NEXT:    vandps {{.*}}(%rip), %ymm0, %ymm0
1938 ; KNL-NEXT:    vinsertf64x4 $1, %ymm1, %zmm0, %zmm0
1939 ; KNL-NEXT:    retq
1941 ; SKX-LABEL: test_build_vec_v32i1_optsize:
1942 ; SKX:       ## %bb.0:
1943 ; SKX-NEXT:    movl $1497715861, %eax ## imm = 0x59455495
1944 ; SKX-NEXT:    kmovd %eax, %k1
1945 ; SKX-NEXT:    vmovdqu16 %zmm0, %zmm0 {%k1} {z}
1946 ; SKX-NEXT:    retq
1948 ; AVX512BW-LABEL: test_build_vec_v32i1_optsize:
1949 ; AVX512BW:       ## %bb.0:
1950 ; AVX512BW-NEXT:    movl $1497715861, %eax ## imm = 0x59455495
1951 ; AVX512BW-NEXT:    kmovd %eax, %k1
1952 ; AVX512BW-NEXT:    vmovdqu16 %zmm0, %zmm0 {%k1} {z}
1953 ; AVX512BW-NEXT:    retq
1955 ; AVX512DQ-LABEL: test_build_vec_v32i1_optsize:
1956 ; AVX512DQ:       ## %bb.0:
1957 ; AVX512DQ-NEXT:    vextractf64x4 $1, %zmm0, %ymm1
1958 ; AVX512DQ-NEXT:    vandps {{.*}}(%rip), %ymm1, %ymm1
1959 ; AVX512DQ-NEXT:    vandps {{.*}}(%rip), %ymm0, %ymm0
1960 ; AVX512DQ-NEXT:    vinsertf64x4 $1, %ymm1, %zmm0, %zmm0
1961 ; AVX512DQ-NEXT:    retq
1963 ; X86-LABEL: test_build_vec_v32i1_optsize:
1964 ; X86:       ## %bb.0:
1965 ; X86-NEXT:    movl $1497715861, %eax ## imm = 0x59455495
1966 ; X86-NEXT:    kmovd %eax, %k1
1967 ; X86-NEXT:    vmovdqu16 %zmm0, %zmm0 {%k1} {z}
1968 ; X86-NEXT:    retl
1969   %ret = select <32 x i1> <i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 false, i1 true, i1 false, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 false, i1 false, i1 true, i1 false, i1 true, i1 false, i1 false, i1 true, i1 true, i1 false, i1 true, i1 false>, <32 x i16> %x, <32 x i16> zeroinitializer
1970   ret <32 x i16> %ret
1973 define <64 x i8> @test_build_vec_v64i1(<64 x i8> %x) {
1974 ; KNL-LABEL: test_build_vec_v64i1:
1975 ; KNL:       ## %bb.0:
1976 ; KNL-NEXT:    vextractf64x4 $1, %zmm0, %ymm1
1977 ; KNL-NEXT:    vandps {{.*}}(%rip), %ymm1, %ymm1
1978 ; KNL-NEXT:    vandps {{.*}}(%rip), %ymm0, %ymm0
1979 ; KNL-NEXT:    vinsertf64x4 $1, %ymm1, %zmm0, %zmm0
1980 ; KNL-NEXT:    retq
1982 ; SKX-LABEL: test_build_vec_v64i1:
1983 ; SKX:       ## %bb.0:
1984 ; SKX-NEXT:    vpshufb {{.*#+}} zmm0 = zero,zero,zmm0[2],zero,zero,zero,zmm0[6],zero,zmm0[8],zero,zmm0[10],zero,zmm0[12],zero,zero,zmm0[15],zero,zero,zmm0[18],zero,zmm0[20],zero,zmm0[22],zero,zmm0[24],zero,zero,zmm0[27],zero,zero,zmm0[30],zero,zmm0[32],zero,zmm0[34],zero,zero,zero,zmm0[38],zero,zmm0[40],zero,zero,zmm0[43,44],zero,zmm0[46],zero,zmm0[48],zero,zmm0[50],zero,zero,zero,zmm0[54],zero,zmm0[56],zero,zero,zmm0[59,60],zero,zmm0[62],zero
1985 ; SKX-NEXT:    retq
1987 ; AVX512BW-LABEL: test_build_vec_v64i1:
1988 ; AVX512BW:       ## %bb.0:
1989 ; AVX512BW-NEXT:    vpshufb {{.*#+}} zmm0 = zero,zero,zmm0[2],zero,zero,zero,zmm0[6],zero,zmm0[8],zero,zmm0[10],zero,zmm0[12],zero,zero,zmm0[15],zero,zero,zmm0[18],zero,zmm0[20],zero,zmm0[22],zero,zmm0[24],zero,zero,zmm0[27],zero,zero,zmm0[30],zero,zmm0[32],zero,zmm0[34],zero,zero,zero,zmm0[38],zero,zmm0[40],zero,zero,zmm0[43,44],zero,zmm0[46],zero,zmm0[48],zero,zmm0[50],zero,zero,zero,zmm0[54],zero,zmm0[56],zero,zero,zmm0[59,60],zero,zmm0[62],zero
1990 ; AVX512BW-NEXT:    retq
1992 ; AVX512DQ-LABEL: test_build_vec_v64i1:
1993 ; AVX512DQ:       ## %bb.0:
1994 ; AVX512DQ-NEXT:    vextractf64x4 $1, %zmm0, %ymm1
1995 ; AVX512DQ-NEXT:    vandps {{.*}}(%rip), %ymm1, %ymm1
1996 ; AVX512DQ-NEXT:    vandps {{.*}}(%rip), %ymm0, %ymm0
1997 ; AVX512DQ-NEXT:    vinsertf64x4 $1, %ymm1, %zmm0, %zmm0
1998 ; AVX512DQ-NEXT:    retq
2000 ; X86-LABEL: test_build_vec_v64i1:
2001 ; X86:       ## %bb.0:
2002 ; X86-NEXT:    vpshufb {{.*#+}} zmm0 = zero,zero,zmm0[2],zero,zero,zero,zmm0[6],zero,zmm0[8],zero,zmm0[10],zero,zmm0[12],zero,zero,zmm0[15],zero,zero,zmm0[18],zero,zmm0[20],zero,zmm0[22],zero,zmm0[24],zero,zero,zmm0[27],zero,zero,zmm0[30],zero,zmm0[32],zero,zmm0[34],zero,zero,zero,zmm0[38],zero,zmm0[40],zero,zero,zmm0[43,44],zero,zmm0[46],zero,zmm0[48],zero,zmm0[50],zero,zero,zero,zmm0[54],zero,zmm0[56],zero,zero,zmm0[59,60],zero,zmm0[62],zero
2003 ; X86-NEXT:    retl
2004   %ret = select <64 x i1> <i1 false, i1 false, i1 true, i1 false, i1 false, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 false, i1 true, i1 false, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 false, i1 true, i1 false, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 false, i1 false, i1 true, i1 false, i1 true, i1 false, i1 false, i1 true, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 false, i1 false, i1 true, i1 false, i1 true, i1 false, i1 false, i1 true, i1 true, i1 false, i1 true, i1 false>, <64 x i8> %x, <64 x i8> zeroinitializer
2005   ret <64 x i8> %ret
2008 define void @ktest_1(<8 x double> %in, double * %base) {
2009 ; KNL-LABEL: ktest_1:
2010 ; KNL:       ## %bb.0:
2011 ; KNL-NEXT:    vcmpgtpd (%rdi), %zmm0, %k1
2012 ; KNL-NEXT:    vmovupd 8(%rdi), %zmm1 {%k1} {z}
2013 ; KNL-NEXT:    vcmpltpd %zmm1, %zmm0, %k0 {%k1}
2014 ; KNL-NEXT:    kmovw %k0, %eax
2015 ; KNL-NEXT:    testb %al, %al
2016 ; KNL-NEXT:    je LBB43_2
2017 ; KNL-NEXT:  ## %bb.1: ## %L1
2018 ; KNL-NEXT:    vmovapd %zmm0, (%rdi)
2019 ; KNL-NEXT:    vzeroupper
2020 ; KNL-NEXT:    retq
2021 ; KNL-NEXT:  LBB43_2: ## %L2
2022 ; KNL-NEXT:    vmovapd %zmm0, 8(%rdi)
2023 ; KNL-NEXT:    vzeroupper
2024 ; KNL-NEXT:    retq
2026 ; SKX-LABEL: ktest_1:
2027 ; SKX:       ## %bb.0:
2028 ; SKX-NEXT:    vcmpgtpd (%rdi), %zmm0, %k1
2029 ; SKX-NEXT:    vmovupd 8(%rdi), %zmm1 {%k1} {z}
2030 ; SKX-NEXT:    vcmpltpd %zmm1, %zmm0, %k0
2031 ; SKX-NEXT:    ktestb %k0, %k1
2032 ; SKX-NEXT:    je LBB43_2
2033 ; SKX-NEXT:  ## %bb.1: ## %L1
2034 ; SKX-NEXT:    vmovapd %zmm0, (%rdi)
2035 ; SKX-NEXT:    vzeroupper
2036 ; SKX-NEXT:    retq
2037 ; SKX-NEXT:  LBB43_2: ## %L2
2038 ; SKX-NEXT:    vmovapd %zmm0, 8(%rdi)
2039 ; SKX-NEXT:    vzeroupper
2040 ; SKX-NEXT:    retq
2042 ; AVX512BW-LABEL: ktest_1:
2043 ; AVX512BW:       ## %bb.0:
2044 ; AVX512BW-NEXT:    vcmpgtpd (%rdi), %zmm0, %k1
2045 ; AVX512BW-NEXT:    vmovupd 8(%rdi), %zmm1 {%k1} {z}
2046 ; AVX512BW-NEXT:    vcmpltpd %zmm1, %zmm0, %k0 {%k1}
2047 ; AVX512BW-NEXT:    kmovd %k0, %eax
2048 ; AVX512BW-NEXT:    testb %al, %al
2049 ; AVX512BW-NEXT:    je LBB43_2
2050 ; AVX512BW-NEXT:  ## %bb.1: ## %L1
2051 ; AVX512BW-NEXT:    vmovapd %zmm0, (%rdi)
2052 ; AVX512BW-NEXT:    vzeroupper
2053 ; AVX512BW-NEXT:    retq
2054 ; AVX512BW-NEXT:  LBB43_2: ## %L2
2055 ; AVX512BW-NEXT:    vmovapd %zmm0, 8(%rdi)
2056 ; AVX512BW-NEXT:    vzeroupper
2057 ; AVX512BW-NEXT:    retq
2059 ; AVX512DQ-LABEL: ktest_1:
2060 ; AVX512DQ:       ## %bb.0:
2061 ; AVX512DQ-NEXT:    vcmpgtpd (%rdi), %zmm0, %k1
2062 ; AVX512DQ-NEXT:    vmovupd 8(%rdi), %zmm1 {%k1} {z}
2063 ; AVX512DQ-NEXT:    vcmpltpd %zmm1, %zmm0, %k0
2064 ; AVX512DQ-NEXT:    ktestb %k0, %k1
2065 ; AVX512DQ-NEXT:    je LBB43_2
2066 ; AVX512DQ-NEXT:  ## %bb.1: ## %L1
2067 ; AVX512DQ-NEXT:    vmovapd %zmm0, (%rdi)
2068 ; AVX512DQ-NEXT:    vzeroupper
2069 ; AVX512DQ-NEXT:    retq
2070 ; AVX512DQ-NEXT:  LBB43_2: ## %L2
2071 ; AVX512DQ-NEXT:    vmovapd %zmm0, 8(%rdi)
2072 ; AVX512DQ-NEXT:    vzeroupper
2073 ; AVX512DQ-NEXT:    retq
2075 ; X86-LABEL: ktest_1:
2076 ; X86:       ## %bb.0:
2077 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
2078 ; X86-NEXT:    vcmpgtpd (%eax), %zmm0, %k1
2079 ; X86-NEXT:    vmovupd 8(%eax), %zmm1 {%k1} {z}
2080 ; X86-NEXT:    vcmpltpd %zmm1, %zmm0, %k0
2081 ; X86-NEXT:    ktestb %k0, %k1
2082 ; X86-NEXT:    je LBB43_2
2083 ; X86-NEXT:  ## %bb.1: ## %L1
2084 ; X86-NEXT:    vmovapd %zmm0, (%eax)
2085 ; X86-NEXT:    vzeroupper
2086 ; X86-NEXT:    retl
2087 ; X86-NEXT:  LBB43_2: ## %L2
2088 ; X86-NEXT:    vmovapd %zmm0, 8(%eax)
2089 ; X86-NEXT:    vzeroupper
2090 ; X86-NEXT:    retl
2091   %addr1 = getelementptr double, double * %base, i64 0
2092   %addr2 = getelementptr double, double * %base, i64 1
2094   %vaddr1 = bitcast double* %addr1 to <8 x double>*
2095   %vaddr2 = bitcast double* %addr2 to <8 x double>*
2097   %val1 = load <8 x double>, <8 x double> *%vaddr1, align 1
2098   %val2 = load <8 x double>, <8 x double> *%vaddr2, align 1
2100   %sel1 = fcmp ogt <8 x double>%in, %val1
2101   %val3 = select <8 x i1> %sel1, <8 x double> %val2, <8 x double> zeroinitializer
2102   %sel2 = fcmp olt <8 x double> %in, %val3
2103   %sel3 = and <8 x i1> %sel1, %sel2
2105   %int_sel3 = bitcast <8 x i1> %sel3 to i8
2106   %res = icmp eq i8 %int_sel3, zeroinitializer
2107   br i1 %res, label %L2, label %L1
2109   store <8 x double> %in, <8 x double>* %vaddr1
2110   br label %End
2112   store <8 x double> %in, <8 x double>* %vaddr2
2113   br label %End
2114 End:
2115   ret void
2118 define void @ktest_2(<32 x float> %in, float * %base) {
2120 ; KNL-LABEL: ktest_2:
2121 ; KNL:       ## %bb.0:
2122 ; KNL-NEXT:    vcmpgtps 64(%rdi), %zmm1, %k1
2123 ; KNL-NEXT:    vcmpgtps (%rdi), %zmm0, %k2
2124 ; KNL-NEXT:    vmovups 4(%rdi), %zmm2 {%k2} {z}
2125 ; KNL-NEXT:    vmovups 68(%rdi), %zmm3 {%k1} {z}
2126 ; KNL-NEXT:    vcmpltps %zmm3, %zmm1, %k0
2127 ; KNL-NEXT:    vcmpltps %zmm2, %zmm0, %k3
2128 ; KNL-NEXT:    korw %k3, %k2, %k2
2129 ; KNL-NEXT:    kmovw %k2, %eax
2130 ; KNL-NEXT:    korw %k0, %k1, %k0
2131 ; KNL-NEXT:    kmovw %k0, %ecx
2132 ; KNL-NEXT:    shll $16, %ecx
2133 ; KNL-NEXT:    orl %eax, %ecx
2134 ; KNL-NEXT:    je LBB44_2
2135 ; KNL-NEXT:  ## %bb.1: ## %L1
2136 ; KNL-NEXT:    vmovaps %zmm0, (%rdi)
2137 ; KNL-NEXT:    vmovaps %zmm1, 64(%rdi)
2138 ; KNL-NEXT:    vzeroupper
2139 ; KNL-NEXT:    retq
2140 ; KNL-NEXT:  LBB44_2: ## %L2
2141 ; KNL-NEXT:    vmovaps %zmm0, 4(%rdi)
2142 ; KNL-NEXT:    vmovaps %zmm1, 68(%rdi)
2143 ; KNL-NEXT:    vzeroupper
2144 ; KNL-NEXT:    retq
2146 ; SKX-LABEL: ktest_2:
2147 ; SKX:       ## %bb.0:
2148 ; SKX-NEXT:    vcmpgtps (%rdi), %zmm0, %k1
2149 ; SKX-NEXT:    vcmpgtps 64(%rdi), %zmm1, %k2
2150 ; SKX-NEXT:    kunpckwd %k1, %k2, %k0
2151 ; SKX-NEXT:    vmovups 68(%rdi), %zmm2 {%k2} {z}
2152 ; SKX-NEXT:    vmovups 4(%rdi), %zmm3 {%k1} {z}
2153 ; SKX-NEXT:    vcmpltps %zmm3, %zmm0, %k1
2154 ; SKX-NEXT:    vcmpltps %zmm2, %zmm1, %k2
2155 ; SKX-NEXT:    kunpckwd %k1, %k2, %k1
2156 ; SKX-NEXT:    kortestd %k1, %k0
2157 ; SKX-NEXT:    je LBB44_2
2158 ; SKX-NEXT:  ## %bb.1: ## %L1
2159 ; SKX-NEXT:    vmovaps %zmm0, (%rdi)
2160 ; SKX-NEXT:    vmovaps %zmm1, 64(%rdi)
2161 ; SKX-NEXT:    vzeroupper
2162 ; SKX-NEXT:    retq
2163 ; SKX-NEXT:  LBB44_2: ## %L2
2164 ; SKX-NEXT:    vmovaps %zmm0, 4(%rdi)
2165 ; SKX-NEXT:    vmovaps %zmm1, 68(%rdi)
2166 ; SKX-NEXT:    vzeroupper
2167 ; SKX-NEXT:    retq
2169 ; AVX512BW-LABEL: ktest_2:
2170 ; AVX512BW:       ## %bb.0:
2171 ; AVX512BW-NEXT:    vcmpgtps (%rdi), %zmm0, %k1
2172 ; AVX512BW-NEXT:    vcmpgtps 64(%rdi), %zmm1, %k2
2173 ; AVX512BW-NEXT:    kunpckwd %k1, %k2, %k0
2174 ; AVX512BW-NEXT:    vmovups 68(%rdi), %zmm2 {%k2} {z}
2175 ; AVX512BW-NEXT:    vmovups 4(%rdi), %zmm3 {%k1} {z}
2176 ; AVX512BW-NEXT:    vcmpltps %zmm3, %zmm0, %k1
2177 ; AVX512BW-NEXT:    vcmpltps %zmm2, %zmm1, %k2
2178 ; AVX512BW-NEXT:    kunpckwd %k1, %k2, %k1
2179 ; AVX512BW-NEXT:    kortestd %k1, %k0
2180 ; AVX512BW-NEXT:    je LBB44_2
2181 ; AVX512BW-NEXT:  ## %bb.1: ## %L1
2182 ; AVX512BW-NEXT:    vmovaps %zmm0, (%rdi)
2183 ; AVX512BW-NEXT:    vmovaps %zmm1, 64(%rdi)
2184 ; AVX512BW-NEXT:    vzeroupper
2185 ; AVX512BW-NEXT:    retq
2186 ; AVX512BW-NEXT:  LBB44_2: ## %L2
2187 ; AVX512BW-NEXT:    vmovaps %zmm0, 4(%rdi)
2188 ; AVX512BW-NEXT:    vmovaps %zmm1, 68(%rdi)
2189 ; AVX512BW-NEXT:    vzeroupper
2190 ; AVX512BW-NEXT:    retq
2192 ; AVX512DQ-LABEL: ktest_2:
2193 ; AVX512DQ:       ## %bb.0:
2194 ; AVX512DQ-NEXT:    vcmpgtps 64(%rdi), %zmm1, %k1
2195 ; AVX512DQ-NEXT:    vcmpgtps (%rdi), %zmm0, %k2
2196 ; AVX512DQ-NEXT:    vmovups 4(%rdi), %zmm2 {%k2} {z}
2197 ; AVX512DQ-NEXT:    vmovups 68(%rdi), %zmm3 {%k1} {z}
2198 ; AVX512DQ-NEXT:    vcmpltps %zmm3, %zmm1, %k0
2199 ; AVX512DQ-NEXT:    vcmpltps %zmm2, %zmm0, %k3
2200 ; AVX512DQ-NEXT:    korw %k3, %k2, %k2
2201 ; AVX512DQ-NEXT:    kmovw %k2, %eax
2202 ; AVX512DQ-NEXT:    korw %k0, %k1, %k0
2203 ; AVX512DQ-NEXT:    kmovw %k0, %ecx
2204 ; AVX512DQ-NEXT:    shll $16, %ecx
2205 ; AVX512DQ-NEXT:    orl %eax, %ecx
2206 ; AVX512DQ-NEXT:    je LBB44_2
2207 ; AVX512DQ-NEXT:  ## %bb.1: ## %L1
2208 ; AVX512DQ-NEXT:    vmovaps %zmm0, (%rdi)
2209 ; AVX512DQ-NEXT:    vmovaps %zmm1, 64(%rdi)
2210 ; AVX512DQ-NEXT:    vzeroupper
2211 ; AVX512DQ-NEXT:    retq
2212 ; AVX512DQ-NEXT:  LBB44_2: ## %L2
2213 ; AVX512DQ-NEXT:    vmovaps %zmm0, 4(%rdi)
2214 ; AVX512DQ-NEXT:    vmovaps %zmm1, 68(%rdi)
2215 ; AVX512DQ-NEXT:    vzeroupper
2216 ; AVX512DQ-NEXT:    retq
2218 ; X86-LABEL: ktest_2:
2219 ; X86:       ## %bb.0:
2220 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
2221 ; X86-NEXT:    vcmpgtps (%eax), %zmm0, %k1
2222 ; X86-NEXT:    vcmpgtps 64(%eax), %zmm1, %k2
2223 ; X86-NEXT:    kunpckwd %k1, %k2, %k0
2224 ; X86-NEXT:    vmovups 68(%eax), %zmm2 {%k2} {z}
2225 ; X86-NEXT:    vmovups 4(%eax), %zmm3 {%k1} {z}
2226 ; X86-NEXT:    vcmpltps %zmm3, %zmm0, %k1
2227 ; X86-NEXT:    vcmpltps %zmm2, %zmm1, %k2
2228 ; X86-NEXT:    kunpckwd %k1, %k2, %k1
2229 ; X86-NEXT:    kortestd %k1, %k0
2230 ; X86-NEXT:    je LBB44_2
2231 ; X86-NEXT:  ## %bb.1: ## %L1
2232 ; X86-NEXT:    vmovaps %zmm0, (%eax)
2233 ; X86-NEXT:    vmovaps %zmm1, 64(%eax)
2234 ; X86-NEXT:    vzeroupper
2235 ; X86-NEXT:    retl
2236 ; X86-NEXT:  LBB44_2: ## %L2
2237 ; X86-NEXT:    vmovaps %zmm0, 4(%eax)
2238 ; X86-NEXT:    vmovaps %zmm1, 68(%eax)
2239 ; X86-NEXT:    vzeroupper
2240 ; X86-NEXT:    retl
2241   %addr1 = getelementptr float, float * %base, i64 0
2242   %addr2 = getelementptr float, float * %base, i64 1
2244   %vaddr1 = bitcast float* %addr1 to <32 x float>*
2245   %vaddr2 = bitcast float* %addr2 to <32 x float>*
2247   %val1 = load <32 x float>, <32 x float> *%vaddr1, align 1
2248   %val2 = load <32 x float>, <32 x float> *%vaddr2, align 1
2250   %sel1 = fcmp ogt <32 x float>%in, %val1
2251   %val3 = select <32 x i1> %sel1, <32 x float> %val2, <32 x float> zeroinitializer
2252   %sel2 = fcmp olt <32 x float> %in, %val3
2253   %sel3 = or <32 x i1> %sel1, %sel2
2255   %int_sel3 = bitcast <32 x i1> %sel3 to i32
2256   %res = icmp eq i32 %int_sel3, zeroinitializer
2257   br i1 %res, label %L2, label %L1
2259   store <32 x float> %in, <32 x float>* %vaddr1
2260   br label %End
2262   store <32 x float> %in, <32 x float>* %vaddr2
2263   br label %End
2264 End:
2265   ret void
2268 define <8 x i64> @load_8i1(<8 x i1>* %a) {
2269 ; KNL-LABEL: load_8i1:
2270 ; KNL:       ## %bb.0:
2271 ; KNL-NEXT:    kmovw (%rdi), %k1
2272 ; KNL-NEXT:    vpternlogq $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
2273 ; KNL-NEXT:    retq
2275 ; SKX-LABEL: load_8i1:
2276 ; SKX:       ## %bb.0:
2277 ; SKX-NEXT:    kmovb (%rdi), %k0
2278 ; SKX-NEXT:    vpmovm2q %k0, %zmm0
2279 ; SKX-NEXT:    retq
2281 ; AVX512BW-LABEL: load_8i1:
2282 ; AVX512BW:       ## %bb.0:
2283 ; AVX512BW-NEXT:    kmovw (%rdi), %k1
2284 ; AVX512BW-NEXT:    vpternlogq $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
2285 ; AVX512BW-NEXT:    retq
2287 ; AVX512DQ-LABEL: load_8i1:
2288 ; AVX512DQ:       ## %bb.0:
2289 ; AVX512DQ-NEXT:    kmovb (%rdi), %k0
2290 ; AVX512DQ-NEXT:    vpmovm2q %k0, %zmm0
2291 ; AVX512DQ-NEXT:    retq
2293 ; X86-LABEL: load_8i1:
2294 ; X86:       ## %bb.0:
2295 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
2296 ; X86-NEXT:    kmovb (%eax), %k0
2297 ; X86-NEXT:    vpmovm2q %k0, %zmm0
2298 ; X86-NEXT:    retl
2299   %b = load <8 x i1>, <8 x i1>* %a
2300   %c = sext <8 x i1> %b to <8 x i64>
2301   ret <8 x i64> %c
2304 define <16 x i32> @load_16i1(<16 x i1>* %a) {
2305 ; KNL-LABEL: load_16i1:
2306 ; KNL:       ## %bb.0:
2307 ; KNL-NEXT:    kmovw (%rdi), %k1
2308 ; KNL-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
2309 ; KNL-NEXT:    retq
2311 ; SKX-LABEL: load_16i1:
2312 ; SKX:       ## %bb.0:
2313 ; SKX-NEXT:    kmovw (%rdi), %k0
2314 ; SKX-NEXT:    vpmovm2d %k0, %zmm0
2315 ; SKX-NEXT:    retq
2317 ; AVX512BW-LABEL: load_16i1:
2318 ; AVX512BW:       ## %bb.0:
2319 ; AVX512BW-NEXT:    kmovw (%rdi), %k1
2320 ; AVX512BW-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
2321 ; AVX512BW-NEXT:    retq
2323 ; AVX512DQ-LABEL: load_16i1:
2324 ; AVX512DQ:       ## %bb.0:
2325 ; AVX512DQ-NEXT:    kmovw (%rdi), %k0
2326 ; AVX512DQ-NEXT:    vpmovm2d %k0, %zmm0
2327 ; AVX512DQ-NEXT:    retq
2329 ; X86-LABEL: load_16i1:
2330 ; X86:       ## %bb.0:
2331 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
2332 ; X86-NEXT:    kmovw (%eax), %k0
2333 ; X86-NEXT:    vpmovm2d %k0, %zmm0
2334 ; X86-NEXT:    retl
2335   %b = load <16 x i1>, <16 x i1>* %a
2336   %c = sext <16 x i1> %b to <16 x i32>
2337   ret <16 x i32> %c
2340 define <2 x i16> @load_2i1(<2 x i1>* %a) {
2341 ; KNL-LABEL: load_2i1:
2342 ; KNL:       ## %bb.0:
2343 ; KNL-NEXT:    kmovw (%rdi), %k1
2344 ; KNL-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
2345 ; KNL-NEXT:    vpmovdw %zmm0, %ymm0
2346 ; KNL-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $ymm0
2347 ; KNL-NEXT:    vzeroupper
2348 ; KNL-NEXT:    retq
2350 ; SKX-LABEL: load_2i1:
2351 ; SKX:       ## %bb.0:
2352 ; SKX-NEXT:    kmovb (%rdi), %k0
2353 ; SKX-NEXT:    vpmovm2w %k0, %xmm0
2354 ; SKX-NEXT:    retq
2356 ; AVX512BW-LABEL: load_2i1:
2357 ; AVX512BW:       ## %bb.0:
2358 ; AVX512BW-NEXT:    kmovw (%rdi), %k0
2359 ; AVX512BW-NEXT:    vpmovm2w %k0, %zmm0
2360 ; AVX512BW-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $zmm0
2361 ; AVX512BW-NEXT:    vzeroupper
2362 ; AVX512BW-NEXT:    retq
2364 ; AVX512DQ-LABEL: load_2i1:
2365 ; AVX512DQ:       ## %bb.0:
2366 ; AVX512DQ-NEXT:    kmovb (%rdi), %k0
2367 ; AVX512DQ-NEXT:    vpmovm2d %k0, %zmm0
2368 ; AVX512DQ-NEXT:    vpmovdw %zmm0, %ymm0
2369 ; AVX512DQ-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $ymm0
2370 ; AVX512DQ-NEXT:    vzeroupper
2371 ; AVX512DQ-NEXT:    retq
2373 ; X86-LABEL: load_2i1:
2374 ; X86:       ## %bb.0:
2375 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
2376 ; X86-NEXT:    kmovb (%eax), %k0
2377 ; X86-NEXT:    vpmovm2w %k0, %xmm0
2378 ; X86-NEXT:    retl
2379   %b = load <2 x i1>, <2 x i1>* %a
2380   %c = sext <2 x i1> %b to <2 x i16>
2381   ret <2 x i16> %c
2384 define <4 x i16> @load_4i1(<4 x i1>* %a) {
2385 ; KNL-LABEL: load_4i1:
2386 ; KNL:       ## %bb.0:
2387 ; KNL-NEXT:    kmovw (%rdi), %k1
2388 ; KNL-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
2389 ; KNL-NEXT:    vpmovdw %zmm0, %ymm0
2390 ; KNL-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $ymm0
2391 ; KNL-NEXT:    vzeroupper
2392 ; KNL-NEXT:    retq
2394 ; SKX-LABEL: load_4i1:
2395 ; SKX:       ## %bb.0:
2396 ; SKX-NEXT:    kmovb (%rdi), %k0
2397 ; SKX-NEXT:    vpmovm2w %k0, %xmm0
2398 ; SKX-NEXT:    retq
2400 ; AVX512BW-LABEL: load_4i1:
2401 ; AVX512BW:       ## %bb.0:
2402 ; AVX512BW-NEXT:    kmovw (%rdi), %k0
2403 ; AVX512BW-NEXT:    vpmovm2w %k0, %zmm0
2404 ; AVX512BW-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $zmm0
2405 ; AVX512BW-NEXT:    vzeroupper
2406 ; AVX512BW-NEXT:    retq
2408 ; AVX512DQ-LABEL: load_4i1:
2409 ; AVX512DQ:       ## %bb.0:
2410 ; AVX512DQ-NEXT:    kmovb (%rdi), %k0
2411 ; AVX512DQ-NEXT:    vpmovm2d %k0, %zmm0
2412 ; AVX512DQ-NEXT:    vpmovdw %zmm0, %ymm0
2413 ; AVX512DQ-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $ymm0
2414 ; AVX512DQ-NEXT:    vzeroupper
2415 ; AVX512DQ-NEXT:    retq
2417 ; X86-LABEL: load_4i1:
2418 ; X86:       ## %bb.0:
2419 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
2420 ; X86-NEXT:    kmovb (%eax), %k0
2421 ; X86-NEXT:    vpmovm2w %k0, %xmm0
2422 ; X86-NEXT:    retl
2423   %b = load <4 x i1>, <4 x i1>* %a
2424   %c = sext <4 x i1> %b to <4 x i16>
2425   ret <4 x i16> %c
2428 define <32 x i16> @load_32i1(<32 x i1>* %a) {
2429 ; KNL-LABEL: load_32i1:
2430 ; KNL:       ## %bb.0:
2431 ; KNL-NEXT:    kmovw (%rdi), %k1
2432 ; KNL-NEXT:    kmovw 2(%rdi), %k2
2433 ; KNL-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k2} {z}
2434 ; KNL-NEXT:    vpmovdw %zmm0, %ymm0
2435 ; KNL-NEXT:    vpternlogd $255, %zmm1, %zmm1, %zmm1 {%k1} {z}
2436 ; KNL-NEXT:    vpmovdw %zmm1, %ymm1
2437 ; KNL-NEXT:    vinserti64x4 $1, %ymm0, %zmm1, %zmm0
2438 ; KNL-NEXT:    retq
2440 ; SKX-LABEL: load_32i1:
2441 ; SKX:       ## %bb.0:
2442 ; SKX-NEXT:    kmovd (%rdi), %k0
2443 ; SKX-NEXT:    vpmovm2w %k0, %zmm0
2444 ; SKX-NEXT:    retq
2446 ; AVX512BW-LABEL: load_32i1:
2447 ; AVX512BW:       ## %bb.0:
2448 ; AVX512BW-NEXT:    kmovd (%rdi), %k0
2449 ; AVX512BW-NEXT:    vpmovm2w %k0, %zmm0
2450 ; AVX512BW-NEXT:    retq
2452 ; AVX512DQ-LABEL: load_32i1:
2453 ; AVX512DQ:       ## %bb.0:
2454 ; AVX512DQ-NEXT:    kmovw (%rdi), %k0
2455 ; AVX512DQ-NEXT:    kmovw 2(%rdi), %k1
2456 ; AVX512DQ-NEXT:    vpmovm2d %k1, %zmm0
2457 ; AVX512DQ-NEXT:    vpmovdw %zmm0, %ymm0
2458 ; AVX512DQ-NEXT:    vpmovm2d %k0, %zmm1
2459 ; AVX512DQ-NEXT:    vpmovdw %zmm1, %ymm1
2460 ; AVX512DQ-NEXT:    vinserti64x4 $1, %ymm0, %zmm1, %zmm0
2461 ; AVX512DQ-NEXT:    retq
2463 ; X86-LABEL: load_32i1:
2464 ; X86:       ## %bb.0:
2465 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
2466 ; X86-NEXT:    kmovd (%eax), %k0
2467 ; X86-NEXT:    vpmovm2w %k0, %zmm0
2468 ; X86-NEXT:    retl
2469   %b = load <32 x i1>, <32 x i1>* %a
2470   %c = sext <32 x i1> %b to <32 x i16>
2471   ret <32 x i16> %c
2474 define <64 x i8> @load_64i1(<64 x i1>* %a) {
2475 ; KNL-LABEL: load_64i1:
2476 ; KNL:       ## %bb.0:
2477 ; KNL-NEXT:    kmovw (%rdi), %k1
2478 ; KNL-NEXT:    kmovw 2(%rdi), %k2
2479 ; KNL-NEXT:    kmovw 4(%rdi), %k3
2480 ; KNL-NEXT:    kmovw 6(%rdi), %k4
2481 ; KNL-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k3} {z}
2482 ; KNL-NEXT:    vpmovdb %zmm0, %xmm0
2483 ; KNL-NEXT:    vpternlogd $255, %zmm1, %zmm1, %zmm1 {%k4} {z}
2484 ; KNL-NEXT:    vpmovdb %zmm1, %xmm1
2485 ; KNL-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
2486 ; KNL-NEXT:    vpternlogd $255, %zmm1, %zmm1, %zmm1 {%k1} {z}
2487 ; KNL-NEXT:    vpmovdb %zmm1, %xmm1
2488 ; KNL-NEXT:    vpternlogd $255, %zmm2, %zmm2, %zmm2 {%k2} {z}
2489 ; KNL-NEXT:    vpmovdb %zmm2, %xmm2
2490 ; KNL-NEXT:    vinserti128 $1, %xmm2, %ymm1, %ymm1
2491 ; KNL-NEXT:    vinserti64x4 $1, %ymm0, %zmm1, %zmm0
2492 ; KNL-NEXT:    retq
2494 ; SKX-LABEL: load_64i1:
2495 ; SKX:       ## %bb.0:
2496 ; SKX-NEXT:    kmovq (%rdi), %k0
2497 ; SKX-NEXT:    vpmovm2b %k0, %zmm0
2498 ; SKX-NEXT:    retq
2500 ; AVX512BW-LABEL: load_64i1:
2501 ; AVX512BW:       ## %bb.0:
2502 ; AVX512BW-NEXT:    kmovq (%rdi), %k0
2503 ; AVX512BW-NEXT:    vpmovm2b %k0, %zmm0
2504 ; AVX512BW-NEXT:    retq
2506 ; AVX512DQ-LABEL: load_64i1:
2507 ; AVX512DQ:       ## %bb.0:
2508 ; AVX512DQ-NEXT:    kmovw (%rdi), %k0
2509 ; AVX512DQ-NEXT:    kmovw 2(%rdi), %k1
2510 ; AVX512DQ-NEXT:    kmovw 4(%rdi), %k2
2511 ; AVX512DQ-NEXT:    kmovw 6(%rdi), %k3
2512 ; AVX512DQ-NEXT:    vpmovm2d %k2, %zmm0
2513 ; AVX512DQ-NEXT:    vpmovdb %zmm0, %xmm0
2514 ; AVX512DQ-NEXT:    vpmovm2d %k3, %zmm1
2515 ; AVX512DQ-NEXT:    vpmovdb %zmm1, %xmm1
2516 ; AVX512DQ-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
2517 ; AVX512DQ-NEXT:    vpmovm2d %k0, %zmm1
2518 ; AVX512DQ-NEXT:    vpmovdb %zmm1, %xmm1
2519 ; AVX512DQ-NEXT:    vpmovm2d %k1, %zmm2
2520 ; AVX512DQ-NEXT:    vpmovdb %zmm2, %xmm2
2521 ; AVX512DQ-NEXT:    vinserti128 $1, %xmm2, %ymm1, %ymm1
2522 ; AVX512DQ-NEXT:    vinserti64x4 $1, %ymm0, %zmm1, %zmm0
2523 ; AVX512DQ-NEXT:    retq
2525 ; X86-LABEL: load_64i1:
2526 ; X86:       ## %bb.0:
2527 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
2528 ; X86-NEXT:    kmovq (%eax), %k0
2529 ; X86-NEXT:    vpmovm2b %k0, %zmm0
2530 ; X86-NEXT:    retl
2531   %b = load <64 x i1>, <64 x i1>* %a
2532   %c = sext <64 x i1> %b to <64 x i8>
2533   ret <64 x i8> %c
2536 define void @store_8i1(<8 x i1>* %a, <8 x i1> %v) {
2537 ; KNL-LABEL: store_8i1:
2538 ; KNL:       ## %bb.0:
2539 ; KNL-NEXT:    vpmovsxwq %xmm0, %zmm0
2540 ; KNL-NEXT:    vpsllq $63, %zmm0, %zmm0
2541 ; KNL-NEXT:    vptestmq %zmm0, %zmm0, %k0
2542 ; KNL-NEXT:    kmovw %k0, %eax
2543 ; KNL-NEXT:    movb %al, (%rdi)
2544 ; KNL-NEXT:    vzeroupper
2545 ; KNL-NEXT:    retq
2547 ; SKX-LABEL: store_8i1:
2548 ; SKX:       ## %bb.0:
2549 ; SKX-NEXT:    vpsllw $15, %xmm0, %xmm0
2550 ; SKX-NEXT:    vpmovw2m %xmm0, %k0
2551 ; SKX-NEXT:    kmovb %k0, (%rdi)
2552 ; SKX-NEXT:    retq
2554 ; AVX512BW-LABEL: store_8i1:
2555 ; AVX512BW:       ## %bb.0:
2556 ; AVX512BW-NEXT:    vpsllw $15, %xmm0, %xmm0
2557 ; AVX512BW-NEXT:    vpmovw2m %zmm0, %k0
2558 ; AVX512BW-NEXT:    kmovd %k0, %eax
2559 ; AVX512BW-NEXT:    movb %al, (%rdi)
2560 ; AVX512BW-NEXT:    vzeroupper
2561 ; AVX512BW-NEXT:    retq
2563 ; AVX512DQ-LABEL: store_8i1:
2564 ; AVX512DQ:       ## %bb.0:
2565 ; AVX512DQ-NEXT:    vpmovsxwq %xmm0, %zmm0
2566 ; AVX512DQ-NEXT:    vpsllq $63, %zmm0, %zmm0
2567 ; AVX512DQ-NEXT:    vpmovq2m %zmm0, %k0
2568 ; AVX512DQ-NEXT:    kmovb %k0, (%rdi)
2569 ; AVX512DQ-NEXT:    vzeroupper
2570 ; AVX512DQ-NEXT:    retq
2572 ; X86-LABEL: store_8i1:
2573 ; X86:       ## %bb.0:
2574 ; X86-NEXT:    vpsllw $15, %xmm0, %xmm0
2575 ; X86-NEXT:    vpmovw2m %xmm0, %k0
2576 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
2577 ; X86-NEXT:    kmovb %k0, (%eax)
2578 ; X86-NEXT:    retl
2579   store <8 x i1> %v, <8 x i1>* %a
2580   ret void
2583 define void @store_8i1_1(<8 x i1>* %a, <8 x i16> %v) {
2584 ; KNL-LABEL: store_8i1_1:
2585 ; KNL:       ## %bb.0:
2586 ; KNL-NEXT:    vpmovsxwq %xmm0, %zmm0
2587 ; KNL-NEXT:    vpsllq $63, %zmm0, %zmm0
2588 ; KNL-NEXT:    vptestmq %zmm0, %zmm0, %k0
2589 ; KNL-NEXT:    kmovw %k0, %eax
2590 ; KNL-NEXT:    movb %al, (%rdi)
2591 ; KNL-NEXT:    vzeroupper
2592 ; KNL-NEXT:    retq
2594 ; SKX-LABEL: store_8i1_1:
2595 ; SKX:       ## %bb.0:
2596 ; SKX-NEXT:    vpsllw $15, %xmm0, %xmm0
2597 ; SKX-NEXT:    vpmovw2m %xmm0, %k0
2598 ; SKX-NEXT:    kmovb %k0, (%rdi)
2599 ; SKX-NEXT:    retq
2601 ; AVX512BW-LABEL: store_8i1_1:
2602 ; AVX512BW:       ## %bb.0:
2603 ; AVX512BW-NEXT:    vpsllw $15, %xmm0, %xmm0
2604 ; AVX512BW-NEXT:    vpmovw2m %zmm0, %k0
2605 ; AVX512BW-NEXT:    kmovd %k0, %eax
2606 ; AVX512BW-NEXT:    movb %al, (%rdi)
2607 ; AVX512BW-NEXT:    vzeroupper
2608 ; AVX512BW-NEXT:    retq
2610 ; AVX512DQ-LABEL: store_8i1_1:
2611 ; AVX512DQ:       ## %bb.0:
2612 ; AVX512DQ-NEXT:    vpmovsxwq %xmm0, %zmm0
2613 ; AVX512DQ-NEXT:    vpsllq $63, %zmm0, %zmm0
2614 ; AVX512DQ-NEXT:    vpmovq2m %zmm0, %k0
2615 ; AVX512DQ-NEXT:    kmovb %k0, (%rdi)
2616 ; AVX512DQ-NEXT:    vzeroupper
2617 ; AVX512DQ-NEXT:    retq
2619 ; X86-LABEL: store_8i1_1:
2620 ; X86:       ## %bb.0:
2621 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
2622 ; X86-NEXT:    vpsllw $15, %xmm0, %xmm0
2623 ; X86-NEXT:    vpmovw2m %xmm0, %k0
2624 ; X86-NEXT:    kmovb %k0, (%eax)
2625 ; X86-NEXT:    retl
2626   %v1 = trunc <8 x i16> %v to <8 x i1>
2627   store <8 x i1> %v1, <8 x i1>* %a
2628   ret void
2631 define void @store_16i1(<16 x i1>* %a, <16 x i1> %v) {
2632 ; KNL-LABEL: store_16i1:
2633 ; KNL:       ## %bb.0:
2634 ; KNL-NEXT:    vpmovsxbd %xmm0, %zmm0
2635 ; KNL-NEXT:    vpslld $31, %zmm0, %zmm0
2636 ; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k0
2637 ; KNL-NEXT:    kmovw %k0, (%rdi)
2638 ; KNL-NEXT:    vzeroupper
2639 ; KNL-NEXT:    retq
2641 ; SKX-LABEL: store_16i1:
2642 ; SKX:       ## %bb.0:
2643 ; SKX-NEXT:    vpsllw $7, %xmm0, %xmm0
2644 ; SKX-NEXT:    vpmovb2m %xmm0, %k0
2645 ; SKX-NEXT:    kmovw %k0, (%rdi)
2646 ; SKX-NEXT:    retq
2648 ; AVX512BW-LABEL: store_16i1:
2649 ; AVX512BW:       ## %bb.0:
2650 ; AVX512BW-NEXT:    vpsllw $7, %xmm0, %xmm0
2651 ; AVX512BW-NEXT:    vpmovb2m %zmm0, %k0
2652 ; AVX512BW-NEXT:    kmovw %k0, (%rdi)
2653 ; AVX512BW-NEXT:    vzeroupper
2654 ; AVX512BW-NEXT:    retq
2656 ; AVX512DQ-LABEL: store_16i1:
2657 ; AVX512DQ:       ## %bb.0:
2658 ; AVX512DQ-NEXT:    vpmovsxbd %xmm0, %zmm0
2659 ; AVX512DQ-NEXT:    vpslld $31, %zmm0, %zmm0
2660 ; AVX512DQ-NEXT:    vpmovd2m %zmm0, %k0
2661 ; AVX512DQ-NEXT:    kmovw %k0, (%rdi)
2662 ; AVX512DQ-NEXT:    vzeroupper
2663 ; AVX512DQ-NEXT:    retq
2665 ; X86-LABEL: store_16i1:
2666 ; X86:       ## %bb.0:
2667 ; X86-NEXT:    vpsllw $7, %xmm0, %xmm0
2668 ; X86-NEXT:    vpmovb2m %xmm0, %k0
2669 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
2670 ; X86-NEXT:    kmovw %k0, (%eax)
2671 ; X86-NEXT:    retl
2672   store <16 x i1> %v, <16 x i1>* %a
2673   ret void
2676 define void @store_32i1(<32 x i1>* %a, <32 x i1> %v) {
2677 ; KNL-LABEL: store_32i1:
2678 ; KNL:       ## %bb.0:
2679 ; KNL-NEXT:    vpmovsxbd %xmm0, %zmm1
2680 ; KNL-NEXT:    vpslld $31, %zmm1, %zmm1
2681 ; KNL-NEXT:    vptestmd %zmm1, %zmm1, %k0
2682 ; KNL-NEXT:    vextracti128 $1, %ymm0, %xmm0
2683 ; KNL-NEXT:    vpmovsxbd %xmm0, %zmm0
2684 ; KNL-NEXT:    vpslld $31, %zmm0, %zmm0
2685 ; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k1
2686 ; KNL-NEXT:    kmovw %k1, 2(%rdi)
2687 ; KNL-NEXT:    kmovw %k0, (%rdi)
2688 ; KNL-NEXT:    vzeroupper
2689 ; KNL-NEXT:    retq
2691 ; SKX-LABEL: store_32i1:
2692 ; SKX:       ## %bb.0:
2693 ; SKX-NEXT:    vpsllw $7, %ymm0, %ymm0
2694 ; SKX-NEXT:    vpmovb2m %ymm0, %k0
2695 ; SKX-NEXT:    kmovd %k0, (%rdi)
2696 ; SKX-NEXT:    vzeroupper
2697 ; SKX-NEXT:    retq
2699 ; AVX512BW-LABEL: store_32i1:
2700 ; AVX512BW:       ## %bb.0:
2701 ; AVX512BW-NEXT:    vpsllw $7, %ymm0, %ymm0
2702 ; AVX512BW-NEXT:    vpmovb2m %zmm0, %k0
2703 ; AVX512BW-NEXT:    kmovd %k0, (%rdi)
2704 ; AVX512BW-NEXT:    vzeroupper
2705 ; AVX512BW-NEXT:    retq
2707 ; AVX512DQ-LABEL: store_32i1:
2708 ; AVX512DQ:       ## %bb.0:
2709 ; AVX512DQ-NEXT:    vpmovsxbd %xmm0, %zmm1
2710 ; AVX512DQ-NEXT:    vpslld $31, %zmm1, %zmm1
2711 ; AVX512DQ-NEXT:    vpmovd2m %zmm1, %k0
2712 ; AVX512DQ-NEXT:    vextracti128 $1, %ymm0, %xmm0
2713 ; AVX512DQ-NEXT:    vpmovsxbd %xmm0, %zmm0
2714 ; AVX512DQ-NEXT:    vpslld $31, %zmm0, %zmm0
2715 ; AVX512DQ-NEXT:    vpmovd2m %zmm0, %k1
2716 ; AVX512DQ-NEXT:    kmovw %k1, 2(%rdi)
2717 ; AVX512DQ-NEXT:    kmovw %k0, (%rdi)
2718 ; AVX512DQ-NEXT:    vzeroupper
2719 ; AVX512DQ-NEXT:    retq
2721 ; X86-LABEL: store_32i1:
2722 ; X86:       ## %bb.0:
2723 ; X86-NEXT:    vpsllw $7, %ymm0, %ymm0
2724 ; X86-NEXT:    vpmovb2m %ymm0, %k0
2725 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
2726 ; X86-NEXT:    kmovd %k0, (%eax)
2727 ; X86-NEXT:    vzeroupper
2728 ; X86-NEXT:    retl
2729   store <32 x i1> %v, <32 x i1>* %a
2730   ret void
2733 define void @store_32i1_1(<32 x i1>* %a, <32 x i16> %v) {
2734 ; KNL-LABEL: store_32i1_1:
2735 ; KNL:       ## %bb.0:
2736 ; KNL-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
2737 ; KNL-NEXT:    vpmovsxwd %ymm0, %zmm0
2738 ; KNL-NEXT:    vpslld $31, %zmm0, %zmm0
2739 ; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k0
2740 ; KNL-NEXT:    vpmovsxwd %ymm1, %zmm0
2741 ; KNL-NEXT:    vpslld $31, %zmm0, %zmm0
2742 ; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k1
2743 ; KNL-NEXT:    kmovw %k1, 2(%rdi)
2744 ; KNL-NEXT:    kmovw %k0, (%rdi)
2745 ; KNL-NEXT:    vzeroupper
2746 ; KNL-NEXT:    retq
2748 ; SKX-LABEL: store_32i1_1:
2749 ; SKX:       ## %bb.0:
2750 ; SKX-NEXT:    vpsllw $15, %zmm0, %zmm0
2751 ; SKX-NEXT:    vpmovw2m %zmm0, %k0
2752 ; SKX-NEXT:    kmovd %k0, (%rdi)
2753 ; SKX-NEXT:    vzeroupper
2754 ; SKX-NEXT:    retq
2756 ; AVX512BW-LABEL: store_32i1_1:
2757 ; AVX512BW:       ## %bb.0:
2758 ; AVX512BW-NEXT:    vpsllw $15, %zmm0, %zmm0
2759 ; AVX512BW-NEXT:    vpmovw2m %zmm0, %k0
2760 ; AVX512BW-NEXT:    kmovd %k0, (%rdi)
2761 ; AVX512BW-NEXT:    vzeroupper
2762 ; AVX512BW-NEXT:    retq
2764 ; AVX512DQ-LABEL: store_32i1_1:
2765 ; AVX512DQ:       ## %bb.0:
2766 ; AVX512DQ-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
2767 ; AVX512DQ-NEXT:    vpmovsxwd %ymm0, %zmm0
2768 ; AVX512DQ-NEXT:    vpslld $31, %zmm0, %zmm0
2769 ; AVX512DQ-NEXT:    vpmovd2m %zmm0, %k0
2770 ; AVX512DQ-NEXT:    vpmovsxwd %ymm1, %zmm0
2771 ; AVX512DQ-NEXT:    vpslld $31, %zmm0, %zmm0
2772 ; AVX512DQ-NEXT:    vpmovd2m %zmm0, %k1
2773 ; AVX512DQ-NEXT:    kmovw %k1, 2(%rdi)
2774 ; AVX512DQ-NEXT:    kmovw %k0, (%rdi)
2775 ; AVX512DQ-NEXT:    vzeroupper
2776 ; AVX512DQ-NEXT:    retq
2778 ; X86-LABEL: store_32i1_1:
2779 ; X86:       ## %bb.0:
2780 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
2781 ; X86-NEXT:    vpsllw $15, %zmm0, %zmm0
2782 ; X86-NEXT:    vpmovw2m %zmm0, %k0
2783 ; X86-NEXT:    kmovd %k0, (%eax)
2784 ; X86-NEXT:    vzeroupper
2785 ; X86-NEXT:    retl
2786   %v1 = trunc <32 x i16> %v to <32 x i1>
2787   store <32 x i1> %v1, <32 x i1>* %a
2788   ret void
2792 define void @store_64i1(<64 x i1>* %a, <64 x i1> %v) {
2794 ; KNL-LABEL: store_64i1:
2795 ; KNL:       ## %bb.0:
2796 ; KNL-NEXT:    kmovw %esi, %k0
2797 ; KNL-NEXT:    kshiftlw $15, %k0, %k0
2798 ; KNL-NEXT:    kshiftrw $15, %k0, %k0
2799 ; KNL-NEXT:    kshiftlw $2, %k0, %k2
2800 ; KNL-NEXT:    kmovw %k2, {{[-0-9]+}}(%r{{[sb]}}p) ## 2-byte Spill
2801 ; KNL-NEXT:    kmovw %edx, %k1
2802 ; KNL-NEXT:    kshiftlw $1, %k1, %k1
2803 ; KNL-NEXT:    korw %k1, %k2, %k1
2804 ; KNL-NEXT:    korw %k1, %k0, %k0
2805 ; KNL-NEXT:    kshiftlw $14, %k0, %k0
2806 ; KNL-NEXT:    kshiftrw $14, %k0, %k0
2807 ; KNL-NEXT:    kshiftlw $3, %k0, %k3
2808 ; KNL-NEXT:    kmovw %ecx, %k1
2809 ; KNL-NEXT:    kshiftlw $2, %k1, %k1
2810 ; KNL-NEXT:    korw %k1, %k3, %k1
2811 ; KNL-NEXT:    korw %k1, %k0, %k0
2812 ; KNL-NEXT:    kshiftlw $13, %k0, %k0
2813 ; KNL-NEXT:    kshiftrw $13, %k0, %k0
2814 ; KNL-NEXT:    kshiftlw $4, %k0, %k4
2815 ; KNL-NEXT:    kmovw %r8d, %k1
2816 ; KNL-NEXT:    kshiftlw $3, %k1, %k1
2817 ; KNL-NEXT:    korw %k1, %k4, %k1
2818 ; KNL-NEXT:    korw %k1, %k0, %k0
2819 ; KNL-NEXT:    kshiftlw $12, %k0, %k0
2820 ; KNL-NEXT:    kshiftrw $12, %k0, %k0
2821 ; KNL-NEXT:    kshiftlw $5, %k0, %k5
2822 ; KNL-NEXT:    kmovw %r9d, %k1
2823 ; KNL-NEXT:    kshiftlw $4, %k1, %k1
2824 ; KNL-NEXT:    korw %k1, %k5, %k1
2825 ; KNL-NEXT:    korw %k1, %k0, %k0
2826 ; KNL-NEXT:    kshiftlw $11, %k0, %k0
2827 ; KNL-NEXT:    kshiftrw $11, %k0, %k0
2828 ; KNL-NEXT:    kshiftlw $6, %k0, %k6
2829 ; KNL-NEXT:    movb {{[0-9]+}}(%rsp), %al
2830 ; KNL-NEXT:    kmovw %eax, %k1
2831 ; KNL-NEXT:    kshiftlw $5, %k1, %k1
2832 ; KNL-NEXT:    korw %k1, %k6, %k1
2833 ; KNL-NEXT:    korw %k1, %k0, %k0
2834 ; KNL-NEXT:    kshiftlw $10, %k0, %k0
2835 ; KNL-NEXT:    kshiftrw $10, %k0, %k0
2836 ; KNL-NEXT:    kshiftlw $7, %k0, %k7
2837 ; KNL-NEXT:    movb {{[0-9]+}}(%rsp), %al
2838 ; KNL-NEXT:    kmovw %eax, %k1
2839 ; KNL-NEXT:    kshiftlw $6, %k1, %k1
2840 ; KNL-NEXT:    korw %k1, %k7, %k1
2841 ; KNL-NEXT:    korw %k1, %k0, %k0
2842 ; KNL-NEXT:    kshiftlw $9, %k0, %k0
2843 ; KNL-NEXT:    kshiftrw $9, %k0, %k0
2844 ; KNL-NEXT:    movb {{[0-9]+}}(%rsp), %al
2845 ; KNL-NEXT:    kmovw %eax, %k1
2846 ; KNL-NEXT:    kshiftlw $7, %k1, %k1
2847 ; KNL-NEXT:    kshiftlw $8, %k0, %k2
2848 ; KNL-NEXT:    kmovw %k2, {{[-0-9]+}}(%r{{[sb]}}p) ## 2-byte Spill
2849 ; KNL-NEXT:    korw %k1, %k2, %k1
2850 ; KNL-NEXT:    korw %k1, %k0, %k0
2851 ; KNL-NEXT:    kshiftlw $8, %k0, %k0
2852 ; KNL-NEXT:    kshiftrw $8, %k0, %k0
2853 ; KNL-NEXT:    movb {{[0-9]+}}(%rsp), %al
2854 ; KNL-NEXT:    kmovw %eax, %k1
2855 ; KNL-NEXT:    kshiftlw $8, %k1, %k1
2856 ; KNL-NEXT:    kshiftlw $9, %k0, %k2
2857 ; KNL-NEXT:    kmovw %k2, {{[-0-9]+}}(%r{{[sb]}}p) ## 2-byte Spill
2858 ; KNL-NEXT:    korw %k1, %k2, %k1
2859 ; KNL-NEXT:    korw %k1, %k0, %k0
2860 ; KNL-NEXT:    kshiftlw $7, %k0, %k0
2861 ; KNL-NEXT:    kshiftrw $7, %k0, %k0
2862 ; KNL-NEXT:    movb {{[0-9]+}}(%rsp), %al
2863 ; KNL-NEXT:    kmovw %eax, %k1
2864 ; KNL-NEXT:    kshiftlw $9, %k1, %k1
2865 ; KNL-NEXT:    kshiftlw $10, %k0, %k2
2866 ; KNL-NEXT:    kmovw %k2, {{[-0-9]+}}(%r{{[sb]}}p) ## 2-byte Spill
2867 ; KNL-NEXT:    korw %k1, %k2, %k1
2868 ; KNL-NEXT:    korw %k1, %k0, %k0
2869 ; KNL-NEXT:    kshiftlw $6, %k0, %k0
2870 ; KNL-NEXT:    kshiftrw $6, %k0, %k0
2871 ; KNL-NEXT:    movb {{[0-9]+}}(%rsp), %al
2872 ; KNL-NEXT:    kmovw %eax, %k1
2873 ; KNL-NEXT:    kshiftlw $10, %k1, %k1
2874 ; KNL-NEXT:    kshiftlw $11, %k0, %k2
2875 ; KNL-NEXT:    kmovw %k2, {{[-0-9]+}}(%r{{[sb]}}p) ## 2-byte Spill
2876 ; KNL-NEXT:    korw %k1, %k2, %k1
2877 ; KNL-NEXT:    korw %k1, %k0, %k0
2878 ; KNL-NEXT:    kshiftlw $5, %k0, %k0
2879 ; KNL-NEXT:    kshiftrw $5, %k0, %k0
2880 ; KNL-NEXT:    movb {{[0-9]+}}(%rsp), %al
2881 ; KNL-NEXT:    kmovw %eax, %k1
2882 ; KNL-NEXT:    kshiftlw $11, %k1, %k1
2883 ; KNL-NEXT:    kshiftlw $12, %k0, %k2
2884 ; KNL-NEXT:    kmovw %k2, {{[-0-9]+}}(%r{{[sb]}}p) ## 2-byte Spill
2885 ; KNL-NEXT:    korw %k1, %k2, %k1
2886 ; KNL-NEXT:    korw %k1, %k0, %k0
2887 ; KNL-NEXT:    kshiftlw $4, %k0, %k0
2888 ; KNL-NEXT:    kshiftrw $4, %k0, %k0
2889 ; KNL-NEXT:    movb {{[0-9]+}}(%rsp), %al
2890 ; KNL-NEXT:    kmovw %eax, %k1
2891 ; KNL-NEXT:    kshiftlw $12, %k1, %k1
2892 ; KNL-NEXT:    kshiftlw $13, %k0, %k2
2893 ; KNL-NEXT:    kmovw %k2, {{[-0-9]+}}(%r{{[sb]}}p) ## 2-byte Spill
2894 ; KNL-NEXT:    korw %k1, %k2, %k1
2895 ; KNL-NEXT:    korw %k1, %k0, %k0
2896 ; KNL-NEXT:    kshiftlw $3, %k0, %k0
2897 ; KNL-NEXT:    kshiftrw $3, %k0, %k0
2898 ; KNL-NEXT:    movb {{[0-9]+}}(%rsp), %al
2899 ; KNL-NEXT:    kmovw %eax, %k1
2900 ; KNL-NEXT:    kshiftlw $13, %k1, %k1
2901 ; KNL-NEXT:    kshiftlw $14, %k0, %k2
2902 ; KNL-NEXT:    kmovw %k2, {{[-0-9]+}}(%r{{[sb]}}p) ## 2-byte Spill
2903 ; KNL-NEXT:    korw %k1, %k2, %k1
2904 ; KNL-NEXT:    korw %k1, %k0, %k0
2905 ; KNL-NEXT:    kshiftlw $2, %k0, %k0
2906 ; KNL-NEXT:    kshiftrw $2, %k0, %k2
2907 ; KNL-NEXT:    movb {{[0-9]+}}(%rsp), %al
2908 ; KNL-NEXT:    kmovw %eax, %k1
2909 ; KNL-NEXT:    kshiftlw $14, %k1, %k0
2910 ; KNL-NEXT:    kshiftlw $15, %k0, %k1
2911 ; KNL-NEXT:    kmovw %k1, {{[-0-9]+}}(%r{{[sb]}}p) ## 2-byte Spill
2912 ; KNL-NEXT:    korw %k0, %k1, %k0
2913 ; KNL-NEXT:    korw %k0, %k2, %k0
2914 ; KNL-NEXT:    kshiftlw $1, %k0, %k0
2915 ; KNL-NEXT:    kshiftrw $1, %k0, %k0
2916 ; KNL-NEXT:    movb {{[0-9]+}}(%rsp), %al
2917 ; KNL-NEXT:    kmovw %eax, %k2
2918 ; KNL-NEXT:    kshiftlw $15, %k2, %k2
2919 ; KNL-NEXT:    korw %k2, %k0, %k0
2920 ; KNL-NEXT:    kmovw %k0, {{[-0-9]+}}(%r{{[sb]}}p) ## 2-byte Spill
2921 ; KNL-NEXT:    movb {{[0-9]+}}(%rsp), %al
2922 ; KNL-NEXT:    kmovw %eax, %k0
2923 ; KNL-NEXT:    kshiftlw $15, %k0, %k0
2924 ; KNL-NEXT:    kshiftrw $15, %k0, %k0
2925 ; KNL-NEXT:    movb {{[0-9]+}}(%rsp), %al
2926 ; KNL-NEXT:    kmovw %eax, %k2
2927 ; KNL-NEXT:    kshiftlw $1, %k2, %k2
2928 ; KNL-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k1 ## 2-byte Reload
2929 ; KNL-NEXT:    korw %k2, %k1, %k2
2930 ; KNL-NEXT:    korw %k2, %k0, %k0
2931 ; KNL-NEXT:    kshiftlw $14, %k0, %k0
2932 ; KNL-NEXT:    kshiftrw $14, %k0, %k0
2933 ; KNL-NEXT:    movb {{[0-9]+}}(%rsp), %al
2934 ; KNL-NEXT:    kmovw %eax, %k2
2935 ; KNL-NEXT:    kshiftlw $2, %k2, %k2
2936 ; KNL-NEXT:    kmovw %k3, {{[-0-9]+}}(%r{{[sb]}}p) ## 2-byte Spill
2937 ; KNL-NEXT:    korw %k2, %k3, %k2
2938 ; KNL-NEXT:    korw %k2, %k0, %k0
2939 ; KNL-NEXT:    kshiftlw $13, %k0, %k0
2940 ; KNL-NEXT:    kshiftrw $13, %k0, %k0
2941 ; KNL-NEXT:    movb {{[0-9]+}}(%rsp), %al
2942 ; KNL-NEXT:    kmovw %eax, %k2
2943 ; KNL-NEXT:    kshiftlw $3, %k2, %k2
2944 ; KNL-NEXT:    kmovw %k4, {{[-0-9]+}}(%r{{[sb]}}p) ## 2-byte Spill
2945 ; KNL-NEXT:    korw %k2, %k4, %k2
2946 ; KNL-NEXT:    korw %k2, %k0, %k0
2947 ; KNL-NEXT:    kshiftlw $12, %k0, %k0
2948 ; KNL-NEXT:    kshiftrw $12, %k0, %k0
2949 ; KNL-NEXT:    movb {{[0-9]+}}(%rsp), %al
2950 ; KNL-NEXT:    kmovw %eax, %k2
2951 ; KNL-NEXT:    kshiftlw $4, %k2, %k2
2952 ; KNL-NEXT:    kmovw %k5, {{[-0-9]+}}(%r{{[sb]}}p) ## 2-byte Spill
2953 ; KNL-NEXT:    korw %k2, %k5, %k2
2954 ; KNL-NEXT:    korw %k2, %k0, %k0
2955 ; KNL-NEXT:    kshiftlw $11, %k0, %k0
2956 ; KNL-NEXT:    kshiftrw $11, %k0, %k0
2957 ; KNL-NEXT:    movb {{[0-9]+}}(%rsp), %al
2958 ; KNL-NEXT:    kmovw %eax, %k2
2959 ; KNL-NEXT:    kshiftlw $5, %k2, %k2
2960 ; KNL-NEXT:    korw %k2, %k6, %k2
2961 ; KNL-NEXT:    korw %k2, %k0, %k0
2962 ; KNL-NEXT:    kshiftlw $10, %k0, %k0
2963 ; KNL-NEXT:    kshiftrw $10, %k0, %k0
2964 ; KNL-NEXT:    movb {{[0-9]+}}(%rsp), %al
2965 ; KNL-NEXT:    kmovw %eax, %k2
2966 ; KNL-NEXT:    kshiftlw $6, %k2, %k2
2967 ; KNL-NEXT:    kmovw %k7, {{[-0-9]+}}(%r{{[sb]}}p) ## 2-byte Spill
2968 ; KNL-NEXT:    korw %k2, %k7, %k2
2969 ; KNL-NEXT:    korw %k2, %k0, %k0
2970 ; KNL-NEXT:    kshiftlw $9, %k0, %k0
2971 ; KNL-NEXT:    kshiftrw $9, %k0, %k0
2972 ; KNL-NEXT:    movb {{[0-9]+}}(%rsp), %al
2973 ; KNL-NEXT:    kmovw %eax, %k2
2974 ; KNL-NEXT:    kshiftlw $7, %k2, %k2
2975 ; KNL-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k1 ## 2-byte Reload
2976 ; KNL-NEXT:    korw %k2, %k1, %k2
2977 ; KNL-NEXT:    korw %k2, %k0, %k0
2978 ; KNL-NEXT:    kshiftlw $8, %k0, %k0
2979 ; KNL-NEXT:    kshiftrw $8, %k0, %k0
2980 ; KNL-NEXT:    movb {{[0-9]+}}(%rsp), %al
2981 ; KNL-NEXT:    kmovw %eax, %k2
2982 ; KNL-NEXT:    kshiftlw $8, %k2, %k2
2983 ; KNL-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k1 ## 2-byte Reload
2984 ; KNL-NEXT:    korw %k2, %k1, %k2
2985 ; KNL-NEXT:    korw %k2, %k0, %k0
2986 ; KNL-NEXT:    kshiftlw $7, %k0, %k0
2987 ; KNL-NEXT:    kshiftrw $7, %k0, %k0
2988 ; KNL-NEXT:    movb {{[0-9]+}}(%rsp), %al
2989 ; KNL-NEXT:    kmovw %eax, %k2
2990 ; KNL-NEXT:    kshiftlw $9, %k2, %k2
2991 ; KNL-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k1 ## 2-byte Reload
2992 ; KNL-NEXT:    korw %k2, %k1, %k2
2993 ; KNL-NEXT:    korw %k2, %k0, %k0
2994 ; KNL-NEXT:    kshiftlw $6, %k0, %k0
2995 ; KNL-NEXT:    kshiftrw $6, %k0, %k0
2996 ; KNL-NEXT:    movb {{[0-9]+}}(%rsp), %al
2997 ; KNL-NEXT:    kmovw %eax, %k2
2998 ; KNL-NEXT:    kshiftlw $10, %k2, %k2
2999 ; KNL-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k1 ## 2-byte Reload
3000 ; KNL-NEXT:    korw %k2, %k1, %k2
3001 ; KNL-NEXT:    korw %k2, %k0, %k0
3002 ; KNL-NEXT:    kshiftlw $5, %k0, %k0
3003 ; KNL-NEXT:    kshiftrw $5, %k0, %k0
3004 ; KNL-NEXT:    movb {{[0-9]+}}(%rsp), %al
3005 ; KNL-NEXT:    kmovw %eax, %k2
3006 ; KNL-NEXT:    kshiftlw $11, %k2, %k2
3007 ; KNL-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k1 ## 2-byte Reload
3008 ; KNL-NEXT:    korw %k2, %k1, %k2
3009 ; KNL-NEXT:    korw %k2, %k0, %k0
3010 ; KNL-NEXT:    kshiftlw $4, %k0, %k0
3011 ; KNL-NEXT:    kshiftrw $4, %k0, %k0
3012 ; KNL-NEXT:    movb {{[0-9]+}}(%rsp), %al
3013 ; KNL-NEXT:    kmovw %eax, %k2
3014 ; KNL-NEXT:    kshiftlw $12, %k2, %k2
3015 ; KNL-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k1 ## 2-byte Reload
3016 ; KNL-NEXT:    korw %k2, %k1, %k2
3017 ; KNL-NEXT:    korw %k2, %k0, %k0
3018 ; KNL-NEXT:    kshiftlw $3, %k0, %k0
3019 ; KNL-NEXT:    kshiftrw $3, %k0, %k0
3020 ; KNL-NEXT:    movb {{[0-9]+}}(%rsp), %al
3021 ; KNL-NEXT:    kmovw %eax, %k2
3022 ; KNL-NEXT:    kshiftlw $13, %k2, %k2
3023 ; KNL-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k1 ## 2-byte Reload
3024 ; KNL-NEXT:    korw %k2, %k1, %k2
3025 ; KNL-NEXT:    korw %k2, %k0, %k0
3026 ; KNL-NEXT:    kshiftlw $2, %k0, %k0
3027 ; KNL-NEXT:    kshiftrw $2, %k0, %k0
3028 ; KNL-NEXT:    movb {{[0-9]+}}(%rsp), %al
3029 ; KNL-NEXT:    kmovw %eax, %k2
3030 ; KNL-NEXT:    kshiftlw $14, %k2, %k2
3031 ; KNL-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k1 ## 2-byte Reload
3032 ; KNL-NEXT:    korw %k2, %k1, %k2
3033 ; KNL-NEXT:    korw %k2, %k0, %k0
3034 ; KNL-NEXT:    kshiftlw $1, %k0, %k0
3035 ; KNL-NEXT:    kshiftrw $1, %k0, %k0
3036 ; KNL-NEXT:    movb {{[0-9]+}}(%rsp), %al
3037 ; KNL-NEXT:    kmovw %eax, %k2
3038 ; KNL-NEXT:    kshiftlw $15, %k2, %k2
3039 ; KNL-NEXT:    korw %k2, %k0, %k0
3040 ; KNL-NEXT:    kmovw %k0, {{[-0-9]+}}(%r{{[sb]}}p) ## 2-byte Spill
3041 ; KNL-NEXT:    movb {{[0-9]+}}(%rsp), %al
3042 ; KNL-NEXT:    kmovw %eax, %k0
3043 ; KNL-NEXT:    kshiftlw $15, %k0, %k0
3044 ; KNL-NEXT:    kshiftrw $15, %k0, %k0
3045 ; KNL-NEXT:    movb {{[0-9]+}}(%rsp), %al
3046 ; KNL-NEXT:    kmovw %eax, %k2
3047 ; KNL-NEXT:    kshiftlw $1, %k2, %k2
3048 ; KNL-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k1 ## 2-byte Reload
3049 ; KNL-NEXT:    korw %k2, %k1, %k2
3050 ; KNL-NEXT:    korw %k2, %k0, %k0
3051 ; KNL-NEXT:    kshiftlw $14, %k0, %k0
3052 ; KNL-NEXT:    kshiftrw $14, %k0, %k0
3053 ; KNL-NEXT:    movb {{[0-9]+}}(%rsp), %al
3054 ; KNL-NEXT:    kmovw %eax, %k2
3055 ; KNL-NEXT:    kshiftlw $2, %k2, %k2
3056 ; KNL-NEXT:    korw %k2, %k3, %k2
3057 ; KNL-NEXT:    korw %k2, %k0, %k0
3058 ; KNL-NEXT:    kshiftlw $13, %k0, %k0
3059 ; KNL-NEXT:    kshiftrw $13, %k0, %k0
3060 ; KNL-NEXT:    movb {{[0-9]+}}(%rsp), %al
3061 ; KNL-NEXT:    kmovw %eax, %k2
3062 ; KNL-NEXT:    kshiftlw $3, %k2, %k2
3063 ; KNL-NEXT:    korw %k2, %k4, %k2
3064 ; KNL-NEXT:    korw %k2, %k0, %k0
3065 ; KNL-NEXT:    kshiftlw $12, %k0, %k0
3066 ; KNL-NEXT:    kshiftrw $12, %k0, %k0
3067 ; KNL-NEXT:    movb {{[0-9]+}}(%rsp), %al
3068 ; KNL-NEXT:    kmovw %eax, %k2
3069 ; KNL-NEXT:    kshiftlw $4, %k2, %k2
3070 ; KNL-NEXT:    korw %k2, %k5, %k2
3071 ; KNL-NEXT:    korw %k2, %k0, %k0
3072 ; KNL-NEXT:    kshiftlw $11, %k0, %k0
3073 ; KNL-NEXT:    kshiftrw $11, %k0, %k0
3074 ; KNL-NEXT:    movb {{[0-9]+}}(%rsp), %al
3075 ; KNL-NEXT:    kmovw %eax, %k2
3076 ; KNL-NEXT:    kshiftlw $5, %k2, %k2
3077 ; KNL-NEXT:    korw %k2, %k6, %k2
3078 ; KNL-NEXT:    korw %k2, %k0, %k0
3079 ; KNL-NEXT:    kshiftlw $10, %k0, %k0
3080 ; KNL-NEXT:    kshiftrw $10, %k0, %k0
3081 ; KNL-NEXT:    movb {{[0-9]+}}(%rsp), %al
3082 ; KNL-NEXT:    kmovw %eax, %k2
3083 ; KNL-NEXT:    kshiftlw $6, %k2, %k2
3084 ; KNL-NEXT:    korw %k2, %k7, %k2
3085 ; KNL-NEXT:    korw %k2, %k0, %k0
3086 ; KNL-NEXT:    kshiftlw $9, %k0, %k0
3087 ; KNL-NEXT:    kshiftrw $9, %k0, %k0
3088 ; KNL-NEXT:    movb {{[0-9]+}}(%rsp), %al
3089 ; KNL-NEXT:    kmovw %eax, %k2
3090 ; KNL-NEXT:    kshiftlw $7, %k2, %k2
3091 ; KNL-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k1 ## 2-byte Reload
3092 ; KNL-NEXT:    korw %k2, %k1, %k2
3093 ; KNL-NEXT:    korw %k2, %k0, %k0
3094 ; KNL-NEXT:    kshiftlw $8, %k0, %k0
3095 ; KNL-NEXT:    kshiftrw $8, %k0, %k0
3096 ; KNL-NEXT:    movb {{[0-9]+}}(%rsp), %al
3097 ; KNL-NEXT:    kmovw %eax, %k2
3098 ; KNL-NEXT:    kshiftlw $8, %k2, %k2
3099 ; KNL-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k3 ## 2-byte Reload
3100 ; KNL-NEXT:    korw %k2, %k3, %k2
3101 ; KNL-NEXT:    korw %k2, %k0, %k0
3102 ; KNL-NEXT:    kshiftlw $7, %k0, %k0
3103 ; KNL-NEXT:    kshiftrw $7, %k0, %k0
3104 ; KNL-NEXT:    movb {{[0-9]+}}(%rsp), %al
3105 ; KNL-NEXT:    kmovw %eax, %k2
3106 ; KNL-NEXT:    kshiftlw $9, %k2, %k2
3107 ; KNL-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k4 ## 2-byte Reload
3108 ; KNL-NEXT:    korw %k2, %k4, %k2
3109 ; KNL-NEXT:    korw %k2, %k0, %k0
3110 ; KNL-NEXT:    kshiftlw $6, %k0, %k0
3111 ; KNL-NEXT:    kshiftrw $6, %k0, %k0
3112 ; KNL-NEXT:    movb {{[0-9]+}}(%rsp), %al
3113 ; KNL-NEXT:    kmovw %eax, %k2
3114 ; KNL-NEXT:    kshiftlw $10, %k2, %k2
3115 ; KNL-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k5 ## 2-byte Reload
3116 ; KNL-NEXT:    korw %k2, %k5, %k2
3117 ; KNL-NEXT:    korw %k2, %k0, %k0
3118 ; KNL-NEXT:    kshiftlw $5, %k0, %k0
3119 ; KNL-NEXT:    kshiftrw $5, %k0, %k0
3120 ; KNL-NEXT:    movb {{[0-9]+}}(%rsp), %al
3121 ; KNL-NEXT:    kmovw %eax, %k2
3122 ; KNL-NEXT:    kshiftlw $11, %k2, %k2
3123 ; KNL-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k7 ## 2-byte Reload
3124 ; KNL-NEXT:    korw %k2, %k7, %k2
3125 ; KNL-NEXT:    korw %k2, %k0, %k0
3126 ; KNL-NEXT:    kshiftlw $4, %k0, %k0
3127 ; KNL-NEXT:    kshiftrw $4, %k0, %k0
3128 ; KNL-NEXT:    movb {{[0-9]+}}(%rsp), %al
3129 ; KNL-NEXT:    kmovw %eax, %k2
3130 ; KNL-NEXT:    kshiftlw $12, %k2, %k2
3131 ; KNL-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k7 ## 2-byte Reload
3132 ; KNL-NEXT:    korw %k2, %k7, %k2
3133 ; KNL-NEXT:    korw %k2, %k0, %k0
3134 ; KNL-NEXT:    kshiftlw $3, %k0, %k0
3135 ; KNL-NEXT:    kshiftrw $3, %k0, %k0
3136 ; KNL-NEXT:    movb {{[0-9]+}}(%rsp), %al
3137 ; KNL-NEXT:    kmovw %eax, %k2
3138 ; KNL-NEXT:    kshiftlw $13, %k2, %k2
3139 ; KNL-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k7 ## 2-byte Reload
3140 ; KNL-NEXT:    korw %k2, %k7, %k2
3141 ; KNL-NEXT:    korw %k2, %k0, %k0
3142 ; KNL-NEXT:    kshiftlw $2, %k0, %k0
3143 ; KNL-NEXT:    kshiftrw $2, %k0, %k0
3144 ; KNL-NEXT:    movb {{[0-9]+}}(%rsp), %al
3145 ; KNL-NEXT:    kmovw %eax, %k2
3146 ; KNL-NEXT:    kshiftlw $14, %k2, %k2
3147 ; KNL-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k7 ## 2-byte Reload
3148 ; KNL-NEXT:    korw %k2, %k7, %k2
3149 ; KNL-NEXT:    korw %k2, %k0, %k0
3150 ; KNL-NEXT:    kshiftlw $1, %k0, %k0
3151 ; KNL-NEXT:    kshiftrw $1, %k0, %k0
3152 ; KNL-NEXT:    movb {{[0-9]+}}(%rsp), %al
3153 ; KNL-NEXT:    kmovw %eax, %k2
3154 ; KNL-NEXT:    kshiftlw $15, %k2, %k2
3155 ; KNL-NEXT:    korw %k2, %k0, %k0
3156 ; KNL-NEXT:    kmovw %k0, {{[-0-9]+}}(%r{{[sb]}}p) ## 2-byte Spill
3157 ; KNL-NEXT:    movb {{[0-9]+}}(%rsp), %al
3158 ; KNL-NEXT:    kmovw %eax, %k2
3159 ; KNL-NEXT:    kshiftlw $1, %k2, %k2
3160 ; KNL-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k0 ## 2-byte Reload
3161 ; KNL-NEXT:    korw %k2, %k0, %k2
3162 ; KNL-NEXT:    movb {{[0-9]+}}(%rsp), %al
3163 ; KNL-NEXT:    kmovw %eax, %k7
3164 ; KNL-NEXT:    kshiftlw $15, %k7, %k7
3165 ; KNL-NEXT:    kshiftrw $15, %k7, %k7
3166 ; KNL-NEXT:    korw %k2, %k7, %k2
3167 ; KNL-NEXT:    movb {{[0-9]+}}(%rsp), %al
3168 ; KNL-NEXT:    kmovw %eax, %k7
3169 ; KNL-NEXT:    kshiftlw $2, %k7, %k7
3170 ; KNL-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k0 ## 2-byte Reload
3171 ; KNL-NEXT:    korw %k7, %k0, %k7
3172 ; KNL-NEXT:    kshiftlw $14, %k2, %k2
3173 ; KNL-NEXT:    kshiftrw $14, %k2, %k2
3174 ; KNL-NEXT:    korw %k7, %k2, %k2
3175 ; KNL-NEXT:    movb {{[0-9]+}}(%rsp), %al
3176 ; KNL-NEXT:    kmovw %eax, %k7
3177 ; KNL-NEXT:    kshiftlw $3, %k7, %k7
3178 ; KNL-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k0 ## 2-byte Reload
3179 ; KNL-NEXT:    korw %k7, %k0, %k7
3180 ; KNL-NEXT:    kshiftlw $13, %k2, %k2
3181 ; KNL-NEXT:    kshiftrw $13, %k2, %k2
3182 ; KNL-NEXT:    korw %k7, %k2, %k2
3183 ; KNL-NEXT:    movb {{[0-9]+}}(%rsp), %al
3184 ; KNL-NEXT:    kmovw %eax, %k7
3185 ; KNL-NEXT:    kshiftlw $4, %k7, %k7
3186 ; KNL-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k0 ## 2-byte Reload
3187 ; KNL-NEXT:    korw %k7, %k0, %k7
3188 ; KNL-NEXT:    kshiftlw $12, %k2, %k2
3189 ; KNL-NEXT:    kshiftrw $12, %k2, %k2
3190 ; KNL-NEXT:    korw %k7, %k2, %k2
3191 ; KNL-NEXT:    movb {{[0-9]+}}(%rsp), %al
3192 ; KNL-NEXT:    kmovw %eax, %k7
3193 ; KNL-NEXT:    kshiftlw $5, %k7, %k7
3194 ; KNL-NEXT:    korw %k7, %k6, %k7
3195 ; KNL-NEXT:    kshiftlw $11, %k2, %k2
3196 ; KNL-NEXT:    kshiftrw $11, %k2, %k2
3197 ; KNL-NEXT:    korw %k7, %k2, %k2
3198 ; KNL-NEXT:    movb {{[0-9]+}}(%rsp), %al
3199 ; KNL-NEXT:    kmovw %eax, %k7
3200 ; KNL-NEXT:    kshiftlw $6, %k7, %k7
3201 ; KNL-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k0 ## 2-byte Reload
3202 ; KNL-NEXT:    korw %k7, %k0, %k7
3203 ; KNL-NEXT:    kshiftlw $10, %k2, %k2
3204 ; KNL-NEXT:    kshiftrw $10, %k2, %k2
3205 ; KNL-NEXT:    korw %k7, %k2, %k2
3206 ; KNL-NEXT:    movb {{[0-9]+}}(%rsp), %al
3207 ; KNL-NEXT:    kmovw %eax, %k7
3208 ; KNL-NEXT:    kshiftlw $7, %k7, %k7
3209 ; KNL-NEXT:    korw %k7, %k1, %k7
3210 ; KNL-NEXT:    kshiftlw $9, %k2, %k2
3211 ; KNL-NEXT:    kshiftrw $9, %k2, %k2
3212 ; KNL-NEXT:    korw %k7, %k2, %k2
3213 ; KNL-NEXT:    movb {{[0-9]+}}(%rsp), %al
3214 ; KNL-NEXT:    kmovw %eax, %k7
3215 ; KNL-NEXT:    kshiftlw $8, %k7, %k7
3216 ; KNL-NEXT:    korw %k7, %k3, %k7
3217 ; KNL-NEXT:    kshiftlw $8, %k2, %k2
3218 ; KNL-NEXT:    kshiftrw $8, %k2, %k2
3219 ; KNL-NEXT:    korw %k7, %k2, %k2
3220 ; KNL-NEXT:    movb {{[0-9]+}}(%rsp), %al
3221 ; KNL-NEXT:    kmovw %eax, %k7
3222 ; KNL-NEXT:    kshiftlw $9, %k7, %k7
3223 ; KNL-NEXT:    korw %k7, %k4, %k7
3224 ; KNL-NEXT:    kshiftlw $7, %k2, %k2
3225 ; KNL-NEXT:    kshiftrw $7, %k2, %k2
3226 ; KNL-NEXT:    korw %k7, %k2, %k2
3227 ; KNL-NEXT:    movb {{[0-9]+}}(%rsp), %al
3228 ; KNL-NEXT:    kmovw %eax, %k7
3229 ; KNL-NEXT:    kshiftlw $10, %k7, %k7
3230 ; KNL-NEXT:    korw %k7, %k5, %k6
3231 ; KNL-NEXT:    kshiftlw $6, %k2, %k2
3232 ; KNL-NEXT:    kshiftrw $6, %k2, %k2
3233 ; KNL-NEXT:    korw %k6, %k2, %k2
3234 ; KNL-NEXT:    movb {{[0-9]+}}(%rsp), %al
3235 ; KNL-NEXT:    kmovw %eax, %k6
3236 ; KNL-NEXT:    kshiftlw $11, %k6, %k6
3237 ; KNL-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k1 ## 2-byte Reload
3238 ; KNL-NEXT:    korw %k6, %k1, %k5
3239 ; KNL-NEXT:    kshiftlw $5, %k2, %k2
3240 ; KNL-NEXT:    kshiftrw $5, %k2, %k2
3241 ; KNL-NEXT:    korw %k5, %k2, %k2
3242 ; KNL-NEXT:    movb {{[0-9]+}}(%rsp), %al
3243 ; KNL-NEXT:    kmovw %eax, %k5
3244 ; KNL-NEXT:    kshiftlw $12, %k5, %k5
3245 ; KNL-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k1 ## 2-byte Reload
3246 ; KNL-NEXT:    korw %k5, %k1, %k4
3247 ; KNL-NEXT:    kshiftlw $4, %k2, %k2
3248 ; KNL-NEXT:    kshiftrw $4, %k2, %k2
3249 ; KNL-NEXT:    korw %k4, %k2, %k2
3250 ; KNL-NEXT:    movb {{[0-9]+}}(%rsp), %al
3251 ; KNL-NEXT:    kmovw %eax, %k4
3252 ; KNL-NEXT:    kshiftlw $13, %k4, %k4
3253 ; KNL-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k1 ## 2-byte Reload
3254 ; KNL-NEXT:    korw %k4, %k1, %k3
3255 ; KNL-NEXT:    kshiftlw $3, %k2, %k2
3256 ; KNL-NEXT:    kshiftrw $3, %k2, %k2
3257 ; KNL-NEXT:    korw %k3, %k2, %k2
3258 ; KNL-NEXT:    movb {{[0-9]+}}(%rsp), %al
3259 ; KNL-NEXT:    kmovw %eax, %k3
3260 ; KNL-NEXT:    kshiftlw $14, %k3, %k3
3261 ; KNL-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k1 ## 2-byte Reload
3262 ; KNL-NEXT:    korw %k3, %k1, %k1
3263 ; KNL-NEXT:    kshiftlw $2, %k2, %k2
3264 ; KNL-NEXT:    kshiftrw $2, %k2, %k2
3265 ; KNL-NEXT:    korw %k1, %k2, %k1
3266 ; KNL-NEXT:    kshiftlw $1, %k1, %k1
3267 ; KNL-NEXT:    kshiftrw $1, %k1, %k1
3268 ; KNL-NEXT:    movb {{[0-9]+}}(%rsp), %al
3269 ; KNL-NEXT:    kmovw %eax, %k2
3270 ; KNL-NEXT:    kshiftlw $15, %k2, %k2
3271 ; KNL-NEXT:    korw %k2, %k1, %k1
3272 ; KNL-NEXT:    kmovw %k1, 6(%rdi)
3273 ; KNL-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k0 ## 2-byte Reload
3274 ; KNL-NEXT:    kmovw %k0, 4(%rdi)
3275 ; KNL-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k0 ## 2-byte Reload
3276 ; KNL-NEXT:    kmovw %k0, 2(%rdi)
3277 ; KNL-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k0 ## 2-byte Reload
3278 ; KNL-NEXT:    kmovw %k0, (%rdi)
3279 ; KNL-NEXT:    retq
3281 ; SKX-LABEL: store_64i1:
3282 ; SKX:       ## %bb.0:
3283 ; SKX-NEXT:    vpsllw $7, %zmm0, %zmm0
3284 ; SKX-NEXT:    vpmovb2m %zmm0, %k0
3285 ; SKX-NEXT:    kmovq %k0, (%rdi)
3286 ; SKX-NEXT:    vzeroupper
3287 ; SKX-NEXT:    retq
3289 ; AVX512BW-LABEL: store_64i1:
3290 ; AVX512BW:       ## %bb.0:
3291 ; AVX512BW-NEXT:    vpsllw $7, %zmm0, %zmm0
3292 ; AVX512BW-NEXT:    vpmovb2m %zmm0, %k0
3293 ; AVX512BW-NEXT:    kmovq %k0, (%rdi)
3294 ; AVX512BW-NEXT:    vzeroupper
3295 ; AVX512BW-NEXT:    retq
3297 ; AVX512DQ-LABEL: store_64i1:
3298 ; AVX512DQ:       ## %bb.0:
3299 ; AVX512DQ-NEXT:    kmovw %esi, %k0
3300 ; AVX512DQ-NEXT:    kshiftlw $15, %k0, %k0
3301 ; AVX512DQ-NEXT:    kshiftrw $15, %k0, %k0
3302 ; AVX512DQ-NEXT:    kshiftlw $2, %k0, %k2
3303 ; AVX512DQ-NEXT:    kmovw %k2, {{[-0-9]+}}(%r{{[sb]}}p) ## 2-byte Spill
3304 ; AVX512DQ-NEXT:    kmovw %edx, %k1
3305 ; AVX512DQ-NEXT:    kshiftlw $1, %k1, %k1
3306 ; AVX512DQ-NEXT:    korw %k1, %k2, %k1
3307 ; AVX512DQ-NEXT:    korw %k1, %k0, %k0
3308 ; AVX512DQ-NEXT:    kshiftlw $14, %k0, %k0
3309 ; AVX512DQ-NEXT:    kshiftrw $14, %k0, %k0
3310 ; AVX512DQ-NEXT:    kshiftlw $3, %k0, %k3
3311 ; AVX512DQ-NEXT:    kmovw %ecx, %k1
3312 ; AVX512DQ-NEXT:    kshiftlw $2, %k1, %k1
3313 ; AVX512DQ-NEXT:    korw %k1, %k3, %k1
3314 ; AVX512DQ-NEXT:    korw %k1, %k0, %k0
3315 ; AVX512DQ-NEXT:    kshiftlw $13, %k0, %k0
3316 ; AVX512DQ-NEXT:    kshiftrw $13, %k0, %k0
3317 ; AVX512DQ-NEXT:    kshiftlw $4, %k0, %k4
3318 ; AVX512DQ-NEXT:    kmovw %r8d, %k1
3319 ; AVX512DQ-NEXT:    kshiftlw $3, %k1, %k1
3320 ; AVX512DQ-NEXT:    korw %k1, %k4, %k1
3321 ; AVX512DQ-NEXT:    korw %k1, %k0, %k0
3322 ; AVX512DQ-NEXT:    kshiftlw $12, %k0, %k0
3323 ; AVX512DQ-NEXT:    kshiftrw $12, %k0, %k0
3324 ; AVX512DQ-NEXT:    kshiftlw $5, %k0, %k5
3325 ; AVX512DQ-NEXT:    kmovw %r9d, %k1
3326 ; AVX512DQ-NEXT:    kshiftlw $4, %k1, %k1
3327 ; AVX512DQ-NEXT:    korw %k1, %k5, %k1
3328 ; AVX512DQ-NEXT:    korw %k1, %k0, %k0
3329 ; AVX512DQ-NEXT:    kshiftlw $11, %k0, %k0
3330 ; AVX512DQ-NEXT:    kshiftrw $11, %k0, %k0
3331 ; AVX512DQ-NEXT:    kshiftlw $6, %k0, %k6
3332 ; AVX512DQ-NEXT:    movb {{[0-9]+}}(%rsp), %al
3333 ; AVX512DQ-NEXT:    kmovw %eax, %k1
3334 ; AVX512DQ-NEXT:    kshiftlw $5, %k1, %k1
3335 ; AVX512DQ-NEXT:    korw %k1, %k6, %k1
3336 ; AVX512DQ-NEXT:    korw %k1, %k0, %k0
3337 ; AVX512DQ-NEXT:    kshiftlw $10, %k0, %k0
3338 ; AVX512DQ-NEXT:    kshiftrw $10, %k0, %k0
3339 ; AVX512DQ-NEXT:    kshiftlw $7, %k0, %k7
3340 ; AVX512DQ-NEXT:    movb {{[0-9]+}}(%rsp), %al
3341 ; AVX512DQ-NEXT:    kmovw %eax, %k1
3342 ; AVX512DQ-NEXT:    kshiftlw $6, %k1, %k1
3343 ; AVX512DQ-NEXT:    korw %k1, %k7, %k1
3344 ; AVX512DQ-NEXT:    korw %k1, %k0, %k0
3345 ; AVX512DQ-NEXT:    kshiftlw $9, %k0, %k0
3346 ; AVX512DQ-NEXT:    kshiftrw $9, %k0, %k0
3347 ; AVX512DQ-NEXT:    movb {{[0-9]+}}(%rsp), %al
3348 ; AVX512DQ-NEXT:    kmovw %eax, %k1
3349 ; AVX512DQ-NEXT:    kshiftlw $7, %k1, %k1
3350 ; AVX512DQ-NEXT:    kshiftlw $8, %k0, %k2
3351 ; AVX512DQ-NEXT:    kmovw %k2, {{[-0-9]+}}(%r{{[sb]}}p) ## 2-byte Spill
3352 ; AVX512DQ-NEXT:    korw %k1, %k2, %k1
3353 ; AVX512DQ-NEXT:    korw %k1, %k0, %k0
3354 ; AVX512DQ-NEXT:    kshiftlw $8, %k0, %k0
3355 ; AVX512DQ-NEXT:    kshiftrw $8, %k0, %k0
3356 ; AVX512DQ-NEXT:    movb {{[0-9]+}}(%rsp), %al
3357 ; AVX512DQ-NEXT:    kmovw %eax, %k1
3358 ; AVX512DQ-NEXT:    kshiftlw $8, %k1, %k1
3359 ; AVX512DQ-NEXT:    kshiftlw $9, %k0, %k2
3360 ; AVX512DQ-NEXT:    kmovw %k2, {{[-0-9]+}}(%r{{[sb]}}p) ## 2-byte Spill
3361 ; AVX512DQ-NEXT:    korw %k1, %k2, %k1
3362 ; AVX512DQ-NEXT:    korw %k1, %k0, %k0
3363 ; AVX512DQ-NEXT:    kshiftlw $7, %k0, %k0
3364 ; AVX512DQ-NEXT:    kshiftrw $7, %k0, %k0
3365 ; AVX512DQ-NEXT:    movb {{[0-9]+}}(%rsp), %al
3366 ; AVX512DQ-NEXT:    kmovw %eax, %k1
3367 ; AVX512DQ-NEXT:    kshiftlw $9, %k1, %k1
3368 ; AVX512DQ-NEXT:    kshiftlw $10, %k0, %k2
3369 ; AVX512DQ-NEXT:    kmovw %k2, {{[-0-9]+}}(%r{{[sb]}}p) ## 2-byte Spill
3370 ; AVX512DQ-NEXT:    korw %k1, %k2, %k1
3371 ; AVX512DQ-NEXT:    korw %k1, %k0, %k0
3372 ; AVX512DQ-NEXT:    kshiftlw $6, %k0, %k0
3373 ; AVX512DQ-NEXT:    kshiftrw $6, %k0, %k0
3374 ; AVX512DQ-NEXT:    movb {{[0-9]+}}(%rsp), %al
3375 ; AVX512DQ-NEXT:    kmovw %eax, %k1
3376 ; AVX512DQ-NEXT:    kshiftlw $10, %k1, %k1
3377 ; AVX512DQ-NEXT:    kshiftlw $11, %k0, %k2
3378 ; AVX512DQ-NEXT:    kmovw %k2, {{[-0-9]+}}(%r{{[sb]}}p) ## 2-byte Spill
3379 ; AVX512DQ-NEXT:    korw %k1, %k2, %k1
3380 ; AVX512DQ-NEXT:    korw %k1, %k0, %k0
3381 ; AVX512DQ-NEXT:    kshiftlw $5, %k0, %k0
3382 ; AVX512DQ-NEXT:    kshiftrw $5, %k0, %k0
3383 ; AVX512DQ-NEXT:    movb {{[0-9]+}}(%rsp), %al
3384 ; AVX512DQ-NEXT:    kmovw %eax, %k1
3385 ; AVX512DQ-NEXT:    kshiftlw $11, %k1, %k1
3386 ; AVX512DQ-NEXT:    kshiftlw $12, %k0, %k2
3387 ; AVX512DQ-NEXT:    kmovw %k2, {{[-0-9]+}}(%r{{[sb]}}p) ## 2-byte Spill
3388 ; AVX512DQ-NEXT:    korw %k1, %k2, %k1
3389 ; AVX512DQ-NEXT:    korw %k1, %k0, %k0
3390 ; AVX512DQ-NEXT:    kshiftlw $4, %k0, %k0
3391 ; AVX512DQ-NEXT:    kshiftrw $4, %k0, %k0
3392 ; AVX512DQ-NEXT:    movb {{[0-9]+}}(%rsp), %al
3393 ; AVX512DQ-NEXT:    kmovw %eax, %k1
3394 ; AVX512DQ-NEXT:    kshiftlw $12, %k1, %k1
3395 ; AVX512DQ-NEXT:    kshiftlw $13, %k0, %k2
3396 ; AVX512DQ-NEXT:    kmovw %k2, {{[-0-9]+}}(%r{{[sb]}}p) ## 2-byte Spill
3397 ; AVX512DQ-NEXT:    korw %k1, %k2, %k1
3398 ; AVX512DQ-NEXT:    korw %k1, %k0, %k0
3399 ; AVX512DQ-NEXT:    kshiftlw $3, %k0, %k0
3400 ; AVX512DQ-NEXT:    kshiftrw $3, %k0, %k0
3401 ; AVX512DQ-NEXT:    movb {{[0-9]+}}(%rsp), %al
3402 ; AVX512DQ-NEXT:    kmovw %eax, %k1
3403 ; AVX512DQ-NEXT:    kshiftlw $13, %k1, %k1
3404 ; AVX512DQ-NEXT:    kshiftlw $14, %k0, %k2
3405 ; AVX512DQ-NEXT:    kmovw %k2, {{[-0-9]+}}(%r{{[sb]}}p) ## 2-byte Spill
3406 ; AVX512DQ-NEXT:    korw %k1, %k2, %k1
3407 ; AVX512DQ-NEXT:    korw %k1, %k0, %k0
3408 ; AVX512DQ-NEXT:    kshiftlw $2, %k0, %k0
3409 ; AVX512DQ-NEXT:    kshiftrw $2, %k0, %k2
3410 ; AVX512DQ-NEXT:    movb {{[0-9]+}}(%rsp), %al
3411 ; AVX512DQ-NEXT:    kmovw %eax, %k1
3412 ; AVX512DQ-NEXT:    kshiftlw $14, %k1, %k0
3413 ; AVX512DQ-NEXT:    kshiftlw $15, %k0, %k1
3414 ; AVX512DQ-NEXT:    kmovw %k1, {{[-0-9]+}}(%r{{[sb]}}p) ## 2-byte Spill
3415 ; AVX512DQ-NEXT:    korw %k0, %k1, %k0
3416 ; AVX512DQ-NEXT:    korw %k0, %k2, %k0
3417 ; AVX512DQ-NEXT:    kshiftlw $1, %k0, %k0
3418 ; AVX512DQ-NEXT:    kshiftrw $1, %k0, %k0
3419 ; AVX512DQ-NEXT:    movb {{[0-9]+}}(%rsp), %al
3420 ; AVX512DQ-NEXT:    kmovw %eax, %k2
3421 ; AVX512DQ-NEXT:    kshiftlw $15, %k2, %k2
3422 ; AVX512DQ-NEXT:    korw %k2, %k0, %k0
3423 ; AVX512DQ-NEXT:    kmovw %k0, {{[-0-9]+}}(%r{{[sb]}}p) ## 2-byte Spill
3424 ; AVX512DQ-NEXT:    movb {{[0-9]+}}(%rsp), %al
3425 ; AVX512DQ-NEXT:    kmovw %eax, %k0
3426 ; AVX512DQ-NEXT:    kshiftlw $15, %k0, %k0
3427 ; AVX512DQ-NEXT:    kshiftrw $15, %k0, %k0
3428 ; AVX512DQ-NEXT:    movb {{[0-9]+}}(%rsp), %al
3429 ; AVX512DQ-NEXT:    kmovw %eax, %k2
3430 ; AVX512DQ-NEXT:    kshiftlw $1, %k2, %k2
3431 ; AVX512DQ-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k1 ## 2-byte Reload
3432 ; AVX512DQ-NEXT:    korw %k2, %k1, %k2
3433 ; AVX512DQ-NEXT:    korw %k2, %k0, %k0
3434 ; AVX512DQ-NEXT:    kshiftlw $14, %k0, %k0
3435 ; AVX512DQ-NEXT:    kshiftrw $14, %k0, %k0
3436 ; AVX512DQ-NEXT:    movb {{[0-9]+}}(%rsp), %al
3437 ; AVX512DQ-NEXT:    kmovw %eax, %k2
3438 ; AVX512DQ-NEXT:    kshiftlw $2, %k2, %k2
3439 ; AVX512DQ-NEXT:    kmovw %k3, {{[-0-9]+}}(%r{{[sb]}}p) ## 2-byte Spill
3440 ; AVX512DQ-NEXT:    korw %k2, %k3, %k2
3441 ; AVX512DQ-NEXT:    korw %k2, %k0, %k0
3442 ; AVX512DQ-NEXT:    kshiftlw $13, %k0, %k0
3443 ; AVX512DQ-NEXT:    kshiftrw $13, %k0, %k0
3444 ; AVX512DQ-NEXT:    movb {{[0-9]+}}(%rsp), %al
3445 ; AVX512DQ-NEXT:    kmovw %eax, %k2
3446 ; AVX512DQ-NEXT:    kshiftlw $3, %k2, %k2
3447 ; AVX512DQ-NEXT:    kmovw %k4, {{[-0-9]+}}(%r{{[sb]}}p) ## 2-byte Spill
3448 ; AVX512DQ-NEXT:    korw %k2, %k4, %k2
3449 ; AVX512DQ-NEXT:    korw %k2, %k0, %k0
3450 ; AVX512DQ-NEXT:    kshiftlw $12, %k0, %k0
3451 ; AVX512DQ-NEXT:    kshiftrw $12, %k0, %k0
3452 ; AVX512DQ-NEXT:    movb {{[0-9]+}}(%rsp), %al
3453 ; AVX512DQ-NEXT:    kmovw %eax, %k2
3454 ; AVX512DQ-NEXT:    kshiftlw $4, %k2, %k2
3455 ; AVX512DQ-NEXT:    kmovw %k5, {{[-0-9]+}}(%r{{[sb]}}p) ## 2-byte Spill
3456 ; AVX512DQ-NEXT:    korw %k2, %k5, %k2
3457 ; AVX512DQ-NEXT:    korw %k2, %k0, %k0
3458 ; AVX512DQ-NEXT:    kshiftlw $11, %k0, %k0
3459 ; AVX512DQ-NEXT:    kshiftrw $11, %k0, %k0
3460 ; AVX512DQ-NEXT:    movb {{[0-9]+}}(%rsp), %al
3461 ; AVX512DQ-NEXT:    kmovw %eax, %k2
3462 ; AVX512DQ-NEXT:    kshiftlw $5, %k2, %k2
3463 ; AVX512DQ-NEXT:    korw %k2, %k6, %k2
3464 ; AVX512DQ-NEXT:    korw %k2, %k0, %k0
3465 ; AVX512DQ-NEXT:    kshiftlw $10, %k0, %k0
3466 ; AVX512DQ-NEXT:    kshiftrw $10, %k0, %k0
3467 ; AVX512DQ-NEXT:    movb {{[0-9]+}}(%rsp), %al
3468 ; AVX512DQ-NEXT:    kmovw %eax, %k2
3469 ; AVX512DQ-NEXT:    kshiftlw $6, %k2, %k2
3470 ; AVX512DQ-NEXT:    kmovw %k7, {{[-0-9]+}}(%r{{[sb]}}p) ## 2-byte Spill
3471 ; AVX512DQ-NEXT:    korw %k2, %k7, %k2
3472 ; AVX512DQ-NEXT:    korw %k2, %k0, %k0
3473 ; AVX512DQ-NEXT:    kshiftlw $9, %k0, %k0
3474 ; AVX512DQ-NEXT:    kshiftrw $9, %k0, %k0
3475 ; AVX512DQ-NEXT:    movb {{[0-9]+}}(%rsp), %al
3476 ; AVX512DQ-NEXT:    kmovw %eax, %k2
3477 ; AVX512DQ-NEXT:    kshiftlw $7, %k2, %k2
3478 ; AVX512DQ-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k1 ## 2-byte Reload
3479 ; AVX512DQ-NEXT:    korw %k2, %k1, %k2
3480 ; AVX512DQ-NEXT:    korw %k2, %k0, %k0
3481 ; AVX512DQ-NEXT:    kshiftlw $8, %k0, %k0
3482 ; AVX512DQ-NEXT:    kshiftrw $8, %k0, %k0
3483 ; AVX512DQ-NEXT:    movb {{[0-9]+}}(%rsp), %al
3484 ; AVX512DQ-NEXT:    kmovw %eax, %k2
3485 ; AVX512DQ-NEXT:    kshiftlw $8, %k2, %k2
3486 ; AVX512DQ-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k1 ## 2-byte Reload
3487 ; AVX512DQ-NEXT:    korw %k2, %k1, %k2
3488 ; AVX512DQ-NEXT:    korw %k2, %k0, %k0
3489 ; AVX512DQ-NEXT:    kshiftlw $7, %k0, %k0
3490 ; AVX512DQ-NEXT:    kshiftrw $7, %k0, %k0
3491 ; AVX512DQ-NEXT:    movb {{[0-9]+}}(%rsp), %al
3492 ; AVX512DQ-NEXT:    kmovw %eax, %k2
3493 ; AVX512DQ-NEXT:    kshiftlw $9, %k2, %k2
3494 ; AVX512DQ-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k1 ## 2-byte Reload
3495 ; AVX512DQ-NEXT:    korw %k2, %k1, %k2
3496 ; AVX512DQ-NEXT:    korw %k2, %k0, %k0
3497 ; AVX512DQ-NEXT:    kshiftlw $6, %k0, %k0
3498 ; AVX512DQ-NEXT:    kshiftrw $6, %k0, %k0
3499 ; AVX512DQ-NEXT:    movb {{[0-9]+}}(%rsp), %al
3500 ; AVX512DQ-NEXT:    kmovw %eax, %k2
3501 ; AVX512DQ-NEXT:    kshiftlw $10, %k2, %k2
3502 ; AVX512DQ-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k1 ## 2-byte Reload
3503 ; AVX512DQ-NEXT:    korw %k2, %k1, %k2
3504 ; AVX512DQ-NEXT:    korw %k2, %k0, %k0
3505 ; AVX512DQ-NEXT:    kshiftlw $5, %k0, %k0
3506 ; AVX512DQ-NEXT:    kshiftrw $5, %k0, %k0
3507 ; AVX512DQ-NEXT:    movb {{[0-9]+}}(%rsp), %al
3508 ; AVX512DQ-NEXT:    kmovw %eax, %k2
3509 ; AVX512DQ-NEXT:    kshiftlw $11, %k2, %k2
3510 ; AVX512DQ-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k1 ## 2-byte Reload
3511 ; AVX512DQ-NEXT:    korw %k2, %k1, %k2
3512 ; AVX512DQ-NEXT:    korw %k2, %k0, %k0
3513 ; AVX512DQ-NEXT:    kshiftlw $4, %k0, %k0
3514 ; AVX512DQ-NEXT:    kshiftrw $4, %k0, %k0
3515 ; AVX512DQ-NEXT:    movb {{[0-9]+}}(%rsp), %al
3516 ; AVX512DQ-NEXT:    kmovw %eax, %k2
3517 ; AVX512DQ-NEXT:    kshiftlw $12, %k2, %k2
3518 ; AVX512DQ-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k1 ## 2-byte Reload
3519 ; AVX512DQ-NEXT:    korw %k2, %k1, %k2
3520 ; AVX512DQ-NEXT:    korw %k2, %k0, %k0
3521 ; AVX512DQ-NEXT:    kshiftlw $3, %k0, %k0
3522 ; AVX512DQ-NEXT:    kshiftrw $3, %k0, %k0
3523 ; AVX512DQ-NEXT:    movb {{[0-9]+}}(%rsp), %al
3524 ; AVX512DQ-NEXT:    kmovw %eax, %k2
3525 ; AVX512DQ-NEXT:    kshiftlw $13, %k2, %k2
3526 ; AVX512DQ-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k1 ## 2-byte Reload
3527 ; AVX512DQ-NEXT:    korw %k2, %k1, %k2
3528 ; AVX512DQ-NEXT:    korw %k2, %k0, %k0
3529 ; AVX512DQ-NEXT:    kshiftlw $2, %k0, %k0
3530 ; AVX512DQ-NEXT:    kshiftrw $2, %k0, %k0
3531 ; AVX512DQ-NEXT:    movb {{[0-9]+}}(%rsp), %al
3532 ; AVX512DQ-NEXT:    kmovw %eax, %k2
3533 ; AVX512DQ-NEXT:    kshiftlw $14, %k2, %k2
3534 ; AVX512DQ-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k1 ## 2-byte Reload
3535 ; AVX512DQ-NEXT:    korw %k2, %k1, %k2
3536 ; AVX512DQ-NEXT:    korw %k2, %k0, %k0
3537 ; AVX512DQ-NEXT:    kshiftlw $1, %k0, %k0
3538 ; AVX512DQ-NEXT:    kshiftrw $1, %k0, %k0
3539 ; AVX512DQ-NEXT:    movb {{[0-9]+}}(%rsp), %al
3540 ; AVX512DQ-NEXT:    kmovw %eax, %k2
3541 ; AVX512DQ-NEXT:    kshiftlw $15, %k2, %k2
3542 ; AVX512DQ-NEXT:    korw %k2, %k0, %k0
3543 ; AVX512DQ-NEXT:    kmovw %k0, {{[-0-9]+}}(%r{{[sb]}}p) ## 2-byte Spill
3544 ; AVX512DQ-NEXT:    movb {{[0-9]+}}(%rsp), %al
3545 ; AVX512DQ-NEXT:    kmovw %eax, %k0
3546 ; AVX512DQ-NEXT:    kshiftlw $15, %k0, %k0
3547 ; AVX512DQ-NEXT:    kshiftrw $15, %k0, %k0
3548 ; AVX512DQ-NEXT:    movb {{[0-9]+}}(%rsp), %al
3549 ; AVX512DQ-NEXT:    kmovw %eax, %k2
3550 ; AVX512DQ-NEXT:    kshiftlw $1, %k2, %k2
3551 ; AVX512DQ-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k1 ## 2-byte Reload
3552 ; AVX512DQ-NEXT:    korw %k2, %k1, %k2
3553 ; AVX512DQ-NEXT:    korw %k2, %k0, %k0
3554 ; AVX512DQ-NEXT:    kshiftlw $14, %k0, %k0
3555 ; AVX512DQ-NEXT:    kshiftrw $14, %k0, %k0
3556 ; AVX512DQ-NEXT:    movb {{[0-9]+}}(%rsp), %al
3557 ; AVX512DQ-NEXT:    kmovw %eax, %k2
3558 ; AVX512DQ-NEXT:    kshiftlw $2, %k2, %k2
3559 ; AVX512DQ-NEXT:    korw %k2, %k3, %k2
3560 ; AVX512DQ-NEXT:    korw %k2, %k0, %k0
3561 ; AVX512DQ-NEXT:    kshiftlw $13, %k0, %k0
3562 ; AVX512DQ-NEXT:    kshiftrw $13, %k0, %k0
3563 ; AVX512DQ-NEXT:    movb {{[0-9]+}}(%rsp), %al
3564 ; AVX512DQ-NEXT:    kmovw %eax, %k2
3565 ; AVX512DQ-NEXT:    kshiftlw $3, %k2, %k2
3566 ; AVX512DQ-NEXT:    korw %k2, %k4, %k2
3567 ; AVX512DQ-NEXT:    korw %k2, %k0, %k0
3568 ; AVX512DQ-NEXT:    kshiftlw $12, %k0, %k0
3569 ; AVX512DQ-NEXT:    kshiftrw $12, %k0, %k0
3570 ; AVX512DQ-NEXT:    movb {{[0-9]+}}(%rsp), %al
3571 ; AVX512DQ-NEXT:    kmovw %eax, %k2
3572 ; AVX512DQ-NEXT:    kshiftlw $4, %k2, %k2
3573 ; AVX512DQ-NEXT:    korw %k2, %k5, %k2
3574 ; AVX512DQ-NEXT:    korw %k2, %k0, %k0
3575 ; AVX512DQ-NEXT:    kshiftlw $11, %k0, %k0
3576 ; AVX512DQ-NEXT:    kshiftrw $11, %k0, %k0
3577 ; AVX512DQ-NEXT:    movb {{[0-9]+}}(%rsp), %al
3578 ; AVX512DQ-NEXT:    kmovw %eax, %k2
3579 ; AVX512DQ-NEXT:    kshiftlw $5, %k2, %k2
3580 ; AVX512DQ-NEXT:    korw %k2, %k6, %k2
3581 ; AVX512DQ-NEXT:    korw %k2, %k0, %k0
3582 ; AVX512DQ-NEXT:    kshiftlw $10, %k0, %k0
3583 ; AVX512DQ-NEXT:    kshiftrw $10, %k0, %k0
3584 ; AVX512DQ-NEXT:    movb {{[0-9]+}}(%rsp), %al
3585 ; AVX512DQ-NEXT:    kmovw %eax, %k2
3586 ; AVX512DQ-NEXT:    kshiftlw $6, %k2, %k2
3587 ; AVX512DQ-NEXT:    korw %k2, %k7, %k2
3588 ; AVX512DQ-NEXT:    korw %k2, %k0, %k0
3589 ; AVX512DQ-NEXT:    kshiftlw $9, %k0, %k0
3590 ; AVX512DQ-NEXT:    kshiftrw $9, %k0, %k0
3591 ; AVX512DQ-NEXT:    movb {{[0-9]+}}(%rsp), %al
3592 ; AVX512DQ-NEXT:    kmovw %eax, %k2
3593 ; AVX512DQ-NEXT:    kshiftlw $7, %k2, %k2
3594 ; AVX512DQ-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k1 ## 2-byte Reload
3595 ; AVX512DQ-NEXT:    korw %k2, %k1, %k2
3596 ; AVX512DQ-NEXT:    korw %k2, %k0, %k0
3597 ; AVX512DQ-NEXT:    kshiftlw $8, %k0, %k0
3598 ; AVX512DQ-NEXT:    kshiftrw $8, %k0, %k0
3599 ; AVX512DQ-NEXT:    movb {{[0-9]+}}(%rsp), %al
3600 ; AVX512DQ-NEXT:    kmovw %eax, %k2
3601 ; AVX512DQ-NEXT:    kshiftlw $8, %k2, %k2
3602 ; AVX512DQ-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k3 ## 2-byte Reload
3603 ; AVX512DQ-NEXT:    korw %k2, %k3, %k2
3604 ; AVX512DQ-NEXT:    korw %k2, %k0, %k0
3605 ; AVX512DQ-NEXT:    kshiftlw $7, %k0, %k0
3606 ; AVX512DQ-NEXT:    kshiftrw $7, %k0, %k0
3607 ; AVX512DQ-NEXT:    movb {{[0-9]+}}(%rsp), %al
3608 ; AVX512DQ-NEXT:    kmovw %eax, %k2
3609 ; AVX512DQ-NEXT:    kshiftlw $9, %k2, %k2
3610 ; AVX512DQ-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k4 ## 2-byte Reload
3611 ; AVX512DQ-NEXT:    korw %k2, %k4, %k2
3612 ; AVX512DQ-NEXT:    korw %k2, %k0, %k0
3613 ; AVX512DQ-NEXT:    kshiftlw $6, %k0, %k0
3614 ; AVX512DQ-NEXT:    kshiftrw $6, %k0, %k0
3615 ; AVX512DQ-NEXT:    movb {{[0-9]+}}(%rsp), %al
3616 ; AVX512DQ-NEXT:    kmovw %eax, %k2
3617 ; AVX512DQ-NEXT:    kshiftlw $10, %k2, %k2
3618 ; AVX512DQ-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k5 ## 2-byte Reload
3619 ; AVX512DQ-NEXT:    korw %k2, %k5, %k2
3620 ; AVX512DQ-NEXT:    korw %k2, %k0, %k0
3621 ; AVX512DQ-NEXT:    kshiftlw $5, %k0, %k0
3622 ; AVX512DQ-NEXT:    kshiftrw $5, %k0, %k0
3623 ; AVX512DQ-NEXT:    movb {{[0-9]+}}(%rsp), %al
3624 ; AVX512DQ-NEXT:    kmovw %eax, %k2
3625 ; AVX512DQ-NEXT:    kshiftlw $11, %k2, %k2
3626 ; AVX512DQ-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k7 ## 2-byte Reload
3627 ; AVX512DQ-NEXT:    korw %k2, %k7, %k2
3628 ; AVX512DQ-NEXT:    korw %k2, %k0, %k0
3629 ; AVX512DQ-NEXT:    kshiftlw $4, %k0, %k0
3630 ; AVX512DQ-NEXT:    kshiftrw $4, %k0, %k0
3631 ; AVX512DQ-NEXT:    movb {{[0-9]+}}(%rsp), %al
3632 ; AVX512DQ-NEXT:    kmovw %eax, %k2
3633 ; AVX512DQ-NEXT:    kshiftlw $12, %k2, %k2
3634 ; AVX512DQ-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k7 ## 2-byte Reload
3635 ; AVX512DQ-NEXT:    korw %k2, %k7, %k2
3636 ; AVX512DQ-NEXT:    korw %k2, %k0, %k0
3637 ; AVX512DQ-NEXT:    kshiftlw $3, %k0, %k0
3638 ; AVX512DQ-NEXT:    kshiftrw $3, %k0, %k0
3639 ; AVX512DQ-NEXT:    movb {{[0-9]+}}(%rsp), %al
3640 ; AVX512DQ-NEXT:    kmovw %eax, %k2
3641 ; AVX512DQ-NEXT:    kshiftlw $13, %k2, %k2
3642 ; AVX512DQ-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k7 ## 2-byte Reload
3643 ; AVX512DQ-NEXT:    korw %k2, %k7, %k2
3644 ; AVX512DQ-NEXT:    korw %k2, %k0, %k0
3645 ; AVX512DQ-NEXT:    kshiftlw $2, %k0, %k0
3646 ; AVX512DQ-NEXT:    kshiftrw $2, %k0, %k0
3647 ; AVX512DQ-NEXT:    movb {{[0-9]+}}(%rsp), %al
3648 ; AVX512DQ-NEXT:    kmovw %eax, %k2
3649 ; AVX512DQ-NEXT:    kshiftlw $14, %k2, %k2
3650 ; AVX512DQ-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k7 ## 2-byte Reload
3651 ; AVX512DQ-NEXT:    korw %k2, %k7, %k2
3652 ; AVX512DQ-NEXT:    korw %k2, %k0, %k0
3653 ; AVX512DQ-NEXT:    kshiftlw $1, %k0, %k0
3654 ; AVX512DQ-NEXT:    kshiftrw $1, %k0, %k0
3655 ; AVX512DQ-NEXT:    movb {{[0-9]+}}(%rsp), %al
3656 ; AVX512DQ-NEXT:    kmovw %eax, %k2
3657 ; AVX512DQ-NEXT:    kshiftlw $15, %k2, %k2
3658 ; AVX512DQ-NEXT:    korw %k2, %k0, %k0
3659 ; AVX512DQ-NEXT:    kmovw %k0, {{[-0-9]+}}(%r{{[sb]}}p) ## 2-byte Spill
3660 ; AVX512DQ-NEXT:    movb {{[0-9]+}}(%rsp), %al
3661 ; AVX512DQ-NEXT:    kmovw %eax, %k2
3662 ; AVX512DQ-NEXT:    kshiftlw $1, %k2, %k2
3663 ; AVX512DQ-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k0 ## 2-byte Reload
3664 ; AVX512DQ-NEXT:    korw %k2, %k0, %k2
3665 ; AVX512DQ-NEXT:    movb {{[0-9]+}}(%rsp), %al
3666 ; AVX512DQ-NEXT:    kmovw %eax, %k7
3667 ; AVX512DQ-NEXT:    kshiftlw $15, %k7, %k7
3668 ; AVX512DQ-NEXT:    kshiftrw $15, %k7, %k7
3669 ; AVX512DQ-NEXT:    korw %k2, %k7, %k2
3670 ; AVX512DQ-NEXT:    movb {{[0-9]+}}(%rsp), %al
3671 ; AVX512DQ-NEXT:    kmovw %eax, %k7
3672 ; AVX512DQ-NEXT:    kshiftlw $2, %k7, %k7
3673 ; AVX512DQ-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k0 ## 2-byte Reload
3674 ; AVX512DQ-NEXT:    korw %k7, %k0, %k7
3675 ; AVX512DQ-NEXT:    kshiftlw $14, %k2, %k2
3676 ; AVX512DQ-NEXT:    kshiftrw $14, %k2, %k2
3677 ; AVX512DQ-NEXT:    korw %k7, %k2, %k2
3678 ; AVX512DQ-NEXT:    movb {{[0-9]+}}(%rsp), %al
3679 ; AVX512DQ-NEXT:    kmovw %eax, %k7
3680 ; AVX512DQ-NEXT:    kshiftlw $3, %k7, %k7
3681 ; AVX512DQ-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k0 ## 2-byte Reload
3682 ; AVX512DQ-NEXT:    korw %k7, %k0, %k7
3683 ; AVX512DQ-NEXT:    kshiftlw $13, %k2, %k2
3684 ; AVX512DQ-NEXT:    kshiftrw $13, %k2, %k2
3685 ; AVX512DQ-NEXT:    korw %k7, %k2, %k2
3686 ; AVX512DQ-NEXT:    movb {{[0-9]+}}(%rsp), %al
3687 ; AVX512DQ-NEXT:    kmovw %eax, %k7
3688 ; AVX512DQ-NEXT:    kshiftlw $4, %k7, %k7
3689 ; AVX512DQ-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k0 ## 2-byte Reload
3690 ; AVX512DQ-NEXT:    korw %k7, %k0, %k7
3691 ; AVX512DQ-NEXT:    kshiftlw $12, %k2, %k2
3692 ; AVX512DQ-NEXT:    kshiftrw $12, %k2, %k2
3693 ; AVX512DQ-NEXT:    korw %k7, %k2, %k2
3694 ; AVX512DQ-NEXT:    movb {{[0-9]+}}(%rsp), %al
3695 ; AVX512DQ-NEXT:    kmovw %eax, %k7
3696 ; AVX512DQ-NEXT:    kshiftlw $5, %k7, %k7
3697 ; AVX512DQ-NEXT:    korw %k7, %k6, %k7
3698 ; AVX512DQ-NEXT:    kshiftlw $11, %k2, %k2
3699 ; AVX512DQ-NEXT:    kshiftrw $11, %k2, %k2
3700 ; AVX512DQ-NEXT:    korw %k7, %k2, %k2
3701 ; AVX512DQ-NEXT:    movb {{[0-9]+}}(%rsp), %al
3702 ; AVX512DQ-NEXT:    kmovw %eax, %k7
3703 ; AVX512DQ-NEXT:    kshiftlw $6, %k7, %k7
3704 ; AVX512DQ-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k0 ## 2-byte Reload
3705 ; AVX512DQ-NEXT:    korw %k7, %k0, %k7
3706 ; AVX512DQ-NEXT:    kshiftlw $10, %k2, %k2
3707 ; AVX512DQ-NEXT:    kshiftrw $10, %k2, %k2
3708 ; AVX512DQ-NEXT:    korw %k7, %k2, %k2
3709 ; AVX512DQ-NEXT:    movb {{[0-9]+}}(%rsp), %al
3710 ; AVX512DQ-NEXT:    kmovw %eax, %k7
3711 ; AVX512DQ-NEXT:    kshiftlw $7, %k7, %k7
3712 ; AVX512DQ-NEXT:    korw %k7, %k1, %k7
3713 ; AVX512DQ-NEXT:    kshiftlw $9, %k2, %k2
3714 ; AVX512DQ-NEXT:    kshiftrw $9, %k2, %k2
3715 ; AVX512DQ-NEXT:    korw %k7, %k2, %k2
3716 ; AVX512DQ-NEXT:    movb {{[0-9]+}}(%rsp), %al
3717 ; AVX512DQ-NEXT:    kmovw %eax, %k7
3718 ; AVX512DQ-NEXT:    kshiftlw $8, %k7, %k7
3719 ; AVX512DQ-NEXT:    korw %k7, %k3, %k7
3720 ; AVX512DQ-NEXT:    kshiftlw $8, %k2, %k2
3721 ; AVX512DQ-NEXT:    kshiftrw $8, %k2, %k2
3722 ; AVX512DQ-NEXT:    korw %k7, %k2, %k2
3723 ; AVX512DQ-NEXT:    movb {{[0-9]+}}(%rsp), %al
3724 ; AVX512DQ-NEXT:    kmovw %eax, %k7
3725 ; AVX512DQ-NEXT:    kshiftlw $9, %k7, %k7
3726 ; AVX512DQ-NEXT:    korw %k7, %k4, %k7
3727 ; AVX512DQ-NEXT:    kshiftlw $7, %k2, %k2
3728 ; AVX512DQ-NEXT:    kshiftrw $7, %k2, %k2
3729 ; AVX512DQ-NEXT:    korw %k7, %k2, %k2
3730 ; AVX512DQ-NEXT:    movb {{[0-9]+}}(%rsp), %al
3731 ; AVX512DQ-NEXT:    kmovw %eax, %k7
3732 ; AVX512DQ-NEXT:    kshiftlw $10, %k7, %k7
3733 ; AVX512DQ-NEXT:    korw %k7, %k5, %k6
3734 ; AVX512DQ-NEXT:    kshiftlw $6, %k2, %k2
3735 ; AVX512DQ-NEXT:    kshiftrw $6, %k2, %k2
3736 ; AVX512DQ-NEXT:    korw %k6, %k2, %k2
3737 ; AVX512DQ-NEXT:    movb {{[0-9]+}}(%rsp), %al
3738 ; AVX512DQ-NEXT:    kmovw %eax, %k6
3739 ; AVX512DQ-NEXT:    kshiftlw $11, %k6, %k6
3740 ; AVX512DQ-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k1 ## 2-byte Reload
3741 ; AVX512DQ-NEXT:    korw %k6, %k1, %k5
3742 ; AVX512DQ-NEXT:    kshiftlw $5, %k2, %k2
3743 ; AVX512DQ-NEXT:    kshiftrw $5, %k2, %k2
3744 ; AVX512DQ-NEXT:    korw %k5, %k2, %k2
3745 ; AVX512DQ-NEXT:    movb {{[0-9]+}}(%rsp), %al
3746 ; AVX512DQ-NEXT:    kmovw %eax, %k5
3747 ; AVX512DQ-NEXT:    kshiftlw $12, %k5, %k5
3748 ; AVX512DQ-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k1 ## 2-byte Reload
3749 ; AVX512DQ-NEXT:    korw %k5, %k1, %k4
3750 ; AVX512DQ-NEXT:    kshiftlw $4, %k2, %k2
3751 ; AVX512DQ-NEXT:    kshiftrw $4, %k2, %k2
3752 ; AVX512DQ-NEXT:    korw %k4, %k2, %k2
3753 ; AVX512DQ-NEXT:    movb {{[0-9]+}}(%rsp), %al
3754 ; AVX512DQ-NEXT:    kmovw %eax, %k4
3755 ; AVX512DQ-NEXT:    kshiftlw $13, %k4, %k4
3756 ; AVX512DQ-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k1 ## 2-byte Reload
3757 ; AVX512DQ-NEXT:    korw %k4, %k1, %k3
3758 ; AVX512DQ-NEXT:    kshiftlw $3, %k2, %k2
3759 ; AVX512DQ-NEXT:    kshiftrw $3, %k2, %k2
3760 ; AVX512DQ-NEXT:    korw %k3, %k2, %k2
3761 ; AVX512DQ-NEXT:    movb {{[0-9]+}}(%rsp), %al
3762 ; AVX512DQ-NEXT:    kmovw %eax, %k3
3763 ; AVX512DQ-NEXT:    kshiftlw $14, %k3, %k3
3764 ; AVX512DQ-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k1 ## 2-byte Reload
3765 ; AVX512DQ-NEXT:    korw %k3, %k1, %k1
3766 ; AVX512DQ-NEXT:    kshiftlw $2, %k2, %k2
3767 ; AVX512DQ-NEXT:    kshiftrw $2, %k2, %k2
3768 ; AVX512DQ-NEXT:    korw %k1, %k2, %k1
3769 ; AVX512DQ-NEXT:    kshiftlw $1, %k1, %k1
3770 ; AVX512DQ-NEXT:    kshiftrw $1, %k1, %k1
3771 ; AVX512DQ-NEXT:    movb {{[0-9]+}}(%rsp), %al
3772 ; AVX512DQ-NEXT:    kmovw %eax, %k2
3773 ; AVX512DQ-NEXT:    kshiftlw $15, %k2, %k2
3774 ; AVX512DQ-NEXT:    korw %k2, %k1, %k1
3775 ; AVX512DQ-NEXT:    kmovw %k1, 6(%rdi)
3776 ; AVX512DQ-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k0 ## 2-byte Reload
3777 ; AVX512DQ-NEXT:    kmovw %k0, 4(%rdi)
3778 ; AVX512DQ-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k0 ## 2-byte Reload
3779 ; AVX512DQ-NEXT:    kmovw %k0, 2(%rdi)
3780 ; AVX512DQ-NEXT:    kmovw {{[-0-9]+}}(%r{{[sb]}}p), %k0 ## 2-byte Reload
3781 ; AVX512DQ-NEXT:    kmovw %k0, (%rdi)
3782 ; AVX512DQ-NEXT:    retq
3784 ; X86-LABEL: store_64i1:
3785 ; X86:       ## %bb.0:
3786 ; X86-NEXT:    vpsllw $7, %zmm0, %zmm0
3787 ; X86-NEXT:    vpmovb2m %zmm0, %k0
3788 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
3789 ; X86-NEXT:    kmovq %k0, (%eax)
3790 ; X86-NEXT:    vzeroupper
3791 ; X86-NEXT:    retl
3792   store <64 x i1> %v, <64 x i1>* %a
3793   ret void
3796 define i32 @test_bitcast_v8i1_zext(<16 x i32> %a) {
3797 ; KNL-LABEL: test_bitcast_v8i1_zext:
3798 ; KNL:       ## %bb.0:
3799 ; KNL-NEXT:    vptestnmd %zmm0, %zmm0, %k0
3800 ; KNL-NEXT:    kmovw %k0, %eax
3801 ; KNL-NEXT:    movzbl %al, %eax
3802 ; KNL-NEXT:    addl %eax, %eax
3803 ; KNL-NEXT:    vzeroupper
3804 ; KNL-NEXT:    retq
3806 ; SKX-LABEL: test_bitcast_v8i1_zext:
3807 ; SKX:       ## %bb.0:
3808 ; SKX-NEXT:    vptestnmd %zmm0, %zmm0, %k0
3809 ; SKX-NEXT:    kmovb %k0, %eax
3810 ; SKX-NEXT:    addl %eax, %eax
3811 ; SKX-NEXT:    vzeroupper
3812 ; SKX-NEXT:    retq
3814 ; AVX512BW-LABEL: test_bitcast_v8i1_zext:
3815 ; AVX512BW:       ## %bb.0:
3816 ; AVX512BW-NEXT:    vptestnmd %zmm0, %zmm0, %k0
3817 ; AVX512BW-NEXT:    kmovd %k0, %eax
3818 ; AVX512BW-NEXT:    movzbl %al, %eax
3819 ; AVX512BW-NEXT:    addl %eax, %eax
3820 ; AVX512BW-NEXT:    vzeroupper
3821 ; AVX512BW-NEXT:    retq
3823 ; AVX512DQ-LABEL: test_bitcast_v8i1_zext:
3824 ; AVX512DQ:       ## %bb.0:
3825 ; AVX512DQ-NEXT:    vptestnmd %zmm0, %zmm0, %k0
3826 ; AVX512DQ-NEXT:    kmovb %k0, %eax
3827 ; AVX512DQ-NEXT:    addl %eax, %eax
3828 ; AVX512DQ-NEXT:    vzeroupper
3829 ; AVX512DQ-NEXT:    retq
3831 ; X86-LABEL: test_bitcast_v8i1_zext:
3832 ; X86:       ## %bb.0:
3833 ; X86-NEXT:    vptestnmd %zmm0, %zmm0, %k0
3834 ; X86-NEXT:    kmovb %k0, %eax
3835 ; X86-NEXT:    addl %eax, %eax
3836 ; X86-NEXT:    vzeroupper
3837 ; X86-NEXT:    retl
3838    %v1 = icmp eq <16 x i32> %a, zeroinitializer
3839    %mask = shufflevector <16 x i1> %v1, <16 x i1> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
3840    %mask1 = bitcast <8 x i1> %mask to i8
3841    %val = zext i8 %mask1 to i32
3842    %val1 = add i32 %val, %val
3843    ret i32 %val1
3846 define i32 @test_bitcast_v16i1_zext(<16 x i32> %a) {
3847 ; CHECK-LABEL: test_bitcast_v16i1_zext:
3848 ; CHECK:       ## %bb.0:
3849 ; CHECK-NEXT:    vptestnmd %zmm0, %zmm0, %k0
3850 ; CHECK-NEXT:    kmovw %k0, %eax
3851 ; CHECK-NEXT:    addl %eax, %eax
3852 ; CHECK-NEXT:    vzeroupper
3853 ; CHECK-NEXT:    retq
3855 ; X86-LABEL: test_bitcast_v16i1_zext:
3856 ; X86:       ## %bb.0:
3857 ; X86-NEXT:    vptestnmd %zmm0, %zmm0, %k0
3858 ; X86-NEXT:    kmovw %k0, %eax
3859 ; X86-NEXT:    addl %eax, %eax
3860 ; X86-NEXT:    vzeroupper
3861 ; X86-NEXT:    retl
3862    %v1 = icmp eq <16 x i32> %a, zeroinitializer
3863    %mask1 = bitcast <16 x i1> %v1 to i16
3864    %val = zext i16 %mask1 to i32
3865    %val1 = add i32 %val, %val
3866    ret i32 %val1
3869 define i16 @test_v16i1_add(i16 %x, i16 %y) {
3870 ; KNL-LABEL: test_v16i1_add:
3871 ; KNL:       ## %bb.0:
3872 ; KNL-NEXT:    kmovw %edi, %k0
3873 ; KNL-NEXT:    kmovw %esi, %k1
3874 ; KNL-NEXT:    kxorw %k1, %k0, %k0
3875 ; KNL-NEXT:    kmovw %k0, %eax
3876 ; KNL-NEXT:    ## kill: def $ax killed $ax killed $eax
3877 ; KNL-NEXT:    retq
3879 ; SKX-LABEL: test_v16i1_add:
3880 ; SKX:       ## %bb.0:
3881 ; SKX-NEXT:    kmovd %edi, %k0
3882 ; SKX-NEXT:    kmovd %esi, %k1
3883 ; SKX-NEXT:    kxorw %k1, %k0, %k0
3884 ; SKX-NEXT:    kmovd %k0, %eax
3885 ; SKX-NEXT:    ## kill: def $ax killed $ax killed $eax
3886 ; SKX-NEXT:    retq
3888 ; AVX512BW-LABEL: test_v16i1_add:
3889 ; AVX512BW:       ## %bb.0:
3890 ; AVX512BW-NEXT:    kmovd %edi, %k0
3891 ; AVX512BW-NEXT:    kmovd %esi, %k1
3892 ; AVX512BW-NEXT:    kxorw %k1, %k0, %k0
3893 ; AVX512BW-NEXT:    kmovd %k0, %eax
3894 ; AVX512BW-NEXT:    ## kill: def $ax killed $ax killed $eax
3895 ; AVX512BW-NEXT:    retq
3897 ; AVX512DQ-LABEL: test_v16i1_add:
3898 ; AVX512DQ:       ## %bb.0:
3899 ; AVX512DQ-NEXT:    kmovw %edi, %k0
3900 ; AVX512DQ-NEXT:    kmovw %esi, %k1
3901 ; AVX512DQ-NEXT:    kxorw %k1, %k0, %k0
3902 ; AVX512DQ-NEXT:    kmovw %k0, %eax
3903 ; AVX512DQ-NEXT:    ## kill: def $ax killed $ax killed $eax
3904 ; AVX512DQ-NEXT:    retq
3906 ; X86-LABEL: test_v16i1_add:
3907 ; X86:       ## %bb.0:
3908 ; X86-NEXT:    kmovw {{[0-9]+}}(%esp), %k0
3909 ; X86-NEXT:    kmovw {{[0-9]+}}(%esp), %k1
3910 ; X86-NEXT:    kxorw %k1, %k0, %k0
3911 ; X86-NEXT:    kmovd %k0, %eax
3912 ; X86-NEXT:    ## kill: def $ax killed $ax killed $eax
3913 ; X86-NEXT:    retl
3914   %m0 = bitcast i16 %x to <16 x i1>
3915   %m1 = bitcast i16 %y to <16 x i1>
3916   %m2 = add <16 x i1> %m0,  %m1
3917   %ret = bitcast <16 x i1> %m2 to i16
3918   ret i16 %ret
3921 define i16 @test_v16i1_sub(i16 %x, i16 %y) {
3922 ; KNL-LABEL: test_v16i1_sub:
3923 ; KNL:       ## %bb.0:
3924 ; KNL-NEXT:    kmovw %edi, %k0
3925 ; KNL-NEXT:    kmovw %esi, %k1
3926 ; KNL-NEXT:    kxorw %k1, %k0, %k0
3927 ; KNL-NEXT:    kmovw %k0, %eax
3928 ; KNL-NEXT:    ## kill: def $ax killed $ax killed $eax
3929 ; KNL-NEXT:    retq
3931 ; SKX-LABEL: test_v16i1_sub:
3932 ; SKX:       ## %bb.0:
3933 ; SKX-NEXT:    kmovd %edi, %k0
3934 ; SKX-NEXT:    kmovd %esi, %k1
3935 ; SKX-NEXT:    kxorw %k1, %k0, %k0
3936 ; SKX-NEXT:    kmovd %k0, %eax
3937 ; SKX-NEXT:    ## kill: def $ax killed $ax killed $eax
3938 ; SKX-NEXT:    retq
3940 ; AVX512BW-LABEL: test_v16i1_sub:
3941 ; AVX512BW:       ## %bb.0:
3942 ; AVX512BW-NEXT:    kmovd %edi, %k0
3943 ; AVX512BW-NEXT:    kmovd %esi, %k1
3944 ; AVX512BW-NEXT:    kxorw %k1, %k0, %k0
3945 ; AVX512BW-NEXT:    kmovd %k0, %eax
3946 ; AVX512BW-NEXT:    ## kill: def $ax killed $ax killed $eax
3947 ; AVX512BW-NEXT:    retq
3949 ; AVX512DQ-LABEL: test_v16i1_sub:
3950 ; AVX512DQ:       ## %bb.0:
3951 ; AVX512DQ-NEXT:    kmovw %edi, %k0
3952 ; AVX512DQ-NEXT:    kmovw %esi, %k1
3953 ; AVX512DQ-NEXT:    kxorw %k1, %k0, %k0
3954 ; AVX512DQ-NEXT:    kmovw %k0, %eax
3955 ; AVX512DQ-NEXT:    ## kill: def $ax killed $ax killed $eax
3956 ; AVX512DQ-NEXT:    retq
3958 ; X86-LABEL: test_v16i1_sub:
3959 ; X86:       ## %bb.0:
3960 ; X86-NEXT:    kmovw {{[0-9]+}}(%esp), %k0
3961 ; X86-NEXT:    kmovw {{[0-9]+}}(%esp), %k1
3962 ; X86-NEXT:    kxorw %k1, %k0, %k0
3963 ; X86-NEXT:    kmovd %k0, %eax
3964 ; X86-NEXT:    ## kill: def $ax killed $ax killed $eax
3965 ; X86-NEXT:    retl
3966   %m0 = bitcast i16 %x to <16 x i1>
3967   %m1 = bitcast i16 %y to <16 x i1>
3968   %m2 = sub <16 x i1> %m0,  %m1
3969   %ret = bitcast <16 x i1> %m2 to i16
3970   ret i16 %ret
3973 define i16 @test_v16i1_mul(i16 %x, i16 %y) {
3974 ; KNL-LABEL: test_v16i1_mul:
3975 ; KNL:       ## %bb.0:
3976 ; KNL-NEXT:    kmovw %edi, %k0
3977 ; KNL-NEXT:    kmovw %esi, %k1
3978 ; KNL-NEXT:    kandw %k1, %k0, %k0
3979 ; KNL-NEXT:    kmovw %k0, %eax
3980 ; KNL-NEXT:    ## kill: def $ax killed $ax killed $eax
3981 ; KNL-NEXT:    retq
3983 ; SKX-LABEL: test_v16i1_mul:
3984 ; SKX:       ## %bb.0:
3985 ; SKX-NEXT:    kmovd %edi, %k0
3986 ; SKX-NEXT:    kmovd %esi, %k1
3987 ; SKX-NEXT:    kandw %k1, %k0, %k0
3988 ; SKX-NEXT:    kmovd %k0, %eax
3989 ; SKX-NEXT:    ## kill: def $ax killed $ax killed $eax
3990 ; SKX-NEXT:    retq
3992 ; AVX512BW-LABEL: test_v16i1_mul:
3993 ; AVX512BW:       ## %bb.0:
3994 ; AVX512BW-NEXT:    kmovd %edi, %k0
3995 ; AVX512BW-NEXT:    kmovd %esi, %k1
3996 ; AVX512BW-NEXT:    kandw %k1, %k0, %k0
3997 ; AVX512BW-NEXT:    kmovd %k0, %eax
3998 ; AVX512BW-NEXT:    ## kill: def $ax killed $ax killed $eax
3999 ; AVX512BW-NEXT:    retq
4001 ; AVX512DQ-LABEL: test_v16i1_mul:
4002 ; AVX512DQ:       ## %bb.0:
4003 ; AVX512DQ-NEXT:    kmovw %edi, %k0
4004 ; AVX512DQ-NEXT:    kmovw %esi, %k1
4005 ; AVX512DQ-NEXT:    kandw %k1, %k0, %k0
4006 ; AVX512DQ-NEXT:    kmovw %k0, %eax
4007 ; AVX512DQ-NEXT:    ## kill: def $ax killed $ax killed $eax
4008 ; AVX512DQ-NEXT:    retq
4010 ; X86-LABEL: test_v16i1_mul:
4011 ; X86:       ## %bb.0:
4012 ; X86-NEXT:    kmovw {{[0-9]+}}(%esp), %k0
4013 ; X86-NEXT:    kmovw {{[0-9]+}}(%esp), %k1
4014 ; X86-NEXT:    kandw %k1, %k0, %k0
4015 ; X86-NEXT:    kmovd %k0, %eax
4016 ; X86-NEXT:    ## kill: def $ax killed $ax killed $eax
4017 ; X86-NEXT:    retl
4018   %m0 = bitcast i16 %x to <16 x i1>
4019   %m1 = bitcast i16 %y to <16 x i1>
4020   %m2 = mul <16 x i1> %m0,  %m1
4021   %ret = bitcast <16 x i1> %m2 to i16
4022   ret i16 %ret
4025 define i8 @test_v8i1_add(i8 %x, i8 %y) {
4026 ; KNL-LABEL: test_v8i1_add:
4027 ; KNL:       ## %bb.0:
4028 ; KNL-NEXT:    kmovw %edi, %k0
4029 ; KNL-NEXT:    kmovw %esi, %k1
4030 ; KNL-NEXT:    kxorw %k1, %k0, %k0
4031 ; KNL-NEXT:    kmovw %k0, %eax
4032 ; KNL-NEXT:    ## kill: def $al killed $al killed $eax
4033 ; KNL-NEXT:    retq
4035 ; SKX-LABEL: test_v8i1_add:
4036 ; SKX:       ## %bb.0:
4037 ; SKX-NEXT:    kmovd %edi, %k0
4038 ; SKX-NEXT:    kmovd %esi, %k1
4039 ; SKX-NEXT:    kxorb %k1, %k0, %k0
4040 ; SKX-NEXT:    kmovd %k0, %eax
4041 ; SKX-NEXT:    ## kill: def $al killed $al killed $eax
4042 ; SKX-NEXT:    retq
4044 ; AVX512BW-LABEL: test_v8i1_add:
4045 ; AVX512BW:       ## %bb.0:
4046 ; AVX512BW-NEXT:    kmovd %edi, %k0
4047 ; AVX512BW-NEXT:    kmovd %esi, %k1
4048 ; AVX512BW-NEXT:    kxorw %k1, %k0, %k0
4049 ; AVX512BW-NEXT:    kmovd %k0, %eax
4050 ; AVX512BW-NEXT:    ## kill: def $al killed $al killed $eax
4051 ; AVX512BW-NEXT:    retq
4053 ; AVX512DQ-LABEL: test_v8i1_add:
4054 ; AVX512DQ:       ## %bb.0:
4055 ; AVX512DQ-NEXT:    kmovw %edi, %k0
4056 ; AVX512DQ-NEXT:    kmovw %esi, %k1
4057 ; AVX512DQ-NEXT:    kxorb %k1, %k0, %k0
4058 ; AVX512DQ-NEXT:    kmovw %k0, %eax
4059 ; AVX512DQ-NEXT:    ## kill: def $al killed $al killed $eax
4060 ; AVX512DQ-NEXT:    retq
4062 ; X86-LABEL: test_v8i1_add:
4063 ; X86:       ## %bb.0:
4064 ; X86-NEXT:    kmovb {{[0-9]+}}(%esp), %k0
4065 ; X86-NEXT:    kmovb {{[0-9]+}}(%esp), %k1
4066 ; X86-NEXT:    kxorb %k1, %k0, %k0
4067 ; X86-NEXT:    kmovd %k0, %eax
4068 ; X86-NEXT:    ## kill: def $al killed $al killed $eax
4069 ; X86-NEXT:    retl
4070   %m0 = bitcast i8 %x to <8 x i1>
4071   %m1 = bitcast i8 %y to <8 x i1>
4072   %m2 = add <8 x i1> %m0,  %m1
4073   %ret = bitcast <8 x i1> %m2 to i8
4074   ret i8 %ret
4077 define i8 @test_v8i1_sub(i8 %x, i8 %y) {
4078 ; KNL-LABEL: test_v8i1_sub:
4079 ; KNL:       ## %bb.0:
4080 ; KNL-NEXT:    kmovw %edi, %k0
4081 ; KNL-NEXT:    kmovw %esi, %k1
4082 ; KNL-NEXT:    kxorw %k1, %k0, %k0
4083 ; KNL-NEXT:    kmovw %k0, %eax
4084 ; KNL-NEXT:    ## kill: def $al killed $al killed $eax
4085 ; KNL-NEXT:    retq
4087 ; SKX-LABEL: test_v8i1_sub:
4088 ; SKX:       ## %bb.0:
4089 ; SKX-NEXT:    kmovd %edi, %k0
4090 ; SKX-NEXT:    kmovd %esi, %k1
4091 ; SKX-NEXT:    kxorb %k1, %k0, %k0
4092 ; SKX-NEXT:    kmovd %k0, %eax
4093 ; SKX-NEXT:    ## kill: def $al killed $al killed $eax
4094 ; SKX-NEXT:    retq
4096 ; AVX512BW-LABEL: test_v8i1_sub:
4097 ; AVX512BW:       ## %bb.0:
4098 ; AVX512BW-NEXT:    kmovd %edi, %k0
4099 ; AVX512BW-NEXT:    kmovd %esi, %k1
4100 ; AVX512BW-NEXT:    kxorw %k1, %k0, %k0
4101 ; AVX512BW-NEXT:    kmovd %k0, %eax
4102 ; AVX512BW-NEXT:    ## kill: def $al killed $al killed $eax
4103 ; AVX512BW-NEXT:    retq
4105 ; AVX512DQ-LABEL: test_v8i1_sub:
4106 ; AVX512DQ:       ## %bb.0:
4107 ; AVX512DQ-NEXT:    kmovw %edi, %k0
4108 ; AVX512DQ-NEXT:    kmovw %esi, %k1
4109 ; AVX512DQ-NEXT:    kxorb %k1, %k0, %k0
4110 ; AVX512DQ-NEXT:    kmovw %k0, %eax
4111 ; AVX512DQ-NEXT:    ## kill: def $al killed $al killed $eax
4112 ; AVX512DQ-NEXT:    retq
4114 ; X86-LABEL: test_v8i1_sub:
4115 ; X86:       ## %bb.0:
4116 ; X86-NEXT:    kmovb {{[0-9]+}}(%esp), %k0
4117 ; X86-NEXT:    kmovb {{[0-9]+}}(%esp), %k1
4118 ; X86-NEXT:    kxorb %k1, %k0, %k0
4119 ; X86-NEXT:    kmovd %k0, %eax
4120 ; X86-NEXT:    ## kill: def $al killed $al killed $eax
4121 ; X86-NEXT:    retl
4122   %m0 = bitcast i8 %x to <8 x i1>
4123   %m1 = bitcast i8 %y to <8 x i1>
4124   %m2 = sub <8 x i1> %m0,  %m1
4125   %ret = bitcast <8 x i1> %m2 to i8
4126   ret i8 %ret
4129 define i8 @test_v8i1_mul(i8 %x, i8 %y) {
4130 ; KNL-LABEL: test_v8i1_mul:
4131 ; KNL:       ## %bb.0:
4132 ; KNL-NEXT:    kmovw %edi, %k0
4133 ; KNL-NEXT:    kmovw %esi, %k1
4134 ; KNL-NEXT:    kandw %k1, %k0, %k0
4135 ; KNL-NEXT:    kmovw %k0, %eax
4136 ; KNL-NEXT:    ## kill: def $al killed $al killed $eax
4137 ; KNL-NEXT:    retq
4139 ; SKX-LABEL: test_v8i1_mul:
4140 ; SKX:       ## %bb.0:
4141 ; SKX-NEXT:    kmovd %edi, %k0
4142 ; SKX-NEXT:    kmovd %esi, %k1
4143 ; SKX-NEXT:    kandb %k1, %k0, %k0
4144 ; SKX-NEXT:    kmovd %k0, %eax
4145 ; SKX-NEXT:    ## kill: def $al killed $al killed $eax
4146 ; SKX-NEXT:    retq
4148 ; AVX512BW-LABEL: test_v8i1_mul:
4149 ; AVX512BW:       ## %bb.0:
4150 ; AVX512BW-NEXT:    kmovd %edi, %k0
4151 ; AVX512BW-NEXT:    kmovd %esi, %k1
4152 ; AVX512BW-NEXT:    kandw %k1, %k0, %k0
4153 ; AVX512BW-NEXT:    kmovd %k0, %eax
4154 ; AVX512BW-NEXT:    ## kill: def $al killed $al killed $eax
4155 ; AVX512BW-NEXT:    retq
4157 ; AVX512DQ-LABEL: test_v8i1_mul:
4158 ; AVX512DQ:       ## %bb.0:
4159 ; AVX512DQ-NEXT:    kmovw %edi, %k0
4160 ; AVX512DQ-NEXT:    kmovw %esi, %k1
4161 ; AVX512DQ-NEXT:    kandb %k1, %k0, %k0
4162 ; AVX512DQ-NEXT:    kmovw %k0, %eax
4163 ; AVX512DQ-NEXT:    ## kill: def $al killed $al killed $eax
4164 ; AVX512DQ-NEXT:    retq
4166 ; X86-LABEL: test_v8i1_mul:
4167 ; X86:       ## %bb.0:
4168 ; X86-NEXT:    kmovb {{[0-9]+}}(%esp), %k0
4169 ; X86-NEXT:    kmovb {{[0-9]+}}(%esp), %k1
4170 ; X86-NEXT:    kandb %k1, %k0, %k0
4171 ; X86-NEXT:    kmovd %k0, %eax
4172 ; X86-NEXT:    ## kill: def $al killed $al killed $eax
4173 ; X86-NEXT:    retl
4174   %m0 = bitcast i8 %x to <8 x i1>
4175   %m1 = bitcast i8 %y to <8 x i1>
4176   %m2 = mul <8 x i1> %m0,  %m1
4177   %ret = bitcast <8 x i1> %m2 to i8
4178   ret i8 %ret
4181 ; Make sure we don't emit a ktest for signed comparisons.
4182 define void @ktest_signed(<16 x i32> %x, <16 x i32> %y) {
4183 ; KNL-LABEL: ktest_signed:
4184 ; KNL:       ## %bb.0:
4185 ; KNL-NEXT:    pushq %rax
4186 ; KNL-NEXT:    .cfi_def_cfa_offset 16
4187 ; KNL-NEXT:    vpord %zmm1, %zmm0, %zmm0
4188 ; KNL-NEXT:    vptestnmd %zmm0, %zmm0, %k0
4189 ; KNL-NEXT:    kmovw %k0, %eax
4190 ; KNL-NEXT:    testw %ax, %ax
4191 ; KNL-NEXT:    jle LBB65_1
4192 ; KNL-NEXT:  ## %bb.2: ## %bb.2
4193 ; KNL-NEXT:    popq %rax
4194 ; KNL-NEXT:    vzeroupper
4195 ; KNL-NEXT:    retq
4196 ; KNL-NEXT:  LBB65_1: ## %bb.1
4197 ; KNL-NEXT:    vzeroupper
4198 ; KNL-NEXT:    callq _foo
4199 ; KNL-NEXT:    popq %rax
4200 ; KNL-NEXT:    retq
4202 ; SKX-LABEL: ktest_signed:
4203 ; SKX:       ## %bb.0:
4204 ; SKX-NEXT:    pushq %rax
4205 ; SKX-NEXT:    .cfi_def_cfa_offset 16
4206 ; SKX-NEXT:    vpord %zmm1, %zmm0, %zmm0
4207 ; SKX-NEXT:    vptestnmd %zmm0, %zmm0, %k0
4208 ; SKX-NEXT:    kmovd %k0, %eax
4209 ; SKX-NEXT:    testw %ax, %ax
4210 ; SKX-NEXT:    jle LBB65_1
4211 ; SKX-NEXT:  ## %bb.2: ## %bb.2
4212 ; SKX-NEXT:    popq %rax
4213 ; SKX-NEXT:    vzeroupper
4214 ; SKX-NEXT:    retq
4215 ; SKX-NEXT:  LBB65_1: ## %bb.1
4216 ; SKX-NEXT:    vzeroupper
4217 ; SKX-NEXT:    callq _foo
4218 ; SKX-NEXT:    popq %rax
4219 ; SKX-NEXT:    retq
4221 ; AVX512BW-LABEL: ktest_signed:
4222 ; AVX512BW:       ## %bb.0:
4223 ; AVX512BW-NEXT:    pushq %rax
4224 ; AVX512BW-NEXT:    .cfi_def_cfa_offset 16
4225 ; AVX512BW-NEXT:    vpord %zmm1, %zmm0, %zmm0
4226 ; AVX512BW-NEXT:    vptestnmd %zmm0, %zmm0, %k0
4227 ; AVX512BW-NEXT:    kmovd %k0, %eax
4228 ; AVX512BW-NEXT:    testw %ax, %ax
4229 ; AVX512BW-NEXT:    jle LBB65_1
4230 ; AVX512BW-NEXT:  ## %bb.2: ## %bb.2
4231 ; AVX512BW-NEXT:    popq %rax
4232 ; AVX512BW-NEXT:    vzeroupper
4233 ; AVX512BW-NEXT:    retq
4234 ; AVX512BW-NEXT:  LBB65_1: ## %bb.1
4235 ; AVX512BW-NEXT:    vzeroupper
4236 ; AVX512BW-NEXT:    callq _foo
4237 ; AVX512BW-NEXT:    popq %rax
4238 ; AVX512BW-NEXT:    retq
4240 ; AVX512DQ-LABEL: ktest_signed:
4241 ; AVX512DQ:       ## %bb.0:
4242 ; AVX512DQ-NEXT:    pushq %rax
4243 ; AVX512DQ-NEXT:    .cfi_def_cfa_offset 16
4244 ; AVX512DQ-NEXT:    vpord %zmm1, %zmm0, %zmm0
4245 ; AVX512DQ-NEXT:    vptestnmd %zmm0, %zmm0, %k0
4246 ; AVX512DQ-NEXT:    kmovw %k0, %eax
4247 ; AVX512DQ-NEXT:    testw %ax, %ax
4248 ; AVX512DQ-NEXT:    jle LBB65_1
4249 ; AVX512DQ-NEXT:  ## %bb.2: ## %bb.2
4250 ; AVX512DQ-NEXT:    popq %rax
4251 ; AVX512DQ-NEXT:    vzeroupper
4252 ; AVX512DQ-NEXT:    retq
4253 ; AVX512DQ-NEXT:  LBB65_1: ## %bb.1
4254 ; AVX512DQ-NEXT:    vzeroupper
4255 ; AVX512DQ-NEXT:    callq _foo
4256 ; AVX512DQ-NEXT:    popq %rax
4257 ; AVX512DQ-NEXT:    retq
4259 ; X86-LABEL: ktest_signed:
4260 ; X86:       ## %bb.0:
4261 ; X86-NEXT:    subl $12, %esp
4262 ; X86-NEXT:    .cfi_def_cfa_offset 16
4263 ; X86-NEXT:    vpord %zmm1, %zmm0, %zmm0
4264 ; X86-NEXT:    vptestnmd %zmm0, %zmm0, %k0
4265 ; X86-NEXT:    kmovd %k0, %eax
4266 ; X86-NEXT:    testw %ax, %ax
4267 ; X86-NEXT:    jle LBB65_1
4268 ; X86-NEXT:  ## %bb.2: ## %bb.2
4269 ; X86-NEXT:    addl $12, %esp
4270 ; X86-NEXT:    vzeroupper
4271 ; X86-NEXT:    retl
4272 ; X86-NEXT:  LBB65_1: ## %bb.1
4273 ; X86-NEXT:    vzeroupper
4274 ; X86-NEXT:    calll _foo
4275 ; X86-NEXT:    addl $12, %esp
4276 ; X86-NEXT:    retl
4277   %a = icmp eq <16 x i32> %x, zeroinitializer
4278   %b = icmp eq <16 x i32> %y, zeroinitializer
4279   %c = and <16 x i1> %a, %b
4280   %d = bitcast <16 x i1> %c to i16
4281   %e = icmp sgt i16 %d, 0
4282   br i1 %e, label %bb.2, label %bb.1
4283 bb.1:
4284   call void @foo()
4285   br label %bb.2
4286 bb.2:
4287   ret void
4289 declare void @foo()
4291 ; Make sure we can use the C flag from kortest to check for all ones.
4292 define void @ktest_allones(<16 x i32> %x, <16 x i32> %y) {
4293 ; CHECK-LABEL: ktest_allones:
4294 ; CHECK:       ## %bb.0:
4295 ; CHECK-NEXT:    pushq %rax
4296 ; CHECK-NEXT:    .cfi_def_cfa_offset 16
4297 ; CHECK-NEXT:    vpord %zmm1, %zmm0, %zmm0
4298 ; CHECK-NEXT:    vptestnmd %zmm0, %zmm0, %k0
4299 ; CHECK-NEXT:    kortestw %k0, %k0
4300 ; CHECK-NEXT:    jb LBB66_2
4301 ; CHECK-NEXT:  ## %bb.1: ## %bb.1
4302 ; CHECK-NEXT:    vzeroupper
4303 ; CHECK-NEXT:    callq _foo
4304 ; CHECK-NEXT:  LBB66_2: ## %bb.2
4305 ; CHECK-NEXT:    popq %rax
4306 ; CHECK-NEXT:    vzeroupper
4307 ; CHECK-NEXT:    retq
4309 ; X86-LABEL: ktest_allones:
4310 ; X86:       ## %bb.0:
4311 ; X86-NEXT:    subl $12, %esp
4312 ; X86-NEXT:    .cfi_def_cfa_offset 16
4313 ; X86-NEXT:    vpord %zmm1, %zmm0, %zmm0
4314 ; X86-NEXT:    vptestnmd %zmm0, %zmm0, %k0
4315 ; X86-NEXT:    kortestw %k0, %k0
4316 ; X86-NEXT:    jb LBB66_2
4317 ; X86-NEXT:  ## %bb.1: ## %bb.1
4318 ; X86-NEXT:    vzeroupper
4319 ; X86-NEXT:    calll _foo
4320 ; X86-NEXT:  LBB66_2: ## %bb.2
4321 ; X86-NEXT:    addl $12, %esp
4322 ; X86-NEXT:    vzeroupper
4323 ; X86-NEXT:    retl
4324   %a = icmp eq <16 x i32> %x, zeroinitializer
4325   %b = icmp eq <16 x i32> %y, zeroinitializer
4326   %c = and <16 x i1> %a, %b
4327   %d = bitcast <16 x i1> %c to i16
4328   %e = icmp eq i16 %d, -1
4329   br i1 %e, label %bb.2, label %bb.1
4330 bb.1:
4331   call void @foo()
4332   br label %bb.2
4333 bb.2:
4334   ret void
4337 ; This is derived from an intrinsic test where v4i1 mask was created by _mm_cmp_epi32_mask, then it was passed to _mm512_mask_blend_epi32 which uses a v16i1 mask.
4338 ; The widening happens in the scalar domain between the intrinsics. The middle end optmized it to this.
4339 define <8 x i64> @mask_widening(<2 x i64> %a, <2 x i64> %b, <2 x i64> %c, <2 x i64> %d, <8 x i64> %e, <8 x i64> %f) {
4340 ; KNL-LABEL: mask_widening:
4341 ; KNL:       ## %bb.0: ## %entry
4342 ; KNL-NEXT:    ## kill: def $xmm1 killed $xmm1 def $zmm1
4343 ; KNL-NEXT:    ## kill: def $xmm0 killed $xmm0 def $zmm0
4344 ; KNL-NEXT:    vpcmpeqd %zmm1, %zmm0, %k0
4345 ; KNL-NEXT:    kshiftlw $12, %k0, %k0
4346 ; KNL-NEXT:    kshiftrw $12, %k0, %k1
4347 ; KNL-NEXT:    vpblendmd %zmm5, %zmm4, %zmm0 {%k1}
4348 ; KNL-NEXT:    retq
4350 ; SKX-LABEL: mask_widening:
4351 ; SKX:       ## %bb.0: ## %entry
4352 ; SKX-NEXT:    vpcmpeqd %xmm1, %xmm0, %k1
4353 ; SKX-NEXT:    vpblendmd %zmm5, %zmm4, %zmm0 {%k1}
4354 ; SKX-NEXT:    retq
4356 ; AVX512BW-LABEL: mask_widening:
4357 ; AVX512BW:       ## %bb.0: ## %entry
4358 ; AVX512BW-NEXT:    ## kill: def $xmm1 killed $xmm1 def $zmm1
4359 ; AVX512BW-NEXT:    ## kill: def $xmm0 killed $xmm0 def $zmm0
4360 ; AVX512BW-NEXT:    vpcmpeqd %zmm1, %zmm0, %k0
4361 ; AVX512BW-NEXT:    kshiftlw $12, %k0, %k0
4362 ; AVX512BW-NEXT:    kshiftrw $12, %k0, %k1
4363 ; AVX512BW-NEXT:    vpblendmd %zmm5, %zmm4, %zmm0 {%k1}
4364 ; AVX512BW-NEXT:    retq
4366 ; AVX512DQ-LABEL: mask_widening:
4367 ; AVX512DQ:       ## %bb.0: ## %entry
4368 ; AVX512DQ-NEXT:    ## kill: def $xmm1 killed $xmm1 def $zmm1
4369 ; AVX512DQ-NEXT:    ## kill: def $xmm0 killed $xmm0 def $zmm0
4370 ; AVX512DQ-NEXT:    vpcmpeqd %zmm1, %zmm0, %k0
4371 ; AVX512DQ-NEXT:    kshiftlw $12, %k0, %k0
4372 ; AVX512DQ-NEXT:    kshiftrw $12, %k0, %k1
4373 ; AVX512DQ-NEXT:    vpblendmd %zmm5, %zmm4, %zmm0 {%k1}
4374 ; AVX512DQ-NEXT:    retq
4376 ; X86-LABEL: mask_widening:
4377 ; X86:       ## %bb.0: ## %entry
4378 ; X86-NEXT:    pushl %ebp
4379 ; X86-NEXT:    .cfi_def_cfa_offset 8
4380 ; X86-NEXT:    .cfi_offset %ebp, -8
4381 ; X86-NEXT:    movl %esp, %ebp
4382 ; X86-NEXT:    .cfi_def_cfa_register %ebp
4383 ; X86-NEXT:    andl $-64, %esp
4384 ; X86-NEXT:    subl $64, %esp
4385 ; X86-NEXT:    vpcmpeqd %xmm1, %xmm0, %k1
4386 ; X86-NEXT:    vmovdqa64 8(%ebp), %zmm0
4387 ; X86-NEXT:    vmovdqa32 72(%ebp), %zmm0 {%k1}
4388 ; X86-NEXT:    movl %ebp, %esp
4389 ; X86-NEXT:    popl %ebp
4390 ; X86-NEXT:    retl
4391 entry:
4392   %0 = bitcast <2 x i64> %a to <4 x i32>
4393   %1 = bitcast <2 x i64> %b to <4 x i32>
4394   %2 = icmp eq <4 x i32> %0, %1
4395   %3 = shufflevector <4 x i1> %2, <4 x i1> zeroinitializer, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
4396   %4 = bitcast <8 x i64> %f to <16 x i32>
4397   %5 = bitcast <8 x i64> %e to <16 x i32>
4398   %6 = shufflevector <8 x i1> %3, <8 x i1> <i1 false, i1 undef, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false>, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 8, i32 8, i32 8, i32 8, i32 8, i32 8, i32 8>
4399   %7 = select <16 x i1> %6, <16 x i32> %4, <16 x i32> %5
4400   %8 = bitcast <16 x i32> %7 to <8 x i64>
4401   ret <8 x i64> %8
4404 define void @store_v64i1_constant(<64 x i1>* %R) {
4405 ; CHECK-LABEL: store_v64i1_constant:
4406 ; CHECK:       ## %bb.0: ## %entry
4407 ; CHECK-NEXT:    movabsq $-2305843576149381123, %rax ## imm = 0xDFFFFF7BFFFFEFFD
4408 ; CHECK-NEXT:    movq %rax, (%rdi)
4409 ; CHECK-NEXT:    retq
4411 ; X86-LABEL: store_v64i1_constant:
4412 ; X86:       ## %bb.0: ## %entry
4413 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
4414 ; X86-NEXT:    movl $-536871045, 4(%eax) ## imm = 0xDFFFFF7B
4415 ; X86-NEXT:    movl $-4099, (%eax) ## imm = 0xEFFD
4416 ; X86-NEXT:    retl
4417 entry:
4418   store <64 x i1> <i1 1, i1 0, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 0, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 0, i1 1, i1 1, i1 1, i1 1, i1 0, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 0, i1 1, i1 1>, <64 x i1>* %R
4419   ret void
4422 define void @store_v2i1_constant(<2 x i1>* %R) {
4423 ; CHECK-LABEL: store_v2i1_constant:
4424 ; CHECK:       ## %bb.0: ## %entry
4425 ; CHECK-NEXT:    movb $1, (%rdi)
4426 ; CHECK-NEXT:    retq
4428 ; X86-LABEL: store_v2i1_constant:
4429 ; X86:       ## %bb.0: ## %entry
4430 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
4431 ; X86-NEXT:    movb $1, (%eax)
4432 ; X86-NEXT:    retl
4433 entry:
4434   store <2 x i1> <i1 1, i1 0>, <2 x i1>* %R
4435   ret void
4438 define void @store_v4i1_constant(<4 x i1>* %R) {
4439 ; CHECK-LABEL: store_v4i1_constant:
4440 ; CHECK:       ## %bb.0: ## %entry
4441 ; CHECK-NEXT:    movb $5, (%rdi)
4442 ; CHECK-NEXT:    retq
4444 ; X86-LABEL: store_v4i1_constant:
4445 ; X86:       ## %bb.0: ## %entry
4446 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
4447 ; X86-NEXT:    movb $5, (%eax)
4448 ; X86-NEXT:    retl
4449 entry:
4450   store <4 x i1> <i1 1, i1 0, i1 1, i1 0>, <4 x i1>* %R
4451   ret void
4454 ; Make sure we bring the -1 constant into the mask domain.
4455 define void @mask_not_cast(i8*, <8 x i64>, <8 x i64>, <8 x i64>, <8 x i64>) {
4456 ; CHECK-LABEL: mask_not_cast:
4457 ; CHECK:       ## %bb.0:
4458 ; CHECK-NEXT:    vpcmpnleud %zmm3, %zmm2, %k1
4459 ; CHECK-NEXT:    vptestmd %zmm0, %zmm1, %k1 {%k1}
4460 ; CHECK-NEXT:    vmovdqu32 %zmm0, (%rdi) {%k1}
4461 ; CHECK-NEXT:    vzeroupper
4462 ; CHECK-NEXT:    retq
4464 ; X86-LABEL: mask_not_cast:
4465 ; X86:       ## %bb.0:
4466 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
4467 ; X86-NEXT:    vpcmpnleud %zmm3, %zmm2, %k1
4468 ; X86-NEXT:    vptestmd %zmm0, %zmm1, %k1 {%k1}
4469 ; X86-NEXT:    vmovdqu32 %zmm0, (%eax) {%k1}
4470 ; X86-NEXT:    vzeroupper
4471 ; X86-NEXT:    retl
4472   %6 = and <8 x i64> %2, %1
4473   %7 = bitcast <8 x i64> %6 to <16 x i32>
4474   %8 = icmp ne <16 x i32> %7, zeroinitializer
4475   %9 = bitcast <16 x i1> %8 to i16
4476   %10 = bitcast <8 x i64> %3 to <16 x i32>
4477   %11 = bitcast <8 x i64> %4 to <16 x i32>
4478   %12 = icmp ule <16 x i32> %10, %11
4479   %13 = bitcast <16 x i1> %12 to i16
4480   %14 = xor i16 %13, -1
4481   %15 = and i16 %14, %9
4482   %16 = bitcast <8 x i64> %1 to <16 x i32>
4483   %17 = bitcast i8* %0 to <16 x i32>*
4484   %18 = bitcast i16 %15 to <16 x i1>
4485   tail call void @llvm.masked.store.v16i32.p0v16i32(<16 x i32> %16, <16 x i32>* %17, i32 1, <16 x i1> %18) #2
4486   ret void
4488 declare void @llvm.masked.store.v16i32.p0v16i32(<16 x i32>, <16 x i32>*, i32, <16 x i1>)
4490 define void @ktest_3(<8 x i32> %w, <8 x i32> %x, <8 x i32> %y, <8 x i32> %z) {
4491 ; KNL-LABEL: ktest_3:
4492 ; KNL:       ## %bb.0:
4493 ; KNL-NEXT:    pushq %rax
4494 ; KNL-NEXT:    .cfi_def_cfa_offset 16
4495 ; KNL-NEXT:    ## kill: def $ymm3 killed $ymm3 def $zmm3
4496 ; KNL-NEXT:    ## kill: def $ymm2 killed $ymm2 def $zmm2
4497 ; KNL-NEXT:    ## kill: def $ymm1 killed $ymm1 def $zmm1
4498 ; KNL-NEXT:    ## kill: def $ymm0 killed $ymm0 def $zmm0
4499 ; KNL-NEXT:    vptestnmd %zmm0, %zmm0, %k0
4500 ; KNL-NEXT:    vptestnmd %zmm1, %zmm1, %k1
4501 ; KNL-NEXT:    vptestnmd %zmm2, %zmm2, %k2
4502 ; KNL-NEXT:    vptestnmd %zmm3, %zmm3, %k3
4503 ; KNL-NEXT:    korw %k1, %k0, %k0
4504 ; KNL-NEXT:    korw %k3, %k2, %k1
4505 ; KNL-NEXT:    kandw %k1, %k0, %k0
4506 ; KNL-NEXT:    kmovw %k0, %eax
4507 ; KNL-NEXT:    testb %al, %al
4508 ; KNL-NEXT:    je LBB72_1
4509 ; KNL-NEXT:  ## %bb.2: ## %exit
4510 ; KNL-NEXT:    popq %rax
4511 ; KNL-NEXT:    vzeroupper
4512 ; KNL-NEXT:    retq
4513 ; KNL-NEXT:  LBB72_1: ## %bar
4514 ; KNL-NEXT:    vzeroupper
4515 ; KNL-NEXT:    callq _foo
4516 ; KNL-NEXT:    popq %rax
4517 ; KNL-NEXT:    retq
4519 ; SKX-LABEL: ktest_3:
4520 ; SKX:       ## %bb.0:
4521 ; SKX-NEXT:    pushq %rax
4522 ; SKX-NEXT:    .cfi_def_cfa_offset 16
4523 ; SKX-NEXT:    vptestnmd %ymm0, %ymm0, %k0
4524 ; SKX-NEXT:    vptestnmd %ymm1, %ymm1, %k1
4525 ; SKX-NEXT:    korb %k1, %k0, %k0
4526 ; SKX-NEXT:    vptestnmd %ymm2, %ymm2, %k1
4527 ; SKX-NEXT:    vptestnmd %ymm3, %ymm3, %k2
4528 ; SKX-NEXT:    korb %k2, %k1, %k1
4529 ; SKX-NEXT:    ktestb %k1, %k0
4530 ; SKX-NEXT:    je LBB72_1
4531 ; SKX-NEXT:  ## %bb.2: ## %exit
4532 ; SKX-NEXT:    popq %rax
4533 ; SKX-NEXT:    vzeroupper
4534 ; SKX-NEXT:    retq
4535 ; SKX-NEXT:  LBB72_1: ## %bar
4536 ; SKX-NEXT:    vzeroupper
4537 ; SKX-NEXT:    callq _foo
4538 ; SKX-NEXT:    popq %rax
4539 ; SKX-NEXT:    retq
4541 ; AVX512BW-LABEL: ktest_3:
4542 ; AVX512BW:       ## %bb.0:
4543 ; AVX512BW-NEXT:    pushq %rax
4544 ; AVX512BW-NEXT:    .cfi_def_cfa_offset 16
4545 ; AVX512BW-NEXT:    ## kill: def $ymm3 killed $ymm3 def $zmm3
4546 ; AVX512BW-NEXT:    ## kill: def $ymm2 killed $ymm2 def $zmm2
4547 ; AVX512BW-NEXT:    ## kill: def $ymm1 killed $ymm1 def $zmm1
4548 ; AVX512BW-NEXT:    ## kill: def $ymm0 killed $ymm0 def $zmm0
4549 ; AVX512BW-NEXT:    vptestnmd %zmm0, %zmm0, %k0
4550 ; AVX512BW-NEXT:    vptestnmd %zmm1, %zmm1, %k1
4551 ; AVX512BW-NEXT:    vptestnmd %zmm2, %zmm2, %k2
4552 ; AVX512BW-NEXT:    vptestnmd %zmm3, %zmm3, %k3
4553 ; AVX512BW-NEXT:    korw %k1, %k0, %k0
4554 ; AVX512BW-NEXT:    korw %k3, %k2, %k1
4555 ; AVX512BW-NEXT:    kandw %k1, %k0, %k0
4556 ; AVX512BW-NEXT:    kmovd %k0, %eax
4557 ; AVX512BW-NEXT:    testb %al, %al
4558 ; AVX512BW-NEXT:    je LBB72_1
4559 ; AVX512BW-NEXT:  ## %bb.2: ## %exit
4560 ; AVX512BW-NEXT:    popq %rax
4561 ; AVX512BW-NEXT:    vzeroupper
4562 ; AVX512BW-NEXT:    retq
4563 ; AVX512BW-NEXT:  LBB72_1: ## %bar
4564 ; AVX512BW-NEXT:    vzeroupper
4565 ; AVX512BW-NEXT:    callq _foo
4566 ; AVX512BW-NEXT:    popq %rax
4567 ; AVX512BW-NEXT:    retq
4569 ; AVX512DQ-LABEL: ktest_3:
4570 ; AVX512DQ:       ## %bb.0:
4571 ; AVX512DQ-NEXT:    pushq %rax
4572 ; AVX512DQ-NEXT:    .cfi_def_cfa_offset 16
4573 ; AVX512DQ-NEXT:    ## kill: def $ymm3 killed $ymm3 def $zmm3
4574 ; AVX512DQ-NEXT:    ## kill: def $ymm2 killed $ymm2 def $zmm2
4575 ; AVX512DQ-NEXT:    ## kill: def $ymm1 killed $ymm1 def $zmm1
4576 ; AVX512DQ-NEXT:    ## kill: def $ymm0 killed $ymm0 def $zmm0
4577 ; AVX512DQ-NEXT:    vptestnmd %zmm0, %zmm0, %k0
4578 ; AVX512DQ-NEXT:    vptestnmd %zmm1, %zmm1, %k1
4579 ; AVX512DQ-NEXT:    vptestnmd %zmm2, %zmm2, %k2
4580 ; AVX512DQ-NEXT:    vptestnmd %zmm3, %zmm3, %k3
4581 ; AVX512DQ-NEXT:    korb %k1, %k0, %k0
4582 ; AVX512DQ-NEXT:    korb %k3, %k2, %k1
4583 ; AVX512DQ-NEXT:    ktestb %k1, %k0
4584 ; AVX512DQ-NEXT:    je LBB72_1
4585 ; AVX512DQ-NEXT:  ## %bb.2: ## %exit
4586 ; AVX512DQ-NEXT:    popq %rax
4587 ; AVX512DQ-NEXT:    vzeroupper
4588 ; AVX512DQ-NEXT:    retq
4589 ; AVX512DQ-NEXT:  LBB72_1: ## %bar
4590 ; AVX512DQ-NEXT:    vzeroupper
4591 ; AVX512DQ-NEXT:    callq _foo
4592 ; AVX512DQ-NEXT:    popq %rax
4593 ; AVX512DQ-NEXT:    retq
4595 ; X86-LABEL: ktest_3:
4596 ; X86:       ## %bb.0:
4597 ; X86-NEXT:    subl $12, %esp
4598 ; X86-NEXT:    .cfi_def_cfa_offset 16
4599 ; X86-NEXT:    vptestnmd %ymm0, %ymm0, %k0
4600 ; X86-NEXT:    vptestnmd %ymm1, %ymm1, %k1
4601 ; X86-NEXT:    korb %k1, %k0, %k0
4602 ; X86-NEXT:    vptestnmd %ymm2, %ymm2, %k1
4603 ; X86-NEXT:    vptestnmd %ymm3, %ymm3, %k2
4604 ; X86-NEXT:    korb %k2, %k1, %k1
4605 ; X86-NEXT:    ktestb %k1, %k0
4606 ; X86-NEXT:    je LBB72_1
4607 ; X86-NEXT:  ## %bb.2: ## %exit
4608 ; X86-NEXT:    addl $12, %esp
4609 ; X86-NEXT:    vzeroupper
4610 ; X86-NEXT:    retl
4611 ; X86-NEXT:  LBB72_1: ## %bar
4612 ; X86-NEXT:    vzeroupper
4613 ; X86-NEXT:    calll _foo
4614 ; X86-NEXT:    addl $12, %esp
4615 ; X86-NEXT:    retl
4616   %a = icmp eq <8 x i32> %w, zeroinitializer
4617   %b = icmp eq <8 x i32> %x, zeroinitializer
4618   %c = icmp eq <8 x i32> %y, zeroinitializer
4619   %d = icmp eq <8 x i32> %z, zeroinitializer
4620   %e = or <8 x i1> %a, %b
4621   %f = or <8 x i1> %c, %d
4622   %g = and <8 x i1> %e, %f
4623   %h = bitcast <8 x i1> %g to i8
4624   %i = icmp eq i8 %h, 0
4625   br i1 %i, label %bar, label %exit
4627 bar:
4628   call void @foo()
4629   br label %exit
4631 exit:
4632   ret void
4635 define void @ktest_4(<8 x i64> %w, <8 x i64> %x, <8 x i64> %y, <8 x i64> %z) {
4636 ; KNL-LABEL: ktest_4:
4637 ; KNL:       ## %bb.0:
4638 ; KNL-NEXT:    pushq %rax
4639 ; KNL-NEXT:    .cfi_def_cfa_offset 16
4640 ; KNL-NEXT:    vptestnmq %zmm0, %zmm0, %k0
4641 ; KNL-NEXT:    vptestnmq %zmm1, %zmm1, %k1
4642 ; KNL-NEXT:    vptestnmq %zmm2, %zmm2, %k2
4643 ; KNL-NEXT:    vptestnmq %zmm3, %zmm3, %k3
4644 ; KNL-NEXT:    korw %k1, %k0, %k0
4645 ; KNL-NEXT:    korw %k3, %k2, %k1
4646 ; KNL-NEXT:    kandw %k1, %k0, %k0
4647 ; KNL-NEXT:    kmovw %k0, %eax
4648 ; KNL-NEXT:    testb %al, %al
4649 ; KNL-NEXT:    je LBB73_1
4650 ; KNL-NEXT:  ## %bb.2: ## %exit
4651 ; KNL-NEXT:    popq %rax
4652 ; KNL-NEXT:    vzeroupper
4653 ; KNL-NEXT:    retq
4654 ; KNL-NEXT:  LBB73_1: ## %bar
4655 ; KNL-NEXT:    vzeroupper
4656 ; KNL-NEXT:    callq _foo
4657 ; KNL-NEXT:    popq %rax
4658 ; KNL-NEXT:    retq
4660 ; SKX-LABEL: ktest_4:
4661 ; SKX:       ## %bb.0:
4662 ; SKX-NEXT:    pushq %rax
4663 ; SKX-NEXT:    .cfi_def_cfa_offset 16
4664 ; SKX-NEXT:    vptestnmq %zmm0, %zmm0, %k0
4665 ; SKX-NEXT:    vptestnmq %zmm1, %zmm1, %k1
4666 ; SKX-NEXT:    korb %k1, %k0, %k0
4667 ; SKX-NEXT:    vptestnmq %zmm2, %zmm2, %k1
4668 ; SKX-NEXT:    vptestnmq %zmm3, %zmm3, %k2
4669 ; SKX-NEXT:    korb %k2, %k1, %k1
4670 ; SKX-NEXT:    ktestb %k1, %k0
4671 ; SKX-NEXT:    je LBB73_1
4672 ; SKX-NEXT:  ## %bb.2: ## %exit
4673 ; SKX-NEXT:    popq %rax
4674 ; SKX-NEXT:    vzeroupper
4675 ; SKX-NEXT:    retq
4676 ; SKX-NEXT:  LBB73_1: ## %bar
4677 ; SKX-NEXT:    vzeroupper
4678 ; SKX-NEXT:    callq _foo
4679 ; SKX-NEXT:    popq %rax
4680 ; SKX-NEXT:    retq
4682 ; AVX512BW-LABEL: ktest_4:
4683 ; AVX512BW:       ## %bb.0:
4684 ; AVX512BW-NEXT:    pushq %rax
4685 ; AVX512BW-NEXT:    .cfi_def_cfa_offset 16
4686 ; AVX512BW-NEXT:    vptestnmq %zmm0, %zmm0, %k0
4687 ; AVX512BW-NEXT:    vptestnmq %zmm1, %zmm1, %k1
4688 ; AVX512BW-NEXT:    vptestnmq %zmm2, %zmm2, %k2
4689 ; AVX512BW-NEXT:    vptestnmq %zmm3, %zmm3, %k3
4690 ; AVX512BW-NEXT:    korw %k1, %k0, %k0
4691 ; AVX512BW-NEXT:    korw %k3, %k2, %k1
4692 ; AVX512BW-NEXT:    kandw %k1, %k0, %k0
4693 ; AVX512BW-NEXT:    kmovd %k0, %eax
4694 ; AVX512BW-NEXT:    testb %al, %al
4695 ; AVX512BW-NEXT:    je LBB73_1
4696 ; AVX512BW-NEXT:  ## %bb.2: ## %exit
4697 ; AVX512BW-NEXT:    popq %rax
4698 ; AVX512BW-NEXT:    vzeroupper
4699 ; AVX512BW-NEXT:    retq
4700 ; AVX512BW-NEXT:  LBB73_1: ## %bar
4701 ; AVX512BW-NEXT:    vzeroupper
4702 ; AVX512BW-NEXT:    callq _foo
4703 ; AVX512BW-NEXT:    popq %rax
4704 ; AVX512BW-NEXT:    retq
4706 ; AVX512DQ-LABEL: ktest_4:
4707 ; AVX512DQ:       ## %bb.0:
4708 ; AVX512DQ-NEXT:    pushq %rax
4709 ; AVX512DQ-NEXT:    .cfi_def_cfa_offset 16
4710 ; AVX512DQ-NEXT:    vptestnmq %zmm0, %zmm0, %k0
4711 ; AVX512DQ-NEXT:    vptestnmq %zmm1, %zmm1, %k1
4712 ; AVX512DQ-NEXT:    korb %k1, %k0, %k0
4713 ; AVX512DQ-NEXT:    vptestnmq %zmm2, %zmm2, %k1
4714 ; AVX512DQ-NEXT:    vptestnmq %zmm3, %zmm3, %k2
4715 ; AVX512DQ-NEXT:    korb %k2, %k1, %k1
4716 ; AVX512DQ-NEXT:    ktestb %k1, %k0
4717 ; AVX512DQ-NEXT:    je LBB73_1
4718 ; AVX512DQ-NEXT:  ## %bb.2: ## %exit
4719 ; AVX512DQ-NEXT:    popq %rax
4720 ; AVX512DQ-NEXT:    vzeroupper
4721 ; AVX512DQ-NEXT:    retq
4722 ; AVX512DQ-NEXT:  LBB73_1: ## %bar
4723 ; AVX512DQ-NEXT:    vzeroupper
4724 ; AVX512DQ-NEXT:    callq _foo
4725 ; AVX512DQ-NEXT:    popq %rax
4726 ; AVX512DQ-NEXT:    retq
4728 ; X86-LABEL: ktest_4:
4729 ; X86:       ## %bb.0:
4730 ; X86-NEXT:    subl $12, %esp
4731 ; X86-NEXT:    .cfi_def_cfa_offset 16
4732 ; X86-NEXT:    vptestnmq %zmm0, %zmm0, %k0
4733 ; X86-NEXT:    vptestnmq %zmm1, %zmm1, %k1
4734 ; X86-NEXT:    korb %k1, %k0, %k0
4735 ; X86-NEXT:    vptestnmq %zmm2, %zmm2, %k1
4736 ; X86-NEXT:    vptestnmq %zmm3, %zmm3, %k2
4737 ; X86-NEXT:    korb %k2, %k1, %k1
4738 ; X86-NEXT:    ktestb %k1, %k0
4739 ; X86-NEXT:    je LBB73_1
4740 ; X86-NEXT:  ## %bb.2: ## %exit
4741 ; X86-NEXT:    addl $12, %esp
4742 ; X86-NEXT:    vzeroupper
4743 ; X86-NEXT:    retl
4744 ; X86-NEXT:  LBB73_1: ## %bar
4745 ; X86-NEXT:    vzeroupper
4746 ; X86-NEXT:    calll _foo
4747 ; X86-NEXT:    addl $12, %esp
4748 ; X86-NEXT:    retl
4749   %a = icmp eq <8 x i64> %w, zeroinitializer
4750   %b = icmp eq <8 x i64> %x, zeroinitializer
4751   %c = icmp eq <8 x i64> %y, zeroinitializer
4752   %d = icmp eq <8 x i64> %z, zeroinitializer
4753   %e = or <8 x i1> %a, %b
4754   %f = or <8 x i1> %c, %d
4755   %g = and <8 x i1> %e, %f
4756   %h = bitcast <8 x i1> %g to i8
4757   %i = icmp eq i8 %h, 0
4758   br i1 %i, label %bar, label %exit
4760 bar:
4761   call void @foo()
4762   br label %exit
4764 exit:
4765   ret void
4768 define void @ktest_5(<16 x i32> %w, <16 x i32> %x, <16 x i32> %y, <16 x i32> %z) {
4769 ; KNL-LABEL: ktest_5:
4770 ; KNL:       ## %bb.0:
4771 ; KNL-NEXT:    pushq %rax
4772 ; KNL-NEXT:    .cfi_def_cfa_offset 16
4773 ; KNL-NEXT:    vptestnmd %zmm0, %zmm0, %k0
4774 ; KNL-NEXT:    vptestnmd %zmm1, %zmm1, %k1
4775 ; KNL-NEXT:    korw %k1, %k0, %k0
4776 ; KNL-NEXT:    vptestnmd %zmm2, %zmm2, %k1
4777 ; KNL-NEXT:    vptestnmd %zmm3, %zmm3, %k2
4778 ; KNL-NEXT:    korw %k2, %k1, %k1
4779 ; KNL-NEXT:    kandw %k1, %k0, %k0
4780 ; KNL-NEXT:    kortestw %k0, %k0
4781 ; KNL-NEXT:    je LBB74_1
4782 ; KNL-NEXT:  ## %bb.2: ## %exit
4783 ; KNL-NEXT:    popq %rax
4784 ; KNL-NEXT:    vzeroupper
4785 ; KNL-NEXT:    retq
4786 ; KNL-NEXT:  LBB74_1: ## %bar
4787 ; KNL-NEXT:    vzeroupper
4788 ; KNL-NEXT:    callq _foo
4789 ; KNL-NEXT:    popq %rax
4790 ; KNL-NEXT:    retq
4792 ; SKX-LABEL: ktest_5:
4793 ; SKX:       ## %bb.0:
4794 ; SKX-NEXT:    pushq %rax
4795 ; SKX-NEXT:    .cfi_def_cfa_offset 16
4796 ; SKX-NEXT:    vptestnmd %zmm0, %zmm0, %k0
4797 ; SKX-NEXT:    vptestnmd %zmm1, %zmm1, %k1
4798 ; SKX-NEXT:    korw %k1, %k0, %k0
4799 ; SKX-NEXT:    vptestnmd %zmm2, %zmm2, %k1
4800 ; SKX-NEXT:    vptestnmd %zmm3, %zmm3, %k2
4801 ; SKX-NEXT:    korw %k2, %k1, %k1
4802 ; SKX-NEXT:    ktestw %k1, %k0
4803 ; SKX-NEXT:    je LBB74_1
4804 ; SKX-NEXT:  ## %bb.2: ## %exit
4805 ; SKX-NEXT:    popq %rax
4806 ; SKX-NEXT:    vzeroupper
4807 ; SKX-NEXT:    retq
4808 ; SKX-NEXT:  LBB74_1: ## %bar
4809 ; SKX-NEXT:    vzeroupper
4810 ; SKX-NEXT:    callq _foo
4811 ; SKX-NEXT:    popq %rax
4812 ; SKX-NEXT:    retq
4814 ; AVX512BW-LABEL: ktest_5:
4815 ; AVX512BW:       ## %bb.0:
4816 ; AVX512BW-NEXT:    pushq %rax
4817 ; AVX512BW-NEXT:    .cfi_def_cfa_offset 16
4818 ; AVX512BW-NEXT:    vptestnmd %zmm0, %zmm0, %k0
4819 ; AVX512BW-NEXT:    vptestnmd %zmm1, %zmm1, %k1
4820 ; AVX512BW-NEXT:    korw %k1, %k0, %k0
4821 ; AVX512BW-NEXT:    vptestnmd %zmm2, %zmm2, %k1
4822 ; AVX512BW-NEXT:    vptestnmd %zmm3, %zmm3, %k2
4823 ; AVX512BW-NEXT:    korw %k2, %k1, %k1
4824 ; AVX512BW-NEXT:    kandw %k1, %k0, %k0
4825 ; AVX512BW-NEXT:    kortestw %k0, %k0
4826 ; AVX512BW-NEXT:    je LBB74_1
4827 ; AVX512BW-NEXT:  ## %bb.2: ## %exit
4828 ; AVX512BW-NEXT:    popq %rax
4829 ; AVX512BW-NEXT:    vzeroupper
4830 ; AVX512BW-NEXT:    retq
4831 ; AVX512BW-NEXT:  LBB74_1: ## %bar
4832 ; AVX512BW-NEXT:    vzeroupper
4833 ; AVX512BW-NEXT:    callq _foo
4834 ; AVX512BW-NEXT:    popq %rax
4835 ; AVX512BW-NEXT:    retq
4837 ; AVX512DQ-LABEL: ktest_5:
4838 ; AVX512DQ:       ## %bb.0:
4839 ; AVX512DQ-NEXT:    pushq %rax
4840 ; AVX512DQ-NEXT:    .cfi_def_cfa_offset 16
4841 ; AVX512DQ-NEXT:    vptestnmd %zmm0, %zmm0, %k0
4842 ; AVX512DQ-NEXT:    vptestnmd %zmm1, %zmm1, %k1
4843 ; AVX512DQ-NEXT:    korw %k1, %k0, %k0
4844 ; AVX512DQ-NEXT:    vptestnmd %zmm2, %zmm2, %k1
4845 ; AVX512DQ-NEXT:    vptestnmd %zmm3, %zmm3, %k2
4846 ; AVX512DQ-NEXT:    korw %k2, %k1, %k1
4847 ; AVX512DQ-NEXT:    ktestw %k1, %k0
4848 ; AVX512DQ-NEXT:    je LBB74_1
4849 ; AVX512DQ-NEXT:  ## %bb.2: ## %exit
4850 ; AVX512DQ-NEXT:    popq %rax
4851 ; AVX512DQ-NEXT:    vzeroupper
4852 ; AVX512DQ-NEXT:    retq
4853 ; AVX512DQ-NEXT:  LBB74_1: ## %bar
4854 ; AVX512DQ-NEXT:    vzeroupper
4855 ; AVX512DQ-NEXT:    callq _foo
4856 ; AVX512DQ-NEXT:    popq %rax
4857 ; AVX512DQ-NEXT:    retq
4859 ; X86-LABEL: ktest_5:
4860 ; X86:       ## %bb.0:
4861 ; X86-NEXT:    subl $12, %esp
4862 ; X86-NEXT:    .cfi_def_cfa_offset 16
4863 ; X86-NEXT:    vptestnmd %zmm0, %zmm0, %k0
4864 ; X86-NEXT:    vptestnmd %zmm1, %zmm1, %k1
4865 ; X86-NEXT:    korw %k1, %k0, %k0
4866 ; X86-NEXT:    vptestnmd %zmm2, %zmm2, %k1
4867 ; X86-NEXT:    vptestnmd %zmm3, %zmm3, %k2
4868 ; X86-NEXT:    korw %k2, %k1, %k1
4869 ; X86-NEXT:    ktestw %k1, %k0
4870 ; X86-NEXT:    je LBB74_1
4871 ; X86-NEXT:  ## %bb.2: ## %exit
4872 ; X86-NEXT:    addl $12, %esp
4873 ; X86-NEXT:    vzeroupper
4874 ; X86-NEXT:    retl
4875 ; X86-NEXT:  LBB74_1: ## %bar
4876 ; X86-NEXT:    vzeroupper
4877 ; X86-NEXT:    calll _foo
4878 ; X86-NEXT:    addl $12, %esp
4879 ; X86-NEXT:    retl
4880   %a = icmp eq <16 x i32> %w, zeroinitializer
4881   %b = icmp eq <16 x i32> %x, zeroinitializer
4882   %c = icmp eq <16 x i32> %y, zeroinitializer
4883   %d = icmp eq <16 x i32> %z, zeroinitializer
4884   %e = or <16 x i1> %a, %b
4885   %f = or <16 x i1> %c, %d
4886   %g = and <16 x i1> %e, %f
4887   %h = bitcast <16 x i1> %g to i16
4888   %i = icmp eq i16 %h, 0
4889   br i1 %i, label %bar, label %exit
4891 bar:
4892   call void @foo()
4893   br label %exit
4895 exit:
4896   ret void
4899 define void @ktest_6(<32 x i16> %w, <32 x i16> %x, <32 x i16> %y, <32 x i16> %z) {
4900 ; KNL-LABEL: ktest_6:
4901 ; KNL:       ## %bb.0:
4902 ; KNL-NEXT:    pushq %rax
4903 ; KNL-NEXT:    .cfi_def_cfa_offset 16
4904 ; KNL-NEXT:    vextracti64x4 $1, %zmm3, %ymm4
4905 ; KNL-NEXT:    vextracti64x4 $1, %zmm2, %ymm5
4906 ; KNL-NEXT:    vextracti64x4 $1, %zmm1, %ymm6
4907 ; KNL-NEXT:    vextracti64x4 $1, %zmm0, %ymm7
4908 ; KNL-NEXT:    vpxor %xmm8, %xmm8, %xmm8
4909 ; KNL-NEXT:    vpcmpeqw %ymm8, %ymm0, %ymm0
4910 ; KNL-NEXT:    vpcmpeqw %ymm8, %ymm7, %ymm7
4911 ; KNL-NEXT:    vpcmpeqw %ymm8, %ymm1, %ymm1
4912 ; KNL-NEXT:    vpor %ymm1, %ymm0, %ymm0
4913 ; KNL-NEXT:    vpcmpeqw %ymm8, %ymm6, %ymm1
4914 ; KNL-NEXT:    vpor %ymm1, %ymm7, %ymm1
4915 ; KNL-NEXT:    vpcmpeqw %ymm8, %ymm2, %ymm2
4916 ; KNL-NEXT:    vpcmpeqw %ymm8, %ymm5, %ymm5
4917 ; KNL-NEXT:    vpcmpeqw %ymm8, %ymm3, %ymm3
4918 ; KNL-NEXT:    vpor %ymm3, %ymm2, %ymm2
4919 ; KNL-NEXT:    vpand %ymm2, %ymm0, %ymm0
4920 ; KNL-NEXT:    vpcmpeqw %ymm8, %ymm4, %ymm2
4921 ; KNL-NEXT:    vpor %ymm2, %ymm5, %ymm2
4922 ; KNL-NEXT:    vpand %ymm2, %ymm1, %ymm1
4923 ; KNL-NEXT:    vpmovsxwd %ymm0, %zmm0
4924 ; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k0
4925 ; KNL-NEXT:    kmovw %k0, %eax
4926 ; KNL-NEXT:    vpmovsxwd %ymm1, %zmm0
4927 ; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k0
4928 ; KNL-NEXT:    kmovw %k0, %ecx
4929 ; KNL-NEXT:    shll $16, %ecx
4930 ; KNL-NEXT:    orl %eax, %ecx
4931 ; KNL-NEXT:    je LBB75_1
4932 ; KNL-NEXT:  ## %bb.2: ## %exit
4933 ; KNL-NEXT:    popq %rax
4934 ; KNL-NEXT:    vzeroupper
4935 ; KNL-NEXT:    retq
4936 ; KNL-NEXT:  LBB75_1: ## %bar
4937 ; KNL-NEXT:    vzeroupper
4938 ; KNL-NEXT:    callq _foo
4939 ; KNL-NEXT:    popq %rax
4940 ; KNL-NEXT:    retq
4942 ; SKX-LABEL: ktest_6:
4943 ; SKX:       ## %bb.0:
4944 ; SKX-NEXT:    pushq %rax
4945 ; SKX-NEXT:    .cfi_def_cfa_offset 16
4946 ; SKX-NEXT:    vptestnmw %zmm0, %zmm0, %k0
4947 ; SKX-NEXT:    vptestnmw %zmm1, %zmm1, %k1
4948 ; SKX-NEXT:    kord %k1, %k0, %k0
4949 ; SKX-NEXT:    vptestnmw %zmm2, %zmm2, %k1
4950 ; SKX-NEXT:    vptestnmw %zmm3, %zmm3, %k2
4951 ; SKX-NEXT:    kord %k2, %k1, %k1
4952 ; SKX-NEXT:    ktestd %k1, %k0
4953 ; SKX-NEXT:    je LBB75_1
4954 ; SKX-NEXT:  ## %bb.2: ## %exit
4955 ; SKX-NEXT:    popq %rax
4956 ; SKX-NEXT:    vzeroupper
4957 ; SKX-NEXT:    retq
4958 ; SKX-NEXT:  LBB75_1: ## %bar
4959 ; SKX-NEXT:    vzeroupper
4960 ; SKX-NEXT:    callq _foo
4961 ; SKX-NEXT:    popq %rax
4962 ; SKX-NEXT:    retq
4964 ; AVX512BW-LABEL: ktest_6:
4965 ; AVX512BW:       ## %bb.0:
4966 ; AVX512BW-NEXT:    pushq %rax
4967 ; AVX512BW-NEXT:    .cfi_def_cfa_offset 16
4968 ; AVX512BW-NEXT:    vptestnmw %zmm0, %zmm0, %k0
4969 ; AVX512BW-NEXT:    vptestnmw %zmm1, %zmm1, %k1
4970 ; AVX512BW-NEXT:    kord %k1, %k0, %k0
4971 ; AVX512BW-NEXT:    vptestnmw %zmm2, %zmm2, %k1
4972 ; AVX512BW-NEXT:    vptestnmw %zmm3, %zmm3, %k2
4973 ; AVX512BW-NEXT:    kord %k2, %k1, %k1
4974 ; AVX512BW-NEXT:    ktestd %k1, %k0
4975 ; AVX512BW-NEXT:    je LBB75_1
4976 ; AVX512BW-NEXT:  ## %bb.2: ## %exit
4977 ; AVX512BW-NEXT:    popq %rax
4978 ; AVX512BW-NEXT:    vzeroupper
4979 ; AVX512BW-NEXT:    retq
4980 ; AVX512BW-NEXT:  LBB75_1: ## %bar
4981 ; AVX512BW-NEXT:    vzeroupper
4982 ; AVX512BW-NEXT:    callq _foo
4983 ; AVX512BW-NEXT:    popq %rax
4984 ; AVX512BW-NEXT:    retq
4986 ; AVX512DQ-LABEL: ktest_6:
4987 ; AVX512DQ:       ## %bb.0:
4988 ; AVX512DQ-NEXT:    pushq %rax
4989 ; AVX512DQ-NEXT:    .cfi_def_cfa_offset 16
4990 ; AVX512DQ-NEXT:    vextracti64x4 $1, %zmm3, %ymm4
4991 ; AVX512DQ-NEXT:    vextracti64x4 $1, %zmm2, %ymm5
4992 ; AVX512DQ-NEXT:    vextracti64x4 $1, %zmm1, %ymm6
4993 ; AVX512DQ-NEXT:    vextracti64x4 $1, %zmm0, %ymm7
4994 ; AVX512DQ-NEXT:    vpxor %xmm8, %xmm8, %xmm8
4995 ; AVX512DQ-NEXT:    vpcmpeqw %ymm8, %ymm0, %ymm0
4996 ; AVX512DQ-NEXT:    vpcmpeqw %ymm8, %ymm7, %ymm7
4997 ; AVX512DQ-NEXT:    vpcmpeqw %ymm8, %ymm1, %ymm1
4998 ; AVX512DQ-NEXT:    vpor %ymm1, %ymm0, %ymm0
4999 ; AVX512DQ-NEXT:    vpcmpeqw %ymm8, %ymm6, %ymm1
5000 ; AVX512DQ-NEXT:    vpor %ymm1, %ymm7, %ymm1
5001 ; AVX512DQ-NEXT:    vpcmpeqw %ymm8, %ymm2, %ymm2
5002 ; AVX512DQ-NEXT:    vpcmpeqw %ymm8, %ymm5, %ymm5
5003 ; AVX512DQ-NEXT:    vpcmpeqw %ymm8, %ymm3, %ymm3
5004 ; AVX512DQ-NEXT:    vpor %ymm3, %ymm2, %ymm2
5005 ; AVX512DQ-NEXT:    vpand %ymm2, %ymm0, %ymm0
5006 ; AVX512DQ-NEXT:    vpcmpeqw %ymm8, %ymm4, %ymm2
5007 ; AVX512DQ-NEXT:    vpor %ymm2, %ymm5, %ymm2
5008 ; AVX512DQ-NEXT:    vpand %ymm2, %ymm1, %ymm1
5009 ; AVX512DQ-NEXT:    vpmovsxwd %ymm0, %zmm0
5010 ; AVX512DQ-NEXT:    vpmovd2m %zmm0, %k0
5011 ; AVX512DQ-NEXT:    kmovw %k0, %eax
5012 ; AVX512DQ-NEXT:    vpmovsxwd %ymm1, %zmm0
5013 ; AVX512DQ-NEXT:    vpmovd2m %zmm0, %k0
5014 ; AVX512DQ-NEXT:    kmovw %k0, %ecx
5015 ; AVX512DQ-NEXT:    shll $16, %ecx
5016 ; AVX512DQ-NEXT:    orl %eax, %ecx
5017 ; AVX512DQ-NEXT:    je LBB75_1
5018 ; AVX512DQ-NEXT:  ## %bb.2: ## %exit
5019 ; AVX512DQ-NEXT:    popq %rax
5020 ; AVX512DQ-NEXT:    vzeroupper
5021 ; AVX512DQ-NEXT:    retq
5022 ; AVX512DQ-NEXT:  LBB75_1: ## %bar
5023 ; AVX512DQ-NEXT:    vzeroupper
5024 ; AVX512DQ-NEXT:    callq _foo
5025 ; AVX512DQ-NEXT:    popq %rax
5026 ; AVX512DQ-NEXT:    retq
5028 ; X86-LABEL: ktest_6:
5029 ; X86:       ## %bb.0:
5030 ; X86-NEXT:    subl $12, %esp
5031 ; X86-NEXT:    .cfi_def_cfa_offset 16
5032 ; X86-NEXT:    vptestnmw %zmm0, %zmm0, %k0
5033 ; X86-NEXT:    vptestnmw %zmm1, %zmm1, %k1
5034 ; X86-NEXT:    kord %k1, %k0, %k0
5035 ; X86-NEXT:    vptestnmw %zmm2, %zmm2, %k1
5036 ; X86-NEXT:    vptestnmw %zmm3, %zmm3, %k2
5037 ; X86-NEXT:    kord %k2, %k1, %k1
5038 ; X86-NEXT:    ktestd %k1, %k0
5039 ; X86-NEXT:    je LBB75_1
5040 ; X86-NEXT:  ## %bb.2: ## %exit
5041 ; X86-NEXT:    addl $12, %esp
5042 ; X86-NEXT:    vzeroupper
5043 ; X86-NEXT:    retl
5044 ; X86-NEXT:  LBB75_1: ## %bar
5045 ; X86-NEXT:    vzeroupper
5046 ; X86-NEXT:    calll _foo
5047 ; X86-NEXT:    addl $12, %esp
5048 ; X86-NEXT:    retl
5049   %a = icmp eq <32 x i16> %w, zeroinitializer
5050   %b = icmp eq <32 x i16> %x, zeroinitializer
5051   %c = icmp eq <32 x i16> %y, zeroinitializer
5052   %d = icmp eq <32 x i16> %z, zeroinitializer
5053   %e = or <32 x i1> %a, %b
5054   %f = or <32 x i1> %c, %d
5055   %g = and <32 x i1> %e, %f
5056   %h = bitcast <32 x i1> %g to i32
5057   %i = icmp eq i32 %h, 0
5058   br i1 %i, label %bar, label %exit
5060 bar:
5061   call void @foo()
5062   br label %exit
5064 exit:
5065   ret void
5068 define void @ktest_7(<64 x i8> %w, <64 x i8> %x, <64 x i8> %y, <64 x i8> %z) {
5069 ; KNL-LABEL: ktest_7:
5070 ; KNL:       ## %bb.0:
5071 ; KNL-NEXT:    pushq %rax
5072 ; KNL-NEXT:    .cfi_def_cfa_offset 16
5073 ; KNL-NEXT:    vextracti64x4 $1, %zmm3, %ymm9
5074 ; KNL-NEXT:    vextracti64x4 $1, %zmm2, %ymm10
5075 ; KNL-NEXT:    vextracti64x4 $1, %zmm1, %ymm11
5076 ; KNL-NEXT:    vextracti64x4 $1, %zmm0, %ymm7
5077 ; KNL-NEXT:    vpxor %xmm8, %xmm8, %xmm8
5078 ; KNL-NEXT:    vpcmpeqb %ymm8, %ymm0, %ymm13
5079 ; KNL-NEXT:    vextracti128 $1, %ymm13, %xmm4
5080 ; KNL-NEXT:    vpcmpeqb %ymm8, %ymm7, %ymm7
5081 ; KNL-NEXT:    vextracti128 $1, %ymm7, %xmm5
5082 ; KNL-NEXT:    vpcmpeqb %ymm8, %ymm1, %ymm1
5083 ; KNL-NEXT:    vextracti128 $1, %ymm1, %xmm6
5084 ; KNL-NEXT:    vpor %xmm6, %xmm4, %xmm12
5085 ; KNL-NEXT:    vpcmpeqb %ymm8, %ymm11, %ymm6
5086 ; KNL-NEXT:    vextracti128 $1, %ymm6, %xmm4
5087 ; KNL-NEXT:    vpor %xmm4, %xmm5, %xmm11
5088 ; KNL-NEXT:    vpcmpeqb %ymm8, %ymm2, %ymm2
5089 ; KNL-NEXT:    vextracti128 $1, %ymm2, %xmm5
5090 ; KNL-NEXT:    vpcmpeqb %ymm8, %ymm10, %ymm10
5091 ; KNL-NEXT:    vextracti128 $1, %ymm10, %xmm4
5092 ; KNL-NEXT:    vpcmpeqb %ymm8, %ymm3, %ymm3
5093 ; KNL-NEXT:    vextracti128 $1, %ymm3, %xmm0
5094 ; KNL-NEXT:    vpor %xmm0, %xmm5, %xmm0
5095 ; KNL-NEXT:    vpand %xmm0, %xmm12, %xmm12
5096 ; KNL-NEXT:    vpcmpeqb %ymm8, %ymm9, %ymm5
5097 ; KNL-NEXT:    vextracti128 $1, %ymm5, %xmm0
5098 ; KNL-NEXT:    vpor %xmm0, %xmm4, %xmm0
5099 ; KNL-NEXT:    vpand %xmm0, %xmm11, %xmm0
5100 ; KNL-NEXT:    vpor %xmm6, %xmm7, %xmm4
5101 ; KNL-NEXT:    vpor %xmm1, %xmm13, %xmm1
5102 ; KNL-NEXT:    vpor %xmm5, %xmm10, %xmm5
5103 ; KNL-NEXT:    vpand %xmm5, %xmm4, %xmm4
5104 ; KNL-NEXT:    vpor %xmm3, %xmm2, %xmm2
5105 ; KNL-NEXT:    vpand %xmm2, %xmm1, %xmm1
5106 ; KNL-NEXT:    vpmovsxbd %xmm1, %zmm1
5107 ; KNL-NEXT:    vptestmd %zmm1, %zmm1, %k0
5108 ; KNL-NEXT:    kmovw %k0, %eax
5109 ; KNL-NEXT:    vpmovsxbd %xmm12, %zmm1
5110 ; KNL-NEXT:    vptestmd %zmm1, %zmm1, %k0
5111 ; KNL-NEXT:    kmovw %k0, %ecx
5112 ; KNL-NEXT:    shll $16, %ecx
5113 ; KNL-NEXT:    orl %eax, %ecx
5114 ; KNL-NEXT:    vpmovsxbd %xmm4, %zmm1
5115 ; KNL-NEXT:    vptestmd %zmm1, %zmm1, %k0
5116 ; KNL-NEXT:    kmovw %k0, %eax
5117 ; KNL-NEXT:    vpmovsxbd %xmm0, %zmm0
5118 ; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k0
5119 ; KNL-NEXT:    kmovw %k0, %edx
5120 ; KNL-NEXT:    shll $16, %edx
5121 ; KNL-NEXT:    orl %eax, %edx
5122 ; KNL-NEXT:    shlq $32, %rdx
5123 ; KNL-NEXT:    orq %rcx, %rdx
5124 ; KNL-NEXT:    je LBB76_1
5125 ; KNL-NEXT:  ## %bb.2: ## %exit
5126 ; KNL-NEXT:    popq %rax
5127 ; KNL-NEXT:    vzeroupper
5128 ; KNL-NEXT:    retq
5129 ; KNL-NEXT:  LBB76_1: ## %bar
5130 ; KNL-NEXT:    vzeroupper
5131 ; KNL-NEXT:    callq _foo
5132 ; KNL-NEXT:    popq %rax
5133 ; KNL-NEXT:    retq
5135 ; SKX-LABEL: ktest_7:
5136 ; SKX:       ## %bb.0:
5137 ; SKX-NEXT:    pushq %rax
5138 ; SKX-NEXT:    .cfi_def_cfa_offset 16
5139 ; SKX-NEXT:    vptestnmb %zmm0, %zmm0, %k0
5140 ; SKX-NEXT:    vptestnmb %zmm1, %zmm1, %k1
5141 ; SKX-NEXT:    korq %k1, %k0, %k0
5142 ; SKX-NEXT:    vptestnmb %zmm2, %zmm2, %k1
5143 ; SKX-NEXT:    vptestnmb %zmm3, %zmm3, %k2
5144 ; SKX-NEXT:    korq %k2, %k1, %k1
5145 ; SKX-NEXT:    ktestq %k1, %k0
5146 ; SKX-NEXT:    je LBB76_1
5147 ; SKX-NEXT:  ## %bb.2: ## %exit
5148 ; SKX-NEXT:    popq %rax
5149 ; SKX-NEXT:    vzeroupper
5150 ; SKX-NEXT:    retq
5151 ; SKX-NEXT:  LBB76_1: ## %bar
5152 ; SKX-NEXT:    vzeroupper
5153 ; SKX-NEXT:    callq _foo
5154 ; SKX-NEXT:    popq %rax
5155 ; SKX-NEXT:    retq
5157 ; AVX512BW-LABEL: ktest_7:
5158 ; AVX512BW:       ## %bb.0:
5159 ; AVX512BW-NEXT:    pushq %rax
5160 ; AVX512BW-NEXT:    .cfi_def_cfa_offset 16
5161 ; AVX512BW-NEXT:    vptestnmb %zmm0, %zmm0, %k0
5162 ; AVX512BW-NEXT:    vptestnmb %zmm1, %zmm1, %k1
5163 ; AVX512BW-NEXT:    korq %k1, %k0, %k0
5164 ; AVX512BW-NEXT:    vptestnmb %zmm2, %zmm2, %k1
5165 ; AVX512BW-NEXT:    vptestnmb %zmm3, %zmm3, %k2
5166 ; AVX512BW-NEXT:    korq %k2, %k1, %k1
5167 ; AVX512BW-NEXT:    ktestq %k1, %k0
5168 ; AVX512BW-NEXT:    je LBB76_1
5169 ; AVX512BW-NEXT:  ## %bb.2: ## %exit
5170 ; AVX512BW-NEXT:    popq %rax
5171 ; AVX512BW-NEXT:    vzeroupper
5172 ; AVX512BW-NEXT:    retq
5173 ; AVX512BW-NEXT:  LBB76_1: ## %bar
5174 ; AVX512BW-NEXT:    vzeroupper
5175 ; AVX512BW-NEXT:    callq _foo
5176 ; AVX512BW-NEXT:    popq %rax
5177 ; AVX512BW-NEXT:    retq
5179 ; AVX512DQ-LABEL: ktest_7:
5180 ; AVX512DQ:       ## %bb.0:
5181 ; AVX512DQ-NEXT:    pushq %rax
5182 ; AVX512DQ-NEXT:    .cfi_def_cfa_offset 16
5183 ; AVX512DQ-NEXT:    vextracti64x4 $1, %zmm3, %ymm9
5184 ; AVX512DQ-NEXT:    vextracti64x4 $1, %zmm2, %ymm10
5185 ; AVX512DQ-NEXT:    vextracti64x4 $1, %zmm1, %ymm11
5186 ; AVX512DQ-NEXT:    vextracti64x4 $1, %zmm0, %ymm7
5187 ; AVX512DQ-NEXT:    vpxor %xmm8, %xmm8, %xmm8
5188 ; AVX512DQ-NEXT:    vpcmpeqb %ymm8, %ymm0, %ymm13
5189 ; AVX512DQ-NEXT:    vextracti128 $1, %ymm13, %xmm4
5190 ; AVX512DQ-NEXT:    vpcmpeqb %ymm8, %ymm7, %ymm7
5191 ; AVX512DQ-NEXT:    vextracti128 $1, %ymm7, %xmm5
5192 ; AVX512DQ-NEXT:    vpcmpeqb %ymm8, %ymm1, %ymm1
5193 ; AVX512DQ-NEXT:    vextracti128 $1, %ymm1, %xmm6
5194 ; AVX512DQ-NEXT:    vpor %xmm6, %xmm4, %xmm12
5195 ; AVX512DQ-NEXT:    vpcmpeqb %ymm8, %ymm11, %ymm6
5196 ; AVX512DQ-NEXT:    vextracti128 $1, %ymm6, %xmm4
5197 ; AVX512DQ-NEXT:    vpor %xmm4, %xmm5, %xmm11
5198 ; AVX512DQ-NEXT:    vpcmpeqb %ymm8, %ymm2, %ymm2
5199 ; AVX512DQ-NEXT:    vextracti128 $1, %ymm2, %xmm5
5200 ; AVX512DQ-NEXT:    vpcmpeqb %ymm8, %ymm10, %ymm10
5201 ; AVX512DQ-NEXT:    vextracti128 $1, %ymm10, %xmm4
5202 ; AVX512DQ-NEXT:    vpcmpeqb %ymm8, %ymm3, %ymm3
5203 ; AVX512DQ-NEXT:    vextracti128 $1, %ymm3, %xmm0
5204 ; AVX512DQ-NEXT:    vpor %xmm0, %xmm5, %xmm0
5205 ; AVX512DQ-NEXT:    vpand %xmm0, %xmm12, %xmm12
5206 ; AVX512DQ-NEXT:    vpcmpeqb %ymm8, %ymm9, %ymm5
5207 ; AVX512DQ-NEXT:    vextracti128 $1, %ymm5, %xmm0
5208 ; AVX512DQ-NEXT:    vpor %xmm0, %xmm4, %xmm0
5209 ; AVX512DQ-NEXT:    vpand %xmm0, %xmm11, %xmm0
5210 ; AVX512DQ-NEXT:    vpor %xmm6, %xmm7, %xmm4
5211 ; AVX512DQ-NEXT:    vpor %xmm1, %xmm13, %xmm1
5212 ; AVX512DQ-NEXT:    vpor %xmm5, %xmm10, %xmm5
5213 ; AVX512DQ-NEXT:    vpand %xmm5, %xmm4, %xmm4
5214 ; AVX512DQ-NEXT:    vpor %xmm3, %xmm2, %xmm2
5215 ; AVX512DQ-NEXT:    vpand %xmm2, %xmm1, %xmm1
5216 ; AVX512DQ-NEXT:    vpmovsxbd %xmm1, %zmm1
5217 ; AVX512DQ-NEXT:    vpmovd2m %zmm1, %k0
5218 ; AVX512DQ-NEXT:    kmovw %k0, %eax
5219 ; AVX512DQ-NEXT:    vpmovsxbd %xmm12, %zmm1
5220 ; AVX512DQ-NEXT:    vpmovd2m %zmm1, %k0
5221 ; AVX512DQ-NEXT:    kmovw %k0, %ecx
5222 ; AVX512DQ-NEXT:    shll $16, %ecx
5223 ; AVX512DQ-NEXT:    orl %eax, %ecx
5224 ; AVX512DQ-NEXT:    vpmovsxbd %xmm4, %zmm1
5225 ; AVX512DQ-NEXT:    vpmovd2m %zmm1, %k0
5226 ; AVX512DQ-NEXT:    kmovw %k0, %eax
5227 ; AVX512DQ-NEXT:    vpmovsxbd %xmm0, %zmm0
5228 ; AVX512DQ-NEXT:    vpmovd2m %zmm0, %k0
5229 ; AVX512DQ-NEXT:    kmovw %k0, %edx
5230 ; AVX512DQ-NEXT:    shll $16, %edx
5231 ; AVX512DQ-NEXT:    orl %eax, %edx
5232 ; AVX512DQ-NEXT:    shlq $32, %rdx
5233 ; AVX512DQ-NEXT:    orq %rcx, %rdx
5234 ; AVX512DQ-NEXT:    je LBB76_1
5235 ; AVX512DQ-NEXT:  ## %bb.2: ## %exit
5236 ; AVX512DQ-NEXT:    popq %rax
5237 ; AVX512DQ-NEXT:    vzeroupper
5238 ; AVX512DQ-NEXT:    retq
5239 ; AVX512DQ-NEXT:  LBB76_1: ## %bar
5240 ; AVX512DQ-NEXT:    vzeroupper
5241 ; AVX512DQ-NEXT:    callq _foo
5242 ; AVX512DQ-NEXT:    popq %rax
5243 ; AVX512DQ-NEXT:    retq
5245 ; X86-LABEL: ktest_7:
5246 ; X86:       ## %bb.0:
5247 ; X86-NEXT:    subl $12, %esp
5248 ; X86-NEXT:    .cfi_def_cfa_offset 16
5249 ; X86-NEXT:    vptestnmb %zmm0, %zmm0, %k0
5250 ; X86-NEXT:    vptestnmb %zmm1, %zmm1, %k1
5251 ; X86-NEXT:    korq %k1, %k0, %k0
5252 ; X86-NEXT:    vptestnmb %zmm2, %zmm2, %k1
5253 ; X86-NEXT:    vptestnmb %zmm3, %zmm3, %k2
5254 ; X86-NEXT:    korq %k2, %k1, %k1
5255 ; X86-NEXT:    kandq %k1, %k0, %k0
5256 ; X86-NEXT:    kshiftrq $32, %k0, %k1
5257 ; X86-NEXT:    kortestd %k1, %k0
5258 ; X86-NEXT:    je LBB76_1
5259 ; X86-NEXT:  ## %bb.2: ## %exit
5260 ; X86-NEXT:    addl $12, %esp
5261 ; X86-NEXT:    vzeroupper
5262 ; X86-NEXT:    retl
5263 ; X86-NEXT:  LBB76_1: ## %bar
5264 ; X86-NEXT:    vzeroupper
5265 ; X86-NEXT:    calll _foo
5266 ; X86-NEXT:    addl $12, %esp
5267 ; X86-NEXT:    retl
5268   %a = icmp eq <64 x i8> %w, zeroinitializer
5269   %b = icmp eq <64 x i8> %x, zeroinitializer
5270   %c = icmp eq <64 x i8> %y, zeroinitializer
5271   %d = icmp eq <64 x i8> %z, zeroinitializer
5272   %e = or <64 x i1> %a, %b
5273   %f = or <64 x i1> %c, %d
5274   %g = and <64 x i1> %e, %f
5275   %h = bitcast <64 x i1> %g to i64
5276   %i = icmp eq i64 %h, 0
5277   br i1 %i, label %bar, label %exit
5279 bar:
5280   call void @foo()
5281   br label %exit
5283 exit:
5284   ret void
5287 define <64 x i1> @mask64_insert(i32 %a) {
5288 ; KNL-LABEL: mask64_insert:
5289 ; KNL:       ## %bb.0:
5290 ; KNL-NEXT:    movq %rdi, %rax
5291 ; KNL-NEXT:    movw $-4, %cx
5292 ; KNL-NEXT:    kmovw %ecx, %k0
5293 ; KNL-NEXT:    kshiftrw $1, %k0, %k0
5294 ; KNL-NEXT:    kshiftlw $1, %k0, %k0
5295 ; KNL-NEXT:    andl $1, %esi
5296 ; KNL-NEXT:    kmovw %esi, %k1
5297 ; KNL-NEXT:    korw %k1, %k0, %k0
5298 ; KNL-NEXT:    kmovw %k0, (%rdi)
5299 ; KNL-NEXT:    movw $-3, 6(%rdi)
5300 ; KNL-NEXT:    movl $-131075, 2(%rdi) ## imm = 0xFFFDFFFD
5301 ; KNL-NEXT:    retq
5303 ; SKX-LABEL: mask64_insert:
5304 ; SKX:       ## %bb.0:
5305 ; SKX-NEXT:    kmovd %edi, %k0
5306 ; SKX-NEXT:    kshiftlq $63, %k0, %k0
5307 ; SKX-NEXT:    kshiftrq $63, %k0, %k0
5308 ; SKX-NEXT:    movabsq $-562958543486980, %rax ## imm = 0xFFFDFFFDFFFDFFFC
5309 ; SKX-NEXT:    kmovq %rax, %k1
5310 ; SKX-NEXT:    kshiftrq $1, %k1, %k1
5311 ; SKX-NEXT:    kshiftlq $1, %k1, %k1
5312 ; SKX-NEXT:    korq %k0, %k1, %k0
5313 ; SKX-NEXT:    vpmovm2b %k0, %zmm0
5314 ; SKX-NEXT:    retq
5316 ; AVX512BW-LABEL: mask64_insert:
5317 ; AVX512BW:       ## %bb.0:
5318 ; AVX512BW-NEXT:    kmovd %edi, %k0
5319 ; AVX512BW-NEXT:    kshiftlq $63, %k0, %k0
5320 ; AVX512BW-NEXT:    kshiftrq $63, %k0, %k0
5321 ; AVX512BW-NEXT:    movabsq $-562958543486980, %rax ## imm = 0xFFFDFFFDFFFDFFFC
5322 ; AVX512BW-NEXT:    kmovq %rax, %k1
5323 ; AVX512BW-NEXT:    kshiftrq $1, %k1, %k1
5324 ; AVX512BW-NEXT:    kshiftlq $1, %k1, %k1
5325 ; AVX512BW-NEXT:    korq %k0, %k1, %k0
5326 ; AVX512BW-NEXT:    vpmovm2b %k0, %zmm0
5327 ; AVX512BW-NEXT:    retq
5329 ; AVX512DQ-LABEL: mask64_insert:
5330 ; AVX512DQ:       ## %bb.0:
5331 ; AVX512DQ-NEXT:    movq %rdi, %rax
5332 ; AVX512DQ-NEXT:    movw $-4, %cx
5333 ; AVX512DQ-NEXT:    kmovw %ecx, %k0
5334 ; AVX512DQ-NEXT:    kshiftrw $1, %k0, %k0
5335 ; AVX512DQ-NEXT:    kshiftlw $1, %k0, %k0
5336 ; AVX512DQ-NEXT:    andl $1, %esi
5337 ; AVX512DQ-NEXT:    kmovw %esi, %k1
5338 ; AVX512DQ-NEXT:    korw %k1, %k0, %k0
5339 ; AVX512DQ-NEXT:    kmovw %k0, (%rdi)
5340 ; AVX512DQ-NEXT:    movw $-3, 6(%rdi)
5341 ; AVX512DQ-NEXT:    movl $-131075, 2(%rdi) ## imm = 0xFFFDFFFD
5342 ; AVX512DQ-NEXT:    retq
5344 ; X86-LABEL: mask64_insert:
5345 ; X86:       ## %bb.0:
5346 ; X86-NEXT:    kmovb {{[0-9]+}}(%esp), %k0
5347 ; X86-NEXT:    movl $-131076, %eax ## imm = 0xFFFDFFFC
5348 ; X86-NEXT:    kmovd %eax, %k1
5349 ; X86-NEXT:    movl $-131075, %eax ## imm = 0xFFFDFFFD
5350 ; X86-NEXT:    kmovd %eax, %k2
5351 ; X86-NEXT:    kunpckdq %k1, %k2, %k1
5352 ; X86-NEXT:    kshiftrq $1, %k1, %k1
5353 ; X86-NEXT:    kshiftlq $1, %k1, %k1
5354 ; X86-NEXT:    kshiftlq $63, %k0, %k0
5355 ; X86-NEXT:    kshiftrq $63, %k0, %k0
5356 ; X86-NEXT:    korq %k0, %k1, %k0
5357 ; X86-NEXT:    vpmovm2b %k0, %zmm0
5358 ; X86-NEXT:    retl
5359   %a_i = trunc i32 %a to i1
5360   %maskv = insertelement <64 x i1> <i1 true, i1 false, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 false, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 false, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 false, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, i1 %a_i, i32 0
5361   ret <64 x i1> %maskv