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