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