This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: soft-fp: Make extensions of subnormals from XFmode to TFmode signal underflow if traps enabled
- From: "Carlos O'Donell" <carlos at redhat dot com>
- To: "Joseph S. Myers" <joseph at codesourcery dot com>, libc-alpha at sourceware dot org
- Date: Wed, 08 Oct 2014 19:50:27 -0400
- Subject: Re: soft-fp: Make extensions of subnormals from XFmode to TFmode signal underflow if traps enabled
- Authentication-results: sourceware.org; auth=none
- References: <Pine dot LNX dot 4 dot 64 dot 1409172134470 dot 17727 at digraph dot polyomino dot org dot uk>
On 09/17/2014 05:35 PM, Joseph S. Myers wrote:
> This patch fixes a soft-fp corner case I previously noted in
> <https://sourceware.org/ml/libc-alpha/2013-10/msg00349.html>: when
> trapping on underflow is enabled, extensions of subnormals from XFmode
> to TFmode need to signal underflow because the result is tiny (but
> exact, so the underflow flag is not raised unless trapping is
> enabled).
Slightly unrelated, but why isn't everything using TFmode?
What benefit is there to XFmode?
> To avoid any excess initialization or tests for other cases of
> floating-point extensions, a new FP_INIT_TRAPPING_EXCEPTIONS is added
> that does the initialization required for this particular case (more
> than FP_INIT_EXCEPTIONS, less than FP_INIT_ROUNDMODE, in general), and
> FP_NO_EXACT_UNDERFLOW is added to stub out FP_TRAPPING_EXCEPTIONS
> tests for those cases of extensions where the test would be dead code,
> to avoid any uninitialized variable warnings.
>
> As the relevant case only applies in libgcc, not to any use of soft-fp
> in glibc, there is no bug report in Bugzilla and no non-default
> definitions of FP_INIT_TRAPPING_EXCEPTIONS are added by the patch. A
> testcase will be added to GCC as part of an update of soft-fp in
> libgcc once this patch is in libc.
>
> Tested for powerpc-nofpu that the disassembly of installed shared
> libraries is unchanged by this patch. Bootstrapped GCC with updated
> soft-fp (and an sfp-machine.h bug fix
> <https://gcc.gnu.org/ml/gcc-patches/2014-09/msg01415.html> -
> FP_TRAPPING_EXCEPTIONS was wrongly defined in libgcc for x86) with no
> regressions on x86_64-unknown-linux-gnu and verified that a test of
> the relevant case passes where it failed before.
>
> 2014-09-17 Joseph Myers <joseph@codesourcery.com>
>
> * soft-fp/op-common.h (FP_EXTEND): When a subnormal input produces
> a subnormal result, set the underflow exception if trapping on
> underflow is enabled.
> * soft-fp/soft-fp.h (FP_INIT_TRAPPING_EXCEPTIONS): New macro.
> (FP_INIT_EXCEPTIONS): Default to FP_INIT_TRAPPING_EXCEPTIONS.
> [FP_NO_EXACT_UNDERFLOW] (FP_TRAPPING_EXCEPTIONS): Undefine and
> redefine to 0.
> * soft-fp/extenddftf2.c (FP_NO_EXACT_UNDERFLOW): Define.
> * soft-fp/extendsfdf2.c (FP_NO_EXACT_UNDERFLOW): Likewise.
> * soft-fp/extendsftf2.c (FP_NO_EXACT_UNDERFLOW): Likewise.
> * soft-fp/extendxftf2.c (__extendxftf2): Use
> FP_INIT_TRAPPING_EXCEPTIONS instead of FP_INIT_ROUNDMODE.
Looks good to me.
> diff --git a/soft-fp/extenddftf2.c b/soft-fp/extenddftf2.c
> index 6984b41..1765532 100644
> --- a/soft-fp/extenddftf2.c
> +++ b/soft-fp/extenddftf2.c
> @@ -28,6 +28,7 @@
> License along with the GNU C Library; if not, see
> <http://www.gnu.org/licenses/>. */
>
> +#define FP_NO_EXACT_UNDERFLOW
OK.
> #include "soft-fp.h"
> #include "double.h"
> #include "quad.h"
> diff --git a/soft-fp/extendsfdf2.c b/soft-fp/extendsfdf2.c
> index a9b6bfb..6224195 100644
> --- a/soft-fp/extendsfdf2.c
> +++ b/soft-fp/extendsfdf2.c
> @@ -28,6 +28,7 @@
> License along with the GNU C Library; if not, see
> <http://www.gnu.org/licenses/>. */
>
> +#define FP_NO_EXACT_UNDERFLOW
OK.
> #include "soft-fp.h"
> #include "single.h"
> #include "double.h"
> diff --git a/soft-fp/extendsftf2.c b/soft-fp/extendsftf2.c
> index 07fc367..f67d614 100644
> --- a/soft-fp/extendsftf2.c
> +++ b/soft-fp/extendsftf2.c
> @@ -28,6 +28,7 @@
> License along with the GNU C Library; if not, see
> <http://www.gnu.org/licenses/>. */
>
> +#define FP_NO_EXACT_UNDERFLOW
OK.
> #include "soft-fp.h"
> #include "single.h"
> #include "quad.h"
> diff --git a/soft-fp/extendxftf2.c b/soft-fp/extendxftf2.c
> index 67b9095..a1386a6 100644
> --- a/soft-fp/extendxftf2.c
> +++ b/soft-fp/extendxftf2.c
> @@ -39,7 +39,7 @@ __extendxftf2 (XFtype a)
> FP_DECL_Q (R);
> TFtype r;
>
> - FP_INIT_ROUNDMODE;
> + FP_INIT_TRAPPING_EXCEPTIONS;
OK.
> FP_UNPACK_RAW_E (A, a);
> #if (2 * _FP_W_TYPE_SIZE) < _FP_FRACBITS_Q
> FP_EXTEND (Q, E, 4, 4, R, A);
> diff --git a/soft-fp/op-common.h b/soft-fp/op-common.h
> index 5f37a32..d55a1e5 100644
> --- a/soft-fp/op-common.h
> +++ b/soft-fp/op-common.h
> @@ -1538,6 +1538,8 @@
> _FP_FRAC_SLL_##dwc (D, (_FP_FRACBITS_##dfs \
> - _FP_FRACBITS_##sfs)); \
> D##_e = 0; \
> + if (FP_TRAPPING_EXCEPTIONS & FP_EX_UNDERFLOW) \
> + FP_SET_EXCEPTION (FP_EX_UNDERFLOW); \
OK. Here we signal underflow if the trapping flag was set.
> } \
> else \
> { \
> diff --git a/soft-fp/soft-fp.h b/soft-fp/soft-fp.h
> index 8d0efa5..807f847 100644
> --- a/soft-fp/soft-fp.h
> +++ b/soft-fp/soft-fp.h
> @@ -108,9 +108,15 @@
> #endif
>
> /* Initialize any machine-specific state used in
> + FP_TRAPPING_EXCEPTIONS or FP_HANDLE_EXCEPTIONS. */
> +#ifndef FP_INIT_TRAPPING_EXCEPTIONS
> +# define FP_INIT_TRAPPING_EXCEPTIONS FP_INIT_ROUNDMODE
OK. Default to what we did before.
> +#endif
> +
> +/* Initialize any machine-specific state used in
> FP_HANDLE_EXCEPTIONS. */
> #ifndef FP_INIT_EXCEPTIONS
> -# define FP_INIT_EXCEPTIONS FP_INIT_ROUNDMODE
> +# define FP_INIT_EXCEPTIONS FP_INIT_TRAPPING_EXCEPTIONS
OK.
> #endif
>
> #ifndef FP_HANDLE_EXCEPTIONS
> @@ -166,6 +172,16 @@
>
> #endif
>
> +/* A file using soft-fp may define FP_NO_EXACT_UNDERFLOW before
> + including soft-fp.h to indicate that, although a macro used there
> + could allow for the case of exact underflow requiring the underflow
> + exception to be raised if traps are enabled, for the particular
> + arguments used in that file no exact underflow can occur. */
> +#ifdef FP_NO_EXACT_UNDERFLOW
> +# undef FP_TRAPPING_EXCEPTIONS
> +# define FP_TRAPPING_EXCEPTIONS 0
> +#endif
> +
OK.
> #define _FP_ROUND_NEAREST(wc, X) \
> do \
> { \
>
Cheers,
Carlos.