100db7afdSDavid E. O'Brien /* Configuration data for libmath subpart of libstdc++. */
200db7afdSDavid E. O'Brien 
300db7afdSDavid E. O'Brien /* Copyright (C) 1997-1999, 2000, 2001 Free Software Foundation, Inc.
400db7afdSDavid E. O'Brien 
500db7afdSDavid E. O'Brien    This file is part of the GNU ISO C++ Library.  This library is free
600db7afdSDavid E. O'Brien    software; you can redistribute it and/or modify it under the
700db7afdSDavid E. O'Brien    terms of the GNU General Public License as published by the
800db7afdSDavid E. O'Brien    Free Software Foundation; either version 2, or (at your option)
900db7afdSDavid E. O'Brien    any later version.
1000db7afdSDavid E. O'Brien 
1100db7afdSDavid E. O'Brien    This library is distributed in the hope that it will be useful,
1200db7afdSDavid E. O'Brien    but WITHOUT ANY WARRANTY; without even the implied warranty of
1300db7afdSDavid E. O'Brien    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1400db7afdSDavid E. O'Brien    GNU General Public License for more details.
1500db7afdSDavid E. O'Brien 
1600db7afdSDavid E. O'Brien    You should have received a copy of the GNU General Public License along
1700db7afdSDavid E. O'Brien    with this library; see the file COPYING.  If not, write to the Free
18*f8a1b7d9SAlexander Kabaev    Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
1900db7afdSDavid E. O'Brien    USA.
2000db7afdSDavid E. O'Brien 
2100db7afdSDavid E. O'Brien    As a special exception, you may use this file as part of a free software
2200db7afdSDavid E. O'Brien    library without restriction.  Specifically, if other files instantiate
2300db7afdSDavid E. O'Brien    templates or use macros or inline functions from this file, or you compile
2400db7afdSDavid E. O'Brien    this file and link it with other files to produce an executable, this
2500db7afdSDavid E. O'Brien    file does not by itself cause the resulting executable to be covered by
2600db7afdSDavid E. O'Brien    the GNU General Public License.  This exception does not however
2700db7afdSDavid E. O'Brien    invalidate any other reasons why the executable file might be covered by
2800db7afdSDavid E. O'Brien    the GNU General Public License.  */
2900db7afdSDavid E. O'Brien 
3000db7afdSDavid E. O'Brien 
3100db7afdSDavid E. O'Brien #include <config.h>
3200db7afdSDavid E. O'Brien 
3300db7afdSDavid E. O'Brien #ifdef HAVE_ENDIAN_H
3400db7afdSDavid E. O'Brien # include <endian.h>
3500db7afdSDavid E. O'Brien #else
3600db7afdSDavid E. O'Brien # ifdef HAVE_MACHINE_ENDIAN_H
3700db7afdSDavid E. O'Brien #  ifdef HAVE_SYS_TYPES_H
3800db7afdSDavid E. O'Brien #   include <sys/types.h>
3900db7afdSDavid E. O'Brien #  endif
4000db7afdSDavid E. O'Brien #  include <machine/endian.h>
4100db7afdSDavid E. O'Brien # else
4200db7afdSDavid E. O'Brien #  ifdef HAVE_SYS_MACHINE_H
4300db7afdSDavid E. O'Brien #   include <sys/machine.h>
4400db7afdSDavid E. O'Brien #  else
4500db7afdSDavid E. O'Brien #   if defined HAVE_SYS_ISA_DEFS_H || defined HAVE_MACHINE_PARAM_H
4600db7afdSDavid E. O'Brien /* This is on Solaris.  */
4700db7afdSDavid E. O'Brien #    ifdef HAVE_SYS_ISA_DEFS_H
4800db7afdSDavid E. O'Brien #     include <sys/isa_defs.h>
4900db7afdSDavid E. O'Brien #    endif
5000db7afdSDavid E. O'Brien #    ifdef HAVE_MACHINE_PARAM_H
5100db7afdSDavid E. O'Brien #     include <machine/param.h>
5200db7afdSDavid E. O'Brien #    endif
5300db7afdSDavid E. O'Brien #    ifdef _LITTLE_ENDIAN
5400db7afdSDavid E. O'Brien #     define LITTLE_ENDIAN 1
5500db7afdSDavid E. O'Brien #    endif
5600db7afdSDavid E. O'Brien #    ifdef _BIG_ENDIAN
5700db7afdSDavid E. O'Brien #     define BIG_ENDIAN 1
5800db7afdSDavid E. O'Brien #    endif
5900db7afdSDavid E. O'Brien #    define BYTE_ORDER 1
6000db7afdSDavid E. O'Brien #   else
6100db7afdSDavid E. O'Brien /* We have to rely on the AC_C_BIGENDIAN test.  */
6200db7afdSDavid E. O'Brien #    ifdef WORDS_BIGENDIAN
6300db7afdSDavid E. O'Brien #     define BIG_ENDIAN 1
6400db7afdSDavid E. O'Brien #    else
6500db7afdSDavid E. O'Brien #     define LITTLE_ENDIAN 1
6600db7afdSDavid E. O'Brien #    endif
6700db7afdSDavid E. O'Brien #    define BYTE_ORDER 1
6800db7afdSDavid E. O'Brien #   endif
6900db7afdSDavid E. O'Brien #  endif
7000db7afdSDavid E. O'Brien # endif
7100db7afdSDavid E. O'Brien #endif
7200db7afdSDavid E. O'Brien 
7300db7afdSDavid E. O'Brien typedef unsigned int U_int32_t __attribute ((mode (SI)));
7400db7afdSDavid E. O'Brien typedef int Int32_t __attribute ((mode (SI)));
7500db7afdSDavid E. O'Brien typedef unsigned int U_int64_t __attribute ((mode (DI)));
7600db7afdSDavid E. O'Brien typedef int Int64_t __attribute ((mode (DI)));
7700db7afdSDavid E. O'Brien 
7800db7afdSDavid E. O'Brien #ifdef HAVE_NAN_H
7900db7afdSDavid E. O'Brien # include <nan.h>
8000db7afdSDavid E. O'Brien #endif
8100db7afdSDavid E. O'Brien 
8200db7afdSDavid E. O'Brien #ifdef HAVE_IEEEFP_H
8300db7afdSDavid E. O'Brien # include <ieeefp.h>
8400db7afdSDavid E. O'Brien #endif
8500db7afdSDavid E. O'Brien 
8600db7afdSDavid E. O'Brien #ifdef HAVE_FP_H
8700db7afdSDavid E. O'Brien # include <fp.h>
8800db7afdSDavid E. O'Brien #endif
8900db7afdSDavid E. O'Brien 
9000db7afdSDavid E. O'Brien #ifdef HAVE_FLOAT_H
9100db7afdSDavid E. O'Brien # include <float.h>
9200db7afdSDavid E. O'Brien #endif
9300db7afdSDavid E. O'Brien 
9400db7afdSDavid E. O'Brien /* `float' variant of HUGE_VAL.  */
9500db7afdSDavid E. O'Brien #ifndef HUGE_VALF
9600db7afdSDavid E. O'Brien # ifdef HUGE_VALf
9700db7afdSDavid E. O'Brien #  define HUGE_VALF HUGE_VALf
9800db7afdSDavid E. O'Brien # else
9900db7afdSDavid E. O'Brien #  define HUGE_VALF HUGE_VAL
10000db7afdSDavid E. O'Brien # endif
10100db7afdSDavid E. O'Brien #endif
10200db7afdSDavid E. O'Brien 
10300db7afdSDavid E. O'Brien /* `long double' variant of HUGE_VAL.  */
10400db7afdSDavid E. O'Brien #ifndef HUGE_VALL
10500db7afdSDavid E. O'Brien # ifdef HUGE_VALl
10600db7afdSDavid E. O'Brien #  define HUGE_VALL HUGE_VALl
10700db7afdSDavid E. O'Brien # else
10800db7afdSDavid E. O'Brien #  define HUGE_VALL HUGE_VAL
10900db7afdSDavid E. O'Brien # endif
11000db7afdSDavid E. O'Brien #endif
11100db7afdSDavid E. O'Brien 
11200db7afdSDavid E. O'Brien /* Make sure that at least HUGE_VAL is defined.  */
11300db7afdSDavid E. O'Brien #ifndef HUGE_VAL
11400db7afdSDavid E. O'Brien # ifdef HUGE
11500db7afdSDavid E. O'Brien #  define HUGE_VAL HUGE
11600db7afdSDavid E. O'Brien # else
11700db7afdSDavid E. O'Brien #  ifdef MAXFLOAT
11800db7afdSDavid E. O'Brien #   define HUGE_VAL MAXFLOAT
11900db7afdSDavid E. O'Brien #  else
12000db7afdSDavid E. O'Brien #   error "We need HUGE_VAL!"
12100db7afdSDavid E. O'Brien #  endif
12200db7afdSDavid E. O'Brien # endif
12300db7afdSDavid E. O'Brien #endif
12400db7afdSDavid E. O'Brien 
12500db7afdSDavid E. O'Brien #ifndef M_PI
12600db7afdSDavid E. O'Brien # define M_PI 3.14159265358979323846
12700db7afdSDavid E. O'Brien #endif
12800db7afdSDavid E. O'Brien 
12900db7afdSDavid E. O'Brien 
13000db7afdSDavid E. O'Brien #ifdef __cplusplus
13100db7afdSDavid E. O'Brien extern "C" {
13200db7afdSDavid E. O'Brien #endif
13300db7afdSDavid E. O'Brien 
13400db7afdSDavid E. O'Brien /* signbit is a macro in ISO C99.  */
13500db7afdSDavid E. O'Brien #ifndef signbit
13600db7afdSDavid E. O'Brien extern int __signbitf (float);
13700db7afdSDavid E. O'Brien extern int __signbit (double);
13800db7afdSDavid E. O'Brien extern int __signbitl (long double);
13900db7afdSDavid E. O'Brien 
14000db7afdSDavid E. O'Brien # define signbit(x) \
14100db7afdSDavid E. O'Brien      (sizeof (x) == sizeof (float) ?                                          \
14200db7afdSDavid E. O'Brien         __signbitf (x)                                                        \
14300db7afdSDavid E. O'Brien       : sizeof (x) == sizeof (double) ?                                       \
14400db7afdSDavid E. O'Brien         __signbit (x) : __signbitl (x))
14500db7afdSDavid E. O'Brien #endif
14600db7afdSDavid E. O'Brien 
14700db7afdSDavid E. O'Brien #if BYTE_ORDER == BIG_ENDIAN
14800db7afdSDavid E. O'Brien typedef union
14900db7afdSDavid E. O'Brien {
15000db7afdSDavid E. O'Brien   double value;
15100db7afdSDavid E. O'Brien   struct
15200db7afdSDavid E. O'Brien   {
15300db7afdSDavid E. O'Brien     U_int32_t msw;
15400db7afdSDavid E. O'Brien     U_int32_t lsw;
15500db7afdSDavid E. O'Brien   } parts;
15600db7afdSDavid E. O'Brien } ieee_double_shape_type;
15700db7afdSDavid E. O'Brien #endif
15800db7afdSDavid E. O'Brien #if BYTE_ORDER == LITTLE_ENDIAN
15900db7afdSDavid E. O'Brien typedef union
16000db7afdSDavid E. O'Brien {
16100db7afdSDavid E. O'Brien   double value;
16200db7afdSDavid E. O'Brien   struct
16300db7afdSDavid E. O'Brien   {
16400db7afdSDavid E. O'Brien     U_int32_t lsw;
16500db7afdSDavid E. O'Brien     U_int32_t msw;
16600db7afdSDavid E. O'Brien   } parts;
16700db7afdSDavid E. O'Brien } ieee_double_shape_type;
16800db7afdSDavid E. O'Brien #endif
16900db7afdSDavid E. O'Brien /* Get the more significant 32 bit int from a double.  */
17000db7afdSDavid E. O'Brien #define GET_HIGH_WORD(i,d)                                      \
17100db7afdSDavid E. O'Brien do {                                                            \
17200db7afdSDavid E. O'Brien   ieee_double_shape_type gh_u;                                  \
17300db7afdSDavid E. O'Brien   gh_u.value = (d);                                             \
17400db7afdSDavid E. O'Brien   (i) = gh_u.parts.msw;                                         \
17500db7afdSDavid E. O'Brien } while (0)
17600db7afdSDavid E. O'Brien 
17700db7afdSDavid E. O'Brien 
17800db7afdSDavid E. O'Brien typedef union
17900db7afdSDavid E. O'Brien {
18000db7afdSDavid E. O'Brien   float value;
18100db7afdSDavid E. O'Brien   U_int32_t word;
18200db7afdSDavid E. O'Brien } ieee_float_shape_type;
18300db7afdSDavid E. O'Brien /* Get a 32 bit int from a float.  */
18400db7afdSDavid E. O'Brien #define GET_FLOAT_WORD(i,d)                                     \
18500db7afdSDavid E. O'Brien do {                                                            \
18600db7afdSDavid E. O'Brien   ieee_float_shape_type gf_u;                                   \
18700db7afdSDavid E. O'Brien   gf_u.value = (d);                                             \
18800db7afdSDavid E. O'Brien   (i) = gf_u.word;                                              \
18900db7afdSDavid E. O'Brien } while (0)
19000db7afdSDavid E. O'Brien 
19100db7afdSDavid E. O'Brien 
19200db7afdSDavid E. O'Brien #if BYTE_ORDER == BIG_ENDIAN
19300db7afdSDavid E. O'Brien typedef union
19400db7afdSDavid E. O'Brien {
19500db7afdSDavid E. O'Brien   long double value;
19600db7afdSDavid E. O'Brien   struct
19700db7afdSDavid E. O'Brien   {
19800db7afdSDavid E. O'Brien     unsigned int sign_exponent:16;
19900db7afdSDavid E. O'Brien     unsigned int empty:16;
20000db7afdSDavid E. O'Brien     U_int32_t msw;
20100db7afdSDavid E. O'Brien     U_int32_t lsw;
20200db7afdSDavid E. O'Brien   } parts;
20300db7afdSDavid E. O'Brien } ieee_long_double_shape_type;
20400db7afdSDavid E. O'Brien #endif
20500db7afdSDavid E. O'Brien #if BYTE_ORDER == LITTLE_ENDIAN
20600db7afdSDavid E. O'Brien typedef union
20700db7afdSDavid E. O'Brien {
20800db7afdSDavid E. O'Brien   long double value;
20900db7afdSDavid E. O'Brien   struct
21000db7afdSDavid E. O'Brien   {
21100db7afdSDavid E. O'Brien     U_int32_t lsw;
21200db7afdSDavid E. O'Brien     U_int32_t msw;
21300db7afdSDavid E. O'Brien     unsigned int sign_exponent:16;
21400db7afdSDavid E. O'Brien     unsigned int empty:16;
21500db7afdSDavid E. O'Brien   } parts;
21600db7afdSDavid E. O'Brien } ieee_long_double_shape_type;
21700db7afdSDavid E. O'Brien #endif
21800db7afdSDavid E. O'Brien /* Get int from the exponent of a long double.  */
21900db7afdSDavid E. O'Brien #define GET_LDOUBLE_EXP(exp,d)                                  \
22000db7afdSDavid E. O'Brien do {                                                            \
22100db7afdSDavid E. O'Brien   ieee_long_double_shape_type ge_u;                             \
22200db7afdSDavid E. O'Brien   ge_u.value = (d);                                             \
22300db7afdSDavid E. O'Brien   (exp) = ge_u.parts.sign_exponent;                             \
22400db7afdSDavid E. O'Brien } while (0)
22500db7afdSDavid E. O'Brien 
22600db7afdSDavid E. O'Brien #if BYTE_ORDER == BIG_ENDIAN
22700db7afdSDavid E. O'Brien typedef union
22800db7afdSDavid E. O'Brien {
22900db7afdSDavid E. O'Brien   long double value;
23000db7afdSDavid E. O'Brien   struct
23100db7afdSDavid E. O'Brien   {
23200db7afdSDavid E. O'Brien     U_int64_t msw;
23300db7afdSDavid E. O'Brien     U_int64_t lsw;
23400db7afdSDavid E. O'Brien   } parts64;
23500db7afdSDavid E. O'Brien   struct
23600db7afdSDavid E. O'Brien   {
23700db7afdSDavid E. O'Brien     U_int32_t w0, w1, w2, w3;
23800db7afdSDavid E. O'Brien   } parts32;
23900db7afdSDavid E. O'Brien } ieee_quad_double_shape_type;
24000db7afdSDavid E. O'Brien #endif
24100db7afdSDavid E. O'Brien #if BYTE_ORDER == LITTLE_ENDIAN
24200db7afdSDavid E. O'Brien typedef union
24300db7afdSDavid E. O'Brien {
24400db7afdSDavid E. O'Brien   long double value;
24500db7afdSDavid E. O'Brien   struct
24600db7afdSDavid E. O'Brien   {
24700db7afdSDavid E. O'Brien     U_int64_t lsw;
24800db7afdSDavid E. O'Brien     U_int64_t msw;
24900db7afdSDavid E. O'Brien   } parts64;
25000db7afdSDavid E. O'Brien   struct
25100db7afdSDavid E. O'Brien   {
25200db7afdSDavid E. O'Brien     U_int32_t w3, w2, w1, w0;
25300db7afdSDavid E. O'Brien   } parts32;
25400db7afdSDavid E. O'Brien } ieee_quad_double_shape_type;
25500db7afdSDavid E. O'Brien #endif
25600db7afdSDavid E. O'Brien /* Get most significant 64 bit int from a quad long double.  */
25700db7afdSDavid E. O'Brien #define GET_LDOUBLE_MSW64(msw,d)				\
25800db7afdSDavid E. O'Brien do {								\
25900db7afdSDavid E. O'Brien   ieee_quad_double_shape_type qw_u;				\
26000db7afdSDavid E. O'Brien   qw_u.value = (d);						\
26100db7afdSDavid E. O'Brien   (msw) = qw_u.parts64.msw;					\
26200db7afdSDavid E. O'Brien } while (0)
26300db7afdSDavid E. O'Brien 
26400db7afdSDavid E. O'Brien 
26500db7afdSDavid E. O'Brien /* Replacement for non-existing float functions.  */
26600db7afdSDavid E. O'Brien #if !defined(HAVE_FABSF) && !defined(HAVE___BUILTIN_FABSF)
26700db7afdSDavid E. O'Brien # define fabsf(x) fabs (x)
26800db7afdSDavid E. O'Brien #endif
26900db7afdSDavid E. O'Brien #if !defined(HAVE_COSF) && !defined(HAVE___BUILTIN_COSF)
27000db7afdSDavid E. O'Brien # define cosf(x) cos (x)
27100db7afdSDavid E. O'Brien #endif
27200db7afdSDavid E. O'Brien #ifndef HAVE_COSHF
27300db7afdSDavid E. O'Brien # define coshf(x) cosh (x)
27400db7afdSDavid E. O'Brien #endif
27500db7afdSDavid E. O'Brien #ifndef HAVE_EXPF
27600db7afdSDavid E. O'Brien # define expf(x) expf (x)
27700db7afdSDavid E. O'Brien #endif
27800db7afdSDavid E. O'Brien #ifndef HAVE_LOGF
27900db7afdSDavid E. O'Brien # define logf(x) log(x)
28000db7afdSDavid E. O'Brien #endif
28100db7afdSDavid E. O'Brien #ifndef HAVE_LOG10F
28200db7afdSDavid E. O'Brien # define log10f(x) log10 (x)
28300db7afdSDavid E. O'Brien #endif
28400db7afdSDavid E. O'Brien #ifndef HAVE_POWF
28500db7afdSDavid E. O'Brien # define powf(x, y) pow (x, y)
28600db7afdSDavid E. O'Brien #endif
28700db7afdSDavid E. O'Brien #if !defined(HAVE_SINF) && !defined(HAVE___BUILTIN_SINF)
28800db7afdSDavid E. O'Brien # define sinf(x) sin (x)
28900db7afdSDavid E. O'Brien #endif
29000db7afdSDavid E. O'Brien #ifndef HAVE_SINHF
29100db7afdSDavid E. O'Brien # define sinhf(x) sinh (x)
29200db7afdSDavid E. O'Brien #endif
29300db7afdSDavid E. O'Brien #if !defined(HAVE_SQRTF) && !defined(HAVE___BUILTIN_SQRTF)
29400db7afdSDavid E. O'Brien # define sqrtf(x) sqrt (x)
29500db7afdSDavid E. O'Brien #endif
29600db7afdSDavid E. O'Brien #ifndef HAVE_TANF
29700db7afdSDavid E. O'Brien # define tanf(x) tan (x)
29800db7afdSDavid E. O'Brien #endif
29900db7afdSDavid E. O'Brien #ifndef HAVE_TANHF
30000db7afdSDavid E. O'Brien # define tanhf(x) tanh (x)
30100db7afdSDavid E. O'Brien #endif
30200db7afdSDavid E. O'Brien #ifndef HAVE_STRTOF
30300db7afdSDavid E. O'Brien # define strtof(s, e) strtod (s, e)
30400db7afdSDavid E. O'Brien #endif
30500db7afdSDavid E. O'Brien 
30600db7afdSDavid E. O'Brien #ifdef __cplusplus
30700db7afdSDavid E. O'Brien }
30800db7afdSDavid E. O'Brien #endif
30900db7afdSDavid E. O'Brien 
310