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

◆ Ssse3Encode()

static unsafe void System.Buffers.Text.Base64.Ssse3Encode ( ref byte * srcBytes,
ref byte * destBytes,
byte * srcEnd,
int sourceLength,
int destLength,
byte * srcStart,
byte * destStart )
inlinestaticprivate

Definition at line 592 of file Base64.cs.

593 {
594 Vector128<sbyte> mask = Vector128.Create(1, 0, 2, 1, 4, 3, 5, 4, 7, 6, 8, 7, 10, 9, 11, 10);
595 Vector128<sbyte> value = Vector128.Create(65, 71, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -19, -16, 0, 0);
596 Vector128<sbyte> right = Vector128.Create(264305664).AsSByte();
597 Vector128<sbyte> right2 = Vector128.Create(4129776).AsSByte();
598 Vector128<ushort> right3 = Vector128.Create(67108928).AsUInt16();
599 Vector128<short> right4 = Vector128.Create(16777232).AsInt16();
600 Vector128<byte> right5 = Vector128.Create((byte)51);
601 Vector128<sbyte> right6 = Vector128.Create((sbyte)25);
602 byte* ptr = srcBytes;
603 byte* ptr2 = destBytes;
604 do
605 {
606 Vector128<sbyte> value2 = Sse2.LoadVector128(ptr).AsSByte();
607 value2 = Ssse3.Shuffle(value2, mask);
608 Vector128<sbyte> vector = Sse2.And(value2, right);
609 Vector128<sbyte> vector2 = Sse2.And(value2, right2);
610 Vector128<ushort> vector3 = Sse2.MultiplyHigh(vector.AsUInt16(), right3);
611 Vector128<short> vector4 = Sse2.MultiplyLow(vector2.AsInt16(), right4);
612 value2 = Sse2.Or(vector3.AsSByte(), vector4.AsSByte());
613 Vector128<byte> vector5 = Sse2.SubtractSaturate(value2.AsByte(), right5);
614 Vector128<sbyte> right7 = Sse2.CompareGreaterThan(value2, right6);
615 Vector128<sbyte> mask2 = Sse2.Subtract(vector5.AsSByte(), right7);
616 value2 = Sse2.Add(value2, Ssse3.Shuffle(value, mask2));
617 Sse2.Store(ptr2, value2.AsByte());
618 ptr += 12;
619 ptr2 += 16;
620 }
621 while (ptr <= srcEnd);
622 srcBytes = ptr;
623 destBytes = ptr2;
624 }
static Vector128< byte > Create(byte value)
Definition Vector128.cs:138
static unsafe Vector128< sbyte > LoadVector128(sbyte *address)
Definition Sse2.cs:582
static Vector128< sbyte > SubtractSaturate(Vector128< sbyte > left, Vector128< sbyte > right)
Definition Sse2.cs:1402
static unsafe void Store(sbyte *address, Vector128< sbyte > source)
Definition Sse2.cs:1287
static Vector128< byte > Or(Vector128< byte > left, Vector128< byte > right)
Definition Sse2.cs:837
static Vector128< sbyte > CompareGreaterThan(Vector128< sbyte > left, Vector128< sbyte > right)
Definition Sse2.cs:282
static Vector128< byte > And(Vector128< byte > left, Vector128< byte > right)
Definition Sse2.cs:132
static Vector128< short > MultiplyLow(Vector128< short > left, Vector128< short > right)
Definition Sse2.cs:827
static Vector128< byte > Subtract(Vector128< byte > left, Vector128< byte > right)
Definition Sse2.cs:1352
static Vector128< byte > Add(Vector128< byte > left, Vector128< byte > right)
Definition Sse2.cs:62
static Vector128< short > MultiplyHigh(Vector128< short > left, Vector128< short > right)
Definition Sse2.cs:812
static Vector128< sbyte > Shuffle(Vector128< sbyte > value, Vector128< sbyte > mask)
Definition Ssse3.cs:112

References System.Runtime.Intrinsics.X86.Sse2.Add(), System.Runtime.Intrinsics.X86.Sse2.And(), System.Runtime.Intrinsics.X86.Sse2.CompareGreaterThan(), System.Runtime.Intrinsics.Vector128< T >.Create(), System.Runtime.Intrinsics.X86.Sse2.LoadVector128(), System.Runtime.Intrinsics.X86.Sse2.MultiplyHigh(), System.Runtime.Intrinsics.X86.Sse2.MultiplyLow(), System.Runtime.Intrinsics.X86.Sse2.Or(), System.Runtime.Intrinsics.X86.Ssse3.Shuffle(), System.Runtime.Intrinsics.X86.Sse2.Store(), System.Runtime.Intrinsics.X86.Sse2.Subtract(), System.Runtime.Intrinsics.X86.Sse2.SubtractSaturate(), and System.value.

Referenced by System.Buffers.Text.Base64.EncodeToUtf8().