blob: fd3ee27a4b63acd7c7fedbfea683df5e2dff767d [file] [log] [blame]
Juergen Ributzka4328fd92014-11-18 19:58:59 +00001; RUN: llc -fast-isel -fast-isel-abort -mtriple=aarch64-apple-darwin -verify-machineinstrs < %s | FileCheck %s
Juergen Ributzkaa75cb112014-07-30 22:04:22 +00002
Juergen Ributzka27e959d2014-09-22 21:08:53 +00003; CHECK-LABEL: lsl_zext_i1_i16
4; CHECK: ubfiz {{w[0-9]*}}, {{w[0-9]*}}, #4, #1
5define 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
13define 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
21define 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
29define 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
37define 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
45define 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
Juergen Ributzka0e0b4c12014-08-21 23:06:07 +000051; 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
55define zeroext i8 @lslv_i8(i8 %a, i8 %b) {
56 %1 = shl i8 %a, %b
57 ret i8 %1
58}
59
Juergen Ributzkaa75cb112014-07-30 22:04:22 +000060; CHECK-LABEL: lsl_i8
Juergen Ributzka0e0b4c12014-08-21 23:06:07 +000061; CHECK: ubfiz {{w[0-9]*}}, {{w[0-9]*}}, #4, #4
Juergen Ributzkaa75cb112014-07-30 22:04:22 +000062define zeroext i8 @lsl_i8(i8 %a) {
63 %1 = shl i8 %a, 4
64 ret i8 %1
65}
66
Juergen Ributzka99dd30f2014-08-27 00:58:26 +000067; CHECK-LABEL: lsl_zext_i8_i16
68; CHECK: ubfiz {{w[0-9]*}}, {{w[0-9]*}}, #4, #8
69define 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
77define 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
85define 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
93define 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
Juergen Ributzka99dd30f2014-08-27 00:58:26 +000099; CHECK-LABEL: lsl_zext_i8_i64
Juergen Ributzka53dbef62014-09-02 22:33:57 +0000100; CHECK: ubfiz {{x[0-9]*}}, {{x[0-9]*}}, #4, #8
Juergen Ributzka99dd30f2014-08-27 00:58:26 +0000101define 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
Juergen Ributzka99dd30f2014-08-27 00:58:26 +0000107; CHECK-LABEL: lsl_sext_i8_i64
Juergen Ributzka53dbef62014-09-02 22:33:57 +0000108; CHECK: sbfiz {{x[0-9]*}}, {{x[0-9]*}}, #4, #8
Juergen Ributzka99dd30f2014-08-27 00:58:26 +0000109define 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
Juergen Ributzka0e0b4c12014-08-21 23:06:07 +0000115; 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
119define zeroext i16 @lslv_i16(i16 %a, i16 %b) {
120 %1 = shl i16 %a, %b
121 ret i16 %1
122}
123
Juergen Ributzkaa75cb112014-07-30 22:04:22 +0000124; CHECK-LABEL: lsl_i16
Juergen Ributzka0e0b4c12014-08-21 23:06:07 +0000125; CHECK: ubfiz {{w[0-9]*}}, {{w[0-9]*}}, #8, #8
Juergen Ributzkaa75cb112014-07-30 22:04:22 +0000126define zeroext i16 @lsl_i16(i16 %a) {
127 %1 = shl i16 %a, 8
128 ret i16 %1
129}
130
Juergen Ributzka99dd30f2014-08-27 00:58:26 +0000131; CHECK-LABEL: lsl_zext_i16_i32
132; CHECK: ubfiz {{w[0-9]*}}, {{w[0-9]*}}, #8, #16
133define 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
141define 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
Juergen Ributzka99dd30f2014-08-27 00:58:26 +0000147; CHECK-LABEL: lsl_zext_i16_i64
Juergen Ributzka53dbef62014-09-02 22:33:57 +0000148; CHECK: ubfiz {{x[0-9]*}}, {{x[0-9]*}}, #8, #16
Juergen Ributzka99dd30f2014-08-27 00:58:26 +0000149define 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
Juergen Ributzka99dd30f2014-08-27 00:58:26 +0000155; CHECK-LABEL: lsl_sext_i16_i64
Juergen Ributzka53dbef62014-09-02 22:33:57 +0000156; CHECK: sbfiz {{x[0-9]*}}, {{x[0-9]*}}, #8, #16
Juergen Ributzka99dd30f2014-08-27 00:58:26 +0000157define 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
Juergen Ributzka0e0b4c12014-08-21 23:06:07 +0000163; CHECK-LABEL: lslv_i32
164; CHECK: lsl {{w[0-9]*}}, w0, w1
165define zeroext i32 @lslv_i32(i32 %a, i32 %b) {
166 %1 = shl i32 %a, %b
167 ret i32 %1
168}
169
Juergen Ributzkaa75cb112014-07-30 22:04:22 +0000170; CHECK-LABEL: lsl_i32
Juergen Ributzka0e0b4c12014-08-21 23:06:07 +0000171; CHECK: lsl {{w[0-9]*}}, {{w[0-9]*}}, #16
Juergen Ributzkaa75cb112014-07-30 22:04:22 +0000172define zeroext i32 @lsl_i32(i32 %a) {
173 %1 = shl i32 %a, 16
174 ret i32 %1
175}
176
Juergen Ributzka99dd30f2014-08-27 00:58:26 +0000177; CHECK-LABEL: lsl_zext_i32_i64
Juergen Ributzka53dbef62014-09-02 22:33:57 +0000178; CHECK: ubfiz {{x[0-9]+}}, {{x[0-9]+}}, #16, #32
Juergen Ributzka99dd30f2014-08-27 00:58:26 +0000179define 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
Juergen Ributzka99dd30f2014-08-27 00:58:26 +0000185; CHECK-LABEL: lsl_sext_i32_i64
Juergen Ributzka53dbef62014-09-02 22:33:57 +0000186; CHECK: sbfiz {{x[0-9]+}}, {{x[0-9]+}}, #16, #32
Juergen Ributzka99dd30f2014-08-27 00:58:26 +0000187define 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
Juergen Ributzka0e0b4c12014-08-21 23:06:07 +0000193; CHECK-LABEL: lslv_i64
194; CHECK: lsl {{x[0-9]*}}, x0, x1
195define i64 @lslv_i64(i64 %a, i64 %b) {
196 %1 = shl i64 %a, %b
197 ret i64 %1
198}
199
Juergen Ributzkaa75cb112014-07-30 22:04:22 +0000200; CHECK-LABEL: lsl_i64
Juergen Ributzka53dbef62014-09-02 22:33:57 +0000201; CHECK: lsl {{x[0-9]*}}, {{x[0-9]*}}, #32
Juergen Ributzkaa75cb112014-07-30 22:04:22 +0000202define i64 @lsl_i64(i64 %a) {
203 %1 = shl i64 %a, 32
204 ret i64 %1
205}
206
Juergen Ributzka0e0b4c12014-08-21 23:06:07 +0000207; 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
212define zeroext i8 @lsrv_i8(i8 %a, i8 %b) {
213 %1 = lshr i8 %a, %b
214 ret i8 %1
215}
216
Juergen Ributzkaa75cb112014-07-30 22:04:22 +0000217; CHECK-LABEL: lsr_i8
Juergen Ributzka0e0b4c12014-08-21 23:06:07 +0000218; CHECK: ubfx {{w[0-9]*}}, {{w[0-9]*}}, #4, #4
Juergen Ributzkaa75cb112014-07-30 22:04:22 +0000219define zeroext i8 @lsr_i8(i8 %a) {
220 %1 = lshr i8 %a, 4
221 ret i8 %1
222}
223
Juergen Ributzka99dd30f2014-08-27 00:58:26 +0000224; CHECK-LABEL: lsr_zext_i8_i16
225; CHECK: ubfx {{w[0-9]*}}, {{w[0-9]*}}, #4, #4
226define 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
235define 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
243define 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
252define 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
Juergen Ributzka0e0b4c12014-08-21 23:06:07 +0000258; 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
263define zeroext i16 @lsrv_i16(i16 %a, i16 %b) {
264 %1 = lshr i16 %a, %b
265 ret i16 %1
266}
267
Juergen Ributzkaa75cb112014-07-30 22:04:22 +0000268; CHECK-LABEL: lsr_i16
Juergen Ributzka0e0b4c12014-08-21 23:06:07 +0000269; CHECK: ubfx {{w[0-9]*}}, {{w[0-9]*}}, #8, #8
Juergen Ributzkaa75cb112014-07-30 22:04:22 +0000270define zeroext i16 @lsr_i16(i16 %a) {
271 %1 = lshr i16 %a, 8
272 ret i16 %1
273}
274
Juergen Ributzka0e0b4c12014-08-21 23:06:07 +0000275; CHECK-LABEL: lsrv_i32
276; CHECK: lsr {{w[0-9]*}}, w0, w1
277define zeroext i32 @lsrv_i32(i32 %a, i32 %b) {
278 %1 = lshr i32 %a, %b
279 ret i32 %1
280}
281
Juergen Ributzkaa75cb112014-07-30 22:04:22 +0000282; CHECK-LABEL: lsr_i32
Juergen Ributzka0e0b4c12014-08-21 23:06:07 +0000283; CHECK: lsr {{w[0-9]*}}, {{w[0-9]*}}, #16
Juergen Ributzkaa75cb112014-07-30 22:04:22 +0000284define zeroext i32 @lsr_i32(i32 %a) {
285 %1 = lshr i32 %a, 16
286 ret i32 %1
287}
288
Juergen Ributzka0e0b4c12014-08-21 23:06:07 +0000289; CHECK-LABEL: lsrv_i64
290; CHECK: lsr {{x[0-9]*}}, x0, x1
291define i64 @lsrv_i64(i64 %a, i64 %b) {
292 %1 = lshr i64 %a, %b
293 ret i64 %1
294}
295
Juergen Ributzkaa75cb112014-07-30 22:04:22 +0000296; CHECK-LABEL: lsr_i64
Juergen Ributzka53dbef62014-09-02 22:33:57 +0000297; CHECK: lsr {{x[0-9]*}}, {{x[0-9]*}}, #32
Juergen Ributzkaa75cb112014-07-30 22:04:22 +0000298define i64 @lsr_i64(i64 %a) {
299 %1 = lshr i64 %a, 32
300 ret i64 %1
301}
302
Juergen Ributzka0e0b4c12014-08-21 23:06:07 +0000303; 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
308define zeroext i8 @asrv_i8(i8 %a, i8 %b) {
309 %1 = ashr i8 %a, %b
310 ret i8 %1
311}
312
Juergen Ributzkaa75cb112014-07-30 22:04:22 +0000313; CHECK-LABEL: asr_i8
Juergen Ributzka0e0b4c12014-08-21 23:06:07 +0000314; CHECK: sbfx {{w[0-9]*}}, {{w[0-9]*}}, #4, #4
Juergen Ributzkaa75cb112014-07-30 22:04:22 +0000315define zeroext i8 @asr_i8(i8 %a) {
316 %1 = ashr i8 %a, 4
317 ret i8 %1
318}
319
Juergen Ributzka99dd30f2014-08-27 00:58:26 +0000320; CHECK-LABEL: asr_zext_i8_i16
321; CHECK: ubfx {{w[0-9]*}}, {{w[0-9]*}}, #4, #4
322define 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
330define 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
338define 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
346define 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
Juergen Ributzka0e0b4c12014-08-21 23:06:07 +0000352; 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
357define zeroext i16 @asrv_i16(i16 %a, i16 %b) {
358 %1 = ashr i16 %a, %b
359 ret i16 %1
360}
361
Juergen Ributzkaa75cb112014-07-30 22:04:22 +0000362; CHECK-LABEL: asr_i16
Juergen Ributzka0e0b4c12014-08-21 23:06:07 +0000363; CHECK: sbfx {{w[0-9]*}}, {{w[0-9]*}}, #8, #8
Juergen Ributzkaa75cb112014-07-30 22:04:22 +0000364define zeroext i16 @asr_i16(i16 %a) {
365 %1 = ashr i16 %a, 8
366 ret i16 %1
367}
368
Juergen Ributzka0e0b4c12014-08-21 23:06:07 +0000369; CHECK-LABEL: asrv_i32
370; CHECK: asr {{w[0-9]*}}, w0, w1
371define zeroext i32 @asrv_i32(i32 %a, i32 %b) {
372 %1 = ashr i32 %a, %b
373 ret i32 %1
374}
375
Juergen Ributzkaa75cb112014-07-30 22:04:22 +0000376; CHECK-LABEL: asr_i32
Juergen Ributzka0e0b4c12014-08-21 23:06:07 +0000377; CHECK: asr {{w[0-9]*}}, {{w[0-9]*}}, #16
Juergen Ributzkaa75cb112014-07-30 22:04:22 +0000378define zeroext i32 @asr_i32(i32 %a) {
379 %1 = ashr i32 %a, 16
380 ret i32 %1
381}
382
Juergen Ributzka0e0b4c12014-08-21 23:06:07 +0000383; CHECK-LABEL: asrv_i64
384; CHECK: asr {{x[0-9]*}}, x0, x1
385define i64 @asrv_i64(i64 %a, i64 %b) {
386 %1 = ashr i64 %a, %b
387 ret i64 %1
388}
389
Juergen Ributzkaa75cb112014-07-30 22:04:22 +0000390; CHECK-LABEL: asr_i64
Juergen Ributzka53dbef62014-09-02 22:33:57 +0000391; CHECK: asr {{x[0-9]*}}, {{x[0-9]*}}, #32
Juergen Ributzkaa75cb112014-07-30 22:04:22 +0000392define i64 @asr_i64(i64 %a) {
393 %1 = ashr i64 %a, 32
394 ret i64 %1
395}
396
Juergen Ributzka53533e82014-08-04 21:49:51 +0000397; 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
400define 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
Juergen Ributzka4328fd92014-11-18 19:58:59 +0000407; Test zero shifts
408
409; CHECK-LABEL: shl_zero
410; CHECK-NOT: lsl
411define 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
418define 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
425define i32 @ashr_zero(i32 %a) {
426 %1 = ashr i32 %a, 0
427 ret i32 %1
428}
429