/home/arjun/llvm-project/llvm/lib/Support/APFloat.cpp
| Line | Count | Source (jump to first uncovered line) | 
| 1 |  | //===-- APFloat.cpp - Implement APFloat class -----------------------------===// | 
| 2 |  | // | 
| 3 |  | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | 
| 4 |  | // See https://llvm.org/LICENSE.txt for license information. | 
| 5 |  | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | 
| 6 |  | // | 
| 7 |  | //===----------------------------------------------------------------------===// | 
| 8 |  | // | 
| 9 |  | // This file implements a class to represent arbitrary precision floating | 
| 10 |  | // point values and provide a variety of arithmetic operations on them. | 
| 11 |  | // | 
| 12 |  | //===----------------------------------------------------------------------===// | 
| 13 |  |  | 
| 14 |  | #include "llvm/ADT/APFloat.h" | 
| 15 |  | #include "llvm/ADT/APSInt.h" | 
| 16 |  | #include "llvm/ADT/ArrayRef.h" | 
| 17 |  | #include "llvm/ADT/FoldingSet.h" | 
| 18 |  | #include "llvm/ADT/Hashing.h" | 
| 19 |  | #include "llvm/ADT/StringExtras.h" | 
| 20 |  | #include "llvm/ADT/StringRef.h" | 
| 21 |  | #include "llvm/Config/llvm-config.h" | 
| 22 |  | #include "llvm/Support/Debug.h" | 
| 23 |  | #include "llvm/Support/Error.h" | 
| 24 |  | #include "llvm/Support/MathExtras.h" | 
| 25 |  | #include "llvm/Support/raw_ostream.h" | 
| 26 |  | #include <cstring> | 
| 27 |  | #include <limits.h> | 
| 28 |  |  | 
| 29 |  | #define APFLOAT_DISPATCH_ON_SEMANTICS(METHOD_CALL)                             \ | 
| 30 | 0 |   do {                                                                         \ | 
| 31 | 0 |     if (usesLayout<IEEEFloat>(getSemantics()))                                 \ | 
| 32 | 0 |       return U.IEEE.METHOD_CALL;                                               \ | 
| 33 | 0 |     if (usesLayout<DoubleAPFloat>(getSemantics()))                             \ | 
| 34 | 0 |       return U.Double.METHOD_CALL;                                             \ | 
| 35 | 0 |     llvm_unreachable("Unexpected semantics");                                  \ | 
| 36 | 0 |   } while (false) | 
| 37 |  |  | 
| 38 |  | using namespace llvm; | 
| 39 |  |  | 
| 40 |  | /// A macro used to combine two fcCategory enums into one key which can be used | 
| 41 |  | /// in a switch statement to classify how the interaction of two APFloat's | 
| 42 |  | /// categories affects an operation. | 
| 43 |  | /// | 
| 44 |  | /// TODO: If clang source code is ever allowed to use constexpr in its own | 
| 45 |  | /// codebase, change this into a static inline function. | 
| 46 | 0 | #define PackCategoriesIntoKey(_lhs, _rhs) ((_lhs) * 4 + (_rhs)) | 
| 47 |  |  | 
| 48 |  | /* Assumed in hexadecimal significand parsing, and conversion to | 
| 49 |  |    hexadecimal strings.  */ | 
| 50 |  | static_assert(APFloatBase::integerPartWidth % 4 == 0, "Part width must be divisible by 4!"); | 
| 51 |  |  | 
| 52 |  | namespace llvm { | 
| 53 |  |   /* Represents floating point arithmetic semantics.  */ | 
| 54 |  |   struct fltSemantics { | 
| 55 |  |     /* The largest E such that 2^E is representable; this matches the | 
| 56 |  |        definition of IEEE 754.  */ | 
| 57 |  |     APFloatBase::ExponentType maxExponent; | 
| 58 |  |  | 
| 59 |  |     /* The smallest E such that 2^E is a normalized number; this | 
| 60 |  |        matches the definition of IEEE 754.  */ | 
| 61 |  |     APFloatBase::ExponentType minExponent; | 
| 62 |  |  | 
| 63 |  |     /* Number of bits in the significand.  This includes the integer | 
| 64 |  |        bit.  */ | 
| 65 |  |     unsigned int precision; | 
| 66 |  |  | 
| 67 |  |     /* Number of bits actually used in the semantics. */ | 
| 68 |  |     unsigned int sizeInBits; | 
| 69 |  |   }; | 
| 70 |  |  | 
| 71 |  |   static const fltSemantics semIEEEhalf = {15, -14, 11, 16}; | 
| 72 |  |   static const fltSemantics semBFloat = {127, -126, 8, 16}; | 
| 73 |  |   static const fltSemantics semIEEEsingle = {127, -126, 24, 32}; | 
| 74 |  |   static const fltSemantics semIEEEdouble = {1023, -1022, 53, 64}; | 
| 75 |  |   static const fltSemantics semIEEEquad = {16383, -16382, 113, 128}; | 
| 76 |  |   static const fltSemantics semX87DoubleExtended = {16383, -16382, 64, 80}; | 
| 77 |  |   static const fltSemantics semBogus = {0, 0, 0, 0}; | 
| 78 |  |  | 
| 79 |  |   /* The IBM double-double semantics. Such a number consists of a pair of IEEE | 
| 80 |  |      64-bit doubles (Hi, Lo), where |Hi| > |Lo|, and if normal, | 
| 81 |  |      (double)(Hi + Lo) == Hi. The numeric value it's modeling is Hi + Lo. | 
| 82 |  |      Therefore it has two 53-bit mantissa parts that aren't necessarily adjacent | 
| 83 |  |      to each other, and two 11-bit exponents. | 
| 84 |  |  | 
| 85 |  |      Note: we need to make the value different from semBogus as otherwise | 
| 86 |  |      an unsafe optimization may collapse both values to a single address, | 
| 87 |  |      and we heavily rely on them having distinct addresses.             */ | 
| 88 |  |   static const fltSemantics semPPCDoubleDouble = {-1, 0, 0, 0}; | 
| 89 |  |  | 
| 90 |  |   /* These are legacy semantics for the fallback, inaccrurate implementation of | 
| 91 |  |      IBM double-double, if the accurate semPPCDoubleDouble doesn't handle the | 
| 92 |  |      operation. It's equivalent to having an IEEE number with consecutive 106 | 
| 93 |  |      bits of mantissa and 11 bits of exponent. | 
| 94 |  |  | 
| 95 |  |      It's not equivalent to IBM double-double. For example, a legit IBM | 
| 96 |  |      double-double, 1 + epsilon: | 
| 97 |  |  | 
| 98 |  |        1 + epsilon = 1 + (1 >> 1076) | 
| 99 |  |  | 
| 100 |  |      is not representable by a consecutive 106 bits of mantissa. | 
| 101 |  |  | 
| 102 |  |      Currently, these semantics are used in the following way: | 
| 103 |  |  | 
| 104 |  |        semPPCDoubleDouble -> (IEEEdouble, IEEEdouble) -> | 
| 105 |  |        (64-bit APInt, 64-bit APInt) -> (128-bit APInt) -> | 
| 106 |  |        semPPCDoubleDoubleLegacy -> IEEE operations | 
| 107 |  |  | 
| 108 |  |      We use bitcastToAPInt() to get the bit representation (in APInt) of the | 
| 109 |  |      underlying IEEEdouble, then use the APInt constructor to construct the | 
| 110 |  |      legacy IEEE float. | 
| 111 |  |  | 
| 112 |  |      TODO: Implement all operations in semPPCDoubleDouble, and delete these | 
| 113 |  |      semantics.  */ | 
| 114 |  |   static const fltSemantics semPPCDoubleDoubleLegacy = {1023, -1022 + 53, | 
| 115 |  |                                                         53 + 53, 128}; | 
| 116 |  |  | 
| 117 | 0 |   const llvm::fltSemantics &APFloatBase::EnumToSemantics(Semantics S) { | 
| 118 | 0 |     switch (S) { | 
| 119 | 0 |     case S_IEEEhalf: | 
| 120 | 0 |       return IEEEhalf(); | 
| 121 | 0 |     case S_BFloat: | 
| 122 | 0 |       return BFloat(); | 
| 123 | 0 |     case S_IEEEsingle: | 
| 124 | 0 |       return IEEEsingle(); | 
| 125 | 0 |     case S_IEEEdouble: | 
| 126 | 0 |       return IEEEdouble(); | 
| 127 | 0 |     case S_x87DoubleExtended: | 
| 128 | 0 |       return x87DoubleExtended(); | 
| 129 | 0 |     case S_IEEEquad: | 
| 130 | 0 |       return IEEEquad(); | 
| 131 | 0 |     case S_PPCDoubleDouble: | 
| 132 | 0 |       return PPCDoubleDouble(); | 
| 133 | 0 |     } | 
| 134 | 0 |     llvm_unreachable("Unrecognised floating semantics"); | 
| 135 | 0 |   } | 
| 136 |  |  | 
| 137 |  |   APFloatBase::Semantics | 
| 138 | 0 |   APFloatBase::SemanticsToEnum(const llvm::fltSemantics &Sem) { | 
| 139 | 0 |     if (&Sem == &llvm::APFloat::IEEEhalf()) | 
| 140 | 0 |       return S_IEEEhalf; | 
| 141 | 0 |     else if (&Sem == &llvm::APFloat::BFloat()) | 
| 142 | 0 |       return S_BFloat; | 
| 143 | 0 |     else if (&Sem == &llvm::APFloat::IEEEsingle()) | 
| 144 | 0 |       return S_IEEEsingle; | 
| 145 | 0 |     else if (&Sem == &llvm::APFloat::IEEEdouble()) | 
| 146 | 0 |       return S_IEEEdouble; | 
| 147 | 0 |     else if (&Sem == &llvm::APFloat::x87DoubleExtended()) | 
| 148 | 0 |       return S_x87DoubleExtended; | 
| 149 | 0 |     else if (&Sem == &llvm::APFloat::IEEEquad()) | 
| 150 | 0 |       return S_IEEEquad; | 
| 151 | 0 |     else if (&Sem == &llvm::APFloat::PPCDoubleDouble()) | 
| 152 | 0 |       return S_PPCDoubleDouble; | 
| 153 | 0 |     else | 
| 154 | 0 |       llvm_unreachable("Unknown floating semantics"); | 
| 155 | 0 |   } | 
| 156 |  |  | 
| 157 | 0 |   const fltSemantics &APFloatBase::IEEEhalf() { | 
| 158 | 0 |     return semIEEEhalf; | 
| 159 | 0 |   } | 
| 160 | 0 |   const fltSemantics &APFloatBase::BFloat() { | 
| 161 | 0 |     return semBFloat; | 
| 162 | 0 |   } | 
| 163 | 0 |   const fltSemantics &APFloatBase::IEEEsingle() { | 
| 164 | 0 |     return semIEEEsingle; | 
| 165 | 0 |   } | 
| 166 | 0 |   const fltSemantics &APFloatBase::IEEEdouble() { | 
| 167 | 0 |     return semIEEEdouble; | 
| 168 | 0 |   } | 
| 169 | 0 |   const fltSemantics &APFloatBase::IEEEquad() { | 
| 170 | 0 |     return semIEEEquad; | 
| 171 | 0 |   } | 
| 172 | 0 |   const fltSemantics &APFloatBase::x87DoubleExtended() { | 
| 173 | 0 |     return semX87DoubleExtended; | 
| 174 | 0 |   } | 
| 175 | 0 |   const fltSemantics &APFloatBase::Bogus() { | 
| 176 | 0 |     return semBogus; | 
| 177 | 0 |   } | 
| 178 | 0 |   const fltSemantics &APFloatBase::PPCDoubleDouble() { | 
| 179 | 0 |     return semPPCDoubleDouble; | 
| 180 | 0 |   } | 
| 181 |  |  | 
| 182 |  |   constexpr RoundingMode APFloatBase::rmNearestTiesToEven; | 
| 183 |  |   constexpr RoundingMode APFloatBase::rmTowardPositive; | 
| 184 |  |   constexpr RoundingMode APFloatBase::rmTowardNegative; | 
| 185 |  |   constexpr RoundingMode APFloatBase::rmTowardZero; | 
| 186 |  |   constexpr RoundingMode APFloatBase::rmNearestTiesToAway; | 
| 187 |  |  | 
| 188 |  |   /* A tight upper bound on number of parts required to hold the value | 
| 189 |  |      pow(5, power) is | 
| 190 |  |  | 
| 191 |  |        power * 815 / (351 * integerPartWidth) + 1 | 
| 192 |  |  | 
| 193 |  |      However, whilst the result may require only this many parts, | 
| 194 |  |      because we are multiplying two values to get it, the | 
| 195 |  |      multiplication may require an extra part with the excess part | 
| 196 |  |      being zero (consider the trivial case of 1 * 1, tcFullMultiply | 
| 197 |  |      requires two parts to hold the single-part result).  So we add an | 
| 198 |  |      extra one to guarantee enough space whilst multiplying.  */ | 
| 199 |  |   const unsigned int maxExponent = 16383; | 
| 200 |  |   const unsigned int maxPrecision = 113; | 
| 201 |  |   const unsigned int maxPowerOfFiveExponent = maxExponent + maxPrecision - 1; | 
| 202 |  |   const unsigned int maxPowerOfFiveParts = 2 + ((maxPowerOfFiveExponent * 815) / (351 * APFloatBase::integerPartWidth)); | 
| 203 |  |  | 
| 204 | 0 |   unsigned int APFloatBase::semanticsPrecision(const fltSemantics &semantics) { | 
| 205 | 0 |     return semantics.precision; | 
| 206 | 0 |   } | 
| 207 |  |   APFloatBase::ExponentType | 
| 208 | 0 |   APFloatBase::semanticsMaxExponent(const fltSemantics &semantics) { | 
| 209 | 0 |     return semantics.maxExponent; | 
| 210 | 0 |   } | 
| 211 |  |   APFloatBase::ExponentType | 
| 212 | 0 |   APFloatBase::semanticsMinExponent(const fltSemantics &semantics) { | 
| 213 | 0 |     return semantics.minExponent; | 
| 214 | 0 |   } | 
| 215 | 0 |   unsigned int APFloatBase::semanticsSizeInBits(const fltSemantics &semantics) { | 
| 216 | 0 |     return semantics.sizeInBits; | 
| 217 | 0 |   } | 
| 218 |  |  | 
| 219 | 0 |   unsigned APFloatBase::getSizeInBits(const fltSemantics &Sem) { | 
| 220 | 0 |     return Sem.sizeInBits; | 
| 221 | 0 | } | 
| 222 |  |  | 
| 223 |  | /* A bunch of private, handy routines.  */ | 
| 224 |  |  | 
| 225 | 0 | static inline Error createError(const Twine &Err) { | 
| 226 | 0 |   return make_error<StringError>(Err, inconvertibleErrorCode()); | 
| 227 | 0 | } | 
| 228 |  |  | 
| 229 |  | static inline unsigned int | 
| 230 |  | partCountForBits(unsigned int bits) | 
| 231 | 0 | { | 
| 232 | 0 |   return ((bits) + APFloatBase::integerPartWidth - 1) / APFloatBase::integerPartWidth; | 
| 233 | 0 | } | 
| 234 |  |  | 
| 235 |  | /* Returns 0U-9U.  Return values >= 10U are not digits.  */ | 
| 236 |  | static inline unsigned int | 
| 237 |  | decDigitValue(unsigned int c) | 
| 238 | 0 | { | 
| 239 | 0 |   return c - '0'; | 
| 240 | 0 | } | 
| 241 |  |  | 
| 242 |  | /* Return the value of a decimal exponent of the form | 
| 243 |  |    [+-]ddddddd. | 
| 244 |  |  | 
| 245 |  |    If the exponent overflows, returns a large exponent with the | 
| 246 |  |    appropriate sign.  */ | 
| 247 |  | static Expected<int> readExponent(StringRef::iterator begin, | 
| 248 | 0 |                                   StringRef::iterator end) { | 
| 249 | 0 |   bool isNegative; | 
| 250 | 0 |   unsigned int absExponent; | 
| 251 | 0 |   const unsigned int overlargeExponent = 24000;  /* FIXME.  */ | 
| 252 | 0 |   StringRef::iterator p = begin; | 
| 253 | 0 | 
 | 
| 254 | 0 |   // Treat no exponent as 0 to match binutils | 
| 255 | 0 |   if (p == end || ((*p == '-' || *p == '+') && (p + 1) == end)) { | 
| 256 | 0 |     return 0; | 
| 257 | 0 |   } | 
| 258 | 0 |  | 
| 259 | 0 |   isNegative = (*p == '-'); | 
| 260 | 0 |   if (*p == '-' || *p == '+') { | 
| 261 | 0 |     p++; | 
| 262 | 0 |     if (p == end) | 
| 263 | 0 |       return createError("Exponent has no digits"); | 
| 264 | 0 |   } | 
| 265 | 0 |  | 
| 266 | 0 |   absExponent = decDigitValue(*p++); | 
| 267 | 0 |   if (absExponent >= 10U) | 
| 268 | 0 |     return createError("Invalid character in exponent"); | 
| 269 | 0 |  | 
| 270 | 0 |   for (; p != end; ++p) { | 
| 271 | 0 |     unsigned int value; | 
| 272 | 0 | 
 | 
| 273 | 0 |     value = decDigitValue(*p); | 
| 274 | 0 |     if (value >= 10U) | 
| 275 | 0 |       return createError("Invalid character in exponent"); | 
| 276 | 0 |  | 
| 277 | 0 |     absExponent = absExponent * 10U + value; | 
| 278 | 0 |     if (absExponent >= overlargeExponent) { | 
| 279 | 0 |       absExponent = overlargeExponent; | 
| 280 | 0 |       break; | 
| 281 | 0 |     } | 
| 282 | 0 |   } | 
| 283 | 0 | 
 | 
| 284 | 0 |   if (isNegative) | 
| 285 | 0 |     return -(int) absExponent; | 
| 286 | 0 |   else | 
| 287 | 0 |     return (int) absExponent; | 
| 288 | 0 | } | 
| 289 |  |  | 
| 290 |  | /* This is ugly and needs cleaning up, but I don't immediately see | 
| 291 |  |    how whilst remaining safe.  */ | 
| 292 |  | static Expected<int> totalExponent(StringRef::iterator p, | 
| 293 |  |                                    StringRef::iterator end, | 
| 294 | 0 |                                    int exponentAdjustment) { | 
| 295 | 0 |   int unsignedExponent; | 
| 296 | 0 |   bool negative, overflow; | 
| 297 | 0 |   int exponent = 0; | 
| 298 | 0 | 
 | 
| 299 | 0 |   if (p == end) | 
| 300 | 0 |     return createError("Exponent has no digits"); | 
| 301 | 0 |  | 
| 302 | 0 |   negative = *p == '-'; | 
| 303 | 0 |   if (*p == '-' || *p == '+') { | 
| 304 | 0 |     p++; | 
| 305 | 0 |     if (p == end) | 
| 306 | 0 |       return createError("Exponent has no digits"); | 
| 307 | 0 |   } | 
| 308 | 0 |  | 
| 309 | 0 |   unsignedExponent = 0; | 
| 310 | 0 |   overflow = false; | 
| 311 | 0 |   for (; p != end; ++p) { | 
| 312 | 0 |     unsigned int value; | 
| 313 | 0 | 
 | 
| 314 | 0 |     value = decDigitValue(*p); | 
| 315 | 0 |     if (value >= 10U) | 
| 316 | 0 |       return createError("Invalid character in exponent"); | 
| 317 | 0 |  | 
| 318 | 0 |     unsignedExponent = unsignedExponent * 10 + value; | 
| 319 | 0 |     if (unsignedExponent > 32767) { | 
| 320 | 0 |       overflow = true; | 
| 321 | 0 |       break; | 
| 322 | 0 |     } | 
| 323 | 0 |   } | 
| 324 | 0 | 
 | 
| 325 | 0 |   if (exponentAdjustment > 32767 || exponentAdjustment < -32768) | 
| 326 | 0 |     overflow = true; | 
| 327 | 0 | 
 | 
| 328 | 0 |   if (!overflow) { | 
| 329 | 0 |     exponent = unsignedExponent; | 
| 330 | 0 |     if (negative) | 
| 331 | 0 |       exponent = -exponent; | 
| 332 | 0 |     exponent += exponentAdjustment; | 
| 333 | 0 |     if (exponent > 32767 || exponent < -32768) | 
| 334 | 0 |       overflow = true; | 
| 335 | 0 |   } | 
| 336 | 0 | 
 | 
| 337 | 0 |   if (overflow) | 
| 338 | 0 |     exponent = negative ? -32768: 32767; | 
| 339 | 0 | 
 | 
| 340 | 0 |   return exponent; | 
| 341 | 0 | } | 
| 342 |  |  | 
| 343 |  | static Expected<StringRef::iterator> | 
| 344 |  | skipLeadingZeroesAndAnyDot(StringRef::iterator begin, StringRef::iterator end, | 
| 345 | 0 |                            StringRef::iterator *dot) { | 
| 346 | 0 |   StringRef::iterator p = begin; | 
| 347 | 0 |   *dot = end; | 
| 348 | 0 |   while (p != end && *p == '0') | 
| 349 | 0 |     p++; | 
| 350 | 0 | 
 | 
| 351 | 0 |   if (p != end && *p == '.') { | 
| 352 | 0 |     *dot = p++; | 
| 353 | 0 | 
 | 
| 354 | 0 |     if (end - begin == 1) | 
| 355 | 0 |       return createError("Significand has no digits"); | 
| 356 | 0 |  | 
| 357 | 0 |     while (p != end && *p == '0') | 
| 358 | 0 |       p++; | 
| 359 | 0 |   } | 
| 360 | 0 | 
 | 
| 361 | 0 |   return p; | 
| 362 | 0 | } | 
| 363 |  |  | 
| 364 |  | /* Given a normal decimal floating point number of the form | 
| 365 |  |  | 
| 366 |  |      dddd.dddd[eE][+-]ddd | 
| 367 |  |  | 
| 368 |  |    where the decimal point and exponent are optional, fill out the | 
| 369 |  |    structure D.  Exponent is appropriate if the significand is | 
| 370 |  |    treated as an integer, and normalizedExponent if the significand | 
| 371 |  |    is taken to have the decimal point after a single leading | 
| 372 |  |    non-zero digit. | 
| 373 |  |  | 
| 374 |  |    If the value is zero, V->firstSigDigit points to a non-digit, and | 
| 375 |  |    the return exponent is zero. | 
| 376 |  | */ | 
| 377 |  | struct decimalInfo { | 
| 378 |  |   const char *firstSigDigit; | 
| 379 |  |   const char *lastSigDigit; | 
| 380 |  |   int exponent; | 
| 381 |  |   int normalizedExponent; | 
| 382 |  | }; | 
| 383 |  |  | 
| 384 |  | static Error interpretDecimal(StringRef::iterator begin, | 
| 385 | 0 |                               StringRef::iterator end, decimalInfo *D) { | 
| 386 | 0 |   StringRef::iterator dot = end; | 
| 387 | 0 | 
 | 
| 388 | 0 |   auto PtrOrErr = skipLeadingZeroesAndAnyDot(begin, end, &dot); | 
| 389 | 0 |   if (!PtrOrErr) | 
| 390 | 0 |     return PtrOrErr.takeError(); | 
| 391 | 0 |   StringRef::iterator p = *PtrOrErr; | 
| 392 | 0 | 
 | 
| 393 | 0 |   D->firstSigDigit = p; | 
| 394 | 0 |   D->exponent = 0; | 
| 395 | 0 |   D->normalizedExponent = 0; | 
| 396 | 0 | 
 | 
| 397 | 0 |   for (; p != end; ++p) { | 
| 398 | 0 |     if (*p == '.') { | 
| 399 | 0 |       if (dot != end) | 
| 400 | 0 |         return createError("String contains multiple dots"); | 
| 401 | 0 |       dot = p++; | 
| 402 | 0 |       if (p == end) | 
| 403 | 0 |         break; | 
| 404 | 0 |     } | 
| 405 | 0 |     if (decDigitValue(*p) >= 10U) | 
| 406 | 0 |       break; | 
| 407 | 0 |   } | 
| 408 | 0 | 
 | 
| 409 | 0 |   if (p != end) { | 
| 410 | 0 |     if (*p != 'e' && *p != 'E') | 
| 411 | 0 |       return createError("Invalid character in significand"); | 
| 412 | 0 |     if (p == begin) | 
| 413 | 0 |       return createError("Significand has no digits"); | 
| 414 | 0 |     if (dot != end && p - begin == 1) | 
| 415 | 0 |       return createError("Significand has no digits"); | 
| 416 | 0 |  | 
| 417 | 0 |     /* p points to the first non-digit in the string */ | 
| 418 | 0 |     auto ExpOrErr = readExponent(p + 1, end); | 
| 419 | 0 |     if (!ExpOrErr) | 
| 420 | 0 |       return ExpOrErr.takeError(); | 
| 421 | 0 |     D->exponent = *ExpOrErr; | 
| 422 | 0 | 
 | 
| 423 | 0 |     /* Implied decimal point?  */ | 
| 424 | 0 |     if (dot == end) | 
| 425 | 0 |       dot = p; | 
| 426 | 0 |   } | 
| 427 | 0 | 
 | 
| 428 | 0 |   /* If number is all zeroes accept any exponent.  */ | 
| 429 | 0 |   if (p != D->firstSigDigit) { | 
| 430 | 0 |     /* Drop insignificant trailing zeroes.  */ | 
| 431 | 0 |     if (p != begin) { | 
| 432 | 0 |       do | 
| 433 | 0 |         do | 
| 434 | 0 |           p--; | 
| 435 | 0 |         while (p != begin && *p == '0'); | 
| 436 | 0 |       while (p != begin && *p == '.'); | 
| 437 | 0 |     } | 
| 438 | 0 | 
 | 
| 439 | 0 |     /* Adjust the exponents for any decimal point.  */ | 
| 440 | 0 |     D->exponent += static_cast<APFloat::ExponentType>((dot - p) - (dot > p)); | 
| 441 | 0 |     D->normalizedExponent = (D->exponent + | 
| 442 | 0 |               static_cast<APFloat::ExponentType>((p - D->firstSigDigit) | 
| 443 | 0 |                                       - (dot > D->firstSigDigit && dot < p))); | 
| 444 | 0 |   } | 
| 445 | 0 | 
 | 
| 446 | 0 |   D->lastSigDigit = p; | 
| 447 | 0 |   return Error::success(); | 
| 448 | 0 | } | 
| 449 |  |  | 
| 450 |  | /* Return the trailing fraction of a hexadecimal number. | 
| 451 |  |    DIGITVALUE is the first hex digit of the fraction, P points to | 
| 452 |  |    the next digit.  */ | 
| 453 |  | static Expected<lostFraction> | 
| 454 |  | trailingHexadecimalFraction(StringRef::iterator p, StringRef::iterator end, | 
| 455 | 0 |                             unsigned int digitValue) { | 
| 456 | 0 |   unsigned int hexDigit; | 
| 457 | 0 | 
 | 
| 458 | 0 |   /* If the first trailing digit isn't 0 or 8 we can work out the | 
| 459 | 0 |      fraction immediately.  */ | 
| 460 | 0 |   if (digitValue > 8) | 
| 461 | 0 |     return lfMoreThanHalf; | 
| 462 | 0 |   else if (digitValue < 8 && digitValue > 0) | 
| 463 | 0 |     return lfLessThanHalf; | 
| 464 | 0 |  | 
| 465 | 0 |   // Otherwise we need to find the first non-zero digit. | 
| 466 | 0 |   while (p != end && (*p == '0' || *p == '.')) | 
| 467 | 0 |     p++; | 
| 468 | 0 | 
 | 
| 469 | 0 |   if (p == end) | 
| 470 | 0 |     return createError("Invalid trailing hexadecimal fraction!"); | 
| 471 | 0 |  | 
| 472 | 0 |   hexDigit = hexDigitValue(*p); | 
| 473 | 0 | 
 | 
| 474 | 0 |   /* If we ran off the end it is exactly zero or one-half, otherwise | 
| 475 | 0 |      a little more.  */ | 
| 476 | 0 |   if (hexDigit == -1U) | 
| 477 | 0 |     return digitValue == 0 ? lfExactlyZero: lfExactlyHalf; | 
| 478 | 0 |   else | 
| 479 | 0 |     return digitValue == 0 ? lfLessThanHalf: lfMoreThanHalf; | 
| 480 | 0 | } | 
| 481 |  |  | 
| 482 |  | /* Return the fraction lost were a bignum truncated losing the least | 
| 483 |  |    significant BITS bits.  */ | 
| 484 |  | static lostFraction | 
| 485 |  | lostFractionThroughTruncation(const APFloatBase::integerPart *parts, | 
| 486 |  |                               unsigned int partCount, | 
| 487 |  |                               unsigned int bits) | 
| 488 | 0 | { | 
| 489 | 0 |   unsigned int lsb; | 
| 490 | 0 | 
 | 
| 491 | 0 |   lsb = APInt::tcLSB(parts, partCount); | 
| 492 | 0 | 
 | 
| 493 | 0 |   /* Note this is guaranteed true if bits == 0, or LSB == -1U.  */ | 
| 494 | 0 |   if (bits <= lsb) | 
| 495 | 0 |     return lfExactlyZero; | 
| 496 | 0 |   if (bits == lsb + 1) | 
| 497 | 0 |     return lfExactlyHalf; | 
| 498 | 0 |   if (bits <= partCount * APFloatBase::integerPartWidth && | 
| 499 | 0 |       APInt::tcExtractBit(parts, bits - 1)) | 
| 500 | 0 |     return lfMoreThanHalf; | 
| 501 | 0 |  | 
| 502 | 0 |   return lfLessThanHalf; | 
| 503 | 0 | } | 
| 504 |  |  | 
| 505 |  | /* Shift DST right BITS bits noting lost fraction.  */ | 
| 506 |  | static lostFraction | 
| 507 |  | shiftRight(APFloatBase::integerPart *dst, unsigned int parts, unsigned int bits) | 
| 508 | 0 | { | 
| 509 | 0 |   lostFraction lost_fraction; | 
| 510 | 0 | 
 | 
| 511 | 0 |   lost_fraction = lostFractionThroughTruncation(dst, parts, bits); | 
| 512 | 0 | 
 | 
| 513 | 0 |   APInt::tcShiftRight(dst, parts, bits); | 
| 514 | 0 | 
 | 
| 515 | 0 |   return lost_fraction; | 
| 516 | 0 | } | 
| 517 |  |  | 
| 518 |  | /* Combine the effect of two lost fractions.  */ | 
| 519 |  | static lostFraction | 
| 520 |  | combineLostFractions(lostFraction moreSignificant, | 
| 521 |  |                      lostFraction lessSignificant) | 
| 522 | 0 | { | 
| 523 | 0 |   if (lessSignificant != lfExactlyZero) { | 
| 524 | 0 |     if (moreSignificant == lfExactlyZero) | 
| 525 | 0 |       moreSignificant = lfLessThanHalf; | 
| 526 | 0 |     else if (moreSignificant == lfExactlyHalf) | 
| 527 | 0 |       moreSignificant = lfMoreThanHalf; | 
| 528 | 0 |   } | 
| 529 | 0 | 
 | 
| 530 | 0 |   return moreSignificant; | 
| 531 | 0 | } | 
| 532 |  |  | 
| 533 |  | /* The error from the true value, in half-ulps, on multiplying two | 
| 534 |  |    floating point numbers, which differ from the value they | 
| 535 |  |    approximate by at most HUE1 and HUE2 half-ulps, is strictly less | 
| 536 |  |    than the returned value. | 
| 537 |  |  | 
| 538 |  |    See "How to Read Floating Point Numbers Accurately" by William D | 
| 539 |  |    Clinger.  */ | 
| 540 |  | static unsigned int | 
| 541 |  | HUerrBound(bool inexactMultiply, unsigned int HUerr1, unsigned int HUerr2) | 
| 542 | 0 | { | 
| 543 | 0 |   assert(HUerr1 < 2 || HUerr2 < 2 || (HUerr1 + HUerr2 < 8)); | 
| 544 | 0 | 
 | 
| 545 | 0 |   if (HUerr1 + HUerr2 == 0) | 
| 546 | 0 |     return inexactMultiply * 2;  /* <= inexactMultiply half-ulps.  */ | 
| 547 | 0 |   else | 
| 548 | 0 |     return inexactMultiply + 2 * (HUerr1 + HUerr2); | 
| 549 | 0 | } | 
| 550 |  |  | 
| 551 |  | /* The number of ulps from the boundary (zero, or half if ISNEAREST) | 
| 552 |  |    when the least significant BITS are truncated.  BITS cannot be | 
| 553 |  |    zero.  */ | 
| 554 |  | static APFloatBase::integerPart | 
| 555 |  | ulpsFromBoundary(const APFloatBase::integerPart *parts, unsigned int bits, | 
| 556 | 0 |                  bool isNearest) { | 
| 557 | 0 |   unsigned int count, partBits; | 
| 558 | 0 |   APFloatBase::integerPart part, boundary; | 
| 559 | 0 | 
 | 
| 560 | 0 |   assert(bits != 0); | 
| 561 | 0 | 
 | 
| 562 | 0 |   bits--; | 
| 563 | 0 |   count = bits / APFloatBase::integerPartWidth; | 
| 564 | 0 |   partBits = bits % APFloatBase::integerPartWidth + 1; | 
| 565 | 0 | 
 | 
| 566 | 0 |   part = parts[count] & (~(APFloatBase::integerPart) 0 >> (APFloatBase::integerPartWidth - partBits)); | 
| 567 | 0 | 
 | 
| 568 | 0 |   if (isNearest) | 
| 569 | 0 |     boundary = (APFloatBase::integerPart) 1 << (partBits - 1); | 
| 570 | 0 |   else | 
| 571 | 0 |     boundary = 0; | 
| 572 | 0 | 
 | 
| 573 | 0 |   if (count == 0) { | 
| 574 | 0 |     if (part - boundary <= boundary - part) | 
| 575 | 0 |       return part - boundary; | 
| 576 | 0 |     else | 
| 577 | 0 |       return boundary - part; | 
| 578 | 0 |   } | 
| 579 | 0 |  | 
| 580 | 0 |   if (part == boundary) { | 
| 581 | 0 |     while (--count) | 
| 582 | 0 |       if (parts[count]) | 
| 583 | 0 |         return ~(APFloatBase::integerPart) 0; /* A lot.  */ | 
| 584 | 0 | 
 | 
| 585 | 0 |     return parts[0]; | 
| 586 | 0 |   } else if (part == boundary - 1) { | 
| 587 | 0 |     while (--count) | 
| 588 | 0 |       if (~parts[count]) | 
| 589 | 0 |         return ~(APFloatBase::integerPart) 0; /* A lot.  */ | 
| 590 | 0 | 
 | 
| 591 | 0 |     return -parts[0]; | 
| 592 | 0 |   } | 
| 593 | 0 |  | 
| 594 | 0 |   return ~(APFloatBase::integerPart) 0; /* A lot.  */ | 
| 595 | 0 | } | 
| 596 |  |  | 
| 597 |  | /* Place pow(5, power) in DST, and return the number of parts used. | 
| 598 |  |    DST must be at least one part larger than size of the answer.  */ | 
| 599 |  | static unsigned int | 
| 600 | 0 | powerOf5(APFloatBase::integerPart *dst, unsigned int power) { | 
| 601 | 0 |   static const APFloatBase::integerPart firstEightPowers[] = { 1, 5, 25, 125, 625, 3125, 15625, 78125 }; | 
| 602 | 0 |   APFloatBase::integerPart pow5s[maxPowerOfFiveParts * 2 + 5]; | 
| 603 | 0 |   pow5s[0] = 78125 * 5; | 
| 604 | 0 | 
 | 
| 605 | 0 |   unsigned int partsCount[16] = { 1 }; | 
| 606 | 0 |   APFloatBase::integerPart scratch[maxPowerOfFiveParts], *p1, *p2, *pow5; | 
| 607 | 0 |   unsigned int result; | 
| 608 | 0 |   assert(power <= maxExponent); | 
| 609 | 0 | 
 | 
| 610 | 0 |   p1 = dst; | 
| 611 | 0 |   p2 = scratch; | 
| 612 | 0 | 
 | 
| 613 | 0 |   *p1 = firstEightPowers[power & 7]; | 
| 614 | 0 |   power >>= 3; | 
| 615 | 0 | 
 | 
| 616 | 0 |   result = 1; | 
| 617 | 0 |   pow5 = pow5s; | 
| 618 | 0 | 
 | 
| 619 | 0 |   for (unsigned int n = 0; power; power >>= 1, n++) { | 
| 620 | 0 |     unsigned int pc; | 
| 621 | 0 | 
 | 
| 622 | 0 |     pc = partsCount[n]; | 
| 623 | 0 | 
 | 
| 624 | 0 |     /* Calculate pow(5,pow(2,n+3)) if we haven't yet.  */ | 
| 625 | 0 |     if (pc == 0) { | 
| 626 | 0 |       pc = partsCount[n - 1]; | 
| 627 | 0 |       APInt::tcFullMultiply(pow5, pow5 - pc, pow5 - pc, pc, pc); | 
| 628 | 0 |       pc *= 2; | 
| 629 | 0 |       if (pow5[pc - 1] == 0) | 
| 630 | 0 |         pc--; | 
| 631 | 0 |       partsCount[n] = pc; | 
| 632 | 0 |     } | 
| 633 | 0 | 
 | 
| 634 | 0 |     if (power & 1) { | 
| 635 | 0 |       APFloatBase::integerPart *tmp; | 
| 636 | 0 | 
 | 
| 637 | 0 |       APInt::tcFullMultiply(p2, p1, pow5, result, pc); | 
| 638 | 0 |       result += pc; | 
| 639 | 0 |       if (p2[result - 1] == 0) | 
| 640 | 0 |         result--; | 
| 641 | 0 | 
 | 
| 642 | 0 |       /* Now result is in p1 with partsCount parts and p2 is scratch | 
| 643 | 0 |          space.  */ | 
| 644 | 0 |       tmp = p1; | 
| 645 | 0 |       p1 = p2; | 
| 646 | 0 |       p2 = tmp; | 
| 647 | 0 |     } | 
| 648 | 0 | 
 | 
| 649 | 0 |     pow5 += pc; | 
| 650 | 0 |   } | 
| 651 | 0 | 
 | 
| 652 | 0 |   if (p1 != dst) | 
| 653 | 0 |     APInt::tcAssign(dst, p1, result); | 
| 654 | 0 | 
 | 
| 655 | 0 |   return result; | 
| 656 | 0 | } | 
| 657 |  |  | 
| 658 |  | /* Zero at the end to avoid modular arithmetic when adding one; used | 
| 659 |  |    when rounding up during hexadecimal output.  */ | 
| 660 |  | static const char hexDigitsLower[] = "0123456789abcdef0"; | 
| 661 |  | static const char hexDigitsUpper[] = "0123456789ABCDEF0"; | 
| 662 |  | static const char infinityL[] = "infinity"; | 
| 663 |  | static const char infinityU[] = "INFINITY"; | 
| 664 |  | static const char NaNL[] = "nan"; | 
| 665 |  | static const char NaNU[] = "NAN"; | 
| 666 |  |  | 
| 667 |  | /* Write out an integerPart in hexadecimal, starting with the most | 
| 668 |  |    significant nibble.  Write out exactly COUNT hexdigits, return | 
| 669 |  |    COUNT.  */ | 
| 670 |  | static unsigned int | 
| 671 |  | partAsHex (char *dst, APFloatBase::integerPart part, unsigned int count, | 
| 672 |  |            const char *hexDigitChars) | 
| 673 | 0 | { | 
| 674 | 0 |   unsigned int result = count; | 
| 675 | 0 | 
 | 
| 676 | 0 |   assert(count != 0 && count <= APFloatBase::integerPartWidth / 4); | 
| 677 | 0 | 
 | 
| 678 | 0 |   part >>= (APFloatBase::integerPartWidth - 4 * count); | 
| 679 | 0 |   while (count--) { | 
| 680 | 0 |     dst[count] = hexDigitChars[part & 0xf]; | 
| 681 | 0 |     part >>= 4; | 
| 682 | 0 |   } | 
| 683 | 0 | 
 | 
| 684 | 0 |   return result; | 
| 685 | 0 | } | 
| 686 |  |  | 
| 687 |  | /* Write out an unsigned decimal integer.  */ | 
| 688 |  | static char * | 
| 689 |  | writeUnsignedDecimal (char *dst, unsigned int n) | 
| 690 | 0 | { | 
| 691 | 0 |   char buff[40], *p; | 
| 692 | 0 | 
 | 
| 693 | 0 |   p = buff; | 
| 694 | 0 |   do | 
| 695 | 0 |     *p++ = '0' + n % 10; | 
| 696 | 0 |   while (n /= 10); | 
| 697 | 0 | 
 | 
| 698 | 0 |   do | 
| 699 | 0 |     *dst++ = *--p; | 
| 700 | 0 |   while (p != buff); | 
| 701 | 0 | 
 | 
| 702 | 0 |   return dst; | 
| 703 | 0 | } | 
| 704 |  |  | 
| 705 |  | /* Write out a signed decimal integer.  */ | 
| 706 |  | static char * | 
| 707 |  | writeSignedDecimal (char *dst, int value) | 
| 708 | 0 | { | 
| 709 | 0 |   if (value < 0) { | 
| 710 | 0 |     *dst++ = '-'; | 
| 711 | 0 |     dst = writeUnsignedDecimal(dst, -(unsigned) value); | 
| 712 | 0 |   } else | 
| 713 | 0 |     dst = writeUnsignedDecimal(dst, value); | 
| 714 | 0 | 
 | 
| 715 | 0 |   return dst; | 
| 716 | 0 | } | 
| 717 |  |  | 
| 718 |  | namespace detail { | 
| 719 |  | /* Constructors.  */ | 
| 720 | 0 | void IEEEFloat::initialize(const fltSemantics *ourSemantics) { | 
| 721 | 0 |   unsigned int count; | 
| 722 | 0 | 
 | 
| 723 | 0 |   semantics = ourSemantics; | 
| 724 | 0 |   count = partCount(); | 
| 725 | 0 |   if (count > 1) | 
| 726 | 0 |     significand.parts = new integerPart[count]; | 
| 727 | 0 | } | 
| 728 |  |  | 
| 729 | 0 | void IEEEFloat::freeSignificand() { | 
| 730 | 0 |   if (needsCleanup()) | 
| 731 | 0 |     delete [] significand.parts; | 
| 732 | 0 | } | 
| 733 |  |  | 
| 734 | 0 | void IEEEFloat::assign(const IEEEFloat &rhs) { | 
| 735 | 0 |   assert(semantics == rhs.semantics); | 
| 736 | 0 | 
 | 
| 737 | 0 |   sign = rhs.sign; | 
| 738 | 0 |   category = rhs.category; | 
| 739 | 0 |   exponent = rhs.exponent; | 
| 740 | 0 |   if (isFiniteNonZero() || category == fcNaN) | 
| 741 | 0 |     copySignificand(rhs); | 
| 742 | 0 | } | 
| 743 |  |  | 
| 744 | 0 | void IEEEFloat::copySignificand(const IEEEFloat &rhs) { | 
| 745 | 0 |   assert(isFiniteNonZero() || category == fcNaN); | 
| 746 | 0 |   assert(rhs.partCount() >= partCount()); | 
| 747 | 0 | 
 | 
| 748 | 0 |   APInt::tcAssign(significandParts(), rhs.significandParts(), | 
| 749 | 0 |                   partCount()); | 
| 750 | 0 | } | 
| 751 |  |  | 
| 752 |  | /* Make this number a NaN, with an arbitrary but deterministic value | 
| 753 |  |    for the significand.  If double or longer, this is a signalling NaN, | 
| 754 |  |    which may not be ideal.  If float, this is QNaN(0).  */ | 
| 755 | 0 | void IEEEFloat::makeNaN(bool SNaN, bool Negative, const APInt *fill) { | 
| 756 | 0 |   category = fcNaN; | 
| 757 | 0 |   sign = Negative; | 
| 758 | 0 | 
 | 
| 759 | 0 |   integerPart *significand = significandParts(); | 
| 760 | 0 |   unsigned numParts = partCount(); | 
| 761 | 0 | 
 | 
| 762 | 0 |   // Set the significand bits to the fill. | 
| 763 | 0 |   if (!fill || fill->getNumWords() < numParts) | 
| 764 | 0 |     APInt::tcSet(significand, 0, numParts); | 
| 765 | 0 |   if (fill) { | 
| 766 | 0 |     APInt::tcAssign(significand, fill->getRawData(), | 
| 767 | 0 |                     std::min(fill->getNumWords(), numParts)); | 
| 768 | 0 | 
 | 
| 769 | 0 |     // Zero out the excess bits of the significand. | 
| 770 | 0 |     unsigned bitsToPreserve = semantics->precision - 1; | 
| 771 | 0 |     unsigned part = bitsToPreserve / 64; | 
| 772 | 0 |     bitsToPreserve %= 64; | 
| 773 | 0 |     significand[part] &= ((1ULL << bitsToPreserve) - 1); | 
| 774 | 0 |     for (part++; part != numParts; ++part) | 
| 775 | 0 |       significand[part] = 0; | 
| 776 | 0 |   } | 
| 777 | 0 | 
 | 
| 778 | 0 |   unsigned QNaNBit = semantics->precision - 2; | 
| 779 | 0 | 
 | 
| 780 | 0 |   if (SNaN) { | 
| 781 | 0 |     // We always have to clear the QNaN bit to make it an SNaN. | 
| 782 | 0 |     APInt::tcClearBit(significand, QNaNBit); | 
| 783 | 0 | 
 | 
| 784 | 0 |     // If there are no bits set in the payload, we have to set | 
| 785 | 0 |     // *something* to make it a NaN instead of an infinity; | 
| 786 | 0 |     // conventionally, this is the next bit down from the QNaN bit. | 
| 787 | 0 |     if (APInt::tcIsZero(significand, numParts)) | 
| 788 | 0 |       APInt::tcSetBit(significand, QNaNBit - 1); | 
| 789 | 0 |   } else { | 
| 790 | 0 |     // We always have to set the QNaN bit to make it a QNaN. | 
| 791 | 0 |     APInt::tcSetBit(significand, QNaNBit); | 
| 792 | 0 |   } | 
| 793 | 0 | 
 | 
| 794 | 0 |   // For x87 extended precision, we want to make a NaN, not a | 
| 795 | 0 |   // pseudo-NaN.  Maybe we should expose the ability to make | 
| 796 | 0 |   // pseudo-NaNs? | 
| 797 | 0 |   if (semantics == &semX87DoubleExtended) | 
| 798 | 0 |     APInt::tcSetBit(significand, QNaNBit + 1); | 
| 799 | 0 | } | 
| 800 |  |  | 
| 801 | 0 | IEEEFloat &IEEEFloat::operator=(const IEEEFloat &rhs) { | 
| 802 | 0 |   if (this != &rhs) { | 
| 803 | 0 |     if (semantics != rhs.semantics) { | 
| 804 | 0 |       freeSignificand(); | 
| 805 | 0 |       initialize(rhs.semantics); | 
| 806 | 0 |     } | 
| 807 | 0 |     assign(rhs); | 
| 808 | 0 |   } | 
| 809 | 0 | 
 | 
| 810 | 0 |   return *this; | 
| 811 | 0 | } | 
| 812 |  |  | 
| 813 | 0 | IEEEFloat &IEEEFloat::operator=(IEEEFloat &&rhs) { | 
| 814 | 0 |   freeSignificand(); | 
| 815 | 0 | 
 | 
| 816 | 0 |   semantics = rhs.semantics; | 
| 817 | 0 |   significand = rhs.significand; | 
| 818 | 0 |   exponent = rhs.exponent; | 
| 819 | 0 |   category = rhs.category; | 
| 820 | 0 |   sign = rhs.sign; | 
| 821 | 0 | 
 | 
| 822 | 0 |   rhs.semantics = &semBogus; | 
| 823 | 0 |   return *this; | 
| 824 | 0 | } | 
| 825 |  |  | 
| 826 | 0 | bool IEEEFloat::isDenormal() const { | 
| 827 | 0 |   return isFiniteNonZero() && (exponent == semantics->minExponent) && | 
| 828 | 0 |          (APInt::tcExtractBit(significandParts(), | 
| 829 | 0 |                               semantics->precision - 1) == 0); | 
| 830 | 0 | } | 
| 831 |  |  | 
| 832 | 0 | bool IEEEFloat::isSmallest() const { | 
| 833 | 0 |   // The smallest number by magnitude in our format will be the smallest | 
| 834 | 0 |   // denormal, i.e. the floating point number with exponent being minimum | 
| 835 | 0 |   // exponent and significand bitwise equal to 1 (i.e. with MSB equal to 0). | 
| 836 | 0 |   return isFiniteNonZero() && exponent == semantics->minExponent && | 
| 837 | 0 |     significandMSB() == 0; | 
| 838 | 0 | } | 
| 839 |  |  | 
| 840 | 0 | bool IEEEFloat::isSignificandAllOnes() const { | 
| 841 | 0 |   // Test if the significand excluding the integral bit is all ones. This allows | 
| 842 | 0 |   // us to test for binade boundaries. | 
| 843 | 0 |   const integerPart *Parts = significandParts(); | 
| 844 | 0 |   const unsigned PartCount = partCount(); | 
| 845 | 0 |   for (unsigned i = 0; i < PartCount - 1; i++) | 
| 846 | 0 |     if (~Parts[i]) | 
| 847 | 0 |       return false; | 
| 848 | 0 | 
 | 
| 849 | 0 |   // Set the unused high bits to all ones when we compare. | 
| 850 | 0 |   const unsigned NumHighBits = | 
| 851 | 0 |     PartCount*integerPartWidth - semantics->precision + 1; | 
| 852 | 0 |   assert(NumHighBits <= integerPartWidth && "Can not have more high bits to " | 
| 853 | 0 |          "fill than integerPartWidth"); | 
| 854 | 0 |   const integerPart HighBitFill = | 
| 855 | 0 |     ~integerPart(0) << (integerPartWidth - NumHighBits); | 
| 856 | 0 |   if (~(Parts[PartCount - 1] | HighBitFill)) | 
| 857 | 0 |     return false; | 
| 858 | 0 |  | 
| 859 | 0 |   return true; | 
| 860 | 0 | } | 
| 861 |  |  | 
| 862 | 0 | bool IEEEFloat::isSignificandAllZeros() const { | 
| 863 | 0 |   // Test if the significand excluding the integral bit is all zeros. This | 
| 864 | 0 |   // allows us to test for binade boundaries. | 
| 865 | 0 |   const integerPart *Parts = significandParts(); | 
| 866 | 0 |   const unsigned PartCount = partCount(); | 
| 867 | 0 | 
 | 
| 868 | 0 |   for (unsigned i = 0; i < PartCount - 1; i++) | 
| 869 | 0 |     if (Parts[i]) | 
| 870 | 0 |       return false; | 
| 871 | 0 | 
 | 
| 872 | 0 |   const unsigned NumHighBits = | 
| 873 | 0 |     PartCount*integerPartWidth - semantics->precision + 1; | 
| 874 | 0 |   assert(NumHighBits <= integerPartWidth && "Can not have more high bits to " | 
| 875 | 0 |          "clear than integerPartWidth"); | 
| 876 | 0 |   const integerPart HighBitMask = ~integerPart(0) >> NumHighBits; | 
| 877 | 0 | 
 | 
| 878 | 0 |   if (Parts[PartCount - 1] & HighBitMask) | 
| 879 | 0 |     return false; | 
| 880 | 0 |  | 
| 881 | 0 |   return true; | 
| 882 | 0 | } | 
| 883 |  |  | 
| 884 | 0 | bool IEEEFloat::isLargest() const { | 
| 885 | 0 |   // The largest number by magnitude in our format will be the floating point | 
| 886 | 0 |   // number with maximum exponent and with significand that is all ones. | 
| 887 | 0 |   return isFiniteNonZero() && exponent == semantics->maxExponent | 
| 888 | 0 |     && isSignificandAllOnes(); | 
| 889 | 0 | } | 
| 890 |  |  | 
| 891 | 0 | bool IEEEFloat::isInteger() const { | 
| 892 | 0 |   // This could be made more efficient; I'm going for obviously correct. | 
| 893 | 0 |   if (!isFinite()) return false; | 
| 894 | 0 |   IEEEFloat truncated = *this; | 
| 895 | 0 |   truncated.roundToIntegral(rmTowardZero); | 
| 896 | 0 |   return compare(truncated) == cmpEqual; | 
| 897 | 0 | } | 
| 898 |  |  | 
| 899 | 0 | bool IEEEFloat::bitwiseIsEqual(const IEEEFloat &rhs) const { | 
| 900 | 0 |   if (this == &rhs) | 
| 901 | 0 |     return true; | 
| 902 | 0 |   if (semantics != rhs.semantics || | 
| 903 | 0 |       category != rhs.category || | 
| 904 | 0 |       sign != rhs.sign) | 
| 905 | 0 |     return false; | 
| 906 | 0 |   if (category==fcZero || category==fcInfinity) | 
| 907 | 0 |     return true; | 
| 908 | 0 |  | 
| 909 | 0 |   if (isFiniteNonZero() && exponent != rhs.exponent) | 
| 910 | 0 |     return false; | 
| 911 | 0 |  | 
| 912 | 0 |   return std::equal(significandParts(), significandParts() + partCount(), | 
| 913 | 0 |                     rhs.significandParts()); | 
| 914 | 0 | } | 
| 915 |  |  | 
| 916 | 0 | IEEEFloat::IEEEFloat(const fltSemantics &ourSemantics, integerPart value) { | 
| 917 | 0 |   initialize(&ourSemantics); | 
| 918 | 0 |   sign = 0; | 
| 919 | 0 |   category = fcNormal; | 
| 920 | 0 |   zeroSignificand(); | 
| 921 | 0 |   exponent = ourSemantics.precision - 1; | 
| 922 | 0 |   significandParts()[0] = value; | 
| 923 | 0 |   normalize(rmNearestTiesToEven, lfExactlyZero); | 
| 924 | 0 | } | 
| 925 |  |  | 
| 926 | 0 | IEEEFloat::IEEEFloat(const fltSemantics &ourSemantics) { | 
| 927 | 0 |   initialize(&ourSemantics); | 
| 928 | 0 |   category = fcZero; | 
| 929 | 0 |   sign = false; | 
| 930 | 0 | } | 
| 931 |  |  | 
| 932 |  | // Delegate to the previous constructor, because later copy constructor may | 
| 933 |  | // actually inspects category, which can't be garbage. | 
| 934 |  | IEEEFloat::IEEEFloat(const fltSemantics &ourSemantics, uninitializedTag tag) | 
| 935 | 0 |     : IEEEFloat(ourSemantics) {} | 
| 936 |  |  | 
| 937 | 0 | IEEEFloat::IEEEFloat(const IEEEFloat &rhs) { | 
| 938 | 0 |   initialize(rhs.semantics); | 
| 939 | 0 |   assign(rhs); | 
| 940 | 0 | } | 
| 941 |  |  | 
| 942 | 0 | IEEEFloat::IEEEFloat(IEEEFloat &&rhs) : semantics(&semBogus) { | 
| 943 | 0 |   *this = std::move(rhs); | 
| 944 | 0 | } | 
| 945 |  |  | 
| 946 | 0 | IEEEFloat::~IEEEFloat() { freeSignificand(); } | 
| 947 |  |  | 
| 948 | 0 | unsigned int IEEEFloat::partCount() const { | 
| 949 | 0 |   return partCountForBits(semantics->precision + 1); | 
| 950 | 0 | } | 
| 951 |  |  | 
| 952 | 0 | const IEEEFloat::integerPart *IEEEFloat::significandParts() const { | 
| 953 | 0 |   return const_cast<IEEEFloat *>(this)->significandParts(); | 
| 954 | 0 | } | 
| 955 |  |  | 
| 956 | 0 | IEEEFloat::integerPart *IEEEFloat::significandParts() { | 
| 957 | 0 |   if (partCount() > 1) | 
| 958 | 0 |     return significand.parts; | 
| 959 | 0 |   else | 
| 960 | 0 |     return &significand.part; | 
| 961 | 0 | } | 
| 962 |  |  | 
| 963 | 0 | void IEEEFloat::zeroSignificand() { | 
| 964 | 0 |   APInt::tcSet(significandParts(), 0, partCount()); | 
| 965 | 0 | } | 
| 966 |  |  | 
| 967 |  | /* Increment an fcNormal floating point number's significand.  */ | 
| 968 | 0 | void IEEEFloat::incrementSignificand() { | 
| 969 | 0 |   integerPart carry; | 
| 970 | 0 | 
 | 
| 971 | 0 |   carry = APInt::tcIncrement(significandParts(), partCount()); | 
| 972 | 0 | 
 | 
| 973 | 0 |   /* Our callers should never cause us to overflow.  */ | 
| 974 | 0 |   assert(carry == 0); | 
| 975 | 0 |   (void)carry; | 
| 976 | 0 | } | 
| 977 |  |  | 
| 978 |  | /* Add the significand of the RHS.  Returns the carry flag.  */ | 
| 979 | 0 | IEEEFloat::integerPart IEEEFloat::addSignificand(const IEEEFloat &rhs) { | 
| 980 | 0 |   integerPart *parts; | 
| 981 | 0 | 
 | 
| 982 | 0 |   parts = significandParts(); | 
| 983 | 0 | 
 | 
| 984 | 0 |   assert(semantics == rhs.semantics); | 
| 985 | 0 |   assert(exponent == rhs.exponent); | 
| 986 | 0 | 
 | 
| 987 | 0 |   return APInt::tcAdd(parts, rhs.significandParts(), 0, partCount()); | 
| 988 | 0 | } | 
| 989 |  |  | 
| 990 |  | /* Subtract the significand of the RHS with a borrow flag.  Returns | 
| 991 |  |    the borrow flag.  */ | 
| 992 |  | IEEEFloat::integerPart IEEEFloat::subtractSignificand(const IEEEFloat &rhs, | 
| 993 | 0 |                                                       integerPart borrow) { | 
| 994 | 0 |   integerPart *parts; | 
| 995 | 0 | 
 | 
| 996 | 0 |   parts = significandParts(); | 
| 997 | 0 | 
 | 
| 998 | 0 |   assert(semantics == rhs.semantics); | 
| 999 | 0 |   assert(exponent == rhs.exponent); | 
| 1000 | 0 | 
 | 
| 1001 | 0 |   return APInt::tcSubtract(parts, rhs.significandParts(), borrow, | 
| 1002 | 0 |                            partCount()); | 
| 1003 | 0 | } | 
| 1004 |  |  | 
| 1005 |  | /* Multiply the significand of the RHS.  If ADDEND is non-NULL, add it | 
| 1006 |  |    on to the full-precision result of the multiplication.  Returns the | 
| 1007 |  |    lost fraction.  */ | 
| 1008 |  | lostFraction IEEEFloat::multiplySignificand(const IEEEFloat &rhs, | 
| 1009 | 0 |                                             IEEEFloat addend) { | 
| 1010 | 0 |   unsigned int omsb;        // One, not zero, based MSB. | 
| 1011 | 0 |   unsigned int partsCount, newPartsCount, precision; | 
| 1012 | 0 |   integerPart *lhsSignificand; | 
| 1013 | 0 |   integerPart scratch[4]; | 
| 1014 | 0 |   integerPart *fullSignificand; | 
| 1015 | 0 |   lostFraction lost_fraction; | 
| 1016 | 0 |   bool ignored; | 
| 1017 | 0 | 
 | 
| 1018 | 0 |   assert(semantics == rhs.semantics); | 
| 1019 | 0 | 
 | 
| 1020 | 0 |   precision = semantics->precision; | 
| 1021 | 0 | 
 | 
| 1022 | 0 |   // Allocate space for twice as many bits as the original significand, plus one | 
| 1023 | 0 |   // extra bit for the addition to overflow into. | 
| 1024 | 0 |   newPartsCount = partCountForBits(precision * 2 + 1); | 
| 1025 | 0 | 
 | 
| 1026 | 0 |   if (newPartsCount > 4) | 
| 1027 | 0 |     fullSignificand = new integerPart[newPartsCount]; | 
| 1028 | 0 |   else | 
| 1029 | 0 |     fullSignificand = scratch; | 
| 1030 | 0 | 
 | 
| 1031 | 0 |   lhsSignificand = significandParts(); | 
| 1032 | 0 |   partsCount = partCount(); | 
| 1033 | 0 | 
 | 
| 1034 | 0 |   APInt::tcFullMultiply(fullSignificand, lhsSignificand, | 
| 1035 | 0 |                         rhs.significandParts(), partsCount, partsCount); | 
| 1036 | 0 | 
 | 
| 1037 | 0 |   lost_fraction = lfExactlyZero; | 
| 1038 | 0 |   omsb = APInt::tcMSB(fullSignificand, newPartsCount) + 1; | 
| 1039 | 0 |   exponent += rhs.exponent; | 
| 1040 | 0 | 
 | 
| 1041 | 0 |   // Assume the operands involved in the multiplication are single-precision | 
| 1042 | 0 |   // FP, and the two multiplicants are: | 
| 1043 | 0 |   //   *this = a23 . a22 ... a0 * 2^e1 | 
| 1044 | 0 |   //     rhs = b23 . b22 ... b0 * 2^e2 | 
| 1045 | 0 |   // the result of multiplication is: | 
| 1046 | 0 |   //   *this = c48 c47 c46 . c45 ... c0 * 2^(e1+e2) | 
| 1047 | 0 |   // Note that there are three significant bits at the left-hand side of the | 
| 1048 | 0 |   // radix point: two for the multiplication, and an overflow bit for the | 
| 1049 | 0 |   // addition (that will always be zero at this point). Move the radix point | 
| 1050 | 0 |   // toward left by two bits, and adjust exponent accordingly. | 
| 1051 | 0 |   exponent += 2; | 
| 1052 | 0 | 
 | 
| 1053 | 0 |   if (addend.isNonZero()) { | 
| 1054 | 0 |     // The intermediate result of the multiplication has "2 * precision" | 
| 1055 | 0 |     // signicant bit; adjust the addend to be consistent with mul result. | 
| 1056 | 0 |     // | 
| 1057 | 0 |     Significand savedSignificand = significand; | 
| 1058 | 0 |     const fltSemantics *savedSemantics = semantics; | 
| 1059 | 0 |     fltSemantics extendedSemantics; | 
| 1060 | 0 |     opStatus status; | 
| 1061 | 0 |     unsigned int extendedPrecision; | 
| 1062 | 0 | 
 | 
| 1063 | 0 |     // Normalize our MSB to one below the top bit to allow for overflow. | 
| 1064 | 0 |     extendedPrecision = 2 * precision + 1; | 
| 1065 | 0 |     if (omsb != extendedPrecision - 1) { | 
| 1066 | 0 |       assert(extendedPrecision > omsb); | 
| 1067 | 0 |       APInt::tcShiftLeft(fullSignificand, newPartsCount, | 
| 1068 | 0 |                          (extendedPrecision - 1) - omsb); | 
| 1069 | 0 |       exponent -= (extendedPrecision - 1) - omsb; | 
| 1070 | 0 |     } | 
| 1071 | 0 | 
 | 
| 1072 | 0 |     /* Create new semantics.  */ | 
| 1073 | 0 |     extendedSemantics = *semantics; | 
| 1074 | 0 |     extendedSemantics.precision = extendedPrecision; | 
| 1075 | 0 | 
 | 
| 1076 | 0 |     if (newPartsCount == 1) | 
| 1077 | 0 |       significand.part = fullSignificand[0]; | 
| 1078 | 0 |     else | 
| 1079 | 0 |       significand.parts = fullSignificand; | 
| 1080 | 0 |     semantics = &extendedSemantics; | 
| 1081 | 0 | 
 | 
| 1082 | 0 |     // Make a copy so we can convert it to the extended semantics. | 
| 1083 | 0 |     // Note that we cannot convert the addend directly, as the extendedSemantics | 
| 1084 | 0 |     // is a local variable (which we take a reference to). | 
| 1085 | 0 |     IEEEFloat extendedAddend(addend); | 
| 1086 | 0 |     status = extendedAddend.convert(extendedSemantics, rmTowardZero, &ignored); | 
| 1087 | 0 |     assert(status == opOK); | 
| 1088 | 0 |     (void)status; | 
| 1089 | 0 | 
 | 
| 1090 | 0 |     // Shift the significand of the addend right by one bit. This guarantees | 
| 1091 | 0 |     // that the high bit of the significand is zero (same as fullSignificand), | 
| 1092 | 0 |     // so the addition will overflow (if it does overflow at all) into the top bit. | 
| 1093 | 0 |     lost_fraction = extendedAddend.shiftSignificandRight(1); | 
| 1094 | 0 |     assert(lost_fraction == lfExactlyZero && | 
| 1095 | 0 |            "Lost precision while shifting addend for fused-multiply-add."); | 
| 1096 | 0 | 
 | 
| 1097 | 0 |     lost_fraction = addOrSubtractSignificand(extendedAddend, false); | 
| 1098 | 0 | 
 | 
| 1099 | 0 |     /* Restore our state.  */ | 
| 1100 | 0 |     if (newPartsCount == 1) | 
| 1101 | 0 |       fullSignificand[0] = significand.part; | 
| 1102 | 0 |     significand = savedSignificand; | 
| 1103 | 0 |     semantics = savedSemantics; | 
| 1104 | 0 | 
 | 
| 1105 | 0 |     omsb = APInt::tcMSB(fullSignificand, newPartsCount) + 1; | 
| 1106 | 0 |   } | 
| 1107 | 0 | 
 | 
| 1108 | 0 |   // Convert the result having "2 * precision" significant-bits back to the one | 
| 1109 | 0 |   // having "precision" significant-bits. First, move the radix point from | 
| 1110 | 0 |   // poision "2*precision - 1" to "precision - 1". The exponent need to be | 
| 1111 | 0 |   // adjusted by "2*precision - 1" - "precision - 1" = "precision". | 
| 1112 | 0 |   exponent -= precision + 1; | 
| 1113 | 0 | 
 | 
| 1114 | 0 |   // In case MSB resides at the left-hand side of radix point, shift the | 
| 1115 | 0 |   // mantissa right by some amount to make sure the MSB reside right before | 
| 1116 | 0 |   // the radix point (i.e. "MSB . rest-significant-bits"). | 
| 1117 | 0 |   // | 
| 1118 | 0 |   // Note that the result is not normalized when "omsb < precision". So, the | 
| 1119 | 0 |   // caller needs to call IEEEFloat::normalize() if normalized value is | 
| 1120 | 0 |   // expected. | 
| 1121 | 0 |   if (omsb > precision) { | 
| 1122 | 0 |     unsigned int bits, significantParts; | 
| 1123 | 0 |     lostFraction lf; | 
| 1124 | 0 | 
 | 
| 1125 | 0 |     bits = omsb - precision; | 
| 1126 | 0 |     significantParts = partCountForBits(omsb); | 
| 1127 | 0 |     lf = shiftRight(fullSignificand, significantParts, bits); | 
| 1128 | 0 |     lost_fraction = combineLostFractions(lf, lost_fraction); | 
| 1129 | 0 |     exponent += bits; | 
| 1130 | 0 |   } | 
| 1131 | 0 | 
 | 
| 1132 | 0 |   APInt::tcAssign(lhsSignificand, fullSignificand, partsCount); | 
| 1133 | 0 | 
 | 
| 1134 | 0 |   if (newPartsCount > 4) | 
| 1135 | 0 |     delete [] fullSignificand; | 
| 1136 | 0 | 
 | 
| 1137 | 0 |   return lost_fraction; | 
| 1138 | 0 | } | 
| 1139 |  |  | 
| 1140 | 0 | lostFraction IEEEFloat::multiplySignificand(const IEEEFloat &rhs) { | 
| 1141 | 0 |   return multiplySignificand(rhs, IEEEFloat(*semantics)); | 
| 1142 | 0 | } | 
| 1143 |  |  | 
| 1144 |  | /* Multiply the significands of LHS and RHS to DST.  */ | 
| 1145 | 0 | lostFraction IEEEFloat::divideSignificand(const IEEEFloat &rhs) { | 
| 1146 | 0 |   unsigned int bit, i, partsCount; | 
| 1147 | 0 |   const integerPart *rhsSignificand; | 
| 1148 | 0 |   integerPart *lhsSignificand, *dividend, *divisor; | 
| 1149 | 0 |   integerPart scratch[4]; | 
| 1150 | 0 |   lostFraction lost_fraction; | 
| 1151 | 0 | 
 | 
| 1152 | 0 |   assert(semantics == rhs.semantics); | 
| 1153 | 0 | 
 | 
| 1154 | 0 |   lhsSignificand = significandParts(); | 
| 1155 | 0 |   rhsSignificand = rhs.significandParts(); | 
| 1156 | 0 |   partsCount = partCount(); | 
| 1157 | 0 | 
 | 
| 1158 | 0 |   if (partsCount > 2) | 
| 1159 | 0 |     dividend = new integerPart[partsCount * 2]; | 
| 1160 | 0 |   else | 
| 1161 | 0 |     dividend = scratch; | 
| 1162 | 0 | 
 | 
| 1163 | 0 |   divisor = dividend + partsCount; | 
| 1164 | 0 | 
 | 
| 1165 | 0 |   /* Copy the dividend and divisor as they will be modified in-place.  */ | 
| 1166 | 0 |   for (i = 0; i < partsCount; i++) { | 
| 1167 | 0 |     dividend[i] = lhsSignificand[i]; | 
| 1168 | 0 |     divisor[i] = rhsSignificand[i]; | 
| 1169 | 0 |     lhsSignificand[i] = 0; | 
| 1170 | 0 |   } | 
| 1171 | 0 | 
 | 
| 1172 | 0 |   exponent -= rhs.exponent; | 
| 1173 | 0 | 
 | 
| 1174 | 0 |   unsigned int precision = semantics->precision; | 
| 1175 | 0 | 
 | 
| 1176 | 0 |   /* Normalize the divisor.  */ | 
| 1177 | 0 |   bit = precision - APInt::tcMSB(divisor, partsCount) - 1; | 
| 1178 | 0 |   if (bit) { | 
| 1179 | 0 |     exponent += bit; | 
| 1180 | 0 |     APInt::tcShiftLeft(divisor, partsCount, bit); | 
| 1181 | 0 |   } | 
| 1182 | 0 | 
 | 
| 1183 | 0 |   /* Normalize the dividend.  */ | 
| 1184 | 0 |   bit = precision - APInt::tcMSB(dividend, partsCount) - 1; | 
| 1185 | 0 |   if (bit) { | 
| 1186 | 0 |     exponent -= bit; | 
| 1187 | 0 |     APInt::tcShiftLeft(dividend, partsCount, bit); | 
| 1188 | 0 |   } | 
| 1189 | 0 | 
 | 
| 1190 | 0 |   /* Ensure the dividend >= divisor initially for the loop below. | 
| 1191 | 0 |      Incidentally, this means that the division loop below is | 
| 1192 | 0 |      guaranteed to set the integer bit to one.  */ | 
| 1193 | 0 |   if (APInt::tcCompare(dividend, divisor, partsCount) < 0) { | 
| 1194 | 0 |     exponent--; | 
| 1195 | 0 |     APInt::tcShiftLeft(dividend, partsCount, 1); | 
| 1196 | 0 |     assert(APInt::tcCompare(dividend, divisor, partsCount) >= 0); | 
| 1197 | 0 |   } | 
| 1198 | 0 | 
 | 
| 1199 | 0 |   /* Long division.  */ | 
| 1200 | 0 |   for (bit = precision; bit; bit -= 1) { | 
| 1201 | 0 |     if (APInt::tcCompare(dividend, divisor, partsCount) >= 0) { | 
| 1202 | 0 |       APInt::tcSubtract(dividend, divisor, 0, partsCount); | 
| 1203 | 0 |       APInt::tcSetBit(lhsSignificand, bit - 1); | 
| 1204 | 0 |     } | 
| 1205 | 0 | 
 | 
| 1206 | 0 |     APInt::tcShiftLeft(dividend, partsCount, 1); | 
| 1207 | 0 |   } | 
| 1208 | 0 | 
 | 
| 1209 | 0 |   /* Figure out the lost fraction.  */ | 
| 1210 | 0 |   int cmp = APInt::tcCompare(dividend, divisor, partsCount); | 
| 1211 | 0 | 
 | 
| 1212 | 0 |   if (cmp > 0) | 
| 1213 | 0 |     lost_fraction = lfMoreThanHalf; | 
| 1214 | 0 |   else if (cmp == 0) | 
| 1215 | 0 |     lost_fraction = lfExactlyHalf; | 
| 1216 | 0 |   else if (APInt::tcIsZero(dividend, partsCount)) | 
| 1217 | 0 |     lost_fraction = lfExactlyZero; | 
| 1218 | 0 |   else | 
| 1219 | 0 |     lost_fraction = lfLessThanHalf; | 
| 1220 | 0 | 
 | 
| 1221 | 0 |   if (partsCount > 2) | 
| 1222 | 0 |     delete [] dividend; | 
| 1223 | 0 | 
 | 
| 1224 | 0 |   return lost_fraction; | 
| 1225 | 0 | } | 
| 1226 |  |  | 
| 1227 | 0 | unsigned int IEEEFloat::significandMSB() const { | 
| 1228 | 0 |   return APInt::tcMSB(significandParts(), partCount()); | 
| 1229 | 0 | } | 
| 1230 |  |  | 
| 1231 | 0 | unsigned int IEEEFloat::significandLSB() const { | 
| 1232 | 0 |   return APInt::tcLSB(significandParts(), partCount()); | 
| 1233 | 0 | } | 
| 1234 |  |  | 
| 1235 |  | /* Note that a zero result is NOT normalized to fcZero.  */ | 
| 1236 | 0 | lostFraction IEEEFloat::shiftSignificandRight(unsigned int bits) { | 
| 1237 | 0 |   /* Our exponent should not overflow.  */ | 
| 1238 | 0 |   assert((ExponentType) (exponent + bits) >= exponent); | 
| 1239 | 0 | 
 | 
| 1240 | 0 |   exponent += bits; | 
| 1241 | 0 | 
 | 
| 1242 | 0 |   return shiftRight(significandParts(), partCount(), bits); | 
| 1243 | 0 | } | 
| 1244 |  |  | 
| 1245 |  | /* Shift the significand left BITS bits, subtract BITS from its exponent.  */ | 
| 1246 | 0 | void IEEEFloat::shiftSignificandLeft(unsigned int bits) { | 
| 1247 | 0 |   assert(bits < semantics->precision); | 
| 1248 | 0 | 
 | 
| 1249 | 0 |   if (bits) { | 
| 1250 | 0 |     unsigned int partsCount = partCount(); | 
| 1251 | 0 | 
 | 
| 1252 | 0 |     APInt::tcShiftLeft(significandParts(), partsCount, bits); | 
| 1253 | 0 |     exponent -= bits; | 
| 1254 | 0 | 
 | 
| 1255 | 0 |     assert(!APInt::tcIsZero(significandParts(), partsCount)); | 
| 1256 | 0 |   } | 
| 1257 | 0 | } | 
| 1258 |  |  | 
| 1259 |  | IEEEFloat::cmpResult | 
| 1260 | 0 | IEEEFloat::compareAbsoluteValue(const IEEEFloat &rhs) const { | 
| 1261 | 0 |   int compare; | 
| 1262 | 0 | 
 | 
| 1263 | 0 |   assert(semantics == rhs.semantics); | 
| 1264 | 0 |   assert(isFiniteNonZero()); | 
| 1265 | 0 |   assert(rhs.isFiniteNonZero()); | 
| 1266 | 0 | 
 | 
| 1267 | 0 |   compare = exponent - rhs.exponent; | 
| 1268 | 0 | 
 | 
| 1269 | 0 |   /* If exponents are equal, do an unsigned bignum comparison of the | 
| 1270 | 0 |      significands.  */ | 
| 1271 | 0 |   if (compare == 0) | 
| 1272 | 0 |     compare = APInt::tcCompare(significandParts(), rhs.significandParts(), | 
| 1273 | 0 |                                partCount()); | 
| 1274 | 0 | 
 | 
| 1275 | 0 |   if (compare > 0) | 
| 1276 | 0 |     return cmpGreaterThan; | 
| 1277 | 0 |   else if (compare < 0) | 
| 1278 | 0 |     return cmpLessThan; | 
| 1279 | 0 |   else | 
| 1280 | 0 |     return cmpEqual; | 
| 1281 | 0 | } | 
| 1282 |  |  | 
| 1283 |  | /* Handle overflow.  Sign is preserved.  We either become infinity or | 
| 1284 |  |    the largest finite number.  */ | 
| 1285 | 0 | IEEEFloat::opStatus IEEEFloat::handleOverflow(roundingMode rounding_mode) { | 
| 1286 | 0 |   /* Infinity?  */ | 
| 1287 | 0 |   if (rounding_mode == rmNearestTiesToEven || | 
| 1288 | 0 |       rounding_mode == rmNearestTiesToAway || | 
| 1289 | 0 |       (rounding_mode == rmTowardPositive && !sign) || | 
| 1290 | 0 |       (rounding_mode == rmTowardNegative && sign)) { | 
| 1291 | 0 |     category = fcInfinity; | 
| 1292 | 0 |     return (opStatus) (opOverflow | opInexact); | 
| 1293 | 0 |   } | 
| 1294 | 0 |  | 
| 1295 | 0 |   /* Otherwise we become the largest finite number.  */ | 
| 1296 | 0 |   category = fcNormal; | 
| 1297 | 0 |   exponent = semantics->maxExponent; | 
| 1298 | 0 |   APInt::tcSetLeastSignificantBits(significandParts(), partCount(), | 
| 1299 | 0 |                                    semantics->precision); | 
| 1300 | 0 | 
 | 
| 1301 | 0 |   return opInexact; | 
| 1302 | 0 | } | 
| 1303 |  |  | 
| 1304 |  | /* Returns TRUE if, when truncating the current number, with BIT the | 
| 1305 |  |    new LSB, with the given lost fraction and rounding mode, the result | 
| 1306 |  |    would need to be rounded away from zero (i.e., by increasing the | 
| 1307 |  |    signficand).  This routine must work for fcZero of both signs, and | 
| 1308 |  |    fcNormal numbers.  */ | 
| 1309 |  | bool IEEEFloat::roundAwayFromZero(roundingMode rounding_mode, | 
| 1310 |  |                                   lostFraction lost_fraction, | 
| 1311 | 0 |                                   unsigned int bit) const { | 
| 1312 | 0 |   /* NaNs and infinities should not have lost fractions.  */ | 
| 1313 | 0 |   assert(isFiniteNonZero() || category == fcZero); | 
| 1314 | 0 | 
 | 
| 1315 | 0 |   /* Current callers never pass this so we don't handle it.  */ | 
| 1316 | 0 |   assert(lost_fraction != lfExactlyZero); | 
| 1317 | 0 | 
 | 
| 1318 | 0 |   switch (rounding_mode) { | 
| 1319 | 0 |   case rmNearestTiesToAway: | 
| 1320 | 0 |     return lost_fraction == lfExactlyHalf || lost_fraction == lfMoreThanHalf; | 
| 1321 | 0 | 
 | 
| 1322 | 0 |   case rmNearestTiesToEven: | 
| 1323 | 0 |     if (lost_fraction == lfMoreThanHalf) | 
| 1324 | 0 |       return true; | 
| 1325 | 0 |  | 
| 1326 | 0 |     /* Our zeroes don't have a significand to test.  */ | 
| 1327 | 0 |     if (lost_fraction == lfExactlyHalf && category != fcZero) | 
| 1328 | 0 |       return APInt::tcExtractBit(significandParts(), bit); | 
| 1329 | 0 |  | 
| 1330 | 0 |     return false; | 
| 1331 | 0 | 
 | 
| 1332 | 0 |   case rmTowardZero: | 
| 1333 | 0 |     return false; | 
| 1334 | 0 | 
 | 
| 1335 | 0 |   case rmTowardPositive: | 
| 1336 | 0 |     return !sign; | 
| 1337 | 0 | 
 | 
| 1338 | 0 |   case rmTowardNegative: | 
| 1339 | 0 |     return sign; | 
| 1340 | 0 | 
 | 
| 1341 | 0 |   default: | 
| 1342 | 0 |     break; | 
| 1343 | 0 |   } | 
| 1344 | 0 |   llvm_unreachable("Invalid rounding mode found"); | 
| 1345 | 0 | } | 
| 1346 |  |  | 
| 1347 |  | IEEEFloat::opStatus IEEEFloat::normalize(roundingMode rounding_mode, | 
| 1348 | 0 |                                          lostFraction lost_fraction) { | 
| 1349 | 0 |   unsigned int omsb;                /* One, not zero, based MSB.  */ | 
| 1350 | 0 |   int exponentChange; | 
| 1351 | 0 | 
 | 
| 1352 | 0 |   if (!isFiniteNonZero()) | 
| 1353 | 0 |     return opOK; | 
| 1354 | 0 |  | 
| 1355 | 0 |   /* Before rounding normalize the exponent of fcNormal numbers.  */ | 
| 1356 | 0 |   omsb = significandMSB() + 1; | 
| 1357 | 0 | 
 | 
| 1358 | 0 |   if (omsb) { | 
| 1359 | 0 |     /* OMSB is numbered from 1.  We want to place it in the integer | 
| 1360 | 0 |        bit numbered PRECISION if possible, with a compensating change in | 
| 1361 | 0 |        the exponent.  */ | 
| 1362 | 0 |     exponentChange = omsb - semantics->precision; | 
| 1363 | 0 | 
 | 
| 1364 | 0 |     /* If the resulting exponent is too high, overflow according to | 
| 1365 | 0 |        the rounding mode.  */ | 
| 1366 | 0 |     if (exponent + exponentChange > semantics->maxExponent) | 
| 1367 | 0 |       return handleOverflow(rounding_mode); | 
| 1368 | 0 |  | 
| 1369 | 0 |     /* Subnormal numbers have exponent minExponent, and their MSB | 
| 1370 | 0 |        is forced based on that.  */ | 
| 1371 | 0 |     if (exponent + exponentChange < semantics->minExponent) | 
| 1372 | 0 |       exponentChange = semantics->minExponent - exponent; | 
| 1373 | 0 | 
 | 
| 1374 | 0 |     /* Shifting left is easy as we don't lose precision.  */ | 
| 1375 | 0 |     if (exponentChange < 0) { | 
| 1376 | 0 |       assert(lost_fraction == lfExactlyZero); | 
| 1377 | 0 | 
 | 
| 1378 | 0 |       shiftSignificandLeft(-exponentChange); | 
| 1379 | 0 | 
 | 
| 1380 | 0 |       return opOK; | 
| 1381 | 0 |     } | 
| 1382 | 0 |  | 
| 1383 | 0 |     if (exponentChange > 0) { | 
| 1384 | 0 |       lostFraction lf; | 
| 1385 | 0 | 
 | 
| 1386 | 0 |       /* Shift right and capture any new lost fraction.  */ | 
| 1387 | 0 |       lf = shiftSignificandRight(exponentChange); | 
| 1388 | 0 | 
 | 
| 1389 | 0 |       lost_fraction = combineLostFractions(lf, lost_fraction); | 
| 1390 | 0 | 
 | 
| 1391 | 0 |       /* Keep OMSB up-to-date.  */ | 
| 1392 | 0 |       if (omsb > (unsigned) exponentChange) | 
| 1393 | 0 |         omsb -= exponentChange; | 
| 1394 | 0 |       else | 
| 1395 | 0 |         omsb = 0; | 
| 1396 | 0 |     } | 
| 1397 | 0 |   } | 
| 1398 | 0 | 
 | 
| 1399 | 0 |   /* Now round the number according to rounding_mode given the lost | 
| 1400 | 0 |      fraction.  */ | 
| 1401 | 0 | 
 | 
| 1402 | 0 |   /* As specified in IEEE 754, since we do not trap we do not report | 
| 1403 | 0 |      underflow for exact results.  */ | 
| 1404 | 0 |   if (lost_fraction == lfExactlyZero) { | 
| 1405 | 0 |     /* Canonicalize zeroes.  */ | 
| 1406 | 0 |     if (omsb == 0) | 
| 1407 | 0 |       category = fcZero; | 
| 1408 | 0 | 
 | 
| 1409 | 0 |     return opOK; | 
| 1410 | 0 |   } | 
| 1411 | 0 | 
 | 
| 1412 | 0 |   /* Increment the significand if we're rounding away from zero.  */ | 
| 1413 | 0 |   if (roundAwayFromZero(rounding_mode, lost_fraction, 0)) { | 
| 1414 | 0 |     if (omsb == 0) | 
| 1415 | 0 |       exponent = semantics->minExponent; | 
| 1416 | 0 | 
 | 
| 1417 | 0 |     incrementSignificand(); | 
| 1418 | 0 |     omsb = significandMSB() + 1; | 
| 1419 | 0 | 
 | 
| 1420 | 0 |     /* Did the significand increment overflow?  */ | 
| 1421 | 0 |     if (omsb == (unsigned) semantics->precision + 1) { | 
| 1422 | 0 |       /* Renormalize by incrementing the exponent and shifting our | 
| 1423 | 0 |          significand right one.  However if we already have the | 
| 1424 | 0 |          maximum exponent we overflow to infinity.  */ | 
| 1425 | 0 |       if (exponent == semantics->maxExponent) { | 
| 1426 | 0 |         category = fcInfinity; | 
| 1427 | 0 | 
 | 
| 1428 | 0 |         return (opStatus) (opOverflow | opInexact); | 
| 1429 | 0 |       } | 
| 1430 | 0 |  | 
| 1431 | 0 |       shiftSignificandRight(1); | 
| 1432 | 0 | 
 | 
| 1433 | 0 |       return opInexact; | 
| 1434 | 0 |     } | 
| 1435 | 0 |   } | 
| 1436 | 0 | 
 | 
| 1437 | 0 |   /* The normal case - we were and are not denormal, and any | 
| 1438 | 0 |      significand increment above didn't overflow.  */ | 
| 1439 | 0 |   if (omsb == semantics->precision) | 
| 1440 | 0 |     return opInexact; | 
| 1441 | 0 |  | 
| 1442 | 0 |   /* We have a non-zero denormal.  */ | 
| 1443 | 0 |   assert(omsb < semantics->precision); | 
| 1444 | 0 | 
 | 
| 1445 | 0 |   /* Canonicalize zeroes.  */ | 
| 1446 | 0 |   if (omsb == 0) | 
| 1447 | 0 |     category = fcZero; | 
| 1448 | 0 | 
 | 
| 1449 | 0 |   /* The fcZero case is a denormal that underflowed to zero.  */ | 
| 1450 | 0 |   return (opStatus) (opUnderflow | opInexact); | 
| 1451 | 0 | } | 
| 1452 |  |  | 
| 1453 |  | IEEEFloat::opStatus IEEEFloat::addOrSubtractSpecials(const IEEEFloat &rhs, | 
| 1454 | 0 |                                                      bool subtract) { | 
| 1455 | 0 |   switch (PackCategoriesIntoKey(category, rhs.category)) { | 
| 1456 | 0 |   default: | 
| 1457 | 0 |     llvm_unreachable(nullptr); | 
| 1458 | 0 | 
 | 
| 1459 | 0 |   case PackCategoriesIntoKey(fcZero, fcNaN): | 
| 1460 | 0 |   case PackCategoriesIntoKey(fcNormal, fcNaN): | 
| 1461 | 0 |   case PackCategoriesIntoKey(fcInfinity, fcNaN): | 
| 1462 | 0 |     assign(rhs); | 
| 1463 | 0 |     LLVM_FALLTHROUGH; | 
| 1464 | 0 |   case PackCategoriesIntoKey(fcNaN, fcZero): | 
| 1465 | 0 |   case PackCategoriesIntoKey(fcNaN, fcNormal): | 
| 1466 | 0 |   case PackCategoriesIntoKey(fcNaN, fcInfinity): | 
| 1467 | 0 |   case PackCategoriesIntoKey(fcNaN, fcNaN): | 
| 1468 | 0 |     if (isSignaling()) { | 
| 1469 | 0 |       makeQuiet(); | 
| 1470 | 0 |       return opInvalidOp; | 
| 1471 | 0 |     } | 
| 1472 | 0 |     return rhs.isSignaling() ? opInvalidOp : opOK; | 
| 1473 | 0 | 
 | 
| 1474 | 0 |   case PackCategoriesIntoKey(fcNormal, fcZero): | 
| 1475 | 0 |   case PackCategoriesIntoKey(fcInfinity, fcNormal): | 
| 1476 | 0 |   case PackCategoriesIntoKey(fcInfinity, fcZero): | 
| 1477 | 0 |     return opOK; | 
| 1478 | 0 | 
 | 
| 1479 | 0 |   case PackCategoriesIntoKey(fcNormal, fcInfinity): | 
| 1480 | 0 |   case PackCategoriesIntoKey(fcZero, fcInfinity): | 
| 1481 | 0 |     category = fcInfinity; | 
| 1482 | 0 |     sign = rhs.sign ^ subtract; | 
| 1483 | 0 |     return opOK; | 
| 1484 | 0 | 
 | 
| 1485 | 0 |   case PackCategoriesIntoKey(fcZero, fcNormal): | 
| 1486 | 0 |     assign(rhs); | 
| 1487 | 0 |     sign = rhs.sign ^ subtract; | 
| 1488 | 0 |     return opOK; | 
| 1489 | 0 | 
 | 
| 1490 | 0 |   case PackCategoriesIntoKey(fcZero, fcZero): | 
| 1491 | 0 |     /* Sign depends on rounding mode; handled by caller.  */ | 
| 1492 | 0 |     return opOK; | 
| 1493 | 0 | 
 | 
| 1494 | 0 |   case PackCategoriesIntoKey(fcInfinity, fcInfinity): | 
| 1495 | 0 |     /* Differently signed infinities can only be validly | 
| 1496 | 0 |        subtracted.  */ | 
| 1497 | 0 |     if (((sign ^ rhs.sign)!=0) != subtract) { | 
| 1498 | 0 |       makeNaN(); | 
| 1499 | 0 |       return opInvalidOp; | 
| 1500 | 0 |     } | 
| 1501 | 0 |  | 
| 1502 | 0 |     return opOK; | 
| 1503 | 0 | 
 | 
| 1504 | 0 |   case PackCategoriesIntoKey(fcNormal, fcNormal): | 
| 1505 | 0 |     return opDivByZero; | 
| 1506 | 0 |   } | 
| 1507 | 0 | } | 
| 1508 |  |  | 
| 1509 |  | /* Add or subtract two normal numbers.  */ | 
| 1510 |  | lostFraction IEEEFloat::addOrSubtractSignificand(const IEEEFloat &rhs, | 
| 1511 | 0 |                                                  bool subtract) { | 
| 1512 | 0 |   integerPart carry; | 
| 1513 | 0 |   lostFraction lost_fraction; | 
| 1514 | 0 |   int bits; | 
| 1515 | 0 | 
 | 
| 1516 | 0 |   /* Determine if the operation on the absolute values is effectively | 
| 1517 | 0 |      an addition or subtraction.  */ | 
| 1518 | 0 |   subtract ^= static_cast<bool>(sign ^ rhs.sign); | 
| 1519 | 0 | 
 | 
| 1520 | 0 |   /* Are we bigger exponent-wise than the RHS?  */ | 
| 1521 | 0 |   bits = exponent - rhs.exponent; | 
| 1522 | 0 | 
 | 
| 1523 | 0 |   /* Subtraction is more subtle than one might naively expect.  */ | 
| 1524 | 0 |   if (subtract) { | 
| 1525 | 0 |     IEEEFloat temp_rhs(rhs); | 
| 1526 | 0 | 
 | 
| 1527 | 0 |     if (bits == 0) | 
| 1528 | 0 |       lost_fraction = lfExactlyZero; | 
| 1529 | 0 |     else if (bits > 0) { | 
| 1530 | 0 |       lost_fraction = temp_rhs.shiftSignificandRight(bits - 1); | 
| 1531 | 0 |       shiftSignificandLeft(1); | 
| 1532 | 0 |     } else { | 
| 1533 | 0 |       lost_fraction = shiftSignificandRight(-bits - 1); | 
| 1534 | 0 |       temp_rhs.shiftSignificandLeft(1); | 
| 1535 | 0 |     } | 
| 1536 | 0 | 
 | 
| 1537 | 0 |     // Should we reverse the subtraction. | 
| 1538 | 0 |     if (compareAbsoluteValue(temp_rhs) == cmpLessThan) { | 
| 1539 | 0 |       carry = temp_rhs.subtractSignificand | 
| 1540 | 0 |         (*this, lost_fraction != lfExactlyZero); | 
| 1541 | 0 |       copySignificand(temp_rhs); | 
| 1542 | 0 |       sign = !sign; | 
| 1543 | 0 |     } else { | 
| 1544 | 0 |       carry = subtractSignificand | 
| 1545 | 0 |         (temp_rhs, lost_fraction != lfExactlyZero); | 
| 1546 | 0 |     } | 
| 1547 | 0 | 
 | 
| 1548 | 0 |     /* Invert the lost fraction - it was on the RHS and | 
| 1549 | 0 |        subtracted.  */ | 
| 1550 | 0 |     if (lost_fraction == lfLessThanHalf) | 
| 1551 | 0 |       lost_fraction = lfMoreThanHalf; | 
| 1552 | 0 |     else if (lost_fraction == lfMoreThanHalf) | 
| 1553 | 0 |       lost_fraction = lfLessThanHalf; | 
| 1554 | 0 | 
 | 
| 1555 | 0 |     /* The code above is intended to ensure that no borrow is | 
| 1556 | 0 |        necessary.  */ | 
| 1557 | 0 |     assert(!carry); | 
| 1558 | 0 |     (void)carry; | 
| 1559 | 0 |   } else { | 
| 1560 | 0 |     if (bits > 0) { | 
| 1561 | 0 |       IEEEFloat temp_rhs(rhs); | 
| 1562 | 0 | 
 | 
| 1563 | 0 |       lost_fraction = temp_rhs.shiftSignificandRight(bits); | 
| 1564 | 0 |       carry = addSignificand(temp_rhs); | 
| 1565 | 0 |     } else { | 
| 1566 | 0 |       lost_fraction = shiftSignificandRight(-bits); | 
| 1567 | 0 |       carry = addSignificand(rhs); | 
| 1568 | 0 |     } | 
| 1569 | 0 | 
 | 
| 1570 | 0 |     /* We have a guard bit; generating a carry cannot happen.  */ | 
| 1571 | 0 |     assert(!carry); | 
| 1572 | 0 |     (void)carry; | 
| 1573 | 0 |   } | 
| 1574 | 0 | 
 | 
| 1575 | 0 |   return lost_fraction; | 
| 1576 | 0 | } | 
| 1577 |  |  | 
| 1578 | 0 | IEEEFloat::opStatus IEEEFloat::multiplySpecials(const IEEEFloat &rhs) { | 
| 1579 | 0 |   switch (PackCategoriesIntoKey(category, rhs.category)) { | 
| 1580 | 0 |   default: | 
| 1581 | 0 |     llvm_unreachable(nullptr); | 
| 1582 | 0 | 
 | 
| 1583 | 0 |   case PackCategoriesIntoKey(fcZero, fcNaN): | 
| 1584 | 0 |   case PackCategoriesIntoKey(fcNormal, fcNaN): | 
| 1585 | 0 |   case PackCategoriesIntoKey(fcInfinity, fcNaN): | 
| 1586 | 0 |     assign(rhs); | 
| 1587 | 0 |     sign = false; | 
| 1588 | 0 |     LLVM_FALLTHROUGH; | 
| 1589 | 0 |   case PackCategoriesIntoKey(fcNaN, fcZero): | 
| 1590 | 0 |   case PackCategoriesIntoKey(fcNaN, fcNormal): | 
| 1591 | 0 |   case PackCategoriesIntoKey(fcNaN, fcInfinity): | 
| 1592 | 0 |   case PackCategoriesIntoKey(fcNaN, fcNaN): | 
| 1593 | 0 |     sign ^= rhs.sign; // restore the original sign | 
| 1594 | 0 |     if (isSignaling()) { | 
| 1595 | 0 |       makeQuiet(); | 
| 1596 | 0 |       return opInvalidOp; | 
| 1597 | 0 |     } | 
| 1598 | 0 |     return rhs.isSignaling() ? opInvalidOp : opOK; | 
| 1599 | 0 | 
 | 
| 1600 | 0 |   case PackCategoriesIntoKey(fcNormal, fcInfinity): | 
| 1601 | 0 |   case PackCategoriesIntoKey(fcInfinity, fcNormal): | 
| 1602 | 0 |   case PackCategoriesIntoKey(fcInfinity, fcInfinity): | 
| 1603 | 0 |     category = fcInfinity; | 
| 1604 | 0 |     return opOK; | 
| 1605 | 0 | 
 | 
| 1606 | 0 |   case PackCategoriesIntoKey(fcZero, fcNormal): | 
| 1607 | 0 |   case PackCategoriesIntoKey(fcNormal, fcZero): | 
| 1608 | 0 |   case PackCategoriesIntoKey(fcZero, fcZero): | 
| 1609 | 0 |     category = fcZero; | 
| 1610 | 0 |     return opOK; | 
| 1611 | 0 | 
 | 
| 1612 | 0 |   case PackCategoriesIntoKey(fcZero, fcInfinity): | 
| 1613 | 0 |   case PackCategoriesIntoKey(fcInfinity, fcZero): | 
| 1614 | 0 |     makeNaN(); | 
| 1615 | 0 |     return opInvalidOp; | 
| 1616 | 0 | 
 | 
| 1617 | 0 |   case PackCategoriesIntoKey(fcNormal, fcNormal): | 
| 1618 | 0 |     return opOK; | 
| 1619 | 0 |   } | 
| 1620 | 0 | } | 
| 1621 |  |  | 
| 1622 | 0 | IEEEFloat::opStatus IEEEFloat::divideSpecials(const IEEEFloat &rhs) { | 
| 1623 | 0 |   switch (PackCategoriesIntoKey(category, rhs.category)) { | 
| 1624 | 0 |   default: | 
| 1625 | 0 |     llvm_unreachable(nullptr); | 
| 1626 | 0 | 
 | 
| 1627 | 0 |   case PackCategoriesIntoKey(fcZero, fcNaN): | 
| 1628 | 0 |   case PackCategoriesIntoKey(fcNormal, fcNaN): | 
| 1629 | 0 |   case PackCategoriesIntoKey(fcInfinity, fcNaN): | 
| 1630 | 0 |     assign(rhs); | 
| 1631 | 0 |     sign = false; | 
| 1632 | 0 |     LLVM_FALLTHROUGH; | 
| 1633 | 0 |   case PackCategoriesIntoKey(fcNaN, fcZero): | 
| 1634 | 0 |   case PackCategoriesIntoKey(fcNaN, fcNormal): | 
| 1635 | 0 |   case PackCategoriesIntoKey(fcNaN, fcInfinity): | 
| 1636 | 0 |   case PackCategoriesIntoKey(fcNaN, fcNaN): | 
| 1637 | 0 |     sign ^= rhs.sign; // restore the original sign | 
| 1638 | 0 |     if (isSignaling()) { | 
| 1639 | 0 |       makeQuiet(); | 
| 1640 | 0 |       return opInvalidOp; | 
| 1641 | 0 |     } | 
| 1642 | 0 |     return rhs.isSignaling() ? opInvalidOp : opOK; | 
| 1643 | 0 | 
 | 
| 1644 | 0 |   case PackCategoriesIntoKey(fcInfinity, fcZero): | 
| 1645 | 0 |   case PackCategoriesIntoKey(fcInfinity, fcNormal): | 
| 1646 | 0 |   case PackCategoriesIntoKey(fcZero, fcInfinity): | 
| 1647 | 0 |   case PackCategoriesIntoKey(fcZero, fcNormal): | 
| 1648 | 0 |     return opOK; | 
| 1649 | 0 | 
 | 
| 1650 | 0 |   case PackCategoriesIntoKey(fcNormal, fcInfinity): | 
| 1651 | 0 |     category = fcZero; | 
| 1652 | 0 |     return opOK; | 
| 1653 | 0 | 
 | 
| 1654 | 0 |   case PackCategoriesIntoKey(fcNormal, fcZero): | 
| 1655 | 0 |     category = fcInfinity; | 
| 1656 | 0 |     return opDivByZero; | 
| 1657 | 0 | 
 | 
| 1658 | 0 |   case PackCategoriesIntoKey(fcInfinity, fcInfinity): | 
| 1659 | 0 |   case PackCategoriesIntoKey(fcZero, fcZero): | 
| 1660 | 0 |     makeNaN(); | 
| 1661 | 0 |     return opInvalidOp; | 
| 1662 | 0 | 
 | 
| 1663 | 0 |   case PackCategoriesIntoKey(fcNormal, fcNormal): | 
| 1664 | 0 |     return opOK; | 
| 1665 | 0 |   } | 
| 1666 | 0 | } | 
| 1667 |  |  | 
| 1668 | 0 | IEEEFloat::opStatus IEEEFloat::modSpecials(const IEEEFloat &rhs) { | 
| 1669 | 0 |   switch (PackCategoriesIntoKey(category, rhs.category)) { | 
| 1670 | 0 |   default: | 
| 1671 | 0 |     llvm_unreachable(nullptr); | 
| 1672 | 0 | 
 | 
| 1673 | 0 |   case PackCategoriesIntoKey(fcZero, fcNaN): | 
| 1674 | 0 |   case PackCategoriesIntoKey(fcNormal, fcNaN): | 
| 1675 | 0 |   case PackCategoriesIntoKey(fcInfinity, fcNaN): | 
| 1676 | 0 |     assign(rhs); | 
| 1677 | 0 |     LLVM_FALLTHROUGH; | 
| 1678 | 0 |   case PackCategoriesIntoKey(fcNaN, fcZero): | 
| 1679 | 0 |   case PackCategoriesIntoKey(fcNaN, fcNormal): | 
| 1680 | 0 |   case PackCategoriesIntoKey(fcNaN, fcInfinity): | 
| 1681 | 0 |   case PackCategoriesIntoKey(fcNaN, fcNaN): | 
| 1682 | 0 |     if (isSignaling()) { | 
| 1683 | 0 |       makeQuiet(); | 
| 1684 | 0 |       return opInvalidOp; | 
| 1685 | 0 |     } | 
| 1686 | 0 |     return rhs.isSignaling() ? opInvalidOp : opOK; | 
| 1687 | 0 | 
 | 
| 1688 | 0 |   case PackCategoriesIntoKey(fcZero, fcInfinity): | 
| 1689 | 0 |   case PackCategoriesIntoKey(fcZero, fcNormal): | 
| 1690 | 0 |   case PackCategoriesIntoKey(fcNormal, fcInfinity): | 
| 1691 | 0 |     return opOK; | 
| 1692 | 0 | 
 | 
| 1693 | 0 |   case PackCategoriesIntoKey(fcNormal, fcZero): | 
| 1694 | 0 |   case PackCategoriesIntoKey(fcInfinity, fcZero): | 
| 1695 | 0 |   case PackCategoriesIntoKey(fcInfinity, fcNormal): | 
| 1696 | 0 |   case PackCategoriesIntoKey(fcInfinity, fcInfinity): | 
| 1697 | 0 |   case PackCategoriesIntoKey(fcZero, fcZero): | 
| 1698 | 0 |     makeNaN(); | 
| 1699 | 0 |     return opInvalidOp; | 
| 1700 | 0 | 
 | 
| 1701 | 0 |   case PackCategoriesIntoKey(fcNormal, fcNormal): | 
| 1702 | 0 |     return opOK; | 
| 1703 | 0 |   } | 
| 1704 | 0 | } | 
| 1705 |  |  | 
| 1706 | 0 | IEEEFloat::opStatus IEEEFloat::remainderSpecials(const IEEEFloat &rhs) { | 
| 1707 | 0 |   switch (PackCategoriesIntoKey(category, rhs.category)) { | 
| 1708 | 0 |   default: | 
| 1709 | 0 |     llvm_unreachable(nullptr); | 
| 1710 | 0 | 
 | 
| 1711 | 0 |   case PackCategoriesIntoKey(fcZero, fcNaN): | 
| 1712 | 0 |   case PackCategoriesIntoKey(fcNormal, fcNaN): | 
| 1713 | 0 |   case PackCategoriesIntoKey(fcInfinity, fcNaN): | 
| 1714 | 0 |     assign(rhs); | 
| 1715 | 0 |     LLVM_FALLTHROUGH; | 
| 1716 | 0 |   case PackCategoriesIntoKey(fcNaN, fcZero): | 
| 1717 | 0 |   case PackCategoriesIntoKey(fcNaN, fcNormal): | 
| 1718 | 0 |   case PackCategoriesIntoKey(fcNaN, fcInfinity): | 
| 1719 | 0 |   case PackCategoriesIntoKey(fcNaN, fcNaN): | 
| 1720 | 0 |     if (isSignaling()) { | 
| 1721 | 0 |       makeQuiet(); | 
| 1722 | 0 |       return opInvalidOp; | 
| 1723 | 0 |     } | 
| 1724 | 0 |     return rhs.isSignaling() ? opInvalidOp : opOK; | 
| 1725 | 0 | 
 | 
| 1726 | 0 |   case PackCategoriesIntoKey(fcZero, fcInfinity): | 
| 1727 | 0 |   case PackCategoriesIntoKey(fcZero, fcNormal): | 
| 1728 | 0 |   case PackCategoriesIntoKey(fcNormal, fcInfinity): | 
| 1729 | 0 |     return opOK; | 
| 1730 | 0 | 
 | 
| 1731 | 0 |   case PackCategoriesIntoKey(fcNormal, fcZero): | 
| 1732 | 0 |   case PackCategoriesIntoKey(fcInfinity, fcZero): | 
| 1733 | 0 |   case PackCategoriesIntoKey(fcInfinity, fcNormal): | 
| 1734 | 0 |   case PackCategoriesIntoKey(fcInfinity, fcInfinity): | 
| 1735 | 0 |   case PackCategoriesIntoKey(fcZero, fcZero): | 
| 1736 | 0 |     makeNaN(); | 
| 1737 | 0 |     return opInvalidOp; | 
| 1738 | 0 | 
 | 
| 1739 | 0 |   case PackCategoriesIntoKey(fcNormal, fcNormal): | 
| 1740 | 0 |     return opDivByZero; // fake status, indicating this is not a special case | 
| 1741 | 0 |   } | 
| 1742 | 0 | } | 
| 1743 |  |  | 
| 1744 |  | /* Change sign.  */ | 
| 1745 | 0 | void IEEEFloat::changeSign() { | 
| 1746 | 0 |   /* Look mummy, this one's easy.  */ | 
| 1747 | 0 |   sign = !sign; | 
| 1748 | 0 | } | 
| 1749 |  |  | 
| 1750 |  | /* Normalized addition or subtraction.  */ | 
| 1751 |  | IEEEFloat::opStatus IEEEFloat::addOrSubtract(const IEEEFloat &rhs, | 
| 1752 |  |                                              roundingMode rounding_mode, | 
| 1753 | 0 |                                              bool subtract) { | 
| 1754 | 0 |   opStatus fs; | 
| 1755 | 0 | 
 | 
| 1756 | 0 |   fs = addOrSubtractSpecials(rhs, subtract); | 
| 1757 | 0 | 
 | 
| 1758 | 0 |   /* This return code means it was not a simple case.  */ | 
| 1759 | 0 |   if (fs == opDivByZero) { | 
| 1760 | 0 |     lostFraction lost_fraction; | 
| 1761 | 0 | 
 | 
| 1762 | 0 |     lost_fraction = addOrSubtractSignificand(rhs, subtract); | 
| 1763 | 0 |     fs = normalize(rounding_mode, lost_fraction); | 
| 1764 | 0 | 
 | 
| 1765 | 0 |     /* Can only be zero if we lost no fraction.  */ | 
| 1766 | 0 |     assert(category != fcZero || lost_fraction == lfExactlyZero); | 
| 1767 | 0 |   } | 
| 1768 | 0 | 
 | 
| 1769 | 0 |   /* If two numbers add (exactly) to zero, IEEE 754 decrees it is a | 
| 1770 | 0 |      positive zero unless rounding to minus infinity, except that | 
| 1771 | 0 |      adding two like-signed zeroes gives that zero.  */ | 
| 1772 | 0 |   if (category == fcZero) { | 
| 1773 | 0 |     if (rhs.category != fcZero || (sign == rhs.sign) == subtract) | 
| 1774 | 0 |       sign = (rounding_mode == rmTowardNegative); | 
| 1775 | 0 |   } | 
| 1776 | 0 | 
 | 
| 1777 | 0 |   return fs; | 
| 1778 | 0 | } | 
| 1779 |  |  | 
| 1780 |  | /* Normalized addition.  */ | 
| 1781 |  | IEEEFloat::opStatus IEEEFloat::add(const IEEEFloat &rhs, | 
| 1782 | 0 |                                    roundingMode rounding_mode) { | 
| 1783 | 0 |   return addOrSubtract(rhs, rounding_mode, false); | 
| 1784 | 0 | } | 
| 1785 |  |  | 
| 1786 |  | /* Normalized subtraction.  */ | 
| 1787 |  | IEEEFloat::opStatus IEEEFloat::subtract(const IEEEFloat &rhs, | 
| 1788 | 0 |                                         roundingMode rounding_mode) { | 
| 1789 | 0 |   return addOrSubtract(rhs, rounding_mode, true); | 
| 1790 | 0 | } | 
| 1791 |  |  | 
| 1792 |  | /* Normalized multiply.  */ | 
| 1793 |  | IEEEFloat::opStatus IEEEFloat::multiply(const IEEEFloat &rhs, | 
| 1794 | 0 |                                         roundingMode rounding_mode) { | 
| 1795 | 0 |   opStatus fs; | 
| 1796 | 0 | 
 | 
| 1797 | 0 |   sign ^= rhs.sign; | 
| 1798 | 0 |   fs = multiplySpecials(rhs); | 
| 1799 | 0 | 
 | 
| 1800 | 0 |   if (isFiniteNonZero()) { | 
| 1801 | 0 |     lostFraction lost_fraction = multiplySignificand(rhs); | 
| 1802 | 0 |     fs = normalize(rounding_mode, lost_fraction); | 
| 1803 | 0 |     if (lost_fraction != lfExactlyZero) | 
| 1804 | 0 |       fs = (opStatus) (fs | opInexact); | 
| 1805 | 0 |   } | 
| 1806 | 0 | 
 | 
| 1807 | 0 |   return fs; | 
| 1808 | 0 | } | 
| 1809 |  |  | 
| 1810 |  | /* Normalized divide.  */ | 
| 1811 |  | IEEEFloat::opStatus IEEEFloat::divide(const IEEEFloat &rhs, | 
| 1812 | 0 |                                       roundingMode rounding_mode) { | 
| 1813 | 0 |   opStatus fs; | 
| 1814 | 0 | 
 | 
| 1815 | 0 |   sign ^= rhs.sign; | 
| 1816 | 0 |   fs = divideSpecials(rhs); | 
| 1817 | 0 | 
 | 
| 1818 | 0 |   if (isFiniteNonZero()) { | 
| 1819 | 0 |     lostFraction lost_fraction = divideSignificand(rhs); | 
| 1820 | 0 |     fs = normalize(rounding_mode, lost_fraction); | 
| 1821 | 0 |     if (lost_fraction != lfExactlyZero) | 
| 1822 | 0 |       fs = (opStatus) (fs | opInexact); | 
| 1823 | 0 |   } | 
| 1824 | 0 | 
 | 
| 1825 | 0 |   return fs; | 
| 1826 | 0 | } | 
| 1827 |  |  | 
| 1828 |  | /* Normalized remainder.  */ | 
| 1829 | 0 | IEEEFloat::opStatus IEEEFloat::remainder(const IEEEFloat &rhs) { | 
| 1830 | 0 |   opStatus fs; | 
| 1831 | 0 |   unsigned int origSign = sign; | 
| 1832 | 0 | 
 | 
| 1833 | 0 |   // First handle the special cases. | 
| 1834 | 0 |   fs = remainderSpecials(rhs); | 
| 1835 | 0 |   if (fs != opDivByZero) | 
| 1836 | 0 |     return fs; | 
| 1837 | 0 |  | 
| 1838 | 0 |   fs = opOK; | 
| 1839 | 0 | 
 | 
| 1840 | 0 |   // Make sure the current value is less than twice the denom. If the addition | 
| 1841 | 0 |   // did not succeed (an overflow has happened), which means that the finite | 
| 1842 | 0 |   // value we currently posses must be less than twice the denom (as we are | 
| 1843 | 0 |   // using the same semantics). | 
| 1844 | 0 |   IEEEFloat P2 = rhs; | 
| 1845 | 0 |   if (P2.add(rhs, rmNearestTiesToEven) == opOK) { | 
| 1846 | 0 |     fs = mod(P2); | 
| 1847 | 0 |     assert(fs == opOK); | 
| 1848 | 0 |   } | 
| 1849 | 0 | 
 | 
| 1850 | 0 |   // Lets work with absolute numbers. | 
| 1851 | 0 |   IEEEFloat P = rhs; | 
| 1852 | 0 |   P.sign = false; | 
| 1853 | 0 |   sign = false; | 
| 1854 | 0 | 
 | 
| 1855 | 0 |   // | 
| 1856 | 0 |   // To calculate the remainder we use the following scheme. | 
| 1857 | 0 |   // | 
| 1858 | 0 |   // The remainder is defained as follows: | 
| 1859 | 0 |   // | 
| 1860 | 0 |   // remainder = numer - rquot * denom = x - r * p | 
| 1861 | 0 |   // | 
| 1862 | 0 |   // Where r is the result of: x/p, rounded toward the nearest integral value | 
| 1863 | 0 |   // (with halfway cases rounded toward the even number). | 
| 1864 | 0 |   // | 
| 1865 | 0 |   // Currently, (after x mod 2p): | 
| 1866 | 0 |   // r is the number of 2p's present inside x, which is inherently, an even | 
| 1867 | 0 |   // number of p's. | 
| 1868 | 0 |   // | 
| 1869 | 0 |   // We may split the remaining calculation into 4 options: | 
| 1870 | 0 |   // - if x < 0.5p then we round to the nearest number with is 0, and are done. | 
| 1871 | 0 |   // - if x == 0.5p then we round to the nearest even number which is 0, and we | 
| 1872 | 0 |   //   are done as well. | 
| 1873 | 0 |   // - if 0.5p < x < p then we round to nearest number which is 1, and we have | 
| 1874 | 0 |   //   to subtract 1p at least once. | 
| 1875 | 0 |   // - if x >= p then we must subtract p at least once, as x must be a | 
| 1876 | 0 |   //   remainder. | 
| 1877 | 0 |   // | 
| 1878 | 0 |   // By now, we were done, or we added 1 to r, which in turn, now an odd number. | 
| 1879 | 0 |   // | 
| 1880 | 0 |   // We can now split the remaining calculation to the following 3 options: | 
| 1881 | 0 |   // - if x < 0.5p then we round to the nearest number with is 0, and are done. | 
| 1882 | 0 |   // - if x == 0.5p then we round to the nearest even number. As r is odd, we | 
| 1883 | 0 |   //   must round up to the next even number. so we must subtract p once more. | 
| 1884 | 0 |   // - if x > 0.5p (and inherently x < p) then we must round r up to the next | 
| 1885 | 0 |   //   integral, and subtract p once more. | 
| 1886 | 0 |   // | 
| 1887 | 0 | 
 | 
| 1888 | 0 |   // Extend the semantics to prevent an overflow/underflow or inexact result. | 
| 1889 | 0 |   bool losesInfo; | 
| 1890 | 0 |   fltSemantics extendedSemantics = *semantics; | 
| 1891 | 0 |   extendedSemantics.maxExponent++; | 
| 1892 | 0 |   extendedSemantics.minExponent--; | 
| 1893 | 0 |   extendedSemantics.precision += 2; | 
| 1894 | 0 | 
 | 
| 1895 | 0 |   IEEEFloat VEx = *this; | 
| 1896 | 0 |   fs = VEx.convert(extendedSemantics, rmNearestTiesToEven, &losesInfo); | 
| 1897 | 0 |   assert(fs == opOK && !losesInfo); | 
| 1898 | 0 |   IEEEFloat PEx = P; | 
| 1899 | 0 |   fs = PEx.convert(extendedSemantics, rmNearestTiesToEven, &losesInfo); | 
| 1900 | 0 |   assert(fs == opOK && !losesInfo); | 
| 1901 | 0 | 
 | 
| 1902 | 0 |   // It is simpler to work with 2x instead of 0.5p, and we do not need to lose | 
| 1903 | 0 |   // any fraction. | 
| 1904 | 0 |   fs = VEx.add(VEx, rmNearestTiesToEven); | 
| 1905 | 0 |   assert(fs == opOK); | 
| 1906 | 0 | 
 | 
| 1907 | 0 |   if (VEx.compare(PEx) == cmpGreaterThan) { | 
| 1908 | 0 |     fs = subtract(P, rmNearestTiesToEven); | 
| 1909 | 0 |     assert(fs == opOK); | 
| 1910 | 0 | 
 | 
| 1911 | 0 |     // Make VEx = this.add(this), but because we have different semantics, we do | 
| 1912 | 0 |     // not want to `convert` again, so we just subtract PEx twice (which equals | 
| 1913 | 0 |     // to the desired value). | 
| 1914 | 0 |     fs = VEx.subtract(PEx, rmNearestTiesToEven); | 
| 1915 | 0 |     assert(fs == opOK); | 
| 1916 | 0 |     fs = VEx.subtract(PEx, rmNearestTiesToEven); | 
| 1917 | 0 |     assert(fs == opOK); | 
| 1918 | 0 | 
 | 
| 1919 | 0 |     cmpResult result = VEx.compare(PEx); | 
| 1920 | 0 |     if (result == cmpGreaterThan || result == cmpEqual) { | 
| 1921 | 0 |       fs = subtract(P, rmNearestTiesToEven); | 
| 1922 | 0 |       assert(fs == opOK); | 
| 1923 | 0 |     } | 
| 1924 | 0 |   } | 
| 1925 | 0 | 
 | 
| 1926 | 0 |   if (isZero()) | 
| 1927 | 0 |     sign = origSign;    // IEEE754 requires this | 
| 1928 | 0 |   else | 
| 1929 | 0 |     sign ^= origSign; | 
| 1930 | 0 |   return fs; | 
| 1931 | 0 | } | 
| 1932 |  |  | 
| 1933 |  | /* Normalized llvm frem (C fmod). */ | 
| 1934 | 0 | IEEEFloat::opStatus IEEEFloat::mod(const IEEEFloat &rhs) { | 
| 1935 | 0 |   opStatus fs; | 
| 1936 | 0 |   fs = modSpecials(rhs); | 
| 1937 | 0 |   unsigned int origSign = sign; | 
| 1938 | 0 | 
 | 
| 1939 | 0 |   while (isFiniteNonZero() && rhs.isFiniteNonZero() && | 
| 1940 | 0 |          compareAbsoluteValue(rhs) != cmpLessThan) { | 
| 1941 | 0 |     IEEEFloat V = scalbn(rhs, ilogb(*this) - ilogb(rhs), rmNearestTiesToEven); | 
| 1942 | 0 |     if (compareAbsoluteValue(V) == cmpLessThan) | 
| 1943 | 0 |       V = scalbn(V, -1, rmNearestTiesToEven); | 
| 1944 | 0 |     V.sign = sign; | 
| 1945 | 0 | 
 | 
| 1946 | 0 |     fs = subtract(V, rmNearestTiesToEven); | 
| 1947 | 0 |     assert(fs==opOK); | 
| 1948 | 0 |   } | 
| 1949 | 0 |   if (isZero()) | 
| 1950 | 0 |     sign = origSign; // fmod requires this | 
| 1951 | 0 |   return fs; | 
| 1952 | 0 | } | 
| 1953 |  |  | 
| 1954 |  | /* Normalized fused-multiply-add.  */ | 
| 1955 |  | IEEEFloat::opStatus IEEEFloat::fusedMultiplyAdd(const IEEEFloat &multiplicand, | 
| 1956 |  |                                                 const IEEEFloat &addend, | 
| 1957 | 0 |                                                 roundingMode rounding_mode) { | 
| 1958 | 0 |   opStatus fs; | 
| 1959 | 0 | 
 | 
| 1960 | 0 |   /* Post-multiplication sign, before addition.  */ | 
| 1961 | 0 |   sign ^= multiplicand.sign; | 
| 1962 | 0 | 
 | 
| 1963 | 0 |   /* If and only if all arguments are normal do we need to do an | 
| 1964 | 0 |      extended-precision calculation.  */ | 
| 1965 | 0 |   if (isFiniteNonZero() && | 
| 1966 | 0 |       multiplicand.isFiniteNonZero() && | 
| 1967 | 0 |       addend.isFinite()) { | 
| 1968 | 0 |     lostFraction lost_fraction; | 
| 1969 | 0 | 
 | 
| 1970 | 0 |     lost_fraction = multiplySignificand(multiplicand, addend); | 
| 1971 | 0 |     fs = normalize(rounding_mode, lost_fraction); | 
| 1972 | 0 |     if (lost_fraction != lfExactlyZero) | 
| 1973 | 0 |       fs = (opStatus) (fs | opInexact); | 
| 1974 | 0 | 
 | 
| 1975 | 0 |     /* If two numbers add (exactly) to zero, IEEE 754 decrees it is a | 
| 1976 | 0 |        positive zero unless rounding to minus infinity, except that | 
| 1977 | 0 |        adding two like-signed zeroes gives that zero.  */ | 
| 1978 | 0 |     if (category == fcZero && !(fs & opUnderflow) && sign != addend.sign) | 
| 1979 | 0 |       sign = (rounding_mode == rmTowardNegative); | 
| 1980 | 0 |   } else { | 
| 1981 | 0 |     fs = multiplySpecials(multiplicand); | 
| 1982 | 0 | 
 | 
| 1983 | 0 |     /* FS can only be opOK or opInvalidOp.  There is no more work | 
| 1984 | 0 |        to do in the latter case.  The IEEE-754R standard says it is | 
| 1985 | 0 |        implementation-defined in this case whether, if ADDEND is a | 
| 1986 | 0 |        quiet NaN, we raise invalid op; this implementation does so. | 
| 1987 | 0 | 
 | 
| 1988 | 0 |        If we need to do the addition we can do so with normal | 
| 1989 | 0 |        precision.  */ | 
| 1990 | 0 |     if (fs == opOK) | 
| 1991 | 0 |       fs = addOrSubtract(addend, rounding_mode, false); | 
| 1992 | 0 |   } | 
| 1993 | 0 | 
 | 
| 1994 | 0 |   return fs; | 
| 1995 | 0 | } | 
| 1996 |  |  | 
| 1997 |  | /* Rounding-mode correct round to integral value.  */ | 
| 1998 | 0 | IEEEFloat::opStatus IEEEFloat::roundToIntegral(roundingMode rounding_mode) { | 
| 1999 | 0 |   opStatus fs; | 
| 2000 | 0 | 
 | 
| 2001 | 0 |   if (isInfinity()) | 
| 2002 | 0 |     // [IEEE Std 754-2008 6.1]: | 
| 2003 | 0 |     // The behavior of infinity in floating-point arithmetic is derived from the | 
| 2004 | 0 |     // limiting cases of real arithmetic with operands of arbitrarily | 
| 2005 | 0 |     // large magnitude, when such a limit exists. | 
| 2006 | 0 |     // ... | 
| 2007 | 0 |     // Operations on infinite operands are usually exact and therefore signal no | 
| 2008 | 0 |     // exceptions ... | 
| 2009 | 0 |     return opOK; | 
| 2010 | 0 |  | 
| 2011 | 0 |   if (isNaN()) { | 
| 2012 | 0 |     if (isSignaling()) { | 
| 2013 | 0 |       // [IEEE Std 754-2008 6.2]: | 
| 2014 | 0 |       // Under default exception handling, any operation signaling an invalid | 
| 2015 | 0 |       // operation exception and for which a floating-point result is to be | 
| 2016 | 0 |       // delivered shall deliver a quiet NaN. | 
| 2017 | 0 |       makeQuiet(); | 
| 2018 | 0 |       // [IEEE Std 754-2008 6.2]: | 
| 2019 | 0 |       // Signaling NaNs shall be reserved operands that, under default exception | 
| 2020 | 0 |       // handling, signal the invalid operation exception(see 7.2) for every | 
| 2021 | 0 |       // general-computational and signaling-computational operation except for | 
| 2022 | 0 |       // the conversions described in 5.12. | 
| 2023 | 0 |       return opInvalidOp; | 
| 2024 | 0 |     } else { | 
| 2025 | 0 |       // [IEEE Std 754-2008 6.2]: | 
| 2026 | 0 |       // For an operation with quiet NaN inputs, other than maximum and minimum | 
| 2027 | 0 |       // operations, if a floating-point result is to be delivered the result | 
| 2028 | 0 |       // shall be a quiet NaN which should be one of the input NaNs. | 
| 2029 | 0 |       // ... | 
| 2030 | 0 |       // Every general-computational and quiet-computational operation involving | 
| 2031 | 0 |       // one or more input NaNs, none of them signaling, shall signal no | 
| 2032 | 0 |       // exception, except fusedMultiplyAdd might signal the invalid operation | 
| 2033 | 0 |       // exception(see 7.2). | 
| 2034 | 0 |       return opOK; | 
| 2035 | 0 |     } | 
| 2036 | 0 |   } | 
| 2037 | 0 |  | 
| 2038 | 0 |   if (isZero()) { | 
| 2039 | 0 |     // [IEEE Std 754-2008 6.3]: | 
| 2040 | 0 |     // ... the sign of the result of conversions, the quantize operation, the | 
| 2041 | 0 |     // roundToIntegral operations, and the roundToIntegralExact(see 5.3.1) is | 
| 2042 | 0 |     // the sign of the first or only operand. | 
| 2043 | 0 |     return opOK; | 
| 2044 | 0 |   } | 
| 2045 | 0 |  | 
| 2046 | 0 |   // If the exponent is large enough, we know that this value is already | 
| 2047 | 0 |   // integral, and the arithmetic below would potentially cause it to saturate | 
| 2048 | 0 |   // to +/-Inf.  Bail out early instead. | 
| 2049 | 0 |   if (exponent+1 >= (int)semanticsPrecision(*semantics)) | 
| 2050 | 0 |     return opOK; | 
| 2051 | 0 |  | 
| 2052 | 0 |   // The algorithm here is quite simple: we add 2^(p-1), where p is the | 
| 2053 | 0 |   // precision of our format, and then subtract it back off again.  The choice | 
| 2054 | 0 |   // of rounding modes for the addition/subtraction determines the rounding mode | 
| 2055 | 0 |   // for our integral rounding as well. | 
| 2056 | 0 |   // NOTE: When the input value is negative, we do subtraction followed by | 
| 2057 | 0 |   // addition instead. | 
| 2058 | 0 |   APInt IntegerConstant(NextPowerOf2(semanticsPrecision(*semantics)), 1); | 
| 2059 | 0 |   IntegerConstant <<= semanticsPrecision(*semantics)-1; | 
| 2060 | 0 |   IEEEFloat MagicConstant(*semantics); | 
| 2061 | 0 |   fs = MagicConstant.convertFromAPInt(IntegerConstant, false, | 
| 2062 | 0 |                                       rmNearestTiesToEven); | 
| 2063 | 0 |   assert(fs == opOK); | 
| 2064 | 0 |   MagicConstant.sign = sign; | 
| 2065 | 0 | 
 | 
| 2066 | 0 |   // Preserve the input sign so that we can handle the case of zero result | 
| 2067 | 0 |   // correctly. | 
| 2068 | 0 |   bool inputSign = isNegative(); | 
| 2069 | 0 | 
 | 
| 2070 | 0 |   fs = add(MagicConstant, rounding_mode); | 
| 2071 | 0 | 
 | 
| 2072 | 0 |   // Current value and 'MagicConstant' are both integers, so the result of the | 
| 2073 | 0 |   // subtraction is always exact according to Sterbenz' lemma. | 
| 2074 | 0 |   subtract(MagicConstant, rounding_mode); | 
| 2075 | 0 | 
 | 
| 2076 | 0 |   // Restore the input sign. | 
| 2077 | 0 |   if (inputSign != isNegative()) | 
| 2078 | 0 |     changeSign(); | 
| 2079 | 0 | 
 | 
| 2080 | 0 |   return fs; | 
| 2081 | 0 | } | 
| 2082 |  |  | 
| 2083 |  |  | 
| 2084 |  | /* Comparison requires normalized numbers.  */ | 
| 2085 | 0 | IEEEFloat::cmpResult IEEEFloat::compare(const IEEEFloat &rhs) const { | 
| 2086 | 0 |   cmpResult result; | 
| 2087 | 0 | 
 | 
| 2088 | 0 |   assert(semantics == rhs.semantics); | 
| 2089 | 0 | 
 | 
| 2090 | 0 |   switch (PackCategoriesIntoKey(category, rhs.category)) { | 
| 2091 | 0 |   default: | 
| 2092 | 0 |     llvm_unreachable(nullptr); | 
| 2093 | 0 | 
 | 
| 2094 | 0 |   case PackCategoriesIntoKey(fcNaN, fcZero): | 
| 2095 | 0 |   case PackCategoriesIntoKey(fcNaN, fcNormal): | 
| 2096 | 0 |   case PackCategoriesIntoKey(fcNaN, fcInfinity): | 
| 2097 | 0 |   case PackCategoriesIntoKey(fcNaN, fcNaN): | 
| 2098 | 0 |   case PackCategoriesIntoKey(fcZero, fcNaN): | 
| 2099 | 0 |   case PackCategoriesIntoKey(fcNormal, fcNaN): | 
| 2100 | 0 |   case PackCategoriesIntoKey(fcInfinity, fcNaN): | 
| 2101 | 0 |     return cmpUnordered; | 
| 2102 | 0 | 
 | 
| 2103 | 0 |   case PackCategoriesIntoKey(fcInfinity, fcNormal): | 
| 2104 | 0 |   case PackCategoriesIntoKey(fcInfinity, fcZero): | 
| 2105 | 0 |   case PackCategoriesIntoKey(fcNormal, fcZero): | 
| 2106 | 0 |     if (sign) | 
| 2107 | 0 |       return cmpLessThan; | 
| 2108 | 0 |     else | 
| 2109 | 0 |       return cmpGreaterThan; | 
| 2110 | 0 |  | 
| 2111 | 0 |   case PackCategoriesIntoKey(fcNormal, fcInfinity): | 
| 2112 | 0 |   case PackCategoriesIntoKey(fcZero, fcInfinity): | 
| 2113 | 0 |   case PackCategoriesIntoKey(fcZero, fcNormal): | 
| 2114 | 0 |     if (rhs.sign) | 
| 2115 | 0 |       return cmpGreaterThan; | 
| 2116 | 0 |     else | 
| 2117 | 0 |       return cmpLessThan; | 
| 2118 | 0 |  | 
| 2119 | 0 |   case PackCategoriesIntoKey(fcInfinity, fcInfinity): | 
| 2120 | 0 |     if (sign == rhs.sign) | 
| 2121 | 0 |       return cmpEqual; | 
| 2122 | 0 |     else if (sign) | 
| 2123 | 0 |       return cmpLessThan; | 
| 2124 | 0 |     else | 
| 2125 | 0 |       return cmpGreaterThan; | 
| 2126 | 0 |  | 
| 2127 | 0 |   case PackCategoriesIntoKey(fcZero, fcZero): | 
| 2128 | 0 |     return cmpEqual; | 
| 2129 | 0 | 
 | 
| 2130 | 0 |   case PackCategoriesIntoKey(fcNormal, fcNormal): | 
| 2131 | 0 |     break; | 
| 2132 | 0 |   } | 
| 2133 | 0 | 
 | 
| 2134 | 0 |   /* Two normal numbers.  Do they have the same sign?  */ | 
| 2135 | 0 |   if (sign != rhs.sign) { | 
| 2136 | 0 |     if (sign) | 
| 2137 | 0 |       result = cmpLessThan; | 
| 2138 | 0 |     else | 
| 2139 | 0 |       result = cmpGreaterThan; | 
| 2140 | 0 |   } else { | 
| 2141 | 0 |     /* Compare absolute values; invert result if negative.  */ | 
| 2142 | 0 |     result = compareAbsoluteValue(rhs); | 
| 2143 | 0 | 
 | 
| 2144 | 0 |     if (sign) { | 
| 2145 | 0 |       if (result == cmpLessThan) | 
| 2146 | 0 |         result = cmpGreaterThan; | 
| 2147 | 0 |       else if (result == cmpGreaterThan) | 
| 2148 | 0 |         result = cmpLessThan; | 
| 2149 | 0 |     } | 
| 2150 | 0 |   } | 
| 2151 | 0 | 
 | 
| 2152 | 0 |   return result; | 
| 2153 | 0 | } | 
| 2154 |  |  | 
| 2155 |  | /// IEEEFloat::convert - convert a value of one floating point type to another. | 
| 2156 |  | /// The return value corresponds to the IEEE754 exceptions.  *losesInfo | 
| 2157 |  | /// records whether the transformation lost information, i.e. whether | 
| 2158 |  | /// converting the result back to the original type will produce the | 
| 2159 |  | /// original value (this is almost the same as return value==fsOK, but there | 
| 2160 |  | /// are edge cases where this is not so). | 
| 2161 |  |  | 
| 2162 |  | IEEEFloat::opStatus IEEEFloat::convert(const fltSemantics &toSemantics, | 
| 2163 |  |                                        roundingMode rounding_mode, | 
| 2164 | 0 |                                        bool *losesInfo) { | 
| 2165 | 0 |   lostFraction lostFraction; | 
| 2166 | 0 |   unsigned int newPartCount, oldPartCount; | 
| 2167 | 0 |   opStatus fs; | 
| 2168 | 0 |   int shift; | 
| 2169 | 0 |   const fltSemantics &fromSemantics = *semantics; | 
| 2170 | 0 | 
 | 
| 2171 | 0 |   lostFraction = lfExactlyZero; | 
| 2172 | 0 |   newPartCount = partCountForBits(toSemantics.precision + 1); | 
| 2173 | 0 |   oldPartCount = partCount(); | 
| 2174 | 0 |   shift = toSemantics.precision - fromSemantics.precision; | 
| 2175 | 0 | 
 | 
| 2176 | 0 |   bool X86SpecialNan = false; | 
| 2177 | 0 |   if (&fromSemantics == &semX87DoubleExtended && | 
| 2178 | 0 |       &toSemantics != &semX87DoubleExtended && category == fcNaN && | 
| 2179 | 0 |       (!(*significandParts() & 0x8000000000000000ULL) || | 
| 2180 | 0 |        !(*significandParts() & 0x4000000000000000ULL))) { | 
| 2181 | 0 |     // x86 has some unusual NaNs which cannot be represented in any other | 
| 2182 | 0 |     // format; note them here. | 
| 2183 | 0 |     X86SpecialNan = true; | 
| 2184 | 0 |   } | 
| 2185 | 0 | 
 | 
| 2186 | 0 |   // If this is a truncation of a denormal number, and the target semantics | 
| 2187 | 0 |   // has larger exponent range than the source semantics (this can happen | 
| 2188 | 0 |   // when truncating from PowerPC double-double to double format), the | 
| 2189 | 0 |   // right shift could lose result mantissa bits.  Adjust exponent instead | 
| 2190 | 0 |   // of performing excessive shift. | 
| 2191 | 0 |   if (shift < 0 && isFiniteNonZero()) { | 
| 2192 | 0 |     int exponentChange = significandMSB() + 1 - fromSemantics.precision; | 
| 2193 | 0 |     if (exponent + exponentChange < toSemantics.minExponent) | 
| 2194 | 0 |       exponentChange = toSemantics.minExponent - exponent; | 
| 2195 | 0 |     if (exponentChange < shift) | 
| 2196 | 0 |       exponentChange = shift; | 
| 2197 | 0 |     if (exponentChange < 0) { | 
| 2198 | 0 |       shift -= exponentChange; | 
| 2199 | 0 |       exponent += exponentChange; | 
| 2200 | 0 |     } | 
| 2201 | 0 |   } | 
| 2202 | 0 | 
 | 
| 2203 | 0 |   // If this is a truncation, perform the shift before we narrow the storage. | 
| 2204 | 0 |   if (shift < 0 && (isFiniteNonZero() || category==fcNaN)) | 
| 2205 | 0 |     lostFraction = shiftRight(significandParts(), oldPartCount, -shift); | 
| 2206 | 0 | 
 | 
| 2207 | 0 |   // Fix the storage so it can hold to new value. | 
| 2208 | 0 |   if (newPartCount > oldPartCount) { | 
| 2209 | 0 |     // The new type requires more storage; make it available. | 
| 2210 | 0 |     integerPart *newParts; | 
| 2211 | 0 |     newParts = new integerPart[newPartCount]; | 
| 2212 | 0 |     APInt::tcSet(newParts, 0, newPartCount); | 
| 2213 | 0 |     if (isFiniteNonZero() || category==fcNaN) | 
| 2214 | 0 |       APInt::tcAssign(newParts, significandParts(), oldPartCount); | 
| 2215 | 0 |     freeSignificand(); | 
| 2216 | 0 |     significand.parts = newParts; | 
| 2217 | 0 |   } else if (newPartCount == 1 && oldPartCount != 1) { | 
| 2218 | 0 |     // Switch to built-in storage for a single part. | 
| 2219 | 0 |     integerPart newPart = 0; | 
| 2220 | 0 |     if (isFiniteNonZero() || category==fcNaN) | 
| 2221 | 0 |       newPart = significandParts()[0]; | 
| 2222 | 0 |     freeSignificand(); | 
| 2223 | 0 |     significand.part = newPart; | 
| 2224 | 0 |   } | 
| 2225 | 0 | 
 | 
| 2226 | 0 |   // Now that we have the right storage, switch the semantics. | 
| 2227 | 0 |   semantics = &toSemantics; | 
| 2228 | 0 | 
 | 
| 2229 | 0 |   // If this is an extension, perform the shift now that the storage is | 
| 2230 | 0 |   // available. | 
| 2231 | 0 |   if (shift > 0 && (isFiniteNonZero() || category==fcNaN)) | 
| 2232 | 0 |     APInt::tcShiftLeft(significandParts(), newPartCount, shift); | 
| 2233 | 0 | 
 | 
| 2234 | 0 |   if (isFiniteNonZero()) { | 
| 2235 | 0 |     fs = normalize(rounding_mode, lostFraction); | 
| 2236 | 0 |     *losesInfo = (fs != opOK); | 
| 2237 | 0 |   } else if (category == fcNaN) { | 
| 2238 | 0 |     *losesInfo = lostFraction != lfExactlyZero || X86SpecialNan; | 
| 2239 | 0 | 
 | 
| 2240 | 0 |     // For x87 extended precision, we want to make a NaN, not a special NaN if | 
| 2241 | 0 |     // the input wasn't special either. | 
| 2242 | 0 |     if (!X86SpecialNan && semantics == &semX87DoubleExtended) | 
| 2243 | 0 |       APInt::tcSetBit(significandParts(), semantics->precision - 1); | 
| 2244 | 0 | 
 | 
| 2245 | 0 |     // gcc forces the Quiet bit on, which means (float)(double)(float_sNan) | 
| 2246 | 0 |     // does not give you back the same bits.  This is dubious, and we | 
| 2247 | 0 |     // don't currently do it.  You're really supposed to get | 
| 2248 | 0 |     // an invalid operation signal at runtime, but nobody does that. | 
| 2249 | 0 |     fs = opOK; | 
| 2250 | 0 |   } else { | 
| 2251 | 0 |     *losesInfo = false; | 
| 2252 | 0 |     fs = opOK; | 
| 2253 | 0 |   } | 
| 2254 | 0 | 
 | 
| 2255 | 0 |   return fs; | 
| 2256 | 0 | } | 
| 2257 |  |  | 
| 2258 |  | /* Convert a floating point number to an integer according to the | 
| 2259 |  |    rounding mode.  If the rounded integer value is out of range this | 
| 2260 |  |    returns an invalid operation exception and the contents of the | 
| 2261 |  |    destination parts are unspecified.  If the rounded value is in | 
| 2262 |  |    range but the floating point number is not the exact integer, the C | 
| 2263 |  |    standard doesn't require an inexact exception to be raised.  IEEE | 
| 2264 |  |    854 does require it so we do that. | 
| 2265 |  |  | 
| 2266 |  |    Note that for conversions to integer type the C standard requires | 
| 2267 |  |    round-to-zero to always be used.  */ | 
| 2268 |  | IEEEFloat::opStatus IEEEFloat::convertToSignExtendedInteger( | 
| 2269 |  |     MutableArrayRef<integerPart> parts, unsigned int width, bool isSigned, | 
| 2270 | 0 |     roundingMode rounding_mode, bool *isExact) const { | 
| 2271 | 0 |   lostFraction lost_fraction; | 
| 2272 | 0 |   const integerPart *src; | 
| 2273 | 0 |   unsigned int dstPartsCount, truncatedBits; | 
| 2274 | 0 | 
 | 
| 2275 | 0 |   *isExact = false; | 
| 2276 | 0 | 
 | 
| 2277 | 0 |   /* Handle the three special cases first.  */ | 
| 2278 | 0 |   if (category == fcInfinity || category == fcNaN) | 
| 2279 | 0 |     return opInvalidOp; | 
| 2280 | 0 |  | 
| 2281 | 0 |   dstPartsCount = partCountForBits(width); | 
| 2282 | 0 |   assert(dstPartsCount <= parts.size() && "Integer too big"); | 
| 2283 | 0 | 
 | 
| 2284 | 0 |   if (category == fcZero) { | 
| 2285 | 0 |     APInt::tcSet(parts.data(), 0, dstPartsCount); | 
| 2286 | 0 |     // Negative zero can't be represented as an int. | 
| 2287 | 0 |     *isExact = !sign; | 
| 2288 | 0 |     return opOK; | 
| 2289 | 0 |   } | 
| 2290 | 0 |  | 
| 2291 | 0 |   src = significandParts(); | 
| 2292 | 0 | 
 | 
| 2293 | 0 |   /* Step 1: place our absolute value, with any fraction truncated, in | 
| 2294 | 0 |      the destination.  */ | 
| 2295 | 0 |   if (exponent < 0) { | 
| 2296 | 0 |     /* Our absolute value is less than one; truncate everything.  */ | 
| 2297 | 0 |     APInt::tcSet(parts.data(), 0, dstPartsCount); | 
| 2298 | 0 |     /* For exponent -1 the integer bit represents .5, look at that. | 
| 2299 | 0 |        For smaller exponents leftmost truncated bit is 0. */ | 
| 2300 | 0 |     truncatedBits = semantics->precision -1U - exponent; | 
| 2301 | 0 |   } else { | 
| 2302 | 0 |     /* We want the most significant (exponent + 1) bits; the rest are | 
| 2303 | 0 |        truncated.  */ | 
| 2304 | 0 |     unsigned int bits = exponent + 1U; | 
| 2305 | 0 | 
 | 
| 2306 | 0 |     /* Hopelessly large in magnitude?  */ | 
| 2307 | 0 |     if (bits > width) | 
| 2308 | 0 |       return opInvalidOp; | 
| 2309 | 0 |  | 
| 2310 | 0 |     if (bits < semantics->precision) { | 
| 2311 | 0 |       /* We truncate (semantics->precision - bits) bits.  */ | 
| 2312 | 0 |       truncatedBits = semantics->precision - bits; | 
| 2313 | 0 |       APInt::tcExtract(parts.data(), dstPartsCount, src, bits, truncatedBits); | 
| 2314 | 0 |     } else { | 
| 2315 | 0 |       /* We want at least as many bits as are available.  */ | 
| 2316 | 0 |       APInt::tcExtract(parts.data(), dstPartsCount, src, semantics->precision, | 
| 2317 | 0 |                        0); | 
| 2318 | 0 |       APInt::tcShiftLeft(parts.data(), dstPartsCount, | 
| 2319 | 0 |                          bits - semantics->precision); | 
| 2320 | 0 |       truncatedBits = 0; | 
| 2321 | 0 |     } | 
| 2322 | 0 |   } | 
| 2323 | 0 | 
 | 
| 2324 | 0 |   /* Step 2: work out any lost fraction, and increment the absolute | 
| 2325 | 0 |      value if we would round away from zero.  */ | 
| 2326 | 0 |   if (truncatedBits) { | 
| 2327 | 0 |     lost_fraction = lostFractionThroughTruncation(src, partCount(), | 
| 2328 | 0 |                                                   truncatedBits); | 
| 2329 | 0 |     if (lost_fraction != lfExactlyZero && | 
| 2330 | 0 |         roundAwayFromZero(rounding_mode, lost_fraction, truncatedBits)) { | 
| 2331 | 0 |       if (APInt::tcIncrement(parts.data(), dstPartsCount)) | 
| 2332 | 0 |         return opInvalidOp;     /* Overflow.  */ | 
| 2333 | 0 |     } | 
| 2334 | 0 |   } else { | 
| 2335 | 0 |     lost_fraction = lfExactlyZero; | 
| 2336 | 0 |   } | 
| 2337 | 0 | 
 | 
| 2338 | 0 |   /* Step 3: check if we fit in the destination.  */ | 
| 2339 | 0 |   unsigned int omsb = APInt::tcMSB(parts.data(), dstPartsCount) + 1; | 
| 2340 | 0 | 
 | 
| 2341 | 0 |   if (sign) { | 
| 2342 | 0 |     if (!isSigned) { | 
| 2343 | 0 |       /* Negative numbers cannot be represented as unsigned.  */ | 
| 2344 | 0 |       if (omsb != 0) | 
| 2345 | 0 |         return opInvalidOp; | 
| 2346 | 0 |     } else { | 
| 2347 | 0 |       /* It takes omsb bits to represent the unsigned integer value. | 
| 2348 | 0 |          We lose a bit for the sign, but care is needed as the | 
| 2349 | 0 |          maximally negative integer is a special case.  */ | 
| 2350 | 0 |       if (omsb == width && | 
| 2351 | 0 |           APInt::tcLSB(parts.data(), dstPartsCount) + 1 != omsb) | 
| 2352 | 0 |         return opInvalidOp; | 
| 2353 | 0 |  | 
| 2354 | 0 |       /* This case can happen because of rounding.  */ | 
| 2355 | 0 |       if (omsb > width) | 
| 2356 | 0 |         return opInvalidOp; | 
| 2357 | 0 |     } | 
| 2358 | 0 |  | 
| 2359 | 0 |     APInt::tcNegate (parts.data(), dstPartsCount); | 
| 2360 | 0 |   } else { | 
| 2361 | 0 |     if (omsb >= width + !isSigned) | 
| 2362 | 0 |       return opInvalidOp; | 
| 2363 | 0 |   } | 
| 2364 | 0 |  | 
| 2365 | 0 |   if (lost_fraction == lfExactlyZero) { | 
| 2366 | 0 |     *isExact = true; | 
| 2367 | 0 |     return opOK; | 
| 2368 | 0 |   } else | 
| 2369 | 0 |     return opInexact; | 
| 2370 | 0 | } | 
| 2371 |  |  | 
| 2372 |  | /* Same as convertToSignExtendedInteger, except we provide | 
| 2373 |  |    deterministic values in case of an invalid operation exception, | 
| 2374 |  |    namely zero for NaNs and the minimal or maximal value respectively | 
| 2375 |  |    for underflow or overflow. | 
| 2376 |  |    The *isExact output tells whether the result is exact, in the sense | 
| 2377 |  |    that converting it back to the original floating point type produces | 
| 2378 |  |    the original value.  This is almost equivalent to result==opOK, | 
| 2379 |  |    except for negative zeroes. | 
| 2380 |  | */ | 
| 2381 |  | IEEEFloat::opStatus | 
| 2382 |  | IEEEFloat::convertToInteger(MutableArrayRef<integerPart> parts, | 
| 2383 |  |                             unsigned int width, bool isSigned, | 
| 2384 | 0 |                             roundingMode rounding_mode, bool *isExact) const { | 
| 2385 | 0 |   opStatus fs; | 
| 2386 | 0 | 
 | 
| 2387 | 0 |   fs = convertToSignExtendedInteger(parts, width, isSigned, rounding_mode, | 
| 2388 | 0 |                                     isExact); | 
| 2389 | 0 | 
 | 
| 2390 | 0 |   if (fs == opInvalidOp) { | 
| 2391 | 0 |     unsigned int bits, dstPartsCount; | 
| 2392 | 0 | 
 | 
| 2393 | 0 |     dstPartsCount = partCountForBits(width); | 
| 2394 | 0 |     assert(dstPartsCount <= parts.size() && "Integer too big"); | 
| 2395 | 0 | 
 | 
| 2396 | 0 |     if (category == fcNaN) | 
| 2397 | 0 |       bits = 0; | 
| 2398 | 0 |     else if (sign) | 
| 2399 | 0 |       bits = isSigned; | 
| 2400 | 0 |     else | 
| 2401 | 0 |       bits = width - isSigned; | 
| 2402 | 0 | 
 | 
| 2403 | 0 |     APInt::tcSetLeastSignificantBits(parts.data(), dstPartsCount, bits); | 
| 2404 | 0 |     if (sign && isSigned) | 
| 2405 | 0 |       APInt::tcShiftLeft(parts.data(), dstPartsCount, width - 1); | 
| 2406 | 0 |   } | 
| 2407 | 0 | 
 | 
| 2408 | 0 |   return fs; | 
| 2409 | 0 | } | 
| 2410 |  |  | 
| 2411 |  | /* Convert an unsigned integer SRC to a floating point number, | 
| 2412 |  |    rounding according to ROUNDING_MODE.  The sign of the floating | 
| 2413 |  |    point number is not modified.  */ | 
| 2414 |  | IEEEFloat::opStatus IEEEFloat::convertFromUnsignedParts( | 
| 2415 | 0 |     const integerPart *src, unsigned int srcCount, roundingMode rounding_mode) { | 
| 2416 | 0 |   unsigned int omsb, precision, dstCount; | 
| 2417 | 0 |   integerPart *dst; | 
| 2418 | 0 |   lostFraction lost_fraction; | 
| 2419 | 0 | 
 | 
| 2420 | 0 |   category = fcNormal; | 
| 2421 | 0 |   omsb = APInt::tcMSB(src, srcCount) + 1; | 
| 2422 | 0 |   dst = significandParts(); | 
| 2423 | 0 |   dstCount = partCount(); | 
| 2424 | 0 |   precision = semantics->precision; | 
| 2425 | 0 | 
 | 
| 2426 | 0 |   /* We want the most significant PRECISION bits of SRC.  There may not | 
| 2427 | 0 |      be that many; extract what we can.  */ | 
| 2428 | 0 |   if (precision <= omsb) { | 
| 2429 | 0 |     exponent = omsb - 1; | 
| 2430 | 0 |     lost_fraction = lostFractionThroughTruncation(src, srcCount, | 
| 2431 | 0 |                                                   omsb - precision); | 
| 2432 | 0 |     APInt::tcExtract(dst, dstCount, src, precision, omsb - precision); | 
| 2433 | 0 |   } else { | 
| 2434 | 0 |     exponent = precision - 1; | 
| 2435 | 0 |     lost_fraction = lfExactlyZero; | 
| 2436 | 0 |     APInt::tcExtract(dst, dstCount, src, omsb, 0); | 
| 2437 | 0 |   } | 
| 2438 | 0 | 
 | 
| 2439 | 0 |   return normalize(rounding_mode, lost_fraction); | 
| 2440 | 0 | } | 
| 2441 |  |  | 
| 2442 |  | IEEEFloat::opStatus IEEEFloat::convertFromAPInt(const APInt &Val, bool isSigned, | 
| 2443 | 0 |                                                 roundingMode rounding_mode) { | 
| 2444 | 0 |   unsigned int partCount = Val.getNumWords(); | 
| 2445 | 0 |   APInt api = Val; | 
| 2446 | 0 | 
 | 
| 2447 | 0 |   sign = false; | 
| 2448 | 0 |   if (isSigned && api.isNegative()) { | 
| 2449 | 0 |     sign = true; | 
| 2450 | 0 |     api = -api; | 
| 2451 | 0 |   } | 
| 2452 | 0 | 
 | 
| 2453 | 0 |   return convertFromUnsignedParts(api.getRawData(), partCount, rounding_mode); | 
| 2454 | 0 | } | 
| 2455 |  |  | 
| 2456 |  | /* Convert a two's complement integer SRC to a floating point number, | 
| 2457 |  |    rounding according to ROUNDING_MODE.  ISSIGNED is true if the | 
| 2458 |  |    integer is signed, in which case it must be sign-extended.  */ | 
| 2459 |  | IEEEFloat::opStatus | 
| 2460 |  | IEEEFloat::convertFromSignExtendedInteger(const integerPart *src, | 
| 2461 |  |                                           unsigned int srcCount, bool isSigned, | 
| 2462 | 0 |                                           roundingMode rounding_mode) { | 
| 2463 | 0 |   opStatus status; | 
| 2464 | 0 | 
 | 
| 2465 | 0 |   if (isSigned && | 
| 2466 | 0 |       APInt::tcExtractBit(src, srcCount * integerPartWidth - 1)) { | 
| 2467 | 0 |     integerPart *copy; | 
| 2468 | 0 | 
 | 
| 2469 | 0 |     /* If we're signed and negative negate a copy.  */ | 
| 2470 | 0 |     sign = true; | 
| 2471 | 0 |     copy = new integerPart[srcCount]; | 
| 2472 | 0 |     APInt::tcAssign(copy, src, srcCount); | 
| 2473 | 0 |     APInt::tcNegate(copy, srcCount); | 
| 2474 | 0 |     status = convertFromUnsignedParts(copy, srcCount, rounding_mode); | 
| 2475 | 0 |     delete [] copy; | 
| 2476 | 0 |   } else { | 
| 2477 | 0 |     sign = false; | 
| 2478 | 0 |     status = convertFromUnsignedParts(src, srcCount, rounding_mode); | 
| 2479 | 0 |   } | 
| 2480 | 0 | 
 | 
| 2481 | 0 |   return status; | 
| 2482 | 0 | } | 
| 2483 |  |  | 
| 2484 |  | /* FIXME: should this just take a const APInt reference?  */ | 
| 2485 |  | IEEEFloat::opStatus | 
| 2486 |  | IEEEFloat::convertFromZeroExtendedInteger(const integerPart *parts, | 
| 2487 |  |                                           unsigned int width, bool isSigned, | 
| 2488 | 0 |                                           roundingMode rounding_mode) { | 
| 2489 | 0 |   unsigned int partCount = partCountForBits(width); | 
| 2490 | 0 |   APInt api = APInt(width, makeArrayRef(parts, partCount)); | 
| 2491 | 0 | 
 | 
| 2492 | 0 |   sign = false; | 
| 2493 | 0 |   if (isSigned && APInt::tcExtractBit(parts, width - 1)) { | 
| 2494 | 0 |     sign = true; | 
| 2495 | 0 |     api = -api; | 
| 2496 | 0 |   } | 
| 2497 | 0 | 
 | 
| 2498 | 0 |   return convertFromUnsignedParts(api.getRawData(), partCount, rounding_mode); | 
| 2499 | 0 | } | 
| 2500 |  |  | 
| 2501 |  | Expected<IEEEFloat::opStatus> | 
| 2502 |  | IEEEFloat::convertFromHexadecimalString(StringRef s, | 
| 2503 | 0 |                                         roundingMode rounding_mode) { | 
| 2504 | 0 |   lostFraction lost_fraction = lfExactlyZero; | 
| 2505 | 0 | 
 | 
| 2506 | 0 |   category = fcNormal; | 
| 2507 | 0 |   zeroSignificand(); | 
| 2508 | 0 |   exponent = 0; | 
| 2509 | 0 | 
 | 
| 2510 | 0 |   integerPart *significand = significandParts(); | 
| 2511 | 0 |   unsigned partsCount = partCount(); | 
| 2512 | 0 |   unsigned bitPos = partsCount * integerPartWidth; | 
| 2513 | 0 |   bool computedTrailingFraction = false; | 
| 2514 | 0 | 
 | 
| 2515 | 0 |   // Skip leading zeroes and any (hexa)decimal point. | 
| 2516 | 0 |   StringRef::iterator begin = s.begin(); | 
| 2517 | 0 |   StringRef::iterator end = s.end(); | 
| 2518 | 0 |   StringRef::iterator dot; | 
| 2519 | 0 |   auto PtrOrErr = skipLeadingZeroesAndAnyDot(begin, end, &dot); | 
| 2520 | 0 |   if (!PtrOrErr) | 
| 2521 | 0 |     return PtrOrErr.takeError(); | 
| 2522 | 0 |   StringRef::iterator p = *PtrOrErr; | 
| 2523 | 0 |   StringRef::iterator firstSignificantDigit = p; | 
| 2524 | 0 | 
 | 
| 2525 | 0 |   while (p != end) { | 
| 2526 | 0 |     integerPart hex_value; | 
| 2527 | 0 | 
 | 
| 2528 | 0 |     if (*p == '.') { | 
| 2529 | 0 |       if (dot != end) | 
| 2530 | 0 |         return createError("String contains multiple dots"); | 
| 2531 | 0 |       dot = p++; | 
| 2532 | 0 |       continue; | 
| 2533 | 0 |     } | 
| 2534 | 0 |  | 
| 2535 | 0 |     hex_value = hexDigitValue(*p); | 
| 2536 | 0 |     if (hex_value == -1U) | 
| 2537 | 0 |       break; | 
| 2538 | 0 |  | 
| 2539 | 0 |     p++; | 
| 2540 | 0 | 
 | 
| 2541 | 0 |     // Store the number while we have space. | 
| 2542 | 0 |     if (bitPos) { | 
| 2543 | 0 |       bitPos -= 4; | 
| 2544 | 0 |       hex_value <<= bitPos % integerPartWidth; | 
| 2545 | 0 |       significand[bitPos / integerPartWidth] |= hex_value; | 
| 2546 | 0 |     } else if (!computedTrailingFraction) { | 
| 2547 | 0 |       auto FractOrErr = trailingHexadecimalFraction(p, end, hex_value); | 
| 2548 | 0 |       if (!FractOrErr) | 
| 2549 | 0 |         return FractOrErr.takeError(); | 
| 2550 | 0 |       lost_fraction = *FractOrErr; | 
| 2551 | 0 |       computedTrailingFraction = true; | 
| 2552 | 0 |     } | 
| 2553 | 0 |   } | 
| 2554 | 0 | 
 | 
| 2555 | 0 |   /* Hex floats require an exponent but not a hexadecimal point.  */ | 
| 2556 | 0 |   if (p == end) | 
| 2557 | 0 |     return createError("Hex strings require an exponent"); | 
| 2558 | 0 |   if (*p != 'p' && *p != 'P') | 
| 2559 | 0 |     return createError("Invalid character in significand"); | 
| 2560 | 0 |   if (p == begin) | 
| 2561 | 0 |     return createError("Significand has no digits"); | 
| 2562 | 0 |   if (dot != end && p - begin == 1) | 
| 2563 | 0 |     return createError("Significand has no digits"); | 
| 2564 | 0 |  | 
| 2565 | 0 |   /* Ignore the exponent if we are zero.  */ | 
| 2566 | 0 |   if (p != firstSignificantDigit) { | 
| 2567 | 0 |     int expAdjustment; | 
| 2568 | 0 | 
 | 
| 2569 | 0 |     /* Implicit hexadecimal point?  */ | 
| 2570 | 0 |     if (dot == end) | 
| 2571 | 0 |       dot = p; | 
| 2572 | 0 | 
 | 
| 2573 | 0 |     /* Calculate the exponent adjustment implicit in the number of | 
| 2574 | 0 |        significant digits.  */ | 
| 2575 | 0 |     expAdjustment = static_cast<int>(dot - firstSignificantDigit); | 
| 2576 | 0 |     if (expAdjustment < 0) | 
| 2577 | 0 |       expAdjustment++; | 
| 2578 | 0 |     expAdjustment = expAdjustment * 4 - 1; | 
| 2579 | 0 | 
 | 
| 2580 | 0 |     /* Adjust for writing the significand starting at the most | 
| 2581 | 0 |        significant nibble.  */ | 
| 2582 | 0 |     expAdjustment += semantics->precision; | 
| 2583 | 0 |     expAdjustment -= partsCount * integerPartWidth; | 
| 2584 | 0 | 
 | 
| 2585 | 0 |     /* Adjust for the given exponent.  */ | 
| 2586 | 0 |     auto ExpOrErr = totalExponent(p + 1, end, expAdjustment); | 
| 2587 | 0 |     if (!ExpOrErr) | 
| 2588 | 0 |       return ExpOrErr.takeError(); | 
| 2589 | 0 |     exponent = *ExpOrErr; | 
| 2590 | 0 |   } | 
| 2591 | 0 | 
 | 
| 2592 | 0 |   return normalize(rounding_mode, lost_fraction); | 
| 2593 | 0 | } | 
| 2594 |  |  | 
| 2595 |  | IEEEFloat::opStatus | 
| 2596 |  | IEEEFloat::roundSignificandWithExponent(const integerPart *decSigParts, | 
| 2597 |  |                                         unsigned sigPartCount, int exp, | 
| 2598 | 0 |                                         roundingMode rounding_mode) { | 
| 2599 | 0 |   unsigned int parts, pow5PartCount; | 
| 2600 | 0 |   fltSemantics calcSemantics = { 32767, -32767, 0, 0 }; | 
| 2601 | 0 |   integerPart pow5Parts[maxPowerOfFiveParts]; | 
| 2602 | 0 |   bool isNearest; | 
| 2603 | 0 | 
 | 
| 2604 | 0 |   isNearest = (rounding_mode == rmNearestTiesToEven || | 
| 2605 | 0 |                rounding_mode == rmNearestTiesToAway); | 
| 2606 | 0 | 
 | 
| 2607 | 0 |   parts = partCountForBits(semantics->precision + 11); | 
| 2608 | 0 | 
 | 
| 2609 | 0 |   /* Calculate pow(5, abs(exp)).  */ | 
| 2610 | 0 |   pow5PartCount = powerOf5(pow5Parts, exp >= 0 ? exp: -exp); | 
| 2611 | 0 | 
 | 
| 2612 | 0 |   for (;; parts *= 2) { | 
| 2613 | 0 |     opStatus sigStatus, powStatus; | 
| 2614 | 0 |     unsigned int excessPrecision, truncatedBits; | 
| 2615 | 0 | 
 | 
| 2616 | 0 |     calcSemantics.precision = parts * integerPartWidth - 1; | 
| 2617 | 0 |     excessPrecision = calcSemantics.precision - semantics->precision; | 
| 2618 | 0 |     truncatedBits = excessPrecision; | 
| 2619 | 0 | 
 | 
| 2620 | 0 |     IEEEFloat decSig(calcSemantics, uninitialized); | 
| 2621 | 0 |     decSig.makeZero(sign); | 
| 2622 | 0 |     IEEEFloat pow5(calcSemantics); | 
| 2623 | 0 | 
 | 
| 2624 | 0 |     sigStatus = decSig.convertFromUnsignedParts(decSigParts, sigPartCount, | 
| 2625 | 0 |                                                 rmNearestTiesToEven); | 
| 2626 | 0 |     powStatus = pow5.convertFromUnsignedParts(pow5Parts, pow5PartCount, | 
| 2627 | 0 |                                               rmNearestTiesToEven); | 
| 2628 | 0 |     /* Add exp, as 10^n = 5^n * 2^n.  */ | 
| 2629 | 0 |     decSig.exponent += exp; | 
| 2630 | 0 | 
 | 
| 2631 | 0 |     lostFraction calcLostFraction; | 
| 2632 | 0 |     integerPart HUerr, HUdistance; | 
| 2633 | 0 |     unsigned int powHUerr; | 
| 2634 | 0 | 
 | 
| 2635 | 0 |     if (exp >= 0) { | 
| 2636 | 0 |       /* multiplySignificand leaves the precision-th bit set to 1.  */ | 
| 2637 | 0 |       calcLostFraction = decSig.multiplySignificand(pow5); | 
| 2638 | 0 |       powHUerr = powStatus != opOK; | 
| 2639 | 0 |     } else { | 
| 2640 | 0 |       calcLostFraction = decSig.divideSignificand(pow5); | 
| 2641 | 0 |       /* Denormal numbers have less precision.  */ | 
| 2642 | 0 |       if (decSig.exponent < semantics->minExponent) { | 
| 2643 | 0 |         excessPrecision += (semantics->minExponent - decSig.exponent); | 
| 2644 | 0 |         truncatedBits = excessPrecision; | 
| 2645 | 0 |         if (excessPrecision > calcSemantics.precision) | 
| 2646 | 0 |           excessPrecision = calcSemantics.precision; | 
| 2647 | 0 |       } | 
| 2648 | 0 |       /* Extra half-ulp lost in reciprocal of exponent.  */ | 
| 2649 | 0 |       powHUerr = (powStatus == opOK && calcLostFraction == lfExactlyZero) ? 0:2; | 
| 2650 | 0 |     } | 
| 2651 | 0 | 
 | 
| 2652 | 0 |     /* Both multiplySignificand and divideSignificand return the | 
| 2653 | 0 |        result with the integer bit set.  */ | 
| 2654 | 0 |     assert(APInt::tcExtractBit | 
| 2655 | 0 |            (decSig.significandParts(), calcSemantics.precision - 1) == 1); | 
| 2656 | 0 | 
 | 
| 2657 | 0 |     HUerr = HUerrBound(calcLostFraction != lfExactlyZero, sigStatus != opOK, | 
| 2658 | 0 |                        powHUerr); | 
| 2659 | 0 |     HUdistance = 2 * ulpsFromBoundary(decSig.significandParts(), | 
| 2660 | 0 |                                       excessPrecision, isNearest); | 
| 2661 | 0 | 
 | 
| 2662 | 0 |     /* Are we guaranteed to round correctly if we truncate?  */ | 
| 2663 | 0 |     if (HUdistance >= HUerr) { | 
| 2664 | 0 |       APInt::tcExtract(significandParts(), partCount(), decSig.significandParts(), | 
| 2665 | 0 |                        calcSemantics.precision - excessPrecision, | 
| 2666 | 0 |                        excessPrecision); | 
| 2667 | 0 |       /* Take the exponent of decSig.  If we tcExtract-ed less bits | 
| 2668 | 0 |          above we must adjust our exponent to compensate for the | 
| 2669 | 0 |          implicit right shift.  */ | 
| 2670 | 0 |       exponent = (decSig.exponent + semantics->precision | 
| 2671 | 0 |                   - (calcSemantics.precision - excessPrecision)); | 
| 2672 | 0 |       calcLostFraction = lostFractionThroughTruncation(decSig.significandParts(), | 
| 2673 | 0 |                                                        decSig.partCount(), | 
| 2674 | 0 |                                                        truncatedBits); | 
| 2675 | 0 |       return normalize(rounding_mode, calcLostFraction); | 
| 2676 | 0 |     } | 
| 2677 | 0 |   } | 
| 2678 | 0 | } | 
| 2679 |  |  | 
| 2680 |  | Expected<IEEEFloat::opStatus> | 
| 2681 | 0 | IEEEFloat::convertFromDecimalString(StringRef str, roundingMode rounding_mode) { | 
| 2682 | 0 |   decimalInfo D; | 
| 2683 | 0 |   opStatus fs; | 
| 2684 | 0 | 
 | 
| 2685 | 0 |   /* Scan the text.  */ | 
| 2686 | 0 |   StringRef::iterator p = str.begin(); | 
| 2687 | 0 |   if (Error Err = interpretDecimal(p, str.end(), &D)) | 
| 2688 | 0 |     return std::move(Err); | 
| 2689 | 0 |  | 
| 2690 | 0 |   /* Handle the quick cases.  First the case of no significant digits, | 
| 2691 | 0 |      i.e. zero, and then exponents that are obviously too large or too | 
| 2692 | 0 |      small.  Writing L for log 10 / log 2, a number d.ddddd*10^exp | 
| 2693 | 0 |      definitely overflows if | 
| 2694 | 0 |  | 
| 2695 | 0 |            (exp - 1) * L >= maxExponent | 
| 2696 | 0 |  | 
| 2697 | 0 |      and definitely underflows to zero where | 
| 2698 | 0 |  | 
| 2699 | 0 |            (exp + 1) * L <= minExponent - precision | 
| 2700 | 0 |  | 
| 2701 | 0 |      With integer arithmetic the tightest bounds for L are | 
| 2702 | 0 |  | 
| 2703 | 0 |            93/28 < L < 196/59            [ numerator <= 256 ] | 
| 2704 | 0 |            42039/12655 < L < 28738/8651  [ numerator <= 65536 ] | 
| 2705 | 0 |   */ | 
| 2706 | 0 |  | 
| 2707 | 0 |   // Test if we have a zero number allowing for strings with no null terminators | 
| 2708 | 0 |   // and zero decimals with non-zero exponents. | 
| 2709 | 0 |   // | 
| 2710 | 0 |   // We computed firstSigDigit by ignoring all zeros and dots. Thus if | 
| 2711 | 0 |   // D->firstSigDigit equals str.end(), every digit must be a zero and there can | 
| 2712 | 0 |   // be at most one dot. On the other hand, if we have a zero with a non-zero | 
| 2713 | 0 |   // exponent, then we know that D.firstSigDigit will be non-numeric. | 
| 2714 | 0 |   if (D.firstSigDigit == str.end() || decDigitValue(*D.firstSigDigit) >= 10U) { | 
| 2715 | 0 |     category = fcZero; | 
| 2716 | 0 |     fs = opOK; | 
| 2717 | 0 | 
 | 
| 2718 | 0 |   /* Check whether the normalized exponent is high enough to overflow | 
| 2719 | 0 |      max during the log-rebasing in the max-exponent check below. */ | 
| 2720 | 0 |   } else if (D.normalizedExponent - 1 > INT_MAX / 42039) { | 
| 2721 | 0 |     fs = handleOverflow(rounding_mode); | 
| 2722 | 0 | 
 | 
| 2723 | 0 |   /* If it wasn't, then it also wasn't high enough to overflow max | 
| 2724 | 0 |      during the log-rebasing in the min-exponent check.  Check that it | 
| 2725 | 0 |      won't overflow min in either check, then perform the min-exponent | 
| 2726 | 0 |      check. */ | 
| 2727 | 0 |   } else if (D.normalizedExponent - 1 < INT_MIN / 42039 || | 
| 2728 | 0 |              (D.normalizedExponent + 1) * 28738 <= | 
| 2729 | 0 |                8651 * (semantics->minExponent - (int) semantics->precision)) { | 
| 2730 | 0 |     /* Underflow to zero and round.  */ | 
| 2731 | 0 |     category = fcNormal; | 
| 2732 | 0 |     zeroSignificand(); | 
| 2733 | 0 |     fs = normalize(rounding_mode, lfLessThanHalf); | 
| 2734 | 0 | 
 | 
| 2735 | 0 |   /* We can finally safely perform the max-exponent check. */ | 
| 2736 | 0 |   } else if ((D.normalizedExponent - 1) * 42039 | 
| 2737 | 0 |              >= 12655 * semantics->maxExponent) { | 
| 2738 | 0 |     /* Overflow and round.  */ | 
| 2739 | 0 |     fs = handleOverflow(rounding_mode); | 
| 2740 | 0 |   } else { | 
| 2741 | 0 |     integerPart *decSignificand; | 
| 2742 | 0 |     unsigned int partCount; | 
| 2743 | 0 | 
 | 
| 2744 | 0 |     /* A tight upper bound on number of bits required to hold an | 
| 2745 | 0 |        N-digit decimal integer is N * 196 / 59.  Allocate enough space | 
| 2746 | 0 |        to hold the full significand, and an extra part required by | 
| 2747 | 0 |        tcMultiplyPart.  */ | 
| 2748 | 0 |     partCount = static_cast<unsigned int>(D.lastSigDigit - D.firstSigDigit) + 1; | 
| 2749 | 0 |     partCount = partCountForBits(1 + 196 * partCount / 59); | 
| 2750 | 0 |     decSignificand = new integerPart[partCount + 1]; | 
| 2751 | 0 |     partCount = 0; | 
| 2752 | 0 | 
 | 
| 2753 | 0 |     /* Convert to binary efficiently - we do almost all multiplication | 
| 2754 | 0 |        in an integerPart.  When this would overflow do we do a single | 
| 2755 | 0 |        bignum multiplication, and then revert again to multiplication | 
| 2756 | 0 |        in an integerPart.  */ | 
| 2757 | 0 |     do { | 
| 2758 | 0 |       integerPart decValue, val, multiplier; | 
| 2759 | 0 | 
 | 
| 2760 | 0 |       val = 0; | 
| 2761 | 0 |       multiplier = 1; | 
| 2762 | 0 | 
 | 
| 2763 | 0 |       do { | 
| 2764 | 0 |         if (*p == '.') { | 
| 2765 | 0 |           p++; | 
| 2766 | 0 |           if (p == str.end()) { | 
| 2767 | 0 |             break; | 
| 2768 | 0 |           } | 
| 2769 | 0 |         } | 
| 2770 | 0 |         decValue = decDigitValue(*p++); | 
| 2771 | 0 |         if (decValue >= 10U) { | 
| 2772 | 0 |           delete[] decSignificand; | 
| 2773 | 0 |           return createError("Invalid character in significand"); | 
| 2774 | 0 |         } | 
| 2775 | 0 |         multiplier *= 10; | 
| 2776 | 0 |         val = val * 10 + decValue; | 
| 2777 | 0 |         /* The maximum number that can be multiplied by ten with any | 
| 2778 | 0 |            digit added without overflowing an integerPart.  */ | 
| 2779 | 0 |       } while (p <= D.lastSigDigit && multiplier <= (~ (integerPart) 0 - 9) / 10); | 
| 2780 | 0 | 
 | 
| 2781 | 0 |       /* Multiply out the current part.  */ | 
| 2782 | 0 |       APInt::tcMultiplyPart(decSignificand, decSignificand, multiplier, val, | 
| 2783 | 0 |                             partCount, partCount + 1, false); | 
| 2784 | 0 | 
 | 
| 2785 | 0 |       /* If we used another part (likely but not guaranteed), increase | 
| 2786 | 0 |          the count.  */ | 
| 2787 | 0 |       if (decSignificand[partCount]) | 
| 2788 | 0 |         partCount++; | 
| 2789 | 0 |     } while (p <= D.lastSigDigit); | 
| 2790 | 0 | 
 | 
| 2791 | 0 |     category = fcNormal; | 
| 2792 | 0 |     fs = roundSignificandWithExponent(decSignificand, partCount, | 
| 2793 | 0 |                                       D.exponent, rounding_mode); | 
| 2794 | 0 | 
 | 
| 2795 | 0 |     delete [] decSignificand; | 
| 2796 | 0 |   } | 
| 2797 | 0 | 
 | 
| 2798 | 0 |   return fs; | 
| 2799 | 0 | } | 
| 2800 |  |  | 
| 2801 | 0 | bool IEEEFloat::convertFromStringSpecials(StringRef str) { | 
| 2802 | 0 |   const size_t MIN_NAME_SIZE = 3; | 
| 2803 | 0 | 
 | 
| 2804 | 0 |   if (str.size() < MIN_NAME_SIZE) | 
| 2805 | 0 |     return false; | 
| 2806 | 0 |  | 
| 2807 | 0 |   if (str.equals("inf") || str.equals("INFINITY") || str.equals("+Inf")) { | 
| 2808 | 0 |     makeInf(false); | 
| 2809 | 0 |     return true; | 
| 2810 | 0 |   } | 
| 2811 | 0 |  | 
| 2812 | 0 |   bool IsNegative = str.front() == '-'; | 
| 2813 | 0 |   if (IsNegative) { | 
| 2814 | 0 |     str = str.drop_front(); | 
| 2815 | 0 |     if (str.size() < MIN_NAME_SIZE) | 
| 2816 | 0 |       return false; | 
| 2817 | 0 |  | 
| 2818 | 0 |     if (str.equals("inf") || str.equals("INFINITY") || str.equals("Inf")) { | 
| 2819 | 0 |       makeInf(true); | 
| 2820 | 0 |       return true; | 
| 2821 | 0 |     } | 
| 2822 | 0 |   } | 
| 2823 | 0 |  | 
| 2824 | 0 |   // If we have a 's' (or 'S') prefix, then this is a Signaling NaN. | 
| 2825 | 0 |   bool IsSignaling = str.front() == 's' || str.front() == 'S'; | 
| 2826 | 0 |   if (IsSignaling) { | 
| 2827 | 0 |     str = str.drop_front(); | 
| 2828 | 0 |     if (str.size() < MIN_NAME_SIZE) | 
| 2829 | 0 |       return false; | 
| 2830 | 0 |   } | 
| 2831 | 0 |  | 
| 2832 | 0 |   if (str.startswith("nan") || str.startswith("NaN")) { | 
| 2833 | 0 |     str = str.drop_front(3); | 
| 2834 | 0 | 
 | 
| 2835 | 0 |     // A NaN without payload. | 
| 2836 | 0 |     if (str.empty()) { | 
| 2837 | 0 |       makeNaN(IsSignaling, IsNegative); | 
| 2838 | 0 |       return true; | 
| 2839 | 0 |     } | 
| 2840 | 0 |  | 
| 2841 | 0 |     // Allow the payload to be inside parentheses. | 
| 2842 | 0 |     if (str.front() == '(') { | 
| 2843 | 0 |       // Parentheses should be balanced (and not empty). | 
| 2844 | 0 |       if (str.size() <= 2 || str.back() != ')') | 
| 2845 | 0 |         return false; | 
| 2846 | 0 |  | 
| 2847 | 0 |       str = str.slice(1, str.size() - 1); | 
| 2848 | 0 |     } | 
| 2849 | 0 | 
 | 
| 2850 | 0 |     // Determine the payload number's radix. | 
| 2851 | 0 |     unsigned Radix = 10; | 
| 2852 | 0 |     if (str[0] == '0') { | 
| 2853 | 0 |       if (str.size() > 1 && tolower(str[1]) == 'x') { | 
| 2854 | 0 |         str = str.drop_front(2); | 
| 2855 | 0 |         Radix = 16; | 
| 2856 | 0 |       } else | 
| 2857 | 0 |         Radix = 8; | 
| 2858 | 0 |     } | 
| 2859 | 0 | 
 | 
| 2860 | 0 |     // Parse the payload and make the NaN. | 
| 2861 | 0 |     APInt Payload; | 
| 2862 | 0 |     if (!str.getAsInteger(Radix, Payload)) { | 
| 2863 | 0 |       makeNaN(IsSignaling, IsNegative, &Payload); | 
| 2864 | 0 |       return true; | 
| 2865 | 0 |     } | 
| 2866 | 0 |   } | 
| 2867 | 0 |  | 
| 2868 | 0 |   return false; | 
| 2869 | 0 | } | 
| 2870 |  |  | 
| 2871 |  | Expected<IEEEFloat::opStatus> | 
| 2872 | 0 | IEEEFloat::convertFromString(StringRef str, roundingMode rounding_mode) { | 
| 2873 | 0 |   if (str.empty()) | 
| 2874 | 0 |     return createError("Invalid string length"); | 
| 2875 | 0 |  | 
| 2876 | 0 |   // Handle special cases. | 
| 2877 | 0 |   if (convertFromStringSpecials(str)) | 
| 2878 | 0 |     return opOK; | 
| 2879 | 0 |  | 
| 2880 | 0 |   /* Handle a leading minus sign.  */ | 
| 2881 | 0 |   StringRef::iterator p = str.begin(); | 
| 2882 | 0 |   size_t slen = str.size(); | 
| 2883 | 0 |   sign = *p == '-' ? 1 : 0; | 
| 2884 | 0 |   if (*p == '-' || *p == '+') { | 
| 2885 | 0 |     p++; | 
| 2886 | 0 |     slen--; | 
| 2887 | 0 |     if (!slen) | 
| 2888 | 0 |       return createError("String has no digits"); | 
| 2889 | 0 |   } | 
| 2890 | 0 |  | 
| 2891 | 0 |   if (slen >= 2 && p[0] == '0' && (p[1] == 'x' || p[1] == 'X')) { | 
| 2892 | 0 |     if (slen == 2) | 
| 2893 | 0 |       return createError("Invalid string"); | 
| 2894 | 0 |     return convertFromHexadecimalString(StringRef(p + 2, slen - 2), | 
| 2895 | 0 |                                         rounding_mode); | 
| 2896 | 0 |   } | 
| 2897 | 0 |  | 
| 2898 | 0 |   return convertFromDecimalString(StringRef(p, slen), rounding_mode); | 
| 2899 | 0 | } | 
| 2900 |  |  | 
| 2901 |  | /* Write out a hexadecimal representation of the floating point value | 
| 2902 |  |    to DST, which must be of sufficient size, in the C99 form | 
| 2903 |  |    [-]0xh.hhhhp[+-]d.  Return the number of characters written, | 
| 2904 |  |    excluding the terminating NUL. | 
| 2905 |  |  | 
| 2906 |  |    If UPPERCASE, the output is in upper case, otherwise in lower case. | 
| 2907 |  |  | 
| 2908 |  |    HEXDIGITS digits appear altogether, rounding the value if | 
| 2909 |  |    necessary.  If HEXDIGITS is 0, the minimal precision to display the | 
| 2910 |  |    number precisely is used instead.  If nothing would appear after | 
| 2911 |  |    the decimal point it is suppressed. | 
| 2912 |  |  | 
| 2913 |  |    The decimal exponent is always printed and has at least one digit. | 
| 2914 |  |    Zero values display an exponent of zero.  Infinities and NaNs | 
| 2915 |  |    appear as "infinity" or "nan" respectively. | 
| 2916 |  |  | 
| 2917 |  |    The above rules are as specified by C99.  There is ambiguity about | 
| 2918 |  |    what the leading hexadecimal digit should be.  This implementation | 
| 2919 |  |    uses whatever is necessary so that the exponent is displayed as | 
| 2920 |  |    stored.  This implies the exponent will fall within the IEEE format | 
| 2921 |  |    range, and the leading hexadecimal digit will be 0 (for denormals), | 
| 2922 |  |    1 (normal numbers) or 2 (normal numbers rounded-away-from-zero with | 
| 2923 |  |    any other digits zero). | 
| 2924 |  | */ | 
| 2925 |  | unsigned int IEEEFloat::convertToHexString(char *dst, unsigned int hexDigits, | 
| 2926 |  |                                            bool upperCase, | 
| 2927 | 0 |                                            roundingMode rounding_mode) const { | 
| 2928 | 0 |   char *p; | 
| 2929 | 0 | 
 | 
| 2930 | 0 |   p = dst; | 
| 2931 | 0 |   if (sign) | 
| 2932 | 0 |     *dst++ = '-'; | 
| 2933 | 0 | 
 | 
| 2934 | 0 |   switch (category) { | 
| 2935 | 0 |   case fcInfinity: | 
| 2936 | 0 |     memcpy (dst, upperCase ? infinityU: infinityL, sizeof infinityU - 1); | 
| 2937 | 0 |     dst += sizeof infinityL - 1; | 
| 2938 | 0 |     break; | 
| 2939 | 0 | 
 | 
| 2940 | 0 |   case fcNaN: | 
| 2941 | 0 |     memcpy (dst, upperCase ? NaNU: NaNL, sizeof NaNU - 1); | 
| 2942 | 0 |     dst += sizeof NaNU - 1; | 
| 2943 | 0 |     break; | 
| 2944 | 0 | 
 | 
| 2945 | 0 |   case fcZero: | 
| 2946 | 0 |     *dst++ = '0'; | 
| 2947 | 0 |     *dst++ = upperCase ? 'X': 'x'; | 
| 2948 | 0 |     *dst++ = '0'; | 
| 2949 | 0 |     if (hexDigits > 1) { | 
| 2950 | 0 |       *dst++ = '.'; | 
| 2951 | 0 |       memset (dst, '0', hexDigits - 1); | 
| 2952 | 0 |       dst += hexDigits - 1; | 
| 2953 | 0 |     } | 
| 2954 | 0 |     *dst++ = upperCase ? 'P': 'p'; | 
| 2955 | 0 |     *dst++ = '0'; | 
| 2956 | 0 |     break; | 
| 2957 | 0 | 
 | 
| 2958 | 0 |   case fcNormal: | 
| 2959 | 0 |     dst = convertNormalToHexString (dst, hexDigits, upperCase, rounding_mode); | 
| 2960 | 0 |     break; | 
| 2961 | 0 |   } | 
| 2962 | 0 |  | 
| 2963 | 0 |   *dst = 0; | 
| 2964 | 0 | 
 | 
| 2965 | 0 |   return static_cast<unsigned int>(dst - p); | 
| 2966 | 0 | } | 
| 2967 |  |  | 
| 2968 |  | /* Does the hard work of outputting the correctly rounded hexadecimal | 
| 2969 |  |    form of a normal floating point number with the specified number of | 
| 2970 |  |    hexadecimal digits.  If HEXDIGITS is zero the minimum number of | 
| 2971 |  |    digits necessary to print the value precisely is output.  */ | 
| 2972 |  | char *IEEEFloat::convertNormalToHexString(char *dst, unsigned int hexDigits, | 
| 2973 |  |                                           bool upperCase, | 
| 2974 | 0 |                                           roundingMode rounding_mode) const { | 
| 2975 | 0 |   unsigned int count, valueBits, shift, partsCount, outputDigits; | 
| 2976 | 0 |   const char *hexDigitChars; | 
| 2977 | 0 |   const integerPart *significand; | 
| 2978 | 0 |   char *p; | 
| 2979 | 0 |   bool roundUp; | 
| 2980 | 0 | 
 | 
| 2981 | 0 |   *dst++ = '0'; | 
| 2982 | 0 |   *dst++ = upperCase ? 'X': 'x'; | 
| 2983 | 0 | 
 | 
| 2984 | 0 |   roundUp = false; | 
| 2985 | 0 |   hexDigitChars = upperCase ? hexDigitsUpper: hexDigitsLower; | 
| 2986 | 0 | 
 | 
| 2987 | 0 |   significand = significandParts(); | 
| 2988 | 0 |   partsCount = partCount(); | 
| 2989 | 0 | 
 | 
| 2990 | 0 |   /* +3 because the first digit only uses the single integer bit, so | 
| 2991 | 0 |      we have 3 virtual zero most-significant-bits.  */ | 
| 2992 | 0 |   valueBits = semantics->precision + 3; | 
| 2993 | 0 |   shift = integerPartWidth - valueBits % integerPartWidth; | 
| 2994 | 0 | 
 | 
| 2995 | 0 |   /* The natural number of digits required ignoring trailing | 
| 2996 | 0 |      insignificant zeroes.  */ | 
| 2997 | 0 |   outputDigits = (valueBits - significandLSB () + 3) / 4; | 
| 2998 | 0 | 
 | 
| 2999 | 0 |   /* hexDigits of zero means use the required number for the | 
| 3000 | 0 |      precision.  Otherwise, see if we are truncating.  If we are, | 
| 3001 | 0 |      find out if we need to round away from zero.  */ | 
| 3002 | 0 |   if (hexDigits) { | 
| 3003 | 0 |     if (hexDigits < outputDigits) { | 
| 3004 | 0 |       /* We are dropping non-zero bits, so need to check how to round. | 
| 3005 | 0 |          "bits" is the number of dropped bits.  */ | 
| 3006 | 0 |       unsigned int bits; | 
| 3007 | 0 |       lostFraction fraction; | 
| 3008 | 0 | 
 | 
| 3009 | 0 |       bits = valueBits - hexDigits * 4; | 
| 3010 | 0 |       fraction = lostFractionThroughTruncation (significand, partsCount, bits); | 
| 3011 | 0 |       roundUp = roundAwayFromZero(rounding_mode, fraction, bits); | 
| 3012 | 0 |     } | 
| 3013 | 0 |     outputDigits = hexDigits; | 
| 3014 | 0 |   } | 
| 3015 | 0 | 
 | 
| 3016 | 0 |   /* Write the digits consecutively, and start writing in the location | 
| 3017 | 0 |      of the hexadecimal point.  We move the most significant digit | 
| 3018 | 0 |      left and add the hexadecimal point later.  */ | 
| 3019 | 0 |   p = ++dst; | 
| 3020 | 0 | 
 | 
| 3021 | 0 |   count = (valueBits + integerPartWidth - 1) / integerPartWidth; | 
| 3022 | 0 | 
 | 
| 3023 | 0 |   while (outputDigits && count) { | 
| 3024 | 0 |     integerPart part; | 
| 3025 | 0 | 
 | 
| 3026 | 0 |     /* Put the most significant integerPartWidth bits in "part".  */ | 
| 3027 | 0 |     if (--count == partsCount) | 
| 3028 | 0 |       part = 0;  /* An imaginary higher zero part.  */ | 
| 3029 | 0 |     else | 
| 3030 | 0 |       part = significand[count] << shift; | 
| 3031 | 0 | 
 | 
| 3032 | 0 |     if (count && shift) | 
| 3033 | 0 |       part |= significand[count - 1] >> (integerPartWidth - shift); | 
| 3034 | 0 | 
 | 
| 3035 | 0 |     /* Convert as much of "part" to hexdigits as we can.  */ | 
| 3036 | 0 |     unsigned int curDigits = integerPartWidth / 4; | 
| 3037 | 0 | 
 | 
| 3038 | 0 |     if (curDigits > outputDigits) | 
| 3039 | 0 |       curDigits = outputDigits; | 
| 3040 | 0 |     dst += partAsHex (dst, part, curDigits, hexDigitChars); | 
| 3041 | 0 |     outputDigits -= curDigits; | 
| 3042 | 0 |   } | 
| 3043 | 0 | 
 | 
| 3044 | 0 |   if (roundUp) { | 
| 3045 | 0 |     char *q = dst; | 
| 3046 | 0 | 
 | 
| 3047 | 0 |     /* Note that hexDigitChars has a trailing '0'.  */ | 
| 3048 | 0 |     do { | 
| 3049 | 0 |       q--; | 
| 3050 | 0 |       *q = hexDigitChars[hexDigitValue (*q) + 1]; | 
| 3051 | 0 |     } while (*q == '0'); | 
| 3052 | 0 |     assert(q >= p); | 
| 3053 | 0 |   } else { | 
| 3054 | 0 |     /* Add trailing zeroes.  */ | 
| 3055 | 0 |     memset (dst, '0', outputDigits); | 
| 3056 | 0 |     dst += outputDigits; | 
| 3057 | 0 |   } | 
| 3058 | 0 | 
 | 
| 3059 | 0 |   /* Move the most significant digit to before the point, and if there | 
| 3060 | 0 |      is something after the decimal point add it.  This must come | 
| 3061 | 0 |      after rounding above.  */ | 
| 3062 | 0 |   p[-1] = p[0]; | 
| 3063 | 0 |   if (dst -1 == p) | 
| 3064 | 0 |     dst--; | 
| 3065 | 0 |   else | 
| 3066 | 0 |     p[0] = '.'; | 
| 3067 | 0 | 
 | 
| 3068 | 0 |   /* Finally output the exponent.  */ | 
| 3069 | 0 |   *dst++ = upperCase ? 'P': 'p'; | 
| 3070 | 0 | 
 | 
| 3071 | 0 |   return writeSignedDecimal (dst, exponent); | 
| 3072 | 0 | } | 
| 3073 |  |  | 
| 3074 | 0 | hash_code hash_value(const IEEEFloat &Arg) { | 
| 3075 | 0 |   if (!Arg.isFiniteNonZero()) | 
| 3076 | 0 |     return hash_combine((uint8_t)Arg.category, | 
| 3077 | 0 |                         // NaN has no sign, fix it at zero. | 
| 3078 | 0 |                         Arg.isNaN() ? (uint8_t)0 : (uint8_t)Arg.sign, | 
| 3079 | 0 |                         Arg.semantics->precision); | 
| 3080 | 0 | 
 | 
| 3081 | 0 |   // Normal floats need their exponent and significand hashed. | 
| 3082 | 0 |   return hash_combine((uint8_t)Arg.category, (uint8_t)Arg.sign, | 
| 3083 | 0 |                       Arg.semantics->precision, Arg.exponent, | 
| 3084 | 0 |                       hash_combine_range( | 
| 3085 | 0 |                         Arg.significandParts(), | 
| 3086 | 0 |                         Arg.significandParts() + Arg.partCount())); | 
| 3087 | 0 | } | 
| 3088 |  |  | 
| 3089 |  | // Conversion from APFloat to/from host float/double.  It may eventually be | 
| 3090 |  | // possible to eliminate these and have everybody deal with APFloats, but that | 
| 3091 |  | // will take a while.  This approach will not easily extend to long double. | 
| 3092 |  | // Current implementation requires integerPartWidth==64, which is correct at | 
| 3093 |  | // the moment but could be made more general. | 
| 3094 |  |  | 
| 3095 |  | // Denormals have exponent minExponent in APFloat, but minExponent-1 in | 
| 3096 |  | // the actual IEEE respresentations.  We compensate for that here. | 
| 3097 |  |  | 
| 3098 | 0 | APInt IEEEFloat::convertF80LongDoubleAPFloatToAPInt() const { | 
| 3099 | 0 |   assert(semantics == (const llvm::fltSemantics*)&semX87DoubleExtended); | 
| 3100 | 0 |   assert(partCount()==2); | 
| 3101 | 0 | 
 | 
| 3102 | 0 |   uint64_t myexponent, mysignificand; | 
| 3103 | 0 | 
 | 
| 3104 | 0 |   if (isFiniteNonZero()) { | 
| 3105 | 0 |     myexponent = exponent+16383; //bias | 
| 3106 | 0 |     mysignificand = significandParts()[0]; | 
| 3107 | 0 |     if (myexponent==1 && !(mysignificand & 0x8000000000000000ULL)) | 
| 3108 | 0 |       myexponent = 0;   // denormal | 
| 3109 | 0 |   } else if (category==fcZero) { | 
| 3110 | 0 |     myexponent = 0; | 
| 3111 | 0 |     mysignificand = 0; | 
| 3112 | 0 |   } else if (category==fcInfinity) { | 
| 3113 | 0 |     myexponent = 0x7fff; | 
| 3114 | 0 |     mysignificand = 0x8000000000000000ULL; | 
| 3115 | 0 |   } else { | 
| 3116 | 0 |     assert(category == fcNaN && "Unknown category"); | 
| 3117 | 0 |     myexponent = 0x7fff; | 
| 3118 | 0 |     mysignificand = significandParts()[0]; | 
| 3119 | 0 |   } | 
| 3120 | 0 | 
 | 
| 3121 | 0 |   uint64_t words[2]; | 
| 3122 | 0 |   words[0] = mysignificand; | 
| 3123 | 0 |   words[1] =  ((uint64_t)(sign & 1) << 15) | | 
| 3124 | 0 |               (myexponent & 0x7fffLL); | 
| 3125 | 0 |   return APInt(80, words); | 
| 3126 | 0 | } | 
| 3127 |  |  | 
| 3128 |  | APInt IEEEFloat::convertPPCDoubleDoubleAPFloatToAPInt() const { | 
| 3129 |  |   assert(semantics == (const llvm::fltSemantics *)&semPPCDoubleDoubleLegacy); | 
| 3130 |  |   assert(partCount()==2); | 
| 3131 |  |  | 
| 3132 |  |   uint64_t words[2]; | 
| 3133 |  |   opStatus fs; | 
| 3134 |  |   bool losesInfo; | 
| 3135 |  |  | 
| 3136 |  |   // Convert number to double.  To avoid spurious underflows, we re- | 
| 3137 |  |   // normalize against the "double" minExponent first, and only *then* | 
| 3138 |  |   // truncate the mantissa.  The result of that second conversion | 
| 3139 |  |   // may be inexact, but should never underflow. | 
| 3140 |  |   // Declare fltSemantics before APFloat that uses it (and | 
| 3141 |  |   // saves pointer to it) to ensure correct destruction order. | 
| 3142 |  |   fltSemantics extendedSemantics = *semantics; | 
| 3143 |  |   extendedSemantics.minExponent = semIEEEdouble.minExponent; | 
| 3144 |  |   IEEEFloat extended(*this); | 
| 3145 |  |   fs = extended.convert(extendedSemantics, rmNearestTiesToEven, &losesInfo); | 
| 3146 |  |   assert(fs == opOK && !losesInfo); | 
| 3147 |  |   (void)fs; | 
| 3148 |  |  | 
| 3149 |  |   IEEEFloat u(extended); | 
| 3150 |  |   fs = u.convert(semIEEEdouble, rmNearestTiesToEven, &losesInfo); | 
| 3151 |  |   assert(fs == opOK || fs == opInexact); | 
| 3152 |  |   (void)fs; | 
| 3153 |  |   words[0] = *u.convertDoubleAPFloatToAPInt().getRawData(); | 
| 3154 |  |  | 
| 3155 |  |   // If conversion was exact or resulted in a special case, we're done; | 
| 3156 |  |   // just set the second double to zero.  Otherwise, re-convert back to | 
| 3157 |  |   // the extended format and compute the difference.  This now should | 
| 3158 |  |   // convert exactly to double. | 
| 3159 |  |   if (u.isFiniteNonZero() && losesInfo) { | 
| 3160 |  |     fs = u.convert(extendedSemantics, rmNearestTiesToEven, &losesInfo); | 
| 3161 |  |     assert(fs == opOK && !losesInfo); | 
| 3162 |  |     (void)fs; | 
| 3163 |  |  | 
| 3164 |  |     IEEEFloat v(extended); | 
| 3165 |  |     v.subtract(u, rmNearestTiesToEven); | 
| 3166 |  |     fs = v.convert(semIEEEdouble, rmNearestTiesToEven, &losesInfo); | 
| 3167 |  |     assert(fs == opOK && !losesInfo); | 
| 3168 |  |     (void)fs; | 
| 3169 |  |     words[1] = *v.convertDoubleAPFloatToAPInt().getRawData(); | 
| 3170 |  |   } else { | 
| 3171 |  |     words[1] = 0; | 
| 3172 |  |   } | 
| 3173 |  |  | 
| 3174 |  |   return APInt(128, words); | 
| 3175 |  | } | 
| 3176 |  |  | 
| 3177 | 0 | APInt IEEEFloat::convertQuadrupleAPFloatToAPInt() const { | 
| 3178 | 0 |   assert(semantics == (const llvm::fltSemantics*)&semIEEEquad); | 
| 3179 | 0 |   assert(partCount()==2); | 
| 3180 | 0 | 
 | 
| 3181 | 0 |   uint64_t myexponent, mysignificand, mysignificand2; | 
| 3182 | 0 | 
 | 
| 3183 | 0 |   if (isFiniteNonZero()) { | 
| 3184 | 0 |     myexponent = exponent+16383; //bias | 
| 3185 | 0 |     mysignificand = significandParts()[0]; | 
| 3186 | 0 |     mysignificand2 = significandParts()[1]; | 
| 3187 | 0 |     if (myexponent==1 && !(mysignificand2 & 0x1000000000000LL)) | 
| 3188 | 0 |       myexponent = 0;   // denormal | 
| 3189 | 0 |   } else if (category==fcZero) { | 
| 3190 | 0 |     myexponent = 0; | 
| 3191 | 0 |     mysignificand = mysignificand2 = 0; | 
| 3192 | 0 |   } else if (category==fcInfinity) { | 
| 3193 | 0 |     myexponent = 0x7fff; | 
| 3194 | 0 |     mysignificand = mysignificand2 = 0; | 
| 3195 | 0 |   } else { | 
| 3196 | 0 |     assert(category == fcNaN && "Unknown category!"); | 
| 3197 | 0 |     myexponent = 0x7fff; | 
| 3198 | 0 |     mysignificand = significandParts()[0]; | 
| 3199 | 0 |     mysignificand2 = significandParts()[1]; | 
| 3200 | 0 |   } | 
| 3201 | 0 | 
 | 
| 3202 | 0 |   uint64_t words[2]; | 
| 3203 | 0 |   words[0] = mysignificand; | 
| 3204 | 0 |   words[1] = ((uint64_t)(sign & 1) << 63) | | 
| 3205 | 0 |              ((myexponent & 0x7fff) << 48) | | 
| 3206 | 0 |              (mysignificand2 & 0xffffffffffffLL); | 
| 3207 | 0 | 
 | 
| 3208 | 0 |   return APInt(128, words); | 
| 3209 | 0 | } | 
| 3210 |  |  | 
| 3211 | 0 | APInt IEEEFloat::convertDoubleAPFloatToAPInt() const { | 
| 3212 | 0 |   assert(semantics == (const llvm::fltSemantics*)&semIEEEdouble); | 
| 3213 | 0 |   assert(partCount()==1); | 
| 3214 | 0 | 
 | 
| 3215 | 0 |   uint64_t myexponent, mysignificand; | 
| 3216 | 0 | 
 | 
| 3217 | 0 |   if (isFiniteNonZero()) { | 
| 3218 | 0 |     myexponent = exponent+1023; //bias | 
| 3219 | 0 |     mysignificand = *significandParts(); | 
| 3220 | 0 |     if (myexponent==1 && !(mysignificand & 0x10000000000000LL)) | 
| 3221 | 0 |       myexponent = 0;   // denormal | 
| 3222 | 0 |   } else if (category==fcZero) { | 
| 3223 | 0 |     myexponent = 0; | 
| 3224 | 0 |     mysignificand = 0; | 
| 3225 | 0 |   } else if (category==fcInfinity) { | 
| 3226 | 0 |     myexponent = 0x7ff; | 
| 3227 | 0 |     mysignificand = 0; | 
| 3228 | 0 |   } else { | 
| 3229 | 0 |     assert(category == fcNaN && "Unknown category!"); | 
| 3230 | 0 |     myexponent = 0x7ff; | 
| 3231 | 0 |     mysignificand = *significandParts(); | 
| 3232 | 0 |   } | 
| 3233 | 0 | 
 | 
| 3234 | 0 |   return APInt(64, ((((uint64_t)(sign & 1) << 63) | | 
| 3235 | 0 |                      ((myexponent & 0x7ff) <<  52) | | 
| 3236 | 0 |                      (mysignificand & 0xfffffffffffffLL)))); | 
| 3237 | 0 | } | 
| 3238 |  |  | 
| 3239 | 0 | APInt IEEEFloat::convertFloatAPFloatToAPInt() const { | 
| 3240 | 0 |   assert(semantics == (const llvm::fltSemantics*)&semIEEEsingle); | 
| 3241 | 0 |   assert(partCount()==1); | 
| 3242 | 0 | 
 | 
| 3243 | 0 |   uint32_t myexponent, mysignificand; | 
| 3244 | 0 | 
 | 
| 3245 | 0 |   if (isFiniteNonZero()) { | 
| 3246 | 0 |     myexponent = exponent+127; //bias | 
| 3247 | 0 |     mysignificand = (uint32_t)*significandParts(); | 
| 3248 | 0 |     if (myexponent == 1 && !(mysignificand & 0x800000)) | 
| 3249 | 0 |       myexponent = 0;   // denormal | 
| 3250 | 0 |   } else if (category==fcZero) { | 
| 3251 | 0 |     myexponent = 0; | 
| 3252 | 0 |     mysignificand = 0; | 
| 3253 | 0 |   } else if (category==fcInfinity) { | 
| 3254 | 0 |     myexponent = 0xff; | 
| 3255 | 0 |     mysignificand = 0; | 
| 3256 | 0 |   } else { | 
| 3257 | 0 |     assert(category == fcNaN && "Unknown category!"); | 
| 3258 | 0 |     myexponent = 0xff; | 
| 3259 | 0 |     mysignificand = (uint32_t)*significandParts(); | 
| 3260 | 0 |   } | 
| 3261 | 0 | 
 | 
| 3262 | 0 |   return APInt(32, (((sign&1) << 31) | ((myexponent&0xff) << 23) | | 
| 3263 | 0 |                     (mysignificand & 0x7fffff))); | 
| 3264 | 0 | } | 
| 3265 |  |  | 
| 3266 | 0 | APInt IEEEFloat::convertBFloatAPFloatToAPInt() const { | 
| 3267 | 0 |   assert(semantics == (const llvm::fltSemantics *)&semBFloat); | 
| 3268 | 0 |   assert(partCount() == 1); | 
| 3269 | 0 | 
 | 
| 3270 | 0 |   uint32_t myexponent, mysignificand; | 
| 3271 | 0 | 
 | 
| 3272 | 0 |   if (isFiniteNonZero()) { | 
| 3273 | 0 |     myexponent = exponent + 127; // bias | 
| 3274 | 0 |     mysignificand = (uint32_t)*significandParts(); | 
| 3275 | 0 |     if (myexponent == 1 && !(mysignificand & 0x80)) | 
| 3276 | 0 |       myexponent = 0; // denormal | 
| 3277 | 0 |   } else if (category == fcZero) { | 
| 3278 | 0 |     myexponent = 0; | 
| 3279 | 0 |     mysignificand = 0; | 
| 3280 | 0 |   } else if (category == fcInfinity) { | 
| 3281 | 0 |     myexponent = 0x1f; | 
| 3282 | 0 |     mysignificand = 0; | 
| 3283 | 0 |   } else { | 
| 3284 | 0 |     assert(category == fcNaN && "Unknown category!"); | 
| 3285 | 0 |     myexponent = 0x1f; | 
| 3286 | 0 |     mysignificand = (uint32_t)*significandParts(); | 
| 3287 | 0 |   } | 
| 3288 | 0 | 
 | 
| 3289 | 0 |   return APInt(16, (((sign & 1) << 15) | ((myexponent & 0xff) << 7) | | 
| 3290 | 0 |                     (mysignificand & 0x7f))); | 
| 3291 | 0 | } | 
| 3292 |  |  | 
| 3293 | 0 | APInt IEEEFloat::convertHalfAPFloatToAPInt() const { | 
| 3294 | 0 |   assert(semantics == (const llvm::fltSemantics*)&semIEEEhalf); | 
| 3295 | 0 |   assert(partCount()==1); | 
| 3296 | 0 | 
 | 
| 3297 | 0 |   uint32_t myexponent, mysignificand; | 
| 3298 | 0 | 
 | 
| 3299 | 0 |   if (isFiniteNonZero()) { | 
| 3300 | 0 |     myexponent = exponent+15; //bias | 
| 3301 | 0 |     mysignificand = (uint32_t)*significandParts(); | 
| 3302 | 0 |     if (myexponent == 1 && !(mysignificand & 0x400)) | 
| 3303 | 0 |       myexponent = 0;   // denormal | 
| 3304 | 0 |   } else if (category==fcZero) { | 
| 3305 | 0 |     myexponent = 0; | 
| 3306 | 0 |     mysignificand = 0; | 
| 3307 | 0 |   } else if (category==fcInfinity) { | 
| 3308 | 0 |     myexponent = 0x1f; | 
| 3309 | 0 |     mysignificand = 0; | 
| 3310 | 0 |   } else { | 
| 3311 | 0 |     assert(category == fcNaN && "Unknown category!"); | 
| 3312 | 0 |     myexponent = 0x1f; | 
| 3313 | 0 |     mysignificand = (uint32_t)*significandParts(); | 
| 3314 | 0 |   } | 
| 3315 | 0 | 
 | 
| 3316 | 0 |   return APInt(16, (((sign&1) << 15) | ((myexponent&0x1f) << 10) | | 
| 3317 | 0 |                     (mysignificand & 0x3ff))); | 
| 3318 | 0 | } | 
| 3319 |  |  | 
| 3320 |  | // This function creates an APInt that is just a bit map of the floating | 
| 3321 |  | // point constant as it would appear in memory.  It is not a conversion, | 
| 3322 |  | // and treating the result as a normal integer is unlikely to be useful. | 
| 3323 |  |  | 
| 3324 | 0 | APInt IEEEFloat::bitcastToAPInt() const { | 
| 3325 | 0 |   if (semantics == (const llvm::fltSemantics*)&semIEEEhalf) | 
| 3326 | 0 |     return convertHalfAPFloatToAPInt(); | 
| 3327 | 0 |  | 
| 3328 | 0 |   if (semantics == (const llvm::fltSemantics *)&semBFloat) | 
| 3329 | 0 |     return convertBFloatAPFloatToAPInt(); | 
| 3330 | 0 |  | 
| 3331 | 0 |   if (semantics == (const llvm::fltSemantics*)&semIEEEsingle) | 
| 3332 | 0 |     return convertFloatAPFloatToAPInt(); | 
| 3333 | 0 |  | 
| 3334 | 0 |   if (semantics == (const llvm::fltSemantics*)&semIEEEdouble) | 
| 3335 | 0 |     return convertDoubleAPFloatToAPInt(); | 
| 3336 | 0 |  | 
| 3337 | 0 |   if (semantics == (const llvm::fltSemantics*)&semIEEEquad) | 
| 3338 | 0 |     return convertQuadrupleAPFloatToAPInt(); | 
| 3339 | 0 |  | 
| 3340 | 0 |   if (semantics == (const llvm::fltSemantics *)&semPPCDoubleDoubleLegacy) | 
| 3341 | 0 |     return convertPPCDoubleDoubleAPFloatToAPInt(); | 
| 3342 | 0 |  | 
| 3343 | 0 |   assert(semantics == (const llvm::fltSemantics*)&semX87DoubleExtended && | 
| 3344 | 0 |          "unknown format!"); | 
| 3345 | 0 |   return convertF80LongDoubleAPFloatToAPInt(); | 
| 3346 | 0 | } | 
| 3347 |  |  | 
| 3348 | 0 | float IEEEFloat::convertToFloat() const { | 
| 3349 | 0 |   assert(semantics == (const llvm::fltSemantics*)&semIEEEsingle && | 
| 3350 | 0 |          "Float semantics are not IEEEsingle"); | 
| 3351 | 0 |   APInt api = bitcastToAPInt(); | 
| 3352 | 0 |   return api.bitsToFloat(); | 
| 3353 | 0 | } | 
| 3354 |  |  | 
| 3355 | 0 | double IEEEFloat::convertToDouble() const { | 
| 3356 | 0 |   assert(semantics == (const llvm::fltSemantics*)&semIEEEdouble && | 
| 3357 | 0 |          "Float semantics are not IEEEdouble"); | 
| 3358 | 0 |   APInt api = bitcastToAPInt(); | 
| 3359 | 0 |   return api.bitsToDouble(); | 
| 3360 | 0 | } | 
| 3361 |  |  | 
| 3362 |  | /// Integer bit is explicit in this format.  Intel hardware (387 and later) | 
| 3363 |  | /// does not support these bit patterns: | 
| 3364 |  | ///  exponent = all 1's, integer bit 0, significand 0 ("pseudoinfinity") | 
| 3365 |  | ///  exponent = all 1's, integer bit 0, significand nonzero ("pseudoNaN") | 
| 3366 |  | ///  exponent!=0 nor all 1's, integer bit 0 ("unnormal") | 
| 3367 |  | ///  exponent = 0, integer bit 1 ("pseudodenormal") | 
| 3368 |  | /// At the moment, the first three are treated as NaNs, the last one as Normal. | 
| 3369 | 0 | void IEEEFloat::initFromF80LongDoubleAPInt(const APInt &api) { | 
| 3370 | 0 |   assert(api.getBitWidth()==80); | 
| 3371 | 0 |   uint64_t i1 = api.getRawData()[0]; | 
| 3372 | 0 |   uint64_t i2 = api.getRawData()[1]; | 
| 3373 | 0 |   uint64_t myexponent = (i2 & 0x7fff); | 
| 3374 | 0 |   uint64_t mysignificand = i1; | 
| 3375 | 0 |   uint8_t myintegerbit = mysignificand >> 63; | 
| 3376 | 0 | 
 | 
| 3377 | 0 |   initialize(&semX87DoubleExtended); | 
| 3378 | 0 |   assert(partCount()==2); | 
| 3379 | 0 | 
 | 
| 3380 | 0 |   sign = static_cast<unsigned int>(i2>>15); | 
| 3381 | 0 |   if (myexponent == 0 && mysignificand == 0) { | 
| 3382 | 0 |     // exponent, significand meaningless | 
| 3383 | 0 |     category = fcZero; | 
| 3384 | 0 |   } else if (myexponent==0x7fff && mysignificand==0x8000000000000000ULL) { | 
| 3385 | 0 |     // exponent, significand meaningless | 
| 3386 | 0 |     category = fcInfinity; | 
| 3387 | 0 |   } else if ((myexponent == 0x7fff && mysignificand != 0x8000000000000000ULL) || | 
| 3388 | 0 |              (myexponent != 0x7fff && myexponent != 0 && myintegerbit == 0)) { | 
| 3389 | 0 |     // exponent meaningless | 
| 3390 | 0 |     category = fcNaN; | 
| 3391 | 0 |     significandParts()[0] = mysignificand; | 
| 3392 | 0 |     significandParts()[1] = 0; | 
| 3393 | 0 |   } else { | 
| 3394 | 0 |     category = fcNormal; | 
| 3395 | 0 |     exponent = myexponent - 16383; | 
| 3396 | 0 |     significandParts()[0] = mysignificand; | 
| 3397 | 0 |     significandParts()[1] = 0; | 
| 3398 | 0 |     if (myexponent==0)          // denormal | 
| 3399 | 0 |       exponent = -16382; | 
| 3400 | 0 |   } | 
| 3401 | 0 | } | 
| 3402 |  |  | 
| 3403 |  | void IEEEFloat::initFromPPCDoubleDoubleAPInt(const APInt &api) { | 
| 3404 |  |   assert(api.getBitWidth()==128); | 
| 3405 |  |   uint64_t i1 = api.getRawData()[0]; | 
| 3406 |  |   uint64_t i2 = api.getRawData()[1]; | 
| 3407 |  |   opStatus fs; | 
| 3408 |  |   bool losesInfo; | 
| 3409 |  |  | 
| 3410 |  |   // Get the first double and convert to our format. | 
| 3411 |  |   initFromDoubleAPInt(APInt(64, i1)); | 
| 3412 |  |   fs = convert(semPPCDoubleDoubleLegacy, rmNearestTiesToEven, &losesInfo); | 
| 3413 |  |   assert(fs == opOK && !losesInfo); | 
| 3414 |  |   (void)fs; | 
| 3415 |  |  | 
| 3416 |  |   // Unless we have a special case, add in second double. | 
| 3417 |  |   if (isFiniteNonZero()) { | 
| 3418 |  |     IEEEFloat v(semIEEEdouble, APInt(64, i2)); | 
| 3419 |  |     fs = v.convert(semPPCDoubleDoubleLegacy, rmNearestTiesToEven, &losesInfo); | 
| 3420 |  |     assert(fs == opOK && !losesInfo); | 
| 3421 |  |     (void)fs; | 
| 3422 |  |  | 
| 3423 |  |     add(v, rmNearestTiesToEven); | 
| 3424 |  |   } | 
| 3425 |  | } | 
| 3426 |  |  | 
| 3427 | 0 | void IEEEFloat::initFromQuadrupleAPInt(const APInt &api) { | 
| 3428 | 0 |   assert(api.getBitWidth()==128); | 
| 3429 | 0 |   uint64_t i1 = api.getRawData()[0]; | 
| 3430 | 0 |   uint64_t i2 = api.getRawData()[1]; | 
| 3431 | 0 |   uint64_t myexponent = (i2 >> 48) & 0x7fff; | 
| 3432 | 0 |   uint64_t mysignificand  = i1; | 
| 3433 | 0 |   uint64_t mysignificand2 = i2 & 0xffffffffffffLL; | 
| 3434 | 0 | 
 | 
| 3435 | 0 |   initialize(&semIEEEquad); | 
| 3436 | 0 |   assert(partCount()==2); | 
| 3437 | 0 | 
 | 
| 3438 | 0 |   sign = static_cast<unsigned int>(i2>>63); | 
| 3439 | 0 |   if (myexponent==0 && | 
| 3440 | 0 |       (mysignificand==0 && mysignificand2==0)) { | 
| 3441 | 0 |     // exponent, significand meaningless | 
| 3442 | 0 |     category = fcZero; | 
| 3443 | 0 |   } else if (myexponent==0x7fff && | 
| 3444 | 0 |              (mysignificand==0 && mysignificand2==0)) { | 
| 3445 | 0 |     // exponent, significand meaningless | 
| 3446 | 0 |     category = fcInfinity; | 
| 3447 | 0 |   } else if (myexponent==0x7fff && | 
| 3448 | 0 |              (mysignificand!=0 || mysignificand2 !=0)) { | 
| 3449 | 0 |     // exponent meaningless | 
| 3450 | 0 |     category = fcNaN; | 
| 3451 | 0 |     significandParts()[0] = mysignificand; | 
| 3452 | 0 |     significandParts()[1] = mysignificand2; | 
| 3453 | 0 |   } else { | 
| 3454 | 0 |     category = fcNormal; | 
| 3455 | 0 |     exponent = myexponent - 16383; | 
| 3456 | 0 |     significandParts()[0] = mysignificand; | 
| 3457 | 0 |     significandParts()[1] = mysignificand2; | 
| 3458 | 0 |     if (myexponent==0)          // denormal | 
| 3459 | 0 |       exponent = -16382; | 
| 3460 | 0 |     else | 
| 3461 | 0 |       significandParts()[1] |= 0x1000000000000LL;  // integer bit | 
| 3462 | 0 |   } | 
| 3463 | 0 | } | 
| 3464 |  |  | 
| 3465 | 0 | void IEEEFloat::initFromDoubleAPInt(const APInt &api) { | 
| 3466 | 0 |   assert(api.getBitWidth()==64); | 
| 3467 | 0 |   uint64_t i = *api.getRawData(); | 
| 3468 | 0 |   uint64_t myexponent = (i >> 52) & 0x7ff; | 
| 3469 | 0 |   uint64_t mysignificand = i & 0xfffffffffffffLL; | 
| 3470 | 0 | 
 | 
| 3471 | 0 |   initialize(&semIEEEdouble); | 
| 3472 | 0 |   assert(partCount()==1); | 
| 3473 | 0 | 
 | 
| 3474 | 0 |   sign = static_cast<unsigned int>(i>>63); | 
| 3475 | 0 |   if (myexponent==0 && mysignificand==0) { | 
| 3476 | 0 |     // exponent, significand meaningless | 
| 3477 | 0 |     category = fcZero; | 
| 3478 | 0 |   } else if (myexponent==0x7ff && mysignificand==0) { | 
| 3479 | 0 |     // exponent, significand meaningless | 
| 3480 | 0 |     category = fcInfinity; | 
| 3481 | 0 |   } else if (myexponent==0x7ff && mysignificand!=0) { | 
| 3482 | 0 |     // exponent meaningless | 
| 3483 | 0 |     category = fcNaN; | 
| 3484 | 0 |     *significandParts() = mysignificand; | 
| 3485 | 0 |   } else { | 
| 3486 | 0 |     category = fcNormal; | 
| 3487 | 0 |     exponent = myexponent - 1023; | 
| 3488 | 0 |     *significandParts() = mysignificand; | 
| 3489 | 0 |     if (myexponent==0)          // denormal | 
| 3490 | 0 |       exponent = -1022; | 
| 3491 | 0 |     else | 
| 3492 | 0 |       *significandParts() |= 0x10000000000000LL;  // integer bit | 
| 3493 | 0 |   } | 
| 3494 | 0 | } | 
| 3495 |  |  | 
| 3496 | 0 | void IEEEFloat::initFromFloatAPInt(const APInt &api) { | 
| 3497 | 0 |   assert(api.getBitWidth()==32); | 
| 3498 | 0 |   uint32_t i = (uint32_t)*api.getRawData(); | 
| 3499 | 0 |   uint32_t myexponent = (i >> 23) & 0xff; | 
| 3500 | 0 |   uint32_t mysignificand = i & 0x7fffff; | 
| 3501 | 0 | 
 | 
| 3502 | 0 |   initialize(&semIEEEsingle); | 
| 3503 | 0 |   assert(partCount()==1); | 
| 3504 | 0 | 
 | 
| 3505 | 0 |   sign = i >> 31; | 
| 3506 | 0 |   if (myexponent==0 && mysignificand==0) { | 
| 3507 | 0 |     // exponent, significand meaningless | 
| 3508 | 0 |     category = fcZero; | 
| 3509 | 0 |   } else if (myexponent==0xff && mysignificand==0) { | 
| 3510 | 0 |     // exponent, significand meaningless | 
| 3511 | 0 |     category = fcInfinity; | 
| 3512 | 0 |   } else if (myexponent==0xff && mysignificand!=0) { | 
| 3513 | 0 |     // sign, exponent, significand meaningless | 
| 3514 | 0 |     category = fcNaN; | 
| 3515 | 0 |     *significandParts() = mysignificand; | 
| 3516 | 0 |   } else { | 
| 3517 | 0 |     category = fcNormal; | 
| 3518 | 0 |     exponent = myexponent - 127;  //bias | 
| 3519 | 0 |     *significandParts() = mysignificand; | 
| 3520 | 0 |     if (myexponent==0)    // denormal | 
| 3521 | 0 |       exponent = -126; | 
| 3522 | 0 |     else | 
| 3523 | 0 |       *significandParts() |= 0x800000; // integer bit | 
| 3524 | 0 |   } | 
| 3525 | 0 | } | 
| 3526 |  |  | 
| 3527 | 0 | void IEEEFloat::initFromBFloatAPInt(const APInt &api) { | 
| 3528 | 0 |   assert(api.getBitWidth() == 16); | 
| 3529 | 0 |   uint32_t i = (uint32_t)*api.getRawData(); | 
| 3530 | 0 |   uint32_t myexponent = (i >> 7) & 0xff; | 
| 3531 | 0 |   uint32_t mysignificand = i & 0x7f; | 
| 3532 | 0 | 
 | 
| 3533 | 0 |   initialize(&semBFloat); | 
| 3534 | 0 |   assert(partCount() == 1); | 
| 3535 | 0 | 
 | 
| 3536 | 0 |   sign = i >> 15; | 
| 3537 | 0 |   if (myexponent == 0 && mysignificand == 0) { | 
| 3538 | 0 |     // exponent, significand meaningless | 
| 3539 | 0 |     category = fcZero; | 
| 3540 | 0 |   } else if (myexponent == 0xff && mysignificand == 0) { | 
| 3541 | 0 |     // exponent, significand meaningless | 
| 3542 | 0 |     category = fcInfinity; | 
| 3543 | 0 |   } else if (myexponent == 0xff && mysignificand != 0) { | 
| 3544 | 0 |     // sign, exponent, significand meaningless | 
| 3545 | 0 |     category = fcNaN; | 
| 3546 | 0 |     *significandParts() = mysignificand; | 
| 3547 | 0 |   } else { | 
| 3548 | 0 |     category = fcNormal; | 
| 3549 | 0 |     exponent = myexponent - 127; // bias | 
| 3550 | 0 |     *significandParts() = mysignificand; | 
| 3551 | 0 |     if (myexponent == 0) // denormal | 
| 3552 | 0 |       exponent = -126; | 
| 3553 | 0 |     else | 
| 3554 | 0 |       *significandParts() |= 0x80; // integer bit | 
| 3555 | 0 |   } | 
| 3556 | 0 | } | 
| 3557 |  |  | 
| 3558 | 0 | void IEEEFloat::initFromHalfAPInt(const APInt &api) { | 
| 3559 | 0 |   assert(api.getBitWidth()==16); | 
| 3560 | 0 |   uint32_t i = (uint32_t)*api.getRawData(); | 
| 3561 | 0 |   uint32_t myexponent = (i >> 10) & 0x1f; | 
| 3562 | 0 |   uint32_t mysignificand = i & 0x3ff; | 
| 3563 | 0 | 
 | 
| 3564 | 0 |   initialize(&semIEEEhalf); | 
| 3565 | 0 |   assert(partCount()==1); | 
| 3566 | 0 | 
 | 
| 3567 | 0 |   sign = i >> 15; | 
| 3568 | 0 |   if (myexponent==0 && mysignificand==0) { | 
| 3569 | 0 |     // exponent, significand meaningless | 
| 3570 | 0 |     category = fcZero; | 
| 3571 | 0 |   } else if (myexponent==0x1f && mysignificand==0) { | 
| 3572 | 0 |     // exponent, significand meaningless | 
| 3573 | 0 |     category = fcInfinity; | 
| 3574 | 0 |   } else if (myexponent==0x1f && mysignificand!=0) { | 
| 3575 | 0 |     // sign, exponent, significand meaningless | 
| 3576 | 0 |     category = fcNaN; | 
| 3577 | 0 |     *significandParts() = mysignificand; | 
| 3578 | 0 |   } else { | 
| 3579 | 0 |     category = fcNormal; | 
| 3580 | 0 |     exponent = myexponent - 15;  //bias | 
| 3581 | 0 |     *significandParts() = mysignificand; | 
| 3582 | 0 |     if (myexponent==0)    // denormal | 
| 3583 | 0 |       exponent = -14; | 
| 3584 | 0 |     else | 
| 3585 | 0 |       *significandParts() |= 0x400; // integer bit | 
| 3586 | 0 |   } | 
| 3587 | 0 | } | 
| 3588 |  |  | 
| 3589 |  | /// Treat api as containing the bits of a floating point number.  Currently | 
| 3590 |  | /// we infer the floating point type from the size of the APInt.  The | 
| 3591 |  | /// isIEEE argument distinguishes between PPC128 and IEEE128 (not meaningful | 
| 3592 |  | /// when the size is anything else). | 
| 3593 | 0 | void IEEEFloat::initFromAPInt(const fltSemantics *Sem, const APInt &api) { | 
| 3594 | 0 |   if (Sem == &semIEEEhalf) | 
| 3595 | 0 |     return initFromHalfAPInt(api); | 
| 3596 | 0 |   if (Sem == &semBFloat) | 
| 3597 | 0 |     return initFromBFloatAPInt(api); | 
| 3598 | 0 |   if (Sem == &semIEEEsingle) | 
| 3599 | 0 |     return initFromFloatAPInt(api); | 
| 3600 | 0 |   if (Sem == &semIEEEdouble) | 
| 3601 | 0 |     return initFromDoubleAPInt(api); | 
| 3602 | 0 |   if (Sem == &semX87DoubleExtended) | 
| 3603 | 0 |     return initFromF80LongDoubleAPInt(api); | 
| 3604 | 0 |   if (Sem == &semIEEEquad) | 
| 3605 | 0 |     return initFromQuadrupleAPInt(api); | 
| 3606 | 0 |   if (Sem == &semPPCDoubleDoubleLegacy) | 
| 3607 | 0 |     return initFromPPCDoubleDoubleAPInt(api); | 
| 3608 | 0 |  | 
| 3609 | 0 |   llvm_unreachable(nullptr); | 
| 3610 | 0 | } | 
| 3611 |  |  | 
| 3612 |  | /// Make this number the largest magnitude normal number in the given | 
| 3613 |  | /// semantics. | 
| 3614 | 0 | void IEEEFloat::makeLargest(bool Negative) { | 
| 3615 | 0 |   // We want (in interchange format): | 
| 3616 | 0 |   //   sign = {Negative} | 
| 3617 | 0 |   //   exponent = 1..10 | 
| 3618 | 0 |   //   significand = 1..1 | 
| 3619 | 0 |   category = fcNormal; | 
| 3620 | 0 |   sign = Negative; | 
| 3621 | 0 |   exponent = semantics->maxExponent; | 
| 3622 | 0 | 
 | 
| 3623 | 0 |   // Use memset to set all but the highest integerPart to all ones. | 
| 3624 | 0 |   integerPart *significand = significandParts(); | 
| 3625 | 0 |   unsigned PartCount = partCount(); | 
| 3626 | 0 |   memset(significand, 0xFF, sizeof(integerPart)*(PartCount - 1)); | 
| 3627 | 0 | 
 | 
| 3628 | 0 |   // Set the high integerPart especially setting all unused top bits for | 
| 3629 | 0 |   // internal consistency. | 
| 3630 | 0 |   const unsigned NumUnusedHighBits = | 
| 3631 | 0 |     PartCount*integerPartWidth - semantics->precision; | 
| 3632 | 0 |   significand[PartCount - 1] = (NumUnusedHighBits < integerPartWidth) | 
| 3633 | 0 |                                    ? (~integerPart(0) >> NumUnusedHighBits) | 
| 3634 | 0 |                                    : 0; | 
| 3635 | 0 | } | 
| 3636 |  |  | 
| 3637 |  | /// Make this number the smallest magnitude denormal number in the given | 
| 3638 |  | /// semantics. | 
| 3639 | 0 | void IEEEFloat::makeSmallest(bool Negative) { | 
| 3640 | 0 |   // We want (in interchange format): | 
| 3641 | 0 |   //   sign = {Negative} | 
| 3642 | 0 |   //   exponent = 0..0 | 
| 3643 | 0 |   //   significand = 0..01 | 
| 3644 | 0 |   category = fcNormal; | 
| 3645 | 0 |   sign = Negative; | 
| 3646 | 0 |   exponent = semantics->minExponent; | 
| 3647 | 0 |   APInt::tcSet(significandParts(), 1, partCount()); | 
| 3648 | 0 | } | 
| 3649 |  |  | 
| 3650 | 0 | void IEEEFloat::makeSmallestNormalized(bool Negative) { | 
| 3651 | 0 |   // We want (in interchange format): | 
| 3652 | 0 |   //   sign = {Negative} | 
| 3653 | 0 |   //   exponent = 0..0 | 
| 3654 | 0 |   //   significand = 10..0 | 
| 3655 | 0 | 
 | 
| 3656 | 0 |   category = fcNormal; | 
| 3657 | 0 |   zeroSignificand(); | 
| 3658 | 0 |   sign = Negative; | 
| 3659 | 0 |   exponent = semantics->minExponent; | 
| 3660 | 0 |   significandParts()[partCountForBits(semantics->precision) - 1] |= | 
| 3661 | 0 |       (((integerPart)1) << ((semantics->precision - 1) % integerPartWidth)); | 
| 3662 | 0 | } | 
| 3663 |  |  | 
| 3664 | 0 | IEEEFloat::IEEEFloat(const fltSemantics &Sem, const APInt &API) { | 
| 3665 | 0 |   initFromAPInt(&Sem, API); | 
| 3666 | 0 | } | 
| 3667 |  |  | 
| 3668 | 0 | IEEEFloat::IEEEFloat(float f) { | 
| 3669 | 0 |   initFromAPInt(&semIEEEsingle, APInt::floatToBits(f)); | 
| 3670 | 0 | } | 
| 3671 |  |  | 
| 3672 | 0 | IEEEFloat::IEEEFloat(double d) { | 
| 3673 | 0 |   initFromAPInt(&semIEEEdouble, APInt::doubleToBits(d)); | 
| 3674 | 0 | } | 
| 3675 |  |  | 
| 3676 |  | namespace { | 
| 3677 | 0 |   void append(SmallVectorImpl<char> &Buffer, StringRef Str) { | 
| 3678 | 0 |     Buffer.append(Str.begin(), Str.end()); | 
| 3679 | 0 |   } | 
| 3680 |  |  | 
| 3681 |  |   /// Removes data from the given significand until it is no more | 
| 3682 |  |   /// precise than is required for the desired precision. | 
| 3683 |  |   void AdjustToPrecision(APInt &significand, | 
| 3684 | 0 |                          int &exp, unsigned FormatPrecision) { | 
| 3685 | 0 |     unsigned bits = significand.getActiveBits(); | 
| 3686 | 0 | 
 | 
| 3687 | 0 |     // 196/59 is a very slight overestimate of lg_2(10). | 
| 3688 | 0 |     unsigned bitsRequired = (FormatPrecision * 196 + 58) / 59; | 
| 3689 | 0 | 
 | 
| 3690 | 0 |     if (bits <= bitsRequired) return; | 
| 3691 | 0 |  | 
| 3692 | 0 |     unsigned tensRemovable = (bits - bitsRequired) * 59 / 196; | 
| 3693 | 0 |     if (!tensRemovable) return; | 
| 3694 | 0 |  | 
| 3695 | 0 |     exp += tensRemovable; | 
| 3696 | 0 | 
 | 
| 3697 | 0 |     APInt divisor(significand.getBitWidth(), 1); | 
| 3698 | 0 |     APInt powten(significand.getBitWidth(), 10); | 
| 3699 | 0 |     while (true) { | 
| 3700 | 0 |       if (tensRemovable & 1) | 
| 3701 | 0 |         divisor *= powten; | 
| 3702 | 0 |       tensRemovable >>= 1; | 
| 3703 | 0 |       if (!tensRemovable) break; | 
| 3704 | 0 |       powten *= powten; | 
| 3705 | 0 |     } | 
| 3706 | 0 | 
 | 
| 3707 | 0 |     significand = significand.udiv(divisor); | 
| 3708 | 0 | 
 | 
| 3709 | 0 |     // Truncate the significand down to its active bit count. | 
| 3710 | 0 |     significand = significand.trunc(significand.getActiveBits()); | 
| 3711 | 0 |   } | 
| 3712 |  |  | 
| 3713 |  |  | 
| 3714 |  |   void AdjustToPrecision(SmallVectorImpl<char> &buffer, | 
| 3715 | 0 |                          int &exp, unsigned FormatPrecision) { | 
| 3716 | 0 |     unsigned N = buffer.size(); | 
| 3717 | 0 |     if (N <= FormatPrecision) return; | 
| 3718 | 0 |  | 
| 3719 | 0 |     // The most significant figures are the last ones in the buffer. | 
| 3720 | 0 |     unsigned FirstSignificant = N - FormatPrecision; | 
| 3721 | 0 | 
 | 
| 3722 | 0 |     // Round. | 
| 3723 | 0 |     // FIXME: this probably shouldn't use 'round half up'. | 
| 3724 | 0 | 
 | 
| 3725 | 0 |     // Rounding down is just a truncation, except we also want to drop | 
| 3726 | 0 |     // trailing zeros from the new result. | 
| 3727 | 0 |     if (buffer[FirstSignificant - 1] < '5') { | 
| 3728 | 0 |       while (FirstSignificant < N && buffer[FirstSignificant] == '0') | 
| 3729 | 0 |         FirstSignificant++; | 
| 3730 | 0 | 
 | 
| 3731 | 0 |       exp += FirstSignificant; | 
| 3732 | 0 |       buffer.erase(&buffer[0], &buffer[FirstSignificant]); | 
| 3733 | 0 |       return; | 
| 3734 | 0 |     } | 
| 3735 | 0 | 
 | 
| 3736 | 0 |     // Rounding up requires a decimal add-with-carry.  If we continue | 
| 3737 | 0 |     // the carry, the newly-introduced zeros will just be truncated. | 
| 3738 | 0 |     for (unsigned I = FirstSignificant; I != N; ++I) { | 
| 3739 | 0 |       if (buffer[I] == '9') { | 
| 3740 | 0 |         FirstSignificant++; | 
| 3741 | 0 |       } else { | 
| 3742 | 0 |         buffer[I]++; | 
| 3743 | 0 |         break; | 
| 3744 | 0 |       } | 
| 3745 | 0 |     } | 
| 3746 | 0 | 
 | 
| 3747 | 0 |     // If we carried through, we have exactly one digit of precision. | 
| 3748 | 0 |     if (FirstSignificant == N) { | 
| 3749 | 0 |       exp += FirstSignificant; | 
| 3750 | 0 |       buffer.clear(); | 
| 3751 | 0 |       buffer.push_back('1'); | 
| 3752 | 0 |       return; | 
| 3753 | 0 |     } | 
| 3754 | 0 |  | 
| 3755 | 0 |     exp += FirstSignificant; | 
| 3756 | 0 |     buffer.erase(&buffer[0], &buffer[FirstSignificant]); | 
| 3757 | 0 |   } | 
| 3758 |  | } | 
| 3759 |  |  | 
| 3760 |  | void IEEEFloat::toString(SmallVectorImpl<char> &Str, unsigned FormatPrecision, | 
| 3761 | 0 |                          unsigned FormatMaxPadding, bool TruncateZero) const { | 
| 3762 | 0 |   switch (category) { | 
| 3763 | 0 |   case fcInfinity: | 
| 3764 | 0 |     if (isNegative()) | 
| 3765 | 0 |       return append(Str, "-Inf"); | 
| 3766 | 0 |     else | 
| 3767 | 0 |       return append(Str, "+Inf"); | 
| 3768 | 0 |  | 
| 3769 | 0 |   case fcNaN: return append(Str, "NaN"); | 
| 3770 | 0 | 
 | 
| 3771 | 0 |   case fcZero: | 
| 3772 | 0 |     if (isNegative()) | 
| 3773 | 0 |       Str.push_back('-'); | 
| 3774 | 0 | 
 | 
| 3775 | 0 |     if (!FormatMaxPadding) { | 
| 3776 | 0 |       if (TruncateZero) | 
| 3777 | 0 |         append(Str, "0.0E+0"); | 
| 3778 | 0 |       else { | 
| 3779 | 0 |         append(Str, "0.0"); | 
| 3780 | 0 |         if (FormatPrecision > 1) | 
| 3781 | 0 |           Str.append(FormatPrecision - 1, '0'); | 
| 3782 | 0 |         append(Str, "e+00"); | 
| 3783 | 0 |       } | 
| 3784 | 0 |     } else | 
| 3785 | 0 |       Str.push_back('0'); | 
| 3786 | 0 |     return; | 
| 3787 | 0 | 
 | 
| 3788 | 0 |   case fcNormal: | 
| 3789 | 0 |     break; | 
| 3790 | 0 |   } | 
| 3791 | 0 |  | 
| 3792 | 0 |   if (isNegative()) | 
| 3793 | 0 |     Str.push_back('-'); | 
| 3794 | 0 | 
 | 
| 3795 | 0 |   // Decompose the number into an APInt and an exponent. | 
| 3796 | 0 |   int exp = exponent - ((int) semantics->precision - 1); | 
| 3797 | 0 |   APInt significand(semantics->precision, | 
| 3798 | 0 |                     makeArrayRef(significandParts(), | 
| 3799 | 0 |                                  partCountForBits(semantics->precision))); | 
| 3800 | 0 | 
 | 
| 3801 | 0 |   // Set FormatPrecision if zero.  We want to do this before we | 
| 3802 | 0 |   // truncate trailing zeros, as those are part of the precision. | 
| 3803 | 0 |   if (!FormatPrecision) { | 
| 3804 | 0 |     // We use enough digits so the number can be round-tripped back to an | 
| 3805 | 0 |     // APFloat. The formula comes from "How to Print Floating-Point Numbers | 
| 3806 | 0 |     // Accurately" by Steele and White. | 
| 3807 | 0 |     // FIXME: Using a formula based purely on the precision is conservative; | 
| 3808 | 0 |     // we can print fewer digits depending on the actual value being printed. | 
| 3809 | 0 | 
 | 
| 3810 | 0 |     // FormatPrecision = 2 + floor(significandBits / lg_2(10)) | 
| 3811 | 0 |     FormatPrecision = 2 + semantics->precision * 59 / 196; | 
| 3812 | 0 |   } | 
| 3813 | 0 | 
 | 
| 3814 | 0 |   // Ignore trailing binary zeros. | 
| 3815 | 0 |   int trailingZeros = significand.countTrailingZeros(); | 
| 3816 | 0 |   exp += trailingZeros; | 
| 3817 | 0 |   significand.lshrInPlace(trailingZeros); | 
| 3818 | 0 | 
 | 
| 3819 | 0 |   // Change the exponent from 2^e to 10^e. | 
| 3820 | 0 |   if (exp == 0) { | 
| 3821 | 0 |     // Nothing to do. | 
| 3822 | 0 |   } else if (exp > 0) { | 
| 3823 | 0 |     // Just shift left. | 
| 3824 | 0 |     significand = significand.zext(semantics->precision + exp); | 
| 3825 | 0 |     significand <<= exp; | 
| 3826 | 0 |     exp = 0; | 
| 3827 | 0 |   } else { /* exp < 0 */ | 
| 3828 | 0 |     int texp = -exp; | 
| 3829 | 0 | 
 | 
| 3830 | 0 |     // We transform this using the identity: | 
| 3831 | 0 |     //   (N)(2^-e) == (N)(5^e)(10^-e) | 
| 3832 | 0 |     // This means we have to multiply N (the significand) by 5^e. | 
| 3833 | 0 |     // To avoid overflow, we have to operate on numbers large | 
| 3834 | 0 |     // enough to store N * 5^e: | 
| 3835 | 0 |     //   log2(N * 5^e) == log2(N) + e * log2(5) | 
| 3836 | 0 |     //                 <= semantics->precision + e * 137 / 59 | 
| 3837 | 0 |     //   (log_2(5) ~ 2.321928 < 2.322034 ~ 137/59) | 
| 3838 | 0 | 
 | 
| 3839 | 0 |     unsigned precision = semantics->precision + (137 * texp + 136) / 59; | 
| 3840 | 0 | 
 | 
| 3841 | 0 |     // Multiply significand by 5^e. | 
| 3842 | 0 |     //   N * 5^0101 == N * 5^(1*1) * 5^(0*2) * 5^(1*4) * 5^(0*8) | 
| 3843 | 0 |     significand = significand.zext(precision); | 
| 3844 | 0 |     APInt five_to_the_i(precision, 5); | 
| 3845 | 0 |     while (true) { | 
| 3846 | 0 |       if (texp & 1) significand *= five_to_the_i; | 
| 3847 | 0 | 
 | 
| 3848 | 0 |       texp >>= 1; | 
| 3849 | 0 |       if (!texp) break; | 
| 3850 | 0 |       five_to_the_i *= five_to_the_i; | 
| 3851 | 0 |     } | 
| 3852 | 0 |   } | 
| 3853 | 0 | 
 | 
| 3854 | 0 |   AdjustToPrecision(significand, exp, FormatPrecision); | 
| 3855 | 0 | 
 | 
| 3856 | 0 |   SmallVector<char, 256> buffer; | 
| 3857 | 0 | 
 | 
| 3858 | 0 |   // Fill the buffer. | 
| 3859 | 0 |   unsigned precision = significand.getBitWidth(); | 
| 3860 | 0 |   APInt ten(precision, 10); | 
| 3861 | 0 |   APInt digit(precision, 0); | 
| 3862 | 0 | 
 | 
| 3863 | 0 |   bool inTrail = true; | 
| 3864 | 0 |   while (significand != 0) { | 
| 3865 | 0 |     // digit <- significand % 10 | 
| 3866 | 0 |     // significand <- significand / 10 | 
| 3867 | 0 |     APInt::udivrem(significand, ten, significand, digit); | 
| 3868 | 0 | 
 | 
| 3869 | 0 |     unsigned d = digit.getZExtValue(); | 
| 3870 | 0 | 
 | 
| 3871 | 0 |     // Drop trailing zeros. | 
| 3872 | 0 |     if (inTrail && !d) exp++; | 
| 3873 | 0 |     else { | 
| 3874 | 0 |       buffer.push_back((char) ('0' + d)); | 
| 3875 | 0 |       inTrail = false; | 
| 3876 | 0 |     } | 
| 3877 | 0 |   } | 
| 3878 | 0 | 
 | 
| 3879 | 0 |   assert(!buffer.empty() && "no characters in buffer!"); | 
| 3880 | 0 | 
 | 
| 3881 | 0 |   // Drop down to FormatPrecision. | 
| 3882 | 0 |   // TODO: don't do more precise calculations above than are required. | 
| 3883 | 0 |   AdjustToPrecision(buffer, exp, FormatPrecision); | 
| 3884 | 0 | 
 | 
| 3885 | 0 |   unsigned NDigits = buffer.size(); | 
| 3886 | 0 | 
 | 
| 3887 | 0 |   // Check whether we should use scientific notation. | 
| 3888 | 0 |   bool FormatScientific; | 
| 3889 | 0 |   if (!FormatMaxPadding) | 
| 3890 | 0 |     FormatScientific = true; | 
| 3891 | 0 |   else { | 
| 3892 | 0 |     if (exp >= 0) { | 
| 3893 | 0 |       // 765e3 --> 765000 | 
| 3894 | 0 |       //              ^^^ | 
| 3895 | 0 |       // But we shouldn't make the number look more precise than it is. | 
| 3896 | 0 |       FormatScientific = ((unsigned) exp > FormatMaxPadding || | 
| 3897 | 0 |                           NDigits + (unsigned) exp > FormatPrecision); | 
| 3898 | 0 |     } else { | 
| 3899 | 0 |       // Power of the most significant digit. | 
| 3900 | 0 |       int MSD = exp + (int) (NDigits - 1); | 
| 3901 | 0 |       if (MSD >= 0) { | 
| 3902 | 0 |         // 765e-2 == 7.65 | 
| 3903 | 0 |         FormatScientific = false; | 
| 3904 | 0 |       } else { | 
| 3905 | 0 |         // 765e-5 == 0.00765 | 
| 3906 | 0 |         //           ^ ^^ | 
| 3907 | 0 |         FormatScientific = ((unsigned) -MSD) > FormatMaxPadding; | 
| 3908 | 0 |       } | 
| 3909 | 0 |     } | 
| 3910 | 0 |   } | 
| 3911 | 0 | 
 | 
| 3912 | 0 |   // Scientific formatting is pretty straightforward. | 
| 3913 | 0 |   if (FormatScientific) { | 
| 3914 | 0 |     exp += (NDigits - 1); | 
| 3915 | 0 | 
 | 
| 3916 | 0 |     Str.push_back(buffer[NDigits-1]); | 
| 3917 | 0 |     Str.push_back('.'); | 
| 3918 | 0 |     if (NDigits == 1 && TruncateZero) | 
| 3919 | 0 |       Str.push_back('0'); | 
| 3920 | 0 |     else | 
| 3921 | 0 |       for (unsigned I = 1; I != NDigits; ++I) | 
| 3922 | 0 |         Str.push_back(buffer[NDigits-1-I]); | 
| 3923 | 0 |     // Fill with zeros up to FormatPrecision. | 
| 3924 | 0 |     if (!TruncateZero && FormatPrecision > NDigits - 1) | 
| 3925 | 0 |       Str.append(FormatPrecision - NDigits + 1, '0'); | 
| 3926 | 0 |     // For !TruncateZero we use lower 'e'. | 
| 3927 | 0 |     Str.push_back(TruncateZero ? 'E' : 'e'); | 
| 3928 | 0 | 
 | 
| 3929 | 0 |     Str.push_back(exp >= 0 ? '+' : '-'); | 
| 3930 | 0 |     if (exp < 0) exp = -exp; | 
| 3931 | 0 |     SmallVector<char, 6> expbuf; | 
| 3932 | 0 |     do { | 
| 3933 | 0 |       expbuf.push_back((char) ('0' + (exp % 10))); | 
| 3934 | 0 |       exp /= 10; | 
| 3935 | 0 |     } while (exp); | 
| 3936 | 0 |     // Exponent always at least two digits if we do not truncate zeros. | 
| 3937 | 0 |     if (!TruncateZero && expbuf.size() < 2) | 
| 3938 | 0 |       expbuf.push_back('0'); | 
| 3939 | 0 |     for (unsigned I = 0, E = expbuf.size(); I != E; ++I) | 
| 3940 | 0 |       Str.push_back(expbuf[E-1-I]); | 
| 3941 | 0 |     return; | 
| 3942 | 0 |   } | 
| 3943 | 0 | 
 | 
| 3944 | 0 |   // Non-scientific, positive exponents. | 
| 3945 | 0 |   if (exp >= 0) { | 
| 3946 | 0 |     for (unsigned I = 0; I != NDigits; ++I) | 
| 3947 | 0 |       Str.push_back(buffer[NDigits-1-I]); | 
| 3948 | 0 |     for (unsigned I = 0; I != (unsigned) exp; ++I) | 
| 3949 | 0 |       Str.push_back('0'); | 
| 3950 | 0 |     return; | 
| 3951 | 0 |   } | 
| 3952 | 0 | 
 | 
| 3953 | 0 |   // Non-scientific, negative exponents. | 
| 3954 | 0 | 
 | 
| 3955 | 0 |   // The number of digits to the left of the decimal point. | 
| 3956 | 0 |   int NWholeDigits = exp + (int) NDigits; | 
| 3957 | 0 | 
 | 
| 3958 | 0 |   unsigned I = 0; | 
| 3959 | 0 |   if (NWholeDigits > 0) { | 
| 3960 | 0 |     for (; I != (unsigned) NWholeDigits; ++I) | 
| 3961 | 0 |       Str.push_back(buffer[NDigits-I-1]); | 
| 3962 | 0 |     Str.push_back('.'); | 
| 3963 | 0 |   } else { | 
| 3964 | 0 |     unsigned NZeros = 1 + (unsigned) -NWholeDigits; | 
| 3965 | 0 | 
 | 
| 3966 | 0 |     Str.push_back('0'); | 
| 3967 | 0 |     Str.push_back('.'); | 
| 3968 | 0 |     for (unsigned Z = 1; Z != NZeros; ++Z) | 
| 3969 | 0 |       Str.push_back('0'); | 
| 3970 | 0 |   } | 
| 3971 | 0 | 
 | 
| 3972 | 0 |   for (; I != NDigits; ++I) | 
| 3973 | 0 |     Str.push_back(buffer[NDigits-I-1]); | 
| 3974 | 0 | } | 
| 3975 |  |  | 
| 3976 | 0 | bool IEEEFloat::getExactInverse(APFloat *inv) const { | 
| 3977 | 0 |   // Special floats and denormals have no exact inverse. | 
| 3978 | 0 |   if (!isFiniteNonZero()) | 
| 3979 | 0 |     return false; | 
| 3980 | 0 |  | 
| 3981 | 0 |   // Check that the number is a power of two by making sure that only the | 
| 3982 | 0 |   // integer bit is set in the significand. | 
| 3983 | 0 |   if (significandLSB() != semantics->precision - 1) | 
| 3984 | 0 |     return false; | 
| 3985 | 0 |  | 
| 3986 | 0 |   // Get the inverse. | 
| 3987 | 0 |   IEEEFloat reciprocal(*semantics, 1ULL); | 
| 3988 | 0 |   if (reciprocal.divide(*this, rmNearestTiesToEven) != opOK) | 
| 3989 | 0 |     return false; | 
| 3990 | 0 |  | 
| 3991 | 0 |   // Avoid multiplication with a denormal, it is not safe on all platforms and | 
| 3992 | 0 |   // may be slower than a normal division. | 
| 3993 | 0 |   if (reciprocal.isDenormal()) | 
| 3994 | 0 |     return false; | 
| 3995 | 0 |  | 
| 3996 | 0 |   assert(reciprocal.isFiniteNonZero() && | 
| 3997 | 0 |          reciprocal.significandLSB() == reciprocal.semantics->precision - 1); | 
| 3998 | 0 | 
 | 
| 3999 | 0 |   if (inv) | 
| 4000 | 0 |     *inv = APFloat(reciprocal, *semantics); | 
| 4001 | 0 | 
 | 
| 4002 | 0 |   return true; | 
| 4003 | 0 | } | 
| 4004 |  |  | 
| 4005 | 0 | bool IEEEFloat::isSignaling() const { | 
| 4006 | 0 |   if (!isNaN()) | 
| 4007 | 0 |     return false; | 
| 4008 | 0 |  | 
| 4009 | 0 |   // IEEE-754R 2008 6.2.1: A signaling NaN bit string should be encoded with the | 
| 4010 | 0 |   // first bit of the trailing significand being 0. | 
| 4011 | 0 |   return !APInt::tcExtractBit(significandParts(), semantics->precision - 2); | 
| 4012 | 0 | } | 
| 4013 |  |  | 
| 4014 |  | /// IEEE-754R 2008 5.3.1: nextUp/nextDown. | 
| 4015 |  | /// | 
| 4016 |  | /// *NOTE* since nextDown(x) = -nextUp(-x), we only implement nextUp with | 
| 4017 |  | /// appropriate sign switching before/after the computation. | 
| 4018 | 0 | IEEEFloat::opStatus IEEEFloat::next(bool nextDown) { | 
| 4019 | 0 |   // If we are performing nextDown, swap sign so we have -x. | 
| 4020 | 0 |   if (nextDown) | 
| 4021 | 0 |     changeSign(); | 
| 4022 | 0 | 
 | 
| 4023 | 0 |   // Compute nextUp(x) | 
| 4024 | 0 |   opStatus result = opOK; | 
| 4025 | 0 | 
 | 
| 4026 | 0 |   // Handle each float category separately. | 
| 4027 | 0 |   switch (category) { | 
| 4028 | 0 |   case fcInfinity: | 
| 4029 | 0 |     // nextUp(+inf) = +inf | 
| 4030 | 0 |     if (!isNegative()) | 
| 4031 | 0 |       break; | 
| 4032 | 0 |     // nextUp(-inf) = -getLargest() | 
| 4033 | 0 |     makeLargest(true); | 
| 4034 | 0 |     break; | 
| 4035 | 0 |   case fcNaN: | 
| 4036 | 0 |     // IEEE-754R 2008 6.2 Par 2: nextUp(sNaN) = qNaN. Set Invalid flag. | 
| 4037 | 0 |     // IEEE-754R 2008 6.2: nextUp(qNaN) = qNaN. Must be identity so we do not | 
| 4038 | 0 |     //                     change the payload. | 
| 4039 | 0 |     if (isSignaling()) { | 
| 4040 | 0 |       result = opInvalidOp; | 
| 4041 | 0 |       // For consistency, propagate the sign of the sNaN to the qNaN. | 
| 4042 | 0 |       makeNaN(false, isNegative(), nullptr); | 
| 4043 | 0 |     } | 
| 4044 | 0 |     break; | 
| 4045 | 0 |   case fcZero: | 
| 4046 | 0 |     // nextUp(pm 0) = +getSmallest() | 
| 4047 | 0 |     makeSmallest(false); | 
| 4048 | 0 |     break; | 
| 4049 | 0 |   case fcNormal: | 
| 4050 | 0 |     // nextUp(-getSmallest()) = -0 | 
| 4051 | 0 |     if (isSmallest() && isNegative()) { | 
| 4052 | 0 |       APInt::tcSet(significandParts(), 0, partCount()); | 
| 4053 | 0 |       category = fcZero; | 
| 4054 | 0 |       exponent = 0; | 
| 4055 | 0 |       break; | 
| 4056 | 0 |     } | 
| 4057 | 0 |  | 
| 4058 | 0 |     // nextUp(getLargest()) == INFINITY | 
| 4059 | 0 |     if (isLargest() && !isNegative()) { | 
| 4060 | 0 |       APInt::tcSet(significandParts(), 0, partCount()); | 
| 4061 | 0 |       category = fcInfinity; | 
| 4062 | 0 |       exponent = semantics->maxExponent + 1; | 
| 4063 | 0 |       break; | 
| 4064 | 0 |     } | 
| 4065 | 0 |  | 
| 4066 | 0 |     // nextUp(normal) == normal + inc. | 
| 4067 | 0 |     if (isNegative()) { | 
| 4068 | 0 |       // If we are negative, we need to decrement the significand. | 
| 4069 | 0 | 
 | 
| 4070 | 0 |       // We only cross a binade boundary that requires adjusting the exponent | 
| 4071 | 0 |       // if: | 
| 4072 | 0 |       //   1. exponent != semantics->minExponent. This implies we are not in the | 
| 4073 | 0 |       //   smallest binade or are dealing with denormals. | 
| 4074 | 0 |       //   2. Our significand excluding the integral bit is all zeros. | 
| 4075 | 0 |       bool WillCrossBinadeBoundary = | 
| 4076 | 0 |         exponent != semantics->minExponent && isSignificandAllZeros(); | 
| 4077 | 0 | 
 | 
| 4078 | 0 |       // Decrement the significand. | 
| 4079 | 0 |       // | 
| 4080 | 0 |       // We always do this since: | 
| 4081 | 0 |       //   1. If we are dealing with a non-binade decrement, by definition we | 
| 4082 | 0 |       //   just decrement the significand. | 
| 4083 | 0 |       //   2. If we are dealing with a normal -> normal binade decrement, since | 
| 4084 | 0 |       //   we have an explicit integral bit the fact that all bits but the | 
| 4085 | 0 |       //   integral bit are zero implies that subtracting one will yield a | 
| 4086 | 0 |       //   significand with 0 integral bit and 1 in all other spots. Thus we | 
| 4087 | 0 |       //   must just adjust the exponent and set the integral bit to 1. | 
| 4088 | 0 |       //   3. If we are dealing with a normal -> denormal binade decrement, | 
| 4089 | 0 |       //   since we set the integral bit to 0 when we represent denormals, we | 
| 4090 | 0 |       //   just decrement the significand. | 
| 4091 | 0 |       integerPart *Parts = significandParts(); | 
| 4092 | 0 |       APInt::tcDecrement(Parts, partCount()); | 
| 4093 | 0 | 
 | 
| 4094 | 0 |       if (WillCrossBinadeBoundary) { | 
| 4095 | 0 |         // Our result is a normal number. Do the following: | 
| 4096 | 0 |         // 1. Set the integral bit to 1. | 
| 4097 | 0 |         // 2. Decrement the exponent. | 
| 4098 | 0 |         APInt::tcSetBit(Parts, semantics->precision - 1); | 
| 4099 | 0 |         exponent--; | 
| 4100 | 0 |       } | 
| 4101 | 0 |     } else { | 
| 4102 | 0 |       // If we are positive, we need to increment the significand. | 
| 4103 | 0 | 
 | 
| 4104 | 0 |       // We only cross a binade boundary that requires adjusting the exponent if | 
| 4105 | 0 |       // the input is not a denormal and all of said input's significand bits | 
| 4106 | 0 |       // are set. If all of said conditions are true: clear the significand, set | 
| 4107 | 0 |       // the integral bit to 1, and increment the exponent. If we have a | 
| 4108 | 0 |       // denormal always increment since moving denormals and the numbers in the | 
| 4109 | 0 |       // smallest normal binade have the same exponent in our representation. | 
| 4110 | 0 |       bool WillCrossBinadeBoundary = !isDenormal() && isSignificandAllOnes(); | 
| 4111 | 0 | 
 | 
| 4112 | 0 |       if (WillCrossBinadeBoundary) { | 
| 4113 | 0 |         integerPart *Parts = significandParts(); | 
| 4114 | 0 |         APInt::tcSet(Parts, 0, partCount()); | 
| 4115 | 0 |         APInt::tcSetBit(Parts, semantics->precision - 1); | 
| 4116 | 0 |         assert(exponent != semantics->maxExponent && | 
| 4117 | 0 |                "We can not increment an exponent beyond the maxExponent allowed" | 
| 4118 | 0 |                " by the given floating point semantics."); | 
| 4119 | 0 |         exponent++; | 
| 4120 | 0 |       } else { | 
| 4121 | 0 |         incrementSignificand(); | 
| 4122 | 0 |       } | 
| 4123 | 0 |     } | 
| 4124 | 0 |     break; | 
| 4125 | 0 |   } | 
| 4126 | 0 | 
 | 
| 4127 | 0 |   // If we are performing nextDown, swap sign so we have -nextUp(-x) | 
| 4128 | 0 |   if (nextDown) | 
| 4129 | 0 |     changeSign(); | 
| 4130 | 0 | 
 | 
| 4131 | 0 |   return result; | 
| 4132 | 0 | } | 
| 4133 |  |  | 
| 4134 | 0 | void IEEEFloat::makeInf(bool Negative) { | 
| 4135 | 0 |   category = fcInfinity; | 
| 4136 | 0 |   sign = Negative; | 
| 4137 | 0 |   exponent = semantics->maxExponent + 1; | 
| 4138 | 0 |   APInt::tcSet(significandParts(), 0, partCount()); | 
| 4139 | 0 | } | 
| 4140 |  |  | 
| 4141 | 0 | void IEEEFloat::makeZero(bool Negative) { | 
| 4142 | 0 |   category = fcZero; | 
| 4143 | 0 |   sign = Negative; | 
| 4144 | 0 |   exponent = semantics->minExponent-1; | 
| 4145 | 0 |   APInt::tcSet(significandParts(), 0, partCount()); | 
| 4146 | 0 | } | 
| 4147 |  |  | 
| 4148 | 0 | void IEEEFloat::makeQuiet() { | 
| 4149 | 0 |   assert(isNaN()); | 
| 4150 | 0 |   APInt::tcSetBit(significandParts(), semantics->precision - 2); | 
| 4151 | 0 | } | 
| 4152 |  |  | 
| 4153 | 0 | int ilogb(const IEEEFloat &Arg) { | 
| 4154 | 0 |   if (Arg.isNaN()) | 
| 4155 | 0 |     return IEEEFloat::IEK_NaN; | 
| 4156 | 0 |   if (Arg.isZero()) | 
| 4157 | 0 |     return IEEEFloat::IEK_Zero; | 
| 4158 | 0 |   if (Arg.isInfinity()) | 
| 4159 | 0 |     return IEEEFloat::IEK_Inf; | 
| 4160 | 0 |   if (!Arg.isDenormal()) | 
| 4161 | 0 |     return Arg.exponent; | 
| 4162 | 0 |  | 
| 4163 | 0 |   IEEEFloat Normalized(Arg); | 
| 4164 | 0 |   int SignificandBits = Arg.getSemantics().precision - 1; | 
| 4165 | 0 | 
 | 
| 4166 | 0 |   Normalized.exponent += SignificandBits; | 
| 4167 | 0 |   Normalized.normalize(IEEEFloat::rmNearestTiesToEven, lfExactlyZero); | 
| 4168 | 0 |   return Normalized.exponent - SignificandBits; | 
| 4169 | 0 | } | 
| 4170 |  |  | 
| 4171 | 0 | IEEEFloat scalbn(IEEEFloat X, int Exp, IEEEFloat::roundingMode RoundingMode) { | 
| 4172 | 0 |   auto MaxExp = X.getSemantics().maxExponent; | 
| 4173 | 0 |   auto MinExp = X.getSemantics().minExponent; | 
| 4174 | 0 | 
 | 
| 4175 | 0 |   // If Exp is wildly out-of-scale, simply adding it to X.exponent will | 
| 4176 | 0 |   // overflow; clamp it to a safe range before adding, but ensure that the range | 
| 4177 | 0 |   // is large enough that the clamp does not change the result. The range we | 
| 4178 | 0 |   // need to support is the difference between the largest possible exponent and | 
| 4179 | 0 |   // the normalized exponent of half the smallest denormal. | 
| 4180 | 0 | 
 | 
| 4181 | 0 |   int SignificandBits = X.getSemantics().precision - 1; | 
| 4182 | 0 |   int MaxIncrement = MaxExp - (MinExp - SignificandBits) + 1; | 
| 4183 | 0 | 
 | 
| 4184 | 0 |   // Clamp to one past the range ends to let normalize handle overlflow. | 
| 4185 | 0 |   X.exponent += std::min(std::max(Exp, -MaxIncrement - 1), MaxIncrement); | 
| 4186 | 0 |   X.normalize(RoundingMode, lfExactlyZero); | 
| 4187 | 0 |   if (X.isNaN()) | 
| 4188 | 0 |     X.makeQuiet(); | 
| 4189 | 0 |   return X; | 
| 4190 | 0 | } | 
| 4191 |  |  | 
| 4192 | 0 | IEEEFloat frexp(const IEEEFloat &Val, int &Exp, IEEEFloat::roundingMode RM) { | 
| 4193 | 0 |   Exp = ilogb(Val); | 
| 4194 | 0 | 
 | 
| 4195 | 0 |   // Quiet signalling nans. | 
| 4196 | 0 |   if (Exp == IEEEFloat::IEK_NaN) { | 
| 4197 | 0 |     IEEEFloat Quiet(Val); | 
| 4198 | 0 |     Quiet.makeQuiet(); | 
| 4199 | 0 |     return Quiet; | 
| 4200 | 0 |   } | 
| 4201 | 0 |  | 
| 4202 | 0 |   if (Exp == IEEEFloat::IEK_Inf) | 
| 4203 | 0 |     return Val; | 
| 4204 | 0 |  | 
| 4205 | 0 |   // 1 is added because frexp is defined to return a normalized fraction in | 
| 4206 | 0 |   // +/-[0.5, 1.0), rather than the usual +/-[1.0, 2.0). | 
| 4207 | 0 |   Exp = Exp == IEEEFloat::IEK_Zero ? 0 : Exp + 1; | 
| 4208 | 0 |   return scalbn(Val, -Exp, RM); | 
| 4209 | 0 | } | 
| 4210 |  |  | 
| 4211 |  | DoubleAPFloat::DoubleAPFloat(const fltSemantics &S) | 
| 4212 |  |     : Semantics(&S), | 
| 4213 | 0 |       Floats(new APFloat[2]{APFloat(semIEEEdouble), APFloat(semIEEEdouble)}) { | 
| 4214 | 0 |   assert(Semantics == &semPPCDoubleDouble); | 
| 4215 | 0 | } | 
| 4216 |  |  | 
| 4217 |  | DoubleAPFloat::DoubleAPFloat(const fltSemantics &S, uninitializedTag) | 
| 4218 |  |     : Semantics(&S), | 
| 4219 |  |       Floats(new APFloat[2]{APFloat(semIEEEdouble, uninitialized), | 
| 4220 | 0 |                             APFloat(semIEEEdouble, uninitialized)}) { | 
| 4221 | 0 |   assert(Semantics == &semPPCDoubleDouble); | 
| 4222 | 0 | } | 
| 4223 |  |  | 
| 4224 |  | DoubleAPFloat::DoubleAPFloat(const fltSemantics &S, integerPart I) | 
| 4225 |  |     : Semantics(&S), Floats(new APFloat[2]{APFloat(semIEEEdouble, I), | 
| 4226 | 0 |                                            APFloat(semIEEEdouble)}) { | 
| 4227 | 0 |   assert(Semantics == &semPPCDoubleDouble); | 
| 4228 | 0 | } | 
| 4229 |  |  | 
| 4230 |  | DoubleAPFloat::DoubleAPFloat(const fltSemantics &S, const APInt &I) | 
| 4231 |  |     : Semantics(&S), | 
| 4232 |  |       Floats(new APFloat[2]{ | 
| 4233 |  |           APFloat(semIEEEdouble, APInt(64, I.getRawData()[0])), | 
| 4234 | 0 |           APFloat(semIEEEdouble, APInt(64, I.getRawData()[1]))}) { | 
| 4235 | 0 |   assert(Semantics == &semPPCDoubleDouble); | 
| 4236 | 0 | } | 
| 4237 |  |  | 
| 4238 |  | DoubleAPFloat::DoubleAPFloat(const fltSemantics &S, APFloat &&First, | 
| 4239 |  |                              APFloat &&Second) | 
| 4240 |  |     : Semantics(&S), | 
| 4241 | 0 |       Floats(new APFloat[2]{std::move(First), std::move(Second)}) { | 
| 4242 | 0 |   assert(Semantics == &semPPCDoubleDouble); | 
| 4243 | 0 |   assert(&Floats[0].getSemantics() == &semIEEEdouble); | 
| 4244 | 0 |   assert(&Floats[1].getSemantics() == &semIEEEdouble); | 
| 4245 | 0 | } | 
| 4246 |  |  | 
| 4247 |  | DoubleAPFloat::DoubleAPFloat(const DoubleAPFloat &RHS) | 
| 4248 |  |     : Semantics(RHS.Semantics), | 
| 4249 |  |       Floats(RHS.Floats ? new APFloat[2]{APFloat(RHS.Floats[0]), | 
| 4250 |  |                                          APFloat(RHS.Floats[1])} | 
| 4251 | 0 |                         : nullptr) { | 
| 4252 | 0 |   assert(Semantics == &semPPCDoubleDouble); | 
| 4253 | 0 | } | 
| 4254 |  |  | 
| 4255 |  | DoubleAPFloat::DoubleAPFloat(DoubleAPFloat &&RHS) | 
| 4256 | 0 |     : Semantics(RHS.Semantics), Floats(std::move(RHS.Floats)) { | 
| 4257 | 0 |   RHS.Semantics = &semBogus; | 
| 4258 | 0 |   assert(Semantics == &semPPCDoubleDouble); | 
| 4259 | 0 | } | 
| 4260 |  |  | 
| 4261 | 0 | DoubleAPFloat &DoubleAPFloat::operator=(const DoubleAPFloat &RHS) { | 
| 4262 | 0 |   if (Semantics == RHS.Semantics && RHS.Floats) { | 
| 4263 | 0 |     Floats[0] = RHS.Floats[0]; | 
| 4264 | 0 |     Floats[1] = RHS.Floats[1]; | 
| 4265 | 0 |   } else if (this != &RHS) { | 
| 4266 | 0 |     this->~DoubleAPFloat(); | 
| 4267 | 0 |     new (this) DoubleAPFloat(RHS); | 
| 4268 | 0 |   } | 
| 4269 | 0 |   return *this; | 
| 4270 | 0 | } | 
| 4271 |  |  | 
| 4272 |  | // Implement addition, subtraction, multiplication and division based on: | 
| 4273 |  | // "Software for Doubled-Precision Floating-Point Computations", | 
| 4274 |  | // by Seppo Linnainmaa, ACM TOMS vol 7 no 3, September 1981, pages 272-283. | 
| 4275 |  | APFloat::opStatus DoubleAPFloat::addImpl(const APFloat &a, const APFloat &aa, | 
| 4276 |  |                                          const APFloat &c, const APFloat &cc, | 
| 4277 | 0 |                                          roundingMode RM) { | 
| 4278 | 0 |   int Status = opOK; | 
| 4279 | 0 |   APFloat z = a; | 
| 4280 | 0 |   Status |= z.add(c, RM); | 
| 4281 | 0 |   if (!z.isFinite()) { | 
| 4282 | 0 |     if (!z.isInfinity()) { | 
| 4283 | 0 |       Floats[0] = std::move(z); | 
| 4284 | 0 |       Floats[1].makeZero(/* Neg = */ false); | 
| 4285 | 0 |       return (opStatus)Status; | 
| 4286 | 0 |     } | 
| 4287 | 0 |     Status = opOK; | 
| 4288 | 0 |     auto AComparedToC = a.compareAbsoluteValue(c); | 
| 4289 | 0 |     z = cc; | 
| 4290 | 0 |     Status |= z.add(aa, RM); | 
| 4291 | 0 |     if (AComparedToC == APFloat::cmpGreaterThan) { | 
| 4292 | 0 |       // z = cc + aa + c + a; | 
| 4293 | 0 |       Status |= z.add(c, RM); | 
| 4294 | 0 |       Status |= z.add(a, RM); | 
| 4295 | 0 |     } else { | 
| 4296 | 0 |       // z = cc + aa + a + c; | 
| 4297 | 0 |       Status |= z.add(a, RM); | 
| 4298 | 0 |       Status |= z.add(c, RM); | 
| 4299 | 0 |     } | 
| 4300 | 0 |     if (!z.isFinite()) { | 
| 4301 | 0 |       Floats[0] = std::move(z); | 
| 4302 | 0 |       Floats[1].makeZero(/* Neg = */ false); | 
| 4303 | 0 |       return (opStatus)Status; | 
| 4304 | 0 |     } | 
| 4305 | 0 |     Floats[0] = z; | 
| 4306 | 0 |     APFloat zz = aa; | 
| 4307 | 0 |     Status |= zz.add(cc, RM); | 
| 4308 | 0 |     if (AComparedToC == APFloat::cmpGreaterThan) { | 
| 4309 | 0 |       // Floats[1] = a - z + c + zz; | 
| 4310 | 0 |       Floats[1] = a; | 
| 4311 | 0 |       Status |= Floats[1].subtract(z, RM); | 
| 4312 | 0 |       Status |= Floats[1].add(c, RM); | 
| 4313 | 0 |       Status |= Floats[1].add(zz, RM); | 
| 4314 | 0 |     } else { | 
| 4315 | 0 |       // Floats[1] = c - z + a + zz; | 
| 4316 | 0 |       Floats[1] = c; | 
| 4317 | 0 |       Status |= Floats[1].subtract(z, RM); | 
| 4318 | 0 |       Status |= Floats[1].add(a, RM); | 
| 4319 | 0 |       Status |= Floats[1].add(zz, RM); | 
| 4320 | 0 |     } | 
| 4321 | 0 |   } else { | 
| 4322 | 0 |     // q = a - z; | 
| 4323 | 0 |     APFloat q = a; | 
| 4324 | 0 |     Status |= q.subtract(z, RM); | 
| 4325 | 0 | 
 | 
| 4326 | 0 |     // zz = q + c + (a - (q + z)) + aa + cc; | 
| 4327 | 0 |     // Compute a - (q + z) as -((q + z) - a) to avoid temporary copies. | 
| 4328 | 0 |     auto zz = q; | 
| 4329 | 0 |     Status |= zz.add(c, RM); | 
| 4330 | 0 |     Status |= q.add(z, RM); | 
| 4331 | 0 |     Status |= q.subtract(a, RM); | 
| 4332 | 0 |     q.changeSign(); | 
| 4333 | 0 |     Status |= zz.add(q, RM); | 
| 4334 | 0 |     Status |= zz.add(aa, RM); | 
| 4335 | 0 |     Status |= zz.add(cc, RM); | 
| 4336 | 0 |     if (zz.isZero() && !zz.isNegative()) { | 
| 4337 | 0 |       Floats[0] = std::move(z); | 
| 4338 | 0 |       Floats[1].makeZero(/* Neg = */ false); | 
| 4339 | 0 |       return opOK; | 
| 4340 | 0 |     } | 
| 4341 | 0 |     Floats[0] = z; | 
| 4342 | 0 |     Status |= Floats[0].add(zz, RM); | 
| 4343 | 0 |     if (!Floats[0].isFinite()) { | 
| 4344 | 0 |       Floats[1].makeZero(/* Neg = */ false); | 
| 4345 | 0 |       return (opStatus)Status; | 
| 4346 | 0 |     } | 
| 4347 | 0 |     Floats[1] = std::move(z); | 
| 4348 | 0 |     Status |= Floats[1].subtract(Floats[0], RM); | 
| 4349 | 0 |     Status |= Floats[1].add(zz, RM); | 
| 4350 | 0 |   } | 
| 4351 | 0 |   return (opStatus)Status; | 
| 4352 | 0 | } | 
| 4353 |  |  | 
| 4354 |  | APFloat::opStatus DoubleAPFloat::addWithSpecial(const DoubleAPFloat &LHS, | 
| 4355 |  |                                                 const DoubleAPFloat &RHS, | 
| 4356 |  |                                                 DoubleAPFloat &Out, | 
| 4357 | 0 |                                                 roundingMode RM) { | 
| 4358 | 0 |   if (LHS.getCategory() == fcNaN) { | 
| 4359 | 0 |     Out = LHS; | 
| 4360 | 0 |     return opOK; | 
| 4361 | 0 |   } | 
| 4362 | 0 |   if (RHS.getCategory() == fcNaN) { | 
| 4363 | 0 |     Out = RHS; | 
| 4364 | 0 |     return opOK; | 
| 4365 | 0 |   } | 
| 4366 | 0 |   if (LHS.getCategory() == fcZero) { | 
| 4367 | 0 |     Out = RHS; | 
| 4368 | 0 |     return opOK; | 
| 4369 | 0 |   } | 
| 4370 | 0 |   if (RHS.getCategory() == fcZero) { | 
| 4371 | 0 |     Out = LHS; | 
| 4372 | 0 |     return opOK; | 
| 4373 | 0 |   } | 
| 4374 | 0 |   if (LHS.getCategory() == fcInfinity && RHS.getCategory() == fcInfinity && | 
| 4375 | 0 |       LHS.isNegative() != RHS.isNegative()) { | 
| 4376 | 0 |     Out.makeNaN(false, Out.isNegative(), nullptr); | 
| 4377 | 0 |     return opInvalidOp; | 
| 4378 | 0 |   } | 
| 4379 | 0 |   if (LHS.getCategory() == fcInfinity) { | 
| 4380 | 0 |     Out = LHS; | 
| 4381 | 0 |     return opOK; | 
| 4382 | 0 |   } | 
| 4383 | 0 |   if (RHS.getCategory() == fcInfinity) { | 
| 4384 | 0 |     Out = RHS; | 
| 4385 | 0 |     return opOK; | 
| 4386 | 0 |   } | 
| 4387 | 0 |   assert(LHS.getCategory() == fcNormal && RHS.getCategory() == fcNormal); | 
| 4388 | 0 | 
 | 
| 4389 | 0 |   APFloat A(LHS.Floats[0]), AA(LHS.Floats[1]), C(RHS.Floats[0]), | 
| 4390 | 0 |       CC(RHS.Floats[1]); | 
| 4391 | 0 |   assert(&A.getSemantics() == &semIEEEdouble); | 
| 4392 | 0 |   assert(&AA.getSemantics() == &semIEEEdouble); | 
| 4393 | 0 |   assert(&C.getSemantics() == &semIEEEdouble); | 
| 4394 | 0 |   assert(&CC.getSemantics() == &semIEEEdouble); | 
| 4395 | 0 |   assert(&Out.Floats[0].getSemantics() == &semIEEEdouble); | 
| 4396 | 0 |   assert(&Out.Floats[1].getSemantics() == &semIEEEdouble); | 
| 4397 | 0 |   return Out.addImpl(A, AA, C, CC, RM); | 
| 4398 | 0 | } | 
| 4399 |  |  | 
| 4400 |  | APFloat::opStatus DoubleAPFloat::add(const DoubleAPFloat &RHS, | 
| 4401 | 0 |                                      roundingMode RM) { | 
| 4402 | 0 |   return addWithSpecial(*this, RHS, *this, RM); | 
| 4403 | 0 | } | 
| 4404 |  |  | 
| 4405 |  | APFloat::opStatus DoubleAPFloat::subtract(const DoubleAPFloat &RHS, | 
| 4406 | 0 |                                           roundingMode RM) { | 
| 4407 | 0 |   changeSign(); | 
| 4408 | 0 |   auto Ret = add(RHS, RM); | 
| 4409 | 0 |   changeSign(); | 
| 4410 | 0 |   return Ret; | 
| 4411 | 0 | } | 
| 4412 |  |  | 
| 4413 |  | APFloat::opStatus DoubleAPFloat::multiply(const DoubleAPFloat &RHS, | 
| 4414 | 0 |                                           APFloat::roundingMode RM) { | 
| 4415 | 0 |   const auto &LHS = *this; | 
| 4416 | 0 |   auto &Out = *this; | 
| 4417 | 0 |   /* Interesting observation: For special categories, finding the lowest | 
| 4418 | 0 |      common ancestor of the following layered graph gives the correct | 
| 4419 | 0 |      return category: | 
| 4420 | 0 | 
 | 
| 4421 | 0 |         NaN | 
| 4422 | 0 |        /   \ | 
| 4423 | 0 |      Zero  Inf | 
| 4424 | 0 |        \   / | 
| 4425 | 0 |        Normal | 
| 4426 | 0 | 
 | 
| 4427 | 0 |      e.g. NaN * NaN = NaN | 
| 4428 | 0 |           Zero * Inf = NaN | 
| 4429 | 0 |           Normal * Zero = Zero | 
| 4430 | 0 |           Normal * Inf = Inf | 
| 4431 | 0 |   */ | 
| 4432 | 0 |   if (LHS.getCategory() == fcNaN) { | 
| 4433 | 0 |     Out = LHS; | 
| 4434 | 0 |     return opOK; | 
| 4435 | 0 |   } | 
| 4436 | 0 |   if (RHS.getCategory() == fcNaN) { | 
| 4437 | 0 |     Out = RHS; | 
| 4438 | 0 |     return opOK; | 
| 4439 | 0 |   } | 
| 4440 | 0 |   if ((LHS.getCategory() == fcZero && RHS.getCategory() == fcInfinity) || | 
| 4441 | 0 |       (LHS.getCategory() == fcInfinity && RHS.getCategory() == fcZero)) { | 
| 4442 | 0 |     Out.makeNaN(false, false, nullptr); | 
| 4443 | 0 |     return opOK; | 
| 4444 | 0 |   } | 
| 4445 | 0 |   if (LHS.getCategory() == fcZero || LHS.getCategory() == fcInfinity) { | 
| 4446 | 0 |     Out = LHS; | 
| 4447 | 0 |     return opOK; | 
| 4448 | 0 |   } | 
| 4449 | 0 |   if (RHS.getCategory() == fcZero || RHS.getCategory() == fcInfinity) { | 
| 4450 | 0 |     Out = RHS; | 
| 4451 | 0 |     return opOK; | 
| 4452 | 0 |   } | 
| 4453 | 0 |   assert(LHS.getCategory() == fcNormal && RHS.getCategory() == fcNormal && | 
| 4454 | 0 |          "Special cases not handled exhaustively"); | 
| 4455 | 0 | 
 | 
| 4456 | 0 |   int Status = opOK; | 
| 4457 | 0 |   APFloat A = Floats[0], B = Floats[1], C = RHS.Floats[0], D = RHS.Floats[1]; | 
| 4458 | 0 |   // t = a * c | 
| 4459 | 0 |   APFloat T = A; | 
| 4460 | 0 |   Status |= T.multiply(C, RM); | 
| 4461 | 0 |   if (!T.isFiniteNonZero()) { | 
| 4462 | 0 |     Floats[0] = T; | 
| 4463 | 0 |     Floats[1].makeZero(/* Neg = */ false); | 
| 4464 | 0 |     return (opStatus)Status; | 
| 4465 | 0 |   } | 
| 4466 | 0 |  | 
| 4467 | 0 |   // tau = fmsub(a, c, t), that is -fmadd(-a, c, t). | 
| 4468 | 0 |   APFloat Tau = A; | 
| 4469 | 0 |   T.changeSign(); | 
| 4470 | 0 |   Status |= Tau.fusedMultiplyAdd(C, T, RM); | 
| 4471 | 0 |   T.changeSign(); | 
| 4472 | 0 |   { | 
| 4473 | 0 |     // v = a * d | 
| 4474 | 0 |     APFloat V = A; | 
| 4475 | 0 |     Status |= V.multiply(D, RM); | 
| 4476 | 0 |     // w = b * c | 
| 4477 | 0 |     APFloat W = B; | 
| 4478 | 0 |     Status |= W.multiply(C, RM); | 
| 4479 | 0 |     Status |= V.add(W, RM); | 
| 4480 | 0 |     // tau += v + w | 
| 4481 | 0 |     Status |= Tau.add(V, RM); | 
| 4482 | 0 |   } | 
| 4483 | 0 |   // u = t + tau | 
| 4484 | 0 |   APFloat U = T; | 
| 4485 | 0 |   Status |= U.add(Tau, RM); | 
| 4486 | 0 | 
 | 
| 4487 | 0 |   Floats[0] = U; | 
| 4488 | 0 |   if (!U.isFinite()) { | 
| 4489 | 0 |     Floats[1].makeZero(/* Neg = */ false); | 
| 4490 | 0 |   } else { | 
| 4491 | 0 |     // Floats[1] = (t - u) + tau | 
| 4492 | 0 |     Status |= T.subtract(U, RM); | 
| 4493 | 0 |     Status |= T.add(Tau, RM); | 
| 4494 | 0 |     Floats[1] = T; | 
| 4495 | 0 |   } | 
| 4496 | 0 |   return (opStatus)Status; | 
| 4497 | 0 | } | 
| 4498 |  |  | 
| 4499 |  | APFloat::opStatus DoubleAPFloat::divide(const DoubleAPFloat &RHS, | 
| 4500 | 0 |                                         APFloat::roundingMode RM) { | 
| 4501 | 0 |   assert(Semantics == &semPPCDoubleDouble && "Unexpected Semantics"); | 
| 4502 | 0 |   APFloat Tmp(semPPCDoubleDoubleLegacy, bitcastToAPInt()); | 
| 4503 | 0 |   auto Ret = | 
| 4504 | 0 |       Tmp.divide(APFloat(semPPCDoubleDoubleLegacy, RHS.bitcastToAPInt()), RM); | 
| 4505 | 0 |   *this = DoubleAPFloat(semPPCDoubleDouble, Tmp.bitcastToAPInt()); | 
| 4506 | 0 |   return Ret; | 
| 4507 | 0 | } | 
| 4508 |  |  | 
| 4509 | 0 | APFloat::opStatus DoubleAPFloat::remainder(const DoubleAPFloat &RHS) { | 
| 4510 | 0 |   assert(Semantics == &semPPCDoubleDouble && "Unexpected Semantics"); | 
| 4511 | 0 |   APFloat Tmp(semPPCDoubleDoubleLegacy, bitcastToAPInt()); | 
| 4512 | 0 |   auto Ret = | 
| 4513 | 0 |       Tmp.remainder(APFloat(semPPCDoubleDoubleLegacy, RHS.bitcastToAPInt())); | 
| 4514 | 0 |   *this = DoubleAPFloat(semPPCDoubleDouble, Tmp.bitcastToAPInt()); | 
| 4515 | 0 |   return Ret; | 
| 4516 | 0 | } | 
| 4517 |  |  | 
| 4518 | 0 | APFloat::opStatus DoubleAPFloat::mod(const DoubleAPFloat &RHS) { | 
| 4519 | 0 |   assert(Semantics == &semPPCDoubleDouble && "Unexpected Semantics"); | 
| 4520 | 0 |   APFloat Tmp(semPPCDoubleDoubleLegacy, bitcastToAPInt()); | 
| 4521 | 0 |   auto Ret = Tmp.mod(APFloat(semPPCDoubleDoubleLegacy, RHS.bitcastToAPInt())); | 
| 4522 | 0 |   *this = DoubleAPFloat(semPPCDoubleDouble, Tmp.bitcastToAPInt()); | 
| 4523 | 0 |   return Ret; | 
| 4524 | 0 | } | 
| 4525 |  |  | 
| 4526 |  | APFloat::opStatus | 
| 4527 |  | DoubleAPFloat::fusedMultiplyAdd(const DoubleAPFloat &Multiplicand, | 
| 4528 |  |                                 const DoubleAPFloat &Addend, | 
| 4529 | 0 |                                 APFloat::roundingMode RM) { | 
| 4530 | 0 |   assert(Semantics == &semPPCDoubleDouble && "Unexpected Semantics"); | 
| 4531 | 0 |   APFloat Tmp(semPPCDoubleDoubleLegacy, bitcastToAPInt()); | 
| 4532 | 0 |   auto Ret = Tmp.fusedMultiplyAdd( | 
| 4533 | 0 |       APFloat(semPPCDoubleDoubleLegacy, Multiplicand.bitcastToAPInt()), | 
| 4534 | 0 |       APFloat(semPPCDoubleDoubleLegacy, Addend.bitcastToAPInt()), RM); | 
| 4535 | 0 |   *this = DoubleAPFloat(semPPCDoubleDouble, Tmp.bitcastToAPInt()); | 
| 4536 | 0 |   return Ret; | 
| 4537 | 0 | } | 
| 4538 |  |  | 
| 4539 | 0 | APFloat::opStatus DoubleAPFloat::roundToIntegral(APFloat::roundingMode RM) { | 
| 4540 | 0 |   assert(Semantics == &semPPCDoubleDouble && "Unexpected Semantics"); | 
| 4541 | 0 |   APFloat Tmp(semPPCDoubleDoubleLegacy, bitcastToAPInt()); | 
| 4542 | 0 |   auto Ret = Tmp.roundToIntegral(RM); | 
| 4543 | 0 |   *this = DoubleAPFloat(semPPCDoubleDouble, Tmp.bitcastToAPInt()); | 
| 4544 | 0 |   return Ret; | 
| 4545 | 0 | } | 
| 4546 |  |  | 
| 4547 | 0 | void DoubleAPFloat::changeSign() { | 
| 4548 | 0 |   Floats[0].changeSign(); | 
| 4549 | 0 |   Floats[1].changeSign(); | 
| 4550 | 0 | } | 
| 4551 |  |  | 
| 4552 |  | APFloat::cmpResult | 
| 4553 | 0 | DoubleAPFloat::compareAbsoluteValue(const DoubleAPFloat &RHS) const { | 
| 4554 | 0 |   auto Result = Floats[0].compareAbsoluteValue(RHS.Floats[0]); | 
| 4555 | 0 |   if (Result != cmpEqual) | 
| 4556 | 0 |     return Result; | 
| 4557 | 0 |   Result = Floats[1].compareAbsoluteValue(RHS.Floats[1]); | 
| 4558 | 0 |   if (Result == cmpLessThan || Result == cmpGreaterThan) { | 
| 4559 | 0 |     auto Against = Floats[0].isNegative() ^ Floats[1].isNegative(); | 
| 4560 | 0 |     auto RHSAgainst = RHS.Floats[0].isNegative() ^ RHS.Floats[1].isNegative(); | 
| 4561 | 0 |     if (Against && !RHSAgainst) | 
| 4562 | 0 |       return cmpLessThan; | 
| 4563 | 0 |     if (!Against && RHSAgainst) | 
| 4564 | 0 |       return cmpGreaterThan; | 
| 4565 | 0 |     if (!Against && !RHSAgainst) | 
| 4566 | 0 |       return Result; | 
| 4567 | 0 |     if (Against && RHSAgainst) | 
| 4568 | 0 |       return (cmpResult)(cmpLessThan + cmpGreaterThan - Result); | 
| 4569 | 0 |   } | 
| 4570 | 0 |   return Result; | 
| 4571 | 0 | } | 
| 4572 |  |  | 
| 4573 | 0 | APFloat::fltCategory DoubleAPFloat::getCategory() const { | 
| 4574 | 0 |   return Floats[0].getCategory(); | 
| 4575 | 0 | } | 
| 4576 |  |  | 
| 4577 | 0 | bool DoubleAPFloat::isNegative() const { return Floats[0].isNegative(); } | 
| 4578 |  |  | 
| 4579 | 0 | void DoubleAPFloat::makeInf(bool Neg) { | 
| 4580 | 0 |   Floats[0].makeInf(Neg); | 
| 4581 | 0 |   Floats[1].makeZero(/* Neg = */ false); | 
| 4582 | 0 | } | 
| 4583 |  |  | 
| 4584 | 0 | void DoubleAPFloat::makeZero(bool Neg) { | 
| 4585 | 0 |   Floats[0].makeZero(Neg); | 
| 4586 | 0 |   Floats[1].makeZero(/* Neg = */ false); | 
| 4587 | 0 | } | 
| 4588 |  |  | 
| 4589 | 0 | void DoubleAPFloat::makeLargest(bool Neg) { | 
| 4590 | 0 |   assert(Semantics == &semPPCDoubleDouble && "Unexpected Semantics"); | 
| 4591 | 0 |   Floats[0] = APFloat(semIEEEdouble, APInt(64, 0x7fefffffffffffffull)); | 
| 4592 | 0 |   Floats[1] = APFloat(semIEEEdouble, APInt(64, 0x7c8ffffffffffffeull)); | 
| 4593 | 0 |   if (Neg) | 
| 4594 | 0 |     changeSign(); | 
| 4595 | 0 | } | 
| 4596 |  |  | 
| 4597 | 0 | void DoubleAPFloat::makeSmallest(bool Neg) { | 
| 4598 | 0 |   assert(Semantics == &semPPCDoubleDouble && "Unexpected Semantics"); | 
| 4599 | 0 |   Floats[0].makeSmallest(Neg); | 
| 4600 | 0 |   Floats[1].makeZero(/* Neg = */ false); | 
| 4601 | 0 | } | 
| 4602 |  |  | 
| 4603 | 0 | void DoubleAPFloat::makeSmallestNormalized(bool Neg) { | 
| 4604 | 0 |   assert(Semantics == &semPPCDoubleDouble && "Unexpected Semantics"); | 
| 4605 | 0 |   Floats[0] = APFloat(semIEEEdouble, APInt(64, 0x0360000000000000ull)); | 
| 4606 | 0 |   if (Neg) | 
| 4607 | 0 |     Floats[0].changeSign(); | 
| 4608 | 0 |   Floats[1].makeZero(/* Neg = */ false); | 
| 4609 | 0 | } | 
| 4610 |  |  | 
| 4611 | 0 | void DoubleAPFloat::makeNaN(bool SNaN, bool Neg, const APInt *fill) { | 
| 4612 | 0 |   Floats[0].makeNaN(SNaN, Neg, fill); | 
| 4613 | 0 |   Floats[1].makeZero(/* Neg = */ false); | 
| 4614 | 0 | } | 
| 4615 |  |  | 
| 4616 | 0 | APFloat::cmpResult DoubleAPFloat::compare(const DoubleAPFloat &RHS) const { | 
| 4617 | 0 |   auto Result = Floats[0].compare(RHS.Floats[0]); | 
| 4618 | 0 |   // |Float[0]| > |Float[1]| | 
| 4619 | 0 |   if (Result == APFloat::cmpEqual) | 
| 4620 | 0 |     return Floats[1].compare(RHS.Floats[1]); | 
| 4621 | 0 |   return Result; | 
| 4622 | 0 | } | 
| 4623 |  |  | 
| 4624 | 0 | bool DoubleAPFloat::bitwiseIsEqual(const DoubleAPFloat &RHS) const { | 
| 4625 | 0 |   return Floats[0].bitwiseIsEqual(RHS.Floats[0]) && | 
| 4626 | 0 |          Floats[1].bitwiseIsEqual(RHS.Floats[1]); | 
| 4627 | 0 | } | 
| 4628 |  |  | 
| 4629 | 0 | hash_code hash_value(const DoubleAPFloat &Arg) { | 
| 4630 | 0 |   if (Arg.Floats) | 
| 4631 | 0 |     return hash_combine(hash_value(Arg.Floats[0]), hash_value(Arg.Floats[1])); | 
| 4632 | 0 |   return hash_combine(Arg.Semantics); | 
| 4633 | 0 | } | 
| 4634 |  |  | 
| 4635 | 0 | APInt DoubleAPFloat::bitcastToAPInt() const { | 
| 4636 | 0 |   assert(Semantics == &semPPCDoubleDouble && "Unexpected Semantics"); | 
| 4637 | 0 |   uint64_t Data[] = { | 
| 4638 | 0 |       Floats[0].bitcastToAPInt().getRawData()[0], | 
| 4639 | 0 |       Floats[1].bitcastToAPInt().getRawData()[0], | 
| 4640 | 0 |   }; | 
| 4641 | 0 |   return APInt(128, 2, Data); | 
| 4642 | 0 | } | 
| 4643 |  |  | 
| 4644 |  | Expected<APFloat::opStatus> DoubleAPFloat::convertFromString(StringRef S, | 
| 4645 | 0 |                                                              roundingMode RM) { | 
| 4646 | 0 |   assert(Semantics == &semPPCDoubleDouble && "Unexpected Semantics"); | 
| 4647 | 0 |   APFloat Tmp(semPPCDoubleDoubleLegacy); | 
| 4648 | 0 |   auto Ret = Tmp.convertFromString(S, RM); | 
| 4649 | 0 |   *this = DoubleAPFloat(semPPCDoubleDouble, Tmp.bitcastToAPInt()); | 
| 4650 | 0 |   return Ret; | 
| 4651 | 0 | } | 
| 4652 |  |  | 
| 4653 | 0 | APFloat::opStatus DoubleAPFloat::next(bool nextDown) { | 
| 4654 | 0 |   assert(Semantics == &semPPCDoubleDouble && "Unexpected Semantics"); | 
| 4655 | 0 |   APFloat Tmp(semPPCDoubleDoubleLegacy, bitcastToAPInt()); | 
| 4656 | 0 |   auto Ret = Tmp.next(nextDown); | 
| 4657 | 0 |   *this = DoubleAPFloat(semPPCDoubleDouble, Tmp.bitcastToAPInt()); | 
| 4658 | 0 |   return Ret; | 
| 4659 | 0 | } | 
| 4660 |  |  | 
| 4661 |  | APFloat::opStatus | 
| 4662 |  | DoubleAPFloat::convertToInteger(MutableArrayRef<integerPart> Input, | 
| 4663 |  |                                 unsigned int Width, bool IsSigned, | 
| 4664 | 0 |                                 roundingMode RM, bool *IsExact) const { | 
| 4665 | 0 |   assert(Semantics == &semPPCDoubleDouble && "Unexpected Semantics"); | 
| 4666 | 0 |   return APFloat(semPPCDoubleDoubleLegacy, bitcastToAPInt()) | 
| 4667 | 0 |       .convertToInteger(Input, Width, IsSigned, RM, IsExact); | 
| 4668 | 0 | } | 
| 4669 |  |  | 
| 4670 |  | APFloat::opStatus DoubleAPFloat::convertFromAPInt(const APInt &Input, | 
| 4671 |  |                                                   bool IsSigned, | 
| 4672 | 0 |                                                   roundingMode RM) { | 
| 4673 | 0 |   assert(Semantics == &semPPCDoubleDouble && "Unexpected Semantics"); | 
| 4674 | 0 |   APFloat Tmp(semPPCDoubleDoubleLegacy); | 
| 4675 | 0 |   auto Ret = Tmp.convertFromAPInt(Input, IsSigned, RM); | 
| 4676 | 0 |   *this = DoubleAPFloat(semPPCDoubleDouble, Tmp.bitcastToAPInt()); | 
| 4677 | 0 |   return Ret; | 
| 4678 | 0 | } | 
| 4679 |  |  | 
| 4680 |  | APFloat::opStatus | 
| 4681 |  | DoubleAPFloat::convertFromSignExtendedInteger(const integerPart *Input, | 
| 4682 |  |                                               unsigned int InputSize, | 
| 4683 | 0 |                                               bool IsSigned, roundingMode RM) { | 
| 4684 | 0 |   assert(Semantics == &semPPCDoubleDouble && "Unexpected Semantics"); | 
| 4685 | 0 |   APFloat Tmp(semPPCDoubleDoubleLegacy); | 
| 4686 | 0 |   auto Ret = Tmp.convertFromSignExtendedInteger(Input, InputSize, IsSigned, RM); | 
| 4687 | 0 |   *this = DoubleAPFloat(semPPCDoubleDouble, Tmp.bitcastToAPInt()); | 
| 4688 | 0 |   return Ret; | 
| 4689 | 0 | } | 
| 4690 |  |  | 
| 4691 |  | APFloat::opStatus | 
| 4692 |  | DoubleAPFloat::convertFromZeroExtendedInteger(const integerPart *Input, | 
| 4693 |  |                                               unsigned int InputSize, | 
| 4694 | 0 |                                               bool IsSigned, roundingMode RM) { | 
| 4695 | 0 |   assert(Semantics == &semPPCDoubleDouble && "Unexpected Semantics"); | 
| 4696 | 0 |   APFloat Tmp(semPPCDoubleDoubleLegacy); | 
| 4697 | 0 |   auto Ret = Tmp.convertFromZeroExtendedInteger(Input, InputSize, IsSigned, RM); | 
| 4698 | 0 |   *this = DoubleAPFloat(semPPCDoubleDouble, Tmp.bitcastToAPInt()); | 
| 4699 | 0 |   return Ret; | 
| 4700 | 0 | } | 
| 4701 |  |  | 
| 4702 |  | unsigned int DoubleAPFloat::convertToHexString(char *DST, | 
| 4703 |  |                                                unsigned int HexDigits, | 
| 4704 |  |                                                bool UpperCase, | 
| 4705 | 0 |                                                roundingMode RM) const { | 
| 4706 | 0 |   assert(Semantics == &semPPCDoubleDouble && "Unexpected Semantics"); | 
| 4707 | 0 |   return APFloat(semPPCDoubleDoubleLegacy, bitcastToAPInt()) | 
| 4708 | 0 |       .convertToHexString(DST, HexDigits, UpperCase, RM); | 
| 4709 | 0 | } | 
| 4710 |  |  | 
| 4711 | 0 | bool DoubleAPFloat::isDenormal() const { | 
| 4712 | 0 |   return getCategory() == fcNormal && | 
| 4713 | 0 |          (Floats[0].isDenormal() || Floats[1].isDenormal() || | 
| 4714 | 0 |           // (double)(Hi + Lo) == Hi defines a normal number. | 
| 4715 | 0 |           Floats[0] != Floats[0] + Floats[1]); | 
| 4716 | 0 | } | 
| 4717 |  |  | 
| 4718 | 0 | bool DoubleAPFloat::isSmallest() const { | 
| 4719 | 0 |   if (getCategory() != fcNormal) | 
| 4720 | 0 |     return false; | 
| 4721 | 0 |   DoubleAPFloat Tmp(*this); | 
| 4722 | 0 |   Tmp.makeSmallest(this->isNegative()); | 
| 4723 | 0 |   return Tmp.compare(*this) == cmpEqual; | 
| 4724 | 0 | } | 
| 4725 |  |  | 
| 4726 | 0 | bool DoubleAPFloat::isLargest() const { | 
| 4727 | 0 |   if (getCategory() != fcNormal) | 
| 4728 | 0 |     return false; | 
| 4729 | 0 |   DoubleAPFloat Tmp(*this); | 
| 4730 | 0 |   Tmp.makeLargest(this->isNegative()); | 
| 4731 | 0 |   return Tmp.compare(*this) == cmpEqual; | 
| 4732 | 0 | } | 
| 4733 |  |  | 
| 4734 |  | bool DoubleAPFloat::isInteger() const { | 
| 4735 |  |   assert(Semantics == &semPPCDoubleDouble && "Unexpected Semantics"); | 
| 4736 |  |   return Floats[0].isInteger() && Floats[1].isInteger(); | 
| 4737 |  | } | 
| 4738 |  |  | 
| 4739 |  | void DoubleAPFloat::toString(SmallVectorImpl<char> &Str, | 
| 4740 |  |                              unsigned FormatPrecision, | 
| 4741 |  |                              unsigned FormatMaxPadding, | 
| 4742 | 0 |                              bool TruncateZero) const { | 
| 4743 | 0 |   assert(Semantics == &semPPCDoubleDouble && "Unexpected Semantics"); | 
| 4744 | 0 |   APFloat(semPPCDoubleDoubleLegacy, bitcastToAPInt()) | 
| 4745 | 0 |       .toString(Str, FormatPrecision, FormatMaxPadding, TruncateZero); | 
| 4746 | 0 | } | 
| 4747 |  |  | 
| 4748 | 0 | bool DoubleAPFloat::getExactInverse(APFloat *inv) const { | 
| 4749 | 0 |   assert(Semantics == &semPPCDoubleDouble && "Unexpected Semantics"); | 
| 4750 | 0 |   APFloat Tmp(semPPCDoubleDoubleLegacy, bitcastToAPInt()); | 
| 4751 | 0 |   if (!inv) | 
| 4752 | 0 |     return Tmp.getExactInverse(nullptr); | 
| 4753 | 0 |   APFloat Inv(semPPCDoubleDoubleLegacy); | 
| 4754 | 0 |   auto Ret = Tmp.getExactInverse(&Inv); | 
| 4755 | 0 |   *inv = APFloat(semPPCDoubleDouble, Inv.bitcastToAPInt()); | 
| 4756 | 0 |   return Ret; | 
| 4757 | 0 | } | 
| 4758 |  |  | 
| 4759 | 0 | DoubleAPFloat scalbn(DoubleAPFloat Arg, int Exp, APFloat::roundingMode RM) { | 
| 4760 | 0 |   assert(Arg.Semantics == &semPPCDoubleDouble && "Unexpected Semantics"); | 
| 4761 | 0 |   return DoubleAPFloat(semPPCDoubleDouble, scalbn(Arg.Floats[0], Exp, RM), | 
| 4762 | 0 |                        scalbn(Arg.Floats[1], Exp, RM)); | 
| 4763 | 0 | } | 
| 4764 |  |  | 
| 4765 |  | DoubleAPFloat frexp(const DoubleAPFloat &Arg, int &Exp, | 
| 4766 | 0 |                     APFloat::roundingMode RM) { | 
| 4767 | 0 |   assert(Arg.Semantics == &semPPCDoubleDouble && "Unexpected Semantics"); | 
| 4768 | 0 |   APFloat First = frexp(Arg.Floats[0], Exp, RM); | 
| 4769 | 0 |   APFloat Second = Arg.Floats[1]; | 
| 4770 | 0 |   if (Arg.getCategory() == APFloat::fcNormal) | 
| 4771 | 0 |     Second = scalbn(Second, -Exp, RM); | 
| 4772 | 0 |   return DoubleAPFloat(semPPCDoubleDouble, std::move(First), std::move(Second)); | 
| 4773 | 0 | } | 
| 4774 |  |  | 
| 4775 |  | } // End detail namespace | 
| 4776 |  |  | 
| 4777 | 0 | APFloat::Storage::Storage(IEEEFloat F, const fltSemantics &Semantics) { | 
| 4778 | 0 |   if (usesLayout<IEEEFloat>(Semantics)) { | 
| 4779 | 0 |     new (&IEEE) IEEEFloat(std::move(F)); | 
| 4780 | 0 |     return; | 
| 4781 | 0 |   } | 
| 4782 | 0 |   if (usesLayout<DoubleAPFloat>(Semantics)) { | 
| 4783 | 0 |     const fltSemantics& S = F.getSemantics(); | 
| 4784 | 0 |     new (&Double) | 
| 4785 | 0 |         DoubleAPFloat(Semantics, APFloat(std::move(F), S), | 
| 4786 | 0 |                       APFloat(semIEEEdouble)); | 
| 4787 | 0 |     return; | 
| 4788 | 0 |   } | 
| 4789 | 0 |   llvm_unreachable("Unexpected semantics"); | 
| 4790 | 0 | } | 
| 4791 |  |  | 
| 4792 |  | Expected<APFloat::opStatus> APFloat::convertFromString(StringRef Str, | 
| 4793 | 0 |                                                        roundingMode RM) { | 
| 4794 | 0 |   APFLOAT_DISPATCH_ON_SEMANTICS(convertFromString(Str, RM)); | 
| 4795 | 0 | } | 
| 4796 |  |  | 
| 4797 | 0 | hash_code hash_value(const APFloat &Arg) { | 
| 4798 | 0 |   if (APFloat::usesLayout<detail::IEEEFloat>(Arg.getSemantics())) | 
| 4799 | 0 |     return hash_value(Arg.U.IEEE); | 
| 4800 | 0 |   if (APFloat::usesLayout<detail::DoubleAPFloat>(Arg.getSemantics())) | 
| 4801 | 0 |     return hash_value(Arg.U.Double); | 
| 4802 | 0 |   llvm_unreachable("Unexpected semantics"); | 
| 4803 | 0 | } | 
| 4804 |  |  | 
| 4805 |  | APFloat::APFloat(const fltSemantics &Semantics, StringRef S) | 
| 4806 | 0 |     : APFloat(Semantics) { | 
| 4807 | 0 |   auto StatusOrErr = convertFromString(S, rmNearestTiesToEven); | 
| 4808 | 0 |   assert(StatusOrErr && "Invalid floating point representation"); | 
| 4809 | 0 |   consumeError(StatusOrErr.takeError()); | 
| 4810 | 0 | } | 
| 4811 |  |  | 
| 4812 |  | APFloat::opStatus APFloat::convert(const fltSemantics &ToSemantics, | 
| 4813 | 0 |                                    roundingMode RM, bool *losesInfo) { | 
| 4814 | 0 |   if (&getSemantics() == &ToSemantics) { | 
| 4815 | 0 |     *losesInfo = false; | 
| 4816 | 0 |     return opOK; | 
| 4817 | 0 |   } | 
| 4818 | 0 |   if (usesLayout<IEEEFloat>(getSemantics()) && | 
| 4819 | 0 |       usesLayout<IEEEFloat>(ToSemantics)) | 
| 4820 | 0 |     return U.IEEE.convert(ToSemantics, RM, losesInfo); | 
| 4821 | 0 |   if (usesLayout<IEEEFloat>(getSemantics()) && | 
| 4822 | 0 |       usesLayout<DoubleAPFloat>(ToSemantics)) { | 
| 4823 | 0 |     assert(&ToSemantics == &semPPCDoubleDouble); | 
| 4824 | 0 |     auto Ret = U.IEEE.convert(semPPCDoubleDoubleLegacy, RM, losesInfo); | 
| 4825 | 0 |     *this = APFloat(ToSemantics, U.IEEE.bitcastToAPInt()); | 
| 4826 | 0 |     return Ret; | 
| 4827 | 0 |   } | 
| 4828 | 0 |   if (usesLayout<DoubleAPFloat>(getSemantics()) && | 
| 4829 | 0 |       usesLayout<IEEEFloat>(ToSemantics)) { | 
| 4830 | 0 |     auto Ret = getIEEE().convert(ToSemantics, RM, losesInfo); | 
| 4831 | 0 |     *this = APFloat(std::move(getIEEE()), ToSemantics); | 
| 4832 | 0 |     return Ret; | 
| 4833 | 0 |   } | 
| 4834 | 0 |   llvm_unreachable("Unexpected semantics"); | 
| 4835 | 0 | } | 
| 4836 |  |  | 
| 4837 |  | APFloat APFloat::getAllOnesValue(const fltSemantics &Semantics, | 
| 4838 | 0 |                                  unsigned BitWidth) { | 
| 4839 | 0 |   return APFloat(Semantics, APInt::getAllOnesValue(BitWidth)); | 
| 4840 | 0 | } | 
| 4841 |  |  | 
| 4842 | 0 | void APFloat::print(raw_ostream &OS) const { | 
| 4843 | 0 |   SmallVector<char, 16> Buffer; | 
| 4844 | 0 |   toString(Buffer); | 
| 4845 | 0 |   OS << Buffer << "\n"; | 
| 4846 | 0 | } | 
| 4847 |  |  | 
| 4848 |  | #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) | 
| 4849 | 0 | LLVM_DUMP_METHOD void APFloat::dump() const { print(dbgs()); } | 
| 4850 |  | #endif | 
| 4851 |  |  | 
| 4852 | 0 | void APFloat::Profile(FoldingSetNodeID &NID) const { | 
| 4853 | 0 |   NID.Add(bitcastToAPInt()); | 
| 4854 | 0 | } | 
| 4855 |  |  | 
| 4856 |  | /* Same as convertToInteger(integerPart*, ...), except the result is returned in | 
| 4857 |  |    an APSInt, whose initial bit-width and signed-ness are used to determine the | 
| 4858 |  |    precision of the conversion. | 
| 4859 |  |  */ | 
| 4860 |  | APFloat::opStatus APFloat::convertToInteger(APSInt &result, | 
| 4861 |  |                                             roundingMode rounding_mode, | 
| 4862 | 0 |                                             bool *isExact) const { | 
| 4863 | 0 |   unsigned bitWidth = result.getBitWidth(); | 
| 4864 | 0 |   SmallVector<uint64_t, 4> parts(result.getNumWords()); | 
| 4865 | 0 |   opStatus status = convertToInteger(parts, bitWidth, result.isSigned(), | 
| 4866 | 0 |                                      rounding_mode, isExact); | 
| 4867 | 0 |   // Keeps the original signed-ness. | 
| 4868 | 0 |   result = APInt(bitWidth, parts); | 
| 4869 | 0 |   return status; | 
| 4870 | 0 | } | 
| 4871 |  |  | 
| 4872 |  | } // End llvm namespace | 
| 4873 |  |  | 
| 4874 |  | #undef APFLOAT_DISPATCH_ON_SEMANTICS |