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

◆ NarrowUtf16ToLatin1()

static unsafe nuint System.Text.Latin1Utility.NarrowUtf16ToLatin1 ( char * pUtf16Buffer,
byte * pLatin1Buffer,
nuint elementCount )
inlinestatic

Definition at line 280 of file Latin1Utility.cs.

281 {
282 nuint num = 0u;
283 uint num2 = 0u;
284 uint num3 = 0u;
285 ulong num4 = 0uL;
286 if (Sse2.IsSupported)
287 {
288 if (elementCount >= (uint)(2 * Unsafe.SizeOf<Vector128<byte>>()))
289 {
290 _ = IntPtr.Size;
291 num4 = Unsafe.ReadUnaligned<ulong>(pUtf16Buffer);
292 if (!AllCharsInUInt64AreLatin1(num4))
293 {
294 goto IL_0191;
295 }
296 num = NarrowUtf16ToLatin1_Sse2(pUtf16Buffer, pLatin1Buffer, elementCount);
297 }
298 }
300 {
301 uint num5 = (uint)Unsafe.SizeOf<Vector<byte>>();
302 if (elementCount >= 2 * num5)
303 {
304 _ = IntPtr.Size;
305 num4 = Unsafe.ReadUnaligned<ulong>(pUtf16Buffer);
306 if (!AllCharsInUInt64AreLatin1(num4))
307 {
308 goto IL_0191;
309 }
310 Vector<ushort> right = new Vector<ushort>(255);
311 nuint num6 = elementCount - 2 * num5;
312 do
313 {
314 Vector<ushort> vector = Unsafe.ReadUnaligned<Vector<ushort>>(pUtf16Buffer + num);
315 Vector<ushort> vector2 = Unsafe.ReadUnaligned<Vector<ushort>>(pUtf16Buffer + num + Vector<ushort>.Count);
316 if (Vector.GreaterThanAny(Vector.BitwiseOr(vector, vector2), right))
317 {
318 break;
319 }
320 Vector<byte> value = Vector.Narrow(vector, vector2);
321 Unsafe.WriteUnaligned(pLatin1Buffer + num, value);
322 num += num5;
323 }
324 while (num <= num6);
325 }
326 }
327 nuint num7 = elementCount - num;
328 if (num7 < 4)
329 {
330 goto IL_013a;
331 }
332 nuint num8 = num + num7 - 4;
333 while (true)
334 {
335 _ = IntPtr.Size;
336 num4 = Unsafe.ReadUnaligned<ulong>(pUtf16Buffer + num);
337 if (!AllCharsInUInt64AreLatin1(num4))
338 {
339 break;
340 }
341 NarrowFourUtf16CharsToLatin1AndWriteToBuffer(ref pLatin1Buffer[num], num4);
342 num += 4;
343 if (num <= num8)
344 {
345 continue;
346 }
347 goto IL_013a;
348 }
349 goto IL_0191;
350 IL_01ca:
352 {
353 if (!BitConverter.IsLittleEndian)
354 {
355 }
356 pLatin1Buffer[num] = (byte)num2;
357 num++;
358 }
359 goto IL_018f;
360 IL_018f:
361 return num;
362 IL_013a:
363 if (((uint)(int)num7 & 2u) != 0)
364 {
365 num2 = Unsafe.ReadUnaligned<uint>(pUtf16Buffer + num);
366 if (!AllCharsInUInt32AreLatin1(num2))
367 {
368 goto IL_01ca;
369 }
370 NarrowTwoUtf16CharsToLatin1AndWriteToBuffer(ref pLatin1Buffer[num], num2);
371 num += 2;
372 }
373 if (((uint)(int)num7 & (true ? 1u : 0u)) != 0)
374 {
375 num2 = pUtf16Buffer[num];
376 if (num2 <= 255)
377 {
378 pLatin1Buffer[num] = (byte)num2;
379 num++;
380 }
381 }
382 goto IL_018f;
383 IL_0191:
384 _ = IntPtr.Size;
385 _ = BitConverter.IsLittleEndian;
386 num2 = (uint)num4;
388 {
389 NarrowTwoUtf16CharsToLatin1AndWriteToBuffer(ref pLatin1Buffer[num], num2);
390 _ = BitConverter.IsLittleEndian;
391 num2 = (uint)(num4 >> 32);
392 num += 2;
393 }
394 goto IL_01ca;
395 }
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 FirstCharInUInt32IsLatin1(uint value)
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 bool AllCharsInUInt64AreLatin1(ulong value)

References System.Text.Latin1Utility.AllCharsInUInt32AreLatin1(), System.Text.Latin1Utility.AllCharsInUInt64AreLatin1(), System.Numerics.Vector< T >.Count, System.Text.Latin1Utility.FirstCharInUInt32IsLatin1(), System.Numerics.Vector< T >.IsHardwareAccelerated, System.BitConverter.IsLittleEndian, System.Runtime.Intrinsics.X86.Sse2.IsSupported, System.Numerics.Vector< T >.Narrow(), System.Text.Latin1Utility.NarrowFourUtf16CharsToLatin1AndWriteToBuffer(), System.Text.Latin1Utility.NarrowTwoUtf16CharsToLatin1AndWriteToBuffer(), System.Text.Latin1Utility.NarrowUtf16ToLatin1_Sse2(), System.IntPtr.Size, and System.value.

Referenced by System.Text.Latin1Encoding.GetBytesFast().