[llvm-commits] (half precision) [llvm] r84239 - in /llvm/trunk: include/llvm/ADT/APFloat.h lib/Support/APFloat.cpp

Dale Johannesen dalej at apple.com
Tue Oct 20 17:23:17 PDT 2009


Some testcases to exercise basic functionality would be nice.  I think  
there is a bug here that should have shown up in testing.

On Oct 15, 2009, at 7:13 PM, Chris Lattner wrote:
> +APInt
> +APFloat::convertHalfAPFloatToAPInt() const
> +{
> +  assert(semantics == (const llvm::fltSemantics*)&IEEEhalf);
> +  assert (partCount()==1);
> +
> +  uint32_t myexponent, mysignificand;
> +
> +  if (category==fcNormal) {
> +    myexponent = exponent+15; //bias
> +    mysignificand = (uint32_t)*significandParts();
> +    if (myexponent == 1 && !(mysignificand & 0x400))
> +      myexponent = 0;   // denormal
> +  } else if (category==fcZero) {
> +    myexponent = 0;
> +    mysignificand = 0;
> +  } else if (category==fcInfinity) {
> +    myexponent = 0xff;

0x1f (doesn't matter functionally, but cleaner)

> +    mysignificand = 0;
> +  } else {
> +    assert(category == fcNaN && "Unknown category!");
> +    myexponent = 0xff;

0x1f

> +    mysignificand = (uint32_t)*significandParts();
> +  }
> +
> +  return APInt(16, (((sign&1) << 15) | ((myexponent&0x1f) << 10) |
> +                    (mysignificand & 0x3ff)));
> +}
> +



> +void
> +APFloat::initFromHalfAPInt(const APInt & api)
> +{
> +  assert(api.getBitWidth()==16);
> +  uint32_t i = (uint32_t)*api.getRawData();
> +  uint32_t myexponent = (i >> 15) & 0x1f;

Bug: should be >> 10

> +  uint32_t mysignificand = i & 0x3ff;
> +
> +  initialize(&APFloat::IEEEhalf);
> +  assert(partCount()==1);
> +
> +  sign = i >> 15;
> +  if (myexponent==0 && mysignificand==0) {
> +    // exponent, significand meaningless
> +    category = fcZero;
> +  } else if (myexponent==0x1f && mysignificand==0) {
> +    // exponent, significand meaningless
> +    category = fcInfinity;
> +  } else if (myexponent==0x1f && mysignificand!=0) {
> +    // sign, exponent, significand meaningless
> +    category = fcNaN;
> +    *significandParts() = mysignificand;
> +  } else {
> +    category = fcNormal;
> +    exponent = myexponent - 15;  //bias
> +    *significandParts() = mysignificand;
> +    if (myexponent==0)    // denormal
> +      exponent = -14;
> +    else
> +      *significandParts() |= 0x400; // integer bit
> +  }
> +}
> +
> /// Treat api as containing the bits of a floating point number.   
> Currently
> /// we infer the floating point type from the size of the APInt.  The
> /// isIEEE argument distinguishes between PPC128 and IEEE128 (not  
> meaningful
> @@ -3058,7 +3124,9 @@




More information about the llvm-commits mailing list