blob: 054a45ced1d0dba7e90be2561881727226200609 [file] [log] [blame]
Oliver Stannardd55e1152014-03-05 15:25:27 +00001; 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 tail 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 tail 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 tail 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 tail 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 tail 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 tail call void @usePtr(%struct8bytes8align* %d)
113 ret void
114}