comparison test/CodeGen/X86/vec_cmp_sint-128.ll @ 95:afa8332a0e37 LLVM3.8

LLVM 3.8
author Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
date Tue, 13 Oct 2015 17:48:58 +0900
parents
children 7d135dc70f03
comparison
equal deleted inserted replaced
84:f3e34b893a5f 95:afa8332a0e37
1 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE2
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE41
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.2 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE42
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX1
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX2
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx,+xop | FileCheck %s --check-prefix=ALL --check-prefix=XOP --check-prefix=XOPAVX1
7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2,+xop | FileCheck %s --check-prefix=ALL --check-prefix=XOP --check-prefix=XOPAVX2
8 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX512 --check-prefix=AVX512F
9 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX512 --check-prefix=AVX512BW
10
11 ;
12 ; Equal
13 ;
14
15 define <2 x i64> @eq_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {
16 ; SSE2-LABEL: eq_v2i64:
17 ; SSE2: # BB#0:
18 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm0
19 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,0,3,2]
20 ; SSE2-NEXT: pand %xmm1, %xmm0
21 ; SSE2-NEXT: retq
22 ;
23 ; SSE41-LABEL: eq_v2i64:
24 ; SSE41: # BB#0:
25 ; SSE41-NEXT: pcmpeqq %xmm1, %xmm0
26 ; SSE41-NEXT: retq
27 ;
28 ; SSE42-LABEL: eq_v2i64:
29 ; SSE42: # BB#0:
30 ; SSE42-NEXT: pcmpeqq %xmm1, %xmm0
31 ; SSE42-NEXT: retq
32 ;
33 ; AVX-LABEL: eq_v2i64:
34 ; AVX: # BB#0:
35 ; AVX-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm0
36 ; AVX-NEXT: retq
37 ;
38 ; XOP-LABEL: eq_v2i64:
39 ; XOP: # BB#0:
40 ; XOP-NEXT: vpcomeqq %xmm1, %xmm0, %xmm0
41 ; XOP-NEXT: retq
42 %1 = icmp eq <2 x i64> %a, %b
43 %2 = sext <2 x i1> %1 to <2 x i64>
44 ret <2 x i64> %2
45 }
46
47 define <4 x i32> @eq_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
48 ; SSE-LABEL: eq_v4i32:
49 ; SSE: # BB#0:
50 ; SSE-NEXT: pcmpeqd %xmm1, %xmm0
51 ; SSE-NEXT: retq
52 ;
53 ; AVX-LABEL: eq_v4i32:
54 ; AVX: # BB#0:
55 ; AVX-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
56 ; AVX-NEXT: retq
57 ;
58 ; XOP-LABEL: eq_v4i32:
59 ; XOP: # BB#0:
60 ; XOP-NEXT: vpcomeqd %xmm1, %xmm0, %xmm0
61 ; XOP-NEXT: retq
62 %1 = icmp eq <4 x i32> %a, %b
63 %2 = sext <4 x i1> %1 to <4 x i32>
64 ret <4 x i32> %2
65 }
66
67 define <8 x i16> @eq_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
68 ; SSE-LABEL: eq_v8i16:
69 ; SSE: # BB#0:
70 ; SSE-NEXT: pcmpeqw %xmm1, %xmm0
71 ; SSE-NEXT: retq
72 ;
73 ; AVX-LABEL: eq_v8i16:
74 ; AVX: # BB#0:
75 ; AVX-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0
76 ; AVX-NEXT: retq
77 ;
78 ; XOP-LABEL: eq_v8i16:
79 ; XOP: # BB#0:
80 ; XOP-NEXT: vpcomeqw %xmm1, %xmm0, %xmm0
81 ; XOP-NEXT: retq
82 %1 = icmp eq <8 x i16> %a, %b
83 %2 = sext <8 x i1> %1 to <8 x i16>
84 ret <8 x i16> %2
85 }
86
87 define <16 x i8> @eq_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
88 ; SSE-LABEL: eq_v16i8:
89 ; SSE: # BB#0:
90 ; SSE-NEXT: pcmpeqb %xmm1, %xmm0
91 ; SSE-NEXT: retq
92 ;
93 ; AVX-LABEL: eq_v16i8:
94 ; AVX: # BB#0:
95 ; AVX-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0
96 ; AVX-NEXT: retq
97 ;
98 ; XOP-LABEL: eq_v16i8:
99 ; XOP: # BB#0:
100 ; XOP-NEXT: vpcomeqb %xmm1, %xmm0, %xmm0
101 ; XOP-NEXT: retq
102 %1 = icmp eq <16 x i8> %a, %b
103 %2 = sext <16 x i1> %1 to <16 x i8>
104 ret <16 x i8> %2
105 }
106
107 ;
108 ; Not Equal
109 ;
110
111 define <2 x i64> @ne_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {
112 ; SSE2-LABEL: ne_v2i64:
113 ; SSE2: # BB#0:
114 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm0
115 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,0,3,2]
116 ; SSE2-NEXT: pand %xmm1, %xmm0
117 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
118 ; SSE2-NEXT: pxor %xmm1, %xmm0
119 ; SSE2-NEXT: retq
120 ;
121 ; SSE41-LABEL: ne_v2i64:
122 ; SSE41: # BB#0:
123 ; SSE41-NEXT: pcmpeqq %xmm1, %xmm0
124 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
125 ; SSE41-NEXT: pxor %xmm1, %xmm0
126 ; SSE41-NEXT: retq
127 ;
128 ; SSE42-LABEL: ne_v2i64:
129 ; SSE42: # BB#0:
130 ; SSE42-NEXT: pcmpeqq %xmm1, %xmm0
131 ; SSE42-NEXT: pcmpeqd %xmm1, %xmm1
132 ; SSE42-NEXT: pxor %xmm1, %xmm0
133 ; SSE42-NEXT: retq
134 ;
135 ; AVX-LABEL: ne_v2i64:
136 ; AVX: # BB#0:
137 ; AVX-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm0
138 ; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
139 ; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0
140 ; AVX-NEXT: retq
141 ;
142 ; XOP-LABEL: ne_v2i64:
143 ; XOP: # BB#0:
144 ; XOP-NEXT: vpcomneqq %xmm1, %xmm0, %xmm0
145 ; XOP-NEXT: retq
146 %1 = icmp ne <2 x i64> %a, %b
147 %2 = sext <2 x i1> %1 to <2 x i64>
148 ret <2 x i64> %2
149 }
150
151 define <4 x i32> @ne_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
152 ; SSE-LABEL: ne_v4i32:
153 ; SSE: # BB#0:
154 ; SSE-NEXT: pcmpeqd %xmm1, %xmm0
155 ; SSE-NEXT: pcmpeqd %xmm1, %xmm1
156 ; SSE-NEXT: pxor %xmm1, %xmm0
157 ; SSE-NEXT: retq
158 ;
159 ; AVX-LABEL: ne_v4i32:
160 ; AVX: # BB#0:
161 ; AVX-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
162 ; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
163 ; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0
164 ; AVX-NEXT: retq
165 ;
166 ; XOP-LABEL: ne_v4i32:
167 ; XOP: # BB#0:
168 ; XOP-NEXT: vpcomneqd %xmm1, %xmm0, %xmm0
169 ; XOP-NEXT: retq
170 %1 = icmp ne <4 x i32> %a, %b
171 %2 = sext <4 x i1> %1 to <4 x i32>
172 ret <4 x i32> %2
173 }
174
175 define <8 x i16> @ne_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
176 ; SSE-LABEL: ne_v8i16:
177 ; SSE: # BB#0:
178 ; SSE-NEXT: pcmpeqw %xmm1, %xmm0
179 ; SSE-NEXT: pcmpeqd %xmm1, %xmm1
180 ; SSE-NEXT: pxor %xmm1, %xmm0
181 ; SSE-NEXT: retq
182 ;
183 ; AVX-LABEL: ne_v8i16:
184 ; AVX: # BB#0:
185 ; AVX-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0
186 ; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
187 ; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0
188 ; AVX-NEXT: retq
189 ;
190 ; XOP-LABEL: ne_v8i16:
191 ; XOP: # BB#0:
192 ; XOP-NEXT: vpcomneqw %xmm1, %xmm0, %xmm0
193 ; XOP-NEXT: retq
194 %1 = icmp ne <8 x i16> %a, %b
195 %2 = sext <8 x i1> %1 to <8 x i16>
196 ret <8 x i16> %2
197 }
198
199 define <16 x i8> @ne_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
200 ; SSE-LABEL: ne_v16i8:
201 ; SSE: # BB#0:
202 ; SSE-NEXT: pcmpeqb %xmm1, %xmm0
203 ; SSE-NEXT: pcmpeqd %xmm1, %xmm1
204 ; SSE-NEXT: pxor %xmm1, %xmm0
205 ; SSE-NEXT: retq
206 ;
207 ; AVX-LABEL: ne_v16i8:
208 ; AVX: # BB#0:
209 ; AVX-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0
210 ; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
211 ; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0
212 ; AVX-NEXT: retq
213 ;
214 ; XOP-LABEL: ne_v16i8:
215 ; XOP: # BB#0:
216 ; XOP-NEXT: vpcomneqb %xmm1, %xmm0, %xmm0
217 ; XOP-NEXT: retq
218 %1 = icmp ne <16 x i8> %a, %b
219 %2 = sext <16 x i1> %1 to <16 x i8>
220 ret <16 x i8> %2
221 }
222
223 ;
224 ; Greater Than Or Equal
225 ;
226
227 define <2 x i64> @ge_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {
228 ; SSE2-LABEL: ge_v2i64:
229 ; SSE2: # BB#0:
230 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,0,2147483648,0]
231 ; SSE2-NEXT: pxor %xmm2, %xmm0
232 ; SSE2-NEXT: pxor %xmm2, %xmm1
233 ; SSE2-NEXT: movdqa %xmm1, %xmm2
234 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm2
235 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
236 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
237 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
238 ; SSE2-NEXT: pand %xmm3, %xmm0
239 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
240 ; SSE2-NEXT: por %xmm0, %xmm1
241 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm0
242 ; SSE2-NEXT: pxor %xmm1, %xmm0
243 ; SSE2-NEXT: retq
244 ;
245 ; SSE41-LABEL: ge_v2i64:
246 ; SSE41: # BB#0:
247 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,0,2147483648,0]
248 ; SSE41-NEXT: pxor %xmm2, %xmm0
249 ; SSE41-NEXT: pxor %xmm2, %xmm1
250 ; SSE41-NEXT: movdqa %xmm1, %xmm2
251 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm2
252 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
253 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm1
254 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
255 ; SSE41-NEXT: pand %xmm3, %xmm0
256 ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
257 ; SSE41-NEXT: por %xmm0, %xmm1
258 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm0
259 ; SSE41-NEXT: pxor %xmm1, %xmm0
260 ; SSE41-NEXT: retq
261 ;
262 ; SSE42-LABEL: ge_v2i64:
263 ; SSE42: # BB#0:
264 ; SSE42-NEXT: pcmpgtq %xmm0, %xmm1
265 ; SSE42-NEXT: pcmpeqd %xmm0, %xmm0
266 ; SSE42-NEXT: pxor %xmm1, %xmm0
267 ; SSE42-NEXT: retq
268 ;
269 ; AVX-LABEL: ge_v2i64:
270 ; AVX: # BB#0:
271 ; AVX-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm0
272 ; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
273 ; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0
274 ; AVX-NEXT: retq
275 ;
276 ; XOP-LABEL: ge_v2i64:
277 ; XOP: # BB#0:
278 ; XOP-NEXT: vpcomgeq %xmm1, %xmm0, %xmm0
279 ; XOP-NEXT: retq
280 %1 = icmp sge <2 x i64> %a, %b
281 %2 = sext <2 x i1> %1 to <2 x i64>
282 ret <2 x i64> %2
283 }
284
285 define <4 x i32> @ge_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
286 ; SSE-LABEL: ge_v4i32:
287 ; SSE: # BB#0:
288 ; SSE-NEXT: pcmpgtd %xmm0, %xmm1
289 ; SSE-NEXT: pcmpeqd %xmm0, %xmm0
290 ; SSE-NEXT: pxor %xmm1, %xmm0
291 ; SSE-NEXT: retq
292 ;
293 ; AVX-LABEL: ge_v4i32:
294 ; AVX: # BB#0:
295 ; AVX-NEXT: vpcmpgtd %xmm0, %xmm1, %xmm0
296 ; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
297 ; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0
298 ; AVX-NEXT: retq
299 ;
300 ; XOP-LABEL: ge_v4i32:
301 ; XOP: # BB#0:
302 ; XOP-NEXT: vpcomged %xmm1, %xmm0, %xmm0
303 ; XOP-NEXT: retq
304 %1 = icmp sge <4 x i32> %a, %b
305 %2 = sext <4 x i1> %1 to <4 x i32>
306 ret <4 x i32> %2
307 }
308
309 define <8 x i16> @ge_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
310 ; SSE-LABEL: ge_v8i16:
311 ; SSE: # BB#0:
312 ; SSE-NEXT: pcmpgtw %xmm0, %xmm1
313 ; SSE-NEXT: pcmpeqd %xmm0, %xmm0
314 ; SSE-NEXT: pxor %xmm1, %xmm0
315 ; SSE-NEXT: retq
316 ;
317 ; AVX-LABEL: ge_v8i16:
318 ; AVX: # BB#0:
319 ; AVX-NEXT: vpcmpgtw %xmm0, %xmm1, %xmm0
320 ; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
321 ; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0
322 ; AVX-NEXT: retq
323 ;
324 ; XOP-LABEL: ge_v8i16:
325 ; XOP: # BB#0:
326 ; XOP-NEXT: vpcomgew %xmm1, %xmm0, %xmm0
327 ; XOP-NEXT: retq
328 %1 = icmp sge <8 x i16> %a, %b
329 %2 = sext <8 x i1> %1 to <8 x i16>
330 ret <8 x i16> %2
331 }
332
333 define <16 x i8> @ge_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
334 ; SSE-LABEL: ge_v16i8:
335 ; SSE: # BB#0:
336 ; SSE-NEXT: pcmpgtb %xmm0, %xmm1
337 ; SSE-NEXT: pcmpeqd %xmm0, %xmm0
338 ; SSE-NEXT: pxor %xmm1, %xmm0
339 ; SSE-NEXT: retq
340 ;
341 ; AVX-LABEL: ge_v16i8:
342 ; AVX: # BB#0:
343 ; AVX-NEXT: vpcmpgtb %xmm0, %xmm1, %xmm0
344 ; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
345 ; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0
346 ; AVX-NEXT: retq
347 ;
348 ; XOP-LABEL: ge_v16i8:
349 ; XOP: # BB#0:
350 ; XOP-NEXT: vpcomgeb %xmm1, %xmm0, %xmm0
351 ; XOP-NEXT: retq
352 %1 = icmp sge <16 x i8> %a, %b
353 %2 = sext <16 x i1> %1 to <16 x i8>
354 ret <16 x i8> %2
355 }
356
357 ;
358 ; Greater Than
359 ;
360
361 define <2 x i64> @gt_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {
362 ; SSE2-LABEL: gt_v2i64:
363 ; SSE2: # BB#0:
364 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,0,2147483648,0]
365 ; SSE2-NEXT: pxor %xmm2, %xmm1
366 ; SSE2-NEXT: pxor %xmm2, %xmm0
367 ; SSE2-NEXT: movdqa %xmm0, %xmm2
368 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm2
369 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
370 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm0
371 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
372 ; SSE2-NEXT: pand %xmm3, %xmm1
373 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
374 ; SSE2-NEXT: por %xmm1, %xmm0
375 ; SSE2-NEXT: retq
376 ;
377 ; SSE41-LABEL: gt_v2i64:
378 ; SSE41: # BB#0:
379 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,0,2147483648,0]
380 ; SSE41-NEXT: pxor %xmm2, %xmm1
381 ; SSE41-NEXT: pxor %xmm2, %xmm0
382 ; SSE41-NEXT: movdqa %xmm0, %xmm2
383 ; SSE41-NEXT: pcmpgtd %xmm1, %xmm2
384 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
385 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm0
386 ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
387 ; SSE41-NEXT: pand %xmm3, %xmm1
388 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
389 ; SSE41-NEXT: por %xmm1, %xmm0
390 ; SSE41-NEXT: retq
391 ;
392 ; SSE42-LABEL: gt_v2i64:
393 ; SSE42: # BB#0:
394 ; SSE42-NEXT: pcmpgtq %xmm1, %xmm0
395 ; SSE42-NEXT: retq
396 ;
397 ; AVX-LABEL: gt_v2i64:
398 ; AVX: # BB#0:
399 ; AVX-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm0
400 ; AVX-NEXT: retq
401 ;
402 ; XOP-LABEL: gt_v2i64:
403 ; XOP: # BB#0:
404 ; XOP-NEXT: vpcomgtq %xmm1, %xmm0, %xmm0
405 ; XOP-NEXT: retq
406 %1 = icmp sgt <2 x i64> %a, %b
407 %2 = sext <2 x i1> %1 to <2 x i64>
408 ret <2 x i64> %2
409 }
410
411 define <4 x i32> @gt_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
412 ; SSE-LABEL: gt_v4i32:
413 ; SSE: # BB#0:
414 ; SSE-NEXT: pcmpgtd %xmm1, %xmm0
415 ; SSE-NEXT: retq
416 ;
417 ; AVX-LABEL: gt_v4i32:
418 ; AVX: # BB#0:
419 ; AVX-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0
420 ; AVX-NEXT: retq
421 ;
422 ; XOP-LABEL: gt_v4i32:
423 ; XOP: # BB#0:
424 ; XOP-NEXT: vpcomgtd %xmm1, %xmm0, %xmm0
425 ; XOP-NEXT: retq
426 %1 = icmp sgt <4 x i32> %a, %b
427 %2 = sext <4 x i1> %1 to <4 x i32>
428 ret <4 x i32> %2
429 }
430
431 define <8 x i16> @gt_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
432 ; SSE-LABEL: gt_v8i16:
433 ; SSE: # BB#0:
434 ; SSE-NEXT: pcmpgtw %xmm1, %xmm0
435 ; SSE-NEXT: retq
436 ;
437 ; AVX-LABEL: gt_v8i16:
438 ; AVX: # BB#0:
439 ; AVX-NEXT: vpcmpgtw %xmm1, %xmm0, %xmm0
440 ; AVX-NEXT: retq
441 ;
442 ; XOP-LABEL: gt_v8i16:
443 ; XOP: # BB#0:
444 ; XOP-NEXT: vpcomgtw %xmm1, %xmm0, %xmm0
445 ; XOP-NEXT: retq
446 %1 = icmp sgt <8 x i16> %a, %b
447 %2 = sext <8 x i1> %1 to <8 x i16>
448 ret <8 x i16> %2
449 }
450
451 define <16 x i8> @gt_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
452 ; SSE-LABEL: gt_v16i8:
453 ; SSE: # BB#0:
454 ; SSE-NEXT: pcmpgtb %xmm1, %xmm0
455 ; SSE-NEXT: retq
456 ;
457 ; AVX-LABEL: gt_v16i8:
458 ; AVX: # BB#0:
459 ; AVX-NEXT: vpcmpgtb %xmm1, %xmm0, %xmm0
460 ; AVX-NEXT: retq
461 ;
462 ; XOP-LABEL: gt_v16i8:
463 ; XOP: # BB#0:
464 ; XOP-NEXT: vpcomgtb %xmm1, %xmm0, %xmm0
465 ; XOP-NEXT: retq
466 %1 = icmp sgt <16 x i8> %a, %b
467 %2 = sext <16 x i1> %1 to <16 x i8>
468 ret <16 x i8> %2
469 }
470
471 ;
472 ; Less Than Or Equal
473 ;
474
475 define <2 x i64> @le_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {
476 ; SSE2-LABEL: le_v2i64:
477 ; SSE2: # BB#0:
478 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,0,2147483648,0]
479 ; SSE2-NEXT: pxor %xmm2, %xmm1
480 ; SSE2-NEXT: pxor %xmm2, %xmm0
481 ; SSE2-NEXT: movdqa %xmm0, %xmm2
482 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm2
483 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
484 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm0
485 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
486 ; SSE2-NEXT: pand %xmm3, %xmm0
487 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
488 ; SSE2-NEXT: por %xmm0, %xmm1
489 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm0
490 ; SSE2-NEXT: pxor %xmm1, %xmm0
491 ; SSE2-NEXT: retq
492 ;
493 ; SSE41-LABEL: le_v2i64:
494 ; SSE41: # BB#0:
495 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,0,2147483648,0]
496 ; SSE41-NEXT: pxor %xmm2, %xmm1
497 ; SSE41-NEXT: pxor %xmm2, %xmm0
498 ; SSE41-NEXT: movdqa %xmm0, %xmm2
499 ; SSE41-NEXT: pcmpgtd %xmm1, %xmm2
500 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
501 ; SSE41-NEXT: pcmpeqd %xmm1, %xmm0
502 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
503 ; SSE41-NEXT: pand %xmm3, %xmm0
504 ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
505 ; SSE41-NEXT: por %xmm0, %xmm1
506 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm0
507 ; SSE41-NEXT: pxor %xmm1, %xmm0
508 ; SSE41-NEXT: retq
509 ;
510 ; SSE42-LABEL: le_v2i64:
511 ; SSE42: # BB#0:
512 ; SSE42-NEXT: pcmpgtq %xmm1, %xmm0
513 ; SSE42-NEXT: pcmpeqd %xmm1, %xmm1
514 ; SSE42-NEXT: pxor %xmm1, %xmm0
515 ; SSE42-NEXT: retq
516 ;
517 ; AVX-LABEL: le_v2i64:
518 ; AVX: # BB#0:
519 ; AVX-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm0
520 ; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
521 ; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0
522 ; AVX-NEXT: retq
523 ;
524 ; XOP-LABEL: le_v2i64:
525 ; XOP: # BB#0:
526 ; XOP-NEXT: vpcomleq %xmm1, %xmm0, %xmm0
527 ; XOP-NEXT: retq
528 %1 = icmp sle <2 x i64> %a, %b
529 %2 = sext <2 x i1> %1 to <2 x i64>
530 ret <2 x i64> %2
531 }
532
533 define <4 x i32> @le_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
534 ; SSE-LABEL: le_v4i32:
535 ; SSE: # BB#0:
536 ; SSE-NEXT: pcmpgtd %xmm1, %xmm0
537 ; SSE-NEXT: pcmpeqd %xmm1, %xmm1
538 ; SSE-NEXT: pxor %xmm1, %xmm0
539 ; SSE-NEXT: retq
540 ;
541 ; AVX-LABEL: le_v4i32:
542 ; AVX: # BB#0:
543 ; AVX-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0
544 ; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
545 ; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0
546 ; AVX-NEXT: retq
547 ;
548 ; XOP-LABEL: le_v4i32:
549 ; XOP: # BB#0:
550 ; XOP-NEXT: vpcomled %xmm1, %xmm0, %xmm0
551 ; XOP-NEXT: retq
552 %1 = icmp sle <4 x i32> %a, %b
553 %2 = sext <4 x i1> %1 to <4 x i32>
554 ret <4 x i32> %2
555 }
556
557 define <8 x i16> @le_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
558 ; SSE-LABEL: le_v8i16:
559 ; SSE: # BB#0:
560 ; SSE-NEXT: pcmpgtw %xmm1, %xmm0
561 ; SSE-NEXT: pcmpeqd %xmm1, %xmm1
562 ; SSE-NEXT: pxor %xmm1, %xmm0
563 ; SSE-NEXT: retq
564 ;
565 ; AVX-LABEL: le_v8i16:
566 ; AVX: # BB#0:
567 ; AVX-NEXT: vpcmpgtw %xmm1, %xmm0, %xmm0
568 ; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
569 ; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0
570 ; AVX-NEXT: retq
571 ;
572 ; XOP-LABEL: le_v8i16:
573 ; XOP: # BB#0:
574 ; XOP-NEXT: vpcomlew %xmm1, %xmm0, %xmm0
575 ; XOP-NEXT: retq
576 %1 = icmp sle <8 x i16> %a, %b
577 %2 = sext <8 x i1> %1 to <8 x i16>
578 ret <8 x i16> %2
579 }
580
581 define <16 x i8> @le_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
582 ; SSE-LABEL: le_v16i8:
583 ; SSE: # BB#0:
584 ; SSE-NEXT: pcmpgtb %xmm1, %xmm0
585 ; SSE-NEXT: pcmpeqd %xmm1, %xmm1
586 ; SSE-NEXT: pxor %xmm1, %xmm0
587 ; SSE-NEXT: retq
588 ;
589 ; AVX-LABEL: le_v16i8:
590 ; AVX: # BB#0:
591 ; AVX-NEXT: vpcmpgtb %xmm1, %xmm0, %xmm0
592 ; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
593 ; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0
594 ; AVX-NEXT: retq
595 ;
596 ; XOP-LABEL: le_v16i8:
597 ; XOP: # BB#0:
598 ; XOP-NEXT: vpcomleb %xmm1, %xmm0, %xmm0
599 ; XOP-NEXT: retq
600 %1 = icmp sle <16 x i8> %a, %b
601 %2 = sext <16 x i1> %1 to <16 x i8>
602 ret <16 x i8> %2
603 }
604
605 ;
606 ; Less Than
607 ;
608
609 define <2 x i64> @lt_v2i64(<2 x i64> %a, <2 x i64> %b) nounwind {
610 ; SSE2-LABEL: lt_v2i64:
611 ; SSE2: # BB#0:
612 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,0,2147483648,0]
613 ; SSE2-NEXT: pxor %xmm2, %xmm0
614 ; SSE2-NEXT: pxor %xmm2, %xmm1
615 ; SSE2-NEXT: movdqa %xmm1, %xmm2
616 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm2
617 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
618 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
619 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
620 ; SSE2-NEXT: pand %xmm3, %xmm1
621 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
622 ; SSE2-NEXT: por %xmm1, %xmm0
623 ; SSE2-NEXT: retq
624 ;
625 ; SSE41-LABEL: lt_v2i64:
626 ; SSE41: # BB#0:
627 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,0,2147483648,0]
628 ; SSE41-NEXT: pxor %xmm2, %xmm0
629 ; SSE41-NEXT: pxor %xmm2, %xmm1
630 ; SSE41-NEXT: movdqa %xmm1, %xmm2
631 ; SSE41-NEXT: pcmpgtd %xmm0, %xmm2
632 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
633 ; SSE41-NEXT: pcmpeqd %xmm0, %xmm1
634 ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
635 ; SSE41-NEXT: pand %xmm3, %xmm1
636 ; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
637 ; SSE41-NEXT: por %xmm1, %xmm0
638 ; SSE41-NEXT: retq
639 ;
640 ; SSE42-LABEL: lt_v2i64:
641 ; SSE42: # BB#0:
642 ; SSE42-NEXT: pcmpgtq %xmm0, %xmm1
643 ; SSE42-NEXT: movdqa %xmm1, %xmm0
644 ; SSE42-NEXT: retq
645 ;
646 ; AVX-LABEL: lt_v2i64:
647 ; AVX: # BB#0:
648 ; AVX-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm0
649 ; AVX-NEXT: retq
650 ;
651 ; XOP-LABEL: lt_v2i64:
652 ; XOP: # BB#0:
653 ; XOP-NEXT: vpcomltq %xmm1, %xmm0, %xmm0
654 ; XOP-NEXT: retq
655 %1 = icmp slt <2 x i64> %a, %b
656 %2 = sext <2 x i1> %1 to <2 x i64>
657 ret <2 x i64> %2
658 }
659
660 define <4 x i32> @lt_v4i32(<4 x i32> %a, <4 x i32> %b) nounwind {
661 ; SSE-LABEL: lt_v4i32:
662 ; SSE: # BB#0:
663 ; SSE-NEXT: pcmpgtd %xmm0, %xmm1
664 ; SSE-NEXT: movdqa %xmm1, %xmm0
665 ; SSE-NEXT: retq
666 ;
667 ; AVX-LABEL: lt_v4i32:
668 ; AVX: # BB#0:
669 ; AVX-NEXT: vpcmpgtd %xmm0, %xmm1, %xmm0
670 ; AVX-NEXT: retq
671 ;
672 ; XOP-LABEL: lt_v4i32:
673 ; XOP: # BB#0:
674 ; XOP-NEXT: vpcomltd %xmm1, %xmm0, %xmm0
675 ; XOP-NEXT: retq
676 %1 = icmp slt <4 x i32> %a, %b
677 %2 = sext <4 x i1> %1 to <4 x i32>
678 ret <4 x i32> %2
679 }
680
681 define <8 x i16> @lt_v8i16(<8 x i16> %a, <8 x i16> %b) nounwind {
682 ; SSE-LABEL: lt_v8i16:
683 ; SSE: # BB#0:
684 ; SSE-NEXT: pcmpgtw %xmm0, %xmm1
685 ; SSE-NEXT: movdqa %xmm1, %xmm0
686 ; SSE-NEXT: retq
687 ;
688 ; AVX-LABEL: lt_v8i16:
689 ; AVX: # BB#0:
690 ; AVX-NEXT: vpcmpgtw %xmm0, %xmm1, %xmm0
691 ; AVX-NEXT: retq
692 ;
693 ; XOP-LABEL: lt_v8i16:
694 ; XOP: # BB#0:
695 ; XOP-NEXT: vpcomltw %xmm1, %xmm0, %xmm0
696 ; XOP-NEXT: retq
697 %1 = icmp slt <8 x i16> %a, %b
698 %2 = sext <8 x i1> %1 to <8 x i16>
699 ret <8 x i16> %2
700 }
701
702 define <16 x i8> @lt_v16i8(<16 x i8> %a, <16 x i8> %b) nounwind {
703 ; SSE-LABEL: lt_v16i8:
704 ; SSE: # BB#0:
705 ; SSE-NEXT: pcmpgtb %xmm0, %xmm1
706 ; SSE-NEXT: movdqa %xmm1, %xmm0
707 ; SSE-NEXT: retq
708 ;
709 ; AVX-LABEL: lt_v16i8:
710 ; AVX: # BB#0:
711 ; AVX-NEXT: vpcmpgtb %xmm0, %xmm1, %xmm0
712 ; AVX-NEXT: retq
713 ;
714 ; XOP-LABEL: lt_v16i8:
715 ; XOP: # BB#0:
716 ; XOP-NEXT: vpcomltb %xmm1, %xmm0, %xmm0
717 ; XOP-NEXT: retq
718 %1 = icmp slt <16 x i8> %a, %b
719 %2 = sext <16 x i1> %1 to <16 x i8>
720 ret <16 x i8> %2
721 }