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