gcc50: Disconnect from buildworld.
[dragonfly.git] / contrib / gcc-5.0 / libgcc / fp-bit.c
1 /* This is a software floating point library which can be used
2    for targets without hardware floating point. 
3    Copyright (C) 1994-2015 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);
74 void __extendsfxf2 (void) { abort(); }
75 void __extenddfxf2 (void) { abort(); }
76 void __truncxfdf2 (void) { abort(); }
77 void __truncxfsf2 (void) { abort(); }
78 void __fixxfsi (void) { abort(); }
79 void __floatsixf (void) { abort(); }
80 void __addxf3 (void) { abort(); }
81 void __subxf3 (void) { abort(); }
82 void __mulxf3 (void) { abort(); }
83 void __divxf3 (void) { abort(); }
84 void __negxf2 (void) { abort(); }
85 void __eqxf2 (void) { abort(); }
86 void __nexf2 (void) { abort(); }
87 void __gtxf2 (void) { abort(); }
88 void __gexf2 (void) { abort(); }
89 void __lexf2 (void) { abort(); }
90 void __ltxf2 (void) { abort(); }
91
92 void __extendsftf2 (void) { abort(); }
93 void __extenddftf2 (void) { abort(); }
94 void __trunctfdf2 (void) { abort(); }
95 void __trunctfsf2 (void) { abort(); }
96 void __fixtfsi (void) { abort(); }
97 void __floatsitf (void) { abort(); }
98 void __addtf3 (void) { abort(); }
99 void __subtf3 (void) { abort(); }
100 void __multf3 (void) { abort(); }
101 void __divtf3 (void) { abort(); }
102 void __negtf2 (void) { abort(); }
103 void __eqtf2 (void) { abort(); }
104 void __netf2 (void) { abort(); }
105 void __gttf2 (void) { abort(); }
106 void __getf2 (void) { abort(); }
107 void __letf2 (void) { abort(); }
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 #ifdef FLOAT_BIT_ORDER_MISMATCH
320   dst.bits.fraction = fraction;
321   dst.bits.exp = exp;
322   dst.bits.sign = sign;
323 #else
324 # if defined TFLOAT && defined HALFFRACBITS
325  {
326    halffractype high, low, unity;
327    int lowsign, lowexp;
328
329    unity = (halffractype) 1 << HALFFRACBITS;
330
331    /* Set HIGH to the high double's significand, masking out the implicit 1.
332       Set LOW to the low double's full significand.  */
333    high = (fraction >> (FRACBITS - HALFFRACBITS)) & (unity - 1);
334    low = fraction & (unity * 2 - 1);
335
336    /* Get the initial sign and exponent of the low double.  */
337    lowexp = exp - HALFFRACBITS - 1;
338    lowsign = sign;
339
340    /* HIGH should be rounded like a normal double, making |LOW| <=
341       0.5 ULP of HIGH.  Assume round-to-nearest.  */
342    if (exp < EXPMAX)
343      if (low > unity || (low == unity && (high & 1) == 1))
344        {
345          /* Round HIGH up and adjust LOW to match.  */
346          high++;
347          if (high == unity)
348            {
349              /* May make it infinite, but that's OK.  */
350              high = 0;
351              exp++;
352            }
353          low = unity * 2 - low;
354          lowsign ^= 1;
355        }
356
357    high |= (halffractype) exp << HALFFRACBITS;
358    high |= (halffractype) sign << (HALFFRACBITS + EXPBITS);
359
360    if (exp == EXPMAX || exp == 0 || low == 0)
361      low = 0;
362    else
363      {
364        while (lowexp > 0 && low < unity)
365          {
366            low <<= 1;
367            lowexp--;
368          }
369
370        if (lowexp <= 0)
371          {
372            halffractype roundmsb, round;
373            int shift;
374
375            shift = 1 - lowexp;
376            roundmsb = (1 << (shift - 1));
377            round = low & ((roundmsb << 1) - 1);
378
379            low >>= shift;
380            lowexp = 0;
381
382            if (round > roundmsb || (round == roundmsb && (low & 1) == 1))
383              {
384                low++;
385                if (low == unity)
386                  /* LOW rounds up to the smallest normal number.  */
387                  lowexp++;
388              }
389          }
390
391        low &= unity - 1;
392        low |= (halffractype) lowexp << HALFFRACBITS;
393        low |= (halffractype) lowsign << (HALFFRACBITS + EXPBITS);
394      }
395    dst.value_raw = ((fractype) high << HALFSHIFT) | low;
396  }
397 # else
398   dst.value_raw = fraction & ((((fractype)1) << FRACBITS) - (fractype)1);
399   dst.value_raw |= ((fractype) (exp & ((1 << EXPBITS) - 1))) << FRACBITS;
400   dst.value_raw |= ((fractype) (sign & 1)) << (FRACBITS | EXPBITS);
401 # endif
402 #endif
403
404 #if defined(FLOAT_WORD_ORDER_MISMATCH) && !defined(FLOAT)
405 #ifdef TFLOAT
406   {
407     qrtrfractype tmp1 = dst.words[0];
408     qrtrfractype tmp2 = dst.words[1];
409     dst.words[0] = dst.words[3];
410     dst.words[1] = dst.words[2];
411     dst.words[2] = tmp2;
412     dst.words[3] = tmp1;
413   }
414 #else
415   {
416     halffractype tmp = dst.words[0];
417     dst.words[0] = dst.words[1];
418     dst.words[1] = tmp;
419   }
420 #endif
421 #endif
422
423   return dst.value;
424 }
425 #endif
426
427 #if defined(L_unpack_df) || defined(L_unpack_sf) || defined(L_unpack_tf)
428 void
429 unpack_d (FLO_union_type * src, fp_number_type * dst)
430 {
431   /* We previously used bitfields to store the number, but this doesn't
432      handle little/big endian systems conveniently, so use shifts and
433      masks */
434   fractype fraction;
435   int exp;
436   int sign;
437
438 #if defined(FLOAT_WORD_ORDER_MISMATCH) && !defined(FLOAT)
439   FLO_union_type swapped;
440
441 #ifdef TFLOAT
442   swapped.words[0] = src->words[3];
443   swapped.words[1] = src->words[2];
444   swapped.words[2] = src->words[1];
445   swapped.words[3] = src->words[0];
446 #else
447   swapped.words[0] = src->words[1];
448   swapped.words[1] = src->words[0];
449 #endif
450   src = &swapped;
451 #endif
452   
453 #ifdef FLOAT_BIT_ORDER_MISMATCH
454   fraction = src->bits.fraction;
455   exp = src->bits.exp;
456   sign = src->bits.sign;
457 #else
458 # if defined TFLOAT && defined HALFFRACBITS
459  {
460    halffractype high, low;
461    
462    high = src->value_raw >> HALFSHIFT;
463    low = src->value_raw & (((fractype)1 << HALFSHIFT) - 1);
464
465    fraction = high & ((((fractype)1) << HALFFRACBITS) - 1);
466    fraction <<= FRACBITS - HALFFRACBITS;
467    exp = ((int)(high >> HALFFRACBITS)) & ((1 << EXPBITS) - 1);
468    sign = ((int)(high >> (((HALFFRACBITS + EXPBITS))))) & 1;
469
470    if (exp != EXPMAX && exp != 0 && low != 0)
471      {
472        int lowexp = ((int)(low >> HALFFRACBITS)) & ((1 << EXPBITS) - 1);
473        int lowsign = ((int)(low >> (((HALFFRACBITS + EXPBITS))))) & 1;
474        int shift;
475        fractype xlow;
476
477        xlow = low & ((((fractype)1) << HALFFRACBITS) - 1);
478        if (lowexp)
479          xlow |= (((halffractype)1) << HALFFRACBITS);
480        else
481          lowexp = 1;
482        shift = (FRACBITS - HALFFRACBITS) - (exp - lowexp);
483        if (shift > 0)
484          xlow <<= shift;
485        else if (shift < 0)
486          xlow >>= -shift;
487        if (sign == lowsign)
488          fraction += xlow;
489        else if (fraction >= xlow)
490          fraction -= xlow;
491        else
492          {
493            /* The high part is a power of two but the full number is lower.
494               This code will leave the implicit 1 in FRACTION, but we'd
495               have added that below anyway.  */
496            fraction = (((fractype) 1 << FRACBITS) - xlow) << 1;
497            exp--;
498          }
499      }
500  }
501 # else
502   fraction = src->value_raw & ((((fractype)1) << FRACBITS) - 1);
503   exp = ((int)(src->value_raw >> FRACBITS)) & ((1 << EXPBITS) - 1);
504   sign = ((int)(src->value_raw >> (FRACBITS + EXPBITS))) & 1;
505 # endif
506 #endif
507
508   dst->sign = sign;
509   if (exp == 0)
510     {
511       /* Hmm.  Looks like 0 */
512       if (fraction == 0
513 #ifdef NO_DENORMALS
514           || 1
515 #endif
516           )
517         {
518           /* tastes like zero */
519           dst->class = CLASS_ZERO;
520         }
521       else
522         {
523           /* Zero exponent with nonzero fraction - it's denormalized,
524              so there isn't a leading implicit one - we'll shift it so
525              it gets one.  */
526           dst->normal_exp = exp - EXPBIAS + 1;
527           fraction <<= NGARDS;
528
529           dst->class = CLASS_NUMBER;
530 #if 1
531           while (fraction < IMPLICIT_1)
532             {
533               fraction <<= 1;
534               dst->normal_exp--;
535             }
536 #endif
537           dst->fraction.ll = fraction;
538         }
539     }
540   else if (__builtin_expect (exp == EXPMAX, 0))
541     {
542       /* Huge exponent*/
543       if (fraction == 0)
544         {
545           /* Attached to a zero fraction - means infinity */
546           dst->class = CLASS_INFINITY;
547         }
548       else
549         {
550           /* Nonzero fraction, means nan */
551 #ifdef QUIET_NAN_NEGATED
552           if ((fraction & QUIET_NAN) == 0)
553 #else
554           if (fraction & QUIET_NAN)
555 #endif
556             {
557               dst->class = CLASS_QNAN;
558             }
559           else
560             {
561               dst->class = CLASS_SNAN;
562             }
563           /* Now that we know which kind of NaN we got, discard the
564              quiet/signaling bit, but do preserve the NaN payload.  */
565           fraction &= ~QUIET_NAN;
566           dst->fraction.ll = fraction << NGARDS;
567         }
568     }
569   else
570     {
571       /* Nothing strange about this number */
572       dst->normal_exp = exp - EXPBIAS;
573       dst->class = CLASS_NUMBER;
574       dst->fraction.ll = (fraction << NGARDS) | IMPLICIT_1;
575     }
576 }
577 #endif /* L_unpack_df || L_unpack_sf */
578
579 #if defined(L_addsub_sf) || defined(L_addsub_df) || defined(L_addsub_tf)
580 static const fp_number_type *
581 _fpadd_parts (fp_number_type * a,
582               fp_number_type * b,
583               fp_number_type * tmp)
584 {
585   intfrac tfraction;
586
587   /* Put commonly used fields in local variables.  */
588   int a_normal_exp;
589   int b_normal_exp;
590   fractype a_fraction;
591   fractype b_fraction;
592
593   if (isnan (a))
594     {
595       return a;
596     }
597   if (isnan (b))
598     {
599       return b;
600     }
601   if (isinf (a))
602     {
603       /* Adding infinities with opposite signs yields a NaN.  */
604       if (isinf (b) && a->sign != b->sign)
605         return makenan ();
606       return a;
607     }
608   if (isinf (b))
609     {
610       return b;
611     }
612   if (iszero (b))
613     {
614       if (iszero (a))
615         {
616           *tmp = *a;
617           tmp->sign = a->sign & b->sign;
618           return tmp;
619         }
620       return a;
621     }
622   if (iszero (a))
623     {
624       return b;
625     }
626
627   /* Got two numbers. shift the smaller and increment the exponent till
628      they're the same */
629   {
630     int diff;
631     int sdiff;
632
633     a_normal_exp = a->normal_exp;
634     b_normal_exp = b->normal_exp;
635     a_fraction = a->fraction.ll;
636     b_fraction = b->fraction.ll;
637
638     diff = a_normal_exp - b_normal_exp;
639     sdiff = diff;
640
641     if (diff < 0)
642       diff = -diff;
643     if (diff < FRAC_NBITS)
644       {
645         if (sdiff > 0)
646           {
647             b_normal_exp += diff;
648             LSHIFT (b_fraction, diff);
649           }
650         else if (sdiff < 0)
651           {
652             a_normal_exp += diff;
653             LSHIFT (a_fraction, diff);
654           }
655       }
656     else
657       {
658         /* Somethings's up.. choose the biggest */
659         if (a_normal_exp > b_normal_exp)
660           {
661             b_normal_exp = a_normal_exp;
662             b_fraction = 0;
663           }
664         else
665           {
666             a_normal_exp = b_normal_exp;
667             a_fraction = 0;
668           }
669       }
670   }
671
672   if (a->sign != b->sign)
673     {
674       if (a->sign)
675         {
676           tfraction = -a_fraction + b_fraction;
677         }
678       else
679         {
680           tfraction = a_fraction - b_fraction;
681         }
682       if (tfraction >= 0)
683         {
684           tmp->sign = 0;
685           tmp->normal_exp = a_normal_exp;
686           tmp->fraction.ll = tfraction;
687         }
688       else
689         {
690           tmp->sign = 1;
691           tmp->normal_exp = a_normal_exp;
692           tmp->fraction.ll = -tfraction;
693         }
694       /* and renormalize it */
695
696       while (tmp->fraction.ll < IMPLICIT_1 && tmp->fraction.ll)
697         {
698           tmp->fraction.ll <<= 1;
699           tmp->normal_exp--;
700         }
701     }
702   else
703     {
704       tmp->sign = a->sign;
705       tmp->normal_exp = a_normal_exp;
706       tmp->fraction.ll = a_fraction + b_fraction;
707     }
708   tmp->class = CLASS_NUMBER;
709   /* Now the fraction is added, we have to shift down to renormalize the
710      number */
711
712   if (tmp->fraction.ll >= IMPLICIT_2)
713     {
714       LSHIFT (tmp->fraction.ll, 1);
715       tmp->normal_exp++;
716     }
717   return tmp;
718 }
719
720 FLO_type
721 add (FLO_type arg_a, FLO_type arg_b)
722 {
723   fp_number_type a;
724   fp_number_type b;
725   fp_number_type tmp;
726   const fp_number_type *res;
727   FLO_union_type au, bu;
728
729   au.value = arg_a;
730   bu.value = arg_b;
731
732   unpack_d (&au, &a);
733   unpack_d (&bu, &b);
734
735   res = _fpadd_parts (&a, &b, &tmp);
736
737   return pack_d (res);
738 }
739
740 FLO_type
741 sub (FLO_type arg_a, FLO_type arg_b)
742 {
743   fp_number_type a;
744   fp_number_type b;
745   fp_number_type tmp;
746   const fp_number_type *res;
747   FLO_union_type au, bu;
748
749   au.value = arg_a;
750   bu.value = arg_b;
751
752   unpack_d (&au, &a);
753   unpack_d (&bu, &b);
754
755   b.sign ^= 1;
756
757   res = _fpadd_parts (&a, &b, &tmp);
758
759   return pack_d (res);
760 }
761 #endif /* L_addsub_sf || L_addsub_df */
762
763 #if defined(L_mul_sf) || defined(L_mul_df) || defined(L_mul_tf)
764 static inline __attribute__ ((__always_inline__)) const fp_number_type *
765 _fpmul_parts ( fp_number_type *  a,
766                fp_number_type *  b,
767                fp_number_type * tmp)
768 {
769   fractype low = 0;
770   fractype high = 0;
771
772   if (isnan (a))
773     {
774       a->sign = a->sign != b->sign;
775       return a;
776     }
777   if (isnan (b))
778     {
779       b->sign = a->sign != b->sign;
780       return b;
781     }
782   if (isinf (a))
783     {
784       if (iszero (b))
785         return makenan ();
786       a->sign = a->sign != b->sign;
787       return a;
788     }
789   if (isinf (b))
790     {
791       if (iszero (a))
792         {
793           return makenan ();
794         }
795       b->sign = a->sign != b->sign;
796       return b;
797     }
798   if (iszero (a))
799     {
800       a->sign = a->sign != b->sign;
801       return a;
802     }
803   if (iszero (b))
804     {
805       b->sign = a->sign != b->sign;
806       return b;
807     }
808
809   /* Calculate the mantissa by multiplying both numbers to get a
810      twice-as-wide number.  */
811   {
812 #if defined(NO_DI_MODE) || defined(TFLOAT)
813     {
814       fractype x = a->fraction.ll;
815       fractype ylow = b->fraction.ll;
816       fractype yhigh = 0;
817       int bit;
818
819       /* ??? This does multiplies one bit at a time.  Optimize.  */
820       for (bit = 0; bit < FRAC_NBITS; bit++)
821         {
822           int carry;
823
824           if (x & 1)
825             {
826               carry = (low += ylow) < ylow;
827               high += yhigh + carry;
828             }
829           yhigh <<= 1;
830           if (ylow & FRACHIGH)
831             {
832               yhigh |= 1;
833             }
834           ylow <<= 1;
835           x >>= 1;
836         }
837     }
838 #elif defined(FLOAT) 
839     /* Multiplying two USIs to get a UDI, we're safe.  */
840     {
841       UDItype answer = (UDItype)a->fraction.ll * (UDItype)b->fraction.ll;
842       
843       high = answer >> BITS_PER_SI;
844       low = answer;
845     }
846 #else
847     /* fractype is DImode, but we need the result to be twice as wide.
848        Assuming a widening multiply from DImode to TImode is not
849        available, build one by hand.  */
850     {
851       USItype nl = a->fraction.ll;
852       USItype nh = a->fraction.ll >> BITS_PER_SI;
853       USItype ml = b->fraction.ll;
854       USItype mh = b->fraction.ll >> BITS_PER_SI;
855       UDItype pp_ll = (UDItype) ml * nl;
856       UDItype pp_hl = (UDItype) mh * nl;
857       UDItype pp_lh = (UDItype) ml * nh;
858       UDItype pp_hh = (UDItype) mh * nh;
859       UDItype res2 = 0;
860       UDItype res0 = 0;
861       UDItype ps_hh__ = pp_hl + pp_lh;
862       if (ps_hh__ < pp_hl)
863         res2 += (UDItype)1 << BITS_PER_SI;
864       pp_hl = (UDItype)(USItype)ps_hh__ << BITS_PER_SI;
865       res0 = pp_ll + pp_hl;
866       if (res0 < pp_ll)
867         res2++;
868       res2 += (ps_hh__ >> BITS_PER_SI) + pp_hh;
869       high = res2;
870       low = res0;
871     }
872 #endif
873   }
874
875   tmp->normal_exp = a->normal_exp + b->normal_exp
876     + FRAC_NBITS - (FRACBITS + NGARDS);
877   tmp->sign = a->sign != b->sign;
878   while (high >= IMPLICIT_2)
879     {
880       tmp->normal_exp++;
881       if (high & 1)
882         {
883           low >>= 1;
884           low |= FRACHIGH;
885         }
886       high >>= 1;
887     }
888   while (high < IMPLICIT_1)
889     {
890       tmp->normal_exp--;
891
892       high <<= 1;
893       if (low & FRACHIGH)
894         high |= 1;
895       low <<= 1;
896     }
897
898   if ((high & GARDMASK) == GARDMSB)
899     {
900       if (high & (1 << NGARDS))
901         {
902           /* Because we're half way, we would round to even by adding
903              GARDROUND + 1, except that's also done in the packing
904              function, and rounding twice will lose precision and cause
905              the result to be too far off.  Example: 32-bit floats with
906              bit patterns 0xfff * 0x3f800400 ~= 0xfff (less than 0.5ulp
907              off), not 0x1000 (more than 0.5ulp off).  */
908         }
909       else if (low)
910         {
911           /* We're a further than half way by a small amount corresponding
912              to the bits set in "low".  Knowing that, we round here and
913              not in pack_d, because there we don't have "low" available
914              anymore.  */
915           high += GARDROUND + 1;
916
917           /* Avoid further rounding in pack_d.  */
918           high &= ~(fractype) GARDMASK;
919         }
920     }
921   tmp->fraction.ll = high;
922   tmp->class = CLASS_NUMBER;
923   return tmp;
924 }
925
926 FLO_type
927 multiply (FLO_type arg_a, FLO_type arg_b)
928 {
929   fp_number_type a;
930   fp_number_type b;
931   fp_number_type tmp;
932   const fp_number_type *res;
933   FLO_union_type au, bu;
934
935   au.value = arg_a;
936   bu.value = arg_b;
937
938   unpack_d (&au, &a);
939   unpack_d (&bu, &b);
940
941   res = _fpmul_parts (&a, &b, &tmp);
942
943   return pack_d (res);
944 }
945 #endif /* L_mul_sf || L_mul_df || L_mul_tf */
946
947 #if defined(L_div_sf) || defined(L_div_df) || defined(L_div_tf)
948 static inline __attribute__ ((__always_inline__)) const fp_number_type *
949 _fpdiv_parts (fp_number_type * a,
950               fp_number_type * b)
951 {
952   fractype bit;
953   fractype numerator;
954   fractype denominator;
955   fractype quotient;
956
957   if (isnan (a))
958     {
959       return a;
960     }
961   if (isnan (b))
962     {
963       return b;
964     }
965
966   a->sign = a->sign ^ b->sign;
967
968   if (isinf (a) || iszero (a))
969     {
970       if (a->class == b->class)
971         return makenan ();
972       return a;
973     }
974
975   if (isinf (b))
976     {
977       a->fraction.ll = 0;
978       a->normal_exp = 0;
979       return a;
980     }
981   if (iszero (b))
982     {
983       a->class = CLASS_INFINITY;
984       return a;
985     }
986
987   /* Calculate the mantissa by multiplying both 64bit numbers to get a
988      128 bit number */
989   {
990     /* quotient =
991        ( numerator / denominator) * 2^(numerator exponent -  denominator exponent)
992      */
993
994     a->normal_exp = a->normal_exp - b->normal_exp;
995     numerator = a->fraction.ll;
996     denominator = b->fraction.ll;
997
998     if (numerator < denominator)
999       {
1000         /* Fraction will be less than 1.0 */
1001         numerator *= 2;
1002         a->normal_exp--;
1003       }
1004     bit = IMPLICIT_1;
1005     quotient = 0;
1006     /* ??? Does divide one bit at a time.  Optimize.  */
1007     while (bit)
1008       {
1009         if (numerator >= denominator)
1010           {
1011             quotient |= bit;
1012             numerator -= denominator;
1013           }
1014         bit >>= 1;
1015         numerator *= 2;
1016       }
1017
1018     if ((quotient & GARDMASK) == GARDMSB)
1019       {
1020         if (quotient & (1 << NGARDS))
1021           {
1022             /* Because we're half way, we would round to even by adding
1023                GARDROUND + 1, except that's also done in the packing
1024                function, and rounding twice will lose precision and cause
1025                the result to be too far off.  */
1026           }
1027         else if (numerator)
1028           {
1029             /* We're a further than half way by the small amount
1030                corresponding to the bits set in "numerator".  Knowing
1031                that, we round here and not in pack_d, because there we
1032                don't have "numerator" available anymore.  */
1033             quotient += GARDROUND + 1;
1034
1035             /* Avoid further rounding in pack_d.  */
1036             quotient &= ~(fractype) GARDMASK;
1037           }
1038       }
1039
1040     a->fraction.ll = quotient;
1041     return (a);
1042   }
1043 }
1044
1045 FLO_type
1046 divide (FLO_type arg_a, FLO_type arg_b)
1047 {
1048   fp_number_type a;
1049   fp_number_type b;
1050   const fp_number_type *res;
1051   FLO_union_type au, bu;
1052
1053   au.value = arg_a;
1054   bu.value = arg_b;
1055
1056   unpack_d (&au, &a);
1057   unpack_d (&bu, &b);
1058
1059   res = _fpdiv_parts (&a, &b);
1060
1061   return pack_d (res);
1062 }
1063 #endif /* L_div_sf || L_div_df */
1064
1065 #if defined(L_fpcmp_parts_sf) || defined(L_fpcmp_parts_df) \
1066     || defined(L_fpcmp_parts_tf)
1067 /* according to the demo, fpcmp returns a comparison with 0... thus
1068    a<b -> -1
1069    a==b -> 0
1070    a>b -> +1
1071  */
1072
1073 int
1074 __fpcmp_parts (fp_number_type * a, fp_number_type * b)
1075 {
1076 #if 0
1077   /* either nan -> unordered. Must be checked outside of this routine.  */
1078   if (isnan (a) && isnan (b))
1079     {
1080       return 1;                 /* still unordered! */
1081     }
1082 #endif
1083
1084   if (isnan (a) || isnan (b))
1085     {
1086       return 1;                 /* how to indicate unordered compare? */
1087     }
1088   if (isinf (a) && isinf (b))
1089     {
1090       /* +inf > -inf, but +inf != +inf */
1091       /* b    \a| +inf(0)| -inf(1)
1092        ______\+--------+--------
1093        +inf(0)| a==b(0)| a<b(-1)
1094        -------+--------+--------
1095        -inf(1)| a>b(1) | a==b(0)
1096        -------+--------+--------
1097        So since unordered must be nonzero, just line up the columns...
1098        */
1099       return b->sign - a->sign;
1100     }
1101   /* but not both...  */
1102   if (isinf (a))
1103     {
1104       return a->sign ? -1 : 1;
1105     }
1106   if (isinf (b))
1107     {
1108       return b->sign ? 1 : -1;
1109     }
1110   if (iszero (a) && iszero (b))
1111     {
1112       return 0;
1113     }
1114   if (iszero (a))
1115     {
1116       return b->sign ? 1 : -1;
1117     }
1118   if (iszero (b))
1119     {
1120       return a->sign ? -1 : 1;
1121     }
1122   /* now both are "normal".  */
1123   if (a->sign != b->sign)
1124     {
1125       /* opposite signs */
1126       return a->sign ? -1 : 1;
1127     }
1128   /* same sign; exponents? */
1129   if (a->normal_exp > b->normal_exp)
1130     {
1131       return a->sign ? -1 : 1;
1132     }
1133   if (a->normal_exp < b->normal_exp)
1134     {
1135       return a->sign ? 1 : -1;
1136     }
1137   /* same exponents; check size.  */
1138   if (a->fraction.ll > b->fraction.ll)
1139     {
1140       return a->sign ? -1 : 1;
1141     }
1142   if (a->fraction.ll < b->fraction.ll)
1143     {
1144       return a->sign ? 1 : -1;
1145     }
1146   /* after all that, they're equal.  */
1147   return 0;
1148 }
1149 #endif
1150
1151 #if defined(L_compare_sf) || defined(L_compare_df) || defined(L_compoare_tf)
1152 CMPtype
1153 compare (FLO_type arg_a, FLO_type arg_b)
1154 {
1155   fp_number_type a;
1156   fp_number_type b;
1157   FLO_union_type au, bu;
1158
1159   au.value = arg_a;
1160   bu.value = arg_b;
1161
1162   unpack_d (&au, &a);
1163   unpack_d (&bu, &b);
1164
1165   return __fpcmp_parts (&a, &b);
1166 }
1167 #endif /* L_compare_sf || L_compare_df */
1168
1169 /* These should be optimized for their specific tasks someday.  */
1170
1171 #if defined(L_eq_sf) || defined(L_eq_df) || defined(L_eq_tf)
1172 CMPtype
1173 _eq_f2 (FLO_type arg_a, FLO_type arg_b)
1174 {
1175   fp_number_type a;
1176   fp_number_type b;
1177   FLO_union_type au, bu;
1178
1179   au.value = arg_a;
1180   bu.value = arg_b;
1181
1182   unpack_d (&au, &a);
1183   unpack_d (&bu, &b);
1184
1185   if (isnan (&a) || isnan (&b))
1186     return 1;                   /* false, truth == 0 */
1187
1188   return __fpcmp_parts (&a, &b) ;
1189 }
1190 #endif /* L_eq_sf || L_eq_df */
1191
1192 #if defined(L_ne_sf) || defined(L_ne_df) || defined(L_ne_tf)
1193 CMPtype
1194 _ne_f2 (FLO_type arg_a, FLO_type arg_b)
1195 {
1196   fp_number_type a;
1197   fp_number_type b;
1198   FLO_union_type au, bu;
1199
1200   au.value = arg_a;
1201   bu.value = arg_b;
1202
1203   unpack_d (&au, &a);
1204   unpack_d (&bu, &b);
1205
1206   if (isnan (&a) || isnan (&b))
1207     return 1;                   /* true, truth != 0 */
1208
1209   return  __fpcmp_parts (&a, &b) ;
1210 }
1211 #endif /* L_ne_sf || L_ne_df */
1212
1213 #if defined(L_gt_sf) || defined(L_gt_df) || defined(L_gt_tf)
1214 CMPtype
1215 _gt_f2 (FLO_type arg_a, FLO_type arg_b)
1216 {
1217   fp_number_type a;
1218   fp_number_type b;
1219   FLO_union_type au, bu;
1220
1221   au.value = arg_a;
1222   bu.value = arg_b;
1223
1224   unpack_d (&au, &a);
1225   unpack_d (&bu, &b);
1226
1227   if (isnan (&a) || isnan (&b))
1228     return -1;                  /* false, truth > 0 */
1229
1230   return __fpcmp_parts (&a, &b);
1231 }
1232 #endif /* L_gt_sf || L_gt_df */
1233
1234 #if defined(L_ge_sf) || defined(L_ge_df) || defined(L_ge_tf)
1235 CMPtype
1236 _ge_f2 (FLO_type arg_a, FLO_type arg_b)
1237 {
1238   fp_number_type a;
1239   fp_number_type b;
1240   FLO_union_type au, bu;
1241
1242   au.value = arg_a;
1243   bu.value = arg_b;
1244
1245   unpack_d (&au, &a);
1246   unpack_d (&bu, &b);
1247
1248   if (isnan (&a) || isnan (&b))
1249     return -1;                  /* false, truth >= 0 */
1250   return __fpcmp_parts (&a, &b) ;
1251 }
1252 #endif /* L_ge_sf || L_ge_df */
1253
1254 #if defined(L_lt_sf) || defined(L_lt_df) || defined(L_lt_tf)
1255 CMPtype
1256 _lt_f2 (FLO_type arg_a, FLO_type arg_b)
1257 {
1258   fp_number_type a;
1259   fp_number_type b;
1260   FLO_union_type au, bu;
1261
1262   au.value = arg_a;
1263   bu.value = arg_b;
1264
1265   unpack_d (&au, &a);
1266   unpack_d (&bu, &b);
1267
1268   if (isnan (&a) || isnan (&b))
1269     return 1;                   /* false, truth < 0 */
1270
1271   return __fpcmp_parts (&a, &b);
1272 }
1273 #endif /* L_lt_sf || L_lt_df */
1274
1275 #if defined(L_le_sf) || defined(L_le_df) || defined(L_le_tf)
1276 CMPtype
1277 _le_f2 (FLO_type arg_a, FLO_type arg_b)
1278 {
1279   fp_number_type a;
1280   fp_number_type b;
1281   FLO_union_type au, bu;
1282
1283   au.value = arg_a;
1284   bu.value = arg_b;
1285
1286   unpack_d (&au, &a);
1287   unpack_d (&bu, &b);
1288
1289   if (isnan (&a) || isnan (&b))
1290     return 1;                   /* false, truth <= 0 */
1291
1292   return __fpcmp_parts (&a, &b) ;
1293 }
1294 #endif /* L_le_sf || L_le_df */
1295
1296 #if defined(L_unord_sf) || defined(L_unord_df) || defined(L_unord_tf)
1297 CMPtype
1298 _unord_f2 (FLO_type arg_a, FLO_type arg_b)
1299 {
1300   fp_number_type a;
1301   fp_number_type b;
1302   FLO_union_type au, bu;
1303
1304   au.value = arg_a;
1305   bu.value = arg_b;
1306
1307   unpack_d (&au, &a);
1308   unpack_d (&bu, &b);
1309
1310   return (isnan (&a) || isnan (&b));
1311 }
1312 #endif /* L_unord_sf || L_unord_df */
1313
1314 #if defined(L_si_to_sf) || defined(L_si_to_df) || defined(L_si_to_tf)
1315 FLO_type
1316 si_to_float (SItype arg_a)
1317 {
1318   fp_number_type in;
1319
1320   in.class = CLASS_NUMBER;
1321   in.sign = arg_a < 0;
1322   if (!arg_a)
1323     {
1324       in.class = CLASS_ZERO;
1325     }
1326   else
1327     {
1328       USItype uarg;
1329       int shift;
1330       in.normal_exp = FRACBITS + NGARDS;
1331       if (in.sign) 
1332         {
1333           /* Special case for minint, since there is no +ve integer
1334              representation for it */
1335           if (arg_a == (- MAX_SI_INT - 1))
1336             {
1337               return (FLO_type)(- MAX_SI_INT - 1);
1338             }
1339           uarg = (-arg_a);
1340         }
1341       else
1342         uarg = arg_a;
1343
1344       in.fraction.ll = uarg;
1345       shift = clzusi (uarg) - (BITS_PER_SI - 1 - FRACBITS - NGARDS);
1346       if (shift > 0)
1347         {
1348           in.fraction.ll <<= shift;
1349           in.normal_exp -= shift;
1350         }
1351     }
1352   return pack_d (&in);
1353 }
1354 #endif /* L_si_to_sf || L_si_to_df */
1355
1356 #if defined(L_usi_to_sf) || defined(L_usi_to_df) || defined(L_usi_to_tf)
1357 FLO_type
1358 usi_to_float (USItype arg_a)
1359 {
1360   fp_number_type in;
1361
1362   in.sign = 0;
1363   if (!arg_a)
1364     {
1365       in.class = CLASS_ZERO;
1366     }
1367   else
1368     {
1369       int shift;
1370       in.class = CLASS_NUMBER;
1371       in.normal_exp = FRACBITS + NGARDS;
1372       in.fraction.ll = arg_a;
1373
1374       shift = clzusi (arg_a) - (BITS_PER_SI - 1 - FRACBITS - NGARDS);
1375       if (shift < 0)
1376         {
1377           fractype guard = in.fraction.ll & (((fractype)1 << -shift) - 1);
1378           in.fraction.ll >>= -shift;
1379           in.fraction.ll |= (guard != 0);
1380           in.normal_exp -= shift;
1381         }
1382       else if (shift > 0)
1383         {
1384           in.fraction.ll <<= shift;
1385           in.normal_exp -= shift;
1386         }
1387     }
1388   return pack_d (&in);
1389 }
1390 #endif
1391
1392 #if defined(L_sf_to_si) || defined(L_df_to_si) || defined(L_tf_to_si)
1393 SItype
1394 float_to_si (FLO_type arg_a)
1395 {
1396   fp_number_type a;
1397   SItype tmp;
1398   FLO_union_type au;
1399
1400   au.value = arg_a;
1401   unpack_d (&au, &a);
1402
1403   if (iszero (&a))
1404     return 0;
1405   if (isnan (&a))
1406     return 0;
1407   /* get reasonable MAX_SI_INT...  */
1408   if (isinf (&a))
1409     return a.sign ? (-MAX_SI_INT)-1 : MAX_SI_INT;
1410   /* it is a number, but a small one */
1411   if (a.normal_exp < 0)
1412     return 0;
1413   if (a.normal_exp > BITS_PER_SI - 2)
1414     return a.sign ? (-MAX_SI_INT)-1 : MAX_SI_INT;
1415   tmp = a.fraction.ll >> ((FRACBITS + NGARDS) - a.normal_exp);
1416   return a.sign ? (-tmp) : (tmp);
1417 }
1418 #endif /* L_sf_to_si || L_df_to_si */
1419
1420 #if defined(L_tf_to_usi)
1421 USItype
1422 float_to_usi (FLO_type arg_a)
1423 {
1424   fp_number_type a;
1425   FLO_union_type au;
1426
1427   au.value = arg_a;
1428   unpack_d (&au, &a);
1429
1430   if (iszero (&a))
1431     return 0;
1432   if (isnan (&a))
1433     return 0;
1434   /* it is a negative number */
1435   if (a.sign)
1436     return 0;
1437   /* get reasonable MAX_USI_INT...  */
1438   if (isinf (&a))
1439     return MAX_USI_INT;
1440   /* it is a number, but a small one */
1441   if (a.normal_exp < 0)
1442     return 0;
1443   if (a.normal_exp > BITS_PER_SI - 1)
1444     return MAX_USI_INT;
1445   else if (a.normal_exp > (FRACBITS + NGARDS))
1446     return a.fraction.ll << (a.normal_exp - (FRACBITS + NGARDS));
1447   else
1448     return a.fraction.ll >> ((FRACBITS + NGARDS) - a.normal_exp);
1449 }
1450 #endif /* L_tf_to_usi */
1451
1452 #if defined(L_negate_sf) || defined(L_negate_df) || defined(L_negate_tf)
1453 FLO_type
1454 negate (FLO_type arg_a)
1455 {
1456   fp_number_type a;
1457   FLO_union_type au;
1458
1459   au.value = arg_a;
1460   unpack_d (&au, &a);
1461
1462   flip_sign (&a);
1463   return pack_d (&a);
1464 }
1465 #endif /* L_negate_sf || L_negate_df */
1466
1467 #ifdef FLOAT
1468
1469 #if defined(L_make_sf)
1470 SFtype
1471 __make_fp(fp_class_type class,
1472              unsigned int sign,
1473              int exp, 
1474              USItype frac)
1475 {
1476   fp_number_type in;
1477
1478   in.class = class;
1479   in.sign = sign;
1480   in.normal_exp = exp;
1481   in.fraction.ll = frac;
1482   return pack_d (&in);
1483 }
1484 #endif /* L_make_sf */
1485
1486 #ifndef FLOAT_ONLY
1487
1488 /* This enables one to build an fp library that supports float but not double.
1489    Otherwise, we would get an undefined reference to __make_dp.
1490    This is needed for some 8-bit ports that can't handle well values that
1491    are 8-bytes in size, so we just don't support double for them at all.  */
1492
1493 #if defined(L_sf_to_df)
1494 DFtype
1495 sf_to_df (SFtype arg_a)
1496 {
1497   fp_number_type in;
1498   FLO_union_type au;
1499
1500   au.value = arg_a;
1501   unpack_d (&au, &in);
1502
1503   return __make_dp (in.class, in.sign, in.normal_exp,
1504                     ((UDItype) in.fraction.ll) << F_D_BITOFF);
1505 }
1506 #endif /* L_sf_to_df */
1507
1508 #if defined(L_sf_to_tf) && defined(TMODES)
1509 TFtype
1510 sf_to_tf (SFtype arg_a)
1511 {
1512   fp_number_type in;
1513   FLO_union_type au;
1514
1515   au.value = arg_a;
1516   unpack_d (&au, &in);
1517
1518   return __make_tp (in.class, in.sign, in.normal_exp,
1519                     ((UTItype) in.fraction.ll) << F_T_BITOFF);
1520 }
1521 #endif /* L_sf_to_df */
1522
1523 #endif /* ! FLOAT_ONLY */
1524 #endif /* FLOAT */
1525
1526 #ifndef FLOAT
1527
1528 extern SFtype __make_fp (fp_class_type, unsigned int, int, USItype);
1529
1530 #if defined(L_make_df)
1531 DFtype
1532 __make_dp (fp_class_type class, unsigned int sign, int exp, UDItype frac)
1533 {
1534   fp_number_type in;
1535
1536   in.class = class;
1537   in.sign = sign;
1538   in.normal_exp = exp;
1539   in.fraction.ll = frac;
1540   return pack_d (&in);
1541 }
1542 #endif /* L_make_df */
1543
1544 #if defined(L_df_to_sf)
1545 SFtype
1546 df_to_sf (DFtype arg_a)
1547 {
1548   fp_number_type in;
1549   USItype sffrac;
1550   FLO_union_type au;
1551
1552   au.value = arg_a;
1553   unpack_d (&au, &in);
1554
1555   sffrac = in.fraction.ll >> F_D_BITOFF;
1556
1557   /* We set the lowest guard bit in SFFRAC if we discarded any non
1558      zero bits.  */
1559   if ((in.fraction.ll & (((USItype) 1 << F_D_BITOFF) - 1)) != 0)
1560     sffrac |= 1;
1561
1562   return __make_fp (in.class, in.sign, in.normal_exp, sffrac);
1563 }
1564 #endif /* L_df_to_sf */
1565
1566 #if defined(L_df_to_tf) && defined(TMODES) \
1567     && !defined(FLOAT) && !defined(TFLOAT)
1568 TFtype
1569 df_to_tf (DFtype arg_a)
1570 {
1571   fp_number_type in;
1572   FLO_union_type au;
1573
1574   au.value = arg_a;
1575   unpack_d (&au, &in);
1576
1577   return __make_tp (in.class, in.sign, in.normal_exp,
1578                     ((UTItype) in.fraction.ll) << D_T_BITOFF);
1579 }
1580 #endif /* L_sf_to_df */
1581
1582 #ifdef TFLOAT
1583 #if defined(L_make_tf)
1584 TFtype
1585 __make_tp(fp_class_type class,
1586              unsigned int sign,
1587              int exp, 
1588              UTItype frac)
1589 {
1590   fp_number_type in;
1591
1592   in.class = class;
1593   in.sign = sign;
1594   in.normal_exp = exp;
1595   in.fraction.ll = frac;
1596   return pack_d (&in);
1597 }
1598 #endif /* L_make_tf */
1599
1600 #if defined(L_tf_to_df)
1601 DFtype
1602 tf_to_df (TFtype arg_a)
1603 {
1604   fp_number_type in;
1605   UDItype sffrac;
1606   FLO_union_type au;
1607
1608   au.value = arg_a;
1609   unpack_d (&au, &in);
1610
1611   sffrac = in.fraction.ll >> D_T_BITOFF;
1612
1613   /* We set the lowest guard bit in SFFRAC if we discarded any non
1614      zero bits.  */
1615   if ((in.fraction.ll & (((UTItype) 1 << D_T_BITOFF) - 1)) != 0)
1616     sffrac |= 1;
1617
1618   return __make_dp (in.class, in.sign, in.normal_exp, sffrac);
1619 }
1620 #endif /* L_tf_to_df */
1621
1622 #if defined(L_tf_to_sf)
1623 SFtype
1624 tf_to_sf (TFtype arg_a)
1625 {
1626   fp_number_type in;
1627   USItype sffrac;
1628   FLO_union_type au;
1629
1630   au.value = arg_a;
1631   unpack_d (&au, &in);
1632
1633   sffrac = in.fraction.ll >> F_T_BITOFF;
1634
1635   /* We set the lowest guard bit in SFFRAC if we discarded any non
1636      zero bits.  */
1637   if ((in.fraction.ll & (((UTItype) 1 << F_T_BITOFF) - 1)) != 0)
1638     sffrac |= 1;
1639
1640   return __make_fp (in.class, in.sign, in.normal_exp, sffrac);
1641 }
1642 #endif /* L_tf_to_sf */
1643 #endif /* TFLOAT */
1644
1645 #endif /* ! FLOAT */
1646 #endif /* !EXTENDED_FLOAT_STUBS */