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
5 define i32 @veccond128(<4 x i32> %input) {
6 ; SSE41-LABEL: veccond128:
7 ; SSE41: # BB#0: # %entry
8 ; SSE41-NEXT: ptest %xmm0, %xmm0
9 ; SSE41-NEXT: je .LBB0_2
10 ; SSE41-NEXT: # BB#1: # %if-true-block
11 ; SSE41-NEXT: xorl %eax, %eax
13 ; SSE41-NEXT: .LBB0_2: # %endif-block
14 ; SSE41-NEXT: movl $1, %eax
17 ; AVX-LABEL: veccond128:
18 ; AVX: # BB#0: # %entry
19 ; AVX-NEXT: vptest %xmm0, %xmm0
20 ; AVX-NEXT: je .LBB0_2
21 ; AVX-NEXT: # BB#1: # %if-true-block
22 ; AVX-NEXT: xorl %eax, %eax
24 ; AVX-NEXT: .LBB0_2: # %endif-block
25 ; AVX-NEXT: movl $1, %eax
28 %0 = bitcast <4 x i32> %input to i128
29 %1 = icmp ne i128 %0, 0
30 br i1 %1, label %if-true-block, label %endif-block
37 define i32 @veccond256(<8 x i32> %input) {
38 ; SSE41-LABEL: veccond256:
39 ; SSE41: # BB#0: # %entry
40 ; SSE41-NEXT: por %xmm1, %xmm0
41 ; SSE41-NEXT: ptest %xmm0, %xmm0
42 ; SSE41-NEXT: je .LBB1_2
43 ; SSE41-NEXT: # BB#1: # %if-true-block
44 ; SSE41-NEXT: xorl %eax, %eax
46 ; SSE41-NEXT: .LBB1_2: # %endif-block
47 ; SSE41-NEXT: movl $1, %eax
50 ; AVX-LABEL: veccond256:
51 ; AVX: # BB#0: # %entry
52 ; AVX-NEXT: vptest %ymm0, %ymm0
53 ; AVX-NEXT: je .LBB1_2
54 ; AVX-NEXT: # BB#1: # %if-true-block
55 ; AVX-NEXT: xorl %eax, %eax
56 ; AVX-NEXT: vzeroupper
58 ; AVX-NEXT: .LBB1_2: # %endif-block
59 ; AVX-NEXT: movl $1, %eax
60 ; AVX-NEXT: vzeroupper
63 %0 = bitcast <8 x i32> %input to i256
64 %1 = icmp ne i256 %0, 0
65 br i1 %1, label %if-true-block, label %endif-block
72 define i32 @veccond512(<16 x i32> %input) {
73 ; SSE41-LABEL: veccond512:
74 ; SSE41: # BB#0: # %entry
75 ; SSE41-NEXT: por %xmm3, %xmm1
76 ; SSE41-NEXT: por %xmm2, %xmm1
77 ; SSE41-NEXT: por %xmm0, %xmm1
78 ; SSE41-NEXT: ptest %xmm1, %xmm1
79 ; SSE41-NEXT: je .LBB2_2
80 ; SSE41-NEXT: # BB#1: # %if-true-block
81 ; SSE41-NEXT: xorl %eax, %eax
83 ; SSE41-NEXT: .LBB2_2: # %endif-block
84 ; SSE41-NEXT: movl $1, %eax
87 ; AVX-LABEL: veccond512:
88 ; AVX: # BB#0: # %entry
89 ; AVX-NEXT: vorps %ymm1, %ymm0, %ymm0
90 ; AVX-NEXT: vptest %ymm0, %ymm0
91 ; AVX-NEXT: je .LBB2_2
92 ; AVX-NEXT: # BB#1: # %if-true-block
93 ; AVX-NEXT: xorl %eax, %eax
94 ; AVX-NEXT: vzeroupper
96 ; AVX-NEXT: .LBB2_2: # %endif-block
97 ; AVX-NEXT: movl $1, %eax
98 ; AVX-NEXT: vzeroupper
101 %0 = bitcast <16 x i32> %input to i512
102 %1 = icmp ne i512 %0, 0
103 br i1 %1, label %if-true-block, label %endif-block
110 define i32 @vectest128(<4 x i32> %input) {
111 ; SSE41-LABEL: vectest128:
113 ; SSE41-NEXT: xorl %eax, %eax
114 ; SSE41-NEXT: ptest %xmm0, %xmm0
115 ; SSE41-NEXT: setne %al
118 ; AVX-LABEL: vectest128:
120 ; AVX-NEXT: xorl %eax, %eax
121 ; AVX-NEXT: vptest %xmm0, %xmm0
122 ; AVX-NEXT: setne %al
124 %t0 = bitcast <4 x i32> %input to i128
125 %t1 = icmp ne i128 %t0, 0
126 %t2 = zext i1 %t1 to i32
130 define i32 @vectest256(<8 x i32> %input) {
131 ; SSE41-LABEL: vectest256:
133 ; SSE41-NEXT: por %xmm1, %xmm0
134 ; SSE41-NEXT: xorl %eax, %eax
135 ; SSE41-NEXT: ptest %xmm0, %xmm0
136 ; SSE41-NEXT: setne %al
139 ; AVX-LABEL: vectest256:
141 ; AVX-NEXT: xorl %eax, %eax
142 ; AVX-NEXT: vptest %ymm0, %ymm0
143 ; AVX-NEXT: setne %al
144 ; AVX-NEXT: vzeroupper
146 %t0 = bitcast <8 x i32> %input to i256
147 %t1 = icmp ne i256 %t0, 0
148 %t2 = zext i1 %t1 to i32
152 define i32 @vectest512(<16 x i32> %input) {
153 ; SSE41-LABEL: vectest512:
155 ; SSE41-NEXT: por %xmm3, %xmm1
156 ; SSE41-NEXT: por %xmm2, %xmm1
157 ; SSE41-NEXT: por %xmm0, %xmm1
158 ; SSE41-NEXT: xorl %eax, %eax
159 ; SSE41-NEXT: ptest %xmm1, %xmm1
160 ; SSE41-NEXT: setne %al
163 ; AVX-LABEL: vectest512:
165 ; AVX-NEXT: vorps %ymm1, %ymm0, %ymm0
166 ; AVX-NEXT: xorl %eax, %eax
167 ; AVX-NEXT: vptest %ymm0, %ymm0
168 ; AVX-NEXT: setne %al
169 ; AVX-NEXT: vzeroupper
171 %t0 = bitcast <16 x i32> %input to i512
172 %t1 = icmp ne i512 %t0, 0
173 %t2 = zext i1 %t1 to i32
177 define i32 @vecsel128(<4 x i32> %input, i32 %a, i32 %b) {
178 ; SSE41-LABEL: vecsel128:
180 ; SSE41-NEXT: ptest %xmm0, %xmm0
181 ; SSE41-NEXT: cmovel %esi, %edi
182 ; SSE41-NEXT: movl %edi, %eax
185 ; AVX-LABEL: vecsel128:
187 ; AVX-NEXT: vptest %xmm0, %xmm0
188 ; AVX-NEXT: cmovel %esi, %edi
189 ; AVX-NEXT: movl %edi, %eax
191 %t0 = bitcast <4 x i32> %input to i128
192 %t1 = icmp ne i128 %t0, 0
193 %t2 = select i1 %t1, i32 %a, i32 %b
197 define i32 @vecsel256(<8 x i32> %input, i32 %a, i32 %b) {
198 ; SSE41-LABEL: vecsel256:
200 ; SSE41-NEXT: por %xmm1, %xmm0
201 ; SSE41-NEXT: ptest %xmm0, %xmm0
202 ; SSE41-NEXT: cmovel %esi, %edi
203 ; SSE41-NEXT: movl %edi, %eax
206 ; AVX-LABEL: vecsel256:
208 ; AVX-NEXT: vptest %ymm0, %ymm0
209 ; AVX-NEXT: cmovel %esi, %edi
210 ; AVX-NEXT: movl %edi, %eax
211 ; AVX-NEXT: vzeroupper
213 %t0 = bitcast <8 x i32> %input to i256
214 %t1 = icmp ne i256 %t0, 0
215 %t2 = select i1 %t1, i32 %a, i32 %b
219 define i32 @vecsel512(<16 x i32> %input, i32 %a, i32 %b) {
220 ; SSE41-LABEL: vecsel512:
222 ; SSE41-NEXT: por %xmm3, %xmm1
223 ; SSE41-NEXT: por %xmm2, %xmm1
224 ; SSE41-NEXT: por %xmm0, %xmm1
225 ; SSE41-NEXT: ptest %xmm1, %xmm1
226 ; SSE41-NEXT: cmovel %esi, %edi
227 ; SSE41-NEXT: movl %edi, %eax
230 ; AVX-LABEL: vecsel512:
232 ; AVX-NEXT: vorps %ymm1, %ymm0, %ymm0
233 ; AVX-NEXT: vptest %ymm0, %ymm0
234 ; AVX-NEXT: cmovel %esi, %edi
235 ; AVX-NEXT: movl %edi, %eax
236 ; AVX-NEXT: vzeroupper
238 %t0 = bitcast <16 x i32> %input to i512
239 %t1 = icmp ne i512 %t0, 0
240 %t2 = select i1 %t1, i32 %a, i32 %b