24#include "llvm/Config/llvm-config.h"
32#define APFLOAT_DISPATCH_ON_SEMANTICS(METHOD_CALL) \
34 if (usesLayout<IEEEFloat>(getSemantics())) \
35 return U.IEEE.METHOD_CALL; \
36 if (usesLayout<DoubleAPFloat>(getSemantics())) \
37 return U.Double.METHOD_CALL; \
38 llvm_unreachable("Unexpected semantics"); \
49#define PackCategoriesIntoKey(_lhs, _rhs) ((_lhs) * 4 + (_rhs))
57constexpr fltSemantics APFloatBase::semIEEEhalf = {15, -14, 11, 16};
58constexpr fltSemantics APFloatBase::semBFloat = {127, -126, 8, 16};
59constexpr fltSemantics APFloatBase::semIEEEsingle = {127, -126, 24, 32};
60constexpr fltSemantics APFloatBase::semIEEEdouble = {1023, -1022, 53, 64};
61constexpr fltSemantics APFloatBase::semIEEEquad = {16383, -16382, 113, 128};
62constexpr fltSemantics APFloatBase::semFloat8E5M2 = {15, -14, 3, 8};
65constexpr fltSemantics APFloatBase::semFloat8E4M3 = {7, -6, 4, 8};
70constexpr fltSemantics APFloatBase::semFloat8E4M3B11FNUZ = {
72constexpr fltSemantics APFloatBase::semFloat8E3M4 = {3, -2, 5, 8};
73constexpr fltSemantics APFloatBase::semFloatTF32 = {127, -126, 11, 19};
91constexpr fltSemantics APFloatBase::semX87DoubleExtended = {16383, -16382, 64,
93constexpr fltSemantics APFloatBase::semBogus = {0, 0, 0, 0};
94constexpr fltSemantics APFloatBase::semPPCDoubleDouble = {-1, 0, 0, 128};
95constexpr fltSemantics APFloatBase::semPPCDoubleDoubleLegacy = {
96 1023, -1022 + 53, 53 + 53, 128};
192 return A.maxExponent <=
B.maxExponent &&
A.minExponent >=
B.minExponent &&
193 A.precision <=
B.precision;
267 if (Src.maxExponent >= Dst.maxExponent || Src.minExponent <= Dst.minExponent)
275 return Dst.precision >= Src.precision;
315static inline unsigned int
329 unsigned int absExponent;
330 const unsigned int overlargeExponent = 24000;
334 if (p == end || ((*p ==
'-' || *p ==
'+') && (p + 1) == end)) {
338 isNegative = (*p ==
'-');
339 if (*p ==
'-' || *p ==
'+') {
346 if (absExponent >= 10U)
347 return createError(
"Invalid character in exponent");
349 for (; p != end; ++p) {
354 return createError(
"Invalid character in exponent");
356 absExponent = absExponent * 10U + value;
357 if (absExponent >= overlargeExponent) {
358 absExponent = overlargeExponent;
364 return -(int) absExponent;
366 return (
int) absExponent;
373 int exponentAdjustment) {
374 int unsignedExponent;
375 bool negative, overflow;
381 negative = *p ==
'-';
382 if (*p ==
'-' || *p ==
'+') {
388 unsignedExponent = 0;
390 for (; p != end; ++p) {
395 return createError(
"Invalid character in exponent");
397 unsignedExponent = unsignedExponent * 10 + value;
398 if (unsignedExponent > 32767) {
404 if (exponentAdjustment > 32767 || exponentAdjustment < -32768)
408 exponent = unsignedExponent;
410 exponent = -exponent;
411 exponent += exponentAdjustment;
412 if (exponent > 32767 || exponent < -32768)
417 exponent = negative ? -32768: 32767;
427 while (p != end && *p ==
'0')
430 if (p != end && *p ==
'.') {
433 if (end - begin == 1)
436 while (p != end && *p ==
'0')
469 return PtrOrErr.takeError();
472 D->firstSigDigit = p;
474 D->normalizedExponent = 0;
476 for (; p != end; ++p) {
479 return createError(
"String contains multiple dots");
489 if (*p !=
'e' && *p !=
'E')
490 return createError(
"Invalid character in significand");
493 if (dot != end && p - begin == 1)
499 return ExpOrErr.takeError();
500 D->exponent = *ExpOrErr;
508 if (p !=
D->firstSigDigit) {
514 while (p != begin && *p ==
'0');
515 while (p != begin && *p ==
'.');
520 D->normalizedExponent = (
D->exponent +
522 - (dot >
D->firstSigDigit && dot < p)));
534 unsigned int digitValue) {
535 unsigned int hexDigit;
541 else if (digitValue < 8 && digitValue > 0)
545 while (p != end && (*p ==
'0' || *p ==
'.'))
549 return createError(
"Invalid trailing hexadecimal fraction!");
555 if (hexDigit == UINT_MAX)
565 unsigned int partCount,
594 return lost_fraction;
609 return moreSignificant;
620HUerrBound(
bool inexactMultiply,
unsigned int HUerr1,
unsigned int HUerr2)
622 assert(HUerr1 < 2 || HUerr2 < 2 || (HUerr1 + HUerr2 < 8));
624 if (HUerr1 + HUerr2 == 0)
625 return inexactMultiply * 2;
627 return inexactMultiply + 2 * (HUerr1 + HUerr2);
636 unsigned int count, partBits;
653 if (part - boundary <= boundary - part)
654 return part - boundary;
656 return boundary - part;
659 if (part == boundary) {
665 }
else if (part == boundary - 1) {
682 pow5s[0] = 78125 * 5;
684 unsigned int partsCount = 1;
692 *p1 = firstEightPowers[power & 7];
698 for (
unsigned int n = 0; power; power >>= 1, n++) {
702 partsCount, partsCount);
704 if (pow5[partsCount - 1] == 0)
712 result += partsCount;
713 if (p2[result - 1] == 0)
738static const char NaNL[] =
"nan";
739static const char NaNU[] =
"NAN";
746 const char *hexDigitChars)
748 unsigned int result =
count;
754 dst[
count] = hexDigitChars[part & 0xf];
798 switch (
X.getCategory()) {
808 if (
X.isDenormal() ||
X.isSmallestNormalized())
811 if (
X.getExactLog2() != INT_MIN)
819void IEEEFloat::initialize(
const fltSemantics *ourSemantics) {
822 semantics = ourSemantics;
828void IEEEFloat::freeSignificand() {
830 delete [] significand.parts;
833void IEEEFloat::assign(
const IEEEFloat &rhs) {
834 assert(semantics == rhs.semantics);
837 category = rhs.category;
838 exponent = rhs.exponent;
840 copySignificand(rhs);
843void IEEEFloat::copySignificand(
const IEEEFloat &rhs) {
845 assert(rhs.partCount() >= partCount());
858 if (Negative && !semantics->hasSignedRepr)
860 "This floating point format does not support signed values");
864 exponent = exponentNaN();
867 unsigned numParts = partCount();
880 fill = &fill_storage;
884 if (!
fill ||
fill->getNumWords() < numParts)
888 std::min(
fill->getNumWords(), numParts));
891 unsigned bitsToPreserve = semantics->precision - 1;
892 unsigned part = bitsToPreserve / 64;
893 bitsToPreserve %= 64;
894 significand[part] &= ((1ULL << bitsToPreserve) - 1);
895 for (part++; part != numParts; ++part)
896 significand[part] = 0;
900 (semantics->precision >= 2) ? (semantics->precision - 2) : 0;
922 if (semantics == &APFloatBase::semX87DoubleExtended)
928 if (semantics != rhs.semantics) {
930 initialize(rhs.semantics);
941 semantics = rhs.semantics;
942 significand = rhs.significand;
943 exponent = rhs.exponent;
944 category = rhs.category;
947 rhs.semantics = &APFloatBase::semBogus;
954 semantics->precision - 1) == 0);
962 significandMSB() == 0;
967 isSignificandAllZerosExceptMSB();
970unsigned int IEEEFloat::getNumHighBits()
const {
977 const unsigned int NumHighBits = (semantics->
precision > 1)
983bool IEEEFloat::isSignificandAllOnes()
const {
988 for (
unsigned i = 0; i < PartCount - 1; i++)
993 const unsigned NumHighBits = getNumHighBits();
994 assert(NumHighBits <= integerPartWidth && NumHighBits > 0 &&
995 "Can not have more high bits to fill than integerPartWidth");
998 if ((semantics->
precision <= 1) || (~(Parts[PartCount - 1] | HighBitFill)))
1004bool IEEEFloat::isSignificandAllOnesExceptLSB()
const {
1013 for (
unsigned i = 0; i < PartCount - 1; i++) {
1014 if (~Parts[i] & ~
unsigned{!i})
1019 const unsigned NumHighBits = getNumHighBits();
1020 assert(NumHighBits <= integerPartWidth && NumHighBits > 0 &&
1021 "Can not have more high bits to fill than integerPartWidth");
1024 if (~(Parts[PartCount - 1] | HighBitFill | 0x1))
1030bool IEEEFloat::isSignificandAllZeros()
const {
1036 for (
unsigned i = 0; i < PartCount - 1; i++)
1041 const unsigned NumHighBits = getNumHighBits();
1043 "clear than integerPartWidth");
1044 const integerPart HighBitMask = ~integerPart(0) >> NumHighBits;
1046 if ((semantics->precision > 1) && (Parts[PartCount - 1] & HighBitMask))
1052bool IEEEFloat::isSignificandAllZerosExceptMSB()
const {
1056 for (
unsigned i = 0; i < PartCount - 1; i++) {
1061 const unsigned NumHighBits = getNumHighBits();
1064 return ((semantics->precision <= 1) || (Parts[PartCount - 1] == MSBMask));
1068 bool IsMaxExp =
isFiniteNonZero() && exponent == semantics->maxExponent;
1075 ? isSignificandAllOnesExceptLSB()
1080 return IsMaxExp && isSignificandAllOnes();
1095 if (semantics != rhs.semantics ||
1096 category != rhs.category ||
1105 return std::equal(significandParts(), significandParts() + partCount(),
1106 rhs.significandParts());
1110 initialize(&ourSemantics);
1115 significandParts()[0] =
value;
1120 initialize(&ourSemantics);
1136 initialize(rhs.semantics);
1141 *
this = std::move(rhs);
1146unsigned int IEEEFloat::partCount()
const {
1151 return const_cast<IEEEFloat *
>(
this)->significandParts();
1155 if (partCount() > 1)
1156 return significand.parts;
1158 return &significand.part;
1161void IEEEFloat::zeroSignificand() {
1166void IEEEFloat::incrementSignificand() {
1180 parts = significandParts();
1182 assert(semantics == rhs.semantics);
1183 assert(exponent == rhs.exponent);
1185 return APInt::tcAdd(parts, rhs.significandParts(), 0, partCount());
1194 parts = significandParts();
1196 assert(semantics == rhs.semantics);
1197 assert(exponent == rhs.exponent);
1208 bool ignoreAddend) {
1210 unsigned int partsCount, newPartsCount, precision;
1217 assert(semantics == rhs.semantics);
1219 precision = semantics->precision;
1225 if (newPartsCount > 4)
1228 fullSignificand = scratch;
1230 lhsSignificand = significandParts();
1231 partsCount = partCount();
1234 rhs.significandParts(), partsCount, partsCount);
1237 omsb =
APInt::tcMSB(fullSignificand, newPartsCount) + 1;
1238 exponent += rhs.exponent;
1252 if (!ignoreAddend && addend.isNonZero()) {
1256 Significand savedSignificand = significand;
1257 const fltSemantics *savedSemantics = semantics;
1258 fltSemantics extendedSemantics;
1260 unsigned int extendedPrecision;
1263 extendedPrecision = 2 * precision + 1;
1264 if (omsb != extendedPrecision - 1) {
1265 assert(extendedPrecision > omsb);
1267 (extendedPrecision - 1) - omsb);
1268 exponent -= (extendedPrecision - 1) - omsb;
1272 extendedSemantics = *semantics;
1273 extendedSemantics.
precision = extendedPrecision;
1275 if (newPartsCount == 1)
1276 significand.part = fullSignificand[0];
1278 significand.parts = fullSignificand;
1279 semantics = &extendedSemantics;
1293 lost_fraction = extendedAddend.shiftSignificandRight(1);
1295 "Lost precision while shifting addend for fused-multiply-add.");
1297 lost_fraction = addOrSubtractSignificand(extendedAddend,
false);
1300 if (newPartsCount == 1)
1301 fullSignificand[0] = significand.part;
1302 significand = savedSignificand;
1303 semantics = savedSemantics;
1305 omsb =
APInt::tcMSB(fullSignificand, newPartsCount) + 1;
1312 exponent -= precision + 1;
1321 if (omsb > precision) {
1322 unsigned int bits, significantParts;
1325 bits = omsb - precision;
1327 lf =
shiftRight(fullSignificand, significantParts, bits);
1334 if (newPartsCount > 4)
1335 delete [] fullSignificand;
1337 return lost_fraction;
1346 return multiplySignificand(rhs,
IEEEFloat(*semantics), !semantics->hasZero);
1351 unsigned int bit, i, partsCount;
1357 assert(semantics == rhs.semantics);
1359 lhsSignificand = significandParts();
1360 rhsSignificand = rhs.significandParts();
1361 partsCount = partCount();
1368 divisor = dividend + partsCount;
1371 for (i = 0; i < partsCount; i++) {
1372 dividend[i] = lhsSignificand[i];
1373 divisor[i] = rhsSignificand[i];
1374 lhsSignificand[i] = 0;
1377 exponent -= rhs.exponent;
1379 unsigned int precision = semantics->precision;
1382 bit = precision -
APInt::tcMSB(divisor, partsCount) - 1;
1389 bit = precision -
APInt::tcMSB(dividend, partsCount) - 1;
1405 for (bit = precision; bit; bit -= 1) {
1429 return lost_fraction;
1432unsigned int IEEEFloat::significandMSB()
const {
1436unsigned int IEEEFloat::significandLSB()
const {
1441lostFraction IEEEFloat::shiftSignificandRight(
unsigned int bits) {
1447 return shiftRight(significandParts(), partCount(), bits);
1451void IEEEFloat::shiftSignificandLeft(
unsigned int bits) {
1452 assert(bits < semantics->precision ||
1453 (semantics->precision == 1 && bits <= 1));
1456 unsigned int partsCount = partCount();
1468 assert(semantics == rhs.semantics);
1472 compare = exponent - rhs.exponent;
1524 exponent = semantics->maxExponent;
1526 semantics->precision);
1539bool IEEEFloat::roundAwayFromZero(
roundingMode rounding_mode,
1541 unsigned int bit)
const {
1548 switch (rounding_mode) {
1586 omsb = significandMSB() + 1;
1593 exponentChange = omsb - semantics->precision;
1597 if (exponent + exponentChange > semantics->maxExponent)
1598 return handleOverflow(rounding_mode);
1602 if (exponent + exponentChange < semantics->minExponent)
1603 exponentChange = semantics->minExponent - exponent;
1606 if (exponentChange < 0) {
1609 shiftSignificandLeft(-exponentChange);
1614 if (exponentChange > 0) {
1618 lf = shiftSignificandRight(exponentChange);
1623 if (omsb > (
unsigned) exponentChange)
1624 omsb -= exponentChange;
1634 exponent == semantics->maxExponent && isSignificandAllOnes())
1635 return handleOverflow(rounding_mode);
1648 if (!semantics->hasZero)
1656 if (roundAwayFromZero(rounding_mode, lost_fraction, 0)) {
1658 exponent = semantics->minExponent;
1660 incrementSignificand();
1661 omsb = significandMSB() + 1;
1664 if (omsb == (
unsigned) semantics->precision + 1) {
1668 if (exponent == semantics->maxExponent)
1675 shiftSignificandRight(1);
1684 exponent == semantics->maxExponent && isSignificandAllOnes())
1685 return handleOverflow(rounding_mode);
1690 if (omsb == semantics->precision)
1694 assert(omsb < semantics->precision);
1704 if (!semantics->hasZero)
1777 subtract ^=
static_cast<bool>(sign ^ rhs.sign);
1780 bits = exponent - rhs.exponent;
1784 if ((bits < 0) && !semantics->hasSignedRepr)
1786 "This floating point format does not support signed values");
1789 bool lost_fraction_is_from_rhs =
false;
1793 else if (bits > 0) {
1794 lost_fraction = temp_rhs.shiftSignificandRight(bits - 1);
1795 lost_fraction_is_from_rhs =
true;
1796 shiftSignificandLeft(1);
1798 lost_fraction = shiftSignificandRight(-bits - 1);
1799 temp_rhs.shiftSignificandLeft(1);
1806 lost_fraction !=
lfExactlyZero && !lost_fraction_is_from_rhs;
1815 carry = temp_rhs.subtractSignificand(*
this, borrow);
1816 copySignificand(temp_rhs);
1819 bool borrow = lost_fraction !=
lfExactlyZero && lost_fraction_is_from_rhs;
1828 carry = subtractSignificand(temp_rhs, borrow);
1831 if (lost_fraction !=
lfExactlyZero && lost_fraction_is_from_rhs) {
1845 lost_fraction = temp_rhs.shiftSignificandRight(bits);
1846 carry = addSignificand(temp_rhs);
1848 lost_fraction = shiftSignificandRight(-bits);
1849 carry = addSignificand(rhs);
1857 return lost_fraction;
2052 lost_fraction = addOrSubtractSignificand(rhs,
subtract);
2053 fs = normalize(rounding_mode, lost_fraction);
2062 if (category ==
fcZero) {
2076 return addOrSubtract(rhs, rounding_mode,
false);
2082 return addOrSubtract(rhs, rounding_mode,
true);
2091 fs = multiplySpecials(rhs);
2097 fs = normalize(rounding_mode, lost_fraction);
2111 fs = divideSpecials(rhs);
2117 fs = normalize(rounding_mode, lost_fraction);
2128 unsigned int origSign = sign;
2131 fs = remainderSpecials(rhs);
2238 fs = modSpecials(rhs);
2239 unsigned int origSign = sign;
2260 if (!semantics->hasZero && this->isSmallest())
2280 sign ^= multiplicand.sign;
2289 lost_fraction = multiplySignificand(multiplicand, addend);
2290 fs = normalize(rounding_mode, lost_fraction);
2303 fs = multiplySpecials(multiplicand);
2313 fs = addOrSubtract(addend, rounding_mode,
false);
2387 MagicConstant.sign = sign;
2393 fs =
add(MagicConstant, rounding_mode);
2397 subtract(MagicConstant, rounding_mode);
2410 assert(semantics == rhs.semantics);
2442 if (sign == rhs.sign)
2457 if (sign != rhs.sign) {
2488 unsigned int newPartCount, oldPartCount;
2496 oldPartCount = partCount();
2499 bool X86SpecialNan =
false;
2500 if (&fromSemantics == &APFloatBase::semX87DoubleExtended &&
2501 &toSemantics != &APFloatBase::semX87DoubleExtended && category ==
fcNaN &&
2502 (!(*significandParts() & 0x8000000000000000ULL) ||
2503 !(*significandParts() & 0x4000000000000000ULL))) {
2506 X86SpecialNan =
true;
2517 int omsb = significandMSB() + 1;
2518 int exponentChange = omsb - fromSemantics.
precision;
2519 if (exponent + exponentChange < toSemantics.
minExponent)
2520 exponentChange = toSemantics.
minExponent - exponent;
2521 exponentChange = std::max(exponentChange, shift);
2522 if (exponentChange < 0) {
2523 shift -= exponentChange;
2524 exponent += exponentChange;
2525 }
else if (omsb <= -shift) {
2526 exponentChange = omsb + shift - 1;
2527 shift -= exponentChange;
2528 exponent += exponentChange;
2534 (category ==
fcNaN && semantics->nonFiniteBehavior !=
2539 if (newPartCount > oldPartCount) {
2547 significand.parts = newParts;
2548 }
else if (newPartCount == 1 && oldPartCount != 1) {
2552 newPart = significandParts()[0];
2554 significand.part = newPart;
2558 semantics = &toSemantics;
2567 *losesInfo = (
fs !=
opOK);
2568 }
else if (category ==
fcNaN) {
2586 if (!X86SpecialNan && semantics == &APFloatBase::semX87DoubleExtended)
2603 }
else if (category ==
fcZero &&
2616 if (category ==
fcZero && !semantics->hasZero)
2636 unsigned int dstPartsCount, truncatedBits;
2645 assert(dstPartsCount <= parts.
size() &&
"Integer too big");
2647 if (category ==
fcZero) {
2654 src = significandParts();
2663 truncatedBits = semantics->
precision -1U - exponent;
2667 unsigned int bits = exponent + 1U;
2673 if (bits < semantics->precision) {
2675 truncatedBits = semantics->
precision - bits;
2682 bits - semantics->precision);
2689 if (truncatedBits) {
2693 roundAwayFromZero(rounding_mode, lost_fraction, truncatedBits)) {
2713 if (omsb == width &&
2724 if (omsb >= width + !isSigned)
2746 unsigned int width,
bool isSigned,
2750 fs = convertToSignExtendedInteger(parts, width, isSigned, rounding_mode,
2754 unsigned int bits, dstPartsCount;
2757 assert(dstPartsCount <= parts.
size() &&
"Integer too big");
2759 if (category ==
fcNaN)
2764 bits = width - isSigned;
2767 if (sign && isSigned)
2779 unsigned int omsb, precision, dstCount;
2785 dst = significandParts();
2786 dstCount = partCount();
2791 if (precision <= omsb) {
2792 exponent = omsb - 1;
2797 exponent = precision - 1;
2802 return normalize(rounding_mode, lost_fraction);
2816 return convertFromUnsignedParts(api.
getRawData(), partCount, rounding_mode);
2820IEEEFloat::convertFromHexadecimalString(
StringRef s,
2829 unsigned partsCount = partCount();
2831 bool computedTrailingFraction =
false;
2839 return PtrOrErr.takeError();
2848 return createError(
"String contains multiple dots");
2854 if (hex_value == UINT_MAX)
2864 }
else if (!computedTrailingFraction) {
2867 return FractOrErr.takeError();
2868 lost_fraction = *FractOrErr;
2869 computedTrailingFraction =
true;
2875 return createError(
"Hex strings require an exponent");
2876 if (*p !=
'p' && *p !=
'P')
2877 return createError(
"Invalid character in significand");
2880 if (dot != end && p - begin == 1)
2884 if (p != firstSignificantDigit) {
2893 expAdjustment =
static_cast<int>(
dot - firstSignificantDigit);
2894 if (expAdjustment < 0)
2896 expAdjustment = expAdjustment * 4 - 1;
2900 expAdjustment += semantics->precision;
2906 return ExpOrErr.takeError();
2907 exponent = *ExpOrErr;
2910 return normalize(rounding_mode, lost_fraction);
2914IEEEFloat::roundSignificandWithExponent(
const integerPart *decSigParts,
2915 unsigned sigPartCount,
int exp,
2917 unsigned int parts, pow5PartCount;
2918 fltSemantics calcSemantics = { 32767, -32767, 0, 0 };
2928 pow5PartCount =
powerOf5(pow5Parts, exp >= 0 ? exp: -exp);
2930 for (;; parts *= 2) {
2932 unsigned int excessPrecision, truncatedBits;
2935 excessPrecision = calcSemantics.
precision - semantics->precision;
2936 truncatedBits = excessPrecision;
2939 decSig.makeZero(sign);
2942 sigStatus = decSig.convertFromUnsignedParts(decSigParts, sigPartCount,
2944 powStatus = pow5.convertFromUnsignedParts(pow5Parts, pow5PartCount,
2947 decSig.exponent += exp;
2951 unsigned int powHUerr;
2955 calcLostFraction = decSig.multiplySignificand(pow5);
2956 powHUerr = powStatus !=
opOK;
2958 calcLostFraction = decSig.divideSignificand(pow5);
2960 if (decSig.exponent < semantics->minExponent) {
2961 excessPrecision += (semantics->minExponent - decSig.exponent);
2962 truncatedBits = excessPrecision;
2963 excessPrecision = std::min(excessPrecision, calcSemantics.
precision);
2972 (decSig.significandParts(), calcSemantics.
precision - 1) == 1);
2977 excessPrecision, isNearest);
2980 if (HUdistance >= HUerr) {
2981 APInt::tcExtract(significandParts(), partCount(), decSig.significandParts(),
2982 calcSemantics.
precision - excessPrecision,
2987 exponent = (decSig.exponent + semantics->precision
2988 - (calcSemantics.
precision - excessPrecision));
2992 return normalize(rounding_mode, calcLostFraction);
2997Expected<APFloat::opStatus>
2998IEEEFloat::convertFromDecimalString(StringRef str,
roundingMode rounding_mode) {
3005 return std::move(Err);
3036 if (!semantics->hasZero)
3041 }
else if (
D.normalizedExponent - 1 > INT_MAX / 42039) {
3042 fs = handleOverflow(rounding_mode);
3048 }
else if (
D.normalizedExponent - 1 < INT_MIN / 42039 ||
3049 (
D.normalizedExponent + 1) * 28738 <=
3050 8651 * (semantics->minExponent - (
int) semantics->precision)) {
3057 }
else if ((
D.normalizedExponent - 1) * 42039
3058 >= 12655 * semantics->maxExponent) {
3060 fs = handleOverflow(rounding_mode);
3063 unsigned int partCount;
3069 partCount =
static_cast<unsigned int>(
D.lastSigDigit -
D.firstSigDigit) + 1;
3087 if (p == str.
end()) {
3092 if (decValue >= 10U) {
3093 delete[] decSignificand;
3094 return createError(
"Invalid character in significand");
3097 val = val * 10 + decValue;
3100 }
while (p <=
D.lastSigDigit && multiplier <= (~ (
integerPart) 0 - 9) / 10);
3104 partCount, partCount + 1,
false);
3108 if (decSignificand[partCount])
3110 }
while (p <=
D.lastSigDigit);
3113 fs = roundSignificandWithExponent(decSignificand, partCount,
3114 D.exponent, rounding_mode);
3116 delete [] decSignificand;
3122bool IEEEFloat::convertFromStringSpecials(StringRef str) {
3123 const size_t MIN_NAME_SIZE = 3;
3125 if (str.
size() < MIN_NAME_SIZE)
3128 if (str ==
"inf" || str ==
"INFINITY" || str ==
"+Inf") {
3135 if (str.
size() < MIN_NAME_SIZE)
3138 if (str ==
"inf" || str ==
"INFINITY" || str ==
"Inf") {
3147 if (str.
size() < MIN_NAME_SIZE)
3154 makeNaN(IsSignaling, IsNegative);
3159 if (str.
front() ==
'(') {
3161 if (str.
size() <= 2 || str.
back() !=
')')
3168 unsigned Radix = 10;
3169 if (str[0] ==
'0') {
3170 if (str.
size() > 1 && tolower(str[1]) ==
'x') {
3181 makeNaN(IsSignaling, IsNegative, &Payload);
3189Expected<APFloat::opStatus>
3195 if (convertFromStringSpecials(str))
3200 size_t slen = str.
size();
3201 sign = *p ==
'-' ? 1 : 0;
3202 if (sign && !semantics->hasSignedRepr)
3204 "This floating point format does not support signed values");
3206 if (*p ==
'-' || *p ==
'+') {
3213 if (slen >= 2 && p[0] ==
'0' && (p[1] ==
'x' || p[1] ==
'X')) {
3216 return convertFromHexadecimalString(
StringRef(p + 2, slen - 2),
3220 return convertFromDecimalString(
StringRef(p, slen), rounding_mode);
3264 dst +=
sizeof NaNU - 1;
3269 *dst++ = upperCase ?
'X':
'x';
3271 if (hexDigits > 1) {
3273 memset (dst,
'0', hexDigits - 1);
3274 dst += hexDigits - 1;
3276 *dst++ = upperCase ?
'P':
'p';
3281 dst = convertNormalToHexString (dst, hexDigits, upperCase, rounding_mode);
3287 return static_cast<unsigned int>(dst - p);
3294char *IEEEFloat::convertNormalToHexString(
char *dst,
unsigned int hexDigits,
3297 unsigned int count, valueBits, shift, partsCount, outputDigits;
3298 const char *hexDigitChars;
3304 *dst++ = upperCase ?
'X':
'x';
3309 significand = significandParts();
3310 partsCount = partCount();
3319 outputDigits = (valueBits - significandLSB () + 3) / 4;
3325 if (hexDigits < outputDigits) {
3331 bits = valueBits - hexDigits * 4;
3333 roundUp = roundAwayFromZero(rounding_mode, fraction, bits);
3335 outputDigits = hexDigits;
3345 while (outputDigits &&
count) {
3349 if (--
count == partsCount)
3352 part = significand[
count] << shift;
3360 curDigits = std::min(curDigits, outputDigits);
3361 dst +=
partAsHex (dst, part, curDigits, hexDigitChars);
3362 outputDigits -= curDigits;
3372 }
while (*q ==
'0');
3376 memset (dst,
'0', outputDigits);
3377 dst += outputDigits;
3390 *dst++ = upperCase ?
'P':
'p';
3406 Arg.significandParts(),
3407 Arg.significandParts() + Arg.partCount()));
3419APInt IEEEFloat::convertF80LongDoubleAPFloatToAPInt()
const {
3424 uint64_t myexponent, mysignificand;
3427 myexponent = exponent+16383;
3428 mysignificand = significandParts()[0];
3429 if (myexponent==1 && !(mysignificand & 0x8000000000000000ULL))
3431 }
else if (category==
fcZero) {
3435 myexponent = 0x7fff;
3436 mysignificand = 0x8000000000000000ULL;
3439 myexponent = 0x7fff;
3440 mysignificand = significandParts()[0];
3444 words[0] = mysignificand;
3445 words[1] = ((uint64_t)(sign & 1) << 15) |
3446 (myexponent & 0x7fffLL);
3447 return APInt(80, words);
3450APInt IEEEFloat::convertPPCDoubleDoubleLegacyAPFloatToAPInt()
const {
3452 (
const llvm::fltSemantics *)&APFloatBase::semPPCDoubleDoubleLegacy);
3465 fltSemantics extendedSemantics = *semantics;
3476 words[0] = *
u.convertDoubleAPFloatToAPInt().getRawData();
3482 if (
u.isFiniteNonZero() && losesInfo) {
3492 words[1] = *
v.convertDoubleAPFloatToAPInt().getRawData();
3497 return APInt(128, words);
3500template <const fltSemantics &S>
3501APInt IEEEFloat::convertIEEEFloatToAPInt()
const {
3503 const int bias = (semantics == &APFloatBase::semFloat8E8M0FNU)
3505 : -(S.minExponent - 1);
3506 constexpr unsigned int trailing_significand_bits = S.precision - 1;
3507 constexpr int integer_bit_part = trailing_significand_bits /
integerPartWidth;
3510 constexpr uint64_t significand_mask = integer_bit - 1;
3511 constexpr unsigned int exponent_bits =
3512 trailing_significand_bits ? (S.sizeInBits - 1 - trailing_significand_bits)
3514 static_assert(exponent_bits < 64);
3515 constexpr uint64_t exponent_mask = (uint64_t{1} << exponent_bits) - 1;
3517 uint64_t myexponent;
3522 myexponent = exponent + bias;
3523 std::copy_n(significandParts(), mysignificand.size(),
3524 mysignificand.begin());
3525 if (myexponent == 1 &&
3526 !(significandParts()[integer_bit_part] & integer_bit))
3528 }
else if (category ==
fcZero) {
3531 myexponent = ::exponentZero(S) + bias;
3532 mysignificand.fill(0);
3537 myexponent = ::exponentInf(S) + bias;
3538 mysignificand.fill(0);
3543 myexponent = ::exponentNaN(S) + bias;
3544 std::copy_n(significandParts(), mysignificand.size(),
3545 mysignificand.begin());
3547 std::array<uint64_t, (S.sizeInBits + 63) / 64> words;
3549 std::copy_n(mysignificand.begin(), mysignificand.size(), words.begin());
3550 if constexpr (significand_mask != 0 || trailing_significand_bits == 0) {
3552 words[mysignificand.size() - 1] &= significand_mask;
3554 std::fill(words_iter, words.end(), uint64_t{0});
3555 constexpr size_t last_word = words.size() - 1;
3556 uint64_t shifted_sign =
static_cast<uint64_t
>(sign & 1)
3557 << ((S.sizeInBits - 1) % 64);
3558 words[last_word] |= shifted_sign;
3559 uint64_t shifted_exponent = (myexponent & exponent_mask)
3560 << (trailing_significand_bits % 64);
3561 words[last_word] |= shifted_exponent;
3562 if constexpr (last_word == 0) {
3563 return APInt(S.sizeInBits, words[0]);
3565 return APInt(S.sizeInBits, words);
3568APInt IEEEFloat::convertQuadrupleAPFloatToAPInt()
const {
3569 assert(partCount() == 2);
3570 return convertIEEEFloatToAPInt<APFloatBase::semIEEEquad>();
3573APInt IEEEFloat::convertDoubleAPFloatToAPInt()
const {
3575 return convertIEEEFloatToAPInt<APFloatBase::semIEEEdouble>();
3578APInt IEEEFloat::convertFloatAPFloatToAPInt()
const {
3580 return convertIEEEFloatToAPInt<APFloatBase::semIEEEsingle>();
3583APInt IEEEFloat::convertBFloatAPFloatToAPInt()
const {
3584 assert(partCount() == 1);
3585 return convertIEEEFloatToAPInt<APFloatBase::semBFloat>();
3588APInt IEEEFloat::convertHalfAPFloatToAPInt()
const {
3590 return convertIEEEFloatToAPInt<APFloatBase::APFloatBase::semIEEEhalf>();
3593APInt IEEEFloat::convertFloat8E5M2APFloatToAPInt()
const {
3594 assert(partCount() == 1);
3595 return convertIEEEFloatToAPInt<APFloatBase::semFloat8E5M2>();
3598APInt IEEEFloat::convertFloat8E5M2FNUZAPFloatToAPInt()
const {
3599 assert(partCount() == 1);
3600 return convertIEEEFloatToAPInt<APFloatBase::semFloat8E5M2FNUZ>();
3603APInt IEEEFloat::convertFloat8E4M3APFloatToAPInt()
const {
3604 assert(partCount() == 1);
3605 return convertIEEEFloatToAPInt<APFloatBase::semFloat8E4M3>();
3608APInt IEEEFloat::convertFloat8E4M3FNAPFloatToAPInt()
const {
3609 assert(partCount() == 1);
3610 return convertIEEEFloatToAPInt<APFloatBase::semFloat8E4M3FN>();
3613APInt IEEEFloat::convertFloat8E4M3FNUZAPFloatToAPInt()
const {
3614 assert(partCount() == 1);
3615 return convertIEEEFloatToAPInt<APFloatBase::semFloat8E4M3FNUZ>();
3618APInt IEEEFloat::convertFloat8E4M3B11FNUZAPFloatToAPInt()
const {
3619 assert(partCount() == 1);
3620 return convertIEEEFloatToAPInt<APFloatBase::semFloat8E4M3B11FNUZ>();
3623APInt IEEEFloat::convertFloat8E3M4APFloatToAPInt()
const {
3624 assert(partCount() == 1);
3625 return convertIEEEFloatToAPInt<APFloatBase::semFloat8E3M4>();
3628APInt IEEEFloat::convertFloatTF32APFloatToAPInt()
const {
3629 assert(partCount() == 1);
3630 return convertIEEEFloatToAPInt<APFloatBase::semFloatTF32>();
3633APInt IEEEFloat::convertFloat8E8M0FNUAPFloatToAPInt()
const {
3634 assert(partCount() == 1);
3635 return convertIEEEFloatToAPInt<APFloatBase::semFloat8E8M0FNU>();
3638APInt IEEEFloat::convertFloat6E3M2FNAPFloatToAPInt()
const {
3639 assert(partCount() == 1);
3640 return convertIEEEFloatToAPInt<APFloatBase::semFloat6E3M2FN>();
3643APInt IEEEFloat::convertFloat6E2M3FNAPFloatToAPInt()
const {
3644 assert(partCount() == 1);
3645 return convertIEEEFloatToAPInt<APFloatBase::semFloat6E2M3FN>();
3648APInt IEEEFloat::convertFloat4E2M1FNAPFloatToAPInt()
const {
3649 assert(partCount() == 1);
3650 return convertIEEEFloatToAPInt<APFloatBase::semFloat4E2M1FN>();
3659 return convertHalfAPFloatToAPInt();
3662 return convertBFloatAPFloatToAPInt();
3665 return convertFloatAPFloatToAPInt();
3668 return convertDoubleAPFloatToAPInt();
3671 return convertQuadrupleAPFloatToAPInt();
3675 return convertPPCDoubleDoubleLegacyAPFloatToAPInt();
3678 return convertFloat8E5M2APFloatToAPInt();
3681 return convertFloat8E5M2FNUZAPFloatToAPInt();
3684 return convertFloat8E4M3APFloatToAPInt();
3687 return convertFloat8E4M3FNAPFloatToAPInt();
3690 return convertFloat8E4M3FNUZAPFloatToAPInt();
3694 return convertFloat8E4M3B11FNUZAPFloatToAPInt();
3697 return convertFloat8E3M4APFloatToAPInt();
3700 return convertFloatTF32APFloatToAPInt();
3703 return convertFloat8E8M0FNUAPFloatToAPInt();
3706 return convertFloat6E3M2FNAPFloatToAPInt();
3709 return convertFloat6E2M3FNAPFloatToAPInt();
3712 return convertFloat4E2M1FNAPFloatToAPInt();
3717 return convertF80LongDoubleAPFloatToAPInt();
3722 "Float semantics are not IEEEsingle");
3729 "Float semantics are not IEEEdouble");
3734#ifdef HAS_IEE754_FLOAT128
3735float128 IEEEFloat::convertToQuad()
const {
3737 "Float semantics are not IEEEquads");
3739 return api.bitsToQuad();
3750void IEEEFloat::initFromF80LongDoubleAPInt(
const APInt &api) {
3753 uint64_t myexponent = (i2 & 0x7fff);
3755 uint8_t myintegerbit = mysignificand >> 63;
3757 initialize(&APFloatBase::semX87DoubleExtended);
3760 sign =
static_cast<unsigned int>(i2>>15);
3761 if (myexponent == 0 && mysignificand == 0) {
3763 }
else if (myexponent==0x7fff && mysignificand==0x8000000000000000ULL) {
3765 }
else if ((myexponent == 0x7fff && mysignificand != 0x8000000000000000ULL) ||
3766 (myexponent != 0x7fff && myexponent != 0 && myintegerbit == 0)) {
3768 exponent = exponentNaN();
3769 significandParts()[0] = mysignificand;
3770 significandParts()[1] = 0;
3773 exponent = myexponent - 16383;
3774 significandParts()[0] = mysignificand;
3775 significandParts()[1] = 0;
3781void IEEEFloat::initFromPPCDoubleDoubleLegacyAPInt(
const APInt &api) {
3788 initFromDoubleAPInt(APInt(64, i1));
3796 IEEEFloat v(APFloatBase::semIEEEdouble, APInt(64, i2));
3811void IEEEFloat::initFromFloat8E8M0FNUAPInt(
const APInt &api) {
3812 const uint64_t exponent_mask = 0xff;
3814 uint64_t myexponent = (val & exponent_mask);
3816 initialize(&APFloatBase::semFloat8E8M0FNU);
3817 assert(partCount() == 1);
3825 uint64_t mysignificand = 1;
3826 significandParts()[0] = mysignificand;
3830 if (val == exponent_mask) {
3832 exponent = exponentNaN();
3837 exponent = myexponent - 127;
3839template <const fltSemantics &S>
3840void IEEEFloat::initFromIEEEAPInt(
const APInt &api) {
3844 constexpr uint64_t significand_mask = integer_bit - 1;
3845 constexpr unsigned int trailing_significand_bits = S.precision - 1;
3846 constexpr unsigned int stored_significand_parts =
3848 constexpr unsigned int exponent_bits =
3849 S.sizeInBits - 1 - trailing_significand_bits;
3850 static_assert(exponent_bits < 64);
3851 constexpr uint64_t exponent_mask = (uint64_t{1} << exponent_bits) - 1;
3852 constexpr int bias = -(S.minExponent - 1);
3856 std::array<integerPart, stored_significand_parts> mysignificand;
3857 std::copy_n(api.
getRawData(), mysignificand.size(), mysignificand.begin());
3858 if constexpr (significand_mask != 0) {
3859 mysignificand[mysignificand.size() - 1] &= significand_mask;
3865 uint64_t myexponent =
3866 (last_word >> (trailing_significand_bits % 64)) & exponent_mask;
3869 assert(partCount() == mysignificand.size());
3871 sign =
static_cast<unsigned int>(last_word >> ((S.sizeInBits - 1) % 64));
3875 bool is_zero = myexponent == 0 && all_zero_significand;
3878 if (myexponent - bias == ::exponentInf(S) && all_zero_significand) {
3884 bool is_nan =
false;
3887 is_nan = myexponent - bias == ::exponentNaN(S) && !all_zero_significand;
3889 bool all_ones_significand =
3890 std::all_of(mysignificand.begin(), mysignificand.end() - 1,
3891 [](
integerPart bits) { return bits == ~integerPart{0}; }) &&
3892 (!significand_mask ||
3893 mysignificand[mysignificand.size() - 1] == significand_mask);
3894 is_nan = myexponent - bias == ::exponentNaN(S) && all_ones_significand;
3896 is_nan = is_zero && sign;
3902 std::copy_n(mysignificand.begin(), mysignificand.size(),
3903 significandParts());
3913 exponent = myexponent - bias;
3914 std::copy_n(mysignificand.begin(), mysignificand.size(), significandParts());
3915 if (myexponent == 0)
3916 exponent = S.minExponent;
3918 significandParts()[mysignificand.size()-1] |= integer_bit;
3921void IEEEFloat::initFromQuadrupleAPInt(
const APInt &api) {
3922 initFromIEEEAPInt<APFloatBase::semIEEEquad>(api);
3925void IEEEFloat::initFromDoubleAPInt(
const APInt &api) {
3926 initFromIEEEAPInt<APFloatBase::semIEEEdouble>(api);
3929void IEEEFloat::initFromFloatAPInt(
const APInt &api) {
3930 initFromIEEEAPInt<APFloatBase::semIEEEsingle>(api);
3933void IEEEFloat::initFromBFloatAPInt(
const APInt &api) {
3934 initFromIEEEAPInt<APFloatBase::semBFloat>(api);
3937void IEEEFloat::initFromHalfAPInt(
const APInt &api) {
3938 initFromIEEEAPInt<APFloatBase::semIEEEhalf>(api);
3941void IEEEFloat::initFromFloat8E5M2APInt(
const APInt &api) {
3942 initFromIEEEAPInt<APFloatBase::semFloat8E5M2>(api);
3945void IEEEFloat::initFromFloat8E5M2FNUZAPInt(
const APInt &api) {
3946 initFromIEEEAPInt<APFloatBase::semFloat8E5M2FNUZ>(api);
3949void IEEEFloat::initFromFloat8E4M3APInt(
const APInt &api) {
3950 initFromIEEEAPInt<APFloatBase::semFloat8E4M3>(api);
3953void IEEEFloat::initFromFloat8E4M3FNAPInt(
const APInt &api) {
3954 initFromIEEEAPInt<APFloatBase::semFloat8E4M3FN>(api);
3957void IEEEFloat::initFromFloat8E4M3FNUZAPInt(
const APInt &api) {
3958 initFromIEEEAPInt<APFloatBase::semFloat8E4M3FNUZ>(api);
3961void IEEEFloat::initFromFloat8E4M3B11FNUZAPInt(
const APInt &api) {
3962 initFromIEEEAPInt<APFloatBase::semFloat8E4M3B11FNUZ>(api);
3965void IEEEFloat::initFromFloat8E3M4APInt(
const APInt &api) {
3966 initFromIEEEAPInt<APFloatBase::semFloat8E3M4>(api);
3969void IEEEFloat::initFromFloatTF32APInt(
const APInt &api) {
3970 initFromIEEEAPInt<APFloatBase::semFloatTF32>(api);
3973void IEEEFloat::initFromFloat6E3M2FNAPInt(
const APInt &api) {
3974 initFromIEEEAPInt<APFloatBase::semFloat6E3M2FN>(api);
3977void IEEEFloat::initFromFloat6E2M3FNAPInt(
const APInt &api) {
3978 initFromIEEEAPInt<APFloatBase::semFloat6E2M3FN>(api);
3981void IEEEFloat::initFromFloat4E2M1FNAPInt(
const APInt &api) {
3982 initFromIEEEAPInt<APFloatBase::semFloat4E2M1FN>(api);
3988 if (Sem == &APFloatBase::semIEEEhalf)
3989 return initFromHalfAPInt(api);
3990 if (Sem == &APFloatBase::semBFloat)
3991 return initFromBFloatAPInt(api);
3992 if (Sem == &APFloatBase::semIEEEsingle)
3993 return initFromFloatAPInt(api);
3994 if (Sem == &APFloatBase::semIEEEdouble)
3995 return initFromDoubleAPInt(api);
3996 if (Sem == &APFloatBase::semX87DoubleExtended)
3997 return initFromF80LongDoubleAPInt(api);
3998 if (Sem == &APFloatBase::semIEEEquad)
3999 return initFromQuadrupleAPInt(api);
4000 if (Sem == &APFloatBase::semPPCDoubleDoubleLegacy)
4001 return initFromPPCDoubleDoubleLegacyAPInt(api);
4002 if (Sem == &APFloatBase::semFloat8E5M2)
4003 return initFromFloat8E5M2APInt(api);
4004 if (Sem == &APFloatBase::semFloat8E5M2FNUZ)
4005 return initFromFloat8E5M2FNUZAPInt(api);
4006 if (Sem == &APFloatBase::semFloat8E4M3)
4007 return initFromFloat8E4M3APInt(api);
4008 if (Sem == &APFloatBase::semFloat8E4M3FN)
4009 return initFromFloat8E4M3FNAPInt(api);
4010 if (Sem == &APFloatBase::semFloat8E4M3FNUZ)
4011 return initFromFloat8E4M3FNUZAPInt(api);
4012 if (Sem == &APFloatBase::semFloat8E4M3B11FNUZ)
4013 return initFromFloat8E4M3B11FNUZAPInt(api);
4014 if (Sem == &APFloatBase::semFloat8E3M4)
4015 return initFromFloat8E3M4APInt(api);
4016 if (Sem == &APFloatBase::semFloatTF32)
4017 return initFromFloatTF32APInt(api);
4018 if (Sem == &APFloatBase::semFloat8E8M0FNU)
4019 return initFromFloat8E8M0FNUAPInt(api);
4020 if (Sem == &APFloatBase::semFloat6E3M2FN)
4021 return initFromFloat6E3M2FNAPInt(api);
4022 if (Sem == &APFloatBase::semFloat6E2M3FN)
4023 return initFromFloat6E2M3FNAPInt(api);
4024 if (Sem == &APFloatBase::semFloat4E2M1FN)
4025 return initFromFloat4E2M1FNAPInt(api);
4033 if (Negative && !semantics->hasSignedRepr)
4035 "This floating point format does not support signed values");
4042 exponent = semantics->maxExponent;
4046 unsigned PartCount = partCount();
4047 memset(significand, 0xFF,
sizeof(
integerPart)*(PartCount - 1));
4051 const unsigned NumUnusedHighBits =
4058 (semantics->precision > 1))
4065 if (Negative && !semantics->hasSignedRepr)
4067 "This floating point format does not support signed values");
4074 exponent = semantics->minExponent;
4079 if (Negative && !semantics->hasSignedRepr)
4081 "This floating point format does not support signed values");
4090 exponent = semantics->minExponent;
4095 initFromAPInt(&Sem, API);
4108 Buffer.
append(Str.begin(), Str.end());
4113 void AdjustToPrecision(
APInt &significand,
4114 int &exp,
unsigned FormatPrecision) {
4118 unsigned bitsRequired = (FormatPrecision * 196 + 58) / 59;
4120 if (bits <= bitsRequired)
return;
4122 unsigned tensRemovable = (bits - bitsRequired) * 59 / 196;
4123 if (!tensRemovable)
return;
4125 exp += tensRemovable;
4130 if (tensRemovable & 1)
4132 tensRemovable >>= 1;
4133 if (!tensRemovable)
break;
4137 significand = significand.
udiv(divisor);
4145 int &exp,
unsigned FormatPrecision) {
4146 unsigned N = buffer.
size();
4147 if (
N <= FormatPrecision)
return;
4150 unsigned FirstSignificant =
N - FormatPrecision;
4157 if (buffer[FirstSignificant - 1] <
'5') {
4158 while (FirstSignificant <
N && buffer[FirstSignificant] ==
'0')
4161 exp += FirstSignificant;
4162 buffer.
erase(&buffer[0], &buffer[FirstSignificant]);
4168 for (
unsigned I = FirstSignificant;
I !=
N; ++
I) {
4169 if (buffer[
I] ==
'9') {
4178 if (FirstSignificant ==
N) {
4179 exp += FirstSignificant;
4185 exp += FirstSignificant;
4186 buffer.
erase(&buffer[0], &buffer[FirstSignificant]);
4190 APInt significand,
unsigned FormatPrecision,
4191 unsigned FormatMaxPadding,
bool TruncateZero) {
4192 const int semanticsPrecision = significand.
getBitWidth();
4199 if (!FormatPrecision) {
4207 FormatPrecision = 2 + semanticsPrecision * 59 / 196;
4212 exp += trailingZeros;
4218 }
else if (exp > 0) {
4220 significand = significand.
zext(semanticsPrecision + exp);
4221 significand <<= exp;
4235 unsigned precision = semanticsPrecision + (137 * texp + 136) / 59;
4239 significand = significand.
zext(precision);
4240 APInt five_to_the_i(precision, 5);
4243 significand *= five_to_the_i;
4248 five_to_the_i *= five_to_the_i;
4252 AdjustToPrecision(significand, exp, FormatPrecision);
4257 unsigned precision = significand.getBitWidth();
4258 if (precision < 4) {
4261 significand = significand.zext(precision);
4263 APInt ten(precision, 10);
4264 APInt digit(precision, 0);
4266 bool inTrail =
true;
4267 while (significand != 0) {
4272 unsigned d = digit.getZExtValue();
4283 assert(!buffer.
empty() &&
"no characters in buffer!");
4287 AdjustToPrecision(buffer, exp, FormatPrecision);
4289 unsigned NDigits = buffer.
size();
4292 bool FormatScientific;
4293 if (!FormatMaxPadding)
4294 FormatScientific =
true;
4300 FormatScientific = ((unsigned) exp > FormatMaxPadding ||
4301 NDigits + (unsigned) exp > FormatPrecision);
4304 int MSD = exp + (int) (NDigits - 1);
4307 FormatScientific =
false;
4311 FormatScientific = ((unsigned) -MSD) > FormatMaxPadding;
4317 if (FormatScientific) {
4318 exp += (NDigits - 1);
4320 Str.push_back(buffer[NDigits-1]);
4322 if (NDigits == 1 && TruncateZero)
4325 for (
unsigned I = 1;
I != NDigits; ++
I)
4326 Str.push_back(buffer[NDigits-1-
I]);
4328 if (!TruncateZero && FormatPrecision > NDigits - 1)
4329 Str.append(FormatPrecision - NDigits + 1,
'0');
4331 Str.push_back(TruncateZero ?
'E' :
'e');
4333 Str.push_back(exp >= 0 ?
'+' :
'-');
4338 expbuf.
push_back((
char) (
'0' + (exp % 10)));
4342 if (!TruncateZero && expbuf.
size() < 2)
4344 for (
unsigned I = 0,
E = expbuf.
size();
I !=
E; ++
I)
4345 Str.push_back(expbuf[
E-1-
I]);
4351 for (
unsigned I = 0;
I != NDigits; ++
I)
4352 Str.push_back(buffer[NDigits-1-
I]);
4353 for (
unsigned I = 0;
I != (unsigned) exp; ++
I)
4361 int NWholeDigits = exp + (int) NDigits;
4364 if (NWholeDigits > 0) {
4365 for (;
I != (unsigned) NWholeDigits; ++
I)
4366 Str.push_back(buffer[NDigits-
I-1]);
4369 unsigned NZeros = 1 + (unsigned) -NWholeDigits;
4373 for (
unsigned Z = 1;
Z != NZeros; ++
Z)
4377 for (;
I != NDigits; ++
I)
4378 Str.push_back(buffer[NDigits-
I-1]);
4384 unsigned FormatMaxPadding,
bool TruncateZero)
const {
4388 return append(Str,
"-Inf");
4390 return append(Str,
"+Inf");
4392 case fcNaN:
return append(Str,
"NaN");
4398 if (!FormatMaxPadding) {
4400 append(Str,
"0.0E+0");
4403 if (FormatPrecision > 1)
4404 Str.append(FormatPrecision - 1,
'0');
4405 append(Str,
"e+00");
4417 int exp = exponent - ((int) semantics->precision - 1);
4419 semantics->precision,
4422 toStringImpl(Str,
isNegative(), exp, significand, FormatPrecision,
4423 FormatMaxPadding, TruncateZero);
4435 for (
int i = 0; i < PartCount; ++i) {
4441 if (exponent != semantics->minExponent)
4444 int CountrParts = 0;
4445 for (
int i = 0; i < PartCount;
4447 if (Parts[i] != 0) {
4448 return exponent - semantics->precision + CountrParts +
4511 if (!semantics->hasZero)
4521 }
else if (semantics->nonFiniteBehavior ==
4529 exponent = semantics->maxExponent + 1;
4543 bool WillCrossBinadeBoundary =
4544 exponent != semantics->minExponent && isSignificandAllZeros();
4562 if (WillCrossBinadeBoundary) {
4583 if (WillCrossBinadeBoundary) {
4587 assert(exponent != semantics->maxExponent &&
4588 "We can not increment an exponent beyond the maxExponent allowed"
4589 " by the given floating point semantics.");
4592 incrementSignificand();
4606 return ::exponentNaN(*semantics);
4610 return ::exponentInf(*semantics);
4614 return ::exponentZero(*semantics);
4633 if (!semantics->hasZero)
4660 return Arg.exponent;
4665 Normalized.exponent += SignificandBits;
4667 return Normalized.exponent - SignificandBits;
4671 auto MaxExp =
X.getSemantics().maxExponent;
4672 auto MinExp =
X.getSemantics().minExponent;
4680 int SignificandBits =
X.getSemantics().precision - 1;
4681 int MaxIncrement = MaxExp - (MinExp - SignificandBits) + 1;
4684 X.exponent += std::clamp(Exp, -MaxIncrement - 1, MaxIncrement);
4707 return scalbn(Val, -Exp, RM);
4713 APFloat(APFloatBase::semIEEEdouble)}) {
4714 assert(Semantics == &APFloatBase::semPPCDoubleDouble);
4718 : Semantics(&S), Floats(new
APFloat[2]{
4721 assert(Semantics == &APFloatBase::semPPCDoubleDouble);
4727 APFloat(APFloatBase::semIEEEdouble)}) {
4728 assert(Semantics == &APFloatBase::semPPCDoubleDouble);
4734 APFloat(APFloatBase::semIEEEdouble,
APInt(64,
I.getRawData()[0])),
4735 APFloat(APFloatBase::semIEEEdouble,
APInt(64,
I.getRawData()[1]))}) {
4736 assert(Semantics == &APFloatBase::semPPCDoubleDouble);
4742 Floats(new
APFloat[2]{std::move(
First), std::move(Second)}) {
4743 assert(Semantics == &APFloatBase::semPPCDoubleDouble);
4744 assert(&Floats[0].getSemantics() == &APFloatBase::semIEEEdouble);
4745 assert(&Floats[1].getSemantics() == &APFloatBase::semIEEEdouble);
4749 : Semantics(RHS.Semantics),
4753 assert(Semantics == &APFloatBase::semPPCDoubleDouble);
4757 : Semantics(RHS.Semantics), Floats(RHS.Floats) {
4758 RHS.Semantics = &APFloatBase::semBogus;
4759 RHS.Floats =
nullptr;
4760 assert(Semantics == &APFloatBase::semPPCDoubleDouble);
4764 if (Semantics == RHS.Semantics && RHS.Floats) {
4765 Floats[0] = RHS.Floats[0];
4766 Floats[1] = RHS.Floats[1];
4767 }
else if (
this != &RHS) {
4800 Floats[0] = std::move(z);
4801 Floats[1].makeZero(
false);
4814 Status |= z.
add(a, RM);
4815 Status |= z.
add(c, RM);
4818 Floats[0] = std::move(z);
4819 Floats[1].makeZero(
false);
4824 Status |= zz.
add(cc, RM);
4828 Status |= Floats[1].subtract(z, RM);
4829 Status |= Floats[1].add(c, RM);
4830 Status |= Floats[1].add(zz, RM);
4834 Status |= Floats[1].subtract(z, RM);
4835 Status |= Floats[1].add(a, RM);
4836 Status |= Floats[1].add(zz, RM);
4841 Status |=
q.subtract(z, RM);
4846 Status |= zz.
add(c, RM);
4847 Status |=
q.add(z, RM);
4848 Status |=
q.subtract(a, RM);
4850 Status |= zz.
add(q, RM);
4851 Status |= zz.
add(
aa, RM);
4852 Status |= zz.
add(cc, RM);
4854 Floats[0] = std::move(z);
4855 Floats[1].makeZero(
false);
4859 Status |= Floats[0].add(zz, RM);
4861 Floats[1].makeZero(
false);
4864 Floats[1] = std::move(z);
4865 Status |= Floats[1].subtract(Floats[0], RM);
4866 Status |= Floats[1].add(zz, RM);
4892 LHS.isNegative() !=
RHS.isNegative()) {
4893 Out.makeNaN(
false, Out.isNegative(),
nullptr);
4908 assert(&
A.getSemantics() == &APFloatBase::semIEEEdouble);
4909 assert(&AA.getSemantics() == &APFloatBase::semIEEEdouble);
4910 assert(&
C.getSemantics() == &APFloatBase::semIEEEdouble);
4911 assert(&CC.getSemantics() == &APFloatBase::semIEEEdouble);
4912 assert(&Out.Floats[0].getSemantics() == &APFloatBase::semIEEEdouble);
4913 assert(&Out.Floats[1].getSemantics() == &APFloatBase::semIEEEdouble);
4914 return Out.addImpl(
A, AA,
C, CC, RM);
4919 return addWithSpecial(*
this, RHS, *
this, RM);
4925 auto Ret =
add(RHS, RM);
4932 const auto &LHS = *
this;
4949 if (LHS.getCategory() ==
fcNaN) {
4953 if (RHS.getCategory() ==
fcNaN) {
4959 Out.makeNaN(
false,
false,
nullptr);
4971 "Special cases not handled exhaustively");
4974 APFloat A = Floats[0],
B = Floats[1],
C = RHS.Floats[0],
D = RHS.Floats[1];
4978 if (!
T.isFiniteNonZero()) {
4979 Floats[0] = std::move(
T);
4980 Floats[1].makeZero(
false);
5002 Status |= U.add(Tau, RM);
5005 if (!U.isFinite()) {
5006 Floats[1].makeZero(
false);
5011 Floats[1] = std::move(
T);
5018 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
5019 "Unexpected Semantics");
5022 APFloat(APFloatBase::semPPCDoubleDoubleLegacy, RHS.bitcastToAPInt()), RM);
5028 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
5029 "Unexpected Semantics");
5032 APFloat(APFloatBase::semPPCDoubleDoubleLegacy, RHS.bitcastToAPInt()));
5038 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
5039 "Unexpected Semantics");
5042 APFloat(APFloatBase::semPPCDoubleDoubleLegacy, RHS.bitcastToAPInt()));
5051 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
5052 "Unexpected Semantics");
5055 APFloat(APFloatBase::semPPCDoubleDoubleLegacy,
5064 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
5065 "Unexpected Semantics");
5075 if (!
Hi.isFiniteNonZero() ||
Lo.isZero()) {
5076 Floats[0] = std::move(RoundedHi);
5077 Floats[1].makeZero(
false);
5089 const APFloat RoundingError = Rounded - ToRound;
5090 if (TieBreaker.isNonZero() &&
5091 TieBreaker.isNegative() != RoundingError.
isNegative() &&
5092 abs(RoundingError).isExactlyValue(0.5))
5101 if (RoundedHi !=
Hi) {
5106 RoundedHi = RoundToNearestHelper(
Hi, RoundedHi,
Lo);
5108 Floats[0] = std::move(RoundedHi);
5109 Floats[1].makeZero(
false);
5122 LoRoundingMode = RM;
5130 RoundedLo = RoundToNearestHelper(
Lo, RoundedLo,
Hi);
5133 std::tie(RoundedHi, RoundedLo) =
fastTwoSum(RoundedHi, RoundedLo);
5135 Floats[0] = std::move(RoundedHi);
5136 Floats[1] = std::move(RoundedLo);
5141 Floats[0].changeSign();
5142 Floats[1].changeSign();
5148 const cmpResult HiPartCmp = Floats[0].compareAbsoluteValue(RHS.Floats[0]);
5153 if (Floats[1].
isZero() && RHS.Floats[1].isZero())
5159 const bool ThisIsSubtractive =
5160 Floats[0].isNegative() != Floats[1].isNegative();
5161 const bool RHSIsSubtractive =
5162 RHS.Floats[0].isNegative() != RHS.Floats[1].isNegative();
5172 if (RHS.Floats[1].isZero())
5179 if (ThisIsSubtractive != RHSIsSubtractive)
5184 const cmpResult LoPartCmp = Floats[1].compareAbsoluteValue(RHS.Floats[1]);
5186 if (ThisIsSubtractive) {
5200 return Floats[0].getCategory();
5206 Floats[0].makeInf(Neg);
5207 Floats[1].makeZero(
false);
5211 Floats[0].makeZero(Neg);
5212 Floats[1].makeZero(
false);
5216 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
5217 "Unexpected Semantics");
5219 APFloat(APFloatBase::semIEEEdouble,
APInt(64, 0x7fefffffffffffffull));
5221 APFloat(APFloatBase::semIEEEdouble,
APInt(64, 0x7c8ffffffffffffeull));
5227 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
5228 "Unexpected Semantics");
5229 Floats[0].makeSmallest(Neg);
5230 Floats[1].makeZero(
false);
5234 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
5235 "Unexpected Semantics");
5237 APFloat(APFloatBase::semIEEEdouble,
APInt(64, 0x0360000000000000ull));
5239 Floats[0].changeSign();
5240 Floats[1].makeZero(
false);
5244 Floats[0].makeNaN(SNaN, Neg,
fill);
5245 Floats[1].makeZero(
false);
5249 auto Result = Floats[0].compare(RHS.Floats[0]);
5252 return Floats[1].compare(RHS.Floats[1]);
5257 return Floats[0].bitwiseIsEqual(RHS.Floats[0]) &&
5258 Floats[1].bitwiseIsEqual(RHS.Floats[1]);
5268 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
5269 "Unexpected Semantics");
5271 Floats[0].bitcastToAPInt().getRawData()[0],
5272 Floats[1].bitcastToAPInt().getRawData()[0],
5279 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
5280 "Unexpected Semantics");
5281 APFloat Tmp(APFloatBase::semPPCDoubleDoubleLegacy);
5294 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
5295 "Unexpected Semantics");
5345 if (InLattice(HiOld, NextLo)) {
5347 Floats[1] = std::move(NextLo);
5384 if (!InLattice(NextHi, NextLo))
5388 Floats[0] = std::move(NextHi);
5389 Floats[1] = std::move(NextLo);
5397 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
5398 "Unexpected Semantics");
5440 const unsigned PositiveOverflowWidth = IsSigned ? Width - 1 : Width;
5441 if (HiExactLog2 >= 0 &&
5442 static_cast<unsigned>(HiExactLog2) == PositiveOverflowWidth) {
5452 Input, Width,
true, RM, &LoIsExact);
5465 *IsExact = RoundStatus ==
opOK;
5477 APSInt LoResult{Width, !IsSigned};
5489 *IsExact = RoundStatus ==
opOK;
5495 unsigned int Width,
bool IsSigned,
5498 convertToSignExtendedInteger(
Input, Width, IsSigned, RM, IsExact);
5502 assert(DstPartsCount <=
Input.size() &&
"Integer too big");
5510 Bits = Width - IsSigned;
5555 if (SrcMSB == UINT_MAX) {
5562 const unsigned SrcBitWidth = SrcMSB + 1;
5578 return handleOverflow(RM);
5584 bool HiAsIntIsExact;
5601 if (
Error.isNegative()) {
5609 const unsigned ErrorActiveBits =
Error.getSignificantBits() - 1;
5611 if (ErrorActiveBits > LoPrecision) {
5612 const unsigned RoundingBoundary = ErrorActiveBits - LoPrecision;
5616 if (
Error.countTrailingZeros() == RoundingBoundary - 1)
5635 Floats[0] = std::move(
Hi);
5636 Floats[1] = std::move(
Lo);
5641 return handleOverflow(RM);
5647 Largest.makeLargest(
false);
5649 return handleOverflow(RM);
5661 const bool NegateInput = IsSigned &&
Input.isNegative();
5674 unsigned int HexDigits,
5677 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
5678 "Unexpected Semantics");
5685 (Floats[0].isDenormal() || Floats[1].
isDenormal() ||
5687 Floats[0] != Floats[0] + Floats[1]);
5716 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
5717 "Unexpected Semantics");
5718 return Floats[0].isInteger() && Floats[1].isInteger();
5722 unsigned FormatPrecision,
5723 unsigned FormatMaxPadding,
5724 bool TruncateZero)
const {
5725 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
5726 "Unexpected Semantics");
5728 .
toString(Str, FormatPrecision, FormatMaxPadding, TruncateZero);
5748 if (
Lo.isZero() ||
Hi.isNegative() ==
Lo.isNegative())
5750 if (
Hi.getExactLog2Abs() == INT_MIN)
5754 return IlogbResult - 1;
5760 "Unexpected Semantics");
5762 scalbn(Arg.Floats[0], Exp, RM),
5763 scalbn(Arg.Floats[1], Exp, RM));
5769 "Unexpected Semantics");
5779 Quiet.getFirst() =
Quiet.getFirst().makeQuiet();
5801 const bool SignsDisagree =
Hi.isNegative() !=
Lo.isNegative();
5818 LoRoundingMode = RM;
5819 Second =
scalbn(
Lo, -Exp, LoRoundingMode);
5827 if (RecomposedLo !=
Lo) {
5831 const APFloat RoundingError = RecomposedLo -
Lo;
5836 const APFloat ScaledUlpOfSecond =
5838 const bool IsMidpoint =
abs(RoundingError) == ScaledUlpOfSecond;
5839 const bool RoundedLoAway =
5844 if (IsMidpoint && RoundedLoAway)
5860 if (Second.
isZero() && SignsDisagree &&
Hi.getExactLog2Abs() != INT_MIN)
5871APFloat::Storage::Storage(IEEEFloat
F,
const fltSemantics &Semantics) {
5876 if (usesLayout<DoubleAPFloat>(
Semantics)) {
5877 const fltSemantics& S =
F.getSemantics();
5891 if (APFloat::usesLayout<detail::IEEEFloat>(Arg.
getSemantics()))
5893 if (APFloat::usesLayout<detail::DoubleAPFloat>(Arg.
getSemantics()))
5901 assert(StatusOrErr &&
"Invalid floating point representation");
5953 APFloat Reciprocal =
5971 *Inv = std::move(Reciprocal);
5983 usesLayout<IEEEFloat>(ToSemantics))
5984 return U.IEEE.convert(ToSemantics, RM, losesInfo);
5986 usesLayout<DoubleAPFloat>(ToSemantics)) {
5987 assert(&ToSemantics == &APFloatBase::semPPCDoubleDouble);
5989 U.IEEE.convert(APFloatBase::semPPCDoubleDoubleLegacy, RM, losesInfo);
5990 *
this =
APFloat(ToSemantics, U.IEEE.bitcastToAPInt());
5994 usesLayout<IEEEFloat>(ToSemantics)) {
5995 auto Ret = getIEEE().convert(ToSemantics, RM, losesInfo);
5996 *
this =
APFloat(std::move(getIEEE()), ToSemantics);
6012#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
6025 bool *isExact)
const {
6029 rounding_mode, isExact);
6031 result =
APInt(bitWidth, parts);
6038 return getIEEE().convertToDouble();
6040 "Float semantics is not representable by IEEEdouble");
6041 APFloat Temp = *
this;
6050#ifdef HAS_IEE754_FLOAT128
6051float128 APFloat::convertToQuad()
const {
6053 return getIEEE().convertToQuad();
6055 "Float semantics is not representable by IEEEquad");
6062 return Temp.getIEEE().convertToQuad();
6069 return getIEEE().convertToFloat();
6071 "Float semantics is not representable by IEEEsingle");
6072 APFloat Temp = *
this;
6083 "Float8E5M2",
"Float8E5M2FNUZ",
"Float8E4M3",
"Float8E4M3FN",
6084 "Float8E4M3FNUZ",
"Float8E4M3B11FNUZ",
"Float8E3M4",
"Float8E8M0FNU",
6085 "Float6E3M2FN",
"Float6E2M3FN",
"Float4E2M1FN"};
6093 .
Case(
"Float8E5M2", &semFloat8E5M2)
6094 .
Case(
"Float8E4M3FN", &semFloat8E4M3FN)
6095 .
Case(
"Float4E2M1FN", &semFloat4E2M1FN)
6096 .
Case(
"Float6E3M2FN", &semFloat6E3M2FN)
6097 .
Case(
"Float6E2M3FN", &semFloat6E2M3FN)
6101APFloat::Storage::~Storage() {
6102 if (usesLayout<IEEEFloat>(*semantics)) {
6106 if (usesLayout<DoubleAPFloat>(*semantics)) {
6113APFloat::Storage::Storage(
const APFloat::Storage &
RHS) {
6114 if (usesLayout<IEEEFloat>(*
RHS.semantics)) {
6118 if (usesLayout<DoubleAPFloat>(*
RHS.semantics)) {
6125APFloat::Storage::Storage(APFloat::Storage &&
RHS) {
6126 if (usesLayout<IEEEFloat>(*
RHS.semantics)) {
6130 if (usesLayout<DoubleAPFloat>(*
RHS.semantics)) {
6137APFloat::Storage &APFloat::Storage::operator=(
const APFloat::Storage &
RHS) {
6138 if (usesLayout<IEEEFloat>(*semantics) &&
6139 usesLayout<IEEEFloat>(*
RHS.semantics)) {
6141 }
else if (usesLayout<DoubleAPFloat>(*semantics) &&
6142 usesLayout<DoubleAPFloat>(*
RHS.semantics)) {
6144 }
else if (
this != &
RHS) {
6146 new (
this) Storage(
RHS);
6151APFloat::Storage &APFloat::Storage::operator=(APFloat::Storage &&
RHS) {
6152 if (usesLayout<IEEEFloat>(*semantics) &&
6153 usesLayout<IEEEFloat>(*
RHS.semantics)) {
6155 }
else if (usesLayout<DoubleAPFloat>(*semantics) &&
6156 usesLayout<DoubleAPFloat>(*
RHS.semantics)) {
6158 }
else if (
this != &
RHS) {
6160 new (
this) Storage(std::move(
RHS));
6167#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)
This file implements the StringSwitch template, which mimics a switch() statement whose cases are str...
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 isValidArbitraryFPFormat(StringRef Format)
Returns true if the given string is a valid arbitrary floating-point format interpretation for llvm....
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 LLVM_ABI const fltSemantics * getArbitraryFPSemantics(StringRef Format)
Returns the fltSemantics for a given arbitrary FP format string, or nullptr if invalid.
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 ...
cmpResult compareAbsoluteValue(const APFloat &RHS) const
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.
A wrapper around a string literal that serves as a proxy for constructing global tables of StringRefs...
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.
A switch()-like statement whose cases are string literals.
StringSwitch & Case(StringLiteral S, T Value)
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)
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
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