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