Integer comparison tests for CellSPU.
[oota-llvm.git] / test / CodeGen / CellSPU / icmp32.ll
1 ; RUN: llvm-as -o - %s | llc -march=cellspu > %t1.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 entry:
21        %A = icmp eq i32 %arg1, %arg2
22        %B = select i1 %A, i32 %val1, i32 %val2
23        ret i32 %B
24 }
25
26 define i1 @icmp_eq_setcc_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
27 entry:
28        %A = icmp eq i32 %arg1, %arg2
29        ret i1 %A
30 }
31
32 define i32 @icmp_eq_immed01_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
33 entry:
34        %A = icmp eq i32 %arg1, 511
35        %B = select i1 %A, i32 %val1, i32 %val2
36        ret i32 %B
37 }
38
39 define i32 @icmp_eq_immed02_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
40 entry:
41        %A = icmp eq i32 %arg1, -512
42        %B = select i1 %A, i32 %val1, i32 %val2
43        ret i32 %B
44 }
45
46 define i32 @icmp_eq_immed03_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
47 entry:
48        %A = icmp eq i32 %arg1, -1
49        %B = select i1 %A, i32 %val1, i32 %val2
50        ret i32 %B
51 }
52
53 define i32 @icmp_eq_immed04_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
54 entry:
55        %A = icmp eq i32 %arg1, 32768
56        %B = select i1 %A, i32 %val1, i32 %val2
57        ret i32 %B
58 }
59
60 define i32 @icmp_ne_select_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
61 entry:
62        %A = icmp ne i32 %arg1, %arg2
63        %B = select i1 %A, i32 %val1, i32 %val2
64        ret i32 %B
65 }
66
67 define i1 @icmp_ne_setcc_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
68 entry:
69        %A = icmp ne i32 %arg1, %arg2
70        ret i1 %A
71 }
72
73 define i32 @icmp_ne_immed01_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
74 entry:
75        %A = icmp ne i32 %arg1, 511
76        %B = select i1 %A, i32 %val1, i32 %val2
77        ret i32 %B
78 }
79
80 define i32 @icmp_ne_immed02_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
81 entry:
82        %A = icmp ne i32 %arg1, -512
83        %B = select i1 %A, i32 %val1, i32 %val2
84        ret i32 %B
85 }
86
87 define i32 @icmp_ne_immed03_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
88 entry:
89        %A = icmp ne i32 %arg1, -1
90        %B = select i1 %A, i32 %val1, i32 %val2
91        ret i32 %B
92 }
93
94 define i32 @icmp_ne_immed04_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
95 entry:
96        %A = icmp ne i32 %arg1, 32768
97        %B = select i1 %A, i32 %val1, i32 %val2
98        ret i32 %B
99 }
100
101 define i32 @icmp_ugt_select_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
102 entry:
103        %A = icmp ugt i32 %arg1, %arg2
104        %B = select i1 %A, i32 %val1, i32 %val2
105        ret i32 %B
106 }
107
108 define i1 @icmp_ugt_setcc_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
109 entry:
110        %A = icmp ugt i32 %arg1, %arg2
111        ret i1 %A
112 }
113
114 define i32 @icmp_ugt_immed01_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
115 entry:
116        %A = icmp ugt i32 %arg1, 511
117        %B = select i1 %A, i32 %val1, i32 %val2
118        ret i32 %B
119 }
120
121 define i32 @icmp_ugt_immed02_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
122 entry:
123        %A = icmp ugt i32 %arg1, 4294966784
124        %B = select i1 %A, i32 %val1, i32 %val2
125        ret i32 %B
126 }
127
128 define i32 @icmp_ugt_immed03_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
129 entry:
130        %A = icmp ugt i32 %arg1, 4294967293
131        %B = select i1 %A, i32 %val1, i32 %val2
132        ret i32 %B
133 }
134
135 define i32 @icmp_ugt_immed04_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
136 entry:
137        %A = icmp ugt i32 %arg1, 32768
138        %B = select i1 %A, i32 %val1, i32 %val2
139        ret i32 %B
140 }
141
142 define i32 @icmp_uge_select_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
143 entry:
144        %A = icmp uge i32 %arg1, %arg2
145        %B = select i1 %A, i32 %val1, i32 %val2
146        ret i32 %B
147 }
148
149 define i1 @icmp_uge_setcc_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
150 entry:
151        %A = icmp uge i32 %arg1, %arg2
152        ret i1 %A
153 }
154
155 ;; Note: icmp uge i32 %arg1, <immed> can always be transformed into
156 ;;       icmp ugt i32 %arg1, <immed>-1
157 ;;
158 ;; Consequently, even though the patterns exist to match, it's unlikely
159 ;; they'll ever be generated.
160
161 define i32 @icmp_ult_select_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
162 entry:
163        %A = icmp ult i32 %arg1, %arg2
164        %B = select i1 %A, i32 %val1, i32 %val2
165        ret i32 %B
166 }
167
168 define i1 @icmp_ult_setcc_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
169 entry:
170        %A = icmp ult i32 %arg1, %arg2
171        ret i1 %A
172 }
173
174 define i32 @icmp_ult_immed01_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
175 entry:
176        %A = icmp ult i32 %arg1, 511
177        %B = select i1 %A, i32 %val1, i32 %val2
178        ret i32 %B
179 }
180
181 define i32 @icmp_ult_immed02_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
182 entry:
183        %A = icmp ult i32 %arg1, 4294966784
184        %B = select i1 %A, i32 %val1, i32 %val2
185        ret i32 %B
186 }
187
188 define i32 @icmp_ult_immed03_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
189 entry:
190        %A = icmp ult i32 %arg1, 4294967293
191        %B = select i1 %A, i32 %val1, i32 %val2
192        ret i32 %B
193 }
194
195 define i32 @icmp_ult_immed04_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
196 entry:
197        %A = icmp ult i32 %arg1, 32768
198        %B = select i1 %A, i32 %val1, i32 %val2
199        ret i32 %B
200 }
201
202 define i32 @icmp_ule_select_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
203 entry:
204        %A = icmp ule i32 %arg1, %arg2
205        %B = select i1 %A, i32 %val1, i32 %val2
206        ret i32 %B
207 }
208
209 define i1 @icmp_ule_setcc_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
210 entry:
211        %A = icmp ule i32 %arg1, %arg2
212        ret i1 %A
213 }
214
215 ;; Note: icmp ule i32 %arg1, <immed> can always be transformed into
216 ;;       icmp ult i32 %arg1, <immed>+1
217 ;;
218 ;; Consequently, even though the patterns exist to match, it's unlikely
219 ;; they'll ever be generated.
220
221 define i32 @icmp_sgt_select_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
222 entry:
223        %A = icmp sgt i32 %arg1, %arg2
224        %B = select i1 %A, i32 %val1, i32 %val2
225        ret i32 %B
226 }
227
228 define i1 @icmp_sgt_setcc_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
229 entry:
230        %A = icmp sgt i32 %arg1, %arg2
231        ret i1 %A
232 }
233
234 define i32 @icmp_sgt_immed01_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
235 entry:
236        %A = icmp sgt i32 %arg1, 511
237        %B = select i1 %A, i32 %val1, i32 %val2
238        ret i32 %B
239 }
240
241 define i32 @icmp_sgt_immed02_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
242 entry:
243        %A = icmp sgt i32 %arg1, 4294966784
244        %B = select i1 %A, i32 %val1, i32 %val2
245        ret i32 %B
246 }
247
248 define i32 @icmp_sgt_immed03_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
249 entry:
250        %A = icmp sgt i32 %arg1, 4294967293
251        %B = select i1 %A, i32 %val1, i32 %val2
252        ret i32 %B
253 }
254
255 define i32 @icmp_sgt_immed04_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
256 entry:
257        %A = icmp sgt i32 %arg1, 32768
258        %B = select i1 %A, i32 %val1, i32 %val2
259        ret i32 %B
260 }
261
262 define i32 @icmp_sge_select_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
263 entry:
264        %A = icmp sge i32 %arg1, %arg2
265        %B = select i1 %A, i32 %val1, i32 %val2
266        ret i32 %B
267 }
268
269 define i1 @icmp_sge_setcc_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
270 entry:
271        %A = icmp sge i32 %arg1, %arg2
272        ret i1 %A
273 }
274
275 ;; Note: icmp sge i32 %arg1, <immed> can always be transformed into
276 ;;       icmp sgt i32 %arg1, <immed>-1
277 ;;
278 ;; Consequently, even though the patterns exist to match, it's unlikely
279 ;; they'll ever be generated.
280
281 define i32 @icmp_slt_select_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
282 entry:
283        %A = icmp slt i32 %arg1, %arg2
284        %B = select i1 %A, i32 %val1, i32 %val2
285        ret i32 %B
286 }
287
288 define i1 @icmp_slt_setcc_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
289 entry:
290        %A = icmp slt i32 %arg1, %arg2
291        ret i1 %A
292 }
293
294 define i32 @icmp_slt_immed01_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
295 entry:
296        %A = icmp slt i32 %arg1, 511
297        %B = select i1 %A, i32 %val1, i32 %val2
298        ret i32 %B
299 }
300
301 define i32 @icmp_slt_immed02_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
302 entry:
303        %A = icmp slt i32 %arg1, -512
304        %B = select i1 %A, i32 %val1, i32 %val2
305        ret i32 %B
306 }
307
308 define i32 @icmp_slt_immed03_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
309 entry:
310        %A = icmp slt i32 %arg1, -1
311        %B = select i1 %A, i32 %val1, i32 %val2
312        ret i32 %B
313 }
314
315 define i32 @icmp_slt_immed04_i32(i32 %arg1, i32 %val1, i32 %val2) nounwind {
316 entry:
317        %A = icmp slt i32 %arg1, 32768
318        %B = select i1 %A, i32 %val1, i32 %val2
319        ret i32 %B
320 }
321
322 define i32 @icmp_sle_select_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
323 entry:
324        %A = icmp sle i32 %arg1, %arg2
325        %B = select i1 %A, i32 %val1, i32 %val2
326        ret i32 %B
327 }
328
329 define i1 @icmp_sle_setcc_i32(i32 %arg1, i32 %arg2, i32 %val1, i32 %val2) nounwind {
330 entry:
331        %A = icmp sle i32 %arg1, %arg2
332        ret i1 %A
333 }
334
335 ;; Note: icmp sle i32 %arg1, <immed> can always be transformed into
336 ;;       icmp slt i32 %arg1, <immed>+1
337 ;;
338 ;; Consequently, even though the patterns exist to match, it's unlikely
339 ;; they'll ever be generated.
340