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