Add narrowing fma functions

H.J. Lu hjl.tools@gmail.com
Thu Sep 23 00:35:16 GMT 2021


On Wed, Sep 22, 2021 at 2:27 PM Joseph Myers <joseph@codesourcery.com> wrote:
>
> This patch adds the narrowing fused multiply-add functions from TS
> 18661-1 / TS 18661-3 / C2X to glibc's libm: ffma, ffmal, dfmal,
> f32fmaf64, f32fmaf32x, f32xfmaf64 for all configurations; f32fmaf64x,
> f32fmaf128, f64fmaf64x, f64fmaf128, f32xfmaf64x, f32xfmaf128,
> f64xfmaf128 for configurations with _Float64x and _Float128;
> __f32fmaieee128 and __f64fmaieee128 aliases in the powerpc64le case
> (for calls to ffmal and dfmal when long double is IEEE binary128).
> Corresponding tgmath.h macro support is also added.
>
> The changes are mostly similar to those for the other narrowing
> functions previously added, especially that for sqrt, so the
> description of those generally applies to this patch as well.  As with
> sqrt, I reused the same test inputs in auto-libm-test-in as for
> non-narrowing fma rather than adding extra or separate inputs for
> narrowing fma.  The tests in libm-test-narrow-fma.inc also follow
> those for non-narrowing fma.
>
> The non-narrowing fma has a known bug (bug 6801) that it does not set
> errno on errors (overflow, underflow, Inf * 0, Inf - Inf).  Rather
> than fixing this or having narrowing fma check for errors when
> non-narrowing does not (complicating the cases when narrowing fma can
> otherwise be an alias for a non-narrowing function), this patch does
> not attempt to check for errors from narrowing fma and set errno; the
> CHECK_NARROW_FMA macro is still present, but as a placeholder that
> does nothing, and this missing errno setting is considered to be
> covered by the existing bug rather than needing a separate open bug.
> missing-errno annotations are duly added to many of the
> auto-libm-test-in test inputs for fma.
>
> This completes adding all the new functions from TS 18661-1 to glibc,
> so will be followed by corresponding stdc-predef.h changes to define
> __STDC_IEC_60559_BFP__ and __STDC_IEC_60559_COMPLEX__, as the support
> for TS 18661-1 will be at a similar level to that for C standard
> floating-point facilities up to C11 (pragmas not implemented, but
> library functions done).  (There are still further changes to be done
> to implement changes to the types of fromfp functions from N2548.)
>
> Tested as followed: natively with the full glibc testsuite for x86_64
> (GCC 11, 7, 6) and x86 (GCC 11); with build-many-glibcs.py with GCC
> 11, 7 and 6; cross testing of math/ tests for powerpc64le, powerpc32
> hard float, mips64 (all three ABIs, both hard and soft float).  The
> different GCC versions are to cover the different cases in tgmath.h
> and tgmath.h tests properly (GCC 6 has _Float* only as typedefs in
> glibc headers, GCC 7 has proper _Float* support, GCC 8 adds
> __builtin_tgmath).
>
> ---
>
> Committed.  Diffs to generated files auto-libm-test-out-* omitted
> below.
>

On Linux/i686, I got

FAIL: math/test-float-double-fma
FAIL: math/test-float32-float32x-fma
FAIL: math/test-float32-float64-fma

Do the new FMA tests require SSE math?

-- 
H.J.


More information about the Libc-alpha mailing list