1178620Smarcel/*	$NetBSD: softfloat.h,v 1.6 2002/05/12 13:12:46 bjh21 Exp $	*/
2178620Smarcel/* $FreeBSD: releng/10.2/lib/libc/powerpc/softfloat/softfloat.h 178620 2008-04-27 18:34:34Z marcel $ */
3178620Smarcel
4178620Smarcel/* This is a derivative work. */
5178620Smarcel
6178620Smarcel/*
7178620Smarcel===============================================================================
8178620Smarcel
9178620SmarcelThis C header file is part of the SoftFloat IEC/IEEE Floating-point
10178620SmarcelArithmetic Package, Release 2a.
11178620Smarcel
12178620SmarcelWritten by John R. Hauser.  This work was made possible in part by the
13178620SmarcelInternational Computer Science Institute, located at Suite 600, 1947 Center
14178620SmarcelStreet, Berkeley, California 94704.  Funding was partially provided by the
15178620SmarcelNational Science Foundation under grant MIP-9311980.  The original version
16178620Smarcelof this code was written as part of a project to build a fixed-point vector
17178620Smarcelprocessor in collaboration with the University of California at Berkeley,
18178620Smarceloverseen by Profs. Nelson Morgan and John Wawrzynek.  More information
19178620Smarcelis available through the Web page `http://HTTP.CS.Berkeley.EDU/~jhauser/
20178620Smarcelarithmetic/SoftFloat.html'.
21178620Smarcel
22178620SmarcelTHIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE.  Although reasonable effort
23178620Smarcelhas been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT
24178620SmarcelTIMES RESULT IN INCORRECT BEHAVIOR.  USE OF THIS SOFTWARE IS RESTRICTED TO
25178620SmarcelPERSONS AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ANY
26178620SmarcelAND ALL LOSSES, COSTS, OR OTHER PROBLEMS ARISING FROM ITS USE.
27178620Smarcel
28178620SmarcelDerivative works are acceptable, even for commercial purposes, so long as
29178620Smarcel(1) they include prominent notice that the work is derivative, and (2) they
30178620Smarcelinclude prominent notice akin to these four paragraphs for those parts of
31178620Smarcelthis code that are retained.
32178620Smarcel
33178620Smarcel===============================================================================
34178620Smarcel*/
35178620Smarcel
36178620Smarcel/*
37178620Smarcel-------------------------------------------------------------------------------
38178620SmarcelThe macro `FLOATX80' must be defined to enable the extended double-precision
39178620Smarcelfloating-point format `floatx80'.  If this macro is not defined, the
40178620Smarcel`floatx80' type will not be defined, and none of the functions that either
41178620Smarcelinput or output the `floatx80' type will be defined.  The same applies to
42178620Smarcelthe `FLOAT128' macro and the quadruple-precision format `float128'.
43178620Smarcel-------------------------------------------------------------------------------
44178620Smarcel*/
45178620Smarcel/* #define FLOATX80 */
46178620Smarcel/* #define FLOAT128 */
47178620Smarcel
48178620Smarcel#include <machine/ieeefp.h>
49178620Smarcel
50178620Smarcel/*
51178620Smarcel-------------------------------------------------------------------------------
52178620SmarcelSoftware IEC/IEEE floating-point types.
53178620Smarcel-------------------------------------------------------------------------------
54178620Smarcel*/
55178620Smarceltypedef unsigned int float32;
56178620Smarceltypedef unsigned long long float64;
57178620Smarcel#ifdef FLOATX80
58178620Smarceltypedef struct {
59178620Smarcel    unsigned short high;
60178620Smarcel    unsigned long long low;
61178620Smarcel} floatx80;
62178620Smarcel#endif
63178620Smarcel#ifdef FLOAT128
64178620Smarceltypedef struct {
65178620Smarcel    unsigned long long high, low;
66178620Smarcel} float128;
67178620Smarcel#endif
68178620Smarcel
69178620Smarcel/*
70178620Smarcel-------------------------------------------------------------------------------
71178620SmarcelSoftware IEC/IEEE floating-point underflow tininess-detection mode.
72178620Smarcel-------------------------------------------------------------------------------
73178620Smarcel*/
74178620Smarcel#ifndef SOFTFLOAT_FOR_GCC
75178620Smarcelextern int8 float_detect_tininess;
76178620Smarcel#endif
77178620Smarcelenum {
78178620Smarcel    float_tininess_after_rounding  = 0,
79178620Smarcel    float_tininess_before_rounding = 1
80178620Smarcel};
81178620Smarcel
82178620Smarcel/*
83178620Smarcel-------------------------------------------------------------------------------
84178620SmarcelSoftware IEC/IEEE floating-point rounding mode.
85178620Smarcel-------------------------------------------------------------------------------
86178620Smarcel*/
87178620Smarcelextern fp_rnd_t float_rounding_mode;
88178620Smarcelenum {
89178620Smarcel    float_round_nearest_even = FP_RN,
90178620Smarcel    float_round_to_zero      = FP_RZ,
91178620Smarcel    float_round_down         = FP_RM,
92178620Smarcel    float_round_up           = FP_RP
93178620Smarcel};
94178620Smarcel
95178620Smarcel/*
96178620Smarcel-------------------------------------------------------------------------------
97178620SmarcelSoftware IEC/IEEE floating-point exception flags.
98178620Smarcel-------------------------------------------------------------------------------
99178620Smarcel*/
100178620Smarceltypedef fp_except_t fp_except;
101178620Smarcel
102178620Smarcelextern fp_except float_exception_flags;
103178620Smarcelextern fp_except float_exception_mask;
104178620Smarcelenum {
105178620Smarcel    float_flag_inexact   = FP_X_IMP,
106178620Smarcel    float_flag_underflow = FP_X_UFL,
107178620Smarcel    float_flag_overflow  = FP_X_OFL,
108178620Smarcel    float_flag_divbyzero = FP_X_DZ,
109178620Smarcel    float_flag_invalid   = FP_X_INV
110178620Smarcel};
111178620Smarcel
112178620Smarcel/*
113178620Smarcel-------------------------------------------------------------------------------
114178620SmarcelRoutine to raise any or all of the software IEC/IEEE floating-point
115178620Smarcelexception flags.
116178620Smarcel-------------------------------------------------------------------------------
117178620Smarcel*/
118178620Smarcelvoid float_raise( fp_except );
119178620Smarcel
120178620Smarcel/*
121178620Smarcel-------------------------------------------------------------------------------
122178620SmarcelSoftware IEC/IEEE integer-to-floating-point conversion routines.
123178620Smarcel-------------------------------------------------------------------------------
124178620Smarcel*/
125178620Smarcelfloat32 int32_to_float32( int );
126178620Smarcelfloat64 int32_to_float64( int );
127178620Smarcel#ifdef FLOATX80
128178620Smarcelfloatx80 int32_to_floatx80( int );
129178620Smarcel#endif
130178620Smarcel#ifdef FLOAT128
131178620Smarcelfloat128 int32_to_float128( int );
132178620Smarcel#endif
133178620Smarcelfloat32 int64_to_float32( long long );
134178620Smarcelfloat64 int64_to_float64( long long );
135178620Smarcel#ifdef FLOATX80
136178620Smarcelfloatx80 int64_to_floatx80( long long );
137178620Smarcel#endif
138178620Smarcel#ifdef FLOAT128
139178620Smarcelfloat128 int64_to_float128( long long );
140178620Smarcel#endif
141178620Smarcel
142178620Smarcel/*
143178620Smarcel-------------------------------------------------------------------------------
144178620SmarcelSoftware IEC/IEEE single-precision conversion routines.
145178620Smarcel-------------------------------------------------------------------------------
146178620Smarcel*/
147178620Smarcelint float32_to_int32( float32 );
148178620Smarcelint float32_to_int32_round_to_zero( float32 );
149178620Smarcelunsigned int float32_to_uint32_round_to_zero( float32 );
150178620Smarcellong long float32_to_int64( float32 );
151178620Smarcellong long float32_to_int64_round_to_zero( float32 );
152178620Smarcelfloat64 float32_to_float64( float32 );
153178620Smarcel#ifdef FLOATX80
154178620Smarcelfloatx80 float32_to_floatx80( float32 );
155178620Smarcel#endif
156178620Smarcel#ifdef FLOAT128
157178620Smarcelfloat128 float32_to_float128( float32 );
158178620Smarcel#endif
159178620Smarcel
160178620Smarcel/*
161178620Smarcel-------------------------------------------------------------------------------
162178620SmarcelSoftware IEC/IEEE single-precision operations.
163178620Smarcel-------------------------------------------------------------------------------
164178620Smarcel*/
165178620Smarcelfloat32 float32_round_to_int( float32 );
166178620Smarcelfloat32 float32_add( float32, float32 );
167178620Smarcelfloat32 float32_sub( float32, float32 );
168178620Smarcelfloat32 float32_mul( float32, float32 );
169178620Smarcelfloat32 float32_div( float32, float32 );
170178620Smarcelfloat32 float32_rem( float32, float32 );
171178620Smarcelfloat32 float32_sqrt( float32 );
172178620Smarcelint float32_eq( float32, float32 );
173178620Smarcelint float32_le( float32, float32 );
174178620Smarcelint float32_lt( float32, float32 );
175178620Smarcelint float32_eq_signaling( float32, float32 );
176178620Smarcelint float32_le_quiet( float32, float32 );
177178620Smarcelint float32_lt_quiet( float32, float32 );
178178620Smarcel#ifndef SOFTFLOAT_FOR_GCC
179178620Smarcelint float32_is_signaling_nan( float32 );
180178620Smarcel#endif
181178620Smarcel
182178620Smarcel/*
183178620Smarcel-------------------------------------------------------------------------------
184178620SmarcelSoftware IEC/IEEE double-precision conversion routines.
185178620Smarcel-------------------------------------------------------------------------------
186178620Smarcel*/
187178620Smarcelint float64_to_int32( float64 );
188178620Smarcelint float64_to_int32_round_to_zero( float64 );
189178620Smarcelunsigned int float64_to_uint32_round_to_zero( float64 );
190178620Smarcellong long float64_to_int64( float64 );
191178620Smarcellong long float64_to_int64_round_to_zero( float64 );
192178620Smarcelfloat32 float64_to_float32( float64 );
193178620Smarcel#ifdef FLOATX80
194178620Smarcelfloatx80 float64_to_floatx80( float64 );
195178620Smarcel#endif
196178620Smarcel#ifdef FLOAT128
197178620Smarcelfloat128 float64_to_float128( float64 );
198178620Smarcel#endif
199178620Smarcel
200178620Smarcel/*
201178620Smarcel-------------------------------------------------------------------------------
202178620SmarcelSoftware IEC/IEEE double-precision operations.
203178620Smarcel-------------------------------------------------------------------------------
204178620Smarcel*/
205178620Smarcelfloat64 float64_round_to_int( float64 );
206178620Smarcelfloat64 float64_add( float64, float64 );
207178620Smarcelfloat64 float64_sub( float64, float64 );
208178620Smarcelfloat64 float64_mul( float64, float64 );
209178620Smarcelfloat64 float64_div( float64, float64 );
210178620Smarcelfloat64 float64_rem( float64, float64 );
211178620Smarcelfloat64 float64_sqrt( float64 );
212178620Smarcelint float64_eq( float64, float64 );
213178620Smarcelint float64_le( float64, float64 );
214178620Smarcelint float64_lt( float64, float64 );
215178620Smarcelint float64_eq_signaling( float64, float64 );
216178620Smarcelint float64_le_quiet( float64, float64 );
217178620Smarcelint float64_lt_quiet( float64, float64 );
218178620Smarcel#ifndef SOFTFLOAT_FOR_GCC
219178620Smarcelint float64_is_signaling_nan( float64 );
220178620Smarcel#endif
221178620Smarcel
222178620Smarcel#ifdef FLOATX80
223178620Smarcel
224178620Smarcel/*
225178620Smarcel-------------------------------------------------------------------------------
226178620SmarcelSoftware IEC/IEEE extended double-precision conversion routines.
227178620Smarcel-------------------------------------------------------------------------------
228178620Smarcel*/
229178620Smarcelint floatx80_to_int32( floatx80 );
230178620Smarcelint floatx80_to_int32_round_to_zero( floatx80 );
231178620Smarcellong long floatx80_to_int64( floatx80 );
232178620Smarcellong long floatx80_to_int64_round_to_zero( floatx80 );
233178620Smarcelfloat32 floatx80_to_float32( floatx80 );
234178620Smarcelfloat64 floatx80_to_float64( floatx80 );
235178620Smarcel#ifdef FLOAT128
236178620Smarcelfloat128 floatx80_to_float128( floatx80 );
237178620Smarcel#endif
238178620Smarcel
239178620Smarcel/*
240178620Smarcel-------------------------------------------------------------------------------
241178620SmarcelSoftware IEC/IEEE extended double-precision rounding precision.  Valid
242178620Smarcelvalues are 32, 64, and 80.
243178620Smarcel-------------------------------------------------------------------------------
244178620Smarcel*/
245178620Smarcelextern int floatx80_rounding_precision;
246178620Smarcel
247178620Smarcel/*
248178620Smarcel-------------------------------------------------------------------------------
249178620SmarcelSoftware IEC/IEEE extended double-precision operations.
250178620Smarcel-------------------------------------------------------------------------------
251178620Smarcel*/
252178620Smarcelfloatx80 floatx80_round_to_int( floatx80 );
253178620Smarcelfloatx80 floatx80_add( floatx80, floatx80 );
254178620Smarcelfloatx80 floatx80_sub( floatx80, floatx80 );
255178620Smarcelfloatx80 floatx80_mul( floatx80, floatx80 );
256178620Smarcelfloatx80 floatx80_div( floatx80, floatx80 );
257178620Smarcelfloatx80 floatx80_rem( floatx80, floatx80 );
258178620Smarcelfloatx80 floatx80_sqrt( floatx80 );
259178620Smarcelint floatx80_eq( floatx80, floatx80 );
260178620Smarcelint floatx80_le( floatx80, floatx80 );
261178620Smarcelint floatx80_lt( floatx80, floatx80 );
262178620Smarcelint floatx80_eq_signaling( floatx80, floatx80 );
263178620Smarcelint floatx80_le_quiet( floatx80, floatx80 );
264178620Smarcelint floatx80_lt_quiet( floatx80, floatx80 );
265178620Smarcelint floatx80_is_signaling_nan( floatx80 );
266178620Smarcel
267178620Smarcel#endif
268178620Smarcel
269178620Smarcel#ifdef FLOAT128
270178620Smarcel
271178620Smarcel/*
272178620Smarcel-------------------------------------------------------------------------------
273178620SmarcelSoftware IEC/IEEE quadruple-precision conversion routines.
274178620Smarcel-------------------------------------------------------------------------------
275178620Smarcel*/
276178620Smarcelint float128_to_int32( float128 );
277178620Smarcelint float128_to_int32_round_to_zero( float128 );
278178620Smarcellong long float128_to_int64( float128 );
279178620Smarcellong long float128_to_int64_round_to_zero( float128 );
280178620Smarcelfloat32 float128_to_float32( float128 );
281178620Smarcelfloat64 float128_to_float64( float128 );
282178620Smarcel#ifdef FLOATX80
283178620Smarcelfloatx80 float128_to_floatx80( float128 );
284178620Smarcel#endif
285178620Smarcel
286178620Smarcel/*
287178620Smarcel-------------------------------------------------------------------------------
288178620SmarcelSoftware IEC/IEEE quadruple-precision operations.
289178620Smarcel-------------------------------------------------------------------------------
290178620Smarcel*/
291178620Smarcelfloat128 float128_round_to_int( float128 );
292178620Smarcelfloat128 float128_add( float128, float128 );
293178620Smarcelfloat128 float128_sub( float128, float128 );
294178620Smarcelfloat128 float128_mul( float128, float128 );
295178620Smarcelfloat128 float128_div( float128, float128 );
296178620Smarcelfloat128 float128_rem( float128, float128 );
297178620Smarcelfloat128 float128_sqrt( float128 );
298178620Smarcelint float128_eq( float128, float128 );
299178620Smarcelint float128_le( float128, float128 );
300178620Smarcelint float128_lt( float128, float128 );
301178620Smarcelint float128_eq_signaling( float128, float128 );
302178620Smarcelint float128_le_quiet( float128, float128 );
303178620Smarcelint float128_lt_quiet( float128, float128 );
304178620Smarcelint float128_is_signaling_nan( float128 );
305178620Smarcel
306178620Smarcel#endif
307178620Smarcel
308