[llvm-commits] [llvm] r85318 - in /llvm/trunk: include/llvm/ADT/APFloat.h lib/Support/APFloat.cpp
Dale Johannesen
dalej at apple.com
Tue Oct 27 14:50:56 PDT 2009
On Oct 27, 2009, at 2:35 PMPDT, Evan Cheng wrote:
> Author: evancheng
> Date: Tue Oct 27 16:35:42 2009
> New Revision: 85318
>
> URL: http://llvm.org/viewvc/llvm-project?rev=85318&view=rev
> Log:
> Add new APFloat methods that return sign, exp, and mantissa of ieee
> float and double values.
Why do you want to do this? I think there's a good case for keeping
these representation details local to APFloat.
> Modified:
> llvm/trunk/include/llvm/ADT/APFloat.h
> llvm/trunk/lib/Support/APFloat.cpp
>
> Modified: llvm/trunk/include/llvm/ADT/APFloat.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/APFloat.h?rev=85318&r1=85317&r2=85318&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- llvm/trunk/include/llvm/ADT/APFloat.h (original)
> +++ llvm/trunk/include/llvm/ADT/APFloat.h Tue Oct 27 16:35:42 2009
> @@ -277,6 +277,13 @@
> /* Return an arbitrary integer value usable for hashing. */
> uint32_t getHashValue() const;
>
> + /// getIEEEFloatParts / getIEEEDoubleParts - Return exponent,
> significant,
> + /// and sign bit of an IEEE float / IEEE double value.
> + void getIEEEFloatParts(bool &Sign, uint32_t &Exp,
> + uint32_t &Significant) const;
> + void getIEEEDoubleParts(bool &Sign, uint64_t &Exp,
> + uint64_t &Significant) const;
> +
> private:
>
> /* Trivial queries. */
>
> Modified: llvm/trunk/lib/Support/APFloat.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/APFloat.cpp?rev=85318&r1=85317&r2=85318&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- llvm/trunk/lib/Support/APFloat.cpp (original)
> +++ llvm/trunk/lib/Support/APFloat.cpp Tue Oct 27 16:35:42 2009
> @@ -421,7 +421,7 @@
> unsigned int count, partBits;
> integerPart part, boundary;
>
> - assert (bits != 0);
> + assert(bits != 0);
>
> bits--;
> count = bits / integerPartWidth;
> @@ -537,7 +537,7 @@
> {
> unsigned int result = count;
>
> - assert (count != 0 && count <= integerPartWidth / 4);
> + assert(count != 0 && count <= integerPartWidth / 4);
>
> part >>= (integerPartWidth - 4 * count);
> while (count--) {
> @@ -760,7 +760,7 @@
> {
> assert(category == fcNormal || category == fcNaN);
>
> - if(partCount() > 1)
> + if (partCount() > 1)
> return significand.parts;
> else
> return &significand.part;
> @@ -2289,8 +2289,8 @@
>
> /* Both multiplySignificand and divideSignificand return the
> result with the integer bit set. */
> - assert (APInt::tcExtractBit
> - (decSig.significandParts(), calcSemantics.precision -
> 1) == 1);
> + assert(APInt::tcExtractBit
> + (decSig.significandParts(), calcSemantics.precision - 1)
> == 1);
>
> HUerr = HUerrBound(calcLostFraction != lfExactlyZero, sigStatus !
> = opOK,
> powHUerr);
> @@ -2593,7 +2593,7 @@
> q--;
> *q = hexDigitChars[hexDigitValue (*q) + 1];
> } while (*q == '0');
> - assert (q >= p);
> + assert(q >= p);
> } else {
> /* Add trailing zeroes. */
> memset (dst, '0', outputDigits);
> @@ -2632,6 +2632,56 @@
> }
> }
>
> +void APFloat::getIEEEFloatParts(bool &Sign, uint32_t &Exp,
> + uint32_t &Significand) const {
> + assert(semantics == (const llvm::fltSemantics*)&IEEEsingle &&
> + "Float semantics are not IEEEsingle");
> + assert(partCount()==1);
> +
> + if (category == fcNormal) {
> + Exp = exponent+127; // bias
> + Significand = (uint32_t)*significandParts();
> + if (Exp == 1 && !(Significand & 0x800000))
> + Exp = 0; // denormal
> + } else if (category==fcZero) {
> + Exp = 0;
> + Significand = 0;
> + } else if (category==fcInfinity) {
> + Exp = 0xff;
> + Significand = 0;
> + } else {
> + assert(category == fcNaN && "Unknown category!");
> + Exp = 0xff;
> + Significand = (uint32_t)*significandParts();
> + }
> + Sign = sign;
> +}
> +
> +void APFloat::getIEEEDoubleParts(bool &Sign, uint64_t &Exp,
> + uint64_t &Significand) const {
> + assert(semantics == (const llvm::fltSemantics*)&IEEEdouble &&
> + "Float semantics are not IEEEdouble");
> + assert(partCount()==1);
> +
> + if (category == fcNormal) {
> + Exp = exponent+1023; // bias
> + Significand = *significandParts();
> + if (Exp == 1 && !(Significand & 0x10000000000000LL))
> + Exp = 0; // denormal
> + } else if (category==fcZero) {
> + Exp = 0;
> + Significand = 0;
> + } else if (category==fcInfinity) {
> + Exp = 0x7ff;
> + Significand = 0;
> + } else {
> + assert(category == fcNaN && "Unknown category!");
> + Exp = 0x7ff;
> + Significand = *significandParts();
> + }
> + Sign = sign;
> +}
> +
> // Conversion from APFloat to/from host float/double. It may
> eventually be
> // possible to eliminate these and have everybody deal with
> APFloats, but that
> // will take a while. This approach will not easily extend to long
> double.
> @@ -2645,7 +2695,7 @@
> APFloat::convertF80LongDoubleAPFloatToAPInt() const
> {
> assert(semantics == (const llvm::fltSemantics*)&x87DoubleExtended);
> - assert (partCount()==2);
> + assert(partCount()==2);
>
> uint64_t myexponent, mysignificand;
>
> @@ -2677,7 +2727,7 @@
> APFloat::convertPPCDoubleDoubleAPFloatToAPInt() const
> {
> assert(semantics == (const llvm::fltSemantics*)&PPCDoubleDouble);
> - assert (partCount()==2);
> + assert(partCount()==2);
>
> uint64_t myexponent, mysignificand, myexponent2, mysignificand2;
>
> @@ -2722,7 +2772,7 @@
> APFloat::convertQuadrupleAPFloatToAPInt() const
> {
> assert(semantics == (const llvm::fltSemantics*)&IEEEquad);
> - assert (partCount()==2);
> + assert(partCount()==2);
>
> uint64_t myexponent, mysignificand, mysignificand2;
>
> @@ -2758,7 +2808,7 @@
> APFloat::convertDoubleAPFloatToAPInt() const
> {
> assert(semantics == (const llvm::fltSemantics*)&IEEEdouble);
> - assert (partCount()==1);
> + assert(partCount()==1);
>
> uint64_t myexponent, mysignificand;
>
> @@ -2788,7 +2838,7 @@
> APFloat::convertFloatAPFloatToAPInt() const
> {
> assert(semantics == (const llvm::fltSemantics*)&IEEEsingle);
> - assert (partCount()==1);
> + assert(partCount()==1);
>
> uint32_t myexponent, mysignificand;
>
> @@ -2817,7 +2867,7 @@
> APFloat::convertHalfAPFloatToAPInt() const
> {
> assert(semantics == (const llvm::fltSemantics*)&IEEEhalf);
> - assert (partCount()==1);
> + assert(partCount()==1);
>
> uint32_t myexponent, mysignificand;
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list