ret double %a2
}
+define float @fadd_fma_fmul_fmf(float %a, float %b, float %c, float %d, float %n0) nounwind {
+; CHECK-LABEL: fadd_fma_fmul_fmf:
+; CHECK: // %bb.0:
+; CHECK-NEXT: fmadd s2, s2, s3, s4
+; CHECK-NEXT: fmadd s0, s0, s1, s2
+; CHECK-NEXT: ret
+ %m1 = fmul float %a, %b
+ %m2 = fmul float %c, %d
+ %a1 = fadd contract float %m1, %m2
+ %a2 = fadd reassoc float %n0, %a1
+ ret float %a2
+}
+
; Minimum FMF, commute final add operands, change type.
define float @fadd_fma_fmul_2(float %a, float %b, float %c, float %d, float %n0) nounwind {
ret double %a2
}
+define float @fadd_fma_fmul_fmf(float %a, float %b, float %c, float %d, float %n0) nounwind {
+; FMA-LABEL: fadd_fma_fmul_fmf:
+; FMA: # %bb.0:
+; FMA-NEXT: vfmadd213ss {{.*#+}} xmm2 = (xmm3 * xmm2) + xmm4
+; FMA-NEXT: vfmadd213ss {{.*#+}} xmm0 = (xmm1 * xmm0) + xmm2
+; FMA-NEXT: retq
+;
+; FMA4-LABEL: fadd_fma_fmul_fmf:
+; FMA4: # %bb.0:
+; FMA4-NEXT: vfmaddss {{.*#+}} xmm2 = (xmm2 * xmm3) + xmm4
+; FMA4-NEXT: vfmaddss {{.*#+}} xmm0 = (xmm0 * xmm1) + xmm2
+; FMA4-NEXT: retq
+;
+; AVX512-LABEL: fadd_fma_fmul_fmf:
+; AVX512: # %bb.0:
+; AVX512-NEXT: vfmadd213ss {{.*#+}} xmm2 = (xmm3 * xmm2) + xmm4
+; AVX512-NEXT: vfmadd213ss {{.*#+}} xmm0 = (xmm1 * xmm0) + xmm2
+; AVX512-NEXT: retq
+ %m1 = fmul float %a, %b
+ %m2 = fmul float %c, %d
+ %a1 = fadd contract float %m1, %m2
+ %a2 = fadd reassoc float %n0, %a1
+ ret float %a2
+}
+
; Minimum FMF, commute final add operands, change type.
define float @fadd_fma_fmul_2(float %a, float %b, float %c, float %d, float %n0) nounwind {