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