Spelling fixes in ChangeLog.
[binutils-gdb.git] / sim / ppc / dp-bit.c
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. */
4
5 /* Copyright (C) 1994, 2007, 2008, 2009, 2010, 2011
6 Free Software Foundation, Inc.
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
20
21 /* As a special exception, if you link this library with other files,
22 some of which are compiled with GCC, to produce an executable,
23 this library does not by itself cause the resulting executable
24 to be covered by the GNU General Public License.
25 This exception does not however invalidate any other reasons why
26 the executable file might be covered by the GNU General Public License. */
27
28 /* This implements IEEE 754 format arithmetic, but does not provide a
29 mechanism for setting the rounding mode, or for generating or handling
30 exceptions.
31
32 The original code by Steve Chamberlain, hacked by Mark Eichin and Jim
33 Wilson, all of Cygnus Support. */
34
35 /* The intended way to use this file is to make two copies, add `#define FLOAT'
36 to one copy, then compile both copies and add them to libgcc.a. */
37
38 /* The following macros can be defined to change the behaviour of this file:
39 FLOAT: Implement a `float', aka SFmode, fp library. If this is not
40 defined, then this file implements a `double', aka DFmode, fp library.
41 FLOAT_ONLY: Used with FLOAT, to implement a `float' only library, i.e.
42 don't include float->double conversion which requires the double library.
43 This is useful only for machines which can't support doubles, e.g. some
44 8-bit processors.
45 CMPtype: Specify the type that floating point compares should return.
46 This defaults to SItype, aka int.
47 US_SOFTWARE_GOFAST: This makes all entry points use the same names as the
48 US Software goFast library. If this is not defined, the entry points use
49 the same names as libgcc1.c.
50 _DEBUG_BITFLOAT: This makes debugging the code a little easier, by adding
51 two integers to the FLO_union_type.
52 NO_NANS: Disable nan and infinity handling
53 SMALL_MACHINE: Useful when operations on QIs and HIs are faster
54 than on an SI */
55
56 #ifndef SFtype
57 typedef SFtype __attribute__ ((mode (SF)));
58 #endif
59 #ifndef DFtype
60 typedef DFtype __attribute__ ((mode (DF)));
61 #endif
62
63 #ifndef HItype
64 typedef int HItype __attribute__ ((mode (HI)));
65 #endif
66 #ifndef SItype
67 typedef int SItype __attribute__ ((mode (SI)));
68 #endif
69 #ifndef DItype
70 typedef int DItype __attribute__ ((mode (DI)));
71 #endif
72
73 /* The type of the result of a fp compare */
74 #ifndef CMPtype
75 #define CMPtype SItype
76 #endif
77
78 #ifndef UHItype
79 typedef unsigned int UHItype __attribute__ ((mode (HI)));
80 #endif
81 #ifndef USItype
82 typedef unsigned int USItype __attribute__ ((mode (SI)));
83 #endif
84 #ifndef UDItype
85 typedef unsigned int UDItype __attribute__ ((mode (DI)));
86 #endif
87
88 #define MAX_SI_INT ((SItype) ((unsigned) (~0)>>1))
89 #define MAX_USI_INT ((USItype) ~0)
90
91
92 #ifdef FLOAT_ONLY
93 #define NO_DI_MODE
94 #endif
95
96 #ifdef FLOAT
97 # define NGARDS 7L
98 # define GARDROUND 0x3f
99 # define GARDMASK 0x7f
100 # define GARDMSB 0x40
101 # define EXPBITS 8
102 # define EXPBIAS 127
103 # define FRACBITS 23
104 # define EXPMAX (0xff)
105 # define QUIET_NAN 0x100000L
106 # define FRAC_NBITS 32
107 # define FRACHIGH 0x80000000L
108 # define FRACHIGH2 0xc0000000L
109 typedef USItype fractype;
110 typedef UHItype halffractype;
111 typedef SFtype FLO_type;
112 typedef SItype intfrac;
113
114 #else
115 # define PREFIXFPDP dp
116 # define PREFIXSFDF df
117 # define NGARDS 8L
118 # define GARDROUND 0x7f
119 # define GARDMASK 0xff
120 # define GARDMSB 0x80
121 # define EXPBITS 11
122 # define EXPBIAS 1023
123 # define FRACBITS 52
124 # define EXPMAX (0x7ff)
125 # define QUIET_NAN 0x8000000000000LL
126 # define FRAC_NBITS 64
127 # define FRACHIGH 0x8000000000000000LL
128 # define FRACHIGH2 0xc000000000000000LL
129 typedef UDItype fractype;
130 typedef USItype halffractype;
131 typedef DFtype FLO_type;
132 typedef DItype intfrac;
133 #endif
134
135 #ifdef US_SOFTWARE_GOFAST
136 # ifdef FLOAT
137 # define add fpadd
138 # define sub fpsub
139 # define multiply fpmul
140 # define divide fpdiv
141 # define compare fpcmp
142 # define si_to_float sitofp
143 # define float_to_si fptosi
144 # define float_to_usi fptoui
145 # define negate __negsf2
146 # define sf_to_df fptodp
147 # define dptofp dptofp
148 #else
149 # define add dpadd
150 # define sub dpsub
151 # define multiply dpmul
152 # define divide dpdiv
153 # define compare dpcmp
154 # define si_to_float litodp
155 # define float_to_si dptoli
156 # define float_to_usi dptoul
157 # define negate __negdf2
158 # define df_to_sf dptofp
159 #endif
160 #else
161 # ifdef FLOAT
162 # define add __addsf3
163 # define sub __subsf3
164 # define multiply __mulsf3
165 # define divide __divsf3
166 # define compare __cmpsf2
167 # define _eq_f2 __eqsf2
168 # define _ne_f2 __nesf2
169 # define _gt_f2 __gtsf2
170 # define _ge_f2 __gesf2
171 # define _lt_f2 __ltsf2
172 # define _le_f2 __lesf2
173 # define si_to_float __floatsisf
174 # define float_to_si __fixsfsi
175 # define float_to_usi __fixunssfsi
176 # define negate __negsf2
177 # define sf_to_df __extendsfdf2
178 #else
179 # define add __adddf3
180 # define sub __subdf3
181 # define multiply __muldf3
182 # define divide __divdf3
183 # define compare __cmpdf2
184 # define _eq_f2 __eqdf2
185 # define _ne_f2 __nedf2
186 # define _gt_f2 __gtdf2
187 # define _ge_f2 __gedf2
188 # define _lt_f2 __ltdf2
189 # define _le_f2 __ledf2
190 # define si_to_float __floatsidf
191 # define float_to_si __fixdfsi
192 # define float_to_usi __fixunsdfsi
193 # define negate __negdf2
194 # define df_to_sf __truncdfsf2
195 # endif
196 #endif
197
198
199 #ifndef INLINE
200 #define INLINE __inline__
201 #endif
202
203 /* Preserve the sticky-bit when shifting fractions to the right. */
204 #define LSHIFT(a) { a = (a & 1) | (a >> 1); }
205
206 /* numeric parameters */
207 /* F_D_BITOFF is the number of bits offset between the MSB of the mantissa
208 of a float and of a double. Assumes there are only two float types.
209 (double::FRAC_BITS+double::NGARGS-(float::FRAC_BITS-float::NGARDS))
210 */
211 #define F_D_BITOFF (52+8-(23+7))
212
213
214 #define NORMAL_EXPMIN (-(EXPBIAS)+1)
215 #define IMPLICIT_1 (1LL<<(FRACBITS+NGARDS))
216 #define IMPLICIT_2 (1LL<<(FRACBITS+1+NGARDS))
217
218 /* common types */
219
220 typedef enum
221 {
222 CLASS_SNAN,
223 CLASS_QNAN,
224 CLASS_ZERO,
225 CLASS_NUMBER,
226 CLASS_INFINITY
227 } fp_class_type;
228
229 typedef struct
230 {
231 #ifdef SMALL_MACHINE
232 char class;
233 unsigned char sign;
234 short normal_exp;
235 #else
236 fp_class_type class;
237 unsigned int sign;
238 int normal_exp;
239 #endif
240
241 union
242 {
243 fractype ll;
244 halffractype l[2];
245 } fraction;
246 } fp_number_type;
247
248 typedef union
249 {
250 FLO_type value;
251 #ifdef _DEBUG_BITFLOAT
252 int l[2];
253 #endif
254 struct
255 {
256 #ifndef FLOAT_BIT_ORDER_MISMATCH
257 unsigned int sign:1 __attribute__ ((packed));
258 unsigned int exp:EXPBITS __attribute__ ((packed));
259 fractype fraction:FRACBITS __attribute__ ((packed));
260 #else
261 fractype fraction:FRACBITS __attribute__ ((packed));
262 unsigned int exp:EXPBITS __attribute__ ((packed));
263 unsigned int sign:1 __attribute__ ((packed));
264 #endif
265 }
266 bits;
267 }
268 FLO_union_type;
269
270
271 /* end of header */
272
273 /* IEEE "special" number predicates */
274
275 #ifdef NO_NANS
276
277 #define nan() 0
278 #define isnan(x) 0
279 #define isinf(x) 0
280 #else
281
282 INLINE
283 static fp_number_type *
284 nan ()
285 {
286 static fp_number_type thenan;
287
288 return &thenan;
289 }
290
291 INLINE
292 static int
293 isnan ( fp_number_type * x)
294 {
295 return x->class == CLASS_SNAN || x->class == CLASS_QNAN;
296 }
297
298 INLINE
299 static int
300 isinf ( fp_number_type * x)
301 {
302 return x->class == CLASS_INFINITY;
303 }
304
305 #endif
306
307 INLINE
308 static int
309 iszero ( fp_number_type * x)
310 {
311 return x->class == CLASS_ZERO;
312 }
313
314 INLINE
315 static void
316 flip_sign ( fp_number_type * x)
317 {
318 x->sign = !x->sign;
319 }
320
321 static FLO_type
322 pack_d ( fp_number_type * src)
323 {
324 FLO_union_type dst;
325 fractype fraction = src->fraction.ll; /* wasn't unsigned before? */
326
327 dst.bits.sign = src->sign;
328
329 if (isnan (src))
330 {
331 dst.bits.exp = EXPMAX;
332 dst.bits.fraction = src->fraction.ll;
333 if (src->class == CLASS_QNAN || 1)
334 {
335 dst.bits.fraction |= QUIET_NAN;
336 }
337 }
338 else if (isinf (src))
339 {
340 dst.bits.exp = EXPMAX;
341 dst.bits.fraction = 0;
342 }
343 else if (iszero (src))
344 {
345 dst.bits.exp = 0;
346 dst.bits.fraction = 0;
347 }
348 else if (fraction == 0)
349 {
350 dst.value = 0;
351 }
352 else
353 {
354 if (src->normal_exp < NORMAL_EXPMIN)
355 {
356 /* This number's exponent is too low to fit into the bits
357 available in the number, so we'll store 0 in the exponent and
358 shift the fraction to the right to make up for it. */
359
360 int shift = NORMAL_EXPMIN - src->normal_exp;
361
362 dst.bits.exp = 0;
363
364 if (shift > FRAC_NBITS - NGARDS)
365 {
366 /* No point shifting, since it's more that 64 out. */
367 fraction = 0;
368 }
369 else
370 {
371 /* Shift by the value */
372 fraction >>= shift;
373 }
374 fraction >>= NGARDS;
375 dst.bits.fraction = fraction;
376 }
377 else if (src->normal_exp > EXPBIAS)
378 {
379 dst.bits.exp = EXPMAX;
380 dst.bits.fraction = 0;
381 }
382 else
383 {
384 dst.bits.exp = src->normal_exp + EXPBIAS;
385 /* IF the gard bits are the all zero, but the first, then we're
386 half way between two numbers, choose the one which makes the
387 lsb of the answer 0. */
388 if ((fraction & GARDMASK) == GARDMSB)
389 {
390 if (fraction & (1 << NGARDS))
391 fraction += GARDROUND + 1;
392 }
393 else
394 {
395 /* Add a one to the guards to round up */
396 fraction += GARDROUND;
397 }
398 if (fraction >= IMPLICIT_2)
399 {
400 fraction >>= 1;
401 dst.bits.exp += 1;
402 }
403 fraction >>= NGARDS;
404 dst.bits.fraction = fraction;
405 }
406 }
407 return dst.value;
408 }
409
410 static void
411 unpack_d (FLO_union_type * src, fp_number_type * dst)
412 {
413 fractype fraction = src->bits.fraction;
414
415 dst->sign = src->bits.sign;
416 if (src->bits.exp == 0)
417 {
418 /* Hmm. Looks like 0 */
419 if (fraction == 0)
420 {
421 /* tastes like zero */
422 dst->class = CLASS_ZERO;
423 }
424 else
425 {
426 /* Zero exponent with non zero fraction - it's denormalized,
427 so there isn't a leading implicit one - we'll shift it so
428 it gets one. */
429 dst->normal_exp = src->bits.exp - EXPBIAS + 1;
430 fraction <<= NGARDS;
431
432 dst->class = CLASS_NUMBER;
433 #if 1
434 while (fraction < IMPLICIT_1)
435 {
436 fraction <<= 1;
437 dst->normal_exp--;
438 }
439 #endif
440 dst->fraction.ll = fraction;
441 }
442 }
443 else if (src->bits.exp == EXPMAX)
444 {
445 /* Huge exponent*/
446 if (fraction == 0)
447 {
448 /* Attached to a zero fraction - means infinity */
449 dst->class = CLASS_INFINITY;
450 }
451 else
452 {
453 /* Non zero fraction, means nan */
454 if (dst->sign)
455 {
456 dst->class = CLASS_SNAN;
457 }
458 else
459 {
460 dst->class = CLASS_QNAN;
461 }
462 /* Keep the fraction part as the nan number */
463 dst->fraction.ll = fraction;
464 }
465 }
466 else
467 {
468 /* Nothing strange about this number */
469 dst->normal_exp = src->bits.exp - EXPBIAS;
470 dst->class = CLASS_NUMBER;
471 dst->fraction.ll = (fraction << NGARDS) | IMPLICIT_1;
472 }
473 }
474
475 static fp_number_type *
476 _fpadd_parts (fp_number_type * a,
477 fp_number_type * b,
478 fp_number_type * tmp)
479 {
480 intfrac tfraction;
481
482 /* Put commonly used fields in local variables. */
483 int a_normal_exp;
484 int b_normal_exp;
485 fractype a_fraction;
486 fractype b_fraction;
487
488 if (isnan (a))
489 {
490 return a;
491 }
492 if (isnan (b))
493 {
494 return b;
495 }
496 if (isinf (a))
497 {
498 /* Adding infinities with opposite signs yields a NaN. */
499 if (isinf (b) && a->sign != b->sign)
500 return nan ();
501 return a;
502 }
503 if (isinf (b))
504 {
505 return b;
506 }
507 if (iszero (b))
508 {
509 return a;
510 }
511 if (iszero (a))
512 {
513 return b;
514 }
515
516 /* Got two numbers. shift the smaller and increment the exponent till
517 they're the same */
518 {
519 int diff;
520
521 a_normal_exp = a->normal_exp;
522 b_normal_exp = b->normal_exp;
523 a_fraction = a->fraction.ll;
524 b_fraction = b->fraction.ll;
525
526 diff = a_normal_exp - b_normal_exp;
527
528 if (diff < 0)
529 diff = -diff;
530 if (diff < FRAC_NBITS)
531 {
532 /* ??? This does shifts one bit at a time. Optimize. */
533 while (a_normal_exp > b_normal_exp)
534 {
535 b_normal_exp++;
536 LSHIFT (b_fraction);
537 }
538 while (b_normal_exp > a_normal_exp)
539 {
540 a_normal_exp++;
541 LSHIFT (a_fraction);
542 }
543 }
544 else
545 {
546 /* Somethings's up.. choose the biggest */
547 if (a_normal_exp > b_normal_exp)
548 {
549 b_normal_exp = a_normal_exp;
550 b_fraction = 0;
551 }
552 else
553 {
554 a_normal_exp = b_normal_exp;
555 a_fraction = 0;
556 }
557 }
558 }
559
560 if (a->sign != b->sign)
561 {
562 if (a->sign)
563 {
564 tfraction = -a_fraction + b_fraction;
565 }
566 else
567 {
568 tfraction = a_fraction - b_fraction;
569 }
570 if (tfraction > 0)
571 {
572 tmp->sign = 0;
573 tmp->normal_exp = a_normal_exp;
574 tmp->fraction.ll = tfraction;
575 }
576 else
577 {
578 tmp->sign = 1;
579 tmp->normal_exp = a_normal_exp;
580 tmp->fraction.ll = -tfraction;
581 }
582 /* and renormalize it */
583
584 while (tmp->fraction.ll < IMPLICIT_1 && tmp->fraction.ll)
585 {
586 tmp->fraction.ll <<= 1;
587 tmp->normal_exp--;
588 }
589 }
590 else
591 {
592 tmp->sign = a->sign;
593 tmp->normal_exp = a_normal_exp;
594 tmp->fraction.ll = a_fraction + b_fraction;
595 }
596 tmp->class = CLASS_NUMBER;
597 /* Now the fraction is added, we have to shift down to renormalize the
598 number */
599
600 if (tmp->fraction.ll >= IMPLICIT_2)
601 {
602 LSHIFT (tmp->fraction.ll);
603 tmp->normal_exp++;
604 }
605 return tmp;
606
607 }
608
609 FLO_type
610 add (FLO_type arg_a, FLO_type arg_b)
611 {
612 fp_number_type a;
613 fp_number_type b;
614 fp_number_type tmp;
615 fp_number_type *res;
616
617 unpack_d ((FLO_union_type *) & arg_a, &a);
618 unpack_d ((FLO_union_type *) & arg_b, &b);
619
620 res = _fpadd_parts (&a, &b, &tmp);
621
622 return pack_d (res);
623 }
624
625 FLO_type
626 sub (FLO_type arg_a, FLO_type arg_b)
627 {
628 fp_number_type a;
629 fp_number_type b;
630 fp_number_type tmp;
631 fp_number_type *res;
632
633 unpack_d ((FLO_union_type *) & arg_a, &a);
634 unpack_d ((FLO_union_type *) & arg_b, &b);
635
636 b.sign ^= 1;
637
638 res = _fpadd_parts (&a, &b, &tmp);
639
640 return pack_d (res);
641 }
642
643 static fp_number_type *
644 _fpmul_parts ( fp_number_type * a,
645 fp_number_type * b,
646 fp_number_type * tmp)
647 {
648 fractype low = 0;
649 fractype high = 0;
650
651 if (isnan (a))
652 {
653 a->sign = a->sign != b->sign;
654 return a;
655 }
656 if (isnan (b))
657 {
658 b->sign = a->sign != b->sign;
659 return b;
660 }
661 if (isinf (a))
662 {
663 if (iszero (b))
664 return nan ();
665 a->sign = a->sign != b->sign;
666 return a;
667 }
668 if (isinf (b))
669 {
670 if (iszero (a))
671 {
672 return nan ();
673 }
674 b->sign = a->sign != b->sign;
675 return b;
676 }
677 if (iszero (a))
678 {
679 a->sign = a->sign != b->sign;
680 return a;
681 }
682 if (iszero (b))
683 {
684 b->sign = a->sign != b->sign;
685 return b;
686 }
687
688 /* Calculate the mantissa by multiplying both 64bit numbers to get a
689 128 bit number */
690 {
691 fractype x = a->fraction.ll;
692 fractype ylow = b->fraction.ll;
693 fractype yhigh = 0;
694 int bit;
695
696 #if defined(NO_DI_MODE)
697 {
698 /* ??? This does multiplies one bit at a time. Optimize. */
699 for (bit = 0; bit < FRAC_NBITS; bit++)
700 {
701 int carry;
702
703 if (x & 1)
704 {
705 carry = (low += ylow) < ylow;
706 high += yhigh + carry;
707 }
708 yhigh <<= 1;
709 if (ylow & FRACHIGH)
710 {
711 yhigh |= 1;
712 }
713 ylow <<= 1;
714 x >>= 1;
715 }
716 }
717 #elif defined(FLOAT)
718 {
719 /* Multiplying two 32 bit numbers to get a 64 bit number on
720 a machine with DI, so we're safe */
721
722 DItype answer = (DItype)(a->fraction.ll) * (DItype)(b->fraction.ll);
723
724 high = answer >> 32;
725 low = answer;
726 }
727 #else
728 /* Doing a 64*64 to 128 */
729 {
730 UDItype nl = a->fraction.ll & 0xffffffff;
731 UDItype nh = a->fraction.ll >> 32;
732 UDItype ml = b->fraction.ll & 0xffffffff;
733 UDItype mh = b->fraction.ll >>32;
734 UDItype pp_ll = ml * nl;
735 UDItype pp_hl = mh * nl;
736 UDItype pp_lh = ml * nh;
737 UDItype pp_hh = mh * nh;
738 UDItype res2 = 0;
739 UDItype res0 = 0;
740 UDItype ps_hh__ = pp_hl + pp_lh;
741 if (ps_hh__ < pp_hl)
742 res2 += 0x100000000LL;
743 pp_hl = (ps_hh__ << 32) & 0xffffffff00000000LL;
744 res0 = pp_ll + pp_hl;
745 if (res0 < pp_ll)
746 res2++;
747 res2 += ((ps_hh__ >> 32) & 0xffffffffL) + pp_hh;
748 high = res2;
749 low = res0;
750 }
751 #endif
752 }
753
754 tmp->normal_exp = a->normal_exp + b->normal_exp;
755 tmp->sign = a->sign != b->sign;
756 #ifdef FLOAT
757 tmp->normal_exp += 2; /* ??????????????? */
758 #else
759 tmp->normal_exp += 4; /* ??????????????? */
760 #endif
761 while (high >= IMPLICIT_2)
762 {
763 tmp->normal_exp++;
764 if (high & 1)
765 {
766 low >>= 1;
767 low |= FRACHIGH;
768 }
769 high >>= 1;
770 }
771 while (high < IMPLICIT_1)
772 {
773 tmp->normal_exp--;
774
775 high <<= 1;
776 if (low & FRACHIGH)
777 high |= 1;
778 low <<= 1;
779 }
780 /* rounding is tricky. if we only round if it won't make us round later. */
781 #if 0
782 if (low & FRACHIGH2)
783 {
784 if (((high & GARDMASK) != GARDMSB)
785 && (((high + 1) & GARDMASK) == GARDMSB))
786 {
787 /* don't round, it gets done again later. */
788 }
789 else
790 {
791 high++;
792 }
793 }
794 #endif
795 if ((high & GARDMASK) == GARDMSB)
796 {
797 if (high & (1 << NGARDS))
798 {
799 /* half way, so round to even */
800 high += GARDROUND + 1;
801 }
802 else if (low)
803 {
804 /* but we really weren't half way */
805 high += GARDROUND + 1;
806 }
807 }
808 tmp->fraction.ll = high;
809 tmp->class = CLASS_NUMBER;
810 return tmp;
811 }
812
813 FLO_type
814 multiply (FLO_type arg_a, FLO_type arg_b)
815 {
816 fp_number_type a;
817 fp_number_type b;
818 fp_number_type tmp;
819 fp_number_type *res;
820
821 unpack_d ((FLO_union_type *) & arg_a, &a);
822 unpack_d ((FLO_union_type *) & arg_b, &b);
823
824 res = _fpmul_parts (&a, &b, &tmp);
825
826 return pack_d (res);
827 }
828
829 static fp_number_type *
830 _fpdiv_parts (fp_number_type * a,
831 fp_number_type * b,
832 fp_number_type * tmp)
833 {
834 fractype low = 0;
835 fractype high = 0;
836 fractype r0, r1, y0, y1, bit;
837 fractype q;
838 fractype numerator;
839 fractype denominator;
840 fractype quotient;
841 fractype remainder;
842
843 if (isnan (a))
844 {
845 return a;
846 }
847 if (isnan (b))
848 {
849 return b;
850 }
851 if (isinf (a) || iszero (a))
852 {
853 if (a->class == b->class)
854 return nan ();
855 return a;
856 }
857 a->sign = a->sign ^ b->sign;
858
859 if (isinf (b))
860 {
861 a->fraction.ll = 0;
862 a->normal_exp = 0;
863 return a;
864 }
865 if (iszero (b))
866 {
867 a->class = CLASS_INFINITY;
868 return b;
869 }
870
871 /* Calculate the mantissa by multiplying both 64bit numbers to get a
872 128 bit number */
873 {
874 int carry;
875 intfrac d0, d1; /* weren't unsigned before ??? */
876
877 /* quotient =
878 ( numerator / denominator) * 2^(numerator exponent - denominator exponent)
879 */
880
881 a->normal_exp = a->normal_exp - b->normal_exp;
882 numerator = a->fraction.ll;
883 denominator = b->fraction.ll;
884
885 if (numerator < denominator)
886 {
887 /* Fraction will be less than 1.0 */
888 numerator *= 2;
889 a->normal_exp--;
890 }
891 bit = IMPLICIT_1;
892 quotient = 0;
893 /* ??? Does divide one bit at a time. Optimize. */
894 while (bit)
895 {
896 if (numerator >= denominator)
897 {
898 quotient |= bit;
899 numerator -= denominator;
900 }
901 bit >>= 1;
902 numerator *= 2;
903 }
904
905 if ((quotient & GARDMASK) == GARDMSB)
906 {
907 if (quotient & (1 << NGARDS))
908 {
909 /* half way, so round to even */
910 quotient += GARDROUND + 1;
911 }
912 else if (numerator)
913 {
914 /* but we really weren't half way, more bits exist */
915 quotient += GARDROUND + 1;
916 }
917 }
918
919 a->fraction.ll = quotient;
920 return (a);
921 }
922 }
923
924 FLO_type
925 divide (FLO_type arg_a, FLO_type arg_b)
926 {
927 fp_number_type a;
928 fp_number_type b;
929 fp_number_type tmp;
930 fp_number_type *res;
931
932 unpack_d ((FLO_union_type *) & arg_a, &a);
933 unpack_d ((FLO_union_type *) & arg_b, &b);
934
935 res = _fpdiv_parts (&a, &b, &tmp);
936
937 return pack_d (res);
938 }
939
940 /* according to the demo, fpcmp returns a comparison with 0... thus
941 a<b -> -1
942 a==b -> 0
943 a>b -> +1
944 */
945
946 static int
947 _fpcmp_parts (fp_number_type * a, fp_number_type * b)
948 {
949 #if 0
950 /* either nan -> unordered. Must be checked outside of this routine. */
951 if (isnan (a) && isnan (b))
952 {
953 return 1; /* still unordered! */
954 }
955 #endif
956
957 if (isnan (a) || isnan (b))
958 {
959 return 1; /* how to indicate unordered compare? */
960 }
961 if (isinf (a) && isinf (b))
962 {
963 /* +inf > -inf, but +inf != +inf */
964 /* b \a| +inf(0)| -inf(1)
965 ______\+--------+--------
966 +inf(0)| a==b(0)| a<b(-1)
967 -------+--------+--------
968 -inf(1)| a>b(1) | a==b(0)
969 -------+--------+--------
970 So since unordered must be non zero, just line up the columns...
971 */
972 return b->sign - a->sign;
973 }
974 /* but not both... */
975 if (isinf (a))
976 {
977 return a->sign ? -1 : 1;
978 }
979 if (isinf (b))
980 {
981 return b->sign ? 1 : -1;
982 }
983 if (iszero (a) && iszero (b))
984 {
985 return 0;
986 }
987 if (iszero (a))
988 {
989 return b->sign ? 1 : -1;
990 }
991 if (iszero (b))
992 {
993 return a->sign ? -1 : 1;
994 }
995 /* now both are "normal". */
996 if (a->sign != b->sign)
997 {
998 /* opposite signs */
999 return a->sign ? -1 : 1;
1000 }
1001 /* same sign; exponents? */
1002 if (a->normal_exp > b->normal_exp)
1003 {
1004 return a->sign ? -1 : 1;
1005 }
1006 if (a->normal_exp < b->normal_exp)
1007 {
1008 return a->sign ? 1 : -1;
1009 }
1010 /* same exponents; check size. */
1011 if (a->fraction.ll > b->fraction.ll)
1012 {
1013 return a->sign ? -1 : 1;
1014 }
1015 if (a->fraction.ll < b->fraction.ll)
1016 {
1017 return a->sign ? 1 : -1;
1018 }
1019 /* after all that, they're equal. */
1020 return 0;
1021 }
1022
1023 CMPtype
1024 compare (FLO_type arg_a, FLO_type arg_b)
1025 {
1026 fp_number_type a;
1027 fp_number_type b;
1028
1029 unpack_d ((FLO_union_type *) & arg_a, &a);
1030 unpack_d ((FLO_union_type *) & arg_b, &b);
1031
1032 return _fpcmp_parts (&a, &b);
1033 }
1034
1035 #ifndef US_SOFTWARE_GOFAST
1036
1037 /* These should be optimized for their specific tasks someday. */
1038
1039 CMPtype
1040 _eq_f2 (FLO_type arg_a, FLO_type arg_b)
1041 {
1042 fp_number_type a;
1043 fp_number_type b;
1044
1045 unpack_d ((FLO_union_type *) & arg_a, &a);
1046 unpack_d ((FLO_union_type *) & arg_b, &b);
1047
1048 if (isnan (&a) || isnan (&b))
1049 return 1; /* false, truth == 0 */
1050
1051 return _fpcmp_parts (&a, &b) ;
1052 }
1053
1054 CMPtype
1055 _ne_f2 (FLO_type arg_a, FLO_type arg_b)
1056 {
1057 fp_number_type a;
1058 fp_number_type b;
1059
1060 unpack_d ((FLO_union_type *) & arg_a, &a);
1061 unpack_d ((FLO_union_type *) & arg_b, &b);
1062
1063 if (isnan (&a) || isnan (&b))
1064 return 1; /* true, truth != 0 */
1065
1066 return _fpcmp_parts (&a, &b) ;
1067 }
1068
1069 CMPtype
1070 _gt_f2 (FLO_type arg_a, FLO_type arg_b)
1071 {
1072 fp_number_type a;
1073 fp_number_type b;
1074
1075 unpack_d ((FLO_union_type *) & arg_a, &a);
1076 unpack_d ((FLO_union_type *) & arg_b, &b);
1077
1078 if (isnan (&a) || isnan (&b))
1079 return -1; /* false, truth > 0 */
1080
1081 return _fpcmp_parts (&a, &b);
1082 }
1083
1084 CMPtype
1085 _ge_f2 (FLO_type arg_a, FLO_type arg_b)
1086 {
1087 fp_number_type a;
1088 fp_number_type b;
1089
1090 unpack_d ((FLO_union_type *) & arg_a, &a);
1091 unpack_d ((FLO_union_type *) & arg_b, &b);
1092
1093 if (isnan (&a) || isnan (&b))
1094 return -1; /* false, truth >= 0 */
1095 return _fpcmp_parts (&a, &b) ;
1096 }
1097
1098 CMPtype
1099 _lt_f2 (FLO_type arg_a, FLO_type arg_b)
1100 {
1101 fp_number_type a;
1102 fp_number_type b;
1103
1104 unpack_d ((FLO_union_type *) & arg_a, &a);
1105 unpack_d ((FLO_union_type *) & arg_b, &b);
1106
1107 if (isnan (&a) || isnan (&b))
1108 return 1; /* false, truth < 0 */
1109
1110 return _fpcmp_parts (&a, &b);
1111 }
1112
1113 CMPtype
1114 _le_f2 (FLO_type arg_a, FLO_type arg_b)
1115 {
1116 fp_number_type a;
1117 fp_number_type b;
1118
1119 unpack_d ((FLO_union_type *) & arg_a, &a);
1120 unpack_d ((FLO_union_type *) & arg_b, &b);
1121
1122 if (isnan (&a) || isnan (&b))
1123 return 1; /* false, truth <= 0 */
1124
1125 return _fpcmp_parts (&a, &b) ;
1126 }
1127
1128 #endif /* ! US_SOFTWARE_GOFAST */
1129
1130 FLO_type
1131 si_to_float (SItype arg_a)
1132 {
1133 fp_number_type in;
1134
1135 in.class = CLASS_NUMBER;
1136 in.sign = arg_a < 0;
1137 if (!arg_a)
1138 {
1139 in.class = CLASS_ZERO;
1140 }
1141 else
1142 {
1143 in.normal_exp = FRACBITS + NGARDS;
1144 if (in.sign)
1145 {
1146 /* Special case for minint, since there is no +ve integer
1147 representation for it */
1148 if (arg_a == 0x80000000)
1149 {
1150 return -2147483648.0;
1151 }
1152 in.fraction.ll = (-arg_a);
1153 }
1154 else
1155 in.fraction.ll = arg_a;
1156
1157 while (in.fraction.ll < (1LL << (FRACBITS + NGARDS)))
1158 {
1159 in.fraction.ll <<= 1;
1160 in.normal_exp -= 1;
1161 }
1162 }
1163 return pack_d (&in);
1164 }
1165
1166 SItype
1167 float_to_si (FLO_type arg_a)
1168 {
1169 fp_number_type a;
1170 SItype tmp;
1171
1172 unpack_d ((FLO_union_type *) & arg_a, &a);
1173 if (iszero (&a))
1174 return 0;
1175 if (isnan (&a))
1176 return 0;
1177 /* get reasonable MAX_SI_INT... */
1178 if (isinf (&a))
1179 return a.sign ? MAX_SI_INT : (-MAX_SI_INT)-1;
1180 /* it is a number, but a small one */
1181 if (a.normal_exp < 0)
1182 return 0;
1183 if (a.normal_exp > 30)
1184 return a.sign ? (-MAX_SI_INT)-1 : MAX_SI_INT;
1185 tmp = a.fraction.ll >> ((FRACBITS + NGARDS) - a.normal_exp);
1186 return a.sign ? (-tmp) : (tmp);
1187 }
1188
1189 #ifdef US_SOFTWARE_GOFAST
1190 /* While libgcc2.c defines its own __fixunssfsi and __fixunsdfsi routines,
1191 we also define them for GOFAST because the ones in libgcc2.c have the
1192 wrong names and I'd rather define these here and keep GOFAST CYG-LOC's
1193 out of libgcc2.c. We can't define these here if not GOFAST because then
1194 there'd be duplicate copies. */
1195
1196 USItype
1197 float_to_usi (FLO_type arg_a)
1198 {
1199 fp_number_type a;
1200
1201 unpack_d ((FLO_union_type *) & arg_a, &a);
1202 if (iszero (&a))
1203 return 0;
1204 if (isnan (&a))
1205 return 0;
1206 /* get reasonable MAX_USI_INT... */
1207 if (isinf (&a))
1208 return a.sign ? MAX_USI_INT : 0;
1209 /* it is a negative number */
1210 if (a.sign)
1211 return 0;
1212 /* it is a number, but a small one */
1213 if (a.normal_exp < 0)
1214 return 0;
1215 if (a.normal_exp > 31)
1216 return MAX_USI_INT;
1217 else if (a.normal_exp > (FRACBITS + NGARDS))
1218 return a.fraction.ll << ((FRACBITS + NGARDS) - a.normal_exp);
1219 else
1220 return a.fraction.ll >> ((FRACBITS + NGARDS) - a.normal_exp);
1221 }
1222 #endif
1223
1224 FLO_type
1225 negate (FLO_type arg_a)
1226 {
1227 fp_number_type a;
1228
1229 unpack_d ((FLO_union_type *) & arg_a, &a);
1230 flip_sign (&a);
1231 return pack_d (&a);
1232 }
1233
1234 #ifdef FLOAT
1235
1236 SFtype
1237 __make_fp(fp_class_type class,
1238 unsigned int sign,
1239 int exp,
1240 USItype frac)
1241 {
1242 fp_number_type in;
1243
1244 in.class = class;
1245 in.sign = sign;
1246 in.normal_exp = exp;
1247 in.fraction.ll = frac;
1248 return pack_d (&in);
1249 }
1250
1251 #ifndef FLOAT_ONLY
1252
1253 /* This enables one to build an fp library that supports float but not double.
1254 Otherwise, we would get an undefined reference to __make_dp.
1255 This is needed for some 8-bit ports that can't handle well values that
1256 are 8-bytes in size, so we just don't support double for them at all. */
1257
1258 extern DFtype __make_dp (fp_class_type, unsigned int, int, UDItype frac);
1259
1260 DFtype
1261 sf_to_df (SFtype arg_a)
1262 {
1263 fp_number_type in;
1264
1265 unpack_d ((FLO_union_type *) & arg_a, &in);
1266 return __make_dp (in.class, in.sign, in.normal_exp,
1267 ((UDItype) in.fraction.ll) << F_D_BITOFF);
1268 }
1269
1270 #endif
1271 #endif
1272
1273 #ifndef FLOAT
1274
1275 extern SFtype __make_fp (fp_class_type, unsigned int, int, USItype);
1276
1277 DFtype
1278 __make_dp (fp_class_type class, unsigned int sign, int exp, UDItype frac)
1279 {
1280 fp_number_type in;
1281
1282 in.class = class;
1283 in.sign = sign;
1284 in.normal_exp = exp;
1285 in.fraction.ll = frac;
1286 return pack_d (&in);
1287 }
1288
1289 SFtype
1290 df_to_sf (DFtype arg_a)
1291 {
1292 fp_number_type in;
1293
1294 unpack_d ((FLO_union_type *) & arg_a, &in);
1295 return __make_fp (in.class, in.sign, in.normal_exp,
1296 in.fraction.ll >> F_D_BITOFF);
1297 }
1298
1299 #endif