#include using namespace metal; #define MASK 0x0fffffffu constant uint SEEDW[8] = { 0x67a9a7beu, 0x1a155b25u, 0xfddfb732u, 0x4b5af2e8u, 0xc55caf33u, 0xa27c13b7u, 0x06628a48u, 0x03852469u }; 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; r2 = r3 * r4 + r2; // 0 r2 = r1 * r1 + r2; // 1 r2 = r3 * r2 + r2; // 2 r3 = r3 ^ r5; // 3 r7 = r7 ^ dataset[r2 & MASK]; // 4 r5 = r5 ^ dataset[r7 & MASK]; // 5 r1 = r1 ^ simd_shuffle_xor(r4, (ushort)8); // 6 r7 = r7 ^ simd_shuffle_xor(r3, (ushort)8); // 7 r1 = mulhi(r1, r5); // 8 r6 = rotr_var(r6, r3); // 9 r3 = r3 | r4; // 10 r4 = r4 ^ dataset[r3 & MASK]; // 11 r0 = mulhi(r0, r4); // 12 r5 = r5 + r1 + select(0xc7934706u, 0xd3177981u, ((sel >> 30u) & 1u) != 0u); // 13 r0 = r0 ^ dataset[r4 & MASK]; // 14 r2 = r2 - r4; // 15 r2 = r2 ^ dataset[r0 & MASK]; // 16 r7 = r7 ^ dataset[r2 & MASK]; // 17 r7 = r7 ^ simd_shuffle_xor(r3, (ushort)4); // 18 r5 = r5 * r0; // 19 r3 = r3 ^ simd_shuffle_xor(r4, (ushort)2); // 20 r2 = r2 ^ simd_shuffle_xor(r4, (ushort)16); // 21 r6 = mulhi(r6, r2); // 22 r6 = r6 ^ dataset[r1 & MASK]; // 23 r5 = r5 * r0; // 24 r5 = rotl_imm(r5, 19u); // 25 r7 = r7 ^ simd_shuffle_xor(r6, (ushort)2); // 26 r0 = r0 ^ r5; // 27 r0 = r0 ^ r4; // 28 r3 = r3 - r0; // 29 r5 = r5 * r1; // 30 r7 = r7 ^ dataset[r2 & MASK]; // 31 r1 = r1 ^ dataset[r0 & MASK]; // 32 r5 = r5 ^ r6; // 33 r5 = r5 ^ dataset[r1 & MASK]; // 34 r0 = mulhi(r0, r5); // 35 r5 = r5 ^ simd_shuffle_xor(r2, (ushort)4); // 36 r7 = r7 ^ dataset[r0 & MASK]; // 37 r3 = r3 + r1 + select(0x75ba2fadu, 0x230c005cu, ((sel >> 27u) & 1u) != 0u); // 38 r1 = r1 ^ simd_shuffle_xor(r5, (ushort)4); // 39 r2 = r2 ^ r5; // 40 r3 = r6 * r3 + r3; // 41 r6 = r6 - r7; // 42 r7 = r7 ^ r0; // 43 r1 = r1 ^ dataset[r7 & MASK]; // 44 r2 = r2 * r3; // 45 r1 = mulhi(r1, r5); // 46 r4 = r4 - r3; // 47 r2 = rotr_var(r2, r6); // 48 r3 = r3 ^ dataset[r5 & MASK]; // 49 r1 = r1 + r5 + select(0x81b8bc2cu, 0x1907970cu, ((sel >> 7u) & 1u) != 0u); // 50 r0 = r0 * r2; // 51 r0 = r0 + r2 + select(0x4f92b968u, 0x699fd448u, ((sel >> 6u) & 1u) != 0u); // 52 r1 = r1 + r0 + select(0x2bb965afu, 0x77b1520du, ((sel >> 12u) & 1u) != 0u); // 53 r7 = rotl_imm(r7, 14u); // 54 r3 = r3 + r7 + select(0x7b0fe07au, 0xa54c55a0u, ((sel >> 1u) & 1u) != 0u); // 55 r6 = r6 ^ dataset[r7 & MASK]; // 56 r1 = rotr_var(r1, r5); // 57 r5 = r5 ^ dataset[r4 & MASK]; // 58 r6 = r6 ^ dataset[r2 & MASK]; // 59 r3 = r5 * r0 + r3; // 60 r5 = r5 + r7 + select(0xaf9dd72du, 0xad7493e7u, ((sel >> 31u) & 1u) != 0u); // 61 r4 = r4 + r6 + select(0x89841d87u, 0x1e07c3d9u, ((sel >> 27u) & 1u) != 0u); // 62 r5 = rotl_imm(r5, 19u); // 63 // latency-shadow block (Counter ASIC 3.0 item 8): 256 ALU instructions x 13 passes after instruction 63, no load for (uint sh = 0u; sh < 13u; ++sh) { r5 = r5 + r2 + select(0x92199f99u, 0x8bc12da9u, ((sel >> 18u) & 1u) != 0u); // s0 add r0 = r0 + r7 + select(0x8d72d3adu, 0x63079e5au, ((sel >> 26u) & 1u) != 0u); // s1 add r6 = r6 ^ simd_shuffle_xor(r3, (ushort)2); // s2 shfl r4 = r4 - r2; // s3 sub r7 = r7 + r0 + select(0xb21b4babu, 0x5d4c7a60u, ((sel >> 31u) & 1u) != 0u); // s4 add r0 = rotl_imm(r0, 11u); // s5 rotl r0 = r0 + r1 + select(0x2fe0e98bu, 0xc88e2942u, ((sel >> 16u) & 1u) != 0u); // s6 add r7 = r7 ^ r1; // s7 xor r1 = r6 * r5 + r1; // s8 mad r6 = r6 ^ simd_shuffle_xor(r1, (ushort)4); // s9 shfl r1 = r2 * r2 + r1; // s10 mad r5 = r0 * r3 + r5; // s11 mad r2 = r2 ^ simd_shuffle_xor(r6, (ushort)4); // s12 shfl r1 = r1 + r5 + select(0xbdf8f9a5u, 0xbc48c63eu, ((sel >> 25u) & 1u) != 0u); // s13 add r1 = rotl_imm(r1, 29u); // s14 rotl r1 = r1 - r4; // s15 sub r7 = r7 | r1; // s16 or r2 = r2 ^ simd_shuffle_xor(r4, (ushort)8); // s17 shfl r7 = r7 ^ r4; // s18 xor r6 = r6 * r1; // s19 mul r5 = r6 * r0 + r5; // s20 mad r3 = r3 - r1; // s21 sub r6 = r6 * r0; // s22 mul r2 = r2 + r0 + select(0x45c37cecu, 0x96e8f127u, ((sel >> 1u) & 1u) != 0u); // s23 add r6 = r6 - r4; // s24 sub r7 = r3 * r4 + r7; // s25 mad r3 = rotl_imm(r3, 9u); // s26 rotl r2 = r2 - r1; // s27 sub r6 = mulhi(r6, r0); // s28 mulhi r2 = r2 ^ simd_shuffle_xor(r4, (ushort)2); // s29 shfl r1 = r1 ^ simd_shuffle_xor(r6, (ushort)1); // s30 shfl r1 = r1 + r6 + select(0x37985632u, 0xb1cdb2abu, ((sel >> 1u) & 1u) != 0u); // s31 add r0 = rotr_var(r0, r1); // s32 rotr r3 = r3 ^ simd_shuffle_xor(r4, (ushort)2); // s33 shfl r0 = r0 ^ simd_shuffle_xor(r3, (ushort)4); // s34 shfl r7 = r7 * r0; // s35 mul r3 = r3 + r1 + select(0x804e777eu, 0x856e0180u, ((sel >> 0u) & 1u) != 0u); // s36 add r1 = r1 ^ r6; // s37 xor r2 = r2 * r7; // s38 mul r6 = r6 + r5 + select(0x0b06c8a7u, 0xe9bd0cc4u, ((sel >> 2u) & 1u) != 0u); // s39 add r5 = r5 * r7; // s40 mul r2 = mulhi(r2, r3); // s41 mulhi r2 = r2 ^ r0; // s42 xor r0 = rotl_imm(r0, 4u); // s43 rotl r4 = mulhi(r4, r3); // s44 mulhi r6 = r6 + r7 + select(0xee822e17u, 0xcdcb63f6u, ((sel >> 12u) & 1u) != 0u); // s45 add r3 = r2 * r0 + r3; // s46 mad r4 = r4 ^ simd_shuffle_xor(r3, (ushort)8); // s47 shfl r6 = mulhi(r6, r5); // s48 mulhi r0 = r0 - r2; // s49 sub r3 = r3 - r5; // s50 sub r1 = rotr_var(r1, r4); // s51 rotr r6 = r7 * r7 + r6; // s52 mad r5 = r5 ^ r3; // s53 xor r1 = r1 - r0; // s54 sub r5 = r5 - r6; // s55 sub r3 = r3 + r2 + select(0x3dfad1b6u, 0xd4758987u, ((sel >> 10u) & 1u) != 0u); // s56 add r4 = r4 + r1 + select(0xfca75bc2u, 0x0602d6beu, ((sel >> 0u) & 1u) != 0u); // s57 add r5 = mulhi(r5, r6); // s58 mulhi r2 = r2 ^ simd_shuffle_xor(r1, (ushort)2); // s59 shfl r2 = rotl_imm(r2, 9u); // s60 rotl r4 = r4 | r6; // s61 or r6 = rotr_var(r6, r4); // s62 rotr r2 = r2 * r4; // s63 mul r0 = r0 ^ r5; // s64 xor r2 = r2 ^ r7; // s65 xor r2 = r2 + r1 + select(0xd71c02ffu, 0x8596687au, ((sel >> 6u) & 1u) != 0u); // s66 add r1 = rotl_imm(r1, 21u); // s67 rotl r3 = r3 * r2; // s68 mul r7 = r7 ^ simd_shuffle_xor(r5, (ushort)2); // s69 shfl r3 = r3 * r2; // s70 mul r0 = r2 * r5 + r0; // s71 mad r6 = r6 + r7 + select(0x3c6fe15du, 0x08ac5733u, ((sel >> 0u) & 1u) != 0u); // s72 add r3 = r3 ^ simd_shuffle_xor(r2, (ushort)8); // s73 shfl r3 = r3 * r6; // s74 mul r6 = r6 ^ r7; // s75 xor r3 = r3 | r0; // s76 or r2 = r2 + r4 + select(0x295d5faeu, 0xc100b495u, ((sel >> 1u) & 1u) != 0u); // s77 add r3 = mulhi(r3, r7); // s78 mulhi r4 = r4 | r1; // s79 or r4 = rotr_var(r4, r3); // s80 rotr r4 = r4 + r3 + select(0x274a9221u, 0x5cc59530u, ((sel >> 15u) & 1u) != 0u); // s81 add r7 = r7 + r3 + select(0xc8651f8eu, 0x141479ecu, ((sel >> 5u) & 1u) != 0u); // s82 add r3 = rotr_var(r3, r6); // s83 rotr r2 = r4 * r7 + r2; // s84 mad r2 = r2 ^ simd_shuffle_xor(r5, (ushort)16); // s85 shfl r3 = r3 ^ r2; // s86 xor r5 = r5 ^ simd_shuffle_xor(r7, (ushort)2); // s87 shfl r0 = r0 ^ r4; // s88 xor r3 = r3 + r2 + select(0x53f915c2u, 0x883c0c92u, ((sel >> 18u) & 1u) != 0u); // s89 add r7 = rotr_var(r7, r5); // s90 rotr r3 = r3 + r1 + select(0xe2be00a5u, 0x3cc5bd20u, ((sel >> 31u) & 1u) != 0u); // s91 add r7 = r7 ^ simd_shuffle_xor(r2, (ushort)1); // s92 shfl r6 = rotr_var(r6, r2); // s93 rotr r7 = rotl_imm(r7, 14u); // s94 rotl r4 = r5 * r5 + r4; // s95 mad r2 = r4 * r5 + r2; // s96 mad r1 = r1 ^ r0; // s97 xor r5 = r5 * r4; // s98 mul r2 = r2 - r0; // s99 sub r7 = rotl_imm(r7, 30u); // s100 rotl r5 = r5 + r6 + select(0x423fd9c9u, 0xbfd646cbu, ((sel >> 17u) & 1u) != 0u); // s101 add r7 = r7 + r6 + select(0x8d3c011du, 0x19b74a43u, ((sel >> 11u) & 1u) != 0u); // s102 add r5 = rotl_imm(r5, 6u); // s103 rotl r0 = r0 * r4; // s104 mul r0 = r0 | r5; // s105 or r0 = r0 + r1 + select(0x8ce14721u, 0x7dcb7e18u, ((sel >> 15u) & 1u) != 0u); // s106 add r0 = rotl_imm(r0, 15u); // s107 rotl r4 = r4 - r2; // s108 sub r2 = mulhi(r2, r0); // s109 mulhi r1 = mulhi(r1, r0); // s110 mulhi r0 = r0 + r2 + select(0x2d9fc6b9u, 0x3c179ad8u, ((sel >> 28u) & 1u) != 0u); // s111 add r2 = mulhi(r2, r0); // s112 mulhi r6 = r6 - r3; // s113 sub r7 = r6 * r3 + r7; // s114 mad r5 = rotr_var(r5, r1); // s115 rotr r6 = rotr_var(r6, r4); // s116 rotr r2 = r2 + r1 + select(0x502138e2u, 0x47359729u, ((sel >> 22u) & 1u) != 0u); // s117 add r3 = r2 * r0 + r3; // s118 mad r1 = r1 * r3; // s119 mul r2 = r0 * r4 + r2; // s120 mad r0 = r0 * r3; // s121 mul r2 = mulhi(r2, r0); // s122 mulhi r5 = r5 * r6; // s123 mul r4 = r2 * r4 + r4; // s124 mad r4 = r4 ^ simd_shuffle_xor(r2, (ushort)2); // s125 shfl r2 = r2 ^ r0; // s126 xor r1 = rotl_imm(r1, 7u); // s127 rotl r7 = r7 ^ simd_shuffle_xor(r2, (ushort)4); // s128 shfl r6 = rotl_imm(r6, 17u); // s129 rotl r2 = r2 + r5 + select(0x33dff776u, 0x6c57e4e7u, ((sel >> 15u) & 1u) != 0u); // s130 add r0 = r0 | r3; // s131 or r5 = rotr_var(r5, r0); // s132 rotr r2 = r2 + r3 + select(0x5db25b34u, 0xe8212c0cu, ((sel >> 30u) & 1u) != 0u); // s133 add r4 = r4 ^ r3; // s134 xor r6 = r6 ^ r1; // s135 xor r1 = r1 - r7; // s136 sub r2 = r6 * r2 + r2; // s137 mad r0 = mulhi(r0, r5); // s138 mulhi r2 = r2 + r7 + select(0x218d4090u, 0xd44ff710u, ((sel >> 10u) & 1u) != 0u); // s139 add r1 = rotr_var(r1, r4); // s140 rotr r3 = r3 ^ simd_shuffle_xor(r6, (ushort)1); // s141 shfl r7 = r6 * r2 + r7; // s142 mad r2 = r2 * r3; // s143 mul r7 = r7 + r4 + select(0xf4b1a8deu, 0xb98942fau, ((sel >> 29u) & 1u) != 0u); // s144 add r7 = rotl_imm(r7, 15u); // s145 rotl r7 = r7 ^ r5; // s146 xor r4 = r7 * r4 + r4; // s147 mad r6 = rotr_var(r6, r5); // s148 rotr r1 = r2 * r4 + r1; // s149 mad r1 = r1 + r7 + select(0x2bef10f2u, 0x0d48ba42u, ((sel >> 17u) & 1u) != 0u); // s150 add r5 = r5 ^ r4; // s151 xor r7 = r7 + r0 + select(0xdc5cc080u, 0xc98dea9cu, ((sel >> 30u) & 1u) != 0u); // s152 add r4 = r4 * r6; // s153 mul r0 = r0 * r2; // s154 mul r6 = r6 ^ r5; // s155 xor r4 = rotr_var(r4, r2); // s156 rotr r1 = rotl_imm(r1, 11u); // s157 rotl r5 = r5 + r0 + select(0x18197438u, 0x6c752dcbu, ((sel >> 11u) & 1u) != 0u); // s158 add r4 = r1 * r5 + r4; // s159 mad r4 = rotl_imm(r4, 26u); // s160 rotl r3 = r0 * r7 + r3; // s161 mad r3 = rotr_var(r3, r1); // s162 rotr r4 = r4 + r0 + select(0xf1c46574u, 0x8e481727u, ((sel >> 3u) & 1u) != 0u); // s163 add r0 = mulhi(r0, r4); // s164 mulhi r2 = r2 + r6 + select(0xac578137u, 0x550ab406u, ((sel >> 20u) & 1u) != 0u); // s165 add r0 = rotl_imm(r0, 13u); // s166 rotl r3 = r3 + r1 + select(0xa33e6706u, 0xaebb5966u, ((sel >> 14u) & 1u) != 0u); // s167 add r3 = r3 | r5; // s168 or r6 = rotr_var(r6, r2); // s169 rotr r4 = r4 ^ r6; // s170 xor r6 = r6 - r1; // s171 sub r7 = rotl_imm(r7, 22u); // s172 rotl r5 = rotl_imm(r5, 15u); // s173 rotl r7 = r7 ^ simd_shuffle_xor(r0, (ushort)8); // s174 shfl r0 = r0 ^ r5; // s175 xor r7 = rotl_imm(r7, 6u); // s176 rotl r7 = r7 - r0; // s177 sub r3 = rotl_imm(r3, 30u); // s178 rotl r7 = r6 * r1 + r7; // s179 mad r6 = rotl_imm(r6, 9u); // s180 rotl r2 = r2 ^ r4; // s181 xor r2 = r2 ^ r7; // s182 xor r7 = r7 ^ r2; // s183 xor r1 = r1 + r2 + select(0xd94d55acu, 0x5bb7550fu, ((sel >> 21u) & 1u) != 0u); // s184 add r3 = r3 | r5; // s185 or r6 = mulhi(r6, r3); // s186 mulhi r4 = r4 | r0; // s187 or r7 = r7 ^ simd_shuffle_xor(r1, (ushort)2); // s188 shfl r6 = r6 + r5 + select(0x89e747feu, 0x2a354e2du, ((sel >> 6u) & 1u) != 0u); // s189 add r1 = r1 ^ r4; // s190 xor r7 = mulhi(r7, r4); // s191 mulhi r2 = rotl_imm(r2, 26u); // s192 rotl r5 = rotl_imm(r5, 8u); // s193 rotl r4 = r4 ^ simd_shuffle_xor(r5, (ushort)16); // s194 shfl r4 = r4 ^ r5; // s195 xor r1 = r1 * r3; // s196 mul r5 = r5 + r2 + select(0xea03e8e7u, 0x10cfdc71u, ((sel >> 7u) & 1u) != 0u); // s197 add r7 = r7 + r5 + select(0xa7ee0102u, 0x66e148d3u, ((sel >> 15u) & 1u) != 0u); // s198 add r5 = r5 - r2; // s199 sub r5 = r5 ^ simd_shuffle_xor(r1, (ushort)2); // s200 shfl r7 = r7 ^ simd_shuffle_xor(r1, (ushort)8); // s201 shfl r4 = rotr_var(r4, r5); // s202 rotr r7 = r7 ^ r5; // s203 xor r7 = r7 ^ r0; // s204 xor r6 = r6 + r2 + select(0x8379a4deu, 0x8558b619u, ((sel >> 10u) & 1u) != 0u); // s205 add r4 = rotl_imm(r4, 13u); // s206 rotl r1 = mulhi(r1, r3); // s207 mulhi r1 = r4 * r4 + r1; // s208 mad r2 = r2 ^ simd_shuffle_xor(r0, (ushort)4); // s209 shfl r7 = r7 + r0 + select(0xaa8cb14eu, 0xf4049c4cu, ((sel >> 11u) & 1u) != 0u); // s210 add r7 = r7 ^ simd_shuffle_xor(r1, (ushort)16); // s211 shfl r1 = r1 ^ r0; // s212 xor r7 = rotl_imm(r7, 3u); // s213 rotl r4 = rotr_var(r4, r7); // s214 rotr r3 = r3 ^ simd_shuffle_xor(r2, (ushort)16); // s215 shfl r5 = r5 | r1; // s216 or r1 = r1 - r2; // s217 sub r6 = r6 - r5; // s218 sub r6 = rotl_imm(r6, 4u); // s219 rotl r2 = mulhi(r2, r0); // s220 mulhi r2 = r2 | r0; // s221 or r5 = r5 ^ simd_shuffle_xor(r2, (ushort)8); // s222 shfl r5 = mulhi(r5, r6); // s223 mulhi r0 = r0 - r6; // s224 sub r7 = rotl_imm(r7, 23u); // s225 rotl r4 = r4 | r2; // s226 or r2 = r2 * r4; // s227 mul r3 = rotl_imm(r3, 12u); // s228 rotl r0 = rotr_var(r0, r4); // s229 rotr r0 = r0 + r6 + select(0x1d176220u, 0x2a7fecb2u, ((sel >> 16u) & 1u) != 0u); // s230 add r1 = r1 ^ simd_shuffle_xor(r2, (ushort)4); // s231 shfl r2 = r2 * r1; // s232 mul r7 = r0 * r1 + r7; // s233 mad r5 = rotl_imm(r5, 22u); // s234 rotl r4 = rotr_var(r4, r6); // s235 rotr r0 = r5 * r1 + r0; // s236 mad r6 = r6 ^ r4; // s237 xor r4 = r4 ^ r6; // s238 xor r6 = rotl_imm(r6, 18u); // s239 rotl r4 = r4 + r7 + select(0x17dafb4du, 0xadce39f3u, ((sel >> 25u) & 1u) != 0u); // s240 add r0 = r0 - r7; // s241 sub r1 = rotr_var(r1, r6); // s242 rotr r3 = r3 + r0 + select(0xf2f77d26u, 0x0e7033b6u, ((sel >> 29u) & 1u) != 0u); // s243 add r2 = r7 * r4 + r2; // s244 mad r4 = r0 * r6 + r4; // s245 mad r5 = r5 * r7; // s246 mul r3 = r3 + r5 + select(0xfed2da4eu, 0x7b2ff6b7u, ((sel >> 31u) & 1u) != 0u); // s247 add r0 = r0 + r7 + select(0x03b2891cu, 0xb5fad7b1u, ((sel >> 0u) & 1u) != 0u); // s248 add r5 = mulhi(r5, r4); // s249 mulhi r5 = r5 + r2 + select(0x042cd6e3u, 0xa7e71c2fu, ((sel >> 11u) & 1u) != 0u); // s250 add r6 = r6 ^ simd_shuffle_xor(r1, (ushort)1); // s251 shfl r6 = r6 ^ r1; // s252 xor r2 = r2 * r5; // s253 mul r0 = r0 + r6 + select(0x784a302bu, 0xb83d78deu, ((sel >> 16u) & 1u) != 0u); // s254 add r2 = r2 - r4; // s255 sub } } 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; }