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

◆ Ssse3Decode()

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

Definition at line 348 of file Base64.cs.

349 {
350 Vector128<sbyte> value = Vector128.Create(16, 16, 1, 2, 4, 8, 4, 8, 16, 16, 16, 16, 16, 16, 16, 16);
351 Vector128<sbyte> value2 = Vector128.Create(21, 17, 17, 17, 17, 17, 17, 17, 17, 17, 19, 26, 27, 27, 27, 26);
352 Vector128<sbyte> value3 = Vector128.Create(0, 16, 19, 4, -65, -65, -71, -71, 0, 0, 0, 0, 0, 0, 0, 0);
353 Vector128<sbyte> mask = Vector128.Create(2, 1, 0, 6, 5, 4, 10, 9, 8, 14, 13, 12, -1, -1, -1, -1);
354 Vector128<sbyte> right = Vector128.Create((sbyte)47);
355 Vector128<sbyte> right2 = Vector128.Create(20971840).AsSByte();
356 Vector128<short> right3 = Vector128.Create(69632).AsInt16();
358 byte* ptr = srcBytes;
359 byte* ptr2 = destBytes;
360 do
361 {
362 Vector128<sbyte> vector = Sse2.LoadVector128(ptr).AsSByte();
363 Vector128<sbyte> vector2 = Sse2.And(Sse2.ShiftRightLogical(vector.AsInt32(), 4).AsSByte(), right);
364 Vector128<sbyte> mask2 = Sse2.And(vector, right);
365 Vector128<sbyte> right4 = Ssse3.Shuffle(value, vector2);
366 Vector128<sbyte> left = Ssse3.Shuffle(value2, mask2);
367 if (Sse2.MoveMask(Sse2.CompareGreaterThan(Sse2.And(left, right4), zero)) != 0)
368 {
369 break;
370 }
371 Vector128<sbyte> left2 = Sse2.CompareEqual(vector, right);
372 Vector128<sbyte> right5 = Ssse3.Shuffle(value3, Sse2.Add(left2, vector2));
373 vector = Sse2.Add(vector, right5);
374 Vector128<short> left3 = Ssse3.MultiplyAddAdjacent(vector.AsByte(), right2);
375 Vector128<int> vector3 = Sse2.MultiplyAddAdjacent(left3, right3);
376 vector = Ssse3.Shuffle(vector3.AsSByte(), mask);
377 Sse2.Store(ptr2, vector.AsByte());
378 ptr += 16;
379 ptr2 += 12;
380 }
381 while (ptr <= srcEnd);
382 srcBytes = ptr;
383 destBytes = ptr2;
384 }
static Vector128< byte > Create(byte value)
Definition Vector128.cs:138
static unsafe Vector128< sbyte > LoadVector128(sbyte *address)
Definition Sse2.cs:582
static int MoveMask(Vector128< sbyte > value)
Definition Sse2.cs:772
static Vector128< sbyte > CompareEqual(Vector128< sbyte > left, Vector128< sbyte > right)
Definition Sse2.cs:232
static unsafe void Store(sbyte *address, Vector128< sbyte > source)
Definition Sse2.cs:1287
static Vector128< int > MultiplyAddAdjacent(Vector128< short > left, Vector128< short > right)
Definition Sse2.cs:822
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< byte > Add(Vector128< byte > left, Vector128< byte > right)
Definition Sse2.cs:62
static Vector128< short > ShiftRightLogical(Vector128< short > value, Vector128< short > count)
Definition Sse2.cs:1057
static Vector128< short > MultiplyAddAdjacent(Vector128< byte > left, Vector128< sbyte > right)
Definition Ssse3.cs:102
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.CompareEqual(), System.Runtime.Intrinsics.X86.Sse2.CompareGreaterThan(), System.Runtime.Intrinsics.Vector128< T >.Create(), System.Runtime.Intrinsics.X86.Sse2.LoadVector128(), System.Runtime.Intrinsics.X86.Sse2.MoveMask(), System.Runtime.Intrinsics.X86.Ssse3.MultiplyAddAdjacent(), System.Runtime.Intrinsics.X86.Sse2.MultiplyAddAdjacent(), System.Runtime.Intrinsics.X86.Sse2.ShiftRightLogical(), System.Runtime.Intrinsics.X86.Ssse3.Shuffle(), System.Runtime.Intrinsics.X86.Sse2.Store(), System.value, and System.Runtime.Intrinsics.Vector128< T >.Zero.

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