[ARM] Adjust how NEON shifts are lowered
[llvm-core.git] / test / CodeGen / ARM / shift-i64.ll
blob33e0ba1457e72b8abe91a7a89903ab1f113250a9
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=arm-eabi %s -o - | FileCheck %s
3 ; RUN: llc -mtriple=armv6m-eabi %s -o - | FileCheck %s --check-prefix=EXPAND
5 define i64 @test_shl(i64 %val, i64 %amt) {
6 ; CHECK-LABEL: test_shl:
7 ; CHECK:       @ %bb.0:
8 ; CHECK-NEXT:    rsb r3, r2, #32
9 ; CHECK-NEXT:    lsr r3, r0, r3
10 ; CHECK-NEXT:    orr r1, r3, r1, lsl r2
11 ; CHECK-NEXT:    subs r3, r2, #32
12 ; CHECK-NEXT:    lslpl r1, r0, r3
13 ; CHECK-NEXT:    lsl r0, r0, r2
14 ; CHECK-NEXT:    movpl r0, #0
15 ; CHECK-NEXT:    mov pc, lr
17 ; EXPAND-LABEL: test_shl:
18 ; EXPAND:       @ %bb.0:
19 ; EXPAND-NEXT:    .save {r7, lr}
20 ; EXPAND-NEXT:    push {r7, lr}
21 ; EXPAND-NEXT:    bl __aeabi_llsl
22 ; EXPAND-NEXT:    pop {r7, pc}
23   %res = shl i64 %val, %amt
24   ret i64 %res
27 ; Explanation for lshr is pretty much the reverse of shl.
28 define i64 @test_lshr(i64 %val, i64 %amt) {
29 ; CHECK-LABEL: test_lshr:
30 ; CHECK:       @ %bb.0:
31 ; CHECK-NEXT:    rsb r3, r2, #32
32 ; CHECK-NEXT:    lsr r0, r0, r2
33 ; CHECK-NEXT:    orr r0, r0, r1, lsl r3
34 ; CHECK-NEXT:    subs r3, r2, #32
35 ; CHECK-NEXT:    lsrpl r0, r1, r3
36 ; CHECK-NEXT:    lsr r1, r1, r2
37 ; CHECK-NEXT:    movpl r1, #0
38 ; CHECK-NEXT:    mov pc, lr
40 ; EXPAND-LABEL: test_lshr:
41 ; EXPAND:       @ %bb.0:
42 ; EXPAND-NEXT:    .save {r7, lr}
43 ; EXPAND-NEXT:    push {r7, lr}
44 ; EXPAND-NEXT:    bl __aeabi_llsr
45 ; EXPAND-NEXT:    pop {r7, pc}
46   %res = lshr i64 %val, %amt
47   ret i64 %res
50 ; One minor difference for ashr: the high bits must be "hi >> 31" if the shift
51 ; amount is large to get the right sign bit.
52 define i64 @test_ashr(i64 %val, i64 %amt) {
53 ; CHECK-LABEL: test_ashr:
54 ; CHECK:       @ %bb.0:
55 ; CHECK-NEXT:    asr r3, r1, r2
56 ; CHECK-NEXT:    subs r12, r2, #32
57 ; CHECK-NEXT:    lsr r0, r0, r2
58 ; CHECK-NEXT:    rsb r2, r2, #32
59 ; CHECK-NEXT:    asrpl r3, r1, #31
60 ; CHECK-NEXT:    orr r0, r0, r1, lsl r2
61 ; CHECK-NEXT:    asrpl r0, r1, r12
62 ; CHECK-NEXT:    mov r1, r3
63 ; CHECK-NEXT:    mov pc, lr
65 ; EXPAND-LABEL: test_ashr:
66 ; EXPAND:       @ %bb.0:
67 ; EXPAND-NEXT:    .save {r7, lr}
68 ; EXPAND-NEXT:    push {r7, lr}
69 ; EXPAND-NEXT:    bl __aeabi_lasr
70 ; EXPAND-NEXT:    pop {r7, pc}
71   %res = ashr i64 %val, %amt
72   ret i64 %res