• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mcpu=pwr9 -mtriple=powerpc64le-unknown-unknown \
3; RUN:   -ppc-vsr-nums-as-vr -ppc-asm-full-reg-names < %s | FileCheck %s
4; RUN: llc -mcpu=pwr8 -mtriple=powerpc64le-unknown-unknown \
5; RUN:   -ppc-vsr-nums-as-vr -ppc-asm-full-reg-names < %s | FileCheck %s \
6; RUN:   -check-prefix=CHECK-P8
7
8define void @qpFmadd(fp128* nocapture readonly %a, fp128* nocapture %b,
9; CHECK-LABEL: qpFmadd:
10; CHECK:       # %bb.0: # %entry
11; CHECK-NEXT:    lxv v2, 0(r3)
12; CHECK-NEXT:    lxv v3, 0(r4)
13; CHECK-NEXT:    lxv v4, 0(r5)
14; CHECK-NEXT:    xsmaddqp v4, v2, v3
15; CHECK-NEXT:    stxv v4, 0(r6)
16; CHECK-NEXT:    blr
17;
18; CHECK-P8-LABEL: qpFmadd:
19; CHECK-P8:       # %bb.0: # %entry
20; CHECK-P8-NEXT:    mflr r0
21; CHECK-P8-NEXT:    .cfi_def_cfa_offset 64
22; CHECK-P8-NEXT:    .cfi_offset lr, 16
23; CHECK-P8-NEXT:    .cfi_offset r28, -32
24; CHECK-P8-NEXT:    .cfi_offset r29, -24
25; CHECK-P8-NEXT:    .cfi_offset r30, -16
26; CHECK-P8-NEXT:    std r28, -32(r1) # 8-byte Folded Spill
27; CHECK-P8-NEXT:    std r29, -24(r1) # 8-byte Folded Spill
28; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
29; CHECK-P8-NEXT:    std r0, 16(r1)
30; CHECK-P8-NEXT:    stdu r1, -64(r1)
31; CHECK-P8-NEXT:    ld r7, 0(r3)
32; CHECK-P8-NEXT:    ld r8, 8(r3)
33; CHECK-P8-NEXT:    ld r9, 0(r4)
34; CHECK-P8-NEXT:    ld r10, 8(r4)
35; CHECK-P8-NEXT:    mr r28, r6
36; CHECK-P8-NEXT:    ld r30, 0(r5)
37; CHECK-P8-NEXT:    ld r29, 8(r5)
38; CHECK-P8-NEXT:    mr r3, r7
39; CHECK-P8-NEXT:    mr r4, r8
40; CHECK-P8-NEXT:    mr r5, r9
41; CHECK-P8-NEXT:    mr r6, r10
42; CHECK-P8-NEXT:    bl __mulkf3
43; CHECK-P8-NEXT:    nop
44; CHECK-P8-NEXT:    mr r5, r30
45; CHECK-P8-NEXT:    mr r6, r29
46; CHECK-P8-NEXT:    bl __addkf3
47; CHECK-P8-NEXT:    nop
48; CHECK-P8-NEXT:    std r3, 0(r28)
49; CHECK-P8-NEXT:    std r4, 8(r28)
50; CHECK-P8-NEXT:    addi r1, r1, 64
51; CHECK-P8-NEXT:    ld r0, 16(r1)
52; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
53; CHECK-P8-NEXT:    ld r29, -24(r1) # 8-byte Folded Reload
54; CHECK-P8-NEXT:    ld r28, -32(r1) # 8-byte Folded Reload
55; CHECK-P8-NEXT:    mtlr r0
56; CHECK-P8-NEXT:    blr
57                   fp128* nocapture readonly %c, fp128* nocapture %res) {
58entry:
59  %0 = load fp128, fp128* %a, align 16
60  %1 = load fp128, fp128* %b, align 16
61  %2 = load fp128, fp128* %c, align 16
62  %madd = tail call fp128 @llvm.fmuladd.f128(fp128 %0, fp128 %1, fp128 %2)
63  store fp128 %madd, fp128* %res, align 16
64  ret void
65}
66declare fp128 @llvm.fmuladd.f128(fp128, fp128, fp128)
67
68; Function Attrs: norecurse nounwind
69define void @qpFmadd_02(fp128* nocapture readonly %a,
70; CHECK-LABEL: qpFmadd_02:
71; CHECK:       # %bb.0: # %entry
72; CHECK-NEXT:    lxv v2, 0(r3)
73; CHECK-NEXT:    lxv v3, 0(r4)
74; CHECK-NEXT:    lxv v4, 0(r5)
75; CHECK-NEXT:    xsmaddqp v2, v3, v4
76; CHECK-NEXT:    stxv v2, 0(r6)
77; CHECK-NEXT:    blr
78;
79; CHECK-P8-LABEL: qpFmadd_02:
80; CHECK-P8:       # %bb.0: # %entry
81; CHECK-P8-NEXT:    mflr r0
82; CHECK-P8-NEXT:    .cfi_def_cfa_offset 64
83; CHECK-P8-NEXT:    .cfi_offset lr, 16
84; CHECK-P8-NEXT:    .cfi_offset r28, -32
85; CHECK-P8-NEXT:    .cfi_offset r29, -24
86; CHECK-P8-NEXT:    .cfi_offset r30, -16
87; CHECK-P8-NEXT:    std r28, -32(r1) # 8-byte Folded Spill
88; CHECK-P8-NEXT:    std r29, -24(r1) # 8-byte Folded Spill
89; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
90; CHECK-P8-NEXT:    std r0, 16(r1)
91; CHECK-P8-NEXT:    stdu r1, -64(r1)
92; CHECK-P8-NEXT:    ld r7, 0(r5)
93; CHECK-P8-NEXT:    ld r8, 8(r5)
94; CHECK-P8-NEXT:    ld r30, 0(r3)
95; CHECK-P8-NEXT:    ld r29, 8(r3)
96; CHECK-P8-NEXT:    mr r28, r6
97; CHECK-P8-NEXT:    ld r3, 0(r4)
98; CHECK-P8-NEXT:    ld r4, 8(r4)
99; CHECK-P8-NEXT:    mr r5, r7
100; CHECK-P8-NEXT:    mr r6, r8
101; CHECK-P8-NEXT:    bl __mulkf3
102; CHECK-P8-NEXT:    nop
103; CHECK-P8-NEXT:    mr r5, r3
104; CHECK-P8-NEXT:    mr r6, r4
105; CHECK-P8-NEXT:    mr r3, r30
106; CHECK-P8-NEXT:    mr r4, r29
107; CHECK-P8-NEXT:    bl __addkf3
108; CHECK-P8-NEXT:    nop
109; CHECK-P8-NEXT:    std r3, 0(r28)
110; CHECK-P8-NEXT:    std r4, 8(r28)
111; CHECK-P8-NEXT:    addi r1, r1, 64
112; CHECK-P8-NEXT:    ld r0, 16(r1)
113; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
114; CHECK-P8-NEXT:    ld r29, -24(r1) # 8-byte Folded Reload
115; CHECK-P8-NEXT:    ld r28, -32(r1) # 8-byte Folded Reload
116; CHECK-P8-NEXT:    mtlr r0
117; CHECK-P8-NEXT:    blr
118                        fp128* nocapture readonly %b,
119                        fp128* nocapture readonly %c, fp128* nocapture %res) {
120entry:
121  %0 = load fp128, fp128* %a, align 16
122  %1 = load fp128, fp128* %b, align 16
123  %2 = load fp128, fp128* %c, align 16
124  %mul = fmul contract fp128 %1, %2
125  %add = fadd contract fp128 %0, %mul
126  store fp128 %add, fp128* %res, align 16
127  ret void
128}
129
130; Function Attrs: norecurse nounwind
131define void @qpFmadd_03(fp128* nocapture readonly %a,
132; CHECK-LABEL: qpFmadd_03:
133; CHECK:       # %bb.0: # %entry
134; CHECK-NEXT:    lxv v2, 0(r3)
135; CHECK-NEXT:    lxv v3, 0(r4)
136; CHECK-NEXT:    lxv v4, 0(r5)
137; CHECK-NEXT:    xsmaddqp v4, v2, v3
138; CHECK-NEXT:    stxv v4, 0(r6)
139; CHECK-NEXT:    blr
140;
141; CHECK-P8-LABEL: qpFmadd_03:
142; CHECK-P8:       # %bb.0: # %entry
143; CHECK-P8-NEXT:    mflr r0
144; CHECK-P8-NEXT:    .cfi_def_cfa_offset 64
145; CHECK-P8-NEXT:    .cfi_offset lr, 16
146; CHECK-P8-NEXT:    .cfi_offset r29, -24
147; CHECK-P8-NEXT:    .cfi_offset r30, -16
148; CHECK-P8-NEXT:    std r29, -24(r1) # 8-byte Folded Spill
149; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
150; CHECK-P8-NEXT:    std r0, 16(r1)
151; CHECK-P8-NEXT:    stdu r1, -64(r1)
152; CHECK-P8-NEXT:    ld r9, 0(r3)
153; CHECK-P8-NEXT:    ld r7, 8(r3)
154; CHECK-P8-NEXT:    ld r8, 0(r4)
155; CHECK-P8-NEXT:    mr r30, r6
156; CHECK-P8-NEXT:    ld r6, 8(r4)
157; CHECK-P8-NEXT:    mr r29, r5
158; CHECK-P8-NEXT:    mr r3, r9
159; CHECK-P8-NEXT:    mr r4, r7
160; CHECK-P8-NEXT:    mr r5, r8
161; CHECK-P8-NEXT:    bl __mulkf3
162; CHECK-P8-NEXT:    nop
163; CHECK-P8-NEXT:    ld r5, 0(r29)
164; CHECK-P8-NEXT:    ld r6, 8(r29)
165; CHECK-P8-NEXT:    bl __addkf3
166; CHECK-P8-NEXT:    nop
167; CHECK-P8-NEXT:    std r3, 0(r30)
168; CHECK-P8-NEXT:    std r4, 8(r30)
169; CHECK-P8-NEXT:    addi r1, r1, 64
170; CHECK-P8-NEXT:    ld r0, 16(r1)
171; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
172; CHECK-P8-NEXT:    ld r29, -24(r1) # 8-byte Folded Reload
173; CHECK-P8-NEXT:    mtlr r0
174; CHECK-P8-NEXT:    blr
175                        fp128* nocapture readonly %b,
176                        fp128* nocapture readonly %c, fp128* nocapture %res) {
177entry:
178  %0 = load fp128, fp128* %a, align 16
179  %1 = load fp128, fp128* %b, align 16
180  %mul = fmul contract fp128 %0, %1
181  %2 = load fp128, fp128* %c, align 16
182  %add = fadd contract fp128 %mul, %2
183  store fp128 %add, fp128* %res, align 16
184  ret void
185}
186
187; Function Attrs: norecurse nounwind
188define void @qpFnmadd(fp128* nocapture readonly %a,
189; CHECK-LABEL: qpFnmadd:
190; CHECK:       # %bb.0: # %entry
191; CHECK-NEXT:    lxv v2, 0(r3)
192; CHECK-NEXT:    lxv v3, 0(r4)
193; CHECK-NEXT:    lxv v4, 0(r5)
194; CHECK-NEXT:    xsnmaddqp v2, v3, v4
195; CHECK-NEXT:    stxv v2, 0(r6)
196; CHECK-NEXT:    blr
197;
198; CHECK-P8-LABEL: qpFnmadd:
199; CHECK-P8:       # %bb.0: # %entry
200; CHECK-P8-NEXT:    mflr r0
201; CHECK-P8-NEXT:    .cfi_def_cfa_offset 64
202; CHECK-P8-NEXT:    .cfi_offset lr, 16
203; CHECK-P8-NEXT:    .cfi_offset r28, -32
204; CHECK-P8-NEXT:    .cfi_offset r29, -24
205; CHECK-P8-NEXT:    .cfi_offset r30, -16
206; CHECK-P8-NEXT:    std r28, -32(r1) # 8-byte Folded Spill
207; CHECK-P8-NEXT:    std r29, -24(r1) # 8-byte Folded Spill
208; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
209; CHECK-P8-NEXT:    std r0, 16(r1)
210; CHECK-P8-NEXT:    stdu r1, -64(r1)
211; CHECK-P8-NEXT:    ld r7, 0(r5)
212; CHECK-P8-NEXT:    ld r8, 8(r5)
213; CHECK-P8-NEXT:    ld r30, 0(r3)
214; CHECK-P8-NEXT:    ld r29, 8(r3)
215; CHECK-P8-NEXT:    mr r28, r6
216; CHECK-P8-NEXT:    ld r3, 0(r4)
217; CHECK-P8-NEXT:    ld r4, 8(r4)
218; CHECK-P8-NEXT:    mr r5, r7
219; CHECK-P8-NEXT:    mr r6, r8
220; CHECK-P8-NEXT:    bl __mulkf3
221; CHECK-P8-NEXT:    nop
222; CHECK-P8-NEXT:    mr r5, r3
223; CHECK-P8-NEXT:    mr r6, r4
224; CHECK-P8-NEXT:    mr r3, r30
225; CHECK-P8-NEXT:    mr r4, r29
226; CHECK-P8-NEXT:    bl __addkf3
227; CHECK-P8-NEXT:    nop
228; CHECK-P8-NEXT:    li r5, 1
229; CHECK-P8-NEXT:    std r3, 0(r28)
230; CHECK-P8-NEXT:    sldi r5, r5, 63
231; CHECK-P8-NEXT:    xor r4, r4, r5
232; CHECK-P8-NEXT:    std r4, 8(r28)
233; CHECK-P8-NEXT:    addi r1, r1, 64
234; CHECK-P8-NEXT:    ld r0, 16(r1)
235; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
236; CHECK-P8-NEXT:    ld r29, -24(r1) # 8-byte Folded Reload
237; CHECK-P8-NEXT:    ld r28, -32(r1) # 8-byte Folded Reload
238; CHECK-P8-NEXT:    mtlr r0
239; CHECK-P8-NEXT:    blr
240                      fp128* nocapture readonly %b,
241                      fp128* nocapture readonly %c, fp128* nocapture %res) {
242entry:
243  %0 = load fp128, fp128* %a, align 16
244  %1 = load fp128, fp128* %b, align 16
245  %2 = load fp128, fp128* %c, align 16
246  %mul = fmul contract fp128 %1, %2
247  %add = fadd contract fp128 %0, %mul
248  %sub = fsub fp128 0xL00000000000000008000000000000000, %add
249  store fp128 %sub, fp128* %res, align 16
250  ret void
251}
252
253; Function Attrs: norecurse nounwind
254define void @qpFnmadd_02(fp128* nocapture readonly %a,
255; CHECK-LABEL: qpFnmadd_02:
256; CHECK:       # %bb.0: # %entry
257; CHECK-NEXT:    lxv v2, 0(r3)
258; CHECK-NEXT:    lxv v3, 0(r4)
259; CHECK-NEXT:    lxv v4, 0(r5)
260; CHECK-NEXT:    xsnmaddqp v4, v2, v3
261; CHECK-NEXT:    stxv v4, 0(r6)
262; CHECK-NEXT:    blr
263;
264; CHECK-P8-LABEL: qpFnmadd_02:
265; CHECK-P8:       # %bb.0: # %entry
266; CHECK-P8-NEXT:    mflr r0
267; CHECK-P8-NEXT:    .cfi_def_cfa_offset 64
268; CHECK-P8-NEXT:    .cfi_offset lr, 16
269; CHECK-P8-NEXT:    .cfi_offset r29, -24
270; CHECK-P8-NEXT:    .cfi_offset r30, -16
271; CHECK-P8-NEXT:    std r29, -24(r1) # 8-byte Folded Spill
272; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
273; CHECK-P8-NEXT:    std r0, 16(r1)
274; CHECK-P8-NEXT:    stdu r1, -64(r1)
275; CHECK-P8-NEXT:    ld r9, 0(r3)
276; CHECK-P8-NEXT:    ld r7, 8(r3)
277; CHECK-P8-NEXT:    ld r8, 0(r4)
278; CHECK-P8-NEXT:    mr r30, r6
279; CHECK-P8-NEXT:    ld r6, 8(r4)
280; CHECK-P8-NEXT:    mr r29, r5
281; CHECK-P8-NEXT:    mr r3, r9
282; CHECK-P8-NEXT:    mr r4, r7
283; CHECK-P8-NEXT:    mr r5, r8
284; CHECK-P8-NEXT:    bl __mulkf3
285; CHECK-P8-NEXT:    nop
286; CHECK-P8-NEXT:    ld r5, 0(r29)
287; CHECK-P8-NEXT:    ld r6, 8(r29)
288; CHECK-P8-NEXT:    bl __addkf3
289; CHECK-P8-NEXT:    nop
290; CHECK-P8-NEXT:    li r5, 1
291; CHECK-P8-NEXT:    std r3, 0(r30)
292; CHECK-P8-NEXT:    sldi r5, r5, 63
293; CHECK-P8-NEXT:    xor r4, r4, r5
294; CHECK-P8-NEXT:    std r4, 8(r30)
295; CHECK-P8-NEXT:    addi r1, r1, 64
296; CHECK-P8-NEXT:    ld r0, 16(r1)
297; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
298; CHECK-P8-NEXT:    ld r29, -24(r1) # 8-byte Folded Reload
299; CHECK-P8-NEXT:    mtlr r0
300; CHECK-P8-NEXT:    blr
301                      fp128* nocapture readonly %b,
302                      fp128* nocapture readonly %c, fp128* nocapture %res) {
303entry:
304  %0 = load fp128, fp128* %a, align 16
305  %1 = load fp128, fp128* %b, align 16
306  %mul = fmul contract fp128 %0, %1
307  %2 = load fp128, fp128* %c, align 16
308  %add = fadd contract fp128 %mul, %2
309  %sub = fsub fp128 0xL00000000000000008000000000000000, %add
310  store fp128 %sub, fp128* %res, align 16
311  ret void
312}
313
314; Function Attrs: norecurse nounwind
315define void @qpFmsub(fp128* nocapture readonly %a,
316; CHECK-LABEL: qpFmsub:
317; CHECK:       # %bb.0: # %entry
318; CHECK-NEXT:    lxv v2, 0(r3)
319; CHECK-NEXT:    lxv v3, 0(r4)
320; CHECK-NEXT:    lxv v4, 0(r5)
321; CHECK-NEXT:    xsnmsubqp v2, v3, v4
322; CHECK-NEXT:    stxv v2, 0(r6)
323; CHECK-NEXT:    blr
324;
325; CHECK-P8-LABEL: qpFmsub:
326; CHECK-P8:       # %bb.0: # %entry
327; CHECK-P8-NEXT:    mflr r0
328; CHECK-P8-NEXT:    .cfi_def_cfa_offset 64
329; CHECK-P8-NEXT:    .cfi_offset lr, 16
330; CHECK-P8-NEXT:    .cfi_offset r28, -32
331; CHECK-P8-NEXT:    .cfi_offset r29, -24
332; CHECK-P8-NEXT:    .cfi_offset r30, -16
333; CHECK-P8-NEXT:    std r28, -32(r1) # 8-byte Folded Spill
334; CHECK-P8-NEXT:    std r29, -24(r1) # 8-byte Folded Spill
335; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
336; CHECK-P8-NEXT:    std r0, 16(r1)
337; CHECK-P8-NEXT:    stdu r1, -64(r1)
338; CHECK-P8-NEXT:    ld r7, 0(r5)
339; CHECK-P8-NEXT:    ld r8, 8(r5)
340; CHECK-P8-NEXT:    ld r30, 0(r3)
341; CHECK-P8-NEXT:    ld r29, 8(r3)
342; CHECK-P8-NEXT:    mr r28, r6
343; CHECK-P8-NEXT:    ld r3, 0(r4)
344; CHECK-P8-NEXT:    ld r4, 8(r4)
345; CHECK-P8-NEXT:    mr r5, r7
346; CHECK-P8-NEXT:    mr r6, r8
347; CHECK-P8-NEXT:    bl __mulkf3
348; CHECK-P8-NEXT:    nop
349; CHECK-P8-NEXT:    mr r5, r3
350; CHECK-P8-NEXT:    mr r6, r4
351; CHECK-P8-NEXT:    mr r3, r30
352; CHECK-P8-NEXT:    mr r4, r29
353; CHECK-P8-NEXT:    bl __subkf3
354; CHECK-P8-NEXT:    nop
355; CHECK-P8-NEXT:    std r3, 0(r28)
356; CHECK-P8-NEXT:    std r4, 8(r28)
357; CHECK-P8-NEXT:    addi r1, r1, 64
358; CHECK-P8-NEXT:    ld r0, 16(r1)
359; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
360; CHECK-P8-NEXT:    ld r29, -24(r1) # 8-byte Folded Reload
361; CHECK-P8-NEXT:    ld r28, -32(r1) # 8-byte Folded Reload
362; CHECK-P8-NEXT:    mtlr r0
363; CHECK-P8-NEXT:    blr
364                      fp128* nocapture readonly %b,
365                      fp128* nocapture readonly %c, fp128* nocapture %res) {
366entry:
367  %0 = load fp128, fp128* %a, align 16
368  %1 = load fp128, fp128* %b, align 16
369  %2 = load fp128, fp128* %c, align 16
370  %mul = fmul contract fp128 %1, %2
371  %sub = fsub contract nsz fp128 %0, %mul
372  store fp128 %sub, fp128* %res, align 16
373  ret void
374}
375
376; Function Attrs: norecurse nounwind
377define void @qpFmsub_02(fp128* nocapture readonly %a,
378; CHECK-LABEL: qpFmsub_02:
379; CHECK:       # %bb.0: # %entry
380; CHECK-NEXT:    lxv v2, 0(r3)
381; CHECK-NEXT:    lxv v3, 0(r4)
382; CHECK-NEXT:    lxv v4, 0(r5)
383; CHECK-NEXT:    xsmsubqp v4, v2, v3
384; CHECK-NEXT:    stxv v4, 0(r6)
385; CHECK-NEXT:    blr
386;
387; CHECK-P8-LABEL: qpFmsub_02:
388; CHECK-P8:       # %bb.0: # %entry
389; CHECK-P8-NEXT:    mflr r0
390; CHECK-P8-NEXT:    .cfi_def_cfa_offset 64
391; CHECK-P8-NEXT:    .cfi_offset lr, 16
392; CHECK-P8-NEXT:    .cfi_offset r29, -24
393; CHECK-P8-NEXT:    .cfi_offset r30, -16
394; CHECK-P8-NEXT:    std r29, -24(r1) # 8-byte Folded Spill
395; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
396; CHECK-P8-NEXT:    std r0, 16(r1)
397; CHECK-P8-NEXT:    stdu r1, -64(r1)
398; CHECK-P8-NEXT:    ld r9, 0(r3)
399; CHECK-P8-NEXT:    ld r7, 8(r3)
400; CHECK-P8-NEXT:    ld r8, 0(r4)
401; CHECK-P8-NEXT:    mr r30, r6
402; CHECK-P8-NEXT:    ld r6, 8(r4)
403; CHECK-P8-NEXT:    mr r29, r5
404; CHECK-P8-NEXT:    mr r3, r9
405; CHECK-P8-NEXT:    mr r4, r7
406; CHECK-P8-NEXT:    mr r5, r8
407; CHECK-P8-NEXT:    bl __mulkf3
408; CHECK-P8-NEXT:    nop
409; CHECK-P8-NEXT:    ld r5, 0(r29)
410; CHECK-P8-NEXT:    ld r6, 8(r29)
411; CHECK-P8-NEXT:    bl __subkf3
412; CHECK-P8-NEXT:    nop
413; CHECK-P8-NEXT:    std r3, 0(r30)
414; CHECK-P8-NEXT:    std r4, 8(r30)
415; CHECK-P8-NEXT:    addi r1, r1, 64
416; CHECK-P8-NEXT:    ld r0, 16(r1)
417; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
418; CHECK-P8-NEXT:    ld r29, -24(r1) # 8-byte Folded Reload
419; CHECK-P8-NEXT:    mtlr r0
420; CHECK-P8-NEXT:    blr
421                      fp128* nocapture readonly %b,
422                      fp128* nocapture readonly %c, fp128* nocapture %res) {
423entry:
424  %0 = load fp128, fp128* %a, align 16
425  %1 = load fp128, fp128* %b, align 16
426  %mul = fmul contract fp128 %0, %1
427  %2 = load fp128, fp128* %c, align 16
428  %sub = fsub contract fp128 %mul, %2
429  store fp128 %sub, fp128* %res, align 16
430  ret void
431}
432
433; Function Attrs: norecurse nounwind
434define void @qpFnmsub(fp128* nocapture readonly %a,
435; CHECK-LABEL: qpFnmsub:
436; CHECK:       # %bb.0: # %entry
437; CHECK-NEXT:    lxv v3, 0(r4)
438; CHECK-NEXT:    lxv v2, 0(r3)
439; CHECK-NEXT:    lxv v4, 0(r5)
440; CHECK-NEXT:    xsnegqp v3, v3
441; CHECK-NEXT:    xsnmaddqp v2, v3, v4
442; CHECK-NEXT:    stxv v2, 0(r6)
443; CHECK-NEXT:    blr
444;
445; CHECK-P8-LABEL: qpFnmsub:
446; CHECK-P8:       # %bb.0: # %entry
447; CHECK-P8-NEXT:    mflr r0
448; CHECK-P8-NEXT:    .cfi_def_cfa_offset 64
449; CHECK-P8-NEXT:    .cfi_offset lr, 16
450; CHECK-P8-NEXT:    .cfi_offset r28, -32
451; CHECK-P8-NEXT:    .cfi_offset r29, -24
452; CHECK-P8-NEXT:    .cfi_offset r30, -16
453; CHECK-P8-NEXT:    std r28, -32(r1) # 8-byte Folded Spill
454; CHECK-P8-NEXT:    std r29, -24(r1) # 8-byte Folded Spill
455; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
456; CHECK-P8-NEXT:    std r0, 16(r1)
457; CHECK-P8-NEXT:    stdu r1, -64(r1)
458; CHECK-P8-NEXT:    ld r7, 0(r5)
459; CHECK-P8-NEXT:    ld r8, 8(r5)
460; CHECK-P8-NEXT:    ld r30, 0(r3)
461; CHECK-P8-NEXT:    ld r29, 8(r3)
462; CHECK-P8-NEXT:    mr r28, r6
463; CHECK-P8-NEXT:    ld r3, 0(r4)
464; CHECK-P8-NEXT:    ld r4, 8(r4)
465; CHECK-P8-NEXT:    mr r5, r7
466; CHECK-P8-NEXT:    mr r6, r8
467; CHECK-P8-NEXT:    bl __mulkf3
468; CHECK-P8-NEXT:    nop
469; CHECK-P8-NEXT:    mr r5, r3
470; CHECK-P8-NEXT:    mr r6, r4
471; CHECK-P8-NEXT:    mr r3, r30
472; CHECK-P8-NEXT:    mr r4, r29
473; CHECK-P8-NEXT:    bl __subkf3
474; CHECK-P8-NEXT:    nop
475; CHECK-P8-NEXT:    li r5, 1
476; CHECK-P8-NEXT:    std r3, 0(r28)
477; CHECK-P8-NEXT:    sldi r5, r5, 63
478; CHECK-P8-NEXT:    xor r4, r4, r5
479; CHECK-P8-NEXT:    std r4, 8(r28)
480; CHECK-P8-NEXT:    addi r1, r1, 64
481; CHECK-P8-NEXT:    ld r0, 16(r1)
482; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
483; CHECK-P8-NEXT:    ld r29, -24(r1) # 8-byte Folded Reload
484; CHECK-P8-NEXT:    ld r28, -32(r1) # 8-byte Folded Reload
485; CHECK-P8-NEXT:    mtlr r0
486; CHECK-P8-NEXT:    blr
487                      fp128* nocapture readonly %b,
488                      fp128* nocapture readonly %c, fp128* nocapture %res) {
489entry:
490  %0 = load fp128, fp128* %a, align 16
491  %1 = load fp128, fp128* %b, align 16
492  %2 = load fp128, fp128* %c, align 16
493  %mul = fmul contract fp128 %1, %2
494  %sub = fsub contract fp128 %0, %mul
495  %sub1 = fsub fp128 0xL00000000000000008000000000000000, %sub
496  store fp128 %sub1, fp128* %res, align 16
497  ret void
498}
499
500; Function Attrs: norecurse nounwind
501define void @qpFnmsub_02(fp128* nocapture readonly %a,
502; CHECK-LABEL: qpFnmsub_02:
503; CHECK:       # %bb.0: # %entry
504; CHECK-NEXT:    lxv v2, 0(r3)
505; CHECK-NEXT:    lxv v3, 0(r4)
506; CHECK-NEXT:    lxv v4, 0(r5)
507; CHECK-NEXT:    xsnmsubqp v4, v2, v3
508; CHECK-NEXT:    stxv v4, 0(r6)
509; CHECK-NEXT:    blr
510;
511; CHECK-P8-LABEL: qpFnmsub_02:
512; CHECK-P8:       # %bb.0: # %entry
513; CHECK-P8-NEXT:    mflr r0
514; CHECK-P8-NEXT:    .cfi_def_cfa_offset 64
515; CHECK-P8-NEXT:    .cfi_offset lr, 16
516; CHECK-P8-NEXT:    .cfi_offset r29, -24
517; CHECK-P8-NEXT:    .cfi_offset r30, -16
518; CHECK-P8-NEXT:    std r29, -24(r1) # 8-byte Folded Spill
519; CHECK-P8-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
520; CHECK-P8-NEXT:    std r0, 16(r1)
521; CHECK-P8-NEXT:    stdu r1, -64(r1)
522; CHECK-P8-NEXT:    ld r9, 0(r3)
523; CHECK-P8-NEXT:    ld r7, 8(r3)
524; CHECK-P8-NEXT:    ld r8, 0(r4)
525; CHECK-P8-NEXT:    mr r30, r6
526; CHECK-P8-NEXT:    ld r6, 8(r4)
527; CHECK-P8-NEXT:    mr r29, r5
528; CHECK-P8-NEXT:    mr r3, r9
529; CHECK-P8-NEXT:    mr r4, r7
530; CHECK-P8-NEXT:    mr r5, r8
531; CHECK-P8-NEXT:    bl __mulkf3
532; CHECK-P8-NEXT:    nop
533; CHECK-P8-NEXT:    ld r5, 0(r29)
534; CHECK-P8-NEXT:    ld r6, 8(r29)
535; CHECK-P8-NEXT:    bl __subkf3
536; CHECK-P8-NEXT:    nop
537; CHECK-P8-NEXT:    li r5, 1
538; CHECK-P8-NEXT:    std r3, 0(r30)
539; CHECK-P8-NEXT:    sldi r5, r5, 63
540; CHECK-P8-NEXT:    xor r4, r4, r5
541; CHECK-P8-NEXT:    std r4, 8(r30)
542; CHECK-P8-NEXT:    addi r1, r1, 64
543; CHECK-P8-NEXT:    ld r0, 16(r1)
544; CHECK-P8-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
545; CHECK-P8-NEXT:    ld r29, -24(r1) # 8-byte Folded Reload
546; CHECK-P8-NEXT:    mtlr r0
547; CHECK-P8-NEXT:    blr
548                      fp128* nocapture readonly %b,
549                      fp128* nocapture readonly %c, fp128* nocapture %res) {
550entry:
551  %0 = load fp128, fp128* %a, align 16
552  %1 = load fp128, fp128* %b, align 16
553  %mul = fmul contract fp128 %0, %1
554  %2 = load fp128, fp128* %c, align 16
555  %sub = fsub contract fp128 %mul, %2
556  %sub1 = fsub fp128 0xL00000000000000008000000000000000, %sub
557  store fp128 %sub1, fp128* %res, align 16
558  ret void
559}
560