Oops, should be part of 41664; won't work very well without this piece.
authorDale Johannesen <dalej@apple.com>
Fri, 31 Aug 2007 23:35:31 +0000 (23:35 +0000)
committerDale Johannesen <dalej@apple.com>
Fri, 31 Aug 2007 23:35:31 +0000 (23:35 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@41665 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Support/APFloat.cpp

index b61e6220a11201476e7d5c774a5001116c494b96..a0185ad51e8d20a139c9e1efae715a832e4f7f73 100644 (file)
@@ -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,