31 char* ptr2 = pBuffer + bufferLength -
count;
32 pBuffer = (
char*)((nuint)((
byte*)pBuffer + count2) & ~(nuint)(count2 - 1));
41 bufferLength -= (nuint)(nint)(pBuffer - ptr);
47 if (bufferLength >= 4)
49 num =
Unsafe.ReadUnaligned<uint>(pBuffer);
50 uint num2 =
Unsafe.ReadUnaligned<uint>(pBuffer + 2);
64 if ((bufferLength & 2) != 0)
66 num =
Unsafe.ReadUnaligned<uint>(pBuffer);
73 if ((bufferLength & 1) != 0 && *pBuffer <=
'ÿ')
85 nuint num3 = (nuint)((
byte*)pBuffer - (nuint)ptr);
91 if (bufferLength == 0)
102 if (bufferLength >= num2)
108 if ((num3 & 0xAAAA) == 0)
111 if (bufferLength < 2 * num)
115 pBuffer = (
char*)((nuint)((
byte*)pBuffer + num) & ~(nuint)(num - 1));
116 bufferLength = (nuint)(bufferLength + (
byte*)ptr);
117 bufferLength -= (nuint)pBuffer;
118 if (bufferLength < 2 * num)
122 char* ptr2 = (
char*)((
byte*)pBuffer + bufferLength - 2 * num);
139 if ((num3 & 0xAAAAu) != 0)
161 if ((num3 & 0xAAAAu) != 0)
173 if ((bufferLength & 4) != 0)
177 ulong num4 =
Unsafe.ReadUnaligned<ulong>(pBuffer);
180 num4 &= 0xFF00FF00FF00FF00uL;
187 num5 =
Unsafe.ReadUnaligned<uint>(pBuffer);
188 uint num6 =
Unsafe.ReadUnaligned<uint>(pBuffer + 2);
201 if ((bufferLength & 2) != 0)
203 num5 =
Unsafe.ReadUnaligned<uint>(pBuffer);
210 if ((bufferLength & 1) != 0 && *pBuffer <=
'ÿ')
225 return (nuint)(pBuffer - ptr);
227 if (((
byte)bufferLength & (num - 1)) != 0)
229 pBuffer = (
char*)((
byte*)pBuffer + (bufferLength & (num - 1)) - num);
241 if ((num3 & 0xAAAAu) != 0)
250 if ((bufferLength & num) != 0)
263 if ((num3 & 0xAAAAu) != 0)
280 public unsafe
static nuint
NarrowUtf16ToLatin1(
char* pUtf16Buffer,
byte* pLatin1Buffer, nuint elementCount)
291 num4 =
Unsafe.ReadUnaligned<ulong>(pUtf16Buffer);
302 if (elementCount >= 2 * num5)
305 num4 =
Unsafe.ReadUnaligned<ulong>(pUtf16Buffer);
311 nuint num6 = elementCount - 2 * num5;
316 if (
Vector.GreaterThanAny(
Vector.BitwiseOr(vector, vector2), right))
327 nuint num7 = elementCount - num;
332 nuint num8 = num + num7 - 4;
336 num4 =
Unsafe.ReadUnaligned<ulong>(pUtf16Buffer + num);
356 pLatin1Buffer[num] = (byte)num2;
363 if (((uint)(
int)num7 & 2u) != 0)
365 num2 =
Unsafe.ReadUnaligned<uint>(pUtf16Buffer + num);
373 if (((uint)(
int)num7 & (
true ? 1u : 0u)) != 0)
375 num2 = pUtf16Buffer[num];
378 pLatin1Buffer[num] = (byte)num2;
391 num2 = (uint)(num4 >> 32);
400 nuint num2 = num - 1;
417 nuint num3 = num / 2;
418 if (((uint)(int)pLatin1Buffer & (num / 2)) != 0)
442 num3 = num - ((nuint)pLatin1Buffer & num2);
443 nuint num4 = elementCount - num;
480 while (num3 <= num4);
484 public unsafe
static void WidenLatin1ToUtf16(
byte* pLatin1Buffer,
char* pUtf16Buffer, nuint elementCount)
499 nuint num2 = num - 1;
502 if (elementCount >= num)
506 num3 = (num >> 1) - (((nuint)pUtf16Buffer >> 1) & (num2 >> 1));
507 char* ptr = pUtf16Buffer + num3;
508 nuint num4 = elementCount - num;
520 uint num5 = (uint)((
int)elementCount - (int)num3);
521 if ((num5 & 8u) != 0)
527 if ((num5 & 4u) != 0)
537 pUtf16Buffer[num3] = (char)pLatin1Buffer[num3];
538 if ((num5 & 2u) != 0)
540 pUtf16Buffer[num3 + 1] = (char)pLatin1Buffer[num3 + 1];
541 if ((num5 & (
true ? 1u : 0u)) != 0)
543 pUtf16Buffer[num3 + 2] = (char)pLatin1Buffer[num3 + 2];
554 if (elementCount >=
count)
556 nuint num2 = elementCount -
count;
561 Unsafe.WriteUnaligned(pUtf16Buffer + num, low);
568 for (; num < elementCount; num++)
570 pUtf16Buffer[num] = (char)pLatin1Buffer[num];
577 return (
value & 0xFF00FF00u) == 0;
583 return (
value & 0xFF00FF00FF00FF00uL) == 0;
589 if ((
value & 0xFF00u) != 0)
610 outputBuffer = (byte)
value;
623 outputBuffer = (byte)
value;
624 Unsafe.Add(ref outputBuffer, 1) = (byte)(
value >> 16);
static readonly bool IsLittleEndian
static int TrailingZeroCount(int value)
static bool IsHardwareAccelerated
static unsafe void Widen(Vector< byte > source, out Vector< ushort > low, out Vector< ushort > high)
static unsafe Vector< byte > Narrow(Vector< ushort > low, Vector< ushort > high)
static Vector128< byte > Create(byte value)
static Vector128< T > Zero
static ulong TrailingZeroCount(ulong value)
static new bool IsSupported
static new bool IsSupported
static Vector128< ulong > ConvertScalarToVector128UInt64(ulong value)
static unsafe Vector128< sbyte > LoadVector128(sbyte *address)
static unsafe Vector128< double > LoadScalarVector128(double *address)
static int MoveMask(Vector128< sbyte > value)
static unsafe Vector128< sbyte > LoadAlignedVector128(sbyte *address)
static uint ConvertToUInt32(Vector128< uint > value)
static unsafe void StoreScalar(double *address, Vector128< double > source)
static unsafe void Store(sbyte *address, Vector128< sbyte > source)
static Vector128< byte > PackUnsignedSaturate(Vector128< short > left, Vector128< short > right)
static Vector128< byte > Or(Vector128< byte > left, Vector128< byte > right)
static Vector128< sbyte > AddSaturate(Vector128< sbyte > left, Vector128< sbyte > right)
static unsafe void StoreAligned(sbyte *address, Vector128< sbyte > source)
static Vector128< byte > UnpackLow(Vector128< byte > left, Vector128< byte > right)
static new bool IsSupported
static Vector128< byte > UnpackHigh(Vector128< byte > left, Vector128< byte > right)
static bool TestZ(Vector128< sbyte > left, Vector128< sbyte > right)
static new bool IsSupported
static bool FirstCharInUInt32IsLatin1(uint value)
static unsafe void WidenLatin1ToUtf16(byte *pLatin1Buffer, char *pUtf16Buffer, nuint elementCount)
static void NarrowTwoUtf16CharsToLatin1AndWriteToBuffer(ref byte outputBuffer, uint value)
static unsafe nuint NarrowUtf16ToLatin1_Sse2(char *pUtf16Buffer, byte *pLatin1Buffer, nuint elementCount)
static void NarrowFourUtf16CharsToLatin1AndWriteToBuffer(ref byte outputBuffer, ulong value)
static bool AllCharsInUInt32AreLatin1(uint value)
static unsafe nuint GetIndexOfFirstNonLatin1Char(char *pBuffer, nuint bufferLength)
static unsafe nuint NarrowUtf16ToLatin1(char *pUtf16Buffer, byte *pLatin1Buffer, nuint elementCount)
static unsafe void WidenLatin1ToUtf16_Sse2(byte *pLatin1Buffer, char *pUtf16Buffer, nuint elementCount)
static unsafe void WidenLatin1ToUtf16_Fallback(byte *pLatin1Buffer, char *pUtf16Buffer, nuint elementCount)
static unsafe nuint GetIndexOfFirstNonLatin1Char_Default(char *pBuffer, nuint bufferLength)
static bool AllCharsInUInt64AreLatin1(ulong value)
static unsafe nuint GetIndexOfFirstNonLatin1Char_Sse2(char *pBuffer, nuint bufferLength)