Home | History | Annotate | Download | only in ARM
      1 ; RUN: llc < %s -mtriple=thumbv6-apple-darwin | FileCheck %s
      2 
      3 ; Normal load from SP
      4 define void @SP(i32 %i) nounwind uwtable ssp {
      5 entry:
      6 ; CHECK: @SP
      7 ; CHECK: push	{r7, lr}
      8 ; CHECK-NEXT: mov r7, sp
      9 ; CHECK-NEXT: sub sp, #4
     10 ; CHECK-NEXT: mov r1, sp 
     11 ; CHECK-NEXT: str r0, [r1]
     12 ; CHECK-NEXT: mov r0, sp
     13 ; CHECK-NEXT: blx _SP_
     14 ; CHECK-NEXT: add sp, #4
     15 ; CHECK-NEXT: pop {r7, pc}
     16   %i.addr = alloca i32, align 4
     17   store i32 %i, i32* %i.addr, align 4
     18   call void @SP_(i32* %i.addr)
     19   ret void
     20 }
     21 
     22 declare void @SP_(i32*)
     23 
     24 ; Dynamic stack realignment
     25 define void @FP(double %a) nounwind uwtable ssp {
     26 entry:
     27 ; CHECK: mov r4, sp
     28 ; CHECK-NEXT: lsrs r4, r4, #3
     29 ; CHECK-NEXT: lsls r4, r4, #3
     30 ; CHECK-NEXT: mov sp, r4
     31 ; Restore from FP
     32 ; CHECK: subs r4, r7, #4
     33 ; CHECK: mov sp, r4
     34   %a.addr = alloca double, align 8
     35   store double %a, double* %a.addr, align 8
     36   call void @FP_(double* %a.addr)
     37   ret void
     38 }
     39 
     40 declare void @FP_(double*)
     41