blob: da8469c0ecd0d378dc44cd55a593abcd6d6673b4 [file] [log] [blame]
Juergen Ributzkaaddb75a2014-08-21 20:57:57 +00001; RUN: llc -fast-isel -fast-isel-abort -mtriple=arm64-apple-darwin -verify-machineinstrs < %s | FileCheck %s
Juergen Ributzkaa75cb112014-07-30 22:04:22 +00002
Juergen Ributzka0e0b4c12014-08-21 23:06:07 +00003; 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
7define zeroext i8 @lslv_i8(i8 %a, i8 %b) {
8 %1 = shl i8 %a, %b
9 ret i8 %1
10}
11
Juergen Ributzkaa75cb112014-07-30 22:04:22 +000012; CHECK-LABEL: lsl_i8
Juergen Ributzka0e0b4c12014-08-21 23:06:07 +000013; CHECK: ubfiz {{w[0-9]*}}, {{w[0-9]*}}, #4, #4
Juergen Ributzkaa75cb112014-07-30 22:04:22 +000014define zeroext i8 @lsl_i8(i8 %a) {
15 %1 = shl i8 %a, 4
16 ret i8 %1
17}
18
Juergen Ributzka99dd30f2014-08-27 00:58:26 +000019; CHECK-LABEL: lsl_zext_i8_i16
20; CHECK: ubfiz {{w[0-9]*}}, {{w[0-9]*}}, #4, #8
21define 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
29define 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
37define 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
45define 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
Juergen Ributzka99dd30f2014-08-27 00:58:26 +000051; CHECK-LABEL: lsl_zext_i8_i64
Juergen Ributzka53dbef62014-09-02 22:33:57 +000052; CHECK: ubfiz {{x[0-9]*}}, {{x[0-9]*}}, #4, #8
Juergen Ributzka99dd30f2014-08-27 00:58:26 +000053define 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
Juergen Ributzka99dd30f2014-08-27 00:58:26 +000059; CHECK-LABEL: lsl_sext_i8_i64
Juergen Ributzka53dbef62014-09-02 22:33:57 +000060; CHECK: sbfiz {{x[0-9]*}}, {{x[0-9]*}}, #4, #8
Juergen Ributzka99dd30f2014-08-27 00:58:26 +000061define 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
Juergen Ributzka0e0b4c12014-08-21 23:06:07 +000067; 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
71define zeroext i16 @lslv_i16(i16 %a, i16 %b) {
72 %1 = shl i16 %a, %b
73 ret i16 %1
74}
75
Juergen Ributzkaa75cb112014-07-30 22:04:22 +000076; CHECK-LABEL: lsl_i16
Juergen Ributzka0e0b4c12014-08-21 23:06:07 +000077; CHECK: ubfiz {{w[0-9]*}}, {{w[0-9]*}}, #8, #8
Juergen Ributzkaa75cb112014-07-30 22:04:22 +000078define zeroext i16 @lsl_i16(i16 %a) {
79 %1 = shl i16 %a, 8
80 ret i16 %1
81}
82
Juergen Ributzka99dd30f2014-08-27 00:58:26 +000083; CHECK-LABEL: lsl_zext_i16_i32
84; CHECK: ubfiz {{w[0-9]*}}, {{w[0-9]*}}, #8, #16
85define 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
93define 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
Juergen Ributzka99dd30f2014-08-27 00:58:26 +000099; CHECK-LABEL: lsl_zext_i16_i64
Juergen Ributzka53dbef62014-09-02 22:33:57 +0000100; CHECK: ubfiz {{x[0-9]*}}, {{x[0-9]*}}, #8, #16
Juergen Ributzka99dd30f2014-08-27 00:58:26 +0000101define 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
Juergen Ributzka99dd30f2014-08-27 00:58:26 +0000107; CHECK-LABEL: lsl_sext_i16_i64
Juergen Ributzka53dbef62014-09-02 22:33:57 +0000108; CHECK: sbfiz {{x[0-9]*}}, {{x[0-9]*}}, #8, #16
Juergen Ributzka99dd30f2014-08-27 00:58:26 +0000109define 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
Juergen Ributzka0e0b4c12014-08-21 23:06:07 +0000115; CHECK-LABEL: lslv_i32
116; CHECK: lsl {{w[0-9]*}}, w0, w1
117define zeroext i32 @lslv_i32(i32 %a, i32 %b) {
118 %1 = shl i32 %a, %b
119 ret i32 %1
120}
121
Juergen Ributzkaa75cb112014-07-30 22:04:22 +0000122; CHECK-LABEL: lsl_i32
Juergen Ributzka0e0b4c12014-08-21 23:06:07 +0000123; CHECK: lsl {{w[0-9]*}}, {{w[0-9]*}}, #16
Juergen Ributzkaa75cb112014-07-30 22:04:22 +0000124define zeroext i32 @lsl_i32(i32 %a) {
125 %1 = shl i32 %a, 16
126 ret i32 %1
127}
128
Juergen Ributzka99dd30f2014-08-27 00:58:26 +0000129; CHECK-LABEL: lsl_zext_i32_i64
Juergen Ributzka53dbef62014-09-02 22:33:57 +0000130; CHECK: ubfiz {{x[0-9]+}}, {{x[0-9]+}}, #16, #32
Juergen Ributzka99dd30f2014-08-27 00:58:26 +0000131define 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
Juergen Ributzka99dd30f2014-08-27 00:58:26 +0000137; CHECK-LABEL: lsl_sext_i32_i64
Juergen Ributzka53dbef62014-09-02 22:33:57 +0000138; CHECK: sbfiz {{x[0-9]+}}, {{x[0-9]+}}, #16, #32
Juergen Ributzka99dd30f2014-08-27 00:58:26 +0000139define 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
Juergen Ributzka0e0b4c12014-08-21 23:06:07 +0000145; CHECK-LABEL: lslv_i64
146; CHECK: lsl {{x[0-9]*}}, x0, x1
147define i64 @lslv_i64(i64 %a, i64 %b) {
148 %1 = shl i64 %a, %b
149 ret i64 %1
150}
151
Juergen Ributzkaa75cb112014-07-30 22:04:22 +0000152; CHECK-LABEL: lsl_i64
Juergen Ributzka53dbef62014-09-02 22:33:57 +0000153; CHECK: lsl {{x[0-9]*}}, {{x[0-9]*}}, #32
Juergen Ributzkaa75cb112014-07-30 22:04:22 +0000154define i64 @lsl_i64(i64 %a) {
155 %1 = shl i64 %a, 32
156 ret i64 %1
157}
158
Juergen Ributzka0e0b4c12014-08-21 23:06:07 +0000159; 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
164define zeroext i8 @lsrv_i8(i8 %a, i8 %b) {
165 %1 = lshr i8 %a, %b
166 ret i8 %1
167}
168
Juergen Ributzkaa75cb112014-07-30 22:04:22 +0000169; CHECK-LABEL: lsr_i8
Juergen Ributzka0e0b4c12014-08-21 23:06:07 +0000170; CHECK: ubfx {{w[0-9]*}}, {{w[0-9]*}}, #4, #4
Juergen Ributzkaa75cb112014-07-30 22:04:22 +0000171define zeroext i8 @lsr_i8(i8 %a) {
172 %1 = lshr i8 %a, 4
173 ret i8 %1
174}
175
Juergen Ributzka99dd30f2014-08-27 00:58:26 +0000176; CHECK-LABEL: lsr_zext_i8_i16
177; CHECK: ubfx {{w[0-9]*}}, {{w[0-9]*}}, #4, #4
178define 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
187define 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
195define 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
204define 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
Juergen Ributzka0e0b4c12014-08-21 23:06:07 +0000210; 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
215define zeroext i16 @lsrv_i16(i16 %a, i16 %b) {
216 %1 = lshr i16 %a, %b
217 ret i16 %1
218}
219
Juergen Ributzkaa75cb112014-07-30 22:04:22 +0000220; CHECK-LABEL: lsr_i16
Juergen Ributzka0e0b4c12014-08-21 23:06:07 +0000221; CHECK: ubfx {{w[0-9]*}}, {{w[0-9]*}}, #8, #8
Juergen Ributzkaa75cb112014-07-30 22:04:22 +0000222define zeroext i16 @lsr_i16(i16 %a) {
223 %1 = lshr i16 %a, 8
224 ret i16 %1
225}
226
Juergen Ributzka0e0b4c12014-08-21 23:06:07 +0000227; CHECK-LABEL: lsrv_i32
228; CHECK: lsr {{w[0-9]*}}, w0, w1
229define zeroext i32 @lsrv_i32(i32 %a, i32 %b) {
230 %1 = lshr i32 %a, %b
231 ret i32 %1
232}
233
Juergen Ributzkaa75cb112014-07-30 22:04:22 +0000234; CHECK-LABEL: lsr_i32
Juergen Ributzka0e0b4c12014-08-21 23:06:07 +0000235; CHECK: lsr {{w[0-9]*}}, {{w[0-9]*}}, #16
Juergen Ributzkaa75cb112014-07-30 22:04:22 +0000236define zeroext i32 @lsr_i32(i32 %a) {
237 %1 = lshr i32 %a, 16
238 ret i32 %1
239}
240
Juergen Ributzka0e0b4c12014-08-21 23:06:07 +0000241; CHECK-LABEL: lsrv_i64
242; CHECK: lsr {{x[0-9]*}}, x0, x1
243define i64 @lsrv_i64(i64 %a, i64 %b) {
244 %1 = lshr i64 %a, %b
245 ret i64 %1
246}
247
Juergen Ributzkaa75cb112014-07-30 22:04:22 +0000248; CHECK-LABEL: lsr_i64
Juergen Ributzka53dbef62014-09-02 22:33:57 +0000249; CHECK: lsr {{x[0-9]*}}, {{x[0-9]*}}, #32
Juergen Ributzkaa75cb112014-07-30 22:04:22 +0000250define i64 @lsr_i64(i64 %a) {
251 %1 = lshr i64 %a, 32
252 ret i64 %1
253}
254
Juergen Ributzka0e0b4c12014-08-21 23:06:07 +0000255; 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
260define zeroext i8 @asrv_i8(i8 %a, i8 %b) {
261 %1 = ashr i8 %a, %b
262 ret i8 %1
263}
264
Juergen Ributzkaa75cb112014-07-30 22:04:22 +0000265; CHECK-LABEL: asr_i8
Juergen Ributzka0e0b4c12014-08-21 23:06:07 +0000266; CHECK: sbfx {{w[0-9]*}}, {{w[0-9]*}}, #4, #4
Juergen Ributzkaa75cb112014-07-30 22:04:22 +0000267define zeroext i8 @asr_i8(i8 %a) {
268 %1 = ashr i8 %a, 4
269 ret i8 %1
270}
271
Juergen Ributzka99dd30f2014-08-27 00:58:26 +0000272; CHECK-LABEL: asr_zext_i8_i16
273; CHECK: ubfx {{w[0-9]*}}, {{w[0-9]*}}, #4, #4
274define 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
282define 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
290define 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
298define 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
Juergen Ributzka0e0b4c12014-08-21 23:06:07 +0000304; 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
309define zeroext i16 @asrv_i16(i16 %a, i16 %b) {
310 %1 = ashr i16 %a, %b
311 ret i16 %1
312}
313
Juergen Ributzkaa75cb112014-07-30 22:04:22 +0000314; CHECK-LABEL: asr_i16
Juergen Ributzka0e0b4c12014-08-21 23:06:07 +0000315; CHECK: sbfx {{w[0-9]*}}, {{w[0-9]*}}, #8, #8
Juergen Ributzkaa75cb112014-07-30 22:04:22 +0000316define zeroext i16 @asr_i16(i16 %a) {
317 %1 = ashr i16 %a, 8
318 ret i16 %1
319}
320
Juergen Ributzka0e0b4c12014-08-21 23:06:07 +0000321; CHECK-LABEL: asrv_i32
322; CHECK: asr {{w[0-9]*}}, w0, w1
323define zeroext i32 @asrv_i32(i32 %a, i32 %b) {
324 %1 = ashr i32 %a, %b
325 ret i32 %1
326}
327
Juergen Ributzkaa75cb112014-07-30 22:04:22 +0000328; CHECK-LABEL: asr_i32
Juergen Ributzka0e0b4c12014-08-21 23:06:07 +0000329; CHECK: asr {{w[0-9]*}}, {{w[0-9]*}}, #16
Juergen Ributzkaa75cb112014-07-30 22:04:22 +0000330define zeroext i32 @asr_i32(i32 %a) {
331 %1 = ashr i32 %a, 16
332 ret i32 %1
333}
334
Juergen Ributzka0e0b4c12014-08-21 23:06:07 +0000335; CHECK-LABEL: asrv_i64
336; CHECK: asr {{x[0-9]*}}, x0, x1
337define i64 @asrv_i64(i64 %a, i64 %b) {
338 %1 = ashr i64 %a, %b
339 ret i64 %1
340}
341
Juergen Ributzkaa75cb112014-07-30 22:04:22 +0000342; CHECK-LABEL: asr_i64
Juergen Ributzka53dbef62014-09-02 22:33:57 +0000343; CHECK: asr {{x[0-9]*}}, {{x[0-9]*}}, #32
Juergen Ributzkaa75cb112014-07-30 22:04:22 +0000344define i64 @asr_i64(i64 %a) {
345 %1 = ashr i64 %a, 32
346 ret i64 %1
347}
348
Juergen Ributzka53533e82014-08-04 21:49:51 +0000349; 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
352define 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