]>
Commit | Line | Data |
---|---|---|
2aa62f2b | 1 | /*\r |
2 | * ====================================================\r | |
3 | * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.\r | |
4 | *\r | |
5 | * Developed at SunPro, a Sun Microsystems, Inc. business.\r | |
6 | * Permission to use, copy, modify, and distribute this\r | |
7 | * software is freely granted, provided that this notice\r | |
8 | * is preserved.\r | |
9 | * ====================================================\r | |
10 | */\r | |
11 | \r | |
12 | /*\r | |
13 | * from: @(#)fdlibm.h 5.1 93/09/24\r | |
14 | * $NetBSD: math_private.h,v 1.12 2005/07/21 12:55:58 christos Exp $\r | |
15 | */\r | |
16 | \r | |
17 | #ifndef _MATH_PRIVATE_H_\r | |
18 | #define _MATH_PRIVATE_H_\r | |
19 | \r | |
20 | #include <sys/types.h>\r | |
21 | \r | |
22 | /* The original fdlibm code used statements like:\r | |
23 | n0 = ((*(int*)&one)>>29)^1; * index of high word *\r | |
24 | ix0 = *(n0+(int*)&x); * high word of x *\r | |
25 | ix1 = *((1-n0)+(int*)&x); * low word of x *\r | |
26 | to dig two 32 bit words out of the 64 bit IEEE floating point\r | |
27 | value. That is non-ANSI, and, moreover, the gcc instruction\r | |
28 | scheduler gets it wrong. We instead use the following macros.\r | |
29 | Unlike the original code, we determine the endianness at compile\r | |
30 | time, not at run time; I don't see much benefit to selecting\r | |
31 | endianness at run time. */\r | |
32 | \r | |
33 | /* A union which permits us to convert between a double and two 32 bit\r | |
34 | ints. */\r | |
35 | \r | |
36 | /*\r | |
37 | * The ARM ports are little endian except for the FPA word order which is\r | |
38 | * big endian.\r | |
39 | */\r | |
40 | \r | |
41 | #if (BYTE_ORDER == BIG_ENDIAN) || (defined(__arm__) && !defined(__VFP_FP__))\r | |
42 | \r | |
43 | typedef union\r | |
44 | {\r | |
45 | double value;\r | |
46 | struct\r | |
47 | {\r | |
48 | u_int32_t msw;\r | |
49 | u_int32_t lsw;\r | |
50 | } parts;\r | |
51 | } ieee_double_shape_type;\r | |
52 | \r | |
53 | #endif\r | |
54 | \r | |
55 | #if (BYTE_ORDER == LITTLE_ENDIAN) && \\r | |
56 | !(defined(__arm__) && !defined(__VFP_FP__))\r | |
57 | \r | |
58 | typedef union\r | |
59 | {\r | |
60 | double value;\r | |
61 | struct\r | |
62 | {\r | |
63 | u_int32_t lsw;\r | |
64 | u_int32_t msw;\r | |
65 | } parts;\r | |
66 | } ieee_double_shape_type;\r | |
67 | \r | |
68 | #endif\r | |
69 | \r | |
70 | /* Get two 32 bit ints from a double. */\r | |
71 | \r | |
72 | #define EXTRACT_WORDS(ix0,ix1,d) \\r | |
73 | do { \\r | |
74 | ieee_double_shape_type ew_u; \\r | |
75 | ew_u.value = (d); \\r | |
76 | (ix0) = ew_u.parts.msw; \\r | |
77 | (ix1) = ew_u.parts.lsw; \\r | |
78 | } while (0)\r | |
79 | \r | |
80 | /* Get the more significant 32 bit int from a double. */\r | |
81 | \r | |
82 | #define GET_HIGH_WORD(i,d) \\r | |
83 | do { \\r | |
84 | ieee_double_shape_type gh_u; \\r | |
85 | gh_u.value = (d); \\r | |
86 | (i) = gh_u.parts.msw; \\r | |
87 | } while (0)\r | |
88 | \r | |
89 | /* Get the less significant 32 bit int from a double. */\r | |
90 | \r | |
91 | #define GET_LOW_WORD(i,d) \\r | |
92 | do { \\r | |
93 | ieee_double_shape_type gl_u; \\r | |
94 | gl_u.value = (d); \\r | |
95 | (i) = gl_u.parts.lsw; \\r | |
96 | } while (0)\r | |
97 | \r | |
98 | /* Set a double from two 32 bit ints. */\r | |
99 | \r | |
100 | #define INSERT_WORDS(d,ix0,ix1) \\r | |
101 | do { \\r | |
102 | ieee_double_shape_type iw_u; \\r | |
103 | iw_u.parts.msw = (ix0); \\r | |
104 | iw_u.parts.lsw = (ix1); \\r | |
105 | (d) = iw_u.value; \\r | |
106 | } while (0)\r | |
107 | \r | |
108 | /* Set the more significant 32 bits of a double from an int. */\r | |
109 | \r | |
110 | #define SET_HIGH_WORD(d,v) \\r | |
111 | do { \\r | |
112 | ieee_double_shape_type sh_u; \\r | |
113 | sh_u.value = (d); \\r | |
114 | sh_u.parts.msw = (v); \\r | |
115 | (d) = sh_u.value; \\r | |
116 | } while (0)\r | |
117 | \r | |
118 | /* Set the less significant 32 bits of a double from an int. */\r | |
119 | \r | |
120 | #define SET_LOW_WORD(d,v) \\r | |
121 | do { \\r | |
122 | ieee_double_shape_type sl_u; \\r | |
123 | sl_u.value = (d); \\r | |
124 | sl_u.parts.lsw = (v); \\r | |
125 | (d) = sl_u.value; \\r | |
126 | } while (0)\r | |
127 | \r | |
128 | /* A union which permits us to convert between a float and a 32 bit\r | |
129 | int. */\r | |
130 | \r | |
131 | typedef union\r | |
132 | {\r | |
133 | float value;\r | |
134 | u_int32_t word;\r | |
135 | } ieee_float_shape_type;\r | |
136 | \r | |
137 | /* Get a 32 bit int from a float. */\r | |
138 | \r | |
139 | #define GET_FLOAT_WORD(i,d) \\r | |
140 | do { \\r | |
141 | ieee_float_shape_type gf_u; \\r | |
142 | gf_u.value = (d); \\r | |
143 | (i) = gf_u.word; \\r | |
144 | } while (0)\r | |
145 | \r | |
146 | /* Set a float from a 32 bit int. */\r | |
147 | \r | |
148 | #define SET_FLOAT_WORD(d,i) \\r | |
149 | do { \\r | |
150 | ieee_float_shape_type sf_u; \\r | |
151 | sf_u.word = (i); \\r | |
152 | (d) = sf_u.value; \\r | |
153 | } while (0)\r | |
154 | \r | |
155 | /* ieee style elementary functions */\r | |
156 | extern double __ieee754_sqrt (double);\r | |
157 | extern double __ieee754_acos (double);\r | |
158 | extern double __ieee754_acosh (double);\r | |
159 | extern double __ieee754_log (double);\r | |
160 | extern double __ieee754_atanh (double);\r | |
161 | extern double __ieee754_asin (double);\r | |
162 | extern double __ieee754_atan2 (double, double);\r | |
163 | extern double __ieee754_exp (double);\r | |
164 | extern double __ieee754_cosh (double);\r | |
165 | extern double __ieee754_fmod (double, double);\r | |
166 | extern double __ieee754_pow (double, double);\r | |
167 | extern double __ieee754_lgamma_r (double, int *);\r | |
168 | extern double __ieee754_gamma_r (double, int *);\r | |
169 | extern double __ieee754_lgamma (double);\r | |
170 | extern double __ieee754_gamma (double);\r | |
171 | extern double __ieee754_log10 (double);\r | |
172 | extern double __ieee754_log2 (double);\r | |
173 | extern double __ieee754_sinh (double);\r | |
174 | extern double __ieee754_hypot (double, double);\r | |
175 | extern double __ieee754_j0 (double);\r | |
176 | extern double __ieee754_j1 (double);\r | |
177 | extern double __ieee754_y0 (double);\r | |
178 | extern double __ieee754_y1 (double);\r | |
179 | extern double __ieee754_jn (int, double);\r | |
180 | extern double __ieee754_yn (int, double);\r | |
181 | extern double __ieee754_remainder (double, double);\r | |
182 | extern int __ieee754_rem_pio2 (double,double*);\r | |
183 | extern double __ieee754_scalb (double, double);\r | |
184 | \r | |
185 | /* fdlibm kernel function */\r | |
186 | extern double __kernel_standard (double, double, int);\r | |
187 | extern double __kernel_sin (double, double, int);\r | |
188 | extern double __kernel_cos (double, double);\r | |
189 | extern double __kernel_tan (double, double, int);\r | |
190 | extern int __kernel_rem_pio2 (double*,double*,int,int,int,const int*);\r | |
191 | \r | |
192 | \r | |
193 | ///* ieee style elementary float functions */\r | |
194 | //extern float __ieee754_sqrtf __P((float));\r | |
195 | //extern float __ieee754_acosf __P((float));\r | |
196 | //extern float __ieee754_acoshf __P((float));\r | |
197 | //extern float __ieee754_logf __P((float));\r | |
198 | //extern float __ieee754_atanhf __P((float));\r | |
199 | //extern float __ieee754_asinf __P((float));\r | |
200 | //extern float __ieee754_atan2f __P((float,float));\r | |
201 | //extern float __ieee754_expf __P((float));\r | |
202 | //extern float __ieee754_coshf __P((float));\r | |
203 | //extern float __ieee754_fmodf __P((float,float));\r | |
204 | //extern float __ieee754_powf __P((float,float));\r | |
205 | //extern float __ieee754_lgammaf_r __P((float,int *));\r | |
206 | //extern float __ieee754_gammaf_r __P((float,int *));\r | |
207 | //extern float __ieee754_lgammaf __P((float));\r | |
208 | //extern float __ieee754_gammaf __P((float));\r | |
209 | //extern float __ieee754_log10f __P((float));\r | |
210 | //extern float __ieee754_log2f __P((float));\r | |
211 | //extern float __ieee754_sinhf __P((float));\r | |
212 | //extern float __ieee754_hypotf __P((float,float));\r | |
213 | //extern float __ieee754_j0f __P((float));\r | |
214 | //extern float __ieee754_j1f __P((float));\r | |
215 | //extern float __ieee754_y0f __P((float));\r | |
216 | //extern float __ieee754_y1f __P((float));\r | |
217 | //extern float __ieee754_jnf __P((int,float));\r | |
218 | //extern float __ieee754_ynf __P((int,float));\r | |
219 | //extern float __ieee754_remainderf __P((float,float));\r | |
220 | //extern int __ieee754_rem_pio2f __P((float,float*));\r | |
221 | //extern float __ieee754_scalbf __P((float,float));\r | |
222 | \r | |
223 | ///* float versions of fdlibm kernel functions */\r | |
224 | //extern float __kernel_sinf __P((float,float,int));\r | |
225 | //extern float __kernel_cosf __P((float,float));\r | |
226 | //extern float __kernel_tanf __P((float,float,int));\r | |
227 | //extern int __kernel_rem_pio2f __P((float*,float*,int,int,int,const int*));\r | |
228 | \r | |
229 | #endif /* _MATH_PRIVATE_H_ */\r |