1*03a78d15Sespie /* Configuration data for libmath subpart of libstdc++. */ 2*03a78d15Sespie 3*03a78d15Sespie /* Copyright (C) 1997-1999, 2000, 2001 Free Software Foundation, Inc. 4*03a78d15Sespie 5*03a78d15Sespie This file is part of the GNU ISO C++ Library. This library is free 6*03a78d15Sespie software; you can redistribute it and/or modify it under the 7*03a78d15Sespie terms of the GNU General Public License as published by the 8*03a78d15Sespie Free Software Foundation; either version 2, or (at your option) 9*03a78d15Sespie any later version. 10*03a78d15Sespie 11*03a78d15Sespie This library is distributed in the hope that it will be useful, 12*03a78d15Sespie but WITHOUT ANY WARRANTY; without even the implied warranty of 13*03a78d15Sespie MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14*03a78d15Sespie GNU General Public License for more details. 15*03a78d15Sespie 16*03a78d15Sespie You should have received a copy of the GNU General Public License along 17*03a78d15Sespie with this library; see the file COPYING. If not, write to the Free 18*03a78d15Sespie Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, 19*03a78d15Sespie USA. 20*03a78d15Sespie 21*03a78d15Sespie As a special exception, you may use this file as part of a free software 22*03a78d15Sespie library without restriction. Specifically, if other files instantiate 23*03a78d15Sespie templates or use macros or inline functions from this file, or you compile 24*03a78d15Sespie this file and link it with other files to produce an executable, this 25*03a78d15Sespie file does not by itself cause the resulting executable to be covered by 26*03a78d15Sespie the GNU General Public License. This exception does not however 27*03a78d15Sespie invalidate any other reasons why the executable file might be covered by 28*03a78d15Sespie the GNU General Public License. */ 29*03a78d15Sespie 30*03a78d15Sespie 31*03a78d15Sespie #include <config.h> 32*03a78d15Sespie 33*03a78d15Sespie #ifdef HAVE_ENDIAN_H 34*03a78d15Sespie # include <endian.h> 35*03a78d15Sespie #else 36*03a78d15Sespie # ifdef HAVE_MACHINE_ENDIAN_H 37*03a78d15Sespie # ifdef HAVE_SYS_TYPES_H 38*03a78d15Sespie # include <sys/types.h> 39*03a78d15Sespie # endif 40*03a78d15Sespie # include <machine/endian.h> 41*03a78d15Sespie # else 42*03a78d15Sespie # ifdef HAVE_SYS_MACHINE_H 43*03a78d15Sespie # include <sys/machine.h> 44*03a78d15Sespie # else 45*03a78d15Sespie # if defined HAVE_SYS_ISA_DEFS_H || defined HAVE_MACHINE_PARAM_H 46*03a78d15Sespie /* This is on Solaris. */ 47*03a78d15Sespie # ifdef HAVE_SYS_ISA_DEFS_H 48*03a78d15Sespie # include <sys/isa_defs.h> 49*03a78d15Sespie # endif 50*03a78d15Sespie # ifdef HAVE_MACHINE_PARAM_H 51*03a78d15Sespie # include <machine/param.h> 52*03a78d15Sespie # endif 53*03a78d15Sespie # ifdef _LITTLE_ENDIAN 54*03a78d15Sespie # define LITTLE_ENDIAN 1 55*03a78d15Sespie # endif 56*03a78d15Sespie # ifdef _BIG_ENDIAN 57*03a78d15Sespie # define BIG_ENDIAN 1 58*03a78d15Sespie # endif 59*03a78d15Sespie # define BYTE_ORDER 1 60*03a78d15Sespie # else 61*03a78d15Sespie /* We have to rely on the AC_C_BIGENDIAN test. */ 62*03a78d15Sespie # ifdef WORDS_BIGENDIAN 63*03a78d15Sespie # define BIG_ENDIAN 1 64*03a78d15Sespie # else 65*03a78d15Sespie # define LITTLE_ENDIAN 1 66*03a78d15Sespie # endif 67*03a78d15Sespie # define BYTE_ORDER 1 68*03a78d15Sespie # endif 69*03a78d15Sespie # endif 70*03a78d15Sespie # endif 71*03a78d15Sespie #endif 72*03a78d15Sespie 73*03a78d15Sespie typedef unsigned int U_int32_t __attribute ((mode (SI))); 74*03a78d15Sespie typedef int Int32_t __attribute ((mode (SI))); 75*03a78d15Sespie typedef unsigned int U_int64_t __attribute ((mode (DI))); 76*03a78d15Sespie typedef int Int64_t __attribute ((mode (DI))); 77*03a78d15Sespie 78*03a78d15Sespie #ifdef HAVE_NAN_H 79*03a78d15Sespie # include <nan.h> 80*03a78d15Sespie #endif 81*03a78d15Sespie 82*03a78d15Sespie #ifndef NAN 83*03a78d15Sespie # define NAN (nan()) 84*03a78d15Sespie double nan (void); 85*03a78d15Sespie #endif 86*03a78d15Sespie 87*03a78d15Sespie #ifdef HAVE_IEEEFP_H 88*03a78d15Sespie # include <ieeefp.h> 89*03a78d15Sespie #endif 90*03a78d15Sespie 91*03a78d15Sespie #ifdef HAVE_FP_H 92*03a78d15Sespie # include <fp.h> 93*03a78d15Sespie #endif 94*03a78d15Sespie 95*03a78d15Sespie #ifdef HAVE_FLOAT_H 96*03a78d15Sespie # include <float.h> 97*03a78d15Sespie #endif 98*03a78d15Sespie 99*03a78d15Sespie /* `float' variant of HUGE_VAL. */ 100*03a78d15Sespie #ifndef HUGE_VALF 101*03a78d15Sespie # ifdef HUGE_VALf 102*03a78d15Sespie # define HUGE_VALF HUGE_VALf 103*03a78d15Sespie # else 104*03a78d15Sespie # define HUGE_VALF HUGE_VAL 105*03a78d15Sespie # endif 106*03a78d15Sespie #endif 107*03a78d15Sespie 108*03a78d15Sespie /* `long double' variant of HUGE_VAL. */ 109*03a78d15Sespie #ifndef HUGE_VALL 110*03a78d15Sespie # ifdef HUGE_VALl 111*03a78d15Sespie # define HUGE_VALL HUGE_VALl 112*03a78d15Sespie # else 113*03a78d15Sespie # define HUGE_VALL HUGE_VAL 114*03a78d15Sespie # endif 115*03a78d15Sespie #endif 116*03a78d15Sespie 117*03a78d15Sespie /* Make sure that at least HUGE_VAL is defined. */ 118*03a78d15Sespie #ifndef HUGE_VAL 119*03a78d15Sespie # ifdef HUGE 120*03a78d15Sespie # define HUGE_VAL HUGE 121*03a78d15Sespie # else 122*03a78d15Sespie # ifdef MAXFLOAT 123*03a78d15Sespie # define HUGE_VAL MAXFLOAT 124*03a78d15Sespie # else 125*03a78d15Sespie # error "We need HUGE_VAL!" 126*03a78d15Sespie # endif 127*03a78d15Sespie # endif 128*03a78d15Sespie #endif 129*03a78d15Sespie 130*03a78d15Sespie #ifndef M_PI 131*03a78d15Sespie # define M_PI 3.14159265358979323846 132*03a78d15Sespie #endif 133*03a78d15Sespie 134*03a78d15Sespie 135*03a78d15Sespie #ifdef __cplusplus 136*03a78d15Sespie extern "C" { 137*03a78d15Sespie #endif 138*03a78d15Sespie 139*03a78d15Sespie /* signbit is a macro in ISO C99. */ 140*03a78d15Sespie #ifndef signbit 141*03a78d15Sespie extern int __signbitf (float); 142*03a78d15Sespie extern int __signbit (double); 143*03a78d15Sespie extern int __signbitl (long double); 144*03a78d15Sespie 145*03a78d15Sespie # define signbit(x) \ 146*03a78d15Sespie (sizeof (x) == sizeof (float) ? \ 147*03a78d15Sespie __signbitf (x) \ 148*03a78d15Sespie : sizeof (x) == sizeof (double) ? \ 149*03a78d15Sespie __signbit (x) : __signbitl (x)) 150*03a78d15Sespie #endif 151*03a78d15Sespie 152*03a78d15Sespie #if BYTE_ORDER == BIG_ENDIAN 153*03a78d15Sespie typedef union 154*03a78d15Sespie { 155*03a78d15Sespie double value; 156*03a78d15Sespie struct 157*03a78d15Sespie { 158*03a78d15Sespie U_int32_t msw; 159*03a78d15Sespie U_int32_t lsw; 160*03a78d15Sespie } parts; 161*03a78d15Sespie } ieee_double_shape_type; 162*03a78d15Sespie #endif 163*03a78d15Sespie #if BYTE_ORDER == LITTLE_ENDIAN 164*03a78d15Sespie typedef union 165*03a78d15Sespie { 166*03a78d15Sespie double value; 167*03a78d15Sespie struct 168*03a78d15Sespie { 169*03a78d15Sespie U_int32_t lsw; 170*03a78d15Sespie U_int32_t msw; 171*03a78d15Sespie } parts; 172*03a78d15Sespie } ieee_double_shape_type; 173*03a78d15Sespie #endif 174*03a78d15Sespie /* Get the more significant 32 bit int from a double. */ 175*03a78d15Sespie #define GET_HIGH_WORD(i,d) \ 176*03a78d15Sespie do { \ 177*03a78d15Sespie ieee_double_shape_type gh_u; \ 178*03a78d15Sespie gh_u.value = (d); \ 179*03a78d15Sespie (i) = gh_u.parts.msw; \ 180*03a78d15Sespie } while (0) 181*03a78d15Sespie 182*03a78d15Sespie 183*03a78d15Sespie typedef union 184*03a78d15Sespie { 185*03a78d15Sespie float value; 186*03a78d15Sespie U_int32_t word; 187*03a78d15Sespie } ieee_float_shape_type; 188*03a78d15Sespie /* Get a 32 bit int from a float. */ 189*03a78d15Sespie #define GET_FLOAT_WORD(i,d) \ 190*03a78d15Sespie do { \ 191*03a78d15Sespie ieee_float_shape_type gf_u; \ 192*03a78d15Sespie gf_u.value = (d); \ 193*03a78d15Sespie (i) = gf_u.word; \ 194*03a78d15Sespie } while (0) 195*03a78d15Sespie 196*03a78d15Sespie 197*03a78d15Sespie #if BYTE_ORDER == BIG_ENDIAN 198*03a78d15Sespie typedef union 199*03a78d15Sespie { 200*03a78d15Sespie long double value; 201*03a78d15Sespie struct 202*03a78d15Sespie { 203*03a78d15Sespie unsigned int sign_exponent:16; 204*03a78d15Sespie unsigned int empty:16; 205*03a78d15Sespie U_int32_t msw; 206*03a78d15Sespie U_int32_t lsw; 207*03a78d15Sespie } parts; 208*03a78d15Sespie } ieee_long_double_shape_type; 209*03a78d15Sespie #endif 210*03a78d15Sespie #if BYTE_ORDER == LITTLE_ENDIAN 211*03a78d15Sespie typedef union 212*03a78d15Sespie { 213*03a78d15Sespie long double value; 214*03a78d15Sespie struct 215*03a78d15Sespie { 216*03a78d15Sespie U_int32_t lsw; 217*03a78d15Sespie U_int32_t msw; 218*03a78d15Sespie unsigned int sign_exponent:16; 219*03a78d15Sespie unsigned int empty:16; 220*03a78d15Sespie } parts; 221*03a78d15Sespie } ieee_long_double_shape_type; 222*03a78d15Sespie #endif 223*03a78d15Sespie /* Get int from the exponent of a long double. */ 224*03a78d15Sespie #define GET_LDOUBLE_EXP(exp,d) \ 225*03a78d15Sespie do { \ 226*03a78d15Sespie ieee_long_double_shape_type ge_u; \ 227*03a78d15Sespie ge_u.value = (d); \ 228*03a78d15Sespie (exp) = ge_u.parts.sign_exponent; \ 229*03a78d15Sespie } while (0) 230*03a78d15Sespie 231*03a78d15Sespie #if BYTE_ORDER == BIG_ENDIAN 232*03a78d15Sespie typedef union 233*03a78d15Sespie { 234*03a78d15Sespie long double value; 235*03a78d15Sespie struct 236*03a78d15Sespie { 237*03a78d15Sespie U_int64_t msw; 238*03a78d15Sespie U_int64_t lsw; 239*03a78d15Sespie } parts64; 240*03a78d15Sespie struct 241*03a78d15Sespie { 242*03a78d15Sespie U_int32_t w0, w1, w2, w3; 243*03a78d15Sespie } parts32; 244*03a78d15Sespie } ieee_quad_double_shape_type; 245*03a78d15Sespie #endif 246*03a78d15Sespie #if BYTE_ORDER == LITTLE_ENDIAN 247*03a78d15Sespie typedef union 248*03a78d15Sespie { 249*03a78d15Sespie long double value; 250*03a78d15Sespie struct 251*03a78d15Sespie { 252*03a78d15Sespie U_int64_t lsw; 253*03a78d15Sespie U_int64_t msw; 254*03a78d15Sespie } parts64; 255*03a78d15Sespie struct 256*03a78d15Sespie { 257*03a78d15Sespie U_int32_t w3, w2, w1, w0; 258*03a78d15Sespie } parts32; 259*03a78d15Sespie } ieee_quad_double_shape_type; 260*03a78d15Sespie #endif 261*03a78d15Sespie /* Get most significant 64 bit int from a quad long double. */ 262*03a78d15Sespie #define GET_LDOUBLE_MSW64(msw,d) \ 263*03a78d15Sespie do { \ 264*03a78d15Sespie ieee_quad_double_shape_type qw_u; \ 265*03a78d15Sespie qw_u.value = (d); \ 266*03a78d15Sespie (msw) = qw_u.parts64.msw; \ 267*03a78d15Sespie } while (0) 268*03a78d15Sespie 269*03a78d15Sespie 270*03a78d15Sespie /* Replacement for non-existing float functions. */ 271*03a78d15Sespie #if !defined(HAVE_FABSF) && !defined(HAVE___BUILTIN_FABSF) 272*03a78d15Sespie # define fabsf(x) fabs (x) 273*03a78d15Sespie #endif 274*03a78d15Sespie #if !defined(HAVE_COSF) && !defined(HAVE___BUILTIN_COSF) 275*03a78d15Sespie # define cosf(x) cos (x) 276*03a78d15Sespie #endif 277*03a78d15Sespie #ifndef HAVE_COSHF 278*03a78d15Sespie # define coshf(x) cosh (x) 279*03a78d15Sespie #endif 280*03a78d15Sespie #ifndef HAVE_EXPF 281*03a78d15Sespie # define expf(x) expf (x) 282*03a78d15Sespie #endif 283*03a78d15Sespie #ifndef HAVE_LOGF 284*03a78d15Sespie # define logf(x) log(x) 285*03a78d15Sespie #endif 286*03a78d15Sespie #ifndef HAVE_LOG10F 287*03a78d15Sespie # define log10f(x) log10 (x) 288*03a78d15Sespie #endif 289*03a78d15Sespie #ifndef HAVE_POWF 290*03a78d15Sespie # define powf(x, y) pow (x, y) 291*03a78d15Sespie #endif 292*03a78d15Sespie #if !defined(HAVE_SINF) && !defined(HAVE___BUILTIN_SINF) 293*03a78d15Sespie # define sinf(x) sin (x) 294*03a78d15Sespie #endif 295*03a78d15Sespie #ifndef HAVE_SINHF 296*03a78d15Sespie # define sinhf(x) sinh (x) 297*03a78d15Sespie #endif 298*03a78d15Sespie #if !defined(HAVE_SQRTF) && !defined(HAVE___BUILTIN_SQRTF) 299*03a78d15Sespie # define sqrtf(x) sqrt (x) 300*03a78d15Sespie #endif 301*03a78d15Sespie #ifndef HAVE_TANF 302*03a78d15Sespie # define tanf(x) tan (x) 303*03a78d15Sespie #endif 304*03a78d15Sespie #ifndef HAVE_TANHF 305*03a78d15Sespie # define tanhf(x) tanh (x) 306*03a78d15Sespie #endif 307*03a78d15Sespie #ifndef HAVE_STRTOF 308*03a78d15Sespie # define strtof(s, e) strtod (s, e) 309*03a78d15Sespie #endif 310*03a78d15Sespie 311*03a78d15Sespie #ifdef __cplusplus 312*03a78d15Sespie } 313*03a78d15Sespie #endif 314*03a78d15Sespie 315