• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=x86_64-unknown-unknown -mcpu=generic < %s | FileCheck %s
3
4define i32 @test_eq_1(<4 x i32> %A, <4 x i32> %B) {
5; CHECK-LABEL: test_eq_1:
6; CHECK:       # %bb.0:
7; CHECK-NEXT:    pcmpgtd %xmm0, %xmm1
8; CHECK-NEXT:    pcmpeqd %xmm0, %xmm0
9; CHECK-NEXT:    pxor %xmm1, %xmm0
10; CHECK-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
11; CHECK-NEXT:    movd %xmm0, %eax
12; CHECK-NEXT:    retq
13  %cmp = icmp slt <4 x i32> %A, %B
14  %sext = sext <4 x i1> %cmp to <4 x i32>
15  %cmp1 = icmp eq <4 x i32> %sext, zeroinitializer
16  %t0 = extractelement <4 x i1> %cmp1, i32 1
17  %t1 = sext i1 %t0 to i32
18  ret i32 %t1
19}
20
21define i32 @test_ne_1(<4 x i32> %A, <4 x i32> %B) {
22; CHECK-LABEL: test_ne_1:
23; CHECK:       # %bb.0:
24; CHECK-NEXT:    pcmpgtd %xmm0, %xmm1
25; CHECK-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
26; CHECK-NEXT:    movd %xmm0, %eax
27; CHECK-NEXT:    retq
28  %cmp = icmp slt <4 x i32> %A, %B
29  %sext = sext <4 x i1> %cmp to <4 x i32>
30  %cmp1 = icmp ne <4 x i32> %sext, zeroinitializer
31  %t0 = extractelement <4 x i1> %cmp1, i32 1
32  %t1 = sext i1 %t0 to i32
33  ret i32 %t1
34}
35
36define i32 @test_le_1(<4 x i32> %A, <4 x i32> %B) {
37; CHECK-LABEL: test_le_1:
38; CHECK:       # %bb.0:
39; CHECK-NEXT:    movl $-1, %eax
40; CHECK-NEXT:    retq
41  %cmp = icmp slt <4 x i32> %A, %B
42  %sext = sext <4 x i1> %cmp to <4 x i32>
43  %cmp1 = icmp sle <4 x i32> %sext, zeroinitializer
44  %t0 = extractelement <4 x i1> %cmp1, i32 1
45  %t1 = sext i1 %t0 to i32
46  ret i32 %t1
47}
48
49define i32 @test_ge_1(<4 x i32> %A, <4 x i32> %B) {
50; CHECK-LABEL: test_ge_1:
51; CHECK:       # %bb.0:
52; CHECK-NEXT:    pcmpgtd %xmm0, %xmm1
53; CHECK-NEXT:    pcmpeqd %xmm0, %xmm0
54; CHECK-NEXT:    pxor %xmm1, %xmm0
55; CHECK-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
56; CHECK-NEXT:    movd %xmm0, %eax
57; CHECK-NEXT:    retq
58  %cmp = icmp slt <4 x i32> %A, %B
59  %sext = sext <4 x i1> %cmp to <4 x i32>
60  %cmp1 = icmp sge <4 x i32> %sext, zeroinitializer
61  %t0 = extractelement <4 x i1> %cmp1, i32 1
62  %t1 = sext i1 %t0 to i32
63  ret i32 %t1
64}
65
66define i32 @test_lt_1(<4 x i32> %A, <4 x i32> %B) {
67; CHECK-LABEL: test_lt_1:
68; CHECK:       # %bb.0:
69; CHECK-NEXT:    pcmpgtd %xmm0, %xmm1
70; CHECK-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
71; CHECK-NEXT:    movd %xmm0, %eax
72; CHECK-NEXT:    retq
73  %cmp = icmp slt <4 x i32> %A, %B
74  %sext = sext <4 x i1> %cmp to <4 x i32>
75  %cmp1 = icmp slt <4 x i32> %sext, zeroinitializer
76  %t0 = extractelement <4 x i1> %cmp, i32 1
77  %t1 = sext i1 %t0 to i32
78  ret i32 %t1
79}
80
81define i32 @test_gt_1(<4 x i32> %A, <4 x i32> %B) {
82; CHECK-LABEL: test_gt_1:
83; CHECK:       # %bb.0:
84; CHECK-NEXT:    xorl %eax, %eax
85; CHECK-NEXT:    retq
86  %cmp = icmp slt <4 x i32> %A, %B
87  %sext = sext <4 x i1> %cmp to <4 x i32>
88  %cmp1 = icmp sgt <4 x i32> %sext, zeroinitializer
89  %t0 = extractelement <4 x i1> %cmp1, i32 1
90  %t1 = sext i1 %t0 to i32
91  ret i32 %t1
92}
93
94define i32 @test_eq_2(<4 x i32> %A, <4 x i32> %B) {
95; CHECK-LABEL: test_eq_2:
96; CHECK:       # %bb.0:
97; CHECK-NEXT:    pcmpgtd %xmm1, %xmm0
98; CHECK-NEXT:    pcmpeqd %xmm1, %xmm1
99; CHECK-NEXT:    pxor %xmm0, %xmm1
100; CHECK-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
101; CHECK-NEXT:    movd %xmm0, %eax
102; CHECK-NEXT:    retq
103  %cmp = icmp slt <4 x i32> %B, %A
104  %sext = sext <4 x i1> %cmp to <4 x i32>
105  %cmp1 = icmp eq <4 x i32> %sext, zeroinitializer
106  %t0 = extractelement <4 x i1> %cmp1, i32 1
107  %t1 = sext i1 %t0 to i32
108  ret i32 %t1
109}
110
111define i32 @test_ne_2(<4 x i32> %A, <4 x i32> %B) {
112; CHECK-LABEL: test_ne_2:
113; CHECK:       # %bb.0:
114; CHECK-NEXT:    pcmpgtd %xmm1, %xmm0
115; CHECK-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
116; CHECK-NEXT:    movd %xmm0, %eax
117; CHECK-NEXT:    retq
118  %cmp = icmp slt <4 x i32> %B, %A
119  %sext = sext <4 x i1> %cmp to <4 x i32>
120  %cmp1 = icmp ne <4 x i32> %sext, zeroinitializer
121  %t0 = extractelement <4 x i1> %cmp1, i32 1
122  %t1 = sext i1 %t0 to i32
123  ret i32 %t1
124}
125
126define i32 @test_le_2(<4 x i32> %A, <4 x i32> %B) {
127; CHECK-LABEL: test_le_2:
128; CHECK:       # %bb.0:
129; CHECK-NEXT:    pcmpgtd %xmm1, %xmm0
130; CHECK-NEXT:    pcmpeqd %xmm1, %xmm1
131; CHECK-NEXT:    pxor %xmm0, %xmm1
132; CHECK-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
133; CHECK-NEXT:    movd %xmm0, %eax
134; CHECK-NEXT:    retq
135  %cmp = icmp slt <4 x i32> %B, %A
136  %sext = sext <4 x i1> %cmp to <4 x i32>
137  %cmp1 = icmp sle <4 x i32> zeroinitializer, %sext
138  %t0 = extractelement <4 x i1> %cmp1, i32 1
139  %t1 = sext i1 %t0 to i32
140  ret i32 %t1
141}
142
143define i32 @test_ge_2(<4 x i32> %A, <4 x i32> %B) {
144; CHECK-LABEL: test_ge_2:
145; CHECK:       # %bb.0:
146; CHECK-NEXT:    movl $-1, %eax
147; CHECK-NEXT:    retq
148  %cmp = icmp slt <4 x i32> %B, %A
149  %sext = sext <4 x i1> %cmp to <4 x i32>
150  %cmp1 = icmp sge <4 x i32> zeroinitializer, %sext
151  %t0 = extractelement <4 x i1> %cmp1, i32 1
152  %t1 = sext i1 %t0 to i32
153  ret i32 %t1
154}
155
156define i32 @test_lt_2(<4 x i32> %A, <4 x i32> %B) {
157; CHECK-LABEL: test_lt_2:
158; CHECK:       # %bb.0:
159; CHECK-NEXT:    pcmpgtd %xmm1, %xmm0
160; CHECK-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
161; CHECK-NEXT:    movd %xmm0, %eax
162; CHECK-NEXT:    retq
163  %cmp = icmp slt <4 x i32> %B, %A
164  %sext = sext <4 x i1> %cmp to <4 x i32>
165  %cmp1 = icmp slt <4 x i32> zeroinitializer, %sext
166  %t0 = extractelement <4 x i1> %cmp, i32 1
167  %t1 = sext i1 %t0 to i32
168  ret i32 %t1
169}
170
171define i32 @test_gt_2(<4 x i32> %A, <4 x i32> %B) {
172; CHECK-LABEL: test_gt_2:
173; CHECK:       # %bb.0:
174; CHECK-NEXT:    pcmpgtd %xmm1, %xmm0
175; CHECK-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
176; CHECK-NEXT:    movd %xmm0, %eax
177; CHECK-NEXT:    retq
178  %cmp = icmp slt <4 x i32> %B, %A
179  %sext = sext <4 x i1> %cmp to <4 x i32>
180  %cmp1 = icmp sgt <4 x i32> zeroinitializer, %sext
181  %t0 = extractelement <4 x i1> %cmp1, i32 1
182  %t1 = sext i1 %t0 to i32
183  ret i32 %t1
184}
185
186; (and (setne X, 0), (setne X, -1)) --> (setuge (add X, 1), 2)
187; Don't combine with i1 - out of range constant
188define void @test_i1_uge(i1 *%A2) {
189; CHECK-LABEL: test_i1_uge:
190; CHECK:       # %bb.0:
191; CHECK-NEXT:    movb (%rdi), %al
192; CHECK-NEXT:    movl %eax, %ecx
193; CHECK-NEXT:    xorb $1, %cl
194; CHECK-NEXT:    andb %cl, %al
195; CHECK-NEXT:    movzbl %al, %eax
196; CHECK-NEXT:    andl $1, %eax
197; CHECK-NEXT:    negq %rax
198; CHECK-NEXT:    andb $1, %cl
199; CHECK-NEXT:    movb %cl, (%rdi,%rax)
200; CHECK-NEXT:    retq
201  %L5 = load i1, i1* %A2
202  %C3 = icmp ne i1 %L5, true
203  %C8 = icmp eq i1 %L5, false
204  %C9 = icmp ugt i1 %C3, %C8
205  %G3 = getelementptr i1, i1* %A2, i1 %C9
206  store i1 %C3, i1* %G3
207  ret void
208}
209
210