APFloat.cpp revision 902ff94aff34acb2b11f4651f4a4006cb788301a
1//===-- APFloat.cpp - Implement APFloat class -----------------------------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file was developed by Neil Booth and is distributed under the 6// University of Illinois Open Source License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file implements a class to represent arbitrary precision floating 11// point values and provide a variety of arithmetic operations on them. 12// 13//===----------------------------------------------------------------------===// 14 15#include <cassert> 16#include "llvm/ADT/APFloat.h" 17#include "llvm/Support/MathExtras.h" 18 19using namespace llvm; 20 21#define convolve(lhs, rhs) ((lhs) * 4 + (rhs)) 22 23/* Assumed in hexadecimal significand parsing. */ 24COMPILE_TIME_ASSERT(integerPartWidth % 4 == 0); 25 26namespace llvm { 27 28 /* Represents floating point arithmetic semantics. */ 29 struct fltSemantics { 30 /* The largest E such that 2^E is representable; this matches the 31 definition of IEEE 754. */ 32 exponent_t maxExponent; 33 34 /* The smallest E such that 2^E is a normalized number; this 35 matches the definition of IEEE 754. */ 36 exponent_t minExponent; 37 38 /* Number of bits in the significand. This includes the integer 39 bit. */ 40 unsigned char precision; 41 42 /* If the target format has an implicit integer bit. */ 43 bool implicitIntegerBit; 44 }; 45 46 const fltSemantics APFloat::IEEEsingle = { 127, -126, 24, true }; 47 const fltSemantics APFloat::IEEEdouble = { 1023, -1022, 53, true }; 48 const fltSemantics APFloat::IEEEquad = { 16383, -16382, 113, true }; 49 const fltSemantics APFloat::x87DoubleExtended = { 16383, -16382, 64, false }; 50 const fltSemantics APFloat::Bogus = { 0, 0, 0, false }; 51} 52 53/* Put a bunch of private, handy routines in an anonymous namespace. */ 54namespace { 55 56 inline unsigned int 57 partCountForBits(unsigned int bits) 58 { 59 return ((bits) + integerPartWidth - 1) / integerPartWidth; 60 } 61 62 unsigned int 63 digitValue(unsigned int c) 64 { 65 unsigned int r; 66 67 r = c - '0'; 68 if(r <= 9) 69 return r; 70 71 return -1U; 72 } 73 74 unsigned int 75 hexDigitValue (unsigned int c) 76 { 77 unsigned int r; 78 79 r = c - '0'; 80 if(r <= 9) 81 return r; 82 83 r = c - 'A'; 84 if(r <= 5) 85 return r + 10; 86 87 r = c - 'a'; 88 if(r <= 5) 89 return r + 10; 90 91 return -1U; 92 } 93 94 /* This is ugly and needs cleaning up, but I don't immediately see 95 how whilst remaining safe. */ 96 static int 97 totalExponent(const char *p, int exponentAdjustment) 98 { 99 integerPart unsignedExponent; 100 bool negative, overflow; 101 long exponent; 102 103 /* Move past the exponent letter and sign to the digits. */ 104 p++; 105 negative = *p == '-'; 106 if(*p == '-' || *p == '+') 107 p++; 108 109 unsignedExponent = 0; 110 overflow = false; 111 for(;;) { 112 unsigned int value; 113 114 value = digitValue(*p); 115 if(value == -1U) 116 break; 117 118 p++; 119 unsignedExponent = unsignedExponent * 10 + value; 120 if(unsignedExponent > 65535) 121 overflow = true; 122 } 123 124 if(exponentAdjustment > 65535 || exponentAdjustment < -65536) 125 overflow = true; 126 127 if(!overflow) { 128 exponent = unsignedExponent; 129 if(negative) 130 exponent = -exponent; 131 exponent += exponentAdjustment; 132 if(exponent > 65535 || exponent < -65536) 133 overflow = true; 134 } 135 136 if(overflow) 137 exponent = negative ? -65536: 65535; 138 139 return exponent; 140 } 141 142 const char * 143 skipLeadingZeroesAndAnyDot(const char *p, const char **dot) 144 { 145 *dot = 0; 146 while(*p == '0') 147 p++; 148 149 if(*p == '.') { 150 *dot = p++; 151 while(*p == '0') 152 p++; 153 } 154 155 return p; 156 } 157 158 /* Return the trailing fraction of a hexadecimal number. 159 DIGITVALUE is the first hex digit of the fraction, P points to 160 the next digit. */ 161 lostFraction 162 trailingHexadecimalFraction(const char *p, unsigned int digitValue) 163 { 164 unsigned int hexDigit; 165 166 /* If the first trailing digit isn't 0 or 8 we can work out the 167 fraction immediately. */ 168 if(digitValue > 8) 169 return lfMoreThanHalf; 170 else if(digitValue < 8 && digitValue > 0) 171 return lfLessThanHalf; 172 173 /* Otherwise we need to find the first non-zero digit. */ 174 while(*p == '0') 175 p++; 176 177 hexDigit = hexDigitValue(*p); 178 179 /* If we ran off the end it is exactly zero or one-half, otherwise 180 a little more. */ 181 if(hexDigit == -1U) 182 return digitValue == 0 ? lfExactlyZero: lfExactlyHalf; 183 else 184 return digitValue == 0 ? lfLessThanHalf: lfMoreThanHalf; 185 } 186 187 /* Return the fraction lost were a bignum truncated. */ 188 lostFraction 189 lostFractionThroughTruncation(integerPart *parts, 190 unsigned int partCount, 191 unsigned int bits) 192 { 193 unsigned int lsb; 194 195 lsb = APInt::tcLSB(parts, partCount); 196 197 /* Note this is guaranteed true if bits == 0, or LSB == -1U. */ 198 if(bits <= lsb) 199 return lfExactlyZero; 200 if(bits == lsb + 1) 201 return lfExactlyHalf; 202 if(bits <= partCount * integerPartWidth 203 && APInt::tcExtractBit(parts, bits - 1)) 204 return lfMoreThanHalf; 205 206 return lfLessThanHalf; 207 } 208 209 /* Shift DST right BITS bits noting lost fraction. */ 210 lostFraction 211 shiftRight(integerPart *dst, unsigned int parts, unsigned int bits) 212 { 213 lostFraction lost_fraction; 214 215 lost_fraction = lostFractionThroughTruncation(dst, parts, bits); 216 217 APInt::tcShiftRight(dst, parts, bits); 218 219 return lost_fraction; 220 } 221} 222 223/* Constructors. */ 224void 225APFloat::initialize(const fltSemantics *ourSemantics) 226{ 227 unsigned int count; 228 229 semantics = ourSemantics; 230 count = partCount(); 231 if(count > 1) 232 significand.parts = new integerPart[count]; 233} 234 235void 236APFloat::freeSignificand() 237{ 238 if(partCount() > 1) 239 delete [] significand.parts; 240} 241 242void 243APFloat::assign(const APFloat &rhs) 244{ 245 assert(semantics == rhs.semantics); 246 247 sign = rhs.sign; 248 category = rhs.category; 249 exponent = rhs.exponent; 250 if(category == fcNormal || category == fcNaN) 251 copySignificand(rhs); 252} 253 254void 255APFloat::copySignificand(const APFloat &rhs) 256{ 257 assert(category == fcNormal || category == fcNaN); 258 assert(rhs.partCount() >= partCount()); 259 260 APInt::tcAssign(significandParts(), rhs.significandParts(), 261 partCount()); 262} 263 264APFloat & 265APFloat::operator=(const APFloat &rhs) 266{ 267 if(this != &rhs) { 268 if(semantics != rhs.semantics) { 269 freeSignificand(); 270 initialize(rhs.semantics); 271 } 272 assign(rhs); 273 } 274 275 return *this; 276} 277 278bool 279APFloat::bitwiseIsEqual(const APFloat &rhs) const { 280 if (this == &rhs) 281 return true; 282 if (semantics != rhs.semantics || 283 category != rhs.category || 284 sign != rhs.sign) 285 return false; 286 if (category==fcZero || category==fcInfinity) 287 return true; 288 else if (category==fcNormal && exponent!=rhs.exponent) 289 return false; 290 else { 291 int i= partCount(); 292 const integerPart* p=significandParts(); 293 const integerPart* q=rhs.significandParts(); 294 for (; i>0; i--, p++, q++) { 295 if (*p != *q) 296 return false; 297 } 298 return true; 299 } 300} 301 302APFloat::APFloat(const fltSemantics &ourSemantics, integerPart value) 303{ 304 initialize(&ourSemantics); 305 sign = 0; 306 zeroSignificand(); 307 exponent = ourSemantics.precision - 1; 308 significandParts()[0] = value; 309 normalize(rmNearestTiesToEven, lfExactlyZero); 310} 311 312APFloat::APFloat(const fltSemantics &ourSemantics, 313 fltCategory ourCategory, bool negative) 314{ 315 initialize(&ourSemantics); 316 category = ourCategory; 317 sign = negative; 318 if(category == fcNormal) 319 category = fcZero; 320} 321 322APFloat::APFloat(const fltSemantics &ourSemantics, const char *text) 323{ 324 initialize(&ourSemantics); 325 convertFromString(text, rmNearestTiesToEven); 326} 327 328APFloat::APFloat(const APFloat &rhs) 329{ 330 initialize(rhs.semantics); 331 assign(rhs); 332} 333 334APFloat::~APFloat() 335{ 336 freeSignificand(); 337} 338 339unsigned int 340APFloat::partCount() const 341{ 342 return partCountForBits(semantics->precision + 1); 343} 344 345unsigned int 346APFloat::semanticsPrecision(const fltSemantics &semantics) 347{ 348 return semantics.precision; 349} 350 351const integerPart * 352APFloat::significandParts() const 353{ 354 return const_cast<APFloat *>(this)->significandParts(); 355} 356 357integerPart * 358APFloat::significandParts() 359{ 360 assert(category == fcNormal || category == fcNaN); 361 362 if(partCount() > 1) 363 return significand.parts; 364 else 365 return &significand.part; 366} 367 368/* Combine the effect of two lost fractions. */ 369lostFraction 370APFloat::combineLostFractions(lostFraction moreSignificant, 371 lostFraction lessSignificant) 372{ 373 if(lessSignificant != lfExactlyZero) { 374 if(moreSignificant == lfExactlyZero) 375 moreSignificant = lfLessThanHalf; 376 else if(moreSignificant == lfExactlyHalf) 377 moreSignificant = lfMoreThanHalf; 378 } 379 380 return moreSignificant; 381} 382 383void 384APFloat::zeroSignificand() 385{ 386 category = fcNormal; 387 APInt::tcSet(significandParts(), 0, partCount()); 388} 389 390/* Increment an fcNormal floating point number's significand. */ 391void 392APFloat::incrementSignificand() 393{ 394 integerPart carry; 395 396 carry = APInt::tcIncrement(significandParts(), partCount()); 397 398 /* Our callers should never cause us to overflow. */ 399 assert(carry == 0); 400} 401 402/* Add the significand of the RHS. Returns the carry flag. */ 403integerPart 404APFloat::addSignificand(const APFloat &rhs) 405{ 406 integerPart *parts; 407 408 parts = significandParts(); 409 410 assert(semantics == rhs.semantics); 411 assert(exponent == rhs.exponent); 412 413 return APInt::tcAdd(parts, rhs.significandParts(), 0, partCount()); 414} 415 416/* Subtract the significand of the RHS with a borrow flag. Returns 417 the borrow flag. */ 418integerPart 419APFloat::subtractSignificand(const APFloat &rhs, integerPart borrow) 420{ 421 integerPart *parts; 422 423 parts = significandParts(); 424 425 assert(semantics == rhs.semantics); 426 assert(exponent == rhs.exponent); 427 428 return APInt::tcSubtract(parts, rhs.significandParts(), borrow, 429 partCount()); 430} 431 432/* Multiply the significand of the RHS. If ADDEND is non-NULL, add it 433 on to the full-precision result of the multiplication. Returns the 434 lost fraction. */ 435lostFraction 436APFloat::multiplySignificand(const APFloat &rhs, const APFloat *addend) 437{ 438 unsigned int omsb; // One, not zero, based MSB. 439 unsigned int partsCount, newPartsCount, precision; 440 integerPart *lhsSignificand; 441 integerPart scratch[4]; 442 integerPart *fullSignificand; 443 lostFraction lost_fraction; 444 445 assert(semantics == rhs.semantics); 446 447 precision = semantics->precision; 448 newPartsCount = partCountForBits(precision * 2); 449 450 if(newPartsCount > 4) 451 fullSignificand = new integerPart[newPartsCount]; 452 else 453 fullSignificand = scratch; 454 455 lhsSignificand = significandParts(); 456 partsCount = partCount(); 457 458 APInt::tcFullMultiply(fullSignificand, lhsSignificand, 459 rhs.significandParts(), partsCount); 460 461 lost_fraction = lfExactlyZero; 462 omsb = APInt::tcMSB(fullSignificand, newPartsCount) + 1; 463 exponent += rhs.exponent; 464 465 if(addend) { 466 Significand savedSignificand = significand; 467 const fltSemantics *savedSemantics = semantics; 468 fltSemantics extendedSemantics; 469 opStatus status; 470 unsigned int extendedPrecision; 471 472 /* Normalize our MSB. */ 473 extendedPrecision = precision + precision - 1; 474 if(omsb != extendedPrecision) 475 { 476 APInt::tcShiftLeft(fullSignificand, newPartsCount, 477 extendedPrecision - omsb); 478 exponent -= extendedPrecision - omsb; 479 } 480 481 /* Create new semantics. */ 482 extendedSemantics = *semantics; 483 extendedSemantics.precision = extendedPrecision; 484 485 if(newPartsCount == 1) 486 significand.part = fullSignificand[0]; 487 else 488 significand.parts = fullSignificand; 489 semantics = &extendedSemantics; 490 491 APFloat extendedAddend(*addend); 492 status = extendedAddend.convert(extendedSemantics, rmTowardZero); 493 assert(status == opOK); 494 lost_fraction = addOrSubtractSignificand(extendedAddend, false); 495 496 /* Restore our state. */ 497 if(newPartsCount == 1) 498 fullSignificand[0] = significand.part; 499 significand = savedSignificand; 500 semantics = savedSemantics; 501 502 omsb = APInt::tcMSB(fullSignificand, newPartsCount) + 1; 503 } 504 505 exponent -= (precision - 1); 506 507 if(omsb > precision) { 508 unsigned int bits, significantParts; 509 lostFraction lf; 510 511 bits = omsb - precision; 512 significantParts = partCountForBits(omsb); 513 lf = shiftRight(fullSignificand, significantParts, bits); 514 lost_fraction = combineLostFractions(lf, lost_fraction); 515 exponent += bits; 516 } 517 518 APInt::tcAssign(lhsSignificand, fullSignificand, partsCount); 519 520 if(newPartsCount > 4) 521 delete [] fullSignificand; 522 523 return lost_fraction; 524} 525 526/* Multiply the significands of LHS and RHS to DST. */ 527lostFraction 528APFloat::divideSignificand(const APFloat &rhs) 529{ 530 unsigned int bit, i, partsCount; 531 const integerPart *rhsSignificand; 532 integerPart *lhsSignificand, *dividend, *divisor; 533 integerPart scratch[4]; 534 lostFraction lost_fraction; 535 536 assert(semantics == rhs.semantics); 537 538 lhsSignificand = significandParts(); 539 rhsSignificand = rhs.significandParts(); 540 partsCount = partCount(); 541 542 if(partsCount > 2) 543 dividend = new integerPart[partsCount * 2]; 544 else 545 dividend = scratch; 546 547 divisor = dividend + partsCount; 548 549 /* Copy the dividend and divisor as they will be modified in-place. */ 550 for(i = 0; i < partsCount; i++) { 551 dividend[i] = lhsSignificand[i]; 552 divisor[i] = rhsSignificand[i]; 553 lhsSignificand[i] = 0; 554 } 555 556 exponent -= rhs.exponent; 557 558 unsigned int precision = semantics->precision; 559 560 /* Normalize the divisor. */ 561 bit = precision - APInt::tcMSB(divisor, partsCount) - 1; 562 if(bit) { 563 exponent += bit; 564 APInt::tcShiftLeft(divisor, partsCount, bit); 565 } 566 567 /* Normalize the dividend. */ 568 bit = precision - APInt::tcMSB(dividend, partsCount) - 1; 569 if(bit) { 570 exponent -= bit; 571 APInt::tcShiftLeft(dividend, partsCount, bit); 572 } 573 574 if(APInt::tcCompare(dividend, divisor, partsCount) < 0) { 575 exponent--; 576 APInt::tcShiftLeft(dividend, partsCount, 1); 577 assert(APInt::tcCompare(dividend, divisor, partsCount) >= 0); 578 } 579 580 /* Long division. */ 581 for(bit = precision; bit; bit -= 1) { 582 if(APInt::tcCompare(dividend, divisor, partsCount) >= 0) { 583 APInt::tcSubtract(dividend, divisor, 0, partsCount); 584 APInt::tcSetBit(lhsSignificand, bit - 1); 585 } 586 587 APInt::tcShiftLeft(dividend, partsCount, 1); 588 } 589 590 /* Figure out the lost fraction. */ 591 int cmp = APInt::tcCompare(dividend, divisor, partsCount); 592 593 if(cmp > 0) 594 lost_fraction = lfMoreThanHalf; 595 else if(cmp == 0) 596 lost_fraction = lfExactlyHalf; 597 else if(APInt::tcIsZero(dividend, partsCount)) 598 lost_fraction = lfExactlyZero; 599 else 600 lost_fraction = lfLessThanHalf; 601 602 if(partsCount > 2) 603 delete [] dividend; 604 605 return lost_fraction; 606} 607 608unsigned int 609APFloat::significandMSB() const 610{ 611 return APInt::tcMSB(significandParts(), partCount()); 612} 613 614unsigned int 615APFloat::significandLSB() const 616{ 617 return APInt::tcLSB(significandParts(), partCount()); 618} 619 620/* Note that a zero result is NOT normalized to fcZero. */ 621lostFraction 622APFloat::shiftSignificandRight(unsigned int bits) 623{ 624 /* Our exponent should not overflow. */ 625 assert((exponent_t) (exponent + bits) >= exponent); 626 627 exponent += bits; 628 629 return shiftRight(significandParts(), partCount(), bits); 630} 631 632/* Shift the significand left BITS bits, subtract BITS from its exponent. */ 633void 634APFloat::shiftSignificandLeft(unsigned int bits) 635{ 636 assert(bits < semantics->precision); 637 638 if(bits) { 639 unsigned int partsCount = partCount(); 640 641 APInt::tcShiftLeft(significandParts(), partsCount, bits); 642 exponent -= bits; 643 644 assert(!APInt::tcIsZero(significandParts(), partsCount)); 645 } 646} 647 648APFloat::cmpResult 649APFloat::compareAbsoluteValue(const APFloat &rhs) const 650{ 651 int compare; 652 653 assert(semantics == rhs.semantics); 654 assert(category == fcNormal); 655 assert(rhs.category == fcNormal); 656 657 compare = exponent - rhs.exponent; 658 659 /* If exponents are equal, do an unsigned bignum comparison of the 660 significands. */ 661 if(compare == 0) 662 compare = APInt::tcCompare(significandParts(), rhs.significandParts(), 663 partCount()); 664 665 if(compare > 0) 666 return cmpGreaterThan; 667 else if(compare < 0) 668 return cmpLessThan; 669 else 670 return cmpEqual; 671} 672 673/* Handle overflow. Sign is preserved. We either become infinity or 674 the largest finite number. */ 675APFloat::opStatus 676APFloat::handleOverflow(roundingMode rounding_mode) 677{ 678 /* Infinity? */ 679 if(rounding_mode == rmNearestTiesToEven 680 || rounding_mode == rmNearestTiesToAway 681 || (rounding_mode == rmTowardPositive && !sign) 682 || (rounding_mode == rmTowardNegative && sign)) 683 { 684 category = fcInfinity; 685 return (opStatus) (opOverflow | opInexact); 686 } 687 688 /* Otherwise we become the largest finite number. */ 689 category = fcNormal; 690 exponent = semantics->maxExponent; 691 APInt::tcSetLeastSignificantBits(significandParts(), partCount(), 692 semantics->precision); 693 694 return opInexact; 695} 696 697/* This routine must work for fcZero of both signs, and fcNormal 698 numbers. */ 699bool 700APFloat::roundAwayFromZero(roundingMode rounding_mode, 701 lostFraction lost_fraction) 702{ 703 /* NaNs and infinities should not have lost fractions. */ 704 assert(category == fcNormal || category == fcZero); 705 706 /* Our caller has already handled this case. */ 707 assert(lost_fraction != lfExactlyZero); 708 709 switch(rounding_mode) { 710 default: 711 assert(0); 712 713 case rmNearestTiesToAway: 714 return lost_fraction == lfExactlyHalf || lost_fraction == lfMoreThanHalf; 715 716 case rmNearestTiesToEven: 717 if(lost_fraction == lfMoreThanHalf) 718 return true; 719 720 /* Our zeroes don't have a significand to test. */ 721 if(lost_fraction == lfExactlyHalf && category != fcZero) 722 return significandParts()[0] & 1; 723 724 return false; 725 726 case rmTowardZero: 727 return false; 728 729 case rmTowardPositive: 730 return sign == false; 731 732 case rmTowardNegative: 733 return sign == true; 734 } 735} 736 737APFloat::opStatus 738APFloat::normalize(roundingMode rounding_mode, 739 lostFraction lost_fraction) 740{ 741 unsigned int omsb; /* One, not zero, based MSB. */ 742 int exponentChange; 743 744 if(category != fcNormal) 745 return opOK; 746 747 /* Before rounding normalize the exponent of fcNormal numbers. */ 748 omsb = significandMSB() + 1; 749 750 if(omsb) { 751 /* OMSB is numbered from 1. We want to place it in the integer 752 bit numbered PRECISON if possible, with a compensating change in 753 the exponent. */ 754 exponentChange = omsb - semantics->precision; 755 756 /* If the resulting exponent is too high, overflow according to 757 the rounding mode. */ 758 if(exponent + exponentChange > semantics->maxExponent) 759 return handleOverflow(rounding_mode); 760 761 /* Subnormal numbers have exponent minExponent, and their MSB 762 is forced based on that. */ 763 if(exponent + exponentChange < semantics->minExponent) 764 exponentChange = semantics->minExponent - exponent; 765 766 /* Shifting left is easy as we don't lose precision. */ 767 if(exponentChange < 0) { 768 assert(lost_fraction == lfExactlyZero); 769 770 shiftSignificandLeft(-exponentChange); 771 772 return opOK; 773 } 774 775 if(exponentChange > 0) { 776 lostFraction lf; 777 778 /* Shift right and capture any new lost fraction. */ 779 lf = shiftSignificandRight(exponentChange); 780 781 lost_fraction = combineLostFractions(lf, lost_fraction); 782 783 /* Keep OMSB up-to-date. */ 784 if(omsb > (unsigned) exponentChange) 785 omsb -= (unsigned) exponentChange; 786 else 787 omsb = 0; 788 } 789 } 790 791 /* Now round the number according to rounding_mode given the lost 792 fraction. */ 793 794 /* As specified in IEEE 754, since we do not trap we do not report 795 underflow for exact results. */ 796 if(lost_fraction == lfExactlyZero) { 797 /* Canonicalize zeroes. */ 798 if(omsb == 0) 799 category = fcZero; 800 801 return opOK; 802 } 803 804 /* Increment the significand if we're rounding away from zero. */ 805 if(roundAwayFromZero(rounding_mode, lost_fraction)) { 806 if(omsb == 0) 807 exponent = semantics->minExponent; 808 809 incrementSignificand(); 810 omsb = significandMSB() + 1; 811 812 /* Did the significand increment overflow? */ 813 if(omsb == (unsigned) semantics->precision + 1) { 814 /* Renormalize by incrementing the exponent and shifting our 815 significand right one. However if we already have the 816 maximum exponent we overflow to infinity. */ 817 if(exponent == semantics->maxExponent) { 818 category = fcInfinity; 819 820 return (opStatus) (opOverflow | opInexact); 821 } 822 823 shiftSignificandRight(1); 824 825 return opInexact; 826 } 827 } 828 829 /* The normal case - we were and are not denormal, and any 830 significand increment above didn't overflow. */ 831 if(omsb == semantics->precision) 832 return opInexact; 833 834 /* We have a non-zero denormal. */ 835 assert(omsb < semantics->precision); 836 assert(exponent == semantics->minExponent); 837 838 /* Canonicalize zeroes. */ 839 if(omsb == 0) 840 category = fcZero; 841 842 /* The fcZero case is a denormal that underflowed to zero. */ 843 return (opStatus) (opUnderflow | opInexact); 844} 845 846APFloat::opStatus 847APFloat::addOrSubtractSpecials(const APFloat &rhs, bool subtract) 848{ 849 switch(convolve(category, rhs.category)) { 850 default: 851 assert(0); 852 853 case convolve(fcNaN, fcZero): 854 case convolve(fcNaN, fcNormal): 855 case convolve(fcNaN, fcInfinity): 856 case convolve(fcNaN, fcNaN): 857 case convolve(fcNormal, fcZero): 858 case convolve(fcInfinity, fcNormal): 859 case convolve(fcInfinity, fcZero): 860 return opOK; 861 862 case convolve(fcZero, fcNaN): 863 case convolve(fcNormal, fcNaN): 864 case convolve(fcInfinity, fcNaN): 865 category = fcNaN; 866 copySignificand(rhs); 867 return opOK; 868 869 case convolve(fcNormal, fcInfinity): 870 case convolve(fcZero, fcInfinity): 871 category = fcInfinity; 872 sign = rhs.sign ^ subtract; 873 return opOK; 874 875 case convolve(fcZero, fcNormal): 876 assign(rhs); 877 sign = rhs.sign ^ subtract; 878 return opOK; 879 880 case convolve(fcZero, fcZero): 881 /* Sign depends on rounding mode; handled by caller. */ 882 return opOK; 883 884 case convolve(fcInfinity, fcInfinity): 885 /* Differently signed infinities can only be validly 886 subtracted. */ 887 if(sign ^ rhs.sign != subtract) { 888 category = fcNaN; 889 // Arbitrary but deterministic value for significand 890 APInt::tcSet(significandParts(), ~0U, partCount()); 891 return opInvalidOp; 892 } 893 894 return opOK; 895 896 case convolve(fcNormal, fcNormal): 897 return opDivByZero; 898 } 899} 900 901/* Add or subtract two normal numbers. */ 902lostFraction 903APFloat::addOrSubtractSignificand(const APFloat &rhs, bool subtract) 904{ 905 integerPart carry; 906 lostFraction lost_fraction; 907 int bits; 908 909 /* Determine if the operation on the absolute values is effectively 910 an addition or subtraction. */ 911 subtract ^= (sign ^ rhs.sign); 912 913 /* Are we bigger exponent-wise than the RHS? */ 914 bits = exponent - rhs.exponent; 915 916 /* Subtraction is more subtle than one might naively expect. */ 917 if(subtract) { 918 APFloat temp_rhs(rhs); 919 bool reverse; 920 921 if (bits == 0) { 922 reverse = compareAbsoluteValue(temp_rhs) == cmpLessThan; 923 lost_fraction = lfExactlyZero; 924 } else if (bits > 0) { 925 lost_fraction = temp_rhs.shiftSignificandRight(bits - 1); 926 shiftSignificandLeft(1); 927 reverse = false; 928 } else { 929 lost_fraction = shiftSignificandRight(-bits - 1); 930 temp_rhs.shiftSignificandLeft(1); 931 reverse = true; 932 } 933 934 if (reverse) { 935 carry = temp_rhs.subtractSignificand 936 (*this, lost_fraction != lfExactlyZero); 937 copySignificand(temp_rhs); 938 sign = !sign; 939 } else { 940 carry = subtractSignificand 941 (temp_rhs, lost_fraction != lfExactlyZero); 942 } 943 944 /* Invert the lost fraction - it was on the RHS and 945 subtracted. */ 946 if(lost_fraction == lfLessThanHalf) 947 lost_fraction = lfMoreThanHalf; 948 else if(lost_fraction == lfMoreThanHalf) 949 lost_fraction = lfLessThanHalf; 950 951 /* The code above is intended to ensure that no borrow is 952 necessary. */ 953 assert(!carry); 954 } else { 955 if(bits > 0) { 956 APFloat temp_rhs(rhs); 957 958 lost_fraction = temp_rhs.shiftSignificandRight(bits); 959 carry = addSignificand(temp_rhs); 960 } else { 961 lost_fraction = shiftSignificandRight(-bits); 962 carry = addSignificand(rhs); 963 } 964 965 /* We have a guard bit; generating a carry cannot happen. */ 966 assert(!carry); 967 } 968 969 return lost_fraction; 970} 971 972APFloat::opStatus 973APFloat::multiplySpecials(const APFloat &rhs) 974{ 975 switch(convolve(category, rhs.category)) { 976 default: 977 assert(0); 978 979 case convolve(fcNaN, fcZero): 980 case convolve(fcNaN, fcNormal): 981 case convolve(fcNaN, fcInfinity): 982 case convolve(fcNaN, fcNaN): 983 return opOK; 984 985 case convolve(fcZero, fcNaN): 986 case convolve(fcNormal, fcNaN): 987 case convolve(fcInfinity, fcNaN): 988 category = fcNaN; 989 copySignificand(rhs); 990 return opOK; 991 992 case convolve(fcNormal, fcInfinity): 993 case convolve(fcInfinity, fcNormal): 994 case convolve(fcInfinity, fcInfinity): 995 category = fcInfinity; 996 return opOK; 997 998 case convolve(fcZero, fcNormal): 999 case convolve(fcNormal, fcZero): 1000 case convolve(fcZero, fcZero): 1001 category = fcZero; 1002 return opOK; 1003 1004 case convolve(fcZero, fcInfinity): 1005 case convolve(fcInfinity, fcZero): 1006 category = fcNaN; 1007 // Arbitrary but deterministic value for significand 1008 APInt::tcSet(significandParts(), ~0U, partCount()); 1009 return opInvalidOp; 1010 1011 case convolve(fcNormal, fcNormal): 1012 return opOK; 1013 } 1014} 1015 1016APFloat::opStatus 1017APFloat::divideSpecials(const APFloat &rhs) 1018{ 1019 switch(convolve(category, rhs.category)) { 1020 default: 1021 assert(0); 1022 1023 case convolve(fcNaN, fcZero): 1024 case convolve(fcNaN, fcNormal): 1025 case convolve(fcNaN, fcInfinity): 1026 case convolve(fcNaN, fcNaN): 1027 case convolve(fcInfinity, fcZero): 1028 case convolve(fcInfinity, fcNormal): 1029 case convolve(fcZero, fcInfinity): 1030 case convolve(fcZero, fcNormal): 1031 return opOK; 1032 1033 case convolve(fcZero, fcNaN): 1034 case convolve(fcNormal, fcNaN): 1035 case convolve(fcInfinity, fcNaN): 1036 category = fcNaN; 1037 copySignificand(rhs); 1038 return opOK; 1039 1040 case convolve(fcNormal, fcInfinity): 1041 category = fcZero; 1042 return opOK; 1043 1044 case convolve(fcNormal, fcZero): 1045 category = fcInfinity; 1046 return opDivByZero; 1047 1048 case convolve(fcInfinity, fcInfinity): 1049 case convolve(fcZero, fcZero): 1050 category = fcNaN; 1051 // Arbitrary but deterministic value for significand 1052 APInt::tcSet(significandParts(), ~0U, partCount()); 1053 return opInvalidOp; 1054 1055 case convolve(fcNormal, fcNormal): 1056 return opOK; 1057 } 1058} 1059 1060/* Change sign. */ 1061void 1062APFloat::changeSign() 1063{ 1064 /* Look mummy, this one's easy. */ 1065 sign = !sign; 1066} 1067 1068void 1069APFloat::clearSign() 1070{ 1071 /* So is this one. */ 1072 sign = 0; 1073} 1074 1075void 1076APFloat::copySign(const APFloat &rhs) 1077{ 1078 /* And this one. */ 1079 sign = rhs.sign; 1080} 1081 1082/* Normalized addition or subtraction. */ 1083APFloat::opStatus 1084APFloat::addOrSubtract(const APFloat &rhs, roundingMode rounding_mode, 1085 bool subtract) 1086{ 1087 opStatus fs; 1088 1089 fs = addOrSubtractSpecials(rhs, subtract); 1090 1091 /* This return code means it was not a simple case. */ 1092 if(fs == opDivByZero) { 1093 lostFraction lost_fraction; 1094 1095 lost_fraction = addOrSubtractSignificand(rhs, subtract); 1096 fs = normalize(rounding_mode, lost_fraction); 1097 1098 /* Can only be zero if we lost no fraction. */ 1099 assert(category != fcZero || lost_fraction == lfExactlyZero); 1100 } 1101 1102 /* If two numbers add (exactly) to zero, IEEE 754 decrees it is a 1103 positive zero unless rounding to minus infinity, except that 1104 adding two like-signed zeroes gives that zero. */ 1105 if(category == fcZero) { 1106 if(rhs.category != fcZero || (sign == rhs.sign) == subtract) 1107 sign = (rounding_mode == rmTowardNegative); 1108 } 1109 1110 return fs; 1111} 1112 1113/* Normalized addition. */ 1114APFloat::opStatus 1115APFloat::add(const APFloat &rhs, roundingMode rounding_mode) 1116{ 1117 return addOrSubtract(rhs, rounding_mode, false); 1118} 1119 1120/* Normalized subtraction. */ 1121APFloat::opStatus 1122APFloat::subtract(const APFloat &rhs, roundingMode rounding_mode) 1123{ 1124 return addOrSubtract(rhs, rounding_mode, true); 1125} 1126 1127/* Normalized multiply. */ 1128APFloat::opStatus 1129APFloat::multiply(const APFloat &rhs, roundingMode rounding_mode) 1130{ 1131 opStatus fs; 1132 1133 sign ^= rhs.sign; 1134 fs = multiplySpecials(rhs); 1135 1136 if(category == fcNormal) { 1137 lostFraction lost_fraction = multiplySignificand(rhs, 0); 1138 fs = normalize(rounding_mode, lost_fraction); 1139 if(lost_fraction != lfExactlyZero) 1140 fs = (opStatus) (fs | opInexact); 1141 } 1142 1143 return fs; 1144} 1145 1146/* Normalized divide. */ 1147APFloat::opStatus 1148APFloat::divide(const APFloat &rhs, roundingMode rounding_mode) 1149{ 1150 opStatus fs; 1151 1152 sign ^= rhs.sign; 1153 fs = divideSpecials(rhs); 1154 1155 if(category == fcNormal) { 1156 lostFraction lost_fraction = divideSignificand(rhs); 1157 fs = normalize(rounding_mode, lost_fraction); 1158 if(lost_fraction != lfExactlyZero) 1159 fs = (opStatus) (fs | opInexact); 1160 } 1161 1162 return fs; 1163} 1164 1165/* Normalized remainder. */ 1166APFloat::opStatus 1167APFloat::mod(const APFloat &rhs, roundingMode rounding_mode) 1168{ 1169 opStatus fs; 1170 APFloat V = *this; 1171 unsigned int origSign = sign; 1172 fs = V.divide(rhs, rmNearestTiesToEven); 1173 if (fs == opDivByZero) 1174 return fs; 1175 1176 int parts = partCount(); 1177 integerPart *x = new integerPart[parts]; 1178 fs = V.convertToInteger(x, parts * integerPartWidth, true, 1179 rmNearestTiesToEven); 1180 if (fs==opInvalidOp) 1181 return fs; 1182 1183 fs = V.convertFromInteger(x, parts * integerPartWidth, true, 1184 rmNearestTiesToEven); 1185 assert(fs==opOK); // should always work 1186 1187 fs = V.multiply(rhs, rounding_mode); 1188 assert(fs==opOK || fs==opInexact); // should not overflow or underflow 1189 1190 fs = subtract(V, rounding_mode); 1191 assert(fs==opOK || fs==opInexact); // likewise 1192 1193 if (isZero()) 1194 sign = origSign; // IEEE754 requires this 1195 delete[] x; 1196 return fs; 1197} 1198 1199/* Normalized fused-multiply-add. */ 1200APFloat::opStatus 1201APFloat::fusedMultiplyAdd(const APFloat &multiplicand, 1202 const APFloat &addend, 1203 roundingMode rounding_mode) 1204{ 1205 opStatus fs; 1206 1207 /* Post-multiplication sign, before addition. */ 1208 sign ^= multiplicand.sign; 1209 1210 /* If and only if all arguments are normal do we need to do an 1211 extended-precision calculation. */ 1212 if(category == fcNormal 1213 && multiplicand.category == fcNormal 1214 && addend.category == fcNormal) { 1215 lostFraction lost_fraction; 1216 1217 lost_fraction = multiplySignificand(multiplicand, &addend); 1218 fs = normalize(rounding_mode, lost_fraction); 1219 if(lost_fraction != lfExactlyZero) 1220 fs = (opStatus) (fs | opInexact); 1221 1222 /* If two numbers add (exactly) to zero, IEEE 754 decrees it is a 1223 positive zero unless rounding to minus infinity, except that 1224 adding two like-signed zeroes gives that zero. */ 1225 if(category == fcZero && sign != addend.sign) 1226 sign = (rounding_mode == rmTowardNegative); 1227 } else { 1228 fs = multiplySpecials(multiplicand); 1229 1230 /* FS can only be opOK or opInvalidOp. There is no more work 1231 to do in the latter case. The IEEE-754R standard says it is 1232 implementation-defined in this case whether, if ADDEND is a 1233 quiet NaN, we raise invalid op; this implementation does so. 1234 1235 If we need to do the addition we can do so with normal 1236 precision. */ 1237 if(fs == opOK) 1238 fs = addOrSubtract(addend, rounding_mode, false); 1239 } 1240 1241 return fs; 1242} 1243 1244/* Comparison requires normalized numbers. */ 1245APFloat::cmpResult 1246APFloat::compare(const APFloat &rhs) const 1247{ 1248 cmpResult result; 1249 1250 assert(semantics == rhs.semantics); 1251 1252 switch(convolve(category, rhs.category)) { 1253 default: 1254 assert(0); 1255 1256 case convolve(fcNaN, fcZero): 1257 case convolve(fcNaN, fcNormal): 1258 case convolve(fcNaN, fcInfinity): 1259 case convolve(fcNaN, fcNaN): 1260 case convolve(fcZero, fcNaN): 1261 case convolve(fcNormal, fcNaN): 1262 case convolve(fcInfinity, fcNaN): 1263 return cmpUnordered; 1264 1265 case convolve(fcInfinity, fcNormal): 1266 case convolve(fcInfinity, fcZero): 1267 case convolve(fcNormal, fcZero): 1268 if(sign) 1269 return cmpLessThan; 1270 else 1271 return cmpGreaterThan; 1272 1273 case convolve(fcNormal, fcInfinity): 1274 case convolve(fcZero, fcInfinity): 1275 case convolve(fcZero, fcNormal): 1276 if(rhs.sign) 1277 return cmpGreaterThan; 1278 else 1279 return cmpLessThan; 1280 1281 case convolve(fcInfinity, fcInfinity): 1282 if(sign == rhs.sign) 1283 return cmpEqual; 1284 else if(sign) 1285 return cmpLessThan; 1286 else 1287 return cmpGreaterThan; 1288 1289 case convolve(fcZero, fcZero): 1290 return cmpEqual; 1291 1292 case convolve(fcNormal, fcNormal): 1293 break; 1294 } 1295 1296 /* Two normal numbers. Do they have the same sign? */ 1297 if(sign != rhs.sign) { 1298 if(sign) 1299 result = cmpLessThan; 1300 else 1301 result = cmpGreaterThan; 1302 } else { 1303 /* Compare absolute values; invert result if negative. */ 1304 result = compareAbsoluteValue(rhs); 1305 1306 if(sign) { 1307 if(result == cmpLessThan) 1308 result = cmpGreaterThan; 1309 else if(result == cmpGreaterThan) 1310 result = cmpLessThan; 1311 } 1312 } 1313 1314 return result; 1315} 1316 1317APFloat::opStatus 1318APFloat::convert(const fltSemantics &toSemantics, 1319 roundingMode rounding_mode) 1320{ 1321 lostFraction lostFraction; 1322 unsigned int newPartCount, oldPartCount; 1323 opStatus fs; 1324 1325 lostFraction = lfExactlyZero; 1326 newPartCount = partCountForBits(toSemantics.precision + 1); 1327 oldPartCount = partCount(); 1328 1329 /* Handle storage complications. If our new form is wider, 1330 re-allocate our bit pattern into wider storage. If it is 1331 narrower, we ignore the excess parts, but if narrowing to a 1332 single part we need to free the old storage. 1333 Be careful not to reference significandParts for zeroes 1334 and infinities, since it aborts. */ 1335 if (newPartCount > oldPartCount) { 1336 integerPart *newParts; 1337 newParts = new integerPart[newPartCount]; 1338 APInt::tcSet(newParts, 0, newPartCount); 1339 if (category==fcNormal || category==fcNaN) 1340 APInt::tcAssign(newParts, significandParts(), oldPartCount); 1341 freeSignificand(); 1342 significand.parts = newParts; 1343 } else if (newPartCount < oldPartCount) { 1344 /* Capture any lost fraction through truncation of parts so we get 1345 correct rounding whilst normalizing. */ 1346 if (category==fcNormal) 1347 lostFraction = lostFractionThroughTruncation 1348 (significandParts(), oldPartCount, toSemantics.precision); 1349 if (newPartCount == 1) { 1350 integerPart newPart = 0; 1351 if (category==fcNormal || category==fcNaN) 1352 newPart = significandParts()[0]; 1353 freeSignificand(); 1354 significand.part = newPart; 1355 } 1356 } 1357 1358 if(category == fcNormal) { 1359 /* Re-interpret our bit-pattern. */ 1360 exponent += toSemantics.precision - semantics->precision; 1361 semantics = &toSemantics; 1362 fs = normalize(rounding_mode, lostFraction); 1363 } else if (category == fcNaN) { 1364 int shift = toSemantics.precision - semantics->precision; 1365 // No normalization here, just truncate 1366 if (shift>0) 1367 APInt::tcShiftLeft(significandParts(), newPartCount, shift); 1368 else if (shift < 0) 1369 APInt::tcShiftRight(significandParts(), newPartCount, -shift); 1370 // gcc forces the Quiet bit on, which means (float)(double)(float_sNan) 1371 // does not give you back the same bits. This is dubious, and we 1372 // don't currently do it. You're really supposed to get 1373 // an invalid operation signal at runtime, but nobody does that. 1374 semantics = &toSemantics; 1375 fs = opOK; 1376 } else { 1377 semantics = &toSemantics; 1378 fs = opOK; 1379 } 1380 1381 return fs; 1382} 1383 1384/* Convert a floating point number to an integer according to the 1385 rounding mode. If the rounded integer value is out of range this 1386 returns an invalid operation exception. If the rounded value is in 1387 range but the floating point number is not the exact integer, the C 1388 standard doesn't require an inexact exception to be raised. IEEE 1389 854 does require it so we do that. 1390 1391 Note that for conversions to integer type the C standard requires 1392 round-to-zero to always be used. */ 1393APFloat::opStatus 1394APFloat::convertToInteger(integerPart *parts, unsigned int width, 1395 bool isSigned, 1396 roundingMode rounding_mode) const 1397{ 1398 lostFraction lost_fraction; 1399 unsigned int msb, partsCount; 1400 int bits; 1401 1402 /* Handle the three special cases first. */ 1403 if(category == fcInfinity || category == fcNaN) 1404 return opInvalidOp; 1405 1406 partsCount = partCountForBits(width); 1407 1408 if(category == fcZero) { 1409 APInt::tcSet(parts, 0, partsCount); 1410 return opOK; 1411 } 1412 1413 /* Shift the bit pattern so the fraction is lost. */ 1414 APFloat tmp(*this); 1415 1416 bits = (int) semantics->precision - 1 - exponent; 1417 1418 if(bits > 0) { 1419 lost_fraction = tmp.shiftSignificandRight(bits); 1420 } else { 1421 tmp.shiftSignificandLeft(-bits); 1422 lost_fraction = lfExactlyZero; 1423 } 1424 1425 if(lost_fraction != lfExactlyZero 1426 && tmp.roundAwayFromZero(rounding_mode, lost_fraction)) 1427 tmp.incrementSignificand(); 1428 1429 msb = tmp.significandMSB(); 1430 1431 /* Negative numbers cannot be represented as unsigned. */ 1432 if(!isSigned && tmp.sign && msb != -1U) 1433 return opInvalidOp; 1434 1435 /* It takes exponent + 1 bits to represent the truncated floating 1436 point number without its sign. We lose a bit for the sign, but 1437 the maximally negative integer is a special case. */ 1438 if(msb + 1 > width) /* !! Not same as msb >= width !! */ 1439 return opInvalidOp; 1440 1441 if(isSigned && msb + 1 == width 1442 && (!tmp.sign || tmp.significandLSB() != msb)) 1443 return opInvalidOp; 1444 1445 APInt::tcAssign(parts, tmp.significandParts(), partsCount); 1446 1447 if(tmp.sign) 1448 APInt::tcNegate(parts, partsCount); 1449 1450 if(lost_fraction == lfExactlyZero) 1451 return opOK; 1452 else 1453 return opInexact; 1454} 1455 1456APFloat::opStatus 1457APFloat::convertFromUnsignedInteger(integerPart *parts, 1458 unsigned int partCount, 1459 roundingMode rounding_mode) 1460{ 1461 unsigned int msb, precision; 1462 lostFraction lost_fraction; 1463 1464 msb = APInt::tcMSB(parts, partCount) + 1; 1465 precision = semantics->precision; 1466 1467 category = fcNormal; 1468 exponent = precision - 1; 1469 1470 if(msb > precision) { 1471 exponent += (msb - precision); 1472 lost_fraction = shiftRight(parts, partCount, msb - precision); 1473 msb = precision; 1474 } else 1475 lost_fraction = lfExactlyZero; 1476 1477 /* Copy the bit image. */ 1478 zeroSignificand(); 1479 APInt::tcAssign(significandParts(), parts, partCountForBits(msb)); 1480 1481 return normalize(rounding_mode, lost_fraction); 1482} 1483 1484APFloat::opStatus 1485APFloat::convertFromInteger(const integerPart *parts, unsigned int width, 1486 bool isSigned, roundingMode rounding_mode) 1487{ 1488 unsigned int partCount = partCountForBits(width); 1489 opStatus status; 1490 APInt api = APInt(width, partCount, parts); 1491 integerPart *copy = new integerPart[partCount]; 1492 1493 sign = false; 1494 if(isSigned) { 1495 if (APInt::tcExtractBit(parts, width - 1)) { 1496 sign = true; 1497 if (width < partCount * integerPartWidth) 1498 api = api.sext(partCount * integerPartWidth); 1499 } 1500 else if (width < partCount * integerPartWidth) 1501 api = api.zext(partCount * integerPartWidth); 1502 } else { 1503 if (width < partCount * integerPartWidth) 1504 api = api.zext(partCount * integerPartWidth); 1505 } 1506 1507 APInt::tcAssign(copy, api.getRawData(), partCount); 1508 status = convertFromUnsignedInteger(copy, partCount, rounding_mode); 1509 return status; 1510} 1511 1512APFloat::opStatus 1513APFloat::convertFromHexadecimalString(const char *p, 1514 roundingMode rounding_mode) 1515{ 1516 lostFraction lost_fraction; 1517 integerPart *significand; 1518 unsigned int bitPos, partsCount; 1519 const char *dot, *firstSignificantDigit; 1520 1521 zeroSignificand(); 1522 exponent = 0; 1523 category = fcNormal; 1524 1525 significand = significandParts(); 1526 partsCount = partCount(); 1527 bitPos = partsCount * integerPartWidth; 1528 1529 /* Skip leading zeroes and any(hexa)decimal point. */ 1530 p = skipLeadingZeroesAndAnyDot(p, &dot); 1531 firstSignificantDigit = p; 1532 1533 for(;;) { 1534 integerPart hex_value; 1535 1536 if(*p == '.') { 1537 assert(dot == 0); 1538 dot = p++; 1539 } 1540 1541 hex_value = hexDigitValue(*p); 1542 if(hex_value == -1U) { 1543 lost_fraction = lfExactlyZero; 1544 break; 1545 } 1546 1547 p++; 1548 1549 /* Store the number whilst 4-bit nibbles remain. */ 1550 if(bitPos) { 1551 bitPos -= 4; 1552 hex_value <<= bitPos % integerPartWidth; 1553 significand[bitPos / integerPartWidth] |= hex_value; 1554 } else { 1555 lost_fraction = trailingHexadecimalFraction(p, hex_value); 1556 while(hexDigitValue(*p) != -1U) 1557 p++; 1558 break; 1559 } 1560 } 1561 1562 /* Hex floats require an exponent but not a hexadecimal point. */ 1563 assert(*p == 'p' || *p == 'P'); 1564 1565 /* Ignore the exponent if we are zero. */ 1566 if(p != firstSignificantDigit) { 1567 int expAdjustment; 1568 1569 /* Implicit hexadecimal point? */ 1570 if(!dot) 1571 dot = p; 1572 1573 /* Calculate the exponent adjustment implicit in the number of 1574 significant digits. */ 1575 expAdjustment = dot - firstSignificantDigit; 1576 if(expAdjustment < 0) 1577 expAdjustment++; 1578 expAdjustment = expAdjustment * 4 - 1; 1579 1580 /* Adjust for writing the significand starting at the most 1581 significant nibble. */ 1582 expAdjustment += semantics->precision; 1583 expAdjustment -= partsCount * integerPartWidth; 1584 1585 /* Adjust for the given exponent. */ 1586 exponent = totalExponent(p, expAdjustment); 1587 } 1588 1589 return normalize(rounding_mode, lost_fraction); 1590} 1591 1592APFloat::opStatus 1593APFloat::convertFromString(const char *p, roundingMode rounding_mode) { 1594 /* Handle a leading minus sign. */ 1595 if(*p == '-') 1596 sign = 1, p++; 1597 else 1598 sign = 0; 1599 1600 if(p[0] == '0' && (p[1] == 'x' || p[1] == 'X')) 1601 return convertFromHexadecimalString(p + 2, rounding_mode); 1602 1603 assert(0 && "Decimal to binary conversions not yet implemented"); 1604 abort(); 1605} 1606 1607// For good performance it is desirable for different APFloats 1608// to produce different integers. 1609uint32_t 1610APFloat::getHashValue() const { 1611 if (category==fcZero) return sign<<8 | semantics->precision ; 1612 else if (category==fcInfinity) return sign<<9 | semantics->precision; 1613 else if (category==fcNaN) return 1<<10 | semantics->precision; 1614 else { 1615 uint32_t hash = sign<<11 | semantics->precision | exponent<<12; 1616 const integerPart* p = significandParts(); 1617 for (int i=partCount(); i>0; i--, p++) 1618 hash ^= ((uint32_t)*p) ^ (*p)>>32; 1619 return hash; 1620 } 1621} 1622 1623// Conversion from APFloat to/from host float/double. It may eventually be 1624// possible to eliminate these and have everybody deal with APFloats, but that 1625// will take a while. This approach will not easily extend to long double. 1626// Current implementation requires integerPartWidth==64, which is correct at 1627// the moment but could be made more general. 1628 1629// Denormals have exponent minExponent in APFloat, but minExponent-1 in 1630// the actual IEEE respresentations. We compensate for that here. 1631 1632APInt 1633APFloat::convertF80LongDoubleAPFloatToAPInt() const { 1634 assert(semantics == (const llvm::fltSemantics* const)&x87DoubleExtended); 1635 assert (partCount()==2); 1636 1637 uint64_t myexponent, mysignificand; 1638 1639 if (category==fcNormal) { 1640 myexponent = exponent+16383; //bias 1641 mysignificand = significandParts()[0]; 1642 if (myexponent==1 && !(mysignificand & 0x8000000000000000ULL)) 1643 myexponent = 0; // denormal 1644 } else if (category==fcZero) { 1645 myexponent = 0; 1646 mysignificand = 0; 1647 } else if (category==fcInfinity) { 1648 myexponent = 0x7fff; 1649 mysignificand = 0x8000000000000000ULL; 1650 } else if (category==fcNaN) { 1651 myexponent = 0x7fff; 1652 mysignificand = significandParts()[0]; 1653 } else 1654 assert(0); 1655 1656 uint64_t words[2]; 1657 words[0] = (((uint64_t)sign & 1) << 63) | 1658 ((myexponent & 0x7fff) << 48) | 1659 ((mysignificand >>16) & 0xffffffffffffLL); 1660 words[1] = mysignificand & 0xffff; 1661 APInt api(80, 2, words); 1662 return api; 1663} 1664 1665APInt 1666APFloat::convertDoubleAPFloatToAPInt() const { 1667 assert(semantics == (const llvm::fltSemantics*)&IEEEdouble); 1668 assert (partCount()==1); 1669 1670 uint64_t myexponent, mysignificand; 1671 1672 if (category==fcNormal) { 1673 myexponent = exponent+1023; //bias 1674 mysignificand = *significandParts(); 1675 if (myexponent==1 && !(mysignificand & 0x10000000000000LL)) 1676 myexponent = 0; // denormal 1677 } else if (category==fcZero) { 1678 myexponent = 0; 1679 mysignificand = 0; 1680 } else if (category==fcInfinity) { 1681 myexponent = 0x7ff; 1682 mysignificand = 0; 1683 } else if (category==fcNaN) { 1684 myexponent = 0x7ff; 1685 mysignificand = *significandParts(); 1686 } else 1687 assert(0); 1688 1689 APInt api(64, (((((uint64_t)sign & 1) << 63) | 1690 ((myexponent & 0x7ff) << 52) | 1691 (mysignificand & 0xfffffffffffffLL)))); 1692 return api; 1693} 1694 1695APInt 1696APFloat::convertFloatAPFloatToAPInt() const { 1697 assert(semantics == (const llvm::fltSemantics*)&IEEEsingle); 1698 assert (partCount()==1); 1699 1700 uint32_t myexponent, mysignificand; 1701 1702 if (category==fcNormal) { 1703 myexponent = exponent+127; //bias 1704 mysignificand = *significandParts(); 1705 if (myexponent == 1 && !(mysignificand & 0x400000)) 1706 myexponent = 0; // denormal 1707 } else if (category==fcZero) { 1708 myexponent = 0; 1709 mysignificand = 0; 1710 } else if (category==fcInfinity) { 1711 myexponent = 0xff; 1712 mysignificand = 0; 1713 } else if (category==fcNaN) { 1714 myexponent = 0xff; 1715 mysignificand = *significandParts(); 1716 } else 1717 assert(0); 1718 1719 APInt api(32, (((sign&1) << 31) | ((myexponent&0xff) << 23) | 1720 (mysignificand & 0x7fffff))); 1721 return api; 1722} 1723 1724APInt 1725APFloat::convertToAPInt() const { 1726 if (semantics == (const llvm::fltSemantics* const)&IEEEsingle) 1727 return convertFloatAPFloatToAPInt(); 1728 else if (semantics == (const llvm::fltSemantics* const)&IEEEdouble) 1729 return convertDoubleAPFloatToAPInt(); 1730 else if (semantics == (const llvm::fltSemantics* const)&x87DoubleExtended) 1731 return convertF80LongDoubleAPFloatToAPInt(); 1732 else 1733 assert(0); 1734} 1735 1736float 1737APFloat::convertToFloat() const { 1738 assert(semantics == (const llvm::fltSemantics* const)&IEEEsingle); 1739 APInt api = convertToAPInt(); 1740 return api.bitsToFloat(); 1741} 1742 1743double 1744APFloat::convertToDouble() const { 1745 assert(semantics == (const llvm::fltSemantics* const)&IEEEdouble); 1746 APInt api = convertToAPInt(); 1747 return api.bitsToDouble(); 1748} 1749 1750/// Integer bit is explicit in this format. Current Intel book does not 1751/// define meaning of: 1752/// exponent = all 1's, integer bit not set. 1753/// exponent = 0, integer bit set. (formerly "psuedodenormals") 1754/// exponent!=0 nor all 1's, integer bit not set. (formerly "unnormals") 1755void 1756APFloat::initFromF80LongDoubleAPInt(const APInt &api) { 1757 assert(api.getBitWidth()==80); 1758 uint64_t i1 = api.getRawData()[0]; 1759 uint64_t i2 = api.getRawData()[1]; 1760 uint64_t myexponent = (i1 >> 48) & 0x7fff; 1761 uint64_t mysignificand = ((i1 << 16) & 0xffffffffffff0000ULL) | 1762 (i2 & 0xffff); 1763 1764 initialize(&APFloat::x87DoubleExtended); 1765 assert(partCount()==2); 1766 1767 sign = i1>>63; 1768 if (myexponent==0 && mysignificand==0) { 1769 // exponent, significand meaningless 1770 category = fcZero; 1771 } else if (myexponent==0x7fff && mysignificand==0x8000000000000000ULL) { 1772 // exponent, significand meaningless 1773 category = fcInfinity; 1774 } else if (myexponent==0x7fff && mysignificand!=0x8000000000000000ULL) { 1775 // exponent meaningless 1776 category = fcNaN; 1777 significandParts()[0] = mysignificand; 1778 significandParts()[1] = 0; 1779 } else { 1780 category = fcNormal; 1781 exponent = myexponent - 16383; 1782 significandParts()[0] = mysignificand; 1783 significandParts()[1] = 0; 1784 if (myexponent==0) // denormal 1785 exponent = -16382; 1786 } 1787} 1788 1789void 1790APFloat::initFromDoubleAPInt(const APInt &api) { 1791 assert(api.getBitWidth()==64); 1792 uint64_t i = *api.getRawData(); 1793 uint64_t myexponent = (i >> 52) & 0x7ff; 1794 uint64_t mysignificand = i & 0xfffffffffffffLL; 1795 1796 initialize(&APFloat::IEEEdouble); 1797 assert(partCount()==1); 1798 1799 sign = i>>63; 1800 if (myexponent==0 && mysignificand==0) { 1801 // exponent, significand meaningless 1802 category = fcZero; 1803 } else if (myexponent==0x7ff && mysignificand==0) { 1804 // exponent, significand meaningless 1805 category = fcInfinity; 1806 } else if (myexponent==0x7ff && mysignificand!=0) { 1807 // exponent meaningless 1808 category = fcNaN; 1809 *significandParts() = mysignificand; 1810 } else { 1811 category = fcNormal; 1812 exponent = myexponent - 1023; 1813 *significandParts() = mysignificand; 1814 if (myexponent==0) // denormal 1815 exponent = -1022; 1816 else 1817 *significandParts() |= 0x10000000000000LL; // integer bit 1818 } 1819} 1820 1821void 1822APFloat::initFromFloatAPInt(const APInt & api) { 1823 assert(api.getBitWidth()==32); 1824 uint32_t i = (uint32_t)*api.getRawData(); 1825 uint32_t myexponent = (i >> 23) & 0xff; 1826 uint32_t mysignificand = i & 0x7fffff; 1827 1828 initialize(&APFloat::IEEEsingle); 1829 assert(partCount()==1); 1830 1831 sign = i >> 31; 1832 if (myexponent==0 && mysignificand==0) { 1833 // exponent, significand meaningless 1834 category = fcZero; 1835 } else if (myexponent==0xff && mysignificand==0) { 1836 // exponent, significand meaningless 1837 category = fcInfinity; 1838 } else if (myexponent==0xff && mysignificand!=0) { 1839 // sign, exponent, significand meaningless 1840 category = fcNaN; 1841 *significandParts() = mysignificand; 1842 } else { 1843 category = fcNormal; 1844 exponent = myexponent - 127; //bias 1845 *significandParts() = mysignificand; 1846 if (myexponent==0) // denormal 1847 exponent = -126; 1848 else 1849 *significandParts() |= 0x800000; // integer bit 1850 } 1851} 1852 1853/// Treat api as containing the bits of a floating point number. Currently 1854/// we infer the floating point type from the size of the APInt. FIXME: This 1855/// breaks when we get to PPC128 and IEEE128 (but both cannot exist in the 1856/// same compile...) 1857void 1858APFloat::initFromAPInt(const APInt& api) { 1859 if (api.getBitWidth() == 32) 1860 return initFromFloatAPInt(api); 1861 else if (api.getBitWidth()==64) 1862 return initFromDoubleAPInt(api); 1863 else if (api.getBitWidth()==80) 1864 return initFromF80LongDoubleAPInt(api); 1865 else 1866 assert(0); 1867} 1868 1869APFloat::APFloat(const APInt& api) { 1870 initFromAPInt(api); 1871} 1872 1873APFloat::APFloat(float f) { 1874 APInt api = APInt(32, 0); 1875 initFromAPInt(api.floatToBits(f)); 1876} 1877 1878APFloat::APFloat(double d) { 1879 APInt api = APInt(64, 0); 1880 initFromAPInt(api.doubleToBits(d)); 1881} 1882 1883