24#include "llvm/Config/llvm-config.h"
40#define LIBC_NAMESPACE __llvm_libc_apfloat
41#define LIBC_MATH (LIBC_MATH_NO_ERRNO | LIBC_MATH_NO_EXCEPT)
43#include "shared/math.h"
44#include "shared/math_check_exceptions.h"
46#define APFLOAT_DISPATCH_ON_SEMANTICS(METHOD_CALL) \
48 if (usesLayout<IEEEFloat>(getSemantics())) \
49 return U.IEEE.METHOD_CALL; \
50 if (usesLayout<DoubleAPFloat>(getSemantics())) \
51 return U.Double.METHOD_CALL; \
52 llvm_unreachable("Unexpected semantics"); \
63#define PackCategoriesIntoKey(_lhs, _rhs) ((_lhs) * 4 + (_rhs))
71constexpr fltSemantics APFloatBase::semIEEEhalf = {15, -14, 11, 16};
72constexpr fltSemantics APFloatBase::semBFloat = {127, -126, 8, 16};
73constexpr fltSemantics APFloatBase::semIEEEsingle = {127, -126, 24, 32};
74constexpr fltSemantics APFloatBase::semIEEEdouble = {1023, -1022, 53, 64};
75constexpr fltSemantics APFloatBase::semIEEEquad = {16383, -16382, 113, 128};
76constexpr fltSemantics APFloatBase::semFloat8E5M2 = {15, -14, 3, 8};
79constexpr fltSemantics APFloatBase::semFloat8E4M3 = {7, -6, 4, 8};
84constexpr fltSemantics APFloatBase::semFloat8E4M3B11FNUZ = {
86constexpr fltSemantics APFloatBase::semFloat8E3M4 = {3, -2, 5, 8};
87constexpr fltSemantics APFloatBase::semFloatTF32 = {127, -126, 11, 19};
106constexpr fltSemantics APFloatBase::semX87DoubleExtended = {
118constexpr fltSemantics APFloatBase::semBogus = {0, 0, 0, 0};
119constexpr fltSemantics APFloatBase::semPPCDoubleDouble = {-1, 0, 0, 128};
120constexpr fltSemantics APFloatBase::semPPCDoubleDoubleLegacy = {
121 1023, -1022 + 53, 53 + 53, 128};
217 return A.maxExponent <=
B.maxExponent &&
A.minExponent >=
B.minExponent &&
218 A.precision <=
B.precision;
292 if (Src.maxExponent >= Dst.maxExponent || Src.minExponent <= Dst.minExponent)
300 return Dst.precision >= Src.precision;
340static inline unsigned int
353 const unsigned int overlargeExponent = 24000;
357 if (p == end || ((*p ==
'-' || *p ==
'+') && (p + 1) == end))
360 bool isNegative = *p ==
'-';
361 if (*p ==
'-' || *p ==
'+') {
368 if (absExponent >= 10U)
369 return createError(
"Invalid character in exponent");
371 for (; p != end; ++p) {
374 return createError(
"Invalid character in exponent");
376 absExponent = absExponent * 10U + value;
377 if (absExponent >= overlargeExponent) {
378 absExponent = overlargeExponent;
384 return -(int) absExponent;
386 return (
int) absExponent;
393 int exponentAdjustment) {
399 bool negative = *p ==
'-';
400 if (*p ==
'-' || *p ==
'+') {
406 int unsignedExponent = 0;
407 bool overflow =
false;
408 for (; p != end; ++p) {
413 return createError(
"Invalid character in exponent");
415 unsignedExponent = unsignedExponent * 10 + value;
416 if (unsignedExponent > 32767) {
422 if (exponentAdjustment > 32767 || exponentAdjustment < -32768)
426 exponent = unsignedExponent;
428 exponent = -exponent;
429 exponent += exponentAdjustment;
430 if (exponent > 32767 || exponent < -32768)
435 exponent = negative ? -32768: 32767;
445 while (p != end && *p ==
'0')
448 if (p != end && *p ==
'.') {
451 if (end - begin == 1)
454 while (p != end && *p ==
'0')
487 return PtrOrErr.takeError();
490 D->firstSigDigit = p;
492 D->normalizedExponent = 0;
494 for (; p != end; ++p) {
497 return createError(
"String contains multiple dots");
507 if (*p !=
'e' && *p !=
'E')
508 return createError(
"Invalid character in significand");
511 if (dot != end && p - begin == 1)
517 return ExpOrErr.takeError();
518 D->exponent = *ExpOrErr;
526 if (p !=
D->firstSigDigit) {
532 while (p != begin && *p ==
'0');
533 while (p != begin && *p ==
'.');
538 D->normalizedExponent = (
D->exponent +
540 - (dot >
D->firstSigDigit && dot < p)));
552 unsigned int digitValue) {
557 else if (digitValue < 8 && digitValue > 0)
561 while (p != end && (*p ==
'0' || *p ==
'.'))
565 return createError(
"Invalid trailing hexadecimal fraction!");
571 if (hexDigit == UINT_MAX)
581 unsigned int partCount,
606 return lost_fraction;
621 return moreSignificant;
632HUerrBound(
bool inexactMultiply,
unsigned int HUerr1,
unsigned int HUerr2)
634 assert(HUerr1 < 2 || HUerr2 < 2 || (HUerr1 + HUerr2 < 8));
636 if (HUerr1 + HUerr2 == 0)
637 return inexactMultiply * 2;
639 return inexactMultiply + 2 * (HUerr1 + HUerr2);
665 if (part - boundary <= boundary - part)
666 return part - boundary;
668 return boundary - part;
671 if (part == boundary) {
677 }
else if (part == boundary - 1) {
694 pow5s[0] = 78125 * 5;
696 unsigned int partsCount = 1;
703 *p1 = firstEightPowers[power & 7];
709 for (
unsigned int n = 0; power; power >>= 1, n++) {
713 partsCount, partsCount);
715 if (pow5[partsCount - 1] == 0)
723 result += partsCount;
724 if (p2[result - 1] == 0)
749static const char NaNL[] =
"nan";
750static const char NaNU[] =
"NAN";
757 const char *hexDigitChars)
759 unsigned int result =
count;
765 dst[
count] = hexDigitChars[part & 0xf];
805 switch (
X.getCategory()) {
815 if (
X.isDenormal() ||
X.isSmallestNormalized())
818 if (
X.getExactLog2() != INT_MIN)
826void IEEEFloat::initialize(
const fltSemantics *ourSemantics) {
827 semantics = ourSemantics;
828 unsigned count = partCount();
833void IEEEFloat::freeSignificand() {
835 delete [] significand.parts;
838void IEEEFloat::assign(
const IEEEFloat &rhs) {
839 assert(semantics == rhs.semantics);
842 category = rhs.category;
843 exponent = rhs.exponent;
845 copySignificand(rhs);
848void IEEEFloat::copySignificand(
const IEEEFloat &rhs) {
850 assert(rhs.partCount() >= partCount());
863 if (Negative && !semantics->hasSignedRepr)
865 "This floating point format does not support signed values");
869 exponent = exponentNaN();
872 unsigned numParts = partCount();
885 fill = &fill_storage;
889 if (!
fill ||
fill->getNumWords() < numParts)
893 std::min(
fill->getNumWords(), numParts));
896 unsigned bitsToPreserve = semantics->precision - 1;
897 unsigned part = bitsToPreserve / 64;
898 bitsToPreserve %= 64;
899 significand[part] &= ((1ULL << bitsToPreserve) - 1);
900 for (part++; part != numParts; ++part)
901 significand[part] = 0;
905 (semantics->precision >= 2) ? (semantics->precision - 2) : 0;
927 if (semantics == &APFloatBase::semX87DoubleExtended)
933 if (semantics != rhs.semantics) {
935 initialize(rhs.semantics);
946 semantics = rhs.semantics;
947 significand = rhs.significand;
948 exponent = rhs.exponent;
949 category = rhs.category;
952 rhs.semantics = &APFloatBase::semBogus;
958 (exponent == semantics->minExponent) &&
968 significandMSB() == 0;
973 isSignificandAllZerosExceptMSB();
976unsigned int IEEEFloat::getNumHighBits()
const {
983 const unsigned int NumHighBits = (semantics->
precision > 1)
989bool IEEEFloat::isSignificandAllOnes()
const {
994 for (
unsigned i = 0; i < PartCount - 1; i++)
999 const unsigned NumHighBits = getNumHighBits();
1000 assert(NumHighBits <= integerPartWidth && NumHighBits > 0 &&
1001 "Can not have more high bits to fill than integerPartWidth");
1004 if ((semantics->
precision <= 1) || (~(Parts[PartCount - 1] | HighBitFill)))
1010bool IEEEFloat::isSignificandAllOnesExceptLSB()
const {
1019 for (
unsigned i = 0; i < PartCount - 1; i++) {
1020 if (~Parts[i] & ~
unsigned{!i})
1025 const unsigned NumHighBits = getNumHighBits();
1026 assert(NumHighBits <= integerPartWidth && NumHighBits > 0 &&
1027 "Can not have more high bits to fill than integerPartWidth");
1030 if (~(Parts[PartCount - 1] | HighBitFill | 0x1))
1036bool IEEEFloat::isSignificandAllZeros()
const {
1042 for (
unsigned i = 0; i < PartCount - 1; i++)
1047 const unsigned NumHighBits = getNumHighBits();
1049 "clear than integerPartWidth");
1050 const integerPart HighBitMask = ~integerPart(0) >> NumHighBits;
1052 if ((semantics->precision > 1) && (Parts[PartCount - 1] & HighBitMask))
1058bool IEEEFloat::isSignificandAllZerosExceptMSB()
const {
1062 for (
unsigned i = 0; i < PartCount - 1; i++) {
1067 const unsigned NumHighBits = getNumHighBits();
1070 return ((semantics->precision <= 1) || (Parts[PartCount - 1] == MSBMask));
1074 bool IsMaxExp =
isFiniteNonZero() && exponent == semantics->maxExponent;
1081 ? isSignificandAllOnesExceptLSB()
1086 return IsMaxExp && isSignificandAllOnes();
1101 if (semantics != rhs.semantics ||
1102 category != rhs.category ||
1111 return std::equal(significandParts(), significandParts() + partCount(),
1112 rhs.significandParts());
1116 initialize(&ourSemantics);
1121 significandParts()[0] =
value;
1126 initialize(&ourSemantics);
1142 initialize(rhs.semantics);
1147 *
this = std::move(rhs);
1152unsigned int IEEEFloat::partCount()
const {
1157 return const_cast<IEEEFloat *
>(
this)->significandParts();
1161 if (partCount() > 1)
1162 return significand.parts;
1164 return &significand.part;
1167void IEEEFloat::zeroSignificand() {
1172void IEEEFloat::incrementSignificand() {
1184 assert(semantics == rhs.semantics);
1185 assert(exponent == rhs.exponent);
1187 return APInt::tcAdd(parts, rhs.significandParts(), 0, partCount());
1196 assert(semantics == rhs.semantics);
1197 assert(exponent == rhs.exponent);
1208 bool ignoreAddend) {
1212 assert(semantics == rhs.semantics);
1214 unsigned precision = semantics->precision;
1222 newPartsCount > 4 ?
new integerPart[newPartsCount] : scratch;
1225 unsigned partsCount = partCount();
1228 rhs.significandParts(), partsCount, partsCount);
1232 unsigned omsb =
APInt::tcMSB(fullSignificand, newPartsCount) + 1;
1233 exponent += rhs.exponent;
1247 if (!ignoreAddend && addend.isNonZero()) {
1251 Significand savedSignificand = significand;
1252 const fltSemantics *savedSemantics = semantics;
1255 unsigned extendedPrecision = 2 * precision + 1;
1256 if (omsb != extendedPrecision - 1) {
1257 assert(extendedPrecision > omsb);
1259 (extendedPrecision - 1) - omsb);
1260 exponent -= (extendedPrecision - 1) - omsb;
1264 fltSemantics extendedSemantics = *semantics;
1265 extendedSemantics.
precision = extendedPrecision;
1267 if (newPartsCount == 1)
1268 significand.part = fullSignificand[0];
1270 significand.parts = fullSignificand;
1271 semantics = &extendedSemantics;
1284 lost_fraction = extendedAddend.shiftSignificandRight(1);
1286 "Lost precision while shifting addend for fused-multiply-add.");
1288 lost_fraction = addOrSubtractSignificand(extendedAddend,
false);
1291 if (newPartsCount == 1)
1292 fullSignificand[0] = significand.part;
1293 significand = savedSignificand;
1294 semantics = savedSemantics;
1296 omsb =
APInt::tcMSB(fullSignificand, newPartsCount) + 1;
1303 exponent -= precision + 1;
1312 if (omsb > precision) {
1313 unsigned int bits, significantParts;
1316 bits = omsb - precision;
1318 lf =
shiftRight(fullSignificand, significantParts, bits);
1325 if (newPartsCount > 4)
1326 delete [] fullSignificand;
1328 return lost_fraction;
1337 return multiplySignificand(rhs,
IEEEFloat(*semantics), !semantics->hasZero);
1344 assert(semantics == rhs.semantics);
1347 const integerPart *rhsSignificand = rhs.significandParts();
1348 unsigned partsCount = partCount();
1351 partsCount > 2 ?
new integerPart[partsCount * 2] : scratch;
1355 for (
unsigned i = 0; i < partsCount; i++) {
1356 dividend[i] = lhsSignificand[i];
1357 divisor[i] = rhsSignificand[i];
1358 lhsSignificand[i] = 0;
1361 exponent -= rhs.exponent;
1363 unsigned int precision = semantics->precision;
1366 unsigned bit = precision -
APInt::tcMSB(divisor, partsCount) - 1;
1373 bit = precision -
APInt::tcMSB(dividend, partsCount) - 1;
1389 for (bit = precision; bit; bit -= 1) {
1414 return lost_fraction;
1417unsigned int IEEEFloat::significandMSB()
const {
1421unsigned int IEEEFloat::significandLSB()
const {
1426lostFraction IEEEFloat::shiftSignificandRight(
unsigned int bits) {
1432 return shiftRight(significandParts(), partCount(), bits);
1436void IEEEFloat::shiftSignificandLeft(
unsigned int bits) {
1437 assert(bits < semantics->precision ||
1438 (semantics->precision == 1 && bits <= 1));
1441 unsigned int partsCount = partCount();
1451 assert(semantics == rhs.semantics);
1455 int compare = exponent - rhs.exponent;
1507 exponent = semantics->maxExponent;
1509 semantics->precision);
1522bool IEEEFloat::roundAwayFromZero(
roundingMode rounding_mode,
1524 unsigned int bit)
const {
1531 switch (rounding_mode) {
1567 unsigned omsb = significandMSB() + 1;
1574 int exponentChange = omsb - semantics->precision;
1578 if (exponent + exponentChange > semantics->maxExponent)
1579 return handleOverflow(rounding_mode);
1583 if (exponent + exponentChange < semantics->minExponent)
1584 exponentChange = semantics->minExponent - exponent;
1587 if (exponentChange < 0) {
1590 shiftSignificandLeft(-exponentChange);
1595 if (exponentChange > 0) {
1599 lf = shiftSignificandRight(exponentChange);
1604 if (omsb > (
unsigned) exponentChange)
1605 omsb -= exponentChange;
1615 exponent == semantics->maxExponent && isSignificandAllOnes())
1616 return handleOverflow(rounding_mode);
1629 if (!semantics->hasZero)
1637 if (roundAwayFromZero(rounding_mode, lost_fraction, 0)) {
1639 exponent = semantics->minExponent;
1641 incrementSignificand();
1642 omsb = significandMSB() + 1;
1645 if (omsb == (
unsigned) semantics->precision + 1) {
1649 if (exponent == semantics->maxExponent)
1656 shiftSignificandRight(1);
1665 exponent == semantics->maxExponent && isSignificandAllOnes())
1666 return handleOverflow(rounding_mode);
1671 if (omsb == semantics->precision)
1675 assert(omsb < semantics->precision);
1685 if (!semantics->hasZero)
1757 subtract ^=
static_cast<bool>(sign ^ rhs.sign);
1760 int bits = exponent - rhs.exponent;
1764 if ((bits < 0) && !semantics->hasSignedRepr)
1766 "This floating point format does not support signed values");
1769 bool lost_fraction_is_from_rhs =
false;
1773 else if (bits > 0) {
1774 lost_fraction = temp_rhs.shiftSignificandRight(bits - 1);
1775 lost_fraction_is_from_rhs =
true;
1776 shiftSignificandLeft(1);
1778 lost_fraction = shiftSignificandRight(-bits - 1);
1779 temp_rhs.shiftSignificandLeft(1);
1786 lost_fraction !=
lfExactlyZero && !lost_fraction_is_from_rhs;
1795 carry = temp_rhs.subtractSignificand(*
this, borrow);
1796 copySignificand(temp_rhs);
1799 bool borrow = lost_fraction !=
lfExactlyZero && lost_fraction_is_from_rhs;
1808 carry = subtractSignificand(temp_rhs, borrow);
1811 if (lost_fraction !=
lfExactlyZero && lost_fraction_is_from_rhs) {
1824 lost_fraction = temp_rhs.shiftSignificandRight(bits);
1825 carry = addSignificand(temp_rhs);
1827 lost_fraction = shiftSignificandRight(-bits);
1828 carry = addSignificand(rhs);
1835 return lost_fraction;
2028 lost_fraction = addOrSubtractSignificand(rhs,
subtract);
2029 fs = normalize(rounding_mode, lost_fraction);
2038 if (category ==
fcZero) {
2052 return addOrSubtract(rhs, rounding_mode,
false);
2058 return addOrSubtract(rhs, rounding_mode,
true);
2071 fs = normalize(rounding_mode, lost_fraction);
2089 fs = normalize(rounding_mode, lost_fraction);
2099 unsigned int origSign = sign;
2208 unsigned int origSign = sign;
2229 if (!semantics->hasZero && this->isSmallest())
2249 sign ^= multiplicand.sign;
2258 lost_fraction = multiplySignificand(multiplicand, addend);
2259 fs = normalize(rounding_mode, lost_fraction);
2272 fs = multiplySpecials(multiplicand);
2282 fs = addOrSubtract(addend, rounding_mode,
false);
2354 MagicConstant.sign = sign;
2360 fs =
add(MagicConstant, rounding_mode);
2364 subtract(MagicConstant, rounding_mode);
2375 assert(semantics == rhs.semantics);
2407 if (sign == rhs.sign)
2423 if (sign != rhs.sign) {
2459 unsigned oldPartCount = partCount();
2462 bool X86SpecialNan =
false;
2463 if (&fromSemantics == &APFloatBase::semX87DoubleExtended &&
2464 &toSemantics != &APFloatBase::semX87DoubleExtended && category ==
fcNaN &&
2465 (!(*significandParts() & 0x8000000000000000ULL) ||
2466 !(*significandParts() & 0x4000000000000000ULL))) {
2469 X86SpecialNan =
true;
2480 int omsb = significandMSB() + 1;
2481 int exponentChange = omsb - fromSemantics.
precision;
2482 if (exponent + exponentChange < toSemantics.
minExponent)
2483 exponentChange = toSemantics.
minExponent - exponent;
2484 exponentChange = std::max(exponentChange, shift);
2485 if (exponentChange < 0) {
2486 shift -= exponentChange;
2487 exponent += exponentChange;
2488 }
else if (omsb <= -shift) {
2489 exponentChange = omsb + shift - 1;
2490 shift -= exponentChange;
2491 exponent += exponentChange;
2497 (category ==
fcNaN && semantics->nonFiniteBehavior !=
2502 if (newPartCount > oldPartCount) {
2510 significand.parts = newParts;
2511 }
else if (newPartCount == 1 && oldPartCount != 1) {
2515 newPart = significandParts()[0];
2517 significand.part = newPart;
2521 semantics = &toSemantics;
2530 *losesInfo = (
fs !=
opOK);
2531 }
else if (category ==
fcNaN) {
2549 if (!X86SpecialNan && semantics == &APFloatBase::semX87DoubleExtended)
2566 }
else if (category ==
fcZero &&
2579 if (category ==
fcZero && !semantics->hasZero)
2604 assert(dstPartsCount <= parts.
size() &&
"Integer too big");
2606 if (category ==
fcZero) {
2615 unsigned truncatedBits;
2623 truncatedBits = semantics->
precision -1U - exponent;
2627 unsigned int bits = exponent + 1U;
2633 if (bits < semantics->precision) {
2635 truncatedBits = semantics->
precision - bits;
2642 bits - semantics->precision);
2650 if (truncatedBits) {
2654 roundAwayFromZero(rounding_mode, lost_fraction, truncatedBits)) {
2674 if (omsb == width &&
2710 rounding_mode, isExact);
2713 unsigned int bits, dstPartsCount;
2716 assert(dstPartsCount <= parts.
size() &&
"Integer too big");
2718 if (category ==
fcNaN)
2741 unsigned dstCount = partCount();
2742 unsigned precision = semantics->
precision;
2747 if (precision <= omsb) {
2748 exponent = omsb - 1;
2753 exponent = precision - 1;
2758 return normalize(rounding_mode, lost_fraction);
2772 return convertFromUnsignedParts(api.
getRawData(), partCount, rounding_mode);
2776IEEEFloat::convertFromHexadecimalString(
StringRef s,
2785 unsigned partsCount = partCount();
2787 bool computedTrailingFraction =
false;
2795 return PtrOrErr.takeError();
2804 return createError(
"String contains multiple dots");
2810 if (hex_value == UINT_MAX)
2820 }
else if (!computedTrailingFraction) {
2823 return FractOrErr.takeError();
2824 lost_fraction = *FractOrErr;
2825 computedTrailingFraction =
true;
2831 return createError(
"Hex strings require an exponent");
2832 if (*p !=
'p' && *p !=
'P')
2833 return createError(
"Invalid character in significand");
2836 if (dot != end && p - begin == 1)
2840 if (p != firstSignificantDigit) {
2849 expAdjustment =
static_cast<int>(
dot - firstSignificantDigit);
2850 if (expAdjustment < 0)
2852 expAdjustment = expAdjustment * 4 - 1;
2856 expAdjustment += semantics->precision;
2862 return ExpOrErr.takeError();
2863 exponent = *ExpOrErr;
2866 return normalize(rounding_mode, lost_fraction);
2870IEEEFloat::roundSignificandWithExponent(
const integerPart *decSigParts,
2871 unsigned sigPartCount,
int exp,
2873 fltSemantics calcSemantics = { 32767, -32767, 0, 0 };
2884 for (;; parts *= 2) {
2885 unsigned int excessPrecision, truncatedBits;
2888 excessPrecision = calcSemantics.
precision - semantics->precision;
2889 truncatedBits = excessPrecision;
2892 decSig.makeZero(sign);
2895 opStatus sigStatus = decSig.convertFromUnsignedParts(
2897 opStatus powStatus = pow5.convertFromUnsignedParts(pow5Parts, pow5PartCount,
2900 decSig.exponent +=
exp;
2904 unsigned int powHUerr;
2908 calcLostFraction = decSig.multiplySignificand(pow5);
2909 powHUerr = powStatus !=
opOK;
2911 calcLostFraction = decSig.divideSignificand(pow5);
2913 if (decSig.exponent < semantics->minExponent) {
2914 excessPrecision += (semantics->minExponent - decSig.exponent);
2915 truncatedBits = excessPrecision;
2916 excessPrecision = std::min(excessPrecision, calcSemantics.
precision);
2925 (decSig.significandParts(), calcSemantics.
precision - 1) == 1);
2930 excessPrecision, isNearest);
2933 if (HUdistance >= HUerr) {
2934 APInt::tcExtract(significandParts(), partCount(), decSig.significandParts(),
2935 calcSemantics.
precision - excessPrecision,
2940 exponent = (decSig.exponent + semantics->precision
2941 - (calcSemantics.
precision - excessPrecision));
2945 return static_cast<opStatus>(normalize(rounding_mode, calcLostFraction) |
2951Expected<APFloat::opStatus>
2952IEEEFloat::convertFromDecimalString(StringRef str,
roundingMode rounding_mode) {
2959 return std::move(Err);
2990 if (!semantics->hasZero)
2995 }
else if (
D.normalizedExponent - 1 > INT_MAX / 42039) {
2996 fs = handleOverflow(rounding_mode);
3002 }
else if (
D.normalizedExponent - 1 < INT_MIN / 42039 ||
3003 (
D.normalizedExponent + 1) * 28738 <=
3004 8651 * (semantics->minExponent - (
int) semantics->precision)) {
3011 }
else if ((
D.normalizedExponent - 1) * 42039
3012 >= 12655 * semantics->maxExponent) {
3014 fs = handleOverflow(rounding_mode);
3017 unsigned int partCount;
3023 partCount =
static_cast<unsigned int>(
D.lastSigDigit -
D.firstSigDigit) + 1;
3041 if (p == str.
end()) {
3046 if (decValue >= 10U) {
3047 delete[] decSignificand;
3048 return createError(
"Invalid character in significand");
3054 }
while (p <=
D.lastSigDigit && multiplier <= (~ (
integerPart) 0 - 9) / 10);
3058 partCount, partCount + 1,
false);
3062 if (decSignificand[partCount])
3064 }
while (p <=
D.lastSigDigit);
3067 fs = roundSignificandWithExponent(decSignificand, partCount,
3068 D.exponent, rounding_mode);
3070 delete [] decSignificand;
3076bool IEEEFloat::convertFromStringSpecials(StringRef str) {
3077 const size_t MIN_NAME_SIZE = 3;
3079 if (str.
size() < MIN_NAME_SIZE)
3082 if (str ==
"inf" || str ==
"INFINITY" || str ==
"+Inf" || str ==
"+inf") {
3089 if (str.
size() < MIN_NAME_SIZE)
3092 if (str ==
"inf" || str ==
"INFINITY" || str ==
"Inf") {
3101 if (str.
size() < MIN_NAME_SIZE)
3108 makeNaN(IsSignaling, IsNegative);
3113 if (str.
front() ==
'(') {
3115 if (str.
size() <= 2 || str.
back() !=
')')
3122 unsigned Radix = 10;
3123 if (str[0] ==
'0') {
3124 if (str.
size() > 1 && tolower(str[1]) ==
'x') {
3135 makeNaN(IsSignaling, IsNegative, &Payload);
3143Expected<APFloat::opStatus>
3149 if (convertFromStringSpecials(str))
3154 size_t slen = str.
size();
3155 sign = *p ==
'-' ? 1 : 0;
3156 if (sign && !semantics->hasSignedRepr)
3158 "This floating point format does not support signed values");
3160 if (*p ==
'-' || *p ==
'+') {
3167 if (slen >= 2 && p[0] ==
'0' && (p[1] ==
'x' || p[1] ==
'X')) {
3170 return convertFromHexadecimalString(
StringRef(p + 2, slen - 2),
3174 return convertFromDecimalString(
StringRef(p, slen), rounding_mode);
3216 dst +=
sizeof NaNU - 1;
3221 *dst++ = upperCase ?
'X':
'x';
3223 if (hexDigits > 1) {
3225 memset (dst,
'0', hexDigits - 1);
3226 dst += hexDigits - 1;
3228 *dst++ = upperCase ?
'P':
'p';
3233 dst = convertNormalToHexString (dst, hexDigits, upperCase, rounding_mode);
3239 return static_cast<unsigned int>(dst - p);
3246char *IEEEFloat::convertNormalToHexString(
char *dst,
unsigned int hexDigits,
3250 *dst++ = upperCase ?
'X':
'x';
3252 bool roundUp =
false;
3255 const integerPart *significand = significandParts();
3256 unsigned partsCount = partCount();
3260 unsigned valueBits = semantics->
precision + 3;
3265 unsigned outputDigits = (valueBits - significandLSB() + 3) / 4;
3271 if (hexDigits < outputDigits) {
3277 bits = valueBits - hexDigits * 4;
3279 roundUp = roundAwayFromZero(rounding_mode, fraction, bits);
3281 outputDigits = hexDigits;
3291 while (outputDigits &&
count) {
3295 if (--
count == partsCount)
3298 part = significand[
count] << shift;
3306 curDigits = std::min(curDigits, outputDigits);
3307 dst +=
partAsHex (dst, part, curDigits, hexDigitChars);
3308 outputDigits -= curDigits;
3318 }
while (*q ==
'0');
3322 memset (dst,
'0', outputDigits);
3323 dst += outputDigits;
3336 *dst++ = upperCase ?
'P':
'p';
3352 Arg.significandParts(),
3353 Arg.significandParts() + Arg.partCount()));
3365APInt IEEEFloat::convertF80LongDoubleAPFloatToAPInt()
const {
3370 uint64_t myexponent, mysignificand;
3373 myexponent = exponent+16383;
3374 mysignificand = significandParts()[0];
3375 if (myexponent==1 && !(mysignificand & 0x8000000000000000ULL))
3377 }
else if (category==
fcZero) {
3381 myexponent = 0x7fff;
3382 mysignificand = 0x8000000000000000ULL;
3385 myexponent = 0x7fff;
3386 mysignificand = significandParts()[0];
3390 words[0] = mysignificand;
3391 words[1] = ((uint64_t)(sign & 1) << 15) |
3392 (myexponent & 0x7fffLL);
3393 return APInt(80, words);
3396APInt IEEEFloat::convertPPCDoubleDoubleLegacyAPFloatToAPInt()
const {
3398 (
const llvm::fltSemantics *)&APFloatBase::semPPCDoubleDoubleLegacy);
3410 fltSemantics extendedSemantics = *semantics;
3420 words[0] = *
u.convertDoubleAPFloatToAPInt().getRawData();
3426 if (
u.isFiniteNonZero() && losesInfo) {
3434 words[1] = *
v.convertDoubleAPFloatToAPInt().getRawData();
3439 return APInt(128, words);
3442template <const fltSemantics &S>
3443APInt IEEEFloat::convertIEEEFloatToAPInt()
const {
3445 constexpr unsigned int trailing_significand_bits = S.precision - 1;
3446 constexpr int integer_bit_part = trailing_significand_bits /
integerPartWidth;
3449 constexpr uint64_t significand_mask = integer_bit - 1;
3450 constexpr unsigned int exponent_bits =
3451 S.sizeInBits - (S.hasSignedRepr ? 1 : 0) - trailing_significand_bits;
3452 static_assert(exponent_bits < 64);
3453 constexpr uint64_t exponent_mask = (uint64_t{1} << exponent_bits) - 1;
3454 constexpr bool is_zero_exp_reserved = S.hasDenormals || S.hasZero;
3455 constexpr int bias = -(S.minExponent - (is_zero_exp_reserved ? 1 : 0));
3457 uint64_t myexponent;
3462 myexponent = exponent + bias;
3463 std::copy_n(significandParts(), mysignificand.size(),
3464 mysignificand.begin());
3465 if (myexponent == 1 &&
3466 !(significandParts()[integer_bit_part] & integer_bit))
3468 }
else if (category ==
fcZero) {
3471 myexponent = ::exponentZero(S) + bias;
3472 mysignificand.fill(0);
3477 myexponent = ::exponentInf(S) + bias;
3478 mysignificand.fill(0);
3483 myexponent = ::exponentNaN(S) + bias;
3484 std::copy_n(significandParts(), mysignificand.size(),
3485 mysignificand.begin());
3487 std::array<uint64_t, (S.sizeInBits + 63) / 64> words;
3489 std::copy_n(mysignificand.begin(), mysignificand.size(), words.begin());
3490 if constexpr (significand_mask != 0 || trailing_significand_bits == 0) {
3492 words[mysignificand.size() - 1] &= significand_mask;
3494 std::fill(words_iter, words.end(), uint64_t{0});
3495 constexpr size_t last_word = words.size() - 1;
3496 uint64_t shifted_sign =
static_cast<uint64_t
>(sign & 1)
3497 << ((S.sizeInBits - 1) % 64);
3498 words[last_word] |= shifted_sign;
3499 uint64_t shifted_exponent = (myexponent & exponent_mask)
3500 << (trailing_significand_bits % 64);
3501 words[last_word] |= shifted_exponent;
3502 if constexpr (last_word == 0) {
3503 return APInt(S.sizeInBits, words[0]);
3505 return APInt(S.sizeInBits, words);
3508APInt IEEEFloat::convertQuadrupleAPFloatToAPInt()
const {
3509 assert(partCount() == 2);
3510 return convertIEEEFloatToAPInt<APFloatBase::semIEEEquad>();
3513APInt IEEEFloat::convertDoubleAPFloatToAPInt()
const {
3515 return convertIEEEFloatToAPInt<APFloatBase::semIEEEdouble>();
3518APInt IEEEFloat::convertFloatAPFloatToAPInt()
const {
3520 return convertIEEEFloatToAPInt<APFloatBase::semIEEEsingle>();
3523APInt IEEEFloat::convertBFloatAPFloatToAPInt()
const {
3524 assert(partCount() == 1);
3525 return convertIEEEFloatToAPInt<APFloatBase::semBFloat>();
3528APInt IEEEFloat::convertHalfAPFloatToAPInt()
const {
3530 return convertIEEEFloatToAPInt<APFloatBase::APFloatBase::semIEEEhalf>();
3533APInt IEEEFloat::convertFloat8E5M2APFloatToAPInt()
const {
3534 assert(partCount() == 1);
3535 return convertIEEEFloatToAPInt<APFloatBase::semFloat8E5M2>();
3538APInt IEEEFloat::convertFloat8E5M2FNUZAPFloatToAPInt()
const {
3539 assert(partCount() == 1);
3540 return convertIEEEFloatToAPInt<APFloatBase::semFloat8E5M2FNUZ>();
3543APInt IEEEFloat::convertFloat8E4M3APFloatToAPInt()
const {
3544 assert(partCount() == 1);
3545 return convertIEEEFloatToAPInt<APFloatBase::semFloat8E4M3>();
3548APInt IEEEFloat::convertFloat8E4M3FNAPFloatToAPInt()
const {
3549 assert(partCount() == 1);
3550 return convertIEEEFloatToAPInt<APFloatBase::semFloat8E4M3FN>();
3553APInt IEEEFloat::convertFloat8E4M3FNUZAPFloatToAPInt()
const {
3554 assert(partCount() == 1);
3555 return convertIEEEFloatToAPInt<APFloatBase::semFloat8E4M3FNUZ>();
3558APInt IEEEFloat::convertFloat8E4M3B11FNUZAPFloatToAPInt()
const {
3559 assert(partCount() == 1);
3560 return convertIEEEFloatToAPInt<APFloatBase::semFloat8E4M3B11FNUZ>();
3563APInt IEEEFloat::convertFloat8E3M4APFloatToAPInt()
const {
3564 assert(partCount() == 1);
3565 return convertIEEEFloatToAPInt<APFloatBase::semFloat8E3M4>();
3568APInt IEEEFloat::convertFloatTF32APFloatToAPInt()
const {
3569 assert(partCount() == 1);
3570 return convertIEEEFloatToAPInt<APFloatBase::semFloatTF32>();
3573APInt IEEEFloat::convertFloat8E8M0FNUAPFloatToAPInt()
const {
3574 assert(partCount() == 1);
3575 return convertIEEEFloatToAPInt<APFloatBase::semFloat8E8M0FNU>();
3578APInt IEEEFloat::convertFloat6E3M2FNAPFloatToAPInt()
const {
3579 assert(partCount() == 1);
3580 return convertIEEEFloatToAPInt<APFloatBase::semFloat6E3M2FN>();
3583APInt IEEEFloat::convertFloat6E2M3FNAPFloatToAPInt()
const {
3584 assert(partCount() == 1);
3585 return convertIEEEFloatToAPInt<APFloatBase::semFloat6E2M3FN>();
3588APInt IEEEFloat::convertFloat4E2M1FNAPFloatToAPInt()
const {
3589 assert(partCount() == 1);
3590 return convertIEEEFloatToAPInt<APFloatBase::semFloat4E2M1FN>();
3599 return convertHalfAPFloatToAPInt();
3602 return convertBFloatAPFloatToAPInt();
3605 return convertFloatAPFloatToAPInt();
3608 return convertDoubleAPFloatToAPInt();
3611 return convertQuadrupleAPFloatToAPInt();
3615 return convertPPCDoubleDoubleLegacyAPFloatToAPInt();
3618 return convertFloat8E5M2APFloatToAPInt();
3621 return convertFloat8E5M2FNUZAPFloatToAPInt();
3624 return convertFloat8E4M3APFloatToAPInt();
3627 return convertFloat8E4M3FNAPFloatToAPInt();
3630 return convertFloat8E4M3FNUZAPFloatToAPInt();
3634 return convertFloat8E4M3B11FNUZAPFloatToAPInt();
3637 return convertFloat8E3M4APFloatToAPInt();
3640 return convertFloatTF32APFloatToAPInt();
3643 return convertFloat8E8M0FNUAPFloatToAPInt();
3646 return convertFloat6E3M2FNAPFloatToAPInt();
3649 return convertFloat6E2M3FNAPFloatToAPInt();
3652 return convertFloat4E2M1FNAPFloatToAPInt();
3657 return convertF80LongDoubleAPFloatToAPInt();
3662 "Float semantics are not IEEEsingle");
3669 "Float semantics are not IEEEdouble");
3674#ifdef HAS_IEE754_FLOAT128
3675float128 IEEEFloat::convertToQuad()
const {
3677 "Float semantics are not IEEEquads");
3679 return api.bitsToQuad();
3683void IEEEFloat::initFromF80LongDoubleAPInt(
const APInt &api) {
3684 return initFromIEEEAPInt<APFloatBase::semX87DoubleExtended>(api);
3687void IEEEFloat::initFromPPCDoubleDoubleLegacyAPInt(
const APInt &api) {
3693 initFromDoubleAPInt(
APInt(64, i1));
3715void IEEEFloat::initFromFloat8E8M0FNUAPInt(
const APInt &api) {
3716 initFromIEEEAPInt<APFloatBase::semFloat8E8M0FNU>(api);
3719template <const fltSemantics &S>
3720void IEEEFloat::initFromIEEEAPInt(
const APInt &api) {
3723 constexpr unsigned int trailing_significand_bits =
3724 S.precision - 1 + S.hasExplicitIntegerBit;
3727 constexpr uint64_t significand_mask = integer_bit - 1;
3728 constexpr unsigned int exponent_bits =
3729 S.sizeInBits - (S.hasSignedRepr ? 1 : 0) - trailing_significand_bits;
3730 static_assert(exponent_bits < 64);
3731 constexpr unsigned int stored_significand_parts =
3733 constexpr uint64_t exponent_mask = (uint64_t{1} << exponent_bits) - 1;
3734 constexpr bool is_zero_exp_reserved = S.hasDenormals || S.hasZero;
3735 constexpr int bias = -(S.minExponent - (is_zero_exp_reserved ? 1 : 0));
3736 constexpr bool has_significand = trailing_significand_bits > 0;
3740 std::array<integerPart, stored_significand_parts> mysignificand;
3741 if constexpr (has_significand) {
3742 std::copy_n(api.
getRawData(), mysignificand.size(), mysignificand.begin());
3744 mysignificand[mysignificand.size() - 1] &= significand_mask;
3747 std::fill_n(mysignificand.begin(), mysignificand.size(), 0);
3750 mysignificand[0] = 1;
3756 uint64_t myexponent =
3757 (last_word >> (trailing_significand_bits % 64)) & exponent_mask;
3760 assert(partCount() == mysignificand.size());
3762 sign = S.hasSignedRepr
3763 ?
static_cast<unsigned int>(last_word >> ((S.sizeInBits - 1) % 64))
3766 bool all_zero_significand =
3769 bool is_zero = myexponent == 0 && all_zero_significand && S.hasZero;
3772 bool is_inf =
false;
3774 if constexpr (S.hasExplicitIntegerBit) {
3776 static_assert(S.precision == 64);
3777 constexpr integerPart significand_mask_no_int_bit =
3778 (uint64_t{1} << (trailing_significand_bits - 1)) - 1;
3780 mysignificand[0] >> (trailing_significand_bits - 1);
3782 is_inf = myexponent - bias == ::exponentInf(S) && myintegerbit == 1 &&
3783 (mysignificand[0] & significand_mask_no_int_bit) == 0;
3785 is_inf = myexponent - bias == ::exponentInf(S) && all_zero_significand;
3794 bool is_nan =
false;
3797 if constexpr (S.hasExplicitIntegerBit) {
3799 static_assert(S.precision == 64);
3801 mysignificand[0] >> (trailing_significand_bits - 1);
3802 constexpr integerPart significand_mask_no_int_bit =
3803 (uint64_t{1} << (trailing_significand_bits - 1)) - 1;
3805 if (myexponent - bias == ::exponentNaN(S) &&
3806 (mysignificand[0] & significand_mask_no_int_bit) != 0) {
3809 }
else if (myexponent - bias == ::exponentNaN(S) &&
3810 (mysignificand[0] & significand_mask_no_int_bit) == 0) {
3813 }
else if (myexponent - bias != ::exponentNaN(S) && myexponent != 0 &&
3814 myintegerbit == 0) {
3819 is_nan = myexponent - bias == ::exponentNaN(S) && !all_zero_significand;
3822 bool all_ones_significand =
3823 std::all_of(mysignificand.begin(), mysignificand.end() - 1,
3824 [](
integerPart bits) { return bits == ~integerPart{0}; }) &&
3825 (!significand_mask ||
3826 mysignificand[mysignificand.size() - 1] == significand_mask);
3827 is_nan = myexponent - bias == ::exponentNaN(S) && all_ones_significand;
3829 is_nan = is_zero && sign;
3835 std::copy_n(mysignificand.begin(), mysignificand.size(),
3836 significandParts());
3846 exponent = myexponent - bias;
3847 std::copy_n(mysignificand.begin(), mysignificand.size(), significandParts());
3848 if (myexponent == 0 && S.hasDenormals)
3849 exponent = S.minExponent;
3851 if constexpr (!S.hasExplicitIntegerBit) {
3852 significandParts()[mysignificand.size() - 1] |= integer_bit;
3857void IEEEFloat::initFromQuadrupleAPInt(
const APInt &api) {
3858 initFromIEEEAPInt<APFloatBase::semIEEEquad>(api);
3861void IEEEFloat::initFromDoubleAPInt(
const APInt &api) {
3862 initFromIEEEAPInt<APFloatBase::semIEEEdouble>(api);
3865void IEEEFloat::initFromFloatAPInt(
const APInt &api) {
3866 initFromIEEEAPInt<APFloatBase::semIEEEsingle>(api);
3869void IEEEFloat::initFromBFloatAPInt(
const APInt &api) {
3870 initFromIEEEAPInt<APFloatBase::semBFloat>(api);
3873void IEEEFloat::initFromHalfAPInt(
const APInt &api) {
3874 initFromIEEEAPInt<APFloatBase::semIEEEhalf>(api);
3877void IEEEFloat::initFromFloat8E5M2APInt(
const APInt &api) {
3878 initFromIEEEAPInt<APFloatBase::semFloat8E5M2>(api);
3881void IEEEFloat::initFromFloat8E5M2FNUZAPInt(
const APInt &api) {
3882 initFromIEEEAPInt<APFloatBase::semFloat8E5M2FNUZ>(api);
3885void IEEEFloat::initFromFloat8E4M3APInt(
const APInt &api) {
3886 initFromIEEEAPInt<APFloatBase::semFloat8E4M3>(api);
3889void IEEEFloat::initFromFloat8E4M3FNAPInt(
const APInt &api) {
3890 initFromIEEEAPInt<APFloatBase::semFloat8E4M3FN>(api);
3893void IEEEFloat::initFromFloat8E4M3FNUZAPInt(
const APInt &api) {
3894 initFromIEEEAPInt<APFloatBase::semFloat8E4M3FNUZ>(api);
3897void IEEEFloat::initFromFloat8E4M3B11FNUZAPInt(
const APInt &api) {
3898 initFromIEEEAPInt<APFloatBase::semFloat8E4M3B11FNUZ>(api);
3901void IEEEFloat::initFromFloat8E3M4APInt(
const APInt &api) {
3902 initFromIEEEAPInt<APFloatBase::semFloat8E3M4>(api);
3905void IEEEFloat::initFromFloatTF32APInt(
const APInt &api) {
3906 initFromIEEEAPInt<APFloatBase::semFloatTF32>(api);
3909void IEEEFloat::initFromFloat6E3M2FNAPInt(
const APInt &api) {
3910 initFromIEEEAPInt<APFloatBase::semFloat6E3M2FN>(api);
3913void IEEEFloat::initFromFloat6E2M3FNAPInt(
const APInt &api) {
3914 initFromIEEEAPInt<APFloatBase::semFloat6E2M3FN>(api);
3917void IEEEFloat::initFromFloat4E2M1FNAPInt(
const APInt &api) {
3918 initFromIEEEAPInt<APFloatBase::semFloat4E2M1FN>(api);
3924 if (Sem == &APFloatBase::semIEEEhalf)
3925 return initFromHalfAPInt(api);
3926 if (Sem == &APFloatBase::semBFloat)
3927 return initFromBFloatAPInt(api);
3928 if (Sem == &APFloatBase::semIEEEsingle)
3929 return initFromFloatAPInt(api);
3930 if (Sem == &APFloatBase::semIEEEdouble)
3931 return initFromDoubleAPInt(api);
3932 if (Sem == &APFloatBase::semX87DoubleExtended)
3933 return initFromF80LongDoubleAPInt(api);
3934 if (Sem == &APFloatBase::semIEEEquad)
3935 return initFromQuadrupleAPInt(api);
3936 if (Sem == &APFloatBase::semPPCDoubleDoubleLegacy)
3937 return initFromPPCDoubleDoubleLegacyAPInt(api);
3938 if (Sem == &APFloatBase::semFloat8E5M2)
3939 return initFromFloat8E5M2APInt(api);
3940 if (Sem == &APFloatBase::semFloat8E5M2FNUZ)
3941 return initFromFloat8E5M2FNUZAPInt(api);
3942 if (Sem == &APFloatBase::semFloat8E4M3)
3943 return initFromFloat8E4M3APInt(api);
3944 if (Sem == &APFloatBase::semFloat8E4M3FN)
3945 return initFromFloat8E4M3FNAPInt(api);
3946 if (Sem == &APFloatBase::semFloat8E4M3FNUZ)
3947 return initFromFloat8E4M3FNUZAPInt(api);
3948 if (Sem == &APFloatBase::semFloat8E4M3B11FNUZ)
3949 return initFromFloat8E4M3B11FNUZAPInt(api);
3950 if (Sem == &APFloatBase::semFloat8E3M4)
3951 return initFromFloat8E3M4APInt(api);
3952 if (Sem == &APFloatBase::semFloatTF32)
3953 return initFromFloatTF32APInt(api);
3954 if (Sem == &APFloatBase::semFloat8E8M0FNU)
3955 return initFromFloat8E8M0FNUAPInt(api);
3956 if (Sem == &APFloatBase::semFloat6E3M2FN)
3957 return initFromFloat6E3M2FNAPInt(api);
3958 if (Sem == &APFloatBase::semFloat6E2M3FN)
3959 return initFromFloat6E2M3FNAPInt(api);
3960 if (Sem == &APFloatBase::semFloat4E2M1FN)
3961 return initFromFloat4E2M1FNAPInt(api);
3969 if (Negative && !semantics->hasSignedRepr)
3971 "This floating point format does not support signed values");
3978 exponent = semantics->maxExponent;
3982 unsigned PartCount = partCount();
3983 memset(significand, 0xFF,
sizeof(
integerPart)*(PartCount - 1));
3987 const unsigned NumUnusedHighBits =
3994 (semantics->precision > 1))
4001 if (Negative && !semantics->hasSignedRepr)
4003 "This floating point format does not support signed values");
4010 exponent = semantics->minExponent;
4015 if (Negative && !semantics->hasSignedRepr)
4017 "This floating point format does not support signed values");
4026 exponent = semantics->minExponent;
4031 initFromAPInt(&Sem, API);
4044 Buffer.
append(Str.begin(), Str.end());
4049 void AdjustToPrecision(
APInt &significand,
4050 int &
exp,
unsigned FormatPrecision) {
4054 unsigned bitsRequired = (FormatPrecision * 196 + 58) / 59;
4056 if (bits <= bitsRequired)
return;
4058 unsigned tensRemovable = (bits - bitsRequired) * 59 / 196;
4059 if (!tensRemovable)
return;
4061 exp += tensRemovable;
4066 if (tensRemovable & 1)
4068 tensRemovable >>= 1;
4069 if (!tensRemovable)
break;
4073 significand = significand.
udiv(divisor);
4081 int &
exp,
unsigned FormatPrecision) {
4082 unsigned N = buffer.
size();
4083 if (
N <= FormatPrecision)
return;
4086 unsigned FirstSignificant =
N - FormatPrecision;
4093 if (buffer[FirstSignificant - 1] <
'5') {
4094 while (FirstSignificant <
N && buffer[FirstSignificant] ==
'0')
4097 exp += FirstSignificant;
4098 buffer.
erase(&buffer[0], &buffer[FirstSignificant]);
4104 for (
unsigned I = FirstSignificant;
I !=
N; ++
I) {
4105 if (buffer[
I] ==
'9') {
4114 if (FirstSignificant ==
N) {
4115 exp += FirstSignificant;
4121 exp += FirstSignificant;
4122 buffer.
erase(&buffer[0], &buffer[FirstSignificant]);
4126 APInt significand,
unsigned FormatPrecision,
4127 unsigned FormatMaxPadding,
bool TruncateZero) {
4128 const int semanticsPrecision = significand.
getBitWidth();
4135 if (!FormatPrecision) {
4143 FormatPrecision = 2 + semanticsPrecision * 59 / 196;
4148 exp += trailingZeros;
4154 }
else if (
exp > 0) {
4156 significand = significand.
zext(semanticsPrecision +
exp);
4157 significand <<=
exp;
4171 unsigned precision = semanticsPrecision + (137 * texp + 136) / 59;
4175 significand = significand.
zext(precision);
4176 APInt five_to_the_i(precision, 5);
4179 significand *= five_to_the_i;
4184 five_to_the_i *= five_to_the_i;
4188 AdjustToPrecision(significand,
exp, FormatPrecision);
4193 unsigned precision = significand.getBitWidth();
4194 if (precision < 4) {
4197 significand = significand.zext(precision);
4199 APInt ten(precision, 10);
4200 APInt digit(precision, 0);
4202 bool inTrail =
true;
4203 while (significand != 0) {
4208 unsigned d = digit.getZExtValue();
4219 assert(!buffer.
empty() &&
"no characters in buffer!");
4223 AdjustToPrecision(buffer,
exp, FormatPrecision);
4225 unsigned NDigits = buffer.
size();
4228 bool FormatScientific;
4229 if (!FormatMaxPadding) {
4230 FormatScientific =
true;
4236 FormatScientific = ((unsigned)
exp > FormatMaxPadding ||
4237 NDigits + (unsigned)
exp > FormatPrecision);
4240 int MSD =
exp + (int) (NDigits - 1);
4243 FormatScientific =
false;
4247 FormatScientific = ((unsigned) -MSD) > FormatMaxPadding;
4253 if (FormatScientific) {
4254 exp += (NDigits - 1);
4256 Str.push_back(buffer[NDigits-1]);
4258 if (NDigits == 1 && TruncateZero)
4261 for (
unsigned I = 1;
I != NDigits; ++
I)
4262 Str.push_back(buffer[NDigits-1-
I]);
4264 if (!TruncateZero && FormatPrecision > NDigits - 1)
4265 Str.append(FormatPrecision - NDigits + 1,
'0');
4267 Str.push_back(TruncateZero ?
'E' :
'e');
4269 Str.push_back(
exp >= 0 ?
'+' :
'-');
4278 if (!TruncateZero && expbuf.
size() < 2)
4280 for (
unsigned I = 0,
E = expbuf.
size();
I !=
E; ++
I)
4281 Str.push_back(expbuf[
E-1-
I]);
4287 for (
unsigned I = 0;
I != NDigits; ++
I)
4288 Str.push_back(buffer[NDigits-1-
I]);
4289 for (
unsigned I = 0;
I != (unsigned)
exp; ++
I)
4297 int NWholeDigits =
exp + (int) NDigits;
4300 if (NWholeDigits > 0) {
4301 for (;
I != (unsigned) NWholeDigits; ++
I)
4302 Str.push_back(buffer[NDigits-
I-1]);
4305 unsigned NZeros = 1 + (unsigned) -NWholeDigits;
4309 for (
unsigned Z = 1;
Z != NZeros; ++
Z)
4313 for (;
I != NDigits; ++
I)
4314 Str.push_back(buffer[NDigits-
I-1]);
4320 unsigned FormatMaxPadding,
bool TruncateZero)
const {
4324 return append(Str,
"-Inf");
4326 return append(Str,
"+Inf");
4328 case fcNaN:
return append(Str,
"NaN");
4334 if (!FormatMaxPadding) {
4336 append(Str,
"0.0E+0");
4339 if (FormatPrecision > 1)
4340 Str.append(FormatPrecision - 1,
'0');
4341 append(Str,
"e+00");
4353 int exp = exponent - ((int) semantics->precision - 1);
4355 semantics->precision,
4358 toStringImpl(Str,
isNegative(),
exp, significand, FormatPrecision,
4359 FormatMaxPadding, TruncateZero);
4371 for (
int i = 0; i < PartCount; ++i) {
4377 if (exponent != semantics->minExponent)
4380 int CountrParts = 0;
4381 for (
int i = 0; i < PartCount;
4383 if (Parts[i] != 0) {
4384 return exponent - semantics->precision + CountrParts +
4447 if (!semantics->hasZero)
4457 }
else if (semantics->nonFiniteBehavior ==
4465 exponent = semantics->maxExponent + 1;
4479 bool WillCrossBinadeBoundary =
4480 exponent != semantics->minExponent && isSignificandAllZeros();
4498 if (WillCrossBinadeBoundary) {
4519 if (WillCrossBinadeBoundary) {
4523 assert(exponent != semantics->maxExponent &&
4524 "We can not increment an exponent beyond the maxExponent allowed"
4525 " by the given floating point semantics.");
4528 incrementSignificand();
4542 assert(
isNaN() &&
"Can only be called on NaN values");
4544 unsigned Bits = semantics->precision - 1;
4549 return ::exponentNaN(*semantics);
4553 return ::exponentInf(*semantics);
4557 return ::exponentZero(*semantics);
4576 if (!semantics->hasZero)
4603 return Arg.exponent;
4608 Normalized.exponent += SignificandBits;
4610 return Normalized.exponent - SignificandBits;
4614 auto MaxExp =
X.getSemantics().maxExponent;
4615 auto MinExp =
X.getSemantics().minExponent;
4623 int SignificandBits =
X.getSemantics().precision - 1;
4624 int MaxIncrement = MaxExp - (MinExp - SignificandBits) + 1;
4627 X.exponent += std::clamp(Exp, -MaxIncrement - 1, MaxIncrement);
4650 return scalbn(Val, -Exp, RM);
4656 APFloat(APFloatBase::semIEEEdouble)}) {
4657 assert(Semantics == &APFloatBase::semPPCDoubleDouble);
4661 : Semantics(&S), Floats(new
APFloat[2]{
4664 assert(Semantics == &APFloatBase::semPPCDoubleDouble);
4670 APFloat(APFloatBase::semIEEEdouble)}) {
4671 assert(Semantics == &APFloatBase::semPPCDoubleDouble);
4677 APFloat(APFloatBase::semIEEEdouble,
APInt(64,
I.getRawData()[0])),
4678 APFloat(APFloatBase::semIEEEdouble,
APInt(64,
I.getRawData()[1]))}) {
4679 assert(Semantics == &APFloatBase::semPPCDoubleDouble);
4685 Floats(new
APFloat[2]{std::move(
First), std::move(Second)}) {
4686 assert(Semantics == &APFloatBase::semPPCDoubleDouble);
4687 assert(&Floats[0].getSemantics() == &APFloatBase::semIEEEdouble);
4688 assert(&Floats[1].getSemantics() == &APFloatBase::semIEEEdouble);
4692 : Semantics(RHS.Semantics),
4696 assert(Semantics == &APFloatBase::semPPCDoubleDouble);
4700 : Semantics(RHS.Semantics), Floats(RHS.Floats) {
4701 RHS.Semantics = &APFloatBase::semBogus;
4702 RHS.Floats =
nullptr;
4703 assert(Semantics == &APFloatBase::semPPCDoubleDouble);
4707 if (Semantics == RHS.Semantics && RHS.Floats) {
4708 Floats[0] = RHS.Floats[0];
4709 Floats[1] = RHS.Floats[1];
4710 }
else if (
this != &RHS) {
4743 Floats[0] = std::move(z);
4744 Floats[1].makeZero(
false);
4757 Status |= z.
add(a, RM);
4758 Status |= z.
add(c, RM);
4761 Floats[0] = std::move(z);
4762 Floats[1].makeZero(
false);
4767 Status |= zz.
add(cc, RM);
4771 Status |= Floats[1].subtract(z, RM);
4772 Status |= Floats[1].add(c, RM);
4773 Status |= Floats[1].add(zz, RM);
4777 Status |= Floats[1].subtract(z, RM);
4778 Status |= Floats[1].add(a, RM);
4779 Status |= Floats[1].add(zz, RM);
4784 Status |=
q.subtract(z, RM);
4789 Status |= zz.
add(c, RM);
4790 Status |=
q.add(z, RM);
4791 Status |=
q.subtract(a, RM);
4793 Status |= zz.
add(q, RM);
4794 Status |= zz.
add(
aa, RM);
4795 Status |= zz.
add(cc, RM);
4797 Floats[0] = std::move(z);
4798 Floats[1].makeZero(
false);
4802 Status |= Floats[0].add(zz, RM);
4804 Floats[1].makeZero(
false);
4807 Floats[1] = std::move(z);
4808 Status |= Floats[1].subtract(Floats[0], RM);
4809 Status |= Floats[1].add(zz, RM);
4835 LHS.isNegative() !=
RHS.isNegative()) {
4836 Out.makeNaN(
false, Out.isNegative(),
nullptr);
4851 assert(&
A.getSemantics() == &APFloatBase::semIEEEdouble);
4852 assert(&AA.getSemantics() == &APFloatBase::semIEEEdouble);
4853 assert(&
C.getSemantics() == &APFloatBase::semIEEEdouble);
4854 assert(&CC.getSemantics() == &APFloatBase::semIEEEdouble);
4855 assert(&Out.Floats[0].getSemantics() == &APFloatBase::semIEEEdouble);
4856 assert(&Out.Floats[1].getSemantics() == &APFloatBase::semIEEEdouble);
4857 return Out.addImpl(
A, AA,
C, CC, RM);
4862 return addWithSpecial(*
this, RHS, *
this, RM);
4868 auto Ret =
add(RHS, RM);
4875 const auto &LHS = *
this;
4892 if (LHS.getCategory() ==
fcNaN) {
4896 if (RHS.getCategory() ==
fcNaN) {
4902 Out.makeNaN(
false,
false,
nullptr);
4914 "Special cases not handled exhaustively");
4917 APFloat A = Floats[0],
B = Floats[1],
C = RHS.Floats[0],
D = RHS.Floats[1];
4921 if (!
T.isFiniteNonZero()) {
4922 Floats[0] = std::move(
T);
4923 Floats[1].makeZero(
false);
4945 Status |= U.add(Tau, RM);
4948 if (!U.isFinite()) {
4949 Floats[1].makeZero(
false);
4954 Floats[1] = std::move(
T);
4961 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
4962 "Unexpected Semantics");
4965 APFloat(APFloatBase::semPPCDoubleDoubleLegacy, RHS.bitcastToAPInt()), RM);
4971 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
4972 "Unexpected Semantics");
4975 APFloat(APFloatBase::semPPCDoubleDoubleLegacy, RHS.bitcastToAPInt()));
4981 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
4982 "Unexpected Semantics");
4985 APFloat(APFloatBase::semPPCDoubleDoubleLegacy, RHS.bitcastToAPInt()));
4994 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
4995 "Unexpected Semantics");
4998 APFloat(APFloatBase::semPPCDoubleDoubleLegacy,
5007 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
5008 "Unexpected Semantics");
5018 if (!
Hi.isFiniteNonZero() ||
Lo.isZero()) {
5019 Floats[0] = std::move(RoundedHi);
5020 Floats[1].makeZero(
false);
5032 const APFloat RoundingError = Rounded - ToRound;
5033 if (TieBreaker.isNonZero() &&
5034 TieBreaker.isNegative() != RoundingError.
isNegative() &&
5035 abs(RoundingError).isExactlyValue(0.5))
5044 if (RoundedHi !=
Hi) {
5049 RoundedHi = RoundToNearestHelper(
Hi, RoundedHi,
Lo);
5051 Floats[0] = std::move(RoundedHi);
5052 Floats[1].makeZero(
false);
5065 LoRoundingMode = RM;
5073 RoundedLo = RoundToNearestHelper(
Lo, RoundedLo,
Hi);
5076 std::tie(RoundedHi, RoundedLo) =
fastTwoSum(RoundedHi, RoundedLo);
5078 Floats[0] = std::move(RoundedHi);
5079 Floats[1] = std::move(RoundedLo);
5084 Floats[0].changeSign();
5085 Floats[1].changeSign();
5091 const cmpResult HiPartCmp = Floats[0].compareAbsoluteValue(RHS.Floats[0]);
5096 if (Floats[1].
isZero() && RHS.Floats[1].isZero())
5102 const bool ThisIsSubtractive =
5103 Floats[0].isNegative() != Floats[1].isNegative();
5104 const bool RHSIsSubtractive =
5105 RHS.Floats[0].isNegative() != RHS.Floats[1].isNegative();
5115 if (RHS.Floats[1].isZero())
5122 if (ThisIsSubtractive != RHSIsSubtractive)
5127 const cmpResult LoPartCmp = Floats[1].compareAbsoluteValue(RHS.Floats[1]);
5129 if (ThisIsSubtractive) {
5143 return Floats[0].getCategory();
5149 Floats[0].makeInf(Neg);
5150 Floats[1].makeZero(
false);
5154 Floats[0].makeZero(Neg);
5155 Floats[1].makeZero(
false);
5159 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
5160 "Unexpected Semantics");
5162 APFloat(APFloatBase::semIEEEdouble,
APInt(64, 0x7fefffffffffffffull));
5164 APFloat(APFloatBase::semIEEEdouble,
APInt(64, 0x7c8ffffffffffffeull));
5170 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
5171 "Unexpected Semantics");
5172 Floats[0].makeSmallest(Neg);
5173 Floats[1].makeZero(
false);
5177 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
5178 "Unexpected Semantics");
5180 APFloat(APFloatBase::semIEEEdouble,
APInt(64, 0x0360000000000000ull));
5182 Floats[0].changeSign();
5183 Floats[1].makeZero(
false);
5187 Floats[0].makeNaN(SNaN, Neg,
fill);
5188 Floats[1].makeZero(
false);
5192 auto Result = Floats[0].compare(RHS.Floats[0]);
5195 return Floats[1].compare(RHS.Floats[1]);
5200 return Floats[0].bitwiseIsEqual(RHS.Floats[0]) &&
5201 Floats[1].bitwiseIsEqual(RHS.Floats[1]);
5211 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
5212 "Unexpected Semantics");
5214 Floats[0].bitcastToAPInt().getRawData()[0],
5215 Floats[1].bitcastToAPInt().getRawData()[0],
5222 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
5223 "Unexpected Semantics");
5224 APFloat Tmp(APFloatBase::semPPCDoubleDoubleLegacy);
5237 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
5238 "Unexpected Semantics");
5288 if (InLattice(HiOld, NextLo)) {
5290 Floats[1] = std::move(NextLo);
5327 if (!InLattice(NextHi, NextLo))
5331 Floats[0] = std::move(NextHi);
5332 Floats[1] = std::move(NextLo);
5340 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
5341 "Unexpected Semantics");
5383 const unsigned PositiveOverflowWidth = IsSigned ? Width - 1 : Width;
5384 if (HiExactLog2 >= 0 &&
5385 static_cast<unsigned>(HiExactLog2) == PositiveOverflowWidth) {
5395 Input, Width,
true, RM, &LoIsExact);
5408 *IsExact = RoundStatus ==
opOK;
5420 APSInt LoResult{Width, !IsSigned};
5432 *IsExact = RoundStatus ==
opOK;
5438 unsigned int Width,
bool IsSigned,
5441 convertToSignExtendedInteger(
Input, Width, IsSigned, RM, IsExact);
5445 assert(DstPartsCount <=
Input.size() &&
"Integer too big");
5453 Bits = Width - IsSigned;
5498 if (SrcMSB == UINT_MAX) {
5505 const unsigned SrcBitWidth = SrcMSB + 1;
5521 return handleOverflow(RM);
5527 bool HiAsIntIsExact;
5544 if (
Error.isNegative()) {
5552 const unsigned ErrorActiveBits =
Error.getSignificantBits() - 1;
5554 if (ErrorActiveBits > LoPrecision) {
5555 const unsigned RoundingBoundary = ErrorActiveBits - LoPrecision;
5559 if (
Error.countTrailingZeros() == RoundingBoundary - 1)
5578 Floats[0] = std::move(
Hi);
5579 Floats[1] = std::move(
Lo);
5584 return handleOverflow(RM);
5590 Largest.makeLargest(
false);
5592 return handleOverflow(RM);
5604 const bool NegateInput = IsSigned &&
Input.isNegative();
5617 unsigned int HexDigits,
5620 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
5621 "Unexpected Semantics");
5628 (Floats[0].isDenormal() || Floats[1].
isDenormal() ||
5630 Floats[0] != Floats[0] + Floats[1]);
5659 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
5660 "Unexpected Semantics");
5661 return Floats[0].isInteger() && Floats[1].isInteger();
5665 unsigned FormatPrecision,
5666 unsigned FormatMaxPadding,
5667 bool TruncateZero)
const {
5668 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
5669 "Unexpected Semantics");
5671 .
toString(Str, FormatPrecision, FormatMaxPadding, TruncateZero);
5691 if (
Lo.isZero() ||
Hi.isNegative() ==
Lo.isNegative())
5693 if (
Hi.getExactLog2Abs() == INT_MIN)
5697 return IlogbResult - 1;
5703 "Unexpected Semantics");
5705 scalbn(Arg.Floats[0], Exp, RM),
5706 scalbn(Arg.Floats[1], Exp, RM));
5712 "Unexpected Semantics");
5722 Quiet.getFirst() =
Quiet.getFirst().makeQuiet();
5744 const bool SignsDisagree =
Hi.isNegative() !=
Lo.isNegative();
5761 LoRoundingMode = RM;
5762 Second =
scalbn(
Lo, -Exp, LoRoundingMode);
5770 if (RecomposedLo !=
Lo) {
5774 const APFloat RoundingError = RecomposedLo -
Lo;
5779 const APFloat ScaledUlpOfSecond =
5781 const bool IsMidpoint =
abs(RoundingError) == ScaledUlpOfSecond;
5782 const bool RoundedLoAway =
5787 if (IsMidpoint && RoundedLoAway)
5803 if (Second.
isZero() && SignsDisagree &&
Hi.getExactLog2Abs() != INT_MIN)
5815APFloat::Storage::Storage(IEEEFloat
F,
const fltSemantics &Semantics) {
5820 if (usesLayout<DoubleAPFloat>(
Semantics)) {
5835 if (APFloat::usesLayout<detail::IEEEFloat>(Arg.
getSemantics()))
5837 if (APFloat::usesLayout<detail::DoubleAPFloat>(Arg.
getSemantics()))
5845 assert(StatusOrErr &&
"Invalid floating point representation");
5897 APFloat Reciprocal =
5915 *Inv = std::move(Reciprocal);
5927 usesLayout<IEEEFloat>(ToSemantics))
5928 return U.IEEE.convert(ToSemantics, RM, losesInfo);
5930 usesLayout<DoubleAPFloat>(ToSemantics)) {
5931 assert(&ToSemantics == &APFloatBase::semPPCDoubleDouble);
5933 U.IEEE.convert(APFloatBase::semPPCDoubleDoubleLegacy, RM, losesInfo);
5934 *
this =
APFloat(ToSemantics, U.IEEE.bitcastToAPInt());
5938 usesLayout<IEEEFloat>(ToSemantics)) {
5939 auto Ret = getIEEE().convert(ToSemantics, RM, losesInfo);
5940 *
this =
APFloat(std::move(getIEEE()), ToSemantics);
5956#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
5969 bool *isExact)
const {
5973 rounding_mode, isExact);
5975 result =
APInt(bitWidth, parts);
5981 return getIEEE().convertToDouble();
5983 "Float semantics is not representable by IEEEdouble");
5984 APFloat Temp = *
this;
5992#ifdef HAS_IEE754_FLOAT128
5993float128 APFloat::convertToQuad()
const {
5995 return getIEEE().convertToQuad();
5997 "Float semantics is not representable by IEEEquad");
6003 return Temp.getIEEE().convertToQuad();
6009 return getIEEE().convertToFloat();
6011 "Float semantics is not representable by IEEEsingle");
6012 APFloat Temp = *
this;
6022 "Float8E5M2",
"Float8E5M2FNUZ",
"Float8E4M3",
"Float8E4M3FN",
6023 "Float8E4M3FNUZ",
"Float8E4M3B11FNUZ",
"Float8E3M4",
"Float8E8M0FNU",
6024 "Float6E3M2FN",
"Float6E2M3FN",
"Float4E2M1FN"};
6032 .
Case(
"Float8E5M2", &semFloat8E5M2)
6033 .
Case(
"Float8E4M3FN", &semFloat8E4M3FN)
6034 .
Case(
"Float4E2M1FN", &semFloat4E2M1FN)
6035 .
Case(
"Float6E3M2FN", &semFloat6E3M2FN)
6036 .
Case(
"Float6E2M3FN", &semFloat6E2M3FN)
6040APFloat::Storage::~Storage() {
6041 if (usesLayout<IEEEFloat>(*semantics)) {
6045 if (usesLayout<DoubleAPFloat>(*semantics)) {
6052APFloat::Storage::Storage(
const APFloat::Storage &
RHS) {
6053 if (usesLayout<IEEEFloat>(*
RHS.semantics)) {
6057 if (usesLayout<DoubleAPFloat>(*
RHS.semantics)) {
6064APFloat::Storage::Storage(APFloat::Storage &&
RHS) {
6065 if (usesLayout<IEEEFloat>(*
RHS.semantics)) {
6069 if (usesLayout<DoubleAPFloat>(*
RHS.semantics)) {
6076APFloat::Storage &APFloat::Storage::operator=(
const APFloat::Storage &
RHS) {
6077 if (usesLayout<IEEEFloat>(*semantics) &&
6078 usesLayout<IEEEFloat>(*
RHS.semantics)) {
6080 }
else if (usesLayout<DoubleAPFloat>(*semantics) &&
6081 usesLayout<DoubleAPFloat>(*
RHS.semantics)) {
6083 }
else if (
this != &
RHS) {
6085 new (
this) Storage(
RHS);
6090APFloat::Storage &APFloat::Storage::operator=(APFloat::Storage &&
RHS) {
6091 if (usesLayout<IEEEFloat>(*semantics) &&
6092 usesLayout<IEEEFloat>(*
RHS.semantics)) {
6094 }
else if (usesLayout<DoubleAPFloat>(*semantics) &&
6095 usesLayout<DoubleAPFloat>(*
RHS.semantics)) {
6097 }
else if (
this != &
RHS) {
6099 new (
this) Storage(std::move(
RHS));
6108 if (libc_exceptions & FE_INVALID)
6110 if (libc_exceptions & FE_DIVBYZERO)
6112 if (libc_exceptions & FE_OVERFLOW)
6114 if (libc_exceptions & FE_UNDERFLOW)
6116 if (libc_exceptions & FE_INEXACT)
6131 float x_val = x.convertToFloat();
6133 LIBC_NAMESPACE::shared::check::exp_exceptions(x_val, FE_TONEAREST);
6135 *status = getOpStatusFromLibc(exc);
6136 if (x.isSignaling()) {
6143 float result = LIBC_NAMESPACE::shared::expf(x_val);
6148 double x_val = x.convertToDouble();
6150 LIBC_NAMESPACE::shared::check::exp_exceptions(x_val, FE_TONEAREST);
6152 *status = getOpStatusFromLibc(exc);
6153 if (x.isSignaling()) {
6160 double result = LIBC_NAMESPACE::shared::exp(x_val);
6164 return std::nullopt;
6169#undef APFLOAT_DISPATCH_ON_SEMANTICS
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
#define PackCategoriesIntoKey(_lhs, _rhs)
A macro used to combine two fcCategory enums into one key which can be used in a switch statement to ...
This file declares a class to represent arbitrary precision floating point values and provide a varie...
#define APFLOAT_DISPATCH_ON_SEMANTICS(METHOD_CALL)
This file implements the APSInt class, which is a simple class that represents an arbitrary sized int...
Function Alias Analysis false
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
#define LLVM_DUMP_METHOD
Mark debug helper function definitions like dump() that should not be stripped from debug builds.
static bool isNeg(Value *V)
Returns true if the operation is a negation of V, and it works for both integers and floats.
static bool isSigned(unsigned Opcode)
Utilities for dealing with flags related to floating point properties and mode controls.
This file defines a hash set that can be used to remove duplication of nodes in a graph.
static bool isZero(Value *V, const DataLayout &DL, DominatorTree *DT, AssumptionCache *AC)
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 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)
Fill this APFloat with the result of a string conversion.
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.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
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.
This class is used to gather all the unique data bits of a node.
Represent a mutable reference to an array (0 or more elements consecutively in memory),...
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...
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
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
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
Get the string size.
char front() const
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 APInt getNaNPayload() const
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)
LLVM_ABI APInt getNaNPayload() const
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
FormattedNumber decValue(uint64_t N, unsigned Width=DEC_WIDTH)
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_READONLY LLVM_ABI std::optional< APFloat > exp(const APFloat &X, RoundingMode RM=APFloat::rmNearestTiesToEven, APFloat::opStatus *Status=nullptr)
Implement IEEE 754-2019 exp functions.
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[]
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