xref: /llvm-project/llvm/test/CodeGen/ARM/ha-alignstack.ll (revision 5c7b43aa8298a389b906d72c792941a0ce57782e)
1; RUN: llc --mtriple armv7-eabihf %s -o - | FileCheck %s
2
3%struct.S0 = type { [4 x float] }
4%struct.S1 = type { [2 x float] }
5%struct.S2 = type { [4 x float] }
6%struct.D0 = type { [2 x double] }
7%struct.D1 = type { [2 x double] }
8%struct.D2 = type { [4 x double] }
9
10; pass in registers
11define dso_local float @f0_0(double %d0, double %d1, double %d2, double %d3, double %d4, double %d5, %struct.S0 %s.coerce) local_unnamed_addr #0 {
12entry:
13  %s.coerce.fca.0.0.extract = extractvalue %struct.S0 %s.coerce, 0, 0
14  ret float %s.coerce.fca.0.0.extract
15}
16; CHECK-LABEL: f0_0:
17; CHECK:       vmov.f32 s0, s12
18; CHECK-NEXT:  bx       lr
19
20; pass in memory, no memory/regs split
21define dso_local float @f0_1(double %d0, double %d1, double %d2, double %d3, double %d4, double %d5, float %x, %struct.S0 %s.coerce) local_unnamed_addr #0 {
22entry:
23  %s.coerce.fca.0.0.extract = extractvalue %struct.S0 %s.coerce, 0, 0
24  ret float %s.coerce.fca.0.0.extract
25}
26; CHECK-LABEL: f0_1:
27; CHECK:       vldr s0, [sp]
28; CHECK-NEXT:  bx   lr
29
30; pass in memory, alignment 4
31define dso_local float @f0_2(double %d0, double %d1, double %d2, double %d3, double %d4, double %d5, double %d6, double %d7, float %x, %struct.S0 %s.coerce) local_unnamed_addr #0 {
32entry:
33  %s.coerce.fca.0.0.extract = extractvalue %struct.S0 %s.coerce, 0, 0
34  ret float %s.coerce.fca.0.0.extract
35}
36; CHECK-LABEL: f0_2:
37; CHECK:       vldr s0, [sp, #4]
38; CHECK-NEXT:  bx   lr
39
40; pass in registers
41define dso_local float @f1_0(double %d0, double %d1, double %d2, double %d3, double %d4, double %d5, double %d6, %struct.S1 alignstack(8) %s.coerce) local_unnamed_addr #0 {
42entry:
43  %s.coerce.fca.0.0.extract = extractvalue %struct.S1 %s.coerce, 0, 0
44  ret float %s.coerce.fca.0.0.extract
45}
46; CHECK-LABEL: f1_0:
47; CHECK:       vmov.f32 s0, s14
48; CHECK-NEXT:  bx       lr
49
50; pass in memory, no memory/regs split
51define dso_local float @f1_1(double %d0, double %d1, double %d2, double %d3, double %d4, double %d5, double %d6, float %x, %struct.S1 alignstack(8) %s.coerce) local_unnamed_addr #0 {
52entry:
53  %s.coerce.fca.0.0.extract = extractvalue %struct.S1 %s.coerce, 0, 0
54  ret float %s.coerce.fca.0.0.extract
55}
56; CHECK-LABEL: f1_1:
57; CHECK:       vldr s0, [sp]
58; CHECK-NEXT:  bx   lr
59
60; pass in memory, alignment 8
61define dso_local float @f1_2(double %d0, double %d1, double %d2, double %d3, double %d4, double %d5, double %d6, double %d7, float %x, %struct.S1 alignstack(8) %s.coerce) local_unnamed_addr #0 {
62entry:
63  %s.coerce.fca.0.0.extract = extractvalue %struct.S1 %s.coerce, 0, 0
64  ret float %s.coerce.fca.0.0.extract
65}
66; CHECK-LABEL: f1_2:
67; CHECK:       vldr s0, [sp, #8]
68; CHECK-NEXT:  bx   lr
69
70; pass in registers
71define dso_local float @f2_0(double %d0, double %d1, double %d2, double %d3, double %d4, double %d5, %struct.S2 alignstack(8) %s.coerce) local_unnamed_addr #0 {
72entry:
73  %s.coerce.fca.0.0.extract = extractvalue %struct.S2 %s.coerce, 0, 0
74  ret float %s.coerce.fca.0.0.extract
75}
76; CHECK-LABEL: f2_0:
77; CHECK:       vmov.f32 s0, s12
78; CHECK-NEXT:  bx       lr
79
80; pass in memory, no memory/regs split
81define dso_local float @f2_1(double %d0, double %d1, double %d2, double %d3, double %d4, double %d5, float %x, %struct.S2 alignstack(8) %s.coerce) local_unnamed_addr #0 {
82entry:
83  %s.coerce.fca.0.0.extract = extractvalue %struct.S2 %s.coerce, 0, 0
84  ret float %s.coerce.fca.0.0.extract
85}
86; CHECK-LABEL: f2_1:
87; CHECK:       vldr s0, [sp]
88; CHECK-NEXT:  bx   lr
89
90; pass in memory, alignment 8
91define dso_local float @f2_2(double %d0, double %d1, double %d2, double %d3, double %d4, double %d5, double %d6, double %d7, float %x, %struct.S2 alignstack(8) %s.coerce) local_unnamed_addr #0 {
92entry:
93  %s.coerce.fca.0.0.extract = extractvalue %struct.S2 %s.coerce, 0, 0
94  ret float %s.coerce.fca.0.0.extract
95}
96; CHECK-LABEL: f2_2:
97; CHECK:       vldr s0, [sp, #8]
98; CHECK-NEXT:  bx   lr
99
100; pass in registers
101define dso_local double @g0_0(double %d0, double %d1, double %d2, double %d3, double %d4, double %d5, %struct.D0 %s.coerce) local_unnamed_addr #0 {
102entry:
103  %s.coerce.fca.0.0.extract = extractvalue %struct.D0 %s.coerce, 0, 0
104  ret double %s.coerce.fca.0.0.extract
105}
106; CHECK-LABEL: g0_0:
107; CHECK:       vmov.f64 d0, d6
108; CHECK-NEXT:  bx       lr
109
110; pass in memory, no memory/regs split
111define dso_local double @g0_1(double %d0, double %d1, double %d2, double %d3, double %d4, double %d5, double %d6, %struct.D0 %s.coerce) local_unnamed_addr #0 {
112entry:
113  %s.coerce.fca.0.0.extract = extractvalue %struct.D0 %s.coerce, 0, 0
114  ret double %s.coerce.fca.0.0.extract
115}
116; CHECK-LABEL: g0_1:
117; CHECK:       vldr d0, [sp]
118; CHECK-NEXT:  bx   lr
119
120; pass in memory, alignment 8
121define dso_local double @g0_2(double %d0, double %d1, double %d2, double %d3, double %d4, double %d5, double %d6, double %d7, float %x, %struct.D0 %s.coerce) local_unnamed_addr #0 {
122entry:
123  %s.coerce.fca.0.0.extract = extractvalue %struct.D0 %s.coerce, 0, 0
124  ret double %s.coerce.fca.0.0.extract
125}
126; CHECK-LABEL: g0_2:
127; CHECK:       vldr d0, [sp, #8]
128; CHECK-NEXT:  bx   lr
129
130; pass in registers
131define dso_local double @g1_0(double %d0, double %d1, double %d2, double %d3, double %d4, double %d5, %struct.D1 alignstack(8) %s.coerce) local_unnamed_addr #0 {
132entry:
133  %s.coerce.fca.0.0.extract = extractvalue %struct.D1 %s.coerce, 0, 0
134  ret double %s.coerce.fca.0.0.extract
135}
136; CHECK-LABEL: g1_0:
137; CHECK:       vmov.f64 d0, d6
138; CHECK-NEXT:  bx       lr
139
140; pass in memory, no memory/regs split
141define dso_local double @g1_1(double %d0, double %d1, double %d2, double %d3, double %d4, double %d5, double %d6, %struct.D1 alignstack(8) %s.coerce) local_unnamed_addr #0 {
142entry:
143  %s.coerce.fca.0.0.extract = extractvalue %struct.D1 %s.coerce, 0, 0
144  ret double %s.coerce.fca.0.0.extract
145}
146; CHECK-LABEL: g1_1:
147; CHECK:       vldr d0, [sp]
148; CHECK-NEXT:  bx   lr
149
150; pass in memory, alignment 8
151define dso_local double @g1_2(double %d0, double %d1, double %d2, double %d3, double %d4, double %d5, double %d6, double %d7, float %x, %struct.D1 alignstack(8) %s.coerce) local_unnamed_addr #0 {
152entry:
153  %s.coerce.fca.0.0.extract = extractvalue %struct.D1 %s.coerce, 0, 0
154  ret double %s.coerce.fca.0.0.extract
155}
156; CHECK-LABEL: g1_2:
157; CHECK:       vldr d0, [sp, #8]
158; CHECK-NEXT:  bx   lr
159
160; pass in registers
161define dso_local double @g2_0(double %d0, double %d1, double %d2, double %d3, %struct.D2 alignstack(8) %s.coerce) local_unnamed_addr #0 {
162entry:
163  %s.coerce.fca.0.0.extract = extractvalue %struct.D2 %s.coerce, 0, 0
164  ret double %s.coerce.fca.0.0.extract
165}
166; CHECK-LABEL: g2_0:
167; CHECK:       vmov.f64 d0, d4
168; CHECK-NEXT:  bx       lr
169
170; pass in memory, no memory/regs split
171define dso_local double @g2_1(double %d0, double %d1, double %d2, double %d3, double %d4, %struct.D2 alignstack(8) %s.coerce) local_unnamed_addr #0 {
172entry:
173  %s.coerce.fca.0.0.extract = extractvalue %struct.D2 %s.coerce, 0, 0
174  ret double %s.coerce.fca.0.0.extract
175}
176; CHECK-LABEL: g2_1:
177; CHECK:       vldr d0, [sp]
178; CHECK-NEXT:  bx   lr
179
180; pass in memory, alignment 8
181define dso_local double @g2_2(double %d0, double %d1, double %d2, double %d3, double %d4, double %d5, double %d6, double %d7, float %x, %struct.D2 alignstack(8) %s.coerce) local_unnamed_addr #0 {
182entry:
183  %s.coerce.fca.0.0.extract = extractvalue %struct.D2 %s.coerce, 0, 0
184  ret double %s.coerce.fca.0.0.extract
185}
186; CHECK-LABEL: g2_2:
187; CHECK:       vldr d0, [sp, #8]
188; CHECK-NEXT:  bx   lr
189
190attributes #0 = { "target-cpu"="generic" "target-features"="+armv7-a,+d32,+dsp,+fp64,+neon,+strict-align,+vfp2,+vfp2sp,+vfp3,+vfp3d16,+vfp3d16sp,+vfp3sp,-thumb-mode" }
191