1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=arm-linux-gnueabihf < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker%struct4bytes = type { i32 } 4*9880d681SAndroid Build Coastguard Worker%struct8bytes8align = type { i64 } 5*9880d681SAndroid Build Coastguard Worker%struct12bytes = type { i32, i32, i32 } 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Workerdeclare void @useIntPtr(%struct4bytes*) 8*9880d681SAndroid Build Coastguard Workerdeclare void @useLong(i64) 9*9880d681SAndroid Build Coastguard Workerdeclare void @usePtr(%struct8bytes8align*) 10*9880d681SAndroid Build Coastguard Worker 11*9880d681SAndroid Build Coastguard Worker; a -> r0 12*9880d681SAndroid Build Coastguard Worker; b -> r1..r3 13*9880d681SAndroid Build Coastguard Worker; c -> sp+0..sp+7 14*9880d681SAndroid Build Coastguard Workerdefine void @foo1(i32 %a, %struct12bytes* byval %b, i64 %c) { 15*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: foo1 16*9880d681SAndroid Build Coastguard Worker; CHECK: sub sp, sp, #12 17*9880d681SAndroid Build Coastguard Worker; CHECK: push {r11, lr} 18*9880d681SAndroid Build Coastguard Worker; CHECK: sub sp, sp, #4 19*9880d681SAndroid Build Coastguard Worker; CHECK: add [[SCRATCH:r[0-9]+]], sp, #12 20*9880d681SAndroid Build Coastguard Worker; CHECK: stm [[SCRATCH]], {r1, r2, r3} 21*9880d681SAndroid Build Coastguard Worker; CHECK: ldr r0, [sp, #24] 22*9880d681SAndroid Build Coastguard Worker; CHECK: ldr r1, [sp, #28] 23*9880d681SAndroid Build Coastguard Worker; CHECK: bl useLong 24*9880d681SAndroid Build Coastguard Worker; CHECK: pop {r11, lr} 25*9880d681SAndroid Build Coastguard Worker; CHECK: add sp, sp, #12 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Worker call void @useLong(i64 %c) 28*9880d681SAndroid Build Coastguard Worker ret void 29*9880d681SAndroid Build Coastguard Worker} 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Worker; a -> r0 32*9880d681SAndroid Build Coastguard Worker; b -> r2..r3 33*9880d681SAndroid Build Coastguard Workerdefine void @foo2(i32 %a, %struct8bytes8align* byval %b) { 34*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: foo2 35*9880d681SAndroid Build Coastguard Worker; CHECK: sub sp, sp, #8 36*9880d681SAndroid Build Coastguard Worker; CHECK: push {r11, lr} 37*9880d681SAndroid Build Coastguard Worker; CHECK: add r0, sp, #8 38*9880d681SAndroid Build Coastguard Worker; CHECK: str r3, [sp, #12] 39*9880d681SAndroid Build Coastguard Worker; CHECK: str r2, [sp, #8] 40*9880d681SAndroid Build Coastguard Worker; CHECK: bl usePtr 41*9880d681SAndroid Build Coastguard Worker; CHECK: pop {r11, lr} 42*9880d681SAndroid Build Coastguard Worker; CHECK: add sp, sp, #8 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Worker call void @usePtr(%struct8bytes8align* %b) 45*9880d681SAndroid Build Coastguard Worker ret void 46*9880d681SAndroid Build Coastguard Worker} 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Worker; a -> r0..r1 49*9880d681SAndroid Build Coastguard Worker; b -> r2 50*9880d681SAndroid Build Coastguard Workerdefine void @foo3(%struct8bytes8align* byval %a, %struct4bytes* byval %b) { 51*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: foo3 52*9880d681SAndroid Build Coastguard Worker; CHECK: sub sp, sp, #16 53*9880d681SAndroid Build Coastguard Worker; CHECK: push {r11, lr} 54*9880d681SAndroid Build Coastguard Worker; CHECK: add [[SCRATCH:r[0-9]+]], sp, #8 55*9880d681SAndroid Build Coastguard Worker; CHECK: stm [[SCRATCH]], {r0, r1, r2} 56*9880d681SAndroid Build Coastguard Worker; CHECK: add r0, sp, #8 57*9880d681SAndroid Build Coastguard Worker; CHECK: bl usePtr 58*9880d681SAndroid Build Coastguard Worker; CHECK: pop {r11, lr} 59*9880d681SAndroid Build Coastguard Worker; CHECK: add sp, sp, #16 60*9880d681SAndroid Build Coastguard Worker 61*9880d681SAndroid Build Coastguard Worker call void @usePtr(%struct8bytes8align* %a) 62*9880d681SAndroid Build Coastguard Worker ret void 63*9880d681SAndroid Build Coastguard Worker} 64*9880d681SAndroid Build Coastguard Worker 65*9880d681SAndroid Build Coastguard Worker; a -> r0 66*9880d681SAndroid Build Coastguard Worker; b -> r2..r3 67*9880d681SAndroid Build Coastguard Workerdefine void @foo4(%struct4bytes* byval %a, %struct8bytes8align* byval %b) { 68*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: foo4 69*9880d681SAndroid Build Coastguard Worker; CHECK: sub sp, sp, #16 70*9880d681SAndroid Build Coastguard Worker; CHECK: push {r11, lr} 71*9880d681SAndroid Build Coastguard Worker; CHECK: str r0, [sp, #8] 72*9880d681SAndroid Build Coastguard Worker; CHECK: add r0, sp, #16 73*9880d681SAndroid Build Coastguard Worker; CHECK: str r3, [sp, #20] 74*9880d681SAndroid Build Coastguard Worker; CHECK: str r2, [sp, #16] 75*9880d681SAndroid Build Coastguard Worker; CHECK: bl usePtr 76*9880d681SAndroid Build Coastguard Worker; CHECK: pop {r11, lr} 77*9880d681SAndroid Build Coastguard Worker; CHECK: add sp, sp, #16 78*9880d681SAndroid Build Coastguard Worker; CHECK: mov pc, lr 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Worker call void @usePtr(%struct8bytes8align* %b) 81*9880d681SAndroid Build Coastguard Worker ret void 82*9880d681SAndroid Build Coastguard Worker} 83*9880d681SAndroid Build Coastguard Worker 84*9880d681SAndroid Build Coastguard Worker; a -> r0..r1 85*9880d681SAndroid Build Coastguard Worker; b -> r2 86*9880d681SAndroid Build Coastguard Worker; c -> r3 87*9880d681SAndroid Build Coastguard Workerdefine void @foo5(%struct8bytes8align* byval %a, %struct4bytes* byval %b, %struct4bytes* byval %c) { 88*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: foo5 89*9880d681SAndroid Build Coastguard Worker; CHECK: sub sp, sp, #16 90*9880d681SAndroid Build Coastguard Worker; CHECK: push {r11, lr} 91*9880d681SAndroid Build Coastguard Worker; CHECK: add [[SCRATCH:r[0-9]+]], sp, #8 92*9880d681SAndroid Build Coastguard Worker; CHECK: stm [[SCRATCH]], {r0, r1, r2, r3} 93*9880d681SAndroid Build Coastguard Worker; CHECK: add r0, sp, #8 94*9880d681SAndroid Build Coastguard Worker; CHECK: bl usePtr 95*9880d681SAndroid Build Coastguard Worker; CHECK: pop {r11, lr} 96*9880d681SAndroid Build Coastguard Worker; CHECK: add sp, sp, #16 97*9880d681SAndroid Build Coastguard Worker; CHECK: mov pc, lr 98*9880d681SAndroid Build Coastguard Worker 99*9880d681SAndroid Build Coastguard Worker call void @usePtr(%struct8bytes8align* %a) 100*9880d681SAndroid Build Coastguard Worker ret void 101*9880d681SAndroid Build Coastguard Worker} 102*9880d681SAndroid Build Coastguard Worker 103*9880d681SAndroid Build Coastguard Worker; a..c -> r0..r2 104*9880d681SAndroid Build Coastguard Worker; d -> sp+0..sp+7 105*9880d681SAndroid Build Coastguard Workerdefine void @foo6(i32 %a, i32 %b, i32 %c, %struct8bytes8align* byval %d) { 106*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: foo6 107*9880d681SAndroid Build Coastguard Worker; CHECK: push {r11, lr} 108*9880d681SAndroid Build Coastguard Worker; CHECK: add r0, sp, #8 109*9880d681SAndroid Build Coastguard Worker; CHECK: bl usePtr 110*9880d681SAndroid Build Coastguard Worker; CHECK: pop {r11, lr} 111*9880d681SAndroid Build Coastguard Worker; CHECK: mov pc, lr 112*9880d681SAndroid Build Coastguard Worker 113*9880d681SAndroid Build Coastguard Worker call void @usePtr(%struct8bytes8align* %d) 114*9880d681SAndroid Build Coastguard Worker ret void 115*9880d681SAndroid Build Coastguard Worker} 116