blob: 210b4ed9b9235f6a5b1d61d49bc84b59119610f5 [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 Ributzka0e0b4c12014-08-21 23:06:07 +000019; CHECK-LABEL: lslv_i16
20; CHECK: and [[REG1:w[0-9]+]], w1, #0xffff
21; CHECK-NEXT: lsl [[REG2:w[0-9]+]], w0, [[REG1]]
22; CHECK-NEXT: and {{w[0-9]+}}, [[REG2]], #0xffff
23define zeroext i16 @lslv_i16(i16 %a, i16 %b) {
24 %1 = shl i16 %a, %b
25 ret i16 %1
26}
27
Juergen Ributzkaa75cb112014-07-30 22:04:22 +000028; CHECK-LABEL: lsl_i16
Juergen Ributzka0e0b4c12014-08-21 23:06:07 +000029; CHECK: ubfiz {{w[0-9]*}}, {{w[0-9]*}}, #8, #8
Juergen Ributzkaa75cb112014-07-30 22:04:22 +000030define zeroext i16 @lsl_i16(i16 %a) {
31 %1 = shl i16 %a, 8
32 ret i16 %1
33}
34
Juergen Ributzka0e0b4c12014-08-21 23:06:07 +000035; CHECK-LABEL: lslv_i32
36; CHECK: lsl {{w[0-9]*}}, w0, w1
37define zeroext i32 @lslv_i32(i32 %a, i32 %b) {
38 %1 = shl i32 %a, %b
39 ret i32 %1
40}
41
Juergen Ributzkaa75cb112014-07-30 22:04:22 +000042; CHECK-LABEL: lsl_i32
Juergen Ributzka0e0b4c12014-08-21 23:06:07 +000043; CHECK: lsl {{w[0-9]*}}, {{w[0-9]*}}, #16
Juergen Ributzkaa75cb112014-07-30 22:04:22 +000044define zeroext i32 @lsl_i32(i32 %a) {
45 %1 = shl i32 %a, 16
46 ret i32 %1
47}
48
Juergen Ributzka0e0b4c12014-08-21 23:06:07 +000049; CHECK-LABEL: lslv_i64
50; CHECK: lsl {{x[0-9]*}}, x0, x1
51define i64 @lslv_i64(i64 %a, i64 %b) {
52 %1 = shl i64 %a, %b
53 ret i64 %1
54}
55
Juergen Ributzkaa75cb112014-07-30 22:04:22 +000056; FIXME: This shouldn't use the variable shift version.
57; CHECK-LABEL: lsl_i64
Juergen Ributzka0e0b4c12014-08-21 23:06:07 +000058; CHECK: lsl {{x[0-9]*}}, {{x[0-9]*}}, {{x[0-9]*}}
Juergen Ributzkaa75cb112014-07-30 22:04:22 +000059define i64 @lsl_i64(i64 %a) {
60 %1 = shl i64 %a, 32
61 ret i64 %1
62}
63
Juergen Ributzka0e0b4c12014-08-21 23:06:07 +000064; CHECK-LABEL: lsrv_i8
65; CHECK: and [[REG1:w[0-9]+]], w0, #0xff
66; CHECK-NEXT: and [[REG2:w[0-9]+]], w1, #0xff
67; CHECK-NEXT: lsr [[REG3:w[0-9]+]], [[REG1]], [[REG2]]
68; CHECK-NEXT: and {{w[0-9]+}}, [[REG3]], #0xff
69define zeroext i8 @lsrv_i8(i8 %a, i8 %b) {
70 %1 = lshr i8 %a, %b
71 ret i8 %1
72}
73
Juergen Ributzkaa75cb112014-07-30 22:04:22 +000074; CHECK-LABEL: lsr_i8
Juergen Ributzka0e0b4c12014-08-21 23:06:07 +000075; CHECK: ubfx {{w[0-9]*}}, {{w[0-9]*}}, #4, #4
Juergen Ributzkaa75cb112014-07-30 22:04:22 +000076define zeroext i8 @lsr_i8(i8 %a) {
77 %1 = lshr i8 %a, 4
78 ret i8 %1
79}
80
Juergen Ributzka0e0b4c12014-08-21 23:06:07 +000081; CHECK-LABEL: lsrv_i16
82; CHECK: and [[REG1:w[0-9]+]], w0, #0xffff
83; CHECK-NEXT: and [[REG2:w[0-9]+]], w1, #0xffff
84; CHECK-NEXT: lsr [[REG3:w[0-9]+]], [[REG1]], [[REG2]]
85; CHECK-NEXT: and {{w[0-9]+}}, [[REG3]], #0xffff
86define zeroext i16 @lsrv_i16(i16 %a, i16 %b) {
87 %1 = lshr i16 %a, %b
88 ret i16 %1
89}
90
Juergen Ributzkaa75cb112014-07-30 22:04:22 +000091; CHECK-LABEL: lsr_i16
Juergen Ributzka0e0b4c12014-08-21 23:06:07 +000092; CHECK: ubfx {{w[0-9]*}}, {{w[0-9]*}}, #8, #8
Juergen Ributzkaa75cb112014-07-30 22:04:22 +000093define zeroext i16 @lsr_i16(i16 %a) {
94 %1 = lshr i16 %a, 8
95 ret i16 %1
96}
97
Juergen Ributzka0e0b4c12014-08-21 23:06:07 +000098; CHECK-LABEL: lsrv_i32
99; CHECK: lsr {{w[0-9]*}}, w0, w1
100define zeroext i32 @lsrv_i32(i32 %a, i32 %b) {
101 %1 = lshr i32 %a, %b
102 ret i32 %1
103}
104
Juergen Ributzkaa75cb112014-07-30 22:04:22 +0000105; CHECK-LABEL: lsr_i32
Juergen Ributzka0e0b4c12014-08-21 23:06:07 +0000106; CHECK: lsr {{w[0-9]*}}, {{w[0-9]*}}, #16
Juergen Ributzkaa75cb112014-07-30 22:04:22 +0000107define zeroext i32 @lsr_i32(i32 %a) {
108 %1 = lshr i32 %a, 16
109 ret i32 %1
110}
111
Juergen Ributzka0e0b4c12014-08-21 23:06:07 +0000112; CHECK-LABEL: lsrv_i64
113; CHECK: lsr {{x[0-9]*}}, x0, x1
114define i64 @lsrv_i64(i64 %a, i64 %b) {
115 %1 = lshr i64 %a, %b
116 ret i64 %1
117}
118
Juergen Ributzkaa75cb112014-07-30 22:04:22 +0000119; FIXME: This shouldn't use the variable shift version.
120; CHECK-LABEL: lsr_i64
Juergen Ributzka0e0b4c12014-08-21 23:06:07 +0000121; CHECK: lsr {{x[0-9]*}}, {{x[0-9]*}}, {{x[0-9]*}}
Juergen Ributzkaa75cb112014-07-30 22:04:22 +0000122define i64 @lsr_i64(i64 %a) {
123 %1 = lshr i64 %a, 32
124 ret i64 %1
125}
126
Juergen Ributzka0e0b4c12014-08-21 23:06:07 +0000127; CHECK-LABEL: asrv_i8
128; CHECK: sxtb [[REG1:w[0-9]+]], w0
129; CHECK-NEXT: and [[REG2:w[0-9]+]], w1, #0xff
130; CHECK-NEXT: asr [[REG3:w[0-9]+]], [[REG1]], [[REG2]]
131; CHECK-NEXT: and {{w[0-9]+}}, [[REG3]], #0xff
132define zeroext i8 @asrv_i8(i8 %a, i8 %b) {
133 %1 = ashr i8 %a, %b
134 ret i8 %1
135}
136
Juergen Ributzkaa75cb112014-07-30 22:04:22 +0000137; CHECK-LABEL: asr_i8
Juergen Ributzka0e0b4c12014-08-21 23:06:07 +0000138; CHECK: sbfx {{w[0-9]*}}, {{w[0-9]*}}, #4, #4
Juergen Ributzkaa75cb112014-07-30 22:04:22 +0000139define zeroext i8 @asr_i8(i8 %a) {
140 %1 = ashr i8 %a, 4
141 ret i8 %1
142}
143
Juergen Ributzka0e0b4c12014-08-21 23:06:07 +0000144; CHECK-LABEL: asrv_i16
145; CHECK: sxth [[REG1:w[0-9]+]], w0
146; CHECK-NEXT: and [[REG2:w[0-9]+]], w1, #0xffff
147; CHECK-NEXT: asr [[REG3:w[0-9]+]], [[REG1]], [[REG2]]
148; CHECK-NEXT: and {{w[0-9]+}}, [[REG3]], #0xffff
149define zeroext i16 @asrv_i16(i16 %a, i16 %b) {
150 %1 = ashr i16 %a, %b
151 ret i16 %1
152}
153
Juergen Ributzkaa75cb112014-07-30 22:04:22 +0000154; CHECK-LABEL: asr_i16
Juergen Ributzka0e0b4c12014-08-21 23:06:07 +0000155; CHECK: sbfx {{w[0-9]*}}, {{w[0-9]*}}, #8, #8
Juergen Ributzkaa75cb112014-07-30 22:04:22 +0000156define zeroext i16 @asr_i16(i16 %a) {
157 %1 = ashr i16 %a, 8
158 ret i16 %1
159}
160
Juergen Ributzka0e0b4c12014-08-21 23:06:07 +0000161; CHECK-LABEL: asrv_i32
162; CHECK: asr {{w[0-9]*}}, w0, w1
163define zeroext i32 @asrv_i32(i32 %a, i32 %b) {
164 %1 = ashr i32 %a, %b
165 ret i32 %1
166}
167
Juergen Ributzkaa75cb112014-07-30 22:04:22 +0000168; CHECK-LABEL: asr_i32
Juergen Ributzka0e0b4c12014-08-21 23:06:07 +0000169; CHECK: asr {{w[0-9]*}}, {{w[0-9]*}}, #16
Juergen Ributzkaa75cb112014-07-30 22:04:22 +0000170define zeroext i32 @asr_i32(i32 %a) {
171 %1 = ashr i32 %a, 16
172 ret i32 %1
173}
174
Juergen Ributzka0e0b4c12014-08-21 23:06:07 +0000175; CHECK-LABEL: asrv_i64
176; CHECK: asr {{x[0-9]*}}, x0, x1
177define i64 @asrv_i64(i64 %a, i64 %b) {
178 %1 = ashr i64 %a, %b
179 ret i64 %1
180}
181
Juergen Ributzkaa75cb112014-07-30 22:04:22 +0000182; FIXME: This shouldn't use the variable shift version.
183; CHECK-LABEL: asr_i64
Juergen Ributzka0e0b4c12014-08-21 23:06:07 +0000184; CHECK: asr {{x[0-9]*}}, {{x[0-9]*}}, {{x[0-9]*}}
Juergen Ributzkaa75cb112014-07-30 22:04:22 +0000185define i64 @asr_i64(i64 %a) {
186 %1 = ashr i64 %a, 32
187 ret i64 %1
188}
189
Juergen Ributzka53533e82014-08-04 21:49:51 +0000190; CHECK-LABEL: shift_test1
191; CHECK: ubfiz {{w[0-9]*}}, {{w[0-9]*}}, #4, #4
192; CHECK-NEXT: sbfx {{w[0-9]*}}, {{w[0-9]*}}, #4, #4
193define i32 @shift_test1(i8 %a) {
194 %1 = shl i8 %a, 4
195 %2 = ashr i8 %1, 4
196 %3 = sext i8 %2 to i32
197 ret i32 %3
198}
199