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 7 declare void @useIntPtr(%struct4bytes*) 8 declare void @useLong(i64) 9 declare void @usePtr(%struct8bytes8align*) 10 11 ; a -> r0 12 ; b -> r1..r3 13 ; c -> sp+0..sp+7 14 define 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 32 define 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 49 define 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 66 define 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 86 define 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 104 define 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