[llvm-commits] [PATCH] Add an APFloat::convertToInt(APSInt) function (issue4738043)

Chris Lattner clattner at apple.com
Thu Jul 14 17:52:33 PDT 2011


On Jul 14, 2011, at 5:05 PM, jyasskin at gmail.com wrote:

> Reviewers: llvm-commits_cs.uiuc.edu,
> 
> Message:
> Initial diff at
> http://codereview.appspot.com/download/issue4738043_1.diff.
> 
> Description:
> Add an APFloat::convertToInt(APSInt) function that automatically manages
> the memory for the result.

Looks reasonable, only comment is that you don't need to mark bitWidth/status as 'const':

Please commit,

-Chris

> +APFloat::convertToInteger(APSInt &result,
> +                          roundingMode rounding_mode, bool *isExact) const
> +{
> +  const unsigned bitWidth = result.getBitWidth();
> +  SmallVector<uint64_t, 4> parts(result.getNumWords());
> +  const opStatus status = convertToInteger(
> +    parts.data(), bitWidth, result.isSigned(), rounding_mode, isExact);
> +  // Keeps the original signed-ness.
> +  result = APInt(bitWidth, parts.size(), parts.data());
> +  return status;
> +}
> +
>  /* Convert an unsigned integer SRC to a floating point number,
>     rounding according to ROUNDING_MODE.  The sign of the floating
>     point number is not modified.  */
> Index: unittests/ADT/APFloatTest.cpp
> diff --git a/unittests/ADT/APFloatTest.cpp b/unittests/ADT/APFloatTest.cpp
> index  
> 5f05b861693326e3fb3513d48423d033e919ff7e..08ac2a05254a54fcc1077104ae6645288426d20c  
> 100644
> --- a/unittests/ADT/APFloatTest.cpp
> +++ b/unittests/ADT/APFloatTest.cpp
> @@ -12,6 +12,7 @@
>  #include "llvm/Support/raw_ostream.h"
>  #include "gtest/gtest.h"
>  #include "llvm/ADT/APFloat.h"
> +#include "llvm/ADT/APSInt.h"
>  #include "llvm/ADT/SmallString.h"
>  #include "llvm/ADT/SmallVector.h"
> 
> @@ -344,6 +345,54 @@ TEST(APFloatTest, toString) {
>    ASSERT_EQ("8.731834E+2", convertToString(873.1834, 0, 0));
>  }
> 
> +TEST(APFloatTest, toInteger) {
> +  bool isExact = false;
> +  APSInt result(5, /*isUnsigned=*/true);
> +
> +  EXPECT_EQ(APFloat::opOK,
> +            APFloat(APFloat::IEEEdouble, "10")
> +            .convertToInteger(result, APFloat::rmTowardZero, &isExact));
> +  EXPECT_TRUE(isExact);
> +  EXPECT_EQ(APSInt(APInt(5, 10), true), result);
> +
> +  EXPECT_EQ(APFloat::opInvalidOp,
> +            APFloat(APFloat::IEEEdouble, "-10")
> +            .convertToInteger(result, APFloat::rmTowardZero, &isExact));
> +  EXPECT_FALSE(isExact);
> +  EXPECT_EQ(APSInt::getMinValue(5, true), result);
> +
> +  EXPECT_EQ(APFloat::opInvalidOp,
> +            APFloat(APFloat::IEEEdouble, "32")
> +            .convertToInteger(result, APFloat::rmTowardZero, &isExact));
> +  EXPECT_FALSE(isExact);
> +  EXPECT_EQ(APSInt::getMaxValue(5, true), result);
> +
> +  EXPECT_EQ(APFloat::opInexact,
> +            APFloat(APFloat::IEEEdouble, "7.9")
> +            .convertToInteger(result, APFloat::rmTowardZero, &isExact));
> +  EXPECT_FALSE(isExact);
> +  EXPECT_EQ(APSInt(APInt(5, 7), true), result);
> +
> +  result.setIsUnsigned(false);
> +  EXPECT_EQ(APFloat::opOK,
> +            APFloat(APFloat::IEEEdouble, "-10")
> +            .convertToInteger(result, APFloat::rmTowardZero, &isExact));
> +  EXPECT_TRUE(isExact);
> +  EXPECT_EQ(APSInt(APInt(5, -10, true), false), result);
> +
> +  EXPECT_EQ(APFloat::opInvalidOp,
> +            APFloat(APFloat::IEEEdouble, "-17")
> +            .convertToInteger(result, APFloat::rmTowardZero, &isExact));
> +  EXPECT_FALSE(isExact);
> +  EXPECT_EQ(APSInt::getMinValue(5, false), result);
> +
> +  EXPECT_EQ(APFloat::opInvalidOp,
> +            APFloat(APFloat::IEEEdouble, "16")
> +            .convertToInteger(result, APFloat::rmTowardZero, &isExact));
> +  EXPECT_FALSE(isExact);
> +  EXPECT_EQ(APSInt::getMaxValue(5, false), result);
> +}
> +
>  static APInt nanbits(const fltSemantics &Sem,
>                       bool SNaN, bool Negative, uint64_t fill) {
>    APInt apfill(64, fill);
> 
> 
> _______________________________________________
> 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