Merge branch 'vendor/GDTOA'
authorPeter Avalos <pavalos@dragonflybsd.org>
Wed, 27 Apr 2011 23:51:21 +0000 (13:51 -1000)
committerPeter Avalos <pavalos@dragonflybsd.org>
Wed, 27 Apr 2011 23:51:21 +0000 (13:51 -1000)
1  2 
contrib/gdtoa/gdtoaimp.h

diff --combined contrib/gdtoa/gdtoaimp.h
@@@ -89,12 -89,18 +89,18 @@@ THIS SOFTWARE
   * #define IBM for IBM mainframe-style floating-point arithmetic.
   * #define VAX for VAX-style floating-point arithmetic (D_floating).
   * #define No_leftright to omit left-right logic in fast floating-point
-  *    computation of dtoa.
+  *    computation of dtoa and gdtoa.  This will cause modes 4 and 5 to be
+  *    treated the same as modes 2 and 3 for some inputs.
   * #define Check_FLT_ROUNDS if FLT_ROUNDS can assume the values 2 or 3.
   * #define RND_PRODQUOT to use rnd_prod and rnd_quot (assembly routines
   *    that use extended-precision instructions to compute rounded
   *    products and quotients) with IBM.
-  * #define ROUND_BIASED for IEEE-format with biased rounding.
+  * #define ROUND_BIASED for IEEE-format with biased rounding and arithmetic
+  *    that rounds toward +Infinity.
+  * #define ROUND_BIASED_without_Round_Up for IEEE-format with biased
+  *    rounding when the underlying floating-point arithmetic uses
+  *    unbiased rounding.  This prevent using ordinary floating-point
+  *    arithmetic when the result could be computed with one rounding error.
   * #define Inaccurate_Divide for IEEE-format with correctly rounded
   *    products but inaccurate quotients, e.g., for Intel i860.
   * #define NO_LONG_LONG on machines that do not have a "long long"
  
  #ifndef GDTOAIMP_H_INCLUDED
  #define GDTOAIMP_H_INCLUDED
 +
 +#define       Long    int
 +
 +#define USE_LOCALE
 +#define Honor_FLT_ROUNDS
 +
  #include "gdtoa.h"
  #include "gd_qnan.h"
  #ifdef Honor_FLT_ROUNDS
  #define Bug(x) {fprintf(stderr, "%s\n", x); exit(1);}
  #endif
  
 +#include "limits.h"
  #include "stdlib.h"
  #include "string.h"
 +#include "libc_private.h"
 +
 +#include "namespace.h"
 +#include <pthread.h>
 +#include "un-namespace.h"
  
  #ifdef KR_headers
  #define Char char
@@@ -403,6 -397,11 +409,11 @@@ typedef union { double d; ULong L[2]; 
  
  #ifndef IEEE_Arith
  #define ROUND_BIASED
+ #else
+ #ifdef ROUND_BIASED_without_Round_Up
+ #undef  ROUND_BIASED
+ #define ROUND_BIASED
+ #endif
  #endif
  
  #ifdef RND_PRODQUOT
@@@ -458,16 -457,10 +469,16 @@@ extern double rnd_prod(double, double)
  #define ALL_ON 0xffff
  #endif
  
 -#ifndef MULTIPLE_THREADS
 -#define ACQUIRE_DTOA_LOCK(n)  /*nothing*/
 -#define FREE_DTOA_LOCK(n)     /*nothing*/
 -#endif
 +#define MULTIPLE_THREADS
 +extern pthread_mutex_t __gdtoa_locks[2];
 +#define ACQUIRE_DTOA_LOCK(n)  do {                            \
 +      if (__isthreaded)                                       \
 +              _pthread_mutex_lock(&__gdtoa_locks[n]);         \
 +} while(0)
 +#define FREE_DTOA_LOCK(n)     do {                            \
 +      if (__isthreaded)                                       \
 +              _pthread_mutex_unlock(&__gdtoa_locks[n]);       \
 +} while(0)
  
  #define Kmax 9
  
@@@ -490,89 -483,51 +501,89 @@@ extern void memcpy_D2A ANSI((void*, con
  #define Bcopy(x,y) memcpy(&x->sign,&y->sign,y->wds*sizeof(ULong) + 2*sizeof(int))
  #endif /* NO_STRING_H */
  
 -#define Balloc Balloc_D2A
 -#define Bfree Bfree_D2A
 -#define ULtoQ ULtoQ_D2A
 -#define ULtof ULtof_D2A
 -#define ULtod ULtod_D2A
 -#define ULtodd ULtodd_D2A
 -#define ULtox ULtox_D2A
 -#define ULtoxL ULtoxL_D2A
 -#define any_on any_on_D2A
 -#define b2d b2d_D2A
 -#define bigtens bigtens_D2A
 -#define cmp cmp_D2A
 -#define copybits copybits_D2A
 -#define d2b d2b_D2A
 -#define decrement decrement_D2A
 -#define diff diff_D2A
 -#define dtoa_result dtoa_result_D2A
 -#define g__fmt g__fmt_D2A
 -#define gethex gethex_D2A
 -#define hexdig hexdig_D2A
 -#define hexnan hexnan_D2A
 -#define hi0bits(x) hi0bits_D2A((ULong)(x))
 -#define i2b i2b_D2A
 -#define increment increment_D2A
 -#define lo0bits lo0bits_D2A
 -#define lshift lshift_D2A
 -#define match match_D2A
 -#define mult mult_D2A
 -#define multadd multadd_D2A
 -#define nrv_alloc nrv_alloc_D2A
 -#define pow5mult pow5mult_D2A
 -#define quorem quorem_D2A
 -#define ratio ratio_D2A
 -#define rshift rshift_D2A
 -#define rv_alloc rv_alloc_D2A
 -#define s2b s2b_D2A
 -#define set_ones set_ones_D2A
 -#define strcp strcp_D2A
 -#define strtoIg strtoIg_D2A
 -#define sum sum_D2A
 -#define tens tens_D2A
 -#define tinytens tinytens_D2A
 -#define tinytens tinytens_D2A
 -#define trailz trailz_D2A
 -#define ulp ulp_D2A
 +/*
 + * Paranoia: Protect exported symbols, including ones in files we don't
 + * compile right now.  The standard strtof and strtod survive.
 + */
 +#define       dtoa            __dtoa
 +#define       gdtoa           __gdtoa
 +#define       freedtoa        __freedtoa
 +#define       strtodg         __strtodg
 +#define       g_ddfmt         __g_ddfmt
 +#define       g_dfmt          __g_dfmt
 +#define       g_ffmt          __g_ffmt
 +#define       g_Qfmt          __g_Qfmt
 +#define       g_xfmt          __g_xfmt
 +#define       g_xLfmt         __g_xLfmt
 +#define       strtoId         __strtoId
 +#define       strtoIdd        __strtoIdd
 +#define       strtoIf         __strtoIf
 +#define       strtoIQ         __strtoIQ
 +#define       strtoIx         __strtoIx
 +#define       strtoIxL        __strtoIxL
 +#define       strtord         __strtord
 +#define       strtordd        __strtordd
 +#define       strtorf         __strtorf
 +#define       strtorQ         __strtorQ
 +#define       strtorx         __strtorx
 +#define       strtorxL        __strtorxL
 +#define       strtodI         __strtodI
 +#define       strtopd         __strtopd
 +#define       strtopdd        __strtopdd
 +#define       strtopf         __strtopf
 +#define       strtopQ         __strtopQ
 +#define       strtopx         __strtopx
 +#define       strtopxL        __strtopxL
 +
 +/* Protect gdtoa-internal symbols */
 +#define       Balloc          __Balloc_D2A
 +#define       Bfree           __Bfree_D2A
 +#define       ULtoQ           __ULtoQ_D2A
 +#define       ULtof           __ULtof_D2A
 +#define       ULtod           __ULtod_D2A
 +#define       ULtodd          __ULtodd_D2A
 +#define       ULtox           __ULtox_D2A
 +#define       ULtoxL          __ULtoxL_D2A
 +#define       any_on          __any_on_D2A
 +#define       b2d             __b2d_D2A
 +#define       bigtens         __bigtens_D2A
 +#define       cmp             __cmp_D2A
 +#define       copybits        __copybits_D2A
 +#define       d2b             __d2b_D2A
 +#define       decrement       __decrement_D2A
 +#define       diff            __diff_D2A
 +#define       dtoa_result     __dtoa_result_D2A
 +#define       g__fmt          __g__fmt_D2A
 +#define       gethex          __gethex_D2A
 +#define       hexdig          __hexdig_D2A
 +#define       hexdig_init_D2A __hexdig_init_D2A
 +#define       hexnan          __hexnan_D2A
 +#define       hi0bits(x)      __hi0bits_D2A((ULong)(x))
 +#define       hi0bits_D2A     __hi0bits_D2A
 +#define       i2b             __i2b_D2A
 +#define       increment       __increment_D2A
 +#define       lo0bits         __lo0bits_D2A
 +#define       lshift          __lshift_D2A
 +#define       match           __match_D2A
 +#define       mult            __mult_D2A
 +#define       multadd         __multadd_D2A
 +#define       nrv_alloc       __nrv_alloc_D2A
 +#define       pow5mult        __pow5mult_D2A
 +#define       quorem          __quorem_D2A
 +#define       ratio           __ratio_D2A
 +#define       rshift          __rshift_D2A
 +#define       rv_alloc        __rv_alloc_D2A
 +#define       s2b             __s2b_D2A
 +#define       set_ones        __set_ones_D2A
 +#define       strcp           __strcp_D2A
 +#define       strcp_D2A       __strcp_D2A
 +#define       strtoIg         __strtoIg_D2A
 +#define       sum             __sum_D2A
 +#define       tens            __tens_D2A
 +#define       tinytens        __tinytens_D2A
 +#define       tinytens        __tinytens_D2A
 +#define       trailz          __trailz_D2A
 +#define       ulp             __ulp_D2A
  
   extern char *dtoa_result;
   extern CONST double bigtens[], tens[], tinytens[];
   extern Bigint *diff ANSI((Bigint*, Bigint*));
   extern char *dtoa ANSI((double d, int mode, int ndigits,
                        int *decpt, int *sign, char **rve));
 + extern void freedtoa ANSI((char*));
   extern char *g__fmt ANSI((char*, char*, char*, int, ULong, size_t));
 + extern char *gdtoa ANSI((FPI *fpi, int be, ULong *bits, int *kindp,
 +                        int mode, int ndigits, int *decpt, char **rve));
   extern int gethex ANSI((CONST char**, FPI*, Long*, Bigint**, int));
   extern void hexdig_init_D2A(Void);
   extern int hexnan ANSI((CONST char**, FPI*, ULong*));
   extern Bigint *s2b ANSI((CONST char*, int, int, ULong, int));
   extern Bigint *set_ones ANSI((Bigint*, int));
   extern char *strcp ANSI((char*, const char*));
 + extern int strtodg ANSI((CONST char*, char**, FPI*, Long*, ULong*));
 +
 + extern int strtoId ANSI((CONST char *, char **, double *, double *));
 + extern int strtoIdd ANSI((CONST char *, char **, double *, double *));
 + extern int strtoIf ANSI((CONST char *, char **, float *, float *));
   extern int strtoIg ANSI((CONST char*, char**, FPI*, Long*, Bigint**, int*));
 + extern int strtoIQ ANSI((CONST char *, char **, void *, void *));
 + extern int strtoIx ANSI((CONST char *, char **, void *, void *));
 + extern int strtoIxL ANSI((CONST char *, char **, void *, void *));
   extern double strtod ANSI((const char *s00, char **se));
 + extern int strtopQ ANSI((CONST char *, char **, Void *));
 + extern int strtopf ANSI((CONST char *, char **, float *));
 + extern int strtopd ANSI((CONST char *, char **, double *));
 + extern int strtopdd ANSI((CONST char *, char **, double *));
 + extern int strtopx ANSI((CONST char *, char **, Void *));
 + extern int strtopxL ANSI((CONST char *, char **, Void *));
 + extern int strtord ANSI((CONST char *, char **, int, double *));
 + extern int strtordd ANSI((CONST char *, char **, int, double *));
 + extern int strtorf ANSI((CONST char *, char **, int, float *));
 + extern int strtorQ ANSI((CONST char *, char **, int, void *));
 + extern int strtorx ANSI((CONST char *, char **, int, void *));
 + extern int strtorxL ANSI((CONST char *, char **, int, void *));
   extern Bigint *sum ANSI((Bigint*, Bigint*));
   extern int trailz ANSI((Bigint*));
   extern double ulp ANSI((U*));