370 lines
21 KiB
Metal
370 lines
21 KiB
Metal
#include <metal_stdlib>
|
|
using namespace metal;
|
|
|
|
#define MASK 0x0fffffffu
|
|
constant uint SEEDW[8] = { 0x667d0fbdu, 0x7b8e5963u, 0x31c67e5eu, 0x4529ddc6u, 0xef19d6d8u, 0xaccf6211u, 0xda0aed32u, 0xabc6df31u };
|
|
|
|
inline uint splitmix32(uint x) {
|
|
x ^= x >> 16; x *= 0x7feb352du;
|
|
x ^= x >> 15; x *= 0x846ca68bu;
|
|
x ^= x >> 16;
|
|
return x;
|
|
}
|
|
inline uint rotl_imm(uint x, uint n) { return (x << n) | (x >> (32u - n)); } // n in 1..31
|
|
inline uint rotr_var(uint x, uint n) { n &= 31u; return (x >> n) | (x << ((32u - n) & 31u)); }
|
|
inline uint ds_elem(uint i, uint d0, uint d1) {
|
|
uint x = i ^ d0;
|
|
x *= 0x9E3779B1u; x ^= x >> 15;
|
|
x += d1;
|
|
x *= 0x85EBCA77u; x ^= x >> 13;
|
|
x *= 0xC2B2AE3Du; x ^= x >> 16;
|
|
return x;
|
|
}
|
|
|
|
// Header-bound variant: the init words come from buffer 3 (bind.rs), not from SEEDW.
|
|
kernel void igneum_hash_bound(device const uint* dataset [[buffer(0)]],
|
|
device ulong* out [[buffer(1)]],
|
|
constant uint& baseNonce [[buffer(2)]],
|
|
constant uint* initw [[buffer(3)]],
|
|
uint gid [[thread_position_in_grid]]) {
|
|
uint nonce = baseNonce + gid;
|
|
uint r0, r1, r2, r3, r4, r5, r6, r7;
|
|
{ uint x = nonce ^ initw[0]; x += 0x9e3779b9u * 1u; x = splitmix32(x); r0 = x ^ initw[1]; }
|
|
{ uint x = nonce ^ initw[1]; x += 0x9e3779b9u * 2u; x = splitmix32(x); r1 = x ^ initw[2]; }
|
|
{ uint x = nonce ^ initw[2]; x += 0x9e3779b9u * 3u; x = splitmix32(x); r2 = x ^ initw[3]; }
|
|
{ uint x = nonce ^ initw[3]; x += 0x9e3779b9u * 4u; x = splitmix32(x); r3 = x ^ initw[4]; }
|
|
{ uint x = nonce ^ initw[4]; x += 0x9e3779b9u * 5u; x = splitmix32(x); r4 = x ^ initw[5]; }
|
|
{ uint x = nonce ^ initw[5]; x += 0x9e3779b9u * 6u; x = splitmix32(x); r5 = x ^ initw[6]; }
|
|
{ uint x = nonce ^ initw[6]; x += 0x9e3779b9u * 7u; x = splitmix32(x); r6 = x ^ initw[7]; }
|
|
{ uint x = nonce ^ initw[7]; x += 0x9e3779b9u * 8u; x = splitmix32(x); r7 = x ^ initw[0]; }
|
|
|
|
for (uint it = 0u; it < 8u; ++it) {
|
|
uint sel = r0;
|
|
r4 = r4 + r5 + select(0xea86e152u, 0x5810667au, ((sel >> 13u) & 1u) != 0u); // 0
|
|
r7 = r7 ^ r0; // 1
|
|
r3 = r3 ^ simd_shuffle_xor(r6, (ushort)1); // 2
|
|
r4 = r4 - r1; // 3
|
|
r2 = r0 * r4 + r2; // 4
|
|
r4 = rotl_imm(r4, 9u); // 5
|
|
r0 = rotr_var(r0, r2); // 6
|
|
r6 = r6 ^ dataset[((rotl_imm(r7 * 0x27ea7effu, 30u) & 0x03ffffffu) | 0x04000000u) & MASK]; // 7
|
|
r1 = r1 ^ dataset[((rotl_imm(r4 * 0x27ea7effu, 30u) & 0x07ffffffu) | 0x08000000u) & MASK]; // 8
|
|
r1 = r1 ^ dataset[((rotl_imm(r2 * 0x27ea7effu, 30u) & 0x07ffffffu) | 0x08000000u) & MASK]; // 9
|
|
r7 = r7 ^ dataset[((rotl_imm(r0 * 0x27ea7effu, 30u) & 0x07ffffffu) | 0x08000000u) & MASK]; // 10
|
|
r7 = r7 ^ dataset[((rotl_imm(r1 * 0x27ea7effu, 30u) & 0x0fffffffu) | 0x00000000u) & MASK]; // 11
|
|
r5 = r5 * r4; // 12
|
|
r7 = r7 ^ dataset[((rotl_imm(r6 * 0x27ea7effu, 30u) & 0x07ffffffu) | 0x08000000u) & MASK]; // 13
|
|
r6 = r6 ^ simd_shuffle_xor(r5, (ushort)16); // 14
|
|
r3 = r3 ^ simd_shuffle_xor(r5, (ushort)1); // 15
|
|
r2 = r2 | r7; // 16
|
|
r0 = rotr_var(r0, r6); // 17
|
|
r7 = r7 + r5 + select(0xf66e7017u, 0xb9e3577eu, ((sel >> 12u) & 1u) != 0u); // 18
|
|
r7 = rotl_imm(r7, 24u); // 19
|
|
r6 = r6 + r7 + select(0x52334d12u, 0x8c9f0ef8u, ((sel >> 23u) & 1u) != 0u); // 20
|
|
r2 = r2 | r6; // 21
|
|
r6 = r5 * r4 + r6; // 22
|
|
r1 = r1 | r0; // 23
|
|
r6 = r6 ^ r1; // 24
|
|
r2 = r2 + r6 + select(0x659fc3d3u, 0x9cec0e12u, ((sel >> 17u) & 1u) != 0u); // 25
|
|
r7 = rotr_var(r7, r0); // 26
|
|
r4 = r5 * r7 + r4; // 27
|
|
r3 = r2 * r4 + r3; // 28
|
|
r1 = r1 ^ dataset[((rotl_imm(r4 * 0x27ea7effu, 30u) & 0x0fffffffu) | 0x00000000u) & MASK]; // 29
|
|
r2 = r2 ^ dataset[((rotl_imm(r3 * 0x27ea7effu, 30u) & 0x03ffffffu) | 0x08000000u) & MASK]; // 30
|
|
r1 = r1 ^ dataset[((rotl_imm(r5 * 0x27ea7effu, 30u) & 0x07ffffffu) | 0x08000000u) & MASK]; // 31
|
|
r7 = r7 + r2 + select(0x070888a8u, 0xe403240eu, ((sel >> 16u) & 1u) != 0u); // 32
|
|
r2 = r2 + r0 + select(0xf2e46d55u, 0x29701828u, ((sel >> 28u) & 1u) != 0u); // 33
|
|
r2 = r2 + r3 + select(0x58f75b87u, 0x343b7aeeu, ((sel >> 14u) & 1u) != 0u); // 34
|
|
r2 = mulhi(r2, r5); // 35
|
|
r4 = r4 ^ r2; // 36
|
|
r6 = r6 * r5; // 37
|
|
r7 = r7 ^ r0; // 38
|
|
r7 = r7 + r2 + select(0xb8180e9du, 0x32bbd117u, ((sel >> 19u) & 1u) != 0u); // 39
|
|
r2 = rotr_var(r2, r3); // 40
|
|
r7 = r7 - r0; // 41
|
|
r4 = r4 + r3 + select(0x6ced15b7u, 0x6df7aed4u, ((sel >> 4u) & 1u) != 0u); // 42
|
|
r7 = r7 ^ simd_shuffle_xor(r3, (ushort)4); // 43
|
|
r0 = r0 ^ dataset[((rotl_imm(r7 * 0x27ea7effu, 30u) & 0x07ffffffu) | 0x08000000u) & MASK]; // 44
|
|
r1 = r1 + r6 + select(0xe09f54e9u, 0x83e825bfu, ((sel >> 14u) & 1u) != 0u); // 45
|
|
r3 = r3 ^ dataset[((rotl_imm(r1 * 0x27ea7effu, 30u) & 0x03ffffffu) | 0x00000000u) & MASK]; // 46
|
|
r6 = r6 ^ dataset[((rotl_imm(r3 * 0x27ea7effu, 30u) & 0x0fffffffu) | 0x00000000u) & MASK]; // 47
|
|
r4 = mulhi(r4, r2); // 48
|
|
r5 = r5 + r0 + select(0xa8bae6dfu, 0xf572bdb9u, ((sel >> 7u) & 1u) != 0u); // 49
|
|
r0 = r0 ^ simd_shuffle_xor(r7, (ushort)4); // 50
|
|
r6 = r6 + r0 + select(0x383b9260u, 0x11e17c61u, ((sel >> 19u) & 1u) != 0u); // 51
|
|
r5 = r5 ^ dataset[((rotl_imm(r2 * 0x27ea7effu, 30u) & 0x0fffffffu) | 0x00000000u) & MASK]; // 52
|
|
r6 = rotl_imm(r6, 12u); // 53
|
|
r3 = rotl_imm(r3, 12u); // 54
|
|
r2 = r2 + r1 + select(0xac6be8e3u, 0x18d67dbbu, ((sel >> 10u) & 1u) != 0u); // 55
|
|
r1 = r1 ^ dataset[((rotl_imm(r4 * 0x27ea7effu, 30u) & 0x0fffffffu) | 0x00000000u) & MASK]; // 56
|
|
r5 = r5 + r0 + select(0xf03673feu, 0xa75cd60du, ((sel >> 12u) & 1u) != 0u); // 57
|
|
r5 = r5 ^ dataset[((rotl_imm(r0 * 0x27ea7effu, 30u) & 0x03ffffffu) | 0x00000000u) & MASK]; // 58
|
|
r1 = r1 + r4 + select(0xdecd4794u, 0x8dfb96bbu, ((sel >> 7u) & 1u) != 0u); // 59
|
|
r3 = mulhi(r3, r2); // 60
|
|
r6 = r6 | r4; // 61
|
|
r5 = r5 ^ simd_shuffle_xor(r4, (ushort)8); // 62
|
|
r3 = r3 ^ dataset[((rotl_imm(r6 * 0x27ea7effu, 30u) & 0x07ffffffu) | 0x08000000u) & MASK]; // 63
|
|
// latency-shadow block (Counter ASIC 3.0 item 8): 256 ALU instructions x 27 passes after instruction 63, no load
|
|
for (uint sh = 0u; sh < 27u; ++sh) {
|
|
r7 = r7 * r3; // s0 mul
|
|
r7 = r7 + r4 + select(0xecb44e9cu, 0x06575fd2u, ((sel >> 16u) & 1u) != 0u); // s1 add
|
|
r5 = mulhi(r5, r0); // s2 mulhi
|
|
r4 = r4 ^ simd_shuffle_xor(r5, (ushort)2); // s3 shfl
|
|
r4 = r4 ^ simd_shuffle_xor(r1, (ushort)1); // s4 shfl
|
|
r4 = r4 ^ simd_shuffle_xor(r5, (ushort)8); // s5 shfl
|
|
r6 = r6 - r1; // s6 sub
|
|
r3 = r3 | r4; // s7 or
|
|
r0 = r4 * r7 + r0; // s8 mad
|
|
r3 = r3 - r4; // s9 sub
|
|
r6 = r6 * r3; // s10 mul
|
|
r5 = mulhi(r5, r0); // s11 mulhi
|
|
r0 = r4 * r5 + r0; // s12 mad
|
|
r3 = r3 + r7 + select(0x78295146u, 0x41da8352u, ((sel >> 29u) & 1u) != 0u); // s13 add
|
|
r7 = r7 ^ r2; // s14 xor
|
|
r1 = r1 + r4 + select(0x1126a483u, 0x491bea93u, ((sel >> 12u) & 1u) != 0u); // s15 add
|
|
r1 = r1 ^ simd_shuffle_xor(r2, (ushort)8); // s16 shfl
|
|
r5 = rotr_var(r5, r0); // s17 rotr
|
|
r2 = r2 - r1; // s18 sub
|
|
r3 = mulhi(r3, r2); // s19 mulhi
|
|
r0 = r0 ^ r4; // s20 xor
|
|
r2 = r2 + r3 + select(0x7289ac7cu, 0xd0df3d0au, ((sel >> 31u) & 1u) != 0u); // s21 add
|
|
r2 = r2 ^ simd_shuffle_xor(r7, (ushort)2); // s22 shfl
|
|
r1 = r1 ^ simd_shuffle_xor(r0, (ushort)8); // s23 shfl
|
|
r1 = r1 - r2; // s24 sub
|
|
r7 = r3 * r1 + r7; // s25 mad
|
|
r2 = r2 ^ r6; // s26 xor
|
|
r4 = mulhi(r4, r2); // s27 mulhi
|
|
r1 = r1 ^ simd_shuffle_xor(r2, (ushort)2); // s28 shfl
|
|
r2 = r2 - r5; // s29 sub
|
|
r7 = mulhi(r7, r6); // s30 mulhi
|
|
r2 = rotr_var(r2, r7); // s31 rotr
|
|
r6 = rotl_imm(r6, 26u); // s32 rotl
|
|
r0 = r0 * r7; // s33 mul
|
|
r7 = r7 * r4; // s34 mul
|
|
r6 = r0 * r1 + r6; // s35 mad
|
|
r4 = r4 + r2 + select(0xfe2b1c7du, 0xb3e87396u, ((sel >> 4u) & 1u) != 0u); // s36 add
|
|
r7 = rotr_var(r7, r4); // s37 rotr
|
|
r5 = r2 * r7 + r5; // s38 mad
|
|
r6 = r6 + r2 + select(0xe036a560u, 0x31a906adu, ((sel >> 16u) & 1u) != 0u); // s39 add
|
|
r3 = r3 ^ simd_shuffle_xor(r6, (ushort)4); // s40 shfl
|
|
r5 = r5 ^ r0; // s41 xor
|
|
r5 = r5 ^ r3; // s42 xor
|
|
r6 = rotl_imm(r6, 31u); // s43 rotl
|
|
r0 = rotl_imm(r0, 6u); // s44 rotl
|
|
r2 = r0 * r6 + r2; // s45 mad
|
|
r0 = r6 * r0 + r0; // s46 mad
|
|
r5 = r5 ^ r2; // s47 xor
|
|
r1 = r1 + r5 + select(0xd802a3efu, 0xc839ad2eu, ((sel >> 27u) & 1u) != 0u); // s48 add
|
|
r0 = r0 ^ simd_shuffle_xor(r1, (ushort)2); // s49 shfl
|
|
r6 = r6 + r0 + select(0x8e71c4c0u, 0xe9d06965u, ((sel >> 18u) & 1u) != 0u); // s50 add
|
|
r1 = rotl_imm(r1, 3u); // s51 rotl
|
|
r6 = r6 ^ r2; // s52 xor
|
|
r5 = r5 ^ r6; // s53 xor
|
|
r2 = r2 * r6; // s54 mul
|
|
r0 = mulhi(r0, r2); // s55 mulhi
|
|
r6 = r6 ^ simd_shuffle_xor(r3, (ushort)1); // s56 shfl
|
|
r1 = r1 + r2 + select(0xb0eb7d4eu, 0x5b84a832u, ((sel >> 21u) & 1u) != 0u); // s57 add
|
|
r0 = rotr_var(r0, r1); // s58 rotr
|
|
r6 = r6 + r4 + select(0xd35e37c1u, 0x4e1a16c6u, ((sel >> 8u) & 1u) != 0u); // s59 add
|
|
r0 = r0 | r2; // s60 or
|
|
r5 = rotr_var(r5, r3); // s61 rotr
|
|
r4 = r4 - r2; // s62 sub
|
|
r0 = r0 + r1 + select(0x16221227u, 0xec29413au, ((sel >> 27u) & 1u) != 0u); // s63 add
|
|
r6 = rotl_imm(r6, 20u); // s64 rotl
|
|
r1 = r1 ^ r2; // s65 xor
|
|
r6 = rotl_imm(r6, 23u); // s66 rotl
|
|
r1 = r1 | r4; // s67 or
|
|
r7 = r4 * r0 + r7; // s68 mad
|
|
r1 = r1 | r5; // s69 or
|
|
r7 = r7 ^ r4; // s70 xor
|
|
r2 = r2 * r3; // s71 mul
|
|
r0 = r0 * r2; // s72 mul
|
|
r7 = r7 + r6 + select(0x5708524au, 0x85c0f694u, ((sel >> 4u) & 1u) != 0u); // s73 add
|
|
r3 = r7 * r0 + r3; // s74 mad
|
|
r0 = r0 ^ simd_shuffle_xor(r2, (ushort)8); // s75 shfl
|
|
r5 = r5 - r7; // s76 sub
|
|
r5 = r5 ^ simd_shuffle_xor(r1, (ushort)2); // s77 shfl
|
|
r5 = r5 + r0 + select(0xc4195db9u, 0xad4f292bu, ((sel >> 26u) & 1u) != 0u); // s78 add
|
|
r5 = r5 * r6; // s79 mul
|
|
r6 = r6 ^ simd_shuffle_xor(r7, (ushort)2); // s80 shfl
|
|
r5 = r5 * r6; // s81 mul
|
|
r7 = r7 | r3; // s82 or
|
|
r0 = r4 * r2 + r0; // s83 mad
|
|
r4 = rotl_imm(r4, 12u); // s84 rotl
|
|
r3 = r3 * r4; // s85 mul
|
|
r0 = r0 ^ simd_shuffle_xor(r2, (ushort)4); // s86 shfl
|
|
r2 = r2 ^ simd_shuffle_xor(r7, (ushort)4); // s87 shfl
|
|
r1 = r1 ^ r3; // s88 xor
|
|
r5 = r5 ^ r1; // s89 xor
|
|
r6 = r6 ^ simd_shuffle_xor(r1, (ushort)16); // s90 shfl
|
|
r5 = r5 + r0 + select(0x5570a07eu, 0xb41704ddu, ((sel >> 7u) & 1u) != 0u); // s91 add
|
|
r0 = mulhi(r0, r1); // s92 mulhi
|
|
r6 = r6 ^ simd_shuffle_xor(r0, (ushort)8); // s93 shfl
|
|
r3 = r3 + r6 + select(0xcd1be982u, 0x4674baa3u, ((sel >> 18u) & 1u) != 0u); // s94 add
|
|
r4 = rotl_imm(r4, 24u); // s95 rotl
|
|
r3 = r7 * r4 + r3; // s96 mad
|
|
r6 = r6 - r3; // s97 sub
|
|
r1 = r5 * r6 + r1; // s98 mad
|
|
r6 = rotr_var(r6, r2); // s99 rotr
|
|
r5 = r5 ^ r1; // s100 xor
|
|
r3 = r3 + r7 + select(0x60f87347u, 0x3d25f873u, ((sel >> 7u) & 1u) != 0u); // s101 add
|
|
r3 = r3 - r5; // s102 sub
|
|
r3 = r3 - r6; // s103 sub
|
|
r1 = r1 ^ simd_shuffle_xor(r6, (ushort)4); // s104 shfl
|
|
r3 = r3 | r5; // s105 or
|
|
r0 = r0 + r1 + select(0x9a16bcfbu, 0x018722b4u, ((sel >> 22u) & 1u) != 0u); // s106 add
|
|
r2 = r2 + r5 + select(0xbc4b5e44u, 0x44cbb3d8u, ((sel >> 6u) & 1u) != 0u); // s107 add
|
|
r2 = r6 * r1 + r2; // s108 mad
|
|
r0 = r0 ^ r1; // s109 xor
|
|
r4 = r4 | r2; // s110 or
|
|
r2 = rotl_imm(r2, 13u); // s111 rotl
|
|
r5 = mulhi(r5, r2); // s112 mulhi
|
|
r5 = r5 ^ r1; // s113 xor
|
|
r0 = rotl_imm(r0, 15u); // s114 rotl
|
|
r7 = r7 * r0; // s115 mul
|
|
r0 = r7 * r0 + r0; // s116 mad
|
|
r4 = rotl_imm(r4, 12u); // s117 rotl
|
|
r1 = r1 * r6; // s118 mul
|
|
r0 = mulhi(r0, r3); // s119 mulhi
|
|
r4 = r0 * r0 + r4; // s120 mad
|
|
r0 = r0 + r5 + select(0x227a1887u, 0x153e7b81u, ((sel >> 16u) & 1u) != 0u); // s121 add
|
|
r6 = r6 + r3 + select(0xfbb1908bu, 0x537e0843u, ((sel >> 31u) & 1u) != 0u); // s122 add
|
|
r4 = mulhi(r4, r5); // s123 mulhi
|
|
r3 = r3 ^ r1; // s124 xor
|
|
r3 = r3 + r7 + select(0xc3e1337du, 0xc2875857u, ((sel >> 15u) & 1u) != 0u); // s125 add
|
|
r4 = rotr_var(r4, r7); // s126 rotr
|
|
r1 = r1 ^ simd_shuffle_xor(r0, (ushort)2); // s127 shfl
|
|
r3 = rotr_var(r3, r6); // s128 rotr
|
|
r1 = r1 * r0; // s129 mul
|
|
r4 = r4 ^ simd_shuffle_xor(r1, (ushort)16); // s130 shfl
|
|
r4 = r4 + r0 + select(0x87bd1ad9u, 0x39900c5eu, ((sel >> 5u) & 1u) != 0u); // s131 add
|
|
r3 = r0 * r3 + r3; // s132 mad
|
|
r4 = r4 * r2; // s133 mul
|
|
r5 = r6 * r0 + r5; // s134 mad
|
|
r4 = r5 * r4 + r4; // s135 mad
|
|
r6 = r6 + r3 + select(0xc59dd71du, 0xcb7e81cau, ((sel >> 28u) & 1u) != 0u); // s136 add
|
|
r7 = r7 * r5; // s137 mul
|
|
r6 = r6 * r3; // s138 mul
|
|
r0 = rotr_var(r0, r4); // s139 rotr
|
|
r3 = r3 ^ simd_shuffle_xor(r5, (ushort)16); // s140 shfl
|
|
r6 = rotr_var(r6, r7); // s141 rotr
|
|
r3 = r3 * r7; // s142 mul
|
|
r0 = r0 + r7 + select(0x273f8ee2u, 0x602dc90du, ((sel >> 9u) & 1u) != 0u); // s143 add
|
|
r5 = rotl_imm(r5, 26u); // s144 rotl
|
|
r2 = r2 ^ r4; // s145 xor
|
|
r6 = r6 ^ simd_shuffle_xor(r5, (ushort)16); // s146 shfl
|
|
r1 = r1 * r4; // s147 mul
|
|
r2 = r1 * r7 + r2; // s148 mad
|
|
r7 = rotr_var(r7, r2); // s149 rotr
|
|
r7 = rotr_var(r7, r3); // s150 rotr
|
|
r5 = r5 + r2 + select(0x6f435830u, 0xb3e8ca69u, ((sel >> 17u) & 1u) != 0u); // s151 add
|
|
r6 = r6 ^ r2; // s152 xor
|
|
r1 = r1 ^ simd_shuffle_xor(r2, (ushort)16); // s153 shfl
|
|
r2 = r2 ^ r6; // s154 xor
|
|
r5 = rotr_var(r5, r7); // s155 rotr
|
|
r1 = r1 ^ simd_shuffle_xor(r3, (ushort)4); // s156 shfl
|
|
r6 = r6 ^ r5; // s157 xor
|
|
r0 = r0 ^ r7; // s158 xor
|
|
r0 = r0 ^ r7; // s159 xor
|
|
r0 = mulhi(r0, r3); // s160 mulhi
|
|
r1 = r1 * r5; // s161 mul
|
|
r4 = rotr_var(r4, r0); // s162 rotr
|
|
r4 = r1 * r2 + r4; // s163 mad
|
|
r3 = r3 + r6 + select(0x7b5c68f7u, 0xe88bec07u, ((sel >> 18u) & 1u) != 0u); // s164 add
|
|
r0 = rotl_imm(r0, 13u); // s165 rotl
|
|
r2 = r2 ^ r6; // s166 xor
|
|
r5 = r5 ^ simd_shuffle_xor(r4, (ushort)16); // s167 shfl
|
|
r2 = r2 ^ simd_shuffle_xor(r7, (ushort)2); // s168 shfl
|
|
r7 = r7 ^ r6; // s169 xor
|
|
r0 = r7 * r2 + r0; // s170 mad
|
|
r3 = rotl_imm(r3, 3u); // s171 rotl
|
|
r7 = r7 ^ simd_shuffle_xor(r6, (ushort)2); // s172 shfl
|
|
r0 = r0 + r1 + select(0xc53a1209u, 0xadc930fcu, ((sel >> 28u) & 1u) != 0u); // s173 add
|
|
r0 = r0 * r6; // s174 mul
|
|
r7 = mulhi(r7, r0); // s175 mulhi
|
|
r3 = r3 | r2; // s176 or
|
|
r4 = r4 + r3 + select(0x2def94b8u, 0x36cdb68eu, ((sel >> 16u) & 1u) != 0u); // s177 add
|
|
r6 = r6 ^ r2; // s178 xor
|
|
r0 = rotl_imm(r0, 16u); // s179 rotl
|
|
r4 = r4 + r3 + select(0x774065efu, 0x230f4372u, ((sel >> 5u) & 1u) != 0u); // s180 add
|
|
r6 = r2 * r2 + r6; // s181 mad
|
|
r4 = r4 + r5 + select(0x8c37e75bu, 0xbc379c7cu, ((sel >> 18u) & 1u) != 0u); // s182 add
|
|
r0 = rotl_imm(r0, 26u); // s183 rotl
|
|
r4 = r4 | r2; // s184 or
|
|
r0 = r0 * r2; // s185 mul
|
|
r3 = r3 | r5; // s186 or
|
|
r1 = mulhi(r1, r0); // s187 mulhi
|
|
r4 = r4 ^ simd_shuffle_xor(r2, (ushort)16); // s188 shfl
|
|
r5 = rotr_var(r5, r4); // s189 rotr
|
|
r3 = r0 * r3 + r3; // s190 mad
|
|
r1 = r1 | r7; // s191 or
|
|
r7 = r7 | r1; // s192 or
|
|
r1 = r5 * r4 + r1; // s193 mad
|
|
r0 = r0 - r7; // s194 sub
|
|
r6 = r6 + r0 + select(0x2f8a59eeu, 0x8751e547u, ((sel >> 9u) & 1u) != 0u); // s195 add
|
|
r0 = rotl_imm(r0, 8u); // s196 rotl
|
|
r3 = r3 + r4 + select(0x0f369a86u, 0x02b9bb4cu, ((sel >> 2u) & 1u) != 0u); // s197 add
|
|
r4 = r4 + r2 + select(0xe7922061u, 0x74240d4cu, ((sel >> 11u) & 1u) != 0u); // s198 add
|
|
r2 = r2 * r5; // s199 mul
|
|
r6 = r6 + r7 + select(0xee0e3356u, 0x7649c3c3u, ((sel >> 16u) & 1u) != 0u); // s200 add
|
|
r6 = r6 ^ simd_shuffle_xor(r1, (ushort)16); // s201 shfl
|
|
r4 = r4 * r2; // s202 mul
|
|
r3 = r3 ^ simd_shuffle_xor(r2, (ushort)1); // s203 shfl
|
|
r7 = r2 * r1 + r7; // s204 mad
|
|
r2 = rotl_imm(r2, 5u); // s205 rotl
|
|
r7 = r7 ^ simd_shuffle_xor(r1, (ushort)8); // s206 shfl
|
|
r7 = r7 * r2; // s207 mul
|
|
r0 = r0 * r3; // s208 mul
|
|
r1 = rotl_imm(r1, 7u); // s209 rotl
|
|
r5 = r5 + r3 + select(0xc8db10a0u, 0x3d8f8187u, ((sel >> 23u) & 1u) != 0u); // s210 add
|
|
r5 = r5 - r0; // s211 sub
|
|
r0 = rotr_var(r0, r7); // s212 rotr
|
|
r4 = r4 ^ simd_shuffle_xor(r2, (ushort)8); // s213 shfl
|
|
r1 = r1 ^ r3; // s214 xor
|
|
r1 = rotl_imm(r1, 19u); // s215 rotl
|
|
r6 = r6 ^ simd_shuffle_xor(r3, (ushort)2); // s216 shfl
|
|
r2 = mulhi(r2, r5); // s217 mulhi
|
|
r5 = rotl_imm(r5, 14u); // s218 rotl
|
|
r2 = r2 ^ simd_shuffle_xor(r1, (ushort)8); // s219 shfl
|
|
r7 = r7 - r5; // s220 sub
|
|
r3 = mulhi(r3, r6); // s221 mulhi
|
|
r7 = r7 | r1; // s222 or
|
|
r1 = mulhi(r1, r5); // s223 mulhi
|
|
r7 = r7 + r5 + select(0x689cdcf5u, 0xd5a3fb54u, ((sel >> 24u) & 1u) != 0u); // s224 add
|
|
r5 = r5 ^ simd_shuffle_xor(r7, (ushort)16); // s225 shfl
|
|
r3 = mulhi(r3, r2); // s226 mulhi
|
|
r0 = r0 ^ r2; // s227 xor
|
|
r7 = r7 + r4 + select(0x267f928du, 0xba3b9728u, ((sel >> 8u) & 1u) != 0u); // s228 add
|
|
r1 = r1 ^ simd_shuffle_xor(r7, (ushort)2); // s229 shfl
|
|
r4 = r4 - r6; // s230 sub
|
|
r0 = r0 | r1; // s231 or
|
|
r2 = rotl_imm(r2, 10u); // s232 rotl
|
|
r4 = r4 * r7; // s233 mul
|
|
r6 = r0 * r0 + r6; // s234 mad
|
|
r4 = rotl_imm(r4, 29u); // s235 rotl
|
|
r7 = r7 + r2 + select(0xed6dd62au, 0xa437db0eu, ((sel >> 13u) & 1u) != 0u); // s236 add
|
|
r4 = rotr_var(r4, r7); // s237 rotr
|
|
r2 = r2 + r0 + select(0x9f612006u, 0x1c000e82u, ((sel >> 17u) & 1u) != 0u); // s238 add
|
|
r7 = mulhi(r7, r5); // s239 mulhi
|
|
r3 = mulhi(r3, r6); // s240 mulhi
|
|
r0 = r0 ^ r7; // s241 xor
|
|
r4 = rotl_imm(r4, 11u); // s242 rotl
|
|
r3 = rotl_imm(r3, 21u); // s243 rotl
|
|
r4 = r4 + r2 + select(0x83ba196cu, 0x12705678u, ((sel >> 13u) & 1u) != 0u); // s244 add
|
|
r7 = r7 + r5 + select(0xa5d39c13u, 0xea712528u, ((sel >> 2u) & 1u) != 0u); // s245 add
|
|
r0 = r0 * r5; // s246 mul
|
|
r4 = r4 ^ simd_shuffle_xor(r0, (ushort)2); // s247 shfl
|
|
r3 = r3 ^ r2; // s248 xor
|
|
r7 = r7 ^ simd_shuffle_xor(r3, (ushort)4); // s249 shfl
|
|
r5 = r5 ^ simd_shuffle_xor(r3, (ushort)16); // s250 shfl
|
|
r5 = r5 + r3 + select(0x3006c6ebu, 0x26ce965fu, ((sel >> 21u) & 1u) != 0u); // s251 add
|
|
r3 = rotl_imm(r3, 1u); // s252 rotl
|
|
r7 = mulhi(r7, r1); // s253 mulhi
|
|
r1 = r1 + r5 + select(0xc2f46c6du, 0x9e34c13fu, ((sel >> 1u) & 1u) != 0u); // s254 add
|
|
r4 = rotr_var(r4, r7); // s255 rotr
|
|
}
|
|
}
|
|
uint lo = r0 ^ rotl_imm(r1, 7u) ^ rotl_imm(r2, 14u) ^ rotl_imm(r3, 21u);
|
|
uint hi = r4 ^ rotl_imm(r5, 9u) ^ rotl_imm(r6, 18u) ^ rotl_imm(r7, 27u);
|
|
out[gid] = ((ulong)hi << 32) | (ulong)lo;
|
|
}
|