Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches

◆ NarrowUtf16ToAscii()

static unsafe nuint System.Text.ASCIIUtility.NarrowUtf16ToAscii ( char * pUtf16Buffer,
byte * pAsciiBuffer,
nuint elementCount )
inlinestatic

Definition at line 582 of file ASCIIUtility.cs.

583 {
584 nuint num = 0u;
585 uint num2 = 0u;
586 uint num3 = 0u;
587 ulong num4 = 0uL;
588 if (Sse2.IsSupported)
589 {
590 if (elementCount >= (uint)(2 * Unsafe.SizeOf<Vector128<byte>>()))
591 {
592 _ = IntPtr.Size;
593 num4 = Unsafe.ReadUnaligned<ulong>(pUtf16Buffer);
594 if (!AllCharsInUInt64AreAscii(num4))
595 {
596 goto IL_018b;
597 }
598 num = NarrowUtf16ToAscii_Sse2(pUtf16Buffer, pAsciiBuffer, elementCount);
599 }
600 }
602 {
603 uint num5 = (uint)Unsafe.SizeOf<Vector<byte>>();
604 if (elementCount >= 2 * num5)
605 {
606 _ = IntPtr.Size;
607 num4 = Unsafe.ReadUnaligned<ulong>(pUtf16Buffer);
608 if (!AllCharsInUInt64AreAscii(num4))
609 {
610 goto IL_018b;
611 }
612 Vector<ushort> right = new Vector<ushort>(127);
613 nuint num6 = elementCount - 2 * num5;
614 do
615 {
616 Vector<ushort> vector = Unsafe.ReadUnaligned<Vector<ushort>>(pUtf16Buffer + num);
617 Vector<ushort> vector2 = Unsafe.ReadUnaligned<Vector<ushort>>(pUtf16Buffer + num + Vector<ushort>.Count);
618 if (Vector.GreaterThanAny(Vector.BitwiseOr(vector, vector2), right))
619 {
620 break;
621 }
622 Vector<byte> value = Vector.Narrow(vector, vector2);
623 Unsafe.WriteUnaligned(pAsciiBuffer + num, value);
624 num += num5;
625 }
626 while (num <= num6);
627 }
628 }
629 nuint num7 = elementCount - num;
630 if (num7 < 4)
631 {
632 goto IL_0137;
633 }
634 nuint num8 = num + num7 - 4;
635 while (true)
636 {
637 _ = IntPtr.Size;
638 num4 = Unsafe.ReadUnaligned<ulong>(pUtf16Buffer + num);
639 if (!AllCharsInUInt64AreAscii(num4))
640 {
641 break;
642 }
643 NarrowFourUtf16CharsToAsciiAndWriteToBuffer(ref pAsciiBuffer[num], num4);
644 num += 4;
645 if (num <= num8)
646 {
647 continue;
648 }
649 goto IL_0137;
650 }
651 goto IL_018b;
652 IL_01c4:
653 if (FirstCharInUInt32IsAscii(num2))
654 {
655 if (!BitConverter.IsLittleEndian)
656 {
657 }
658 pAsciiBuffer[num] = (byte)num2;
659 num++;
660 }
661 goto IL_0189;
662 IL_0189:
663 return num;
664 IL_0137:
665 if (((uint)(int)num7 & 2u) != 0)
666 {
667 num2 = Unsafe.ReadUnaligned<uint>(pUtf16Buffer + num);
668 if (!AllCharsInUInt32AreAscii(num2))
669 {
670 goto IL_01c4;
671 }
672 NarrowTwoUtf16CharsToAsciiAndWriteToBuffer(ref pAsciiBuffer[num], num2);
673 num += 2;
674 }
675 if (((uint)(int)num7 & (true ? 1u : 0u)) != 0)
676 {
677 num2 = pUtf16Buffer[num];
678 if (num2 <= 127)
679 {
680 pAsciiBuffer[num] = (byte)num2;
681 num++;
682 }
683 }
684 goto IL_0189;
685 IL_018b:
686 _ = IntPtr.Size;
687 _ = BitConverter.IsLittleEndian;
688 num2 = (uint)num4;
689 if (AllCharsInUInt32AreAscii(num2))
690 {
691 NarrowTwoUtf16CharsToAsciiAndWriteToBuffer(ref pAsciiBuffer[num], num2);
692 _ = BitConverter.IsLittleEndian;
693 num2 = (uint)(num4 >> 32);
694 num += 2;
695 }
696 goto IL_01c4;
697 }
static bool IsHardwareAccelerated
Definition Vector.cs:14
static unsafe Vector< byte > Narrow(Vector< ushort > low, Vector< ushort > high)
Definition Vector.cs:623
static new bool IsSupported
Definition Sse2.cs:60
static bool AllCharsInUInt32AreAscii(uint value)
static bool AllCharsInUInt64AreAscii(ulong value)
static bool FirstCharInUInt32IsAscii(uint value)
static void NarrowFourUtf16CharsToAsciiAndWriteToBuffer(ref byte outputBuffer, ulong value)
static void NarrowTwoUtf16CharsToAsciiAndWriteToBuffer(ref byte outputBuffer, uint value)
static unsafe nuint NarrowUtf16ToAscii_Sse2(char *pUtf16Buffer, byte *pAsciiBuffer, nuint elementCount)

References System.Text.ASCIIUtility.AllCharsInUInt32AreAscii(), System.Text.ASCIIUtility.AllCharsInUInt64AreAscii(), System.Numerics.Vector< T >.Count, System.Text.ASCIIUtility.FirstCharInUInt32IsAscii(), System.Numerics.Vector< T >.IsHardwareAccelerated, System.BitConverter.IsLittleEndian, System.Runtime.Intrinsics.X86.Sse2.IsSupported, System.Numerics.Vector< T >.Narrow(), System.Text.ASCIIUtility.NarrowFourUtf16CharsToAsciiAndWriteToBuffer(), System.Text.ASCIIUtility.NarrowTwoUtf16CharsToAsciiAndWriteToBuffer(), System.Text.ASCIIUtility.NarrowUtf16ToAscii_Sse2(), System.IntPtr.Size, and System.value.

Referenced by System.Text.ASCIIEncoding.GetBytesFast(), System.Text.ASCIIEncoding.GetBytesWithFallback(), and System.Text.Unicode.Utf8Utility.TranscodeToUtf8().