23#include "llvm/Config/llvm-config.h"
31#define APFLOAT_DISPATCH_ON_SEMANTICS(METHOD_CALL) \
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"); \
48#define PackCategoriesIntoKey(_lhs, _rhs) ((_lhs) * 4 + (_rhs))
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 = {
141constexpr fltSemantics APFloatBase::semFloat8E4M3 = {7, -6, 4, 8};
144constexpr fltSemantics APFloatBase::semFloat8E4M3FNUZ = {
146constexpr fltSemantics APFloatBase::semFloat8E4M3B11FNUZ = {
148constexpr fltSemantics APFloatBase::semFloat8E3M4 = {3, -2, 5, 8};
149constexpr fltSemantics APFloatBase::semFloatTF32 = {127, -126, 11, 19};
167constexpr fltSemantics APFloatBase::semX87DoubleExtended = {16383, -16382, 64,
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};
268 return A.maxExponent <=
B.maxExponent &&
A.minExponent >=
B.minExponent &&
269 A.precision <=
B.precision;
343 if (Src.maxExponent >= Dst.maxExponent || Src.minExponent <= Dst.minExponent)
351 return Dst.precision >= Src.precision;
391static inline unsigned int
405 unsigned int absExponent;
406 const unsigned int overlargeExponent = 24000;
410 if (p == end || ((*p ==
'-' || *p ==
'+') && (p + 1) == end)) {
414 isNegative = (*p ==
'-');
415 if (*p ==
'-' || *p ==
'+') {
422 if (absExponent >= 10U)
423 return createError(
"Invalid character in exponent");
425 for (; p != end; ++p) {
430 return createError(
"Invalid character in exponent");
432 absExponent = absExponent * 10U + value;
433 if (absExponent >= overlargeExponent) {
434 absExponent = overlargeExponent;
440 return -(int) absExponent;
442 return (
int) absExponent;
449 int exponentAdjustment) {
450 int unsignedExponent;
451 bool negative, overflow;
457 negative = *p ==
'-';
458 if (*p ==
'-' || *p ==
'+') {
464 unsignedExponent = 0;
466 for (; p != end; ++p) {
471 return createError(
"Invalid character in exponent");
473 unsignedExponent = unsignedExponent * 10 + value;
474 if (unsignedExponent > 32767) {
480 if (exponentAdjustment > 32767 || exponentAdjustment < -32768)
484 exponent = unsignedExponent;
486 exponent = -exponent;
487 exponent += exponentAdjustment;
488 if (exponent > 32767 || exponent < -32768)
493 exponent = negative ? -32768: 32767;
503 while (p != end && *p ==
'0')
506 if (p != end && *p ==
'.') {
509 if (end - begin == 1)
512 while (p != end && *p ==
'0')
545 return PtrOrErr.takeError();
548 D->firstSigDigit = p;
550 D->normalizedExponent = 0;
552 for (; p != end; ++p) {
555 return createError(
"String contains multiple dots");
565 if (*p !=
'e' && *p !=
'E')
566 return createError(
"Invalid character in significand");
569 if (dot != end && p - begin == 1)
575 return ExpOrErr.takeError();
576 D->exponent = *ExpOrErr;
584 if (p !=
D->firstSigDigit) {
590 while (p != begin && *p ==
'0');
591 while (p != begin && *p ==
'.');
596 D->normalizedExponent = (
D->exponent +
598 - (dot >
D->firstSigDigit && dot < p)));
610 unsigned int digitValue) {
611 unsigned int hexDigit;
617 else if (digitValue < 8 && digitValue > 0)
621 while (p != end && (*p ==
'0' || *p ==
'.'))
625 return createError(
"Invalid trailing hexadecimal fraction!");
631 if (hexDigit == UINT_MAX)
641 unsigned int partCount,
670 return lost_fraction;
685 return moreSignificant;
696HUerrBound(
bool inexactMultiply,
unsigned int HUerr1,
unsigned int HUerr2)
698 assert(HUerr1 < 2 || HUerr2 < 2 || (HUerr1 + HUerr2 < 8));
700 if (HUerr1 + HUerr2 == 0)
701 return inexactMultiply * 2;
703 return inexactMultiply + 2 * (HUerr1 + HUerr2);
712 unsigned int count, partBits;
729 if (part - boundary <= boundary - part)
730 return part - boundary;
732 return boundary - part;
735 if (part == boundary) {
741 }
else if (part == boundary - 1) {
758 pow5s[0] = 78125 * 5;
760 unsigned int partsCount = 1;
768 *p1 = firstEightPowers[power & 7];
774 for (
unsigned int n = 0; power; power >>= 1, n++) {
778 partsCount, partsCount);
780 if (pow5[partsCount - 1] == 0)
788 result += partsCount;
789 if (p2[result - 1] == 0)
814static const char NaNL[] =
"nan";
815static const char NaNU[] =
"NAN";
822 const char *hexDigitChars)
824 unsigned int result =
count;
830 dst[
count] = hexDigitChars[part & 0xf];
874 switch (
X.getCategory()) {
884 if (
X.isDenormal() ||
X.isSmallestNormalized())
887 if (
X.getExactLog2() != INT_MIN)
895void IEEEFloat::initialize(
const fltSemantics *ourSemantics) {
898 semantics = ourSemantics;
904void IEEEFloat::freeSignificand() {
906 delete [] significand.parts;
909void IEEEFloat::assign(
const IEEEFloat &rhs) {
910 assert(semantics == rhs.semantics);
913 category = rhs.category;
914 exponent = rhs.exponent;
916 copySignificand(rhs);
919void IEEEFloat::copySignificand(
const IEEEFloat &rhs) {
921 assert(rhs.partCount() >= partCount());
934 if (Negative && !semantics->hasSignedRepr)
936 "This floating point format does not support signed values");
940 exponent = exponentNaN();
943 unsigned numParts = partCount();
956 fill = &fill_storage;
960 if (!
fill ||
fill->getNumWords() < numParts)
964 std::min(
fill->getNumWords(), numParts));
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;
976 (semantics->precision >= 2) ? (semantics->precision - 2) : 0;
998 if (semantics == &APFloatBase::semX87DoubleExtended)
1004 if (semantics != rhs.semantics) {
1006 initialize(rhs.semantics);
1017 semantics = rhs.semantics;
1018 significand = rhs.significand;
1019 exponent = rhs.exponent;
1020 category = rhs.category;
1023 rhs.semantics = &APFloatBase::semBogus;
1030 semantics->precision - 1) == 0);
1038 significandMSB() == 0;
1043 isSignificandAllZerosExceptMSB();
1046unsigned int IEEEFloat::getNumHighBits()
const {
1053 const unsigned int NumHighBits = (semantics->
precision > 1)
1059bool IEEEFloat::isSignificandAllOnes()
const {
1064 for (
unsigned i = 0; i < PartCount - 1; i++)
1069 const unsigned NumHighBits = getNumHighBits();
1070 assert(NumHighBits <= integerPartWidth && NumHighBits > 0 &&
1071 "Can not have more high bits to fill than integerPartWidth");
1074 if ((semantics->
precision <= 1) || (~(Parts[PartCount - 1] | HighBitFill)))
1080bool IEEEFloat::isSignificandAllOnesExceptLSB()
const {
1089 for (
unsigned i = 0; i < PartCount - 1; i++) {
1090 if (~Parts[i] & ~
unsigned{!i})
1095 const unsigned NumHighBits = getNumHighBits();
1096 assert(NumHighBits <= integerPartWidth && NumHighBits > 0 &&
1097 "Can not have more high bits to fill than integerPartWidth");
1100 if (~(Parts[PartCount - 1] | HighBitFill | 0x1))
1106bool IEEEFloat::isSignificandAllZeros()
const {
1112 for (
unsigned i = 0; i < PartCount - 1; i++)
1117 const unsigned NumHighBits = getNumHighBits();
1119 "clear than integerPartWidth");
1120 const integerPart HighBitMask = ~integerPart(0) >> NumHighBits;
1122 if ((semantics->precision > 1) && (Parts[PartCount - 1] & HighBitMask))
1128bool IEEEFloat::isSignificandAllZerosExceptMSB()
const {
1132 for (
unsigned i = 0; i < PartCount - 1; i++) {
1137 const unsigned NumHighBits = getNumHighBits();
1140 return ((semantics->precision <= 1) || (Parts[PartCount - 1] == MSBMask));
1144 bool IsMaxExp =
isFiniteNonZero() && exponent == semantics->maxExponent;
1151 ? isSignificandAllOnesExceptLSB()
1156 return IsMaxExp && isSignificandAllOnes();
1171 if (semantics != rhs.semantics ||
1172 category != rhs.category ||
1181 return std::equal(significandParts(), significandParts() + partCount(),
1182 rhs.significandParts());
1186 initialize(&ourSemantics);
1191 significandParts()[0] =
value;
1196 initialize(&ourSemantics);
1212 initialize(rhs.semantics);
1217 *
this = std::move(rhs);
1222unsigned int IEEEFloat::partCount()
const {
1227 return const_cast<IEEEFloat *
>(
this)->significandParts();
1231 if (partCount() > 1)
1232 return significand.parts;
1234 return &significand.part;
1237void IEEEFloat::zeroSignificand() {
1242void IEEEFloat::incrementSignificand() {
1256 parts = significandParts();
1258 assert(semantics == rhs.semantics);
1259 assert(exponent == rhs.exponent);
1261 return APInt::tcAdd(parts, rhs.significandParts(), 0, partCount());
1270 parts = significandParts();
1272 assert(semantics == rhs.semantics);
1273 assert(exponent == rhs.exponent);
1284 bool ignoreAddend) {
1286 unsigned int partsCount, newPartsCount, precision;
1293 assert(semantics == rhs.semantics);
1295 precision = semantics->precision;
1301 if (newPartsCount > 4)
1304 fullSignificand = scratch;
1306 lhsSignificand = significandParts();
1307 partsCount = partCount();
1310 rhs.significandParts(), partsCount, partsCount);
1313 omsb =
APInt::tcMSB(fullSignificand, newPartsCount) + 1;
1314 exponent += rhs.exponent;
1328 if (!ignoreAddend && addend.isNonZero()) {
1332 Significand savedSignificand = significand;
1333 const fltSemantics *savedSemantics = semantics;
1334 fltSemantics extendedSemantics;
1336 unsigned int extendedPrecision;
1339 extendedPrecision = 2 * precision + 1;
1340 if (omsb != extendedPrecision - 1) {
1341 assert(extendedPrecision > omsb);
1343 (extendedPrecision - 1) - omsb);
1344 exponent -= (extendedPrecision - 1) - omsb;
1348 extendedSemantics = *semantics;
1349 extendedSemantics.
precision = extendedPrecision;
1351 if (newPartsCount == 1)
1352 significand.part = fullSignificand[0];
1354 significand.parts = fullSignificand;
1355 semantics = &extendedSemantics;
1369 lost_fraction = extendedAddend.shiftSignificandRight(1);
1371 "Lost precision while shifting addend for fused-multiply-add.");
1373 lost_fraction = addOrSubtractSignificand(extendedAddend,
false);
1376 if (newPartsCount == 1)
1377 fullSignificand[0] = significand.part;
1378 significand = savedSignificand;
1379 semantics = savedSemantics;
1381 omsb =
APInt::tcMSB(fullSignificand, newPartsCount) + 1;
1388 exponent -= precision + 1;
1397 if (omsb > precision) {
1398 unsigned int bits, significantParts;
1401 bits = omsb - precision;
1403 lf =
shiftRight(fullSignificand, significantParts, bits);
1410 if (newPartsCount > 4)
1411 delete [] fullSignificand;
1413 return lost_fraction;
1422 return multiplySignificand(rhs,
IEEEFloat(*semantics), !semantics->hasZero);
1427 unsigned int bit, i, partsCount;
1433 assert(semantics == rhs.semantics);
1435 lhsSignificand = significandParts();
1436 rhsSignificand = rhs.significandParts();
1437 partsCount = partCount();
1444 divisor = dividend + partsCount;
1447 for (i = 0; i < partsCount; i++) {
1448 dividend[i] = lhsSignificand[i];
1449 divisor[i] = rhsSignificand[i];
1450 lhsSignificand[i] = 0;
1453 exponent -= rhs.exponent;
1455 unsigned int precision = semantics->precision;
1458 bit = precision -
APInt::tcMSB(divisor, partsCount) - 1;
1465 bit = precision -
APInt::tcMSB(dividend, partsCount) - 1;
1481 for (bit = precision; bit; bit -= 1) {
1505 return lost_fraction;
1508unsigned int IEEEFloat::significandMSB()
const {
1512unsigned int IEEEFloat::significandLSB()
const {
1517lostFraction IEEEFloat::shiftSignificandRight(
unsigned int bits) {
1523 return shiftRight(significandParts(), partCount(), bits);
1527void IEEEFloat::shiftSignificandLeft(
unsigned int bits) {
1528 assert(bits < semantics->precision ||
1529 (semantics->precision == 1 && bits <= 1));
1532 unsigned int partsCount = partCount();
1544 assert(semantics == rhs.semantics);
1548 compare = exponent - rhs.exponent;
1600 exponent = semantics->maxExponent;
1602 semantics->precision);
1615bool IEEEFloat::roundAwayFromZero(
roundingMode rounding_mode,
1617 unsigned int bit)
const {
1624 switch (rounding_mode) {
1662 omsb = significandMSB() + 1;
1669 exponentChange = omsb - semantics->precision;
1673 if (exponent + exponentChange > semantics->maxExponent)
1674 return handleOverflow(rounding_mode);
1678 if (exponent + exponentChange < semantics->minExponent)
1679 exponentChange = semantics->minExponent - exponent;
1682 if (exponentChange < 0) {
1685 shiftSignificandLeft(-exponentChange);
1690 if (exponentChange > 0) {
1694 lf = shiftSignificandRight(exponentChange);
1699 if (omsb > (
unsigned) exponentChange)
1700 omsb -= exponentChange;
1710 exponent == semantics->maxExponent && isSignificandAllOnes())
1711 return handleOverflow(rounding_mode);
1724 if (!semantics->hasZero)
1732 if (roundAwayFromZero(rounding_mode, lost_fraction, 0)) {
1734 exponent = semantics->minExponent;
1736 incrementSignificand();
1737 omsb = significandMSB() + 1;
1740 if (omsb == (
unsigned) semantics->precision + 1) {
1744 if (exponent == semantics->maxExponent)
1751 shiftSignificandRight(1);
1760 exponent == semantics->maxExponent && isSignificandAllOnes())
1761 return handleOverflow(rounding_mode);
1766 if (omsb == semantics->precision)
1770 assert(omsb < semantics->precision);
1780 if (!semantics->hasZero)
1853 subtract ^=
static_cast<bool>(sign ^ rhs.sign);
1856 bits = exponent - rhs.exponent;
1860 if ((bits < 0) && !semantics->hasSignedRepr)
1862 "This floating point format does not support signed values");
1865 bool lost_fraction_is_from_rhs =
false;
1869 else if (bits > 0) {
1870 lost_fraction = temp_rhs.shiftSignificandRight(bits - 1);
1871 lost_fraction_is_from_rhs =
true;
1872 shiftSignificandLeft(1);
1874 lost_fraction = shiftSignificandRight(-bits - 1);
1875 temp_rhs.shiftSignificandLeft(1);
1882 lost_fraction !=
lfExactlyZero && !lost_fraction_is_from_rhs;
1891 carry = temp_rhs.subtractSignificand(*
this, borrow);
1892 copySignificand(temp_rhs);
1895 bool borrow = lost_fraction !=
lfExactlyZero && lost_fraction_is_from_rhs;
1904 carry = subtractSignificand(temp_rhs, borrow);
1907 if (lost_fraction !=
lfExactlyZero && lost_fraction_is_from_rhs) {
1921 lost_fraction = temp_rhs.shiftSignificandRight(bits);
1922 carry = addSignificand(temp_rhs);
1924 lost_fraction = shiftSignificandRight(-bits);
1925 carry = addSignificand(rhs);
1933 return lost_fraction;
2128 lost_fraction = addOrSubtractSignificand(rhs,
subtract);
2129 fs = normalize(rounding_mode, lost_fraction);
2138 if (category ==
fcZero) {
2152 return addOrSubtract(rhs, rounding_mode,
false);
2158 return addOrSubtract(rhs, rounding_mode,
true);
2167 fs = multiplySpecials(rhs);
2173 fs = normalize(rounding_mode, lost_fraction);
2187 fs = divideSpecials(rhs);
2193 fs = normalize(rounding_mode, lost_fraction);
2204 unsigned int origSign = sign;
2207 fs = remainderSpecials(rhs);
2314 fs = modSpecials(rhs);
2315 unsigned int origSign = sign;
2336 if (!semantics->hasZero && this->isSmallest())
2356 sign ^= multiplicand.sign;
2365 lost_fraction = multiplySignificand(multiplicand, addend);
2366 fs = normalize(rounding_mode, lost_fraction);
2379 fs = multiplySpecials(multiplicand);
2389 fs = addOrSubtract(addend, rounding_mode,
false);
2463 MagicConstant.sign = sign;
2469 fs =
add(MagicConstant, rounding_mode);
2473 subtract(MagicConstant, rounding_mode);
2486 assert(semantics == rhs.semantics);
2518 if (sign == rhs.sign)
2533 if (sign != rhs.sign) {
2564 unsigned int newPartCount, oldPartCount;
2572 oldPartCount = partCount();
2575 bool X86SpecialNan =
false;
2576 if (&fromSemantics == &APFloatBase::semX87DoubleExtended &&
2577 &toSemantics != &APFloatBase::semX87DoubleExtended && category ==
fcNaN &&
2578 (!(*significandParts() & 0x8000000000000000ULL) ||
2579 !(*significandParts() & 0x4000000000000000ULL))) {
2582 X86SpecialNan =
true;
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;
2603 shift -= exponentChange;
2604 exponent += exponentChange;
2610 (category ==
fcNaN && semantics->nonFiniteBehavior !=
2615 if (newPartCount > oldPartCount) {
2623 significand.parts = newParts;
2624 }
else if (newPartCount == 1 && oldPartCount != 1) {
2628 newPart = significandParts()[0];
2630 significand.part = newPart;
2634 semantics = &toSemantics;
2643 *losesInfo = (
fs !=
opOK);
2644 }
else if (category ==
fcNaN) {
2662 if (!X86SpecialNan && semantics == &APFloatBase::semX87DoubleExtended)
2679 }
else if (category ==
fcZero &&
2692 if (category ==
fcZero && !semantics->hasZero)
2712 unsigned int dstPartsCount, truncatedBits;
2721 assert(dstPartsCount <= parts.
size() &&
"Integer too big");
2723 if (category ==
fcZero) {
2730 src = significandParts();
2739 truncatedBits = semantics->
precision -1U - exponent;
2743 unsigned int bits = exponent + 1U;
2749 if (bits < semantics->precision) {
2751 truncatedBits = semantics->
precision - bits;
2758 bits - semantics->precision);
2765 if (truncatedBits) {
2769 roundAwayFromZero(rounding_mode, lost_fraction, truncatedBits)) {
2789 if (omsb == width &&
2826 fs = convertToSignExtendedInteger(parts, width,
isSigned, rounding_mode,
2830 unsigned int bits, dstPartsCount;
2833 assert(dstPartsCount <= parts.
size() &&
"Integer too big");
2835 if (category ==
fcNaN)
2855 unsigned int omsb, precision, dstCount;
2861 dst = significandParts();
2862 dstCount = partCount();
2867 if (precision <= omsb) {
2868 exponent = omsb - 1;
2873 exponent = precision - 1;
2878 return normalize(rounding_mode, lost_fraction);
2892 return convertFromUnsignedParts(api.
getRawData(), partCount, rounding_mode);
2896IEEEFloat::convertFromHexadecimalString(
StringRef s,
2905 unsigned partsCount = partCount();
2907 bool computedTrailingFraction =
false;
2915 return PtrOrErr.takeError();
2924 return createError(
"String contains multiple dots");
2930 if (hex_value == UINT_MAX)
2940 }
else if (!computedTrailingFraction) {
2943 return FractOrErr.takeError();
2944 lost_fraction = *FractOrErr;
2945 computedTrailingFraction =
true;
2951 return createError(
"Hex strings require an exponent");
2952 if (*p !=
'p' && *p !=
'P')
2953 return createError(
"Invalid character in significand");
2956 if (dot != end && p - begin == 1)
2960 if (p != firstSignificantDigit) {
2969 expAdjustment =
static_cast<int>(
dot - firstSignificantDigit);
2970 if (expAdjustment < 0)
2972 expAdjustment = expAdjustment * 4 - 1;
2976 expAdjustment += semantics->precision;
2982 return ExpOrErr.takeError();
2983 exponent = *ExpOrErr;
2986 return normalize(rounding_mode, lost_fraction);
2990IEEEFloat::roundSignificandWithExponent(
const integerPart *decSigParts,
2991 unsigned sigPartCount,
int exp,
2993 unsigned int parts, pow5PartCount;
2994 fltSemantics calcSemantics = { 32767, -32767, 0, 0 };
3004 pow5PartCount =
powerOf5(pow5Parts, exp >= 0 ? exp: -exp);
3006 for (;; parts *= 2) {
3008 unsigned int excessPrecision, truncatedBits;
3011 excessPrecision = calcSemantics.
precision - semantics->precision;
3012 truncatedBits = excessPrecision;
3015 decSig.makeZero(sign);
3018 sigStatus = decSig.convertFromUnsignedParts(decSigParts, sigPartCount,
3020 powStatus = pow5.convertFromUnsignedParts(pow5Parts, pow5PartCount,
3023 decSig.exponent += exp;
3027 unsigned int powHUerr;
3031 calcLostFraction = decSig.multiplySignificand(pow5);
3032 powHUerr = powStatus !=
opOK;
3034 calcLostFraction = decSig.divideSignificand(pow5);
3036 if (decSig.exponent < semantics->minExponent) {
3037 excessPrecision += (semantics->minExponent - decSig.exponent);
3038 truncatedBits = excessPrecision;
3039 excessPrecision = std::min(excessPrecision, calcSemantics.
precision);
3048 (decSig.significandParts(), calcSemantics.
precision - 1) == 1);
3053 excessPrecision, isNearest);
3056 if (HUdistance >= HUerr) {
3057 APInt::tcExtract(significandParts(), partCount(), decSig.significandParts(),
3058 calcSemantics.
precision - excessPrecision,
3063 exponent = (decSig.exponent + semantics->precision
3064 - (calcSemantics.
precision - excessPrecision));
3068 return normalize(rounding_mode, calcLostFraction);
3073Expected<APFloat::opStatus>
3074IEEEFloat::convertFromDecimalString(StringRef str,
roundingMode rounding_mode) {
3081 return std::move(Err);
3112 if (!semantics->hasZero)
3117 }
else if (
D.normalizedExponent - 1 > INT_MAX / 42039) {
3118 fs = handleOverflow(rounding_mode);
3124 }
else if (
D.normalizedExponent - 1 < INT_MIN / 42039 ||
3125 (
D.normalizedExponent + 1) * 28738 <=
3126 8651 * (semantics->minExponent - (
int) semantics->precision)) {
3133 }
else if ((
D.normalizedExponent - 1) * 42039
3134 >= 12655 * semantics->maxExponent) {
3136 fs = handleOverflow(rounding_mode);
3139 unsigned int partCount;
3145 partCount =
static_cast<unsigned int>(
D.lastSigDigit -
D.firstSigDigit) + 1;
3163 if (p == str.
end()) {
3168 if (decValue >= 10U) {
3169 delete[] decSignificand;
3170 return createError(
"Invalid character in significand");
3173 val = val * 10 + decValue;
3176 }
while (p <=
D.lastSigDigit && multiplier <= (~ (
integerPart) 0 - 9) / 10);
3180 partCount, partCount + 1,
false);
3184 if (decSignificand[partCount])
3186 }
while (p <=
D.lastSigDigit);
3189 fs = roundSignificandWithExponent(decSignificand, partCount,
3190 D.exponent, rounding_mode);
3192 delete [] decSignificand;
3198bool IEEEFloat::convertFromStringSpecials(StringRef str) {
3199 const size_t MIN_NAME_SIZE = 3;
3201 if (str.
size() < MIN_NAME_SIZE)
3204 if (str ==
"inf" || str ==
"INFINITY" || str ==
"+Inf") {
3211 if (str.
size() < MIN_NAME_SIZE)
3214 if (str ==
"inf" || str ==
"INFINITY" || str ==
"Inf") {
3223 if (str.
size() < MIN_NAME_SIZE)
3230 makeNaN(IsSignaling, IsNegative);
3235 if (str.
front() ==
'(') {
3237 if (str.
size() <= 2 || str.
back() !=
')')
3244 unsigned Radix = 10;
3245 if (str[0] ==
'0') {
3246 if (str.
size() > 1 && tolower(str[1]) ==
'x') {
3257 makeNaN(IsSignaling, IsNegative, &Payload);
3265Expected<APFloat::opStatus>
3271 if (convertFromStringSpecials(str))
3276 size_t slen = str.
size();
3277 sign = *p ==
'-' ? 1 : 0;
3278 if (sign && !semantics->hasSignedRepr)
3280 "This floating point format does not support signed values");
3282 if (*p ==
'-' || *p ==
'+') {
3289 if (slen >= 2 && p[0] ==
'0' && (p[1] ==
'x' || p[1] ==
'X')) {
3292 return convertFromHexadecimalString(
StringRef(p + 2, slen - 2),
3296 return convertFromDecimalString(
StringRef(p, slen), rounding_mode);
3340 dst +=
sizeof NaNU - 1;
3345 *dst++ = upperCase ?
'X':
'x';
3347 if (hexDigits > 1) {
3349 memset (dst,
'0', hexDigits - 1);
3350 dst += hexDigits - 1;
3352 *dst++ = upperCase ?
'P':
'p';
3357 dst = convertNormalToHexString (dst, hexDigits, upperCase, rounding_mode);
3363 return static_cast<unsigned int>(dst - p);
3370char *IEEEFloat::convertNormalToHexString(
char *dst,
unsigned int hexDigits,
3373 unsigned int count, valueBits, shift, partsCount, outputDigits;
3374 const char *hexDigitChars;
3380 *dst++ = upperCase ?
'X':
'x';
3385 significand = significandParts();
3386 partsCount = partCount();
3395 outputDigits = (valueBits - significandLSB () + 3) / 4;
3401 if (hexDigits < outputDigits) {
3407 bits = valueBits - hexDigits * 4;
3409 roundUp = roundAwayFromZero(rounding_mode, fraction, bits);
3411 outputDigits = hexDigits;
3421 while (outputDigits &&
count) {
3425 if (--
count == partsCount)
3428 part = significand[
count] << shift;
3436 curDigits = std::min(curDigits, outputDigits);
3437 dst +=
partAsHex (dst, part, curDigits, hexDigitChars);
3438 outputDigits -= curDigits;
3448 }
while (*q ==
'0');
3452 memset (dst,
'0', outputDigits);
3453 dst += outputDigits;
3466 *dst++ = upperCase ?
'P':
'p';
3482 Arg.significandParts(),
3483 Arg.significandParts() + Arg.partCount()));
3495APInt IEEEFloat::convertF80LongDoubleAPFloatToAPInt()
const {
3500 uint64_t myexponent, mysignificand;
3503 myexponent = exponent+16383;
3504 mysignificand = significandParts()[0];
3505 if (myexponent==1 && !(mysignificand & 0x8000000000000000ULL))
3507 }
else if (category==
fcZero) {
3511 myexponent = 0x7fff;
3512 mysignificand = 0x8000000000000000ULL;
3515 myexponent = 0x7fff;
3516 mysignificand = significandParts()[0];
3520 words[0] = mysignificand;
3521 words[1] = ((uint64_t)(sign & 1) << 15) |
3522 (myexponent & 0x7fffLL);
3523 return APInt(80, words);
3526APInt IEEEFloat::convertPPCDoubleDoubleLegacyAPFloatToAPInt()
const {
3528 (
const llvm::fltSemantics *)&APFloatBase::semPPCDoubleDoubleLegacy);
3541 fltSemantics extendedSemantics = *semantics;
3552 words[0] = *
u.convertDoubleAPFloatToAPInt().getRawData();
3558 if (
u.isFiniteNonZero() && losesInfo) {
3568 words[1] = *
v.convertDoubleAPFloatToAPInt().getRawData();
3573 return APInt(128, words);
3576template <const fltSemantics &S>
3577APInt IEEEFloat::convertIEEEFloatToAPInt()
const {
3579 const int bias = (semantics == &APFloatBase::semFloat8E8M0FNU)
3581 : -(S.minExponent - 1);
3582 constexpr unsigned int trailing_significand_bits = S.precision - 1;
3583 constexpr int integer_bit_part = 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)
3590 static_assert(exponent_bits < 64);
3591 constexpr uint64_t exponent_mask = (uint64_t{1} << exponent_bits) - 1;
3593 uint64_t myexponent;
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))
3604 }
else if (category ==
fcZero) {
3607 myexponent = ::exponentZero(S) + bias;
3608 mysignificand.fill(0);
3613 myexponent = ::exponentInf(S) + bias;
3614 mysignificand.fill(0);
3619 myexponent = ::exponentNaN(S) + bias;
3620 std::copy_n(significandParts(), mysignificand.size(),
3621 mysignificand.begin());
3623 std::array<uint64_t, (S.sizeInBits + 63) / 64> words;
3625 std::copy_n(mysignificand.begin(), mysignificand.size(), words.begin());
3626 if constexpr (significand_mask != 0 || trailing_significand_bits == 0) {
3628 words[mysignificand.size() - 1] &= significand_mask;
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]);
3641 return APInt(S.sizeInBits, words);
3644APInt IEEEFloat::convertQuadrupleAPFloatToAPInt()
const {
3645 assert(partCount() == 2);
3646 return convertIEEEFloatToAPInt<APFloatBase::semIEEEquad>();
3649APInt IEEEFloat::convertDoubleAPFloatToAPInt()
const {
3651 return convertIEEEFloatToAPInt<APFloatBase::semIEEEdouble>();
3654APInt IEEEFloat::convertFloatAPFloatToAPInt()
const {
3656 return convertIEEEFloatToAPInt<APFloatBase::semIEEEsingle>();
3659APInt IEEEFloat::convertBFloatAPFloatToAPInt()
const {
3660 assert(partCount() == 1);
3661 return convertIEEEFloatToAPInt<APFloatBase::semBFloat>();
3664APInt IEEEFloat::convertHalfAPFloatToAPInt()
const {
3666 return convertIEEEFloatToAPInt<APFloatBase::APFloatBase::semIEEEhalf>();
3669APInt IEEEFloat::convertFloat8E5M2APFloatToAPInt()
const {
3670 assert(partCount() == 1);
3671 return convertIEEEFloatToAPInt<APFloatBase::semFloat8E5M2>();
3674APInt IEEEFloat::convertFloat8E5M2FNUZAPFloatToAPInt()
const {
3675 assert(partCount() == 1);
3676 return convertIEEEFloatToAPInt<APFloatBase::semFloat8E5M2FNUZ>();
3679APInt IEEEFloat::convertFloat8E4M3APFloatToAPInt()
const {
3680 assert(partCount() == 1);
3681 return convertIEEEFloatToAPInt<APFloatBase::semFloat8E4M3>();
3684APInt IEEEFloat::convertFloat8E4M3FNAPFloatToAPInt()
const {
3685 assert(partCount() == 1);
3686 return convertIEEEFloatToAPInt<APFloatBase::semFloat8E4M3FN>();
3689APInt IEEEFloat::convertFloat8E4M3FNUZAPFloatToAPInt()
const {
3690 assert(partCount() == 1);
3691 return convertIEEEFloatToAPInt<APFloatBase::semFloat8E4M3FNUZ>();
3694APInt IEEEFloat::convertFloat8E4M3B11FNUZAPFloatToAPInt()
const {
3695 assert(partCount() == 1);
3696 return convertIEEEFloatToAPInt<APFloatBase::semFloat8E4M3B11FNUZ>();
3699APInt IEEEFloat::convertFloat8E3M4APFloatToAPInt()
const {
3700 assert(partCount() == 1);
3701 return convertIEEEFloatToAPInt<APFloatBase::semFloat8E3M4>();
3704APInt IEEEFloat::convertFloatTF32APFloatToAPInt()
const {
3705 assert(partCount() == 1);
3706 return convertIEEEFloatToAPInt<APFloatBase::semFloatTF32>();
3709APInt IEEEFloat::convertFloat8E8M0FNUAPFloatToAPInt()
const {
3710 assert(partCount() == 1);
3711 return convertIEEEFloatToAPInt<APFloatBase::semFloat8E8M0FNU>();
3714APInt IEEEFloat::convertFloat6E3M2FNAPFloatToAPInt()
const {
3715 assert(partCount() == 1);
3716 return convertIEEEFloatToAPInt<APFloatBase::semFloat6E3M2FN>();
3719APInt IEEEFloat::convertFloat6E2M3FNAPFloatToAPInt()
const {
3720 assert(partCount() == 1);
3721 return convertIEEEFloatToAPInt<APFloatBase::semFloat6E2M3FN>();
3724APInt IEEEFloat::convertFloat4E2M1FNAPFloatToAPInt()
const {
3725 assert(partCount() == 1);
3726 return convertIEEEFloatToAPInt<APFloatBase::semFloat4E2M1FN>();
3735 return convertHalfAPFloatToAPInt();
3738 return convertBFloatAPFloatToAPInt();
3741 return convertFloatAPFloatToAPInt();
3744 return convertDoubleAPFloatToAPInt();
3747 return convertQuadrupleAPFloatToAPInt();
3751 return convertPPCDoubleDoubleLegacyAPFloatToAPInt();
3754 return convertFloat8E5M2APFloatToAPInt();
3757 return convertFloat8E5M2FNUZAPFloatToAPInt();
3760 return convertFloat8E4M3APFloatToAPInt();
3763 return convertFloat8E4M3FNAPFloatToAPInt();
3766 return convertFloat8E4M3FNUZAPFloatToAPInt();
3770 return convertFloat8E4M3B11FNUZAPFloatToAPInt();
3773 return convertFloat8E3M4APFloatToAPInt();
3776 return convertFloatTF32APFloatToAPInt();
3779 return convertFloat8E8M0FNUAPFloatToAPInt();
3782 return convertFloat6E3M2FNAPFloatToAPInt();
3785 return convertFloat6E2M3FNAPFloatToAPInt();
3788 return convertFloat4E2M1FNAPFloatToAPInt();
3793 return convertF80LongDoubleAPFloatToAPInt();
3798 "Float semantics are not IEEEsingle");
3805 "Float semantics are not IEEEdouble");
3810#ifdef HAS_IEE754_FLOAT128
3811float128 IEEEFloat::convertToQuad()
const {
3813 "Float semantics are not IEEEquads");
3815 return api.bitsToQuad();
3826void IEEEFloat::initFromF80LongDoubleAPInt(
const APInt &api) {
3829 uint64_t myexponent = (i2 & 0x7fff);
3831 uint8_t myintegerbit = mysignificand >> 63;
3833 initialize(&APFloatBase::semX87DoubleExtended);
3836 sign =
static_cast<unsigned int>(i2>>15);
3837 if (myexponent == 0 && mysignificand == 0) {
3839 }
else if (myexponent==0x7fff && mysignificand==0x8000000000000000ULL) {
3841 }
else if ((myexponent == 0x7fff && mysignificand != 0x8000000000000000ULL) ||
3842 (myexponent != 0x7fff && myexponent != 0 && myintegerbit == 0)) {
3844 exponent = exponentNaN();
3845 significandParts()[0] = mysignificand;
3846 significandParts()[1] = 0;
3849 exponent = myexponent - 16383;
3850 significandParts()[0] = mysignificand;
3851 significandParts()[1] = 0;
3857void IEEEFloat::initFromPPCDoubleDoubleLegacyAPInt(
const APInt &api) {
3864 initFromDoubleAPInt(APInt(64, i1));
3872 IEEEFloat v(APFloatBase::semIEEEdouble, APInt(64, i2));
3887void IEEEFloat::initFromFloat8E8M0FNUAPInt(
const APInt &api) {
3888 const uint64_t exponent_mask = 0xff;
3890 uint64_t myexponent = (val & exponent_mask);
3892 initialize(&APFloatBase::semFloat8E8M0FNU);
3893 assert(partCount() == 1);
3901 uint64_t mysignificand = 1;
3902 significandParts()[0] = mysignificand;
3906 if (val == exponent_mask) {
3908 exponent = exponentNaN();
3913 exponent = myexponent - 127;
3915template <const fltSemantics &S>
3916void IEEEFloat::initFromIEEEAPInt(
const APInt &api) {
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 =
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);
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;
3941 uint64_t myexponent =
3942 (last_word >> (trailing_significand_bits % 64)) & exponent_mask;
3945 assert(partCount() == mysignificand.size());
3947 sign =
static_cast<unsigned int>(last_word >> ((S.sizeInBits - 1) % 64));
3949 bool all_zero_significand =
3952 bool is_zero = myexponent == 0 && all_zero_significand;
3955 if (myexponent - bias == ::exponentInf(S) && all_zero_significand) {
3961 bool is_nan =
false;
3964 is_nan = myexponent - bias == ::exponentNaN(S) && !all_zero_significand;
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;
3973 is_nan = is_zero && sign;
3979 std::copy_n(mysignificand.begin(), mysignificand.size(),
3980 significandParts());
3990 exponent = myexponent - bias;
3991 std::copy_n(mysignificand.begin(), mysignificand.size(), significandParts());
3992 if (myexponent == 0)
3993 exponent = S.minExponent;
3995 significandParts()[mysignificand.size()-1] |= integer_bit;
3998void IEEEFloat::initFromQuadrupleAPInt(
const APInt &api) {
3999 initFromIEEEAPInt<APFloatBase::semIEEEquad>(api);
4002void IEEEFloat::initFromDoubleAPInt(
const APInt &api) {
4003 initFromIEEEAPInt<APFloatBase::semIEEEdouble>(api);
4006void IEEEFloat::initFromFloatAPInt(
const APInt &api) {
4007 initFromIEEEAPInt<APFloatBase::semIEEEsingle>(api);
4010void IEEEFloat::initFromBFloatAPInt(
const APInt &api) {
4011 initFromIEEEAPInt<APFloatBase::semBFloat>(api);
4014void IEEEFloat::initFromHalfAPInt(
const APInt &api) {
4015 initFromIEEEAPInt<APFloatBase::semIEEEhalf>(api);
4018void IEEEFloat::initFromFloat8E5M2APInt(
const APInt &api) {
4019 initFromIEEEAPInt<APFloatBase::semFloat8E5M2>(api);
4022void IEEEFloat::initFromFloat8E5M2FNUZAPInt(
const APInt &api) {
4023 initFromIEEEAPInt<APFloatBase::semFloat8E5M2FNUZ>(api);
4026void IEEEFloat::initFromFloat8E4M3APInt(
const APInt &api) {
4027 initFromIEEEAPInt<APFloatBase::semFloat8E4M3>(api);
4030void IEEEFloat::initFromFloat8E4M3FNAPInt(
const APInt &api) {
4031 initFromIEEEAPInt<APFloatBase::semFloat8E4M3FN>(api);
4034void IEEEFloat::initFromFloat8E4M3FNUZAPInt(
const APInt &api) {
4035 initFromIEEEAPInt<APFloatBase::semFloat8E4M3FNUZ>(api);
4038void IEEEFloat::initFromFloat8E4M3B11FNUZAPInt(
const APInt &api) {
4039 initFromIEEEAPInt<APFloatBase::semFloat8E4M3B11FNUZ>(api);
4042void IEEEFloat::initFromFloat8E3M4APInt(
const APInt &api) {
4043 initFromIEEEAPInt<APFloatBase::semFloat8E3M4>(api);
4046void IEEEFloat::initFromFloatTF32APInt(
const APInt &api) {
4047 initFromIEEEAPInt<APFloatBase::semFloatTF32>(api);
4050void IEEEFloat::initFromFloat6E3M2FNAPInt(
const APInt &api) {
4051 initFromIEEEAPInt<APFloatBase::semFloat6E3M2FN>(api);
4054void IEEEFloat::initFromFloat6E2M3FNAPInt(
const APInt &api) {
4055 initFromIEEEAPInt<APFloatBase::semFloat6E2M3FN>(api);
4058void IEEEFloat::initFromFloat4E2M1FNAPInt(
const APInt &api) {
4059 initFromIEEEAPInt<APFloatBase::semFloat4E2M1FN>(api);
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);
4110 if (Negative && !semantics->hasSignedRepr)
4112 "This floating point format does not support signed values");
4119 exponent = semantics->maxExponent;
4123 unsigned PartCount = partCount();
4124 memset(significand, 0xFF,
sizeof(
integerPart)*(PartCount - 1));
4128 const unsigned NumUnusedHighBits =
4135 (semantics->precision > 1))
4142 if (Negative && !semantics->hasSignedRepr)
4144 "This floating point format does not support signed values");
4151 exponent = semantics->minExponent;
4156 if (Negative && !semantics->hasSignedRepr)
4158 "This floating point format does not support signed values");
4167 exponent = semantics->minExponent;
4172 initFromAPInt(&Sem, API);
4185 Buffer.
append(Str.begin(), Str.end());
4190 void AdjustToPrecision(
APInt &significand,
4191 int &exp,
unsigned FormatPrecision) {
4195 unsigned bitsRequired = (FormatPrecision * 196 + 58) / 59;
4197 if (bits <= bitsRequired)
return;
4199 unsigned tensRemovable = (bits - bitsRequired) * 59 / 196;
4200 if (!tensRemovable)
return;
4202 exp += tensRemovable;
4207 if (tensRemovable & 1)
4209 tensRemovable >>= 1;
4210 if (!tensRemovable)
break;
4214 significand = significand.
udiv(divisor);
4222 int &exp,
unsigned FormatPrecision) {
4223 unsigned N = buffer.
size();
4224 if (
N <= FormatPrecision)
return;
4227 unsigned FirstSignificant =
N - FormatPrecision;
4234 if (buffer[FirstSignificant - 1] <
'5') {
4235 while (FirstSignificant <
N && buffer[FirstSignificant] ==
'0')
4238 exp += FirstSignificant;
4239 buffer.
erase(&buffer[0], &buffer[FirstSignificant]);
4245 for (
unsigned I = FirstSignificant;
I !=
N; ++
I) {
4246 if (buffer[
I] ==
'9') {
4255 if (FirstSignificant ==
N) {
4256 exp += FirstSignificant;
4262 exp += FirstSignificant;
4263 buffer.
erase(&buffer[0], &buffer[FirstSignificant]);
4267 APInt significand,
unsigned FormatPrecision,
4268 unsigned FormatMaxPadding,
bool TruncateZero) {
4269 const int semanticsPrecision = significand.
getBitWidth();
4276 if (!FormatPrecision) {
4284 FormatPrecision = 2 + semanticsPrecision * 59 / 196;
4289 exp += trailingZeros;
4295 }
else if (exp > 0) {
4297 significand = significand.
zext(semanticsPrecision + exp);
4298 significand <<= exp;
4312 unsigned precision = semanticsPrecision + (137 * texp + 136) / 59;
4316 significand = significand.
zext(precision);
4317 APInt five_to_the_i(precision, 5);
4320 significand *= five_to_the_i;
4325 five_to_the_i *= five_to_the_i;
4329 AdjustToPrecision(significand, exp, FormatPrecision);
4334 unsigned precision = significand.getBitWidth();
4335 if (precision < 4) {
4338 significand = significand.zext(precision);
4340 APInt ten(precision, 10);
4341 APInt digit(precision, 0);
4343 bool inTrail =
true;
4344 while (significand != 0) {
4349 unsigned d = digit.getZExtValue();
4360 assert(!buffer.
empty() &&
"no characters in buffer!");
4364 AdjustToPrecision(buffer, exp, FormatPrecision);
4366 unsigned NDigits = buffer.
size();
4369 bool FormatScientific;
4370 if (!FormatMaxPadding)
4371 FormatScientific =
true;
4377 FormatScientific = ((unsigned) exp > FormatMaxPadding ||
4378 NDigits + (unsigned) exp > FormatPrecision);
4381 int MSD = exp + (int) (NDigits - 1);
4384 FormatScientific =
false;
4388 FormatScientific = ((unsigned) -MSD) > FormatMaxPadding;
4394 if (FormatScientific) {
4395 exp += (NDigits - 1);
4397 Str.push_back(buffer[NDigits-1]);
4399 if (NDigits == 1 && TruncateZero)
4402 for (
unsigned I = 1;
I != NDigits; ++
I)
4403 Str.push_back(buffer[NDigits-1-
I]);
4405 if (!TruncateZero && FormatPrecision > NDigits - 1)
4406 Str.append(FormatPrecision - NDigits + 1,
'0');
4408 Str.push_back(TruncateZero ?
'E' :
'e');
4410 Str.push_back(exp >= 0 ?
'+' :
'-');
4415 expbuf.
push_back((
char) (
'0' + (exp % 10)));
4419 if (!TruncateZero && expbuf.
size() < 2)
4421 for (
unsigned I = 0,
E = expbuf.
size();
I !=
E; ++
I)
4422 Str.push_back(expbuf[
E-1-
I]);
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)
4438 int NWholeDigits = exp + (int) NDigits;
4441 if (NWholeDigits > 0) {
4442 for (;
I != (unsigned) NWholeDigits; ++
I)
4443 Str.push_back(buffer[NDigits-
I-1]);
4446 unsigned NZeros = 1 + (unsigned) -NWholeDigits;
4450 for (
unsigned Z = 1;
Z != NZeros; ++
Z)
4454 for (;
I != NDigits; ++
I)
4455 Str.push_back(buffer[NDigits-
I-1]);
4461 unsigned FormatMaxPadding,
bool TruncateZero)
const {
4465 return append(Str,
"-Inf");
4467 return append(Str,
"+Inf");
4469 case fcNaN:
return append(Str,
"NaN");
4475 if (!FormatMaxPadding) {
4477 append(Str,
"0.0E+0");
4480 if (FormatPrecision > 1)
4481 Str.append(FormatPrecision - 1,
'0');
4482 append(Str,
"e+00");
4494 int exp = exponent - ((int) semantics->precision - 1);
4496 semantics->precision,
4499 toStringImpl(Str,
isNegative(), exp, significand, FormatPrecision,
4500 FormatMaxPadding, TruncateZero);
4512 for (
int i = 0; i < PartCount; ++i) {
4518 if (exponent != semantics->minExponent)
4521 int CountrParts = 0;
4522 for (
int i = 0; i < PartCount;
4524 if (Parts[i] != 0) {
4525 return exponent - semantics->precision + CountrParts +
4588 if (!semantics->hasZero)
4598 }
else if (semantics->nonFiniteBehavior ==
4606 exponent = semantics->maxExponent + 1;
4620 bool WillCrossBinadeBoundary =
4621 exponent != semantics->minExponent && isSignificandAllZeros();
4639 if (WillCrossBinadeBoundary) {
4660 if (WillCrossBinadeBoundary) {
4664 assert(exponent != semantics->maxExponent &&
4665 "We can not increment an exponent beyond the maxExponent allowed"
4666 " by the given floating point semantics.");
4669 incrementSignificand();
4683 return ::exponentNaN(*semantics);
4687 return ::exponentInf(*semantics);
4691 return ::exponentZero(*semantics);
4710 if (!semantics->hasZero)
4737 return Arg.exponent;
4742 Normalized.exponent += SignificandBits;
4744 return Normalized.exponent - SignificandBits;
4748 auto MaxExp =
X.getSemantics().maxExponent;
4749 auto MinExp =
X.getSemantics().minExponent;
4757 int SignificandBits =
X.getSemantics().precision - 1;
4758 int MaxIncrement = MaxExp - (MinExp - SignificandBits) + 1;
4761 X.exponent += std::clamp(Exp, -MaxIncrement - 1, MaxIncrement);
4784 return scalbn(Val, -Exp, RM);
4790 APFloat(APFloatBase::semIEEEdouble)}) {
4791 assert(Semantics == &APFloatBase::semPPCDoubleDouble);
4795 : Semantics(&S), Floats(new
APFloat[2]{
4798 assert(Semantics == &APFloatBase::semPPCDoubleDouble);
4804 APFloat(APFloatBase::semIEEEdouble)}) {
4805 assert(Semantics == &APFloatBase::semPPCDoubleDouble);
4811 APFloat(APFloatBase::semIEEEdouble,
APInt(64,
I.getRawData()[0])),
4812 APFloat(APFloatBase::semIEEEdouble,
APInt(64,
I.getRawData()[1]))}) {
4813 assert(Semantics == &APFloatBase::semPPCDoubleDouble);
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);
4826 : Semantics(RHS.Semantics),
4830 assert(Semantics == &APFloatBase::semPPCDoubleDouble);
4834 : Semantics(RHS.Semantics), Floats(RHS.Floats) {
4835 RHS.Semantics = &APFloatBase::semBogus;
4836 RHS.Floats =
nullptr;
4837 assert(Semantics == &APFloatBase::semPPCDoubleDouble);
4841 if (Semantics == RHS.Semantics && RHS.Floats) {
4842 Floats[0] = RHS.Floats[0];
4843 Floats[1] = RHS.Floats[1];
4844 }
else if (
this != &RHS) {
4877 Floats[0] = std::move(z);
4878 Floats[1].makeZero(
false);
4882 auto AComparedToC = a.compareAbsoluteValue(c);
4891 Status |= z.
add(a, RM);
4892 Status |= z.
add(c, RM);
4895 Floats[0] = std::move(z);
4896 Floats[1].makeZero(
false);
4901 Status |= zz.
add(cc, RM);
4905 Status |= Floats[1].subtract(z, RM);
4906 Status |= Floats[1].add(c, RM);
4907 Status |= Floats[1].add(zz, RM);
4911 Status |= Floats[1].subtract(z, RM);
4912 Status |= Floats[1].add(a, RM);
4913 Status |= Floats[1].add(zz, RM);
4918 Status |=
q.subtract(z, RM);
4923 Status |= zz.
add(c, RM);
4924 Status |=
q.add(z, RM);
4925 Status |=
q.subtract(a, RM);
4927 Status |= zz.
add(q, RM);
4928 Status |= zz.
add(
aa, RM);
4929 Status |= zz.
add(cc, RM);
4931 Floats[0] = std::move(z);
4932 Floats[1].makeZero(
false);
4936 Status |= Floats[0].add(zz, RM);
4938 Floats[1].makeZero(
false);
4941 Floats[1] = std::move(z);
4942 Status |= Floats[1].subtract(Floats[0], RM);
4943 Status |= Floats[1].add(zz, RM);
4969 LHS.isNegative() !=
RHS.isNegative()) {
4970 Out.makeNaN(
false, Out.isNegative(),
nullptr);
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);
4996 return addWithSpecial(*
this, RHS, *
this, RM);
5002 auto Ret =
add(RHS, RM);
5009 const auto &LHS = *
this;
5026 if (LHS.getCategory() ==
fcNaN) {
5030 if (RHS.getCategory() ==
fcNaN) {
5036 Out.makeNaN(
false,
false,
nullptr);
5048 "Special cases not handled exhaustively");
5051 APFloat A = Floats[0],
B = Floats[1],
C = RHS.Floats[0],
D = RHS.Floats[1];
5055 if (!
T.isFiniteNonZero()) {
5057 Floats[1].makeZero(
false);
5079 Status |= U.add(Tau, RM);
5082 if (!U.isFinite()) {
5083 Floats[1].makeZero(
false);
5095 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
5096 "Unexpected Semantics");
5099 APFloat(APFloatBase::semPPCDoubleDoubleLegacy, RHS.bitcastToAPInt()), RM);
5105 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
5106 "Unexpected Semantics");
5109 APFloat(APFloatBase::semPPCDoubleDoubleLegacy, RHS.bitcastToAPInt()));
5115 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
5116 "Unexpected Semantics");
5119 APFloat(APFloatBase::semPPCDoubleDoubleLegacy, RHS.bitcastToAPInt()));
5128 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
5129 "Unexpected Semantics");
5132 APFloat(APFloatBase::semPPCDoubleDoubleLegacy,
5141 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
5142 "Unexpected Semantics");
5152 if (!
Hi.isFiniteNonZero() ||
Lo.isZero()) {
5153 Floats[0] = std::move(RoundedHi);
5154 Floats[1].makeZero(
false);
5166 const APFloat RoundingError = Rounded - ToRound;
5167 if (TieBreaker.isNonZero() &&
5168 TieBreaker.isNegative() != RoundingError.
isNegative() &&
5169 abs(RoundingError).isExactlyValue(0.5))
5178 if (RoundedHi !=
Hi) {
5183 RoundedHi = RoundToNearestHelper(
Hi, RoundedHi,
Lo);
5185 Floats[0] = std::move(RoundedHi);
5186 Floats[1].makeZero(
false);
5199 LoRoundingMode = RM;
5207 RoundedLo = RoundToNearestHelper(
Lo, RoundedLo,
Hi);
5210 std::tie(RoundedHi, RoundedLo) =
fastTwoSum(RoundedHi, RoundedLo);
5212 Floats[0] = std::move(RoundedHi);
5213 Floats[1] = std::move(RoundedLo);
5218 Floats[0].changeSign();
5219 Floats[1].changeSign();
5225 const cmpResult HiPartCmp = Floats[0].compareAbsoluteValue(RHS.Floats[0]);
5230 if (Floats[1].
isZero() && RHS.Floats[1].isZero())
5236 const bool ThisIsSubtractive =
5237 Floats[0].isNegative() != Floats[1].isNegative();
5238 const bool RHSIsSubtractive =
5239 RHS.Floats[0].isNegative() != RHS.Floats[1].isNegative();
5249 if (RHS.Floats[1].isZero())
5256 if (ThisIsSubtractive != RHSIsSubtractive)
5261 const cmpResult LoPartCmp = Floats[1].compareAbsoluteValue(RHS.Floats[1]);
5263 if (ThisIsSubtractive) {
5277 return Floats[0].getCategory();
5283 Floats[0].makeInf(Neg);
5284 Floats[1].makeZero(
false);
5288 Floats[0].makeZero(Neg);
5289 Floats[1].makeZero(
false);
5293 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
5294 "Unexpected Semantics");
5296 APFloat(APFloatBase::semIEEEdouble,
APInt(64, 0x7fefffffffffffffull));
5298 APFloat(APFloatBase::semIEEEdouble,
APInt(64, 0x7c8ffffffffffffeull));
5304 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
5305 "Unexpected Semantics");
5306 Floats[0].makeSmallest(Neg);
5307 Floats[1].makeZero(
false);
5311 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
5312 "Unexpected Semantics");
5314 APFloat(APFloatBase::semIEEEdouble,
APInt(64, 0x0360000000000000ull));
5316 Floats[0].changeSign();
5317 Floats[1].makeZero(
false);
5321 Floats[0].makeNaN(SNaN, Neg,
fill);
5322 Floats[1].makeZero(
false);
5326 auto Result = Floats[0].compare(RHS.Floats[0]);
5329 return Floats[1].compare(RHS.Floats[1]);
5334 return Floats[0].bitwiseIsEqual(RHS.Floats[0]) &&
5335 Floats[1].bitwiseIsEqual(RHS.Floats[1]);
5345 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
5346 "Unexpected Semantics");
5348 Floats[0].bitcastToAPInt().getRawData()[0],
5349 Floats[1].bitcastToAPInt().getRawData()[0],
5356 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
5357 "Unexpected Semantics");
5358 APFloat Tmp(APFloatBase::semPPCDoubleDoubleLegacy);
5371 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
5372 "Unexpected Semantics");
5422 if (InLattice(HiOld, NextLo)) {
5424 Floats[1] = std::move(NextLo);
5461 if (!InLattice(NextHi, NextLo))
5465 Floats[0] = std::move(NextHi);
5466 Floats[1] = std::move(NextLo);
5474 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
5475 "Unexpected Semantics");
5517 const unsigned PositiveOverflowWidth = IsSigned ? Width - 1 : Width;
5518 if (HiExactLog2 >= 0 &&
5519 static_cast<unsigned>(HiExactLog2) == PositiveOverflowWidth) {
5529 Input, Width,
true, RM, &LoIsExact);
5542 *IsExact = RoundStatus ==
opOK;
5554 APSInt LoResult{Width, !IsSigned};
5566 *IsExact = RoundStatus ==
opOK;
5572 unsigned int Width,
bool IsSigned,
5575 convertToSignExtendedInteger(
Input, Width, IsSigned, RM, IsExact);
5579 assert(DstPartsCount <=
Input.size() &&
"Integer too big");
5587 Bits = Width - IsSigned;
5632 if (SrcMSB == UINT_MAX) {
5639 const unsigned SrcBitWidth = SrcMSB + 1;
5655 return handleOverflow(RM);
5661 bool HiAsIntIsExact;
5678 if (
Error.isNegative()) {
5686 const unsigned ErrorActiveBits =
Error.getSignificantBits() - 1;
5688 if (ErrorActiveBits > LoPrecision) {
5689 const unsigned RoundingBoundary = ErrorActiveBits - LoPrecision;
5693 if (
Error.countTrailingZeros() == RoundingBoundary - 1)
5712 Floats[0] = std::move(
Hi);
5713 Floats[1] = std::move(
Lo);
5718 return handleOverflow(RM);
5724 Largest.makeLargest(
false);
5726 return handleOverflow(RM);
5738 const bool NegateInput = IsSigned &&
Input.isNegative();
5751 unsigned int HexDigits,
5754 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
5755 "Unexpected Semantics");
5762 (Floats[0].isDenormal() || Floats[1].
isDenormal() ||
5764 Floats[0] != Floats[0] + Floats[1]);
5793 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
5794 "Unexpected Semantics");
5795 return Floats[0].isInteger() && Floats[1].isInteger();
5799 unsigned FormatPrecision,
5800 unsigned FormatMaxPadding,
5801 bool TruncateZero)
const {
5802 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
5803 "Unexpected Semantics");
5805 .
toString(Str, FormatPrecision, FormatMaxPadding, TruncateZero);
5825 if (
Lo.isZero() ||
Hi.isNegative() ==
Lo.isNegative())
5827 if (
Hi.getExactLog2Abs() == INT_MIN)
5831 return IlogbResult - 1;
5837 "Unexpected Semantics");
5839 scalbn(Arg.Floats[0], Exp, RM),
5840 scalbn(Arg.Floats[1], Exp, RM));
5846 "Unexpected Semantics");
5856 Quiet.getFirst() =
Quiet.getFirst().makeQuiet();
5878 const bool SignsDisagree =
Hi.isNegative() !=
Lo.isNegative();
5895 LoRoundingMode = RM;
5896 Second =
scalbn(
Lo, -Exp, LoRoundingMode);
5904 if (RecomposedLo !=
Lo) {
5908 const APFloat RoundingError = RecomposedLo -
Lo;
5913 const APFloat ScaledUlpOfSecond =
5915 const bool IsMidpoint =
abs(RoundingError) == ScaledUlpOfSecond;
5916 const bool RoundedLoAway =
5921 if (IsMidpoint && RoundedLoAway)
5937 if (Second.
isZero() && SignsDisagree &&
Hi.getExactLog2Abs() != INT_MIN)
5948APFloat::Storage::Storage(IEEEFloat
F,
const fltSemantics &Semantics) {
5953 if (usesLayout<DoubleAPFloat>(
Semantics)) {
5954 const fltSemantics& S =
F.getSemantics();
5968 if (APFloat::usesLayout<detail::IEEEFloat>(Arg.
getSemantics()))
5970 if (APFloat::usesLayout<detail::DoubleAPFloat>(Arg.
getSemantics()))
5978 assert(StatusOrErr &&
"Invalid floating point representation");
6030 APFloat Reciprocal =
6048 *Inv = std::move(Reciprocal);
6060 usesLayout<IEEEFloat>(ToSemantics))
6061 return U.IEEE.convert(ToSemantics, RM, losesInfo);
6063 usesLayout<DoubleAPFloat>(ToSemantics)) {
6064 assert(&ToSemantics == &APFloatBase::semPPCDoubleDouble);
6066 U.IEEE.convert(APFloatBase::semPPCDoubleDoubleLegacy, RM, losesInfo);
6067 *
this =
APFloat(ToSemantics, U.IEEE.bitcastToAPInt());
6071 usesLayout<IEEEFloat>(ToSemantics)) {
6072 auto Ret = getIEEE().convert(ToSemantics, RM, losesInfo);
6073 *
this =
APFloat(std::move(getIEEE()), ToSemantics);
6089#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
6102 bool *isExact)
const {
6106 rounding_mode, isExact);
6108 result =
APInt(bitWidth, parts);
6115 return getIEEE().convertToDouble();
6117 "Float semantics is not representable by IEEEdouble");
6118 APFloat Temp = *
this;
6127#ifdef HAS_IEE754_FLOAT128
6128float128 APFloat::convertToQuad()
const {
6130 return getIEEE().convertToQuad();
6132 "Float semantics is not representable by IEEEquad");
6139 return Temp.getIEEE().convertToQuad();
6146 return getIEEE().convertToFloat();
6148 "Float semantics is not representable by IEEEsingle");
6149 APFloat Temp = *
this;
6158APFloat::Storage::~Storage() {
6159 if (usesLayout<IEEEFloat>(*semantics)) {
6163 if (usesLayout<DoubleAPFloat>(*semantics)) {
6170APFloat::Storage::Storage(
const APFloat::Storage &
RHS) {
6171 if (usesLayout<IEEEFloat>(*
RHS.semantics)) {
6175 if (usesLayout<DoubleAPFloat>(*
RHS.semantics)) {
6182APFloat::Storage::Storage(APFloat::Storage &&
RHS) {
6183 if (usesLayout<IEEEFloat>(*
RHS.semantics)) {
6187 if (usesLayout<DoubleAPFloat>(*
RHS.semantics)) {
6194APFloat::Storage &APFloat::Storage::operator=(
const APFloat::Storage &
RHS) {
6195 if (usesLayout<IEEEFloat>(*semantics) &&
6196 usesLayout<IEEEFloat>(*
RHS.semantics)) {
6198 }
else if (usesLayout<DoubleAPFloat>(*semantics) &&
6199 usesLayout<DoubleAPFloat>(*
RHS.semantics)) {
6201 }
else if (
this != &
RHS) {
6203 new (
this) Storage(
RHS);
6208APFloat::Storage &APFloat::Storage::operator=(APFloat::Storage &&
RHS) {
6209 if (usesLayout<IEEEFloat>(*semantics) &&
6210 usesLayout<IEEEFloat>(*
RHS.semantics)) {
6212 }
else if (usesLayout<DoubleAPFloat>(*semantics) &&
6213 usesLayout<DoubleAPFloat>(*
RHS.semantics)) {
6215 }
else if (
this != &
RHS) {
6217 new (
this) Storage(std::move(
RHS));
6224#undef APFLOAT_DISPATCH_ON_SEMANTICS
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
#define PackCategoriesIntoKey(_lhs, _rhs)
A macro used to combine two fcCategory enums into one key which can be used in a switch statement to ...
This file declares a class to represent arbitrary precision floating point values and provide a varie...
#define APFLOAT_DISPATCH_ON_SEMANTICS(METHOD_CALL)
This file implements the APSInt class, which is a simple class that represents an arbitrary sized int...
Function Alias Analysis false
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
#define LLVM_DUMP_METHOD
Mark debug helper function definitions like dump() that should not be stripped from debug builds.
static bool isNeg(Value *V)
Returns true if the operation is a negation of V, and it works for both integers and floats.
static bool isSigned(unsigned int Opcode)
Utilities for dealing with flags related to floating point properties and mode controls.
This file defines a hash set that can be used to remove duplication of nodes in a graph.
static bool isZero(Value *V, const DataLayout &DL, DominatorTree *DT, AssumptionCache *AC)
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
static TableGen::Emitter::OptClass< SkeletonEmitter > X("gen-skeleton-class", "Generate example skeleton class")
static void initialize(TargetLibraryInfoImpl &TLI, const Triple &T, ArrayRef< StringLiteral > StandardNames)
Initialize the set of available library functions based on the specified target triple.
static const fltSemantics & IEEEsingle()
static const fltSemantics & Float8E4M3FN()
static LLVM_ABI const llvm::fltSemantics & EnumToSemantics(Semantics S)
static LLVM_ABI bool semanticsHasInf(const fltSemantics &)
cmpResult
IEEE-754R 5.11: Floating Point Comparison Relations.
static constexpr roundingMode rmTowardZero
static LLVM_ABI ExponentType semanticsMinExponent(const fltSemantics &)
llvm::RoundingMode roundingMode
IEEE-754R 4.3: Rounding-direction attributes.
static const fltSemantics & BFloat()
static const fltSemantics & IEEEquad()
static LLVM_ABI unsigned int semanticsSizeInBits(const fltSemantics &)
static const fltSemantics & Float8E8M0FNU()
static LLVM_ABI bool semanticsHasSignedRepr(const fltSemantics &)
static const fltSemantics & IEEEdouble()
static LLVM_ABI unsigned getSizeInBits(const fltSemantics &Sem)
Returns the size of the floating point number (in bits) in the given semantics.
static const fltSemantics & x87DoubleExtended()
static constexpr roundingMode rmTowardNegative
static constexpr roundingMode rmNearestTiesToEven
static LLVM_ABI bool hasSignBitInMSB(const fltSemantics &)
static LLVM_ABI ExponentType semanticsMaxExponent(const fltSemantics &)
static LLVM_ABI unsigned int semanticsPrecision(const fltSemantics &)
static LLVM_ABI bool semanticsHasNaN(const fltSemantics &)
static LLVM_ABI Semantics SemanticsToEnum(const llvm::fltSemantics &Sem)
int32_t ExponentType
A signed type to represent a floating point numbers unbiased exponent.
static constexpr unsigned integerPartWidth
static const fltSemantics & PPCDoubleDoubleLegacy()
APInt::WordType integerPart
static LLVM_ABI bool semanticsHasZero(const fltSemantics &)
static LLVM_ABI bool isRepresentableAsNormalIn(const fltSemantics &Src, const fltSemantics &Dst)
static const fltSemantics & Float8E5M2FNUZ()
static const fltSemantics & Float8E4M3FNUZ()
static constexpr roundingMode rmTowardPositive
static const fltSemantics & IEEEhalf()
static const fltSemantics & Float4E2M1FN()
static const fltSemantics & Float6E2M3FN()
static const fltSemantics & Float8E4M3()
static const fltSemantics & Float8E4M3B11FNUZ()
static LLVM_ABI bool isRepresentableBy(const fltSemantics &A, const fltSemantics &B)
static const fltSemantics & Float8E3M4()
static LLVM_ABI bool isIEEELikeFP(const fltSemantics &)
static const fltSemantics & Float8E5M2()
fltCategory
Category of internally-represented number.
static constexpr roundingMode rmNearestTiesToAway
static const fltSemantics & PPCDoubleDouble()
@ S_PPCDoubleDoubleLegacy
static const fltSemantics & Float6E3M2FN()
opStatus
IEEE-754R 7: Default exception handling.
static const fltSemantics & FloatTF32()
static LLVM_ABI unsigned int semanticsIntSizeInBits(const fltSemantics &, bool)
static APFloat getQNaN(const fltSemantics &Sem, bool Negative=false, const APInt *payload=nullptr)
Factory for QNaN values.
LLVM_ABI void Profile(FoldingSetNodeID &NID) const
Used to insert APFloat objects, or objects that contain APFloat objects, into FoldingSets.
opStatus divide(const APFloat &RHS, roundingMode RM)
bool isFiniteNonZero() const
LLVM_ABI opStatus convert(const fltSemantics &ToSemantics, roundingMode RM, bool *losesInfo)
LLVM_READONLY int getExactLog2Abs() const
bool getExactInverse(APFloat *Inv) const
If this value is normal and has an exact, normal, multiplicative inverse, store it in inv and return ...
LLVM_ABI double convertToDouble() const
Converts this APFloat to host double value.
void toString(SmallVectorImpl< char > &Str, unsigned FormatPrecision=0, unsigned FormatMaxPadding=3, bool TruncateZero=true) const
opStatus add(const APFloat &RHS, roundingMode RM)
static LLVM_ABI APFloat getAllOnesValue(const fltSemantics &Semantics)
Returns a float which is bitcasted from an all one value int.
LLVM_ABI friend hash_code hash_value(const APFloat &Arg)
See friend declarations above.
const fltSemantics & getSemantics() const
static APFloat getOne(const fltSemantics &Sem, bool Negative=false)
Factory for Positive and Negative One.
unsigned int convertToHexString(char *DST, unsigned int HexDigits, bool UpperCase, roundingMode RM) const
LLVM_ABI float convertToFloat() const
Converts this APFloat to host float value.
opStatus fusedMultiplyAdd(const APFloat &Multiplicand, const APFloat &Addend, roundingMode RM)
opStatus remainder(const APFloat &RHS)
APInt bitcastToAPInt() const
opStatus convertToInteger(MutableArrayRef< integerPart > Input, unsigned int Width, bool IsSigned, roundingMode RM, bool *IsExact) const
opStatus next(bool nextDown)
static APFloat getInf(const fltSemantics &Sem, bool Negative=false)
Factory for Positive and Negative Infinity.
friend APFloat scalbn(APFloat X, int Exp, roundingMode RM)
static APFloat getSmallest(const fltSemantics &Sem, bool Negative=false)
Returns the smallest (by magnitude) finite number in the given semantics.
LLVM_ABI FPClassTest classify() const
Return the FPClassTest which will return true for the value.
opStatus mod(const APFloat &RHS)
LLVM_ABI Expected< opStatus > convertFromString(StringRef, roundingMode)
LLVM_DUMP_METHOD void dump() const
LLVM_ABI void print(raw_ostream &) const
opStatus roundToIntegral(roundingMode RM)
static bool hasSignificand(const fltSemantics &Sem)
Returns true if the given semantics has actual significand.
static APFloat getZero(const fltSemantics &Sem, bool Negative=false)
Factory for Positive and Negative Zero.
Class for arbitrary precision integers.
LLVM_ABI APInt udiv(const APInt &RHS) const
Unsigned division operation.
static LLVM_ABI void tcSetBit(WordType *, unsigned bit)
Set the given bit of a bignum. Zero-based.
static APInt getAllOnes(unsigned numBits)
Return an APInt of a specified width with all bits set.
static LLVM_ABI void tcSet(WordType *, WordType, unsigned)
Sets the least significant part of a bignum to the input value, and zeroes out higher parts.
static LLVM_ABI void udivrem(const APInt &LHS, const APInt &RHS, APInt &Quotient, APInt &Remainder)
Dual division/remainder interface.
static LLVM_ABI int tcExtractBit(const WordType *, unsigned bit)
Extract the given bit of a bignum; returns 0 or 1. Zero-based.
LLVM_ABI APInt zext(unsigned width) const
Zero extend to a new width.
static LLVM_ABI WordType tcAdd(WordType *, const WordType *, WordType carry, unsigned)
DST += RHS + CARRY where CARRY is zero or one. Returns the carry flag.
static LLVM_ABI void tcExtract(WordType *, unsigned dstCount, const WordType *, unsigned srcBits, unsigned srcLSB)
Copy the bit vector of width srcBITS from SRC, starting at bit srcLSB, to DST, of dstCOUNT parts,...
unsigned getActiveBits() const
Compute the number of active bits in the value.
LLVM_ABI APInt trunc(unsigned width) const
Truncate to new width.
static LLVM_ABI int tcCompare(const WordType *, const WordType *, unsigned)
Comparison (unsigned) of two bignums.
static APInt floatToBits(float V)
Converts a float to APInt bits.
static LLVM_ABI void tcAssign(WordType *, const WordType *, unsigned)
Assign one bignum to another.
unsigned getBitWidth() const
Return the number of bits in the APInt.
static LLVM_ABI void tcShiftRight(WordType *, unsigned Words, unsigned Count)
Shift a bignum right Count bits.
static LLVM_ABI void tcFullMultiply(WordType *, const WordType *, const WordType *, unsigned, unsigned)
DST = LHS * RHS, where DST has width the sum of the widths of the operands.
unsigned getNumWords() const
Get the number of words.
bool isNegative() const
Determine sign of this APInt.
static LLVM_ABI void tcClearBit(WordType *, unsigned bit)
Clear the given bit of a bignum. Zero-based.
void negate()
Negate this APInt in place.
static WordType tcDecrement(WordType *dst, unsigned parts)
Decrement a bignum in-place. Return the borrow flag.
unsigned countr_zero() const
Count the number of trailing zero bits.
static LLVM_ABI unsigned tcLSB(const WordType *, unsigned n)
Returns the bit number of the least or most significant set bit of a number.
static LLVM_ABI void tcShiftLeft(WordType *, unsigned Words, unsigned Count)
Shift a bignum left Count bits.
static LLVM_ABI bool tcIsZero(const WordType *, unsigned)
Returns true if a bignum is zero, false otherwise.
static LLVM_ABI unsigned tcMSB(const WordType *parts, unsigned n)
Returns the bit number of the most significant set bit of a number.
float bitsToFloat() const
Converts APInt bits to a float.
static LLVM_ABI int tcMultiplyPart(WordType *dst, const WordType *src, WordType multiplier, WordType carry, unsigned srcParts, unsigned dstParts, bool add)
DST += SRC * MULTIPLIER + PART if add is true DST = SRC * MULTIPLIER + PART if add is false.
static constexpr unsigned APINT_BITS_PER_WORD
Bits in a word.
static LLVM_ABI WordType tcSubtract(WordType *, const WordType *, WordType carry, unsigned)
DST -= RHS + CARRY where CARRY is zero or one. Returns the carry flag.
static LLVM_ABI void tcNegate(WordType *, unsigned)
Negate a bignum in-place.
static APInt doubleToBits(double V)
Converts a double to APInt bits.
static WordType tcIncrement(WordType *dst, unsigned parts)
Increment a bignum in-place. Return the carry flag.
double bitsToDouble() const
Converts APInt bits to a double.
const uint64_t * getRawData() const
This function returns a pointer to the internal storage of the APInt.
static APInt getZero(unsigned numBits)
Get the '0' value for the specified bit-width.
void lshrInPlace(unsigned ShiftAmt)
Logical right-shift this APInt by ShiftAmt in place.
An arbitrary precision integer that knows its signedness.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
size - Get the array size.
Lightweight error class with error context and mandatory checking.
static ErrorSuccess success()
Create a success value.
Tagged union holding either a T or a Error.
FoldingSetNodeID - This class is used to gather all the unique data bits of a node.
MutableArrayRef - Represent a mutable reference to an array (0 or more elements consecutively in memo...
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
iterator erase(const_iterator CI)
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringRef - Represent a constant reference to a string, i.e.
bool getAsInteger(unsigned Radix, T &Result) const
Parse the current string as an integer of the specified radix.
constexpr bool empty() const
empty - Check if the string is empty.
StringRef drop_front(size_t N=1) const
Return a StringRef equal to 'this' but with the first N elements dropped.
char back() const
back - Get the last character in the string.
StringRef slice(size_t Start, size_t End) const
Return a reference to the substring from [Start, End).
constexpr size_t size() const
size - Get the string size.
char front() const
front - Get the first character in the string.
bool consume_front(StringRef Prefix)
Returns true if this StringRef has the given prefix and removes that prefix.
bool consume_front_insensitive(StringRef Prefix)
Returns true if this StringRef has the given prefix, ignoring case, and removes that prefix.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
LLVM_ABI void makeSmallestNormalized(bool Neg)
LLVM_ABI DoubleAPFloat & operator=(const DoubleAPFloat &RHS)
LLVM_ABI void changeSign()
LLVM_ABI bool isLargest() const
LLVM_ABI opStatus remainder(const DoubleAPFloat &RHS)
LLVM_ABI opStatus multiply(const DoubleAPFloat &RHS, roundingMode RM)
LLVM_ABI fltCategory getCategory() const
LLVM_ABI bool bitwiseIsEqual(const DoubleAPFloat &RHS) const
LLVM_ABI LLVM_READONLY int getExactLog2Abs() const
LLVM_ABI opStatus convertFromAPInt(const APInt &Input, bool IsSigned, roundingMode RM)
LLVM_ABI APInt bitcastToAPInt() const
LLVM_ABI Expected< opStatus > convertFromString(StringRef, roundingMode)
LLVM_ABI bool isSmallest() const
LLVM_ABI opStatus subtract(const DoubleAPFloat &RHS, roundingMode RM)
LLVM_ABI friend hash_code hash_value(const DoubleAPFloat &Arg)
LLVM_ABI cmpResult compareAbsoluteValue(const DoubleAPFloat &RHS) const
LLVM_ABI bool isDenormal() const
LLVM_ABI opStatus convertToInteger(MutableArrayRef< integerPart > Input, unsigned int Width, bool IsSigned, roundingMode RM, bool *IsExact) const
LLVM_ABI void makeSmallest(bool Neg)
LLVM_ABI friend int ilogb(const DoubleAPFloat &X)
LLVM_ABI opStatus next(bool nextDown)
LLVM_ABI void makeInf(bool Neg)
LLVM_ABI bool isInteger() const
LLVM_ABI void makeZero(bool Neg)
LLVM_ABI opStatus divide(const DoubleAPFloat &RHS, roundingMode RM)
LLVM_ABI bool isSmallestNormalized() const
LLVM_ABI opStatus mod(const DoubleAPFloat &RHS)
LLVM_ABI DoubleAPFloat(const fltSemantics &S)
LLVM_ABI void toString(SmallVectorImpl< char > &Str, unsigned FormatPrecision, unsigned FormatMaxPadding, bool TruncateZero=true) const
LLVM_ABI void makeLargest(bool Neg)
LLVM_ABI cmpResult compare(const DoubleAPFloat &RHS) const
LLVM_ABI friend DoubleAPFloat scalbn(const DoubleAPFloat &X, int Exp, roundingMode)
LLVM_ABI opStatus roundToIntegral(roundingMode RM)
LLVM_ABI opStatus fusedMultiplyAdd(const DoubleAPFloat &Multiplicand, const DoubleAPFloat &Addend, roundingMode RM)
LLVM_ABI unsigned int convertToHexString(char *DST, unsigned int HexDigits, bool UpperCase, roundingMode RM) const
LLVM_ABI bool isNegative() const
LLVM_ABI opStatus add(const DoubleAPFloat &RHS, roundingMode RM)
LLVM_ABI void makeNaN(bool SNaN, bool Neg, const APInt *fill)
LLVM_ABI unsigned int convertToHexString(char *dst, unsigned int hexDigits, bool upperCase, roundingMode) const
Write out a hexadecimal representation of the floating point value to DST, which must be of sufficien...
LLVM_ABI cmpResult compareAbsoluteValue(const IEEEFloat &) const
LLVM_ABI opStatus mod(const IEEEFloat &)
C fmod, or llvm frem.
fltCategory getCategory() const
LLVM_ABI opStatus convertFromAPInt(const APInt &, bool, roundingMode)
bool isFiniteNonZero() const
bool needsCleanup() const
Returns whether this instance allocated memory.
LLVM_ABI void makeLargest(bool Neg=false)
Make this number the largest magnitude normal number in the given semantics.
LLVM_ABI LLVM_READONLY int getExactLog2Abs() const
LLVM_ABI APInt bitcastToAPInt() const
LLVM_ABI friend IEEEFloat scalbn(IEEEFloat X, int Exp, roundingMode)
LLVM_ABI cmpResult compare(const IEEEFloat &) const
IEEE comparison with another floating point number (NaNs compare unordered, 0==-0).
bool isNegative() const
IEEE-754R isSignMinus: Returns true if and only if the current value is negative.
LLVM_ABI opStatus divide(const IEEEFloat &, roundingMode)
bool isNaN() const
Returns true if and only if the float is a quiet or signaling NaN.
LLVM_ABI opStatus remainder(const IEEEFloat &)
IEEE remainder.
LLVM_ABI double convertToDouble() const
LLVM_ABI float convertToFloat() const
LLVM_ABI opStatus subtract(const IEEEFloat &, roundingMode)
LLVM_ABI void toString(SmallVectorImpl< char > &Str, unsigned FormatPrecision=0, unsigned FormatMaxPadding=3, bool TruncateZero=true) const
Converts this value into a decimal string.
LLVM_ABI void makeSmallest(bool Neg=false)
Make this number the smallest magnitude denormal number in the given semantics.
LLVM_ABI void makeInf(bool Neg=false)
LLVM_ABI bool isSmallestNormalized() const
Returns true if this is the smallest (by magnitude) normalized finite number in the given semantics.
LLVM_ABI void makeQuiet()
LLVM_ABI bool isLargest() const
Returns true if and only if the number has the largest possible finite magnitude in the current seman...
LLVM_ABI opStatus add(const IEEEFloat &, roundingMode)
bool isFinite() const
Returns true if and only if the current value is zero, subnormal, or normal.
LLVM_ABI Expected< opStatus > convertFromString(StringRef, roundingMode)
LLVM_ABI void makeNaN(bool SNaN=false, bool Neg=false, const APInt *fill=nullptr)
LLVM_ABI opStatus multiply(const IEEEFloat &, roundingMode)
LLVM_ABI opStatus roundToIntegral(roundingMode)
LLVM_ABI IEEEFloat & operator=(const IEEEFloat &)
LLVM_ABI bool bitwiseIsEqual(const IEEEFloat &) const
Bitwise comparison for equality (QNaNs compare equal, 0!=-0).
LLVM_ABI void makeSmallestNormalized(bool Negative=false)
Returns the smallest (by magnitude) normalized finite number in the given semantics.
LLVM_ABI bool isInteger() const
Returns true if and only if the number is an exact integer.
LLVM_ABI IEEEFloat(const fltSemantics &)
LLVM_ABI opStatus fusedMultiplyAdd(const IEEEFloat &, const IEEEFloat &, roundingMode)
LLVM_ABI friend int ilogb(const IEEEFloat &Arg)
LLVM_ABI opStatus next(bool nextDown)
IEEE-754R 5.3.1: nextUp/nextDown.
bool isInfinity() const
IEEE-754R isInfinite(): Returns true if and only if the float is infinity.
const fltSemantics & getSemantics() const
bool isZero() const
Returns true if and only if the float is plus or minus zero.
LLVM_ABI bool isSignaling() const
Returns true if and only if the float is a signaling NaN.
LLVM_ABI void makeZero(bool Neg=false)
LLVM_ABI opStatus convert(const fltSemantics &, roundingMode, bool *)
IEEEFloat::convert - convert a value of one floating point type to another.
LLVM_ABI void changeSign()
LLVM_ABI bool isDenormal() const
IEEE-754R isSubnormal(): Returns true if and only if the float is a denormal.
LLVM_ABI opStatus convertToInteger(MutableArrayRef< integerPart >, unsigned int, bool, roundingMode, bool *) const
LLVM_ABI bool isSmallest() const
Returns true if and only if the number has the smallest possible non-zero magnitude in the current se...
An opaque object representing a hash code.
This class implements an extremely fast bulk output stream that can only output to a stream.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ C
The default llvm calling convention, compatible with C.
static constexpr opStatus opInexact
LLVM_ABI SlowDynamicAPInt abs(const SlowDynamicAPInt &X)
Redeclarations of friend declarations above to make it discoverable by lookups.
static constexpr fltCategory fcNaN
static constexpr opStatus opDivByZero
static constexpr opStatus opOverflow
static constexpr cmpResult cmpLessThan
const char unit< Period >::value[]
static void tcSetLeastSignificantBits(APInt::WordType *dst, unsigned parts, unsigned bits)
static constexpr roundingMode rmTowardPositive
static constexpr uninitializedTag uninitialized
static constexpr fltCategory fcZero
static constexpr opStatus opOK
static constexpr cmpResult cmpGreaterThan
static constexpr unsigned integerPartWidth
LLVM_ABI hash_code hash_value(const IEEEFloat &Arg)
APFloatBase::ExponentType ExponentType
static constexpr fltCategory fcNormal
static constexpr opStatus opInvalidOp
APFloatBase::opStatus opStatus
LLVM_ABI IEEEFloat frexp(const IEEEFloat &Val, int &Exp, roundingMode RM)
APFloatBase::uninitializedTag uninitializedTag
static constexpr cmpResult cmpUnordered
static constexpr roundingMode rmTowardNegative
APFloatBase::roundingMode roundingMode
APFloatBase::cmpResult cmpResult
static constexpr fltCategory fcInfinity
static constexpr roundingMode rmNearestTiesToAway
static constexpr roundingMode rmTowardZero
static constexpr opStatus opUnderflow
static constexpr roundingMode rmNearestTiesToEven
LLVM_ABI int ilogb(const IEEEFloat &Arg)
static constexpr cmpResult cmpEqual
LLVM_ABI IEEEFloat scalbn(IEEEFloat X, int Exp, roundingMode)
static std::pair< APFloat, APFloat > fastTwoSum(APFloat X, APFloat Y)
APFloatBase::integerPart integerPart
LLVM_ABI std::error_code status(const Twine &path, file_status &result, bool follow=true)
Get file status as if by POSIX stat().
This is an optimization pass for GlobalISel generic memory operations.
static unsigned int partAsHex(char *dst, APFloatBase::integerPart part, unsigned int count, const char *hexDigitChars)
void fill(R &&Range, T &&Value)
Provide wrappers to std::fill which take ranges instead of having to pass begin/end explicitly.
static const char infinityL[]
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
static constexpr unsigned int partCountForBits(unsigned int bits)
static unsigned int HUerrBound(bool inexactMultiply, unsigned int HUerr1, unsigned int HUerr2)
static unsigned int powerOf5(APFloatBase::integerPart *dst, unsigned int power)
unsigned hexDigitValue(char C)
Interpret the given character C as a hexadecimal digit and return its value.
static APFloat harrisonUlp(const APFloat &X)
static constexpr APFloatBase::ExponentType exponentZero(const fltSemantics &semantics)
static Expected< int > totalExponent(StringRef::iterator p, StringRef::iterator end, int exponentAdjustment)
LLVM_ABI std::error_code inconvertibleErrorCode()
The value returned by this function can be returned from convertToErrorCode for Error values where no...
const unsigned int maxPowerOfFiveExponent
int ilogb(const APFloat &Arg)
Returns the exponent of the internal representation of the APFloat.
static char * writeUnsignedDecimal(char *dst, unsigned int n)
constexpr int popcount(T Value) noexcept
Count the number of set bits in a value.
const unsigned int maxPrecision
APFloat frexp(const APFloat &X, int &Exp, APFloat::roundingMode RM)
Equivalent of C standard library function.
int countr_zero(T Val)
Count number of 0's from the least significant bit to the most stopping at the first 1.
static const char infinityU[]
lostFraction
Enum that represents what fraction of the LSB truncated bits of an fp number represent.
static Error interpretDecimal(StringRef::iterator begin, StringRef::iterator end, decimalInfo *D)
LLVM_ABI bool isFinite(const Loop *L)
Return true if this loop can be assumed to run for a finite number of iterations.
FPClassTest
Floating-point class tests, supported by 'is_fpclass' intrinsic.
const unsigned int maxPowerOfFiveParts
APFloat scalbn(APFloat X, int Exp, APFloat::roundingMode RM)
Returns: X * 2^Exp for integral exponents.
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
static constexpr APFloatBase::ExponentType exponentNaN(const fltSemantics &semantics)
static Error createError(const Twine &Err)
static lostFraction shiftRight(APFloatBase::integerPart *dst, unsigned int parts, unsigned int bits)
Error make_error(ArgTs &&... Args)
Make a Error instance representing failure using the given error info type.
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
static const char hexDigitsUpper[]
FunctionAddr VTableAddr uintptr_t uintptr_t Data
const unsigned int maxExponent
static unsigned int decDigitValue(unsigned int c)
auto count(R &&Range, const E &Element)
Wrapper function around std::count to count the number of times an element Element occurs in the give...
static lostFraction combineLostFractions(lostFraction moreSignificant, lostFraction lessSignificant)
static Expected< StringRef::iterator > skipLeadingZeroesAndAnyDot(StringRef::iterator begin, StringRef::iterator end, StringRef::iterator *dot)
RoundingMode
Rounding mode.
ArrayRef(const T &OneElt) -> ArrayRef< T >
static constexpr APFloatBase::ExponentType exponentInf(const fltSemantics &semantics)
static lostFraction lostFractionThroughTruncation(const APFloatBase::integerPart *parts, unsigned int partCount, unsigned int bits)
APFloat neg(APFloat X)
Returns the negated value of the argument.
static APFloatBase::integerPart ulpsFromBoundary(const APFloatBase::integerPart *parts, unsigned int bits, bool isNearest)
static char * writeSignedDecimal(char *dst, int value)
hash_code hash_combine(const Ts &...args)
Combine values into a single hash_code.
static Expected< lostFraction > trailingHexadecimalFraction(StringRef::iterator p, StringRef::iterator end, unsigned int digitValue)
void consumeError(Error Err)
Consume a Error without doing anything.
static Expected< int > readExponent(StringRef::iterator begin, StringRef::iterator end)
hash_code hash_combine_range(InputIteratorT first, InputIteratorT last)
Compute a hash_code for a sequence of values.
constexpr uint64_t NextPowerOf2(uint64_t A)
Returns the next power of two (in 64-bits) that is strictly greater than A.
static const char hexDigitsLower[]
const char * lastSigDigit
const char * firstSigDigit
APFloatBase::ExponentType maxExponent
fltNonfiniteBehavior nonFiniteBehavior
APFloatBase::ExponentType minExponent
fltNanEncoding nanEncoding