Revert r354244 "[DAGCombiner] Eliminate dead stores to stack."
[llvm-complete.git] / test / CodeGen / X86 / vector-compare-all_of.ll
blob9e6b22340c4f10748c9dee21916c799402befe2a
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+sse4.2 | FileCheck %s --check-prefix=SSE
3 ; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx | FileCheck %s --check-prefix=AVX --check-prefix=AVX1
4 ; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx2 | FileCheck %s --check-prefix=AVX --check-prefix=AVX2
5 ; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx512f,+avx512bw,+avx512vl | FileCheck %s --check-prefix=AVX512
7 define i64 @test_v2f64_sext(<2 x double> %a0, <2 x double> %a1) {
8 ; SSE-LABEL: test_v2f64_sext:
9 ; SSE:       # %bb.0:
10 ; SSE-NEXT:    cmpltpd %xmm0, %xmm1
11 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
12 ; SSE-NEXT:    pand %xmm1, %xmm0
13 ; SSE-NEXT:    movq %xmm0, %rax
14 ; SSE-NEXT:    retq
16 ; AVX-LABEL: test_v2f64_sext:
17 ; AVX:       # %bb.0:
18 ; AVX-NEXT:    vcmpltpd %xmm0, %xmm1, %xmm0
19 ; AVX-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm0[1,0]
20 ; AVX-NEXT:    vandpd %xmm1, %xmm0, %xmm0
21 ; AVX-NEXT:    vmovq %xmm0, %rax
22 ; AVX-NEXT:    retq
24 ; AVX512-LABEL: test_v2f64_sext:
25 ; AVX512:       # %bb.0:
26 ; AVX512-NEXT:    vcmpltpd %xmm0, %xmm1, %xmm0
27 ; AVX512-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[2,3,0,1]
28 ; AVX512-NEXT:    vandpd %xmm1, %xmm0, %xmm0
29 ; AVX512-NEXT:    vmovq %xmm0, %rax
30 ; AVX512-NEXT:    retq
31   %c = fcmp ogt <2 x double> %a0, %a1
32   %s = sext <2 x i1> %c to <2 x i64>
33   %1 = shufflevector <2 x i64> %s, <2 x i64> undef, <2 x i32> <i32 1, i32 undef>
34   %2 = and <2 x i64> %s, %1
35   %3 = extractelement <2 x i64> %2, i32 0
36   ret i64 %3
39 define i64 @test_v4f64_sext(<4 x double> %a0, <4 x double> %a1) {
40 ; SSE-LABEL: test_v4f64_sext:
41 ; SSE:       # %bb.0:
42 ; SSE-NEXT:    cmpltpd %xmm1, %xmm3
43 ; SSE-NEXT:    cmpltpd %xmm0, %xmm2
44 ; SSE-NEXT:    andpd %xmm3, %xmm2
45 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,0,1]
46 ; SSE-NEXT:    pand %xmm2, %xmm0
47 ; SSE-NEXT:    movq %xmm0, %rax
48 ; SSE-NEXT:    retq
50 ; AVX-LABEL: test_v4f64_sext:
51 ; AVX:       # %bb.0:
52 ; AVX-NEXT:    vcmpltpd %ymm0, %ymm1, %ymm0
53 ; AVX-NEXT:    vmovmskpd %ymm0, %eax
54 ; AVX-NEXT:    xorl %ecx, %ecx
55 ; AVX-NEXT:    cmpl $15, %eax
56 ; AVX-NEXT:    movq $-1, %rax
57 ; AVX-NEXT:    cmovneq %rcx, %rax
58 ; AVX-NEXT:    vzeroupper
59 ; AVX-NEXT:    retq
61 ; AVX512-LABEL: test_v4f64_sext:
62 ; AVX512:       # %bb.0:
63 ; AVX512-NEXT:    vcmpltpd %ymm0, %ymm1, %ymm0
64 ; AVX512-NEXT:    vextractf128 $1, %ymm0, %xmm1
65 ; AVX512-NEXT:    vandpd %xmm1, %xmm0, %xmm0
66 ; AVX512-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[2,3,0,1]
67 ; AVX512-NEXT:    vandpd %xmm1, %xmm0, %xmm0
68 ; AVX512-NEXT:    vmovq %xmm0, %rax
69 ; AVX512-NEXT:    vzeroupper
70 ; AVX512-NEXT:    retq
71   %c = fcmp ogt <4 x double> %a0, %a1
72   %s = sext <4 x i1> %c to <4 x i64>
73   %1 = shufflevector <4 x i64> %s, <4 x i64> undef, <4 x i32> <i32 2, i32 3, i32 undef, i32 undef>
74   %2 = and <4 x i64> %s, %1
75   %3 = shufflevector <4 x i64> %2, <4 x i64> undef, <4 x i32> <i32 1, i32 undef, i32 undef, i32 undef>
76   %4 = and <4 x i64> %2, %3
77   %5 = extractelement <4 x i64> %4, i64 0
78   ret i64 %5
81 define i64 @test_v4f64_legal_sext(<4 x double> %a0, <4 x double> %a1) {
82 ; SSE-LABEL: test_v4f64_legal_sext:
83 ; SSE:       # %bb.0:
84 ; SSE-NEXT:    cmpltpd %xmm1, %xmm3
85 ; SSE-NEXT:    cmpltpd %xmm0, %xmm2
86 ; SSE-NEXT:    packssdw %xmm3, %xmm2
87 ; SSE-NEXT:    movmskps %xmm2, %eax
88 ; SSE-NEXT:    xorl %ecx, %ecx
89 ; SSE-NEXT:    cmpl $15, %eax
90 ; SSE-NEXT:    movq $-1, %rax
91 ; SSE-NEXT:    cmovneq %rcx, %rax
92 ; SSE-NEXT:    retq
94 ; AVX-LABEL: test_v4f64_legal_sext:
95 ; AVX:       # %bb.0:
96 ; AVX-NEXT:    vcmpltpd %ymm0, %ymm1, %ymm0
97 ; AVX-NEXT:    vextractf128 $1, %ymm0, %xmm1
98 ; AVX-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0
99 ; AVX-NEXT:    vmovmskps %xmm0, %eax
100 ; AVX-NEXT:    xorl %ecx, %ecx
101 ; AVX-NEXT:    cmpl $15, %eax
102 ; AVX-NEXT:    movq $-1, %rax
103 ; AVX-NEXT:    cmovneq %rcx, %rax
104 ; AVX-NEXT:    vzeroupper
105 ; AVX-NEXT:    retq
107 ; AVX512-LABEL: test_v4f64_legal_sext:
108 ; AVX512:       # %bb.0:
109 ; AVX512-NEXT:    vcmpltpd %ymm0, %ymm1, %k1
110 ; AVX512-NEXT:    vpcmpeqd %xmm0, %xmm0, %xmm0
111 ; AVX512-NEXT:    vmovdqa32 %xmm0, %xmm0 {%k1} {z}
112 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
113 ; AVX512-NEXT:    vpand %xmm1, %xmm0, %xmm0
114 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
115 ; AVX512-NEXT:    vpand %xmm1, %xmm0, %xmm0
116 ; AVX512-NEXT:    vmovd %xmm0, %eax
117 ; AVX512-NEXT:    cltq
118 ; AVX512-NEXT:    vzeroupper
119 ; AVX512-NEXT:    retq
120   %c = fcmp ogt <4 x double> %a0, %a1
121   %s = sext <4 x i1> %c to <4 x i32>
122   %1 = shufflevector <4 x i32> %s, <4 x i32> undef, <4 x i32> <i32 2, i32 3, i32 undef, i32 undef>
123   %2 = and <4 x i32> %s, %1
124   %3 = shufflevector <4 x i32> %2, <4 x i32> undef, <4 x i32> <i32 1, i32 undef, i32 undef, i32 undef>
125   %4 = and <4 x i32> %2, %3
126   %5 = extractelement <4 x i32> %4, i64 0
127   %6 = sext i32 %5 to i64
128   ret i64 %6
131 define i32 @test_v4f32_sext(<4 x float> %a0, <4 x float> %a1) {
132 ; SSE-LABEL: test_v4f32_sext:
133 ; SSE:       # %bb.0:
134 ; SSE-NEXT:    cmpltps %xmm0, %xmm1
135 ; SSE-NEXT:    movmskps %xmm1, %eax
136 ; SSE-NEXT:    xorl %ecx, %ecx
137 ; SSE-NEXT:    cmpl $15, %eax
138 ; SSE-NEXT:    movl $-1, %eax
139 ; SSE-NEXT:    cmovnel %ecx, %eax
140 ; SSE-NEXT:    retq
142 ; AVX-LABEL: test_v4f32_sext:
143 ; AVX:       # %bb.0:
144 ; AVX-NEXT:    vcmpltps %xmm0, %xmm1, %xmm0
145 ; AVX-NEXT:    vmovmskps %xmm0, %eax
146 ; AVX-NEXT:    xorl %ecx, %ecx
147 ; AVX-NEXT:    cmpl $15, %eax
148 ; AVX-NEXT:    movl $-1, %eax
149 ; AVX-NEXT:    cmovnel %ecx, %eax
150 ; AVX-NEXT:    retq
152 ; AVX512-LABEL: test_v4f32_sext:
153 ; AVX512:       # %bb.0:
154 ; AVX512-NEXT:    vcmpltps %xmm0, %xmm1, %xmm0
155 ; AVX512-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[2,3,0,1]
156 ; AVX512-NEXT:    vandps %xmm1, %xmm0, %xmm0
157 ; AVX512-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[1,1,2,3]
158 ; AVX512-NEXT:    vandps %xmm1, %xmm0, %xmm0
159 ; AVX512-NEXT:    vmovd %xmm0, %eax
160 ; AVX512-NEXT:    retq
161   %c = fcmp ogt <4 x float> %a0, %a1
162   %s = sext <4 x i1> %c to <4 x i32>
163   %1 = shufflevector <4 x i32> %s, <4 x i32> undef, <4 x i32> <i32 2, i32 3, i32 undef, i32 undef>
164   %2 = and <4 x i32> %s, %1
165   %3 = shufflevector <4 x i32> %2, <4 x i32> undef, <4 x i32> <i32 1, i32 undef, i32 undef, i32 undef>
166   %4 = and <4 x i32> %2, %3
167   %5 = extractelement <4 x i32> %4, i32 0
168   ret i32 %5
171 define i32 @test_v8f32_sext(<8 x float> %a0, <8 x float> %a1) {
172 ; SSE-LABEL: test_v8f32_sext:
173 ; SSE:       # %bb.0:
174 ; SSE-NEXT:    cmpltps %xmm1, %xmm3
175 ; SSE-NEXT:    cmpltps %xmm0, %xmm2
176 ; SSE-NEXT:    andps %xmm3, %xmm2
177 ; SSE-NEXT:    movmskps %xmm2, %eax
178 ; SSE-NEXT:    xorl %ecx, %ecx
179 ; SSE-NEXT:    cmpl $15, %eax
180 ; SSE-NEXT:    movl $-1, %eax
181 ; SSE-NEXT:    cmovnel %ecx, %eax
182 ; SSE-NEXT:    retq
184 ; AVX-LABEL: test_v8f32_sext:
185 ; AVX:       # %bb.0:
186 ; AVX-NEXT:    vcmpltps %ymm0, %ymm1, %ymm0
187 ; AVX-NEXT:    vmovmskps %ymm0, %eax
188 ; AVX-NEXT:    xorl %ecx, %ecx
189 ; AVX-NEXT:    cmpl $255, %eax
190 ; AVX-NEXT:    movl $-1, %eax
191 ; AVX-NEXT:    cmovnel %ecx, %eax
192 ; AVX-NEXT:    vzeroupper
193 ; AVX-NEXT:    retq
195 ; AVX512-LABEL: test_v8f32_sext:
196 ; AVX512:       # %bb.0:
197 ; AVX512-NEXT:    vcmpltps %ymm0, %ymm1, %ymm0
198 ; AVX512-NEXT:    vextractf128 $1, %ymm0, %xmm1
199 ; AVX512-NEXT:    vandps %xmm1, %xmm0, %xmm0
200 ; AVX512-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[2,3,0,1]
201 ; AVX512-NEXT:    vandps %xmm1, %xmm0, %xmm0
202 ; AVX512-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[1,1,2,3]
203 ; AVX512-NEXT:    vandps %xmm1, %xmm0, %xmm0
204 ; AVX512-NEXT:    vmovd %xmm0, %eax
205 ; AVX512-NEXT:    vzeroupper
206 ; AVX512-NEXT:    retq
207   %c = fcmp ogt <8 x float> %a0, %a1
208   %s = sext <8 x i1> %c to <8 x i32>
209   %1 = shufflevector <8 x i32> %s, <8 x i32> undef, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef>
210   %2 = and <8 x i32> %s, %1
211   %3 = shufflevector <8 x i32> %2, <8 x i32> undef, <8 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
212   %4 = and <8 x i32> %2, %3
213   %5 = shufflevector <8 x i32> %4, <8 x i32> undef, <8 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
214   %6 = and <8 x i32> %4, %5
215   %7 = extractelement <8 x i32> %6, i32 0
216   ret i32 %7
219 define i32 @test_v8f32_legal_sext(<8 x float> %a0, <8 x float> %a1) {
220 ; SSE-LABEL: test_v8f32_legal_sext:
221 ; SSE:       # %bb.0:
222 ; SSE-NEXT:    cmpltps %xmm1, %xmm3
223 ; SSE-NEXT:    cmpltps %xmm0, %xmm2
224 ; SSE-NEXT:    packssdw %xmm3, %xmm2
225 ; SSE-NEXT:    pmovmskb %xmm2, %eax
226 ; SSE-NEXT:    xorl %ecx, %ecx
227 ; SSE-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
228 ; SSE-NEXT:    movl $-1, %eax
229 ; SSE-NEXT:    cmovnel %ecx, %eax
230 ; SSE-NEXT:    retq
232 ; AVX-LABEL: test_v8f32_legal_sext:
233 ; AVX:       # %bb.0:
234 ; AVX-NEXT:    vcmpltps %ymm0, %ymm1, %ymm0
235 ; AVX-NEXT:    vextractf128 $1, %ymm0, %xmm1
236 ; AVX-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0
237 ; AVX-NEXT:    vpmovmskb %xmm0, %eax
238 ; AVX-NEXT:    xorl %ecx, %ecx
239 ; AVX-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
240 ; AVX-NEXT:    movl $-1, %eax
241 ; AVX-NEXT:    cmovnel %ecx, %eax
242 ; AVX-NEXT:    vzeroupper
243 ; AVX-NEXT:    retq
245 ; AVX512-LABEL: test_v8f32_legal_sext:
246 ; AVX512:       # %bb.0:
247 ; AVX512-NEXT:    vcmpltps %ymm0, %ymm1, %k0
248 ; AVX512-NEXT:    vpmovm2w %k0, %xmm0
249 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
250 ; AVX512-NEXT:    vpand %xmm1, %xmm0, %xmm0
251 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
252 ; AVX512-NEXT:    vpand %xmm1, %xmm0, %xmm0
253 ; AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1
254 ; AVX512-NEXT:    vpand %xmm1, %xmm0, %xmm0
255 ; AVX512-NEXT:    vmovd %xmm0, %eax
256 ; AVX512-NEXT:    cwtl
257 ; AVX512-NEXT:    vzeroupper
258 ; AVX512-NEXT:    retq
259   %c = fcmp ogt <8 x float> %a0, %a1
260   %s = sext <8 x i1> %c to <8 x i16>
261   %1 = shufflevector <8 x i16> %s, <8 x i16> undef, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef>
262   %2 = and <8 x i16> %s, %1
263   %3 = shufflevector <8 x i16> %2, <8 x i16> undef, <8 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
264   %4 = and <8 x i16> %2, %3
265   %5 = shufflevector <8 x i16> %4, <8 x i16> undef, <8 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
266   %6 = and <8 x i16> %4, %5
267   %7 = extractelement <8 x i16> %6, i32 0
268   %8 = sext i16 %7 to i32
269   ret i32 %8
272 define i64 @test_v2i64_sext(<2 x i64> %a0, <2 x i64> %a1) {
273 ; SSE-LABEL: test_v2i64_sext:
274 ; SSE:       # %bb.0:
275 ; SSE-NEXT:    pcmpgtq %xmm1, %xmm0
276 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
277 ; SSE-NEXT:    pand %xmm0, %xmm1
278 ; SSE-NEXT:    movq %xmm1, %rax
279 ; SSE-NEXT:    retq
281 ; AVX-LABEL: test_v2i64_sext:
282 ; AVX:       # %bb.0:
283 ; AVX-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm0
284 ; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
285 ; AVX-NEXT:    vpand %xmm1, %xmm0, %xmm0
286 ; AVX-NEXT:    vmovq %xmm0, %rax
287 ; AVX-NEXT:    retq
289 ; AVX512-LABEL: test_v2i64_sext:
290 ; AVX512:       # %bb.0:
291 ; AVX512-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm0
292 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
293 ; AVX512-NEXT:    vpand %xmm1, %xmm0, %xmm0
294 ; AVX512-NEXT:    vmovq %xmm0, %rax
295 ; AVX512-NEXT:    retq
296   %c = icmp sgt <2 x i64> %a0, %a1
297   %s = sext <2 x i1> %c to <2 x i64>
298   %1 = shufflevector <2 x i64> %s, <2 x i64> undef, <2 x i32> <i32 1, i32 undef>
299   %2 = and <2 x i64> %s, %1
300   %3 = extractelement <2 x i64> %2, i32 0
301   ret i64 %3
304 define i64 @test_v4i64_sext(<4 x i64> %a0, <4 x i64> %a1) {
305 ; SSE-LABEL: test_v4i64_sext:
306 ; SSE:       # %bb.0:
307 ; SSE-NEXT:    pcmpgtq %xmm3, %xmm1
308 ; SSE-NEXT:    pcmpgtq %xmm2, %xmm0
309 ; SSE-NEXT:    pand %xmm1, %xmm0
310 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
311 ; SSE-NEXT:    pand %xmm0, %xmm1
312 ; SSE-NEXT:    movq %xmm1, %rax
313 ; SSE-NEXT:    retq
315 ; AVX1-LABEL: test_v4i64_sext:
316 ; AVX1:       # %bb.0:
317 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
318 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
319 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
320 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm0
321 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
322 ; AVX1-NEXT:    vmovmskpd %ymm0, %eax
323 ; AVX1-NEXT:    xorl %ecx, %ecx
324 ; AVX1-NEXT:    cmpl $15, %eax
325 ; AVX1-NEXT:    movq $-1, %rax
326 ; AVX1-NEXT:    cmovneq %rcx, %rax
327 ; AVX1-NEXT:    vzeroupper
328 ; AVX1-NEXT:    retq
330 ; AVX2-LABEL: test_v4i64_sext:
331 ; AVX2:       # %bb.0:
332 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm0, %ymm0
333 ; AVX2-NEXT:    vmovmskpd %ymm0, %eax
334 ; AVX2-NEXT:    xorl %ecx, %ecx
335 ; AVX2-NEXT:    cmpl $15, %eax
336 ; AVX2-NEXT:    movq $-1, %rax
337 ; AVX2-NEXT:    cmovneq %rcx, %rax
338 ; AVX2-NEXT:    vzeroupper
339 ; AVX2-NEXT:    retq
341 ; AVX512-LABEL: test_v4i64_sext:
342 ; AVX512:       # %bb.0:
343 ; AVX512-NEXT:    vpcmpgtq %ymm1, %ymm0, %ymm0
344 ; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
345 ; AVX512-NEXT:    vpand %xmm1, %xmm0, %xmm0
346 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
347 ; AVX512-NEXT:    vpand %xmm1, %xmm0, %xmm0
348 ; AVX512-NEXT:    vmovq %xmm0, %rax
349 ; AVX512-NEXT:    vzeroupper
350 ; AVX512-NEXT:    retq
351   %c = icmp sgt <4 x i64> %a0, %a1
352   %s = sext <4 x i1> %c to <4 x i64>
353   %1 = shufflevector <4 x i64> %s, <4 x i64> undef, <4 x i32> <i32 2, i32 3, i32 undef, i32 undef>
354   %2 = and <4 x i64> %s, %1
355   %3 = shufflevector <4 x i64> %2, <4 x i64> undef, <4 x i32> <i32 1, i32 undef, i32 undef, i32 undef>
356   %4 = and <4 x i64> %2, %3
357   %5 = extractelement <4 x i64> %4, i64 0
358   ret i64 %5
361 define i64 @test_v4i64_legal_sext(<4 x i64> %a0, <4 x i64> %a1) {
362 ; SSE-LABEL: test_v4i64_legal_sext:
363 ; SSE:       # %bb.0:
364 ; SSE-NEXT:    pcmpgtq %xmm3, %xmm1
365 ; SSE-NEXT:    pcmpgtq %xmm2, %xmm0
366 ; SSE-NEXT:    packssdw %xmm1, %xmm0
367 ; SSE-NEXT:    movmskps %xmm0, %eax
368 ; SSE-NEXT:    xorl %ecx, %ecx
369 ; SSE-NEXT:    cmpl $15, %eax
370 ; SSE-NEXT:    movq $-1, %rax
371 ; SSE-NEXT:    cmovneq %rcx, %rax
372 ; SSE-NEXT:    retq
374 ; AVX1-LABEL: test_v4i64_legal_sext:
375 ; AVX1:       # %bb.0:
376 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
377 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
378 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
379 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm0
380 ; AVX1-NEXT:    vpackssdw %xmm2, %xmm0, %xmm0
381 ; AVX1-NEXT:    vmovmskps %xmm0, %eax
382 ; AVX1-NEXT:    xorl %ecx, %ecx
383 ; AVX1-NEXT:    cmpl $15, %eax
384 ; AVX1-NEXT:    movq $-1, %rax
385 ; AVX1-NEXT:    cmovneq %rcx, %rax
386 ; AVX1-NEXT:    vzeroupper
387 ; AVX1-NEXT:    retq
389 ; AVX2-LABEL: test_v4i64_legal_sext:
390 ; AVX2:       # %bb.0:
391 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm0, %ymm0
392 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
393 ; AVX2-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0
394 ; AVX2-NEXT:    vmovmskps %xmm0, %eax
395 ; AVX2-NEXT:    xorl %ecx, %ecx
396 ; AVX2-NEXT:    cmpl $15, %eax
397 ; AVX2-NEXT:    movq $-1, %rax
398 ; AVX2-NEXT:    cmovneq %rcx, %rax
399 ; AVX2-NEXT:    vzeroupper
400 ; AVX2-NEXT:    retq
402 ; AVX512-LABEL: test_v4i64_legal_sext:
403 ; AVX512:       # %bb.0:
404 ; AVX512-NEXT:    vpcmpgtq %ymm1, %ymm0, %k1
405 ; AVX512-NEXT:    vpcmpeqd %xmm0, %xmm0, %xmm0
406 ; AVX512-NEXT:    vmovdqa32 %xmm0, %xmm0 {%k1} {z}
407 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
408 ; AVX512-NEXT:    vpand %xmm1, %xmm0, %xmm0
409 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
410 ; AVX512-NEXT:    vpand %xmm1, %xmm0, %xmm0
411 ; AVX512-NEXT:    vmovd %xmm0, %eax
412 ; AVX512-NEXT:    cltq
413 ; AVX512-NEXT:    vzeroupper
414 ; AVX512-NEXT:    retq
415   %c = icmp sgt <4 x i64> %a0, %a1
416   %s = sext <4 x i1> %c to <4 x i32>
417   %1 = shufflevector <4 x i32> %s, <4 x i32> undef, <4 x i32> <i32 2, i32 3, i32 undef, i32 undef>
418   %2 = and <4 x i32> %s, %1
419   %3 = shufflevector <4 x i32> %2, <4 x i32> undef, <4 x i32> <i32 1, i32 undef, i32 undef, i32 undef>
420   %4 = and <4 x i32> %2, %3
421   %5 = extractelement <4 x i32> %4, i64 0
422   %6 = sext i32 %5 to i64
423   ret i64 %6
426 define i32 @test_v4i32_sext(<4 x i32> %a0, <4 x i32> %a1) {
427 ; SSE-LABEL: test_v4i32_sext:
428 ; SSE:       # %bb.0:
429 ; SSE-NEXT:    pcmpgtd %xmm1, %xmm0
430 ; SSE-NEXT:    movmskps %xmm0, %eax
431 ; SSE-NEXT:    xorl %ecx, %ecx
432 ; SSE-NEXT:    cmpl $15, %eax
433 ; SSE-NEXT:    movl $-1, %eax
434 ; SSE-NEXT:    cmovnel %ecx, %eax
435 ; SSE-NEXT:    retq
437 ; AVX-LABEL: test_v4i32_sext:
438 ; AVX:       # %bb.0:
439 ; AVX-NEXT:    vpcmpgtd %xmm1, %xmm0, %xmm0
440 ; AVX-NEXT:    vmovmskps %xmm0, %eax
441 ; AVX-NEXT:    xorl %ecx, %ecx
442 ; AVX-NEXT:    cmpl $15, %eax
443 ; AVX-NEXT:    movl $-1, %eax
444 ; AVX-NEXT:    cmovnel %ecx, %eax
445 ; AVX-NEXT:    retq
447 ; AVX512-LABEL: test_v4i32_sext:
448 ; AVX512:       # %bb.0:
449 ; AVX512-NEXT:    vpcmpgtd %xmm1, %xmm0, %xmm0
450 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
451 ; AVX512-NEXT:    vpand %xmm1, %xmm0, %xmm0
452 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
453 ; AVX512-NEXT:    vpand %xmm1, %xmm0, %xmm0
454 ; AVX512-NEXT:    vmovd %xmm0, %eax
455 ; AVX512-NEXT:    retq
456   %c = icmp sgt <4 x i32> %a0, %a1
457   %s = sext <4 x i1> %c to <4 x i32>
458   %1 = shufflevector <4 x i32> %s, <4 x i32> undef, <4 x i32> <i32 2, i32 3, i32 undef, i32 undef>
459   %2 = and <4 x i32> %s, %1
460   %3 = shufflevector <4 x i32> %2, <4 x i32> undef, <4 x i32> <i32 1, i32 undef, i32 undef, i32 undef>
461   %4 = and <4 x i32> %2, %3
462   %5 = extractelement <4 x i32> %4, i32 0
463   ret i32 %5
466 define i32 @test_v8i32_sext(<8 x i32> %a0, <8 x i32> %a1) {
467 ; SSE-LABEL: test_v8i32_sext:
468 ; SSE:       # %bb.0:
469 ; SSE-NEXT:    pcmpgtd %xmm3, %xmm1
470 ; SSE-NEXT:    pcmpgtd %xmm2, %xmm0
471 ; SSE-NEXT:    pand %xmm1, %xmm0
472 ; SSE-NEXT:    movmskps %xmm0, %eax
473 ; SSE-NEXT:    xorl %ecx, %ecx
474 ; SSE-NEXT:    cmpl $15, %eax
475 ; SSE-NEXT:    movl $-1, %eax
476 ; SSE-NEXT:    cmovnel %ecx, %eax
477 ; SSE-NEXT:    retq
479 ; AVX1-LABEL: test_v8i32_sext:
480 ; AVX1:       # %bb.0:
481 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
482 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
483 ; AVX1-NEXT:    vpcmpgtd %xmm2, %xmm3, %xmm2
484 ; AVX1-NEXT:    vpcmpgtd %xmm1, %xmm0, %xmm0
485 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
486 ; AVX1-NEXT:    vmovmskps %ymm0, %eax
487 ; AVX1-NEXT:    xorl %ecx, %ecx
488 ; AVX1-NEXT:    cmpl $255, %eax
489 ; AVX1-NEXT:    movl $-1, %eax
490 ; AVX1-NEXT:    cmovnel %ecx, %eax
491 ; AVX1-NEXT:    vzeroupper
492 ; AVX1-NEXT:    retq
494 ; AVX2-LABEL: test_v8i32_sext:
495 ; AVX2:       # %bb.0:
496 ; AVX2-NEXT:    vpcmpgtd %ymm1, %ymm0, %ymm0
497 ; AVX2-NEXT:    vmovmskps %ymm0, %eax
498 ; AVX2-NEXT:    xorl %ecx, %ecx
499 ; AVX2-NEXT:    cmpl $255, %eax
500 ; AVX2-NEXT:    movl $-1, %eax
501 ; AVX2-NEXT:    cmovnel %ecx, %eax
502 ; AVX2-NEXT:    vzeroupper
503 ; AVX2-NEXT:    retq
505 ; AVX512-LABEL: test_v8i32_sext:
506 ; AVX512:       # %bb.0:
507 ; AVX512-NEXT:    vpcmpgtd %ymm1, %ymm0, %ymm0
508 ; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
509 ; AVX512-NEXT:    vpand %xmm1, %xmm0, %xmm0
510 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
511 ; AVX512-NEXT:    vpand %xmm1, %xmm0, %xmm0
512 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
513 ; AVX512-NEXT:    vpand %xmm1, %xmm0, %xmm0
514 ; AVX512-NEXT:    vmovd %xmm0, %eax
515 ; AVX512-NEXT:    vzeroupper
516 ; AVX512-NEXT:    retq
517   %c = icmp sgt <8 x i32> %a0, %a1
518   %s = sext <8 x i1> %c to <8 x i32>
519   %1 = shufflevector <8 x i32> %s, <8 x i32> undef, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef>
520   %2 = and <8 x i32> %s, %1
521   %3 = shufflevector <8 x i32> %2, <8 x i32> undef, <8 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
522   %4 = and <8 x i32> %2, %3
523   %5 = shufflevector <8 x i32> %4, <8 x i32> undef, <8 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
524   %6 = and <8 x i32> %4, %5
525   %7 = extractelement <8 x i32> %6, i32 0
526   ret i32 %7
529 define i32 @test_v8i32_legal_sext(<8 x i32> %a0, <8 x i32> %a1) {
530 ; SSE-LABEL: test_v8i32_legal_sext:
531 ; SSE:       # %bb.0:
532 ; SSE-NEXT:    pcmpgtd %xmm3, %xmm1
533 ; SSE-NEXT:    pcmpgtd %xmm2, %xmm0
534 ; SSE-NEXT:    packssdw %xmm1, %xmm0
535 ; SSE-NEXT:    pmovmskb %xmm0, %eax
536 ; SSE-NEXT:    xorl %ecx, %ecx
537 ; SSE-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
538 ; SSE-NEXT:    movl $-1, %eax
539 ; SSE-NEXT:    cmovnel %ecx, %eax
540 ; SSE-NEXT:    retq
542 ; AVX1-LABEL: test_v8i32_legal_sext:
543 ; AVX1:       # %bb.0:
544 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
545 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
546 ; AVX1-NEXT:    vpcmpgtd %xmm2, %xmm3, %xmm2
547 ; AVX1-NEXT:    vpcmpgtd %xmm1, %xmm0, %xmm0
548 ; AVX1-NEXT:    vpackssdw %xmm2, %xmm0, %xmm0
549 ; AVX1-NEXT:    vpmovmskb %xmm0, %eax
550 ; AVX1-NEXT:    xorl %ecx, %ecx
551 ; AVX1-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
552 ; AVX1-NEXT:    movl $-1, %eax
553 ; AVX1-NEXT:    cmovnel %ecx, %eax
554 ; AVX1-NEXT:    vzeroupper
555 ; AVX1-NEXT:    retq
557 ; AVX2-LABEL: test_v8i32_legal_sext:
558 ; AVX2:       # %bb.0:
559 ; AVX2-NEXT:    vpcmpgtd %ymm1, %ymm0, %ymm0
560 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
561 ; AVX2-NEXT:    vpackssdw %xmm1, %xmm0, %xmm0
562 ; AVX2-NEXT:    vpmovmskb %xmm0, %eax
563 ; AVX2-NEXT:    xorl %ecx, %ecx
564 ; AVX2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
565 ; AVX2-NEXT:    movl $-1, %eax
566 ; AVX2-NEXT:    cmovnel %ecx, %eax
567 ; AVX2-NEXT:    vzeroupper
568 ; AVX2-NEXT:    retq
570 ; AVX512-LABEL: test_v8i32_legal_sext:
571 ; AVX512:       # %bb.0:
572 ; AVX512-NEXT:    vpcmpgtd %ymm1, %ymm0, %k0
573 ; AVX512-NEXT:    vpmovm2w %k0, %xmm0
574 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
575 ; AVX512-NEXT:    vpand %xmm1, %xmm0, %xmm0
576 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
577 ; AVX512-NEXT:    vpand %xmm1, %xmm0, %xmm0
578 ; AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1
579 ; AVX512-NEXT:    vpand %xmm1, %xmm0, %xmm0
580 ; AVX512-NEXT:    vmovd %xmm0, %eax
581 ; AVX512-NEXT:    cwtl
582 ; AVX512-NEXT:    vzeroupper
583 ; AVX512-NEXT:    retq
584   %c = icmp sgt <8 x i32> %a0, %a1
585   %s = sext <8 x i1> %c to <8 x i16>
586   %1 = shufflevector <8 x i16> %s, <8 x i16> undef, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef>
587   %2 = and <8 x i16> %s, %1
588   %3 = shufflevector <8 x i16> %2, <8 x i16> undef, <8 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
589   %4 = and <8 x i16> %2, %3
590   %5 = shufflevector <8 x i16> %4, <8 x i16> undef, <8 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
591   %6 = and <8 x i16> %4, %5
592   %7 = extractelement <8 x i16> %6, i32 0
593   %8 = sext i16 %7 to i32
594   ret i32 %8
597 define i16 @test_v8i16_sext(<8 x i16> %a0, <8 x i16> %a1) {
598 ; SSE-LABEL: test_v8i16_sext:
599 ; SSE:       # %bb.0:
600 ; SSE-NEXT:    pcmpgtw %xmm1, %xmm0
601 ; SSE-NEXT:    pmovmskb %xmm0, %eax
602 ; SSE-NEXT:    xorl %ecx, %ecx
603 ; SSE-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
604 ; SSE-NEXT:    movl $-1, %eax
605 ; SSE-NEXT:    cmovnel %ecx, %eax
606 ; SSE-NEXT:    # kill: def $ax killed $ax killed $eax
607 ; SSE-NEXT:    retq
609 ; AVX-LABEL: test_v8i16_sext:
610 ; AVX:       # %bb.0:
611 ; AVX-NEXT:    vpcmpgtw %xmm1, %xmm0, %xmm0
612 ; AVX-NEXT:    vpmovmskb %xmm0, %eax
613 ; AVX-NEXT:    xorl %ecx, %ecx
614 ; AVX-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
615 ; AVX-NEXT:    movl $-1, %eax
616 ; AVX-NEXT:    cmovnel %ecx, %eax
617 ; AVX-NEXT:    # kill: def $ax killed $ax killed $eax
618 ; AVX-NEXT:    retq
620 ; AVX512-LABEL: test_v8i16_sext:
621 ; AVX512:       # %bb.0:
622 ; AVX512-NEXT:    vpcmpgtw %xmm1, %xmm0, %xmm0
623 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
624 ; AVX512-NEXT:    vpand %xmm1, %xmm0, %xmm0
625 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
626 ; AVX512-NEXT:    vpand %xmm1, %xmm0, %xmm0
627 ; AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1
628 ; AVX512-NEXT:    vpand %xmm1, %xmm0, %xmm0
629 ; AVX512-NEXT:    vmovd %xmm0, %eax
630 ; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax
631 ; AVX512-NEXT:    retq
632   %c = icmp sgt <8 x i16> %a0, %a1
633   %s = sext <8 x i1> %c to <8 x i16>
634   %1 = shufflevector <8 x i16> %s, <8 x i16> undef, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef>
635   %2 = and <8 x i16> %s, %1
636   %3 = shufflevector <8 x i16> %2, <8 x i16> undef, <8 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
637   %4 = and <8 x i16> %2, %3
638   %5 = shufflevector <8 x i16> %4, <8 x i16> undef, <8 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
639   %6 = and <8 x i16> %4, %5
640   %7 = extractelement <8 x i16> %6, i32 0
641   ret i16 %7
644 define i16 @test_v16i16_sext(<16 x i16> %a0, <16 x i16> %a1) {
645 ; SSE-LABEL: test_v16i16_sext:
646 ; SSE:       # %bb.0:
647 ; SSE-NEXT:    pcmpgtw %xmm3, %xmm1
648 ; SSE-NEXT:    pcmpgtw %xmm2, %xmm0
649 ; SSE-NEXT:    pand %xmm1, %xmm0
650 ; SSE-NEXT:    pmovmskb %xmm0, %eax
651 ; SSE-NEXT:    xorl %ecx, %ecx
652 ; SSE-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
653 ; SSE-NEXT:    movl $-1, %eax
654 ; SSE-NEXT:    cmovnel %ecx, %eax
655 ; SSE-NEXT:    # kill: def $ax killed $ax killed $eax
656 ; SSE-NEXT:    retq
658 ; AVX1-LABEL: test_v16i16_sext:
659 ; AVX1:       # %bb.0:
660 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
661 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
662 ; AVX1-NEXT:    vpcmpgtw %xmm2, %xmm3, %xmm2
663 ; AVX1-NEXT:    vpcmpgtw %xmm1, %xmm0, %xmm0
664 ; AVX1-NEXT:    vpand %xmm2, %xmm0, %xmm0
665 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
666 ; AVX1-NEXT:    vpand %xmm1, %xmm0, %xmm0
667 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
668 ; AVX1-NEXT:    vpand %xmm1, %xmm0, %xmm0
669 ; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm1
670 ; AVX1-NEXT:    vpand %xmm1, %xmm0, %xmm0
671 ; AVX1-NEXT:    vmovd %xmm0, %eax
672 ; AVX1-NEXT:    # kill: def $ax killed $ax killed $eax
673 ; AVX1-NEXT:    vzeroupper
674 ; AVX1-NEXT:    retq
676 ; AVX2-LABEL: test_v16i16_sext:
677 ; AVX2:       # %bb.0:
678 ; AVX2-NEXT:    vpcmpgtw %ymm1, %ymm0, %ymm0
679 ; AVX2-NEXT:    vpmovmskb %ymm0, %ecx
680 ; AVX2-NEXT:    xorl %eax, %eax
681 ; AVX2-NEXT:    cmpl $-1, %ecx
682 ; AVX2-NEXT:    cmovel %ecx, %eax
683 ; AVX2-NEXT:    # kill: def $ax killed $ax killed $eax
684 ; AVX2-NEXT:    vzeroupper
685 ; AVX2-NEXT:    retq
687 ; AVX512-LABEL: test_v16i16_sext:
688 ; AVX512:       # %bb.0:
689 ; AVX512-NEXT:    vpcmpgtw %ymm1, %ymm0, %ymm0
690 ; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
691 ; AVX512-NEXT:    vpand %xmm1, %xmm0, %xmm0
692 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
693 ; AVX512-NEXT:    vpand %xmm1, %xmm0, %xmm0
694 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
695 ; AVX512-NEXT:    vpand %xmm1, %xmm0, %xmm0
696 ; AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1
697 ; AVX512-NEXT:    vpand %xmm1, %xmm0, %xmm0
698 ; AVX512-NEXT:    vmovd %xmm0, %eax
699 ; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax
700 ; AVX512-NEXT:    vzeroupper
701 ; AVX512-NEXT:    retq
702   %c = icmp sgt <16 x i16> %a0, %a1
703   %s = sext <16 x i1> %c to <16 x i16>
704   %1 = shufflevector <16 x i16> %s, <16 x i16> undef, <16 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
705   %2 = and <16 x i16> %s, %1
706   %3 = shufflevector <16 x i16> %2, <16 x i16> undef, <16 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
707   %4 = and <16 x i16> %2, %3
708   %5 = shufflevector <16 x i16> %4, <16 x i16> undef, <16 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
709   %6 = and <16 x i16> %4, %5
710   %7 = shufflevector <16 x i16> %6, <16 x i16> undef, <16 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
711   %8 = and <16 x i16> %6, %7
712   %9 = extractelement <16 x i16> %8, i32 0
713   ret i16 %9
716 define i16 @test_v16i16_legal_sext(<16 x i16> %a0, <16 x i16> %a1) {
717 ; SSE-LABEL: test_v16i16_legal_sext:
718 ; SSE:       # %bb.0:
719 ; SSE-NEXT:    pcmpgtw %xmm3, %xmm1
720 ; SSE-NEXT:    pcmpgtw %xmm2, %xmm0
721 ; SSE-NEXT:    packsswb %xmm1, %xmm0
722 ; SSE-NEXT:    pmovmskb %xmm0, %eax
723 ; SSE-NEXT:    xorl %ecx, %ecx
724 ; SSE-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
725 ; SSE-NEXT:    movl $-1, %eax
726 ; SSE-NEXT:    cmovnel %ecx, %eax
727 ; SSE-NEXT:    # kill: def $ax killed $ax killed $eax
728 ; SSE-NEXT:    retq
730 ; AVX1-LABEL: test_v16i16_legal_sext:
731 ; AVX1:       # %bb.0:
732 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
733 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
734 ; AVX1-NEXT:    vpcmpgtw %xmm2, %xmm3, %xmm2
735 ; AVX1-NEXT:    vpcmpgtw %xmm1, %xmm0, %xmm0
736 ; AVX1-NEXT:    vpacksswb %xmm2, %xmm0, %xmm0
737 ; AVX1-NEXT:    vpmovmskb %xmm0, %eax
738 ; AVX1-NEXT:    xorl %ecx, %ecx
739 ; AVX1-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
740 ; AVX1-NEXT:    movl $-1, %eax
741 ; AVX1-NEXT:    cmovnel %ecx, %eax
742 ; AVX1-NEXT:    # kill: def $ax killed $ax killed $eax
743 ; AVX1-NEXT:    vzeroupper
744 ; AVX1-NEXT:    retq
746 ; AVX2-LABEL: test_v16i16_legal_sext:
747 ; AVX2:       # %bb.0:
748 ; AVX2-NEXT:    vpcmpgtw %ymm1, %ymm0, %ymm0
749 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
750 ; AVX2-NEXT:    vpacksswb %xmm1, %xmm0, %xmm0
751 ; AVX2-NEXT:    vpmovmskb %xmm0, %eax
752 ; AVX2-NEXT:    xorl %ecx, %ecx
753 ; AVX2-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
754 ; AVX2-NEXT:    movl $-1, %eax
755 ; AVX2-NEXT:    cmovnel %ecx, %eax
756 ; AVX2-NEXT:    # kill: def $ax killed $ax killed $eax
757 ; AVX2-NEXT:    vzeroupper
758 ; AVX2-NEXT:    retq
760 ; AVX512-LABEL: test_v16i16_legal_sext:
761 ; AVX512:       # %bb.0:
762 ; AVX512-NEXT:    vpcmpgtw %ymm1, %ymm0, %k0
763 ; AVX512-NEXT:    vpmovm2b %k0, %xmm0
764 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
765 ; AVX512-NEXT:    vpand %xmm1, %xmm0, %xmm0
766 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
767 ; AVX512-NEXT:    vpand %xmm1, %xmm0, %xmm0
768 ; AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1
769 ; AVX512-NEXT:    vpand %xmm1, %xmm0, %xmm0
770 ; AVX512-NEXT:    vpsrlw $8, %xmm0, %xmm1
771 ; AVX512-NEXT:    vpand %xmm1, %xmm0, %xmm0
772 ; AVX512-NEXT:    vpextrb $0, %xmm0, %eax
773 ; AVX512-NEXT:    movsbl %al, %eax
774 ; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax
775 ; AVX512-NEXT:    vzeroupper
776 ; AVX512-NEXT:    retq
777   %c  = icmp sgt <16 x i16> %a0, %a1
778   %s  = sext <16 x i1> %c to <16 x i8>
779   %1  = shufflevector <16 x i8> %s, <16 x i8> undef, <16 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
780   %2  = and <16 x i8> %s, %1
781   %3  = shufflevector <16 x i8> %2, <16 x i8> undef, <16 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
782   %4  = and <16 x i8> %2, %3
783   %5  = shufflevector <16 x i8> %4, <16 x i8> undef, <16 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
784   %6  = and <16 x i8> %4, %5
785   %7  = shufflevector <16 x i8> %6, <16 x i8> undef, <16 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
786   %8  = and <16 x i8> %6, %7
787   %9  = extractelement <16 x i8> %8, i32 0
788   %10 = sext i8 %9 to i16
789   ret i16 %10
792 define i8 @test_v16i8_sext(<16 x i8> %a0, <16 x i8> %a1) {
793 ; SSE-LABEL: test_v16i8_sext:
794 ; SSE:       # %bb.0:
795 ; SSE-NEXT:    pcmpgtb %xmm1, %xmm0
796 ; SSE-NEXT:    pmovmskb %xmm0, %eax
797 ; SSE-NEXT:    xorl %ecx, %ecx
798 ; SSE-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
799 ; SSE-NEXT:    movl $-1, %eax
800 ; SSE-NEXT:    cmovnel %ecx, %eax
801 ; SSE-NEXT:    # kill: def $al killed $al killed $eax
802 ; SSE-NEXT:    retq
804 ; AVX-LABEL: test_v16i8_sext:
805 ; AVX:       # %bb.0:
806 ; AVX-NEXT:    vpcmpgtb %xmm1, %xmm0, %xmm0
807 ; AVX-NEXT:    vpmovmskb %xmm0, %eax
808 ; AVX-NEXT:    xorl %ecx, %ecx
809 ; AVX-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
810 ; AVX-NEXT:    movl $-1, %eax
811 ; AVX-NEXT:    cmovnel %ecx, %eax
812 ; AVX-NEXT:    # kill: def $al killed $al killed $eax
813 ; AVX-NEXT:    retq
815 ; AVX512-LABEL: test_v16i8_sext:
816 ; AVX512:       # %bb.0:
817 ; AVX512-NEXT:    vpcmpgtb %xmm1, %xmm0, %xmm0
818 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
819 ; AVX512-NEXT:    vpand %xmm1, %xmm0, %xmm0
820 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
821 ; AVX512-NEXT:    vpand %xmm1, %xmm0, %xmm0
822 ; AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1
823 ; AVX512-NEXT:    vpand %xmm1, %xmm0, %xmm0
824 ; AVX512-NEXT:    vpsrlw $8, %xmm0, %xmm1
825 ; AVX512-NEXT:    vpand %xmm1, %xmm0, %xmm0
826 ; AVX512-NEXT:    vpextrb $0, %xmm0, %eax
827 ; AVX512-NEXT:    # kill: def $al killed $al killed $eax
828 ; AVX512-NEXT:    retq
829   %c = icmp sgt <16 x i8> %a0, %a1
830   %s = sext <16 x i1> %c to <16 x i8>
831   %1 = shufflevector <16 x i8> %s, <16 x i8> undef, <16 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
832   %2 = and <16 x i8> %s, %1
833   %3 = shufflevector <16 x i8> %2, <16 x i8> undef, <16 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
834   %4 = and <16 x i8> %2, %3
835   %5 = shufflevector <16 x i8> %4, <16 x i8> undef, <16 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
836   %6 = and <16 x i8> %4, %5
837   %7 = shufflevector <16 x i8> %6, <16 x i8> undef, <16 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
838   %8 = and <16 x i8> %6, %7
839   %9 = extractelement <16 x i8> %8, i32 0
840   ret i8 %9
843 define i8 @test_v32i8_sext(<32 x i8> %a0, <32 x i8> %a1) {
844 ; SSE-LABEL: test_v32i8_sext:
845 ; SSE:       # %bb.0:
846 ; SSE-NEXT:    pcmpgtb %xmm3, %xmm1
847 ; SSE-NEXT:    pcmpgtb %xmm2, %xmm0
848 ; SSE-NEXT:    pand %xmm1, %xmm0
849 ; SSE-NEXT:    pmovmskb %xmm0, %eax
850 ; SSE-NEXT:    xorl %ecx, %ecx
851 ; SSE-NEXT:    cmpl $65535, %eax # imm = 0xFFFF
852 ; SSE-NEXT:    movl $-1, %eax
853 ; SSE-NEXT:    cmovnel %ecx, %eax
854 ; SSE-NEXT:    # kill: def $al killed $al killed $eax
855 ; SSE-NEXT:    retq
857 ; AVX1-LABEL: test_v32i8_sext:
858 ; AVX1:       # %bb.0:
859 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
860 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
861 ; AVX1-NEXT:    vpcmpgtb %xmm2, %xmm3, %xmm2
862 ; AVX1-NEXT:    vpcmpgtb %xmm1, %xmm0, %xmm0
863 ; AVX1-NEXT:    vpand %xmm2, %xmm0, %xmm0
864 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
865 ; AVX1-NEXT:    vpand %xmm1, %xmm0, %xmm0
866 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
867 ; AVX1-NEXT:    vpand %xmm1, %xmm0, %xmm0
868 ; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm1
869 ; AVX1-NEXT:    vpand %xmm1, %xmm0, %xmm0
870 ; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
871 ; AVX1-NEXT:    vpand %xmm1, %xmm0, %xmm0
872 ; AVX1-NEXT:    vpextrb $0, %xmm0, %eax
873 ; AVX1-NEXT:    # kill: def $al killed $al killed $eax
874 ; AVX1-NEXT:    vzeroupper
875 ; AVX1-NEXT:    retq
877 ; AVX2-LABEL: test_v32i8_sext:
878 ; AVX2:       # %bb.0:
879 ; AVX2-NEXT:    vpcmpgtb %ymm1, %ymm0, %ymm0
880 ; AVX2-NEXT:    vpmovmskb %ymm0, %ecx
881 ; AVX2-NEXT:    xorl %eax, %eax
882 ; AVX2-NEXT:    cmpl $-1, %ecx
883 ; AVX2-NEXT:    cmovel %ecx, %eax
884 ; AVX2-NEXT:    # kill: def $al killed $al killed $eax
885 ; AVX2-NEXT:    vzeroupper
886 ; AVX2-NEXT:    retq
888 ; AVX512-LABEL: test_v32i8_sext:
889 ; AVX512:       # %bb.0:
890 ; AVX512-NEXT:    vpcmpgtb %ymm1, %ymm0, %ymm0
891 ; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
892 ; AVX512-NEXT:    vpand %xmm1, %xmm0, %xmm0
893 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
894 ; AVX512-NEXT:    vpand %xmm1, %xmm0, %xmm0
895 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
896 ; AVX512-NEXT:    vpand %xmm1, %xmm0, %xmm0
897 ; AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1
898 ; AVX512-NEXT:    vpand %xmm1, %xmm0, %xmm0
899 ; AVX512-NEXT:    vpsrlw $8, %xmm0, %xmm1
900 ; AVX512-NEXT:    vpand %xmm1, %xmm0, %xmm0
901 ; AVX512-NEXT:    vpextrb $0, %xmm0, %eax
902 ; AVX512-NEXT:    # kill: def $al killed $al killed $eax
903 ; AVX512-NEXT:    vzeroupper
904 ; AVX512-NEXT:    retq
905   %c  = icmp sgt <32 x i8> %a0, %a1
906   %s  = sext <32 x i1> %c to <32 x i8>
907   %1  = shufflevector <32 x i8> %s, <32 x i8> undef, <32 x i32> <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 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
908   %2  = and <32 x i8> %s, %1
909   %3  = shufflevector <32 x i8> %2, <32 x i8> undef, <32 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
910   %4  = and <32 x i8> %2, %3
911   %5  = shufflevector <32 x i8> %4, <32 x i8> undef, <32 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
912   %6  = and <32 x i8> %4, %5
913   %7  = shufflevector <32 x i8> %6, <32 x i8> undef, <32 x i32> <i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
914   %8  = and <32 x i8> %6, %7
915   %9  = shufflevector <32 x i8> %8, <32 x i8> undef, <32 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
916   %10 = and <32 x i8> %8, %9
917   %11 = extractelement <32 x i8> %10, i32 0
918   ret i8 %11