[ARM] Adjust how NEON shifts are lowered
[llvm-core.git] / test / CodeGen / X86 / fast-isel-shift.ll
blob243bb4ad95292d61fa3553adef15709a6b1090b9
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -fast-isel -fast-isel-abort=1 -mtriple=x86_64-apple-darwin10 | FileCheck %s
4 define i8 @shl_i8(i8 %a, i8 %b) {
5 ; CHECK-LABEL: shl_i8:
6 ; CHECK:       ## %bb.0:
7 ; CHECK-NEXT:    movl %esi, %ecx
8 ; CHECK-NEXT:    movl %edi, %eax
9 ; CHECK-NEXT:    ## kill: def $cl killed $cl killed $ecx
10 ; CHECK-NEXT:    shlb %cl, %al
11 ; CHECK-NEXT:    ## kill: def $al killed $al killed $eax
12 ; CHECK-NEXT:    retq
13   %c = shl i8 %a, %b
14   ret i8 %c
17 define i16 @shl_i16(i16 %a, i16 %b) {
18 ; CHECK-LABEL: shl_i16:
19 ; CHECK:       ## %bb.0:
20 ; CHECK-NEXT:    movl %esi, %ecx
21 ; CHECK-NEXT:    movl %edi, %eax
22 ; CHECK-NEXT:    ## kill: def $cx killed $cx killed $ecx
23 ; CHECK-NEXT:    ## kill: def $cl killed $cx
24 ; CHECK-NEXT:    shlw %cl, %ax
25 ; CHECK-NEXT:    ## kill: def $ax killed $ax killed $eax
26 ; CHECK-NEXT:    retq
27   %c = shl i16 %a, %b
28   ret i16 %c
31 define i32 @shl_i32(i32 %a, i32 %b) {
32 ; CHECK-LABEL: shl_i32:
33 ; CHECK:       ## %bb.0:
34 ; CHECK-NEXT:    movl %esi, %ecx
35 ; CHECK-NEXT:    movl %edi, %eax
36 ; CHECK-NEXT:    ## kill: def $cl killed $ecx
37 ; CHECK-NEXT:    shll %cl, %eax
38 ; CHECK-NEXT:    retq
39   %c = shl i32 %a, %b
40   ret i32 %c
43 define i64 @shl_i64(i64 %a, i64 %b) {
44 ; CHECK-LABEL: shl_i64:
45 ; CHECK:       ## %bb.0:
46 ; CHECK-NEXT:    movq %rsi, %rcx
47 ; CHECK-NEXT:    movq %rdi, %rax
48 ; CHECK-NEXT:    ## kill: def $cl killed $rcx
49 ; CHECK-NEXT:    shlq %cl, %rax
50 ; CHECK-NEXT:    retq
51   %c = shl i64 %a, %b
52   ret i64 %c
55 define i8 @lshr_i8(i8 %a, i8 %b) {
56 ; CHECK-LABEL: lshr_i8:
57 ; CHECK:       ## %bb.0:
58 ; CHECK-NEXT:    movl %esi, %ecx
59 ; CHECK-NEXT:    movl %edi, %eax
60 ; CHECK-NEXT:    ## kill: def $cl killed $cl killed $ecx
61 ; CHECK-NEXT:    shrb %cl, %al
62 ; CHECK-NEXT:    ## kill: def $al killed $al killed $eax
63 ; CHECK-NEXT:    retq
64   %c = lshr i8 %a, %b
65   ret i8 %c
68 define i16 @lshr_i16(i16 %a, i16 %b) {
69 ; CHECK-LABEL: lshr_i16:
70 ; CHECK:       ## %bb.0:
71 ; CHECK-NEXT:    movl %esi, %ecx
72 ; CHECK-NEXT:    movl %edi, %eax
73 ; CHECK-NEXT:    ## kill: def $cx killed $cx killed $ecx
74 ; CHECK-NEXT:    ## kill: def $cl killed $cx
75 ; CHECK-NEXT:    shrw %cl, %ax
76 ; CHECK-NEXT:    ## kill: def $ax killed $ax killed $eax
77 ; CHECK-NEXT:    retq
78   %c = lshr i16 %a, %b
79   ret i16 %c
82 define i32 @lshr_i32(i32 %a, i32 %b) {
83 ; CHECK-LABEL: lshr_i32:
84 ; CHECK:       ## %bb.0:
85 ; CHECK-NEXT:    movl %esi, %ecx
86 ; CHECK-NEXT:    movl %edi, %eax
87 ; CHECK-NEXT:    ## kill: def $cl killed $ecx
88 ; CHECK-NEXT:    shrl %cl, %eax
89 ; CHECK-NEXT:    retq
90   %c = lshr i32 %a, %b
91   ret i32 %c
94 define i64 @lshr_i64(i64 %a, i64 %b) {
95 ; CHECK-LABEL: lshr_i64:
96 ; CHECK:       ## %bb.0:
97 ; CHECK-NEXT:    movq %rsi, %rcx
98 ; CHECK-NEXT:    movq %rdi, %rax
99 ; CHECK-NEXT:    ## kill: def $cl killed $rcx
100 ; CHECK-NEXT:    shrq %cl, %rax
101 ; CHECK-NEXT:    retq
102   %c = lshr i64 %a, %b
103   ret i64 %c
106 define i8 @ashr_i8(i8 %a, i8 %b) {
107 ; CHECK-LABEL: ashr_i8:
108 ; CHECK:       ## %bb.0:
109 ; CHECK-NEXT:    movl %esi, %ecx
110 ; CHECK-NEXT:    movl %edi, %eax
111 ; CHECK-NEXT:    ## kill: def $cl killed $cl killed $ecx
112 ; CHECK-NEXT:    sarb %cl, %al
113 ; CHECK-NEXT:    ## kill: def $al killed $al killed $eax
114 ; CHECK-NEXT:    retq
115   %c = ashr i8 %a, %b
116   ret i8 %c
119 define i16 @ashr_i16(i16 %a, i16 %b) {
120 ; CHECK-LABEL: ashr_i16:
121 ; CHECK:       ## %bb.0:
122 ; CHECK-NEXT:    movl %esi, %ecx
123 ; CHECK-NEXT:    movl %edi, %eax
124 ; CHECK-NEXT:    ## kill: def $cx killed $cx killed $ecx
125 ; CHECK-NEXT:    ## kill: def $cl killed $cx
126 ; CHECK-NEXT:    sarw %cl, %ax
127 ; CHECK-NEXT:    ## kill: def $ax killed $ax killed $eax
128 ; CHECK-NEXT:    retq
129   %c = ashr i16 %a, %b
130   ret i16 %c
133 define i32 @ashr_i32(i32 %a, i32 %b) {
134 ; CHECK-LABEL: ashr_i32:
135 ; CHECK:       ## %bb.0:
136 ; CHECK-NEXT:    movl %esi, %ecx
137 ; CHECK-NEXT:    movl %edi, %eax
138 ; CHECK-NEXT:    ## kill: def $cl killed $ecx
139 ; CHECK-NEXT:    sarl %cl, %eax
140 ; CHECK-NEXT:    retq
141   %c = ashr i32 %a, %b
142   ret i32 %c
145 define i64 @ashr_i64(i64 %a, i64 %b) {
146 ; CHECK-LABEL: ashr_i64:
147 ; CHECK:       ## %bb.0:
148 ; CHECK-NEXT:    movq %rsi, %rcx
149 ; CHECK-NEXT:    movq %rdi, %rax
150 ; CHECK-NEXT:    ## kill: def $cl killed $rcx
151 ; CHECK-NEXT:    sarq %cl, %rax
152 ; CHECK-NEXT:    retq
153   %c = ashr i64 %a, %b
154   ret i64 %c
157 define i8 @shl_imm1_i8(i8 %a) {
158 ; CHECK-LABEL: shl_imm1_i8:
159 ; CHECK:       ## %bb.0:
160 ; CHECK-NEXT:    ## kill: def $edi killed $edi def $rdi
161 ; CHECK-NEXT:    leal (,%rdi,2), %eax
162 ; CHECK-NEXT:    ## kill: def $al killed $al killed $eax
163 ; CHECK-NEXT:    retq
164   %c = shl i8 %a, 1
165   ret i8 %c
168 define i16 @shl_imm1_i16(i16 %a) {
169 ; CHECK-LABEL: shl_imm1_i16:
170 ; CHECK:       ## %bb.0:
171 ; CHECK-NEXT:    ## kill: def $edi killed $edi def $rdi
172 ; CHECK-NEXT:    leal (,%rdi,2), %eax
173 ; CHECK-NEXT:    ## kill: def $ax killed $ax killed $eax
174 ; CHECK-NEXT:    retq
175   %c = shl i16 %a, 1
176   ret i16 %c
179 define i32 @shl_imm1_i32(i32 %a) {
180 ; CHECK-LABEL: shl_imm1_i32:
181 ; CHECK:       ## %bb.0:
182 ; CHECK-NEXT:    ## kill: def $edi killed $edi def $rdi
183 ; CHECK-NEXT:    leal (,%rdi,2), %eax
184 ; CHECK-NEXT:    retq
185   %c = shl i32 %a, 1
186   ret i32 %c
189 define i64 @shl_imm1_i64(i64 %a) {
190 ; CHECK-LABEL: shl_imm1_i64:
191 ; CHECK:       ## %bb.0:
192 ; CHECK-NEXT:    leaq (,%rdi,2), %rax
193 ; CHECK-NEXT:    retq
194   %c = shl i64 %a, 1
195   ret i64 %c
198 define i8 @lshr_imm1_i8(i8 %a) {
199 ; CHECK-LABEL: lshr_imm1_i8:
200 ; CHECK:       ## %bb.0:
201 ; CHECK-NEXT:    movl %edi, %eax
202 ; CHECK-NEXT:    shrb $1, %al
203 ; CHECK-NEXT:    ## kill: def $al killed $al killed $eax
204 ; CHECK-NEXT:    retq
205   %c = lshr i8 %a, 1
206   ret i8 %c
209 define i16 @lshr_imm1_i16(i16 %a) {
210 ; CHECK-LABEL: lshr_imm1_i16:
211 ; CHECK:       ## %bb.0:
212 ; CHECK-NEXT:    movl %edi, %eax
213 ; CHECK-NEXT:    shrw $1, %ax
214 ; CHECK-NEXT:    ## kill: def $ax killed $ax killed $eax
215 ; CHECK-NEXT:    retq
216   %c = lshr i16 %a, 1
217   ret i16 %c
220 define i32 @lshr_imm1_i32(i32 %a) {
221 ; CHECK-LABEL: lshr_imm1_i32:
222 ; CHECK:       ## %bb.0:
223 ; CHECK-NEXT:    movl %edi, %eax
224 ; CHECK-NEXT:    shrl $1, %eax
225 ; CHECK-NEXT:    retq
226   %c = lshr i32 %a, 1
227   ret i32 %c
230 define i64 @lshr_imm1_i64(i64 %a) {
231 ; CHECK-LABEL: lshr_imm1_i64:
232 ; CHECK:       ## %bb.0:
233 ; CHECK-NEXT:    movq %rdi, %rax
234 ; CHECK-NEXT:    shrq $1, %rax
235 ; CHECK-NEXT:    retq
236   %c = lshr i64 %a, 1
237   ret i64 %c
240 define i8 @ashr_imm1_i8(i8 %a) {
241 ; CHECK-LABEL: ashr_imm1_i8:
242 ; CHECK:       ## %bb.0:
243 ; CHECK-NEXT:    movl %edi, %eax
244 ; CHECK-NEXT:    sarb $1, %al
245 ; CHECK-NEXT:    ## kill: def $al killed $al killed $eax
246 ; CHECK-NEXT:    retq
247   %c = ashr i8 %a, 1
248   ret i8 %c
251 define i16 @ashr_imm1_i16(i16 %a) {
252 ; CHECK-LABEL: ashr_imm1_i16:
253 ; CHECK:       ## %bb.0:
254 ; CHECK-NEXT:    movl %edi, %eax
255 ; CHECK-NEXT:    sarw $1, %ax
256 ; CHECK-NEXT:    ## kill: def $ax killed $ax killed $eax
257 ; CHECK-NEXT:    retq
258   %c = ashr i16 %a, 1
259   ret i16 %c
262 define i32 @ashr_imm1_i32(i32 %a) {
263 ; CHECK-LABEL: ashr_imm1_i32:
264 ; CHECK:       ## %bb.0:
265 ; CHECK-NEXT:    movl %edi, %eax
266 ; CHECK-NEXT:    sarl $1, %eax
267 ; CHECK-NEXT:    retq
268   %c = ashr i32 %a, 1
269   ret i32 %c
272 define i64 @ashr_imm1_i64(i64 %a) {
273 ; CHECK-LABEL: ashr_imm1_i64:
274 ; CHECK:       ## %bb.0:
275 ; CHECK-NEXT:    movq %rdi, %rax
276 ; CHECK-NEXT:    sarq $1, %rax
277 ; CHECK-NEXT:    retq
278   %c = ashr i64 %a, 1
279   ret i64 %c
282 define i8 @shl_imm4_i8(i8 %a) {
283 ; CHECK-LABEL: shl_imm4_i8:
284 ; CHECK:       ## %bb.0:
285 ; CHECK-NEXT:    movl %edi, %eax
286 ; CHECK-NEXT:    shlb $4, %al
287 ; CHECK-NEXT:    ## kill: def $al killed $al killed $eax
288 ; CHECK-NEXT:    retq
289   %c = shl i8 %a, 4
290   ret i8 %c
293 define i16 @shl_imm4_i16(i16 %a) {
294 ; CHECK-LABEL: shl_imm4_i16:
295 ; CHECK:       ## %bb.0:
296 ; CHECK-NEXT:    movl %edi, %eax
297 ; CHECK-NEXT:    shlw $4, %ax
298 ; CHECK-NEXT:    ## kill: def $ax killed $ax killed $eax
299 ; CHECK-NEXT:    retq
300   %c = shl i16 %a, 4
301   ret i16 %c
304 define i32 @shl_imm4_i32(i32 %a) {
305 ; CHECK-LABEL: shl_imm4_i32:
306 ; CHECK:       ## %bb.0:
307 ; CHECK-NEXT:    movl %edi, %eax
308 ; CHECK-NEXT:    shll $4, %eax
309 ; CHECK-NEXT:    retq
310   %c = shl i32 %a, 4
311   ret i32 %c
314 define i64 @shl_imm4_i64(i64 %a) {
315 ; CHECK-LABEL: shl_imm4_i64:
316 ; CHECK:       ## %bb.0:
317 ; CHECK-NEXT:    movq %rdi, %rax
318 ; CHECK-NEXT:    shlq $4, %rax
319 ; CHECK-NEXT:    retq
320   %c = shl i64 %a, 4
321   ret i64 %c
324 define i8 @lshr_imm4_i8(i8 %a) {
325 ; CHECK-LABEL: lshr_imm4_i8:
326 ; CHECK:       ## %bb.0:
327 ; CHECK-NEXT:    movl %edi, %eax
328 ; CHECK-NEXT:    shrb $4, %al
329 ; CHECK-NEXT:    ## kill: def $al killed $al killed $eax
330 ; CHECK-NEXT:    retq
331   %c = lshr i8 %a, 4
332   ret i8 %c
335 define i16 @lshr_imm4_i16(i16 %a) {
336 ; CHECK-LABEL: lshr_imm4_i16:
337 ; CHECK:       ## %bb.0:
338 ; CHECK-NEXT:    movl %edi, %eax
339 ; CHECK-NEXT:    shrw $4, %ax
340 ; CHECK-NEXT:    ## kill: def $ax killed $ax killed $eax
341 ; CHECK-NEXT:    retq
342   %c = lshr i16 %a, 4
343   ret i16 %c
346 define i32 @lshr_imm4_i32(i32 %a) {
347 ; CHECK-LABEL: lshr_imm4_i32:
348 ; CHECK:       ## %bb.0:
349 ; CHECK-NEXT:    movl %edi, %eax
350 ; CHECK-NEXT:    shrl $4, %eax
351 ; CHECK-NEXT:    retq
352   %c = lshr i32 %a, 4
353   ret i32 %c
356 define i64 @lshr_imm4_i64(i64 %a) {
357 ; CHECK-LABEL: lshr_imm4_i64:
358 ; CHECK:       ## %bb.0:
359 ; CHECK-NEXT:    movq %rdi, %rax
360 ; CHECK-NEXT:    shrq $4, %rax
361 ; CHECK-NEXT:    retq
362   %c = lshr i64 %a, 4
363   ret i64 %c
366 define i8 @ashr_imm4_i8(i8 %a) {
367 ; CHECK-LABEL: ashr_imm4_i8:
368 ; CHECK:       ## %bb.0:
369 ; CHECK-NEXT:    movl %edi, %eax
370 ; CHECK-NEXT:    sarb $4, %al
371 ; CHECK-NEXT:    ## kill: def $al killed $al killed $eax
372 ; CHECK-NEXT:    retq
373   %c = ashr i8 %a, 4
374   ret i8 %c
377 define i16 @ashr_imm4_i16(i16 %a) {
378 ; CHECK-LABEL: ashr_imm4_i16:
379 ; CHECK:       ## %bb.0:
380 ; CHECK-NEXT:    movl %edi, %eax
381 ; CHECK-NEXT:    sarw $4, %ax
382 ; CHECK-NEXT:    ## kill: def $ax killed $ax killed $eax
383 ; CHECK-NEXT:    retq
384   %c = ashr i16 %a, 4
385   ret i16 %c
388 define i32 @ashr_imm4_i32(i32 %a) {
389 ; CHECK-LABEL: ashr_imm4_i32:
390 ; CHECK:       ## %bb.0:
391 ; CHECK-NEXT:    movl %edi, %eax
392 ; CHECK-NEXT:    sarl $4, %eax
393 ; CHECK-NEXT:    retq
394   %c = ashr i32 %a, 4
395   ret i32 %c
398 define i64 @ashr_imm4_i64(i64 %a) {
399 ; CHECK-LABEL: ashr_imm4_i64:
400 ; CHECK:       ## %bb.0:
401 ; CHECK-NEXT:    movq %rdi, %rax
402 ; CHECK-NEXT:    sarq $4, %rax
403 ; CHECK-NEXT:    retq
404   %c = ashr i64 %a, 4
405   ret i64 %c
408 ; Make sure we don't crash on out of bounds i8 shifts.
409 define i8 @PR36731(i8 %a) {
410 ; CHECK-LABEL: PR36731:
411 ; CHECK:       ## %bb.0:
412 ; CHECK-NEXT:    movl %edi, %eax
413 ; CHECK-NEXT:    movb $255, %cl
414 ; CHECK-NEXT:    shlb %cl, %al
415 ; CHECK-NEXT:    ## kill: def $al killed $al killed $eax
416 ; CHECK-NEXT:    retq
417   %b = shl i8 %a, -1
418   ret i8 %b