210b4ed9b9235f6a5b1d61d49bc84b59119610f5
[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: 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
23 define zeroext i16 @lslv_i16(i16 %a, i16 %b) {
24   %1 = shl i16 %a, %b
25   ret i16 %1
26 }
27
28 ; CHECK-LABEL: lsl_i16
29 ; CHECK:       ubfiz {{w[0-9]*}}, {{w[0-9]*}}, #8, #8
30 define zeroext i16 @lsl_i16(i16 %a) {
31   %1 = shl i16 %a, 8
32   ret i16 %1
33 }
34
35 ; CHECK-LABEL: lslv_i32
36 ; CHECK:       lsl {{w[0-9]*}}, w0, w1
37 define zeroext i32 @lslv_i32(i32 %a, i32 %b) {
38   %1 = shl i32 %a, %b
39   ret i32 %1
40 }
41
42 ; CHECK-LABEL: lsl_i32
43 ; CHECK:       lsl {{w[0-9]*}}, {{w[0-9]*}}, #16
44 define zeroext i32 @lsl_i32(i32 %a) {
45   %1 = shl i32 %a, 16
46   ret i32 %1
47 }
48
49 ; CHECK-LABEL: lslv_i64
50 ; CHECK:       lsl {{x[0-9]*}}, x0, x1
51 define i64 @lslv_i64(i64 %a, i64 %b) {
52   %1 = shl i64 %a, %b
53   ret i64 %1
54 }
55
56 ; FIXME: This shouldn't use the variable shift version.
57 ; CHECK-LABEL: lsl_i64
58 ; CHECK:       lsl {{x[0-9]*}}, {{x[0-9]*}}, {{x[0-9]*}}
59 define i64 @lsl_i64(i64 %a) {
60   %1 = shl i64 %a, 32
61   ret i64 %1
62 }
63
64 ; 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
69 define zeroext i8 @lsrv_i8(i8 %a, i8 %b) {
70   %1 = lshr i8 %a, %b
71   ret i8 %1
72 }
73
74 ; CHECK-LABEL: lsr_i8
75 ; CHECK:       ubfx {{w[0-9]*}}, {{w[0-9]*}}, #4, #4
76 define zeroext i8 @lsr_i8(i8 %a) {
77   %1 = lshr i8 %a, 4
78   ret i8 %1
79 }
80
81 ; 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
86 define zeroext i16 @lsrv_i16(i16 %a, i16 %b) {
87   %1 = lshr i16 %a, %b
88   ret i16 %1
89 }
90
91 ; CHECK-LABEL: lsr_i16
92 ; CHECK:       ubfx {{w[0-9]*}}, {{w[0-9]*}}, #8, #8
93 define zeroext i16 @lsr_i16(i16 %a) {
94   %1 = lshr i16 %a, 8
95   ret i16 %1
96 }
97
98 ; CHECK-LABEL: lsrv_i32
99 ; CHECK:       lsr {{w[0-9]*}}, w0, w1
100 define zeroext i32 @lsrv_i32(i32 %a, i32 %b) {
101   %1 = lshr i32 %a, %b
102   ret i32 %1
103 }
104
105 ; CHECK-LABEL: lsr_i32
106 ; CHECK:       lsr {{w[0-9]*}}, {{w[0-9]*}}, #16
107 define zeroext i32 @lsr_i32(i32 %a) {
108   %1 = lshr i32 %a, 16
109   ret i32 %1
110 }
111
112 ; CHECK-LABEL: lsrv_i64
113 ; CHECK:       lsr {{x[0-9]*}}, x0, x1
114 define i64 @lsrv_i64(i64 %a, i64 %b) {
115   %1 = lshr i64 %a, %b
116   ret i64 %1
117 }
118
119 ; FIXME: This shouldn't use the variable shift version.
120 ; CHECK-LABEL: lsr_i64
121 ; CHECK:       lsr {{x[0-9]*}}, {{x[0-9]*}}, {{x[0-9]*}}
122 define i64 @lsr_i64(i64 %a) {
123   %1 = lshr i64 %a, 32
124   ret i64 %1
125 }
126
127 ; 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
132 define zeroext i8 @asrv_i8(i8 %a, i8 %b) {
133   %1 = ashr i8 %a, %b
134   ret i8 %1
135 }
136
137 ; CHECK-LABEL: asr_i8
138 ; CHECK:       sbfx {{w[0-9]*}}, {{w[0-9]*}}, #4, #4
139 define zeroext i8 @asr_i8(i8 %a) {
140   %1 = ashr i8 %a, 4
141   ret i8 %1
142 }
143
144 ; 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
149 define zeroext i16 @asrv_i16(i16 %a, i16 %b) {
150   %1 = ashr i16 %a, %b
151   ret i16 %1
152 }
153
154 ; CHECK-LABEL: asr_i16
155 ; CHECK:       sbfx {{w[0-9]*}}, {{w[0-9]*}}, #8, #8
156 define zeroext i16 @asr_i16(i16 %a) {
157   %1 = ashr i16 %a, 8
158   ret i16 %1
159 }
160
161 ; CHECK-LABEL: asrv_i32
162 ; CHECK:       asr {{w[0-9]*}}, w0, w1
163 define zeroext i32 @asrv_i32(i32 %a, i32 %b) {
164   %1 = ashr i32 %a, %b
165   ret i32 %1
166 }
167
168 ; CHECK-LABEL: asr_i32
169 ; CHECK:       asr {{w[0-9]*}}, {{w[0-9]*}}, #16
170 define zeroext i32 @asr_i32(i32 %a) {
171   %1 = ashr i32 %a, 16
172   ret i32 %1
173 }
174
175 ; CHECK-LABEL: asrv_i64
176 ; CHECK:       asr {{x[0-9]*}}, x0, x1
177 define i64 @asrv_i64(i64 %a, i64 %b) {
178   %1 = ashr i64 %a, %b
179   ret i64 %1
180 }
181
182 ; FIXME: This shouldn't use the variable shift version.
183 ; CHECK-LABEL: asr_i64
184 ; CHECK:       asr {{x[0-9]*}}, {{x[0-9]*}}, {{x[0-9]*}}
185 define i64 @asr_i64(i64 %a) {
186   %1 = ashr i64 %a, 32
187   ret i64 %1
188 }
189
190 ; 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
193 define 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