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