1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr7 -mattr=-vsx | FileCheck --check-prefix=CHECK-P7 %s
3; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr8 | FileCheck --check-prefix=CHECK-P8 %s
4; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr9 | FileCheck --check-prefix=CHECK-P9 %s
5
6target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64"
7
8declare double @llvm.sqrt.f64(double)
9declare float @llvm.sqrt.f32(float)
10declare fp128 @llvm.sqrt.f128(fp128)
11declare <4 x float> @llvm.sqrt.v4f32(<4 x float>)
12declare <2 x double> @llvm.sqrt.v2f64(<2 x double>)
13
14define double @foo_fmf(double %a, double %b) nounwind {
15; CHECK-P7-LABEL: foo_fmf:
16; CHECK-P7:       # %bb.0:
17; CHECK-P7-NEXT:    frsqrte 0, 2
18; CHECK-P7-NEXT:    addis 3, 2, .LCPI0_0@toc@ha
19; CHECK-P7-NEXT:    addis 4, 2, .LCPI0_1@toc@ha
20; CHECK-P7-NEXT:    lfs 4, .LCPI0_0@toc@l(3)
21; CHECK-P7-NEXT:    lfs 5, .LCPI0_1@toc@l(4)
22; CHECK-P7-NEXT:    fmul 3, 2, 0
23; CHECK-P7-NEXT:    fmadd 3, 3, 0, 4
24; CHECK-P7-NEXT:    fmul 0, 0, 5
25; CHECK-P7-NEXT:    fmul 0, 0, 3
26; CHECK-P7-NEXT:    fmul 2, 2, 0
27; CHECK-P7-NEXT:    fmadd 2, 2, 0, 4
28; CHECK-P7-NEXT:    fmul 0, 0, 5
29; CHECK-P7-NEXT:    fmul 0, 0, 2
30; CHECK-P7-NEXT:    fmul 1, 1, 0
31; CHECK-P7-NEXT:    blr
32;
33; CHECK-P8-LABEL: foo_fmf:
34; CHECK-P8:       # %bb.0:
35; CHECK-P8-NEXT:    xsrsqrtedp 0, 2
36; CHECK-P8-NEXT:    addis 3, 2, .LCPI0_0@toc@ha
37; CHECK-P8-NEXT:    lfs 4, .LCPI0_0@toc@l(3)
38; CHECK-P8-NEXT:    addis 3, 2, .LCPI0_1@toc@ha
39; CHECK-P8-NEXT:    lfs 5, .LCPI0_1@toc@l(3)
40; CHECK-P8-NEXT:    fmr 6, 4
41; CHECK-P8-NEXT:    xsmuldp 3, 2, 0
42; CHECK-P8-NEXT:    xsmaddadp 6, 3, 0
43; CHECK-P8-NEXT:    xsmuldp 0, 0, 5
44; CHECK-P8-NEXT:    xsmuldp 0, 0, 6
45; CHECK-P8-NEXT:    xsmuldp 2, 2, 0
46; CHECK-P8-NEXT:    xsmaddadp 4, 2, 0
47; CHECK-P8-NEXT:    xsmuldp 0, 0, 5
48; CHECK-P8-NEXT:    xsmuldp 0, 0, 4
49; CHECK-P8-NEXT:    xsmuldp 1, 1, 0
50; CHECK-P8-NEXT:    blr
51;
52; CHECK-P9-LABEL: foo_fmf:
53; CHECK-P9:       # %bb.0:
54; CHECK-P9-NEXT:    xsrsqrtedp 0, 2
55; CHECK-P9-NEXT:    addis 3, 2, .LCPI0_0@toc@ha
56; CHECK-P9-NEXT:    lfs 4, .LCPI0_0@toc@l(3)
57; CHECK-P9-NEXT:    addis 3, 2, .LCPI0_1@toc@ha
58; CHECK-P9-NEXT:    xsmuldp 3, 2, 0
59; CHECK-P9-NEXT:    fmr 5, 4
60; CHECK-P9-NEXT:    xsmaddadp 5, 3, 0
61; CHECK-P9-NEXT:    lfs 3, .LCPI0_1@toc@l(3)
62; CHECK-P9-NEXT:    xsmuldp 0, 0, 3
63; CHECK-P9-NEXT:    xsmuldp 0, 0, 5
64; CHECK-P9-NEXT:    xsmuldp 2, 2, 0
65; CHECK-P9-NEXT:    xsmaddadp 4, 2, 0
66; CHECK-P9-NEXT:    xsmuldp 0, 0, 3
67; CHECK-P9-NEXT:    xsmuldp 0, 0, 4
68; CHECK-P9-NEXT:    xsmuldp 1, 1, 0
69; CHECK-P9-NEXT:    blr
70  %x = call arcp contract reassoc double @llvm.sqrt.f64(double %b)
71  %r = fdiv arcp contract reassoc double %a, %x
72  ret double %r
73}
74
75define double @foo_safe(double %a, double %b) nounwind {
76; CHECK-P7-LABEL: foo_safe:
77; CHECK-P7:       # %bb.0:
78; CHECK-P7-NEXT:    fsqrt 0, 2
79; CHECK-P7-NEXT:    fdiv 1, 1, 0
80; CHECK-P7-NEXT:    blr
81;
82; CHECK-P8-LABEL: foo_safe:
83; CHECK-P8:       # %bb.0:
84; CHECK-P8-NEXT:    xssqrtdp 0, 2
85; CHECK-P8-NEXT:    xsdivdp 1, 1, 0
86; CHECK-P8-NEXT:    blr
87;
88; CHECK-P9-LABEL: foo_safe:
89; CHECK-P9:       # %bb.0:
90; CHECK-P9-NEXT:    xssqrtdp 0, 2
91; CHECK-P9-NEXT:    xsdivdp 1, 1, 0
92; CHECK-P9-NEXT:    blr
93  %x = call double @llvm.sqrt.f64(double %b)
94  %r = fdiv double %a, %x
95  ret double %r
96}
97
98define double @no_estimate_refinement_f64(double %a, double %b) #0 {
99; CHECK-P7-LABEL: no_estimate_refinement_f64:
100; CHECK-P7:       # %bb.0:
101; CHECK-P7-NEXT:    frsqrte 0, 2
102; CHECK-P7-NEXT:    fmul 1, 1, 0
103; CHECK-P7-NEXT:    blr
104;
105; CHECK-P8-LABEL: no_estimate_refinement_f64:
106; CHECK-P8:       # %bb.0:
107; CHECK-P8-NEXT:    xsrsqrtedp 0, 2
108; CHECK-P8-NEXT:    xsmuldp 1, 1, 0
109; CHECK-P8-NEXT:    blr
110;
111; CHECK-P9-LABEL: no_estimate_refinement_f64:
112; CHECK-P9:       # %bb.0:
113; CHECK-P9-NEXT:    xsrsqrtedp 0, 2
114; CHECK-P9-NEXT:    xsmuldp 1, 1, 0
115; CHECK-P9-NEXT:    blr
116  %x = call arcp reassoc double @llvm.sqrt.f64(double %b)
117  %r = fdiv arcp reassoc double %a, %x
118  ret double %r
119}
120
121define double @foof_fmf(double %a, float %b) nounwind {
122; CHECK-P7-LABEL: foof_fmf:
123; CHECK-P7:       # %bb.0:
124; CHECK-P7-NEXT:    frsqrtes 0, 2
125; CHECK-P7-NEXT:    addis 3, 2, .LCPI3_0@toc@ha
126; CHECK-P7-NEXT:    addis 4, 2, .LCPI3_1@toc@ha
127; CHECK-P7-NEXT:    lfs 3, .LCPI3_0@toc@l(3)
128; CHECK-P7-NEXT:    lfs 4, .LCPI3_1@toc@l(4)
129; CHECK-P7-NEXT:    fmuls 2, 2, 0
130; CHECK-P7-NEXT:    fmadds 2, 2, 0, 3
131; CHECK-P7-NEXT:    fmuls 0, 0, 4
132; CHECK-P7-NEXT:    fmuls 0, 0, 2
133; CHECK-P7-NEXT:    fmul 1, 1, 0
134; CHECK-P7-NEXT:    blr
135;
136; CHECK-P8-LABEL: foof_fmf:
137; CHECK-P8:       # %bb.0:
138; CHECK-P8-NEXT:    xsrsqrtesp 0, 2
139; CHECK-P8-NEXT:    addis 3, 2, .LCPI3_1@toc@ha
140; CHECK-P8-NEXT:    lfs 3, .LCPI3_1@toc@l(3)
141; CHECK-P8-NEXT:    addis 3, 2, .LCPI3_0@toc@ha
142; CHECK-P8-NEXT:    lfs 4, .LCPI3_0@toc@l(3)
143; CHECK-P8-NEXT:    xsmulsp 2, 2, 0
144; CHECK-P8-NEXT:    xsmulsp 3, 0, 3
145; CHECK-P8-NEXT:    xsmaddasp 4, 2, 0
146; CHECK-P8-NEXT:    xsmulsp 0, 3, 4
147; CHECK-P8-NEXT:    xsmuldp 1, 1, 0
148; CHECK-P8-NEXT:    blr
149;
150; CHECK-P9-LABEL: foof_fmf:
151; CHECK-P9:       # %bb.0:
152; CHECK-P9-NEXT:    xsrsqrtesp 0, 2
153; CHECK-P9-NEXT:    addis 3, 2, .LCPI3_0@toc@ha
154; CHECK-P9-NEXT:    lfs 3, .LCPI3_0@toc@l(3)
155; CHECK-P9-NEXT:    addis 3, 2, .LCPI3_1@toc@ha
156; CHECK-P9-NEXT:    xsmulsp 2, 2, 0
157; CHECK-P9-NEXT:    xsmaddasp 3, 2, 0
158; CHECK-P9-NEXT:    lfs 2, .LCPI3_1@toc@l(3)
159; CHECK-P9-NEXT:    xsmulsp 0, 0, 2
160; CHECK-P9-NEXT:    xsmulsp 0, 0, 3
161; CHECK-P9-NEXT:    xsmuldp 1, 1, 0
162; CHECK-P9-NEXT:    blr
163  %x = call contract reassoc arcp float @llvm.sqrt.f32(float %b)
164  %y = fpext float %x to double
165  %r = fdiv contract reassoc arcp double %a, %y
166  ret double %r
167}
168
169define double @foof_safe(double %a, float %b) nounwind {
170; CHECK-P7-LABEL: foof_safe:
171; CHECK-P7:       # %bb.0:
172; CHECK-P7-NEXT:    fsqrts 0, 2
173; CHECK-P7-NEXT:    fdiv 1, 1, 0
174; CHECK-P7-NEXT:    blr
175;
176; CHECK-P8-LABEL: foof_safe:
177; CHECK-P8:       # %bb.0:
178; CHECK-P8-NEXT:    xssqrtsp 0, 2
179; CHECK-P8-NEXT:    xsdivdp 1, 1, 0
180; CHECK-P8-NEXT:    blr
181;
182; CHECK-P9-LABEL: foof_safe:
183; CHECK-P9:       # %bb.0:
184; CHECK-P9-NEXT:    xssqrtsp 0, 2
185; CHECK-P9-NEXT:    xsdivdp 1, 1, 0
186; CHECK-P9-NEXT:    blr
187  %x = call float @llvm.sqrt.f32(float %b)
188  %y = fpext float %x to double
189  %r = fdiv double %a, %y
190  ret double %r
191}
192
193define float @food_fmf(float %a, double %b) nounwind {
194; CHECK-P7-LABEL: food_fmf:
195; CHECK-P7:       # %bb.0:
196; CHECK-P7-NEXT:    frsqrte 0, 2
197; CHECK-P7-NEXT:    addis 3, 2, .LCPI5_0@toc@ha
198; CHECK-P7-NEXT:    addis 4, 2, .LCPI5_1@toc@ha
199; CHECK-P7-NEXT:    lfs 4, .LCPI5_0@toc@l(3)
200; CHECK-P7-NEXT:    lfs 5, .LCPI5_1@toc@l(4)
201; CHECK-P7-NEXT:    fmul 3, 2, 0
202; CHECK-P7-NEXT:    fmadd 3, 3, 0, 4
203; CHECK-P7-NEXT:    fmul 0, 0, 5
204; CHECK-P7-NEXT:    fmul 0, 0, 3
205; CHECK-P7-NEXT:    fmul 2, 2, 0
206; CHECK-P7-NEXT:    fmadd 2, 2, 0, 4
207; CHECK-P7-NEXT:    fmul 0, 0, 5
208; CHECK-P7-NEXT:    fmul 0, 0, 2
209; CHECK-P7-NEXT:    frsp 0, 0
210; CHECK-P7-NEXT:    fmuls 1, 1, 0
211; CHECK-P7-NEXT:    blr
212;
213; CHECK-P8-LABEL: food_fmf:
214; CHECK-P8:       # %bb.0:
215; CHECK-P8-NEXT:    xsrsqrtedp 0, 2
216; CHECK-P8-NEXT:    addis 3, 2, .LCPI5_0@toc@ha
217; CHECK-P8-NEXT:    lfs 4, .LCPI5_0@toc@l(3)
218; CHECK-P8-NEXT:    addis 3, 2, .LCPI5_1@toc@ha
219; CHECK-P8-NEXT:    lfs 5, .LCPI5_1@toc@l(3)
220; CHECK-P8-NEXT:    fmr 6, 4
221; CHECK-P8-NEXT:    xsmuldp 3, 2, 0
222; CHECK-P8-NEXT:    xsmaddadp 6, 3, 0
223; CHECK-P8-NEXT:    xsmuldp 0, 0, 5
224; CHECK-P8-NEXT:    xsmuldp 0, 0, 6
225; CHECK-P8-NEXT:    xsmuldp 2, 2, 0
226; CHECK-P8-NEXT:    xsmaddadp 4, 2, 0
227; CHECK-P8-NEXT:    xsmuldp 0, 0, 5
228; CHECK-P8-NEXT:    xsmuldp 0, 0, 4
229; CHECK-P8-NEXT:    xsrsp 0, 0
230; CHECK-P8-NEXT:    xsmulsp 1, 1, 0
231; CHECK-P8-NEXT:    blr
232;
233; CHECK-P9-LABEL: food_fmf:
234; CHECK-P9:       # %bb.0:
235; CHECK-P9-NEXT:    xsrsqrtedp 0, 2
236; CHECK-P9-NEXT:    addis 3, 2, .LCPI5_0@toc@ha
237; CHECK-P9-NEXT:    lfs 4, .LCPI5_0@toc@l(3)
238; CHECK-P9-NEXT:    addis 3, 2, .LCPI5_1@toc@ha
239; CHECK-P9-NEXT:    xsmuldp 3, 2, 0
240; CHECK-P9-NEXT:    fmr 5, 4
241; CHECK-P9-NEXT:    xsmaddadp 5, 3, 0
242; CHECK-P9-NEXT:    lfs 3, .LCPI5_1@toc@l(3)
243; CHECK-P9-NEXT:    xsmuldp 0, 0, 3
244; CHECK-P9-NEXT:    xsmuldp 0, 0, 5
245; CHECK-P9-NEXT:    xsmuldp 2, 2, 0
246; CHECK-P9-NEXT:    xsmaddadp 4, 2, 0
247; CHECK-P9-NEXT:    xsmuldp 0, 0, 3
248; CHECK-P9-NEXT:    xsmuldp 0, 0, 4
249; CHECK-P9-NEXT:    xsrsp 0, 0
250; CHECK-P9-NEXT:    xsmulsp 1, 1, 0
251; CHECK-P9-NEXT:    blr
252  %x = call contract reassoc arcp double @llvm.sqrt.f64(double %b)
253  %y = fptrunc double %x to float
254  %r = fdiv contract reassoc arcp float %a, %y
255  ret float %r
256}
257
258define float @food_safe(float %a, double %b) nounwind {
259; CHECK-P7-LABEL: food_safe:
260; CHECK-P7:       # %bb.0:
261; CHECK-P7-NEXT:    fsqrt 0, 2
262; CHECK-P7-NEXT:    frsp 0, 0
263; CHECK-P7-NEXT:    fdivs 1, 1, 0
264; CHECK-P7-NEXT:    blr
265;
266; CHECK-P8-LABEL: food_safe:
267; CHECK-P8:       # %bb.0:
268; CHECK-P8-NEXT:    xssqrtdp 0, 2
269; CHECK-P8-NEXT:    xsrsp 0, 0
270; CHECK-P8-NEXT:    xsdivsp 1, 1, 0
271; CHECK-P8-NEXT:    blr
272;
273; CHECK-P9-LABEL: food_safe:
274; CHECK-P9:       # %bb.0:
275; CHECK-P9-NEXT:    xssqrtdp 0, 2
276; CHECK-P9-NEXT:    xsrsp 0, 0
277; CHECK-P9-NEXT:    xsdivsp 1, 1, 0
278; CHECK-P9-NEXT:    blr
279  %x = call double @llvm.sqrt.f64(double %b)
280  %y = fptrunc double %x to float
281  %r = fdiv float %a, %y
282  ret float %r
283}
284
285define float @goo_fmf(float %a, float %b) nounwind {
286; CHECK-P7-LABEL: goo_fmf:
287; CHECK-P7:       # %bb.0:
288; CHECK-P7-NEXT:    frsqrtes 0, 2
289; CHECK-P7-NEXT:    addis 3, 2, .LCPI7_0@toc@ha
290; CHECK-P7-NEXT:    addis 4, 2, .LCPI7_1@toc@ha
291; CHECK-P7-NEXT:    lfs 3, .LCPI7_0@toc@l(3)
292; CHECK-P7-NEXT:    lfs 4, .LCPI7_1@toc@l(4)
293; CHECK-P7-NEXT:    fmuls 2, 2, 0
294; CHECK-P7-NEXT:    fmadds 2, 2, 0, 3
295; CHECK-P7-NEXT:    fmuls 0, 0, 4
296; CHECK-P7-NEXT:    fmuls 0, 0, 2
297; CHECK-P7-NEXT:    fmuls 1, 1, 0
298; CHECK-P7-NEXT:    blr
299;
300; CHECK-P8-LABEL: goo_fmf:
301; CHECK-P8:       # %bb.0:
302; CHECK-P8-NEXT:    xsrsqrtesp 0, 2
303; CHECK-P8-NEXT:    addis 3, 2, .LCPI7_1@toc@ha
304; CHECK-P8-NEXT:    lfs 3, .LCPI7_1@toc@l(3)
305; CHECK-P8-NEXT:    addis 3, 2, .LCPI7_0@toc@ha
306; CHECK-P8-NEXT:    lfs 4, .LCPI7_0@toc@l(3)
307; CHECK-P8-NEXT:    xsmulsp 2, 2, 0
308; CHECK-P8-NEXT:    xsmulsp 3, 0, 3
309; CHECK-P8-NEXT:    xsmaddasp 4, 2, 0
310; CHECK-P8-NEXT:    xsmulsp 0, 3, 4
311; CHECK-P8-NEXT:    xsmulsp 1, 1, 0
312; CHECK-P8-NEXT:    blr
313;
314; CHECK-P9-LABEL: goo_fmf:
315; CHECK-P9:       # %bb.0:
316; CHECK-P9-NEXT:    xsrsqrtesp 0, 2
317; CHECK-P9-NEXT:    addis 3, 2, .LCPI7_0@toc@ha
318; CHECK-P9-NEXT:    lfs 3, .LCPI7_0@toc@l(3)
319; CHECK-P9-NEXT:    addis 3, 2, .LCPI7_1@toc@ha
320; CHECK-P9-NEXT:    xsmulsp 2, 2, 0
321; CHECK-P9-NEXT:    xsmaddasp 3, 2, 0
322; CHECK-P9-NEXT:    lfs 2, .LCPI7_1@toc@l(3)
323; CHECK-P9-NEXT:    xsmulsp 0, 0, 2
324; CHECK-P9-NEXT:    xsmulsp 0, 0, 3
325; CHECK-P9-NEXT:    xsmulsp 1, 1, 0
326; CHECK-P9-NEXT:    blr
327  %x = call contract reassoc arcp float @llvm.sqrt.f32(float %b)
328  %r = fdiv contract reassoc arcp float %a, %x
329  ret float %r
330}
331
332define float @goo_safe(float %a, float %b) nounwind {
333; CHECK-P7-LABEL: goo_safe:
334; CHECK-P7:       # %bb.0:
335; CHECK-P7-NEXT:    fsqrts 0, 2
336; CHECK-P7-NEXT:    fdivs 1, 1, 0
337; CHECK-P7-NEXT:    blr
338;
339; CHECK-P8-LABEL: goo_safe:
340; CHECK-P8:       # %bb.0:
341; CHECK-P8-NEXT:    xssqrtsp 0, 2
342; CHECK-P8-NEXT:    xsdivsp 1, 1, 0
343; CHECK-P8-NEXT:    blr
344;
345; CHECK-P9-LABEL: goo_safe:
346; CHECK-P9:       # %bb.0:
347; CHECK-P9-NEXT:    xssqrtsp 0, 2
348; CHECK-P9-NEXT:    xsdivsp 1, 1, 0
349; CHECK-P9-NEXT:    blr
350  %x = call float @llvm.sqrt.f32(float %b)
351  %r = fdiv float %a, %x
352  ret float %r
353}
354
355define float @no_estimate_refinement_f32(float %a, float %b) #0 {
356; CHECK-P7-LABEL: no_estimate_refinement_f32:
357; CHECK-P7:       # %bb.0:
358; CHECK-P7-NEXT:    frsqrtes 0, 2
359; CHECK-P7-NEXT:    fmuls 1, 1, 0
360; CHECK-P7-NEXT:    blr
361;
362; CHECK-P8-LABEL: no_estimate_refinement_f32:
363; CHECK-P8:       # %bb.0:
364; CHECK-P8-NEXT:    xsrsqrtesp 0, 2
365; CHECK-P8-NEXT:    xsmulsp 1, 1, 0
366; CHECK-P8-NEXT:    blr
367;
368; CHECK-P9-LABEL: no_estimate_refinement_f32:
369; CHECK-P9:       # %bb.0:
370; CHECK-P9-NEXT:    xsrsqrtesp 0, 2
371; CHECK-P9-NEXT:    xsmulsp 1, 1, 0
372; CHECK-P9-NEXT:    blr
373  %x = call reassoc arcp float @llvm.sqrt.f32(float %b)
374  %r = fdiv reassoc arcp float %a, %x
375  ret float %r
376}
377
378define float @rsqrt_fmul_fmf(float %a, float %b, float %c) {
379; CHECK-P7-LABEL: rsqrt_fmul_fmf:
380; CHECK-P7:       # %bb.0:
381; CHECK-P7-NEXT:    frsqrtes 0, 1
382; CHECK-P7-NEXT:    addis 3, 2, .LCPI10_0@toc@ha
383; CHECK-P7-NEXT:    addis 4, 2, .LCPI10_1@toc@ha
384; CHECK-P7-NEXT:    lfs 4, .LCPI10_0@toc@l(3)
385; CHECK-P7-NEXT:    lfs 5, .LCPI10_1@toc@l(4)
386; CHECK-P7-NEXT:    fmuls 1, 1, 0
387; CHECK-P7-NEXT:    fmadds 1, 1, 0, 4
388; CHECK-P7-NEXT:    fmuls 0, 0, 5
389; CHECK-P7-NEXT:    fmuls 0, 0, 1
390; CHECK-P7-NEXT:    fres 1, 2
391; CHECK-P7-NEXT:    fmuls 4, 0, 1
392; CHECK-P7-NEXT:    fnmsubs 0, 2, 4, 0
393; CHECK-P7-NEXT:    fmadds 0, 1, 0, 4
394; CHECK-P7-NEXT:    fmuls 1, 3, 0
395; CHECK-P7-NEXT:    blr
396;
397; CHECK-P8-LABEL: rsqrt_fmul_fmf:
398; CHECK-P8:       # %bb.0:
399; CHECK-P8-NEXT:    xsrsqrtesp 0, 1
400; CHECK-P8-NEXT:    addis 3, 2, .LCPI10_0@toc@ha
401; CHECK-P8-NEXT:    lfs 4, .LCPI10_0@toc@l(3)
402; CHECK-P8-NEXT:    addis 3, 2, .LCPI10_1@toc@ha
403; CHECK-P8-NEXT:    lfs 5, .LCPI10_1@toc@l(3)
404; CHECK-P8-NEXT:    xsmulsp 1, 1, 0
405; CHECK-P8-NEXT:    xsmaddasp 4, 1, 0
406; CHECK-P8-NEXT:    xsmulsp 0, 0, 5
407; CHECK-P8-NEXT:    xsresp 1, 2
408; CHECK-P8-NEXT:    xsmulsp 0, 0, 4
409; CHECK-P8-NEXT:    xsmulsp 4, 0, 1
410; CHECK-P8-NEXT:    xsnmsubasp 0, 2, 4
411; CHECK-P8-NEXT:    xsmaddasp 4, 1, 0
412; CHECK-P8-NEXT:    xsmulsp 1, 3, 4
413; CHECK-P8-NEXT:    blr
414;
415; CHECK-P9-LABEL: rsqrt_fmul_fmf:
416; CHECK-P9:       # %bb.0:
417; CHECK-P9-NEXT:    xsrsqrtesp 0, 1
418; CHECK-P9-NEXT:    addis 3, 2, .LCPI10_0@toc@ha
419; CHECK-P9-NEXT:    lfs 4, .LCPI10_0@toc@l(3)
420; CHECK-P9-NEXT:    addis 3, 2, .LCPI10_1@toc@ha
421; CHECK-P9-NEXT:    xsmulsp 1, 1, 0
422; CHECK-P9-NEXT:    xsmaddasp 4, 1, 0
423; CHECK-P9-NEXT:    lfs 1, .LCPI10_1@toc@l(3)
424; CHECK-P9-NEXT:    xsmulsp 0, 0, 1
425; CHECK-P9-NEXT:    xsresp 1, 2
426; CHECK-P9-NEXT:    xsmulsp 0, 0, 4
427; CHECK-P9-NEXT:    xsmulsp 4, 0, 1
428; CHECK-P9-NEXT:    xsnmsubasp 0, 2, 4
429; CHECK-P9-NEXT:    xsmaddasp 4, 1, 0
430; CHECK-P9-NEXT:    xsmulsp 1, 3, 4
431; CHECK-P9-NEXT:    blr
432  %x = call contract reassoc arcp nsz float @llvm.sqrt.f32(float %a)
433  %y = fmul contract reassoc nsz float %x, %b
434  %z = fdiv contract reassoc arcp nsz ninf float %c, %y
435  ret float %z
436}
437
438define float @rsqrt_fmul_safe(float %a, float %b, float %c) {
439; CHECK-P7-LABEL: rsqrt_fmul_safe:
440; CHECK-P7:       # %bb.0:
441; CHECK-P7-NEXT:    fsqrts 0, 1
442; CHECK-P7-NEXT:    fmuls 0, 0, 2
443; CHECK-P7-NEXT:    fdivs 1, 3, 0
444; CHECK-P7-NEXT:    blr
445;
446; CHECK-P8-LABEL: rsqrt_fmul_safe:
447; CHECK-P8:       # %bb.0:
448; CHECK-P8-NEXT:    xssqrtsp 0, 1
449; CHECK-P8-NEXT:    xsmulsp 0, 0, 2
450; CHECK-P8-NEXT:    xsdivsp 1, 3, 0
451; CHECK-P8-NEXT:    blr
452;
453; CHECK-P9-LABEL: rsqrt_fmul_safe:
454; CHECK-P9:       # %bb.0:
455; CHECK-P9-NEXT:    xssqrtsp 0, 1
456; CHECK-P9-NEXT:    xsmulsp 0, 0, 2
457; CHECK-P9-NEXT:    xsdivsp 1, 3, 0
458; CHECK-P9-NEXT:    blr
459  %x = call float @llvm.sqrt.f32(float %a)
460  %y = fmul float %x, %b
461  %z = fdiv float %c, %y
462  ret float %z
463}
464
465define <4 x float> @hoo_fmf(<4 x float> %a, <4 x float> %b) nounwind {
466; CHECK-P7-LABEL: hoo_fmf:
467; CHECK-P7:       # %bb.0:
468; CHECK-P7-NEXT:    vspltisw 4, -1
469; CHECK-P7-NEXT:    addis 3, 2, .LCPI12_0@toc@ha
470; CHECK-P7-NEXT:    vrsqrtefp 5, 3
471; CHECK-P7-NEXT:    addi 3, 3, .LCPI12_0@toc@l
472; CHECK-P7-NEXT:    lvx 0, 0, 3
473; CHECK-P7-NEXT:    addis 3, 2, .LCPI12_1@toc@ha
474; CHECK-P7-NEXT:    addi 3, 3, .LCPI12_1@toc@l
475; CHECK-P7-NEXT:    lvx 1, 0, 3
476; CHECK-P7-NEXT:    vslw 4, 4, 4
477; CHECK-P7-NEXT:    vmaddfp 3, 3, 5, 4
478; CHECK-P7-NEXT:    vmaddfp 3, 3, 5, 0
479; CHECK-P7-NEXT:    vmaddfp 5, 5, 1, 4
480; CHECK-P7-NEXT:    vmaddfp 3, 5, 3, 4
481; CHECK-P7-NEXT:    vmaddfp 2, 2, 3, 4
482; CHECK-P7-NEXT:    blr
483;
484; CHECK-P8-LABEL: hoo_fmf:
485; CHECK-P8:       # %bb.0:
486; CHECK-P8-NEXT:    xvrsqrtesp 0, 35
487; CHECK-P8-NEXT:    addis 3, 2, .LCPI12_0@toc@ha
488; CHECK-P8-NEXT:    addis 4, 2, .LCPI12_1@toc@ha
489; CHECK-P8-NEXT:    addi 3, 3, .LCPI12_0@toc@l
490; CHECK-P8-NEXT:    lxvd2x 1, 0, 3
491; CHECK-P8-NEXT:    addi 3, 4, .LCPI12_1@toc@l
492; CHECK-P8-NEXT:    lxvd2x 3, 0, 3
493; CHECK-P8-NEXT:    xxswapd 1, 1
494; CHECK-P8-NEXT:    xvmulsp 2, 35, 0
495; CHECK-P8-NEXT:    xxswapd 35, 3
496; CHECK-P8-NEXT:    xvmaddasp 1, 2, 0
497; CHECK-P8-NEXT:    xvmulsp 0, 0, 35
498; CHECK-P8-NEXT:    xvmulsp 0, 0, 1
499; CHECK-P8-NEXT:    xvmulsp 34, 34, 0
500; CHECK-P8-NEXT:    blr
501;
502; CHECK-P9-LABEL: hoo_fmf:
503; CHECK-P9:       # %bb.0:
504; CHECK-P9-NEXT:    xvrsqrtesp 0, 35
505; CHECK-P9-NEXT:    addis 3, 2, .LCPI12_0@toc@ha
506; CHECK-P9-NEXT:    addi 3, 3, .LCPI12_0@toc@l
507; CHECK-P9-NEXT:    lxv 2, 0(3)
508; CHECK-P9-NEXT:    addis 3, 2, .LCPI12_1@toc@ha
509; CHECK-P9-NEXT:    addi 3, 3, .LCPI12_1@toc@l
510; CHECK-P9-NEXT:    xvmulsp 1, 35, 0
511; CHECK-P9-NEXT:    xvmaddasp 2, 1, 0
512; CHECK-P9-NEXT:    lxv 1, 0(3)
513; CHECK-P9-NEXT:    xvmulsp 0, 0, 1
514; CHECK-P9-NEXT:    xvmulsp 0, 0, 2
515; CHECK-P9-NEXT:    xvmulsp 34, 34, 0
516; CHECK-P9-NEXT:    blr
517  %x = call contract reassoc arcp <4 x float> @llvm.sqrt.v4f32(<4 x float> %b)
518  %r = fdiv contract reassoc arcp <4 x float> %a, %x
519  ret <4 x float> %r
520}
521
522define <4 x float> @hoo_safe(<4 x float> %a, <4 x float> %b) nounwind {
523; CHECK-P7-LABEL: hoo_safe:
524; CHECK-P7:       # %bb.0:
525; CHECK-P7-NEXT:    addi 3, 1, -32
526; CHECK-P7-NEXT:    stvx 3, 0, 3
527; CHECK-P7-NEXT:    addi 3, 1, -48
528; CHECK-P7-NEXT:    lfs 0, -20(1)
529; CHECK-P7-NEXT:    lfs 3, -24(1)
530; CHECK-P7-NEXT:    lfs 1, -32(1)
531; CHECK-P7-NEXT:    lfs 2, -28(1)
532; CHECK-P7-NEXT:    stvx 2, 0, 3
533; CHECK-P7-NEXT:    addi 3, 1, -16
534; CHECK-P7-NEXT:    fsqrts 0, 0
535; CHECK-P7-NEXT:    lfs 4, -36(1)
536; CHECK-P7-NEXT:    fsqrts 3, 3
537; CHECK-P7-NEXT:    fsqrts 2, 2
538; CHECK-P7-NEXT:    fsqrts 1, 1
539; CHECK-P7-NEXT:    fdivs 0, 4, 0
540; CHECK-P7-NEXT:    stfs 0, -4(1)
541; CHECK-P7-NEXT:    lfs 0, -40(1)
542; CHECK-P7-NEXT:    fdivs 0, 0, 3
543; CHECK-P7-NEXT:    stfs 0, -8(1)
544; CHECK-P7-NEXT:    lfs 0, -44(1)
545; CHECK-P7-NEXT:    fdivs 0, 0, 2
546; CHECK-P7-NEXT:    stfs 0, -12(1)
547; CHECK-P7-NEXT:    lfs 0, -48(1)
548; CHECK-P7-NEXT:    fdivs 0, 0, 1
549; CHECK-P7-NEXT:    stfs 0, -16(1)
550; CHECK-P7-NEXT:    lvx 2, 0, 3
551; CHECK-P7-NEXT:    blr
552;
553; CHECK-P8-LABEL: hoo_safe:
554; CHECK-P8:       # %bb.0:
555; CHECK-P8-NEXT:    xvsqrtsp 0, 35
556; CHECK-P8-NEXT:    xvdivsp 34, 34, 0
557; CHECK-P8-NEXT:    blr
558;
559; CHECK-P9-LABEL: hoo_safe:
560; CHECK-P9:       # %bb.0:
561; CHECK-P9-NEXT:    xvsqrtsp 0, 35
562; CHECK-P9-NEXT:    xvdivsp 34, 34, 0
563; CHECK-P9-NEXT:    blr
564  %x = call <4 x float> @llvm.sqrt.v4f32(<4 x float> %b)
565  %r = fdiv <4 x float> %a, %x
566  ret <4 x float> %r
567}
568
569define double @foo2_fmf(double %a, double %b) nounwind {
570; CHECK-P7-LABEL: foo2_fmf:
571; CHECK-P7:       # %bb.0:
572; CHECK-P7-NEXT:    fre 0, 2
573; CHECK-P7-NEXT:    addis 3, 2, .LCPI14_0@toc@ha
574; CHECK-P7-NEXT:    lfs 3, .LCPI14_0@toc@l(3)
575; CHECK-P7-NEXT:    fmadd 3, 2, 0, 3
576; CHECK-P7-NEXT:    fnmsub 0, 0, 3, 0
577; CHECK-P7-NEXT:    fmul 3, 1, 0
578; CHECK-P7-NEXT:    fnmsub 1, 2, 3, 1
579; CHECK-P7-NEXT:    fmadd 1, 0, 1, 3
580; CHECK-P7-NEXT:    blr
581;
582; CHECK-P8-LABEL: foo2_fmf:
583; CHECK-P8:       # %bb.0:
584; CHECK-P8-NEXT:    xsredp 3, 2
585; CHECK-P8-NEXT:    addis 3, 2, .LCPI14_0@toc@ha
586; CHECK-P8-NEXT:    lfs 0, .LCPI14_0@toc@l(3)
587; CHECK-P8-NEXT:    xsmaddadp 0, 2, 3
588; CHECK-P8-NEXT:    xsnmsubadp 3, 3, 0
589; CHECK-P8-NEXT:    xsmuldp 0, 1, 3
590; CHECK-P8-NEXT:    xsnmsubadp 1, 2, 0
591; CHECK-P8-NEXT:    xsmaddadp 0, 3, 1
592; CHECK-P8-NEXT:    fmr 1, 0
593; CHECK-P8-NEXT:    blr
594;
595; CHECK-P9-LABEL: foo2_fmf:
596; CHECK-P9:       # %bb.0:
597; CHECK-P9-NEXT:    addis 3, 2, .LCPI14_0@toc@ha
598; CHECK-P9-NEXT:    xsredp 3, 2
599; CHECK-P9-NEXT:    lfs 0, .LCPI14_0@toc@l(3)
600; CHECK-P9-NEXT:    xsmaddadp 0, 2, 3
601; CHECK-P9-NEXT:    xsnmsubadp 3, 3, 0
602; CHECK-P9-NEXT:    xsmuldp 0, 1, 3
603; CHECK-P9-NEXT:    xsnmsubadp 1, 2, 0
604; CHECK-P9-NEXT:    xsmaddadp 0, 3, 1
605; CHECK-P9-NEXT:    fmr 1, 0
606; CHECK-P9-NEXT:    blr
607  %r = fdiv contract reassoc arcp nsz ninf double %a, %b
608  ret double %r
609}
610
611define double @foo2_safe(double %a, double %b) nounwind {
612; CHECK-P7-LABEL: foo2_safe:
613; CHECK-P7:       # %bb.0:
614; CHECK-P7-NEXT:    fdiv 1, 1, 2
615; CHECK-P7-NEXT:    blr
616;
617; CHECK-P8-LABEL: foo2_safe:
618; CHECK-P8:       # %bb.0:
619; CHECK-P8-NEXT:    xsdivdp 1, 1, 2
620; CHECK-P8-NEXT:    blr
621;
622; CHECK-P9-LABEL: foo2_safe:
623; CHECK-P9:       # %bb.0:
624; CHECK-P9-NEXT:    xsdivdp 1, 1, 2
625; CHECK-P9-NEXT:    blr
626  %r = fdiv double %a, %b
627  ret double %r
628}
629
630define float @goo2_fmf(float %a, float %b) nounwind {
631; CHECK-P7-LABEL: goo2_fmf:
632; CHECK-P7:       # %bb.0:
633; CHECK-P7-NEXT:    fres 0, 2
634; CHECK-P7-NEXT:    fmuls 3, 1, 0
635; CHECK-P7-NEXT:    fnmsubs 1, 2, 3, 1
636; CHECK-P7-NEXT:    fmadds 1, 0, 1, 3
637; CHECK-P7-NEXT:    blr
638;
639; CHECK-P8-LABEL: goo2_fmf:
640; CHECK-P8:       # %bb.0:
641; CHECK-P8-NEXT:    xsresp 3, 2
642; CHECK-P8-NEXT:    xsmulsp 0, 1, 3
643; CHECK-P8-NEXT:    xsnmsubasp 1, 2, 0
644; CHECK-P8-NEXT:    xsmaddasp 0, 3, 1
645; CHECK-P8-NEXT:    fmr 1, 0
646; CHECK-P8-NEXT:    blr
647;
648; CHECK-P9-LABEL: goo2_fmf:
649; CHECK-P9:       # %bb.0:
650; CHECK-P9-NEXT:    xsresp 3, 2
651; CHECK-P9-NEXT:    xsmulsp 0, 1, 3
652; CHECK-P9-NEXT:    xsnmsubasp 1, 2, 0
653; CHECK-P9-NEXT:    xsmaddasp 0, 3, 1
654; CHECK-P9-NEXT:    fmr 1, 0
655; CHECK-P9-NEXT:    blr
656  %r = fdiv contract reassoc arcp nsz ninf float %a, %b
657  ret float %r
658}
659
660define float @goo2_safe(float %a, float %b) nounwind {
661; CHECK-P7-LABEL: goo2_safe:
662; CHECK-P7:       # %bb.0:
663; CHECK-P7-NEXT:    fdivs 1, 1, 2
664; CHECK-P7-NEXT:    blr
665;
666; CHECK-P8-LABEL: goo2_safe:
667; CHECK-P8:       # %bb.0:
668; CHECK-P8-NEXT:    xsdivsp 1, 1, 2
669; CHECK-P8-NEXT:    blr
670;
671; CHECK-P9-LABEL: goo2_safe:
672; CHECK-P9:       # %bb.0:
673; CHECK-P9-NEXT:    xsdivsp 1, 1, 2
674; CHECK-P9-NEXT:    blr
675  %r = fdiv float %a, %b
676  ret float %r
677}
678
679define <4 x float> @hoo2_fmf(<4 x float> %a, <4 x float> %b) nounwind {
680; CHECK-P7-LABEL: hoo2_fmf:
681; CHECK-P7:       # %bb.0:
682; CHECK-P7-NEXT:    vspltisw 4, -1
683; CHECK-P7-NEXT:    vrefp 5, 3
684; CHECK-P7-NEXT:    vslw 4, 4, 4
685; CHECK-P7-NEXT:    vmaddfp 4, 2, 5, 4
686; CHECK-P7-NEXT:    vnmsubfp 2, 3, 4, 2
687; CHECK-P7-NEXT:    vmaddfp 2, 5, 2, 4
688; CHECK-P7-NEXT:    blr
689;
690; CHECK-P8-LABEL: hoo2_fmf:
691; CHECK-P8:       # %bb.0:
692; CHECK-P8-NEXT:    xvresp 1, 35
693; CHECK-P8-NEXT:    xvmulsp 0, 34, 1
694; CHECK-P8-NEXT:    xvnmsubasp 34, 35, 0
695; CHECK-P8-NEXT:    xvmaddasp 0, 1, 34
696; CHECK-P8-NEXT:    xxlor 34, 0, 0
697; CHECK-P8-NEXT:    blr
698;
699; CHECK-P9-LABEL: hoo2_fmf:
700; CHECK-P9:       # %bb.0:
701; CHECK-P9-NEXT:    xvresp 1, 35
702; CHECK-P9-NEXT:    xvmulsp 0, 34, 1
703; CHECK-P9-NEXT:    xvnmsubasp 34, 35, 0
704; CHECK-P9-NEXT:    xvmaddasp 0, 1, 34
705; CHECK-P9-NEXT:    xxlor 34, 0, 0
706; CHECK-P9-NEXT:    blr
707  %r = fdiv contract reassoc arcp nsz ninf <4 x float> %a, %b
708  ret <4 x float> %r
709}
710
711define <4 x float> @hoo2_safe(<4 x float> %a, <4 x float> %b) nounwind {
712; CHECK-P7-LABEL: hoo2_safe:
713; CHECK-P7:       # %bb.0:
714; CHECK-P7-NEXT:    addi 3, 1, -32
715; CHECK-P7-NEXT:    addi 4, 1, -48
716; CHECK-P7-NEXT:    stvx 3, 0, 3
717; CHECK-P7-NEXT:    stvx 2, 0, 4
718; CHECK-P7-NEXT:    lfs 0, -20(1)
719; CHECK-P7-NEXT:    lfs 1, -36(1)
720; CHECK-P7-NEXT:    addi 3, 1, -16
721; CHECK-P7-NEXT:    fdivs 0, 1, 0
722; CHECK-P7-NEXT:    lfs 1, -40(1)
723; CHECK-P7-NEXT:    stfs 0, -4(1)
724; CHECK-P7-NEXT:    lfs 0, -24(1)
725; CHECK-P7-NEXT:    fdivs 0, 1, 0
726; CHECK-P7-NEXT:    lfs 1, -44(1)
727; CHECK-P7-NEXT:    stfs 0, -8(1)
728; CHECK-P7-NEXT:    lfs 0, -28(1)
729; CHECK-P7-NEXT:    fdivs 0, 1, 0
730; CHECK-P7-NEXT:    lfs 1, -48(1)
731; CHECK-P7-NEXT:    stfs 0, -12(1)
732; CHECK-P7-NEXT:    lfs 0, -32(1)
733; CHECK-P7-NEXT:    fdivs 0, 1, 0
734; CHECK-P7-NEXT:    stfs 0, -16(1)
735; CHECK-P7-NEXT:    lvx 2, 0, 3
736; CHECK-P7-NEXT:    blr
737;
738; CHECK-P8-LABEL: hoo2_safe:
739; CHECK-P8:       # %bb.0:
740; CHECK-P8-NEXT:    xvdivsp 34, 34, 35
741; CHECK-P8-NEXT:    blr
742;
743; CHECK-P9-LABEL: hoo2_safe:
744; CHECK-P9:       # %bb.0:
745; CHECK-P9-NEXT:    xvdivsp 34, 34, 35
746; CHECK-P9-NEXT:    blr
747  %r = fdiv <4 x float> %a, %b
748  ret <4 x float> %r
749}
750
751define double @foo3_fmf(double %a) nounwind {
752; CHECK-P7-LABEL: foo3_fmf:
753; CHECK-P7:       # %bb.0:
754; CHECK-P7-NEXT:    ftsqrt 0, 1
755; CHECK-P7-NEXT:    bc 12, 2, .LBB20_2
756; CHECK-P7-NEXT:  # %bb.1:
757; CHECK-P7-NEXT:    frsqrte 0, 1
758; CHECK-P7-NEXT:    addis 3, 2, .LCPI20_0@toc@ha
759; CHECK-P7-NEXT:    addis 4, 2, .LCPI20_1@toc@ha
760; CHECK-P7-NEXT:    lfs 3, .LCPI20_0@toc@l(3)
761; CHECK-P7-NEXT:    lfs 4, .LCPI20_1@toc@l(4)
762; CHECK-P7-NEXT:    fmul 2, 1, 0
763; CHECK-P7-NEXT:    fmadd 2, 2, 0, 3
764; CHECK-P7-NEXT:    fmul 0, 0, 4
765; CHECK-P7-NEXT:    fmul 0, 0, 2
766; CHECK-P7-NEXT:    fmul 1, 1, 0
767; CHECK-P7-NEXT:    fmadd 0, 1, 0, 3
768; CHECK-P7-NEXT:    fmul 1, 1, 4
769; CHECK-P7-NEXT:    fmul 1, 1, 0
770; CHECK-P7-NEXT:    blr
771; CHECK-P7-NEXT:  .LBB20_2:
772; CHECK-P7-NEXT:    fsqrt 1, 1
773; CHECK-P7-NEXT:    blr
774;
775; CHECK-P8-LABEL: foo3_fmf:
776; CHECK-P8:       # %bb.0:
777; CHECK-P8-NEXT:    xstsqrtdp 0, 1
778; CHECK-P8-NEXT:    bc 12, 2, .LBB20_2
779; CHECK-P8-NEXT:  # %bb.1:
780; CHECK-P8-NEXT:    xsrsqrtedp 0, 1
781; CHECK-P8-NEXT:    addis 3, 2, .LCPI20_0@toc@ha
782; CHECK-P8-NEXT:    lfs 3, .LCPI20_0@toc@l(3)
783; CHECK-P8-NEXT:    addis 3, 2, .LCPI20_1@toc@ha
784; CHECK-P8-NEXT:    lfs 4, .LCPI20_1@toc@l(3)
785; CHECK-P8-NEXT:    fmr 5, 3
786; CHECK-P8-NEXT:    xsmuldp 2, 1, 0
787; CHECK-P8-NEXT:    xsmaddadp 5, 2, 0
788; CHECK-P8-NEXT:    xsmuldp 0, 0, 4
789; CHECK-P8-NEXT:    xsmuldp 0, 0, 5
790; CHECK-P8-NEXT:    xsmuldp 1, 1, 0
791; CHECK-P8-NEXT:    xsmaddadp 3, 1, 0
792; CHECK-P8-NEXT:    xsmuldp 0, 1, 4
793; CHECK-P8-NEXT:    xsmuldp 1, 0, 3
794; CHECK-P8-NEXT:    blr
795; CHECK-P8-NEXT:  .LBB20_2:
796; CHECK-P8-NEXT:    xssqrtdp 1, 1
797; CHECK-P8-NEXT:    blr
798;
799; CHECK-P9-LABEL: foo3_fmf:
800; CHECK-P9:       # %bb.0:
801; CHECK-P9-NEXT:    xstsqrtdp 0, 1
802; CHECK-P9-NEXT:    bc 12, 2, .LBB20_2
803; CHECK-P9-NEXT:  # %bb.1:
804; CHECK-P9-NEXT:    xsrsqrtedp 0, 1
805; CHECK-P9-NEXT:    addis 3, 2, .LCPI20_0@toc@ha
806; CHECK-P9-NEXT:    lfs 3, .LCPI20_0@toc@l(3)
807; CHECK-P9-NEXT:    addis 3, 2, .LCPI20_1@toc@ha
808; CHECK-P9-NEXT:    xsmuldp 2, 1, 0
809; CHECK-P9-NEXT:    fmr 4, 3
810; CHECK-P9-NEXT:    xsmaddadp 4, 2, 0
811; CHECK-P9-NEXT:    lfs 2, .LCPI20_1@toc@l(3)
812; CHECK-P9-NEXT:    xsmuldp 0, 0, 2
813; CHECK-P9-NEXT:    xsmuldp 0, 0, 4
814; CHECK-P9-NEXT:    xsmuldp 1, 1, 0
815; CHECK-P9-NEXT:    xsmaddadp 3, 1, 0
816; CHECK-P9-NEXT:    xsmuldp 0, 1, 2
817; CHECK-P9-NEXT:    xsmuldp 1, 0, 3
818; CHECK-P9-NEXT:    blr
819; CHECK-P9-NEXT:  .LBB20_2:
820; CHECK-P9-NEXT:    xssqrtdp 1, 1
821; CHECK-P9-NEXT:    blr
822  %r = call contract reassoc ninf afn double @llvm.sqrt.f64(double %a)
823  ret double %r
824}
825
826define double @foo3_fmf_crbits_off(double %a) #2 {
827; CHECK-P7-LABEL: foo3_fmf_crbits_off:
828; CHECK-P7:       # %bb.0:
829; CHECK-P7-NEXT:    fabs 0, 1
830; CHECK-P7-NEXT:    addis 3, 2, .LCPI21_2@toc@ha
831; CHECK-P7-NEXT:    lfd 2, .LCPI21_2@toc@l(3)
832; CHECK-P7-NEXT:    fcmpu 0, 0, 2
833; CHECK-P7-NEXT:    blt 0, .LBB21_2
834; CHECK-P7-NEXT:  # %bb.1:
835; CHECK-P7-NEXT:    frsqrte 0, 1
836; CHECK-P7-NEXT:    addis 3, 2, .LCPI21_0@toc@ha
837; CHECK-P7-NEXT:    addis 4, 2, .LCPI21_1@toc@ha
838; CHECK-P7-NEXT:    lfs 3, .LCPI21_0@toc@l(3)
839; CHECK-P7-NEXT:    lfs 4, .LCPI21_1@toc@l(4)
840; CHECK-P7-NEXT:    fmul 2, 1, 0
841; CHECK-P7-NEXT:    fmadd 2, 2, 0, 3
842; CHECK-P7-NEXT:    fmul 0, 0, 4
843; CHECK-P7-NEXT:    fmul 0, 0, 2
844; CHECK-P7-NEXT:    fmul 1, 1, 0
845; CHECK-P7-NEXT:    fmadd 0, 1, 0, 3
846; CHECK-P7-NEXT:    fmul 1, 1, 4
847; CHECK-P7-NEXT:    fmul 1, 1, 0
848; CHECK-P7-NEXT:    blr
849; CHECK-P7-NEXT:  .LBB21_2:
850; CHECK-P7-NEXT:    fsqrt 1, 1
851; CHECK-P7-NEXT:    blr
852;
853; CHECK-P8-LABEL: foo3_fmf_crbits_off:
854; CHECK-P8:       # %bb.0:
855; CHECK-P8-NEXT:    xsabsdp 0, 1
856; CHECK-P8-NEXT:    addis 3, 2, .LCPI21_2@toc@ha
857; CHECK-P8-NEXT:    lfd 2, .LCPI21_2@toc@l(3)
858; CHECK-P8-NEXT:    xscmpudp 0, 0, 2
859; CHECK-P8-NEXT:    blt 0, .LBB21_2
860; CHECK-P8-NEXT:  # %bb.1:
861; CHECK-P8-NEXT:    xsrsqrtedp 0, 1
862; CHECK-P8-NEXT:    addis 3, 2, .LCPI21_0@toc@ha
863; CHECK-P8-NEXT:    lfs 3, .LCPI21_0@toc@l(3)
864; CHECK-P8-NEXT:    addis 3, 2, .LCPI21_1@toc@ha
865; CHECK-P8-NEXT:    lfs 4, .LCPI21_1@toc@l(3)
866; CHECK-P8-NEXT:    fmr 5, 3
867; CHECK-P8-NEXT:    xsmuldp 2, 1, 0
868; CHECK-P8-NEXT:    xsmaddadp 5, 2, 0
869; CHECK-P8-NEXT:    xsmuldp 0, 0, 4
870; CHECK-P8-NEXT:    xsmuldp 0, 0, 5
871; CHECK-P8-NEXT:    xsmuldp 1, 1, 0
872; CHECK-P8-NEXT:    xsmaddadp 3, 1, 0
873; CHECK-P8-NEXT:    xsmuldp 0, 1, 4
874; CHECK-P8-NEXT:    xsmuldp 1, 0, 3
875; CHECK-P8-NEXT:    blr
876; CHECK-P8-NEXT:  .LBB21_2:
877; CHECK-P8-NEXT:    xssqrtdp 1, 1
878; CHECK-P8-NEXT:    blr
879;
880; CHECK-P9-LABEL: foo3_fmf_crbits_off:
881; CHECK-P9:       # %bb.0:
882; CHECK-P9-NEXT:    addis 3, 2, .LCPI21_2@toc@ha
883; CHECK-P9-NEXT:    xsabsdp 0, 1
884; CHECK-P9-NEXT:    lfd 2, .LCPI21_2@toc@l(3)
885; CHECK-P9-NEXT:    xscmpudp 0, 0, 2
886; CHECK-P9-NEXT:    blt 0, .LBB21_2
887; CHECK-P9-NEXT:  # %bb.1:
888; CHECK-P9-NEXT:    xsrsqrtedp 0, 1
889; CHECK-P9-NEXT:    addis 3, 2, .LCPI21_0@toc@ha
890; CHECK-P9-NEXT:    lfs 3, .LCPI21_0@toc@l(3)
891; CHECK-P9-NEXT:    addis 3, 2, .LCPI21_1@toc@ha
892; CHECK-P9-NEXT:    xsmuldp 2, 1, 0
893; CHECK-P9-NEXT:    fmr 4, 3
894; CHECK-P9-NEXT:    xsmaddadp 4, 2, 0
895; CHECK-P9-NEXT:    lfs 2, .LCPI21_1@toc@l(3)
896; CHECK-P9-NEXT:    xsmuldp 0, 0, 2
897; CHECK-P9-NEXT:    xsmuldp 0, 0, 4
898; CHECK-P9-NEXT:    xsmuldp 1, 1, 0
899; CHECK-P9-NEXT:    xsmaddadp 3, 1, 0
900; CHECK-P9-NEXT:    xsmuldp 0, 1, 2
901; CHECK-P9-NEXT:    xsmuldp 1, 0, 3
902; CHECK-P9-NEXT:    blr
903; CHECK-P9-NEXT:  .LBB21_2:
904; CHECK-P9-NEXT:    xssqrtdp 1, 1
905; CHECK-P9-NEXT:    blr
906  %r = call contract reassoc ninf afn double @llvm.sqrt.f64(double %a)
907  ret double %r
908}
909
910define double @foo3_safe(double %a) nounwind {
911; CHECK-P7-LABEL: foo3_safe:
912; CHECK-P7:       # %bb.0:
913; CHECK-P7-NEXT:    fsqrt 1, 1
914; CHECK-P7-NEXT:    blr
915;
916; CHECK-P8-LABEL: foo3_safe:
917; CHECK-P8:       # %bb.0:
918; CHECK-P8-NEXT:    xssqrtdp 1, 1
919; CHECK-P8-NEXT:    blr
920;
921; CHECK-P9-LABEL: foo3_safe:
922; CHECK-P9:       # %bb.0:
923; CHECK-P9-NEXT:    xssqrtdp 1, 1
924; CHECK-P9-NEXT:    blr
925  %r = call double @llvm.sqrt.f64(double %a)
926  ret double %r
927}
928
929define float @goo3_fmf(float %a) nounwind {
930; CHECK-P7-LABEL: goo3_fmf:
931; CHECK-P7:       # %bb.0:
932; CHECK-P7-NEXT:    fabs 0, 1
933; CHECK-P7-NEXT:    addis 3, 2, .LCPI23_2@toc@ha
934; CHECK-P7-NEXT:    lfs 2, .LCPI23_2@toc@l(3)
935; CHECK-P7-NEXT:    fcmpu 0, 0, 2
936; CHECK-P7-NEXT:    blt 0, .LBB23_2
937; CHECK-P7-NEXT:  # %bb.1:
938; CHECK-P7-NEXT:    frsqrtes 0, 1
939; CHECK-P7-NEXT:    addis 3, 2, .LCPI23_0@toc@ha
940; CHECK-P7-NEXT:    addis 4, 2, .LCPI23_1@toc@ha
941; CHECK-P7-NEXT:    lfs 2, .LCPI23_0@toc@l(3)
942; CHECK-P7-NEXT:    lfs 3, .LCPI23_1@toc@l(4)
943; CHECK-P7-NEXT:    fmuls 1, 1, 0
944; CHECK-P7-NEXT:    fmadds 0, 1, 0, 2
945; CHECK-P7-NEXT:    fmuls 1, 1, 3
946; CHECK-P7-NEXT:    fmuls 1, 1, 0
947; CHECK-P7-NEXT:    blr
948; CHECK-P7-NEXT:  .LBB23_2:
949; CHECK-P7-NEXT:    addis 3, 2, .LCPI23_3@toc@ha
950; CHECK-P7-NEXT:    lfs 1, .LCPI23_3@toc@l(3)
951; CHECK-P7-NEXT:    blr
952;
953; CHECK-P8-LABEL: goo3_fmf:
954; CHECK-P8:       # %bb.0:
955; CHECK-P8-NEXT:    xsabsdp 0, 1
956; CHECK-P8-NEXT:    addis 3, 2, .LCPI23_2@toc@ha
957; CHECK-P8-NEXT:    lfs 2, .LCPI23_2@toc@l(3)
958; CHECK-P8-NEXT:    fcmpu 0, 0, 2
959; CHECK-P8-NEXT:    xxlxor 0, 0, 0
960; CHECK-P8-NEXT:    blt 0, .LBB23_2
961; CHECK-P8-NEXT:  # %bb.1:
962; CHECK-P8-NEXT:    xsrsqrtesp 0, 1
963; CHECK-P8-NEXT:    addis 3, 2, .LCPI23_0@toc@ha
964; CHECK-P8-NEXT:    lfs 2, .LCPI23_0@toc@l(3)
965; CHECK-P8-NEXT:    addis 3, 2, .LCPI23_1@toc@ha
966; CHECK-P8-NEXT:    lfs 3, .LCPI23_1@toc@l(3)
967; CHECK-P8-NEXT:    xsmulsp 1, 1, 0
968; CHECK-P8-NEXT:    xsmaddasp 2, 1, 0
969; CHECK-P8-NEXT:    xsmulsp 0, 1, 3
970; CHECK-P8-NEXT:    xsmulsp 0, 0, 2
971; CHECK-P8-NEXT:  .LBB23_2:
972; CHECK-P8-NEXT:    fmr 1, 0
973; CHECK-P8-NEXT:    blr
974;
975; CHECK-P9-LABEL: goo3_fmf:
976; CHECK-P9:       # %bb.0:
977; CHECK-P9-NEXT:    addis 3, 2, .LCPI23_2@toc@ha
978; CHECK-P9-NEXT:    xsabsdp 0, 1
979; CHECK-P9-NEXT:    lfs 2, .LCPI23_2@toc@l(3)
980; CHECK-P9-NEXT:    fcmpu 0, 0, 2
981; CHECK-P9-NEXT:    xxlxor 0, 0, 0
982; CHECK-P9-NEXT:    blt 0, .LBB23_2
983; CHECK-P9-NEXT:  # %bb.1:
984; CHECK-P9-NEXT:    xsrsqrtesp 0, 1
985; CHECK-P9-NEXT:    addis 3, 2, .LCPI23_0@toc@ha
986; CHECK-P9-NEXT:    lfs 2, .LCPI23_0@toc@l(3)
987; CHECK-P9-NEXT:    addis 3, 2, .LCPI23_1@toc@ha
988; CHECK-P9-NEXT:    xsmulsp 1, 1, 0
989; CHECK-P9-NEXT:    xsmaddasp 2, 1, 0
990; CHECK-P9-NEXT:    lfs 0, .LCPI23_1@toc@l(3)
991; CHECK-P9-NEXT:    xsmulsp 0, 1, 0
992; CHECK-P9-NEXT:    xsmulsp 0, 0, 2
993; CHECK-P9-NEXT:  .LBB23_2:
994; CHECK-P9-NEXT:    fmr 1, 0
995; CHECK-P9-NEXT:    blr
996  %r = call contract reassoc ninf afn float @llvm.sqrt.f32(float %a)
997  ret float %r
998}
999
1000define float @goo3_safe(float %a) nounwind {
1001; CHECK-P7-LABEL: goo3_safe:
1002; CHECK-P7:       # %bb.0:
1003; CHECK-P7-NEXT:    fsqrts 1, 1
1004; CHECK-P7-NEXT:    blr
1005;
1006; CHECK-P8-LABEL: goo3_safe:
1007; CHECK-P8:       # %bb.0:
1008; CHECK-P8-NEXT:    xssqrtsp 1, 1
1009; CHECK-P8-NEXT:    blr
1010;
1011; CHECK-P9-LABEL: goo3_safe:
1012; CHECK-P9:       # %bb.0:
1013; CHECK-P9-NEXT:    xssqrtsp 1, 1
1014; CHECK-P9-NEXT:    blr
1015  %r = call float @llvm.sqrt.f32(float %a)
1016  ret float %r
1017}
1018
1019define <4 x float> @hoo3_fmf(<4 x float> %a) #1 {
1020; CHECK-P7-LABEL: hoo3_fmf:
1021; CHECK-P7:       # %bb.0:
1022; CHECK-P7-NEXT:    vspltisw 3, -1
1023; CHECK-P7-NEXT:    addis 3, 2, .LCPI25_0@toc@ha
1024; CHECK-P7-NEXT:    vrsqrtefp 4, 2
1025; CHECK-P7-NEXT:    addi 3, 3, .LCPI25_0@toc@l
1026; CHECK-P7-NEXT:    lvx 0, 0, 3
1027; CHECK-P7-NEXT:    addis 3, 2, .LCPI25_1@toc@ha
1028; CHECK-P7-NEXT:    addi 3, 3, .LCPI25_1@toc@l
1029; CHECK-P7-NEXT:    lvx 1, 0, 3
1030; CHECK-P7-NEXT:    vslw 3, 3, 3
1031; CHECK-P7-NEXT:    vmaddfp 5, 2, 4, 3
1032; CHECK-P7-NEXT:    vmaddfp 4, 5, 4, 0
1033; CHECK-P7-NEXT:    vmaddfp 5, 5, 1, 3
1034; CHECK-P7-NEXT:    vxor 0, 0, 0
1035; CHECK-P7-NEXT:    vmaddfp 3, 5, 4, 3
1036; CHECK-P7-NEXT:    vcmpeqfp 2, 2, 0
1037; CHECK-P7-NEXT:    vsel 2, 3, 0, 2
1038; CHECK-P7-NEXT:    blr
1039;
1040; CHECK-P8-LABEL: hoo3_fmf:
1041; CHECK-P8:       # %bb.0:
1042; CHECK-P8-NEXT:    xvtsqrtsp 0, 34
1043; CHECK-P8-NEXT:    bc 12, 2, .LBB25_2
1044; CHECK-P8-NEXT:  # %bb.1:
1045; CHECK-P8-NEXT:    xvrsqrtesp 0, 34
1046; CHECK-P8-NEXT:    addis 3, 2, .LCPI25_0@toc@ha
1047; CHECK-P8-NEXT:    addis 4, 2, .LCPI25_1@toc@ha
1048; CHECK-P8-NEXT:    addi 3, 3, .LCPI25_0@toc@l
1049; CHECK-P8-NEXT:    lxvd2x 1, 0, 3
1050; CHECK-P8-NEXT:    addi 3, 4, .LCPI25_1@toc@l
1051; CHECK-P8-NEXT:    lxvd2x 3, 0, 3
1052; CHECK-P8-NEXT:    xxswapd 1, 1
1053; CHECK-P8-NEXT:    xvmulsp 2, 34, 0
1054; CHECK-P8-NEXT:    xxswapd 34, 3
1055; CHECK-P8-NEXT:    xvmaddasp 1, 2, 0
1056; CHECK-P8-NEXT:    xvmulsp 0, 2, 34
1057; CHECK-P8-NEXT:    xvmulsp 34, 0, 1
1058; CHECK-P8-NEXT:    blr
1059; CHECK-P8-NEXT:  .LBB25_2:
1060; CHECK-P8-NEXT:    xvsqrtsp 34, 34
1061; CHECK-P8-NEXT:    blr
1062;
1063; CHECK-P9-LABEL: hoo3_fmf:
1064; CHECK-P9:       # %bb.0:
1065; CHECK-P9-NEXT:    xvtsqrtsp 0, 34
1066; CHECK-P9-NEXT:    bc 12, 2, .LBB25_2
1067; CHECK-P9-NEXT:  # %bb.1:
1068; CHECK-P9-NEXT:    xvrsqrtesp 0, 34
1069; CHECK-P9-NEXT:    addis 3, 2, .LCPI25_0@toc@ha
1070; CHECK-P9-NEXT:    addi 3, 3, .LCPI25_0@toc@l
1071; CHECK-P9-NEXT:    lxv 2, 0(3)
1072; CHECK-P9-NEXT:    addis 3, 2, .LCPI25_1@toc@ha
1073; CHECK-P9-NEXT:    addi 3, 3, .LCPI25_1@toc@l
1074; CHECK-P9-NEXT:    xvmulsp 1, 34, 0
1075; CHECK-P9-NEXT:    xvmaddasp 2, 1, 0
1076; CHECK-P9-NEXT:    lxv 0, 0(3)
1077; CHECK-P9-NEXT:    xvmulsp 0, 1, 0
1078; CHECK-P9-NEXT:    xvmulsp 34, 0, 2
1079; CHECK-P9-NEXT:    blr
1080; CHECK-P9-NEXT:  .LBB25_2:
1081; CHECK-P9-NEXT:    xvsqrtsp 34, 34
1082; CHECK-P9-NEXT:    blr
1083  %r = call contract reassoc ninf afn <4 x float> @llvm.sqrt.v4f32(<4 x float> %a)
1084  ret <4 x float> %r
1085}
1086
1087define <4 x float> @hoo3_safe(<4 x float> %a) nounwind {
1088; CHECK-P7-LABEL: hoo3_safe:
1089; CHECK-P7:       # %bb.0:
1090; CHECK-P7-NEXT:    addi 3, 1, -32
1091; CHECK-P7-NEXT:    stvx 2, 0, 3
1092; CHECK-P7-NEXT:    addi 3, 1, -16
1093; CHECK-P7-NEXT:    lfs 0, -20(1)
1094; CHECK-P7-NEXT:    fsqrts 0, 0
1095; CHECK-P7-NEXT:    stfs 0, -4(1)
1096; CHECK-P7-NEXT:    lfs 0, -24(1)
1097; CHECK-P7-NEXT:    fsqrts 0, 0
1098; CHECK-P7-NEXT:    stfs 0, -8(1)
1099; CHECK-P7-NEXT:    lfs 0, -28(1)
1100; CHECK-P7-NEXT:    fsqrts 0, 0
1101; CHECK-P7-NEXT:    stfs 0, -12(1)
1102; CHECK-P7-NEXT:    lfs 0, -32(1)
1103; CHECK-P7-NEXT:    fsqrts 0, 0
1104; CHECK-P7-NEXT:    stfs 0, -16(1)
1105; CHECK-P7-NEXT:    lvx 2, 0, 3
1106; CHECK-P7-NEXT:    blr
1107;
1108; CHECK-P8-LABEL: hoo3_safe:
1109; CHECK-P8:       # %bb.0:
1110; CHECK-P8-NEXT:    xvsqrtsp 34, 34
1111; CHECK-P8-NEXT:    blr
1112;
1113; CHECK-P9-LABEL: hoo3_safe:
1114; CHECK-P9:       # %bb.0:
1115; CHECK-P9-NEXT:    xvsqrtsp 34, 34
1116; CHECK-P9-NEXT:    blr
1117  %r = call <4 x float> @llvm.sqrt.v4f32(<4 x float> %a)
1118  ret <4 x float> %r
1119}
1120
1121define <2 x double> @hoo4_fmf(<2 x double> %a) #1 {
1122; CHECK-P7-LABEL: hoo4_fmf:
1123; CHECK-P7:       # %bb.0:
1124; CHECK-P7-NEXT:    ftsqrt 0, 1
1125; CHECK-P7-NEXT:    addis 3, 2, .LCPI27_0@toc@ha
1126; CHECK-P7-NEXT:    addis 4, 2, .LCPI27_1@toc@ha
1127; CHECK-P7-NEXT:    lfs 3, .LCPI27_0@toc@l(3)
1128; CHECK-P7-NEXT:    lfs 0, .LCPI27_1@toc@l(4)
1129; CHECK-P7-NEXT:    bc 12, 2, .LBB27_3
1130; CHECK-P7-NEXT:  # %bb.1:
1131; CHECK-P7-NEXT:    frsqrte 4, 1
1132; CHECK-P7-NEXT:    fmul 5, 1, 4
1133; CHECK-P7-NEXT:    fmadd 5, 5, 4, 3
1134; CHECK-P7-NEXT:    fmul 4, 4, 0
1135; CHECK-P7-NEXT:    fmul 4, 4, 5
1136; CHECK-P7-NEXT:    fmul 1, 1, 4
1137; CHECK-P7-NEXT:    fmadd 4, 1, 4, 3
1138; CHECK-P7-NEXT:    fmul 1, 1, 0
1139; CHECK-P7-NEXT:    fmul 1, 1, 4
1140; CHECK-P7-NEXT:    ftsqrt 0, 2
1141; CHECK-P7-NEXT:    bc 4, 2, .LBB27_4
1142; CHECK-P7-NEXT:  .LBB27_2:
1143; CHECK-P7-NEXT:    fsqrt 2, 2
1144; CHECK-P7-NEXT:    blr
1145; CHECK-P7-NEXT:  .LBB27_3:
1146; CHECK-P7-NEXT:    fsqrt 1, 1
1147; CHECK-P7-NEXT:    ftsqrt 0, 2
1148; CHECK-P7-NEXT:    bc 12, 2, .LBB27_2
1149; CHECK-P7-NEXT:  .LBB27_4:
1150; CHECK-P7-NEXT:    frsqrte 4, 2
1151; CHECK-P7-NEXT:    fmul 5, 2, 4
1152; CHECK-P7-NEXT:    fmadd 5, 5, 4, 3
1153; CHECK-P7-NEXT:    fmul 4, 4, 0
1154; CHECK-P7-NEXT:    fmul 4, 4, 5
1155; CHECK-P7-NEXT:    fmul 2, 2, 4
1156; CHECK-P7-NEXT:    fmadd 3, 2, 4, 3
1157; CHECK-P7-NEXT:    fmul 0, 2, 0
1158; CHECK-P7-NEXT:    fmul 2, 0, 3
1159; CHECK-P7-NEXT:    blr
1160;
1161; CHECK-P8-LABEL: hoo4_fmf:
1162; CHECK-P8:       # %bb.0:
1163; CHECK-P8-NEXT:    xvtsqrtdp 0, 34
1164; CHECK-P8-NEXT:    bc 12, 2, .LBB27_2
1165; CHECK-P8-NEXT:  # %bb.1:
1166; CHECK-P8-NEXT:    xvrsqrtedp 0, 34
1167; CHECK-P8-NEXT:    addis 3, 2, .LCPI27_0@toc@ha
1168; CHECK-P8-NEXT:    addi 3, 3, .LCPI27_0@toc@l
1169; CHECK-P8-NEXT:    lxvd2x 1, 0, 3
1170; CHECK-P8-NEXT:    addis 3, 2, .LCPI27_1@toc@ha
1171; CHECK-P8-NEXT:    addi 3, 3, .LCPI27_1@toc@l
1172; CHECK-P8-NEXT:    lxvd2x 3, 0, 3
1173; CHECK-P8-NEXT:    xxswapd 1, 1
1174; CHECK-P8-NEXT:    xvmuldp 2, 34, 0
1175; CHECK-P8-NEXT:    xxswapd 3, 3
1176; CHECK-P8-NEXT:    xxlor 4, 1, 1
1177; CHECK-P8-NEXT:    xvmaddadp 4, 2, 0
1178; CHECK-P8-NEXT:    xvmuldp 0, 0, 3
1179; CHECK-P8-NEXT:    xvmuldp 0, 0, 4
1180; CHECK-P8-NEXT:    xvmuldp 2, 34, 0
1181; CHECK-P8-NEXT:    xvmaddadp 1, 2, 0
1182; CHECK-P8-NEXT:    xvmuldp 0, 2, 3
1183; CHECK-P8-NEXT:    xvmuldp 34, 0, 1
1184; CHECK-P8-NEXT:    blr
1185; CHECK-P8-NEXT:  .LBB27_2:
1186; CHECK-P8-NEXT:    xvsqrtdp 34, 34
1187; CHECK-P8-NEXT:    blr
1188;
1189; CHECK-P9-LABEL: hoo4_fmf:
1190; CHECK-P9:       # %bb.0:
1191; CHECK-P9-NEXT:    xvtsqrtdp 0, 34
1192; CHECK-P9-NEXT:    bc 12, 2, .LBB27_2
1193; CHECK-P9-NEXT:  # %bb.1:
1194; CHECK-P9-NEXT:    xvrsqrtedp 0, 34
1195; CHECK-P9-NEXT:    addis 3, 2, .LCPI27_0@toc@ha
1196; CHECK-P9-NEXT:    addi 3, 3, .LCPI27_0@toc@l
1197; CHECK-P9-NEXT:    lxv 2, 0(3)
1198; CHECK-P9-NEXT:    addis 3, 2, .LCPI27_1@toc@ha
1199; CHECK-P9-NEXT:    addi 3, 3, .LCPI27_1@toc@l
1200; CHECK-P9-NEXT:    xvmuldp 1, 34, 0
1201; CHECK-P9-NEXT:    xxlor 3, 2, 2
1202; CHECK-P9-NEXT:    xvmaddadp 3, 1, 0
1203; CHECK-P9-NEXT:    lxv 1, 0(3)
1204; CHECK-P9-NEXT:    xvmuldp 0, 0, 1
1205; CHECK-P9-NEXT:    xvmuldp 0, 0, 3
1206; CHECK-P9-NEXT:    xvmuldp 3, 34, 0
1207; CHECK-P9-NEXT:    xvmaddadp 2, 3, 0
1208; CHECK-P9-NEXT:    xvmuldp 0, 3, 1
1209; CHECK-P9-NEXT:    xvmuldp 34, 0, 2
1210; CHECK-P9-NEXT:    blr
1211; CHECK-P9-NEXT:  .LBB27_2:
1212; CHECK-P9-NEXT:    xvsqrtdp 34, 34
1213; CHECK-P9-NEXT:    blr
1214  %r = call contract reassoc ninf afn <2 x double> @llvm.sqrt.v2f64(<2 x double> %a)
1215  ret <2 x double> %r
1216}
1217
1218define <2 x double> @hoo4_safe(<2 x double> %a) #1 {
1219; CHECK-P7-LABEL: hoo4_safe:
1220; CHECK-P7:       # %bb.0:
1221; CHECK-P7-NEXT:    fsqrt 1, 1
1222; CHECK-P7-NEXT:    fsqrt 2, 2
1223; CHECK-P7-NEXT:    blr
1224;
1225; CHECK-P8-LABEL: hoo4_safe:
1226; CHECK-P8:       # %bb.0:
1227; CHECK-P8-NEXT:    xvsqrtdp 34, 34
1228; CHECK-P8-NEXT:    blr
1229;
1230; CHECK-P9-LABEL: hoo4_safe:
1231; CHECK-P9:       # %bb.0:
1232; CHECK-P9-NEXT:    xvsqrtdp 34, 34
1233; CHECK-P9-NEXT:    blr
1234  %r = call <2 x double> @llvm.sqrt.v2f64(<2 x double> %a)
1235  ret <2 x double> %r
1236}
1237
1238define fp128 @hoo5_fmf(fp128 %a) #1 {
1239; CHECK-P7-LABEL: hoo5_fmf:
1240; CHECK-P7:       # %bb.0:
1241; CHECK-P7-NEXT:    mflr 0
1242; CHECK-P7-NEXT:    std 0, 16(1)
1243; CHECK-P7-NEXT:    stdu 1, -112(1)
1244; CHECK-P7-NEXT:    bl sqrtf128
1245; CHECK-P7-NEXT:    nop
1246; CHECK-P7-NEXT:    addi 1, 1, 112
1247; CHECK-P7-NEXT:    ld 0, 16(1)
1248; CHECK-P7-NEXT:    mtlr 0
1249; CHECK-P7-NEXT:    blr
1250;
1251; CHECK-P8-LABEL: hoo5_fmf:
1252; CHECK-P8:       # %bb.0:
1253; CHECK-P8-NEXT:    mflr 0
1254; CHECK-P8-NEXT:    std 0, 16(1)
1255; CHECK-P8-NEXT:    stdu 1, -32(1)
1256; CHECK-P8-NEXT:    bl sqrtf128
1257; CHECK-P8-NEXT:    nop
1258; CHECK-P8-NEXT:    addi 1, 1, 32
1259; CHECK-P8-NEXT:    ld 0, 16(1)
1260; CHECK-P8-NEXT:    mtlr 0
1261; CHECK-P8-NEXT:    blr
1262;
1263; CHECK-P9-LABEL: hoo5_fmf:
1264; CHECK-P9:       # %bb.0:
1265; CHECK-P9-NEXT:    xssqrtqp 2, 2
1266; CHECK-P9-NEXT:    blr
1267  %r = call contract reassoc ninf afn fp128 @llvm.sqrt.f128(fp128 %a)
1268  ret fp128 %r
1269}
1270
1271define fp128 @hoo5_safe(fp128 %a) #1 {
1272; CHECK-P7-LABEL: hoo5_safe:
1273; CHECK-P7:       # %bb.0:
1274; CHECK-P7-NEXT:    mflr 0
1275; CHECK-P7-NEXT:    std 0, 16(1)
1276; CHECK-P7-NEXT:    stdu 1, -112(1)
1277; CHECK-P7-NEXT:    bl sqrtf128
1278; CHECK-P7-NEXT:    nop
1279; CHECK-P7-NEXT:    addi 1, 1, 112
1280; CHECK-P7-NEXT:    ld 0, 16(1)
1281; CHECK-P7-NEXT:    mtlr 0
1282; CHECK-P7-NEXT:    blr
1283;
1284; CHECK-P8-LABEL: hoo5_safe:
1285; CHECK-P8:       # %bb.0:
1286; CHECK-P8-NEXT:    mflr 0
1287; CHECK-P8-NEXT:    std 0, 16(1)
1288; CHECK-P8-NEXT:    stdu 1, -32(1)
1289; CHECK-P8-NEXT:    bl sqrtf128
1290; CHECK-P8-NEXT:    nop
1291; CHECK-P8-NEXT:    addi 1, 1, 32
1292; CHECK-P8-NEXT:    ld 0, 16(1)
1293; CHECK-P8-NEXT:    mtlr 0
1294; CHECK-P8-NEXT:    blr
1295;
1296; CHECK-P9-LABEL: hoo5_safe:
1297; CHECK-P9:       # %bb.0:
1298; CHECK-P9-NEXT:    xssqrtqp 2, 2
1299; CHECK-P9-NEXT:    blr
1300  %r = call fp128 @llvm.sqrt.f128(fp128 %a)
1301  ret fp128 %r
1302}
1303
1304attributes #0 = { nounwind "reciprocal-estimates"="sqrtf:0,sqrtd:0" }
1305attributes #1 = { nounwind "denormal-fp-math"="preserve-sign,preserve-sign" }
1306attributes #2 = { nounwind readnone "target-features"="-crbits" }
1307