xref: /llvm-project/llvm/test/CodeGen/SystemZ/fmuladd-soft-float.ll (revision 8b659736f7393314a797b6cf2fa346316a624ecb)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2; RUN: llc -mtriple=s390x-linux < %s | FileCheck %s -check-prefix=SOFT-FLOAT
3
4define float @fmuladd_intrinsic_f32(float %a, float %b, float %c) #0 {
5; SOFT-FLOAT-LABEL: fmuladd_intrinsic_f32:
6; SOFT-FLOAT:       # %bb.0:
7; SOFT-FLOAT-NEXT:    stmg %r13, %r15, 104(%r15)
8; SOFT-FLOAT-NEXT:    .cfi_offset %r13, -56
9; SOFT-FLOAT-NEXT:    .cfi_offset %r14, -48
10; SOFT-FLOAT-NEXT:    .cfi_offset %r15, -40
11; SOFT-FLOAT-NEXT:    aghi %r15, -160
12; SOFT-FLOAT-NEXT:    .cfi_def_cfa_offset 320
13; SOFT-FLOAT-NEXT:    llgfr %r2, %r2
14; SOFT-FLOAT-NEXT:    llgfr %r3, %r3
15; SOFT-FLOAT-NEXT:    lr %r13, %r4
16; SOFT-FLOAT-NEXT:    brasl %r14, __mulsf3@PLT
17; SOFT-FLOAT-NEXT:    llgfr %r3, %r13
18; SOFT-FLOAT-NEXT:    brasl %r14, __addsf3@PLT
19; SOFT-FLOAT-NEXT:    # kill: def $r2l killed $r2l killed $r2d
20; SOFT-FLOAT-NEXT:    lmg %r13, %r15, 264(%r15)
21; SOFT-FLOAT-NEXT:    br %r14
22  %result = call float @llvm.fmuladd.f32(float %a, float %b, float %c)
23  ret float %result
24}
25
26define double @fmuladd_intrinsic_f64(double %a, double %b, double %c) #0 {
27; SOFT-FLOAT-LABEL: fmuladd_intrinsic_f64:
28; SOFT-FLOAT:       # %bb.0:
29; SOFT-FLOAT-NEXT:    stmg %r13, %r15, 104(%r15)
30; SOFT-FLOAT-NEXT:    .cfi_offset %r13, -56
31; SOFT-FLOAT-NEXT:    .cfi_offset %r14, -48
32; SOFT-FLOAT-NEXT:    .cfi_offset %r15, -40
33; SOFT-FLOAT-NEXT:    aghi %r15, -160
34; SOFT-FLOAT-NEXT:    .cfi_def_cfa_offset 320
35; SOFT-FLOAT-NEXT:    lgr %r13, %r4
36; SOFT-FLOAT-NEXT:    brasl %r14, __muldf3@PLT
37; SOFT-FLOAT-NEXT:    lgr %r3, %r13
38; SOFT-FLOAT-NEXT:    brasl %r14, __adddf3@PLT
39; SOFT-FLOAT-NEXT:    lmg %r13, %r15, 264(%r15)
40; SOFT-FLOAT-NEXT:    br %r14
41  %result = call double @llvm.fmuladd.f64(double %a, double %b, double %c)
42  ret double %result
43}
44
45define float @fmuladd_contract_f32(float %a, float %b, float %c) #0 {
46; SOFT-FLOAT-LABEL: fmuladd_contract_f32:
47; SOFT-FLOAT:       # %bb.0:
48; SOFT-FLOAT-NEXT:    stmg %r13, %r15, 104(%r15)
49; SOFT-FLOAT-NEXT:    .cfi_offset %r13, -56
50; SOFT-FLOAT-NEXT:    .cfi_offset %r14, -48
51; SOFT-FLOAT-NEXT:    .cfi_offset %r15, -40
52; SOFT-FLOAT-NEXT:    aghi %r15, -160
53; SOFT-FLOAT-NEXT:    .cfi_def_cfa_offset 320
54; SOFT-FLOAT-NEXT:    llgfr %r2, %r2
55; SOFT-FLOAT-NEXT:    llgfr %r3, %r3
56; SOFT-FLOAT-NEXT:    lr %r13, %r4
57; SOFT-FLOAT-NEXT:    brasl %r14, __mulsf3@PLT
58; SOFT-FLOAT-NEXT:    llgfr %r3, %r13
59; SOFT-FLOAT-NEXT:    brasl %r14, __addsf3@PLT
60; SOFT-FLOAT-NEXT:    # kill: def $r2l killed $r2l killed $r2d
61; SOFT-FLOAT-NEXT:    lmg %r13, %r15, 264(%r15)
62; SOFT-FLOAT-NEXT:    br %r14
63  %product = fmul contract float %a, %b
64  %result = fadd contract float %product, %c
65  ret float %result
66}
67
68define double @fmuladd_contract_f64(double %a, double %b, double %c) #0 {
69; SOFT-FLOAT-LABEL: fmuladd_contract_f64:
70; SOFT-FLOAT:       # %bb.0:
71; SOFT-FLOAT-NEXT:    stmg %r13, %r15, 104(%r15)
72; SOFT-FLOAT-NEXT:    .cfi_offset %r13, -56
73; SOFT-FLOAT-NEXT:    .cfi_offset %r14, -48
74; SOFT-FLOAT-NEXT:    .cfi_offset %r15, -40
75; SOFT-FLOAT-NEXT:    aghi %r15, -160
76; SOFT-FLOAT-NEXT:    .cfi_def_cfa_offset 320
77; SOFT-FLOAT-NEXT:    lgr %r13, %r4
78; SOFT-FLOAT-NEXT:    brasl %r14, __muldf3@PLT
79; SOFT-FLOAT-NEXT:    lgr %r3, %r13
80; SOFT-FLOAT-NEXT:    brasl %r14, __adddf3@PLT
81; SOFT-FLOAT-NEXT:    lmg %r13, %r15, 264(%r15)
82; SOFT-FLOAT-NEXT:    br %r14
83  %product = fmul contract double %a, %b
84  %result = fadd contract double %product, %c
85  ret double %result
86}
87
88define <4 x float> @fmuladd_contract_v4f32(<4 x float> %a, <4 x float> %b, <4 x float> %c) #0 {
89; SOFT-FLOAT-LABEL: fmuladd_contract_v4f32:
90; SOFT-FLOAT:       # %bb.0:
91; SOFT-FLOAT-NEXT:    stmg %r7, %r15, 56(%r15)
92; SOFT-FLOAT-NEXT:    .cfi_offset %r7, -104
93; SOFT-FLOAT-NEXT:    .cfi_offset %r8, -96
94; SOFT-FLOAT-NEXT:    .cfi_offset %r9, -88
95; SOFT-FLOAT-NEXT:    .cfi_offset %r10, -80
96; SOFT-FLOAT-NEXT:    .cfi_offset %r11, -72
97; SOFT-FLOAT-NEXT:    .cfi_offset %r12, -64
98; SOFT-FLOAT-NEXT:    .cfi_offset %r13, -56
99; SOFT-FLOAT-NEXT:    .cfi_offset %r14, -48
100; SOFT-FLOAT-NEXT:    .cfi_offset %r15, -40
101; SOFT-FLOAT-NEXT:    aghi %r15, -176
102; SOFT-FLOAT-NEXT:    .cfi_def_cfa_offset 336
103; SOFT-FLOAT-NEXT:    llgf %r0, 388(%r15)
104; SOFT-FLOAT-NEXT:    stg %r0, 168(%r15) # 8-byte Folded Spill
105; SOFT-FLOAT-NEXT:    llgf %r0, 380(%r15)
106; SOFT-FLOAT-NEXT:    stg %r0, 160(%r15) # 8-byte Folded Spill
107; SOFT-FLOAT-NEXT:    llgf %r11, 372(%r15)
108; SOFT-FLOAT-NEXT:    llgf %r10, 364(%r15)
109; SOFT-FLOAT-NEXT:    llgf %r8, 340(%r15)
110; SOFT-FLOAT-NEXT:    llgf %r0, 356(%r15)
111; SOFT-FLOAT-NEXT:    llgf %r7, 348(%r15)
112; SOFT-FLOAT-NEXT:    llgfr %r1, %r5
113; SOFT-FLOAT-NEXT:    lr %r9, %r4
114; SOFT-FLOAT-NEXT:    lr %r13, %r3
115; SOFT-FLOAT-NEXT:    lr %r12, %r2
116; SOFT-FLOAT-NEXT:    lgr %r2, %r1
117; SOFT-FLOAT-NEXT:    lgr %r3, %r0
118; SOFT-FLOAT-NEXT:    brasl %r14, __mulsf3@PLT
119; SOFT-FLOAT-NEXT:    llgfr %r0, %r9
120; SOFT-FLOAT-NEXT:    lgr %r9, %r2
121; SOFT-FLOAT-NEXT:    lgr %r2, %r0
122; SOFT-FLOAT-NEXT:    lgr %r3, %r7
123; SOFT-FLOAT-NEXT:    brasl %r14, __mulsf3@PLT
124; SOFT-FLOAT-NEXT:    llgfr %r0, %r13
125; SOFT-FLOAT-NEXT:    lgr %r13, %r2
126; SOFT-FLOAT-NEXT:    lgr %r2, %r0
127; SOFT-FLOAT-NEXT:    lgr %r3, %r8
128; SOFT-FLOAT-NEXT:    brasl %r14, __mulsf3@PLT
129; SOFT-FLOAT-NEXT:    llgfr %r0, %r12
130; SOFT-FLOAT-NEXT:    llgfr %r3, %r6
131; SOFT-FLOAT-NEXT:    lgr %r12, %r2
132; SOFT-FLOAT-NEXT:    lgr %r2, %r0
133; SOFT-FLOAT-NEXT:    brasl %r14, __mulsf3@PLT
134; SOFT-FLOAT-NEXT:    lgr %r3, %r10
135; SOFT-FLOAT-NEXT:    brasl %r14, __addsf3@PLT
136; SOFT-FLOAT-NEXT:    lgr %r10, %r2
137; SOFT-FLOAT-NEXT:    lgr %r2, %r12
138; SOFT-FLOAT-NEXT:    lgr %r3, %r11
139; SOFT-FLOAT-NEXT:    brasl %r14, __addsf3@PLT
140; SOFT-FLOAT-NEXT:    lgr %r12, %r2
141; SOFT-FLOAT-NEXT:    lgr %r2, %r13
142; SOFT-FLOAT-NEXT:    lg %r3, 160(%r15) # 8-byte Folded Reload
143; SOFT-FLOAT-NEXT:    brasl %r14, __addsf3@PLT
144; SOFT-FLOAT-NEXT:    lgr %r13, %r2
145; SOFT-FLOAT-NEXT:    lgr %r2, %r9
146; SOFT-FLOAT-NEXT:    lg %r3, 168(%r15) # 8-byte Folded Reload
147; SOFT-FLOAT-NEXT:    brasl %r14, __addsf3@PLT
148; SOFT-FLOAT-NEXT:    lgr %r5, %r2
149; SOFT-FLOAT-NEXT:    lr %r2, %r10
150; SOFT-FLOAT-NEXT:    lr %r3, %r12
151; SOFT-FLOAT-NEXT:    lr %r4, %r13
152; SOFT-FLOAT-NEXT:    # kill: def $r5l killed $r5l killed $r5d
153; SOFT-FLOAT-NEXT:    lmg %r7, %r15, 232(%r15)
154; SOFT-FLOAT-NEXT:    br %r14
155  %product = fmul contract <4 x float> %a, %b
156  %result = fadd contract <4 x float> %product, %c
157  ret <4 x float> %result
158}
159
160define <4 x double> @fmuladd_contract_v4f64(<4 x double> %a, <4 x double> %b, <4 x double> %c) #0 {
161; SOFT-FLOAT-LABEL: fmuladd_contract_v4f64:
162; SOFT-FLOAT:       # %bb.0:
163; SOFT-FLOAT-NEXT:    stmg %r6, %r15, 48(%r15)
164; SOFT-FLOAT-NEXT:    .cfi_offset %r6, -112
165; SOFT-FLOAT-NEXT:    .cfi_offset %r7, -104
166; SOFT-FLOAT-NEXT:    .cfi_offset %r8, -96
167; SOFT-FLOAT-NEXT:    .cfi_offset %r9, -88
168; SOFT-FLOAT-NEXT:    .cfi_offset %r10, -80
169; SOFT-FLOAT-NEXT:    .cfi_offset %r11, -72
170; SOFT-FLOAT-NEXT:    .cfi_offset %r12, -64
171; SOFT-FLOAT-NEXT:    .cfi_offset %r13, -56
172; SOFT-FLOAT-NEXT:    .cfi_offset %r14, -48
173; SOFT-FLOAT-NEXT:    .cfi_offset %r15, -40
174; SOFT-FLOAT-NEXT:    aghi %r15, -184
175; SOFT-FLOAT-NEXT:    .cfi_def_cfa_offset 344
176; SOFT-FLOAT-NEXT:    mvc 176(8,%r15), 24(%r4) # 8-byte Folded Spill
177; SOFT-FLOAT-NEXT:    mvc 168(8,%r15), 16(%r4) # 8-byte Folded Spill
178; SOFT-FLOAT-NEXT:    mvc 160(8,%r15), 8(%r4) # 8-byte Folded Spill
179; SOFT-FLOAT-NEXT:    lg %r10, 0(%r4)
180; SOFT-FLOAT-NEXT:    lg %r9, 0(%r2)
181; SOFT-FLOAT-NEXT:    lg %r8, 0(%r3)
182; SOFT-FLOAT-NEXT:    lg %r7, 8(%r2)
183; SOFT-FLOAT-NEXT:    lg %r6, 8(%r3)
184; SOFT-FLOAT-NEXT:    lg %r13, 16(%r2)
185; SOFT-FLOAT-NEXT:    lg %r2, 24(%r2)
186; SOFT-FLOAT-NEXT:    lg %r0, 24(%r3)
187; SOFT-FLOAT-NEXT:    lg %r12, 16(%r3)
188; SOFT-FLOAT-NEXT:    lgr %r3, %r0
189; SOFT-FLOAT-NEXT:    brasl %r14, __muldf3@PLT
190; SOFT-FLOAT-NEXT:    lgr %r11, %r2
191; SOFT-FLOAT-NEXT:    lgr %r2, %r13
192; SOFT-FLOAT-NEXT:    lgr %r3, %r12
193; SOFT-FLOAT-NEXT:    brasl %r14, __muldf3@PLT
194; SOFT-FLOAT-NEXT:    lgr %r13, %r2
195; SOFT-FLOAT-NEXT:    lgr %r2, %r7
196; SOFT-FLOAT-NEXT:    lgr %r3, %r6
197; SOFT-FLOAT-NEXT:    brasl %r14, __muldf3@PLT
198; SOFT-FLOAT-NEXT:    lgr %r12, %r2
199; SOFT-FLOAT-NEXT:    lgr %r2, %r9
200; SOFT-FLOAT-NEXT:    lgr %r3, %r8
201; SOFT-FLOAT-NEXT:    brasl %r14, __muldf3@PLT
202; SOFT-FLOAT-NEXT:    lgr %r3, %r10
203; SOFT-FLOAT-NEXT:    brasl %r14, __adddf3@PLT
204; SOFT-FLOAT-NEXT:    lgr %r10, %r2
205; SOFT-FLOAT-NEXT:    lgr %r2, %r12
206; SOFT-FLOAT-NEXT:    lg %r3, 160(%r15) # 8-byte Folded Reload
207; SOFT-FLOAT-NEXT:    brasl %r14, __adddf3@PLT
208; SOFT-FLOAT-NEXT:    lgr %r12, %r2
209; SOFT-FLOAT-NEXT:    lgr %r2, %r13
210; SOFT-FLOAT-NEXT:    lg %r3, 168(%r15) # 8-byte Folded Reload
211; SOFT-FLOAT-NEXT:    brasl %r14, __adddf3@PLT
212; SOFT-FLOAT-NEXT:    lgr %r13, %r2
213; SOFT-FLOAT-NEXT:    lgr %r2, %r11
214; SOFT-FLOAT-NEXT:    lg %r3, 176(%r15) # 8-byte Folded Reload
215; SOFT-FLOAT-NEXT:    brasl %r14, __adddf3@PLT
216; SOFT-FLOAT-NEXT:    lgr %r5, %r2
217; SOFT-FLOAT-NEXT:    lgr %r2, %r10
218; SOFT-FLOAT-NEXT:    lgr %r3, %r12
219; SOFT-FLOAT-NEXT:    lgr %r4, %r13
220; SOFT-FLOAT-NEXT:    lmg %r6, %r15, 232(%r15)
221; SOFT-FLOAT-NEXT:    br %r14
222  %product = fmul contract <4 x double> %a, %b
223  %result = fadd contract <4 x double> %product, %c
224  ret <4 x double> %result
225}
226
227attributes #0 = { "use-soft-float"="true" }
228
229declare float @llvm.fmuladd.f32(float %a, float %b, float %c)
230declare double @llvm.fmuladd.f64(double %a, double %b, double %c)
231