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

◆ GetIndexOfFirstCharToEncodeAdvSimd64()

unsafe nuint System.Text.Encodings.Web.OptimizedInboxTextEncoder.GetIndexOfFirstCharToEncodeAdvSimd64 ( char * pData,
nuint lengthInChars )
inlineprivate

Definition at line 644 of file OptimizedInboxTextEncoder.cs.

645 {
646 Vector128<byte> right = Vector128.Create((byte)15);
647 Vector128<byte> table = Vector128.Create(1, 2, 4, 8, 16, 32, 64, 128, 0, 0, 0, 0, 0, 0, 0, 0);
648 Vector128<byte> right2 = Vector128.Create((ushort)61455).AsByte();
650 nuint num = 0u;
651 if (lengthInChars < 16)
652 {
653 goto IL_00f0;
654 }
655 nuint num2 = lengthInChars & unchecked((nuint)(-16));
656 ulong num3;
657 while (true)
658 {
660 Vector128<byte> left = AdvSimd.Arm64.VectorTableLookup(asVector, AdvSimd.And(vector, right));
661 Vector128<byte> right3 = AdvSimd.Arm64.VectorTableLookup(table, AdvSimd.ShiftRightArithmetic(vector.AsSByte(), 4).AsByte());
662 Vector128<byte> left2 = AdvSimd.CompareTest(left, right3);
663 Vector128<byte> vector2 = AdvSimd.And(left2, right2);
664 num3 = AdvSimd.Arm64.AddPairwise(vector2, vector2).AsUInt64().ToScalar();
665 if (num3 != ulong.MaxValue)
666 {
667 break;
668 }
669 if ((num += 16) < num2)
670 {
671 continue;
672 }
673 goto IL_00f0;
674 }
675 num += (uint)(BitOperations.TrailingZeroCount(~num3) >>> 2);
676 goto IL_0205;
677 IL_0205:
678 return num;
679 IL_00f0:
680 if ((lengthInChars & 8) != 0)
681 {
682 Vector128<byte> vector3 = AdvSimd.ExtractNarrowingSaturateUnsignedLower(AdvSimd.LoadVector128((short*)(pData + num))).AsByte().ToVector128Unsafe();
683 Vector128<byte> left3 = AdvSimd.Arm64.VectorTableLookup(asVector, AdvSimd.And(vector3, right));
684 Vector128<byte> right4 = AdvSimd.Arm64.VectorTableLookup(table, AdvSimd.ShiftRightArithmetic(vector3.AsSByte(), 4).AsByte());
685 Vector128<byte> vector4 = AdvSimd.CompareTest(left3, right4);
686 num3 = vector4.AsUInt64().ToScalar();
687 if (num3 != ulong.MaxValue)
688 {
689 goto IL_021a;
690 }
691 num += 8;
692 }
693 if ((lengthInChars & 4) != 0)
694 {
695 Vector128<byte> vector5 = AdvSimd.ExtractNarrowingSaturateUnsignedLower(AdvSimd.LoadVector64((short*)(pData + num)).ToVector128Unsafe()).ToVector128Unsafe();
696 Vector128<byte> left4 = AdvSimd.Arm64.VectorTableLookup(asVector, AdvSimd.And(vector5, right));
697 Vector128<byte> right5 = AdvSimd.Arm64.VectorTableLookup(table, AdvSimd.ShiftRightArithmetic(vector5.AsSByte(), 4).AsByte());
698 Vector128<byte> vector6 = AdvSimd.CompareTest(left4, right5);
699 num3 = vector6.AsUInt32().ToScalar();
700 if (num3 != uint.MaxValue)
701 {
702 goto IL_021a;
703 }
704 num += 4;
705 }
706 if ((lengthInChars & 3) != 0)
707 {
708 while (_allowedAsciiCodePoints.IsAllowedAsciiCodePoint(pData[num]) && ++num != lengthInChars)
709 {
710 }
711 }
712 goto IL_0205;
713 IL_021a:
714 num += (uint)(BitOperations.TrailingZeroCount(~num3) >>> 3);
715 goto IL_0205;
716 }
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 Vector64< byte > ExtractNarrowingSaturateUnsignedLower(Vector128< short > value)
Definition AdvSimd.cs:5204
static unsafe Vector64< byte > LoadVector64(byte *address)
Definition AdvSimd.cs:5984
static Vector128< byte > ExtractNarrowingSaturateUnsignedUpper(Vector64< byte > lower, Vector128< short > value)
Definition AdvSimd.cs:5219
static Vector64< byte > CompareTest(Vector64< byte > left, Vector64< byte > right)
Definition AdvSimd.cs:4589
static Vector128< byte > Create(byte value)
Definition Vector128.cs:138

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.Arm.AdvSimd.ExtractNarrowingSaturateUnsignedLower(), System.Runtime.Intrinsics.Arm.AdvSimd.ExtractNarrowingSaturateUnsignedUpper(), 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.GetIndexOfFirstCharToEncode().