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-2023 Free Software Foundation, Inc.
6
7This program is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 3 of the License, or
10(at your option) any later version.
11
12This program is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along 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
56typedef SFtype __attribute__ ((mode (SF)));
57#endif
58#ifndef DFtype
59typedef DFtype __attribute__ ((mode (DF)));
60#endif
61
62#ifndef HItype
63typedef int HItype __attribute__ ((mode (HI)));
64#endif
65#ifndef SItype
66typedef int SItype __attribute__ ((mode (SI)));
67#endif
68#ifndef DItype
69typedef 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
78typedef unsigned int UHItype __attribute__ ((mode (HI)));
79#endif
80#ifndef USItype
81typedef unsigned int USItype __attribute__ ((mode (SI)));
82#endif
83#ifndef UDItype
84typedef 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
219typedef enum
220{
221  CLASS_SNAN,
222  CLASS_QNAN,
223  CLASS_ZERO,
224  CLASS_NUMBER,
225  CLASS_INFINITY
226} fp_class_type;
227
228typedef 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
247typedef 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}
267FLO_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
281INLINE
282static fp_number_type *
283nan ()
284{
285  static fp_number_type thenan;
286
287  return &thenan;
288}
289
290INLINE
291static int
292isnan ( fp_number_type *  x)
293{
294  return x->class == CLASS_SNAN || x->class == CLASS_QNAN;
295}
296
297INLINE
298static int
299isinf ( fp_number_type *  x)
300{
301  return x->class == CLASS_INFINITY;
302}
303
304#endif
305
306INLINE
307static int
308iszero ( fp_number_type *  x)
309{
310  return x->class == CLASS_ZERO;
311}
312
313INLINE
314static void
315flip_sign ( fp_number_type *  x)
316{
317  x->sign = !x->sign;
318}
319
320static FLO_type
321pack_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
409static void
410unpack_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
474static 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
608FLO_type
609add (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
624FLO_type
625sub (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
642static 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
812FLO_type
813multiply (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
828static 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
923FLO_type
924divide (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
945static 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
1022CMPtype
1023compare (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
1038CMPtype
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
1053CMPtype
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
1068CMPtype
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
1083CMPtype
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
1097CMPtype
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
1112CMPtype
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
1129FLO_type
1130si_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
1165SItype
1166float_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
1195USItype
1196float_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
1223FLO_type
1224negate (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
1235SFtype
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
1257extern DFtype __make_dp (fp_class_type, unsigned int, int, UDItype frac);
1258
1259DFtype
1260sf_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
1274extern SFtype __make_fp (fp_class_type, unsigned int, int, USItype);
1275
1276DFtype
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
1288SFtype
1289df_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