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

◆ GetPointerToFirstInvalidChar()

static unsafe char * System.Text.Unicode.Utf16Utility.GetPointerToFirstInvalidChar ( char * pInputBuffer,
int inputLength,
out long utf8CodeUnitCountAdjustment,
out int scalarCountAdjustment )
inlinestatic

Definition at line 84 of file Utf16Utility.cs.

85 {
86 int num = (int)ASCIIUtility.GetIndexOfFirstNonAsciiChar(pInputBuffer, (uint)inputLength);
87 pInputBuffer += (uint)num;
88 inputLength -= num;
89 if (inputLength == 0)
90 {
91 utf8CodeUnitCountAdjustment = 0L;
92 scalarCountAdjustment = 0;
93 return pInputBuffer;
94 }
95 long num2 = 0L;
96 int num3 = 0;
97 char* ptr = pInputBuffer + (uint)inputLength;
99 {
100 if (inputLength >= Vector128<ushort>.Count)
101 {
102 Vector128<ushort> right = Vector128.Create((ushort)128);
103 Vector128<ushort> vector = Vector128.Create((ushort)30720);
104 Vector128<ushort> right2 = Vector128.Create((ushort)40960);
105 if (!BitConverter.IsLittleEndian)
106 {
107 }
108 Vector128<byte> vector2 = Vector128.Create(9241421688590303745uL).AsByte();
109 char* ptr2 = ptr - Vector128<ushort>.Count;
110 do
111 {
113 {
114 }
115 Vector128<ushort> vector3 = Sse2.LoadVector128((ushort*)pInputBuffer);
116 pInputBuffer += Vector128<ushort>.Count;
118 {
119 }
120 Vector128<ushort> left = Sse41.Min(vector3, right);
122 {
123 }
124 Vector128<ushort> right3 = Sse2.AddSaturate(vector3, vector);
125 uint value = (uint)Sse2.MoveMask(Sse2.Or(left, right3).AsByte());
126 nuint num4 = (uint)BitOperations.PopCount(value);
128 {
129 }
130 value = (uint)Sse2.MoveMask(Sse2.CompareLessThan(Sse2.Add(vector3, right2).AsInt16(), vector.AsInt16()).AsByte());
131 while (value != 65535)
132 {
133 value = ~value;
135 {
136 }
137 uint num5 = (uint)Sse2.MoveMask(Sse2.ShiftRightLogical(vector3, 3).AsByte());
138 uint num6 = num5 & value;
139 uint num7 = (num5 ^ 0x5555u) & value;
140 num7 <<= 2;
141 if ((ushort)num7 == num6)
142 {
143 if (num7 > 65535)
144 {
145 num7 = (ushort)num7;
146 num4 -= 2;
147 pInputBuffer--;
148 }
149 nuint num8 = (uint)BitOperations.PopCount(num7);
150 num3 -= (int)num8;
151 _ = IntPtr.Size;
152 num2 -= (long)num8;
153 num2 -= (long)num8;
154 value = 65535u;
155 continue;
156 }
157 goto IL_01c6;
158 }
159 num2 += (long)num4;
160 continue;
161 IL_01c6:
162 pInputBuffer -= Vector128<ushort>.Count;
163 break;
164 }
165 while (pInputBuffer <= ptr2);
166 }
167 }
168 else if (Vector.IsHardwareAccelerated && inputLength >= Vector<ushort>.Count)
169 {
170 Vector<ushort> right4 = new Vector<ushort>(128);
171 Vector<ushort> right5 = new Vector<ushort>(1024);
172 Vector<ushort> right6 = new Vector<ushort>(2048);
173 Vector<ushort> vector4 = new Vector<ushort>(55296);
174 char* ptr3 = ptr - Vector<ushort>.Count;
175 while (true)
176 {
177 Vector<ushort> left2 = Unsafe.ReadUnaligned<Vector<ushort>>(pInputBuffer);
178 Vector<ushort> vector5 = Vector.GreaterThanOrEqual(left2, right4);
179 Vector<ushort> vector6 = Vector.GreaterThanOrEqual(left2, right6);
180 Vector<UIntPtr> vector7 = (Vector<nuint>)(Vector<ushort>.Zero - vector5 - vector6);
181 nuint num9 = 0u;
182 for (int i = 0; i < Vector<UIntPtr>.Count; i++)
183 {
184 num9 += (nuint)(nint)(nuint)vector7[i];
185 }
186 uint num10 = (uint)num9;
187 _ = IntPtr.Size;
188 num10 += (uint)(int)(num9 >> 32);
189 num10 = (ushort)num10 + (num10 >> 16);
190 left2 -= vector4;
191 Vector<ushort> vector8 = Vector.LessThan(left2, right6);
192 if (vector8 != Vector<ushort>.Zero)
193 {
194 Vector<ushort> right7 = Vector.LessThan(left2, right5);
195 Vector<ushort> vector9 = Vector.AndNot(vector8, right7);
196 if (vector9[0] != 0)
197 {
198 break;
199 }
200 ushort num11 = 0;
201 int num12 = 0;
202 while (num12 < Vector<ushort>.Count - 1)
203 {
204 num11 -= right7[num12];
205 if (right7[num12] == vector9[num12 + 1])
206 {
207 num12++;
208 continue;
209 }
210 goto IL_03e0;
211 }
212 if (right7[Vector<ushort>.Count - 1] != 0)
213 {
214 pInputBuffer--;
215 num10 -= 2;
216 }
217 nint num13 = num11;
218 num3 -= (int)num13;
219 num2 -= num13;
220 num2 -= num13;
221 }
222 num2 += num10;
223 pInputBuffer += Vector<ushort>.Count;
224 if (pInputBuffer <= ptr3)
225 {
226 continue;
227 }
228 goto IL_03e0;
229 }
230 goto IL_03e4;
231 }
232 goto IL_03e0;
233 IL_03e0:
234 while (pInputBuffer < ptr)
235 {
236 uint num14 = *pInputBuffer;
237 if (num14 > 127)
238 {
239 num2 += num14 + 129024 >> 16;
240 if (UnicodeUtility.IsSurrogateCodePoint(num14))
241 {
242 num2 -= 2;
243 if ((nuint)((byte*)ptr - (nuint)pInputBuffer) < (nuint)4u)
244 {
245 break;
246 }
247 num14 = Unsafe.ReadUnaligned<uint>(pInputBuffer);
248 uint num15 = num14;
249 if (!BitConverter.IsLittleEndian)
250 {
251 }
252 if (((num15 - 3691042816u) & 0xFC00FC00u) != 0)
253 {
254 break;
255 }
256 num3--;
257 num2 += 2;
258 pInputBuffer++;
259 }
260 }
261 pInputBuffer++;
262 }
263 goto IL_03e4;
264 IL_03e4:
265 utf8CodeUnitCountAdjustment = num2;
266 scalarCountAdjustment = num3;
267 return pInputBuffer;
268 }
static int PopCount(uint value)
static Vector< int > LessThan(Vector< float > left, Vector< float > right)
Definition Vector.cs:99
static bool IsHardwareAccelerated
Definition Vector.cs:14
static Vector< int > GreaterThanOrEqual(Vector< float > left, Vector< float > right)
Definition Vector.cs:240
static Vector128< byte > Create(byte value)
Definition Vector128.cs:138
static unsafe Vector128< sbyte > LoadVector128(sbyte *address)
Definition Sse2.cs:582
static int MoveMask(Vector128< sbyte > value)
Definition Sse2.cs:772
static Vector128< sbyte > CompareLessThan(Vector128< sbyte > left, Vector128< sbyte > right)
Definition Sse2.cs:337
static Vector128< byte > Or(Vector128< byte > left, Vector128< byte > right)
Definition Sse2.cs:837
static Vector128< sbyte > AddSaturate(Vector128< sbyte > left, Vector128< sbyte > right)
Definition Sse2.cs:112
static Vector128< byte > Add(Vector128< byte > left, Vector128< byte > right)
Definition Sse2.cs:62
static Vector128< short > ShiftRightLogical(Vector128< short > value, Vector128< short > count)
Definition Sse2.cs:1057
static Vector128< sbyte > Min(Vector128< sbyte > left, Vector128< sbyte > right)
Definition Sse41.cs:372

References System.Runtime.Intrinsics.X86.Sse2.Add(), System.Runtime.Intrinsics.X86.Sse2.AddSaturate(), System.Runtime.Intrinsics.X86.Sse2.CompareLessThan(), System.Numerics.Vector< T >.Count, System.Runtime.Intrinsics.Vector128< T >.Count, System.Runtime.Intrinsics.Vector128< T >.Create(), System.Text.ASCIIUtility.GetIndexOfFirstNonAsciiChar(), System.Numerics.Vector< T >.GreaterThanOrEqual(), System.Numerics.Vector< T >.IsHardwareAccelerated, System.BitConverter.IsLittleEndian, System.Runtime.Intrinsics.Arm.AdvSimd.Arm64.IsSupported, System.Runtime.Intrinsics.Arm.AdvSimd.IsSupported, System.Runtime.Intrinsics.X86.Sse41.IsSupported, System.Text.UnicodeUtility.IsSurrogateCodePoint(), System.Text.Unicode.L, System.Numerics.Vector< T >.LessThan(), System.Runtime.Intrinsics.X86.Sse2.LoadVector128(), System.Runtime.Intrinsics.X86.Sse41.Min(), System.Runtime.Intrinsics.X86.Sse2.MoveMask(), System.Runtime.Intrinsics.X86.Sse2.Or(), System.Numerics.BitOperations.PopCount(), System.Runtime.Intrinsics.X86.Sse2.ShiftRightLogical(), System.IntPtr.Size, and System.value.

Referenced by System.Text.UTF8Encoding.GetByteCountFast().