source: trunk/libs/newlib/src/newlib/libc/sys/linux/cmath/math_private.h @ 444

Last change on this file since 444 was 444, checked in by satin@…, 6 years ago

add newlib,libalmos-mkh, restructure shared_syscalls.h and mini-libc

File size: 11.4 KB
Line 
1/*
2 * ====================================================
3 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
4 *
5 * Developed at SunPro, a Sun Microsystems, Inc. business.
6 * Permission to use, copy, modify, and distribute this
7 * software is freely granted, provided that this notice
8 * is preserved.
9 * ====================================================
10 */
11
12/*
13 * from: @(#)fdlibm.h 5.1 93/09/24
14 * $Id$
15 */
16
17#ifndef _MATH_PRIVATE_H_
18#define _MATH_PRIVATE_H_
19
20#include <endian.h>
21#include <sys/types.h>
22#include <machine/weakalias.h>
23#include <machine/huge_val.h>
24
25#define __nan nan
26#define __isnan isnan
27#define __isinf isinf
28#define __copysignf copysignf
29#define __copysign copysign
30#define __nanf nanf
31#define feraiseexcept(x) /* nothing */
32#define __sincos sincos
33#define __sincosf sincosf
34
35int __signbitd (double x);
36int __signbitf (float x);
37
38/* The original fdlibm code used statements like:
39        n0 = ((*(int*)&one)>>29)^1;             * index of high word *
40        ix0 = *(n0+(int*)&x);                   * high word of x *
41        ix1 = *((1-n0)+(int*)&x);               * low word of x *
42   to dig two 32 bit words out of the 64 bit IEEE floating point
43   value.  That is non-ANSI, and, moreover, the gcc instruction
44   scheduler gets it wrong.  We instead use the following macros.
45   Unlike the original code, we determine the endianness at compile
46   time, not at run time; I don't see much benefit to selecting
47   endianness at run time.  */
48
49/* A union which permits us to convert between a double and two 32 bit
50   ints.  */
51
52#if __FLOAT_WORD_ORDER == BIG_ENDIAN
53
54typedef union
55{
56  double value;
57  struct
58  {
59    u_int32_t msw;
60    u_int32_t lsw;
61  } parts;
62} ieee_double_shape_type;
63
64#endif
65
66#if __FLOAT_WORD_ORDER == LITTLE_ENDIAN
67
68typedef union
69{
70  double value;
71  struct
72  {
73    u_int32_t lsw;
74    u_int32_t msw;
75  } parts;
76} ieee_double_shape_type;
77
78#endif
79
80/* Get two 32 bit ints from a double.  */
81
82#define EXTRACT_WORDS(ix0,ix1,d)                                \
83do {                                                            \
84  ieee_double_shape_type ew_u;                                  \
85  ew_u.value = (d);                                             \
86  (ix0) = ew_u.parts.msw;                                       \
87  (ix1) = ew_u.parts.lsw;                                       \
88} while (0)
89
90/* Get the more significant 32 bit int from a double.  */
91
92#define GET_HIGH_WORD(i,d)                                      \
93do {                                                            \
94  ieee_double_shape_type gh_u;                                  \
95  gh_u.value = (d);                                             \
96  (i) = gh_u.parts.msw;                                         \
97} while (0)
98
99/* Get the less significant 32 bit int from a double.  */
100
101#define GET_LOW_WORD(i,d)                                       \
102do {                                                            \
103  ieee_double_shape_type gl_u;                                  \
104  gl_u.value = (d);                                             \
105  (i) = gl_u.parts.lsw;                                         \
106} while (0)
107
108/* Set a double from two 32 bit ints.  */
109
110#define INSERT_WORDS(d,ix0,ix1)                                 \
111do {                                                            \
112  ieee_double_shape_type iw_u;                                  \
113  iw_u.parts.msw = (ix0);                                       \
114  iw_u.parts.lsw = (ix1);                                       \
115  (d) = iw_u.value;                                             \
116} while (0)
117
118/* Set the more significant 32 bits of a double from an int.  */
119
120#define SET_HIGH_WORD(d,v)                                      \
121do {                                                            \
122  ieee_double_shape_type sh_u;                                  \
123  sh_u.value = (d);                                             \
124  sh_u.parts.msw = (v);                                         \
125  (d) = sh_u.value;                                             \
126} while (0)
127
128/* Set the less significant 32 bits of a double from an int.  */
129
130#define SET_LOW_WORD(d,v)                                       \
131do {                                                            \
132  ieee_double_shape_type sl_u;                                  \
133  sl_u.value = (d);                                             \
134  sl_u.parts.lsw = (v);                                         \
135  (d) = sl_u.value;                                             \
136} while (0)
137
138/* A union which permits us to convert between a float and a 32 bit
139   int.  */
140
141typedef union
142{
143  float value;
144  u_int32_t word;
145} ieee_float_shape_type;
146
147/* Get a 32 bit int from a float.  */
148
149#define GET_FLOAT_WORD(i,d)                                     \
150do {                                                            \
151  ieee_float_shape_type gf_u;                                   \
152  gf_u.value = (d);                                             \
153  (i) = gf_u.word;                                              \
154} while (0)
155
156/* Set a float from a 32 bit int.  */
157
158#define SET_FLOAT_WORD(d,i)                                     \
159do {                                                            \
160  ieee_float_shape_type sf_u;                                   \
161  sf_u.word = (i);                                              \
162  (d) = sf_u.value;                                             \
163} while (0)
164
165#if 0
166/* ieee style elementary functions */
167extern double __ieee754_sqrt (double);
168extern double __ieee754_acos (double);
169extern double __ieee754_acosh (double);
170extern double __ieee754_log (double);
171extern double __ieee754_atanh (double);
172extern double __ieee754_asin (double);
173extern double __ieee754_atan2 (double,double);
174extern double __ieee754_exp (double);
175extern double __ieee754_exp2 (double);
176extern double __ieee754_exp10 (double);
177extern double __ieee754_cosh (double);
178extern double __ieee754_fmod (double,double);
179extern double __ieee754_pow (double,double);
180extern double __ieee754_lgamma_r (double,int *);
181extern double __ieee754_gamma_r (double,int *);
182extern double __ieee754_lgamma (double);
183extern double __ieee754_gamma (double);
184extern double __ieee754_log10 (double);
185extern double __ieee754_log2 (double);
186extern double __ieee754_sinh (double);
187extern double __ieee754_hypot (double,double);
188extern double __ieee754_j0 (double);
189extern double __ieee754_j1 (double);
190extern double __ieee754_y0 (double);
191extern double __ieee754_y1 (double);
192extern double __ieee754_jn (int,double);
193extern double __ieee754_yn (int,double);
194extern double __ieee754_remainder (double,double);
195extern int32_t __ieee754_rem_pio2 (double,double*);
196extern double __ieee754_scalb (double,double);
197#endif
198
199/* This is necessary because the hardware accelerated version of libm
200   does not provide the __ieee754 functions. */
201#define __ieee754_sinh   sinh
202#define __ieee754_hypot  hypot
203#define __ieee754_hypotf hypotf
204#define __ieee754_logf   logf
205#define __ieee754_log10  log10
206#define __ieee754_exp    exp
207#define __ieee754_cosh   cosh
208#define __ieee754_expf   expf
209#define __ieee754_log10f log10f
210#define __ieee754_atan2  atan2
211#define __ieee754_sqrtf  sqrtf
212#define __ieee754_sinhf  sinhf
213#define __ieee754_log    log
214#define __ieee754_sqrt   sqrt
215#define __ieee754_coshf  coshf
216#define __ieee754_atan2f atan2f
217
218/* fdlibm kernel function */
219extern double __kernel_standard (double,double,int);
220extern double __kernel_sin (double,double,int);
221extern double __kernel_cos (double,double);
222extern double __kernel_tan (double,double,int);
223extern int    __kernel_rem_pio2 (double*,double*,int,int,int, const int32_t*);
224
225/* internal functions.  */
226extern double __copysign (double x, double __y);
227
228
229/* ieee style elementary float functions */
230extern float __ieee754_sqrtf (float);
231extern float __ieee754_acosf (float);
232extern float __ieee754_acoshf (float);
233extern float __ieee754_logf (float);
234extern float __ieee754_atanhf (float);
235extern float __ieee754_asinf (float);
236extern float __ieee754_atan2f (float,float);
237extern float __ieee754_expf (float);
238extern float __ieee754_exp2f (float);
239extern float __ieee754_exp10f (float);
240extern float __ieee754_coshf (float);
241extern float __ieee754_fmodf (float,float);
242extern float __ieee754_powf (float,float);
243extern float __ieee754_lgammaf_r (float,int *);
244extern float __ieee754_gammaf_r (float,int *);
245extern float __ieee754_lgammaf (float);
246extern float __ieee754_gammaf (float);
247extern float __ieee754_log10f (float);
248extern float __ieee754_log2f (float);
249extern float __ieee754_sinhf (float);
250extern float __ieee754_hypotf (float,float);
251extern float __ieee754_j0f (float);
252extern float __ieee754_j1f (float);
253extern float __ieee754_y0f (float);
254extern float __ieee754_y1f (float);
255extern float __ieee754_jnf (int,float);
256extern float __ieee754_ynf (int,float);
257extern float __ieee754_remainderf (float,float);
258extern int32_t __ieee754_rem_pio2f (float,float*);
259extern float __ieee754_scalbf (float,float);
260
261
262/* float versions of fdlibm kernel functions */
263extern float __kernel_sinf (float,float,int);
264extern float __kernel_cosf (float,float);
265extern float __kernel_tanf (float,float,int);
266extern int   __kernel_rem_pio2f (float*,float*,int,int,int, const int32_t*);
267
268
269/* ieee style elementary long double functions */
270extern long double __ieee754_sqrtl (long double);
271extern long double __ieee754_acosl (long double);
272extern long double __ieee754_acoshl (long double);
273extern long double __ieee754_logl (long double);
274extern long double __ieee754_atanhl (long double);
275extern long double __ieee754_asinl (long double);
276extern long double __ieee754_atan2l (long double,long double);
277extern long double __ieee754_expl (long double);
278extern long double __ieee754_exp2l (long double);
279extern long double __ieee754_exp10l (long double);
280extern long double __ieee754_coshl (long double);
281extern long double __ieee754_fmodl (long double,long double);
282extern long double __ieee754_powl (long double,long double);
283extern long double __ieee754_lgammal_r (long double,int *);
284extern long double __ieee754_gammal_r (long double,int *);
285extern long double __ieee754_lgammal (long double);
286extern long double __ieee754_gammal (long double);
287extern long double __ieee754_log10l (long double);
288extern long double __ieee754_log2l (long double);
289extern long double __ieee754_sinhl (long double);
290extern long double __ieee754_hypotl (long double,long double);
291extern long double __ieee754_j0l (long double);
292extern long double __ieee754_j1l (long double);
293extern long double __ieee754_y0l (long double);
294extern long double __ieee754_y1l (long double);
295extern long double __ieee754_jnl (int,long double);
296extern long double __ieee754_ynl (int,long double);
297extern long double __ieee754_remainderl (long double,long double);
298extern int   __ieee754_rem_pio2l (long double,long double*);
299extern long double __ieee754_scalbl (long double,long double);
300
301/* long double versions of fdlibm kernel functions */
302extern long double __kernel_sinl (long double,long double,int);
303extern long double __kernel_cosl (long double,long double);
304extern long double __kernel_tanl (long double,long double,int);
305extern void __kernel_sincosl (long double,long double,
306                              long double *,long double *, int);
307extern int   __kernel_rem_pio2l (long double*,long double*,int,int,
308                                 int,const int*);
309
310#ifndef NO_LONG_DOUBLE
311/* prototypes required to compile the ldbl-96 support without warnings */
312extern int __finitel (long double);
313extern int __ilogbl (long double);
314extern int __isinfl (long double);
315extern int __isnanl (long double);
316extern long double __atanl (long double);
317extern long double __copysignl (long double, long double);
318extern long double __expm1l (long double);
319extern long double __floorl (long double);
320extern long double __frexpl (long double, int *);
321extern long double __ldexpl (long double, int);
322extern long double __log1pl (long double);
323extern long double __nanl (const char *);
324extern long double __rintl (long double);
325extern long double __scalbnl (long double, int);
326extern long double __sqrtl (long double x);
327extern long double fabsl (long double x);
328extern void __sincosl (long double, long double *, long double *);
329extern long double __logbl (long double x);
330extern long double __significandl (long double x);
331#endif
332
333/* Prototypes for functions of the IBM Accurate Mathematical Library.  */
334extern double __exp1 (double __x, double __xx, double __error);
335extern double __sin (double __x);
336extern double __cos (double __x);
337extern int __branred (double __x, double *__a, double *__aa);
338extern void __doasin (double __x, double __dx, double __v[]);
339extern void __dubsin (double __x, double __dx, double __v[]);
340extern void __dubcos (double __x, double __dx, double __v[]);
341extern double __halfulp (double __x, double __y);
342extern double __sin32 (double __x, double __res, double __res1);
343extern double __cos32 (double __x, double __res, double __res1);
344extern double __mpsin (double __x, double __dx);
345extern double __mpcos (double __x, double __dx);
346extern double __mpsin1 (double __x);
347extern double __mpcos1 (double __x);
348extern double __slowexp (double __x);
349extern double __slowpow (double __x, double __y, double __z);
350extern void __docos (double __x, double __dx, double __v[]);
351
352#endif /* _MATH_PRIVATE_H_ */
Note: See TracBrowser for help on using the repository browser.