From 6ddf8bef40f93669cbff7df85f22318bfbfcdaa0 Mon Sep 17 00:00:00 2001 From: Jeff Johnston Date: Fri, 31 Aug 2007 21:21:27 +0000 Subject: [PATCH] 2007-08-31 Antony King * libc/stdlib/mprec.h [_DOUBLE_IS_32BITS}: Define IEEE_Arith bits and redefine associated dword0 macro (rvalue issue). * libc/stdio/vfieeefp.h: Ditto. * libc/stdlib/strtod.c: Add checks for _DOUBLE_IS_32BITS to prevent setting dword1 which is an rvalue only. --- newlib/ChangeLog | 8 ++++++++ newlib/libc/stdio/vfieeefp.h | 4 +--- newlib/libc/stdlib/mprec.h | 14 +++++--------- newlib/libc/stdlib/strtod.c | 12 +++++++++++- 4 files changed, 25 insertions(+), 13 deletions(-) diff --git a/newlib/ChangeLog b/newlib/ChangeLog index 4913089e7..cac330ce0 100644 --- a/newlib/ChangeLog +++ b/newlib/ChangeLog @@ -1,3 +1,11 @@ +2007-08-31 Antony King + + * libc/stdlib/mprec.h [_DOUBLE_IS_32BITS}: Define IEEE_Arith + bits and redefine associated dword0 macro (rvalue issue). + * libc/stdio/vfieeefp.h: Ditto. + * libc/stdlib/strtod.c: Add checks for _DOUBLE_IS_32BITS + to prevent setting dword1 which is an rvalue only. + 2007-08-28 Hans Kester * configure.host: Added support for x86_64. diff --git a/newlib/libc/stdio/vfieeefp.h b/newlib/libc/stdio/vfieeefp.h index 3691ffe73..c13f9e8dc 100644 --- a/newlib/libc/stdio/vfieeefp.h +++ b/newlib/libc/stdio/vfieeefp.h @@ -170,9 +170,7 @@ union double_union #define Exp_mask ((__uint32_t)0x7f800000L) #define P 24 #define Bias 127 -#if 0 -#define IEEE_Arith /* it is, but the code doesn't handle IEEE singles yet */ -#endif +#define IEEE_Arith #define Emin (-126) #define Exp_1 ((__uint32_t)0x3f800000L) #define Exp_11 ((__uint32_t)0x3f800000L) diff --git a/newlib/libc/stdlib/mprec.h b/newlib/libc/stdlib/mprec.h index 8c9ad0ef0..498de5b74 100644 --- a/newlib/libc/stdlib/mprec.h +++ b/newlib/libc/stdlib/mprec.h @@ -139,15 +139,7 @@ typedef union { double d; __ULong L[2]; } U; #define P 24 #define Bias 127 #define NO_HEX_FP /* not supported in this case */ -#if 0 -#define IEEE_Arith /* it is, but the code doesn't handle IEEE singles yet */ -#endif -/* Following is needed due to IEEE_Arith not being set on above. */ -#if defined(__v800) -#define n_bigtens 2 -#else -#define n_bigtens 5 -#endif +#define IEEE_Arith #define Emin (-126) #define Exp_1 ((__uint32_t)0x3f800000L) #define Exp_11 ((__uint32_t)0x3f800000L) @@ -175,7 +167,11 @@ typedef union { double d; __ULong L[2]; } U; #define word0(x) (x.i[0]) #define word1(x) 0 +#ifdef YES_ALIAS #define dword0(x) ((__ULong *)&x)[0] +#else +#define dword0(x) ((U*)&x)->L[0] +#endif #define dword1(x) 0 #else diff --git a/newlib/libc/stdlib/strtod.c b/newlib/libc/stdlib/strtod.c index 6323f0b74..e206d0587 100644 --- a/newlib/libc/stdlib/strtod.c +++ b/newlib/libc/stdlib/strtod.c @@ -386,7 +386,9 @@ _DEFUN (_strtod_r, (ptr, s00, se), if (!match(&s,"inity")) ++s; dword0(rv) = 0x7ff00000; +#ifndef _DOUBLE_IS_32BITS dword1(rv) = 0; +#endif /*!_DOUBLE_IS_32BITS*/ goto ret; } break; @@ -398,12 +400,16 @@ _DEFUN (_strtod_r, (ptr, s00, se), && hexnan(&s, &fpinan, bits) == STRTOG_NaNbits) { dword0(rv) = 0x7ff00000 | bits[1]; +#ifndef _DOUBLE_IS_32BITS dword1(rv) = bits[0]; +#endif /*!_DOUBLE_IS_32BITS*/ } else { #endif dword0(rv) = NAN_WORD0; +#ifndef _DOUBLE_IS_32BITS dword1(rv) = NAN_WORD1; +#endif /*!_DOUBLE_IS_32BITS*/ #ifndef No_Hex_NaN } #endif @@ -627,8 +633,8 @@ _DEFUN (_strtod_r, (ptr, s00, se), #ifndef _DOUBLE_IS_32BITS else dword1(rv) &= 0xffffffff << j; - } #endif /*!_DOUBLE_IS_32BITS*/ + } #else for(j = 0; e1 > 1; j++, e1 >>= 1) if (e1 & 1) @@ -1109,7 +1115,9 @@ _DEFUN (_strtod_r, (ptr, s00, se), if (inexact) { if (!oldinexact) { dword0(rv0) = Exp_1 + (70 << Exp_shift); +#ifndef _DOUBLE_IS_32BITS dword1(rv0) = 0; +#endif /*!_DOUBLE_IS_32BITS*/ dval(rv0) += 1.; } } @@ -1119,7 +1127,9 @@ _DEFUN (_strtod_r, (ptr, s00, se), #ifdef Avoid_Underflow if (scale) { dword0(rv0) = Exp_1 - 2*P*Exp_msk1; +#ifndef _DOUBLE_IS_32BITS dword1(rv0) = 0; +#endif /*!_DOUBLE_IS_32BITS*/ dval(rv) *= dval(rv0); #ifndef NO_ERRNO /* try to avoid the bug of testing an 8087 register value */