xref: /llvm-project/llvm/test/CodeGen/LoongArch/float-fma.ll (revision 5e7e0d603204ede803323a825318e365a87f73e9)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc --mtriple=loongarch32 --mattr=+f,-d --fp-contract=fast < %s \
3; RUN:   | FileCheck %s --check-prefix=LA32-CONTRACT-FAST
4; RUN: llc --mtriple=loongarch32 --mattr=+f,-d --fp-contract=on < %s \
5; RUN:   | FileCheck %s --check-prefix=LA32-CONTRACT-ON
6; RUN: llc --mtriple=loongarch32 --mattr=+f,-d --fp-contract=off < %s \
7; RUN:   | FileCheck %s --check-prefix=LA32-CONTRACT-OFF
8; RUN: llc --mtriple=loongarch64 --mattr=+f,-d --fp-contract=fast < %s \
9; RUN:   | FileCheck %s --check-prefix=LA64-CONTRACT-FAST
10; RUN: llc --mtriple=loongarch64 --mattr=+f,-d --fp-contract=on < %s \
11; RUN:   | FileCheck %s --check-prefix=LA64-CONTRACT-ON
12; RUN: llc --mtriple=loongarch64 --mattr=+f,-d --fp-contract=off < %s \
13; RUN:   | FileCheck %s --check-prefix=LA64-CONTRACT-OFF
14
15define float @fmadd_s(float %a, float %b, float %c) nounwind {
16; LA32-CONTRACT-FAST-LABEL: fmadd_s:
17; LA32-CONTRACT-FAST:       # %bb.0:
18; LA32-CONTRACT-FAST-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
19; LA32-CONTRACT-FAST-NEXT:    ret
20;
21; LA32-CONTRACT-ON-LABEL: fmadd_s:
22; LA32-CONTRACT-ON:       # %bb.0:
23; LA32-CONTRACT-ON-NEXT:    fmul.s $fa0, $fa0, $fa1
24; LA32-CONTRACT-ON-NEXT:    fadd.s $fa0, $fa0, $fa2
25; LA32-CONTRACT-ON-NEXT:    ret
26;
27; LA32-CONTRACT-OFF-LABEL: fmadd_s:
28; LA32-CONTRACT-OFF:       # %bb.0:
29; LA32-CONTRACT-OFF-NEXT:    fmul.s $fa0, $fa0, $fa1
30; LA32-CONTRACT-OFF-NEXT:    fadd.s $fa0, $fa0, $fa2
31; LA32-CONTRACT-OFF-NEXT:    ret
32;
33; LA64-CONTRACT-FAST-LABEL: fmadd_s:
34; LA64-CONTRACT-FAST:       # %bb.0:
35; LA64-CONTRACT-FAST-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
36; LA64-CONTRACT-FAST-NEXT:    ret
37;
38; LA64-CONTRACT-ON-LABEL: fmadd_s:
39; LA64-CONTRACT-ON:       # %bb.0:
40; LA64-CONTRACT-ON-NEXT:    fmul.s $fa0, $fa0, $fa1
41; LA64-CONTRACT-ON-NEXT:    fadd.s $fa0, $fa0, $fa2
42; LA64-CONTRACT-ON-NEXT:    ret
43;
44; LA64-CONTRACT-OFF-LABEL: fmadd_s:
45; LA64-CONTRACT-OFF:       # %bb.0:
46; LA64-CONTRACT-OFF-NEXT:    fmul.s $fa0, $fa0, $fa1
47; LA64-CONTRACT-OFF-NEXT:    fadd.s $fa0, $fa0, $fa2
48; LA64-CONTRACT-OFF-NEXT:    ret
49  %mul = fmul float %a, %b
50  %add = fadd float %mul, %c
51  ret float %add
52}
53
54define float @fmsub_s(float %a, float %b, float %c) nounwind {
55; LA32-CONTRACT-FAST-LABEL: fmsub_s:
56; LA32-CONTRACT-FAST:       # %bb.0:
57; LA32-CONTRACT-FAST-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
58; LA32-CONTRACT-FAST-NEXT:    ret
59;
60; LA32-CONTRACT-ON-LABEL: fmsub_s:
61; LA32-CONTRACT-ON:       # %bb.0:
62; LA32-CONTRACT-ON-NEXT:    fmul.s $fa0, $fa0, $fa1
63; LA32-CONTRACT-ON-NEXT:    fsub.s $fa0, $fa0, $fa2
64; LA32-CONTRACT-ON-NEXT:    ret
65;
66; LA32-CONTRACT-OFF-LABEL: fmsub_s:
67; LA32-CONTRACT-OFF:       # %bb.0:
68; LA32-CONTRACT-OFF-NEXT:    fmul.s $fa0, $fa0, $fa1
69; LA32-CONTRACT-OFF-NEXT:    fsub.s $fa0, $fa0, $fa2
70; LA32-CONTRACT-OFF-NEXT:    ret
71;
72; LA64-CONTRACT-FAST-LABEL: fmsub_s:
73; LA64-CONTRACT-FAST:       # %bb.0:
74; LA64-CONTRACT-FAST-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
75; LA64-CONTRACT-FAST-NEXT:    ret
76;
77; LA64-CONTRACT-ON-LABEL: fmsub_s:
78; LA64-CONTRACT-ON:       # %bb.0:
79; LA64-CONTRACT-ON-NEXT:    fmul.s $fa0, $fa0, $fa1
80; LA64-CONTRACT-ON-NEXT:    fsub.s $fa0, $fa0, $fa2
81; LA64-CONTRACT-ON-NEXT:    ret
82;
83; LA64-CONTRACT-OFF-LABEL: fmsub_s:
84; LA64-CONTRACT-OFF:       # %bb.0:
85; LA64-CONTRACT-OFF-NEXT:    fmul.s $fa0, $fa0, $fa1
86; LA64-CONTRACT-OFF-NEXT:    fsub.s $fa0, $fa0, $fa2
87; LA64-CONTRACT-OFF-NEXT:    ret
88  %mul = fmul float %a, %b
89  %sub = fsub float %mul, %c
90  ret float %sub
91}
92
93define float @fnmadd_s(float %a, float %b, float %c) nounwind {
94; LA32-CONTRACT-FAST-LABEL: fnmadd_s:
95; LA32-CONTRACT-FAST:       # %bb.0:
96; LA32-CONTRACT-FAST-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
97; LA32-CONTRACT-FAST-NEXT:    ret
98;
99; LA32-CONTRACT-ON-LABEL: fnmadd_s:
100; LA32-CONTRACT-ON:       # %bb.0:
101; LA32-CONTRACT-ON-NEXT:    fmul.s $fa0, $fa0, $fa1
102; LA32-CONTRACT-ON-NEXT:    fadd.s $fa0, $fa0, $fa2
103; LA32-CONTRACT-ON-NEXT:    fneg.s $fa0, $fa0
104; LA32-CONTRACT-ON-NEXT:    ret
105;
106; LA32-CONTRACT-OFF-LABEL: fnmadd_s:
107; LA32-CONTRACT-OFF:       # %bb.0:
108; LA32-CONTRACT-OFF-NEXT:    fmul.s $fa0, $fa0, $fa1
109; LA32-CONTRACT-OFF-NEXT:    fadd.s $fa0, $fa0, $fa2
110; LA32-CONTRACT-OFF-NEXT:    fneg.s $fa0, $fa0
111; LA32-CONTRACT-OFF-NEXT:    ret
112;
113; LA64-CONTRACT-FAST-LABEL: fnmadd_s:
114; LA64-CONTRACT-FAST:       # %bb.0:
115; LA64-CONTRACT-FAST-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
116; LA64-CONTRACT-FAST-NEXT:    ret
117;
118; LA64-CONTRACT-ON-LABEL: fnmadd_s:
119; LA64-CONTRACT-ON:       # %bb.0:
120; LA64-CONTRACT-ON-NEXT:    fmul.s $fa0, $fa0, $fa1
121; LA64-CONTRACT-ON-NEXT:    fadd.s $fa0, $fa0, $fa2
122; LA64-CONTRACT-ON-NEXT:    fneg.s $fa0, $fa0
123; LA64-CONTRACT-ON-NEXT:    ret
124;
125; LA64-CONTRACT-OFF-LABEL: fnmadd_s:
126; LA64-CONTRACT-OFF:       # %bb.0:
127; LA64-CONTRACT-OFF-NEXT:    fmul.s $fa0, $fa0, $fa1
128; LA64-CONTRACT-OFF-NEXT:    fadd.s $fa0, $fa0, $fa2
129; LA64-CONTRACT-OFF-NEXT:    fneg.s $fa0, $fa0
130; LA64-CONTRACT-OFF-NEXT:    ret
131  %mul = fmul float %a, %b
132  %add = fadd float %mul, %c
133  %negadd = fneg float %add
134  ret float %negadd
135}
136
137define float @fnmadd_s_nsz(float %a, float %b, float %c) nounwind {
138; LA32-CONTRACT-FAST-LABEL: fnmadd_s_nsz:
139; LA32-CONTRACT-FAST:       # %bb.0:
140; LA32-CONTRACT-FAST-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
141; LA32-CONTRACT-FAST-NEXT:    ret
142;
143; LA32-CONTRACT-ON-LABEL: fnmadd_s_nsz:
144; LA32-CONTRACT-ON:       # %bb.0:
145; LA32-CONTRACT-ON-NEXT:    fneg.s $fa0, $fa0
146; LA32-CONTRACT-ON-NEXT:    fmul.s $fa0, $fa0, $fa1
147; LA32-CONTRACT-ON-NEXT:    fsub.s $fa0, $fa0, $fa2
148; LA32-CONTRACT-ON-NEXT:    ret
149;
150; LA32-CONTRACT-OFF-LABEL: fnmadd_s_nsz:
151; LA32-CONTRACT-OFF:       # %bb.0:
152; LA32-CONTRACT-OFF-NEXT:    fneg.s $fa0, $fa0
153; LA32-CONTRACT-OFF-NEXT:    fmul.s $fa0, $fa0, $fa1
154; LA32-CONTRACT-OFF-NEXT:    fsub.s $fa0, $fa0, $fa2
155; LA32-CONTRACT-OFF-NEXT:    ret
156;
157; LA64-CONTRACT-FAST-LABEL: fnmadd_s_nsz:
158; LA64-CONTRACT-FAST:       # %bb.0:
159; LA64-CONTRACT-FAST-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
160; LA64-CONTRACT-FAST-NEXT:    ret
161;
162; LA64-CONTRACT-ON-LABEL: fnmadd_s_nsz:
163; LA64-CONTRACT-ON:       # %bb.0:
164; LA64-CONTRACT-ON-NEXT:    fneg.s $fa0, $fa0
165; LA64-CONTRACT-ON-NEXT:    fmul.s $fa0, $fa0, $fa1
166; LA64-CONTRACT-ON-NEXT:    fsub.s $fa0, $fa0, $fa2
167; LA64-CONTRACT-ON-NEXT:    ret
168;
169; LA64-CONTRACT-OFF-LABEL: fnmadd_s_nsz:
170; LA64-CONTRACT-OFF:       # %bb.0:
171; LA64-CONTRACT-OFF-NEXT:    fneg.s $fa0, $fa0
172; LA64-CONTRACT-OFF-NEXT:    fmul.s $fa0, $fa0, $fa1
173; LA64-CONTRACT-OFF-NEXT:    fsub.s $fa0, $fa0, $fa2
174; LA64-CONTRACT-OFF-NEXT:    ret
175  %nega = fneg nsz float %a
176  %negc = fneg nsz float %c
177  %mul = fmul nsz float %nega, %b
178  %add = fadd nsz float %mul, %negc
179  ret float %add
180}
181
182;; Check that fnmadd.s is not emitted.
183define float @not_fnmadd_s(float %a, float %b, float %c) nounwind {
184; LA32-CONTRACT-FAST-LABEL: not_fnmadd_s:
185; LA32-CONTRACT-FAST:       # %bb.0:
186; LA32-CONTRACT-FAST-NEXT:    fneg.s $fa0, $fa0
187; LA32-CONTRACT-FAST-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
188; LA32-CONTRACT-FAST-NEXT:    ret
189;
190; LA32-CONTRACT-ON-LABEL: not_fnmadd_s:
191; LA32-CONTRACT-ON:       # %bb.0:
192; LA32-CONTRACT-ON-NEXT:    fneg.s $fa0, $fa0
193; LA32-CONTRACT-ON-NEXT:    fmul.s $fa0, $fa0, $fa1
194; LA32-CONTRACT-ON-NEXT:    fsub.s $fa0, $fa0, $fa2
195; LA32-CONTRACT-ON-NEXT:    ret
196;
197; LA32-CONTRACT-OFF-LABEL: not_fnmadd_s:
198; LA32-CONTRACT-OFF:       # %bb.0:
199; LA32-CONTRACT-OFF-NEXT:    fneg.s $fa0, $fa0
200; LA32-CONTRACT-OFF-NEXT:    fmul.s $fa0, $fa0, $fa1
201; LA32-CONTRACT-OFF-NEXT:    fsub.s $fa0, $fa0, $fa2
202; LA32-CONTRACT-OFF-NEXT:    ret
203;
204; LA64-CONTRACT-FAST-LABEL: not_fnmadd_s:
205; LA64-CONTRACT-FAST:       # %bb.0:
206; LA64-CONTRACT-FAST-NEXT:    fneg.s $fa0, $fa0
207; LA64-CONTRACT-FAST-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
208; LA64-CONTRACT-FAST-NEXT:    ret
209;
210; LA64-CONTRACT-ON-LABEL: not_fnmadd_s:
211; LA64-CONTRACT-ON:       # %bb.0:
212; LA64-CONTRACT-ON-NEXT:    fneg.s $fa0, $fa0
213; LA64-CONTRACT-ON-NEXT:    fmul.s $fa0, $fa0, $fa1
214; LA64-CONTRACT-ON-NEXT:    fsub.s $fa0, $fa0, $fa2
215; LA64-CONTRACT-ON-NEXT:    ret
216;
217; LA64-CONTRACT-OFF-LABEL: not_fnmadd_s:
218; LA64-CONTRACT-OFF:       # %bb.0:
219; LA64-CONTRACT-OFF-NEXT:    fneg.s $fa0, $fa0
220; LA64-CONTRACT-OFF-NEXT:    fmul.s $fa0, $fa0, $fa1
221; LA64-CONTRACT-OFF-NEXT:    fsub.s $fa0, $fa0, $fa2
222; LA64-CONTRACT-OFF-NEXT:    ret
223  %nega = fneg float %a
224  %negc = fneg float %c
225  %mul = fmul float %nega, %b
226  %add = fadd float %mul, %negc
227  ret float %add
228}
229
230define float @fnmsub_s(float %a, float %b, float %c) nounwind {
231; LA32-CONTRACT-FAST-LABEL: fnmsub_s:
232; LA32-CONTRACT-FAST:       # %bb.0:
233; LA32-CONTRACT-FAST-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
234; LA32-CONTRACT-FAST-NEXT:    ret
235;
236; LA32-CONTRACT-ON-LABEL: fnmsub_s:
237; LA32-CONTRACT-ON:       # %bb.0:
238; LA32-CONTRACT-ON-NEXT:    fmul.s $fa0, $fa0, $fa1
239; LA32-CONTRACT-ON-NEXT:    fsub.s $fa0, $fa0, $fa2
240; LA32-CONTRACT-ON-NEXT:    fneg.s $fa0, $fa0
241; LA32-CONTRACT-ON-NEXT:    ret
242;
243; LA32-CONTRACT-OFF-LABEL: fnmsub_s:
244; LA32-CONTRACT-OFF:       # %bb.0:
245; LA32-CONTRACT-OFF-NEXT:    fmul.s $fa0, $fa0, $fa1
246; LA32-CONTRACT-OFF-NEXT:    fsub.s $fa0, $fa0, $fa2
247; LA32-CONTRACT-OFF-NEXT:    fneg.s $fa0, $fa0
248; LA32-CONTRACT-OFF-NEXT:    ret
249;
250; LA64-CONTRACT-FAST-LABEL: fnmsub_s:
251; LA64-CONTRACT-FAST:       # %bb.0:
252; LA64-CONTRACT-FAST-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
253; LA64-CONTRACT-FAST-NEXT:    ret
254;
255; LA64-CONTRACT-ON-LABEL: fnmsub_s:
256; LA64-CONTRACT-ON:       # %bb.0:
257; LA64-CONTRACT-ON-NEXT:    fmul.s $fa0, $fa0, $fa1
258; LA64-CONTRACT-ON-NEXT:    fsub.s $fa0, $fa0, $fa2
259; LA64-CONTRACT-ON-NEXT:    fneg.s $fa0, $fa0
260; LA64-CONTRACT-ON-NEXT:    ret
261;
262; LA64-CONTRACT-OFF-LABEL: fnmsub_s:
263; LA64-CONTRACT-OFF:       # %bb.0:
264; LA64-CONTRACT-OFF-NEXT:    fmul.s $fa0, $fa0, $fa1
265; LA64-CONTRACT-OFF-NEXT:    fsub.s $fa0, $fa0, $fa2
266; LA64-CONTRACT-OFF-NEXT:    fneg.s $fa0, $fa0
267; LA64-CONTRACT-OFF-NEXT:    ret
268  %negc = fneg float %c
269  %mul = fmul float %a, %b
270  %add = fadd float %mul, %negc
271  %neg = fneg float %add
272  ret float %neg
273}
274
275define float @fnmsub_s_nsz(float %a, float %b, float %c) nounwind {
276; LA32-CONTRACT-FAST-LABEL: fnmsub_s_nsz:
277; LA32-CONTRACT-FAST:       # %bb.0:
278; LA32-CONTRACT-FAST-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
279; LA32-CONTRACT-FAST-NEXT:    ret
280;
281; LA32-CONTRACT-ON-LABEL: fnmsub_s_nsz:
282; LA32-CONTRACT-ON:       # %bb.0:
283; LA32-CONTRACT-ON-NEXT:    fmul.s $fa0, $fa0, $fa1
284; LA32-CONTRACT-ON-NEXT:    fsub.s $fa0, $fa2, $fa0
285; LA32-CONTRACT-ON-NEXT:    ret
286;
287; LA32-CONTRACT-OFF-LABEL: fnmsub_s_nsz:
288; LA32-CONTRACT-OFF:       # %bb.0:
289; LA32-CONTRACT-OFF-NEXT:    fmul.s $fa0, $fa0, $fa1
290; LA32-CONTRACT-OFF-NEXT:    fsub.s $fa0, $fa2, $fa0
291; LA32-CONTRACT-OFF-NEXT:    ret
292;
293; LA64-CONTRACT-FAST-LABEL: fnmsub_s_nsz:
294; LA64-CONTRACT-FAST:       # %bb.0:
295; LA64-CONTRACT-FAST-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
296; LA64-CONTRACT-FAST-NEXT:    ret
297;
298; LA64-CONTRACT-ON-LABEL: fnmsub_s_nsz:
299; LA64-CONTRACT-ON:       # %bb.0:
300; LA64-CONTRACT-ON-NEXT:    fmul.s $fa0, $fa0, $fa1
301; LA64-CONTRACT-ON-NEXT:    fsub.s $fa0, $fa2, $fa0
302; LA64-CONTRACT-ON-NEXT:    ret
303;
304; LA64-CONTRACT-OFF-LABEL: fnmsub_s_nsz:
305; LA64-CONTRACT-OFF:       # %bb.0:
306; LA64-CONTRACT-OFF-NEXT:    fmul.s $fa0, $fa0, $fa1
307; LA64-CONTRACT-OFF-NEXT:    fsub.s $fa0, $fa2, $fa0
308; LA64-CONTRACT-OFF-NEXT:    ret
309  %nega = fneg nsz float %a
310  %mul = fmul nsz float %nega, %b
311  %add = fadd nsz float %mul, %c
312  ret float %add
313}
314
315;; Check that fnmsub.s is not emitted.
316define float @not_fnmsub_s(float %a, float %b, float %c) nounwind {
317; LA32-CONTRACT-FAST-LABEL: not_fnmsub_s:
318; LA32-CONTRACT-FAST:       # %bb.0:
319; LA32-CONTRACT-FAST-NEXT:    fneg.s $fa0, $fa0
320; LA32-CONTRACT-FAST-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
321; LA32-CONTRACT-FAST-NEXT:    ret
322;
323; LA32-CONTRACT-ON-LABEL: not_fnmsub_s:
324; LA32-CONTRACT-ON:       # %bb.0:
325; LA32-CONTRACT-ON-NEXT:    fmul.s $fa0, $fa0, $fa1
326; LA32-CONTRACT-ON-NEXT:    fsub.s $fa0, $fa2, $fa0
327; LA32-CONTRACT-ON-NEXT:    ret
328;
329; LA32-CONTRACT-OFF-LABEL: not_fnmsub_s:
330; LA32-CONTRACT-OFF:       # %bb.0:
331; LA32-CONTRACT-OFF-NEXT:    fmul.s $fa0, $fa0, $fa1
332; LA32-CONTRACT-OFF-NEXT:    fsub.s $fa0, $fa2, $fa0
333; LA32-CONTRACT-OFF-NEXT:    ret
334;
335; LA64-CONTRACT-FAST-LABEL: not_fnmsub_s:
336; LA64-CONTRACT-FAST:       # %bb.0:
337; LA64-CONTRACT-FAST-NEXT:    fneg.s $fa0, $fa0
338; LA64-CONTRACT-FAST-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
339; LA64-CONTRACT-FAST-NEXT:    ret
340;
341; LA64-CONTRACT-ON-LABEL: not_fnmsub_s:
342; LA64-CONTRACT-ON:       # %bb.0:
343; LA64-CONTRACT-ON-NEXT:    fmul.s $fa0, $fa0, $fa1
344; LA64-CONTRACT-ON-NEXT:    fsub.s $fa0, $fa2, $fa0
345; LA64-CONTRACT-ON-NEXT:    ret
346;
347; LA64-CONTRACT-OFF-LABEL: not_fnmsub_s:
348; LA64-CONTRACT-OFF:       # %bb.0:
349; LA64-CONTRACT-OFF-NEXT:    fmul.s $fa0, $fa0, $fa1
350; LA64-CONTRACT-OFF-NEXT:    fsub.s $fa0, $fa2, $fa0
351; LA64-CONTRACT-OFF-NEXT:    ret
352  %nega = fneg float %a
353  %mul = fmul float %nega, %b
354  %add = fadd float %mul, %c
355  ret float %add
356}
357
358define float @contract_fmadd_s(float %a, float %b, float %c) nounwind {
359; LA32-CONTRACT-FAST-LABEL: contract_fmadd_s:
360; LA32-CONTRACT-FAST:       # %bb.0:
361; LA32-CONTRACT-FAST-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
362; LA32-CONTRACT-FAST-NEXT:    ret
363;
364; LA32-CONTRACT-ON-LABEL: contract_fmadd_s:
365; LA32-CONTRACT-ON:       # %bb.0:
366; LA32-CONTRACT-ON-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
367; LA32-CONTRACT-ON-NEXT:    ret
368;
369; LA32-CONTRACT-OFF-LABEL: contract_fmadd_s:
370; LA32-CONTRACT-OFF:       # %bb.0:
371; LA32-CONTRACT-OFF-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
372; LA32-CONTRACT-OFF-NEXT:    ret
373;
374; LA64-CONTRACT-FAST-LABEL: contract_fmadd_s:
375; LA64-CONTRACT-FAST:       # %bb.0:
376; LA64-CONTRACT-FAST-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
377; LA64-CONTRACT-FAST-NEXT:    ret
378;
379; LA64-CONTRACT-ON-LABEL: contract_fmadd_s:
380; LA64-CONTRACT-ON:       # %bb.0:
381; LA64-CONTRACT-ON-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
382; LA64-CONTRACT-ON-NEXT:    ret
383;
384; LA64-CONTRACT-OFF-LABEL: contract_fmadd_s:
385; LA64-CONTRACT-OFF:       # %bb.0:
386; LA64-CONTRACT-OFF-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
387; LA64-CONTRACT-OFF-NEXT:    ret
388  %mul = fmul contract float %a, %b
389  %add = fadd contract float %mul, %c
390  ret float %add
391}
392
393define float @contract_fmsub_s(float %a, float %b, float %c) nounwind {
394; LA32-CONTRACT-FAST-LABEL: contract_fmsub_s:
395; LA32-CONTRACT-FAST:       # %bb.0:
396; LA32-CONTRACT-FAST-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
397; LA32-CONTRACT-FAST-NEXT:    ret
398;
399; LA32-CONTRACT-ON-LABEL: contract_fmsub_s:
400; LA32-CONTRACT-ON:       # %bb.0:
401; LA32-CONTRACT-ON-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
402; LA32-CONTRACT-ON-NEXT:    ret
403;
404; LA32-CONTRACT-OFF-LABEL: contract_fmsub_s:
405; LA32-CONTRACT-OFF:       # %bb.0:
406; LA32-CONTRACT-OFF-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
407; LA32-CONTRACT-OFF-NEXT:    ret
408;
409; LA64-CONTRACT-FAST-LABEL: contract_fmsub_s:
410; LA64-CONTRACT-FAST:       # %bb.0:
411; LA64-CONTRACT-FAST-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
412; LA64-CONTRACT-FAST-NEXT:    ret
413;
414; LA64-CONTRACT-ON-LABEL: contract_fmsub_s:
415; LA64-CONTRACT-ON:       # %bb.0:
416; LA64-CONTRACT-ON-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
417; LA64-CONTRACT-ON-NEXT:    ret
418;
419; LA64-CONTRACT-OFF-LABEL: contract_fmsub_s:
420; LA64-CONTRACT-OFF:       # %bb.0:
421; LA64-CONTRACT-OFF-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
422; LA64-CONTRACT-OFF-NEXT:    ret
423  %mul = fmul contract float %a, %b
424  %sub = fsub contract float %mul, %c
425  ret float %sub
426}
427
428define float @contract_fnmadd_s(float %a, float %b, float %c) nounwind {
429; LA32-CONTRACT-FAST-LABEL: contract_fnmadd_s:
430; LA32-CONTRACT-FAST:       # %bb.0:
431; LA32-CONTRACT-FAST-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
432; LA32-CONTRACT-FAST-NEXT:    ret
433;
434; LA32-CONTRACT-ON-LABEL: contract_fnmadd_s:
435; LA32-CONTRACT-ON:       # %bb.0:
436; LA32-CONTRACT-ON-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
437; LA32-CONTRACT-ON-NEXT:    ret
438;
439; LA32-CONTRACT-OFF-LABEL: contract_fnmadd_s:
440; LA32-CONTRACT-OFF:       # %bb.0:
441; LA32-CONTRACT-OFF-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
442; LA32-CONTRACT-OFF-NEXT:    ret
443;
444; LA64-CONTRACT-FAST-LABEL: contract_fnmadd_s:
445; LA64-CONTRACT-FAST:       # %bb.0:
446; LA64-CONTRACT-FAST-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
447; LA64-CONTRACT-FAST-NEXT:    ret
448;
449; LA64-CONTRACT-ON-LABEL: contract_fnmadd_s:
450; LA64-CONTRACT-ON:       # %bb.0:
451; LA64-CONTRACT-ON-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
452; LA64-CONTRACT-ON-NEXT:    ret
453;
454; LA64-CONTRACT-OFF-LABEL: contract_fnmadd_s:
455; LA64-CONTRACT-OFF:       # %bb.0:
456; LA64-CONTRACT-OFF-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
457; LA64-CONTRACT-OFF-NEXT:    ret
458  %mul = fmul contract float %a, %b
459  %add = fadd contract float %mul, %c
460  %negadd = fneg contract float %add
461  ret float %negadd
462}
463
464define float @contract_fnmadd_s_nsz(float %a, float %b, float %c) nounwind {
465; LA32-CONTRACT-FAST-LABEL: contract_fnmadd_s_nsz:
466; LA32-CONTRACT-FAST:       # %bb.0:
467; LA32-CONTRACT-FAST-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
468; LA32-CONTRACT-FAST-NEXT:    ret
469;
470; LA32-CONTRACT-ON-LABEL: contract_fnmadd_s_nsz:
471; LA32-CONTRACT-ON:       # %bb.0:
472; LA32-CONTRACT-ON-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
473; LA32-CONTRACT-ON-NEXT:    ret
474;
475; LA32-CONTRACT-OFF-LABEL: contract_fnmadd_s_nsz:
476; LA32-CONTRACT-OFF:       # %bb.0:
477; LA32-CONTRACT-OFF-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
478; LA32-CONTRACT-OFF-NEXT:    ret
479;
480; LA64-CONTRACT-FAST-LABEL: contract_fnmadd_s_nsz:
481; LA64-CONTRACT-FAST:       # %bb.0:
482; LA64-CONTRACT-FAST-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
483; LA64-CONTRACT-FAST-NEXT:    ret
484;
485; LA64-CONTRACT-ON-LABEL: contract_fnmadd_s_nsz:
486; LA64-CONTRACT-ON:       # %bb.0:
487; LA64-CONTRACT-ON-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
488; LA64-CONTRACT-ON-NEXT:    ret
489;
490; LA64-CONTRACT-OFF-LABEL: contract_fnmadd_s_nsz:
491; LA64-CONTRACT-OFF:       # %bb.0:
492; LA64-CONTRACT-OFF-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
493; LA64-CONTRACT-OFF-NEXT:    ret
494  %nega = fneg contract nsz float %a
495  %negc = fneg contract nsz float %c
496  %mul = fmul contract nsz float %nega, %b
497  %add = fadd contract nsz float %mul, %negc
498  ret float %add
499}
500
501;; Check that fnmadd.s is not emitted.
502define float @not_contract_fnmadd_s(float %a, float %b, float %c) nounwind {
503; LA32-CONTRACT-FAST-LABEL: not_contract_fnmadd_s:
504; LA32-CONTRACT-FAST:       # %bb.0:
505; LA32-CONTRACT-FAST-NEXT:    fneg.s $fa0, $fa0
506; LA32-CONTRACT-FAST-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
507; LA32-CONTRACT-FAST-NEXT:    ret
508;
509; LA32-CONTRACT-ON-LABEL: not_contract_fnmadd_s:
510; LA32-CONTRACT-ON:       # %bb.0:
511; LA32-CONTRACT-ON-NEXT:    fneg.s $fa0, $fa0
512; LA32-CONTRACT-ON-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
513; LA32-CONTRACT-ON-NEXT:    ret
514;
515; LA32-CONTRACT-OFF-LABEL: not_contract_fnmadd_s:
516; LA32-CONTRACT-OFF:       # %bb.0:
517; LA32-CONTRACT-OFF-NEXT:    fneg.s $fa0, $fa0
518; LA32-CONTRACT-OFF-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
519; LA32-CONTRACT-OFF-NEXT:    ret
520;
521; LA64-CONTRACT-FAST-LABEL: not_contract_fnmadd_s:
522; LA64-CONTRACT-FAST:       # %bb.0:
523; LA64-CONTRACT-FAST-NEXT:    fneg.s $fa0, $fa0
524; LA64-CONTRACT-FAST-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
525; LA64-CONTRACT-FAST-NEXT:    ret
526;
527; LA64-CONTRACT-ON-LABEL: not_contract_fnmadd_s:
528; LA64-CONTRACT-ON:       # %bb.0:
529; LA64-CONTRACT-ON-NEXT:    fneg.s $fa0, $fa0
530; LA64-CONTRACT-ON-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
531; LA64-CONTRACT-ON-NEXT:    ret
532;
533; LA64-CONTRACT-OFF-LABEL: not_contract_fnmadd_s:
534; LA64-CONTRACT-OFF:       # %bb.0:
535; LA64-CONTRACT-OFF-NEXT:    fneg.s $fa0, $fa0
536; LA64-CONTRACT-OFF-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
537; LA64-CONTRACT-OFF-NEXT:    ret
538  %nega = fneg contract float %a
539  %negc = fneg contract float %c
540  %mul = fmul contract float %nega, %b
541  %add = fadd contract float %mul, %negc
542  ret float %add
543}
544
545define float @contract_fnmsub_s(float %a, float %b, float %c) nounwind {
546; LA32-CONTRACT-FAST-LABEL: contract_fnmsub_s:
547; LA32-CONTRACT-FAST:       # %bb.0:
548; LA32-CONTRACT-FAST-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
549; LA32-CONTRACT-FAST-NEXT:    ret
550;
551; LA32-CONTRACT-ON-LABEL: contract_fnmsub_s:
552; LA32-CONTRACT-ON:       # %bb.0:
553; LA32-CONTRACT-ON-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
554; LA32-CONTRACT-ON-NEXT:    ret
555;
556; LA32-CONTRACT-OFF-LABEL: contract_fnmsub_s:
557; LA32-CONTRACT-OFF:       # %bb.0:
558; LA32-CONTRACT-OFF-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
559; LA32-CONTRACT-OFF-NEXT:    ret
560;
561; LA64-CONTRACT-FAST-LABEL: contract_fnmsub_s:
562; LA64-CONTRACT-FAST:       # %bb.0:
563; LA64-CONTRACT-FAST-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
564; LA64-CONTRACT-FAST-NEXT:    ret
565;
566; LA64-CONTRACT-ON-LABEL: contract_fnmsub_s:
567; LA64-CONTRACT-ON:       # %bb.0:
568; LA64-CONTRACT-ON-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
569; LA64-CONTRACT-ON-NEXT:    ret
570;
571; LA64-CONTRACT-OFF-LABEL: contract_fnmsub_s:
572; LA64-CONTRACT-OFF:       # %bb.0:
573; LA64-CONTRACT-OFF-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
574; LA64-CONTRACT-OFF-NEXT:    ret
575  %negc = fneg contract float %c
576  %mul = fmul contract float %a, %b
577  %add = fadd contract float %mul, %negc
578  %neg = fneg contract float %add
579  ret float %neg
580}
581
582define float @contract_fnmsub_s_nsz(float %a, float %b, float %c) nounwind {
583; LA32-CONTRACT-FAST-LABEL: contract_fnmsub_s_nsz:
584; LA32-CONTRACT-FAST:       # %bb.0:
585; LA32-CONTRACT-FAST-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
586; LA32-CONTRACT-FAST-NEXT:    ret
587;
588; LA32-CONTRACT-ON-LABEL: contract_fnmsub_s_nsz:
589; LA32-CONTRACT-ON:       # %bb.0:
590; LA32-CONTRACT-ON-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
591; LA32-CONTRACT-ON-NEXT:    ret
592;
593; LA32-CONTRACT-OFF-LABEL: contract_fnmsub_s_nsz:
594; LA32-CONTRACT-OFF:       # %bb.0:
595; LA32-CONTRACT-OFF-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
596; LA32-CONTRACT-OFF-NEXT:    ret
597;
598; LA64-CONTRACT-FAST-LABEL: contract_fnmsub_s_nsz:
599; LA64-CONTRACT-FAST:       # %bb.0:
600; LA64-CONTRACT-FAST-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
601; LA64-CONTRACT-FAST-NEXT:    ret
602;
603; LA64-CONTRACT-ON-LABEL: contract_fnmsub_s_nsz:
604; LA64-CONTRACT-ON:       # %bb.0:
605; LA64-CONTRACT-ON-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
606; LA64-CONTRACT-ON-NEXT:    ret
607;
608; LA64-CONTRACT-OFF-LABEL: contract_fnmsub_s_nsz:
609; LA64-CONTRACT-OFF:       # %bb.0:
610; LA64-CONTRACT-OFF-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
611; LA64-CONTRACT-OFF-NEXT:    ret
612  %nega = fneg contract nsz float %a
613  %mul = fmul contract nsz float %nega, %b
614  %add = fadd contract nsz float %mul, %c
615  ret float %add
616}
617
618;; Check that fnmsub.s is not emitted.
619define float @not_contract_fnmsub_s(float %a, float %b, float %c) nounwind {
620; LA32-CONTRACT-FAST-LABEL: not_contract_fnmsub_s:
621; LA32-CONTRACT-FAST:       # %bb.0:
622; LA32-CONTRACT-FAST-NEXT:    fneg.s $fa0, $fa0
623; LA32-CONTRACT-FAST-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
624; LA32-CONTRACT-FAST-NEXT:    ret
625;
626; LA32-CONTRACT-ON-LABEL: not_contract_fnmsub_s:
627; LA32-CONTRACT-ON:       # %bb.0:
628; LA32-CONTRACT-ON-NEXT:    fneg.s $fa0, $fa0
629; LA32-CONTRACT-ON-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
630; LA32-CONTRACT-ON-NEXT:    ret
631;
632; LA32-CONTRACT-OFF-LABEL: not_contract_fnmsub_s:
633; LA32-CONTRACT-OFF:       # %bb.0:
634; LA32-CONTRACT-OFF-NEXT:    fneg.s $fa0, $fa0
635; LA32-CONTRACT-OFF-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
636; LA32-CONTRACT-OFF-NEXT:    ret
637;
638; LA64-CONTRACT-FAST-LABEL: not_contract_fnmsub_s:
639; LA64-CONTRACT-FAST:       # %bb.0:
640; LA64-CONTRACT-FAST-NEXT:    fneg.s $fa0, $fa0
641; LA64-CONTRACT-FAST-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
642; LA64-CONTRACT-FAST-NEXT:    ret
643;
644; LA64-CONTRACT-ON-LABEL: not_contract_fnmsub_s:
645; LA64-CONTRACT-ON:       # %bb.0:
646; LA64-CONTRACT-ON-NEXT:    fneg.s $fa0, $fa0
647; LA64-CONTRACT-ON-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
648; LA64-CONTRACT-ON-NEXT:    ret
649;
650; LA64-CONTRACT-OFF-LABEL: not_contract_fnmsub_s:
651; LA64-CONTRACT-OFF:       # %bb.0:
652; LA64-CONTRACT-OFF-NEXT:    fneg.s $fa0, $fa0
653; LA64-CONTRACT-OFF-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
654; LA64-CONTRACT-OFF-NEXT:    ret
655  %nega = fneg contract float %a
656  %mul = fmul contract float %nega, %b
657  %add = fadd contract float %mul, %c
658  ret float %add
659}
660
661declare float @llvm.fma.f64(float, float, float)
662
663define float @fmadd_s_intrinsics(float %a, float %b, float %c) nounwind {
664; LA32-CONTRACT-FAST-LABEL: fmadd_s_intrinsics:
665; LA32-CONTRACT-FAST:       # %bb.0:
666; LA32-CONTRACT-FAST-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
667; LA32-CONTRACT-FAST-NEXT:    ret
668;
669; LA32-CONTRACT-ON-LABEL: fmadd_s_intrinsics:
670; LA32-CONTRACT-ON:       # %bb.0:
671; LA32-CONTRACT-ON-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
672; LA32-CONTRACT-ON-NEXT:    ret
673;
674; LA32-CONTRACT-OFF-LABEL: fmadd_s_intrinsics:
675; LA32-CONTRACT-OFF:       # %bb.0:
676; LA32-CONTRACT-OFF-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
677; LA32-CONTRACT-OFF-NEXT:    ret
678;
679; LA64-CONTRACT-FAST-LABEL: fmadd_s_intrinsics:
680; LA64-CONTRACT-FAST:       # %bb.0:
681; LA64-CONTRACT-FAST-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
682; LA64-CONTRACT-FAST-NEXT:    ret
683;
684; LA64-CONTRACT-ON-LABEL: fmadd_s_intrinsics:
685; LA64-CONTRACT-ON:       # %bb.0:
686; LA64-CONTRACT-ON-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
687; LA64-CONTRACT-ON-NEXT:    ret
688;
689; LA64-CONTRACT-OFF-LABEL: fmadd_s_intrinsics:
690; LA64-CONTRACT-OFF:       # %bb.0:
691; LA64-CONTRACT-OFF-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
692; LA64-CONTRACT-OFF-NEXT:    ret
693  %fma = call float @llvm.fma.f64(float %a, float %b, float %c)
694  ret float %fma
695}
696
697define float @fmsub_s_intrinsics(float %a, float %b, float %c) nounwind {
698; LA32-CONTRACT-FAST-LABEL: fmsub_s_intrinsics:
699; LA32-CONTRACT-FAST:       # %bb.0:
700; LA32-CONTRACT-FAST-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
701; LA32-CONTRACT-FAST-NEXT:    ret
702;
703; LA32-CONTRACT-ON-LABEL: fmsub_s_intrinsics:
704; LA32-CONTRACT-ON:       # %bb.0:
705; LA32-CONTRACT-ON-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
706; LA32-CONTRACT-ON-NEXT:    ret
707;
708; LA32-CONTRACT-OFF-LABEL: fmsub_s_intrinsics:
709; LA32-CONTRACT-OFF:       # %bb.0:
710; LA32-CONTRACT-OFF-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
711; LA32-CONTRACT-OFF-NEXT:    ret
712;
713; LA64-CONTRACT-FAST-LABEL: fmsub_s_intrinsics:
714; LA64-CONTRACT-FAST:       # %bb.0:
715; LA64-CONTRACT-FAST-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
716; LA64-CONTRACT-FAST-NEXT:    ret
717;
718; LA64-CONTRACT-ON-LABEL: fmsub_s_intrinsics:
719; LA64-CONTRACT-ON:       # %bb.0:
720; LA64-CONTRACT-ON-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
721; LA64-CONTRACT-ON-NEXT:    ret
722;
723; LA64-CONTRACT-OFF-LABEL: fmsub_s_intrinsics:
724; LA64-CONTRACT-OFF:       # %bb.0:
725; LA64-CONTRACT-OFF-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
726; LA64-CONTRACT-OFF-NEXT:    ret
727  %negc = fneg float %c
728  %fma = call float @llvm.fma.f64(float %a, float %b, float %negc)
729  ret float %fma
730}
731
732define float @fnmadd_s_intrinsics(float %a, float %b, float %c) nounwind {
733; LA32-CONTRACT-FAST-LABEL: fnmadd_s_intrinsics:
734; LA32-CONTRACT-FAST:       # %bb.0:
735; LA32-CONTRACT-FAST-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
736; LA32-CONTRACT-FAST-NEXT:    ret
737;
738; LA32-CONTRACT-ON-LABEL: fnmadd_s_intrinsics:
739; LA32-CONTRACT-ON:       # %bb.0:
740; LA32-CONTRACT-ON-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
741; LA32-CONTRACT-ON-NEXT:    ret
742;
743; LA32-CONTRACT-OFF-LABEL: fnmadd_s_intrinsics:
744; LA32-CONTRACT-OFF:       # %bb.0:
745; LA32-CONTRACT-OFF-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
746; LA32-CONTRACT-OFF-NEXT:    ret
747;
748; LA64-CONTRACT-FAST-LABEL: fnmadd_s_intrinsics:
749; LA64-CONTRACT-FAST:       # %bb.0:
750; LA64-CONTRACT-FAST-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
751; LA64-CONTRACT-FAST-NEXT:    ret
752;
753; LA64-CONTRACT-ON-LABEL: fnmadd_s_intrinsics:
754; LA64-CONTRACT-ON:       # %bb.0:
755; LA64-CONTRACT-ON-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
756; LA64-CONTRACT-ON-NEXT:    ret
757;
758; LA64-CONTRACT-OFF-LABEL: fnmadd_s_intrinsics:
759; LA64-CONTRACT-OFF:       # %bb.0:
760; LA64-CONTRACT-OFF-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
761; LA64-CONTRACT-OFF-NEXT:    ret
762  %fma = call float @llvm.fma.f64(float %a, float %b, float %c)
763  %negfma = fneg float %fma
764  ret float %negfma
765}
766
767define float @fnmadd_s_nsz_intrinsics(float %a, float %b, float %c) nounwind {
768; LA32-CONTRACT-FAST-LABEL: fnmadd_s_nsz_intrinsics:
769; LA32-CONTRACT-FAST:       # %bb.0:
770; LA32-CONTRACT-FAST-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
771; LA32-CONTRACT-FAST-NEXT:    ret
772;
773; LA32-CONTRACT-ON-LABEL: fnmadd_s_nsz_intrinsics:
774; LA32-CONTRACT-ON:       # %bb.0:
775; LA32-CONTRACT-ON-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
776; LA32-CONTRACT-ON-NEXT:    ret
777;
778; LA32-CONTRACT-OFF-LABEL: fnmadd_s_nsz_intrinsics:
779; LA32-CONTRACT-OFF:       # %bb.0:
780; LA32-CONTRACT-OFF-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
781; LA32-CONTRACT-OFF-NEXT:    ret
782;
783; LA64-CONTRACT-FAST-LABEL: fnmadd_s_nsz_intrinsics:
784; LA64-CONTRACT-FAST:       # %bb.0:
785; LA64-CONTRACT-FAST-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
786; LA64-CONTRACT-FAST-NEXT:    ret
787;
788; LA64-CONTRACT-ON-LABEL: fnmadd_s_nsz_intrinsics:
789; LA64-CONTRACT-ON:       # %bb.0:
790; LA64-CONTRACT-ON-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
791; LA64-CONTRACT-ON-NEXT:    ret
792;
793; LA64-CONTRACT-OFF-LABEL: fnmadd_s_nsz_intrinsics:
794; LA64-CONTRACT-OFF:       # %bb.0:
795; LA64-CONTRACT-OFF-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
796; LA64-CONTRACT-OFF-NEXT:    ret
797  %nega = fneg float %a
798  %negc = fneg float %c
799  %fma = call nsz float @llvm.fma.f64(float %nega, float %b, float %negc)
800  ret float %fma
801}
802
803;; Check that fnmadd.s is not emitted.
804define float @not_fnmadd_s_intrinsics(float %a, float %b, float %c) nounwind {
805; LA32-CONTRACT-FAST-LABEL: not_fnmadd_s_intrinsics:
806; LA32-CONTRACT-FAST:       # %bb.0:
807; LA32-CONTRACT-FAST-NEXT:    fneg.s $fa0, $fa0
808; LA32-CONTRACT-FAST-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
809; LA32-CONTRACT-FAST-NEXT:    ret
810;
811; LA32-CONTRACT-ON-LABEL: not_fnmadd_s_intrinsics:
812; LA32-CONTRACT-ON:       # %bb.0:
813; LA32-CONTRACT-ON-NEXT:    fneg.s $fa0, $fa0
814; LA32-CONTRACT-ON-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
815; LA32-CONTRACT-ON-NEXT:    ret
816;
817; LA32-CONTRACT-OFF-LABEL: not_fnmadd_s_intrinsics:
818; LA32-CONTRACT-OFF:       # %bb.0:
819; LA32-CONTRACT-OFF-NEXT:    fneg.s $fa0, $fa0
820; LA32-CONTRACT-OFF-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
821; LA32-CONTRACT-OFF-NEXT:    ret
822;
823; LA64-CONTRACT-FAST-LABEL: not_fnmadd_s_intrinsics:
824; LA64-CONTRACT-FAST:       # %bb.0:
825; LA64-CONTRACT-FAST-NEXT:    fneg.s $fa0, $fa0
826; LA64-CONTRACT-FAST-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
827; LA64-CONTRACT-FAST-NEXT:    ret
828;
829; LA64-CONTRACT-ON-LABEL: not_fnmadd_s_intrinsics:
830; LA64-CONTRACT-ON:       # %bb.0:
831; LA64-CONTRACT-ON-NEXT:    fneg.s $fa0, $fa0
832; LA64-CONTRACT-ON-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
833; LA64-CONTRACT-ON-NEXT:    ret
834;
835; LA64-CONTRACT-OFF-LABEL: not_fnmadd_s_intrinsics:
836; LA64-CONTRACT-OFF:       # %bb.0:
837; LA64-CONTRACT-OFF-NEXT:    fneg.s $fa0, $fa0
838; LA64-CONTRACT-OFF-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
839; LA64-CONTRACT-OFF-NEXT:    ret
840  %nega = fneg float %a
841  %negc = fneg float %c
842  %fma = call float @llvm.fma.f64(float %nega, float %b, float %negc)
843  ret float %fma
844}
845
846define float @fnmsub_s_intrinsics(float %a, float %b, float %c) nounwind {
847; LA32-CONTRACT-FAST-LABEL: fnmsub_s_intrinsics:
848; LA32-CONTRACT-FAST:       # %bb.0:
849; LA32-CONTRACT-FAST-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
850; LA32-CONTRACT-FAST-NEXT:    ret
851;
852; LA32-CONTRACT-ON-LABEL: fnmsub_s_intrinsics:
853; LA32-CONTRACT-ON:       # %bb.0:
854; LA32-CONTRACT-ON-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
855; LA32-CONTRACT-ON-NEXT:    ret
856;
857; LA32-CONTRACT-OFF-LABEL: fnmsub_s_intrinsics:
858; LA32-CONTRACT-OFF:       # %bb.0:
859; LA32-CONTRACT-OFF-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
860; LA32-CONTRACT-OFF-NEXT:    ret
861;
862; LA64-CONTRACT-FAST-LABEL: fnmsub_s_intrinsics:
863; LA64-CONTRACT-FAST:       # %bb.0:
864; LA64-CONTRACT-FAST-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
865; LA64-CONTRACT-FAST-NEXT:    ret
866;
867; LA64-CONTRACT-ON-LABEL: fnmsub_s_intrinsics:
868; LA64-CONTRACT-ON:       # %bb.0:
869; LA64-CONTRACT-ON-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
870; LA64-CONTRACT-ON-NEXT:    ret
871;
872; LA64-CONTRACT-OFF-LABEL: fnmsub_s_intrinsics:
873; LA64-CONTRACT-OFF:       # %bb.0:
874; LA64-CONTRACT-OFF-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
875; LA64-CONTRACT-OFF-NEXT:    ret
876  %negc = fneg float %c
877  %fma = call float @llvm.fma.f64(float %a, float %b, float %negc)
878  %negfma = fneg float %fma
879  ret float %negfma
880}
881
882define float @fnmsub_s_nsz_intrinsics(float %a, float %b, float %c) nounwind {
883; LA32-CONTRACT-FAST-LABEL: fnmsub_s_nsz_intrinsics:
884; LA32-CONTRACT-FAST:       # %bb.0:
885; LA32-CONTRACT-FAST-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
886; LA32-CONTRACT-FAST-NEXT:    ret
887;
888; LA32-CONTRACT-ON-LABEL: fnmsub_s_nsz_intrinsics:
889; LA32-CONTRACT-ON:       # %bb.0:
890; LA32-CONTRACT-ON-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
891; LA32-CONTRACT-ON-NEXT:    ret
892;
893; LA32-CONTRACT-OFF-LABEL: fnmsub_s_nsz_intrinsics:
894; LA32-CONTRACT-OFF:       # %bb.0:
895; LA32-CONTRACT-OFF-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
896; LA32-CONTRACT-OFF-NEXT:    ret
897;
898; LA64-CONTRACT-FAST-LABEL: fnmsub_s_nsz_intrinsics:
899; LA64-CONTRACT-FAST:       # %bb.0:
900; LA64-CONTRACT-FAST-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
901; LA64-CONTRACT-FAST-NEXT:    ret
902;
903; LA64-CONTRACT-ON-LABEL: fnmsub_s_nsz_intrinsics:
904; LA64-CONTRACT-ON:       # %bb.0:
905; LA64-CONTRACT-ON-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
906; LA64-CONTRACT-ON-NEXT:    ret
907;
908; LA64-CONTRACT-OFF-LABEL: fnmsub_s_nsz_intrinsics:
909; LA64-CONTRACT-OFF:       # %bb.0:
910; LA64-CONTRACT-OFF-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
911; LA64-CONTRACT-OFF-NEXT:    ret
912  %nega = fneg float %a
913  %fma = call nsz float @llvm.fma.f64(float %nega, float %b, float %c)
914  ret float %fma
915}
916
917;; Check that fnmsub.s is not emitted.
918define float @not_fnmsub_s_intrinsics(float %a, float %b, float %c) nounwind {
919; LA32-CONTRACT-FAST-LABEL: not_fnmsub_s_intrinsics:
920; LA32-CONTRACT-FAST:       # %bb.0:
921; LA32-CONTRACT-FAST-NEXT:    fneg.s $fa0, $fa0
922; LA32-CONTRACT-FAST-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
923; LA32-CONTRACT-FAST-NEXT:    ret
924;
925; LA32-CONTRACT-ON-LABEL: not_fnmsub_s_intrinsics:
926; LA32-CONTRACT-ON:       # %bb.0:
927; LA32-CONTRACT-ON-NEXT:    fneg.s $fa0, $fa0
928; LA32-CONTRACT-ON-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
929; LA32-CONTRACT-ON-NEXT:    ret
930;
931; LA32-CONTRACT-OFF-LABEL: not_fnmsub_s_intrinsics:
932; LA32-CONTRACT-OFF:       # %bb.0:
933; LA32-CONTRACT-OFF-NEXT:    fneg.s $fa0, $fa0
934; LA32-CONTRACT-OFF-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
935; LA32-CONTRACT-OFF-NEXT:    ret
936;
937; LA64-CONTRACT-FAST-LABEL: not_fnmsub_s_intrinsics:
938; LA64-CONTRACT-FAST:       # %bb.0:
939; LA64-CONTRACT-FAST-NEXT:    fneg.s $fa0, $fa0
940; LA64-CONTRACT-FAST-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
941; LA64-CONTRACT-FAST-NEXT:    ret
942;
943; LA64-CONTRACT-ON-LABEL: not_fnmsub_s_intrinsics:
944; LA64-CONTRACT-ON:       # %bb.0:
945; LA64-CONTRACT-ON-NEXT:    fneg.s $fa0, $fa0
946; LA64-CONTRACT-ON-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
947; LA64-CONTRACT-ON-NEXT:    ret
948;
949; LA64-CONTRACT-OFF-LABEL: not_fnmsub_s_intrinsics:
950; LA64-CONTRACT-OFF:       # %bb.0:
951; LA64-CONTRACT-OFF-NEXT:    fneg.s $fa0, $fa0
952; LA64-CONTRACT-OFF-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
953; LA64-CONTRACT-OFF-NEXT:    ret
954  %nega = fneg float %a
955  %fma = call float @llvm.fma.f64(float %nega, float %b, float %c)
956  ret float %fma
957}
958
959define float @fmadd_s_contract(float %a, float %b, float %c) nounwind {
960; LA32-CONTRACT-FAST-LABEL: fmadd_s_contract:
961; LA32-CONTRACT-FAST:       # %bb.0:
962; LA32-CONTRACT-FAST-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
963; LA32-CONTRACT-FAST-NEXT:    ret
964;
965; LA32-CONTRACT-ON-LABEL: fmadd_s_contract:
966; LA32-CONTRACT-ON:       # %bb.0:
967; LA32-CONTRACT-ON-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
968; LA32-CONTRACT-ON-NEXT:    ret
969;
970; LA32-CONTRACT-OFF-LABEL: fmadd_s_contract:
971; LA32-CONTRACT-OFF:       # %bb.0:
972; LA32-CONTRACT-OFF-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
973; LA32-CONTRACT-OFF-NEXT:    ret
974;
975; LA64-CONTRACT-FAST-LABEL: fmadd_s_contract:
976; LA64-CONTRACT-FAST:       # %bb.0:
977; LA64-CONTRACT-FAST-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
978; LA64-CONTRACT-FAST-NEXT:    ret
979;
980; LA64-CONTRACT-ON-LABEL: fmadd_s_contract:
981; LA64-CONTRACT-ON:       # %bb.0:
982; LA64-CONTRACT-ON-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
983; LA64-CONTRACT-ON-NEXT:    ret
984;
985; LA64-CONTRACT-OFF-LABEL: fmadd_s_contract:
986; LA64-CONTRACT-OFF:       # %bb.0:
987; LA64-CONTRACT-OFF-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
988; LA64-CONTRACT-OFF-NEXT:    ret
989  %mul = fmul contract float %a, %b
990  %add = fadd contract float %mul, %c
991  ret float %add
992}
993
994define float @fmsub_s_contract(float %a, float %b, float %c) nounwind {
995; LA32-CONTRACT-FAST-LABEL: fmsub_s_contract:
996; LA32-CONTRACT-FAST:       # %bb.0:
997; LA32-CONTRACT-FAST-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
998; LA32-CONTRACT-FAST-NEXT:    ret
999;
1000; LA32-CONTRACT-ON-LABEL: fmsub_s_contract:
1001; LA32-CONTRACT-ON:       # %bb.0:
1002; LA32-CONTRACT-ON-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
1003; LA32-CONTRACT-ON-NEXT:    ret
1004;
1005; LA32-CONTRACT-OFF-LABEL: fmsub_s_contract:
1006; LA32-CONTRACT-OFF:       # %bb.0:
1007; LA32-CONTRACT-OFF-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
1008; LA32-CONTRACT-OFF-NEXT:    ret
1009;
1010; LA64-CONTRACT-FAST-LABEL: fmsub_s_contract:
1011; LA64-CONTRACT-FAST:       # %bb.0:
1012; LA64-CONTRACT-FAST-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
1013; LA64-CONTRACT-FAST-NEXT:    ret
1014;
1015; LA64-CONTRACT-ON-LABEL: fmsub_s_contract:
1016; LA64-CONTRACT-ON:       # %bb.0:
1017; LA64-CONTRACT-ON-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
1018; LA64-CONTRACT-ON-NEXT:    ret
1019;
1020; LA64-CONTRACT-OFF-LABEL: fmsub_s_contract:
1021; LA64-CONTRACT-OFF:       # %bb.0:
1022; LA64-CONTRACT-OFF-NEXT:    fmsub.s $fa0, $fa0, $fa1, $fa2
1023; LA64-CONTRACT-OFF-NEXT:    ret
1024  %mul = fmul contract float %a, %b
1025  %sub = fsub contract float %mul, %c
1026  ret float %sub
1027}
1028
1029define float @fnmadd_s_contract(float %a, float %b, float %c) nounwind {
1030; LA32-CONTRACT-FAST-LABEL: fnmadd_s_contract:
1031; LA32-CONTRACT-FAST:       # %bb.0:
1032; LA32-CONTRACT-FAST-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
1033; LA32-CONTRACT-FAST-NEXT:    ret
1034;
1035; LA32-CONTRACT-ON-LABEL: fnmadd_s_contract:
1036; LA32-CONTRACT-ON:       # %bb.0:
1037; LA32-CONTRACT-ON-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
1038; LA32-CONTRACT-ON-NEXT:    ret
1039;
1040; LA32-CONTRACT-OFF-LABEL: fnmadd_s_contract:
1041; LA32-CONTRACT-OFF:       # %bb.0:
1042; LA32-CONTRACT-OFF-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
1043; LA32-CONTRACT-OFF-NEXT:    ret
1044;
1045; LA64-CONTRACT-FAST-LABEL: fnmadd_s_contract:
1046; LA64-CONTRACT-FAST:       # %bb.0:
1047; LA64-CONTRACT-FAST-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
1048; LA64-CONTRACT-FAST-NEXT:    ret
1049;
1050; LA64-CONTRACT-ON-LABEL: fnmadd_s_contract:
1051; LA64-CONTRACT-ON:       # %bb.0:
1052; LA64-CONTRACT-ON-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
1053; LA64-CONTRACT-ON-NEXT:    ret
1054;
1055; LA64-CONTRACT-OFF-LABEL: fnmadd_s_contract:
1056; LA64-CONTRACT-OFF:       # %bb.0:
1057; LA64-CONTRACT-OFF-NEXT:    fnmadd.s $fa0, $fa0, $fa1, $fa2
1058; LA64-CONTRACT-OFF-NEXT:    ret
1059  %mul = fmul contract float %a, %b
1060  %add = fadd contract float %mul, %c
1061  %negadd = fneg contract float %add
1062  ret float %negadd
1063}
1064
1065define float @fnmsub_s_contract(float %a, float %b, float %c) nounwind {
1066; LA32-CONTRACT-FAST-LABEL: fnmsub_s_contract:
1067; LA32-CONTRACT-FAST:       # %bb.0:
1068; LA32-CONTRACT-FAST-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
1069; LA32-CONTRACT-FAST-NEXT:    ret
1070;
1071; LA32-CONTRACT-ON-LABEL: fnmsub_s_contract:
1072; LA32-CONTRACT-ON:       # %bb.0:
1073; LA32-CONTRACT-ON-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
1074; LA32-CONTRACT-ON-NEXT:    ret
1075;
1076; LA32-CONTRACT-OFF-LABEL: fnmsub_s_contract:
1077; LA32-CONTRACT-OFF:       # %bb.0:
1078; LA32-CONTRACT-OFF-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
1079; LA32-CONTRACT-OFF-NEXT:    ret
1080;
1081; LA64-CONTRACT-FAST-LABEL: fnmsub_s_contract:
1082; LA64-CONTRACT-FAST:       # %bb.0:
1083; LA64-CONTRACT-FAST-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
1084; LA64-CONTRACT-FAST-NEXT:    ret
1085;
1086; LA64-CONTRACT-ON-LABEL: fnmsub_s_contract:
1087; LA64-CONTRACT-ON:       # %bb.0:
1088; LA64-CONTRACT-ON-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
1089; LA64-CONTRACT-ON-NEXT:    ret
1090;
1091; LA64-CONTRACT-OFF-LABEL: fnmsub_s_contract:
1092; LA64-CONTRACT-OFF:       # %bb.0:
1093; LA64-CONTRACT-OFF-NEXT:    fnmsub.s $fa0, $fa0, $fa1, $fa2
1094; LA64-CONTRACT-OFF-NEXT:    ret
1095  %mul = fmul contract float %a, %b
1096  %negc = fneg contract float %c
1097  %add = fadd contract float %negc, %mul
1098  %negadd = fneg contract float %add
1099  ret float %negadd
1100}
1101