mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-02-12 21:28:48 +00:00
Fix APFloat mod sign
fmod specification requires the sign of the remainder is the same as numerator in case remainder is zero. Reviewers: gottesmm, scanon, arsenm, davide, craig.topper Reviewed By: scanon Subscribers: wdng, llvm-commits Differential Revision: https://reviews.llvm.org/D39225 llvm-svn: 317081
This commit is contained in:
parent
82f0c42dad
commit
f2c2851efe
@ -1743,6 +1743,7 @@ IEEEFloat::opStatus IEEEFloat::remainder(const IEEEFloat &rhs) {
|
||||
IEEEFloat::opStatus IEEEFloat::mod(const IEEEFloat &rhs) {
|
||||
opStatus fs;
|
||||
fs = modSpecials(rhs);
|
||||
unsigned int origSign = sign;
|
||||
|
||||
while (isFiniteNonZero() && rhs.isFiniteNonZero() &&
|
||||
compareAbsoluteValue(rhs) != cmpLessThan) {
|
||||
@ -1754,6 +1755,8 @@ IEEEFloat::opStatus IEEEFloat::mod(const IEEEFloat &rhs) {
|
||||
fs = subtract(V, rmNearestTiesToEven);
|
||||
assert(fs==opOK);
|
||||
}
|
||||
if (isZero())
|
||||
sign = origSign; // fmod requires this
|
||||
return fs;
|
||||
}
|
||||
|
||||
|
@ -3289,6 +3289,20 @@ TEST(APFloatTest, mod) {
|
||||
EXPECT_EQ(f1.mod(f2), APFloat::opInvalidOp);
|
||||
EXPECT_TRUE(f1.isNaN());
|
||||
}
|
||||
{
|
||||
APFloat f1(APFloat::IEEEdouble(), "-4.0");
|
||||
APFloat f2(APFloat::IEEEdouble(), "-2.0");
|
||||
APFloat expected(APFloat::IEEEdouble(), "-0.0");
|
||||
EXPECT_EQ(f1.mod(f2), APFloat::opOK);
|
||||
EXPECT_TRUE(f1.bitwiseIsEqual(expected));
|
||||
}
|
||||
{
|
||||
APFloat f1(APFloat::IEEEdouble(), "-4.0");
|
||||
APFloat f2(APFloat::IEEEdouble(), "2.0");
|
||||
APFloat expected(APFloat::IEEEdouble(), "-0.0");
|
||||
EXPECT_EQ(f1.mod(f2), APFloat::opOK);
|
||||
EXPECT_TRUE(f1.bitwiseIsEqual(expected));
|
||||
}
|
||||
}
|
||||
|
||||
TEST(APFloatTest, PPCDoubleDoubleAddSpecial) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user