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