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