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