Annotation of sys/lib/libkern/softfloat.h, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: softfloat.h,v 1.1 2002/04/28 20:55:14 pvalchev Exp $ */
2: /* $NetBSD: softfloat.h,v 1.1 2001/04/26 03:10:48 ross Exp $ */
3:
4: /* This is a derivative work. */
5:
6: /*-
7: * Copyright (c) 2001 The NetBSD Foundation, Inc.
8: * All rights reserved.
9: *
10: * This code is derived from software contributed to The NetBSD Foundation
11: * by Ross Harvey.
12: *
13: * Redistribution and use in source and binary forms, with or without
14: * modification, are permitted provided that the following conditions
15: * are met:
16: * 1. Redistributions of source code must retain the above copyright
17: * notice, this list of conditions and the following disclaimer.
18: * 2. Redistributions in binary form must reproduce the above copyright
19: * notice, this list of conditions and the following disclaimer in the
20: * documentation and/or other materials provided with the distribution.
21: * 3. All advertising materials mentioning features or use of this software
22: * must display the following acknowledgement:
23: * This product includes software developed by the NetBSD
24: * Foundation, Inc. and its contributors.
25: * 4. Neither the name of The NetBSD Foundation nor the names of its
26: * contributors may be used to endorse or promote products derived
27: * from this software without specific prior written permission.
28: *
29: * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
30: * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
31: * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
32: * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
33: * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
34: * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
35: * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
36: * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
37: * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
38: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
39: * POSSIBILITY OF SUCH DAMAGE.
40: */
41:
42: /*
43: ===============================================================================
44:
45: This C header file is part of the SoftFloat IEC/IEEE Floating-point
46: Arithmetic Package, Release 2a.
47:
48: Written by John R. Hauser. This work was made possible in part by the
49: International Computer Science Institute, located at Suite 600, 1947 Center
50: Street, Berkeley, California 94704. Funding was partially provided by the
51: National Science Foundation under grant MIP-9311980. The original version
52: of this code was written as part of a project to build a fixed-point vector
53: processor in collaboration with the University of California at Berkeley,
54: overseen by Profs. Nelson Morgan and John Wawrzynek. More information
55: is available through the Web page `http://HTTP.CS.Berkeley.EDU/~jhauser/
56: arithmetic/SoftFloat.html'.
57:
58: THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE. Although reasonable
59: effort has been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT
60: WILL AT TIMES RESULT IN INCORRECT BEHAVIOR. USE OF THIS SOFTWARE IS
61: RESTRICTED TO PERSONS AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL
62: RESPONSIBILITY FOR ALL LOSSES, COSTS, OR OTHER PROBLEMS ARISING FROM
63: THEIR OWN USE OF THE SOFTWARE, AND WHO ALSO EFFECTIVELY INDEMNIFY
64: (possibly via similar legal warning) JOHN HAUSER AND THE INTERNATIONAL
65: COMPUTER SCIENCE INSTITUTE AGAINST ALL LOSSES, COSTS, OR OTHER PROBLEMS
66: ARISING FROM THE USE OF THE SOFTWARE BY THEIR CUSTOMERS AND CLIENTS.
67:
68: Derivative works are acceptable, even for commercial purposes, so long as
69: (1) they include prominent notice that the work is derivative, and (2) they
70: include prominent notice akin to these four paragraphs for those parts of
71: this code that are retained.
72:
73: ===============================================================================
74: */
75:
76: #ifndef NO_IEEE
77:
78: #include <sys/types.h>
79:
80: #if !defined(_KERNEL) && !defined(_STANDALONE)
81: #include <ieeefp.h>
82: #else
83: #include "machine/ieeefp.h"
84: #endif
85: #include <sys/endian.h>
86:
87: /*
88: -------------------------------------------------------------------------------
89: The macro `FLOATX80' must be defined to enable the extended double-precision
90: floating-point format `floatx80'. If this macro is not defined, the
91: `floatx80' type will not be defined, and none of the functions that either
92: input or output the `floatx80' type will be defined. The same applies to
93: the `FLOAT128' macro and the quadruple-precision format `float128'.
94: -------------------------------------------------------------------------------
95: */
96: /* #define FLOATX80 */
97: /* #define FLOAT128 */
98:
99: /*
100: -------------------------------------------------------------------------------
101: Software IEC/IEEE floating-point types.
102: -------------------------------------------------------------------------------
103: */
104: typedef u_int32_t float32;
105: typedef u_int64_t float64;
106: #ifdef FLOATX80
107: typedef struct {
108: #if BYTE_ORDER == BIG_ENDIAN
109: u_int16_t high;
110: u_int64_t low;
111: #else
112: u_int64_t low;
113: u_int16_t high;
114: #endif
115: } floatx80;
116: #endif
117: #ifdef FLOAT128
118: typedef struct {
119: u_int64_t high, low;
120: } float128;
121: #endif
122:
123: /*
124: * Some of the global variables that used to be here have been removed for
125: * fairly obvious (defopt-MULTIPROCESSOR) reasons. The rest (which don't
126: * change dynamically) will be removed later. [ross]
127: */
128:
129: #define float_rounding_mode() fpgetround()
130:
131: /*
132: -------------------------------------------------------------------------------
133: Software IEC/IEEE floating-point underflow tininess-detection mode.
134: -------------------------------------------------------------------------------
135: */
136:
137: extern int float_detect_tininess;
138: enum {
139: float_tininess_after_rounding = 1,
140: float_tininess_before_rounding = 0
141: };
142:
143: /*
144: -------------------------------------------------------------------------------
145: Software IEC/IEEE floating-point rounding mode.
146: -------------------------------------------------------------------------------
147: */
148:
149: enum {
150: float_round_nearest_even = FP_RN,
151: float_round_to_zero = FP_RZ,
152: float_round_down = FP_RM,
153: float_round_up = FP_RP
154: };
155:
156: /*
157: -------------------------------------------------------------------------------
158: Software IEC/IEEE floating-point exception flags.
159: -------------------------------------------------------------------------------
160: */
161:
162: enum {
163: float_flag_inexact = FP_X_IMP,
164: float_flag_underflow = FP_X_UFL,
165: float_flag_overflow = FP_X_OFL,
166: float_flag_divbyzero = FP_X_DZ,
167: float_flag_invalid = FP_X_INV
168: };
169:
170: /*
171: -------------------------------------------------------------------------------
172: Software IEC/IEEE integer-to-floating-point conversion routines.
173: -------------------------------------------------------------------------------
174: */
175: float32 int32_to_float32( int );
176: float64 int32_to_float64( int );
177: #ifdef FLOATX80
178: floatx80 int32_to_floatx80( int );
179: #endif
180: #ifdef FLOAT128
181: float128 int32_to_float128( int );
182: #endif
183: #ifndef SOFTFLOAT_FOR_GCC /* __floatdi?f is in libgcc2.c */
184: float32 int64_to_float32( int64_t );
185: float64 int64_to_float64( int64_t );
186: #ifdef FLOATX80
187: floatx80 int64_to_floatx80( int64_t );
188: #endif
189: #ifdef FLOAT128
190: float128 int64_to_float128( int64_t );
191: #endif
192: #endif
193:
194: /*
195: -------------------------------------------------------------------------------
196: Software IEC/IEEE single-precision conversion routines.
197: -------------------------------------------------------------------------------
198: */
199: int float32_to_int32( float32 );
200: int float32_to_int32_round_to_zero( float32 );
201: #ifndef SOFTFLOAT_FOR_GCC /* __fix?fdi provided by libgcc2.c */
202: int64_t float32_to_int64( float32 );
203: int64_t float32_to_int64_round_to_zero( float32 );
204: #endif
205: float64 float32_to_float64( float32 );
206: #ifdef FLOATX80
207: floatx80 float32_to_floatx80( float32 );
208: #endif
209: #ifdef FLOAT128
210: float128 float32_to_float128( float32 );
211: #endif
212:
213: /*
214: -------------------------------------------------------------------------------
215: Software IEC/IEEE single-precision operations.
216: -------------------------------------------------------------------------------
217: */
218: float32 float32_round_to_int( float32 );
219: float32 float32_add( float32, float32 );
220: float32 float32_sub( float32, float32 );
221: float32 float32_mul( float32, float32 );
222: float32 float32_div( float32, float32 );
223: float32 float32_rem( float32, float32 );
224: float32 float32_sqrt( float32 );
225: int float32_eq( float32, float32 );
226: int float32_le( float32, float32 );
227: int float32_lt( float32, float32 );
228: int float32_eq_signaling( float32, float32 );
229: int float32_le_quiet( float32, float32 );
230: int float32_lt_quiet( float32, float32 );
231: #ifndef SOFTFLOAT_FOR_GCC
232: int float32_is_signaling_nan( float32 );
233: #endif
234:
235: /*
236: -------------------------------------------------------------------------------
237: Software IEC/IEEE double-precision conversion routines.
238: -------------------------------------------------------------------------------
239: */
240: int float64_to_int32( float64 );
241: int float64_to_int32_round_to_zero( float64 );
242: #ifndef SOFTFLOAT_FOR_GCC /* __fix?fdi provided by libgcc2.c */
243: int64_t float64_to_int64( float64 );
244: int64_t float64_to_int64_round_to_zero( float64 );
245: #endif
246: float32 float64_to_float32( float64 );
247: #ifdef FLOATX80
248: floatx80 float64_to_floatx80( float64 );
249: #endif
250: #ifdef FLOAT128
251: float128 float64_to_float128( float64 );
252: #endif
253:
254: /*
255: -------------------------------------------------------------------------------
256: Software IEC/IEEE double-precision operations.
257: -------------------------------------------------------------------------------
258: */
259: #define float64_default_nan 0xFFF8000000000000LL
260:
261: static __inline int
262: float64_is_nan(float64 a)
263: {
264: return 0xFFE0000000000000LL < a << 1;
265: }
266:
267: static __inline int
268: float64_is_signaling_nan(float64 a)
269: {
270: return (a >> 51 & 0xFFF) == 0xFFE && (a & 0x0007FFFFFFFFFFFFLL);
271: }
272:
273: float64 float64_round_to_int( float64 );
274: float64 float64_add( float64, float64 );
275: float64 float64_sub( float64, float64 );
276: float64 float64_mul( float64, float64 );
277: float64 float64_div( float64, float64 );
278: float64 float64_rem( float64, float64 );
279: float64 float64_sqrt( float64 );
280: int float64_eq( float64, float64 );
281: int float64_le( float64, float64 );
282: int float64_lt( float64, float64 );
283: int float64_eq_signaling( float64, float64 );
284: int float64_le_quiet( float64, float64 );
285: int float64_lt_quiet( float64, float64 );
286: #ifndef SOFTFLOAT_FOR_GCC
287: int float64_is_signaling_nan( float64 );
288: #endif
289:
290: #ifdef FLOATX80
291:
292: /*
293: -------------------------------------------------------------------------------
294: Software IEC/IEEE extended double-precision conversion routines.
295: -------------------------------------------------------------------------------
296: */
297: int floatx80_to_int32( floatx80 );
298: int floatx80_to_int32_round_to_zero( floatx80 );
299: int64_t floatx80_to_int64( floatx80 );
300: int64_t floatx80_to_int64_round_to_zero( floatx80 );
301: float32 floatx80_to_float32( floatx80 );
302: float64 floatx80_to_float64( floatx80 );
303: #ifdef FLOAT128
304: float128 floatx80_to_float128( floatx80 );
305: #endif
306:
307: /*
308: -------------------------------------------------------------------------------
309: Software IEC/IEEE extended double-precision rounding precision. Valid
310: values are 32, 64, and 80.
311: -------------------------------------------------------------------------------
312: */
313: extern int floatx80_rounding_precision;
314:
315: /*
316: -------------------------------------------------------------------------------
317: Software IEC/IEEE extended double-precision operations.
318: -------------------------------------------------------------------------------
319: */
320: floatx80 floatx80_round_to_int( floatx80 );
321: floatx80 floatx80_add( floatx80, floatx80 );
322: floatx80 floatx80_sub( floatx80, floatx80 );
323: floatx80 floatx80_mul( floatx80, floatx80 );
324: floatx80 floatx80_div( floatx80, floatx80 );
325: floatx80 floatx80_rem( floatx80, floatx80 );
326: floatx80 floatx80_sqrt( floatx80 );
327: int floatx80_eq( floatx80, floatx80 );
328: int floatx80_le( floatx80, floatx80 );
329: int floatx80_lt( floatx80, floatx80 );
330: int floatx80_eq_signaling( floatx80, floatx80 );
331: int floatx80_le_quiet( floatx80, floatx80 );
332: int floatx80_lt_quiet( floatx80, floatx80 );
333: int floatx80_is_signaling_nan( floatx80 );
334:
335: #endif
336:
337: #ifdef FLOAT128
338:
339: /*
340: -------------------------------------------------------------------------------
341: Software IEC/IEEE quadruple-precision conversion routines.
342: -------------------------------------------------------------------------------
343: */
344: int float128_to_int32( float128 );
345: int float128_to_int32_round_to_zero( float128 );
346: int64_t float128_to_int64( float128 );
347: int64_t float128_to_int64_round_to_zero( float128 );
348: float32 float128_to_float32( float128 );
349: float64 float128_to_float64( float128 );
350: #ifdef FLOATX80
351: floatx80 float128_to_floatx80( float128 );
352: #endif
353:
354: /*
355: -------------------------------------------------------------------------------
356: Software IEC/IEEE quadruple-precision operations.
357: -------------------------------------------------------------------------------
358: */
359: float128 float128_round_to_int( float128 );
360: float128 float128_add( float128, float128 );
361: float128 float128_sub( float128, float128 );
362: float128 float128_mul( float128, float128 );
363: float128 float128_div( float128, float128 );
364: float128 float128_rem( float128, float128 );
365: float128 float128_sqrt( float128 );
366: int float128_eq( float128, float128 );
367: int float128_le( float128, float128 );
368: int float128_lt( float128, float128 );
369: int float128_eq_signaling( float128, float128 );
370: int float128_le_quiet( float128, float128 );
371: int float128_lt_quiet( float128, float128 );
372: int float128_is_signaling_nan( float128 );
373:
374: #endif
375:
376: #endif /* !NO_IEEE */
CVSweb