AArch64: fix vector-immediate BIC/ORR on big-endian devices.
[oota-llvm.git] / test / CodeGen / AArch64 / fast-isel-shift.ll
1 ; RUN: llc -fast-isel -fast-isel-abort -mtriple=arm64-apple-darwin -verify-machineinstrs < %s | FileCheck %s
2
3 ; CHECK-LABEL: lslv_i8
4 ; CHECK:       and [[REG1:w[0-9]+]], w1, #0xff
5 ; CHECK-NEXT:  lsl [[REG2:w[0-9]+]], w0, [[REG1]]
6 ; CHECK-NEXT:  and {{w[0-9]+}}, [[REG2]], #0xff
7 define zeroext i8 @lslv_i8(i8 %a, i8 %b) {
8   %1 = shl i8 %a, %b
9   ret i8 %1
10 }
11
12 ; CHECK-LABEL: lsl_i8
13 ; CHECK:       ubfiz {{w[0-9]*}}, {{w[0-9]*}}, #4, #4
14 define zeroext i8 @lsl_i8(i8 %a) {
15   %1 = shl i8 %a, 4
16   ret i8 %1
17 }
18
19 ; CHECK-LABEL: lsl_zext_i8_i16
20 ; CHECK:       ubfiz {{w[0-9]*}}, {{w[0-9]*}}, #4, #8
21 define zeroext i16 @lsl_zext_i8_i16(i8 %b) {
22   %1 = zext i8 %b to i16
23   %2 = shl i16 %1, 4
24   ret i16 %2
25 }
26
27 ; CHECK-LABEL: lsl_sext_i8_i16
28 ; CHECK:       sbfiz {{w[0-9]*}}, {{w[0-9]*}}, #4, #8
29 define signext i16 @lsl_sext_i8_i16(i8 %b) {
30   %1 = sext i8 %b to i16
31   %2 = shl i16 %1, 4
32   ret i16 %2
33 }
34
35 ; CHECK-LABEL: lsl_zext_i8_i32
36 ; CHECK:       ubfiz {{w[0-9]*}}, {{w[0-9]*}}, #4, #8
37 define i32 @lsl_zext_i8_i32(i8 %b) {
38   %1 = zext i8 %b to i32
39   %2 = shl i32 %1, 4
40   ret i32 %2
41 }
42
43 ; CHECK-LABEL: lsl_sext_i8_i32
44 ; CHECK:       sbfiz {{w[0-9]*}}, {{w[0-9]*}}, #4, #8
45 define i32 @lsl_sext_i8_i32(i8 %b) {
46   %1 = sext i8 %b to i32
47   %2 = shl i32 %1, 4
48   ret i32 %2
49 }
50
51 ; CHECK-LABEL: lsl_zext_i8_i64
52 ; CHECK:       ubfiz {{x[0-9]*}}, {{x[0-9]*}}, #4, #8
53 define i64 @lsl_zext_i8_i64(i8 %b) {
54   %1 = zext i8 %b to i64
55   %2 = shl i64 %1, 4
56   ret i64 %2
57 }
58
59 ; CHECK-LABEL: lsl_sext_i8_i64
60 ; CHECK:       sbfiz {{x[0-9]*}}, {{x[0-9]*}}, #4, #8
61 define i64 @lsl_sext_i8_i64(i8 %b) {
62   %1 = sext i8 %b to i64
63   %2 = shl i64 %1, 4
64   ret i64 %2
65 }
66
67 ; CHECK-LABEL: lslv_i16
68 ; CHECK:       and [[REG1:w[0-9]+]], w1, #0xffff
69 ; CHECK-NEXT:  lsl [[REG2:w[0-9]+]], w0, [[REG1]]
70 ; CHECK-NEXT:  and {{w[0-9]+}}, [[REG2]], #0xffff
71 define zeroext i16 @lslv_i16(i16 %a, i16 %b) {
72   %1 = shl i16 %a, %b
73   ret i16 %1
74 }
75
76 ; CHECK-LABEL: lsl_i16
77 ; CHECK:       ubfiz {{w[0-9]*}}, {{w[0-9]*}}, #8, #8
78 define zeroext i16 @lsl_i16(i16 %a) {
79   %1 = shl i16 %a, 8
80   ret i16 %1
81 }
82
83 ; CHECK-LABEL: lsl_zext_i16_i32
84 ; CHECK:       ubfiz {{w[0-9]*}}, {{w[0-9]*}}, #8, #16
85 define i32 @lsl_zext_i16_i32(i16 %b) {
86   %1 = zext i16 %b to i32
87   %2 = shl i32 %1, 8
88   ret i32 %2
89 }
90
91 ; CHECK-LABEL: lsl_sext_i16_i32
92 ; CHECK:       sbfiz {{w[0-9]*}}, {{w[0-9]*}}, #8, #16
93 define i32 @lsl_sext_i16_i32(i16 %b) {
94   %1 = sext i16 %b to i32
95   %2 = shl i32 %1, 8
96   ret i32 %2
97 }
98
99 ; CHECK-LABEL: lsl_zext_i16_i64
100 ; CHECK:       ubfiz {{x[0-9]*}}, {{x[0-9]*}}, #8, #16
101 define i64 @lsl_zext_i16_i64(i16 %b) {
102   %1 = zext i16 %b to i64
103   %2 = shl i64 %1, 8
104   ret i64 %2
105 }
106
107 ; CHECK-LABEL: lsl_sext_i16_i64
108 ; CHECK:       sbfiz {{x[0-9]*}}, {{x[0-9]*}}, #8, #16
109 define i64 @lsl_sext_i16_i64(i16 %b) {
110   %1 = sext i16 %b to i64
111   %2 = shl i64 %1, 8
112   ret i64 %2
113 }
114
115 ; CHECK-LABEL: lslv_i32
116 ; CHECK:       lsl {{w[0-9]*}}, w0, w1
117 define zeroext i32 @lslv_i32(i32 %a, i32 %b) {
118   %1 = shl i32 %a, %b
119   ret i32 %1
120 }
121
122 ; CHECK-LABEL: lsl_i32
123 ; CHECK:       lsl {{w[0-9]*}}, {{w[0-9]*}}, #16
124 define zeroext i32 @lsl_i32(i32 %a) {
125   %1 = shl i32 %a, 16
126   ret i32 %1
127 }
128
129 ; CHECK-LABEL: lsl_zext_i32_i64
130 ; CHECK:       ubfiz {{x[0-9]+}}, {{x[0-9]+}}, #16, #32
131 define i64 @lsl_zext_i32_i64(i32 %b) {
132   %1 = zext i32 %b to i64
133   %2 = shl i64 %1, 16
134   ret i64 %2
135 }
136
137 ; CHECK-LABEL: lsl_sext_i32_i64
138 ; CHECK:       sbfiz {{x[0-9]+}}, {{x[0-9]+}}, #16, #32
139 define i64 @lsl_sext_i32_i64(i32 %b) {
140   %1 = sext i32 %b to i64
141   %2 = shl i64 %1, 16
142   ret i64 %2
143 }
144
145 ; CHECK-LABEL: lslv_i64
146 ; CHECK:       lsl {{x[0-9]*}}, x0, x1
147 define i64 @lslv_i64(i64 %a, i64 %b) {
148   %1 = shl i64 %a, %b
149   ret i64 %1
150 }
151
152 ; CHECK-LABEL: lsl_i64
153 ; CHECK:       lsl {{x[0-9]*}}, {{x[0-9]*}}, #32
154 define i64 @lsl_i64(i64 %a) {
155   %1 = shl i64 %a, 32
156   ret i64 %1
157 }
158
159 ; CHECK-LABEL: lsrv_i8
160 ; CHECK:       and [[REG1:w[0-9]+]], w0, #0xff
161 ; CHECK-NEXT:  and [[REG2:w[0-9]+]], w1, #0xff
162 ; CHECK-NEXT:  lsr [[REG3:w[0-9]+]], [[REG1]], [[REG2]]
163 ; CHECK-NEXT:  and {{w[0-9]+}}, [[REG3]], #0xff
164 define zeroext i8 @lsrv_i8(i8 %a, i8 %b) {
165   %1 = lshr i8 %a, %b
166   ret i8 %1
167 }
168
169 ; CHECK-LABEL: lsr_i8
170 ; CHECK:       ubfx {{w[0-9]*}}, {{w[0-9]*}}, #4, #4
171 define zeroext i8 @lsr_i8(i8 %a) {
172   %1 = lshr i8 %a, 4
173   ret i8 %1
174 }
175
176 ; CHECK-LABEL: lsr_zext_i8_i16
177 ; CHECK:       ubfx {{w[0-9]*}}, {{w[0-9]*}}, #4, #4
178 define zeroext i16 @lsr_zext_i8_i16(i8 %b) {
179   %1 = zext i8 %b to i16
180   %2 = lshr i16 %1, 4
181   ret i16 %2
182 }
183
184 ; CHECK-LABEL: lsr_sext_i8_i16
185 ; CHECK:       sxtb [[REG:w[0-9]+]], w0
186 ; CHECK-NEXT:  ubfx {{w[0-9]*}}, [[REG]], #4, #12
187 define signext i16 @lsr_sext_i8_i16(i8 %b) {
188   %1 = sext i8 %b to i16
189   %2 = lshr i16 %1, 4
190   ret i16 %2
191 }
192
193 ; CHECK-LABEL: lsr_zext_i8_i32
194 ; CHECK:       ubfx {{w[0-9]*}}, {{w[0-9]*}}, #4, #4
195 define i32 @lsr_zext_i8_i32(i8 %b) {
196   %1 = zext i8 %b to i32
197   %2 = lshr i32 %1, 4
198   ret i32 %2
199 }
200
201 ; CHECK-LABEL: lsr_sext_i8_i32
202 ; CHECK:       sxtb [[REG:w[0-9]+]], w0
203 ; CHECK-NEXT:  lsr {{w[0-9]*}}, [[REG]], #4
204 define i32 @lsr_sext_i8_i32(i8 %b) {
205   %1 = sext i8 %b to i32
206   %2 = lshr i32 %1, 4
207   ret i32 %2
208 }
209
210 ; CHECK-LABEL: lsrv_i16
211 ; CHECK:       and [[REG1:w[0-9]+]], w0, #0xffff
212 ; CHECK-NEXT:  and [[REG2:w[0-9]+]], w1, #0xffff
213 ; CHECK-NEXT:  lsr [[REG3:w[0-9]+]], [[REG1]], [[REG2]]
214 ; CHECK-NEXT:  and {{w[0-9]+}}, [[REG3]], #0xffff
215 define zeroext i16 @lsrv_i16(i16 %a, i16 %b) {
216   %1 = lshr i16 %a, %b
217   ret i16 %1
218 }
219
220 ; CHECK-LABEL: lsr_i16
221 ; CHECK:       ubfx {{w[0-9]*}}, {{w[0-9]*}}, #8, #8
222 define zeroext i16 @lsr_i16(i16 %a) {
223   %1 = lshr i16 %a, 8
224   ret i16 %1
225 }
226
227 ; CHECK-LABEL: lsrv_i32
228 ; CHECK:       lsr {{w[0-9]*}}, w0, w1
229 define zeroext i32 @lsrv_i32(i32 %a, i32 %b) {
230   %1 = lshr i32 %a, %b
231   ret i32 %1
232 }
233
234 ; CHECK-LABEL: lsr_i32
235 ; CHECK:       lsr {{w[0-9]*}}, {{w[0-9]*}}, #16
236 define zeroext i32 @lsr_i32(i32 %a) {
237   %1 = lshr i32 %a, 16
238   ret i32 %1
239 }
240
241 ; CHECK-LABEL: lsrv_i64
242 ; CHECK:       lsr {{x[0-9]*}}, x0, x1
243 define i64 @lsrv_i64(i64 %a, i64 %b) {
244   %1 = lshr i64 %a, %b
245   ret i64 %1
246 }
247
248 ; CHECK-LABEL: lsr_i64
249 ; CHECK:       lsr {{x[0-9]*}}, {{x[0-9]*}}, #32
250 define i64 @lsr_i64(i64 %a) {
251   %1 = lshr i64 %a, 32
252   ret i64 %1
253 }
254
255 ; CHECK-LABEL: asrv_i8
256 ; CHECK:       sxtb [[REG1:w[0-9]+]], w0
257 ; CHECK-NEXT:  and  [[REG2:w[0-9]+]], w1, #0xff
258 ; CHECK-NEXT:  asr  [[REG3:w[0-9]+]], [[REG1]], [[REG2]]
259 ; CHECK-NEXT:  and  {{w[0-9]+}}, [[REG3]], #0xff
260 define zeroext i8 @asrv_i8(i8 %a, i8 %b) {
261   %1 = ashr i8 %a, %b
262   ret i8 %1
263 }
264
265 ; CHECK-LABEL: asr_i8
266 ; CHECK:       sbfx {{w[0-9]*}}, {{w[0-9]*}}, #4, #4
267 define zeroext i8 @asr_i8(i8 %a) {
268   %1 = ashr i8 %a, 4
269   ret i8 %1
270 }
271
272 ; CHECK-LABEL: asr_zext_i8_i16
273 ; CHECK:       ubfx {{w[0-9]*}}, {{w[0-9]*}}, #4, #4
274 define zeroext i16 @asr_zext_i8_i16(i8 %b) {
275   %1 = zext i8 %b to i16
276   %2 = ashr i16 %1, 4
277   ret i16 %2
278 }
279
280 ; CHECK-LABEL: asr_sext_i8_i16
281 ; CHECK:       sbfx {{w[0-9]*}}, {{w[0-9]*}}, #4, #4
282 define signext i16 @asr_sext_i8_i16(i8 %b) {
283   %1 = sext i8 %b to i16
284   %2 = ashr i16 %1, 4
285   ret i16 %2
286 }
287
288 ; CHECK-LABEL: asr_zext_i8_i32
289 ; CHECK:       ubfx {{w[0-9]*}}, {{w[0-9]*}}, #4, #4
290 define i32 @asr_zext_i8_i32(i8 %b) {
291   %1 = zext i8 %b to i32
292   %2 = ashr i32 %1, 4
293   ret i32 %2
294 }
295
296 ; CHECK-LABEL: asr_sext_i8_i32
297 ; CHECK:       sbfx {{w[0-9]*}}, {{w[0-9]*}}, #4, #4
298 define i32 @asr_sext_i8_i32(i8 %b) {
299   %1 = sext i8 %b to i32
300   %2 = ashr i32 %1, 4
301   ret i32 %2
302 }
303
304 ; CHECK-LABEL: asrv_i16
305 ; CHECK:       sxth [[REG1:w[0-9]+]], w0
306 ; CHECK-NEXT:  and  [[REG2:w[0-9]+]], w1, #0xffff
307 ; CHECK-NEXT:  asr  [[REG3:w[0-9]+]], [[REG1]], [[REG2]]
308 ; CHECK-NEXT:  and  {{w[0-9]+}}, [[REG3]], #0xffff
309 define zeroext i16 @asrv_i16(i16 %a, i16 %b) {
310   %1 = ashr i16 %a, %b
311   ret i16 %1
312 }
313
314 ; CHECK-LABEL: asr_i16
315 ; CHECK:       sbfx {{w[0-9]*}}, {{w[0-9]*}}, #8, #8
316 define zeroext i16 @asr_i16(i16 %a) {
317   %1 = ashr i16 %a, 8
318   ret i16 %1
319 }
320
321 ; CHECK-LABEL: asrv_i32
322 ; CHECK:       asr {{w[0-9]*}}, w0, w1
323 define zeroext i32 @asrv_i32(i32 %a, i32 %b) {
324   %1 = ashr i32 %a, %b
325   ret i32 %1
326 }
327
328 ; CHECK-LABEL: asr_i32
329 ; CHECK:       asr {{w[0-9]*}}, {{w[0-9]*}}, #16
330 define zeroext i32 @asr_i32(i32 %a) {
331   %1 = ashr i32 %a, 16
332   ret i32 %1
333 }
334
335 ; CHECK-LABEL: asrv_i64
336 ; CHECK:       asr {{x[0-9]*}}, x0, x1
337 define i64 @asrv_i64(i64 %a, i64 %b) {
338   %1 = ashr i64 %a, %b
339   ret i64 %1
340 }
341
342 ; CHECK-LABEL: asr_i64
343 ; CHECK:       asr {{x[0-9]*}}, {{x[0-9]*}}, #32
344 define i64 @asr_i64(i64 %a) {
345   %1 = ashr i64 %a, 32
346   ret i64 %1
347 }
348
349 ; CHECK-LABEL: shift_test1
350 ; CHECK:       ubfiz {{w[0-9]*}}, {{w[0-9]*}}, #4, #4
351 ; CHECK-NEXT:  sbfx  {{w[0-9]*}}, {{w[0-9]*}}, #4, #4
352 define i32 @shift_test1(i8 %a) {
353   %1 = shl i8 %a, 4
354   %2 = ashr i8 %1, 4
355   %3 = sext i8 %2 to i32
356   ret i32 %3
357 }
358