LEA code size optimization pass (Part 1): Remove redundant address recalculations...
[oota-llvm.git] / test / CodeGen / X86 / vec_compare.ll
1 ; RUN: llc < %s -march=x86 -mcpu=yonah -mtriple=i386-apple-darwin | FileCheck %s
2
3
4 define <4 x i32> @test1(<4 x i32> %A, <4 x i32> %B) nounwind {
5 ; CHECK-LABEL: test1:
6 ; CHECK: pcmpgtd
7 ; CHECK: ret
8
9         %C = icmp sgt <4 x i32> %A, %B
10         %D = sext <4 x i1> %C to <4 x i32>
11         ret <4 x i32> %D
12 }
13
14 define <4 x i32> @test2(<4 x i32> %A, <4 x i32> %B) nounwind {
15 ; CHECK-LABEL: test2:
16 ; CHECK: pcmp
17 ; CHECK: pcmp
18 ; CHECK: pxor
19 ; CHECK: ret
20         %C = icmp sge <4 x i32> %A, %B
21         %D = sext <4 x i1> %C to <4 x i32>
22         ret <4 x i32> %D
23 }
24
25 define <4 x i32> @test3(<4 x i32> %A, <4 x i32> %B) nounwind {
26 ; CHECK-LABEL: test3:
27 ; CHECK: pcmpgtd
28 ; CHECK: movdqa
29 ; CHECK: ret
30         %C = icmp slt <4 x i32> %A, %B
31         %D = sext <4 x i1> %C to <4 x i32>
32         ret <4 x i32> %D
33 }
34
35 define <4 x i32> @test4(<4 x i32> %A, <4 x i32> %B) nounwind {
36 ; CHECK-LABEL: test4:
37 ; CHECK: movdqa
38 ; CHECK: pcmpgtd
39 ; CHECK: ret
40         %C = icmp ugt <4 x i32> %A, %B
41         %D = sext <4 x i1> %C to <4 x i32>
42         ret <4 x i32> %D
43 }
44
45 define <2 x i64> @test5(<2 x i64> %A, <2 x i64> %B) nounwind {
46 ; CHECK-LABEL: test5:
47 ; CHECK: pcmpeqd
48 ; CHECK: pshufd $177
49 ; CHECK: pand
50 ; CHECK: ret
51         %C = icmp eq <2 x i64> %A, %B
52         %D = sext <2 x i1> %C to <2 x i64>
53         ret <2 x i64> %D
54 }
55
56 define <2 x i64> @test6(<2 x i64> %A, <2 x i64> %B) nounwind {
57 ; CHECK-LABEL: test6:
58 ; CHECK: pcmpeqd
59 ; CHECK: pshufd $177
60 ; CHECK: pand
61 ; CHECK: pcmpeqd
62 ; CHECK: pxor
63 ; CHECK: ret
64         %C = icmp ne <2 x i64> %A, %B
65         %D = sext <2 x i1> %C to <2 x i64>
66         ret <2 x i64> %D
67 }
68
69 define <2 x i64> @test7(<2 x i64> %A, <2 x i64> %B) nounwind {
70 ; CHECK: [[CONSTSEG:[A-Z0-9_]*]]:
71 ; CHECK:      .long     2147483648
72 ; CHECK-NEXT: .long     0
73 ; CHECK-NEXT: .long     2147483648
74 ; CHECK-NEXT: .long     0
75 ; CHECK-LABEL: test7:
76 ; CHECK: movdqa [[CONSTSEG]], [[CONSTREG:%xmm[0-9]*]]
77 ; CHECK: pxor [[CONSTREG]]
78 ; CHECK: pxor [[CONSTREG]]
79 ; CHECK: pcmpgtd %xmm1
80 ; CHECK: pshufd $160
81 ; CHECK: pcmpeqd
82 ; CHECK: pshufd $245
83 ; CHECK: pand
84 ; CHECK: pshufd $245
85 ; CHECK: por
86 ; CHECK: ret
87         %C = icmp sgt <2 x i64> %A, %B
88         %D = sext <2 x i1> %C to <2 x i64>
89         ret <2 x i64> %D
90 }
91
92 define <2 x i64> @test8(<2 x i64> %A, <2 x i64> %B) nounwind {
93 ; CHECK-LABEL: test8:
94 ; CHECK: pxor
95 ; CHECK: pxor
96 ; CHECK: pcmpgtd %xmm0
97 ; CHECK: pshufd $160
98 ; CHECK: pcmpeqd
99 ; CHECK: pshufd $245
100 ; CHECK: pand
101 ; CHECK: pshufd $245
102 ; CHECK: por
103 ; CHECK: ret
104         %C = icmp slt <2 x i64> %A, %B
105         %D = sext <2 x i1> %C to <2 x i64>
106         ret <2 x i64> %D
107 }
108
109 define <2 x i64> @test9(<2 x i64> %A, <2 x i64> %B) nounwind {
110 ; CHECK-LABEL: test9:
111 ; CHECK: pxor
112 ; CHECK: pxor
113 ; CHECK: pcmpgtd %xmm0
114 ; CHECK: pshufd $160
115 ; CHECK: pcmpeqd
116 ; CHECK: pshufd $245
117 ; CHECK: pand
118 ; CHECK: pshufd $245
119 ; CHECK: por
120 ; CHECK: pcmpeqd
121 ; CHECK: pxor
122 ; CHECK: ret
123         %C = icmp sge <2 x i64> %A, %B
124         %D = sext <2 x i1> %C to <2 x i64>
125         ret <2 x i64> %D
126 }
127
128 define <2 x i64> @test10(<2 x i64> %A, <2 x i64> %B) nounwind {
129 ; CHECK-LABEL: test10:
130 ; CHECK: pxor
131 ; CHECK: pxor
132 ; CHECK: pcmpgtd %xmm1
133 ; CHECK: pshufd $160
134 ; CHECK: pcmpeqd
135 ; CHECK: pshufd $245
136 ; CHECK: pand
137 ; CHECK: pshufd $245
138 ; CHECK: por
139 ; CHECK: pcmpeqd
140 ; CHECK: pxor
141 ; CHECK: ret
142         %C = icmp sle <2 x i64> %A, %B
143         %D = sext <2 x i1> %C to <2 x i64>
144         ret <2 x i64> %D
145 }
146
147 define <2 x i64> @test11(<2 x i64> %A, <2 x i64> %B) nounwind {
148 ; CHECK: [[CONSTSEG:[A-Z0-9_]*]]:
149 ; CHECK:      .long     2147483648
150 ; CHECK-NEXT: .long     2147483648
151 ; CHECK-NEXT: .long     2147483648
152 ; CHECK-NEXT: .long     2147483648
153 ; CHECK-LABEL: test11:
154 ; CHECK: movdqa [[CONSTSEG]], [[CONSTREG:%xmm[0-9]*]]
155 ; CHECK: pxor [[CONSTREG]]
156 ; CHECK: pxor [[CONSTREG]]
157 ; CHECK: pcmpgtd %xmm1
158 ; CHECK: pshufd $160
159 ; CHECK: pcmpeqd
160 ; CHECK: pshufd $245
161 ; CHECK: pand
162 ; CHECK: pshufd $245
163 ; CHECK: por
164 ; CHECK: ret
165         %C = icmp ugt <2 x i64> %A, %B
166         %D = sext <2 x i1> %C to <2 x i64>
167         ret <2 x i64> %D
168 }
169
170 define <2 x i64> @test12(<2 x i64> %A, <2 x i64> %B) nounwind {
171 ; CHECK-LABEL: test12:
172 ; CHECK: pxor
173 ; CHECK: pxor
174 ; CHECK: pcmpgtd %xmm0
175 ; CHECK: pshufd $160
176 ; CHECK: pcmpeqd
177 ; CHECK: pshufd $245
178 ; CHECK: pand
179 ; CHECK: pshufd $245
180 ; CHECK: por
181 ; CHECK: ret
182         %C = icmp ult <2 x i64> %A, %B
183         %D = sext <2 x i1> %C to <2 x i64>
184         ret <2 x i64> %D
185 }
186
187 define <2 x i64> @test13(<2 x i64> %A, <2 x i64> %B) nounwind {
188 ; CHECK-LABEL: test13:
189 ; CHECK: pxor
190 ; CHECK: pxor
191 ; CHECK: pcmpgtd %xmm0
192 ; CHECK: pshufd $160
193 ; CHECK: pcmpeqd
194 ; CHECK: pshufd $245
195 ; CHECK: pand
196 ; CHECK: pshufd $245
197 ; CHECK: por
198 ; CHECK: pcmpeqd
199 ; CHECK: pxor
200 ; CHECK: ret
201         %C = icmp uge <2 x i64> %A, %B
202         %D = sext <2 x i1> %C to <2 x i64>
203         ret <2 x i64> %D
204 }
205
206 define <2 x i64> @test14(<2 x i64> %A, <2 x i64> %B) nounwind {
207 ; CHECK-LABEL: test14:
208 ; CHECK: pxor
209 ; CHECK: pxor
210 ; CHECK: pcmpgtd %xmm1
211 ; CHECK: pshufd $160
212 ; CHECK: pcmpeqd
213 ; CHECK: pshufd $245
214 ; CHECK: pand
215 ; CHECK: pshufd $245
216 ; CHECK: por
217 ; CHECK: pcmpeqd
218 ; CHECK: pxor
219 ; CHECK: ret
220         %C = icmp ule <2 x i64> %A, %B
221         %D = sext <2 x i1> %C to <2 x i64>
222         ret <2 x i64> %D
223 }