1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mcpu=pwr9 -mtriple=powerpc64le-unknown-unknown -ppc-vsr-nums-as-vr \
3; RUN:   -verify-machineinstrs -ppc-asm-full-reg-names < %s | FileCheck %s
4; RUN: llc -mcpu=pwr8 -mtriple=powerpc64le-unknown-unknown -ppc-vsr-nums-as-vr \
5; RUN:   -verify-machineinstrs -ppc-asm-full-reg-names < %s | FileCheck %s \
6; RUN:   -check-prefix=CHECK-P8
7
8; Function Attrs: norecurse nounwind readnone
9define fp128 @loadConstant() {
10; CHECK-LABEL: loadConstant:
11; CHECK:       # %bb.0: # %entry
12; CHECK-NEXT:    addis r3, r2, .LCPI0_0@toc@ha
13; CHECK-NEXT:    addi r3, r3, .LCPI0_0@toc@l
14; CHECK-NEXT:    lxvx v2, 0, r3
15; CHECK-NEXT:    blr
16;
17; CHECK-P8-LABEL: loadConstant:
18; CHECK-P8:       # %bb.0: # %entry
19; CHECK-P8-NEXT:    addis r3, r2, .LCPI0_0@toc@ha
20; CHECK-P8-NEXT:    addi r3, r3, .LCPI0_0@toc@l
21; CHECK-P8-NEXT:    lvx v2, 0, r3
22; CHECK-P8-NEXT:    blr
23  entry:
24    ret fp128 0xL00000000000000004001400000000000
25}
26
27; Function Attrs: norecurse nounwind readnone
28define fp128 @loadConstant2(fp128 %a, fp128 %b) {
29; CHECK-LABEL: loadConstant2:
30; CHECK:       # %bb.0: # %entry
31; CHECK-NEXT:    xsaddqp v2, v2, v3
32; CHECK-NEXT:    addis r3, r2, .LCPI1_0@toc@ha
33; CHECK-NEXT:    addi r3, r3, .LCPI1_0@toc@l
34; CHECK-NEXT:    lxvx v3, 0, r3
35; CHECK-NEXT:    xsaddqp v2, v2, v3
36; CHECK-NEXT:    blr
37;
38; CHECK-P8-LABEL: loadConstant2:
39; CHECK-P8:       # %bb.0: # %entry
40; CHECK-P8-NEXT:    mflr r0
41; CHECK-P8-NEXT:    std r0, 16(r1)
42; CHECK-P8-NEXT:    stdu r1, -32(r1)
43; CHECK-P8-NEXT:    .cfi_def_cfa_offset 32
44; CHECK-P8-NEXT:    .cfi_offset lr, 16
45; CHECK-P8-NEXT:    bl __addkf3
46; CHECK-P8-NEXT:    nop
47; CHECK-P8-NEXT:    addis r3, r2, .LCPI1_0@toc@ha
48; CHECK-P8-NEXT:    addi r3, r3, .LCPI1_0@toc@l
49; CHECK-P8-NEXT:    lvx v3, 0, r3
50; CHECK-P8-NEXT:    bl __addkf3
51; CHECK-P8-NEXT:    nop
52; CHECK-P8-NEXT:    addi r1, r1, 32
53; CHECK-P8-NEXT:    ld r0, 16(r1)
54; CHECK-P8-NEXT:    mtlr r0
55; CHECK-P8-NEXT:    blr
56  entry:
57    %add = fadd fp128 %a, %b
58      %add1 = fadd fp128 %add, 0xL00000000000000004001400000000000
59        ret fp128 %add1
60}
61
62; Test passing float128 by value.
63; Function Attrs: norecurse nounwind readnone
64define signext i32 @fp128Param(fp128 %a) {
65; CHECK-LABEL: fp128Param:
66; CHECK:       # %bb.0: # %entry
67; CHECK-NEXT:    xscvqpswz v2, v2
68; CHECK-NEXT:    mfvsrwz r3, v2
69; CHECK-NEXT:    extsw r3, r3
70; CHECK-NEXT:    blr
71;
72; CHECK-P8-LABEL: fp128Param:
73; CHECK-P8:       # %bb.0: # %entry
74; CHECK-P8-NEXT:    mflr r0
75; CHECK-P8-NEXT:    std r0, 16(r1)
76; CHECK-P8-NEXT:    stdu r1, -32(r1)
77; CHECK-P8-NEXT:    .cfi_def_cfa_offset 32
78; CHECK-P8-NEXT:    .cfi_offset lr, 16
79; CHECK-P8-NEXT:    bl __fixkfsi
80; CHECK-P8-NEXT:    nop
81; CHECK-P8-NEXT:    extsw r3, r3
82; CHECK-P8-NEXT:    addi r1, r1, 32
83; CHECK-P8-NEXT:    ld r0, 16(r1)
84; CHECK-P8-NEXT:    mtlr r0
85; CHECK-P8-NEXT:    blr
86entry:
87  %conv = fptosi fp128 %a to i32
88  ret i32 %conv
89}
90
91; Test float128 as return value.
92; Function Attrs: norecurse nounwind readnone
93define fp128 @fp128Return(fp128 %a, fp128 %b) {
94; CHECK-LABEL: fp128Return:
95; CHECK:       # %bb.0: # %entry
96; CHECK-NEXT:    xsaddqp v2, v2, v3
97; CHECK-NEXT:    blr
98;
99; CHECK-P8-LABEL: fp128Return:
100; CHECK-P8:       # %bb.0: # %entry
101; CHECK-P8-NEXT:    mflr r0
102; CHECK-P8-NEXT:    std r0, 16(r1)
103; CHECK-P8-NEXT:    stdu r1, -32(r1)
104; CHECK-P8-NEXT:    .cfi_def_cfa_offset 32
105; CHECK-P8-NEXT:    .cfi_offset lr, 16
106; CHECK-P8-NEXT:    bl __addkf3
107; CHECK-P8-NEXT:    nop
108; CHECK-P8-NEXT:    addi r1, r1, 32
109; CHECK-P8-NEXT:    ld r0, 16(r1)
110; CHECK-P8-NEXT:    mtlr r0
111; CHECK-P8-NEXT:    blr
112entry:
113  %add = fadd fp128 %a, %b
114  ret fp128 %add
115}
116
117; array of float128 types
118; Function Attrs: norecurse nounwind readonly
119define fp128 @fp128Array(fp128* nocapture readonly %farray,
120; CHECK-LABEL: fp128Array:
121; CHECK:       # %bb.0: # %entry
122; CHECK-NEXT:    sldi r4, r4, 4
123; CHECK-NEXT:    lxv v2, 0(r3)
124; CHECK-NEXT:    add r3, r3, r4
125; CHECK-NEXT:    lxv v3, -16(r3)
126; CHECK-NEXT:    xsaddqp v2, v2, v3
127; CHECK-NEXT:    blr
128;
129; CHECK-P8-LABEL: fp128Array:
130; CHECK-P8:       # %bb.0: # %entry
131; CHECK-P8-NEXT:    mflr r0
132; CHECK-P8-NEXT:    std r0, 16(r1)
133; CHECK-P8-NEXT:    stdu r1, -32(r1)
134; CHECK-P8-NEXT:    .cfi_def_cfa_offset 32
135; CHECK-P8-NEXT:    .cfi_offset lr, 16
136; CHECK-P8-NEXT:    sldi r4, r4, 4
137; CHECK-P8-NEXT:    lvx v2, 0, r3
138; CHECK-P8-NEXT:    add r4, r3, r4
139; CHECK-P8-NEXT:    addi r4, r4, -16
140; CHECK-P8-NEXT:    lvx v3, 0, r4
141; CHECK-P8-NEXT:    bl __addkf3
142; CHECK-P8-NEXT:    nop
143; CHECK-P8-NEXT:    addi r1, r1, 32
144; CHECK-P8-NEXT:    ld r0, 16(r1)
145; CHECK-P8-NEXT:    mtlr r0
146; CHECK-P8-NEXT:    blr
147                         i32 signext %loopcnt, fp128* nocapture readnone %sum) {
148entry:
149  %0 = load fp128, fp128* %farray, align 16
150  %sub = add nsw i32 %loopcnt, -1
151  %idxprom = sext i32 %sub to i64
152  %arrayidx1 = getelementptr inbounds fp128, fp128* %farray, i64 %idxprom
153  %1 = load fp128, fp128* %arrayidx1, align 16
154  %add = fadd fp128 %0, %1
155  ret fp128 %add
156}
157
158; Up to 12 qualified floating-point arguments can be passed in v2-v13.
159; Function to test passing 13 float128 parameters.
160; Function Attrs: norecurse nounwind readnone
161define fp128 @maxVecParam(fp128 %p1, fp128 %p2, fp128 %p3, fp128 %p4, fp128 %p5,
162; CHECK-LABEL: maxVecParam:
163; CHECK:       # %bb.0: # %entry
164; CHECK-NEXT:    xsaddqp v2, v2, v3
165; CHECK-NEXT:    lxv v0, 224(r1)
166; CHECK-NEXT:    xsaddqp v2, v2, v4
167; CHECK-NEXT:    xsaddqp v2, v2, v5
168; CHECK-NEXT:    xsaddqp v2, v2, v6
169; CHECK-NEXT:    xsaddqp v2, v2, v7
170; CHECK-NEXT:    xsaddqp v2, v2, v8
171; CHECK-NEXT:    xsaddqp v2, v2, v9
172; CHECK-NEXT:    xsaddqp v2, v2, v10
173; CHECK-NEXT:    xsaddqp v2, v2, v11
174; CHECK-NEXT:    xsaddqp v2, v2, v12
175; CHECK-NEXT:    xsaddqp v2, v2, v13
176; CHECK-NEXT:    xssubqp v2, v2, v0
177; CHECK-NEXT:    blr
178;
179; CHECK-P8-LABEL: maxVecParam:
180; CHECK-P8:       # %bb.0: # %entry
181; CHECK-P8-NEXT:    mflr r0
182; CHECK-P8-NEXT:    std r0, 16(r1)
183; CHECK-P8-NEXT:    stdu r1, -224(r1)
184; CHECK-P8-NEXT:    .cfi_def_cfa_offset 224
185; CHECK-P8-NEXT:    .cfi_offset lr, 16
186; CHECK-P8-NEXT:    .cfi_offset v21, -176
187; CHECK-P8-NEXT:    .cfi_offset v22, -160
188; CHECK-P8-NEXT:    .cfi_offset v23, -144
189; CHECK-P8-NEXT:    .cfi_offset v24, -128
190; CHECK-P8-NEXT:    .cfi_offset v25, -112
191; CHECK-P8-NEXT:    .cfi_offset v26, -96
192; CHECK-P8-NEXT:    .cfi_offset v27, -80
193; CHECK-P8-NEXT:    .cfi_offset v28, -64
194; CHECK-P8-NEXT:    .cfi_offset v29, -48
195; CHECK-P8-NEXT:    .cfi_offset v30, -32
196; CHECK-P8-NEXT:    .cfi_offset v31, -16
197; CHECK-P8-NEXT:    li r3, 48
198; CHECK-P8-NEXT:    stvx v21, r1, r3 # 16-byte Folded Spill
199; CHECK-P8-NEXT:    li r3, 64
200; CHECK-P8-NEXT:    vmr v21, v4
201; CHECK-P8-NEXT:    stvx v22, r1, r3 # 16-byte Folded Spill
202; CHECK-P8-NEXT:    li r3, 80
203; CHECK-P8-NEXT:    vmr v22, v5
204; CHECK-P8-NEXT:    stvx v23, r1, r3 # 16-byte Folded Spill
205; CHECK-P8-NEXT:    li r3, 96
206; CHECK-P8-NEXT:    vmr v23, v6
207; CHECK-P8-NEXT:    stvx v24, r1, r3 # 16-byte Folded Spill
208; CHECK-P8-NEXT:    li r3, 112
209; CHECK-P8-NEXT:    vmr v24, v7
210; CHECK-P8-NEXT:    stvx v25, r1, r3 # 16-byte Folded Spill
211; CHECK-P8-NEXT:    li r3, 128
212; CHECK-P8-NEXT:    vmr v25, v8
213; CHECK-P8-NEXT:    stvx v26, r1, r3 # 16-byte Folded Spill
214; CHECK-P8-NEXT:    li r3, 144
215; CHECK-P8-NEXT:    vmr v26, v9
216; CHECK-P8-NEXT:    stvx v27, r1, r3 # 16-byte Folded Spill
217; CHECK-P8-NEXT:    li r3, 160
218; CHECK-P8-NEXT:    vmr v27, v10
219; CHECK-P8-NEXT:    stvx v28, r1, r3 # 16-byte Folded Spill
220; CHECK-P8-NEXT:    li r3, 176
221; CHECK-P8-NEXT:    vmr v28, v11
222; CHECK-P8-NEXT:    stvx v29, r1, r3 # 16-byte Folded Spill
223; CHECK-P8-NEXT:    li r3, 192
224; CHECK-P8-NEXT:    stvx v30, r1, r3 # 16-byte Folded Spill
225; CHECK-P8-NEXT:    li r3, 208
226; CHECK-P8-NEXT:    vmr v30, v12
227; CHECK-P8-NEXT:    stvx v31, r1, r3 # 16-byte Folded Spill
228; CHECK-P8-NEXT:    addi r3, r1, 448
229; CHECK-P8-NEXT:    vmr v31, v13
230; CHECK-P8-NEXT:    lvx v29, 0, r3
231; CHECK-P8-NEXT:    bl __addkf3
232; CHECK-P8-NEXT:    nop
233; CHECK-P8-NEXT:    vmr v3, v21
234; CHECK-P8-NEXT:    bl __addkf3
235; CHECK-P8-NEXT:    nop
236; CHECK-P8-NEXT:    vmr v3, v22
237; CHECK-P8-NEXT:    bl __addkf3
238; CHECK-P8-NEXT:    nop
239; CHECK-P8-NEXT:    vmr v3, v23
240; CHECK-P8-NEXT:    bl __addkf3
241; CHECK-P8-NEXT:    nop
242; CHECK-P8-NEXT:    vmr v3, v24
243; CHECK-P8-NEXT:    bl __addkf3
244; CHECK-P8-NEXT:    nop
245; CHECK-P8-NEXT:    vmr v3, v25
246; CHECK-P8-NEXT:    bl __addkf3
247; CHECK-P8-NEXT:    nop
248; CHECK-P8-NEXT:    vmr v3, v26
249; CHECK-P8-NEXT:    bl __addkf3
250; CHECK-P8-NEXT:    nop
251; CHECK-P8-NEXT:    vmr v3, v27
252; CHECK-P8-NEXT:    bl __addkf3
253; CHECK-P8-NEXT:    nop
254; CHECK-P8-NEXT:    vmr v3, v28
255; CHECK-P8-NEXT:    bl __addkf3
256; CHECK-P8-NEXT:    nop
257; CHECK-P8-NEXT:    vmr v3, v30
258; CHECK-P8-NEXT:    bl __addkf3
259; CHECK-P8-NEXT:    nop
260; CHECK-P8-NEXT:    vmr v3, v31
261; CHECK-P8-NEXT:    bl __addkf3
262; CHECK-P8-NEXT:    nop
263; CHECK-P8-NEXT:    vmr v3, v29
264; CHECK-P8-NEXT:    bl __subkf3
265; CHECK-P8-NEXT:    nop
266; CHECK-P8-NEXT:    li r3, 208
267; CHECK-P8-NEXT:    lvx v31, r1, r3 # 16-byte Folded Reload
268; CHECK-P8-NEXT:    li r3, 192
269; CHECK-P8-NEXT:    lvx v30, r1, r3 # 16-byte Folded Reload
270; CHECK-P8-NEXT:    li r3, 176
271; CHECK-P8-NEXT:    lvx v29, r1, r3 # 16-byte Folded Reload
272; CHECK-P8-NEXT:    li r3, 160
273; CHECK-P8-NEXT:    lvx v28, r1, r3 # 16-byte Folded Reload
274; CHECK-P8-NEXT:    li r3, 144
275; CHECK-P8-NEXT:    lvx v27, r1, r3 # 16-byte Folded Reload
276; CHECK-P8-NEXT:    li r3, 128
277; CHECK-P8-NEXT:    lvx v26, r1, r3 # 16-byte Folded Reload
278; CHECK-P8-NEXT:    li r3, 112
279; CHECK-P8-NEXT:    lvx v25, r1, r3 # 16-byte Folded Reload
280; CHECK-P8-NEXT:    li r3, 96
281; CHECK-P8-NEXT:    lvx v24, r1, r3 # 16-byte Folded Reload
282; CHECK-P8-NEXT:    li r3, 80
283; CHECK-P8-NEXT:    lvx v23, r1, r3 # 16-byte Folded Reload
284; CHECK-P8-NEXT:    li r3, 64
285; CHECK-P8-NEXT:    lvx v22, r1, r3 # 16-byte Folded Reload
286; CHECK-P8-NEXT:    li r3, 48
287; CHECK-P8-NEXT:    lvx v21, r1, r3 # 16-byte Folded Reload
288; CHECK-P8-NEXT:    addi r1, r1, 224
289; CHECK-P8-NEXT:    ld r0, 16(r1)
290; CHECK-P8-NEXT:    mtlr r0
291; CHECK-P8-NEXT:    blr
292                          fp128 %p6, fp128 %p7, fp128 %p8, fp128 %p9, fp128 %p10,
293                          fp128 %p11, fp128 %p12, fp128 %p13) {
294entry:
295  %add = fadd fp128 %p1, %p2
296  %add1 = fadd fp128 %add, %p3
297  %add2 = fadd fp128 %add1, %p4
298  %add3 = fadd fp128 %add2, %p5
299  %add4 = fadd fp128 %add3, %p6
300  %add5 = fadd fp128 %add4, %p7
301  %add6 = fadd fp128 %add5, %p8
302  %add7 = fadd fp128 %add6, %p9
303  %add8 = fadd fp128 %add7, %p10
304  %add9 = fadd fp128 %add8, %p11
305  %add10 = fadd fp128 %add9, %p12
306  %sub = fsub fp128 %add10, %p13
307  ret fp128 %sub
308}
309
310; Passing a mix of float128 and other type parameters.
311; Function Attrs: norecurse nounwind readnone
312define fp128 @mixParam_01(fp128 %a, i32 signext %i, fp128 %b) {
313; CHECK-LABEL: mixParam_01:
314; CHECK:       # %bb.0: # %entry
315; CHECK-NEXT:    xsaddqp v2, v2, v3
316; CHECK-NEXT:    mtvsrwa v3, r5
317; CHECK-NEXT:    xscvsdqp v3, v3
318; CHECK-NEXT:    xsaddqp v2, v2, v3
319; CHECK-NEXT:    blr
320;
321; CHECK-P8-LABEL: mixParam_01:
322; CHECK-P8:       # %bb.0: # %entry
323; CHECK-P8-NEXT:    mflr r0
324; CHECK-P8-NEXT:    std r0, 16(r1)
325; CHECK-P8-NEXT:    stdu r1, -80(r1)
326; CHECK-P8-NEXT:    .cfi_def_cfa_offset 80
327; CHECK-P8-NEXT:    .cfi_offset lr, 16
328; CHECK-P8-NEXT:    .cfi_offset r30, -16
329; CHECK-P8-NEXT:    .cfi_offset v31, -32
330; CHECK-P8-NEXT:    li r3, 48
331; CHECK-P8-NEXT:    std r30, 64(r1) # 8-byte Folded Spill
332; CHECK-P8-NEXT:    mr r30, r5
333; CHECK-P8-NEXT:    stvx v31, r1, r3 # 16-byte Folded Spill
334; CHECK-P8-NEXT:    bl __addkf3
335; CHECK-P8-NEXT:    nop
336; CHECK-P8-NEXT:    mr r3, r30
337; CHECK-P8-NEXT:    vmr v31, v2
338; CHECK-P8-NEXT:    bl __floatsikf
339; CHECK-P8-NEXT:    nop
340; CHECK-P8-NEXT:    vmr v3, v2
341; CHECK-P8-NEXT:    vmr v2, v31
342; CHECK-P8-NEXT:    bl __addkf3
343; CHECK-P8-NEXT:    nop
344; CHECK-P8-NEXT:    li r3, 48
345; CHECK-P8-NEXT:    ld r30, 64(r1) # 8-byte Folded Reload
346; CHECK-P8-NEXT:    lvx v31, r1, r3 # 16-byte Folded Reload
347; CHECK-P8-NEXT:    addi r1, r1, 80
348; CHECK-P8-NEXT:    ld r0, 16(r1)
349; CHECK-P8-NEXT:    mtlr r0
350; CHECK-P8-NEXT:    blr
351entry:
352  %add = fadd fp128 %a, %b
353  %conv = sitofp i32 %i to fp128
354  %add1 = fadd fp128 %add, %conv
355  ret fp128 %add1
356}
357; Function Attrs: norecurse nounwind readnone
358define fastcc fp128 @mixParam_01f(fp128 %a, i32 signext %i, fp128 %b) {
359; CHECK-LABEL: mixParam_01f:
360; CHECK:       # %bb.0: # %entry
361; CHECK-NEXT:    xsaddqp v2, v2, v3
362; CHECK-NEXT:    mtvsrwa v3, r3
363; CHECK-NEXT:    xscvsdqp v3, v3
364; CHECK-NEXT:    xsaddqp v2, v2, v3
365; CHECK-NEXT:    blr
366;
367; CHECK-P8-LABEL: mixParam_01f:
368; CHECK-P8:       # %bb.0: # %entry
369; CHECK-P8-NEXT:    mflr r0
370; CHECK-P8-NEXT:    std r0, 16(r1)
371; CHECK-P8-NEXT:    stdu r1, -80(r1)
372; CHECK-P8-NEXT:    .cfi_def_cfa_offset 80
373; CHECK-P8-NEXT:    .cfi_offset lr, 16
374; CHECK-P8-NEXT:    .cfi_offset r30, -16
375; CHECK-P8-NEXT:    .cfi_offset v31, -32
376; CHECK-P8-NEXT:    li r4, 48
377; CHECK-P8-NEXT:    std r30, 64(r1) # 8-byte Folded Spill
378; CHECK-P8-NEXT:    mr r30, r3
379; CHECK-P8-NEXT:    stvx v31, r1, r4 # 16-byte Folded Spill
380; CHECK-P8-NEXT:    bl __addkf3
381; CHECK-P8-NEXT:    nop
382; CHECK-P8-NEXT:    mr r3, r30
383; CHECK-P8-NEXT:    vmr v31, v2
384; CHECK-P8-NEXT:    bl __floatsikf
385; CHECK-P8-NEXT:    nop
386; CHECK-P8-NEXT:    vmr v3, v2
387; CHECK-P8-NEXT:    vmr v2, v31
388; CHECK-P8-NEXT:    bl __addkf3
389; CHECK-P8-NEXT:    nop
390; CHECK-P8-NEXT:    li r3, 48
391; CHECK-P8-NEXT:    ld r30, 64(r1) # 8-byte Folded Reload
392; CHECK-P8-NEXT:    lvx v31, r1, r3 # 16-byte Folded Reload
393; CHECK-P8-NEXT:    addi r1, r1, 80
394; CHECK-P8-NEXT:    ld r0, 16(r1)
395; CHECK-P8-NEXT:    mtlr r0
396; CHECK-P8-NEXT:    blr
397entry:
398  %add = fadd fp128 %a, %b
399  %conv = sitofp i32 %i to fp128
400  %add1 = fadd fp128 %add, %conv
401  ret fp128 %add1
402}
403
404; Function Attrs: norecurse nounwind
405define fp128 @mixParam_02(fp128 %p1, double %p2, i64* nocapture %p3,
406; CHECK-LABEL: mixParam_02:
407; CHECK:       # %bb.0: # %entry
408; CHECK-NEXT:    lwz r3, 96(r1)
409; CHECK-NEXT:    add r4, r7, r9
410; CHECK-NEXT:    xscpsgndp v3, f1, f1
411; CHECK-NEXT:    add r4, r4, r10
412; CHECK-NEXT:    xscvdpqp v3, v3
413; CHECK-NEXT:    add r3, r4, r3
414; CHECK-NEXT:    clrldi r3, r3, 32
415; CHECK-NEXT:    std r3, 0(r6)
416; CHECK-NEXT:    lxv v4, 0(r8)
417; CHECK-NEXT:    xsaddqp v2, v4, v2
418; CHECK-NEXT:    xsaddqp v2, v2, v3
419; CHECK-NEXT:    blr
420;
421; CHECK-P8-LABEL: mixParam_02:
422; CHECK-P8:       # %bb.0: # %entry
423; CHECK-P8-NEXT:    mflr r0
424; CHECK-P8-NEXT:    std r0, 16(r1)
425; CHECK-P8-NEXT:    stdu r1, -80(r1)
426; CHECK-P8-NEXT:    .cfi_def_cfa_offset 80
427; CHECK-P8-NEXT:    .cfi_offset lr, 16
428; CHECK-P8-NEXT:    .cfi_offset f31, -8
429; CHECK-P8-NEXT:    .cfi_offset v31, -32
430; CHECK-P8-NEXT:    li r3, 48
431; CHECK-P8-NEXT:    add r4, r7, r9
432; CHECK-P8-NEXT:    vmr v4, v2
433; CHECK-P8-NEXT:    stfd f31, 72(r1) # 8-byte Folded Spill
434; CHECK-P8-NEXT:    stvx v31, r1, r3 # 16-byte Folded Spill
435; CHECK-P8-NEXT:    lwz r3, 176(r1)
436; CHECK-P8-NEXT:    add r4, r4, r10
437; CHECK-P8-NEXT:    fmr f31, f1
438; CHECK-P8-NEXT:    add r3, r4, r3
439; CHECK-P8-NEXT:    clrldi r3, r3, 32
440; CHECK-P8-NEXT:    std r3, 0(r6)
441; CHECK-P8-NEXT:    lvx v3, 0, r8
442; CHECK-P8-NEXT:    vmr v2, v3
443; CHECK-P8-NEXT:    vmr v3, v4
444; CHECK-P8-NEXT:    bl __addkf3
445; CHECK-P8-NEXT:    nop
446; CHECK-P8-NEXT:    fmr f1, f31
447; CHECK-P8-NEXT:    vmr v31, v2
448; CHECK-P8-NEXT:    bl __extenddfkf2
449; CHECK-P8-NEXT:    nop
450; CHECK-P8-NEXT:    vmr v3, v2
451; CHECK-P8-NEXT:    vmr v2, v31
452; CHECK-P8-NEXT:    bl __addkf3
453; CHECK-P8-NEXT:    nop
454; CHECK-P8-NEXT:    li r3, 48
455; CHECK-P8-NEXT:    lfd f31, 72(r1) # 8-byte Folded Reload
456; CHECK-P8-NEXT:    lvx v31, r1, r3 # 16-byte Folded Reload
457; CHECK-P8-NEXT:    addi r1, r1, 80
458; CHECK-P8-NEXT:    ld r0, 16(r1)
459; CHECK-P8-NEXT:    mtlr r0
460; CHECK-P8-NEXT:    blr
461                          i16 signext %p4, fp128* nocapture readonly %p5,
462                          i32 signext %p6, i8 zeroext %p7, i32 zeroext %p8) {
463entry:
464  %conv = sext i16 %p4 to i32
465  %add = add nsw i32 %conv, %p6
466  %conv1 = zext i8 %p7 to i32
467  %add2 = add nsw i32 %add, %conv1
468  %add3 = add i32 %add2, %p8
469  %conv4 = zext i32 %add3 to i64
470  store i64 %conv4, i64* %p3, align 8
471  %0 = load fp128, fp128* %p5, align 16
472  %add5 = fadd fp128 %0, %p1
473  %conv6 = fpext double %p2 to fp128
474  %add7 = fadd fp128 %add5, %conv6
475  ret fp128 %add7
476}
477
478; Function Attrs: norecurse nounwind
479define fastcc fp128 @mixParam_02f(fp128 %p1, double %p2, i64* nocapture %p3,
480; CHECK-LABEL: mixParam_02f:
481; CHECK:       # %bb.0: # %entry
482; CHECK-NEXT:    add r4, r4, r6
483; CHECK-NEXT:    xscpsgndp v3, f1, f1
484; CHECK-NEXT:    add r4, r4, r7
485; CHECK-NEXT:    xscvdpqp v3, v3
486; CHECK-NEXT:    add r4, r4, r8
487; CHECK-NEXT:    clrldi r4, r4, 32
488; CHECK-NEXT:    std r4, 0(r3)
489; CHECK-NEXT:    lxv v4, 0(r5)
490; CHECK-NEXT:    xsaddqp v2, v4, v2
491; CHECK-NEXT:    xsaddqp v2, v2, v3
492; CHECK-NEXT:    blr
493;
494; CHECK-P8-LABEL: mixParam_02f:
495; CHECK-P8:       # %bb.0: # %entry
496; CHECK-P8-NEXT:    mflr r0
497; CHECK-P8-NEXT:    std r0, 16(r1)
498; CHECK-P8-NEXT:    stdu r1, -80(r1)
499; CHECK-P8-NEXT:    .cfi_def_cfa_offset 80
500; CHECK-P8-NEXT:    .cfi_offset lr, 16
501; CHECK-P8-NEXT:    .cfi_offset f31, -8
502; CHECK-P8-NEXT:    .cfi_offset v31, -32
503; CHECK-P8-NEXT:    add r4, r4, r6
504; CHECK-P8-NEXT:    vmr v4, v2
505; CHECK-P8-NEXT:    li r9, 48
506; CHECK-P8-NEXT:    stfd f31, 72(r1) # 8-byte Folded Spill
507; CHECK-P8-NEXT:    add r4, r4, r7
508; CHECK-P8-NEXT:    stvx v31, r1, r9 # 16-byte Folded Spill
509; CHECK-P8-NEXT:    fmr f31, f1
510; CHECK-P8-NEXT:    add r4, r4, r8
511; CHECK-P8-NEXT:    clrldi r4, r4, 32
512; CHECK-P8-NEXT:    std r4, 0(r3)
513; CHECK-P8-NEXT:    lvx v3, 0, r5
514; CHECK-P8-NEXT:    vmr v2, v3
515; CHECK-P8-NEXT:    vmr v3, v4
516; CHECK-P8-NEXT:    bl __addkf3
517; CHECK-P8-NEXT:    nop
518; CHECK-P8-NEXT:    fmr f1, f31
519; CHECK-P8-NEXT:    vmr v31, v2
520; CHECK-P8-NEXT:    bl __extenddfkf2
521; CHECK-P8-NEXT:    nop
522; CHECK-P8-NEXT:    vmr v3, v2
523; CHECK-P8-NEXT:    vmr v2, v31
524; CHECK-P8-NEXT:    bl __addkf3
525; CHECK-P8-NEXT:    nop
526; CHECK-P8-NEXT:    li r3, 48
527; CHECK-P8-NEXT:    lfd f31, 72(r1) # 8-byte Folded Reload
528; CHECK-P8-NEXT:    lvx v31, r1, r3 # 16-byte Folded Reload
529; CHECK-P8-NEXT:    addi r1, r1, 80
530; CHECK-P8-NEXT:    ld r0, 16(r1)
531; CHECK-P8-NEXT:    mtlr r0
532; CHECK-P8-NEXT:    blr
533                                  i16 signext %p4, fp128* nocapture readonly %p5,
534                                  i32 signext %p6, i8 zeroext %p7, i32 zeroext %p8) {
535entry:
536  %conv = sext i16 %p4 to i32
537  %add = add nsw i32 %conv, %p6
538  %conv1 = zext i8 %p7 to i32
539  %add2 = add nsw i32 %add, %conv1
540  %add3 = add i32 %add2, %p8
541  %conv4 = zext i32 %add3 to i64
542  store i64 %conv4, i64* %p3, align 8
543  %0 = load fp128, fp128* %p5, align 16
544  %add5 = fadd fp128 %0, %p1
545  %conv6 = fpext double %p2 to fp128
546  %add7 = fadd fp128 %add5, %conv6
547  ret fp128 %add7
548}
549
550; Passing a mix of float128 and vector parameters.
551; Function Attrs: norecurse nounwind
552define void @mixParam_03(fp128 %f1, double* nocapture %d1, <4 x i32> %vec1,
553; CHECK-LABEL: mixParam_03:
554; CHECK:       # %bb.0: # %entry
555; CHECK-NEXT:    ld r3, 104(r1)
556; CHECK-NEXT:    stxv v2, 0(r9)
557; CHECK-NEXT:    stxvx v3, 0, r3
558; CHECK-NEXT:    mtvsrwa v3, r10
559; CHECK-NEXT:    lxv v2, 0(r9)
560; CHECK-NEXT:    xscvsdqp v3, v3
561; CHECK-NEXT:    xsaddqp v2, v2, v3
562; CHECK-NEXT:    xscvqpdp v2, v2
563; CHECK-NEXT:    stxsd v2, 0(r5)
564; CHECK-NEXT:    blr
565;
566; CHECK-P8-LABEL: mixParam_03:
567; CHECK-P8:       # %bb.0: # %entry
568; CHECK-P8-NEXT:    mflr r0
569; CHECK-P8-NEXT:    std r0, 16(r1)
570; CHECK-P8-NEXT:    stdu r1, -80(r1)
571; CHECK-P8-NEXT:    .cfi_def_cfa_offset 80
572; CHECK-P8-NEXT:    .cfi_offset lr, 16
573; CHECK-P8-NEXT:    .cfi_offset r30, -16
574; CHECK-P8-NEXT:    .cfi_offset v31, -32
575; CHECK-P8-NEXT:    ld r4, 184(r1)
576; CHECK-P8-NEXT:    li r3, 48
577; CHECK-P8-NEXT:    stvx v2, 0, r9
578; CHECK-P8-NEXT:    std r30, 64(r1) # 8-byte Folded Spill
579; CHECK-P8-NEXT:    mr r30, r5
580; CHECK-P8-NEXT:    stvx v31, r1, r3 # 16-byte Folded Spill
581; CHECK-P8-NEXT:    mr r3, r10
582; CHECK-P8-NEXT:    stvx v3, 0, r4
583; CHECK-P8-NEXT:    lvx v31, 0, r9
584; CHECK-P8-NEXT:    bl __floatsikf
585; CHECK-P8-NEXT:    nop
586; CHECK-P8-NEXT:    vmr v3, v2
587; CHECK-P8-NEXT:    vmr v2, v31
588; CHECK-P8-NEXT:    bl __addkf3
589; CHECK-P8-NEXT:    nop
590; CHECK-P8-NEXT:    bl __trunckfdf2
591; CHECK-P8-NEXT:    nop
592; CHECK-P8-NEXT:    li r3, 48
593; CHECK-P8-NEXT:    stfdx f1, 0, r30
594; CHECK-P8-NEXT:    ld r30, 64(r1) # 8-byte Folded Reload
595; CHECK-P8-NEXT:    lvx v31, r1, r3 # 16-byte Folded Reload
596; CHECK-P8-NEXT:    addi r1, r1, 80
597; CHECK-P8-NEXT:    ld r0, 16(r1)
598; CHECK-P8-NEXT:    mtlr r0
599; CHECK-P8-NEXT:    blr
600                         fp128* nocapture %f2, i32 signext %i1, i8 zeroext %c1,
601                         <4 x i32>* nocapture %vec2) {
602entry:
603  store fp128 %f1, fp128* %f2, align 16
604  store <4 x i32> %vec1, <4 x i32>* %vec2, align 16
605  %0 = load fp128, fp128* %f2, align 16
606  %conv = sitofp i32 %i1 to fp128
607  %add = fadd fp128 %0, %conv
608  %conv1 = fptrunc fp128 %add to double
609  store double %conv1, double* %d1, align 8
610  ret void
611}
612
613; Function Attrs: norecurse nounwind
614define fastcc void @mixParam_03f(fp128 %f1, double* nocapture %d1, <4 x i32> %vec1,
615; CHECK-LABEL: mixParam_03f:
616; CHECK:       # %bb.0: # %entry
617; CHECK-NEXT:    stxv v2, 0(r4)
618; CHECK-NEXT:    stxv v3, 0(r7)
619; CHECK-NEXT:    lxv v2, 0(r4)
620; CHECK-NEXT:    mtvsrwa v3, r5
621; CHECK-NEXT:    xscvsdqp v3, v3
622; CHECK-NEXT:    xsaddqp v2, v2, v3
623; CHECK-NEXT:    xscvqpdp v2, v2
624; CHECK-NEXT:    stxsd v2, 0(r3)
625; CHECK-NEXT:    blr
626;
627; CHECK-P8-LABEL: mixParam_03f:
628; CHECK-P8:       # %bb.0: # %entry
629; CHECK-P8-NEXT:    mflr r0
630; CHECK-P8-NEXT:    std r0, 16(r1)
631; CHECK-P8-NEXT:    stdu r1, -80(r1)
632; CHECK-P8-NEXT:    .cfi_def_cfa_offset 80
633; CHECK-P8-NEXT:    .cfi_offset lr, 16
634; CHECK-P8-NEXT:    .cfi_offset r30, -16
635; CHECK-P8-NEXT:    .cfi_offset v31, -32
636; CHECK-P8-NEXT:    li r6, 48
637; CHECK-P8-NEXT:    stvx v2, 0, r4
638; CHECK-P8-NEXT:    stvx v3, 0, r7
639; CHECK-P8-NEXT:    std r30, 64(r1) # 8-byte Folded Spill
640; CHECK-P8-NEXT:    mr r30, r3
641; CHECK-P8-NEXT:    mr r3, r5
642; CHECK-P8-NEXT:    stvx v31, r1, r6 # 16-byte Folded Spill
643; CHECK-P8-NEXT:    lvx v31, 0, r4
644; CHECK-P8-NEXT:    bl __floatsikf
645; CHECK-P8-NEXT:    nop
646; CHECK-P8-NEXT:    vmr v3, v2
647; CHECK-P8-NEXT:    vmr v2, v31
648; CHECK-P8-NEXT:    bl __addkf3
649; CHECK-P8-NEXT:    nop
650; CHECK-P8-NEXT:    bl __trunckfdf2
651; CHECK-P8-NEXT:    nop
652; CHECK-P8-NEXT:    li r3, 48
653; CHECK-P8-NEXT:    stfdx f1, 0, r30
654; CHECK-P8-NEXT:    ld r30, 64(r1) # 8-byte Folded Reload
655; CHECK-P8-NEXT:    lvx v31, r1, r3 # 16-byte Folded Reload
656; CHECK-P8-NEXT:    addi r1, r1, 80
657; CHECK-P8-NEXT:    ld r0, 16(r1)
658; CHECK-P8-NEXT:    mtlr r0
659; CHECK-P8-NEXT:    blr
660                                 fp128* nocapture %f2, i32 signext %i1, i8 zeroext %c1,
661                                 <4 x i32>* nocapture %vec2) {
662entry:
663  store fp128 %f1, fp128* %f2, align 16
664  store <4 x i32> %vec1, <4 x i32>* %vec2, align 16
665  %0 = load fp128, fp128* %f2, align 16
666  %conv = sitofp i32 %i1 to fp128
667  %add = fadd fp128 %0, %conv
668  %conv1 = fptrunc fp128 %add to double
669  store double %conv1, double* %d1, align 8
670  ret void
671}
672
673; Function Attrs: noinline optnone
674define signext i32 @noopt_call_crash() #0 {
675; CHECK-LABEL: noopt_call_crash:
676; CHECK:       # %bb.0: # %entry
677; CHECK-NEXT:    mflr r0
678; CHECK-NEXT:    std r0, 16(r1)
679; CHECK-NEXT:    stdu r1, -96(r1)
680; CHECK-NEXT:    .cfi_def_cfa_offset 96
681; CHECK-NEXT:    .cfi_offset lr, 16
682; CHECK-NEXT:    bl in
683; CHECK-NEXT:    nop
684; CHECK-NEXT:    bl out
685; CHECK-NEXT:    nop
686; CHECK-NEXT:    li r3, 0
687; CHECK-NEXT:    addi r1, r1, 96
688; CHECK-NEXT:    ld r0, 16(r1)
689; CHECK-NEXT:    mtlr r0
690; CHECK-NEXT:    blr
691;
692; CHECK-P8-LABEL: noopt_call_crash:
693; CHECK-P8:       # %bb.0: # %entry
694; CHECK-P8-NEXT:    mflr r0
695; CHECK-P8-NEXT:    std r0, 16(r1)
696; CHECK-P8-NEXT:    stdu r1, -96(r1)
697; CHECK-P8-NEXT:    .cfi_def_cfa_offset 96
698; CHECK-P8-NEXT:    .cfi_offset lr, 16
699; CHECK-P8-NEXT:    bl in
700; CHECK-P8-NEXT:    nop
701; CHECK-P8-NEXT:    bl out
702; CHECK-P8-NEXT:    nop
703; CHECK-P8-NEXT:    li r3, 0
704; CHECK-P8-NEXT:    addi r1, r1, 96
705; CHECK-P8-NEXT:    ld r0, 16(r1)
706; CHECK-P8-NEXT:    mtlr r0
707; CHECK-P8-NEXT:    blr
708entry:
709  %call = call fp128 @in()
710  call void @out(fp128 %call)
711  ret i32 0
712}
713
714declare void @out(fp128)
715declare fp128 @in()
716
717attributes #0 = { noinline optnone }
718