Home | History | Annotate | Line # | Download | only in ppc
      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-2024 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