[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