1 /* This is a software floating point library which can be used
2    for targets without hardware floating point.
3    Copyright (C) 1994-2021 Free Software Foundation, Inc.
4 
5 This file is part of GCC.
6 
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
10 version.
11 
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15 for more details.
16 
17 Under Section 7 of GPL version 3, you are granted additional
18 permissions described in the GCC Runtime Library Exception, version
19 3.1, as published by the Free Software Foundation.
20 
21 You should have received a copy of the GNU General Public License and
22 a copy of the GCC Runtime Library Exception along with this program;
23 see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
24 <http://www.gnu.org/licenses/>.  */
25 
26 /* This implements IEEE 754 format arithmetic, but does not provide a
27    mechanism for setting the rounding mode, or for generating or handling
28    exceptions.
29 
30    The original code by Steve Chamberlain, hacked by Mark Eichin and Jim
31    Wilson, all of Cygnus Support.  */
32 
33 /* The intended way to use this file is to make two copies, add `#define FLOAT'
34    to one copy, then compile both copies and add them to libgcc.a.  */
35 
36 #include "tconfig.h"
37 #include "coretypes.h"
38 #include "tm.h"
39 #include "libgcc_tm.h"
40 #include "fp-bit.h"
41 
42 /* The following macros can be defined to change the behavior of this file:
43    FLOAT: Implement a `float', aka SFmode, fp library.  If this is not
44      defined, then this file implements a `double', aka DFmode, fp library.
45    FLOAT_ONLY: Used with FLOAT, to implement a `float' only library, i.e.
46      don't include float->double conversion which requires the double library.
47      This is useful only for machines which can't support doubles, e.g. some
48      8-bit processors.
49    CMPtype: Specify the type that floating point compares should return.
50      This defaults to SItype, aka int.
51    _DEBUG_BITFLOAT: This makes debugging the code a little easier, by adding
52      two integers to the FLO_union_type.
53    NO_DENORMALS: Disable handling of denormals.
54    NO_NANS: Disable nan and infinity handling
55    SMALL_MACHINE: Useful when operations on QIs and HIs are faster
56      than on an SI */
57 
58 /* We don't currently support extended floats (long doubles) on machines
59    without hardware to deal with them.
60 
61    These stubs are just to keep the linker from complaining about unresolved
62    references which can be pulled in from libio & libstdc++, even if the
63    user isn't using long doubles.  However, they may generate an unresolved
64    external to abort if abort is not used by the function, and the stubs
65    are referenced from within libc, since libgcc goes before and after the
66    system library.  */
67 
68 #ifdef DECLARE_LIBRARY_RENAMES
69   DECLARE_LIBRARY_RENAMES
70 #endif
71 
72 #ifdef EXTENDED_FLOAT_STUBS
73 extern void abort (void);
__extendsfxf2(void)74 void __extendsfxf2 (void) { abort(); }
__extenddfxf2(void)75 void __extenddfxf2 (void) { abort(); }
__truncxfdf2(void)76 void __truncxfdf2 (void) { abort(); }
__truncxfsf2(void)77 void __truncxfsf2 (void) { abort(); }
__fixxfsi(void)78 void __fixxfsi (void) { abort(); }
__floatsixf(void)79 void __floatsixf (void) { abort(); }
__addxf3(void)80 void __addxf3 (void) { abort(); }
__subxf3(void)81 void __subxf3 (void) { abort(); }
__mulxf3(void)82 void __mulxf3 (void) { abort(); }
__divxf3(void)83 void __divxf3 (void) { abort(); }
__negxf2(void)84 void __negxf2 (void) { abort(); }
__eqxf2(void)85 void __eqxf2 (void) { abort(); }
__nexf2(void)86 void __nexf2 (void) { abort(); }
__gtxf2(void)87 void __gtxf2 (void) { abort(); }
__gexf2(void)88 void __gexf2 (void) { abort(); }
__lexf2(void)89 void __lexf2 (void) { abort(); }
__ltxf2(void)90 void __ltxf2 (void) { abort(); }
91 
__extendsftf2(void)92 void __extendsftf2 (void) { abort(); }
__extenddftf2(void)93 void __extenddftf2 (void) { abort(); }
__trunctfdf2(void)94 void __trunctfdf2 (void) { abort(); }
__trunctfsf2(void)95 void __trunctfsf2 (void) { abort(); }
__fixtfsi(void)96 void __fixtfsi (void) { abort(); }
__floatsitf(void)97 void __floatsitf (void) { abort(); }
__addtf3(void)98 void __addtf3 (void) { abort(); }
__subtf3(void)99 void __subtf3 (void) { abort(); }
__multf3(void)100 void __multf3 (void) { abort(); }
__divtf3(void)101 void __divtf3 (void) { abort(); }
__negtf2(void)102 void __negtf2 (void) { abort(); }
__eqtf2(void)103 void __eqtf2 (void) { abort(); }
__netf2(void)104 void __netf2 (void) { abort(); }
__gttf2(void)105 void __gttf2 (void) { abort(); }
__getf2(void)106 void __getf2 (void) { abort(); }
__letf2(void)107 void __letf2 (void) { abort(); }
__lttf2(void)108 void __lttf2 (void) { abort(); }
109 #else	/* !EXTENDED_FLOAT_STUBS, rest of file */
110 
111 /* IEEE "special" number predicates */
112 
113 #ifdef NO_NANS
114 
115 #define nan() 0
116 #define isnan(x) 0
117 #define isinf(x) 0
118 #else
119 
120 #if   defined L_thenan_sf
121 const fp_number_type __thenan_sf = { CLASS_SNAN, 0, 0, {(fractype) 0} };
122 #elif defined L_thenan_df
123 const fp_number_type __thenan_df = { CLASS_SNAN, 0, 0, {(fractype) 0} };
124 #elif defined L_thenan_tf
125 const fp_number_type __thenan_tf = { CLASS_SNAN, 0, 0, {(fractype) 0} };
126 #elif defined TFLOAT
127 extern const fp_number_type __thenan_tf;
128 #elif defined FLOAT
129 extern const fp_number_type __thenan_sf;
130 #else
131 extern const fp_number_type __thenan_df;
132 #endif
133 
134 INLINE
135 static const fp_number_type *
136 makenan (void)
137 {
138 #ifdef TFLOAT
139   return & __thenan_tf;
140 #elif defined FLOAT
141   return & __thenan_sf;
142 #else
143   return & __thenan_df;
144 #endif
145 }
146 
147 INLINE
148 static int
149 isnan (const fp_number_type *x)
150 {
151   return __builtin_expect (x->class == CLASS_SNAN || x->class == CLASS_QNAN,
152 			   0);
153 }
154 
155 INLINE
156 static int
157 isinf (const fp_number_type *  x)
158 {
159   return __builtin_expect (x->class == CLASS_INFINITY, 0);
160 }
161 
162 #endif /* NO_NANS */
163 
164 INLINE
165 static int
166 iszero (const fp_number_type *  x)
167 {
168   return x->class == CLASS_ZERO;
169 }
170 
171 INLINE
172 static void
173 flip_sign ( fp_number_type *  x)
174 {
175   x->sign = !x->sign;
176 }
177 
178 /* Count leading zeroes in N.  */
179 INLINE
180 static int
181 clzusi (USItype n)
182 {
183   extern int __clzsi2 (USItype);
184   if (sizeof (USItype) == sizeof (unsigned int))
185     return __builtin_clz (n);
186   else if (sizeof (USItype) == sizeof (unsigned long))
187     return __builtin_clzl (n);
188   else if (sizeof (USItype) == sizeof (unsigned long long))
189     return __builtin_clzll (n);
190   else
191     return __clzsi2 (n);
192 }
193 
194 extern FLO_type pack_d (const fp_number_type * );
195 
196 #if defined(L_pack_df) || defined(L_pack_sf) || defined(L_pack_tf)
197 FLO_type
198 pack_d (const fp_number_type *src)
199 {
200   FLO_union_type dst;
201   fractype fraction = src->fraction.ll;	/* wasn't unsigned before? */
202   int sign = src->sign;
203   int exp = 0;
204 
205   if (isnan (src))
206     {
207       exp = EXPMAX;
208       /* Restore the NaN's payload.  */
209       fraction >>= NGARDS;
210       fraction &= QUIET_NAN - 1;
211       if (src->class == CLASS_QNAN || 1)
212 	{
213 #ifdef QUIET_NAN_NEGATED
214 	  /* The quiet/signaling bit remains unset.  */
215 	  /* Make sure the fraction has a non-zero value.  */
216 	  if (fraction == 0)
217 	    fraction |= QUIET_NAN - 1;
218 #else
219 	  /* Set the quiet/signaling bit.  */
220 	  fraction |= QUIET_NAN;
221 #endif
222 	}
223     }
224   else if (isinf (src))
225     {
226       exp = EXPMAX;
227       fraction = 0;
228     }
229   else if (iszero (src))
230     {
231       exp = 0;
232       fraction = 0;
233     }
234   else if (fraction == 0)
235     {
236       exp = 0;
237     }
238   else
239     {
240       if (__builtin_expect (src->normal_exp < NORMAL_EXPMIN, 0))
241 	{
242 #ifdef NO_DENORMALS
243 	  /* Go straight to a zero representation if denormals are not
244  	     supported.  The denormal handling would be harmless but
245  	     isn't unnecessary.  */
246 	  exp = 0;
247 	  fraction = 0;
248 #else /* NO_DENORMALS */
249 	  /* This number's exponent is too low to fit into the bits
250 	     available in the number, so we'll store 0 in the exponent and
251 	     shift the fraction to the right to make up for it.  */
252 
253 	  int shift = NORMAL_EXPMIN - src->normal_exp;
254 
255 	  exp = 0;
256 
257 	  if (shift > FRAC_NBITS - NGARDS)
258 	    {
259 	      /* No point shifting, since it's more that 64 out.  */
260 	      fraction = 0;
261 	    }
262 	  else
263 	    {
264 	      int lowbit = (fraction & (((fractype)1 << shift) - 1)) ? 1 : 0;
265 	      fraction = (fraction >> shift) | lowbit;
266 	    }
267 	  if ((fraction & GARDMASK) == GARDMSB)
268 	    {
269 	      if ((fraction & (1 << NGARDS)))
270 		fraction += GARDROUND + 1;
271 	    }
272 	  else
273 	    {
274 	      /* Add to the guards to round up.  */
275 	      fraction += GARDROUND;
276 	    }
277 	  /* Perhaps the rounding means we now need to change the
278              exponent, because the fraction is no longer denormal.  */
279 	  if (fraction >= IMPLICIT_1)
280 	    {
281 	      exp += 1;
282 	    }
283 	  fraction >>= NGARDS;
284 #endif /* NO_DENORMALS */
285 	}
286       else if (__builtin_expect (src->normal_exp > EXPBIAS, 0))
287 	{
288 	  exp = EXPMAX;
289 	  fraction = 0;
290 	}
291       else
292 	{
293 	  exp = src->normal_exp + EXPBIAS;
294 	  /* IF the gard bits are the all zero, but the first, then we're
295 	     half way between two numbers, choose the one which makes the
296 	     lsb of the answer 0.  */
297 	  if ((fraction & GARDMASK) == GARDMSB)
298 	    {
299 	      if (fraction & (1 << NGARDS))
300 		fraction += GARDROUND + 1;
301 	    }
302 	  else
303 	    {
304 	      /* Add a one to the guards to round up */
305 	      fraction += GARDROUND;
306 	    }
307 	  if (fraction >= IMPLICIT_2)
308 	    {
309 	      fraction >>= 1;
310 	      exp += 1;
311 	    }
312 	  fraction >>= NGARDS;
313 	}
314     }
315 
316   /* We previously used bitfields to store the number, but this doesn't
317      handle little/big endian systems conveniently, so use shifts and
318      masks */
319 #if defined TFLOAT && defined HALFFRACBITS
320  {
321    halffractype high, low, unity;
322    int lowsign, lowexp;
323 
324    unity = (halffractype) 1 << HALFFRACBITS;
325 
326    /* Set HIGH to the high double's significand, masking out the implicit 1.
327       Set LOW to the low double's full significand.  */
328    high = (fraction >> (FRACBITS - HALFFRACBITS)) & (unity - 1);
329    low = fraction & (unity * 2 - 1);
330 
331    /* Get the initial sign and exponent of the low double.  */
332    lowexp = exp - HALFFRACBITS - 1;
333    lowsign = sign;
334 
335    /* HIGH should be rounded like a normal double, making |LOW| <=
336       0.5 ULP of HIGH.  Assume round-to-nearest.  */
337    if (exp < EXPMAX)
338      if (low > unity || (low == unity && (high & 1) == 1))
339        {
340 	 /* Round HIGH up and adjust LOW to match.  */
341 	 high++;
342 	 if (high == unity)
343 	   {
344 	     /* May make it infinite, but that's OK.  */
345 	     high = 0;
346 	     exp++;
347 	   }
348 	 low = unity * 2 - low;
349 	 lowsign ^= 1;
350        }
351 
352    high |= (halffractype) exp << HALFFRACBITS;
353    high |= (halffractype) sign << (HALFFRACBITS + EXPBITS);
354 
355    if (exp == EXPMAX || exp == 0 || low == 0)
356      low = 0;
357    else
358      {
359        while (lowexp > 0 && low < unity)
360 	 {
361 	   low <<= 1;
362 	   lowexp--;
363 	 }
364 
365        if (lowexp <= 0)
366 	 {
367 	   halffractype roundmsb, round;
368 	   int shift;
369 
370 	   shift = 1 - lowexp;
371 	   roundmsb = (1 << (shift - 1));
372 	   round = low & ((roundmsb << 1) - 1);
373 
374 	   low >>= shift;
375 	   lowexp = 0;
376 
377 	   if (round > roundmsb || (round == roundmsb && (low & 1) == 1))
378 	     {
379 	       low++;
380 	       if (low == unity)
381 		 /* LOW rounds up to the smallest normal number.  */
382 		 lowexp++;
383 	     }
384 	 }
385 
386        low &= unity - 1;
387        low |= (halffractype) lowexp << HALFFRACBITS;
388        low |= (halffractype) lowsign << (HALFFRACBITS + EXPBITS);
389      }
390    dst.value_raw = ((fractype) high << HALFSHIFT) | low;
391  }
392 #else
393   dst.value_raw = fraction & ((((fractype)1) << FRACBITS) - (fractype)1);
394   dst.value_raw |= ((fractype) (exp & ((1 << EXPBITS) - 1))) << FRACBITS;
395   dst.value_raw |= ((fractype) (sign & 1)) << (FRACBITS | EXPBITS);
396 #endif
397 
398 #if defined(FLOAT_WORD_ORDER_MISMATCH) && !defined(FLOAT)
399 #ifdef TFLOAT
400   {
401     qrtrfractype tmp1 = dst.words[0];
402     qrtrfractype tmp2 = dst.words[1];
403     dst.words[0] = dst.words[3];
404     dst.words[1] = dst.words[2];
405     dst.words[2] = tmp2;
406     dst.words[3] = tmp1;
407   }
408 #else
409   {
410     halffractype tmp = dst.words[0];
411     dst.words[0] = dst.words[1];
412     dst.words[1] = tmp;
413   }
414 #endif
415 #endif
416 
417   return dst.value;
418 }
419 #endif
420 
421 #if defined(L_unpack_df) || defined(L_unpack_sf) || defined(L_unpack_tf)
422 void
423 unpack_d (FLO_union_type * src, fp_number_type * dst)
424 {
425   /* We previously used bitfields to store the number, but this doesn't
426      handle little/big endian systems conveniently, so use shifts and
427      masks */
428   fractype fraction;
429   int exp;
430   int sign;
431 
432 #if defined(FLOAT_WORD_ORDER_MISMATCH) && !defined(FLOAT)
433   FLO_union_type swapped;
434 
435 #ifdef TFLOAT
436   swapped.words[0] = src->words[3];
437   swapped.words[1] = src->words[2];
438   swapped.words[2] = src->words[1];
439   swapped.words[3] = src->words[0];
440 #else
441   swapped.words[0] = src->words[1];
442   swapped.words[1] = src->words[0];
443 #endif
444   src = &swapped;
445 #endif
446 
447 #if defined TFLOAT && defined HALFFRACBITS
448  {
449    halffractype high, low;
450 
451    high = src->value_raw >> HALFSHIFT;
452    low = src->value_raw & (((fractype)1 << HALFSHIFT) - 1);
453 
454    fraction = high & ((((fractype)1) << HALFFRACBITS) - 1);
455    fraction <<= FRACBITS - HALFFRACBITS;
456    exp = ((int)(high >> HALFFRACBITS)) & ((1 << EXPBITS) - 1);
457    sign = ((int)(high >> (((HALFFRACBITS + EXPBITS))))) & 1;
458 
459    if (exp != EXPMAX && exp != 0 && low != 0)
460      {
461        int lowexp = ((int)(low >> HALFFRACBITS)) & ((1 << EXPBITS) - 1);
462        int lowsign = ((int)(low >> (((HALFFRACBITS + EXPBITS))))) & 1;
463        int shift;
464        fractype xlow;
465 
466        xlow = low & ((((fractype)1) << HALFFRACBITS) - 1);
467        if (lowexp)
468 	 xlow |= (((halffractype)1) << HALFFRACBITS);
469        else
470 	 lowexp = 1;
471        shift = (FRACBITS - HALFFRACBITS) - (exp - lowexp);
472        if (shift > 0)
473 	 xlow <<= shift;
474        else if (shift < 0)
475 	 xlow >>= -shift;
476        if (sign == lowsign)
477 	 fraction += xlow;
478        else if (fraction >= xlow)
479 	 fraction -= xlow;
480        else
481 	 {
482 	   /* The high part is a power of two but the full number is lower.
483 	      This code will leave the implicit 1 in FRACTION, but we'd
484 	      have added that below anyway.  */
485 	   fraction = (((fractype) 1 << FRACBITS) - xlow) << 1;
486 	   exp--;
487 	 }
488      }
489  }
490 #else
491   fraction = src->value_raw & ((((fractype)1) << FRACBITS) - 1);
492   exp = ((int)(src->value_raw >> FRACBITS)) & ((1 << EXPBITS) - 1);
493   sign = ((int)(src->value_raw >> (FRACBITS + EXPBITS))) & 1;
494 #endif
495 
496   dst->sign = sign;
497   if (exp == 0)
498     {
499       /* Hmm.  Looks like 0 */
500       if (fraction == 0
501 #ifdef NO_DENORMALS
502 	  || 1
503 #endif
504 	  )
505 	{
506 	  /* tastes like zero */
507 	  dst->class = CLASS_ZERO;
508 	}
509       else
510 	{
511 	  /* Zero exponent with nonzero fraction - it's denormalized,
512 	     so there isn't a leading implicit one - we'll shift it so
513 	     it gets one.  */
514 	  dst->normal_exp = exp - EXPBIAS + 1;
515 	  fraction <<= NGARDS;
516 
517 	  dst->class = CLASS_NUMBER;
518 #if 1
519 	  while (fraction < IMPLICIT_1)
520 	    {
521 	      fraction <<= 1;
522 	      dst->normal_exp--;
523 	    }
524 #endif
525 	  dst->fraction.ll = fraction;
526 	}
527     }
528   else if (__builtin_expect (exp == EXPMAX, 0))
529     {
530       /* Huge exponent*/
531       if (fraction == 0)
532 	{
533 	  /* Attached to a zero fraction - means infinity */
534 	  dst->class = CLASS_INFINITY;
535 	}
536       else
537 	{
538 	  /* Nonzero fraction, means nan */
539 #ifdef QUIET_NAN_NEGATED
540 	  if ((fraction & QUIET_NAN) == 0)
541 #else
542 	  if (fraction & QUIET_NAN)
543 #endif
544 	    {
545 	      dst->class = CLASS_QNAN;
546 	    }
547 	  else
548 	    {
549 	      dst->class = CLASS_SNAN;
550 	    }
551 	  /* Now that we know which kind of NaN we got, discard the
552 	     quiet/signaling bit, but do preserve the NaN payload.  */
553 	  fraction &= ~QUIET_NAN;
554 	  dst->fraction.ll = fraction << NGARDS;
555 	}
556     }
557   else
558     {
559       /* Nothing strange about this number */
560       dst->normal_exp = exp - EXPBIAS;
561       dst->class = CLASS_NUMBER;
562       dst->fraction.ll = (fraction << NGARDS) | IMPLICIT_1;
563     }
564 }
565 #endif /* L_unpack_df || L_unpack_sf */
566 
567 #if defined(L_addsub_sf) || defined(L_addsub_df) || defined(L_addsub_tf)
568 static const fp_number_type *
569 _fpadd_parts (fp_number_type * a,
570 	      fp_number_type * b,
571 	      fp_number_type * tmp)
572 {
573   intfrac tfraction;
574 
575   /* Put commonly used fields in local variables.  */
576   int a_normal_exp;
577   int b_normal_exp;
578   fractype a_fraction;
579   fractype b_fraction;
580 
581   if (isnan (a))
582     {
583       return a;
584     }
585   if (isnan (b))
586     {
587       return b;
588     }
589   if (isinf (a))
590     {
591       /* Adding infinities with opposite signs yields a NaN.  */
592       if (isinf (b) && a->sign != b->sign)
593 	return makenan ();
594       return a;
595     }
596   if (isinf (b))
597     {
598       return b;
599     }
600   if (iszero (b))
601     {
602       if (iszero (a))
603 	{
604 	  *tmp = *a;
605 	  tmp->sign = a->sign & b->sign;
606 	  return tmp;
607 	}
608       return a;
609     }
610   if (iszero (a))
611     {
612       return b;
613     }
614 
615   /* Got two numbers. shift the smaller and increment the exponent till
616      they're the same */
617   {
618     int diff;
619     int sdiff;
620 
621     a_normal_exp = a->normal_exp;
622     b_normal_exp = b->normal_exp;
623     a_fraction = a->fraction.ll;
624     b_fraction = b->fraction.ll;
625 
626     diff = a_normal_exp - b_normal_exp;
627     sdiff = diff;
628 
629     if (diff < 0)
630       diff = -diff;
631     if (diff < FRAC_NBITS)
632       {
633 	if (sdiff > 0)
634 	  {
635 	    b_normal_exp += diff;
636 	    LSHIFT (b_fraction, diff);
637 	  }
638 	else if (sdiff < 0)
639 	  {
640 	    a_normal_exp += diff;
641 	    LSHIFT (a_fraction, diff);
642 	  }
643       }
644     else
645       {
646 	/* Somethings's up.. choose the biggest */
647 	if (a_normal_exp > b_normal_exp)
648 	  {
649 	    b_normal_exp = a_normal_exp;
650 	    b_fraction = 0;
651 	  }
652 	else
653 	  {
654 	    a_normal_exp = b_normal_exp;
655 	    a_fraction = 0;
656 	  }
657       }
658   }
659 
660   if (a->sign != b->sign)
661     {
662       if (a->sign)
663 	{
664 	  tfraction = -a_fraction + b_fraction;
665 	}
666       else
667 	{
668 	  tfraction = a_fraction - b_fraction;
669 	}
670       if (tfraction >= 0)
671 	{
672 	  tmp->sign = 0;
673 	  tmp->normal_exp = a_normal_exp;
674 	  tmp->fraction.ll = tfraction;
675 	}
676       else
677 	{
678 	  tmp->sign = 1;
679 	  tmp->normal_exp = a_normal_exp;
680 	  tmp->fraction.ll = -tfraction;
681 	}
682       /* and renormalize it */
683 
684       while (tmp->fraction.ll < IMPLICIT_1 && tmp->fraction.ll)
685 	{
686 	  tmp->fraction.ll <<= 1;
687 	  tmp->normal_exp--;
688 	}
689     }
690   else
691     {
692       tmp->sign = a->sign;
693       tmp->normal_exp = a_normal_exp;
694       tmp->fraction.ll = a_fraction + b_fraction;
695     }
696   tmp->class = CLASS_NUMBER;
697   /* Now the fraction is added, we have to shift down to renormalize the
698      number */
699 
700   if (tmp->fraction.ll >= IMPLICIT_2)
701     {
702       LSHIFT (tmp->fraction.ll, 1);
703       tmp->normal_exp++;
704     }
705   return tmp;
706 }
707 
708 FLO_type
709 add (FLO_type arg_a, FLO_type arg_b)
710 {
711   fp_number_type a;
712   fp_number_type b;
713   fp_number_type tmp;
714   const fp_number_type *res;
715   FLO_union_type au, bu;
716 
717   au.value = arg_a;
718   bu.value = arg_b;
719 
720   unpack_d (&au, &a);
721   unpack_d (&bu, &b);
722 
723   res = _fpadd_parts (&a, &b, &tmp);
724 
725   return pack_d (res);
726 }
727 
728 FLO_type
729 sub (FLO_type arg_a, FLO_type arg_b)
730 {
731   fp_number_type a;
732   fp_number_type b;
733   fp_number_type tmp;
734   const fp_number_type *res;
735   FLO_union_type au, bu;
736 
737   au.value = arg_a;
738   bu.value = arg_b;
739 
740   unpack_d (&au, &a);
741   unpack_d (&bu, &b);
742 
743   b.sign ^= 1;
744 
745   res = _fpadd_parts (&a, &b, &tmp);
746 
747   return pack_d (res);
748 }
749 #endif /* L_addsub_sf || L_addsub_df */
750 
751 #if defined(L_mul_sf) || defined(L_mul_df) || defined(L_mul_tf)
752 static inline __attribute__ ((__always_inline__)) const fp_number_type *
753 _fpmul_parts ( fp_number_type *  a,
754 	       fp_number_type *  b,
755 	       fp_number_type * tmp)
756 {
757   fractype low = 0;
758   fractype high = 0;
759 
760   if (isnan (a))
761     {
762       a->sign = a->sign != b->sign;
763       return a;
764     }
765   if (isnan (b))
766     {
767       b->sign = a->sign != b->sign;
768       return b;
769     }
770   if (isinf (a))
771     {
772       if (iszero (b))
773 	return makenan ();
774       a->sign = a->sign != b->sign;
775       return a;
776     }
777   if (isinf (b))
778     {
779       if (iszero (a))
780 	{
781 	  return makenan ();
782 	}
783       b->sign = a->sign != b->sign;
784       return b;
785     }
786   if (iszero (a))
787     {
788       a->sign = a->sign != b->sign;
789       return a;
790     }
791   if (iszero (b))
792     {
793       b->sign = a->sign != b->sign;
794       return b;
795     }
796 
797   /* Calculate the mantissa by multiplying both numbers to get a
798      twice-as-wide number.  */
799   {
800 #if defined(NO_DI_MODE) || defined(TFLOAT)
801     {
802       fractype x = a->fraction.ll;
803       fractype ylow = b->fraction.ll;
804       fractype yhigh = 0;
805       int bit;
806 
807       /* ??? This does multiplies one bit at a time.  Optimize.  */
808       for (bit = 0; bit < FRAC_NBITS; bit++)
809 	{
810 	  int carry;
811 
812 	  if (x & 1)
813 	    {
814 	      carry = (low += ylow) < ylow;
815 	      high += yhigh + carry;
816 	    }
817 	  yhigh <<= 1;
818 	  if (ylow & FRACHIGH)
819 	    {
820 	      yhigh |= 1;
821 	    }
822 	  ylow <<= 1;
823 	  x >>= 1;
824 	}
825     }
826 #elif defined(FLOAT)
827     /* Multiplying two USIs to get a UDI, we're safe.  */
828     {
829       UDItype answer = (UDItype)a->fraction.ll * (UDItype)b->fraction.ll;
830 
831       high = answer >> BITS_PER_SI;
832       low = answer;
833     }
834 #else
835     /* fractype is DImode, but we need the result to be twice as wide.
836        Assuming a widening multiply from DImode to TImode is not
837        available, build one by hand.  */
838     {
839       USItype nl = a->fraction.ll;
840       USItype nh = a->fraction.ll >> BITS_PER_SI;
841       USItype ml = b->fraction.ll;
842       USItype mh = b->fraction.ll >> BITS_PER_SI;
843       UDItype pp_ll = (UDItype) ml * nl;
844       UDItype pp_hl = (UDItype) mh * nl;
845       UDItype pp_lh = (UDItype) ml * nh;
846       UDItype pp_hh = (UDItype) mh * nh;
847       UDItype res2 = 0;
848       UDItype res0 = 0;
849       UDItype ps_hh__ = pp_hl + pp_lh;
850       if (ps_hh__ < pp_hl)
851 	res2 += (UDItype)1 << BITS_PER_SI;
852       pp_hl = (UDItype)(USItype)ps_hh__ << BITS_PER_SI;
853       res0 = pp_ll + pp_hl;
854       if (res0 < pp_ll)
855 	res2++;
856       res2 += (ps_hh__ >> BITS_PER_SI) + pp_hh;
857       high = res2;
858       low = res0;
859     }
860 #endif
861   }
862 
863   tmp->normal_exp = a->normal_exp + b->normal_exp
864     + FRAC_NBITS - (FRACBITS + NGARDS);
865   tmp->sign = a->sign != b->sign;
866   while (high >= IMPLICIT_2)
867     {
868       tmp->normal_exp++;
869       if (high & 1)
870 	{
871 	  low >>= 1;
872 	  low |= FRACHIGH;
873 	}
874       high >>= 1;
875     }
876   while (high < IMPLICIT_1)
877     {
878       tmp->normal_exp--;
879 
880       high <<= 1;
881       if (low & FRACHIGH)
882 	high |= 1;
883       low <<= 1;
884     }
885 
886   if ((high & GARDMASK) == GARDMSB)
887     {
888       if (high & (1 << NGARDS))
889 	{
890 	  /* Because we're half way, we would round to even by adding
891 	     GARDROUND + 1, except that's also done in the packing
892 	     function, and rounding twice will lose precision and cause
893 	     the result to be too far off.  Example: 32-bit floats with
894 	     bit patterns 0xfff * 0x3f800400 ~= 0xfff (less than 0.5ulp
895 	     off), not 0x1000 (more than 0.5ulp off).  */
896 	}
897       else if (low)
898 	{
899 	  /* We're a further than half way by a small amount corresponding
900 	     to the bits set in "low".  Knowing that, we round here and
901 	     not in pack_d, because there we don't have "low" available
902 	     anymore.  */
903 	  high += GARDROUND + 1;
904 
905 	  /* Avoid further rounding in pack_d.  */
906 	  high &= ~(fractype) GARDMASK;
907 	}
908     }
909   tmp->fraction.ll = high;
910   tmp->class = CLASS_NUMBER;
911   return tmp;
912 }
913 
914 FLO_type
915 multiply (FLO_type arg_a, FLO_type arg_b)
916 {
917   fp_number_type a;
918   fp_number_type b;
919   fp_number_type tmp;
920   const fp_number_type *res;
921   FLO_union_type au, bu;
922 
923   au.value = arg_a;
924   bu.value = arg_b;
925 
926   unpack_d (&au, &a);
927   unpack_d (&bu, &b);
928 
929   res = _fpmul_parts (&a, &b, &tmp);
930 
931   return pack_d (res);
932 }
933 #endif /* L_mul_sf || L_mul_df || L_mul_tf */
934 
935 #if defined(L_div_sf) || defined(L_div_df) || defined(L_div_tf)
936 static inline __attribute__ ((__always_inline__)) const fp_number_type *
937 _fpdiv_parts (fp_number_type * a,
938 	      fp_number_type * b)
939 {
940   fractype bit;
941   fractype numerator;
942   fractype denominator;
943   fractype quotient;
944 
945   if (isnan (a))
946     {
947       return a;
948     }
949   if (isnan (b))
950     {
951       return b;
952     }
953 
954   a->sign = a->sign ^ b->sign;
955 
956   if (isinf (a) || iszero (a))
957     {
958       if (a->class == b->class)
959 	return makenan ();
960       return a;
961     }
962 
963   if (isinf (b))
964     {
965       a->fraction.ll = 0;
966       a->normal_exp = 0;
967       return a;
968     }
969   if (iszero (b))
970     {
971       a->class = CLASS_INFINITY;
972       return a;
973     }
974 
975   /* Calculate the mantissa by multiplying both 64bit numbers to get a
976      128 bit number */
977   {
978     /* quotient =
979        ( numerator / denominator) * 2^(numerator exponent -  denominator exponent)
980      */
981 
982     a->normal_exp = a->normal_exp - b->normal_exp;
983     numerator = a->fraction.ll;
984     denominator = b->fraction.ll;
985 
986     if (numerator < denominator)
987       {
988 	/* Fraction will be less than 1.0 */
989 	numerator *= 2;
990 	a->normal_exp--;
991       }
992     bit = IMPLICIT_1;
993     quotient = 0;
994     /* ??? Does divide one bit at a time.  Optimize.  */
995     while (bit)
996       {
997 	if (numerator >= denominator)
998 	  {
999 	    quotient |= bit;
1000 	    numerator -= denominator;
1001 	  }
1002 	bit >>= 1;
1003 	numerator *= 2;
1004       }
1005 
1006     if ((quotient & GARDMASK) == GARDMSB)
1007       {
1008 	if (quotient & (1 << NGARDS))
1009 	  {
1010 	    /* Because we're half way, we would round to even by adding
1011 	       GARDROUND + 1, except that's also done in the packing
1012 	       function, and rounding twice will lose precision and cause
1013 	       the result to be too far off.  */
1014 	  }
1015 	else if (numerator)
1016 	  {
1017 	    /* We're a further than half way by the small amount
1018 	       corresponding to the bits set in "numerator".  Knowing
1019 	       that, we round here and not in pack_d, because there we
1020 	       don't have "numerator" available anymore.  */
1021 	    quotient += GARDROUND + 1;
1022 
1023 	    /* Avoid further rounding in pack_d.  */
1024 	    quotient &= ~(fractype) GARDMASK;
1025 	  }
1026       }
1027 
1028     a->fraction.ll = quotient;
1029     return (a);
1030   }
1031 }
1032 
1033 FLO_type
1034 divide (FLO_type arg_a, FLO_type arg_b)
1035 {
1036   fp_number_type a;
1037   fp_number_type b;
1038   const fp_number_type *res;
1039   FLO_union_type au, bu;
1040 
1041   au.value = arg_a;
1042   bu.value = arg_b;
1043 
1044   unpack_d (&au, &a);
1045   unpack_d (&bu, &b);
1046 
1047   res = _fpdiv_parts (&a, &b);
1048 
1049   return pack_d (res);
1050 }
1051 #endif /* L_div_sf || L_div_df */
1052 
1053 #if defined(L_fpcmp_parts_sf) || defined(L_fpcmp_parts_df) \
1054     || defined(L_fpcmp_parts_tf)
1055 /* according to the demo, fpcmp returns a comparison with 0... thus
1056    a<b -> -1
1057    a==b -> 0
1058    a>b -> +1
1059  */
1060 
1061 int
1062 __fpcmp_parts (fp_number_type * a, fp_number_type * b)
1063 {
1064 #if 0
1065   /* either nan -> unordered. Must be checked outside of this routine.  */
1066   if (isnan (a) && isnan (b))
1067     {
1068       return 1;			/* still unordered! */
1069     }
1070 #endif
1071 
1072   if (isnan (a) || isnan (b))
1073     {
1074       return 1;			/* how to indicate unordered compare? */
1075     }
1076   if (isinf (a) && isinf (b))
1077     {
1078       /* +inf > -inf, but +inf != +inf */
1079       /* b    \a| +inf(0)| -inf(1)
1080        ______\+--------+--------
1081        +inf(0)| a==b(0)| a<b(-1)
1082        -------+--------+--------
1083        -inf(1)| a>b(1) | a==b(0)
1084        -------+--------+--------
1085        So since unordered must be nonzero, just line up the columns...
1086        */
1087       return b->sign - a->sign;
1088     }
1089   /* but not both...  */
1090   if (isinf (a))
1091     {
1092       return a->sign ? -1 : 1;
1093     }
1094   if (isinf (b))
1095     {
1096       return b->sign ? 1 : -1;
1097     }
1098   if (iszero (a) && iszero (b))
1099     {
1100       return 0;
1101     }
1102   if (iszero (a))
1103     {
1104       return b->sign ? 1 : -1;
1105     }
1106   if (iszero (b))
1107     {
1108       return a->sign ? -1 : 1;
1109     }
1110   /* now both are "normal".  */
1111   if (a->sign != b->sign)
1112     {
1113       /* opposite signs */
1114       return a->sign ? -1 : 1;
1115     }
1116   /* same sign; exponents? */
1117   if (a->normal_exp > b->normal_exp)
1118     {
1119       return a->sign ? -1 : 1;
1120     }
1121   if (a->normal_exp < b->normal_exp)
1122     {
1123       return a->sign ? 1 : -1;
1124     }
1125   /* same exponents; check size.  */
1126   if (a->fraction.ll > b->fraction.ll)
1127     {
1128       return a->sign ? -1 : 1;
1129     }
1130   if (a->fraction.ll < b->fraction.ll)
1131     {
1132       return a->sign ? 1 : -1;
1133     }
1134   /* after all that, they're equal.  */
1135   return 0;
1136 }
1137 #endif
1138 
1139 #if defined(L_compare_sf) || defined(L_compare_df) || defined(L_compoare_tf)
1140 CMPtype
1141 compare (FLO_type arg_a, FLO_type arg_b)
1142 {
1143   fp_number_type a;
1144   fp_number_type b;
1145   FLO_union_type au, bu;
1146 
1147   au.value = arg_a;
1148   bu.value = arg_b;
1149 
1150   unpack_d (&au, &a);
1151   unpack_d (&bu, &b);
1152 
1153   return __fpcmp_parts (&a, &b);
1154 }
1155 #endif /* L_compare_sf || L_compare_df */
1156 
1157 /* These should be optimized for their specific tasks someday.  */
1158 
1159 #if defined(L_eq_sf) || defined(L_eq_df) || defined(L_eq_tf)
1160 CMPtype
1161 _eq_f2 (FLO_type arg_a, FLO_type arg_b)
1162 {
1163   fp_number_type a;
1164   fp_number_type b;
1165   FLO_union_type au, bu;
1166 
1167   au.value = arg_a;
1168   bu.value = arg_b;
1169 
1170   unpack_d (&au, &a);
1171   unpack_d (&bu, &b);
1172 
1173   if (isnan (&a) || isnan (&b))
1174     return 1;			/* false, truth == 0 */
1175 
1176   return __fpcmp_parts (&a, &b) ;
1177 }
1178 #endif /* L_eq_sf || L_eq_df */
1179 
1180 #if defined(L_ne_sf) || defined(L_ne_df) || defined(L_ne_tf)
1181 CMPtype
1182 _ne_f2 (FLO_type arg_a, FLO_type arg_b)
1183 {
1184   fp_number_type a;
1185   fp_number_type b;
1186   FLO_union_type au, bu;
1187 
1188   au.value = arg_a;
1189   bu.value = arg_b;
1190 
1191   unpack_d (&au, &a);
1192   unpack_d (&bu, &b);
1193 
1194   if (isnan (&a) || isnan (&b))
1195     return 1;			/* true, truth != 0 */
1196 
1197   return  __fpcmp_parts (&a, &b) ;
1198 }
1199 #endif /* L_ne_sf || L_ne_df */
1200 
1201 #if defined(L_gt_sf) || defined(L_gt_df) || defined(L_gt_tf)
1202 CMPtype
1203 _gt_f2 (FLO_type arg_a, FLO_type arg_b)
1204 {
1205   fp_number_type a;
1206   fp_number_type b;
1207   FLO_union_type au, bu;
1208 
1209   au.value = arg_a;
1210   bu.value = arg_b;
1211 
1212   unpack_d (&au, &a);
1213   unpack_d (&bu, &b);
1214 
1215   if (isnan (&a) || isnan (&b))
1216     return -1;			/* false, truth > 0 */
1217 
1218   return __fpcmp_parts (&a, &b);
1219 }
1220 #endif /* L_gt_sf || L_gt_df */
1221 
1222 #if defined(L_ge_sf) || defined(L_ge_df) || defined(L_ge_tf)
1223 CMPtype
1224 _ge_f2 (FLO_type arg_a, FLO_type arg_b)
1225 {
1226   fp_number_type a;
1227   fp_number_type b;
1228   FLO_union_type au, bu;
1229 
1230   au.value = arg_a;
1231   bu.value = arg_b;
1232 
1233   unpack_d (&au, &a);
1234   unpack_d (&bu, &b);
1235 
1236   if (isnan (&a) || isnan (&b))
1237     return -1;			/* false, truth >= 0 */
1238   return __fpcmp_parts (&a, &b) ;
1239 }
1240 #endif /* L_ge_sf || L_ge_df */
1241 
1242 #if defined(L_lt_sf) || defined(L_lt_df) || defined(L_lt_tf)
1243 CMPtype
1244 _lt_f2 (FLO_type arg_a, FLO_type arg_b)
1245 {
1246   fp_number_type a;
1247   fp_number_type b;
1248   FLO_union_type au, bu;
1249 
1250   au.value = arg_a;
1251   bu.value = arg_b;
1252 
1253   unpack_d (&au, &a);
1254   unpack_d (&bu, &b);
1255 
1256   if (isnan (&a) || isnan (&b))
1257     return 1;			/* false, truth < 0 */
1258 
1259   return __fpcmp_parts (&a, &b);
1260 }
1261 #endif /* L_lt_sf || L_lt_df */
1262 
1263 #if defined(L_le_sf) || defined(L_le_df) || defined(L_le_tf)
1264 CMPtype
1265 _le_f2 (FLO_type arg_a, FLO_type arg_b)
1266 {
1267   fp_number_type a;
1268   fp_number_type b;
1269   FLO_union_type au, bu;
1270 
1271   au.value = arg_a;
1272   bu.value = arg_b;
1273 
1274   unpack_d (&au, &a);
1275   unpack_d (&bu, &b);
1276 
1277   if (isnan (&a) || isnan (&b))
1278     return 1;			/* false, truth <= 0 */
1279 
1280   return __fpcmp_parts (&a, &b) ;
1281 }
1282 #endif /* L_le_sf || L_le_df */
1283 
1284 #if defined(L_unord_sf) || defined(L_unord_df) || defined(L_unord_tf)
1285 CMPtype
1286 _unord_f2 (FLO_type arg_a, FLO_type arg_b)
1287 {
1288   fp_number_type a;
1289   fp_number_type b;
1290   FLO_union_type au, bu;
1291 
1292   au.value = arg_a;
1293   bu.value = arg_b;
1294 
1295   unpack_d (&au, &a);
1296   unpack_d (&bu, &b);
1297 
1298   return (isnan (&a) || isnan (&b));
1299 }
1300 #endif /* L_unord_sf || L_unord_df */
1301 
1302 #if defined(L_si_to_sf) || defined(L_si_to_df) || defined(L_si_to_tf)
1303 FLO_type
1304 si_to_float (SItype arg_a)
1305 {
1306   fp_number_type in;
1307 
1308   in.class = CLASS_NUMBER;
1309   in.sign = arg_a < 0;
1310   if (!arg_a)
1311     {
1312       in.class = CLASS_ZERO;
1313     }
1314   else
1315     {
1316       USItype uarg;
1317       int shift;
1318       in.normal_exp = FRACBITS + NGARDS;
1319       if (in.sign)
1320 	{
1321 	  /* Special case for minint, since there is no +ve integer
1322 	     representation for it */
1323 	  if (arg_a == (- MAX_SI_INT - 1))
1324 	    {
1325 	      return (FLO_type)(- MAX_SI_INT - 1);
1326 	    }
1327 	  uarg = (-arg_a);
1328 	}
1329       else
1330 	uarg = arg_a;
1331 
1332       in.fraction.ll = uarg;
1333       shift = clzusi (uarg) - (BITS_PER_SI - 1 - FRACBITS - NGARDS);
1334       if (shift > 0)
1335 	{
1336 	  in.fraction.ll <<= shift;
1337 	  in.normal_exp -= shift;
1338 	}
1339     }
1340   return pack_d (&in);
1341 }
1342 #endif /* L_si_to_sf || L_si_to_df */
1343 
1344 #if defined(L_usi_to_sf) || defined(L_usi_to_df) || defined(L_usi_to_tf)
1345 FLO_type
1346 usi_to_float (USItype arg_a)
1347 {
1348   fp_number_type in;
1349 
1350   in.sign = 0;
1351   if (!arg_a)
1352     {
1353       in.class = CLASS_ZERO;
1354     }
1355   else
1356     {
1357       int shift;
1358       in.class = CLASS_NUMBER;
1359       in.normal_exp = FRACBITS + NGARDS;
1360       in.fraction.ll = arg_a;
1361 
1362       shift = clzusi (arg_a) - (BITS_PER_SI - 1 - FRACBITS - NGARDS);
1363       if (shift < 0)
1364 	{
1365 	  fractype guard = in.fraction.ll & (((fractype)1 << -shift) - 1);
1366 	  in.fraction.ll >>= -shift;
1367 	  in.fraction.ll |= (guard != 0);
1368 	  in.normal_exp -= shift;
1369 	}
1370       else if (shift > 0)
1371 	{
1372 	  in.fraction.ll <<= shift;
1373 	  in.normal_exp -= shift;
1374 	}
1375     }
1376   return pack_d (&in);
1377 }
1378 #endif
1379 
1380 #if defined(L_sf_to_si) || defined(L_df_to_si) || defined(L_tf_to_si)
1381 SItype
1382 float_to_si (FLO_type arg_a)
1383 {
1384   fp_number_type a;
1385   SItype tmp;
1386   FLO_union_type au;
1387 
1388   au.value = arg_a;
1389   unpack_d (&au, &a);
1390 
1391   if (iszero (&a))
1392     return 0;
1393   if (isnan (&a))
1394     return 0;
1395   /* get reasonable MAX_SI_INT...  */
1396   if (isinf (&a))
1397     return a.sign ? (-MAX_SI_INT)-1 : MAX_SI_INT;
1398   /* it is a number, but a small one */
1399   if (a.normal_exp < 0)
1400     return 0;
1401   if (a.normal_exp > BITS_PER_SI - 2)
1402     return a.sign ? (-MAX_SI_INT)-1 : MAX_SI_INT;
1403   tmp = a.fraction.ll >> ((FRACBITS + NGARDS) - a.normal_exp);
1404   return a.sign ? (-tmp) : (tmp);
1405 }
1406 #endif /* L_sf_to_si || L_df_to_si */
1407 
1408 #if defined(L_tf_to_usi)
1409 USItype
1410 float_to_usi (FLO_type arg_a)
1411 {
1412   fp_number_type a;
1413   FLO_union_type au;
1414 
1415   au.value = arg_a;
1416   unpack_d (&au, &a);
1417 
1418   if (iszero (&a))
1419     return 0;
1420   if (isnan (&a))
1421     return 0;
1422   /* it is a negative number */
1423   if (a.sign)
1424     return 0;
1425   /* get reasonable MAX_USI_INT...  */
1426   if (isinf (&a))
1427     return MAX_USI_INT;
1428   /* it is a number, but a small one */
1429   if (a.normal_exp < 0)
1430     return 0;
1431   if (a.normal_exp > BITS_PER_SI - 1)
1432     return MAX_USI_INT;
1433   else if (a.normal_exp > (FRACBITS + NGARDS))
1434     return a.fraction.ll << (a.normal_exp - (FRACBITS + NGARDS));
1435   else
1436     return a.fraction.ll >> ((FRACBITS + NGARDS) - a.normal_exp);
1437 }
1438 #endif /* L_tf_to_usi */
1439 
1440 #if defined(L_negate_sf) || defined(L_negate_df) || defined(L_negate_tf)
1441 FLO_type
1442 negate (FLO_type arg_a)
1443 {
1444   fp_number_type a;
1445   FLO_union_type au;
1446 
1447   au.value = arg_a;
1448   unpack_d (&au, &a);
1449 
1450   flip_sign (&a);
1451   return pack_d (&a);
1452 }
1453 #endif /* L_negate_sf || L_negate_df */
1454 
1455 #ifdef FLOAT
1456 
1457 #if defined(L_make_sf)
1458 SFtype
1459 __make_fp(fp_class_type class,
1460 	     unsigned int sign,
1461 	     int exp,
1462 	     USItype frac)
1463 {
1464   fp_number_type in;
1465 
1466   in.class = class;
1467   in.sign = sign;
1468   in.normal_exp = exp;
1469   in.fraction.ll = frac;
1470   return pack_d (&in);
1471 }
1472 #endif /* L_make_sf */
1473 
1474 #ifndef FLOAT_ONLY
1475 
1476 /* This enables one to build an fp library that supports float but not double.
1477    Otherwise, we would get an undefined reference to __make_dp.
1478    This is needed for some 8-bit ports that can't handle well values that
1479    are 8-bytes in size, so we just don't support double for them at all.  */
1480 
1481 #if defined(L_sf_to_df)
1482 DFtype
1483 sf_to_df (SFtype arg_a)
1484 {
1485   fp_number_type in;
1486   FLO_union_type au;
1487 
1488   au.value = arg_a;
1489   unpack_d (&au, &in);
1490 
1491   return __make_dp (in.class, in.sign, in.normal_exp,
1492 		    ((UDItype) in.fraction.ll) << F_D_BITOFF);
1493 }
1494 #endif /* L_sf_to_df */
1495 
1496 #if defined(L_sf_to_tf) && defined(TMODES)
1497 TFtype
1498 sf_to_tf (SFtype arg_a)
1499 {
1500   fp_number_type in;
1501   FLO_union_type au;
1502 
1503   au.value = arg_a;
1504   unpack_d (&au, &in);
1505 
1506   return __make_tp (in.class, in.sign, in.normal_exp,
1507 		    ((UTItype) in.fraction.ll) << F_T_BITOFF);
1508 }
1509 #endif /* L_sf_to_df */
1510 
1511 #endif /* ! FLOAT_ONLY */
1512 #endif /* FLOAT */
1513 
1514 #ifndef FLOAT
1515 
1516 extern SFtype __make_fp (fp_class_type, unsigned int, int, USItype);
1517 
1518 #if defined(L_make_df)
1519 DFtype
1520 __make_dp (fp_class_type class, unsigned int sign, int exp, UDItype frac)
1521 {
1522   fp_number_type in;
1523 
1524   in.class = class;
1525   in.sign = sign;
1526   in.normal_exp = exp;
1527   in.fraction.ll = frac;
1528   return pack_d (&in);
1529 }
1530 #endif /* L_make_df */
1531 
1532 #if defined(L_df_to_sf)
1533 SFtype
1534 df_to_sf (DFtype arg_a)
1535 {
1536   fp_number_type in;
1537   USItype sffrac;
1538   FLO_union_type au;
1539 
1540   au.value = arg_a;
1541   unpack_d (&au, &in);
1542 
1543   sffrac = in.fraction.ll >> F_D_BITOFF;
1544 
1545   /* We set the lowest guard bit in SFFRAC if we discarded any non
1546      zero bits.  */
1547   if ((in.fraction.ll & (((USItype) 1 << F_D_BITOFF) - 1)) != 0)
1548     sffrac |= 1;
1549 
1550   return __make_fp (in.class, in.sign, in.normal_exp, sffrac);
1551 }
1552 #endif /* L_df_to_sf */
1553 
1554 #if defined(L_df_to_tf) && defined(TMODES) \
1555     && !defined(FLOAT) && !defined(TFLOAT)
1556 TFtype
1557 df_to_tf (DFtype arg_a)
1558 {
1559   fp_number_type in;
1560   FLO_union_type au;
1561 
1562   au.value = arg_a;
1563   unpack_d (&au, &in);
1564 
1565   return __make_tp (in.class, in.sign, in.normal_exp,
1566 		    ((UTItype) in.fraction.ll) << D_T_BITOFF);
1567 }
1568 #endif /* L_sf_to_df */
1569 
1570 #ifdef TFLOAT
1571 #if defined(L_make_tf)
1572 TFtype
1573 __make_tp(fp_class_type class,
1574 	     unsigned int sign,
1575 	     int exp,
1576 	     UTItype frac)
1577 {
1578   fp_number_type in;
1579 
1580   in.class = class;
1581   in.sign = sign;
1582   in.normal_exp = exp;
1583   in.fraction.ll = frac;
1584   return pack_d (&in);
1585 }
1586 #endif /* L_make_tf */
1587 
1588 #if defined(L_tf_to_df)
1589 DFtype
1590 tf_to_df (TFtype arg_a)
1591 {
1592   fp_number_type in;
1593   UDItype sffrac;
1594   FLO_union_type au;
1595 
1596   au.value = arg_a;
1597   unpack_d (&au, &in);
1598 
1599   sffrac = in.fraction.ll >> D_T_BITOFF;
1600 
1601   /* We set the lowest guard bit in SFFRAC if we discarded any non
1602      zero bits.  */
1603   if ((in.fraction.ll & (((UTItype) 1 << D_T_BITOFF) - 1)) != 0)
1604     sffrac |= 1;
1605 
1606   return __make_dp (in.class, in.sign, in.normal_exp, sffrac);
1607 }
1608 #endif /* L_tf_to_df */
1609 
1610 #if defined(L_tf_to_sf)
1611 SFtype
1612 tf_to_sf (TFtype arg_a)
1613 {
1614   fp_number_type in;
1615   USItype sffrac;
1616   FLO_union_type au;
1617 
1618   au.value = arg_a;
1619   unpack_d (&au, &in);
1620 
1621   sffrac = in.fraction.ll >> F_T_BITOFF;
1622 
1623   /* We set the lowest guard bit in SFFRAC if we discarded any non
1624      zero bits.  */
1625   if ((in.fraction.ll & (((UTItype) 1 << F_T_BITOFF) - 1)) != 0)
1626     sffrac |= 1;
1627 
1628   return __make_fp (in.class, in.sign, in.normal_exp, sffrac);
1629 }
1630 #endif /* L_tf_to_sf */
1631 #endif /* TFLOAT */
1632 
1633 #endif /* ! FLOAT */
1634 #endif /* !EXTENDED_FLOAT_STUBS */
1635