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