From b6182a09dd286f592f2968c324cb2ce36f5b9082 Mon Sep 17 00:00:00 2001 From: Jeff Johnston Date: Thu, 14 Dec 2000 00:25:06 +0000 Subject: 2000-12-13 Jeff Johnston * libc/stdlib/ldtoa.c (_ldcheck): New routine that categorizes a long double as NaN, Infinity, or other. * libc/stdio/vfprintf.c [WANT_IO_LONG_DBL](_VFPRINTF_R): Removed isinfl and isnanl static routines which were i386-specific. Changed calls to the two removed routines to a single _ldcheck call. * libc/stdio/vfieeefp.h (ldieee): Fixed missing semi-colons. --- newlib/ChangeLog | 9 +++++++++ newlib/libc/stdio/vfieeefp.h | 10 +++++----- newlib/libc/stdio/vfprintf.c | 35 +++++------------------------------ newlib/libc/stdlib/ldtoa.c | 41 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 60 insertions(+), 35 deletions(-) diff --git a/newlib/ChangeLog b/newlib/ChangeLog index c7420c816..61b6c7fee 100644 --- a/newlib/ChangeLog +++ b/newlib/ChangeLog @@ -1,3 +1,12 @@ +2000-12-13 Jeff Johnston + + * libc/stdlib/ldtoa.c (_ldcheck): New routine + that categorizes a long double as NaN, Infinity, or other. + * libc/stdio/vfprintf.c [WANT_IO_LONG_DBL](_VFPRINTF_R): Removed + isinfl and isnanl static routines which were i386-specific. Changed + calls to the two removed routines to a single _ldcheck call. + * libc/stdio/vfieeefp.h (ldieee): Fixed missing semi-colons. + 2000-12-13 Jeff Johnston * Makefile.am: Fixed install-data-local target to use diff --git a/newlib/libc/stdio/vfieeefp.h b/newlib/libc/stdio/vfieeefp.h index de0267223..1b240fcde 100644 --- a/newlib/libc/stdio/vfieeefp.h +++ b/newlib/libc/stdio/vfieeefp.h @@ -70,7 +70,7 @@ struct ldieee unsigned manh:23; unsigned exp:8; unsigned sign:1; -} +}; #elif LDBL_MANT_DIG == 53 struct ldieee { @@ -78,7 +78,7 @@ struct ldieee unsigned manh:32; unsigned exp:11; unsigned sign:1; -} +}; #elif LDBL_MANT_DIG == 64 struct ldieee { @@ -105,7 +105,7 @@ struct ldieee unsigned sign:1; unsigned exp:8; unsigned manh:23; -} +}; #elif LDBL_MANT_DIG == 53 struct ldieee { @@ -113,7 +113,7 @@ struct ldieee unsigned exp:11; unsigned manh:32; unsigned manl:20; -} +}; #elif LDBL_MANT_DIG == 64 struct ldieee { @@ -121,7 +121,7 @@ struct ldieee unsigned exp:15; unsigned manh:32; unsigned manl:32; -} +}; #elif LDBL_MANT_DIG > 64 struct ldieee { diff --git a/newlib/libc/stdio/vfprintf.c b/newlib/libc/stdio/vfprintf.c index 306644a30..34ec68972 100644 --- a/newlib/libc/stdio/vfprintf.c +++ b/newlib/libc/stdio/vfprintf.c @@ -252,8 +252,7 @@ __sbprintf(fp, fmt, ap) static char *cvt _PARAMS((struct _reent *, double, int, int, char *, int *, int, int *)); #else static char *cvt _PARAMS((struct _reent *, _LONG_DOUBLE, int, int, char *, int *, int, int *)); -static int isinfl _PARAMS((_LONG_DOUBLE *)); -static int isnanl _PARAMS((_LONG_DOUBLE *)); +extern int _ldcheck _PARAMS((_LONG_DOUBLE *)); #endif static int exponent _PARAMS((char *, int, int)); @@ -322,6 +321,7 @@ _DEFUN (_VFPRINTF_R, (data, fp, fmt0, ap), #else union { int i; _LONG_DOUBLE ld; } _long_double_ = {0}; #define _fpvalue (_long_double_.ld) + int tmp; #endif int expt; /* integer value of exponent */ int expsize = 0; /* character count for expstr */ @@ -604,14 +604,15 @@ reswitch: switch (ch) { } /* do this before tricky precision changes */ - if (isinfl(&_fpvalue)) { + tmp = _ldcheck (&_fpvalue); + if (tmp == 2) { if (_fpvalue < 0) sign = '-'; cp = "Inf"; size = 3; break; } - if (isnanl(&_fpvalue)) { + if (tmp == 1) { cp = "NaN"; size = 3; break; @@ -912,32 +913,6 @@ extern char *_ldtoa_r _PARAMS((struct _reent *, _LONG_DOUBLE, int, int, int *, int *, char **)); #undef word0 #define word0(x) ldword0(x) - -static int -isinfl (value) - _LONG_DOUBLE *value; -{ - struct ldieee *ldptr; - - ldptr = (struct ldieee *)value; - - if (ldptr->exp == 0x7fff && !(ldptr->manh & 0x7fffffff) && !ldptr->manl) - return 1; - return 0; -} - -static int -isnanl (value) - _LONG_DOUBLE *value; -{ - struct ldieee *ldptr; - - ldptr = (struct ldieee *)value; - - if (ldptr->exp == 0x7fff && ((ldptr->manh & 0x7fffffff) || ldptr->manl)) - return 1; - return 0; -} #endif static char * diff --git a/newlib/libc/stdlib/ldtoa.c b/newlib/libc/stdlib/ldtoa.c index 046e93981..b332d2a2e 100644 --- a/newlib/libc/stdlib/ldtoa.c +++ b/newlib/libc/stdlib/ldtoa.c @@ -13,6 +13,7 @@ /* linux name: long double _IO_strtold (char *, char **); */ long double _strtold (char *, char **); char * _ldtoa_r (struct _reent *, long double, int, int, int *, int *, char **); +int _ldcheck (long double *); #if 0 void _IO_ldtostr(long double *, char *, int, int, char); #endif @@ -2826,6 +2827,46 @@ if( rve ) return outstr; } +/* Routine used to tell if long double is NaN or Infinity or regular number. + Returns: 0 = regular number + 1 = Nan + 2 = Infinity +*/ +int +_ldcheck (long double *d) +{ +unsigned short e[NI]; +char *s, *p; +int k; +LDPARMS rnd; +LDPARMS *ldp = &rnd; +char *outstr; + +rnd.rlast = -1; +rnd.rndprc = NBITS; + +#if LDBL_MANT_DIG == 24 +e24toe( (unsigned short *)d, e, ldp ); +#elif LDBL_MANT_DIG == 53 +e53toe( (unsigned short *)d, e, ldp ); +#elif LDBL_MANT_DIG == 64 +e64toe( (unsigned short *)d, e, ldp ); +#else +e113toe( (unsigned short *)d, e, ldp ); +#endif + +if( (e[NE-1] & 0x7fff) == 0x7fff ) + { +#ifdef NANS + if( eisnan(e) ) + return( 1 ); +#endif + return( 2 ); + } +else + return( 0 ); +} /* _ldcheck */ + static void etoasc(short unsigned int *x, char *string, int ndigits, int outformat, LDPARMS *ldp) { long digit; -- cgit v1.2.3