aboutsummaryrefslogtreecommitdiff
path: root/lib/Support/APFloat.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Support/APFloat.cpp')
-rw-r--r--lib/Support/APFloat.cpp38
1 files changed, 38 insertions, 0 deletions
diff --git a/lib/Support/APFloat.cpp b/lib/Support/APFloat.cpp
index b61e6220a1..a0185ad51e 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,