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

◆ WidenAsciiToUtf16()

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

Definition at line 786 of file ASCIIUtility.cs.

787 {
788 nuint num = 0u;
789 _ = BitConverter.IsLittleEndian;
791 {
792 if (elementCount >= (uint)(2 * Unsafe.SizeOf<Vector128<byte>>()))
793 {
794 num = WidenAsciiToUtf16_Intrinsified(pAsciiBuffer, pUtf16Buffer, elementCount);
795 }
796 }
798 {
799 uint num2 = (uint)Unsafe.SizeOf<Vector<byte>>();
800 if (elementCount >= num2)
801 {
802 nuint num3 = elementCount - num2;
803 do
804 {
805 Vector<sbyte> vector = Unsafe.ReadUnaligned<Vector<sbyte>>(pAsciiBuffer + num);
806 if (Vector.LessThanAny(vector, Vector<sbyte>.Zero))
807 {
808 break;
809 }
810 Vector.Widen(Vector.AsVectorByte(vector), out var low, out var high);
811 Unsafe.WriteUnaligned(pUtf16Buffer + num, low);
812 Unsafe.WriteUnaligned(pUtf16Buffer + num + Vector<ushort>.Count, high);
813 num += num2;
814 }
815 while (num <= num3);
816 }
817 }
818 nuint num4 = elementCount - num;
819 if (num4 < 4)
820 {
821 goto IL_00df;
822 }
823 nuint num5 = num + num4 - 4;
824 uint num6;
825 while (true)
826 {
827 num6 = Unsafe.ReadUnaligned<uint>(pAsciiBuffer + num);
828 if (!AllBytesInUInt32AreAscii(num6))
829 {
830 break;
831 }
832 WidenFourAsciiBytesToUtf16AndWriteToBuffer(ref pUtf16Buffer[num], num6);
833 num += 4;
834 if (num <= num5)
835 {
836 continue;
837 }
838 goto IL_00df;
839 }
840 goto IL_014f;
841 IL_014d:
842 return num;
843 IL_014f:
844 _ = BitConverter.IsLittleEndian;
845 while (((byte)num6 & 0x80) == 0)
846 {
847 pUtf16Buffer[num] = (char)(byte)num6;
848 num++;
849 num6 >>= 8;
850 }
851 goto IL_014d;
852 IL_00df:
853 if (((uint)(int)num4 & 2u) != 0)
854 {
855 num6 = Unsafe.ReadUnaligned<ushort>(pAsciiBuffer + num);
856 if (!AllBytesInUInt32AreAscii(num6) && BitConverter.IsLittleEndian)
857 {
858 goto IL_014f;
859 }
860 _ = BitConverter.IsLittleEndian;
861 pUtf16Buffer[num] = (char)(byte)num6;
862 pUtf16Buffer[num + 1] = (char)(num6 >> 8);
863 num += 2;
864 }
865 if (((uint)(int)num4 & (true ? 1u : 0u)) != 0)
866 {
867 num6 = pAsciiBuffer[num];
868 if (((byte)num6 & 0x80) == 0)
869 {
870 pUtf16Buffer[num] = (char)num6;
871 num++;
872 }
873 }
874 goto IL_014d;
875 }
static Vector< T > Zero
Definition Vector.cs:874
static bool IsHardwareAccelerated
Definition Vector.cs:14
static unsafe void Widen(Vector< byte > source, out Vector< ushort > low, out Vector< ushort > high)
Definition Vector.cs:493
static new bool IsSupported
Definition Sse2.cs:60
static void WidenFourAsciiBytesToUtf16AndWriteToBuffer(ref char outputBuffer, uint value)
static bool AllBytesInUInt32AreAscii(uint value)
static unsafe nuint WidenAsciiToUtf16_Intrinsified(byte *pAsciiBuffer, char *pUtf16Buffer, nuint elementCount)

References System.Text.ASCIIUtility.AllBytesInUInt32AreAscii(), System.Numerics.Vector< T >.IsHardwareAccelerated, System.BitConverter.IsLittleEndian, System.Runtime.Intrinsics.Arm.AdvSimd.Arm64.IsSupported, System.Runtime.Intrinsics.X86.Sse2.IsSupported, System.Numerics.Vector< T >.Widen(), System.Text.ASCIIUtility.WidenAsciiToUtf16_Intrinsified(), System.Text.ASCIIUtility.WidenFourAsciiBytesToUtf16AndWriteToBuffer(), and System.Numerics.Vector< T >.Zero.

Referenced by System.Text.ASCIIEncoding.GetCharsFast(), System.Text.ASCIIEncoding.GetCharsWithFallback(), and System.Text.Unicode.Utf8Utility.TranscodeToUtf16().