Skip to content

Commit

Permalink
Reduce overhead of calling into SearchValues (#86046)
Browse files Browse the repository at this point in the history
  • Loading branch information
MihaZupan authored May 15, 2023
1 parent 47e493e commit 80ffe5c
Show file tree
Hide file tree
Showing 5 changed files with 380 additions and 372 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,14 @@ namespace System.Buffers
{
internal sealed class AnyByteSearchValues : SearchValues<byte>
{
private readonly Vector128<byte> _bitmap0;
private readonly Vector128<byte> _bitmap1;
private Vector512<byte> _bitmaps;
private readonly BitVector256 _lookup;

public AnyByteSearchValues(ReadOnlySpan<byte> values) =>
IndexOfAnyAsciiSearcher.ComputeBitmap256(values, out _bitmap0, out _bitmap1, out _lookup);
public AnyByteSearchValues(ReadOnlySpan<byte> values)
{
IndexOfAnyAsciiSearcher.ComputeBitmap256(values, out Vector256<byte> bitmap0, out Vector256<byte> bitmap1, out _lookup);
_bitmaps = Vector512.Create(bitmap0, bitmap1);
}

internal override byte[] GetValues() => _lookup.GetByteValues();

Expand Down Expand Up @@ -43,7 +45,7 @@ private int IndexOfAny<TNegator>(ref byte searchSpace, int searchSpaceLength)
where TNegator : struct, IndexOfAnyAsciiSearcher.INegator
{
return IndexOfAnyAsciiSearcher.IsVectorizationSupported && searchSpaceLength >= sizeof(ulong)
? IndexOfAnyAsciiSearcher.IndexOfAnyVectorized<TNegator>(ref searchSpace, searchSpaceLength, _bitmap0, _bitmap1)
? IndexOfAnyAsciiSearcher.IndexOfAnyVectorizedAnyByte<TNegator>(ref searchSpace, searchSpaceLength, ref _bitmaps)
: IndexOfAnyScalar<TNegator>(ref searchSpace, searchSpaceLength);
}

Expand All @@ -52,7 +54,7 @@ private int LastIndexOfAny<TNegator>(ref byte searchSpace, int searchSpaceLength
where TNegator : struct, IndexOfAnyAsciiSearcher.INegator
{
return IndexOfAnyAsciiSearcher.IsVectorizationSupported && searchSpaceLength >= sizeof(ulong)
? IndexOfAnyAsciiSearcher.LastIndexOfAnyVectorized<TNegator>(ref searchSpace, searchSpaceLength, _bitmap0, _bitmap1)
? IndexOfAnyAsciiSearcher.LastIndexOfAnyVectorizedAnyByte<TNegator>(ref searchSpace, searchSpaceLength, ref _bitmaps)
: LastIndexOfAnyScalar<TNegator>(ref searchSpace, searchSpaceLength);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ namespace System.Buffers
{
internal sealed class AsciiByteSearchValues : SearchValues<byte>
{
private readonly Vector128<byte> _bitmap;
private Vector256<byte> _bitmap;
private readonly BitVector256 _lookup;

public AsciiByteSearchValues(ReadOnlySpan<byte> values) =>
Expand Down Expand Up @@ -42,7 +42,7 @@ private int IndexOfAny<TNegator>(ref byte searchSpace, int searchSpaceLength)
where TNegator : struct, IndexOfAnyAsciiSearcher.INegator
{
return IndexOfAnyAsciiSearcher.IsVectorizationSupported && searchSpaceLength >= sizeof(ulong)
? IndexOfAnyAsciiSearcher.IndexOfAnyVectorized<TNegator>(ref searchSpace, searchSpaceLength, _bitmap)
? IndexOfAnyAsciiSearcher.IndexOfAnyVectorized<TNegator>(ref searchSpace, searchSpaceLength, ref _bitmap)
: IndexOfAnyScalar<TNegator>(ref searchSpace, searchSpaceLength);
}

Expand All @@ -51,7 +51,7 @@ private int LastIndexOfAny<TNegator>(ref byte searchSpace, int searchSpaceLength
where TNegator : struct, IndexOfAnyAsciiSearcher.INegator
{
return IndexOfAnyAsciiSearcher.IsVectorizationSupported && searchSpaceLength >= sizeof(ulong)
? IndexOfAnyAsciiSearcher.LastIndexOfAnyVectorized<TNegator>(ref searchSpace, searchSpaceLength, _bitmap)
? IndexOfAnyAsciiSearcher.LastIndexOfAnyVectorized<TNegator>(ref searchSpace, searchSpaceLength, ref _bitmap)
: LastIndexOfAnyScalar<TNegator>(ref searchSpace, searchSpaceLength);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,10 @@ namespace System.Buffers
internal sealed class AsciiCharSearchValues<TOptimizations> : SearchValues<char>
where TOptimizations : struct, IndexOfAnyAsciiSearcher.IOptimizations
{
private readonly Vector128<byte> _bitmap;
private Vector256<byte> _bitmap;
private readonly BitVector256 _lookup;

public AsciiCharSearchValues(Vector128<byte> bitmap, BitVector256 lookup)
public AsciiCharSearchValues(Vector256<byte> bitmap, BitVector256 lookup)
{
_bitmap = bitmap;
_lookup = lookup;
Expand Down Expand Up @@ -46,7 +46,7 @@ private int IndexOfAny<TNegator>(ref char searchSpace, int searchSpaceLength)
where TNegator : struct, IndexOfAnyAsciiSearcher.INegator
{
return IndexOfAnyAsciiSearcher.IsVectorizationSupported && searchSpaceLength >= Vector128<short>.Count
? IndexOfAnyAsciiSearcher.IndexOfAnyVectorized<TNegator, TOptimizations>(ref Unsafe.As<char, short>(ref searchSpace), searchSpaceLength, _bitmap)
? IndexOfAnyAsciiSearcher.IndexOfAnyVectorized<TNegator, TOptimizations>(ref Unsafe.As<char, short>(ref searchSpace), searchSpaceLength, ref _bitmap)
: IndexOfAnyScalar<TNegator>(ref searchSpace, searchSpaceLength);
}

Expand All @@ -55,7 +55,7 @@ private int LastIndexOfAny<TNegator>(ref char searchSpace, int searchSpaceLength
where TNegator : struct, IndexOfAnyAsciiSearcher.INegator
{
return IndexOfAnyAsciiSearcher.IsVectorizationSupported && searchSpaceLength >= Vector128<short>.Count
? IndexOfAnyAsciiSearcher.LastIndexOfAnyVectorized<TNegator, TOptimizations>(ref Unsafe.As<char, short>(ref searchSpace), searchSpaceLength, _bitmap)
? IndexOfAnyAsciiSearcher.LastIndexOfAnyVectorized<TNegator, TOptimizations>(ref Unsafe.As<char, short>(ref searchSpace), searchSpaceLength, ref _bitmap)
: LastIndexOfAnyScalar<TNegator>(ref searchSpace, searchSpaceLength);
}

Expand Down
Loading

0 comments on commit 80ffe5c

Please sign in to comment.