diff --git a/src/libraries/System.Private.CoreLib/src/System/IndexOfAnyValues/ProbabilisticMap.cs b/src/libraries/System.Private.CoreLib/src/System/IndexOfAnyValues/ProbabilisticMap.cs index 493398929f1695..638cec9b36fb51 100644 --- a/src/libraries/System.Private.CoreLib/src/System/IndexOfAnyValues/ProbabilisticMap.cs +++ b/src/libraries/System.Private.CoreLib/src/System/IndexOfAnyValues/ProbabilisticMap.cs @@ -172,10 +172,19 @@ private static Vector128 IsCharBitSet(Vector128 charMapLower, Vector Vector128 bitPositions = Vector128.ShuffleUnsafe(Vector128.Create(0x8040201008040201).AsByte(), highNibble); Vector128 index = values & Vector128.Create((byte)VectorizedIndexMask); - Vector128 bitMaskLower = Vector128.ShuffleUnsafe(charMapLower, index); - Vector128 bitMaskUpper = Vector128.ShuffleUnsafe(charMapUpper, index - Vector128.Create((byte)16)); - Vector128 mask = Vector128.GreaterThan(index, Vector128.Create((byte)15)); - Vector128 bitMask = Vector128.ConditionalSelect(mask, bitMaskUpper, bitMaskLower); + Vector128 bitMask; + + if (AdvSimd.Arm64.IsSupported) + { + bitMask = AdvSimd.Arm64.VectorTableLookup((charMapLower, charMapUpper), index); + } + else + { + Vector128 bitMaskLower = Vector128.ShuffleUnsafe(charMapLower, index); + Vector128 bitMaskUpper = Vector128.ShuffleUnsafe(charMapUpper, index - Vector128.Create((byte)16)); + Vector128 mask = Vector128.GreaterThan(index, Vector128.Create((byte)15)); + bitMask = Vector128.ConditionalSelect(mask, bitMaskUpper, bitMaskLower); + } return ~Vector128.Equals(bitMask & bitPositions, Vector128.Zero); }