blob: ff0f27b8ba8818c3f1c5301dbe24cbf48753f662 [file] [log] [blame]
Sanjay Patel7ed93612016-02-26 01:14:27 +00001; 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
6
7; FIXME: https://llvm.org/bugs/show_bug.cgi?id=26701
8
9define <16 x i8> @pcmpgtb(<16 x i8> %x) {
10; SSE-LABEL: pcmpgtb:
11; SSE: # BB#0:
12; SSE-NEXT: pxor %xmm1, %xmm1
13; SSE-NEXT: pcmpgtb %xmm0, %xmm1
14; SSE-NEXT: pcmpeqd %xmm0, %xmm0
15; SSE-NEXT: pxor %xmm1, %xmm0
16; SSE-NEXT: retq
17;
18; AVX-LABEL: pcmpgtb:
19; AVX: # BB#0:
20; AVX-NEXT: vpxor %xmm1, %xmm1, %xmm1
21; AVX-NEXT: vpcmpgtb %xmm0, %xmm1, %xmm0
22; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
23; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0
24; AVX-NEXT: retq
25 %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>
26 %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 ret <16 x i8> %not
28}
29
30define <8 x i16> @pcmpgtw(<8 x i16> %x) {
31; SSE-LABEL: pcmpgtw:
32; SSE: # BB#0:
33; SSE-NEXT: psraw $15, %xmm0
34; SSE-NEXT: pcmpeqd %xmm1, %xmm1
35; SSE-NEXT: pxor %xmm1, %xmm0
36; SSE-NEXT: retq
37;
38; AVX-LABEL: pcmpgtw:
39; AVX: # BB#0:
40; AVX-NEXT: vpsraw $15, %xmm0, %xmm0
41; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
42; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0
43; AVX-NEXT: retq
44 %sign = ashr <8 x i16> %x, <i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15, i16 15>
45 %not = xor <8 x i16> %sign, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>
46 ret <8 x i16> %not
47}
48
49define <4 x i32> @pcmpgtd(<4 x i32> %x) {
50; SSE-LABEL: pcmpgtd:
51; SSE: # BB#0:
52; SSE-NEXT: psrad $31, %xmm0
53; SSE-NEXT: pcmpeqd %xmm1, %xmm1
54; SSE-NEXT: pxor %xmm1, %xmm0
55; SSE-NEXT: retq
56;
57; AVX-LABEL: pcmpgtd:
58; AVX: # BB#0:
59; AVX-NEXT: vpsrad $31, %xmm0, %xmm0
60; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
61; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0
62; AVX-NEXT: retq
63 %sign = ashr <4 x i32> %x, <i32 31, i32 31, i32 31, i32 31>
64 %not = xor <4 x i32> %sign, <i32 -1, i32 -1, i32 -1, i32 -1>
65 ret <4 x i32> %not
66}
67
68define <2 x i64> @pcmpgtq(<2 x i64> %x) {
69; SSE-LABEL: pcmpgtq:
70; SSE: # BB#0:
71; SSE-NEXT: psrad $31, %xmm0
72; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
73; SSE-NEXT: pcmpeqd %xmm0, %xmm0
74; SSE-NEXT: pxor %xmm1, %xmm0
75; SSE-NEXT: retq
76;
77; AVX-LABEL: pcmpgtq:
78; AVX: # BB#0:
79; AVX-NEXT: vpsrad $31, %xmm0, %xmm0
80; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
81; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
82; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0
83; AVX-NEXT: retq
84 %sign = ashr <2 x i64> %x, <i64 63, i64 63>
85 %not = xor <2 x i64> %sign, <i64 -1, i64 -1>
86 ret <2 x i64> %not
87}
88