diff options
author | Eric Blake <eblake@redhat.com> | 2007-05-16 19:59:40 +0000 |
---|---|---|
committer | Eric Blake <eblake@redhat.com> | 2007-05-16 19:59:40 +0000 |
commit | 895d76fed6448bb19559f57195a60ae311d0cac0 (patch) | |
tree | eb8c00e61f8a2c79d2f0afa392511292e51a4689 /newlib | |
parent | f65607751cf60bb615ee0437a0d0984af47b0fb3 (diff) | |
download | newlib-895d76fed6448bb19559f57195a60ae311d0cac0.zip newlib-895d76fed6448bb19559f57195a60ae311d0cac0.tar.gz newlib-895d76fed6448bb19559f57195a60ae311d0cac0.tar.bz2 |
* libc/include/math.h (INFINITY, NAN, FP_ILOGB0, FP_ILOGBNAN)
(MATH_ERRNO, MATH_ERREXCEPT, math_errhandling): Add macros
required by POSIX.
* libc/stdlib/ldtoa.c (USE_INFINITY): Rename from INFINITY, to
avoid clash with <math.h>.
Diffstat (limited to 'newlib')
-rw-r--r-- | newlib/ChangeLog | 6 | ||||
-rw-r--r-- | newlib/libc/include/math.h | 60 | ||||
-rw-r--r-- | newlib/libc/stdlib/ldtoa.c | 57 |
3 files changed, 74 insertions, 49 deletions
diff --git a/newlib/ChangeLog b/newlib/ChangeLog index 6e56ebe..699dbd4 100644 --- a/newlib/ChangeLog +++ b/newlib/ChangeLog @@ -1,5 +1,11 @@ 2007-05-16 Eric Blake <ebb9@byu.net> + * libc/include/math.h (INFINITY, NAN, FP_ILOGB0, FP_ILOGBNAN) + (MATH_ERRNO, MATH_ERREXCEPT, math_errhandling): Add macros + required by POSIX. + * libc/stdlib/ldtoa.c (USE_INFINITY): Rename from INFINITY, to + avoid clash with <math.h>. + * libc/stdlib/wctomb_r.c (_wctomb_r): Avoid gcc warnings on cygwin. * libc/search/hash.c (__hash_open): Likewise. diff --git a/newlib/libc/include/math.h b/newlib/libc/include/math.h index 63cc992..f161fe7 100644 --- a/newlib/libc/include/math.h +++ b/newlib/libc/include/math.h @@ -1,4 +1,3 @@ - #ifndef _MATH_H_ #define _MATH_H_ @@ -13,13 +12,13 @@ union __dmath __ULong i[2]; double d; }; - + union __fmath { __ULong i[1]; float f; }; - + union __ldmath { __ULong i[4]; @@ -32,23 +31,31 @@ union __ldmath /* gcc >= 3.3 implicitly defines builtins for HUGE_VALx values. */ - #ifndef HUGE_VAL - #define HUGE_VAL (__builtin_huge_val()) - #endif +# ifndef HUGE_VAL +# define HUGE_VAL (__builtin_huge_val()) +# endif - #ifndef HUGE_VALF - #define HUGE_VALF (__builtin_huge_valf()) - #endif +# ifndef HUGE_VALF +# define HUGE_VALF (__builtin_huge_valf()) +# endif - #ifndef HUGE_VALL - #define HUGE_VALL (__builtin_huge_vall()) - #endif +# ifndef HUGE_VALL +# define HUGE_VALL (__builtin_huge_vall()) +# endif + +# ifndef INFINITY +# define INFINITY (__builtin_inff()) +# endif + +# ifndef NAN +# define NAN (__builtin_nanf("")) +# endif #else /* !gcc >= 3.3 */ - /* No builtins. Use floating-point unions instead. Declare as an array - without bounds so no matter what small data support a port and/or - library has, the reference will be via the general method for accessing + /* No builtins. Use floating-point unions instead. Declare as an array + without bounds so no matter what small data support a port and/or + library has, the reference will be via the general method for accessing globals. */ #ifndef HUGE_VAL @@ -118,6 +125,23 @@ typedef double double_t; #define FP_SUBNORMAL 3 #define FP_NORMAL 4 +#ifndef FP_ILOGB0 +# define FP_ILOGB0 (-INT_MAX) +#endif +#ifndef FP_ILOGBNAN +# define FP_ILOGBNAN INT_MAX +#endif + +#ifndef MATH_ERRNO +# define MATH_ERRNO 1 +#endif +#ifndef MATH_ERREXCEPT +# define MATH_ERREXCEPT 2 +#endif +#ifndef math_errhandling +# define math_errhandling MATH_ERRNO +#endif + extern int __isinff (float x); extern int __isinfd (double x); extern int __isnanf (float x); @@ -347,9 +371,9 @@ extern int *__signgam _PARAMS((void)); /* We have a problem when using C++ since `exception' is a reserved name in C++. */ #ifdef __cplusplus -struct __exception +struct __exception #else -struct exception +struct exception #endif { int type; @@ -397,7 +421,7 @@ extern int matherr _PARAMS((struct exception *e)); #define M_SQRT1_2 0.70710678118654752440 #define M_LN2LO 1.9082149292705877000E-10 #define M_LN2HI 6.9314718036912381649E-1 -#define M_SQRT3 1.73205080756887719000 +#define M_SQRT3 1.73205080756887719000 #define M_IVLN10 0.43429448190325182765 /* 1 / log(10) */ #define M_LOG2_E 0.693147180559945309417 #define M_INVLN2 1.4426950408889633870E0 /* 1 / log(2) */ diff --git a/newlib/libc/stdlib/ldtoa.c b/newlib/libc/stdlib/ldtoa.c index 6a29dda..d445793 100644 --- a/newlib/libc/stdlib/ldtoa.c +++ b/newlib/libc/stdlib/ldtoa.c @@ -1,4 +1,3 @@ - /* Extended precision arithmetic functions for long double I/O. * This program has been placed in the public domain. */ @@ -244,7 +243,7 @@ static char *ermsg[7] = { * * Exception flags are NOT fully supported. * - * Define INFINITY in mconf.h for support of infinity; otherwise a + * Define USE_INFINITY in mconf.h for support of infinity; otherwise a * saturation arithmetic is implemented. * * Define NANS for support of Not-a-Number items; otherwise the @@ -381,12 +380,12 @@ typedef struct #define VOLATILE #define NANS -#define INFINITY +#define USE_INFINITY /* NaN's require infinity support. */ #ifdef NANS #ifndef INFINITY -#define INFINITY +#define USE_INFINITY #endif #endif @@ -544,7 +543,7 @@ static void einfin(register short unsigned int *x, register LDPARMS *ldp) { register int i; -#ifdef INFINITY +#ifdef USE_INFINITY for( i=0; i<NE-1; i++ ) *x++ = 0; *x |= 32767; @@ -596,7 +595,7 @@ else /* get the exponent */ *q = *p--; *q++ &= 0x7fff; /* delete the sign bit */ -#ifdef INFINITY +#ifdef USE_INFINITY if( (*(q-1) & 0x7fff) == 0x7fff ) { #ifdef NANS @@ -639,7 +638,7 @@ if( i ) *q-- = *p++ | 0x8000; else *q-- = *p++; -#ifdef INFINITY +#ifdef USE_INFINITY if( *(p-1) == 0x7fff ) { #ifdef NANS @@ -1173,7 +1172,7 @@ unsigned short r; j = enormlz( s ); /* a blank significand could mean either zero or infinity. */ -#ifndef INFINITY +#ifndef USE_INFINITY if( j > NBITS ) { ecleazs( s ); @@ -1181,7 +1180,7 @@ if( j > NBITS ) } #endif exp -= j; -#ifndef INFINITY +#ifndef USE_INFINITY if( exp >= 32767L ) goto overf; #else @@ -1329,10 +1328,10 @@ mdfin: s[NI-1] = 0; if( exp >= 32767L ) { -#ifndef INFINITY +#ifndef USE_INFINITY overf: #endif -#ifdef INFINITY +#ifdef USE_INFINITY s[1] = 32767; for( i=2; i<NI-1; i++ ) s[i] = 0; @@ -1405,7 +1404,7 @@ unsigned short ai[NI], bi[NI], ci[NI]; int i, lost, j, k; long lt, lta, ltb; -#ifdef INFINITY +#ifdef USE_INFINITY if( eisinf(a) ) { emov(a,c); @@ -1536,7 +1535,7 @@ if( ((ecmp(a,ezero) == 0) && (ecmp(b,ezero) == 0)) } #endif /* Infinity over anything else is infinity. */ -#ifdef INFINITY +#ifdef USE_INFINITY if( eisinf(b) ) { if( eisneg(a) ^ eisneg(b) ) @@ -1640,7 +1639,7 @@ if( (eisinf(a) && (ecmp(b,ezero) == 0)) } #endif /* Infinity times anything else is infinity. */ -#ifdef INFINITY +#ifdef USE_INFINITY if( eisinf(a) || eisinf(b) ) { if( eisneg(a) ^ eisneg(b) ) @@ -1719,7 +1718,7 @@ yy[0] = 0; if( r & 0x8000 ) yy[0] = 0xffff; r &= 0x7fff; -#ifdef INFINITY +#ifdef USE_INFINITY if( r == 0x7fff ) { #ifdef NANS @@ -1865,7 +1864,7 @@ if((yy[NE-1] & 0x7fff) == 0 && (yy[NE-2] & 0x8000) == 0) return; } #endif -#ifdef INFINITY +#ifdef USE_INFINITY /* Point to the exponent field. */ p = &yy[NE-1]; if( (*p & 0x7fff) == 0x7fff ) @@ -1900,7 +1899,7 @@ if( (*p & 0x7fff) == 0x7fff ) eneg(y); return; } -#endif /* INFINITY */ +#endif /* USE_INFINITY */ p = yy; q = y; for( i=0; i<NE; i++ ) @@ -1955,7 +1954,7 @@ else for( i=0; i<4; i++ ) *q++ = *p++; #else -#ifdef INFINITY +#ifdef USE_INFINITY #ifdef IBMPC if (eiisinf (a)) { @@ -1967,7 +1966,7 @@ if (eiisinf (a)) return; } #endif /* IBMPC */ -#endif /* INFINITY */ +#endif /* USE_INFINITY */ for( i=0; i<4; i++ ) *q-- = *p++; #endif @@ -2010,7 +2009,7 @@ if( r & 0x8000 ) yy[0] = 0xffff; yy[M] = (r & 0x0f) | 0x10; r &= ~0x800f; /* strip sign and 4 significand bits */ -#ifdef INFINITY +#ifdef USE_INFINITY if( r == 0x7ff0 ) { #ifdef NANS @@ -2120,7 +2119,7 @@ if( *p++ ) i = *p++; if( i >= (unsigned int )2047 ) { /* Saturate at largest number less than infinity. */ -#ifdef INFINITY +#ifdef USE_INFINITY *y |= 0x7ff0; #ifdef IBMPC *(--y) = 0; @@ -2132,7 +2131,7 @@ if( i >= (unsigned int )2047 ) *y++ = 0; *y++ = 0; #endif /* IBMPC */ -#else /* !INFINITY */ +#else /* !USE_INFINITY */ *y |= (unsigned short )0x7fef; #ifdef IBMPC *(--y) = 0xffff; @@ -2144,7 +2143,7 @@ if( i >= (unsigned int )2047 ) *y++ = 0xffff; *y++ = 0xffff; #endif -#endif /* !INFINITY */ +#endif /* !USE_INFINITY */ return; } if( i == 0 ) @@ -2202,7 +2201,7 @@ if( r & 0x8000 ) yy[0] = 0xffff; yy[M] = (r & 0x7f) | 0200; r &= ~0x807f; /* strip sign and 7 significand bits */ -#ifdef INFINITY +#ifdef USE_INFINITY if( r == 0x7f80 ) { #ifdef NANS @@ -2285,7 +2284,7 @@ if( *p++ ) i = *p++; if( i >= 255 ) { /* Saturate at largest number less than infinity. */ -#ifdef INFINITY +#ifdef USE_INFINITY *y |= (unsigned short )0x7f80; #ifdef IBMPC *(--y) = 0; @@ -2297,7 +2296,7 @@ if( i >= 255 ) ++y; *y = 0; #endif -#else /* !INFINITY */ +#else /* !USE_INFINITY */ *y |= (unsigned short )0x7f7f; #ifdef IBMPC *(--y) = 0xffff; @@ -2309,7 +2308,7 @@ if( i >= 255 ) ++y; *y = 0xffff; #endif -#endif /* !INFINITY */ +#endif /* !USE_INFINITY */ return; } if( i == 0 ) @@ -3743,7 +3742,3 @@ switch( size ) for (i=0; i < n; i++) *nan++ = *p++; } - - - - |