835 {
836 nuint num = ASCIIUtility.NarrowUtf16ToAscii(pInputBuffer, pOutputBuffer, (uint)Math.Min(inputLength, outputBytesRemaining));
837 pInputBuffer += num;
838 pOutputBuffer += num;
839 if ((int)num == inputLength)
840 {
841 pInputBufferRemaining = pInputBuffer;
842 pOutputBufferRemaining = pOutputBuffer;
844 }
845 inputLength -= (int)num;
846 outputBytesRemaining -= (int)num;
847 if (inputLength < 2)
848 {
849 goto IL_04f0;
850 }
851 char* ptr = pInputBuffer + (uint)inputLength - 2;
854 {
856 }
857 uint num2;
858 while (true)
859 {
860 IL_006d:
861 num2 =
Unsafe.ReadUnaligned<uint>(pInputBuffer);
862 while (true)
863 {
864 IL_0074:
865 if (!Utf16Utility.AllCharsInUInt32AreAscii(num2))
866 {
867 goto IL_02e9;
868 }
869 if (outputBytesRemaining < 2)
870 {
871 break;
872 }
873 uint num3 = num2 | (num2 >> 8);
874 Unsafe.WriteUnaligned(pOutputBuffer, (ushort)num3);
875 pInputBuffer += 2;
876 pOutputBuffer += 2;
877 outputBytesRemaining -= 2;
878 uint num4 = (uint)((int)(ptr - pInputBuffer) + 2);
879 uint num5 = (uint)Math.Min(num4, outputBytesRemaining);
880 int num7;
881 ulong num8;
883 int num10;
884 uint num11;
886 {
887 uint num6 = num5 / 8;
888 num7 = 0;
889 while ((uint)num7 < num6)
890 {
894 {
895 }
897 {
899 pInputBuffer += 8;
900 pOutputBuffer += 8;
901 num7++;
902 continue;
903 }
904 goto IL_019c;
905 }
906 outputBytesRemaining -= 8 * num7;
907 if ((num5 & 4u) != 0)
908 {
909 num8 =
Unsafe.ReadUnaligned<ulong>(pInputBuffer);
910 if (!Utf16Utility.AllCharsInUInt64AreAscii(num8))
911 {
912 goto IL_0213;
913 }
916 {
917 }
919 pInputBuffer += 4;
920 pOutputBuffer += 4;
921 outputBytesRemaining -= 4;
922 }
923 }
924 else
925 {
926 uint num9 = num5 / 4;
927 num10 = 0;
928 while ((uint)num10 < num9)
929 {
930 num2 =
Unsafe.ReadUnaligned<uint>(pInputBuffer);
931 num11 =
Unsafe.ReadUnaligned<uint>(pInputBuffer + 2);
932 if (Utf16Utility.AllCharsInUInt32AreAscii(num2 | num11))
933 {
934 Unsafe.WriteUnaligned(pOutputBuffer, (ushort)(num2 | (num2 >> 8)));
935 Unsafe.WriteUnaligned(pOutputBuffer + 2, (ushort)(num11 | (num11 >> 8)));
936 pInputBuffer += 4;
937 pOutputBuffer += 4;
938 num10++;
939 continue;
940 }
941 goto IL_02b8;
942 }
943 outputBytesRemaining -= 4 * num10;
944 }
945 goto IL_04de;
946 IL_04ae:
948 {
949 if (outputBytesRemaining >= 4)
950 {
952 pInputBuffer += 2;
953 pOutputBuffer += 4;
954 outputBytesRemaining -= 4;
955 goto IL_04de;
956 }
957 goto IL_05a7;
958 }
959 goto IL_05ac;
960 IL_038f:
961 if (outputBytesRemaining >= 3)
962 {
963 _ = BitConverter.IsLittleEndian;
964 num2 >>= 16;
965 pOutputBuffer[2] = (byte)num2;
966 pInputBuffer += 2;
967 pOutputBuffer += 3;
968 outputBytesRemaining -= 3;
969 goto IL_04de;
970 }
971 pInputBuffer++;
972 pOutputBuffer += 2;
973 goto IL_05a7;
974 IL_04de:
975 if (pInputBuffer <= ptr)
976 {
977 goto IL_006d;
978 }
979 goto IL_04e5;
980 IL_04e5:
981 inputLength = (int)(ptr - pInputBuffer) + 2;
982 goto IL_04f0;
983 IL_0213:
984 num2 = (uint)num8;
985 if (Utf16Utility.AllCharsInUInt32AreAscii(num2))
986 {
987 Unsafe.WriteUnaligned(pOutputBuffer, (ushort)(num2 | (num2 >> 8)));
988 pInputBuffer += 2;
989 pOutputBuffer += 2;
990 outputBytesRemaining -= 2;
991 num2 = (uint)(num8 >> 32);
992 }
993 goto IL_02e9;
994 IL_019c:
995 outputBytesRemaining -= 8 * num7;
997 if (Utf16Utility.AllCharsInUInt64AreAscii(num8))
998 {
1000 {
1001 }
1003 pInputBuffer += 4;
1004 pOutputBuffer += 4;
1005 outputBytesRemaining -= 4;
1006 num8 = vector.AsUInt64().GetElement(1);
1007 }
1008 goto IL_0213;
1009 IL_02b8:
1010 outputBytesRemaining -= 4 * num10;
1011 if (Utf16Utility.AllCharsInUInt32AreAscii(num2))
1012 {
1013 Unsafe.WriteUnaligned(pOutputBuffer, (ushort)(num2 | (num2 >> 8)));
1014 pInputBuffer += 2;
1015 pOutputBuffer += 2;
1016 outputBytesRemaining -= 2;
1017 num2 = num11;
1018 }
1019 goto IL_02e9;
1020 IL_02e9:
1021 while (true)
1022 {
1024 {
1025 if (outputBytesRemaining == 0)
1026 {
1027 break;
1028 }
1029 _ = BitConverter.IsLittleEndian;
1030 *pOutputBuffer = (byte)num2;
1031 pInputBuffer++;
1032 pOutputBuffer++;
1033 outputBytesRemaining--;
1034 if (pInputBuffer > ptr)
1035 {
1036 goto IL_04e5;
1037 }
1038 num2 =
Unsafe.ReadUnaligned<uint>(pInputBuffer);
1039 }
1041 {
1043 {
1044 if (outputBytesRemaining < 4)
1045 {
1046 goto end_IL_0074;
1047 }
1049 pInputBuffer += 2;
1050 pOutputBuffer += 4;
1051 outputBytesRemaining -= 4;
1052 if (pInputBuffer <= ptr)
1053 {
1054 num2 =
Unsafe.ReadUnaligned<uint>(pInputBuffer);
1056 {
1057 goto IL_0074;
1058 }
1059 continue;
1060 }
1061 goto IL_04e5;
1062 }
1063 if (outputBytesRemaining < 2)
1064 {
1065 break;
1066 }
1069 {
1070 goto IL_038f;
1071 }
1072 pInputBuffer++;
1073 pOutputBuffer += 2;
1074 outputBytesRemaining -= 2;
1075 if (pInputBuffer > ptr)
1076 {
1077 goto IL_04e5;
1078 }
1079 num2 =
Unsafe.ReadUnaligned<uint>(pInputBuffer);
1080 }
1082 {
1084 {
1086 pInputBuffer += 2;
1087 pOutputBuffer += 6;
1088 outputBytesRemaining -= 6;
1089 if (pInputBuffer <= ptr)
1090 {
1091 num2 =
Unsafe.ReadUnaligned<uint>(pInputBuffer);
1093 {
1094 goto IL_0074;
1095 }
1096 continue;
1097 }
1098 }
1099 else
1100 {
1101 if (outputBytesRemaining < 3)
1102 {
1103 goto end_IL_02e9;
1104 }
1106 pInputBuffer++;
1107 pOutputBuffer += 3;
1108 outputBytesRemaining -= 3;
1110 {
1111 goto IL_049e;
1112 }
1113 if (outputBytesRemaining == 0)
1114 {
1115 goto end_IL_02e9;
1116 }
1117 _ = BitConverter.IsLittleEndian;
1118 *pOutputBuffer = (byte)(num2 >> 16);
1119 pInputBuffer++;
1120 pOutputBuffer++;
1121 outputBytesRemaining--;
1122 if (pInputBuffer <= ptr)
1123 {
1124 num2 =
Unsafe.ReadUnaligned<uint>(pInputBuffer);
1126 {
1127 goto IL_0074;
1128 }
1129 continue;
1130 }
1131 }
1132 goto IL_04e5;
1133 }
1134 goto IL_04ae;
1135 IL_049e:
1136 if (pInputBuffer <= ptr)
1137 {
1138 num2 =
Unsafe.ReadUnaligned<uint>(pInputBuffer);
1139 continue;
1140 }
1141 goto IL_04e5;
1142 continue;
1143 end_IL_02e9:
1144 break;
1145 }
1146 goto IL_05a7;
1147 continue;
1148 end_IL_0074:
1149 break;
1150 }
1151 break;
1152 }
1153 _ = BitConverter.IsLittleEndian;
1154 uint num12 = num2 & 0xFFFFu;
1155 goto IL_050b;
1156 IL_05af:
1157 pInputBufferRemaining = pInputBuffer;
1158 pOutputBufferRemaining = pOutputBuffer;
1160 return result;
1161 IL_05a7:
1163 goto IL_05af;
1164 IL_05ac:
1166 goto IL_05af;
1167 IL_059d:
1169 goto IL_05af;
1170 IL_050b:
1171 if (num12 <= 127)
1172 {
1173 if (outputBytesRemaining != 0)
1174 {
1175 *pOutputBuffer = (byte)num12;
1176 pInputBuffer++;
1177 pOutputBuffer++;
1178 goto IL_0599;
1179 }
1180 }
1181 else if (num12 < 2048)
1182 {
1183 if (outputBytesRemaining >= 2)
1184 {
1185 pOutputBuffer[1] = (byte)((num12 & 0x3Fu) | 0xFFFFFF80u);
1186 *pOutputBuffer = (byte)((num12 >> 6) | 0xFFFFFFC0u);
1187 pInputBuffer++;
1188 pOutputBuffer += 2;
1189 goto IL_0599;
1190 }
1191 }
1192 else
1193 {
1194 if (UnicodeUtility.IsSurrogateCodePoint(num12))
1195 {
1196 if (num12 > 56319)
1197 {
1198 goto IL_05ac;
1199 }
1201 goto IL_05af;
1202 }
1203 if (outputBytesRemaining >= 3)
1204 {
1205 pOutputBuffer[2] = (byte)((num12 & 0x3Fu) | 0xFFFFFF80u);
1206 pOutputBuffer[1] = (byte)(((num12 >> 6) & 0x3Fu) | 0xFFFFFF80u);
1207 *pOutputBuffer = (byte)((num12 >> 12) | 0xFFFFFFE0u);
1208 pInputBuffer++;
1209 pOutputBuffer += 3;
1210 goto IL_0599;
1211 }
1212 }
1213 goto IL_05a7;
1214 IL_04f0:
1215 if (inputLength != 0)
1216 {
1217 num12 = *pInputBuffer;
1218 goto IL_050b;
1219 }
1220 goto IL_059d;
1221 IL_0599:
1222 if (inputLength <= 1)
1223 {
1224 goto IL_059d;
1225 }
1226 goto IL_05a7;
1227 }
static new bool IsSupported
static new bool IsSupported
static Vector128< byte > Create(byte value)
static unsafe Vector128< byte > CreateScalarUnsafe(byte value)
static new bool IsSupported
static ulong ConvertToUInt64(Vector128< ulong > value)
static uint ConvertToUInt32(Vector128< uint > value)
static unsafe void StoreScalar(double *address, Vector128< double > source)
static Vector128< byte > PackUnsignedSaturate(Vector128< short > left, Vector128< short > right)
static new bool IsSupported
static bool TestZ(Vector128< sbyte > left, Vector128< sbyte > right)
static bool IsFirstCharAscii(uint value)
static uint ExtractFourUtf8BytesFromSurrogatePair(uint value)
static uint ExtractUtf8TwoByteSequenceFromFirstUtf16Char(uint value)
static bool IsSecondCharSurrogate(uint value)
static bool IsFirstCharTwoUtf8Bytes(uint value)
static bool IsFirstCharAtLeastThreeUtf8Bytes(uint value)
static bool IsSecondCharAtLeastThreeUtf8Bytes(uint value)
static bool IsWellFormedUtf16SurrogatePair(uint value)
static bool IsFirstCharSurrogate(uint value)
static uint ExtractTwoUtf8TwoByteSequencesFromTwoPackedUtf16Chars(uint value)
static void WriteTwoUtf16CharsAsTwoUtf8ThreeByteSequences(ref byte outputBuffer, uint value)
static bool IsSecondCharTwoUtf8Bytes(uint value)
static void WriteFirstUtf16CharAsUtf8ThreeByteSequence(ref byte outputBuffer, uint value)
static bool IsSecondCharAscii(uint value)