190075Sobrien/* Header file for fp-bit.c.  */
2169689Skan/* Copyright (C) 2000, 2002, 2003, 2006 Free Software Foundation, Inc.
390075Sobrien
4132718SkanThis file is part of GCC.
590075Sobrien
6169689SkanGCC is free software; you can redistribute it and/or modify it under
7169689Skanthe terms of the GNU General Public License as published by the Free
8169689SkanSoftware Foundation; either version 2, or (at your option) any later
9169689Skanversion.
1090075Sobrien
11169689SkanIn addition to the permissions in the GNU General Public License, the
12169689SkanFree Software Foundation gives you unlimited permission to link the
13169689Skancompiled version of this file into combinations with other programs,
14169689Skanand to distribute those combinations without any restriction coming
15169689Skanfrom the use of this file.  (The General Public License restrictions
16169689Skando apply in other respects; for example, they cover modification of
17169689Skanthe file, and distribution when not linked into a combine
18169689Skanexecutable.)
1990075Sobrien
20169689SkanGCC is distributed in the hope that it will be useful, but WITHOUT ANY
21169689SkanWARRANTY; without even the implied warranty of MERCHANTABILITY or
22169689SkanFITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
23169689Skanfor more details.
24169689Skan
2590075SobrienYou should have received a copy of the GNU General Public License
26169689Skanalong with GCC; see the file COPYING.  If not, write to the Free
27169689SkanSoftware Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
28169689Skan02110-1301, USA.  */
2990075Sobrien
3090075Sobrien#ifndef GCC_FP_BIT_H
3190075Sobrien#define GCC_FP_BIT_H
3290075Sobrien
3390075Sobrien/* Defining FINE_GRAINED_LIBRARIES allows one to select which routines
3490075Sobrien   from this file are compiled via additional -D options.
3590075Sobrien
3690075Sobrien   This avoids the need to pull in the entire fp emulation library
3790075Sobrien   when only a small number of functions are needed.
3890075Sobrien
39117395Skan   If FINE_GRAINED_LIBRARIES is not defined, then compile every
4090075Sobrien   suitable routine.  */
4190075Sobrien#ifndef FINE_GRAINED_LIBRARIES
4290075Sobrien#define L_pack_df
4390075Sobrien#define L_unpack_df
4490075Sobrien#define L_pack_sf
4590075Sobrien#define L_unpack_sf
4690075Sobrien#define L_addsub_sf
4790075Sobrien#define L_addsub_df
4890075Sobrien#define L_mul_sf
4990075Sobrien#define L_mul_df
5090075Sobrien#define L_div_sf
5190075Sobrien#define L_div_df
5290075Sobrien#define L_fpcmp_parts_sf
5390075Sobrien#define L_fpcmp_parts_df
5490075Sobrien#define L_compare_sf
5590075Sobrien#define L_compare_df
5690075Sobrien#define L_eq_sf
5790075Sobrien#define L_eq_df
5890075Sobrien#define L_ne_sf
5990075Sobrien#define L_ne_df
6090075Sobrien#define L_gt_sf
6190075Sobrien#define L_gt_df
6290075Sobrien#define L_ge_sf
6390075Sobrien#define L_ge_df
6490075Sobrien#define L_lt_sf
6590075Sobrien#define L_lt_df
6690075Sobrien#define L_le_sf
6790075Sobrien#define L_le_df
6890075Sobrien#define L_unord_sf
6990075Sobrien#define L_unord_df
7090075Sobrien#define L_usi_to_sf
7190075Sobrien#define L_usi_to_df
7290075Sobrien#define L_si_to_sf
7390075Sobrien#define L_si_to_df
7490075Sobrien#define L_sf_to_si
7590075Sobrien#define L_df_to_si
7690075Sobrien#define L_f_to_usi
7790075Sobrien#define L_df_to_usi
7890075Sobrien#define L_negate_sf
7990075Sobrien#define L_negate_df
8090075Sobrien#define L_make_sf
8190075Sobrien#define L_make_df
8290075Sobrien#define L_sf_to_df
8390075Sobrien#define L_df_to_sf
8490075Sobrien#ifdef FLOAT
8590075Sobrien#define L_thenan_sf
8690075Sobrien#else
8790075Sobrien#define L_thenan_df
8890075Sobrien#endif
8990075Sobrien#endif /* ! FINE_GRAINED_LIBRARIES */
9090075Sobrien
91117395Skan#if __LDBL_MANT_DIG__ == 113 || __LDBL_MANT_DIG__ == 106
92169689Skan# if defined(TFLOAT) || defined(L_sf_to_tf) || defined(L_df_to_tf)
93169689Skan#  define TMODES
94169689Skan# endif
95117395Skan#endif
96117395Skan
9790075Sobrientypedef float SFtype __attribute__ ((mode (SF)));
9890075Sobrientypedef float DFtype __attribute__ ((mode (DF)));
99117395Skan#ifdef TMODES
100117395Skantypedef float TFtype __attribute__ ((mode (TF)));
101117395Skan#endif
10290075Sobrien
10390075Sobrientypedef int HItype __attribute__ ((mode (HI)));
10490075Sobrientypedef int SItype __attribute__ ((mode (SI)));
10590075Sobrientypedef int DItype __attribute__ ((mode (DI)));
106117395Skan#ifdef TMODES
107117395Skantypedef int TItype __attribute__ ((mode (TI)));
108117395Skan#endif
10990075Sobrien
110169689Skan/* The type of the result of a floating point comparison.  This must
111169689Skan   match `word_mode' in GCC for the target.  */
11290075Sobrien#ifndef CMPtype
113169689Skantypedef int CMPtype __attribute__ ((mode (word)));
11490075Sobrien#endif
11590075Sobrien
11690075Sobrientypedef unsigned int UHItype __attribute__ ((mode (HI)));
11790075Sobrientypedef unsigned int USItype __attribute__ ((mode (SI)));
11890075Sobrientypedef unsigned int UDItype __attribute__ ((mode (DI)));
119117395Skan#ifdef TMODES
120117395Skantypedef unsigned int UTItype __attribute__ ((mode (TI)));
121117395Skan#endif
12290075Sobrien
12390075Sobrien#define MAX_USI_INT  (~(USItype)0)
12490075Sobrien#define MAX_SI_INT   ((SItype) (MAX_USI_INT >> 1))
12590075Sobrien#define BITS_PER_SI  (4 * BITS_PER_UNIT)
126117395Skan#ifdef TMODES
127117395Skan#define MAX_UDI_INT  (~(UDItype)0)
128117395Skan#define MAX_DI_INT   ((DItype) (MAX_UDI_INT >> 1))
129117395Skan#define BITS_PER_DI  (8 * BITS_PER_UNIT)
130117395Skan#endif
13190075Sobrien
13290075Sobrien#ifdef FLOAT_ONLY
13390075Sobrien#define NO_DI_MODE
13490075Sobrien#endif
13590075Sobrien
136117395Skan#ifdef TFLOAT
137117395Skan# ifndef TMODES
138117395Skan#  error "TFLOAT requires long double to have 113 bits of mantissa"
139117395Skan# endif
140117395Skan
141117395Skan#	define PREFIXFPDP tp
142117395Skan#	define PREFIXSFDF tf
143117395Skan#	define NGARDS 10L /* Is this right? */
144117395Skan#	define GARDROUND 0x1ff
145117395Skan#	define GARDMASK  0x3ff
146117395Skan#	define GARDMSB   0x200
147117395Skan#	define FRAC_NBITS 128
148117395Skan
149117395Skan# if __LDBL_MANT_DIG__ == 113 /* IEEE quad */
150117395Skan#	define EXPBITS 15
151117395Skan#	define EXPBIAS 16383
152117395Skan#	define EXPMAX (0x7fff)
153117395Skan#	define QUIET_NAN ((TItype)0x8 << 108)
154117395Skan#	define FRACHIGH  ((TItype)0x8 << 124)
155117395Skan#	define FRACHIGH2 ((TItype)0xc << 124)
156117395Skan#	define FRACBITS 112
157117395Skan# endif
158117395Skan
159117395Skan# if __LDBL_MANT_DIG__ == 106 /* IBM extended (double+double) */
160117395Skan#	define EXPBITS 11
161117395Skan#	define EXPBIAS 1023
162117395Skan#	define EXPMAX (0x7ff)
163117395Skan#	define QUIET_NAN ((TItype)0x8 << (48 + 64))
164117395Skan#	define FRACHIGH  ((TItype)0x8 << 124)
165117395Skan#	define FRACHIGH2 ((TItype)0xc << 124)
166117395Skan#	define FRACBITS 105
167117395Skan#	define HALFFRACBITS 52
168117395Skan#	define HALFSHIFT 64
169117395Skan# endif
170117395Skan
171117395Skan#	define pack_d __pack_t
172117395Skan#	define unpack_d __unpack_t
173117395Skan#	define __fpcmp_parts __fpcmp_parts_t
174117395Skan	typedef UTItype fractype;
175117395Skan	typedef UDItype halffractype;
176117395Skan	typedef USItype qrtrfractype;
177117395Skan#define qrtrfractype qrtrfractype
178117395Skan	typedef TFtype FLO_type;
179117395Skan	typedef TItype intfrac;
180117395Skan#elif defined FLOAT
18190075Sobrien#	define NGARDS    7L
18290075Sobrien#	define GARDROUND 0x3f
18390075Sobrien#	define GARDMASK  0x7f
18490075Sobrien#	define GARDMSB   0x40
18590075Sobrien#	define EXPBITS 8
18690075Sobrien#	define EXPBIAS 127
18790075Sobrien#	define FRACBITS 23
18890075Sobrien#	define EXPMAX (0xff)
18990075Sobrien#	define QUIET_NAN 0x100000L
19090075Sobrien#	define FRAC_NBITS 32
19190075Sobrien#	define FRACHIGH  0x80000000L
19290075Sobrien#	define FRACHIGH2 0xc0000000L
19390075Sobrien#	define pack_d __pack_f
19490075Sobrien#	define unpack_d __unpack_f
19590075Sobrien#	define __fpcmp_parts __fpcmp_parts_f
19690075Sobrien	typedef USItype fractype;
19790075Sobrien	typedef UHItype halffractype;
19890075Sobrien	typedef SFtype FLO_type;
19990075Sobrien	typedef SItype intfrac;
20090075Sobrien
20190075Sobrien#else
20290075Sobrien#	define PREFIXFPDP dp
20390075Sobrien#	define PREFIXSFDF df
20490075Sobrien#	define NGARDS 8L
20590075Sobrien#	define GARDROUND 0x7f
20690075Sobrien#	define GARDMASK  0xff
20790075Sobrien#	define GARDMSB   0x80
20890075Sobrien#	define EXPBITS 11
20990075Sobrien#	define EXPBIAS 1023
21090075Sobrien#	define FRACBITS 52
21190075Sobrien#	define EXPMAX (0x7ff)
21290075Sobrien#	define QUIET_NAN 0x8000000000000LL
21390075Sobrien#	define FRAC_NBITS 64
21490075Sobrien#	define FRACHIGH  0x8000000000000000LL
21590075Sobrien#	define FRACHIGH2 0xc000000000000000LL
21690075Sobrien#	define pack_d __pack_d
21790075Sobrien#	define unpack_d __unpack_d
21890075Sobrien#	define __fpcmp_parts __fpcmp_parts_d
21990075Sobrien	typedef UDItype fractype;
22090075Sobrien	typedef USItype halffractype;
22190075Sobrien	typedef DFtype FLO_type;
22290075Sobrien	typedef DItype intfrac;
22390075Sobrien#endif /* FLOAT */
22490075Sobrien
22590075Sobrien#ifdef US_SOFTWARE_GOFAST
226117395Skan#	ifdef TFLOAT
227117395Skan#		error "GOFAST TFmode not supported"
228117395Skan#	elif defined FLOAT
22990075Sobrien#		define add 		fpadd
23090075Sobrien#		define sub 		fpsub
23190075Sobrien#		define multiply 	fpmul
23290075Sobrien#		define divide 		fpdiv
23390075Sobrien#		define compare 		fpcmp
234117395Skan#		define _unord_f2	__unordsf2
23590075Sobrien#		define usi_to_float 	__floatunsisf
23690075Sobrien#		define si_to_float 	sitofp
23790075Sobrien#		define float_to_si 	fptosi
23890075Sobrien#		define float_to_usi 	fptoui
23990075Sobrien#		define negate 		__negsf2
24090075Sobrien#		define sf_to_df		fptodp
241117395Skan#		define sf_to_tf		__extendsftf2
242117395Skan#	else
24390075Sobrien#		define add 		dpadd
24490075Sobrien#		define sub 		dpsub
24590075Sobrien#		define multiply 	dpmul
24690075Sobrien#		define divide 		dpdiv
24790075Sobrien#		define compare 		dpcmp
248117395Skan#		define _unord_f2	__unorddf2
24990075Sobrien#		define usi_to_float 	__floatunsidf
25090075Sobrien#		define si_to_float 	litodp
25190075Sobrien#		define float_to_si 	dptoli
25290075Sobrien#		define float_to_usi 	dptoul
25390075Sobrien#		define negate 		__negdf2
25490075Sobrien#		define df_to_sf 	dptofp
255117395Skan#		define df_to_tf 	__extenddftf2
25690075Sobrien#	endif /* FLOAT */
25790075Sobrien#else
258117395Skan#	ifdef TFLOAT
259117395Skan#		define add 		__addtf3
260117395Skan#		define sub 		__subtf3
261117395Skan#		define multiply 	__multf3
262117395Skan#		define divide 		__divtf3
263117395Skan#		define compare 		__cmptf2
264117395Skan#		define _eq_f2 		__eqtf2
265117395Skan#		define _ne_f2 		__netf2
266117395Skan#		define _gt_f2 		__gttf2
267117395Skan#		define _ge_f2 		__getf2
268117395Skan#		define _lt_f2 		__lttf2
269117395Skan#		define _le_f2 		__letf2
270117395Skan#		define _unord_f2	__unordtf2
271117395Skan#		define usi_to_float 	__floatunsitf
272117395Skan#		define si_to_float 	__floatsitf
273117395Skan#		define float_to_si 	__fixtfsi
274117395Skan#		define float_to_usi 	__fixunstfsi
275117395Skan#		define negate 		__negtf2
276117395Skan#		define tf_to_sf		__trunctfsf2
277117395Skan#		define tf_to_df		__trunctfdf2
278117395Skan#	elif defined FLOAT
27990075Sobrien#		define add 		__addsf3
28090075Sobrien#		define sub 		__subsf3
28190075Sobrien#		define multiply 	__mulsf3
28290075Sobrien#		define divide 		__divsf3
28390075Sobrien#		define compare 		__cmpsf2
28490075Sobrien#		define _eq_f2 		__eqsf2
28590075Sobrien#		define _ne_f2 		__nesf2
28690075Sobrien#		define _gt_f2 		__gtsf2
28790075Sobrien#		define _ge_f2 		__gesf2
28890075Sobrien#		define _lt_f2 		__ltsf2
28990075Sobrien#		define _le_f2 		__lesf2
29090075Sobrien#		define _unord_f2	__unordsf2
29190075Sobrien#		define usi_to_float 	__floatunsisf
29290075Sobrien#		define si_to_float 	__floatsisf
29390075Sobrien#		define float_to_si 	__fixsfsi
29490075Sobrien#		define float_to_usi 	__fixunssfsi
29590075Sobrien#		define negate 		__negsf2
29690075Sobrien#		define sf_to_df		__extendsfdf2
297117395Skan#		define sf_to_tf		__extendsftf2
298117395Skan#	else
29990075Sobrien#		define add 		__adddf3
30090075Sobrien#		define sub 		__subdf3
30190075Sobrien#		define multiply 	__muldf3
30290075Sobrien#		define divide 		__divdf3
30390075Sobrien#		define compare 		__cmpdf2
30490075Sobrien#		define _eq_f2 		__eqdf2
30590075Sobrien#		define _ne_f2 		__nedf2
30690075Sobrien#		define _gt_f2 		__gtdf2
30790075Sobrien#		define _ge_f2 		__gedf2
30890075Sobrien#		define _lt_f2 		__ltdf2
30990075Sobrien#		define _le_f2 		__ledf2
31090075Sobrien#		define _unord_f2	__unorddf2
31190075Sobrien#		define usi_to_float 	__floatunsidf
31290075Sobrien#		define si_to_float 	__floatsidf
31390075Sobrien#		define float_to_si 	__fixdfsi
31490075Sobrien#		define float_to_usi 	__fixunsdfsi
31590075Sobrien#		define negate 		__negdf2
31690075Sobrien#		define df_to_sf		__truncdfsf2
317117395Skan#		define df_to_tf		__extenddftf2
31890075Sobrien#	endif /* FLOAT */
31990075Sobrien#endif /* US_SOFTWARE_GOFAST */
32090075Sobrien
32190075Sobrien#ifndef INLINE
32290075Sobrien#define INLINE __inline__
32390075Sobrien#endif
32490075Sobrien
32590075Sobrien/* Preserve the sticky-bit when shifting fractions to the right.  */
326169689Skan#define LSHIFT(a, s) { a = (a >> s) | !!(a & (((fractype) 1 << s) - 1)); }
32790075Sobrien
32890075Sobrien/* numeric parameters */
32990075Sobrien/* F_D_BITOFF is the number of bits offset between the MSB of the mantissa
33090075Sobrien   of a float and of a double. Assumes there are only two float types.
33190075Sobrien   (double::FRAC_BITS+double::NGARDS-(float::FRAC_BITS-float::NGARDS))
33290075Sobrien */
33390075Sobrien#define F_D_BITOFF (52+8-(23+7))
33490075Sobrien
335117395Skan#ifdef TMODES
336117395Skan# define F_T_BITOFF (__LDBL_MANT_DIG__-1+10-(23+7))
337117395Skan# define D_T_BITOFF (__LDBL_MANT_DIG__-1+10-(52+8))
338117395Skan#endif
33990075Sobrien
340117395Skan
34190075Sobrien#define NORMAL_EXPMIN (-(EXPBIAS)+1)
342117395Skan#define IMPLICIT_1 ((fractype)1<<(FRACBITS+NGARDS))
343117395Skan#define IMPLICIT_2 ((fractype)1<<(FRACBITS+1+NGARDS))
34490075Sobrien
34590075Sobrien/* common types */
34690075Sobrien
34790075Sobrientypedef enum
34890075Sobrien{
34990075Sobrien  CLASS_SNAN,
35090075Sobrien  CLASS_QNAN,
35190075Sobrien  CLASS_ZERO,
35290075Sobrien  CLASS_NUMBER,
35390075Sobrien  CLASS_INFINITY
35490075Sobrien} fp_class_type;
35590075Sobrien
35690075Sobrientypedef struct
35790075Sobrien{
35890075Sobrien#ifdef SMALL_MACHINE
35990075Sobrien  char class;
36090075Sobrien  unsigned char sign;
36190075Sobrien  short normal_exp;
36290075Sobrien#else
36390075Sobrien  fp_class_type class;
36490075Sobrien  unsigned int sign;
36590075Sobrien  int normal_exp;
36690075Sobrien#endif
36790075Sobrien
36890075Sobrien  union
36990075Sobrien    {
37090075Sobrien      fractype ll;
37190075Sobrien      halffractype l[2];
37290075Sobrien    } fraction;
37390075Sobrien} fp_number_type;
37490075Sobrien
37590075Sobrientypedef union
37690075Sobrien{
37790075Sobrien  FLO_type value;
37890075Sobrien  fractype value_raw;
37990075Sobrien
38090075Sobrien#ifndef FLOAT
381117395Skan# ifdef qrtrfractype
382117395Skan  qrtrfractype qwords[4];
383117395Skan# else
38490075Sobrien  halffractype words[2];
385117395Skan# endif
38690075Sobrien#endif
38790075Sobrien
38890075Sobrien#ifdef FLOAT_BIT_ORDER_MISMATCH
38990075Sobrien  struct
39090075Sobrien    {
39190075Sobrien      fractype fraction:FRACBITS __attribute__ ((packed));
39290075Sobrien      unsigned int exp:EXPBITS __attribute__ ((packed));
39390075Sobrien      unsigned int sign:1 __attribute__ ((packed));
39490075Sobrien    }
39590075Sobrien  bits;
39690075Sobrien#endif
39790075Sobrien
39890075Sobrien#ifdef _DEBUG_BITFLOAT
39990075Sobrien  struct
40090075Sobrien    {
40190075Sobrien      unsigned int sign:1 __attribute__ ((packed));
40290075Sobrien      unsigned int exp:EXPBITS __attribute__ ((packed));
40390075Sobrien      fractype fraction:FRACBITS __attribute__ ((packed));
40490075Sobrien    }
40590075Sobrien  bits_big_endian;
40690075Sobrien
40790075Sobrien  struct
40890075Sobrien    {
40990075Sobrien      fractype fraction:FRACBITS __attribute__ ((packed));
41090075Sobrien      unsigned int exp:EXPBITS __attribute__ ((packed));
41190075Sobrien      unsigned int sign:1 __attribute__ ((packed));
41290075Sobrien    }
41390075Sobrien  bits_little_endian;
41490075Sobrien#endif
41590075Sobrien}
41690075SobrienFLO_union_type;
41790075Sobrien
41890075Sobrien/* Prototypes */
41990075Sobrien
420117395Skan#if defined(L_pack_df) || defined(L_pack_sf) || defined(L_pack_tf)
42190075Sobrienextern FLO_type pack_d (fp_number_type *);
42290075Sobrien#endif
42390075Sobrien
42490075Sobrienextern void unpack_d (FLO_union_type *, fp_number_type *);
42590075Sobrien
426117395Skan#if defined(L_addsub_sf) || defined(L_addsub_df) || defined(L_addsub_tf)
42790075Sobrienextern FLO_type add (FLO_type, FLO_type);
42890075Sobrienextern FLO_type sub (FLO_type, FLO_type);
42990075Sobrien#endif
43090075Sobrien
431117395Skan#if defined(L_mul_sf) || defined(L_mul_df) || defined(L_mul_tf)
43290075Sobrienextern FLO_type multiply (FLO_type, FLO_type);
43390075Sobrien#endif
43490075Sobrien
435117395Skan#if defined(L_div_sf) || defined(L_div_df) || defined(L_div_tf)
43690075Sobrienextern FLO_type divide (FLO_type, FLO_type);
43790075Sobrien#endif
43890075Sobrien
43990075Sobrienextern int __fpcmp_parts (fp_number_type *, fp_number_type *);
44090075Sobrien
441117395Skan#if defined(L_compare_sf) || defined(L_compare_df) || defined(L_compare_tf)
44290075Sobrienextern CMPtype compare (FLO_type, FLO_type);
44390075Sobrien#endif
44490075Sobrien
44590075Sobrien#ifndef US_SOFTWARE_GOFAST
44690075Sobrien
447117395Skan#if defined(L_eq_sf) || defined(L_eq_df) || defined(L_eq_tf)
44890075Sobrienextern CMPtype _eq_f2 (FLO_type, FLO_type);
44990075Sobrien#endif
45090075Sobrien
451117395Skan#if defined(L_ne_sf) || defined(L_ne_df) || defined(L_ne_tf)
45290075Sobrienextern CMPtype _ne_f2 (FLO_type, FLO_type);
45390075Sobrien#endif
45490075Sobrien
455117395Skan#if defined(L_gt_sf) || defined(L_gt_df) || defined(L_gt_tf)
45690075Sobrienextern CMPtype _gt_f2 (FLO_type, FLO_type);
45790075Sobrien#endif
45890075Sobrien
459117395Skan#if defined(L_ge_sf) || defined(L_ge_df) || defined(L_ge_tf)
46090075Sobrienextern CMPtype _ge_f2 (FLO_type, FLO_type);
46190075Sobrien#endif
46290075Sobrien
463117395Skan#if defined(L_lt_sf) || defined(L_lt_df) || defined(L_lt_tf)
46490075Sobrienextern CMPtype _lt_f2 (FLO_type, FLO_type);
46590075Sobrien#endif
46690075Sobrien
467117395Skan#if defined(L_le_sf) || defined(L_le_df) || defined(L_le_tf)
46890075Sobrienextern CMPtype _le_f2 (FLO_type, FLO_type);
46990075Sobrien#endif
47090075Sobrien
471117395Skan#if defined(L_unord_sf) || defined(L_unord_df) || defined(L_unord_tf)
47290075Sobrienextern CMPtype _unord_f2 (FLO_type, FLO_type);
47390075Sobrien#endif
47490075Sobrien
47590075Sobrien#endif /* ! US_SOFTWARE_GOFAST */
47690075Sobrien
477117395Skan#if defined(L_si_to_sf) || defined(L_si_to_df) || defined(L_si_to_tf)
47890075Sobrienextern FLO_type si_to_float (SItype);
47990075Sobrien#endif
48090075Sobrien
481117395Skan#if defined(L_sf_to_si) || defined(L_df_to_si) || defined(L_tf_to_si)
48290075Sobrienextern SItype float_to_si (FLO_type);
48390075Sobrien#endif
48490075Sobrien
485117395Skan#if defined(L_sf_to_usi) || defined(L_df_to_usi) || defined(L_tf_to_usi)
486117395Skan#if defined(US_SOFTWARE_GOFAST) || defined(L_tf_to_usi)
48790075Sobrienextern USItype float_to_usi (FLO_type);
48890075Sobrien#endif
48990075Sobrien#endif
49090075Sobrien
491117395Skan#if defined(L_usi_to_sf) || defined(L_usi_to_df) || defined(L_usi_to_tf)
49290075Sobrienextern FLO_type usi_to_float (USItype);
49390075Sobrien#endif
49490075Sobrien
495117395Skan#if defined(L_negate_sf) || defined(L_negate_df) || defined(L_negate_tf)
49690075Sobrienextern FLO_type negate (FLO_type);
49790075Sobrien#endif
49890075Sobrien
49990075Sobrien#ifdef FLOAT
50090075Sobrien#if defined(L_make_sf)
50190075Sobrienextern SFtype __make_fp (fp_class_type, unsigned int, int, USItype);
50290075Sobrien#endif
50390075Sobrien#ifndef FLOAT_ONLY
50490075Sobrienextern DFtype __make_dp (fp_class_type, unsigned int, int, UDItype);
50590075Sobrien#if defined(L_sf_to_df)
50690075Sobrienextern DFtype sf_to_df (SFtype);
50790075Sobrien#endif
508117395Skan#if defined(L_sf_to_tf) && defined(TMODES)
509117395Skanextern TFtype sf_to_tf (SFtype);
510117395Skan#endif
51190075Sobrien#endif /* ! FLOAT_ONLY */
51290075Sobrien#endif /* FLOAT */
51390075Sobrien
51490075Sobrien#ifndef FLOAT
51590075Sobrienextern SFtype __make_fp (fp_class_type, unsigned int, int, USItype);
51690075Sobrien#if defined(L_make_df)
51790075Sobrienextern DFtype __make_dp (fp_class_type, unsigned int, int, UDItype);
51890075Sobrien#endif
51990075Sobrien#if defined(L_df_to_sf)
52090075Sobrienextern SFtype df_to_sf (DFtype);
52190075Sobrien#endif
522117395Skan#if defined(L_df_to_tf) && defined(TMODES)
523117395Skanextern TFtype df_to_tf (DFtype);
524117395Skan#endif
52590075Sobrien#endif /* ! FLOAT */
52690075Sobrien
527117395Skan#ifdef TMODES
528117395Skanextern DFtype __make_dp (fp_class_type, unsigned int, int, UDItype);
529117395Skanextern TFtype __make_tp (fp_class_type, unsigned int, int, UTItype);
530117395Skan#ifdef TFLOAT
531117395Skan#if defined(L_tf_to_sf)
532117395Skanextern SFtype tf_to_sf (TFtype);
533117395Skan#endif
534117395Skan#if defined(L_tf_to_df)
535117395Skanextern DFtype tf_to_df (TFtype);
536117395Skan#endif
537117395Skan#if defined(L_di_to_tf)
538117395Skanextern TFtype di_to_df (DItype);
539117395Skan#endif
540117395Skan#endif /* TFLOAT */
541117395Skan#endif /* TMODES */
542117395Skan
54390075Sobrien#endif /* ! GCC_FP_BIT_H */
544