[llvm] r211552 - Support: Return scale from ScaledNumbers::matchScales()

Duncan P. N. Exon Smith dexonsmith at apple.com
Mon Jun 23 16:14:51 PDT 2014


Author: dexonsmith
Date: Mon Jun 23 18:14:51 2014
New Revision: 211552

URL: http://llvm.org/viewvc/llvm-project?rev=211552&view=rev
Log:
Support: Return scale from ScaledNumbers::matchScales()

This will be convenient when extracting `ScaledNumbers::getSum()`.

Modified:
    llvm/trunk/include/llvm/Support/ScaledNumber.h
    llvm/trunk/unittests/Support/ScaledNumberTest.cpp

Modified: llvm/trunk/include/llvm/Support/ScaledNumber.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/ScaledNumber.h?rev=211552&r1=211551&r2=211552&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Support/ScaledNumber.h (original)
+++ llvm/trunk/include/llvm/Support/ScaledNumber.h Mon Jun 23 18:14:51 2014
@@ -271,28 +271,30 @@ int compare(DigitsT LDigits, int16_t LSc
 /// losing precision only when necessary.
 ///
 /// If the output value of \c LDigits (\c RDigits) is \c 0, the output value of
-/// \c LScale (\c RScale) is unspecified.  If both \c LDigits and \c RDigits
-/// are \c 0, the output value is one of \c LScale and \c RScale; which is
-/// unspecified.
+/// \c LScale (\c RScale) is unspecified.
+///
+/// As a convenience, returns the matching scale.  If the output value of one
+/// number is zero, returns the scale of the other.  If both are zero, which
+/// scale is returned is unspecifed.
 template <class DigitsT>
-void matchScales(DigitsT &LDigits, int16_t &LScale, DigitsT &RDigits,
-                 int16_t &RScale) {
+int16_t matchScales(DigitsT &LDigits, int16_t &LScale, DigitsT &RDigits,
+                    int16_t &RScale) {
   static_assert(!std::numeric_limits<DigitsT>::is_signed, "expected unsigned");
 
-  if (LScale < RScale) {
+  if (LScale < RScale)
     // Swap arguments.
-    matchScales(RDigits, RScale, LDigits, LScale);
-    return;
-  }
-  if (!LDigits || !RDigits || LScale == RScale)
-    return;
+    return matchScales(RDigits, RScale, LDigits, LScale);
+  if (!LDigits)
+    return RScale;
+  if (!RDigits || LScale == RScale)
+    return LScale;
 
   // Now LScale > RScale.  Get the difference.
   int32_t ScaleDiff = int32_t(LScale) - RScale;
   if (ScaleDiff >= 2 * getWidth<DigitsT>()) {
     // Don't bother shifting.  RDigits will get zero-ed out anyway.
     RDigits = 0;
-    return;
+    return LScale;
   }
 
   // Shift LDigits left as much as possible, then shift RDigits right.
@@ -303,7 +305,7 @@ void matchScales(DigitsT &LDigits, int16
   if (ShiftR >= getWidth<DigitsT>()) {
     // Don't bother shifting.  RDigits will get zero-ed out anyway.
     RDigits = 0;
-    return;
+    return LScale;
   }
 
   LDigits <<= ShiftL;
@@ -312,6 +314,7 @@ void matchScales(DigitsT &LDigits, int16
   LScale -= ShiftL;
   RScale += ShiftR;
   assert(LScale == RScale && "scales should match");
+  return LScale;
 }
 
 } // end namespace ScaledNumbers

Modified: llvm/trunk/unittests/Support/ScaledNumberTest.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Support/ScaledNumberTest.cpp?rev=211552&r1=211551&r2=211552&view=diff
==============================================================================
--- llvm/trunk/unittests/Support/ScaledNumberTest.cpp (original)
+++ llvm/trunk/unittests/Support/ScaledNumberTest.cpp Mon Jun 23 18:14:51 2014
@@ -336,7 +336,7 @@ TEST(ScaledNumberHelpersTest, matchScale
     int16_t RSx = RSIn;                                                        \
     int16_t Sy = SOut;                                                         \
                                                                                \
-    matchScales(LDx, LSx, RDx, RSx);                                           \
+    EXPECT_EQ(SOut, matchScales(LDx, LSx, RDx, RSx));                          \
     EXPECT_EQ(LDy, LDx);                                                       \
     EXPECT_EQ(RDy, RDx);                                                       \
     if (LDy)                                                                   \





More information about the llvm-commits mailing list