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 &&
2800 if (omsb >= width + !isSigned)
2822 unsigned int width,
bool isSigned,
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)
2840 bits = width - isSigned;
2843 if (sign && isSigned)
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));
3951 bool is_zero = myexponent == 0 && all_zero_significand;
3954 if (myexponent - bias == ::exponentInf(S) && all_zero_significand) {
3960 bool is_nan =
false;
3963 is_nan = myexponent - bias == ::exponentNaN(S) && !all_zero_significand;
3965 bool all_ones_significand =
3966 std::all_of(mysignificand.begin(), mysignificand.end() - 1,
3967 [](
integerPart bits) { return bits == ~integerPart{0}; }) &&
3968 (!significand_mask ||
3969 mysignificand[mysignificand.size() - 1] == significand_mask);
3970 is_nan = myexponent - bias == ::exponentNaN(S) && all_ones_significand;
3972 is_nan = is_zero && sign;
3978 std::copy_n(mysignificand.begin(), mysignificand.size(),
3979 significandParts());
3989 exponent = myexponent - bias;
3990 std::copy_n(mysignificand.begin(), mysignificand.size(), significandParts());
3991 if (myexponent == 0)
3992 exponent = S.minExponent;
3994 significandParts()[mysignificand.size()-1] |= integer_bit;
3997void IEEEFloat::initFromQuadrupleAPInt(
const APInt &api) {
3998 initFromIEEEAPInt<APFloatBase::semIEEEquad>(api);
4001void IEEEFloat::initFromDoubleAPInt(
const APInt &api) {
4002 initFromIEEEAPInt<APFloatBase::semIEEEdouble>(api);
4005void IEEEFloat::initFromFloatAPInt(
const APInt &api) {
4006 initFromIEEEAPInt<APFloatBase::semIEEEsingle>(api);
4009void IEEEFloat::initFromBFloatAPInt(
const APInt &api) {
4010 initFromIEEEAPInt<APFloatBase::semBFloat>(api);
4013void IEEEFloat::initFromHalfAPInt(
const APInt &api) {
4014 initFromIEEEAPInt<APFloatBase::semIEEEhalf>(api);
4017void IEEEFloat::initFromFloat8E5M2APInt(
const APInt &api) {
4018 initFromIEEEAPInt<APFloatBase::semFloat8E5M2>(api);
4021void IEEEFloat::initFromFloat8E5M2FNUZAPInt(
const APInt &api) {
4022 initFromIEEEAPInt<APFloatBase::semFloat8E5M2FNUZ>(api);
4025void IEEEFloat::initFromFloat8E4M3APInt(
const APInt &api) {
4026 initFromIEEEAPInt<APFloatBase::semFloat8E4M3>(api);
4029void IEEEFloat::initFromFloat8E4M3FNAPInt(
const APInt &api) {
4030 initFromIEEEAPInt<APFloatBase::semFloat8E4M3FN>(api);
4033void IEEEFloat::initFromFloat8E4M3FNUZAPInt(
const APInt &api) {
4034 initFromIEEEAPInt<APFloatBase::semFloat8E4M3FNUZ>(api);
4037void IEEEFloat::initFromFloat8E4M3B11FNUZAPInt(
const APInt &api) {
4038 initFromIEEEAPInt<APFloatBase::semFloat8E4M3B11FNUZ>(api);
4041void IEEEFloat::initFromFloat8E3M4APInt(
const APInt &api) {
4042 initFromIEEEAPInt<APFloatBase::semFloat8E3M4>(api);
4045void IEEEFloat::initFromFloatTF32APInt(
const APInt &api) {
4046 initFromIEEEAPInt<APFloatBase::semFloatTF32>(api);
4049void IEEEFloat::initFromFloat6E3M2FNAPInt(
const APInt &api) {
4050 initFromIEEEAPInt<APFloatBase::semFloat6E3M2FN>(api);
4053void IEEEFloat::initFromFloat6E2M3FNAPInt(
const APInt &api) {
4054 initFromIEEEAPInt<APFloatBase::semFloat6E2M3FN>(api);
4057void IEEEFloat::initFromFloat4E2M1FNAPInt(
const APInt &api) {
4058 initFromIEEEAPInt<APFloatBase::semFloat4E2M1FN>(api);
4064 if (Sem == &APFloatBase::semIEEEhalf)
4065 return initFromHalfAPInt(api);
4066 if (Sem == &APFloatBase::semBFloat)
4067 return initFromBFloatAPInt(api);
4068 if (Sem == &APFloatBase::semIEEEsingle)
4069 return initFromFloatAPInt(api);
4070 if (Sem == &APFloatBase::semIEEEdouble)
4071 return initFromDoubleAPInt(api);
4072 if (Sem == &APFloatBase::semX87DoubleExtended)
4073 return initFromF80LongDoubleAPInt(api);
4074 if (Sem == &APFloatBase::semIEEEquad)
4075 return initFromQuadrupleAPInt(api);
4076 if (Sem == &APFloatBase::semPPCDoubleDoubleLegacy)
4077 return initFromPPCDoubleDoubleLegacyAPInt(api);
4078 if (Sem == &APFloatBase::semFloat8E5M2)
4079 return initFromFloat8E5M2APInt(api);
4080 if (Sem == &APFloatBase::semFloat8E5M2FNUZ)
4081 return initFromFloat8E5M2FNUZAPInt(api);
4082 if (Sem == &APFloatBase::semFloat8E4M3)
4083 return initFromFloat8E4M3APInt(api);
4084 if (Sem == &APFloatBase::semFloat8E4M3FN)
4085 return initFromFloat8E4M3FNAPInt(api);
4086 if (Sem == &APFloatBase::semFloat8E4M3FNUZ)
4087 return initFromFloat8E4M3FNUZAPInt(api);
4088 if (Sem == &APFloatBase::semFloat8E4M3B11FNUZ)
4089 return initFromFloat8E4M3B11FNUZAPInt(api);
4090 if (Sem == &APFloatBase::semFloat8E3M4)
4091 return initFromFloat8E3M4APInt(api);
4092 if (Sem == &APFloatBase::semFloatTF32)
4093 return initFromFloatTF32APInt(api);
4094 if (Sem == &APFloatBase::semFloat8E8M0FNU)
4095 return initFromFloat8E8M0FNUAPInt(api);
4096 if (Sem == &APFloatBase::semFloat6E3M2FN)
4097 return initFromFloat6E3M2FNAPInt(api);
4098 if (Sem == &APFloatBase::semFloat6E2M3FN)
4099 return initFromFloat6E2M3FNAPInt(api);
4100 if (Sem == &APFloatBase::semFloat4E2M1FN)
4101 return initFromFloat4E2M1FNAPInt(api);
4109 if (Negative && !semantics->hasSignedRepr)
4111 "This floating point format does not support signed values");
4118 exponent = semantics->maxExponent;
4122 unsigned PartCount = partCount();
4123 memset(significand, 0xFF,
sizeof(
integerPart)*(PartCount - 1));
4127 const unsigned NumUnusedHighBits =
4134 (semantics->precision > 1))
4141 if (Negative && !semantics->hasSignedRepr)
4143 "This floating point format does not support signed values");
4150 exponent = semantics->minExponent;
4155 if (Negative && !semantics->hasSignedRepr)
4157 "This floating point format does not support signed values");
4166 exponent = semantics->minExponent;
4171 initFromAPInt(&Sem, API);
4184 Buffer.
append(Str.begin(), Str.end());
4189 void AdjustToPrecision(
APInt &significand,
4190 int &exp,
unsigned FormatPrecision) {
4194 unsigned bitsRequired = (FormatPrecision * 196 + 58) / 59;
4196 if (bits <= bitsRequired)
return;
4198 unsigned tensRemovable = (bits - bitsRequired) * 59 / 196;
4199 if (!tensRemovable)
return;
4201 exp += tensRemovable;
4206 if (tensRemovable & 1)
4208 tensRemovable >>= 1;
4209 if (!tensRemovable)
break;
4213 significand = significand.
udiv(divisor);
4221 int &exp,
unsigned FormatPrecision) {
4222 unsigned N = buffer.
size();
4223 if (
N <= FormatPrecision)
return;
4226 unsigned FirstSignificant =
N - FormatPrecision;
4233 if (buffer[FirstSignificant - 1] <
'5') {
4234 while (FirstSignificant <
N && buffer[FirstSignificant] ==
'0')
4237 exp += FirstSignificant;
4238 buffer.
erase(&buffer[0], &buffer[FirstSignificant]);
4244 for (
unsigned I = FirstSignificant;
I !=
N; ++
I) {
4245 if (buffer[
I] ==
'9') {
4254 if (FirstSignificant ==
N) {
4255 exp += FirstSignificant;
4261 exp += FirstSignificant;
4262 buffer.
erase(&buffer[0], &buffer[FirstSignificant]);
4266 APInt significand,
unsigned FormatPrecision,
4267 unsigned FormatMaxPadding,
bool TruncateZero) {
4268 const int semanticsPrecision = significand.
getBitWidth();
4275 if (!FormatPrecision) {
4283 FormatPrecision = 2 + semanticsPrecision * 59 / 196;
4288 exp += trailingZeros;
4294 }
else if (exp > 0) {
4296 significand = significand.
zext(semanticsPrecision + exp);
4297 significand <<= exp;
4311 unsigned precision = semanticsPrecision + (137 * texp + 136) / 59;
4315 significand = significand.
zext(precision);
4316 APInt five_to_the_i(precision, 5);
4319 significand *= five_to_the_i;
4324 five_to_the_i *= five_to_the_i;
4328 AdjustToPrecision(significand, exp, FormatPrecision);
4333 unsigned precision = significand.getBitWidth();
4334 if (precision < 4) {
4337 significand = significand.zext(precision);
4339 APInt ten(precision, 10);
4340 APInt digit(precision, 0);
4342 bool inTrail =
true;
4343 while (significand != 0) {
4348 unsigned d = digit.getZExtValue();
4359 assert(!buffer.
empty() &&
"no characters in buffer!");
4363 AdjustToPrecision(buffer, exp, FormatPrecision);
4365 unsigned NDigits = buffer.
size();
4368 bool FormatScientific;
4369 if (!FormatMaxPadding)
4370 FormatScientific =
true;
4376 FormatScientific = ((unsigned) exp > FormatMaxPadding ||
4377 NDigits + (unsigned) exp > FormatPrecision);
4380 int MSD = exp + (int) (NDigits - 1);
4383 FormatScientific =
false;
4387 FormatScientific = ((unsigned) -MSD) > FormatMaxPadding;
4393 if (FormatScientific) {
4394 exp += (NDigits - 1);
4396 Str.push_back(buffer[NDigits-1]);
4398 if (NDigits == 1 && TruncateZero)
4401 for (
unsigned I = 1;
I != NDigits; ++
I)
4402 Str.push_back(buffer[NDigits-1-
I]);
4404 if (!TruncateZero && FormatPrecision > NDigits - 1)
4405 Str.append(FormatPrecision - NDigits + 1,
'0');
4407 Str.push_back(TruncateZero ?
'E' :
'e');
4409 Str.push_back(exp >= 0 ?
'+' :
'-');
4414 expbuf.
push_back((
char) (
'0' + (exp % 10)));
4418 if (!TruncateZero && expbuf.
size() < 2)
4420 for (
unsigned I = 0,
E = expbuf.
size();
I !=
E; ++
I)
4421 Str.push_back(expbuf[
E-1-
I]);
4427 for (
unsigned I = 0;
I != NDigits; ++
I)
4428 Str.push_back(buffer[NDigits-1-
I]);
4429 for (
unsigned I = 0;
I != (unsigned) exp; ++
I)
4437 int NWholeDigits = exp + (int) NDigits;
4440 if (NWholeDigits > 0) {
4441 for (;
I != (unsigned) NWholeDigits; ++
I)
4442 Str.push_back(buffer[NDigits-
I-1]);
4445 unsigned NZeros = 1 + (unsigned) -NWholeDigits;
4449 for (
unsigned Z = 1;
Z != NZeros; ++
Z)
4453 for (;
I != NDigits; ++
I)
4454 Str.push_back(buffer[NDigits-
I-1]);
4460 unsigned FormatMaxPadding,
bool TruncateZero)
const {
4464 return append(Str,
"-Inf");
4466 return append(Str,
"+Inf");
4468 case fcNaN:
return append(Str,
"NaN");
4474 if (!FormatMaxPadding) {
4476 append(Str,
"0.0E+0");
4479 if (FormatPrecision > 1)
4480 Str.append(FormatPrecision - 1,
'0');
4481 append(Str,
"e+00");
4493 int exp = exponent - ((int) semantics->precision - 1);
4495 semantics->precision,
4498 toStringImpl(Str,
isNegative(), exp, significand, FormatPrecision,
4499 FormatMaxPadding, TruncateZero);
4511 for (
int i = 0; i < PartCount; ++i) {
4517 if (exponent != semantics->minExponent)
4520 int CountrParts = 0;
4521 for (
int i = 0; i < PartCount;
4523 if (Parts[i] != 0) {
4524 return exponent - semantics->precision + CountrParts +
4587 if (!semantics->hasZero)
4597 }
else if (semantics->nonFiniteBehavior ==
4605 exponent = semantics->maxExponent + 1;
4619 bool WillCrossBinadeBoundary =
4620 exponent != semantics->minExponent && isSignificandAllZeros();
4638 if (WillCrossBinadeBoundary) {
4659 if (WillCrossBinadeBoundary) {
4663 assert(exponent != semantics->maxExponent &&
4664 "We can not increment an exponent beyond the maxExponent allowed"
4665 " by the given floating point semantics.");
4668 incrementSignificand();
4682 return ::exponentNaN(*semantics);
4686 return ::exponentInf(*semantics);
4690 return ::exponentZero(*semantics);
4709 if (!semantics->hasZero)
4736 return Arg.exponent;
4741 Normalized.exponent += SignificandBits;
4743 return Normalized.exponent - SignificandBits;
4747 auto MaxExp =
X.getSemantics().maxExponent;
4748 auto MinExp =
X.getSemantics().minExponent;
4756 int SignificandBits =
X.getSemantics().precision - 1;
4757 int MaxIncrement = MaxExp - (MinExp - SignificandBits) + 1;
4760 X.exponent += std::clamp(Exp, -MaxIncrement - 1, MaxIncrement);
4783 return scalbn(Val, -Exp, RM);
4789 APFloat(APFloatBase::semIEEEdouble)}) {
4790 assert(Semantics == &APFloatBase::semPPCDoubleDouble);
4794 : Semantics(&S), Floats(new
APFloat[2]{
4797 assert(Semantics == &APFloatBase::semPPCDoubleDouble);
4803 APFloat(APFloatBase::semIEEEdouble)}) {
4804 assert(Semantics == &APFloatBase::semPPCDoubleDouble);
4810 APFloat(APFloatBase::semIEEEdouble,
APInt(64,
I.getRawData()[0])),
4811 APFloat(APFloatBase::semIEEEdouble,
APInt(64,
I.getRawData()[1]))}) {
4812 assert(Semantics == &APFloatBase::semPPCDoubleDouble);
4818 Floats(new
APFloat[2]{std::move(
First), std::move(Second)}) {
4819 assert(Semantics == &APFloatBase::semPPCDoubleDouble);
4820 assert(&Floats[0].getSemantics() == &APFloatBase::semIEEEdouble);
4821 assert(&Floats[1].getSemantics() == &APFloatBase::semIEEEdouble);
4825 : Semantics(RHS.Semantics),
4829 assert(Semantics == &APFloatBase::semPPCDoubleDouble);
4833 : Semantics(RHS.Semantics), Floats(RHS.Floats) {
4834 RHS.Semantics = &APFloatBase::semBogus;
4835 RHS.Floats =
nullptr;
4836 assert(Semantics == &APFloatBase::semPPCDoubleDouble);
4840 if (Semantics == RHS.Semantics && RHS.Floats) {
4841 Floats[0] = RHS.Floats[0];
4842 Floats[1] = RHS.Floats[1];
4843 }
else if (
this != &RHS) {
4876 Floats[0] = std::move(z);
4877 Floats[1].makeZero(
false);
4881 auto AComparedToC = a.compareAbsoluteValue(c);
4890 Status |= z.
add(a, RM);
4891 Status |= z.
add(c, RM);
4894 Floats[0] = std::move(z);
4895 Floats[1].makeZero(
false);
4900 Status |= zz.
add(cc, RM);
4904 Status |= Floats[1].subtract(z, RM);
4905 Status |= Floats[1].add(c, RM);
4906 Status |= Floats[1].add(zz, RM);
4910 Status |= Floats[1].subtract(z, RM);
4911 Status |= Floats[1].add(a, RM);
4912 Status |= Floats[1].add(zz, RM);
4917 Status |=
q.subtract(z, RM);
4922 Status |= zz.
add(c, RM);
4923 Status |=
q.add(z, RM);
4924 Status |=
q.subtract(a, RM);
4926 Status |= zz.
add(q, RM);
4927 Status |= zz.
add(
aa, RM);
4928 Status |= zz.
add(cc, RM);
4930 Floats[0] = std::move(z);
4931 Floats[1].makeZero(
false);
4935 Status |= Floats[0].add(zz, RM);
4937 Floats[1].makeZero(
false);
4940 Floats[1] = std::move(z);
4941 Status |= Floats[1].subtract(Floats[0], RM);
4942 Status |= Floats[1].add(zz, RM);
4968 LHS.isNegative() !=
RHS.isNegative()) {
4969 Out.makeNaN(
false, Out.isNegative(),
nullptr);
4984 assert(&
A.getSemantics() == &APFloatBase::semIEEEdouble);
4985 assert(&AA.getSemantics() == &APFloatBase::semIEEEdouble);
4986 assert(&
C.getSemantics() == &APFloatBase::semIEEEdouble);
4987 assert(&CC.getSemantics() == &APFloatBase::semIEEEdouble);
4988 assert(&Out.Floats[0].getSemantics() == &APFloatBase::semIEEEdouble);
4989 assert(&Out.Floats[1].getSemantics() == &APFloatBase::semIEEEdouble);
4990 return Out.addImpl(
A, AA,
C, CC, RM);
4995 return addWithSpecial(*
this, RHS, *
this, RM);
5001 auto Ret =
add(RHS, RM);
5008 const auto &LHS = *
this;
5025 if (LHS.getCategory() ==
fcNaN) {
5029 if (RHS.getCategory() ==
fcNaN) {
5035 Out.makeNaN(
false,
false,
nullptr);
5047 "Special cases not handled exhaustively");
5050 APFloat A = Floats[0],
B = Floats[1],
C = RHS.Floats[0],
D = RHS.Floats[1];
5054 if (!
T.isFiniteNonZero()) {
5056 Floats[1].makeZero(
false);
5078 Status |= U.add(Tau, RM);
5081 if (!U.isFinite()) {
5082 Floats[1].makeZero(
false);
5094 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
5095 "Unexpected Semantics");
5098 APFloat(APFloatBase::semPPCDoubleDoubleLegacy, RHS.bitcastToAPInt()), RM);
5104 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
5105 "Unexpected Semantics");
5108 APFloat(APFloatBase::semPPCDoubleDoubleLegacy, RHS.bitcastToAPInt()));
5114 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
5115 "Unexpected Semantics");
5118 APFloat(APFloatBase::semPPCDoubleDoubleLegacy, RHS.bitcastToAPInt()));
5127 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
5128 "Unexpected Semantics");
5131 APFloat(APFloatBase::semPPCDoubleDoubleLegacy,
5140 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
5141 "Unexpected Semantics");
5151 if (!
Hi.isFiniteNonZero() ||
Lo.isZero()) {
5152 Floats[0] = std::move(RoundedHi);
5153 Floats[1].makeZero(
false);
5165 const APFloat RoundingError = Rounded - ToRound;
5166 if (TieBreaker.isNonZero() &&
5167 TieBreaker.isNegative() != RoundingError.
isNegative() &&
5168 abs(RoundingError).isExactlyValue(0.5))
5177 if (RoundedHi !=
Hi) {
5182 RoundedHi = RoundToNearestHelper(
Hi, RoundedHi,
Lo);
5184 Floats[0] = std::move(RoundedHi);
5185 Floats[1].makeZero(
false);
5198 LoRoundingMode = RM;
5206 RoundedLo = RoundToNearestHelper(
Lo, RoundedLo,
Hi);
5209 std::tie(RoundedHi, RoundedLo) =
fastTwoSum(RoundedHi, RoundedLo);
5211 Floats[0] = std::move(RoundedHi);
5212 Floats[1] = std::move(RoundedLo);
5217 Floats[0].changeSign();
5218 Floats[1].changeSign();
5224 const cmpResult HiPartCmp = Floats[0].compareAbsoluteValue(RHS.Floats[0]);
5229 if (Floats[1].
isZero() && RHS.Floats[1].isZero())
5235 const bool ThisIsSubtractive =
5236 Floats[0].isNegative() != Floats[1].isNegative();
5237 const bool RHSIsSubtractive =
5238 RHS.Floats[0].isNegative() != RHS.Floats[1].isNegative();
5248 if (RHS.Floats[1].isZero())
5255 if (ThisIsSubtractive != RHSIsSubtractive)
5260 const cmpResult LoPartCmp = Floats[1].compareAbsoluteValue(RHS.Floats[1]);
5262 if (ThisIsSubtractive) {
5276 return Floats[0].getCategory();
5282 Floats[0].makeInf(Neg);
5283 Floats[1].makeZero(
false);
5287 Floats[0].makeZero(Neg);
5288 Floats[1].makeZero(
false);
5292 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
5293 "Unexpected Semantics");
5295 APFloat(APFloatBase::semIEEEdouble,
APInt(64, 0x7fefffffffffffffull));
5297 APFloat(APFloatBase::semIEEEdouble,
APInt(64, 0x7c8ffffffffffffeull));
5303 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
5304 "Unexpected Semantics");
5305 Floats[0].makeSmallest(Neg);
5306 Floats[1].makeZero(
false);
5310 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
5311 "Unexpected Semantics");
5313 APFloat(APFloatBase::semIEEEdouble,
APInt(64, 0x0360000000000000ull));
5315 Floats[0].changeSign();
5316 Floats[1].makeZero(
false);
5320 Floats[0].makeNaN(SNaN, Neg,
fill);
5321 Floats[1].makeZero(
false);
5325 auto Result = Floats[0].compare(RHS.Floats[0]);
5328 return Floats[1].compare(RHS.Floats[1]);
5333 return Floats[0].bitwiseIsEqual(RHS.Floats[0]) &&
5334 Floats[1].bitwiseIsEqual(RHS.Floats[1]);
5344 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
5345 "Unexpected Semantics");
5347 Floats[0].bitcastToAPInt().getRawData()[0],
5348 Floats[1].bitcastToAPInt().getRawData()[0],
5355 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
5356 "Unexpected Semantics");
5357 APFloat Tmp(APFloatBase::semPPCDoubleDoubleLegacy);
5370 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
5371 "Unexpected Semantics");
5421 if (InLattice(HiOld, NextLo)) {
5423 Floats[1] = std::move(NextLo);
5460 if (!InLattice(NextHi, NextLo))
5464 Floats[0] = std::move(NextHi);
5465 Floats[1] = std::move(NextLo);
5473 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
5474 "Unexpected Semantics");
5516 const unsigned PositiveOverflowWidth = IsSigned ? Width - 1 : Width;
5517 if (HiExactLog2 >= 0 &&
5518 static_cast<unsigned>(HiExactLog2) == PositiveOverflowWidth) {
5528 Input, Width,
true, RM, &LoIsExact);
5541 *IsExact = RoundStatus ==
opOK;
5553 APSInt LoResult{Width, !IsSigned};
5565 *IsExact = RoundStatus ==
opOK;
5571 unsigned int Width,
bool IsSigned,
5574 convertToSignExtendedInteger(
Input, Width, IsSigned, RM, IsExact);
5578 assert(DstPartsCount <=
Input.size() &&
"Integer too big");
5586 Bits = Width - IsSigned;
5631 if (SrcMSB == UINT_MAX) {
5638 const unsigned SrcBitWidth = SrcMSB + 1;
5654 return handleOverflow(RM);
5660 bool HiAsIntIsExact;
5677 if (
Error.isNegative()) {
5685 const unsigned ErrorActiveBits =
Error.getSignificantBits() - 1;
5687 if (ErrorActiveBits > LoPrecision) {
5688 const unsigned RoundingBoundary = ErrorActiveBits - LoPrecision;
5692 if (
Error.countTrailingZeros() == RoundingBoundary - 1)
5711 Floats[0] = std::move(
Hi);
5712 Floats[1] = std::move(
Lo);
5717 return handleOverflow(RM);
5723 Largest.makeLargest(
false);
5725 return handleOverflow(RM);
5737 const bool NegateInput = IsSigned &&
Input.isNegative();
5750 unsigned int HexDigits,
5753 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
5754 "Unexpected Semantics");
5761 (Floats[0].isDenormal() || Floats[1].
isDenormal() ||
5763 Floats[0] != Floats[0] + Floats[1]);
5792 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
5793 "Unexpected Semantics");
5794 return Floats[0].isInteger() && Floats[1].isInteger();
5798 unsigned FormatPrecision,
5799 unsigned FormatMaxPadding,
5800 bool TruncateZero)
const {
5801 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
5802 "Unexpected Semantics");
5804 .
toString(Str, FormatPrecision, FormatMaxPadding, TruncateZero);
5824 if (
Lo.isZero() ||
Hi.isNegative() ==
Lo.isNegative())
5826 if (
Hi.getExactLog2Abs() == INT_MIN)
5830 return IlogbResult - 1;
5836 "Unexpected Semantics");
5838 scalbn(Arg.Floats[0], Exp, RM),
5839 scalbn(Arg.Floats[1], Exp, RM));
5845 "Unexpected Semantics");
5855 Quiet.getFirst() =
Quiet.getFirst().makeQuiet();
5877 const bool SignsDisagree =
Hi.isNegative() !=
Lo.isNegative();
5894 LoRoundingMode = RM;
5895 Second =
scalbn(
Lo, -Exp, LoRoundingMode);
5903 if (RecomposedLo !=
Lo) {
5907 const APFloat RoundingError = RecomposedLo -
Lo;
5912 const APFloat ScaledUlpOfSecond =
5914 const bool IsMidpoint =
abs(RoundingError) == ScaledUlpOfSecond;
5915 const bool RoundedLoAway =
5920 if (IsMidpoint && RoundedLoAway)
5936 if (Second.
isZero() && SignsDisagree &&
Hi.getExactLog2Abs() != INT_MIN)
5947APFloat::Storage::Storage(IEEEFloat
F,
const fltSemantics &Semantics) {
5952 if (usesLayout<DoubleAPFloat>(
Semantics)) {
5953 const fltSemantics& S =
F.getSemantics();
5967 if (APFloat::usesLayout<detail::IEEEFloat>(Arg.
getSemantics()))
5969 if (APFloat::usesLayout<detail::DoubleAPFloat>(Arg.
getSemantics()))
5977 assert(StatusOrErr &&
"Invalid floating point representation");
6029 APFloat Reciprocal =
6047 *Inv = std::move(Reciprocal);
6059 usesLayout<IEEEFloat>(ToSemantics))
6060 return U.IEEE.convert(ToSemantics, RM, losesInfo);
6062 usesLayout<DoubleAPFloat>(ToSemantics)) {
6063 assert(&ToSemantics == &APFloatBase::semPPCDoubleDouble);
6065 U.IEEE.convert(APFloatBase::semPPCDoubleDoubleLegacy, RM, losesInfo);
6066 *
this =
APFloat(ToSemantics, U.IEEE.bitcastToAPInt());
6070 usesLayout<IEEEFloat>(ToSemantics)) {
6071 auto Ret = getIEEE().convert(ToSemantics, RM, losesInfo);
6072 *
this =
APFloat(std::move(getIEEE()), ToSemantics);
6088#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
6101 bool *isExact)
const {
6105 rounding_mode, isExact);
6107 result =
APInt(bitWidth, parts);
6114 return getIEEE().convertToDouble();
6116 "Float semantics is not representable by IEEEdouble");
6117 APFloat Temp = *
this;
6126#ifdef HAS_IEE754_FLOAT128
6127float128 APFloat::convertToQuad()
const {
6129 return getIEEE().convertToQuad();
6131 "Float semantics is not representable by IEEEquad");
6138 return Temp.getIEEE().convertToQuad();
6145 return getIEEE().convertToFloat();
6147 "Float semantics is not representable by IEEEsingle");
6148 APFloat Temp = *
this;
6157APFloat::Storage::~Storage() {
6158 if (usesLayout<IEEEFloat>(*semantics)) {
6162 if (usesLayout<DoubleAPFloat>(*semantics)) {
6169APFloat::Storage::Storage(
const APFloat::Storage &
RHS) {
6170 if (usesLayout<IEEEFloat>(*
RHS.semantics)) {
6174 if (usesLayout<DoubleAPFloat>(*
RHS.semantics)) {
6181APFloat::Storage::Storage(APFloat::Storage &&
RHS) {
6182 if (usesLayout<IEEEFloat>(*
RHS.semantics)) {
6186 if (usesLayout<DoubleAPFloat>(*
RHS.semantics)) {
6193APFloat::Storage &APFloat::Storage::operator=(
const APFloat::Storage &
RHS) {
6194 if (usesLayout<IEEEFloat>(*semantics) &&
6195 usesLayout<IEEEFloat>(*
RHS.semantics)) {
6197 }
else if (usesLayout<DoubleAPFloat>(*semantics) &&
6198 usesLayout<DoubleAPFloat>(*
RHS.semantics)) {
6200 }
else if (
this != &
RHS) {
6202 new (
this) Storage(
RHS);
6207APFloat::Storage &APFloat::Storage::operator=(APFloat::Storage &&
RHS) {
6208 if (usesLayout<IEEEFloat>(*semantics) &&
6209 usesLayout<IEEEFloat>(*
RHS.semantics)) {
6211 }
else if (usesLayout<DoubleAPFloat>(*semantics) &&
6212 usesLayout<DoubleAPFloat>(*
RHS.semantics)) {
6214 }
else if (
this != &
RHS) {
6216 new (
this) Storage(std::move(
RHS));
6223#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.
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, const llvm::StringTable &StandardNames, VectorLibrary VecLib)
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
LLVM_ABI 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(char 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 auto equal_to(T &&Arg)
Functor variant of std::equal_to that can be used as a UnaryPredicate in functional algorithms like a...
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