[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:00:21 PDT 2009


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.

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
>




More information about the llvm-commits mailing list