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