OSDN Git Service

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