xref: /openbsd-src/gnu/lib/libstdc++/libstdc++/libmath/mathconf.h (revision 03a78d155d6fff5698289342b62759a75b20d130)
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