6225 lines · cpp
1//===-- APFloat.cpp - Implement APFloat class -----------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// This file implements a class to represent arbitrary precision floating10// point values and provide a variety of arithmetic operations on them.11//12//===----------------------------------------------------------------------===//13 14#include "llvm/ADT/APFloat.h"15#include "llvm/ADT/APSInt.h"16#include "llvm/ADT/ArrayRef.h"17#include "llvm/ADT/FloatingPointMode.h"18#include "llvm/ADT/FoldingSet.h"19#include "llvm/ADT/Hashing.h"20#include "llvm/ADT/STLExtras.h"21#include "llvm/ADT/StringExtras.h"22#include "llvm/ADT/StringRef.h"23#include "llvm/Config/llvm-config.h"24#include "llvm/Support/Debug.h"25#include "llvm/Support/Error.h"26#include "llvm/Support/MathExtras.h"27#include "llvm/Support/raw_ostream.h"28#include <cstring>29#include <limits.h>30 31#define APFLOAT_DISPATCH_ON_SEMANTICS(METHOD_CALL) \32 do { \33 if (usesLayout<IEEEFloat>(getSemantics())) \34 return U.IEEE.METHOD_CALL; \35 if (usesLayout<DoubleAPFloat>(getSemantics())) \36 return U.Double.METHOD_CALL; \37 llvm_unreachable("Unexpected semantics"); \38 } while (false)39 40using namespace llvm;41 42/// A macro used to combine two fcCategory enums into one key which can be used43/// in a switch statement to classify how the interaction of two APFloat's44/// categories affects an operation.45///46/// TODO: If clang source code is ever allowed to use constexpr in its own47/// codebase, change this into a static inline function.48#define PackCategoriesIntoKey(_lhs, _rhs) ((_lhs) * 4 + (_rhs))49 50/* Assumed in hexadecimal significand parsing, and conversion to51 hexadecimal strings. */52static_assert(APFloatBase::integerPartWidth % 4 == 0, "Part width must be divisible by 4!");53 54namespace llvm {55 56// How the nonfinite values Inf and NaN are represented.57enum class fltNonfiniteBehavior {58 // Represents standard IEEE 754 behavior. A value is nonfinite if the59 // exponent field is all 1s. In such cases, a value is Inf if the60 // significand bits are all zero, and NaN otherwise61 IEEE754,62 63 // This behavior is present in the Float8ExMyFN* types (Float8E4M3FN,64 // Float8E5M2FNUZ, Float8E4M3FNUZ, and Float8E4M3B11FNUZ). There is no65 // representation for Inf, and operations that would ordinarily produce Inf66 // produce NaN instead.67 // The details of the NaN representation(s) in this form are determined by the68 // `fltNanEncoding` enum. We treat all NaNs as quiet, as the available69 // encodings do not distinguish between signalling and quiet NaN.70 NanOnly,71 72 // This behavior is present in Float6E3M2FN, Float6E2M3FN, and73 // Float4E2M1FN types, which do not support Inf or NaN values.74 FiniteOnly,75};76 77// How NaN values are represented. This is curently only used in combination78// with fltNonfiniteBehavior::NanOnly, and using a variant other than IEEE79// while having IEEE non-finite behavior is liable to lead to unexpected80// results.81enum class fltNanEncoding {82 // Represents the standard IEEE behavior where a value is NaN if its83 // exponent is all 1s and the significand is non-zero.84 IEEE,85 86 // Represents the behavior in the Float8E4M3FN floating point type where NaN87 // is represented by having the exponent and mantissa set to all 1s.88 // This behavior matches the FP8 E4M3 type described in89 // https://arxiv.org/abs/2209.05433. We treat both signed and unsigned NaNs90 // as non-signalling, although the paper does not state whether the NaN91 // values are signalling or not.92 AllOnes,93 94 // Represents the behavior in Float8E{5,4}E{2,3}FNUZ floating point types95 // where NaN is represented by a sign bit of 1 and all 0s in the exponent96 // and mantissa (i.e. the negative zero encoding in a IEEE float). Since97 // there is only one NaN value, it is treated as quiet NaN. This matches the98 // behavior described in https://arxiv.org/abs/2206.02915 .99 NegativeZero,100};101 102/* Represents floating point arithmetic semantics. */103struct fltSemantics {104 /* The largest E such that 2^E is representable; this matches the105 definition of IEEE 754. */106 APFloatBase::ExponentType maxExponent;107 108 /* The smallest E such that 2^E is a normalized number; this109 matches the definition of IEEE 754. */110 APFloatBase::ExponentType minExponent;111 112 /* Number of bits in the significand. This includes the integer113 bit. */114 unsigned int precision;115 116 /* Number of bits actually used in the semantics. */117 unsigned int sizeInBits;118 119 fltNonfiniteBehavior nonFiniteBehavior = fltNonfiniteBehavior::IEEE754;120 121 fltNanEncoding nanEncoding = fltNanEncoding::IEEE;122 123 /* Whether this semantics has an encoding for Zero */124 bool hasZero = true;125 126 /* Whether this semantics can represent signed values */127 bool hasSignedRepr = true;128 129 /* Whether the sign bit of this semantics is the most significant bit */130 bool hasSignBitInMSB = true;131};132 133constexpr fltSemantics APFloatBase::semIEEEhalf = {15, -14, 11, 16};134constexpr fltSemantics APFloatBase::semBFloat = {127, -126, 8, 16};135constexpr fltSemantics APFloatBase::semIEEEsingle = {127, -126, 24, 32};136constexpr fltSemantics APFloatBase::semIEEEdouble = {1023, -1022, 53, 64};137constexpr fltSemantics APFloatBase::semIEEEquad = {16383, -16382, 113, 128};138constexpr fltSemantics APFloatBase::semFloat8E5M2 = {15, -14, 3, 8};139constexpr fltSemantics APFloatBase::semFloat8E5M2FNUZ = {140 15, -15, 3, 8, fltNonfiniteBehavior::NanOnly, fltNanEncoding::NegativeZero};141constexpr fltSemantics APFloatBase::semFloat8E4M3 = {7, -6, 4, 8};142constexpr fltSemantics APFloatBase::semFloat8E4M3FN = {143 8, -6, 4, 8, fltNonfiniteBehavior::NanOnly, fltNanEncoding::AllOnes};144constexpr fltSemantics APFloatBase::semFloat8E4M3FNUZ = {145 7, -7, 4, 8, fltNonfiniteBehavior::NanOnly, fltNanEncoding::NegativeZero};146constexpr fltSemantics APFloatBase::semFloat8E4M3B11FNUZ = {147 4, -10, 4, 8, fltNonfiniteBehavior::NanOnly, fltNanEncoding::NegativeZero};148constexpr fltSemantics APFloatBase::semFloat8E3M4 = {3, -2, 5, 8};149constexpr fltSemantics APFloatBase::semFloatTF32 = {127, -126, 11, 19};150constexpr fltSemantics APFloatBase::semFloat8E8M0FNU = {151 127,152 -127,153 1,154 8,155 fltNonfiniteBehavior::NanOnly,156 fltNanEncoding::AllOnes,157 false,158 false,159 false};160 161constexpr fltSemantics APFloatBase::semFloat6E3M2FN = {162 4, -2, 3, 6, fltNonfiniteBehavior::FiniteOnly};163constexpr fltSemantics APFloatBase::semFloat6E2M3FN = {164 2, 0, 4, 6, fltNonfiniteBehavior::FiniteOnly};165constexpr fltSemantics APFloatBase::semFloat4E2M1FN = {166 2, 0, 2, 4, fltNonfiniteBehavior::FiniteOnly};167constexpr fltSemantics APFloatBase::semX87DoubleExtended = {16383, -16382, 64,168 80};169constexpr fltSemantics APFloatBase::semBogus = {0, 0, 0, 0};170constexpr fltSemantics APFloatBase::semPPCDoubleDouble = {-1, 0, 0, 128};171constexpr fltSemantics APFloatBase::semPPCDoubleDoubleLegacy = {172 1023, -1022 + 53, 53 + 53, 128};173 174const llvm::fltSemantics &APFloatBase::EnumToSemantics(Semantics S) {175 switch (S) {176 case S_IEEEhalf:177 return IEEEhalf();178 case S_BFloat:179 return BFloat();180 case S_IEEEsingle:181 return IEEEsingle();182 case S_IEEEdouble:183 return IEEEdouble();184 case S_IEEEquad:185 return IEEEquad();186 case S_PPCDoubleDouble:187 return PPCDoubleDouble();188 case S_PPCDoubleDoubleLegacy:189 return PPCDoubleDoubleLegacy();190 case S_Float8E5M2:191 return Float8E5M2();192 case S_Float8E5M2FNUZ:193 return Float8E5M2FNUZ();194 case S_Float8E4M3:195 return Float8E4M3();196 case S_Float8E4M3FN:197 return Float8E4M3FN();198 case S_Float8E4M3FNUZ:199 return Float8E4M3FNUZ();200 case S_Float8E4M3B11FNUZ:201 return Float8E4M3B11FNUZ();202 case S_Float8E3M4:203 return Float8E3M4();204 case S_FloatTF32:205 return FloatTF32();206 case S_Float8E8M0FNU:207 return Float8E8M0FNU();208 case S_Float6E3M2FN:209 return Float6E3M2FN();210 case S_Float6E2M3FN:211 return Float6E2M3FN();212 case S_Float4E2M1FN:213 return Float4E2M1FN();214 case S_x87DoubleExtended:215 return x87DoubleExtended();216 }217 llvm_unreachable("Unrecognised floating semantics");218}219 220APFloatBase::Semantics221APFloatBase::SemanticsToEnum(const llvm::fltSemantics &Sem) {222 if (&Sem == &llvm::APFloat::IEEEhalf())223 return S_IEEEhalf;224 else if (&Sem == &llvm::APFloat::BFloat())225 return S_BFloat;226 else if (&Sem == &llvm::APFloat::IEEEsingle())227 return S_IEEEsingle;228 else if (&Sem == &llvm::APFloat::IEEEdouble())229 return S_IEEEdouble;230 else if (&Sem == &llvm::APFloat::IEEEquad())231 return S_IEEEquad;232 else if (&Sem == &llvm::APFloat::PPCDoubleDouble())233 return S_PPCDoubleDouble;234 else if (&Sem == &llvm::APFloat::PPCDoubleDoubleLegacy())235 return S_PPCDoubleDoubleLegacy;236 else if (&Sem == &llvm::APFloat::Float8E5M2())237 return S_Float8E5M2;238 else if (&Sem == &llvm::APFloat::Float8E5M2FNUZ())239 return S_Float8E5M2FNUZ;240 else if (&Sem == &llvm::APFloat::Float8E4M3())241 return S_Float8E4M3;242 else if (&Sem == &llvm::APFloat::Float8E4M3FN())243 return S_Float8E4M3FN;244 else if (&Sem == &llvm::APFloat::Float8E4M3FNUZ())245 return S_Float8E4M3FNUZ;246 else if (&Sem == &llvm::APFloat::Float8E4M3B11FNUZ())247 return S_Float8E4M3B11FNUZ;248 else if (&Sem == &llvm::APFloat::Float8E3M4())249 return S_Float8E3M4;250 else if (&Sem == &llvm::APFloat::FloatTF32())251 return S_FloatTF32;252 else if (&Sem == &llvm::APFloat::Float8E8M0FNU())253 return S_Float8E8M0FNU;254 else if (&Sem == &llvm::APFloat::Float6E3M2FN())255 return S_Float6E3M2FN;256 else if (&Sem == &llvm::APFloat::Float6E2M3FN())257 return S_Float6E2M3FN;258 else if (&Sem == &llvm::APFloat::Float4E2M1FN())259 return S_Float4E2M1FN;260 else if (&Sem == &llvm::APFloat::x87DoubleExtended())261 return S_x87DoubleExtended;262 else263 llvm_unreachable("Unknown floating semantics");264}265 266bool APFloatBase::isRepresentableBy(const fltSemantics &A,267 const fltSemantics &B) {268 return A.maxExponent <= B.maxExponent && A.minExponent >= B.minExponent &&269 A.precision <= B.precision;270}271 272/* A tight upper bound on number of parts required to hold the value273 pow(5, power) is274 275 power * 815 / (351 * integerPartWidth) + 1276 277 However, whilst the result may require only this many parts,278 because we are multiplying two values to get it, the279 multiplication may require an extra part with the excess part280 being zero (consider the trivial case of 1 * 1, tcFullMultiply281 requires two parts to hold the single-part result). So we add an282 extra one to guarantee enough space whilst multiplying. */283const unsigned int maxExponent = 16383;284const unsigned int maxPrecision = 113;285const unsigned int maxPowerOfFiveExponent = maxExponent + maxPrecision - 1;286const unsigned int maxPowerOfFiveParts =287 2 +288 ((maxPowerOfFiveExponent * 815) / (351 * APFloatBase::integerPartWidth));289 290unsigned int APFloatBase::semanticsPrecision(const fltSemantics &semantics) {291 return semantics.precision;292}293APFloatBase::ExponentType294APFloatBase::semanticsMaxExponent(const fltSemantics &semantics) {295 return semantics.maxExponent;296}297APFloatBase::ExponentType298APFloatBase::semanticsMinExponent(const fltSemantics &semantics) {299 return semantics.minExponent;300}301unsigned int APFloatBase::semanticsSizeInBits(const fltSemantics &semantics) {302 return semantics.sizeInBits;303}304unsigned int APFloatBase::semanticsIntSizeInBits(const fltSemantics &semantics,305 bool isSigned) {306 // The max FP value is pow(2, MaxExponent) * (1 + MaxFraction), so we need307 // at least one more bit than the MaxExponent to hold the max FP value.308 unsigned int MinBitWidth = semanticsMaxExponent(semantics) + 1;309 // Extra sign bit needed.310 if (isSigned)311 ++MinBitWidth;312 return MinBitWidth;313}314 315bool APFloatBase::semanticsHasZero(const fltSemantics &semantics) {316 return semantics.hasZero;317}318 319bool APFloatBase::semanticsHasSignedRepr(const fltSemantics &semantics) {320 return semantics.hasSignedRepr;321}322 323bool APFloatBase::semanticsHasInf(const fltSemantics &semantics) {324 return semantics.nonFiniteBehavior == fltNonfiniteBehavior::IEEE754;325}326 327bool APFloatBase::semanticsHasNaN(const fltSemantics &semantics) {328 return semantics.nonFiniteBehavior != fltNonfiniteBehavior::FiniteOnly;329}330 331bool APFloatBase::isIEEELikeFP(const fltSemantics &semantics) {332 // Keep in sync with Type::isIEEELikeFPTy333 return SemanticsToEnum(semantics) <= S_IEEEquad;334}335 336bool APFloatBase::hasSignBitInMSB(const fltSemantics &semantics) {337 return semantics.hasSignBitInMSB;338}339 340bool APFloatBase::isRepresentableAsNormalIn(const fltSemantics &Src,341 const fltSemantics &Dst) {342 // Exponent range must be larger.343 if (Src.maxExponent >= Dst.maxExponent || Src.minExponent <= Dst.minExponent)344 return false;345 346 // If the mantissa is long enough, the result value could still be denormal347 // with a larger exponent range.348 //349 // FIXME: This condition is probably not accurate but also shouldn't be a350 // practical concern with existing types.351 return Dst.precision >= Src.precision;352}353 354unsigned APFloatBase::getSizeInBits(const fltSemantics &Sem) {355 return Sem.sizeInBits;356}357 358static constexpr APFloatBase::ExponentType359exponentZero(const fltSemantics &semantics) {360 return semantics.minExponent - 1;361}362 363static constexpr APFloatBase::ExponentType364exponentInf(const fltSemantics &semantics) {365 return semantics.maxExponent + 1;366}367 368static constexpr APFloatBase::ExponentType369exponentNaN(const fltSemantics &semantics) {370 if (semantics.nonFiniteBehavior == fltNonfiniteBehavior::NanOnly) {371 if (semantics.nanEncoding == fltNanEncoding::NegativeZero)372 return exponentZero(semantics);373 if (semantics.hasSignedRepr)374 return semantics.maxExponent;375 }376 return semantics.maxExponent + 1;377}378 379/* A bunch of private, handy routines. */380 381static inline Error createError(const Twine &Err) {382 return make_error<StringError>(Err, inconvertibleErrorCode());383}384 385static constexpr inline unsigned int partCountForBits(unsigned int bits) {386 return std::max(1u, (bits + APFloatBase::integerPartWidth - 1) /387 APFloatBase::integerPartWidth);388}389 390/* Returns 0U-9U. Return values >= 10U are not digits. */391static inline unsigned int392decDigitValue(unsigned int c)393{394 return c - '0';395}396 397/* Return the value of a decimal exponent of the form398 [+-]ddddddd.399 400 If the exponent overflows, returns a large exponent with the401 appropriate sign. */402static Expected<int> readExponent(StringRef::iterator begin,403 StringRef::iterator end) {404 bool isNegative;405 unsigned int absExponent;406 const unsigned int overlargeExponent = 24000; /* FIXME. */407 StringRef::iterator p = begin;408 409 // Treat no exponent as 0 to match binutils410 if (p == end || ((*p == '-' || *p == '+') && (p + 1) == end)) {411 return 0;412 }413 414 isNegative = (*p == '-');415 if (*p == '-' || *p == '+') {416 p++;417 if (p == end)418 return createError("Exponent has no digits");419 }420 421 absExponent = decDigitValue(*p++);422 if (absExponent >= 10U)423 return createError("Invalid character in exponent");424 425 for (; p != end; ++p) {426 unsigned int value;427 428 value = decDigitValue(*p);429 if (value >= 10U)430 return createError("Invalid character in exponent");431 432 absExponent = absExponent * 10U + value;433 if (absExponent >= overlargeExponent) {434 absExponent = overlargeExponent;435 break;436 }437 }438 439 if (isNegative)440 return -(int) absExponent;441 else442 return (int) absExponent;443}444 445/* This is ugly and needs cleaning up, but I don't immediately see446 how whilst remaining safe. */447static Expected<int> totalExponent(StringRef::iterator p,448 StringRef::iterator end,449 int exponentAdjustment) {450 int unsignedExponent;451 bool negative, overflow;452 int exponent = 0;453 454 if (p == end)455 return createError("Exponent has no digits");456 457 negative = *p == '-';458 if (*p == '-' || *p == '+') {459 p++;460 if (p == end)461 return createError("Exponent has no digits");462 }463 464 unsignedExponent = 0;465 overflow = false;466 for (; p != end; ++p) {467 unsigned int value;468 469 value = decDigitValue(*p);470 if (value >= 10U)471 return createError("Invalid character in exponent");472 473 unsignedExponent = unsignedExponent * 10 + value;474 if (unsignedExponent > 32767) {475 overflow = true;476 break;477 }478 }479 480 if (exponentAdjustment > 32767 || exponentAdjustment < -32768)481 overflow = true;482 483 if (!overflow) {484 exponent = unsignedExponent;485 if (negative)486 exponent = -exponent;487 exponent += exponentAdjustment;488 if (exponent > 32767 || exponent < -32768)489 overflow = true;490 }491 492 if (overflow)493 exponent = negative ? -32768: 32767;494 495 return exponent;496}497 498static Expected<StringRef::iterator>499skipLeadingZeroesAndAnyDot(StringRef::iterator begin, StringRef::iterator end,500 StringRef::iterator *dot) {501 StringRef::iterator p = begin;502 *dot = end;503 while (p != end && *p == '0')504 p++;505 506 if (p != end && *p == '.') {507 *dot = p++;508 509 if (end - begin == 1)510 return createError("Significand has no digits");511 512 while (p != end && *p == '0')513 p++;514 }515 516 return p;517}518 519/* Given a normal decimal floating point number of the form520 521 dddd.dddd[eE][+-]ddd522 523 where the decimal point and exponent are optional, fill out the524 structure D. Exponent is appropriate if the significand is525 treated as an integer, and normalizedExponent if the significand526 is taken to have the decimal point after a single leading527 non-zero digit.528 529 If the value is zero, V->firstSigDigit points to a non-digit, and530 the return exponent is zero.531*/532struct decimalInfo {533 const char *firstSigDigit;534 const char *lastSigDigit;535 int exponent;536 int normalizedExponent;537};538 539static Error interpretDecimal(StringRef::iterator begin,540 StringRef::iterator end, decimalInfo *D) {541 StringRef::iterator dot = end;542 543 auto PtrOrErr = skipLeadingZeroesAndAnyDot(begin, end, &dot);544 if (!PtrOrErr)545 return PtrOrErr.takeError();546 StringRef::iterator p = *PtrOrErr;547 548 D->firstSigDigit = p;549 D->exponent = 0;550 D->normalizedExponent = 0;551 552 for (; p != end; ++p) {553 if (*p == '.') {554 if (dot != end)555 return createError("String contains multiple dots");556 dot = p++;557 if (p == end)558 break;559 }560 if (decDigitValue(*p) >= 10U)561 break;562 }563 564 if (p != end) {565 if (*p != 'e' && *p != 'E')566 return createError("Invalid character in significand");567 if (p == begin)568 return createError("Significand has no digits");569 if (dot != end && p - begin == 1)570 return createError("Significand has no digits");571 572 /* p points to the first non-digit in the string */573 auto ExpOrErr = readExponent(p + 1, end);574 if (!ExpOrErr)575 return ExpOrErr.takeError();576 D->exponent = *ExpOrErr;577 578 /* Implied decimal point? */579 if (dot == end)580 dot = p;581 }582 583 /* If number is all zeroes accept any exponent. */584 if (p != D->firstSigDigit) {585 /* Drop insignificant trailing zeroes. */586 if (p != begin) {587 do588 do589 p--;590 while (p != begin && *p == '0');591 while (p != begin && *p == '.');592 }593 594 /* Adjust the exponents for any decimal point. */595 D->exponent += static_cast<APFloat::ExponentType>((dot - p) - (dot > p));596 D->normalizedExponent = (D->exponent +597 static_cast<APFloat::ExponentType>((p - D->firstSigDigit)598 - (dot > D->firstSigDigit && dot < p)));599 }600 601 D->lastSigDigit = p;602 return Error::success();603}604 605/* Return the trailing fraction of a hexadecimal number.606 DIGITVALUE is the first hex digit of the fraction, P points to607 the next digit. */608static Expected<lostFraction>609trailingHexadecimalFraction(StringRef::iterator p, StringRef::iterator end,610 unsigned int digitValue) {611 unsigned int hexDigit;612 613 /* If the first trailing digit isn't 0 or 8 we can work out the614 fraction immediately. */615 if (digitValue > 8)616 return lfMoreThanHalf;617 else if (digitValue < 8 && digitValue > 0)618 return lfLessThanHalf;619 620 // Otherwise we need to find the first non-zero digit.621 while (p != end && (*p == '0' || *p == '.'))622 p++;623 624 if (p == end)625 return createError("Invalid trailing hexadecimal fraction!");626 627 hexDigit = hexDigitValue(*p);628 629 /* If we ran off the end it is exactly zero or one-half, otherwise630 a little more. */631 if (hexDigit == UINT_MAX)632 return digitValue == 0 ? lfExactlyZero: lfExactlyHalf;633 else634 return digitValue == 0 ? lfLessThanHalf: lfMoreThanHalf;635}636 637/* Return the fraction lost were a bignum truncated losing the least638 significant BITS bits. */639static lostFraction640lostFractionThroughTruncation(const APFloatBase::integerPart *parts,641 unsigned int partCount,642 unsigned int bits)643{644 unsigned int lsb;645 646 lsb = APInt::tcLSB(parts, partCount);647 648 /* Note this is guaranteed true if bits == 0, or LSB == UINT_MAX. */649 if (bits <= lsb)650 return lfExactlyZero;651 if (bits == lsb + 1)652 return lfExactlyHalf;653 if (bits <= partCount * APFloatBase::integerPartWidth &&654 APInt::tcExtractBit(parts, bits - 1))655 return lfMoreThanHalf;656 657 return lfLessThanHalf;658}659 660/* Shift DST right BITS bits noting lost fraction. */661static lostFraction662shiftRight(APFloatBase::integerPart *dst, unsigned int parts, unsigned int bits)663{664 lostFraction lost_fraction;665 666 lost_fraction = lostFractionThroughTruncation(dst, parts, bits);667 668 APInt::tcShiftRight(dst, parts, bits);669 670 return lost_fraction;671}672 673/* Combine the effect of two lost fractions. */674static lostFraction675combineLostFractions(lostFraction moreSignificant,676 lostFraction lessSignificant)677{678 if (lessSignificant != lfExactlyZero) {679 if (moreSignificant == lfExactlyZero)680 moreSignificant = lfLessThanHalf;681 else if (moreSignificant == lfExactlyHalf)682 moreSignificant = lfMoreThanHalf;683 }684 685 return moreSignificant;686}687 688/* The error from the true value, in half-ulps, on multiplying two689 floating point numbers, which differ from the value they690 approximate by at most HUE1 and HUE2 half-ulps, is strictly less691 than the returned value.692 693 See "How to Read Floating Point Numbers Accurately" by William D694 Clinger. */695static unsigned int696HUerrBound(bool inexactMultiply, unsigned int HUerr1, unsigned int HUerr2)697{698 assert(HUerr1 < 2 || HUerr2 < 2 || (HUerr1 + HUerr2 < 8));699 700 if (HUerr1 + HUerr2 == 0)701 return inexactMultiply * 2; /* <= inexactMultiply half-ulps. */702 else703 return inexactMultiply + 2 * (HUerr1 + HUerr2);704}705 706/* The number of ulps from the boundary (zero, or half if ISNEAREST)707 when the least significant BITS are truncated. BITS cannot be708 zero. */709static APFloatBase::integerPart710ulpsFromBoundary(const APFloatBase::integerPart *parts, unsigned int bits,711 bool isNearest) {712 unsigned int count, partBits;713 APFloatBase::integerPart part, boundary;714 715 assert(bits != 0);716 717 bits--;718 count = bits / APFloatBase::integerPartWidth;719 partBits = bits % APFloatBase::integerPartWidth + 1;720 721 part = parts[count] & (~(APFloatBase::integerPart) 0 >> (APFloatBase::integerPartWidth - partBits));722 723 if (isNearest)724 boundary = (APFloatBase::integerPart) 1 << (partBits - 1);725 else726 boundary = 0;727 728 if (count == 0) {729 if (part - boundary <= boundary - part)730 return part - boundary;731 else732 return boundary - part;733 }734 735 if (part == boundary) {736 while (--count)737 if (parts[count])738 return ~(APFloatBase::integerPart) 0; /* A lot. */739 740 return parts[0];741 } else if (part == boundary - 1) {742 while (--count)743 if (~parts[count])744 return ~(APFloatBase::integerPart) 0; /* A lot. */745 746 return -parts[0];747 }748 749 return ~(APFloatBase::integerPart) 0; /* A lot. */750}751 752/* Place pow(5, power) in DST, and return the number of parts used.753 DST must be at least one part larger than size of the answer. */754static unsigned int755powerOf5(APFloatBase::integerPart *dst, unsigned int power) {756 static const APFloatBase::integerPart firstEightPowers[] = { 1, 5, 25, 125, 625, 3125, 15625, 78125 };757 APFloatBase::integerPart pow5s[maxPowerOfFiveParts * 2 + 5];758 pow5s[0] = 78125 * 5;759 760 unsigned int partsCount = 1;761 APFloatBase::integerPart scratch[maxPowerOfFiveParts], *p1, *p2, *pow5;762 unsigned int result;763 assert(power <= maxExponent);764 765 p1 = dst;766 p2 = scratch;767 768 *p1 = firstEightPowers[power & 7];769 power >>= 3;770 771 result = 1;772 pow5 = pow5s;773 774 for (unsigned int n = 0; power; power >>= 1, n++) {775 /* Calculate pow(5,pow(2,n+3)) if we haven't yet. */776 if (n != 0) {777 APInt::tcFullMultiply(pow5, pow5 - partsCount, pow5 - partsCount,778 partsCount, partsCount);779 partsCount *= 2;780 if (pow5[partsCount - 1] == 0)781 partsCount--;782 }783 784 if (power & 1) {785 APFloatBase::integerPart *tmp;786 787 APInt::tcFullMultiply(p2, p1, pow5, result, partsCount);788 result += partsCount;789 if (p2[result - 1] == 0)790 result--;791 792 /* Now result is in p1 with partsCount parts and p2 is scratch793 space. */794 tmp = p1;795 p1 = p2;796 p2 = tmp;797 }798 799 pow5 += partsCount;800 }801 802 if (p1 != dst)803 APInt::tcAssign(dst, p1, result);804 805 return result;806}807 808/* Zero at the end to avoid modular arithmetic when adding one; used809 when rounding up during hexadecimal output. */810static const char hexDigitsLower[] = "0123456789abcdef0";811static const char hexDigitsUpper[] = "0123456789ABCDEF0";812static const char infinityL[] = "infinity";813static const char infinityU[] = "INFINITY";814static const char NaNL[] = "nan";815static const char NaNU[] = "NAN";816 817/* Write out an integerPart in hexadecimal, starting with the most818 significant nibble. Write out exactly COUNT hexdigits, return819 COUNT. */820static unsigned int821partAsHex (char *dst, APFloatBase::integerPart part, unsigned int count,822 const char *hexDigitChars)823{824 unsigned int result = count;825 826 assert(count != 0 && count <= APFloatBase::integerPartWidth / 4);827 828 part >>= (APFloatBase::integerPartWidth - 4 * count);829 while (count--) {830 dst[count] = hexDigitChars[part & 0xf];831 part >>= 4;832 }833 834 return result;835}836 837/* Write out an unsigned decimal integer. */838static char *839writeUnsignedDecimal (char *dst, unsigned int n)840{841 char buff[40], *p;842 843 p = buff;844 do845 *p++ = '0' + n % 10;846 while (n /= 10);847 848 do849 *dst++ = *--p;850 while (p != buff);851 852 return dst;853}854 855/* Write out a signed decimal integer. */856static char *857writeSignedDecimal (char *dst, int value)858{859 if (value < 0) {860 *dst++ = '-';861 dst = writeUnsignedDecimal(dst, -(unsigned) value);862 } else {863 dst = writeUnsignedDecimal(dst, value);864 }865 866 return dst;867}868 869// Compute the ULP of the input using a definition from:870// Jean-Michel Muller. On the definition of ulp(x). [Research Report] RR-5504,871// LIP RR-2005-09, INRIA, LIP. 2005, pp.16. inria-00070503872static APFloat harrisonUlp(const APFloat &X) {873 const fltSemantics &Sem = X.getSemantics();874 switch (X.getCategory()) {875 case APFloat::fcNaN:876 return APFloat::getQNaN(Sem);877 case APFloat::fcInfinity:878 return APFloat::getInf(Sem);879 case APFloat::fcZero:880 return APFloat::getSmallest(Sem);881 case APFloat::fcNormal:882 break;883 }884 if (X.isDenormal() || X.isSmallestNormalized())885 return APFloat::getSmallest(Sem);886 int Exp = ilogb(X);887 if (X.getExactLog2() != INT_MIN)888 Exp -= 1;889 return scalbn(APFloat::getOne(Sem), Exp - (Sem.precision - 1),890 APFloat::rmNearestTiesToEven);891}892 893namespace detail {894/* Constructors. */895void IEEEFloat::initialize(const fltSemantics *ourSemantics) {896 unsigned int count;897 898 semantics = ourSemantics;899 count = partCount();900 if (count > 1)901 significand.parts = new integerPart[count];902}903 904void IEEEFloat::freeSignificand() {905 if (needsCleanup())906 delete [] significand.parts;907}908 909void IEEEFloat::assign(const IEEEFloat &rhs) {910 assert(semantics == rhs.semantics);911 912 sign = rhs.sign;913 category = rhs.category;914 exponent = rhs.exponent;915 if (isFiniteNonZero() || category == fcNaN)916 copySignificand(rhs);917}918 919void IEEEFloat::copySignificand(const IEEEFloat &rhs) {920 assert(isFiniteNonZero() || category == fcNaN);921 assert(rhs.partCount() >= partCount());922 923 APInt::tcAssign(significandParts(), rhs.significandParts(),924 partCount());925}926 927/* Make this number a NaN, with an arbitrary but deterministic value928 for the significand. If double or longer, this is a signalling NaN,929 which may not be ideal. If float, this is QNaN(0). */930void IEEEFloat::makeNaN(bool SNaN, bool Negative, const APInt *fill) {931 if (semantics->nonFiniteBehavior == fltNonfiniteBehavior::FiniteOnly)932 llvm_unreachable("This floating point format does not support NaN");933 934 if (Negative && !semantics->hasSignedRepr)935 llvm_unreachable(936 "This floating point format does not support signed values");937 938 category = fcNaN;939 sign = Negative;940 exponent = exponentNaN();941 942 integerPart *significand = significandParts();943 unsigned numParts = partCount();944 945 APInt fill_storage;946 if (semantics->nonFiniteBehavior == fltNonfiniteBehavior::NanOnly) {947 // Finite-only types do not distinguish signalling and quiet NaN, so948 // make them all signalling.949 SNaN = false;950 if (semantics->nanEncoding == fltNanEncoding::NegativeZero) {951 sign = true;952 fill_storage = APInt::getZero(semantics->precision - 1);953 } else {954 fill_storage = APInt::getAllOnes(semantics->precision - 1);955 }956 fill = &fill_storage;957 }958 959 // Set the significand bits to the fill.960 if (!fill || fill->getNumWords() < numParts)961 APInt::tcSet(significand, 0, numParts);962 if (fill) {963 APInt::tcAssign(significand, fill->getRawData(),964 std::min(fill->getNumWords(), numParts));965 966 // Zero out the excess bits of the significand.967 unsigned bitsToPreserve = semantics->precision - 1;968 unsigned part = bitsToPreserve / 64;969 bitsToPreserve %= 64;970 significand[part] &= ((1ULL << bitsToPreserve) - 1);971 for (part++; part != numParts; ++part)972 significand[part] = 0;973 }974 975 unsigned QNaNBit =976 (semantics->precision >= 2) ? (semantics->precision - 2) : 0;977 978 if (SNaN) {979 // We always have to clear the QNaN bit to make it an SNaN.980 APInt::tcClearBit(significand, QNaNBit);981 982 // If there are no bits set in the payload, we have to set983 // *something* to make it a NaN instead of an infinity;984 // conventionally, this is the next bit down from the QNaN bit.985 if (APInt::tcIsZero(significand, numParts))986 APInt::tcSetBit(significand, QNaNBit - 1);987 } else if (semantics->nanEncoding == fltNanEncoding::NegativeZero) {988 // The only NaN is a quiet NaN, and it has no bits sets in the significand.989 // Do nothing.990 } else {991 // We always have to set the QNaN bit to make it a QNaN.992 APInt::tcSetBit(significand, QNaNBit);993 }994 995 // For x87 extended precision, we want to make a NaN, not a996 // pseudo-NaN. Maybe we should expose the ability to make997 // pseudo-NaNs?998 if (semantics == &APFloatBase::semX87DoubleExtended)999 APInt::tcSetBit(significand, QNaNBit + 1);1000}1001 1002IEEEFloat &IEEEFloat::operator=(const IEEEFloat &rhs) {1003 if (this != &rhs) {1004 if (semantics != rhs.semantics) {1005 freeSignificand();1006 initialize(rhs.semantics);1007 }1008 assign(rhs);1009 }1010 1011 return *this;1012}1013 1014IEEEFloat &IEEEFloat::operator=(IEEEFloat &&rhs) {1015 freeSignificand();1016 1017 semantics = rhs.semantics;1018 significand = rhs.significand;1019 exponent = rhs.exponent;1020 category = rhs.category;1021 sign = rhs.sign;1022 1023 rhs.semantics = &APFloatBase::semBogus;1024 return *this;1025}1026 1027bool IEEEFloat::isDenormal() const {1028 return isFiniteNonZero() && (exponent == semantics->minExponent) &&1029 (APInt::tcExtractBit(significandParts(),1030 semantics->precision - 1) == 0);1031}1032 1033bool IEEEFloat::isSmallest() const {1034 // The smallest number by magnitude in our format will be the smallest1035 // denormal, i.e. the floating point number with exponent being minimum1036 // exponent and significand bitwise equal to 1 (i.e. with MSB equal to 0).1037 return isFiniteNonZero() && exponent == semantics->minExponent &&1038 significandMSB() == 0;1039}1040 1041bool IEEEFloat::isSmallestNormalized() const {1042 return getCategory() == fcNormal && exponent == semantics->minExponent &&1043 isSignificandAllZerosExceptMSB();1044}1045 1046unsigned int IEEEFloat::getNumHighBits() const {1047 const unsigned int PartCount = partCountForBits(semantics->precision);1048 const unsigned int Bits = PartCount * integerPartWidth;1049 1050 // Compute how many bits are used in the final word.1051 // When precision is just 1, it represents the 'Pth'1052 // Precision bit and not the actual significand bit.1053 const unsigned int NumHighBits = (semantics->precision > 1)1054 ? (Bits - semantics->precision + 1)1055 : (Bits - semantics->precision);1056 return NumHighBits;1057}1058 1059bool IEEEFloat::isSignificandAllOnes() const {1060 // Test if the significand excluding the integral bit is all ones. This allows1061 // us to test for binade boundaries.1062 const integerPart *Parts = significandParts();1063 const unsigned PartCount = partCountForBits(semantics->precision);1064 for (unsigned i = 0; i < PartCount - 1; i++)1065 if (~Parts[i])1066 return false;1067 1068 // Set the unused high bits to all ones when we compare.1069 const unsigned NumHighBits = getNumHighBits();1070 assert(NumHighBits <= integerPartWidth && NumHighBits > 0 &&1071 "Can not have more high bits to fill than integerPartWidth");1072 const integerPart HighBitFill =1073 ~integerPart(0) << (integerPartWidth - NumHighBits);1074 if ((semantics->precision <= 1) || (~(Parts[PartCount - 1] | HighBitFill)))1075 return false;1076 1077 return true;1078}1079 1080bool IEEEFloat::isSignificandAllOnesExceptLSB() const {1081 // Test if the significand excluding the integral bit is all ones except for1082 // the least significant bit.1083 const integerPart *Parts = significandParts();1084 1085 if (Parts[0] & 1)1086 return false;1087 1088 const unsigned PartCount = partCountForBits(semantics->precision);1089 for (unsigned i = 0; i < PartCount - 1; i++) {1090 if (~Parts[i] & ~unsigned{!i})1091 return false;1092 }1093 1094 // Set the unused high bits to all ones when we compare.1095 const unsigned NumHighBits = getNumHighBits();1096 assert(NumHighBits <= integerPartWidth && NumHighBits > 0 &&1097 "Can not have more high bits to fill than integerPartWidth");1098 const integerPart HighBitFill = ~integerPart(0)1099 << (integerPartWidth - NumHighBits);1100 if (~(Parts[PartCount - 1] | HighBitFill | 0x1))1101 return false;1102 1103 return true;1104}1105 1106bool IEEEFloat::isSignificandAllZeros() const {1107 // Test if the significand excluding the integral bit is all zeros. This1108 // allows us to test for binade boundaries.1109 const integerPart *Parts = significandParts();1110 const unsigned PartCount = partCountForBits(semantics->precision);1111 1112 for (unsigned i = 0; i < PartCount - 1; i++)1113 if (Parts[i])1114 return false;1115 1116 // Compute how many bits are used in the final word.1117 const unsigned NumHighBits = getNumHighBits();1118 assert(NumHighBits < integerPartWidth && "Can not have more high bits to "1119 "clear than integerPartWidth");1120 const integerPart HighBitMask = ~integerPart(0) >> NumHighBits;1121 1122 if ((semantics->precision > 1) && (Parts[PartCount - 1] & HighBitMask))1123 return false;1124 1125 return true;1126}1127 1128bool IEEEFloat::isSignificandAllZerosExceptMSB() const {1129 const integerPart *Parts = significandParts();1130 const unsigned PartCount = partCountForBits(semantics->precision);1131 1132 for (unsigned i = 0; i < PartCount - 1; i++) {1133 if (Parts[i])1134 return false;1135 }1136 1137 const unsigned NumHighBits = getNumHighBits();1138 const integerPart MSBMask = integerPart(1)1139 << (integerPartWidth - NumHighBits);1140 return ((semantics->precision <= 1) || (Parts[PartCount - 1] == MSBMask));1141}1142 1143bool IEEEFloat::isLargest() const {1144 bool IsMaxExp = isFiniteNonZero() && exponent == semantics->maxExponent;1145 if (semantics->nonFiniteBehavior == fltNonfiniteBehavior::NanOnly &&1146 semantics->nanEncoding == fltNanEncoding::AllOnes) {1147 // The largest number by magnitude in our format will be the floating point1148 // number with maximum exponent and with significand that is all ones except1149 // the LSB.1150 return (IsMaxExp && APFloat::hasSignificand(*semantics))1151 ? isSignificandAllOnesExceptLSB()1152 : IsMaxExp;1153 } else {1154 // The largest number by magnitude in our format will be the floating point1155 // number with maximum exponent and with significand that is all ones.1156 return IsMaxExp && isSignificandAllOnes();1157 }1158}1159 1160bool IEEEFloat::isInteger() const {1161 // This could be made more efficient; I'm going for obviously correct.1162 if (!isFinite()) return false;1163 IEEEFloat truncated = *this;1164 truncated.roundToIntegral(rmTowardZero);1165 return compare(truncated) == cmpEqual;1166}1167 1168bool IEEEFloat::bitwiseIsEqual(const IEEEFloat &rhs) const {1169 if (this == &rhs)1170 return true;1171 if (semantics != rhs.semantics ||1172 category != rhs.category ||1173 sign != rhs.sign)1174 return false;1175 if (category==fcZero || category==fcInfinity)1176 return true;1177 1178 if (isFiniteNonZero() && exponent != rhs.exponent)1179 return false;1180 1181 return std::equal(significandParts(), significandParts() + partCount(),1182 rhs.significandParts());1183}1184 1185IEEEFloat::IEEEFloat(const fltSemantics &ourSemantics, integerPart value) {1186 initialize(&ourSemantics);1187 sign = 0;1188 category = fcNormal;1189 zeroSignificand();1190 exponent = ourSemantics.precision - 1;1191 significandParts()[0] = value;1192 normalize(rmNearestTiesToEven, lfExactlyZero);1193}1194 1195IEEEFloat::IEEEFloat(const fltSemantics &ourSemantics) {1196 initialize(&ourSemantics);1197 // The Float8E8MOFNU format does not have a representation1198 // for zero. So, use the closest representation instead.1199 // Moreover, the all-zero encoding represents a valid1200 // normal value (which is the smallestNormalized here).1201 // Hence, we call makeSmallestNormalized (where category is1202 // 'fcNormal') instead of makeZero (where category is 'fcZero').1203 ourSemantics.hasZero ? makeZero(false) : makeSmallestNormalized(false);1204}1205 1206// Delegate to the previous constructor, because later copy constructor may1207// actually inspects category, which can't be garbage.1208IEEEFloat::IEEEFloat(const fltSemantics &ourSemantics, uninitializedTag tag)1209 : IEEEFloat(ourSemantics) {}1210 1211IEEEFloat::IEEEFloat(const IEEEFloat &rhs) {1212 initialize(rhs.semantics);1213 assign(rhs);1214}1215 1216IEEEFloat::IEEEFloat(IEEEFloat &&rhs) : semantics(&APFloatBase::semBogus) {1217 *this = std::move(rhs);1218}1219 1220IEEEFloat::~IEEEFloat() { freeSignificand(); }1221 1222unsigned int IEEEFloat::partCount() const {1223 return partCountForBits(semantics->precision + 1);1224}1225 1226const APFloat::integerPart *IEEEFloat::significandParts() const {1227 return const_cast<IEEEFloat *>(this)->significandParts();1228}1229 1230APFloat::integerPart *IEEEFloat::significandParts() {1231 if (partCount() > 1)1232 return significand.parts;1233 else1234 return &significand.part;1235}1236 1237void IEEEFloat::zeroSignificand() {1238 APInt::tcSet(significandParts(), 0, partCount());1239}1240 1241/* Increment an fcNormal floating point number's significand. */1242void IEEEFloat::incrementSignificand() {1243 integerPart carry;1244 1245 carry = APInt::tcIncrement(significandParts(), partCount());1246 1247 /* Our callers should never cause us to overflow. */1248 assert(carry == 0);1249 (void)carry;1250}1251 1252/* Add the significand of the RHS. Returns the carry flag. */1253APFloat::integerPart IEEEFloat::addSignificand(const IEEEFloat &rhs) {1254 integerPart *parts;1255 1256 parts = significandParts();1257 1258 assert(semantics == rhs.semantics);1259 assert(exponent == rhs.exponent);1260 1261 return APInt::tcAdd(parts, rhs.significandParts(), 0, partCount());1262}1263 1264/* Subtract the significand of the RHS with a borrow flag. Returns1265 the borrow flag. */1266APFloat::integerPart IEEEFloat::subtractSignificand(const IEEEFloat &rhs,1267 integerPart borrow) {1268 integerPart *parts;1269 1270 parts = significandParts();1271 1272 assert(semantics == rhs.semantics);1273 assert(exponent == rhs.exponent);1274 1275 return APInt::tcSubtract(parts, rhs.significandParts(), borrow,1276 partCount());1277}1278 1279/* Multiply the significand of the RHS. If ADDEND is non-NULL, add it1280 on to the full-precision result of the multiplication. Returns the1281 lost fraction. */1282lostFraction IEEEFloat::multiplySignificand(const IEEEFloat &rhs,1283 IEEEFloat addend,1284 bool ignoreAddend) {1285 unsigned int omsb; // One, not zero, based MSB.1286 unsigned int partsCount, newPartsCount, precision;1287 integerPart *lhsSignificand;1288 integerPart scratch[4];1289 integerPart *fullSignificand;1290 lostFraction lost_fraction;1291 bool ignored;1292 1293 assert(semantics == rhs.semantics);1294 1295 precision = semantics->precision;1296 1297 // Allocate space for twice as many bits as the original significand, plus one1298 // extra bit for the addition to overflow into.1299 newPartsCount = partCountForBits(precision * 2 + 1);1300 1301 if (newPartsCount > 4)1302 fullSignificand = new integerPart[newPartsCount];1303 else1304 fullSignificand = scratch;1305 1306 lhsSignificand = significandParts();1307 partsCount = partCount();1308 1309 APInt::tcFullMultiply(fullSignificand, lhsSignificand,1310 rhs.significandParts(), partsCount, partsCount);1311 1312 lost_fraction = lfExactlyZero;1313 omsb = APInt::tcMSB(fullSignificand, newPartsCount) + 1;1314 exponent += rhs.exponent;1315 1316 // Assume the operands involved in the multiplication are single-precision1317 // FP, and the two multiplicants are:1318 // *this = a23 . a22 ... a0 * 2^e11319 // rhs = b23 . b22 ... b0 * 2^e21320 // the result of multiplication is:1321 // *this = c48 c47 c46 . c45 ... c0 * 2^(e1+e2)1322 // Note that there are three significant bits at the left-hand side of the1323 // radix point: two for the multiplication, and an overflow bit for the1324 // addition (that will always be zero at this point). Move the radix point1325 // toward left by two bits, and adjust exponent accordingly.1326 exponent += 2;1327 1328 if (!ignoreAddend && addend.isNonZero()) {1329 // The intermediate result of the multiplication has "2 * precision"1330 // signicant bit; adjust the addend to be consistent with mul result.1331 //1332 Significand savedSignificand = significand;1333 const fltSemantics *savedSemantics = semantics;1334 fltSemantics extendedSemantics;1335 opStatus status;1336 unsigned int extendedPrecision;1337 1338 // Normalize our MSB to one below the top bit to allow for overflow.1339 extendedPrecision = 2 * precision + 1;1340 if (omsb != extendedPrecision - 1) {1341 assert(extendedPrecision > omsb);1342 APInt::tcShiftLeft(fullSignificand, newPartsCount,1343 (extendedPrecision - 1) - omsb);1344 exponent -= (extendedPrecision - 1) - omsb;1345 }1346 1347 /* Create new semantics. */1348 extendedSemantics = *semantics;1349 extendedSemantics.precision = extendedPrecision;1350 1351 if (newPartsCount == 1)1352 significand.part = fullSignificand[0];1353 else1354 significand.parts = fullSignificand;1355 semantics = &extendedSemantics;1356 1357 // Make a copy so we can convert it to the extended semantics.1358 // Note that we cannot convert the addend directly, as the extendedSemantics1359 // is a local variable (which we take a reference to).1360 IEEEFloat extendedAddend(addend);1361 status = extendedAddend.convert(extendedSemantics, APFloat::rmTowardZero,1362 &ignored);1363 assert(status == APFloat::opOK);1364 (void)status;1365 1366 // Shift the significand of the addend right by one bit. This guarantees1367 // that the high bit of the significand is zero (same as fullSignificand),1368 // so the addition will overflow (if it does overflow at all) into the top bit.1369 lost_fraction = extendedAddend.shiftSignificandRight(1);1370 assert(lost_fraction == lfExactlyZero &&1371 "Lost precision while shifting addend for fused-multiply-add.");1372 1373 lost_fraction = addOrSubtractSignificand(extendedAddend, false);1374 1375 /* Restore our state. */1376 if (newPartsCount == 1)1377 fullSignificand[0] = significand.part;1378 significand = savedSignificand;1379 semantics = savedSemantics;1380 1381 omsb = APInt::tcMSB(fullSignificand, newPartsCount) + 1;1382 }1383 1384 // Convert the result having "2 * precision" significant-bits back to the one1385 // having "precision" significant-bits. First, move the radix point from1386 // poision "2*precision - 1" to "precision - 1". The exponent need to be1387 // adjusted by "2*precision - 1" - "precision - 1" = "precision".1388 exponent -= precision + 1;1389 1390 // In case MSB resides at the left-hand side of radix point, shift the1391 // mantissa right by some amount to make sure the MSB reside right before1392 // the radix point (i.e. "MSB . rest-significant-bits").1393 //1394 // Note that the result is not normalized when "omsb < precision". So, the1395 // caller needs to call IEEEFloat::normalize() if normalized value is1396 // expected.1397 if (omsb > precision) {1398 unsigned int bits, significantParts;1399 lostFraction lf;1400 1401 bits = omsb - precision;1402 significantParts = partCountForBits(omsb);1403 lf = shiftRight(fullSignificand, significantParts, bits);1404 lost_fraction = combineLostFractions(lf, lost_fraction);1405 exponent += bits;1406 }1407 1408 APInt::tcAssign(lhsSignificand, fullSignificand, partsCount);1409 1410 if (newPartsCount > 4)1411 delete [] fullSignificand;1412 1413 return lost_fraction;1414}1415 1416lostFraction IEEEFloat::multiplySignificand(const IEEEFloat &rhs) {1417 // When the given semantics has zero, the addend here is a zero.1418 // i.e . it belongs to the 'fcZero' category.1419 // But when the semantics does not support zero, we need to1420 // explicitly convey that this addend should be ignored1421 // for multiplication.1422 return multiplySignificand(rhs, IEEEFloat(*semantics), !semantics->hasZero);1423}1424 1425/* Multiply the significands of LHS and RHS to DST. */1426lostFraction IEEEFloat::divideSignificand(const IEEEFloat &rhs) {1427 unsigned int bit, i, partsCount;1428 const integerPart *rhsSignificand;1429 integerPart *lhsSignificand, *dividend, *divisor;1430 integerPart scratch[4];1431 lostFraction lost_fraction;1432 1433 assert(semantics == rhs.semantics);1434 1435 lhsSignificand = significandParts();1436 rhsSignificand = rhs.significandParts();1437 partsCount = partCount();1438 1439 if (partsCount > 2)1440 dividend = new integerPart[partsCount * 2];1441 else1442 dividend = scratch;1443 1444 divisor = dividend + partsCount;1445 1446 /* Copy the dividend and divisor as they will be modified in-place. */1447 for (i = 0; i < partsCount; i++) {1448 dividend[i] = lhsSignificand[i];1449 divisor[i] = rhsSignificand[i];1450 lhsSignificand[i] = 0;1451 }1452 1453 exponent -= rhs.exponent;1454 1455 unsigned int precision = semantics->precision;1456 1457 /* Normalize the divisor. */1458 bit = precision - APInt::tcMSB(divisor, partsCount) - 1;1459 if (bit) {1460 exponent += bit;1461 APInt::tcShiftLeft(divisor, partsCount, bit);1462 }1463 1464 /* Normalize the dividend. */1465 bit = precision - APInt::tcMSB(dividend, partsCount) - 1;1466 if (bit) {1467 exponent -= bit;1468 APInt::tcShiftLeft(dividend, partsCount, bit);1469 }1470 1471 /* Ensure the dividend >= divisor initially for the loop below.1472 Incidentally, this means that the division loop below is1473 guaranteed to set the integer bit to one. */1474 if (APInt::tcCompare(dividend, divisor, partsCount) < 0) {1475 exponent--;1476 APInt::tcShiftLeft(dividend, partsCount, 1);1477 assert(APInt::tcCompare(dividend, divisor, partsCount) >= 0);1478 }1479 1480 /* Long division. */1481 for (bit = precision; bit; bit -= 1) {1482 if (APInt::tcCompare(dividend, divisor, partsCount) >= 0) {1483 APInt::tcSubtract(dividend, divisor, 0, partsCount);1484 APInt::tcSetBit(lhsSignificand, bit - 1);1485 }1486 1487 APInt::tcShiftLeft(dividend, partsCount, 1);1488 }1489 1490 /* Figure out the lost fraction. */1491 int cmp = APInt::tcCompare(dividend, divisor, partsCount);1492 1493 if (cmp > 0)1494 lost_fraction = lfMoreThanHalf;1495 else if (cmp == 0)1496 lost_fraction = lfExactlyHalf;1497 else if (APInt::tcIsZero(dividend, partsCount))1498 lost_fraction = lfExactlyZero;1499 else1500 lost_fraction = lfLessThanHalf;1501 1502 if (partsCount > 2)1503 delete [] dividend;1504 1505 return lost_fraction;1506}1507 1508unsigned int IEEEFloat::significandMSB() const {1509 return APInt::tcMSB(significandParts(), partCount());1510}1511 1512unsigned int IEEEFloat::significandLSB() const {1513 return APInt::tcLSB(significandParts(), partCount());1514}1515 1516/* Note that a zero result is NOT normalized to fcZero. */1517lostFraction IEEEFloat::shiftSignificandRight(unsigned int bits) {1518 /* Our exponent should not overflow. */1519 assert((ExponentType) (exponent + bits) >= exponent);1520 1521 exponent += bits;1522 1523 return shiftRight(significandParts(), partCount(), bits);1524}1525 1526/* Shift the significand left BITS bits, subtract BITS from its exponent. */1527void IEEEFloat::shiftSignificandLeft(unsigned int bits) {1528 assert(bits < semantics->precision ||1529 (semantics->precision == 1 && bits <= 1));1530 1531 if (bits) {1532 unsigned int partsCount = partCount();1533 1534 APInt::tcShiftLeft(significandParts(), partsCount, bits);1535 exponent -= bits;1536 1537 assert(!APInt::tcIsZero(significandParts(), partsCount));1538 }1539}1540 1541APFloat::cmpResult IEEEFloat::compareAbsoluteValue(const IEEEFloat &rhs) const {1542 int compare;1543 1544 assert(semantics == rhs.semantics);1545 assert(isFiniteNonZero());1546 assert(rhs.isFiniteNonZero());1547 1548 compare = exponent - rhs.exponent;1549 1550 /* If exponents are equal, do an unsigned bignum comparison of the1551 significands. */1552 if (compare == 0)1553 compare = APInt::tcCompare(significandParts(), rhs.significandParts(),1554 partCount());1555 1556 if (compare > 0)1557 return cmpGreaterThan;1558 else if (compare < 0)1559 return cmpLessThan;1560 else1561 return cmpEqual;1562}1563 1564/* Set the least significant BITS bits of a bignum, clear the1565 rest. */1566static void tcSetLeastSignificantBits(APInt::WordType *dst, unsigned parts,1567 unsigned bits) {1568 unsigned i = 0;1569 while (bits > APInt::APINT_BITS_PER_WORD) {1570 dst[i++] = ~(APInt::WordType)0;1571 bits -= APInt::APINT_BITS_PER_WORD;1572 }1573 1574 if (bits)1575 dst[i++] = ~(APInt::WordType)0 >> (APInt::APINT_BITS_PER_WORD - bits);1576 1577 while (i < parts)1578 dst[i++] = 0;1579}1580 1581/* Handle overflow. Sign is preserved. We either become infinity or1582 the largest finite number. */1583APFloat::opStatus IEEEFloat::handleOverflow(roundingMode rounding_mode) {1584 if (semantics->nonFiniteBehavior != fltNonfiniteBehavior::FiniteOnly) {1585 /* Infinity? */1586 if (rounding_mode == rmNearestTiesToEven ||1587 rounding_mode == rmNearestTiesToAway ||1588 (rounding_mode == rmTowardPositive && !sign) ||1589 (rounding_mode == rmTowardNegative && sign)) {1590 if (semantics->nonFiniteBehavior == fltNonfiniteBehavior::NanOnly)1591 makeNaN(false, sign);1592 else1593 category = fcInfinity;1594 return static_cast<opStatus>(opOverflow | opInexact);1595 }1596 }1597 1598 /* Otherwise we become the largest finite number. */1599 category = fcNormal;1600 exponent = semantics->maxExponent;1601 tcSetLeastSignificantBits(significandParts(), partCount(),1602 semantics->precision);1603 if (semantics->nonFiniteBehavior == fltNonfiniteBehavior::NanOnly &&1604 semantics->nanEncoding == fltNanEncoding::AllOnes)1605 APInt::tcClearBit(significandParts(), 0);1606 1607 return opInexact;1608}1609 1610/* Returns TRUE if, when truncating the current number, with BIT the1611 new LSB, with the given lost fraction and rounding mode, the result1612 would need to be rounded away from zero (i.e., by increasing the1613 signficand). This routine must work for fcZero of both signs, and1614 fcNormal numbers. */1615bool IEEEFloat::roundAwayFromZero(roundingMode rounding_mode,1616 lostFraction lost_fraction,1617 unsigned int bit) const {1618 /* NaNs and infinities should not have lost fractions. */1619 assert(isFiniteNonZero() || category == fcZero);1620 1621 /* Current callers never pass this so we don't handle it. */1622 assert(lost_fraction != lfExactlyZero);1623 1624 switch (rounding_mode) {1625 case rmNearestTiesToAway:1626 return lost_fraction == lfExactlyHalf || lost_fraction == lfMoreThanHalf;1627 1628 case rmNearestTiesToEven:1629 if (lost_fraction == lfMoreThanHalf)1630 return true;1631 1632 /* Our zeroes don't have a significand to test. */1633 if (lost_fraction == lfExactlyHalf && category != fcZero)1634 return APInt::tcExtractBit(significandParts(), bit);1635 1636 return false;1637 1638 case rmTowardZero:1639 return false;1640 1641 case rmTowardPositive:1642 return !sign;1643 1644 case rmTowardNegative:1645 return sign;1646 1647 default:1648 break;1649 }1650 llvm_unreachable("Invalid rounding mode found");1651}1652 1653APFloat::opStatus IEEEFloat::normalize(roundingMode rounding_mode,1654 lostFraction lost_fraction) {1655 unsigned int omsb; /* One, not zero, based MSB. */1656 int exponentChange;1657 1658 if (!isFiniteNonZero())1659 return opOK;1660 1661 /* Before rounding normalize the exponent of fcNormal numbers. */1662 omsb = significandMSB() + 1;1663 1664 // Only skip this `if` if the value is exactly zero.1665 if (omsb || lost_fraction != lfExactlyZero) {1666 /* OMSB is numbered from 1. We want to place it in the integer1667 bit numbered PRECISION if possible, with a compensating change in1668 the exponent. */1669 exponentChange = omsb - semantics->precision;1670 1671 /* If the resulting exponent is too high, overflow according to1672 the rounding mode. */1673 if (exponent + exponentChange > semantics->maxExponent)1674 return handleOverflow(rounding_mode);1675 1676 /* Subnormal numbers have exponent minExponent, and their MSB1677 is forced based on that. */1678 if (exponent + exponentChange < semantics->minExponent)1679 exponentChange = semantics->minExponent - exponent;1680 1681 /* Shifting left is easy as we don't lose precision. */1682 if (exponentChange < 0) {1683 assert(lost_fraction == lfExactlyZero);1684 1685 shiftSignificandLeft(-exponentChange);1686 1687 return opOK;1688 }1689 1690 if (exponentChange > 0) {1691 lostFraction lf;1692 1693 /* Shift right and capture any new lost fraction. */1694 lf = shiftSignificandRight(exponentChange);1695 1696 lost_fraction = combineLostFractions(lf, lost_fraction);1697 1698 /* Keep OMSB up-to-date. */1699 if (omsb > (unsigned) exponentChange)1700 omsb -= exponentChange;1701 else1702 omsb = 0;1703 }1704 }1705 1706 // The all-ones values is an overflow if NaN is all ones. If NaN is1707 // represented by negative zero, then it is a valid finite value.1708 if (semantics->nonFiniteBehavior == fltNonfiniteBehavior::NanOnly &&1709 semantics->nanEncoding == fltNanEncoding::AllOnes &&1710 exponent == semantics->maxExponent && isSignificandAllOnes())1711 return handleOverflow(rounding_mode);1712 1713 /* Now round the number according to rounding_mode given the lost1714 fraction. */1715 1716 /* As specified in IEEE 754, since we do not trap we do not report1717 underflow for exact results. */1718 if (lost_fraction == lfExactlyZero) {1719 /* Canonicalize zeroes. */1720 if (omsb == 0) {1721 category = fcZero;1722 if (semantics->nanEncoding == fltNanEncoding::NegativeZero)1723 sign = false;1724 if (!semantics->hasZero)1725 makeSmallestNormalized(false);1726 }1727 1728 return opOK;1729 }1730 1731 /* Increment the significand if we're rounding away from zero. */1732 if (roundAwayFromZero(rounding_mode, lost_fraction, 0)) {1733 if (omsb == 0)1734 exponent = semantics->minExponent;1735 1736 incrementSignificand();1737 omsb = significandMSB() + 1;1738 1739 /* Did the significand increment overflow? */1740 if (omsb == (unsigned) semantics->precision + 1) {1741 /* Renormalize by incrementing the exponent and shifting our1742 significand right one. However if we already have the1743 maximum exponent we overflow to infinity. */1744 if (exponent == semantics->maxExponent)1745 // Invoke overflow handling with a rounding mode that will guarantee1746 // that the result gets turned into the correct infinity representation.1747 // This is needed instead of just setting the category to infinity to1748 // account for 8-bit floating point types that have no inf, only NaN.1749 return handleOverflow(sign ? rmTowardNegative : rmTowardPositive);1750 1751 shiftSignificandRight(1);1752 1753 return opInexact;1754 }1755 1756 // The all-ones values is an overflow if NaN is all ones. If NaN is1757 // represented by negative zero, then it is a valid finite value.1758 if (semantics->nonFiniteBehavior == fltNonfiniteBehavior::NanOnly &&1759 semantics->nanEncoding == fltNanEncoding::AllOnes &&1760 exponent == semantics->maxExponent && isSignificandAllOnes())1761 return handleOverflow(rounding_mode);1762 }1763 1764 /* The normal case - we were and are not denormal, and any1765 significand increment above didn't overflow. */1766 if (omsb == semantics->precision)1767 return opInexact;1768 1769 /* We have a non-zero denormal. */1770 assert(omsb < semantics->precision);1771 1772 /* Canonicalize zeroes. */1773 if (omsb == 0) {1774 category = fcZero;1775 if (semantics->nanEncoding == fltNanEncoding::NegativeZero)1776 sign = false;1777 // This condition handles the case where the semantics1778 // does not have zero but uses the all-zero encoding1779 // to represent the smallest normal value.1780 if (!semantics->hasZero)1781 makeSmallestNormalized(false);1782 }1783 1784 /* The fcZero case is a denormal that underflowed to zero. */1785 return (opStatus) (opUnderflow | opInexact);1786}1787 1788APFloat::opStatus IEEEFloat::addOrSubtractSpecials(const IEEEFloat &rhs,1789 bool subtract) {1790 switch (PackCategoriesIntoKey(category, rhs.category)) {1791 default:1792 llvm_unreachable(nullptr);1793 1794 case PackCategoriesIntoKey(fcZero, fcNaN):1795 case PackCategoriesIntoKey(fcNormal, fcNaN):1796 case PackCategoriesIntoKey(fcInfinity, fcNaN):1797 assign(rhs);1798 [[fallthrough]];1799 case PackCategoriesIntoKey(fcNaN, fcZero):1800 case PackCategoriesIntoKey(fcNaN, fcNormal):1801 case PackCategoriesIntoKey(fcNaN, fcInfinity):1802 case PackCategoriesIntoKey(fcNaN, fcNaN):1803 if (isSignaling()) {1804 makeQuiet();1805 return opInvalidOp;1806 }1807 return rhs.isSignaling() ? opInvalidOp : opOK;1808 1809 case PackCategoriesIntoKey(fcNormal, fcZero):1810 case PackCategoriesIntoKey(fcInfinity, fcNormal):1811 case PackCategoriesIntoKey(fcInfinity, fcZero):1812 return opOK;1813 1814 case PackCategoriesIntoKey(fcNormal, fcInfinity):1815 case PackCategoriesIntoKey(fcZero, fcInfinity):1816 category = fcInfinity;1817 sign = rhs.sign ^ subtract;1818 return opOK;1819 1820 case PackCategoriesIntoKey(fcZero, fcNormal):1821 assign(rhs);1822 sign = rhs.sign ^ subtract;1823 return opOK;1824 1825 case PackCategoriesIntoKey(fcZero, fcZero):1826 /* Sign depends on rounding mode; handled by caller. */1827 return opOK;1828 1829 case PackCategoriesIntoKey(fcInfinity, fcInfinity):1830 /* Differently signed infinities can only be validly1831 subtracted. */1832 if (((sign ^ rhs.sign)!=0) != subtract) {1833 makeNaN();1834 return opInvalidOp;1835 }1836 1837 return opOK;1838 1839 case PackCategoriesIntoKey(fcNormal, fcNormal):1840 return opDivByZero;1841 }1842}1843 1844/* Add or subtract two normal numbers. */1845lostFraction IEEEFloat::addOrSubtractSignificand(const IEEEFloat &rhs,1846 bool subtract) {1847 integerPart carry = 0;1848 lostFraction lost_fraction;1849 int bits;1850 1851 /* Determine if the operation on the absolute values is effectively1852 an addition or subtraction. */1853 subtract ^= static_cast<bool>(sign ^ rhs.sign);1854 1855 /* Are we bigger exponent-wise than the RHS? */1856 bits = exponent - rhs.exponent;1857 1858 /* Subtraction is more subtle than one might naively expect. */1859 if (subtract) {1860 if ((bits < 0) && !semantics->hasSignedRepr)1861 llvm_unreachable(1862 "This floating point format does not support signed values");1863 1864 IEEEFloat temp_rhs(rhs);1865 bool lost_fraction_is_from_rhs = false;1866 1867 if (bits == 0)1868 lost_fraction = lfExactlyZero;1869 else if (bits > 0) {1870 lost_fraction = temp_rhs.shiftSignificandRight(bits - 1);1871 lost_fraction_is_from_rhs = true;1872 shiftSignificandLeft(1);1873 } else {1874 lost_fraction = shiftSignificandRight(-bits - 1);1875 temp_rhs.shiftSignificandLeft(1);1876 }1877 1878 // Should we reverse the subtraction.1879 cmpResult cmp_result = compareAbsoluteValue(temp_rhs);1880 if (cmp_result == cmpLessThan) {1881 bool borrow =1882 lost_fraction != lfExactlyZero && !lost_fraction_is_from_rhs;1883 if (borrow) {1884 // The lost fraction is being subtracted, borrow from the significand1885 // and invert `lost_fraction`.1886 if (lost_fraction == lfLessThanHalf)1887 lost_fraction = lfMoreThanHalf;1888 else if (lost_fraction == lfMoreThanHalf)1889 lost_fraction = lfLessThanHalf;1890 }1891 carry = temp_rhs.subtractSignificand(*this, borrow);1892 copySignificand(temp_rhs);1893 sign = !sign;1894 } else if (cmp_result == cmpGreaterThan) {1895 bool borrow = lost_fraction != lfExactlyZero && lost_fraction_is_from_rhs;1896 if (borrow) {1897 // The lost fraction is being subtracted, borrow from the significand1898 // and invert `lost_fraction`.1899 if (lost_fraction == lfLessThanHalf)1900 lost_fraction = lfMoreThanHalf;1901 else if (lost_fraction == lfMoreThanHalf)1902 lost_fraction = lfLessThanHalf;1903 }1904 carry = subtractSignificand(temp_rhs, borrow);1905 } else { // cmpEqual1906 zeroSignificand();1907 if (lost_fraction != lfExactlyZero && lost_fraction_is_from_rhs) {1908 // rhs is slightly larger due to the lost fraction, flip the sign.1909 sign = !sign;1910 }1911 }1912 1913 /* The code above is intended to ensure that no borrow is1914 necessary. */1915 assert(!carry);1916 (void)carry;1917 } else {1918 if (bits > 0) {1919 IEEEFloat temp_rhs(rhs);1920 1921 lost_fraction = temp_rhs.shiftSignificandRight(bits);1922 carry = addSignificand(temp_rhs);1923 } else {1924 lost_fraction = shiftSignificandRight(-bits);1925 carry = addSignificand(rhs);1926 }1927 1928 /* We have a guard bit; generating a carry cannot happen. */1929 assert(!carry);1930 (void)carry;1931 }1932 1933 return lost_fraction;1934}1935 1936APFloat::opStatus IEEEFloat::multiplySpecials(const IEEEFloat &rhs) {1937 switch (PackCategoriesIntoKey(category, rhs.category)) {1938 default:1939 llvm_unreachable(nullptr);1940 1941 case PackCategoriesIntoKey(fcZero, fcNaN):1942 case PackCategoriesIntoKey(fcNormal, fcNaN):1943 case PackCategoriesIntoKey(fcInfinity, fcNaN):1944 assign(rhs);1945 sign = false;1946 [[fallthrough]];1947 case PackCategoriesIntoKey(fcNaN, fcZero):1948 case PackCategoriesIntoKey(fcNaN, fcNormal):1949 case PackCategoriesIntoKey(fcNaN, fcInfinity):1950 case PackCategoriesIntoKey(fcNaN, fcNaN):1951 sign ^= rhs.sign; // restore the original sign1952 if (isSignaling()) {1953 makeQuiet();1954 return opInvalidOp;1955 }1956 return rhs.isSignaling() ? opInvalidOp : opOK;1957 1958 case PackCategoriesIntoKey(fcNormal, fcInfinity):1959 case PackCategoriesIntoKey(fcInfinity, fcNormal):1960 case PackCategoriesIntoKey(fcInfinity, fcInfinity):1961 category = fcInfinity;1962 return opOK;1963 1964 case PackCategoriesIntoKey(fcZero, fcNormal):1965 case PackCategoriesIntoKey(fcNormal, fcZero):1966 case PackCategoriesIntoKey(fcZero, fcZero):1967 category = fcZero;1968 return opOK;1969 1970 case PackCategoriesIntoKey(fcZero, fcInfinity):1971 case PackCategoriesIntoKey(fcInfinity, fcZero):1972 makeNaN();1973 return opInvalidOp;1974 1975 case PackCategoriesIntoKey(fcNormal, fcNormal):1976 return opOK;1977 }1978}1979 1980APFloat::opStatus IEEEFloat::divideSpecials(const IEEEFloat &rhs) {1981 switch (PackCategoriesIntoKey(category, rhs.category)) {1982 default:1983 llvm_unreachable(nullptr);1984 1985 case PackCategoriesIntoKey(fcZero, fcNaN):1986 case PackCategoriesIntoKey(fcNormal, fcNaN):1987 case PackCategoriesIntoKey(fcInfinity, fcNaN):1988 assign(rhs);1989 sign = false;1990 [[fallthrough]];1991 case PackCategoriesIntoKey(fcNaN, fcZero):1992 case PackCategoriesIntoKey(fcNaN, fcNormal):1993 case PackCategoriesIntoKey(fcNaN, fcInfinity):1994 case PackCategoriesIntoKey(fcNaN, fcNaN):1995 sign ^= rhs.sign; // restore the original sign1996 if (isSignaling()) {1997 makeQuiet();1998 return opInvalidOp;1999 }2000 return rhs.isSignaling() ? opInvalidOp : opOK;2001 2002 case PackCategoriesIntoKey(fcInfinity, fcZero):2003 case PackCategoriesIntoKey(fcInfinity, fcNormal):2004 case PackCategoriesIntoKey(fcZero, fcInfinity):2005 case PackCategoriesIntoKey(fcZero, fcNormal):2006 return opOK;2007 2008 case PackCategoriesIntoKey(fcNormal, fcInfinity):2009 category = fcZero;2010 return opOK;2011 2012 case PackCategoriesIntoKey(fcNormal, fcZero):2013 if (semantics->nonFiniteBehavior == fltNonfiniteBehavior::NanOnly)2014 makeNaN(false, sign);2015 else2016 category = fcInfinity;2017 return opDivByZero;2018 2019 case PackCategoriesIntoKey(fcInfinity, fcInfinity):2020 case PackCategoriesIntoKey(fcZero, fcZero):2021 makeNaN();2022 return opInvalidOp;2023 2024 case PackCategoriesIntoKey(fcNormal, fcNormal):2025 return opOK;2026 }2027}2028 2029APFloat::opStatus IEEEFloat::modSpecials(const IEEEFloat &rhs) {2030 switch (PackCategoriesIntoKey(category, rhs.category)) {2031 default:2032 llvm_unreachable(nullptr);2033 2034 case PackCategoriesIntoKey(fcZero, fcNaN):2035 case PackCategoriesIntoKey(fcNormal, fcNaN):2036 case PackCategoriesIntoKey(fcInfinity, fcNaN):2037 assign(rhs);2038 [[fallthrough]];2039 case PackCategoriesIntoKey(fcNaN, fcZero):2040 case PackCategoriesIntoKey(fcNaN, fcNormal):2041 case PackCategoriesIntoKey(fcNaN, fcInfinity):2042 case PackCategoriesIntoKey(fcNaN, fcNaN):2043 if (isSignaling()) {2044 makeQuiet();2045 return opInvalidOp;2046 }2047 return rhs.isSignaling() ? opInvalidOp : opOK;2048 2049 case PackCategoriesIntoKey(fcZero, fcInfinity):2050 case PackCategoriesIntoKey(fcZero, fcNormal):2051 case PackCategoriesIntoKey(fcNormal, fcInfinity):2052 return opOK;2053 2054 case PackCategoriesIntoKey(fcNormal, fcZero):2055 case PackCategoriesIntoKey(fcInfinity, fcZero):2056 case PackCategoriesIntoKey(fcInfinity, fcNormal):2057 case PackCategoriesIntoKey(fcInfinity, fcInfinity):2058 case PackCategoriesIntoKey(fcZero, fcZero):2059 makeNaN();2060 return opInvalidOp;2061 2062 case PackCategoriesIntoKey(fcNormal, fcNormal):2063 return opOK;2064 }2065}2066 2067APFloat::opStatus IEEEFloat::remainderSpecials(const IEEEFloat &rhs) {2068 switch (PackCategoriesIntoKey(category, rhs.category)) {2069 default:2070 llvm_unreachable(nullptr);2071 2072 case PackCategoriesIntoKey(fcZero, fcNaN):2073 case PackCategoriesIntoKey(fcNormal, fcNaN):2074 case PackCategoriesIntoKey(fcInfinity, fcNaN):2075 assign(rhs);2076 [[fallthrough]];2077 case PackCategoriesIntoKey(fcNaN, fcZero):2078 case PackCategoriesIntoKey(fcNaN, fcNormal):2079 case PackCategoriesIntoKey(fcNaN, fcInfinity):2080 case PackCategoriesIntoKey(fcNaN, fcNaN):2081 if (isSignaling()) {2082 makeQuiet();2083 return opInvalidOp;2084 }2085 return rhs.isSignaling() ? opInvalidOp : opOK;2086 2087 case PackCategoriesIntoKey(fcZero, fcInfinity):2088 case PackCategoriesIntoKey(fcZero, fcNormal):2089 case PackCategoriesIntoKey(fcNormal, fcInfinity):2090 return opOK;2091 2092 case PackCategoriesIntoKey(fcNormal, fcZero):2093 case PackCategoriesIntoKey(fcInfinity, fcZero):2094 case PackCategoriesIntoKey(fcInfinity, fcNormal):2095 case PackCategoriesIntoKey(fcInfinity, fcInfinity):2096 case PackCategoriesIntoKey(fcZero, fcZero):2097 makeNaN();2098 return opInvalidOp;2099 2100 case PackCategoriesIntoKey(fcNormal, fcNormal):2101 return opDivByZero; // fake status, indicating this is not a special case2102 }2103}2104 2105/* Change sign. */2106void IEEEFloat::changeSign() {2107 // With NaN-as-negative-zero, neither NaN or negative zero can change2108 // their signs.2109 if (semantics->nanEncoding == fltNanEncoding::NegativeZero &&2110 (isZero() || isNaN()))2111 return;2112 /* Look mummy, this one's easy. */2113 sign = !sign;2114}2115 2116/* Normalized addition or subtraction. */2117APFloat::opStatus IEEEFloat::addOrSubtract(const IEEEFloat &rhs,2118 roundingMode rounding_mode,2119 bool subtract) {2120 opStatus fs;2121 2122 fs = addOrSubtractSpecials(rhs, subtract);2123 2124 /* This return code means it was not a simple case. */2125 if (fs == opDivByZero) {2126 lostFraction lost_fraction;2127 2128 lost_fraction = addOrSubtractSignificand(rhs, subtract);2129 fs = normalize(rounding_mode, lost_fraction);2130 2131 /* Can only be zero if we lost no fraction. */2132 assert(category != fcZero || lost_fraction == lfExactlyZero);2133 }2134 2135 /* If two numbers add (exactly) to zero, IEEE 754 decrees it is a2136 positive zero unless rounding to minus infinity, except that2137 adding two like-signed zeroes gives that zero. */2138 if (category == fcZero) {2139 if (rhs.category != fcZero || (sign == rhs.sign) == subtract)2140 sign = (rounding_mode == rmTowardNegative);2141 // NaN-in-negative-zero means zeros need to be normalized to +0.2142 if (semantics->nanEncoding == fltNanEncoding::NegativeZero)2143 sign = false;2144 }2145 2146 return fs;2147}2148 2149/* Normalized addition. */2150APFloat::opStatus IEEEFloat::add(const IEEEFloat &rhs,2151 roundingMode rounding_mode) {2152 return addOrSubtract(rhs, rounding_mode, false);2153}2154 2155/* Normalized subtraction. */2156APFloat::opStatus IEEEFloat::subtract(const IEEEFloat &rhs,2157 roundingMode rounding_mode) {2158 return addOrSubtract(rhs, rounding_mode, true);2159}2160 2161/* Normalized multiply. */2162APFloat::opStatus IEEEFloat::multiply(const IEEEFloat &rhs,2163 roundingMode rounding_mode) {2164 opStatus fs;2165 2166 sign ^= rhs.sign;2167 fs = multiplySpecials(rhs);2168 2169 if (isZero() && semantics->nanEncoding == fltNanEncoding::NegativeZero)2170 sign = false;2171 if (isFiniteNonZero()) {2172 lostFraction lost_fraction = multiplySignificand(rhs);2173 fs = normalize(rounding_mode, lost_fraction);2174 if (lost_fraction != lfExactlyZero)2175 fs = (opStatus) (fs | opInexact);2176 }2177 2178 return fs;2179}2180 2181/* Normalized divide. */2182APFloat::opStatus IEEEFloat::divide(const IEEEFloat &rhs,2183 roundingMode rounding_mode) {2184 opStatus fs;2185 2186 sign ^= rhs.sign;2187 fs = divideSpecials(rhs);2188 2189 if (isZero() && semantics->nanEncoding == fltNanEncoding::NegativeZero)2190 sign = false;2191 if (isFiniteNonZero()) {2192 lostFraction lost_fraction = divideSignificand(rhs);2193 fs = normalize(rounding_mode, lost_fraction);2194 if (lost_fraction != lfExactlyZero)2195 fs = (opStatus) (fs | opInexact);2196 }2197 2198 return fs;2199}2200 2201/* Normalized remainder. */2202APFloat::opStatus IEEEFloat::remainder(const IEEEFloat &rhs) {2203 opStatus fs;2204 unsigned int origSign = sign;2205 2206 // First handle the special cases.2207 fs = remainderSpecials(rhs);2208 if (fs != opDivByZero)2209 return fs;2210 2211 fs = opOK;2212 2213 // Make sure the current value is less than twice the denom. If the addition2214 // did not succeed (an overflow has happened), which means that the finite2215 // value we currently posses must be less than twice the denom (as we are2216 // using the same semantics).2217 IEEEFloat P2 = rhs;2218 if (P2.add(rhs, rmNearestTiesToEven) == opOK) {2219 fs = mod(P2);2220 assert(fs == opOK);2221 }2222 2223 // Lets work with absolute numbers.2224 IEEEFloat P = rhs;2225 P.sign = false;2226 sign = false;2227 2228 //2229 // To calculate the remainder we use the following scheme.2230 //2231 // The remainder is defained as follows:2232 //2233 // remainder = numer - rquot * denom = x - r * p2234 //2235 // Where r is the result of: x/p, rounded toward the nearest integral value2236 // (with halfway cases rounded toward the even number).2237 //2238 // Currently, (after x mod 2p):2239 // r is the number of 2p's present inside x, which is inherently, an even2240 // number of p's.2241 //2242 // We may split the remaining calculation into 4 options:2243 // - if x < 0.5p then we round to the nearest number with is 0, and are done.2244 // - if x == 0.5p then we round to the nearest even number which is 0, and we2245 // are done as well.2246 // - if 0.5p < x < p then we round to nearest number which is 1, and we have2247 // to subtract 1p at least once.2248 // - if x >= p then we must subtract p at least once, as x must be a2249 // remainder.2250 //2251 // By now, we were done, or we added 1 to r, which in turn, now an odd number.2252 //2253 // We can now split the remaining calculation to the following 3 options:2254 // - if x < 0.5p then we round to the nearest number with is 0, and are done.2255 // - if x == 0.5p then we round to the nearest even number. As r is odd, we2256 // must round up to the next even number. so we must subtract p once more.2257 // - if x > 0.5p (and inherently x < p) then we must round r up to the next2258 // integral, and subtract p once more.2259 //2260 2261 // Extend the semantics to prevent an overflow/underflow or inexact result.2262 bool losesInfo;2263 fltSemantics extendedSemantics = *semantics;2264 extendedSemantics.maxExponent++;2265 extendedSemantics.minExponent--;2266 extendedSemantics.precision += 2;2267 2268 IEEEFloat VEx = *this;2269 fs = VEx.convert(extendedSemantics, rmNearestTiesToEven, &losesInfo);2270 assert(fs == opOK && !losesInfo);2271 IEEEFloat PEx = P;2272 fs = PEx.convert(extendedSemantics, rmNearestTiesToEven, &losesInfo);2273 assert(fs == opOK && !losesInfo);2274 2275 // It is simpler to work with 2x instead of 0.5p, and we do not need to lose2276 // any fraction.2277 fs = VEx.add(VEx, rmNearestTiesToEven);2278 assert(fs == opOK);2279 2280 if (VEx.compare(PEx) == cmpGreaterThan) {2281 fs = subtract(P, rmNearestTiesToEven);2282 assert(fs == opOK);2283 2284 // Make VEx = this.add(this), but because we have different semantics, we do2285 // not want to `convert` again, so we just subtract PEx twice (which equals2286 // to the desired value).2287 fs = VEx.subtract(PEx, rmNearestTiesToEven);2288 assert(fs == opOK);2289 fs = VEx.subtract(PEx, rmNearestTiesToEven);2290 assert(fs == opOK);2291 2292 cmpResult result = VEx.compare(PEx);2293 if (result == cmpGreaterThan || result == cmpEqual) {2294 fs = subtract(P, rmNearestTiesToEven);2295 assert(fs == opOK);2296 }2297 }2298 2299 if (isZero()) {2300 sign = origSign; // IEEE754 requires this2301 if (semantics->nanEncoding == fltNanEncoding::NegativeZero)2302 // But some 8-bit floats only have positive 0.2303 sign = false;2304 }2305 2306 else2307 sign ^= origSign;2308 return fs;2309}2310 2311/* Normalized llvm frem (C fmod). */2312APFloat::opStatus IEEEFloat::mod(const IEEEFloat &rhs) {2313 opStatus fs;2314 fs = modSpecials(rhs);2315 unsigned int origSign = sign;2316 2317 while (isFiniteNonZero() && rhs.isFiniteNonZero() &&2318 compareAbsoluteValue(rhs) != cmpLessThan) {2319 int Exp = ilogb(*this) - ilogb(rhs);2320 IEEEFloat V = scalbn(rhs, Exp, rmNearestTiesToEven);2321 // V can overflow to NaN with fltNonfiniteBehavior::NanOnly, so explicitly2322 // check for it.2323 if (V.isNaN() || compareAbsoluteValue(V) == cmpLessThan)2324 V = scalbn(rhs, Exp - 1, rmNearestTiesToEven);2325 V.sign = sign;2326 2327 fs = subtract(V, rmNearestTiesToEven);2328 2329 // When the semantics supports zero, this loop's2330 // exit-condition is handled by the 'isFiniteNonZero'2331 // category check above. However, when the semantics2332 // does not have 'fcZero' and we have reached the2333 // minimum possible value, (and any further subtract2334 // will underflow to the same value) explicitly2335 // provide an exit-path here.2336 if (!semantics->hasZero && this->isSmallest())2337 break;2338 2339 assert(fs==opOK);2340 }2341 if (isZero()) {2342 sign = origSign; // fmod requires this2343 if (semantics->nanEncoding == fltNanEncoding::NegativeZero)2344 sign = false;2345 }2346 return fs;2347}2348 2349/* Normalized fused-multiply-add. */2350APFloat::opStatus IEEEFloat::fusedMultiplyAdd(const IEEEFloat &multiplicand,2351 const IEEEFloat &addend,2352 roundingMode rounding_mode) {2353 opStatus fs;2354 2355 /* Post-multiplication sign, before addition. */2356 sign ^= multiplicand.sign;2357 2358 /* If and only if all arguments are normal do we need to do an2359 extended-precision calculation. */2360 if (isFiniteNonZero() &&2361 multiplicand.isFiniteNonZero() &&2362 addend.isFinite()) {2363 lostFraction lost_fraction;2364 2365 lost_fraction = multiplySignificand(multiplicand, addend);2366 fs = normalize(rounding_mode, lost_fraction);2367 if (lost_fraction != lfExactlyZero)2368 fs = (opStatus) (fs | opInexact);2369 2370 /* If two numbers add (exactly) to zero, IEEE 754 decrees it is a2371 positive zero unless rounding to minus infinity, except that2372 adding two like-signed zeroes gives that zero. */2373 if (category == fcZero && !(fs & opUnderflow) && sign != addend.sign) {2374 sign = (rounding_mode == rmTowardNegative);2375 if (semantics->nanEncoding == fltNanEncoding::NegativeZero)2376 sign = false;2377 }2378 } else {2379 fs = multiplySpecials(multiplicand);2380 2381 /* FS can only be opOK or opInvalidOp. There is no more work2382 to do in the latter case. The IEEE-754R standard says it is2383 implementation-defined in this case whether, if ADDEND is a2384 quiet NaN, we raise invalid op; this implementation does so.2385 2386 If we need to do the addition we can do so with normal2387 precision. */2388 if (fs == opOK)2389 fs = addOrSubtract(addend, rounding_mode, false);2390 }2391 2392 return fs;2393}2394 2395/* Rounding-mode correct round to integral value. */2396APFloat::opStatus IEEEFloat::roundToIntegral(roundingMode rounding_mode) {2397 opStatus fs;2398 2399 if (isInfinity())2400 // [IEEE Std 754-2008 6.1]:2401 // The behavior of infinity in floating-point arithmetic is derived from the2402 // limiting cases of real arithmetic with operands of arbitrarily2403 // large magnitude, when such a limit exists.2404 // ...2405 // Operations on infinite operands are usually exact and therefore signal no2406 // exceptions ...2407 return opOK;2408 2409 if (isNaN()) {2410 if (isSignaling()) {2411 // [IEEE Std 754-2008 6.2]:2412 // Under default exception handling, any operation signaling an invalid2413 // operation exception and for which a floating-point result is to be2414 // delivered shall deliver a quiet NaN.2415 makeQuiet();2416 // [IEEE Std 754-2008 6.2]:2417 // Signaling NaNs shall be reserved operands that, under default exception2418 // handling, signal the invalid operation exception(see 7.2) for every2419 // general-computational and signaling-computational operation except for2420 // the conversions described in 5.12.2421 return opInvalidOp;2422 } else {2423 // [IEEE Std 754-2008 6.2]:2424 // For an operation with quiet NaN inputs, other than maximum and minimum2425 // operations, if a floating-point result is to be delivered the result2426 // shall be a quiet NaN which should be one of the input NaNs.2427 // ...2428 // Every general-computational and quiet-computational operation involving2429 // one or more input NaNs, none of them signaling, shall signal no2430 // exception, except fusedMultiplyAdd might signal the invalid operation2431 // exception(see 7.2).2432 return opOK;2433 }2434 }2435 2436 if (isZero()) {2437 // [IEEE Std 754-2008 6.3]:2438 // ... the sign of the result of conversions, the quantize operation, the2439 // roundToIntegral operations, and the roundToIntegralExact(see 5.3.1) is2440 // the sign of the first or only operand.2441 return opOK;2442 }2443 2444 // If the exponent is large enough, we know that this value is already2445 // integral, and the arithmetic below would potentially cause it to saturate2446 // to +/-Inf. Bail out early instead.2447 if (exponent + 1 >= (int)APFloat::semanticsPrecision(*semantics))2448 return opOK;2449 2450 // The algorithm here is quite simple: we add 2^(p-1), where p is the2451 // precision of our format, and then subtract it back off again. The choice2452 // of rounding modes for the addition/subtraction determines the rounding mode2453 // for our integral rounding as well.2454 // NOTE: When the input value is negative, we do subtraction followed by2455 // addition instead.2456 APInt IntegerConstant(NextPowerOf2(APFloat::semanticsPrecision(*semantics)),2457 1);2458 IntegerConstant <<= APFloat::semanticsPrecision(*semantics) - 1;2459 IEEEFloat MagicConstant(*semantics);2460 fs = MagicConstant.convertFromAPInt(IntegerConstant, false,2461 rmNearestTiesToEven);2462 assert(fs == opOK);2463 MagicConstant.sign = sign;2464 2465 // Preserve the input sign so that we can handle the case of zero result2466 // correctly.2467 bool inputSign = isNegative();2468 2469 fs = add(MagicConstant, rounding_mode);2470 2471 // Current value and 'MagicConstant' are both integers, so the result of the2472 // subtraction is always exact according to Sterbenz' lemma.2473 subtract(MagicConstant, rounding_mode);2474 2475 // Restore the input sign.2476 if (inputSign != isNegative())2477 changeSign();2478 2479 return fs;2480}2481 2482/* Comparison requires normalized numbers. */2483APFloat::cmpResult IEEEFloat::compare(const IEEEFloat &rhs) const {2484 cmpResult result;2485 2486 assert(semantics == rhs.semantics);2487 2488 switch (PackCategoriesIntoKey(category, rhs.category)) {2489 default:2490 llvm_unreachable(nullptr);2491 2492 case PackCategoriesIntoKey(fcNaN, fcZero):2493 case PackCategoriesIntoKey(fcNaN, fcNormal):2494 case PackCategoriesIntoKey(fcNaN, fcInfinity):2495 case PackCategoriesIntoKey(fcNaN, fcNaN):2496 case PackCategoriesIntoKey(fcZero, fcNaN):2497 case PackCategoriesIntoKey(fcNormal, fcNaN):2498 case PackCategoriesIntoKey(fcInfinity, fcNaN):2499 return cmpUnordered;2500 2501 case PackCategoriesIntoKey(fcInfinity, fcNormal):2502 case PackCategoriesIntoKey(fcInfinity, fcZero):2503 case PackCategoriesIntoKey(fcNormal, fcZero):2504 if (sign)2505 return cmpLessThan;2506 else2507 return cmpGreaterThan;2508 2509 case PackCategoriesIntoKey(fcNormal, fcInfinity):2510 case PackCategoriesIntoKey(fcZero, fcInfinity):2511 case PackCategoriesIntoKey(fcZero, fcNormal):2512 if (rhs.sign)2513 return cmpGreaterThan;2514 else2515 return cmpLessThan;2516 2517 case PackCategoriesIntoKey(fcInfinity, fcInfinity):2518 if (sign == rhs.sign)2519 return cmpEqual;2520 else if (sign)2521 return cmpLessThan;2522 else2523 return cmpGreaterThan;2524 2525 case PackCategoriesIntoKey(fcZero, fcZero):2526 return cmpEqual;2527 2528 case PackCategoriesIntoKey(fcNormal, fcNormal):2529 break;2530 }2531 2532 /* Two normal numbers. Do they have the same sign? */2533 if (sign != rhs.sign) {2534 if (sign)2535 result = cmpLessThan;2536 else2537 result = cmpGreaterThan;2538 } else {2539 /* Compare absolute values; invert result if negative. */2540 result = compareAbsoluteValue(rhs);2541 2542 if (sign) {2543 if (result == cmpLessThan)2544 result = cmpGreaterThan;2545 else if (result == cmpGreaterThan)2546 result = cmpLessThan;2547 }2548 }2549 2550 return result;2551}2552 2553/// IEEEFloat::convert - convert a value of one floating point type to another.2554/// The return value corresponds to the IEEE754 exceptions. *losesInfo2555/// records whether the transformation lost information, i.e. whether2556/// converting the result back to the original type will produce the2557/// original value (this is almost the same as return value==fsOK, but there2558/// are edge cases where this is not so).2559 2560APFloat::opStatus IEEEFloat::convert(const fltSemantics &toSemantics,2561 roundingMode rounding_mode,2562 bool *losesInfo) {2563 lostFraction lostFraction;2564 unsigned int newPartCount, oldPartCount;2565 opStatus fs;2566 int shift;2567 const fltSemantics &fromSemantics = *semantics;2568 bool is_signaling = isSignaling();2569 2570 lostFraction = lfExactlyZero;2571 newPartCount = partCountForBits(toSemantics.precision + 1);2572 oldPartCount = partCount();2573 shift = toSemantics.precision - fromSemantics.precision;2574 2575 bool X86SpecialNan = false;2576 if (&fromSemantics == &APFloatBase::semX87DoubleExtended &&2577 &toSemantics != &APFloatBase::semX87DoubleExtended && category == fcNaN &&2578 (!(*significandParts() & 0x8000000000000000ULL) ||2579 !(*significandParts() & 0x4000000000000000ULL))) {2580 // x86 has some unusual NaNs which cannot be represented in any other2581 // format; note them here.2582 X86SpecialNan = true;2583 }2584 2585 // If this is a truncation of a denormal number, and the target semantics2586 // has larger exponent range than the source semantics (this can happen2587 // when truncating from PowerPC double-double to double format), the2588 // right shift could lose result mantissa bits. Adjust exponent instead2589 // of performing excessive shift.2590 // Also do a similar trick in case shifting denormal would produce zero2591 // significand as this case isn't handled correctly by normalize.2592 if (shift < 0 && isFiniteNonZero()) {2593 int omsb = significandMSB() + 1;2594 int exponentChange = omsb - fromSemantics.precision;2595 if (exponent + exponentChange < toSemantics.minExponent)2596 exponentChange = toSemantics.minExponent - exponent;2597 exponentChange = std::max(exponentChange, shift);2598 if (exponentChange < 0) {2599 shift -= exponentChange;2600 exponent += exponentChange;2601 } else if (omsb <= -shift) {2602 exponentChange = omsb + shift - 1; // leave at least one bit set2603 shift -= exponentChange;2604 exponent += exponentChange;2605 }2606 }2607 2608 // If this is a truncation, perform the shift before we narrow the storage.2609 if (shift < 0 && (isFiniteNonZero() ||2610 (category == fcNaN && semantics->nonFiniteBehavior !=2611 fltNonfiniteBehavior::NanOnly)))2612 lostFraction = shiftRight(significandParts(), oldPartCount, -shift);2613 2614 // Fix the storage so it can hold to new value.2615 if (newPartCount > oldPartCount) {2616 // The new type requires more storage; make it available.2617 integerPart *newParts;2618 newParts = new integerPart[newPartCount];2619 APInt::tcSet(newParts, 0, newPartCount);2620 if (isFiniteNonZero() || category==fcNaN)2621 APInt::tcAssign(newParts, significandParts(), oldPartCount);2622 freeSignificand();2623 significand.parts = newParts;2624 } else if (newPartCount == 1 && oldPartCount != 1) {2625 // Switch to built-in storage for a single part.2626 integerPart newPart = 0;2627 if (isFiniteNonZero() || category==fcNaN)2628 newPart = significandParts()[0];2629 freeSignificand();2630 significand.part = newPart;2631 }2632 2633 // Now that we have the right storage, switch the semantics.2634 semantics = &toSemantics;2635 2636 // If this is an extension, perform the shift now that the storage is2637 // available.2638 if (shift > 0 && (isFiniteNonZero() || category==fcNaN))2639 APInt::tcShiftLeft(significandParts(), newPartCount, shift);2640 2641 if (isFiniteNonZero()) {2642 fs = normalize(rounding_mode, lostFraction);2643 *losesInfo = (fs != opOK);2644 } else if (category == fcNaN) {2645 if (semantics->nonFiniteBehavior == fltNonfiniteBehavior::NanOnly) {2646 *losesInfo =2647 fromSemantics.nonFiniteBehavior != fltNonfiniteBehavior::NanOnly;2648 makeNaN(false, sign);2649 return is_signaling ? opInvalidOp : opOK;2650 }2651 2652 // If NaN is negative zero, we need to create a new NaN to avoid converting2653 // NaN to -Inf.2654 if (fromSemantics.nanEncoding == fltNanEncoding::NegativeZero &&2655 semantics->nanEncoding != fltNanEncoding::NegativeZero)2656 makeNaN(false, false);2657 2658 *losesInfo = lostFraction != lfExactlyZero || X86SpecialNan;2659 2660 // For x87 extended precision, we want to make a NaN, not a special NaN if2661 // the input wasn't special either.2662 if (!X86SpecialNan && semantics == &APFloatBase::semX87DoubleExtended)2663 APInt::tcSetBit(significandParts(), semantics->precision - 1);2664 2665 // Convert of sNaN creates qNaN and raises an exception (invalid op).2666 // This also guarantees that a sNaN does not become Inf on a truncation2667 // that loses all payload bits.2668 if (is_signaling) {2669 makeQuiet();2670 fs = opInvalidOp;2671 } else {2672 fs = opOK;2673 }2674 } else if (category == fcInfinity &&2675 semantics->nonFiniteBehavior == fltNonfiniteBehavior::NanOnly) {2676 makeNaN(false, sign);2677 *losesInfo = true;2678 fs = opInexact;2679 } else if (category == fcZero &&2680 semantics->nanEncoding == fltNanEncoding::NegativeZero) {2681 // Negative zero loses info, but positive zero doesn't.2682 *losesInfo =2683 fromSemantics.nanEncoding != fltNanEncoding::NegativeZero && sign;2684 fs = *losesInfo ? opInexact : opOK;2685 // NaN is negative zero means -0 -> +0, which can lose information2686 sign = false;2687 } else {2688 *losesInfo = false;2689 fs = opOK;2690 }2691 2692 if (category == fcZero && !semantics->hasZero)2693 makeSmallestNormalized(false);2694 return fs;2695}2696 2697/* Convert a floating point number to an integer according to the2698 rounding mode. If the rounded integer value is out of range this2699 returns an invalid operation exception and the contents of the2700 destination parts are unspecified. If the rounded value is in2701 range but the floating point number is not the exact integer, the C2702 standard doesn't require an inexact exception to be raised. IEEE2703 854 does require it so we do that.2704 2705 Note that for conversions to integer type the C standard requires2706 round-to-zero to always be used. */2707APFloat::opStatus IEEEFloat::convertToSignExtendedInteger(2708 MutableArrayRef<integerPart> parts, unsigned int width, bool isSigned,2709 roundingMode rounding_mode, bool *isExact) const {2710 lostFraction lost_fraction;2711 const integerPart *src;2712 unsigned int dstPartsCount, truncatedBits;2713 2714 *isExact = false;2715 2716 /* Handle the three special cases first. */2717 if (category == fcInfinity || category == fcNaN)2718 return opInvalidOp;2719 2720 dstPartsCount = partCountForBits(width);2721 assert(dstPartsCount <= parts.size() && "Integer too big");2722 2723 if (category == fcZero) {2724 APInt::tcSet(parts.data(), 0, dstPartsCount);2725 // Negative zero can't be represented as an int.2726 *isExact = !sign;2727 return opOK;2728 }2729 2730 src = significandParts();2731 2732 /* Step 1: place our absolute value, with any fraction truncated, in2733 the destination. */2734 if (exponent < 0) {2735 /* Our absolute value is less than one; truncate everything. */2736 APInt::tcSet(parts.data(), 0, dstPartsCount);2737 /* For exponent -1 the integer bit represents .5, look at that.2738 For smaller exponents leftmost truncated bit is 0. */2739 truncatedBits = semantics->precision -1U - exponent;2740 } else {2741 /* We want the most significant (exponent + 1) bits; the rest are2742 truncated. */2743 unsigned int bits = exponent + 1U;2744 2745 /* Hopelessly large in magnitude? */2746 if (bits > width)2747 return opInvalidOp;2748 2749 if (bits < semantics->precision) {2750 /* We truncate (semantics->precision - bits) bits. */2751 truncatedBits = semantics->precision - bits;2752 APInt::tcExtract(parts.data(), dstPartsCount, src, bits, truncatedBits);2753 } else {2754 /* We want at least as many bits as are available. */2755 APInt::tcExtract(parts.data(), dstPartsCount, src, semantics->precision,2756 0);2757 APInt::tcShiftLeft(parts.data(), dstPartsCount,2758 bits - semantics->precision);2759 truncatedBits = 0;2760 }2761 }2762 2763 /* Step 2: work out any lost fraction, and increment the absolute2764 value if we would round away from zero. */2765 if (truncatedBits) {2766 lost_fraction = lostFractionThroughTruncation(src, partCount(),2767 truncatedBits);2768 if (lost_fraction != lfExactlyZero &&2769 roundAwayFromZero(rounding_mode, lost_fraction, truncatedBits)) {2770 if (APInt::tcIncrement(parts.data(), dstPartsCount))2771 return opInvalidOp; /* Overflow. */2772 }2773 } else {2774 lost_fraction = lfExactlyZero;2775 }2776 2777 /* Step 3: check if we fit in the destination. */2778 unsigned int omsb = APInt::tcMSB(parts.data(), dstPartsCount) + 1;2779 2780 if (sign) {2781 if (!isSigned) {2782 /* Negative numbers cannot be represented as unsigned. */2783 if (omsb != 0)2784 return opInvalidOp;2785 } else {2786 /* It takes omsb bits to represent the unsigned integer value.2787 We lose a bit for the sign, but care is needed as the2788 maximally negative integer is a special case. */2789 if (omsb == width &&2790 APInt::tcLSB(parts.data(), dstPartsCount) + 1 != omsb)2791 return opInvalidOp;2792 2793 /* This case can happen because of rounding. */2794 if (omsb > width)2795 return opInvalidOp;2796 }2797 2798 APInt::tcNegate (parts.data(), dstPartsCount);2799 } else {2800 if (omsb >= width + !isSigned)2801 return opInvalidOp;2802 }2803 2804 if (lost_fraction == lfExactlyZero) {2805 *isExact = true;2806 return opOK;2807 }2808 return opInexact;2809}2810 2811/* Same as convertToSignExtendedInteger, except we provide2812 deterministic values in case of an invalid operation exception,2813 namely zero for NaNs and the minimal or maximal value respectively2814 for underflow or overflow.2815 The *isExact output tells whether the result is exact, in the sense2816 that converting it back to the original floating point type produces2817 the original value. This is almost equivalent to result==opOK,2818 except for negative zeroes.2819*/2820APFloat::opStatus2821IEEEFloat::convertToInteger(MutableArrayRef<integerPart> parts,2822 unsigned int width, bool isSigned,2823 roundingMode rounding_mode, bool *isExact) const {2824 opStatus fs;2825 2826 fs = convertToSignExtendedInteger(parts, width, isSigned, rounding_mode,2827 isExact);2828 2829 if (fs == opInvalidOp) {2830 unsigned int bits, dstPartsCount;2831 2832 dstPartsCount = partCountForBits(width);2833 assert(dstPartsCount <= parts.size() && "Integer too big");2834 2835 if (category == fcNaN)2836 bits = 0;2837 else if (sign)2838 bits = isSigned;2839 else2840 bits = width - isSigned;2841 2842 tcSetLeastSignificantBits(parts.data(), dstPartsCount, bits);2843 if (sign && isSigned)2844 APInt::tcShiftLeft(parts.data(), dstPartsCount, width - 1);2845 }2846 2847 return fs;2848}2849 2850/* Convert an unsigned integer SRC to a floating point number,2851 rounding according to ROUNDING_MODE. The sign of the floating2852 point number is not modified. */2853APFloat::opStatus IEEEFloat::convertFromUnsignedParts(2854 const integerPart *src, unsigned int srcCount, roundingMode rounding_mode) {2855 unsigned int omsb, precision, dstCount;2856 integerPart *dst;2857 lostFraction lost_fraction;2858 2859 category = fcNormal;2860 omsb = APInt::tcMSB(src, srcCount) + 1;2861 dst = significandParts();2862 dstCount = partCount();2863 precision = semantics->precision;2864 2865 /* We want the most significant PRECISION bits of SRC. There may not2866 be that many; extract what we can. */2867 if (precision <= omsb) {2868 exponent = omsb - 1;2869 lost_fraction = lostFractionThroughTruncation(src, srcCount,2870 omsb - precision);2871 APInt::tcExtract(dst, dstCount, src, precision, omsb - precision);2872 } else {2873 exponent = precision - 1;2874 lost_fraction = lfExactlyZero;2875 APInt::tcExtract(dst, dstCount, src, omsb, 0);2876 }2877 2878 return normalize(rounding_mode, lost_fraction);2879}2880 2881APFloat::opStatus IEEEFloat::convertFromAPInt(const APInt &Val, bool isSigned,2882 roundingMode rounding_mode) {2883 unsigned int partCount = Val.getNumWords();2884 APInt api = Val;2885 2886 sign = false;2887 if (isSigned && api.isNegative()) {2888 sign = true;2889 api = -api;2890 }2891 2892 return convertFromUnsignedParts(api.getRawData(), partCount, rounding_mode);2893}2894 2895Expected<APFloat::opStatus>2896IEEEFloat::convertFromHexadecimalString(StringRef s,2897 roundingMode rounding_mode) {2898 lostFraction lost_fraction = lfExactlyZero;2899 2900 category = fcNormal;2901 zeroSignificand();2902 exponent = 0;2903 2904 integerPart *significand = significandParts();2905 unsigned partsCount = partCount();2906 unsigned bitPos = partsCount * integerPartWidth;2907 bool computedTrailingFraction = false;2908 2909 // Skip leading zeroes and any (hexa)decimal point.2910 StringRef::iterator begin = s.begin();2911 StringRef::iterator end = s.end();2912 StringRef::iterator dot;2913 auto PtrOrErr = skipLeadingZeroesAndAnyDot(begin, end, &dot);2914 if (!PtrOrErr)2915 return PtrOrErr.takeError();2916 StringRef::iterator p = *PtrOrErr;2917 StringRef::iterator firstSignificantDigit = p;2918 2919 while (p != end) {2920 integerPart hex_value;2921 2922 if (*p == '.') {2923 if (dot != end)2924 return createError("String contains multiple dots");2925 dot = p++;2926 continue;2927 }2928 2929 hex_value = hexDigitValue(*p);2930 if (hex_value == UINT_MAX)2931 break;2932 2933 p++;2934 2935 // Store the number while we have space.2936 if (bitPos) {2937 bitPos -= 4;2938 hex_value <<= bitPos % integerPartWidth;2939 significand[bitPos / integerPartWidth] |= hex_value;2940 } else if (!computedTrailingFraction) {2941 auto FractOrErr = trailingHexadecimalFraction(p, end, hex_value);2942 if (!FractOrErr)2943 return FractOrErr.takeError();2944 lost_fraction = *FractOrErr;2945 computedTrailingFraction = true;2946 }2947 }2948 2949 /* Hex floats require an exponent but not a hexadecimal point. */2950 if (p == end)2951 return createError("Hex strings require an exponent");2952 if (*p != 'p' && *p != 'P')2953 return createError("Invalid character in significand");2954 if (p == begin)2955 return createError("Significand has no digits");2956 if (dot != end && p - begin == 1)2957 return createError("Significand has no digits");2958 2959 /* Ignore the exponent if we are zero. */2960 if (p != firstSignificantDigit) {2961 int expAdjustment;2962 2963 /* Implicit hexadecimal point? */2964 if (dot == end)2965 dot = p;2966 2967 /* Calculate the exponent adjustment implicit in the number of2968 significant digits. */2969 expAdjustment = static_cast<int>(dot - firstSignificantDigit);2970 if (expAdjustment < 0)2971 expAdjustment++;2972 expAdjustment = expAdjustment * 4 - 1;2973 2974 /* Adjust for writing the significand starting at the most2975 significant nibble. */2976 expAdjustment += semantics->precision;2977 expAdjustment -= partsCount * integerPartWidth;2978 2979 /* Adjust for the given exponent. */2980 auto ExpOrErr = totalExponent(p + 1, end, expAdjustment);2981 if (!ExpOrErr)2982 return ExpOrErr.takeError();2983 exponent = *ExpOrErr;2984 }2985 2986 return normalize(rounding_mode, lost_fraction);2987}2988 2989APFloat::opStatus2990IEEEFloat::roundSignificandWithExponent(const integerPart *decSigParts,2991 unsigned sigPartCount, int exp,2992 roundingMode rounding_mode) {2993 unsigned int parts, pow5PartCount;2994 fltSemantics calcSemantics = { 32767, -32767, 0, 0 };2995 integerPart pow5Parts[maxPowerOfFiveParts];2996 bool isNearest;2997 2998 isNearest = (rounding_mode == rmNearestTiesToEven ||2999 rounding_mode == rmNearestTiesToAway);3000 3001 parts = partCountForBits(semantics->precision + 11);3002 3003 /* Calculate pow(5, abs(exp)). */3004 pow5PartCount = powerOf5(pow5Parts, exp >= 0 ? exp: -exp);3005 3006 for (;; parts *= 2) {3007 opStatus sigStatus, powStatus;3008 unsigned int excessPrecision, truncatedBits;3009 3010 calcSemantics.precision = parts * integerPartWidth - 1;3011 excessPrecision = calcSemantics.precision - semantics->precision;3012 truncatedBits = excessPrecision;3013 3014 IEEEFloat decSig(calcSemantics, uninitialized);3015 decSig.makeZero(sign);3016 IEEEFloat pow5(calcSemantics);3017 3018 sigStatus = decSig.convertFromUnsignedParts(decSigParts, sigPartCount,3019 rmNearestTiesToEven);3020 powStatus = pow5.convertFromUnsignedParts(pow5Parts, pow5PartCount,3021 rmNearestTiesToEven);3022 /* Add exp, as 10^n = 5^n * 2^n. */3023 decSig.exponent += exp;3024 3025 lostFraction calcLostFraction;3026 integerPart HUerr, HUdistance;3027 unsigned int powHUerr;3028 3029 if (exp >= 0) {3030 /* multiplySignificand leaves the precision-th bit set to 1. */3031 calcLostFraction = decSig.multiplySignificand(pow5);3032 powHUerr = powStatus != opOK;3033 } else {3034 calcLostFraction = decSig.divideSignificand(pow5);3035 /* Denormal numbers have less precision. */3036 if (decSig.exponent < semantics->minExponent) {3037 excessPrecision += (semantics->minExponent - decSig.exponent);3038 truncatedBits = excessPrecision;3039 excessPrecision = std::min(excessPrecision, calcSemantics.precision);3040 }3041 /* Extra half-ulp lost in reciprocal of exponent. */3042 powHUerr = (powStatus == opOK && calcLostFraction == lfExactlyZero) ? 0:2;3043 }3044 3045 /* Both multiplySignificand and divideSignificand return the3046 result with the integer bit set. */3047 assert(APInt::tcExtractBit3048 (decSig.significandParts(), calcSemantics.precision - 1) == 1);3049 3050 HUerr = HUerrBound(calcLostFraction != lfExactlyZero, sigStatus != opOK,3051 powHUerr);3052 HUdistance = 2 * ulpsFromBoundary(decSig.significandParts(),3053 excessPrecision, isNearest);3054 3055 /* Are we guaranteed to round correctly if we truncate? */3056 if (HUdistance >= HUerr) {3057 APInt::tcExtract(significandParts(), partCount(), decSig.significandParts(),3058 calcSemantics.precision - excessPrecision,3059 excessPrecision);3060 /* Take the exponent of decSig. If we tcExtract-ed less bits3061 above we must adjust our exponent to compensate for the3062 implicit right shift. */3063 exponent = (decSig.exponent + semantics->precision3064 - (calcSemantics.precision - excessPrecision));3065 calcLostFraction = lostFractionThroughTruncation(decSig.significandParts(),3066 decSig.partCount(),3067 truncatedBits);3068 return normalize(rounding_mode, calcLostFraction);3069 }3070 }3071}3072 3073Expected<APFloat::opStatus>3074IEEEFloat::convertFromDecimalString(StringRef str, roundingMode rounding_mode) {3075 decimalInfo D;3076 opStatus fs;3077 3078 /* Scan the text. */3079 StringRef::iterator p = str.begin();3080 if (Error Err = interpretDecimal(p, str.end(), &D))3081 return std::move(Err);3082 3083 /* Handle the quick cases. First the case of no significant digits,3084 i.e. zero, and then exponents that are obviously too large or too3085 small. Writing L for log 10 / log 2, a number d.ddddd*10^exp3086 definitely overflows if3087 3088 (exp - 1) * L >= maxExponent3089 3090 and definitely underflows to zero where3091 3092 (exp + 1) * L <= minExponent - precision3093 3094 With integer arithmetic the tightest bounds for L are3095 3096 93/28 < L < 196/59 [ numerator <= 256 ]3097 42039/12655 < L < 28738/8651 [ numerator <= 65536 ]3098 */3099 3100 // Test if we have a zero number allowing for strings with no null terminators3101 // and zero decimals with non-zero exponents.3102 //3103 // We computed firstSigDigit by ignoring all zeros and dots. Thus if3104 // D->firstSigDigit equals str.end(), every digit must be a zero and there can3105 // be at most one dot. On the other hand, if we have a zero with a non-zero3106 // exponent, then we know that D.firstSigDigit will be non-numeric.3107 if (D.firstSigDigit == str.end() || decDigitValue(*D.firstSigDigit) >= 10U) {3108 category = fcZero;3109 fs = opOK;3110 if (semantics->nanEncoding == fltNanEncoding::NegativeZero)3111 sign = false;3112 if (!semantics->hasZero)3113 makeSmallestNormalized(false);3114 3115 /* Check whether the normalized exponent is high enough to overflow3116 max during the log-rebasing in the max-exponent check below. */3117 } else if (D.normalizedExponent - 1 > INT_MAX / 42039) {3118 fs = handleOverflow(rounding_mode);3119 3120 /* If it wasn't, then it also wasn't high enough to overflow max3121 during the log-rebasing in the min-exponent check. Check that it3122 won't overflow min in either check, then perform the min-exponent3123 check. */3124 } else if (D.normalizedExponent - 1 < INT_MIN / 42039 ||3125 (D.normalizedExponent + 1) * 28738 <=3126 8651 * (semantics->minExponent - (int) semantics->precision)) {3127 /* Underflow to zero and round. */3128 category = fcNormal;3129 zeroSignificand();3130 fs = normalize(rounding_mode, lfLessThanHalf);3131 3132 /* We can finally safely perform the max-exponent check. */3133 } else if ((D.normalizedExponent - 1) * 420393134 >= 12655 * semantics->maxExponent) {3135 /* Overflow and round. */3136 fs = handleOverflow(rounding_mode);3137 } else {3138 integerPart *decSignificand;3139 unsigned int partCount;3140 3141 /* A tight upper bound on number of bits required to hold an3142 N-digit decimal integer is N * 196 / 59. Allocate enough space3143 to hold the full significand, and an extra part required by3144 tcMultiplyPart. */3145 partCount = static_cast<unsigned int>(D.lastSigDigit - D.firstSigDigit) + 1;3146 partCount = partCountForBits(1 + 196 * partCount / 59);3147 decSignificand = new integerPart[partCount + 1];3148 partCount = 0;3149 3150 /* Convert to binary efficiently - we do almost all multiplication3151 in an integerPart. When this would overflow do we do a single3152 bignum multiplication, and then revert again to multiplication3153 in an integerPart. */3154 do {3155 integerPart decValue, val, multiplier;3156 3157 val = 0;3158 multiplier = 1;3159 3160 do {3161 if (*p == '.') {3162 p++;3163 if (p == str.end()) {3164 break;3165 }3166 }3167 decValue = decDigitValue(*p++);3168 if (decValue >= 10U) {3169 delete[] decSignificand;3170 return createError("Invalid character in significand");3171 }3172 multiplier *= 10;3173 val = val * 10 + decValue;3174 /* The maximum number that can be multiplied by ten with any3175 digit added without overflowing an integerPart. */3176 } while (p <= D.lastSigDigit && multiplier <= (~ (integerPart) 0 - 9) / 10);3177 3178 /* Multiply out the current part. */3179 APInt::tcMultiplyPart(decSignificand, decSignificand, multiplier, val,3180 partCount, partCount + 1, false);3181 3182 /* If we used another part (likely but not guaranteed), increase3183 the count. */3184 if (decSignificand[partCount])3185 partCount++;3186 } while (p <= D.lastSigDigit);3187 3188 category = fcNormal;3189 fs = roundSignificandWithExponent(decSignificand, partCount,3190 D.exponent, rounding_mode);3191 3192 delete [] decSignificand;3193 }3194 3195 return fs;3196}3197 3198bool IEEEFloat::convertFromStringSpecials(StringRef str) {3199 const size_t MIN_NAME_SIZE = 3;3200 3201 if (str.size() < MIN_NAME_SIZE)3202 return false;3203 3204 if (str == "inf" || str == "INFINITY" || str == "+Inf") {3205 makeInf(false);3206 return true;3207 }3208 3209 bool IsNegative = str.consume_front("-");3210 if (IsNegative) {3211 if (str.size() < MIN_NAME_SIZE)3212 return false;3213 3214 if (str == "inf" || str == "INFINITY" || str == "Inf") {3215 makeInf(true);3216 return true;3217 }3218 }3219 3220 // If we have a 's' (or 'S') prefix, then this is a Signaling NaN.3221 bool IsSignaling = str.consume_front_insensitive("s");3222 if (IsSignaling) {3223 if (str.size() < MIN_NAME_SIZE)3224 return false;3225 }3226 3227 if (str.consume_front("nan") || str.consume_front("NaN")) {3228 // A NaN without payload.3229 if (str.empty()) {3230 makeNaN(IsSignaling, IsNegative);3231 return true;3232 }3233 3234 // Allow the payload to be inside parentheses.3235 if (str.front() == '(') {3236 // Parentheses should be balanced (and not empty).3237 if (str.size() <= 2 || str.back() != ')')3238 return false;3239 3240 str = str.slice(1, str.size() - 1);3241 }3242 3243 // Determine the payload number's radix.3244 unsigned Radix = 10;3245 if (str[0] == '0') {3246 if (str.size() > 1 && tolower(str[1]) == 'x') {3247 str = str.drop_front(2);3248 Radix = 16;3249 } else {3250 Radix = 8;3251 }3252 }3253 3254 // Parse the payload and make the NaN.3255 APInt Payload;3256 if (!str.getAsInteger(Radix, Payload)) {3257 makeNaN(IsSignaling, IsNegative, &Payload);3258 return true;3259 }3260 }3261 3262 return false;3263}3264 3265Expected<APFloat::opStatus>3266IEEEFloat::convertFromString(StringRef str, roundingMode rounding_mode) {3267 if (str.empty())3268 return createError("Invalid string length");3269 3270 // Handle special cases.3271 if (convertFromStringSpecials(str))3272 return opOK;3273 3274 /* Handle a leading minus sign. */3275 StringRef::iterator p = str.begin();3276 size_t slen = str.size();3277 sign = *p == '-' ? 1 : 0;3278 if (sign && !semantics->hasSignedRepr)3279 llvm_unreachable(3280 "This floating point format does not support signed values");3281 3282 if (*p == '-' || *p == '+') {3283 p++;3284 slen--;3285 if (!slen)3286 return createError("String has no digits");3287 }3288 3289 if (slen >= 2 && p[0] == '0' && (p[1] == 'x' || p[1] == 'X')) {3290 if (slen == 2)3291 return createError("Invalid string");3292 return convertFromHexadecimalString(StringRef(p + 2, slen - 2),3293 rounding_mode);3294 }3295 3296 return convertFromDecimalString(StringRef(p, slen), rounding_mode);3297}3298 3299/* Write out a hexadecimal representation of the floating point value3300 to DST, which must be of sufficient size, in the C99 form3301 [-]0xh.hhhhp[+-]d. Return the number of characters written,3302 excluding the terminating NUL.3303 3304 If UPPERCASE, the output is in upper case, otherwise in lower case.3305 3306 HEXDIGITS digits appear altogether, rounding the value if3307 necessary. If HEXDIGITS is 0, the minimal precision to display the3308 number precisely is used instead. If nothing would appear after3309 the decimal point it is suppressed.3310 3311 The decimal exponent is always printed and has at least one digit.3312 Zero values display an exponent of zero. Infinities and NaNs3313 appear as "infinity" or "nan" respectively.3314 3315 The above rules are as specified by C99. There is ambiguity about3316 what the leading hexadecimal digit should be. This implementation3317 uses whatever is necessary so that the exponent is displayed as3318 stored. This implies the exponent will fall within the IEEE format3319 range, and the leading hexadecimal digit will be 0 (for denormals),3320 1 (normal numbers) or 2 (normal numbers rounded-away-from-zero with3321 any other digits zero).3322*/3323unsigned int IEEEFloat::convertToHexString(char *dst, unsigned int hexDigits,3324 bool upperCase,3325 roundingMode rounding_mode) const {3326 char *p;3327 3328 p = dst;3329 if (sign)3330 *dst++ = '-';3331 3332 switch (category) {3333 case fcInfinity:3334 memcpy (dst, upperCase ? infinityU: infinityL, sizeof infinityU - 1);3335 dst += sizeof infinityL - 1;3336 break;3337 3338 case fcNaN:3339 memcpy (dst, upperCase ? NaNU: NaNL, sizeof NaNU - 1);3340 dst += sizeof NaNU - 1;3341 break;3342 3343 case fcZero:3344 *dst++ = '0';3345 *dst++ = upperCase ? 'X': 'x';3346 *dst++ = '0';3347 if (hexDigits > 1) {3348 *dst++ = '.';3349 memset (dst, '0', hexDigits - 1);3350 dst += hexDigits - 1;3351 }3352 *dst++ = upperCase ? 'P': 'p';3353 *dst++ = '0';3354 break;3355 3356 case fcNormal:3357 dst = convertNormalToHexString (dst, hexDigits, upperCase, rounding_mode);3358 break;3359 }3360 3361 *dst = 0;3362 3363 return static_cast<unsigned int>(dst - p);3364}3365 3366/* Does the hard work of outputting the correctly rounded hexadecimal3367 form of a normal floating point number with the specified number of3368 hexadecimal digits. If HEXDIGITS is zero the minimum number of3369 digits necessary to print the value precisely is output. */3370char *IEEEFloat::convertNormalToHexString(char *dst, unsigned int hexDigits,3371 bool upperCase,3372 roundingMode rounding_mode) const {3373 unsigned int count, valueBits, shift, partsCount, outputDigits;3374 const char *hexDigitChars;3375 const integerPart *significand;3376 char *p;3377 bool roundUp;3378 3379 *dst++ = '0';3380 *dst++ = upperCase ? 'X': 'x';3381 3382 roundUp = false;3383 hexDigitChars = upperCase ? hexDigitsUpper: hexDigitsLower;3384 3385 significand = significandParts();3386 partsCount = partCount();3387 3388 /* +3 because the first digit only uses the single integer bit, so3389 we have 3 virtual zero most-significant-bits. */3390 valueBits = semantics->precision + 3;3391 shift = integerPartWidth - valueBits % integerPartWidth;3392 3393 /* The natural number of digits required ignoring trailing3394 insignificant zeroes. */3395 outputDigits = (valueBits - significandLSB () + 3) / 4;3396 3397 /* hexDigits of zero means use the required number for the3398 precision. Otherwise, see if we are truncating. If we are,3399 find out if we need to round away from zero. */3400 if (hexDigits) {3401 if (hexDigits < outputDigits) {3402 /* We are dropping non-zero bits, so need to check how to round.3403 "bits" is the number of dropped bits. */3404 unsigned int bits;3405 lostFraction fraction;3406 3407 bits = valueBits - hexDigits * 4;3408 fraction = lostFractionThroughTruncation (significand, partsCount, bits);3409 roundUp = roundAwayFromZero(rounding_mode, fraction, bits);3410 }3411 outputDigits = hexDigits;3412 }3413 3414 /* Write the digits consecutively, and start writing in the location3415 of the hexadecimal point. We move the most significant digit3416 left and add the hexadecimal point later. */3417 p = ++dst;3418 3419 count = (valueBits + integerPartWidth - 1) / integerPartWidth;3420 3421 while (outputDigits && count) {3422 integerPart part;3423 3424 /* Put the most significant integerPartWidth bits in "part". */3425 if (--count == partsCount)3426 part = 0; /* An imaginary higher zero part. */3427 else3428 part = significand[count] << shift;3429 3430 if (count && shift)3431 part |= significand[count - 1] >> (integerPartWidth - shift);3432 3433 /* Convert as much of "part" to hexdigits as we can. */3434 unsigned int curDigits = integerPartWidth / 4;3435 3436 curDigits = std::min(curDigits, outputDigits);3437 dst += partAsHex (dst, part, curDigits, hexDigitChars);3438 outputDigits -= curDigits;3439 }3440 3441 if (roundUp) {3442 char *q = dst;3443 3444 /* Note that hexDigitChars has a trailing '0'. */3445 do {3446 q--;3447 *q = hexDigitChars[hexDigitValue (*q) + 1];3448 } while (*q == '0');3449 assert(q >= p);3450 } else {3451 /* Add trailing zeroes. */3452 memset (dst, '0', outputDigits);3453 dst += outputDigits;3454 }3455 3456 /* Move the most significant digit to before the point, and if there3457 is something after the decimal point add it. This must come3458 after rounding above. */3459 p[-1] = p[0];3460 if (dst -1 == p)3461 dst--;3462 else3463 p[0] = '.';3464 3465 /* Finally output the exponent. */3466 *dst++ = upperCase ? 'P': 'p';3467 3468 return writeSignedDecimal (dst, exponent);3469}3470 3471hash_code hash_value(const IEEEFloat &Arg) {3472 if (!Arg.isFiniteNonZero())3473 return hash_combine((uint8_t)Arg.category,3474 // NaN has no sign, fix it at zero.3475 Arg.isNaN() ? (uint8_t)0 : (uint8_t)Arg.sign,3476 Arg.semantics->precision);3477 3478 // Normal floats need their exponent and significand hashed.3479 return hash_combine((uint8_t)Arg.category, (uint8_t)Arg.sign,3480 Arg.semantics->precision, Arg.exponent,3481 hash_combine_range(3482 Arg.significandParts(),3483 Arg.significandParts() + Arg.partCount()));3484}3485 3486// Conversion from APFloat to/from host float/double. It may eventually be3487// possible to eliminate these and have everybody deal with APFloats, but that3488// will take a while. This approach will not easily extend to long double.3489// Current implementation requires integerPartWidth==64, which is correct at3490// the moment but could be made more general.3491 3492// Denormals have exponent minExponent in APFloat, but minExponent-1 in3493// the actual IEEE respresentations. We compensate for that here.3494 3495APInt IEEEFloat::convertF80LongDoubleAPFloatToAPInt() const {3496 assert(semantics ==3497 (const llvm::fltSemantics *)&APFloatBase::semX87DoubleExtended);3498 assert(partCount()==2);3499 3500 uint64_t myexponent, mysignificand;3501 3502 if (isFiniteNonZero()) {3503 myexponent = exponent+16383; //bias3504 mysignificand = significandParts()[0];3505 if (myexponent==1 && !(mysignificand & 0x8000000000000000ULL))3506 myexponent = 0; // denormal3507 } else if (category==fcZero) {3508 myexponent = 0;3509 mysignificand = 0;3510 } else if (category==fcInfinity) {3511 myexponent = 0x7fff;3512 mysignificand = 0x8000000000000000ULL;3513 } else {3514 assert(category == fcNaN && "Unknown category");3515 myexponent = 0x7fff;3516 mysignificand = significandParts()[0];3517 }3518 3519 uint64_t words[2];3520 words[0] = mysignificand;3521 words[1] = ((uint64_t)(sign & 1) << 15) |3522 (myexponent & 0x7fffLL);3523 return APInt(80, words);3524}3525 3526APInt IEEEFloat::convertPPCDoubleDoubleLegacyAPFloatToAPInt() const {3527 assert(semantics ==3528 (const llvm::fltSemantics *)&APFloatBase::semPPCDoubleDoubleLegacy);3529 assert(partCount()==2);3530 3531 uint64_t words[2];3532 opStatus fs;3533 bool losesInfo;3534 3535 // Convert number to double. To avoid spurious underflows, we re-3536 // normalize against the "double" minExponent first, and only *then*3537 // truncate the mantissa. The result of that second conversion3538 // may be inexact, but should never underflow.3539 // Declare fltSemantics before APFloat that uses it (and3540 // saves pointer to it) to ensure correct destruction order.3541 fltSemantics extendedSemantics = *semantics;3542 extendedSemantics.minExponent = APFloatBase::semIEEEdouble.minExponent;3543 IEEEFloat extended(*this);3544 fs = extended.convert(extendedSemantics, rmNearestTiesToEven, &losesInfo);3545 assert(fs == opOK && !losesInfo);3546 (void)fs;3547 3548 IEEEFloat u(extended);3549 fs = u.convert(APFloatBase::semIEEEdouble, rmNearestTiesToEven, &losesInfo);3550 assert(fs == opOK || fs == opInexact);3551 (void)fs;3552 words[0] = *u.convertDoubleAPFloatToAPInt().getRawData();3553 3554 // If conversion was exact or resulted in a special case, we're done;3555 // just set the second double to zero. Otherwise, re-convert back to3556 // the extended format and compute the difference. This now should3557 // convert exactly to double.3558 if (u.isFiniteNonZero() && losesInfo) {3559 fs = u.convert(extendedSemantics, rmNearestTiesToEven, &losesInfo);3560 assert(fs == opOK && !losesInfo);3561 (void)fs;3562 3563 IEEEFloat v(extended);3564 v.subtract(u, rmNearestTiesToEven);3565 fs = v.convert(APFloatBase::semIEEEdouble, rmNearestTiesToEven, &losesInfo);3566 assert(fs == opOK && !losesInfo);3567 (void)fs;3568 words[1] = *v.convertDoubleAPFloatToAPInt().getRawData();3569 } else {3570 words[1] = 0;3571 }3572 3573 return APInt(128, words);3574}3575 3576template <const fltSemantics &S>3577APInt IEEEFloat::convertIEEEFloatToAPInt() const {3578 assert(semantics == &S);3579 const int bias = (semantics == &APFloatBase::semFloat8E8M0FNU)3580 ? -S.minExponent3581 : -(S.minExponent - 1);3582 constexpr unsigned int trailing_significand_bits = S.precision - 1;3583 constexpr int integer_bit_part = trailing_significand_bits / integerPartWidth;3584 constexpr integerPart integer_bit =3585 integerPart{1} << (trailing_significand_bits % integerPartWidth);3586 constexpr uint64_t significand_mask = integer_bit - 1;3587 constexpr unsigned int exponent_bits =3588 trailing_significand_bits ? (S.sizeInBits - 1 - trailing_significand_bits)3589 : S.sizeInBits;3590 static_assert(exponent_bits < 64);3591 constexpr uint64_t exponent_mask = (uint64_t{1} << exponent_bits) - 1;3592 3593 uint64_t myexponent;3594 std::array<integerPart, partCountForBits(trailing_significand_bits)>3595 mysignificand;3596 3597 if (isFiniteNonZero()) {3598 myexponent = exponent + bias;3599 std::copy_n(significandParts(), mysignificand.size(),3600 mysignificand.begin());3601 if (myexponent == 1 &&3602 !(significandParts()[integer_bit_part] & integer_bit))3603 myexponent = 0; // denormal3604 } else if (category == fcZero) {3605 if (!S.hasZero)3606 llvm_unreachable("semantics does not support zero!");3607 myexponent = ::exponentZero(S) + bias;3608 mysignificand.fill(0);3609 } else if (category == fcInfinity) {3610 if (S.nonFiniteBehavior == fltNonfiniteBehavior::NanOnly ||3611 S.nonFiniteBehavior == fltNonfiniteBehavior::FiniteOnly)3612 llvm_unreachable("semantics don't support inf!");3613 myexponent = ::exponentInf(S) + bias;3614 mysignificand.fill(0);3615 } else {3616 assert(category == fcNaN && "Unknown category!");3617 if (S.nonFiniteBehavior == fltNonfiniteBehavior::FiniteOnly)3618 llvm_unreachable("semantics don't support NaN!");3619 myexponent = ::exponentNaN(S) + bias;3620 std::copy_n(significandParts(), mysignificand.size(),3621 mysignificand.begin());3622 }3623 std::array<uint64_t, (S.sizeInBits + 63) / 64> words;3624 auto words_iter =3625 std::copy_n(mysignificand.begin(), mysignificand.size(), words.begin());3626 if constexpr (significand_mask != 0 || trailing_significand_bits == 0) {3627 // Clear the integer bit.3628 words[mysignificand.size() - 1] &= significand_mask;3629 }3630 std::fill(words_iter, words.end(), uint64_t{0});3631 constexpr size_t last_word = words.size() - 1;3632 uint64_t shifted_sign = static_cast<uint64_t>(sign & 1)3633 << ((S.sizeInBits - 1) % 64);3634 words[last_word] |= shifted_sign;3635 uint64_t shifted_exponent = (myexponent & exponent_mask)3636 << (trailing_significand_bits % 64);3637 words[last_word] |= shifted_exponent;3638 if constexpr (last_word == 0) {3639 return APInt(S.sizeInBits, words[0]);3640 }3641 return APInt(S.sizeInBits, words);3642}3643 3644APInt IEEEFloat::convertQuadrupleAPFloatToAPInt() const {3645 assert(partCount() == 2);3646 return convertIEEEFloatToAPInt<APFloatBase::semIEEEquad>();3647}3648 3649APInt IEEEFloat::convertDoubleAPFloatToAPInt() const {3650 assert(partCount()==1);3651 return convertIEEEFloatToAPInt<APFloatBase::semIEEEdouble>();3652}3653 3654APInt IEEEFloat::convertFloatAPFloatToAPInt() const {3655 assert(partCount()==1);3656 return convertIEEEFloatToAPInt<APFloatBase::semIEEEsingle>();3657}3658 3659APInt IEEEFloat::convertBFloatAPFloatToAPInt() const {3660 assert(partCount() == 1);3661 return convertIEEEFloatToAPInt<APFloatBase::semBFloat>();3662}3663 3664APInt IEEEFloat::convertHalfAPFloatToAPInt() const {3665 assert(partCount()==1);3666 return convertIEEEFloatToAPInt<APFloatBase::APFloatBase::semIEEEhalf>();3667}3668 3669APInt IEEEFloat::convertFloat8E5M2APFloatToAPInt() const {3670 assert(partCount() == 1);3671 return convertIEEEFloatToAPInt<APFloatBase::semFloat8E5M2>();3672}3673 3674APInt IEEEFloat::convertFloat8E5M2FNUZAPFloatToAPInt() const {3675 assert(partCount() == 1);3676 return convertIEEEFloatToAPInt<APFloatBase::semFloat8E5M2FNUZ>();3677}3678 3679APInt IEEEFloat::convertFloat8E4M3APFloatToAPInt() const {3680 assert(partCount() == 1);3681 return convertIEEEFloatToAPInt<APFloatBase::semFloat8E4M3>();3682}3683 3684APInt IEEEFloat::convertFloat8E4M3FNAPFloatToAPInt() const {3685 assert(partCount() == 1);3686 return convertIEEEFloatToAPInt<APFloatBase::semFloat8E4M3FN>();3687}3688 3689APInt IEEEFloat::convertFloat8E4M3FNUZAPFloatToAPInt() const {3690 assert(partCount() == 1);3691 return convertIEEEFloatToAPInt<APFloatBase::semFloat8E4M3FNUZ>();3692}3693 3694APInt IEEEFloat::convertFloat8E4M3B11FNUZAPFloatToAPInt() const {3695 assert(partCount() == 1);3696 return convertIEEEFloatToAPInt<APFloatBase::semFloat8E4M3B11FNUZ>();3697}3698 3699APInt IEEEFloat::convertFloat8E3M4APFloatToAPInt() const {3700 assert(partCount() == 1);3701 return convertIEEEFloatToAPInt<APFloatBase::semFloat8E3M4>();3702}3703 3704APInt IEEEFloat::convertFloatTF32APFloatToAPInt() const {3705 assert(partCount() == 1);3706 return convertIEEEFloatToAPInt<APFloatBase::semFloatTF32>();3707}3708 3709APInt IEEEFloat::convertFloat8E8M0FNUAPFloatToAPInt() const {3710 assert(partCount() == 1);3711 return convertIEEEFloatToAPInt<APFloatBase::semFloat8E8M0FNU>();3712}3713 3714APInt IEEEFloat::convertFloat6E3M2FNAPFloatToAPInt() const {3715 assert(partCount() == 1);3716 return convertIEEEFloatToAPInt<APFloatBase::semFloat6E3M2FN>();3717}3718 3719APInt IEEEFloat::convertFloat6E2M3FNAPFloatToAPInt() const {3720 assert(partCount() == 1);3721 return convertIEEEFloatToAPInt<APFloatBase::semFloat6E2M3FN>();3722}3723 3724APInt IEEEFloat::convertFloat4E2M1FNAPFloatToAPInt() const {3725 assert(partCount() == 1);3726 return convertIEEEFloatToAPInt<APFloatBase::semFloat4E2M1FN>();3727}3728 3729// This function creates an APInt that is just a bit map of the floating3730// point constant as it would appear in memory. It is not a conversion,3731// and treating the result as a normal integer is unlikely to be useful.3732 3733APInt IEEEFloat::bitcastToAPInt() const {3734 if (semantics == (const llvm::fltSemantics *)&APFloatBase::semIEEEhalf)3735 return convertHalfAPFloatToAPInt();3736 3737 if (semantics == (const llvm::fltSemantics *)&APFloatBase::semBFloat)3738 return convertBFloatAPFloatToAPInt();3739 3740 if (semantics == (const llvm::fltSemantics *)&APFloatBase::semIEEEsingle)3741 return convertFloatAPFloatToAPInt();3742 3743 if (semantics == (const llvm::fltSemantics *)&APFloatBase::semIEEEdouble)3744 return convertDoubleAPFloatToAPInt();3745 3746 if (semantics == (const llvm::fltSemantics *)&APFloatBase::semIEEEquad)3747 return convertQuadrupleAPFloatToAPInt();3748 3749 if (semantics ==3750 (const llvm::fltSemantics *)&APFloatBase::semPPCDoubleDoubleLegacy)3751 return convertPPCDoubleDoubleLegacyAPFloatToAPInt();3752 3753 if (semantics == (const llvm::fltSemantics *)&APFloatBase::semFloat8E5M2)3754 return convertFloat8E5M2APFloatToAPInt();3755 3756 if (semantics == (const llvm::fltSemantics *)&APFloatBase::semFloat8E5M2FNUZ)3757 return convertFloat8E5M2FNUZAPFloatToAPInt();3758 3759 if (semantics == (const llvm::fltSemantics *)&APFloatBase::semFloat8E4M3)3760 return convertFloat8E4M3APFloatToAPInt();3761 3762 if (semantics == (const llvm::fltSemantics *)&APFloatBase::semFloat8E4M3FN)3763 return convertFloat8E4M3FNAPFloatToAPInt();3764 3765 if (semantics == (const llvm::fltSemantics *)&APFloatBase::semFloat8E4M3FNUZ)3766 return convertFloat8E4M3FNUZAPFloatToAPInt();3767 3768 if (semantics ==3769 (const llvm::fltSemantics *)&APFloatBase::semFloat8E4M3B11FNUZ)3770 return convertFloat8E4M3B11FNUZAPFloatToAPInt();3771 3772 if (semantics == (const llvm::fltSemantics *)&APFloatBase::semFloat8E3M4)3773 return convertFloat8E3M4APFloatToAPInt();3774 3775 if (semantics == (const llvm::fltSemantics *)&APFloatBase::semFloatTF32)3776 return convertFloatTF32APFloatToAPInt();3777 3778 if (semantics == (const llvm::fltSemantics *)&APFloatBase::semFloat8E8M0FNU)3779 return convertFloat8E8M0FNUAPFloatToAPInt();3780 3781 if (semantics == (const llvm::fltSemantics *)&APFloatBase::semFloat6E3M2FN)3782 return convertFloat6E3M2FNAPFloatToAPInt();3783 3784 if (semantics == (const llvm::fltSemantics *)&APFloatBase::semFloat6E2M3FN)3785 return convertFloat6E2M3FNAPFloatToAPInt();3786 3787 if (semantics == (const llvm::fltSemantics *)&APFloatBase::semFloat4E2M1FN)3788 return convertFloat4E2M1FNAPFloatToAPInt();3789 3790 assert(semantics ==3791 (const llvm::fltSemantics *)&APFloatBase::semX87DoubleExtended &&3792 "unknown format!");3793 return convertF80LongDoubleAPFloatToAPInt();3794}3795 3796float IEEEFloat::convertToFloat() const {3797 assert(semantics == (const llvm::fltSemantics *)&APFloatBase::semIEEEsingle &&3798 "Float semantics are not IEEEsingle");3799 APInt api = bitcastToAPInt();3800 return api.bitsToFloat();3801}3802 3803double IEEEFloat::convertToDouble() const {3804 assert(semantics == (const llvm::fltSemantics *)&APFloatBase::semIEEEdouble &&3805 "Float semantics are not IEEEdouble");3806 APInt api = bitcastToAPInt();3807 return api.bitsToDouble();3808}3809 3810#ifdef HAS_IEE754_FLOAT1283811float128 IEEEFloat::convertToQuad() const {3812 assert(semantics == (const llvm::fltSemantics *)&APFloatBase::semIEEEquad &&3813 "Float semantics are not IEEEquads");3814 APInt api = bitcastToAPInt();3815 return api.bitsToQuad();3816}3817#endif3818 3819/// Integer bit is explicit in this format. Intel hardware (387 and later)3820/// does not support these bit patterns:3821/// exponent = all 1's, integer bit 0, significand 0 ("pseudoinfinity")3822/// exponent = all 1's, integer bit 0, significand nonzero ("pseudoNaN")3823/// exponent!=0 nor all 1's, integer bit 0 ("unnormal")3824/// exponent = 0, integer bit 1 ("pseudodenormal")3825/// At the moment, the first three are treated as NaNs, the last one as Normal.3826void IEEEFloat::initFromF80LongDoubleAPInt(const APInt &api) {3827 uint64_t i1 = api.getRawData()[0];3828 uint64_t i2 = api.getRawData()[1];3829 uint64_t myexponent = (i2 & 0x7fff);3830 uint64_t mysignificand = i1;3831 uint8_t myintegerbit = mysignificand >> 63;3832 3833 initialize(&APFloatBase::semX87DoubleExtended);3834 assert(partCount()==2);3835 3836 sign = static_cast<unsigned int>(i2>>15);3837 if (myexponent == 0 && mysignificand == 0) {3838 makeZero(sign);3839 } else if (myexponent==0x7fff && mysignificand==0x8000000000000000ULL) {3840 makeInf(sign);3841 } else if ((myexponent == 0x7fff && mysignificand != 0x8000000000000000ULL) ||3842 (myexponent != 0x7fff && myexponent != 0 && myintegerbit == 0)) {3843 category = fcNaN;3844 exponent = exponentNaN();3845 significandParts()[0] = mysignificand;3846 significandParts()[1] = 0;3847 } else {3848 category = fcNormal;3849 exponent = myexponent - 16383;3850 significandParts()[0] = mysignificand;3851 significandParts()[1] = 0;3852 if (myexponent==0) // denormal3853 exponent = -16382;3854 }3855}3856 3857void IEEEFloat::initFromPPCDoubleDoubleLegacyAPInt(const APInt &api) {3858 uint64_t i1 = api.getRawData()[0];3859 uint64_t i2 = api.getRawData()[1];3860 opStatus fs;3861 bool losesInfo;3862 3863 // Get the first double and convert to our format.3864 initFromDoubleAPInt(APInt(64, i1));3865 fs = convert(APFloatBase::semPPCDoubleDoubleLegacy, rmNearestTiesToEven,3866 &losesInfo);3867 assert(fs == opOK && !losesInfo);3868 (void)fs;3869 3870 // Unless we have a special case, add in second double.3871 if (isFiniteNonZero()) {3872 IEEEFloat v(APFloatBase::semIEEEdouble, APInt(64, i2));3873 fs = v.convert(APFloatBase::semPPCDoubleDoubleLegacy, rmNearestTiesToEven,3874 &losesInfo);3875 assert(fs == opOK && !losesInfo);3876 (void)fs;3877 3878 add(v, rmNearestTiesToEven);3879 }3880}3881 3882// The E8M0 format has the following characteristics:3883// It is an 8-bit unsigned format with only exponents (no actual significand).3884// No encodings for {zero, infinities or denorms}.3885// NaN is represented by all 1's.3886// Bias is 127.3887void IEEEFloat::initFromFloat8E8M0FNUAPInt(const APInt &api) {3888 const uint64_t exponent_mask = 0xff;3889 uint64_t val = api.getRawData()[0];3890 uint64_t myexponent = (val & exponent_mask);3891 3892 initialize(&APFloatBase::semFloat8E8M0FNU);3893 assert(partCount() == 1);3894 3895 // This format has unsigned representation only3896 sign = 0;3897 3898 // Set the significand3899 // This format does not have any significand but the 'Pth' precision bit is3900 // always set to 1 for consistency in APFloat's internal representation.3901 uint64_t mysignificand = 1;3902 significandParts()[0] = mysignificand;3903 3904 // This format can either have a NaN or fcNormal3905 // All 1's i.e. 255 is a NaN3906 if (val == exponent_mask) {3907 category = fcNaN;3908 exponent = exponentNaN();3909 return;3910 }3911 // Handle fcNormal...3912 category = fcNormal;3913 exponent = myexponent - 127; // 127 is bias3914}3915template <const fltSemantics &S>3916void IEEEFloat::initFromIEEEAPInt(const APInt &api) {3917 assert(api.getBitWidth() == S.sizeInBits);3918 constexpr integerPart integer_bit = integerPart{1}3919 << ((S.precision - 1) % integerPartWidth);3920 constexpr uint64_t significand_mask = integer_bit - 1;3921 constexpr unsigned int trailing_significand_bits = S.precision - 1;3922 constexpr unsigned int stored_significand_parts =3923 partCountForBits(trailing_significand_bits);3924 constexpr unsigned int exponent_bits =3925 S.sizeInBits - 1 - trailing_significand_bits;3926 static_assert(exponent_bits < 64);3927 constexpr uint64_t exponent_mask = (uint64_t{1} << exponent_bits) - 1;3928 constexpr int bias = -(S.minExponent - 1);3929 3930 // Copy the bits of the significand. We need to clear out the exponent and3931 // sign bit in the last word.3932 std::array<integerPart, stored_significand_parts> mysignificand;3933 std::copy_n(api.getRawData(), mysignificand.size(), mysignificand.begin());3934 if constexpr (significand_mask != 0) {3935 mysignificand[mysignificand.size() - 1] &= significand_mask;3936 }3937 3938 // We assume the last word holds the sign bit, the exponent, and potentially3939 // some of the trailing significand field.3940 uint64_t last_word = api.getRawData()[api.getNumWords() - 1];3941 uint64_t myexponent =3942 (last_word >> (trailing_significand_bits % 64)) & exponent_mask;3943 3944 initialize(&S);3945 assert(partCount() == mysignificand.size());3946 3947 sign = static_cast<unsigned int>(last_word >> ((S.sizeInBits - 1) % 64));3948 3949 bool all_zero_significand =3950 llvm::all_of(mysignificand, [](integerPart bits) { return bits == 0; });3951 3952 bool is_zero = myexponent == 0 && all_zero_significand;3953 3954 if constexpr (S.nonFiniteBehavior == fltNonfiniteBehavior::IEEE754) {3955 if (myexponent - bias == ::exponentInf(S) && all_zero_significand) {3956 makeInf(sign);3957 return;3958 }3959 }3960 3961 bool is_nan = false;3962 3963 if constexpr (S.nanEncoding == fltNanEncoding::IEEE) {3964 is_nan = myexponent - bias == ::exponentNaN(S) && !all_zero_significand;3965 } else if constexpr (S.nanEncoding == fltNanEncoding::AllOnes) {3966 bool all_ones_significand =3967 std::all_of(mysignificand.begin(), mysignificand.end() - 1,3968 [](integerPart bits) { return bits == ~integerPart{0}; }) &&3969 (!significand_mask ||3970 mysignificand[mysignificand.size() - 1] == significand_mask);3971 is_nan = myexponent - bias == ::exponentNaN(S) && all_ones_significand;3972 } else if constexpr (S.nanEncoding == fltNanEncoding::NegativeZero) {3973 is_nan = is_zero && sign;3974 }3975 3976 if (is_nan) {3977 category = fcNaN;3978 exponent = ::exponentNaN(S);3979 std::copy_n(mysignificand.begin(), mysignificand.size(),3980 significandParts());3981 return;3982 }3983 3984 if (is_zero) {3985 makeZero(sign);3986 return;3987 }3988 3989 category = fcNormal;3990 exponent = myexponent - bias;3991 std::copy_n(mysignificand.begin(), mysignificand.size(), significandParts());3992 if (myexponent == 0) // denormal3993 exponent = S.minExponent;3994 else3995 significandParts()[mysignificand.size()-1] |= integer_bit; // integer bit3996}3997 3998void IEEEFloat::initFromQuadrupleAPInt(const APInt &api) {3999 initFromIEEEAPInt<APFloatBase::semIEEEquad>(api);4000}4001 4002void IEEEFloat::initFromDoubleAPInt(const APInt &api) {4003 initFromIEEEAPInt<APFloatBase::semIEEEdouble>(api);4004}4005 4006void IEEEFloat::initFromFloatAPInt(const APInt &api) {4007 initFromIEEEAPInt<APFloatBase::semIEEEsingle>(api);4008}4009 4010void IEEEFloat::initFromBFloatAPInt(const APInt &api) {4011 initFromIEEEAPInt<APFloatBase::semBFloat>(api);4012}4013 4014void IEEEFloat::initFromHalfAPInt(const APInt &api) {4015 initFromIEEEAPInt<APFloatBase::semIEEEhalf>(api);4016}4017 4018void IEEEFloat::initFromFloat8E5M2APInt(const APInt &api) {4019 initFromIEEEAPInt<APFloatBase::semFloat8E5M2>(api);4020}4021 4022void IEEEFloat::initFromFloat8E5M2FNUZAPInt(const APInt &api) {4023 initFromIEEEAPInt<APFloatBase::semFloat8E5M2FNUZ>(api);4024}4025 4026void IEEEFloat::initFromFloat8E4M3APInt(const APInt &api) {4027 initFromIEEEAPInt<APFloatBase::semFloat8E4M3>(api);4028}4029 4030void IEEEFloat::initFromFloat8E4M3FNAPInt(const APInt &api) {4031 initFromIEEEAPInt<APFloatBase::semFloat8E4M3FN>(api);4032}4033 4034void IEEEFloat::initFromFloat8E4M3FNUZAPInt(const APInt &api) {4035 initFromIEEEAPInt<APFloatBase::semFloat8E4M3FNUZ>(api);4036}4037 4038void IEEEFloat::initFromFloat8E4M3B11FNUZAPInt(const APInt &api) {4039 initFromIEEEAPInt<APFloatBase::semFloat8E4M3B11FNUZ>(api);4040}4041 4042void IEEEFloat::initFromFloat8E3M4APInt(const APInt &api) {4043 initFromIEEEAPInt<APFloatBase::semFloat8E3M4>(api);4044}4045 4046void IEEEFloat::initFromFloatTF32APInt(const APInt &api) {4047 initFromIEEEAPInt<APFloatBase::semFloatTF32>(api);4048}4049 4050void IEEEFloat::initFromFloat6E3M2FNAPInt(const APInt &api) {4051 initFromIEEEAPInt<APFloatBase::semFloat6E3M2FN>(api);4052}4053 4054void IEEEFloat::initFromFloat6E2M3FNAPInt(const APInt &api) {4055 initFromIEEEAPInt<APFloatBase::semFloat6E2M3FN>(api);4056}4057 4058void IEEEFloat::initFromFloat4E2M1FNAPInt(const APInt &api) {4059 initFromIEEEAPInt<APFloatBase::semFloat4E2M1FN>(api);4060}4061 4062/// Treat api as containing the bits of a floating point number.4063void IEEEFloat::initFromAPInt(const fltSemantics *Sem, const APInt &api) {4064 assert(api.getBitWidth() == Sem->sizeInBits);4065 if (Sem == &APFloatBase::semIEEEhalf)4066 return initFromHalfAPInt(api);4067 if (Sem == &APFloatBase::semBFloat)4068 return initFromBFloatAPInt(api);4069 if (Sem == &APFloatBase::semIEEEsingle)4070 return initFromFloatAPInt(api);4071 if (Sem == &APFloatBase::semIEEEdouble)4072 return initFromDoubleAPInt(api);4073 if (Sem == &APFloatBase::semX87DoubleExtended)4074 return initFromF80LongDoubleAPInt(api);4075 if (Sem == &APFloatBase::semIEEEquad)4076 return initFromQuadrupleAPInt(api);4077 if (Sem == &APFloatBase::semPPCDoubleDoubleLegacy)4078 return initFromPPCDoubleDoubleLegacyAPInt(api);4079 if (Sem == &APFloatBase::semFloat8E5M2)4080 return initFromFloat8E5M2APInt(api);4081 if (Sem == &APFloatBase::semFloat8E5M2FNUZ)4082 return initFromFloat8E5M2FNUZAPInt(api);4083 if (Sem == &APFloatBase::semFloat8E4M3)4084 return initFromFloat8E4M3APInt(api);4085 if (Sem == &APFloatBase::semFloat8E4M3FN)4086 return initFromFloat8E4M3FNAPInt(api);4087 if (Sem == &APFloatBase::semFloat8E4M3FNUZ)4088 return initFromFloat8E4M3FNUZAPInt(api);4089 if (Sem == &APFloatBase::semFloat8E4M3B11FNUZ)4090 return initFromFloat8E4M3B11FNUZAPInt(api);4091 if (Sem == &APFloatBase::semFloat8E3M4)4092 return initFromFloat8E3M4APInt(api);4093 if (Sem == &APFloatBase::semFloatTF32)4094 return initFromFloatTF32APInt(api);4095 if (Sem == &APFloatBase::semFloat8E8M0FNU)4096 return initFromFloat8E8M0FNUAPInt(api);4097 if (Sem == &APFloatBase::semFloat6E3M2FN)4098 return initFromFloat6E3M2FNAPInt(api);4099 if (Sem == &APFloatBase::semFloat6E2M3FN)4100 return initFromFloat6E2M3FNAPInt(api);4101 if (Sem == &APFloatBase::semFloat4E2M1FN)4102 return initFromFloat4E2M1FNAPInt(api);4103 4104 llvm_unreachable("unsupported semantics");4105}4106 4107/// Make this number the largest magnitude normal number in the given4108/// semantics.4109void IEEEFloat::makeLargest(bool Negative) {4110 if (Negative && !semantics->hasSignedRepr)4111 llvm_unreachable(4112 "This floating point format does not support signed values");4113 // We want (in interchange format):4114 // sign = {Negative}4115 // exponent = 1..104116 // significand = 1..14117 category = fcNormal;4118 sign = Negative;4119 exponent = semantics->maxExponent;4120 4121 // Use memset to set all but the highest integerPart to all ones.4122 integerPart *significand = significandParts();4123 unsigned PartCount = partCount();4124 memset(significand, 0xFF, sizeof(integerPart)*(PartCount - 1));4125 4126 // Set the high integerPart especially setting all unused top bits for4127 // internal consistency.4128 const unsigned NumUnusedHighBits =4129 PartCount*integerPartWidth - semantics->precision;4130 significand[PartCount - 1] = (NumUnusedHighBits < integerPartWidth)4131 ? (~integerPart(0) >> NumUnusedHighBits)4132 : 0;4133 if (semantics->nonFiniteBehavior == fltNonfiniteBehavior::NanOnly &&4134 semantics->nanEncoding == fltNanEncoding::AllOnes &&4135 (semantics->precision > 1))4136 significand[0] &= ~integerPart(1);4137}4138 4139/// Make this number the smallest magnitude denormal number in the given4140/// semantics.4141void IEEEFloat::makeSmallest(bool Negative) {4142 if (Negative && !semantics->hasSignedRepr)4143 llvm_unreachable(4144 "This floating point format does not support signed values");4145 // We want (in interchange format):4146 // sign = {Negative}4147 // exponent = 0..04148 // significand = 0..014149 category = fcNormal;4150 sign = Negative;4151 exponent = semantics->minExponent;4152 APInt::tcSet(significandParts(), 1, partCount());4153}4154 4155void IEEEFloat::makeSmallestNormalized(bool Negative) {4156 if (Negative && !semantics->hasSignedRepr)4157 llvm_unreachable(4158 "This floating point format does not support signed values");4159 // We want (in interchange format):4160 // sign = {Negative}4161 // exponent = 0..04162 // significand = 10..04163 4164 category = fcNormal;4165 zeroSignificand();4166 sign = Negative;4167 exponent = semantics->minExponent;4168 APInt::tcSetBit(significandParts(), semantics->precision - 1);4169}4170 4171IEEEFloat::IEEEFloat(const fltSemantics &Sem, const APInt &API) {4172 initFromAPInt(&Sem, API);4173}4174 4175IEEEFloat::IEEEFloat(float f) {4176 initFromAPInt(&APFloatBase::semIEEEsingle, APInt::floatToBits(f));4177}4178 4179IEEEFloat::IEEEFloat(double d) {4180 initFromAPInt(&APFloatBase::semIEEEdouble, APInt::doubleToBits(d));4181}4182 4183namespace {4184 void append(SmallVectorImpl<char> &Buffer, StringRef Str) {4185 Buffer.append(Str.begin(), Str.end());4186 }4187 4188 /// Removes data from the given significand until it is no more4189 /// precise than is required for the desired precision.4190 void AdjustToPrecision(APInt &significand,4191 int &exp, unsigned FormatPrecision) {4192 unsigned bits = significand.getActiveBits();4193 4194 // 196/59 is a very slight overestimate of lg_2(10).4195 unsigned bitsRequired = (FormatPrecision * 196 + 58) / 59;4196 4197 if (bits <= bitsRequired) return;4198 4199 unsigned tensRemovable = (bits - bitsRequired) * 59 / 196;4200 if (!tensRemovable) return;4201 4202 exp += tensRemovable;4203 4204 APInt divisor(significand.getBitWidth(), 1);4205 APInt powten(significand.getBitWidth(), 10);4206 while (true) {4207 if (tensRemovable & 1)4208 divisor *= powten;4209 tensRemovable >>= 1;4210 if (!tensRemovable) break;4211 powten *= powten;4212 }4213 4214 significand = significand.udiv(divisor);4215 4216 // Truncate the significand down to its active bit count.4217 significand = significand.trunc(significand.getActiveBits());4218 }4219 4220 4221 void AdjustToPrecision(SmallVectorImpl<char> &buffer,4222 int &exp, unsigned FormatPrecision) {4223 unsigned N = buffer.size();4224 if (N <= FormatPrecision) return;4225 4226 // The most significant figures are the last ones in the buffer.4227 unsigned FirstSignificant = N - FormatPrecision;4228 4229 // Round.4230 // FIXME: this probably shouldn't use 'round half up'.4231 4232 // Rounding down is just a truncation, except we also want to drop4233 // trailing zeros from the new result.4234 if (buffer[FirstSignificant - 1] < '5') {4235 while (FirstSignificant < N && buffer[FirstSignificant] == '0')4236 FirstSignificant++;4237 4238 exp += FirstSignificant;4239 buffer.erase(&buffer[0], &buffer[FirstSignificant]);4240 return;4241 }4242 4243 // Rounding up requires a decimal add-with-carry. If we continue4244 // the carry, the newly-introduced zeros will just be truncated.4245 for (unsigned I = FirstSignificant; I != N; ++I) {4246 if (buffer[I] == '9') {4247 FirstSignificant++;4248 } else {4249 buffer[I]++;4250 break;4251 }4252 }4253 4254 // If we carried through, we have exactly one digit of precision.4255 if (FirstSignificant == N) {4256 exp += FirstSignificant;4257 buffer.clear();4258 buffer.push_back('1');4259 return;4260 }4261 4262 exp += FirstSignificant;4263 buffer.erase(&buffer[0], &buffer[FirstSignificant]);4264 }4265 4266 void toStringImpl(SmallVectorImpl<char> &Str, const bool isNeg, int exp,4267 APInt significand, unsigned FormatPrecision,4268 unsigned FormatMaxPadding, bool TruncateZero) {4269 const int semanticsPrecision = significand.getBitWidth();4270 4271 if (isNeg)4272 Str.push_back('-');4273 4274 // Set FormatPrecision if zero. We want to do this before we4275 // truncate trailing zeros, as those are part of the precision.4276 if (!FormatPrecision) {4277 // We use enough digits so the number can be round-tripped back to an4278 // APFloat. The formula comes from "How to Print Floating-Point Numbers4279 // Accurately" by Steele and White.4280 // FIXME: Using a formula based purely on the precision is conservative;4281 // we can print fewer digits depending on the actual value being printed.4282 4283 // FormatPrecision = 2 + floor(significandBits / lg_2(10))4284 FormatPrecision = 2 + semanticsPrecision * 59 / 196;4285 }4286 4287 // Ignore trailing binary zeros.4288 int trailingZeros = significand.countr_zero();4289 exp += trailingZeros;4290 significand.lshrInPlace(trailingZeros);4291 4292 // Change the exponent from 2^e to 10^e.4293 if (exp == 0) {4294 // Nothing to do.4295 } else if (exp > 0) {4296 // Just shift left.4297 significand = significand.zext(semanticsPrecision + exp);4298 significand <<= exp;4299 exp = 0;4300 } else { /* exp < 0 */4301 int texp = -exp;4302 4303 // We transform this using the identity:4304 // (N)(2^-e) == (N)(5^e)(10^-e)4305 // This means we have to multiply N (the significand) by 5^e.4306 // To avoid overflow, we have to operate on numbers large4307 // enough to store N * 5^e:4308 // log2(N * 5^e) == log2(N) + e * log2(5)4309 // <= semantics->precision + e * 137 / 594310 // (log_2(5) ~ 2.321928 < 2.322034 ~ 137/59)4311 4312 unsigned precision = semanticsPrecision + (137 * texp + 136) / 59;4313 4314 // Multiply significand by 5^e.4315 // N * 5^0101 == N * 5^(1*1) * 5^(0*2) * 5^(1*4) * 5^(0*8)4316 significand = significand.zext(precision);4317 APInt five_to_the_i(precision, 5);4318 while (true) {4319 if (texp & 1)4320 significand *= five_to_the_i;4321 4322 texp >>= 1;4323 if (!texp)4324 break;4325 five_to_the_i *= five_to_the_i;4326 }4327 }4328 4329 AdjustToPrecision(significand, exp, FormatPrecision);4330 4331 SmallVector<char, 256> buffer;4332 4333 // Fill the buffer.4334 unsigned precision = significand.getBitWidth();4335 if (precision < 4) {4336 // We need enough precision to store the value 10.4337 precision = 4;4338 significand = significand.zext(precision);4339 }4340 APInt ten(precision, 10);4341 APInt digit(precision, 0);4342 4343 bool inTrail = true;4344 while (significand != 0) {4345 // digit <- significand % 104346 // significand <- significand / 104347 APInt::udivrem(significand, ten, significand, digit);4348 4349 unsigned d = digit.getZExtValue();4350 4351 // Drop trailing zeros.4352 if (inTrail && !d)4353 exp++;4354 else {4355 buffer.push_back((char) ('0' + d));4356 inTrail = false;4357 }4358 }4359 4360 assert(!buffer.empty() && "no characters in buffer!");4361 4362 // Drop down to FormatPrecision.4363 // TODO: don't do more precise calculations above than are required.4364 AdjustToPrecision(buffer, exp, FormatPrecision);4365 4366 unsigned NDigits = buffer.size();4367 4368 // Check whether we should use scientific notation.4369 bool FormatScientific;4370 if (!FormatMaxPadding)4371 FormatScientific = true;4372 else {4373 if (exp >= 0) {4374 // 765e3 --> 7650004375 // ^^^4376 // But we shouldn't make the number look more precise than it is.4377 FormatScientific = ((unsigned) exp > FormatMaxPadding ||4378 NDigits + (unsigned) exp > FormatPrecision);4379 } else {4380 // Power of the most significant digit.4381 int MSD = exp + (int) (NDigits - 1);4382 if (MSD >= 0) {4383 // 765e-2 == 7.654384 FormatScientific = false;4385 } else {4386 // 765e-5 == 0.007654387 // ^ ^^4388 FormatScientific = ((unsigned) -MSD) > FormatMaxPadding;4389 }4390 }4391 }4392 4393 // Scientific formatting is pretty straightforward.4394 if (FormatScientific) {4395 exp += (NDigits - 1);4396 4397 Str.push_back(buffer[NDigits-1]);4398 Str.push_back('.');4399 if (NDigits == 1 && TruncateZero)4400 Str.push_back('0');4401 else4402 for (unsigned I = 1; I != NDigits; ++I)4403 Str.push_back(buffer[NDigits-1-I]);4404 // Fill with zeros up to FormatPrecision.4405 if (!TruncateZero && FormatPrecision > NDigits - 1)4406 Str.append(FormatPrecision - NDigits + 1, '0');4407 // For !TruncateZero we use lower 'e'.4408 Str.push_back(TruncateZero ? 'E' : 'e');4409 4410 Str.push_back(exp >= 0 ? '+' : '-');4411 if (exp < 0)4412 exp = -exp;4413 SmallVector<char, 6> expbuf;4414 do {4415 expbuf.push_back((char) ('0' + (exp % 10)));4416 exp /= 10;4417 } while (exp);4418 // Exponent always at least two digits if we do not truncate zeros.4419 if (!TruncateZero && expbuf.size() < 2)4420 expbuf.push_back('0');4421 for (unsigned I = 0, E = expbuf.size(); I != E; ++I)4422 Str.push_back(expbuf[E-1-I]);4423 return;4424 }4425 4426 // Non-scientific, positive exponents.4427 if (exp >= 0) {4428 for (unsigned I = 0; I != NDigits; ++I)4429 Str.push_back(buffer[NDigits-1-I]);4430 for (unsigned I = 0; I != (unsigned) exp; ++I)4431 Str.push_back('0');4432 return;4433 }4434 4435 // Non-scientific, negative exponents.4436 4437 // The number of digits to the left of the decimal point.4438 int NWholeDigits = exp + (int) NDigits;4439 4440 unsigned I = 0;4441 if (NWholeDigits > 0) {4442 for (; I != (unsigned) NWholeDigits; ++I)4443 Str.push_back(buffer[NDigits-I-1]);4444 Str.push_back('.');4445 } else {4446 unsigned NZeros = 1 + (unsigned) -NWholeDigits;4447 4448 Str.push_back('0');4449 Str.push_back('.');4450 for (unsigned Z = 1; Z != NZeros; ++Z)4451 Str.push_back('0');4452 }4453 4454 for (; I != NDigits; ++I)4455 Str.push_back(buffer[NDigits-I-1]);4456 4457 }4458} // namespace4459 4460void IEEEFloat::toString(SmallVectorImpl<char> &Str, unsigned FormatPrecision,4461 unsigned FormatMaxPadding, bool TruncateZero) const {4462 switch (category) {4463 case fcInfinity:4464 if (isNegative())4465 return append(Str, "-Inf");4466 else4467 return append(Str, "+Inf");4468 4469 case fcNaN: return append(Str, "NaN");4470 4471 case fcZero:4472 if (isNegative())4473 Str.push_back('-');4474 4475 if (!FormatMaxPadding) {4476 if (TruncateZero)4477 append(Str, "0.0E+0");4478 else {4479 append(Str, "0.0");4480 if (FormatPrecision > 1)4481 Str.append(FormatPrecision - 1, '0');4482 append(Str, "e+00");4483 }4484 } else {4485 Str.push_back('0');4486 }4487 return;4488 4489 case fcNormal:4490 break;4491 }4492 4493 // Decompose the number into an APInt and an exponent.4494 int exp = exponent - ((int) semantics->precision - 1);4495 APInt significand(4496 semantics->precision,4497 ArrayRef(significandParts(), partCountForBits(semantics->precision)));4498 4499 toStringImpl(Str, isNegative(), exp, significand, FormatPrecision,4500 FormatMaxPadding, TruncateZero);4501 4502}4503 4504int IEEEFloat::getExactLog2Abs() const {4505 if (!isFinite() || isZero())4506 return INT_MIN;4507 4508 const integerPart *Parts = significandParts();4509 const int PartCount = partCountForBits(semantics->precision);4510 4511 int PopCount = 0;4512 for (int i = 0; i < PartCount; ++i) {4513 PopCount += llvm::popcount(Parts[i]);4514 if (PopCount > 1)4515 return INT_MIN;4516 }4517 4518 if (exponent != semantics->minExponent)4519 return exponent;4520 4521 int CountrParts = 0;4522 for (int i = 0; i < PartCount;4523 ++i, CountrParts += APInt::APINT_BITS_PER_WORD) {4524 if (Parts[i] != 0) {4525 return exponent - semantics->precision + CountrParts +4526 llvm::countr_zero(Parts[i]) + 1;4527 }4528 }4529 4530 llvm_unreachable("didn't find the set bit");4531}4532 4533bool IEEEFloat::isSignaling() const {4534 if (!isNaN())4535 return false;4536 if (semantics->nonFiniteBehavior == fltNonfiniteBehavior::NanOnly ||4537 semantics->nonFiniteBehavior == fltNonfiniteBehavior::FiniteOnly)4538 return false;4539 4540 // IEEE-754R 2008 6.2.1: A signaling NaN bit string should be encoded with the4541 // first bit of the trailing significand being 0.4542 return !APInt::tcExtractBit(significandParts(), semantics->precision - 2);4543}4544 4545/// IEEE-754R 2008 5.3.1: nextUp/nextDown.4546///4547/// *NOTE* since nextDown(x) = -nextUp(-x), we only implement nextUp with4548/// appropriate sign switching before/after the computation.4549APFloat::opStatus IEEEFloat::next(bool nextDown) {4550 // If we are performing nextDown, swap sign so we have -x.4551 if (nextDown)4552 changeSign();4553 4554 // Compute nextUp(x)4555 opStatus result = opOK;4556 4557 // Handle each float category separately.4558 switch (category) {4559 case fcInfinity:4560 // nextUp(+inf) = +inf4561 if (!isNegative())4562 break;4563 // nextUp(-inf) = -getLargest()4564 makeLargest(true);4565 break;4566 case fcNaN:4567 // IEEE-754R 2008 6.2 Par 2: nextUp(sNaN) = qNaN. Set Invalid flag.4568 // IEEE-754R 2008 6.2: nextUp(qNaN) = qNaN. Must be identity so we do not4569 // change the payload.4570 if (isSignaling()) {4571 result = opInvalidOp;4572 // For consistency, propagate the sign of the sNaN to the qNaN.4573 makeNaN(false, isNegative(), nullptr);4574 }4575 break;4576 case fcZero:4577 // nextUp(pm 0) = +getSmallest()4578 makeSmallest(false);4579 break;4580 case fcNormal:4581 // nextUp(-getSmallest()) = -04582 if (isSmallest() && isNegative()) {4583 APInt::tcSet(significandParts(), 0, partCount());4584 category = fcZero;4585 exponent = 0;4586 if (semantics->nanEncoding == fltNanEncoding::NegativeZero)4587 sign = false;4588 if (!semantics->hasZero)4589 makeSmallestNormalized(false);4590 break;4591 }4592 4593 if (isLargest() && !isNegative()) {4594 if (semantics->nonFiniteBehavior == fltNonfiniteBehavior::NanOnly) {4595 // nextUp(getLargest()) == NAN4596 makeNaN();4597 break;4598 } else if (semantics->nonFiniteBehavior ==4599 fltNonfiniteBehavior::FiniteOnly) {4600 // nextUp(getLargest()) == getLargest()4601 break;4602 } else {4603 // nextUp(getLargest()) == INFINITY4604 APInt::tcSet(significandParts(), 0, partCount());4605 category = fcInfinity;4606 exponent = semantics->maxExponent + 1;4607 break;4608 }4609 }4610 4611 // nextUp(normal) == normal + inc.4612 if (isNegative()) {4613 // If we are negative, we need to decrement the significand.4614 4615 // We only cross a binade boundary that requires adjusting the exponent4616 // if:4617 // 1. exponent != semantics->minExponent. This implies we are not in the4618 // smallest binade or are dealing with denormals.4619 // 2. Our significand excluding the integral bit is all zeros.4620 bool WillCrossBinadeBoundary =4621 exponent != semantics->minExponent && isSignificandAllZeros();4622 4623 // Decrement the significand.4624 //4625 // We always do this since:4626 // 1. If we are dealing with a non-binade decrement, by definition we4627 // just decrement the significand.4628 // 2. If we are dealing with a normal -> normal binade decrement, since4629 // we have an explicit integral bit the fact that all bits but the4630 // integral bit are zero implies that subtracting one will yield a4631 // significand with 0 integral bit and 1 in all other spots. Thus we4632 // must just adjust the exponent and set the integral bit to 1.4633 // 3. If we are dealing with a normal -> denormal binade decrement,4634 // since we set the integral bit to 0 when we represent denormals, we4635 // just decrement the significand.4636 integerPart *Parts = significandParts();4637 APInt::tcDecrement(Parts, partCount());4638 4639 if (WillCrossBinadeBoundary) {4640 // Our result is a normal number. Do the following:4641 // 1. Set the integral bit to 1.4642 // 2. Decrement the exponent.4643 APInt::tcSetBit(Parts, semantics->precision - 1);4644 exponent--;4645 }4646 } else {4647 // If we are positive, we need to increment the significand.4648 4649 // We only cross a binade boundary that requires adjusting the exponent if4650 // the input is not a denormal and all of said input's significand bits4651 // are set. If all of said conditions are true: clear the significand, set4652 // the integral bit to 1, and increment the exponent. If we have a4653 // denormal always increment since moving denormals and the numbers in the4654 // smallest normal binade have the same exponent in our representation.4655 // If there are only exponents, any increment always crosses the4656 // BinadeBoundary.4657 bool WillCrossBinadeBoundary = !APFloat::hasSignificand(*semantics) ||4658 (!isDenormal() && isSignificandAllOnes());4659 4660 if (WillCrossBinadeBoundary) {4661 integerPart *Parts = significandParts();4662 APInt::tcSet(Parts, 0, partCount());4663 APInt::tcSetBit(Parts, semantics->precision - 1);4664 assert(exponent != semantics->maxExponent &&4665 "We can not increment an exponent beyond the maxExponent allowed"4666 " by the given floating point semantics.");4667 exponent++;4668 } else {4669 incrementSignificand();4670 }4671 }4672 break;4673 }4674 4675 // If we are performing nextDown, swap sign so we have -nextUp(-x)4676 if (nextDown)4677 changeSign();4678 4679 return result;4680}4681 4682APFloatBase::ExponentType IEEEFloat::exponentNaN() const {4683 return ::exponentNaN(*semantics);4684}4685 4686APFloatBase::ExponentType IEEEFloat::exponentInf() const {4687 return ::exponentInf(*semantics);4688}4689 4690APFloatBase::ExponentType IEEEFloat::exponentZero() const {4691 return ::exponentZero(*semantics);4692}4693 4694void IEEEFloat::makeInf(bool Negative) {4695 if (semantics->nonFiniteBehavior == fltNonfiniteBehavior::FiniteOnly)4696 llvm_unreachable("This floating point format does not support Inf");4697 4698 if (semantics->nonFiniteBehavior == fltNonfiniteBehavior::NanOnly) {4699 // There is no Inf, so make NaN instead.4700 makeNaN(false, Negative);4701 return;4702 }4703 category = fcInfinity;4704 sign = Negative;4705 exponent = exponentInf();4706 APInt::tcSet(significandParts(), 0, partCount());4707}4708 4709void IEEEFloat::makeZero(bool Negative) {4710 if (!semantics->hasZero)4711 llvm_unreachable("This floating point format does not support Zero");4712 4713 category = fcZero;4714 sign = Negative;4715 if (semantics->nanEncoding == fltNanEncoding::NegativeZero) {4716 // Merge negative zero to positive because 0b10000...000 is used for NaN4717 sign = false;4718 }4719 exponent = exponentZero();4720 APInt::tcSet(significandParts(), 0, partCount());4721}4722 4723void IEEEFloat::makeQuiet() {4724 assert(isNaN());4725 if (semantics->nonFiniteBehavior != fltNonfiniteBehavior::NanOnly)4726 APInt::tcSetBit(significandParts(), semantics->precision - 2);4727}4728 4729int ilogb(const IEEEFloat &Arg) {4730 if (Arg.isNaN())4731 return APFloat::IEK_NaN;4732 if (Arg.isZero())4733 return APFloat::IEK_Zero;4734 if (Arg.isInfinity())4735 return APFloat::IEK_Inf;4736 if (!Arg.isDenormal())4737 return Arg.exponent;4738 4739 IEEEFloat Normalized(Arg);4740 int SignificandBits = Arg.getSemantics().precision - 1;4741 4742 Normalized.exponent += SignificandBits;4743 Normalized.normalize(APFloat::rmNearestTiesToEven, lfExactlyZero);4744 return Normalized.exponent - SignificandBits;4745}4746 4747IEEEFloat scalbn(IEEEFloat X, int Exp, roundingMode RoundingMode) {4748 auto MaxExp = X.getSemantics().maxExponent;4749 auto MinExp = X.getSemantics().minExponent;4750 4751 // If Exp is wildly out-of-scale, simply adding it to X.exponent will4752 // overflow; clamp it to a safe range before adding, but ensure that the range4753 // is large enough that the clamp does not change the result. The range we4754 // need to support is the difference between the largest possible exponent and4755 // the normalized exponent of half the smallest denormal.4756 4757 int SignificandBits = X.getSemantics().precision - 1;4758 int MaxIncrement = MaxExp - (MinExp - SignificandBits) + 1;4759 4760 // Clamp to one past the range ends to let normalize handle overlflow.4761 X.exponent += std::clamp(Exp, -MaxIncrement - 1, MaxIncrement);4762 X.normalize(RoundingMode, lfExactlyZero);4763 if (X.isNaN())4764 X.makeQuiet();4765 return X;4766}4767 4768IEEEFloat frexp(const IEEEFloat &Val, int &Exp, roundingMode RM) {4769 Exp = ilogb(Val);4770 4771 // Quiet signalling nans.4772 if (Exp == APFloat::IEK_NaN) {4773 IEEEFloat Quiet(Val);4774 Quiet.makeQuiet();4775 return Quiet;4776 }4777 4778 if (Exp == APFloat::IEK_Inf)4779 return Val;4780 4781 // 1 is added because frexp is defined to return a normalized fraction in4782 // +/-[0.5, 1.0), rather than the usual +/-[1.0, 2.0).4783 Exp = Exp == APFloat::IEK_Zero ? 0 : Exp + 1;4784 return scalbn(Val, -Exp, RM);4785}4786 4787DoubleAPFloat::DoubleAPFloat(const fltSemantics &S)4788 : Semantics(&S),4789 Floats(new APFloat[2]{APFloat(APFloatBase::semIEEEdouble),4790 APFloat(APFloatBase::semIEEEdouble)}) {4791 assert(Semantics == &APFloatBase::semPPCDoubleDouble);4792}4793 4794DoubleAPFloat::DoubleAPFloat(const fltSemantics &S, uninitializedTag)4795 : Semantics(&S), Floats(new APFloat[2]{4796 APFloat(APFloatBase::semIEEEdouble, uninitialized),4797 APFloat(APFloatBase::semIEEEdouble, uninitialized)}) {4798 assert(Semantics == &APFloatBase::semPPCDoubleDouble);4799}4800 4801DoubleAPFloat::DoubleAPFloat(const fltSemantics &S, integerPart I)4802 : Semantics(&S),4803 Floats(new APFloat[2]{APFloat(APFloatBase::semIEEEdouble, I),4804 APFloat(APFloatBase::semIEEEdouble)}) {4805 assert(Semantics == &APFloatBase::semPPCDoubleDouble);4806}4807 4808DoubleAPFloat::DoubleAPFloat(const fltSemantics &S, const APInt &I)4809 : Semantics(&S),4810 Floats(new APFloat[2]{4811 APFloat(APFloatBase::semIEEEdouble, APInt(64, I.getRawData()[0])),4812 APFloat(APFloatBase::semIEEEdouble, APInt(64, I.getRawData()[1]))}) {4813 assert(Semantics == &APFloatBase::semPPCDoubleDouble);4814}4815 4816DoubleAPFloat::DoubleAPFloat(const fltSemantics &S, APFloat &&First,4817 APFloat &&Second)4818 : Semantics(&S),4819 Floats(new APFloat[2]{std::move(First), std::move(Second)}) {4820 assert(Semantics == &APFloatBase::semPPCDoubleDouble);4821 assert(&Floats[0].getSemantics() == &APFloatBase::semIEEEdouble);4822 assert(&Floats[1].getSemantics() == &APFloatBase::semIEEEdouble);4823}4824 4825DoubleAPFloat::DoubleAPFloat(const DoubleAPFloat &RHS)4826 : Semantics(RHS.Semantics),4827 Floats(RHS.Floats ? new APFloat[2]{APFloat(RHS.Floats[0]),4828 APFloat(RHS.Floats[1])}4829 : nullptr) {4830 assert(Semantics == &APFloatBase::semPPCDoubleDouble);4831}4832 4833DoubleAPFloat::DoubleAPFloat(DoubleAPFloat &&RHS)4834 : Semantics(RHS.Semantics), Floats(RHS.Floats) {4835 RHS.Semantics = &APFloatBase::semBogus;4836 RHS.Floats = nullptr;4837 assert(Semantics == &APFloatBase::semPPCDoubleDouble);4838}4839 4840DoubleAPFloat &DoubleAPFloat::operator=(const DoubleAPFloat &RHS) {4841 if (Semantics == RHS.Semantics && RHS.Floats) {4842 Floats[0] = RHS.Floats[0];4843 Floats[1] = RHS.Floats[1];4844 } else if (this != &RHS) {4845 this->~DoubleAPFloat();4846 new (this) DoubleAPFloat(RHS);4847 }4848 return *this;4849}4850 4851// Returns a result such that:4852// 1. abs(Lo) <= ulp(Hi)/24853// 2. Hi == RTNE(Hi + Lo)4854// 3. Hi + Lo == X + Y4855//4856// Requires that log2(X) >= log2(Y).4857static std::pair<APFloat, APFloat> fastTwoSum(APFloat X, APFloat Y) {4858 if (!X.isFinite())4859 return {X, APFloat::getZero(X.getSemantics(), /*Negative=*/false)};4860 APFloat Hi = X + Y;4861 APFloat Delta = Hi - X;4862 APFloat Lo = Y - Delta;4863 return {Hi, Lo};4864}4865 4866// Implement addition, subtraction, multiplication and division based on:4867// "Software for Doubled-Precision Floating-Point Computations",4868// by Seppo Linnainmaa, ACM TOMS vol 7 no 3, September 1981, pages 272-283.4869APFloat::opStatus DoubleAPFloat::addImpl(const APFloat &a, const APFloat &aa,4870 const APFloat &c, const APFloat &cc,4871 roundingMode RM) {4872 int Status = opOK;4873 APFloat z = a;4874 Status |= z.add(c, RM);4875 if (!z.isFinite()) {4876 if (!z.isInfinity()) {4877 Floats[0] = std::move(z);4878 Floats[1].makeZero(/* Neg = */ false);4879 return (opStatus)Status;4880 }4881 Status = opOK;4882 auto AComparedToC = a.compareAbsoluteValue(c);4883 z = cc;4884 Status |= z.add(aa, RM);4885 if (AComparedToC == APFloat::cmpGreaterThan) {4886 // z = cc + aa + c + a;4887 Status |= z.add(c, RM);4888 Status |= z.add(a, RM);4889 } else {4890 // z = cc + aa + a + c;4891 Status |= z.add(a, RM);4892 Status |= z.add(c, RM);4893 }4894 if (!z.isFinite()) {4895 Floats[0] = std::move(z);4896 Floats[1].makeZero(/* Neg = */ false);4897 return (opStatus)Status;4898 }4899 Floats[0] = z;4900 APFloat zz = aa;4901 Status |= zz.add(cc, RM);4902 if (AComparedToC == APFloat::cmpGreaterThan) {4903 // Floats[1] = a - z + c + zz;4904 Floats[1] = a;4905 Status |= Floats[1].subtract(z, RM);4906 Status |= Floats[1].add(c, RM);4907 Status |= Floats[1].add(zz, RM);4908 } else {4909 // Floats[1] = c - z + a + zz;4910 Floats[1] = c;4911 Status |= Floats[1].subtract(z, RM);4912 Status |= Floats[1].add(a, RM);4913 Status |= Floats[1].add(zz, RM);4914 }4915 } else {4916 // q = a - z;4917 APFloat q = a;4918 Status |= q.subtract(z, RM);4919 4920 // zz = q + c + (a - (q + z)) + aa + cc;4921 // Compute a - (q + z) as -((q + z) - a) to avoid temporary copies.4922 auto zz = q;4923 Status |= zz.add(c, RM);4924 Status |= q.add(z, RM);4925 Status |= q.subtract(a, RM);4926 q.changeSign();4927 Status |= zz.add(q, RM);4928 Status |= zz.add(aa, RM);4929 Status |= zz.add(cc, RM);4930 if (zz.isZero() && !zz.isNegative()) {4931 Floats[0] = std::move(z);4932 Floats[1].makeZero(/* Neg = */ false);4933 return opOK;4934 }4935 Floats[0] = z;4936 Status |= Floats[0].add(zz, RM);4937 if (!Floats[0].isFinite()) {4938 Floats[1].makeZero(/* Neg = */ false);4939 return (opStatus)Status;4940 }4941 Floats[1] = std::move(z);4942 Status |= Floats[1].subtract(Floats[0], RM);4943 Status |= Floats[1].add(zz, RM);4944 }4945 return (opStatus)Status;4946}4947 4948APFloat::opStatus DoubleAPFloat::addWithSpecial(const DoubleAPFloat &LHS,4949 const DoubleAPFloat &RHS,4950 DoubleAPFloat &Out,4951 roundingMode RM) {4952 if (LHS.getCategory() == fcNaN) {4953 Out = LHS;4954 return opOK;4955 }4956 if (RHS.getCategory() == fcNaN) {4957 Out = RHS;4958 return opOK;4959 }4960 if (LHS.getCategory() == fcZero) {4961 Out = RHS;4962 return opOK;4963 }4964 if (RHS.getCategory() == fcZero) {4965 Out = LHS;4966 return opOK;4967 }4968 if (LHS.getCategory() == fcInfinity && RHS.getCategory() == fcInfinity &&4969 LHS.isNegative() != RHS.isNegative()) {4970 Out.makeNaN(false, Out.isNegative(), nullptr);4971 return opInvalidOp;4972 }4973 if (LHS.getCategory() == fcInfinity) {4974 Out = LHS;4975 return opOK;4976 }4977 if (RHS.getCategory() == fcInfinity) {4978 Out = RHS;4979 return opOK;4980 }4981 assert(LHS.getCategory() == fcNormal && RHS.getCategory() == fcNormal);4982 4983 APFloat A(LHS.Floats[0]), AA(LHS.Floats[1]), C(RHS.Floats[0]),4984 CC(RHS.Floats[1]);4985 assert(&A.getSemantics() == &APFloatBase::semIEEEdouble);4986 assert(&AA.getSemantics() == &APFloatBase::semIEEEdouble);4987 assert(&C.getSemantics() == &APFloatBase::semIEEEdouble);4988 assert(&CC.getSemantics() == &APFloatBase::semIEEEdouble);4989 assert(&Out.Floats[0].getSemantics() == &APFloatBase::semIEEEdouble);4990 assert(&Out.Floats[1].getSemantics() == &APFloatBase::semIEEEdouble);4991 return Out.addImpl(A, AA, C, CC, RM);4992}4993 4994APFloat::opStatus DoubleAPFloat::add(const DoubleAPFloat &RHS,4995 roundingMode RM) {4996 return addWithSpecial(*this, RHS, *this, RM);4997}4998 4999APFloat::opStatus DoubleAPFloat::subtract(const DoubleAPFloat &RHS,5000 roundingMode RM) {5001 changeSign();5002 auto Ret = add(RHS, RM);5003 changeSign();5004 return Ret;5005}5006 5007APFloat::opStatus DoubleAPFloat::multiply(const DoubleAPFloat &RHS,5008 APFloat::roundingMode RM) {5009 const auto &LHS = *this;5010 auto &Out = *this;5011 /* Interesting observation: For special categories, finding the lowest5012 common ancestor of the following layered graph gives the correct5013 return category:5014 5015 NaN5016 / \5017 Zero Inf5018 \ /5019 Normal5020 5021 e.g. NaN * NaN = NaN5022 Zero * Inf = NaN5023 Normal * Zero = Zero5024 Normal * Inf = Inf5025 */5026 if (LHS.getCategory() == fcNaN) {5027 Out = LHS;5028 return opOK;5029 }5030 if (RHS.getCategory() == fcNaN) {5031 Out = RHS;5032 return opOK;5033 }5034 if ((LHS.getCategory() == fcZero && RHS.getCategory() == fcInfinity) ||5035 (LHS.getCategory() == fcInfinity && RHS.getCategory() == fcZero)) {5036 Out.makeNaN(false, false, nullptr);5037 return opOK;5038 }5039 if (LHS.getCategory() == fcZero || LHS.getCategory() == fcInfinity) {5040 Out = LHS;5041 return opOK;5042 }5043 if (RHS.getCategory() == fcZero || RHS.getCategory() == fcInfinity) {5044 Out = RHS;5045 return opOK;5046 }5047 assert(LHS.getCategory() == fcNormal && RHS.getCategory() == fcNormal &&5048 "Special cases not handled exhaustively");5049 5050 int Status = opOK;5051 APFloat A = Floats[0], B = Floats[1], C = RHS.Floats[0], D = RHS.Floats[1];5052 // t = a * c5053 APFloat T = A;5054 Status |= T.multiply(C, RM);5055 if (!T.isFiniteNonZero()) {5056 Floats[0] = T;5057 Floats[1].makeZero(/* Neg = */ false);5058 return (opStatus)Status;5059 }5060 5061 // tau = fmsub(a, c, t), that is -fmadd(-a, c, t).5062 APFloat Tau = A;5063 T.changeSign();5064 Status |= Tau.fusedMultiplyAdd(C, T, RM);5065 T.changeSign();5066 {5067 // v = a * d5068 APFloat V = A;5069 Status |= V.multiply(D, RM);5070 // w = b * c5071 APFloat W = B;5072 Status |= W.multiply(C, RM);5073 Status |= V.add(W, RM);5074 // tau += v + w5075 Status |= Tau.add(V, RM);5076 }5077 // u = t + tau5078 APFloat U = T;5079 Status |= U.add(Tau, RM);5080 5081 Floats[0] = U;5082 if (!U.isFinite()) {5083 Floats[1].makeZero(/* Neg = */ false);5084 } else {5085 // Floats[1] = (t - u) + tau5086 Status |= T.subtract(U, RM);5087 Status |= T.add(Tau, RM);5088 Floats[1] = T;5089 }5090 return (opStatus)Status;5091}5092 5093APFloat::opStatus DoubleAPFloat::divide(const DoubleAPFloat &RHS,5094 APFloat::roundingMode RM) {5095 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&5096 "Unexpected Semantics");5097 APFloat Tmp(APFloatBase::semPPCDoubleDoubleLegacy, bitcastToAPInt());5098 auto Ret = Tmp.divide(5099 APFloat(APFloatBase::semPPCDoubleDoubleLegacy, RHS.bitcastToAPInt()), RM);5100 *this = DoubleAPFloat(APFloatBase::semPPCDoubleDouble, Tmp.bitcastToAPInt());5101 return Ret;5102}5103 5104APFloat::opStatus DoubleAPFloat::remainder(const DoubleAPFloat &RHS) {5105 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&5106 "Unexpected Semantics");5107 APFloat Tmp(APFloatBase::semPPCDoubleDoubleLegacy, bitcastToAPInt());5108 auto Ret = Tmp.remainder(5109 APFloat(APFloatBase::semPPCDoubleDoubleLegacy, RHS.bitcastToAPInt()));5110 *this = DoubleAPFloat(APFloatBase::semPPCDoubleDouble, Tmp.bitcastToAPInt());5111 return Ret;5112}5113 5114APFloat::opStatus DoubleAPFloat::mod(const DoubleAPFloat &RHS) {5115 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&5116 "Unexpected Semantics");5117 APFloat Tmp(APFloatBase::semPPCDoubleDoubleLegacy, bitcastToAPInt());5118 auto Ret = Tmp.mod(5119 APFloat(APFloatBase::semPPCDoubleDoubleLegacy, RHS.bitcastToAPInt()));5120 *this = DoubleAPFloat(APFloatBase::semPPCDoubleDouble, Tmp.bitcastToAPInt());5121 return Ret;5122}5123 5124APFloat::opStatus5125DoubleAPFloat::fusedMultiplyAdd(const DoubleAPFloat &Multiplicand,5126 const DoubleAPFloat &Addend,5127 APFloat::roundingMode RM) {5128 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&5129 "Unexpected Semantics");5130 APFloat Tmp(APFloatBase::semPPCDoubleDoubleLegacy, bitcastToAPInt());5131 auto Ret = Tmp.fusedMultiplyAdd(5132 APFloat(APFloatBase::semPPCDoubleDoubleLegacy,5133 Multiplicand.bitcastToAPInt()),5134 APFloat(APFloatBase::semPPCDoubleDoubleLegacy, Addend.bitcastToAPInt()),5135 RM);5136 *this = DoubleAPFloat(APFloatBase::semPPCDoubleDouble, Tmp.bitcastToAPInt());5137 return Ret;5138}5139 5140APFloat::opStatus DoubleAPFloat::roundToIntegral(APFloat::roundingMode RM) {5141 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&5142 "Unexpected Semantics");5143 const APFloat &Hi = getFirst();5144 const APFloat &Lo = getSecond();5145 5146 APFloat RoundedHi = Hi;5147 const opStatus HiStatus = RoundedHi.roundToIntegral(RM);5148 5149 // We can reduce the problem to just the high part if the input:5150 // 1. Represents a non-finite value.5151 // 2. Has a component which is zero.5152 if (!Hi.isFiniteNonZero() || Lo.isZero()) {5153 Floats[0] = std::move(RoundedHi);5154 Floats[1].makeZero(/*Neg=*/false);5155 return HiStatus;5156 }5157 5158 // Adjust `Rounded` in the direction of `TieBreaker` if `ToRound` was at a5159 // halfway point.5160 auto RoundToNearestHelper = [](APFloat ToRound, APFloat Rounded,5161 APFloat TieBreaker) {5162 // RoundingError tells us which direction we rounded:5163 // - RoundingError > 0: we rounded up.5164 // - RoundingError < 0: we rounded down.5165 // Sterbenz' lemma ensures that RoundingError is exact.5166 const APFloat RoundingError = Rounded - ToRound;5167 if (TieBreaker.isNonZero() &&5168 TieBreaker.isNegative() != RoundingError.isNegative() &&5169 abs(RoundingError).isExactlyValue(0.5))5170 Rounded.add(5171 APFloat::getOne(Rounded.getSemantics(), TieBreaker.isNegative()),5172 rmNearestTiesToEven);5173 return Rounded;5174 };5175 5176 // Case 1: Hi is not an integer.5177 // Special cases are for rounding modes that are sensitive to ties.5178 if (RoundedHi != Hi) {5179 // We need to consider the case where Hi was between two integers and the5180 // rounding mode broke the tie when, in fact, Lo may have had a different5181 // sign than Hi.5182 if (RM == rmNearestTiesToAway || RM == rmNearestTiesToEven)5183 RoundedHi = RoundToNearestHelper(Hi, RoundedHi, Lo);5184 5185 Floats[0] = std::move(RoundedHi);5186 Floats[1].makeZero(/*Neg=*/false);5187 return HiStatus;5188 }5189 5190 // Case 2: Hi is an integer.5191 // Special cases are for rounding modes which are rounding towards or away from zero.5192 RoundingMode LoRoundingMode;5193 if (RM == rmTowardZero)5194 // When our input is positive, we want the Lo component rounded toward5195 // negative infinity to get the smallest result magnitude. Likewise,5196 // negative inputs want the Lo component rounded toward positive infinity.5197 LoRoundingMode = isNegative() ? rmTowardPositive : rmTowardNegative;5198 else5199 LoRoundingMode = RM;5200 5201 APFloat RoundedLo = Lo;5202 const opStatus LoStatus = RoundedLo.roundToIntegral(LoRoundingMode);5203 if (LoRoundingMode == rmNearestTiesToAway)5204 // We need to consider the case where Lo was between two integers and the5205 // rounding mode broke the tie when, in fact, Hi may have had a different5206 // sign than Lo.5207 RoundedLo = RoundToNearestHelper(Lo, RoundedLo, Hi);5208 5209 // We must ensure that the final result has no overlap between the two APFloat values.5210 std::tie(RoundedHi, RoundedLo) = fastTwoSum(RoundedHi, RoundedLo);5211 5212 Floats[0] = std::move(RoundedHi);5213 Floats[1] = std::move(RoundedLo);5214 return LoStatus;5215}5216 5217void DoubleAPFloat::changeSign() {5218 Floats[0].changeSign();5219 Floats[1].changeSign();5220}5221 5222APFloat::cmpResult5223DoubleAPFloat::compareAbsoluteValue(const DoubleAPFloat &RHS) const {5224 // Compare absolute values of the high parts.5225 const cmpResult HiPartCmp = Floats[0].compareAbsoluteValue(RHS.Floats[0]);5226 if (HiPartCmp != cmpEqual)5227 return HiPartCmp;5228 5229 // Zero, regardless of sign, is equal.5230 if (Floats[1].isZero() && RHS.Floats[1].isZero())5231 return cmpEqual;5232 5233 // At this point, |this->Hi| == |RHS.Hi|.5234 // The magnitude is |Hi+Lo| which is Hi+|Lo| if signs of Hi and Lo are the5235 // same, and Hi-|Lo| if signs are different.5236 const bool ThisIsSubtractive =5237 Floats[0].isNegative() != Floats[1].isNegative();5238 const bool RHSIsSubtractive =5239 RHS.Floats[0].isNegative() != RHS.Floats[1].isNegative();5240 5241 // Case 1: The low part of 'this' is zero.5242 if (Floats[1].isZero())5243 // We are comparing |Hi| vs. |Hi| ± |RHS.Lo|.5244 // If RHS is subtractive, its magnitude is smaller.5245 // If RHS is additive, its magnitude is larger.5246 return RHSIsSubtractive ? cmpGreaterThan : cmpLessThan;5247 5248 // Case 2: The low part of 'RHS' is zero (and we know 'this' is not).5249 if (RHS.Floats[1].isZero())5250 // We are comparing |Hi| ± |This.Lo| vs. |Hi|.5251 // If 'this' is subtractive, its magnitude is smaller.5252 // If 'this' is additive, its magnitude is larger.5253 return ThisIsSubtractive ? cmpLessThan : cmpGreaterThan;5254 5255 // If their natures differ, the additive one is larger.5256 if (ThisIsSubtractive != RHSIsSubtractive)5257 return ThisIsSubtractive ? cmpLessThan : cmpGreaterThan;5258 5259 // Case 3: Both are additive (Hi+|Lo|) or both are subtractive (Hi-|Lo|).5260 // The comparison now depends on the magnitude of the low parts.5261 const cmpResult LoPartCmp = Floats[1].compareAbsoluteValue(RHS.Floats[1]);5262 5263 if (ThisIsSubtractive) {5264 // Both are subtractive (Hi-|Lo|), so the comparison of |Lo| is inverted.5265 if (LoPartCmp == cmpLessThan)5266 return cmpGreaterThan;5267 if (LoPartCmp == cmpGreaterThan)5268 return cmpLessThan;5269 }5270 5271 // If additive, the comparison of |Lo| is direct.5272 // If equal, they are equal.5273 return LoPartCmp;5274}5275 5276APFloat::fltCategory DoubleAPFloat::getCategory() const {5277 return Floats[0].getCategory();5278}5279 5280bool DoubleAPFloat::isNegative() const { return Floats[0].isNegative(); }5281 5282void DoubleAPFloat::makeInf(bool Neg) {5283 Floats[0].makeInf(Neg);5284 Floats[1].makeZero(/* Neg = */ false);5285}5286 5287void DoubleAPFloat::makeZero(bool Neg) {5288 Floats[0].makeZero(Neg);5289 Floats[1].makeZero(/* Neg = */ false);5290}5291 5292void DoubleAPFloat::makeLargest(bool Neg) {5293 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&5294 "Unexpected Semantics");5295 Floats[0] =5296 APFloat(APFloatBase::semIEEEdouble, APInt(64, 0x7fefffffffffffffull));5297 Floats[1] =5298 APFloat(APFloatBase::semIEEEdouble, APInt(64, 0x7c8ffffffffffffeull));5299 if (Neg)5300 changeSign();5301}5302 5303void DoubleAPFloat::makeSmallest(bool Neg) {5304 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&5305 "Unexpected Semantics");5306 Floats[0].makeSmallest(Neg);5307 Floats[1].makeZero(/* Neg = */ false);5308}5309 5310void DoubleAPFloat::makeSmallestNormalized(bool Neg) {5311 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&5312 "Unexpected Semantics");5313 Floats[0] =5314 APFloat(APFloatBase::semIEEEdouble, APInt(64, 0x0360000000000000ull));5315 if (Neg)5316 Floats[0].changeSign();5317 Floats[1].makeZero(/* Neg = */ false);5318}5319 5320void DoubleAPFloat::makeNaN(bool SNaN, bool Neg, const APInt *fill) {5321 Floats[0].makeNaN(SNaN, Neg, fill);5322 Floats[1].makeZero(/* Neg = */ false);5323}5324 5325APFloat::cmpResult DoubleAPFloat::compare(const DoubleAPFloat &RHS) const {5326 auto Result = Floats[0].compare(RHS.Floats[0]);5327 // |Float[0]| > |Float[1]|5328 if (Result == APFloat::cmpEqual)5329 return Floats[1].compare(RHS.Floats[1]);5330 return Result;5331}5332 5333bool DoubleAPFloat::bitwiseIsEqual(const DoubleAPFloat &RHS) const {5334 return Floats[0].bitwiseIsEqual(RHS.Floats[0]) &&5335 Floats[1].bitwiseIsEqual(RHS.Floats[1]);5336}5337 5338hash_code hash_value(const DoubleAPFloat &Arg) {5339 if (Arg.Floats)5340 return hash_combine(hash_value(Arg.Floats[0]), hash_value(Arg.Floats[1]));5341 return hash_combine(Arg.Semantics);5342}5343 5344APInt DoubleAPFloat::bitcastToAPInt() const {5345 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&5346 "Unexpected Semantics");5347 uint64_t Data[] = {5348 Floats[0].bitcastToAPInt().getRawData()[0],5349 Floats[1].bitcastToAPInt().getRawData()[0],5350 };5351 return APInt(128, Data);5352}5353 5354Expected<APFloat::opStatus> DoubleAPFloat::convertFromString(StringRef S,5355 roundingMode RM) {5356 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&5357 "Unexpected Semantics");5358 APFloat Tmp(APFloatBase::semPPCDoubleDoubleLegacy);5359 auto Ret = Tmp.convertFromString(S, RM);5360 *this = DoubleAPFloat(APFloatBase::semPPCDoubleDouble, Tmp.bitcastToAPInt());5361 return Ret;5362}5363 5364// The double-double lattice of values corresponds to numbers which obey:5365// - abs(lo) <= 1/2 * ulp(hi)5366// - roundTiesToEven(hi + lo) == hi5367//5368// nextUp must choose the smallest output > input that follows these rules.5369// nexDown must choose the largest output < input that follows these rules.5370APFloat::opStatus DoubleAPFloat::next(bool nextDown) {5371 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&5372 "Unexpected Semantics");5373 // nextDown(x) = -nextUp(-x)5374 if (nextDown) {5375 changeSign();5376 APFloat::opStatus Result = next(/*nextDown=*/false);5377 changeSign();5378 return Result;5379 }5380 switch (getCategory()) {5381 case fcInfinity:5382 // nextUp(+inf) = +inf5383 // nextUp(-inf) = -getLargest()5384 if (isNegative())5385 makeLargest(true);5386 return opOK;5387 5388 case fcNaN:5389 // IEEE-754R 2008 6.2 Par 2: nextUp(sNaN) = qNaN. Set Invalid flag.5390 // IEEE-754R 2008 6.2: nextUp(qNaN) = qNaN. Must be identity so we do not5391 // change the payload.5392 if (getFirst().isSignaling()) {5393 // For consistency, propagate the sign of the sNaN to the qNaN.5394 makeNaN(false, isNegative(), nullptr);5395 return opInvalidOp;5396 }5397 return opOK;5398 5399 case fcZero:5400 // nextUp(pm 0) = +getSmallest()5401 makeSmallest(false);5402 return opOK;5403 5404 case fcNormal:5405 break;5406 }5407 5408 const APFloat &HiOld = getFirst();5409 const APFloat &LoOld = getSecond();5410 5411 APFloat NextLo = LoOld;5412 NextLo.next(/*nextDown=*/false);5413 5414 // We want to admit values where:5415 // 1. abs(Lo) <= ulp(Hi)/25416 // 2. Hi == RTNE(Hi + lo)5417 auto InLattice = [](const APFloat &Hi, const APFloat &Lo) {5418 return Hi + Lo == Hi;5419 };5420 5421 // Check if (HiOld, nextUp(LoOld) is in the lattice.5422 if (InLattice(HiOld, NextLo)) {5423 // Yes, the result is (HiOld, nextUp(LoOld)).5424 Floats[1] = std::move(NextLo);5425 5426 // TODO: Because we currently rely on semPPCDoubleDoubleLegacy, our maximum5427 // value is defined to have exactly 106 bits of precision. This limitation5428 // results in semPPCDoubleDouble being unable to reach its maximum canonical5429 // value.5430 DoubleAPFloat Largest{*Semantics, uninitialized};5431 Largest.makeLargest(/*Neg=*/false);5432 if (compare(Largest) == cmpGreaterThan)5433 makeInf(/*Neg=*/false);5434 5435 return opOK;5436 }5437 5438 // Now we need to handle the cases where (HiOld, nextUp(LoOld)) is not the5439 // correct result. We know the new hi component will be nextUp(HiOld) but our5440 // lattice rules make it a little ambiguous what the correct NextLo must be.5441 APFloat NextHi = HiOld;5442 NextHi.next(/*nextDown=*/false);5443 5444 // nextUp(getLargest()) == INFINITY5445 if (NextHi.isInfinity()) {5446 makeInf(/*Neg=*/false);5447 return opOK;5448 }5449 5450 // IEEE 754-2019 5.3.1:5451 // "If x is the negative number of least magnitude in x's format, nextUp(x) is5452 // -0."5453 if (NextHi.isZero()) {5454 makeZero(/*Neg=*/true);5455 return opOK;5456 }5457 5458 // abs(NextLo) must be <= ulp(NextHi)/2. We want NextLo to be as close to5459 // negative infinity as possible.5460 NextLo = neg(scalbn(harrisonUlp(NextHi), -1, rmTowardZero));5461 if (!InLattice(NextHi, NextLo))5462 // RTNE may mean that Lo must be < ulp(NextHi) / 2 so we bump NextLo.5463 NextLo.next(/*nextDown=*/false);5464 5465 Floats[0] = std::move(NextHi);5466 Floats[1] = std::move(NextLo);5467 5468 return opOK;5469}5470 5471APFloat::opStatus DoubleAPFloat::convertToSignExtendedInteger(5472 MutableArrayRef<integerPart> Input, unsigned int Width, bool IsSigned,5473 roundingMode RM, bool *IsExact) const {5474 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&5475 "Unexpected Semantics");5476 5477 // If Hi is not finite, or Lo is zero, the value is entirely represented5478 // by Hi. Delegate to the simpler single-APFloat conversion.5479 if (!getFirst().isFiniteNonZero() || getSecond().isZero())5480 return getFirst().convertToInteger(Input, Width, IsSigned, RM, IsExact);5481 5482 // First, round the full double-double value to an integral value. This5483 // simplifies the rest of the function, as we no longer need to consider5484 // fractional parts.5485 *IsExact = false;5486 DoubleAPFloat Integral = *this;5487 const opStatus RoundStatus = Integral.roundToIntegral(RM);5488 if (RoundStatus == opInvalidOp)5489 return opInvalidOp;5490 const APFloat &IntegralHi = Integral.getFirst();5491 const APFloat &IntegralLo = Integral.getSecond();5492 5493 // If rounding results in either component being zero, the sum is trivial.5494 // Delegate to the simpler single-APFloat conversion.5495 bool HiIsExact;5496 if (IntegralHi.isZero() || IntegralLo.isZero()) {5497 const opStatus HiStatus =5498 IntegralHi.convertToInteger(Input, Width, IsSigned, RM, &HiIsExact);5499 // The conversion from an integer-valued float to an APInt may fail if the5500 // result would be out of range. Regardless, taking this path is only5501 // possible if rounding occurred during the initial `roundToIntegral`.5502 return HiStatus == opOK ? opInexact : HiStatus;5503 }5504 5505 // A negative number cannot be represented by an unsigned integer.5506 // Since a double-double is canonical, if Hi is negative, the sum is negative.5507 if (!IsSigned && IntegralHi.isNegative())5508 return opInvalidOp;5509 5510 // Handle the special boundary case where |Hi| is exactly the power of two5511 // that marks the edge of the integer's range (e.g., 2^63 for int64_t). In5512 // this situation, Hi itself won't fit, but the sum Hi + Lo might.5513 // `PositiveOverflowWidth` is the bit number for this boundary (N-1 for5514 // signed, N for unsigned).5515 bool LoIsExact;5516 const int HiExactLog2 = IntegralHi.getExactLog2Abs();5517 const unsigned PositiveOverflowWidth = IsSigned ? Width - 1 : Width;5518 if (HiExactLog2 >= 0 &&5519 static_cast<unsigned>(HiExactLog2) == PositiveOverflowWidth) {5520 // If Hi and Lo have the same sign, |Hi + Lo| > |Hi|, so the sum is5521 // guaranteed to overflow. E.g., for uint128_t, (2^128, 1) overflows.5522 if (IntegralHi.isNegative() == IntegralLo.isNegative())5523 return opInvalidOp;5524 5525 // If the signs differ, the sum will fit. We can compute the result using5526 // properties of two's complement arithmetic without a wide intermediate5527 // integer. E.g., for uint128_t, (2^128, -1) should be 2^128 - 1.5528 const opStatus LoStatus = IntegralLo.convertToInteger(5529 Input, Width, /*IsSigned=*/true, RM, &LoIsExact);5530 if (LoStatus == opInvalidOp)5531 return opInvalidOp;5532 5533 // Adjust the bit pattern of Lo to account for Hi's value:5534 // - For unsigned (Hi=2^Width): `2^Width + Lo` in `Width`-bit5535 // arithmetic is equivalent to just `Lo`. The conversion of `Lo` above5536 // already produced the correct final bit pattern.5537 // - For signed (Hi=2^(Width-1)): The sum `2^(Width-1) + Lo` (where Lo<0)5538 // can be computed by taking the two's complement pattern for `Lo` and5539 // clearing the sign bit.5540 if (IsSigned && !IntegralHi.isNegative())5541 APInt::tcClearBit(Input.data(), PositiveOverflowWidth);5542 *IsExact = RoundStatus == opOK;5543 return RoundStatus;5544 }5545 5546 // Convert Hi into an integer. This may not fit but that is OK: we know that5547 // Hi + Lo would not fit either in this situation.5548 const opStatus HiStatus = IntegralHi.convertToInteger(5549 Input, Width, IsSigned, rmTowardZero, &HiIsExact);5550 if (HiStatus == opInvalidOp)5551 return HiStatus;5552 5553 // Convert Lo into a temporary integer of the same width.5554 APSInt LoResult{Width, /*isUnsigned=*/!IsSigned};5555 const opStatus LoStatus =5556 IntegralLo.convertToInteger(LoResult, rmTowardZero, &LoIsExact);5557 if (LoStatus == opInvalidOp)5558 return LoStatus;5559 5560 // Add Lo to Hi. This addition is guaranteed not to overflow because of the5561 // double-double canonicalization rule (`|Lo| <= ulp(Hi)/2`). The only case5562 // where the sum could cross the integer type's boundary is when Hi is a5563 // power of two, which is handled by the special case block above.5564 APInt::tcAdd(Input.data(), LoResult.getRawData(), /*carry=*/0, Input.size());5565 5566 *IsExact = RoundStatus == opOK;5567 return RoundStatus;5568}5569 5570APFloat::opStatus5571DoubleAPFloat::convertToInteger(MutableArrayRef<integerPart> Input,5572 unsigned int Width, bool IsSigned,5573 roundingMode RM, bool *IsExact) const {5574 opStatus FS =5575 convertToSignExtendedInteger(Input, Width, IsSigned, RM, IsExact);5576 5577 if (FS == opInvalidOp) {5578 const unsigned DstPartsCount = partCountForBits(Width);5579 assert(DstPartsCount <= Input.size() && "Integer too big");5580 5581 unsigned Bits;5582 if (getCategory() == fcNaN)5583 Bits = 0;5584 else if (isNegative())5585 Bits = IsSigned;5586 else5587 Bits = Width - IsSigned;5588 5589 tcSetLeastSignificantBits(Input.data(), DstPartsCount, Bits);5590 if (isNegative() && IsSigned)5591 APInt::tcShiftLeft(Input.data(), DstPartsCount, Width - 1);5592 }5593 5594 return FS;5595}5596 5597APFloat::opStatus DoubleAPFloat::handleOverflow(roundingMode RM) {5598 switch (RM) {5599 case APFloat::rmTowardZero:5600 makeLargest(/*Neg=*/isNegative());5601 break;5602 case APFloat::rmTowardNegative:5603 if (isNegative())5604 makeInf(/*Neg=*/true);5605 else5606 makeLargest(/*Neg=*/false);5607 break;5608 case APFloat::rmTowardPositive:5609 if (isNegative())5610 makeLargest(/*Neg=*/true);5611 else5612 makeInf(/*Neg=*/false);5613 break;5614 case APFloat::rmNearestTiesToAway:5615 case APFloat::rmNearestTiesToEven:5616 makeInf(/*Neg=*/isNegative());5617 break;5618 default:5619 llvm_unreachable("Invalid rounding mode found");5620 }5621 opStatus S = opInexact;5622 if (!getFirst().isFinite())5623 S = static_cast<opStatus>(S | opOverflow);5624 return S;5625}5626 5627APFloat::opStatus DoubleAPFloat::convertFromUnsignedParts(5628 const integerPart *Src, unsigned int SrcCount, roundingMode RM) {5629 // Find the most significant bit of the source integer. APInt::tcMSB returns5630 // UINT_MAX for a zero value.5631 const unsigned SrcMSB = APInt::tcMSB(Src, SrcCount);5632 if (SrcMSB == UINT_MAX) {5633 // The source integer is 0.5634 makeZero(/*Neg=*/false);5635 return opOK;5636 }5637 5638 // Create a minimally-sized APInt to represent the source value.5639 const unsigned SrcBitWidth = SrcMSB + 1;5640 APSInt SrcInt{APInt{/*numBits=*/SrcBitWidth, ArrayRef(Src, SrcCount)},5641 /*isUnsigned=*/true};5642 5643 // Stage 1: Initial Approximation.5644 // Convert the source integer SrcInt to the Hi part of the DoubleAPFloat.5645 // We use round-to-nearest because it minimizes the initial error, which is5646 // crucial for the subsequent steps.5647 APFloat Hi{getFirst().getSemantics()};5648 Hi.convertFromAPInt(SrcInt, /*IsSigned=*/false, rmNearestTiesToEven);5649 5650 // If the first approximation already overflows, the number is too large.5651 // NOTE: The underlying semantics are *more* conservative when choosing to5652 // overflow because their notion of ULP is much larger. As such, it is always5653 // safe to overflow at the DoubleAPFloat level if the APFloat overflows.5654 if (!Hi.isFinite())5655 return handleOverflow(RM);5656 5657 // Stage 2: Exact Error Calculation.5658 // Calculate the exact error of the first approximation: Error = SrcInt - Hi.5659 // This is done by converting Hi back to an integer and subtracting it from5660 // the original source.5661 bool HiAsIntIsExact;5662 // Create an integer representation of Hi. Its width is determined by the5663 // exponent of Hi, ensuring it's just large enough. This width can exceed5664 // SrcBitWidth if the conversion to Hi rounded up to a power of two.5665 // accurately when converted back to an integer.5666 APSInt HiAsInt{static_cast<uint32_t>(ilogb(Hi) + 1), /*isUnsigned=*/true};5667 Hi.convertToInteger(HiAsInt, rmNearestTiesToEven, &HiAsIntIsExact);5668 const APInt Error = SrcInt.zext(HiAsInt.getBitWidth()) - HiAsInt;5669 5670 // Stage 3: Error Approximation and Rounding.5671 // Convert the integer error into the Lo part of the DoubleAPFloat. This step5672 // captures the remainder of the original number. The rounding mode for this5673 // conversion (LoRM) may need to be adjusted from the user-requested RM to5674 // ensure the final sum (Hi + Lo) rounds correctly.5675 roundingMode LoRM = RM;5676 // Adjustments are only necessary when the initial approximation Hi was an5677 // overestimate, making the Error negative.5678 if (Error.isNegative()) {5679 if (RM == rmNearestTiesToAway) {5680 // For rmNearestTiesToAway, a tie should round away from zero. Since5681 // SrcInt is positive, this means rounding toward +infinity.5682 // A standard conversion of a negative Error would round ties toward5683 // -infinity, causing the final sum Hi + Lo to be smaller. To5684 // counteract this, we detect the tie case and override the rounding5685 // mode for Lo to rmTowardPositive.5686 const unsigned ErrorActiveBits = Error.getSignificantBits() - 1;5687 const unsigned LoPrecision = getSecond().getSemantics().precision;5688 if (ErrorActiveBits > LoPrecision) {5689 const unsigned RoundingBoundary = ErrorActiveBits - LoPrecision;5690 // A tie occurs when the bits to be truncated are of the form 100...0.5691 // This is detected by checking if the number of trailing zeros is5692 // exactly one less than the number of bits being truncated.5693 if (Error.countTrailingZeros() == RoundingBoundary - 1)5694 LoRM = rmTowardPositive;5695 }5696 } else if (RM == rmTowardZero) {5697 // For rmTowardZero, the final positive result must be truncated (rounded5698 // down). When Hi is an overestimate, Error is negative. A standard5699 // rmTowardZero conversion of Error would make it *less* negative,5700 // effectively rounding the final sum Hi + Lo *up*. To ensure the sum5701 // rounds down correctly, we force Lo to round toward -infinity.5702 LoRM = rmTowardNegative;5703 }5704 }5705 5706 APFloat Lo{getSecond().getSemantics()};5707 opStatus Status = Lo.convertFromAPInt(Error, /*IsSigned=*/true, LoRM);5708 5709 // Renormalize the pair (Hi, Lo) into a canonical DoubleAPFloat form where the5710 // components do not overlap. fastTwoSum performs this operation.5711 std::tie(Hi, Lo) = fastTwoSum(Hi, Lo);5712 Floats[0] = std::move(Hi);5713 Floats[1] = std::move(Lo);5714 5715 // A final check for overflow is needed because fastTwoSum can cause a5716 // carry-out from Lo that pushes Hi to infinity.5717 if (!getFirst().isFinite())5718 return handleOverflow(RM);5719 5720 // The largest DoubleAPFloat must be canonical. Values which are larger are5721 // not canonical and are equivalent to overflow.5722 if (getFirst().isFiniteNonZero() && Floats[0].isLargest()) {5723 DoubleAPFloat Largest{*Semantics};5724 Largest.makeLargest(/*Neg=*/false);5725 if (compare(Largest) == APFloat::cmpGreaterThan)5726 return handleOverflow(RM);5727 }5728 5729 // The final status of the operation is determined by the conversion of the5730 // error term. If Lo could represent Error exactly, the entire conversion5731 // is exact. Otherwise, it's inexact.5732 return Status;5733}5734 5735APFloat::opStatus DoubleAPFloat::convertFromAPInt(const APInt &Input,5736 bool IsSigned,5737 roundingMode RM) {5738 const bool NegateInput = IsSigned && Input.isNegative();5739 APInt API = Input;5740 if (NegateInput)5741 API.negate();5742 5743 const APFloat::opStatus Status =5744 convertFromUnsignedParts(API.getRawData(), API.getNumWords(), RM);5745 if (NegateInput)5746 changeSign();5747 return Status;5748}5749 5750unsigned int DoubleAPFloat::convertToHexString(char *DST,5751 unsigned int HexDigits,5752 bool UpperCase,5753 roundingMode RM) const {5754 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&5755 "Unexpected Semantics");5756 return APFloat(APFloatBase::semPPCDoubleDoubleLegacy, bitcastToAPInt())5757 .convertToHexString(DST, HexDigits, UpperCase, RM);5758}5759 5760bool DoubleAPFloat::isDenormal() const {5761 return getCategory() == fcNormal &&5762 (Floats[0].isDenormal() || Floats[1].isDenormal() ||5763 // (double)(Hi + Lo) == Hi defines a normal number.5764 Floats[0] != Floats[0] + Floats[1]);5765}5766 5767bool DoubleAPFloat::isSmallest() const {5768 if (getCategory() != fcNormal)5769 return false;5770 DoubleAPFloat Tmp(*this);5771 Tmp.makeSmallest(this->isNegative());5772 return Tmp.compare(*this) == cmpEqual;5773}5774 5775bool DoubleAPFloat::isSmallestNormalized() const {5776 if (getCategory() != fcNormal)5777 return false;5778 5779 DoubleAPFloat Tmp(*this);5780 Tmp.makeSmallestNormalized(this->isNegative());5781 return Tmp.compare(*this) == cmpEqual;5782}5783 5784bool DoubleAPFloat::isLargest() const {5785 if (getCategory() != fcNormal)5786 return false;5787 DoubleAPFloat Tmp(*this);5788 Tmp.makeLargest(this->isNegative());5789 return Tmp.compare(*this) == cmpEqual;5790}5791 5792bool DoubleAPFloat::isInteger() const {5793 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&5794 "Unexpected Semantics");5795 return Floats[0].isInteger() && Floats[1].isInteger();5796}5797 5798void DoubleAPFloat::toString(SmallVectorImpl<char> &Str,5799 unsigned FormatPrecision,5800 unsigned FormatMaxPadding,5801 bool TruncateZero) const {5802 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&5803 "Unexpected Semantics");5804 APFloat(APFloatBase::semPPCDoubleDoubleLegacy, bitcastToAPInt())5805 .toString(Str, FormatPrecision, FormatMaxPadding, TruncateZero);5806}5807 5808int DoubleAPFloat::getExactLog2Abs() const {5809 // In order for Hi + Lo to be a power of two, the following must be true:5810 // 1. Hi must be a power of two.5811 // 2. Lo must be zero.5812 if (getSecond().isNonZero())5813 return INT_MIN;5814 return getFirst().getExactLog2Abs();5815}5816 5817int ilogb(const DoubleAPFloat &Arg) {5818 const APFloat &Hi = Arg.getFirst();5819 const APFloat &Lo = Arg.getSecond();5820 int IlogbResult = ilogb(Hi);5821 // Zero and non-finite values can delegate to ilogb(Hi).5822 if (Arg.getCategory() != fcNormal)5823 return IlogbResult;5824 // If Lo can't change the binade, we can delegate to ilogb(Hi).5825 if (Lo.isZero() || Hi.isNegative() == Lo.isNegative())5826 return IlogbResult;5827 if (Hi.getExactLog2Abs() == INT_MIN)5828 return IlogbResult;5829 // Numbers of the form 2^a - 2^b or -2^a + 2^b are almost powers of two but5830 // get nudged out of the binade by the low component.5831 return IlogbResult - 1;5832}5833 5834DoubleAPFloat scalbn(const DoubleAPFloat &Arg, int Exp,5835 APFloat::roundingMode RM) {5836 assert(Arg.Semantics == &APFloatBase::PPCDoubleDouble() &&5837 "Unexpected Semantics");5838 return DoubleAPFloat(APFloatBase::PPCDoubleDouble(),5839 scalbn(Arg.Floats[0], Exp, RM),5840 scalbn(Arg.Floats[1], Exp, RM));5841}5842 5843DoubleAPFloat frexp(const DoubleAPFloat &Arg, int &Exp,5844 APFloat::roundingMode RM) {5845 assert(Arg.Semantics == &APFloatBase::PPCDoubleDouble() &&5846 "Unexpected Semantics");5847 5848 // Get the unbiased exponent e of the number, where |Arg| = m * 2^e for m in5849 // [1.0, 2.0).5850 Exp = ilogb(Arg);5851 5852 // For NaNs, quiet any signaling NaN and return the result, as per standard5853 // practice.5854 if (Exp == APFloat::IEK_NaN) {5855 DoubleAPFloat Quiet{Arg};5856 Quiet.getFirst() = Quiet.getFirst().makeQuiet();5857 return Quiet;5858 }5859 5860 // For infinity, return it unchanged. The exponent remains IEK_Inf.5861 if (Exp == APFloat::IEK_Inf)5862 return Arg;5863 5864 // For zero, the fraction is zero and the standard requires the exponent be 0.5865 if (Exp == APFloat::IEK_Zero) {5866 Exp = 0;5867 return Arg;5868 }5869 5870 const APFloat &Hi = Arg.getFirst();5871 const APFloat &Lo = Arg.getSecond();5872 5873 // frexp requires the fraction's absolute value to be in [0.5, 1.0).5874 // ilogb provides an exponent for an absolute value in [1.0, 2.0).5875 // Increment the exponent to ensure the fraction is in the correct range.5876 ++Exp;5877 5878 const bool SignsDisagree = Hi.isNegative() != Lo.isNegative();5879 APFloat Second = Lo;5880 if (Arg.getCategory() == APFloat::fcNormal && Lo.isFiniteNonZero()) {5881 roundingMode LoRoundingMode;5882 // The interpretation of rmTowardZero depends on the sign of the combined5883 // Arg rather than the sign of the component.5884 if (RM == rmTowardZero)5885 LoRoundingMode = Arg.isNegative() ? rmTowardPositive : rmTowardNegative;5886 // For rmNearestTiesToAway, we face a similar problem. If signs disagree,5887 // Lo is a correction *toward* zero relative to Hi. Rounding Lo5888 // "away from zero" based on its own sign would move the value in the5889 // wrong direction. As a safe proxy, we use rmNearestTiesToEven, which is5890 // direction-agnostic. We only need to bother with this if Lo is scaled5891 // down.5892 else if (RM == rmNearestTiesToAway && SignsDisagree && Exp > 0)5893 LoRoundingMode = rmNearestTiesToEven;5894 else5895 LoRoundingMode = RM;5896 Second = scalbn(Lo, -Exp, LoRoundingMode);5897 // The rmNearestTiesToEven proxy is correct most of the time, but it5898 // differs from rmNearestTiesToAway when the scaled value of Lo is an5899 // exact midpoint.5900 // NOTE: This is morally equivalent to roundTiesTowardZero.5901 if (RM == rmNearestTiesToAway && LoRoundingMode == rmNearestTiesToEven) {5902 // Re-scale the result back to check if rounding occurred.5903 const APFloat RecomposedLo = scalbn(Second, Exp, rmNearestTiesToEven);5904 if (RecomposedLo != Lo) {5905 // RoundingError tells us which direction we rounded:5906 // - RoundingError > 0: we rounded up.5907 // - RoundingError < 0: we down up.5908 const APFloat RoundingError = RecomposedLo - Lo;5909 // Determine if scalbn(Lo, -Exp) landed exactly on a midpoint.5910 // We do this by checking if the absolute rounding error is exactly5911 // half a ULP of the result.5912 const APFloat UlpOfSecond = harrisonUlp(Second);5913 const APFloat ScaledUlpOfSecond =5914 scalbn(UlpOfSecond, Exp - 1, rmNearestTiesToEven);5915 const bool IsMidpoint = abs(RoundingError) == ScaledUlpOfSecond;5916 const bool RoundedLoAway =5917 Second.isNegative() == RoundingError.isNegative();5918 // The sign of Hi and Lo disagree and we rounded Lo away: we must5919 // decrease the magnitude of Second to increase the magnitude5920 // First+Second.5921 if (IsMidpoint && RoundedLoAway)5922 Second.next(/*nextDown=*/!Second.isNegative());5923 }5924 }5925 // Handle a tricky edge case where Arg is slightly less than a power of two5926 // (e.g., Arg = 2^k - epsilon). In this situation:5927 // 1. Hi is 2^k, and Lo is a small negative value -epsilon.5928 // 2. ilogb(Arg) correctly returns k-1.5929 // 3. Our initial Exp becomes (k-1) + 1 = k.5930 // 4. Scaling Hi (2^k) by 2^-k would yield a magnitude of 1.0 and5931 // scaling Lo by 2^-k would yield zero. This would make the result 1.05932 // which is an invalid fraction, as the required interval is [0.5, 1.0).5933 // We detect this specific case by checking if Hi is a power of two and if5934 // the scaled Lo underflowed to zero. The fix: Increment Exp to k+1. This5935 // adjusts the scale factor, causing Hi to be scaled to 0.5, which is a5936 // valid fraction.5937 if (Second.isZero() && SignsDisagree && Hi.getExactLog2Abs() != INT_MIN)5938 ++Exp;5939 }5940 5941 APFloat First = scalbn(Hi, -Exp, RM);5942 return DoubleAPFloat(APFloatBase::PPCDoubleDouble(), std::move(First),5943 std::move(Second));5944}5945 5946} // namespace detail5947 5948APFloat::Storage::Storage(IEEEFloat F, const fltSemantics &Semantics) {5949 if (usesLayout<IEEEFloat>(Semantics)) {5950 new (&IEEE) IEEEFloat(std::move(F));5951 return;5952 }5953 if (usesLayout<DoubleAPFloat>(Semantics)) {5954 const fltSemantics& S = F.getSemantics();5955 new (&Double) DoubleAPFloat(Semantics, APFloat(std::move(F), S),5956 APFloat(APFloatBase::IEEEdouble()));5957 return;5958 }5959 llvm_unreachable("Unexpected semantics");5960}5961 5962Expected<APFloat::opStatus> APFloat::convertFromString(StringRef Str,5963 roundingMode RM) {5964 APFLOAT_DISPATCH_ON_SEMANTICS(convertFromString(Str, RM));5965}5966 5967hash_code hash_value(const APFloat &Arg) {5968 if (APFloat::usesLayout<detail::IEEEFloat>(Arg.getSemantics()))5969 return hash_value(Arg.U.IEEE);5970 if (APFloat::usesLayout<detail::DoubleAPFloat>(Arg.getSemantics()))5971 return hash_value(Arg.U.Double);5972 llvm_unreachable("Unexpected semantics");5973}5974 5975APFloat::APFloat(const fltSemantics &Semantics, StringRef S)5976 : APFloat(Semantics) {5977 auto StatusOrErr = convertFromString(S, rmNearestTiesToEven);5978 assert(StatusOrErr && "Invalid floating point representation");5979 consumeError(StatusOrErr.takeError());5980}5981 5982FPClassTest APFloat::classify() const {5983 if (isZero())5984 return isNegative() ? fcNegZero : fcPosZero;5985 if (isNormal())5986 return isNegative() ? fcNegNormal : fcPosNormal;5987 if (isDenormal())5988 return isNegative() ? fcNegSubnormal : fcPosSubnormal;5989 if (isInfinity())5990 return isNegative() ? fcNegInf : fcPosInf;5991 assert(isNaN() && "Other class of FP constant");5992 return isSignaling() ? fcSNan : fcQNan;5993}5994 5995bool APFloat::getExactInverse(APFloat *Inv) const {5996 // Only finite, non-zero numbers can have a useful, representable inverse.5997 // This check filters out +/- zero, +/- infinity, and NaN.5998 if (!isFiniteNonZero())5999 return false;6000 6001 // Historically, this function rejects subnormal inputs. One reason why this6002 // might be important is that subnormals may behave differently under FTZ/DAZ6003 // runtime behavior.6004 if (isDenormal())6005 return false;6006 6007 // A number has an exact, representable inverse if and only if it is a power6008 // of two.6009 //6010 // Mathematical Rationale:6011 // 1. A binary floating-point number x is a dyadic rational, meaning it can6012 // be written as x = M / 2^k for integers M (the significand) and k.6013 // 2. The inverse is 1/x = 2^k / M.6014 // 3. For 1/x to also be a dyadic rational (and thus exactly representable6015 // in binary), its denominator M must also be a power of two.6016 // Let's say M = 2^m.6017 // 4. Substituting this back into the formula for x, we get6018 // x = (2^m) / (2^k) = 2^(m-k).6019 //6020 // This proves that x must be a power of two.6021 6022 // getExactLog2Abs() returns the integer exponent if the number is a power of6023 // two or INT_MIN if it is not.6024 const int Exp = getExactLog2Abs();6025 if (Exp == INT_MIN)6026 return false;6027 6028 // The inverse of +/- 2^Exp is +/- 2^(-Exp). We can compute this by6029 // scaling 1.0 by the negated exponent.6030 APFloat Reciprocal =6031 scalbn(APFloat::getOne(getSemantics(), /*Negative=*/isNegative()), -Exp,6032 rmTowardZero);6033 6034 // scalbn might round if the resulting exponent -Exp is outside the6035 // representable range, causing overflow (to infinity) or underflow. We6036 // must verify that the result is still the exact power of two we expect.6037 if (Reciprocal.getExactLog2Abs() != -Exp)6038 return false;6039 6040 // Avoid multiplication with a subnormal, it is not safe on all platforms and6041 // may be slower than a normal division.6042 if (Reciprocal.isDenormal())6043 return false;6044 6045 assert(Reciprocal.isFiniteNonZero());6046 6047 if (Inv)6048 *Inv = std::move(Reciprocal);6049 6050 return true;6051}6052 6053APFloat::opStatus APFloat::convert(const fltSemantics &ToSemantics,6054 roundingMode RM, bool *losesInfo) {6055 if (&getSemantics() == &ToSemantics) {6056 *losesInfo = false;6057 return opOK;6058 }6059 if (usesLayout<IEEEFloat>(getSemantics()) &&6060 usesLayout<IEEEFloat>(ToSemantics))6061 return U.IEEE.convert(ToSemantics, RM, losesInfo);6062 if (usesLayout<IEEEFloat>(getSemantics()) &&6063 usesLayout<DoubleAPFloat>(ToSemantics)) {6064 assert(&ToSemantics == &APFloatBase::semPPCDoubleDouble);6065 auto Ret =6066 U.IEEE.convert(APFloatBase::semPPCDoubleDoubleLegacy, RM, losesInfo);6067 *this = APFloat(ToSemantics, U.IEEE.bitcastToAPInt());6068 return Ret;6069 }6070 if (usesLayout<DoubleAPFloat>(getSemantics()) &&6071 usesLayout<IEEEFloat>(ToSemantics)) {6072 auto Ret = getIEEE().convert(ToSemantics, RM, losesInfo);6073 *this = APFloat(std::move(getIEEE()), ToSemantics);6074 return Ret;6075 }6076 llvm_unreachable("Unexpected semantics");6077}6078 6079APFloat APFloat::getAllOnesValue(const fltSemantics &Semantics) {6080 return APFloat(Semantics, APInt::getAllOnes(Semantics.sizeInBits));6081}6082 6083void APFloat::print(raw_ostream &OS) const {6084 SmallVector<char, 16> Buffer;6085 toString(Buffer);6086 OS << Buffer;6087}6088 6089#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)6090LLVM_DUMP_METHOD void APFloat::dump() const {6091 print(dbgs());6092 dbgs() << '\n';6093}6094#endif6095 6096void APFloat::Profile(FoldingSetNodeID &NID) const {6097 NID.Add(bitcastToAPInt());6098}6099 6100APFloat::opStatus APFloat::convertToInteger(APSInt &result,6101 roundingMode rounding_mode,6102 bool *isExact) const {6103 unsigned bitWidth = result.getBitWidth();6104 SmallVector<uint64_t, 4> parts(result.getNumWords());6105 opStatus status = convertToInteger(parts, bitWidth, result.isSigned(),6106 rounding_mode, isExact);6107 // Keeps the original signed-ness.6108 result = APInt(bitWidth, parts);6109 return status;6110}6111 6112double APFloat::convertToDouble() const {6113 if (&getSemantics() ==6114 (const llvm::fltSemantics *)&APFloatBase::semIEEEdouble)6115 return getIEEE().convertToDouble();6116 assert(isRepresentableBy(getSemantics(), semIEEEdouble) &&6117 "Float semantics is not representable by IEEEdouble");6118 APFloat Temp = *this;6119 bool LosesInfo;6120 opStatus St =6121 Temp.convert(APFloatBase::semIEEEdouble, rmNearestTiesToEven, &LosesInfo);6122 assert(!(St & opInexact) && !LosesInfo && "Unexpected imprecision");6123 (void)St;6124 return Temp.getIEEE().convertToDouble();6125}6126 6127#ifdef HAS_IEE754_FLOAT1286128float128 APFloat::convertToQuad() const {6129 if (&getSemantics() == (const llvm::fltSemantics *)&APFloatBase::semIEEEquad)6130 return getIEEE().convertToQuad();6131 assert(isRepresentableBy(getSemantics(), semIEEEquad) &&6132 "Float semantics is not representable by IEEEquad");6133 APFloat Temp = *this;6134 bool LosesInfo;6135 opStatus St =6136 Temp.convert(APFloatBase::semIEEEquad, rmNearestTiesToEven, &LosesInfo);6137 assert(!(St & opInexact) && !LosesInfo && "Unexpected imprecision");6138 (void)St;6139 return Temp.getIEEE().convertToQuad();6140}6141#endif6142 6143float APFloat::convertToFloat() const {6144 if (&getSemantics() ==6145 (const llvm::fltSemantics *)&APFloatBase::semIEEEsingle)6146 return getIEEE().convertToFloat();6147 assert(isRepresentableBy(getSemantics(), semIEEEsingle) &&6148 "Float semantics is not representable by IEEEsingle");6149 APFloat Temp = *this;6150 bool LosesInfo;6151 opStatus St =6152 Temp.convert(APFloatBase::semIEEEsingle, rmNearestTiesToEven, &LosesInfo);6153 assert(!(St & opInexact) && !LosesInfo && "Unexpected imprecision");6154 (void)St;6155 return Temp.getIEEE().convertToFloat();6156}6157 6158APFloat::Storage::~Storage() {6159 if (usesLayout<IEEEFloat>(*semantics)) {6160 IEEE.~IEEEFloat();6161 return;6162 }6163 if (usesLayout<DoubleAPFloat>(*semantics)) {6164 Double.~DoubleAPFloat();6165 return;6166 }6167 llvm_unreachable("Unexpected semantics");6168}6169 6170APFloat::Storage::Storage(const APFloat::Storage &RHS) {6171 if (usesLayout<IEEEFloat>(*RHS.semantics)) {6172 new (this) IEEEFloat(RHS.IEEE);6173 return;6174 }6175 if (usesLayout<DoubleAPFloat>(*RHS.semantics)) {6176 new (this) DoubleAPFloat(RHS.Double);6177 return;6178 }6179 llvm_unreachable("Unexpected semantics");6180}6181 6182APFloat::Storage::Storage(APFloat::Storage &&RHS) {6183 if (usesLayout<IEEEFloat>(*RHS.semantics)) {6184 new (this) IEEEFloat(std::move(RHS.IEEE));6185 return;6186 }6187 if (usesLayout<DoubleAPFloat>(*RHS.semantics)) {6188 new (this) DoubleAPFloat(std::move(RHS.Double));6189 return;6190 }6191 llvm_unreachable("Unexpected semantics");6192}6193 6194APFloat::Storage &APFloat::Storage::operator=(const APFloat::Storage &RHS) {6195 if (usesLayout<IEEEFloat>(*semantics) &&6196 usesLayout<IEEEFloat>(*RHS.semantics)) {6197 IEEE = RHS.IEEE;6198 } else if (usesLayout<DoubleAPFloat>(*semantics) &&6199 usesLayout<DoubleAPFloat>(*RHS.semantics)) {6200 Double = RHS.Double;6201 } else if (this != &RHS) {6202 this->~Storage();6203 new (this) Storage(RHS);6204 }6205 return *this;6206}6207 6208APFloat::Storage &APFloat::Storage::operator=(APFloat::Storage &&RHS) {6209 if (usesLayout<IEEEFloat>(*semantics) &&6210 usesLayout<IEEEFloat>(*RHS.semantics)) {6211 IEEE = std::move(RHS.IEEE);6212 } else if (usesLayout<DoubleAPFloat>(*semantics) &&6213 usesLayout<DoubleAPFloat>(*RHS.semantics)) {6214 Double = std::move(RHS.Double);6215 } else if (this != &RHS) {6216 this->~Storage();6217 new (this) Storage(std::move(RHS));6218 }6219 return *this;6220}6221 6222} // namespace llvm6223 6224#undef APFLOAT_DISPATCH_ON_SEMANTICS6225