diff options
author | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2014-06-23 17:47:40 +0000 |
---|---|---|
committer | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2014-06-23 17:47:40 +0000 |
commit | 18a301e5788cbc7f0e1bcc2567d3a1d76fb4bf2a (patch) | |
tree | 630d1bfd42752004df3a1e0f4db0c9aabab86739 /include | |
parent | 88a564f55ee92e2ffe916d8d69271308d05479d1 (diff) | |
download | llvm-18a301e5788cbc7f0e1bcc2567d3a1d76fb4bf2a.tar.gz llvm-18a301e5788cbc7f0e1bcc2567d3a1d76fb4bf2a.tar.bz2 llvm-18a301e5788cbc7f0e1bcc2567d3a1d76fb4bf2a.tar.xz |
Support: Extract ScaledNumbers::compare()
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@211507 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include')
-rw-r--r-- | include/llvm/Analysis/BlockFrequencyInfoImpl.h | 38 | ||||
-rw-r--r-- | include/llvm/Support/ScaledNumber.h | 34 |
2 files changed, 37 insertions, 35 deletions
diff --git a/include/llvm/Analysis/BlockFrequencyInfoImpl.h b/include/llvm/Analysis/BlockFrequencyInfoImpl.h index 7944af9533..054f26b182 100644 --- a/include/llvm/Analysis/BlockFrequencyInfoImpl.h +++ b/include/llvm/Analysis/BlockFrequencyInfoImpl.h @@ -66,19 +66,6 @@ public: return IsNeg ? INT64_MIN : INT64_MAX; return IsNeg ? -int64_t(U) : int64_t(U); } - - static int compare(uint64_t L, uint64_t R, int Shift) { - assert(Shift >= 0); - assert(Shift < 64); - - uint64_t L_adjusted = L >> Shift; - if (L_adjusted < R) - return -1; - if (L_adjusted > R) - return 1; - - return L > L_adjusted << Shift ? 1 : 0; - } }; /// \brief Simple representation of an unsigned floating point. @@ -289,7 +276,9 @@ public: return joinSigned(scaleByInverse(Unsigned.first), Unsigned.second); } - int compare(const UnsignedFloat &X) const; + int compare(const UnsignedFloat &X) const { + return ScaledNumbers::compare(Digits, Exponent, X.Digits, X.Exponent); + } int compareTo(uint64_t N) const { UnsignedFloat Float = getFloat(N); int Compare = compare(Float); @@ -605,27 +594,6 @@ void UnsignedFloat<DigitsT>::shiftRight(int32_t Shift) { return; } -template <class DigitsT> -int UnsignedFloat<DigitsT>::compare(const UnsignedFloat &X) const { - // Check for zero. - if (isZero()) - return X.isZero() ? 0 : -1; - if (X.isZero()) - return 1; - - // Check for the scale. Use lgFloor to be sure that the exponent difference - // is always lower than 64. - int32_t lgL = lgFloor(), lgR = X.lgFloor(); - if (lgL != lgR) - return lgL < lgR ? -1 : 1; - - // Compare digits. - if (Exponent < X.Exponent) - return UnsignedFloatBase::compare(Digits, X.Digits, X.Exponent - Exponent); - - return -UnsignedFloatBase::compare(X.Digits, Digits, Exponent - X.Exponent); -} - template <class T> struct isPodLike<UnsignedFloat<T>> { static const bool value = true; }; diff --git a/include/llvm/Support/ScaledNumber.h b/include/llvm/Support/ScaledNumber.h index 1acc4b1b16..6a93623a8e 100644 --- a/include/llvm/Support/ScaledNumber.h +++ b/include/llvm/Support/ScaledNumber.h @@ -227,6 +227,40 @@ template <class DigitsT> int32_t getLgCeiling(DigitsT Digits, int16_t Scale) { return Lg.first + (Lg.second < 0); } +/// \brief Implementation for comparing scaled numbers. +/// +/// Compare two 64-bit numbers with different scales. Given that the scale of +/// \c L is higher than that of \c R by \c ScaleDiff, compare them. Return -1, +/// 1, and 0 for less than, greater than, and equal, respectively. +/// +/// \pre 0 <= ScaleDiff < 64. +int compareImpl(uint64_t L, uint64_t R, int ScaleDiff); + +/// \brief Compare two scaled numbers. +/// +/// Compare two scaled numbers. Returns 0 for equal, -1 for less than, and 1 +/// for greater than. +template <class DigitsT> +int compare(DigitsT LDigits, int16_t LScale, DigitsT RDigits, int16_t RScale) { + // Check for zero. + if (!LDigits) + return RDigits ? -1 : 0; + if (!RDigits) + return 1; + + // Check for the scale. Use getLgFloor to be sure that the scale difference + // is always lower than 64. + int32_t lgL = getLgFloor(LDigits, LScale), lgR = getLgFloor(RDigits, RScale); + if (lgL != lgR) + return lgL < lgR ? -1 : 1; + + // Compare digits. + if (LScale < RScale) + return compareImpl(LDigits, RDigits, RScale - LScale); + + return -compareImpl(RDigits, LDigits, LScale - RScale); +} + } // end namespace ScaledNumbers } // end namespace llvm |