Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Vector256<ulong> accumulator0 = Vector256.Create(Prime32.Prime2, Prime64.Prime0, Prime64.Prime1, Prime64.Prime2);
- Vector256<ulong> accumulator1 = Vector256.Create(Prime64.Prime3, Prime32.Prime1, Prime64.Prime4, Prime32.Prime0);
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- static ValueTuple<Vector256<ulong>, Vector256<ulong>> Pass(byte* data, byte* secret, in Vector256<ulong> accumulator0, in Vector256<ulong> accumulator1, uint offset) {
- PrefetchNonTemporalNext(data + (offset * StripeLength) + 0x040);
- PrefetchNonTemporalNext(data + (offset * StripeLength) + 0x080);
- byte* lData = data + (offset * StripeLength);
- byte* lSecret = secret + (offset * 8u);
- var dataVec0 = *(Vector256<ulong>*)(lData + 0x00u);
- var dataVec1 = *(Vector256<ulong>*)(lData + 0x20u);
- var keyVec0 = *(Vector256<ulong>*)(lSecret + 0x00u);
- var keyVec1 = *(Vector256<ulong>*)(lSecret + 0x20u);
- var dataKey0 = Avx2.Xor(dataVec0, keyVec0);
- var dataKey1 = Avx2.Xor(dataVec1, keyVec1);
- var dataKeyLo0 = Avx2.Shuffle(dataKey0.AsUInt32(), ShuffleDataKey);
- var dataKeyLo1 = Avx2.Shuffle(dataKey1.AsUInt32(), ShuffleDataKey);
- var product0 = Avx2.Multiply(dataKey0.AsUInt32(), dataKeyLo0);
- var product1 = Avx2.Multiply(dataKey1.AsUInt32(), dataKeyLo1);
- var dataSwap0 = Avx2.Shuffle(dataVec0.AsUInt32(), ShuffleDataSwap);
- var dataSwap1 = Avx2.Shuffle(dataVec1.AsUInt32(), ShuffleDataSwap);
- var addend0 = accumulator0;
- var addend1 = accumulator1;
- var sum0 = Avx2.Add(addend0, dataSwap0.AsUInt64());
- var sum1 = Avx2.Add(addend1, dataSwap1.AsUInt64());
- var result0 = Avx2.Add(product0, sum0);
- var result1 = Avx2.Add(product1, sum1);
- addend0 = result0;
- addend1 = result1;
- var dataVec2 = *(Vector256<ulong>*)(lData + 0x40u);
- var dataVec3 = *(Vector256<ulong>*)(lData + 0x60u);
- var keyVec2 = *(Vector256<ulong>*)(lSecret + 0x08u);
- var keyVec3 = *(Vector256<ulong>*)(lSecret + 0x28u);
- var dataKey2 = Avx2.Xor(dataVec2, keyVec2);
- var dataKey3 = Avx2.Xor(dataVec3, keyVec3);
- var dataKeyLo2 = Avx2.Shuffle(dataKey2.AsUInt32(), ShuffleDataKey);
- var dataKeyLo3 = Avx2.Shuffle(dataKey3.AsUInt32(), ShuffleDataKey);
- var product2 = Avx2.Multiply(dataKey2.AsUInt32(), dataKeyLo2);
- var product3 = Avx2.Multiply(dataKey3.AsUInt32(), dataKeyLo3);
- var dataSwap2 = Avx2.Shuffle(dataVec2.AsUInt32(), ShuffleDataSwap);
- var dataSwap3 = Avx2.Shuffle(dataVec3.AsUInt32(), ShuffleDataSwap);
- var sum2 = Avx2.Add(addend0, dataSwap2.AsUInt64());
- var sum3 = Avx2.Add(addend1, dataSwap3.AsUInt64());
- var result2 = Avx2.Add(product2, sum2);
- var result3 = Avx2.Add(product3, sum3);
- return (
- result2,
- result3
- );
- }
- {
- // 0
- (accumulator0, accumulator1) = Pass(data, secret, in accumulator0, in accumulator1, 0);
- (accumulator0, accumulator1) = Pass(data, secret, in accumulator0, in accumulator1, 2);
- (accumulator0, accumulator1) = Pass(data, secret, in accumulator0, in accumulator1, 4);
- (accumulator0, accumulator1) = Pass(data, secret, in accumulator0, in accumulator1, 6);
- (accumulator0, accumulator1) = Pass(data, secret, in accumulator0, in accumulator1, 8);
- (accumulator0, accumulator1) = Pass(data, secret, in accumulator0, in accumulator1, 10);
- (accumulator0, accumulator1) = Pass(data, secret, in accumulator0, in accumulator1, 12);
Advertisement
Add Comment
Please, Sign In to add comment