• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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