Revert r354244 "[DAGCombiner] Eliminate dead stores to stack."
[llvm-complete.git] / test / CodeGen / X86 / bitcast-setcc-128.ll
blobe9dea85e14dfca54c8a98906ea08bfe3c54716f1
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=SSE2-SSSE3,SSE2
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+ssse3 | FileCheck %s --check-prefixes=SSE2-SSSE3,SSSE3
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX12,AVX1
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX12,AVX2
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vl | FileCheck %s --check-prefixes=AVX512 --check-prefixes=AVX512F
7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512vl,+avx512bw | FileCheck %s --check-prefixes=AVX512 --check-prefixes=AVX512BW
9 define i8 @v8i16(<8 x i16> %a, <8 x i16> %b) {
10 ; SSE2-SSSE3-LABEL: v8i16:
11 ; SSE2-SSSE3:       # %bb.0:
12 ; SSE2-SSSE3-NEXT:    pcmpgtw %xmm1, %xmm0
13 ; SSE2-SSSE3-NEXT:    packsswb %xmm0, %xmm0
14 ; SSE2-SSSE3-NEXT:    pmovmskb %xmm0, %eax
15 ; SSE2-SSSE3-NEXT:    # kill: def $al killed $al killed $eax
16 ; SSE2-SSSE3-NEXT:    retq
18 ; AVX12-LABEL: v8i16:
19 ; AVX12:       # %bb.0:
20 ; AVX12-NEXT:    vpcmpgtw %xmm1, %xmm0, %xmm0
21 ; AVX12-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
22 ; AVX12-NEXT:    vpmovmskb %xmm0, %eax
23 ; AVX12-NEXT:    # kill: def $al killed $al killed $eax
24 ; AVX12-NEXT:    retq
26 ; AVX512F-LABEL: v8i16:
27 ; AVX512F:       # %bb.0:
28 ; AVX512F-NEXT:    vpcmpgtw %xmm1, %xmm0, %xmm0
29 ; AVX512F-NEXT:    vpmovsxwd %xmm0, %ymm0
30 ; AVX512F-NEXT:    vptestmd %ymm0, %ymm0, %k0
31 ; AVX512F-NEXT:    kmovw %k0, %eax
32 ; AVX512F-NEXT:    # kill: def $al killed $al killed $eax
33 ; AVX512F-NEXT:    vzeroupper
34 ; AVX512F-NEXT:    retq
36 ; AVX512BW-LABEL: v8i16:
37 ; AVX512BW:       # %bb.0:
38 ; AVX512BW-NEXT:    vpcmpgtw %xmm1, %xmm0, %k0
39 ; AVX512BW-NEXT:    kmovd %k0, %eax
40 ; AVX512BW-NEXT:    # kill: def $al killed $al killed $eax
41 ; AVX512BW-NEXT:    retq
42   %x = icmp sgt <8 x i16> %a, %b
43   %res = bitcast <8 x i1> %x to i8
44   ret i8 %res
47 define i4 @v4i32(<4 x i32> %a, <4 x i32> %b) {
48 ; SSE2-SSSE3-LABEL: v4i32:
49 ; SSE2-SSSE3:       # %bb.0:
50 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm1, %xmm0
51 ; SSE2-SSSE3-NEXT:    movmskps %xmm0, %eax
52 ; SSE2-SSSE3-NEXT:    # kill: def $al killed $al killed $eax
53 ; SSE2-SSSE3-NEXT:    retq
55 ; AVX12-LABEL: v4i32:
56 ; AVX12:       # %bb.0:
57 ; AVX12-NEXT:    vpcmpgtd %xmm1, %xmm0, %xmm0
58 ; AVX12-NEXT:    vmovmskps %xmm0, %eax
59 ; AVX12-NEXT:    # kill: def $al killed $al killed $eax
60 ; AVX12-NEXT:    retq
62 ; AVX512F-LABEL: v4i32:
63 ; AVX512F:       # %bb.0:
64 ; AVX512F-NEXT:    vpcmpgtd %xmm1, %xmm0, %k0
65 ; AVX512F-NEXT:    kmovw %k0, %eax
66 ; AVX512F-NEXT:    # kill: def $al killed $al killed $eax
67 ; AVX512F-NEXT:    retq
69 ; AVX512BW-LABEL: v4i32:
70 ; AVX512BW:       # %bb.0:
71 ; AVX512BW-NEXT:    vpcmpgtd %xmm1, %xmm0, %k0
72 ; AVX512BW-NEXT:    kmovd %k0, %eax
73 ; AVX512BW-NEXT:    # kill: def $al killed $al killed $eax
74 ; AVX512BW-NEXT:    retq
75   %x = icmp sgt <4 x i32> %a, %b
76   %res = bitcast <4 x i1> %x to i4
77   ret i4 %res
80 define i4 @v4f32(<4 x float> %a, <4 x float> %b) {
81 ; SSE2-SSSE3-LABEL: v4f32:
82 ; SSE2-SSSE3:       # %bb.0:
83 ; SSE2-SSSE3-NEXT:    cmpltps %xmm0, %xmm1
84 ; SSE2-SSSE3-NEXT:    movmskps %xmm1, %eax
85 ; SSE2-SSSE3-NEXT:    # kill: def $al killed $al killed $eax
86 ; SSE2-SSSE3-NEXT:    retq
88 ; AVX12-LABEL: v4f32:
89 ; AVX12:       # %bb.0:
90 ; AVX12-NEXT:    vcmpltps %xmm0, %xmm1, %xmm0
91 ; AVX12-NEXT:    vmovmskps %xmm0, %eax
92 ; AVX12-NEXT:    # kill: def $al killed $al killed $eax
93 ; AVX12-NEXT:    retq
95 ; AVX512F-LABEL: v4f32:
96 ; AVX512F:       # %bb.0:
97 ; AVX512F-NEXT:    vcmpltps %xmm0, %xmm1, %k0
98 ; AVX512F-NEXT:    kmovw %k0, %eax
99 ; AVX512F-NEXT:    # kill: def $al killed $al killed $eax
100 ; AVX512F-NEXT:    retq
102 ; AVX512BW-LABEL: v4f32:
103 ; AVX512BW:       # %bb.0:
104 ; AVX512BW-NEXT:    vcmpltps %xmm0, %xmm1, %k0
105 ; AVX512BW-NEXT:    kmovd %k0, %eax
106 ; AVX512BW-NEXT:    # kill: def $al killed $al killed $eax
107 ; AVX512BW-NEXT:    retq
108   %x = fcmp ogt <4 x float> %a, %b
109   %res = bitcast <4 x i1> %x to i4
110   ret i4 %res
113 define i16 @v16i8(<16 x i8> %a, <16 x i8> %b) {
114 ; SSE2-SSSE3-LABEL: v16i8:
115 ; SSE2-SSSE3:       # %bb.0:
116 ; SSE2-SSSE3-NEXT:    pcmpgtb %xmm1, %xmm0
117 ; SSE2-SSSE3-NEXT:    pmovmskb %xmm0, %eax
118 ; SSE2-SSSE3-NEXT:    # kill: def $ax killed $ax killed $eax
119 ; SSE2-SSSE3-NEXT:    retq
121 ; AVX12-LABEL: v16i8:
122 ; AVX12:       # %bb.0:
123 ; AVX12-NEXT:    vpcmpgtb %xmm1, %xmm0, %xmm0
124 ; AVX12-NEXT:    vpmovmskb %xmm0, %eax
125 ; AVX12-NEXT:    # kill: def $ax killed $ax killed $eax
126 ; AVX12-NEXT:    retq
128 ; AVX512F-LABEL: v16i8:
129 ; AVX512F:       # %bb.0:
130 ; AVX512F-NEXT:    vpcmpgtb %xmm1, %xmm0, %xmm0
131 ; AVX512F-NEXT:    vpmovmskb %xmm0, %eax
132 ; AVX512F-NEXT:    # kill: def $ax killed $ax killed $eax
133 ; AVX512F-NEXT:    retq
135 ; AVX512BW-LABEL: v16i8:
136 ; AVX512BW:       # %bb.0:
137 ; AVX512BW-NEXT:    vpcmpgtb %xmm1, %xmm0, %k0
138 ; AVX512BW-NEXT:    kmovd %k0, %eax
139 ; AVX512BW-NEXT:    # kill: def $ax killed $ax killed $eax
140 ; AVX512BW-NEXT:    retq
141   %x = icmp sgt <16 x i8> %a, %b
142   %res = bitcast <16 x i1> %x to i16
143   ret i16 %res
146 define i2 @v2i8(<2 x i8> %a, <2 x i8> %b) {
147 ; SSE2-SSSE3-LABEL: v2i8:
148 ; SSE2-SSSE3:       # %bb.0:
149 ; SSE2-SSSE3-NEXT:    psllq $56, %xmm0
150 ; SSE2-SSSE3-NEXT:    movdqa %xmm0, %xmm2
151 ; SSE2-SSSE3-NEXT:    psrad $31, %xmm2
152 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,3,2,3]
153 ; SSE2-SSSE3-NEXT:    psrad $24, %xmm0
154 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,3,2,3]
155 ; SSE2-SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
156 ; SSE2-SSSE3-NEXT:    psllq $56, %xmm1
157 ; SSE2-SSSE3-NEXT:    movdqa %xmm1, %xmm2
158 ; SSE2-SSSE3-NEXT:    psrad $31, %xmm2
159 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,3,2,3]
160 ; SSE2-SSSE3-NEXT:    psrad $24, %xmm1
161 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3]
162 ; SSE2-SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
163 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
164 ; SSE2-SSSE3-NEXT:    pxor %xmm2, %xmm1
165 ; SSE2-SSSE3-NEXT:    pxor %xmm2, %xmm0
166 ; SSE2-SSSE3-NEXT:    movdqa %xmm0, %xmm2
167 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm1, %xmm2
168 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm1, %xmm0
169 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[0,0,2,2]
170 ; SSE2-SSSE3-NEXT:    pand %xmm2, %xmm1
171 ; SSE2-SSSE3-NEXT:    por %xmm0, %xmm1
172 ; SSE2-SSSE3-NEXT:    movmskpd %xmm1, %eax
173 ; SSE2-SSSE3-NEXT:    # kill: def $al killed $al killed $eax
174 ; SSE2-SSSE3-NEXT:    retq
176 ; AVX1-LABEL: v2i8:
177 ; AVX1:       # %bb.0:
178 ; AVX1-NEXT:    vpsllq $56, %xmm1, %xmm1
179 ; AVX1-NEXT:    vpsrad $31, %xmm1, %xmm2
180 ; AVX1-NEXT:    vpsrad $24, %xmm1, %xmm1
181 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
182 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]
183 ; AVX1-NEXT:    vpsllq $56, %xmm0, %xmm0
184 ; AVX1-NEXT:    vpsrad $31, %xmm0, %xmm2
185 ; AVX1-NEXT:    vpsrad $24, %xmm0, %xmm0
186 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
187 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
188 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm0
189 ; AVX1-NEXT:    vmovmskpd %xmm0, %eax
190 ; AVX1-NEXT:    # kill: def $al killed $al killed $eax
191 ; AVX1-NEXT:    retq
193 ; AVX2-LABEL: v2i8:
194 ; AVX2:       # %bb.0:
195 ; AVX2-NEXT:    vpsllq $56, %xmm1, %xmm1
196 ; AVX2-NEXT:    vpsrad $31, %xmm1, %xmm2
197 ; AVX2-NEXT:    vpsrad $24, %xmm1, %xmm1
198 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
199 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm1 = xmm1[0],xmm2[1],xmm1[2],xmm2[3]
200 ; AVX2-NEXT:    vpsllq $56, %xmm0, %xmm0
201 ; AVX2-NEXT:    vpsrad $31, %xmm0, %xmm2
202 ; AVX2-NEXT:    vpsrad $24, %xmm0, %xmm0
203 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
204 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3]
205 ; AVX2-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm0
206 ; AVX2-NEXT:    vmovmskpd %xmm0, %eax
207 ; AVX2-NEXT:    # kill: def $al killed $al killed $eax
208 ; AVX2-NEXT:    retq
210 ; AVX512F-LABEL: v2i8:
211 ; AVX512F:       # %bb.0:
212 ; AVX512F-NEXT:    vpsllq $56, %xmm1, %xmm1
213 ; AVX512F-NEXT:    vpsraq $56, %xmm1, %xmm1
214 ; AVX512F-NEXT:    vpsllq $56, %xmm0, %xmm0
215 ; AVX512F-NEXT:    vpsraq $56, %xmm0, %xmm0
216 ; AVX512F-NEXT:    vpcmpgtq %xmm1, %xmm0, %k0
217 ; AVX512F-NEXT:    kmovw %k0, %eax
218 ; AVX512F-NEXT:    # kill: def $al killed $al killed $eax
219 ; AVX512F-NEXT:    retq
221 ; AVX512BW-LABEL: v2i8:
222 ; AVX512BW:       # %bb.0:
223 ; AVX512BW-NEXT:    vpsllq $56, %xmm1, %xmm1
224 ; AVX512BW-NEXT:    vpsraq $56, %xmm1, %xmm1
225 ; AVX512BW-NEXT:    vpsllq $56, %xmm0, %xmm0
226 ; AVX512BW-NEXT:    vpsraq $56, %xmm0, %xmm0
227 ; AVX512BW-NEXT:    vpcmpgtq %xmm1, %xmm0, %k0
228 ; AVX512BW-NEXT:    kmovd %k0, %eax
229 ; AVX512BW-NEXT:    # kill: def $al killed $al killed $eax
230 ; AVX512BW-NEXT:    retq
231   %x = icmp sgt <2 x i8> %a, %b
232   %res = bitcast <2 x i1> %x to i2
233   ret i2 %res
236 define i2 @v2i16(<2 x i16> %a, <2 x i16> %b) {
237 ; SSE2-SSSE3-LABEL: v2i16:
238 ; SSE2-SSSE3:       # %bb.0:
239 ; SSE2-SSSE3-NEXT:    psllq $48, %xmm0
240 ; SSE2-SSSE3-NEXT:    movdqa %xmm0, %xmm2
241 ; SSE2-SSSE3-NEXT:    psrad $31, %xmm2
242 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,3,2,3]
243 ; SSE2-SSSE3-NEXT:    psrad $16, %xmm0
244 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,3,2,3]
245 ; SSE2-SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
246 ; SSE2-SSSE3-NEXT:    psllq $48, %xmm1
247 ; SSE2-SSSE3-NEXT:    movdqa %xmm1, %xmm2
248 ; SSE2-SSSE3-NEXT:    psrad $31, %xmm2
249 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,3,2,3]
250 ; SSE2-SSSE3-NEXT:    psrad $16, %xmm1
251 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3]
252 ; SSE2-SSSE3-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
253 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
254 ; SSE2-SSSE3-NEXT:    pxor %xmm2, %xmm1
255 ; SSE2-SSSE3-NEXT:    pxor %xmm2, %xmm0
256 ; SSE2-SSSE3-NEXT:    movdqa %xmm0, %xmm2
257 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm1, %xmm2
258 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm1, %xmm0
259 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[0,0,2,2]
260 ; SSE2-SSSE3-NEXT:    pand %xmm2, %xmm1
261 ; SSE2-SSSE3-NEXT:    por %xmm0, %xmm1
262 ; SSE2-SSSE3-NEXT:    movmskpd %xmm1, %eax
263 ; SSE2-SSSE3-NEXT:    # kill: def $al killed $al killed $eax
264 ; SSE2-SSSE3-NEXT:    retq
266 ; AVX1-LABEL: v2i16:
267 ; AVX1:       # %bb.0:
268 ; AVX1-NEXT:    vpsllq $48, %xmm1, %xmm1
269 ; AVX1-NEXT:    vpsrad $31, %xmm1, %xmm2
270 ; AVX1-NEXT:    vpsrad $16, %xmm1, %xmm1
271 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
272 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]
273 ; AVX1-NEXT:    vpsllq $48, %xmm0, %xmm0
274 ; AVX1-NEXT:    vpsrad $31, %xmm0, %xmm2
275 ; AVX1-NEXT:    vpsrad $16, %xmm0, %xmm0
276 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
277 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
278 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm0
279 ; AVX1-NEXT:    vmovmskpd %xmm0, %eax
280 ; AVX1-NEXT:    # kill: def $al killed $al killed $eax
281 ; AVX1-NEXT:    retq
283 ; AVX2-LABEL: v2i16:
284 ; AVX2:       # %bb.0:
285 ; AVX2-NEXT:    vpsllq $48, %xmm1, %xmm1
286 ; AVX2-NEXT:    vpsrad $31, %xmm1, %xmm2
287 ; AVX2-NEXT:    vpsrad $16, %xmm1, %xmm1
288 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
289 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm1 = xmm1[0],xmm2[1],xmm1[2],xmm2[3]
290 ; AVX2-NEXT:    vpsllq $48, %xmm0, %xmm0
291 ; AVX2-NEXT:    vpsrad $31, %xmm0, %xmm2
292 ; AVX2-NEXT:    vpsrad $16, %xmm0, %xmm0
293 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
294 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3]
295 ; AVX2-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm0
296 ; AVX2-NEXT:    vmovmskpd %xmm0, %eax
297 ; AVX2-NEXT:    # kill: def $al killed $al killed $eax
298 ; AVX2-NEXT:    retq
300 ; AVX512F-LABEL: v2i16:
301 ; AVX512F:       # %bb.0:
302 ; AVX512F-NEXT:    vpsllq $48, %xmm1, %xmm1
303 ; AVX512F-NEXT:    vpsraq $48, %xmm1, %xmm1
304 ; AVX512F-NEXT:    vpsllq $48, %xmm0, %xmm0
305 ; AVX512F-NEXT:    vpsraq $48, %xmm0, %xmm0
306 ; AVX512F-NEXT:    vpcmpgtq %xmm1, %xmm0, %k0
307 ; AVX512F-NEXT:    kmovw %k0, %eax
308 ; AVX512F-NEXT:    # kill: def $al killed $al killed $eax
309 ; AVX512F-NEXT:    retq
311 ; AVX512BW-LABEL: v2i16:
312 ; AVX512BW:       # %bb.0:
313 ; AVX512BW-NEXT:    vpsllq $48, %xmm1, %xmm1
314 ; AVX512BW-NEXT:    vpsraq $48, %xmm1, %xmm1
315 ; AVX512BW-NEXT:    vpsllq $48, %xmm0, %xmm0
316 ; AVX512BW-NEXT:    vpsraq $48, %xmm0, %xmm0
317 ; AVX512BW-NEXT:    vpcmpgtq %xmm1, %xmm0, %k0
318 ; AVX512BW-NEXT:    kmovd %k0, %eax
319 ; AVX512BW-NEXT:    # kill: def $al killed $al killed $eax
320 ; AVX512BW-NEXT:    retq
321   %x = icmp sgt <2 x i16> %a, %b
322   %res = bitcast <2 x i1> %x to i2
323   ret i2 %res
326 define i2 @v2i32(<2 x i32> %a, <2 x i32> %b) {
327 ; SSE2-SSSE3-LABEL: v2i32:
328 ; SSE2-SSSE3:       # %bb.0:
329 ; SSE2-SSSE3-NEXT:    psllq $32, %xmm0
330 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,3,2,3]
331 ; SSE2-SSSE3-NEXT:    psrad $31, %xmm0
332 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,3,2,3]
333 ; SSE2-SSSE3-NEXT:    punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
334 ; SSE2-SSSE3-NEXT:    psllq $32, %xmm1
335 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,3,2,3]
336 ; SSE2-SSSE3-NEXT:    psrad $31, %xmm1
337 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3]
338 ; SSE2-SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
339 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648]
340 ; SSE2-SSSE3-NEXT:    pxor %xmm1, %xmm0
341 ; SSE2-SSSE3-NEXT:    pxor %xmm1, %xmm2
342 ; SSE2-SSSE3-NEXT:    movdqa %xmm2, %xmm1
343 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm0, %xmm1
344 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm0, %xmm2
345 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2]
346 ; SSE2-SSSE3-NEXT:    pand %xmm1, %xmm0
347 ; SSE2-SSSE3-NEXT:    por %xmm2, %xmm0
348 ; SSE2-SSSE3-NEXT:    movmskpd %xmm0, %eax
349 ; SSE2-SSSE3-NEXT:    # kill: def $al killed $al killed $eax
350 ; SSE2-SSSE3-NEXT:    retq
352 ; AVX1-LABEL: v2i32:
353 ; AVX1:       # %bb.0:
354 ; AVX1-NEXT:    vpsllq $32, %xmm1, %xmm2
355 ; AVX1-NEXT:    vpsrad $31, %xmm2, %xmm2
356 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]
357 ; AVX1-NEXT:    vpsllq $32, %xmm0, %xmm2
358 ; AVX1-NEXT:    vpsrad $31, %xmm2, %xmm2
359 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
360 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm0
361 ; AVX1-NEXT:    vmovmskpd %xmm0, %eax
362 ; AVX1-NEXT:    # kill: def $al killed $al killed $eax
363 ; AVX1-NEXT:    retq
365 ; AVX2-LABEL: v2i32:
366 ; AVX2:       # %bb.0:
367 ; AVX2-NEXT:    vpsllq $32, %xmm1, %xmm2
368 ; AVX2-NEXT:    vpsrad $31, %xmm2, %xmm2
369 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm1 = xmm1[0],xmm2[1],xmm1[2],xmm2[3]
370 ; AVX2-NEXT:    vpsllq $32, %xmm0, %xmm2
371 ; AVX2-NEXT:    vpsrad $31, %xmm2, %xmm2
372 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3]
373 ; AVX2-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm0
374 ; AVX2-NEXT:    vmovmskpd %xmm0, %eax
375 ; AVX2-NEXT:    # kill: def $al killed $al killed $eax
376 ; AVX2-NEXT:    retq
378 ; AVX512F-LABEL: v2i32:
379 ; AVX512F:       # %bb.0:
380 ; AVX512F-NEXT:    vpsllq $32, %xmm1, %xmm1
381 ; AVX512F-NEXT:    vpsraq $32, %xmm1, %xmm1
382 ; AVX512F-NEXT:    vpsllq $32, %xmm0, %xmm0
383 ; AVX512F-NEXT:    vpsraq $32, %xmm0, %xmm0
384 ; AVX512F-NEXT:    vpcmpgtq %xmm1, %xmm0, %k0
385 ; AVX512F-NEXT:    kmovw %k0, %eax
386 ; AVX512F-NEXT:    # kill: def $al killed $al killed $eax
387 ; AVX512F-NEXT:    retq
389 ; AVX512BW-LABEL: v2i32:
390 ; AVX512BW:       # %bb.0:
391 ; AVX512BW-NEXT:    vpsllq $32, %xmm1, %xmm1
392 ; AVX512BW-NEXT:    vpsraq $32, %xmm1, %xmm1
393 ; AVX512BW-NEXT:    vpsllq $32, %xmm0, %xmm0
394 ; AVX512BW-NEXT:    vpsraq $32, %xmm0, %xmm0
395 ; AVX512BW-NEXT:    vpcmpgtq %xmm1, %xmm0, %k0
396 ; AVX512BW-NEXT:    kmovd %k0, %eax
397 ; AVX512BW-NEXT:    # kill: def $al killed $al killed $eax
398 ; AVX512BW-NEXT:    retq
399   %x = icmp sgt <2 x i32> %a, %b
400   %res = bitcast <2 x i1> %x to i2
401   ret i2 %res
404 define i2 @v2i64(<2 x i64> %a, <2 x i64> %b) {
405 ; SSE2-SSSE3-LABEL: v2i64:
406 ; SSE2-SSSE3:       # %bb.0:
407 ; SSE2-SSSE3-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
408 ; SSE2-SSSE3-NEXT:    pxor %xmm2, %xmm1
409 ; SSE2-SSSE3-NEXT:    pxor %xmm2, %xmm0
410 ; SSE2-SSSE3-NEXT:    movdqa %xmm0, %xmm2
411 ; SSE2-SSSE3-NEXT:    pcmpeqd %xmm1, %xmm2
412 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm1, %xmm0
413 ; SSE2-SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[0,0,2,2]
414 ; SSE2-SSSE3-NEXT:    pand %xmm2, %xmm1
415 ; SSE2-SSSE3-NEXT:    por %xmm0, %xmm1
416 ; SSE2-SSSE3-NEXT:    movmskpd %xmm1, %eax
417 ; SSE2-SSSE3-NEXT:    # kill: def $al killed $al killed $eax
418 ; SSE2-SSSE3-NEXT:    retq
420 ; AVX12-LABEL: v2i64:
421 ; AVX12:       # %bb.0:
422 ; AVX12-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm0
423 ; AVX12-NEXT:    vmovmskpd %xmm0, %eax
424 ; AVX12-NEXT:    # kill: def $al killed $al killed $eax
425 ; AVX12-NEXT:    retq
427 ; AVX512F-LABEL: v2i64:
428 ; AVX512F:       # %bb.0:
429 ; AVX512F-NEXT:    vpcmpgtq %xmm1, %xmm0, %k0
430 ; AVX512F-NEXT:    kmovw %k0, %eax
431 ; AVX512F-NEXT:    # kill: def $al killed $al killed $eax
432 ; AVX512F-NEXT:    retq
434 ; AVX512BW-LABEL: v2i64:
435 ; AVX512BW:       # %bb.0:
436 ; AVX512BW-NEXT:    vpcmpgtq %xmm1, %xmm0, %k0
437 ; AVX512BW-NEXT:    kmovd %k0, %eax
438 ; AVX512BW-NEXT:    # kill: def $al killed $al killed $eax
439 ; AVX512BW-NEXT:    retq
440   %x = icmp sgt <2 x i64> %a, %b
441   %res = bitcast <2 x i1> %x to i2
442   ret i2 %res
445 define i2 @v2f64(<2 x double> %a, <2 x double> %b) {
446 ; SSE2-SSSE3-LABEL: v2f64:
447 ; SSE2-SSSE3:       # %bb.0:
448 ; SSE2-SSSE3-NEXT:    cmpltpd %xmm0, %xmm1
449 ; SSE2-SSSE3-NEXT:    movmskpd %xmm1, %eax
450 ; SSE2-SSSE3-NEXT:    # kill: def $al killed $al killed $eax
451 ; SSE2-SSSE3-NEXT:    retq
453 ; AVX12-LABEL: v2f64:
454 ; AVX12:       # %bb.0:
455 ; AVX12-NEXT:    vcmpltpd %xmm0, %xmm1, %xmm0
456 ; AVX12-NEXT:    vmovmskpd %xmm0, %eax
457 ; AVX12-NEXT:    # kill: def $al killed $al killed $eax
458 ; AVX12-NEXT:    retq
460 ; AVX512F-LABEL: v2f64:
461 ; AVX512F:       # %bb.0:
462 ; AVX512F-NEXT:    vcmpltpd %xmm0, %xmm1, %k0
463 ; AVX512F-NEXT:    kmovw %k0, %eax
464 ; AVX512F-NEXT:    # kill: def $al killed $al killed $eax
465 ; AVX512F-NEXT:    retq
467 ; AVX512BW-LABEL: v2f64:
468 ; AVX512BW:       # %bb.0:
469 ; AVX512BW-NEXT:    vcmpltpd %xmm0, %xmm1, %k0
470 ; AVX512BW-NEXT:    kmovd %k0, %eax
471 ; AVX512BW-NEXT:    # kill: def $al killed $al killed $eax
472 ; AVX512BW-NEXT:    retq
473   %x = fcmp ogt <2 x double> %a, %b
474   %res = bitcast <2 x i1> %x to i2
475   ret i2 %res
478 define i4 @v4i8(<4 x i8> %a, <4 x i8> %b) {
479 ; SSE2-SSSE3-LABEL: v4i8:
480 ; SSE2-SSSE3:       # %bb.0:
481 ; SSE2-SSSE3-NEXT:    pslld $24, %xmm1
482 ; SSE2-SSSE3-NEXT:    psrad $24, %xmm1
483 ; SSE2-SSSE3-NEXT:    pslld $24, %xmm0
484 ; SSE2-SSSE3-NEXT:    psrad $24, %xmm0
485 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm1, %xmm0
486 ; SSE2-SSSE3-NEXT:    movmskps %xmm0, %eax
487 ; SSE2-SSSE3-NEXT:    # kill: def $al killed $al killed $eax
488 ; SSE2-SSSE3-NEXT:    retq
490 ; AVX12-LABEL: v4i8:
491 ; AVX12:       # %bb.0:
492 ; AVX12-NEXT:    vpslld $24, %xmm1, %xmm1
493 ; AVX12-NEXT:    vpsrad $24, %xmm1, %xmm1
494 ; AVX12-NEXT:    vpslld $24, %xmm0, %xmm0
495 ; AVX12-NEXT:    vpsrad $24, %xmm0, %xmm0
496 ; AVX12-NEXT:    vpcmpgtd %xmm1, %xmm0, %xmm0
497 ; AVX12-NEXT:    vmovmskps %xmm0, %eax
498 ; AVX12-NEXT:    # kill: def $al killed $al killed $eax
499 ; AVX12-NEXT:    retq
501 ; AVX512F-LABEL: v4i8:
502 ; AVX512F:       # %bb.0:
503 ; AVX512F-NEXT:    vpslld $24, %xmm1, %xmm1
504 ; AVX512F-NEXT:    vpsrad $24, %xmm1, %xmm1
505 ; AVX512F-NEXT:    vpslld $24, %xmm0, %xmm0
506 ; AVX512F-NEXT:    vpsrad $24, %xmm0, %xmm0
507 ; AVX512F-NEXT:    vpcmpgtd %xmm1, %xmm0, %k0
508 ; AVX512F-NEXT:    kmovw %k0, %eax
509 ; AVX512F-NEXT:    # kill: def $al killed $al killed $eax
510 ; AVX512F-NEXT:    retq
512 ; AVX512BW-LABEL: v4i8:
513 ; AVX512BW:       # %bb.0:
514 ; AVX512BW-NEXT:    vpslld $24, %xmm1, %xmm1
515 ; AVX512BW-NEXT:    vpsrad $24, %xmm1, %xmm1
516 ; AVX512BW-NEXT:    vpslld $24, %xmm0, %xmm0
517 ; AVX512BW-NEXT:    vpsrad $24, %xmm0, %xmm0
518 ; AVX512BW-NEXT:    vpcmpgtd %xmm1, %xmm0, %k0
519 ; AVX512BW-NEXT:    kmovd %k0, %eax
520 ; AVX512BW-NEXT:    # kill: def $al killed $al killed $eax
521 ; AVX512BW-NEXT:    retq
522   %x = icmp sgt <4 x i8> %a, %b
523   %res = bitcast <4 x i1> %x to i4
524   ret i4 %res
527 define i4 @v4i16(<4 x i16> %a, <4 x i16> %b) {
528 ; SSE2-SSSE3-LABEL: v4i16:
529 ; SSE2-SSSE3:       # %bb.0:
530 ; SSE2-SSSE3-NEXT:    pslld $16, %xmm1
531 ; SSE2-SSSE3-NEXT:    psrad $16, %xmm1
532 ; SSE2-SSSE3-NEXT:    pslld $16, %xmm0
533 ; SSE2-SSSE3-NEXT:    psrad $16, %xmm0
534 ; SSE2-SSSE3-NEXT:    pcmpgtd %xmm1, %xmm0
535 ; SSE2-SSSE3-NEXT:    movmskps %xmm0, %eax
536 ; SSE2-SSSE3-NEXT:    # kill: def $al killed $al killed $eax
537 ; SSE2-SSSE3-NEXT:    retq
539 ; AVX12-LABEL: v4i16:
540 ; AVX12:       # %bb.0:
541 ; AVX12-NEXT:    vpslld $16, %xmm1, %xmm1
542 ; AVX12-NEXT:    vpsrad $16, %xmm1, %xmm1
543 ; AVX12-NEXT:    vpslld $16, %xmm0, %xmm0
544 ; AVX12-NEXT:    vpsrad $16, %xmm0, %xmm0
545 ; AVX12-NEXT:    vpcmpgtd %xmm1, %xmm0, %xmm0
546 ; AVX12-NEXT:    vmovmskps %xmm0, %eax
547 ; AVX12-NEXT:    # kill: def $al killed $al killed $eax
548 ; AVX12-NEXT:    retq
550 ; AVX512F-LABEL: v4i16:
551 ; AVX512F:       # %bb.0:
552 ; AVX512F-NEXT:    vpslld $16, %xmm1, %xmm1
553 ; AVX512F-NEXT:    vpsrad $16, %xmm1, %xmm1
554 ; AVX512F-NEXT:    vpslld $16, %xmm0, %xmm0
555 ; AVX512F-NEXT:    vpsrad $16, %xmm0, %xmm0
556 ; AVX512F-NEXT:    vpcmpgtd %xmm1, %xmm0, %k0
557 ; AVX512F-NEXT:    kmovw %k0, %eax
558 ; AVX512F-NEXT:    # kill: def $al killed $al killed $eax
559 ; AVX512F-NEXT:    retq
561 ; AVX512BW-LABEL: v4i16:
562 ; AVX512BW:       # %bb.0:
563 ; AVX512BW-NEXT:    vpslld $16, %xmm1, %xmm1
564 ; AVX512BW-NEXT:    vpsrad $16, %xmm1, %xmm1
565 ; AVX512BW-NEXT:    vpslld $16, %xmm0, %xmm0
566 ; AVX512BW-NEXT:    vpsrad $16, %xmm0, %xmm0
567 ; AVX512BW-NEXT:    vpcmpgtd %xmm1, %xmm0, %k0
568 ; AVX512BW-NEXT:    kmovd %k0, %eax
569 ; AVX512BW-NEXT:    # kill: def $al killed $al killed $eax
570 ; AVX512BW-NEXT:    retq
571   %x = icmp sgt <4 x i16> %a, %b
572   %res = bitcast <4 x i1> %x to i4
573   ret i4 %res
576 define i8 @v8i8(<8 x i8> %a, <8 x i8> %b) {
577 ; SSE2-SSSE3-LABEL: v8i8:
578 ; SSE2-SSSE3:       # %bb.0:
579 ; SSE2-SSSE3-NEXT:    psllw $8, %xmm1
580 ; SSE2-SSSE3-NEXT:    psraw $8, %xmm1
581 ; SSE2-SSSE3-NEXT:    psllw $8, %xmm0
582 ; SSE2-SSSE3-NEXT:    psraw $8, %xmm0
583 ; SSE2-SSSE3-NEXT:    pcmpgtw %xmm1, %xmm0
584 ; SSE2-SSSE3-NEXT:    packsswb %xmm0, %xmm0
585 ; SSE2-SSSE3-NEXT:    pmovmskb %xmm0, %eax
586 ; SSE2-SSSE3-NEXT:    # kill: def $al killed $al killed $eax
587 ; SSE2-SSSE3-NEXT:    retq
589 ; AVX12-LABEL: v8i8:
590 ; AVX12:       # %bb.0:
591 ; AVX12-NEXT:    vpsllw $8, %xmm1, %xmm1
592 ; AVX12-NEXT:    vpsraw $8, %xmm1, %xmm1
593 ; AVX12-NEXT:    vpsllw $8, %xmm0, %xmm0
594 ; AVX12-NEXT:    vpsraw $8, %xmm0, %xmm0
595 ; AVX12-NEXT:    vpcmpgtw %xmm1, %xmm0, %xmm0
596 ; AVX12-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
597 ; AVX12-NEXT:    vpmovmskb %xmm0, %eax
598 ; AVX12-NEXT:    # kill: def $al killed $al killed $eax
599 ; AVX12-NEXT:    retq
601 ; AVX512F-LABEL: v8i8:
602 ; AVX512F:       # %bb.0:
603 ; AVX512F-NEXT:    vpsllw $8, %xmm1, %xmm1
604 ; AVX512F-NEXT:    vpsraw $8, %xmm1, %xmm1
605 ; AVX512F-NEXT:    vpsllw $8, %xmm0, %xmm0
606 ; AVX512F-NEXT:    vpsraw $8, %xmm0, %xmm0
607 ; AVX512F-NEXT:    vpcmpgtw %xmm1, %xmm0, %xmm0
608 ; AVX512F-NEXT:    vpmovsxwd %xmm0, %ymm0
609 ; AVX512F-NEXT:    vptestmd %ymm0, %ymm0, %k0
610 ; AVX512F-NEXT:    kmovw %k0, %eax
611 ; AVX512F-NEXT:    # kill: def $al killed $al killed $eax
612 ; AVX512F-NEXT:    vzeroupper
613 ; AVX512F-NEXT:    retq
615 ; AVX512BW-LABEL: v8i8:
616 ; AVX512BW:       # %bb.0:
617 ; AVX512BW-NEXT:    vpsllw $8, %xmm1, %xmm1
618 ; AVX512BW-NEXT:    vpsraw $8, %xmm1, %xmm1
619 ; AVX512BW-NEXT:    vpsllw $8, %xmm0, %xmm0
620 ; AVX512BW-NEXT:    vpsraw $8, %xmm0, %xmm0
621 ; AVX512BW-NEXT:    vpcmpgtw %xmm1, %xmm0, %k0
622 ; AVX512BW-NEXT:    kmovd %k0, %eax
623 ; AVX512BW-NEXT:    # kill: def $al killed $al killed $eax
624 ; AVX512BW-NEXT:    retq
625   %x = icmp sgt <8 x i8> %a, %b
626   %res = bitcast <8 x i1> %x to i8
627   ret i8 %res
630 define i64 @v16i8_widened_with_zeroes(<16 x i8> %a, <16 x i8> %b) {
631 ; SSE2-SSSE3-LABEL: v16i8_widened_with_zeroes:
632 ; SSE2-SSSE3:       # %bb.0: # %entry
633 ; SSE2-SSSE3-NEXT:    pcmpeqb %xmm1, %xmm0
634 ; SSE2-SSSE3-NEXT:    pmovmskb %xmm0, %eax
635 ; SSE2-SSSE3-NEXT:    retq
637 ; AVX1-LABEL: v16i8_widened_with_zeroes:
638 ; AVX1:       # %bb.0: # %entry
639 ; AVX1-NEXT:    vpcmpeqb %xmm1, %xmm0, %xmm0
640 ; AVX1-NEXT:    vpmovmskb %xmm0, %eax
641 ; AVX1-NEXT:    retq
643 ; AVX2-LABEL: v16i8_widened_with_zeroes:
644 ; AVX2:       # %bb.0: # %entry
645 ; AVX2-NEXT:    vpcmpeqb %xmm1, %xmm0, %xmm0
646 ; AVX2-NEXT:    vpmovmskb %ymm0, %eax
647 ; AVX2-NEXT:    vzeroupper
648 ; AVX2-NEXT:    retq
650 ; AVX512F-LABEL: v16i8_widened_with_zeroes:
651 ; AVX512F:       # %bb.0: # %entry
652 ; AVX512F-NEXT:    vpcmpeqb %xmm1, %xmm0, %xmm0
653 ; AVX512F-NEXT:    vpmovsxbd %xmm0, %zmm0
654 ; AVX512F-NEXT:    vptestmd %zmm0, %zmm0, %k0
655 ; AVX512F-NEXT:    kmovw %k0, %eax
656 ; AVX512F-NEXT:    movzwl %ax, %eax
657 ; AVX512F-NEXT:    vzeroupper
658 ; AVX512F-NEXT:    retq
660 ; AVX512BW-LABEL: v16i8_widened_with_zeroes:
661 ; AVX512BW:       # %bb.0: # %entry
662 ; AVX512BW-NEXT:    vpcmpeqb %xmm1, %xmm0, %k0
663 ; AVX512BW-NEXT:    kmovq %k0, %rax
664 ; AVX512BW-NEXT:    retq
665 entry:
666   %c = icmp eq <16 x i8> %a, %b
667   %d = shufflevector <16 x i1> %c, <16 x i1> zeroinitializer, <64 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31>
668   %e = bitcast <64 x i1> %d to i64
669   ret i64 %e
672 define i64 @v16i8_widened_with_ones(<16 x i8> %a, <16 x i8> %b) {
673 ; SSE2-SSSE3-LABEL: v16i8_widened_with_ones:
674 ; SSE2-SSSE3:       # %bb.0: # %entry
675 ; SSE2-SSSE3-NEXT:    pcmpeqb %xmm1, %xmm0
676 ; SSE2-SSSE3-NEXT:    pmovmskb %xmm0, %ecx
677 ; SSE2-SSSE3-NEXT:    orl $-65536, %ecx # imm = 0xFFFF0000
678 ; SSE2-SSSE3-NEXT:    movabsq $-4294967296, %rax # imm = 0xFFFFFFFF00000000
679 ; SSE2-SSSE3-NEXT:    orq %rcx, %rax
680 ; SSE2-SSSE3-NEXT:    retq
682 ; AVX1-LABEL: v16i8_widened_with_ones:
683 ; AVX1:       # %bb.0: # %entry
684 ; AVX1-NEXT:    vpcmpeqb %xmm1, %xmm0, %xmm0
685 ; AVX1-NEXT:    vpsllw $7, %xmm0, %xmm0
686 ; AVX1-NEXT:    vpmovmskb %xmm0, %ecx
687 ; AVX1-NEXT:    orl $-65536, %ecx # imm = 0xFFFF0000
688 ; AVX1-NEXT:    movabsq $-4294967296, %rax # imm = 0xFFFFFFFF00000000
689 ; AVX1-NEXT:    orq %rcx, %rax
690 ; AVX1-NEXT:    retq
692 ; AVX2-LABEL: v16i8_widened_with_ones:
693 ; AVX2:       # %bb.0: # %entry
694 ; AVX2-NEXT:    vpcmpeqb %xmm1, %xmm0, %xmm0
695 ; AVX2-NEXT:    vinserti128 $1, {{.*}}(%rip), %ymm0, %ymm0
696 ; AVX2-NEXT:    vpsllw $7, %ymm0, %ymm0
697 ; AVX2-NEXT:    vpmovmskb %ymm0, %ecx
698 ; AVX2-NEXT:    movabsq $-4294967296, %rax # imm = 0xFFFFFFFF00000000
699 ; AVX2-NEXT:    orq %rcx, %rax
700 ; AVX2-NEXT:    vzeroupper
701 ; AVX2-NEXT:    retq
703 ; AVX512F-LABEL: v16i8_widened_with_ones:
704 ; AVX512F:       # %bb.0: # %entry
705 ; AVX512F-NEXT:    vpcmpeqb %xmm1, %xmm0, %xmm0
706 ; AVX512F-NEXT:    vpmovsxbd %xmm0, %zmm0
707 ; AVX512F-NEXT:    vptestmd %zmm0, %zmm0, %k0
708 ; AVX512F-NEXT:    kmovw %k0, %ecx
709 ; AVX512F-NEXT:    orl $-65536, %ecx # imm = 0xFFFF0000
710 ; AVX512F-NEXT:    movabsq $-4294967296, %rax # imm = 0xFFFFFFFF00000000
711 ; AVX512F-NEXT:    orq %rcx, %rax
712 ; AVX512F-NEXT:    vzeroupper
713 ; AVX512F-NEXT:    retq
715 ; AVX512BW-LABEL: v16i8_widened_with_ones:
716 ; AVX512BW:       # %bb.0: # %entry
717 ; AVX512BW-NEXT:    vpcmpeqb %xmm1, %xmm0, %k0
718 ; AVX512BW-NEXT:    kxnorw %k0, %k0, %k1
719 ; AVX512BW-NEXT:    kunpckwd %k0, %k1, %k0
720 ; AVX512BW-NEXT:    kxnord %k0, %k0, %k1
721 ; AVX512BW-NEXT:    kunpckdq %k0, %k1, %k0
722 ; AVX512BW-NEXT:    kmovq %k0, %rax
723 ; AVX512BW-NEXT:    retq
724 entry:
725   %c = icmp eq <16 x i8> %a, %b
726   %d = shufflevector <16 x i1> %c, <16 x i1> <i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1>, <64 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31>
727   %e = bitcast <64 x i1> %d to i64
728   ret i64 %e
731 define void @bitcast_16i8_store(i16* %p, <16 x i8> %a0) {
732 ; SSE2-SSSE3-LABEL: bitcast_16i8_store:
733 ; SSE2-SSSE3:       # %bb.0:
734 ; SSE2-SSSE3-NEXT:    pmovmskb %xmm0, %eax
735 ; SSE2-SSSE3-NEXT:    movw %ax, (%rdi)
736 ; SSE2-SSSE3-NEXT:    retq
738 ; AVX12-LABEL: bitcast_16i8_store:
739 ; AVX12:       # %bb.0:
740 ; AVX12-NEXT:    vpmovmskb %xmm0, %eax
741 ; AVX12-NEXT:    movw %ax, (%rdi)
742 ; AVX12-NEXT:    retq
744 ; AVX512F-LABEL: bitcast_16i8_store:
745 ; AVX512F:       # %bb.0:
746 ; AVX512F-NEXT:    vpxor %xmm1, %xmm1, %xmm1
747 ; AVX512F-NEXT:    vpcmpgtb %xmm0, %xmm1, %xmm0
748 ; AVX512F-NEXT:    vpmovsxbd %xmm0, %zmm0
749 ; AVX512F-NEXT:    vptestmd %zmm0, %zmm0, %k0
750 ; AVX512F-NEXT:    kmovw %k0, (%rdi)
751 ; AVX512F-NEXT:    vzeroupper
752 ; AVX512F-NEXT:    retq
754 ; AVX512BW-LABEL: bitcast_16i8_store:
755 ; AVX512BW:       # %bb.0:
756 ; AVX512BW-NEXT:    vpmovb2m %xmm0, %k0
757 ; AVX512BW-NEXT:    kmovw %k0, (%rdi)
758 ; AVX512BW-NEXT:    retq
759   %a1 = icmp slt <16 x i8> %a0, zeroinitializer
760   %a2 = bitcast <16 x i1> %a1 to i16
761   store i16 %a2, i16* %p
762   ret void
765 define void @bitcast_8i16_store(i8* %p, <8 x i16> %a0) {
766 ; SSE2-SSSE3-LABEL: bitcast_8i16_store:
767 ; SSE2-SSSE3:       # %bb.0:
768 ; SSE2-SSSE3-NEXT:    pxor %xmm1, %xmm1
769 ; SSE2-SSSE3-NEXT:    pcmpgtw %xmm0, %xmm1
770 ; SSE2-SSSE3-NEXT:    packsswb %xmm0, %xmm1
771 ; SSE2-SSSE3-NEXT:    pmovmskb %xmm1, %eax
772 ; SSE2-SSSE3-NEXT:    movb %al, (%rdi)
773 ; SSE2-SSSE3-NEXT:    retq
775 ; AVX12-LABEL: bitcast_8i16_store:
776 ; AVX12:       # %bb.0:
777 ; AVX12-NEXT:    vpxor %xmm1, %xmm1, %xmm1
778 ; AVX12-NEXT:    vpcmpgtw %xmm0, %xmm1, %xmm0
779 ; AVX12-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
780 ; AVX12-NEXT:    vpmovmskb %xmm0, %eax
781 ; AVX12-NEXT:    movb %al, (%rdi)
782 ; AVX12-NEXT:    retq
784 ; AVX512F-LABEL: bitcast_8i16_store:
785 ; AVX512F:       # %bb.0:
786 ; AVX512F-NEXT:    vpxor %xmm1, %xmm1, %xmm1
787 ; AVX512F-NEXT:    vpcmpgtw %xmm0, %xmm1, %xmm0
788 ; AVX512F-NEXT:    vpmovsxwd %xmm0, %ymm0
789 ; AVX512F-NEXT:    vptestmd %ymm0, %ymm0, %k0
790 ; AVX512F-NEXT:    kmovw %k0, %eax
791 ; AVX512F-NEXT:    movb %al, (%rdi)
792 ; AVX512F-NEXT:    vzeroupper
793 ; AVX512F-NEXT:    retq
795 ; AVX512BW-LABEL: bitcast_8i16_store:
796 ; AVX512BW:       # %bb.0:
797 ; AVX512BW-NEXT:    vpmovw2m %xmm0, %k0
798 ; AVX512BW-NEXT:    kmovd %k0, %eax
799 ; AVX512BW-NEXT:    movb %al, (%rdi)
800 ; AVX512BW-NEXT:    retq
801   %a1 = icmp slt <8 x i16> %a0, zeroinitializer
802   %a2 = bitcast <8 x i1> %a1 to i8
803   store i8 %a2, i8* %p
804   ret void
807 define void @bitcast_4i32_store(i4* %p, <4 x i32> %a0) {
808 ; SSE2-SSSE3-LABEL: bitcast_4i32_store:
809 ; SSE2-SSSE3:       # %bb.0:
810 ; SSE2-SSSE3-NEXT:    movmskps %xmm0, %eax
811 ; SSE2-SSSE3-NEXT:    movb %al, (%rdi)
812 ; SSE2-SSSE3-NEXT:    retq
814 ; AVX12-LABEL: bitcast_4i32_store:
815 ; AVX12:       # %bb.0:
816 ; AVX12-NEXT:    vmovmskps %xmm0, %eax
817 ; AVX12-NEXT:    movb %al, (%rdi)
818 ; AVX12-NEXT:    retq
820 ; AVX512F-LABEL: bitcast_4i32_store:
821 ; AVX512F:       # %bb.0:
822 ; AVX512F-NEXT:    vpxor %xmm1, %xmm1, %xmm1
823 ; AVX512F-NEXT:    vpcmpgtd %xmm0, %xmm1, %k0
824 ; AVX512F-NEXT:    kmovw %k0, %eax
825 ; AVX512F-NEXT:    movb %al, (%rdi)
826 ; AVX512F-NEXT:    retq
828 ; AVX512BW-LABEL: bitcast_4i32_store:
829 ; AVX512BW:       # %bb.0:
830 ; AVX512BW-NEXT:    vpxor %xmm1, %xmm1, %xmm1
831 ; AVX512BW-NEXT:    vpcmpgtd %xmm0, %xmm1, %k0
832 ; AVX512BW-NEXT:    kmovd %k0, %eax
833 ; AVX512BW-NEXT:    movb %al, (%rdi)
834 ; AVX512BW-NEXT:    retq
835   %a1 = icmp slt <4 x i32> %a0, zeroinitializer
836   %a2 = bitcast <4 x i1> %a1 to i4
837   store i4 %a2, i4* %p
838   ret void
841 define void @bitcast_2i64_store(i2* %p, <2 x i64> %a0) {
842 ; SSE2-SSSE3-LABEL: bitcast_2i64_store:
843 ; SSE2-SSSE3:       # %bb.0:
844 ; SSE2-SSSE3-NEXT:    movmskpd %xmm0, %eax
845 ; SSE2-SSSE3-NEXT:    movb %al, (%rdi)
846 ; SSE2-SSSE3-NEXT:    retq
848 ; AVX12-LABEL: bitcast_2i64_store:
849 ; AVX12:       # %bb.0:
850 ; AVX12-NEXT:    vmovmskpd %xmm0, %eax
851 ; AVX12-NEXT:    movb %al, (%rdi)
852 ; AVX12-NEXT:    retq
854 ; AVX512F-LABEL: bitcast_2i64_store:
855 ; AVX512F:       # %bb.0:
856 ; AVX512F-NEXT:    vpxor %xmm1, %xmm1, %xmm1
857 ; AVX512F-NEXT:    vpcmpgtq %xmm0, %xmm1, %k0
858 ; AVX512F-NEXT:    kmovw %k0, %eax
859 ; AVX512F-NEXT:    movb %al, (%rdi)
860 ; AVX512F-NEXT:    retq
862 ; AVX512BW-LABEL: bitcast_2i64_store:
863 ; AVX512BW:       # %bb.0:
864 ; AVX512BW-NEXT:    vpxor %xmm1, %xmm1, %xmm1
865 ; AVX512BW-NEXT:    vpcmpgtq %xmm0, %xmm1, %k0
866 ; AVX512BW-NEXT:    kmovd %k0, %eax
867 ; AVX512BW-NEXT:    movb %al, (%rdi)
868 ; AVX512BW-NEXT:    retq
869   %a1 = icmp slt <2 x i64> %a0, zeroinitializer
870   %a2 = bitcast <2 x i1> %a1 to i2
871   store i2 %a2, i2* %p
872   ret void