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

◆ Avx2Encode()

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

Definition at line 551 of file Base64.cs.

552 {
553 Vector256<sbyte> mask = Vector256.Create(5, 4, 6, 5, 8, 7, 9, 8, 11, 10, 12, 11, 14, 13, 15, 14, 1, 0, 2, 1, 4, 3, 5, 4, 7, 6, 8, 7, 10, 9, 11, 10);
554 Vector256<sbyte> value = Vector256.Create(65, 71, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -19, -16, 0, 0, 65, 71, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -19, -16, 0, 0);
555 Vector256<sbyte> right = Vector256.Create(264305664).AsSByte();
556 Vector256<sbyte> right2 = Vector256.Create(4129776).AsSByte();
557 Vector256<ushort> right3 = Vector256.Create(67108928).AsUInt16();
558 Vector256<short> right4 = Vector256.Create(16777232).AsInt16();
559 Vector256<byte> right5 = Vector256.Create((byte)51);
560 Vector256<sbyte> right6 = Vector256.Create((sbyte)25);
561 byte* ptr = srcBytes;
562 byte* ptr2 = destBytes;
563 Vector256<sbyte> vector = Avx.LoadVector256(ptr).AsSByte();
564 vector = Avx2.PermuteVar8x32(vector.AsInt32(), Vector256.Create(0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, 4, 0, 0, 0, 5, 0, 0, 0, 6, 0, 0, 0).AsInt32()).AsSByte();
565 ptr -= 4;
566 while (true)
567 {
568 vector = Avx2.Shuffle(vector, mask);
569 Vector256<sbyte> vector2 = Avx2.And(vector, right);
570 Vector256<sbyte> vector3 = Avx2.And(vector, right2);
571 Vector256<ushort> vector4 = Avx2.MultiplyHigh(vector2.AsUInt16(), right3);
572 Vector256<short> vector5 = Avx2.MultiplyLow(vector3.AsInt16(), right4);
573 vector = Avx2.Or(vector4.AsSByte(), vector5.AsSByte());
574 Vector256<byte> vector6 = Avx2.SubtractSaturate(vector.AsByte(), right5);
575 Vector256<sbyte> right7 = Avx2.CompareGreaterThan(vector, right6);
576 Vector256<sbyte> mask2 = Avx2.Subtract(vector6.AsSByte(), right7);
577 vector = Avx2.Add(vector, Avx2.Shuffle(value, mask2));
578 Avx.Store(ptr2, vector.AsByte());
579 ptr += 24;
580 ptr2 += 32;
581 if (ptr > srcEnd)
582 {
583 break;
584 }
585 vector = Avx.LoadVector256(ptr).AsSByte();
586 }
587 srcBytes = ptr + 4;
588 destBytes = ptr2;
589 }
static Vector256< byte > Create(byte value)
Definition Vector256.cs:105
static Vector256< sbyte > CompareGreaterThan(Vector256< sbyte > left, Vector256< sbyte > right)
Definition Avx2.cs:552
static Vector256< sbyte > SubtractSaturate(Vector256< sbyte > left, Vector256< sbyte > right)
Definition Avx2.cs:2173
static Vector256< sbyte > Add(Vector256< sbyte > left, Vector256< sbyte > right)
Definition Avx2.cs:32
static Vector256< sbyte > And(Vector256< sbyte > left, Vector256< sbyte > right)
Definition Avx2.cs:132
static Vector256< sbyte > Subtract(Vector256< sbyte > left, Vector256< sbyte > right)
Definition Avx2.cs:2133
static Vector256< short > MultiplyLow(Vector256< short > left, Vector256< short > right)
Definition Avx2.cs:1618
static Vector256< sbyte > Or(Vector256< sbyte > left, Vector256< sbyte > right)
Definition Avx2.cs:1638
static Vector256< short > MultiplyHigh(Vector256< short > left, Vector256< short > right)
Definition Avx2.cs:1603
static Vector256< sbyte > Shuffle(Vector256< sbyte > value, Vector256< sbyte > mask)
Definition Avx2.cs:2078
static Vector256< int > PermuteVar8x32(Vector256< int > left, Vector256< int > control)
Definition Avx2.cs:1753
static unsafe Vector256< sbyte > LoadVector256(sbyte *address)
Definition Avx.cs:462
static unsafe void Store(sbyte *address, Vector256< sbyte > source)
Definition Avx.cs:962

References System.Runtime.Intrinsics.X86.Avx2.Add(), System.Runtime.Intrinsics.X86.Avx2.And(), System.Runtime.Intrinsics.X86.Avx2.CompareGreaterThan(), System.Runtime.Intrinsics.Vector256< T >.Create(), System.Runtime.Intrinsics.X86.Avx.LoadVector256(), System.Runtime.Intrinsics.X86.Avx2.MultiplyHigh(), System.Runtime.Intrinsics.X86.Avx2.MultiplyLow(), System.Runtime.Intrinsics.X86.Avx2.Or(), System.Runtime.Intrinsics.X86.Avx2.PermuteVar8x32(), System.Runtime.Intrinsics.X86.Avx2.Shuffle(), System.Runtime.Intrinsics.X86.Avx.Store(), System.Runtime.Intrinsics.X86.Avx2.Subtract(), System.Runtime.Intrinsics.X86.Avx2.SubtractSaturate(), and System.value.

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