From d76d97ffc9ba23e6eec30536c6f07756e08151f2 Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Mon, 19 Nov 2018 06:18:57 +0000 Subject: [PATCH] Single pass Vectorize Span.IndexOfAny(..., ReadOnlySpan) for 2,3 lengths (#20738) --- .../shared/System/MemoryExtensions.cs | 64 ++++++++++++++++--- 1 file changed, 54 insertions(+), 10 deletions(-) diff --git a/src/System.Private.CoreLib/shared/System/MemoryExtensions.cs b/src/System.Private.CoreLib/shared/System/MemoryExtensions.cs index 6145801faf..b146d2b14f 100644 --- a/src/System.Private.CoreLib/shared/System/MemoryExtensions.cs +++ b/src/System.Private.CoreLib/shared/System/MemoryExtensions.cs @@ -537,11 +537,32 @@ namespace System { if (typeof(T) == typeof(byte)) { - return SpanHelpers.IndexOfAny( - ref Unsafe.As(ref MemoryMarshal.GetReference(span)), - span.Length, - ref Unsafe.As(ref MemoryMarshal.GetReference(values)), - values.Length); + ref byte valueRef = ref Unsafe.As(ref MemoryMarshal.GetReference(values)); + if (values.Length == 2) + { + return SpanHelpers.IndexOfAny( + ref Unsafe.As(ref MemoryMarshal.GetReference(span)), + valueRef, + Unsafe.Add(ref valueRef, 1), + span.Length); + } + else if (values.Length == 3) + { + return SpanHelpers.IndexOfAny( + ref Unsafe.As(ref MemoryMarshal.GetReference(span)), + valueRef, + Unsafe.Add(ref valueRef, 1), + Unsafe.Add(ref valueRef, 2), + span.Length); + } + else + { + return SpanHelpers.IndexOfAny( + ref Unsafe.As(ref MemoryMarshal.GetReference(span)), + span.Length, + ref valueRef, + values.Length); + } } if (typeof(T) == typeof(char)) { @@ -666,11 +687,34 @@ namespace System where T : IEquatable { if (typeof(T) == typeof(byte)) - return SpanHelpers.IndexOfAny( - ref Unsafe.As(ref MemoryMarshal.GetReference(span)), - span.Length, - ref Unsafe.As(ref MemoryMarshal.GetReference(values)), - values.Length); + { + ref byte valueRef = ref Unsafe.As(ref MemoryMarshal.GetReference(values)); + if (values.Length == 2) + { + return SpanHelpers.IndexOfAny( + ref Unsafe.As(ref MemoryMarshal.GetReference(span)), + valueRef, + Unsafe.Add(ref valueRef, 1), + span.Length); + } + else if (values.Length == 3) + { + return SpanHelpers.IndexOfAny( + ref Unsafe.As(ref MemoryMarshal.GetReference(span)), + valueRef, + Unsafe.Add(ref valueRef, 1), + Unsafe.Add(ref valueRef, 2), + span.Length); + } + else + { + return SpanHelpers.IndexOfAny( + ref Unsafe.As(ref MemoryMarshal.GetReference(span)), + span.Length, + ref valueRef, + values.Length); + } + } if (typeof(T) == typeof(char)) { -- 2.34.1