Revert r354244 "[DAGCombiner] Eliminate dead stores to stack."
[llvm-complete.git] / test / CodeGen / X86 / avx512-mask-op.ll
blob1110e02e5874c44439e4effd97bb35e0a5cbab20
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:    vpcmpleq %zmm1, %zmm0, %k1
488 ; KNL-NEXT:    vpcmpgtq %zmm3, %zmm2, %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:    vpcmpleq %ymm1, %ymm0, %k1
497 ; SKX-NEXT:    vpcmpgtq %ymm3, %ymm2, %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:    vpcmpleq %zmm1, %zmm0, %k1
509 ; AVX512BW-NEXT:    vpcmpgtq %zmm3, %zmm2, %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:    vpcmpleq %zmm1, %zmm0, %k1
522 ; AVX512DQ-NEXT:    vpcmpgtq %zmm3, %zmm2, %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:    vpcmpleq %ymm1, %ymm0, %k1
531 ; X86-NEXT:    vpcmpgtq %ymm3, %ymm2, %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:    vpcmpleq %zmm3, %zmm2, %k1
550 ; KNL-NEXT:    vpcmpgtq %zmm0, %zmm1, %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:    vpcmpleq %xmm3, %xmm2, %k1
559 ; SKX-NEXT:    vpcmpgtq %xmm0, %xmm1, %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:    vpcmpleq %zmm3, %zmm2, %k1
570 ; AVX512BW-NEXT:    vpcmpgtq %zmm0, %zmm1, %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:    vpcmpleq %zmm3, %zmm2, %k1
583 ; AVX512DQ-NEXT:    vpcmpgtq %zmm0, %zmm1, %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:    vpcmpleq %xmm3, %xmm2, %k1
592 ; X86-NEXT:    vpcmpgtq %xmm0, %xmm1, %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:    vpmovzxwq {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero
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:    vpmovzxwq {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero
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:    vpmovzxbd {{.*#+}} zmm0 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero,xmm1[4],zero,zero,zero,xmm1[5],zero,zero,zero,xmm1[6],zero,zero,zero,xmm1[7],zero,zero,zero,xmm1[8],zero,zero,zero,xmm1[9],zero,zero,zero,xmm1[10],zero,zero,zero,xmm1[11],zero,zero,zero,xmm1[12],zero,zero,zero,xmm1[13],zero,zero,zero,xmm1[14],zero,zero,zero,xmm1[15],zero,zero,zero
767 ; KNL-NEXT:    jmp LBB18_3
768 ; KNL-NEXT:  LBB18_1:
769 ; KNL-NEXT:    vpmovzxbd {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero
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:    vpmovzxbd {{.*#+}} zmm0 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero,xmm1[4],zero,zero,zero,xmm1[5],zero,zero,zero,xmm1[6],zero,zero,zero,xmm1[7],zero,zero,zero,xmm1[8],zero,zero,zero,xmm1[9],zero,zero,zero,xmm1[10],zero,zero,zero,xmm1[11],zero,zero,zero,xmm1[12],zero,zero,zero,xmm1[13],zero,zero,zero,xmm1[14],zero,zero,zero,xmm1[15],zero,zero,zero
814 ; AVX512DQ-NEXT:    jmp LBB18_3
815 ; AVX512DQ-NEXT:  LBB18_1:
816 ; AVX512DQ-NEXT:    vpmovzxbd {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero
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:    movb $1, %al
1073 ; KNL-NEXT:    kmovw %eax, %k4
1074 ; KNL-NEXT:    kshiftrw $5, %k0, %k5
1075 ; KNL-NEXT:    kxorw %k4, %k5, %k4
1076 ; KNL-NEXT:    kshiftlw $15, %k4, %k4
1077 ; KNL-NEXT:    kshiftrw $10, %k4, %k4
1078 ; KNL-NEXT:    kxorw %k4, %k0, %k4
1079 ; KNL-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k3} {z}
1080 ; KNL-NEXT:    vpmovdb %zmm0, %xmm0
1081 ; KNL-NEXT:    vpternlogd $255, %zmm1, %zmm1, %zmm1 {%k2} {z}
1082 ; KNL-NEXT:    vpmovdb %zmm1, %xmm1
1083 ; KNL-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm1
1084 ; KNL-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k4} {z}
1085 ; KNL-NEXT:    vpmovdb %zmm0, %xmm0
1086 ; KNL-NEXT:    vpternlogd $255, %zmm2, %zmm2, %zmm2 {%k1} {z}
1087 ; KNL-NEXT:    vpmovdb %zmm2, %xmm2
1088 ; KNL-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
1089 ; KNL-NEXT:    retq
1091 ; SKX-LABEL: test16:
1092 ; SKX:       ## %bb.0:
1093 ; SKX-NEXT:    kmovq %rdi, %k0
1094 ; SKX-NEXT:    movb $1, %al
1095 ; SKX-NEXT:    kmovd %eax, %k1
1096 ; SKX-NEXT:    kshiftrq $5, %k0, %k2
1097 ; SKX-NEXT:    kxorq %k1, %k2, %k1
1098 ; SKX-NEXT:    kshiftlq $63, %k1, %k1
1099 ; SKX-NEXT:    kshiftrq $58, %k1, %k1
1100 ; SKX-NEXT:    kxorq %k1, %k0, %k0
1101 ; SKX-NEXT:    vpmovm2b %k0, %zmm0
1102 ; SKX-NEXT:    retq
1104 ; AVX512BW-LABEL: test16:
1105 ; AVX512BW:       ## %bb.0:
1106 ; AVX512BW-NEXT:    kmovq %rdi, %k0
1107 ; AVX512BW-NEXT:    movb $1, %al
1108 ; AVX512BW-NEXT:    kmovd %eax, %k1
1109 ; AVX512BW-NEXT:    kshiftrq $5, %k0, %k2
1110 ; AVX512BW-NEXT:    kxorq %k1, %k2, %k1
1111 ; AVX512BW-NEXT:    kshiftlq $63, %k1, %k1
1112 ; AVX512BW-NEXT:    kshiftrq $58, %k1, %k1
1113 ; AVX512BW-NEXT:    kxorq %k1, %k0, %k0
1114 ; AVX512BW-NEXT:    vpmovm2b %k0, %zmm0
1115 ; AVX512BW-NEXT:    retq
1117 ; AVX512DQ-LABEL: test16:
1118 ; AVX512DQ:       ## %bb.0:
1119 ; AVX512DQ-NEXT:    movq %rdi, %rax
1120 ; AVX512DQ-NEXT:    movl %edi, %ecx
1121 ; AVX512DQ-NEXT:    kmovw %edi, %k0
1122 ; AVX512DQ-NEXT:    shrq $32, %rdi
1123 ; AVX512DQ-NEXT:    shrq $48, %rax
1124 ; AVX512DQ-NEXT:    shrl $16, %ecx
1125 ; AVX512DQ-NEXT:    kmovw %ecx, %k1
1126 ; AVX512DQ-NEXT:    kmovw %eax, %k2
1127 ; AVX512DQ-NEXT:    kmovw %edi, %k3
1128 ; AVX512DQ-NEXT:    movb $1, %al
1129 ; AVX512DQ-NEXT:    kmovw %eax, %k4
1130 ; AVX512DQ-NEXT:    kshiftrw $5, %k0, %k5
1131 ; AVX512DQ-NEXT:    kxorw %k4, %k5, %k4
1132 ; AVX512DQ-NEXT:    kshiftlw $15, %k4, %k4
1133 ; AVX512DQ-NEXT:    kshiftrw $10, %k4, %k4
1134 ; AVX512DQ-NEXT:    kxorw %k4, %k0, %k0
1135 ; AVX512DQ-NEXT:    vpmovm2d %k3, %zmm0
1136 ; AVX512DQ-NEXT:    vpmovdb %zmm0, %xmm0
1137 ; AVX512DQ-NEXT:    vpmovm2d %k2, %zmm1
1138 ; AVX512DQ-NEXT:    vpmovdb %zmm1, %xmm1
1139 ; AVX512DQ-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm1
1140 ; AVX512DQ-NEXT:    vpmovm2d %k0, %zmm0
1141 ; AVX512DQ-NEXT:    vpmovdb %zmm0, %xmm0
1142 ; AVX512DQ-NEXT:    vpmovm2d %k1, %zmm2
1143 ; AVX512DQ-NEXT:    vpmovdb %zmm2, %xmm2
1144 ; AVX512DQ-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
1145 ; AVX512DQ-NEXT:    retq
1147 ; X86-LABEL: test16:
1148 ; X86:       ## %bb.0:
1149 ; X86-NEXT:    kmovq {{[0-9]+}}(%esp), %k0
1150 ; X86-NEXT:    movb $1, %al
1151 ; X86-NEXT:    kmovd %eax, %k1
1152 ; X86-NEXT:    kshiftrq $5, %k0, %k2
1153 ; X86-NEXT:    kxorq %k1, %k2, %k1
1154 ; X86-NEXT:    kshiftlq $63, %k1, %k1
1155 ; X86-NEXT:    kshiftrq $58, %k1, %k1
1156 ; X86-NEXT:    kxorq %k1, %k0, %k0
1157 ; X86-NEXT:    vpmovm2b %k0, %zmm0
1158 ; X86-NEXT:    retl
1159   %a = bitcast i64 %x to <64 x i1>
1160   %b = insertelement <64 x i1>%a, i1 true, i32 5
1161   %c = sext <64 x i1>%b to <64 x i8>
1162   ret <64 x i8>%c
1165 define <64 x i8> @test17(i64 %x, i32 %y, i32 %z) {
1167 ; KNL-LABEL: test17:
1168 ; KNL:       ## %bb.0:
1169 ; KNL-NEXT:    movq %rdi, %rax
1170 ; KNL-NEXT:    movl %edi, %ecx
1171 ; KNL-NEXT:    kmovw %edi, %k0
1172 ; KNL-NEXT:    shrq $32, %rdi
1173 ; KNL-NEXT:    shrq $48, %rax
1174 ; KNL-NEXT:    shrl $16, %ecx
1175 ; KNL-NEXT:    kmovw %ecx, %k1
1176 ; KNL-NEXT:    kmovw %eax, %k2
1177 ; KNL-NEXT:    kmovw %edi, %k3
1178 ; KNL-NEXT:    cmpl %edx, %esi
1179 ; KNL-NEXT:    setg %al
1180 ; KNL-NEXT:    kshiftrw $5, %k0, %k4
1181 ; KNL-NEXT:    kmovw %eax, %k5
1182 ; KNL-NEXT:    kxorw %k5, %k4, %k4
1183 ; KNL-NEXT:    kshiftlw $15, %k4, %k4
1184 ; KNL-NEXT:    kshiftrw $10, %k4, %k4
1185 ; KNL-NEXT:    kxorw %k4, %k0, %k4
1186 ; KNL-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k3} {z}
1187 ; KNL-NEXT:    vpmovdb %zmm0, %xmm0
1188 ; KNL-NEXT:    vpternlogd $255, %zmm1, %zmm1, %zmm1 {%k2} {z}
1189 ; KNL-NEXT:    vpmovdb %zmm1, %xmm1
1190 ; KNL-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm1
1191 ; KNL-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k4} {z}
1192 ; KNL-NEXT:    vpmovdb %zmm0, %xmm0
1193 ; KNL-NEXT:    vpternlogd $255, %zmm2, %zmm2, %zmm2 {%k1} {z}
1194 ; KNL-NEXT:    vpmovdb %zmm2, %xmm2
1195 ; KNL-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
1196 ; KNL-NEXT:    retq
1198 ; SKX-LABEL: test17:
1199 ; SKX:       ## %bb.0:
1200 ; SKX-NEXT:    kmovq %rdi, %k0
1201 ; SKX-NEXT:    cmpl %edx, %esi
1202 ; SKX-NEXT:    setg %al
1203 ; SKX-NEXT:    kmovd %eax, %k1
1204 ; SKX-NEXT:    kshiftrq $5, %k0, %k2
1205 ; SKX-NEXT:    kxorq %k1, %k2, %k1
1206 ; SKX-NEXT:    kshiftlq $63, %k1, %k1
1207 ; SKX-NEXT:    kshiftrq $58, %k1, %k1
1208 ; SKX-NEXT:    kxorq %k1, %k0, %k0
1209 ; SKX-NEXT:    vpmovm2b %k0, %zmm0
1210 ; SKX-NEXT:    retq
1212 ; AVX512BW-LABEL: test17:
1213 ; AVX512BW:       ## %bb.0:
1214 ; AVX512BW-NEXT:    kmovq %rdi, %k0
1215 ; AVX512BW-NEXT:    cmpl %edx, %esi
1216 ; AVX512BW-NEXT:    setg %al
1217 ; AVX512BW-NEXT:    kmovd %eax, %k1
1218 ; AVX512BW-NEXT:    kshiftrq $5, %k0, %k2
1219 ; AVX512BW-NEXT:    kxorq %k1, %k2, %k1
1220 ; AVX512BW-NEXT:    kshiftlq $63, %k1, %k1
1221 ; AVX512BW-NEXT:    kshiftrq $58, %k1, %k1
1222 ; AVX512BW-NEXT:    kxorq %k1, %k0, %k0
1223 ; AVX512BW-NEXT:    vpmovm2b %k0, %zmm0
1224 ; AVX512BW-NEXT:    retq
1226 ; AVX512DQ-LABEL: test17:
1227 ; AVX512DQ:       ## %bb.0:
1228 ; AVX512DQ-NEXT:    movq %rdi, %rax
1229 ; AVX512DQ-NEXT:    movl %edi, %ecx
1230 ; AVX512DQ-NEXT:    kmovw %edi, %k0
1231 ; AVX512DQ-NEXT:    shrq $32, %rdi
1232 ; AVX512DQ-NEXT:    shrq $48, %rax
1233 ; AVX512DQ-NEXT:    shrl $16, %ecx
1234 ; AVX512DQ-NEXT:    kmovw %ecx, %k1
1235 ; AVX512DQ-NEXT:    kmovw %eax, %k2
1236 ; AVX512DQ-NEXT:    kmovw %edi, %k3
1237 ; AVX512DQ-NEXT:    cmpl %edx, %esi
1238 ; AVX512DQ-NEXT:    setg %al
1239 ; AVX512DQ-NEXT:    kshiftrw $5, %k0, %k4
1240 ; AVX512DQ-NEXT:    kmovw %eax, %k5
1241 ; AVX512DQ-NEXT:    kxorw %k5, %k4, %k4
1242 ; AVX512DQ-NEXT:    kshiftlw $15, %k4, %k4
1243 ; AVX512DQ-NEXT:    kshiftrw $10, %k4, %k4
1244 ; AVX512DQ-NEXT:    kxorw %k4, %k0, %k0
1245 ; AVX512DQ-NEXT:    vpmovm2d %k3, %zmm0
1246 ; AVX512DQ-NEXT:    vpmovdb %zmm0, %xmm0
1247 ; AVX512DQ-NEXT:    vpmovm2d %k2, %zmm1
1248 ; AVX512DQ-NEXT:    vpmovdb %zmm1, %xmm1
1249 ; AVX512DQ-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm1
1250 ; AVX512DQ-NEXT:    vpmovm2d %k0, %zmm0
1251 ; AVX512DQ-NEXT:    vpmovdb %zmm0, %xmm0
1252 ; AVX512DQ-NEXT:    vpmovm2d %k1, %zmm2
1253 ; AVX512DQ-NEXT:    vpmovdb %zmm2, %xmm2
1254 ; AVX512DQ-NEXT:    vinserti128 $1, %xmm2, %ymm0, %ymm0
1255 ; AVX512DQ-NEXT:    retq
1257 ; X86-LABEL: test17:
1258 ; X86:       ## %bb.0:
1259 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1260 ; X86-NEXT:    kmovq {{[0-9]+}}(%esp), %k0
1261 ; X86-NEXT:    cmpl {{[0-9]+}}(%esp), %eax
1262 ; X86-NEXT:    setg %al
1263 ; X86-NEXT:    kmovd %eax, %k1
1264 ; X86-NEXT:    kshiftrq $5, %k0, %k2
1265 ; X86-NEXT:    kxorq %k1, %k2, %k1
1266 ; X86-NEXT:    kshiftlq $63, %k1, %k1
1267 ; X86-NEXT:    kshiftrq $58, %k1, %k1
1268 ; X86-NEXT:    kxorq %k1, %k0, %k0
1269 ; X86-NEXT:    vpmovm2b %k0, %zmm0
1270 ; X86-NEXT:    retl
1271   %a = bitcast i64 %x to <64 x i1>
1272   %b = icmp sgt i32 %y, %z
1273   %c = insertelement <64 x i1>%a, i1 %b, i32 5
1274   %d = sext <64 x i1>%c to <64 x i8>
1275   ret <64 x i8>%d
1278 define <8 x i1> @test18(i8 %a, i16 %y) {
1279 ; KNL-LABEL: test18:
1280 ; KNL:       ## %bb.0:
1281 ; KNL-NEXT:    kmovw %edi, %k0
1282 ; KNL-NEXT:    kmovw %esi, %k1
1283 ; KNL-NEXT:    kshiftrw $8, %k1, %k2
1284 ; KNL-NEXT:    kshiftrw $9, %k1, %k1
1285 ; KNL-NEXT:    kshiftrw $6, %k0, %k3
1286 ; KNL-NEXT:    kxorw %k1, %k3, %k1
1287 ; KNL-NEXT:    kshiftlw $15, %k1, %k1
1288 ; KNL-NEXT:    kshiftrw $9, %k1, %k1
1289 ; KNL-NEXT:    kxorw %k1, %k0, %k0
1290 ; KNL-NEXT:    kshiftlw $9, %k0, %k0
1291 ; KNL-NEXT:    kshiftrw $9, %k0, %k0
1292 ; KNL-NEXT:    kshiftlw $7, %k2, %k1
1293 ; KNL-NEXT:    korw %k1, %k0, %k1
1294 ; KNL-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
1295 ; KNL-NEXT:    vpmovdw %zmm0, %ymm0
1296 ; KNL-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $ymm0
1297 ; KNL-NEXT:    vzeroupper
1298 ; KNL-NEXT:    retq
1300 ; SKX-LABEL: test18:
1301 ; SKX:       ## %bb.0:
1302 ; SKX-NEXT:    kmovd %edi, %k0
1303 ; SKX-NEXT:    kmovd %esi, %k1
1304 ; SKX-NEXT:    kshiftrw $8, %k1, %k2
1305 ; SKX-NEXT:    kshiftrw $9, %k1, %k1
1306 ; SKX-NEXT:    kshiftrb $6, %k0, %k3
1307 ; SKX-NEXT:    kxorb %k1, %k3, %k1
1308 ; SKX-NEXT:    kshiftlb $7, %k1, %k1
1309 ; SKX-NEXT:    kshiftrb $1, %k1, %k1
1310 ; SKX-NEXT:    kxorb %k1, %k0, %k0
1311 ; SKX-NEXT:    kshiftlb $1, %k0, %k0
1312 ; SKX-NEXT:    kshiftrb $1, %k0, %k0
1313 ; SKX-NEXT:    kshiftlb $7, %k2, %k1
1314 ; SKX-NEXT:    korb %k1, %k0, %k0
1315 ; SKX-NEXT:    vpmovm2w %k0, %xmm0
1316 ; SKX-NEXT:    retq
1318 ; AVX512BW-LABEL: test18:
1319 ; AVX512BW:       ## %bb.0:
1320 ; AVX512BW-NEXT:    kmovd %edi, %k0
1321 ; AVX512BW-NEXT:    kmovd %esi, %k1
1322 ; AVX512BW-NEXT:    kshiftrw $8, %k1, %k2
1323 ; AVX512BW-NEXT:    kshiftrw $9, %k1, %k1
1324 ; AVX512BW-NEXT:    kshiftrw $6, %k0, %k3
1325 ; AVX512BW-NEXT:    kxorw %k1, %k3, %k1
1326 ; AVX512BW-NEXT:    kshiftlw $15, %k1, %k1
1327 ; AVX512BW-NEXT:    kshiftrw $9, %k1, %k1
1328 ; AVX512BW-NEXT:    kxorw %k1, %k0, %k0
1329 ; AVX512BW-NEXT:    kshiftlw $9, %k0, %k0
1330 ; AVX512BW-NEXT:    kshiftrw $9, %k0, %k0
1331 ; AVX512BW-NEXT:    kshiftlw $7, %k2, %k1
1332 ; AVX512BW-NEXT:    korw %k1, %k0, %k0
1333 ; AVX512BW-NEXT:    vpmovm2w %k0, %zmm0
1334 ; AVX512BW-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $zmm0
1335 ; AVX512BW-NEXT:    vzeroupper
1336 ; AVX512BW-NEXT:    retq
1338 ; AVX512DQ-LABEL: test18:
1339 ; AVX512DQ:       ## %bb.0:
1340 ; AVX512DQ-NEXT:    kmovw %edi, %k0
1341 ; AVX512DQ-NEXT:    kmovw %esi, %k1
1342 ; AVX512DQ-NEXT:    kshiftrw $8, %k1, %k2
1343 ; AVX512DQ-NEXT:    kshiftrw $9, %k1, %k1
1344 ; AVX512DQ-NEXT:    kshiftrb $6, %k0, %k3
1345 ; AVX512DQ-NEXT:    kxorb %k1, %k3, %k1
1346 ; AVX512DQ-NEXT:    kshiftlb $7, %k1, %k1
1347 ; AVX512DQ-NEXT:    kshiftrb $1, %k1, %k1
1348 ; AVX512DQ-NEXT:    kxorb %k1, %k0, %k0
1349 ; AVX512DQ-NEXT:    kshiftlb $1, %k0, %k0
1350 ; AVX512DQ-NEXT:    kshiftrb $1, %k0, %k0
1351 ; AVX512DQ-NEXT:    kshiftlb $7, %k2, %k1
1352 ; AVX512DQ-NEXT:    korb %k1, %k0, %k0
1353 ; AVX512DQ-NEXT:    vpmovm2d %k0, %zmm0
1354 ; AVX512DQ-NEXT:    vpmovdw %zmm0, %ymm0
1355 ; AVX512DQ-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $ymm0
1356 ; AVX512DQ-NEXT:    vzeroupper
1357 ; AVX512DQ-NEXT:    retq
1359 ; X86-LABEL: test18:
1360 ; X86:       ## %bb.0:
1361 ; X86-NEXT:    kmovb {{[0-9]+}}(%esp), %k0
1362 ; X86-NEXT:    kmovw {{[0-9]+}}(%esp), %k1
1363 ; X86-NEXT:    kshiftrw $8, %k1, %k2
1364 ; X86-NEXT:    kshiftrw $9, %k1, %k1
1365 ; X86-NEXT:    kshiftrb $6, %k0, %k3
1366 ; X86-NEXT:    kxorb %k1, %k3, %k1
1367 ; X86-NEXT:    kshiftlb $7, %k1, %k1
1368 ; X86-NEXT:    kshiftrb $1, %k1, %k1
1369 ; X86-NEXT:    kxorb %k1, %k0, %k0
1370 ; X86-NEXT:    kshiftlb $1, %k0, %k0
1371 ; X86-NEXT:    kshiftrb $1, %k0, %k0
1372 ; X86-NEXT:    kshiftlb $7, %k2, %k1
1373 ; X86-NEXT:    korb %k1, %k0, %k0
1374 ; X86-NEXT:    vpmovm2w %k0, %xmm0
1375 ; X86-NEXT:    retl
1376   %b = bitcast i8 %a to <8 x i1>
1377   %b1 = bitcast i16 %y to <16 x i1>
1378   %el1 = extractelement <16 x i1>%b1, i32 8
1379   %el2 = extractelement <16 x i1>%b1, i32 9
1380   %c = insertelement <8 x i1>%b, i1 %el1, i32 7
1381   %d = insertelement <8 x i1>%c, i1 %el2, i32 6
1382   ret <8 x i1>%d
1384 define <32 x i16> @test21(<32 x i16> %x , <32 x i1> %mask) nounwind readnone {
1385 ; KNL-LABEL: test21:
1386 ; KNL:       ## %bb.0:
1387 ; KNL-NEXT:    vextracti128 $1, %ymm2, %xmm3
1388 ; KNL-NEXT:    vpmovzxbw {{.*#+}} ymm3 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero,xmm3[8],zero,xmm3[9],zero,xmm3[10],zero,xmm3[11],zero,xmm3[12],zero,xmm3[13],zero,xmm3[14],zero,xmm3[15],zero
1389 ; KNL-NEXT:    vpmovzxbw {{.*#+}} ymm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero,xmm2[8],zero,xmm2[9],zero,xmm2[10],zero,xmm2[11],zero,xmm2[12],zero,xmm2[13],zero,xmm2[14],zero,xmm2[15],zero
1390 ; KNL-NEXT:    vpsllw $15, %ymm2, %ymm2
1391 ; KNL-NEXT:    vpsraw $15, %ymm2, %ymm2
1392 ; KNL-NEXT:    vpand %ymm0, %ymm2, %ymm0
1393 ; KNL-NEXT:    vpsllw $15, %ymm3, %ymm2
1394 ; KNL-NEXT:    vpsraw $15, %ymm2, %ymm2
1395 ; KNL-NEXT:    vpand %ymm1, %ymm2, %ymm1
1396 ; KNL-NEXT:    retq
1398 ; SKX-LABEL: test21:
1399 ; SKX:       ## %bb.0:
1400 ; SKX-NEXT:    vpsllw $7, %ymm1, %ymm1
1401 ; SKX-NEXT:    vpmovb2m %ymm1, %k1
1402 ; SKX-NEXT:    vmovdqu16 %zmm0, %zmm0 {%k1} {z}
1403 ; SKX-NEXT:    retq
1405 ; AVX512BW-LABEL: test21:
1406 ; AVX512BW:       ## %bb.0:
1407 ; AVX512BW-NEXT:    vpsllw $7, %ymm1, %ymm1
1408 ; AVX512BW-NEXT:    vpmovb2m %zmm1, %k1
1409 ; AVX512BW-NEXT:    vmovdqu16 %zmm0, %zmm0 {%k1} {z}
1410 ; AVX512BW-NEXT:    retq
1412 ; AVX512DQ-LABEL: test21:
1413 ; AVX512DQ:       ## %bb.0:
1414 ; AVX512DQ-NEXT:    vextracti128 $1, %ymm2, %xmm3
1415 ; AVX512DQ-NEXT:    vpmovzxbw {{.*#+}} ymm3 = xmm3[0],zero,xmm3[1],zero,xmm3[2],zero,xmm3[3],zero,xmm3[4],zero,xmm3[5],zero,xmm3[6],zero,xmm3[7],zero,xmm3[8],zero,xmm3[9],zero,xmm3[10],zero,xmm3[11],zero,xmm3[12],zero,xmm3[13],zero,xmm3[14],zero,xmm3[15],zero
1416 ; AVX512DQ-NEXT:    vpmovzxbw {{.*#+}} ymm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero,xmm2[8],zero,xmm2[9],zero,xmm2[10],zero,xmm2[11],zero,xmm2[12],zero,xmm2[13],zero,xmm2[14],zero,xmm2[15],zero
1417 ; AVX512DQ-NEXT:    vpsllw $15, %ymm2, %ymm2
1418 ; AVX512DQ-NEXT:    vpsraw $15, %ymm2, %ymm2
1419 ; AVX512DQ-NEXT:    vpand %ymm0, %ymm2, %ymm0
1420 ; AVX512DQ-NEXT:    vpsllw $15, %ymm3, %ymm2
1421 ; AVX512DQ-NEXT:    vpsraw $15, %ymm2, %ymm2
1422 ; AVX512DQ-NEXT:    vpand %ymm1, %ymm2, %ymm1
1423 ; AVX512DQ-NEXT:    retq
1425 ; X86-LABEL: test21:
1426 ; X86:       ## %bb.0:
1427 ; X86-NEXT:    vpsllw $7, %ymm1, %ymm1
1428 ; X86-NEXT:    vpmovb2m %ymm1, %k1
1429 ; X86-NEXT:    vmovdqu16 %zmm0, %zmm0 {%k1} {z}
1430 ; X86-NEXT:    retl
1431   %ret = select <32 x i1> %mask, <32 x i16> %x, <32 x i16> zeroinitializer
1432   ret <32 x i16> %ret
1435 define void @test22(<4 x i1> %a, <4 x i1>* %addr) {
1436 ; KNL-LABEL: test22:
1437 ; KNL:       ## %bb.0:
1438 ; KNL-NEXT:    vpslld $31, %xmm0, %xmm0
1439 ; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k0
1440 ; KNL-NEXT:    kmovw %k0, %eax
1441 ; KNL-NEXT:    movb %al, (%rdi)
1442 ; KNL-NEXT:    vzeroupper
1443 ; KNL-NEXT:    retq
1445 ; SKX-LABEL: test22:
1446 ; SKX:       ## %bb.0:
1447 ; SKX-NEXT:    vpslld $31, %xmm0, %xmm0
1448 ; SKX-NEXT:    vpmovd2m %xmm0, %k0
1449 ; SKX-NEXT:    kmovb %k0, (%rdi)
1450 ; SKX-NEXT:    retq
1452 ; AVX512BW-LABEL: test22:
1453 ; AVX512BW:       ## %bb.0:
1454 ; AVX512BW-NEXT:    vpslld $31, %xmm0, %xmm0
1455 ; AVX512BW-NEXT:    vptestmd %zmm0, %zmm0, %k0
1456 ; AVX512BW-NEXT:    kmovd %k0, %eax
1457 ; AVX512BW-NEXT:    movb %al, (%rdi)
1458 ; AVX512BW-NEXT:    vzeroupper
1459 ; AVX512BW-NEXT:    retq
1461 ; AVX512DQ-LABEL: test22:
1462 ; AVX512DQ:       ## %bb.0:
1463 ; AVX512DQ-NEXT:    vpslld $31, %xmm0, %xmm0
1464 ; AVX512DQ-NEXT:    vpmovd2m %zmm0, %k0
1465 ; AVX512DQ-NEXT:    kmovb %k0, (%rdi)
1466 ; AVX512DQ-NEXT:    vzeroupper
1467 ; AVX512DQ-NEXT:    retq
1469 ; X86-LABEL: test22:
1470 ; X86:       ## %bb.0:
1471 ; X86-NEXT:    vpslld $31, %xmm0, %xmm0
1472 ; X86-NEXT:    vpmovd2m %xmm0, %k0
1473 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1474 ; X86-NEXT:    kmovb %k0, (%eax)
1475 ; X86-NEXT:    retl
1476   store <4 x i1> %a, <4 x i1>* %addr
1477   ret void
1480 define void @test23(<2 x i1> %a, <2 x i1>* %addr) {
1481 ; KNL-LABEL: test23:
1482 ; KNL:       ## %bb.0:
1483 ; KNL-NEXT:    vpsllq $63, %xmm0, %xmm0
1484 ; KNL-NEXT:    vptestmq %zmm0, %zmm0, %k0
1485 ; KNL-NEXT:    kmovw %k0, %eax
1486 ; KNL-NEXT:    movb %al, (%rdi)
1487 ; KNL-NEXT:    vzeroupper
1488 ; KNL-NEXT:    retq
1490 ; SKX-LABEL: test23:
1491 ; SKX:       ## %bb.0:
1492 ; SKX-NEXT:    vpsllq $63, %xmm0, %xmm0
1493 ; SKX-NEXT:    vpmovq2m %xmm0, %k0
1494 ; SKX-NEXT:    kmovb %k0, (%rdi)
1495 ; SKX-NEXT:    retq
1497 ; AVX512BW-LABEL: test23:
1498 ; AVX512BW:       ## %bb.0:
1499 ; AVX512BW-NEXT:    vpsllq $63, %xmm0, %xmm0
1500 ; AVX512BW-NEXT:    vptestmq %zmm0, %zmm0, %k0
1501 ; AVX512BW-NEXT:    kmovd %k0, %eax
1502 ; AVX512BW-NEXT:    movb %al, (%rdi)
1503 ; AVX512BW-NEXT:    vzeroupper
1504 ; AVX512BW-NEXT:    retq
1506 ; AVX512DQ-LABEL: test23:
1507 ; AVX512DQ:       ## %bb.0:
1508 ; AVX512DQ-NEXT:    vpsllq $63, %xmm0, %xmm0
1509 ; AVX512DQ-NEXT:    vpmovq2m %zmm0, %k0
1510 ; AVX512DQ-NEXT:    kmovb %k0, (%rdi)
1511 ; AVX512DQ-NEXT:    vzeroupper
1512 ; AVX512DQ-NEXT:    retq
1514 ; X86-LABEL: test23:
1515 ; X86:       ## %bb.0:
1516 ; X86-NEXT:    vpsllq $63, %xmm0, %xmm0
1517 ; X86-NEXT:    vpmovq2m %xmm0, %k0
1518 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1519 ; X86-NEXT:    kmovb %k0, (%eax)
1520 ; X86-NEXT:    retl
1521   store <2 x i1> %a, <2 x i1>* %addr
1522   ret void
1525 define void @store_v1i1(<1 x i1> %c , <1 x i1>* %ptr) {
1526 ; KNL-LABEL: store_v1i1:
1527 ; KNL:       ## %bb.0:
1528 ; KNL-NEXT:    kmovw %edi, %k0
1529 ; KNL-NEXT:    kxnorw %k0, %k0, %k1
1530 ; KNL-NEXT:    kxorw %k1, %k0, %k0
1531 ; KNL-NEXT:    kmovw %k0, %eax
1532 ; KNL-NEXT:    movb %al, (%rsi)
1533 ; KNL-NEXT:    retq
1535 ; SKX-LABEL: store_v1i1:
1536 ; SKX:       ## %bb.0:
1537 ; SKX-NEXT:    kmovd %edi, %k0
1538 ; SKX-NEXT:    kxnorw %k0, %k0, %k1
1539 ; SKX-NEXT:    kxorw %k1, %k0, %k0
1540 ; SKX-NEXT:    kmovb %k0, (%rsi)
1541 ; SKX-NEXT:    retq
1543 ; AVX512BW-LABEL: store_v1i1:
1544 ; AVX512BW:       ## %bb.0:
1545 ; AVX512BW-NEXT:    kmovd %edi, %k0
1546 ; AVX512BW-NEXT:    kxnorw %k0, %k0, %k1
1547 ; AVX512BW-NEXT:    kxorw %k1, %k0, %k0
1548 ; AVX512BW-NEXT:    kmovd %k0, %eax
1549 ; AVX512BW-NEXT:    movb %al, (%rsi)
1550 ; AVX512BW-NEXT:    retq
1552 ; AVX512DQ-LABEL: store_v1i1:
1553 ; AVX512DQ:       ## %bb.0:
1554 ; AVX512DQ-NEXT:    kmovw %edi, %k0
1555 ; AVX512DQ-NEXT:    kxnorw %k0, %k0, %k1
1556 ; AVX512DQ-NEXT:    kxorw %k1, %k0, %k0
1557 ; AVX512DQ-NEXT:    kmovb %k0, (%rsi)
1558 ; AVX512DQ-NEXT:    retq
1560 ; X86-LABEL: store_v1i1:
1561 ; X86:       ## %bb.0:
1562 ; X86-NEXT:    kmovd {{[0-9]+}}(%esp), %k0
1563 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1564 ; X86-NEXT:    kxnorw %k0, %k0, %k1
1565 ; X86-NEXT:    kxorw %k1, %k0, %k0
1566 ; X86-NEXT:    kmovb %k0, (%eax)
1567 ; X86-NEXT:    retl
1568   %x = xor <1 x i1> %c, <i1 1>
1569   store <1 x i1> %x, <1 x i1>*  %ptr, align 4
1570   ret void
1573 define void @store_v2i1(<2 x i1> %c , <2 x i1>* %ptr) {
1574 ; KNL-LABEL: store_v2i1:
1575 ; KNL:       ## %bb.0:
1576 ; KNL-NEXT:    vpsllq $63, %xmm0, %xmm0
1577 ; KNL-NEXT:    vptestnmq %zmm0, %zmm0, %k0
1578 ; KNL-NEXT:    kmovw %k0, %eax
1579 ; KNL-NEXT:    movb %al, (%rdi)
1580 ; KNL-NEXT:    vzeroupper
1581 ; KNL-NEXT:    retq
1583 ; SKX-LABEL: store_v2i1:
1584 ; SKX:       ## %bb.0:
1585 ; SKX-NEXT:    vpsllq $63, %xmm0, %xmm0
1586 ; SKX-NEXT:    vpmovq2m %xmm0, %k0
1587 ; SKX-NEXT:    knotw %k0, %k0
1588 ; SKX-NEXT:    kmovb %k0, (%rdi)
1589 ; SKX-NEXT:    retq
1591 ; AVX512BW-LABEL: store_v2i1:
1592 ; AVX512BW:       ## %bb.0:
1593 ; AVX512BW-NEXT:    vpsllq $63, %xmm0, %xmm0
1594 ; AVX512BW-NEXT:    vptestnmq %zmm0, %zmm0, %k0
1595 ; AVX512BW-NEXT:    kmovd %k0, %eax
1596 ; AVX512BW-NEXT:    movb %al, (%rdi)
1597 ; AVX512BW-NEXT:    vzeroupper
1598 ; AVX512BW-NEXT:    retq
1600 ; AVX512DQ-LABEL: store_v2i1:
1601 ; AVX512DQ:       ## %bb.0:
1602 ; AVX512DQ-NEXT:    vpsllq $63, %xmm0, %xmm0
1603 ; AVX512DQ-NEXT:    vpmovq2m %zmm0, %k0
1604 ; AVX512DQ-NEXT:    knotw %k0, %k0
1605 ; AVX512DQ-NEXT:    kmovb %k0, (%rdi)
1606 ; AVX512DQ-NEXT:    vzeroupper
1607 ; AVX512DQ-NEXT:    retq
1609 ; X86-LABEL: store_v2i1:
1610 ; X86:       ## %bb.0:
1611 ; X86-NEXT:    vpsllq $63, %xmm0, %xmm0
1612 ; X86-NEXT:    vpmovq2m %xmm0, %k0
1613 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1614 ; X86-NEXT:    knotw %k0, %k0
1615 ; X86-NEXT:    kmovb %k0, (%eax)
1616 ; X86-NEXT:    retl
1617   %x = xor <2 x i1> %c, <i1 1, i1 1>
1618   store <2 x i1> %x, <2 x i1>*  %ptr, align 4
1619   ret void
1622 define void @store_v4i1(<4 x i1> %c , <4 x i1>* %ptr) {
1623 ; KNL-LABEL: store_v4i1:
1624 ; KNL:       ## %bb.0:
1625 ; KNL-NEXT:    vpslld $31, %xmm0, %xmm0
1626 ; KNL-NEXT:    vptestnmd %zmm0, %zmm0, %k0
1627 ; KNL-NEXT:    kmovw %k0, %eax
1628 ; KNL-NEXT:    movb %al, (%rdi)
1629 ; KNL-NEXT:    vzeroupper
1630 ; KNL-NEXT:    retq
1632 ; SKX-LABEL: store_v4i1:
1633 ; SKX:       ## %bb.0:
1634 ; SKX-NEXT:    vpslld $31, %xmm0, %xmm0
1635 ; SKX-NEXT:    vpmovd2m %xmm0, %k0
1636 ; SKX-NEXT:    knotw %k0, %k0
1637 ; SKX-NEXT:    kmovb %k0, (%rdi)
1638 ; SKX-NEXT:    retq
1640 ; AVX512BW-LABEL: store_v4i1:
1641 ; AVX512BW:       ## %bb.0:
1642 ; AVX512BW-NEXT:    vpslld $31, %xmm0, %xmm0
1643 ; AVX512BW-NEXT:    vptestnmd %zmm0, %zmm0, %k0
1644 ; AVX512BW-NEXT:    kmovd %k0, %eax
1645 ; AVX512BW-NEXT:    movb %al, (%rdi)
1646 ; AVX512BW-NEXT:    vzeroupper
1647 ; AVX512BW-NEXT:    retq
1649 ; AVX512DQ-LABEL: store_v4i1:
1650 ; AVX512DQ:       ## %bb.0:
1651 ; AVX512DQ-NEXT:    vpslld $31, %xmm0, %xmm0
1652 ; AVX512DQ-NEXT:    vpmovd2m %zmm0, %k0
1653 ; AVX512DQ-NEXT:    knotw %k0, %k0
1654 ; AVX512DQ-NEXT:    kmovb %k0, (%rdi)
1655 ; AVX512DQ-NEXT:    vzeroupper
1656 ; AVX512DQ-NEXT:    retq
1658 ; X86-LABEL: store_v4i1:
1659 ; X86:       ## %bb.0:
1660 ; X86-NEXT:    vpslld $31, %xmm0, %xmm0
1661 ; X86-NEXT:    vpmovd2m %xmm0, %k0
1662 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1663 ; X86-NEXT:    knotw %k0, %k0
1664 ; X86-NEXT:    kmovb %k0, (%eax)
1665 ; X86-NEXT:    retl
1666   %x = xor <4 x i1> %c, <i1 1, i1 1, i1 1, i1 1>
1667   store <4 x i1> %x, <4 x i1>*  %ptr, align 4
1668   ret void
1671 define void @store_v8i1(<8 x i1> %c , <8 x i1>* %ptr) {
1672 ; KNL-LABEL: store_v8i1:
1673 ; KNL:       ## %bb.0:
1674 ; KNL-NEXT:    vpmovzxwq {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero
1675 ; KNL-NEXT:    vpsllq $63, %zmm0, %zmm0
1676 ; KNL-NEXT:    vptestnmq %zmm0, %zmm0, %k0
1677 ; KNL-NEXT:    kmovw %k0, %eax
1678 ; KNL-NEXT:    movb %al, (%rdi)
1679 ; KNL-NEXT:    vzeroupper
1680 ; KNL-NEXT:    retq
1682 ; SKX-LABEL: store_v8i1:
1683 ; SKX:       ## %bb.0:
1684 ; SKX-NEXT:    vpsllw $15, %xmm0, %xmm0
1685 ; SKX-NEXT:    vpmovw2m %xmm0, %k0
1686 ; SKX-NEXT:    knotb %k0, %k0
1687 ; SKX-NEXT:    kmovb %k0, (%rdi)
1688 ; SKX-NEXT:    retq
1690 ; AVX512BW-LABEL: store_v8i1:
1691 ; AVX512BW:       ## %bb.0:
1692 ; AVX512BW-NEXT:    vpsllw $15, %xmm0, %xmm0
1693 ; AVX512BW-NEXT:    vpmovw2m %zmm0, %k0
1694 ; AVX512BW-NEXT:    knotw %k0, %k0
1695 ; AVX512BW-NEXT:    kmovd %k0, %eax
1696 ; AVX512BW-NEXT:    movb %al, (%rdi)
1697 ; AVX512BW-NEXT:    vzeroupper
1698 ; AVX512BW-NEXT:    retq
1700 ; AVX512DQ-LABEL: store_v8i1:
1701 ; AVX512DQ:       ## %bb.0:
1702 ; AVX512DQ-NEXT:    vpmovzxwq {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero
1703 ; AVX512DQ-NEXT:    vpsllq $63, %zmm0, %zmm0
1704 ; AVX512DQ-NEXT:    vpmovq2m %zmm0, %k0
1705 ; AVX512DQ-NEXT:    knotb %k0, %k0
1706 ; AVX512DQ-NEXT:    kmovb %k0, (%rdi)
1707 ; AVX512DQ-NEXT:    vzeroupper
1708 ; AVX512DQ-NEXT:    retq
1710 ; X86-LABEL: store_v8i1:
1711 ; X86:       ## %bb.0:
1712 ; X86-NEXT:    vpsllw $15, %xmm0, %xmm0
1713 ; X86-NEXT:    vpmovw2m %xmm0, %k0
1714 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1715 ; X86-NEXT:    knotb %k0, %k0
1716 ; X86-NEXT:    kmovb %k0, (%eax)
1717 ; X86-NEXT:    retl
1718   %x = xor <8 x i1> %c, <i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1, i1 1>
1719   store <8 x i1> %x, <8 x i1>*  %ptr, align 4
1720   ret void
1723 define void @store_v16i1(<16 x i1> %c , <16 x i1>* %ptr) {
1724 ; KNL-LABEL: store_v16i1:
1725 ; KNL:       ## %bb.0:
1726 ; KNL-NEXT:    vpmovzxbd {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero
1727 ; KNL-NEXT:    vpslld $31, %zmm0, %zmm0
1728 ; KNL-NEXT:    vptestnmd %zmm0, %zmm0, %k0
1729 ; KNL-NEXT:    kmovw %k0, (%rdi)
1730 ; KNL-NEXT:    vzeroupper
1731 ; KNL-NEXT:    retq
1733 ; SKX-LABEL: store_v16i1:
1734 ; SKX:       ## %bb.0:
1735 ; SKX-NEXT:    vpsllw $7, %xmm0, %xmm0
1736 ; SKX-NEXT:    vpmovb2m %xmm0, %k0
1737 ; SKX-NEXT:    knotw %k0, %k0
1738 ; SKX-NEXT:    kmovw %k0, (%rdi)
1739 ; SKX-NEXT:    retq
1741 ; AVX512BW-LABEL: store_v16i1:
1742 ; AVX512BW:       ## %bb.0:
1743 ; AVX512BW-NEXT:    vpsllw $7, %xmm0, %xmm0
1744 ; AVX512BW-NEXT:    vpmovb2m %zmm0, %k0
1745 ; AVX512BW-NEXT:    knotw %k0, %k0
1746 ; AVX512BW-NEXT:    kmovw %k0, (%rdi)
1747 ; AVX512BW-NEXT:    vzeroupper
1748 ; AVX512BW-NEXT:    retq
1750 ; AVX512DQ-LABEL: store_v16i1:
1751 ; AVX512DQ:       ## %bb.0:
1752 ; AVX512DQ-NEXT:    vpmovzxbd {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero
1753 ; AVX512DQ-NEXT:    vpslld $31, %zmm0, %zmm0
1754 ; AVX512DQ-NEXT:    vpmovd2m %zmm0, %k0
1755 ; AVX512DQ-NEXT:    knotw %k0, %k0
1756 ; AVX512DQ-NEXT:    kmovw %k0, (%rdi)
1757 ; AVX512DQ-NEXT:    vzeroupper
1758 ; AVX512DQ-NEXT:    retq
1760 ; X86-LABEL: store_v16i1:
1761 ; X86:       ## %bb.0:
1762 ; X86-NEXT:    vpsllw $7, %xmm0, %xmm0
1763 ; X86-NEXT:    vpmovb2m %xmm0, %k0
1764 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1765 ; X86-NEXT:    knotw %k0, %k0
1766 ; X86-NEXT:    kmovw %k0, (%eax)
1767 ; X86-NEXT:    retl
1768   %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>
1769   store <16 x i1> %x, <16 x i1>*  %ptr, align 4
1770   ret void
1773 ;void f2(int);
1774 ;void f1(int c)
1776 ;  static int v = 0;
1777 ;  if (v == 0)
1778 ;    v = 1;
1779 ;  else
1780 ;    v = 0;
1781 ;  f2(v);
1784 @f1.v = internal unnamed_addr global i1 false, align 4
1786 define void @f1(i32 %c) {
1787 ; CHECK-LABEL: f1:
1788 ; CHECK:       ## %bb.0: ## %entry
1789 ; CHECK-NEXT:    movzbl {{.*}}(%rip), %edi
1790 ; CHECK-NEXT:    xorl $1, %edi
1791 ; CHECK-NEXT:    movb %dil, {{.*}}(%rip)
1792 ; CHECK-NEXT:    jmp _f2 ## TAILCALL
1794 ; X86-LABEL: f1:
1795 ; X86:       ## %bb.0: ## %entry
1796 ; X86-NEXT:    subl $12, %esp
1797 ; X86-NEXT:    .cfi_def_cfa_offset 16
1798 ; X86-NEXT:    movzbl _f1.v, %eax
1799 ; X86-NEXT:    xorl $1, %eax
1800 ; X86-NEXT:    movb %al, _f1.v
1801 ; X86-NEXT:    movl %eax, (%esp)
1802 ; X86-NEXT:    calll _f2
1803 ; X86-NEXT:    addl $12, %esp
1804 ; X86-NEXT:    retl
1805 entry:
1806   %.b1 = load i1, i1* @f1.v, align 4
1807   %not..b1 = xor i1 %.b1, true
1808   store i1 %not..b1, i1* @f1.v, align 4
1809   %0 = zext i1 %not..b1 to i32
1810   tail call void @f2(i32 %0) #2
1811   ret void
1814 declare void @f2(i32) #1
1816 define void @store_i16_i1(i16 %x, i1 *%y) {
1817 ; CHECK-LABEL: store_i16_i1:
1818 ; CHECK:       ## %bb.0:
1819 ; CHECK-NEXT:    andl $1, %edi
1820 ; CHECK-NEXT:    movb %dil, (%rsi)
1821 ; CHECK-NEXT:    retq
1823 ; X86-LABEL: store_i16_i1:
1824 ; X86:       ## %bb.0:
1825 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1826 ; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %ecx
1827 ; X86-NEXT:    andl $1, %ecx
1828 ; X86-NEXT:    movb %cl, (%eax)
1829 ; X86-NEXT:    retl
1830   %c = trunc i16 %x to i1
1831   store i1 %c, i1* %y
1832   ret void
1835 define void @store_i8_i1(i8 %x, i1 *%y) {
1836 ; CHECK-LABEL: store_i8_i1:
1837 ; CHECK:       ## %bb.0:
1838 ; CHECK-NEXT:    andl $1, %edi
1839 ; CHECK-NEXT:    movb %dil, (%rsi)
1840 ; CHECK-NEXT:    retq
1842 ; X86-LABEL: store_i8_i1:
1843 ; X86:       ## %bb.0:
1844 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1845 ; X86-NEXT:    movb {{[0-9]+}}(%esp), %cl
1846 ; X86-NEXT:    andb $1, %cl
1847 ; X86-NEXT:    movb %cl, (%eax)
1848 ; X86-NEXT:    retl
1849   %c = trunc i8 %x to i1
1850   store i1 %c, i1* %y
1851   ret void
1854 define <32 x i16> @test_build_vec_v32i1(<32 x i16> %x) {
1855 ; KNL-LABEL: test_build_vec_v32i1:
1856 ; KNL:       ## %bb.0:
1857 ; KNL-NEXT:    vandps {{.*}}(%rip), %ymm0, %ymm0
1858 ; KNL-NEXT:    vandps {{.*}}(%rip), %ymm1, %ymm1
1859 ; KNL-NEXT:    retq
1861 ; SKX-LABEL: test_build_vec_v32i1:
1862 ; SKX:       ## %bb.0:
1863 ; SKX-NEXT:    movl $1497715861, %eax ## imm = 0x59455495
1864 ; SKX-NEXT:    kmovd %eax, %k1
1865 ; SKX-NEXT:    vmovdqu16 %zmm0, %zmm0 {%k1} {z}
1866 ; SKX-NEXT:    retq
1868 ; AVX512BW-LABEL: test_build_vec_v32i1:
1869 ; AVX512BW:       ## %bb.0:
1870 ; AVX512BW-NEXT:    movl $1497715861, %eax ## imm = 0x59455495
1871 ; AVX512BW-NEXT:    kmovd %eax, %k1
1872 ; AVX512BW-NEXT:    vmovdqu16 %zmm0, %zmm0 {%k1} {z}
1873 ; AVX512BW-NEXT:    retq
1875 ; AVX512DQ-LABEL: test_build_vec_v32i1:
1876 ; AVX512DQ:       ## %bb.0:
1877 ; AVX512DQ-NEXT:    vandps {{.*}}(%rip), %ymm0, %ymm0
1878 ; AVX512DQ-NEXT:    vandps {{.*}}(%rip), %ymm1, %ymm1
1879 ; AVX512DQ-NEXT:    retq
1881 ; X86-LABEL: test_build_vec_v32i1:
1882 ; X86:       ## %bb.0:
1883 ; X86-NEXT:    movl $1497715861, %eax ## imm = 0x59455495
1884 ; X86-NEXT:    kmovd %eax, %k1
1885 ; X86-NEXT:    vmovdqu16 %zmm0, %zmm0 {%k1} {z}
1886 ; X86-NEXT:    retl
1887   %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
1888   ret <32 x i16> %ret
1891 define <64 x i8> @test_build_vec_v64i1(<64 x i8> %x) {
1892 ; KNL-LABEL: test_build_vec_v64i1:
1893 ; KNL:       ## %bb.0:
1894 ; KNL-NEXT:    vandps {{.*}}(%rip), %ymm0, %ymm0
1895 ; KNL-NEXT:    vandps {{.*}}(%rip), %ymm1, %ymm1
1896 ; KNL-NEXT:    retq
1898 ; SKX-LABEL: test_build_vec_v64i1:
1899 ; SKX:       ## %bb.0:
1900 ; 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
1901 ; SKX-NEXT:    retq
1903 ; AVX512BW-LABEL: test_build_vec_v64i1:
1904 ; AVX512BW:       ## %bb.0:
1905 ; 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
1906 ; AVX512BW-NEXT:    retq
1908 ; AVX512DQ-LABEL: test_build_vec_v64i1:
1909 ; AVX512DQ:       ## %bb.0:
1910 ; AVX512DQ-NEXT:    vandps {{.*}}(%rip), %ymm0, %ymm0
1911 ; AVX512DQ-NEXT:    vandps {{.*}}(%rip), %ymm1, %ymm1
1912 ; AVX512DQ-NEXT:    retq
1914 ; X86-LABEL: test_build_vec_v64i1:
1915 ; X86:       ## %bb.0:
1916 ; 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
1917 ; X86-NEXT:    retl
1918   %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
1919   ret <64 x i8> %ret
1922 define void @ktest_1(<8 x double> %in, double * %base) {
1923 ; KNL-LABEL: ktest_1:
1924 ; KNL:       ## %bb.0:
1925 ; KNL-NEXT:    vmovupd (%rdi), %zmm1
1926 ; KNL-NEXT:    vcmpltpd %zmm0, %zmm1, %k1
1927 ; KNL-NEXT:    vmovupd 8(%rdi), %zmm1 {%k1} {z}
1928 ; KNL-NEXT:    vcmpltpd %zmm1, %zmm0, %k0 {%k1}
1929 ; KNL-NEXT:    kmovw %k0, %eax
1930 ; KNL-NEXT:    testb %al, %al
1931 ; KNL-NEXT:    je LBB42_2
1932 ; KNL-NEXT:  ## %bb.1: ## %L1
1933 ; KNL-NEXT:    vmovapd %zmm0, (%rdi)
1934 ; KNL-NEXT:    vzeroupper
1935 ; KNL-NEXT:    retq
1936 ; KNL-NEXT:  LBB42_2: ## %L2
1937 ; KNL-NEXT:    vmovapd %zmm0, 8(%rdi)
1938 ; KNL-NEXT:    vzeroupper
1939 ; KNL-NEXT:    retq
1941 ; SKX-LABEL: ktest_1:
1942 ; SKX:       ## %bb.0:
1943 ; SKX-NEXT:    vmovupd (%rdi), %zmm1
1944 ; SKX-NEXT:    vcmpltpd %zmm0, %zmm1, %k1
1945 ; SKX-NEXT:    vmovupd 8(%rdi), %zmm1 {%k1} {z}
1946 ; SKX-NEXT:    vcmpltpd %zmm1, %zmm0, %k0 {%k1}
1947 ; SKX-NEXT:    kortestb %k0, %k0
1948 ; SKX-NEXT:    je LBB42_2
1949 ; SKX-NEXT:  ## %bb.1: ## %L1
1950 ; SKX-NEXT:    vmovapd %zmm0, (%rdi)
1951 ; SKX-NEXT:    vzeroupper
1952 ; SKX-NEXT:    retq
1953 ; SKX-NEXT:  LBB42_2: ## %L2
1954 ; SKX-NEXT:    vmovapd %zmm0, 8(%rdi)
1955 ; SKX-NEXT:    vzeroupper
1956 ; SKX-NEXT:    retq
1958 ; AVX512BW-LABEL: ktest_1:
1959 ; AVX512BW:       ## %bb.0:
1960 ; AVX512BW-NEXT:    vmovupd (%rdi), %zmm1
1961 ; AVX512BW-NEXT:    vcmpltpd %zmm0, %zmm1, %k1
1962 ; AVX512BW-NEXT:    vmovupd 8(%rdi), %zmm1 {%k1} {z}
1963 ; AVX512BW-NEXT:    vcmpltpd %zmm1, %zmm0, %k0 {%k1}
1964 ; AVX512BW-NEXT:    kmovd %k0, %eax
1965 ; AVX512BW-NEXT:    testb %al, %al
1966 ; AVX512BW-NEXT:    je LBB42_2
1967 ; AVX512BW-NEXT:  ## %bb.1: ## %L1
1968 ; AVX512BW-NEXT:    vmovapd %zmm0, (%rdi)
1969 ; AVX512BW-NEXT:    vzeroupper
1970 ; AVX512BW-NEXT:    retq
1971 ; AVX512BW-NEXT:  LBB42_2: ## %L2
1972 ; AVX512BW-NEXT:    vmovapd %zmm0, 8(%rdi)
1973 ; AVX512BW-NEXT:    vzeroupper
1974 ; AVX512BW-NEXT:    retq
1976 ; AVX512DQ-LABEL: ktest_1:
1977 ; AVX512DQ:       ## %bb.0:
1978 ; AVX512DQ-NEXT:    vmovupd (%rdi), %zmm1
1979 ; AVX512DQ-NEXT:    vcmpltpd %zmm0, %zmm1, %k1
1980 ; AVX512DQ-NEXT:    vmovupd 8(%rdi), %zmm1 {%k1} {z}
1981 ; AVX512DQ-NEXT:    vcmpltpd %zmm1, %zmm0, %k0 {%k1}
1982 ; AVX512DQ-NEXT:    kortestb %k0, %k0
1983 ; AVX512DQ-NEXT:    je LBB42_2
1984 ; AVX512DQ-NEXT:  ## %bb.1: ## %L1
1985 ; AVX512DQ-NEXT:    vmovapd %zmm0, (%rdi)
1986 ; AVX512DQ-NEXT:    vzeroupper
1987 ; AVX512DQ-NEXT:    retq
1988 ; AVX512DQ-NEXT:  LBB42_2: ## %L2
1989 ; AVX512DQ-NEXT:    vmovapd %zmm0, 8(%rdi)
1990 ; AVX512DQ-NEXT:    vzeroupper
1991 ; AVX512DQ-NEXT:    retq
1993 ; X86-LABEL: ktest_1:
1994 ; X86:       ## %bb.0:
1995 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1996 ; X86-NEXT:    vmovupd (%eax), %zmm1
1997 ; X86-NEXT:    vcmpltpd %zmm0, %zmm1, %k1
1998 ; X86-NEXT:    vmovupd 8(%eax), %zmm1 {%k1} {z}
1999 ; X86-NEXT:    vcmpltpd %zmm1, %zmm0, %k0 {%k1}
2000 ; X86-NEXT:    kortestb %k0, %k0
2001 ; X86-NEXT:    je LBB42_2
2002 ; X86-NEXT:  ## %bb.1: ## %L1
2003 ; X86-NEXT:    vmovapd %zmm0, (%eax)
2004 ; X86-NEXT:    vzeroupper
2005 ; X86-NEXT:    retl
2006 ; X86-NEXT:  LBB42_2: ## %L2
2007 ; X86-NEXT:    vmovapd %zmm0, 8(%eax)
2008 ; X86-NEXT:    vzeroupper
2009 ; X86-NEXT:    retl
2010   %addr1 = getelementptr double, double * %base, i64 0
2011   %addr2 = getelementptr double, double * %base, i64 1
2013   %vaddr1 = bitcast double* %addr1 to <8 x double>*
2014   %vaddr2 = bitcast double* %addr2 to <8 x double>*
2016   %val1 = load <8 x double>, <8 x double> *%vaddr1, align 1
2017   %val2 = load <8 x double>, <8 x double> *%vaddr2, align 1
2019   %sel1 = fcmp ogt <8 x double>%in, %val1
2020   %val3 = select <8 x i1> %sel1, <8 x double> %val2, <8 x double> zeroinitializer
2021   %sel2 = fcmp olt <8 x double> %in, %val3
2022   %sel3 = and <8 x i1> %sel1, %sel2
2024   %int_sel3 = bitcast <8 x i1> %sel3 to i8
2025   %res = icmp eq i8 %int_sel3, zeroinitializer
2026   br i1 %res, label %L2, label %L1
2028   store <8 x double> %in, <8 x double>* %vaddr1
2029   br label %End
2031   store <8 x double> %in, <8 x double>* %vaddr2
2032   br label %End
2033 End:
2034   ret void
2037 define void @ktest_2(<32 x float> %in, float * %base) {
2039 ; KNL-LABEL: ktest_2:
2040 ; KNL:       ## %bb.0:
2041 ; KNL-NEXT:    vmovups (%rdi), %zmm2
2042 ; KNL-NEXT:    vmovups 64(%rdi), %zmm3
2043 ; KNL-NEXT:    vcmpltps %zmm1, %zmm3, %k1
2044 ; KNL-NEXT:    vcmpltps %zmm0, %zmm2, %k2
2045 ; KNL-NEXT:    vmovups 4(%rdi), %zmm2 {%k2} {z}
2046 ; KNL-NEXT:    vmovups 68(%rdi), %zmm3 {%k1} {z}
2047 ; KNL-NEXT:    vcmpltps %zmm3, %zmm1, %k0
2048 ; KNL-NEXT:    vcmpltps %zmm2, %zmm0, %k3
2049 ; KNL-NEXT:    korw %k3, %k2, %k2
2050 ; KNL-NEXT:    kmovw %k2, %eax
2051 ; KNL-NEXT:    korw %k0, %k1, %k0
2052 ; KNL-NEXT:    kmovw %k0, %ecx
2053 ; KNL-NEXT:    shll $16, %ecx
2054 ; KNL-NEXT:    orl %eax, %ecx
2055 ; KNL-NEXT:    je LBB43_2
2056 ; KNL-NEXT:  ## %bb.1: ## %L1
2057 ; KNL-NEXT:    vmovaps %zmm0, (%rdi)
2058 ; KNL-NEXT:    vmovaps %zmm1, 64(%rdi)
2059 ; KNL-NEXT:    vzeroupper
2060 ; KNL-NEXT:    retq
2061 ; KNL-NEXT:  LBB43_2: ## %L2
2062 ; KNL-NEXT:    vmovaps %zmm0, 4(%rdi)
2063 ; KNL-NEXT:    vmovaps %zmm1, 68(%rdi)
2064 ; KNL-NEXT:    vzeroupper
2065 ; KNL-NEXT:    retq
2067 ; SKX-LABEL: ktest_2:
2068 ; SKX:       ## %bb.0:
2069 ; SKX-NEXT:    vmovups (%rdi), %zmm2
2070 ; SKX-NEXT:    vmovups 64(%rdi), %zmm3
2071 ; SKX-NEXT:    vcmpltps %zmm0, %zmm2, %k1
2072 ; SKX-NEXT:    vcmpltps %zmm1, %zmm3, %k2
2073 ; SKX-NEXT:    kunpckwd %k1, %k2, %k0
2074 ; SKX-NEXT:    vmovups 68(%rdi), %zmm2 {%k2} {z}
2075 ; SKX-NEXT:    vmovups 4(%rdi), %zmm3 {%k1} {z}
2076 ; SKX-NEXT:    vcmpltps %zmm3, %zmm0, %k1
2077 ; SKX-NEXT:    vcmpltps %zmm2, %zmm1, %k2
2078 ; SKX-NEXT:    kunpckwd %k1, %k2, %k1
2079 ; SKX-NEXT:    kortestd %k1, %k0
2080 ; SKX-NEXT:    je LBB43_2
2081 ; SKX-NEXT:  ## %bb.1: ## %L1
2082 ; SKX-NEXT:    vmovaps %zmm0, (%rdi)
2083 ; SKX-NEXT:    vmovaps %zmm1, 64(%rdi)
2084 ; SKX-NEXT:    vzeroupper
2085 ; SKX-NEXT:    retq
2086 ; SKX-NEXT:  LBB43_2: ## %L2
2087 ; SKX-NEXT:    vmovaps %zmm0, 4(%rdi)
2088 ; SKX-NEXT:    vmovaps %zmm1, 68(%rdi)
2089 ; SKX-NEXT:    vzeroupper
2090 ; SKX-NEXT:    retq
2092 ; AVX512BW-LABEL: ktest_2:
2093 ; AVX512BW:       ## %bb.0:
2094 ; AVX512BW-NEXT:    vmovups (%rdi), %zmm2
2095 ; AVX512BW-NEXT:    vmovups 64(%rdi), %zmm3
2096 ; AVX512BW-NEXT:    vcmpltps %zmm0, %zmm2, %k1
2097 ; AVX512BW-NEXT:    vcmpltps %zmm1, %zmm3, %k2
2098 ; AVX512BW-NEXT:    kunpckwd %k1, %k2, %k0
2099 ; AVX512BW-NEXT:    vmovups 68(%rdi), %zmm2 {%k2} {z}
2100 ; AVX512BW-NEXT:    vmovups 4(%rdi), %zmm3 {%k1} {z}
2101 ; AVX512BW-NEXT:    vcmpltps %zmm3, %zmm0, %k1
2102 ; AVX512BW-NEXT:    vcmpltps %zmm2, %zmm1, %k2
2103 ; AVX512BW-NEXT:    kunpckwd %k1, %k2, %k1
2104 ; AVX512BW-NEXT:    kortestd %k1, %k0
2105 ; AVX512BW-NEXT:    je LBB43_2
2106 ; AVX512BW-NEXT:  ## %bb.1: ## %L1
2107 ; AVX512BW-NEXT:    vmovaps %zmm0, (%rdi)
2108 ; AVX512BW-NEXT:    vmovaps %zmm1, 64(%rdi)
2109 ; AVX512BW-NEXT:    vzeroupper
2110 ; AVX512BW-NEXT:    retq
2111 ; AVX512BW-NEXT:  LBB43_2: ## %L2
2112 ; AVX512BW-NEXT:    vmovaps %zmm0, 4(%rdi)
2113 ; AVX512BW-NEXT:    vmovaps %zmm1, 68(%rdi)
2114 ; AVX512BW-NEXT:    vzeroupper
2115 ; AVX512BW-NEXT:    retq
2117 ; AVX512DQ-LABEL: ktest_2:
2118 ; AVX512DQ:       ## %bb.0:
2119 ; AVX512DQ-NEXT:    vmovups (%rdi), %zmm2
2120 ; AVX512DQ-NEXT:    vmovups 64(%rdi), %zmm3
2121 ; AVX512DQ-NEXT:    vcmpltps %zmm1, %zmm3, %k1
2122 ; AVX512DQ-NEXT:    vcmpltps %zmm0, %zmm2, %k2
2123 ; AVX512DQ-NEXT:    vmovups 4(%rdi), %zmm2 {%k2} {z}
2124 ; AVX512DQ-NEXT:    vmovups 68(%rdi), %zmm3 {%k1} {z}
2125 ; AVX512DQ-NEXT:    vcmpltps %zmm3, %zmm1, %k0
2126 ; AVX512DQ-NEXT:    vcmpltps %zmm2, %zmm0, %k3
2127 ; AVX512DQ-NEXT:    korw %k3, %k2, %k2
2128 ; AVX512DQ-NEXT:    kmovw %k2, %eax
2129 ; AVX512DQ-NEXT:    korw %k0, %k1, %k0
2130 ; AVX512DQ-NEXT:    kmovw %k0, %ecx
2131 ; AVX512DQ-NEXT:    shll $16, %ecx
2132 ; AVX512DQ-NEXT:    orl %eax, %ecx
2133 ; AVX512DQ-NEXT:    je LBB43_2
2134 ; AVX512DQ-NEXT:  ## %bb.1: ## %L1
2135 ; AVX512DQ-NEXT:    vmovaps %zmm0, (%rdi)
2136 ; AVX512DQ-NEXT:    vmovaps %zmm1, 64(%rdi)
2137 ; AVX512DQ-NEXT:    vzeroupper
2138 ; AVX512DQ-NEXT:    retq
2139 ; AVX512DQ-NEXT:  LBB43_2: ## %L2
2140 ; AVX512DQ-NEXT:    vmovaps %zmm0, 4(%rdi)
2141 ; AVX512DQ-NEXT:    vmovaps %zmm1, 68(%rdi)
2142 ; AVX512DQ-NEXT:    vzeroupper
2143 ; AVX512DQ-NEXT:    retq
2145 ; X86-LABEL: ktest_2:
2146 ; X86:       ## %bb.0:
2147 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
2148 ; X86-NEXT:    vmovups (%eax), %zmm2
2149 ; X86-NEXT:    vmovups 64(%eax), %zmm3
2150 ; X86-NEXT:    vcmpltps %zmm0, %zmm2, %k1
2151 ; X86-NEXT:    vcmpltps %zmm1, %zmm3, %k2
2152 ; X86-NEXT:    kunpckwd %k1, %k2, %k0
2153 ; X86-NEXT:    vmovups 68(%eax), %zmm2 {%k2} {z}
2154 ; X86-NEXT:    vmovups 4(%eax), %zmm3 {%k1} {z}
2155 ; X86-NEXT:    vcmpltps %zmm3, %zmm0, %k1
2156 ; X86-NEXT:    vcmpltps %zmm2, %zmm1, %k2
2157 ; X86-NEXT:    kunpckwd %k1, %k2, %k1
2158 ; X86-NEXT:    kortestd %k1, %k0
2159 ; X86-NEXT:    je LBB43_2
2160 ; X86-NEXT:  ## %bb.1: ## %L1
2161 ; X86-NEXT:    vmovaps %zmm0, (%eax)
2162 ; X86-NEXT:    vmovaps %zmm1, 64(%eax)
2163 ; X86-NEXT:    vzeroupper
2164 ; X86-NEXT:    retl
2165 ; X86-NEXT:  LBB43_2: ## %L2
2166 ; X86-NEXT:    vmovaps %zmm0, 4(%eax)
2167 ; X86-NEXT:    vmovaps %zmm1, 68(%eax)
2168 ; X86-NEXT:    vzeroupper
2169 ; X86-NEXT:    retl
2170   %addr1 = getelementptr float, float * %base, i64 0
2171   %addr2 = getelementptr float, float * %base, i64 1
2173   %vaddr1 = bitcast float* %addr1 to <32 x float>*
2174   %vaddr2 = bitcast float* %addr2 to <32 x float>*
2176   %val1 = load <32 x float>, <32 x float> *%vaddr1, align 1
2177   %val2 = load <32 x float>, <32 x float> *%vaddr2, align 1
2179   %sel1 = fcmp ogt <32 x float>%in, %val1
2180   %val3 = select <32 x i1> %sel1, <32 x float> %val2, <32 x float> zeroinitializer
2181   %sel2 = fcmp olt <32 x float> %in, %val3
2182   %sel3 = or <32 x i1> %sel1, %sel2
2184   %int_sel3 = bitcast <32 x i1> %sel3 to i32
2185   %res = icmp eq i32 %int_sel3, zeroinitializer
2186   br i1 %res, label %L2, label %L1
2188   store <32 x float> %in, <32 x float>* %vaddr1
2189   br label %End
2191   store <32 x float> %in, <32 x float>* %vaddr2
2192   br label %End
2193 End:
2194   ret void
2197 define <8 x i64> @load_8i1(<8 x i1>* %a) {
2198 ; KNL-LABEL: load_8i1:
2199 ; KNL:       ## %bb.0:
2200 ; KNL-NEXT:    kmovw (%rdi), %k1
2201 ; KNL-NEXT:    vpternlogq $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
2202 ; KNL-NEXT:    retq
2204 ; SKX-LABEL: load_8i1:
2205 ; SKX:       ## %bb.0:
2206 ; SKX-NEXT:    kmovb (%rdi), %k0
2207 ; SKX-NEXT:    vpmovm2q %k0, %zmm0
2208 ; SKX-NEXT:    retq
2210 ; AVX512BW-LABEL: load_8i1:
2211 ; AVX512BW:       ## %bb.0:
2212 ; AVX512BW-NEXT:    kmovw (%rdi), %k1
2213 ; AVX512BW-NEXT:    vpternlogq $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
2214 ; AVX512BW-NEXT:    retq
2216 ; AVX512DQ-LABEL: load_8i1:
2217 ; AVX512DQ:       ## %bb.0:
2218 ; AVX512DQ-NEXT:    kmovb (%rdi), %k0
2219 ; AVX512DQ-NEXT:    vpmovm2q %k0, %zmm0
2220 ; AVX512DQ-NEXT:    retq
2222 ; X86-LABEL: load_8i1:
2223 ; X86:       ## %bb.0:
2224 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
2225 ; X86-NEXT:    kmovb (%eax), %k0
2226 ; X86-NEXT:    vpmovm2q %k0, %zmm0
2227 ; X86-NEXT:    retl
2228   %b = load <8 x i1>, <8 x i1>* %a
2229   %c = sext <8 x i1> %b to <8 x i64>
2230   ret <8 x i64> %c
2233 define <16 x i32> @load_16i1(<16 x i1>* %a) {
2234 ; KNL-LABEL: load_16i1:
2235 ; KNL:       ## %bb.0:
2236 ; KNL-NEXT:    kmovw (%rdi), %k1
2237 ; KNL-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
2238 ; KNL-NEXT:    retq
2240 ; SKX-LABEL: load_16i1:
2241 ; SKX:       ## %bb.0:
2242 ; SKX-NEXT:    kmovw (%rdi), %k0
2243 ; SKX-NEXT:    vpmovm2d %k0, %zmm0
2244 ; SKX-NEXT:    retq
2246 ; AVX512BW-LABEL: load_16i1:
2247 ; AVX512BW:       ## %bb.0:
2248 ; AVX512BW-NEXT:    kmovw (%rdi), %k1
2249 ; AVX512BW-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
2250 ; AVX512BW-NEXT:    retq
2252 ; AVX512DQ-LABEL: load_16i1:
2253 ; AVX512DQ:       ## %bb.0:
2254 ; AVX512DQ-NEXT:    kmovw (%rdi), %k0
2255 ; AVX512DQ-NEXT:    vpmovm2d %k0, %zmm0
2256 ; AVX512DQ-NEXT:    retq
2258 ; X86-LABEL: load_16i1:
2259 ; X86:       ## %bb.0:
2260 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
2261 ; X86-NEXT:    kmovw (%eax), %k0
2262 ; X86-NEXT:    vpmovm2d %k0, %zmm0
2263 ; X86-NEXT:    retl
2264   %b = load <16 x i1>, <16 x i1>* %a
2265   %c = sext <16 x i1> %b to <16 x i32>
2266   ret <16 x i32> %c
2269 define <2 x i16> @load_2i1(<2 x i1>* %a) {
2270 ; KNL-LABEL: load_2i1:
2271 ; KNL:       ## %bb.0:
2272 ; KNL-NEXT:    kmovw (%rdi), %k1
2273 ; KNL-NEXT:    vpternlogq $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
2274 ; KNL-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $zmm0
2275 ; KNL-NEXT:    vzeroupper
2276 ; KNL-NEXT:    retq
2278 ; SKX-LABEL: load_2i1:
2279 ; SKX:       ## %bb.0:
2280 ; SKX-NEXT:    kmovb (%rdi), %k0
2281 ; SKX-NEXT:    vpmovm2q %k0, %xmm0
2282 ; SKX-NEXT:    retq
2284 ; AVX512BW-LABEL: load_2i1:
2285 ; AVX512BW:       ## %bb.0:
2286 ; AVX512BW-NEXT:    kmovw (%rdi), %k1
2287 ; AVX512BW-NEXT:    vpternlogq $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
2288 ; AVX512BW-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $zmm0
2289 ; AVX512BW-NEXT:    vzeroupper
2290 ; AVX512BW-NEXT:    retq
2292 ; AVX512DQ-LABEL: load_2i1:
2293 ; AVX512DQ:       ## %bb.0:
2294 ; AVX512DQ-NEXT:    kmovb (%rdi), %k0
2295 ; AVX512DQ-NEXT:    vpmovm2q %k0, %zmm0
2296 ; AVX512DQ-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $zmm0
2297 ; AVX512DQ-NEXT:    vzeroupper
2298 ; AVX512DQ-NEXT:    retq
2300 ; X86-LABEL: load_2i1:
2301 ; X86:       ## %bb.0:
2302 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
2303 ; X86-NEXT:    kmovb (%eax), %k0
2304 ; X86-NEXT:    vpmovm2q %k0, %xmm0
2305 ; X86-NEXT:    retl
2306   %b = load <2 x i1>, <2 x i1>* %a
2307   %c = sext <2 x i1> %b to <2 x i16>
2308   ret <2 x i16> %c
2311 define <4 x i16> @load_4i1(<4 x i1>* %a) {
2312 ; KNL-LABEL: load_4i1:
2313 ; KNL:       ## %bb.0:
2314 ; KNL-NEXT:    kmovw (%rdi), %k1
2315 ; KNL-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
2316 ; KNL-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $zmm0
2317 ; KNL-NEXT:    vzeroupper
2318 ; KNL-NEXT:    retq
2320 ; SKX-LABEL: load_4i1:
2321 ; SKX:       ## %bb.0:
2322 ; SKX-NEXT:    kmovb (%rdi), %k0
2323 ; SKX-NEXT:    vpmovm2d %k0, %xmm0
2324 ; SKX-NEXT:    retq
2326 ; AVX512BW-LABEL: load_4i1:
2327 ; AVX512BW:       ## %bb.0:
2328 ; AVX512BW-NEXT:    kmovw (%rdi), %k1
2329 ; AVX512BW-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
2330 ; AVX512BW-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $zmm0
2331 ; AVX512BW-NEXT:    vzeroupper
2332 ; AVX512BW-NEXT:    retq
2334 ; AVX512DQ-LABEL: load_4i1:
2335 ; AVX512DQ:       ## %bb.0:
2336 ; AVX512DQ-NEXT:    kmovb (%rdi), %k0
2337 ; AVX512DQ-NEXT:    vpmovm2d %k0, %zmm0
2338 ; AVX512DQ-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $zmm0
2339 ; AVX512DQ-NEXT:    vzeroupper
2340 ; AVX512DQ-NEXT:    retq
2342 ; X86-LABEL: load_4i1:
2343 ; X86:       ## %bb.0:
2344 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
2345 ; X86-NEXT:    kmovb (%eax), %k0
2346 ; X86-NEXT:    vpmovm2d %k0, %xmm0
2347 ; X86-NEXT:    retl
2348   %b = load <4 x i1>, <4 x i1>* %a
2349   %c = sext <4 x i1> %b to <4 x i16>
2350   ret <4 x i16> %c
2353 define <32 x i16> @load_32i1(<32 x i1>* %a) {
2354 ; KNL-LABEL: load_32i1:
2355 ; KNL:       ## %bb.0:
2356 ; KNL-NEXT:    kmovw (%rdi), %k1
2357 ; KNL-NEXT:    kmovw 2(%rdi), %k2
2358 ; KNL-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
2359 ; KNL-NEXT:    vpmovdw %zmm0, %ymm0
2360 ; KNL-NEXT:    vpternlogd $255, %zmm1, %zmm1, %zmm1 {%k2} {z}
2361 ; KNL-NEXT:    vpmovdw %zmm1, %ymm1
2362 ; KNL-NEXT:    retq
2364 ; SKX-LABEL: load_32i1:
2365 ; SKX:       ## %bb.0:
2366 ; SKX-NEXT:    kmovd (%rdi), %k0
2367 ; SKX-NEXT:    vpmovm2w %k0, %zmm0
2368 ; SKX-NEXT:    retq
2370 ; AVX512BW-LABEL: load_32i1:
2371 ; AVX512BW:       ## %bb.0:
2372 ; AVX512BW-NEXT:    kmovd (%rdi), %k0
2373 ; AVX512BW-NEXT:    vpmovm2w %k0, %zmm0
2374 ; AVX512BW-NEXT:    retq
2376 ; AVX512DQ-LABEL: load_32i1:
2377 ; AVX512DQ:       ## %bb.0:
2378 ; AVX512DQ-NEXT:    kmovw (%rdi), %k0
2379 ; AVX512DQ-NEXT:    kmovw 2(%rdi), %k1
2380 ; AVX512DQ-NEXT:    vpmovm2d %k0, %zmm0
2381 ; AVX512DQ-NEXT:    vpmovdw %zmm0, %ymm0
2382 ; AVX512DQ-NEXT:    vpmovm2d %k1, %zmm1
2383 ; AVX512DQ-NEXT:    vpmovdw %zmm1, %ymm1
2384 ; AVX512DQ-NEXT:    retq
2386 ; X86-LABEL: load_32i1:
2387 ; X86:       ## %bb.0:
2388 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
2389 ; X86-NEXT:    kmovd (%eax), %k0
2390 ; X86-NEXT:    vpmovm2w %k0, %zmm0
2391 ; X86-NEXT:    retl
2392   %b = load <32 x i1>, <32 x i1>* %a
2393   %c = sext <32 x i1> %b to <32 x i16>
2394   ret <32 x i16> %c
2397 define <64 x i8> @load_64i1(<64 x i1>* %a) {
2398 ; KNL-LABEL: load_64i1:
2399 ; KNL:       ## %bb.0:
2400 ; KNL-NEXT:    kmovw (%rdi), %k1
2401 ; KNL-NEXT:    kmovw 2(%rdi), %k2
2402 ; KNL-NEXT:    kmovw 4(%rdi), %k3
2403 ; KNL-NEXT:    kmovw 6(%rdi), %k4
2404 ; KNL-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z}
2405 ; KNL-NEXT:    vpmovdb %zmm0, %xmm0
2406 ; KNL-NEXT:    vpternlogd $255, %zmm1, %zmm1, %zmm1 {%k2} {z}
2407 ; KNL-NEXT:    vpmovdb %zmm1, %xmm1
2408 ; KNL-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
2409 ; KNL-NEXT:    vpternlogd $255, %zmm1, %zmm1, %zmm1 {%k3} {z}
2410 ; KNL-NEXT:    vpmovdb %zmm1, %xmm1
2411 ; KNL-NEXT:    vpternlogd $255, %zmm2, %zmm2, %zmm2 {%k4} {z}
2412 ; KNL-NEXT:    vpmovdb %zmm2, %xmm2
2413 ; KNL-NEXT:    vinserti128 $1, %xmm2, %ymm1, %ymm1
2414 ; KNL-NEXT:    retq
2416 ; SKX-LABEL: load_64i1:
2417 ; SKX:       ## %bb.0:
2418 ; SKX-NEXT:    kmovq (%rdi), %k0
2419 ; SKX-NEXT:    vpmovm2b %k0, %zmm0
2420 ; SKX-NEXT:    retq
2422 ; AVX512BW-LABEL: load_64i1:
2423 ; AVX512BW:       ## %bb.0:
2424 ; AVX512BW-NEXT:    kmovq (%rdi), %k0
2425 ; AVX512BW-NEXT:    vpmovm2b %k0, %zmm0
2426 ; AVX512BW-NEXT:    retq
2428 ; AVX512DQ-LABEL: load_64i1:
2429 ; AVX512DQ:       ## %bb.0:
2430 ; AVX512DQ-NEXT:    kmovw (%rdi), %k0
2431 ; AVX512DQ-NEXT:    kmovw 2(%rdi), %k1
2432 ; AVX512DQ-NEXT:    kmovw 4(%rdi), %k2
2433 ; AVX512DQ-NEXT:    kmovw 6(%rdi), %k3
2434 ; AVX512DQ-NEXT:    vpmovm2d %k0, %zmm0
2435 ; AVX512DQ-NEXT:    vpmovdb %zmm0, %xmm0
2436 ; AVX512DQ-NEXT:    vpmovm2d %k1, %zmm1
2437 ; AVX512DQ-NEXT:    vpmovdb %zmm1, %xmm1
2438 ; AVX512DQ-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
2439 ; AVX512DQ-NEXT:    vpmovm2d %k2, %zmm1
2440 ; AVX512DQ-NEXT:    vpmovdb %zmm1, %xmm1
2441 ; AVX512DQ-NEXT:    vpmovm2d %k3, %zmm2
2442 ; AVX512DQ-NEXT:    vpmovdb %zmm2, %xmm2
2443 ; AVX512DQ-NEXT:    vinserti128 $1, %xmm2, %ymm1, %ymm1
2444 ; AVX512DQ-NEXT:    retq
2446 ; X86-LABEL: load_64i1:
2447 ; X86:       ## %bb.0:
2448 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
2449 ; X86-NEXT:    kmovq (%eax), %k0
2450 ; X86-NEXT:    vpmovm2b %k0, %zmm0
2451 ; X86-NEXT:    retl
2452   %b = load <64 x i1>, <64 x i1>* %a
2453   %c = sext <64 x i1> %b to <64 x i8>
2454   ret <64 x i8> %c
2457 define void @store_8i1(<8 x i1>* %a, <8 x i1> %v) {
2458 ; KNL-LABEL: store_8i1:
2459 ; KNL:       ## %bb.0:
2460 ; KNL-NEXT:    vpmovzxwq {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero
2461 ; KNL-NEXT:    vpsllq $63, %zmm0, %zmm0
2462 ; KNL-NEXT:    vptestmq %zmm0, %zmm0, %k0
2463 ; KNL-NEXT:    kmovw %k0, %eax
2464 ; KNL-NEXT:    movb %al, (%rdi)
2465 ; KNL-NEXT:    vzeroupper
2466 ; KNL-NEXT:    retq
2468 ; SKX-LABEL: store_8i1:
2469 ; SKX:       ## %bb.0:
2470 ; SKX-NEXT:    vpsllw $15, %xmm0, %xmm0
2471 ; SKX-NEXT:    vpmovw2m %xmm0, %k0
2472 ; SKX-NEXT:    kmovb %k0, (%rdi)
2473 ; SKX-NEXT:    retq
2475 ; AVX512BW-LABEL: store_8i1:
2476 ; AVX512BW:       ## %bb.0:
2477 ; AVX512BW-NEXT:    vpsllw $15, %xmm0, %xmm0
2478 ; AVX512BW-NEXT:    vpmovw2m %zmm0, %k0
2479 ; AVX512BW-NEXT:    kmovd %k0, %eax
2480 ; AVX512BW-NEXT:    movb %al, (%rdi)
2481 ; AVX512BW-NEXT:    vzeroupper
2482 ; AVX512BW-NEXT:    retq
2484 ; AVX512DQ-LABEL: store_8i1:
2485 ; AVX512DQ:       ## %bb.0:
2486 ; AVX512DQ-NEXT:    vpmovzxwq {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero
2487 ; AVX512DQ-NEXT:    vpsllq $63, %zmm0, %zmm0
2488 ; AVX512DQ-NEXT:    vpmovq2m %zmm0, %k0
2489 ; AVX512DQ-NEXT:    kmovb %k0, (%rdi)
2490 ; AVX512DQ-NEXT:    vzeroupper
2491 ; AVX512DQ-NEXT:    retq
2493 ; X86-LABEL: store_8i1:
2494 ; X86:       ## %bb.0:
2495 ; X86-NEXT:    vpsllw $15, %xmm0, %xmm0
2496 ; X86-NEXT:    vpmovw2m %xmm0, %k0
2497 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
2498 ; X86-NEXT:    kmovb %k0, (%eax)
2499 ; X86-NEXT:    retl
2500   store <8 x i1> %v, <8 x i1>* %a
2501   ret void
2504 define void @store_8i1_1(<8 x i1>* %a, <8 x i16> %v) {
2505 ; KNL-LABEL: store_8i1_1:
2506 ; KNL:       ## %bb.0:
2507 ; KNL-NEXT:    vpmovzxwq {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero
2508 ; KNL-NEXT:    vpsllq $63, %zmm0, %zmm0
2509 ; KNL-NEXT:    vptestmq %zmm0, %zmm0, %k0
2510 ; KNL-NEXT:    kmovw %k0, %eax
2511 ; KNL-NEXT:    movb %al, (%rdi)
2512 ; KNL-NEXT:    vzeroupper
2513 ; KNL-NEXT:    retq
2515 ; SKX-LABEL: store_8i1_1:
2516 ; SKX:       ## %bb.0:
2517 ; SKX-NEXT:    vpsllw $15, %xmm0, %xmm0
2518 ; SKX-NEXT:    vpmovw2m %xmm0, %k0
2519 ; SKX-NEXT:    kmovb %k0, (%rdi)
2520 ; SKX-NEXT:    retq
2522 ; AVX512BW-LABEL: store_8i1_1:
2523 ; AVX512BW:       ## %bb.0:
2524 ; AVX512BW-NEXT:    vpsllw $15, %xmm0, %xmm0
2525 ; AVX512BW-NEXT:    vpmovw2m %zmm0, %k0
2526 ; AVX512BW-NEXT:    kmovd %k0, %eax
2527 ; AVX512BW-NEXT:    movb %al, (%rdi)
2528 ; AVX512BW-NEXT:    vzeroupper
2529 ; AVX512BW-NEXT:    retq
2531 ; AVX512DQ-LABEL: store_8i1_1:
2532 ; AVX512DQ:       ## %bb.0:
2533 ; AVX512DQ-NEXT:    vpmovzxwq {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero
2534 ; AVX512DQ-NEXT:    vpsllq $63, %zmm0, %zmm0
2535 ; AVX512DQ-NEXT:    vpmovq2m %zmm0, %k0
2536 ; AVX512DQ-NEXT:    kmovb %k0, (%rdi)
2537 ; AVX512DQ-NEXT:    vzeroupper
2538 ; AVX512DQ-NEXT:    retq
2540 ; X86-LABEL: store_8i1_1:
2541 ; X86:       ## %bb.0:
2542 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
2543 ; X86-NEXT:    vpsllw $15, %xmm0, %xmm0
2544 ; X86-NEXT:    vpmovw2m %xmm0, %k0
2545 ; X86-NEXT:    kmovb %k0, (%eax)
2546 ; X86-NEXT:    retl
2547   %v1 = trunc <8 x i16> %v to <8 x i1>
2548   store <8 x i1> %v1, <8 x i1>* %a
2549   ret void
2552 define void @store_16i1(<16 x i1>* %a, <16 x i1> %v) {
2553 ; KNL-LABEL: store_16i1:
2554 ; KNL:       ## %bb.0:
2555 ; KNL-NEXT:    vpmovzxbd {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero
2556 ; KNL-NEXT:    vpslld $31, %zmm0, %zmm0
2557 ; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k0
2558 ; KNL-NEXT:    kmovw %k0, (%rdi)
2559 ; KNL-NEXT:    vzeroupper
2560 ; KNL-NEXT:    retq
2562 ; SKX-LABEL: store_16i1:
2563 ; SKX:       ## %bb.0:
2564 ; SKX-NEXT:    vpsllw $7, %xmm0, %xmm0
2565 ; SKX-NEXT:    vpmovb2m %xmm0, %k0
2566 ; SKX-NEXT:    kmovw %k0, (%rdi)
2567 ; SKX-NEXT:    retq
2569 ; AVX512BW-LABEL: store_16i1:
2570 ; AVX512BW:       ## %bb.0:
2571 ; AVX512BW-NEXT:    vpsllw $7, %xmm0, %xmm0
2572 ; AVX512BW-NEXT:    vpmovb2m %zmm0, %k0
2573 ; AVX512BW-NEXT:    kmovw %k0, (%rdi)
2574 ; AVX512BW-NEXT:    vzeroupper
2575 ; AVX512BW-NEXT:    retq
2577 ; AVX512DQ-LABEL: store_16i1:
2578 ; AVX512DQ:       ## %bb.0:
2579 ; AVX512DQ-NEXT:    vpmovzxbd {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero
2580 ; AVX512DQ-NEXT:    vpslld $31, %zmm0, %zmm0
2581 ; AVX512DQ-NEXT:    vpmovd2m %zmm0, %k0
2582 ; AVX512DQ-NEXT:    kmovw %k0, (%rdi)
2583 ; AVX512DQ-NEXT:    vzeroupper
2584 ; AVX512DQ-NEXT:    retq
2586 ; X86-LABEL: store_16i1:
2587 ; X86:       ## %bb.0:
2588 ; X86-NEXT:    vpsllw $7, %xmm0, %xmm0
2589 ; X86-NEXT:    vpmovb2m %xmm0, %k0
2590 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
2591 ; X86-NEXT:    kmovw %k0, (%eax)
2592 ; X86-NEXT:    retl
2593   store <16 x i1> %v, <16 x i1>* %a
2594   ret void
2597 define void @store_32i1(<32 x i1>* %a, <32 x i1> %v) {
2598 ; KNL-LABEL: store_32i1:
2599 ; KNL:       ## %bb.0:
2600 ; KNL-NEXT:    vpmovzxbd {{.*#+}} zmm1 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero
2601 ; KNL-NEXT:    vpslld $31, %zmm1, %zmm1
2602 ; KNL-NEXT:    vptestmd %zmm1, %zmm1, %k0
2603 ; KNL-NEXT:    vextracti128 $1, %ymm0, %xmm0
2604 ; KNL-NEXT:    vpmovzxbd {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero
2605 ; KNL-NEXT:    vpslld $31, %zmm0, %zmm0
2606 ; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k1
2607 ; KNL-NEXT:    kmovw %k1, 2(%rdi)
2608 ; KNL-NEXT:    kmovw %k0, (%rdi)
2609 ; KNL-NEXT:    vzeroupper
2610 ; KNL-NEXT:    retq
2612 ; SKX-LABEL: store_32i1:
2613 ; SKX:       ## %bb.0:
2614 ; SKX-NEXT:    vpsllw $7, %ymm0, %ymm0
2615 ; SKX-NEXT:    vpmovb2m %ymm0, %k0
2616 ; SKX-NEXT:    kmovd %k0, (%rdi)
2617 ; SKX-NEXT:    vzeroupper
2618 ; SKX-NEXT:    retq
2620 ; AVX512BW-LABEL: store_32i1:
2621 ; AVX512BW:       ## %bb.0:
2622 ; AVX512BW-NEXT:    vpsllw $7, %ymm0, %ymm0
2623 ; AVX512BW-NEXT:    vpmovb2m %zmm0, %k0
2624 ; AVX512BW-NEXT:    kmovd %k0, (%rdi)
2625 ; AVX512BW-NEXT:    vzeroupper
2626 ; AVX512BW-NEXT:    retq
2628 ; AVX512DQ-LABEL: store_32i1:
2629 ; AVX512DQ:       ## %bb.0:
2630 ; AVX512DQ-NEXT:    vpmovzxbd {{.*#+}} zmm1 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero
2631 ; AVX512DQ-NEXT:    vpslld $31, %zmm1, %zmm1
2632 ; AVX512DQ-NEXT:    vpmovd2m %zmm1, %k0
2633 ; AVX512DQ-NEXT:    vextracti128 $1, %ymm0, %xmm0
2634 ; AVX512DQ-NEXT:    vpmovzxbd {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero
2635 ; AVX512DQ-NEXT:    vpslld $31, %zmm0, %zmm0
2636 ; AVX512DQ-NEXT:    vpmovd2m %zmm0, %k1
2637 ; AVX512DQ-NEXT:    kmovw %k1, 2(%rdi)
2638 ; AVX512DQ-NEXT:    kmovw %k0, (%rdi)
2639 ; AVX512DQ-NEXT:    vzeroupper
2640 ; AVX512DQ-NEXT:    retq
2642 ; X86-LABEL: store_32i1:
2643 ; X86:       ## %bb.0:
2644 ; X86-NEXT:    vpsllw $7, %ymm0, %ymm0
2645 ; X86-NEXT:    vpmovb2m %ymm0, %k0
2646 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
2647 ; X86-NEXT:    kmovd %k0, (%eax)
2648 ; X86-NEXT:    vzeroupper
2649 ; X86-NEXT:    retl
2650   store <32 x i1> %v, <32 x i1>* %a
2651   ret void
2654 define void @store_32i1_1(<32 x i1>* %a, <32 x i16> %v) {
2655 ; KNL-LABEL: store_32i1_1:
2656 ; KNL:       ## %bb.0:
2657 ; KNL-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
2658 ; KNL-NEXT:    vpslld $31, %zmm0, %zmm0
2659 ; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k0
2660 ; KNL-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero
2661 ; KNL-NEXT:    vpslld $31, %zmm0, %zmm0
2662 ; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k1
2663 ; KNL-NEXT:    kmovw %k1, 2(%rdi)
2664 ; KNL-NEXT:    kmovw %k0, (%rdi)
2665 ; KNL-NEXT:    vzeroupper
2666 ; KNL-NEXT:    retq
2668 ; SKX-LABEL: store_32i1_1:
2669 ; SKX:       ## %bb.0:
2670 ; SKX-NEXT:    vpsllw $15, %zmm0, %zmm0
2671 ; SKX-NEXT:    vpmovw2m %zmm0, %k0
2672 ; SKX-NEXT:    kmovd %k0, (%rdi)
2673 ; SKX-NEXT:    vzeroupper
2674 ; SKX-NEXT:    retq
2676 ; AVX512BW-LABEL: store_32i1_1:
2677 ; AVX512BW:       ## %bb.0:
2678 ; AVX512BW-NEXT:    vpsllw $15, %zmm0, %zmm0
2679 ; AVX512BW-NEXT:    vpmovw2m %zmm0, %k0
2680 ; AVX512BW-NEXT:    kmovd %k0, (%rdi)
2681 ; AVX512BW-NEXT:    vzeroupper
2682 ; AVX512BW-NEXT:    retq
2684 ; AVX512DQ-LABEL: store_32i1_1:
2685 ; AVX512DQ:       ## %bb.0:
2686 ; AVX512DQ-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
2687 ; AVX512DQ-NEXT:    vpslld $31, %zmm0, %zmm0
2688 ; AVX512DQ-NEXT:    vpmovd2m %zmm0, %k0
2689 ; AVX512DQ-NEXT:    vpmovzxwd {{.*#+}} zmm0 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero
2690 ; AVX512DQ-NEXT:    vpslld $31, %zmm0, %zmm0
2691 ; AVX512DQ-NEXT:    vpmovd2m %zmm0, %k1
2692 ; AVX512DQ-NEXT:    kmovw %k1, 2(%rdi)
2693 ; AVX512DQ-NEXT:    kmovw %k0, (%rdi)
2694 ; AVX512DQ-NEXT:    vzeroupper
2695 ; AVX512DQ-NEXT:    retq
2697 ; X86-LABEL: store_32i1_1:
2698 ; X86:       ## %bb.0:
2699 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
2700 ; X86-NEXT:    vpsllw $15, %zmm0, %zmm0
2701 ; X86-NEXT:    vpmovw2m %zmm0, %k0
2702 ; X86-NEXT:    kmovd %k0, (%eax)
2703 ; X86-NEXT:    vzeroupper
2704 ; X86-NEXT:    retl
2705   %v1 = trunc <32 x i16> %v to <32 x i1>
2706   store <32 x i1> %v1, <32 x i1>* %a
2707   ret void
2711 define void @store_64i1(<64 x i1>* %a, <64 x i1> %v) {
2713 ; KNL-LABEL: store_64i1:
2714 ; KNL:       ## %bb.0:
2715 ; KNL-NEXT:    vpmovzxbd {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero
2716 ; KNL-NEXT:    vpslld $31, %zmm0, %zmm0
2717 ; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k0
2718 ; KNL-NEXT:    vpmovzxbd {{.*#+}} zmm0 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero,xmm1[4],zero,zero,zero,xmm1[5],zero,zero,zero,xmm1[6],zero,zero,zero,xmm1[7],zero,zero,zero,xmm1[8],zero,zero,zero,xmm1[9],zero,zero,zero,xmm1[10],zero,zero,zero,xmm1[11],zero,zero,zero,xmm1[12],zero,zero,zero,xmm1[13],zero,zero,zero,xmm1[14],zero,zero,zero,xmm1[15],zero,zero,zero
2719 ; KNL-NEXT:    vpslld $31, %zmm0, %zmm0
2720 ; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k1
2721 ; KNL-NEXT:    vpmovzxbd {{.*#+}} zmm0 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero,xmm2[2],zero,zero,zero,xmm2[3],zero,zero,zero,xmm2[4],zero,zero,zero,xmm2[5],zero,zero,zero,xmm2[6],zero,zero,zero,xmm2[7],zero,zero,zero,xmm2[8],zero,zero,zero,xmm2[9],zero,zero,zero,xmm2[10],zero,zero,zero,xmm2[11],zero,zero,zero,xmm2[12],zero,zero,zero,xmm2[13],zero,zero,zero,xmm2[14],zero,zero,zero,xmm2[15],zero,zero,zero
2722 ; KNL-NEXT:    vpslld $31, %zmm0, %zmm0
2723 ; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k2
2724 ; KNL-NEXT:    vpmovzxbd {{.*#+}} zmm0 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero,xmm3[2],zero,zero,zero,xmm3[3],zero,zero,zero,xmm3[4],zero,zero,zero,xmm3[5],zero,zero,zero,xmm3[6],zero,zero,zero,xmm3[7],zero,zero,zero,xmm3[8],zero,zero,zero,xmm3[9],zero,zero,zero,xmm3[10],zero,zero,zero,xmm3[11],zero,zero,zero,xmm3[12],zero,zero,zero,xmm3[13],zero,zero,zero,xmm3[14],zero,zero,zero,xmm3[15],zero,zero,zero
2725 ; KNL-NEXT:    vpslld $31, %zmm0, %zmm0
2726 ; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k3
2727 ; KNL-NEXT:    kmovw %k3, 6(%rdi)
2728 ; KNL-NEXT:    kmovw %k2, 4(%rdi)
2729 ; KNL-NEXT:    kmovw %k1, 2(%rdi)
2730 ; KNL-NEXT:    kmovw %k0, (%rdi)
2731 ; KNL-NEXT:    vzeroupper
2732 ; KNL-NEXT:    retq
2734 ; SKX-LABEL: store_64i1:
2735 ; SKX:       ## %bb.0:
2736 ; SKX-NEXT:    vpsllw $7, %zmm0, %zmm0
2737 ; SKX-NEXT:    vpmovb2m %zmm0, %k0
2738 ; SKX-NEXT:    kmovq %k0, (%rdi)
2739 ; SKX-NEXT:    vzeroupper
2740 ; SKX-NEXT:    retq
2742 ; AVX512BW-LABEL: store_64i1:
2743 ; AVX512BW:       ## %bb.0:
2744 ; AVX512BW-NEXT:    vpsllw $7, %zmm0, %zmm0
2745 ; AVX512BW-NEXT:    vpmovb2m %zmm0, %k0
2746 ; AVX512BW-NEXT:    kmovq %k0, (%rdi)
2747 ; AVX512BW-NEXT:    vzeroupper
2748 ; AVX512BW-NEXT:    retq
2750 ; AVX512DQ-LABEL: store_64i1:
2751 ; AVX512DQ:       ## %bb.0:
2752 ; AVX512DQ-NEXT:    vpmovzxbd {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero
2753 ; AVX512DQ-NEXT:    vpslld $31, %zmm0, %zmm0
2754 ; AVX512DQ-NEXT:    vpmovd2m %zmm0, %k0
2755 ; AVX512DQ-NEXT:    vpmovzxbd {{.*#+}} zmm0 = xmm1[0],zero,zero,zero,xmm1[1],zero,zero,zero,xmm1[2],zero,zero,zero,xmm1[3],zero,zero,zero,xmm1[4],zero,zero,zero,xmm1[5],zero,zero,zero,xmm1[6],zero,zero,zero,xmm1[7],zero,zero,zero,xmm1[8],zero,zero,zero,xmm1[9],zero,zero,zero,xmm1[10],zero,zero,zero,xmm1[11],zero,zero,zero,xmm1[12],zero,zero,zero,xmm1[13],zero,zero,zero,xmm1[14],zero,zero,zero,xmm1[15],zero,zero,zero
2756 ; AVX512DQ-NEXT:    vpslld $31, %zmm0, %zmm0
2757 ; AVX512DQ-NEXT:    vpmovd2m %zmm0, %k1
2758 ; AVX512DQ-NEXT:    vpmovzxbd {{.*#+}} zmm0 = xmm2[0],zero,zero,zero,xmm2[1],zero,zero,zero,xmm2[2],zero,zero,zero,xmm2[3],zero,zero,zero,xmm2[4],zero,zero,zero,xmm2[5],zero,zero,zero,xmm2[6],zero,zero,zero,xmm2[7],zero,zero,zero,xmm2[8],zero,zero,zero,xmm2[9],zero,zero,zero,xmm2[10],zero,zero,zero,xmm2[11],zero,zero,zero,xmm2[12],zero,zero,zero,xmm2[13],zero,zero,zero,xmm2[14],zero,zero,zero,xmm2[15],zero,zero,zero
2759 ; AVX512DQ-NEXT:    vpslld $31, %zmm0, %zmm0
2760 ; AVX512DQ-NEXT:    vpmovd2m %zmm0, %k2
2761 ; AVX512DQ-NEXT:    vpmovzxbd {{.*#+}} zmm0 = xmm3[0],zero,zero,zero,xmm3[1],zero,zero,zero,xmm3[2],zero,zero,zero,xmm3[3],zero,zero,zero,xmm3[4],zero,zero,zero,xmm3[5],zero,zero,zero,xmm3[6],zero,zero,zero,xmm3[7],zero,zero,zero,xmm3[8],zero,zero,zero,xmm3[9],zero,zero,zero,xmm3[10],zero,zero,zero,xmm3[11],zero,zero,zero,xmm3[12],zero,zero,zero,xmm3[13],zero,zero,zero,xmm3[14],zero,zero,zero,xmm3[15],zero,zero,zero
2762 ; AVX512DQ-NEXT:    vpslld $31, %zmm0, %zmm0
2763 ; AVX512DQ-NEXT:    vpmovd2m %zmm0, %k3
2764 ; AVX512DQ-NEXT:    kmovw %k3, 6(%rdi)
2765 ; AVX512DQ-NEXT:    kmovw %k2, 4(%rdi)
2766 ; AVX512DQ-NEXT:    kmovw %k1, 2(%rdi)
2767 ; AVX512DQ-NEXT:    kmovw %k0, (%rdi)
2768 ; AVX512DQ-NEXT:    vzeroupper
2769 ; AVX512DQ-NEXT:    retq
2771 ; X86-LABEL: store_64i1:
2772 ; X86:       ## %bb.0:
2773 ; X86-NEXT:    vpsllw $7, %zmm0, %zmm0
2774 ; X86-NEXT:    vpmovb2m %zmm0, %k0
2775 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
2776 ; X86-NEXT:    kmovq %k0, (%eax)
2777 ; X86-NEXT:    vzeroupper
2778 ; X86-NEXT:    retl
2779   store <64 x i1> %v, <64 x i1>* %a
2780   ret void
2783 define i32 @test_bitcast_v8i1_zext(<16 x i32> %a) {
2784 ; KNL-LABEL: test_bitcast_v8i1_zext:
2785 ; KNL:       ## %bb.0:
2786 ; KNL-NEXT:    vptestnmd %zmm0, %zmm0, %k0
2787 ; KNL-NEXT:    kmovw %k0, %eax
2788 ; KNL-NEXT:    movzbl %al, %eax
2789 ; KNL-NEXT:    addl %eax, %eax
2790 ; KNL-NEXT:    vzeroupper
2791 ; KNL-NEXT:    retq
2793 ; SKX-LABEL: test_bitcast_v8i1_zext:
2794 ; SKX:       ## %bb.0:
2795 ; SKX-NEXT:    vptestnmd %zmm0, %zmm0, %k0
2796 ; SKX-NEXT:    kmovb %k0, %eax
2797 ; SKX-NEXT:    addl %eax, %eax
2798 ; SKX-NEXT:    vzeroupper
2799 ; SKX-NEXT:    retq
2801 ; AVX512BW-LABEL: test_bitcast_v8i1_zext:
2802 ; AVX512BW:       ## %bb.0:
2803 ; AVX512BW-NEXT:    vptestnmd %zmm0, %zmm0, %k0
2804 ; AVX512BW-NEXT:    kmovd %k0, %eax
2805 ; AVX512BW-NEXT:    movzbl %al, %eax
2806 ; AVX512BW-NEXT:    addl %eax, %eax
2807 ; AVX512BW-NEXT:    vzeroupper
2808 ; AVX512BW-NEXT:    retq
2810 ; AVX512DQ-LABEL: test_bitcast_v8i1_zext:
2811 ; AVX512DQ:       ## %bb.0:
2812 ; AVX512DQ-NEXT:    vptestnmd %zmm0, %zmm0, %k0
2813 ; AVX512DQ-NEXT:    kmovb %k0, %eax
2814 ; AVX512DQ-NEXT:    addl %eax, %eax
2815 ; AVX512DQ-NEXT:    vzeroupper
2816 ; AVX512DQ-NEXT:    retq
2818 ; X86-LABEL: test_bitcast_v8i1_zext:
2819 ; X86:       ## %bb.0:
2820 ; X86-NEXT:    vptestnmd %zmm0, %zmm0, %k0
2821 ; X86-NEXT:    kmovb %k0, %eax
2822 ; X86-NEXT:    addl %eax, %eax
2823 ; X86-NEXT:    vzeroupper
2824 ; X86-NEXT:    retl
2825    %v1 = icmp eq <16 x i32> %a, zeroinitializer
2826    %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>
2827    %mask1 = bitcast <8 x i1> %mask to i8
2828    %val = zext i8 %mask1 to i32
2829    %val1 = add i32 %val, %val
2830    ret i32 %val1
2833 define i32 @test_bitcast_v16i1_zext(<16 x i32> %a) {
2834 ; CHECK-LABEL: test_bitcast_v16i1_zext:
2835 ; CHECK:       ## %bb.0:
2836 ; CHECK-NEXT:    vptestnmd %zmm0, %zmm0, %k0
2837 ; CHECK-NEXT:    kmovw %k0, %eax
2838 ; CHECK-NEXT:    addl %eax, %eax
2839 ; CHECK-NEXT:    vzeroupper
2840 ; CHECK-NEXT:    retq
2842 ; X86-LABEL: test_bitcast_v16i1_zext:
2843 ; X86:       ## %bb.0:
2844 ; X86-NEXT:    vptestnmd %zmm0, %zmm0, %k0
2845 ; X86-NEXT:    kmovw %k0, %eax
2846 ; X86-NEXT:    addl %eax, %eax
2847 ; X86-NEXT:    vzeroupper
2848 ; X86-NEXT:    retl
2849    %v1 = icmp eq <16 x i32> %a, zeroinitializer
2850    %mask1 = bitcast <16 x i1> %v1 to i16
2851    %val = zext i16 %mask1 to i32
2852    %val1 = add i32 %val, %val
2853    ret i32 %val1
2856 define i16 @test_v16i1_add(i16 %x, i16 %y) {
2857 ; KNL-LABEL: test_v16i1_add:
2858 ; KNL:       ## %bb.0:
2859 ; KNL-NEXT:    kmovw %edi, %k0
2860 ; KNL-NEXT:    kmovw %esi, %k1
2861 ; KNL-NEXT:    kxorw %k1, %k0, %k0
2862 ; KNL-NEXT:    kmovw %k0, %eax
2863 ; KNL-NEXT:    ## kill: def $ax killed $ax killed $eax
2864 ; KNL-NEXT:    retq
2866 ; SKX-LABEL: test_v16i1_add:
2867 ; SKX:       ## %bb.0:
2868 ; SKX-NEXT:    kmovd %edi, %k0
2869 ; SKX-NEXT:    kmovd %esi, %k1
2870 ; SKX-NEXT:    kxorw %k1, %k0, %k0
2871 ; SKX-NEXT:    kmovd %k0, %eax
2872 ; SKX-NEXT:    ## kill: def $ax killed $ax killed $eax
2873 ; SKX-NEXT:    retq
2875 ; AVX512BW-LABEL: test_v16i1_add:
2876 ; AVX512BW:       ## %bb.0:
2877 ; AVX512BW-NEXT:    kmovd %edi, %k0
2878 ; AVX512BW-NEXT:    kmovd %esi, %k1
2879 ; AVX512BW-NEXT:    kxorw %k1, %k0, %k0
2880 ; AVX512BW-NEXT:    kmovd %k0, %eax
2881 ; AVX512BW-NEXT:    ## kill: def $ax killed $ax killed $eax
2882 ; AVX512BW-NEXT:    retq
2884 ; AVX512DQ-LABEL: test_v16i1_add:
2885 ; AVX512DQ:       ## %bb.0:
2886 ; AVX512DQ-NEXT:    kmovw %edi, %k0
2887 ; AVX512DQ-NEXT:    kmovw %esi, %k1
2888 ; AVX512DQ-NEXT:    kxorw %k1, %k0, %k0
2889 ; AVX512DQ-NEXT:    kmovw %k0, %eax
2890 ; AVX512DQ-NEXT:    ## kill: def $ax killed $ax killed $eax
2891 ; AVX512DQ-NEXT:    retq
2893 ; X86-LABEL: test_v16i1_add:
2894 ; X86:       ## %bb.0:
2895 ; X86-NEXT:    kmovw {{[0-9]+}}(%esp), %k0
2896 ; X86-NEXT:    kmovw {{[0-9]+}}(%esp), %k1
2897 ; X86-NEXT:    kxorw %k1, %k0, %k0
2898 ; X86-NEXT:    kmovd %k0, %eax
2899 ; X86-NEXT:    ## kill: def $ax killed $ax killed $eax
2900 ; X86-NEXT:    retl
2901   %m0 = bitcast i16 %x to <16 x i1>
2902   %m1 = bitcast i16 %y to <16 x i1>
2903   %m2 = add <16 x i1> %m0,  %m1
2904   %ret = bitcast <16 x i1> %m2 to i16
2905   ret i16 %ret
2908 define i16 @test_v16i1_sub(i16 %x, i16 %y) {
2909 ; KNL-LABEL: test_v16i1_sub:
2910 ; KNL:       ## %bb.0:
2911 ; KNL-NEXT:    kmovw %edi, %k0
2912 ; KNL-NEXT:    kmovw %esi, %k1
2913 ; KNL-NEXT:    kxorw %k1, %k0, %k0
2914 ; KNL-NEXT:    kmovw %k0, %eax
2915 ; KNL-NEXT:    ## kill: def $ax killed $ax killed $eax
2916 ; KNL-NEXT:    retq
2918 ; SKX-LABEL: test_v16i1_sub:
2919 ; SKX:       ## %bb.0:
2920 ; SKX-NEXT:    kmovd %edi, %k0
2921 ; SKX-NEXT:    kmovd %esi, %k1
2922 ; SKX-NEXT:    kxorw %k1, %k0, %k0
2923 ; SKX-NEXT:    kmovd %k0, %eax
2924 ; SKX-NEXT:    ## kill: def $ax killed $ax killed $eax
2925 ; SKX-NEXT:    retq
2927 ; AVX512BW-LABEL: test_v16i1_sub:
2928 ; AVX512BW:       ## %bb.0:
2929 ; AVX512BW-NEXT:    kmovd %edi, %k0
2930 ; AVX512BW-NEXT:    kmovd %esi, %k1
2931 ; AVX512BW-NEXT:    kxorw %k1, %k0, %k0
2932 ; AVX512BW-NEXT:    kmovd %k0, %eax
2933 ; AVX512BW-NEXT:    ## kill: def $ax killed $ax killed $eax
2934 ; AVX512BW-NEXT:    retq
2936 ; AVX512DQ-LABEL: test_v16i1_sub:
2937 ; AVX512DQ:       ## %bb.0:
2938 ; AVX512DQ-NEXT:    kmovw %edi, %k0
2939 ; AVX512DQ-NEXT:    kmovw %esi, %k1
2940 ; AVX512DQ-NEXT:    kxorw %k1, %k0, %k0
2941 ; AVX512DQ-NEXT:    kmovw %k0, %eax
2942 ; AVX512DQ-NEXT:    ## kill: def $ax killed $ax killed $eax
2943 ; AVX512DQ-NEXT:    retq
2945 ; X86-LABEL: test_v16i1_sub:
2946 ; X86:       ## %bb.0:
2947 ; X86-NEXT:    kmovw {{[0-9]+}}(%esp), %k0
2948 ; X86-NEXT:    kmovw {{[0-9]+}}(%esp), %k1
2949 ; X86-NEXT:    kxorw %k1, %k0, %k0
2950 ; X86-NEXT:    kmovd %k0, %eax
2951 ; X86-NEXT:    ## kill: def $ax killed $ax killed $eax
2952 ; X86-NEXT:    retl
2953   %m0 = bitcast i16 %x to <16 x i1>
2954   %m1 = bitcast i16 %y to <16 x i1>
2955   %m2 = sub <16 x i1> %m0,  %m1
2956   %ret = bitcast <16 x i1> %m2 to i16
2957   ret i16 %ret
2960 define i16 @test_v16i1_mul(i16 %x, i16 %y) {
2961 ; KNL-LABEL: test_v16i1_mul:
2962 ; KNL:       ## %bb.0:
2963 ; KNL-NEXT:    kmovw %edi, %k0
2964 ; KNL-NEXT:    kmovw %esi, %k1
2965 ; KNL-NEXT:    kandw %k1, %k0, %k0
2966 ; KNL-NEXT:    kmovw %k0, %eax
2967 ; KNL-NEXT:    ## kill: def $ax killed $ax killed $eax
2968 ; KNL-NEXT:    retq
2970 ; SKX-LABEL: test_v16i1_mul:
2971 ; SKX:       ## %bb.0:
2972 ; SKX-NEXT:    kmovd %edi, %k0
2973 ; SKX-NEXT:    kmovd %esi, %k1
2974 ; SKX-NEXT:    kandw %k1, %k0, %k0
2975 ; SKX-NEXT:    kmovd %k0, %eax
2976 ; SKX-NEXT:    ## kill: def $ax killed $ax killed $eax
2977 ; SKX-NEXT:    retq
2979 ; AVX512BW-LABEL: test_v16i1_mul:
2980 ; AVX512BW:       ## %bb.0:
2981 ; AVX512BW-NEXT:    kmovd %edi, %k0
2982 ; AVX512BW-NEXT:    kmovd %esi, %k1
2983 ; AVX512BW-NEXT:    kandw %k1, %k0, %k0
2984 ; AVX512BW-NEXT:    kmovd %k0, %eax
2985 ; AVX512BW-NEXT:    ## kill: def $ax killed $ax killed $eax
2986 ; AVX512BW-NEXT:    retq
2988 ; AVX512DQ-LABEL: test_v16i1_mul:
2989 ; AVX512DQ:       ## %bb.0:
2990 ; AVX512DQ-NEXT:    kmovw %edi, %k0
2991 ; AVX512DQ-NEXT:    kmovw %esi, %k1
2992 ; AVX512DQ-NEXT:    kandw %k1, %k0, %k0
2993 ; AVX512DQ-NEXT:    kmovw %k0, %eax
2994 ; AVX512DQ-NEXT:    ## kill: def $ax killed $ax killed $eax
2995 ; AVX512DQ-NEXT:    retq
2997 ; X86-LABEL: test_v16i1_mul:
2998 ; X86:       ## %bb.0:
2999 ; X86-NEXT:    kmovw {{[0-9]+}}(%esp), %k0
3000 ; X86-NEXT:    kmovw {{[0-9]+}}(%esp), %k1
3001 ; X86-NEXT:    kandw %k1, %k0, %k0
3002 ; X86-NEXT:    kmovd %k0, %eax
3003 ; X86-NEXT:    ## kill: def $ax killed $ax killed $eax
3004 ; X86-NEXT:    retl
3005   %m0 = bitcast i16 %x to <16 x i1>
3006   %m1 = bitcast i16 %y to <16 x i1>
3007   %m2 = mul <16 x i1> %m0,  %m1
3008   %ret = bitcast <16 x i1> %m2 to i16
3009   ret i16 %ret
3012 define i8 @test_v8i1_add(i8 %x, i8 %y) {
3013 ; KNL-LABEL: test_v8i1_add:
3014 ; KNL:       ## %bb.0:
3015 ; KNL-NEXT:    kmovw %edi, %k0
3016 ; KNL-NEXT:    kmovw %esi, %k1
3017 ; KNL-NEXT:    kxorw %k1, %k0, %k0
3018 ; KNL-NEXT:    kmovw %k0, %eax
3019 ; KNL-NEXT:    ## kill: def $al killed $al killed $eax
3020 ; KNL-NEXT:    retq
3022 ; SKX-LABEL: test_v8i1_add:
3023 ; SKX:       ## %bb.0:
3024 ; SKX-NEXT:    kmovd %edi, %k0
3025 ; SKX-NEXT:    kmovd %esi, %k1
3026 ; SKX-NEXT:    kxorb %k1, %k0, %k0
3027 ; SKX-NEXT:    kmovd %k0, %eax
3028 ; SKX-NEXT:    ## kill: def $al killed $al killed $eax
3029 ; SKX-NEXT:    retq
3031 ; AVX512BW-LABEL: test_v8i1_add:
3032 ; AVX512BW:       ## %bb.0:
3033 ; AVX512BW-NEXT:    kmovd %edi, %k0
3034 ; AVX512BW-NEXT:    kmovd %esi, %k1
3035 ; AVX512BW-NEXT:    kxorw %k1, %k0, %k0
3036 ; AVX512BW-NEXT:    kmovd %k0, %eax
3037 ; AVX512BW-NEXT:    ## kill: def $al killed $al killed $eax
3038 ; AVX512BW-NEXT:    retq
3040 ; AVX512DQ-LABEL: test_v8i1_add:
3041 ; AVX512DQ:       ## %bb.0:
3042 ; AVX512DQ-NEXT:    kmovw %edi, %k0
3043 ; AVX512DQ-NEXT:    kmovw %esi, %k1
3044 ; AVX512DQ-NEXT:    kxorb %k1, %k0, %k0
3045 ; AVX512DQ-NEXT:    kmovw %k0, %eax
3046 ; AVX512DQ-NEXT:    ## kill: def $al killed $al killed $eax
3047 ; AVX512DQ-NEXT:    retq
3049 ; X86-LABEL: test_v8i1_add:
3050 ; X86:       ## %bb.0:
3051 ; X86-NEXT:    kmovb {{[0-9]+}}(%esp), %k0
3052 ; X86-NEXT:    kmovb {{[0-9]+}}(%esp), %k1
3053 ; X86-NEXT:    kxorb %k1, %k0, %k0
3054 ; X86-NEXT:    kmovd %k0, %eax
3055 ; X86-NEXT:    ## kill: def $al killed $al killed $eax
3056 ; X86-NEXT:    retl
3057   %m0 = bitcast i8 %x to <8 x i1>
3058   %m1 = bitcast i8 %y to <8 x i1>
3059   %m2 = add <8 x i1> %m0,  %m1
3060   %ret = bitcast <8 x i1> %m2 to i8
3061   ret i8 %ret
3064 define i8 @test_v8i1_sub(i8 %x, i8 %y) {
3065 ; KNL-LABEL: test_v8i1_sub:
3066 ; KNL:       ## %bb.0:
3067 ; KNL-NEXT:    kmovw %edi, %k0
3068 ; KNL-NEXT:    kmovw %esi, %k1
3069 ; KNL-NEXT:    kxorw %k1, %k0, %k0
3070 ; KNL-NEXT:    kmovw %k0, %eax
3071 ; KNL-NEXT:    ## kill: def $al killed $al killed $eax
3072 ; KNL-NEXT:    retq
3074 ; SKX-LABEL: test_v8i1_sub:
3075 ; SKX:       ## %bb.0:
3076 ; SKX-NEXT:    kmovd %edi, %k0
3077 ; SKX-NEXT:    kmovd %esi, %k1
3078 ; SKX-NEXT:    kxorb %k1, %k0, %k0
3079 ; SKX-NEXT:    kmovd %k0, %eax
3080 ; SKX-NEXT:    ## kill: def $al killed $al killed $eax
3081 ; SKX-NEXT:    retq
3083 ; AVX512BW-LABEL: test_v8i1_sub:
3084 ; AVX512BW:       ## %bb.0:
3085 ; AVX512BW-NEXT:    kmovd %edi, %k0
3086 ; AVX512BW-NEXT:    kmovd %esi, %k1
3087 ; AVX512BW-NEXT:    kxorw %k1, %k0, %k0
3088 ; AVX512BW-NEXT:    kmovd %k0, %eax
3089 ; AVX512BW-NEXT:    ## kill: def $al killed $al killed $eax
3090 ; AVX512BW-NEXT:    retq
3092 ; AVX512DQ-LABEL: test_v8i1_sub:
3093 ; AVX512DQ:       ## %bb.0:
3094 ; AVX512DQ-NEXT:    kmovw %edi, %k0
3095 ; AVX512DQ-NEXT:    kmovw %esi, %k1
3096 ; AVX512DQ-NEXT:    kxorb %k1, %k0, %k0
3097 ; AVX512DQ-NEXT:    kmovw %k0, %eax
3098 ; AVX512DQ-NEXT:    ## kill: def $al killed $al killed $eax
3099 ; AVX512DQ-NEXT:    retq
3101 ; X86-LABEL: test_v8i1_sub:
3102 ; X86:       ## %bb.0:
3103 ; X86-NEXT:    kmovb {{[0-9]+}}(%esp), %k0
3104 ; X86-NEXT:    kmovb {{[0-9]+}}(%esp), %k1
3105 ; X86-NEXT:    kxorb %k1, %k0, %k0
3106 ; X86-NEXT:    kmovd %k0, %eax
3107 ; X86-NEXT:    ## kill: def $al killed $al killed $eax
3108 ; X86-NEXT:    retl
3109   %m0 = bitcast i8 %x to <8 x i1>
3110   %m1 = bitcast i8 %y to <8 x i1>
3111   %m2 = sub <8 x i1> %m0,  %m1
3112   %ret = bitcast <8 x i1> %m2 to i8
3113   ret i8 %ret
3116 define i8 @test_v8i1_mul(i8 %x, i8 %y) {
3117 ; KNL-LABEL: test_v8i1_mul:
3118 ; KNL:       ## %bb.0:
3119 ; KNL-NEXT:    kmovw %edi, %k0
3120 ; KNL-NEXT:    kmovw %esi, %k1
3121 ; KNL-NEXT:    kandw %k1, %k0, %k0
3122 ; KNL-NEXT:    kmovw %k0, %eax
3123 ; KNL-NEXT:    ## kill: def $al killed $al killed $eax
3124 ; KNL-NEXT:    retq
3126 ; SKX-LABEL: test_v8i1_mul:
3127 ; SKX:       ## %bb.0:
3128 ; SKX-NEXT:    kmovd %edi, %k0
3129 ; SKX-NEXT:    kmovd %esi, %k1
3130 ; SKX-NEXT:    kandb %k1, %k0, %k0
3131 ; SKX-NEXT:    kmovd %k0, %eax
3132 ; SKX-NEXT:    ## kill: def $al killed $al killed $eax
3133 ; SKX-NEXT:    retq
3135 ; AVX512BW-LABEL: test_v8i1_mul:
3136 ; AVX512BW:       ## %bb.0:
3137 ; AVX512BW-NEXT:    kmovd %edi, %k0
3138 ; AVX512BW-NEXT:    kmovd %esi, %k1
3139 ; AVX512BW-NEXT:    kandw %k1, %k0, %k0
3140 ; AVX512BW-NEXT:    kmovd %k0, %eax
3141 ; AVX512BW-NEXT:    ## kill: def $al killed $al killed $eax
3142 ; AVX512BW-NEXT:    retq
3144 ; AVX512DQ-LABEL: test_v8i1_mul:
3145 ; AVX512DQ:       ## %bb.0:
3146 ; AVX512DQ-NEXT:    kmovw %edi, %k0
3147 ; AVX512DQ-NEXT:    kmovw %esi, %k1
3148 ; AVX512DQ-NEXT:    kandb %k1, %k0, %k0
3149 ; AVX512DQ-NEXT:    kmovw %k0, %eax
3150 ; AVX512DQ-NEXT:    ## kill: def $al killed $al killed $eax
3151 ; AVX512DQ-NEXT:    retq
3153 ; X86-LABEL: test_v8i1_mul:
3154 ; X86:       ## %bb.0:
3155 ; X86-NEXT:    kmovb {{[0-9]+}}(%esp), %k0
3156 ; X86-NEXT:    kmovb {{[0-9]+}}(%esp), %k1
3157 ; X86-NEXT:    kandb %k1, %k0, %k0
3158 ; X86-NEXT:    kmovd %k0, %eax
3159 ; X86-NEXT:    ## kill: def $al killed $al killed $eax
3160 ; X86-NEXT:    retl
3161   %m0 = bitcast i8 %x to <8 x i1>
3162   %m1 = bitcast i8 %y to <8 x i1>
3163   %m2 = mul <8 x i1> %m0,  %m1
3164   %ret = bitcast <8 x i1> %m2 to i8
3165   ret i8 %ret
3168 ; Make sure we don't emit a ktest for signed comparisons.
3169 define void @ktest_signed(<16 x i32> %x, <16 x i32> %y) {
3170 ; KNL-LABEL: ktest_signed:
3171 ; KNL:       ## %bb.0:
3172 ; KNL-NEXT:    pushq %rax
3173 ; KNL-NEXT:    .cfi_def_cfa_offset 16
3174 ; KNL-NEXT:    vpord %zmm1, %zmm0, %zmm0
3175 ; KNL-NEXT:    vptestnmd %zmm0, %zmm0, %k0
3176 ; KNL-NEXT:    kmovw %k0, %eax
3177 ; KNL-NEXT:    testw %ax, %ax
3178 ; KNL-NEXT:    jle LBB64_1
3179 ; KNL-NEXT:  ## %bb.2: ## %bb.2
3180 ; KNL-NEXT:    popq %rax
3181 ; KNL-NEXT:    vzeroupper
3182 ; KNL-NEXT:    retq
3183 ; KNL-NEXT:  LBB64_1: ## %bb.1
3184 ; KNL-NEXT:    vzeroupper
3185 ; KNL-NEXT:    callq _foo
3186 ; KNL-NEXT:    popq %rax
3187 ; KNL-NEXT:    retq
3189 ; SKX-LABEL: ktest_signed:
3190 ; SKX:       ## %bb.0:
3191 ; SKX-NEXT:    pushq %rax
3192 ; SKX-NEXT:    .cfi_def_cfa_offset 16
3193 ; SKX-NEXT:    vpord %zmm1, %zmm0, %zmm0
3194 ; SKX-NEXT:    vptestnmd %zmm0, %zmm0, %k0
3195 ; SKX-NEXT:    kmovd %k0, %eax
3196 ; SKX-NEXT:    testw %ax, %ax
3197 ; SKX-NEXT:    jle LBB64_1
3198 ; SKX-NEXT:  ## %bb.2: ## %bb.2
3199 ; SKX-NEXT:    popq %rax
3200 ; SKX-NEXT:    vzeroupper
3201 ; SKX-NEXT:    retq
3202 ; SKX-NEXT:  LBB64_1: ## %bb.1
3203 ; SKX-NEXT:    vzeroupper
3204 ; SKX-NEXT:    callq _foo
3205 ; SKX-NEXT:    popq %rax
3206 ; SKX-NEXT:    retq
3208 ; AVX512BW-LABEL: ktest_signed:
3209 ; AVX512BW:       ## %bb.0:
3210 ; AVX512BW-NEXT:    pushq %rax
3211 ; AVX512BW-NEXT:    .cfi_def_cfa_offset 16
3212 ; AVX512BW-NEXT:    vpord %zmm1, %zmm0, %zmm0
3213 ; AVX512BW-NEXT:    vptestnmd %zmm0, %zmm0, %k0
3214 ; AVX512BW-NEXT:    kmovd %k0, %eax
3215 ; AVX512BW-NEXT:    testw %ax, %ax
3216 ; AVX512BW-NEXT:    jle LBB64_1
3217 ; AVX512BW-NEXT:  ## %bb.2: ## %bb.2
3218 ; AVX512BW-NEXT:    popq %rax
3219 ; AVX512BW-NEXT:    vzeroupper
3220 ; AVX512BW-NEXT:    retq
3221 ; AVX512BW-NEXT:  LBB64_1: ## %bb.1
3222 ; AVX512BW-NEXT:    vzeroupper
3223 ; AVX512BW-NEXT:    callq _foo
3224 ; AVX512BW-NEXT:    popq %rax
3225 ; AVX512BW-NEXT:    retq
3227 ; AVX512DQ-LABEL: ktest_signed:
3228 ; AVX512DQ:       ## %bb.0:
3229 ; AVX512DQ-NEXT:    pushq %rax
3230 ; AVX512DQ-NEXT:    .cfi_def_cfa_offset 16
3231 ; AVX512DQ-NEXT:    vpord %zmm1, %zmm0, %zmm0
3232 ; AVX512DQ-NEXT:    vptestnmd %zmm0, %zmm0, %k0
3233 ; AVX512DQ-NEXT:    kmovw %k0, %eax
3234 ; AVX512DQ-NEXT:    testw %ax, %ax
3235 ; AVX512DQ-NEXT:    jle LBB64_1
3236 ; AVX512DQ-NEXT:  ## %bb.2: ## %bb.2
3237 ; AVX512DQ-NEXT:    popq %rax
3238 ; AVX512DQ-NEXT:    vzeroupper
3239 ; AVX512DQ-NEXT:    retq
3240 ; AVX512DQ-NEXT:  LBB64_1: ## %bb.1
3241 ; AVX512DQ-NEXT:    vzeroupper
3242 ; AVX512DQ-NEXT:    callq _foo
3243 ; AVX512DQ-NEXT:    popq %rax
3244 ; AVX512DQ-NEXT:    retq
3246 ; X86-LABEL: ktest_signed:
3247 ; X86:       ## %bb.0:
3248 ; X86-NEXT:    subl $12, %esp
3249 ; X86-NEXT:    .cfi_def_cfa_offset 16
3250 ; X86-NEXT:    vpord %zmm1, %zmm0, %zmm0
3251 ; X86-NEXT:    vptestnmd %zmm0, %zmm0, %k0
3252 ; X86-NEXT:    kmovd %k0, %eax
3253 ; X86-NEXT:    testw %ax, %ax
3254 ; X86-NEXT:    jle LBB64_1
3255 ; X86-NEXT:  ## %bb.2: ## %bb.2
3256 ; X86-NEXT:    addl $12, %esp
3257 ; X86-NEXT:    vzeroupper
3258 ; X86-NEXT:    retl
3259 ; X86-NEXT:  LBB64_1: ## %bb.1
3260 ; X86-NEXT:    vzeroupper
3261 ; X86-NEXT:    calll _foo
3262 ; X86-NEXT:    addl $12, %esp
3263 ; X86-NEXT:    retl
3264   %a = icmp eq <16 x i32> %x, zeroinitializer
3265   %b = icmp eq <16 x i32> %y, zeroinitializer
3266   %c = and <16 x i1> %a, %b
3267   %d = bitcast <16 x i1> %c to i16
3268   %e = icmp sgt i16 %d, 0
3269   br i1 %e, label %bb.2, label %bb.1
3270 bb.1:
3271   call void @foo()
3272   br label %bb.2
3273 bb.2:
3274   ret void
3276 declare void @foo()
3278 ; Make sure we can use the C flag from kortest to check for all ones.
3279 define void @ktest_allones(<16 x i32> %x, <16 x i32> %y) {
3280 ; CHECK-LABEL: ktest_allones:
3281 ; CHECK:       ## %bb.0:
3282 ; CHECK-NEXT:    pushq %rax
3283 ; CHECK-NEXT:    .cfi_def_cfa_offset 16
3284 ; CHECK-NEXT:    vpord %zmm1, %zmm0, %zmm0
3285 ; CHECK-NEXT:    vptestnmd %zmm0, %zmm0, %k0
3286 ; CHECK-NEXT:    kortestw %k0, %k0
3287 ; CHECK-NEXT:    jb LBB65_2
3288 ; CHECK-NEXT:  ## %bb.1: ## %bb.1
3289 ; CHECK-NEXT:    vzeroupper
3290 ; CHECK-NEXT:    callq _foo
3291 ; CHECK-NEXT:  LBB65_2: ## %bb.2
3292 ; CHECK-NEXT:    popq %rax
3293 ; CHECK-NEXT:    vzeroupper
3294 ; CHECK-NEXT:    retq
3296 ; X86-LABEL: ktest_allones:
3297 ; X86:       ## %bb.0:
3298 ; X86-NEXT:    subl $12, %esp
3299 ; X86-NEXT:    .cfi_def_cfa_offset 16
3300 ; X86-NEXT:    vpord %zmm1, %zmm0, %zmm0
3301 ; X86-NEXT:    vptestnmd %zmm0, %zmm0, %k0
3302 ; X86-NEXT:    kortestw %k0, %k0
3303 ; X86-NEXT:    jb LBB65_2
3304 ; X86-NEXT:  ## %bb.1: ## %bb.1
3305 ; X86-NEXT:    vzeroupper
3306 ; X86-NEXT:    calll _foo
3307 ; X86-NEXT:  LBB65_2: ## %bb.2
3308 ; X86-NEXT:    addl $12, %esp
3309 ; X86-NEXT:    vzeroupper
3310 ; X86-NEXT:    retl
3311   %a = icmp eq <16 x i32> %x, zeroinitializer
3312   %b = icmp eq <16 x i32> %y, zeroinitializer
3313   %c = and <16 x i1> %a, %b
3314   %d = bitcast <16 x i1> %c to i16
3315   %e = icmp eq i16 %d, -1
3316   br i1 %e, label %bb.2, label %bb.1
3317 bb.1:
3318   call void @foo()
3319   br label %bb.2
3320 bb.2:
3321   ret void
3324 ; 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.
3325 ; The widening happens in the scalar domain between the intrinsics. The middle end optmized it to this.
3326 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) {
3327 ; KNL-LABEL: mask_widening:
3328 ; KNL:       ## %bb.0: ## %entry
3329 ; KNL-NEXT:    ## kill: def $xmm1 killed $xmm1 def $zmm1
3330 ; KNL-NEXT:    ## kill: def $xmm0 killed $xmm0 def $zmm0
3331 ; KNL-NEXT:    vpcmpeqd %zmm1, %zmm0, %k0
3332 ; KNL-NEXT:    kshiftlw $12, %k0, %k0
3333 ; KNL-NEXT:    kshiftrw $12, %k0, %k1
3334 ; KNL-NEXT:    vpblendmd %zmm5, %zmm4, %zmm0 {%k1}
3335 ; KNL-NEXT:    retq
3337 ; SKX-LABEL: mask_widening:
3338 ; SKX:       ## %bb.0: ## %entry
3339 ; SKX-NEXT:    vpcmpeqd %xmm1, %xmm0, %k1
3340 ; SKX-NEXT:    vpblendmd %zmm5, %zmm4, %zmm0 {%k1}
3341 ; SKX-NEXT:    retq
3343 ; AVX512BW-LABEL: mask_widening:
3344 ; AVX512BW:       ## %bb.0: ## %entry
3345 ; AVX512BW-NEXT:    ## kill: def $xmm1 killed $xmm1 def $zmm1
3346 ; AVX512BW-NEXT:    ## kill: def $xmm0 killed $xmm0 def $zmm0
3347 ; AVX512BW-NEXT:    vpcmpeqd %zmm1, %zmm0, %k0
3348 ; AVX512BW-NEXT:    kshiftlw $12, %k0, %k0
3349 ; AVX512BW-NEXT:    kshiftrw $12, %k0, %k1
3350 ; AVX512BW-NEXT:    vpblendmd %zmm5, %zmm4, %zmm0 {%k1}
3351 ; AVX512BW-NEXT:    retq
3353 ; AVX512DQ-LABEL: mask_widening:
3354 ; AVX512DQ:       ## %bb.0: ## %entry
3355 ; AVX512DQ-NEXT:    ## kill: def $xmm1 killed $xmm1 def $zmm1
3356 ; AVX512DQ-NEXT:    ## kill: def $xmm0 killed $xmm0 def $zmm0
3357 ; AVX512DQ-NEXT:    vpcmpeqd %zmm1, %zmm0, %k0
3358 ; AVX512DQ-NEXT:    kshiftlw $12, %k0, %k0
3359 ; AVX512DQ-NEXT:    kshiftrw $12, %k0, %k1
3360 ; AVX512DQ-NEXT:    vpblendmd %zmm5, %zmm4, %zmm0 {%k1}
3361 ; AVX512DQ-NEXT:    retq
3363 ; X86-LABEL: mask_widening:
3364 ; X86:       ## %bb.0: ## %entry
3365 ; X86-NEXT:    pushl %ebp
3366 ; X86-NEXT:    .cfi_def_cfa_offset 8
3367 ; X86-NEXT:    .cfi_offset %ebp, -8
3368 ; X86-NEXT:    movl %esp, %ebp
3369 ; X86-NEXT:    .cfi_def_cfa_register %ebp
3370 ; X86-NEXT:    andl $-64, %esp
3371 ; X86-NEXT:    subl $64, %esp
3372 ; X86-NEXT:    vpcmpeqd %xmm1, %xmm0, %k1
3373 ; X86-NEXT:    vmovdqa64 8(%ebp), %zmm0
3374 ; X86-NEXT:    vmovdqa32 72(%ebp), %zmm0 {%k1}
3375 ; X86-NEXT:    movl %ebp, %esp
3376 ; X86-NEXT:    popl %ebp
3377 ; X86-NEXT:    retl
3378 entry:
3379   %0 = bitcast <2 x i64> %a to <4 x i32>
3380   %1 = bitcast <2 x i64> %b to <4 x i32>
3381   %2 = icmp eq <4 x i32> %0, %1
3382   %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>
3383   %4 = bitcast <8 x i64> %f to <16 x i32>
3384   %5 = bitcast <8 x i64> %e to <16 x i32>
3385   %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>
3386   %7 = select <16 x i1> %6, <16 x i32> %4, <16 x i32> %5
3387   %8 = bitcast <16 x i32> %7 to <8 x i64>
3388   ret <8 x i64> %8
3391 define void @store_v64i1_constant(<64 x i1>* %R) {
3392 ; CHECK-LABEL: store_v64i1_constant:
3393 ; CHECK:       ## %bb.0: ## %entry
3394 ; CHECK-NEXT:    movabsq $-2305843576149381123, %rax ## imm = 0xDFFFFF7BFFFFEFFD
3395 ; CHECK-NEXT:    movq %rax, (%rdi)
3396 ; CHECK-NEXT:    retq
3398 ; X86-LABEL: store_v64i1_constant:
3399 ; X86:       ## %bb.0: ## %entry
3400 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
3401 ; X86-NEXT:    movl $-536871045, 4(%eax) ## imm = 0xDFFFFF7B
3402 ; X86-NEXT:    movl $-4099, (%eax) ## imm = 0xEFFD
3403 ; X86-NEXT:    retl
3404 entry:
3405   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
3406   ret void
3409 define void @store_v2i1_constant(<2 x i1>* %R) {
3410 ; CHECK-LABEL: store_v2i1_constant:
3411 ; CHECK:       ## %bb.0: ## %entry
3412 ; CHECK-NEXT:    movb $1, (%rdi)
3413 ; CHECK-NEXT:    retq
3415 ; X86-LABEL: store_v2i1_constant:
3416 ; X86:       ## %bb.0: ## %entry
3417 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
3418 ; X86-NEXT:    movb $1, (%eax)
3419 ; X86-NEXT:    retl
3420 entry:
3421   store <2 x i1> <i1 1, i1 0>, <2 x i1>* %R
3422   ret void
3425 define void @store_v4i1_constant(<4 x i1>* %R) {
3426 ; CHECK-LABEL: store_v4i1_constant:
3427 ; CHECK:       ## %bb.0: ## %entry
3428 ; CHECK-NEXT:    movb $5, (%rdi)
3429 ; CHECK-NEXT:    retq
3431 ; X86-LABEL: store_v4i1_constant:
3432 ; X86:       ## %bb.0: ## %entry
3433 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
3434 ; X86-NEXT:    movb $5, (%eax)
3435 ; X86-NEXT:    retl
3436 entry:
3437   store <4 x i1> <i1 1, i1 0, i1 1, i1 0>, <4 x i1>* %R
3438   ret void
3441 ; Make sure we bring the -1 constant into the mask domain.
3442 define void @mask_not_cast(i8*, <8 x i64>, <8 x i64>, <8 x i64>, <8 x i64>) {
3443 ; CHECK-LABEL: mask_not_cast:
3444 ; CHECK:       ## %bb.0:
3445 ; CHECK-NEXT:    vpcmpnleud %zmm3, %zmm2, %k1
3446 ; CHECK-NEXT:    vptestmd %zmm0, %zmm1, %k1 {%k1}
3447 ; CHECK-NEXT:    vmovdqu32 %zmm0, (%rdi) {%k1}
3448 ; CHECK-NEXT:    vzeroupper
3449 ; CHECK-NEXT:    retq
3451 ; X86-LABEL: mask_not_cast:
3452 ; X86:       ## %bb.0:
3453 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
3454 ; X86-NEXT:    vpcmpnleud %zmm3, %zmm2, %k1
3455 ; X86-NEXT:    vptestmd %zmm0, %zmm1, %k1 {%k1}
3456 ; X86-NEXT:    vmovdqu32 %zmm0, (%eax) {%k1}
3457 ; X86-NEXT:    vzeroupper
3458 ; X86-NEXT:    retl
3459   %6 = and <8 x i64> %2, %1
3460   %7 = bitcast <8 x i64> %6 to <16 x i32>
3461   %8 = icmp ne <16 x i32> %7, zeroinitializer
3462   %9 = bitcast <16 x i1> %8 to i16
3463   %10 = bitcast <8 x i64> %3 to <16 x i32>
3464   %11 = bitcast <8 x i64> %4 to <16 x i32>
3465   %12 = icmp ule <16 x i32> %10, %11
3466   %13 = bitcast <16 x i1> %12 to i16
3467   %14 = xor i16 %13, -1
3468   %15 = and i16 %14, %9
3469   %16 = bitcast <8 x i64> %1 to <16 x i32>
3470   %17 = bitcast i8* %0 to <16 x i32>*
3471   %18 = bitcast i16 %15 to <16 x i1>
3472   tail call void @llvm.masked.store.v16i32.p0v16i32(<16 x i32> %16, <16 x i32>* %17, i32 1, <16 x i1> %18) #2
3473   ret void
3475 declare void @llvm.masked.store.v16i32.p0v16i32(<16 x i32>, <16 x i32>*, i32, <16 x i1>)
3477 define void @ktest_3(<8 x i32> %w, <8 x i32> %x, <8 x i32> %y, <8 x i32> %z) {
3478 ; KNL-LABEL: ktest_3:
3479 ; KNL:       ## %bb.0:
3480 ; KNL-NEXT:    pushq %rax
3481 ; KNL-NEXT:    .cfi_def_cfa_offset 16
3482 ; KNL-NEXT:    ## kill: def $ymm3 killed $ymm3 def $zmm3
3483 ; KNL-NEXT:    ## kill: def $ymm2 killed $ymm2 def $zmm2
3484 ; KNL-NEXT:    ## kill: def $ymm1 killed $ymm1 def $zmm1
3485 ; KNL-NEXT:    ## kill: def $ymm0 killed $ymm0 def $zmm0
3486 ; KNL-NEXT:    vptestnmd %zmm0, %zmm0, %k0
3487 ; KNL-NEXT:    vptestnmd %zmm1, %zmm1, %k1
3488 ; KNL-NEXT:    vptestnmd %zmm2, %zmm2, %k2
3489 ; KNL-NEXT:    vptestnmd %zmm3, %zmm3, %k3
3490 ; KNL-NEXT:    korw %k1, %k0, %k0
3491 ; KNL-NEXT:    korw %k3, %k2, %k1
3492 ; KNL-NEXT:    kandw %k1, %k0, %k0
3493 ; KNL-NEXT:    kmovw %k0, %eax
3494 ; KNL-NEXT:    testb %al, %al
3495 ; KNL-NEXT:    je LBB71_1
3496 ; KNL-NEXT:  ## %bb.2: ## %exit
3497 ; KNL-NEXT:    popq %rax
3498 ; KNL-NEXT:    vzeroupper
3499 ; KNL-NEXT:    retq
3500 ; KNL-NEXT:  LBB71_1: ## %bar
3501 ; KNL-NEXT:    vzeroupper
3502 ; KNL-NEXT:    callq _foo
3503 ; KNL-NEXT:    popq %rax
3504 ; KNL-NEXT:    retq
3506 ; SKX-LABEL: ktest_3:
3507 ; SKX:       ## %bb.0:
3508 ; SKX-NEXT:    pushq %rax
3509 ; SKX-NEXT:    .cfi_def_cfa_offset 16
3510 ; SKX-NEXT:    vptestnmd %ymm0, %ymm0, %k0
3511 ; SKX-NEXT:    vptestnmd %ymm1, %ymm1, %k1
3512 ; SKX-NEXT:    korb %k1, %k0, %k0
3513 ; SKX-NEXT:    vptestnmd %ymm2, %ymm2, %k1
3514 ; SKX-NEXT:    vptestnmd %ymm3, %ymm3, %k2
3515 ; SKX-NEXT:    korb %k2, %k1, %k1
3516 ; SKX-NEXT:    ktestb %k1, %k0
3517 ; SKX-NEXT:    je LBB71_1
3518 ; SKX-NEXT:  ## %bb.2: ## %exit
3519 ; SKX-NEXT:    popq %rax
3520 ; SKX-NEXT:    vzeroupper
3521 ; SKX-NEXT:    retq
3522 ; SKX-NEXT:  LBB71_1: ## %bar
3523 ; SKX-NEXT:    vzeroupper
3524 ; SKX-NEXT:    callq _foo
3525 ; SKX-NEXT:    popq %rax
3526 ; SKX-NEXT:    retq
3528 ; AVX512BW-LABEL: ktest_3:
3529 ; AVX512BW:       ## %bb.0:
3530 ; AVX512BW-NEXT:    pushq %rax
3531 ; AVX512BW-NEXT:    .cfi_def_cfa_offset 16
3532 ; AVX512BW-NEXT:    ## kill: def $ymm3 killed $ymm3 def $zmm3
3533 ; AVX512BW-NEXT:    ## kill: def $ymm2 killed $ymm2 def $zmm2
3534 ; AVX512BW-NEXT:    ## kill: def $ymm1 killed $ymm1 def $zmm1
3535 ; AVX512BW-NEXT:    ## kill: def $ymm0 killed $ymm0 def $zmm0
3536 ; AVX512BW-NEXT:    vptestnmd %zmm0, %zmm0, %k0
3537 ; AVX512BW-NEXT:    vptestnmd %zmm1, %zmm1, %k1
3538 ; AVX512BW-NEXT:    vptestnmd %zmm2, %zmm2, %k2
3539 ; AVX512BW-NEXT:    vptestnmd %zmm3, %zmm3, %k3
3540 ; AVX512BW-NEXT:    korw %k1, %k0, %k0
3541 ; AVX512BW-NEXT:    korw %k3, %k2, %k1
3542 ; AVX512BW-NEXT:    kandw %k1, %k0, %k0
3543 ; AVX512BW-NEXT:    kmovd %k0, %eax
3544 ; AVX512BW-NEXT:    testb %al, %al
3545 ; AVX512BW-NEXT:    je LBB71_1
3546 ; AVX512BW-NEXT:  ## %bb.2: ## %exit
3547 ; AVX512BW-NEXT:    popq %rax
3548 ; AVX512BW-NEXT:    vzeroupper
3549 ; AVX512BW-NEXT:    retq
3550 ; AVX512BW-NEXT:  LBB71_1: ## %bar
3551 ; AVX512BW-NEXT:    vzeroupper
3552 ; AVX512BW-NEXT:    callq _foo
3553 ; AVX512BW-NEXT:    popq %rax
3554 ; AVX512BW-NEXT:    retq
3556 ; AVX512DQ-LABEL: ktest_3:
3557 ; AVX512DQ:       ## %bb.0:
3558 ; AVX512DQ-NEXT:    pushq %rax
3559 ; AVX512DQ-NEXT:    .cfi_def_cfa_offset 16
3560 ; AVX512DQ-NEXT:    ## kill: def $ymm3 killed $ymm3 def $zmm3
3561 ; AVX512DQ-NEXT:    ## kill: def $ymm2 killed $ymm2 def $zmm2
3562 ; AVX512DQ-NEXT:    ## kill: def $ymm1 killed $ymm1 def $zmm1
3563 ; AVX512DQ-NEXT:    ## kill: def $ymm0 killed $ymm0 def $zmm0
3564 ; AVX512DQ-NEXT:    vptestnmd %zmm0, %zmm0, %k0
3565 ; AVX512DQ-NEXT:    vptestnmd %zmm1, %zmm1, %k1
3566 ; AVX512DQ-NEXT:    vptestnmd %zmm2, %zmm2, %k2
3567 ; AVX512DQ-NEXT:    vptestnmd %zmm3, %zmm3, %k3
3568 ; AVX512DQ-NEXT:    korb %k1, %k0, %k0
3569 ; AVX512DQ-NEXT:    korb %k3, %k2, %k1
3570 ; AVX512DQ-NEXT:    ktestb %k1, %k0
3571 ; AVX512DQ-NEXT:    je LBB71_1
3572 ; AVX512DQ-NEXT:  ## %bb.2: ## %exit
3573 ; AVX512DQ-NEXT:    popq %rax
3574 ; AVX512DQ-NEXT:    vzeroupper
3575 ; AVX512DQ-NEXT:    retq
3576 ; AVX512DQ-NEXT:  LBB71_1: ## %bar
3577 ; AVX512DQ-NEXT:    vzeroupper
3578 ; AVX512DQ-NEXT:    callq _foo
3579 ; AVX512DQ-NEXT:    popq %rax
3580 ; AVX512DQ-NEXT:    retq
3582 ; X86-LABEL: ktest_3:
3583 ; X86:       ## %bb.0:
3584 ; X86-NEXT:    subl $12, %esp
3585 ; X86-NEXT:    .cfi_def_cfa_offset 16
3586 ; X86-NEXT:    vptestnmd %ymm0, %ymm0, %k0
3587 ; X86-NEXT:    vptestnmd %ymm1, %ymm1, %k1
3588 ; X86-NEXT:    korb %k1, %k0, %k0
3589 ; X86-NEXT:    vptestnmd %ymm2, %ymm2, %k1
3590 ; X86-NEXT:    vptestnmd %ymm3, %ymm3, %k2
3591 ; X86-NEXT:    korb %k2, %k1, %k1
3592 ; X86-NEXT:    ktestb %k1, %k0
3593 ; X86-NEXT:    je LBB71_1
3594 ; X86-NEXT:  ## %bb.2: ## %exit
3595 ; X86-NEXT:    addl $12, %esp
3596 ; X86-NEXT:    vzeroupper
3597 ; X86-NEXT:    retl
3598 ; X86-NEXT:  LBB71_1: ## %bar
3599 ; X86-NEXT:    vzeroupper
3600 ; X86-NEXT:    calll _foo
3601 ; X86-NEXT:    addl $12, %esp
3602 ; X86-NEXT:    retl
3603   %a = icmp eq <8 x i32> %w, zeroinitializer
3604   %b = icmp eq <8 x i32> %x, zeroinitializer
3605   %c = icmp eq <8 x i32> %y, zeroinitializer
3606   %d = icmp eq <8 x i32> %z, zeroinitializer
3607   %e = or <8 x i1> %a, %b
3608   %f = or <8 x i1> %c, %d
3609   %g = and <8 x i1> %e, %f
3610   %h = bitcast <8 x i1> %g to i8
3611   %i = icmp eq i8 %h, 0
3612   br i1 %i, label %bar, label %exit
3614 bar:
3615   call void @foo()
3616   br label %exit
3618 exit:
3619   ret void
3622 define void @ktest_4(<8 x i64> %w, <8 x i64> %x, <8 x i64> %y, <8 x i64> %z) {
3623 ; KNL-LABEL: ktest_4:
3624 ; KNL:       ## %bb.0:
3625 ; KNL-NEXT:    pushq %rax
3626 ; KNL-NEXT:    .cfi_def_cfa_offset 16
3627 ; KNL-NEXT:    vptestnmq %zmm0, %zmm0, %k0
3628 ; KNL-NEXT:    vptestnmq %zmm1, %zmm1, %k1
3629 ; KNL-NEXT:    vptestnmq %zmm2, %zmm2, %k2
3630 ; KNL-NEXT:    vptestnmq %zmm3, %zmm3, %k3
3631 ; KNL-NEXT:    korw %k1, %k0, %k0
3632 ; KNL-NEXT:    korw %k3, %k2, %k1
3633 ; KNL-NEXT:    kandw %k1, %k0, %k0
3634 ; KNL-NEXT:    kmovw %k0, %eax
3635 ; KNL-NEXT:    testb %al, %al
3636 ; KNL-NEXT:    je LBB72_1
3637 ; KNL-NEXT:  ## %bb.2: ## %exit
3638 ; KNL-NEXT:    popq %rax
3639 ; KNL-NEXT:    vzeroupper
3640 ; KNL-NEXT:    retq
3641 ; KNL-NEXT:  LBB72_1: ## %bar
3642 ; KNL-NEXT:    vzeroupper
3643 ; KNL-NEXT:    callq _foo
3644 ; KNL-NEXT:    popq %rax
3645 ; KNL-NEXT:    retq
3647 ; SKX-LABEL: ktest_4:
3648 ; SKX:       ## %bb.0:
3649 ; SKX-NEXT:    pushq %rax
3650 ; SKX-NEXT:    .cfi_def_cfa_offset 16
3651 ; SKX-NEXT:    vptestnmq %zmm0, %zmm0, %k0
3652 ; SKX-NEXT:    vptestnmq %zmm1, %zmm1, %k1
3653 ; SKX-NEXT:    korb %k1, %k0, %k0
3654 ; SKX-NEXT:    vptestnmq %zmm2, %zmm2, %k1
3655 ; SKX-NEXT:    vptestnmq %zmm3, %zmm3, %k2
3656 ; SKX-NEXT:    korb %k2, %k1, %k1
3657 ; SKX-NEXT:    ktestb %k1, %k0
3658 ; SKX-NEXT:    je LBB72_1
3659 ; SKX-NEXT:  ## %bb.2: ## %exit
3660 ; SKX-NEXT:    popq %rax
3661 ; SKX-NEXT:    vzeroupper
3662 ; SKX-NEXT:    retq
3663 ; SKX-NEXT:  LBB72_1: ## %bar
3664 ; SKX-NEXT:    vzeroupper
3665 ; SKX-NEXT:    callq _foo
3666 ; SKX-NEXT:    popq %rax
3667 ; SKX-NEXT:    retq
3669 ; AVX512BW-LABEL: ktest_4:
3670 ; AVX512BW:       ## %bb.0:
3671 ; AVX512BW-NEXT:    pushq %rax
3672 ; AVX512BW-NEXT:    .cfi_def_cfa_offset 16
3673 ; AVX512BW-NEXT:    vptestnmq %zmm0, %zmm0, %k0
3674 ; AVX512BW-NEXT:    vptestnmq %zmm1, %zmm1, %k1
3675 ; AVX512BW-NEXT:    vptestnmq %zmm2, %zmm2, %k2
3676 ; AVX512BW-NEXT:    vptestnmq %zmm3, %zmm3, %k3
3677 ; AVX512BW-NEXT:    korw %k1, %k0, %k0
3678 ; AVX512BW-NEXT:    korw %k3, %k2, %k1
3679 ; AVX512BW-NEXT:    kandw %k1, %k0, %k0
3680 ; AVX512BW-NEXT:    kmovd %k0, %eax
3681 ; AVX512BW-NEXT:    testb %al, %al
3682 ; AVX512BW-NEXT:    je LBB72_1
3683 ; AVX512BW-NEXT:  ## %bb.2: ## %exit
3684 ; AVX512BW-NEXT:    popq %rax
3685 ; AVX512BW-NEXT:    vzeroupper
3686 ; AVX512BW-NEXT:    retq
3687 ; AVX512BW-NEXT:  LBB72_1: ## %bar
3688 ; AVX512BW-NEXT:    vzeroupper
3689 ; AVX512BW-NEXT:    callq _foo
3690 ; AVX512BW-NEXT:    popq %rax
3691 ; AVX512BW-NEXT:    retq
3693 ; AVX512DQ-LABEL: ktest_4:
3694 ; AVX512DQ:       ## %bb.0:
3695 ; AVX512DQ-NEXT:    pushq %rax
3696 ; AVX512DQ-NEXT:    .cfi_def_cfa_offset 16
3697 ; AVX512DQ-NEXT:    vptestnmq %zmm0, %zmm0, %k0
3698 ; AVX512DQ-NEXT:    vptestnmq %zmm1, %zmm1, %k1
3699 ; AVX512DQ-NEXT:    korb %k1, %k0, %k0
3700 ; AVX512DQ-NEXT:    vptestnmq %zmm2, %zmm2, %k1
3701 ; AVX512DQ-NEXT:    vptestnmq %zmm3, %zmm3, %k2
3702 ; AVX512DQ-NEXT:    korb %k2, %k1, %k1
3703 ; AVX512DQ-NEXT:    ktestb %k1, %k0
3704 ; AVX512DQ-NEXT:    je LBB72_1
3705 ; AVX512DQ-NEXT:  ## %bb.2: ## %exit
3706 ; AVX512DQ-NEXT:    popq %rax
3707 ; AVX512DQ-NEXT:    vzeroupper
3708 ; AVX512DQ-NEXT:    retq
3709 ; AVX512DQ-NEXT:  LBB72_1: ## %bar
3710 ; AVX512DQ-NEXT:    vzeroupper
3711 ; AVX512DQ-NEXT:    callq _foo
3712 ; AVX512DQ-NEXT:    popq %rax
3713 ; AVX512DQ-NEXT:    retq
3715 ; X86-LABEL: ktest_4:
3716 ; X86:       ## %bb.0:
3717 ; X86-NEXT:    subl $12, %esp
3718 ; X86-NEXT:    .cfi_def_cfa_offset 16
3719 ; X86-NEXT:    vptestnmq %zmm0, %zmm0, %k0
3720 ; X86-NEXT:    vptestnmq %zmm1, %zmm1, %k1
3721 ; X86-NEXT:    korb %k1, %k0, %k0
3722 ; X86-NEXT:    vptestnmq %zmm2, %zmm2, %k1
3723 ; X86-NEXT:    vptestnmq %zmm3, %zmm3, %k2
3724 ; X86-NEXT:    korb %k2, %k1, %k1
3725 ; X86-NEXT:    ktestb %k1, %k0
3726 ; X86-NEXT:    je LBB72_1
3727 ; X86-NEXT:  ## %bb.2: ## %exit
3728 ; X86-NEXT:    addl $12, %esp
3729 ; X86-NEXT:    vzeroupper
3730 ; X86-NEXT:    retl
3731 ; X86-NEXT:  LBB72_1: ## %bar
3732 ; X86-NEXT:    vzeroupper
3733 ; X86-NEXT:    calll _foo
3734 ; X86-NEXT:    addl $12, %esp
3735 ; X86-NEXT:    retl
3736   %a = icmp eq <8 x i64> %w, zeroinitializer
3737   %b = icmp eq <8 x i64> %x, zeroinitializer
3738   %c = icmp eq <8 x i64> %y, zeroinitializer
3739   %d = icmp eq <8 x i64> %z, zeroinitializer
3740   %e = or <8 x i1> %a, %b
3741   %f = or <8 x i1> %c, %d
3742   %g = and <8 x i1> %e, %f
3743   %h = bitcast <8 x i1> %g to i8
3744   %i = icmp eq i8 %h, 0
3745   br i1 %i, label %bar, label %exit
3747 bar:
3748   call void @foo()
3749   br label %exit
3751 exit:
3752   ret void
3755 define void @ktest_5(<16 x i32> %w, <16 x i32> %x, <16 x i32> %y, <16 x i32> %z) {
3756 ; KNL-LABEL: ktest_5:
3757 ; KNL:       ## %bb.0:
3758 ; KNL-NEXT:    pushq %rax
3759 ; KNL-NEXT:    .cfi_def_cfa_offset 16
3760 ; KNL-NEXT:    vptestnmd %zmm0, %zmm0, %k0
3761 ; KNL-NEXT:    vptestnmd %zmm1, %zmm1, %k1
3762 ; KNL-NEXT:    korw %k1, %k0, %k0
3763 ; KNL-NEXT:    vptestnmd %zmm2, %zmm2, %k1
3764 ; KNL-NEXT:    vptestnmd %zmm3, %zmm3, %k2
3765 ; KNL-NEXT:    korw %k2, %k1, %k1
3766 ; KNL-NEXT:    kandw %k1, %k0, %k0
3767 ; KNL-NEXT:    kortestw %k0, %k0
3768 ; KNL-NEXT:    je LBB73_1
3769 ; KNL-NEXT:  ## %bb.2: ## %exit
3770 ; KNL-NEXT:    popq %rax
3771 ; KNL-NEXT:    vzeroupper
3772 ; KNL-NEXT:    retq
3773 ; KNL-NEXT:  LBB73_1: ## %bar
3774 ; KNL-NEXT:    vzeroupper
3775 ; KNL-NEXT:    callq _foo
3776 ; KNL-NEXT:    popq %rax
3777 ; KNL-NEXT:    retq
3779 ; SKX-LABEL: ktest_5:
3780 ; SKX:       ## %bb.0:
3781 ; SKX-NEXT:    pushq %rax
3782 ; SKX-NEXT:    .cfi_def_cfa_offset 16
3783 ; SKX-NEXT:    vptestnmd %zmm0, %zmm0, %k0
3784 ; SKX-NEXT:    vptestnmd %zmm1, %zmm1, %k1
3785 ; SKX-NEXT:    korw %k1, %k0, %k0
3786 ; SKX-NEXT:    vptestnmd %zmm2, %zmm2, %k1
3787 ; SKX-NEXT:    vptestnmd %zmm3, %zmm3, %k2
3788 ; SKX-NEXT:    korw %k2, %k1, %k1
3789 ; SKX-NEXT:    ktestw %k1, %k0
3790 ; SKX-NEXT:    je LBB73_1
3791 ; SKX-NEXT:  ## %bb.2: ## %exit
3792 ; SKX-NEXT:    popq %rax
3793 ; SKX-NEXT:    vzeroupper
3794 ; SKX-NEXT:    retq
3795 ; SKX-NEXT:  LBB73_1: ## %bar
3796 ; SKX-NEXT:    vzeroupper
3797 ; SKX-NEXT:    callq _foo
3798 ; SKX-NEXT:    popq %rax
3799 ; SKX-NEXT:    retq
3801 ; AVX512BW-LABEL: ktest_5:
3802 ; AVX512BW:       ## %bb.0:
3803 ; AVX512BW-NEXT:    pushq %rax
3804 ; AVX512BW-NEXT:    .cfi_def_cfa_offset 16
3805 ; AVX512BW-NEXT:    vptestnmd %zmm0, %zmm0, %k0
3806 ; AVX512BW-NEXT:    vptestnmd %zmm1, %zmm1, %k1
3807 ; AVX512BW-NEXT:    korw %k1, %k0, %k0
3808 ; AVX512BW-NEXT:    vptestnmd %zmm2, %zmm2, %k1
3809 ; AVX512BW-NEXT:    vptestnmd %zmm3, %zmm3, %k2
3810 ; AVX512BW-NEXT:    korw %k2, %k1, %k1
3811 ; AVX512BW-NEXT:    kandw %k1, %k0, %k0
3812 ; AVX512BW-NEXT:    kortestw %k0, %k0
3813 ; AVX512BW-NEXT:    je LBB73_1
3814 ; AVX512BW-NEXT:  ## %bb.2: ## %exit
3815 ; AVX512BW-NEXT:    popq %rax
3816 ; AVX512BW-NEXT:    vzeroupper
3817 ; AVX512BW-NEXT:    retq
3818 ; AVX512BW-NEXT:  LBB73_1: ## %bar
3819 ; AVX512BW-NEXT:    vzeroupper
3820 ; AVX512BW-NEXT:    callq _foo
3821 ; AVX512BW-NEXT:    popq %rax
3822 ; AVX512BW-NEXT:    retq
3824 ; AVX512DQ-LABEL: ktest_5:
3825 ; AVX512DQ:       ## %bb.0:
3826 ; AVX512DQ-NEXT:    pushq %rax
3827 ; AVX512DQ-NEXT:    .cfi_def_cfa_offset 16
3828 ; AVX512DQ-NEXT:    vptestnmd %zmm0, %zmm0, %k0
3829 ; AVX512DQ-NEXT:    vptestnmd %zmm1, %zmm1, %k1
3830 ; AVX512DQ-NEXT:    korw %k1, %k0, %k0
3831 ; AVX512DQ-NEXT:    vptestnmd %zmm2, %zmm2, %k1
3832 ; AVX512DQ-NEXT:    vptestnmd %zmm3, %zmm3, %k2
3833 ; AVX512DQ-NEXT:    korw %k2, %k1, %k1
3834 ; AVX512DQ-NEXT:    ktestw %k1, %k0
3835 ; AVX512DQ-NEXT:    je LBB73_1
3836 ; AVX512DQ-NEXT:  ## %bb.2: ## %exit
3837 ; AVX512DQ-NEXT:    popq %rax
3838 ; AVX512DQ-NEXT:    vzeroupper
3839 ; AVX512DQ-NEXT:    retq
3840 ; AVX512DQ-NEXT:  LBB73_1: ## %bar
3841 ; AVX512DQ-NEXT:    vzeroupper
3842 ; AVX512DQ-NEXT:    callq _foo
3843 ; AVX512DQ-NEXT:    popq %rax
3844 ; AVX512DQ-NEXT:    retq
3846 ; X86-LABEL: ktest_5:
3847 ; X86:       ## %bb.0:
3848 ; X86-NEXT:    subl $12, %esp
3849 ; X86-NEXT:    .cfi_def_cfa_offset 16
3850 ; X86-NEXT:    vptestnmd %zmm0, %zmm0, %k0
3851 ; X86-NEXT:    vptestnmd %zmm1, %zmm1, %k1
3852 ; X86-NEXT:    korw %k1, %k0, %k0
3853 ; X86-NEXT:    vptestnmd %zmm2, %zmm2, %k1
3854 ; X86-NEXT:    vptestnmd %zmm3, %zmm3, %k2
3855 ; X86-NEXT:    korw %k2, %k1, %k1
3856 ; X86-NEXT:    ktestw %k1, %k0
3857 ; X86-NEXT:    je LBB73_1
3858 ; X86-NEXT:  ## %bb.2: ## %exit
3859 ; X86-NEXT:    addl $12, %esp
3860 ; X86-NEXT:    vzeroupper
3861 ; X86-NEXT:    retl
3862 ; X86-NEXT:  LBB73_1: ## %bar
3863 ; X86-NEXT:    vzeroupper
3864 ; X86-NEXT:    calll _foo
3865 ; X86-NEXT:    addl $12, %esp
3866 ; X86-NEXT:    retl
3867   %a = icmp eq <16 x i32> %w, zeroinitializer
3868   %b = icmp eq <16 x i32> %x, zeroinitializer
3869   %c = icmp eq <16 x i32> %y, zeroinitializer
3870   %d = icmp eq <16 x i32> %z, zeroinitializer
3871   %e = or <16 x i1> %a, %b
3872   %f = or <16 x i1> %c, %d
3873   %g = and <16 x i1> %e, %f
3874   %h = bitcast <16 x i1> %g to i16
3875   %i = icmp eq i16 %h, 0
3876   br i1 %i, label %bar, label %exit
3878 bar:
3879   call void @foo()
3880   br label %exit
3882 exit:
3883   ret void
3886 define void @ktest_6(<32 x i16> %w, <32 x i16> %x, <32 x i16> %y, <32 x i16> %z) {
3887 ; KNL-LABEL: ktest_6:
3888 ; KNL:       ## %bb.0:
3889 ; KNL-NEXT:    pushq %rax
3890 ; KNL-NEXT:    .cfi_def_cfa_offset 16
3891 ; KNL-NEXT:    vpxor %xmm8, %xmm8, %xmm8
3892 ; KNL-NEXT:    vpcmpeqw %ymm8, %ymm0, %ymm0
3893 ; KNL-NEXT:    vpcmpeqw %ymm8, %ymm1, %ymm1
3894 ; KNL-NEXT:    vpcmpeqw %ymm8, %ymm2, %ymm2
3895 ; KNL-NEXT:    vpor %ymm2, %ymm0, %ymm0
3896 ; KNL-NEXT:    vpcmpeqw %ymm8, %ymm3, %ymm2
3897 ; KNL-NEXT:    vpor %ymm2, %ymm1, %ymm1
3898 ; KNL-NEXT:    vpcmpeqw %ymm8, %ymm4, %ymm2
3899 ; KNL-NEXT:    vpcmpeqw %ymm8, %ymm5, %ymm3
3900 ; KNL-NEXT:    vpcmpeqw %ymm8, %ymm6, %ymm4
3901 ; KNL-NEXT:    vpor %ymm4, %ymm2, %ymm2
3902 ; KNL-NEXT:    vpand %ymm2, %ymm0, %ymm0
3903 ; KNL-NEXT:    vpcmpeqw %ymm8, %ymm7, %ymm2
3904 ; KNL-NEXT:    vpor %ymm2, %ymm3, %ymm2
3905 ; KNL-NEXT:    vpand %ymm2, %ymm1, %ymm1
3906 ; KNL-NEXT:    vpmovsxwd %ymm0, %zmm0
3907 ; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k0
3908 ; KNL-NEXT:    kmovw %k0, %eax
3909 ; KNL-NEXT:    vpmovsxwd %ymm1, %zmm0
3910 ; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k0
3911 ; KNL-NEXT:    kmovw %k0, %ecx
3912 ; KNL-NEXT:    shll $16, %ecx
3913 ; KNL-NEXT:    orl %eax, %ecx
3914 ; KNL-NEXT:    je LBB74_1
3915 ; KNL-NEXT:  ## %bb.2: ## %exit
3916 ; KNL-NEXT:    popq %rax
3917 ; KNL-NEXT:    vzeroupper
3918 ; KNL-NEXT:    retq
3919 ; KNL-NEXT:  LBB74_1: ## %bar
3920 ; KNL-NEXT:    vzeroupper
3921 ; KNL-NEXT:    callq _foo
3922 ; KNL-NEXT:    popq %rax
3923 ; KNL-NEXT:    retq
3925 ; SKX-LABEL: ktest_6:
3926 ; SKX:       ## %bb.0:
3927 ; SKX-NEXT:    pushq %rax
3928 ; SKX-NEXT:    .cfi_def_cfa_offset 16
3929 ; SKX-NEXT:    vptestnmw %zmm0, %zmm0, %k0
3930 ; SKX-NEXT:    vptestnmw %zmm1, %zmm1, %k1
3931 ; SKX-NEXT:    kord %k1, %k0, %k0
3932 ; SKX-NEXT:    vptestnmw %zmm2, %zmm2, %k1
3933 ; SKX-NEXT:    vptestnmw %zmm3, %zmm3, %k2
3934 ; SKX-NEXT:    kord %k2, %k1, %k1
3935 ; SKX-NEXT:    ktestd %k1, %k0
3936 ; SKX-NEXT:    je LBB74_1
3937 ; SKX-NEXT:  ## %bb.2: ## %exit
3938 ; SKX-NEXT:    popq %rax
3939 ; SKX-NEXT:    vzeroupper
3940 ; SKX-NEXT:    retq
3941 ; SKX-NEXT:  LBB74_1: ## %bar
3942 ; SKX-NEXT:    vzeroupper
3943 ; SKX-NEXT:    callq _foo
3944 ; SKX-NEXT:    popq %rax
3945 ; SKX-NEXT:    retq
3947 ; AVX512BW-LABEL: ktest_6:
3948 ; AVX512BW:       ## %bb.0:
3949 ; AVX512BW-NEXT:    pushq %rax
3950 ; AVX512BW-NEXT:    .cfi_def_cfa_offset 16
3951 ; AVX512BW-NEXT:    vptestnmw %zmm0, %zmm0, %k0
3952 ; AVX512BW-NEXT:    vptestnmw %zmm1, %zmm1, %k1
3953 ; AVX512BW-NEXT:    kord %k1, %k0, %k0
3954 ; AVX512BW-NEXT:    vptestnmw %zmm2, %zmm2, %k1
3955 ; AVX512BW-NEXT:    vptestnmw %zmm3, %zmm3, %k2
3956 ; AVX512BW-NEXT:    kord %k2, %k1, %k1
3957 ; AVX512BW-NEXT:    ktestd %k1, %k0
3958 ; AVX512BW-NEXT:    je LBB74_1
3959 ; AVX512BW-NEXT:  ## %bb.2: ## %exit
3960 ; AVX512BW-NEXT:    popq %rax
3961 ; AVX512BW-NEXT:    vzeroupper
3962 ; AVX512BW-NEXT:    retq
3963 ; AVX512BW-NEXT:  LBB74_1: ## %bar
3964 ; AVX512BW-NEXT:    vzeroupper
3965 ; AVX512BW-NEXT:    callq _foo
3966 ; AVX512BW-NEXT:    popq %rax
3967 ; AVX512BW-NEXT:    retq
3969 ; AVX512DQ-LABEL: ktest_6:
3970 ; AVX512DQ:       ## %bb.0:
3971 ; AVX512DQ-NEXT:    pushq %rax
3972 ; AVX512DQ-NEXT:    .cfi_def_cfa_offset 16
3973 ; AVX512DQ-NEXT:    vpxor %xmm8, %xmm8, %xmm8
3974 ; AVX512DQ-NEXT:    vpcmpeqw %ymm8, %ymm0, %ymm0
3975 ; AVX512DQ-NEXT:    vpcmpeqw %ymm8, %ymm1, %ymm1
3976 ; AVX512DQ-NEXT:    vpcmpeqw %ymm8, %ymm2, %ymm2
3977 ; AVX512DQ-NEXT:    vpor %ymm2, %ymm0, %ymm0
3978 ; AVX512DQ-NEXT:    vpcmpeqw %ymm8, %ymm3, %ymm2
3979 ; AVX512DQ-NEXT:    vpor %ymm2, %ymm1, %ymm1
3980 ; AVX512DQ-NEXT:    vpcmpeqw %ymm8, %ymm4, %ymm2
3981 ; AVX512DQ-NEXT:    vpcmpeqw %ymm8, %ymm5, %ymm3
3982 ; AVX512DQ-NEXT:    vpcmpeqw %ymm8, %ymm6, %ymm4
3983 ; AVX512DQ-NEXT:    vpor %ymm4, %ymm2, %ymm2
3984 ; AVX512DQ-NEXT:    vpand %ymm2, %ymm0, %ymm0
3985 ; AVX512DQ-NEXT:    vpcmpeqw %ymm8, %ymm7, %ymm2
3986 ; AVX512DQ-NEXT:    vpor %ymm2, %ymm3, %ymm2
3987 ; AVX512DQ-NEXT:    vpand %ymm2, %ymm1, %ymm1
3988 ; AVX512DQ-NEXT:    vpmovsxwd %ymm0, %zmm0
3989 ; AVX512DQ-NEXT:    vpmovd2m %zmm0, %k0
3990 ; AVX512DQ-NEXT:    kmovw %k0, %eax
3991 ; AVX512DQ-NEXT:    vpmovsxwd %ymm1, %zmm0
3992 ; AVX512DQ-NEXT:    vpmovd2m %zmm0, %k0
3993 ; AVX512DQ-NEXT:    kmovw %k0, %ecx
3994 ; AVX512DQ-NEXT:    shll $16, %ecx
3995 ; AVX512DQ-NEXT:    orl %eax, %ecx
3996 ; AVX512DQ-NEXT:    je LBB74_1
3997 ; AVX512DQ-NEXT:  ## %bb.2: ## %exit
3998 ; AVX512DQ-NEXT:    popq %rax
3999 ; AVX512DQ-NEXT:    vzeroupper
4000 ; AVX512DQ-NEXT:    retq
4001 ; AVX512DQ-NEXT:  LBB74_1: ## %bar
4002 ; AVX512DQ-NEXT:    vzeroupper
4003 ; AVX512DQ-NEXT:    callq _foo
4004 ; AVX512DQ-NEXT:    popq %rax
4005 ; AVX512DQ-NEXT:    retq
4007 ; X86-LABEL: ktest_6:
4008 ; X86:       ## %bb.0:
4009 ; X86-NEXT:    subl $12, %esp
4010 ; X86-NEXT:    .cfi_def_cfa_offset 16
4011 ; X86-NEXT:    vptestnmw %zmm0, %zmm0, %k0
4012 ; X86-NEXT:    vptestnmw %zmm1, %zmm1, %k1
4013 ; X86-NEXT:    kord %k1, %k0, %k0
4014 ; X86-NEXT:    vptestnmw %zmm2, %zmm2, %k1
4015 ; X86-NEXT:    vptestnmw %zmm3, %zmm3, %k2
4016 ; X86-NEXT:    kord %k2, %k1, %k1
4017 ; X86-NEXT:    ktestd %k1, %k0
4018 ; X86-NEXT:    je LBB74_1
4019 ; X86-NEXT:  ## %bb.2: ## %exit
4020 ; X86-NEXT:    addl $12, %esp
4021 ; X86-NEXT:    vzeroupper
4022 ; X86-NEXT:    retl
4023 ; X86-NEXT:  LBB74_1: ## %bar
4024 ; X86-NEXT:    vzeroupper
4025 ; X86-NEXT:    calll _foo
4026 ; X86-NEXT:    addl $12, %esp
4027 ; X86-NEXT:    retl
4028   %a = icmp eq <32 x i16> %w, zeroinitializer
4029   %b = icmp eq <32 x i16> %x, zeroinitializer
4030   %c = icmp eq <32 x i16> %y, zeroinitializer
4031   %d = icmp eq <32 x i16> %z, zeroinitializer
4032   %e = or <32 x i1> %a, %b
4033   %f = or <32 x i1> %c, %d
4034   %g = and <32 x i1> %e, %f
4035   %h = bitcast <32 x i1> %g to i32
4036   %i = icmp eq i32 %h, 0
4037   br i1 %i, label %bar, label %exit
4039 bar:
4040   call void @foo()
4041   br label %exit
4043 exit:
4044   ret void
4047 define void @ktest_7(<64 x i8> %w, <64 x i8> %x, <64 x i8> %y, <64 x i8> %z) {
4048 ; KNL-LABEL: ktest_7:
4049 ; KNL:       ## %bb.0:
4050 ; KNL-NEXT:    pushq %rax
4051 ; KNL-NEXT:    .cfi_def_cfa_offset 16
4052 ; KNL-NEXT:    vpxor %xmm8, %xmm8, %xmm8
4053 ; KNL-NEXT:    vpcmpeqb %ymm8, %ymm0, %ymm9
4054 ; KNL-NEXT:    vextracti128 $1, %ymm9, %xmm0
4055 ; KNL-NEXT:    vpcmpeqb %ymm8, %ymm1, %ymm10
4056 ; KNL-NEXT:    vextracti128 $1, %ymm10, %xmm1
4057 ; KNL-NEXT:    vpcmpeqb %ymm8, %ymm2, %ymm11
4058 ; KNL-NEXT:    vextracti128 $1, %ymm11, %xmm2
4059 ; KNL-NEXT:    vpor %xmm2, %xmm0, %xmm13
4060 ; KNL-NEXT:    vpcmpeqb %ymm8, %ymm3, %ymm2
4061 ; KNL-NEXT:    vextracti128 $1, %ymm2, %xmm3
4062 ; KNL-NEXT:    vpor %xmm3, %xmm1, %xmm12
4063 ; KNL-NEXT:    vpcmpeqb %ymm8, %ymm4, %ymm3
4064 ; KNL-NEXT:    vextracti128 $1, %ymm3, %xmm4
4065 ; KNL-NEXT:    vpcmpeqb %ymm8, %ymm5, %ymm5
4066 ; KNL-NEXT:    vextracti128 $1, %ymm5, %xmm1
4067 ; KNL-NEXT:    vpcmpeqb %ymm8, %ymm6, %ymm6
4068 ; KNL-NEXT:    vextracti128 $1, %ymm6, %xmm0
4069 ; KNL-NEXT:    vpor %xmm0, %xmm4, %xmm0
4070 ; KNL-NEXT:    vpand %xmm0, %xmm13, %xmm0
4071 ; KNL-NEXT:    vpcmpeqb %ymm8, %ymm7, %ymm4
4072 ; KNL-NEXT:    vextracti128 $1, %ymm4, %xmm7
4073 ; KNL-NEXT:    vpor %xmm7, %xmm1, %xmm1
4074 ; KNL-NEXT:    vpand %xmm1, %xmm12, %xmm1
4075 ; KNL-NEXT:    vpor %xmm2, %xmm10, %xmm2
4076 ; KNL-NEXT:    vpor %xmm11, %xmm9, %xmm7
4077 ; KNL-NEXT:    vpor %xmm4, %xmm5, %xmm4
4078 ; KNL-NEXT:    vpand %xmm4, %xmm2, %xmm2
4079 ; KNL-NEXT:    vpor %xmm6, %xmm3, %xmm3
4080 ; KNL-NEXT:    vpand %xmm3, %xmm7, %xmm3
4081 ; KNL-NEXT:    vpmovsxbd %xmm3, %zmm3
4082 ; KNL-NEXT:    vptestmd %zmm3, %zmm3, %k0
4083 ; KNL-NEXT:    kmovw %k0, %eax
4084 ; KNL-NEXT:    vpmovsxbd %xmm0, %zmm0
4085 ; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k0
4086 ; KNL-NEXT:    kmovw %k0, %ecx
4087 ; KNL-NEXT:    shll $16, %ecx
4088 ; KNL-NEXT:    orl %eax, %ecx
4089 ; KNL-NEXT:    vpmovsxbd %xmm2, %zmm0
4090 ; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k0
4091 ; KNL-NEXT:    kmovw %k0, %eax
4092 ; KNL-NEXT:    vpmovsxbd %xmm1, %zmm0
4093 ; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k0
4094 ; KNL-NEXT:    kmovw %k0, %edx
4095 ; KNL-NEXT:    shll $16, %edx
4096 ; KNL-NEXT:    orl %eax, %edx
4097 ; KNL-NEXT:    shlq $32, %rdx
4098 ; KNL-NEXT:    orq %rcx, %rdx
4099 ; KNL-NEXT:    je LBB75_1
4100 ; KNL-NEXT:  ## %bb.2: ## %exit
4101 ; KNL-NEXT:    popq %rax
4102 ; KNL-NEXT:    vzeroupper
4103 ; KNL-NEXT:    retq
4104 ; KNL-NEXT:  LBB75_1: ## %bar
4105 ; KNL-NEXT:    vzeroupper
4106 ; KNL-NEXT:    callq _foo
4107 ; KNL-NEXT:    popq %rax
4108 ; KNL-NEXT:    retq
4110 ; SKX-LABEL: ktest_7:
4111 ; SKX:       ## %bb.0:
4112 ; SKX-NEXT:    pushq %rax
4113 ; SKX-NEXT:    .cfi_def_cfa_offset 16
4114 ; SKX-NEXT:    vptestnmb %zmm0, %zmm0, %k0
4115 ; SKX-NEXT:    vptestnmb %zmm1, %zmm1, %k1
4116 ; SKX-NEXT:    korq %k1, %k0, %k0
4117 ; SKX-NEXT:    vptestnmb %zmm2, %zmm2, %k1
4118 ; SKX-NEXT:    vptestnmb %zmm3, %zmm3, %k2
4119 ; SKX-NEXT:    korq %k2, %k1, %k1
4120 ; SKX-NEXT:    ktestq %k1, %k0
4121 ; SKX-NEXT:    je LBB75_1
4122 ; SKX-NEXT:  ## %bb.2: ## %exit
4123 ; SKX-NEXT:    popq %rax
4124 ; SKX-NEXT:    vzeroupper
4125 ; SKX-NEXT:    retq
4126 ; SKX-NEXT:  LBB75_1: ## %bar
4127 ; SKX-NEXT:    vzeroupper
4128 ; SKX-NEXT:    callq _foo
4129 ; SKX-NEXT:    popq %rax
4130 ; SKX-NEXT:    retq
4132 ; AVX512BW-LABEL: ktest_7:
4133 ; AVX512BW:       ## %bb.0:
4134 ; AVX512BW-NEXT:    pushq %rax
4135 ; AVX512BW-NEXT:    .cfi_def_cfa_offset 16
4136 ; AVX512BW-NEXT:    vptestnmb %zmm0, %zmm0, %k0
4137 ; AVX512BW-NEXT:    vptestnmb %zmm1, %zmm1, %k1
4138 ; AVX512BW-NEXT:    korq %k1, %k0, %k0
4139 ; AVX512BW-NEXT:    vptestnmb %zmm2, %zmm2, %k1
4140 ; AVX512BW-NEXT:    vptestnmb %zmm3, %zmm3, %k2
4141 ; AVX512BW-NEXT:    korq %k2, %k1, %k1
4142 ; AVX512BW-NEXT:    ktestq %k1, %k0
4143 ; AVX512BW-NEXT:    je LBB75_1
4144 ; AVX512BW-NEXT:  ## %bb.2: ## %exit
4145 ; AVX512BW-NEXT:    popq %rax
4146 ; AVX512BW-NEXT:    vzeroupper
4147 ; AVX512BW-NEXT:    retq
4148 ; AVX512BW-NEXT:  LBB75_1: ## %bar
4149 ; AVX512BW-NEXT:    vzeroupper
4150 ; AVX512BW-NEXT:    callq _foo
4151 ; AVX512BW-NEXT:    popq %rax
4152 ; AVX512BW-NEXT:    retq
4154 ; AVX512DQ-LABEL: ktest_7:
4155 ; AVX512DQ:       ## %bb.0:
4156 ; AVX512DQ-NEXT:    pushq %rax
4157 ; AVX512DQ-NEXT:    .cfi_def_cfa_offset 16
4158 ; AVX512DQ-NEXT:    vpxor %xmm8, %xmm8, %xmm8
4159 ; AVX512DQ-NEXT:    vpcmpeqb %ymm8, %ymm0, %ymm9
4160 ; AVX512DQ-NEXT:    vextracti128 $1, %ymm9, %xmm0
4161 ; AVX512DQ-NEXT:    vpcmpeqb %ymm8, %ymm1, %ymm10
4162 ; AVX512DQ-NEXT:    vextracti128 $1, %ymm10, %xmm1
4163 ; AVX512DQ-NEXT:    vpcmpeqb %ymm8, %ymm2, %ymm11
4164 ; AVX512DQ-NEXT:    vextracti128 $1, %ymm11, %xmm2
4165 ; AVX512DQ-NEXT:    vpor %xmm2, %xmm0, %xmm13
4166 ; AVX512DQ-NEXT:    vpcmpeqb %ymm8, %ymm3, %ymm2
4167 ; AVX512DQ-NEXT:    vextracti128 $1, %ymm2, %xmm3
4168 ; AVX512DQ-NEXT:    vpor %xmm3, %xmm1, %xmm12
4169 ; AVX512DQ-NEXT:    vpcmpeqb %ymm8, %ymm4, %ymm3
4170 ; AVX512DQ-NEXT:    vextracti128 $1, %ymm3, %xmm4
4171 ; AVX512DQ-NEXT:    vpcmpeqb %ymm8, %ymm5, %ymm5
4172 ; AVX512DQ-NEXT:    vextracti128 $1, %ymm5, %xmm1
4173 ; AVX512DQ-NEXT:    vpcmpeqb %ymm8, %ymm6, %ymm6
4174 ; AVX512DQ-NEXT:    vextracti128 $1, %ymm6, %xmm0
4175 ; AVX512DQ-NEXT:    vpor %xmm0, %xmm4, %xmm0
4176 ; AVX512DQ-NEXT:    vpand %xmm0, %xmm13, %xmm0
4177 ; AVX512DQ-NEXT:    vpcmpeqb %ymm8, %ymm7, %ymm4
4178 ; AVX512DQ-NEXT:    vextracti128 $1, %ymm4, %xmm7
4179 ; AVX512DQ-NEXT:    vpor %xmm7, %xmm1, %xmm1
4180 ; AVX512DQ-NEXT:    vpand %xmm1, %xmm12, %xmm1
4181 ; AVX512DQ-NEXT:    vpor %xmm2, %xmm10, %xmm2
4182 ; AVX512DQ-NEXT:    vpor %xmm11, %xmm9, %xmm7
4183 ; AVX512DQ-NEXT:    vpor %xmm4, %xmm5, %xmm4
4184 ; AVX512DQ-NEXT:    vpand %xmm4, %xmm2, %xmm2
4185 ; AVX512DQ-NEXT:    vpor %xmm6, %xmm3, %xmm3
4186 ; AVX512DQ-NEXT:    vpand %xmm3, %xmm7, %xmm3
4187 ; AVX512DQ-NEXT:    vpmovsxbd %xmm3, %zmm3
4188 ; AVX512DQ-NEXT:    vpmovd2m %zmm3, %k0
4189 ; AVX512DQ-NEXT:    kmovw %k0, %eax
4190 ; AVX512DQ-NEXT:    vpmovsxbd %xmm0, %zmm0
4191 ; AVX512DQ-NEXT:    vpmovd2m %zmm0, %k0
4192 ; AVX512DQ-NEXT:    kmovw %k0, %ecx
4193 ; AVX512DQ-NEXT:    shll $16, %ecx
4194 ; AVX512DQ-NEXT:    orl %eax, %ecx
4195 ; AVX512DQ-NEXT:    vpmovsxbd %xmm2, %zmm0
4196 ; AVX512DQ-NEXT:    vpmovd2m %zmm0, %k0
4197 ; AVX512DQ-NEXT:    kmovw %k0, %eax
4198 ; AVX512DQ-NEXT:    vpmovsxbd %xmm1, %zmm0
4199 ; AVX512DQ-NEXT:    vpmovd2m %zmm0, %k0
4200 ; AVX512DQ-NEXT:    kmovw %k0, %edx
4201 ; AVX512DQ-NEXT:    shll $16, %edx
4202 ; AVX512DQ-NEXT:    orl %eax, %edx
4203 ; AVX512DQ-NEXT:    shlq $32, %rdx
4204 ; AVX512DQ-NEXT:    orq %rcx, %rdx
4205 ; AVX512DQ-NEXT:    je LBB75_1
4206 ; AVX512DQ-NEXT:  ## %bb.2: ## %exit
4207 ; AVX512DQ-NEXT:    popq %rax
4208 ; AVX512DQ-NEXT:    vzeroupper
4209 ; AVX512DQ-NEXT:    retq
4210 ; AVX512DQ-NEXT:  LBB75_1: ## %bar
4211 ; AVX512DQ-NEXT:    vzeroupper
4212 ; AVX512DQ-NEXT:    callq _foo
4213 ; AVX512DQ-NEXT:    popq %rax
4214 ; AVX512DQ-NEXT:    retq
4216 ; X86-LABEL: ktest_7:
4217 ; X86:       ## %bb.0:
4218 ; X86-NEXT:    subl $12, %esp
4219 ; X86-NEXT:    .cfi_def_cfa_offset 16
4220 ; X86-NEXT:    vptestnmb %zmm0, %zmm0, %k0
4221 ; X86-NEXT:    vptestnmb %zmm1, %zmm1, %k1
4222 ; X86-NEXT:    korq %k1, %k0, %k0
4223 ; X86-NEXT:    vptestnmb %zmm2, %zmm2, %k1
4224 ; X86-NEXT:    vptestnmb %zmm3, %zmm3, %k2
4225 ; X86-NEXT:    korq %k2, %k1, %k1
4226 ; X86-NEXT:    kandq %k1, %k0, %k0
4227 ; X86-NEXT:    kshiftrq $32, %k0, %k1
4228 ; X86-NEXT:    kortestd %k1, %k0
4229 ; X86-NEXT:    je LBB75_1
4230 ; X86-NEXT:  ## %bb.2: ## %exit
4231 ; X86-NEXT:    addl $12, %esp
4232 ; X86-NEXT:    vzeroupper
4233 ; X86-NEXT:    retl
4234 ; X86-NEXT:  LBB75_1: ## %bar
4235 ; X86-NEXT:    vzeroupper
4236 ; X86-NEXT:    calll _foo
4237 ; X86-NEXT:    addl $12, %esp
4238 ; X86-NEXT:    retl
4239   %a = icmp eq <64 x i8> %w, zeroinitializer
4240   %b = icmp eq <64 x i8> %x, zeroinitializer
4241   %c = icmp eq <64 x i8> %y, zeroinitializer
4242   %d = icmp eq <64 x i8> %z, zeroinitializer
4243   %e = or <64 x i1> %a, %b
4244   %f = or <64 x i1> %c, %d
4245   %g = and <64 x i1> %e, %f
4246   %h = bitcast <64 x i1> %g to i64
4247   %i = icmp eq i64 %h, 0
4248   br i1 %i, label %bar, label %exit
4250 bar:
4251   call void @foo()
4252   br label %exit
4254 exit:
4255   ret void