Add getSizeInBits function to the APFloat class

The newly added function returns the size of the specified floating
point semantics in bits.

Differential revision: http://reviews.llvm.org/D8413

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@241793 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Tamas Berghammer 2015-07-09 10:13:39 +00:00
parent b0205f5937
commit 6055ca7bf4
2 changed files with 19 additions and 8 deletions

View File

@ -276,6 +276,10 @@ public:
/// \param isIEEE - If 128 bit number, select between PPC and IEEE /// \param isIEEE - If 128 bit number, select between PPC and IEEE
static APFloat getAllOnesValue(unsigned BitWidth, bool isIEEE = false); static APFloat getAllOnesValue(unsigned BitWidth, bool isIEEE = false);
/// Returns the size of the floating point number (in bits) in the given
/// semantics.
static unsigned getSizeInBits(const fltSemantics &Sem);
/// @} /// @}
/// Used to insert APFloat objects, or objects that contain APFloat objects, /// Used to insert APFloat objects, or objects that contain APFloat objects,

View File

@ -52,14 +52,17 @@ namespace llvm {
/* Number of bits in the significand. This includes the integer /* Number of bits in the significand. This includes the integer
bit. */ bit. */
unsigned int precision; unsigned int precision;
/* Number of bits actually used in the semantics. */
unsigned int sizeInBits;
}; };
const fltSemantics APFloat::IEEEhalf = { 15, -14, 11 }; const fltSemantics APFloat::IEEEhalf = { 15, -14, 11, 16 };
const fltSemantics APFloat::IEEEsingle = { 127, -126, 24 }; const fltSemantics APFloat::IEEEsingle = { 127, -126, 24, 32 };
const fltSemantics APFloat::IEEEdouble = { 1023, -1022, 53 }; const fltSemantics APFloat::IEEEdouble = { 1023, -1022, 53, 64 };
const fltSemantics APFloat::IEEEquad = { 16383, -16382, 113 }; const fltSemantics APFloat::IEEEquad = { 16383, -16382, 113, 128 };
const fltSemantics APFloat::x87DoubleExtended = { 16383, -16382, 64 }; const fltSemantics APFloat::x87DoubleExtended = { 16383, -16382, 64, 80 };
const fltSemantics APFloat::Bogus = { 0, 0, 0 }; const fltSemantics APFloat::Bogus = { 0, 0, 0, 0 };
/* The PowerPC format consists of two doubles. It does not map cleanly /* The PowerPC format consists of two doubles. It does not map cleanly
onto the usual format above. It is approximated using twice the onto the usual format above. It is approximated using twice the
@ -72,7 +75,7 @@ namespace llvm {
to represent all possible values held by a PPC double-double number, to represent all possible values held by a PPC double-double number,
for example: (long double) 1.0 + (long double) 0x1p-106 for example: (long double) 1.0 + (long double) 0x1p-106
Should this be replaced by a full emulation of PPC double-double? */ Should this be replaced by a full emulation of PPC double-double? */
const fltSemantics APFloat::PPCDoubleDouble = { 1023, -1022 + 53, 53 + 53 }; const fltSemantics APFloat::PPCDoubleDouble = { 1023, -1022 + 53, 53 + 53, 128 };
/* A tight upper bound on number of parts required to hold the value /* A tight upper bound on number of parts required to hold the value
pow(5, power) is pow(5, power) is
@ -2416,7 +2419,7 @@ APFloat::roundSignificandWithExponent(const integerPart *decSigParts,
roundingMode rounding_mode) roundingMode rounding_mode)
{ {
unsigned int parts, pow5PartCount; unsigned int parts, pow5PartCount;
fltSemantics calcSemantics = { 32767, -32767, 0 }; fltSemantics calcSemantics = { 32767, -32767, 0, 0 };
integerPart pow5Parts[maxPowerOfFiveParts]; integerPart pow5Parts[maxPowerOfFiveParts];
bool isNearest; bool isNearest;
@ -3368,6 +3371,10 @@ APFloat::getAllOnesValue(unsigned BitWidth, bool isIEEE)
} }
} }
unsigned APFloat::getSizeInBits(const fltSemantics &Sem) {
return Sem.sizeInBits;
}
/// Make this number the largest magnitude normal number in the given /// Make this number the largest magnitude normal number in the given
/// semantics. /// semantics.
void APFloat::makeLargest(bool Negative) { void APFloat::makeLargest(bool Negative) {