diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2015-08-07 23:01:33 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2015-08-07 23:01:33 +0000 | 
| commit | ee8648bdac07986a0f1ec897b02ec82a2f144d46 (patch) | |
| tree | 52d1861acda1205241ee35a94aa63129c604d469 /include/llvm/ADT | |
| parent | 1a82d4c088707c791c792f6822f611b47a12bdfe (diff) | |
Diffstat (limited to 'include/llvm/ADT')
| -rw-r--r-- | include/llvm/ADT/APFloat.h | 4 | ||||
| -rw-r--r-- | include/llvm/ADT/Triple.h | 16 | ||||
| -rw-r--r-- | include/llvm/ADT/edit_distance.h | 45 | 
3 files changed, 43 insertions, 22 deletions
diff --git a/include/llvm/ADT/APFloat.h b/include/llvm/ADT/APFloat.h index 958e3fdaea14..76615affb253 100644 --- a/include/llvm/ADT/APFloat.h +++ b/include/llvm/ADT/APFloat.h @@ -276,6 +276,10 @@ public:    /// \param isIEEE   - If 128 bit number, select between PPC and IEEE    static APFloat getAllOnesValue(unsigned BitWidth, bool isIEEE = false); +  /// Returns the size of the floating point number (in bits) in the given +  /// semantics. +  static unsigned getSizeInBits(const fltSemantics &Sem); +    /// @}    /// Used to insert APFloat objects, or objects that contain APFloat objects, diff --git a/include/llvm/ADT/Triple.h b/include/llvm/ADT/Triple.h index 06f5870119c8..947812d94ecb 100644 --- a/include/llvm/ADT/Triple.h +++ b/include/llvm/ADT/Triple.h @@ -569,6 +569,22 @@ public:    ///          architecture if no such variant can be found.    llvm::Triple get64BitArchVariant() const; +  /// Form a triple with a big endian variant of the current architecture. +  /// +  /// This can be used to move across "families" of architectures where useful. +  /// +  /// \returns A new triple with a big endian architecture or an unknown +  ///          architecture if no such variant can be found. +  llvm::Triple getBigEndianArchVariant() const; + +  /// Form a triple with a little endian variant of the current architecture. +  /// +  /// This can be used to move across "families" of architectures where useful. +  /// +  /// \returns A new triple with a little endian architecture or an unknown +  ///          architecture if no such variant can be found. +  llvm::Triple getLittleEndianArchVariant() const; +    /// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.    ///    /// \param Arch the architecture name (e.g., "armv7s"). If it is an empty diff --git a/include/llvm/ADT/edit_distance.h b/include/llvm/ADT/edit_distance.h index c2b2041242aa..06a01b18a9fb 100644 --- a/include/llvm/ADT/edit_distance.h +++ b/include/llvm/ADT/edit_distance.h @@ -50,50 +50,51 @@ unsigned ComputeEditDistance(ArrayRef<T> FromArray, ArrayRef<T> ToArray,    //   http://en.wikipedia.org/wiki/Levenshtein_distance    //    // Although the algorithm is typically described using an m x n -  // array, only two rows are used at a time, so this implementation -  // just keeps two separate vectors for those two rows. +  // array, only one row plus one element are used at a time, so this +  // implementation just keeps one vector for the row.  To update one entry, +  // only the entries to the left, top, and top-left are needed.  The left +  // entry is in Row[x-1], the top entry is what's in Row[x] from the last +  // iteration, and the top-left entry is stored in Previous.    typename ArrayRef<T>::size_type m = FromArray.size();    typename ArrayRef<T>::size_type n = ToArray.size();    const unsigned SmallBufferSize = 64;    unsigned SmallBuffer[SmallBufferSize];    std::unique_ptr<unsigned[]> Allocated; -  unsigned *Previous = SmallBuffer; -  if (2*(n + 1) > SmallBufferSize) { -    Previous = new unsigned [2*(n+1)]; -    Allocated.reset(Previous); +  unsigned *Row = SmallBuffer; +  if (n + 1 > SmallBufferSize) { +    Row = new unsigned[n + 1]; +    Allocated.reset(Row);    } -  unsigned *Current = Previous + (n + 1); -  for (unsigned i = 0; i <= n; ++i) -    Previous[i] = i; +  for (unsigned i = 1; i <= n; ++i) +    Row[i] = i;    for (typename ArrayRef<T>::size_type y = 1; y <= m; ++y) { -    Current[0] = y; -    unsigned BestThisRow = Current[0]; +    Row[0] = y; +    unsigned BestThisRow = Row[0]; +    unsigned Previous = y - 1;      for (typename ArrayRef<T>::size_type x = 1; x <= n; ++x) { +      int OldRow = Row[x];        if (AllowReplacements) { -        Current[x] = std::min( -            Previous[x-1] + (FromArray[y-1] == ToArray[x-1] ? 0u : 1u), -            std::min(Current[x-1], Previous[x])+1); +        Row[x] = std::min( +            Previous + (FromArray[y-1] == ToArray[x-1] ? 0u : 1u), +            std::min(Row[x-1], Row[x])+1);        }        else { -        if (FromArray[y-1] == ToArray[x-1]) Current[x] = Previous[x-1]; -        else Current[x] = std::min(Current[x-1], Previous[x]) + 1; +        if (FromArray[y-1] == ToArray[x-1]) Row[x] = Previous; +        else Row[x] = std::min(Row[x-1], Row[x]) + 1;        } -      BestThisRow = std::min(BestThisRow, Current[x]); +      Previous = OldRow; +      BestThisRow = std::min(BestThisRow, Row[x]);      }      if (MaxEditDistance && BestThisRow > MaxEditDistance)        return MaxEditDistance + 1; - -    unsigned *tmp = Current; -    Current = Previous; -    Previous = tmp;    } -  unsigned Result = Previous[n]; +  unsigned Result = Row[n];    return Result;  }  | 
