VirtualBox

source: vbox/trunk/src/recompiler/fpu/softfloat-native.h@ 5926

Last change on this file since 5926 was 1, checked in by vboxsync, 55 years ago

import

File size: 10.1 KB
Line 
1/* Native implementation of soft float functions */
2#include <math.h>
3
4#if (defined(_BSD) && !defined(__APPLE__)) || defined(HOST_SOLARIS)
5#include <ieeefp.h>
6#define fabsf(f) ((float)fabs(f))
7#else
8#include <fenv.h>
9#endif
10
11/*
12 * Define some C99-7.12.3 classification macros and
13 * some C99-.12.4 for Solaris systems OS less than 10,
14 * or Solaris 10 systems running GCC 3.x or less.
15 * Solaris 10 with GCC4 does not need these macros as they
16 * are defined in <iso/math_c99.h> with a compiler directive
17 */
18#if defined(HOST_SOLARIS) && (( HOST_SOLARIS <= 9 ) || ( ( HOST_SOLARIS >= 10 ) && ( __GNUC__ <= 4) ))
19/*
20 * C99 7.12.3 classification macros
21 * and
22 * C99 7.12.14 comparison macros
23 *
24 * ... do not work on Solaris 10 using GNU CC 3.4.x.
25 * Try to workaround the missing / broken C99 math macros.
26 */
27
28#define isnormal(x) (fpclass(x) >= FP_NZERO)
29#define isgreater(x, y) ((!unordered(x, y)) && ((x) > (y)))
30#define isgreaterequal(x, y) ((!unordered(x, y)) && ((x) >= (y)))
31#define isless(x, y) ((!unordered(x, y)) && ((x) < (y)))
32#define islessequal(x, y) ((!unordered(x, y)) && ((x) <= (y)))
33#define isunordered(x,y) unordered(x, y)
34#endif
35
36typedef float float32;
37typedef double float64;
38#ifdef FLOATX80
39typedef long double floatx80;
40#endif
41
42typedef union {
43 float32 f;
44 uint32_t i;
45} float32u;
46typedef union {
47 float64 f;
48 uint64_t i;
49} float64u;
50#ifdef FLOATX80
51typedef union {
52 floatx80 f;
53 struct {
54 uint64_t low;
55 uint16_t high;
56 } i;
57} floatx80u;
58#endif
59
60/*----------------------------------------------------------------------------
61| Software IEC/IEEE floating-point rounding mode.
62*----------------------------------------------------------------------------*/
63#if (defined(_BSD) && !defined(__APPLE__)) || defined(HOST_SOLARIS)
64enum {
65 float_round_nearest_even = FP_RN,
66 float_round_down = FP_RM,
67 float_round_up = FP_RP,
68 float_round_to_zero = FP_RZ
69};
70#elif defined(__arm__)
71enum {
72 float_round_nearest_even = 0,
73 float_round_down = 1,
74 float_round_up = 2,
75 float_round_to_zero = 3
76};
77#else
78enum {
79 float_round_nearest_even = FE_TONEAREST,
80 float_round_down = FE_DOWNWARD,
81 float_round_up = FE_UPWARD,
82 float_round_to_zero = FE_TOWARDZERO
83};
84#endif
85
86typedef struct float_status {
87 signed char float_rounding_mode;
88#ifdef FLOATX80
89 signed char floatx80_rounding_precision;
90#endif
91} float_status;
92
93void set_float_rounding_mode(int val STATUS_PARAM);
94#ifdef FLOATX80
95void set_floatx80_rounding_precision(int val STATUS_PARAM);
96#endif
97
98/*----------------------------------------------------------------------------
99| Software IEC/IEEE integer-to-floating-point conversion routines.
100*----------------------------------------------------------------------------*/
101float32 int32_to_float32( int STATUS_PARAM);
102float64 int32_to_float64( int STATUS_PARAM);
103#ifdef FLOATX80
104floatx80 int32_to_floatx80( int STATUS_PARAM);
105#endif
106#ifdef FLOAT128
107float128 int32_to_float128( int STATUS_PARAM);
108#endif
109float32 int64_to_float32( int64_t STATUS_PARAM);
110float64 int64_to_float64( int64_t STATUS_PARAM);
111#ifdef FLOATX80
112floatx80 int64_to_floatx80( int64_t STATUS_PARAM);
113#endif
114#ifdef FLOAT128
115float128 int64_to_float128( int64_t STATUS_PARAM);
116#endif
117
118/*----------------------------------------------------------------------------
119| Software IEC/IEEE single-precision conversion routines.
120*----------------------------------------------------------------------------*/
121int float32_to_int32( float32 STATUS_PARAM);
122int float32_to_int32_round_to_zero( float32 STATUS_PARAM);
123int64_t float32_to_int64( float32 STATUS_PARAM);
124int64_t float32_to_int64_round_to_zero( float32 STATUS_PARAM);
125float64 float32_to_float64( float32 STATUS_PARAM);
126#ifdef FLOATX80
127floatx80 float32_to_floatx80( float32 STATUS_PARAM);
128#endif
129#ifdef FLOAT128
130float128 float32_to_float128( float32 STATUS_PARAM);
131#endif
132
133/*----------------------------------------------------------------------------
134| Software IEC/IEEE single-precision operations.
135*----------------------------------------------------------------------------*/
136float32 float32_round_to_int( float32 STATUS_PARAM);
137INLINE float32 float32_add( float32 a, float32 b STATUS_PARAM)
138{
139 return a + b;
140}
141INLINE float32 float32_sub( float32 a, float32 b STATUS_PARAM)
142{
143 return a - b;
144}
145INLINE float32 float32_mul( float32 a, float32 b STATUS_PARAM)
146{
147 return a * b;
148}
149INLINE float32 float32_div( float32 a, float32 b STATUS_PARAM)
150{
151 return a / b;
152}
153float32 float32_rem( float32, float32 STATUS_PARAM);
154float32 float32_sqrt( float32 STATUS_PARAM);
155INLINE int float32_eq( float32 a, float32 b STATUS_PARAM)
156{
157 return a == b;
158}
159INLINE int float32_le( float32 a, float32 b STATUS_PARAM)
160{
161 return a <= b;
162}
163INLINE int float32_lt( float32 a, float32 b STATUS_PARAM)
164{
165 return a < b;
166}
167INLINE int float32_eq_signaling( float32 a, float32 b STATUS_PARAM)
168{
169 return a <= b && a >= b;
170}
171INLINE int float32_le_quiet( float32 a, float32 b STATUS_PARAM)
172{
173 return islessequal(a, b);
174}
175INLINE int float32_lt_quiet( float32 a, float32 b STATUS_PARAM)
176{
177 return isless(a, b);
178}
179INLINE int float32_unordered( float32 a, float32 b STATUS_PARAM)
180{
181 return isunordered(a, b);
182
183}
184int float32_compare( float32, float32 STATUS_PARAM );
185int float32_compare_quiet( float32, float32 STATUS_PARAM );
186int float32_is_signaling_nan( float32 );
187
188INLINE float32 float32_abs(float32 a)
189{
190 return fabsf(a);
191}
192
193INLINE float32 float32_chs(float32 a)
194{
195 return -a;
196}
197
198/*----------------------------------------------------------------------------
199| Software IEC/IEEE double-precision conversion routines.
200*----------------------------------------------------------------------------*/
201int float64_to_int32( float64 STATUS_PARAM );
202int float64_to_int32_round_to_zero( float64 STATUS_PARAM );
203int64_t float64_to_int64( float64 STATUS_PARAM );
204int64_t float64_to_int64_round_to_zero( float64 STATUS_PARAM );
205float32 float64_to_float32( float64 STATUS_PARAM );
206#ifdef FLOATX80
207floatx80 float64_to_floatx80( float64 STATUS_PARAM );
208#endif
209#ifdef FLOAT128
210float128 float64_to_float128( float64 STATUS_PARAM );
211#endif
212
213/*----------------------------------------------------------------------------
214| Software IEC/IEEE double-precision operations.
215*----------------------------------------------------------------------------*/
216float64 float64_round_to_int( float64 STATUS_PARAM );
217float64 float64_trunc_to_int( float64 STATUS_PARAM );
218INLINE float64 float64_add( float64 a, float64 b STATUS_PARAM)
219{
220 return a + b;
221}
222INLINE float64 float64_sub( float64 a, float64 b STATUS_PARAM)
223{
224 return a - b;
225}
226INLINE float64 float64_mul( float64 a, float64 b STATUS_PARAM)
227{
228 return a * b;
229}
230INLINE float64 float64_div( float64 a, float64 b STATUS_PARAM)
231{
232 return a / b;
233}
234float64 float64_rem( float64, float64 STATUS_PARAM );
235float64 float64_sqrt( float64 STATUS_PARAM );
236INLINE int float64_eq( float64 a, float64 b STATUS_PARAM)
237{
238 return a == b;
239}
240INLINE int float64_le( float64 a, float64 b STATUS_PARAM)
241{
242 return a <= b;
243}
244INLINE int float64_lt( float64 a, float64 b STATUS_PARAM)
245{
246 return a < b;
247}
248INLINE int float64_eq_signaling( float64 a, float64 b STATUS_PARAM)
249{
250 return a <= b && a >= b;
251}
252INLINE int float64_le_quiet( float64 a, float64 b STATUS_PARAM)
253{
254 return islessequal(a, b);
255}
256INLINE int float64_lt_quiet( float64 a, float64 b STATUS_PARAM)
257{
258 return isless(a, b);
259
260}
261INLINE int float64_unordered( float64 a, float64 b STATUS_PARAM)
262{
263 return isunordered(a, b);
264
265}
266int float64_compare( float64, float64 STATUS_PARAM );
267int float64_compare_quiet( float64, float64 STATUS_PARAM );
268int float64_is_signaling_nan( float64 );
269int float64_is_nan( float64 );
270
271INLINE float64 float64_abs(float64 a)
272{
273 return fabs(a);
274}
275
276INLINE float64 float64_chs(float64 a)
277{
278 return -a;
279}
280
281#ifdef FLOATX80
282
283/*----------------------------------------------------------------------------
284| Software IEC/IEEE extended double-precision conversion routines.
285*----------------------------------------------------------------------------*/
286int floatx80_to_int32( floatx80 STATUS_PARAM );
287int floatx80_to_int32_round_to_zero( floatx80 STATUS_PARAM );
288int64_t floatx80_to_int64( floatx80 STATUS_PARAM);
289int64_t floatx80_to_int64_round_to_zero( floatx80 STATUS_PARAM);
290float32 floatx80_to_float32( floatx80 STATUS_PARAM );
291float64 floatx80_to_float64( floatx80 STATUS_PARAM );
292#ifdef FLOAT128
293float128 floatx80_to_float128( floatx80 STATUS_PARAM );
294#endif
295
296/*----------------------------------------------------------------------------
297| Software IEC/IEEE extended double-precision operations.
298*----------------------------------------------------------------------------*/
299floatx80 floatx80_round_to_int( floatx80 STATUS_PARAM );
300INLINE floatx80 floatx80_add( floatx80 a, floatx80 b STATUS_PARAM)
301{
302 return a + b;
303}
304INLINE floatx80 floatx80_sub( floatx80 a, floatx80 b STATUS_PARAM)
305{
306 return a - b;
307}
308INLINE floatx80 floatx80_mul( floatx80 a, floatx80 b STATUS_PARAM)
309{
310 return a * b;
311}
312INLINE floatx80 floatx80_div( floatx80 a, floatx80 b STATUS_PARAM)
313{
314 return a / b;
315}
316floatx80 floatx80_rem( floatx80, floatx80 STATUS_PARAM );
317floatx80 floatx80_sqrt( floatx80 STATUS_PARAM );
318INLINE int floatx80_eq( floatx80 a, floatx80 b STATUS_PARAM)
319{
320 return a == b;
321}
322INLINE int floatx80_le( floatx80 a, floatx80 b STATUS_PARAM)
323{
324 return a <= b;
325}
326INLINE int floatx80_lt( floatx80 a, floatx80 b STATUS_PARAM)
327{
328 return a < b;
329}
330INLINE int floatx80_eq_signaling( floatx80 a, floatx80 b STATUS_PARAM)
331{
332 return a <= b && a >= b;
333}
334INLINE int floatx80_le_quiet( floatx80 a, floatx80 b STATUS_PARAM)
335{
336 return islessequal(a, b);
337}
338INLINE int floatx80_lt_quiet( floatx80 a, floatx80 b STATUS_PARAM)
339{
340 return isless(a, b);
341
342}
343INLINE int floatx80_unordered( floatx80 a, floatx80 b STATUS_PARAM)
344{
345 return isunordered(a, b);
346
347}
348int floatx80_compare( floatx80, floatx80 STATUS_PARAM );
349int floatx80_compare_quiet( floatx80, floatx80 STATUS_PARAM );
350int floatx80_is_signaling_nan( floatx80 );
351
352INLINE floatx80 floatx80_abs(floatx80 a)
353{
354 return fabsl(a);
355}
356
357INLINE floatx80 floatx80_chs(floatx80 a)
358{
359 return -a;
360}
361#endif
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette