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