Use TZCNT and LZCNT for Locate{First|Last}Found{Byte|Char} by benaadams 路 Pull Request #21073 路 dotnet/coreclr (original) (raw)
A fitting conclusion to the Saga of Ben's Magic Number; the days of CPU intrinsics in C# are upon us 馃槂
*Further improved by #22118
Used by
string.IndexOf(char value) string.IndexOf(char value, int startIndex) string.IndexOf(char value, int startIndex, int count)
string.IndexOfAny(char[] anyOf) // anyOf.lengths 2,3,4,5 string.IndexOfAny(char[] anyOf, int startIndex) // anyOf.lengths 2,3,4,5 string.IndexOfAny(char[] anyOf, int startIndex, int count) // anyOf.lengths 2,3,4,5
// where T : byte, char IndexOf(this Span span, T value) IndexOf(this Span span, ReadOnlySpan value) IndexOf(this ReadOnlySpan span, ReadOnlySpan value) IndexOfAny(this Span span, T value0, T value1) IndexOfAny(this Span span, T value0, T value1, T value2) IndexOfAny(this Span span, ReadOnlySpan values) IndexOfAny(this ReadOnlySpan span, T value) IndexOfAny(this ReadOnlySpan span, T value0, T value1) IndexOfAny(this ReadOnlySpan span, T value0, T value1, T value2) IndexOfAny(this ReadOnlySpan span, ReadOnlySpan values)
string.LastIndexOf(char value) string.LastIndexOf(char value, int startIndex) string.LastIndexOf(char value, int startIndex, int count)
// where T : byte, char LastIndexOf(this Span span, T value) LastIndexOf(this Span span, ReadOnlySpan value) LastIndexOf(this ReadOnlySpan span, ReadOnlySpan value) LastIndexOfAny(this Span span, T value0, T value1) LastIndexOfAny(this Span span, T value0, T value1, T value2) LastIndexOfAny(this Span span, ReadOnlySpan values) LastIndexOfAny(this ReadOnlySpan span, T value) LastIndexOfAny(this ReadOnlySpan span, T value0, T value1) LastIndexOfAny(this ReadOnlySpan span, T value0, T value1, T value2) LastIndexOfAny(this ReadOnlySpan span, ReadOnlySpan values)
With #21076 (merged) is additionally used by
// where comparisonType == StringComparison.Ordinal string.IndexOf(string value, StringComparison comparisonType) string.IndexOf(string value, int startIndex, StringComparison comparisonType) string.IndexOf(string value, int startIndex, int count, StringComparison comparisonType)
// where T : char IndexOf(this Span span, ReadOnlySpan value) IndexOf(this ReadOnlySpan span, ReadOnlySpan value)
// where comparisonType == StringComparison.Ordinal IndexOf(this ReadOnlySpan span, ReadOnlySpan value, StringComparison comparisonType)
// where options = CompareOptions.Ordinal CompareInfo.IndexOf(string source, string value, CompareOptions options) CompareInfo.IndexOf(string source, string value, int startIndex, CompareOptions options) CompareInfo.IndexOf(string source, string value, int startIndex, int count, CompareOptions options)
With #21116 (merged) is additionally used by
// where T : byte, char Array.IndexOf(T[] array, T value) Array.IndexOf(T[] array, T value, int startIndex) Array.IndexOf(T[] array, T value, int startIndex, int count) Array.LastIndexOf(T[] array, T value) Array.LastIndexOf(T[] array, T value, int startIndex) Array.LastIndexOf(T[] array, T value, int startIndex, int count)
From #20738 (comment)
Mostly whitespace changes https://github.com/dotnet/coreclr/pull/21073/files?w=1