1 /* This is a software floating point library which can be used
2 for targets without hardware floating point.
3 Copyright (C) 1994, 1995, 1996, 1997, 1998, 2000, 2001, 2002, 2003,
4 2004, 2005 Free Software Foundation, Inc.
6 This file is free software; you can redistribute it and/or modify it
7 under the terms of the GNU General Public License as published by the
8 Free Software Foundation; either version 2, or (at your option) any
11 In addition to the permissions in the GNU General Public License, the
12 Free Software Foundation gives you unlimited permission to link the
13 compiled version of this file with other programs, and to distribute
14 those programs without any restriction coming from the use of this
15 file. (The General Public License restrictions do apply in other
16 respects; for example, they cover modification of the file, and
17 distribution when not linked into another program.)
19 This file is distributed in the hope that it will be useful, but
20 WITHOUT ANY WARRANTY; without even the implied warranty of
21 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
22 General Public License for more details.
24 You should have received a copy of the GNU General Public License
25 along with this program; see the file COPYING. If not, write to
26 the Free Software Foundation, 51 Franklin Street, Fifth Floor,
27 Boston, MA 02110-1301, 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. */
47 #include "coretypes.h"
49 #include "config/fp-bit.h"
51 /* The following macros can be defined to change the behavior of this file:
52 FLOAT: Implement a `float', aka SFmode, fp library. If this is not
53 defined, then this file implements a `double', aka DFmode, fp library.
54 FLOAT_ONLY: Used with FLOAT, to implement a `float' only library, i.e.
55 don't include float->double conversion which requires the double library.
56 This is useful only for machines which can't support doubles, e.g. some
58 CMPtype: Specify the type that floating point compares should return.
59 This defaults to SItype, aka int.
60 US_SOFTWARE_GOFAST: This makes all entry points use the same names as the
61 US Software goFast library.
62 _DEBUG_BITFLOAT: This makes debugging the code a little easier, by adding
63 two integers to the FLO_union_type.
64 NO_DENORMALS: Disable handling of denormals.
65 NO_NANS: Disable nan and infinity handling
66 SMALL_MACHINE: Useful when operations on QIs and HIs are faster
69 /* We don't currently support extended floats (long doubles) on machines
70 without hardware to deal with them.
72 These stubs are just to keep the linker from complaining about unresolved
73 references which can be pulled in from libio & libstdc++, even if the
74 user isn't using long doubles. However, they may generate an unresolved
75 external to abort if abort is not used by the function, and the stubs
76 are referenced from within libc, since libgcc goes before and after the
79 #ifdef DECLARE_LIBRARY_RENAMES
80 DECLARE_LIBRARY_RENAMES
83 #ifdef EXTENDED_FLOAT_STUBS
84 extern void abort (void);
85 void __extendsfxf2 (void) { abort(); }
86 void __extenddfxf2 (void) { abort(); }
87 void __truncxfdf2 (void) { abort(); }
88 void __truncxfsf2 (void) { abort(); }
89 void __fixxfsi (void) { abort(); }
90 void __floatsixf (void) { abort(); }
91 void __addxf3 (void) { abort(); }
92 void __subxf3 (void) { abort(); }
93 void __mulxf3 (void) { abort(); }
94 void __divxf3 (void) { abort(); }
95 void __negxf2 (void) { abort(); }
96 void __eqxf2 (void) { abort(); }
97 void __nexf2 (void) { abort(); }
98 void __gtxf2 (void) { abort(); }
99 void __gexf2 (void) { abort(); }
100 void __lexf2 (void) { abort(); }
101 void __ltxf2 (void) { abort(); }
103 void __extendsftf2 (void) { abort(); }
104 void __extenddftf2 (void) { abort(); }
105 void __trunctfdf2 (void) { abort(); }
106 void __trunctfsf2 (void) { abort(); }
107 void __fixtfsi (void) { abort(); }
108 void __floatsitf (void) { abort(); }
109 void __addtf3 (void) { abort(); }
110 void __subtf3 (void) { abort(); }
111 void __multf3 (void) { abort(); }
112 void __divtf3 (void) { abort(); }
113 void __negtf2 (void) { abort(); }
114 void __eqtf2 (void) { abort(); }
115 void __netf2 (void) { abort(); }
116 void __gttf2 (void) { abort(); }
117 void __getf2 (void) { abort(); }
118 void __letf2 (void) { abort(); }
119 void __lttf2 (void) { abort(); }
120 #else /* !EXTENDED_FLOAT_STUBS, rest of file */
122 /* IEEE "special" number predicates */
131 #if defined L_thenan_sf
132 const fp_number_type __thenan_sf
= { CLASS_SNAN
, 0, 0, {(fractype
) 0} };
133 #elif defined L_thenan_df
134 const fp_number_type __thenan_df
= { CLASS_SNAN
, 0, 0, {(fractype
) 0} };
135 #elif defined L_thenan_tf
136 const fp_number_type __thenan_tf
= { CLASS_SNAN
, 0, 0, {(fractype
) 0} };
138 extern const fp_number_type __thenan_tf
;
140 extern const fp_number_type __thenan_sf
;
142 extern const fp_number_type __thenan_df
;
146 static fp_number_type
*
149 /* Discard the const qualifier... */
151 return (fp_number_type
*) (& __thenan_tf
);
153 return (fp_number_type
*) (& __thenan_sf
);
155 return (fp_number_type
*) (& __thenan_df
);
161 isnan ( fp_number_type
* x
)
163 return x
->class == CLASS_SNAN
|| x
->class == CLASS_QNAN
;
168 isinf ( fp_number_type
* x
)
170 return x
->class == CLASS_INFINITY
;
177 iszero ( fp_number_type
* x
)
179 return x
->class == CLASS_ZERO
;
184 flip_sign ( fp_number_type
* x
)
189 /* Count leading zeroes in N. */
194 extern int __clzsi2 (USItype
);
195 if (sizeof (USItype
) == sizeof (unsigned int))
196 return __builtin_clz (n
);
197 else if (sizeof (USItype
) == sizeof (unsigned long))
198 return __builtin_clzl (n
);
199 else if (sizeof (USItype
) == sizeof (unsigned long long))
200 return __builtin_clzll (n
);
205 extern FLO_type
pack_d ( fp_number_type
* );
207 #if defined(L_pack_df) || defined(L_pack_sf) || defined(L_pack_tf)
209 pack_d ( fp_number_type
* src
)
212 fractype fraction
= src
->fraction
.ll
; /* wasn't unsigned before? */
213 int sign
= src
->sign
;
216 if (LARGEST_EXPONENT_IS_NORMAL (FRAC_NBITS
) && (isnan (src
) || isinf (src
)))
218 /* We can't represent these values accurately. By using the
219 largest possible magnitude, we guarantee that the conversion
220 of infinity is at least as big as any finite number. */
222 fraction
= ((fractype
) 1 << FRACBITS
) - 1;
224 else if (isnan (src
))
227 if (src
->class == CLASS_QNAN
|| 1)
229 #ifdef QUIET_NAN_NEGATED
230 fraction
|= QUIET_NAN
- 1;
232 fraction
|= QUIET_NAN
;
236 else if (isinf (src
))
241 else if (iszero (src
))
246 else if (fraction
== 0)
252 if (src
->normal_exp
< NORMAL_EXPMIN
)
255 /* Go straight to a zero representation if denormals are not
256 supported. The denormal handling would be harmless but
257 isn't unnecessary. */
260 #else /* NO_DENORMALS */
261 /* This number's exponent is too low to fit into the bits
262 available in the number, so we'll store 0 in the exponent and
263 shift the fraction to the right to make up for it. */
265 int shift
= NORMAL_EXPMIN
- src
->normal_exp
;
269 if (shift
> FRAC_NBITS
- NGARDS
)
271 /* No point shifting, since it's more that 64 out. */
276 int lowbit
= (fraction
& (((fractype
)1 << shift
) - 1)) ? 1 : 0;
277 fraction
= (fraction
>> shift
) | lowbit
;
279 if ((fraction
& GARDMASK
) == GARDMSB
)
281 if ((fraction
& (1 << NGARDS
)))
282 fraction
+= GARDROUND
+ 1;
286 /* Add to the guards to round up. */
287 fraction
+= GARDROUND
;
289 /* Perhaps the rounding means we now need to change the
290 exponent, because the fraction is no longer denormal. */
291 if (fraction
>= IMPLICIT_1
)
296 #endif /* NO_DENORMALS */
298 else if (!LARGEST_EXPONENT_IS_NORMAL (FRAC_NBITS
)
299 && src
->normal_exp
> EXPBIAS
)
306 exp
= src
->normal_exp
+ EXPBIAS
;
307 if (!ROUND_TOWARDS_ZERO
)
309 /* IF the gard bits are the all zero, but the first, then we're
310 half way between two numbers, choose the one which makes the
311 lsb of the answer 0. */
312 if ((fraction
& GARDMASK
) == GARDMSB
)
314 if (fraction
& (1 << NGARDS
))
315 fraction
+= GARDROUND
+ 1;
319 /* Add a one to the guards to round up */
320 fraction
+= GARDROUND
;
322 if (fraction
>= IMPLICIT_2
)
330 if (LARGEST_EXPONENT_IS_NORMAL (FRAC_NBITS
) && exp
> EXPMAX
)
332 /* Saturate on overflow. */
334 fraction
= ((fractype
) 1 << FRACBITS
) - 1;
339 /* We previously used bitfields to store the number, but this doesn't
340 handle little/big endian systems conveniently, so use shifts and
342 #ifdef FLOAT_BIT_ORDER_MISMATCH
343 dst
.bits
.fraction
= fraction
;
345 dst
.bits
.sign
= sign
;
347 # if defined TFLOAT && defined HALFFRACBITS
349 halffractype high
, low
, unity
;
352 unity
= (halffractype
) 1 << HALFFRACBITS
;
354 /* Set HIGH to the high double's significand, masking out the implicit 1.
355 Set LOW to the low double's full significand. */
356 high
= (fraction
>> (FRACBITS
- HALFFRACBITS
)) & (unity
- 1);
357 low
= fraction
& (unity
* 2 - 1);
359 /* Get the initial sign and exponent of the low double. */
360 lowexp
= exp
- HALFFRACBITS
- 1;
363 /* HIGH should be rounded like a normal double, making |LOW| <=
364 0.5 ULP of HIGH. Assume round-to-nearest. */
366 if (low
> unity
|| (low
== unity
&& (high
& 1) == 1))
368 /* Round HIGH up and adjust LOW to match. */
372 /* May make it infinite, but that's OK. */
376 low
= unity
* 2 - low
;
380 high
|= (halffractype
) exp
<< HALFFRACBITS
;
381 high
|= (halffractype
) sign
<< (HALFFRACBITS
+ EXPBITS
);
383 if (exp
== EXPMAX
|| exp
== 0 || low
== 0)
387 while (lowexp
> 0 && low
< unity
)
395 halffractype roundmsb
, round
;
399 roundmsb
= (1 << (shift
- 1));
400 round
= low
& ((roundmsb
<< 1) - 1);
405 if (round
> roundmsb
|| (round
== roundmsb
&& (low
& 1) == 1))
409 /* LOW rounds up to the smallest normal number. */
415 low
|= (halffractype
) lowexp
<< HALFFRACBITS
;
416 low
|= (halffractype
) lowsign
<< (HALFFRACBITS
+ EXPBITS
);
418 dst
.value_raw
= ((fractype
) high
<< HALFSHIFT
) | low
;
421 dst
.value_raw
= fraction
& ((((fractype
)1) << FRACBITS
) - (fractype
)1);
422 dst
.value_raw
|= ((fractype
) (exp
& ((1 << EXPBITS
) - 1))) << FRACBITS
;
423 dst
.value_raw
|= ((fractype
) (sign
& 1)) << (FRACBITS
| EXPBITS
);
427 #if defined(FLOAT_WORD_ORDER_MISMATCH) && !defined(FLOAT)
430 qrtrfractype tmp1
= dst
.words
[0];
431 qrtrfractype tmp2
= dst
.words
[1];
432 dst
.words
[0] = dst
.words
[3];
433 dst
.words
[1] = dst
.words
[2];
439 halffractype tmp
= dst
.words
[0];
440 dst
.words
[0] = dst
.words
[1];
450 #if defined(L_unpack_df) || defined(L_unpack_sf) || defined(L_unpack_tf)
452 unpack_d (FLO_union_type
* src
, fp_number_type
* dst
)
454 /* We previously used bitfields to store the number, but this doesn't
455 handle little/big endian systems conveniently, so use shifts and
461 #if defined(FLOAT_WORD_ORDER_MISMATCH) && !defined(FLOAT)
462 FLO_union_type swapped
;
465 swapped
.words
[0] = src
->words
[3];
466 swapped
.words
[1] = src
->words
[2];
467 swapped
.words
[2] = src
->words
[1];
468 swapped
.words
[3] = src
->words
[0];
470 swapped
.words
[0] = src
->words
[1];
471 swapped
.words
[1] = src
->words
[0];
476 #ifdef FLOAT_BIT_ORDER_MISMATCH
477 fraction
= src
->bits
.fraction
;
479 sign
= src
->bits
.sign
;
481 # if defined TFLOAT && defined HALFFRACBITS
483 halffractype high
, low
;
485 high
= src
->value_raw
>> HALFSHIFT
;
486 low
= src
->value_raw
& (((fractype
)1 << HALFSHIFT
) - 1);
488 fraction
= high
& ((((fractype
)1) << HALFFRACBITS
) - 1);
489 fraction
<<= FRACBITS
- HALFFRACBITS
;
490 exp
= ((int)(high
>> HALFFRACBITS
)) & ((1 << EXPBITS
) - 1);
491 sign
= ((int)(high
>> (((HALFFRACBITS
+ EXPBITS
))))) & 1;
493 if (exp
!= EXPMAX
&& exp
!= 0 && low
!= 0)
495 int lowexp
= ((int)(low
>> HALFFRACBITS
)) & ((1 << EXPBITS
) - 1);
496 int lowsign
= ((int)(low
>> (((HALFFRACBITS
+ EXPBITS
))))) & 1;
500 xlow
= low
& ((((fractype
)1) << HALFFRACBITS
) - 1);
502 xlow
|= (((halffractype
)1) << HALFFRACBITS
);
505 shift
= (FRACBITS
- HALFFRACBITS
) - (exp
- lowexp
);
512 else if (fraction
>= xlow
)
516 /* The high part is a power of two but the full number is lower.
517 This code will leave the implicit 1 in FRACTION, but we'd
518 have added that below anyway. */
519 fraction
= (((fractype
) 1 << FRACBITS
) - xlow
) << 1;
525 fraction
= src
->value_raw
& ((((fractype
)1) << FRACBITS
) - 1);
526 exp
= ((int)(src
->value_raw
>> FRACBITS
)) & ((1 << EXPBITS
) - 1);
527 sign
= ((int)(src
->value_raw
>> (FRACBITS
+ EXPBITS
))) & 1;
534 /* Hmm. Looks like 0 */
541 /* tastes like zero */
542 dst
->class = CLASS_ZERO
;
546 /* Zero exponent with nonzero fraction - it's denormalized,
547 so there isn't a leading implicit one - we'll shift it so
549 dst
->normal_exp
= exp
- EXPBIAS
+ 1;
552 dst
->class = CLASS_NUMBER
;
554 while (fraction
< IMPLICIT_1
)
560 dst
->fraction
.ll
= fraction
;
563 else if (!LARGEST_EXPONENT_IS_NORMAL (FRAC_NBITS
) && exp
== EXPMAX
)
568 /* Attached to a zero fraction - means infinity */
569 dst
->class = CLASS_INFINITY
;
573 /* Nonzero fraction, means nan */
574 #ifdef QUIET_NAN_NEGATED
575 if ((fraction
& QUIET_NAN
) == 0)
577 if (fraction
& QUIET_NAN
)
580 dst
->class = CLASS_QNAN
;
584 dst
->class = CLASS_SNAN
;
586 /* Keep the fraction part as the nan number */
587 dst
->fraction
.ll
= fraction
;
592 /* Nothing strange about this number */
593 dst
->normal_exp
= exp
- EXPBIAS
;
594 dst
->class = CLASS_NUMBER
;
595 dst
->fraction
.ll
= (fraction
<< NGARDS
) | IMPLICIT_1
;
598 #endif /* L_unpack_df || L_unpack_sf */
600 #if defined(L_addsub_sf) || defined(L_addsub_df) || defined(L_addsub_tf)
601 static fp_number_type
*
602 _fpadd_parts (fp_number_type
* a
,
604 fp_number_type
* tmp
)
608 /* Put commonly used fields in local variables. */
624 /* Adding infinities with opposite signs yields a NaN. */
625 if (isinf (b
) && a
->sign
!= b
->sign
)
638 tmp
->sign
= a
->sign
& b
->sign
;
648 /* Got two numbers. shift the smaller and increment the exponent till
653 a_normal_exp
= a
->normal_exp
;
654 b_normal_exp
= b
->normal_exp
;
655 a_fraction
= a
->fraction
.ll
;
656 b_fraction
= b
->fraction
.ll
;
658 diff
= a_normal_exp
- b_normal_exp
;
662 if (diff
< FRAC_NBITS
)
664 /* ??? This does shifts one bit at a time. Optimize. */
665 while (a_normal_exp
> b_normal_exp
)
670 while (b_normal_exp
> a_normal_exp
)
678 /* Somethings's up.. choose the biggest */
679 if (a_normal_exp
> b_normal_exp
)
681 b_normal_exp
= a_normal_exp
;
686 a_normal_exp
= b_normal_exp
;
692 if (a
->sign
!= b
->sign
)
696 tfraction
= -a_fraction
+ b_fraction
;
700 tfraction
= a_fraction
- b_fraction
;
705 tmp
->normal_exp
= a_normal_exp
;
706 tmp
->fraction
.ll
= tfraction
;
711 tmp
->normal_exp
= a_normal_exp
;
712 tmp
->fraction
.ll
= -tfraction
;
714 /* and renormalize it */
716 while (tmp
->fraction
.ll
< IMPLICIT_1
&& tmp
->fraction
.ll
)
718 tmp
->fraction
.ll
<<= 1;
725 tmp
->normal_exp
= a_normal_exp
;
726 tmp
->fraction
.ll
= a_fraction
+ b_fraction
;
728 tmp
->class = CLASS_NUMBER
;
729 /* Now the fraction is added, we have to shift down to renormalize the
732 if (tmp
->fraction
.ll
>= IMPLICIT_2
)
734 LSHIFT (tmp
->fraction
.ll
);
742 add (FLO_type arg_a
, FLO_type arg_b
)
748 FLO_union_type au
, bu
;
756 res
= _fpadd_parts (&a
, &b
, &tmp
);
762 sub (FLO_type arg_a
, FLO_type arg_b
)
768 FLO_union_type au
, bu
;
778 res
= _fpadd_parts (&a
, &b
, &tmp
);
782 #endif /* L_addsub_sf || L_addsub_df */
784 #if defined(L_mul_sf) || defined(L_mul_df) || defined(L_mul_tf)
785 static inline __attribute__ ((__always_inline__
)) fp_number_type
*
786 _fpmul_parts ( fp_number_type
* a
,
788 fp_number_type
* tmp
)
795 a
->sign
= a
->sign
!= b
->sign
;
800 b
->sign
= a
->sign
!= b
->sign
;
807 a
->sign
= a
->sign
!= b
->sign
;
816 b
->sign
= a
->sign
!= b
->sign
;
821 a
->sign
= a
->sign
!= b
->sign
;
826 b
->sign
= a
->sign
!= b
->sign
;
830 /* Calculate the mantissa by multiplying both numbers to get a
831 twice-as-wide number. */
833 #if defined(NO_DI_MODE) || defined(TFLOAT)
835 fractype x
= a
->fraction
.ll
;
836 fractype ylow
= b
->fraction
.ll
;
840 /* ??? This does multiplies one bit at a time. Optimize. */
841 for (bit
= 0; bit
< FRAC_NBITS
; bit
++)
847 carry
= (low
+= ylow
) < ylow
;
848 high
+= yhigh
+ carry
;
860 /* Multiplying two USIs to get a UDI, we're safe. */
862 UDItype answer
= (UDItype
)a
->fraction
.ll
* (UDItype
)b
->fraction
.ll
;
864 high
= answer
>> BITS_PER_SI
;
868 /* fractype is DImode, but we need the result to be twice as wide.
869 Assuming a widening multiply from DImode to TImode is not
870 available, build one by hand. */
872 USItype nl
= a
->fraction
.ll
;
873 USItype nh
= a
->fraction
.ll
>> BITS_PER_SI
;
874 USItype ml
= b
->fraction
.ll
;
875 USItype mh
= b
->fraction
.ll
>> BITS_PER_SI
;
876 UDItype pp_ll
= (UDItype
) ml
* nl
;
877 UDItype pp_hl
= (UDItype
) mh
* nl
;
878 UDItype pp_lh
= (UDItype
) ml
* nh
;
879 UDItype pp_hh
= (UDItype
) mh
* nh
;
882 UDItype ps_hh__
= pp_hl
+ pp_lh
;
884 res2
+= (UDItype
)1 << BITS_PER_SI
;
885 pp_hl
= (UDItype
)(USItype
)ps_hh__
<< BITS_PER_SI
;
886 res0
= pp_ll
+ pp_hl
;
889 res2
+= (ps_hh__
>> BITS_PER_SI
) + pp_hh
;
896 tmp
->normal_exp
= a
->normal_exp
+ b
->normal_exp
897 + FRAC_NBITS
- (FRACBITS
+ NGARDS
);
898 tmp
->sign
= a
->sign
!= b
->sign
;
899 while (high
>= IMPLICIT_2
)
909 while (high
< IMPLICIT_1
)
919 if (!ROUND_TOWARDS_ZERO
&& (high
& GARDMASK
) == GARDMSB
)
921 if (high
& (1 << NGARDS
))
923 /* Because we're half way, we would round to even by adding
924 GARDROUND + 1, except that's also done in the packing
925 function, and rounding twice will lose precision and cause
926 the result to be too far off. Example: 32-bit floats with
927 bit patterns 0xfff * 0x3f800400 ~= 0xfff (less than 0.5ulp
928 off), not 0x1000 (more than 0.5ulp off). */
932 /* We're a further than half way by a small amount corresponding
933 to the bits set in "low". Knowing that, we round here and
934 not in pack_d, because there we don't have "low" available
936 high
+= GARDROUND
+ 1;
938 /* Avoid further rounding in pack_d. */
939 high
&= ~(fractype
) GARDMASK
;
942 tmp
->fraction
.ll
= high
;
943 tmp
->class = CLASS_NUMBER
;
948 multiply (FLO_type arg_a
, FLO_type arg_b
)
954 FLO_union_type au
, bu
;
962 res
= _fpmul_parts (&a
, &b
, &tmp
);
966 #endif /* L_mul_sf || L_mul_df || L_mul_tf */
968 #if defined(L_div_sf) || defined(L_div_df) || defined(L_div_tf)
969 static inline __attribute__ ((__always_inline__
)) fp_number_type
*
970 _fpdiv_parts (fp_number_type
* a
,
975 fractype denominator
;
987 a
->sign
= a
->sign
^ b
->sign
;
989 if (isinf (a
) || iszero (a
))
991 if (a
->class == b
->class)
1004 a
->class = CLASS_INFINITY
;
1008 /* Calculate the mantissa by multiplying both 64bit numbers to get a
1012 ( numerator / denominator) * 2^(numerator exponent - denominator exponent)
1015 a
->normal_exp
= a
->normal_exp
- b
->normal_exp
;
1016 numerator
= a
->fraction
.ll
;
1017 denominator
= b
->fraction
.ll
;
1019 if (numerator
< denominator
)
1021 /* Fraction will be less than 1.0 */
1027 /* ??? Does divide one bit at a time. Optimize. */
1030 if (numerator
>= denominator
)
1033 numerator
-= denominator
;
1039 if (!ROUND_TOWARDS_ZERO
&& (quotient
& GARDMASK
) == GARDMSB
)
1041 if (quotient
& (1 << NGARDS
))
1043 /* Because we're half way, we would round to even by adding
1044 GARDROUND + 1, except that's also done in the packing
1045 function, and rounding twice will lose precision and cause
1046 the result to be too far off. */
1050 /* We're a further than half way by the small amount
1051 corresponding to the bits set in "numerator". Knowing
1052 that, we round here and not in pack_d, because there we
1053 don't have "numerator" available anymore. */
1054 quotient
+= GARDROUND
+ 1;
1056 /* Avoid further rounding in pack_d. */
1057 quotient
&= ~(fractype
) GARDMASK
;
1061 a
->fraction
.ll
= quotient
;
1067 divide (FLO_type arg_a
, FLO_type arg_b
)
1071 fp_number_type
*res
;
1072 FLO_union_type au
, bu
;
1080 res
= _fpdiv_parts (&a
, &b
);
1082 return pack_d (res
);
1084 #endif /* L_div_sf || L_div_df */
1086 #if defined(L_fpcmp_parts_sf) || defined(L_fpcmp_parts_df) \
1087 || defined(L_fpcmp_parts_tf)
1088 /* according to the demo, fpcmp returns a comparison with 0... thus
1095 __fpcmp_parts (fp_number_type
* a
, fp_number_type
* b
)
1098 /* either nan -> unordered. Must be checked outside of this routine. */
1099 if (isnan (a
) && isnan (b
))
1101 return 1; /* still unordered! */
1105 if (isnan (a
) || isnan (b
))
1107 return 1; /* how to indicate unordered compare? */
1109 if (isinf (a
) && isinf (b
))
1111 /* +inf > -inf, but +inf != +inf */
1112 /* b \a| +inf(0)| -inf(1)
1113 ______\+--------+--------
1114 +inf(0)| a==b(0)| a<b(-1)
1115 -------+--------+--------
1116 -inf(1)| a>b(1) | a==b(0)
1117 -------+--------+--------
1118 So since unordered must be nonzero, just line up the columns...
1120 return b
->sign
- a
->sign
;
1122 /* but not both... */
1125 return a
->sign
? -1 : 1;
1129 return b
->sign
? 1 : -1;
1131 if (iszero (a
) && iszero (b
))
1137 return b
->sign
? 1 : -1;
1141 return a
->sign
? -1 : 1;
1143 /* now both are "normal". */
1144 if (a
->sign
!= b
->sign
)
1146 /* opposite signs */
1147 return a
->sign
? -1 : 1;
1149 /* same sign; exponents? */
1150 if (a
->normal_exp
> b
->normal_exp
)
1152 return a
->sign
? -1 : 1;
1154 if (a
->normal_exp
< b
->normal_exp
)
1156 return a
->sign
? 1 : -1;
1158 /* same exponents; check size. */
1159 if (a
->fraction
.ll
> b
->fraction
.ll
)
1161 return a
->sign
? -1 : 1;
1163 if (a
->fraction
.ll
< b
->fraction
.ll
)
1165 return a
->sign
? 1 : -1;
1167 /* after all that, they're equal. */
1172 #if defined(L_compare_sf) || defined(L_compare_df) || defined(L_compoare_tf)
1174 compare (FLO_type arg_a
, FLO_type arg_b
)
1178 FLO_union_type au
, bu
;
1186 return __fpcmp_parts (&a
, &b
);
1188 #endif /* L_compare_sf || L_compare_df */
1190 #ifndef US_SOFTWARE_GOFAST
1192 /* These should be optimized for their specific tasks someday. */
1194 #if defined(L_eq_sf) || defined(L_eq_df) || defined(L_eq_tf)
1196 _eq_f2 (FLO_type arg_a
, FLO_type arg_b
)
1200 FLO_union_type au
, bu
;
1208 if (isnan (&a
) || isnan (&b
))
1209 return 1; /* false, truth == 0 */
1211 return __fpcmp_parts (&a
, &b
) ;
1213 #endif /* L_eq_sf || L_eq_df */
1215 #if defined(L_ne_sf) || defined(L_ne_df) || defined(L_ne_tf)
1217 _ne_f2 (FLO_type arg_a
, FLO_type arg_b
)
1221 FLO_union_type au
, bu
;
1229 if (isnan (&a
) || isnan (&b
))
1230 return 1; /* true, truth != 0 */
1232 return __fpcmp_parts (&a
, &b
) ;
1234 #endif /* L_ne_sf || L_ne_df */
1236 #if defined(L_gt_sf) || defined(L_gt_df) || defined(L_gt_tf)
1238 _gt_f2 (FLO_type arg_a
, FLO_type arg_b
)
1242 FLO_union_type au
, bu
;
1250 if (isnan (&a
) || isnan (&b
))
1251 return -1; /* false, truth > 0 */
1253 return __fpcmp_parts (&a
, &b
);
1255 #endif /* L_gt_sf || L_gt_df */
1257 #if defined(L_ge_sf) || defined(L_ge_df) || defined(L_ge_tf)
1259 _ge_f2 (FLO_type arg_a
, FLO_type arg_b
)
1263 FLO_union_type au
, bu
;
1271 if (isnan (&a
) || isnan (&b
))
1272 return -1; /* false, truth >= 0 */
1273 return __fpcmp_parts (&a
, &b
) ;
1275 #endif /* L_ge_sf || L_ge_df */
1277 #if defined(L_lt_sf) || defined(L_lt_df) || defined(L_lt_tf)
1279 _lt_f2 (FLO_type arg_a
, FLO_type arg_b
)
1283 FLO_union_type au
, bu
;
1291 if (isnan (&a
) || isnan (&b
))
1292 return 1; /* false, truth < 0 */
1294 return __fpcmp_parts (&a
, &b
);
1296 #endif /* L_lt_sf || L_lt_df */
1298 #if defined(L_le_sf) || defined(L_le_df) || defined(L_le_tf)
1300 _le_f2 (FLO_type arg_a
, FLO_type arg_b
)
1304 FLO_union_type au
, bu
;
1312 if (isnan (&a
) || isnan (&b
))
1313 return 1; /* false, truth <= 0 */
1315 return __fpcmp_parts (&a
, &b
) ;
1317 #endif /* L_le_sf || L_le_df */
1319 #endif /* ! US_SOFTWARE_GOFAST */
1321 #if defined(L_unord_sf) || defined(L_unord_df) || defined(L_unord_tf)
1323 _unord_f2 (FLO_type arg_a
, FLO_type arg_b
)
1327 FLO_union_type au
, bu
;
1335 return (isnan (&a
) || isnan (&b
));
1337 #endif /* L_unord_sf || L_unord_df */
1339 #if defined(L_si_to_sf) || defined(L_si_to_df) || defined(L_si_to_tf)
1341 si_to_float (SItype arg_a
)
1345 in
.class = CLASS_NUMBER
;
1346 in
.sign
= arg_a
< 0;
1349 in
.class = CLASS_ZERO
;
1355 in
.normal_exp
= FRACBITS
+ NGARDS
;
1358 /* Special case for minint, since there is no +ve integer
1359 representation for it */
1360 if (arg_a
== (- MAX_SI_INT
- 1))
1362 return (FLO_type
)(- MAX_SI_INT
- 1);
1369 in
.fraction
.ll
= uarg
;
1370 shift
= clzusi (uarg
) - (BITS_PER_SI
- 1 - FRACBITS
- NGARDS
);
1373 in
.fraction
.ll
<<= shift
;
1374 in
.normal_exp
-= shift
;
1377 return pack_d (&in
);
1379 #endif /* L_si_to_sf || L_si_to_df */
1381 #if defined(L_usi_to_sf) || defined(L_usi_to_df) || defined(L_usi_to_tf)
1383 usi_to_float (USItype arg_a
)
1390 in
.class = CLASS_ZERO
;
1395 in
.class = CLASS_NUMBER
;
1396 in
.normal_exp
= FRACBITS
+ NGARDS
;
1397 in
.fraction
.ll
= arg_a
;
1399 shift
= clzusi (arg_a
) - (BITS_PER_SI
- 1 - FRACBITS
- NGARDS
);
1402 fractype guard
= in
.fraction
.ll
& (((fractype
)1 << -shift
) - 1);
1403 in
.fraction
.ll
>>= -shift
;
1404 in
.fraction
.ll
|= (guard
!= 0);
1405 in
.normal_exp
-= shift
;
1409 in
.fraction
.ll
<<= shift
;
1410 in
.normal_exp
-= shift
;
1413 return pack_d (&in
);
1417 #if defined(L_sf_to_si) || defined(L_df_to_si) || defined(L_tf_to_si)
1419 float_to_si (FLO_type arg_a
)
1432 /* get reasonable MAX_SI_INT... */
1434 return a
.sign
? (-MAX_SI_INT
)-1 : MAX_SI_INT
;
1435 /* it is a number, but a small one */
1436 if (a
.normal_exp
< 0)
1438 if (a
.normal_exp
> BITS_PER_SI
- 2)
1439 return a
.sign
? (-MAX_SI_INT
)-1 : MAX_SI_INT
;
1440 tmp
= a
.fraction
.ll
>> ((FRACBITS
+ NGARDS
) - a
.normal_exp
);
1441 return a
.sign
? (-tmp
) : (tmp
);
1443 #endif /* L_sf_to_si || L_df_to_si */
1445 #if defined(L_sf_to_usi) || defined(L_df_to_usi) || defined(L_tf_to_usi)
1446 #if defined US_SOFTWARE_GOFAST || defined(L_tf_to_usi)
1447 /* While libgcc2.c defines its own __fixunssfsi and __fixunsdfsi routines,
1448 we also define them for GOFAST because the ones in libgcc2.c have the
1449 wrong names and I'd rather define these here and keep GOFAST CYG-LOC's
1450 out of libgcc2.c. We can't define these here if not GOFAST because then
1451 there'd be duplicate copies. */
1454 float_to_usi (FLO_type arg_a
)
1466 /* it is a negative number */
1469 /* get reasonable MAX_USI_INT... */
1472 /* it is a number, but a small one */
1473 if (a
.normal_exp
< 0)
1475 if (a
.normal_exp
> BITS_PER_SI
- 1)
1477 else if (a
.normal_exp
> (FRACBITS
+ NGARDS
))
1478 return a
.fraction
.ll
<< (a
.normal_exp
- (FRACBITS
+ NGARDS
));
1480 return a
.fraction
.ll
>> ((FRACBITS
+ NGARDS
) - a
.normal_exp
);
1482 #endif /* US_SOFTWARE_GOFAST */
1483 #endif /* L_sf_to_usi || L_df_to_usi */
1485 #if defined(L_negate_sf) || defined(L_negate_df) || defined(L_negate_tf)
1487 negate (FLO_type arg_a
)
1498 #endif /* L_negate_sf || L_negate_df */
1502 #if defined(L_make_sf)
1504 __make_fp(fp_class_type
class,
1513 in
.normal_exp
= exp
;
1514 in
.fraction
.ll
= frac
;
1515 return pack_d (&in
);
1517 #endif /* L_make_sf */
1521 /* This enables one to build an fp library that supports float but not double.
1522 Otherwise, we would get an undefined reference to __make_dp.
1523 This is needed for some 8-bit ports that can't handle well values that
1524 are 8-bytes in size, so we just don't support double for them at all. */
1526 #if defined(L_sf_to_df)
1528 sf_to_df (SFtype arg_a
)
1534 unpack_d (&au
, &in
);
1536 return __make_dp (in
.class, in
.sign
, in
.normal_exp
,
1537 ((UDItype
) in
.fraction
.ll
) << F_D_BITOFF
);
1539 #endif /* L_sf_to_df */
1541 #if defined(L_sf_to_tf) && defined(TMODES)
1543 sf_to_tf (SFtype arg_a
)
1549 unpack_d (&au
, &in
);
1551 return __make_tp (in
.class, in
.sign
, in
.normal_exp
,
1552 ((UTItype
) in
.fraction
.ll
) << F_T_BITOFF
);
1554 #endif /* L_sf_to_df */
1556 #endif /* ! FLOAT_ONLY */
1561 extern SFtype
__make_fp (fp_class_type
, unsigned int, int, USItype
);
1563 #if defined(L_make_df)
1565 __make_dp (fp_class_type
class, unsigned int sign
, int exp
, UDItype frac
)
1571 in
.normal_exp
= exp
;
1572 in
.fraction
.ll
= frac
;
1573 return pack_d (&in
);
1575 #endif /* L_make_df */
1577 #if defined(L_df_to_sf)
1579 df_to_sf (DFtype arg_a
)
1586 unpack_d (&au
, &in
);
1588 sffrac
= in
.fraction
.ll
>> F_D_BITOFF
;
1590 /* We set the lowest guard bit in SFFRAC if we discarded any non
1592 if ((in
.fraction
.ll
& (((USItype
) 1 << F_D_BITOFF
) - 1)) != 0)
1595 return __make_fp (in
.class, in
.sign
, in
.normal_exp
, sffrac
);
1597 #endif /* L_df_to_sf */
1599 #if defined(L_df_to_tf) && defined(TMODES) \
1600 && !defined(FLOAT) && !defined(TFLOAT)
1602 df_to_tf (DFtype arg_a
)
1608 unpack_d (&au
, &in
);
1610 return __make_tp (in
.class, in
.sign
, in
.normal_exp
,
1611 ((UTItype
) in
.fraction
.ll
) << D_T_BITOFF
);
1613 #endif /* L_sf_to_df */
1616 #if defined(L_make_tf)
1618 __make_tp(fp_class_type
class,
1627 in
.normal_exp
= exp
;
1628 in
.fraction
.ll
= frac
;
1629 return pack_d (&in
);
1631 #endif /* L_make_tf */
1633 #if defined(L_tf_to_df)
1635 tf_to_df (TFtype arg_a
)
1642 unpack_d (&au
, &in
);
1644 sffrac
= in
.fraction
.ll
>> D_T_BITOFF
;
1646 /* We set the lowest guard bit in SFFRAC if we discarded any non
1648 if ((in
.fraction
.ll
& (((UTItype
) 1 << D_T_BITOFF
) - 1)) != 0)
1651 return __make_dp (in
.class, in
.sign
, in
.normal_exp
, sffrac
);
1653 #endif /* L_tf_to_df */
1655 #if defined(L_tf_to_sf)
1657 tf_to_sf (TFtype arg_a
)
1664 unpack_d (&au
, &in
);
1666 sffrac
= in
.fraction
.ll
>> F_T_BITOFF
;
1668 /* We set the lowest guard bit in SFFRAC if we discarded any non
1670 if ((in
.fraction
.ll
& (((UTItype
) 1 << F_T_BITOFF
) - 1)) != 0)
1673 return __make_fp (in
.class, in
.sign
, in
.normal_exp
, sffrac
);
1675 #endif /* L_tf_to_sf */
1678 #endif /* ! FLOAT */
1679 #endif /* !EXTENDED_FLOAT_STUBS */