Imported GNU Classpath 0.90
[official-gcc.git] / libjava / classpath / native / fdlibm / fdlibm.h
blobbf9f5699107494b5a834eefb107a03ec9ac2ac19
2 /* @(#)fdlibm.h 1.5 04/04/22 */
3 /*
4 * ====================================================
5 * Copyright (C) 2004 by Sun Microsystems, Inc. All rights reserved.
7 * Permission to use, copy, modify, and distribute this
8 * software is freely granted, provided that this notice
9 * is preserved.
10 * ====================================================
13 #ifndef __CLASSPATH_FDLIBM_H__
14 #define __CLASSPATH_FDLIBM_H__
16 /* AIX needs _XOPEN_SOURCE */
17 #ifdef _AIX
18 #define _XOPEN_SOURCE
19 #endif
21 #include <config.h>
22 #include <stdlib.h>
24 /* GCJ LOCAL: Include files. */
25 #include "ieeefp.h"
26 /* CLASSPATH LOCAL: */
27 #include "namespace.h"
29 #include "mprec.h"
31 /* CYGNUS LOCAL: Default to XOPEN_MODE. */
32 #define _XOPEN_MODE
34 #ifdef __P
35 #undef __P
36 #endif
38 /* Sometimes it's necessary to define __LITTLE_ENDIAN explicitly
39 but these catch some common cases. */
41 #if 0
42 #if defined(i386) || defined(i486) || \
43 defined(intel) || defined(x86) || defined(i86pc) || \
44 defined(__alpha) || defined(__osf__)
45 #define __LITTLE_ENDIAN
46 #endif
48 #ifdef __LITTLE_ENDIAN
49 #define __HI(x) *(1+(int*)&x)
50 #define __LO(x) *(int*)&x
51 #define __HIp(x) *(1+(int*)x)
52 #define __LOp(x) *(int*)x
53 #else
54 #define __HI(x) *(int*)&x
55 #define __LO(x) *(1+(int*)&x)
56 #define __HIp(x) *(int*)x
57 #define __LOp(x) *(1+(int*)x)
58 #endif
59 #endif
61 #ifdef __STDC__
62 #define __P(p) p
63 #else
64 #define __P(p) ()
65 #endif
68 * ANSI/POSIX
71 extern int signgam;
73 #define MAXFLOAT ((float)3.40282346638528860e+38)
75 enum fdversion {fdlibm_ieee = -1, fdlibm_svid, fdlibm_xopen, fdlibm_posix};
77 #define _LIB_VERSION_TYPE enum fdversion
78 #define _LIB_VERSION _fdlib_version
80 /* if global variable _LIB_VERSION is not desirable, one may
81 * change the following to be a constant by:
82 * #define _LIB_VERSION_TYPE const enum version
83 * In that case, after one initializes the value _LIB_VERSION (see
84 * s_lib_version.c) during compile time, it cannot be modified
85 * in the middle of a program
86 */
87 extern _LIB_VERSION_TYPE _LIB_VERSION;
89 #define _IEEE_ fdlibm_ieee
90 #define _SVID_ fdlibm_svid
91 #define _XOPEN_ fdlibm_xopen
92 #define _POSIX_ fdlibm_posix
94 struct exception {
95 int type;
96 char *name;
97 double arg1;
98 double arg2;
99 double retval;
102 #define HUGE MAXFLOAT
105 * set X_TLOSS = pi*2**52, which is possibly defined in <values.h>
106 * (one may replace the following line by "#include <values.h>")
109 #define X_TLOSS 1.41484755040568800000e+16
111 #define DOMAIN 1
112 #define SING 2
113 #define OVERFLOW 3
114 #define UNDERFLOW 4
115 #define TLOSS 5
116 #define PLOSS 6
118 /* These typedefs are true for the targets running Java. */
120 #define _IEEE_LIBM
122 #ifdef __cplusplus
123 extern "C" {
124 #endif
127 * ANSI/POSIX
129 extern double acos __P((double));
130 extern double asin __P((double));
131 extern double atan __P((double));
132 extern double atan2 __P((double, double));
133 extern double cos __P((double));
134 extern double sin __P((double));
135 extern double tan __P((double));
137 extern double cosh __P((double));
138 extern double sinh __P((double));
139 extern double tanh __P((double));
141 extern double exp __P((double));
142 extern double frexp __P((double, int *));
143 extern double ldexp __P((double, int));
144 extern double log __P((double));
145 extern double log10 __P((double));
146 extern double modf __P((double, double *));
148 extern double pow __P((double, double));
149 extern double sqrt __P((double));
151 extern double ceil __P((double));
152 extern double fabs __P((double));
153 extern double floor __P((double));
154 extern double fmod __P((double, double));
156 extern double erf __P((double));
157 extern double erfc __P((double));
158 extern double gamma __P((double));
159 extern double hypot __P((double, double));
161 #if !defined(isnan)
162 #define isnan(x) ((x) != (x))
163 #endif
165 extern int finite __P((double));
166 extern double j0 __P((double));
167 extern double j1 __P((double));
168 extern double jn __P((int, double));
169 extern double lgamma __P((double));
170 extern double y0 __P((double));
171 extern double y1 __P((double));
172 extern double yn __P((int, double));
174 extern double acosh __P((double));
175 extern double asinh __P((double));
176 extern double atanh __P((double));
177 extern double cbrt __P((double));
178 extern double logb __P((double));
179 extern double nextafter __P((double, double));
180 extern double remainder __P((double, double));
181 #ifdef _SCALB_INT
182 extern double scalb __P((double, int));
183 #else
184 extern double scalb __P((double, double));
185 #endif
187 extern int matherr __P((struct exception *));
190 * IEEE Test Vector
192 extern double significand __P((double));
195 * Functions callable from C, intended to support IEEE arithmetic.
197 extern double copysign __P((double, double));
198 extern int ilogb __P((double));
199 extern double rint __P((double));
200 extern double scalbn __P((double, int));
203 * BSD math library entry points
205 extern double expm1 __P((double));
206 extern double log1p __P((double));
209 * Reentrant version of gamma & lgamma; passes signgam back by reference
210 * as the second argument; user must allocate space for signgam.
212 #ifdef _REENTRANT
213 extern double gamma_r __P((double, int *));
214 extern double lgamma_r __P((double, int *));
215 #endif /* _REENTRANT */
217 /* ieee style elementary functions */
218 extern double __ieee754_sqrt __P((double));
219 extern double __ieee754_acos __P((double));
220 extern double __ieee754_acosh __P((double));
221 extern double __ieee754_log __P((double));
222 extern double __ieee754_atanh __P((double));
223 extern double __ieee754_asin __P((double));
224 extern double __ieee754_atan2 __P((double,double));
225 extern double __ieee754_exp __P((double));
226 extern double __ieee754_cosh __P((double));
227 extern double __ieee754_fmod __P((double,double));
228 extern double __ieee754_pow __P((double,double));
229 extern double __ieee754_lgamma_r __P((double,int *));
230 extern double __ieee754_gamma_r __P((double,int *));
231 extern double __ieee754_lgamma __P((double));
232 extern double __ieee754_gamma __P((double));
233 extern double __ieee754_log10 __P((double));
234 extern double __ieee754_sinh __P((double));
235 extern double __ieee754_hypot __P((double,double));
236 extern double __ieee754_j0 __P((double));
237 extern double __ieee754_j1 __P((double));
238 extern double __ieee754_y0 __P((double));
239 extern double __ieee754_y1 __P((double));
240 extern double __ieee754_jn __P((int,double));
241 extern double __ieee754_yn __P((int,double));
242 extern double __ieee754_remainder __P((double,double));
243 extern int32_t __ieee754_rem_pio2 __P((double,double*));
244 #ifdef _SCALB_INT
245 extern double __ieee754_scalb __P((double,int));
246 #else
247 extern double __ieee754_scalb __P((double,double));
248 #endif
250 /* fdlibm kernel function */
251 extern double __kernel_standard __P((double,double,int));
252 extern double __kernel_sin __P((double,double,int));
253 extern double __kernel_cos __P((double,double));
254 extern double __kernel_tan __P((double,double,int));
255 extern int __kernel_rem_pio2 __P((double*,double*,int,int,int,const int*));
257 /* Classpath extensions */
259 /* The original code used statements like
260 n0 = ((*(int*)&one)>>29)^1; * index of high word *
261 ix0 = *(n0+(int*)&x); * high word of x *
262 ix1 = *((1-n0)+(int*)&x); * low word of x *
263 to dig two 32 bit words out of the 64 bit IEEE floating point
264 value. That is non-ANSI, and, moreover, the gcc instruction
265 scheduler gets it wrong. We instead use the following macros.
266 Unlike the original code, we determine the endianness at compile
267 time, not at run time; I don't see much benefit to selecting
268 endianness at run time. */
270 #ifndef __IEEE_BIG_ENDIAN
271 #ifndef __IEEE_LITTLE_ENDIAN
272 #error Must define endianness
273 #endif
274 #endif
276 /* A union which permits us to convert between a double and two 32 bit
277 ints. */
279 #ifdef __IEEE_BIG_ENDIAN
281 typedef union
283 double value;
284 struct
286 uint32_t msw;
287 uint32_t lsw;
288 } parts;
289 } ieee_double_shape_type;
291 #endif
293 #ifdef __IEEE_LITTLE_ENDIAN
295 typedef union
297 double value;
298 struct
300 uint32_t lsw;
301 uint32_t msw;
302 } parts;
303 } ieee_double_shape_type;
305 #endif
307 /* Get two 32 bit ints from a double. */
309 #define EXTRACT_WORDS(ix0,ix1,d) \
310 do { \
311 ieee_double_shape_type ew_u; \
312 ew_u.value = (d); \
313 (ix0) = ew_u.parts.msw; \
314 (ix1) = ew_u.parts.lsw; \
315 } while (0)
317 /* Get the more significant 32 bit int from a double. */
319 #define GET_HIGH_WORD(i,d) \
320 do { \
321 ieee_double_shape_type gh_u; \
322 gh_u.value = (d); \
323 (i) = gh_u.parts.msw; \
324 } while (0)
326 /* Get the less significant 32 bit int from a double. */
328 #define GET_LOW_WORD(i,d) \
329 do { \
330 ieee_double_shape_type gl_u; \
331 gl_u.value = (d); \
332 (i) = gl_u.parts.lsw; \
333 } while (0)
335 /* Set a double from two 32 bit ints. */
337 #define INSERT_WORDS(d,ix0,ix1) \
338 do { \
339 ieee_double_shape_type iw_u; \
340 iw_u.parts.msw = (ix0); \
341 iw_u.parts.lsw = (ix1); \
342 (d) = iw_u.value; \
343 } while (0)
345 /* Set the more significant 32 bits of a double from an int. */
347 #define SET_HIGH_WORD(d,v) \
348 do { \
349 ieee_double_shape_type sh_u; \
350 sh_u.value = (d); \
351 sh_u.parts.msw = (v); \
352 (d) = sh_u.value; \
353 } while (0)
355 /* Set the less significant 32 bits of a double from an int. */
357 #define SET_LOW_WORD(d,v) \
358 do { \
359 ieee_double_shape_type sl_u; \
360 sl_u.value = (d); \
361 sl_u.parts.lsw = (v); \
362 (d) = sl_u.value; \
363 } while (0)
365 /* A union which permits us to convert between a float and a 32 bit
366 int. */
368 typedef union
370 float value;
371 uint32_t word;
372 } ieee_float_shape_type;
374 /* Get a 32 bit int from a float. */
376 #define GET_FLOAT_WORD(i,d) \
377 do { \
378 ieee_float_shape_type gf_u; \
379 gf_u.value = (d); \
380 (i) = gf_u.word; \
381 } while (0)
383 /* Set a float from a 32 bit int. */
385 #define SET_FLOAT_WORD(d,i) \
386 do { \
387 ieee_float_shape_type sf_u; \
388 sf_u.word = (i); \
389 (d) = sf_u.value; \
390 } while (0)
392 #ifdef __cplusplus
394 #endif
396 #endif /* __CLASSPATH_FDLIBM_H__ */