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:
327 ; CHECK: selb $3, $5, $4, $3
330 %A = icmp ult i32 %arg1, 32768
331 %B = select i1 %A, i32 %val1, i32 %val2
335 define i32 @icmp_ule_select_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
336 ; CHECK: icmp_ule_select_i32:
338 ; CHECK: selb $3, $5, $6, $3
341 %A = icmp ule i32 %arg1, %arg2
342 %B = select i1 %A, i32 %val1, i32 %val2
346 define i1 @icmp_ule_setcc_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
347 ; CHECK: icmp_ule_setcc_i32:
355 %A = icmp ule i32 %arg1, %arg2
359 ;; Note: icmp ule i32 %arg1, <immed> can always be transformed into
360 ;; icmp ult i32 %arg1, <immed>+1
362 ;; Consequently, even though the patterns exist to match, it's unlikely
363 ;; they'll ever be generated.
365 define i32 @icmp_sgt_select_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
366 ; CHECK: icmp_sgt_select_i32:
368 ; CHECK: selb $3, $6, $5, $3
371 %A = icmp sgt i32 %arg1, %arg2
372 %B = select i1 %A, i32 %val1, i32 %val2
376 define i1 @icmp_sgt_setcc_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
377 ; CHECK: icmp_sgt_setcc_i32:
384 %A = icmp sgt i32 %arg1, %arg2
388 define i32 @icmp_sgt_immed01_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
389 ; CHECK: icmp_sgt_immed01_i32:
391 ; CHECK: selb $3, $5, $4, $3
394 %A = icmp sgt i32 %arg1, 511
395 %B = select i1 %A, i32 %val1, i32 %val2
399 define i32 @icmp_sgt_immed02_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
400 ; CHECK: icmp_sgt_immed02_i32:
402 ; CHECK: selb $3, $5, $4, $3
405 %A = icmp sgt i32 %arg1, 4294966784
406 %B = select i1 %A, i32 %val1, i32 %val2
410 define i32 @icmp_sgt_immed03_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
411 ; CHECK: icmp_sgt_immed03_i32:
413 ; CHECK: selb $3, $5, $4, $3
416 %A = icmp sgt i32 %arg1, 4294967293
417 %B = select i1 %A, i32 %val1, i32 %val2
421 define i32 @icmp_sgt_immed04_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
422 ; CHECK: icmp_sgt_immed04_i32:
425 ; CHECK: selb $3, $5, $4, $3
428 %A = icmp sgt i32 %arg1, 32768
429 %B = select i1 %A, i32 %val1, i32 %val2
433 define i32 @icmp_sge_select_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
434 ; CHECK: icmp_sge_select_i32:
438 ; CHECK: selb $3, $6, $5, $3
441 %A = icmp sge i32 %arg1, %arg2
442 %B = select i1 %A, i32 %val1, i32 %val2
446 define i1 @icmp_sge_setcc_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
447 ; CHECK: icmp_sge_setcc_i32:
456 %A = icmp sge i32 %arg1, %arg2
460 ;; Note: icmp sge i32 %arg1, <immed> can always be transformed into
461 ;; icmp sgt i32 %arg1, <immed>-1
463 ;; Consequently, even though the patterns exist to match, it's unlikely
464 ;; they'll ever be generated.
466 define i32 @icmp_slt_select_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
467 ; CHECK: icmp_slt_select_i32:
471 ; CHECK: selb $3, $6, $5, $3
474 %A = icmp slt i32 %arg1, %arg2
475 %B = select i1 %A, i32 %val1, i32 %val2
479 define i1 @icmp_slt_setcc_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
480 ; CHECK: icmp_slt_setcc_i32:
489 %A = icmp slt i32 %arg1, %arg2
493 define i32 @icmp_slt_immed01_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
494 ; CHECK: icmp_slt_immed01_i32:
498 ; CHECK: selb $3, $5, $4, $3
501 %A = icmp slt i32 %arg1, 511
502 %B = select i1 %A, i32 %val1, i32 %val2
506 define i32 @icmp_slt_immed02_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
507 ; CHECK: icmp_slt_immed02_i32:
511 ; CHECK: selb $3, $5, $4, $3
514 %A = icmp slt i32 %arg1, -512
515 %B = select i1 %A, i32 %val1, i32 %val2
519 define i32 @icmp_slt_immed03_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
520 ; CHECK: icmp_slt_immed03_i32:
524 ; CHECK: selb $3, $5, $4, $3
527 %A = icmp slt i32 %arg1, -1
528 %B = select i1 %A, i32 %val1, i32 %val2
532 define i32 @icmp_slt_immed04_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
533 ; CHECK: icmp_slt_immed04_i32:
538 ; CHECK: selb $3, $5, $4, $3
541 %A = icmp slt i32 %arg1, 32768
542 %B = select i1 %A, i32 %val1, i32 %val2
546 define i32 @icmp_sle_select_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
547 ; CHECK: icmp_sle_select_i32:
549 ; CHECK: selb $3, $5, $6, $3
552 %A = icmp sle i32 %arg1, %arg2
553 %B = select i1 %A, i32 %val1, i32 %val2
557 define i1 @icmp_sle_setcc_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
558 ; CHECK: icmp_sle_setcc_i32:
566 %A = icmp sle i32 %arg1, %arg2
570 ;; Note: icmp sle i32 %arg1, <immed> can always be transformed into
571 ;; icmp slt i32 %arg1, <immed>+1
573 ;; Consequently, even though the patterns exist to match, it's unlikely
574 ;; they'll ever be generated.