1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -verify-machineinstrs -ppc-asm-full-reg-names -O3 < %s \
3; RUN:   -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr9 | FileCheck %s
4; RUN: llc -verify-machineinstrs -ppc-asm-full-reg-names -O3 < %s \
5; RUN:   -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr8 | FileCheck %s --check-prefix=CHECK-P8
6; RUN: llc -verify-machineinstrs -ppc-asm-full-reg-names -ppc-fma-rp-factor=0.0 -O3 < %s \
7; RUN:   -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr9 | FileCheck %s --check-prefix=CHECK-FMA
8
9@global_val = external global float, align 4
10
11define float @foo_float(float %0, float %1, float %2, float %3) {
12; CHECK-LABEL: foo_float:
13; CHECK:       # %bb.0:
14; CHECK-NEXT:    addis r3, r2, .LCPI0_0@toc@ha
15; CHECK-NEXT:    xsmulsp f1, f2, f1
16; CHECK-NEXT:    xssubsp f0, f3, f4
17; CHECK-NEXT:    lfs f2, .LCPI0_0@toc@l(r3)
18; CHECK-NEXT:    xsmaddasp f1, f0, f2
19; CHECK-NEXT:    blr
20;
21; CHECK-P8-LABEL: foo_float:
22; CHECK-P8:       # %bb.0:
23; CHECK-P8-NEXT:    xsmulsp f1, f2, f1
24; CHECK-P8-NEXT:    addis r3, r2, .LCPI0_0@toc@ha
25; CHECK-P8-NEXT:    xssubsp f0, f3, f4
26; CHECK-P8-NEXT:    lfs f2, .LCPI0_0@toc@l(r3)
27; CHECK-P8-NEXT:    xsmaddasp f1, f0, f2
28; CHECK-P8-NEXT:    blr
29;
30; CHECK-FMA-LABEL: foo_float:
31; CHECK-FMA:       # %bb.0:
32; CHECK-FMA-NEXT:    addis r3, r2, .LCPI0_0@toc@ha
33; CHECK-FMA-NEXT:    xsmulsp f1, f2, f1
34; CHECK-FMA-NEXT:    lfs f0, .LCPI0_0@toc@l(r3)
35; CHECK-FMA-NEXT:    addis r3, r2, .LCPI0_1@toc@ha
36; CHECK-FMA-NEXT:    lfs f2, .LCPI0_1@toc@l(r3)
37; CHECK-FMA-NEXT:    xsmaddasp f1, f4, f2
38; CHECK-FMA-NEXT:    xsmaddasp f1, f3, f0
39; CHECK-FMA-NEXT:    blr
40  %5 = fmul reassoc nsz float %1, %0
41  %6 = fsub reassoc nsz float %2, %3
42  %7 = fmul reassoc nsz float %6, 0x3DB2533FE0000000
43  %8 = fadd reassoc nsz float %7, %5
44  ret float %8
45}
46
47define double @foo_double(double %0, double %1, double %2, double %3) {
48; CHECK-LABEL: foo_double:
49; CHECK:       # %bb.0:
50; CHECK-NEXT:    xsmuldp f1, f2, f1
51; CHECK-NEXT:    xssubdp f0, f3, f4
52; CHECK-NEXT:    addis r3, r2, .LCPI1_0@toc@ha
53; CHECK-NEXT:    lfd f2, .LCPI1_0@toc@l(r3)
54; CHECK-NEXT:    xsmaddadp f1, f0, f2
55; CHECK-NEXT:    blr
56;
57; CHECK-P8-LABEL: foo_double:
58; CHECK-P8:       # %bb.0:
59; CHECK-P8-NEXT:    xsmuldp f1, f2, f1
60; CHECK-P8-NEXT:    addis r3, r2, .LCPI1_0@toc@ha
61; CHECK-P8-NEXT:    xssubdp f0, f3, f4
62; CHECK-P8-NEXT:    lfd f2, .LCPI1_0@toc@l(r3)
63; CHECK-P8-NEXT:    xsmaddadp f1, f0, f2
64; CHECK-P8-NEXT:    blr
65;
66; CHECK-FMA-LABEL: foo_double:
67; CHECK-FMA:       # %bb.0:
68; CHECK-FMA-NEXT:    addis r3, r2, .LCPI1_0@toc@ha
69; CHECK-FMA-NEXT:    xsmuldp f1, f2, f1
70; CHECK-FMA-NEXT:    lfd f0, .LCPI1_0@toc@l(r3)
71; CHECK-FMA-NEXT:    addis r3, r2, .LCPI1_1@toc@ha
72; CHECK-FMA-NEXT:    lfd f2, .LCPI1_1@toc@l(r3)
73; CHECK-FMA-NEXT:    xsmaddadp f1, f4, f2
74; CHECK-FMA-NEXT:    xsmaddadp f1, f3, f0
75; CHECK-FMA-NEXT:    blr
76  %5 = fmul reassoc nsz double %1, %0
77  %6 = fsub reassoc nsz double %2, %3
78  %7 = fmul reassoc nsz double %6, 0x3DB2533FE68CADDE
79  %8 = fadd reassoc nsz double %7, %5
80  ret double %8
81}
82
83define float @foo_float_reuse_const(float %0, float %1, float %2, float %3) {
84; CHECK-LABEL: foo_float_reuse_const:
85; CHECK:       # %bb.0:
86; CHECK-NEXT:    addis r3, r2, .LCPI2_0@toc@ha
87; CHECK-NEXT:    xsmulsp f1, f2, f1
88; CHECK-NEXT:    xssubsp f0, f3, f4
89; CHECK-NEXT:    lfs f3, .LCPI2_0@toc@l(r3)
90; CHECK-NEXT:    addis r3, r2, .LCPI2_1@toc@ha
91; CHECK-NEXT:    xsmaddasp f1, f0, f3
92; CHECK-NEXT:    lfs f0, .LCPI2_1@toc@l(r3)
93; CHECK-NEXT:    addis r3, r2, .LC0@toc@ha
94; CHECK-NEXT:    ld r3, .LC0@toc@l(r3)
95; CHECK-NEXT:    xsmulsp f0, f2, f0
96; CHECK-NEXT:    stfs f0, 0(r3)
97; CHECK-NEXT:    blr
98;
99; CHECK-P8-LABEL: foo_float_reuse_const:
100; CHECK-P8:       # %bb.0:
101; CHECK-P8-NEXT:    xsmulsp f1, f2, f1
102; CHECK-P8-NEXT:    addis r3, r2, .LCPI2_0@toc@ha
103; CHECK-P8-NEXT:    addis r4, r2, .LCPI2_1@toc@ha
104; CHECK-P8-NEXT:    xssubsp f0, f3, f4
105; CHECK-P8-NEXT:    lfs f3, .LCPI2_0@toc@l(r3)
106; CHECK-P8-NEXT:    lfs f4, .LCPI2_1@toc@l(r4)
107; CHECK-P8-NEXT:    addis r3, r2, .LC0@toc@ha
108; CHECK-P8-NEXT:    ld r3, .LC0@toc@l(r3)
109; CHECK-P8-NEXT:    xsmaddasp f1, f0, f3
110; CHECK-P8-NEXT:    xsmulsp f0, f2, f4
111; CHECK-P8-NEXT:    stfsx f0, 0, r3
112; CHECK-P8-NEXT:    blr
113;
114; CHECK-FMA-LABEL: foo_float_reuse_const:
115; CHECK-FMA:       # %bb.0:
116; CHECK-FMA-NEXT:    addis r3, r2, .LCPI2_0@toc@ha
117; CHECK-FMA-NEXT:    xsmulsp f1, f2, f1
118; CHECK-FMA-NEXT:    lfs f0, .LCPI2_0@toc@l(r3)
119; CHECK-FMA-NEXT:    addis r3, r2, .LCPI2_1@toc@ha
120; CHECK-FMA-NEXT:    lfs f5, .LCPI2_1@toc@l(r3)
121; CHECK-FMA-NEXT:    addis r3, r2, .LC0@toc@ha
122; CHECK-FMA-NEXT:    ld r3, .LC0@toc@l(r3)
123; CHECK-FMA-NEXT:    xsmaddasp f1, f4, f5
124; CHECK-FMA-NEXT:    xsmaddasp f1, f3, f0
125; CHECK-FMA-NEXT:    xsmulsp f0, f2, f5
126; CHECK-FMA-NEXT:    stfs f0, 0(r3)
127; CHECK-FMA-NEXT:    blr
128  %5 = fmul reassoc nsz float %1, %0
129  %6 = fsub reassoc nsz float %2, %3
130  %7 = fmul reassoc nsz float %6, 0x3DB2533FE0000000
131  %8 = fadd reassoc nsz float %7, %5
132  %9 = fmul reassoc nsz float %1, 0xBDB2533FE0000000
133  store float %9, float* @global_val, align 4
134  ret float %8
135}
136