summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Support
diff options
context:
space:
mode:
authorTim Shen <timshen91@gmail.com>2016-10-27 21:54:29 +0000
committerTim Shen <timshen91@gmail.com>2016-10-27 21:54:29 +0000
commit414b0155c446afef1d5d0b8cc6677970f043d7cc (patch)
tree071aabba3bf31aabeed836374514c5c979e86674 /llvm/lib/Support
parentbcfb0802e28fe25bb58a9c0ef101471c2246378d (diff)
downloadbcm5719-llvm-414b0155c446afef1d5d0b8cc6677970f043d7cc.tar.gz
bcm5719-llvm-414b0155c446afef1d5d0b8cc6677970f043d7cc.zip
Revert "[APFloat] Add DoubleAPFloat mode to APFloat. NFC."
This reverts r285351, since it breaks the build. llvm-svn: 285354
Diffstat (limited to 'llvm/lib/Support')
-rw-r--r--llvm/lib/Support/APFloat.cpp174
1 files changed, 59 insertions, 115 deletions
diff --git a/llvm/lib/Support/APFloat.cpp b/llvm/lib/Support/APFloat.cpp
index 05afa06a552..5a9e9833b04 100644
--- a/llvm/lib/Support/APFloat.cpp
+++ b/llvm/lib/Support/APFloat.cpp
@@ -75,18 +75,8 @@ namespace llvm {
to represent all possible values held by a PPC double-double number,
for example: (long double) 1.0 + (long double) 0x1p-106
Should this be replaced by a full emulation of PPC double-double? */
- const fltSemantics APFloatBase::PPCDoubleDouble = {0, 0, 0, 0};
-
- /* There are temporary semantics for the real PPCDoubleDouble implementation.
- Currently, APFloat of PPCDoubleDouble holds one PPCDoubleDoubleImpl as the
- high part of double double, and one IEEEdouble as the low part, so that
- the old operations operate on PPCDoubleDoubleImpl, while the newly added
- operations also populate the IEEEdouble.
-
- TODO: Once all functions support DoubleAPFloat mode, we'll change all
- PPCDoubleDoubleImpl to IEEEdouble and remove PPCDoubleDoubleImpl. */
- static const fltSemantics PPCDoubleDoubleImpl = {1023, -1022 + 53, 53 + 53,
- 128};
+ const fltSemantics APFloatBase::PPCDoubleDouble = {1023, -1022 + 53, 53 + 53,
+ 128};
/* A tight upper bound on number of parts required to hold the value
pow(5, power) is
@@ -687,6 +677,13 @@ void IEEEFloat::makeNaN(bool SNaN, bool Negative, const APInt *fill) {
APInt::tcSetBit(significand, QNaNBit + 1);
}
+IEEEFloat IEEEFloat::makeNaN(const fltSemantics &Sem, bool SNaN, bool Negative,
+ const APInt *fill) {
+ IEEEFloat value(Sem, uninitialized);
+ value.makeNaN(SNaN, Negative, fill);
+ return value;
+}
+
IEEEFloat &IEEEFloat::operator=(const IEEEFloat &rhs) {
if (this != &rhs) {
if (semantics != rhs.semantics) {
@@ -823,6 +820,11 @@ IEEEFloat::IEEEFloat(const fltSemantics &ourSemantics, uninitializedTag tag) {
initialize(&ourSemantics);
}
+IEEEFloat::IEEEFloat(const fltSemantics &ourSemantics, StringRef text) {
+ initialize(&ourSemantics);
+ convertFromString(text, rmNearestTiesToEven);
+}
+
IEEEFloat::IEEEFloat(const IEEEFloat &rhs) {
initialize(rhs.semantics);
assign(rhs);
@@ -2364,8 +2366,7 @@ IEEEFloat::roundSignificandWithExponent(const integerPart *decSigParts,
excessPrecision = calcSemantics.precision - semantics->precision;
truncatedBits = excessPrecision;
- IEEEFloat decSig(calcSemantics, uninitialized);
- decSig.makeZero(sign);
+ IEEEFloat decSig = IEEEFloat::getZero(calcSemantics, sign);
IEEEFloat pow5(calcSemantics);
sigStatus = decSig.convertFromUnsignedParts(decSigParts, sigPartCount,
@@ -2820,7 +2821,7 @@ APInt IEEEFloat::convertF80LongDoubleAPFloatToAPInt() const {
}
APInt IEEEFloat::convertPPCDoubleDoubleAPFloatToAPInt() const {
- assert(semantics == (const llvm::fltSemantics *)&PPCDoubleDoubleImpl);
+ assert(semantics == (const llvm::fltSemantics*)&PPCDoubleDouble);
assert(partCount()==2);
uint64_t words[2];
@@ -3001,7 +3002,7 @@ APInt IEEEFloat::bitcastToAPInt() const {
if (semantics == (const llvm::fltSemantics*)&IEEEquad)
return convertQuadrupleAPFloatToAPInt();
- if (semantics == (const llvm::fltSemantics *)&PPCDoubleDoubleImpl)
+ if (semantics == (const llvm::fltSemantics*)&PPCDoubleDouble)
return convertPPCDoubleDoubleAPFloatToAPInt();
assert(semantics == (const llvm::fltSemantics*)&x87DoubleExtended &&
@@ -3071,14 +3072,14 @@ void IEEEFloat::initFromPPCDoubleDoubleAPInt(const APInt &api) {
// Get the first double and convert to our format.
initFromDoubleAPInt(APInt(64, i1));
- fs = convert(PPCDoubleDoubleImpl, rmNearestTiesToEven, &losesInfo);
+ fs = convert(PPCDoubleDouble, rmNearestTiesToEven, &losesInfo);
assert(fs == opOK && !losesInfo);
(void)fs;
// Unless we have a special case, add in second double.
if (isFiniteNonZero()) {
IEEEFloat v(IEEEdouble, APInt(64, i2));
- fs = v.convert(PPCDoubleDoubleImpl, rmNearestTiesToEven, &losesInfo);
+ fs = v.convert(PPCDoubleDouble, rmNearestTiesToEven, &losesInfo);
assert(fs == opOK && !losesInfo);
(void)fs;
@@ -3232,13 +3233,13 @@ void IEEEFloat::initFromAPInt(const fltSemantics *Sem, const APInt &api) {
return initFromF80LongDoubleAPInt(api);
if (Sem == &IEEEquad)
return initFromQuadrupleAPInt(api);
- if (Sem == &PPCDoubleDoubleImpl)
+ if (Sem == &PPCDoubleDouble)
return initFromPPCDoubleDoubleAPInt(api);
llvm_unreachable(nullptr);
}
-IEEEFloat IEEEFloat::getAllOnesValue(unsigned BitWidth) {
+IEEEFloat IEEEFloat::getAllOnesValue(unsigned BitWidth, bool isIEEE) {
switch (BitWidth) {
case 16:
return IEEEFloat(IEEEhalf, APInt::getAllOnesValue(BitWidth));
@@ -3249,7 +3250,9 @@ IEEEFloat IEEEFloat::getAllOnesValue(unsigned BitWidth) {
case 80:
return IEEEFloat(x87DoubleExtended, APInt::getAllOnesValue(BitWidth));
case 128:
- return IEEEFloat(IEEEquad, APInt::getAllOnesValue(BitWidth));
+ if (isIEEE)
+ return IEEEFloat(IEEEquad, APInt::getAllOnesValue(BitWidth));
+ return IEEEFloat(PPCDoubleDouble, APInt::getAllOnesValue(BitWidth));
default:
llvm_unreachable("Unknown floating bit width");
}
@@ -3293,18 +3296,43 @@ void IEEEFloat::makeSmallest(bool Negative) {
APInt::tcSet(significandParts(), 1, partCount());
}
-void IEEEFloat::makeSmallestNormalized(bool Negative) {
+IEEEFloat IEEEFloat::getLargest(const fltSemantics &Sem, bool Negative) {
+ // We want (in interchange format):
+ // sign = {Negative}
+ // exponent = 1..10
+ // significand = 1..1
+ IEEEFloat Val(Sem, uninitialized);
+ Val.makeLargest(Negative);
+ return Val;
+}
+
+IEEEFloat IEEEFloat::getSmallest(const fltSemantics &Sem, bool Negative) {
+ // We want (in interchange format):
+ // sign = {Negative}
+ // exponent = 0..0
+ // significand = 0..01
+ IEEEFloat Val(Sem, uninitialized);
+ Val.makeSmallest(Negative);
+ return Val;
+}
+
+IEEEFloat IEEEFloat::getSmallestNormalized(const fltSemantics &Sem,
+ bool Negative) {
+ IEEEFloat Val(Sem, uninitialized);
+
// We want (in interchange format):
// sign = {Negative}
// exponent = 0..0
// significand = 10..0
- category = fcNormal;
- zeroSignificand();
- sign = Negative;
- exponent = semantics->minExponent;
- significandParts()[partCountForBits(semantics->precision) - 1] |=
- (((integerPart)1) << ((semantics->precision - 1) % integerPartWidth));
+ Val.category = fcNormal;
+ Val.zeroSignificand();
+ Val.sign = Negative;
+ Val.exponent = Sem.minExponent;
+ Val.significandParts()[partCountForBits(Sem.precision)-1] |=
+ (((integerPart) 1) << ((Sem.precision - 1) % integerPartWidth));
+
+ return Val;
}
IEEEFloat::IEEEFloat(const fltSemantics &Sem, const APInt &API) {
@@ -3840,99 +3868,15 @@ IEEEFloat frexp(const IEEEFloat &Val, int &Exp, IEEEFloat::roundingMode RM) {
return scalbn(Val, -Exp, RM);
}
-DoubleAPFloat::DoubleAPFloat(const fltSemantics &S)
- : Semantics(&S), Floats(new APFloat[2]{APFloat(PPCDoubleDoubleImpl),
- APFloat(IEEEdouble)}) {
- assert(Semantics == &PPCDoubleDouble);
-}
-
-DoubleAPFloat::DoubleAPFloat(const fltSemantics &S, uninitializedTag)
- : Semantics(&S),
- Floats(new APFloat[2]{APFloat(PPCDoubleDoubleImpl, uninitialized),
- APFloat(IEEEdouble, uninitialized)}) {
- assert(Semantics == &PPCDoubleDouble);
-}
-
-DoubleAPFloat::DoubleAPFloat(const fltSemantics &S, integerPart I)
- : Semantics(&S), Floats(new APFloat[2]{APFloat(PPCDoubleDoubleImpl, I),
- APFloat(IEEEdouble)}) {
- assert(Semantics == &PPCDoubleDouble);
-}
-
-DoubleAPFloat::DoubleAPFloat(const fltSemantics &S, const APInt &I)
- : Semantics(&S), Floats(new APFloat[2]{APFloat(PPCDoubleDoubleImpl, I),
- APFloat(IEEEdouble)}) {
- assert(Semantics == &PPCDoubleDouble);
-}
-
-DoubleAPFloat::DoubleAPFloat(const fltSemantics &S, APFloat &&First,
- APFloat &&Second)
- : Semantics(&S),
- Floats(new APFloat[2]{std::move(First), std::move(Second)}) {
- assert(Semantics == &PPCDoubleDouble);
- // TODO Check for First == &IEEEdouble once the transition is done.
- assert(&Floats[0].getSemantics() == &PPCDoubleDoubleImpl);
- assert(&Floats[1].getSemantics() == &IEEEdouble);
-}
-
-DoubleAPFloat::DoubleAPFloat(const DoubleAPFloat &RHS)
- : Semantics(RHS.Semantics),
- Floats(new APFloat[2]{APFloat(RHS.Floats[0]), APFloat(RHS.Floats[1])}) {
- assert(Semantics == &PPCDoubleDouble);
-}
-
-DoubleAPFloat::DoubleAPFloat(DoubleAPFloat &&RHS)
- : Semantics(RHS.Semantics), Floats(std::move(RHS.Floats)) {
- RHS.Semantics = &Bogus;
- assert(Semantics == &PPCDoubleDouble);
-}
-
-DoubleAPFloat &DoubleAPFloat::operator=(const DoubleAPFloat &RHS) {
- if (Semantics == RHS.Semantics) {
- Floats[0] = RHS.Floats[0];
- Floats[1] = RHS.Floats[1];
- } else if (this != &RHS) {
- this->~DoubleAPFloat();
- new (this) DoubleAPFloat(RHS);
- }
- return *this;
-}
-
} // End detail namespace
APFloat::opStatus APFloat::convertFromString(StringRef Str, roundingMode RM) {
- return getIEEE().convertFromString(Str, RM);
+ return IEEE.convertFromString(Str, RM);
}
-hash_code hash_value(const APFloat &Arg) { return hash_value(Arg.getIEEE()); }
+hash_code hash_value(const APFloat &Arg) { return hash_value(Arg.IEEE); }
APFloat::APFloat(const fltSemantics &Semantics, StringRef S)
- : APFloat(Semantics) {
- convertFromString(S, rmNearestTiesToEven);
-}
-
-APFloat::opStatus APFloat::convert(const fltSemantics &ToSemantics,
- roundingMode RM, bool *losesInfo) {
- if (&getSemantics() == &ToSemantics)
- return opOK;
- if (usesLayout<IEEEFloat>(getSemantics()) &&
- usesLayout<IEEEFloat>(ToSemantics)) {
- return U.IEEE.convert(ToSemantics, RM, losesInfo);
- } else if (usesLayout<IEEEFloat>(getSemantics()) &&
- usesLayout<DoubleAPFloat>(ToSemantics)) {
- assert(&ToSemantics == &PPCDoubleDouble);
- auto Ret = U.IEEE.convert(PPCDoubleDoubleImpl, RM, losesInfo);
- *this = APFloat(
- DoubleAPFloat(PPCDoubleDouble, std::move(*this), APFloat(IEEEdouble)));
- return Ret;
- } else if (usesLayout<DoubleAPFloat>(getSemantics()) &&
- usesLayout<IEEEFloat>(ToSemantics)) {
- auto Ret = getIEEE().convert(ToSemantics, RM, losesInfo);
- *this = APFloat(std::move(getIEEE()));
- return Ret;
- } else {
- llvm_unreachable("Unexpected semantics");
- }
-}
+ : APFloat(IEEEFloat(Semantics, S)) {}
} // End llvm namespace
OpenPOWER on IntegriCloud