Fix ordering of operands on lowering of atomicrmw min/max nodes on ARM.
[oota-llvm.git] / test / CodeGen / CellSPU / icmp8.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 ; i8 integer comparisons:
19 define i8 @icmp_eq_select_i8(i8 %arg1, i8 %arg2, i8 %val1, i8 %val2) nounwind {
20 ; CHECK:      icmp_eq_select_i8:
21 ; CHECK:        ceqb
22 ; CHECK:        selb $3, $6, $5, $3
23
24 entry:
25        %A = icmp eq i8 %arg1, %arg2
26        %B = select i1 %A, i8 %val1, i8 %val2
27        ret i8 %B
28 }
29
30 define i1 @icmp_eq_setcc_i8(i8 %arg1, i8 %arg2, i8 %val1, i8 %val2) nounwind {
31 ; CHECK:      icmp_eq_setcc_i8:
32 ; CHECK:        ceqb
33 ; CHECK-NEXT:   bi
34
35 entry:
36        %A = icmp eq i8 %arg1, %arg2
37        ret i1 %A
38 }
39
40 define i8 @icmp_eq_immed01_i8(i8 %arg1, i8 %val1, i8 %val2) nounwind {
41 ; CHECK:      icmp_eq_immed01_i8:
42 ; CHECK:        ceqbi
43 ; CHECK:        selb $3, $5, $4, $3
44
45 entry:
46        %A = icmp eq i8 %arg1, 127
47        %B = select i1 %A, i8 %val1, i8 %val2
48        ret i8 %B
49 }
50
51 define i8 @icmp_eq_immed02_i8(i8 %arg1, i8 %val1, i8 %val2) nounwind {
52 ; CHECK:      icmp_eq_immed02_i8:
53 ; CHECK:        ceqbi
54 ; CHECK:        selb $3, $5, $4, $3
55
56 entry:
57        %A = icmp eq i8 %arg1, -128
58        %B = select i1 %A, i8 %val1, i8 %val2
59        ret i8 %B
60 }
61
62 define i8 @icmp_eq_immed03_i8(i8 %arg1, i8 %val1, i8 %val2) nounwind {
63 ; CHECK:      icmp_eq_immed03_i8:
64 ; CHECK:        ceqbi
65 ; CHECK:        selb $3, $5, $4, $3
66
67 entry:
68        %A = icmp eq i8 %arg1, -1
69        %B = select i1 %A, i8 %val1, i8 %val2
70        ret i8 %B
71 }
72
73 define i8 @icmp_ne_select_i8(i8 %arg1, i8 %arg2, i8 %val1, i8 %val2) nounwind {
74 ; CHECK:      icmp_ne_select_i8:
75 ; CHECK:        ceqb
76 ; CHECK:        selb $3, $5, $6, $3
77
78 entry:
79        %A = icmp ne i8 %arg1, %arg2
80        %B = select i1 %A, i8 %val1, i8 %val2
81        ret i8 %B
82 }
83
84 define i1 @icmp_ne_setcc_i8(i8 %arg1, i8 %arg2, i8 %val1, i8 %val2) nounwind {
85 ; CHECK:      icmp_ne_setcc_i8:
86 ; CHECK:        ceqb
87 ; CHECK:        xorbi
88 ; CHECK-NEXT:   bi
89
90 entry:
91        %A = icmp ne i8 %arg1, %arg2
92        ret i1 %A
93 }
94
95 define i8 @icmp_ne_immed01_i8(i8 %arg1, i8 %val1, i8 %val2) nounwind {
96 ; CHECK:      icmp_ne_immed01_i8:
97 ; CHECK:        ceqbi
98 ; CHECK:        selb $3, $4, $5, $3
99
100 entry:
101        %A = icmp ne i8 %arg1, 127
102        %B = select i1 %A, i8 %val1, i8 %val2
103        ret i8 %B
104 }
105
106 define i8 @icmp_ne_immed02_i8(i8 %arg1, i8 %val1, i8 %val2) nounwind {
107 ; CHECK:      icmp_ne_immed02_i8:
108 ; CHECK:        ceqbi
109 ; CHECK:        selb $3, $4, $5, $3
110
111 entry:
112        %A = icmp ne i8 %arg1, -128
113        %B = select i1 %A, i8 %val1, i8 %val2
114        ret i8 %B
115 }
116
117 define i8 @icmp_ne_immed03_i8(i8 %arg1, i8 %val1, i8 %val2) nounwind {
118 ; CHECK:      icmp_ne_immed03_i8:
119 ; CHECK:        ceqbi
120 ; CHECK:        selb $3, $4, $5, $3
121
122 entry:
123        %A = icmp ne i8 %arg1, -1
124        %B = select i1 %A, i8 %val1, i8 %val2
125        ret i8 %B
126 }
127
128 define i8 @icmp_ugt_select_i8(i8 %arg1, i8 %arg2, i8 %val1, i8 %val2) nounwind {
129 ; CHECK:      icmp_ugt_select_i8:
130 ; CHECK:        clgtb
131 ; CHECK:        selb $3, $6, $5, $3
132
133 entry:
134        %A = icmp ugt i8 %arg1, %arg2
135        %B = select i1 %A, i8 %val1, i8 %val2
136        ret i8 %B
137 }
138
139 define i1 @icmp_ugt_setcc_i8(i8 %arg1, i8 %arg2, i8 %val1, i8 %val2) nounwind {
140 ; CHECK:      icmp_ugt_setcc_i8:
141 ; CHECK:        clgtb
142 ; CHECK-NEXT:   bi
143
144 entry:
145        %A = icmp ugt i8 %arg1, %arg2
146        ret i1 %A
147 }
148
149 define i8 @icmp_ugt_immed01_i8(i8 %arg1, i8 %val1, i8 %val2) nounwind {
150 ; CHECK:      icmp_ugt_immed01_i8:
151 ; CHECK:        clgtbi
152 ; CHECK:        selb $3, $5, $4, $3
153
154 entry:
155        %A = icmp ugt i8 %arg1, 126
156        %B = select i1 %A, i8 %val1, i8 %val2
157        ret i8 %B
158 }
159
160 define i8 @icmp_uge_select_i8(i8 %arg1, i8 %arg2, i8 %val1, i8 %val2) nounwind {
161 ; CHECK:      icmp_uge_select_i8:
162 ; CHECK:        ceqb
163 ; CHECK:        clgtb
164 ; CHECK:        or
165 ; CHECK:        selb $3, $6, $5, $3
166
167 entry:
168        %A = icmp uge i8 %arg1, %arg2
169        %B = select i1 %A, i8 %val1, i8 %val2
170        ret i8 %B
171 }
172
173 define i1 @icmp_uge_setcc_i8(i8 %arg1, i8 %arg2, i8 %val1, i8 %val2) nounwind {
174 ; CHECK:      icmp_uge_setcc_i8:
175 ; CHECK:        ceqb
176 ; CHECK:        clgtb
177 ; CHECK:        or
178 ; CHECK-NEXT:   bi
179
180 entry:
181        %A = icmp uge i8 %arg1, %arg2
182        ret i1 %A
183 }
184
185 ;; Note: icmp uge i8 %arg1, <immed> can always be transformed into
186 ;;       icmp ugt i8 %arg1, <immed>-1
187 ;;
188 ;; Consequently, even though the patterns exist to match, it's unlikely
189 ;; they'll ever be generated.
190
191 define i8 @icmp_ult_select_i8(i8 %arg1, i8 %arg2, i8 %val1, i8 %val2) nounwind {
192 ; CHECK:      icmp_ult_select_i8:
193 ; CHECK:        ceqb
194 ; CHECK:        clgtb
195 ; CHECK:        nor
196 ; CHECK:        selb $3, $6, $5, $3
197
198 entry:
199        %A = icmp ult i8 %arg1, %arg2
200        %B = select i1 %A, i8 %val1, i8 %val2
201        ret i8 %B
202 }
203
204 define i1 @icmp_ult_setcc_i8(i8 %arg1, i8 %arg2, i8 %val1, i8 %val2) nounwind {
205 ; CHECK:      icmp_ult_setcc_i8:
206 ; CHECK:        ceqb
207 ; CHECK:        clgtb
208 ; CHECK:        nor
209 ; CHECK-NEXT:   bi
210
211 entry:
212        %A = icmp ult i8 %arg1, %arg2
213        ret i1 %A
214 }
215
216 define i8 @icmp_ult_immed01_i8(i8 %arg1, i8 %val1, i8 %val2) nounwind {
217 ; CHECK:      icmp_ult_immed01_i8:
218 ; CHECK:        ceqbi
219 ; CHECK:        clgtbi
220 ; CHECK:        nor
221 ; CHECK:        selb $3, $5, $4, $3
222
223 entry:
224        %A = icmp ult i8 %arg1, 253
225        %B = select i1 %A, i8 %val1, i8 %val2
226        ret i8 %B
227 }
228
229 define i8 @icmp_ult_immed02_i8(i8 %arg1, i8 %val1, i8 %val2) nounwind {
230 ; CHECK:      icmp_ult_immed02_i8:
231 ; CHECK:        ceqbi
232 ; CHECK:        clgtbi
233 ; CHECK:        nor
234 ; CHECK:        selb $3, $5, $4, $3
235
236 entry:
237        %A = icmp ult i8 %arg1, 129
238        %B = select i1 %A, i8 %val1, i8 %val2
239        ret i8 %B
240 }
241
242 define i8 @icmp_ule_select_i8(i8 %arg1, i8 %arg2, i8 %val1, i8 %val2) nounwind {
243 ; CHECK:      icmp_ule_select_i8:
244 ; CHECK:        clgtb
245 ; CHECK:        selb $3, $5, $6, $3
246
247 entry:
248        %A = icmp ule i8 %arg1, %arg2
249        %B = select i1 %A, i8 %val1, i8 %val2
250        ret i8 %B
251 }
252
253 define i1 @icmp_ule_setcc_i8(i8 %arg1, i8 %arg2, i8 %val1, i8 %val2) nounwind {
254 ; CHECK:      icmp_ule_setcc_i8:
255 ; CHECK:        clgtb
256 ; CHECK:        xorbi
257 ; CHECK-NEXT:   bi
258
259 entry:
260        %A = icmp ule i8 %arg1, %arg2
261        ret i1 %A
262 }
263
264 ;; Note: icmp ule i8 %arg1, <immed> can always be transformed into
265 ;;       icmp ult i8 %arg1, <immed>+1
266 ;;
267 ;; Consequently, even though the patterns exist to match, it's unlikely
268 ;; they'll ever be generated.
269
270 define i8 @icmp_sgt_select_i8(i8 %arg1, i8 %arg2, i8 %val1, i8 %val2) nounwind {
271 ; CHECK:      icmp_sgt_select_i8:
272 ; CHECK:        cgtb
273 ; CHECK:        selb $3, $6, $5, $3
274
275 entry:
276        %A = icmp sgt i8 %arg1, %arg2
277        %B = select i1 %A, i8 %val1, i8 %val2
278        ret i8 %B
279 }
280
281 define i1 @icmp_sgt_setcc_i8(i8 %arg1, i8 %arg2, i8 %val1, i8 %val2) nounwind {
282 ; CHECK:      icmp_sgt_setcc_i8:
283 ; CHECK:        cgtb
284 ; CHECK-NEXT:   bi
285
286 entry:
287        %A = icmp sgt i8 %arg1, %arg2
288        ret i1 %A
289 }
290
291 define i8 @icmp_sgt_immed01_i8(i8 %arg1, i8 %val1, i8 %val2) nounwind {
292 ; CHECK:      icmp_sgt_immed01_i8:
293 ; CHECK:        cgtbi
294 ; CHECK:        selb $3, $5, $4, $3
295
296 entry:
297        %A = icmp sgt i8 %arg1, 96
298        %B = select i1 %A, i8 %val1, i8 %val2
299        ret i8 %B
300 }
301
302 define i8 @icmp_sgt_immed02_i8(i8 %arg1, i8 %val1, i8 %val2) nounwind {
303 ; CHECK:      icmp_sgt_immed02_i8:
304 ; CHECK:        cgtbi
305 ; CHECK:        selb $3, $5, $4, $3
306
307 entry:
308        %A = icmp sgt i8 %arg1, -1
309        %B = select i1 %A, i8 %val1, i8 %val2
310        ret i8 %B
311 }
312
313 define i8 @icmp_sgt_immed03_i8(i8 %arg1, i8 %val1, i8 %val2) nounwind {
314 ; CHECK:      icmp_sgt_immed03_i8:
315 ; CHECK:        ceqbi
316 ; CHECK:        selb $3, $4, $5, $3
317
318 entry:
319        %A = icmp sgt i8 %arg1, -128
320        %B = select i1 %A, i8 %val1, i8 %val2
321        ret i8 %B
322 }
323
324 define i8 @icmp_sge_select_i8(i8 %arg1, i8 %arg2, i8 %val1, i8 %val2) nounwind {
325 ; CHECK:      icmp_sge_select_i8:
326 ; CHECK:        ceqb
327 ; CHECK:        cgtb
328 ; CHECK:        or
329 ; CHECK:        selb $3, $6, $5, $3
330
331 entry:
332        %A = icmp sge i8 %arg1, %arg2
333        %B = select i1 %A, i8 %val1, i8 %val2
334        ret i8 %B
335 }
336
337 define i1 @icmp_sge_setcc_i8(i8 %arg1, i8 %arg2, i8 %val1, i8 %val2) nounwind {
338 ; CHECK:      icmp_sge_setcc_i8:
339 ; CHECK:        ceqb
340 ; CHECK:        cgtb
341 ; CHECK:        or
342 ; CHECK-NEXT:   bi
343
344 entry:
345        %A = icmp sge i8 %arg1, %arg2
346        ret i1 %A
347 }
348
349 ;; Note: icmp sge i8 %arg1, <immed> can always be transformed into
350 ;;       icmp sgt i8 %arg1, <immed>-1
351 ;;
352 ;; Consequently, even though the patterns exist to match, it's unlikely
353 ;; they'll ever be generated.
354
355 define i8 @icmp_slt_select_i8(i8 %arg1, i8 %arg2, i8 %val1, i8 %val2) nounwind {
356 ; CHECK:      icmp_slt_select_i8:
357 ; CHECK:        ceqb
358 ; CHECK:        cgtb
359 ; CHECK:        nor
360 ; CHECK:        selb $3, $6, $5, $3
361
362 entry:
363        %A = icmp slt i8 %arg1, %arg2
364        %B = select i1 %A, i8 %val1, i8 %val2
365        ret i8 %B
366 }
367
368 define i1 @icmp_slt_setcc_i8(i8 %arg1, i8 %arg2, i8 %val1, i8 %val2) nounwind {
369 ; CHECK:      icmp_slt_setcc_i8:
370 ; CHECK:        ceqb
371 ; CHECK:        cgtb
372 ; CHECK:        nor
373 ; CHECK-NEXT:   bi
374
375 entry:
376        %A = icmp slt i8 %arg1, %arg2
377        ret i1 %A
378 }
379
380 define i8 @icmp_slt_immed01_i8(i8 %arg1, i8 %val1, i8 %val2) nounwind {
381 ; CHECK:      icmp_slt_immed01_i8:
382 ; CHECK:        ceqbi
383 ; CHECK:        cgtbi
384 ; CHECK:        nor
385 ; CHECK:        selb $3, $5, $4, $3
386
387 entry:
388        %A = icmp slt i8 %arg1, 96
389        %B = select i1 %A, i8 %val1, i8 %val2
390        ret i8 %B
391 }
392
393 define i8 @icmp_slt_immed02_i8(i8 %arg1, i8 %val1, i8 %val2) nounwind {
394 ; CHECK:      icmp_slt_immed02_i8:
395 ; CHECK:        ceqbi
396 ; CHECK:        cgtbi
397 ; CHECK:        nor
398 ; CHECK:        selb $3, $5, $4, $3
399
400 entry:
401        %A = icmp slt i8 %arg1, -120
402        %B = select i1 %A, i8 %val1, i8 %val2
403        ret i8 %B
404 }
405
406 define i8 @icmp_slt_immed03_i8(i8 %arg1, i8 %val1, i8 %val2) nounwind {
407 ; CHECK:      icmp_slt_immed03_i8:
408 ; CHECK:        ceqbi
409 ; CHECK:        cgtbi
410 ; CHECK:        nor
411 ; CHECK:        selb $3, $5, $4, $3
412
413 entry:
414        %A = icmp slt i8 %arg1, -1
415        %B = select i1 %A, i8 %val1, i8 %val2
416        ret i8 %B
417 }
418
419 define i8 @icmp_sle_select_i8(i8 %arg1, i8 %arg2, i8 %val1, i8 %val2) nounwind {
420 ; CHECK:      icmp_sle_select_i8:
421 ; CHECK:        cgtb
422 ; CHECK:        selb $3, $5, $6, $3
423
424 entry:
425        %A = icmp sle i8 %arg1, %arg2
426        %B = select i1 %A, i8 %val1, i8 %val2
427        ret i8 %B
428 }
429
430 define i1 @icmp_sle_setcc_i8(i8 %arg1, i8 %arg2, i8 %val1, i8 %val2) nounwind {
431 ; CHECK:      icmp_sle_setcc_i8:
432 ; CHECK:        cgtb
433 ; CHECK:        xorbi
434 ; CHECK-NEXT:   bi
435
436 entry:
437        %A = icmp sle i8 %arg1, %arg2
438        ret i1 %A
439 }
440
441 ;; Note: icmp sle i8 %arg1, <immed> can always be transformed into
442 ;;       icmp slt i8 %arg1, <immed>+1
443 ;;
444 ;; Consequently, even though the patterns exist to match, it's unlikely
445 ;; they'll ever be generated.
446