diff --git a/llvm/include/llvm/ADT/APFloat.h b/llvm/include/llvm/ADT/APFloat.h --- a/llvm/include/llvm/ADT/APFloat.h +++ b/llvm/include/llvm/ADT/APFloat.h @@ -1036,6 +1036,13 @@ APFLOAT_DISPATCH_ON_SEMANTICS(next(nextDown)); } + /// Negate an APFloat. + APFloat operator-() const { + APFloat Result(*this); + Result.changeSign(); + return Result; + } + /// Add two APFloats, rounding ties to the nearest even. /// No error checking. APFloat operator+(const APFloat &RHS) const { diff --git a/llvm/unittests/ADT/APFloatTest.cpp b/llvm/unittests/ADT/APFloatTest.cpp --- a/llvm/unittests/ADT/APFloatTest.cpp +++ b/llvm/unittests/ADT/APFloatTest.cpp @@ -2990,6 +2990,17 @@ EXPECT_TRUE(Inf.bitwiseIsEqual(neg(NegInf))); EXPECT_TRUE(NegQNaN.bitwiseIsEqual(neg(QNaN))); EXPECT_TRUE(QNaN.bitwiseIsEqual(neg(NegQNaN))); + + EXPECT_TRUE(NegOne.bitwiseIsEqual(-One)); + EXPECT_TRUE(One.bitwiseIsEqual(-NegOne)); + EXPECT_TRUE(NegZero.bitwiseIsEqual(-Zero)); + EXPECT_TRUE(Zero.bitwiseIsEqual(-NegZero)); + EXPECT_TRUE(NegInf.bitwiseIsEqual(-Inf)); + EXPECT_TRUE(Inf.bitwiseIsEqual(-NegInf)); + EXPECT_TRUE(NegInf.bitwiseIsEqual(-Inf)); + EXPECT_TRUE(Inf.bitwiseIsEqual(-NegInf)); + EXPECT_TRUE(NegQNaN.bitwiseIsEqual(-QNaN)); + EXPECT_TRUE(QNaN.bitwiseIsEqual(-NegQNaN)); } TEST(APFloatTest, ilogb) {