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))
314 if (Src.maxExponent >= Dst.maxExponent || Src.minExponent <= Dst.minExponent)
322 return Dst.precision >= Src.precision;
360static inline unsigned int
374 unsigned int absExponent;
375 const unsigned int overlargeExponent = 24000;
379 if (p == end || ((*p ==
'-' || *p ==
'+') && (p + 1) == end)) {
383 isNegative = (*p ==
'-');
384 if (*p ==
'-' || *p ==
'+') {
391 if (absExponent >= 10U)
392 return createError(
"Invalid character in exponent");
394 for (; p != end; ++p) {
399 return createError(
"Invalid character in exponent");
401 absExponent = absExponent * 10U +
value;
402 if (absExponent >= overlargeExponent) {
403 absExponent = overlargeExponent;
409 return -(int) absExponent;
411 return (
int) absExponent;
418 int exponentAdjustment) {
419 int unsignedExponent;
420 bool negative, overflow;
426 negative = *p ==
'-';
427 if (*p ==
'-' || *p ==
'+') {
433 unsignedExponent = 0;
435 for (; p != end; ++p) {
440 return createError(
"Invalid character in exponent");
442 unsignedExponent = unsignedExponent * 10 +
value;
443 if (unsignedExponent > 32767) {
449 if (exponentAdjustment > 32767 || exponentAdjustment < -32768)
453 exponent = unsignedExponent;
455 exponent = -exponent;
456 exponent += exponentAdjustment;
457 if (exponent > 32767 || exponent < -32768)
462 exponent = negative ? -32768: 32767;
472 while (p != end && *p ==
'0')
475 if (p != end && *p ==
'.') {
478 if (end - begin == 1)
481 while (p != end && *p ==
'0')
514 return PtrOrErr.takeError();
517 D->firstSigDigit = p;
519 D->normalizedExponent = 0;
521 for (; p != end; ++p) {
524 return createError(
"String contains multiple dots");
534 if (*p !=
'e' && *p !=
'E')
535 return createError(
"Invalid character in significand");
538 if (dot != end && p - begin == 1)
544 return ExpOrErr.takeError();
545 D->exponent = *ExpOrErr;
553 if (p !=
D->firstSigDigit) {
559 while (p != begin && *p ==
'0');
560 while (p != begin && *p ==
'.');
565 D->normalizedExponent = (
D->exponent +
567 - (dot >
D->firstSigDigit && dot < p)));
579 unsigned int digitValue) {
580 unsigned int hexDigit;
586 else if (digitValue < 8 && digitValue > 0)
590 while (p != end && (*p ==
'0' || *p ==
'.'))
594 return createError(
"Invalid trailing hexadecimal fraction!");
596 hexDigit = hexDigitValue(*p);
600 if (hexDigit == UINT_MAX)
610 unsigned int partCount,
639 return lost_fraction;
654 return moreSignificant;
665HUerrBound(
bool inexactMultiply,
unsigned int HUerr1,
unsigned int HUerr2)
667 assert(HUerr1 < 2 || HUerr2 < 2 || (HUerr1 + HUerr2 < 8));
669 if (HUerr1 + HUerr2 == 0)
670 return inexactMultiply * 2;
672 return inexactMultiply + 2 * (HUerr1 + HUerr2);
681 unsigned int count, partBits;
698 if (part - boundary <= boundary - part)
699 return part - boundary;
701 return boundary - part;
704 if (part == boundary) {
710 }
else if (part == boundary - 1) {
727 pow5s[0] = 78125 * 5;
729 unsigned int partsCount[16] = { 1 };
737 *p1 = firstEightPowers[power & 7];
743 for (
unsigned int n = 0; power; power >>= 1, n++) {
750 pc = partsCount[n - 1];
753 if (pow5[pc - 1] == 0)
763 if (p2[result - 1] == 0)
788static const char NaNL[] =
"nan";
789static const char NaNU[] =
"NAN";
796 const char *hexDigitChars)
798 unsigned int result =
count;
804 dst[
count] = hexDigitChars[part & 0xf];
844void IEEEFloat::initialize(
const fltSemantics *ourSemantics) {
847 semantics = ourSemantics;
853void IEEEFloat::freeSignificand() {
855 delete [] significand.parts;
858void IEEEFloat::assign(
const IEEEFloat &rhs) {
859 assert(semantics == rhs.semantics);
862 category = rhs.category;
863 exponent = rhs.exponent;
865 copySignificand(rhs);
868void IEEEFloat::copySignificand(
const IEEEFloat &rhs) {
870 assert(rhs.partCount() >= partCount());
882 exponent = exponentNaN();
885 unsigned numParts = partCount();
898 fill = &fill_storage;
909 unsigned bitsToPreserve = semantics->
precision - 1;
910 unsigned part = bitsToPreserve / 64;
911 bitsToPreserve %= 64;
912 significand[part] &= ((1ULL << bitsToPreserve) - 1);
913 for (part++; part != numParts; ++part)
914 significand[part] = 0;
917 unsigned QNaNBit = semantics->
precision - 2;
945 if (semantics != rhs.semantics) {
947 initialize(rhs.semantics);
958 semantics = rhs.semantics;
959 significand = rhs.significand;
960 exponent = rhs.exponent;
961 category = rhs.category;
979 significandMSB() == 0;
984 isSignificandAllZerosExceptMSB();
987bool IEEEFloat::isSignificandAllOnes()
const {
992 for (
unsigned i = 0; i < PartCount - 1; i++)
997 const unsigned NumHighBits =
999 assert(NumHighBits <= integerPartWidth && NumHighBits > 0 &&
1000 "Can not have more high bits to fill than integerPartWidth");
1003 if (~(Parts[PartCount - 1] | HighBitFill))
1009bool IEEEFloat::isSignificandAllOnesExceptLSB()
const {
1018 for (
unsigned i = 0; i < PartCount - 1; i++) {
1019 if (~Parts[i] & ~
unsigned{!i})
1024 const unsigned NumHighBits =
1026 assert(NumHighBits <= integerPartWidth && NumHighBits > 0 &&
1027 "Can not have more high bits to fill than integerPartWidth");
1030 if (~(Parts[PartCount - 1] | HighBitFill | 0x1))
1036bool IEEEFloat::isSignificandAllZeros()
const {
1042 for (
unsigned i = 0; i < PartCount - 1; i++)
1047 const unsigned NumHighBits =
1050 "clear than integerPartWidth");
1051 const integerPart HighBitMask = ~integerPart(0) >> NumHighBits;
1053 if (Parts[PartCount - 1] & HighBitMask)
1059bool IEEEFloat::isSignificandAllZerosExceptMSB()
const {
1063 for (
unsigned i = 0; i < PartCount - 1; i++) {
1068 const unsigned NumHighBits =
1081 isSignificandAllOnesExceptLSB();
1086 isSignificandAllOnes();
1101 if (semantics != rhs.semantics ||
1102 category != rhs.category ||
1111 return std::equal(significandParts(), significandParts() + partCount(),
1112 rhs.significandParts());
1116 initialize(&ourSemantics);
1121 significandParts()[0] =
value;
1126 initialize(&ourSemantics);
1136 initialize(rhs.semantics);
1141 *
this = std::move(rhs);
1146unsigned int IEEEFloat::partCount()
const {
1151 return const_cast<IEEEFloat *
>(
this)->significandParts();
1155 if (partCount() > 1)
1156 return significand.parts;
1158 return &significand.part;
1161void IEEEFloat::zeroSignificand() {
1166void IEEEFloat::incrementSignificand() {
1180 parts = significandParts();
1182 assert(semantics == rhs.semantics);
1183 assert(exponent == rhs.exponent);
1185 return APInt::tcAdd(parts, rhs.significandParts(), 0, partCount());
1191 integerPart borrow) {
1194 parts = significandParts();
1196 assert(semantics == rhs.semantics);
1197 assert(exponent == rhs.exponent);
1206lostFraction IEEEFloat::multiplySignificand(
const IEEEFloat &rhs,
1209 unsigned int partsCount, newPartsCount, precision;
1216 assert(semantics == rhs.semantics);
1224 if (newPartsCount > 4)
1227 fullSignificand = scratch;
1229 lhsSignificand = significandParts();
1230 partsCount = partCount();
1233 rhs.significandParts(), partsCount, partsCount);
1236 omsb =
APInt::tcMSB(fullSignificand, newPartsCount) + 1;
1237 exponent += rhs.exponent;
1251 if (addend.isNonZero()) {
1255 Significand savedSignificand = significand;
1259 unsigned int extendedPrecision;
1262 extendedPrecision = 2 * precision + 1;
1263 if (omsb != extendedPrecision - 1) {
1264 assert(extendedPrecision > omsb);
1266 (extendedPrecision - 1) - omsb);
1267 exponent -= (extendedPrecision - 1) - omsb;
1271 extendedSemantics = *semantics;
1272 extendedSemantics.
precision = extendedPrecision;
1274 if (newPartsCount == 1)
1275 significand.part = fullSignificand[0];
1277 significand.parts = fullSignificand;
1278 semantics = &extendedSemantics;
1291 lost_fraction = extendedAddend.shiftSignificandRight(1);
1293 "Lost precision while shifting addend for fused-multiply-add.");
1295 lost_fraction = addOrSubtractSignificand(extendedAddend,
false);
1298 if (newPartsCount == 1)
1299 fullSignificand[0] = significand.part;
1300 significand = savedSignificand;
1301 semantics = savedSemantics;
1303 omsb =
APInt::tcMSB(fullSignificand, newPartsCount) + 1;
1310 exponent -= precision + 1;
1319 if (omsb > precision) {
1320 unsigned int bits, significantParts;
1323 bits = omsb - precision;
1325 lf =
shiftRight(fullSignificand, significantParts, bits);
1332 if (newPartsCount > 4)
1333 delete [] fullSignificand;
1335 return lost_fraction;
1338lostFraction IEEEFloat::multiplySignificand(
const IEEEFloat &rhs) {
1339 return multiplySignificand(rhs,
IEEEFloat(*semantics));
1343lostFraction IEEEFloat::divideSignificand(
const IEEEFloat &rhs) {
1344 unsigned int bit, i, partsCount;
1350 assert(semantics == rhs.semantics);
1352 lhsSignificand = significandParts();
1353 rhsSignificand = rhs.significandParts();
1354 partsCount = partCount();
1361 divisor = dividend + partsCount;
1364 for (i = 0; i < partsCount; i++) {
1365 dividend[i] = lhsSignificand[i];
1366 divisor[i] = rhsSignificand[i];
1367 lhsSignificand[i] = 0;
1370 exponent -= rhs.exponent;
1372 unsigned int precision = semantics->
precision;
1375 bit = precision -
APInt::tcMSB(divisor, partsCount) - 1;
1382 bit = precision -
APInt::tcMSB(dividend, partsCount) - 1;
1398 for (bit = precision; bit; bit -= 1) {
1422 return lost_fraction;
1425unsigned int IEEEFloat::significandMSB()
const {
1429unsigned int IEEEFloat::significandLSB()
const {
1434lostFraction IEEEFloat::shiftSignificandRight(
unsigned int bits) {
1440 return shiftRight(significandParts(), partCount(), bits);
1444void IEEEFloat::shiftSignificandLeft(
unsigned int bits) {
1445 assert(bits < semantics->precision);
1448 unsigned int partsCount = partCount();
1461 assert(semantics == rhs.semantics);
1465 compare = exponent - rhs.exponent;
1530bool IEEEFloat::roundAwayFromZero(roundingMode rounding_mode,
1532 unsigned int bit)
const {
1539 switch (rounding_mode) {
1577 omsb = significandMSB() + 1;
1583 exponentChange = omsb - semantics->
precision;
1587 if (exponent + exponentChange > semantics->
maxExponent)
1588 return handleOverflow(rounding_mode);
1592 if (exponent + exponentChange < semantics->minExponent)
1593 exponentChange = semantics->
minExponent - exponent;
1596 if (exponentChange < 0) {
1599 shiftSignificandLeft(-exponentChange);
1604 if (exponentChange > 0) {
1608 lf = shiftSignificandRight(exponentChange);
1613 if (omsb > (
unsigned) exponentChange)
1614 omsb -= exponentChange;
1624 exponent == semantics->
maxExponent && isSignificandAllOnes())
1625 return handleOverflow(rounding_mode);
1644 if (roundAwayFromZero(rounding_mode, lost_fraction, 0)) {
1648 incrementSignificand();
1649 omsb = significandMSB() + 1;
1652 if (omsb == (
unsigned) semantics->
precision + 1) {
1663 shiftSignificandRight(1);
1672 exponent == semantics->
maxExponent && isSignificandAllOnes())
1673 return handleOverflow(rounding_mode);
1682 assert(omsb < semantics->precision);
1752lostFraction IEEEFloat::addOrSubtractSignificand(
const IEEEFloat &rhs,
1760 subtract ^=
static_cast<bool>(sign ^ rhs.sign);
1763 bits = exponent - rhs.exponent;
1771 else if (bits > 0) {
1772 lost_fraction = temp_rhs.shiftSignificandRight(bits - 1);
1773 shiftSignificandLeft(1);
1775 lost_fraction = shiftSignificandRight(-bits - 1);
1776 temp_rhs.shiftSignificandLeft(1);
1781 carry = temp_rhs.subtractSignificand
1783 copySignificand(temp_rhs);
1786 carry = subtractSignificand
1805 lost_fraction = temp_rhs.shiftSignificandRight(bits);
1806 carry = addSignificand(temp_rhs);
1808 lost_fraction = shiftSignificandRight(-bits);
1809 carry = addSignificand(rhs);
1817 return lost_fraction;
2002 roundingMode rounding_mode,
2006 fs = addOrSubtractSpecials(rhs,
subtract);
2012 lost_fraction = addOrSubtractSignificand(rhs,
subtract);
2013 fs = normalize(rounding_mode, lost_fraction);
2022 if (category ==
fcZero) {
2036 return addOrSubtract(rhs, rounding_mode,
false);
2042 return addOrSubtract(rhs, rounding_mode,
true);
2051 fs = multiplySpecials(rhs);
2057 fs = normalize(rounding_mode, lost_fraction);
2071 fs = divideSpecials(rhs);
2077 fs = normalize(rounding_mode, lost_fraction);
2088 unsigned int origSign = sign;
2091 fs = remainderSpecials(rhs);
2198 fs = modSpecials(rhs);
2199 unsigned int origSign = sign;
2229 sign ^= multiplicand.sign;
2238 lost_fraction = multiplySignificand(multiplicand, addend);
2239 fs = normalize(rounding_mode, lost_fraction);
2252 fs = multiplySpecials(multiplicand);
2262 fs = addOrSubtract(addend, rounding_mode,
false);
2335 MagicConstant.sign = sign;
2341 fs =
add(MagicConstant, rounding_mode);
2345 subtract(MagicConstant, rounding_mode);
2359 assert(semantics == rhs.semantics);
2391 if (sign == rhs.sign)
2406 if (sign != rhs.sign) {
2437 unsigned int newPartCount, oldPartCount;
2445 oldPartCount = partCount();
2448 bool X86SpecialNan =
false;
2451 (!(*significandParts() & 0x8000000000000000ULL) ||
2452 !(*significandParts() & 0x4000000000000000ULL))) {
2455 X86SpecialNan =
true;
2466 int omsb = significandMSB() + 1;
2467 int exponentChange = omsb - fromSemantics.
precision;
2468 if (exponent + exponentChange < toSemantics.
minExponent)
2469 exponentChange = toSemantics.
minExponent - exponent;
2470 if (exponentChange < shift)
2471 exponentChange = shift;
2472 if (exponentChange < 0) {
2473 shift -= exponentChange;
2474 exponent += exponentChange;
2475 }
else if (omsb <= -shift) {
2476 exponentChange = omsb + shift - 1;
2477 shift -= exponentChange;
2478 exponent += exponentChange;
2489 if (newPartCount > oldPartCount) {
2497 significand.parts = newParts;
2498 }
else if (newPartCount == 1 && oldPartCount != 1) {
2502 newPart = significandParts()[0];
2504 significand.part = newPart;
2508 semantics = &toSemantics;
2517 *losesInfo = (fs !=
opOK);
2518 }
else if (category ==
fcNaN) {
2553 }
else if (category ==
fcZero &&
2581 roundingMode rounding_mode,
bool *isExact)
const {
2584 unsigned int dstPartsCount, truncatedBits;
2593 assert(dstPartsCount <= parts.
size() &&
"Integer too big");
2595 if (category ==
fcZero) {
2602 src = significandParts();
2611 truncatedBits = semantics->
precision -1U - exponent;
2615 unsigned int bits = exponent + 1U;
2621 if (bits < semantics->precision) {
2623 truncatedBits = semantics->
precision - bits;
2637 if (truncatedBits) {
2641 roundAwayFromZero(rounding_mode, lost_fraction, truncatedBits)) {
2661 if (omsb == width &&
2698 fs = convertToSignExtendedInteger(parts, width,
isSigned, rounding_mode,
2702 unsigned int bits, dstPartsCount;
2705 assert(dstPartsCount <= parts.
size() &&
"Integer too big");
2707 if (category ==
fcNaN)
2726 const integerPart *src,
unsigned int srcCount, roundingMode rounding_mode) {
2727 unsigned int omsb, precision, dstCount;
2733 dst = significandParts();
2734 dstCount = partCount();
2739 if (precision <= omsb) {
2740 exponent = omsb - 1;
2745 exponent = precision - 1;
2750 return normalize(rounding_mode, lost_fraction);
2764 return convertFromUnsignedParts(api.
getRawData(), partCount, rounding_mode);
2772 unsigned int srcCount,
bool isSigned,
2785 status = convertFromUnsignedParts(
copy, srcCount, rounding_mode);
2789 status = convertFromUnsignedParts(src, srcCount, rounding_mode);
2809 return convertFromUnsignedParts(api.
getRawData(), partCount, rounding_mode);
2813IEEEFloat::convertFromHexadecimalString(
StringRef s,
2814 roundingMode rounding_mode) {
2822 unsigned partsCount = partCount();
2824 bool computedTrailingFraction =
false;
2832 return PtrOrErr.takeError();
2841 return createError(
"String contains multiple dots");
2846 hex_value = hexDigitValue(*p);
2847 if (hex_value == UINT_MAX)
2857 }
else if (!computedTrailingFraction) {
2860 return FractOrErr.takeError();
2861 lost_fraction = *FractOrErr;
2862 computedTrailingFraction =
true;
2868 return createError(
"Hex strings require an exponent");
2869 if (*p !=
'p' && *p !=
'P')
2870 return createError(
"Invalid character in significand");
2873 if (dot != end && p - begin == 1)
2877 if (p != firstSignificantDigit) {
2886 expAdjustment =
static_cast<int>(
dot - firstSignificantDigit);
2887 if (expAdjustment < 0)
2889 expAdjustment = expAdjustment * 4 - 1;
2899 return ExpOrErr.takeError();
2900 exponent = *ExpOrErr;
2903 return normalize(rounding_mode, lost_fraction);
2907IEEEFloat::roundSignificandWithExponent(
const integerPart *decSigParts,
2908 unsigned sigPartCount,
int exp,
2909 roundingMode rounding_mode) {
2910 unsigned int parts, pow5PartCount;
2921 pow5PartCount =
powerOf5(pow5Parts, exp >= 0 ? exp: -exp);
2923 for (;; parts *= 2) {
2925 unsigned int excessPrecision, truncatedBits;
2929 truncatedBits = excessPrecision;
2932 decSig.makeZero(sign);
2935 sigStatus = decSig.convertFromUnsignedParts(decSigParts, sigPartCount,
2937 powStatus = pow5.convertFromUnsignedParts(pow5Parts, pow5PartCount,
2940 decSig.exponent += exp;
2944 unsigned int powHUerr;
2948 calcLostFraction = decSig.multiplySignificand(pow5);
2949 powHUerr = powStatus !=
opOK;
2951 calcLostFraction = decSig.divideSignificand(pow5);
2954 excessPrecision += (semantics->
minExponent - decSig.exponent);
2955 truncatedBits = excessPrecision;
2956 if (excessPrecision > calcSemantics.
precision)
2957 excessPrecision = calcSemantics.
precision;
2966 (decSig.significandParts(), calcSemantics.
precision - 1) == 1);
2971 excessPrecision, isNearest);
2974 if (HUdistance >= HUerr) {
2975 APInt::tcExtract(significandParts(), partCount(), decSig.significandParts(),
2976 calcSemantics.
precision - excessPrecision,
2981 exponent = (decSig.exponent + semantics->
precision
2982 - (calcSemantics.
precision - excessPrecision));
2986 return normalize(rounding_mode, calcLostFraction);
2992IEEEFloat::convertFromDecimalString(
StringRef str, roundingMode rounding_mode) {
2999 return std::move(Err);
3033 }
else if (
D.normalizedExponent - 1 > INT_MAX / 42039) {
3034 fs = handleOverflow(rounding_mode);
3040 }
else if (
D.normalizedExponent - 1 < INT_MIN / 42039 ||
3041 (
D.normalizedExponent + 1) * 28738 <=
3049 }
else if ((
D.normalizedExponent - 1) * 42039
3052 fs = handleOverflow(rounding_mode);
3055 unsigned int partCount;
3061 partCount =
static_cast<unsigned int>(
D.lastSigDigit -
D.firstSigDigit) + 1;
3079 if (p == str.
end()) {
3084 if (decValue >= 10U) {
3085 delete[] decSignificand;
3086 return createError(
"Invalid character in significand");
3089 val = val * 10 + decValue;
3092 }
while (p <=
D.lastSigDigit && multiplier <= (~ (
integerPart) 0 - 9) / 10);
3096 partCount, partCount + 1,
false);
3100 if (decSignificand[partCount])
3102 }
while (p <=
D.lastSigDigit);
3105 fs = roundSignificandWithExponent(decSignificand, partCount,
3106 D.exponent, rounding_mode);
3108 delete [] decSignificand;
3114bool IEEEFloat::convertFromStringSpecials(
StringRef str) {
3115 const size_t MIN_NAME_SIZE = 3;
3117 if (str.
size() < MIN_NAME_SIZE)
3125 bool IsNegative = str.
front() ==
'-';
3128 if (str.
size() < MIN_NAME_SIZE)
3138 bool IsSignaling = str.
front() ==
's' || str.
front() ==
'S';
3141 if (str.
size() < MIN_NAME_SIZE)
3150 makeNaN(IsSignaling, IsNegative);
3155 if (str.
front() ==
'(') {
3157 if (str.
size() <= 2 || str.
back() !=
')')
3164 unsigned Radix = 10;
3165 if (str[0] ==
'0') {
3166 if (str.
size() > 1 && tolower(str[1]) ==
'x') {
3176 makeNaN(IsSignaling, IsNegative, &Payload);
3190 if (convertFromStringSpecials(str))
3195 size_t slen = str.
size();
3196 sign = *p ==
'-' ? 1 : 0;
3197 if (*p ==
'-' || *p ==
'+') {
3204 if (slen >= 2 && p[0] ==
'0' && (p[1] ==
'x' || p[1] ==
'X')) {
3207 return convertFromHexadecimalString(
StringRef(p + 2, slen - 2),
3211 return convertFromDecimalString(
StringRef(p, slen), rounding_mode);
3255 dst +=
sizeof NaNU - 1;
3260 *dst++ = upperCase ?
'X':
'x';
3262 if (hexDigits > 1) {
3264 memset (dst,
'0', hexDigits - 1);
3265 dst += hexDigits - 1;
3267 *dst++ = upperCase ?
'P':
'p';
3272 dst = convertNormalToHexString (dst, hexDigits, upperCase, rounding_mode);
3278 return static_cast<unsigned int>(dst - p);
3285char *IEEEFloat::convertNormalToHexString(
char *dst,
unsigned int hexDigits,
3287 roundingMode rounding_mode)
const {
3288 unsigned int count, valueBits, shift, partsCount, outputDigits;
3289 const char *hexDigitChars;
3295 *dst++ = upperCase ?
'X':
'x';
3300 significand = significandParts();
3301 partsCount = partCount();
3310 outputDigits = (valueBits - significandLSB () + 3) / 4;
3316 if (hexDigits < outputDigits) {
3322 bits = valueBits - hexDigits * 4;
3324 roundUp = roundAwayFromZero(rounding_mode, fraction, bits);
3326 outputDigits = hexDigits;
3336 while (outputDigits &&
count) {
3340 if (--
count == partsCount)
3343 part = significand[
count] << shift;
3351 if (curDigits > outputDigits)
3352 curDigits = outputDigits;
3353 dst +=
partAsHex (dst, part, curDigits, hexDigitChars);
3354 outputDigits -= curDigits;
3363 *
q = hexDigitChars[hexDigitValue (*q) + 1];
3364 }
while (*q ==
'0');
3368 memset (dst,
'0', outputDigits);
3369 dst += outputDigits;
3382 *dst++ = upperCase ?
'P':
'p';
3388 if (!
Arg.isFiniteNonZero())
3391 Arg.isNaN() ? (uint8_t)0 : (uint8_t)
Arg.sign,
3392 Arg.semantics->precision);
3396 Arg.semantics->precision,
Arg.exponent,
3398 Arg.significandParts(),
3399 Arg.significandParts() +
Arg.partCount()));
3411APInt IEEEFloat::convertF80LongDoubleAPFloatToAPInt()
const {
3415 uint64_t myexponent, mysignificand;
3418 myexponent = exponent+16383;
3419 mysignificand = significandParts()[0];
3420 if (myexponent==1 && !(mysignificand & 0x8000000000000000ULL))
3422 }
else if (category==
fcZero) {
3426 myexponent = 0x7fff;
3427 mysignificand = 0x8000000000000000ULL;
3430 myexponent = 0x7fff;
3431 mysignificand = significandParts()[0];
3435 words[0] = mysignificand;
3436 words[1] = ((
uint64_t)(sign & 1) << 15) |
3437 (myexponent & 0x7fffLL);
3438 return APInt(80, words);
3441APInt IEEEFloat::convertPPCDoubleDoubleAPFloatToAPInt()
const {
3466 words[0] = *
u.convertDoubleAPFloatToAPInt().getRawData();
3472 if (
u.isFiniteNonZero() && losesInfo) {
3482 words[1] = *
v.convertDoubleAPFloatToAPInt().getRawData();
3487 return APInt(128, words);
3490template <const fltSemantics &S>
3491APInt IEEEFloat::convertIEEEFloatToAPInt()
const {
3494 constexpr int bias = -(S.minExponent - 1);
3495 constexpr unsigned int trailing_significand_bits = S.precision - 1;
3496 constexpr int integer_bit_part = trailing_significand_bits /
integerPartWidth;
3499 constexpr uint64_t significand_mask = integer_bit - 1;
3500 constexpr unsigned int exponent_bits =
3501 S.sizeInBits - 1 - trailing_significand_bits;
3502 static_assert(exponent_bits < 64);
3510 myexponent = exponent + bias;
3511 std::copy_n(significandParts(), mysignificand.size(),
3512 mysignificand.begin());
3513 if (myexponent == 1 &&
3514 !(significandParts()[integer_bit_part] & integer_bit))
3516 }
else if (category ==
fcZero) {
3517 myexponent = ::exponentZero(S) + bias;
3518 mysignificand.fill(0);
3523 myexponent = ::exponentInf(S) + bias;
3524 mysignificand.fill(0);
3527 myexponent = ::exponentNaN(S) + bias;
3528 std::copy_n(significandParts(), mysignificand.size(),
3529 mysignificand.begin());
3531 std::array<
uint64_t, (S.sizeInBits + 63) / 64> words;
3533 std::copy_n(mysignificand.begin(), mysignificand.size(), words.begin());
3534 if constexpr (significand_mask != 0) {
3536 words[mysignificand.size() - 1] &= significand_mask;
3538 std::fill(words_iter, words.end(),
uint64_t{0});
3539 constexpr size_t last_word = words.size() - 1;
3541 << ((S.sizeInBits - 1) % 64);
3542 words[last_word] |= shifted_sign;
3543 uint64_t shifted_exponent = (myexponent & exponent_mask)
3544 << (trailing_significand_bits % 64);
3545 words[last_word] |= shifted_exponent;
3546 if constexpr (last_word == 0) {
3547 return APInt(S.sizeInBits, words[0]);
3549 return APInt(S.sizeInBits, words);
3552APInt IEEEFloat::convertQuadrupleAPFloatToAPInt()
const {
3553 assert(partCount() == 2);
3554 return convertIEEEFloatToAPInt<semIEEEquad>();
3557APInt IEEEFloat::convertDoubleAPFloatToAPInt()
const {
3559 return convertIEEEFloatToAPInt<semIEEEdouble>();
3562APInt IEEEFloat::convertFloatAPFloatToAPInt()
const {
3564 return convertIEEEFloatToAPInt<semIEEEsingle>();
3567APInt IEEEFloat::convertBFloatAPFloatToAPInt()
const {
3568 assert(partCount() == 1);
3569 return convertIEEEFloatToAPInt<semBFloat>();
3572APInt IEEEFloat::convertHalfAPFloatToAPInt()
const {
3574 return convertIEEEFloatToAPInt<semIEEEhalf>();
3577APInt IEEEFloat::convertFloat8E5M2APFloatToAPInt()
const {
3578 assert(partCount() == 1);
3579 return convertIEEEFloatToAPInt<semFloat8E5M2>();
3582APInt IEEEFloat::convertFloat8E5M2FNUZAPFloatToAPInt()
const {
3583 assert(partCount() == 1);
3584 return convertIEEEFloatToAPInt<semFloat8E5M2FNUZ>();
3587APInt IEEEFloat::convertFloat8E4M3FNAPFloatToAPInt()
const {
3588 assert(partCount() == 1);
3589 return convertIEEEFloatToAPInt<semFloat8E4M3FN>();
3592APInt IEEEFloat::convertFloat8E4M3FNUZAPFloatToAPInt()
const {
3593 assert(partCount() == 1);
3594 return convertIEEEFloatToAPInt<semFloat8E4M3FNUZ>();
3597APInt IEEEFloat::convertFloat8E4M3B11FNUZAPFloatToAPInt()
const {
3598 assert(partCount() == 1);
3599 return convertIEEEFloatToAPInt<semFloat8E4M3B11FNUZ>();
3608 return convertHalfAPFloatToAPInt();
3611 return convertBFloatAPFloatToAPInt();
3614 return convertFloatAPFloatToAPInt();
3617 return convertDoubleAPFloatToAPInt();
3620 return convertQuadrupleAPFloatToAPInt();
3623 return convertPPCDoubleDoubleAPFloatToAPInt();
3626 return convertFloat8E5M2APFloatToAPInt();
3629 return convertFloat8E5M2FNUZAPFloatToAPInt();
3632 return convertFloat8E4M3FNAPFloatToAPInt();
3635 return convertFloat8E4M3FNUZAPFloatToAPInt();
3638 return convertFloat8E4M3B11FNUZAPFloatToAPInt();
3642 return convertF80LongDoubleAPFloatToAPInt();
3647 "Float semantics are not IEEEsingle");
3654 "Float semantics are not IEEEdouble");
3666void IEEEFloat::initFromF80LongDoubleAPInt(
const APInt &api) {
3669 uint64_t myexponent = (i2 & 0x7fff);
3671 uint8_t myintegerbit = mysignificand >> 63;
3676 sign =
static_cast<unsigned int>(i2>>15);
3677 if (myexponent == 0 && mysignificand == 0) {
3679 }
else if (myexponent==0x7fff && mysignificand==0x8000000000000000ULL) {
3681 }
else if ((myexponent == 0x7fff && mysignificand != 0x8000000000000000ULL) ||
3682 (myexponent != 0x7fff && myexponent != 0 && myintegerbit == 0)) {
3684 exponent = exponentNaN();
3685 significandParts()[0] = mysignificand;
3686 significandParts()[1] = 0;
3689 exponent = myexponent - 16383;
3690 significandParts()[0] = mysignificand;
3691 significandParts()[1] = 0;
3697void IEEEFloat::initFromPPCDoubleDoubleAPInt(
const APInt &api) {
3704 initFromDoubleAPInt(
APInt(64, i1));
3720template <const fltSemantics &S>
3721void IEEEFloat::initFromIEEEAPInt(
const APInt &api) {
3725 constexpr uint64_t significand_mask = integer_bit - 1;
3726 constexpr unsigned int trailing_significand_bits = S.precision - 1;
3727 constexpr unsigned int stored_significand_parts =
3729 constexpr unsigned int exponent_bits =
3730 S.sizeInBits - 1 - trailing_significand_bits;
3731 static_assert(exponent_bits < 64);
3733 constexpr int bias = -(S.minExponent - 1);
3737 std::array<integerPart, stored_significand_parts> mysignificand;
3738 std::copy_n(api.
getRawData(), mysignificand.size(), mysignificand.begin());
3739 if constexpr (significand_mask != 0) {
3740 mysignificand[mysignificand.size() - 1] &= significand_mask;
3747 (last_word >> (trailing_significand_bits % 64)) & exponent_mask;
3750 assert(partCount() == mysignificand.size());
3752 sign =
static_cast<unsigned int>(last_word >> ((S.sizeInBits - 1) % 64));
3754 bool all_zero_significand =
3757 bool is_zero = myexponent == 0 && all_zero_significand;
3760 if (myexponent - bias == ::exponentInf(S) && all_zero_significand) {
3769 is_nan = myexponent - bias == ::exponentNaN(S) && !all_zero_significand;
3771 bool all_ones_significand =
3772 std::all_of(mysignificand.begin(), mysignificand.end() - 1,
3773 [](
integerPart bits) { return bits == ~integerPart{0}; }) &&
3774 (!significand_mask ||
3775 mysignificand[mysignificand.size() - 1] == significand_mask);
3776 is_nan = myexponent - bias == ::exponentNaN(S) && all_ones_significand;
3784 std::copy_n(mysignificand.begin(), mysignificand.size(),
3785 significandParts());
3795 exponent = myexponent - bias;
3796 std::copy_n(mysignificand.begin(), mysignificand.size(), significandParts());
3797 if (myexponent == 0)
3798 exponent = S.minExponent;
3800 significandParts()[mysignificand.size()-1] |= integer_bit;
3803void IEEEFloat::initFromQuadrupleAPInt(
const APInt &api) {
3804 initFromIEEEAPInt<semIEEEquad>(api);
3807void IEEEFloat::initFromDoubleAPInt(
const APInt &api) {
3808 initFromIEEEAPInt<semIEEEdouble>(api);
3811void IEEEFloat::initFromFloatAPInt(
const APInt &api) {
3812 initFromIEEEAPInt<semIEEEsingle>(api);
3815void IEEEFloat::initFromBFloatAPInt(
const APInt &api) {
3816 initFromIEEEAPInt<semBFloat>(api);
3819void IEEEFloat::initFromHalfAPInt(
const APInt &api) {
3820 initFromIEEEAPInt<semIEEEhalf>(api);
3823void IEEEFloat::initFromFloat8E5M2APInt(
const APInt &api) {
3824 initFromIEEEAPInt<semFloat8E5M2>(api);
3827void IEEEFloat::initFromFloat8E5M2FNUZAPInt(
const APInt &api) {
3828 initFromIEEEAPInt<semFloat8E5M2FNUZ>(api);
3831void IEEEFloat::initFromFloat8E4M3FNAPInt(
const APInt &api) {
3832 initFromIEEEAPInt<semFloat8E4M3FN>(api);
3835void IEEEFloat::initFromFloat8E4M3FNUZAPInt(
const APInt &api) {
3836 initFromIEEEAPInt<semFloat8E4M3FNUZ>(api);
3839void IEEEFloat::initFromFloat8E4M3B11FNUZAPInt(
const APInt &api) {
3840 initFromIEEEAPInt<semFloat8E4M3B11FNUZ>(api);
3847 return initFromHalfAPInt(api);
3849 return initFromBFloatAPInt(api);
3851 return initFromFloatAPInt(api);
3853 return initFromDoubleAPInt(api);
3855 return initFromF80LongDoubleAPInt(api);
3857 return initFromQuadrupleAPInt(api);
3859 return initFromPPCDoubleDoubleAPInt(api);
3861 return initFromFloat8E5M2APInt(api);
3863 return initFromFloat8E5M2FNUZAPInt(api);
3865 return initFromFloat8E4M3FNAPInt(api);
3867 return initFromFloat8E4M3FNUZAPInt(api);
3869 return initFromFloat8E4M3B11FNUZAPInt(api);
3876void IEEEFloat::makeLargest(
bool Negative) {
3883 exponent = semantics->maxExponent;
3887 unsigned PartCount = partCount();
3888 memset(significand, 0xFF,
sizeof(
integerPart)*(PartCount - 1));
3892 const unsigned NumUnusedHighBits =
3893 PartCount*integerPartWidth - semantics->precision;
3894 significand[PartCount - 1] = (NumUnusedHighBits < integerPartWidth)
3905void IEEEFloat::makeSmallest(
bool Negative) {
3912 exponent = semantics->minExponent;
3916void IEEEFloat::makeSmallestNormalized(
bool Negative) {
3925 exponent = semantics->minExponent;
3930 initFromAPInt(&Sem, API);
3933IEEEFloat::IEEEFloat(
float f) {
3937IEEEFloat::IEEEFloat(
double d) {
3943 Buffer.
append(Str.begin(), Str.end());
3948 void AdjustToPrecision(
APInt &significand,
3949 int &exp,
unsigned FormatPrecision) {
3953 unsigned bitsRequired = (FormatPrecision * 196 + 58) / 59;
3955 if (bits <= bitsRequired)
return;
3957 unsigned tensRemovable = (bits - bitsRequired) * 59 / 196;
3958 if (!tensRemovable)
return;
3960 exp += tensRemovable;
3965 if (tensRemovable & 1)
3967 tensRemovable >>= 1;
3968 if (!tensRemovable)
break;
3972 significand = significand.
udiv(divisor);
3980 int &exp,
unsigned FormatPrecision) {
3981 unsigned N = buffer.
size();
3982 if (
N <= FormatPrecision)
return;
3985 unsigned FirstSignificant =
N - FormatPrecision;
3992 if (buffer[FirstSignificant - 1] <
'5') {
3993 while (FirstSignificant <
N && buffer[FirstSignificant] ==
'0')
3996 exp += FirstSignificant;
3997 buffer.
erase(&buffer[0], &buffer[FirstSignificant]);
4003 for (
unsigned I = FirstSignificant;
I !=
N; ++
I) {
4004 if (buffer[
I] ==
'9') {
4013 if (FirstSignificant ==
N) {
4014 exp += FirstSignificant;
4020 exp += FirstSignificant;
4021 buffer.
erase(&buffer[0], &buffer[FirstSignificant]);
4026 unsigned FormatMaxPadding,
bool TruncateZero)
const {
4030 return append(Str,
"-Inf");
4032 return append(Str,
"+Inf");
4034 case fcNaN:
return append(Str,
"NaN");
4040 if (!FormatMaxPadding) {
4042 append(Str,
"0.0E+0");
4045 if (FormatPrecision > 1)
4046 Str.append(FormatPrecision - 1,
'0');
4047 append(Str,
"e+00");
4061 int exp = exponent - ((int) semantics->precision - 1);
4063 semantics->precision,
4068 if (!FormatPrecision) {
4076 FormatPrecision = 2 + semantics->precision * 59 / 196;
4081 exp += trailingZeros;
4087 }
else if (exp > 0) {
4089 significand = significand.
zext(semantics->precision + exp);
4090 significand <<= exp;
4104 unsigned precision = semantics->precision + (137 * texp + 136) / 59;
4108 significand = significand.
zext(precision);
4109 APInt five_to_the_i(precision, 5);
4111 if (texp & 1) significand *= five_to_the_i;
4115 five_to_the_i *= five_to_the_i;
4119 AdjustToPrecision(significand, exp, FormatPrecision);
4125 if (precision < 4) {
4128 significand = significand.
zext(precision);
4130 APInt ten(precision, 10);
4131 APInt digit(precision, 0);
4133 bool inTrail =
true;
4134 while (significand != 0) {
4142 if (inTrail && !d) exp++;
4149 assert(!buffer.
empty() &&
"no characters in buffer!");
4153 AdjustToPrecision(buffer, exp, FormatPrecision);
4155 unsigned NDigits = buffer.
size();
4158 bool FormatScientific;
4159 if (!FormatMaxPadding)
4160 FormatScientific =
true;
4166 FormatScientific = ((
unsigned) exp > FormatMaxPadding ||
4167 NDigits + (
unsigned) exp > FormatPrecision);
4170 int MSD = exp + (int) (NDigits - 1);
4173 FormatScientific =
false;
4177 FormatScientific = ((
unsigned) -MSD) > FormatMaxPadding;
4183 if (FormatScientific) {
4184 exp += (NDigits - 1);
4186 Str.push_back(buffer[NDigits-1]);
4188 if (NDigits == 1 && TruncateZero)
4191 for (
unsigned I = 1;
I != NDigits; ++
I)
4192 Str.push_back(buffer[NDigits-1-
I]);
4194 if (!TruncateZero && FormatPrecision > NDigits - 1)
4195 Str.append(FormatPrecision - NDigits + 1,
'0');
4197 Str.push_back(TruncateZero ?
'E' :
'e');
4199 Str.push_back(exp >= 0 ?
'+' :
'-');
4200 if (exp < 0) exp = -exp;
4203 expbuf.
push_back((
char) (
'0' + (exp % 10)));
4207 if (!TruncateZero && expbuf.
size() < 2)
4209 for (
unsigned I = 0,
E = expbuf.
size();
I !=
E; ++
I)
4210 Str.push_back(expbuf[
E-1-
I]);
4216 for (
unsigned I = 0;
I != NDigits; ++
I)
4217 Str.push_back(buffer[NDigits-1-
I]);
4226 int NWholeDigits = exp + (int) NDigits;
4229 if (NWholeDigits > 0) {
4231 Str.push_back(buffer[NDigits-
I-1]);
4234 unsigned NZeros = 1 + (
unsigned) -NWholeDigits;
4238 for (
unsigned Z = 1; Z != NZeros; ++Z)
4242 for (;
I != NDigits; ++
I)
4243 Str.push_back(buffer[NDigits-
I-1]);
4246bool IEEEFloat::getExactInverse(
APFloat *inv)
const {
4248 if (!isFiniteNonZero())
4253 if (significandLSB() != semantics->precision - 1)
4258 if (reciprocal.
divide(*
this, rmNearestTiesToEven) != opOK)
4267 reciprocal.significandLSB() == reciprocal.semantics->
precision - 1);
4270 *inv =
APFloat(reciprocal, *semantics);
4275bool IEEEFloat::isSignaling()
const {
4311 if (isSignaling()) {
4312 result = opInvalidOp;
4314 makeNaN(
false, isNegative(),
nullptr);
4319 makeSmallest(
false);
4323 if (isSmallest() && isNegative()) {
4332 if (isLargest() && !isNegative()) {
4340 category = fcInfinity;
4341 exponent = semantics->maxExponent + 1;
4355 bool WillCrossBinadeBoundary =
4356 exponent != semantics->minExponent && isSignificandAllZeros();
4374 if (WillCrossBinadeBoundary) {
4390 bool WillCrossBinadeBoundary = !isDenormal() && isSignificandAllOnes();
4392 if (WillCrossBinadeBoundary) {
4396 assert(exponent != semantics->maxExponent &&
4397 "We can not increment an exponent beyond the maxExponent allowed"
4398 " by the given floating point semantics.");
4401 incrementSignificand();
4415 return ::exponentNaN(*semantics);
4419 return ::exponentInf(*semantics);
4423 return ::exponentZero(*semantics);
4426void IEEEFloat::makeInf(
bool Negative) {
4429 makeNaN(
false, Negative);
4432 category = fcInfinity;
4438void IEEEFloat::makeZero(
bool Negative) {
4449void IEEEFloat::makeQuiet() {
4457 return IEEEFloat::IEK_NaN;
4459 return IEEEFloat::IEK_Zero;
4460 if (
Arg.isInfinity())
4461 return IEEEFloat::IEK_Inf;
4462 if (!
Arg.isDenormal())
4463 return Arg.exponent;
4466 int SignificandBits =
Arg.getSemantics().precision - 1;
4468 Normalized.exponent += SignificandBits;
4469 Normalized.normalize(IEEEFloat::rmNearestTiesToEven,
lfExactlyZero);
4470 return Normalized.exponent - SignificandBits;
4474 auto MaxExp =
X.getSemantics().maxExponent;
4475 auto MinExp =
X.getSemantics().minExponent;
4483 int SignificandBits =
X.getSemantics().precision - 1;
4484 int MaxIncrement = MaxExp - (MinExp - SignificandBits) + 1;
4487 X.exponent += std::clamp(Exp, -MaxIncrement - 1, MaxIncrement);
4498 if (Exp == IEEEFloat::IEK_NaN) {
4504 if (Exp == IEEEFloat::IEK_Inf)
4509 Exp = Exp == IEEEFloat::IEK_Zero ? 0 : Exp + 1;
4510 return scalbn(Val, -Exp, RM);
4543 Floats(new
APFloat[2]{std::move(First), std::move(Second)}) {
4565 Floats[0] =
RHS.Floats[0];
4566 Floats[1] =
RHS.Floats[1];
4567 }
else if (
this != &
RHS) {
4585 Floats[0] = std::move(z);
4586 Floats[1].makeZero(
false);
4590 auto AComparedToC = a.compareAbsoluteValue(c);
4603 Floats[0] = std::move(z);
4604 Floats[1].makeZero(
false);
4613 Status |= Floats[1].subtract(z, RM);
4614 Status |= Floats[1].add(c, RM);
4615 Status |= Floats[1].add(zz, RM);
4619 Status |= Floats[1].subtract(z, RM);
4620 Status |= Floats[1].add(a, RM);
4621 Status |= Floats[1].add(zz, RM);
4639 Floats[0] = std::move(z);
4640 Floats[1].makeZero(
false);
4644 Status |= Floats[0].add(zz, RM);
4646 Floats[1].makeZero(
false);
4649 Floats[1] = std::move(z);
4650 Status |= Floats[1].subtract(Floats[0], RM);
4651 Status |= Floats[1].add(zz, RM);
4657 const DoubleAPFloat &RHS,
4677 LHS.isNegative() !=
RHS.isNegative()) {
4678 Out.makeNaN(
false, Out.isNegative(),
nullptr);
4699 return Out.addImpl(
A, AA,
C,
CC, RM);
4704 return addWithSpecial(*
this,
RHS, *
this, RM);
4717 const auto &
LHS = *
this;
4744 Out.makeNaN(
false,
false,
nullptr);
4756 "Special cases not handled exhaustively");
4763 if (!
T.isFiniteNonZero()) {
4765 Floats[1].makeZero(
false);
4787 Status |= U.add(Tau, RM);
4790 if (!U.isFinite()) {
4791 Floats[1].makeZero(
false);
4850 Floats[0].changeSign();
4851 Floats[1].changeSign();
4856 auto Result = Floats[0].compareAbsoluteValue(
RHS.Floats[0]);
4859 Result = Floats[1].compareAbsoluteValue(
RHS.Floats[1]);
4861 auto Against = Floats[0].isNegative() ^ Floats[1].isNegative();
4862 auto RHSAgainst =
RHS.Floats[0].isNegative() ^
RHS.Floats[1].isNegative();
4863 if (Against && !RHSAgainst)
4865 if (!Against && RHSAgainst)
4867 if (!Against && !RHSAgainst)
4869 if (Against && RHSAgainst)
4876 return Floats[0].getCategory();
4882 Floats[0].makeInf(Neg);
4883 Floats[1].makeZero(
false);
4887 Floats[0].makeZero(Neg);
4888 Floats[1].makeZero(
false);
4901 Floats[0].makeSmallest(Neg);
4902 Floats[1].makeZero(
false);
4909 Floats[0].changeSign();
4910 Floats[1].makeZero(
false);
4914 Floats[0].makeNaN(SNaN, Neg, fill);
4915 Floats[1].makeZero(
false);
4919 auto Result = Floats[0].compare(
RHS.Floats[0]);
4922 return Floats[1].compare(
RHS.Floats[1]);
4927 return Floats[0].bitwiseIsEqual(
RHS.Floats[0]) &&
4928 Floats[1].bitwiseIsEqual(
RHS.Floats[1]);
4940 Floats[0].bitcastToAPInt().getRawData()[0],
4941 Floats[1].bitcastToAPInt().getRawData()[0],
4958 auto Ret = Tmp.
next(nextDown);
4965 unsigned int Width,
bool IsSigned,
4984 unsigned int InputSize,
4995 unsigned int InputSize,
5005 unsigned int HexDigits,
5015 (Floats[0].isDenormal() || Floats[1].isDenormal() ||
5017 Floats[0] != Floats[0] + Floats[1]);
5047 return Floats[0].isInteger() && Floats[1].isInteger();
5051 unsigned FormatPrecision,
5052 unsigned FormatMaxPadding,
5053 bool TruncateZero)
const {
5056 .
toString(Str, FormatPrecision, FormatMaxPadding, TruncateZero);
5083 Second =
scalbn(Second, -Exp, RM);
5089APFloat::Storage::Storage(IEEEFloat
F,
const fltSemantics &Semantics) {
5090 if (usesLayout<IEEEFloat>(Semantics)) {
5091 new (&
IEEE) IEEEFloat(std::move(
F));
5094 if (usesLayout<DoubleAPFloat>(Semantics)) {
5097 DoubleAPFloat(Semantics,
APFloat(std::move(
F), S),