]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/config/fp-bit.c
(emit_push_insn): Clobber register only if it is non-zero.
[thirdparty/gcc.git] / gcc / config / fp-bit.c
CommitLineData
012a47cb
DE
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
d996122c 3 floating point. */
012a47cb 4
446c8947 5/* Copyright (C) 1994, 1995 Free Software Foundation, Inc.
d996122c
DE
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
0af195cf
RK
27the Free Software Foundation, 59 Temple Place - Suite 330,
28Boston, MA 02111-1307, USA. */
d996122c
DE
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
012a47cb
DE
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
d996122c 42 Wilson, all of Cygnus Support. */
012a47cb
DE
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
446c8947
RK
102# define pack_d pack_f
103# define unpack_d unpack_f
012a47cb
DE
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
17923320 241typedef union
012a47cb
DE
242{
243 FLO_type value;
446c8947
RK
244 fractype value_raw;
245
89c89d11
RK
246#ifndef FLOAT
247 halffractype words[2];
248#endif
249
250#ifdef FLOAT_BIT_ORDER_MISMATCH
d5f27408
RK
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
012a47cb 260#ifdef _DEBUG_BITFLOAT
012a47cb
DE
261 struct
262 {
17923320
DE
263 unsigned int sign:1 __attribute__ ((packed));
264 unsigned int exp:EXPBITS __attribute__ ((packed));
265 fractype fraction:FRACBITS __attribute__ ((packed));
446c8947
RK
266 }
267 bits_big_endian;
268
269 struct
270 {
17923320
DE
271 fractype fraction:FRACBITS __attribute__ ((packed));
272 unsigned int exp:EXPBITS __attribute__ ((packed));
273 unsigned int sign:1 __attribute__ ((packed));
012a47cb 274 }
446c8947
RK
275 bits_little_endian;
276#endif
012a47cb 277}
012a47cb
DE
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? */
446c8947
RK
336 int sign = src->sign;
337 int exp = 0;
012a47cb
DE
338
339 if (isnan (src))
340 {
446c8947 341 exp = EXPMAX;
012a47cb
DE
342 if (src->class == CLASS_QNAN || 1)
343 {
446c8947 344 fraction |= QUIET_NAN;
012a47cb
DE
345 }
346 }
347 else if (isinf (src))
348 {
446c8947
RK
349 exp = EXPMAX;
350 fraction = 0;
012a47cb
DE
351 }
352 else if (iszero (src))
353 {
446c8947
RK
354 exp = 0;
355 fraction = 0;
012a47cb
DE
356 }
357 else if (fraction == 0)
358 {
446c8947
RK
359 exp = 0;
360 sign = 0;
012a47cb
DE
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
446c8947 372 exp = 0;
012a47cb
DE
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;
012a47cb
DE
385 }
386 else if (src->normal_exp > EXPBIAS)
387 {
446c8947
RK
388 exp = EXPMAX;
389 fraction = 0;
012a47cb
DE
390 }
391 else
392 {
446c8947 393 exp = src->normal_exp + EXPBIAS;
012a47cb
DE
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;
446c8947 410 exp += 1;
012a47cb
DE
411 }
412 fraction >>= NGARDS;
012a47cb
DE
413 }
414 }
446c8947
RK
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 */
89c89d11 419#ifdef FLOAT_BIT_ORDER_MISMATCH
d5f27408
RK
420 dst.bits.fraction = fraction;
421 dst.bits.exp = exp;
422 dst.bits.sign = sign;
423#else
446c8947
RK
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);
d5f27408
RK
427#endif
428
89c89d11
RK
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
012a47cb
DE
437 return dst.value;
438}
439
440static void
441unpack_d (FLO_union_type * src, fp_number_type * dst)
442{
446c8947
RK
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 */
d5f27408
RK
446 fractype fraction;
447 int exp;
448 int sign;
449
89c89d11
RK
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
d5f27408
RK
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
446c8947
RK
467
468 dst->sign = sign;
469 if (exp == 0)
012a47cb
DE
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. */
446c8947 482 dst->normal_exp = exp - EXPBIAS + 1;
012a47cb
DE
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 }
446c8947 496 else if (exp == EXPMAX)
012a47cb
DE
497 {
498 /* Huge exponent*/
499 if (fraction == 0)
500 {
ddd5a7c1 501 /* Attached to a zero fraction - means infinity */
012a47cb
DE
502 dst->class = CLASS_INFINITY;
503 }
504 else
505 {
506 /* Non zero fraction, means nan */
446c8947 507 if (sign)
012a47cb
DE
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 */
446c8947 522 dst->normal_exp = exp - EXPBIAS;
012a47cb
DE
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 {
c211b991
JW
551 /* Adding infinities with opposite signs yields a NaN. */
552 if (isinf (b) && a->sign != b->sign)
553 return nan ();
012a47cb
DE
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 }
ddd5a7c1 635 /* and renormalize it */
012a47cb
DE
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 {
13ce26b0 783 UDItype nl = a->fraction.ll & 0xffffffff;
012a47cb 784 UDItype nh = a->fraction.ll >> 32;
13ce26b0 785 UDItype ml = b->fraction.ll & 0xffffffff;
012a47cb
DE
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