[InstCombine] Signed saturation patterns
[llvm-core.git] / test / CodeGen / X86 / ptest.ll
blobfe69c60ec68f5cfc5c12c73e90d8eb80f94792b6
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
13 ; SSE41-NEXT:    retq
14 ; SSE41-NEXT:  .LBB0_2: # %endif-block
15 ; SSE41-NEXT:    movl $1, %eax
16 ; SSE41-NEXT:    retq
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
24 ; AVX-NEXT:    retq
25 ; AVX-NEXT:  .LBB0_2: # %endif-block
26 ; AVX-NEXT:    movl $1, %eax
27 ; AVX-NEXT:    retq
28 entry:
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
32 if-true-block:
33   ret i32 0
34 endif-block:
35   ret i32 1
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
46 ; SSE41-NEXT:    retq
47 ; SSE41-NEXT:  .LBB1_2: # %endif-block
48 ; SSE41-NEXT:    movl $1, %eax
49 ; SSE41-NEXT:    retq
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
58 ; AVX-NEXT:    retq
59 ; AVX-NEXT:  .LBB1_2: # %endif-block
60 ; AVX-NEXT:    movl $1, %eax
61 ; AVX-NEXT:    vzeroupper
62 ; AVX-NEXT:    retq
63 entry:
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
67 if-true-block:
68   ret i32 0
69 endif-block:
70   ret i32 1
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
83 ; SSE41-NEXT:    retq
84 ; SSE41-NEXT:  .LBB2_2: # %endif-block
85 ; SSE41-NEXT:    movl $1, %eax
86 ; SSE41-NEXT:    retq
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
96 ; AVX1-NEXT:    retq
97 ; AVX1-NEXT:  .LBB2_2: # %endif-block
98 ; AVX1-NEXT:    movl $1, %eax
99 ; AVX1-NEXT:    vzeroupper
100 ; AVX1-NEXT:    retq
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
126 ; AVX512-NEXT:    retq
127 ; AVX512-NEXT:  .LBB2_2: # %endif-block
128 ; AVX512-NEXT:    movl $1, %eax
129 ; AVX512-NEXT:    vzeroupper
130 ; AVX512-NEXT:    retq
131 entry:
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
135 if-true-block:
136   ret i32 0
137 endif-block:
138   ret i32 1
141 define i32 @vectest128(<4 x i32> %input) {
142 ; SSE41-LABEL: vectest128:
143 ; SSE41:       # %bb.0:
144 ; SSE41-NEXT:    xorl %eax, %eax
145 ; SSE41-NEXT:    ptest %xmm0, %xmm0
146 ; SSE41-NEXT:    setne %al
147 ; SSE41-NEXT:    retq
149 ; AVX-LABEL: vectest128:
150 ; AVX:       # %bb.0:
151 ; AVX-NEXT:    xorl %eax, %eax
152 ; AVX-NEXT:    vptest %xmm0, %xmm0
153 ; AVX-NEXT:    setne %al
154 ; AVX-NEXT:    retq
155   %t0 = bitcast <4 x i32> %input to i128
156   %t1 = icmp ne i128 %t0, 0
157   %t2 = zext i1 %t1 to i32
158   ret i32 %t2
161 define i32 @vectest256(<8 x i32> %input) {
162 ; SSE41-LABEL: vectest256:
163 ; SSE41:       # %bb.0:
164 ; SSE41-NEXT:    por %xmm1, %xmm0
165 ; SSE41-NEXT:    xorl %eax, %eax
166 ; SSE41-NEXT:    ptest %xmm0, %xmm0
167 ; SSE41-NEXT:    setne %al
168 ; SSE41-NEXT:    retq
170 ; AVX-LABEL: vectest256:
171 ; AVX:       # %bb.0:
172 ; AVX-NEXT:    xorl %eax, %eax
173 ; AVX-NEXT:    vptest %ymm0, %ymm0
174 ; AVX-NEXT:    setne %al
175 ; AVX-NEXT:    vzeroupper
176 ; AVX-NEXT:    retq
177   %t0 = bitcast <8 x i32> %input to i256
178   %t1 = icmp ne i256 %t0, 0
179   %t2 = zext i1 %t1 to i32
180   ret i32 %t2
183 define i32 @vectest512(<16 x i32> %input) {
184 ; SSE41-LABEL: vectest512:
185 ; SSE41:       # %bb.0:
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
192 ; SSE41-NEXT:    retq
194 ; AVX1-LABEL: vectest512:
195 ; AVX1:       # %bb.0:
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
201 ; AVX1-NEXT:    retq
203 ; AVX512-LABEL: vectest512:
204 ; AVX512:       # %bb.0:
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
226 ; AVX512-NEXT:    retq
227   %t0 = bitcast <16 x i32> %input to i512
228   %t1 = icmp ne i512 %t0, 0
229   %t2 = zext i1 %t1 to i32
230   ret i32 %t2
233 define i32 @vecsel128(<4 x i32> %input, i32 %a, i32 %b) {
234 ; SSE41-LABEL: vecsel128:
235 ; SSE41:       # %bb.0:
236 ; SSE41-NEXT:    movl %edi, %eax
237 ; SSE41-NEXT:    ptest %xmm0, %xmm0
238 ; SSE41-NEXT:    cmovel %esi, %eax
239 ; SSE41-NEXT:    retq
241 ; AVX-LABEL: vecsel128:
242 ; AVX:       # %bb.0:
243 ; AVX-NEXT:    movl %edi, %eax
244 ; AVX-NEXT:    vptest %xmm0, %xmm0
245 ; AVX-NEXT:    cmovel %esi, %eax
246 ; AVX-NEXT:    retq
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
250   ret i32 %t2
253 define i32 @vecsel256(<8 x i32> %input, i32 %a, i32 %b) {
254 ; SSE41-LABEL: vecsel256:
255 ; SSE41:       # %bb.0:
256 ; SSE41-NEXT:    movl %edi, %eax
257 ; SSE41-NEXT:    por %xmm1, %xmm0
258 ; SSE41-NEXT:    ptest %xmm0, %xmm0
259 ; SSE41-NEXT:    cmovel %esi, %eax
260 ; SSE41-NEXT:    retq
262 ; AVX-LABEL: vecsel256:
263 ; AVX:       # %bb.0:
264 ; AVX-NEXT:    movl %edi, %eax
265 ; AVX-NEXT:    vptest %ymm0, %ymm0
266 ; AVX-NEXT:    cmovel %esi, %eax
267 ; AVX-NEXT:    vzeroupper
268 ; AVX-NEXT:    retq
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
272   ret i32 %t2
275 define i32 @vecsel512(<16 x i32> %input, i32 %a, i32 %b) {
276 ; SSE41-LABEL: vecsel512:
277 ; SSE41:       # %bb.0:
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
284 ; SSE41-NEXT:    retq
286 ; AVX1-LABEL: vecsel512:
287 ; AVX1:       # %bb.0:
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
293 ; AVX1-NEXT:    retq
295 ; AVX512-LABEL: vecsel512:
296 ; AVX512:       # %bb.0:
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
318 ; AVX512-NEXT:    retq
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
322   ret i32 %t2