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

◆ GetIndexOfFirstByteToEncodeAdvSimd64()

unsafe nuint System.Text.Encodings.Web.OptimizedInboxTextEncoder.GetIndexOfFirstByteToEncodeAdvSimd64 ( byte * pData,
nuint lengthInBytes )
inlineprivate

Definition at line 570 of file OptimizedInboxTextEncoder.cs.

571 {
572 Vector128<byte> right = Vector128.Create((byte)15);
573 Vector128<byte> table = Vector128.Create(1, 2, 4, 8, 16, 32, 64, 128, 0, 0, 0, 0, 0, 0, 0, 0);
574 Vector128<byte> right2 = Vector128.Create((ushort)61455).AsByte();
576 nuint num = 0u;
577 if (lengthInBytes < 16)
578 {
579 goto IL_00ca;
580 }
581 nuint num2 = lengthInBytes & unchecked((nuint)(-16));
582 ulong num3;
583 while (true)
584 {
585 Vector128<byte> vector = AdvSimd.LoadVector128(pData + num);
586 Vector128<byte> left = AdvSimd.Arm64.VectorTableLookup(asVector, AdvSimd.And(vector, right));
587 Vector128<byte> right3 = AdvSimd.Arm64.VectorTableLookup(table, AdvSimd.ShiftRightArithmetic(vector.AsSByte(), 4).AsByte());
588 Vector128<byte> left2 = AdvSimd.CompareTest(left, right3);
589 Vector128<byte> vector2 = AdvSimd.And(left2, right2);
590 num3 = AdvSimd.Arm64.AddPairwise(vector2, vector2).AsUInt64().ToScalar();
591 if (num3 != ulong.MaxValue)
592 {
593 break;
594 }
595 if ((num += 16) < num2)
596 {
597 continue;
598 }
599 goto IL_00ca;
600 }
601 num += (uint)(BitOperations.TrailingZeroCount(~num3) >>> 2);
602 goto IL_01c7;
603 IL_01c7:
604 return num;
605 IL_00ca:
606 if ((lengthInBytes & 8) != 0)
607 {
608 Vector128<byte> vector3 = AdvSimd.LoadVector64(pData + num).ToVector128Unsafe();
609 Vector128<byte> left3 = AdvSimd.Arm64.VectorTableLookup(asVector, AdvSimd.And(vector3, right));
610 Vector128<byte> right4 = AdvSimd.Arm64.VectorTableLookup(table, AdvSimd.ShiftRightArithmetic(vector3.AsSByte(), 4).AsByte());
611 Vector128<byte> vector4 = AdvSimd.CompareTest(left3, right4);
612 num3 = vector4.AsUInt64().ToScalar();
613 if (num3 != ulong.MaxValue)
614 {
615 goto IL_01dc;
616 }
617 num += 8;
618 }
619 if ((lengthInBytes & 4) != 0)
620 {
621 Vector128<byte> vector5 = Vector128.CreateScalarUnsafe(Unsafe.ReadUnaligned<uint>(pData + num)).AsByte();
622 Vector128<byte> left4 = AdvSimd.Arm64.VectorTableLookup(asVector, AdvSimd.And(vector5, right));
623 Vector128<byte> right5 = AdvSimd.Arm64.VectorTableLookup(table, AdvSimd.ShiftRightArithmetic(vector5.AsSByte(), 4).AsByte());
624 Vector128<byte> vector6 = AdvSimd.CompareTest(left4, right5);
625 num3 = vector6.AsUInt32().ToScalar();
626 if (num3 != uint.MaxValue)
627 {
628 goto IL_01dc;
629 }
630 num += 4;
631 }
632 if ((lengthInBytes & 3) != 0)
633 {
634 while (_allowedAsciiCodePoints.IsAllowedAsciiCodePoint(pData[num]) && ++num != lengthInBytes)
635 {
636 }
637 }
638 goto IL_01c7;
639 IL_01dc:
640 num += (uint)(BitOperations.TrailingZeroCount(~num3) >>> 3);
641 goto IL_01c7;
642 }
static int TrailingZeroCount(int value)
static Vector128< byte > VectorTableLookup(Vector128< byte > table, Vector128< byte > byteIndexes)
Definition AdvSimd.cs:2774
static Vector128< byte > AddPairwise(Vector128< byte > left, Vector128< byte > right)
Definition AdvSimd.cs:239
static unsafe Vector128< byte > LoadVector128(byte *address)
Definition AdvSimd.cs:6034
static Vector64< byte > And(Vector64< byte > left, Vector64< byte > right)
Definition AdvSimd.cs:3919
static Vector64< short > ShiftRightArithmetic(Vector64< short > value, byte count)
Definition AdvSimd.cs:9369
static unsafe Vector64< byte > LoadVector64(byte *address)
Definition AdvSimd.cs:5984
static Vector64< byte > CompareTest(Vector64< byte > left, Vector64< byte > right)
Definition AdvSimd.cs:4589
static Vector128< byte > Create(byte value)
Definition Vector128.cs:138
static unsafe Vector128< byte > CreateScalarUnsafe(byte value)
Definition Vector128.cs:829

References System.Text.Encodings.Web.OptimizedInboxTextEncoder._allowedAsciiCodePoints, System.Runtime.Intrinsics.Arm.AdvSimd.Arm64.AddPairwise(), System.Runtime.Intrinsics.Arm.AdvSimd.And(), System.Text.Encodings.Web.OptimizedInboxTextEncoder.AllowedAsciiCodePoints.AsVector, System.Runtime.Intrinsics.Arm.AdvSimd.CompareTest(), System.Runtime.Intrinsics.Vector128< T >.Create(), System.Runtime.Intrinsics.Vector128< T >.CreateScalarUnsafe(), System.Text.Encodings.Web.OptimizedInboxTextEncoder.AllowedAsciiCodePoints.IsAllowedAsciiCodePoint(), System.Runtime.Intrinsics.Arm.AdvSimd.LoadVector128(), System.Runtime.Intrinsics.Arm.AdvSimd.LoadVector64(), System.Runtime.Intrinsics.Arm.AdvSimd.ShiftRightArithmetic(), System.Numerics.BitOperations.TrailingZeroCount(), and System.Runtime.Intrinsics.Arm.AdvSimd.Arm64.VectorTableLookup().

Referenced by System.Text.Encodings.Web.OptimizedInboxTextEncoder.GetIndexOfFirstByteToEncode().