197403Sobrien/* Configuration data for libmath subpart of libstdc++. */
297403Sobrien
397403Sobrien/* Copyright (C) 1997-1999, 2000, 2001 Free Software Foundation, Inc.
497403Sobrien
597403Sobrien   This file is part of the GNU ISO C++ Library.  This library is free
697403Sobrien   software; you can redistribute it and/or modify it under the
797403Sobrien   terms of the GNU General Public License as published by the
897403Sobrien   Free Software Foundation; either version 2, or (at your option)
997403Sobrien   any later version.
1097403Sobrien
1197403Sobrien   This library is distributed in the hope that it will be useful,
1297403Sobrien   but WITHOUT ANY WARRANTY; without even the implied warranty of
1397403Sobrien   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1497403Sobrien   GNU General Public License for more details.
1597403Sobrien
1697403Sobrien   You should have received a copy of the GNU General Public License along
1797403Sobrien   with this library; see the file COPYING.  If not, write to the Free
18169691Skan   Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
1997403Sobrien   USA.
2097403Sobrien
2197403Sobrien   As a special exception, you may use this file as part of a free software
2297403Sobrien   library without restriction.  Specifically, if other files instantiate
2397403Sobrien   templates or use macros or inline functions from this file, or you compile
2497403Sobrien   this file and link it with other files to produce an executable, this
2597403Sobrien   file does not by itself cause the resulting executable to be covered by
2697403Sobrien   the GNU General Public License.  This exception does not however
2797403Sobrien   invalidate any other reasons why the executable file might be covered by
2897403Sobrien   the GNU General Public License.  */
2997403Sobrien
3097403Sobrien
3197403Sobrien#include <config.h>
3297403Sobrien
3397403Sobrien#ifdef HAVE_ENDIAN_H
3497403Sobrien# include <endian.h>
3597403Sobrien#else
3697403Sobrien# ifdef HAVE_MACHINE_ENDIAN_H
3797403Sobrien#  ifdef HAVE_SYS_TYPES_H
3897403Sobrien#   include <sys/types.h>
3997403Sobrien#  endif
4097403Sobrien#  include <machine/endian.h>
4197403Sobrien# else
4297403Sobrien#  ifdef HAVE_SYS_MACHINE_H
4397403Sobrien#   include <sys/machine.h>
4497403Sobrien#  else
4597403Sobrien#   if defined HAVE_SYS_ISA_DEFS_H || defined HAVE_MACHINE_PARAM_H
4697403Sobrien/* This is on Solaris.  */
4797403Sobrien#    ifdef HAVE_SYS_ISA_DEFS_H
4897403Sobrien#     include <sys/isa_defs.h>
4997403Sobrien#    endif
5097403Sobrien#    ifdef HAVE_MACHINE_PARAM_H
5197403Sobrien#     include <machine/param.h>
5297403Sobrien#    endif
5397403Sobrien#    ifdef _LITTLE_ENDIAN
5497403Sobrien#     define LITTLE_ENDIAN 1
5597403Sobrien#    endif
5697403Sobrien#    ifdef _BIG_ENDIAN
5797403Sobrien#     define BIG_ENDIAN 1
5897403Sobrien#    endif
5997403Sobrien#    define BYTE_ORDER 1
6097403Sobrien#   else
6197403Sobrien/* We have to rely on the AC_C_BIGENDIAN test.  */
6297403Sobrien#    ifdef WORDS_BIGENDIAN
6397403Sobrien#     define BIG_ENDIAN 1
6497403Sobrien#    else
6597403Sobrien#     define LITTLE_ENDIAN 1
6697403Sobrien#    endif
6797403Sobrien#    define BYTE_ORDER 1
6897403Sobrien#   endif
6997403Sobrien#  endif
7097403Sobrien# endif
7197403Sobrien#endif
7297403Sobrien
7397403Sobrientypedef unsigned int U_int32_t __attribute ((mode (SI)));
7497403Sobrientypedef int Int32_t __attribute ((mode (SI)));
7597403Sobrientypedef unsigned int U_int64_t __attribute ((mode (DI)));
7697403Sobrientypedef int Int64_t __attribute ((mode (DI)));
7797403Sobrien
7897403Sobrien#ifdef HAVE_NAN_H
7997403Sobrien# include <nan.h>
8097403Sobrien#endif
8197403Sobrien
8297403Sobrien#ifdef HAVE_IEEEFP_H
8397403Sobrien# include <ieeefp.h>
8497403Sobrien#endif
8597403Sobrien
8697403Sobrien#ifdef HAVE_FP_H
8797403Sobrien# include <fp.h>
8897403Sobrien#endif
8997403Sobrien
9097403Sobrien#ifdef HAVE_FLOAT_H
9197403Sobrien# include <float.h>
9297403Sobrien#endif
9397403Sobrien
9497403Sobrien/* `float' variant of HUGE_VAL.  */
9597403Sobrien#ifndef HUGE_VALF
9697403Sobrien# ifdef HUGE_VALf
9797403Sobrien#  define HUGE_VALF HUGE_VALf
9897403Sobrien# else
9997403Sobrien#  define HUGE_VALF HUGE_VAL
10097403Sobrien# endif
10197403Sobrien#endif
10297403Sobrien
10397403Sobrien/* `long double' variant of HUGE_VAL.  */
10497403Sobrien#ifndef HUGE_VALL
10597403Sobrien# ifdef HUGE_VALl
10697403Sobrien#  define HUGE_VALL HUGE_VALl
10797403Sobrien# else
10897403Sobrien#  define HUGE_VALL HUGE_VAL
10997403Sobrien# endif
11097403Sobrien#endif
11197403Sobrien
11297403Sobrien/* Make sure that at least HUGE_VAL is defined.  */
11397403Sobrien#ifndef HUGE_VAL
11497403Sobrien# ifdef HUGE
11597403Sobrien#  define HUGE_VAL HUGE
11697403Sobrien# else
11797403Sobrien#  ifdef MAXFLOAT
11897403Sobrien#   define HUGE_VAL MAXFLOAT
11997403Sobrien#  else
12097403Sobrien#   error "We need HUGE_VAL!"
12197403Sobrien#  endif
12297403Sobrien# endif
12397403Sobrien#endif
12497403Sobrien
12597403Sobrien#ifndef M_PI
12697403Sobrien# define M_PI 3.14159265358979323846
12797403Sobrien#endif
12897403Sobrien
12997403Sobrien
13097403Sobrien#ifdef __cplusplus
13197403Sobrienextern "C" {
13297403Sobrien#endif
13397403Sobrien
13497403Sobrien/* signbit is a macro in ISO C99.  */
13597403Sobrien#ifndef signbit
13697403Sobrienextern int __signbitf (float);
13797403Sobrienextern int __signbit (double);
13897403Sobrienextern int __signbitl (long double);
13997403Sobrien
14097403Sobrien# define signbit(x) \
14197403Sobrien     (sizeof (x) == sizeof (float) ?                                          \
14297403Sobrien        __signbitf (x)                                                        \
14397403Sobrien      : sizeof (x) == sizeof (double) ?                                       \
14497403Sobrien        __signbit (x) : __signbitl (x))
14597403Sobrien#endif
14697403Sobrien
14797403Sobrien#if BYTE_ORDER == BIG_ENDIAN
14897403Sobrientypedef union
14997403Sobrien{
15097403Sobrien  double value;
15197403Sobrien  struct
15297403Sobrien  {
15397403Sobrien    U_int32_t msw;
15497403Sobrien    U_int32_t lsw;
15597403Sobrien  } parts;
15697403Sobrien} ieee_double_shape_type;
15797403Sobrien#endif
15897403Sobrien#if BYTE_ORDER == LITTLE_ENDIAN
15997403Sobrientypedef union
16097403Sobrien{
16197403Sobrien  double value;
16297403Sobrien  struct
16397403Sobrien  {
16497403Sobrien    U_int32_t lsw;
16597403Sobrien    U_int32_t msw;
16697403Sobrien  } parts;
16797403Sobrien} ieee_double_shape_type;
16897403Sobrien#endif
16997403Sobrien/* Get the more significant 32 bit int from a double.  */
17097403Sobrien#define GET_HIGH_WORD(i,d)                                      \
17197403Sobriendo {                                                            \
17297403Sobrien  ieee_double_shape_type gh_u;                                  \
17397403Sobrien  gh_u.value = (d);                                             \
17497403Sobrien  (i) = gh_u.parts.msw;                                         \
17597403Sobrien} while (0)
17697403Sobrien
17797403Sobrien
17897403Sobrientypedef union
17997403Sobrien{
18097403Sobrien  float value;
18197403Sobrien  U_int32_t word;
18297403Sobrien} ieee_float_shape_type;
18397403Sobrien/* Get a 32 bit int from a float.  */
18497403Sobrien#define GET_FLOAT_WORD(i,d)                                     \
18597403Sobriendo {                                                            \
18697403Sobrien  ieee_float_shape_type gf_u;                                   \
18797403Sobrien  gf_u.value = (d);                                             \
18897403Sobrien  (i) = gf_u.word;                                              \
18997403Sobrien} while (0)
19097403Sobrien
19197403Sobrien
19297403Sobrien#if BYTE_ORDER == BIG_ENDIAN
19397403Sobrientypedef union
19497403Sobrien{
19597403Sobrien  long double value;
19697403Sobrien  struct
19797403Sobrien  {
19897403Sobrien    unsigned int sign_exponent:16;
19997403Sobrien    unsigned int empty:16;
20097403Sobrien    U_int32_t msw;
20197403Sobrien    U_int32_t lsw;
20297403Sobrien  } parts;
20397403Sobrien} ieee_long_double_shape_type;
20497403Sobrien#endif
20597403Sobrien#if BYTE_ORDER == LITTLE_ENDIAN
20697403Sobrientypedef union
20797403Sobrien{
20897403Sobrien  long double value;
20997403Sobrien  struct
21097403Sobrien  {
21197403Sobrien    U_int32_t lsw;
21297403Sobrien    U_int32_t msw;
21397403Sobrien    unsigned int sign_exponent:16;
21497403Sobrien    unsigned int empty:16;
21597403Sobrien  } parts;
21697403Sobrien} ieee_long_double_shape_type;
21797403Sobrien#endif
21897403Sobrien/* Get int from the exponent of a long double.  */
21997403Sobrien#define GET_LDOUBLE_EXP(exp,d)                                  \
22097403Sobriendo {                                                            \
22197403Sobrien  ieee_long_double_shape_type ge_u;                             \
22297403Sobrien  ge_u.value = (d);                                             \
22397403Sobrien  (exp) = ge_u.parts.sign_exponent;                             \
22497403Sobrien} while (0)
22597403Sobrien
22697403Sobrien#if BYTE_ORDER == BIG_ENDIAN
22797403Sobrientypedef union
22897403Sobrien{
22997403Sobrien  long double value;
23097403Sobrien  struct
23197403Sobrien  {
23297403Sobrien    U_int64_t msw;
23397403Sobrien    U_int64_t lsw;
23497403Sobrien  } parts64;
23597403Sobrien  struct
23697403Sobrien  {
23797403Sobrien    U_int32_t w0, w1, w2, w3;
23897403Sobrien  } parts32;
23997403Sobrien} ieee_quad_double_shape_type;
24097403Sobrien#endif
24197403Sobrien#if BYTE_ORDER == LITTLE_ENDIAN
24297403Sobrientypedef union
24397403Sobrien{
24497403Sobrien  long double value;
24597403Sobrien  struct
24697403Sobrien  {
24797403Sobrien    U_int64_t lsw;
24897403Sobrien    U_int64_t msw;
24997403Sobrien  } parts64;
25097403Sobrien  struct
25197403Sobrien  {
25297403Sobrien    U_int32_t w3, w2, w1, w0;
25397403Sobrien  } parts32;
25497403Sobrien} ieee_quad_double_shape_type;
25597403Sobrien#endif
25697403Sobrien/* Get most significant 64 bit int from a quad long double.  */
25797403Sobrien#define GET_LDOUBLE_MSW64(msw,d)				\
25897403Sobriendo {								\
25997403Sobrien  ieee_quad_double_shape_type qw_u;				\
26097403Sobrien  qw_u.value = (d);						\
26197403Sobrien  (msw) = qw_u.parts64.msw;					\
26297403Sobrien} while (0)
26397403Sobrien
26497403Sobrien
26597403Sobrien/* Replacement for non-existing float functions.  */
26697403Sobrien#if !defined(HAVE_FABSF) && !defined(HAVE___BUILTIN_FABSF)
26797403Sobrien# define fabsf(x) fabs (x)
26897403Sobrien#endif
26997403Sobrien#if !defined(HAVE_COSF) && !defined(HAVE___BUILTIN_COSF)
27097403Sobrien# define cosf(x) cos (x)
27197403Sobrien#endif
27297403Sobrien#ifndef HAVE_COSHF
27397403Sobrien# define coshf(x) cosh (x)
27497403Sobrien#endif
27597403Sobrien#ifndef HAVE_EXPF
27697403Sobrien# define expf(x) expf (x)
27797403Sobrien#endif
27897403Sobrien#ifndef HAVE_LOGF
27997403Sobrien# define logf(x) log(x)
28097403Sobrien#endif
28197403Sobrien#ifndef HAVE_LOG10F
28297403Sobrien# define log10f(x) log10 (x)
28397403Sobrien#endif
28497403Sobrien#ifndef HAVE_POWF
28597403Sobrien# define powf(x, y) pow (x, y)
28697403Sobrien#endif
28797403Sobrien#if !defined(HAVE_SINF) && !defined(HAVE___BUILTIN_SINF)
28897403Sobrien# define sinf(x) sin (x)
28997403Sobrien#endif
29097403Sobrien#ifndef HAVE_SINHF
29197403Sobrien# define sinhf(x) sinh (x)
29297403Sobrien#endif
29397403Sobrien#if !defined(HAVE_SQRTF) && !defined(HAVE___BUILTIN_SQRTF)
29497403Sobrien# define sqrtf(x) sqrt (x)
29597403Sobrien#endif
29697403Sobrien#ifndef HAVE_TANF
29797403Sobrien# define tanf(x) tan (x)
29897403Sobrien#endif
29997403Sobrien#ifndef HAVE_TANHF
30097403Sobrien# define tanhf(x) tanh (x)
30197403Sobrien#endif
30297403Sobrien#ifndef HAVE_STRTOF
30397403Sobrien# define strtof(s, e) strtod (s, e)
30497403Sobrien#endif
30597403Sobrien
30697403Sobrien#ifdef __cplusplus
30797403Sobrien}
30897403Sobrien#endif
30997403Sobrien
310