llvm/test/CodeGen/AArch64/tailcall_misched_graph.ll: s/REQUIRE/REQUIRES/
[oota-llvm.git] / test / CodeGen / PowerPC / vec_cmp.ll
1 ; RUN: llc -mcpu=pwr6 -mattr=+altivec < %s | FileCheck %s
2
3 ; Check vector comparisons using altivec. For non-native types, just basic
4 ; comparison instruction check is done. For altivec supported type (16i8,
5 ; 8i16, 4i32, and 4f32) all the comparisons operators (==, !=, >, >=, <, <=)
6 ; are checked.
7
8
9 target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64"
10 target triple = "powerpc64-unknown-linux-gnu"
11
12 define <2 x i8> @v2si8_cmp(<2 x i8> %x, <2 x i8> %y) nounwind readnone {
13   %cmp = icmp eq <2 x i8> %x, %y
14   %sext = sext <2 x i1> %cmp to <2 x i8>
15   ret <2 x i8> %sext
16 }
17 ; CHECK-LABEL: v2si8_cmp:
18 ; CHECK: vcmpequb {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}
19
20
21 define <4 x i8> @v4si8_cmp(<4 x i8> %x, <4 x i8> %y) nounwind readnone {
22   %cmp = icmp eq <4 x i8> %x, %y
23   %sext = sext <4 x i1> %cmp to <4 x i8>
24   ret <4 x i8> %sext
25 }
26 ; CHECK-LABEL: v4si8_cmp:
27 ; CHECK: vcmpequw {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}
28
29
30 define <8 x i8> @v8si8_cmp(<8 x i8> %x, <8 x i8> %y) nounwind readnone {
31   %cmp = icmp eq <8 x i8> %x, %y
32   %sext = sext <8 x i1> %cmp to <8 x i8>
33   ret <8 x i8> %sext
34 }
35 ; CHECK-LABEL: v8si8_cmp:
36 ; CHECK: vcmpequh {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}
37
38
39 ; Additional tests for v16i8 since it is a altivec native type
40
41 define <16 x i8> @v16si8_cmp_eq(<16 x i8> %x, <16 x i8> %y) nounwind readnone {
42   %cmp = icmp eq <16 x i8> %x, %y
43   %sext = sext <16 x i1> %cmp to <16 x i8>
44   ret <16 x i8> %sext
45 }
46 ; CHECK-LABEL: v16si8_cmp_eq:
47 ; CHECK: vcmpequb 2, 2, 3
48
49 define <16 x i8> @v16si8_cmp_ne(<16 x i8> %x, <16 x i8> %y) nounwind readnone {
50 entry:
51   %cmp = icmp ne <16 x i8> %x, %y
52   %sext = sext <16 x i1> %cmp to <16 x i8>
53   ret <16 x i8> %sext
54 }
55 ; CHECK-LABEL:     v16si8_cmp_ne:
56 ; CHECK:     vcmpequb [[RET:[0-9]+]], 2, 3
57 ; CHECK-NEXT: vnor     2, [[RET]], [[RET]]
58
59 define <16 x i8> @v16si8_cmp_le(<16 x i8> %x, <16 x i8> %y) nounwind readnone {
60 entry:
61   %cmp = icmp sle <16 x i8> %x, %y
62   %sext = sext <16 x i1> %cmp to <16 x i8>
63   ret <16 x i8> %sext
64 }
65 ; CHECK-LABEL:      v16si8_cmp_le:
66 ; CHECK:      vcmpgtsb [[RET:[0-9]+]], 2, 3
67 ; CHECK-NEXT: vnor     2, [[RET]], [[RET]]
68
69 define <16 x i8> @v16ui8_cmp_le(<16 x i8> %x, <16 x i8> %y) nounwind readnone {
70 entry:
71   %cmp = icmp ule <16 x i8> %x, %y
72   %sext = sext <16 x i1> %cmp to <16 x i8>
73   ret <16 x i8> %sext
74 }
75 ; CHECK-LABEL:      v16ui8_cmp_le:
76 ; CHECK:      vcmpgtub [[RET:[0-9]+]], 2, 3
77 ; CHECK-NEXT: vnor     2, [[RET]], [[RET]]
78
79 define <16 x i8> @v16si8_cmp_lt(<16 x i8> %x, <16 x i8> %y) nounwind readnone {
80 entry:
81   %cmp = icmp slt <16 x i8> %x, %y
82   %sext = sext <16 x i1> %cmp to <16 x i8>
83   ret <16 x i8> %sext
84 }
85 ; CHECK-LABEL: v16si8_cmp_lt:
86 ; CHECK: vcmpgtsb 2, 3, 2
87
88 define <16 x i8> @v16ui8_cmp_lt(<16 x i8> %x, <16 x i8> %y) nounwind readnone {
89 entry:
90   %cmp = icmp ult <16 x i8> %x, %y
91   %sext = sext <16 x i1> %cmp to <16 x i8>
92   ret <16 x i8> %sext
93 }
94 ; CHECK-LABEL: v16ui8_cmp_lt:
95 ; CHECK: vcmpgtub 2, 3, 2
96
97 define <16 x i8> @v16si8_cmp_gt(<16 x i8> %x, <16 x i8> %y) nounwind readnone {
98 entry:
99   %cmp = icmp sgt <16 x i8> %x, %y
100   %sext = sext <16 x i1> %cmp to <16 x i8>
101   ret <16 x i8> %sext
102 }
103 ; CHECK-LABEL: v16si8_cmp_gt:
104 ; CHECK: vcmpgtsb 2, 2, 3
105
106 define <16 x i8> @v16ui8_cmp_gt(<16 x i8> %x, <16 x i8> %y) nounwind readnone {
107 entry:
108   %cmp = icmp ugt <16 x i8> %x, %y
109   %sext = sext <16 x i1> %cmp to <16 x i8>
110   ret <16 x i8> %sext
111 }
112 ; CHECK-LABEL: v16ui8_cmp_gt:
113 ; CHECK: vcmpgtub 2, 2, 3
114
115 define <16 x i8> @v16si8_cmp_ge(<16 x i8> %x, <16 x i8> %y) nounwind readnone {
116 entry:
117   %cmp = icmp sge <16 x i8> %x, %y
118   %sext = sext <16 x i1> %cmp to <16 x i8>
119   ret <16 x i8> %sext
120 }
121 ; CHECK-LABEL:      v16si8_cmp_ge:
122 ; CHECK:      vcmpgtsb [[RET:[0-9]+]], 3, 2
123 ; CHECK-NEXT: vnor     2, [[RET]], [[RET]]
124
125 define <16 x i8> @v16ui8_cmp_ge(<16 x i8> %x, <16 x i8> %y) nounwind readnone {
126 entry:
127   %cmp = icmp uge <16 x i8> %x, %y
128   %sext = sext <16 x i1> %cmp to <16 x i8>
129   ret <16 x i8> %sext
130 }
131 ; CHECK-LABEL:      v16ui8_cmp_ge:
132 ; CHECK:      vcmpgtub [[RET:[0-9]+]], 3, 2
133 ; CHECK-NEXT: vnor     2, [[RET]], [[RET]]
134
135
136 define <32 x i8> @v32si8_cmp(<32 x i8> %x, <32 x i8> %y) nounwind readnone {
137   %cmp = icmp eq <32 x i8> %x, %y
138   %sext = sext <32 x i1> %cmp to <32 x i8>
139   ret <32 x i8> %sext
140 }
141 ; CHECK-LABEL: v32si8_cmp:
142 ; CHECK: vcmpequb {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}
143 ; CHECK: vcmpequb {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}
144
145
146 define <2 x i16> @v2si16_cmp(<2 x i16> %x, <2 x i16> %y) nounwind readnone {
147   %cmp = icmp eq <2 x i16> %x, %y
148   %sext = sext <2 x i1> %cmp to <2 x i16>
149   ret <2 x i16> %sext
150 }
151 ; CHECK-LABEL: v2si16_cmp:
152 ; CHECK: vcmpequh {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}
153
154
155 define <4 x i16> @v4si16_cmp(<4 x i16> %x, <4 x i16> %y) nounwind readnone {
156   %cmp = icmp eq <4 x i16> %x, %y
157   %sext = sext <4 x i1> %cmp to <4 x i16>
158   ret <4 x i16> %sext
159 }
160 ; CHECK-LABEL: v4si16_cmp:
161 ; CHECK: vcmpequw {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}
162
163
164 ; Additional tests for v8i16 since it is an altivec native type
165
166 define <8 x i16> @v8si16_cmp_eq(<8 x i16> %x, <8 x i16> %y) nounwind readnone {
167 entry:
168   %cmp = icmp eq <8 x i16> %x, %y
169   %sext = sext <8 x i1> %cmp to <8 x i16>
170   ret <8 x i16> %sext
171 }
172 ; CHECK-LABEL: v8si16_cmp_eq:
173 ; CHECK: vcmpequh 2, 2, 3
174
175 define <8 x i16> @v8si16_cmp_ne(<8 x i16> %x, <8 x i16> %y) nounwind readnone {
176 entry:
177   %cmp = icmp ne <8 x i16> %x, %y
178   %sext = sext <8 x i1> %cmp to <8 x i16>
179   ret <8 x i16> %sext
180 }
181 ; CHECK-LABEL:      v8si16_cmp_ne:
182 ; CHECK:      vcmpequh [[RET:[0-9]+]], 2, 3
183 ; CHECK-NEXT: vnor     2, [[RET]], [[RET]]
184
185 define <8 x i16> @v8si16_cmp_le(<8 x i16> %x, <8 x i16> %y) nounwind readnone {
186 entry:
187   %cmp = icmp sle <8 x i16> %x, %y
188   %sext = sext <8 x i1> %cmp to <8 x i16>
189   ret <8 x i16> %sext
190 }
191 ; CHECK-LABEL:      v8si16_cmp_le:
192 ; CHECK:      vcmpgtsh [[RET:[0-9]+]], 2, 3
193 ; CHECK-NEXT: vnor     2, [[RET]], [[RET]]
194
195 define <8 x i16> @v8ui16_cmp_le(<8 x i16> %x, <8 x i16> %y) nounwind readnone {
196 entry:
197   %cmp = icmp ule <8 x i16> %x, %y
198   %sext = sext <8 x i1> %cmp to <8 x i16>
199   ret <8 x i16> %sext
200 }
201 ; CHECK-LABEL:      v8ui16_cmp_le:
202 ; CHECK:      vcmpgtuh [[RET:[0-9]+]], 2, 3
203 ; CHECK-NEXT: vnor     2, [[RET]], [[RET]]
204
205 define <8 x i16> @v8si16_cmp_lt(<8 x i16> %x, <8 x i16> %y) nounwind readnone {
206 entry:
207   %cmp = icmp slt <8 x i16> %x, %y
208   %sext = sext <8 x i1> %cmp to <8 x i16>
209   ret <8 x i16> %sext
210 }
211 ; CHECK-LABEL: v8si16_cmp_lt:
212 ; CHECK: vcmpgtsh 2, 3, 2
213
214 define <8 x i16> @v8ui16_cmp_lt(<8 x i16> %x, <8 x i16> %y) nounwind readnone {
215 entry:
216   %cmp = icmp ult <8 x i16> %x, %y
217   %sext = sext <8 x i1> %cmp to <8 x i16>
218   ret <8 x i16> %sext
219 }
220 ; CHECK-LABEL: v8ui16_cmp_lt:
221 ; CHECK: vcmpgtuh 2, 3, 2
222
223 define <8 x i16> @v8si16_cmp_gt(<8 x i16> %x, <8 x i16> %y) nounwind readnone {
224 entry:
225   %cmp = icmp sgt <8 x i16> %x, %y
226   %sext = sext <8 x i1> %cmp to <8 x i16>
227   ret <8 x i16> %sext
228 }
229 ; CHECK-LABEL: v8si16_cmp_gt:
230 ; CHECK: vcmpgtsh 2, 2, 3
231
232 define <8 x i16> @v8ui16_cmp_gt(<8 x i16> %x, <8 x i16> %y) nounwind readnone {
233 entry:
234   %cmp = icmp ugt <8 x i16> %x, %y
235   %sext = sext <8 x i1> %cmp to <8 x i16>
236   ret <8 x i16> %sext
237 }
238 ; CHECK-LABEL: v8ui16_cmp_gt:
239 ; CHECK: vcmpgtuh 2, 2, 3
240
241 define <8 x i16> @v8si16_cmp_ge(<8 x i16> %x, <8 x i16> %y) nounwind readnone {
242 entry:
243   %cmp = icmp sge <8 x i16> %x, %y
244   %sext = sext <8 x i1> %cmp to <8 x i16>
245   ret <8 x i16> %sext
246 }
247 ; CHECK-LABEL:      v8si16_cmp_ge:
248 ; CHECK:      vcmpgtsh [[RET:[0-9]+]], 3, 2
249 ; CHECK-NEXT: vnor     2, [[RET]], [[RET]]
250
251 define <8 x i16> @v8ui16_cmp_ge(<8 x i16> %x, <8 x i16> %y) nounwind readnone {
252 entry:
253   %cmp = icmp uge <8 x i16> %x, %y
254   %sext = sext <8 x i1> %cmp to <8 x i16>
255   ret <8 x i16> %sext
256 }
257 ; CHECK-LABEL:      v8ui16_cmp_ge:
258 ; CHECK:      vcmpgtuh [[RET:[0-9]+]], 3, 2
259 ; CHECK-NEXT: vnor     2, [[RET]], [[RET]]
260
261
262 define <16 x i16> @v16si16_cmp(<16 x i16> %x, <16 x i16> %y) nounwind readnone {
263   %cmp = icmp eq <16 x i16> %x, %y
264   %sext = sext <16 x i1> %cmp to <16 x i16>
265   ret <16 x i16> %sext
266 }
267 ; CHECK-LABEL: v16si16_cmp:
268 ; CHECK: vcmpequh {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}
269 ; CHECK: vcmpequh {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}
270
271
272 define <32 x i16> @v32si16_cmp(<32 x i16> %x, <32 x i16> %y) nounwind readnone {
273   %cmp = icmp eq <32 x i16> %x, %y
274   %sext = sext <32 x i1> %cmp to <32 x i16>
275   ret <32 x i16> %sext
276 }
277 ; CHECK-LABEL: v32si16_cmp:
278 ; CHECK: vcmpequh {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}
279 ; CHECK: vcmpequh {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}
280 ; CHECK: vcmpequh {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}
281 ; CHECK: vcmpequh {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}
282
283
284 define <2 x i32> @v2si32_cmp(<2 x i32> %x, <2 x i32> %y) nounwind readnone {
285   %cmp = icmp eq <2 x i32> %x, %y
286   %sext = sext <2 x i1> %cmp to <2 x i32>
287   ret <2 x i32> %sext
288 }
289 ; CHECK-LABEL: v2si32_cmp:
290 ; CHECK: vcmpequw {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}
291
292
293 ; Additional tests for v4si32 since it is an altivec native type
294
295 define <4 x i32> @v4si32_cmp_eq(<4 x i32> %x, <4 x i32> %y) nounwind readnone {
296 entry:
297   %cmp = icmp eq <4 x i32> %x, %y
298   %sext = sext <4 x i1> %cmp to <4 x i32>
299   ret <4 x i32> %sext
300 }
301 ; CHECK-LABEL: v4si32_cmp_eq:
302 ; CHECK: vcmpequw 2, 2, 3
303
304 define <4 x i32> @v4si32_cmp_ne(<4 x i32> %x, <4 x i32> %y) nounwind readnone {
305 entry:
306   %cmp = icmp ne <4 x i32> %x, %y
307   %sext = sext <4 x i1> %cmp to <4 x i32>
308   ret <4 x i32> %sext
309 }
310 ; CHECK-LABEL:      v4si32_cmp_ne:
311 ; CHECK:      vcmpequw [[RCMP:[0-9]+]], 2, 3
312 ; CHECK-NEXT: vnor     2, [[RCMP]], [[RCMP]]
313
314 define <4 x i32> @v4si32_cmp_le(<4 x i32> %x, <4 x i32> %y) nounwind readnone {
315 entry:
316   %cmp = icmp sle <4 x i32> %x, %y
317   %sext = sext <4 x i1> %cmp to <4 x i32>
318   ret <4 x i32> %sext
319 }
320 ; CHECK-LABEL:      v4si32_cmp_le:
321 ; CHECK:      vcmpgtsw [[RET:[0-9]+]], 2, 3
322 ; CHECK-NEXT: vnor     2, [[RET]], [[RET]]
323
324 define <4 x i32> @v4ui32_cmp_le(<4 x i32> %x, <4 x i32> %y) nounwind readnone {
325 entry:
326   %cmp = icmp ule <4 x i32> %x, %y
327   %sext = sext <4 x i1> %cmp to <4 x i32>
328   ret <4 x i32> %sext
329 }
330 ; CHECK-LABEL:      v4ui32_cmp_le:
331 ; CHECK:      vcmpgtuw [[RET:[0-9]+]], 2, 3
332 ; CHECK-NEXT: vnor     2, [[RET]], [[RET]]
333
334 define <4 x i32> @v4si32_cmp_lt(<4 x i32> %x, <4 x i32> %y) nounwind readnone {
335 entry:
336   %cmp = icmp slt <4 x i32> %x, %y
337   %sext = sext <4 x i1> %cmp to <4 x i32>
338   ret <4 x i32> %sext
339 }
340 ; CHECK-LABEL: v4si32_cmp_lt:
341 ; CHECK: vcmpgtsw 2, 3, 2
342
343 define <4 x i32> @v4ui32_cmp_lt(<4 x i32> %x, <4 x i32> %y) nounwind readnone {
344 entry:
345   %cmp = icmp ult <4 x i32> %x, %y
346   %sext = sext <4 x i1> %cmp to <4 x i32>
347   ret <4 x i32> %sext
348 }
349 ; CHECK-LABEL: v4ui32_cmp_lt:
350 ; CHECK: vcmpgtuw 2, 3, 2
351
352 define <4 x i32> @v4si32_cmp_gt(<4 x i32> %x, <4 x i32> %y) nounwind readnone {
353 entry:
354   %cmp = icmp sgt <4 x i32> %x, %y
355   %sext = sext <4 x i1> %cmp to <4 x i32>
356   ret <4 x i32> %sext
357 }
358 ; CHECK-LABEL: v4si32_cmp_gt:
359 ; CHECK: vcmpgtsw 2, 2, 3
360
361 define <4 x i32> @v4ui32_cmp_gt(<4 x i32> %x, <4 x i32> %y) nounwind readnone {
362 entry:
363   %cmp = icmp ugt <4 x i32> %x, %y
364   %sext = sext <4 x i1> %cmp to <4 x i32>
365   ret <4 x i32> %sext
366 }
367 ; CHECK-LABEL: v4ui32_cmp_gt:
368 ; CHECK: vcmpgtuw 2, 2, 3
369
370 define <4 x i32> @v4si32_cmp_ge(<4 x i32> %x, <4 x i32> %y) nounwind readnone {
371 entry:
372   %cmp = icmp sge <4 x i32> %x, %y
373   %sext = sext <4 x i1> %cmp to <4 x i32>
374   ret <4 x i32> %sext
375 }
376 ; CHECK-LABEL:      v4si32_cmp_ge:
377 ; CHECK:      vcmpgtsw [[RET:[0-9]+]], 3, 2
378 ; CHECK-NEXT: vnor     2, [[RET]], [[RET]]
379
380 define <4 x i32> @v4ui32_cmp_ge(<4 x i32> %x, <4 x i32> %y) nounwind readnone {
381 entry:
382   %cmp = icmp uge <4 x i32> %x, %y
383   %sext = sext <4 x i1> %cmp to <4 x i32>
384   ret <4 x i32> %sext
385 }
386 ; CHECK-LABEL:      v4ui32_cmp_ge:
387 ; CHECK:      vcmpgtuw [[RET:[0-9]+]], 3, 2
388 ; CHECK-NEXT: vnor     2, [[RET]], [[RET]]
389
390
391 define <8 x i32> @v8si32_cmp(<8 x i32> %x, <8 x i32> %y) nounwind readnone {
392   %cmp = icmp eq <8 x i32> %x, %y
393   %sext = sext <8 x i1> %cmp to <8 x i32>
394   ret <8 x i32> %sext
395 }
396 ; CHECK-LABEL: v8si32_cmp:
397 ; CHECK: vcmpequw {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}
398 ; CHECK: vcmpequw {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}
399
400
401 define <16 x i32> @v16si32_cmp(<16 x i32> %x, <16 x i32> %y) nounwind readnone {
402   %cmp = icmp eq <16 x i32> %x, %y
403   %sext = sext <16 x i1> %cmp to <16 x i32>
404   ret <16 x i32> %sext
405 }
406 ; CHECK-LABEL: v16si32_cmp:
407 ; CHECK: vcmpequw {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}
408 ; CHECK: vcmpequw {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}
409 ; CHECK: vcmpequw {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}
410 ; CHECK: vcmpequw {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}
411
412
413 define <32 x i32> @v32si32_cmp(<32 x i32> %x, <32 x i32> %y) nounwind readnone {
414   %cmp = icmp eq <32 x i32> %x, %y
415   %sext = sext <32 x i1> %cmp to <32 x i32>
416   ret <32 x i32> %sext
417 }
418 ; CHECK-LABEL: v32si32_cmp:
419 ; CHECK: vcmpequw {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}
420 ; CHECK: vcmpequw {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}
421 ; CHECK: vcmpequw {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}
422 ; CHECK: vcmpequw {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}
423 ; CHECK: vcmpequw {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}
424 ; CHECK: vcmpequw {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}
425 ; CHECK: vcmpequw {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}
426 ; CHECK: vcmpequw {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}
427
428
429 define <2 x float> @v2f32_cmp(<2 x float> %x, <2 x float> %y) nounwind readnone {
430 entry:
431   %cmp = fcmp oeq <2 x float> %x, %y
432   %sext = sext <2 x i1> %cmp to <2 x i32>
433   %0 = bitcast <2 x i32> %sext to <2 x float>
434   ret <2 x float> %0
435 }
436 ; CHECK-LABEL: v2f32_cmp:
437 ; CHECK: vcmpeqfp {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}
438
439
440 ; Additional tests for v4f32 since it is a altivec native type
441
442 define <4 x float> @v4f32_cmp_eq(<4 x float> %x, <4 x float> %y) nounwind readnone {
443 entry:
444   %cmp = fcmp oeq <4 x float> %x, %y
445   %sext = sext <4 x i1> %cmp to <4 x i32>
446   %0 = bitcast <4 x i32> %sext to <4 x float>
447   ret <4 x float> %0
448 }
449 ; CHECK-LABEL: v4f32_cmp_eq:
450 ; CHECK: vcmpeqfp 2, 2, 3
451
452 define <4 x float> @v4f32_cmp_ne(<4 x float> %x, <4 x float> %y) nounwind readnone {
453 entry:
454   %cmp = fcmp une <4 x float> %x, %y
455   %sext = sext <4 x i1> %cmp to <4 x i32>
456   %0 = bitcast <4 x i32> %sext to <4 x float>
457   ret <4 x float> %0
458 }
459 ; CHECK-LABEL:      v4f32_cmp_ne:
460 ; CHECK:      vcmpeqfp [[RET:[0-9]+]], 2, 3
461 ; CHECK-NEXT: vnor     2, [[RET]], [[RET]]
462
463 define <4 x float> @v4f32_cmp_le(<4 x float> %x, <4 x float> %y) nounwind readnone {
464 entry:
465   %cmp = fcmp ole <4 x float> %x, %y
466   %sext = sext <4 x i1> %cmp to <4 x i32>
467   %0 = bitcast <4 x i32> %sext to <4 x float>
468   ret <4 x float> %0
469 }
470 ; CHECK-LABEL:      v4f32_cmp_le:
471 ; CHECK: vcmpgefp 2, 3, 2
472
473 define <4 x float> @v4f32_cmp_lt(<4 x float> %x, <4 x float> %y) nounwind readnone {
474 entry:
475   %cmp = fcmp olt <4 x float> %x, %y
476   %sext = sext <4 x i1> %cmp to <4 x i32>
477   %0 = bitcast <4 x i32> %sext to <4 x float>
478   ret <4 x float> %0
479 }
480 ; CHECK-LABEL: v4f32_cmp_lt:
481 ; CHECK: vcmpgtfp 2, 3, 2
482
483 define <4 x float> @v4f32_cmp_ge(<4 x float> %x, <4 x float> %y) nounwind readnone {
484 entry:
485   %cmp = fcmp oge <4 x float> %x, %y
486   %sext = sext <4 x i1> %cmp to <4 x i32>
487   %0 = bitcast <4 x i32> %sext to <4 x float>
488   ret <4 x float> %0
489 }
490 ; CHECK-LABEL: v4f32_cmp_ge:
491 ; CHECK: vcmpgefp 2, 2, 3
492
493 define <4 x float> @v4f32_cmp_gt(<4 x float> %x, <4 x float> %y) nounwind readnone {
494 entry:
495   %cmp = fcmp ogt <4 x float> %x, %y
496   %sext = sext <4 x i1> %cmp to <4 x i32>
497   %0 = bitcast <4 x i32> %sext to <4 x float>
498   ret <4 x float> %0
499 }
500 ; CHECK-LABEL: v4f32_cmp_gt:
501 ; CHECK: vcmpgtfp 2, 2, 3
502
503 define <4 x float> @v4f32_cmp_ule(<4 x float> %x, <4 x float> %y) nounwind readnone {
504 entry:
505   %cmp = fcmp ule <4 x float> %x, %y
506   %sext = sext <4 x i1> %cmp to <4 x i32>
507   %0 = bitcast <4 x i32> %sext to <4 x float>
508   ret <4 x float> %0
509 }
510 ; CHECK-LABEL: v4f32_cmp_ule:
511 ; CHECK:      vcmpgtfp [[RET:[0-9]+]], 2, 3
512 ; CHECK-NEXT: vnor     2, [[RET]], [[RET]]
513
514 define <4 x float> @v4f32_cmp_ult(<4 x float> %x, <4 x float> %y) nounwind readnone {
515 entry:
516   %cmp = fcmp ult <4 x float> %x, %y
517   %sext = sext <4 x i1> %cmp to <4 x i32>
518   %0 = bitcast <4 x i32> %sext to <4 x float>
519   ret <4 x float> %0
520 }
521 ; CHECK-LABEL: v4f32_cmp_ult:
522 ; CHECK:      vcmpgefp [[RET:[0-9]+]], 2, 3
523 ; CHECK-NEXT: vnor     2, [[RET]], [[RET]]
524
525 define <4 x float> @v4f32_cmp_uge(<4 x float> %x, <4 x float> %y) nounwind readnone {
526 entry:
527   %cmp = fcmp uge <4 x float> %x, %y
528   %sext = sext <4 x i1> %cmp to <4 x i32>
529   %0 = bitcast <4 x i32> %sext to <4 x float>
530   ret <4 x float> %0
531 }
532 ; CHECK-LABEL: v4f32_cmp_uge:
533 ; CHECK:      vcmpgtfp [[RET:[0-9]+]], 3, 2
534 ; CHECK-NEXT: vnor     2, [[RET]], [[RET]]
535
536 define <4 x float> @v4f32_cmp_ugt(<4 x float> %x, <4 x float> %y) nounwind readnone {
537 entry:
538   %cmp = fcmp ugt <4 x float> %x, %y
539   %sext = sext <4 x i1> %cmp to <4 x i32>
540   %0 = bitcast <4 x i32> %sext to <4 x float>
541   ret <4 x float> %0
542 }
543 ; CHECK-LABEL: v4f32_cmp_ugt:
544 ; CHECK:      vcmpgefp [[RET:[0-9]+]], 3, 2
545 ; CHECK-NEXT: vnor     2, [[RET]], [[RET]]
546
547
548 define <8 x float> @v8f32_cmp(<8 x float> %x, <8 x float> %y) nounwind readnone {
549 entry:
550   %cmp = fcmp oeq <8 x float> %x, %y
551   %sext = sext <8 x i1> %cmp to <8 x i32>
552   %0 = bitcast <8 x i32> %sext to <8 x float>
553   ret <8 x float> %0
554 }
555 ; CHECK-LABEL: v8f32_cmp:
556 ; CHECK: vcmpeqfp {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}
557 ; CHECK: vcmpeqfp {{[0-9]+}}, {{[0-9]+}}, {{[0-9]+}}