No empty .Rs/.Re
[netbsd-mini2440.git] / gnu / dist / gdb6 / sim / ppc / dp-bit.c
blob3313132a50fb290e18e6e23dfd2ae14b6e2c843c
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
3 floating point. */
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
10 later version.
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
38 exceptions.
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
52 8-bit processors.
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
62 than on an SI */
64 #ifndef SFtype
65 typedef SFtype __attribute__ ((mode (SF)));
66 #endif
67 #ifndef DFtype
68 typedef DFtype __attribute__ ((mode (DF)));
69 #endif
71 #ifndef HItype
72 typedef int HItype __attribute__ ((mode (HI)));
73 #endif
74 #ifndef SItype
75 typedef int SItype __attribute__ ((mode (SI)));
76 #endif
77 #ifndef DItype
78 typedef int DItype __attribute__ ((mode (DI)));
79 #endif
81 /* The type of the result of a fp compare */
82 #ifndef CMPtype
83 #define CMPtype SItype
84 #endif
86 #ifndef UHItype
87 typedef unsigned int UHItype __attribute__ ((mode (HI)));
88 #endif
89 #ifndef USItype
90 typedef unsigned int USItype __attribute__ ((mode (SI)));
91 #endif
92 #ifndef UDItype
93 typedef unsigned int UDItype __attribute__ ((mode (DI)));
94 #endif
96 #define MAX_SI_INT ((SItype) ((unsigned) (~0)>>1))
97 #define MAX_USI_INT ((USItype) ~0)
100 #ifdef FLOAT_ONLY
101 #define NO_DI_MODE
102 #endif
104 #ifdef FLOAT
105 # define NGARDS 7L
106 # define GARDROUND 0x3f
107 # define GARDMASK 0x7f
108 # define GARDMSB 0x40
109 # define EXPBITS 8
110 # define EXPBIAS 127
111 # define FRACBITS 23
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;
122 #else
123 # define PREFIXFPDP dp
124 # define PREFIXSFDF df
125 # define NGARDS 8L
126 # define GARDROUND 0x7f
127 # define GARDMASK 0xff
128 # define GARDMSB 0x80
129 # define EXPBITS 11
130 # define EXPBIAS 1023
131 # define FRACBITS 52
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;
141 #endif
143 #ifdef US_SOFTWARE_GOFAST
144 # ifdef FLOAT
145 # define add fpadd
146 # define sub fpsub
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
156 #else
157 # define add dpadd
158 # define sub dpsub
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
167 #endif
168 #else
169 # ifdef FLOAT
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
186 #else
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
203 # endif
204 #endif
207 #ifndef INLINE
208 #define INLINE __inline__
209 #endif
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))
226 /* common types */
228 typedef enum
230 CLASS_SNAN,
231 CLASS_QNAN,
232 CLASS_ZERO,
233 CLASS_NUMBER,
234 CLASS_INFINITY
235 } fp_class_type;
237 typedef struct
239 #ifdef SMALL_MACHINE
240 char class;
241 unsigned char sign;
242 short normal_exp;
243 #else
244 fp_class_type class;
245 unsigned int sign;
246 int normal_exp;
247 #endif
249 union
251 fractype ll;
252 halffractype l[2];
253 } fraction;
254 } fp_number_type;
256 typedef union
258 FLO_type value;
259 #ifdef _DEBUG_BITFLOAT
260 int l[2];
261 #endif
262 struct
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));
268 #else
269 fractype fraction:FRACBITS __attribute__ ((packed));
270 unsigned int exp:EXPBITS __attribute__ ((packed));
271 unsigned int sign:1 __attribute__ ((packed));
272 #endif
274 bits;
276 FLO_union_type;
279 /* end of header */
281 /* IEEE "special" number predicates */
283 #ifdef NO_NANS
285 #define nan() 0
286 #define isnan(x) 0
287 #define isinf(x) 0
288 #else
290 INLINE
291 static fp_number_type *
292 nan ()
294 static fp_number_type thenan;
296 return &thenan;
299 INLINE
300 static int
301 isnan ( fp_number_type * x)
303 return x->class == CLASS_SNAN || x->class == CLASS_QNAN;
306 INLINE
307 static int
308 isinf ( fp_number_type * x)
310 return x->class == CLASS_INFINITY;
313 #endif
315 INLINE
316 static int
317 iszero ( fp_number_type * x)
319 return x->class == CLASS_ZERO;
322 INLINE
323 static void
324 flip_sign ( fp_number_type * x)
326 x->sign = !x->sign;
329 static FLO_type
330 pack_d ( fp_number_type * src)
332 FLO_union_type dst;
333 fractype fraction = src->fraction.ll; /* wasn't unsigned before? */
335 dst.bits.sign = src->sign;
337 if (isnan (src))
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))
353 dst.bits.exp = 0;
354 dst.bits.fraction = 0;
356 else if (fraction == 0)
358 dst.value = 0;
360 else
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;
370 dst.bits.exp = 0;
372 if (shift > FRAC_NBITS - NGARDS)
374 /* No point shifting, since it's more that 64 out. */
375 fraction = 0;
377 else
379 /* Shift by the value */
380 fraction >>= shift;
382 fraction >>= NGARDS;
383 dst.bits.fraction = fraction;
385 else if (src->normal_exp > EXPBIAS)
387 dst.bits.exp = EXPMAX;
388 dst.bits.fraction = 0;
390 else
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;
401 else
403 /* Add a one to the guards to round up */
404 fraction += GARDROUND;
406 if (fraction >= IMPLICIT_2)
408 fraction >>= 1;
409 dst.bits.exp += 1;
411 fraction >>= NGARDS;
412 dst.bits.fraction = fraction;
415 return dst.value;
418 static void
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 */
427 if (fraction == 0)
429 /* tastes like zero */
430 dst->class = CLASS_ZERO;
432 else
434 /* Zero exponent with non zero fraction - it's denormalized,
435 so there isn't a leading implicit one - we'll shift it so
436 it gets one. */
437 dst->normal_exp = src->bits.exp - EXPBIAS + 1;
438 fraction <<= NGARDS;
440 dst->class = CLASS_NUMBER;
441 #if 1
442 while (fraction < IMPLICIT_1)
444 fraction <<= 1;
445 dst->normal_exp--;
447 #endif
448 dst->fraction.ll = fraction;
451 else if (src->bits.exp == EXPMAX)
453 /* Huge exponent*/
454 if (fraction == 0)
456 /* Attached to a zero fraction - means infinity */
457 dst->class = CLASS_INFINITY;
459 else
461 /* Non zero fraction, means nan */
462 if (dst->sign)
464 dst->class = CLASS_SNAN;
466 else
468 dst->class = CLASS_QNAN;
470 /* Keep the fraction part as the nan number */
471 dst->fraction.ll = fraction;
474 else
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,
485 fp_number_type * b,
486 fp_number_type * tmp)
488 intfrac tfraction;
490 /* Put commonly used fields in local variables. */
491 int a_normal_exp;
492 int b_normal_exp;
493 fractype a_fraction;
494 fractype b_fraction;
496 if (isnan (a))
498 return a;
500 if (isnan (b))
502 return b;
504 if (isinf (a))
506 /* Adding infinities with opposite signs yields a NaN. */
507 if (isinf (b) && a->sign != b->sign)
508 return nan ();
509 return a;
511 if (isinf (b))
513 return b;
515 if (iszero (b))
517 return a;
519 if (iszero (a))
521 return b;
524 /* Got two numbers. shift the smaller and increment the exponent till
525 they're the same */
527 int diff;
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;
536 if (diff < 0)
537 diff = -diff;
538 if (diff < FRAC_NBITS)
540 /* ??? This does shifts one bit at a time. Optimize. */
541 while (a_normal_exp > b_normal_exp)
543 b_normal_exp++;
544 LSHIFT (b_fraction);
546 while (b_normal_exp > a_normal_exp)
548 a_normal_exp++;
549 LSHIFT (a_fraction);
552 else
554 /* Somethings's up.. choose the biggest */
555 if (a_normal_exp > b_normal_exp)
557 b_normal_exp = a_normal_exp;
558 b_fraction = 0;
560 else
562 a_normal_exp = b_normal_exp;
563 a_fraction = 0;
568 if (a->sign != b->sign)
570 if (a->sign)
572 tfraction = -a_fraction + b_fraction;
574 else
576 tfraction = a_fraction - b_fraction;
578 if (tfraction > 0)
580 tmp->sign = 0;
581 tmp->normal_exp = a_normal_exp;
582 tmp->fraction.ll = tfraction;
584 else
586 tmp->sign = 1;
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;
595 tmp->normal_exp--;
598 else
600 tmp->sign = a->sign;
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
606 number */
608 if (tmp->fraction.ll >= IMPLICIT_2)
610 LSHIFT (tmp->fraction.ll);
611 tmp->normal_exp++;
613 return tmp;
617 FLO_type
618 add (FLO_type arg_a, FLO_type arg_b)
620 fp_number_type a;
621 fp_number_type b;
622 fp_number_type tmp;
623 fp_number_type *res;
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);
630 return pack_d (res);
633 FLO_type
634 sub (FLO_type arg_a, FLO_type arg_b)
636 fp_number_type a;
637 fp_number_type b;
638 fp_number_type tmp;
639 fp_number_type *res;
641 unpack_d ((FLO_union_type *) & arg_a, &a);
642 unpack_d ((FLO_union_type *) & arg_b, &b);
644 b.sign ^= 1;
646 res = _fpadd_parts (&a, &b, &tmp);
648 return pack_d (res);
651 static fp_number_type *
652 _fpmul_parts ( fp_number_type * a,
653 fp_number_type * b,
654 fp_number_type * tmp)
656 fractype low = 0;
657 fractype high = 0;
659 if (isnan (a))
661 a->sign = a->sign != b->sign;
662 return a;
664 if (isnan (b))
666 b->sign = a->sign != b->sign;
667 return b;
669 if (isinf (a))
671 if (iszero (b))
672 return nan ();
673 a->sign = a->sign != b->sign;
674 return a;
676 if (isinf (b))
678 if (iszero (a))
680 return nan ();
682 b->sign = a->sign != b->sign;
683 return b;
685 if (iszero (a))
687 a->sign = a->sign != b->sign;
688 return a;
690 if (iszero (b))
692 b->sign = a->sign != b->sign;
693 return b;
696 /* Calculate the mantissa by multiplying both 64bit numbers to get a
697 128 bit number */
699 fractype x = a->fraction.ll;
700 fractype ylow = b->fraction.ll;
701 fractype yhigh = 0;
702 int bit;
704 #if defined(NO_DI_MODE)
706 /* ??? This does multiplies one bit at a time. Optimize. */
707 for (bit = 0; bit < FRAC_NBITS; bit++)
709 int carry;
711 if (x & 1)
713 carry = (low += ylow) < ylow;
714 high += yhigh + carry;
716 yhigh <<= 1;
717 if (ylow & FRACHIGH)
719 yhigh |= 1;
721 ylow <<= 1;
722 x >>= 1;
725 #elif defined(FLOAT)
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);
732 high = answer >> 32;
733 low = answer;
735 #else
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;
746 UDItype res2 = 0;
747 UDItype res0 = 0;
748 UDItype ps_hh__ = pp_hl + pp_lh;
749 if (ps_hh__ < pp_hl)
750 res2 += 0x100000000LL;
751 pp_hl = (ps_hh__ << 32) & 0xffffffff00000000LL;
752 res0 = pp_ll + pp_hl;
753 if (res0 < pp_ll)
754 res2++;
755 res2 += ((ps_hh__ >> 32) & 0xffffffffL) + pp_hh;
756 high = res2;
757 low = res0;
759 #endif
762 tmp->normal_exp = a->normal_exp + b->normal_exp;
763 tmp->sign = a->sign != b->sign;
764 #ifdef FLOAT
765 tmp->normal_exp += 2; /* ??????????????? */
766 #else
767 tmp->normal_exp += 4; /* ??????????????? */
768 #endif
769 while (high >= IMPLICIT_2)
771 tmp->normal_exp++;
772 if (high & 1)
774 low >>= 1;
775 low |= FRACHIGH;
777 high >>= 1;
779 while (high < IMPLICIT_1)
781 tmp->normal_exp--;
783 high <<= 1;
784 if (low & FRACHIGH)
785 high |= 1;
786 low <<= 1;
788 /* rounding is tricky. if we only round if it won't make us round later. */
789 #if 0
790 if (low & FRACHIGH2)
792 if (((high & GARDMASK) != GARDMSB)
793 && (((high + 1) & GARDMASK) == GARDMSB))
795 /* don't round, it gets done again later. */
797 else
799 high++;
802 #endif
803 if ((high & GARDMASK) == GARDMSB)
805 if (high & (1 << NGARDS))
807 /* half way, so round to even */
808 high += GARDROUND + 1;
810 else if (low)
812 /* but we really weren't half way */
813 high += GARDROUND + 1;
816 tmp->fraction.ll = high;
817 tmp->class = CLASS_NUMBER;
818 return tmp;
821 FLO_type
822 multiply (FLO_type arg_a, FLO_type arg_b)
824 fp_number_type a;
825 fp_number_type b;
826 fp_number_type tmp;
827 fp_number_type *res;
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);
834 return pack_d (res);
837 static fp_number_type *
838 _fpdiv_parts (fp_number_type * a,
839 fp_number_type * b,
840 fp_number_type * tmp)
842 fractype low = 0;
843 fractype high = 0;
844 fractype r0, r1, y0, y1, bit;
845 fractype q;
846 fractype numerator;
847 fractype denominator;
848 fractype quotient;
849 fractype remainder;
851 if (isnan (a))
853 return a;
855 if (isnan (b))
857 return b;
859 if (isinf (a) || iszero (a))
861 if (a->class == b->class)
862 return nan ();
863 return a;
865 a->sign = a->sign ^ b->sign;
867 if (isinf (b))
869 a->fraction.ll = 0;
870 a->normal_exp = 0;
871 return a;
873 if (iszero (b))
875 a->class = CLASS_INFINITY;
876 return b;
879 /* Calculate the mantissa by multiplying both 64bit numbers to get a
880 128 bit number */
882 int carry;
883 intfrac d0, d1; /* weren't unsigned before ??? */
885 /* quotient =
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 */
896 numerator *= 2;
897 a->normal_exp--;
899 bit = IMPLICIT_1;
900 quotient = 0;
901 /* ??? Does divide one bit at a time. Optimize. */
902 while (bit)
904 if (numerator >= denominator)
906 quotient |= bit;
907 numerator -= denominator;
909 bit >>= 1;
910 numerator *= 2;
913 if ((quotient & GARDMASK) == GARDMSB)
915 if (quotient & (1 << NGARDS))
917 /* half way, so round to even */
918 quotient += GARDROUND + 1;
920 else if (numerator)
922 /* but we really weren't half way, more bits exist */
923 quotient += GARDROUND + 1;
927 a->fraction.ll = quotient;
928 return (a);
932 FLO_type
933 divide (FLO_type arg_a, FLO_type arg_b)
935 fp_number_type a;
936 fp_number_type b;
937 fp_number_type tmp;
938 fp_number_type *res;
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);
945 return pack_d (res);
948 /* according to the demo, fpcmp returns a comparison with 0... thus
949 a<b -> -1
950 a==b -> 0
951 a>b -> +1
954 static int
955 _fpcmp_parts (fp_number_type * a, fp_number_type * b)
957 #if 0
958 /* either nan -> unordered. Must be checked outside of this routine. */
959 if (isnan (a) && isnan (b))
961 return 1; /* still unordered! */
963 #endif
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... */
983 if (isinf (a))
985 return a->sign ? -1 : 1;
987 if (isinf (b))
989 return b->sign ? 1 : -1;
991 if (iszero (a) && iszero (b))
993 return 0;
995 if (iszero (a))
997 return b->sign ? 1 : -1;
999 if (iszero (b))
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. */
1028 return 0;
1031 CMPtype
1032 compare (FLO_type arg_a, FLO_type arg_b)
1034 fp_number_type a;
1035 fp_number_type 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. */
1047 CMPtype
1048 _eq_f2 (FLO_type arg_a, FLO_type arg_b)
1050 fp_number_type a;
1051 fp_number_type 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) ;
1062 CMPtype
1063 _ne_f2 (FLO_type arg_a, FLO_type arg_b)
1065 fp_number_type a;
1066 fp_number_type 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) ;
1077 CMPtype
1078 _gt_f2 (FLO_type arg_a, FLO_type arg_b)
1080 fp_number_type a;
1081 fp_number_type 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);
1092 CMPtype
1093 _ge_f2 (FLO_type arg_a, FLO_type arg_b)
1095 fp_number_type a;
1096 fp_number_type 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) ;
1106 CMPtype
1107 _lt_f2 (FLO_type arg_a, FLO_type arg_b)
1109 fp_number_type a;
1110 fp_number_type 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);
1121 CMPtype
1122 _le_f2 (FLO_type arg_a, FLO_type arg_b)
1124 fp_number_type a;
1125 fp_number_type 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 */
1138 FLO_type
1139 si_to_float (SItype arg_a)
1141 fp_number_type in;
1143 in.class = CLASS_NUMBER;
1144 in.sign = arg_a < 0;
1145 if (!arg_a)
1147 in.class = CLASS_ZERO;
1149 else
1151 in.normal_exp = FRACBITS + NGARDS;
1152 if (in.sign)
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);
1162 else
1163 in.fraction.ll = arg_a;
1165 while (in.fraction.ll < (1LL << (FRACBITS + NGARDS)))
1167 in.fraction.ll <<= 1;
1168 in.normal_exp -= 1;
1171 return pack_d (&in);
1174 SItype
1175 float_to_si (FLO_type arg_a)
1177 fp_number_type a;
1178 SItype tmp;
1180 unpack_d ((FLO_union_type *) & arg_a, &a);
1181 if (iszero (&a))
1182 return 0;
1183 if (isnan (&a))
1184 return 0;
1185 /* get reasonable MAX_SI_INT... */
1186 if (isinf (&a))
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)
1190 return 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. */
1204 USItype
1205 float_to_usi (FLO_type arg_a)
1207 fp_number_type a;
1209 unpack_d ((FLO_union_type *) & arg_a, &a);
1210 if (iszero (&a))
1211 return 0;
1212 if (isnan (&a))
1213 return 0;
1214 /* get reasonable MAX_USI_INT... */
1215 if (isinf (&a))
1216 return a.sign ? MAX_USI_INT : 0;
1217 /* it is a negative number */
1218 if (a.sign)
1219 return 0;
1220 /* it is a number, but a small one */
1221 if (a.normal_exp < 0)
1222 return 0;
1223 if (a.normal_exp > 31)
1224 return MAX_USI_INT;
1225 else if (a.normal_exp > (FRACBITS + NGARDS))
1226 return a.fraction.ll << ((FRACBITS + NGARDS) - a.normal_exp);
1227 else
1228 return a.fraction.ll >> ((FRACBITS + NGARDS) - a.normal_exp);
1230 #endif
1232 FLO_type
1233 negate (FLO_type arg_a)
1235 fp_number_type a;
1237 unpack_d ((FLO_union_type *) & arg_a, &a);
1238 flip_sign (&a);
1239 return pack_d (&a);
1242 #ifdef FLOAT
1244 SFtype
1245 __make_fp(fp_class_type class,
1246 unsigned int sign,
1247 int exp,
1248 USItype frac)
1250 fp_number_type in;
1252 in.class = class;
1253 in.sign = sign;
1254 in.normal_exp = exp;
1255 in.fraction.ll = frac;
1256 return pack_d (&in);
1259 #ifndef FLOAT_ONLY
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);
1268 DFtype
1269 sf_to_df (SFtype arg_a)
1271 fp_number_type in;
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);
1278 #endif
1279 #endif
1281 #ifndef FLOAT
1283 extern SFtype __make_fp (fp_class_type, unsigned int, int, USItype);
1285 DFtype
1286 __make_dp (fp_class_type class, unsigned int sign, int exp, UDItype frac)
1288 fp_number_type in;
1290 in.class = class;
1291 in.sign = sign;
1292 in.normal_exp = exp;
1293 in.fraction.ll = frac;
1294 return pack_d (&in);
1297 SFtype
1298 df_to_sf (DFtype arg_a)
1300 fp_number_type in;
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);
1307 #endif