Rewrite three tests that had truly egregious abuses of 'grep' in them to
[oota-llvm.git] / test / CodeGen / CellSPU / icmp32.ll
1 ; RUN: llc < %s -march=cellspu | FileCheck %s
2
3 target datalayout = "E-p:32:32:128-f64:64:128-f32:32:128-i64:32:128-i32:32:128-i16:16:128-i8:8:128-i1:8:128-a0:0:128-v128:128:128-s0:128:128"
4 target triple = "spu"
5
6 ; $3 = %arg1, $4 = %arg2, $5 = %val1, $6 = %val2
7 ; $3 = %arg1, $4 = %val1, $5 = %val2
8 ;
9 ; For "positive" comparisons:
10 ; selb $3, $6, $5, <i1>
11 ; selb $3, $5, $4, <i1>
12 ;
13 ; For "negative" comparisons, i.e., those where the result of the comparison
14 ; must be inverted (setne, for example):
15 ; selb $3, $5, $6, <i1>
16 ; selb $3, $4, $5, <i1>
17
18 ; i32 integer comparisons:
19 define i32 @icmp_eq_select_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
20 ; CHECK:      icmp_eq_select_i32:
21 ; CHECK:        ceq
22 ; CHECK:        selb $3, $6, $5, $3
23
24 entry:
25        %A = icmp eq i32 %arg1, %arg2
26        %B = select i1 %A, i32 %val1, i32 %val2
27        ret i32 %B
28 }
29
30 define i1 @icmp_eq_setcc_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
31 ; CHECK:      icmp_eq_setcc_i32:
32 ; CHECK:        ilhu
33 ; CHECK:        ceq
34 ; CHECK:        iohl
35 ; CHECK:        shufb
36
37 entry:
38        %A = icmp eq i32 %arg1, %arg2
39        ret i1 %A
40 }
41
42 define i32 @icmp_eq_immed01_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
43 ; CHECK:      icmp_eq_immed01_i32:
44 ; CHECK:        ceqi
45 ; CHECK:        selb $3, $5, $4, $3
46
47 entry:
48        %A = icmp eq i32 %arg1, 511
49        %B = select i1 %A, i32 %val1, i32 %val2
50        ret i32 %B
51 }
52
53 define i32 @icmp_eq_immed02_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
54 ; CHECK:      icmp_eq_immed02_i32:
55 ; CHECK:        ceqi
56 ; CHECK:        selb $3, $5, $4, $3
57
58 entry:
59        %A = icmp eq i32 %arg1, -512
60        %B = select i1 %A, i32 %val1, i32 %val2
61        ret i32 %B
62 }
63
64 define i32 @icmp_eq_immed03_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
65 ; CHECK:      icmp_eq_immed03_i32:
66 ; CHECK:        ceqi
67 ; CHECK:        selb $3, $5, $4, $3
68
69 entry:
70        %A = icmp eq i32 %arg1, -1
71        %B = select i1 %A, i32 %val1, i32 %val2
72        ret i32 %B
73 }
74
75 define i32 @icmp_eq_immed04_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
76 ; CHECK:      icmp_eq_immed04_i32:
77 ; CHECK:        ila
78 ; CHECK:        ceq
79 ; CHECK:        selb $3, $5, $4, $3
80
81 entry:
82        %A = icmp eq i32 %arg1, 32768
83        %B = select i1 %A, i32 %val1, i32 %val2
84        ret i32 %B
85 }
86
87 define i32 @icmp_ne_select_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
88 ; CHECK:      icmp_ne_select_i32:
89 ; CHECK:        ceq
90 ; CHECK:        selb $3, $5, $6, $3
91
92 entry:
93        %A = icmp ne i32 %arg1, %arg2
94        %B = select i1 %A, i32 %val1, i32 %val2
95        ret i32 %B
96 }
97
98 define i1 @icmp_ne_setcc_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
99 ; CHECK:      icmp_ne_setcc_i32:
100 ; CHECK:        ceq
101 ; CHECK:        ilhu
102 ; CHECK:        xori
103 ; CHECK:        iohl
104 ; CHECK:        shufb
105
106 entry:
107        %A = icmp ne i32 %arg1, %arg2
108        ret i1 %A
109 }
110
111 define i32 @icmp_ne_immed01_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
112 ; CHECK:      icmp_ne_immed01_i32:
113 ; CHECK:        ceqi
114 ; CHECK:        selb $3, $4, $5, $3
115
116 entry:
117        %A = icmp ne i32 %arg1, 511
118        %B = select i1 %A, i32 %val1, i32 %val2
119        ret i32 %B
120 }
121
122 define i32 @icmp_ne_immed02_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
123 ; CHECK:      icmp_ne_immed02_i32:
124 ; CHECK:        ceqi
125 ; CHECK:        selb $3, $4, $5, $3
126
127 entry:
128        %A = icmp ne i32 %arg1, -512
129        %B = select i1 %A, i32 %val1, i32 %val2
130        ret i32 %B
131 }
132
133 define i32 @icmp_ne_immed03_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
134 ; CHECK:      icmp_ne_immed03_i32:
135 ; CHECK:        ceqi
136 ; CHECK:        selb $3, $4, $5, $3
137
138 entry:
139        %A = icmp ne i32 %arg1, -1
140        %B = select i1 %A, i32 %val1, i32 %val2
141        ret i32 %B
142 }
143
144 define i32 @icmp_ne_immed04_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
145 ; CHECK:      icmp_ne_immed04_i32:
146 ; CHECK:        ila
147 ; CHECK:        ceq
148 ; CHECK:        selb $3, $4, $5, $3
149
150 entry:
151        %A = icmp ne i32 %arg1, 32768
152        %B = select i1 %A, i32 %val1, i32 %val2
153        ret i32 %B
154 }
155
156 define i32 @icmp_ugt_select_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
157 ; CHECK:      icmp_ugt_select_i32:
158 ; CHECK:        clgt
159 ; CHECK:        selb $3, $6, $5, $3
160
161 entry:
162        %A = icmp ugt i32 %arg1, %arg2
163        %B = select i1 %A, i32 %val1, i32 %val2
164        ret i32 %B
165 }
166
167 define i1 @icmp_ugt_setcc_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
168 ; CHECK:      icmp_ugt_setcc_i32:
169 ; CHECK:        ilhu
170 ; CHECK:        clgt
171 ; CHECK:        iohl
172 ; CHECK:        shufb
173
174 entry:
175        %A = icmp ugt i32 %arg1, %arg2
176        ret i1 %A
177 }
178
179 define i32 @icmp_ugt_immed01_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
180 ; CHECK:      icmp_ugt_immed01_i32:
181 ; CHECK:        clgti
182 ; CHECK:        selb $3, $5, $4, $3
183
184 entry:
185        %A = icmp ugt i32 %arg1, 511
186        %B = select i1 %A, i32 %val1, i32 %val2
187        ret i32 %B
188 }
189
190 define i32 @icmp_ugt_immed02_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
191 ; CHECK:      icmp_ugt_immed02_i32:
192 ; CHECK:        clgti
193 ; CHECK:        selb $3, $5, $4, $3
194
195 entry:
196        %A = icmp ugt i32 %arg1, 4294966784
197        %B = select i1 %A, i32 %val1, i32 %val2
198        ret i32 %B
199 }
200
201 define i32 @icmp_ugt_immed03_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
202 ; CHECK:      icmp_ugt_immed03_i32:
203 ; CHECK:        clgti
204 ; CHECK:        selb $3, $5, $4, $3
205
206 entry:
207        %A = icmp ugt i32 %arg1, 4294967293
208        %B = select i1 %A, i32 %val1, i32 %val2
209        ret i32 %B
210 }
211
212 define i32 @icmp_ugt_immed04_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
213 ; CHECK:      icmp_ugt_immed04_i32:
214 ; CHECK:        ila
215 ; CHECK:        clgt
216 ; CHECK:        selb $3, $5, $4, $3
217
218 entry:
219        %A = icmp ugt i32 %arg1, 32768
220        %B = select i1 %A, i32 %val1, i32 %val2
221        ret i32 %B
222 }
223
224 define i32 @icmp_uge_select_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
225 ; CHECK:      icmp_uge_select_i32:
226 ; CHECK:        ceq
227 ; CHECK:        clgt
228 ; CHECK:        or
229 ; CHECK:        selb $3, $6, $5, $3
230
231 entry:
232        %A = icmp uge i32 %arg1, %arg2
233        %B = select i1 %A, i32 %val1, i32 %val2
234        ret i32 %B
235 }
236
237 define i1 @icmp_uge_setcc_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
238 ; CHECK:      icmp_uge_setcc_i32:
239 ; CHECK:        ceq
240 ; CHECK:        clgt
241 ; CHECK:        ilhu
242 ; CHECK:        or
243 ; CHECK:        iohl
244 ; CHECK:        shufb
245
246 entry:
247        %A = icmp uge i32 %arg1, %arg2
248        ret i1 %A
249 }
250
251 ;; Note: icmp uge i32 %arg1, <immed> can always be transformed into
252 ;;       icmp ugt i32 %arg1, <immed>-1
253 ;;
254 ;; Consequently, even though the patterns exist to match, it's unlikely
255 ;; they'll ever be generated.
256
257 define i32 @icmp_ult_select_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
258 ; CHECK:      icmp_ult_select_i32:
259 ; CHECK:        ceq
260 ; CHECK:        clgt
261 ; CHECK:        nor
262 ; CHECK:        selb $3, $6, $5, $3
263
264 entry:
265        %A = icmp ult i32 %arg1, %arg2
266        %B = select i1 %A, i32 %val1, i32 %val2
267        ret i32 %B
268 }
269
270 define i1 @icmp_ult_setcc_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
271 ; CHECK:      icmp_ult_setcc_i32:
272 ; CHECK:        ceq
273 ; CHECK:        clgt
274 ; CHECK:        ilhu
275 ; CHECK:        nor
276 ; CHECK:        iohl
277 ; CHECK:        shufb
278
279 entry:
280        %A = icmp ult i32 %arg1, %arg2
281        ret i1 %A
282 }
283
284 define i32 @icmp_ult_immed01_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
285 ; CHECK:      icmp_ult_immed01_i32:
286 ; CHECK:        ceqi
287 ; CHECK:        clgti
288 ; CHECK:        nor
289 ; CHECK:        selb $3, $5, $4, $3
290
291 entry:
292        %A = icmp ult i32 %arg1, 511
293        %B = select i1 %A, i32 %val1, i32 %val2
294        ret i32 %B
295 }
296
297 define i32 @icmp_ult_immed02_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
298 ; CHECK:      icmp_ult_immed02_i32:
299 ; CHECK:        ceqi
300 ; CHECK:        clgti
301 ; CHECK:        nor
302 ; CHECK:        selb $3, $5, $4, $3
303
304 entry:
305        %A = icmp ult i32 %arg1, 4294966784
306        %B = select i1 %A, i32 %val1, i32 %val2
307        ret i32 %B
308 }
309
310 define i32 @icmp_ult_immed03_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
311 ; CHECK:      icmp_ult_immed03_i32:
312 ; CHECK:        ceqi
313 ; CHECK:        clgti
314 ; CHECK:        nor
315 ; CHECK:        selb $3, $5, $4, $3
316
317 entry:
318        %A = icmp ult i32 %arg1, 4294967293
319        %B = select i1 %A, i32 %val1, i32 %val2
320        ret i32 %B
321 }
322
323 define i32 @icmp_ult_immed04_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
324 ; CHECK:      icmp_ult_immed04_i32:
325 ; CHECK:        ila
326 ; CHECK:        ceq
327 ; CHECK:        clgt
328 ; CHECK:        nor
329 ; CHECK:        selb $3, $5, $4, $3
330
331 entry:
332        %A = icmp ult i32 %arg1, 32768
333        %B = select i1 %A, i32 %val1, i32 %val2
334        ret i32 %B
335 }
336
337 define i32 @icmp_ule_select_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
338 ; CHECK:      icmp_ule_select_i32:
339 ; CHECK:        clgt
340 ; CHECK:        selb $3, $5, $6, $3
341
342 entry:
343        %A = icmp ule i32 %arg1, %arg2
344        %B = select i1 %A, i32 %val1, i32 %val2
345        ret i32 %B
346 }
347
348 define i1 @icmp_ule_setcc_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
349 ; CHECK:      icmp_ule_setcc_i32:
350 ; CHECK:        clgt
351 ; CHECK:        ilhu
352 ; CHECK:        xori
353 ; CHECK:        iohl
354 ; CHECK:        shufb
355
356 entry:
357        %A = icmp ule i32 %arg1, %arg2
358        ret i1 %A
359 }
360
361 ;; Note: icmp ule i32 %arg1, <immed> can always be transformed into
362 ;;       icmp ult i32 %arg1, <immed>+1
363 ;;
364 ;; Consequently, even though the patterns exist to match, it's unlikely
365 ;; they'll ever be generated.
366
367 define i32 @icmp_sgt_select_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
368 ; CHECK:      icmp_sgt_select_i32:
369 ; CHECK:        cgt
370 ; CHECK:        selb $3, $6, $5, $3
371
372 entry:
373        %A = icmp sgt i32 %arg1, %arg2
374        %B = select i1 %A, i32 %val1, i32 %val2
375        ret i32 %B
376 }
377
378 define i1 @icmp_sgt_setcc_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
379 ; CHECK:      icmp_sgt_setcc_i32:
380 ; CHECK:        ilhu
381 ; CHECK:        cgt
382 ; CHECK:        iohl
383 ; CHECK:        shufb
384
385 entry:
386        %A = icmp sgt i32 %arg1, %arg2
387        ret i1 %A
388 }
389
390 define i32 @icmp_sgt_immed01_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
391 ; CHECK:      icmp_sgt_immed01_i32:
392 ; CHECK:        cgti
393 ; CHECK:        selb $3, $5, $4, $3
394
395 entry:
396        %A = icmp sgt i32 %arg1, 511
397        %B = select i1 %A, i32 %val1, i32 %val2
398        ret i32 %B
399 }
400
401 define i32 @icmp_sgt_immed02_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
402 ; CHECK:      icmp_sgt_immed02_i32:
403 ; CHECK:        cgti
404 ; CHECK:        selb $3, $5, $4, $3
405
406 entry:
407        %A = icmp sgt i32 %arg1, 4294966784
408        %B = select i1 %A, i32 %val1, i32 %val2
409        ret i32 %B
410 }
411
412 define i32 @icmp_sgt_immed03_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
413 ; CHECK:      icmp_sgt_immed03_i32:
414 ; CHECK:        cgti
415 ; CHECK:        selb $3, $5, $4, $3
416
417 entry:
418        %A = icmp sgt i32 %arg1, 4294967293
419        %B = select i1 %A, i32 %val1, i32 %val2
420        ret i32 %B
421 }
422
423 define i32 @icmp_sgt_immed04_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
424 ; CHECK:      icmp_sgt_immed04_i32:
425 ; CHECK:        ila
426 ; CHECK:        cgt
427 ; CHECK:        selb $3, $5, $4, $3
428
429 entry:
430        %A = icmp sgt i32 %arg1, 32768
431        %B = select i1 %A, i32 %val1, i32 %val2
432        ret i32 %B
433 }
434
435 define i32 @icmp_sge_select_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
436 ; CHECK:      icmp_sge_select_i32:
437 ; CHECK:        ceq
438 ; CHECK:        cgt
439 ; CHECK:        or
440 ; CHECK:        selb $3, $6, $5, $3
441
442 entry:
443        %A = icmp sge i32 %arg1, %arg2
444        %B = select i1 %A, i32 %val1, i32 %val2
445        ret i32 %B
446 }
447
448 define i1 @icmp_sge_setcc_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
449 ; CHECK:      icmp_sge_setcc_i32:
450 ; CHECK:        ceq
451 ; CHECK:        cgt
452 ; CHECK:        ilhu
453 ; CHECK:        or
454 ; CHECK:        iohl
455 ; CHECK:        shufb
456
457 entry:
458        %A = icmp sge i32 %arg1, %arg2
459        ret i1 %A
460 }
461
462 ;; Note: icmp sge i32 %arg1, <immed> can always be transformed into
463 ;;       icmp sgt i32 %arg1, <immed>-1
464 ;;
465 ;; Consequently, even though the patterns exist to match, it's unlikely
466 ;; they'll ever be generated.
467
468 define i32 @icmp_slt_select_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
469 ; CHECK:      icmp_slt_select_i32:
470 ; CHECK:        ceq
471 ; CHECK:        cgt
472 ; CHECK:        nor
473 ; CHECK:        selb $3, $6, $5, $3
474
475 entry:
476        %A = icmp slt i32 %arg1, %arg2
477        %B = select i1 %A, i32 %val1, i32 %val2
478        ret i32 %B
479 }
480
481 define i1 @icmp_slt_setcc_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
482 ; CHECK:      icmp_slt_setcc_i32:
483 ; CHECK:        ceq
484 ; CHECK:        cgt
485 ; CHECK:        ilhu
486 ; CHECK:        nor
487 ; CHECK:        iohl
488 ; CHECK:        shufb
489
490 entry:
491        %A = icmp slt i32 %arg1, %arg2
492        ret i1 %A
493 }
494
495 define i32 @icmp_slt_immed01_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
496 ; CHECK:      icmp_slt_immed01_i32:
497 ; CHECK:        ceqi
498 ; CHECK:        cgti
499 ; CHECK:        nor
500 ; CHECK:        selb $3, $5, $4, $3
501
502 entry:
503        %A = icmp slt i32 %arg1, 511
504        %B = select i1 %A, i32 %val1, i32 %val2
505        ret i32 %B
506 }
507
508 define i32 @icmp_slt_immed02_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
509 ; CHECK:      icmp_slt_immed02_i32:
510 ; CHECK:        ceqi
511 ; CHECK:        cgti
512 ; CHECK:        nor
513 ; CHECK:        selb $3, $5, $4, $3
514
515 entry:
516        %A = icmp slt i32 %arg1, -512
517        %B = select i1 %A, i32 %val1, i32 %val2
518        ret i32 %B
519 }
520
521 define i32 @icmp_slt_immed03_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
522 ; CHECK:      icmp_slt_immed03_i32:
523 ; CHECK:        ceqi
524 ; CHECK:        cgti
525 ; CHECK:        nor
526 ; CHECK:        selb $3, $5, $4, $3
527
528 entry:
529        %A = icmp slt i32 %arg1, -1
530        %B = select i1 %A, i32 %val1, i32 %val2
531        ret i32 %B
532 }
533
534 define i32 @icmp_slt_immed04_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
535 ; CHECK:      icmp_slt_immed04_i32:
536 ; CHECK:        ila
537 ; CHECK:        ceq
538 ; CHECK:        cgt
539 ; CHECK:        nor
540 ; CHECK:        selb $3, $5, $4, $3
541
542 entry:
543        %A = icmp slt i32 %arg1, 32768
544        %B = select i1 %A, i32 %val1, i32 %val2
545        ret i32 %B
546 }
547
548 define i32 @icmp_sle_select_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
549 ; CHECK:      icmp_sle_select_i32:
550 ; CHECK:        cgt
551 ; CHECK:        selb $3, $5, $6, $3
552
553 entry:
554        %A = icmp sle i32 %arg1, %arg2
555        %B = select i1 %A, i32 %val1, i32 %val2
556        ret i32 %B
557 }
558
559 define i1 @icmp_sle_setcc_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
560 ; CHECK:      icmp_sle_setcc_i32:
561 ; CHECK:        cgt
562 ; CHECK:        ilhu
563 ; CHECK:        xori
564 ; CHECK:        iohl
565 ; CHECK:        shufb
566
567 entry:
568        %A = icmp sle i32 %arg1, %arg2
569        ret i1 %A
570 }
571
572 ;; Note: icmp sle i32 %arg1, <immed> can always be transformed into
573 ;;       icmp slt i32 %arg1, <immed>+1
574 ;;
575 ;; Consequently, even though the patterns exist to match, it's unlikely
576 ;; they'll ever be generated.
577