1 ; RUN: llc -march=mipsel -mattr=mips16 -relocation-model=pic -O3 < %s | FileCheck %s -check-prefix=16
3 @t = global i32 10, align 4
4 @f = global i32 199, align 4
5 @a = global i32 1, align 4
6 @b = global i32 10, align 4
7 @c = global i32 1, align 4
8 @z1 = common global i32 0, align 4
9 @z2 = common global i32 0, align 4
10 @z3 = common global i32 0, align 4
11 @z4 = common global i32 0, align 4
13 define void @calc_seleq() nounwind {
15 %0 = load i32, i32* @a, align 4
16 %1 = load i32, i32* @b, align 4
17 %cmp = icmp eq i32 %0, %1
18 %2 = load i32, i32* @f, align 4
19 %3 = load i32, i32* @t, align 4
20 %cond = select i1 %cmp, i32 %2, i32 %3
21 store i32 %cond, i32* @z1, align 4
22 ; 16: cmp ${{[0-9]+}}, ${{[0-9]+}}
23 ; 16: bteqz $BB{{[0-9]+}}_{{[0-9]}}
24 ; 16: move ${{[0-9]+}}, ${{[0-9]+}}
25 store i32 %cond, i32* @z2, align 4
26 %4 = load i32, i32* @c, align 4
27 %cmp6 = icmp eq i32 %4, %0
28 %cond10 = select i1 %cmp6, i32 %3, i32 %2
29 store i32 %cond10, i32* @z3, align 4
30 store i32 %cond10, i32* @z4, align 4
35 define void @calc_seleqk() nounwind {
37 %0 = load i32, i32* @a, align 4
38 %cmp = icmp eq i32 %0, 1
39 %1 = load i32, i32* @t, align 4
40 %2 = load i32, i32* @f, align 4
41 %cond = select i1 %cmp, i32 %1, i32 %2
42 store i32 %cond, i32* @z1, align 4
43 ; 16: cmpi ${{[0-9]+}}, 1
44 ; 16: bteqz $BB{{[0-9]+}}_{{[0-9]}}
45 ; 16: move ${{[0-9]+}}, ${{[0-9]+}}
46 %cmp1 = icmp eq i32 %0, 10
47 %cond5 = select i1 %cmp1, i32 %2, i32 %1
48 store i32 %cond5, i32* @z2, align 4
49 %3 = load i32, i32* @b, align 4
50 %cmp6 = icmp eq i32 %3, 3
51 %cond10 = select i1 %cmp6, i32 %2, i32 %1
52 store i32 %cond10, i32* @z3, align 4
53 ; 16: cmpi ${{[0-9]+}}, 10
54 ; 16: bteqz $BB{{[0-9]+}}_{{[0-9]}}
55 ; 16: move ${{[0-9]+}}, ${{[0-9]+}}
56 %cmp11 = icmp eq i32 %3, 10
57 %cond15 = select i1 %cmp11, i32 %1, i32 %2
58 store i32 %cond15, i32* @z4, align 4
62 define void @calc_seleqz() nounwind {
64 %0 = load i32, i32* @a, align 4
65 %cmp = icmp eq i32 %0, 0
66 %1 = load i32, i32* @t, align 4
67 %2 = load i32, i32* @f, align 4
68 %cond = select i1 %cmp, i32 %1, i32 %2
69 store i32 %cond, i32* @z1, align 4
70 ; 16: beqz ${{[0-9]+}}, $BB{{[0-9]+}}_{{[0-9]}}
71 ; 16: move ${{[0-9]+}}, ${{[0-9]+}}
72 %3 = load i32, i32* @b, align 4
73 %cmp1 = icmp eq i32 %3, 0
74 %cond5 = select i1 %cmp1, i32 %2, i32 %1
75 store i32 %cond5, i32* @z2, align 4
76 %4 = load i32, i32* @c, align 4
77 %cmp6 = icmp eq i32 %4, 0
78 %cond10 = select i1 %cmp6, i32 %1, i32 %2
79 store i32 %cond10, i32* @z3, align 4
80 store i32 %cond, i32* @z4, align 4
84 define void @calc_selge() nounwind {
86 %0 = load i32, i32* @a, align 4
87 %1 = load i32, i32* @b, align 4
88 %cmp = icmp sge i32 %0, %1
89 %2 = load i32, i32* @f, align 4
90 %3 = load i32, i32* @t, align 4
91 %cond = select i1 %cmp, i32 %2, i32 %3
92 store i32 %cond, i32* @z1, align 4
93 ; 16: slt ${{[0-9]+}}, ${{[0-9]+}}
94 ; 16: bteqz $BB{{[0-9]+}}_{{[0-9]}}
95 ; 16: move ${{[0-9]+}}, ${{[0-9]+}}
96 %cmp1 = icmp sge i32 %1, %0
97 %cond5 = select i1 %cmp1, i32 %3, i32 %2
98 store i32 %cond5, i32* @z2, align 4
99 %4 = load i32, i32* @c, align 4
100 %cmp6 = icmp sge i32 %4, %0
101 %cond10 = select i1 %cmp6, i32 %3, i32 %2
102 store i32 %cond10, i32* @z3, align 4
103 %cmp11 = icmp sge i32 %0, %4
104 %cond15 = select i1 %cmp11, i32 %3, i32 %2
105 store i32 %cond15, i32* @z4, align 4
109 define i32 @calc_selgt() nounwind {
111 %0 = load i32, i32* @a, align 4
112 %1 = load i32, i32* @b, align 4
113 %cmp = icmp sgt i32 %0, %1
114 ; 16: slt ${{[0-9]+}}, ${{[0-9]+}}
115 ; 16: btnez $BB{{[0-9]+}}_{{[0-9]}}
116 ; 16: move ${{[0-9]+}}, ${{[0-9]+}}
117 %2 = load i32, i32* @f, align 4
118 %3 = load i32, i32* @t, align 4
119 %cond = select i1 %cmp, i32 %2, i32 %3
120 store i32 %cond, i32* @z1, align 4
121 %cmp1 = icmp sgt i32 %1, %0
122 %cond5 = select i1 %cmp1, i32 %3, i32 %2
123 store i32 %cond5, i32* @z2, align 4
124 %4 = load i32, i32* @c, align 4
125 %cmp6 = icmp sgt i32 %4, %0
126 %cond10 = select i1 %cmp6, i32 %2, i32 %3
127 store i32 %cond10, i32* @z3, align 4
128 %cmp11 = icmp sgt i32 %0, %4
129 %cond15 = select i1 %cmp11, i32 %2, i32 %3
130 store i32 %cond15, i32* @z4, align 4
134 define void @calc_selle() nounwind {
136 %0 = load i32, i32* @a, align 4
137 %1 = load i32, i32* @b, align 4
138 %cmp = icmp sle i32 %0, %1
139 %2 = load i32, i32* @t, align 4
140 %3 = load i32, i32* @f, align 4
141 %cond = select i1 %cmp, i32 %2, i32 %3
142 store i32 %cond, i32* @z1, align 4
143 ; 16: slt ${{[0-9]+}}, ${{[0-9]+}}
144 ; 16: bteqz $BB{{[0-9]+}}_{{[0-9]}}
145 ; 16: move ${{[0-9]+}}, ${{[0-9]+}}
146 %cmp1 = icmp sle i32 %1, %0
147 %cond5 = select i1 %cmp1, i32 %3, i32 %2
148 store i32 %cond5, i32* @z2, align 4
149 %4 = load i32, i32* @c, align 4
150 %cmp6 = icmp sle i32 %4, %0
151 %cond10 = select i1 %cmp6, i32 %2, i32 %3
152 store i32 %cond10, i32* @z3, align 4
153 %cmp11 = icmp sle i32 %0, %4
154 %cond15 = select i1 %cmp11, i32 %2, i32 %3
155 store i32 %cond15, i32* @z4, align 4
159 define void @calc_selltk() nounwind {
161 %0 = load i32, i32* @a, align 4
162 %cmp = icmp slt i32 %0, 10
163 %1 = load i32, i32* @t, align 4
164 %2 = load i32, i32* @f, align 4
165 %cond = select i1 %cmp, i32 %1, i32 %2
166 store i32 %cond, i32* @z1, align 4
167 ; 16: slti ${{[0-9]+}}, {{[0-9]+}}
168 ; 16: btnez $BB{{[0-9]+}}_{{[0-9]}}
169 ; 16: move ${{[0-9]+}}, ${{[0-9]+}}
170 %3 = load i32, i32* @b, align 4
171 %cmp1 = icmp slt i32 %3, 2
172 %cond5 = select i1 %cmp1, i32 %2, i32 %1
173 store i32 %cond5, i32* @z2, align 4
174 %4 = load i32, i32* @c, align 4
175 %cmp6 = icmp sgt i32 %4, 2
176 %cond10 = select i1 %cmp6, i32 %2, i32 %1
177 store i32 %cond10, i32* @z3, align 4
178 %cmp11 = icmp sgt i32 %0, 2
179 %cond15 = select i1 %cmp11, i32 %2, i32 %1
180 store i32 %cond15, i32* @z4, align 4
185 define void @calc_selne() nounwind {
187 %0 = load i32, i32* @a, align 4
188 %1 = load i32, i32* @b, align 4
189 %cmp = icmp ne i32 %0, %1
190 %2 = load i32, i32* @t, align 4
191 %3 = load i32, i32* @f, align 4
192 %cond = select i1 %cmp, i32 %2, i32 %3
193 store i32 %cond, i32* @z1, align 4
194 ; 16: cmp ${{[0-9]+}}, ${{[0-9]+}}
195 ; 16: btnez $BB{{[0-9]+}}_{{[0-9]}}
196 ; 16: move ${{[0-9]+}}, ${{[0-9]+}}
197 store i32 %cond, i32* @z2, align 4
198 %4 = load i32, i32* @c, align 4
199 %cmp6 = icmp ne i32 %4, %0
200 %cond10 = select i1 %cmp6, i32 %3, i32 %2
201 store i32 %cond10, i32* @z3, align 4
202 store i32 %cond10, i32* @z4, align 4
206 define void @calc_selnek() nounwind {
208 %0 = load i32, i32* @a, align 4
209 %cmp = icmp ne i32 %0, 1
210 %1 = load i32, i32* @f, align 4
211 %2 = load i32, i32* @t, align 4
212 %cond = select i1 %cmp, i32 %1, i32 %2
213 store i32 %cond, i32* @z1, align 4
214 ; 16: cmpi ${{[0-9]+}}, 1
215 ; 16: btnez $BB{{[0-9]+}}_{{[0-9]}}
216 ; 16: move ${{[0-9]+}}, ${{[0-9]+}}
217 %cmp1 = icmp ne i32 %0, 10
218 %cond5 = select i1 %cmp1, i32 %2, i32 %1
219 store i32 %cond5, i32* @z2, align 4
220 %3 = load i32, i32* @b, align 4
221 %cmp6 = icmp ne i32 %3, 3
222 %cond10 = select i1 %cmp6, i32 %2, i32 %1
223 store i32 %cond10, i32* @z3, align 4
224 ; 16: cmpi ${{[0-9]+}}, 10
225 ; 16: btnez $BB{{[0-9]+}}_{{[0-9]}}
226 ; 16: move ${{[0-9]+}}, ${{[0-9]+}}
227 %cmp11 = icmp ne i32 %3, 10
228 %cond15 = select i1 %cmp11, i32 %1, i32 %2
229 store i32 %cond15, i32* @z4, align 4
233 define void @calc_selnez() nounwind {
235 %0 = load i32, i32* @a, align 4
236 %cmp = icmp ne i32 %0, 0
237 %1 = load i32, i32* @f, align 4
238 %2 = load i32, i32* @t, align 4
239 %cond = select i1 %cmp, i32 %1, i32 %2
240 store i32 %cond, i32* @z1, align 4
241 ; 16: bnez ${{[0-9]+}}, $BB{{[0-9]+}}_{{[0-9]}}
242 ; 16: move ${{[0-9]+}}, ${{[0-9]+}}
243 %3 = load i32, i32* @b, align 4
244 %cmp1 = icmp ne i32 %3, 0
245 %cond5 = select i1 %cmp1, i32 %2, i32 %1
246 store i32 %cond5, i32* @z2, align 4
247 %4 = load i32, i32* @c, align 4
248 %cmp6 = icmp ne i32 %4, 0
249 %cond10 = select i1 %cmp6, i32 %1, i32 %2
250 store i32 %cond10, i32* @z3, align 4
251 store i32 %cond, i32* @z4, align 4
255 define void @calc_selnez2() nounwind {
257 %0 = load i32, i32* @a, align 4
258 %tobool = icmp ne i32 %0, 0
259 %1 = load i32, i32* @f, align 4
260 %2 = load i32, i32* @t, align 4
261 %cond = select i1 %tobool, i32 %1, i32 %2
262 store i32 %cond, i32* @z1, align 4
263 ; 16: bnez ${{[0-9]+}}, $BB{{[0-9]+}}_{{[0-9]}}
264 ; 16: move ${{[0-9]+}}, ${{[0-9]+}}
265 %3 = load i32, i32* @b, align 4
266 %tobool1 = icmp ne i32 %3, 0
267 %cond5 = select i1 %tobool1, i32 %2, i32 %1
268 store i32 %cond5, i32* @z2, align 4
269 %4 = load i32, i32* @c, align 4
270 %tobool6 = icmp ne i32 %4, 0
271 %cond10 = select i1 %tobool6, i32 %1, i32 %2
272 store i32 %cond10, i32* @z3, align 4
273 store i32 %cond, i32* @z4, align 4
277 define void @calc_seluge() nounwind {
279 %0 = load i32, i32* @a, align 4
280 %1 = load i32, i32* @b, align 4
281 %cmp = icmp uge i32 %0, %1
282 %2 = load i32, i32* @f, align 4
283 %3 = load i32, i32* @t, align 4
284 %cond = select i1 %cmp, i32 %2, i32 %3
285 store i32 %cond, i32* @z1, align 4
286 ; 16: sltu ${{[0-9]+}}, ${{[0-9]+}}
287 ; 16: bteqz $BB{{[0-9]+}}_{{[0-9]}}
288 ; 16: move ${{[0-9]+}}, ${{[0-9]+}}
289 %cmp1 = icmp uge i32 %1, %0
290 %cond5 = select i1 %cmp1, i32 %3, i32 %2
291 store i32 %cond5, i32* @z2, align 4
292 %4 = load i32, i32* @c, align 4
293 %cmp6 = icmp uge i32 %4, %0
294 %cond10 = select i1 %cmp6, i32 %3, i32 %2
295 store i32 %cond10, i32* @z3, align 4
296 %cmp11 = icmp uge i32 %0, %4
297 %cond15 = select i1 %cmp11, i32 %3, i32 %2
298 store i32 %cond15, i32* @z4, align 4
302 define void @calc_selugt() nounwind {
304 %0 = load i32, i32* @a, align 4
305 %1 = load i32, i32* @b, align 4
306 %cmp = icmp ugt i32 %0, %1
307 %2 = load i32, i32* @f, align 4
308 %3 = load i32, i32* @t, align 4
309 %cond = select i1 %cmp, i32 %2, i32 %3
310 store i32 %cond, i32* @z1, align 4
311 ; 16: sltu ${{[0-9]+}}, ${{[0-9]+}}
312 ; 16: btnez $BB{{[0-9]+}}_{{[0-9]}}
313 ; 16: move ${{[0-9]+}}, ${{[0-9]+}}
314 %cmp1 = icmp ugt i32 %1, %0
315 %cond5 = select i1 %cmp1, i32 %3, i32 %2
316 store i32 %cond5, i32* @z2, align 4
317 %4 = load i32, i32* @c, align 4
318 %cmp6 = icmp ugt i32 %4, %0
319 %cond10 = select i1 %cmp6, i32 %2, i32 %3
320 store i32 %cond10, i32* @z3, align 4
321 %cmp11 = icmp ugt i32 %0, %4
322 %cond15 = select i1 %cmp11, i32 %2, i32 %3
323 store i32 %cond15, i32* @z4, align 4
327 define void @calc_selule() nounwind {
329 %0 = load i32, i32* @a, align 4
330 %1 = load i32, i32* @b, align 4
331 %cmp = icmp ule i32 %0, %1
332 %2 = load i32, i32* @t, align 4
333 %3 = load i32, i32* @f, align 4
334 %cond = select i1 %cmp, i32 %2, i32 %3
335 store i32 %cond, i32* @z1, align 4
336 ; 16: sltu ${{[0-9]+}}, ${{[0-9]+}}
337 ; 16: bteqz $BB{{[0-9]+}}_{{[0-9]}}
338 ; 16: move ${{[0-9]+}}, ${{[0-9]+}}
339 %cmp1 = icmp ule i32 %1, %0
340 %cond5 = select i1 %cmp1, i32 %3, i32 %2
341 store i32 %cond5, i32* @z2, align 4
342 %4 = load i32, i32* @c, align 4
343 %cmp6 = icmp ule i32 %4, %0
344 %cond10 = select i1 %cmp6, i32 %2, i32 %3
345 store i32 %cond10, i32* @z3, align 4
346 %cmp11 = icmp ule i32 %0, %4
347 %cond15 = select i1 %cmp11, i32 %2, i32 %3
348 store i32 %cond15, i32* @z4, align 4