source: trunk/third/gcc/config/fp-bit.c @ 8834

Revision 8834, 28.8 KB checked in by ghudson, 28 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r8833, which included commits to RCS files with non-trunk default branches.
Line 
1/* This is a software floating point library which can be used instead of
2   the floating point routines in libgcc1.c for targets without hardware
3   floating point.  */
4
5/* Copyright (C) 1994, 1995 Free Software Foundation, Inc.
6
7This file is free software; you can redistribute it and/or modify it
8under the terms of the GNU General Public License as published by the
9Free Software Foundation; either version 2, or (at your option) any
10later version.
11
12In addition to the permissions in the GNU General Public License, the
13Free Software Foundation gives you unlimited permission to link the
14compiled version of this file with other programs, and to distribute
15those programs without any restriction coming from the use of this
16file.  (The General Public License restrictions do apply in other
17respects; for example, they cover modification of the file, and
18distribution when not linked into another program.)
19
20This file is distributed in the hope that it will be useful, but
21WITHOUT ANY WARRANTY; without even the implied warranty of
22MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
23General Public License for more details.
24
25You should have received a copy of the GNU General Public License
26along with this program; see the file COPYING.  If not, write to
27the Free Software Foundation, 59 Temple Place - Suite 330,
28Boston, MA 02111-1307, USA.  */
29
30/* As a special exception, if you link this library with other files,
31   some of which are compiled with GCC, to produce an executable,
32   this library does not by itself cause the resulting executable
33   to be covered by the GNU General Public License.
34   This exception does not however invalidate any other reasons why
35   the executable file might be covered by the GNU General Public License.  */
36
37/* This implements IEEE 754 format arithmetic, but does not provide a
38   mechanism for setting the rounding mode, or for generating or handling
39   exceptions.
40
41   The original code by Steve Chamberlain, hacked by Mark Eichin and Jim
42   Wilson, all of Cygnus Support.  */
43
44/* The intended way to use this file is to make two copies, add `#define FLOAT'
45   to one copy, then compile both copies and add them to libgcc.a.  */
46
47/* The following macros can be defined to change the behaviour of this file:
48   FLOAT: Implement a `float', aka SFmode, fp library.  If this is not
49     defined, then this file implements a `double', aka DFmode, fp library.
50   FLOAT_ONLY: Used with FLOAT, to implement a `float' only library, i.e.
51     don't include float->double conversion which requires the double library.
52     This is useful only for machines which can't support doubles, e.g. some
53     8-bit processors.
54   CMPtype: Specify the type that floating point compares should return.
55     This defaults to SItype, aka int.
56   US_SOFTWARE_GOFAST: This makes all entry points use the same names as the
57     US Software goFast library.  If this is not defined, the entry points use
58     the same names as libgcc1.c.
59   _DEBUG_BITFLOAT: This makes debugging the code a little easier, by adding
60     two integers to the FLO_union_type. 
61   NO_NANS: Disable nan and infinity handling
62   SMALL_MACHINE: Useful when operations on QIs and HIs are faster
63     than on an SI */
64
65typedef SFtype __attribute__ ((mode (SF)));
66typedef DFtype __attribute__ ((mode (DF)));
67
68typedef int HItype __attribute__ ((mode (HI)));
69typedef int SItype __attribute__ ((mode (SI)));
70typedef int DItype __attribute__ ((mode (DI)));
71
72/* The type of the result of a fp compare */
73#ifndef CMPtype
74#define CMPtype SItype
75#endif
76
77typedef unsigned int UHItype __attribute__ ((mode (HI)));
78typedef unsigned int USItype __attribute__ ((mode (SI)));
79typedef unsigned int UDItype __attribute__ ((mode (DI)));
80
81#define MAX_SI_INT   ((SItype) ((unsigned) (~0)>>1))
82#define MAX_USI_INT  ((USItype) ~0)
83
84
85#ifdef FLOAT_ONLY
86#define NO_DI_MODE
87#endif
88
89#ifdef FLOAT
90#       define NGARDS    7L
91#       define GARDROUND 0x3f
92#       define GARDMASK  0x7f
93#       define GARDMSB   0x40
94#       define EXPBITS 8
95#       define EXPBIAS 127
96#       define FRACBITS 23
97#       define EXPMAX (0xff)
98#       define QUIET_NAN 0x100000L
99#       define FRAC_NBITS 32
100#       define FRACHIGH  0x80000000L
101#       define FRACHIGH2 0xc0000000L
102#       define pack_d pack_f
103#       define unpack_d unpack_f
104        typedef USItype fractype;
105        typedef UHItype halffractype;
106        typedef SFtype FLO_type;
107        typedef SItype intfrac;
108
109#else
110#       define PREFIXFPDP dp
111#       define PREFIXSFDF df
112#       define NGARDS 8L
113#       define GARDROUND 0x7f
114#       define GARDMASK  0xff
115#       define GARDMSB   0x80
116#       define EXPBITS 11
117#       define EXPBIAS 1023
118#       define FRACBITS 52
119#       define EXPMAX (0x7ff)
120#       define QUIET_NAN 0x8000000000000LL
121#       define FRAC_NBITS 64
122#       define FRACHIGH  0x8000000000000000LL
123#       define FRACHIGH2 0xc000000000000000LL
124        typedef UDItype fractype;
125        typedef USItype halffractype;
126        typedef DFtype FLO_type;
127        typedef DItype intfrac;
128#endif
129
130#ifdef US_SOFTWARE_GOFAST
131#       ifdef FLOAT
132#               define add              fpadd
133#               define sub              fpsub
134#               define multiply         fpmul
135#               define divide           fpdiv
136#               define compare          fpcmp
137#               define si_to_float      sitofp
138#               define float_to_si      fptosi
139#               define float_to_usi     fptoui
140#               define negate           __negsf2
141#               define sf_to_df         fptodp
142#               define dptofp           dptofp
143#else
144#               define add              dpadd
145#               define sub              dpsub
146#               define multiply         dpmul
147#               define divide           dpdiv
148#               define compare          dpcmp
149#               define si_to_float      litodp
150#               define float_to_si      dptoli
151#               define float_to_usi     dptoul
152#               define negate           __negdf2
153#               define df_to_sf         dptofp
154#endif
155#else
156#       ifdef FLOAT
157#               define add              __addsf3
158#               define sub              __subsf3
159#               define multiply         __mulsf3
160#               define divide           __divsf3
161#               define compare          __cmpsf2
162#               define _eq_f2           __eqsf2
163#               define _ne_f2           __nesf2
164#               define _gt_f2           __gtsf2
165#               define _ge_f2           __gesf2
166#               define _lt_f2           __ltsf2
167#               define _le_f2           __lesf2
168#               define si_to_float      __floatsisf
169#               define float_to_si      __fixsfsi
170#               define float_to_usi     __fixunssfsi
171#               define negate           __negsf2
172#               define sf_to_df         __extendsfdf2
173#else
174#               define add              __adddf3
175#               define sub              __subdf3
176#               define multiply         __muldf3
177#               define divide           __divdf3
178#               define compare          __cmpdf2
179#               define _eq_f2           __eqdf2
180#               define _ne_f2           __nedf2
181#               define _gt_f2           __gtdf2
182#               define _ge_f2           __gedf2
183#               define _lt_f2           __ltdf2
184#               define _le_f2           __ledf2
185#               define si_to_float      __floatsidf
186#               define float_to_si      __fixdfsi
187#               define float_to_usi     __fixunsdfsi
188#               define negate           __negdf2
189#               define df_to_sf         __truncdfsf2
190#       endif
191#endif
192
193
194#define INLINE __inline__
195
196/* Preserve the sticky-bit when shifting fractions to the right.  */
197#define LSHIFT(a) { a = (a & 1) | (a >> 1); }
198
199/* numeric parameters */
200/* F_D_BITOFF is the number of bits offset between the MSB of the mantissa
201   of a float and of a double. Assumes there are only two float types.
202   (double::FRAC_BITS+double::NGARGS-(float::FRAC_BITS-float::NGARDS))
203 */
204#define F_D_BITOFF (52+8-(23+7))
205
206
207#define NORMAL_EXPMIN (-(EXPBIAS)+1)
208#define IMPLICIT_1 (1LL<<(FRACBITS+NGARDS))
209#define IMPLICIT_2 (1LL<<(FRACBITS+1+NGARDS))
210
211/* common types */
212
213typedef enum
214{
215  CLASS_SNAN,
216  CLASS_QNAN,
217  CLASS_ZERO,
218  CLASS_NUMBER,
219  CLASS_INFINITY
220} fp_class_type;
221
222typedef struct
223{
224#ifdef SMALL_MACHINE
225  char class;
226  unsigned char sign;
227  short normal_exp;
228#else
229  fp_class_type class;
230  unsigned int sign;
231  int normal_exp;
232#endif
233
234  union
235    {
236      fractype ll;
237      halffractype l[2];
238    } fraction;
239} fp_number_type;
240
241typedef union
242{
243  FLO_type value;
244  fractype value_raw;
245
246#ifndef FLOAT
247  halffractype words[2];
248#endif
249
250#ifdef FLOAT_BIT_ORDER_MISMATCH
251  struct
252    {
253      fractype fraction:FRACBITS __attribute__ ((packed));
254      unsigned int exp:EXPBITS __attribute__ ((packed));
255      unsigned int sign:1 __attribute__ ((packed));
256    }
257  bits;
258#endif
259
260#ifdef _DEBUG_BITFLOAT
261  struct
262    {
263      unsigned int sign:1 __attribute__ ((packed));
264      unsigned int exp:EXPBITS __attribute__ ((packed));
265      fractype fraction:FRACBITS __attribute__ ((packed));
266    }
267  bits_big_endian;
268
269  struct
270    {
271      fractype fraction:FRACBITS __attribute__ ((packed));
272      unsigned int exp:EXPBITS __attribute__ ((packed));
273      unsigned int sign:1 __attribute__ ((packed));
274    }
275  bits_little_endian;
276#endif
277}
278FLO_union_type;
279
280
281/* end of header */
282
283/* IEEE "special" number predicates */
284
285#ifdef NO_NANS
286
287#define nan() 0
288#define isnan(x) 0
289#define isinf(x) 0
290#else
291
292INLINE
293static fp_number_type *
294nan ()
295{
296  static fp_number_type thenan;
297
298  return &thenan;
299}
300
301INLINE
302static int
303isnan ( fp_number_type *  x)
304{
305  return x->class == CLASS_SNAN || x->class == CLASS_QNAN;
306}
307
308INLINE
309static int
310isinf ( fp_number_type *  x)
311{
312  return x->class == CLASS_INFINITY;
313}
314
315#endif
316
317INLINE
318static int
319iszero ( fp_number_type *  x)
320{
321  return x->class == CLASS_ZERO;
322}
323
324INLINE
325static void
326flip_sign ( fp_number_type *  x)
327{
328  x->sign = !x->sign;
329}
330
331static FLO_type
332pack_d ( fp_number_type *  src)
333{
334  FLO_union_type dst;
335  fractype fraction = src->fraction.ll; /* wasn't unsigned before? */
336  int sign = src->sign;
337  int exp = 0;
338
339  if (isnan (src))
340    {
341      exp = EXPMAX;
342      if (src->class == CLASS_QNAN || 1)
343        {
344          fraction |= QUIET_NAN;
345        }
346    }
347  else if (isinf (src))
348    {
349      exp = EXPMAX;
350      fraction = 0;
351    }
352  else if (iszero (src))
353    {
354      exp = 0;
355      fraction = 0;
356    }
357  else if (fraction == 0)
358    {
359      exp = 0;
360      sign = 0;
361    }
362  else
363    {
364      if (src->normal_exp < NORMAL_EXPMIN)
365        {
366          /* This number's exponent is too low to fit into the bits
367             available in the number, so we'll store 0 in the exponent and
368             shift the fraction to the right to make up for it.  */
369
370          int shift = NORMAL_EXPMIN - src->normal_exp;
371
372          exp = 0;
373
374          if (shift > FRAC_NBITS - NGARDS)
375            {
376              /* No point shifting, since it's more that 64 out.  */
377              fraction = 0;
378            }
379          else
380            {
381              /* Shift by the value */
382              fraction >>= shift;
383            }
384          fraction >>= NGARDS;
385        }
386      else if (src->normal_exp > EXPBIAS)
387        {
388          exp = EXPMAX;
389          fraction = 0;
390        }
391      else
392        {
393          exp = src->normal_exp + EXPBIAS;
394          /* IF the gard bits are the all zero, but the first, then we're
395             half way between two numbers, choose the one which makes the
396             lsb of the answer 0.  */
397          if ((fraction & GARDMASK) == GARDMSB)
398            {
399              if (fraction & (1 << NGARDS))
400                fraction += GARDROUND + 1;
401            }
402          else
403            {
404              /* Add a one to the guards to round up */
405              fraction += GARDROUND;
406            }
407          if (fraction >= IMPLICIT_2)
408            {
409              fraction >>= 1;
410              exp += 1;
411            }
412          fraction >>= NGARDS;
413        }
414    }
415
416  /* We previously used bitfields to store the number, but this doesn't
417     handle little/big endian systems conviently, so use shifts and
418     masks */
419#ifdef FLOAT_BIT_ORDER_MISMATCH
420  dst.bits.fraction = fraction;
421  dst.bits.exp = exp;
422  dst.bits.sign = sign;
423#else
424  dst.value_raw = fraction & ((((fractype)1) << FRACBITS) - (fractype)1);
425  dst.value_raw |= ((fractype) (exp & ((1 << EXPBITS) - 1))) << FRACBITS;
426  dst.value_raw |= ((fractype) (sign & 1)) << (FRACBITS | EXPBITS);
427#endif
428
429#if defined(FLOAT_WORD_ORDER_MISMATCH) && !defined(FLOAT)
430  {
431    halffractype tmp = dst.words[0];
432    dst.words[0] = dst.words[1];
433    dst.words[1] = tmp;
434  }
435#endif
436
437  return dst.value;
438}
439
440static void
441unpack_d (FLO_union_type * src, fp_number_type * dst)
442{
443  /* We previously used bitfields to store the number, but this doesn't
444     handle little/big endian systems conviently, so use shifts and
445     masks */
446  fractype fraction;
447  int exp;
448  int sign;
449
450#if defined(FLOAT_WORD_ORDER_MISMATCH) && !defined(FLOAT)
451  FLO_union_type swapped;
452
453  swapped.words[0] = src->words[1];
454  swapped.words[1] = src->words[0];
455  src = &swapped;
456#endif
457 
458#ifdef FLOAT_BIT_ORDER_MISMATCH
459  fraction = src->bits.fraction;
460  exp = src->bits.exp;
461  sign = src->bits.sign;
462#else
463  fraction = src->value_raw & ((((fractype)1) << FRACBITS) - (fractype)1);
464  exp = ((int)(src->value_raw >> FRACBITS)) & ((1 << EXPBITS) - 1);
465  sign = ((int)(src->value_raw >> (FRACBITS + EXPBITS))) & 1;
466#endif
467
468  dst->sign = sign;
469  if (exp == 0)
470    {
471      /* Hmm.  Looks like 0 */
472      if (fraction == 0)
473        {
474          /* tastes like zero */
475          dst->class = CLASS_ZERO;
476        }
477      else
478        {
479          /* Zero exponent with non zero fraction - it's denormalized,
480             so there isn't a leading implicit one - we'll shift it so
481             it gets one.  */
482          dst->normal_exp = exp - EXPBIAS + 1;
483          fraction <<= NGARDS;
484
485          dst->class = CLASS_NUMBER;
486#if 1
487          while (fraction < IMPLICIT_1)
488            {
489              fraction <<= 1;
490              dst->normal_exp--;
491            }
492#endif
493          dst->fraction.ll = fraction;
494        }
495    }
496  else if (exp == EXPMAX)
497    {
498      /* Huge exponent*/
499      if (fraction == 0)
500        {
501          /* Attached to a zero fraction - means infinity */
502          dst->class = CLASS_INFINITY;
503        }
504      else
505        {
506          /* Non zero fraction, means nan */
507          if (sign)
508            {
509              dst->class = CLASS_SNAN;
510            }
511          else
512            {
513              dst->class = CLASS_QNAN;
514            }
515          /* Keep the fraction part as the nan number */
516          dst->fraction.ll = fraction;
517        }
518    }
519  else
520    {
521      /* Nothing strange about this number */
522      dst->normal_exp = exp - EXPBIAS;
523      dst->class = CLASS_NUMBER;
524      dst->fraction.ll = (fraction << NGARDS) | IMPLICIT_1;
525    }
526}
527
528static fp_number_type *
529_fpadd_parts (fp_number_type * a,
530              fp_number_type * b,
531              fp_number_type * tmp)
532{
533  intfrac tfraction;
534
535  /* Put commonly used fields in local variables.  */
536  int a_normal_exp;
537  int b_normal_exp;
538  fractype a_fraction;
539  fractype b_fraction;
540
541  if (isnan (a))
542    {
543      return a;
544    }
545  if (isnan (b))
546    {
547      return b;
548    }
549  if (isinf (a))
550    {
551      /* Adding infinities with opposite signs yields a NaN.  */
552      if (isinf (b) && a->sign != b->sign)
553        return nan ();
554      return a;
555    }
556  if (isinf (b))
557    {
558      return b;
559    }
560  if (iszero (b))
561    {
562      return a;
563    }
564  if (iszero (a))
565    {
566      return b;
567    }
568
569  /* Got two numbers. shift the smaller and increment the exponent till
570     they're the same */
571  {
572    int diff;
573
574    a_normal_exp = a->normal_exp;
575    b_normal_exp = b->normal_exp;
576    a_fraction = a->fraction.ll;
577    b_fraction = b->fraction.ll;
578
579    diff = a_normal_exp - b_normal_exp;
580
581    if (diff < 0)
582      diff = -diff;
583    if (diff < FRAC_NBITS)
584      {
585        /* ??? This does shifts one bit at a time.  Optimize.  */
586        while (a_normal_exp > b_normal_exp)
587          {
588            b_normal_exp++;
589            LSHIFT (b_fraction);
590          }
591        while (b_normal_exp > a_normal_exp)
592          {
593            a_normal_exp++;
594            LSHIFT (a_fraction);
595          }
596      }
597    else
598      {
599        /* Somethings's up.. choose the biggest */
600        if (a_normal_exp > b_normal_exp)
601          {
602            b_normal_exp = a_normal_exp;
603            b_fraction = 0;
604          }
605        else
606          {
607            a_normal_exp = b_normal_exp;
608            a_fraction = 0;
609          }
610      }
611  }
612
613  if (a->sign != b->sign)
614    {
615      if (a->sign)
616        {
617          tfraction = -a_fraction + b_fraction;
618        }
619      else
620        {
621          tfraction = a_fraction - b_fraction;
622        }
623      if (tfraction > 0)
624        {
625          tmp->sign = 0;
626          tmp->normal_exp = a_normal_exp;
627          tmp->fraction.ll = tfraction;
628        }
629      else
630        {
631          tmp->sign = 1;
632          tmp->normal_exp = a_normal_exp;
633          tmp->fraction.ll = -tfraction;
634        }
635      /* and renormalize it */
636
637      while (tmp->fraction.ll < IMPLICIT_1 && tmp->fraction.ll)
638        {
639          tmp->fraction.ll <<= 1;
640          tmp->normal_exp--;
641        }
642    }
643  else
644    {
645      tmp->sign = a->sign;
646      tmp->normal_exp = a_normal_exp;
647      tmp->fraction.ll = a_fraction + b_fraction;
648    }
649  tmp->class = CLASS_NUMBER;
650  /* Now the fraction is added, we have to shift down to renormalize the
651     number */
652
653  if (tmp->fraction.ll >= IMPLICIT_2)
654    {
655      LSHIFT (tmp->fraction.ll);
656      tmp->normal_exp++;
657    }
658  return tmp;
659
660}
661
662FLO_type
663add (FLO_type arg_a, FLO_type arg_b)
664{
665  fp_number_type a;
666  fp_number_type b;
667  fp_number_type tmp;
668  fp_number_type *res;
669
670  unpack_d ((FLO_union_type *) & arg_a, &a);
671  unpack_d ((FLO_union_type *) & arg_b, &b);
672
673  res = _fpadd_parts (&a, &b, &tmp);
674
675  return pack_d (res);
676}
677
678FLO_type
679sub (FLO_type arg_a, FLO_type arg_b)
680{
681  fp_number_type a;
682  fp_number_type b;
683  fp_number_type tmp;
684  fp_number_type *res;
685
686  unpack_d ((FLO_union_type *) & arg_a, &a);
687  unpack_d ((FLO_union_type *) & arg_b, &b);
688
689  b.sign ^= 1;
690
691  res = _fpadd_parts (&a, &b, &tmp);
692
693  return pack_d (res);
694}
695
696static fp_number_type *
697_fpmul_parts ( fp_number_type *  a,
698               fp_number_type *  b,
699               fp_number_type * tmp)
700{
701  fractype low = 0;
702  fractype high = 0;
703
704  if (isnan (a))
705    {
706      a->sign = a->sign != b->sign;
707      return a;
708    }
709  if (isnan (b))
710    {
711      b->sign = a->sign != b->sign;
712      return b;
713    }
714  if (isinf (a))
715    {
716      if (iszero (b))
717        return nan ();
718      a->sign = a->sign != b->sign;
719      return a;
720    }
721  if (isinf (b))
722    {
723      if (iszero (a))
724        {
725          return nan ();
726        }
727      b->sign = a->sign != b->sign;
728      return b;
729    }
730  if (iszero (a))
731    {
732      a->sign = a->sign != b->sign;
733      return a;
734    }
735  if (iszero (b))
736    {
737      b->sign = a->sign != b->sign;
738      return b;
739    }
740
741  /* Calculate the mantissa by multiplying both 64bit numbers to get a
742     128 bit number */
743  {
744    fractype x = a->fraction.ll;
745    fractype ylow = b->fraction.ll;
746    fractype yhigh = 0;
747    int bit;
748
749#if defined(NO_DI_MODE)
750    {
751      /* ??? This does multiplies one bit at a time.  Optimize.  */
752      for (bit = 0; bit < FRAC_NBITS; bit++)
753        {
754          int carry;
755
756          if (x & 1)
757            {
758              carry = (low += ylow) < ylow;
759              high += yhigh + carry;
760            }
761          yhigh <<= 1;
762          if (ylow & FRACHIGH)
763            {
764              yhigh |= 1;
765            }
766          ylow <<= 1;
767          x >>= 1;
768        }
769    }
770#elif defined(FLOAT)
771    {
772      /* Multiplying two 32 bit numbers to get a 64 bit number  on
773        a machine with DI, so we're safe */
774
775      DItype answer = (DItype)(a->fraction.ll) * (DItype)(b->fraction.ll);
776     
777      high = answer >> 32;
778      low = answer;
779    }
780#else
781    /* Doing a 64*64 to 128 */
782    {
783      UDItype nl = a->fraction.ll & 0xffffffff;
784      UDItype nh = a->fraction.ll >> 32;
785      UDItype ml = b->fraction.ll & 0xffffffff;
786      UDItype mh = b->fraction.ll >>32;
787      UDItype pp_ll = ml * nl;
788      UDItype pp_hl = mh * nl;
789      UDItype pp_lh = ml * nh;
790      UDItype pp_hh = mh * nh;
791      UDItype res2 = 0;
792      UDItype res0 = 0;
793      UDItype ps_hh__ = pp_hl + pp_lh;
794      if (ps_hh__ < pp_hl)
795        res2 += 0x100000000LL;
796      pp_hl = (ps_hh__ << 32) & 0xffffffff00000000LL;
797      res0 = pp_ll + pp_hl;
798      if (res0 < pp_ll)
799        res2++;
800      res2 += ((ps_hh__ >> 32) & 0xffffffffL) + pp_hh;
801      high = res2;
802      low = res0;
803    }
804#endif
805  }
806
807  tmp->normal_exp = a->normal_exp + b->normal_exp;
808  tmp->sign = a->sign != b->sign;
809#ifdef FLOAT
810  tmp->normal_exp += 2;         /* ??????????????? */
811#else
812  tmp->normal_exp += 4;         /* ??????????????? */
813#endif
814  while (high >= IMPLICIT_2)
815    {
816      tmp->normal_exp++;
817      if (high & 1)
818        {
819          low >>= 1;
820          low |= FRACHIGH;
821        }
822      high >>= 1;
823    }
824  while (high < IMPLICIT_1)
825    {
826      tmp->normal_exp--;
827
828      high <<= 1;
829      if (low & FRACHIGH)
830        high |= 1;
831      low <<= 1;
832    }
833  /* rounding is tricky. if we only round if it won't make us round later. */
834#if 0
835  if (low & FRACHIGH2)
836    {
837      if (((high & GARDMASK) != GARDMSB)
838          && (((high + 1) & GARDMASK) == GARDMSB))
839        {
840          /* don't round, it gets done again later. */
841        }
842      else
843        {
844          high++;
845        }
846    }
847#endif
848  if ((high & GARDMASK) == GARDMSB)
849    {
850      if (high & (1 << NGARDS))
851        {
852          /* half way, so round to even */
853          high += GARDROUND + 1;
854        }
855      else if (low)
856        {
857          /* but we really weren't half way */
858          high += GARDROUND + 1;
859        }
860    }
861  tmp->fraction.ll = high;
862  tmp->class = CLASS_NUMBER;
863  return tmp;
864}
865
866FLO_type
867multiply (FLO_type arg_a, FLO_type arg_b)
868{
869  fp_number_type a;
870  fp_number_type b;
871  fp_number_type tmp;
872  fp_number_type *res;
873
874  unpack_d ((FLO_union_type *) & arg_a, &a);
875  unpack_d ((FLO_union_type *) & arg_b, &b);
876
877  res = _fpmul_parts (&a, &b, &tmp);
878
879  return pack_d (res);
880}
881
882static fp_number_type *
883_fpdiv_parts (fp_number_type * a,
884              fp_number_type * b,
885              fp_number_type * tmp)
886{
887  fractype low = 0;
888  fractype high = 0;
889  fractype r0, r1, y0, y1, bit;
890  fractype q;
891  fractype numerator;
892  fractype denominator;
893  fractype quotient;
894  fractype remainder;
895
896  if (isnan (a))
897    {
898      return a;
899    }
900  if (isnan (b))
901    {
902      return b;
903    }
904  if (isinf (a) || iszero (a))
905    {
906      if (a->class == b->class)
907        return nan ();
908      return a;
909    }
910  a->sign = a->sign ^ b->sign;
911
912  if (isinf (b))
913    {
914      a->fraction.ll = 0;
915      a->normal_exp = 0;
916      return a;
917    }
918  if (iszero (b))
919    {
920      a->class = CLASS_INFINITY;
921      return b;
922    }
923
924  /* Calculate the mantissa by multiplying both 64bit numbers to get a
925     128 bit number */
926  {
927    int carry;
928    intfrac d0, d1;             /* weren't unsigned before ??? */
929
930    /* quotient =
931       ( numerator / denominator) * 2^(numerator exponent -  denominator exponent)
932     */
933
934    a->normal_exp = a->normal_exp - b->normal_exp;
935    numerator = a->fraction.ll;
936    denominator = b->fraction.ll;
937
938    if (numerator < denominator)
939      {
940        /* Fraction will be less than 1.0 */
941        numerator *= 2;
942        a->normal_exp--;
943      }
944    bit = IMPLICIT_1;
945    quotient = 0;
946    /* ??? Does divide one bit at a time.  Optimize.  */
947    while (bit)
948      {
949        if (numerator >= denominator)
950          {
951            quotient |= bit;
952            numerator -= denominator;
953          }
954        bit >>= 1;
955        numerator *= 2;
956      }
957
958    if ((quotient & GARDMASK) == GARDMSB)
959      {
960        if (quotient & (1 << NGARDS))
961          {
962            /* half way, so round to even */
963            quotient += GARDROUND + 1;
964          }
965        else if (numerator)
966          {
967            /* but we really weren't half way, more bits exist */
968            quotient += GARDROUND + 1;
969          }
970      }
971
972    a->fraction.ll = quotient;
973    return (a);
974  }
975}
976
977FLO_type
978divide (FLO_type arg_a, FLO_type arg_b)
979{
980  fp_number_type a;
981  fp_number_type b;
982  fp_number_type tmp;
983  fp_number_type *res;
984
985  unpack_d ((FLO_union_type *) & arg_a, &a);
986  unpack_d ((FLO_union_type *) & arg_b, &b);
987
988  res = _fpdiv_parts (&a, &b, &tmp);
989
990  return pack_d (res);
991}
992
993/* according to the demo, fpcmp returns a comparison with 0... thus
994   a<b -> -1
995   a==b -> 0
996   a>b -> +1
997 */
998
999static int
1000_fpcmp_parts (fp_number_type * a, fp_number_type * b)
1001{
1002#if 0
1003  /* either nan -> unordered. Must be checked outside of this routine. */
1004  if (isnan (a) && isnan (b))
1005    {
1006      return 1;                 /* still unordered! */
1007    }
1008#endif
1009
1010  if (isnan (a) || isnan (b))
1011    {
1012      return 1;                 /* how to indicate unordered compare? */
1013    }
1014  if (isinf (a) && isinf (b))
1015    {
1016      /* +inf > -inf, but +inf != +inf */
1017      /* b    \a| +inf(0)| -inf(1)
1018       ______\+--------+--------
1019       +inf(0)| a==b(0)| a<b(-1)
1020       -------+--------+--------
1021       -inf(1)| a>b(1) | a==b(0)
1022       -------+--------+--------
1023       So since unordered must be non zero, just line up the columns...
1024       */
1025      return b->sign - a->sign;
1026    }
1027  /* but not both... */
1028  if (isinf (a))
1029    {
1030      return a->sign ? -1 : 1;
1031    }
1032  if (isinf (b))
1033    {
1034      return b->sign ? 1 : -1;
1035    }
1036  if (iszero (a) && iszero (b))
1037    {
1038      return 0;
1039    }
1040  if (iszero (a))
1041    {
1042      return b->sign ? 1 : -1;
1043    }
1044  if (iszero (b))
1045    {
1046      return a->sign ? -1 : 1;
1047    }
1048  /* now both are "normal". */
1049  if (a->sign != b->sign)
1050    {
1051      /* opposite signs */
1052      return a->sign ? -1 : 1;
1053    }
1054  /* same sign; exponents? */
1055  if (a->normal_exp > b->normal_exp)
1056    {
1057      return a->sign ? -1 : 1;
1058    }
1059  if (a->normal_exp < b->normal_exp)
1060    {
1061      return a->sign ? 1 : -1;
1062    }
1063  /* same exponents; check size. */
1064  if (a->fraction.ll > b->fraction.ll)
1065    {
1066      return a->sign ? -1 : 1;
1067    }
1068  if (a->fraction.ll < b->fraction.ll)
1069    {
1070      return a->sign ? 1 : -1;
1071    }
1072  /* after all that, they're equal. */
1073  return 0;
1074}
1075
1076CMPtype
1077compare (FLO_type arg_a, FLO_type arg_b)
1078{
1079  fp_number_type a;
1080  fp_number_type b;
1081
1082  unpack_d ((FLO_union_type *) & arg_a, &a);
1083  unpack_d ((FLO_union_type *) & arg_b, &b);
1084
1085  return _fpcmp_parts (&a, &b);
1086}
1087
1088#ifndef US_SOFTWARE_GOFAST
1089
1090/* These should be optimized for their specific tasks someday.  */
1091
1092CMPtype
1093_eq_f2 (FLO_type arg_a, FLO_type arg_b)
1094{
1095  fp_number_type a;
1096  fp_number_type b;
1097
1098  unpack_d ((FLO_union_type *) & arg_a, &a);
1099  unpack_d ((FLO_union_type *) & arg_b, &b);
1100
1101  if (isnan (&a) || isnan (&b))
1102    return 1;                   /* false, truth == 0 */
1103
1104  return _fpcmp_parts (&a, &b) ;
1105}
1106
1107CMPtype
1108_ne_f2 (FLO_type arg_a, FLO_type arg_b)
1109{
1110  fp_number_type a;
1111  fp_number_type b;
1112
1113  unpack_d ((FLO_union_type *) & arg_a, &a);
1114  unpack_d ((FLO_union_type *) & arg_b, &b);
1115
1116  if (isnan (&a) || isnan (&b))
1117    return 1;                   /* true, truth != 0 */
1118
1119  return  _fpcmp_parts (&a, &b) ;
1120}
1121
1122CMPtype
1123_gt_f2 (FLO_type arg_a, FLO_type arg_b)
1124{
1125  fp_number_type a;
1126  fp_number_type b;
1127
1128  unpack_d ((FLO_union_type *) & arg_a, &a);
1129  unpack_d ((FLO_union_type *) & arg_b, &b);
1130
1131  if (isnan (&a) || isnan (&b))
1132    return -1;                  /* false, truth > 0 */
1133
1134  return _fpcmp_parts (&a, &b);
1135}
1136
1137CMPtype
1138_ge_f2 (FLO_type arg_a, FLO_type arg_b)
1139{
1140  fp_number_type a;
1141  fp_number_type b;
1142
1143  unpack_d ((FLO_union_type *) & arg_a, &a);
1144  unpack_d ((FLO_union_type *) & arg_b, &b);
1145
1146  if (isnan (&a) || isnan (&b))
1147    return -1;                  /* false, truth >= 0 */
1148  return _fpcmp_parts (&a, &b) ;
1149}
1150
1151CMPtype
1152_lt_f2 (FLO_type arg_a, FLO_type arg_b)
1153{
1154  fp_number_type a;
1155  fp_number_type b;
1156
1157  unpack_d ((FLO_union_type *) & arg_a, &a);
1158  unpack_d ((FLO_union_type *) & arg_b, &b);
1159
1160  if (isnan (&a) || isnan (&b))
1161    return 1;                   /* false, truth < 0 */
1162
1163  return _fpcmp_parts (&a, &b);
1164}
1165
1166CMPtype
1167_le_f2 (FLO_type arg_a, FLO_type arg_b)
1168{
1169  fp_number_type a;
1170  fp_number_type b;
1171
1172  unpack_d ((FLO_union_type *) & arg_a, &a);
1173  unpack_d ((FLO_union_type *) & arg_b, &b);
1174
1175  if (isnan (&a) || isnan (&b))
1176    return 1;                   /* false, truth <= 0 */
1177
1178  return _fpcmp_parts (&a, &b) ;
1179}
1180
1181#endif /* ! US_SOFTWARE_GOFAST */
1182
1183FLO_type
1184si_to_float (SItype arg_a)
1185{
1186  fp_number_type in;
1187
1188  in.class = CLASS_NUMBER;
1189  in.sign = arg_a < 0;
1190  if (!arg_a)
1191    {
1192      in.class = CLASS_ZERO;
1193    }
1194  else
1195    {
1196      in.normal_exp = FRACBITS + NGARDS;
1197      if (in.sign)
1198        {
1199          /* Special case for minint, since there is no +ve integer
1200             representation for it */
1201          if (arg_a == 0x80000000)
1202            {
1203              return -2147483648.0;
1204            }
1205          in.fraction.ll = (-arg_a);
1206        }
1207      else
1208        in.fraction.ll = arg_a;
1209
1210      while (in.fraction.ll < (1LL << (FRACBITS + NGARDS)))
1211        {
1212          in.fraction.ll <<= 1;
1213          in.normal_exp -= 1;
1214        }
1215    }
1216  return pack_d (&in);
1217}
1218
1219SItype
1220float_to_si (FLO_type arg_a)
1221{
1222  fp_number_type a;
1223  SItype tmp;
1224
1225  unpack_d ((FLO_union_type *) & arg_a, &a);
1226  if (iszero (&a))
1227    return 0;
1228  if (isnan (&a))
1229    return 0;
1230  /* get reasonable MAX_SI_INT... */
1231  if (isinf (&a))
1232    return a.sign ? MAX_SI_INT : (-MAX_SI_INT)-1;
1233  /* it is a number, but a small one */
1234  if (a.normal_exp < 0)
1235    return 0;
1236  if (a.normal_exp > 30)
1237    return a.sign ? (-MAX_SI_INT)-1 : MAX_SI_INT;
1238  tmp = a.fraction.ll >> ((FRACBITS + NGARDS) - a.normal_exp);
1239  return a.sign ? (-tmp) : (tmp);
1240}
1241
1242#ifdef US_SOFTWARE_GOFAST
1243/* While libgcc2.c defines its own __fixunssfsi and __fixunsdfsi routines,
1244   we also define them for GOFAST because the ones in libgcc2.c have the
1245   wrong names and I'd rather define these here and keep GOFAST CYG-LOC's
1246   out of libgcc2.c.  We can't define these here if not GOFAST because then
1247   there'd be duplicate copies.  */
1248
1249USItype
1250float_to_usi (FLO_type arg_a)
1251{
1252  fp_number_type a;
1253
1254  unpack_d ((FLO_union_type *) & arg_a, &a);
1255  if (iszero (&a))
1256    return 0;
1257  if (isnan (&a))
1258    return 0;
1259  /* get reasonable MAX_USI_INT... */
1260  if (isinf (&a))
1261    return a.sign ? MAX_USI_INT : 0;
1262  /* it is a negative number */
1263  if (a.sign)
1264    return 0;
1265  /* it is a number, but a small one */
1266  if (a.normal_exp < 0)
1267    return 0;
1268  if (a.normal_exp > 31)
1269    return MAX_USI_INT;
1270  else if (a.normal_exp > (FRACBITS + NGARDS))
1271    return a.fraction.ll << ((FRACBITS + NGARDS) - a.normal_exp);
1272  else
1273    return a.fraction.ll >> ((FRACBITS + NGARDS) - a.normal_exp);
1274}
1275#endif
1276
1277FLO_type
1278negate (FLO_type arg_a)
1279{
1280  fp_number_type a;
1281
1282  unpack_d ((FLO_union_type *) & arg_a, &a);
1283  flip_sign (&a);
1284  return pack_d (&a);
1285}
1286
1287#ifdef FLOAT
1288
1289SFtype
1290__make_fp(fp_class_type class,
1291             unsigned int sign,
1292             int exp,
1293             USItype frac)
1294{
1295  fp_number_type in;
1296
1297  in.class = class;
1298  in.sign = sign;
1299  in.normal_exp = exp;
1300  in.fraction.ll = frac;
1301  return pack_d (&in);
1302}
1303
1304#ifndef FLOAT_ONLY
1305
1306/* This enables one to build an fp library that supports float but not double.
1307   Otherwise, we would get an undefined reference to __make_dp.
1308   This is needed for some 8-bit ports that can't handle well values that
1309   are 8-bytes in size, so we just don't support double for them at all.  */
1310
1311extern DFtype __make_dp (fp_class_type, unsigned int, int, UDItype frac);
1312
1313DFtype
1314sf_to_df (SFtype arg_a)
1315{
1316  fp_number_type in;
1317
1318  unpack_d ((FLO_union_type *) & arg_a, &in);
1319  return __make_dp (in.class, in.sign, in.normal_exp,
1320                    ((UDItype) in.fraction.ll) << F_D_BITOFF);
1321}
1322
1323#endif
1324#endif
1325
1326#ifndef FLOAT
1327
1328extern SFtype __make_fp (fp_class_type, unsigned int, int, USItype);
1329
1330DFtype
1331__make_dp (fp_class_type class, unsigned int sign, int exp, UDItype frac)
1332{
1333  fp_number_type in;
1334
1335  in.class = class;
1336  in.sign = sign;
1337  in.normal_exp = exp;
1338  in.fraction.ll = frac;
1339  return pack_d (&in);
1340}
1341
1342SFtype
1343df_to_sf (DFtype arg_a)
1344{
1345  fp_number_type in;
1346
1347  unpack_d ((FLO_union_type *) & arg_a, &in);
1348  return __make_fp (in.class, in.sign, in.normal_exp,
1349                    in.fraction.ll >> F_D_BITOFF);
1350}
1351
1352#endif
Note: See TracBrowser for help on using the repository browser.