xref: /aosp_15_r20/external/llvm/test/CodeGen/PowerPC/ppc64le-aggregates.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=ppc64le -mcpu=pwr8 -mattr=+altivec -mattr=-vsx | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=ppc64le -mattr=+altivec -mattr=-vsx | FileCheck %s
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Worker; Currently VSX support is disabled for this test because we generate lxsdx
5*9880d681SAndroid Build Coastguard Worker; instead of lfd, and stxsdx instead of stfd.  That is a poor choice when we
6*9880d681SAndroid Build Coastguard Worker; have reg+imm addressing, and is on the list of things to be fixed.
7*9880d681SAndroid Build Coastguard Worker; The second run step is to ensure that -march=ppc64le is adequate to select
8*9880d681SAndroid Build Coastguard Worker; the same feature set as with -mcpu=pwr8 since that is the baseline for ppc64le.
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-m:e-i64:64-n32:64"
11*9880d681SAndroid Build Coastguard Workertarget triple = "powerpc64le-unknown-linux-gnu"
12*9880d681SAndroid Build Coastguard Worker
13*9880d681SAndroid Build Coastguard Worker;
14*9880d681SAndroid Build Coastguard Worker; Verify use of registers for float/vector aggregate return.
15*9880d681SAndroid Build Coastguard Worker;
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Workerdefine [8 x float] @return_float([8 x float] %x) {
18*9880d681SAndroid Build Coastguard Workerentry:
19*9880d681SAndroid Build Coastguard Worker  ret [8 x float] %x
20*9880d681SAndroid Build Coastguard Worker}
21*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @return_float
22*9880d681SAndroid Build Coastguard Worker; CHECK: %entry
23*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Workerdefine [8 x double] @return_double([8 x double] %x) {
26*9880d681SAndroid Build Coastguard Workerentry:
27*9880d681SAndroid Build Coastguard Worker  ret [8 x double] %x
28*9880d681SAndroid Build Coastguard Worker}
29*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @return_double
30*9880d681SAndroid Build Coastguard Worker; CHECK: %entry
31*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr
32*9880d681SAndroid Build Coastguard Worker
33*9880d681SAndroid Build Coastguard Workerdefine [4 x ppc_fp128] @return_ppcf128([4 x ppc_fp128] %x) {
34*9880d681SAndroid Build Coastguard Workerentry:
35*9880d681SAndroid Build Coastguard Worker  ret [4 x ppc_fp128] %x
36*9880d681SAndroid Build Coastguard Worker}
37*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @return_ppcf128
38*9880d681SAndroid Build Coastguard Worker; CHECK: %entry
39*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr
40*9880d681SAndroid Build Coastguard Worker
41*9880d681SAndroid Build Coastguard Workerdefine [8 x <4 x i32>] @return_v4i32([8 x <4 x i32>] %x) {
42*9880d681SAndroid Build Coastguard Workerentry:
43*9880d681SAndroid Build Coastguard Worker  ret [8 x <4 x i32>] %x
44*9880d681SAndroid Build Coastguard Worker}
45*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @return_v4i32
46*9880d681SAndroid Build Coastguard Worker; CHECK: %entry
47*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blr
48*9880d681SAndroid Build Coastguard Worker
49*9880d681SAndroid Build Coastguard Worker
50*9880d681SAndroid Build Coastguard Worker;
51*9880d681SAndroid Build Coastguard Worker; Verify amount of space taken up by aggregates in the parameter save area.
52*9880d681SAndroid Build Coastguard Worker;
53*9880d681SAndroid Build Coastguard Worker
54*9880d681SAndroid Build Coastguard Workerdefine i64 @callee_float([7 x float] %a, [7 x float] %b, i64 %c) {
55*9880d681SAndroid Build Coastguard Workerentry:
56*9880d681SAndroid Build Coastguard Worker  ret i64 %c
57*9880d681SAndroid Build Coastguard Worker}
58*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @callee_float
59*9880d681SAndroid Build Coastguard Worker; CHECK: ld 3, 96(1)
60*9880d681SAndroid Build Coastguard Worker; CHECK: blr
61*9880d681SAndroid Build Coastguard Worker
62*9880d681SAndroid Build Coastguard Workerdefine void @caller_float(i64 %x, [7 x float] %y) {
63*9880d681SAndroid Build Coastguard Workerentry:
64*9880d681SAndroid Build Coastguard Worker  tail call void @test_float([7 x float] %y, [7 x float] %y, i64 %x)
65*9880d681SAndroid Build Coastguard Worker  ret void
66*9880d681SAndroid Build Coastguard Worker}
67*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @caller_float
68*9880d681SAndroid Build Coastguard Worker; CHECK: std 3, 96(1)
69*9880d681SAndroid Build Coastguard Worker; CHECK: bl test_float
70*9880d681SAndroid Build Coastguard Worker
71*9880d681SAndroid Build Coastguard Workerdeclare void @test_float([7 x float], [7 x float], i64)
72*9880d681SAndroid Build Coastguard Worker
73*9880d681SAndroid Build Coastguard Workerdefine i64 @callee_double(i64 %a, [7 x double] %b, i64 %c) {
74*9880d681SAndroid Build Coastguard Workerentry:
75*9880d681SAndroid Build Coastguard Worker  ret i64 %c
76*9880d681SAndroid Build Coastguard Worker}
77*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @callee_double
78*9880d681SAndroid Build Coastguard Worker; CHECK: ld 3, 96(1)
79*9880d681SAndroid Build Coastguard Worker; CHECK: blr
80*9880d681SAndroid Build Coastguard Worker
81*9880d681SAndroid Build Coastguard Workerdefine void @caller_double(i64 %x, [7 x double] %y) {
82*9880d681SAndroid Build Coastguard Workerentry:
83*9880d681SAndroid Build Coastguard Worker  tail call void @test_double(i64 %x, [7 x double] %y, i64 %x)
84*9880d681SAndroid Build Coastguard Worker  ret void
85*9880d681SAndroid Build Coastguard Worker}
86*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @caller_double
87*9880d681SAndroid Build Coastguard Worker; CHECK: std 3, 96(1)
88*9880d681SAndroid Build Coastguard Worker; CHECK: bl test_double
89*9880d681SAndroid Build Coastguard Worker
90*9880d681SAndroid Build Coastguard Workerdeclare void @test_double(i64, [7 x double], i64)
91*9880d681SAndroid Build Coastguard Worker
92*9880d681SAndroid Build Coastguard Workerdefine i64 @callee_ppcf128(i64 %a, [4 x ppc_fp128] %b, i64 %c) {
93*9880d681SAndroid Build Coastguard Workerentry:
94*9880d681SAndroid Build Coastguard Worker  ret i64 %c
95*9880d681SAndroid Build Coastguard Worker}
96*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @callee_ppcf128
97*9880d681SAndroid Build Coastguard Worker; CHECK: ld 3, 104(1)
98*9880d681SAndroid Build Coastguard Worker; CHECK: blr
99*9880d681SAndroid Build Coastguard Worker
100*9880d681SAndroid Build Coastguard Workerdefine void @caller_ppcf128(i64 %x, [4 x ppc_fp128] %y) {
101*9880d681SAndroid Build Coastguard Workerentry:
102*9880d681SAndroid Build Coastguard Worker  tail call void @test_ppcf128(i64 %x, [4 x ppc_fp128] %y, i64 %x)
103*9880d681SAndroid Build Coastguard Worker  ret void
104*9880d681SAndroid Build Coastguard Worker}
105*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @caller_ppcf128
106*9880d681SAndroid Build Coastguard Worker; CHECK: std 3, 104(1)
107*9880d681SAndroid Build Coastguard Worker; CHECK: bl test_ppcf128
108*9880d681SAndroid Build Coastguard Worker
109*9880d681SAndroid Build Coastguard Workerdeclare void @test_ppcf128(i64, [4 x ppc_fp128], i64)
110*9880d681SAndroid Build Coastguard Worker
111*9880d681SAndroid Build Coastguard Workerdefine i64 @callee_i64(i64 %a, [7 x i64] %b, i64 %c) {
112*9880d681SAndroid Build Coastguard Workerentry:
113*9880d681SAndroid Build Coastguard Worker  ret i64 %c
114*9880d681SAndroid Build Coastguard Worker}
115*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @callee_i64
116*9880d681SAndroid Build Coastguard Worker; CHECK: ld 3, 96(1)
117*9880d681SAndroid Build Coastguard Worker; CHECK: blr
118*9880d681SAndroid Build Coastguard Worker
119*9880d681SAndroid Build Coastguard Workerdefine void @caller_i64(i64 %x, [7 x i64] %y) {
120*9880d681SAndroid Build Coastguard Workerentry:
121*9880d681SAndroid Build Coastguard Worker  tail call void @test_i64(i64 %x, [7 x i64] %y, i64 %x)
122*9880d681SAndroid Build Coastguard Worker  ret void
123*9880d681SAndroid Build Coastguard Worker}
124*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @caller_i64
125*9880d681SAndroid Build Coastguard Worker; CHECK: std 3, 96(1)
126*9880d681SAndroid Build Coastguard Worker; CHECK: bl test_i64
127*9880d681SAndroid Build Coastguard Worker
128*9880d681SAndroid Build Coastguard Workerdeclare void @test_i64(i64, [7 x i64], i64)
129*9880d681SAndroid Build Coastguard Worker
130*9880d681SAndroid Build Coastguard Workerdefine i64 @callee_i128(i64 %a, [4 x i128] %b, i64 %c) {
131*9880d681SAndroid Build Coastguard Workerentry:
132*9880d681SAndroid Build Coastguard Worker  ret i64 %c
133*9880d681SAndroid Build Coastguard Worker}
134*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @callee_i128
135*9880d681SAndroid Build Coastguard Worker; CHECK: ld 3, 112(1)
136*9880d681SAndroid Build Coastguard Worker; CHECK: blr
137*9880d681SAndroid Build Coastguard Worker
138*9880d681SAndroid Build Coastguard Workerdefine void @caller_i128(i64 %x, [4 x i128] %y) {
139*9880d681SAndroid Build Coastguard Workerentry:
140*9880d681SAndroid Build Coastguard Worker  tail call void @test_i128(i64 %x, [4 x i128] %y, i64 %x)
141*9880d681SAndroid Build Coastguard Worker  ret void
142*9880d681SAndroid Build Coastguard Worker}
143*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @caller_i128
144*9880d681SAndroid Build Coastguard Worker; CHECK: std 3, 112(1)
145*9880d681SAndroid Build Coastguard Worker; CHECK: bl test_i128
146*9880d681SAndroid Build Coastguard Worker
147*9880d681SAndroid Build Coastguard Workerdeclare void @test_i128(i64, [4 x i128], i64)
148*9880d681SAndroid Build Coastguard Worker
149*9880d681SAndroid Build Coastguard Workerdefine i64 @callee_v4i32(i64 %a, [4 x <4 x i32>] %b, i64 %c) {
150*9880d681SAndroid Build Coastguard Workerentry:
151*9880d681SAndroid Build Coastguard Worker  ret i64 %c
152*9880d681SAndroid Build Coastguard Worker}
153*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @callee_v4i32
154*9880d681SAndroid Build Coastguard Worker; CHECK: ld 3, 112(1)
155*9880d681SAndroid Build Coastguard Worker; CHECK: blr
156*9880d681SAndroid Build Coastguard Worker
157*9880d681SAndroid Build Coastguard Workerdefine void @caller_v4i32(i64 %x, [4 x <4 x i32>] %y) {
158*9880d681SAndroid Build Coastguard Workerentry:
159*9880d681SAndroid Build Coastguard Worker  tail call void @test_v4i32(i64 %x, [4 x <4 x i32>] %y, i64 %x)
160*9880d681SAndroid Build Coastguard Worker  ret void
161*9880d681SAndroid Build Coastguard Worker}
162*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @caller_v4i32
163*9880d681SAndroid Build Coastguard Worker; CHECK: std 3, 112(1)
164*9880d681SAndroid Build Coastguard Worker; CHECK: bl test_v4i32
165*9880d681SAndroid Build Coastguard Worker
166*9880d681SAndroid Build Coastguard Workerdeclare void @test_v4i32(i64, [4 x <4 x i32>], i64)
167*9880d681SAndroid Build Coastguard Worker
168*9880d681SAndroid Build Coastguard Worker
169*9880d681SAndroid Build Coastguard Worker;
170*9880d681SAndroid Build Coastguard Worker; Verify handling of floating point arguments in GPRs
171*9880d681SAndroid Build Coastguard Worker;
172*9880d681SAndroid Build Coastguard Worker
173*9880d681SAndroid Build Coastguard Worker%struct.float8 = type { [8 x float] }
174*9880d681SAndroid Build Coastguard Worker%struct.float5 = type { [5 x float] }
175*9880d681SAndroid Build Coastguard Worker%struct.float2 = type { [2 x float] }
176*9880d681SAndroid Build Coastguard Worker
177*9880d681SAndroid Build Coastguard Worker@g8 = common global %struct.float8 zeroinitializer, align 4
178*9880d681SAndroid Build Coastguard Worker@g5 = common global %struct.float5 zeroinitializer, align 4
179*9880d681SAndroid Build Coastguard Worker@g2 = common global %struct.float2 zeroinitializer, align 4
180*9880d681SAndroid Build Coastguard Worker
181*9880d681SAndroid Build Coastguard Workerdefine float @callee0([7 x float] %a, [7 x float] %b) {
182*9880d681SAndroid Build Coastguard Workerentry:
183*9880d681SAndroid Build Coastguard Worker  %b.extract = extractvalue [7 x float] %b, 6
184*9880d681SAndroid Build Coastguard Worker  ret float %b.extract
185*9880d681SAndroid Build Coastguard Worker}
186*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @callee0
187*9880d681SAndroid Build Coastguard Worker; CHECK: stw 10, [[OFF:.*]](1)
188*9880d681SAndroid Build Coastguard Worker; CHECK: lfs 1, [[OFF]](1)
189*9880d681SAndroid Build Coastguard Worker; CHECK: blr
190*9880d681SAndroid Build Coastguard Worker
191*9880d681SAndroid Build Coastguard Workerdefine void @caller0([7 x float] %a) {
192*9880d681SAndroid Build Coastguard Workerentry:
193*9880d681SAndroid Build Coastguard Worker  tail call void @test0([7 x float] %a, [7 x float] %a)
194*9880d681SAndroid Build Coastguard Worker  ret void
195*9880d681SAndroid Build Coastguard Worker}
196*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @caller0
197*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmr 8, 1
198*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmr 9, 2
199*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmr 10, 3
200*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmr 11, 4
201*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmr 12, 5
202*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmr 13, 6
203*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: stfs 7, [[OFF:[0-9]+]](1)
204*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: lwz 10, [[OFF]](1)
205*9880d681SAndroid Build Coastguard Worker; CHECK: bl test0
206*9880d681SAndroid Build Coastguard Worker
207*9880d681SAndroid Build Coastguard Workerdeclare void @test0([7 x float], [7 x float])
208*9880d681SAndroid Build Coastguard Worker
209*9880d681SAndroid Build Coastguard Workerdefine float @callee1([8 x float] %a, [8 x float] %b) {
210*9880d681SAndroid Build Coastguard Workerentry:
211*9880d681SAndroid Build Coastguard Worker  %b.extract = extractvalue [8 x float] %b, 7
212*9880d681SAndroid Build Coastguard Worker  ret float %b.extract
213*9880d681SAndroid Build Coastguard Worker}
214*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @callee1
215*9880d681SAndroid Build Coastguard Worker; CHECK: rldicl [[REG:[0-9]+]], 10, 32, 32
216*9880d681SAndroid Build Coastguard Worker; CHECK: stw [[REG]], [[OFF:.*]](1)
217*9880d681SAndroid Build Coastguard Worker; CHECK: lfs 1, [[OFF]](1)
218*9880d681SAndroid Build Coastguard Worker; CHECK: blr
219*9880d681SAndroid Build Coastguard Worker
220*9880d681SAndroid Build Coastguard Workerdefine void @caller1([8 x float] %a) {
221*9880d681SAndroid Build Coastguard Workerentry:
222*9880d681SAndroid Build Coastguard Worker  tail call void @test1([8 x float] %a, [8 x float] %a)
223*9880d681SAndroid Build Coastguard Worker  ret void
224*9880d681SAndroid Build Coastguard Worker}
225*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @caller1
226*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmr 9, 1
227*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmr 10, 2
228*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmr 11, 3
229*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmr 12, 4
230*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmr 13, 5
231*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: stfs 5, [[OFF0:[0-9]+]](1)
232*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: stfs 6, [[OFF1:[0-9]+]](1)
233*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: stfs 7, [[OFF2:[0-9]+]](1)
234*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: stfs 8, [[OFF3:[0-9]+]](1)
235*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: lwz [[REG0:[0-9]+]], [[OFF0]](1)
236*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: lwz [[REG1:[0-9]+]], [[OFF1]](1)
237*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: lwz [[REG2:[0-9]+]], [[OFF2]](1)
238*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: lwz [[REG3:[0-9]+]], [[OFF3]](1)
239*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: sldi [[REG1]], [[REG1]], 32
240*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: sldi [[REG3]], [[REG3]], 32
241*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: or 9, [[REG0]], [[REG1]]
242*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: or 10, [[REG2]], [[REG3]]
243*9880d681SAndroid Build Coastguard Worker; CHECK: bl test1
244*9880d681SAndroid Build Coastguard Worker
245*9880d681SAndroid Build Coastguard Workerdeclare void @test1([8 x float], [8 x float])
246*9880d681SAndroid Build Coastguard Worker
247*9880d681SAndroid Build Coastguard Workerdefine float @callee2([8 x float] %a, [5 x float] %b, [2 x float] %c) {
248*9880d681SAndroid Build Coastguard Workerentry:
249*9880d681SAndroid Build Coastguard Worker  %c.extract = extractvalue [2 x float] %c, 1
250*9880d681SAndroid Build Coastguard Worker  ret float %c.extract
251*9880d681SAndroid Build Coastguard Worker}
252*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @callee2
253*9880d681SAndroid Build Coastguard Worker; CHECK: rldicl [[REG:[0-9]+]], 10, 32, 32
254*9880d681SAndroid Build Coastguard Worker; CHECK: stw [[REG]], [[OFF:.*]](1)
255*9880d681SAndroid Build Coastguard Worker; CHECK: lfs 1, [[OFF]](1)
256*9880d681SAndroid Build Coastguard Worker; CHECK: blr
257*9880d681SAndroid Build Coastguard Worker
258*9880d681SAndroid Build Coastguard Workerdefine void @caller2() {
259*9880d681SAndroid Build Coastguard Workerentry:
260*9880d681SAndroid Build Coastguard Worker  %0 = load [8 x float], [8 x float]* getelementptr inbounds (%struct.float8, %struct.float8* @g8, i64 0, i32 0), align 4
261*9880d681SAndroid Build Coastguard Worker  %1 = load [5 x float], [5 x float]* getelementptr inbounds (%struct.float5, %struct.float5* @g5, i64 0, i32 0), align 4
262*9880d681SAndroid Build Coastguard Worker  %2 = load [2 x float], [2 x float]* getelementptr inbounds (%struct.float2, %struct.float2* @g2, i64 0, i32 0), align 4
263*9880d681SAndroid Build Coastguard Worker  tail call void @test2([8 x float] %0, [5 x float] %1, [2 x float] %2)
264*9880d681SAndroid Build Coastguard Worker  ret void
265*9880d681SAndroid Build Coastguard Worker}
266*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @caller2
267*9880d681SAndroid Build Coastguard Worker; CHECK: ld {{[0-9]+}}, .LC
268*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: lfs 1, 0({{[0-9]+}})
269*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: lfs 2, 4({{[0-9]+}})
270*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: lfs 3, 8({{[0-9]+}})
271*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: lfs 4, 12({{[0-9]+}})
272*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: lfs 5, 16({{[0-9]+}})
273*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: lfs 6, 20({{[0-9]+}})
274*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: lfs 7, 24({{[0-9]+}})
275*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: lfs 8, 28({{[0-9]+}})
276*9880d681SAndroid Build Coastguard Worker
277*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: lfs 9, 0({{[0-9]+}})
278*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: lfs 10, 4({{[0-9]+}})
279*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: lfs 11, 8({{[0-9]+}})
280*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: lfs 12, 12({{[0-9]+}})
281*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: lfs 13, 16({{[0-9]+}})
282*9880d681SAndroid Build Coastguard Worker
283*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: lwz [[REG0:[0-9]+]], 0({{[0-9]+}})
284*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: lwz [[REG1:[0-9]+]], 4({{[0-9]+}})
285*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: sldi [[REG2:[0-9]+]], [[REG1]], 32
286*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: or 10, [[REG0]], [[REG2]]
287*9880d681SAndroid Build Coastguard Worker; CHECK: bl test2
288*9880d681SAndroid Build Coastguard Worker
289*9880d681SAndroid Build Coastguard Workerdeclare void @test2([8 x float], [5 x float], [2 x float])
290*9880d681SAndroid Build Coastguard Worker
291*9880d681SAndroid Build Coastguard Workerdefine double @callee3([8 x float] %a, [5 x float] %b, double %c) {
292*9880d681SAndroid Build Coastguard Workerentry:
293*9880d681SAndroid Build Coastguard Worker  ret double %c
294*9880d681SAndroid Build Coastguard Worker}
295*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @callee3
296*9880d681SAndroid Build Coastguard Worker; CHECK: std 10, [[OFF:.*]](1)
297*9880d681SAndroid Build Coastguard Worker; CHECK: lfd 1, [[OFF]](1)
298*9880d681SAndroid Build Coastguard Worker; CHECK: blr
299*9880d681SAndroid Build Coastguard Worker
300*9880d681SAndroid Build Coastguard Workerdefine void @caller3(double %d) {
301*9880d681SAndroid Build Coastguard Workerentry:
302*9880d681SAndroid Build Coastguard Worker  %0 = load [8 x float], [8 x float]* getelementptr inbounds (%struct.float8, %struct.float8* @g8, i64 0, i32 0), align 4
303*9880d681SAndroid Build Coastguard Worker  %1 = load [5 x float], [5 x float]* getelementptr inbounds (%struct.float5, %struct.float5* @g5, i64 0, i32 0), align 4
304*9880d681SAndroid Build Coastguard Worker  tail call void @test3([8 x float] %0, [5 x float] %1, double %d)
305*9880d681SAndroid Build Coastguard Worker  ret void
306*9880d681SAndroid Build Coastguard Worker}
307*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @caller3
308*9880d681SAndroid Build Coastguard Worker; CHECK: stfd 1, [[OFF:.*]](1)
309*9880d681SAndroid Build Coastguard Worker; CHECK: ld 10, [[OFF]](1)
310*9880d681SAndroid Build Coastguard Worker; CHECK: bl test3
311*9880d681SAndroid Build Coastguard Worker
312*9880d681SAndroid Build Coastguard Workerdeclare void @test3([8 x float], [5 x float], double)
313*9880d681SAndroid Build Coastguard Worker
314*9880d681SAndroid Build Coastguard Workerdefine float @callee4([8 x float] %a, [5 x float] %b, float %c) {
315*9880d681SAndroid Build Coastguard Workerentry:
316*9880d681SAndroid Build Coastguard Worker  ret float %c
317*9880d681SAndroid Build Coastguard Worker}
318*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @callee4
319*9880d681SAndroid Build Coastguard Worker; CHECK: stw 10, [[OFF:.*]](1)
320*9880d681SAndroid Build Coastguard Worker; CHECK: lfs 1, [[OFF]](1)
321*9880d681SAndroid Build Coastguard Worker; CHECK: blr
322*9880d681SAndroid Build Coastguard Worker
323*9880d681SAndroid Build Coastguard Workerdefine void @caller4(float %f) {
324*9880d681SAndroid Build Coastguard Workerentry:
325*9880d681SAndroid Build Coastguard Worker  %0 = load [8 x float], [8 x float]* getelementptr inbounds (%struct.float8, %struct.float8* @g8, i64 0, i32 0), align 4
326*9880d681SAndroid Build Coastguard Worker  %1 = load [5 x float], [5 x float]* getelementptr inbounds (%struct.float5, %struct.float5* @g5, i64 0, i32 0), align 4
327*9880d681SAndroid Build Coastguard Worker  tail call void @test4([8 x float] %0, [5 x float] %1, float %f)
328*9880d681SAndroid Build Coastguard Worker  ret void
329*9880d681SAndroid Build Coastguard Worker}
330*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @caller4
331*9880d681SAndroid Build Coastguard Worker; CHECK: stfs 1, [[OFF:.*]](1)
332*9880d681SAndroid Build Coastguard Worker; CHECK: lwz 10, [[OFF]](1)
333*9880d681SAndroid Build Coastguard Worker; CHECK: bl test4
334*9880d681SAndroid Build Coastguard Worker
335*9880d681SAndroid Build Coastguard Workerdeclare void @test4([8 x float], [5 x float], float)
336*9880d681SAndroid Build Coastguard Worker
337