Skip to content

Commit

Permalink
[ADT] Add basic operator overloads for arithmetic to APFloat to make
Browse files Browse the repository at this point in the history
code using it more readable.

Also add a copySign static function that works more like the standard
function by accepting the value and sign-carying value as arguments.

No interesting logic here, but tests added to cover the basic API
additions and make sure they do something plausible.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@219453 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
chandlerc committed Oct 9, 2014
1 parent a4554c2 commit 0ffdb31
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 0 deletions.
39 changes: 39 additions & 0 deletions include/llvm/ADT/APFloat.h
Original file line number Diff line number Diff line change
Expand Up @@ -304,6 +304,38 @@ class APFloat {
/// IEEE-754R 5.3.1: nextUp/nextDown.
opStatus next(bool nextDown);

/// \brief Operator+ overload which provides the default
/// \c nmNearestTiesToEven rounding mode and *no* error checking.
APFloat operator+(const APFloat &RHS) const {
APFloat Result = *this;
Result.add(RHS, rmNearestTiesToEven);
return Result;
}

/// \brief Operator- overload which provides the default
/// \c nmNearestTiesToEven rounding mode and *no* error checking.
APFloat operator-(const APFloat &RHS) const {
APFloat Result = *this;
Result.subtract(RHS, rmNearestTiesToEven);
return Result;
}

/// \brief Operator* overload which provides the default
/// \c nmNearestTiesToEven rounding mode and *no* error checking.
APFloat operator*(const APFloat &RHS) const {
APFloat Result = *this;
Result.multiply(RHS, rmNearestTiesToEven);
return Result;
}

/// \brief Operator/ overload which provides the default
/// \c nmNearestTiesToEven rounding mode and *no* error checking.
APFloat operator/(const APFloat &RHS) const {
APFloat Result = *this;
Result.divide(RHS, rmNearestTiesToEven);
return Result;
}

/// @}

/// \name Sign operations.
Expand All @@ -313,6 +345,13 @@ class APFloat {
void clearSign();
void copySign(const APFloat &);

/// \brief A static helper to produce a copy of an APFloat value with its sign
/// copied from some other APFloat.
static APFloat copySign(APFloat Value, const APFloat &Sign) {
Value.copySign(Sign);
return std::move(Value);
}

/// @}

/// \name Conversions
Expand Down
20 changes: 20 additions & 0 deletions unittests/ADT/APFloatTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1342,6 +1342,17 @@ TEST(APFloatTest, getZero) {
}
}

TEST(APFloatTest, copySign) {
EXPECT_TRUE(APFloat(-42.0).bitwiseIsEqual(
APFloat::copySign(APFloat(42.0), APFloat(-1.0))));
EXPECT_TRUE(APFloat(42.0).bitwiseIsEqual(
APFloat::copySign(APFloat(-42.0), APFloat(1.0))));
EXPECT_TRUE(APFloat(-42.0).bitwiseIsEqual(
APFloat::copySign(APFloat(-42.0), APFloat(-1.0))));
EXPECT_TRUE(APFloat(42.0).bitwiseIsEqual(
APFloat::copySign(APFloat(42.0), APFloat(1.0))));
}

TEST(APFloatTest, convert) {
bool losesInfo;
APFloat test(APFloat::IEEEdouble, "1.0");
Expand Down Expand Up @@ -2671,4 +2682,13 @@ TEST(APFloatTest, divide) {
}
}

TEST(APFloatTest, operatorOverloads) {
// This is mostly testing that these operator overloads compile.
APFloat One = APFloat(APFloat::IEEEsingle, "0x1p+0");
APFloat Two = APFloat(APFloat::IEEEsingle, "0x2p+0");
EXPECT_TRUE(Two.bitwiseIsEqual(One + One));
EXPECT_TRUE(One.bitwiseIsEqual(Two - One));
EXPECT_TRUE(Two.bitwiseIsEqual(One * Two));
EXPECT_TRUE(One.bitwiseIsEqual(Two / Two));
}
}

0 comments on commit 0ffdb31

Please sign in to comment.