1; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z14 | FileCheck %s
2
3declare double @llvm.experimental.constrained.fma.f64(double %f1, double %f2, double %f3, metadata, metadata)
4declare float @llvm.experimental.constrained.fma.f32(float %f1, float %f2, float %f3, metadata, metadata)
5
6define double @f1(double %f1, double %f2, double %acc) #0 {
7; CHECK-LABEL: f1:
8; CHECK: wfnmadb %f0, %f0, %f2, %f4
9; CHECK: br %r14
10  %res = call double @llvm.experimental.constrained.fma.f64 (
11                        double %f1, double %f2, double %acc,
12                        metadata !"round.dynamic",
13                        metadata !"fpexcept.strict") #0
14  %negres = fneg double %res
15  ret double %negres
16}
17
18define double @f2(double %f1, double %f2, double %acc) #0 {
19; CHECK-LABEL: f2:
20; CHECK: wfnmsdb %f0, %f0, %f2, %f4
21; CHECK: br %r14
22  %negacc = fneg double %acc
23  %res = call double @llvm.experimental.constrained.fma.f64 (
24                        double %f1, double %f2, double %negacc,
25                        metadata !"round.dynamic",
26                        metadata !"fpexcept.strict") #0
27  %negres = fneg double %res
28  ret double %negres
29}
30
31define float @f3(float %f1, float %f2, float %acc) #0 {
32; CHECK-LABEL: f3:
33; CHECK: wfnmasb %f0, %f0, %f2, %f4
34; CHECK: br %r14
35  %res = call float @llvm.experimental.constrained.fma.f32 (
36                        float %f1, float %f2, float %acc,
37                        metadata !"round.dynamic",
38                        metadata !"fpexcept.strict") #0
39  %negres = fneg float %res
40  ret float %negres
41}
42
43define float @f4(float %f1, float %f2, float %acc) #0 {
44; CHECK-LABEL: f4:
45; CHECK: wfnmssb %f0, %f0, %f2, %f4
46; CHECK: br %r14
47  %negacc = fneg float %acc
48  %res = call float @llvm.experimental.constrained.fma.f32 (
49                        float %f1, float %f2, float %negacc,
50                        metadata !"round.dynamic",
51                        metadata !"fpexcept.strict") #0
52  %negres = fneg float %res
53  ret float %negres
54}
55
56attributes #0 = { strictfp }
57