Add sysdeps/ieee754/soft-fp.
authorJoseph Myers <joseph@codesourcery.com>
Tue, 12 Dec 2017 23:34:05 +0000 (23:34 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Tue, 12 Dec 2017 23:35:21 +0000 (23:35 +0000)
The default sysdeps/ieee754 fma implementations rely on exceptions and
rounding modes to achieve correct results through internal use of
round-to-odd.  Thus, glibc configurations without support for
exceptions and rounding modes instead need to use implementations of
fma based on soft-fp.

At present, this is achieved via having implementation files in
soft-fp/ that are #included by sysdeps files for each glibc
configuration that needs them.  In general this means such a
configuration has its own s_fma.c and s_fmaf.c.

TS 18661-1 adds functions that do an operation (+ - * / sqrt fma) on
arguments wider than the return type, with a single rounding of the
infinite-precision result to that return type.  These are also
naturally implemented using round-to-odd on platforms with hardware
support for rounding modes and exceptions but lacking hardware support
for these narrowing operations themselves.  (Platforms that have
direct hardware support for such narrowing operations include at least
ia64, and Power ISA 2.07 or later, which I think means POWER8 or
later.)

So adding the remaining TS 18661-1 functions would mean at least six
narrowing function implementations (fadd fsub fmul fdiv ffma fsqrt),
with aliases for other types and further implementations in some
configurations, that need to be overridden for configurations lacking
hardware exceptions and rounding modes.  Requiring all such
configurations (currently seven of them) to have their own source
files for all those functions seems undesirable.

Thus, this patch adds a directory sysdeps/ieee754/soft-fp to contain
libm function implementations based on soft-fp.  This directory is
then used via Implies from all the configurations that need it, so no
more files need adding to every such configuration when adding more
functions with soft-fp implementations.  A configuration can still
selectively #include a particular file from this directory if desired;
thus, the MIPS #include of the fmal implementation is retained, since
that's appropriate even for hard float (because long double is always
implementated in software for MIPS64, so the soft-fp implementation of
fmal is better than the ldbl-128 one).

This also provides additional motivation for my recent patch removing
--with-fp / --without-fp: previously there was no need for correct use
of --without-fp for no-FPU ARM or SH3, and now we have autodetection
nofpu/ sysdeps directories can be used by this patch for those
configurations without imposing any new requirements on how glibc is
configured.

(The mips64/*/fpu/s_fma.c files added by this patch are needed to keep
the dbl-64 version of fma for double, rather than the ldbl-128 one,
used in that case.)

Tested with build-many-glibcs.py that installed stripped shared
libraries are unchanged by this patch.

* soft-fp/fmadf4.c: Move to ....
* sysdeps/ieee754/soft-fp/s_fma.c: ... here.
* soft-fp/fmasf4.c: Move to ....
* sysdeps/ieee754/soft-fp/s_fmaf.c: ... here.
* soft-fp/fmatf4.c: Move to ....
* sysdeps/ieee754/soft-fp/s_fmal.c: ... here.
* sysdeps/ieee754/soft-fp/Makefile: New file.
* sysdeps/arm/preconfigure.ac: Define with_fp_cond.
* sysdeps/arm/preconfigure: Regenerated.
* sysdeps/arm/nofpu/Implies: New file.
* sysdeps/arm/s_fma.c: Remove file.
* sysdeps/arm/s_fmaf.c: Likewise.
* sysdeps/m68k/coldfire/nofpu/Implies: New file.
* sysdeps/m68k/coldfire/nofpu/s_fma.c: Remove file.
* sysdeps/m68k/coldfire/nofpu/s_fmaf.c: Likewise.
* sysdeps/microblaze/Implies: Add ieee754/soft-fp.
* sysdeps/microblaze/s_fma.c: Remove file.
* sysdeps/microblaze/s_fmaf.c: Likewise.
* sysdeps/mips/mips32/nofpu/Implies: New file.
* sysdeps/mips/mips64/n32/fpu/s_fma.c: Likewise.
* sysdeps/mips/mips64/n32/nofpu/Implies: Likewise.
* sysdeps/mips/mips64/n64/fpu/s_fma.c: Likewise.
* sysdeps/mips/mips64/n64/nofpu/Implies: Likewise.
* sysdeps/mips/ieee754/s_fma.c: Remove file.
* sysdeps/mips/ieee754/s_fmaf.c: Likewise.
* sysdeps/mips/ieee754/s_fmal.c: Update include for move of fmal
implementation.
* sysdeps/nios2/Implies: Add ieee754/soft-fp.
* sysdeps/nios2/s_fma.c: Remove file.
* sysdeps/nios2/s_fmaf.c: Likewise.
* sysdeps/sh/nofpu/Implies: New file.
* sysdeps/sh/s_fma.c: Remove file.
* sysdeps/sh/s_fmaf.c: Likewise.
* sysdeps/tile/Implies: Add ieee754/soft-fp.
* sysdeps/tile/s_fma.c: Remove file.
* sysdeps/tile/s_fmaf.c: Likewise.

36 files changed:
ChangeLog
soft-fp/fmadf4.c [deleted file]
soft-fp/fmasf4.c [deleted file]
soft-fp/fmatf4.c [deleted file]
sysdeps/arm/nofpu/Implies [new file with mode: 0644]
sysdeps/arm/preconfigure
sysdeps/arm/preconfigure.ac
sysdeps/arm/s_fma.c [deleted file]
sysdeps/arm/s_fmaf.c [deleted file]
sysdeps/ieee754/soft-fp/Makefile [new file with mode: 0644]
sysdeps/ieee754/soft-fp/s_fma.c [new file with mode: 0644]
sysdeps/ieee754/soft-fp/s_fmaf.c [new file with mode: 0644]
sysdeps/ieee754/soft-fp/s_fmal.c [new file with mode: 0644]
sysdeps/m68k/coldfire/nofpu/Implies [new file with mode: 0644]
sysdeps/m68k/coldfire/nofpu/s_fma.c [deleted file]
sysdeps/m68k/coldfire/nofpu/s_fmaf.c [deleted file]
sysdeps/microblaze/Implies
sysdeps/microblaze/s_fma.c [deleted file]
sysdeps/microblaze/s_fmaf.c [deleted file]
sysdeps/mips/ieee754/s_fma.c [deleted file]
sysdeps/mips/ieee754/s_fmaf.c [deleted file]
sysdeps/mips/ieee754/s_fmal.c
sysdeps/mips/mips32/nofpu/Implies [new file with mode: 0644]
sysdeps/mips/mips64/n32/fpu/s_fma.c [new file with mode: 0644]
sysdeps/mips/mips64/n32/nofpu/Implies [new file with mode: 0644]
sysdeps/mips/mips64/n64/fpu/s_fma.c [new file with mode: 0644]
sysdeps/mips/mips64/n64/nofpu/Implies [new file with mode: 0644]
sysdeps/nios2/Implies
sysdeps/nios2/s_fma.c [deleted file]
sysdeps/nios2/s_fmaf.c [deleted file]
sysdeps/sh/nofpu/Implies [new file with mode: 0644]
sysdeps/sh/s_fma.c [deleted file]
sysdeps/sh/s_fmaf.c [deleted file]
sysdeps/tile/Implies
sysdeps/tile/s_fma.c [deleted file]
sysdeps/tile/s_fmaf.c [deleted file]

index 2ceae53f87f2847d0c4d0a91ddb292c3a8062051..f560b2a832593f3116781b508cc7842db6ca0c03 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,42 @@
+2017-12-12  Joseph Myers  <joseph@codesourcery.com>
+
+       * soft-fp/fmadf4.c: Move to ....
+       * sysdeps/ieee754/soft-fp/s_fma.c: ... here.
+       * soft-fp/fmasf4.c: Move to ....
+       * sysdeps/ieee754/soft-fp/s_fmaf.c: ... here.
+       * soft-fp/fmatf4.c: Move to ....
+       * sysdeps/ieee754/soft-fp/s_fmal.c: ... here.
+       * sysdeps/ieee754/soft-fp/Makefile: New file.
+       * sysdeps/arm/preconfigure.ac: Define with_fp_cond.
+       * sysdeps/arm/preconfigure: Regenerated.
+       * sysdeps/arm/nofpu/Implies: New file.
+       * sysdeps/arm/s_fma.c: Remove file.
+       * sysdeps/arm/s_fmaf.c: Likewise.
+       * sysdeps/m68k/coldfire/nofpu/Implies: New file.
+       * sysdeps/m68k/coldfire/nofpu/s_fma.c: Remove file.
+       * sysdeps/m68k/coldfire/nofpu/s_fmaf.c: Likewise.
+       * sysdeps/microblaze/Implies: Add ieee754/soft-fp.
+       * sysdeps/microblaze/s_fma.c: Remove file.
+       * sysdeps/microblaze/s_fmaf.c: Likewise.
+       * sysdeps/mips/mips32/nofpu/Implies: New file.
+       * sysdeps/mips/mips64/n32/fpu/s_fma.c: Likewise.
+       * sysdeps/mips/mips64/n32/nofpu/Implies: Likewise.
+       * sysdeps/mips/mips64/n64/fpu/s_fma.c: Likewise.
+       * sysdeps/mips/mips64/n64/nofpu/Implies: Likewise.
+       * sysdeps/mips/ieee754/s_fma.c: Remove file.
+       * sysdeps/mips/ieee754/s_fmaf.c: Likewise.
+       * sysdeps/mips/ieee754/s_fmal.c: Update include for move of fmal
+       implementation.
+       * sysdeps/nios2/Implies: Add ieee754/soft-fp.
+       * sysdeps/nios2/s_fma.c: Remove file.
+       * sysdeps/nios2/s_fmaf.c: Likewise.
+       * sysdeps/sh/nofpu/Implies: New file.
+       * sysdeps/sh/s_fma.c: Remove file.
+       * sysdeps/sh/s_fmaf.c: Likewise.
+       * sysdeps/tile/Implies: Add ieee754/soft-fp.
+       * sysdeps/tile/s_fma.c: Remove file.
+       * sysdeps/tile/s_fmaf.c: Likewise.
+
 2017-12-12  H.J. Lu  <hongjiu.lu@intel.com>
 
        * sysdeps/x86_64/fpu/multiarch/Makefile (libm-sysdep_routines):
diff --git a/soft-fp/fmadf4.c b/soft-fp/fmadf4.c
deleted file mode 100644 (file)
index 313547d..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-/* Implement fma using soft-fp.
-   Copyright (C) 2013-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <math.h>
-#include <libc-diag.h>
-#include <libm-alias-double.h>
-
-/* R_e is not set in cases where it is not used in packing, but the
-   compiler does not see that it is set in all cases where it is
-   used, resulting in warnings that it may be used uninitialized.
-   The location of the warning differs in different versions of GCC,
-   it may be where R is defined using a macro or it may be where the
-   macro is defined.  */
-DIAG_PUSH_NEEDS_COMMENT;
-DIAG_IGNORE_NEEDS_COMMENT (4.9, "-Wmaybe-uninitialized");
-
-#include "soft-fp.h"
-#include "double.h"
-
-double
-__fma (double a, double b, double c)
-{
-  FP_DECL_EX;
-  FP_DECL_D (A);
-  FP_DECL_D (B);
-  FP_DECL_D (C);
-  FP_DECL_D (R);
-  double r;
-
-  FP_INIT_ROUNDMODE;
-  FP_UNPACK_D (A, a);
-  FP_UNPACK_D (B, b);
-  FP_UNPACK_D (C, c);
-  FP_FMA_D (R, A, B, C);
-  FP_PACK_D (r, R);
-  FP_HANDLE_EXCEPTIONS;
-
-  return r;
-}
-DIAG_POP_NEEDS_COMMENT;
-
-#ifndef __fma
-libm_alias_double (__fma, fma)
-#endif
diff --git a/soft-fp/fmasf4.c b/soft-fp/fmasf4.c
deleted file mode 100644 (file)
index 295223d..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-/* Implement fmaf using soft-fp.
-   Copyright (C) 2013-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <math.h>
-#include <libc-diag.h>
-#include <libm-alias-float.h>
-
-/* R_e is not set in cases where it is not used in packing, but the
-   compiler does not see that it is set in all cases where it is
-   used, resulting in warnings that it may be used uninitialized.
-   The location of the warning differs in different versions of GCC,
-   it may be where R is defined using a macro or it may be where the
-   macro is defined.  */
-DIAG_PUSH_NEEDS_COMMENT;
-DIAG_IGNORE_NEEDS_COMMENT (4.9, "-Wmaybe-uninitialized");
-
-#include "soft-fp.h"
-#include "single.h"
-
-float
-__fmaf (float a, float b, float c)
-{
-  FP_DECL_EX;
-  FP_DECL_S (A);
-  FP_DECL_S (B);
-  FP_DECL_S (C);
-  FP_DECL_S (R);
-  float r;
-
-  FP_INIT_ROUNDMODE;
-  FP_UNPACK_S (A, a);
-  FP_UNPACK_S (B, b);
-  FP_UNPACK_S (C, c);
-  FP_FMA_S (R, A, B, C);
-  FP_PACK_S (r, R);
-  FP_HANDLE_EXCEPTIONS;
-
-  return r;
-}
-DIAG_POP_NEEDS_COMMENT;
-
-#ifndef __fmaf
-libm_alias_float (__fma, fma)
-#endif
diff --git a/soft-fp/fmatf4.c b/soft-fp/fmatf4.c
deleted file mode 100644 (file)
index 79be52c..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-/* Implement fmal using soft-fp.
-   Copyright (C) 2013-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   In addition to the permissions in the GNU Lesser General Public
-   License, the Free Software Foundation gives you unlimited
-   permission to link the compiled version of this file into
-   combinations with other programs, and to distribute those
-   combinations without any restriction coming from the use of this
-   file.  (The Lesser General Public License restrictions do apply in
-   other respects; for example, they cover modification of the file,
-   and distribution when not linked into a combine executable.)
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#include <math.h>
-#include <libc-diag.h>
-#include <libm-alias-ldouble.h>
-
-/* R_e is not set in cases where it is not used in packing, but the
-   compiler does not see that it is set in all cases where it is
-   used, resulting in warnings that it may be used uninitialized.
-   The location of the warning differs in different versions of GCC,
-   it may be where R is defined using a macro or it may be where the
-   macro is defined.  */
-DIAG_PUSH_NEEDS_COMMENT;
-DIAG_IGNORE_NEEDS_COMMENT (4.9, "-Wmaybe-uninitialized");
-
-#include "soft-fp.h"
-#include "quad.h"
-
-long double
-__fmal (long double a, long double b, long double c)
-{
-  FP_DECL_EX;
-  FP_DECL_Q (A);
-  FP_DECL_Q (B);
-  FP_DECL_Q (C);
-  FP_DECL_Q (R);
-  long double r;
-
-  FP_INIT_ROUNDMODE;
-  FP_UNPACK_Q (A, a);
-  FP_UNPACK_Q (B, b);
-  FP_UNPACK_Q (C, c);
-  FP_FMA_Q (R, A, B, C);
-  FP_PACK_Q (r, R);
-  FP_HANDLE_EXCEPTIONS;
-
-  return r;
-}
-DIAG_POP_NEEDS_COMMENT;
-
-libm_alias_ldouble (__fma, fma)
diff --git a/sysdeps/arm/nofpu/Implies b/sysdeps/arm/nofpu/Implies
new file mode 100644 (file)
index 0000000..abcbadb
--- /dev/null
@@ -0,0 +1 @@
+ieee754/soft-fp
index 33e9501c4fe19ac71a497b41562f0143e0783aaa..d803256d9fb2b276731a5f18d25dc1fed898bd06 100644 (file)
@@ -52,4 +52,5 @@ $as_echo "$as_me: WARNING: arm/preconfigure: Did not find ARM architecture type;
   esac
 
   machine=arm/$machine
+  with_fp_cond="!defined __SOFTFP__"
 esac
index 20de5bcfea0e378ea1eddd931a8892d47ec456eb..43d014031d0a701ea184a7fd6015ce2dd83d3ca1 100644 (file)
@@ -47,4 +47,5 @@ arm*)
   esac
 
   machine=arm/$machine
+  with_fp_cond="!defined __SOFTFP__"
 esac
diff --git a/sysdeps/arm/s_fma.c b/sysdeps/arm/s_fma.c
deleted file mode 100644 (file)
index dc4e27b..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-#ifdef __SOFTFP__
-# include <soft-fp/fmadf4.c>
-#else
-# include <sysdeps/ieee754/dbl-64/s_fma.c>
-#endif
diff --git a/sysdeps/arm/s_fmaf.c b/sysdeps/arm/s_fmaf.c
deleted file mode 100644 (file)
index 550d8b8..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-#ifdef __SOFTFP__
-# include <soft-fp/fmasf4.c>
-#else
-# include <sysdeps/ieee754/dbl-64/s_fmaf.c>
-#endif
diff --git a/sysdeps/ieee754/soft-fp/Makefile b/sysdeps/ieee754/soft-fp/Makefile
new file mode 100644 (file)
index 0000000..ada13e8
--- /dev/null
@@ -0,0 +1,3 @@
+ifeq ($(subdir),math)
+CPPFLAGS += -I../soft-fp
+endif
diff --git a/sysdeps/ieee754/soft-fp/s_fma.c b/sysdeps/ieee754/soft-fp/s_fma.c
new file mode 100644 (file)
index 0000000..313547d
--- /dev/null
@@ -0,0 +1,68 @@
+/* Implement fma using soft-fp.
+   Copyright (C) 2013-2017 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <math.h>
+#include <libc-diag.h>
+#include <libm-alias-double.h>
+
+/* R_e is not set in cases where it is not used in packing, but the
+   compiler does not see that it is set in all cases where it is
+   used, resulting in warnings that it may be used uninitialized.
+   The location of the warning differs in different versions of GCC,
+   it may be where R is defined using a macro or it may be where the
+   macro is defined.  */
+DIAG_PUSH_NEEDS_COMMENT;
+DIAG_IGNORE_NEEDS_COMMENT (4.9, "-Wmaybe-uninitialized");
+
+#include "soft-fp.h"
+#include "double.h"
+
+double
+__fma (double a, double b, double c)
+{
+  FP_DECL_EX;
+  FP_DECL_D (A);
+  FP_DECL_D (B);
+  FP_DECL_D (C);
+  FP_DECL_D (R);
+  double r;
+
+  FP_INIT_ROUNDMODE;
+  FP_UNPACK_D (A, a);
+  FP_UNPACK_D (B, b);
+  FP_UNPACK_D (C, c);
+  FP_FMA_D (R, A, B, C);
+  FP_PACK_D (r, R);
+  FP_HANDLE_EXCEPTIONS;
+
+  return r;
+}
+DIAG_POP_NEEDS_COMMENT;
+
+#ifndef __fma
+libm_alias_double (__fma, fma)
+#endif
diff --git a/sysdeps/ieee754/soft-fp/s_fmaf.c b/sysdeps/ieee754/soft-fp/s_fmaf.c
new file mode 100644 (file)
index 0000000..295223d
--- /dev/null
@@ -0,0 +1,68 @@
+/* Implement fmaf using soft-fp.
+   Copyright (C) 2013-2017 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <math.h>
+#include <libc-diag.h>
+#include <libm-alias-float.h>
+
+/* R_e is not set in cases where it is not used in packing, but the
+   compiler does not see that it is set in all cases where it is
+   used, resulting in warnings that it may be used uninitialized.
+   The location of the warning differs in different versions of GCC,
+   it may be where R is defined using a macro or it may be where the
+   macro is defined.  */
+DIAG_PUSH_NEEDS_COMMENT;
+DIAG_IGNORE_NEEDS_COMMENT (4.9, "-Wmaybe-uninitialized");
+
+#include "soft-fp.h"
+#include "single.h"
+
+float
+__fmaf (float a, float b, float c)
+{
+  FP_DECL_EX;
+  FP_DECL_S (A);
+  FP_DECL_S (B);
+  FP_DECL_S (C);
+  FP_DECL_S (R);
+  float r;
+
+  FP_INIT_ROUNDMODE;
+  FP_UNPACK_S (A, a);
+  FP_UNPACK_S (B, b);
+  FP_UNPACK_S (C, c);
+  FP_FMA_S (R, A, B, C);
+  FP_PACK_S (r, R);
+  FP_HANDLE_EXCEPTIONS;
+
+  return r;
+}
+DIAG_POP_NEEDS_COMMENT;
+
+#ifndef __fmaf
+libm_alias_float (__fma, fma)
+#endif
diff --git a/sysdeps/ieee754/soft-fp/s_fmal.c b/sysdeps/ieee754/soft-fp/s_fmal.c
new file mode 100644 (file)
index 0000000..79be52c
--- /dev/null
@@ -0,0 +1,66 @@
+/* Implement fmal using soft-fp.
+   Copyright (C) 2013-2017 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   In addition to the permissions in the GNU Lesser General Public
+   License, the Free Software Foundation gives you unlimited
+   permission to link the compiled version of this file into
+   combinations with other programs, and to distribute those
+   combinations without any restriction coming from the use of this
+   file.  (The Lesser General Public License restrictions do apply in
+   other respects; for example, they cover modification of the file,
+   and distribution when not linked into a combine executable.)
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <math.h>
+#include <libc-diag.h>
+#include <libm-alias-ldouble.h>
+
+/* R_e is not set in cases where it is not used in packing, but the
+   compiler does not see that it is set in all cases where it is
+   used, resulting in warnings that it may be used uninitialized.
+   The location of the warning differs in different versions of GCC,
+   it may be where R is defined using a macro or it may be where the
+   macro is defined.  */
+DIAG_PUSH_NEEDS_COMMENT;
+DIAG_IGNORE_NEEDS_COMMENT (4.9, "-Wmaybe-uninitialized");
+
+#include "soft-fp.h"
+#include "quad.h"
+
+long double
+__fmal (long double a, long double b, long double c)
+{
+  FP_DECL_EX;
+  FP_DECL_Q (A);
+  FP_DECL_Q (B);
+  FP_DECL_Q (C);
+  FP_DECL_Q (R);
+  long double r;
+
+  FP_INIT_ROUNDMODE;
+  FP_UNPACK_Q (A, a);
+  FP_UNPACK_Q (B, b);
+  FP_UNPACK_Q (C, c);
+  FP_FMA_Q (R, A, B, C);
+  FP_PACK_Q (r, R);
+  FP_HANDLE_EXCEPTIONS;
+
+  return r;
+}
+DIAG_POP_NEEDS_COMMENT;
+
+libm_alias_ldouble (__fma, fma)
diff --git a/sysdeps/m68k/coldfire/nofpu/Implies b/sysdeps/m68k/coldfire/nofpu/Implies
new file mode 100644 (file)
index 0000000..abcbadb
--- /dev/null
@@ -0,0 +1 @@
+ieee754/soft-fp
diff --git a/sysdeps/m68k/coldfire/nofpu/s_fma.c b/sysdeps/m68k/coldfire/nofpu/s_fma.c
deleted file mode 100644 (file)
index d9613fa..0000000
+++ /dev/null
@@ -1 +0,0 @@
-#include <soft-fp/fmadf4.c>
diff --git a/sysdeps/m68k/coldfire/nofpu/s_fmaf.c b/sysdeps/m68k/coldfire/nofpu/s_fmaf.c
deleted file mode 100644 (file)
index aa5c9b2..0000000
+++ /dev/null
@@ -1 +0,0 @@
-#include <soft-fp/fmasf4.c>
index 73c766c52ec46340941ef8b617c0f6822c0e35da..746b21ad665bde810ef20cd6638a9617d2678860 100644 (file)
@@ -1,4 +1,5 @@
 wordsize-32
 # MicroBlaze uses IEEE 754 floating point.
+ieee754/soft-fp
 ieee754/flt-32
 ieee754/dbl-64
diff --git a/sysdeps/microblaze/s_fma.c b/sysdeps/microblaze/s_fma.c
deleted file mode 100644 (file)
index d9613fa..0000000
+++ /dev/null
@@ -1 +0,0 @@
-#include <soft-fp/fmadf4.c>
diff --git a/sysdeps/microblaze/s_fmaf.c b/sysdeps/microblaze/s_fmaf.c
deleted file mode 100644 (file)
index aa5c9b2..0000000
+++ /dev/null
@@ -1 +0,0 @@
-#include <soft-fp/fmasf4.c>
diff --git a/sysdeps/mips/ieee754/s_fma.c b/sysdeps/mips/ieee754/s_fma.c
deleted file mode 100644 (file)
index 5741414..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-#ifdef __mips_hard_float
-# include <sysdeps/ieee754/dbl-64/s_fma.c>
-#else
-# include <soft-fp/fmadf4.c>
-#endif
diff --git a/sysdeps/mips/ieee754/s_fmaf.c b/sysdeps/mips/ieee754/s_fmaf.c
deleted file mode 100644 (file)
index 30bcdae..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-#ifdef __mips_hard_float
-# include <sysdeps/ieee754/dbl-64/s_fmaf.c>
-#else
-# include <soft-fp/fmasf4.c>
-#endif
index 6b83e914fe29604a23593557bd71b2c02ff87ea3..c52331967d125ff77ee22b96b67c81319f03d935 100644 (file)
@@ -4,4 +4,4 @@
 # error "long double fma being compiled for o32 ABI"
 #endif
 
-#include <soft-fp/fmatf4.c>
+#include <sysdeps/ieee754/soft-fp/s_fmal.c>
diff --git a/sysdeps/mips/mips32/nofpu/Implies b/sysdeps/mips/mips32/nofpu/Implies
new file mode 100644 (file)
index 0000000..abcbadb
--- /dev/null
@@ -0,0 +1 @@
+ieee754/soft-fp
diff --git a/sysdeps/mips/mips64/n32/fpu/s_fma.c b/sysdeps/mips/mips64/n32/fpu/s_fma.c
new file mode 100644 (file)
index 0000000..b61fa64
--- /dev/null
@@ -0,0 +1 @@
+#include <sysdeps/ieee754/dbl-64/s_fma.c>
diff --git a/sysdeps/mips/mips64/n32/nofpu/Implies b/sysdeps/mips/mips64/n32/nofpu/Implies
new file mode 100644 (file)
index 0000000..abcbadb
--- /dev/null
@@ -0,0 +1 @@
+ieee754/soft-fp
diff --git a/sysdeps/mips/mips64/n64/fpu/s_fma.c b/sysdeps/mips/mips64/n64/fpu/s_fma.c
new file mode 100644 (file)
index 0000000..b61fa64
--- /dev/null
@@ -0,0 +1 @@
+#include <sysdeps/ieee754/dbl-64/s_fma.c>
diff --git a/sysdeps/mips/mips64/n64/nofpu/Implies b/sysdeps/mips/mips64/n64/nofpu/Implies
new file mode 100644 (file)
index 0000000..abcbadb
--- /dev/null
@@ -0,0 +1 @@
+ieee754/soft-fp
index 387a0ca0520458343a6e689eee2a5854e096f91d..7d69983412d8a27d2479027b5a0fb4ef5e16d6e8 100644 (file)
@@ -1,3 +1,4 @@
 wordsize-32
+ieee754/soft-fp
 ieee754/dbl-64
 ieee754/flt-32
diff --git a/sysdeps/nios2/s_fma.c b/sysdeps/nios2/s_fma.c
deleted file mode 100644 (file)
index d9613fa..0000000
+++ /dev/null
@@ -1 +0,0 @@
-#include <soft-fp/fmadf4.c>
diff --git a/sysdeps/nios2/s_fmaf.c b/sysdeps/nios2/s_fmaf.c
deleted file mode 100644 (file)
index aa5c9b2..0000000
+++ /dev/null
@@ -1 +0,0 @@
-#include <soft-fp/fmasf4.c>
diff --git a/sysdeps/sh/nofpu/Implies b/sysdeps/sh/nofpu/Implies
new file mode 100644 (file)
index 0000000..abcbadb
--- /dev/null
@@ -0,0 +1 @@
+ieee754/soft-fp
diff --git a/sysdeps/sh/s_fma.c b/sysdeps/sh/s_fma.c
deleted file mode 100644 (file)
index d92438d..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-#ifdef __SH_FPU_ANY__
-# include <sysdeps/ieee754/dbl-64/s_fma.c>
-#else
-# include <soft-fp/fmadf4.c>
-#endif
diff --git a/sysdeps/sh/s_fmaf.c b/sysdeps/sh/s_fmaf.c
deleted file mode 100644 (file)
index 3b811ae..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-#ifdef __SH_FPU_ANY__
-# include <sysdeps/ieee754/dbl-64/s_fmaf.c>
-#else
-# include <soft-fp/fmasf4.c>
-#endif
index 5b29b261286b3199f9bb18b3e6f825d86d4fe453..1cbc0539050494c3baec19e0b9b6bdc64ac1c9f4 100644 (file)
@@ -1,2 +1,3 @@
+ieee754/soft-fp
 ieee754/dbl-64
 ieee754/flt-32
diff --git a/sysdeps/tile/s_fma.c b/sysdeps/tile/s_fma.c
deleted file mode 100644 (file)
index d9613fa..0000000
+++ /dev/null
@@ -1 +0,0 @@
-#include <soft-fp/fmadf4.c>
diff --git a/sysdeps/tile/s_fmaf.c b/sysdeps/tile/s_fmaf.c
deleted file mode 100644 (file)
index aa5c9b2..0000000
+++ /dev/null
@@ -1 +0,0 @@
-#include <soft-fp/fmasf4.c>