From b0b422614cc9fda29e9675dcc6f2a377b3d517a8 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Wed, 30 Oct 2013 20:51:39 -0700 Subject: [PATCH] isnan: port to VAX Reported by John Klos for NetBSD-5/VAX in . * lib/isnan.c (IEEE_FLOATING_POINT): New macro, stolen from Emacs. (FUNC): Use it. --- ChangeLog | 8 ++++++++ lib/isnan.c | 18 +++++++++++++++--- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 0c564db88..3e96abc9f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2013-10-30 Paul Eggert + + isnan: port to VAX + Reported by John Klos for NetBSD-5/VAX in + . + * lib/isnan.c (IEEE_FLOATING_POINT): New macro, stolen from Emacs. + (FUNC): Use it. + 2013-10-28 Jim Meyering gnulib-tool: protect against CDPATH diff --git a/lib/isnan.c b/lib/isnan.c index d95e4bac7..10596a95c 100644 --- a/lib/isnan.c +++ b/lib/isnan.c @@ -79,10 +79,21 @@ extern int rpl_isnanf (float x); ((sizeof (DOUBLE) + sizeof (unsigned int) - 1) / sizeof (unsigned int)) typedef union { DOUBLE value; unsigned int word[NWORDS]; } memory_double; +/* Most hosts nowadays use IEEE floating point, so they use IEC 60559 + representations, have infinities and NaNs, and do not trap on + exceptions. Define IEEE_FLOATING_POINT if this host is one of the + typical ones. The C11 macro __STDC_IEC_559__ is close to what is + wanted here, but is not quite right because this file does not require + all the features of C11 Annex F (and does not require C11 at all, + for that matter). */ + +#define IEEE_FLOATING_POINT (FLT_RADIX == 2 && FLT_MANT_DIG == 24 \ + && FLT_MIN_EXP == -125 && FLT_MAX_EXP == 128) + int FUNC (DOUBLE x) { -#ifdef KNOWN_EXPBIT0_LOCATION +#if defined KNOWN_EXPBIT0_LOCATION && IEEE_FLOATING_POINT # if defined USE_LONG_DOUBLE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_)) && !HAVE_SAME_LONG_DOUBLE_AS_DOUBLE /* Special CPU dependent code is needed to treat bit patterns outside the IEEE 754 specification (such as Pseudo-NaNs, Pseudo-Infinities, @@ -153,8 +164,9 @@ FUNC (DOUBLE x) } # endif #else - /* The configuration did not find sufficient information. Give up about - the signaling NaNs, handle only the quiet NaNs. */ + /* The configuration did not find sufficient information, or does + not use IEEE floating point. Give up about the signaling NaNs; + handle only the quiet NaNs. */ if (x == x) { # if defined USE_LONG_DOUBLE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_)) && !HAVE_SAME_LONG_DOUBLE_AS_DOUBLE -- 2.11.0