1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2,-avx | FileCheck %s --check-prefix=SSE2
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1,-avx | FileCheck %s --check-prefix=SSE41
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx,-avx2 | FileCheck %s --check-prefixes=AVX,AVX1
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vl,+avx512dq,+avx512bw | FileCheck %s --check-prefixes=AVX,AVX512
7 define i32 @veccond128(<4 x i32> %input) {
8 ; SSE2-LABEL: veccond128:
9 ; SSE2: # %bb.0: # %entry
10 ; SSE2-NEXT: pxor %xmm1, %xmm1
11 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
12 ; SSE2-NEXT: movmskps %xmm1, %eax
13 ; SSE2-NEXT: xorl $15, %eax
14 ; SSE2-NEXT: je .LBB0_2
15 ; SSE2-NEXT: # %bb.1: # %if-true-block
16 ; SSE2-NEXT: xorl %eax, %eax
18 ; SSE2-NEXT: .LBB0_2: # %endif-block
19 ; SSE2-NEXT: movl $1, %eax
22 ; SSE41-LABEL: veccond128:
23 ; SSE41: # %bb.0: # %entry
24 ; SSE41-NEXT: ptest %xmm0, %xmm0
25 ; SSE41-NEXT: je .LBB0_2
26 ; SSE41-NEXT: # %bb.1: # %if-true-block
27 ; SSE41-NEXT: xorl %eax, %eax
29 ; SSE41-NEXT: .LBB0_2: # %endif-block
30 ; SSE41-NEXT: movl $1, %eax
33 ; AVX-LABEL: veccond128:
34 ; AVX: # %bb.0: # %entry
35 ; AVX-NEXT: vptest %xmm0, %xmm0
36 ; AVX-NEXT: je .LBB0_2
37 ; AVX-NEXT: # %bb.1: # %if-true-block
38 ; AVX-NEXT: xorl %eax, %eax
40 ; AVX-NEXT: .LBB0_2: # %endif-block
41 ; AVX-NEXT: movl $1, %eax
44 %0 = bitcast <4 x i32> %input to i128
45 %1 = icmp ne i128 %0, 0
46 br i1 %1, label %if-true-block, label %endif-block
53 define i32 @veccond256(<8 x i32> %input) {
54 ; SSE2-LABEL: veccond256:
55 ; SSE2: # %bb.0: # %entry
56 ; SSE2-NEXT: por %xmm1, %xmm0
57 ; SSE2-NEXT: pxor %xmm1, %xmm1
58 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
59 ; SSE2-NEXT: movmskps %xmm1, %eax
60 ; SSE2-NEXT: xorl $15, %eax
61 ; SSE2-NEXT: je .LBB1_2
62 ; SSE2-NEXT: # %bb.1: # %if-true-block
63 ; SSE2-NEXT: xorl %eax, %eax
65 ; SSE2-NEXT: .LBB1_2: # %endif-block
66 ; SSE2-NEXT: movl $1, %eax
69 ; SSE41-LABEL: veccond256:
70 ; SSE41: # %bb.0: # %entry
71 ; SSE41-NEXT: por %xmm1, %xmm0
72 ; SSE41-NEXT: ptest %xmm0, %xmm0
73 ; SSE41-NEXT: je .LBB1_2
74 ; SSE41-NEXT: # %bb.1: # %if-true-block
75 ; SSE41-NEXT: xorl %eax, %eax
77 ; SSE41-NEXT: .LBB1_2: # %endif-block
78 ; SSE41-NEXT: movl $1, %eax
81 ; AVX-LABEL: veccond256:
82 ; AVX: # %bb.0: # %entry
83 ; AVX-NEXT: vptest %ymm0, %ymm0
84 ; AVX-NEXT: je .LBB1_2
85 ; AVX-NEXT: # %bb.1: # %if-true-block
86 ; AVX-NEXT: xorl %eax, %eax
87 ; AVX-NEXT: vzeroupper
89 ; AVX-NEXT: .LBB1_2: # %endif-block
90 ; AVX-NEXT: movl $1, %eax
91 ; AVX-NEXT: vzeroupper
94 %0 = bitcast <8 x i32> %input to i256
95 %1 = icmp ne i256 %0, 0
96 br i1 %1, label %if-true-block, label %endif-block
103 define i32 @veccond512(<16 x i32> %input) {
104 ; SSE2-LABEL: veccond512:
105 ; SSE2: # %bb.0: # %entry
106 ; SSE2-NEXT: por %xmm3, %xmm1
107 ; SSE2-NEXT: por %xmm2, %xmm0
108 ; SSE2-NEXT: por %xmm1, %xmm0
109 ; SSE2-NEXT: pxor %xmm1, %xmm1
110 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
111 ; SSE2-NEXT: movmskps %xmm1, %eax
112 ; SSE2-NEXT: xorl $15, %eax
113 ; SSE2-NEXT: je .LBB2_2
114 ; SSE2-NEXT: # %bb.1: # %if-true-block
115 ; SSE2-NEXT: xorl %eax, %eax
117 ; SSE2-NEXT: .LBB2_2: # %endif-block
118 ; SSE2-NEXT: movl $1, %eax
121 ; SSE41-LABEL: veccond512:
122 ; SSE41: # %bb.0: # %entry
123 ; SSE41-NEXT: por %xmm3, %xmm1
124 ; SSE41-NEXT: por %xmm2, %xmm0
125 ; SSE41-NEXT: por %xmm1, %xmm0
126 ; SSE41-NEXT: ptest %xmm0, %xmm0
127 ; SSE41-NEXT: je .LBB2_2
128 ; SSE41-NEXT: # %bb.1: # %if-true-block
129 ; SSE41-NEXT: xorl %eax, %eax
131 ; SSE41-NEXT: .LBB2_2: # %endif-block
132 ; SSE41-NEXT: movl $1, %eax
135 ; AVX1-LABEL: veccond512:
136 ; AVX1: # %bb.0: # %entry
137 ; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
138 ; AVX1-NEXT: vptest %ymm0, %ymm0
139 ; AVX1-NEXT: je .LBB2_2
140 ; AVX1-NEXT: # %bb.1: # %if-true-block
141 ; AVX1-NEXT: xorl %eax, %eax
142 ; AVX1-NEXT: vzeroupper
144 ; AVX1-NEXT: .LBB2_2: # %endif-block
145 ; AVX1-NEXT: movl $1, %eax
146 ; AVX1-NEXT: vzeroupper
149 ; AVX512-LABEL: veccond512:
150 ; AVX512: # %bb.0: # %entry
151 ; AVX512-NEXT: vptestmd %zmm0, %zmm0, %k0
152 ; AVX512-NEXT: kortestw %k0, %k0
153 ; AVX512-NEXT: je .LBB2_2
154 ; AVX512-NEXT: # %bb.1: # %if-true-block
155 ; AVX512-NEXT: xorl %eax, %eax
156 ; AVX512-NEXT: vzeroupper
158 ; AVX512-NEXT: .LBB2_2: # %endif-block
159 ; AVX512-NEXT: movl $1, %eax
160 ; AVX512-NEXT: vzeroupper
163 %0 = bitcast <16 x i32> %input to i512
164 %1 = icmp ne i512 %0, 0
165 br i1 %1, label %if-true-block, label %endif-block
172 define i32 @vectest128(<4 x i32> %input) {
173 ; SSE2-LABEL: vectest128:
175 ; SSE2-NEXT: pxor %xmm1, %xmm1
176 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
177 ; SSE2-NEXT: movmskps %xmm1, %ecx
178 ; SSE2-NEXT: xorl %eax, %eax
179 ; SSE2-NEXT: xorl $15, %ecx
180 ; SSE2-NEXT: setne %al
183 ; SSE41-LABEL: vectest128:
185 ; SSE41-NEXT: xorl %eax, %eax
186 ; SSE41-NEXT: ptest %xmm0, %xmm0
187 ; SSE41-NEXT: setne %al
190 ; AVX-LABEL: vectest128:
192 ; AVX-NEXT: xorl %eax, %eax
193 ; AVX-NEXT: vptest %xmm0, %xmm0
194 ; AVX-NEXT: setne %al
196 %t0 = bitcast <4 x i32> %input to i128
197 %t1 = icmp ne i128 %t0, 0
198 %t2 = zext i1 %t1 to i32
202 define i32 @vectest256(<8 x i32> %input) {
203 ; SSE2-LABEL: vectest256:
205 ; SSE2-NEXT: por %xmm1, %xmm0
206 ; SSE2-NEXT: pxor %xmm1, %xmm1
207 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
208 ; SSE2-NEXT: movmskps %xmm1, %ecx
209 ; SSE2-NEXT: xorl %eax, %eax
210 ; SSE2-NEXT: xorl $15, %ecx
211 ; SSE2-NEXT: setne %al
214 ; SSE41-LABEL: vectest256:
216 ; SSE41-NEXT: por %xmm1, %xmm0
217 ; SSE41-NEXT: xorl %eax, %eax
218 ; SSE41-NEXT: ptest %xmm0, %xmm0
219 ; SSE41-NEXT: setne %al
222 ; AVX-LABEL: vectest256:
224 ; AVX-NEXT: xorl %eax, %eax
225 ; AVX-NEXT: vptest %ymm0, %ymm0
226 ; AVX-NEXT: setne %al
227 ; AVX-NEXT: vzeroupper
229 %t0 = bitcast <8 x i32> %input to i256
230 %t1 = icmp ne i256 %t0, 0
231 %t2 = zext i1 %t1 to i32
235 define i32 @vectest512(<16 x i32> %input) {
236 ; SSE2-LABEL: vectest512:
238 ; SSE2-NEXT: por %xmm3, %xmm1
239 ; SSE2-NEXT: por %xmm2, %xmm0
240 ; SSE2-NEXT: por %xmm1, %xmm0
241 ; SSE2-NEXT: pxor %xmm1, %xmm1
242 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
243 ; SSE2-NEXT: movmskps %xmm1, %ecx
244 ; SSE2-NEXT: xorl %eax, %eax
245 ; SSE2-NEXT: xorl $15, %ecx
246 ; SSE2-NEXT: setne %al
249 ; SSE41-LABEL: vectest512:
251 ; SSE41-NEXT: por %xmm3, %xmm1
252 ; SSE41-NEXT: por %xmm2, %xmm0
253 ; SSE41-NEXT: por %xmm1, %xmm0
254 ; SSE41-NEXT: xorl %eax, %eax
255 ; SSE41-NEXT: ptest %xmm0, %xmm0
256 ; SSE41-NEXT: setne %al
259 ; AVX1-LABEL: vectest512:
261 ; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
262 ; AVX1-NEXT: xorl %eax, %eax
263 ; AVX1-NEXT: vptest %ymm0, %ymm0
264 ; AVX1-NEXT: setne %al
265 ; AVX1-NEXT: vzeroupper
268 ; AVX512-LABEL: vectest512:
270 ; AVX512-NEXT: vptestmd %zmm0, %zmm0, %k0
271 ; AVX512-NEXT: xorl %eax, %eax
272 ; AVX512-NEXT: kortestw %k0, %k0
273 ; AVX512-NEXT: setne %al
274 ; AVX512-NEXT: vzeroupper
276 %t0 = bitcast <16 x i32> %input to i512
277 %t1 = icmp ne i512 %t0, 0
278 %t2 = zext i1 %t1 to i32
282 define i32 @vecsel128(<4 x i32> %input, i32 %a, i32 %b) {
283 ; SSE2-LABEL: vecsel128:
285 ; SSE2-NEXT: movl %edi, %eax
286 ; SSE2-NEXT: pxor %xmm1, %xmm1
287 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
288 ; SSE2-NEXT: movmskps %xmm1, %ecx
289 ; SSE2-NEXT: xorl $15, %ecx
290 ; SSE2-NEXT: cmovel %esi, %eax
293 ; SSE41-LABEL: vecsel128:
295 ; SSE41-NEXT: movl %edi, %eax
296 ; SSE41-NEXT: ptest %xmm0, %xmm0
297 ; SSE41-NEXT: cmovel %esi, %eax
300 ; AVX-LABEL: vecsel128:
302 ; AVX-NEXT: movl %edi, %eax
303 ; AVX-NEXT: vptest %xmm0, %xmm0
304 ; AVX-NEXT: cmovel %esi, %eax
306 %t0 = bitcast <4 x i32> %input to i128
307 %t1 = icmp ne i128 %t0, 0
308 %t2 = select i1 %t1, i32 %a, i32 %b
312 define i32 @vecsel256(<8 x i32> %input, i32 %a, i32 %b) {
313 ; SSE2-LABEL: vecsel256:
315 ; SSE2-NEXT: movl %edi, %eax
316 ; SSE2-NEXT: por %xmm1, %xmm0
317 ; SSE2-NEXT: pxor %xmm1, %xmm1
318 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
319 ; SSE2-NEXT: movmskps %xmm1, %ecx
320 ; SSE2-NEXT: xorl $15, %ecx
321 ; SSE2-NEXT: cmovel %esi, %eax
324 ; SSE41-LABEL: vecsel256:
326 ; SSE41-NEXT: movl %edi, %eax
327 ; SSE41-NEXT: por %xmm1, %xmm0
328 ; SSE41-NEXT: ptest %xmm0, %xmm0
329 ; SSE41-NEXT: cmovel %esi, %eax
332 ; AVX-LABEL: vecsel256:
334 ; AVX-NEXT: movl %edi, %eax
335 ; AVX-NEXT: vptest %ymm0, %ymm0
336 ; AVX-NEXT: cmovel %esi, %eax
337 ; AVX-NEXT: vzeroupper
339 %t0 = bitcast <8 x i32> %input to i256
340 %t1 = icmp ne i256 %t0, 0
341 %t2 = select i1 %t1, i32 %a, i32 %b
345 define i32 @vecsel512(<16 x i32> %input, i32 %a, i32 %b) {
346 ; SSE2-LABEL: vecsel512:
348 ; SSE2-NEXT: movl %edi, %eax
349 ; SSE2-NEXT: por %xmm3, %xmm1
350 ; SSE2-NEXT: por %xmm2, %xmm0
351 ; SSE2-NEXT: por %xmm1, %xmm0
352 ; SSE2-NEXT: pxor %xmm1, %xmm1
353 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
354 ; SSE2-NEXT: movmskps %xmm1, %ecx
355 ; SSE2-NEXT: xorl $15, %ecx
356 ; SSE2-NEXT: cmovel %esi, %eax
359 ; SSE41-LABEL: vecsel512:
361 ; SSE41-NEXT: movl %edi, %eax
362 ; SSE41-NEXT: por %xmm3, %xmm1
363 ; SSE41-NEXT: por %xmm2, %xmm0
364 ; SSE41-NEXT: por %xmm1, %xmm0
365 ; SSE41-NEXT: ptest %xmm0, %xmm0
366 ; SSE41-NEXT: cmovel %esi, %eax
369 ; AVX1-LABEL: vecsel512:
371 ; AVX1-NEXT: movl %edi, %eax
372 ; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
373 ; AVX1-NEXT: vptest %ymm0, %ymm0
374 ; AVX1-NEXT: cmovel %esi, %eax
375 ; AVX1-NEXT: vzeroupper
378 ; AVX512-LABEL: vecsel512:
380 ; AVX512-NEXT: movl %edi, %eax
381 ; AVX512-NEXT: vptestmd %zmm0, %zmm0, %k0
382 ; AVX512-NEXT: kortestw %k0, %k0
383 ; AVX512-NEXT: cmovel %esi, %eax
384 ; AVX512-NEXT: vzeroupper
386 %t0 = bitcast <16 x i32> %input to i512
387 %t1 = icmp ne i512 %t0, 0
388 %t2 = select i1 %t1, i32 %a, i32 %b