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-prefix=SSE --check-prefix=SSE2
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.2 | FileCheck %s --check-prefix=SSE --check-prefix=SSE42
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=AVX --check-prefix=AVX1
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=AVX --check-prefix=AVX2
7 ; Lower common integer comparisons such as 'isPositive' efficiently:
8 ; https://llvm.org/bugs/show_bug.cgi?id=26701
10 define <16 x i8> @test_pcmpgtb(<16 x i8> %x) {
11 ; SSE-LABEL: test_pcmpgtb:
13 ; SSE-NEXT: pcmpeqd %xmm1, %xmm1
14 ; SSE-NEXT: pcmpgtb %xmm1, %xmm0
17 ; AVX-LABEL: test_pcmpgtb:
19 ; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
20 ; AVX-NEXT: vpcmpgtb %xmm1, %xmm0, %xmm0
22 %sign = ashr <16 x i8> %x, <i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7>
23 %not = xor <16 x i8> %sign, <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>
27 define <8 x i16> @test_pcmpgtw(<8 x i16> %x) {
28 ; SSE-LABEL: test_pcmpgtw:
30 ; SSE-NEXT: pcmpeqd %xmm1, %xmm1
31 ; SSE-NEXT: pcmpgtw %xmm1, %xmm0
34 ; AVX-LABEL: test_pcmpgtw:
36 ; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
37 ; AVX-NEXT: vpcmpgtw %xmm1, %xmm0, %xmm0
39 %sign = ashr <8 x i16> %x, <i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15>
40 %not = xor <8 x i16> %sign, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>
44 define <4 x i32> @test_pcmpgtd(<4 x i32> %x) {
45 ; SSE-LABEL: test_pcmpgtd:
47 ; SSE-NEXT: pcmpeqd %xmm1, %xmm1
48 ; SSE-NEXT: pcmpgtd %xmm1, %xmm0
51 ; AVX-LABEL: test_pcmpgtd:
53 ; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
54 ; AVX-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0
56 %sign = ashr <4 x i32> %x, <i32 31, i32 31, i32 31, i32 31>
57 %not = xor <4 x i32> %sign, <i32 -1, i32 -1, i32 -1, i32 -1>
61 define <2 x i64> @test_pcmpgtq(<2 x i64> %x) {
62 ; SSE2-LABEL: test_pcmpgtq:
64 ; SSE2-NEXT: psrad $31, %xmm0
65 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
66 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm0
67 ; SSE2-NEXT: pxor %xmm1, %xmm0
70 ; SSE42-LABEL: test_pcmpgtq:
72 ; SSE42-NEXT: pcmpeqd %xmm1, %xmm1
73 ; SSE42-NEXT: pcmpgtq %xmm1, %xmm0
76 ; AVX-LABEL: test_pcmpgtq:
78 ; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
79 ; AVX-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm0
81 %sign = ashr <2 x i64> %x, <i64 63, i64 63>
82 %not = xor <2 x i64> %sign, <i64 -1, i64 -1>
86 define <1 x i128> @test_strange_type(<1 x i128> %x) {
87 ; SSE2-LABEL: test_strange_type:
89 ; SSE2-NEXT: sarq $63, %rsi
90 ; SSE2-NEXT: movq %rsi, %xmm0
91 ; SSE2-NEXT: notq %rsi
92 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
93 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
94 ; SSE2-NEXT: pxor %xmm0, %xmm1
95 ; SSE2-NEXT: movq %xmm1, %rax
96 ; SSE2-NEXT: movq %rsi, %rdx
99 ; SSE42-LABEL: test_strange_type:
101 ; SSE42-NEXT: sarq $63, %rsi
102 ; SSE42-NEXT: movq %rsi, %xmm0
103 ; SSE42-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
104 ; SSE42-NEXT: pcmpeqd %xmm1, %xmm1
105 ; SSE42-NEXT: pxor %xmm0, %xmm1
106 ; SSE42-NEXT: movq %xmm1, %rax
107 ; SSE42-NEXT: pextrq $1, %xmm1, %rdx
110 ; AVX1-LABEL: test_strange_type:
112 ; AVX1-NEXT: sarq $63, %rsi
113 ; AVX1-NEXT: vmovq %rsi, %xmm0
114 ; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
115 ; AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
116 ; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0
117 ; AVX1-NEXT: vmovq %xmm0, %rax
118 ; AVX1-NEXT: vpextrq $1, %xmm0, %rdx
121 ; AVX2-LABEL: test_strange_type:
123 ; AVX2-NEXT: sarq $63, %rsi
124 ; AVX2-NEXT: vmovq %rsi, %xmm0
125 ; AVX2-NEXT: vpbroadcastq %xmm0, %xmm0
126 ; AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
127 ; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
128 ; AVX2-NEXT: vmovq %xmm0, %rax
129 ; AVX2-NEXT: vpextrq $1, %xmm0, %rdx
131 %sign = ashr <1 x i128> %x, <i128 127>
132 %not = xor <1 x i128> %sign, <i128 -1>
136 define <32 x i8> @test_pcmpgtb_256(<32 x i8> %x) {
137 ; SSE-LABEL: test_pcmpgtb_256:
139 ; SSE-NEXT: pcmpeqd %xmm2, %xmm2
140 ; SSE-NEXT: pcmpgtb %xmm2, %xmm0
141 ; SSE-NEXT: pcmpgtb %xmm2, %xmm1
144 ; AVX1-LABEL: test_pcmpgtb_256:
146 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
147 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
148 ; AVX1-NEXT: vpcmpgtb %xmm1, %xmm2, %xmm1
149 ; AVX1-NEXT: vpcmpgtb %xmm0, %xmm2, %xmm0
150 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
151 ; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1
152 ; AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1
153 ; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0
156 ; AVX2-LABEL: test_pcmpgtb_256:
158 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
159 ; AVX2-NEXT: vpcmpgtb %ymm1, %ymm0, %ymm0
161 %sign = ashr <32 x i8> %x, <i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7>
162 %not = xor <32 x i8> %sign, <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>
166 define <16 x i16> @test_pcmpgtw_256(<16 x i16> %x) {
167 ; SSE-LABEL: test_pcmpgtw_256:
169 ; SSE-NEXT: pcmpeqd %xmm2, %xmm2
170 ; SSE-NEXT: pcmpgtw %xmm2, %xmm0
171 ; SSE-NEXT: pcmpgtw %xmm2, %xmm1
174 ; AVX1-LABEL: test_pcmpgtw_256:
176 ; AVX1-NEXT: vpsraw $15, %xmm0, %xmm1
177 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
178 ; AVX1-NEXT: vpsraw $15, %xmm0, %xmm0
179 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
180 ; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1
181 ; AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1
182 ; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0
185 ; AVX2-LABEL: test_pcmpgtw_256:
187 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
188 ; AVX2-NEXT: vpcmpgtw %ymm1, %ymm0, %ymm0
190 %sign = ashr <16 x i16> %x, <i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15>
191 %not = xor <16 x i16> %sign, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>
195 define <8 x i32> @test_pcmpgtd_256(<8 x i32> %x) {
196 ; SSE-LABEL: test_pcmpgtd_256:
198 ; SSE-NEXT: pcmpeqd %xmm2, %xmm2
199 ; SSE-NEXT: pcmpgtd %xmm2, %xmm0
200 ; SSE-NEXT: pcmpgtd %xmm2, %xmm1
203 ; AVX1-LABEL: test_pcmpgtd_256:
205 ; AVX1-NEXT: vpsrad $31, %xmm0, %xmm1
206 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
207 ; AVX1-NEXT: vpsrad $31, %xmm0, %xmm0
208 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
209 ; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1
210 ; AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1
211 ; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0
214 ; AVX2-LABEL: test_pcmpgtd_256:
216 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
217 ; AVX2-NEXT: vpcmpgtd %ymm1, %ymm0, %ymm0
219 %sign = ashr <8 x i32> %x, <i32 31, i32 31, i32 31, i32 31, i32 31, i32 31, i32 31, i32 31>
220 %not = xor <8 x i32> %sign, <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1>
224 define <4 x i64> @test_pcmpgtq_256(<4 x i64> %x) {
225 ; SSE2-LABEL: test_pcmpgtq_256:
227 ; SSE2-NEXT: psrad $31, %xmm1
228 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
229 ; SSE2-NEXT: psrad $31, %xmm0
230 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
231 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm2
232 ; SSE2-NEXT: pxor %xmm2, %xmm0
233 ; SSE2-NEXT: pxor %xmm2, %xmm1
236 ; SSE42-LABEL: test_pcmpgtq_256:
238 ; SSE42-NEXT: pcmpeqd %xmm2, %xmm2
239 ; SSE42-NEXT: pcmpgtq %xmm2, %xmm0
240 ; SSE42-NEXT: pcmpgtq %xmm2, %xmm1
243 ; AVX1-LABEL: test_pcmpgtq_256:
245 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
246 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2
247 ; AVX1-NEXT: vpcmpgtq %xmm1, %xmm2, %xmm1
248 ; AVX1-NEXT: vpcmpgtq %xmm0, %xmm2, %xmm0
249 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
250 ; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1
251 ; AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1
252 ; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0
255 ; AVX2-LABEL: test_pcmpgtq_256:
257 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
258 ; AVX2-NEXT: vpcmpgtq %ymm1, %ymm0, %ymm0
260 %sign = ashr <4 x i64> %x, <i64 63, i64 63, i64 63, i64 63>
261 %not = xor <4 x i64> %sign, <i64 -1, i64 -1, i64 -1, i64 -1>
265 define <16 x i8> @cmpeq_zext_v16i8(<16 x i8> %a, <16 x i8> %b) {
266 ; SSE-LABEL: cmpeq_zext_v16i8:
268 ; SSE-NEXT: pcmpeqb %xmm1, %xmm0
269 ; SSE-NEXT: pand {{.*}}(%rip), %xmm0
272 ; AVX-LABEL: cmpeq_zext_v16i8:
274 ; AVX-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0
275 ; AVX-NEXT: vpand {{.*}}(%rip), %xmm0, %xmm0
277 %cmp = icmp eq <16 x i8> %a, %b
278 %zext = zext <16 x i1> %cmp to <16 x i8>
282 define <16 x i16> @cmpeq_zext_v16i16(<16 x i16> %a, <16 x i16> %b) {
283 ; SSE-LABEL: cmpeq_zext_v16i16:
285 ; SSE-NEXT: pcmpeqw %xmm2, %xmm0
286 ; SSE-NEXT: psrlw $15, %xmm0
287 ; SSE-NEXT: pcmpeqw %xmm3, %xmm1
288 ; SSE-NEXT: psrlw $15, %xmm1
291 ; AVX1-LABEL: cmpeq_zext_v16i16:
293 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
294 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
295 ; AVX1-NEXT: vpcmpeqw %xmm2, %xmm3, %xmm2
296 ; AVX1-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0
297 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
298 ; AVX1-NEXT: vandps {{.*}}(%rip), %ymm0, %ymm0
301 ; AVX2-LABEL: cmpeq_zext_v16i16:
303 ; AVX2-NEXT: vpcmpeqw %ymm1, %ymm0, %ymm0
304 ; AVX2-NEXT: vpsrlw $15, %ymm0, %ymm0
306 %cmp = icmp eq <16 x i16> %a, %b
307 %zext = zext <16 x i1> %cmp to <16 x i16>
311 define <4 x i32> @cmpeq_zext_v4i32(<4 x i32> %a, <4 x i32> %b) {
312 ; SSE-LABEL: cmpeq_zext_v4i32:
314 ; SSE-NEXT: pcmpeqd %xmm1, %xmm0
315 ; SSE-NEXT: psrld $31, %xmm0
318 ; AVX-LABEL: cmpeq_zext_v4i32:
320 ; AVX-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
321 ; AVX-NEXT: vpsrld $31, %xmm0, %xmm0
323 %cmp = icmp eq <4 x i32> %a, %b
324 %zext = zext <4 x i1> %cmp to <4 x i32>
328 define <4 x i64> @cmpeq_zext_v4i64(<4 x i64> %a, <4 x i64> %b) {
329 ; SSE2-LABEL: cmpeq_zext_v4i64:
331 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm0
332 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,0,3,2]
333 ; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [1,1]
334 ; SSE2-NEXT: pand %xmm4, %xmm2
335 ; SSE2-NEXT: pand %xmm2, %xmm0
336 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm1
337 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,0,3,2]
338 ; SSE2-NEXT: pand %xmm4, %xmm2
339 ; SSE2-NEXT: pand %xmm2, %xmm1
342 ; SSE42-LABEL: cmpeq_zext_v4i64:
344 ; SSE42-NEXT: pcmpeqq %xmm2, %xmm0
345 ; SSE42-NEXT: psrlq $63, %xmm0
346 ; SSE42-NEXT: pcmpeqq %xmm3, %xmm1
347 ; SSE42-NEXT: psrlq $63, %xmm1
350 ; AVX1-LABEL: cmpeq_zext_v4i64:
352 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
353 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
354 ; AVX1-NEXT: vpcmpeqq %xmm2, %xmm3, %xmm2
355 ; AVX1-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm0
356 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
357 ; AVX1-NEXT: vandps {{.*}}(%rip), %ymm0, %ymm0
360 ; AVX2-LABEL: cmpeq_zext_v4i64:
362 ; AVX2-NEXT: vpcmpeqq %ymm1, %ymm0, %ymm0
363 ; AVX2-NEXT: vpsrlq $63, %ymm0, %ymm0
365 %cmp = icmp eq <4 x i64> %a, %b
366 %zext = zext <4 x i1> %cmp to <4 x i64>
370 define <32 x i8> @cmpgt_zext_v32i8(<32 x i8> %a, <32 x i8> %b) {
371 ; SSE-LABEL: cmpgt_zext_v32i8:
373 ; SSE-NEXT: pcmpgtb %xmm2, %xmm0
374 ; SSE-NEXT: movdqa {{.*#+}} xmm2 = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
375 ; SSE-NEXT: pand %xmm2, %xmm0
376 ; SSE-NEXT: pcmpgtb %xmm3, %xmm1
377 ; SSE-NEXT: pand %xmm2, %xmm1
380 ; AVX1-LABEL: cmpgt_zext_v32i8:
382 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
383 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
384 ; AVX1-NEXT: vpcmpgtb %xmm2, %xmm3, %xmm2
385 ; AVX1-NEXT: vpcmpgtb %xmm1, %xmm0, %xmm0
386 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
387 ; AVX1-NEXT: vandps {{.*}}(%rip), %ymm0, %ymm0
390 ; AVX2-LABEL: cmpgt_zext_v32i8:
392 ; AVX2-NEXT: vpcmpgtb %ymm1, %ymm0, %ymm0
393 ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0
395 %cmp = icmp sgt <32 x i8> %a, %b
396 %zext = zext <32 x i1> %cmp to <32 x i8>
400 define <8 x i16> @cmpgt_zext_v8i16(<8 x i16> %a, <8 x i16> %b) {
401 ; SSE-LABEL: cmpgt_zext_v8i16:
403 ; SSE-NEXT: pcmpgtw %xmm1, %xmm0
404 ; SSE-NEXT: psrlw $15, %xmm0
407 ; AVX-LABEL: cmpgt_zext_v8i16:
409 ; AVX-NEXT: vpcmpgtw %xmm1, %xmm0, %xmm0
410 ; AVX-NEXT: vpsrlw $15, %xmm0, %xmm0
412 %cmp = icmp sgt <8 x i16> %a, %b
413 %zext = zext <8 x i1> %cmp to <8 x i16>
417 define <8 x i32> @cmpgt_zext_v8i32(<8 x i32> %a, <8 x i32> %b) {
418 ; SSE-LABEL: cmpgt_zext_v8i32:
420 ; SSE-NEXT: pcmpgtd %xmm2, %xmm0
421 ; SSE-NEXT: psrld $31, %xmm0
422 ; SSE-NEXT: pcmpgtd %xmm3, %xmm1
423 ; SSE-NEXT: psrld $31, %xmm1
426 ; AVX1-LABEL: cmpgt_zext_v8i32:
428 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
429 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
430 ; AVX1-NEXT: vpcmpgtd %xmm2, %xmm3, %xmm2
431 ; AVX1-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0
432 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
433 ; AVX1-NEXT: vandps {{.*}}(%rip), %ymm0, %ymm0
436 ; AVX2-LABEL: cmpgt_zext_v8i32:
438 ; AVX2-NEXT: vpcmpgtd %ymm1, %ymm0, %ymm0
439 ; AVX2-NEXT: vpsrld $31, %ymm0, %ymm0
441 %cmp = icmp sgt <8 x i32> %a, %b
442 %zext = zext <8 x i1> %cmp to <8 x i32>
446 define <2 x i64> @cmpgt_zext_v2i64(<2 x i64> %a, <2 x i64> %b) {
447 ; SSE2-LABEL: cmpgt_zext_v2i64:
449 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,0,2147483648,0]
450 ; SSE2-NEXT: pxor %xmm2, %xmm1
451 ; SSE2-NEXT: pxor %xmm2, %xmm0
452 ; SSE2-NEXT: movdqa %xmm0, %xmm2
453 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm2
454 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
455 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm0
456 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
457 ; SSE2-NEXT: pand %xmm3, %xmm1
458 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
459 ; SSE2-NEXT: por %xmm1, %xmm0
460 ; SSE2-NEXT: pand {{.*}}(%rip), %xmm0
463 ; SSE42-LABEL: cmpgt_zext_v2i64:
465 ; SSE42-NEXT: pcmpgtq %xmm1, %xmm0
466 ; SSE42-NEXT: psrlq $63, %xmm0
469 ; AVX-LABEL: cmpgt_zext_v2i64:
471 ; AVX-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm0
472 ; AVX-NEXT: vpsrlq $63, %xmm0, %xmm0
474 %cmp = icmp sgt <2 x i64> %a, %b
475 %zext = zext <2 x i1> %cmp to <2 x i64>