1 ; RUN: llc < %s -march=cellspu | FileCheck %s
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"
6 ; $3 = %arg1, $4 = %arg2, $5 = %val1, $6 = %val2
7 ; $3 = %arg1, $4 = %val1, $5 = %val2
9 ; For "positive" comparisons:
10 ; selb $3, $6, $5, <i1>
11 ; selb $3, $5, $4, <i1>
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>
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:
22 ; CHECK: selb $3, $6, $5, $3
25 %A = icmp eq i32 %arg1, %arg2
26 %B = select i1 %A, i32 %val1, i32 %val2
30 define i1 @icmp_eq_setcc_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
31 ; CHECK: icmp_eq_setcc_i32:
38 %A = icmp eq i32 %arg1, %arg2
42 define i32 @icmp_eq_immed01_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
43 ; CHECK: icmp_eq_immed01_i32:
45 ; CHECK: selb $3, $5, $4, $3
48 %A = icmp eq i32 %arg1, 511
49 %B = select i1 %A, i32 %val1, i32 %val2
53 define i32 @icmp_eq_immed02_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
54 ; CHECK: icmp_eq_immed02_i32:
56 ; CHECK: selb $3, $5, $4, $3
59 %A = icmp eq i32 %arg1, -512
60 %B = select i1 %A, i32 %val1, i32 %val2
64 define i32 @icmp_eq_immed03_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
65 ; CHECK: icmp_eq_immed03_i32:
67 ; CHECK: selb $3, $5, $4, $3
70 %A = icmp eq i32 %arg1, -1
71 %B = select i1 %A, i32 %val1, i32 %val2
75 define i32 @icmp_eq_immed04_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
76 ; CHECK: icmp_eq_immed04_i32:
79 ; CHECK: selb $3, $5, $4, $3
82 %A = icmp eq i32 %arg1, 32768
83 %B = select i1 %A, i32 %val1, i32 %val2
87 define i32 @icmp_ne_select_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
88 ; CHECK: icmp_ne_select_i32:
90 ; CHECK: selb $3, $5, $6, $3
93 %A = icmp ne i32 %arg1, %arg2
94 %B = select i1 %A, i32 %val1, i32 %val2
98 define i1 @icmp_ne_setcc_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
99 ; CHECK: icmp_ne_setcc_i32:
107 %A = icmp ne i32 %arg1, %arg2
111 define i32 @icmp_ne_immed01_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
112 ; CHECK: icmp_ne_immed01_i32:
114 ; CHECK: selb $3, $4, $5, $3
117 %A = icmp ne i32 %arg1, 511
118 %B = select i1 %A, i32 %val1, i32 %val2
122 define i32 @icmp_ne_immed02_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
123 ; CHECK: icmp_ne_immed02_i32:
125 ; CHECK: selb $3, $4, $5, $3
128 %A = icmp ne i32 %arg1, -512
129 %B = select i1 %A, i32 %val1, i32 %val2
133 define i32 @icmp_ne_immed03_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
134 ; CHECK: icmp_ne_immed03_i32:
136 ; CHECK: selb $3, $4, $5, $3
139 %A = icmp ne i32 %arg1, -1
140 %B = select i1 %A, i32 %val1, i32 %val2
144 define i32 @icmp_ne_immed04_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
145 ; CHECK: icmp_ne_immed04_i32:
148 ; CHECK: selb $3, $4, $5, $3
151 %A = icmp ne i32 %arg1, 32768
152 %B = select i1 %A, i32 %val1, i32 %val2
156 define i32 @icmp_ugt_select_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
157 ; CHECK: icmp_ugt_select_i32:
159 ; CHECK: selb $3, $6, $5, $3
162 %A = icmp ugt i32 %arg1, %arg2
163 %B = select i1 %A, i32 %val1, i32 %val2
167 define i1 @icmp_ugt_setcc_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
168 ; CHECK: icmp_ugt_setcc_i32:
175 %A = icmp ugt i32 %arg1, %arg2
179 define i32 @icmp_ugt_immed01_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
180 ; CHECK: icmp_ugt_immed01_i32:
182 ; CHECK: selb $3, $5, $4, $3
185 %A = icmp ugt i32 %arg1, 511
186 %B = select i1 %A, i32 %val1, i32 %val2
190 define i32 @icmp_ugt_immed02_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
191 ; CHECK: icmp_ugt_immed02_i32:
193 ; CHECK: selb $3, $5, $4, $3
196 %A = icmp ugt i32 %arg1, 4294966784
197 %B = select i1 %A, i32 %val1, i32 %val2
201 define i32 @icmp_ugt_immed03_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
202 ; CHECK: icmp_ugt_immed03_i32:
204 ; CHECK: selb $3, $5, $4, $3
207 %A = icmp ugt i32 %arg1, 4294967293
208 %B = select i1 %A, i32 %val1, i32 %val2
212 define i32 @icmp_ugt_immed04_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
213 ; CHECK: icmp_ugt_immed04_i32:
216 ; CHECK: selb $3, $5, $4, $3
219 %A = icmp ugt i32 %arg1, 32768
220 %B = select i1 %A, i32 %val1, i32 %val2
224 define i32 @icmp_uge_select_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
225 ; CHECK: icmp_uge_select_i32:
229 ; CHECK: selb $3, $6, $5, $3
232 %A = icmp uge i32 %arg1, %arg2
233 %B = select i1 %A, i32 %val1, i32 %val2
237 define i1 @icmp_uge_setcc_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
238 ; CHECK: icmp_uge_setcc_i32:
247 %A = icmp uge i32 %arg1, %arg2
251 ;; Note: icmp uge i32 %arg1, <immed> can always be transformed into
252 ;; icmp ugt i32 %arg1, <immed>-1
254 ;; Consequently, even though the patterns exist to match, it's unlikely
255 ;; they'll ever be generated.
257 define i32 @icmp_ult_select_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
258 ; CHECK: icmp_ult_select_i32:
262 ; CHECK: selb $3, $6, $5, $3
265 %A = icmp ult i32 %arg1, %arg2
266 %B = select i1 %A, i32 %val1, i32 %val2
270 define i1 @icmp_ult_setcc_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
271 ; CHECK: icmp_ult_setcc_i32:
280 %A = icmp ult i32 %arg1, %arg2
284 define i32 @icmp_ult_immed01_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
285 ; CHECK: icmp_ult_immed01_i32:
289 ; CHECK: selb $3, $5, $4, $3
292 %A = icmp ult i32 %arg1, 511
293 %B = select i1 %A, i32 %val1, i32 %val2
297 define i32 @icmp_ult_immed02_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
298 ; CHECK: icmp_ult_immed02_i32:
302 ; CHECK: selb $3, $5, $4, $3
305 %A = icmp ult i32 %arg1, 4294966784
306 %B = select i1 %A, i32 %val1, i32 %val2
310 define i32 @icmp_ult_immed03_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
311 ; CHECK: icmp_ult_immed03_i32:
315 ; CHECK: selb $3, $5, $4, $3
318 %A = icmp ult i32 %arg1, 4294967293
319 %B = select i1 %A, i32 %val1, i32 %val2
323 define i32 @icmp_ult_immed04_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
324 ; CHECK: icmp_ult_immed04_i32:
329 ; CHECK: selb $3, $5, $4, $3
332 %A = icmp ult i32 %arg1, 32768
333 %B = select i1 %A, i32 %val1, i32 %val2
337 define i32 @icmp_ule_select_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
338 ; CHECK: icmp_ule_select_i32:
340 ; CHECK: selb $3, $5, $6, $3
343 %A = icmp ule i32 %arg1, %arg2
344 %B = select i1 %A, i32 %val1, i32 %val2
348 define i1 @icmp_ule_setcc_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
349 ; CHECK: icmp_ule_setcc_i32:
357 %A = icmp ule i32 %arg1, %arg2
361 ;; Note: icmp ule i32 %arg1, <immed> can always be transformed into
362 ;; icmp ult i32 %arg1, <immed>+1
364 ;; Consequently, even though the patterns exist to match, it's unlikely
365 ;; they'll ever be generated.
367 define i32 @icmp_sgt_select_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
368 ; CHECK: icmp_sgt_select_i32:
370 ; CHECK: selb $3, $6, $5, $3
373 %A = icmp sgt i32 %arg1, %arg2
374 %B = select i1 %A, i32 %val1, i32 %val2
378 define i1 @icmp_sgt_setcc_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
379 ; CHECK: icmp_sgt_setcc_i32:
386 %A = icmp sgt i32 %arg1, %arg2
390 define i32 @icmp_sgt_immed01_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
391 ; CHECK: icmp_sgt_immed01_i32:
393 ; CHECK: selb $3, $5, $4, $3
396 %A = icmp sgt i32 %arg1, 511
397 %B = select i1 %A, i32 %val1, i32 %val2
401 define i32 @icmp_sgt_immed02_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
402 ; CHECK: icmp_sgt_immed02_i32:
404 ; CHECK: selb $3, $5, $4, $3
407 %A = icmp sgt i32 %arg1, 4294966784
408 %B = select i1 %A, i32 %val1, i32 %val2
412 define i32 @icmp_sgt_immed03_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
413 ; CHECK: icmp_sgt_immed03_i32:
415 ; CHECK: selb $3, $5, $4, $3
418 %A = icmp sgt i32 %arg1, 4294967293
419 %B = select i1 %A, i32 %val1, i32 %val2
423 define i32 @icmp_sgt_immed04_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
424 ; CHECK: icmp_sgt_immed04_i32:
427 ; CHECK: selb $3, $5, $4, $3
430 %A = icmp sgt i32 %arg1, 32768
431 %B = select i1 %A, i32 %val1, i32 %val2
435 define i32 @icmp_sge_select_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
436 ; CHECK: icmp_sge_select_i32:
440 ; CHECK: selb $3, $6, $5, $3
443 %A = icmp sge i32 %arg1, %arg2
444 %B = select i1 %A, i32 %val1, i32 %val2
448 define i1 @icmp_sge_setcc_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
449 ; CHECK: icmp_sge_setcc_i32:
458 %A = icmp sge i32 %arg1, %arg2
462 ;; Note: icmp sge i32 %arg1, <immed> can always be transformed into
463 ;; icmp sgt i32 %arg1, <immed>-1
465 ;; Consequently, even though the patterns exist to match, it's unlikely
466 ;; they'll ever be generated.
468 define i32 @icmp_slt_select_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
469 ; CHECK: icmp_slt_select_i32:
473 ; CHECK: selb $3, $6, $5, $3
476 %A = icmp slt i32 %arg1, %arg2
477 %B = select i1 %A, i32 %val1, i32 %val2
481 define i1 @icmp_slt_setcc_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
482 ; CHECK: icmp_slt_setcc_i32:
491 %A = icmp slt i32 %arg1, %arg2
495 define i32 @icmp_slt_immed01_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
496 ; CHECK: icmp_slt_immed01_i32:
500 ; CHECK: selb $3, $5, $4, $3
503 %A = icmp slt i32 %arg1, 511
504 %B = select i1 %A, i32 %val1, i32 %val2
508 define i32 @icmp_slt_immed02_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
509 ; CHECK: icmp_slt_immed02_i32:
513 ; CHECK: selb $3, $5, $4, $3
516 %A = icmp slt i32 %arg1, -512
517 %B = select i1 %A, i32 %val1, i32 %val2
521 define i32 @icmp_slt_immed03_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
522 ; CHECK: icmp_slt_immed03_i32:
526 ; CHECK: selb $3, $5, $4, $3
529 %A = icmp slt i32 %arg1, -1
530 %B = select i1 %A, i32 %val1, i32 %val2
534 define i32 @icmp_slt_immed04_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
535 ; CHECK: icmp_slt_immed04_i32:
540 ; CHECK: selb $3, $5, $4, $3
543 %A = icmp slt i32 %arg1, 32768
544 %B = select i1 %A, i32 %val1, i32 %val2
548 define i32 @icmp_sle_select_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
549 ; CHECK: icmp_sle_select_i32:
551 ; CHECK: selb $3, $5, $6, $3
554 %A = icmp sle i32 %arg1, %arg2
555 %B = select i1 %A, i32 %val1, i32 %val2
559 define i1 @icmp_sle_setcc_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
560 ; CHECK: icmp_sle_setcc_i32:
568 %A = icmp sle i32 %arg1, %arg2
572 ;; Note: icmp sle i32 %arg1, <immed> can always be transformed into
573 ;; icmp slt i32 %arg1, <immed>+1
575 ;; Consequently, even though the patterns exist to match, it's unlikely
576 ;; they'll ever be generated.