diff --git a/src/libraries/System.Private.CoreLib/src/System/Text/Unicode/Utf16Utility.Validation.cs b/src/libraries/System.Private.CoreLib/src/System/Text/Unicode/Utf16Utility.Validation.cs index cd4e6627d84455..f2df0ccdf53c42 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Text/Unicode/Utf16Utility.Validation.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Text/Unicode/Utf16Utility.Validation.cs @@ -87,6 +87,11 @@ static Utf16Utility() Vector128 vectorA800 = Vector128.Create((ushort)0xA800); Vector128 vector8800 = Vector128.Create(unchecked((short)0x8800)); Vector128 vectorZero = Vector128.Zero; + + Vector128 bitMask128 = BitConverter.IsLittleEndian ? + Vector128.Create(0x80402010_08040201).AsByte() : + Vector128.Create(0x01020408_10204080).AsByte(); + do { Vector128 utf16Data; @@ -127,7 +132,7 @@ static Utf16Utility() uint debugMask; if (AdvSimd.Arm64.IsSupported) { - debugMask = GetNonAsciiBytes(charIsNonAscii.AsByte()); + debugMask = GetNonAsciiBytes(charIsNonAscii.AsByte(), bitMask128); } else { @@ -145,7 +150,7 @@ static Utf16Utility() if (AdvSimd.IsSupported) { charIsThreeByteUtf8Encoded = AdvSimd.Subtract(vectorZero, AdvSimd.ShiftRightLogical(utf16Data, 11)); - mask = GetNonAsciiBytes(AdvSimd.Or(charIsNonAscii, charIsThreeByteUtf8Encoded).AsByte()); + mask = GetNonAsciiBytes(AdvSimd.Or(charIsNonAscii, charIsThreeByteUtf8Encoded).AsByte(), bitMask128); } else { @@ -185,7 +190,7 @@ static Utf16Utility() if (AdvSimd.Arm64.IsSupported) { utf16Data = AdvSimd.Add(utf16Data, vectorA800); - mask = GetNonAsciiBytes(AdvSimd.CompareLessThan(utf16Data.AsInt16(), vector8800).AsByte()); + mask = GetNonAsciiBytes(AdvSimd.CompareLessThan(utf16Data.AsInt16(), vector8800).AsByte(), bitMask128); } else { @@ -219,7 +224,7 @@ static Utf16Utility() uint mask2; if (AdvSimd.Arm64.IsSupported) { - mask2 = GetNonAsciiBytes(AdvSimd.ShiftRightLogical(utf16Data, 3).AsByte()); + mask2 = GetNonAsciiBytes(AdvSimd.ShiftRightLogical(utf16Data, 3).AsByte(), bitMask128); } else { @@ -480,17 +485,13 @@ static Utf16Utility() return pInputBuffer; } - private static readonly Vector128 s_bitMask128 = BitConverter.IsLittleEndian ? - Vector128.Create(0x80402010_08040201).AsByte() : - Vector128.Create(0x01020408_10204080).AsByte(); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private static uint GetNonAsciiBytes(Vector128 value) + private static uint GetNonAsciiBytes(Vector128 value, Vector128 bitMask128) { Debug.Assert(AdvSimd.Arm64.IsSupported); Vector128 mostSignificantBitIsSet = AdvSimd.ShiftRightArithmetic(value.AsSByte(), 7).AsByte(); - Vector128 extractedBits = AdvSimd.And(mostSignificantBitIsSet, s_bitMask128); + Vector128 extractedBits = AdvSimd.And(mostSignificantBitIsSet, bitMask128); // self-pairwise add until all flags have moved to the first two bytes of the vector extractedBits = AdvSimd.Arm64.AddPairwise(extractedBits, extractedBits);