* elf64-ppc.c (struct ppc_link_hash_table): Add top_id.
[deliverable/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 Free Software Foundation, Inc.
6
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.
11
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.)
19
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.
24
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. */
28
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. */
35
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.
39
40 The original code by Steve Chamberlain, hacked by Mark Eichin and Jim
41 Wilson, all of Cygnus Support. */
42
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. */
45
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 */
63
64 #ifndef SFtype
65 typedef SFtype __attribute__ ((mode (SF)));
66 #endif
67 #ifndef DFtype
68 typedef DFtype __attribute__ ((mode (DF)));
69 #endif
70
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
80
81 /* The type of the result of a fp compare */
82 #ifndef CMPtype
83 #define CMPtype SItype
84 #endif
85
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
95
96 #define MAX_SI_INT ((SItype) ((unsigned) (~0)>>1))
97 #define MAX_USI_INT ((USItype) ~0)
98
99
100 #ifdef FLOAT_ONLY
101 #define NO_DI_MODE
102 #endif
103
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;
121
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
142
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
205
206
207 #ifndef INLINE
208 #define INLINE __inline__
209 #endif
210
211 /* Preserve the sticky-bit when shifting fractions to the right. */
212 #define LSHIFT(a) { a = (a & 1) | (a >> 1); }
213
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))
218 */
219 #define F_D_BITOFF (52+8-(23+7))
220
221
222 #define NORMAL_EXPMIN (-(EXPBIAS)+1)
223 #define IMPLICIT_1 (1LL<<(FRACBITS+NGARDS))
224 #define IMPLICIT_2 (1LL<<(FRACBITS+1+NGARDS))
225
226 /* common types */
227
228 typedef enum
229 {
230 CLASS_SNAN,
231 CLASS_QNAN,
232 CLASS_ZERO,
233 CLASS_NUMBER,
234 CLASS_INFINITY
235 } fp_class_type;
236
237 typedef struct
238 {
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
248
249 union
250 {
251 fractype ll;
252 halffractype l[2];
253 } fraction;
254 } fp_number_type;
255
256 typedef union
257 {
258 FLO_type value;
259 #ifdef _DEBUG_BITFLOAT
260 int l[2];
261 #endif
262 struct
263 {
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
273 }
274 bits;
275 }
276 FLO_union_type;
277
278
279 /* end of header */
280
281 /* IEEE "special" number predicates */
282
283 #ifdef NO_NANS
284
285 #define nan() 0
286 #define isnan(x) 0
287 #define isinf(x) 0
288 #else
289
290 INLINE
291 static fp_number_type *
292 nan ()
293 {
294 static fp_number_type thenan;
295
296 return &thenan;
297 }
298
299 INLINE
300 static int
301 isnan ( fp_number_type * x)
302 {
303 return x->class == CLASS_SNAN || x->class == CLASS_QNAN;
304 }
305
306 INLINE
307 static int
308 isinf ( fp_number_type * x)
309 {
310 return x->class == CLASS_INFINITY;
311 }
312
313 #endif
314
315 INLINE
316 static int
317 iszero ( fp_number_type * x)
318 {
319 return x->class == CLASS_ZERO;
320 }
321
322 INLINE
323 static void
324 flip_sign ( fp_number_type * x)
325 {
326 x->sign = !x->sign;
327 }
328
329 static FLO_type
330 pack_d ( fp_number_type * src)
331 {
332 FLO_union_type dst;
333 fractype fraction = src->fraction.ll; /* wasn't unsigned before? */
334
335 dst.bits.sign = src->sign;
336
337 if (isnan (src))
338 {
339 dst.bits.exp = EXPMAX;
340 dst.bits.fraction = src->fraction.ll;
341 if (src->class == CLASS_QNAN || 1)
342 {
343 dst.bits.fraction |= QUIET_NAN;
344 }
345 }
346 else if (isinf (src))
347 {
348 dst.bits.exp = EXPMAX;
349 dst.bits.fraction = 0;
350 }
351 else if (iszero (src))
352 {
353 dst.bits.exp = 0;
354 dst.bits.fraction = 0;
355 }
356 else if (fraction == 0)
357 {
358 dst.value = 0;
359 }
360 else
361 {
362 if (src->normal_exp < NORMAL_EXPMIN)
363 {
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. */
367
368 int shift = NORMAL_EXPMIN - src->normal_exp;
369
370 dst.bits.exp = 0;
371
372 if (shift > FRAC_NBITS - NGARDS)
373 {
374 /* No point shifting, since it's more that 64 out. */
375 fraction = 0;
376 }
377 else
378 {
379 /* Shift by the value */
380 fraction >>= shift;
381 }
382 fraction >>= NGARDS;
383 dst.bits.fraction = fraction;
384 }
385 else if (src->normal_exp > EXPBIAS)
386 {
387 dst.bits.exp = EXPMAX;
388 dst.bits.fraction = 0;
389 }
390 else
391 {
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)
397 {
398 if (fraction & (1 << NGARDS))
399 fraction += GARDROUND + 1;
400 }
401 else
402 {
403 /* Add a one to the guards to round up */
404 fraction += GARDROUND;
405 }
406 if (fraction >= IMPLICIT_2)
407 {
408 fraction >>= 1;
409 dst.bits.exp += 1;
410 }
411 fraction >>= NGARDS;
412 dst.bits.fraction = fraction;
413 }
414 }
415 return dst.value;
416 }
417
418 static void
419 unpack_d (FLO_union_type * src, fp_number_type * dst)
420 {
421 fractype fraction = src->bits.fraction;
422
423 dst->sign = src->bits.sign;
424 if (src->bits.exp == 0)
425 {
426 /* Hmm. Looks like 0 */
427 if (fraction == 0)
428 {
429 /* tastes like zero */
430 dst->class = CLASS_ZERO;
431 }
432 else
433 {
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;
439
440 dst->class = CLASS_NUMBER;
441 #if 1
442 while (fraction < IMPLICIT_1)
443 {
444 fraction <<= 1;
445 dst->normal_exp--;
446 }
447 #endif
448 dst->fraction.ll = fraction;
449 }
450 }
451 else if (src->bits.exp == EXPMAX)
452 {
453 /* Huge exponent*/
454 if (fraction == 0)
455 {
456 /* Attached to a zero fraction - means infinity */
457 dst->class = CLASS_INFINITY;
458 }
459 else
460 {
461 /* Non zero fraction, means nan */
462 if (dst->sign)
463 {
464 dst->class = CLASS_SNAN;
465 }
466 else
467 {
468 dst->class = CLASS_QNAN;
469 }
470 /* Keep the fraction part as the nan number */
471 dst->fraction.ll = fraction;
472 }
473 }
474 else
475 {
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;
480 }
481 }
482
483 static fp_number_type *
484 _fpadd_parts (fp_number_type * a,
485 fp_number_type * b,
486 fp_number_type * tmp)
487 {
488 intfrac tfraction;
489
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;
495
496 if (isnan (a))
497 {
498 return a;
499 }
500 if (isnan (b))
501 {
502 return b;
503 }
504 if (isinf (a))
505 {
506 /* Adding infinities with opposite signs yields a NaN. */
507 if (isinf (b) && a->sign != b->sign)
508 return nan ();
509 return a;
510 }
511 if (isinf (b))
512 {
513 return b;
514 }
515 if (iszero (b))
516 {
517 return a;
518 }
519 if (iszero (a))
520 {
521 return b;
522 }
523
524 /* Got two numbers. shift the smaller and increment the exponent till
525 they're the same */
526 {
527 int diff;
528
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;
533
534 diff = a_normal_exp - b_normal_exp;
535
536 if (diff < 0)
537 diff = -diff;
538 if (diff < FRAC_NBITS)
539 {
540 /* ??? This does shifts one bit at a time. Optimize. */
541 while (a_normal_exp > b_normal_exp)
542 {
543 b_normal_exp++;
544 LSHIFT (b_fraction);
545 }
546 while (b_normal_exp > a_normal_exp)
547 {
548 a_normal_exp++;
549 LSHIFT (a_fraction);
550 }
551 }
552 else
553 {
554 /* Somethings's up.. choose the biggest */
555 if (a_normal_exp > b_normal_exp)
556 {
557 b_normal_exp = a_normal_exp;
558 b_fraction = 0;
559 }
560 else
561 {
562 a_normal_exp = b_normal_exp;
563 a_fraction = 0;
564 }
565 }
566 }
567
568 if (a->sign != b->sign)
569 {
570 if (a->sign)
571 {
572 tfraction = -a_fraction + b_fraction;
573 }
574 else
575 {
576 tfraction = a_fraction - b_fraction;
577 }
578 if (tfraction > 0)
579 {
580 tmp->sign = 0;
581 tmp->normal_exp = a_normal_exp;
582 tmp->fraction.ll = tfraction;
583 }
584 else
585 {
586 tmp->sign = 1;
587 tmp->normal_exp = a_normal_exp;
588 tmp->fraction.ll = -tfraction;
589 }
590 /* and renormalize it */
591
592 while (tmp->fraction.ll < IMPLICIT_1 && tmp->fraction.ll)
593 {
594 tmp->fraction.ll <<= 1;
595 tmp->normal_exp--;
596 }
597 }
598 else
599 {
600 tmp->sign = a->sign;
601 tmp->normal_exp = a_normal_exp;
602 tmp->fraction.ll = a_fraction + b_fraction;
603 }
604 tmp->class = CLASS_NUMBER;
605 /* Now the fraction is added, we have to shift down to renormalize the
606 number */
607
608 if (tmp->fraction.ll >= IMPLICIT_2)
609 {
610 LSHIFT (tmp->fraction.ll);
611 tmp->normal_exp++;
612 }
613 return tmp;
614
615 }
616
617 FLO_type
618 add (FLO_type arg_a, FLO_type arg_b)
619 {
620 fp_number_type a;
621 fp_number_type b;
622 fp_number_type tmp;
623 fp_number_type *res;
624
625 unpack_d ((FLO_union_type *) & arg_a, &a);
626 unpack_d ((FLO_union_type *) & arg_b, &b);
627
628 res = _fpadd_parts (&a, &b, &tmp);
629
630 return pack_d (res);
631 }
632
633 FLO_type
634 sub (FLO_type arg_a, FLO_type arg_b)
635 {
636 fp_number_type a;
637 fp_number_type b;
638 fp_number_type tmp;
639 fp_number_type *res;
640
641 unpack_d ((FLO_union_type *) & arg_a, &a);
642 unpack_d ((FLO_union_type *) & arg_b, &b);
643
644 b.sign ^= 1;
645
646 res = _fpadd_parts (&a, &b, &tmp);
647
648 return pack_d (res);
649 }
650
651 static fp_number_type *
652 _fpmul_parts ( fp_number_type * a,
653 fp_number_type * b,
654 fp_number_type * tmp)
655 {
656 fractype low = 0;
657 fractype high = 0;
658
659 if (isnan (a))
660 {
661 a->sign = a->sign != b->sign;
662 return a;
663 }
664 if (isnan (b))
665 {
666 b->sign = a->sign != b->sign;
667 return b;
668 }
669 if (isinf (a))
670 {
671 if (iszero (b))
672 return nan ();
673 a->sign = a->sign != b->sign;
674 return a;
675 }
676 if (isinf (b))
677 {
678 if (iszero (a))
679 {
680 return nan ();
681 }
682 b->sign = a->sign != b->sign;
683 return b;
684 }
685 if (iszero (a))
686 {
687 a->sign = a->sign != b->sign;
688 return a;
689 }
690 if (iszero (b))
691 {
692 b->sign = a->sign != b->sign;
693 return b;
694 }
695
696 /* Calculate the mantissa by multiplying both 64bit numbers to get a
697 128 bit number */
698 {
699 fractype x = a->fraction.ll;
700 fractype ylow = b->fraction.ll;
701 fractype yhigh = 0;
702 int bit;
703
704 #if defined(NO_DI_MODE)
705 {
706 /* ??? This does multiplies one bit at a time. Optimize. */
707 for (bit = 0; bit < FRAC_NBITS; bit++)
708 {
709 int carry;
710
711 if (x & 1)
712 {
713 carry = (low += ylow) < ylow;
714 high += yhigh + carry;
715 }
716 yhigh <<= 1;
717 if (ylow & FRACHIGH)
718 {
719 yhigh |= 1;
720 }
721 ylow <<= 1;
722 x >>= 1;
723 }
724 }
725 #elif defined(FLOAT)
726 {
727 /* Multiplying two 32 bit numbers to get a 64 bit number on
728 a machine with DI, so we're safe */
729
730 DItype answer = (DItype)(a->fraction.ll) * (DItype)(b->fraction.ll);
731
732 high = answer >> 32;
733 low = answer;
734 }
735 #else
736 /* Doing a 64*64 to 128 */
737 {
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;
758 }
759 #endif
760 }
761
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)
770 {
771 tmp->normal_exp++;
772 if (high & 1)
773 {
774 low >>= 1;
775 low |= FRACHIGH;
776 }
777 high >>= 1;
778 }
779 while (high < IMPLICIT_1)
780 {
781 tmp->normal_exp--;
782
783 high <<= 1;
784 if (low & FRACHIGH)
785 high |= 1;
786 low <<= 1;
787 }
788 /* rounding is tricky. if we only round if it won't make us round later. */
789 #if 0
790 if (low & FRACHIGH2)
791 {
792 if (((high & GARDMASK) != GARDMSB)
793 && (((high + 1) & GARDMASK) == GARDMSB))
794 {
795 /* don't round, it gets done again later. */
796 }
797 else
798 {
799 high++;
800 }
801 }
802 #endif
803 if ((high & GARDMASK) == GARDMSB)
804 {
805 if (high & (1 << NGARDS))
806 {
807 /* half way, so round to even */
808 high += GARDROUND + 1;
809 }
810 else if (low)
811 {
812 /* but we really weren't half way */
813 high += GARDROUND + 1;
814 }
815 }
816 tmp->fraction.ll = high;
817 tmp->class = CLASS_NUMBER;
818 return tmp;
819 }
820
821 FLO_type
822 multiply (FLO_type arg_a, FLO_type arg_b)
823 {
824 fp_number_type a;
825 fp_number_type b;
826 fp_number_type tmp;
827 fp_number_type *res;
828
829 unpack_d ((FLO_union_type *) & arg_a, &a);
830 unpack_d ((FLO_union_type *) & arg_b, &b);
831
832 res = _fpmul_parts (&a, &b, &tmp);
833
834 return pack_d (res);
835 }
836
837 static fp_number_type *
838 _fpdiv_parts (fp_number_type * a,
839 fp_number_type * b,
840 fp_number_type * tmp)
841 {
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;
850
851 if (isnan (a))
852 {
853 return a;
854 }
855 if (isnan (b))
856 {
857 return b;
858 }
859 if (isinf (a) || iszero (a))
860 {
861 if (a->class == b->class)
862 return nan ();
863 return a;
864 }
865 a->sign = a->sign ^ b->sign;
866
867 if (isinf (b))
868 {
869 a->fraction.ll = 0;
870 a->normal_exp = 0;
871 return a;
872 }
873 if (iszero (b))
874 {
875 a->class = CLASS_INFINITY;
876 return b;
877 }
878
879 /* Calculate the mantissa by multiplying both 64bit numbers to get a
880 128 bit number */
881 {
882 int carry;
883 intfrac d0, d1; /* weren't unsigned before ??? */
884
885 /* quotient =
886 ( numerator / denominator) * 2^(numerator exponent - denominator exponent)
887 */
888
889 a->normal_exp = a->normal_exp - b->normal_exp;
890 numerator = a->fraction.ll;
891 denominator = b->fraction.ll;
892
893 if (numerator < denominator)
894 {
895 /* Fraction will be less than 1.0 */
896 numerator *= 2;
897 a->normal_exp--;
898 }
899 bit = IMPLICIT_1;
900 quotient = 0;
901 /* ??? Does divide one bit at a time. Optimize. */
902 while (bit)
903 {
904 if (numerator >= denominator)
905 {
906 quotient |= bit;
907 numerator -= denominator;
908 }
909 bit >>= 1;
910 numerator *= 2;
911 }
912
913 if ((quotient & GARDMASK) == GARDMSB)
914 {
915 if (quotient & (1 << NGARDS))
916 {
917 /* half way, so round to even */
918 quotient += GARDROUND + 1;
919 }
920 else if (numerator)
921 {
922 /* but we really weren't half way, more bits exist */
923 quotient += GARDROUND + 1;
924 }
925 }
926
927 a->fraction.ll = quotient;
928 return (a);
929 }
930 }
931
932 FLO_type
933 divide (FLO_type arg_a, FLO_type arg_b)
934 {
935 fp_number_type a;
936 fp_number_type b;
937 fp_number_type tmp;
938 fp_number_type *res;
939
940 unpack_d ((FLO_union_type *) & arg_a, &a);
941 unpack_d ((FLO_union_type *) & arg_b, &b);
942
943 res = _fpdiv_parts (&a, &b, &tmp);
944
945 return pack_d (res);
946 }
947
948 /* according to the demo, fpcmp returns a comparison with 0... thus
949 a<b -> -1
950 a==b -> 0
951 a>b -> +1
952 */
953
954 static int
955 _fpcmp_parts (fp_number_type * a, fp_number_type * b)
956 {
957 #if 0
958 /* either nan -> unordered. Must be checked outside of this routine. */
959 if (isnan (a) && isnan (b))
960 {
961 return 1; /* still unordered! */
962 }
963 #endif
964
965 if (isnan (a) || isnan (b))
966 {
967 return 1; /* how to indicate unordered compare? */
968 }
969 if (isinf (a) && isinf (b))
970 {
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...
979 */
980 return b->sign - a->sign;
981 }
982 /* but not both... */
983 if (isinf (a))
984 {
985 return a->sign ? -1 : 1;
986 }
987 if (isinf (b))
988 {
989 return b->sign ? 1 : -1;
990 }
991 if (iszero (a) && iszero (b))
992 {
993 return 0;
994 }
995 if (iszero (a))
996 {
997 return b->sign ? 1 : -1;
998 }
999 if (iszero (b))
1000 {
1001 return a->sign ? -1 : 1;
1002 }
1003 /* now both are "normal". */
1004 if (a->sign != b->sign)
1005 {
1006 /* opposite signs */
1007 return a->sign ? -1 : 1;
1008 }
1009 /* same sign; exponents? */
1010 if (a->normal_exp > b->normal_exp)
1011 {
1012 return a->sign ? -1 : 1;
1013 }
1014 if (a->normal_exp < b->normal_exp)
1015 {
1016 return a->sign ? 1 : -1;
1017 }
1018 /* same exponents; check size. */
1019 if (a->fraction.ll > b->fraction.ll)
1020 {
1021 return a->sign ? -1 : 1;
1022 }
1023 if (a->fraction.ll < b->fraction.ll)
1024 {
1025 return a->sign ? 1 : -1;
1026 }
1027 /* after all that, they're equal. */
1028 return 0;
1029 }
1030
1031 CMPtype
1032 compare (FLO_type arg_a, FLO_type arg_b)
1033 {
1034 fp_number_type a;
1035 fp_number_type b;
1036
1037 unpack_d ((FLO_union_type *) & arg_a, &a);
1038 unpack_d ((FLO_union_type *) & arg_b, &b);
1039
1040 return _fpcmp_parts (&a, &b);
1041 }
1042
1043 #ifndef US_SOFTWARE_GOFAST
1044
1045 /* These should be optimized for their specific tasks someday. */
1046
1047 CMPtype
1048 _eq_f2 (FLO_type arg_a, FLO_type arg_b)
1049 {
1050 fp_number_type a;
1051 fp_number_type b;
1052
1053 unpack_d ((FLO_union_type *) & arg_a, &a);
1054 unpack_d ((FLO_union_type *) & arg_b, &b);
1055
1056 if (isnan (&a) || isnan (&b))
1057 return 1; /* false, truth == 0 */
1058
1059 return _fpcmp_parts (&a, &b) ;
1060 }
1061
1062 CMPtype
1063 _ne_f2 (FLO_type arg_a, FLO_type arg_b)
1064 {
1065 fp_number_type a;
1066 fp_number_type b;
1067
1068 unpack_d ((FLO_union_type *) & arg_a, &a);
1069 unpack_d ((FLO_union_type *) & arg_b, &b);
1070
1071 if (isnan (&a) || isnan (&b))
1072 return 1; /* true, truth != 0 */
1073
1074 return _fpcmp_parts (&a, &b) ;
1075 }
1076
1077 CMPtype
1078 _gt_f2 (FLO_type arg_a, FLO_type arg_b)
1079 {
1080 fp_number_type a;
1081 fp_number_type b;
1082
1083 unpack_d ((FLO_union_type *) & arg_a, &a);
1084 unpack_d ((FLO_union_type *) & arg_b, &b);
1085
1086 if (isnan (&a) || isnan (&b))
1087 return -1; /* false, truth > 0 */
1088
1089 return _fpcmp_parts (&a, &b);
1090 }
1091
1092 CMPtype
1093 _ge_f2 (FLO_type arg_a, FLO_type arg_b)
1094 {
1095 fp_number_type a;
1096 fp_number_type b;
1097
1098 unpack_d ((FLO_union_type *) & arg_a, &a);
1099 unpack_d ((FLO_union_type *) & arg_b, &b);
1100
1101 if (isnan (&a) || isnan (&b))
1102 return -1; /* false, truth >= 0 */
1103 return _fpcmp_parts (&a, &b) ;
1104 }
1105
1106 CMPtype
1107 _lt_f2 (FLO_type arg_a, FLO_type arg_b)
1108 {
1109 fp_number_type a;
1110 fp_number_type b;
1111
1112 unpack_d ((FLO_union_type *) & arg_a, &a);
1113 unpack_d ((FLO_union_type *) & arg_b, &b);
1114
1115 if (isnan (&a) || isnan (&b))
1116 return 1; /* false, truth < 0 */
1117
1118 return _fpcmp_parts (&a, &b);
1119 }
1120
1121 CMPtype
1122 _le_f2 (FLO_type arg_a, FLO_type arg_b)
1123 {
1124 fp_number_type a;
1125 fp_number_type b;
1126
1127 unpack_d ((FLO_union_type *) & arg_a, &a);
1128 unpack_d ((FLO_union_type *) & arg_b, &b);
1129
1130 if (isnan (&a) || isnan (&b))
1131 return 1; /* false, truth <= 0 */
1132
1133 return _fpcmp_parts (&a, &b) ;
1134 }
1135
1136 #endif /* ! US_SOFTWARE_GOFAST */
1137
1138 FLO_type
1139 si_to_float (SItype arg_a)
1140 {
1141 fp_number_type in;
1142
1143 in.class = CLASS_NUMBER;
1144 in.sign = arg_a < 0;
1145 if (!arg_a)
1146 {
1147 in.class = CLASS_ZERO;
1148 }
1149 else
1150 {
1151 in.normal_exp = FRACBITS + NGARDS;
1152 if (in.sign)
1153 {
1154 /* Special case for minint, since there is no +ve integer
1155 representation for it */
1156 if (arg_a == 0x80000000)
1157 {
1158 return -2147483648.0;
1159 }
1160 in.fraction.ll = (-arg_a);
1161 }
1162 else
1163 in.fraction.ll = arg_a;
1164
1165 while (in.fraction.ll < (1LL << (FRACBITS + NGARDS)))
1166 {
1167 in.fraction.ll <<= 1;
1168 in.normal_exp -= 1;
1169 }
1170 }
1171 return pack_d (&in);
1172 }
1173
1174 SItype
1175 float_to_si (FLO_type arg_a)
1176 {
1177 fp_number_type a;
1178 SItype tmp;
1179
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);
1195 }
1196
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. */
1203
1204 USItype
1205 float_to_usi (FLO_type arg_a)
1206 {
1207 fp_number_type a;
1208
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);
1229 }
1230 #endif
1231
1232 FLO_type
1233 negate (FLO_type arg_a)
1234 {
1235 fp_number_type a;
1236
1237 unpack_d ((FLO_union_type *) & arg_a, &a);
1238 flip_sign (&a);
1239 return pack_d (&a);
1240 }
1241
1242 #ifdef FLOAT
1243
1244 SFtype
1245 __make_fp(fp_class_type class,
1246 unsigned int sign,
1247 int exp,
1248 USItype frac)
1249 {
1250 fp_number_type in;
1251
1252 in.class = class;
1253 in.sign = sign;
1254 in.normal_exp = exp;
1255 in.fraction.ll = frac;
1256 return pack_d (&in);
1257 }
1258
1259 #ifndef FLOAT_ONLY
1260
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. */
1265
1266 extern DFtype __make_dp (fp_class_type, unsigned int, int, UDItype frac);
1267
1268 DFtype
1269 sf_to_df (SFtype arg_a)
1270 {
1271 fp_number_type in;
1272
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);
1276 }
1277
1278 #endif
1279 #endif
1280
1281 #ifndef FLOAT
1282
1283 extern SFtype __make_fp (fp_class_type, unsigned int, int, USItype);
1284
1285 DFtype
1286 __make_dp (fp_class_type class, unsigned int sign, int exp, UDItype frac)
1287 {
1288 fp_number_type in;
1289
1290 in.class = class;
1291 in.sign = sign;
1292 in.normal_exp = exp;
1293 in.fraction.ll = frac;
1294 return pack_d (&in);
1295 }
1296
1297 SFtype
1298 df_to_sf (DFtype arg_a)
1299 {
1300 fp_number_type in;
1301
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);
1305 }
1306
1307 #endif
This page took 0.055509 seconds and 4 git commands to generate.