[PowerPC] Recommit r314244 with refactoring and off by default
[llvm-core.git] / test / CodeGen / X86 / pr12312.ll
blob6575d2a73d9c28ab90c24a3bce44ad4218b73af2
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
12 ; SSE41-NEXT:    retq
13 ; SSE41-NEXT:  .LBB0_2: # %endif-block
14 ; SSE41-NEXT:    movl $1, %eax
15 ; SSE41-NEXT:    retq
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
23 ; AVX-NEXT:    retq
24 ; AVX-NEXT:  .LBB0_2: # %endif-block
25 ; AVX-NEXT:    movl $1, %eax
26 ; AVX-NEXT:    retq
27 entry:
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
31 if-true-block:
32   ret i32 0
33 endif-block:
34   ret i32 1
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
45 ; SSE41-NEXT:    retq
46 ; SSE41-NEXT:  .LBB1_2: # %endif-block
47 ; SSE41-NEXT:    movl $1, %eax
48 ; SSE41-NEXT:    retq
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
57 ; AVX-NEXT:    retq
58 ; AVX-NEXT:  .LBB1_2: # %endif-block
59 ; AVX-NEXT:    movl $1, %eax
60 ; AVX-NEXT:    vzeroupper
61 ; AVX-NEXT:    retq
62 entry:
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
66 if-true-block:
67   ret i32 0
68 endif-block:
69   ret i32 1
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
82 ; SSE41-NEXT:    retq
83 ; SSE41-NEXT:  .LBB2_2: # %endif-block
84 ; SSE41-NEXT:    movl $1, %eax
85 ; SSE41-NEXT:    retq
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
95 ; AVX-NEXT:    retq
96 ; AVX-NEXT:  .LBB2_2: # %endif-block
97 ; AVX-NEXT:    movl $1, %eax
98 ; AVX-NEXT:    vzeroupper
99 ; AVX-NEXT:    retq
100 entry:
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
104 if-true-block:
105   ret i32 0
106 endif-block:
107   ret i32 1
110 define i32 @vectest128(<4 x i32> %input) {
111 ; SSE41-LABEL: vectest128:
112 ; SSE41:       # BB#0:
113 ; SSE41-NEXT:    xorl %eax, %eax
114 ; SSE41-NEXT:    ptest %xmm0, %xmm0
115 ; SSE41-NEXT:    setne %al
116 ; SSE41-NEXT:    retq
118 ; AVX-LABEL: vectest128:
119 ; AVX:       # BB#0:
120 ; AVX-NEXT:    xorl %eax, %eax
121 ; AVX-NEXT:    vptest %xmm0, %xmm0
122 ; AVX-NEXT:    setne %al
123 ; AVX-NEXT:    retq
124   %t0 = bitcast <4 x i32> %input to i128
125   %t1 = icmp ne i128 %t0, 0
126   %t2 = zext i1 %t1 to i32
127   ret i32 %t2
130 define i32 @vectest256(<8 x i32> %input) {
131 ; SSE41-LABEL: vectest256:
132 ; SSE41:       # BB#0:
133 ; SSE41-NEXT:    por %xmm1, %xmm0
134 ; SSE41-NEXT:    xorl %eax, %eax
135 ; SSE41-NEXT:    ptest %xmm0, %xmm0
136 ; SSE41-NEXT:    setne %al
137 ; SSE41-NEXT:    retq
139 ; AVX-LABEL: vectest256:
140 ; AVX:       # BB#0:
141 ; AVX-NEXT:    xorl %eax, %eax
142 ; AVX-NEXT:    vptest %ymm0, %ymm0
143 ; AVX-NEXT:    setne %al
144 ; AVX-NEXT:    vzeroupper
145 ; AVX-NEXT:    retq
146   %t0 = bitcast <8 x i32> %input to i256
147   %t1 = icmp ne i256 %t0, 0
148   %t2 = zext i1 %t1 to i32
149   ret i32 %t2
152 define i32 @vectest512(<16 x i32> %input) {
153 ; SSE41-LABEL: vectest512:
154 ; SSE41:       # BB#0:
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
161 ; SSE41-NEXT:    retq
163 ; AVX-LABEL: vectest512:
164 ; AVX:       # BB#0:
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
170 ; AVX-NEXT:    retq
171   %t0 = bitcast <16 x i32> %input to i512
172   %t1 = icmp ne i512 %t0, 0
173   %t2 = zext i1 %t1 to i32
174   ret i32 %t2
177 define i32 @vecsel128(<4 x i32> %input, i32 %a, i32 %b) {
178 ; SSE41-LABEL: vecsel128:
179 ; SSE41:       # BB#0:
180 ; SSE41-NEXT:    ptest %xmm0, %xmm0
181 ; SSE41-NEXT:    cmovel %esi, %edi
182 ; SSE41-NEXT:    movl %edi, %eax
183 ; SSE41-NEXT:    retq
185 ; AVX-LABEL: vecsel128:
186 ; AVX:       # BB#0:
187 ; AVX-NEXT:    vptest %xmm0, %xmm0
188 ; AVX-NEXT:    cmovel %esi, %edi
189 ; AVX-NEXT:    movl %edi, %eax
190 ; AVX-NEXT:    retq
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
194   ret i32 %t2
197 define i32 @vecsel256(<8 x i32> %input, i32 %a, i32 %b) {
198 ; SSE41-LABEL: vecsel256:
199 ; SSE41:       # BB#0:
200 ; SSE41-NEXT:    por %xmm1, %xmm0
201 ; SSE41-NEXT:    ptest %xmm0, %xmm0
202 ; SSE41-NEXT:    cmovel %esi, %edi
203 ; SSE41-NEXT:    movl %edi, %eax
204 ; SSE41-NEXT:    retq
206 ; AVX-LABEL: vecsel256:
207 ; AVX:       # BB#0:
208 ; AVX-NEXT:    vptest %ymm0, %ymm0
209 ; AVX-NEXT:    cmovel %esi, %edi
210 ; AVX-NEXT:    movl %edi, %eax
211 ; AVX-NEXT:    vzeroupper
212 ; AVX-NEXT:    retq
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
216   ret i32 %t2
219 define i32 @vecsel512(<16 x i32> %input, i32 %a, i32 %b) {
220 ; SSE41-LABEL: vecsel512:
221 ; SSE41:       # BB#0:
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
228 ; SSE41-NEXT:    retq
230 ; AVX-LABEL: vecsel512:
231 ; AVX:       # BB#0:
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
237 ; AVX-NEXT:    retq
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
241   ret i32 %t2