[FastISel][AArch64] Also allow folding of sign-/zero-extend and logical
[oota-llvm.git] / test / CodeGen / AArch64 / fast-isel-shift.ll
1 ; RUN: llc -fast-isel -fast-isel-abort -mtriple=aarch64-apple-darwin -verify-machineinstrs < %s | FileCheck %s
2
3 ; CHECK-LABEL: lsr_zext_i1_i16
4 ; CHECK:       uxth {{w[0-9]*}}, wzr
5 define zeroext i16 @lsr_zext_i1_i16(i1 %b) {
6   %1 = zext i1 %b to i16
7   %2 = lshr i16 %1, 1
8   ret i16 %2
9 }
10
11 ; CHECK-LABEL: lsr_sext_i1_i16
12 ; CHECK:       sbfx [[REG1:w[0-9]+]], {{w[0-9]*}}, #0, #1
13 ; CHECK-NEXT:  ubfx [[REG2:w[0-9]+]], [[REG1]], #1, #15
14 ; CHECK-NEXT:  sxth {{w[0-9]*}}, [[REG2]]
15 define signext i16 @lsr_sext_i1_i16(i1 %b) {
16   %1 = sext i1 %b to i16
17   %2 = lshr i16 %1, 1
18   ret i16 %2
19 }
20
21 ; CHECK-LABEL: lsr_zext_i1_i32
22 ; CHECK:       mov {{w[0-9]*}}, wzr
23 define i32 @lsr_zext_i1_i32(i1 %b) {
24   %1 = zext i1 %b to i32
25   %2 = lshr i32 %1, 1
26   ret i32 %2
27 }
28
29 ; CHECK-LABEL: lsr_sext_i1_i32
30 ; CHECK:       sbfx [[REG1:w[0-9]+]], {{w[0-9]*}}, #0, #1
31 ; CHECK-NEXT:  lsr {{w[0-9]*}}, [[REG1:w[0-9]+]], #1
32 define i32 @lsr_sext_i1_i32(i1 %b) {
33   %1 = sext i1 %b to i32
34   %2 = lshr i32 %1, 1
35   ret i32 %2
36 }
37
38 ; CHECK-LABEL: lsr_zext_i1_i64
39 ; CHECK:       mov {{x[0-9]*}}, xzr
40 define i64 @lsr_zext_i1_i64(i1 %b) {
41   %1 = zext i1 %b to i64
42   %2 = lshr i64 %1, 1
43   ret i64 %2
44 }
45
46 ; CHECK-LABEL: lsl_zext_i1_i16
47 ; CHECK:       ubfiz {{w[0-9]*}}, {{w[0-9]*}}, #4, #1
48 define zeroext i16 @lsl_zext_i1_i16(i1 %b) {
49   %1 = zext i1 %b to i16
50   %2 = shl i16 %1, 4
51   ret i16 %2
52 }
53
54 ; CHECK-LABEL: lsl_sext_i1_i16
55 ; CHECK:       sbfiz {{w[0-9]*}}, {{w[0-9]*}}, #4, #1
56 define signext i16 @lsl_sext_i1_i16(i1 %b) {
57   %1 = sext i1 %b to i16
58   %2 = shl i16 %1, 4
59   ret i16 %2
60 }
61
62 ; CHECK-LABEL: lsl_zext_i1_i32
63 ; CHECK:       ubfiz {{w[0-9]*}}, {{w[0-9]*}}, #4, #1
64 define i32 @lsl_zext_i1_i32(i1 %b) {
65   %1 = zext i1 %b to i32
66   %2 = shl i32 %1, 4
67   ret i32 %2
68 }
69
70 ; CHECK-LABEL: lsl_sext_i1_i32
71 ; CHECK:       sbfiz {{w[0-9]*}}, {{w[0-9]*}}, #4, #1
72 define i32 @lsl_sext_i1_i32(i1 %b) {
73   %1 = sext i1 %b to i32
74   %2 = shl i32 %1, 4
75   ret i32 %2
76 }
77
78 ; CHECK-LABEL: lsl_zext_i1_i64
79 ; CHECK:       ubfiz {{x[0-9]*}}, {{x[0-9]*}}, #4, #1
80 define i64 @lsl_zext_i1_i64(i1 %b) {
81   %1 = zext i1 %b to i64
82   %2 = shl i64 %1, 4
83   ret i64 %2
84 }
85
86 ; CHECK-LABEL: lsl_sext_i1_i64
87 ; CHECK:       sbfiz {{x[0-9]*}}, {{x[0-9]*}}, #4, #1
88 define i64 @lsl_sext_i1_i64(i1 %b) {
89   %1 = sext i1 %b to i64
90   %2 = shl i64 %1, 4
91   ret i64 %2
92 }
93
94 ; CHECK-LABEL: lslv_i8
95 ; CHECK:       and [[REG1:w[0-9]+]], w1, #0xff
96 ; CHECK-NEXT:  lsl [[REG2:w[0-9]+]], w0, [[REG1]]
97 ; CHECK-NEXT:  and {{w[0-9]+}}, [[REG2]], #0xff
98 define zeroext i8 @lslv_i8(i8 %a, i8 %b) {
99   %1 = shl i8 %a, %b
100   ret i8 %1
101 }
102
103 ; CHECK-LABEL: lsl_i8
104 ; CHECK:       ubfiz {{w[0-9]*}}, {{w[0-9]*}}, #4, #4
105 define zeroext i8 @lsl_i8(i8 %a) {
106   %1 = shl i8 %a, 4
107   ret i8 %1
108 }
109
110 ; CHECK-LABEL: lsl_zext_i8_i16
111 ; CHECK:       ubfiz {{w[0-9]*}}, {{w[0-9]*}}, #4, #8
112 define zeroext i16 @lsl_zext_i8_i16(i8 %b) {
113   %1 = zext i8 %b to i16
114   %2 = shl i16 %1, 4
115   ret i16 %2
116 }
117
118 ; CHECK-LABEL: lsl_sext_i8_i16
119 ; CHECK:       sbfiz {{w[0-9]*}}, {{w[0-9]*}}, #4, #8
120 define signext i16 @lsl_sext_i8_i16(i8 %b) {
121   %1 = sext i8 %b to i16
122   %2 = shl i16 %1, 4
123   ret i16 %2
124 }
125
126 ; CHECK-LABEL: lsl_zext_i8_i32
127 ; CHECK:       ubfiz {{w[0-9]*}}, {{w[0-9]*}}, #4, #8
128 define i32 @lsl_zext_i8_i32(i8 %b) {
129   %1 = zext i8 %b to i32
130   %2 = shl i32 %1, 4
131   ret i32 %2
132 }
133
134 ; CHECK-LABEL: lsl_sext_i8_i32
135 ; CHECK:       sbfiz {{w[0-9]*}}, {{w[0-9]*}}, #4, #8
136 define i32 @lsl_sext_i8_i32(i8 %b) {
137   %1 = sext i8 %b to i32
138   %2 = shl i32 %1, 4
139   ret i32 %2
140 }
141
142 ; CHECK-LABEL: lsl_zext_i8_i64
143 ; CHECK:       ubfiz {{x[0-9]*}}, {{x[0-9]*}}, #4, #8
144 define i64 @lsl_zext_i8_i64(i8 %b) {
145   %1 = zext i8 %b to i64
146   %2 = shl i64 %1, 4
147   ret i64 %2
148 }
149
150 ; CHECK-LABEL: lsl_sext_i8_i64
151 ; CHECK:       sbfiz {{x[0-9]*}}, {{x[0-9]*}}, #4, #8
152 define i64 @lsl_sext_i8_i64(i8 %b) {
153   %1 = sext i8 %b to i64
154   %2 = shl i64 %1, 4
155   ret i64 %2
156 }
157
158 ; CHECK-LABEL: lslv_i16
159 ; CHECK:       and [[REG1:w[0-9]+]], w1, #0xffff
160 ; CHECK-NEXT:  lsl [[REG2:w[0-9]+]], w0, [[REG1]]
161 ; CHECK-NEXT:  and {{w[0-9]+}}, [[REG2]], #0xffff
162 define zeroext i16 @lslv_i16(i16 %a, i16 %b) {
163   %1 = shl i16 %a, %b
164   ret i16 %1
165 }
166
167 ; CHECK-LABEL: lsl_i16
168 ; CHECK:       ubfiz {{w[0-9]*}}, {{w[0-9]*}}, #8, #8
169 define zeroext i16 @lsl_i16(i16 %a) {
170   %1 = shl i16 %a, 8
171   ret i16 %1
172 }
173
174 ; CHECK-LABEL: lsl_zext_i16_i32
175 ; CHECK:       ubfiz {{w[0-9]*}}, {{w[0-9]*}}, #8, #16
176 define i32 @lsl_zext_i16_i32(i16 %b) {
177   %1 = zext i16 %b to i32
178   %2 = shl i32 %1, 8
179   ret i32 %2
180 }
181
182 ; CHECK-LABEL: lsl_sext_i16_i32
183 ; CHECK:       sbfiz {{w[0-9]*}}, {{w[0-9]*}}, #8, #16
184 define i32 @lsl_sext_i16_i32(i16 %b) {
185   %1 = sext i16 %b to i32
186   %2 = shl i32 %1, 8
187   ret i32 %2
188 }
189
190 ; CHECK-LABEL: lsl_zext_i16_i64
191 ; CHECK:       ubfiz {{x[0-9]*}}, {{x[0-9]*}}, #8, #16
192 define i64 @lsl_zext_i16_i64(i16 %b) {
193   %1 = zext i16 %b to i64
194   %2 = shl i64 %1, 8
195   ret i64 %2
196 }
197
198 ; CHECK-LABEL: lsl_sext_i16_i64
199 ; CHECK:       sbfiz {{x[0-9]*}}, {{x[0-9]*}}, #8, #16
200 define i64 @lsl_sext_i16_i64(i16 %b) {
201   %1 = sext i16 %b to i64
202   %2 = shl i64 %1, 8
203   ret i64 %2
204 }
205
206 ; CHECK-LABEL: lslv_i32
207 ; CHECK:       lsl {{w[0-9]*}}, w0, w1
208 define zeroext i32 @lslv_i32(i32 %a, i32 %b) {
209   %1 = shl i32 %a, %b
210   ret i32 %1
211 }
212
213 ; CHECK-LABEL: lsl_i32
214 ; CHECK:       lsl {{w[0-9]*}}, {{w[0-9]*}}, #16
215 define zeroext i32 @lsl_i32(i32 %a) {
216   %1 = shl i32 %a, 16
217   ret i32 %1
218 }
219
220 ; CHECK-LABEL: lsl_zext_i32_i64
221 ; CHECK:       ubfiz {{x[0-9]+}}, {{x[0-9]+}}, #16, #32
222 define i64 @lsl_zext_i32_i64(i32 %b) {
223   %1 = zext i32 %b to i64
224   %2 = shl i64 %1, 16
225   ret i64 %2
226 }
227
228 ; CHECK-LABEL: lsl_sext_i32_i64
229 ; CHECK:       sbfiz {{x[0-9]+}}, {{x[0-9]+}}, #16, #32
230 define i64 @lsl_sext_i32_i64(i32 %b) {
231   %1 = sext i32 %b to i64
232   %2 = shl i64 %1, 16
233   ret i64 %2
234 }
235
236 ; CHECK-LABEL: lslv_i64
237 ; CHECK:       lsl {{x[0-9]*}}, x0, x1
238 define i64 @lslv_i64(i64 %a, i64 %b) {
239   %1 = shl i64 %a, %b
240   ret i64 %1
241 }
242
243 ; CHECK-LABEL: lsl_i64
244 ; CHECK:       lsl {{x[0-9]*}}, {{x[0-9]*}}, #32
245 define i64 @lsl_i64(i64 %a) {
246   %1 = shl i64 %a, 32
247   ret i64 %1
248 }
249
250 ; CHECK-LABEL: lsrv_i8
251 ; CHECK:       and [[REG1:w[0-9]+]], w0, #0xff
252 ; CHECK-NEXT:  and [[REG2:w[0-9]+]], w1, #0xff
253 ; CHECK-NEXT:  lsr [[REG3:w[0-9]+]], [[REG1]], [[REG2]]
254 ; CHECK-NEXT:  and {{w[0-9]+}}, [[REG3]], #0xff
255 define zeroext i8 @lsrv_i8(i8 %a, i8 %b) {
256   %1 = lshr i8 %a, %b
257   ret i8 %1
258 }
259
260 ; CHECK-LABEL: lsr_i8
261 ; CHECK:       ubfx {{w[0-9]*}}, {{w[0-9]*}}, #4, #4
262 define zeroext i8 @lsr_i8(i8 %a) {
263   %1 = lshr i8 %a, 4
264   ret i8 %1
265 }
266
267 ; CHECK-LABEL: lsr_zext_i8_i16
268 ; CHECK:       ubfx {{w[0-9]*}}, {{w[0-9]*}}, #4, #4
269 define zeroext i16 @lsr_zext_i8_i16(i8 %b) {
270   %1 = zext i8 %b to i16
271   %2 = lshr i16 %1, 4
272   ret i16 %2
273 }
274
275 ; CHECK-LABEL: lsr_sext_i8_i16
276 ; CHECK:       sxtb [[REG:w[0-9]+]], w0
277 ; CHECK-NEXT:  ubfx {{w[0-9]*}}, [[REG]], #4, #12
278 define signext i16 @lsr_sext_i8_i16(i8 %b) {
279   %1 = sext i8 %b to i16
280   %2 = lshr i16 %1, 4
281   ret i16 %2
282 }
283
284 ; CHECK-LABEL: lsr_zext_i8_i32
285 ; CHECK:       ubfx {{w[0-9]*}}, {{w[0-9]*}}, #4, #4
286 define i32 @lsr_zext_i8_i32(i8 %b) {
287   %1 = zext i8 %b to i32
288   %2 = lshr i32 %1, 4
289   ret i32 %2
290 }
291
292 ; CHECK-LABEL: lsr_sext_i8_i32
293 ; CHECK:       sxtb [[REG:w[0-9]+]], w0
294 ; CHECK-NEXT:  lsr {{w[0-9]*}}, [[REG]], #4
295 define i32 @lsr_sext_i8_i32(i8 %b) {
296   %1 = sext i8 %b to i32
297   %2 = lshr i32 %1, 4
298   ret i32 %2
299 }
300
301 ; CHECK-LABEL: lsrv_i16
302 ; CHECK:       and [[REG1:w[0-9]+]], w0, #0xffff
303 ; CHECK-NEXT:  and [[REG2:w[0-9]+]], w1, #0xffff
304 ; CHECK-NEXT:  lsr [[REG3:w[0-9]+]], [[REG1]], [[REG2]]
305 ; CHECK-NEXT:  and {{w[0-9]+}}, [[REG3]], #0xffff
306 define zeroext i16 @lsrv_i16(i16 %a, i16 %b) {
307   %1 = lshr i16 %a, %b
308   ret i16 %1
309 }
310
311 ; CHECK-LABEL: lsr_i16
312 ; CHECK:       ubfx {{w[0-9]*}}, {{w[0-9]*}}, #8, #8
313 define zeroext i16 @lsr_i16(i16 %a) {
314   %1 = lshr i16 %a, 8
315   ret i16 %1
316 }
317
318 ; CHECK-LABEL: lsrv_i32
319 ; CHECK:       lsr {{w[0-9]*}}, w0, w1
320 define zeroext i32 @lsrv_i32(i32 %a, i32 %b) {
321   %1 = lshr i32 %a, %b
322   ret i32 %1
323 }
324
325 ; CHECK-LABEL: lsr_i32
326 ; CHECK:       lsr {{w[0-9]*}}, {{w[0-9]*}}, #16
327 define zeroext i32 @lsr_i32(i32 %a) {
328   %1 = lshr i32 %a, 16
329   ret i32 %1
330 }
331
332 ; CHECK-LABEL: lsrv_i64
333 ; CHECK:       lsr {{x[0-9]*}}, x0, x1
334 define i64 @lsrv_i64(i64 %a, i64 %b) {
335   %1 = lshr i64 %a, %b
336   ret i64 %1
337 }
338
339 ; CHECK-LABEL: lsr_i64
340 ; CHECK:       lsr {{x[0-9]*}}, {{x[0-9]*}}, #32
341 define i64 @lsr_i64(i64 %a) {
342   %1 = lshr i64 %a, 32
343   ret i64 %1
344 }
345
346 ; CHECK-LABEL: asrv_i8
347 ; CHECK:       sxtb [[REG1:w[0-9]+]], w0
348 ; CHECK-NEXT:  and  [[REG2:w[0-9]+]], w1, #0xff
349 ; CHECK-NEXT:  asr  [[REG3:w[0-9]+]], [[REG1]], [[REG2]]
350 ; CHECK-NEXT:  and  {{w[0-9]+}}, [[REG3]], #0xff
351 define zeroext i8 @asrv_i8(i8 %a, i8 %b) {
352   %1 = ashr i8 %a, %b
353   ret i8 %1
354 }
355
356 ; CHECK-LABEL: asr_i8
357 ; CHECK:       sbfx {{w[0-9]*}}, {{w[0-9]*}}, #4, #4
358 define zeroext i8 @asr_i8(i8 %a) {
359   %1 = ashr i8 %a, 4
360   ret i8 %1
361 }
362
363 ; CHECK-LABEL: asr_zext_i8_i16
364 ; CHECK:       ubfx {{w[0-9]*}}, {{w[0-9]*}}, #4, #4
365 define zeroext i16 @asr_zext_i8_i16(i8 %b) {
366   %1 = zext i8 %b to i16
367   %2 = ashr i16 %1, 4
368   ret i16 %2
369 }
370
371 ; CHECK-LABEL: asr_sext_i8_i16
372 ; CHECK:       sbfx {{w[0-9]*}}, {{w[0-9]*}}, #4, #4
373 define signext i16 @asr_sext_i8_i16(i8 %b) {
374   %1 = sext i8 %b to i16
375   %2 = ashr i16 %1, 4
376   ret i16 %2
377 }
378
379 ; CHECK-LABEL: asr_zext_i8_i32
380 ; CHECK:       ubfx {{w[0-9]*}}, {{w[0-9]*}}, #4, #4
381 define i32 @asr_zext_i8_i32(i8 %b) {
382   %1 = zext i8 %b to i32
383   %2 = ashr i32 %1, 4
384   ret i32 %2
385 }
386
387 ; CHECK-LABEL: asr_sext_i8_i32
388 ; CHECK:       sbfx {{w[0-9]*}}, {{w[0-9]*}}, #4, #4
389 define i32 @asr_sext_i8_i32(i8 %b) {
390   %1 = sext i8 %b to i32
391   %2 = ashr i32 %1, 4
392   ret i32 %2
393 }
394
395 ; CHECK-LABEL: asrv_i16
396 ; CHECK:       sxth [[REG1:w[0-9]+]], w0
397 ; CHECK-NEXT:  and  [[REG2:w[0-9]+]], w1, #0xffff
398 ; CHECK-NEXT:  asr  [[REG3:w[0-9]+]], [[REG1]], [[REG2]]
399 ; CHECK-NEXT:  and  {{w[0-9]+}}, [[REG3]], #0xffff
400 define zeroext i16 @asrv_i16(i16 %a, i16 %b) {
401   %1 = ashr i16 %a, %b
402   ret i16 %1
403 }
404
405 ; CHECK-LABEL: asr_i16
406 ; CHECK:       sbfx {{w[0-9]*}}, {{w[0-9]*}}, #8, #8
407 define zeroext i16 @asr_i16(i16 %a) {
408   %1 = ashr i16 %a, 8
409   ret i16 %1
410 }
411
412 ; CHECK-LABEL: asrv_i32
413 ; CHECK:       asr {{w[0-9]*}}, w0, w1
414 define zeroext i32 @asrv_i32(i32 %a, i32 %b) {
415   %1 = ashr i32 %a, %b
416   ret i32 %1
417 }
418
419 ; CHECK-LABEL: asr_i32
420 ; CHECK:       asr {{w[0-9]*}}, {{w[0-9]*}}, #16
421 define zeroext i32 @asr_i32(i32 %a) {
422   %1 = ashr i32 %a, 16
423   ret i32 %1
424 }
425
426 ; CHECK-LABEL: asrv_i64
427 ; CHECK:       asr {{x[0-9]*}}, x0, x1
428 define i64 @asrv_i64(i64 %a, i64 %b) {
429   %1 = ashr i64 %a, %b
430   ret i64 %1
431 }
432
433 ; CHECK-LABEL: asr_i64
434 ; CHECK:       asr {{x[0-9]*}}, {{x[0-9]*}}, #32
435 define i64 @asr_i64(i64 %a) {
436   %1 = ashr i64 %a, 32
437   ret i64 %1
438 }
439
440 ; CHECK-LABEL: shift_test1
441 ; CHECK:       ubfiz {{w[0-9]*}}, {{w[0-9]*}}, #4, #4
442 ; CHECK-NEXT:  sbfx  {{w[0-9]*}}, {{w[0-9]*}}, #4, #4
443 define i32 @shift_test1(i8 %a) {
444   %1 = shl i8 %a, 4
445   %2 = ashr i8 %1, 4
446   %3 = sext i8 %2 to i32
447   ret i32 %3
448 }
449
450 ; Test zero shifts
451
452 ; CHECK-LABEL: shl_zero
453 ; CHECK-NOT:   lsl
454 define i32 @shl_zero(i32 %a) {
455   %1 = shl i32 %a, 0
456   ret i32 %1
457 }
458
459 ; CHECK-LABEL: lshr_zero
460 ; CHECK-NOT:   lsr
461 define i32 @lshr_zero(i32 %a) {
462   %1 = lshr i32 %a, 0
463   ret i32 %1
464 }
465
466 ; CHECK-LABEL: ashr_zero
467 ; CHECK-NOT:   asr
468 define i32 @ashr_zero(i32 %a) {
469   %1 = ashr i32 %a, 0
470   ret i32 %1
471 }
472
473 ; CHECK-LABEL: shl_zext_zero
474 ; CHECK:       ubfx x0, x0, #0, #32
475 define i64 @shl_zext_zero(i32 %a) {
476   %1 = zext i32 %a to i64
477   %2 = shl i64 %1, 0
478   ret i64 %2
479 }
480
481 ; CHECK-LABEL: lshr_zext_zero
482 ; CHECK:       ubfx x0, x0, #0, #32
483 define i64 @lshr_zext_zero(i32 %a) {
484   %1 = zext i32 %a to i64
485   %2 = lshr i64 %1, 0
486   ret i64 %2
487 }
488
489 ; CHECK-LABEL: ashr_zext_zero
490 ; CHECK:       ubfx x0, x0, #0, #32
491 define i64 @ashr_zext_zero(i32 %a) {
492   %1 = zext i32 %a to i64
493   %2 = ashr i64 %1, 0
494   ret i64 %2
495 }
496