* src/fdlibm/s_finite.c,
[cacao.git] / src / fdlibm / fdlibm.h
1
2 /* @(#)fdlibm.h 1.5 04/04/22 */
3 /*
4  * ====================================================
5  * Copyright (C) 2004 by Sun Microsystems, Inc. All rights reserved.
6  *
7  * Permission to use, copy, modify, and distribute this
8  * software is freely granted, provided that this notice 
9  * is preserved.
10  * ====================================================
11  */
12
13 #ifndef __CLASSPATH_FDLIBM_H__
14 #define __CLASSPATH_FDLIBM_H__
15
16 /* AIX needs _XOPEN_SOURCE */
17 #ifdef _AIX
18 #define _XOPEN_SOURCE
19 #endif
20
21 #include <config.h>
22 #include <stdlib.h>
23
24 /* GCJ LOCAL: Include files.  */
25 #include "ieeefp.h"
26 /* CLASSPATH LOCAL: */
27 /* #include "namespace.h" */
28
29 #include "mprec.h"
30
31 /* CYGNUS LOCAL: Default to XOPEN_MODE.  */
32 #define _XOPEN_MODE
33
34 #ifdef __P
35 #undef __P
36 #endif
37
38 /* Sometimes it's necessary to define __LITTLE_ENDIAN explicitly
39    but these catch some common cases. */
40
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
47
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
60
61 #ifdef __STDC__
62 #define __P(p)  p
63 #else
64 #define __P(p)  ()
65 #endif
66
67 /*
68  * ANSI/POSIX
69  */
70
71 extern int signgam;
72
73 #define MAXFLOAT        ((float)3.40282346638528860e+38)
74
75 enum fdversion {fdlibm_ieee = -1, fdlibm_svid, fdlibm_xopen, fdlibm_posix};
76
77 #define _LIB_VERSION_TYPE enum fdversion
78 #define _LIB_VERSION _fdlib_version  
79
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;
88
89 #define _IEEE_  fdlibm_ieee
90 #define _SVID_  fdlibm_svid
91 #define _XOPEN_ fdlibm_xopen
92 #define _POSIX_ fdlibm_posix
93
94 struct exception {
95         int type;
96         char *name;
97         double arg1;
98         double arg2;
99         double retval;
100 };
101
102 #define HUGE            MAXFLOAT
103
104 /* 
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>")
107  */
108
109 #define X_TLOSS         1.41484755040568800000e+16 
110
111 #define DOMAIN          1
112 #define SING            2
113 #define OVERFLOW        3
114 #define UNDERFLOW       4
115 #define TLOSS           5
116 #define PLOSS           6
117
118 /* These typedefs are true for the targets running Java. */
119
120 #define _IEEE_LIBM
121
122 #ifdef __cplusplus
123 extern "C" {
124 #endif
125
126 /*
127  * ANSI/POSIX
128  */
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));
136
137 extern double cosh __P((double));
138 extern double sinh __P((double));
139 extern double tanh __P((double));
140
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 *));
147
148 extern double pow __P((double, double));
149 extern double sqrt __P((double));
150
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));
155
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));
160
161 #if !defined(isnan)
162 #define isnan(x) ((x) != (x))
163 #endif
164
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));
173
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
186
187 extern int matherr __P((struct exception *));
188
189 /*
190  * IEEE Test Vector
191  */
192 extern double significand __P((double));
193
194 /*
195  * Functions callable from C, intended to support IEEE arithmetic.
196  */
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));
201
202 /*
203  * BSD math library entry points
204  */
205 extern double expm1 __P((double));
206 extern double log1p __P((double));
207
208 /*
209  * Reentrant version of gamma & lgamma; passes signgam back by reference
210  * as the second argument; user must allocate space for signgam.
211  */
212 #ifdef _REENTRANT
213 extern double gamma_r __P((double, int *));
214 extern double lgamma_r __P((double, int *));
215 #endif  /* _REENTRANT */
216
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
249
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*));
256
257 /* Classpath extensions */
258
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.  */  
269    
270 #ifndef __IEEE_BIG_ENDIAN  
271 #ifndef __IEEE_LITTLE_ENDIAN  
272 #error Must define endianness  
273 #endif  
274 #endif  
275    
276 /* A union which permits us to convert between a double and two 32 bit  
277    ints.  */  
278    
279 #ifdef __IEEE_BIG_ENDIAN  
280    
281   typedef union  
282   {  
283     double value;  
284     struct  
285     {  
286       uint32_t msw;  
287       uint32_t lsw;  
288     } parts;  
289   } ieee_double_shape_type;  
290    
291 #endif  
292    
293 #ifdef __IEEE_LITTLE_ENDIAN  
294    
295   typedef union  
296   {  
297     double value;  
298     struct  
299     {  
300       uint32_t lsw;  
301       uint32_t msw;  
302     } parts;  
303   } ieee_double_shape_type;  
304    
305 #endif  
306    
307   /* Get two 32 bit ints from a double.  */  
308    
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)  
316         
317 /* Get the more significant 32 bit int from a double.  */  
318         
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)  
325         
326 /* Get the less significant 32 bit int from a double.  */  
327         
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)  
334         
335 /* Set a double from two 32 bit ints.  */  
336         
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)  
344         
345 /* Set the more significant 32 bits of a double from an int.  */  
346         
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)  
354         
355 /* Set the less significant 32 bits of a double from an int.  */  
356         
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)  
364
365 /* A union which permits us to convert between a float and a 32 bit
366    int.  */
367
368 typedef union
369 {
370   float value;
371   uint32_t word;
372 } ieee_float_shape_type;
373
374 /* Get a 32 bit int from a float.  */
375
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)
382
383 /* Set a float from a 32 bit int.  */
384
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)
391
392 #ifdef __cplusplus
393 }
394 #endif
395
396 #endif /* __CLASSPATH_FDLIBM_H__ */
397