igneum/proto-cuda/packs-ca3-shadow/sh1024x3/kernel.cu
igneum-labs 51dba1ce76 Counter ASIC 3.0 item 8: the latency-shadow knob (LoadClass +sh<S>x<R>), its packs and the PC 2 playbook
A shadow block of S ALU instructions run R times at the end of every iteration, drawn from the program stream after
the 64 base instructions, behind LoadClass::shadow: v2 and v3 draw nothing and emit nothing (the pinned packs are
byte-identical, cargo test 54 + 4 + 19 + 7 green). The interpreter, the three kernel dialects (both kernels each),
program.h and program.json carry it; the acceptance rule interprets the base program only. Packs for seed
igneum-genesis over class mx8 at 4,096 to 180,224 shadow instructions per hash (proto-cuda/packs-ca3-shadow), and
the PC 2 bench playbook tools/ca3-shadow/pc2-shadow-bench.ps1 (passes the publisher's three checks).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-06 07:58:35 +00:00

1191 lines
64 KiB
Text

// Generated by igneum-pow export (generator v2) for seed "igneum-genesis". Do not edit by hand.
// Bit-exact twin of the Metal kernel for the same seed (see proto-cuda/CHECKLIST.md and program.metal).
// Compiled ahead of time by nvcc together with proto-cuda/host.cu. No NVRTC.
#include <cuda_runtime.h>
#include <cstdint>
#include "program.h"
#include "memhard.h"
__device__ __forceinline__ uint32_t splitmix32(uint32_t x) {
x ^= x >> 16; x *= 0x7feb352du;
x ^= x >> 15; x *= 0x846ca68bu;
x ^= x >> 16;
return x;
}
// n is a literal in 1..31 at every call site, so both shift amounts are in 1..31.
__device__ __forceinline__ uint32_t rotl_imm(uint32_t x, uint32_t n) { return (x << n) | (x >> (32u - n)); }
// n is masked to 0..31; the second shift amount is masked too, so n == 0 gives x.
__device__ __forceinline__ uint32_t rotr_var(uint32_t x, uint32_t n) { n &= 31u; return (x >> n) | (x << ((32u - n) & 31u)); }
__device__ __forceinline__ uint32_t ds_elem(uint32_t i, uint32_t d0, uint32_t d1) {
uint32_t x = i ^ d0;
x *= 0x9E3779B1u; x ^= x >> 15;
x += d1;
x *= 0x85EBCA77u; x ^= x >> 13;
x *= 0xC2B2AE3Du; x ^= x >> 16;
return x;
}
// Memory-hard dataset (MEMHARD.md). One thread per cache segment; one thread per 64-byte dataset item.
// The core functions (mh_cache_segment, mh_item) are in memhard.h and are also compiled for the host.
__global__ void igneum_cache_fill(uint32_t* cache, uint32_t nSegments) {
uint32_t seg = blockIdx.x * blockDim.x + threadIdx.x;
if (seg < nSegments) mh_cache_segment(cache, seg);
}
__global__ void igneum_build(uint32_t* ds, const uint32_t* cache, uint32_t nItems) {
uint32_t t = blockIdx.x * blockDim.x + threadIdx.x;
if (t < nItems) {
uint32_t s[16];
mh_item(cache, t, s);
uint32_t* d = ds + (size_t)t * 16u;
for (uint32_t i = 0u; i < 16u; ++i) d[i] = s[i];
}
}
// One hash per thread. blockDim.x is a multiple of 32; lane = threadIdx.x & 31 and every
// __shfl_xor_sync stays inside the lane's own warp, exactly like simd_shuffle_xor inside a
// 32-wide Metal SIMD group. Control flow is uniform, so the full 0xffffffff member mask is valid.
__global__ void igneum_hash(const uint32_t* ds, uint64_t* out, uint32_t baseNonce, uint32_t mask) {
uint32_t gid = blockIdx.x * blockDim.x + threadIdx.x;
uint32_t nonce = baseNonce + gid;
uint32_t r0, r1, r2, r3, r4, r5, r6, r7;
{ uint32_t x = nonce ^ 0x67a9a7beu; x += 0x9e3779b9u; x = splitmix32(x); r0 = x ^ 0x1a155b25u; } // SEEDW[0], 0x9e3779b9u * 1u, SEEDW[1]
{ uint32_t x = nonce ^ 0x1a155b25u; x += 0x3c6ef372u; x = splitmix32(x); r1 = x ^ 0xfddfb732u; } // SEEDW[1], 0x9e3779b9u * 2u, SEEDW[2]
{ uint32_t x = nonce ^ 0xfddfb732u; x += 0xdaa66d2bu; x = splitmix32(x); r2 = x ^ 0x4b5af2e8u; } // SEEDW[2], 0x9e3779b9u * 3u, SEEDW[3]
{ uint32_t x = nonce ^ 0x4b5af2e8u; x += 0x78dde6e4u; x = splitmix32(x); r3 = x ^ 0xc55caf33u; } // SEEDW[3], 0x9e3779b9u * 4u, SEEDW[4]
{ uint32_t x = nonce ^ 0xc55caf33u; x += 0x1715609du; x = splitmix32(x); r4 = x ^ 0xa27c13b7u; } // SEEDW[4], 0x9e3779b9u * 5u, SEEDW[5]
{ uint32_t x = nonce ^ 0xa27c13b7u; x += 0xb54cda56u; x = splitmix32(x); r5 = x ^ 0x06628a48u; } // SEEDW[5], 0x9e3779b9u * 6u, SEEDW[6]
{ uint32_t x = nonce ^ 0x06628a48u; x += 0x5384540fu; x = splitmix32(x); r6 = x ^ 0x03852469u; } // SEEDW[6], 0x9e3779b9u * 7u, SEEDW[7]
{ uint32_t x = nonce ^ 0x03852469u; x += 0xf1bbcdc8u; x = splitmix32(x); r7 = x ^ 0x67a9a7beu; } // SEEDW[7], 0x9e3779b9u * 8u, SEEDW[0]
for (uint32_t it = 0u; it < 8u; ++it) {
uint32_t sel = r0;
r2 = r3 * r4 + r2; // 0 mad
r2 = r1 * r1 + r2; // 1 mad
r2 = r3 * r2 + r2; // 2 mad
r3 = r3 ^ r5; // 3 xor
r7 = r7 ^ ds[r2 & mask]; // 4 load
r5 = r5 ^ ds[r7 & mask]; // 5 load
r1 = r1 ^ __shfl_xor_sync(0xffffffffu, r4, 8); // 6 shfl
r7 = r7 ^ __shfl_xor_sync(0xffffffffu, r3, 8); // 7 shfl
r1 = __umulhi(r1, r5); // 8 mulhi
r6 = rotr_var(r6, r3); // 9 rotr
r3 = r3 | r4; // 10 or
r4 = r4 ^ ds[r3 & mask]; // 11 load
r0 = __umulhi(r0, r4); // 12 mulhi
r5 = r5 + r1 + ((((sel >> 30u) & 1u) != 0u) ? 0xd3177981u : 0xc7934706u); // 13 add
r0 = r0 ^ ds[r4 & mask]; // 14 load
r2 = r2 - r4; // 15 sub
r2 = r2 ^ ds[r0 & mask]; // 16 load
r7 = r7 ^ ds[r2 & mask]; // 17 load
r7 = r7 ^ __shfl_xor_sync(0xffffffffu, r3, 4); // 18 shfl
r5 = r5 * r0; // 19 mul
r3 = r3 ^ __shfl_xor_sync(0xffffffffu, r4, 2); // 20 shfl
r2 = r2 ^ __shfl_xor_sync(0xffffffffu, r4, 16); // 21 shfl
r6 = __umulhi(r6, r2); // 22 mulhi
r6 = r6 ^ ds[r1 & mask]; // 23 load
r5 = r5 * r0; // 24 mul
r5 = rotl_imm(r5, 19u); // 25 rotl
r7 = r7 ^ __shfl_xor_sync(0xffffffffu, r6, 2); // 26 shfl
r0 = r0 ^ r5; // 27 xor
r0 = r0 ^ r4; // 28 xor
r3 = r3 - r0; // 29 sub
r5 = r5 * r1; // 30 mul
r7 = r7 ^ ds[r2 & mask]; // 31 load
r1 = r1 ^ ds[r0 & mask]; // 32 load
r5 = r5 ^ r6; // 33 xor
r5 = r5 ^ ds[r1 & mask]; // 34 load
r0 = __umulhi(r0, r5); // 35 mulhi
r5 = r5 ^ __shfl_xor_sync(0xffffffffu, r2, 4); // 36 shfl
r7 = r7 ^ ds[r0 & mask]; // 37 load
r3 = r3 + r1 + ((((sel >> 27u) & 1u) != 0u) ? 0x230c005cu : 0x75ba2fadu); // 38 add
r1 = r1 ^ __shfl_xor_sync(0xffffffffu, r5, 4); // 39 shfl
r2 = r2 ^ r5; // 40 xor
r3 = r6 * r3 + r3; // 41 mad
r6 = r6 - r7; // 42 sub
r7 = r7 ^ r0; // 43 xor
r1 = r1 ^ ds[r7 & mask]; // 44 load
r2 = r2 * r3; // 45 mul
r1 = __umulhi(r1, r5); // 46 mulhi
r4 = r4 - r3; // 47 sub
r2 = rotr_var(r2, r6); // 48 rotr
r3 = r3 ^ ds[r5 & mask]; // 49 load
r1 = r1 + r5 + ((((sel >> 7u) & 1u) != 0u) ? 0x1907970cu : 0x81b8bc2cu); // 50 add
r0 = r0 * r2; // 51 mul
r0 = r0 + r2 + ((((sel >> 6u) & 1u) != 0u) ? 0x699fd448u : 0x4f92b968u); // 52 add
r1 = r1 + r0 + ((((sel >> 12u) & 1u) != 0u) ? 0x77b1520du : 0x2bb965afu); // 53 add
r7 = rotl_imm(r7, 14u); // 54 rotl
r3 = r3 + r7 + ((((sel >> 1u) & 1u) != 0u) ? 0xa54c55a0u : 0x7b0fe07au); // 55 add
r6 = r6 ^ ds[r7 & mask]; // 56 load
r1 = rotr_var(r1, r5); // 57 rotr
r5 = r5 ^ ds[r4 & mask]; // 58 load
r6 = r6 ^ ds[r2 & mask]; // 59 load
r3 = r5 * r0 + r3; // 60 mad
r5 = r5 + r7 + ((((sel >> 31u) & 1u) != 0u) ? 0xad7493e7u : 0xaf9dd72du); // 61 add
r4 = r4 + r6 + ((((sel >> 27u) & 1u) != 0u) ? 0x1e07c3d9u : 0x89841d87u); // 62 add
r5 = rotl_imm(r5, 19u); // 63 rotl
// latency-shadow block (Counter ASIC 3.0 item 8): 1024 ALU instructions x 3 passes after instruction 63, no load
for (uint32_t sh = 0u; sh < 3u; ++sh) {
r5 = r5 + r2 + ((((sel >> 18u) & 1u) != 0u) ? 0x8bc12da9u : 0x92199f99u); // s0 add
r0 = r0 + r7 + ((((sel >> 26u) & 1u) != 0u) ? 0x63079e5au : 0x8d72d3adu); // s1 add
r6 = r6 ^ __shfl_xor_sync(0xffffffffu, r3, 2); // s2 shfl
r4 = r4 - r2; // s3 sub
r7 = r7 + r0 + ((((sel >> 31u) & 1u) != 0u) ? 0x5d4c7a60u : 0xb21b4babu); // s4 add
r0 = rotl_imm(r0, 11u); // s5 rotl
r0 = r0 + r1 + ((((sel >> 16u) & 1u) != 0u) ? 0xc88e2942u : 0x2fe0e98bu); // s6 add
r7 = r7 ^ r1; // s7 xor
r1 = r6 * r5 + r1; // s8 mad
r6 = r6 ^ __shfl_xor_sync(0xffffffffu, r1, 4); // s9 shfl
r1 = r2 * r2 + r1; // s10 mad
r5 = r0 * r3 + r5; // s11 mad
r2 = r2 ^ __shfl_xor_sync(0xffffffffu, r6, 4); // s12 shfl
r1 = r1 + r5 + ((((sel >> 25u) & 1u) != 0u) ? 0xbc48c63eu : 0xbdf8f9a5u); // s13 add
r1 = rotl_imm(r1, 29u); // s14 rotl
r1 = r1 - r4; // s15 sub
r7 = r7 | r1; // s16 or
r2 = r2 ^ __shfl_xor_sync(0xffffffffu, r4, 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 + ((((sel >> 1u) & 1u) != 0u) ? 0x96e8f127u : 0x45c37cecu); // 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 = __umulhi(r6, r0); // s28 mulhi
r2 = r2 ^ __shfl_xor_sync(0xffffffffu, r4, 2); // s29 shfl
r1 = r1 ^ __shfl_xor_sync(0xffffffffu, r6, 1); // s30 shfl
r1 = r1 + r6 + ((((sel >> 1u) & 1u) != 0u) ? 0xb1cdb2abu : 0x37985632u); // s31 add
r0 = rotr_var(r0, r1); // s32 rotr
r3 = r3 ^ __shfl_xor_sync(0xffffffffu, r4, 2); // s33 shfl
r0 = r0 ^ __shfl_xor_sync(0xffffffffu, r3, 4); // s34 shfl
r7 = r7 * r0; // s35 mul
r3 = r3 + r1 + ((((sel >> 0u) & 1u) != 0u) ? 0x856e0180u : 0x804e777eu); // s36 add
r1 = r1 ^ r6; // s37 xor
r2 = r2 * r7; // s38 mul
r6 = r6 + r5 + ((((sel >> 2u) & 1u) != 0u) ? 0xe9bd0cc4u : 0x0b06c8a7u); // s39 add
r5 = r5 * r7; // s40 mul
r2 = __umulhi(r2, r3); // s41 mulhi
r2 = r2 ^ r0; // s42 xor
r0 = rotl_imm(r0, 4u); // s43 rotl
r4 = __umulhi(r4, r3); // s44 mulhi
r6 = r6 + r7 + ((((sel >> 12u) & 1u) != 0u) ? 0xcdcb63f6u : 0xee822e17u); // s45 add
r3 = r2 * r0 + r3; // s46 mad
r4 = r4 ^ __shfl_xor_sync(0xffffffffu, r3, 8); // s47 shfl
r6 = __umulhi(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 + ((((sel >> 10u) & 1u) != 0u) ? 0xd4758987u : 0x3dfad1b6u); // s56 add
r4 = r4 + r1 + ((((sel >> 0u) & 1u) != 0u) ? 0x0602d6beu : 0xfca75bc2u); // s57 add
r5 = __umulhi(r5, r6); // s58 mulhi
r2 = r2 ^ __shfl_xor_sync(0xffffffffu, r1, 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 + ((((sel >> 6u) & 1u) != 0u) ? 0x8596687au : 0xd71c02ffu); // s66 add
r1 = rotl_imm(r1, 21u); // s67 rotl
r3 = r3 * r2; // s68 mul
r7 = r7 ^ __shfl_xor_sync(0xffffffffu, r5, 2); // s69 shfl
r3 = r3 * r2; // s70 mul
r0 = r2 * r5 + r0; // s71 mad
r6 = r6 + r7 + ((((sel >> 0u) & 1u) != 0u) ? 0x08ac5733u : 0x3c6fe15du); // s72 add
r3 = r3 ^ __shfl_xor_sync(0xffffffffu, r2, 8); // s73 shfl
r3 = r3 * r6; // s74 mul
r6 = r6 ^ r7; // s75 xor
r3 = r3 | r0; // s76 or
r2 = r2 + r4 + ((((sel >> 1u) & 1u) != 0u) ? 0xc100b495u : 0x295d5faeu); // s77 add
r3 = __umulhi(r3, r7); // s78 mulhi
r4 = r4 | r1; // s79 or
r4 = rotr_var(r4, r3); // s80 rotr
r4 = r4 + r3 + ((((sel >> 15u) & 1u) != 0u) ? 0x5cc59530u : 0x274a9221u); // s81 add
r7 = r7 + r3 + ((((sel >> 5u) & 1u) != 0u) ? 0x141479ecu : 0xc8651f8eu); // s82 add
r3 = rotr_var(r3, r6); // s83 rotr
r2 = r4 * r7 + r2; // s84 mad
r2 = r2 ^ __shfl_xor_sync(0xffffffffu, r5, 16); // s85 shfl
r3 = r3 ^ r2; // s86 xor
r5 = r5 ^ __shfl_xor_sync(0xffffffffu, r7, 2); // s87 shfl
r0 = r0 ^ r4; // s88 xor
r3 = r3 + r2 + ((((sel >> 18u) & 1u) != 0u) ? 0x883c0c92u : 0x53f915c2u); // s89 add
r7 = rotr_var(r7, r5); // s90 rotr
r3 = r3 + r1 + ((((sel >> 31u) & 1u) != 0u) ? 0x3cc5bd20u : 0xe2be00a5u); // s91 add
r7 = r7 ^ __shfl_xor_sync(0xffffffffu, r2, 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 + ((((sel >> 17u) & 1u) != 0u) ? 0xbfd646cbu : 0x423fd9c9u); // s101 add
r7 = r7 + r6 + ((((sel >> 11u) & 1u) != 0u) ? 0x19b74a43u : 0x8d3c011du); // s102 add
r5 = rotl_imm(r5, 6u); // s103 rotl
r0 = r0 * r4; // s104 mul
r0 = r0 | r5; // s105 or
r0 = r0 + r1 + ((((sel >> 15u) & 1u) != 0u) ? 0x7dcb7e18u : 0x8ce14721u); // s106 add
r0 = rotl_imm(r0, 15u); // s107 rotl
r4 = r4 - r2; // s108 sub
r2 = __umulhi(r2, r0); // s109 mulhi
r1 = __umulhi(r1, r0); // s110 mulhi
r0 = r0 + r2 + ((((sel >> 28u) & 1u) != 0u) ? 0x3c179ad8u : 0x2d9fc6b9u); // s111 add
r2 = __umulhi(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 + ((((sel >> 22u) & 1u) != 0u) ? 0x47359729u : 0x502138e2u); // 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 = __umulhi(r2, r0); // s122 mulhi
r5 = r5 * r6; // s123 mul
r4 = r2 * r4 + r4; // s124 mad
r4 = r4 ^ __shfl_xor_sync(0xffffffffu, r2, 2); // s125 shfl
r2 = r2 ^ r0; // s126 xor
r1 = rotl_imm(r1, 7u); // s127 rotl
r7 = r7 ^ __shfl_xor_sync(0xffffffffu, r2, 4); // s128 shfl
r6 = rotl_imm(r6, 17u); // s129 rotl
r2 = r2 + r5 + ((((sel >> 15u) & 1u) != 0u) ? 0x6c57e4e7u : 0x33dff776u); // s130 add
r0 = r0 | r3; // s131 or
r5 = rotr_var(r5, r0); // s132 rotr
r2 = r2 + r3 + ((((sel >> 30u) & 1u) != 0u) ? 0xe8212c0cu : 0x5db25b34u); // s133 add
r4 = r4 ^ r3; // s134 xor
r6 = r6 ^ r1; // s135 xor
r1 = r1 - r7; // s136 sub
r2 = r6 * r2 + r2; // s137 mad
r0 = __umulhi(r0, r5); // s138 mulhi
r2 = r2 + r7 + ((((sel >> 10u) & 1u) != 0u) ? 0xd44ff710u : 0x218d4090u); // s139 add
r1 = rotr_var(r1, r4); // s140 rotr
r3 = r3 ^ __shfl_xor_sync(0xffffffffu, r6, 1); // s141 shfl
r7 = r6 * r2 + r7; // s142 mad
r2 = r2 * r3; // s143 mul
r7 = r7 + r4 + ((((sel >> 29u) & 1u) != 0u) ? 0xb98942fau : 0xf4b1a8deu); // 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 + ((((sel >> 17u) & 1u) != 0u) ? 0x0d48ba42u : 0x2bef10f2u); // s150 add
r5 = r5 ^ r4; // s151 xor
r7 = r7 + r0 + ((((sel >> 30u) & 1u) != 0u) ? 0xc98dea9cu : 0xdc5cc080u); // 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 + ((((sel >> 11u) & 1u) != 0u) ? 0x6c752dcbu : 0x18197438u); // 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 + ((((sel >> 3u) & 1u) != 0u) ? 0x8e481727u : 0xf1c46574u); // s163 add
r0 = __umulhi(r0, r4); // s164 mulhi
r2 = r2 + r6 + ((((sel >> 20u) & 1u) != 0u) ? 0x550ab406u : 0xac578137u); // s165 add
r0 = rotl_imm(r0, 13u); // s166 rotl
r3 = r3 + r1 + ((((sel >> 14u) & 1u) != 0u) ? 0xaebb5966u : 0xa33e6706u); // 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 ^ __shfl_xor_sync(0xffffffffu, r0, 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 + ((((sel >> 21u) & 1u) != 0u) ? 0x5bb7550fu : 0xd94d55acu); // s184 add
r3 = r3 | r5; // s185 or
r6 = __umulhi(r6, r3); // s186 mulhi
r4 = r4 | r0; // s187 or
r7 = r7 ^ __shfl_xor_sync(0xffffffffu, r1, 2); // s188 shfl
r6 = r6 + r5 + ((((sel >> 6u) & 1u) != 0u) ? 0x2a354e2du : 0x89e747feu); // s189 add
r1 = r1 ^ r4; // s190 xor
r7 = __umulhi(r7, r4); // s191 mulhi
r2 = rotl_imm(r2, 26u); // s192 rotl
r5 = rotl_imm(r5, 8u); // s193 rotl
r4 = r4 ^ __shfl_xor_sync(0xffffffffu, r5, 16); // s194 shfl
r4 = r4 ^ r5; // s195 xor
r1 = r1 * r3; // s196 mul
r5 = r5 + r2 + ((((sel >> 7u) & 1u) != 0u) ? 0x10cfdc71u : 0xea03e8e7u); // s197 add
r7 = r7 + r5 + ((((sel >> 15u) & 1u) != 0u) ? 0x66e148d3u : 0xa7ee0102u); // s198 add
r5 = r5 - r2; // s199 sub
r5 = r5 ^ __shfl_xor_sync(0xffffffffu, r1, 2); // s200 shfl
r7 = r7 ^ __shfl_xor_sync(0xffffffffu, r1, 8); // s201 shfl
r4 = rotr_var(r4, r5); // s202 rotr
r7 = r7 ^ r5; // s203 xor
r7 = r7 ^ r0; // s204 xor
r6 = r6 + r2 + ((((sel >> 10u) & 1u) != 0u) ? 0x8558b619u : 0x8379a4deu); // s205 add
r4 = rotl_imm(r4, 13u); // s206 rotl
r1 = __umulhi(r1, r3); // s207 mulhi
r1 = r4 * r4 + r1; // s208 mad
r2 = r2 ^ __shfl_xor_sync(0xffffffffu, r0, 4); // s209 shfl
r7 = r7 + r0 + ((((sel >> 11u) & 1u) != 0u) ? 0xf4049c4cu : 0xaa8cb14eu); // s210 add
r7 = r7 ^ __shfl_xor_sync(0xffffffffu, r1, 16); // s211 shfl
r1 = r1 ^ r0; // s212 xor
r7 = rotl_imm(r7, 3u); // s213 rotl
r4 = rotr_var(r4, r7); // s214 rotr
r3 = r3 ^ __shfl_xor_sync(0xffffffffu, r2, 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 = __umulhi(r2, r0); // s220 mulhi
r2 = r2 | r0; // s221 or
r5 = r5 ^ __shfl_xor_sync(0xffffffffu, r2, 8); // s222 shfl
r5 = __umulhi(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 + ((((sel >> 16u) & 1u) != 0u) ? 0x2a7fecb2u : 0x1d176220u); // s230 add
r1 = r1 ^ __shfl_xor_sync(0xffffffffu, r2, 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 + ((((sel >> 25u) & 1u) != 0u) ? 0xadce39f3u : 0x17dafb4du); // s240 add
r0 = r0 - r7; // s241 sub
r1 = rotr_var(r1, r6); // s242 rotr
r3 = r3 + r0 + ((((sel >> 29u) & 1u) != 0u) ? 0x0e7033b6u : 0xf2f77d26u); // s243 add
r2 = r7 * r4 + r2; // s244 mad
r4 = r0 * r6 + r4; // s245 mad
r5 = r5 * r7; // s246 mul
r3 = r3 + r5 + ((((sel >> 31u) & 1u) != 0u) ? 0x7b2ff6b7u : 0xfed2da4eu); // s247 add
r0 = r0 + r7 + ((((sel >> 0u) & 1u) != 0u) ? 0xb5fad7b1u : 0x03b2891cu); // s248 add
r5 = __umulhi(r5, r4); // s249 mulhi
r5 = r5 + r2 + ((((sel >> 11u) & 1u) != 0u) ? 0xa7e71c2fu : 0x042cd6e3u); // s250 add
r6 = r6 ^ __shfl_xor_sync(0xffffffffu, r1, 1); // s251 shfl
r6 = r6 ^ r1; // s252 xor
r2 = r2 * r5; // s253 mul
r0 = r0 + r6 + ((((sel >> 16u) & 1u) != 0u) ? 0xb83d78deu : 0x784a302bu); // s254 add
r2 = r2 - r4; // s255 sub
r3 = r3 - r4; // s256 sub
r2 = r2 * r4; // s257 mul
r4 = r0 * r6 + r4; // s258 mad
r5 = r5 | r0; // s259 or
r4 = r4 ^ r6; // s260 xor
r6 = __umulhi(r6, r3); // s261 mulhi
r2 = r2 * r6; // s262 mul
r5 = rotl_imm(r5, 1u); // s263 rotl
r7 = r7 ^ __shfl_xor_sync(0xffffffffu, r1, 8); // s264 shfl
r3 = r3 * r2; // s265 mul
r2 = r2 + r5 + ((((sel >> 15u) & 1u) != 0u) ? 0x99a1d1b6u : 0x3dddf1b2u); // s266 add
r2 = r2 ^ __shfl_xor_sync(0xffffffffu, r0, 8); // s267 shfl
r0 = r0 ^ __shfl_xor_sync(0xffffffffu, r1, 2); // s268 shfl
r4 = r4 - r2; // s269 sub
r0 = r0 ^ __shfl_xor_sync(0xffffffffu, r5, 1); // s270 shfl
r3 = r3 + r2 + ((((sel >> 21u) & 1u) != 0u) ? 0x40ca287au : 0xcfc62661u); // s271 add
r1 = r1 ^ __shfl_xor_sync(0xffffffffu, r7, 16); // s272 shfl
r1 = r3 * r6 + r1; // s273 mad
r7 = r7 + r6 + ((((sel >> 30u) & 1u) != 0u) ? 0xed4b65adu : 0x44caede3u); // s274 add
r5 = r5 ^ r7; // s275 xor
r2 = r2 * r6; // s276 mul
r2 = r2 + r1 + ((((sel >> 6u) & 1u) != 0u) ? 0x0f45ae89u : 0x9aae6c12u); // s277 add
r2 = r2 ^ r6; // s278 xor
r1 = r1 - r2; // s279 sub
r5 = r5 ^ r1; // s280 xor
r7 = r7 ^ r1; // s281 xor
r7 = r7 - r1; // s282 sub
r5 = r5 - r7; // s283 sub
r7 = r0 * r6 + r7; // s284 mad
r5 = __umulhi(r5, r4); // s285 mulhi
r3 = r3 - r5; // s286 sub
r5 = r5 - r1; // s287 sub
r1 = r3 * r7 + r1; // s288 mad
r3 = rotl_imm(r3, 9u); // s289 rotl
r5 = r5 ^ __shfl_xor_sync(0xffffffffu, r6, 8); // s290 shfl
r7 = r7 + r2 + ((((sel >> 1u) & 1u) != 0u) ? 0xe086d3b6u : 0x2307120bu); // s291 add
r4 = r4 ^ r3; // s292 xor
r3 = rotl_imm(r3, 14u); // s293 rotl
r5 = r5 - r4; // s294 sub
r2 = __umulhi(r2, r3); // s295 mulhi
r1 = r1 ^ __shfl_xor_sync(0xffffffffu, r3, 4); // s296 shfl
r3 = r6 * r1 + r3; // s297 mad
r4 = r4 ^ r1; // s298 xor
r6 = r6 + r3 + ((((sel >> 24u) & 1u) != 0u) ? 0xadbeb223u : 0x4e3a12e5u); // s299 add
r6 = __umulhi(r6, r5); // s300 mulhi
r7 = rotr_var(r7, r5); // s301 rotr
r5 = r5 ^ __shfl_xor_sync(0xffffffffu, r4, 16); // s302 shfl
r3 = r3 ^ r4; // s303 xor
r2 = r3 * r1 + r2; // s304 mad
r1 = r1 ^ r7; // s305 xor
r1 = r1 + r0 + ((((sel >> 22u) & 1u) != 0u) ? 0x0d8f1149u : 0x51ab0157u); // s306 add
r2 = r2 + r1 + ((((sel >> 24u) & 1u) != 0u) ? 0x99a96de9u : 0x3b5e8835u); // s307 add
r1 = r5 * r5 + r1; // s308 mad
r2 = r2 * r4; // s309 mul
r3 = r3 ^ __shfl_xor_sync(0xffffffffu, r7, 8); // s310 shfl
r0 = r0 ^ r4; // s311 xor
r5 = __umulhi(r5, r2); // s312 mulhi
r7 = r7 + r2 + ((((sel >> 30u) & 1u) != 0u) ? 0x86ddfba7u : 0x81f3297cu); // s313 add
r3 = r3 + r1 + ((((sel >> 0u) & 1u) != 0u) ? 0x38aa230au : 0x838e4a2fu); // s314 add
r7 = r7 ^ __shfl_xor_sync(0xffffffffu, r0, 16); // s315 shfl
r7 = r7 - r5; // s316 sub
r5 = r5 ^ __shfl_xor_sync(0xffffffffu, r1, 4); // s317 shfl
r1 = r1 + r3 + ((((sel >> 11u) & 1u) != 0u) ? 0xa6399179u : 0xebcad805u); // s318 add
r7 = rotl_imm(r7, 21u); // s319 rotl
r7 = r7 ^ r6; // s320 xor
r7 = r7 | r6; // s321 or
r5 = r5 + r3 + ((((sel >> 25u) & 1u) != 0u) ? 0x4de83051u : 0x4c906f73u); // s322 add
r0 = r0 + r4 + ((((sel >> 14u) & 1u) != 0u) ? 0xd3d821c5u : 0x742ec195u); // s323 add
r6 = r6 ^ r2; // s324 xor
r6 = rotl_imm(r6, 1u); // s325 rotl
r4 = rotl_imm(r4, 24u); // s326 rotl
r4 = r4 | r3; // s327 or
r2 = r1 * r3 + r2; // s328 mad
r2 = r2 ^ r7; // s329 xor
r2 = r2 | r3; // s330 or
r7 = r7 - r1; // s331 sub
r3 = r3 + r6 + ((((sel >> 0u) & 1u) != 0u) ? 0xc06f831eu : 0xb86750e9u); // s332 add
r7 = rotl_imm(r7, 25u); // s333 rotl
r3 = r0 * r0 + r3; // s334 mad
r2 = r2 + r5 + ((((sel >> 28u) & 1u) != 0u) ? 0x5225df1du : 0xb57956eeu); // s335 add
r3 = r1 * r6 + r3; // s336 mad
r4 = r2 * r2 + r4; // s337 mad
r7 = r7 * r2; // s338 mul
r1 = r1 * r6; // s339 mul
r4 = r4 + r5 + ((((sel >> 5u) & 1u) != 0u) ? 0xb73822ceu : 0x23f6425fu); // s340 add
r5 = r5 ^ __shfl_xor_sync(0xffffffffu, r7, 2); // s341 shfl
r6 = r6 ^ r5; // s342 xor
r0 = rotl_imm(r0, 13u); // s343 rotl
r0 = rotr_var(r0, r3); // s344 rotr
r1 = r1 - r0; // s345 sub
r6 = rotr_var(r6, r1); // s346 rotr
r6 = r6 ^ __shfl_xor_sync(0xffffffffu, r5, 4); // s347 shfl
r5 = r5 ^ __shfl_xor_sync(0xffffffffu, r1, 8); // s348 shfl
r5 = r5 ^ r3; // s349 xor
r1 = r4 * r0 + r1; // s350 mad
r3 = rotr_var(r3, r1); // s351 rotr
r1 = rotl_imm(r1, 13u); // s352 rotl
r3 = r3 + r0 + ((((sel >> 26u) & 1u) != 0u) ? 0xfa0c560eu : 0x0dce5917u); // s353 add
r3 = __umulhi(r3, r2); // s354 mulhi
r1 = r2 * r4 + r1; // s355 mad
r0 = r0 ^ r1; // s356 xor
r7 = r7 * r5; // s357 mul
r0 = rotl_imm(r0, 5u); // s358 rotl
r2 = r7 * r7 + r2; // s359 mad
r2 = r2 | r6; // s360 or
r6 = r6 + r1 + ((((sel >> 19u) & 1u) != 0u) ? 0x277e027au : 0x7c83b79au); // s361 add
r0 = r0 * r2; // s362 mul
r3 = r3 * r6; // s363 mul
r2 = rotr_var(r2, r4); // s364 rotr
r5 = r5 + r1 + ((((sel >> 1u) & 1u) != 0u) ? 0x52275ea4u : 0x271f2385u); // s365 add
r1 = r1 * r6; // s366 mul
r0 = r0 + r7 + ((((sel >> 30u) & 1u) != 0u) ? 0x8f8b4093u : 0x4c66800fu); // s367 add
r4 = rotr_var(r4, r0); // s368 rotr
r4 = rotr_var(r4, r0); // s369 rotr
r1 = r0 * r6 + r1; // s370 mad
r0 = r0 - r5; // s371 sub
r7 = r7 + r2 + ((((sel >> 11u) & 1u) != 0u) ? 0x9a7dcadcu : 0x7dad1ed5u); // s372 add
r7 = r7 + r3 + ((((sel >> 20u) & 1u) != 0u) ? 0xf808c195u : 0x1ea3d58eu); // s373 add
r1 = r1 * r2; // s374 mul
r3 = r7 * r2 + r3; // s375 mad
r4 = r4 ^ r1; // s376 xor
r1 = r1 | r0; // s377 or
r5 = r5 + r0 + ((((sel >> 26u) & 1u) != 0u) ? 0x427ed5ceu : 0x98b36d10u); // s378 add
r6 = r6 * r0; // s379 mul
r7 = r7 ^ __shfl_xor_sync(0xffffffffu, r3, 1); // s380 shfl
r4 = r4 + r0 + ((((sel >> 18u) & 1u) != 0u) ? 0x38f848b9u : 0xb19cab2du); // s381 add
r3 = r5 * r2 + r3; // s382 mad
r0 = r0 | r7; // s383 or
r5 = r5 - r4; // s384 sub
r1 = r1 - r5; // s385 sub
r2 = r2 - r0; // s386 sub
r5 = r5 + r2 + ((((sel >> 17u) & 1u) != 0u) ? 0xffc20cf8u : 0x341056b0u); // s387 add
r1 = rotl_imm(r1, 26u); // s388 rotl
r2 = r2 ^ r5; // s389 xor
r5 = r7 * r0 + r5; // s390 mad
r3 = __umulhi(r3, r2); // s391 mulhi
r5 = r5 + r4 + ((((sel >> 0u) & 1u) != 0u) ? 0xfb939f2bu : 0x78aa571au); // s392 add
r5 = r5 | r2; // s393 or
r1 = __umulhi(r1, r7); // s394 mulhi
r4 = r4 - r2; // s395 sub
r7 = r7 - r1; // s396 sub
r0 = r0 + r1 + ((((sel >> 2u) & 1u) != 0u) ? 0xa9c6c9fbu : 0x31af4767u); // s397 add
r3 = r3 * r1; // s398 mul
r1 = r1 - r7; // s399 sub
r7 = r7 + r6 + ((((sel >> 8u) & 1u) != 0u) ? 0x34f9b056u : 0x266d4c34u); // s400 add
r5 = rotl_imm(r5, 5u); // s401 rotl
r0 = r0 + r4 + ((((sel >> 23u) & 1u) != 0u) ? 0x79822c64u : 0x7241955eu); // s402 add
r2 = r4 * r0 + r2; // s403 mad
r5 = rotl_imm(r5, 29u); // s404 rotl
r3 = r3 - r5; // s405 sub
r2 = r2 + r3 + ((((sel >> 27u) & 1u) != 0u) ? 0xda046091u : 0xf65aca5du); // s406 add
r4 = __umulhi(r4, r7); // s407 mulhi
r2 = r2 + r1 + ((((sel >> 14u) & 1u) != 0u) ? 0x167aba1cu : 0x6a00cefbu); // s408 add
r2 = r6 * r6 + r2; // s409 mad
r6 = rotl_imm(r6, 26u); // s410 rotl
r6 = r6 | r7; // s411 or
r1 = rotl_imm(r1, 20u); // s412 rotl
r7 = r7 * r5; // s413 mul
r6 = r6 - r0; // s414 sub
r6 = __umulhi(r6, r0); // s415 mulhi
r3 = rotl_imm(r3, 5u); // s416 rotl
r1 = r1 ^ __shfl_xor_sync(0xffffffffu, r3, 4); // s417 shfl
r0 = r0 * r4; // s418 mul
r4 = rotr_var(r4, r7); // s419 rotr
r7 = r7 ^ __shfl_xor_sync(0xffffffffu, r1, 2); // s420 shfl
r5 = r3 * r6 + r5; // s421 mad
r3 = r3 ^ r4; // s422 xor
r3 = rotr_var(r3, r7); // s423 rotr
r4 = r4 + r1 + ((((sel >> 26u) & 1u) != 0u) ? 0xbb669c17u : 0xba29da18u); // s424 add
r7 = rotr_var(r7, r5); // s425 rotr
r2 = r2 * r6; // s426 mul
r1 = r1 + r4 + ((((sel >> 16u) & 1u) != 0u) ? 0xc6b45a76u : 0x4f70e34fu); // s427 add
r1 = rotl_imm(r1, 1u); // s428 rotl
r6 = __umulhi(r6, r5); // s429 mulhi
r6 = r6 + r7 + ((((sel >> 12u) & 1u) != 0u) ? 0xff610984u : 0x3883e0f5u); // s430 add
r4 = r4 | r3; // s431 or
r7 = r7 ^ r5; // s432 xor
r3 = __umulhi(r3, r2); // s433 mulhi
r2 = r2 ^ r6; // s434 xor
r4 = r4 | r3; // s435 or
r0 = r0 + r1 + ((((sel >> 9u) & 1u) != 0u) ? 0xf37057feu : 0xb1b15861u); // s436 add
r7 = r7 + r4 + ((((sel >> 4u) & 1u) != 0u) ? 0x61793eafu : 0x2e9e173fu); // s437 add
r5 = r5 ^ __shfl_xor_sync(0xffffffffu, r1, 1); // s438 shfl
r6 = r0 * r3 + r6; // s439 mad
r5 = r5 ^ r2; // s440 xor
r0 = r0 ^ __shfl_xor_sync(0xffffffffu, r4, 16); // s441 shfl
r6 = r6 * r3; // s442 mul
r5 = r5 - r4; // s443 sub
r2 = r2 ^ __shfl_xor_sync(0xffffffffu, r1, 4); // s444 shfl
r0 = r0 + r5 + ((((sel >> 12u) & 1u) != 0u) ? 0x69def831u : 0x646856aau); // s445 add
r4 = r4 + r6 + ((((sel >> 23u) & 1u) != 0u) ? 0x1f8ecb8bu : 0x58a3f8fcu); // s446 add
r4 = r0 * r2 + r4; // s447 mad
r5 = r5 * r0; // s448 mul
r2 = r2 + r5 + ((((sel >> 11u) & 1u) != 0u) ? 0x7ecb876du : 0x48d3062du); // s449 add
r2 = r5 * r6 + r2; // s450 mad
r7 = r7 ^ __shfl_xor_sync(0xffffffffu, r3, 4); // s451 shfl
r2 = r2 * r5; // s452 mul
r5 = __umulhi(r5, r4); // s453 mulhi
r1 = r1 ^ r7; // s454 xor
r2 = r2 * r7; // s455 mul
r1 = r1 * r3; // s456 mul
r3 = r6 * r2 + r3; // s457 mad
r7 = r7 - r0; // s458 sub
r2 = r4 * r5 + r2; // s459 mad
r0 = rotl_imm(r0, 2u); // s460 rotl
r4 = r4 ^ r2; // s461 xor
r4 = r4 + r0 + ((((sel >> 18u) & 1u) != 0u) ? 0x7b093757u : 0xb41dd69bu); // s462 add
r6 = r6 + r1 + ((((sel >> 3u) & 1u) != 0u) ? 0x916e1b7eu : 0xb042032eu); // s463 add
r2 = r2 + r6 + ((((sel >> 8u) & 1u) != 0u) ? 0x6d42b978u : 0x4e68a2a0u); // s464 add
r3 = r3 - r2; // s465 sub
r2 = r2 * r5; // s466 mul
r7 = rotl_imm(r7, 28u); // s467 rotl
r0 = r0 - r3; // s468 sub
r7 = __umulhi(r7, r2); // s469 mulhi
r7 = r7 | r6; // s470 or
r7 = rotl_imm(r7, 28u); // s471 rotl
r0 = r0 * r6; // s472 mul
r2 = r2 | r1; // s473 or
r2 = r2 + r4 + ((((sel >> 14u) & 1u) != 0u) ? 0x20c5276bu : 0x13ec3b3eu); // s474 add
r2 = rotr_var(r2, r6); // s475 rotr
r6 = r6 ^ __shfl_xor_sync(0xffffffffu, r0, 16); // s476 shfl
r2 = rotl_imm(r2, 15u); // s477 rotl
r5 = rotr_var(r5, r4); // s478 rotr
r3 = rotl_imm(r3, 26u); // s479 rotl
r5 = r5 | r6; // s480 or
r3 = rotl_imm(r3, 29u); // s481 rotl
r0 = rotr_var(r0, r7); // s482 rotr
r1 = r1 - r0; // s483 sub
r0 = r2 * r5 + r0; // s484 mad
r6 = r6 ^ r4; // s485 xor
r6 = r6 ^ r0; // s486 xor
r3 = r3 ^ __shfl_xor_sync(0xffffffffu, r7, 4); // s487 shfl
r6 = __umulhi(r6, r0); // s488 mulhi
r1 = r1 * r0; // s489 mul
r3 = r3 ^ r6; // s490 xor
r3 = r3 * r6; // s491 mul
r0 = r0 * r3; // s492 mul
r4 = r4 | r3; // s493 or
r0 = r0 ^ __shfl_xor_sync(0xffffffffu, r5, 8); // s494 shfl
r0 = r0 ^ __shfl_xor_sync(0xffffffffu, r7, 16); // s495 shfl
r6 = r5 * r2 + r6; // s496 mad
r5 = r5 * r6; // s497 mul
r3 = r3 ^ r1; // s498 xor
r0 = r0 + r1 + ((((sel >> 20u) & 1u) != 0u) ? 0x19f4c710u : 0x53e99acau); // s499 add
r6 = r5 * r2 + r6; // s500 mad
r7 = r7 ^ __shfl_xor_sync(0xffffffffu, r1, 4); // s501 shfl
r3 = r3 - r5; // s502 sub
r0 = rotl_imm(r0, 8u); // s503 rotl
r3 = r3 ^ r1; // s504 xor
r7 = r7 + r2 + ((((sel >> 6u) & 1u) != 0u) ? 0x7a6ac7b5u : 0x0867fe20u); // s505 add
r0 = r0 ^ __shfl_xor_sync(0xffffffffu, r7, 2); // s506 shfl
r0 = r0 * r1; // s507 mul
r6 = r6 | r5; // s508 or
r2 = r2 * r7; // s509 mul
r1 = r1 + r5 + ((((sel >> 21u) & 1u) != 0u) ? 0xd77f6a03u : 0xd7fdc3ecu); // s510 add
r3 = r3 ^ __shfl_xor_sync(0xffffffffu, r7, 8); // s511 shfl
r6 = r6 + r3 + ((((sel >> 9u) & 1u) != 0u) ? 0x5c22b0b5u : 0x297a096au); // s512 add
r7 = r7 | r0; // s513 or
r7 = r7 + r3 + ((((sel >> 27u) & 1u) != 0u) ? 0x4caafacdu : 0x5de1d1d1u); // s514 add
r1 = __umulhi(r1, r0); // s515 mulhi
r0 = r0 - r6; // s516 sub
r2 = r2 - r1; // s517 sub
r6 = r5 * r7 + r6; // s518 mad
r2 = r2 ^ r7; // s519 xor
r1 = r1 | r5; // s520 or
r0 = r4 * r6 + r0; // s521 mad
r4 = r4 + r6 + ((((sel >> 29u) & 1u) != 0u) ? 0xb1091e80u : 0x2caeeca3u); // s522 add
r7 = r6 * r5 + r7; // s523 mad
r7 = r7 - r2; // s524 sub
r0 = r0 * r7; // s525 mul
r0 = r0 ^ r7; // s526 xor
r1 = __umulhi(r1, r4); // s527 mulhi
r0 = rotr_var(r0, r5); // s528 rotr
r2 = r2 ^ __shfl_xor_sync(0xffffffffu, r7, 16); // s529 shfl
r2 = __umulhi(r2, r3); // s530 mulhi
r1 = r1 | r4; // s531 or
r6 = r6 + r4 + ((((sel >> 13u) & 1u) != 0u) ? 0xbda312aeu : 0xbe9e1eb0u); // s532 add
r7 = r7 + r2 + ((((sel >> 6u) & 1u) != 0u) ? 0x1ec16229u : 0xbe5d93a3u); // s533 add
r0 = r6 * r4 + r0; // s534 mad
r0 = r0 + r5 + ((((sel >> 23u) & 1u) != 0u) ? 0x500828bcu : 0x5e23583bu); // s535 add
r6 = r5 * r0 + r6; // s536 mad
r2 = r2 ^ r4; // s537 xor
r6 = r3 * r5 + r6; // s538 mad
r6 = r6 + r4 + ((((sel >> 3u) & 1u) != 0u) ? 0x852321dcu : 0x43c32138u); // s539 add
r2 = r2 + r5 + ((((sel >> 7u) & 1u) != 0u) ? 0x44e6ae63u : 0xaff69493u); // s540 add
r3 = __umulhi(r3, r5); // s541 mulhi
r1 = r1 + r7 + ((((sel >> 5u) & 1u) != 0u) ? 0x909712feu : 0xc5de29efu); // s542 add
r1 = r3 * r2 + r1; // s543 mad
r1 = r1 + r3 + ((((sel >> 11u) & 1u) != 0u) ? 0xfb7b42b9u : 0x1e20e084u); // s544 add
r4 = r4 ^ __shfl_xor_sync(0xffffffffu, r5, 4); // s545 shfl
r6 = r6 + r1 + ((((sel >> 10u) & 1u) != 0u) ? 0x6e036dd4u : 0x9370db38u); // s546 add
r4 = r4 ^ r6; // s547 xor
r5 = r5 ^ __shfl_xor_sync(0xffffffffu, r3, 8); // s548 shfl
r3 = r3 ^ __shfl_xor_sync(0xffffffffu, r5, 16); // s549 shfl
r1 = rotr_var(r1, r7); // s550 rotr
r0 = r3 * r2 + r0; // s551 mad
r7 = __umulhi(r7, r4); // s552 mulhi
r0 = r0 + r4 + ((((sel >> 13u) & 1u) != 0u) ? 0xd3c9174du : 0xbf2488f6u); // s553 add
r1 = rotl_imm(r1, 1u); // s554 rotl
r7 = rotr_var(r7, r3); // s555 rotr
r7 = rotr_var(r7, r3); // s556 rotr
r6 = r2 * r0 + r6; // s557 mad
r6 = r6 ^ r1; // s558 xor
r5 = r5 ^ __shfl_xor_sync(0xffffffffu, r1, 2); // s559 shfl
r5 = r5 ^ r3; // s560 xor
r5 = r5 * r1; // s561 mul
r3 = rotl_imm(r3, 31u); // s562 rotl
r6 = rotr_var(r6, r2); // s563 rotr
r7 = r7 | r2; // s564 or
r6 = rotr_var(r6, r0); // s565 rotr
r2 = r2 * r0; // s566 mul
r4 = r4 ^ __shfl_xor_sync(0xffffffffu, r5, 2); // s567 shfl
r3 = r3 * r0; // s568 mul
r4 = r4 + r2 + ((((sel >> 9u) & 1u) != 0u) ? 0xa3149efau : 0xd9160c83u); // s569 add
r4 = __umulhi(r4, r2); // s570 mulhi
r3 = r3 + r0 + ((((sel >> 10u) & 1u) != 0u) ? 0x9cab407bu : 0x3bdc971cu); // s571 add
r1 = r1 ^ __shfl_xor_sync(0xffffffffu, r2, 16); // s572 shfl
r2 = r2 ^ __shfl_xor_sync(0xffffffffu, r5, 4); // s573 shfl
r2 = r2 ^ __shfl_xor_sync(0xffffffffu, r3, 8); // s574 shfl
r0 = r0 ^ r7; // s575 xor
r0 = r0 + r5 + ((((sel >> 27u) & 1u) != 0u) ? 0x747b0838u : 0x17979608u); // s576 add
r0 = r0 ^ r4; // s577 xor
r6 = r6 - r1; // s578 sub
r4 = rotr_var(r4, r2); // s579 rotr
r2 = r2 ^ r3; // s580 xor
r6 = r7 * r2 + r6; // s581 mad
r5 = r5 + r2 + ((((sel >> 7u) & 1u) != 0u) ? 0x02246c0cu : 0x1c10ec5cu); // s582 add
r3 = __umulhi(r3, r6); // s583 mulhi
r2 = r2 ^ r5; // s584 xor
r6 = rotl_imm(r6, 24u); // s585 rotl
r3 = r3 ^ __shfl_xor_sync(0xffffffffu, r5, 8); // s586 shfl
r1 = r2 * r6 + r1; // s587 mad
r3 = r3 + r7 + ((((sel >> 21u) & 1u) != 0u) ? 0xbea44bd0u : 0x88758873u); // s588 add
r1 = rotl_imm(r1, 30u); // s589 rotl
r7 = r7 * r1; // s590 mul
r3 = r3 + r6 + ((((sel >> 10u) & 1u) != 0u) ? 0x8e0eb890u : 0xf436bb64u); // s591 add
r7 = r6 * r1 + r7; // s592 mad
r0 = r3 * r5 + r0; // s593 mad
r5 = rotr_var(r5, r4); // s594 rotr
r4 = r4 | r0; // s595 or
r6 = r3 * r0 + r6; // s596 mad
r2 = r2 + r1 + ((((sel >> 31u) & 1u) != 0u) ? 0x29b853b3u : 0xb465e47eu); // s597 add
r1 = r1 ^ __shfl_xor_sync(0xffffffffu, r7, 16); // s598 shfl
r4 = r4 ^ __shfl_xor_sync(0xffffffffu, r0, 4); // s599 shfl
r6 = r2 * r0 + r6; // s600 mad
r5 = __umulhi(r5, r0); // s601 mulhi
r6 = r6 * r7; // s602 mul
r4 = r4 | r7; // s603 or
r7 = r7 - r0; // s604 sub
r7 = rotr_var(r7, r4); // s605 rotr
r4 = r0 * r3 + r4; // s606 mad
r4 = __umulhi(r4, r3); // s607 mulhi
r0 = r0 + r1 + ((((sel >> 28u) & 1u) != 0u) ? 0xb7536963u : 0x22ce199du); // s608 add
r2 = r2 - r5; // s609 sub
r2 = r2 ^ r0; // s610 xor
r5 = r5 * r4; // s611 mul
r3 = rotl_imm(r3, 25u); // s612 rotl
r7 = rotl_imm(r7, 13u); // s613 rotl
r4 = r4 * r7; // s614 mul
r5 = r4 * r2 + r5; // s615 mad
r0 = r0 ^ r5; // s616 xor
r7 = r5 * r4 + r7; // s617 mad
r6 = r6 - r4; // s618 sub
r3 = r3 * r4; // s619 mul
r1 = rotl_imm(r1, 24u); // s620 rotl
r1 = r1 ^ r2; // s621 xor
r4 = r4 | r3; // s622 or
r7 = r7 * r2; // s623 mul
r6 = r6 + r1 + ((((sel >> 20u) & 1u) != 0u) ? 0xe37b1e20u : 0x2dbf6ed0u); // s624 add
r4 = r4 ^ r5; // s625 xor
r4 = r6 * r2 + r4; // s626 mad
r1 = r1 ^ r6; // s627 xor
r6 = r6 + r3 + ((((sel >> 12u) & 1u) != 0u) ? 0xf5a2a9f7u : 0x9dc2b9d0u); // s628 add
r7 = r7 - r5; // s629 sub
r1 = __umulhi(r1, r7); // s630 mulhi
r1 = rotr_var(r1, r3); // s631 rotr
r4 = r4 | r6; // s632 or
r2 = r2 + r5 + ((((sel >> 24u) & 1u) != 0u) ? 0x982bfc08u : 0x9c1fba1bu); // s633 add
r6 = r6 * r5; // s634 mul
r7 = r2 * r3 + r7; // s635 mad
r7 = __umulhi(r7, r4); // s636 mulhi
r5 = r5 ^ r0; // s637 xor
r0 = r0 * r1; // s638 mul
r4 = r4 ^ r6; // s639 xor
r6 = r6 - r4; // s640 sub
r6 = __umulhi(r6, r4); // s641 mulhi
r4 = r4 - r0; // s642 sub
r7 = r7 - r5; // s643 sub
r3 = r0 * r7 + r3; // s644 mad
r3 = r3 | r5; // s645 or
r0 = r0 - r4; // s646 sub
r7 = r7 | r5; // s647 or
r7 = rotl_imm(r7, 1u); // s648 rotl
r5 = r5 + r6 + ((((sel >> 31u) & 1u) != 0u) ? 0x6e5d517fu : 0x9f5e0d19u); // s649 add
r1 = r1 | r2; // s650 or
r3 = rotl_imm(r3, 29u); // s651 rotl
r2 = r2 + r4 + ((((sel >> 2u) & 1u) != 0u) ? 0x30faf9c6u : 0xb53f6e74u); // s652 add
r0 = rotl_imm(r0, 21u); // s653 rotl
r1 = r1 ^ r3; // s654 xor
r4 = r7 * r2 + r4; // s655 mad
r4 = r4 - r6; // s656 sub
r4 = r4 * r6; // s657 mul
r2 = r2 ^ __shfl_xor_sync(0xffffffffu, r1, 4); // s658 shfl
r7 = rotl_imm(r7, 31u); // s659 rotl
r4 = r4 ^ r6; // s660 xor
r1 = r1 - r3; // s661 sub
r3 = r3 * r6; // s662 mul
r5 = r5 * r3; // s663 mul
r7 = r7 + r2 + ((((sel >> 21u) & 1u) != 0u) ? 0x8941d2e7u : 0x016e0094u); // s664 add
r1 = r1 ^ r2; // s665 xor
r1 = r1 - r0; // s666 sub
r4 = r4 ^ r7; // s667 xor
r7 = r7 ^ __shfl_xor_sync(0xffffffffu, r3, 1); // s668 shfl
r1 = rotr_var(r1, r4); // s669 rotr
r2 = r2 + r3 + ((((sel >> 14u) & 1u) != 0u) ? 0x15289435u : 0x9af12ca6u); // s670 add
r2 = rotr_var(r2, r4); // s671 rotr
r4 = r6 * r7 + r4; // s672 mad
r2 = r2 ^ __shfl_xor_sync(0xffffffffu, r1, 4); // s673 shfl
r6 = r4 * r2 + r6; // s674 mad
r2 = r4 * r6 + r2; // s675 mad
r3 = r3 ^ __shfl_xor_sync(0xffffffffu, r1, 16); // s676 shfl
r1 = rotr_var(r1, r0); // s677 rotr
r0 = r0 - r2; // s678 sub
r5 = r5 ^ __shfl_xor_sync(0xffffffffu, r1, 16); // s679 shfl
r1 = r1 ^ r0; // s680 xor
r1 = r1 ^ __shfl_xor_sync(0xffffffffu, r2, 4); // s681 shfl
r0 = r0 ^ __shfl_xor_sync(0xffffffffu, r3, 8); // s682 shfl
r2 = r3 * r3 + r2; // s683 mad
r4 = r4 - r6; // s684 sub
r5 = r5 ^ r3; // s685 xor
r2 = r2 - r5; // s686 sub
r4 = r4 - r5; // s687 sub
r5 = r4 * r7 + r5; // s688 mad
r6 = r6 * r7; // s689 mul
r1 = r1 * r5; // s690 mul
r4 = rotr_var(r4, r3); // s691 rotr
r2 = r2 ^ r4; // s692 xor
r0 = rotl_imm(r0, 2u); // s693 rotl
r5 = r5 + r2 + ((((sel >> 23u) & 1u) != 0u) ? 0x49801084u : 0x4fc762c9u); // s694 add
r0 = r0 + r4 + ((((sel >> 14u) & 1u) != 0u) ? 0x5f403cd5u : 0x626c00f5u); // s695 add
r6 = rotl_imm(r6, 25u); // s696 rotl
r3 = r3 ^ r7; // s697 xor
r0 = r0 * r2; // s698 mul
r5 = rotr_var(r5, r1); // s699 rotr
r3 = r3 ^ r7; // s700 xor
r4 = r4 | r3; // s701 or
r7 = r7 * r3; // s702 mul
r4 = rotl_imm(r4, 24u); // s703 rotl
r5 = r5 + r4 + ((((sel >> 17u) & 1u) != 0u) ? 0xad5e1851u : 0xc08bb414u); // s704 add
r0 = r6 * r5 + r0; // s705 mad
r4 = __umulhi(r4, r1); // s706 mulhi
r4 = rotr_var(r4, r3); // s707 rotr
r3 = rotr_var(r3, r6); // s708 rotr
r6 = r6 ^ __shfl_xor_sync(0xffffffffu, r7, 16); // s709 shfl
r3 = r2 * r6 + r3; // s710 mad
r1 = r1 * r4; // s711 mul
r3 = r3 + r5 + ((((sel >> 13u) & 1u) != 0u) ? 0x407f7c4du : 0xdc55338fu); // s712 add
r6 = r6 ^ __shfl_xor_sync(0xffffffffu, r7, 2); // s713 shfl
r1 = r1 ^ r0; // s714 xor
r7 = r1 * r1 + r7; // s715 mad
r4 = r4 | r0; // s716 or
r6 = r6 * r4; // s717 mul
r0 = r0 - r5; // s718 sub
r1 = r1 ^ r4; // s719 xor
r4 = __umulhi(r4, r6); // s720 mulhi
r1 = r1 + r0 + ((((sel >> 13u) & 1u) != 0u) ? 0xc2093fcau : 0xb2ce569eu); // s721 add
r4 = __umulhi(r4, r2); // s722 mulhi
r6 = r6 ^ __shfl_xor_sync(0xffffffffu, r1, 16); // s723 shfl
r5 = r3 * r0 + r5; // s724 mad
r5 = __umulhi(r5, r0); // s725 mulhi
r2 = rotr_var(r2, r5); // s726 rotr
r5 = r5 + r0 + ((((sel >> 20u) & 1u) != 0u) ? 0x48cdf1c1u : 0x4e8aaad5u); // s727 add
r1 = r1 * r0; // s728 mul
r3 = r3 ^ __shfl_xor_sync(0xffffffffu, r0, 1); // s729 shfl
r4 = r4 * r6; // s730 mul
r4 = r4 - r6; // s731 sub
r4 = r4 ^ r2; // s732 xor
r5 = r5 * r6; // s733 mul
r7 = rotr_var(r7, r3); // s734 rotr
r1 = r1 ^ __shfl_xor_sync(0xffffffffu, r5, 1); // s735 shfl
r1 = __umulhi(r1, r0); // s736 mulhi
r2 = r2 * r6; // s737 mul
r5 = rotl_imm(r5, 27u); // s738 rotl
r2 = __umulhi(r2, r3); // s739 mulhi
r5 = r3 * r5 + r5; // s740 mad
r2 = rotl_imm(r2, 11u); // s741 rotl
r6 = r6 | r2; // s742 or
r2 = r2 ^ r3; // s743 xor
r3 = r3 * r1; // s744 mul
r4 = __umulhi(r4, r2); // s745 mulhi
r5 = r5 ^ r6; // s746 xor
r6 = r6 + r7 + ((((sel >> 11u) & 1u) != 0u) ? 0x0d6b844eu : 0x78fc162du); // s747 add
r1 = rotl_imm(r1, 27u); // s748 rotl
r4 = rotr_var(r4, r1); // s749 rotr
r5 = r5 ^ r7; // s750 xor
r4 = rotr_var(r4, r3); // s751 rotr
r5 = r5 * r2; // s752 mul
r1 = r6 * r7 + r1; // s753 mad
r0 = r0 ^ r1; // s754 xor
r7 = r7 - r1; // s755 sub
r0 = r0 + r4 + ((((sel >> 5u) & 1u) != 0u) ? 0xb74ac71eu : 0x68aab88bu); // s756 add
r7 = r7 + r5 + ((((sel >> 0u) & 1u) != 0u) ? 0xf81f5b66u : 0xba5c123au); // s757 add
r0 = r7 * r2 + r0; // s758 mad
r1 = r1 | r0; // s759 or
r4 = __umulhi(r4, r6); // s760 mulhi
r0 = __umulhi(r0, r7); // s761 mulhi
r3 = rotr_var(r3, r4); // s762 rotr
r3 = rotl_imm(r3, 30u); // s763 rotl
r6 = r6 * r2; // s764 mul
r6 = r6 ^ r4; // s765 xor
r3 = r3 + r4 + ((((sel >> 0u) & 1u) != 0u) ? 0x96dabea6u : 0x6eb1d82au); // s766 add
r0 = r0 ^ __shfl_xor_sync(0xffffffffu, r2, 1); // s767 shfl
r3 = rotl_imm(r3, 8u); // s768 rotl
r7 = r7 * r4; // s769 mul
r6 = r1 * r2 + r6; // s770 mad
r2 = r2 ^ r7; // s771 xor
r6 = r6 * r0; // s772 mul
r2 = r2 - r1; // s773 sub
r1 = r0 * r1 + r1; // s774 mad
r5 = __umulhi(r5, r7); // s775 mulhi
r0 = rotr_var(r0, r4); // s776 rotr
r6 = r6 ^ r0; // s777 xor
r4 = __umulhi(r4, r7); // s778 mulhi
r1 = r3 * r0 + r1; // s779 mad
r6 = r6 + r4 + ((((sel >> 2u) & 1u) != 0u) ? 0x903f3f77u : 0x11d7b79au); // s780 add
r4 = r4 ^ r7; // s781 xor
r1 = r1 + r2 + ((((sel >> 14u) & 1u) != 0u) ? 0x2ca81d8du : 0x1791eaddu); // s782 add
r2 = rotr_var(r2, r1); // s783 rotr
r4 = r4 * r6; // s784 mul
r1 = r1 ^ r6; // s785 xor
r4 = r4 - r0; // s786 sub
r3 = r3 ^ r4; // s787 xor
r4 = r4 * r1; // s788 mul
r4 = r6 * r7 + r4; // s789 mad
r5 = r5 - r0; // s790 sub
r2 = r2 * r0; // s791 mul
r7 = rotl_imm(r7, 12u); // s792 rotl
r2 = r7 * r3 + r2; // s793 mad
r1 = r4 * r4 + r1; // s794 mad
r6 = r6 + r4 + ((((sel >> 15u) & 1u) != 0u) ? 0xf66fad29u : 0xc08797bbu); // s795 add
r1 = r1 - r4; // s796 sub
r5 = r5 * r2; // s797 mul
r5 = r5 ^ r2; // s798 xor
r0 = r0 * r1; // s799 mul
r6 = r6 + r4 + ((((sel >> 13u) & 1u) != 0u) ? 0x2d82a681u : 0x6d4a6371u); // s800 add
r1 = r6 * r1 + r1; // s801 mad
r0 = r0 - r2; // s802 sub
r6 = r6 ^ r2; // s803 xor
r7 = rotl_imm(r7, 24u); // s804 rotl
r6 = r6 ^ r7; // s805 xor
r7 = r7 | r0; // s806 or
r0 = rotl_imm(r0, 5u); // s807 rotl
r1 = r1 ^ __shfl_xor_sync(0xffffffffu, r2, 2); // s808 shfl
r4 = r1 * r5 + r4; // s809 mad
r0 = r0 + r2 + ((((sel >> 14u) & 1u) != 0u) ? 0x63e62197u : 0x0092eb62u); // s810 add
r5 = r5 - r3; // s811 sub
r2 = r1 * r5 + r2; // s812 mad
r6 = r6 ^ __shfl_xor_sync(0xffffffffu, r0, 16); // s813 shfl
r7 = r5 * r1 + r7; // s814 mad
r0 = __umulhi(r0, r7); // s815 mulhi
r2 = r2 | r1; // s816 or
r7 = __umulhi(r7, r3); // s817 mulhi
r2 = r2 ^ r4; // s818 xor
r4 = r4 + r3 + ((((sel >> 0u) & 1u) != 0u) ? 0x27d94f57u : 0xbb69174fu); // s819 add
r5 = r5 + r3 + ((((sel >> 1u) & 1u) != 0u) ? 0x82285691u : 0xda6759f2u); // s820 add
r1 = r1 + r3 + ((((sel >> 31u) & 1u) != 0u) ? 0xe50565d8u : 0x9ad4b47fu); // s821 add
r5 = rotl_imm(r5, 6u); // s822 rotl
r3 = r3 - r0; // s823 sub
r6 = rotl_imm(r6, 12u); // s824 rotl
r4 = r4 | r5; // s825 or
r3 = r3 ^ r2; // s826 xor
r4 = r4 + r0 + ((((sel >> 26u) & 1u) != 0u) ? 0xffcab83au : 0xca1e80fbu); // s827 add
r3 = r3 | r7; // s828 or
r1 = r5 * r7 + r1; // s829 mad
r6 = r6 ^ __shfl_xor_sync(0xffffffffu, r0, 16); // s830 shfl
r1 = r1 - r0; // s831 sub
r0 = rotr_var(r0, r2); // s832 rotr
r1 = __umulhi(r1, r0); // s833 mulhi
r6 = __umulhi(r6, r4); // s834 mulhi
r6 = rotl_imm(r6, 2u); // s835 rotl
r4 = r4 | r6; // s836 or
r6 = rotl_imm(r6, 23u); // s837 rotl
r4 = r7 * r4 + r4; // s838 mad
r0 = r0 | r1; // s839 or
r5 = __umulhi(r5, r3); // s840 mulhi
r7 = r4 * r6 + r7; // s841 mad
r1 = r1 + r4 + ((((sel >> 21u) & 1u) != 0u) ? 0x1bc9f95du : 0xcfb90e90u); // s842 add
r1 = r1 + r2 + ((((sel >> 18u) & 1u) != 0u) ? 0xf9bd620fu : 0x0b4758b6u); // s843 add
r2 = r2 ^ __shfl_xor_sync(0xffffffffu, r5, 16); // s844 shfl
r3 = r1 * r7 + r3; // s845 mad
r5 = r5 * r2; // s846 mul
r0 = rotl_imm(r0, 21u); // s847 rotl
r7 = r7 ^ r1; // s848 xor
r3 = r3 + r4 + ((((sel >> 18u) & 1u) != 0u) ? 0x697a4946u : 0x41fdc15au); // s849 add
r0 = r0 ^ __shfl_xor_sync(0xffffffffu, r5, 4); // s850 shfl
r1 = rotr_var(r1, r5); // s851 rotr
r5 = r5 | r6; // s852 or
r6 = r6 - r2; // s853 sub
r2 = r2 ^ r6; // s854 xor
r4 = r4 - r6; // s855 sub
r6 = r4 * r6 + r6; // s856 mad
r4 = r4 * r0; // s857 mul
r2 = r2 ^ __shfl_xor_sync(0xffffffffu, r1, 4); // s858 shfl
r3 = r3 * r4; // s859 mul
r3 = r1 * r7 + r3; // s860 mad
r3 = r3 ^ __shfl_xor_sync(0xffffffffu, r2, 2); // s861 shfl
r7 = r7 ^ __shfl_xor_sync(0xffffffffu, r4, 8); // s862 shfl
r0 = r2 * r2 + r0; // s863 mad
r6 = r6 ^ r0; // s864 xor
r6 = r6 + r2 + ((((sel >> 2u) & 1u) != 0u) ? 0x7fedd7f3u : 0x90656f74u); // s865 add
r3 = r3 ^ r2; // s866 xor
r1 = r1 | r4; // s867 or
r6 = r6 ^ __shfl_xor_sync(0xffffffffu, r7, 2); // s868 shfl
r1 = __umulhi(r1, r0); // s869 mulhi
r3 = r3 ^ __shfl_xor_sync(0xffffffffu, r1, 4); // s870 shfl
r0 = r0 - r3; // s871 sub
r6 = r6 + r1 + ((((sel >> 11u) & 1u) != 0u) ? 0xbe1b480au : 0xa5c0b461u); // s872 add
r3 = r3 ^ __shfl_xor_sync(0xffffffffu, r6, 1); // s873 shfl
r5 = r5 ^ __shfl_xor_sync(0xffffffffu, r0, 1); // s874 shfl
r2 = __umulhi(r2, r4); // s875 mulhi
r5 = r5 ^ __shfl_xor_sync(0xffffffffu, r7, 4); // s876 shfl
r5 = rotl_imm(r5, 14u); // s877 rotl
r2 = r2 ^ r7; // s878 xor
r7 = r7 ^ r0; // s879 xor
r0 = r0 * r2; // s880 mul
r4 = r4 * r2; // s881 mul
r7 = r7 * r6; // s882 mul
r4 = __umulhi(r4, r5); // s883 mulhi
r0 = r0 - r4; // s884 sub
r0 = r0 ^ r5; // s885 xor
r6 = r6 * r5; // s886 mul
r1 = r1 + r5 + ((((sel >> 14u) & 1u) != 0u) ? 0x7007f98fu : 0xe806fcecu); // s887 add
r3 = r3 * r1; // s888 mul
r5 = r5 ^ r3; // s889 xor
r6 = r6 | r2; // s890 or
r1 = r1 * r2; // s891 mul
r5 = r5 + r7 + ((((sel >> 3u) & 1u) != 0u) ? 0xf3c87e02u : 0x89a8551eu); // s892 add
r2 = r2 ^ __shfl_xor_sync(0xffffffffu, r4, 16); // s893 shfl
r1 = r1 + r3 + ((((sel >> 13u) & 1u) != 0u) ? 0xc315f5deu : 0xba1369dbu); // s894 add
r5 = r0 * r3 + r5; // s895 mad
r5 = rotr_var(r5, r2); // s896 rotr
r1 = r1 ^ r0; // s897 xor
r5 = r5 ^ r1; // s898 xor
r5 = rotr_var(r5, r1); // s899 rotr
r3 = r6 * r6 + r3; // s900 mad
r0 = rotl_imm(r0, 8u); // s901 rotl
r1 = r1 | r0; // s902 or
r1 = r1 + r2 + ((((sel >> 3u) & 1u) != 0u) ? 0x1c355a71u : 0x260e6848u); // s903 add
r7 = r7 ^ __shfl_xor_sync(0xffffffffu, r2, 16); // s904 shfl
r1 = __umulhi(r1, r3); // s905 mulhi
r1 = rotr_var(r1, r4); // s906 rotr
r6 = r6 + r0 + ((((sel >> 8u) & 1u) != 0u) ? 0x0c74a1a8u : 0xa74fd2b1u); // s907 add
r6 = rotr_var(r6, r2); // s908 rotr
r4 = rotl_imm(r4, 12u); // s909 rotl
r5 = r5 + r3 + ((((sel >> 29u) & 1u) != 0u) ? 0xa49b5d73u : 0xe5fb043eu); // s910 add
r3 = r3 ^ r0; // s911 xor
r3 = rotr_var(r3, r4); // s912 rotr
r6 = rotr_var(r6, r0); // s913 rotr
r2 = r2 ^ r5; // s914 xor
r0 = r0 * r7; // s915 mul
r3 = r3 ^ r0; // s916 xor
r5 = r1 * r7 + r5; // s917 mad
r3 = r3 + r4 + ((((sel >> 2u) & 1u) != 0u) ? 0xeb76e56cu : 0x264cb47bu); // s918 add
r3 = __umulhi(r3, r4); // s919 mulhi
r5 = r5 + r6 + ((((sel >> 9u) & 1u) != 0u) ? 0x2aab9631u : 0x418baa72u); // s920 add
r5 = __umulhi(r5, r1); // s921 mulhi
r7 = r7 - r3; // s922 sub
r6 = r6 + r1 + ((((sel >> 2u) & 1u) != 0u) ? 0x98e6b26du : 0x3696a894u); // s923 add
r6 = r3 * r1 + r6; // s924 mad
r2 = r2 ^ __shfl_xor_sync(0xffffffffu, r1, 2); // s925 shfl
r6 = r6 ^ r1; // s926 xor
r4 = r4 ^ r3; // s927 xor
r0 = r0 + r4 + ((((sel >> 7u) & 1u) != 0u) ? 0x142778eeu : 0x0468c062u); // s928 add
r7 = r7 + r3 + ((((sel >> 29u) & 1u) != 0u) ? 0x4eae212du : 0x0af82291u); // s929 add
r4 = r4 ^ __shfl_xor_sync(0xffffffffu, r7, 16); // s930 shfl
r7 = r7 + r2 + ((((sel >> 20u) & 1u) != 0u) ? 0x8d2a8b36u : 0x17de5e29u); // s931 add
r5 = r5 + r1 + ((((sel >> 6u) & 1u) != 0u) ? 0xe2d2d7d5u : 0x686794a8u); // s932 add
r0 = __umulhi(r0, r3); // s933 mulhi
r4 = r4 + r0 + ((((sel >> 10u) & 1u) != 0u) ? 0xe3c3c6f9u : 0x66278068u); // s934 add
r6 = rotl_imm(r6, 22u); // s935 rotl
r0 = r0 | r2; // s936 or
r4 = r4 * r3; // s937 mul
r3 = r3 | r6; // s938 or
r7 = rotl_imm(r7, 28u); // s939 rotl
r0 = r0 + r6 + ((((sel >> 20u) & 1u) != 0u) ? 0xc2296063u : 0xc2d02ca6u); // s940 add
r1 = r1 + r5 + ((((sel >> 14u) & 1u) != 0u) ? 0xef1ca415u : 0x0b3c00e0u); // s941 add
r2 = r2 - r6; // s942 sub
r6 = r6 | r3; // s943 or
r0 = rotl_imm(r0, 2u); // s944 rotl
r2 = r2 * r1; // s945 mul
r0 = r0 + r6 + ((((sel >> 1u) & 1u) != 0u) ? 0x06a1321au : 0x11224846u); // s946 add
r3 = r3 * r6; // s947 mul
r5 = r5 - r2; // s948 sub
r5 = r5 + r4 + ((((sel >> 5u) & 1u) != 0u) ? 0x5d3e225cu : 0x461c43d4u); // s949 add
r2 = r2 ^ __shfl_xor_sync(0xffffffffu, r1, 16); // s950 shfl
r7 = r0 * r0 + r7; // s951 mad
r6 = rotr_var(r6, r4); // s952 rotr
r1 = r1 + r0 + ((((sel >> 30u) & 1u) != 0u) ? 0xbb84f628u : 0xd5eed39fu); // s953 add
r4 = rotl_imm(r4, 31u); // s954 rotl
r1 = r1 ^ __shfl_xor_sync(0xffffffffu, r2, 16); // s955 shfl
r2 = r2 - r6; // s956 sub
r4 = r4 ^ r2; // s957 xor
r0 = r0 ^ r2; // s958 xor
r1 = r1 + r0 + ((((sel >> 28u) & 1u) != 0u) ? 0x374c0426u : 0x519d72f7u); // s959 add
r5 = r5 * r4; // s960 mul
r5 = r5 - r7; // s961 sub
r2 = r2 ^ r6; // s962 xor
r4 = r4 ^ r1; // s963 xor
r2 = r2 ^ __shfl_xor_sync(0xffffffffu, r4, 16); // s964 shfl
r7 = __umulhi(r7, r3); // s965 mulhi
r4 = rotl_imm(r4, 12u); // s966 rotl
r4 = r4 + r6 + ((((sel >> 26u) & 1u) != 0u) ? 0x03b88592u : 0x151dae18u); // s967 add
r1 = r1 ^ __shfl_xor_sync(0xffffffffu, r3, 4); // s968 shfl
r3 = r3 ^ __shfl_xor_sync(0xffffffffu, r6, 8); // s969 shfl
r2 = r2 ^ r7; // s970 xor
r5 = r3 * r4 + r5; // s971 mad
r0 = r0 ^ r3; // s972 xor
r2 = r2 ^ r5; // s973 xor
r1 = r1 ^ __shfl_xor_sync(0xffffffffu, r0, 4); // s974 shfl
r5 = r1 * r4 + r5; // s975 mad
r2 = rotl_imm(r2, 19u); // s976 rotl
r1 = r1 - r4; // s977 sub
r5 = rotr_var(r5, r4); // s978 rotr
r2 = r2 ^ __shfl_xor_sync(0xffffffffu, r1, 16); // s979 shfl
r6 = r6 + r7 + ((((sel >> 28u) & 1u) != 0u) ? 0x1fdee45eu : 0x16220e61u); // s980 add
r4 = rotr_var(r4, r6); // s981 rotr
r6 = __umulhi(r6, r3); // s982 mulhi
r5 = rotl_imm(r5, 17u); // s983 rotl
r2 = r7 * r1 + r2; // s984 mad
r4 = r4 ^ __shfl_xor_sync(0xffffffffu, r1, 8); // s985 shfl
r3 = r3 ^ r1; // s986 xor
r4 = r4 + r0 + ((((sel >> 27u) & 1u) != 0u) ? 0x44adc457u : 0x6cd6b697u); // s987 add
r1 = r1 * r5; // s988 mul
r4 = r4 + r2 + ((((sel >> 2u) & 1u) != 0u) ? 0x0a06a223u : 0x1103d2d2u); // s989 add
r4 = r4 * r1; // s990 mul
r4 = r5 * r1 + r4; // s991 mad
r3 = r3 ^ __shfl_xor_sync(0xffffffffu, r6, 1); // s992 shfl
r1 = r1 - r3; // s993 sub
r4 = r7 * r5 + r4; // s994 mad
r1 = __umulhi(r1, r2); // s995 mulhi
r2 = r1 * r0 + r2; // s996 mad
r3 = rotl_imm(r3, 31u); // s997 rotl
r4 = r4 - r3; // s998 sub
r5 = rotr_var(r5, r3); // s999 rotr
r4 = r4 ^ __shfl_xor_sync(0xffffffffu, r0, 4); // s1000 shfl
r2 = r2 - r5; // s1001 sub
r3 = r4 * r4 + r3; // s1002 mad
r7 = r5 * r1 + r7; // s1003 mad
r7 = r7 + r4 + ((((sel >> 29u) & 1u) != 0u) ? 0x0044887fu : 0xa9c9d8a9u); // s1004 add
r4 = __umulhi(r4, r0); // s1005 mulhi
r4 = rotl_imm(r4, 21u); // s1006 rotl
r3 = r3 * r1; // s1007 mul
r1 = r1 ^ __shfl_xor_sync(0xffffffffu, r5, 2); // s1008 shfl
r0 = __umulhi(r0, r6); // s1009 mulhi
r0 = r0 ^ r3; // s1010 xor
r5 = r5 | r4; // s1011 or
r1 = r1 ^ __shfl_xor_sync(0xffffffffu, r5, 4); // s1012 shfl
r2 = r2 + r4 + ((((sel >> 4u) & 1u) != 0u) ? 0x6b70e2c7u : 0xfa1574e3u); // s1013 add
r5 = rotr_var(r5, r7); // s1014 rotr
r0 = rotr_var(r0, r7); // s1015 rotr
r5 = r5 - r7; // s1016 sub
r4 = r4 ^ __shfl_xor_sync(0xffffffffu, r1, 16); // s1017 shfl
r6 = __umulhi(r6, r7); // s1018 mulhi
r0 = rotr_var(r0, r1); // s1019 rotr
r2 = r2 ^ r0; // s1020 xor
r4 = r5 * r1 + r4; // s1021 mad
r6 = r6 | r2; // s1022 or
r3 = r3 ^ r0; // s1023 xor
}
}
uint32_t lo = r0 ^ rotl_imm(r1, 7u) ^ rotl_imm(r2, 14u) ^ rotl_imm(r3, 21u);
uint32_t hi = r4 ^ rotl_imm(r5, 9u) ^ rotl_imm(r6, 18u) ^ rotl_imm(r7, 27u);
out[gid] = ((uint64_t)hi << 32) | (uint64_t)lo;
}
// Host-side launch wrappers. Declared in program.h, called from host.cu.
cudaError_t igneum_launch_cache_fill(uint32_t* cache, uint32_t nSegments) {
if (nSegments == 0u) return cudaErrorInvalidValue;
uint32_t block = 256u;
uint32_t grid = (nSegments + block - 1u) / block;
igneum_cache_fill<<<grid, block>>>(cache, nSegments);
return cudaGetLastError();
}
cudaError_t igneum_launch_build(uint32_t* ds, const uint32_t* cache, uint32_t nItems) {
if (nItems == 0u) return cudaErrorInvalidValue;
uint32_t block = 256u;
uint32_t grid = (nItems + block - 1u) / block;
igneum_build<<<grid, block>>>(ds, cache, nItems);
return cudaGetLastError();
}
cudaError_t igneum_launch_hash(const uint32_t* ds, uint64_t* out, uint32_t baseNonce, uint32_t mask,
uint32_t nonces, uint32_t blockWarps) {
if (blockWarps == 0u || blockWarps > 32u) return cudaErrorInvalidValue;
uint32_t block = 32u * blockWarps;
if (nonces == 0u || (nonces % block) != 0u) return cudaErrorInvalidValue;
igneum_hash<<<nonces / block, block>>>(ds, out, baseNonce, mask);
return cudaGetLastError();
}
cudaError_t igneum_hash_info(int* numRegs, int* blocksPerSM, uint32_t blockWarps) {
cudaFuncAttributes attr;
cudaError_t e = cudaFuncGetAttributes(&attr, igneum_hash);
if (e != cudaSuccess) return e;
*numRegs = attr.numRegs;
return cudaOccupancyMaxActiveBlocksPerMultiprocessor(blocksPerSM, igneum_hash, (int)(32u * blockWarps), 0);
}