Oops, should be part of 41664; won't work very well without this piece.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@41665 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Support/APFloat.cpp b/lib/Support/APFloat.cpp
index b61e622..a0185ad 100644
--- a/lib/Support/APFloat.cpp
+++ b/lib/Support/APFloat.cpp
@@ -1065,6 +1065,20 @@
   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 @@
   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,