1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=x86_64-unknown-unknown -mattr=+sse4.1,-avx < %s | FileCheck %s --check-prefix=SSE41
3 ; RUN: llc -mtriple=x86_64-unknown-unknown -mattr=+avx,-avx2 < %s | FileCheck %s --check-prefix=AVX --check-prefix=AVX1
4 ; RUN: llc -mtriple=x86_64-unknown-unknown -mattr=+avx512vl,+avx512dq,+avx512bw < %s | FileCheck %s --check-prefix=AVX --check-prefix=AVX512
6 define i32 @veccond128(<4 x i32> %input) {
7 ; SSE41-LABEL: veccond128:
8 ; SSE41: # %bb.0: # %entry
9 ; SSE41-NEXT: ptest %xmm0, %xmm0
10 ; SSE41-NEXT: je .LBB0_2
11 ; SSE41-NEXT: # %bb.1: # %if-true-block
12 ; SSE41-NEXT: xorl %eax, %eax
14 ; SSE41-NEXT: .LBB0_2: # %endif-block
15 ; SSE41-NEXT: movl $1, %eax
18 ; AVX-LABEL: veccond128:
19 ; AVX: # %bb.0: # %entry
20 ; AVX-NEXT: vptest %xmm0, %xmm0
21 ; AVX-NEXT: je .LBB0_2
22 ; AVX-NEXT: # %bb.1: # %if-true-block
23 ; AVX-NEXT: xorl %eax, %eax
25 ; AVX-NEXT: .LBB0_2: # %endif-block
26 ; AVX-NEXT: movl $1, %eax
29 %0 = bitcast <4 x i32> %input to i128
30 %1 = icmp ne i128 %0, 0
31 br i1 %1, label %if-true-block, label %endif-block
38 define i32 @veccond256(<8 x i32> %input) {
39 ; SSE41-LABEL: veccond256:
40 ; SSE41: # %bb.0: # %entry
41 ; SSE41-NEXT: por %xmm1, %xmm0
42 ; SSE41-NEXT: ptest %xmm0, %xmm0
43 ; SSE41-NEXT: je .LBB1_2
44 ; SSE41-NEXT: # %bb.1: # %if-true-block
45 ; SSE41-NEXT: xorl %eax, %eax
47 ; SSE41-NEXT: .LBB1_2: # %endif-block
48 ; SSE41-NEXT: movl $1, %eax
51 ; AVX-LABEL: veccond256:
52 ; AVX: # %bb.0: # %entry
53 ; AVX-NEXT: vptest %ymm0, %ymm0
54 ; AVX-NEXT: je .LBB1_2
55 ; AVX-NEXT: # %bb.1: # %if-true-block
56 ; AVX-NEXT: xorl %eax, %eax
57 ; AVX-NEXT: vzeroupper
59 ; AVX-NEXT: .LBB1_2: # %endif-block
60 ; AVX-NEXT: movl $1, %eax
61 ; AVX-NEXT: vzeroupper
64 %0 = bitcast <8 x i32> %input to i256
65 %1 = icmp ne i256 %0, 0
66 br i1 %1, label %if-true-block, label %endif-block
73 define i32 @veccond512(<16 x i32> %input) {
74 ; SSE41-LABEL: veccond512:
75 ; SSE41: # %bb.0: # %entry
76 ; SSE41-NEXT: por %xmm3, %xmm1
77 ; SSE41-NEXT: por %xmm2, %xmm1
78 ; SSE41-NEXT: por %xmm0, %xmm1
79 ; SSE41-NEXT: ptest %xmm1, %xmm1
80 ; SSE41-NEXT: je .LBB2_2
81 ; SSE41-NEXT: # %bb.1: # %if-true-block
82 ; SSE41-NEXT: xorl %eax, %eax
84 ; SSE41-NEXT: .LBB2_2: # %endif-block
85 ; SSE41-NEXT: movl $1, %eax
88 ; AVX1-LABEL: veccond512:
89 ; AVX1: # %bb.0: # %entry
90 ; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
91 ; AVX1-NEXT: vptest %ymm0, %ymm0
92 ; AVX1-NEXT: je .LBB2_2
93 ; AVX1-NEXT: # %bb.1: # %if-true-block
94 ; AVX1-NEXT: xorl %eax, %eax
95 ; AVX1-NEXT: vzeroupper
97 ; AVX1-NEXT: .LBB2_2: # %endif-block
98 ; AVX1-NEXT: movl $1, %eax
99 ; AVX1-NEXT: vzeroupper
102 ; AVX512-LABEL: veccond512:
103 ; AVX512: # %bb.0: # %entry
104 ; AVX512-NEXT: vextracti32x4 $3, %zmm0, %xmm1
105 ; AVX512-NEXT: vmovq %xmm1, %rax
106 ; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm2
107 ; AVX512-NEXT: vmovq %xmm2, %rcx
108 ; AVX512-NEXT: orq %rax, %rcx
109 ; AVX512-NEXT: vextracti32x4 $2, %zmm0, %xmm3
110 ; AVX512-NEXT: vmovq %xmm3, %rax
111 ; AVX512-NEXT: orq %rcx, %rax
112 ; AVX512-NEXT: vmovq %xmm0, %rcx
113 ; AVX512-NEXT: orq %rax, %rcx
114 ; AVX512-NEXT: vpextrq $1, %xmm1, %rax
115 ; AVX512-NEXT: vpextrq $1, %xmm2, %rdx
116 ; AVX512-NEXT: orq %rax, %rdx
117 ; AVX512-NEXT: vpextrq $1, %xmm3, %rax
118 ; AVX512-NEXT: orq %rdx, %rax
119 ; AVX512-NEXT: vpextrq $1, %xmm0, %rdx
120 ; AVX512-NEXT: orq %rax, %rdx
121 ; AVX512-NEXT: orq %rcx, %rdx
122 ; AVX512-NEXT: je .LBB2_2
123 ; AVX512-NEXT: # %bb.1: # %if-true-block
124 ; AVX512-NEXT: xorl %eax, %eax
125 ; AVX512-NEXT: vzeroupper
127 ; AVX512-NEXT: .LBB2_2: # %endif-block
128 ; AVX512-NEXT: movl $1, %eax
129 ; AVX512-NEXT: vzeroupper
132 %0 = bitcast <16 x i32> %input to i512
133 %1 = icmp ne i512 %0, 0
134 br i1 %1, label %if-true-block, label %endif-block
141 define i32 @vectest128(<4 x i32> %input) {
142 ; SSE41-LABEL: vectest128:
144 ; SSE41-NEXT: xorl %eax, %eax
145 ; SSE41-NEXT: ptest %xmm0, %xmm0
146 ; SSE41-NEXT: setne %al
149 ; AVX-LABEL: vectest128:
151 ; AVX-NEXT: xorl %eax, %eax
152 ; AVX-NEXT: vptest %xmm0, %xmm0
153 ; AVX-NEXT: setne %al
155 %t0 = bitcast <4 x i32> %input to i128
156 %t1 = icmp ne i128 %t0, 0
157 %t2 = zext i1 %t1 to i32
161 define i32 @vectest256(<8 x i32> %input) {
162 ; SSE41-LABEL: vectest256:
164 ; SSE41-NEXT: por %xmm1, %xmm0
165 ; SSE41-NEXT: xorl %eax, %eax
166 ; SSE41-NEXT: ptest %xmm0, %xmm0
167 ; SSE41-NEXT: setne %al
170 ; AVX-LABEL: vectest256:
172 ; AVX-NEXT: xorl %eax, %eax
173 ; AVX-NEXT: vptest %ymm0, %ymm0
174 ; AVX-NEXT: setne %al
175 ; AVX-NEXT: vzeroupper
177 %t0 = bitcast <8 x i32> %input to i256
178 %t1 = icmp ne i256 %t0, 0
179 %t2 = zext i1 %t1 to i32
183 define i32 @vectest512(<16 x i32> %input) {
184 ; SSE41-LABEL: vectest512:
186 ; SSE41-NEXT: por %xmm3, %xmm1
187 ; SSE41-NEXT: por %xmm2, %xmm1
188 ; SSE41-NEXT: por %xmm0, %xmm1
189 ; SSE41-NEXT: xorl %eax, %eax
190 ; SSE41-NEXT: ptest %xmm1, %xmm1
191 ; SSE41-NEXT: setne %al
194 ; AVX1-LABEL: vectest512:
196 ; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
197 ; AVX1-NEXT: xorl %eax, %eax
198 ; AVX1-NEXT: vptest %ymm0, %ymm0
199 ; AVX1-NEXT: setne %al
200 ; AVX1-NEXT: vzeroupper
203 ; AVX512-LABEL: vectest512:
205 ; AVX512-NEXT: vextracti32x4 $3, %zmm0, %xmm1
206 ; AVX512-NEXT: vmovq %xmm1, %rax
207 ; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm2
208 ; AVX512-NEXT: vmovq %xmm2, %rcx
209 ; AVX512-NEXT: orq %rax, %rcx
210 ; AVX512-NEXT: vextracti32x4 $2, %zmm0, %xmm3
211 ; AVX512-NEXT: vmovq %xmm3, %rax
212 ; AVX512-NEXT: orq %rcx, %rax
213 ; AVX512-NEXT: vmovq %xmm0, %rcx
214 ; AVX512-NEXT: orq %rax, %rcx
215 ; AVX512-NEXT: vpextrq $1, %xmm1, %rax
216 ; AVX512-NEXT: vpextrq $1, %xmm2, %rdx
217 ; AVX512-NEXT: orq %rax, %rdx
218 ; AVX512-NEXT: vpextrq $1, %xmm3, %rax
219 ; AVX512-NEXT: orq %rdx, %rax
220 ; AVX512-NEXT: vpextrq $1, %xmm0, %rdx
221 ; AVX512-NEXT: orq %rax, %rdx
222 ; AVX512-NEXT: xorl %eax, %eax
223 ; AVX512-NEXT: orq %rcx, %rdx
224 ; AVX512-NEXT: setne %al
225 ; AVX512-NEXT: vzeroupper
227 %t0 = bitcast <16 x i32> %input to i512
228 %t1 = icmp ne i512 %t0, 0
229 %t2 = zext i1 %t1 to i32
233 define i32 @vecsel128(<4 x i32> %input, i32 %a, i32 %b) {
234 ; SSE41-LABEL: vecsel128:
236 ; SSE41-NEXT: movl %edi, %eax
237 ; SSE41-NEXT: ptest %xmm0, %xmm0
238 ; SSE41-NEXT: cmovel %esi, %eax
241 ; AVX-LABEL: vecsel128:
243 ; AVX-NEXT: movl %edi, %eax
244 ; AVX-NEXT: vptest %xmm0, %xmm0
245 ; AVX-NEXT: cmovel %esi, %eax
247 %t0 = bitcast <4 x i32> %input to i128
248 %t1 = icmp ne i128 %t0, 0
249 %t2 = select i1 %t1, i32 %a, i32 %b
253 define i32 @vecsel256(<8 x i32> %input, i32 %a, i32 %b) {
254 ; SSE41-LABEL: vecsel256:
256 ; SSE41-NEXT: movl %edi, %eax
257 ; SSE41-NEXT: por %xmm1, %xmm0
258 ; SSE41-NEXT: ptest %xmm0, %xmm0
259 ; SSE41-NEXT: cmovel %esi, %eax
262 ; AVX-LABEL: vecsel256:
264 ; AVX-NEXT: movl %edi, %eax
265 ; AVX-NEXT: vptest %ymm0, %ymm0
266 ; AVX-NEXT: cmovel %esi, %eax
267 ; AVX-NEXT: vzeroupper
269 %t0 = bitcast <8 x i32> %input to i256
270 %t1 = icmp ne i256 %t0, 0
271 %t2 = select i1 %t1, i32 %a, i32 %b
275 define i32 @vecsel512(<16 x i32> %input, i32 %a, i32 %b) {
276 ; SSE41-LABEL: vecsel512:
278 ; SSE41-NEXT: movl %edi, %eax
279 ; SSE41-NEXT: por %xmm3, %xmm1
280 ; SSE41-NEXT: por %xmm2, %xmm1
281 ; SSE41-NEXT: por %xmm0, %xmm1
282 ; SSE41-NEXT: ptest %xmm1, %xmm1
283 ; SSE41-NEXT: cmovel %esi, %eax
286 ; AVX1-LABEL: vecsel512:
288 ; AVX1-NEXT: movl %edi, %eax
289 ; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
290 ; AVX1-NEXT: vptest %ymm0, %ymm0
291 ; AVX1-NEXT: cmovel %esi, %eax
292 ; AVX1-NEXT: vzeroupper
295 ; AVX512-LABEL: vecsel512:
297 ; AVX512-NEXT: movl %edi, %eax
298 ; AVX512-NEXT: vextracti32x4 $3, %zmm0, %xmm1
299 ; AVX512-NEXT: vmovq %xmm1, %rcx
300 ; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm2
301 ; AVX512-NEXT: vmovq %xmm2, %rdx
302 ; AVX512-NEXT: orq %rcx, %rdx
303 ; AVX512-NEXT: vextracti32x4 $2, %zmm0, %xmm3
304 ; AVX512-NEXT: vmovq %xmm3, %rcx
305 ; AVX512-NEXT: orq %rdx, %rcx
306 ; AVX512-NEXT: vmovq %xmm0, %rdx
307 ; AVX512-NEXT: orq %rcx, %rdx
308 ; AVX512-NEXT: vpextrq $1, %xmm1, %rcx
309 ; AVX512-NEXT: vpextrq $1, %xmm2, %rdi
310 ; AVX512-NEXT: orq %rcx, %rdi
311 ; AVX512-NEXT: vpextrq $1, %xmm3, %rcx
312 ; AVX512-NEXT: orq %rdi, %rcx
313 ; AVX512-NEXT: vpextrq $1, %xmm0, %rdi
314 ; AVX512-NEXT: orq %rcx, %rdi
315 ; AVX512-NEXT: orq %rdx, %rdi
316 ; AVX512-NEXT: cmovel %esi, %eax
317 ; AVX512-NEXT: vzeroupper
319 %t0 = bitcast <16 x i32> %input to i512
320 %t1 = icmp ne i512 %t0, 0
321 %t2 = select i1 %t1, i32 %a, i32 %b