softfloat.h revision 1.1.4.2 1 1.1.4.2 tls /* $NetBSD: softfloat.h,v 1.1.4.2 2014/08/20 00:02:08 tls Exp $ */
2 1.1.4.2 tls
3 1.1.4.2 tls /* This is a derivative work. */
4 1.1.4.2 tls
5 1.1.4.2 tls /*
6 1.1.4.2 tls ===============================================================================
7 1.1.4.2 tls
8 1.1.4.2 tls This C header file is part of the SoftFloat IEC/IEEE Floating-point
9 1.1.4.2 tls Arithmetic Package, Release 2a.
10 1.1.4.2 tls
11 1.1.4.2 tls Written by John R. Hauser. This work was made possible in part by the
12 1.1.4.2 tls International Computer Science Institute, located at Suite 600, 1947 Center
13 1.1.4.2 tls Street, Berkeley, California 94704. Funding was partially provided by the
14 1.1.4.2 tls National Science Foundation under grant MIP-9311980. The original version
15 1.1.4.2 tls of this code was written as part of a project to build a fixed-point vector
16 1.1.4.2 tls processor in collaboration with the University of California at Berkeley,
17 1.1.4.2 tls overseen by Profs. Nelson Morgan and John Wawrzynek. More information
18 1.1.4.2 tls is available through the Web page `http://HTTP.CS.Berkeley.EDU/~jhauser/
19 1.1.4.2 tls arithmetic/SoftFloat.html'.
20 1.1.4.2 tls
21 1.1.4.2 tls THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE. Although reasonable effort
22 1.1.4.2 tls has been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT
23 1.1.4.2 tls TIMES RESULT IN INCORRECT BEHAVIOR. USE OF THIS SOFTWARE IS RESTRICTED TO
24 1.1.4.2 tls PERSONS AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ANY
25 1.1.4.2 tls AND ALL LOSSES, COSTS, OR OTHER PROBLEMS ARISING FROM ITS USE.
26 1.1.4.2 tls
27 1.1.4.2 tls Derivative works are acceptable, even for commercial purposes, so long as
28 1.1.4.2 tls (1) they include prominent notice that the work is derivative, and (2) they
29 1.1.4.2 tls include prominent notice akin to these four paragraphs for those parts of
30 1.1.4.2 tls this code that are retained.
31 1.1.4.2 tls
32 1.1.4.2 tls ===============================================================================
33 1.1.4.2 tls */
34 1.1.4.2 tls
35 1.1.4.2 tls /*
36 1.1.4.2 tls -------------------------------------------------------------------------------
37 1.1.4.2 tls The macro `FLOATX80' must be defined to enable the extended double-precision
38 1.1.4.2 tls floating-point format `floatx80'. If this macro is not defined, the
39 1.1.4.2 tls `floatx80' type will not be defined, and none of the functions that either
40 1.1.4.2 tls input or output the `floatx80' type will be defined. The same applies to
41 1.1.4.2 tls the `FLOAT128' macro and the quadruple-precision format `float128'.
42 1.1.4.2 tls -------------------------------------------------------------------------------
43 1.1.4.2 tls */
44 1.1.4.2 tls /* #define FLOATX80 */
45 1.1.4.2 tls #define FLOAT128
46 1.1.4.2 tls
47 1.1.4.2 tls #include "softfloat-qp.h"
48 1.1.4.2 tls
49 1.1.4.2 tls #include <machine/ieeefp.h>
50 1.1.4.2 tls
51 1.1.4.2 tls /*
52 1.1.4.2 tls -------------------------------------------------------------------------------
53 1.1.4.2 tls Software IEC/IEEE floating-point types.
54 1.1.4.2 tls -------------------------------------------------------------------------------
55 1.1.4.2 tls */
56 1.1.4.2 tls typedef unsigned int float32;
57 1.1.4.2 tls typedef unsigned long long float64;
58 1.1.4.2 tls #ifdef FLOATX80
59 1.1.4.2 tls typedef struct {
60 1.1.4.2 tls unsigned short high;
61 1.1.4.2 tls unsigned long long low;
62 1.1.4.2 tls } floatx80;
63 1.1.4.2 tls #endif
64 1.1.4.2 tls #ifdef FLOAT128
65 1.1.4.2 tls typedef struct {
66 1.1.4.2 tls unsigned long long high, low;
67 1.1.4.2 tls } float128;
68 1.1.4.2 tls #endif
69 1.1.4.2 tls
70 1.1.4.2 tls /*
71 1.1.4.2 tls -------------------------------------------------------------------------------
72 1.1.4.2 tls Software IEC/IEEE floating-point underflow tininess-detection mode.
73 1.1.4.2 tls -------------------------------------------------------------------------------
74 1.1.4.2 tls */
75 1.1.4.2 tls #ifndef SOFTFLOAT_FOR_GCC
76 1.1.4.2 tls extern int8 float_detect_tininess;
77 1.1.4.2 tls #endif
78 1.1.4.2 tls enum {
79 1.1.4.2 tls float_tininess_after_rounding = 0,
80 1.1.4.2 tls float_tininess_before_rounding = 1
81 1.1.4.2 tls };
82 1.1.4.2 tls
83 1.1.4.2 tls /*
84 1.1.4.2 tls -------------------------------------------------------------------------------
85 1.1.4.2 tls Software IEC/IEEE floating-point rounding mode.
86 1.1.4.2 tls -------------------------------------------------------------------------------
87 1.1.4.2 tls */
88 1.1.4.2 tls extern fp_rnd float_rounding_mode;
89 1.1.4.2 tls #define float_round_nearest_even FP_RN
90 1.1.4.2 tls #define float_round_to_zero FP_RZ
91 1.1.4.2 tls #define float_round_down FP_RM
92 1.1.4.2 tls #define float_round_up FP_RP
93 1.1.4.2 tls
94 1.1.4.2 tls /*
95 1.1.4.2 tls -------------------------------------------------------------------------------
96 1.1.4.2 tls Software IEC/IEEE floating-point exception flags.
97 1.1.4.2 tls -------------------------------------------------------------------------------
98 1.1.4.2 tls */
99 1.1.4.2 tls extern fp_except float_exception_flags;
100 1.1.4.2 tls extern fp_except float_exception_mask;
101 1.1.4.2 tls enum {
102 1.1.4.2 tls float_flag_inexact = FP_X_IMP,
103 1.1.4.2 tls float_flag_underflow = FP_X_UFL,
104 1.1.4.2 tls float_flag_overflow = FP_X_OFL,
105 1.1.4.2 tls float_flag_divbyzero = FP_X_DZ,
106 1.1.4.2 tls float_flag_invalid = FP_X_INV
107 1.1.4.2 tls };
108 1.1.4.2 tls
109 1.1.4.2 tls /*
110 1.1.4.2 tls -------------------------------------------------------------------------------
111 1.1.4.2 tls Routine to raise any or all of the software IEC/IEEE floating-point
112 1.1.4.2 tls exception flags.
113 1.1.4.2 tls -------------------------------------------------------------------------------
114 1.1.4.2 tls */
115 1.1.4.2 tls void float_raise( fp_except );
116 1.1.4.2 tls
117 1.1.4.2 tls /*
118 1.1.4.2 tls -------------------------------------------------------------------------------
119 1.1.4.2 tls Software IEC/IEEE integer-to-floating-point conversion routines.
120 1.1.4.2 tls -------------------------------------------------------------------------------
121 1.1.4.2 tls */
122 1.1.4.2 tls float32 int32_to_float32( int32 );
123 1.1.4.2 tls float32 uint32_to_float32( uint32 );
124 1.1.4.2 tls float64 int32_to_float64( int32 );
125 1.1.4.2 tls float64 uint32_to_float64( uint32 );
126 1.1.4.2 tls #ifdef FLOATX80
127 1.1.4.2 tls floatx80 int32_to_floatx80( int32 );
128 1.1.4.2 tls floatx80 uint32_to_floatx80( uint32 );
129 1.1.4.2 tls #endif
130 1.1.4.2 tls #ifdef FLOAT128
131 1.1.4.2 tls float128 int32_to_float128( int32 );
132 1.1.4.2 tls float128 uint32_to_float128( uint32 );
133 1.1.4.2 tls #endif
134 1.1.4.2 tls float32 int64_to_float32( long long );
135 1.1.4.2 tls float64 int64_to_float64( long long );
136 1.1.4.2 tls #ifdef FLOATX80
137 1.1.4.2 tls floatx80 int64_to_floatx80( long long );
138 1.1.4.2 tls #endif
139 1.1.4.2 tls #ifdef FLOAT128
140 1.1.4.2 tls float128 int64_to_float128( long long );
141 1.1.4.2 tls #endif
142 1.1.4.2 tls
143 1.1.4.2 tls /*
144 1.1.4.2 tls -------------------------------------------------------------------------------
145 1.1.4.2 tls Software IEC/IEEE single-precision conversion routines.
146 1.1.4.2 tls -------------------------------------------------------------------------------
147 1.1.4.2 tls */
148 1.1.4.2 tls int float32_to_int32( float32 );
149 1.1.4.2 tls int float32_to_int32_round_to_zero( float32 );
150 1.1.4.2 tls unsigned int float32_to_uint32_round_to_zero( float32 );
151 1.1.4.2 tls long long float32_to_int64( float32 );
152 1.1.4.2 tls long long float32_to_int64_round_to_zero( float32 );
153 1.1.4.2 tls float64 float32_to_float64( float32 );
154 1.1.4.2 tls #ifdef FLOATX80
155 1.1.4.2 tls floatx80 float32_to_floatx80( float32 );
156 1.1.4.2 tls #endif
157 1.1.4.2 tls #ifdef FLOAT128
158 1.1.4.2 tls float128 float32_to_float128( float32 );
159 1.1.4.2 tls #endif
160 1.1.4.2 tls
161 1.1.4.2 tls /*
162 1.1.4.2 tls -------------------------------------------------------------------------------
163 1.1.4.2 tls Software IEC/IEEE single-precision operations.
164 1.1.4.2 tls -------------------------------------------------------------------------------
165 1.1.4.2 tls */
166 1.1.4.2 tls float32 float32_round_to_int( float32 );
167 1.1.4.2 tls float32 float32_add( float32, float32 );
168 1.1.4.2 tls float32 float32_sub( float32, float32 );
169 1.1.4.2 tls float32 float32_mul( float32, float32 );
170 1.1.4.2 tls float32 float32_div( float32, float32 );
171 1.1.4.2 tls float32 float32_rem( float32, float32 );
172 1.1.4.2 tls float32 float32_sqrt( float32 );
173 1.1.4.2 tls flag float32_eq( float32, float32 );
174 1.1.4.2 tls flag float32_le( float32, float32 );
175 1.1.4.2 tls flag float32_lt( float32, float32 );
176 1.1.4.2 tls flag float32_eq_signaling( float32, float32 );
177 1.1.4.2 tls flag float32_le_quiet( float32, float32 );
178 1.1.4.2 tls flag float32_lt_quiet( float32, float32 );
179 1.1.4.2 tls flag float32_is_signaling_nan( float32 );
180 1.1.4.2 tls
181 1.1.4.2 tls /*
182 1.1.4.2 tls -------------------------------------------------------------------------------
183 1.1.4.2 tls Software IEC/IEEE double-precision conversion routines.
184 1.1.4.2 tls -------------------------------------------------------------------------------
185 1.1.4.2 tls */
186 1.1.4.2 tls int float64_to_int32( float64 );
187 1.1.4.2 tls int float64_to_int32_round_to_zero( float64 );
188 1.1.4.2 tls unsigned int float64_to_uint32_round_to_zero( float64 );
189 1.1.4.2 tls long long float64_to_int64( float64 );
190 1.1.4.2 tls long long float64_to_int64_round_to_zero( float64 );
191 1.1.4.2 tls float32 float64_to_float32( float64 );
192 1.1.4.2 tls #ifdef FLOATX80
193 1.1.4.2 tls floatx80 float64_to_floatx80( float64 );
194 1.1.4.2 tls #endif
195 1.1.4.2 tls #ifdef FLOAT128
196 1.1.4.2 tls float128 float64_to_float128( float64 );
197 1.1.4.2 tls #endif
198 1.1.4.2 tls
199 1.1.4.2 tls /*
200 1.1.4.2 tls -------------------------------------------------------------------------------
201 1.1.4.2 tls Software IEC/IEEE double-precision operations.
202 1.1.4.2 tls -------------------------------------------------------------------------------
203 1.1.4.2 tls */
204 1.1.4.2 tls float64 float64_round_to_int( float64 );
205 1.1.4.2 tls float64 float64_add( float64, float64 );
206 1.1.4.2 tls float64 float64_sub( float64, float64 );
207 1.1.4.2 tls float64 float64_mul( float64, float64 );
208 1.1.4.2 tls float64 float64_div( float64, float64 );
209 1.1.4.2 tls float64 float64_rem( float64, float64 );
210 1.1.4.2 tls float64 float64_sqrt( float64 );
211 1.1.4.2 tls flag float64_eq( float64, float64 );
212 1.1.4.2 tls flag float64_le( float64, float64 );
213 1.1.4.2 tls flag float64_lt( float64, float64 );
214 1.1.4.2 tls flag float64_eq_signaling( float64, float64 );
215 1.1.4.2 tls flag float64_le_quiet( float64, float64 );
216 1.1.4.2 tls flag float64_lt_quiet( float64, float64 );
217 1.1.4.2 tls flag float64_is_signaling_nan( float64 );
218 1.1.4.2 tls
219 1.1.4.2 tls #ifdef FLOATX80
220 1.1.4.2 tls
221 1.1.4.2 tls /*
222 1.1.4.2 tls -------------------------------------------------------------------------------
223 1.1.4.2 tls Software IEC/IEEE extended double-precision conversion routines.
224 1.1.4.2 tls -------------------------------------------------------------------------------
225 1.1.4.2 tls */
226 1.1.4.2 tls int floatx80_to_int32( floatx80 );
227 1.1.4.2 tls int floatx80_to_int32_round_to_zero( floatx80 );
228 1.1.4.2 tls long long floatx80_to_int64( floatx80 );
229 1.1.4.2 tls long long floatx80_to_int64_round_to_zero( floatx80 );
230 1.1.4.2 tls float32 floatx80_to_float32( floatx80 );
231 1.1.4.2 tls float64 floatx80_to_float64( floatx80 );
232 1.1.4.2 tls #ifdef FLOAT128
233 1.1.4.2 tls float128 floatx80_to_float128( floatx80 );
234 1.1.4.2 tls #endif
235 1.1.4.2 tls
236 1.1.4.2 tls /*
237 1.1.4.2 tls -------------------------------------------------------------------------------
238 1.1.4.2 tls Software IEC/IEEE extended double-precision rounding precision. Valid
239 1.1.4.2 tls values are 32, 64, and 80.
240 1.1.4.2 tls -------------------------------------------------------------------------------
241 1.1.4.2 tls */
242 1.1.4.2 tls extern int floatx80_rounding_precision;
243 1.1.4.2 tls
244 1.1.4.2 tls /*
245 1.1.4.2 tls -------------------------------------------------------------------------------
246 1.1.4.2 tls Software IEC/IEEE extended double-precision operations.
247 1.1.4.2 tls -------------------------------------------------------------------------------
248 1.1.4.2 tls */
249 1.1.4.2 tls floatx80 floatx80_round_to_int( floatx80 );
250 1.1.4.2 tls floatx80 floatx80_add( floatx80, floatx80 );
251 1.1.4.2 tls floatx80 floatx80_sub( floatx80, floatx80 );
252 1.1.4.2 tls floatx80 floatx80_mul( floatx80, floatx80 );
253 1.1.4.2 tls floatx80 floatx80_div( floatx80, floatx80 );
254 1.1.4.2 tls floatx80 floatx80_rem( floatx80, floatx80 );
255 1.1.4.2 tls floatx80 floatx80_sqrt( floatx80 );
256 1.1.4.2 tls flag floatx80_eq( floatx80, floatx80 );
257 1.1.4.2 tls flag floatx80_le( floatx80, floatx80 );
258 1.1.4.2 tls flag floatx80_lt( floatx80, floatx80 );
259 1.1.4.2 tls flag floatx80_eq_signaling( floatx80, floatx80 );
260 1.1.4.2 tls flag floatx80_le_quiet( floatx80, floatx80 );
261 1.1.4.2 tls flag floatx80_lt_quiet( floatx80, floatx80 );
262 1.1.4.2 tls flag floatx80_is_signaling_nan( floatx80 );
263 1.1.4.2 tls
264 1.1.4.2 tls #endif
265 1.1.4.2 tls
266 1.1.4.2 tls #ifdef FLOAT128
267 1.1.4.2 tls
268 1.1.4.2 tls /*
269 1.1.4.2 tls -------------------------------------------------------------------------------
270 1.1.4.2 tls Software IEC/IEEE quadruple-precision conversion routines.
271 1.1.4.2 tls -------------------------------------------------------------------------------
272 1.1.4.2 tls */
273 1.1.4.2 tls int float128_to_int32( float128 );
274 1.1.4.2 tls int float128_to_int32_round_to_zero( float128 );
275 1.1.4.2 tls long long float128_to_int64( float128 );
276 1.1.4.2 tls long long float128_to_int64_round_to_zero( float128 );
277 1.1.4.2 tls unsigned long long float128_to_uint64_round_to_zero( float128 );
278 1.1.4.2 tls float32 float128_to_float32( float128 );
279 1.1.4.2 tls float64 float128_to_float64( float128 );
280 1.1.4.2 tls #ifdef FLOATX80
281 1.1.4.2 tls floatx80 float128_to_floatx80( float128 );
282 1.1.4.2 tls #endif
283 1.1.4.2 tls
284 1.1.4.2 tls /*
285 1.1.4.2 tls -------------------------------------------------------------------------------
286 1.1.4.2 tls Software IEC/IEEE quadruple-precision operations.
287 1.1.4.2 tls -------------------------------------------------------------------------------
288 1.1.4.2 tls */
289 1.1.4.2 tls float128 float128_round_to_int( float128 );
290 1.1.4.2 tls float128 float128_add( float128, float128 );
291 1.1.4.2 tls float128 float128_sub( float128, float128 );
292 1.1.4.2 tls float128 float128_mul( float128, float128 );
293 1.1.4.2 tls float128 float128_div( float128, float128 );
294 1.1.4.2 tls float128 float128_rem( float128, float128 );
295 1.1.4.2 tls float128 float128_sqrt( float128 );
296 1.1.4.2 tls flag float128_eq( float128, float128 );
297 1.1.4.2 tls flag float128_le( float128, float128 );
298 1.1.4.2 tls flag float128_lt( float128, float128 );
299 1.1.4.2 tls flag float128_eq_signaling( float128, float128 );
300 1.1.4.2 tls flag float128_le_quiet( float128, float128 );
301 1.1.4.2 tls flag float128_lt_quiet( float128, float128 );
302 1.1.4.2 tls flag float128_is_signaling_nan( float128 );
303 1.1.4.2 tls flag float128_is_nan( float128 );
304 1.1.4.2 tls
305 1.1.4.2 tls #endif
306