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