APFloat.cpp revision 3f6eb7419de437436265831fce92f62498556e08
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 + 343 semantics->implicitIntegerBit ? 1 : 0); 344} 345 346unsigned int 347APFloat::semanticsPrecision(const fltSemantics &semantics) 348{ 349 return semantics.precision; 350} 351 352const integerPart * 353APFloat::significandParts() const 354{ 355 return const_cast<APFloat *>(this)->significandParts(); 356} 357 358integerPart * 359APFloat::significandParts() 360{ 361 assert(category == fcNormal || category == fcNaN); 362 363 if(partCount() > 1) 364 return significand.parts; 365 else 366 return &significand.part; 367} 368 369/* Combine the effect of two lost fractions. */ 370lostFraction 371APFloat::combineLostFractions(lostFraction moreSignificant, 372 lostFraction lessSignificant) 373{ 374 if(lessSignificant != lfExactlyZero) { 375 if(moreSignificant == lfExactlyZero) 376 moreSignificant = lfLessThanHalf; 377 else if(moreSignificant == lfExactlyHalf) 378 moreSignificant = lfMoreThanHalf; 379 } 380 381 return moreSignificant; 382} 383 384void 385APFloat::zeroSignificand() 386{ 387 category = fcNormal; 388 APInt::tcSet(significandParts(), 0, partCount()); 389} 390 391/* Increment an fcNormal floating point number's significand. */ 392void 393APFloat::incrementSignificand() 394{ 395 integerPart carry; 396 397 carry = APInt::tcIncrement(significandParts(), partCount()); 398 399 /* Our callers should never cause us to overflow. */ 400 assert(carry == 0); 401} 402 403/* Add the significand of the RHS. Returns the carry flag. */ 404integerPart 405APFloat::addSignificand(const APFloat &rhs) 406{ 407 integerPart *parts; 408 409 parts = significandParts(); 410 411 assert(semantics == rhs.semantics); 412 assert(exponent == rhs.exponent); 413 414 return APInt::tcAdd(parts, rhs.significandParts(), 0, partCount()); 415} 416 417/* Subtract the significand of the RHS with a borrow flag. Returns 418 the borrow flag. */ 419integerPart 420APFloat::subtractSignificand(const APFloat &rhs, integerPart borrow) 421{ 422 integerPart *parts; 423 424 parts = significandParts(); 425 426 assert(semantics == rhs.semantics); 427 assert(exponent == rhs.exponent); 428 429 return APInt::tcSubtract(parts, rhs.significandParts(), borrow, 430 partCount()); 431} 432 433/* Multiply the significand of the RHS. If ADDEND is non-NULL, add it 434 on to the full-precision result of the multiplication. Returns the 435 lost fraction. */ 436lostFraction 437APFloat::multiplySignificand(const APFloat &rhs, const APFloat *addend) 438{ 439 unsigned int omsb; // One, not zero, based MSB. 440 unsigned int partsCount, newPartsCount, precision; 441 integerPart *lhsSignificand; 442 integerPart scratch[4]; 443 integerPart *fullSignificand; 444 lostFraction lost_fraction; 445 446 assert(semantics == rhs.semantics); 447 448 precision = semantics->precision; 449 newPartsCount = partCountForBits(precision * 2); 450 451 if(newPartsCount > 4) 452 fullSignificand = new integerPart[newPartsCount]; 453 else 454 fullSignificand = scratch; 455 456 lhsSignificand = significandParts(); 457 partsCount = partCount(); 458 459 APInt::tcFullMultiply(fullSignificand, lhsSignificand, 460 rhs.significandParts(), partsCount); 461 462 lost_fraction = lfExactlyZero; 463 omsb = APInt::tcMSB(fullSignificand, newPartsCount) + 1; 464 exponent += rhs.exponent; 465 466 if(addend) { 467 Significand savedSignificand = significand; 468 const fltSemantics *savedSemantics = semantics; 469 fltSemantics extendedSemantics; 470 opStatus status; 471 unsigned int extendedPrecision; 472 473 /* Normalize our MSB. */ 474 extendedPrecision = precision + precision - 1; 475 if(omsb != extendedPrecision) 476 { 477 APInt::tcShiftLeft(fullSignificand, newPartsCount, 478 extendedPrecision - omsb); 479 exponent -= extendedPrecision - omsb; 480 } 481 482 /* Create new semantics. */ 483 extendedSemantics = *semantics; 484 extendedSemantics.precision = extendedPrecision; 485 486 if(newPartsCount == 1) 487 significand.part = fullSignificand[0]; 488 else 489 significand.parts = fullSignificand; 490 semantics = &extendedSemantics; 491 492 APFloat extendedAddend(*addend); 493 status = extendedAddend.convert(extendedSemantics, rmTowardZero); 494 assert(status == opOK); 495 lost_fraction = addOrSubtractSignificand(extendedAddend, false); 496 497 /* Restore our state. */ 498 if(newPartsCount == 1) 499 fullSignificand[0] = significand.part; 500 significand = savedSignificand; 501 semantics = savedSemantics; 502 503 omsb = APInt::tcMSB(fullSignificand, newPartsCount) + 1; 504 } 505 506 exponent -= (precision - 1); 507 508 if(omsb > precision) { 509 unsigned int bits, significantParts; 510 lostFraction lf; 511 512 bits = omsb - precision; 513 significantParts = partCountForBits(omsb); 514 lf = shiftRight(fullSignificand, significantParts, bits); 515 lost_fraction = combineLostFractions(lf, lost_fraction); 516 exponent += bits; 517 } 518 519 APInt::tcAssign(lhsSignificand, fullSignificand, partsCount); 520 521 if(newPartsCount > 4) 522 delete [] fullSignificand; 523 524 return lost_fraction; 525} 526 527/* Multiply the significands of LHS and RHS to DST. */ 528lostFraction 529APFloat::divideSignificand(const APFloat &rhs) 530{ 531 unsigned int bit, i, partsCount; 532 const integerPart *rhsSignificand; 533 integerPart *lhsSignificand, *dividend, *divisor; 534 integerPart scratch[4]; 535 lostFraction lost_fraction; 536 537 assert(semantics == rhs.semantics); 538 539 lhsSignificand = significandParts(); 540 rhsSignificand = rhs.significandParts(); 541 partsCount = partCount(); 542 543 if(partsCount > 2) 544 dividend = new integerPart[partsCount * 2]; 545 else 546 dividend = scratch; 547 548 divisor = dividend + partsCount; 549 550 /* Copy the dividend and divisor as they will be modified in-place. */ 551 for(i = 0; i < partsCount; i++) { 552 dividend[i] = lhsSignificand[i]; 553 divisor[i] = rhsSignificand[i]; 554 lhsSignificand[i] = 0; 555 } 556 557 exponent -= rhs.exponent; 558 559 unsigned int precision = semantics->precision; 560 561 /* Normalize the divisor. */ 562 bit = precision - APInt::tcMSB(divisor, partsCount) - 1; 563 if(bit) { 564 exponent += bit; 565 APInt::tcShiftLeft(divisor, partsCount, bit); 566 } 567 568 /* Normalize the dividend. */ 569 bit = precision - APInt::tcMSB(dividend, partsCount) - 1; 570 if(bit) { 571 exponent -= bit; 572 APInt::tcShiftLeft(dividend, partsCount, bit); 573 } 574 575 if(APInt::tcCompare(dividend, divisor, partsCount) < 0) { 576 exponent--; 577 APInt::tcShiftLeft(dividend, partsCount, 1); 578 assert(APInt::tcCompare(dividend, divisor, partsCount) >= 0); 579 } 580 581 /* Long division. */ 582 for(bit = precision; bit; bit -= 1) { 583 if(APInt::tcCompare(dividend, divisor, partsCount) >= 0) { 584 APInt::tcSubtract(dividend, divisor, 0, partsCount); 585 APInt::tcSetBit(lhsSignificand, bit - 1); 586 } 587 588 APInt::tcShiftLeft(dividend, partsCount, 1); 589 } 590 591 /* Figure out the lost fraction. */ 592 int cmp = APInt::tcCompare(dividend, divisor, partsCount); 593 594 if(cmp > 0) 595 lost_fraction = lfMoreThanHalf; 596 else if(cmp == 0) 597 lost_fraction = lfExactlyHalf; 598 else if(APInt::tcIsZero(dividend, partsCount)) 599 lost_fraction = lfExactlyZero; 600 else 601 lost_fraction = lfLessThanHalf; 602 603 if(partsCount > 2) 604 delete [] dividend; 605 606 return lost_fraction; 607} 608 609unsigned int 610APFloat::significandMSB() const 611{ 612 return APInt::tcMSB(significandParts(), partCount()); 613} 614 615unsigned int 616APFloat::significandLSB() const 617{ 618 return APInt::tcLSB(significandParts(), partCount()); 619} 620 621/* Note that a zero result is NOT normalized to fcZero. */ 622lostFraction 623APFloat::shiftSignificandRight(unsigned int bits) 624{ 625 /* Our exponent should not overflow. */ 626 assert((exponent_t) (exponent + bits) >= exponent); 627 628 exponent += bits; 629 630 return shiftRight(significandParts(), partCount(), bits); 631} 632 633/* Shift the significand left BITS bits, subtract BITS from its exponent. */ 634void 635APFloat::shiftSignificandLeft(unsigned int bits) 636{ 637 assert(bits < semantics->precision); 638 639 if(bits) { 640 unsigned int partsCount = partCount(); 641 642 APInt::tcShiftLeft(significandParts(), partsCount, bits); 643 exponent -= bits; 644 645 assert(!APInt::tcIsZero(significandParts(), partsCount)); 646 } 647} 648 649APFloat::cmpResult 650APFloat::compareAbsoluteValue(const APFloat &rhs) const 651{ 652 int compare; 653 654 assert(semantics == rhs.semantics); 655 assert(category == fcNormal); 656 assert(rhs.category == fcNormal); 657 658 compare = exponent - rhs.exponent; 659 660 /* If exponents are equal, do an unsigned bignum comparison of the 661 significands. */ 662 if(compare == 0) 663 compare = APInt::tcCompare(significandParts(), rhs.significandParts(), 664 partCount()); 665 666 if(compare > 0) 667 return cmpGreaterThan; 668 else if(compare < 0) 669 return cmpLessThan; 670 else 671 return cmpEqual; 672} 673 674/* Handle overflow. Sign is preserved. We either become infinity or 675 the largest finite number. */ 676APFloat::opStatus 677APFloat::handleOverflow(roundingMode rounding_mode) 678{ 679 /* Infinity? */ 680 if(rounding_mode == rmNearestTiesToEven 681 || rounding_mode == rmNearestTiesToAway 682 || (rounding_mode == rmTowardPositive && !sign) 683 || (rounding_mode == rmTowardNegative && sign)) 684 { 685 category = fcInfinity; 686 return (opStatus) (opOverflow | opInexact); 687 } 688 689 /* Otherwise we become the largest finite number. */ 690 category = fcNormal; 691 exponent = semantics->maxExponent; 692 APInt::tcSetLeastSignificantBits(significandParts(), partCount(), 693 semantics->precision); 694 695 return opInexact; 696} 697 698/* This routine must work for fcZero of both signs, and fcNormal 699 numbers. */ 700bool 701APFloat::roundAwayFromZero(roundingMode rounding_mode, 702 lostFraction lost_fraction) 703{ 704 /* NaNs and infinities should not have lost fractions. */ 705 assert(category == fcNormal || category == fcZero); 706 707 /* Our caller has already handled this case. */ 708 assert(lost_fraction != lfExactlyZero); 709 710 switch(rounding_mode) { 711 default: 712 assert(0); 713 714 case rmNearestTiesToAway: 715 return lost_fraction == lfExactlyHalf || lost_fraction == lfMoreThanHalf; 716 717 case rmNearestTiesToEven: 718 if(lost_fraction == lfMoreThanHalf) 719 return true; 720 721 /* Our zeroes don't have a significand to test. */ 722 if(lost_fraction == lfExactlyHalf && category != fcZero) 723 return significandParts()[0] & 1; 724 725 return false; 726 727 case rmTowardZero: 728 return false; 729 730 case rmTowardPositive: 731 return sign == false; 732 733 case rmTowardNegative: 734 return sign == true; 735 } 736} 737 738APFloat::opStatus 739APFloat::normalize(roundingMode rounding_mode, 740 lostFraction lost_fraction) 741{ 742 unsigned int omsb; /* One, not zero, based MSB. */ 743 int exponentChange; 744 745 if(category != fcNormal) 746 return opOK; 747 748 /* Before rounding normalize the exponent of fcNormal numbers. */ 749 omsb = significandMSB() + 1; 750 751 if(omsb) { 752 /* OMSB is numbered from 1. We want to place it in the integer 753 bit numbered PRECISON if possible, with a compensating change in 754 the exponent. */ 755 exponentChange = omsb - semantics->precision; 756 757 /* If the resulting exponent is too high, overflow according to 758 the rounding mode. */ 759 if(exponent + exponentChange > semantics->maxExponent) 760 return handleOverflow(rounding_mode); 761 762 /* Subnormal numbers have exponent minExponent, and their MSB 763 is forced based on that. */ 764 if(exponent + exponentChange < semantics->minExponent) 765 exponentChange = semantics->minExponent - exponent; 766 767 /* Shifting left is easy as we don't lose precision. */ 768 if(exponentChange < 0) { 769 assert(lost_fraction == lfExactlyZero); 770 771 shiftSignificandLeft(-exponentChange); 772 773 return opOK; 774 } 775 776 if(exponentChange > 0) { 777 lostFraction lf; 778 779 /* Shift right and capture any new lost fraction. */ 780 lf = shiftSignificandRight(exponentChange); 781 782 lost_fraction = combineLostFractions(lf, lost_fraction); 783 784 /* Keep OMSB up-to-date. */ 785 if(omsb > (unsigned) exponentChange) 786 omsb -= (unsigned) exponentChange; 787 else 788 omsb = 0; 789 } 790 } 791 792 /* Now round the number according to rounding_mode given the lost 793 fraction. */ 794 795 /* As specified in IEEE 754, since we do not trap we do not report 796 underflow for exact results. */ 797 if(lost_fraction == lfExactlyZero) { 798 /* Canonicalize zeroes. */ 799 if(omsb == 0) 800 category = fcZero; 801 802 return opOK; 803 } 804 805 /* Increment the significand if we're rounding away from zero. */ 806 if(roundAwayFromZero(rounding_mode, lost_fraction)) { 807 if(omsb == 0) 808 exponent = semantics->minExponent; 809 810 incrementSignificand(); 811 omsb = significandMSB() + 1; 812 813 /* Did the significand increment overflow? */ 814 if(omsb == (unsigned) semantics->precision + 1) { 815 /* Renormalize by incrementing the exponent and shifting our 816 significand right one. However if we already have the 817 maximum exponent we overflow to infinity. */ 818 if(exponent == semantics->maxExponent) { 819 category = fcInfinity; 820 821 return (opStatus) (opOverflow | opInexact); 822 } 823 824 shiftSignificandRight(1); 825 826 return opInexact; 827 } 828 } 829 830 /* The normal case - we were and are not denormal, and any 831 significand increment above didn't overflow. */ 832 if(omsb == semantics->precision) 833 return opInexact; 834 835 /* We have a non-zero denormal. */ 836 assert(omsb < semantics->precision); 837 assert(exponent == semantics->minExponent); 838 839 /* Canonicalize zeroes. */ 840 if(omsb == 0) 841 category = fcZero; 842 843 /* The fcZero case is a denormal that underflowed to zero. */ 844 return (opStatus) (opUnderflow | opInexact); 845} 846 847APFloat::opStatus 848APFloat::addOrSubtractSpecials(const APFloat &rhs, bool subtract) 849{ 850 switch(convolve(category, rhs.category)) { 851 default: 852 assert(0); 853 854 case convolve(fcNaN, fcZero): 855 case convolve(fcNaN, fcNormal): 856 case convolve(fcNaN, fcInfinity): 857 case convolve(fcNaN, fcNaN): 858 case convolve(fcNormal, fcZero): 859 case convolve(fcInfinity, fcNormal): 860 case convolve(fcInfinity, fcZero): 861 return opOK; 862 863 case convolve(fcZero, fcNaN): 864 case convolve(fcNormal, fcNaN): 865 case convolve(fcInfinity, fcNaN): 866 category = fcNaN; 867 copySignificand(rhs); 868 return opOK; 869 870 case convolve(fcNormal, fcInfinity): 871 case convolve(fcZero, fcInfinity): 872 category = fcInfinity; 873 sign = rhs.sign ^ subtract; 874 return opOK; 875 876 case convolve(fcZero, fcNormal): 877 assign(rhs); 878 sign = rhs.sign ^ subtract; 879 return opOK; 880 881 case convolve(fcZero, fcZero): 882 /* Sign depends on rounding mode; handled by caller. */ 883 return opOK; 884 885 case convolve(fcInfinity, fcInfinity): 886 /* Differently signed infinities can only be validly 887 subtracted. */ 888 if(sign ^ rhs.sign != subtract) { 889 category = fcNaN; 890 // Arbitrary but deterministic value for significand 891 APInt::tcSet(significandParts(), ~0U, partCount()); 892 return opInvalidOp; 893 } 894 895 return opOK; 896 897 case convolve(fcNormal, fcNormal): 898 return opDivByZero; 899 } 900} 901 902/* Add or subtract two normal numbers. */ 903lostFraction 904APFloat::addOrSubtractSignificand(const APFloat &rhs, bool subtract) 905{ 906 integerPart carry; 907 lostFraction lost_fraction; 908 int bits; 909 910 /* Determine if the operation on the absolute values is effectively 911 an addition or subtraction. */ 912 subtract ^= (sign ^ rhs.sign); 913 914 /* Are we bigger exponent-wise than the RHS? */ 915 bits = exponent - rhs.exponent; 916 917 /* Subtraction is more subtle than one might naively expect. */ 918 if(subtract) { 919 APFloat temp_rhs(rhs); 920 bool reverse; 921 922 if (bits == 0) { 923 reverse = compareAbsoluteValue(temp_rhs) == cmpLessThan; 924 lost_fraction = lfExactlyZero; 925 } else if (bits > 0) { 926 lost_fraction = temp_rhs.shiftSignificandRight(bits - 1); 927 shiftSignificandLeft(1); 928 reverse = false; 929 } else { 930 lost_fraction = shiftSignificandRight(-bits - 1); 931 temp_rhs.shiftSignificandLeft(1); 932 reverse = true; 933 } 934 935 if (reverse) { 936 carry = temp_rhs.subtractSignificand 937 (*this, lost_fraction != lfExactlyZero); 938 copySignificand(temp_rhs); 939 sign = !sign; 940 } else { 941 carry = subtractSignificand 942 (temp_rhs, lost_fraction != lfExactlyZero); 943 } 944 945 /* Invert the lost fraction - it was on the RHS and 946 subtracted. */ 947 if(lost_fraction == lfLessThanHalf) 948 lost_fraction = lfMoreThanHalf; 949 else if(lost_fraction == lfMoreThanHalf) 950 lost_fraction = lfLessThanHalf; 951 952 /* The code above is intended to ensure that no borrow is 953 necessary. */ 954 assert(!carry); 955 } else { 956 if(bits > 0) { 957 APFloat temp_rhs(rhs); 958 959 lost_fraction = temp_rhs.shiftSignificandRight(bits); 960 carry = addSignificand(temp_rhs); 961 } else { 962 lost_fraction = shiftSignificandRight(-bits); 963 carry = addSignificand(rhs); 964 } 965 966 /* We have a guard bit; generating a carry cannot happen. */ 967 assert(!carry); 968 } 969 970 return lost_fraction; 971} 972 973APFloat::opStatus 974APFloat::multiplySpecials(const APFloat &rhs) 975{ 976 switch(convolve(category, rhs.category)) { 977 default: 978 assert(0); 979 980 case convolve(fcNaN, fcZero): 981 case convolve(fcNaN, fcNormal): 982 case convolve(fcNaN, fcInfinity): 983 case convolve(fcNaN, fcNaN): 984 return opOK; 985 986 case convolve(fcZero, fcNaN): 987 case convolve(fcNormal, fcNaN): 988 case convolve(fcInfinity, fcNaN): 989 category = fcNaN; 990 copySignificand(rhs); 991 return opOK; 992 993 case convolve(fcNormal, fcInfinity): 994 case convolve(fcInfinity, fcNormal): 995 case convolve(fcInfinity, fcInfinity): 996 category = fcInfinity; 997 return opOK; 998 999 case convolve(fcZero, fcNormal): 1000 case convolve(fcNormal, fcZero): 1001 case convolve(fcZero, fcZero): 1002 category = fcZero; 1003 return opOK; 1004 1005 case convolve(fcZero, fcInfinity): 1006 case convolve(fcInfinity, fcZero): 1007 category = fcNaN; 1008 // Arbitrary but deterministic value for significand 1009 APInt::tcSet(significandParts(), ~0U, partCount()); 1010 return opInvalidOp; 1011 1012 case convolve(fcNormal, fcNormal): 1013 return opOK; 1014 } 1015} 1016 1017APFloat::opStatus 1018APFloat::divideSpecials(const APFloat &rhs) 1019{ 1020 switch(convolve(category, rhs.category)) { 1021 default: 1022 assert(0); 1023 1024 case convolve(fcNaN, fcZero): 1025 case convolve(fcNaN, fcNormal): 1026 case convolve(fcNaN, fcInfinity): 1027 case convolve(fcNaN, fcNaN): 1028 case convolve(fcInfinity, fcZero): 1029 case convolve(fcInfinity, fcNormal): 1030 case convolve(fcZero, fcInfinity): 1031 case convolve(fcZero, fcNormal): 1032 return opOK; 1033 1034 case convolve(fcZero, fcNaN): 1035 case convolve(fcNormal, fcNaN): 1036 case convolve(fcInfinity, fcNaN): 1037 category = fcNaN; 1038 copySignificand(rhs); 1039 return opOK; 1040 1041 case convolve(fcNormal, fcInfinity): 1042 category = fcZero; 1043 return opOK; 1044 1045 case convolve(fcNormal, fcZero): 1046 category = fcInfinity; 1047 return opDivByZero; 1048 1049 case convolve(fcInfinity, fcInfinity): 1050 case convolve(fcZero, fcZero): 1051 category = fcNaN; 1052 // Arbitrary but deterministic value for significand 1053 APInt::tcSet(significandParts(), ~0U, partCount()); 1054 return opInvalidOp; 1055 1056 case convolve(fcNormal, fcNormal): 1057 return opOK; 1058 } 1059} 1060 1061/* Change sign. */ 1062void 1063APFloat::changeSign() 1064{ 1065 /* Look mummy, this one's easy. */ 1066 sign = !sign; 1067} 1068 1069void 1070APFloat::clearSign() 1071{ 1072 /* So is this one. */ 1073 sign = 0; 1074} 1075 1076void 1077APFloat::copySign(const APFloat &rhs) 1078{ 1079 /* And this one. */ 1080 sign = rhs.sign; 1081} 1082 1083/* Normalized addition or subtraction. */ 1084APFloat::opStatus 1085APFloat::addOrSubtract(const APFloat &rhs, roundingMode rounding_mode, 1086 bool subtract) 1087{ 1088 opStatus fs; 1089 1090 fs = addOrSubtractSpecials(rhs, subtract); 1091 1092 /* This return code means it was not a simple case. */ 1093 if(fs == opDivByZero) { 1094 lostFraction lost_fraction; 1095 1096 lost_fraction = addOrSubtractSignificand(rhs, subtract); 1097 fs = normalize(rounding_mode, lost_fraction); 1098 1099 /* Can only be zero if we lost no fraction. */ 1100 assert(category != fcZero || lost_fraction == lfExactlyZero); 1101 } 1102 1103 /* If two numbers add (exactly) to zero, IEEE 754 decrees it is a 1104 positive zero unless rounding to minus infinity, except that 1105 adding two like-signed zeroes gives that zero. */ 1106 if(category == fcZero) { 1107 if(rhs.category != fcZero || (sign == rhs.sign) == subtract) 1108 sign = (rounding_mode == rmTowardNegative); 1109 } 1110 1111 return fs; 1112} 1113 1114/* Normalized addition. */ 1115APFloat::opStatus 1116APFloat::add(const APFloat &rhs, roundingMode rounding_mode) 1117{ 1118 return addOrSubtract(rhs, rounding_mode, false); 1119} 1120 1121/* Normalized subtraction. */ 1122APFloat::opStatus 1123APFloat::subtract(const APFloat &rhs, roundingMode rounding_mode) 1124{ 1125 return addOrSubtract(rhs, rounding_mode, true); 1126} 1127 1128/* Normalized multiply. */ 1129APFloat::opStatus 1130APFloat::multiply(const APFloat &rhs, roundingMode rounding_mode) 1131{ 1132 opStatus fs; 1133 1134 sign ^= rhs.sign; 1135 fs = multiplySpecials(rhs); 1136 1137 if(category == fcNormal) { 1138 lostFraction lost_fraction = multiplySignificand(rhs, 0); 1139 fs = normalize(rounding_mode, lost_fraction); 1140 if(lost_fraction != lfExactlyZero) 1141 fs = (opStatus) (fs | opInexact); 1142 } 1143 1144 return fs; 1145} 1146 1147/* Normalized divide. */ 1148APFloat::opStatus 1149APFloat::divide(const APFloat &rhs, roundingMode rounding_mode) 1150{ 1151 opStatus fs; 1152 1153 sign ^= rhs.sign; 1154 fs = divideSpecials(rhs); 1155 1156 if(category == fcNormal) { 1157 lostFraction lost_fraction = divideSignificand(rhs); 1158 fs = normalize(rounding_mode, lost_fraction); 1159 if(lost_fraction != lfExactlyZero) 1160 fs = (opStatus) (fs | opInexact); 1161 } 1162 1163 return fs; 1164} 1165 1166/* Normalized remainder. */ 1167APFloat::opStatus 1168APFloat::mod(const APFloat &rhs, roundingMode rounding_mode) 1169{ 1170 opStatus fs; 1171 APFloat V = *this; 1172 unsigned int origSign = sign; 1173 fs = V.divide(rhs, rmNearestTiesToEven); 1174 if (fs == opDivByZero) 1175 return fs; 1176 1177 int parts = partCount(); 1178 integerPart *x = new integerPart[parts]; 1179 fs = V.convertToInteger(x, parts * integerPartWidth, true, 1180 rmNearestTiesToEven); 1181 if (fs==opInvalidOp) 1182 return fs; 1183 1184 fs = V.convertFromInteger(x, parts, true, 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 unsigned int newPartCount; 1322 opStatus fs; 1323 1324 newPartCount = partCountForBits(toSemantics.precision + 1); 1325 1326 /* If our new form is wider, re-allocate our bit pattern into wider 1327 storage. */ 1328 if(newPartCount > partCount()) { 1329 integerPart *newParts; 1330 1331 newParts = new integerPart[newPartCount]; 1332 APInt::tcSet(newParts, 0, newPartCount); 1333 APInt::tcAssign(newParts, significandParts(), partCount()); 1334 freeSignificand(); 1335 significand.parts = newParts; 1336 } 1337 1338 if(category == fcNormal) { 1339 /* Re-interpret our bit-pattern. */ 1340 exponent += toSemantics.precision - semantics->precision; 1341 semantics = &toSemantics; 1342 fs = normalize(rounding_mode, lfExactlyZero); 1343 } else { 1344 semantics = &toSemantics; 1345 fs = opOK; 1346 } 1347 1348 return fs; 1349} 1350 1351/* Convert a floating point number to an integer according to the 1352 rounding mode. If the rounded integer value is out of range this 1353 returns an invalid operation exception. If the rounded value is in 1354 range but the floating point number is not the exact integer, the C 1355 standard doesn't require an inexact exception to be raised. IEEE 1356 854 does require it so we do that. 1357 1358 Note that for conversions to integer type the C standard requires 1359 round-to-zero to always be used. */ 1360APFloat::opStatus 1361APFloat::convertToInteger(integerPart *parts, unsigned int width, 1362 bool isSigned, 1363 roundingMode rounding_mode) const 1364{ 1365 lostFraction lost_fraction; 1366 unsigned int msb, partsCount; 1367 int bits; 1368 1369 /* Handle the three special cases first. */ 1370 if(category == fcInfinity || category == fcNaN) 1371 return opInvalidOp; 1372 1373 partsCount = partCountForBits(width); 1374 1375 if(category == fcZero) { 1376 APInt::tcSet(parts, 0, partsCount); 1377 return opOK; 1378 } 1379 1380 /* Shift the bit pattern so the fraction is lost. */ 1381 APFloat tmp(*this); 1382 1383 bits = (int) semantics->precision - 1 - exponent; 1384 1385 if(bits > 0) { 1386 lost_fraction = tmp.shiftSignificandRight(bits); 1387 } else { 1388 tmp.shiftSignificandLeft(-bits); 1389 lost_fraction = lfExactlyZero; 1390 } 1391 1392 if(lost_fraction != lfExactlyZero 1393 && tmp.roundAwayFromZero(rounding_mode, lost_fraction)) 1394 tmp.incrementSignificand(); 1395 1396 msb = tmp.significandMSB(); 1397 1398 /* Negative numbers cannot be represented as unsigned. */ 1399 if(!isSigned && tmp.sign && msb != -1U) 1400 return opInvalidOp; 1401 1402 /* It takes exponent + 1 bits to represent the truncated floating 1403 point number without its sign. We lose a bit for the sign, but 1404 the maximally negative integer is a special case. */ 1405 if(msb + 1 > width) /* !! Not same as msb >= width !! */ 1406 return opInvalidOp; 1407 1408 if(isSigned && msb + 1 == width 1409 && (!tmp.sign || tmp.significandLSB() != msb)) 1410 return opInvalidOp; 1411 1412 APInt::tcAssign(parts, tmp.significandParts(), partsCount); 1413 1414 if(tmp.sign) 1415 APInt::tcNegate(parts, partsCount); 1416 1417 if(lost_fraction == lfExactlyZero) 1418 return opOK; 1419 else 1420 return opInexact; 1421} 1422 1423APFloat::opStatus 1424APFloat::convertFromUnsignedInteger(integerPart *parts, 1425 unsigned int partCount, 1426 roundingMode rounding_mode) 1427{ 1428 unsigned int msb, precision; 1429 lostFraction lost_fraction; 1430 1431 msb = APInt::tcMSB(parts, partCount) + 1; 1432 precision = semantics->precision; 1433 1434 category = fcNormal; 1435 exponent = precision - 1; 1436 1437 if(msb > precision) { 1438 exponent += (msb - precision); 1439 lost_fraction = shiftRight(parts, partCount, msb - precision); 1440 msb = precision; 1441 } else 1442 lost_fraction = lfExactlyZero; 1443 1444 /* Copy the bit image. */ 1445 zeroSignificand(); 1446 APInt::tcAssign(significandParts(), parts, partCountForBits(msb)); 1447 1448 return normalize(rounding_mode, lost_fraction); 1449} 1450 1451APFloat::opStatus 1452APFloat::convertFromInteger(const integerPart *parts, 1453 unsigned int partCount, bool isSigned, 1454 roundingMode rounding_mode) 1455{ 1456 unsigned int width; 1457 opStatus status; 1458 integerPart *copy; 1459 1460 copy = new integerPart[partCount]; 1461 APInt::tcAssign(copy, parts, partCount); 1462 1463 width = partCount * integerPartWidth; 1464 1465 sign = false; 1466 if(isSigned && APInt::tcExtractBit(parts, width - 1)) { 1467 sign = true; 1468 APInt::tcNegate(copy, partCount); 1469 } 1470 1471 status = convertFromUnsignedInteger(copy, partCount, rounding_mode); 1472 delete [] copy; 1473 1474 return status; 1475} 1476 1477APFloat::opStatus 1478APFloat::convertFromHexadecimalString(const char *p, 1479 roundingMode rounding_mode) 1480{ 1481 lostFraction lost_fraction; 1482 integerPart *significand; 1483 unsigned int bitPos, partsCount; 1484 const char *dot, *firstSignificantDigit; 1485 1486 zeroSignificand(); 1487 exponent = 0; 1488 category = fcNormal; 1489 1490 significand = significandParts(); 1491 partsCount = partCount(); 1492 bitPos = partsCount * integerPartWidth; 1493 1494 /* Skip leading zeroes and any(hexa)decimal point. */ 1495 p = skipLeadingZeroesAndAnyDot(p, &dot); 1496 firstSignificantDigit = p; 1497 1498 for(;;) { 1499 integerPart hex_value; 1500 1501 if(*p == '.') { 1502 assert(dot == 0); 1503 dot = p++; 1504 } 1505 1506 hex_value = hexDigitValue(*p); 1507 if(hex_value == -1U) { 1508 lost_fraction = lfExactlyZero; 1509 break; 1510 } 1511 1512 p++; 1513 1514 /* Store the number whilst 4-bit nibbles remain. */ 1515 if(bitPos) { 1516 bitPos -= 4; 1517 hex_value <<= bitPos % integerPartWidth; 1518 significand[bitPos / integerPartWidth] |= hex_value; 1519 } else { 1520 lost_fraction = trailingHexadecimalFraction(p, hex_value); 1521 while(hexDigitValue(*p) != -1U) 1522 p++; 1523 break; 1524 } 1525 } 1526 1527 /* Hex floats require an exponent but not a hexadecimal point. */ 1528 assert(*p == 'p' || *p == 'P'); 1529 1530 /* Ignore the exponent if we are zero. */ 1531 if(p != firstSignificantDigit) { 1532 int expAdjustment; 1533 1534 /* Implicit hexadecimal point? */ 1535 if(!dot) 1536 dot = p; 1537 1538 /* Calculate the exponent adjustment implicit in the number of 1539 significant digits. */ 1540 expAdjustment = dot - firstSignificantDigit; 1541 if(expAdjustment < 0) 1542 expAdjustment++; 1543 expAdjustment = expAdjustment * 4 - 1; 1544 1545 /* Adjust for writing the significand starting at the most 1546 significant nibble. */ 1547 expAdjustment += semantics->precision; 1548 expAdjustment -= partsCount * integerPartWidth; 1549 1550 /* Adjust for the given exponent. */ 1551 exponent = totalExponent(p, expAdjustment); 1552 } 1553 1554 return normalize(rounding_mode, lost_fraction); 1555} 1556 1557APFloat::opStatus 1558APFloat::convertFromString(const char *p, roundingMode rounding_mode) { 1559 /* Handle a leading minus sign. */ 1560 if(*p == '-') 1561 sign = 1, p++; 1562 else 1563 sign = 0; 1564 1565 if(p[0] == '0' && (p[1] == 'x' || p[1] == 'X')) 1566 return convertFromHexadecimalString(p + 2, rounding_mode); 1567 1568 assert(0 && "Decimal to binary conversions not yet implemented"); 1569 abort(); 1570} 1571 1572// For good performance it is desirable for different APFloats 1573// to produce different integers. 1574uint32_t 1575APFloat::getHashValue() const { 1576 if (category==fcZero) return sign<<8 | semantics->precision ; 1577 else if (category==fcInfinity) return sign<<9 | semantics->precision; 1578 else if (category==fcNaN) return 1<<10 | semantics->precision; 1579 else { 1580 uint32_t hash = sign<<11 | semantics->precision | exponent<<12; 1581 const integerPart* p = significandParts(); 1582 for (int i=partCount(); i>0; i--, p++) 1583 hash ^= ((uint32_t)*p) ^ (*p)>>32; 1584 return hash; 1585 } 1586} 1587 1588// Conversion from APFloat to/from host float/double. It may eventually be 1589// possible to eliminate these and have everybody deal with APFloats, but that 1590// will take a while. This approach will not easily extend to long double. 1591// Current implementation requires partCount()==1, which is correct at the 1592// moment but could be made more general. 1593 1594// Denormals have exponent minExponent in APFloat, but minExponent-1 in 1595// the actual IEEE respresentation. We compensate for that here. 1596 1597APInt 1598APFloat::convertF80LongDoubleAPFloatToAPInt() const { 1599 assert(semantics == (const llvm::fltSemantics* const)&x87DoubleExtended); 1600 assert (partCount()==1); 1601 1602 uint64_t myexponent, mysignificand; 1603 1604 if (category==fcNormal) { 1605 myexponent = exponent+16383; //bias 1606 mysignificand = *significandParts(); 1607 if (myexponent==1 && !(mysignificand & 0x8000000000000000ULL)) 1608 myexponent = 0; // denormal 1609 } else if (category==fcZero) { 1610 myexponent = 0; 1611 mysignificand = 0; 1612 } else if (category==fcInfinity) { 1613 myexponent = 0x7fff; 1614 mysignificand = 0x8000000000000000ULL; 1615 } else if (category==fcNaN) { 1616 myexponent = 0x7fff; 1617 mysignificand = *significandParts(); 1618 } else 1619 assert(0); 1620 1621 uint64_t words[2]; 1622 words[0] = (((uint64_t)sign & 1) << 63) | 1623 ((myexponent & 0x7fff) << 48) | 1624 ((mysignificand >>16) & 0xffffffffffffLL); 1625 words[1] = mysignificand & 0xffff; 1626 APInt api(80, 2, words); 1627 return api; 1628} 1629 1630APInt 1631APFloat::convertDoubleAPFloatToAPInt() const { 1632 assert(semantics == (const llvm::fltSemantics* const)&IEEEdouble); 1633 assert (partCount()==1); 1634 1635 uint64_t myexponent, mysignificand; 1636 1637 if (category==fcNormal) { 1638 myexponent = exponent+1023; //bias 1639 mysignificand = *significandParts(); 1640 if (myexponent==1 && !(mysignificand & 0x10000000000000LL)) 1641 myexponent = 0; // denormal 1642 } else if (category==fcZero) { 1643 myexponent = 0; 1644 mysignificand = 0; 1645 } else if (category==fcInfinity) { 1646 myexponent = 0x7ff; 1647 mysignificand = 0; 1648 } else if (category==fcNaN) { 1649 myexponent = 0x7ff; 1650 mysignificand = *significandParts(); 1651 } else 1652 assert(0); 1653 1654 APInt api(64, (((((uint64_t)sign & 1) << 63) | 1655 ((myexponent & 0x7ff) << 52) | 1656 (mysignificand & 0xfffffffffffffLL)))); 1657 return api; 1658} 1659 1660APInt 1661APFloat::convertFloatAPFloatToAPInt() const { 1662 assert(semantics == (const llvm::fltSemantics* const)&IEEEsingle); 1663 assert (partCount()==1); 1664 1665 uint32_t myexponent, mysignificand; 1666 1667 if (category==fcNormal) { 1668 myexponent = exponent+127; //bias 1669 mysignificand = *significandParts(); 1670 if (myexponent == 1 && !(mysignificand & 0x400000)) 1671 myexponent = 0; // denormal 1672 } else if (category==fcZero) { 1673 myexponent = 0; 1674 mysignificand = 0; 1675 } else if (category==fcInfinity) { 1676 myexponent = 0xff; 1677 mysignificand = 0; 1678 } else if (category==fcNaN) { 1679 myexponent = 0xff; 1680 mysignificand = *significandParts(); 1681 } else 1682 assert(0); 1683 1684 APInt api(32, (((sign&1) << 31) | ((myexponent&0xff) << 23) | 1685 (mysignificand & 0x7fffff))); 1686 return api; 1687} 1688 1689APInt 1690APFloat::convertToAPInt() const { 1691 if (semantics == (const llvm::fltSemantics* const)&IEEEsingle) 1692 return convertFloatAPFloatToAPInt(); 1693 else if (semantics == (const llvm::fltSemantics* const)&IEEEdouble) 1694 return convertDoubleAPFloatToAPInt(); 1695 else if (semantics == (const llvm::fltSemantics* const)&x87DoubleExtended) 1696 return convertF80LongDoubleAPFloatToAPInt(); 1697 else 1698 assert(0); 1699} 1700 1701float 1702APFloat::convertToFloat() const { 1703 assert(semantics == (const llvm::fltSemantics* const)&IEEEsingle); 1704 APInt api = convertToAPInt(); 1705 return api.bitsToFloat(); 1706} 1707 1708double 1709APFloat::convertToDouble() const { 1710 assert(semantics == (const llvm::fltSemantics* const)&IEEEdouble); 1711 APInt api = convertToAPInt(); 1712 return api.bitsToDouble(); 1713} 1714 1715/// Integer bit is explicit in this format. Current Intel book does not 1716/// define meaning of: 1717/// exponent = all 1's, integer bit not set. 1718/// exponent = 0, integer bit set. (formerly "psuedodenormals") 1719/// exponent!=0 nor all 1's, integer bit not set. (formerly "unnormals") 1720void 1721APFloat::initFromF80LongDoubleAPInt(const APInt &api) { 1722 assert(api.getBitWidth()==80); 1723 uint64_t i1 = api.getRawData()[0]; 1724 uint64_t i2 = api.getRawData()[1]; 1725 uint64_t myexponent = (i1 >> 48) & 0x7fff; 1726 uint64_t mysignificand = ((i1 << 16) & 0xffffffffffff0000ULL) | 1727 (i2 & 0xffff); 1728 1729 initialize(&APFloat::x87DoubleExtended); 1730 assert(partCount()==1); 1731 1732 sign = i1>>63; 1733 if (myexponent==0 && mysignificand==0) { 1734 // exponent, significand meaningless 1735 category = fcZero; 1736 } else if (myexponent==0x7fff && mysignificand==0x8000000000000000ULL) { 1737 // exponent, significand meaningless 1738 category = fcInfinity; 1739 } else if (myexponent==0x7fff && mysignificand!=0x8000000000000000ULL) { 1740 // exponent meaningless 1741 category = fcNaN; 1742 *significandParts() = mysignificand; 1743 } else { 1744 category = fcNormal; 1745 exponent = myexponent - 16383; 1746 *significandParts() = mysignificand; 1747 if (myexponent==0) // denormal 1748 exponent = -16382; 1749 } 1750} 1751 1752void 1753APFloat::initFromDoubleAPInt(const APInt &api) { 1754 assert(api.getBitWidth()==64); 1755 uint64_t i = *api.getRawData(); 1756 uint64_t myexponent = (i >> 52) & 0x7ff; 1757 uint64_t mysignificand = i & 0xfffffffffffffLL; 1758 1759 initialize(&APFloat::IEEEdouble); 1760 assert(partCount()==1); 1761 1762 sign = i>>63; 1763 if (myexponent==0 && mysignificand==0) { 1764 // exponent, significand meaningless 1765 category = fcZero; 1766 } else if (myexponent==0x7ff && mysignificand==0) { 1767 // exponent, significand meaningless 1768 category = fcInfinity; 1769 } else if (myexponent==0x7ff && mysignificand!=0) { 1770 // exponent meaningless 1771 category = fcNaN; 1772 *significandParts() = mysignificand; 1773 } else { 1774 category = fcNormal; 1775 exponent = myexponent - 1023; 1776 *significandParts() = mysignificand; 1777 if (myexponent==0) // denormal 1778 exponent = -1022; 1779 else 1780 *significandParts() |= 0x10000000000000LL; // integer bit 1781 } 1782} 1783 1784void 1785APFloat::initFromFloatAPInt(const APInt & api) { 1786 assert(api.getBitWidth()==32); 1787 uint32_t i = (uint32_t)*api.getRawData(); 1788 uint32_t myexponent = (i >> 23) & 0xff; 1789 uint32_t mysignificand = i & 0x7fffff; 1790 1791 initialize(&APFloat::IEEEsingle); 1792 assert(partCount()==1); 1793 1794 sign = i >> 31; 1795 if (myexponent==0 && mysignificand==0) { 1796 // exponent, significand meaningless 1797 category = fcZero; 1798 } else if (myexponent==0xff && mysignificand==0) { 1799 // exponent, significand meaningless 1800 category = fcInfinity; 1801 } else if (myexponent==0xff && (mysignificand & 0x400000)) { 1802 // sign, exponent, significand meaningless 1803 category = fcNaN; 1804 *significandParts() = mysignificand; 1805 } else { 1806 category = fcNormal; 1807 exponent = myexponent - 127; //bias 1808 *significandParts() = mysignificand; 1809 if (myexponent==0) // denormal 1810 exponent = -126; 1811 else 1812 *significandParts() |= 0x800000; // integer bit 1813 } 1814} 1815 1816/// Treat api as containing the bits of a floating point number. Currently 1817/// we infer the floating point type from the size of the APInt. FIXME: This 1818/// breaks when we get to PPC128 and IEEE128 (but both cannot exist in the 1819/// same compile...) 1820void 1821APFloat::initFromAPInt(const APInt& api) { 1822 if (api.getBitWidth() == 32) 1823 return initFromFloatAPInt(api); 1824 else if (api.getBitWidth()==64) 1825 return initFromDoubleAPInt(api); 1826 else if (api.getBitWidth()==80) 1827 return initFromF80LongDoubleAPInt(api); 1828 else 1829 assert(0); 1830} 1831 1832APFloat::APFloat(const APInt& api) { 1833 initFromAPInt(api); 1834} 1835 1836APFloat::APFloat(float f) { 1837 APInt api = APInt(32, 0); 1838 initFromAPInt(api.floatToBits(f)); 1839} 1840 1841APFloat::APFloat(double d) { 1842 APInt api = APInt(64, 0); 1843 initFromAPInt(api.doubleToBits(d)); 1844} 1845 1846