mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-25 12:50:00 +00:00
[ADT] Add basic operator overloads for arithmetic to APFloat to make
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
This commit is contained in:
parent
a4554c2897
commit
0ffdb31af0
@ -304,6 +304,38 @@ public:
|
|||||||
/// IEEE-754R 5.3.1: nextUp/nextDown.
|
/// IEEE-754R 5.3.1: nextUp/nextDown.
|
||||||
opStatus next(bool 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.
|
/// \name Sign operations.
|
||||||
@ -313,6 +345,13 @@ public:
|
|||||||
void clearSign();
|
void clearSign();
|
||||||
void copySign(const APFloat &);
|
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
|
/// \name Conversions
|
||||||
|
@ -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) {
|
TEST(APFloatTest, convert) {
|
||||||
bool losesInfo;
|
bool losesInfo;
|
||||||
APFloat test(APFloat::IEEEdouble, "1.0");
|
APFloat test(APFloat::IEEEdouble, "1.0");
|
||||||
@ -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));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user