xref: /dflybsd-src/contrib/gcc-4.7/libgcc/fp-bit.h (revision 04febcfb30580676d3e95f58a16c5137ee478b32)
1*e4b17023SJohn Marino /* Header file for fp-bit.c.  */
2*e4b17023SJohn Marino /* Copyright (C) 2000, 2002, 2003, 2006, 2009, 2010, 2011
3*e4b17023SJohn Marino    Free Software Foundation, Inc.
4*e4b17023SJohn Marino 
5*e4b17023SJohn Marino This file is part of GCC.
6*e4b17023SJohn Marino 
7*e4b17023SJohn Marino GCC is free software; you can redistribute it and/or modify it under
8*e4b17023SJohn Marino the terms of the GNU General Public License as published by the Free
9*e4b17023SJohn Marino Software Foundation; either version 3, or (at your option) any later
10*e4b17023SJohn Marino version.
11*e4b17023SJohn Marino 
12*e4b17023SJohn Marino GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13*e4b17023SJohn Marino WARRANTY; without even the implied warranty of MERCHANTABILITY or
14*e4b17023SJohn Marino FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15*e4b17023SJohn Marino for more details.
16*e4b17023SJohn Marino 
17*e4b17023SJohn Marino Under Section 7 of GPL version 3, you are granted additional
18*e4b17023SJohn Marino permissions described in the GCC Runtime Library Exception, version
19*e4b17023SJohn Marino 3.1, as published by the Free Software Foundation.
20*e4b17023SJohn Marino 
21*e4b17023SJohn Marino You should have received a copy of the GNU General Public License and
22*e4b17023SJohn Marino a copy of the GCC Runtime Library Exception along with this program;
23*e4b17023SJohn Marino see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
24*e4b17023SJohn Marino <http://www.gnu.org/licenses/>.  */
25*e4b17023SJohn Marino 
26*e4b17023SJohn Marino #ifndef GCC_FP_BIT_H
27*e4b17023SJohn Marino #define GCC_FP_BIT_H
28*e4b17023SJohn Marino 
29*e4b17023SJohn Marino /* Defining FINE_GRAINED_LIBRARIES allows one to select which routines
30*e4b17023SJohn Marino    from this file are compiled via additional -D options.
31*e4b17023SJohn Marino 
32*e4b17023SJohn Marino    This avoids the need to pull in the entire fp emulation library
33*e4b17023SJohn Marino    when only a small number of functions are needed.
34*e4b17023SJohn Marino 
35*e4b17023SJohn Marino    If FINE_GRAINED_LIBRARIES is not defined, then compile every
36*e4b17023SJohn Marino    suitable routine.  */
37*e4b17023SJohn Marino #ifndef FINE_GRAINED_LIBRARIES
38*e4b17023SJohn Marino #define L_pack_df
39*e4b17023SJohn Marino #define L_unpack_df
40*e4b17023SJohn Marino #define L_pack_sf
41*e4b17023SJohn Marino #define L_unpack_sf
42*e4b17023SJohn Marino #define L_addsub_sf
43*e4b17023SJohn Marino #define L_addsub_df
44*e4b17023SJohn Marino #define L_mul_sf
45*e4b17023SJohn Marino #define L_mul_df
46*e4b17023SJohn Marino #define L_div_sf
47*e4b17023SJohn Marino #define L_div_df
48*e4b17023SJohn Marino #define L_fpcmp_parts_sf
49*e4b17023SJohn Marino #define L_fpcmp_parts_df
50*e4b17023SJohn Marino #define L_compare_sf
51*e4b17023SJohn Marino #define L_compare_df
52*e4b17023SJohn Marino #define L_eq_sf
53*e4b17023SJohn Marino #define L_eq_df
54*e4b17023SJohn Marino #define L_ne_sf
55*e4b17023SJohn Marino #define L_ne_df
56*e4b17023SJohn Marino #define L_gt_sf
57*e4b17023SJohn Marino #define L_gt_df
58*e4b17023SJohn Marino #define L_ge_sf
59*e4b17023SJohn Marino #define L_ge_df
60*e4b17023SJohn Marino #define L_lt_sf
61*e4b17023SJohn Marino #define L_lt_df
62*e4b17023SJohn Marino #define L_le_sf
63*e4b17023SJohn Marino #define L_le_df
64*e4b17023SJohn Marino #define L_unord_sf
65*e4b17023SJohn Marino #define L_unord_df
66*e4b17023SJohn Marino #define L_usi_to_sf
67*e4b17023SJohn Marino #define L_usi_to_df
68*e4b17023SJohn Marino #define L_si_to_sf
69*e4b17023SJohn Marino #define L_si_to_df
70*e4b17023SJohn Marino #define L_sf_to_si
71*e4b17023SJohn Marino #define L_df_to_si
72*e4b17023SJohn Marino #define L_f_to_usi
73*e4b17023SJohn Marino #define L_df_to_usi
74*e4b17023SJohn Marino #define L_negate_sf
75*e4b17023SJohn Marino #define L_negate_df
76*e4b17023SJohn Marino #define L_make_sf
77*e4b17023SJohn Marino #define L_make_df
78*e4b17023SJohn Marino #define L_sf_to_df
79*e4b17023SJohn Marino #define L_df_to_sf
80*e4b17023SJohn Marino #ifdef FLOAT
81*e4b17023SJohn Marino #define L_thenan_sf
82*e4b17023SJohn Marino #else
83*e4b17023SJohn Marino #define L_thenan_df
84*e4b17023SJohn Marino #endif
85*e4b17023SJohn Marino #endif /* ! FINE_GRAINED_LIBRARIES */
86*e4b17023SJohn Marino 
87*e4b17023SJohn Marino #if __LDBL_MANT_DIG__ == 113 || __LDBL_MANT_DIG__ == 106
88*e4b17023SJohn Marino # if defined(TFLOAT) || defined(L_sf_to_tf) || defined(L_df_to_tf)
89*e4b17023SJohn Marino #  define TMODES
90*e4b17023SJohn Marino # endif
91*e4b17023SJohn Marino #endif
92*e4b17023SJohn Marino 
93*e4b17023SJohn Marino typedef float SFtype __attribute__ ((mode (SF)));
94*e4b17023SJohn Marino typedef float DFtype __attribute__ ((mode (DF)));
95*e4b17023SJohn Marino #ifdef TMODES
96*e4b17023SJohn Marino typedef float TFtype __attribute__ ((mode (TF)));
97*e4b17023SJohn Marino #endif
98*e4b17023SJohn Marino 
99*e4b17023SJohn Marino typedef int HItype __attribute__ ((mode (HI)));
100*e4b17023SJohn Marino typedef int SItype __attribute__ ((mode (SI)));
101*e4b17023SJohn Marino typedef int DItype __attribute__ ((mode (DI)));
102*e4b17023SJohn Marino #ifdef TMODES
103*e4b17023SJohn Marino typedef int TItype __attribute__ ((mode (TI)));
104*e4b17023SJohn Marino #endif
105*e4b17023SJohn Marino 
106*e4b17023SJohn Marino /* The type of the result of a floating point comparison.  This must
107*e4b17023SJohn Marino    match `__libgcc_cmp_return__' in GCC for the target.  */
108*e4b17023SJohn Marino #ifndef CMPtype
109*e4b17023SJohn Marino typedef int CMPtype __attribute__ ((mode (__libgcc_cmp_return__)));
110*e4b17023SJohn Marino #endif
111*e4b17023SJohn Marino 
112*e4b17023SJohn Marino typedef unsigned int UHItype __attribute__ ((mode (HI)));
113*e4b17023SJohn Marino typedef unsigned int USItype __attribute__ ((mode (SI)));
114*e4b17023SJohn Marino typedef unsigned int UDItype __attribute__ ((mode (DI)));
115*e4b17023SJohn Marino #ifdef TMODES
116*e4b17023SJohn Marino typedef unsigned int UTItype __attribute__ ((mode (TI)));
117*e4b17023SJohn Marino #endif
118*e4b17023SJohn Marino 
119*e4b17023SJohn Marino #define MAX_USI_INT  (~(USItype)0)
120*e4b17023SJohn Marino #define MAX_SI_INT   ((SItype) (MAX_USI_INT >> 1))
121*e4b17023SJohn Marino #define BITS_PER_SI  (4 * BITS_PER_UNIT)
122*e4b17023SJohn Marino #ifdef TMODES
123*e4b17023SJohn Marino #define MAX_UDI_INT  (~(UDItype)0)
124*e4b17023SJohn Marino #define MAX_DI_INT   ((DItype) (MAX_UDI_INT >> 1))
125*e4b17023SJohn Marino #define BITS_PER_DI  (8 * BITS_PER_UNIT)
126*e4b17023SJohn Marino #endif
127*e4b17023SJohn Marino 
128*e4b17023SJohn Marino #ifdef FLOAT_ONLY
129*e4b17023SJohn Marino #define NO_DI_MODE
130*e4b17023SJohn Marino #endif
131*e4b17023SJohn Marino 
132*e4b17023SJohn Marino #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
133*e4b17023SJohn Marino #define FLOAT_BIT_ORDER_MISMATCH
134*e4b17023SJohn Marino #endif
135*e4b17023SJohn Marino 
136*e4b17023SJohn Marino #if __BYTE_ORDER__ != __FLOAT_WORD_ORDER__
137*e4b17023SJohn Marino #define FLOAT_WORD_ORDER_MISMATCH
138*e4b17023SJohn Marino #endif
139*e4b17023SJohn Marino 
140*e4b17023SJohn Marino #ifdef TFLOAT
141*e4b17023SJohn Marino # ifndef TMODES
142*e4b17023SJohn Marino #  error "TFLOAT requires long double to have 113 bits of mantissa"
143*e4b17023SJohn Marino # endif
144*e4b17023SJohn Marino 
145*e4b17023SJohn Marino #	define PREFIXFPDP tp
146*e4b17023SJohn Marino #	define PREFIXSFDF tf
147*e4b17023SJohn Marino #	define NGARDS 10L /* Is this right? */
148*e4b17023SJohn Marino #	define GARDROUND 0x1ff
149*e4b17023SJohn Marino #	define GARDMASK  0x3ff
150*e4b17023SJohn Marino #	define GARDMSB   0x200
151*e4b17023SJohn Marino #	define FRAC_NBITS 128
152*e4b17023SJohn Marino 
153*e4b17023SJohn Marino # if __LDBL_MANT_DIG__ == 113 /* IEEE quad */
154*e4b17023SJohn Marino #	define EXPBITS 15
155*e4b17023SJohn Marino #	define EXPBIAS 16383
156*e4b17023SJohn Marino #	define EXPMAX (0x7fff)
157*e4b17023SJohn Marino #	define QUIET_NAN ((TItype)0x8 << 108)
158*e4b17023SJohn Marino #	define FRACHIGH  ((TItype)0x8 << 124)
159*e4b17023SJohn Marino #	define FRACHIGH2 ((TItype)0xc << 124)
160*e4b17023SJohn Marino #	define FRACBITS 112
161*e4b17023SJohn Marino # endif
162*e4b17023SJohn Marino 
163*e4b17023SJohn Marino # if __LDBL_MANT_DIG__ == 106 /* IBM extended (double+double) */
164*e4b17023SJohn Marino #	define EXPBITS 11
165*e4b17023SJohn Marino #	define EXPBIAS 1023
166*e4b17023SJohn Marino #	define EXPMAX (0x7ff)
167*e4b17023SJohn Marino #	define QUIET_NAN ((TItype)0x8 << (48 + 64))
168*e4b17023SJohn Marino #	define FRACHIGH  ((TItype)0x8 << 124)
169*e4b17023SJohn Marino #	define FRACHIGH2 ((TItype)0xc << 124)
170*e4b17023SJohn Marino #	define FRACBITS 105
171*e4b17023SJohn Marino #	define HALFFRACBITS 52
172*e4b17023SJohn Marino #	define HALFSHIFT 64
173*e4b17023SJohn Marino # endif
174*e4b17023SJohn Marino 
175*e4b17023SJohn Marino #	define pack_d __pack_t
176*e4b17023SJohn Marino #	define unpack_d __unpack_t
177*e4b17023SJohn Marino #	define __fpcmp_parts __fpcmp_parts_t
178*e4b17023SJohn Marino 	typedef UTItype fractype;
179*e4b17023SJohn Marino 	typedef UDItype halffractype;
180*e4b17023SJohn Marino 	typedef USItype qrtrfractype;
181*e4b17023SJohn Marino #define qrtrfractype qrtrfractype
182*e4b17023SJohn Marino 	typedef TFtype FLO_type;
183*e4b17023SJohn Marino 	typedef TItype intfrac;
184*e4b17023SJohn Marino #elif defined FLOAT
185*e4b17023SJohn Marino #	define NGARDS    7L
186*e4b17023SJohn Marino #	define GARDROUND 0x3f
187*e4b17023SJohn Marino #	define GARDMASK  0x7f
188*e4b17023SJohn Marino #	define GARDMSB   0x40
189*e4b17023SJohn Marino #	define EXPBITS 8
190*e4b17023SJohn Marino #	define EXPBIAS 127
191*e4b17023SJohn Marino #	define FRACBITS 23
192*e4b17023SJohn Marino #	define EXPMAX (0xff)
193*e4b17023SJohn Marino #	define QUIET_NAN 0x100000L
194*e4b17023SJohn Marino #	define FRAC_NBITS 32
195*e4b17023SJohn Marino #	define FRACHIGH  0x80000000L
196*e4b17023SJohn Marino #	define FRACHIGH2 0xc0000000L
197*e4b17023SJohn Marino #	define pack_d __pack_f
198*e4b17023SJohn Marino #	define unpack_d __unpack_f
199*e4b17023SJohn Marino #	define __fpcmp_parts __fpcmp_parts_f
200*e4b17023SJohn Marino 	typedef USItype fractype;
201*e4b17023SJohn Marino 	typedef UHItype halffractype;
202*e4b17023SJohn Marino 	typedef SFtype FLO_type;
203*e4b17023SJohn Marino 	typedef SItype intfrac;
204*e4b17023SJohn Marino 
205*e4b17023SJohn Marino #else
206*e4b17023SJohn Marino #	define PREFIXFPDP dp
207*e4b17023SJohn Marino #	define PREFIXSFDF df
208*e4b17023SJohn Marino #	define NGARDS 8L
209*e4b17023SJohn Marino #	define GARDROUND 0x7f
210*e4b17023SJohn Marino #	define GARDMASK  0xff
211*e4b17023SJohn Marino #	define GARDMSB   0x80
212*e4b17023SJohn Marino #	define EXPBITS 11
213*e4b17023SJohn Marino #	define EXPBIAS 1023
214*e4b17023SJohn Marino #	define FRACBITS 52
215*e4b17023SJohn Marino #	define EXPMAX (0x7ff)
216*e4b17023SJohn Marino #	define QUIET_NAN 0x8000000000000LL
217*e4b17023SJohn Marino #	define FRAC_NBITS 64
218*e4b17023SJohn Marino #	define FRACHIGH  0x8000000000000000LL
219*e4b17023SJohn Marino #	define FRACHIGH2 0xc000000000000000LL
220*e4b17023SJohn Marino #	define pack_d __pack_d
221*e4b17023SJohn Marino #	define unpack_d __unpack_d
222*e4b17023SJohn Marino #	define __fpcmp_parts __fpcmp_parts_d
223*e4b17023SJohn Marino 	typedef UDItype fractype;
224*e4b17023SJohn Marino 	typedef USItype halffractype;
225*e4b17023SJohn Marino 	typedef DFtype FLO_type;
226*e4b17023SJohn Marino 	typedef DItype intfrac;
227*e4b17023SJohn Marino #endif /* FLOAT */
228*e4b17023SJohn Marino 
229*e4b17023SJohn Marino #ifdef TFLOAT
230*e4b17023SJohn Marino #	define add 		__addtf3
231*e4b17023SJohn Marino #	define sub 		__subtf3
232*e4b17023SJohn Marino #	define multiply 	__multf3
233*e4b17023SJohn Marino #	define divide 		__divtf3
234*e4b17023SJohn Marino #	define compare 		__cmptf2
235*e4b17023SJohn Marino #	define _eq_f2 		__eqtf2
236*e4b17023SJohn Marino #	define _ne_f2 		__netf2
237*e4b17023SJohn Marino #	define _gt_f2 		__gttf2
238*e4b17023SJohn Marino #	define _ge_f2 		__getf2
239*e4b17023SJohn Marino #	define _lt_f2 		__lttf2
240*e4b17023SJohn Marino #	define _le_f2 		__letf2
241*e4b17023SJohn Marino #	define _unord_f2	__unordtf2
242*e4b17023SJohn Marino #	define usi_to_float 	__floatunsitf
243*e4b17023SJohn Marino #	define si_to_float 	__floatsitf
244*e4b17023SJohn Marino #	define float_to_si 	__fixtfsi
245*e4b17023SJohn Marino #	define float_to_usi 	__fixunstfsi
246*e4b17023SJohn Marino #	define negate 		__negtf2
247*e4b17023SJohn Marino #	define tf_to_sf		__trunctfsf2
248*e4b17023SJohn Marino #	define tf_to_df		__trunctfdf2
249*e4b17023SJohn Marino #elif defined FLOAT
250*e4b17023SJohn Marino #	define add 		__addsf3
251*e4b17023SJohn Marino #	define sub 		__subsf3
252*e4b17023SJohn Marino #	define multiply 	__mulsf3
253*e4b17023SJohn Marino #	define divide 		__divsf3
254*e4b17023SJohn Marino #	define compare 		__cmpsf2
255*e4b17023SJohn Marino #	define _eq_f2 		__eqsf2
256*e4b17023SJohn Marino #	define _ne_f2 		__nesf2
257*e4b17023SJohn Marino #	define _gt_f2 		__gtsf2
258*e4b17023SJohn Marino #	define _ge_f2 		__gesf2
259*e4b17023SJohn Marino #	define _lt_f2 		__ltsf2
260*e4b17023SJohn Marino #	define _le_f2 		__lesf2
261*e4b17023SJohn Marino #	define _unord_f2	__unordsf2
262*e4b17023SJohn Marino #	define usi_to_float 	__floatunsisf
263*e4b17023SJohn Marino #	define si_to_float 	__floatsisf
264*e4b17023SJohn Marino #	define float_to_si 	__fixsfsi
265*e4b17023SJohn Marino #	define float_to_usi 	__fixunssfsi
266*e4b17023SJohn Marino #	define negate 		__negsf2
267*e4b17023SJohn Marino #	define sf_to_df		__extendsfdf2
268*e4b17023SJohn Marino #	define sf_to_tf		__extendsftf2
269*e4b17023SJohn Marino #else
270*e4b17023SJohn Marino #	define add 		__adddf3
271*e4b17023SJohn Marino #	define sub 		__subdf3
272*e4b17023SJohn Marino #	define multiply 	__muldf3
273*e4b17023SJohn Marino #	define divide 		__divdf3
274*e4b17023SJohn Marino #	define compare 		__cmpdf2
275*e4b17023SJohn Marino #	define _eq_f2 		__eqdf2
276*e4b17023SJohn Marino #	define _ne_f2 		__nedf2
277*e4b17023SJohn Marino #	define _gt_f2 		__gtdf2
278*e4b17023SJohn Marino #	define _ge_f2 		__gedf2
279*e4b17023SJohn Marino #	define _lt_f2 		__ltdf2
280*e4b17023SJohn Marino #	define _le_f2 		__ledf2
281*e4b17023SJohn Marino #	define _unord_f2	__unorddf2
282*e4b17023SJohn Marino #	define usi_to_float 	__floatunsidf
283*e4b17023SJohn Marino #	define si_to_float 	__floatsidf
284*e4b17023SJohn Marino #	define float_to_si 	__fixdfsi
285*e4b17023SJohn Marino #	define float_to_usi 	__fixunsdfsi
286*e4b17023SJohn Marino #	define negate 		__negdf2
287*e4b17023SJohn Marino #	define df_to_sf		__truncdfsf2
288*e4b17023SJohn Marino #	define df_to_tf		__extenddftf2
289*e4b17023SJohn Marino #endif /* FLOAT */
290*e4b17023SJohn Marino 
291*e4b17023SJohn Marino #ifndef INLINE
292*e4b17023SJohn Marino #define INLINE __inline__
293*e4b17023SJohn Marino #endif
294*e4b17023SJohn Marino 
295*e4b17023SJohn Marino /* Preserve the sticky-bit when shifting fractions to the right.  */
296*e4b17023SJohn Marino #define LSHIFT(a, s) { a = (a >> s) | !!(a & (((fractype) 1 << s) - 1)); }
297*e4b17023SJohn Marino 
298*e4b17023SJohn Marino /* numeric parameters */
299*e4b17023SJohn Marino /* F_D_BITOFF is the number of bits offset between the MSB of the mantissa
300*e4b17023SJohn Marino    of a float and of a double. Assumes there are only two float types.
301*e4b17023SJohn Marino    (double::FRAC_BITS+double::NGARDS-(float::FRAC_BITS-float::NGARDS))
302*e4b17023SJohn Marino  */
303*e4b17023SJohn Marino #define F_D_BITOFF (52+8-(23+7))
304*e4b17023SJohn Marino 
305*e4b17023SJohn Marino #ifdef TMODES
306*e4b17023SJohn Marino # define F_T_BITOFF (__LDBL_MANT_DIG__-1+10-(23+7))
307*e4b17023SJohn Marino # define D_T_BITOFF (__LDBL_MANT_DIG__-1+10-(52+8))
308*e4b17023SJohn Marino #endif
309*e4b17023SJohn Marino 
310*e4b17023SJohn Marino 
311*e4b17023SJohn Marino #define NORMAL_EXPMIN (-(EXPBIAS)+1)
312*e4b17023SJohn Marino #define IMPLICIT_1 ((fractype)1<<(FRACBITS+NGARDS))
313*e4b17023SJohn Marino #define IMPLICIT_2 ((fractype)1<<(FRACBITS+1+NGARDS))
314*e4b17023SJohn Marino 
315*e4b17023SJohn Marino /* common types */
316*e4b17023SJohn Marino 
317*e4b17023SJohn Marino typedef enum
318*e4b17023SJohn Marino {
319*e4b17023SJohn Marino   CLASS_SNAN,
320*e4b17023SJohn Marino   CLASS_QNAN,
321*e4b17023SJohn Marino   CLASS_ZERO,
322*e4b17023SJohn Marino   CLASS_NUMBER,
323*e4b17023SJohn Marino   CLASS_INFINITY
324*e4b17023SJohn Marino } fp_class_type;
325*e4b17023SJohn Marino 
326*e4b17023SJohn Marino typedef struct
327*e4b17023SJohn Marino {
328*e4b17023SJohn Marino #ifdef SMALL_MACHINE
329*e4b17023SJohn Marino   char class;
330*e4b17023SJohn Marino   unsigned char sign;
331*e4b17023SJohn Marino   short normal_exp;
332*e4b17023SJohn Marino #else
333*e4b17023SJohn Marino   fp_class_type class;
334*e4b17023SJohn Marino   unsigned int sign;
335*e4b17023SJohn Marino   int normal_exp;
336*e4b17023SJohn Marino #endif
337*e4b17023SJohn Marino 
338*e4b17023SJohn Marino   union
339*e4b17023SJohn Marino     {
340*e4b17023SJohn Marino       fractype ll;
341*e4b17023SJohn Marino       halffractype l[2];
342*e4b17023SJohn Marino     } fraction;
343*e4b17023SJohn Marino } fp_number_type;
344*e4b17023SJohn Marino 
345*e4b17023SJohn Marino typedef union
346*e4b17023SJohn Marino {
347*e4b17023SJohn Marino   FLO_type value;
348*e4b17023SJohn Marino   fractype value_raw;
349*e4b17023SJohn Marino 
350*e4b17023SJohn Marino #ifndef FLOAT
351*e4b17023SJohn Marino # ifdef qrtrfractype
352*e4b17023SJohn Marino   qrtrfractype qwords[4];
353*e4b17023SJohn Marino # else
354*e4b17023SJohn Marino   halffractype words[2];
355*e4b17023SJohn Marino # endif
356*e4b17023SJohn Marino #endif
357*e4b17023SJohn Marino 
358*e4b17023SJohn Marino #ifdef FLOAT_BIT_ORDER_MISMATCH
359*e4b17023SJohn Marino   struct
360*e4b17023SJohn Marino     {
361*e4b17023SJohn Marino       fractype fraction:FRACBITS __attribute__ ((packed));
362*e4b17023SJohn Marino       unsigned int exp:EXPBITS __attribute__ ((packed));
363*e4b17023SJohn Marino       unsigned int sign:1 __attribute__ ((packed));
364*e4b17023SJohn Marino     }
365*e4b17023SJohn Marino   bits;
366*e4b17023SJohn Marino #endif
367*e4b17023SJohn Marino 
368*e4b17023SJohn Marino #ifdef _DEBUG_BITFLOAT
369*e4b17023SJohn Marino   struct
370*e4b17023SJohn Marino     {
371*e4b17023SJohn Marino       unsigned int sign:1 __attribute__ ((packed));
372*e4b17023SJohn Marino       unsigned int exp:EXPBITS __attribute__ ((packed));
373*e4b17023SJohn Marino       fractype fraction:FRACBITS __attribute__ ((packed));
374*e4b17023SJohn Marino     }
375*e4b17023SJohn Marino   bits_big_endian;
376*e4b17023SJohn Marino 
377*e4b17023SJohn Marino   struct
378*e4b17023SJohn Marino     {
379*e4b17023SJohn Marino       fractype fraction:FRACBITS __attribute__ ((packed));
380*e4b17023SJohn Marino       unsigned int exp:EXPBITS __attribute__ ((packed));
381*e4b17023SJohn Marino       unsigned int sign:1 __attribute__ ((packed));
382*e4b17023SJohn Marino     }
383*e4b17023SJohn Marino   bits_little_endian;
384*e4b17023SJohn Marino #endif
385*e4b17023SJohn Marino }
386*e4b17023SJohn Marino FLO_union_type;
387*e4b17023SJohn Marino 
388*e4b17023SJohn Marino /* Prototypes.  */
389*e4b17023SJohn Marino 
390*e4b17023SJohn Marino #if defined(L_pack_df) || defined(L_pack_sf) || defined(L_pack_tf)
391*e4b17023SJohn Marino extern FLO_type pack_d (const fp_number_type *);
392*e4b17023SJohn Marino #endif
393*e4b17023SJohn Marino 
394*e4b17023SJohn Marino extern void unpack_d (FLO_union_type *, fp_number_type *);
395*e4b17023SJohn Marino 
396*e4b17023SJohn Marino #if defined(L_addsub_sf) || defined(L_addsub_df) || defined(L_addsub_tf)
397*e4b17023SJohn Marino extern FLO_type add (FLO_type, FLO_type);
398*e4b17023SJohn Marino extern FLO_type sub (FLO_type, FLO_type);
399*e4b17023SJohn Marino #endif
400*e4b17023SJohn Marino 
401*e4b17023SJohn Marino #if defined(L_mul_sf) || defined(L_mul_df) || defined(L_mul_tf)
402*e4b17023SJohn Marino extern FLO_type multiply (FLO_type, FLO_type);
403*e4b17023SJohn Marino #endif
404*e4b17023SJohn Marino 
405*e4b17023SJohn Marino #if defined(L_div_sf) || defined(L_div_df) || defined(L_div_tf)
406*e4b17023SJohn Marino extern FLO_type divide (FLO_type, FLO_type);
407*e4b17023SJohn Marino #endif
408*e4b17023SJohn Marino 
409*e4b17023SJohn Marino extern int __fpcmp_parts (fp_number_type *, fp_number_type *);
410*e4b17023SJohn Marino 
411*e4b17023SJohn Marino #if defined(L_compare_sf) || defined(L_compare_df) || defined(L_compare_tf)
412*e4b17023SJohn Marino extern CMPtype compare (FLO_type, FLO_type);
413*e4b17023SJohn Marino #endif
414*e4b17023SJohn Marino 
415*e4b17023SJohn Marino #if defined(L_eq_sf) || defined(L_eq_df) || defined(L_eq_tf)
416*e4b17023SJohn Marino extern CMPtype _eq_f2 (FLO_type, FLO_type);
417*e4b17023SJohn Marino #endif
418*e4b17023SJohn Marino 
419*e4b17023SJohn Marino #if defined(L_ne_sf) || defined(L_ne_df) || defined(L_ne_tf)
420*e4b17023SJohn Marino extern CMPtype _ne_f2 (FLO_type, FLO_type);
421*e4b17023SJohn Marino #endif
422*e4b17023SJohn Marino 
423*e4b17023SJohn Marino #if defined(L_gt_sf) || defined(L_gt_df) || defined(L_gt_tf)
424*e4b17023SJohn Marino extern CMPtype _gt_f2 (FLO_type, FLO_type);
425*e4b17023SJohn Marino #endif
426*e4b17023SJohn Marino 
427*e4b17023SJohn Marino #if defined(L_ge_sf) || defined(L_ge_df) || defined(L_ge_tf)
428*e4b17023SJohn Marino extern CMPtype _ge_f2 (FLO_type, FLO_type);
429*e4b17023SJohn Marino #endif
430*e4b17023SJohn Marino 
431*e4b17023SJohn Marino #if defined(L_lt_sf) || defined(L_lt_df) || defined(L_lt_tf)
432*e4b17023SJohn Marino extern CMPtype _lt_f2 (FLO_type, FLO_type);
433*e4b17023SJohn Marino #endif
434*e4b17023SJohn Marino 
435*e4b17023SJohn Marino #if defined(L_le_sf) || defined(L_le_df) || defined(L_le_tf)
436*e4b17023SJohn Marino extern CMPtype _le_f2 (FLO_type, FLO_type);
437*e4b17023SJohn Marino #endif
438*e4b17023SJohn Marino 
439*e4b17023SJohn Marino #if defined(L_unord_sf) || defined(L_unord_df) || defined(L_unord_tf)
440*e4b17023SJohn Marino extern CMPtype _unord_f2 (FLO_type, FLO_type);
441*e4b17023SJohn Marino #endif
442*e4b17023SJohn Marino 
443*e4b17023SJohn Marino #if defined(L_si_to_sf) || defined(L_si_to_df) || defined(L_si_to_tf)
444*e4b17023SJohn Marino extern FLO_type si_to_float (SItype);
445*e4b17023SJohn Marino #endif
446*e4b17023SJohn Marino 
447*e4b17023SJohn Marino #if defined(L_sf_to_si) || defined(L_df_to_si) || defined(L_tf_to_si)
448*e4b17023SJohn Marino extern SItype float_to_si (FLO_type);
449*e4b17023SJohn Marino #endif
450*e4b17023SJohn Marino 
451*e4b17023SJohn Marino #if defined(L_tf_to_usi)
452*e4b17023SJohn Marino extern USItype float_to_usi (FLO_type);
453*e4b17023SJohn Marino #endif
454*e4b17023SJohn Marino 
455*e4b17023SJohn Marino #if defined(L_usi_to_sf) || defined(L_usi_to_df) || defined(L_usi_to_tf)
456*e4b17023SJohn Marino extern FLO_type usi_to_float (USItype);
457*e4b17023SJohn Marino #endif
458*e4b17023SJohn Marino 
459*e4b17023SJohn Marino #if defined(L_negate_sf) || defined(L_negate_df) || defined(L_negate_tf)
460*e4b17023SJohn Marino extern FLO_type negate (FLO_type);
461*e4b17023SJohn Marino #endif
462*e4b17023SJohn Marino 
463*e4b17023SJohn Marino #ifdef FLOAT
464*e4b17023SJohn Marino #if defined(L_make_sf)
465*e4b17023SJohn Marino extern SFtype __make_fp (fp_class_type, unsigned int, int, USItype);
466*e4b17023SJohn Marino #endif
467*e4b17023SJohn Marino #ifndef FLOAT_ONLY
468*e4b17023SJohn Marino extern DFtype __make_dp (fp_class_type, unsigned int, int, UDItype);
469*e4b17023SJohn Marino #if defined(L_sf_to_df)
470*e4b17023SJohn Marino extern DFtype sf_to_df (SFtype);
471*e4b17023SJohn Marino #endif
472*e4b17023SJohn Marino #if defined(L_sf_to_tf) && defined(TMODES)
473*e4b17023SJohn Marino extern TFtype sf_to_tf (SFtype);
474*e4b17023SJohn Marino #endif
475*e4b17023SJohn Marino #endif /* ! FLOAT_ONLY */
476*e4b17023SJohn Marino #endif /* FLOAT */
477*e4b17023SJohn Marino 
478*e4b17023SJohn Marino #ifndef FLOAT
479*e4b17023SJohn Marino extern SFtype __make_fp (fp_class_type, unsigned int, int, USItype);
480*e4b17023SJohn Marino #if defined(L_make_df)
481*e4b17023SJohn Marino extern DFtype __make_dp (fp_class_type, unsigned int, int, UDItype);
482*e4b17023SJohn Marino #endif
483*e4b17023SJohn Marino #if defined(L_df_to_sf)
484*e4b17023SJohn Marino extern SFtype df_to_sf (DFtype);
485*e4b17023SJohn Marino #endif
486*e4b17023SJohn Marino #if defined(L_df_to_tf) && defined(TMODES)
487*e4b17023SJohn Marino extern TFtype df_to_tf (DFtype);
488*e4b17023SJohn Marino #endif
489*e4b17023SJohn Marino #endif /* ! FLOAT */
490*e4b17023SJohn Marino 
491*e4b17023SJohn Marino #ifdef TMODES
492*e4b17023SJohn Marino extern DFtype __make_dp (fp_class_type, unsigned int, int, UDItype);
493*e4b17023SJohn Marino extern TFtype __make_tp (fp_class_type, unsigned int, int, UTItype);
494*e4b17023SJohn Marino #ifdef TFLOAT
495*e4b17023SJohn Marino #if defined(L_tf_to_sf)
496*e4b17023SJohn Marino extern SFtype tf_to_sf (TFtype);
497*e4b17023SJohn Marino #endif
498*e4b17023SJohn Marino #if defined(L_tf_to_df)
499*e4b17023SJohn Marino extern DFtype tf_to_df (TFtype);
500*e4b17023SJohn Marino #endif
501*e4b17023SJohn Marino #if defined(L_di_to_tf)
502*e4b17023SJohn Marino extern TFtype di_to_df (DItype);
503*e4b17023SJohn Marino #endif
504*e4b17023SJohn Marino #endif /* TFLOAT */
505*e4b17023SJohn Marino #endif /* TMODES */
506*e4b17023SJohn Marino 
507*e4b17023SJohn Marino #endif /* ! GCC_FP_BIT_H */
508