xref: /llvm-project/llvm/test/CodeGen/SPARC/fmuladd-soft-float.ll (revision 5785cbb40570c3847aa994b2d2b7e03321eee7eb)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2; RUN: llc -mtriple=sparc < %s | FileCheck %s -check-prefix=SOFT-FLOAT-32
3; RUN: llc -mtriple=sparc64 < %s | FileCheck %s -check-prefix=SOFT-FLOAT-64
4
5define float @fmuladd_intrinsic_f32(float %a, float %b, float %c) #0 {
6; SOFT-FLOAT-32-LABEL: fmuladd_intrinsic_f32:
7; SOFT-FLOAT-32:         .cfi_startproc
8; SOFT-FLOAT-32-NEXT:  ! %bb.0:
9; SOFT-FLOAT-32-NEXT:    save %sp, -96, %sp
10; SOFT-FLOAT-32-NEXT:    .cfi_def_cfa_register %fp
11; SOFT-FLOAT-32-NEXT:    .cfi_window_save
12; SOFT-FLOAT-32-NEXT:    .cfi_register %o7, %i7
13; SOFT-FLOAT-32-NEXT:    mov %i0, %o0
14; SOFT-FLOAT-32-NEXT:    call __mulsf3
15; SOFT-FLOAT-32-NEXT:    mov %i1, %o1
16; SOFT-FLOAT-32-NEXT:    call __addsf3
17; SOFT-FLOAT-32-NEXT:    mov %i2, %o1
18; SOFT-FLOAT-32-NEXT:    ret
19; SOFT-FLOAT-32-NEXT:    restore %g0, %o0, %o0
20;
21; SOFT-FLOAT-64-LABEL: fmuladd_intrinsic_f32:
22; SOFT-FLOAT-64:         .cfi_startproc
23; SOFT-FLOAT-64-NEXT:  ! %bb.0:
24; SOFT-FLOAT-64-NEXT:    save %sp, -176, %sp
25; SOFT-FLOAT-64-NEXT:    .cfi_def_cfa_register %fp
26; SOFT-FLOAT-64-NEXT:    .cfi_window_save
27; SOFT-FLOAT-64-NEXT:    .cfi_register %o7, %i7
28; SOFT-FLOAT-64-NEXT:    srl %i0, 0, %o0
29; SOFT-FLOAT-64-NEXT:    call __mulsf3
30; SOFT-FLOAT-64-NEXT:    srl %i1, 0, %o1
31; SOFT-FLOAT-64-NEXT:    call __addsf3
32; SOFT-FLOAT-64-NEXT:    srl %i2, 0, %o1
33; SOFT-FLOAT-64-NEXT:    ret
34; SOFT-FLOAT-64-NEXT:    restore %g0, %o0, %o0
35  %result = call float @llvm.fmuladd.f32(float %a, float %b, float %c)
36  ret float %result
37}
38
39define double @fmuladd_intrinsic_f64(double %a, double %b, double %c) #0 {
40; SOFT-FLOAT-32-LABEL: fmuladd_intrinsic_f64:
41; SOFT-FLOAT-32:         .cfi_startproc
42; SOFT-FLOAT-32-NEXT:  ! %bb.0:
43; SOFT-FLOAT-32-NEXT:    save %sp, -96, %sp
44; SOFT-FLOAT-32-NEXT:    .cfi_def_cfa_register %fp
45; SOFT-FLOAT-32-NEXT:    .cfi_window_save
46; SOFT-FLOAT-32-NEXT:    .cfi_register %o7, %i7
47; SOFT-FLOAT-32-NEXT:    mov %i0, %o0
48; SOFT-FLOAT-32-NEXT:    mov %i1, %o1
49; SOFT-FLOAT-32-NEXT:    mov %i2, %o2
50; SOFT-FLOAT-32-NEXT:    call __muldf3
51; SOFT-FLOAT-32-NEXT:    mov %i3, %o3
52; SOFT-FLOAT-32-NEXT:    mov %i4, %o2
53; SOFT-FLOAT-32-NEXT:    call __adddf3
54; SOFT-FLOAT-32-NEXT:    mov %i5, %o3
55; SOFT-FLOAT-32-NEXT:    mov %o0, %i0
56; SOFT-FLOAT-32-NEXT:    ret
57; SOFT-FLOAT-32-NEXT:    restore %g0, %o1, %o1
58;
59; SOFT-FLOAT-64-LABEL: fmuladd_intrinsic_f64:
60; SOFT-FLOAT-64:         .cfi_startproc
61; SOFT-FLOAT-64-NEXT:  ! %bb.0:
62; SOFT-FLOAT-64-NEXT:    save %sp, -176, %sp
63; SOFT-FLOAT-64-NEXT:    .cfi_def_cfa_register %fp
64; SOFT-FLOAT-64-NEXT:    .cfi_window_save
65; SOFT-FLOAT-64-NEXT:    .cfi_register %o7, %i7
66; SOFT-FLOAT-64-NEXT:    mov %i0, %o0
67; SOFT-FLOAT-64-NEXT:    call __muldf3
68; SOFT-FLOAT-64-NEXT:    mov %i1, %o1
69; SOFT-FLOAT-64-NEXT:    call __adddf3
70; SOFT-FLOAT-64-NEXT:    mov %i2, %o1
71; SOFT-FLOAT-64-NEXT:    ret
72; SOFT-FLOAT-64-NEXT:    restore %g0, %o0, %o0
73  %result = call double @llvm.fmuladd.f64(double %a, double %b, double %c)
74  ret double %result
75}
76
77define float @fmuladd_contract_f32(float %a, float %b, float %c) #0 {
78; SOFT-FLOAT-32-LABEL: fmuladd_contract_f32:
79; SOFT-FLOAT-32:         .cfi_startproc
80; SOFT-FLOAT-32-NEXT:  ! %bb.0:
81; SOFT-FLOAT-32-NEXT:    save %sp, -96, %sp
82; SOFT-FLOAT-32-NEXT:    .cfi_def_cfa_register %fp
83; SOFT-FLOAT-32-NEXT:    .cfi_window_save
84; SOFT-FLOAT-32-NEXT:    .cfi_register %o7, %i7
85; SOFT-FLOAT-32-NEXT:    mov %i0, %o0
86; SOFT-FLOAT-32-NEXT:    call __mulsf3
87; SOFT-FLOAT-32-NEXT:    mov %i1, %o1
88; SOFT-FLOAT-32-NEXT:    call __addsf3
89; SOFT-FLOAT-32-NEXT:    mov %i2, %o1
90; SOFT-FLOAT-32-NEXT:    ret
91; SOFT-FLOAT-32-NEXT:    restore %g0, %o0, %o0
92;
93; SOFT-FLOAT-64-LABEL: fmuladd_contract_f32:
94; SOFT-FLOAT-64:         .cfi_startproc
95; SOFT-FLOAT-64-NEXT:  ! %bb.0:
96; SOFT-FLOAT-64-NEXT:    save %sp, -176, %sp
97; SOFT-FLOAT-64-NEXT:    .cfi_def_cfa_register %fp
98; SOFT-FLOAT-64-NEXT:    .cfi_window_save
99; SOFT-FLOAT-64-NEXT:    .cfi_register %o7, %i7
100; SOFT-FLOAT-64-NEXT:    srl %i0, 0, %o0
101; SOFT-FLOAT-64-NEXT:    call __mulsf3
102; SOFT-FLOAT-64-NEXT:    srl %i1, 0, %o1
103; SOFT-FLOAT-64-NEXT:    call __addsf3
104; SOFT-FLOAT-64-NEXT:    srl %i2, 0, %o1
105; SOFT-FLOAT-64-NEXT:    ret
106; SOFT-FLOAT-64-NEXT:    restore %g0, %o0, %o0
107  %product = fmul contract float %a, %b
108  %result = fadd contract float %product, %c
109  ret float %result
110}
111
112define double @fmuladd_contract_f64(double %a, double %b, double %c) #0 {
113; SOFT-FLOAT-32-LABEL: fmuladd_contract_f64:
114; SOFT-FLOAT-32:         .cfi_startproc
115; SOFT-FLOAT-32-NEXT:  ! %bb.0:
116; SOFT-FLOAT-32-NEXT:    save %sp, -96, %sp
117; SOFT-FLOAT-32-NEXT:    .cfi_def_cfa_register %fp
118; SOFT-FLOAT-32-NEXT:    .cfi_window_save
119; SOFT-FLOAT-32-NEXT:    .cfi_register %o7, %i7
120; SOFT-FLOAT-32-NEXT:    mov %i0, %o0
121; SOFT-FLOAT-32-NEXT:    mov %i1, %o1
122; SOFT-FLOAT-32-NEXT:    mov %i2, %o2
123; SOFT-FLOAT-32-NEXT:    call __muldf3
124; SOFT-FLOAT-32-NEXT:    mov %i3, %o3
125; SOFT-FLOAT-32-NEXT:    mov %i4, %o2
126; SOFT-FLOAT-32-NEXT:    call __adddf3
127; SOFT-FLOAT-32-NEXT:    mov %i5, %o3
128; SOFT-FLOAT-32-NEXT:    mov %o0, %i0
129; SOFT-FLOAT-32-NEXT:    ret
130; SOFT-FLOAT-32-NEXT:    restore %g0, %o1, %o1
131;
132; SOFT-FLOAT-64-LABEL: fmuladd_contract_f64:
133; SOFT-FLOAT-64:         .cfi_startproc
134; SOFT-FLOAT-64-NEXT:  ! %bb.0:
135; SOFT-FLOAT-64-NEXT:    save %sp, -176, %sp
136; SOFT-FLOAT-64-NEXT:    .cfi_def_cfa_register %fp
137; SOFT-FLOAT-64-NEXT:    .cfi_window_save
138; SOFT-FLOAT-64-NEXT:    .cfi_register %o7, %i7
139; SOFT-FLOAT-64-NEXT:    mov %i0, %o0
140; SOFT-FLOAT-64-NEXT:    call __muldf3
141; SOFT-FLOAT-64-NEXT:    mov %i1, %o1
142; SOFT-FLOAT-64-NEXT:    call __adddf3
143; SOFT-FLOAT-64-NEXT:    mov %i2, %o1
144; SOFT-FLOAT-64-NEXT:    ret
145; SOFT-FLOAT-64-NEXT:    restore %g0, %o0, %o0
146  %product = fmul contract double %a, %b
147  %result = fadd contract double %product, %c
148  ret double %result
149}
150
151define <4 x float> @fmuladd_contract_v4f32(<4 x float> %a, <4 x float> %b, <4 x float> %c) #0 {
152; SOFT-FLOAT-32-LABEL: fmuladd_contract_v4f32:
153; SOFT-FLOAT-32:         .cfi_startproc
154; SOFT-FLOAT-32-NEXT:  ! %bb.0:
155; SOFT-FLOAT-32-NEXT:    save %sp, -96, %sp
156; SOFT-FLOAT-32-NEXT:    .cfi_def_cfa_register %fp
157; SOFT-FLOAT-32-NEXT:    .cfi_window_save
158; SOFT-FLOAT-32-NEXT:    .cfi_register %o7, %i7
159; SOFT-FLOAT-32-NEXT:    ld [%fp+100], %l0
160; SOFT-FLOAT-32-NEXT:    ld [%fp+104], %l1
161; SOFT-FLOAT-32-NEXT:    ld [%fp+108], %l2
162; SOFT-FLOAT-32-NEXT:    ld [%fp+112], %l3
163; SOFT-FLOAT-32-NEXT:    ld [%fp+96], %l4
164; SOFT-FLOAT-32-NEXT:    ld [%fp+92], %l5
165; SOFT-FLOAT-32-NEXT:    mov %i0, %o0
166; SOFT-FLOAT-32-NEXT:    call __mulsf3
167; SOFT-FLOAT-32-NEXT:    mov %i4, %o1
168; SOFT-FLOAT-32-NEXT:    mov %o0, %l6
169; SOFT-FLOAT-32-NEXT:    mov %i1, %o0
170; SOFT-FLOAT-32-NEXT:    call __mulsf3
171; SOFT-FLOAT-32-NEXT:    mov %i5, %o1
172; SOFT-FLOAT-32-NEXT:    mov %o0, %i1
173; SOFT-FLOAT-32-NEXT:    mov %i2, %o0
174; SOFT-FLOAT-32-NEXT:    call __mulsf3
175; SOFT-FLOAT-32-NEXT:    mov %l5, %o1
176; SOFT-FLOAT-32-NEXT:    mov %o0, %i4
177; SOFT-FLOAT-32-NEXT:    mov %i3, %o0
178; SOFT-FLOAT-32-NEXT:    call __mulsf3
179; SOFT-FLOAT-32-NEXT:    mov %l4, %o1
180; SOFT-FLOAT-32-NEXT:    call __addsf3
181; SOFT-FLOAT-32-NEXT:    mov %l3, %o1
182; SOFT-FLOAT-32-NEXT:    mov %o0, %i3
183; SOFT-FLOAT-32-NEXT:    mov %i4, %o0
184; SOFT-FLOAT-32-NEXT:    call __addsf3
185; SOFT-FLOAT-32-NEXT:    mov %l2, %o1
186; SOFT-FLOAT-32-NEXT:    mov %o0, %i2
187; SOFT-FLOAT-32-NEXT:    mov %i1, %o0
188; SOFT-FLOAT-32-NEXT:    call __addsf3
189; SOFT-FLOAT-32-NEXT:    mov %l1, %o1
190; SOFT-FLOAT-32-NEXT:    mov %o0, %i1
191; SOFT-FLOAT-32-NEXT:    mov %l6, %o0
192; SOFT-FLOAT-32-NEXT:    call __addsf3
193; SOFT-FLOAT-32-NEXT:    mov %l0, %o1
194; SOFT-FLOAT-32-NEXT:    ret
195; SOFT-FLOAT-32-NEXT:    restore %g0, %o0, %o0
196;
197; SOFT-FLOAT-64-LABEL: fmuladd_contract_v4f32:
198; SOFT-FLOAT-64:         .cfi_startproc
199; SOFT-FLOAT-64-NEXT:  ! %bb.0:
200; SOFT-FLOAT-64-NEXT:    save %sp, -176, %sp
201; SOFT-FLOAT-64-NEXT:    .cfi_def_cfa_register %fp
202; SOFT-FLOAT-64-NEXT:    .cfi_window_save
203; SOFT-FLOAT-64-NEXT:    .cfi_register %o7, %i7
204; SOFT-FLOAT-64-NEXT:    ld [%fp+2267], %l0
205; SOFT-FLOAT-64-NEXT:    ld [%fp+2259], %l1
206; SOFT-FLOAT-64-NEXT:    ld [%fp+2251], %l2
207; SOFT-FLOAT-64-NEXT:    ld [%fp+2243], %l3
208; SOFT-FLOAT-64-NEXT:    ld [%fp+2227], %l4
209; SOFT-FLOAT-64-NEXT:    ld [%fp+2235], %o1
210; SOFT-FLOAT-64-NEXT:    call __mulsf3
211; SOFT-FLOAT-64-NEXT:    srl %i3, 0, %o0
212; SOFT-FLOAT-64-NEXT:    mov %o0, %i3
213; SOFT-FLOAT-64-NEXT:    srl %i2, 0, %o0
214; SOFT-FLOAT-64-NEXT:    call __mulsf3
215; SOFT-FLOAT-64-NEXT:    mov %l4, %o1
216; SOFT-FLOAT-64-NEXT:    mov %o0, %i2
217; SOFT-FLOAT-64-NEXT:    srl %i1, 0, %o0
218; SOFT-FLOAT-64-NEXT:    call __mulsf3
219; SOFT-FLOAT-64-NEXT:    srl %i5, 0, %o1
220; SOFT-FLOAT-64-NEXT:    mov %o0, %i1
221; SOFT-FLOAT-64-NEXT:    srl %i0, 0, %o0
222; SOFT-FLOAT-64-NEXT:    call __mulsf3
223; SOFT-FLOAT-64-NEXT:    srl %i4, 0, %o1
224; SOFT-FLOAT-64-NEXT:    call __addsf3
225; SOFT-FLOAT-64-NEXT:    mov %l3, %o1
226; SOFT-FLOAT-64-NEXT:    mov %o0, %i0
227; SOFT-FLOAT-64-NEXT:    mov %i1, %o0
228; SOFT-FLOAT-64-NEXT:    call __addsf3
229; SOFT-FLOAT-64-NEXT:    mov %l2, %o1
230; SOFT-FLOAT-64-NEXT:    mov %o0, %i1
231; SOFT-FLOAT-64-NEXT:    mov %i2, %o0
232; SOFT-FLOAT-64-NEXT:    call __addsf3
233; SOFT-FLOAT-64-NEXT:    mov %l1, %o1
234; SOFT-FLOAT-64-NEXT:    mov %o0, %i2
235; SOFT-FLOAT-64-NEXT:    mov %i3, %o0
236; SOFT-FLOAT-64-NEXT:    call __addsf3
237; SOFT-FLOAT-64-NEXT:    mov %l0, %o1
238; SOFT-FLOAT-64-NEXT:    ret
239; SOFT-FLOAT-64-NEXT:    restore %g0, %o0, %o3
240  %product = fmul contract <4 x float> %a, %b
241  %result = fadd contract <4 x float> %product, %c
242  ret <4 x float> %result
243}
244
245define <4 x double> @fmuladd_contract_v4f64(<4 x double> %a, <4 x double> %b, <4 x double> %c) #0 {
246; SOFT-FLOAT-32-LABEL: fmuladd_contract_v4f64:
247; SOFT-FLOAT-32:         .cfi_startproc
248; SOFT-FLOAT-32-NEXT:  ! %bb.0:
249; SOFT-FLOAT-32-NEXT:    save %sp, -128, %sp
250; SOFT-FLOAT-32-NEXT:    .cfi_def_cfa_register %fp
251; SOFT-FLOAT-32-NEXT:    .cfi_window_save
252; SOFT-FLOAT-32-NEXT:    .cfi_register %o7, %i7
253; SOFT-FLOAT-32-NEXT:    ld [%fp+64], %l6
254; SOFT-FLOAT-32-NEXT:    ld [%fp+156], %g2
255; SOFT-FLOAT-32-NEXT:    st %g2, [%fp+-4] ! 4-byte Folded Spill
256; SOFT-FLOAT-32-NEXT:    ld [%fp+160], %g2
257; SOFT-FLOAT-32-NEXT:    st %g2, [%fp+-8] ! 4-byte Folded Spill
258; SOFT-FLOAT-32-NEXT:    ld [%fp+148], %g2
259; SOFT-FLOAT-32-NEXT:    st %g2, [%fp+-12] ! 4-byte Folded Spill
260; SOFT-FLOAT-32-NEXT:    ld [%fp+152], %g2
261; SOFT-FLOAT-32-NEXT:    st %g2, [%fp+-16] ! 4-byte Folded Spill
262; SOFT-FLOAT-32-NEXT:    ld [%fp+140], %g2
263; SOFT-FLOAT-32-NEXT:    st %g2, [%fp+-20] ! 4-byte Folded Spill
264; SOFT-FLOAT-32-NEXT:    ld [%fp+144], %g2
265; SOFT-FLOAT-32-NEXT:    st %g2, [%fp+-24] ! 4-byte Folded Spill
266; SOFT-FLOAT-32-NEXT:    ld [%fp+132], %g2
267; SOFT-FLOAT-32-NEXT:    st %g2, [%fp+-28] ! 4-byte Folded Spill
268; SOFT-FLOAT-32-NEXT:    ld [%fp+136], %l7
269; SOFT-FLOAT-32-NEXT:    ld [%fp+100], %l0
270; SOFT-FLOAT-32-NEXT:    ld [%fp+104], %l1
271; SOFT-FLOAT-32-NEXT:    ld [%fp+108], %l2
272; SOFT-FLOAT-32-NEXT:    ld [%fp+112], %l3
273; SOFT-FLOAT-32-NEXT:    ld [%fp+116], %l4
274; SOFT-FLOAT-32-NEXT:    ld [%fp+120], %l5
275; SOFT-FLOAT-32-NEXT:    ld [%fp+92], %o0
276; SOFT-FLOAT-32-NEXT:    ld [%fp+96], %o1
277; SOFT-FLOAT-32-NEXT:    ld [%fp+124], %o2
278; SOFT-FLOAT-32-NEXT:    call __muldf3
279; SOFT-FLOAT-32-NEXT:    ld [%fp+128], %o3
280; SOFT-FLOAT-32-NEXT:    st %o0, [%fp+-32] ! 4-byte Folded Spill
281; SOFT-FLOAT-32-NEXT:    st %o1, [%fp+-36] ! 4-byte Folded Spill
282; SOFT-FLOAT-32-NEXT:    mov %i4, %o0
283; SOFT-FLOAT-32-NEXT:    mov %i5, %o1
284; SOFT-FLOAT-32-NEXT:    mov %l4, %o2
285; SOFT-FLOAT-32-NEXT:    call __muldf3
286; SOFT-FLOAT-32-NEXT:    mov %l5, %o3
287; SOFT-FLOAT-32-NEXT:    mov %o0, %l4
288; SOFT-FLOAT-32-NEXT:    mov %o1, %l5
289; SOFT-FLOAT-32-NEXT:    mov %i2, %o0
290; SOFT-FLOAT-32-NEXT:    mov %i3, %o1
291; SOFT-FLOAT-32-NEXT:    mov %l2, %o2
292; SOFT-FLOAT-32-NEXT:    call __muldf3
293; SOFT-FLOAT-32-NEXT:    mov %l3, %o3
294; SOFT-FLOAT-32-NEXT:    mov %o0, %i4
295; SOFT-FLOAT-32-NEXT:    mov %o1, %i5
296; SOFT-FLOAT-32-NEXT:    mov %i0, %o0
297; SOFT-FLOAT-32-NEXT:    mov %i1, %o1
298; SOFT-FLOAT-32-NEXT:    mov %l0, %o2
299; SOFT-FLOAT-32-NEXT:    call __muldf3
300; SOFT-FLOAT-32-NEXT:    mov %l1, %o3
301; SOFT-FLOAT-32-NEXT:    ld [%fp+-28], %o2 ! 4-byte Folded Reload
302; SOFT-FLOAT-32-NEXT:    call __adddf3
303; SOFT-FLOAT-32-NEXT:    mov %l7, %o3
304; SOFT-FLOAT-32-NEXT:    mov %o0, %i2
305; SOFT-FLOAT-32-NEXT:    mov %o1, %i3
306; SOFT-FLOAT-32-NEXT:    mov %i4, %o0
307; SOFT-FLOAT-32-NEXT:    mov %i5, %o1
308; SOFT-FLOAT-32-NEXT:    ld [%fp+-20], %o2 ! 4-byte Folded Reload
309; SOFT-FLOAT-32-NEXT:    call __adddf3
310; SOFT-FLOAT-32-NEXT:    ld [%fp+-24], %o3
311; SOFT-FLOAT-32-NEXT:    mov %o0, %i4
312; SOFT-FLOAT-32-NEXT:    mov %o1, %i5
313; SOFT-FLOAT-32-NEXT:    mov %l4, %o0
314; SOFT-FLOAT-32-NEXT:    mov %l5, %o1
315; SOFT-FLOAT-32-NEXT:    ld [%fp+-12], %o2 ! 4-byte Folded Reload
316; SOFT-FLOAT-32-NEXT:    call __adddf3
317; SOFT-FLOAT-32-NEXT:    ld [%fp+-16], %o3
318; SOFT-FLOAT-32-NEXT:    mov %o0, %i0
319; SOFT-FLOAT-32-NEXT:    mov %o1, %i1
320; SOFT-FLOAT-32-NEXT:    ld [%fp+-32], %o0 ! 4-byte Folded Reload
321; SOFT-FLOAT-32-NEXT:    ld [%fp+-36], %o1 ! 4-byte Folded Reload
322; SOFT-FLOAT-32-NEXT:    ld [%fp+-4], %o2 ! 4-byte Folded Reload
323; SOFT-FLOAT-32-NEXT:    call __adddf3
324; SOFT-FLOAT-32-NEXT:    ld [%fp+-8], %o3
325; SOFT-FLOAT-32-NEXT:    ! kill: def $o0 killed $o0 killed $o0_o1 def $o0_o1
326; SOFT-FLOAT-32-NEXT:    ! kill: def $o1 killed $o1 killed $o0_o1 def $o0_o1
327; SOFT-FLOAT-32-NEXT:    std %o0, [%l6+24]
328; SOFT-FLOAT-32-NEXT:    std %i0, [%l6+16]
329; SOFT-FLOAT-32-NEXT:    std %i4, [%l6+8]
330; SOFT-FLOAT-32-NEXT:    std %i2, [%l6]
331; SOFT-FLOAT-32-NEXT:    ret
332; SOFT-FLOAT-32-NEXT:    restore
333;
334; SOFT-FLOAT-64-LABEL: fmuladd_contract_v4f64:
335; SOFT-FLOAT-64:         .cfi_startproc
336; SOFT-FLOAT-64-NEXT:  ! %bb.0:
337; SOFT-FLOAT-64-NEXT:    save %sp, -176, %sp
338; SOFT-FLOAT-64-NEXT:    .cfi_def_cfa_register %fp
339; SOFT-FLOAT-64-NEXT:    .cfi_window_save
340; SOFT-FLOAT-64-NEXT:    .cfi_register %o7, %i7
341; SOFT-FLOAT-64-NEXT:    ldx [%fp+2263], %l0
342; SOFT-FLOAT-64-NEXT:    ldx [%fp+2255], %l1
343; SOFT-FLOAT-64-NEXT:    ldx [%fp+2247], %l2
344; SOFT-FLOAT-64-NEXT:    ldx [%fp+2239], %l3
345; SOFT-FLOAT-64-NEXT:    ldx [%fp+2223], %l4
346; SOFT-FLOAT-64-NEXT:    ldx [%fp+2231], %o1
347; SOFT-FLOAT-64-NEXT:    call __muldf3
348; SOFT-FLOAT-64-NEXT:    mov %i3, %o0
349; SOFT-FLOAT-64-NEXT:    mov %o0, %i3
350; SOFT-FLOAT-64-NEXT:    mov %i2, %o0
351; SOFT-FLOAT-64-NEXT:    call __muldf3
352; SOFT-FLOAT-64-NEXT:    mov %l4, %o1
353; SOFT-FLOAT-64-NEXT:    mov %o0, %i2
354; SOFT-FLOAT-64-NEXT:    mov %i1, %o0
355; SOFT-FLOAT-64-NEXT:    call __muldf3
356; SOFT-FLOAT-64-NEXT:    mov %i5, %o1
357; SOFT-FLOAT-64-NEXT:    mov %o0, %i1
358; SOFT-FLOAT-64-NEXT:    mov %i0, %o0
359; SOFT-FLOAT-64-NEXT:    call __muldf3
360; SOFT-FLOAT-64-NEXT:    mov %i4, %o1
361; SOFT-FLOAT-64-NEXT:    call __adddf3
362; SOFT-FLOAT-64-NEXT:    mov %l3, %o1
363; SOFT-FLOAT-64-NEXT:    mov %o0, %i0
364; SOFT-FLOAT-64-NEXT:    mov %i1, %o0
365; SOFT-FLOAT-64-NEXT:    call __adddf3
366; SOFT-FLOAT-64-NEXT:    mov %l2, %o1
367; SOFT-FLOAT-64-NEXT:    mov %o0, %i1
368; SOFT-FLOAT-64-NEXT:    mov %i2, %o0
369; SOFT-FLOAT-64-NEXT:    call __adddf3
370; SOFT-FLOAT-64-NEXT:    mov %l1, %o1
371; SOFT-FLOAT-64-NEXT:    mov %o0, %i2
372; SOFT-FLOAT-64-NEXT:    mov %i3, %o0
373; SOFT-FLOAT-64-NEXT:    call __adddf3
374; SOFT-FLOAT-64-NEXT:    mov %l0, %o1
375; SOFT-FLOAT-64-NEXT:    ret
376; SOFT-FLOAT-64-NEXT:    restore %g0, %o0, %o3
377  %product = fmul contract <4 x double> %a, %b
378  %result = fadd contract <4 x double> %product, %c
379  ret <4 x double> %result
380}
381
382attributes #0 = { "use-soft-float"="true" }
383
384declare float @llvm.fmuladd.f32(float %a, float %b, float %c)
385declare double @llvm.fmuladd.f64(double %a, double %b, double %c)
386