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 = {16383, -16382, 64,
108constexpr fltSemantics APFloatBase::semBogus = {0, 0, 0, 0};
109constexpr fltSemantics APFloatBase::semPPCDoubleDouble = {-1, 0, 0, 128};
110constexpr fltSemantics APFloatBase::semPPCDoubleDoubleLegacy = {
111 1023, -1022 + 53, 53 + 53, 128};
207 return A.maxExponent <=
B.maxExponent &&
A.minExponent >=
B.minExponent &&
208 A.precision <=
B.precision;
282 if (Src.maxExponent >= Dst.maxExponent || Src.minExponent <= Dst.minExponent)
290 return Dst.precision >= Src.precision;
330static inline unsigned int
343 const unsigned int overlargeExponent = 24000;
347 if (p == end || ((*p ==
'-' || *p ==
'+') && (p + 1) == end))
350 bool isNegative = *p ==
'-';
351 if (*p ==
'-' || *p ==
'+') {
358 if (absExponent >= 10U)
359 return createError(
"Invalid character in exponent");
361 for (; p != end; ++p) {
364 return createError(
"Invalid character in exponent");
366 absExponent = absExponent * 10U + value;
367 if (absExponent >= overlargeExponent) {
368 absExponent = overlargeExponent;
374 return -(int) absExponent;
376 return (
int) absExponent;
383 int exponentAdjustment) {
389 bool negative = *p ==
'-';
390 if (*p ==
'-' || *p ==
'+') {
396 int unsignedExponent = 0;
397 bool overflow =
false;
398 for (; p != end; ++p) {
403 return createError(
"Invalid character in exponent");
405 unsignedExponent = unsignedExponent * 10 + value;
406 if (unsignedExponent > 32767) {
412 if (exponentAdjustment > 32767 || exponentAdjustment < -32768)
416 exponent = unsignedExponent;
418 exponent = -exponent;
419 exponent += exponentAdjustment;
420 if (exponent > 32767 || exponent < -32768)
425 exponent = negative ? -32768: 32767;
435 while (p != end && *p ==
'0')
438 if (p != end && *p ==
'.') {
441 if (end - begin == 1)
444 while (p != end && *p ==
'0')
477 return PtrOrErr.takeError();
480 D->firstSigDigit = p;
482 D->normalizedExponent = 0;
484 for (; p != end; ++p) {
487 return createError(
"String contains multiple dots");
497 if (*p !=
'e' && *p !=
'E')
498 return createError(
"Invalid character in significand");
501 if (dot != end && p - begin == 1)
507 return ExpOrErr.takeError();
508 D->exponent = *ExpOrErr;
516 if (p !=
D->firstSigDigit) {
522 while (p != begin && *p ==
'0');
523 while (p != begin && *p ==
'.');
528 D->normalizedExponent = (
D->exponent +
530 - (dot >
D->firstSigDigit && dot < p)));
542 unsigned int digitValue) {
547 else if (digitValue < 8 && digitValue > 0)
551 while (p != end && (*p ==
'0' || *p ==
'.'))
555 return createError(
"Invalid trailing hexadecimal fraction!");
561 if (hexDigit == UINT_MAX)
571 unsigned int partCount,
596 return lost_fraction;
611 return moreSignificant;
622HUerrBound(
bool inexactMultiply,
unsigned int HUerr1,
unsigned int HUerr2)
624 assert(HUerr1 < 2 || HUerr2 < 2 || (HUerr1 + HUerr2 < 8));
626 if (HUerr1 + HUerr2 == 0)
627 return inexactMultiply * 2;
629 return inexactMultiply + 2 * (HUerr1 + HUerr2);
655 if (part - boundary <= boundary - part)
656 return part - boundary;
658 return boundary - part;
661 if (part == boundary) {
667 }
else if (part == boundary - 1) {
684 pow5s[0] = 78125 * 5;
686 unsigned int partsCount = 1;
693 *p1 = firstEightPowers[power & 7];
699 for (
unsigned int n = 0; power; power >>= 1, n++) {
703 partsCount, partsCount);
705 if (pow5[partsCount - 1] == 0)
713 result += partsCount;
714 if (p2[result - 1] == 0)
739static const char NaNL[] =
"nan";
740static const char NaNU[] =
"NAN";
747 const char *hexDigitChars)
749 unsigned int result =
count;
755 dst[
count] = hexDigitChars[part & 0xf];
795 switch (
X.getCategory()) {
805 if (
X.isDenormal() ||
X.isSmallestNormalized())
808 if (
X.getExactLog2() != INT_MIN)
816void IEEEFloat::initialize(
const fltSemantics *ourSemantics) {
817 semantics = ourSemantics;
818 unsigned count = partCount();
823void IEEEFloat::freeSignificand() {
825 delete [] significand.parts;
828void IEEEFloat::assign(
const IEEEFloat &rhs) {
829 assert(semantics == rhs.semantics);
832 category = rhs.category;
833 exponent = rhs.exponent;
835 copySignificand(rhs);
838void IEEEFloat::copySignificand(
const IEEEFloat &rhs) {
840 assert(rhs.partCount() >= partCount());
853 if (Negative && !semantics->hasSignedRepr)
855 "This floating point format does not support signed values");
859 exponent = exponentNaN();
862 unsigned numParts = partCount();
875 fill = &fill_storage;
879 if (!
fill ||
fill->getNumWords() < numParts)
883 std::min(
fill->getNumWords(), numParts));
886 unsigned bitsToPreserve = semantics->precision - 1;
887 unsigned part = bitsToPreserve / 64;
888 bitsToPreserve %= 64;
889 significand[part] &= ((1ULL << bitsToPreserve) - 1);
890 for (part++; part != numParts; ++part)
891 significand[part] = 0;
895 (semantics->precision >= 2) ? (semantics->precision - 2) : 0;
917 if (semantics == &APFloatBase::semX87DoubleExtended)
923 if (semantics != rhs.semantics) {
925 initialize(rhs.semantics);
936 semantics = rhs.semantics;
937 significand = rhs.significand;
938 exponent = rhs.exponent;
939 category = rhs.category;
942 rhs.semantics = &APFloatBase::semBogus;
948 (exponent == semantics->minExponent) &&
958 significandMSB() == 0;
963 isSignificandAllZerosExceptMSB();
966unsigned int IEEEFloat::getNumHighBits()
const {
973 const unsigned int NumHighBits = (semantics->
precision > 1)
979bool IEEEFloat::isSignificandAllOnes()
const {
984 for (
unsigned i = 0; i < PartCount - 1; i++)
989 const unsigned NumHighBits = getNumHighBits();
990 assert(NumHighBits <= integerPartWidth && NumHighBits > 0 &&
991 "Can not have more high bits to fill than integerPartWidth");
994 if ((semantics->
precision <= 1) || (~(Parts[PartCount - 1] | HighBitFill)))
1000bool IEEEFloat::isSignificandAllOnesExceptLSB()
const {
1009 for (
unsigned i = 0; i < PartCount - 1; i++) {
1010 if (~Parts[i] & ~
unsigned{!i})
1015 const unsigned NumHighBits = getNumHighBits();
1016 assert(NumHighBits <= integerPartWidth && NumHighBits > 0 &&
1017 "Can not have more high bits to fill than integerPartWidth");
1020 if (~(Parts[PartCount - 1] | HighBitFill | 0x1))
1026bool IEEEFloat::isSignificandAllZeros()
const {
1032 for (
unsigned i = 0; i < PartCount - 1; i++)
1037 const unsigned NumHighBits = getNumHighBits();
1039 "clear than integerPartWidth");
1040 const integerPart HighBitMask = ~integerPart(0) >> NumHighBits;
1042 if ((semantics->precision > 1) && (Parts[PartCount - 1] & HighBitMask))
1048bool IEEEFloat::isSignificandAllZerosExceptMSB()
const {
1052 for (
unsigned i = 0; i < PartCount - 1; i++) {
1057 const unsigned NumHighBits = getNumHighBits();
1060 return ((semantics->precision <= 1) || (Parts[PartCount - 1] == MSBMask));
1064 bool IsMaxExp =
isFiniteNonZero() && exponent == semantics->maxExponent;
1071 ? isSignificandAllOnesExceptLSB()
1076 return IsMaxExp && isSignificandAllOnes();
1091 if (semantics != rhs.semantics ||
1092 category != rhs.category ||
1101 return std::equal(significandParts(), significandParts() + partCount(),
1102 rhs.significandParts());
1106 initialize(&ourSemantics);
1111 significandParts()[0] =
value;
1116 initialize(&ourSemantics);
1132 initialize(rhs.semantics);
1137 *
this = std::move(rhs);
1142unsigned int IEEEFloat::partCount()
const {
1147 return const_cast<IEEEFloat *
>(
this)->significandParts();
1151 if (partCount() > 1)
1152 return significand.parts;
1154 return &significand.part;
1157void IEEEFloat::zeroSignificand() {
1162void IEEEFloat::incrementSignificand() {
1174 assert(semantics == rhs.semantics);
1175 assert(exponent == rhs.exponent);
1177 return APInt::tcAdd(parts, rhs.significandParts(), 0, partCount());
1186 assert(semantics == rhs.semantics);
1187 assert(exponent == rhs.exponent);
1198 bool ignoreAddend) {
1202 assert(semantics == rhs.semantics);
1204 unsigned precision = semantics->precision;
1212 newPartsCount > 4 ?
new integerPart[newPartsCount] : scratch;
1215 unsigned partsCount = partCount();
1218 rhs.significandParts(), partsCount, partsCount);
1222 unsigned omsb =
APInt::tcMSB(fullSignificand, newPartsCount) + 1;
1223 exponent += rhs.exponent;
1237 if (!ignoreAddend && addend.isNonZero()) {
1241 Significand savedSignificand = significand;
1242 const fltSemantics *savedSemantics = semantics;
1245 unsigned extendedPrecision = 2 * precision + 1;
1246 if (omsb != extendedPrecision - 1) {
1247 assert(extendedPrecision > omsb);
1249 (extendedPrecision - 1) - omsb);
1250 exponent -= (extendedPrecision - 1) - omsb;
1254 fltSemantics extendedSemantics = *semantics;
1255 extendedSemantics.
precision = extendedPrecision;
1257 if (newPartsCount == 1)
1258 significand.part = fullSignificand[0];
1260 significand.parts = fullSignificand;
1261 semantics = &extendedSemantics;
1274 lost_fraction = extendedAddend.shiftSignificandRight(1);
1276 "Lost precision while shifting addend for fused-multiply-add.");
1278 lost_fraction = addOrSubtractSignificand(extendedAddend,
false);
1281 if (newPartsCount == 1)
1282 fullSignificand[0] = significand.part;
1283 significand = savedSignificand;
1284 semantics = savedSemantics;
1286 omsb =
APInt::tcMSB(fullSignificand, newPartsCount) + 1;
1293 exponent -= precision + 1;
1302 if (omsb > precision) {
1303 unsigned int bits, significantParts;
1306 bits = omsb - precision;
1308 lf =
shiftRight(fullSignificand, significantParts, bits);
1315 if (newPartsCount > 4)
1316 delete [] fullSignificand;
1318 return lost_fraction;
1327 return multiplySignificand(rhs,
IEEEFloat(*semantics), !semantics->hasZero);
1334 assert(semantics == rhs.semantics);
1337 const integerPart *rhsSignificand = rhs.significandParts();
1338 unsigned partsCount = partCount();
1341 partsCount > 2 ?
new integerPart[partsCount * 2] : scratch;
1345 for (
unsigned i = 0; i < partsCount; i++) {
1346 dividend[i] = lhsSignificand[i];
1347 divisor[i] = rhsSignificand[i];
1348 lhsSignificand[i] = 0;
1351 exponent -= rhs.exponent;
1353 unsigned int precision = semantics->precision;
1356 unsigned bit = precision -
APInt::tcMSB(divisor, partsCount) - 1;
1363 bit = precision -
APInt::tcMSB(dividend, partsCount) - 1;
1379 for (bit = precision; bit; bit -= 1) {
1404 return lost_fraction;
1407unsigned int IEEEFloat::significandMSB()
const {
1411unsigned int IEEEFloat::significandLSB()
const {
1416lostFraction IEEEFloat::shiftSignificandRight(
unsigned int bits) {
1422 return shiftRight(significandParts(), partCount(), bits);
1426void IEEEFloat::shiftSignificandLeft(
unsigned int bits) {
1427 assert(bits < semantics->precision ||
1428 (semantics->precision == 1 && bits <= 1));
1431 unsigned int partsCount = partCount();
1441 assert(semantics == rhs.semantics);
1445 int compare = exponent - rhs.exponent;
1497 exponent = semantics->maxExponent;
1499 semantics->precision);
1512bool IEEEFloat::roundAwayFromZero(
roundingMode rounding_mode,
1514 unsigned int bit)
const {
1521 switch (rounding_mode) {
1557 unsigned omsb = significandMSB() + 1;
1564 int exponentChange = omsb - semantics->precision;
1568 if (exponent + exponentChange > semantics->maxExponent)
1569 return handleOverflow(rounding_mode);
1573 if (exponent + exponentChange < semantics->minExponent)
1574 exponentChange = semantics->minExponent - exponent;
1577 if (exponentChange < 0) {
1580 shiftSignificandLeft(-exponentChange);
1585 if (exponentChange > 0) {
1589 lf = shiftSignificandRight(exponentChange);
1594 if (omsb > (
unsigned) exponentChange)
1595 omsb -= exponentChange;
1605 exponent == semantics->maxExponent && isSignificandAllOnes())
1606 return handleOverflow(rounding_mode);
1619 if (!semantics->hasZero)
1627 if (roundAwayFromZero(rounding_mode, lost_fraction, 0)) {
1629 exponent = semantics->minExponent;
1631 incrementSignificand();
1632 omsb = significandMSB() + 1;
1635 if (omsb == (
unsigned) semantics->precision + 1) {
1639 if (exponent == semantics->maxExponent)
1646 shiftSignificandRight(1);
1655 exponent == semantics->maxExponent && isSignificandAllOnes())
1656 return handleOverflow(rounding_mode);
1661 if (omsb == semantics->precision)
1665 assert(omsb < semantics->precision);
1675 if (!semantics->hasZero)
1747 subtract ^=
static_cast<bool>(sign ^ rhs.sign);
1750 int bits = exponent - rhs.exponent;
1754 if ((bits < 0) && !semantics->hasSignedRepr)
1756 "This floating point format does not support signed values");
1759 bool lost_fraction_is_from_rhs =
false;
1763 else if (bits > 0) {
1764 lost_fraction = temp_rhs.shiftSignificandRight(bits - 1);
1765 lost_fraction_is_from_rhs =
true;
1766 shiftSignificandLeft(1);
1768 lost_fraction = shiftSignificandRight(-bits - 1);
1769 temp_rhs.shiftSignificandLeft(1);
1776 lost_fraction !=
lfExactlyZero && !lost_fraction_is_from_rhs;
1785 carry = temp_rhs.subtractSignificand(*
this, borrow);
1786 copySignificand(temp_rhs);
1789 bool borrow = lost_fraction !=
lfExactlyZero && lost_fraction_is_from_rhs;
1798 carry = subtractSignificand(temp_rhs, borrow);
1801 if (lost_fraction !=
lfExactlyZero && lost_fraction_is_from_rhs) {
1814 lost_fraction = temp_rhs.shiftSignificandRight(bits);
1815 carry = addSignificand(temp_rhs);
1817 lost_fraction = shiftSignificandRight(-bits);
1818 carry = addSignificand(rhs);
1825 return lost_fraction;
2018 lost_fraction = addOrSubtractSignificand(rhs,
subtract);
2019 fs = normalize(rounding_mode, lost_fraction);
2028 if (category ==
fcZero) {
2042 return addOrSubtract(rhs, rounding_mode,
false);
2048 return addOrSubtract(rhs, rounding_mode,
true);
2061 fs = normalize(rounding_mode, lost_fraction);
2079 fs = normalize(rounding_mode, lost_fraction);
2089 unsigned int origSign = sign;
2198 unsigned int origSign = sign;
2219 if (!semantics->hasZero && this->isSmallest())
2239 sign ^= multiplicand.sign;
2248 lost_fraction = multiplySignificand(multiplicand, addend);
2249 fs = normalize(rounding_mode, lost_fraction);
2262 fs = multiplySpecials(multiplicand);
2272 fs = addOrSubtract(addend, rounding_mode,
false);
2344 MagicConstant.sign = sign;
2350 fs =
add(MagicConstant, rounding_mode);
2354 subtract(MagicConstant, rounding_mode);
2365 assert(semantics == rhs.semantics);
2397 if (sign == rhs.sign)
2413 if (sign != rhs.sign) {
2449 unsigned oldPartCount = partCount();
2452 bool X86SpecialNan =
false;
2453 if (&fromSemantics == &APFloatBase::semX87DoubleExtended &&
2454 &toSemantics != &APFloatBase::semX87DoubleExtended && category ==
fcNaN &&
2455 (!(*significandParts() & 0x8000000000000000ULL) ||
2456 !(*significandParts() & 0x4000000000000000ULL))) {
2459 X86SpecialNan =
true;
2470 int omsb = significandMSB() + 1;
2471 int exponentChange = omsb - fromSemantics.
precision;
2472 if (exponent + exponentChange < toSemantics.
minExponent)
2473 exponentChange = toSemantics.
minExponent - exponent;
2474 exponentChange = std::max(exponentChange, shift);
2475 if (exponentChange < 0) {
2476 shift -= exponentChange;
2477 exponent += exponentChange;
2478 }
else if (omsb <= -shift) {
2479 exponentChange = omsb + shift - 1;
2480 shift -= exponentChange;
2481 exponent += exponentChange;
2487 (category ==
fcNaN && semantics->nonFiniteBehavior !=
2492 if (newPartCount > oldPartCount) {
2500 significand.parts = newParts;
2501 }
else if (newPartCount == 1 && oldPartCount != 1) {
2505 newPart = significandParts()[0];
2507 significand.part = newPart;
2511 semantics = &toSemantics;
2520 *losesInfo = (
fs !=
opOK);
2521 }
else if (category ==
fcNaN) {
2539 if (!X86SpecialNan && semantics == &APFloatBase::semX87DoubleExtended)
2556 }
else if (category ==
fcZero &&
2569 if (category ==
fcZero && !semantics->hasZero)
2594 assert(dstPartsCount <= parts.
size() &&
"Integer too big");
2596 if (category ==
fcZero) {
2605 unsigned truncatedBits;
2613 truncatedBits = semantics->
precision -1U - exponent;
2617 unsigned int bits = exponent + 1U;
2623 if (bits < semantics->precision) {
2625 truncatedBits = semantics->
precision - bits;
2632 bits - semantics->precision);
2640 if (truncatedBits) {
2644 roundAwayFromZero(rounding_mode, lost_fraction, truncatedBits)) {
2664 if (omsb == width &&
2700 rounding_mode, isExact);
2703 unsigned int bits, dstPartsCount;
2706 assert(dstPartsCount <= parts.
size() &&
"Integer too big");
2708 if (category ==
fcNaN)
2731 unsigned dstCount = partCount();
2732 unsigned precision = semantics->
precision;
2737 if (precision <= omsb) {
2738 exponent = omsb - 1;
2743 exponent = precision - 1;
2748 return normalize(rounding_mode, lost_fraction);
2762 return convertFromUnsignedParts(api.
getRawData(), partCount, rounding_mode);
2766IEEEFloat::convertFromHexadecimalString(
StringRef s,
2775 unsigned partsCount = partCount();
2777 bool computedTrailingFraction =
false;
2785 return PtrOrErr.takeError();
2794 return createError(
"String contains multiple dots");
2800 if (hex_value == UINT_MAX)
2810 }
else if (!computedTrailingFraction) {
2813 return FractOrErr.takeError();
2814 lost_fraction = *FractOrErr;
2815 computedTrailingFraction =
true;
2821 return createError(
"Hex strings require an exponent");
2822 if (*p !=
'p' && *p !=
'P')
2823 return createError(
"Invalid character in significand");
2826 if (dot != end && p - begin == 1)
2830 if (p != firstSignificantDigit) {
2839 expAdjustment =
static_cast<int>(
dot - firstSignificantDigit);
2840 if (expAdjustment < 0)
2842 expAdjustment = expAdjustment * 4 - 1;
2846 expAdjustment += semantics->precision;
2852 return ExpOrErr.takeError();
2853 exponent = *ExpOrErr;
2856 return normalize(rounding_mode, lost_fraction);
2860IEEEFloat::roundSignificandWithExponent(
const integerPart *decSigParts,
2861 unsigned sigPartCount,
int exp,
2863 fltSemantics calcSemantics = { 32767, -32767, 0, 0 };
2874 for (;; parts *= 2) {
2875 unsigned int excessPrecision, truncatedBits;
2878 excessPrecision = calcSemantics.
precision - semantics->precision;
2879 truncatedBits = excessPrecision;
2882 decSig.makeZero(sign);
2885 opStatus sigStatus = decSig.convertFromUnsignedParts(
2887 opStatus powStatus = pow5.convertFromUnsignedParts(pow5Parts, pow5PartCount,
2890 decSig.exponent +=
exp;
2894 unsigned int powHUerr;
2898 calcLostFraction = decSig.multiplySignificand(pow5);
2899 powHUerr = powStatus !=
opOK;
2901 calcLostFraction = decSig.divideSignificand(pow5);
2903 if (decSig.exponent < semantics->minExponent) {
2904 excessPrecision += (semantics->minExponent - decSig.exponent);
2905 truncatedBits = excessPrecision;
2906 excessPrecision = std::min(excessPrecision, calcSemantics.
precision);
2915 (decSig.significandParts(), calcSemantics.
precision - 1) == 1);
2920 excessPrecision, isNearest);
2923 if (HUdistance >= HUerr) {
2924 APInt::tcExtract(significandParts(), partCount(), decSig.significandParts(),
2925 calcSemantics.
precision - excessPrecision,
2930 exponent = (decSig.exponent + semantics->precision
2931 - (calcSemantics.
precision - excessPrecision));
2935 return static_cast<opStatus>(normalize(rounding_mode, calcLostFraction) |
2941Expected<APFloat::opStatus>
2942IEEEFloat::convertFromDecimalString(StringRef str,
roundingMode rounding_mode) {
2949 return std::move(Err);
2980 if (!semantics->hasZero)
2985 }
else if (
D.normalizedExponent - 1 > INT_MAX / 42039) {
2986 fs = handleOverflow(rounding_mode);
2992 }
else if (
D.normalizedExponent - 1 < INT_MIN / 42039 ||
2993 (
D.normalizedExponent + 1) * 28738 <=
2994 8651 * (semantics->minExponent - (
int) semantics->precision)) {
3001 }
else if ((
D.normalizedExponent - 1) * 42039
3002 >= 12655 * semantics->maxExponent) {
3004 fs = handleOverflow(rounding_mode);
3007 unsigned int partCount;
3013 partCount =
static_cast<unsigned int>(
D.lastSigDigit -
D.firstSigDigit) + 1;
3031 if (p == str.
end()) {
3036 if (decValue >= 10U) {
3037 delete[] decSignificand;
3038 return createError(
"Invalid character in significand");
3041 val = val * 10 + decValue;
3044 }
while (p <=
D.lastSigDigit && multiplier <= (~ (
integerPart) 0 - 9) / 10);
3048 partCount, partCount + 1,
false);
3052 if (decSignificand[partCount])
3054 }
while (p <=
D.lastSigDigit);
3057 fs = roundSignificandWithExponent(decSignificand, partCount,
3058 D.exponent, rounding_mode);
3060 delete [] decSignificand;
3066bool IEEEFloat::convertFromStringSpecials(StringRef str) {
3067 const size_t MIN_NAME_SIZE = 3;
3069 if (str.
size() < MIN_NAME_SIZE)
3072 if (str ==
"inf" || str ==
"INFINITY" || str ==
"+Inf" || str ==
"+inf") {
3079 if (str.
size() < MIN_NAME_SIZE)
3082 if (str ==
"inf" || str ==
"INFINITY" || str ==
"Inf") {
3091 if (str.
size() < MIN_NAME_SIZE)
3098 makeNaN(IsSignaling, IsNegative);
3103 if (str.
front() ==
'(') {
3105 if (str.
size() <= 2 || str.
back() !=
')')
3112 unsigned Radix = 10;
3113 if (str[0] ==
'0') {
3114 if (str.
size() > 1 && tolower(str[1]) ==
'x') {
3125 makeNaN(IsSignaling, IsNegative, &Payload);
3133Expected<APFloat::opStatus>
3139 if (convertFromStringSpecials(str))
3144 size_t slen = str.
size();
3145 sign = *p ==
'-' ? 1 : 0;
3146 if (sign && !semantics->hasSignedRepr)
3148 "This floating point format does not support signed values");
3150 if (*p ==
'-' || *p ==
'+') {
3157 if (slen >= 2 && p[0] ==
'0' && (p[1] ==
'x' || p[1] ==
'X')) {
3160 return convertFromHexadecimalString(
StringRef(p + 2, slen - 2),
3164 return convertFromDecimalString(
StringRef(p, slen), rounding_mode);
3206 dst +=
sizeof NaNU - 1;
3211 *dst++ = upperCase ?
'X':
'x';
3213 if (hexDigits > 1) {
3215 memset (dst,
'0', hexDigits - 1);
3216 dst += hexDigits - 1;
3218 *dst++ = upperCase ?
'P':
'p';
3223 dst = convertNormalToHexString (dst, hexDigits, upperCase, rounding_mode);
3229 return static_cast<unsigned int>(dst - p);
3236char *IEEEFloat::convertNormalToHexString(
char *dst,
unsigned int hexDigits,
3240 *dst++ = upperCase ?
'X':
'x';
3242 bool roundUp =
false;
3245 const integerPart *significand = significandParts();
3246 unsigned partsCount = partCount();
3250 unsigned valueBits = semantics->
precision + 3;
3255 unsigned outputDigits = (valueBits - significandLSB() + 3) / 4;
3261 if (hexDigits < outputDigits) {
3267 bits = valueBits - hexDigits * 4;
3269 roundUp = roundAwayFromZero(rounding_mode, fraction, bits);
3271 outputDigits = hexDigits;
3281 while (outputDigits &&
count) {
3285 if (--
count == partsCount)
3288 part = significand[
count] << shift;
3296 curDigits = std::min(curDigits, outputDigits);
3297 dst +=
partAsHex (dst, part, curDigits, hexDigitChars);
3298 outputDigits -= curDigits;
3308 }
while (*q ==
'0');
3312 memset (dst,
'0', outputDigits);
3313 dst += outputDigits;
3326 *dst++ = upperCase ?
'P':
'p';
3342 Arg.significandParts(),
3343 Arg.significandParts() + Arg.partCount()));
3355APInt IEEEFloat::convertF80LongDoubleAPFloatToAPInt()
const {
3360 uint64_t myexponent, mysignificand;
3363 myexponent = exponent+16383;
3364 mysignificand = significandParts()[0];
3365 if (myexponent==1 && !(mysignificand & 0x8000000000000000ULL))
3367 }
else if (category==
fcZero) {
3371 myexponent = 0x7fff;
3372 mysignificand = 0x8000000000000000ULL;
3375 myexponent = 0x7fff;
3376 mysignificand = significandParts()[0];
3380 words[0] = mysignificand;
3381 words[1] = ((uint64_t)(sign & 1) << 15) |
3382 (myexponent & 0x7fffLL);
3383 return APInt(80, words);
3386APInt IEEEFloat::convertPPCDoubleDoubleLegacyAPFloatToAPInt()
const {
3388 (
const llvm::fltSemantics *)&APFloatBase::semPPCDoubleDoubleLegacy);
3400 fltSemantics extendedSemantics = *semantics;
3410 words[0] = *
u.convertDoubleAPFloatToAPInt().getRawData();
3416 if (
u.isFiniteNonZero() && losesInfo) {
3424 words[1] = *
v.convertDoubleAPFloatToAPInt().getRawData();
3429 return APInt(128, words);
3432template <const fltSemantics &S>
3433APInt IEEEFloat::convertIEEEFloatToAPInt()
const {
3435 constexpr unsigned int trailing_significand_bits = S.precision - 1;
3436 constexpr int integer_bit_part = trailing_significand_bits /
integerPartWidth;
3439 constexpr uint64_t significand_mask = integer_bit - 1;
3440 constexpr unsigned int exponent_bits =
3441 S.sizeInBits - (S.hasSignedRepr ? 1 : 0) - trailing_significand_bits;
3442 static_assert(exponent_bits < 64);
3443 constexpr uint64_t exponent_mask = (uint64_t{1} << exponent_bits) - 1;
3444 constexpr bool is_zero_exp_reserved = S.hasDenormals || S.hasZero;
3445 constexpr int bias = -(S.minExponent - (is_zero_exp_reserved ? 1 : 0));
3447 uint64_t myexponent;
3452 myexponent = exponent + bias;
3453 std::copy_n(significandParts(), mysignificand.size(),
3454 mysignificand.begin());
3455 if (myexponent == 1 &&
3456 !(significandParts()[integer_bit_part] & integer_bit))
3458 }
else if (category ==
fcZero) {
3461 myexponent = ::exponentZero(S) + bias;
3462 mysignificand.fill(0);
3467 myexponent = ::exponentInf(S) + bias;
3468 mysignificand.fill(0);
3473 myexponent = ::exponentNaN(S) + bias;
3474 std::copy_n(significandParts(), mysignificand.size(),
3475 mysignificand.begin());
3477 std::array<uint64_t, (S.sizeInBits + 63) / 64> words;
3479 std::copy_n(mysignificand.begin(), mysignificand.size(), words.begin());
3480 if constexpr (significand_mask != 0 || trailing_significand_bits == 0) {
3482 words[mysignificand.size() - 1] &= significand_mask;
3484 std::fill(words_iter, words.end(), uint64_t{0});
3485 constexpr size_t last_word = words.size() - 1;
3486 uint64_t shifted_sign =
static_cast<uint64_t
>(sign & 1)
3487 << ((S.sizeInBits - 1) % 64);
3488 words[last_word] |= shifted_sign;
3489 uint64_t shifted_exponent = (myexponent & exponent_mask)
3490 << (trailing_significand_bits % 64);
3491 words[last_word] |= shifted_exponent;
3492 if constexpr (last_word == 0) {
3493 return APInt(S.sizeInBits, words[0]);
3495 return APInt(S.sizeInBits, words);
3498APInt IEEEFloat::convertQuadrupleAPFloatToAPInt()
const {
3499 assert(partCount() == 2);
3500 return convertIEEEFloatToAPInt<APFloatBase::semIEEEquad>();
3503APInt IEEEFloat::convertDoubleAPFloatToAPInt()
const {
3505 return convertIEEEFloatToAPInt<APFloatBase::semIEEEdouble>();
3508APInt IEEEFloat::convertFloatAPFloatToAPInt()
const {
3510 return convertIEEEFloatToAPInt<APFloatBase::semIEEEsingle>();
3513APInt IEEEFloat::convertBFloatAPFloatToAPInt()
const {
3514 assert(partCount() == 1);
3515 return convertIEEEFloatToAPInt<APFloatBase::semBFloat>();
3518APInt IEEEFloat::convertHalfAPFloatToAPInt()
const {
3520 return convertIEEEFloatToAPInt<APFloatBase::APFloatBase::semIEEEhalf>();
3523APInt IEEEFloat::convertFloat8E5M2APFloatToAPInt()
const {
3524 assert(partCount() == 1);
3525 return convertIEEEFloatToAPInt<APFloatBase::semFloat8E5M2>();
3528APInt IEEEFloat::convertFloat8E5M2FNUZAPFloatToAPInt()
const {
3529 assert(partCount() == 1);
3530 return convertIEEEFloatToAPInt<APFloatBase::semFloat8E5M2FNUZ>();
3533APInt IEEEFloat::convertFloat8E4M3APFloatToAPInt()
const {
3534 assert(partCount() == 1);
3535 return convertIEEEFloatToAPInt<APFloatBase::semFloat8E4M3>();
3538APInt IEEEFloat::convertFloat8E4M3FNAPFloatToAPInt()
const {
3539 assert(partCount() == 1);
3540 return convertIEEEFloatToAPInt<APFloatBase::semFloat8E4M3FN>();
3543APInt IEEEFloat::convertFloat8E4M3FNUZAPFloatToAPInt()
const {
3544 assert(partCount() == 1);
3545 return convertIEEEFloatToAPInt<APFloatBase::semFloat8E4M3FNUZ>();
3548APInt IEEEFloat::convertFloat8E4M3B11FNUZAPFloatToAPInt()
const {
3549 assert(partCount() == 1);
3550 return convertIEEEFloatToAPInt<APFloatBase::semFloat8E4M3B11FNUZ>();
3553APInt IEEEFloat::convertFloat8E3M4APFloatToAPInt()
const {
3554 assert(partCount() == 1);
3555 return convertIEEEFloatToAPInt<APFloatBase::semFloat8E3M4>();
3558APInt IEEEFloat::convertFloatTF32APFloatToAPInt()
const {
3559 assert(partCount() == 1);
3560 return convertIEEEFloatToAPInt<APFloatBase::semFloatTF32>();
3563APInt IEEEFloat::convertFloat8E8M0FNUAPFloatToAPInt()
const {
3564 assert(partCount() == 1);
3565 return convertIEEEFloatToAPInt<APFloatBase::semFloat8E8M0FNU>();
3568APInt IEEEFloat::convertFloat6E3M2FNAPFloatToAPInt()
const {
3569 assert(partCount() == 1);
3570 return convertIEEEFloatToAPInt<APFloatBase::semFloat6E3M2FN>();
3573APInt IEEEFloat::convertFloat6E2M3FNAPFloatToAPInt()
const {
3574 assert(partCount() == 1);
3575 return convertIEEEFloatToAPInt<APFloatBase::semFloat6E2M3FN>();
3578APInt IEEEFloat::convertFloat4E2M1FNAPFloatToAPInt()
const {
3579 assert(partCount() == 1);
3580 return convertIEEEFloatToAPInt<APFloatBase::semFloat4E2M1FN>();
3589 return convertHalfAPFloatToAPInt();
3592 return convertBFloatAPFloatToAPInt();
3595 return convertFloatAPFloatToAPInt();
3598 return convertDoubleAPFloatToAPInt();
3601 return convertQuadrupleAPFloatToAPInt();
3605 return convertPPCDoubleDoubleLegacyAPFloatToAPInt();
3608 return convertFloat8E5M2APFloatToAPInt();
3611 return convertFloat8E5M2FNUZAPFloatToAPInt();
3614 return convertFloat8E4M3APFloatToAPInt();
3617 return convertFloat8E4M3FNAPFloatToAPInt();
3620 return convertFloat8E4M3FNUZAPFloatToAPInt();
3624 return convertFloat8E4M3B11FNUZAPFloatToAPInt();
3627 return convertFloat8E3M4APFloatToAPInt();
3630 return convertFloatTF32APFloatToAPInt();
3633 return convertFloat8E8M0FNUAPFloatToAPInt();
3636 return convertFloat6E3M2FNAPFloatToAPInt();
3639 return convertFloat6E2M3FNAPFloatToAPInt();
3642 return convertFloat4E2M1FNAPFloatToAPInt();
3647 return convertF80LongDoubleAPFloatToAPInt();
3652 "Float semantics are not IEEEsingle");
3659 "Float semantics are not IEEEdouble");
3664#ifdef HAS_IEE754_FLOAT128
3665float128 IEEEFloat::convertToQuad()
const {
3667 "Float semantics are not IEEEquads");
3669 return api.bitsToQuad();
3680void IEEEFloat::initFromF80LongDoubleAPInt(
const APInt &api) {
3683 uint64_t myexponent = (i2 & 0x7fff);
3685 uint8_t myintegerbit = mysignificand >> 63;
3687 initialize(&APFloatBase::semX87DoubleExtended);
3690 sign =
static_cast<unsigned int>(i2>>15);
3691 if (myexponent == 0 && mysignificand == 0) {
3693 }
else if (myexponent==0x7fff && mysignificand==0x8000000000000000ULL) {
3695 }
else if ((myexponent == 0x7fff && mysignificand != 0x8000000000000000ULL) ||
3696 (myexponent != 0x7fff && myexponent != 0 && myintegerbit == 0)) {
3698 exponent = exponentNaN();
3699 significandParts()[0] = mysignificand;
3700 significandParts()[1] = 0;
3703 exponent = myexponent - 16383;
3704 significandParts()[0] = mysignificand;
3705 significandParts()[1] = 0;
3711void IEEEFloat::initFromPPCDoubleDoubleLegacyAPInt(
const APInt &api) {
3717 initFromDoubleAPInt(APInt(64, i1));
3718 [[maybe_unused]]
opStatus fs =
convert(APFloatBase::semPPCDoubleDoubleLegacy,
3725 IEEEFloat v(APFloatBase::semIEEEdouble, APInt(64, i2));
3739void IEEEFloat::initFromFloat8E8M0FNUAPInt(
const APInt &api) {
3740 initFromIEEEAPInt<APFloatBase::semFloat8E8M0FNU>(api);
3743template <const fltSemantics &S>
3744void IEEEFloat::initFromIEEEAPInt(
const APInt &api) {
3747 constexpr unsigned int trailing_significand_bits = S.precision - 1;
3750 constexpr uint64_t significand_mask = integer_bit - 1;
3751 constexpr unsigned int exponent_bits =
3752 S.sizeInBits - (S.hasSignedRepr ? 1 : 0) - trailing_significand_bits;
3753 constexpr unsigned int stored_significand_parts =
3755 static_assert(exponent_bits < 64);
3756 constexpr uint64_t exponent_mask = (uint64_t{1} << exponent_bits) - 1;
3757 constexpr bool is_zero_exp_reserved = S.hasDenormals || S.hasZero;
3758 constexpr int bias = -(S.minExponent - (is_zero_exp_reserved ? 1 : 0));
3759 constexpr bool has_significand = trailing_significand_bits > 0;
3763 std::array<integerPart, stored_significand_parts> mysignificand;
3764 if constexpr (has_significand) {
3765 std::copy_n(api.
getRawData(), mysignificand.size(), mysignificand.begin());
3766 if constexpr (significand_mask != 0) {
3767 mysignificand[mysignificand.size() - 1] &= significand_mask;
3770 std::fill_n(mysignificand.begin(), mysignificand.size(), 0);
3773 mysignificand[0] = 1;
3779 uint64_t myexponent =
3780 (last_word >> (trailing_significand_bits % 64)) & exponent_mask;
3783 assert(partCount() == mysignificand.size());
3785 sign = S.hasSignedRepr
3786 ?
static_cast<unsigned int>(last_word >> ((S.sizeInBits - 1) % 64))
3789 bool all_zero_significand =
3792 bool is_zero = myexponent == 0 && all_zero_significand && S.hasZero;
3795 if (myexponent - bias == ::exponentInf(S) && all_zero_significand) {
3801 bool is_nan =
false;
3804 is_nan = myexponent - bias == ::exponentNaN(S) && !all_zero_significand;
3806 bool all_ones_significand =
3807 std::all_of(mysignificand.begin(), mysignificand.end() - 1,
3808 [](
integerPart bits) { return bits == ~integerPart{0}; }) &&
3809 (!significand_mask ||
3810 mysignificand[mysignificand.size() - 1] == significand_mask);
3811 is_nan = myexponent - bias == ::exponentNaN(S) && all_ones_significand;
3813 is_nan = is_zero && sign;
3819 std::copy_n(mysignificand.begin(), mysignificand.size(),
3820 significandParts());
3830 exponent = myexponent - bias;
3831 std::copy_n(mysignificand.begin(), mysignificand.size(), significandParts());
3832 if (myexponent == 0 && S.hasDenormals)
3833 exponent = S.minExponent;
3835 significandParts()[mysignificand.size()-1] |= integer_bit;
3838void IEEEFloat::initFromQuadrupleAPInt(
const APInt &api) {
3839 initFromIEEEAPInt<APFloatBase::semIEEEquad>(api);
3842void IEEEFloat::initFromDoubleAPInt(
const APInt &api) {
3843 initFromIEEEAPInt<APFloatBase::semIEEEdouble>(api);
3846void IEEEFloat::initFromFloatAPInt(
const APInt &api) {
3847 initFromIEEEAPInt<APFloatBase::semIEEEsingle>(api);
3850void IEEEFloat::initFromBFloatAPInt(
const APInt &api) {
3851 initFromIEEEAPInt<APFloatBase::semBFloat>(api);
3854void IEEEFloat::initFromHalfAPInt(
const APInt &api) {
3855 initFromIEEEAPInt<APFloatBase::semIEEEhalf>(api);
3858void IEEEFloat::initFromFloat8E5M2APInt(
const APInt &api) {
3859 initFromIEEEAPInt<APFloatBase::semFloat8E5M2>(api);
3862void IEEEFloat::initFromFloat8E5M2FNUZAPInt(
const APInt &api) {
3863 initFromIEEEAPInt<APFloatBase::semFloat8E5M2FNUZ>(api);
3866void IEEEFloat::initFromFloat8E4M3APInt(
const APInt &api) {
3867 initFromIEEEAPInt<APFloatBase::semFloat8E4M3>(api);
3870void IEEEFloat::initFromFloat8E4M3FNAPInt(
const APInt &api) {
3871 initFromIEEEAPInt<APFloatBase::semFloat8E4M3FN>(api);
3874void IEEEFloat::initFromFloat8E4M3FNUZAPInt(
const APInt &api) {
3875 initFromIEEEAPInt<APFloatBase::semFloat8E4M3FNUZ>(api);
3878void IEEEFloat::initFromFloat8E4M3B11FNUZAPInt(
const APInt &api) {
3879 initFromIEEEAPInt<APFloatBase::semFloat8E4M3B11FNUZ>(api);
3882void IEEEFloat::initFromFloat8E3M4APInt(
const APInt &api) {
3883 initFromIEEEAPInt<APFloatBase::semFloat8E3M4>(api);
3886void IEEEFloat::initFromFloatTF32APInt(
const APInt &api) {
3887 initFromIEEEAPInt<APFloatBase::semFloatTF32>(api);
3890void IEEEFloat::initFromFloat6E3M2FNAPInt(
const APInt &api) {
3891 initFromIEEEAPInt<APFloatBase::semFloat6E3M2FN>(api);
3894void IEEEFloat::initFromFloat6E2M3FNAPInt(
const APInt &api) {
3895 initFromIEEEAPInt<APFloatBase::semFloat6E2M3FN>(api);
3898void IEEEFloat::initFromFloat4E2M1FNAPInt(
const APInt &api) {
3899 initFromIEEEAPInt<APFloatBase::semFloat4E2M1FN>(api);
3905 if (Sem == &APFloatBase::semIEEEhalf)
3906 return initFromHalfAPInt(api);
3907 if (Sem == &APFloatBase::semBFloat)
3908 return initFromBFloatAPInt(api);
3909 if (Sem == &APFloatBase::semIEEEsingle)
3910 return initFromFloatAPInt(api);
3911 if (Sem == &APFloatBase::semIEEEdouble)
3912 return initFromDoubleAPInt(api);
3913 if (Sem == &APFloatBase::semX87DoubleExtended)
3914 return initFromF80LongDoubleAPInt(api);
3915 if (Sem == &APFloatBase::semIEEEquad)
3916 return initFromQuadrupleAPInt(api);
3917 if (Sem == &APFloatBase::semPPCDoubleDoubleLegacy)
3918 return initFromPPCDoubleDoubleLegacyAPInt(api);
3919 if (Sem == &APFloatBase::semFloat8E5M2)
3920 return initFromFloat8E5M2APInt(api);
3921 if (Sem == &APFloatBase::semFloat8E5M2FNUZ)
3922 return initFromFloat8E5M2FNUZAPInt(api);
3923 if (Sem == &APFloatBase::semFloat8E4M3)
3924 return initFromFloat8E4M3APInt(api);
3925 if (Sem == &APFloatBase::semFloat8E4M3FN)
3926 return initFromFloat8E4M3FNAPInt(api);
3927 if (Sem == &APFloatBase::semFloat8E4M3FNUZ)
3928 return initFromFloat8E4M3FNUZAPInt(api);
3929 if (Sem == &APFloatBase::semFloat8E4M3B11FNUZ)
3930 return initFromFloat8E4M3B11FNUZAPInt(api);
3931 if (Sem == &APFloatBase::semFloat8E3M4)
3932 return initFromFloat8E3M4APInt(api);
3933 if (Sem == &APFloatBase::semFloatTF32)
3934 return initFromFloatTF32APInt(api);
3935 if (Sem == &APFloatBase::semFloat8E8M0FNU)
3936 return initFromFloat8E8M0FNUAPInt(api);
3937 if (Sem == &APFloatBase::semFloat6E3M2FN)
3938 return initFromFloat6E3M2FNAPInt(api);
3939 if (Sem == &APFloatBase::semFloat6E2M3FN)
3940 return initFromFloat6E2M3FNAPInt(api);
3941 if (Sem == &APFloatBase::semFloat4E2M1FN)
3942 return initFromFloat4E2M1FNAPInt(api);
3950 if (Negative && !semantics->hasSignedRepr)
3952 "This floating point format does not support signed values");
3959 exponent = semantics->maxExponent;
3963 unsigned PartCount = partCount();
3964 memset(significand, 0xFF,
sizeof(
integerPart)*(PartCount - 1));
3968 const unsigned NumUnusedHighBits =
3975 (semantics->precision > 1))
3982 if (Negative && !semantics->hasSignedRepr)
3984 "This floating point format does not support signed values");
3991 exponent = semantics->minExponent;
3996 if (Negative && !semantics->hasSignedRepr)
3998 "This floating point format does not support signed values");
4007 exponent = semantics->minExponent;
4012 initFromAPInt(&Sem, API);
4025 Buffer.
append(Str.begin(), Str.end());
4030 void AdjustToPrecision(
APInt &significand,
4031 int &
exp,
unsigned FormatPrecision) {
4035 unsigned bitsRequired = (FormatPrecision * 196 + 58) / 59;
4037 if (bits <= bitsRequired)
return;
4039 unsigned tensRemovable = (bits - bitsRequired) * 59 / 196;
4040 if (!tensRemovable)
return;
4042 exp += tensRemovable;
4047 if (tensRemovable & 1)
4049 tensRemovable >>= 1;
4050 if (!tensRemovable)
break;
4054 significand = significand.
udiv(divisor);
4062 int &
exp,
unsigned FormatPrecision) {
4063 unsigned N = buffer.
size();
4064 if (
N <= FormatPrecision)
return;
4067 unsigned FirstSignificant =
N - FormatPrecision;
4074 if (buffer[FirstSignificant - 1] <
'5') {
4075 while (FirstSignificant <
N && buffer[FirstSignificant] ==
'0')
4078 exp += FirstSignificant;
4079 buffer.
erase(&buffer[0], &buffer[FirstSignificant]);
4085 for (
unsigned I = FirstSignificant;
I !=
N; ++
I) {
4086 if (buffer[
I] ==
'9') {
4095 if (FirstSignificant ==
N) {
4096 exp += FirstSignificant;
4102 exp += FirstSignificant;
4103 buffer.
erase(&buffer[0], &buffer[FirstSignificant]);
4107 APInt significand,
unsigned FormatPrecision,
4108 unsigned FormatMaxPadding,
bool TruncateZero) {
4109 const int semanticsPrecision = significand.
getBitWidth();
4116 if (!FormatPrecision) {
4124 FormatPrecision = 2 + semanticsPrecision * 59 / 196;
4129 exp += trailingZeros;
4135 }
else if (
exp > 0) {
4137 significand = significand.
zext(semanticsPrecision +
exp);
4138 significand <<=
exp;
4152 unsigned precision = semanticsPrecision + (137 * texp + 136) / 59;
4156 significand = significand.
zext(precision);
4157 APInt five_to_the_i(precision, 5);
4160 significand *= five_to_the_i;
4165 five_to_the_i *= five_to_the_i;
4169 AdjustToPrecision(significand,
exp, FormatPrecision);
4174 unsigned precision = significand.getBitWidth();
4175 if (precision < 4) {
4178 significand = significand.zext(precision);
4180 APInt ten(precision, 10);
4181 APInt digit(precision, 0);
4183 bool inTrail =
true;
4184 while (significand != 0) {
4189 unsigned d = digit.getZExtValue();
4200 assert(!buffer.
empty() &&
"no characters in buffer!");
4204 AdjustToPrecision(buffer,
exp, FormatPrecision);
4206 unsigned NDigits = buffer.
size();
4209 bool FormatScientific;
4210 if (!FormatMaxPadding) {
4211 FormatScientific =
true;
4217 FormatScientific = ((unsigned)
exp > FormatMaxPadding ||
4218 NDigits + (unsigned)
exp > FormatPrecision);
4221 int MSD =
exp + (int) (NDigits - 1);
4224 FormatScientific =
false;
4228 FormatScientific = ((unsigned) -MSD) > FormatMaxPadding;
4234 if (FormatScientific) {
4235 exp += (NDigits - 1);
4237 Str.push_back(buffer[NDigits-1]);
4239 if (NDigits == 1 && TruncateZero)
4242 for (
unsigned I = 1;
I != NDigits; ++
I)
4243 Str.push_back(buffer[NDigits-1-
I]);
4245 if (!TruncateZero && FormatPrecision > NDigits - 1)
4246 Str.append(FormatPrecision - NDigits + 1,
'0');
4248 Str.push_back(TruncateZero ?
'E' :
'e');
4250 Str.push_back(
exp >= 0 ?
'+' :
'-');
4259 if (!TruncateZero && expbuf.
size() < 2)
4261 for (
unsigned I = 0,
E = expbuf.
size();
I !=
E; ++
I)
4262 Str.push_back(expbuf[
E-1-
I]);
4268 for (
unsigned I = 0;
I != NDigits; ++
I)
4269 Str.push_back(buffer[NDigits-1-
I]);
4270 for (
unsigned I = 0;
I != (unsigned)
exp; ++
I)
4278 int NWholeDigits =
exp + (int) NDigits;
4281 if (NWholeDigits > 0) {
4282 for (;
I != (unsigned) NWholeDigits; ++
I)
4283 Str.push_back(buffer[NDigits-
I-1]);
4286 unsigned NZeros = 1 + (unsigned) -NWholeDigits;
4290 for (
unsigned Z = 1;
Z != NZeros; ++
Z)
4294 for (;
I != NDigits; ++
I)
4295 Str.push_back(buffer[NDigits-
I-1]);
4301 unsigned FormatMaxPadding,
bool TruncateZero)
const {
4305 return append(Str,
"-Inf");
4307 return append(Str,
"+Inf");
4309 case fcNaN:
return append(Str,
"NaN");
4315 if (!FormatMaxPadding) {
4317 append(Str,
"0.0E+0");
4320 if (FormatPrecision > 1)
4321 Str.append(FormatPrecision - 1,
'0');
4322 append(Str,
"e+00");
4334 int exp = exponent - ((int) semantics->precision - 1);
4336 semantics->precision,
4339 toStringImpl(Str,
isNegative(),
exp, significand, FormatPrecision,
4340 FormatMaxPadding, TruncateZero);
4352 for (
int i = 0; i < PartCount; ++i) {
4358 if (exponent != semantics->minExponent)
4361 int CountrParts = 0;
4362 for (
int i = 0; i < PartCount;
4364 if (Parts[i] != 0) {
4365 return exponent - semantics->precision + CountrParts +
4428 if (!semantics->hasZero)
4438 }
else if (semantics->nonFiniteBehavior ==
4446 exponent = semantics->maxExponent + 1;
4460 bool WillCrossBinadeBoundary =
4461 exponent != semantics->minExponent && isSignificandAllZeros();
4479 if (WillCrossBinadeBoundary) {
4500 if (WillCrossBinadeBoundary) {
4504 assert(exponent != semantics->maxExponent &&
4505 "We can not increment an exponent beyond the maxExponent allowed"
4506 " by the given floating point semantics.");
4509 incrementSignificand();
4523 assert(
isNaN() &&
"Can only be called on NaN values");
4525 unsigned Bits = semantics->precision - 1;
4530 return ::exponentNaN(*semantics);
4534 return ::exponentInf(*semantics);
4538 return ::exponentZero(*semantics);
4557 if (!semantics->hasZero)
4584 return Arg.exponent;
4589 Normalized.exponent += SignificandBits;
4591 return Normalized.exponent - SignificandBits;
4595 auto MaxExp =
X.getSemantics().maxExponent;
4596 auto MinExp =
X.getSemantics().minExponent;
4604 int SignificandBits =
X.getSemantics().precision - 1;
4605 int MaxIncrement = MaxExp - (MinExp - SignificandBits) + 1;
4608 X.exponent += std::clamp(Exp, -MaxIncrement - 1, MaxIncrement);
4631 return scalbn(Val, -Exp, RM);
4637 APFloat(APFloatBase::semIEEEdouble)}) {
4638 assert(Semantics == &APFloatBase::semPPCDoubleDouble);
4642 : Semantics(&S), Floats(new
APFloat[2]{
4645 assert(Semantics == &APFloatBase::semPPCDoubleDouble);
4651 APFloat(APFloatBase::semIEEEdouble)}) {
4652 assert(Semantics == &APFloatBase::semPPCDoubleDouble);
4658 APFloat(APFloatBase::semIEEEdouble,
APInt(64,
I.getRawData()[0])),
4659 APFloat(APFloatBase::semIEEEdouble,
APInt(64,
I.getRawData()[1]))}) {
4660 assert(Semantics == &APFloatBase::semPPCDoubleDouble);
4666 Floats(new
APFloat[2]{std::move(
First), std::move(Second)}) {
4667 assert(Semantics == &APFloatBase::semPPCDoubleDouble);
4668 assert(&Floats[0].getSemantics() == &APFloatBase::semIEEEdouble);
4669 assert(&Floats[1].getSemantics() == &APFloatBase::semIEEEdouble);
4673 : Semantics(RHS.Semantics),
4677 assert(Semantics == &APFloatBase::semPPCDoubleDouble);
4681 : Semantics(RHS.Semantics), Floats(RHS.Floats) {
4682 RHS.Semantics = &APFloatBase::semBogus;
4683 RHS.Floats =
nullptr;
4684 assert(Semantics == &APFloatBase::semPPCDoubleDouble);
4688 if (Semantics == RHS.Semantics && RHS.Floats) {
4689 Floats[0] = RHS.Floats[0];
4690 Floats[1] = RHS.Floats[1];
4691 }
else if (
this != &RHS) {
4724 Floats[0] = std::move(z);
4725 Floats[1].makeZero(
false);
4738 Status |= z.
add(a, RM);
4739 Status |= z.
add(c, RM);
4742 Floats[0] = std::move(z);
4743 Floats[1].makeZero(
false);
4748 Status |= zz.
add(cc, RM);
4752 Status |= Floats[1].subtract(z, RM);
4753 Status |= Floats[1].add(c, RM);
4754 Status |= Floats[1].add(zz, RM);
4758 Status |= Floats[1].subtract(z, RM);
4759 Status |= Floats[1].add(a, RM);
4760 Status |= Floats[1].add(zz, RM);
4765 Status |=
q.subtract(z, RM);
4770 Status |= zz.
add(c, RM);
4771 Status |=
q.add(z, RM);
4772 Status |=
q.subtract(a, RM);
4774 Status |= zz.
add(q, RM);
4775 Status |= zz.
add(
aa, RM);
4776 Status |= zz.
add(cc, RM);
4778 Floats[0] = std::move(z);
4779 Floats[1].makeZero(
false);
4783 Status |= Floats[0].add(zz, RM);
4785 Floats[1].makeZero(
false);
4788 Floats[1] = std::move(z);
4789 Status |= Floats[1].subtract(Floats[0], RM);
4790 Status |= Floats[1].add(zz, RM);
4816 LHS.isNegative() !=
RHS.isNegative()) {
4817 Out.makeNaN(
false, Out.isNegative(),
nullptr);
4832 assert(&
A.getSemantics() == &APFloatBase::semIEEEdouble);
4833 assert(&AA.getSemantics() == &APFloatBase::semIEEEdouble);
4834 assert(&
C.getSemantics() == &APFloatBase::semIEEEdouble);
4835 assert(&CC.getSemantics() == &APFloatBase::semIEEEdouble);
4836 assert(&Out.Floats[0].getSemantics() == &APFloatBase::semIEEEdouble);
4837 assert(&Out.Floats[1].getSemantics() == &APFloatBase::semIEEEdouble);
4838 return Out.addImpl(
A, AA,
C, CC, RM);
4843 return addWithSpecial(*
this, RHS, *
this, RM);
4849 auto Ret =
add(RHS, RM);
4856 const auto &LHS = *
this;
4873 if (LHS.getCategory() ==
fcNaN) {
4877 if (RHS.getCategory() ==
fcNaN) {
4883 Out.makeNaN(
false,
false,
nullptr);
4895 "Special cases not handled exhaustively");
4898 APFloat A = Floats[0],
B = Floats[1],
C = RHS.Floats[0],
D = RHS.Floats[1];
4902 if (!
T.isFiniteNonZero()) {
4903 Floats[0] = std::move(
T);
4904 Floats[1].makeZero(
false);
4926 Status |= U.add(Tau, RM);
4929 if (!U.isFinite()) {
4930 Floats[1].makeZero(
false);
4935 Floats[1] = std::move(
T);
4942 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
4943 "Unexpected Semantics");
4946 APFloat(APFloatBase::semPPCDoubleDoubleLegacy, RHS.bitcastToAPInt()), RM);
4952 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
4953 "Unexpected Semantics");
4956 APFloat(APFloatBase::semPPCDoubleDoubleLegacy, RHS.bitcastToAPInt()));
4962 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
4963 "Unexpected Semantics");
4966 APFloat(APFloatBase::semPPCDoubleDoubleLegacy, RHS.bitcastToAPInt()));
4975 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
4976 "Unexpected Semantics");
4979 APFloat(APFloatBase::semPPCDoubleDoubleLegacy,
4988 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
4989 "Unexpected Semantics");
4999 if (!
Hi.isFiniteNonZero() ||
Lo.isZero()) {
5000 Floats[0] = std::move(RoundedHi);
5001 Floats[1].makeZero(
false);
5013 const APFloat RoundingError = Rounded - ToRound;
5014 if (TieBreaker.isNonZero() &&
5015 TieBreaker.isNegative() != RoundingError.
isNegative() &&
5016 abs(RoundingError).isExactlyValue(0.5))
5025 if (RoundedHi !=
Hi) {
5030 RoundedHi = RoundToNearestHelper(
Hi, RoundedHi,
Lo);
5032 Floats[0] = std::move(RoundedHi);
5033 Floats[1].makeZero(
false);
5046 LoRoundingMode = RM;
5054 RoundedLo = RoundToNearestHelper(
Lo, RoundedLo,
Hi);
5057 std::tie(RoundedHi, RoundedLo) =
fastTwoSum(RoundedHi, RoundedLo);
5059 Floats[0] = std::move(RoundedHi);
5060 Floats[1] = std::move(RoundedLo);
5065 Floats[0].changeSign();
5066 Floats[1].changeSign();
5072 const cmpResult HiPartCmp = Floats[0].compareAbsoluteValue(RHS.Floats[0]);
5077 if (Floats[1].
isZero() && RHS.Floats[1].isZero())
5083 const bool ThisIsSubtractive =
5084 Floats[0].isNegative() != Floats[1].isNegative();
5085 const bool RHSIsSubtractive =
5086 RHS.Floats[0].isNegative() != RHS.Floats[1].isNegative();
5096 if (RHS.Floats[1].isZero())
5103 if (ThisIsSubtractive != RHSIsSubtractive)
5108 const cmpResult LoPartCmp = Floats[1].compareAbsoluteValue(RHS.Floats[1]);
5110 if (ThisIsSubtractive) {
5124 return Floats[0].getCategory();
5130 Floats[0].makeInf(Neg);
5131 Floats[1].makeZero(
false);
5135 Floats[0].makeZero(Neg);
5136 Floats[1].makeZero(
false);
5140 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
5141 "Unexpected Semantics");
5143 APFloat(APFloatBase::semIEEEdouble,
APInt(64, 0x7fefffffffffffffull));
5145 APFloat(APFloatBase::semIEEEdouble,
APInt(64, 0x7c8ffffffffffffeull));
5151 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
5152 "Unexpected Semantics");
5153 Floats[0].makeSmallest(Neg);
5154 Floats[1].makeZero(
false);
5158 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
5159 "Unexpected Semantics");
5161 APFloat(APFloatBase::semIEEEdouble,
APInt(64, 0x0360000000000000ull));
5163 Floats[0].changeSign();
5164 Floats[1].makeZero(
false);
5168 Floats[0].makeNaN(SNaN, Neg,
fill);
5169 Floats[1].makeZero(
false);
5173 auto Result = Floats[0].compare(RHS.Floats[0]);
5176 return Floats[1].compare(RHS.Floats[1]);
5181 return Floats[0].bitwiseIsEqual(RHS.Floats[0]) &&
5182 Floats[1].bitwiseIsEqual(RHS.Floats[1]);
5192 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
5193 "Unexpected Semantics");
5195 Floats[0].bitcastToAPInt().getRawData()[0],
5196 Floats[1].bitcastToAPInt().getRawData()[0],
5203 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
5204 "Unexpected Semantics");
5205 APFloat Tmp(APFloatBase::semPPCDoubleDoubleLegacy);
5218 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
5219 "Unexpected Semantics");
5269 if (InLattice(HiOld, NextLo)) {
5271 Floats[1] = std::move(NextLo);
5308 if (!InLattice(NextHi, NextLo))
5312 Floats[0] = std::move(NextHi);
5313 Floats[1] = std::move(NextLo);
5321 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
5322 "Unexpected Semantics");
5364 const unsigned PositiveOverflowWidth = IsSigned ? Width - 1 : Width;
5365 if (HiExactLog2 >= 0 &&
5366 static_cast<unsigned>(HiExactLog2) == PositiveOverflowWidth) {
5376 Input, Width,
true, RM, &LoIsExact);
5389 *IsExact = RoundStatus ==
opOK;
5401 APSInt LoResult{Width, !IsSigned};
5413 *IsExact = RoundStatus ==
opOK;
5419 unsigned int Width,
bool IsSigned,
5422 convertToSignExtendedInteger(
Input, Width, IsSigned, RM, IsExact);
5426 assert(DstPartsCount <=
Input.size() &&
"Integer too big");
5434 Bits = Width - IsSigned;
5479 if (SrcMSB == UINT_MAX) {
5486 const unsigned SrcBitWidth = SrcMSB + 1;
5502 return handleOverflow(RM);
5508 bool HiAsIntIsExact;
5525 if (
Error.isNegative()) {
5533 const unsigned ErrorActiveBits =
Error.getSignificantBits() - 1;
5535 if (ErrorActiveBits > LoPrecision) {
5536 const unsigned RoundingBoundary = ErrorActiveBits - LoPrecision;
5540 if (
Error.countTrailingZeros() == RoundingBoundary - 1)
5559 Floats[0] = std::move(
Hi);
5560 Floats[1] = std::move(
Lo);
5565 return handleOverflow(RM);
5571 Largest.makeLargest(
false);
5573 return handleOverflow(RM);
5585 const bool NegateInput = IsSigned &&
Input.isNegative();
5598 unsigned int HexDigits,
5601 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
5602 "Unexpected Semantics");
5609 (Floats[0].isDenormal() || Floats[1].
isDenormal() ||
5611 Floats[0] != Floats[0] + Floats[1]);
5640 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
5641 "Unexpected Semantics");
5642 return Floats[0].isInteger() && Floats[1].isInteger();
5646 unsigned FormatPrecision,
5647 unsigned FormatMaxPadding,
5648 bool TruncateZero)
const {
5649 assert(Semantics == &APFloatBase::semPPCDoubleDouble &&
5650 "Unexpected Semantics");
5652 .
toString(Str, FormatPrecision, FormatMaxPadding, TruncateZero);
5672 if (
Lo.isZero() ||
Hi.isNegative() ==
Lo.isNegative())
5674 if (
Hi.getExactLog2Abs() == INT_MIN)
5678 return IlogbResult - 1;
5684 "Unexpected Semantics");
5686 scalbn(Arg.Floats[0], Exp, RM),
5687 scalbn(Arg.Floats[1], Exp, RM));
5693 "Unexpected Semantics");
5703 Quiet.getFirst() =
Quiet.getFirst().makeQuiet();
5725 const bool SignsDisagree =
Hi.isNegative() !=
Lo.isNegative();
5742 LoRoundingMode = RM;
5743 Second =
scalbn(
Lo, -Exp, LoRoundingMode);
5751 if (RecomposedLo !=
Lo) {
5755 const APFloat RoundingError = RecomposedLo -
Lo;
5760 const APFloat ScaledUlpOfSecond =
5762 const bool IsMidpoint =
abs(RoundingError) == ScaledUlpOfSecond;
5763 const bool RoundedLoAway =
5768 if (IsMidpoint && RoundedLoAway)
5784 if (Second.
isZero() && SignsDisagree &&
Hi.getExactLog2Abs() != INT_MIN)
5796APFloat::Storage::Storage(IEEEFloat
F,
const fltSemantics &Semantics) {
5801 if (usesLayout<DoubleAPFloat>(
Semantics)) {
5816 if (APFloat::usesLayout<detail::IEEEFloat>(Arg.
getSemantics()))
5818 if (APFloat::usesLayout<detail::DoubleAPFloat>(Arg.
getSemantics()))
5826 assert(StatusOrErr &&
"Invalid floating point representation");
5878 APFloat Reciprocal =
5896 *Inv = std::move(Reciprocal);
5908 usesLayout<IEEEFloat>(ToSemantics))
5909 return U.IEEE.convert(ToSemantics, RM, losesInfo);
5911 usesLayout<DoubleAPFloat>(ToSemantics)) {
5912 assert(&ToSemantics == &APFloatBase::semPPCDoubleDouble);
5914 U.IEEE.convert(APFloatBase::semPPCDoubleDoubleLegacy, RM, losesInfo);
5915 *
this =
APFloat(ToSemantics, U.IEEE.bitcastToAPInt());
5919 usesLayout<IEEEFloat>(ToSemantics)) {
5920 auto Ret = getIEEE().convert(ToSemantics, RM, losesInfo);
5921 *
this =
APFloat(std::move(getIEEE()), ToSemantics);
5937#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
5950 bool *isExact)
const {
5954 rounding_mode, isExact);
5956 result =
APInt(bitWidth, parts);
5962 return getIEEE().convertToDouble();
5964 "Float semantics is not representable by IEEEdouble");
5965 APFloat Temp = *
this;
5973#ifdef HAS_IEE754_FLOAT128
5974float128 APFloat::convertToQuad()
const {
5976 return getIEEE().convertToQuad();
5978 "Float semantics is not representable by IEEEquad");
5984 return Temp.getIEEE().convertToQuad();
5990 return getIEEE().convertToFloat();
5992 "Float semantics is not representable by IEEEsingle");
5993 APFloat Temp = *
this;
6003 "Float8E5M2",
"Float8E5M2FNUZ",
"Float8E4M3",
"Float8E4M3FN",
6004 "Float8E4M3FNUZ",
"Float8E4M3B11FNUZ",
"Float8E3M4",
"Float8E8M0FNU",
6005 "Float6E3M2FN",
"Float6E2M3FN",
"Float4E2M1FN"};
6013 .
Case(
"Float8E5M2", &semFloat8E5M2)
6014 .
Case(
"Float8E4M3FN", &semFloat8E4M3FN)
6015 .
Case(
"Float4E2M1FN", &semFloat4E2M1FN)
6016 .
Case(
"Float6E3M2FN", &semFloat6E3M2FN)
6017 .
Case(
"Float6E2M3FN", &semFloat6E2M3FN)
6021APFloat::Storage::~Storage() {
6022 if (usesLayout<IEEEFloat>(*semantics)) {
6026 if (usesLayout<DoubleAPFloat>(*semantics)) {
6033APFloat::Storage::Storage(
const APFloat::Storage &
RHS) {
6034 if (usesLayout<IEEEFloat>(*
RHS.semantics)) {
6038 if (usesLayout<DoubleAPFloat>(*
RHS.semantics)) {
6045APFloat::Storage::Storage(APFloat::Storage &&
RHS) {
6046 if (usesLayout<IEEEFloat>(*
RHS.semantics)) {
6050 if (usesLayout<DoubleAPFloat>(*
RHS.semantics)) {
6057APFloat::Storage &APFloat::Storage::operator=(
const APFloat::Storage &
RHS) {
6058 if (usesLayout<IEEEFloat>(*semantics) &&
6059 usesLayout<IEEEFloat>(*
RHS.semantics)) {
6061 }
else if (usesLayout<DoubleAPFloat>(*semantics) &&
6062 usesLayout<DoubleAPFloat>(*
RHS.semantics)) {
6064 }
else if (
this != &
RHS) {
6066 new (
this) Storage(
RHS);
6071APFloat::Storage &APFloat::Storage::operator=(APFloat::Storage &&
RHS) {
6072 if (usesLayout<IEEEFloat>(*semantics) &&
6073 usesLayout<IEEEFloat>(*
RHS.semantics)) {
6075 }
else if (usesLayout<DoubleAPFloat>(*semantics) &&
6076 usesLayout<DoubleAPFloat>(*
RHS.semantics)) {
6078 }
else if (
this != &
RHS) {
6080 new (
this) Storage(std::move(
RHS));
6089 if (libc_exceptions & FE_INVALID)
6091 if (libc_exceptions & FE_DIVBYZERO)
6093 if (libc_exceptions & FE_OVERFLOW)
6095 if (libc_exceptions & FE_UNDERFLOW)
6097 if (libc_exceptions & FE_INEXACT)
6112 float x_val = x.convertToFloat();
6114 LIBC_NAMESPACE::shared::check::exp_exceptions(x_val, FE_TONEAREST);
6116 *status = getOpStatusFromLibc(exc);
6117 if (x.isSignaling()) {
6124 float result = LIBC_NAMESPACE::shared::expf(x_val);
6129 double x_val = x.convertToDouble();
6131 LIBC_NAMESPACE::shared::check::exp_exceptions(x_val, FE_TONEAREST);
6133 *status = getOpStatusFromLibc(exc);
6134 if (x.isSignaling()) {
6141 double result = LIBC_NAMESPACE::shared::exp(x_val);
6145 return std::nullopt;
6150#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 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)
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
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[]
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