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