From b336f6207c072457faa64d0544af5b3ac885b124 Mon Sep 17 00:00:00 2001 From: Dale Johannesen Date: Fri, 31 Aug 2007 23:35:31 +0000 Subject: [PATCH] Oops, should be part of 41664; won't work very well without this piece. llvm-svn: 41665 --- lib/Support/APFloat.cpp | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/lib/Support/APFloat.cpp b/lib/Support/APFloat.cpp index b61e6220a11..a0185ad51e8 100644 --- a/lib/Support/APFloat.cpp +++ b/lib/Support/APFloat.cpp @@ -1065,6 +1065,20 @@ APFloat::changeSign() sign = !sign; } +void +APFloat::clearSign() +{ + /* So is this one. */ + sign = 0; +} + +void +APFloat::copySign(const APFloat &rhs) +{ + /* And this one. */ + sign = rhs.sign; +} + /* Normalized addition or subtraction. */ APFloat::opStatus APFloat::addOrSubtract(const APFloat &rhs, roundingMode rounding_mode, @@ -1148,6 +1162,30 @@ APFloat::divide(const APFloat &rhs, roundingMode rounding_mode) return fs; } +/* Normalized remainder. */ +APFloat::opStatus +APFloat::mod(const APFloat &rhs, roundingMode rounding_mode) +{ + opStatus fs; + APFloat V = *this; + fs = V.divide(rhs, rmNearestTiesToEven); + if (fs == opDivByZero) + return fs; + + integerPart x; + fs = V.convertToInteger(&x, integerPartWidth, true, rmNearestTiesToEven); + if (fs==opInvalidOp) + return fs; + + fs = V.convertFromInteger(&x, integerPartWidth, true, rmNearestTiesToEven); + assert(fs==opOK); // should always work + fs = V.multiply(rhs, rounding_mode); + assert(fs==opOK); // should not overflow or underflow + fs = subtract(V, rounding_mode); + assert(fs==opOK); + return fs; +} + /* Normalized fused-multiply-add. */ APFloat::opStatus APFloat::fusedMultiplyAdd(const APFloat &multiplicand,