From: Thomas Schwinge <thomas@codesourcery.com>
To: <libc-alpha@sourceware.org>, <libc-ports@sourceware.org>
Cc: <joseph@codesourcery.com>, <azanella@linux.vnet.ibm.com>,
<davem@davemloft.net>
Subject: Re: [attention machine maintainers] [PATCH] <math.h> issignaling
Date: Thu, 28 Mar 2013 12:16:00 -0000 [thread overview]
Message-ID: <87fvzf1zz4.fsf@schwinge.name> (raw)
In-Reply-To: <Pine.LNX.4.64.1303261719310.8202@digraph.polyomino.org.uk>
[-- Attachment #1: Type: text/plain, Size: 8914 bytes --]
Hi!
I plan to shortly "move" this patch (as present in the
tschwinge/issignaling branch) into master with the following changes
merged in, unless there are any further comments at this point.
On Tue, 26 Mar 2013 17:33:46 +0000, "Joseph S. Myers" <joseph@codesourcery.com> wrote:
> On Fri, 22 Mar 2013, Thomas Schwinge wrote:
>
> > PowerPC -m64:
> >
> > math/basic-test.out:
> > Failure: double x = (double) (long double) sNaN, !issignaling
> >
> > That is, this type cast -- which is a IEEE 754-2008 general-computational
> > convertFormat operation (IEEE 754-2008, 5.4.2) -- does not turn the sNaN
> > into a qNaN (whilst raising an INVALID exception; not checked here),
> > which is contrary to IEEE 754-2008 5.1 and 7.2. This I consider a
> > compiler issue (powerpc-linux-gnu-gcc (Sourcery CodeBench 2012.09-92)
> > 4.7.2).
>
> Such a bug (assuming present in GCC trunk for 4.9) should be filed in GCC
> Bugzilla (and I suppose a new math-tests.h macro used to disable the test
> in question for older compilers). Though I guess it might only be desired
> to change this for -fsignaling-nans.
I will add the following, file in GCC Bugzilla, add its PR number to the
math_tests.h comment (also for the 32-bit x86 issue discussed before):
--- math/basic-test.c
+++ math/basic-test.c
@@ -175,10 +175,13 @@ NAME (void) \
{ \
x1 = (FLOAT) sNaN_var; \
check (" "#FLOAT" x = ("#FLOAT") ("#DOUBLE") sNaN, isnan", isnan (x1)); \
- /* Upon type conversion, a sNaN is converted into a qNaN plus an */ \
- /* INVALID exception (not checked here). */ \
- check (" "#FLOAT" x = ("#FLOAT") ("#DOUBLE") sNaN, !issignaling", \
- !issignaling (x1)); \
+ if (SNAN_TESTS_TYPE_CAST) \
+ { \
+ /* Upon type conversion, a sNaN is converted into a qNaN plus an */ \
+ /* INVALID exception (not checked here). */ \
+ check (" "#FLOAT" x = ("#FLOAT") ("#DOUBLE") sNaN, !issignaling", \
+ !issignaling (x1)); \
+ } \
} \
x2 = (FLOAT) Inf_var; \
check (" "#FLOAT" x = ("#FLOAT") ("#DOUBLE") Inf", isinf (x2) != 0); \
--- sysdeps/generic/math-tests.h
+++ sysdeps/generic/math-tests.h
@@ -34,3 +34,9 @@
(sizeof (x) == sizeof (float) ? SNAN_TESTS_float \
: sizeof (x) == sizeof (double) ? SNAN_TESTS_double \
: SNAN_TESTS_long_double)
+
+/* Indicate whether to run tests involving type casts of sNaN values. These
+ are run unless overridden. */
+#ifndef SNAN_TESTS_TYPE_CAST
+# define SNAN_TESTS_TYPE_CAST 1
+#endif
--- /dev/null
+++ sysdeps/powerpc/math-tests.h
@@ -0,0 +1,26 @@
+/* Configuration for math tests. PowerPC version.
+ Copyright (C) 2013 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.
+
+ 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/>. */
+
+/* On PowerPC, in versions of GCC up to at least 4.7.2, a type cast -- which is
+ a IEEE 754-2008 general-computational convertFormat operation (IEEE
+ 754-2008, 5.4.2) -- does not turn a sNaN into a qNaN (whilst raising an
+ INVALID exception), which is contrary to IEEE 754-2008 5.1 and 7.2. This
+ renders certain tests infeasible in this scenario. */
+#define SNAN_TESTS_TYPE_CAST 0
+
+#include_next <math-tests.h>
> > --- NEWS
> > +++ NEWS
> > @@ -26,6 +26,8 @@ Version 2.18
> >
> > * Added a benchmark framework to track performance of functions in glibc.
> >
> > +* New <math.h> macro named issignaling to check for a signaling NaN (sNaN).
> > + This is currently GNU-specific.
>
> "GNU-specific" is a bit misleading there. I think you mean "only defined
> if _GNU_SOURCE is defined" (but you should note it comes from draft TS
> 18661).
>
> > +@comment math.h
> > +@comment GNU
> > +@deftypefn {Macro} int issignaling (@emph{float-type} @var{x})
> > +This macro returns a nonzero value if @var{x} is a signaling NaN
> > +(sNaN). It is a GNU extension.
>
> A GNU extension based on draft TS 18661.
I plan to change the wording as follows in both cases:
--- NEWS
+++ NEWS
@@ -27,7 +27,7 @@ Version 2.18
* Added a benchmark framework to track performance of functions in glibc.
* New <math.h> macro named issignaling to check for a signaling NaN (sNaN).
- This is currently GNU-specific.
+ It is based on draft TS 18661 and currently enabled as a GNU extension.
\f
Version 2.17
--- manual/arith.texi
+++ manual/arith.texi
@@ -391,7 +391,8 @@ to
@comment GNU
@deftypefn {Macro} int issignaling (@emph{float-type} @var{x})
This macro returns a nonzero value if @var{x} is a signaling NaN
-(sNaN). It is a GNU extension.
+(sNaN). It is based on draft TS 18661 and currently enabled as a GNU
+extension.
@end deftypefn
Another set of floating-point classification functions was provided by
> > +#undef __issignaling
>
> Why the #undef?
In case a machine-specific header file is defining a macro of the same
name; though you're correct that is not needed at this point. Removed.
> > +int __issignaling (double x)
>
> Return type on a separate line.
Changed.
--- sysdeps/ieee754/dbl-64/s_issignaling.c
+++ sysdeps/ieee754/dbl-64/s_issignaling.c
@@ -19,8 +19,8 @@
#include <math.h>
#include <math_private.h>
-#undef __issignaling
-int __issignaling (double x)
+int
+__issignaling (double x)
{
#ifdef HIGH_ORDER_BIT_IS_SET_FOR_SNAN
u_int32_t hxi;
--- sysdeps/ieee754/dbl-64/wordsize-64/s_issignaling.c
+++ sysdeps/ieee754/dbl-64/wordsize-64/s_issignaling.c
@@ -19,8 +19,8 @@
#include <math.h>
#include <math_private.h>
-#undef __issignaling
-int __issignaling (double x)
+int
+__issignaling (double x)
{
u_int64_t xi;
EXTRACT_WORDS64 (xi, x);
--- sysdeps/ieee754/flt-32/s_issignalingf.c
+++ sysdeps/ieee754/flt-32/s_issignalingf.c
@@ -19,8 +19,8 @@
#include <math.h>
#include <math_private.h>
-#undef __issignalingf
-int __issignalingf (float x)
+int
+__issignalingf (float x)
{
u_int32_t xi;
GET_FLOAT_WORD (xi, x);
--- sysdeps/ieee754/ldbl-128/s_issignalingl.c
+++ sysdeps/ieee754/ldbl-128/s_issignalingl.c
@@ -19,8 +19,8 @@
#include <math.h>
#include <math_private.h>
-#undef __issignalingl
-int __issignalingl (long double x)
+int
+__issignalingl (long double x)
{
u_int64_t hxi, lxi __attribute__ ((unused));
GET_LDOUBLE_WORDS64 (hxi, lxi, x);
--- sysdeps/ieee754/ldbl-128ibm/s_issignalingl.c
+++ sysdeps/ieee754/ldbl-128ibm/s_issignalingl.c
@@ -19,8 +19,8 @@
#include <math.h>
#include <math_private.h>
-#undef __issignalingl
-int __issignalingl (long double x)
+int
+__issignalingl (long double x)
{
u_int64_t xi;
/* For inspecting NaN status, we only have to look at the first of the pair
--- sysdeps/ieee754/ldbl-96/s_issignalingl.c
+++ sysdeps/ieee754/ldbl-96/s_issignalingl.c
@@ -19,8 +19,8 @@
#include <math.h>
#include <math_private.h>
-#undef __issignalingl
-int __issignalingl (long double x)
+int
+__issignalingl (long double x)
{
u_int32_t exi, hxi, lxi;
GET_LDOUBLE_WORDS (exi, hxi, lxi, x);
I also removed one »#error untested« after Dave's testing:
--- sysdeps/ieee754/ldbl-128/s_issignalingl.c
+++ sysdeps/ieee754/ldbl-128/s_issignalingl.c
@@ -31,7 +31,6 @@ int __issignalingl (long double x)
return ((hxi & UINT64_C (0x7fff800000000000))
== UINT64_C (0x7fff800000000000));
#else
-# error untested
/* To keep the following comparison simple, toggle the quiet/signaling bit,
so that it is set for sNaNs. This is inverse to IEEE 754-2008 (as well as
common practice for IEEE 754-1985). */
> > +{
> > +#ifdef HIGH_ORDER_BIT_IS_SET_FOR_SNAN
> > + u_int32_t hxi;
>
> (I tend to think that the C99 names such as uint32_t should be preferred,
> but since the libm code seems to be using the legacy names universally,
> any such change should probably first be made globally to existing code if
> there's consensus, rather than making this code in particular different.)
Exactly my thoughts.
Grüße,
Thomas
[-- Attachment #2: Type: application/pgp-signature, Size: 489 bytes --]
next prev parent reply other threads:[~2013-03-28 12:16 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <8762148l9v.fsf@schwinge.name>
2013-03-22 11:18 ` Thomas Schwinge
2013-03-24 21:30 ` David Miller
2013-03-25 6:52 ` Thomas Schwinge
2013-03-25 18:39 ` David Miller
2013-03-25 15:54 ` Carlos O'Donell
2013-03-26 17:34 ` Joseph S. Myers
2013-03-28 12:16 ` Thomas Schwinge [this message]
2013-04-03 12:17 ` Thomas Schwinge
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87fvzf1zz4.fsf@schwinge.name \
--to=thomas@codesourcery.com \
--cc=azanella@linux.vnet.ibm.com \
--cc=davem@davemloft.net \
--cc=joseph@codesourcery.com \
--cc=libc-alpha@sourceware.org \
--cc=libc-ports@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).