1 /* This is a software floating point library which can be used instead of
2 the floating point routines in libgcc1.c for targets without hardware
5 /* Copyright (C) 1994 Free Software Foundation, Inc.
7 This file is free software; you can redistribute it and/or modify it
8 under the terms of the GNU General Public License as published by the
9 Free Software Foundation; either version 2, or (at your option) any
12 In addition to the permissions in the GNU General Public License, the
13 Free Software Foundation gives you unlimited permission to link the
14 compiled version of this file with other programs, and to distribute
15 those programs without any restriction coming from the use of this
16 file. (The General Public License restrictions do apply in other
17 respects; for example, they cover modification of the file, and
18 distribution when not linked into another program.)
20 This file is distributed in the hope that it will be useful, but
21 WITHOUT ANY WARRANTY; without even the implied warranty of
22 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
23 General Public License for more details.
25 You should have received a copy of the GNU General Public License
26 along with this program; see the file COPYING. If not, write to
27 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
29 /* As a special exception, if you link this library with other files,
30 some of which are compiled with GCC, to produce an executable,
31 this library does not by itself cause the resulting executable
32 to be covered by the GNU General Public License.
33 This exception does not however invalidate any other reasons why
34 the executable file might be covered by the GNU General Public License. */
36 /* This implements IEEE 754 format arithmetic, but does not provide a
37 mechanism for setting the rounding mode, or for generating or handling
40 The original code by Steve Chamberlain, hacked by Mark Eichin and Jim
41 Wilson, all of Cygnus Support. */
43 /* The intended way to use this file is to make two copies, add `#define FLOAT'
44 to one copy, then compile both copies and add them to libgcc.a. */
46 /* The following macros can be defined to change the behaviour of this file:
47 FLOAT: Implement a `float', aka SFmode, fp library. If this is not
48 defined, then this file implements a `double', aka DFmode, fp library.
49 FLOAT_ONLY: Used with FLOAT, to implement a `float' only library, i.e.
50 don't include float->double conversion which requires the double library.
51 This is useful only for machines which can't support doubles, e.g. some
53 CMPtype: Specify the type that floating point compares should return.
54 This defaults to SItype, aka int.
55 US_SOFTWARE_GOFAST: This makes all entry points use the same names as the
56 US Software goFast library. If this is not defined, the entry points use
57 the same names as libgcc1.c.
58 _DEBUG_BITFLOAT: This makes debugging the code a little easier, by adding
59 two integers to the FLO_union_type.
60 NO_NANS: Disable nan and infinity handling
61 SMALL_MACHINE: Useful when operations on QIs and HIs are faster
65 typedef SFtype
__attribute__ ((mode (SF
)));
68 typedef DFtype
__attribute__ ((mode (DF
)));
72 typedef int HItype
__attribute__ ((mode (HI
)));
75 typedef int SItype
__attribute__ ((mode (SI
)));
78 typedef int DItype
__attribute__ ((mode (DI
)));
81 /* The type of the result of a fp compare */
83 #define CMPtype SItype
87 typedef unsigned int UHItype
__attribute__ ((mode (HI
)));
90 typedef unsigned int USItype
__attribute__ ((mode (SI
)));
93 typedef unsigned int UDItype
__attribute__ ((mode (DI
)));
96 #define MAX_SI_INT ((SItype) ((unsigned) (~0)>>1))
97 #define MAX_USI_INT ((USItype) ~0)
106 # define GARDROUND 0x3f
107 # define GARDMASK 0x7f
108 # define GARDMSB 0x40
112 # define EXPMAX (0xff)
113 # define QUIET_NAN 0x100000L
114 # define FRAC_NBITS 32
115 # define FRACHIGH 0x80000000L
116 # define FRACHIGH2 0xc0000000L
117 typedef USItype fractype
;
118 typedef UHItype halffractype
;
119 typedef SFtype FLO_type
;
120 typedef SItype intfrac
;
123 # define PREFIXFPDP dp
124 # define PREFIXSFDF df
126 # define GARDROUND 0x7f
127 # define GARDMASK 0xff
128 # define GARDMSB 0x80
130 # define EXPBIAS 1023
132 # define EXPMAX (0x7ff)
133 # define QUIET_NAN 0x8000000000000LL
134 # define FRAC_NBITS 64
135 # define FRACHIGH 0x8000000000000000LL
136 # define FRACHIGH2 0xc000000000000000LL
137 typedef UDItype fractype
;
138 typedef USItype halffractype
;
139 typedef DFtype FLO_type
;
140 typedef DItype intfrac
;
143 #ifdef US_SOFTWARE_GOFAST
147 # define multiply fpmul
148 # define divide fpdiv
149 # define compare fpcmp
150 # define si_to_float sitofp
151 # define float_to_si fptosi
152 # define float_to_usi fptoui
153 # define negate __negsf2
154 # define sf_to_df fptodp
155 # define dptofp dptofp
159 # define multiply dpmul
160 # define divide dpdiv
161 # define compare dpcmp
162 # define si_to_float litodp
163 # define float_to_si dptoli
164 # define float_to_usi dptoul
165 # define negate __negdf2
166 # define df_to_sf dptofp
170 # define add __addsf3
171 # define sub __subsf3
172 # define multiply __mulsf3
173 # define divide __divsf3
174 # define compare __cmpsf2
175 # define _eq_f2 __eqsf2
176 # define _ne_f2 __nesf2
177 # define _gt_f2 __gtsf2
178 # define _ge_f2 __gesf2
179 # define _lt_f2 __ltsf2
180 # define _le_f2 __lesf2
181 # define si_to_float __floatsisf
182 # define float_to_si __fixsfsi
183 # define float_to_usi __fixunssfsi
184 # define negate __negsf2
185 # define sf_to_df __extendsfdf2
187 # define add __adddf3
188 # define sub __subdf3
189 # define multiply __muldf3
190 # define divide __divdf3
191 # define compare __cmpdf2
192 # define _eq_f2 __eqdf2
193 # define _ne_f2 __nedf2
194 # define _gt_f2 __gtdf2
195 # define _ge_f2 __gedf2
196 # define _lt_f2 __ltdf2
197 # define _le_f2 __ledf2
198 # define si_to_float __floatsidf
199 # define float_to_si __fixdfsi
200 # define float_to_usi __fixunsdfsi
201 # define negate __negdf2
202 # define df_to_sf __truncdfsf2
208 #define INLINE __inline__
211 /* Preserve the sticky-bit when shifting fractions to the right. */
212 #define LSHIFT(a) { a = (a & 1) | (a >> 1); }
214 /* numeric parameters */
215 /* F_D_BITOFF is the number of bits offset between the MSB of the mantissa
216 of a float and of a double. Assumes there are only two float types.
217 (double::FRAC_BITS+double::NGARGS-(float::FRAC_BITS-float::NGARDS))
219 #define F_D_BITOFF (52+8-(23+7))
222 #define NORMAL_EXPMIN (-(EXPBIAS)+1)
223 #define IMPLICIT_1 (1LL<<(FRACBITS+NGARDS))
224 #define IMPLICIT_2 (1LL<<(FRACBITS+1+NGARDS))
259 #ifdef _DEBUG_BITFLOAT
264 #ifndef FLOAT_BIT_ORDER_MISMATCH
265 unsigned int sign
:1 __attribute__ ((packed
));
266 unsigned int exp
:EXPBITS
__attribute__ ((packed
));
267 fractype fraction
:FRACBITS
__attribute__ ((packed
));
269 fractype fraction
:FRACBITS
__attribute__ ((packed
));
270 unsigned int exp
:EXPBITS
__attribute__ ((packed
));
271 unsigned int sign
:1 __attribute__ ((packed
));
281 /* IEEE "special" number predicates */
291 static fp_number_type
*
294 static fp_number_type thenan
;
301 isnan ( fp_number_type
* x
)
303 return x
->class == CLASS_SNAN
|| x
->class == CLASS_QNAN
;
308 isinf ( fp_number_type
* x
)
310 return x
->class == CLASS_INFINITY
;
317 iszero ( fp_number_type
* x
)
319 return x
->class == CLASS_ZERO
;
324 flip_sign ( fp_number_type
* x
)
330 pack_d ( fp_number_type
* src
)
333 fractype fraction
= src
->fraction
.ll
; /* wasn't unsigned before? */
335 dst
.bits
.sign
= src
->sign
;
339 dst
.bits
.exp
= EXPMAX
;
340 dst
.bits
.fraction
= src
->fraction
.ll
;
341 if (src
->class == CLASS_QNAN
|| 1)
343 dst
.bits
.fraction
|= QUIET_NAN
;
346 else if (isinf (src
))
348 dst
.bits
.exp
= EXPMAX
;
349 dst
.bits
.fraction
= 0;
351 else if (iszero (src
))
354 dst
.bits
.fraction
= 0;
356 else if (fraction
== 0)
362 if (src
->normal_exp
< NORMAL_EXPMIN
)
364 /* This number's exponent is too low to fit into the bits
365 available in the number, so we'll store 0 in the exponent and
366 shift the fraction to the right to make up for it. */
368 int shift
= NORMAL_EXPMIN
- src
->normal_exp
;
372 if (shift
> FRAC_NBITS
- NGARDS
)
374 /* No point shifting, since it's more that 64 out. */
379 /* Shift by the value */
383 dst
.bits
.fraction
= fraction
;
385 else if (src
->normal_exp
> EXPBIAS
)
387 dst
.bits
.exp
= EXPMAX
;
388 dst
.bits
.fraction
= 0;
392 dst
.bits
.exp
= src
->normal_exp
+ EXPBIAS
;
393 /* IF the gard bits are the all zero, but the first, then we're
394 half way between two numbers, choose the one which makes the
395 lsb of the answer 0. */
396 if ((fraction
& GARDMASK
) == GARDMSB
)
398 if (fraction
& (1 << NGARDS
))
399 fraction
+= GARDROUND
+ 1;
403 /* Add a one to the guards to round up */
404 fraction
+= GARDROUND
;
406 if (fraction
>= IMPLICIT_2
)
412 dst
.bits
.fraction
= fraction
;
419 unpack_d (FLO_union_type
* src
, fp_number_type
* dst
)
421 fractype fraction
= src
->bits
.fraction
;
423 dst
->sign
= src
->bits
.sign
;
424 if (src
->bits
.exp
== 0)
426 /* Hmm. Looks like 0 */
429 /* tastes like zero */
430 dst
->class = CLASS_ZERO
;
434 /* Zero exponent with non zero fraction - it's denormalized,
435 so there isn't a leading implicit one - we'll shift it so
437 dst
->normal_exp
= src
->bits
.exp
- EXPBIAS
+ 1;
440 dst
->class = CLASS_NUMBER
;
442 while (fraction
< IMPLICIT_1
)
448 dst
->fraction
.ll
= fraction
;
451 else if (src
->bits
.exp
== EXPMAX
)
456 /* Attached to a zero fraction - means infinity */
457 dst
->class = CLASS_INFINITY
;
461 /* Non zero fraction, means nan */
464 dst
->class = CLASS_SNAN
;
468 dst
->class = CLASS_QNAN
;
470 /* Keep the fraction part as the nan number */
471 dst
->fraction
.ll
= fraction
;
476 /* Nothing strange about this number */
477 dst
->normal_exp
= src
->bits
.exp
- EXPBIAS
;
478 dst
->class = CLASS_NUMBER
;
479 dst
->fraction
.ll
= (fraction
<< NGARDS
) | IMPLICIT_1
;
483 static fp_number_type
*
484 _fpadd_parts (fp_number_type
* a
,
486 fp_number_type
* tmp
)
490 /* Put commonly used fields in local variables. */
506 /* Adding infinities with opposite signs yields a NaN. */
507 if (isinf (b
) && a
->sign
!= b
->sign
)
524 /* Got two numbers. shift the smaller and increment the exponent till
529 a_normal_exp
= a
->normal_exp
;
530 b_normal_exp
= b
->normal_exp
;
531 a_fraction
= a
->fraction
.ll
;
532 b_fraction
= b
->fraction
.ll
;
534 diff
= a_normal_exp
- b_normal_exp
;
538 if (diff
< FRAC_NBITS
)
540 /* ??? This does shifts one bit at a time. Optimize. */
541 while (a_normal_exp
> b_normal_exp
)
546 while (b_normal_exp
> a_normal_exp
)
554 /* Somethings's up.. choose the biggest */
555 if (a_normal_exp
> b_normal_exp
)
557 b_normal_exp
= a_normal_exp
;
562 a_normal_exp
= b_normal_exp
;
568 if (a
->sign
!= b
->sign
)
572 tfraction
= -a_fraction
+ b_fraction
;
576 tfraction
= a_fraction
- b_fraction
;
581 tmp
->normal_exp
= a_normal_exp
;
582 tmp
->fraction
.ll
= tfraction
;
587 tmp
->normal_exp
= a_normal_exp
;
588 tmp
->fraction
.ll
= -tfraction
;
590 /* and renormalize it */
592 while (tmp
->fraction
.ll
< IMPLICIT_1
&& tmp
->fraction
.ll
)
594 tmp
->fraction
.ll
<<= 1;
601 tmp
->normal_exp
= a_normal_exp
;
602 tmp
->fraction
.ll
= a_fraction
+ b_fraction
;
604 tmp
->class = CLASS_NUMBER
;
605 /* Now the fraction is added, we have to shift down to renormalize the
608 if (tmp
->fraction
.ll
>= IMPLICIT_2
)
610 LSHIFT (tmp
->fraction
.ll
);
618 add (FLO_type arg_a
, FLO_type arg_b
)
625 unpack_d ((FLO_union_type
*) & arg_a
, &a
);
626 unpack_d ((FLO_union_type
*) & arg_b
, &b
);
628 res
= _fpadd_parts (&a
, &b
, &tmp
);
634 sub (FLO_type arg_a
, FLO_type arg_b
)
641 unpack_d ((FLO_union_type
*) & arg_a
, &a
);
642 unpack_d ((FLO_union_type
*) & arg_b
, &b
);
646 res
= _fpadd_parts (&a
, &b
, &tmp
);
651 static fp_number_type
*
652 _fpmul_parts ( fp_number_type
* a
,
654 fp_number_type
* tmp
)
661 a
->sign
= a
->sign
!= b
->sign
;
666 b
->sign
= a
->sign
!= b
->sign
;
673 a
->sign
= a
->sign
!= b
->sign
;
682 b
->sign
= a
->sign
!= b
->sign
;
687 a
->sign
= a
->sign
!= b
->sign
;
692 b
->sign
= a
->sign
!= b
->sign
;
696 /* Calculate the mantissa by multiplying both 64bit numbers to get a
699 fractype x
= a
->fraction
.ll
;
700 fractype ylow
= b
->fraction
.ll
;
704 #if defined(NO_DI_MODE)
706 /* ??? This does multiplies one bit at a time. Optimize. */
707 for (bit
= 0; bit
< FRAC_NBITS
; bit
++)
713 carry
= (low
+= ylow
) < ylow
;
714 high
+= yhigh
+ carry
;
727 /* Multiplying two 32 bit numbers to get a 64 bit number on
728 a machine with DI, so we're safe */
730 DItype answer
= (DItype
)(a
->fraction
.ll
) * (DItype
)(b
->fraction
.ll
);
736 /* Doing a 64*64 to 128 */
738 UDItype nl
= a
->fraction
.ll
& 0xffffffff;
739 UDItype nh
= a
->fraction
.ll
>> 32;
740 UDItype ml
= b
->fraction
.ll
& 0xffffffff;
741 UDItype mh
= b
->fraction
.ll
>>32;
742 UDItype pp_ll
= ml
* nl
;
743 UDItype pp_hl
= mh
* nl
;
744 UDItype pp_lh
= ml
* nh
;
745 UDItype pp_hh
= mh
* nh
;
748 UDItype ps_hh__
= pp_hl
+ pp_lh
;
750 res2
+= 0x100000000LL
;
751 pp_hl
= (ps_hh__
<< 32) & 0xffffffff00000000LL
;
752 res0
= pp_ll
+ pp_hl
;
755 res2
+= ((ps_hh__
>> 32) & 0xffffffffL
) + pp_hh
;
762 tmp
->normal_exp
= a
->normal_exp
+ b
->normal_exp
;
763 tmp
->sign
= a
->sign
!= b
->sign
;
765 tmp
->normal_exp
+= 2; /* ??????????????? */
767 tmp
->normal_exp
+= 4; /* ??????????????? */
769 while (high
>= IMPLICIT_2
)
779 while (high
< IMPLICIT_1
)
788 /* rounding is tricky. if we only round if it won't make us round later. */
792 if (((high
& GARDMASK
) != GARDMSB
)
793 && (((high
+ 1) & GARDMASK
) == GARDMSB
))
795 /* don't round, it gets done again later. */
803 if ((high
& GARDMASK
) == GARDMSB
)
805 if (high
& (1 << NGARDS
))
807 /* half way, so round to even */
808 high
+= GARDROUND
+ 1;
812 /* but we really weren't half way */
813 high
+= GARDROUND
+ 1;
816 tmp
->fraction
.ll
= high
;
817 tmp
->class = CLASS_NUMBER
;
822 multiply (FLO_type arg_a
, FLO_type arg_b
)
829 unpack_d ((FLO_union_type
*) & arg_a
, &a
);
830 unpack_d ((FLO_union_type
*) & arg_b
, &b
);
832 res
= _fpmul_parts (&a
, &b
, &tmp
);
837 static fp_number_type
*
838 _fpdiv_parts (fp_number_type
* a
,
840 fp_number_type
* tmp
)
844 fractype r0
, r1
, y0
, y1
, bit
;
847 fractype denominator
;
859 if (isinf (a
) || iszero (a
))
861 if (a
->class == b
->class)
865 a
->sign
= a
->sign
^ b
->sign
;
875 a
->class = CLASS_INFINITY
;
879 /* Calculate the mantissa by multiplying both 64bit numbers to get a
883 intfrac d0
, d1
; /* weren't unsigned before ??? */
886 ( numerator / denominator) * 2^(numerator exponent - denominator exponent)
889 a
->normal_exp
= a
->normal_exp
- b
->normal_exp
;
890 numerator
= a
->fraction
.ll
;
891 denominator
= b
->fraction
.ll
;
893 if (numerator
< denominator
)
895 /* Fraction will be less than 1.0 */
901 /* ??? Does divide one bit at a time. Optimize. */
904 if (numerator
>= denominator
)
907 numerator
-= denominator
;
913 if ((quotient
& GARDMASK
) == GARDMSB
)
915 if (quotient
& (1 << NGARDS
))
917 /* half way, so round to even */
918 quotient
+= GARDROUND
+ 1;
922 /* but we really weren't half way, more bits exist */
923 quotient
+= GARDROUND
+ 1;
927 a
->fraction
.ll
= quotient
;
933 divide (FLO_type arg_a
, FLO_type arg_b
)
940 unpack_d ((FLO_union_type
*) & arg_a
, &a
);
941 unpack_d ((FLO_union_type
*) & arg_b
, &b
);
943 res
= _fpdiv_parts (&a
, &b
, &tmp
);
948 /* according to the demo, fpcmp returns a comparison with 0... thus
955 _fpcmp_parts (fp_number_type
* a
, fp_number_type
* b
)
958 /* either nan -> unordered. Must be checked outside of this routine. */
959 if (isnan (a
) && isnan (b
))
961 return 1; /* still unordered! */
965 if (isnan (a
) || isnan (b
))
967 return 1; /* how to indicate unordered compare? */
969 if (isinf (a
) && isinf (b
))
971 /* +inf > -inf, but +inf != +inf */
972 /* b \a| +inf(0)| -inf(1)
973 ______\+--------+--------
974 +inf(0)| a==b(0)| a<b(-1)
975 -------+--------+--------
976 -inf(1)| a>b(1) | a==b(0)
977 -------+--------+--------
978 So since unordered must be non zero, just line up the columns...
980 return b
->sign
- a
->sign
;
982 /* but not both... */
985 return a
->sign
? -1 : 1;
989 return b
->sign
? 1 : -1;
991 if (iszero (a
) && iszero (b
))
997 return b
->sign
? 1 : -1;
1001 return a
->sign
? -1 : 1;
1003 /* now both are "normal". */
1004 if (a
->sign
!= b
->sign
)
1006 /* opposite signs */
1007 return a
->sign
? -1 : 1;
1009 /* same sign; exponents? */
1010 if (a
->normal_exp
> b
->normal_exp
)
1012 return a
->sign
? -1 : 1;
1014 if (a
->normal_exp
< b
->normal_exp
)
1016 return a
->sign
? 1 : -1;
1018 /* same exponents; check size. */
1019 if (a
->fraction
.ll
> b
->fraction
.ll
)
1021 return a
->sign
? -1 : 1;
1023 if (a
->fraction
.ll
< b
->fraction
.ll
)
1025 return a
->sign
? 1 : -1;
1027 /* after all that, they're equal. */
1032 compare (FLO_type arg_a
, FLO_type arg_b
)
1037 unpack_d ((FLO_union_type
*) & arg_a
, &a
);
1038 unpack_d ((FLO_union_type
*) & arg_b
, &b
);
1040 return _fpcmp_parts (&a
, &b
);
1043 #ifndef US_SOFTWARE_GOFAST
1045 /* These should be optimized for their specific tasks someday. */
1048 _eq_f2 (FLO_type arg_a
, FLO_type arg_b
)
1053 unpack_d ((FLO_union_type
*) & arg_a
, &a
);
1054 unpack_d ((FLO_union_type
*) & arg_b
, &b
);
1056 if (isnan (&a
) || isnan (&b
))
1057 return 1; /* false, truth == 0 */
1059 return _fpcmp_parts (&a
, &b
) ;
1063 _ne_f2 (FLO_type arg_a
, FLO_type arg_b
)
1068 unpack_d ((FLO_union_type
*) & arg_a
, &a
);
1069 unpack_d ((FLO_union_type
*) & arg_b
, &b
);
1071 if (isnan (&a
) || isnan (&b
))
1072 return 1; /* true, truth != 0 */
1074 return _fpcmp_parts (&a
, &b
) ;
1078 _gt_f2 (FLO_type arg_a
, FLO_type arg_b
)
1083 unpack_d ((FLO_union_type
*) & arg_a
, &a
);
1084 unpack_d ((FLO_union_type
*) & arg_b
, &b
);
1086 if (isnan (&a
) || isnan (&b
))
1087 return -1; /* false, truth > 0 */
1089 return _fpcmp_parts (&a
, &b
);
1093 _ge_f2 (FLO_type arg_a
, FLO_type arg_b
)
1098 unpack_d ((FLO_union_type
*) & arg_a
, &a
);
1099 unpack_d ((FLO_union_type
*) & arg_b
, &b
);
1101 if (isnan (&a
) || isnan (&b
))
1102 return -1; /* false, truth >= 0 */
1103 return _fpcmp_parts (&a
, &b
) ;
1107 _lt_f2 (FLO_type arg_a
, FLO_type arg_b
)
1112 unpack_d ((FLO_union_type
*) & arg_a
, &a
);
1113 unpack_d ((FLO_union_type
*) & arg_b
, &b
);
1115 if (isnan (&a
) || isnan (&b
))
1116 return 1; /* false, truth < 0 */
1118 return _fpcmp_parts (&a
, &b
);
1122 _le_f2 (FLO_type arg_a
, FLO_type arg_b
)
1127 unpack_d ((FLO_union_type
*) & arg_a
, &a
);
1128 unpack_d ((FLO_union_type
*) & arg_b
, &b
);
1130 if (isnan (&a
) || isnan (&b
))
1131 return 1; /* false, truth <= 0 */
1133 return _fpcmp_parts (&a
, &b
) ;
1136 #endif /* ! US_SOFTWARE_GOFAST */
1139 si_to_float (SItype arg_a
)
1143 in
.class = CLASS_NUMBER
;
1144 in
.sign
= arg_a
< 0;
1147 in
.class = CLASS_ZERO
;
1151 in
.normal_exp
= FRACBITS
+ NGARDS
;
1154 /* Special case for minint, since there is no +ve integer
1155 representation for it */
1156 if (arg_a
== 0x80000000)
1158 return -2147483648.0;
1160 in
.fraction
.ll
= (-arg_a
);
1163 in
.fraction
.ll
= arg_a
;
1165 while (in
.fraction
.ll
< (1LL << (FRACBITS
+ NGARDS
)))
1167 in
.fraction
.ll
<<= 1;
1171 return pack_d (&in
);
1175 float_to_si (FLO_type arg_a
)
1180 unpack_d ((FLO_union_type
*) & arg_a
, &a
);
1185 /* get reasonable MAX_SI_INT... */
1187 return a
.sign
? MAX_SI_INT
: (-MAX_SI_INT
)-1;
1188 /* it is a number, but a small one */
1189 if (a
.normal_exp
< 0)
1191 if (a
.normal_exp
> 30)
1192 return a
.sign
? (-MAX_SI_INT
)-1 : MAX_SI_INT
;
1193 tmp
= a
.fraction
.ll
>> ((FRACBITS
+ NGARDS
) - a
.normal_exp
);
1194 return a
.sign
? (-tmp
) : (tmp
);
1197 #ifdef US_SOFTWARE_GOFAST
1198 /* While libgcc2.c defines its own __fixunssfsi and __fixunsdfsi routines,
1199 we also define them for GOFAST because the ones in libgcc2.c have the
1200 wrong names and I'd rather define these here and keep GOFAST CYG-LOC's
1201 out of libgcc2.c. We can't define these here if not GOFAST because then
1202 there'd be duplicate copies. */
1205 float_to_usi (FLO_type arg_a
)
1209 unpack_d ((FLO_union_type
*) & arg_a
, &a
);
1214 /* get reasonable MAX_USI_INT... */
1216 return a
.sign
? MAX_USI_INT
: 0;
1217 /* it is a negative number */
1220 /* it is a number, but a small one */
1221 if (a
.normal_exp
< 0)
1223 if (a
.normal_exp
> 31)
1225 else if (a
.normal_exp
> (FRACBITS
+ NGARDS
))
1226 return a
.fraction
.ll
<< ((FRACBITS
+ NGARDS
) - a
.normal_exp
);
1228 return a
.fraction
.ll
>> ((FRACBITS
+ NGARDS
) - a
.normal_exp
);
1233 negate (FLO_type arg_a
)
1237 unpack_d ((FLO_union_type
*) & arg_a
, &a
);
1245 __make_fp(fp_class_type
class,
1254 in
.normal_exp
= exp
;
1255 in
.fraction
.ll
= frac
;
1256 return pack_d (&in
);
1261 /* This enables one to build an fp library that supports float but not double.
1262 Otherwise, we would get an undefined reference to __make_dp.
1263 This is needed for some 8-bit ports that can't handle well values that
1264 are 8-bytes in size, so we just don't support double for them at all. */
1266 extern DFtype
__make_dp (fp_class_type
, unsigned int, int, UDItype frac
);
1269 sf_to_df (SFtype arg_a
)
1273 unpack_d ((FLO_union_type
*) & arg_a
, &in
);
1274 return __make_dp (in
.class, in
.sign
, in
.normal_exp
,
1275 ((UDItype
) in
.fraction
.ll
) << F_D_BITOFF
);
1283 extern SFtype
__make_fp (fp_class_type
, unsigned int, int, USItype
);
1286 __make_dp (fp_class_type
class, unsigned int sign
, int exp
, UDItype frac
)
1292 in
.normal_exp
= exp
;
1293 in
.fraction
.ll
= frac
;
1294 return pack_d (&in
);
1298 df_to_sf (DFtype arg_a
)
1302 unpack_d ((FLO_union_type
*) & arg_a
, &in
);
1303 return __make_fp (in
.class, in
.sign
, in
.normal_exp
,
1304 in
.fraction
.ll
>> F_D_BITOFF
);