OSDN Git Service

2006-07-05 Jeff Johnston <jjohnstn@redhat.com>
authorjjohnstn <jjohnstn>
Wed, 5 Jul 2006 16:18:30 +0000 (16:18 +0000)
committerjjohnstn <jjohnstn>
Wed, 5 Jul 2006 16:18:30 +0000 (16:18 +0000)
        * libc/stdlib/mprec.h [_DOUBLE_IS_32BITS]: Turn off C99 hex
        floating-point format support.  Also redefine
        dword0 and dword1 macros.
        * libc/stdlib/strtod.c: Add checks for _DOUBLE_IS_32BITS
        to prevent setting dword1 which is an rvalue only.

newlib/ChangeLog
newlib/libc/stdlib/mprec.h
newlib/libc/stdlib/strtod.c

index dd4a336..f177d70 100644 (file)
@@ -1,3 +1,11 @@
+2006-07-05  Jeff Johnston  <jjohnstn@redhat.com>       
+
+       * libc/stdlib/mprec.h [_DOUBLE_IS_32BITS]: Turn off C99 hex 
+       floating-point format support.  Also redefine
+       dword0 and dword1 macros.
+       * libc/stdlib/strtod.c: Add checks for _DOUBLE_IS_32BITS
+       to prevent setting dword1 which is an rvalue only.
+
 2006-06-22  Jeff Johnston  <jjohnstn@redhat.com>       
 
        * libc/stdlib/Makefile.am: Add new gdtoa routines.
index 4fd4968..ba4d2b8 100644 (file)
@@ -138,9 +138,16 @@ typedef union { double d; __ULong L[2]; } U;
 #define Exp_mask    ((__uint32_t)0x7f800000L)
 #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 Emin        (-126)
 #define Exp_1       ((__uint32_t)0x3f800000L)
 #define Exp_11      ((__uint32_t)0x3f800000L)
@@ -163,9 +170,13 @@ typedef union { double d; __ULong L[2]; } U;
 #define Infinite(x) (word0(x) == ((__uint32_t)0x7f800000L))
 #undef word0
 #undef word1
+#undef dword0
+#undef dword1
 
 #define word0(x) (x.i[0])
 #define word1(x) 0
+#define dword0(x) ((__ULong *)&x)[0]
+#define dword1(x) 0
 #else
 
 #define Exp_shift  20
@@ -195,6 +206,8 @@ typedef union { double d; __ULong L[2]; } U;
 #define Int_max 14
 #define Infinite(x) (word0(x) == ((__uint32_t)0x7ff00000L)) /* sufficient test for here */
 
+#endif /* !_DOUBLE_IS_32BITS */
+
 #ifndef Flt_Rounds
 #ifdef FLT_ROUNDS
 #define Flt_Rounds FLT_ROUNDS
@@ -203,9 +216,7 @@ typedef union { double d; __ULong L[2]; } U;
 #endif
 #endif /*Flt_Rounds*/
 
-#endif
-
-#else
+#else /* !IEEE_8087 && !IEEE_MC68k */
 #undef  Sudden_Underflow
 #define Sudden_Underflow
 #ifdef IBM
index 57297e0..6323f0b 100644 (file)
@@ -137,6 +137,8 @@ static _CONST double tinytens[] = { 1e-16, 1e-32, 1e-64, 1e-128,
 #define Rounding Flt_Rounds
 #endif
 
+#ifndef NO_HEX_FP
+
 static void
 _DEFUN (ULtod, (L, bits, exp, k),
        __ULong *L _AND
@@ -173,7 +175,8 @@ _DEFUN (ULtod, (L, bits, exp, k),
        if (k & STRTOG_Neg)
                L[_0] |= 0x80000000L;
 }
-
+#endif /* !NO_HEX_FP */
 #ifdef INFNAN_CHECK
 static int
 _DEFUN (match, (sp, t),
@@ -543,15 +546,21 @@ _DEFUN (_strtod_r, (ptr, s00, se),
                                  case 0: /* toward 0 */
                                  case 3: /* toward -infinity */
                                        dword0(rv) = Big0;
+#ifndef _DOUBLE_IS_32BITS
                                        dword1(rv) = Big1;
+#endif /*!_DOUBLE_IS_32BITS*/
                                        break;
                                  default:
                                        dword0(rv) = Exp_mask;
+#ifndef _DOUBLE_IS_32BITS
                                        dword1(rv) = 0;
+#endif /*!_DOUBLE_IS_32BITS*/
                                  }
 #else /*Honor_FLT_ROUNDS*/
                                dword0(rv) = Exp_mask;
+#ifndef _DOUBLE_IS_32BITS
                                dword1(rv) = 0;
+#endif /*!_DOUBLE_IS_32BITS*/
 #endif /*Honor_FLT_ROUNDS*/
 #ifdef SET_INEXACT
                                /* set overflow bit */
@@ -560,7 +569,9 @@ _DEFUN (_strtod_r, (ptr, s00, se),
 #endif
 #else /*IEEE_Arith*/
                                dword0(rv) = Big0;
+#ifndef _DOUBLE_IS_32BITS
                                dword1(rv) = Big1;
+#endif /*!_DOUBLE_IS_32BITS*/
 #endif /*IEEE_Arith*/
                                if (bd0)
                                        goto retfree;
@@ -580,7 +591,9 @@ _DEFUN (_strtod_r, (ptr, s00, se),
                                /* set to largest number */
                                /* (Can't trust DBL_MAX) */
                                dword0(rv) = Big0;
+#ifndef _DOUBLE_IS_32BITS
                                dword1(rv) = Big1;
+#endif /*!_DOUBLE_IS_32BITS*/
                                }
                        else
                                dword0(rv) += P*Exp_msk1;
@@ -603,15 +616,19 @@ _DEFUN (_strtod_r, (ptr, s00, se),
                                                >> Exp_shift)) > 0) {
                                /* scaled rv is denormal; zap j low bits */
                                if (j >= 32) {
+#ifndef _DOUBLE_IS_32BITS
                                        dword1(rv) = 0;
+#endif /*!_DOUBLE_IS_32BITS*/
                                        if (j >= 53)
                                         dword0(rv) = (P+2)*Exp_msk1;
                                        else
                                         dword0(rv) &= 0xffffffff << (j-32);
                                        }
+#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)
@@ -634,8 +651,12 @@ _DEFUN (_strtod_r, (ptr, s00, se),
                                        goto ret;
                                        }
 #ifndef Avoid_Underflow
+#ifndef _DOUBLE_IS_32BITS
                                dword0(rv) = Tiny0;
                                dword1(rv) = Tiny1;
+#else
+                               dword0(rv) = Tiny1;
+#endif /*_DOUBLE_IS_32BITS*/
                                /* The refinement below will clean
                                 * this approximation up.
                                 */
@@ -866,7 +887,9 @@ _DEFUN (_strtod_r, (ptr, s00, se),
                                                | Exp_msk1 >> 4
 #endif
                                                ;
+#ifndef _DOUBLE_IS_32BITS
                                        dword1(rv) = 0;
+#endif /*!_DOUBLE_IS_32BITS*/
 #ifdef Avoid_Underflow
                                        dsign = 0;
 #endif
@@ -906,7 +929,9 @@ _DEFUN (_strtod_r, (ptr, s00, se),
                                L = (dword0(rv) & Exp_mask) - Exp_msk1;
 #endif /*Sudden_Underflow}*/
                                dword0(rv) = L | Bndry_mask1;
+#ifndef _DOUBLE_IS_32BITS
                                dword1(rv) = 0xffffffff;
+#endif /*!_DOUBLE_IS_32BITS*/
 #ifdef IBM
                                goto cont;
 #else
@@ -986,7 +1011,9 @@ _DEFUN (_strtod_r, (ptr, s00, se),
                                if (dword0(rv0) == Big0 && dword1(rv0) == Big1)
                                        goto ovfl;
                                dword0(rv) = Big0;
+#ifndef _DOUBLE_IS_32BITS
                                dword1(rv) = Big1;
+#endif /*!_DOUBLE_IS_32BITS*/
                                goto cont;
                                }
                        else
@@ -1021,8 +1048,12 @@ _DEFUN (_strtod_r, (ptr, s00, se),
                                        if (dword0(rv0) == Tiny0
                                         && dword1(rv0) == Tiny1)
                                                goto undfl;
+#ifndef _DOUBLE_IS_32BITS
                                        dword0(rv) = Tiny0;
                                        dword1(rv) = Tiny1;
+#else
+                                       dword0(rv) = Tiny1;
+#endif /*_DOUBLE_IS_32BITS*/
                                        goto cont;
                                        }
                                else