xref: /llvm-project/llvm/test/CodeGen/PowerPC/save-reg-params.ll (revision 53c37f300dd1b450671f2aee4cc649c380adb5ad)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4
2; RUN: llc -verify-machineinstrs -mtriple=powerpc-ibm-aix -mcpu=pwr7 < %s | FileCheck %s -check-prefix=32BIT
3; RUN: llc -verify-machineinstrs -mtriple=powerpc64-ibm-aix -mcpu=pwr7 < %s | FileCheck %s -check-prefix=64BIT
4
5define void @i64_join(i64 %a, i64 %b, i64 %c, i64 %d, i64 %e, i64 %f, i64 %g, i64 %h, i64 %i, i64 %j) #0 {
6; 32BIT-LABEL: i64_join:
7; 32BIT:       # %bb.0: # %entry
8; 32BIT-NEXT:    mflr 0
9; 32BIT-NEXT:    stwu 1, -64(1)
10; 32BIT-NEXT:    stw 0, 72(1)
11; 32BIT-NEXT:    stw 10, 116(1)
12; 32BIT-NEXT:    stw 9, 112(1)
13; 32BIT-NEXT:    stw 8, 108(1)
14; 32BIT-NEXT:    stw 7, 104(1)
15; 32BIT-NEXT:    stw 6, 100(1)
16; 32BIT-NEXT:    stw 5, 96(1)
17; 32BIT-NEXT:    stw 4, 92(1)
18; 32BIT-NEXT:    stw 3, 88(1)
19; 32BIT-NEXT:    bl .foo[PR]
20; 32BIT-NEXT:    nop
21; 32BIT-NEXT:    addi 1, 1, 64
22; 32BIT-NEXT:    lwz 0, 8(1)
23; 32BIT-NEXT:    mtlr 0
24; 32BIT-NEXT:    blr
25;
26; 64BIT-LABEL: i64_join:
27; 64BIT:       # %bb.0: # %entry
28; 64BIT-NEXT:    mflr 0
29; 64BIT-NEXT:    stdu 1, -112(1)
30; 64BIT-NEXT:    std 0, 128(1)
31; 64BIT-NEXT:    std 10, 216(1)
32; 64BIT-NEXT:    std 9, 208(1)
33; 64BIT-NEXT:    std 8, 200(1)
34; 64BIT-NEXT:    std 7, 192(1)
35; 64BIT-NEXT:    std 6, 184(1)
36; 64BIT-NEXT:    std 5, 176(1)
37; 64BIT-NEXT:    std 4, 168(1)
38; 64BIT-NEXT:    std 3, 160(1)
39; 64BIT-NEXT:    bl .foo[PR]
40; 64BIT-NEXT:    nop
41; 64BIT-NEXT:    addi 1, 1, 112
42; 64BIT-NEXT:    ld 0, 16(1)
43; 64BIT-NEXT:    mtlr 0
44; 64BIT-NEXT:    blr
45entry:
46  %add = add nsw i64 %b, %a
47  %add1 = add nsw i64 %add, %c
48  %add2 = add nsw i64 %add1, %d
49  %add3 = add nsw i64 %add2, %e
50  %add4 = add nsw i64 %add3, %f
51  %add5 = add nsw i64 %add4, %g
52  %add6 = add nsw i64 %add5, %h
53  %add7 = add nsw i64 %add6, %i
54  %add8 = add nsw i64 %add7, %j
55  tail call void @foo()
56  ret void
57}
58
59define void @i64_join_missing(i64 %a, i64 %b, i64 %c, i64 %d, i64 %e, i64 %f, i64 %g, i64 %h, i64 %i, i64 %j) #0 {
60; 32BIT-LABEL: i64_join_missing:
61; 32BIT:       # %bb.0: # %entry
62; 32BIT-NEXT:    mflr 0
63; 32BIT-NEXT:    stwu 1, -64(1)
64; 32BIT-NEXT:    stw 0, 72(1)
65; 32BIT-NEXT:    stw 10, 116(1)
66; 32BIT-NEXT:    stw 9, 112(1)
67; 32BIT-NEXT:    stw 8, 108(1)
68; 32BIT-NEXT:    stw 7, 104(1)
69; 32BIT-NEXT:    stw 6, 100(1)
70; 32BIT-NEXT:    stw 5, 96(1)
71; 32BIT-NEXT:    stw 4, 92(1)
72; 32BIT-NEXT:    stw 3, 88(1)
73; 32BIT-NEXT:    bl .foo[PR]
74; 32BIT-NEXT:    nop
75; 32BIT-NEXT:    addi 1, 1, 64
76; 32BIT-NEXT:    lwz 0, 8(1)
77; 32BIT-NEXT:    mtlr 0
78; 32BIT-NEXT:    blr
79;
80; 64BIT-LABEL: i64_join_missing:
81; 64BIT:       # %bb.0: # %entry
82; 64BIT-NEXT:    mflr 0
83; 64BIT-NEXT:    stdu 1, -112(1)
84; 64BIT-NEXT:    std 0, 128(1)
85; 64BIT-NEXT:    std 10, 216(1)
86; 64BIT-NEXT:    std 9, 208(1)
87; 64BIT-NEXT:    std 8, 200(1)
88; 64BIT-NEXT:    std 7, 192(1)
89; 64BIT-NEXT:    std 6, 184(1)
90; 64BIT-NEXT:    std 5, 176(1)
91; 64BIT-NEXT:    std 4, 168(1)
92; 64BIT-NEXT:    std 3, 160(1)
93; 64BIT-NEXT:    bl .foo[PR]
94; 64BIT-NEXT:    nop
95; 64BIT-NEXT:    addi 1, 1, 112
96; 64BIT-NEXT:    ld 0, 16(1)
97; 64BIT-NEXT:    mtlr 0
98; 64BIT-NEXT:    blr
99entry:
100  %add1 = mul nsw i64 %a, 3
101  %add2 = add nsw i64 %add1, %d
102  %add3 = add nsw i64 %add2, %e
103  %add4 = add nsw i64 %add3, %f
104  %add5 = add nsw i64 %add4, %g
105  %add6 = add nsw i64 %add5, %h
106  %add7 = add nsw i64 %add6, %i
107  %add8 = add nsw i64 %add7, %j
108  tail call void @foo()
109  ret void
110}
111
112define void @i32_join(i32 signext %a, i32 signext %b, i32 signext %c, i32 signext %d, i32 signext %e, i32 signext %f, i32 signext %g, i32 signext %h, i32 signext %i, i32 signext %j) #0 {
113; 32BIT-LABEL: i32_join:
114; 32BIT:       # %bb.0: # %entry
115; 32BIT-NEXT:    mflr 0
116; 32BIT-NEXT:    stwu 1, -64(1)
117; 32BIT-NEXT:    stw 0, 72(1)
118; 32BIT-NEXT:    stw 10, 116(1)
119; 32BIT-NEXT:    stw 9, 112(1)
120; 32BIT-NEXT:    stw 8, 108(1)
121; 32BIT-NEXT:    stw 7, 104(1)
122; 32BIT-NEXT:    stw 6, 100(1)
123; 32BIT-NEXT:    stw 5, 96(1)
124; 32BIT-NEXT:    stw 4, 92(1)
125; 32BIT-NEXT:    stw 3, 88(1)
126; 32BIT-NEXT:    bl .foo[PR]
127; 32BIT-NEXT:    nop
128; 32BIT-NEXT:    addi 1, 1, 64
129; 32BIT-NEXT:    lwz 0, 8(1)
130; 32BIT-NEXT:    mtlr 0
131; 32BIT-NEXT:    blr
132;
133; 64BIT-LABEL: i32_join:
134; 64BIT:       # %bb.0: # %entry
135; 64BIT-NEXT:    mflr 0
136; 64BIT-NEXT:    stdu 1, -112(1)
137; 64BIT-NEXT:    std 0, 128(1)
138; 64BIT-NEXT:    std 10, 216(1)
139; 64BIT-NEXT:    std 9, 208(1)
140; 64BIT-NEXT:    std 8, 200(1)
141; 64BIT-NEXT:    std 7, 192(1)
142; 64BIT-NEXT:    std 6, 184(1)
143; 64BIT-NEXT:    std 5, 176(1)
144; 64BIT-NEXT:    std 4, 168(1)
145; 64BIT-NEXT:    std 3, 160(1)
146; 64BIT-NEXT:    bl .foo[PR]
147; 64BIT-NEXT:    nop
148; 64BIT-NEXT:    addi 1, 1, 112
149; 64BIT-NEXT:    ld 0, 16(1)
150; 64BIT-NEXT:    mtlr 0
151; 64BIT-NEXT:    blr
152entry:
153  %add = add nsw i32 %b, %a
154  %add1 = add nsw i32 %add, %c
155  %add2 = add nsw i32 %add1, %d
156  %add3 = add nsw i32 %add2, %e
157  %add4 = add nsw i32 %add3, %f
158  %add5 = add nsw i32 %add4, %g
159  %add6 = add nsw i32 %add5, %h
160  %add7 = add nsw i32 %add6, %i
161  %add8 = add nsw i32 %add7, %j
162  tail call void @foo()
163  ret void
164}
165
166define void @i32_join_missing(i32 signext %a, i32 signext %b, i32 signext %c, i32 signext %d, i32 signext %e, i32 signext %f, i32 signext %g, i32 signext %h, i32 signext %i, i32 signext %j) #0 {
167; 32BIT-LABEL: i32_join_missing:
168; 32BIT:       # %bb.0: # %entry
169; 32BIT-NEXT:    mflr 0
170; 32BIT-NEXT:    stwu 1, -64(1)
171; 32BIT-NEXT:    stw 0, 72(1)
172; 32BIT-NEXT:    stw 10, 116(1)
173; 32BIT-NEXT:    stw 9, 112(1)
174; 32BIT-NEXT:    stw 8, 108(1)
175; 32BIT-NEXT:    stw 7, 104(1)
176; 32BIT-NEXT:    stw 6, 100(1)
177; 32BIT-NEXT:    stw 5, 96(1)
178; 32BIT-NEXT:    stw 4, 92(1)
179; 32BIT-NEXT:    stw 3, 88(1)
180; 32BIT-NEXT:    bl .foo[PR]
181; 32BIT-NEXT:    nop
182; 32BIT-NEXT:    addi 1, 1, 64
183; 32BIT-NEXT:    lwz 0, 8(1)
184; 32BIT-NEXT:    mtlr 0
185; 32BIT-NEXT:    blr
186;
187; 64BIT-LABEL: i32_join_missing:
188; 64BIT:       # %bb.0: # %entry
189; 64BIT-NEXT:    mflr 0
190; 64BIT-NEXT:    stdu 1, -112(1)
191; 64BIT-NEXT:    std 0, 128(1)
192; 64BIT-NEXT:    std 10, 216(1)
193; 64BIT-NEXT:    std 9, 208(1)
194; 64BIT-NEXT:    std 8, 200(1)
195; 64BIT-NEXT:    std 7, 192(1)
196; 64BIT-NEXT:    std 6, 184(1)
197; 64BIT-NEXT:    std 5, 176(1)
198; 64BIT-NEXT:    std 4, 168(1)
199; 64BIT-NEXT:    std 3, 160(1)
200; 64BIT-NEXT:    bl .foo[PR]
201; 64BIT-NEXT:    nop
202; 64BIT-NEXT:    addi 1, 1, 112
203; 64BIT-NEXT:    ld 0, 16(1)
204; 64BIT-NEXT:    mtlr 0
205; 64BIT-NEXT:    blr
206entry:
207  %add1 = mul nsw i32 %a, 3
208  %add2 = add nsw i32 %add1, %d
209  %add3 = add nsw i32 %add2, %e
210  %add4 = add nsw i32 %add3, %f
211  %add5 = add nsw i32 %add4, %g
212  %add6 = add nsw i32 %add5, %h
213  %add7 = add nsw i32 %add6, %i
214  %add8 = add nsw i32 %add7, %j
215  tail call void @foo()
216  ret void
217}
218
219define void @f32_join(float %a, float %b, float %c, float %d, float %e, float %f, float %g, float %h, float %i, float %j) #0 {
220; 32BIT-LABEL: f32_join:
221; 32BIT:       # %bb.0: # %entry
222; 32BIT-NEXT:    mflr 0
223; 32BIT-NEXT:    stwu 1, -64(1)
224; 32BIT-NEXT:    stw 0, 72(1)
225; 32BIT-NEXT:    stfs 10, 124(1)
226; 32BIT-NEXT:    stfs 9, 120(1)
227; 32BIT-NEXT:    stfs 8, 116(1)
228; 32BIT-NEXT:    stfs 7, 112(1)
229; 32BIT-NEXT:    stfs 6, 108(1)
230; 32BIT-NEXT:    stfs 5, 104(1)
231; 32BIT-NEXT:    stfs 4, 100(1)
232; 32BIT-NEXT:    stfs 3, 96(1)
233; 32BIT-NEXT:    stfs 2, 92(1)
234; 32BIT-NEXT:    stfs 1, 88(1)
235; 32BIT-NEXT:    bl .foo[PR]
236; 32BIT-NEXT:    nop
237; 32BIT-NEXT:    addi 1, 1, 64
238; 32BIT-NEXT:    lwz 0, 8(1)
239; 32BIT-NEXT:    mtlr 0
240; 32BIT-NEXT:    blr
241;
242; 64BIT-LABEL: f32_join:
243; 64BIT:       # %bb.0: # %entry
244; 64BIT-NEXT:    mflr 0
245; 64BIT-NEXT:    stdu 1, -112(1)
246; 64BIT-NEXT:    std 0, 128(1)
247; 64BIT-NEXT:    stfs 10, 232(1)
248; 64BIT-NEXT:    stfs 9, 224(1)
249; 64BIT-NEXT:    stfs 8, 216(1)
250; 64BIT-NEXT:    stfs 7, 208(1)
251; 64BIT-NEXT:    stfs 6, 200(1)
252; 64BIT-NEXT:    stfs 5, 192(1)
253; 64BIT-NEXT:    stfs 4, 184(1)
254; 64BIT-NEXT:    stfs 3, 176(1)
255; 64BIT-NEXT:    stfs 2, 168(1)
256; 64BIT-NEXT:    stfs 1, 160(1)
257; 64BIT-NEXT:    bl .foo[PR]
258; 64BIT-NEXT:    nop
259; 64BIT-NEXT:    addi 1, 1, 112
260; 64BIT-NEXT:    ld 0, 16(1)
261; 64BIT-NEXT:    mtlr 0
262; 64BIT-NEXT:    blr
263entry:
264  %add = fadd float %a, %b
265  %add1 = fadd float %add, %c
266  %add2 = fadd float %add1, %d
267  %add3 = fadd float %add2, %e
268  %add4 = fadd float %add3, %f
269  %add5 = fadd float %add4, %g
270  %add6 = fadd float %add5, %h
271  %add7 = fadd float %add6, %i
272  %add8 = fadd float %add7, %j
273  tail call void @foo()
274  ret void
275}
276
277define void @f32_join_missing(float %a, float %b, float %c, float %d, float %e, float %f, float %g, float %h, float %i, float %j) #0 {
278; 32BIT-LABEL: f32_join_missing:
279; 32BIT:       # %bb.0: # %entry
280; 32BIT-NEXT:    mflr 0
281; 32BIT-NEXT:    stwu 1, -64(1)
282; 32BIT-NEXT:    stw 0, 72(1)
283; 32BIT-NEXT:    stfs 10, 124(1)
284; 32BIT-NEXT:    stfs 9, 120(1)
285; 32BIT-NEXT:    stfs 8, 116(1)
286; 32BIT-NEXT:    stfs 7, 112(1)
287; 32BIT-NEXT:    stfs 6, 108(1)
288; 32BIT-NEXT:    stfs 5, 104(1)
289; 32BIT-NEXT:    stfs 4, 100(1)
290; 32BIT-NEXT:    stfs 3, 96(1)
291; 32BIT-NEXT:    stfs 2, 92(1)
292; 32BIT-NEXT:    stfs 1, 88(1)
293; 32BIT-NEXT:    bl .foo[PR]
294; 32BIT-NEXT:    nop
295; 32BIT-NEXT:    addi 1, 1, 64
296; 32BIT-NEXT:    lwz 0, 8(1)
297; 32BIT-NEXT:    mtlr 0
298; 32BIT-NEXT:    blr
299;
300; 64BIT-LABEL: f32_join_missing:
301; 64BIT:       # %bb.0: # %entry
302; 64BIT-NEXT:    mflr 0
303; 64BIT-NEXT:    stdu 1, -112(1)
304; 64BIT-NEXT:    std 0, 128(1)
305; 64BIT-NEXT:    stfs 10, 232(1)
306; 64BIT-NEXT:    stfs 9, 224(1)
307; 64BIT-NEXT:    stfs 8, 216(1)
308; 64BIT-NEXT:    stfs 7, 208(1)
309; 64BIT-NEXT:    stfs 6, 200(1)
310; 64BIT-NEXT:    stfs 5, 192(1)
311; 64BIT-NEXT:    stfs 4, 184(1)
312; 64BIT-NEXT:    stfs 3, 176(1)
313; 64BIT-NEXT:    stfs 2, 168(1)
314; 64BIT-NEXT:    stfs 1, 160(1)
315; 64BIT-NEXT:    bl .foo[PR]
316; 64BIT-NEXT:    nop
317; 64BIT-NEXT:    addi 1, 1, 112
318; 64BIT-NEXT:    ld 0, 16(1)
319; 64BIT-NEXT:    mtlr 0
320; 64BIT-NEXT:    blr
321entry:
322  %add = fadd float %a, %a
323  %add1 = fadd float %add, %a
324  %add2 = fadd float %add1, %d
325  %add3 = fadd float %add2, %e
326  %add4 = fadd float %add3, %f
327  %add5 = fadd float %add4, %g
328  %add6 = fadd float %add5, %h
329  %add7 = fadd float %add6, %i
330  %add8 = fadd float %add7, %j
331  tail call void @foo()
332  ret void
333}
334
335define void @f64_join(double %a, double %b, double %c, double %d, double %e, double %f, double %g, double %h, double %i, double %j) #0 {
336; 32BIT-LABEL: f64_join:
337; 32BIT:       # %bb.0: # %entry
338; 32BIT-NEXT:    mflr 0
339; 32BIT-NEXT:    stwu 1, -64(1)
340; 32BIT-NEXT:    stw 0, 72(1)
341; 32BIT-NEXT:    stfd 10, 160(1)
342; 32BIT-NEXT:    stfd 9, 152(1)
343; 32BIT-NEXT:    stfd 8, 144(1)
344; 32BIT-NEXT:    stfd 7, 136(1)
345; 32BIT-NEXT:    stfd 6, 128(1)
346; 32BIT-NEXT:    stfd 5, 120(1)
347; 32BIT-NEXT:    stfd 4, 112(1)
348; 32BIT-NEXT:    stfd 3, 104(1)
349; 32BIT-NEXT:    stfd 2, 96(1)
350; 32BIT-NEXT:    stfd 1, 88(1)
351; 32BIT-NEXT:    bl .foo[PR]
352; 32BIT-NEXT:    nop
353; 32BIT-NEXT:    addi 1, 1, 64
354; 32BIT-NEXT:    lwz 0, 8(1)
355; 32BIT-NEXT:    mtlr 0
356; 32BIT-NEXT:    blr
357;
358; 64BIT-LABEL: f64_join:
359; 64BIT:       # %bb.0: # %entry
360; 64BIT-NEXT:    mflr 0
361; 64BIT-NEXT:    stdu 1, -112(1)
362; 64BIT-NEXT:    std 0, 128(1)
363; 64BIT-NEXT:    stfd 10, 232(1)
364; 64BIT-NEXT:    stfd 9, 224(1)
365; 64BIT-NEXT:    stfd 8, 216(1)
366; 64BIT-NEXT:    stfd 7, 208(1)
367; 64BIT-NEXT:    stfd 6, 200(1)
368; 64BIT-NEXT:    stfd 5, 192(1)
369; 64BIT-NEXT:    stfd 4, 184(1)
370; 64BIT-NEXT:    stfd 3, 176(1)
371; 64BIT-NEXT:    stfd 2, 168(1)
372; 64BIT-NEXT:    stfd 1, 160(1)
373; 64BIT-NEXT:    bl .foo[PR]
374; 64BIT-NEXT:    nop
375; 64BIT-NEXT:    addi 1, 1, 112
376; 64BIT-NEXT:    ld 0, 16(1)
377; 64BIT-NEXT:    mtlr 0
378; 64BIT-NEXT:    blr
379entry:
380  %add = fadd double %a, %b
381  %add1 = fadd double %add, %c
382  %add2 = fadd double %add1, %d
383  %add3 = fadd double %add2, %e
384  %add4 = fadd double %add3, %f
385  %add5 = fadd double %add4, %g
386  %add6 = fadd double %add5, %h
387  %add7 = fadd double %add6, %i
388  %add8 = fadd double %add7, %j
389  tail call void @foo()
390  ret void
391}
392
393define void @f64_missing(double %a, double %b, double %c, double %d, double %e, double %f, double %g, double %h, double %i, double %j) #0 {
394; 32BIT-LABEL: f64_missing:
395; 32BIT:       # %bb.0: # %entry
396; 32BIT-NEXT:    mflr 0
397; 32BIT-NEXT:    stwu 1, -64(1)
398; 32BIT-NEXT:    stw 0, 72(1)
399; 32BIT-NEXT:    stfd 10, 160(1)
400; 32BIT-NEXT:    stfd 9, 152(1)
401; 32BIT-NEXT:    stfd 8, 144(1)
402; 32BIT-NEXT:    stfd 7, 136(1)
403; 32BIT-NEXT:    stfd 6, 128(1)
404; 32BIT-NEXT:    stfd 5, 120(1)
405; 32BIT-NEXT:    stfd 4, 112(1)
406; 32BIT-NEXT:    stfd 3, 104(1)
407; 32BIT-NEXT:    stfd 2, 96(1)
408; 32BIT-NEXT:    stfd 1, 88(1)
409; 32BIT-NEXT:    bl .foo[PR]
410; 32BIT-NEXT:    nop
411; 32BIT-NEXT:    addi 1, 1, 64
412; 32BIT-NEXT:    lwz 0, 8(1)
413; 32BIT-NEXT:    mtlr 0
414; 32BIT-NEXT:    blr
415;
416; 64BIT-LABEL: f64_missing:
417; 64BIT:       # %bb.0: # %entry
418; 64BIT-NEXT:    mflr 0
419; 64BIT-NEXT:    stdu 1, -112(1)
420; 64BIT-NEXT:    std 0, 128(1)
421; 64BIT-NEXT:    stfd 10, 232(1)
422; 64BIT-NEXT:    stfd 9, 224(1)
423; 64BIT-NEXT:    stfd 8, 216(1)
424; 64BIT-NEXT:    stfd 7, 208(1)
425; 64BIT-NEXT:    stfd 6, 200(1)
426; 64BIT-NEXT:    stfd 5, 192(1)
427; 64BIT-NEXT:    stfd 4, 184(1)
428; 64BIT-NEXT:    stfd 3, 176(1)
429; 64BIT-NEXT:    stfd 2, 168(1)
430; 64BIT-NEXT:    stfd 1, 160(1)
431; 64BIT-NEXT:    bl .foo[PR]
432; 64BIT-NEXT:    nop
433; 64BIT-NEXT:    addi 1, 1, 112
434; 64BIT-NEXT:    ld 0, 16(1)
435; 64BIT-NEXT:    mtlr 0
436; 64BIT-NEXT:    blr
437entry:
438  %add = fadd double %a, %a
439  %add1 = fadd double %add, %a
440  %add2 = fadd double %add1, %d
441  %add3 = fadd double %add2, %e
442  %add4 = fadd double %add3, %f
443  %add5 = fadd double %add4, %g
444  %add6 = fadd double %add5, %h
445  %add7 = fadd double %add6, %i
446  %add8 = fadd double %add7, %j
447  tail call void @foo()
448  ret void
449}
450
451define void @mixed_1(double %a, i64 %b, i64 %c, i32 signext %d, i64 %e, float %f, float %g, double %h, i32 signext %i, double %j) #0 {
452; 32BIT-LABEL: mixed_1:
453; 32BIT:       # %bb.0: # %entry
454; 32BIT-NEXT:    mflr 0
455; 32BIT-NEXT:    stwu 1, -112(1)
456; 32BIT-NEXT:    stw 0, 120(1)
457; 32BIT-NEXT:    stfd 1, 136(1)
458; 32BIT-NEXT:    xsadddp 1, 1, 5
459; 32BIT-NEXT:    stw 24, 64(1) # 4-byte Folded Spill
460; 32BIT-NEXT:    lwz 24, 168(1)
461; 32BIT-NEXT:    stw 25, 68(1) # 4-byte Folded Spill
462; 32BIT-NEXT:    lwz 25, 188(1)
463; 32BIT-NEXT:    stw 26, 72(1) # 4-byte Folded Spill
464; 32BIT-NEXT:    stw 27, 76(1) # 4-byte Folded Spill
465; 32BIT-NEXT:    stw 28, 80(1) # 4-byte Folded Spill
466; 32BIT-NEXT:    stw 29, 84(1) # 4-byte Folded Spill
467; 32BIT-NEXT:    stw 30, 88(1) # 4-byte Folded Spill
468; 32BIT-NEXT:    stw 31, 92(1) # 4-byte Folded Spill
469; 32BIT-NEXT:    stfd 30, 96(1) # 8-byte Folded Spill
470; 32BIT-NEXT:    stfd 31, 104(1) # 8-byte Folded Spill
471; 32BIT-NEXT:    fmr 31, 3
472; 32BIT-NEXT:    fmr 30, 2
473; 32BIT-NEXT:    mr 31, 10
474; 32BIT-NEXT:    mr 30, 9
475; 32BIT-NEXT:    mr 29, 8
476; 32BIT-NEXT:    mr 28, 7
477; 32BIT-NEXT:    mr 27, 6
478; 32BIT-NEXT:    mr 26, 5
479; 32BIT-NEXT:    stfd 5, 192(1)
480; 32BIT-NEXT:    stfd 4, 180(1)
481; 32BIT-NEXT:    stfs 3, 176(1)
482; 32BIT-NEXT:    stfs 2, 172(1)
483; 32BIT-NEXT:    stw 10, 164(1)
484; 32BIT-NEXT:    stw 9, 160(1)
485; 32BIT-NEXT:    stw 8, 156(1)
486; 32BIT-NEXT:    stw 7, 152(1)
487; 32BIT-NEXT:    stw 6, 148(1)
488; 32BIT-NEXT:    stw 5, 144(1)
489; 32BIT-NEXT:    bl .consume_f64[PR]
490; 32BIT-NEXT:    nop
491; 32BIT-NEXT:    fadds 1, 30, 31
492; 32BIT-NEXT:    bl .consume_f32[PR]
493; 32BIT-NEXT:    nop
494; 32BIT-NEXT:    addc 3, 29, 27
495; 32BIT-NEXT:    adde 4, 28, 26
496; 32BIT-NEXT:    srawi 5, 30, 31
497; 32BIT-NEXT:    addc 3, 3, 30
498; 32BIT-NEXT:    adde 5, 4, 5
499; 32BIT-NEXT:    addc 4, 3, 24
500; 32BIT-NEXT:    adde 3, 5, 31
501; 32BIT-NEXT:    bl .consume_i64[PR]
502; 32BIT-NEXT:    nop
503; 32BIT-NEXT:    add 3, 25, 30
504; 32BIT-NEXT:    bl .consume_i32[PR]
505; 32BIT-NEXT:    nop
506; 32BIT-NEXT:    lfd 31, 104(1) # 8-byte Folded Reload
507; 32BIT-NEXT:    lfd 30, 96(1) # 8-byte Folded Reload
508; 32BIT-NEXT:    lwz 31, 92(1) # 4-byte Folded Reload
509; 32BIT-NEXT:    lwz 30, 88(1) # 4-byte Folded Reload
510; 32BIT-NEXT:    lwz 29, 84(1) # 4-byte Folded Reload
511; 32BIT-NEXT:    lwz 28, 80(1) # 4-byte Folded Reload
512; 32BIT-NEXT:    lwz 27, 76(1) # 4-byte Folded Reload
513; 32BIT-NEXT:    lwz 26, 72(1) # 4-byte Folded Reload
514; 32BIT-NEXT:    lwz 25, 68(1) # 4-byte Folded Reload
515; 32BIT-NEXT:    lwz 24, 64(1) # 4-byte Folded Reload
516; 32BIT-NEXT:    addi 1, 1, 112
517; 32BIT-NEXT:    lwz 0, 8(1)
518; 32BIT-NEXT:    mtlr 0
519; 32BIT-NEXT:    blr
520;
521; 64BIT-LABEL: mixed_1:
522; 64BIT:       # %bb.0: # %entry
523; 64BIT-NEXT:    mflr 0
524; 64BIT-NEXT:    stdu 1, -176(1)
525; 64BIT-NEXT:    std 0, 192(1)
526; 64BIT-NEXT:    stfd 1, 224(1)
527; 64BIT-NEXT:    xsadddp 1, 1, 5
528; 64BIT-NEXT:    std 27, 120(1) # 8-byte Folded Spill
529; 64BIT-NEXT:    lwz 27, 292(1)
530; 64BIT-NEXT:    std 28, 128(1) # 8-byte Folded Spill
531; 64BIT-NEXT:    std 29, 136(1) # 8-byte Folded Spill
532; 64BIT-NEXT:    std 30, 144(1) # 8-byte Folded Spill
533; 64BIT-NEXT:    std 31, 152(1) # 8-byte Folded Spill
534; 64BIT-NEXT:    stfd 30, 160(1) # 8-byte Folded Spill
535; 64BIT-NEXT:    stfd 31, 168(1) # 8-byte Folded Spill
536; 64BIT-NEXT:    fmr 31, 3
537; 64BIT-NEXT:    fmr 30, 2
538; 64BIT-NEXT:    mr 31, 7
539; 64BIT-NEXT:    mr 30, 6
540; 64BIT-NEXT:    mr 29, 5
541; 64BIT-NEXT:    mr 28, 4
542; 64BIT-NEXT:    stfd 5, 296(1)
543; 64BIT-NEXT:    stfd 4, 280(1)
544; 64BIT-NEXT:    stfs 3, 272(1)
545; 64BIT-NEXT:    stfs 2, 264(1)
546; 64BIT-NEXT:    std 7, 256(1)
547; 64BIT-NEXT:    std 6, 248(1)
548; 64BIT-NEXT:    std 5, 240(1)
549; 64BIT-NEXT:    std 4, 232(1)
550; 64BIT-NEXT:    bl .consume_f64[PR]
551; 64BIT-NEXT:    nop
552; 64BIT-NEXT:    fadds 1, 30, 31
553; 64BIT-NEXT:    bl .consume_f32[PR]
554; 64BIT-NEXT:    nop
555; 64BIT-NEXT:    add 3, 29, 28
556; 64BIT-NEXT:    add 3, 3, 30
557; 64BIT-NEXT:    add 3, 3, 31
558; 64BIT-NEXT:    bl .consume_i64[PR]
559; 64BIT-NEXT:    nop
560; 64BIT-NEXT:    add 3, 27, 30
561; 64BIT-NEXT:    extsw 3, 3
562; 64BIT-NEXT:    bl .consume_i32[PR]
563; 64BIT-NEXT:    nop
564; 64BIT-NEXT:    lfd 31, 168(1) # 8-byte Folded Reload
565; 64BIT-NEXT:    lfd 30, 160(1) # 8-byte Folded Reload
566; 64BIT-NEXT:    ld 31, 152(1) # 8-byte Folded Reload
567; 64BIT-NEXT:    ld 30, 144(1) # 8-byte Folded Reload
568; 64BIT-NEXT:    ld 29, 136(1) # 8-byte Folded Reload
569; 64BIT-NEXT:    ld 28, 128(1) # 8-byte Folded Reload
570; 64BIT-NEXT:    ld 27, 120(1) # 8-byte Folded Reload
571; 64BIT-NEXT:    addi 1, 1, 176
572; 64BIT-NEXT:    ld 0, 16(1)
573; 64BIT-NEXT:    mtlr 0
574; 64BIT-NEXT:    blr
575entry:
576  %add = fadd double %a, %j
577  tail call void @consume_f64(double %add)
578  %add1 = fadd float %f, %g
579  tail call void @consume_f32(float %add1)
580  %add2 = add nsw i64 %c, %b
581  %conv = sext i32 %d to i64
582  %add3 = add nsw i64 %add2, %conv
583  %add4 = add nsw i64 %add3, %e
584  tail call void @consume_i64(i64 %add4)
585  %add5 = add nsw i32 %i, %d
586  tail call void @consume_i32(i32 signext %add5)
587  ret void
588}
589
590define void @mixed_2(<2 x double> %a, <4 x i32> %b, i64 %c) #0 {
591; 32BIT-LABEL: mixed_2:
592; 32BIT:       # %bb.0: # %entry
593; 32BIT-NEXT:    mflr 0
594; 32BIT-NEXT:    stwu 1, -80(1)
595; 32BIT-NEXT:    li 5, 64
596; 32BIT-NEXT:    stw 0, 88(1)
597; 32BIT-NEXT:    stw 4, 140(1)
598; 32BIT-NEXT:    stw 3, 136(1)
599; 32BIT-NEXT:    stxvd2x 34, 1, 5 # 16-byte Folded Spill
600; 32BIT-NEXT:    addi 5, 1, 120
601; 32BIT-NEXT:    stxvw4x 35, 0, 5
602; 32BIT-NEXT:    addi 5, 1, 104
603; 32BIT-NEXT:    stxvd2x 34, 0, 5
604; 32BIT-NEXT:    lwz 5, 120(1)
605; 32BIT-NEXT:    srawi 6, 5, 31
606; 32BIT-NEXT:    addc 4, 5, 4
607; 32BIT-NEXT:    adde 3, 6, 3
608; 32BIT-NEXT:    bl .consume_i64[PR]
609; 32BIT-NEXT:    nop
610; 32BIT-NEXT:    li 3, 64
611; 32BIT-NEXT:    lxvd2x 1, 1, 3 # 16-byte Folded Reload
612; 32BIT-NEXT:    bl .consume_f64[PR]
613; 32BIT-NEXT:    nop
614; 32BIT-NEXT:    addi 1, 1, 80
615; 32BIT-NEXT:    lwz 0, 8(1)
616; 32BIT-NEXT:    mtlr 0
617; 32BIT-NEXT:    blr
618;
619; 64BIT-LABEL: mixed_2:
620; 64BIT:       # %bb.0: # %entry
621; 64BIT-NEXT:    mflr 0
622; 64BIT-NEXT:    stdu 1, -144(1)
623; 64BIT-NEXT:    li 4, 128
624; 64BIT-NEXT:    std 0, 160(1)
625; 64BIT-NEXT:    std 3, 224(1)
626; 64BIT-NEXT:    stxvd2x 34, 1, 4 # 16-byte Folded Spill
627; 64BIT-NEXT:    addi 4, 1, 208
628; 64BIT-NEXT:    stxvw4x 35, 0, 4
629; 64BIT-NEXT:    addi 4, 1, 192
630; 64BIT-NEXT:    stxvd2x 34, 0, 4
631; 64BIT-NEXT:    lwa 4, 208(1)
632; 64BIT-NEXT:    add 3, 4, 3
633; 64BIT-NEXT:    bl .consume_i64[PR]
634; 64BIT-NEXT:    nop
635; 64BIT-NEXT:    li 3, 128
636; 64BIT-NEXT:    lxvd2x 1, 1, 3 # 16-byte Folded Reload
637; 64BIT-NEXT:    bl .consume_f64[PR]
638; 64BIT-NEXT:    nop
639; 64BIT-NEXT:    addi 1, 1, 144
640; 64BIT-NEXT:    ld 0, 16(1)
641; 64BIT-NEXT:    mtlr 0
642; 64BIT-NEXT:    blr
643entry:
644  %vecext = extractelement <4 x i32> %b, i64 0
645  %conv = sext i32 %vecext to i64
646  %add = add nsw i64 %conv, %c
647  tail call void @consume_i64(i64 %add)
648  %vecext1 = extractelement <2 x double> %a, i64 0
649  tail call void @consume_f64(double %vecext1)
650  ret void
651}
652
653%struct.foo = type <{ [3 x i32], double, [12 x i8], <4 x i32> }>
654
655define void @mixed_3(<2 x double> %a, i64 %b, double %c, float %d, i32 signext %e, double %f, ...) #0 {
656; 32BIT-LABEL: mixed_3:
657; 32BIT:       # %bb.0: # %entry
658; 32BIT-NEXT:    mflr 0
659; 32BIT-NEXT:    stwu 1, -80(1)
660; 32BIT-NEXT:    xsadddp 0, 34, 3
661; 32BIT-NEXT:    stw 0, 88(1)
662; 32BIT-NEXT:    stfd 1, 128(1)
663; 32BIT-NEXT:    stw 29, 60(1) # 4-byte Folded Spill
664; 32BIT-NEXT:    addi 3, 1, 104
665; 32BIT-NEXT:    lwz 29, 148(1)
666; 32BIT-NEXT:    stw 30, 64(1) # 4-byte Folded Spill
667; 32BIT-NEXT:    stw 31, 68(1) # 4-byte Folded Spill
668; 32BIT-NEXT:    stfd 31, 72(1) # 8-byte Folded Spill
669; 32BIT-NEXT:    fmr 31, 2
670; 32BIT-NEXT:    mr 31, 10
671; 32BIT-NEXT:    mr 30, 9
672; 32BIT-NEXT:    xsadddp 1, 0, 1
673; 32BIT-NEXT:    stxvd2x 34, 0, 3
674; 32BIT-NEXT:    stfd 3, 144(1)
675; 32BIT-NEXT:    stfs 2, 136(1)
676; 32BIT-NEXT:    stw 10, 124(1)
677; 32BIT-NEXT:    stw 9, 120(1)
678; 32BIT-NEXT:    bl .consume_f64[PR]
679; 32BIT-NEXT:    nop
680; 32BIT-NEXT:    mr 3, 30
681; 32BIT-NEXT:    mr 4, 31
682; 32BIT-NEXT:    bl .consume_i64[PR]
683; 32BIT-NEXT:    nop
684; 32BIT-NEXT:    fmr 1, 31
685; 32BIT-NEXT:    bl .consume_f32[PR]
686; 32BIT-NEXT:    nop
687; 32BIT-NEXT:    mr 3, 29
688; 32BIT-NEXT:    bl .consume_i32[PR]
689; 32BIT-NEXT:    nop
690; 32BIT-NEXT:    lfd 31, 72(1) # 8-byte Folded Reload
691; 32BIT-NEXT:    lwz 31, 68(1) # 4-byte Folded Reload
692; 32BIT-NEXT:    lwz 30, 64(1) # 4-byte Folded Reload
693; 32BIT-NEXT:    lwz 29, 60(1) # 4-byte Folded Reload
694; 32BIT-NEXT:    addi 1, 1, 80
695; 32BIT-NEXT:    lwz 0, 8(1)
696; 32BIT-NEXT:    mtlr 0
697; 32BIT-NEXT:    blr
698; 32BIT: NumOfGPRsSaved = 3
699;
700; 64BIT-LABEL: mixed_3:
701; 64BIT:       # %bb.0: # %entry
702; 64BIT-NEXT:    mflr 0
703; 64BIT-NEXT:    stdu 1, -144(1)
704; 64BIT-NEXT:    xsadddp 0, 34, 3
705; 64BIT-NEXT:    std 0, 160(1)
706; 64BIT-NEXT:    stfd 1, 216(1)
707; 64BIT-NEXT:    addi 3, 1, 192
708; 64BIT-NEXT:    std 30, 120(1) # 8-byte Folded Spill
709; 64BIT-NEXT:    std 31, 128(1) # 8-byte Folded Spill
710; 64BIT-NEXT:    stfd 31, 136(1) # 8-byte Folded Spill
711; 64BIT-NEXT:    mr 31, 8
712; 64BIT-NEXT:    fmr 31, 2
713; 64BIT-NEXT:    mr 30, 5
714; 64BIT-NEXT:    stxvd2x 34, 0, 3
715; 64BIT-NEXT:    xsadddp 1, 0, 1
716; 64BIT-NEXT:    std 10, 248(1)
717; 64BIT-NEXT:    stfd 3, 240(1)
718; 64BIT-NEXT:    std 8, 232(1)
719; 64BIT-NEXT:    stfs 2, 224(1)
720; 64BIT-NEXT:    std 5, 208(1)
721; 64BIT-NEXT:    bl .consume_f64[PR]
722; 64BIT-NEXT:    nop
723; 64BIT-NEXT:    mr 3, 30
724; 64BIT-NEXT:    bl .consume_i64[PR]
725; 64BIT-NEXT:    nop
726; 64BIT-NEXT:    fmr 1, 31
727; 64BIT-NEXT:    bl .consume_f32[PR]
728; 64BIT-NEXT:    nop
729; 64BIT-NEXT:    mr 3, 31
730; 64BIT-NEXT:    bl .consume_i32[PR]
731; 64BIT-NEXT:    nop
732; 64BIT-NEXT:    lfd 31, 136(1) # 8-byte Folded Reload
733; 64BIT-NEXT:    ld 31, 128(1) # 8-byte Folded Reload
734; 64BIT-NEXT:    ld 30, 120(1) # 8-byte Folded Reload
735; 64BIT-NEXT:    addi 1, 1, 144
736; 64BIT-NEXT:    ld 0, 16(1)
737; 64BIT-NEXT:    mtlr 0
738; 64BIT-NEXT:    blr
739; 64BIT: NumOfGPRsSaved = 2
740entry:
741  %vecext = extractelement <2 x double> %a, i64 0
742  %add = fadd double %vecext, %f
743  %add1 = fadd double %add, %c
744  tail call void @consume_f64(double %add1)
745  tail call void @consume_i64(i64 %b)
746  tail call void @consume_f32(float %d)
747  tail call void @consume_i32(i32 signext %e)
748  ret void
749}
750
751define signext i32 @mixed_4(ptr byval(%struct.foo) align 16 %foo, i32 %sec) #0 {
752; 32BIT-LABEL: mixed_4:
753; 32BIT:       # %bb.0: # %entry
754; 32BIT-NEXT:    stw 9, 48(1)
755; 32BIT-NEXT:    stw 8, 44(1)
756; 32BIT-NEXT:    lfd 0, 44(1)
757; 32BIT-NEXT:    addi 3, 1, -4
758; 32BIT-NEXT:    xscvdpsxws 0, 0
759; 32BIT-NEXT:    stw 5, 32(1)
760; 32BIT-NEXT:    stw 6, 36(1)
761; 32BIT-NEXT:    stw 7, 40(1)
762; 32BIT-NEXT:    stw 10, 52(1)
763; 32BIT-NEXT:    stfiwx 0, 0, 3
764; 32BIT-NEXT:    lwz 3, -4(1)
765; 32BIT-NEXT:    lwz 4, 76(1)
766; 32BIT-NEXT:    add 3, 5, 3
767; 32BIT-NEXT:    add 3, 3, 4
768; 32BIT-NEXT:    blr
769;
770; 64BIT-LABEL: mixed_4:
771; 64BIT:       # %bb.0: # %entry
772; 64BIT-NEXT:    std 5, 64(1)
773; 64BIT-NEXT:    std 4, 56(1)
774; 64BIT-NEXT:    lfd 0, 60(1)
775; 64BIT-NEXT:    addi 4, 1, -4
776; 64BIT-NEXT:    xscvdpsxws 0, 0
777; 64BIT-NEXT:    std 3, 48(1)
778; 64BIT-NEXT:    std 6, 72(1)
779; 64BIT-NEXT:    std 7, 80(1)
780; 64BIT-NEXT:    std 8, 88(1)
781; 64BIT-NEXT:    std 9, 96(1)
782; 64BIT-NEXT:    rldicl 3, 3, 32, 32
783; 64BIT-NEXT:    stfiwx 0, 0, 4
784; 64BIT-NEXT:    lwz 4, -4(1)
785; 64BIT-NEXT:    add 3, 3, 4
786; 64BIT-NEXT:    add 3, 3, 8
787; 64BIT-NEXT:    extsw 3, 3
788; 64BIT-NEXT:    blr
789entry:
790  %0 = load i32, ptr %foo, align 16
791  %x = getelementptr inbounds i8, ptr %foo, i64 12
792  %1 = load double, ptr %x, align 4
793  %conv = fptosi double %1 to i32
794  %add = add nsw i32 %0, %conv
795  %2 = getelementptr inbounds i8, ptr %foo, i64 44
796  %vecext = load i32, ptr %2, align 4
797  %add1 = add nsw i32 %add, %vecext
798  ret i32 %add1
799}
800
801%struct.bar = type { i8, i32, <4 x i32>, ptr, i8 }
802
803define void @mixed_5(ptr byref(%struct.bar) align 16 %r, ptr byval(%struct.bar) align 16 %x, i32 signext %y, ptr byval(%struct.foo) align 16 %f) #0 {
804; 32BIT-LABEL: mixed_5:
805; 32BIT:       # %bb.0: # %entry
806; 32BIT-NEXT:    mflr 0
807; 32BIT-NEXT:    stwu 1, -64(1)
808; 32BIT-NEXT:    stw 0, 72(1)
809; 32BIT-NEXT:    stw 5, 96(1)
810; 32BIT-NEXT:    lfd 1, 172(1)
811; 32BIT-NEXT:    stw 6, 100(1)
812; 32BIT-NEXT:    stw 7, 104(1)
813; 32BIT-NEXT:    stw 8, 108(1)
814; 32BIT-NEXT:    stw 9, 112(1)
815; 32BIT-NEXT:    stw 10, 116(1)
816; 32BIT-NEXT:    stw 3, 88(1)
817; 32BIT-NEXT:    bl .consume_f64[PR]
818; 32BIT-NEXT:    nop
819; 32BIT-NEXT:    lwz 3, 100(1)
820; 32BIT-NEXT:    bl .consume_i32[PR]
821; 32BIT-NEXT:    nop
822; 32BIT-NEXT:    addi 1, 1, 64
823; 32BIT-NEXT:    lwz 0, 8(1)
824; 32BIT-NEXT:    mtlr 0
825; 32BIT-NEXT:    blr
826;
827; 64BIT-LABEL: mixed_5:
828; 64BIT:       # %bb.0: # %entry
829; 64BIT-NEXT:    mflr 0
830; 64BIT-NEXT:    stdu 1, -112(1)
831; 64BIT-NEXT:    std 0, 128(1)
832; 64BIT-NEXT:    std 5, 176(1)
833; 64BIT-NEXT:    lfd 1, 252(1)
834; 64BIT-NEXT:    std 6, 184(1)
835; 64BIT-NEXT:    std 7, 192(1)
836; 64BIT-NEXT:    std 8, 200(1)
837; 64BIT-NEXT:    std 9, 208(1)
838; 64BIT-NEXT:    std 10, 216(1)
839; 64BIT-NEXT:    std 3, 160(1)
840; 64BIT-NEXT:    bl .consume_f64[PR]
841; 64BIT-NEXT:    nop
842; 64BIT-NEXT:    lwa 3, 180(1)
843; 64BIT-NEXT:    bl .consume_i32[PR]
844; 64BIT-NEXT:    nop
845; 64BIT-NEXT:    addi 1, 1, 112
846; 64BIT-NEXT:    ld 0, 16(1)
847; 64BIT-NEXT:    mtlr 0
848; 64BIT-NEXT:    blr
849entry:
850  %d = getelementptr inbounds i8, ptr %f, i64 12
851  %0 = load double, ptr %d, align 4
852  tail call void @consume_f64(double %0)
853  %i = getelementptr inbounds i8, ptr %x, i64 4
854  %1 = load i32, ptr %i, align 4
855  tail call void @consume_i32(i32 signext %1)
856  ret void
857}
858
859declare void @foo()
860declare void @consume_f64(double)
861declare void @consume_f32(float)
862declare void @consume_i64(i64)
863declare void @consume_i32(i32 signext)
864
865attributes #0 = { nofree noinline nounwind "save-reg-params" }
866