[llvm-commits] [llvm] r85318 - in /llvm/trunk: include/llvm/ADT/APFloat.h lib/Support/APFloat.cpp
Evan Cheng
evan.cheng at apple.com
Tue Oct 27 15:21:23 PDT 2009
On Oct 27, 2009, at 3:00 PM, Evan Cheng wrote:
>
> On Oct 27, 2009, at 2:50 PM, Dale Johannesen wrote:
>
>>
>> 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.
>
> ARM has instructions that can materialize some of the fp immediates.
> It has to examine the parts to determine if an fp immediate can be
> encoded.
What I have checked in so far is wrong. I'm fixing it now. Please
scrutinize my next commit carefully. :-)
Evan
>
> Evan
>
>>
>>> 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
>>
>
> _______________________________________________
> 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