xref: /netbsd-src/external/gpl3/gdb/dist/sim/ppc/dp-bit.c (revision a5847cc334d9a7029f6352b847e9e8d71a0f9e0c)
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
1300