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