--- /dev/null
+// SPDX-FileCopyrightText: 2025 Chris Duncan <chris@zoso.dev>
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+struct UBO {
+ blockhash: array<vec4<u32>, 2>,
+ random: u32,
+ threshold: u32
+};
+@group(0) @binding(0) var<uniform> ubo: UBO;
+
+struct WORK {
+ nonce: vec2<u32>,
+ found: atomic<u32>
+};
+@group(0) @binding(1) var<storage, read_write> work: WORK;
+
+/**
+* Defined separately from uint v[32] below as the original value is required
+* to calculate the second uint32 of the digest for threshold comparison
+*/
+const BLAKE2B_IV32_1: u32 = 0x6A09E667u;
+
+/**
+* Main compute function
+* A random u32 provided by the UBO is copied to form a pair. Each component of
+* this 8-byte value is then XOR'd with a different dimensional index from
+* the thread identifier.
+*/
+@compute @workgroup_size(256)
+fn main(@builtin(global_invocation_id) id: vec3<u32>) {
+ if (atomicLoad(&work.found) != 0u) { return; }
+
+ let threshold: u32 = ubo.threshold;
+
+ /**
+ * Initialize (nonce||blockhash) concatenation
+ */
+ var m0: u32 = ubo.random ^ id.x;
+ var m1: u32 = ubo.random ^ id.y;
+ var m2: u32 = ubo.blockhash[0u].x;
+ var m3: u32 = ubo.blockhash[0u].y;
+ var m4: u32 = ubo.blockhash[0u].z;
+ var m5: u32 = ubo.blockhash[0u].w;
+ var m6: u32 = ubo.blockhash[1u].x;
+ var m7: u32 = ubo.blockhash[1u].y;
+ var m8: u32 = ubo.blockhash[1u].z;
+ var m9: u32 = ubo.blockhash[1u].w;
+
+ /**
+ * Compression buffer intialized to 2 instances of initialization vector
+ * The following values have been modified from the BLAKE2B_IV:
+ * OUTLEN is constant 8 bytes
+ * v[0u] ^= 0x01010000u ^ uint(OUTLEN);
+ * INLEN is constant 40 bytes: work value (8) + block hash (32)
+ * v[24u] ^= uint(INLEN);
+ * It is always the "last" compression at this INLEN
+ * v[28u] = ~v[28u];
+ * v[29u] = ~v[29u];
+ */
+ var v0: u32 = 0xF2BDC900u;
+ var v1: u32 = 0x6A09E667u;
+ var v2: u32 = 0x84CAA73Bu;
+ var v3: u32 = 0xBB67AE85u;
+ var v4: u32 = 0xFE94F82Bu;
+ var v5: u32 = 0x3C6EF372u;
+ var v6: u32 = 0x5F1D36F1u;
+ var v7: u32 = 0xA54FF53Au;
+ var v8: u32 = 0xADE682D1u;
+ var v9: u32 = 0x510E527Fu;
+ var v10: u32 = 0x2B3E6C1Fu;
+ var v11: u32 = 0x9B05688Cu;
+ var v12: u32 = 0xFB41BD6Bu;
+ var v13: u32 = 0x1F83D9ABu;
+ var v14: u32 = 0x137E2179u;
+ var v15: u32 = 0x5BE0CD19u;
+ var v16: u32 = 0xF3BCC908u;
+ var v17: u32 = 0x6A09E667u;
+ var v18: u32 = 0x84CAA73Bu;
+ var v19: u32 = 0xBB67AE85u;
+ var v20: u32 = 0xFE94F82Bu;
+ var v21: u32 = 0x3C6EF372u;
+ var v22: u32 = 0x5F1D36F1u;
+ var v23: u32 = 0xA54FF53Au;
+ var v24: u32 = 0xADE682F9u;
+ var v25: u32 = 0x510E527Fu;
+ var v26: u32 = 0x2B3E6C1Fu;
+ var v27: u32 = 0x9B05688Cu;
+ var v28: u32 = 0x04BE4294u;
+ var v29: u32 = 0xE07C2654u;
+ var v30: u32 = 0x137E2179u;
+ var v31: u32 = 0x5BE0CD19u;
+
+
+
+
+
+ /**
+ * Twelve rounds of G mixing as part of BLAKE2b compression step.
+ * Each sigma r index correlates with the reference implementation, but each
+ * sigma i index, and each v index, is doubled due to using two u32 array
+ * elements to represent one uint64_t.
+ */
+ var o0: u32;
+ var o1: u32;
+ var xor0: u32;
+ var xor1: u32;
+
+ /****************************************************************************
+ * ROUND(0) *
+ ****************************************************************************/
+
+ /**
+ * r=0, i=0(x2), a=v[0-1], b=v[8-9], c=v[16-17], d=v[24-25]
+ */
+
+ // a = a + b
+ o0 = v0 + v8;
+ o1 = v1 + v9;
+ o1 = o1 + select(0u, 1u, o0 < v0);
+ v0 = o0;
+ v1 = o1;
+
+ // a = a + m[sigma[r][2*i+0]]
+ o0 = v0 + m0;
+ o1 = v1 + m1;
+ o1 = o1 + select(0u, 1u, o0 < v0);
+ v0 = o0;
+ v1 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v24 ^ v0;
+ xor1 = v25 ^ v1;
+ v24 = xor1;
+ v25 = xor0;
+
+ // c = c + d
+ o0 = v16 + v24;
+ o1 = v17 + v25;
+ o1 = o1 + select(0u, 1u, o0 < v16);
+ v16 = o0;
+ v17 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v8 ^ v16;
+ xor1 = v9 ^ v17;
+ v8 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v9 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v0 + v8;
+ o1 = v1 + v9;
+ o1 = o1 + select(0u, 1u, o0 < v0);
+ v0 = o0;
+ v1 = o1;
+
+ // a = a + m[sigma[r][2*i+1]]
+ o0 = v0 + m2;
+ o1 = v1 + m3;
+ o1 = o1 + select(0u, 1u, o0 < v0);
+ v0 = o0;
+ v1 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v24 ^ v0;
+ xor1 = v25 ^ v1;
+ v24 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v25 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v16 + v24;
+ o1 = v17 + v25;
+ o1 = o1 + select(0u, 1u, o0 < v16);
+ v16 = o0;
+ v17 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v8 ^ v16;
+ xor1 = v9 ^ v17;
+ v8 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v9 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=0, i=1(x2), a=v[2-3], b=v[10-11], c=v[18-19], d=v[26-27]
+ */
+
+ // a = a + b
+ o0 = v2 + v10;
+ o1 = v3 + v11;
+ o1 = o1 + select(0u, 1u, o0 < v2);
+ v2 = o0;
+ v3 = o1;
+
+ // a = a + m[sigma[r][2*i+0]]
+ o0 = v2 + m4;
+ o1 = v3 + m5;
+ o1 = o1 + select(0u, 1u, o0 < v2);
+ v2 = o0;
+ v3 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v26 ^ v2;
+ xor1 = v27 ^ v3;
+ v26 = xor1;
+ v27 = xor0;
+
+ // c = c + d
+ o0 = v18 + v26;
+ o1 = v19 + v27;
+ o1 = o1 + select(0u, 1u, o0 < v18);
+ v18 = o0;
+ v19 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v10 ^ v18;
+ xor1 = v11 ^ v19;
+ v10 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v11 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v2 + v10;
+ o1 = v3 + v11;
+ o1 = o1 + select(0u, 1u, o0 < v2);
+ v2 = o0;
+ v3 = o1;
+
+ // a = a + m[sigma[r][2*i+1]]
+ o0 = v2 + m6;
+ o1 = v3 + m7;
+ o1 = o1 + select(0u, 1u, o0 < v2);
+ v2 = o0;
+ v3 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v26 ^ v2;
+ xor1 = v27 ^ v3;
+ v26 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v27 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v18 + v26;
+ o1 = v19 + v27;
+ o1 = o1 + select(0u, 1u, o0 < v18);
+ v18 = o0;
+ v19 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v10 ^ v18;
+ xor1 = v11 ^ v19;
+ v10 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v11 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=0, i=2(x2), a=v[2-3], b=v[10-11], c=v[18-19], d=v[26-27]
+ */
+
+ // a = a + b
+ o0 = v4 + v12;
+ o1 = v5 + v13;
+ o1 = o1 + select(0u, 1u, o0 < v4);
+ v4 = o0;
+ v5 = o1;
+
+ // a = a + m[sigma[r][2*i+0]]
+ o0 = v4 + m8;
+ o1 = v5 + m9;
+ o1 = o1 + select(0u, 1u, o0 < v4);
+ v4 = o0;
+ v5 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v28 ^ v4;
+ xor1 = v29 ^ v5;
+ v28 = xor1;
+ v29 = xor0;
+
+ // c = c + d
+ o0 = v20 + v28;
+ o1 = v21 + v29;
+ o1 = o1 + select(0u, 1u, o0 < v20);
+ v20 = o0;
+ v21 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v12 ^ v20;
+ xor1 = v13 ^ v21;
+ v12 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v13 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v4 + v12;
+ o1 = v5 + v13;
+ o1 = o1 + select(0u, 1u, o0 < v4);
+ v4 = o0;
+ v5 = o1;
+
+ // // a = a + m[sigma[r][2*i+1]]
+ // // skip since adding 0u does nothing
+ // o0 = v4 + 0u;
+ // o1 = v5 + 0u;
+ // if (v4 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v4 = o0;
+ // v5 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v28 ^ v4;
+ xor1 = v29 ^ v5;
+ v28 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v29 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v20 + v28;
+ o1 = v21 + v29;
+ o1 = o1 + select(0u, 1u, o0 < v20);
+ v20 = o0;
+ v21 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v12 ^ v20;
+ xor1 = v13 ^ v21;
+ v12 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v13 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=0, i=3(x2), a=v[6-7], b=v[14-15], c=v[22-23], d=v[30-31]
+ */
+
+ // a = a + b
+ o0 = v6 + v14;
+ o1 = v7 + v15;
+ o1 = o1 + select(0u, 1u, o0 < v6);
+ v6 = o0;
+ v7 = o1;
+
+ // // a = a + m[sigma[r][2*i+0]]
+ // // skip since adding 0u does nothing
+ // o0 = v6 + 0u;
+ // o1 = v7 + 0u;
+ // if (v6 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v6 = o0;
+ // v7 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v30 ^ v6;
+ xor1 = v31 ^ v7;
+ v30 = xor1;
+ v31 = xor0;
+
+ // c = c + d
+ o0 = v22 + v30;
+ o1 = v23 + v31;
+ o1 = o1 + select(0u, 1u, o0 < v22);
+ v22 = o0;
+ v23 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v14 ^ v22;
+ xor1 = v15 ^ v23;
+ v14 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v15 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v6 + v14;
+ o1 = v7 + v15;
+ o1 = o1 + select(0u, 1u, o0 < v6);
+ v6 = o0;
+ v7 = o1;
+
+ // // a = a + m[sigma[r][2*i+1]]
+ // // skip since adding 0u does nothing
+ // o0 = v6 + 0u;
+ // o1 = v7 + 0u;
+ // if (v6 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v6 = o0;
+ // v7 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v30 ^ v6;
+ xor1 = v31 ^ v7;
+ v30 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v31 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v22 + v30;
+ o1 = v23 + v31;
+ o1 = o1 + select(0u, 1u, o0 < v22);
+ v22 = o0;
+ v23 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v14 ^ v22;
+ xor1 = v15 ^ v23;
+ v14 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v15 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=0, i=4(x2), a=v[0-1], b=v[10-11], c=v[20-21], d=v[30-31]
+ */
+
+ // a = a + b
+ o0 = v0 + v10;
+ o1 = v1 + v11;
+ o1 = o1 + select(0u, 1u, o0 < v0);
+ v0 = o0;
+ v1 = o1;
+
+ // // a = a + m[sigma[r][2*i+0]]
+ // // skip since adding 0u does nothing
+ // o0 = v0 + 0u;
+ // o1 = v1 + 0u;
+ // if (v0 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v0 = o0;
+ // v1 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v30 ^ v0;
+ xor1 = v31 ^ v1;
+ v30 = xor1;
+ v31 = xor0;
+
+ // c = c + d
+ o0 = v20 + v30;
+ o1 = v21 + v31;
+ o1 = o1 + select(0u, 1u, o0 < v20);
+ v20 = o0;
+ v21 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v10 ^ v20;
+ xor1 = v11 ^ v21;
+ v10 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v11 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v0 + v10;
+ o1 = v1 + v11;
+ o1 = o1 + select(0u, 1u, o0 < v0);
+ v0 = o0;
+ v1 = o1;
+
+ // // a = a + m[sigma[r][2*i+1]]
+ // // skip since adding 0u does nothing
+ // o0 = v0 + 0u;
+ // o1 = v1 + 0u;
+ // if (v0 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v0 = o0;
+ // v1 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v30 ^ v0;
+ xor1 = v31 ^ v1;
+ v30 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v31 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v20 + v30;
+ o1 = v21 + v31;
+ o1 = o1 + select(0u, 1u, o0 < v20);
+ v20 = o0;
+ v21 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v10 ^ v20;
+ xor1 = v11 ^ v21;
+ v10 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v11 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=0, i=5(x2), a=v[2-3], b=v[12-13], c=v[22-23], d=v[24-25]
+ */
+
+ // a = a + b
+ o0 = v2 + v12;
+ o1 = v3 + v13;
+ o1 = o1 + select(0u, 1u, o0 < v2);
+ v2 = o0;
+ v3 = o1;
+
+ // // a = a + m[sigma[r][2*i+0]]
+ // // skip since adding 0u does nothing
+ // o0 = v2 + 0u;
+ // o1 = v3 + 0u;
+ // if (v2 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v2 = o0;
+ // v3 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v24 ^ v2;
+ xor1 = v25 ^ v3;
+ v24 = xor1;
+ v25 = xor0;
+
+ // c = c + d
+ o0 = v22 + v24;
+ o1 = v23 + v25;
+ o1 = o1 + select(0u, 1u, o0 < v22);
+ v22 = o0;
+ v23 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v12 ^ v22;
+ xor1 = v13 ^ v23;
+ v12 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v13 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v2 + v12;
+ o1 = v3 + v13;
+ o1 = o1 + select(0u, 1u, o0 < v2);
+ v2 = o0;
+ v3 = o1;
+
+ // // a = a + m[sigma[r][2*i+1]]
+ // // skip since adding 0u does nothing
+ // o0 = v2 + 0u;
+ // o1 = v3 + 0u;
+ // if (v2 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v2 = o0;
+ // v3 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v24 ^ v2;
+ xor1 = v25 ^ v3;
+ v24 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v25 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v22 + v24;
+ o1 = v23 + v25;
+ o1 = o1 + select(0u, 1u, o0 < v22);
+ v22 = o0;
+ v23 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v12 ^ v22;
+ xor1 = v13 ^ v23;
+ v12 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v13 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=0, i=6(x2), a=v[4-6], b=v[14-15], c=v[16-17], d=v[26-27]
+ */
+
+ // a = a + b
+ o0 = v4 + v14;
+ o1 = v5 + v15;
+ o1 = o1 + select(0u, 1u, o0 < v4);
+ v4 = o0;
+ v5 = o1;
+
+ // // a = a + m[sigma[r][2*i+0]]
+ // // skip since adding 0u does nothing
+ // o0 = v4 + 0u;
+ // o1 = v5 + 0u;
+ // if (v4 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v4 = o0;
+ // v5 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v26 ^ v4;
+ xor1 = v27 ^ v5;
+ v26 = xor1;
+ v27 = xor0;
+
+ // c = c + d
+ o0 = v16 + v26;
+ o1 = v17 + v27;
+ o1 = o1 + select(0u, 1u, o0 < v16);
+ v16 = o0;
+ v17 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v14 ^ v16;
+ xor1 = v15 ^ v17;
+ v14 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v15 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v4 + v14;
+ o1 = v5 + v15;
+ o1 = o1 + select(0u, 1u, o0 < v4);
+ v4 = o0;
+ v5 = o1;
+
+ // // a = a + m[sigma[r][2*i+1]]
+ // // skip since adding 0u does nothing
+ // o0 = v4 + 0u;
+ // o1 = v5 + 0u;
+ // if (v4 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v4 = o0;
+ // v5 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v26 ^ v4;
+ xor1 = v27 ^ v5;
+ v26 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v27 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v16 + v26;
+ o1 = v17 + v27;
+ o1 = o1 + select(0u, 1u, o0 < v16);
+ v16 = o0;
+ v17 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v14 ^ v16;
+ xor1 = v15 ^ v17;
+ v14 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v15 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=0, i=7(x2), a=v[6-7], b=v[8-9], c=v[18-19], d=v[28-29]
+ */
+
+ // a = a + b
+ o0 = v6 + v8;
+ o1 = v7 + v9;
+ o1 = o1 + select(0u, 1u, o0 < v6);
+ v6 = o0;
+ v7 = o1;
+
+ // // a = a + m[sigma[r][2*i+0]]
+ // // skip since adding 0u does nothing
+ // o0 = v6 + 0u;
+ // o1 = v7 + 0u;
+ // if (v6 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v6 = o0;
+ // v7 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v28 ^ v6;
+ xor1 = v29 ^ v7;
+ v28 = xor1;
+ v29 = xor0;
+
+ // c = c + d
+ o0 = v18 + v28;
+ o1 = v19 + v29;
+ o1 = o1 + select(0u, 1u, o0 < v18);
+ v18 = o0;
+ v19 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v8 ^ v18;
+ xor1 = v9 ^ v19;
+ v8 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v9 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v6 + v8;
+ o1 = v7 + v9;
+ o1 = o1 + select(0u, 1u, o0 < v6);
+ v6 = o0;
+ v7 = o1;
+
+ // // a = a + m[sigma[r][2*i+1]]
+ // // skip since adding 0u does nothing
+ // o0 = v6 + 0u;
+ // o1 = v7 + 0u;
+ // if (v6 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v6 = o0;
+ // v7 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v28 ^ v6;
+ xor1 = v29 ^ v7;
+ v28 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v29 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v18 + v28;
+ o1 = v19 + v29;
+ o1 = o1 + select(0u, 1u, o0 < v18);
+ v18 = o0;
+ v19 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v8 ^ v18;
+ xor1 = v9 ^ v19;
+ v8 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v9 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /****************************************************************************
+ * ROUND(1) *
+ ****************************************************************************/
+
+ /**
+ * r=1, i=0(x2), a=v[0-1], b=v[8-9], c=v[16-17], d=v[24-25]
+ */
+
+ // a = a + b
+ o0 = v0 + v8;
+ o1 = v1 + v9;
+ o1 = o1 + select(0u, 1u, o0 < v0);
+ v0 = o0;
+ v1 = o1;
+
+ // // a = a + m[sigma[r][2*i+0]]
+ // // skip since adding 0u does nothing
+ // o0 = v0 + 0u;
+ // o1 = v1 + 0u;
+ // if (v0 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v0 = o0;
+ // v1 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v24 ^ v0;
+ xor1 = v25 ^ v1;
+ v24 = xor1;
+ v25 = xor0;
+
+ // c = c + d
+ o0 = v16 + v24;
+ o1 = v17 + v25;
+ o1 = o1 + select(0u, 1u, o0 < v16);
+ v16 = o0;
+ v17 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v8 ^ v16;
+ xor1 = v9 ^ v17;
+ v8 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v9 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v0 + v8;
+ o1 = v1 + v9;
+ o1 = o1 + select(0u, 1u, o0 < v0);
+ v0 = o0;
+ v1 = o1;
+
+ // // a = a + m[sigma[r][2*i+1]]
+ // // skip since adding 0u does nothing
+ // o0 = v0 + 0u;
+ // o1 = v1 + 0u;
+ // if (v0 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v0 = o0;
+ // v1 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v24 ^ v0;
+ xor1 = v25 ^ v1;
+ v24 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v25 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v16 + v24;
+ o1 = v17 + v25;
+ o1 = o1 + select(0u, 1u, o0 < v16);
+ v16 = o0;
+ v17 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v8 ^ v16;
+ xor1 = v9 ^ v17;
+ v8 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v9 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=1, i=1(x2), a=v[2-3], b=v[10-11], c=v[18-19], d=v[26-27]
+ */
+
+ // a = a + b
+ o0 = v2 + v10;
+ o1 = v3 + v11;
+ o1 = o1 + select(0u, 1u, o0 < v2);
+ v2 = o0;
+ v3 = o1;
+
+ // a = a + m[sigma[r][2*i+0]]
+ o0 = v2 + m8;
+ o1 = v3 + m9;
+ o1 = o1 + select(0u, 1u, o0 < v2);
+ v2 = o0;
+ v3 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v26 ^ v2;
+ xor1 = v27 ^ v3;
+ v26 = xor1;
+ v27 = xor0;
+
+ // c = c + d
+ o0 = v18 + v26;
+ o1 = v19 + v27;
+ o1 = o1 + select(0u, 1u, o0 < v18);
+ v18 = o0;
+ v19 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v10 ^ v18;
+ xor1 = v11 ^ v19;
+ v10 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v11 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v2 + v10;
+ o1 = v3 + v11;
+ o1 = o1 + select(0u, 1u, o0 < v2);
+ v2 = o0;
+ v3 = o1;
+
+ // // a = a + m[sigma[r][2*i+1]]
+ // // skip since adding 0u does nothing
+ // o0 = v2 + 0u;
+ // o1 = v3 + 0u;
+ // if (v2 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v2 = o0;
+ // v3 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v26 ^ v2;
+ xor1 = v27 ^ v3;
+ v26 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v27 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v18 + v26;
+ o1 = v19 + v27;
+ o1 = o1 + select(0u, 1u, o0 < v18);
+ v18 = o0;
+ v19 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v10 ^ v18;
+ xor1 = v11 ^ v19;
+ v10 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v11 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=1, i=2(x2), a=v[4-5], b=v[12-13], c=v[20-21], d=v[28-29]
+ */
+
+ // a = a + b
+ o0 = v4 + v12;
+ o1 = v5 + v13;
+ o1 = o1 + select(0u, 1u, o0 < v4);
+ v4 = o0;
+ v5 = o1;
+
+ // // a = a + m[sigma[r][2*i+0]]
+ // // skip since adding 0u does nothing
+ // o0 = v4 + 0u;
+ // o1 = v5 + 0u;
+ // if (v4 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v4 = o0;
+ // v5 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v28 ^ v4;
+ xor1 = v29 ^ v5;
+ v28 = xor1;
+ v29 = xor0;
+
+ // c = c + d
+ o0 = v20 + v28;
+ o1 = v21 + v29;
+ o1 = o1 + select(0u, 1u, o0 < v20);
+ v20 = o0;
+ v21 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v12 ^ v20;
+ xor1 = v13 ^ v21;
+ v12 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v13 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v4 + v12;
+ o1 = v5 + v13;
+ o1 = o1 + select(0u, 1u, o0 < v4);
+ v4 = o0;
+ v5 = o1;
+
+ // // a = a + m[sigma[r][2*i+1]]
+ // // skip since adding 0u does nothing
+ // o0 = v4 + 0u;
+ // o1 = v5 + 0u;
+ // if (v4 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v4 = o0;
+ // v5 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v28 ^ v4;
+ xor1 = v29 ^ v5;
+ v28 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v29 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v20 + v28;
+ o1 = v21 + v29;
+ o1 = o1 + select(0u, 1u, o0 < v20);
+ v20 = o0;
+ v21 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v12 ^ v20;
+ xor1 = v13 ^ v21;
+ v12 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v13 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=1, i=3(x2), a=v[6-7], b=v[14-15], c=v[22-23], d=v[30-31]
+ */
+
+ // a = a + b
+ o0 = v6 + v14;
+ o1 = v7 + v15;
+ o1 = o1 + select(0u, 1u, o0 < v6);
+ v6 = o0;
+ v7 = o1;
+
+ // // a = a + m[sigma[r][2*i+0]]
+ // // skip since adding 0u does nothing
+ // o0 = v6 + 0u;
+ // o1 = v7 + 0u;
+ // if (v6 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v6 = o0;
+ // v7 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v30 ^ v6;
+ xor1 = v31 ^ v7;
+ v30 = xor1;
+ v31 = xor0;
+
+ // c = c + d
+ o0 = v22 + v30;
+ o1 = v23 + v31;
+ o1 = o1 + select(0u, 1u, o0 < v22);
+ v22 = o0;
+ v23 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v14 ^ v22;
+ xor1 = v15 ^ v23;
+ v14 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v15 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v6 + v14;
+ o1 = v7 + v15;
+ o1 = o1 + select(0u, 1u, o0 < v6);
+ v6 = o0;
+ v7 = o1;
+
+ // // a = a + m[sigma[r][2*i+1]]
+ // // skip since adding 0u does nothing
+ // o0 = v6 + 0u;
+ // o1 = v7 + 0u;
+ // if (v6 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v6 = o0;
+ // v7 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v30 ^ v6;
+ xor1 = v31 ^ v7;
+ v30 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v31 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v22 + v30;
+ o1 = v23 + v31;
+ o1 = o1 + select(0u, 1u, o0 < v22);
+ v22 = o0;
+ v23 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v14 ^ v22;
+ xor1 = v15 ^ v23;
+ v14 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v15 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=1, i=4(x2), a=v[0-1], b=v[11-12], c=v[21-22], d=v[30-31]
+ */
+
+ // a = a + b
+ o0 = v0 + v10;
+ o1 = v1 + v11;
+ o1 = o1 + select(0u, 1u, o0 < v0);
+ v0 = o0;
+ v1 = o1;
+
+ // a = a + m[sigma[r][2*i+0]]
+ o0 = v0 + m2;
+ o1 = v1 + m3;
+ o1 = o1 + select(0u, 1u, o0 < v0);
+ v0 = o0;
+ v1 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v30 ^ v0;
+ xor1 = v31 ^ v1;
+ v30 = xor1;
+ v31 = xor0;
+
+ // c = c + d
+ o0 = v20 + v30;
+ o1 = v21 + v31;
+ o1 = o1 + select(0u, 1u, o0 < v20);
+ v20 = o0;
+ v21 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v10 ^ v20;
+ xor1 = v11 ^ v21;
+ v10 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v11 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v0 + v10;
+ o1 = v1 + v11;
+ o1 = o1 + select(0u, 1u, o0 < v0);
+ v0 = o0;
+ v1 = o1;
+
+ // // a = a + m[sigma[r][2*i+1]]
+ // // skip since adding 0u does nothing
+ // o0 = v0 + 0u;
+ // o1 = v1 + 0u;
+ // if (v0 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v0 = o0;
+ // v1 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v30 ^ v0;
+ xor1 = v31 ^ v1;
+ v30 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v31 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v20 + v30;
+ o1 = v21 + v31;
+ o1 = o1 + select(0u, 1u, o0 < v20);
+ v20 = o0;
+ v21 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v10 ^ v20;
+ xor1 = v11 ^ v21;
+ v10 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v11 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=1, i=5(x2), a=v[2-3], b=v[12-13], c=v[22-23], d=v[24-25]
+ */
+
+ // a = a + b
+ o0 = v2 + v12;
+ o1 = v3 + v13;
+ o1 = o1 + select(0u, 1u, o0 < v2);
+ v2 = o0;
+ v3 = o1;
+
+ // a = a + m[sigma[r][2*i+0]]
+ o0 = v2 + m0;
+ o1 = v3 + m1;
+ o1 = o1 + select(0u, 1u, o0 < v2);
+ v2 = o0;
+ v3 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v24 ^ v2;
+ xor1 = v25 ^ v3;
+ v24 = xor1;
+ v25 = xor0;
+
+ // c = c + d
+ o0 = v22 + v24;
+ o1 = v23 + v25;
+ o1 = o1 + select(0u, 1u, o0 < v22);
+ v22 = o0;
+ v23 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v12 ^ v22;
+ xor1 = v13 ^ v23;
+ v12 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v13 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v2 + v12;
+ o1 = v3 + v13;
+ o1 = o1 + select(0u, 1u, o0 < v2);
+ v2 = o0;
+ v3 = o1;
+
+ // a = a + m[sigma[r][2*i+1]]
+ o0 = v2 + m4;
+ o1 = v3 + m5;
+ o1 = o1 + select(0u, 1u, o0 < v2);
+ v2 = o0;
+ v3 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v24 ^ v2;
+ xor1 = v25 ^ v3;
+ v24 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v25 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v22 + v24;
+ o1 = v23 + v25;
+ o1 = o1 + select(0u, 1u, o0 < v22);
+ v22 = o0;
+ v23 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v12 ^ v22;
+ xor1 = v13 ^ v23;
+ v12 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v13 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=1, i=6(x2), a=v[4-5], b=v[14-15], c=v[16-17], d=v[26-27]
+ */
+
+ // a = a + b
+ o0 = v4 + v14;
+ o1 = v5 + v15;
+ o1 = o1 + select(0u, 1u, o0 < v4);
+ v4 = o0;
+ v5 = o1;
+
+ // // a = a + m[sigma[r][2*i+0]]
+ // // skip since adding 0u does nothing
+ // o0 = v4 + 0u;
+ // o1 = v5 + 0u;
+ // if (v4 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v4 = o0;
+ // v5 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v26 ^ v4;
+ xor1 = v27 ^ v5;
+ v26 = xor1;
+ v27 = xor0;
+
+ // c = c + d
+ o0 = v16 + v26;
+ o1 = v17 + v27;
+ o1 = o1 + select(0u, 1u, o0 < v16);
+ v16 = o0;
+ v17 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v14 ^ v16;
+ xor1 = v15 ^ v17;
+ v14 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v15 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v4 + v14;
+ o1 = v5 + v15;
+ o1 = o1 + select(0u, 1u, o0 < v4);
+ v4 = o0;
+ v5 = o1;
+
+ // // a = a + m[sigma[r][2*i+1]]
+ // // skip since adding 0u does nothing
+ // o0 = v4 + 0u;
+ // o1 = v5 + 0u;
+ // if (v4 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v4 = o0;
+ // v5 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v26 ^ v4;
+ xor1 = v27 ^ v5;
+ v26 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v27 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v16 + v26;
+ o1 = v17 + v27;
+ o1 = o1 + select(0u, 1u, o0 < v16);
+ v16 = o0;
+ v17 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v14 ^ v16;
+ xor1 = v15 ^ v17;
+ v14 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v15 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=1, i=7(x2), a=v[6-7], b=v[8-9], c=v[18-19], d=v[28-29]
+ */
+
+ // a = a + b
+ o0 = v6 + v8;
+ o1 = v7 + v9;
+ o1 = o1 + select(0u, 1u, o0 < v6);
+ v6 = o0;
+ v7 = o1;
+
+ // // a = a + m[sigma[r][2*i+0]]
+ // // skip since adding 0u does nothing
+ // o0 = v6 + 0u;
+ // o1 = v7 + 0u;
+ // if (v6 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v6 = o0;
+ // v7 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v28 ^ v6;
+ xor1 = v29 ^ v7;
+ v28 = xor1;
+ v29 = xor0;
+
+ // c = c + d
+ o0 = v18 + v28;
+ o1 = v19 + v29;
+ o1 = o1 + select(0u, 1u, o0 < v18);
+ v18 = o0;
+ v19 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v8 ^ v18;
+ xor1 = v9 ^ v19;
+ v8 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v9 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v6 + v8;
+ o1 = v7 + v9;
+ o1 = o1 + select(0u, 1u, o0 < v6);
+ v6 = o0;
+ v7 = o1;
+
+ // a = a + m[sigma[r][2*i+1]]
+ o0 = v6 + m6;
+ o1 = v7 + m7;
+ o1 = o1 + select(0u, 1u, o0 < v6);
+ v6 = o0;
+ v7 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v28 ^ v6;
+ xor1 = v29 ^ v7;
+ v28 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v29 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v18 + v28;
+ o1 = v19 + v29;
+ o1 = o1 + select(0u, 1u, o0 < v18);
+ v18 = o0;
+ v19 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v8 ^ v18;
+ xor1 = v9 ^ v19;
+ v8 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v9 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /****************************************************************************
+ * ROUND(2) *
+ ****************************************************************************/
+
+ /**
+ * r=2, i=0(x2), a=v[0-1], b=v[8-9], c=v[16-17], d=v[24-25]
+ */
+
+ // a = a + b
+ o0 = v0 + v8;
+ o1 = v1 + v9;
+ o1 = o1 + select(0u, 1u, o0 < v0);
+ v0 = o0;
+ v1 = o1;
+
+ // // a = a + m[sigma[r][2*i+0]]
+ // // skip since adding 0u does nothing
+ // o0 = v0 + 0u;
+ // o1 = v1 + 0u;
+ // if (v0 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v0 = o0;
+ // v1 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v24 ^ v0;
+ xor1 = v25 ^ v1;
+ v24 = xor1;
+ v25 = xor0;
+
+ // c = c + d
+ o0 = v16 + v24;
+ o1 = v17 + v25;
+ o1 = o1 + select(0u, 1u, o0 < v16);
+ v16 = o0;
+ v17 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v8 ^ v16;
+ xor1 = v9 ^ v17;
+ v8 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v9 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v0 + v8;
+ o1 = v1 + v9;
+ o1 = o1 + select(0u, 1u, o0 < v0);
+ v0 = o0;
+ v1 = o1;
+
+ // // a = a + m[sigma[r][2*i+1]]
+ // // skip since adding 0u does nothing
+ // o0 = v0 + 0u;
+ // o1 = v1 + 0u;
+ // if (v0 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v0 = o0;
+ // v1 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v24 ^ v0;
+ xor1 = v25 ^ v1;
+ v24 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v25 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v16 + v24;
+ o1 = v17 + v25;
+ o1 = o1 + select(0u, 1u, o0 < v16);
+ v16 = o0;
+ v17 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v8 ^ v16;
+ xor1 = v9 ^ v17;
+ v8 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v9 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=2, i=1(x2), a=v[2-3], b=v[10-11], c=v[18-19], d=v[26-27]
+ */
+
+ // a = a + b
+ o0 = v2 + v10;
+ o1 = v3 + v11;
+ o1 = o1 + select(0u, 1u, o0 < v2);
+ v2 = o0;
+ v3 = o1;
+
+ // // a = a + m[sigma[r][2*i+0]]
+ // // skip since adding 0u does nothing
+ // o0 = v2 + 0u;
+ // o1 = v3 + 0u;
+ // if (v2 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v2 = o0;
+ // v3 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v26 ^ v2;
+ xor1 = v27 ^ v3;
+ v26 = xor1;
+ v27 = xor0;
+
+ // c = c + d
+ o0 = v18 + v26;
+ o1 = v19 + v27;
+ o1 = o1 + select(0u, 1u, o0 < v18);
+ v18 = o0;
+ v19 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v10 ^ v18;
+ xor1 = v11 ^ v19;
+ v10 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v11 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v2 + v10;
+ o1 = v3 + v11;
+ o1 = o1 + select(0u, 1u, o0 < v2);
+ v2 = o0;
+ v3 = o1;
+
+ // a = a + m[sigma[r][2*i+1]]
+ o0 = v2 + m0;
+ o1 = v3 + m1;
+ o1 = o1 + select(0u, 1u, o0 < v2);
+ v2 = o0;
+ v3 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v26 ^ v2;
+ xor1 = v27 ^ v3;
+ v26 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v27 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v18 + v26;
+ o1 = v19 + v27;
+ o1 = o1 + select(0u, 1u, o0 < v18);
+ v18 = o0;
+ v19 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v10 ^ v18;
+ xor1 = v11 ^ v19;
+ v10 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v11 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=2, i=2(x2), a=v[4-5], b=v[12-13], c=v[20-21], d=v[28-29]
+ */
+
+ // a = a + b
+ o0 = v4 + v12;
+ o1 = v5 + v13;
+ o1 = o1 + select(0u, 1u, o0 < v4);
+ v4 = o0;
+ v5 = o1;
+
+ // // a = a + m[sigma[r][2*i+0]]
+ // // skip since adding 0u does nothing
+ // o0 = v4 + 0u;
+ // o1 = v5 + 0u;
+ // if (v4 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v4 = o0;
+ // v5 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v28 ^ v4;
+ xor1 = v29 ^ v5;
+ v28 = xor1;
+ v29 = xor0;
+
+ // c = c + d
+ o0 = v20 + v28;
+ o1 = v21 + v29;
+ o1 = o1 + select(0u, 1u, o0 < v20);
+ v20 = o0;
+ v21 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v12 ^ v20;
+ xor1 = v13 ^ v21;
+ v12 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v13 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v4 + v12;
+ o1 = v5 + v13;
+ o1 = o1 + select(0u, 1u, o0 < v4);
+ v4 = o0;
+ v5 = o1;
+
+ // a = a + m[sigma[r][2*i+1]]
+ o0 = v4 + m4;
+ o1 = v5 + m5;
+ o1 = o1 + select(0u, 1u, o0 < v4);
+ v4 = o0;
+ v5 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v28 ^ v4;
+ xor1 = v29 ^ v5;
+ v28 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v29 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v20 + v28;
+ o1 = v21 + v29;
+ o1 = o1 + select(0u, 1u, o0 < v20);
+ v20 = o0;
+ v21 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v12 ^ v20;
+ xor1 = v13 ^ v21;
+ v12 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v13 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=2, i=3(x2), a=v[6-7], b=v[14-15], c=v[22-23], d=v[30-31]
+ */
+
+ // a = a + b
+ o0 = v6 + v14;
+ o1 = v7 + v15;
+ o1 = o1 + select(0u, 1u, o0 < v6);
+ v6 = o0;
+ v7 = o1;
+
+ // // a = a + m[sigma[r][2*i+0]]
+ // // skip since adding 0u does nothing
+ // o0 = v6 + 0u;
+ // o1 = v7 + 0u;
+ // if (v6 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v6 = o0;
+ // v7 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v30 ^ v6;
+ xor1 = v31 ^ v7;
+ v30 = xor1;
+ v31 = xor0;
+
+ // c = c + d
+ o0 = v22 + v30;
+ o1 = v23 + v31;
+ o1 = o1 + select(0u, 1u, o0 < v22);
+ v22 = o0;
+ v23 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v14 ^ v22;
+ xor1 = v15 ^ v23;
+ v14 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v15 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v6 + v14;
+ o1 = v7 + v15;
+ o1 = o1 + select(0u, 1u, o0 < v6);
+ v6 = o0;
+ v7 = o1;
+
+ // // a = a + m[sigma[r][2*i+1]]
+ // // skip since adding 0u does nothing
+ // o0 = v6 + 0u;
+ // o1 = v7 + 0u;
+ // if (v6 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v6 = o0;
+ // v7 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v30 ^ v6;
+ xor1 = v31 ^ v7;
+ v30 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v31 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v22 + v30;
+ o1 = v23 + v31;
+ o1 = o1 + select(0u, 1u, o0 < v22);
+ v22 = o0;
+ v23 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v14 ^ v22;
+ xor1 = v15 ^ v23;
+ v14 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v15 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=2, i=4(x2), a=v[0-1], b=v[10-11], c=v[20-21], d=v[30-31]
+ */
+
+ // a = a + b
+ o0 = v0 + v10;
+ o1 = v1 + v11;
+ o1 = o1 + select(0u, 1u, o0 < v0);
+ v0 = o0;
+ v1 = o1;
+
+ // // a = a + m[sigma[r][2*i+0]]
+ // // skip since adding 0u does nothing
+ // o0 = v0 + 0u;
+ // o1 = v1 + 0u;
+ // if (v0 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v0 = o0;
+ // v1 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v30 ^ v0;
+ xor1 = v31 ^ v1;
+ v30 = xor1;
+ v31 = xor0;
+
+ // c = c + d
+ o0 = v20 + v30;
+ o1 = v21 + v31;
+ o1 = o1 + select(0u, 1u, o0 < v20);
+ v20 = o0;
+ v21 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v10 ^ v20;
+ xor1 = v11 ^ v21;
+ v10 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v11 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v0 + v10;
+ o1 = v1 + v11;
+ o1 = o1 + select(0u, 1u, o0 < v0);
+ v0 = o0;
+ v1 = o1;
+
+ // // a = a + m[sigma[r][2*i+1]]
+ // // skip since adding 0u does nothing
+ // o0 = v0 + 0u;
+ // o1 = v1 + 0u;
+ // if (v0 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v0 = o0;
+ // v1 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v30 ^ v0;
+ xor1 = v31 ^ v1;
+ v30 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v31 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v20 + v30;
+ o1 = v21 + v31;
+ o1 = o1 + select(0u, 1u, o0 < v20);
+ v20 = o0;
+ v21 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v10 ^ v20;
+ xor1 = v11 ^ v21;
+ v10 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v11 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=2, i=5(x2), a=v[2-3], b=v[12-13], c=v[22-23], d=v[24-25]
+ */
+
+ // a = a + b
+ o0 = v2 + v12;
+ o1 = v3 + v13;
+ o1 = o1 + select(0u, 1u, o0 < v2);
+ v2 = o0;
+ v3 = o1;
+
+ // a = a + m[sigma[r][2*i+0]]
+ o0 = v2 + m6;
+ o1 = v3 + m7;
+ o1 = o1 + select(0u, 1u, o0 < v2);
+ v2 = o0;
+ v3 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v24 ^ v2;
+ xor1 = v25 ^ v3;
+ v24 = xor1;
+ v25 = xor0;
+
+ // c = c + d
+ o0 = v22 + v24;
+ o1 = v23 + v25;
+ o1 = o1 + select(0u, 1u, o0 < v22);
+ v22 = o0;
+ v23 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v12 ^ v22;
+ xor1 = v13 ^ v23;
+ v12 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v13 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v2 + v12;
+ o1 = v3 + v13;
+ o1 = o1 + select(0u, 1u, o0 < v2);
+ v2 = o0;
+ v3 = o1;
+
+ // // a = a + m[sigma[r][2*i+1]]
+ // // skip since adding 0u does nothing
+ // o0 = v2 + 0u;
+ // o1 = v3 + 0u;
+ // if (v2 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v2 = o0;
+ // v3 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v24 ^ v2;
+ xor1 = v25 ^ v3;
+ v24 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v25 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v22 + v24;
+ o1 = v23 + v25;
+ o1 = o1 + select(0u, 1u, o0 < v22);
+ v22 = o0;
+ v23 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v12 ^ v22;
+ xor1 = v13 ^ v23;
+ v12 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v13 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=2, i=6(x2), a=v[4-5], b=v[14-15], c=v[16-17], d=v[26-27]
+ */
+
+ // a = a + b
+ o0 = v4 + v14;
+ o1 = v5 + v15;
+ o1 = o1 + select(0u, 1u, o0 < v4);
+ v4 = o0;
+ v5 = o1;
+
+ // // a = a + m[sigma[r][2*i+0]]
+ // // skip since adding 0u does nothing
+ // o0 = v4 + 0u;
+ // o1 = v5 + 0u;
+ // if (v4 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v4 = o0;
+ // v5 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v26 ^ v4;
+ xor1 = v27 ^ v5;
+ v26 = xor1;
+ v27 = xor0;
+
+ // c = c + d
+ o0 = v16 + v26;
+ o1 = v17 + v27;
+ o1 = o1 + select(0u, 1u, o0 < v16);
+ v16 = o0;
+ v17 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v14 ^ v16;
+ xor1 = v15 ^ v17;
+ v14 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v15 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v4 + v14;
+ o1 = v5 + v15;
+ o1 = o1 + select(0u, 1u, o0 < v4);
+ v4 = o0;
+ v5 = o1;
+
+ // a = a + m[sigma[r][2*i+1]]
+ o0 = v4 + m2;
+ o1 = v5 + m3;
+ o1 = o1 + select(0u, 1u, o0 < v4);
+ v4 = o0;
+ v5 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v26 ^ v4;
+ xor1 = v27 ^ v5;
+ v26 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v27 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v16 + v26;
+ o1 = v17 + v27;
+ o1 = o1 + select(0u, 1u, o0 < v16);
+ v16 = o0;
+ v17 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v14 ^ v16;
+ xor1 = v15 ^ v17;
+ v14 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v15 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=2, i=7(x2), a=v[6-7], b=v[8-9], c=v[18-19], d=v[28-29]
+ */
+
+ // a = a + b
+ o0 = v6 + v8;
+ o1 = v7 + v9;
+ o1 = o1 + select(0u, 1u, o0 < v6);
+ v6 = o0;
+ v7 = o1;
+
+ // // a = a + m[sigma[r][2*i+0]]
+ // // skip since adding 0u does nothing
+ // o0 = v6 + 0u;
+ // o1 = v7 + 0u;
+ // if (v6 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v6 = o0;
+ // v7 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v28 ^ v6;
+ xor1 = v29 ^ v7;
+ v28 = xor1;
+ v29 = xor0;
+
+ // c = c + d
+ o0 = v18 + v28;
+ o1 = v19 + v29;
+ o1 = o1 + select(0u, 1u, o0 < v18);
+ v18 = o0;
+ v19 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v8 ^ v18;
+ xor1 = v9 ^ v19;
+ v8 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v9 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v6 + v8;
+ o1 = v7 + v9;
+ o1 = o1 + select(0u, 1u, o0 < v6);
+ v6 = o0;
+ v7 = o1;
+
+ // a = a + m[sigma[r][2*i+1]]
+ o0 = v6 + m8;
+ o1 = v7 + m9;
+ o1 = o1 + select(0u, 1u, o0 < v6);
+ v6 = o0;
+ v7 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v28 ^ v6;
+ xor1 = v29 ^ v7;
+ v28 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v29 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v18 + v28;
+ o1 = v19 + v29;
+ o1 = o1 + select(0u, 1u, o0 < v18);
+ v18 = o0;
+ v19 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v8 ^ v18;
+ xor1 = v9 ^ v19;
+ v8 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v9 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /****************************************************************************
+ * ROUND(3) *
+ ****************************************************************************/
+
+ /**
+ * r=3, i=0(x2), a=v[0-1], b=v[8-9], c=v[16-17], d=v[24-25]
+ */
+
+ // a = a + b
+ o0 = v0 + v8;
+ o1 = v1 + v9;
+ o1 = o1 + select(0u, 1u, o0 < v0);
+ v0 = o0;
+ v1 = o1;
+
+ // // a = a + m[sigma[r][2*i+0]]
+ // // skip since adding 0u does nothing
+ // o0 = v0 + 0u;
+ // o1 = v1 + 0u;
+ // if (v0 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v0 = o0;
+ // v1 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v24 ^ v0;
+ xor1 = v25 ^ v1;
+ v24 = xor1;
+ v25 = xor0;
+
+ // c = c + d
+ o0 = v16 + v24;
+ o1 = v17 + v25;
+ o1 = o1 + select(0u, 1u, o0 < v16);
+ v16 = o0;
+ v17 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v8 ^ v16;
+ xor1 = v9 ^ v17;
+ v8 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v9 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v0 + v8;
+ o1 = v1 + v9;
+ o1 = o1 + select(0u, 1u, o0 < v0);
+ v0 = o0;
+ v1 = o1;
+
+ // // a = a + m[sigma[r][2*i+1]]
+ // // skip since adding 0u does nothing
+ // o0 = v0 + 0u;
+ // o1 = v1 + 0u;
+ // if (v0 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v0 = o0;
+ // v1 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v24 ^ v0;
+ xor1 = v25 ^ v1;
+ v24 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v25 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v16 + v24;
+ o1 = v17 + v25;
+ o1 = o1 + select(0u, 1u, o0 < v16);
+ v16 = o0;
+ v17 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v8 ^ v16;
+ xor1 = v9 ^ v17;
+ v8 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v9 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=3, i=1(x2), a=v[2-3], b=v[10-11], c=v[18-19], d=v[26-27]
+ */
+
+ // a = a + b
+ o0 = v2 + v10;
+ o1 = v3 + v11;
+ o1 = o1 + select(0u, 1u, o0 < v2);
+ v2 = o0;
+ v3 = o1;
+
+ // a = a + m[sigma[r][2*i+0]]
+ o0 = v2 + m6;
+ o1 = v3 + m7;
+ o1 = o1 + select(0u, 1u, o0 < v2);
+ v2 = o0;
+ v3 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v26 ^ v2;
+ xor1 = v27 ^ v3;
+ v26 = xor1;
+ v27 = xor0;
+
+ // c = c + d
+ o0 = v18 + v26;
+ o1 = v19 + v27;
+ o1 = o1 + select(0u, 1u, o0 < v18);
+ v18 = o0;
+ v19 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v10 ^ v18;
+ xor1 = v11 ^ v19;
+ v10 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v11 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v2 + v10;
+ o1 = v3 + v11;
+ o1 = o1 + select(0u, 1u, o0 < v2);
+ v2 = o0;
+ v3 = o1;
+
+ // a = a + m[sigma[r][2*i+1]]
+ o0 = v2 + m2;
+ o1 = v3 + m3;
+ o1 = o1 + select(0u, 1u, o0 < v2);
+ v2 = o0;
+ v3 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v26 ^ v2;
+ xor1 = v27 ^ v3;
+ v26 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v27 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v18 + v26;
+ o1 = v19 + v27;
+ o1 = o1 + select(0u, 1u, o0 < v18);
+ v18 = o0;
+ v19 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v10 ^ v18;
+ xor1 = v11 ^ v19;
+ v10 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v11 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=3, i=2(x2), a=v[4-5], b=v[12-13], c=v[20-21], d=v[28-29]
+ */
+
+ // a = a + b
+ o0 = v4 + v12;
+ o1 = v5 + v13;
+ o1 = o1 + select(0u, 1u, o0 < v4);
+ v4 = o0;
+ v5 = o1;
+
+ // // a = a + m[sigma[r][2*i+0]]
+ // // skip since adding 0u does nothing
+ // o0 = v4 + 0u;
+ // o1 = v5 + 0u;
+ // if (v4 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v4 = o0;
+ // v5 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v28 ^ v4;
+ xor1 = v29 ^ v5;
+ v28 = xor1;
+ v29 = xor0;
+
+ // c = c + d
+ o0 = v20 + v28;
+ o1 = v21 + v29;
+ o1 = o1 + select(0u, 1u, o0 < v20);
+ v20 = o0;
+ v21 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v12 ^ v20;
+ xor1 = v13 ^ v21;
+ v12 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v13 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v4 + v12;
+ o1 = v5 + v13;
+ o1 = o1 + select(0u, 1u, o0 < v4);
+ v4 = o0;
+ v5 = o1;
+
+ // // a = a + m[sigma[r][2*i+1]]
+ // // skip since adding 0u does nothing
+ // o0 = v4 + 0u;
+ // o1 = v5 + 0u;
+ // if (v4 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v4 = o0;
+ // v5 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v28 ^ v4;
+ xor1 = v29 ^ v5;
+ v28 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v29 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v20 + v28;
+ o1 = v21 + v29;
+ o1 = o1 + select(0u, 1u, o0 < v20);
+ v20 = o0;
+ v21 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v12 ^ v20;
+ xor1 = v13 ^ v21;
+ v12 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v13 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=3, i=3(x2), a=v[6-7], b=v[14-15], c=v[22-23], d=v[30-31]
+ */
+
+ // a = a + b
+ o0 = v6 + v14;
+ o1 = v7 + v15;
+ o1 = o1 + select(0u, 1u, o0 < v6);
+ v6 = o0;
+ v7 = o1;
+
+ // // a = a + m[sigma[r][2*i+0]]
+ // // skip since adding 0u does nothing
+ // o0 = v6 + 0u;
+ // o1 = v7 + 0u;
+ // if (v6 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v6 = o0;
+ // v7 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v30 ^ v6;
+ xor1 = v31 ^ v7;
+ v30 = xor1;
+ v31 = xor0;
+
+ // c = c + d
+ o0 = v22 + v30;
+ o1 = v23 + v31;
+ o1 = o1 + select(0u, 1u, o0 < v22);
+ v22 = o0;
+ v23 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v14 ^ v22;
+ xor1 = v15 ^ v23;
+ v14 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v15 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v6 + v14;
+ o1 = v7 + v15;
+ o1 = o1 + select(0u, 1u, o0 < v6);
+ v6 = o0;
+ v7 = o1;
+
+ // // a = a + m[sigma[r][2*i+1]]
+ // // skip since adding 0u does nothing
+ // o0 = v6 + 0u;
+ // o1 = v7 + 0u;
+ // if (v6 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v6 = o0;
+ // v7 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v30 ^ v6;
+ xor1 = v31 ^ v7;
+ v30 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v31 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v22 + v30;
+ o1 = v23 + v31;
+ o1 = o1 + select(0u, 1u, o0 < v22);
+ v22 = o0;
+ v23 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v14 ^ v22;
+ xor1 = v15 ^ v23;
+ v14 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v15 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=3, i=4(x2), a=v[0-1], b=v[10-11], c=v[20-21], d=v[30-31]
+ */
+
+ // a = a + b
+ o0 = v0 + v10;
+ o1 = v1 + v11;
+ o1 = o1 + select(0u, 1u, o0 < v0);
+ v0 = o0;
+ v1 = o1;
+
+ // a = a + m[sigma[r][2*i+0]]
+ o0 = v0 + m4;
+ o1 = v1 + m5;
+ o1 = o1 + select(0u, 1u, o0 < v0);
+ v0 = o0;
+ v1 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v30 ^ v0;
+ xor1 = v31 ^ v1;
+ v30 = xor1;
+ v31 = xor0;
+
+ // c = c + d
+ o0 = v20 + v30;
+ o1 = v21 + v31;
+ o1 = o1 + select(0u, 1u, o0 < v20);
+ v20 = o0;
+ v21 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v10 ^ v20;
+ xor1 = v11 ^ v21;
+ v10 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v11 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v0 + v10;
+ o1 = v1 + v11;
+ o1 = o1 + select(0u, 1u, o0 < v0);
+ v0 = o0;
+ v1 = o1;
+
+ // // a = a + m[sigma[r][2*i+1]]
+ // // skip since adding 0u does nothing
+ // o0 = v0 + 0u;
+ // o1 = v1 + 0u;
+ // if (v0 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v0 = o0;
+ // v1 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v30 ^ v0;
+ xor1 = v31 ^ v1;
+ v30 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v31 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v20 + v30;
+ o1 = v21 + v31;
+ o1 = o1 + select(0u, 1u, o0 < v20);
+ v20 = o0;
+ v21 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v10 ^ v20;
+ xor1 = v11 ^ v21;
+ v10 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v11 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=3, i=5(x2), a=v[2-3], b=v[12-13], c=v[22-23], d=v[24-25]
+ */
+
+ // a = a + b
+ o0 = v2 + v12;
+ o1 = v3 + v13;
+ o1 = o1 + select(0u, 1u, o0 < v2);
+ v2 = o0;
+ v3 = o1;
+
+ // // a = a + m[sigma[r][2*i+0]]
+ // // skip since adding 0u does nothing
+ // o0 = v2 + 0u;
+ // o1 = v3 + 0u;
+ // if (v2 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v2 = o0;
+ // v3 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v24 ^ v2;
+ xor1 = v25 ^ v3;
+ v24 = xor1;
+ v25 = xor0;
+
+ // c = c + d
+ o0 = v22 + v24;
+ o1 = v23 + v25;
+ o1 = o1 + select(0u, 1u, o0 < v22);
+ v22 = o0;
+ v23 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v12 ^ v22;
+ xor1 = v13 ^ v23;
+ v12 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v13 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v2 + v12;
+ o1 = v3 + v13;
+ o1 = o1 + select(0u, 1u, o0 < v2);
+ v2 = o0;
+ v3 = o1;
+
+ // // a = a + m[sigma[r][2*i+1]]
+ // // skip since adding 0u does nothing
+ // o0 = v2 + 0u;
+ // o1 = v3 + 0u;
+ // if (v2 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v2 = o0;
+ // v3 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v24 ^ v2;
+ xor1 = v25 ^ v3;
+ v24 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v25 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v22 + v24;
+ o1 = v23 + v25;
+ o1 = o1 + select(0u, 1u, o0 < v22);
+ v22 = o0;
+ v23 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v12 ^ v22;
+ xor1 = v13 ^ v23;
+ v12 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v13 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=3, i=6(x2), a=v[4-5], b=v[14-15], c=v[16-17], d=v[26-27]
+ */
+
+ // a = a + b
+ o0 = v4 + v14;
+ o1 = v5 + v15;
+ o1 = o1 + select(0u, 1u, o0 < v4);
+ v4 = o0;
+ v5 = o1;
+
+ // a = a + m[sigma[r][2*i+0]]
+ o0 = v4 + m8;
+ o1 = v5 + m9;
+ o1 = o1 + select(0u, 1u, o0 < v4);
+ v4 = o0;
+ v5 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v26 ^ v4;
+ xor1 = v27 ^ v5;
+ v26 = xor1;
+ v27 = xor0;
+
+ // c = c + d
+ o0 = v16 + v26;
+ o1 = v17 + v27;
+ o1 = o1 + select(0u, 1u, o0 < v16);
+ v16 = o0;
+ v17 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v14 ^ v16;
+ xor1 = v15 ^ v17;
+ v14 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v15 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v4 + v14;
+ o1 = v5 + v15;
+ o1 = o1 + select(0u, 1u, o0 < v4);
+ v4 = o0;
+ v5 = o1;
+
+ // a = a + m[sigma[r][2*i+1]]
+ o0 = v4 + m0;
+ o1 = v5 + m1;
+ o1 = o1 + select(0u, 1u, o0 < v4);
+ v4 = o0;
+ v5 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v26 ^ v4;
+ xor1 = v27 ^ v5;
+ v26 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v27 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v16 + v26;
+ o1 = v17 + v27;
+ o1 = o1 + select(0u, 1u, o0 < v16);
+ v16 = o0;
+ v17 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v14 ^ v16;
+ xor1 = v15 ^ v17;
+ v14 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v15 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=3, i=7(x2), a=v[6-7], b=v[8-9], c=v[18-19], d=v[28-29]
+ */
+
+ // a = a + b
+ o0 = v6 + v8;
+ o1 = v7 + v9;
+ o1 = o1 + select(0u, 1u, o0 < v6);
+ v6 = o0;
+ v7 = o1;
+
+ // // a = a + m[sigma[r][2*i+0]]
+ // // skip since adding 0u does nothing
+ // o0 = v6 + 0u;
+ // o1 = v7 + 0u;
+ // if (v6 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v6 = o0;
+ // v7 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v28 ^ v6;
+ xor1 = v29 ^ v7;
+ v28 = xor1;
+ v29 = xor0;
+
+ // c = c + d
+ o0 = v18 + v28;
+ o1 = v19 + v29;
+ o1 = o1 + select(0u, 1u, o0 < v18);
+ v18 = o0;
+ v19 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v8 ^ v18;
+ xor1 = v9 ^ v19;
+ v8 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v9 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v6 + v8;
+ o1 = v7 + v9;
+ o1 = o1 + select(0u, 1u, o0 < v6);
+ v6 = o0;
+ v7 = o1;
+
+ // // a = a + m[sigma[r][2*i+1]]
+ // // skip since adding 0u does nothing
+ // o0 = v6 + 0u;
+ // o1 = v7 + 0u;
+ // if (v6 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v6 = o0;
+ // v7 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v28 ^ v6;
+ xor1 = v29 ^ v7;
+ v28 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v29 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v18 + v28;
+ o1 = v19 + v29;
+ o1 = o1 + select(0u, 1u, o0 < v18);
+ v18 = o0;
+ v19 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v8 ^ v18;
+ xor1 = v9 ^ v19;
+ v8 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v9 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /****************************************************************************
+ * ROUND(4) *
+ ****************************************************************************/
+
+ /**
+ * r=4, i=0(x2), a=v[0-1], b=v[8-9], c=v[16-17], d=v[24-25]
+ */
+
+ // a = a + b
+ o0 = v0 + v8;
+ o1 = v1 + v9;
+ o1 = o1 + select(0u, 1u, o0 < v0);
+ v0 = o0;
+ v1 = o1;
+
+ // // a = a + m[sigma[r][2*i+0]]
+ // // skip since adding 0u does nothing
+ // o0 = v0 + 0u;
+ // o1 = v1 + 0u;
+ // if (v0 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v0 = o0;
+ // v1 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v24 ^ v0;
+ xor1 = v25 ^ v1;
+ v24 = xor1;
+ v25 = xor0;
+
+ // c = c + d
+ o0 = v16 + v24;
+ o1 = v17 + v25;
+ o1 = o1 + select(0u, 1u, o0 < v16);
+ v16 = o0;
+ v17 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v8 ^ v16;
+ xor1 = v9 ^ v17;
+ v8 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v9 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v0 + v8;
+ o1 = v1 + v9;
+ o1 = o1 + select(0u, 1u, o0 < v0);
+ v0 = o0;
+ v1 = o1;
+
+ // a = a + m[sigma[r][2*i+1]]
+ o0 = v0 + m0;
+ o1 = v1 + m1;
+ o1 = o1 + select(0u, 1u, o0 < v0);
+ v0 = o0;
+ v1 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v24 ^ v0;
+ xor1 = v25 ^ v1;
+ v24 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v25 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v16 + v24;
+ o1 = v17 + v25;
+ o1 = o1 + select(0u, 1u, o0 < v16);
+ v16 = o0;
+ v17 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v8 ^ v16;
+ xor1 = v9 ^ v17;
+ v8 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v9 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=4, i=1(x2), a=v[2-3], b=v[10-11], c=v[18-19], d=v[26-27]
+ */
+
+ // a = a + b
+ o0 = v2 + v10;
+ o1 = v3 + v11;
+ o1 = o1 + select(0u, 1u, o0 < v2);
+ v2 = o0;
+ v3 = o1;
+
+ // // a = a + m[sigma[r][2*i+0]]
+ // // skip since adding 0u does nothing
+ // o0 = v2 + 0u;
+ // o1 = v3 + 0u;
+ // if (v2 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v2 = o0;
+ // v3 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v26 ^ v2;
+ xor1 = v27 ^ v3;
+ v26 = xor1;
+ v27 = xor0;
+
+ // c = c + d
+ o0 = v18 + v26;
+ o1 = v19 + v27;
+ o1 = o1 + select(0u, 1u, o0 < v18);
+ v18 = o0;
+ v19 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v10 ^ v18;
+ xor1 = v11 ^ v19;
+ v10 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v11 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v2 + v10;
+ o1 = v3 + v11;
+ o1 = o1 + select(0u, 1u, o0 < v2);
+ v2 = o0;
+ v3 = o1;
+
+ // // a = a + m[sigma[r][2*i+1]]
+ // // skip since adding 0u does nothing
+ // o0 = v2 + 0u;
+ // o1 = v3 + 0u;
+ // if (v2 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v2 = o0;
+ // v3 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v26 ^ v2;
+ xor1 = v27 ^ v3;
+ v26 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v27 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v18 + v26;
+ o1 = v19 + v27;
+ o1 = o1 + select(0u, 1u, o0 < v18);
+ v18 = o0;
+ v19 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v10 ^ v18;
+ xor1 = v11 ^ v19;
+ v10 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v11 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=4, i=2(x2), a=v[4-5], b=v[12-13], c=v[20-21], d=v[28-29]
+ */
+
+ // a = a + b
+ o0 = v4 + v12;
+ o1 = v5 + v13;
+ o1 = o1 + select(0u, 1u, o0 < v4);
+ v4 = o0;
+ v5 = o1;
+
+ // a = a + m[sigma[r][2*i+0]]
+ o0 = v4 + m4;
+ o1 = v5 + m5;
+ o1 = o1 + select(0u, 1u, o0 < v4);
+ v4 = o0;
+ v5 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v28 ^ v4;
+ xor1 = v29 ^ v5;
+ v28 = xor1;
+ v29 = xor0;
+
+ // c = c + d
+ o0 = v20 + v28;
+ o1 = v21 + v29;
+ o1 = o1 + select(0u, 1u, o0 < v20);
+ v20 = o0;
+ v21 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v12 ^ v20;
+ xor1 = v13 ^ v21;
+ v12 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v13 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v4 + v12;
+ o1 = v5 + v13;
+ o1 = o1 + select(0u, 1u, o0 < v4);
+ v4 = o0;
+ v5 = o1;
+
+ // a = a + m[sigma[r][2*i+1]]
+ o0 = v4 + m8;
+ o1 = v5 + m9;
+ o1 = o1 + select(0u, 1u, o0 < v4);
+ v4 = o0;
+ v5 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v28 ^ v4;
+ xor1 = v29 ^ v5;
+ v28 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v29 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v20 + v28;
+ o1 = v21 + v29;
+ o1 = o1 + select(0u, 1u, o0 < v20);
+ v20 = o0;
+ v21 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v12 ^ v20;
+ xor1 = v13 ^ v21;
+ v12 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v13 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=4, i=3(x2), a=v[6-7], b=v[14-15], c=v[22-23], d=v[30-31]
+ */
+
+ // a = a + b
+ o0 = v6 + v14;
+ o1 = v7 + v15;
+ o1 = o1 + select(0u, 1u, o0 < v6);
+ v6 = o0;
+ v7 = o1;
+
+ // // a = a + m[sigma[r][2*i+0]]
+ // // skip since adding 0u does nothing
+ // o0 = v6 + 0u;
+ // o1 = v7 + 0u;
+ // if (v6 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v6 = o0;
+ // v7 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v30 ^ v6;
+ xor1 = v31 ^ v7;
+ v30 = xor1;
+ v31 = xor0;
+
+ // c = c + d
+ o0 = v22 + v30;
+ o1 = v23 + v31;
+ o1 = o1 + select(0u, 1u, o0 < v22);
+ v22 = o0;
+ v23 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v14 ^ v22;
+ xor1 = v15 ^ v23;
+ v14 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v15 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v6 + v14;
+ o1 = v7 + v15;
+ o1 = o1 + select(0u, 1u, o0 < v6);
+ v6 = o0;
+ v7 = o1;
+
+ // // a = a + m[sigma[r][2*i+1]]
+ // // skip since adding 0u does nothing
+ // o0 = v6 + 0u;
+ // o1 = v7 + 0u;
+ // if (v6 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v6 = o0;
+ // v7 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v30 ^ v6;
+ xor1 = v31 ^ v7;
+ v30 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v31 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v22 + v30;
+ o1 = v23 + v31;
+ o1 = o1 + select(0u, 1u, o0 < v22);
+ v22 = o0;
+ v23 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v14 ^ v22;
+ xor1 = v15 ^ v23;
+ v14 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v15 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=4, i=4(x2), a=v[0-1], b=v[10-11], c=v[20-21], d=v[30-31]
+ */
+
+ // a = a + b
+ o0 = v0 + v10;
+ o1 = v1 + v11;
+ o1 = o1 + select(0u, 1u, o0 < v0);
+ v0 = o0;
+ v1 = o1;
+
+ // // a = a + m[sigma[r][2*i+0]]
+ // // skip since adding 0u does nothing
+ // o0 = v0 + 0u;
+ // o1 = v1 + 0u;
+ // if (v0 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v0 = o0;
+ // v1 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v30 ^ v0;
+ xor1 = v31 ^ v1;
+ v30 = xor1;
+ v31 = xor0;
+
+ // c = c + d
+ o0 = v20 + v30;
+ o1 = v21 + v31;
+ o1 = o1 + select(0u, 1u, o0 < v20);
+ v20 = o0;
+ v21 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v10 ^ v20;
+ xor1 = v11 ^ v21;
+ v10 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v11 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v0 + v10;
+ o1 = v1 + v11;
+ o1 = o1 + select(0u, 1u, o0 < v0);
+ v0 = o0;
+ v1 = o1;
+
+ // a = a + m[sigma[r][2*i+1]]
+ o0 = v0 + m2;
+ o1 = v1 + m3;
+ o1 = o1 + select(0u, 1u, o0 < v0);
+ v0 = o0;
+ v1 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v30 ^ v0;
+ xor1 = v31 ^ v1;
+ v30 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v31 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v20 + v30;
+ o1 = v21 + v31;
+ o1 = o1 + select(0u, 1u, o0 < v20);
+ v20 = o0;
+ v21 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v10 ^ v20;
+ xor1 = v11 ^ v21;
+ v10 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v11 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=4, i=5(x2), a=v[2-3], b=v[12-13], c=v[22-23], d=v[24-25]
+ */
+
+ // a = a + b
+ o0 = v2 + v12;
+ o1 = v3 + v13;
+ o1 = o1 + select(0u, 1u, o0 < v2);
+ v2 = o0;
+ v3 = o1;
+
+ // // a = a + m[sigma[r][2*i+0]]
+ // // skip since adding 0u does nothing
+ // o0 = v2 + 0u;
+ // o1 = v3 + 0u;
+ // if (v2 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v2 = o0;
+ // v3 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v24 ^ v2;
+ xor1 = v25 ^ v3;
+ v24 = xor1;
+ v25 = xor0;
+
+ // c = c + d
+ o0 = v22 + v24;
+ o1 = v23 + v25;
+ o1 = o1 + select(0u, 1u, o0 < v22);
+ v22 = o0;
+ v23 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v12 ^ v22;
+ xor1 = v13 ^ v23;
+ v12 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v13 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v2 + v12;
+ o1 = v3 + v13;
+ o1 = o1 + select(0u, 1u, o0 < v2);
+ v2 = o0;
+ v3 = o1;
+
+ // // a = a + m[sigma[r][2*i+1]]
+ // // skip since adding 0u does nothing
+ // o0 = v2 + 0u;
+ // o1 = v3 + 0u;
+ // if (v2 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v2 = o0;
+ // v3 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v24 ^ v2;
+ xor1 = v25 ^ v3;
+ v24 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v25 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v22 + v24;
+ o1 = v23 + v25;
+ o1 = o1 + select(0u, 1u, o0 < v22);
+ v22 = o0;
+ v23 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v12 ^ v22;
+ xor1 = v13 ^ v23;
+ v12 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v13 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=4, i=6(x2), a=v[4-5], b=v[14-15], c=v[16-17], d=v[26-27]
+ */
+
+ // a = a + b
+ o0 = v4 + v14;
+ o1 = v5 + v15;
+ o1 = o1 + select(0u, 1u, o0 < v4);
+ v4 = o0;
+ v5 = o1;
+
+ // // a = a + m[sigma[r][2*i+0]]
+ // // skip since adding 0u does nothing
+ // o0 = v4 + 0u;
+ // o1 = v5 + 0u;
+ // if (v4 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v4 = o0;
+ // v5 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v26 ^ v4;
+ xor1 = v27 ^ v5;
+ v26 = xor1;
+ v27 = xor0;
+
+ // c = c + d
+ o0 = v16 + v26;
+ o1 = v17 + v27;
+ o1 = o1 + select(0u, 1u, o0 < v16);
+ v16 = o0;
+ v17 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v14 ^ v16;
+ xor1 = v15 ^ v17;
+ v14 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v15 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v4 + v14;
+ o1 = v5 + v15;
+ o1 = o1 + select(0u, 1u, o0 < v4);
+ v4 = o0;
+ v5 = o1;
+
+ // // a = a + m[sigma[r][2*i+1]]
+ // // skip since adding 0u does nothing
+ // o0 = v4 + 0u;
+ // o1 = v5 + 0u;
+ // if (v4 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v4 = o0;
+ // v5 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v26 ^ v4;
+ xor1 = v27 ^ v5;
+ v26 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v27 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v16 + v26;
+ o1 = v17 + v27;
+ o1 = o1 + select(0u, 1u, o0 < v16);
+ v16 = o0;
+ v17 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v14 ^ v16;
+ xor1 = v15 ^ v17;
+ v14 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v15 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=4, i=7(x2), a=v[6-7], b=v[8-9], c=v[18-19], d=v[28-29]
+ */
+
+ // a = a + b
+ o0 = v6 + v8;
+ o1 = v7 + v9;
+ o1 = o1 + select(0u, 1u, o0 < v6);
+ v6 = o0;
+ v7 = o1;
+
+ // a = a + m[sigma[r][2*i+0]]
+ o0 = v6 + m6;
+ o1 = v7 + m7;
+ o1 = o1 + select(0u, 1u, o0 < v6);
+ v6 = o0;
+ v7 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v28 ^ v6;
+ xor1 = v29 ^ v7;
+ v28 = xor1;
+ v29 = xor0;
+
+ // c = c + d
+ o0 = v18 + v28;
+ o1 = v19 + v29;
+ o1 = o1 + select(0u, 1u, o0 < v18);
+ v18 = o0;
+ v19 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v8 ^ v18;
+ xor1 = v9 ^ v19;
+ v8 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v9 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v6 + v8;
+ o1 = v7 + v9;
+ o1 = o1 + select(0u, 1u, o0 < v6);
+ v6 = o0;
+ v7 = o1;
+
+ // // a = a + m[sigma[r][2*i+1]]
+ // // skip since adding 0u does nothing
+ // o0 = v6 + 0u;
+ // o1 = v7 + 0u;
+ // if (v6 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v6 = o0;
+ // v7 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v28 ^ v6;
+ xor1 = v29 ^ v7;
+ v28 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v29 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v18 + v28;
+ o1 = v19 + v29;
+ o1 = o1 + select(0u, 1u, o0 < v18);
+ v18 = o0;
+ v19 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v8 ^ v18;
+ xor1 = v9 ^ v19;
+ v8 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v9 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /****************************************************************************
+ * ROUND(5) *
+ ****************************************************************************/
+
+ /**
+ * r=5, i=0(x2), a=v[0-1], b=v[8-9], c=v[16-17], d=v[24-25]
+ */
+
+ // a = a + b
+ o0 = v0 + v8;
+ o1 = v1 + v9;
+ o1 = o1 + select(0u, 1u, o0 < v0);
+ v0 = o0;
+ v1 = o1;
+
+ // a = a + m[sigma[r][2*i+0]]
+ o0 = v0 + m4;
+ o1 = v1 + m5;
+ o1 = o1 + select(0u, 1u, o0 < v0);
+ v0 = o0;
+ v1 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v24 ^ v0;
+ xor1 = v25 ^ v1;
+ v24 = xor1;
+ v25 = xor0;
+
+ // c = c + d
+ o0 = v16 + v24;
+ o1 = v17 + v25;
+ o1 = o1 + select(0u, 1u, o0 < v16);
+ v16 = o0;
+ v17 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v8 ^ v16;
+ xor1 = v9 ^ v17;
+ v8 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v9 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v0 + v8;
+ o1 = v1 + v9;
+ o1 = o1 + select(0u, 1u, o0 < v0);
+ v0 = o0;
+ v1 = o1;
+
+ // // a = a + m[sigma[r][2*i+1]]
+ // // skip since adding 0u does nothing
+ // o0 = v0 + 0u;
+ // o1 = v1 + 0u;
+ // if (v0 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v0 = o0;
+ // v1 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v24 ^ v0;
+ xor1 = v25 ^ v1;
+ v24 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v25 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v16 + v24;
+ o1 = v17 + v25;
+ o1 = o1 + select(0u, 1u, o0 < v16);
+ v16 = o0;
+ v17 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v8 ^ v16;
+ xor1 = v9 ^ v17;
+ v8 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v9 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=5, i=1(x2), a=v[2-3], b=v[10-11], c=v[18-19], d=v[26-27]
+ */
+
+ // a = a + b
+ o0 = v2 + v10;
+ o1 = v3 + v11;
+ o1 = o1 + select(0u, 1u, o0 < v2);
+ v2 = o0;
+ v3 = o1;
+
+ // // a = a + m[sigma[r][2*i+0]]
+ // // skip since adding 0u does nothing
+ // o0 = v2 + 0u;
+ // o1 = v3 + 0u;
+ // if (v2 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v2 = o0;
+ // v3 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v26 ^ v2;
+ xor1 = v27 ^ v3;
+ v26 = xor1;
+ v27 = xor0;
+
+ // c = c + d
+ o0 = v18 + v26;
+ o1 = v19 + v27;
+ o1 = o1 + select(0u, 1u, o0 < v18);
+ v18 = o0;
+ v19 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v10 ^ v18;
+ xor1 = v11 ^ v19;
+ v10 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v11 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v2 + v10;
+ o1 = v3 + v11;
+ o1 = o1 + select(0u, 1u, o0 < v2);
+ v2 = o0;
+ v3 = o1;
+
+ // // a = a + m[sigma[r][2*i+1]]
+ // // skip since adding 0u does nothing
+ // o0 = v2 + 0u;
+ // o1 = v3 + 0u;
+ // if (v2 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v2 = o0;
+ // v3 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v26 ^ v2;
+ xor1 = v27 ^ v3;
+ v26 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v27 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v18 + v26;
+ o1 = v19 + v27;
+ o1 = o1 + select(0u, 1u, o0 < v18);
+ v18 = o0;
+ v19 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v10 ^ v18;
+ xor1 = v11 ^ v19;
+ v10 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v11 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=5, i=2(x2), a=v[4-5], b=v[12-13], c=v[20-21], d=v[28-29]
+ */
+
+ // a = a + b
+ o0 = v4 + v12;
+ o1 = v5 + v13;
+ o1 = o1 + select(0u, 1u, o0 < v4);
+ v4 = o0;
+ v5 = o1;
+
+ // a = a + m[sigma[r][2*i+0]]
+ o0 = v4 + m0;
+ o1 = v5 + m1;
+ o1 = o1 + select(0u, 1u, o0 < v4);
+ v4 = o0;
+ v5 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v28 ^ v4;
+ xor1 = v29 ^ v5;
+ v28 = xor1;
+ v29 = xor0;
+
+ // c = c + d
+ o0 = v20 + v28;
+ o1 = v21 + v29;
+ o1 = o1 + select(0u, 1u, o0 < v20);
+ v20 = o0;
+ v21 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v12 ^ v20;
+ xor1 = v13 ^ v21;
+ v12 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v13 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v4 + v12;
+ o1 = v5 + v13;
+ o1 = o1 + select(0u, 1u, o0 < v4);
+ v4 = o0;
+ v5 = o1;
+
+ // // a = a + m[sigma[r][2*i+1]]
+ // // skip since adding 0u does nothing
+ // o0 = v4 + 0u;
+ // o1 = v5 + 0u;
+ // if (v4 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v4 = o0;
+ // v5 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v28 ^ v4;
+ xor1 = v29 ^ v5;
+ v28 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v29 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v20 + v28;
+ o1 = v21 + v29;
+ o1 = o1 + select(0u, 1u, o0 < v20);
+ v20 = o0;
+ v21 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v12 ^ v20;
+ xor1 = v13 ^ v21;
+ v12 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v13 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=5, i=3(x2), a=v[6-7], b=v[14-15], c=v[22-23], d=v[30-31]
+ */
+
+ // a = a + b
+ o0 = v6 + v14;
+ o1 = v7 + v15;
+ o1 = o1 + select(0u, 1u, o0 < v6);
+ v6 = o0;
+ v7 = o1;
+
+ // // a = a + m[sigma[r][2*i+0]]
+ // // skip since adding 0u does nothing
+ // o0 = v6 + 0u;
+ // o1 = v7 + 0u;
+ // if (v6 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v6 = o0;
+ // v7 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v30 ^ v6;
+ xor1 = v31 ^ v7;
+ v30 = xor1;
+ v31 = xor0;
+
+ // c = c + d
+ o0 = v22 + v30;
+ o1 = v23 + v31;
+ o1 = o1 + select(0u, 1u, o0 < v22);
+ v22 = o0;
+ v23 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v14 ^ v22;
+ xor1 = v15 ^ v23;
+ v14 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v15 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v6 + v14;
+ o1 = v7 + v15;
+ o1 = o1 + select(0u, 1u, o0 < v6);
+ v6 = o0;
+ v7 = o1;
+
+ // a = a + m[sigma[r][2*i+1]]
+ o0 = v6 + m6;
+ o1 = v7 + m7;
+ o1 = o1 + select(0u, 1u, o0 < v6);
+ v6 = o0;
+ v7 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v30 ^ v6;
+ xor1 = v31 ^ v7;
+ v30 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v31 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v22 + v30;
+ o1 = v23 + v31;
+ o1 = o1 + select(0u, 1u, o0 < v22);
+ v22 = o0;
+ v23 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v14 ^ v22;
+ xor1 = v15 ^ v23;
+ v14 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v15 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=5, i=4(x2), a=v[0-1], b=v[10-11], c=v[20-21], d=v[30-31]
+ */
+
+ // a = a + b
+ o0 = v0 + v10;
+ o1 = v1 + v11;
+ o1 = o1 + select(0u, 1u, o0 < v0);
+ v0 = o0;
+ v1 = o1;
+
+ // a = a + m[sigma[r][2*i+0]]
+ o0 = v0 + m8;
+ o1 = v1 + m9;
+ o1 = o1 + select(0u, 1u, o0 < v0);
+ v0 = o0;
+ v1 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v30 ^ v0;
+ xor1 = v31 ^ v1;
+ v30 = xor1;
+ v31 = xor0;
+
+ // c = c + d
+ o0 = v20 + v30;
+ o1 = v21 + v31;
+ o1 = o1 + select(0u, 1u, o0 < v20);
+ v20 = o0;
+ v21 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v10 ^ v20;
+ xor1 = v11 ^ v21;
+ v10 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v11 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v0 + v10;
+ o1 = v1 + v11;
+ o1 = o1 + select(0u, 1u, o0 < v0);
+ v0 = o0;
+ v1 = o1;
+
+ // // a = a + m[sigma[r][2*i+1]]
+ // // skip since adding 0u does nothing
+ // o0 = v0 + 0u;
+ // o1 = v1 + 0u;
+ // if (v0 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v0 = o0;
+ // v1 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v30 ^ v0;
+ xor1 = v31 ^ v1;
+ v30 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v31 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v20 + v30;
+ o1 = v21 + v31;
+ o1 = o1 + select(0u, 1u, o0 < v20);
+ v20 = o0;
+ v21 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v10 ^ v20;
+ xor1 = v11 ^ v21;
+ v10 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v11 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=5, i=5(x2), a=v[2-3], b=v[12-13], c=v[22-23], d=v[24-25]
+ */
+
+ // a = a + b
+ o0 = v2 + v12;
+ o1 = v3 + v13;
+ o1 = o1 + select(0u, 1u, o0 < v2);
+ v2 = o0;
+ v3 = o1;
+
+ // // a = a + m[sigma[r][2*i+0]]
+ // // skip since adding 0u does nothing
+ // o0 = v2 + 0u;
+ // o1 = v3 + 0u;
+ // if (v2 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v2 = o0;
+ // v3 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v24 ^ v2;
+ xor1 = v25 ^ v3;
+ v24 = xor1;
+ v25 = xor0;
+
+ // c = c + d
+ o0 = v22 + v24;
+ o1 = v23 + v25;
+ o1 = o1 + select(0u, 1u, o0 < v22);
+ v22 = o0;
+ v23 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v12 ^ v22;
+ xor1 = v13 ^ v23;
+ v12 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v13 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v2 + v12;
+ o1 = v3 + v13;
+ o1 = o1 + select(0u, 1u, o0 < v2);
+ v2 = o0;
+ v3 = o1;
+
+ // // a = a + m[sigma[r][2*i+1]]
+ // // skip since adding 0u does nothing
+ // o0 = v2 + 0u;
+ // o1 = v3 + 0u;
+ // if (v2 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v2 = o0;
+ // v3 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v24 ^ v2;
+ xor1 = v25 ^ v3;
+ v24 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v25 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v22 + v24;
+ o1 = v23 + v25;
+ o1 = o1 + select(0u, 1u, o0 < v22);
+ v22 = o0;
+ v23 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v12 ^ v22;
+ xor1 = v13 ^ v23;
+ v12 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v13 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=5, i=6(x2), a=v[4-5], b=v[14-15], c=v[16-17], d=v[26-27]
+ */
+
+ // a = a + b
+ o0 = v4 + v14;
+ o1 = v5 + v15;
+ o1 = o1 + select(0u, 1u, o0 < v4);
+ v4 = o0;
+ v5 = o1;
+
+ // // a = a + m[sigma[r][2*i+0]]
+ // // skip since adding 0u does nothing
+ // o0 = v4 + 0u;
+ // o1 = v5 + 0u;
+ // if (v4 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v4 = o0;
+ // v5 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v26 ^ v4;
+ xor1 = v27 ^ v5;
+ v26 = xor1;
+ v27 = xor0;
+
+ // c = c + d
+ o0 = v16 + v26;
+ o1 = v17 + v27;
+ o1 = o1 + select(0u, 1u, o0 < v16);
+ v16 = o0;
+ v17 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v14 ^ v16;
+ xor1 = v15 ^ v17;
+ v14 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v15 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v4 + v14;
+ o1 = v5 + v15;
+ o1 = o1 + select(0u, 1u, o0 < v4);
+ v4 = o0;
+ v5 = o1;
+
+ // // a = a + m[sigma[r][2*i+1]]
+ // // skip since adding 0u does nothing
+ // o0 = v4 + 0u;
+ // o1 = v5 + 0u;
+ // if (v4 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v4 = o0;
+ // v5 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v26 ^ v4;
+ xor1 = v27 ^ v5;
+ v26 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v27 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v16 + v26;
+ o1 = v17 + v27;
+ o1 = o1 + select(0u, 1u, o0 < v16);
+ v16 = o0;
+ v17 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v14 ^ v16;
+ xor1 = v15 ^ v17;
+ v14 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v15 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=5, i=7(x2), a=v[6-7], b=v[8-9], c=v[18-19], d=v[28-29]
+ */
+
+ // a = a + b
+ o0 = v6 + v8;
+ o1 = v7 + v9;
+ o1 = o1 + select(0u, 1u, o0 < v6);
+ v6 = o0;
+ v7 = o1;
+
+ // a = a + m[sigma[r][2*i+0]]
+ o0 = v6 + m2;
+ o1 = v7 + m3;
+ o1 = o1 + select(0u, 1u, o0 < v6);
+ v6 = o0;
+ v7 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v28 ^ v6;
+ xor1 = v29 ^ v7;
+ v28 = xor1;
+ v29 = xor0;
+
+ // c = c + d
+ o0 = v18 + v28;
+ o1 = v19 + v29;
+ o1 = o1 + select(0u, 1u, o0 < v18);
+ v18 = o0;
+ v19 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v8 ^ v18;
+ xor1 = v9 ^ v19;
+ v8 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v9 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v6 + v8;
+ o1 = v7 + v9;
+ o1 = o1 + select(0u, 1u, o0 < v6);
+ v6 = o0;
+ v7 = o1;
+
+ // // a = a + m[sigma[r][2*i+1]]
+ // // skip since adding 0u does nothing
+ // o0 = v6 + 0u;
+ // o1 = v7 + 0u;
+ // if (v6 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v6 = o0;
+ // v7 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v28 ^ v6;
+ xor1 = v29 ^ v7;
+ v28 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v29 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v18 + v28;
+ o1 = v19 + v29;
+ o1 = o1 + select(0u, 1u, o0 < v18);
+ v18 = o0;
+ v19 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v8 ^ v18;
+ xor1 = v9 ^ v19;
+ v8 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v9 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /****************************************************************************
+ * ROUND(6) *
+ ****************************************************************************/
+
+ /**
+ * r=6, i=0(x2), a=v[0-1], b=v[8-9], c=v[16-17], d=v[24-25]
+ */
+
+ // a = a + b
+ o0 = v0 + v8;
+ o1 = v1 + v9;
+ o1 = o1 + select(0u, 1u, o0 < v0);
+ v0 = o0;
+ v1 = o1;
+
+ // // a = a + m[sigma[r][2*i+0]]
+ // // skip since adding 0u does nothing
+ // o0 = v0 + 0u;
+ // o1 = v1 + 0u;
+ // if (v0 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v0 = o0;
+ // v1 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v24 ^ v0;
+ xor1 = v25 ^ v1;
+ v24 = xor1;
+ v25 = xor0;
+
+ // c = c + d
+ o0 = v16 + v24;
+ o1 = v17 + v25;
+ o1 = o1 + select(0u, 1u, o0 < v16);
+ v16 = o0;
+ v17 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v8 ^ v16;
+ xor1 = v9 ^ v17;
+ v8 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v9 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v0 + v8;
+ o1 = v1 + v9;
+ o1 = o1 + select(0u, 1u, o0 < v0);
+ v0 = o0;
+ v1 = o1;
+
+ // // a = a + m[sigma[r][2*i+1]]
+ // // skip since adding 0u does nothing
+ // o0 = v0 + 0u;
+ // o1 = v1 + 0u;
+ // if (v0 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v0 = o0;
+ // v1 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v24 ^ v0;
+ xor1 = v25 ^ v1;
+ v24 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v25 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v16 + v24;
+ o1 = v17 + v25;
+ o1 = o1 + select(0u, 1u, o0 < v16);
+ v16 = o0;
+ v17 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v8 ^ v16;
+ xor1 = v9 ^ v17;
+ v8 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v9 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=6, i=1(x2), a=v[2-3], b=v[10-11], c=v[18-19], d=v[26-27]
+ */
+
+ // a = a + b
+ o0 = v2 + v10;
+ o1 = v3 + v11;
+ o1 = o1 + select(0u, 1u, o0 < v2);
+ v2 = o0;
+ v3 = o1;
+
+ // a = a + m[sigma[r][2*i+0]]
+ o0 = v2 + m2;
+ o1 = v3 + m3;
+ o1 = o1 + select(0u, 1u, o0 < v2);
+ v2 = o0;
+ v3 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v26 ^ v2;
+ xor1 = v27 ^ v3;
+ v26 = xor1;
+ v27 = xor0;
+
+ // c = c + d
+ o0 = v18 + v26;
+ o1 = v19 + v27;
+ o1 = o1 + select(0u, 1u, o0 < v18);
+ v18 = o0;
+ v19 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v10 ^ v18;
+ xor1 = v11 ^ v19;
+ v10 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v11 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v2 + v10;
+ o1 = v3 + v11;
+ o1 = o1 + select(0u, 1u, o0 < v2);
+ v2 = o0;
+ v3 = o1;
+
+ // // a = a + m[sigma[r][2*i+1]]
+ // // skip since adding 0u does nothing
+ // o0 = v2 + 0u;
+ // o1 = v3 + 0u;
+ // if (v2 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v2 = o0;
+ // v3 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v26 ^ v2;
+ xor1 = v27 ^ v3;
+ v26 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v27 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v18 + v26;
+ o1 = v19 + v27;
+ o1 = o1 + select(0u, 1u, o0 < v18);
+ v18 = o0;
+ v19 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v10 ^ v18;
+ xor1 = v11 ^ v19;
+ v10 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v11 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=6, i=2(x2), a=v[4-5], b=v[12-13], c=v[20-21], d=v[28-29]
+ */
+
+ // a = a + b
+ o0 = v4 + v12;
+ o1 = v5 + v13;
+ o1 = o1 + select(0u, 1u, o0 < v4);
+ v4 = o0;
+ v5 = o1;
+
+ // // a = a + m[sigma[r][2*i+0]]
+ // // skip since adding 0u does nothing
+ // o0 = v4 + 0u;
+ // o1 = v5 + 0u;
+ // if (v4 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v4 = o0;
+ // v5 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v28 ^ v4;
+ xor1 = v29 ^ v5;
+ v28 = xor1;
+ v29 = xor0;
+
+ // c = c + d
+ o0 = v20 + v28;
+ o1 = v21 + v29;
+ o1 = o1 + select(0u, 1u, o0 < v20);
+ v20 = o0;
+ v21 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v12 ^ v20;
+ xor1 = v13 ^ v21;
+ v12 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v13 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v4 + v12;
+ o1 = v5 + v13;
+ o1 = o1 + select(0u, 1u, o0 < v4);
+ v4 = o0;
+ v5 = o1;
+
+ // // a = a + m[sigma[r][2*i+1]]
+ // // skip since adding 0u does nothing
+ // o0 = v4 + 0u;
+ // o1 = v5 + 0u;
+ // if (v4 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v4 = o0;
+ // v5 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v28 ^ v4;
+ xor1 = v29 ^ v5;
+ v28 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v29 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v20 + v28;
+ o1 = v21 + v29;
+ o1 = o1 + select(0u, 1u, o0 < v20);
+ v20 = o0;
+ v21 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v12 ^ v20;
+ xor1 = v13 ^ v21;
+ v12 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v13 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=6, i=3(x2), a=v[6-7], b=v[14-15], c=v[22-23], d=v[30-31]
+ */
+
+ // a = a + b
+ o0 = v6 + v14;
+ o1 = v7 + v15;
+ o1 = o1 + select(0u, 1u, o0 < v6);
+ v6 = o0;
+ v7 = o1;
+
+ // a = a + m[sigma[r][2*i+0]]
+ o0 = v6 + m8;
+ o1 = v7 + m9;
+ o1 = o1 + select(0u, 1u, o0 < v6);
+ v6 = o0;
+ v7 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v30 ^ v6;
+ xor1 = v31 ^ v7;
+ v30 = xor1;
+ v31 = xor0;
+
+ // c = c + d
+ o0 = v22 + v30;
+ o1 = v23 + v31;
+ o1 = o1 + select(0u, 1u, o0 < v22);
+ v22 = o0;
+ v23 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v14 ^ v22;
+ xor1 = v15 ^ v23;
+ v14 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v15 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v6 + v14;
+ o1 = v7 + v15;
+ o1 = o1 + select(0u, 1u, o0 < v6);
+ v6 = o0;
+ v7 = o1;
+
+ // // a = a + m[sigma[r][2*i+1]]
+ // // skip since adding 0u does nothing
+ // o0 = v6 + 0u;
+ // o1 = v7 + 0u;
+ // if (v6 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v6 = o0;
+ // v7 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v30 ^ v6;
+ xor1 = v31 ^ v7;
+ v30 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v31 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v22 + v30;
+ o1 = v23 + v31;
+ o1 = o1 + select(0u, 1u, o0 < v22);
+ v22 = o0;
+ v23 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v14 ^ v22;
+ xor1 = v15 ^ v23;
+ v14 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v15 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=6, i=4(x2), a=v[0-1], b=v[10-11], c=v[20-21], d=v[30-31]
+ */
+
+ // a = a + b
+ o0 = v0 + v10;
+ o1 = v1 + v11;
+ o1 = o1 + select(0u, 1u, o0 < v0);
+ v0 = o0;
+ v1 = o1;
+
+ // a = a + m[sigma[r][2*i+0]]
+ o0 = v0 + m0;
+ o1 = v1 + m1;
+ o1 = o1 + select(0u, 1u, o0 < v0);
+ v0 = o0;
+ v1 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v30 ^ v0;
+ xor1 = v31 ^ v1;
+ v30 = xor1;
+ v31 = xor0;
+
+ // c = c + d
+ o0 = v20 + v30;
+ o1 = v21 + v31;
+ o1 = o1 + select(0u, 1u, o0 < v20);
+ v20 = o0;
+ v21 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v10 ^ v20;
+ xor1 = v11 ^ v21;
+ v10 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v11 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v0 + v10;
+ o1 = v1 + v11;
+ o1 = o1 + select(0u, 1u, o0 < v0);
+ v0 = o0;
+ v1 = o1;
+
+ // // a = a + m[sigma[r][2*i+1]]
+ // // skip since adding 0u does nothing
+ // o0 = v0 + 0u;
+ // o1 = v1 + 0u;
+ // if (v0 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v0 = o0;
+ // v1 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v30 ^ v0;
+ xor1 = v31 ^ v1;
+ v30 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v31 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v20 + v30;
+ o1 = v21 + v31;
+ o1 = o1 + select(0u, 1u, o0 < v20);
+ v20 = o0;
+ v21 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v10 ^ v20;
+ xor1 = v11 ^ v21;
+ v10 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v11 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=6, i=5(x2), a=v[2-3], b=v[12-13], c=v[22-23], d=v[24-25]
+ */
+
+ // a = a + b
+ o0 = v2 + v12;
+ o1 = v3 + v13;
+ o1 = o1 + select(0u, 1u, o0 < v2);
+ v2 = o0;
+ v3 = o1;
+
+ // // a = a + m[sigma[r][2*i+0]]
+ // // skip since adding 0u does nothing
+ // o0 = v2 + 0u;
+ // o1 = v3 + 0u;
+ // if (v2 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v2 = o0;
+ // v3 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v24 ^ v2;
+ xor1 = v25 ^ v3;
+ v24 = xor1;
+ v25 = xor0;
+
+ // c = c + d
+ o0 = v22 + v24;
+ o1 = v23 + v25;
+ o1 = o1 + select(0u, 1u, o0 < v22);
+ v22 = o0;
+ v23 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v12 ^ v22;
+ xor1 = v13 ^ v23;
+ v12 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v13 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v2 + v12;
+ o1 = v3 + v13;
+ o1 = o1 + select(0u, 1u, o0 < v2);
+ v2 = o0;
+ v3 = o1;
+
+ // a = a + m[sigma[r][2*i+1]]
+ o0 = v2 + m6;
+ o1 = v3 + m7;
+ o1 = o1 + select(0u, 1u, o0 < v2);
+ v2 = o0;
+ v3 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v24 ^ v2;
+ xor1 = v25 ^ v3;
+ v24 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v25 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v22 + v24;
+ o1 = v23 + v25;
+ o1 = o1 + select(0u, 1u, o0 < v22);
+ v22 = o0;
+ v23 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v12 ^ v22;
+ xor1 = v13 ^ v23;
+ v12 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v13 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=6, i=6(x2), a=v[4-5], b=v[14-15], c=v[16-17], d=v[26-27]
+ */
+
+ // a = a + b
+ o0 = v4 + v14;
+ o1 = v5 + v15;
+ o1 = o1 + select(0u, 1u, o0 < v4);
+ v4 = o0;
+ v5 = o1;
+
+ // // a = a + m[sigma[r][2*i+0]]
+ // // skip since adding 0u does nothing
+ // o0 = v4 + 0u;
+ // o1 = v5 + 0u;
+ // if (v4 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v4 = o0;
+ // v5 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v26 ^ v4;
+ xor1 = v27 ^ v5;
+ v26 = xor1;
+ v27 = xor0;
+
+ // c = c + d
+ o0 = v16 + v26;
+ o1 = v17 + v27;
+ o1 = o1 + select(0u, 1u, o0 < v16);
+ v16 = o0;
+ v17 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v14 ^ v16;
+ xor1 = v15 ^ v17;
+ v14 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v15 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v4 + v14;
+ o1 = v5 + v15;
+ o1 = o1 + select(0u, 1u, o0 < v4);
+ v4 = o0;
+ v5 = o1;
+
+ // a = a + m[sigma[r][2*i+1]]
+ o0 = v4 + m4;
+ o1 = v5 + m5;
+ o1 = o1 + select(0u, 1u, o0 < v4);
+ v4 = o0;
+ v5 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v26 ^ v4;
+ xor1 = v27 ^ v5;
+ v26 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v27 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v16 + v26;
+ o1 = v17 + v27;
+ o1 = o1 + select(0u, 1u, o0 < v16);
+ v16 = o0;
+ v17 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v14 ^ v16;
+ xor1 = v15 ^ v17;
+ v14 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v15 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=6, i=7(x2), a=v[6-7], b=v[8-9], c=v[18-19], d=v[28-29]
+ */
+
+ // a = a + b
+ o0 = v6 + v8;
+ o1 = v7 + v9;
+ o1 = o1 + select(0u, 1u, o0 < v6);
+ v6 = o0;
+ v7 = o1;
+
+ // // a = a + m[sigma[r][2*i+0]]
+ // // skip since adding 0u does nothing
+ // o0 = v6 + 0u;
+ // o1 = v7 + 0u;
+ // if (v6 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v6 = o0;
+ // v7 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v28 ^ v6;
+ xor1 = v29 ^ v7;
+ v28 = xor1;
+ v29 = xor0;
+
+ // c = c + d
+ o0 = v18 + v28;
+ o1 = v19 + v29;
+ o1 = o1 + select(0u, 1u, o0 < v18);
+ v18 = o0;
+ v19 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v8 ^ v18;
+ xor1 = v9 ^ v19;
+ v8 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v9 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v6 + v8;
+ o1 = v7 + v9;
+ o1 = o1 + select(0u, 1u, o0 < v6);
+ v6 = o0;
+ v7 = o1;
+
+ // // a = a + m[sigma[r][2*i+1]]
+ // // skip since adding 0u does nothing
+ // o0 = v6 + 0u;
+ // o1 = v7 + 0u;
+ // if (v6 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v6 = o0;
+ // v7 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v28 ^ v6;
+ xor1 = v29 ^ v7;
+ v28 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v29 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v18 + v28;
+ o1 = v19 + v29;
+ o1 = o1 + select(0u, 1u, o0 < v18);
+ v18 = o0;
+ v19 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v8 ^ v18;
+ xor1 = v9 ^ v19;
+ v8 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v9 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /****************************************************************************
+ * ROUND(7) *
+ ****************************************************************************/
+
+ /**
+ * r=7, i=0(x2), a=v[0-1], b=v[8-9], c=v[16-17], d=v[24-25]
+ */
+
+ // a = a + b
+ o0 = v0 + v8;
+ o1 = v1 + v9;
+ o1 = o1 + select(0u, 1u, o0 < v0);
+ v0 = o0;
+ v1 = o1;
+
+ // // a = a + m[sigma[r][2*i+0]]
+ // // skip since adding 0u does nothing
+ // o0 = v0 + 0u;
+ // o1 = v1 + 0u;
+ // if (v0 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v0 = o0;
+ // v1 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v24 ^ v0;
+ xor1 = v25 ^ v1;
+ v24 = xor1;
+ v25 = xor0;
+
+ // c = c + d
+ o0 = v16 + v24;
+ o1 = v17 + v25;
+ o1 = o1 + select(0u, 1u, o0 < v16);
+ v16 = o0;
+ v17 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v8 ^ v16;
+ xor1 = v9 ^ v17;
+ v8 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v9 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v0 + v8;
+ o1 = v1 + v9;
+ o1 = o1 + select(0u, 1u, o0 < v0);
+ v0 = o0;
+ v1 = o1;
+
+ // // a = a + m[sigma[r][2*i+1]]
+ // // skip since adding 0u does nothing
+ // o0 = v0 + 0u;
+ // o1 = v1 + 0u;
+ // if (v0 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v0 = o0;
+ // v1 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v24 ^ v0;
+ xor1 = v25 ^ v1;
+ v24 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v25 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v16 + v24;
+ o1 = v17 + v25;
+ o1 = o1 + select(0u, 1u, o0 < v16);
+ v16 = o0;
+ v17 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v8 ^ v16;
+ xor1 = v9 ^ v17;
+ v8 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v9 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=7, i=1(x2), a=v[2-3], b=v[10-11], c=v[18-19], d=v[26-27]
+ */
+
+ // a = a + b
+ o0 = v2 + v10;
+ o1 = v3 + v11;
+ o1 = o1 + select(0u, 1u, o0 < v2);
+ v2 = o0;
+ v3 = o1;
+
+ // // a = a + m[sigma[r][2*i+0]]
+ // // skip since adding 0u does nothing
+ // o0 = v2 + 0u;
+ // o1 = v3 + 0u;
+ // if (v2 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v2 = o0;
+ // v3 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v26 ^ v2;
+ xor1 = v27 ^ v3;
+ v26 = xor1;
+ v27 = xor0;
+
+ // c = c + d
+ o0 = v18 + v26;
+ o1 = v19 + v27;
+ o1 = o1 + select(0u, 1u, o0 < v18);
+ v18 = o0;
+ v19 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v10 ^ v18;
+ xor1 = v11 ^ v19;
+ v10 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v11 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v2 + v10;
+ o1 = v3 + v11;
+ o1 = o1 + select(0u, 1u, o0 < v2);
+ v2 = o0;
+ v3 = o1;
+
+ // // a = a + m[sigma[r][2*i+1]]
+ // // skip since adding 0u does nothing
+ // o0 = v2 + 0u;
+ // o1 = v3 + 0u;
+ // if (v2 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v2 = o0;
+ // v3 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v26 ^ v2;
+ xor1 = v27 ^ v3;
+ v26 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v27 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v18 + v26;
+ o1 = v19 + v27;
+ o1 = o1 + select(0u, 1u, o0 < v18);
+ v18 = o0;
+ v19 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v10 ^ v18;
+ xor1 = v11 ^ v19;
+ v10 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v11 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=7, i=2(x2), a=v[4-5], b=v[12-13], c=v[20-21], d=v[28-29]
+ */
+
+ // a = a + b
+ o0 = v4 + v12;
+ o1 = v5 + v13;
+ o1 = o1 + select(0u, 1u, o0 < v4);
+ v4 = o0;
+ v5 = o1;
+
+ // // a = a + m[sigma[r][2*i+0]]
+ // // skip since adding 0u does nothing
+ // o0 = v4 + 0u;
+ // o1 = v5 + 0u;
+ // if (v4 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v4 = o0;
+ // v5 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v28 ^ v4;
+ xor1 = v29 ^ v5;
+ v28 = xor1;
+ v29 = xor0;
+
+ // c = c + d
+ o0 = v20 + v28;
+ o1 = v21 + v29;
+ o1 = o1 + select(0u, 1u, o0 < v20);
+ v20 = o0;
+ v21 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v12 ^ v20;
+ xor1 = v13 ^ v21;
+ v12 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v13 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v4 + v12;
+ o1 = v5 + v13;
+ o1 = o1 + select(0u, 1u, o0 < v4);
+ v4 = o0;
+ v5 = o1;
+
+ // a = a + m[sigma[r][2*i+1]]
+ o0 = v4 + m2;
+ o1 = v5 + m3;
+ o1 = o1 + select(0u, 1u, o0 < v4);
+ v4 = o0;
+ v5 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v28 ^ v4;
+ xor1 = v29 ^ v5;
+ v28 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v29 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v20 + v28;
+ o1 = v21 + v29;
+ o1 = o1 + select(0u, 1u, o0 < v20);
+ v20 = o0;
+ v21 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v12 ^ v20;
+ xor1 = v13 ^ v21;
+ v12 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v13 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=7, i=3(x2), a=v[6-7], b=v[14-15], c=v[22-23], d=v[30-31]
+ */
+
+ // a = a + b
+ o0 = v6 + v14;
+ o1 = v7 + v15;
+ o1 = o1 + select(0u, 1u, o0 < v6);
+ v6 = o0;
+ v7 = o1;
+
+ // a = a + m[sigma[r][2*i+0]]
+ o0 = v6 + m6;
+ o1 = v7 + m7;
+ o1 = o1 + select(0u, 1u, o0 < v6);
+ v6 = o0;
+ v7 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v30 ^ v6;
+ xor1 = v31 ^ v7;
+ v30 = xor1;
+ v31 = xor0;
+
+ // c = c + d
+ o0 = v22 + v30;
+ o1 = v23 + v31;
+ o1 = o1 + select(0u, 1u, o0 < v22);
+ v22 = o0;
+ v23 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v14 ^ v22;
+ xor1 = v15 ^ v23;
+ v14 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v15 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v6 + v14;
+ o1 = v7 + v15;
+ o1 = o1 + select(0u, 1u, o0 < v6);
+ v6 = o0;
+ v7 = o1;
+
+ // // a = a + m[sigma[r][2*i+1]]
+ // // skip since adding 0u does nothing
+ // o0 = v6 + 0u;
+ // o1 = v7 + 0u;
+ // if (v6 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v6 = o0;
+ // v7 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v30 ^ v6;
+ xor1 = v31 ^ v7;
+ v30 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v31 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v22 + v30;
+ o1 = v23 + v31;
+ o1 = o1 + select(0u, 1u, o0 < v22);
+ v22 = o0;
+ v23 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v14 ^ v22;
+ xor1 = v15 ^ v23;
+ v14 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v15 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=7, i=4(x2), a=v[0-1], b=v[10-11], c=v[20-21], d=v[30-31]
+ */
+
+ // a = a + b
+ o0 = v0 + v10;
+ o1 = v1 + v11;
+ o1 = o1 + select(0u, 1u, o0 < v0);
+ v0 = o0;
+ v1 = o1;
+
+ // // a = a + m[sigma[r][2*i+0]]
+ // // skip since adding 0u does nothing
+ // o0 = v0 + 0u;
+ // o1 = v1 + 0u;
+ // if (v0 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v0 = o0;
+ // v1 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v30 ^ v0;
+ xor1 = v31 ^ v1;
+ v30 = xor1;
+ v31 = xor0;
+
+ // c = c + d
+ o0 = v20 + v30;
+ o1 = v21 + v31;
+ o1 = o1 + select(0u, 1u, o0 < v20);
+ v20 = o0;
+ v21 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v10 ^ v20;
+ xor1 = v11 ^ v21;
+ v10 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v11 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v0 + v10;
+ o1 = v1 + v11;
+ o1 = o1 + select(0u, 1u, o0 < v0);
+ v0 = o0;
+ v1 = o1;
+
+ // a = a + m[sigma[r][2*i+1]]
+ o0 = v0 + m0;
+ o1 = v1 + m1;
+ o1 = o1 + select(0u, 1u, o0 < v0);
+ v0 = o0;
+ v1 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v30 ^ v0;
+ xor1 = v31 ^ v1;
+ v30 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v31 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v20 + v30;
+ o1 = v21 + v31;
+ o1 = o1 + select(0u, 1u, o0 < v20);
+ v20 = o0;
+ v21 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v10 ^ v20;
+ xor1 = v11 ^ v21;
+ v10 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v11 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=7, i=5(x2), a=v[2-3], b=v[12-13], c=v[22-23], d=v[24-25]
+ */
+
+ // a = a + b
+ o0 = v2 + v12;
+ o1 = v3 + v13;
+ o1 = o1 + select(0u, 1u, o0 < v2);
+ v2 = o0;
+ v3 = o1;
+
+ // // a = a + m[sigma[r][2*i+0]]
+ // // skip since adding 0u does nothing
+ // o0 = v2 + 0u;
+ // o1 = v3 + 0u;
+ // if (v2 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v2 = o0;
+ // v3 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v24 ^ v2;
+ xor1 = v25 ^ v3;
+ v24 = xor1;
+ v25 = xor0;
+
+ // c = c + d
+ o0 = v22 + v24;
+ o1 = v23 + v25;
+ o1 = o1 + select(0u, 1u, o0 < v22);
+ v22 = o0;
+ v23 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v12 ^ v22;
+ xor1 = v13 ^ v23;
+ v12 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v13 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v2 + v12;
+ o1 = v3 + v13;
+ o1 = o1 + select(0u, 1u, o0 < v2);
+ v2 = o0;
+ v3 = o1;
+
+ // a = a + m[sigma[r][2*i+1]]
+ o0 = v2 + m8;
+ o1 = v3 + m9;
+ o1 = o1 + select(0u, 1u, o0 < v2);
+ v2 = o0;
+ v3 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v24 ^ v2;
+ xor1 = v25 ^ v3;
+ v24 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v25 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v22 + v24;
+ o1 = v23 + v25;
+ o1 = o1 + select(0u, 1u, o0 < v22);
+ v22 = o0;
+ v23 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v12 ^ v22;
+ xor1 = v13 ^ v23;
+ v12 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v13 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=7, i=6(x2), a=v[4-5], b=v[14-15], c=v[16-17], d=v[26-27]
+ */
+
+ // a = a + b
+ o0 = v4 + v14;
+ o1 = v5 + v15;
+ o1 = o1 + select(0u, 1u, o0 < v4);
+ v4 = o0;
+ v5 = o1;
+
+ // // a = a + m[sigma[r][2*i+0]]
+ // // skip since adding 0u does nothing
+ // o0 = v4 + 0u;
+ // o1 = v5 + 0u;
+ // if (v4 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v4 = o0;
+ // v5 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v26 ^ v4;
+ xor1 = v27 ^ v5;
+ v26 = xor1;
+ v27 = xor0;
+
+ // c = c + d
+ o0 = v16 + v26;
+ o1 = v17 + v27;
+ o1 = o1 + select(0u, 1u, o0 < v16);
+ v16 = o0;
+ v17 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v14 ^ v16;
+ xor1 = v15 ^ v17;
+ v14 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v15 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v4 + v14;
+ o1 = v5 + v15;
+ o1 = o1 + select(0u, 1u, o0 < v4);
+ v4 = o0;
+ v5 = o1;
+
+ // // a = a + m[sigma[r][2*i+1]]
+ // // skip since adding 0u does nothing
+ // o0 = v4 + 0u;
+ // o1 = v5 + 0u;
+ // if (v4 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v4 = o0;
+ // v5 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v26 ^ v4;
+ xor1 = v27 ^ v5;
+ v26 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v27 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v16 + v26;
+ o1 = v17 + v27;
+ o1 = o1 + select(0u, 1u, o0 < v16);
+ v16 = o0;
+ v17 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v14 ^ v16;
+ xor1 = v15 ^ v17;
+ v14 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v15 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=7, i=7(x2), a=v[6-7], b=v[8-9], c=v[18-19], d=v[28-29]
+ */
+
+ // a = a + b
+ o0 = v6 + v8;
+ o1 = v7 + v9;
+ o1 = o1 + select(0u, 1u, o0 < v6);
+ v6 = o0;
+ v7 = o1;
+
+ // a = a + m[sigma[r][2*i+0]]
+ o0 = v6 + m4;
+ o1 = v7 + m5;
+ o1 = o1 + select(0u, 1u, o0 < v6);
+ v6 = o0;
+ v7 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v28 ^ v6;
+ xor1 = v29 ^ v7;
+ v28 = xor1;
+ v29 = xor0;
+
+ // c = c + d
+ o0 = v18 + v28;
+ o1 = v19 + v29;
+ o1 = o1 + select(0u, 1u, o0 < v18);
+ v18 = o0;
+ v19 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v8 ^ v18;
+ xor1 = v9 ^ v19;
+ v8 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v9 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v6 + v8;
+ o1 = v7 + v9;
+ o1 = o1 + select(0u, 1u, o0 < v6);
+ v6 = o0;
+ v7 = o1;
+
+ // // a = a + m[sigma[r][2*i+1]]
+ // // skip since adding 0u does nothing
+ // o0 = v6 + 0u;
+ // o1 = v7 + 0u;
+ // if (v6 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v6 = o0;
+ // v7 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v28 ^ v6;
+ xor1 = v29 ^ v7;
+ v28 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v29 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v18 + v28;
+ o1 = v19 + v29;
+ o1 = o1 + select(0u, 1u, o0 < v18);
+ v18 = o0;
+ v19 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v8 ^ v18;
+ xor1 = v9 ^ v19;
+ v8 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v9 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /****************************************************************************
+ * ROUND(8) *
+ ****************************************************************************/
+
+ /**
+ * r=8, i=0(x2), a=v[0-1], b=v[8-9], c=v[16-17], d=v[24-25]
+ */
+
+ // a = a + b
+ o0 = v0 + v8;
+ o1 = v1 + v9;
+ o1 = o1 + select(0u, 1u, o0 < v0);
+ v0 = o0;
+ v1 = o1;
+
+ // // a = a + m[sigma[r][2*i+0]]
+ // // skip since adding 0u does nothing
+ // o0 = v0 + 0u;
+ // o1 = v1 + 0u;
+ // if (v0 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v0 = o0;
+ // v1 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v24 ^ v0;
+ xor1 = v25 ^ v1;
+ v24 = xor1;
+ v25 = xor0;
+
+ // c = c + d
+ o0 = v16 + v24;
+ o1 = v17 + v25;
+ o1 = o1 + select(0u, 1u, o0 < v16);
+ v16 = o0;
+ v17 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v8 ^ v16;
+ xor1 = v9 ^ v17;
+ v8 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v9 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v0 + v8;
+ o1 = v1 + v9;
+ o1 = o1 + select(0u, 1u, o0 < v0);
+ v0 = o0;
+ v1 = o1;
+
+ // // a = a + m[sigma[r][2*i+1]]
+ // // skip since adding 0u does nothing
+ // o0 = v0 + 0u;
+ // o1 = v1 + 0u;
+ // if (v0 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v0 = o0;
+ // v1 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v24 ^ v0;
+ xor1 = v25 ^ v1;
+ v24 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v25 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v16 + v24;
+ o1 = v17 + v25;
+ o1 = o1 + select(0u, 1u, o0 < v16);
+ v16 = o0;
+ v17 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v8 ^ v16;
+ xor1 = v9 ^ v17;
+ v8 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v9 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=8, i=1(x2), a=v[2-3], b=v[10-11], c=v[18-19], d=v[26-27]
+ */
+
+ // a = a + b
+ o0 = v2 + v10;
+ o1 = v3 + v11;
+ o1 = o1 + select(0u, 1u, o0 < v2);
+ v2 = o0;
+ v3 = o1;
+
+ // // a = a + m[sigma[r][2*i+0]]
+ // // skip since adding 0u does nothing
+ // o0 = v2 + 0u;
+ // o1 = v3 + 0u;
+ // if (v2 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v2 = o0;
+ // v3 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v26 ^ v2;
+ xor1 = v27 ^ v3;
+ v26 = xor1;
+ v27 = xor0;
+
+ // c = c + d
+ o0 = v18 + v26;
+ o1 = v19 + v27;
+ o1 = o1 + select(0u, 1u, o0 < v18);
+ v18 = o0;
+ v19 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v10 ^ v18;
+ xor1 = v11 ^ v19;
+ v10 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v11 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v2 + v10;
+ o1 = v3 + v11;
+ o1 = o1 + select(0u, 1u, o0 < v2);
+ v2 = o0;
+ v3 = o1;
+
+ // // a = a + m[sigma[r][2*i+1]]
+ // // skip since adding 0u does nothing
+ // o0 = v2 + 0u;
+ // o1 = v3 + 0u;
+ // if (v2 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v2 = o0;
+ // v3 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v26 ^ v2;
+ xor1 = v27 ^ v3;
+ v26 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v27 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v18 + v26;
+ o1 = v19 + v27;
+ o1 = o1 + select(0u, 1u, o0 < v18);
+ v18 = o0;
+ v19 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v10 ^ v18;
+ xor1 = v11 ^ v19;
+ v10 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v11 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=8, i=2(x2), a=v[4-5], b=v[12-13], c=v[20-21], d=v[28-29]
+ */
+
+ // a = a + b
+ o0 = v4 + v12;
+ o1 = v5 + v13;
+ o1 = o1 + select(0u, 1u, o0 < v4);
+ v4 = o0;
+ v5 = o1;
+
+ // // a = a + m[sigma[r][2*i+0]]
+ // // skip since adding 0u does nothing
+ // o0 = v4 + 0u;
+ // o1 = v5 + 0u;
+ // if (v4 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v4 = o0;
+ // v5 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v28 ^ v4;
+ xor1 = v29 ^ v5;
+ v28 = xor1;
+ v29 = xor0;
+
+ // c = c + d
+ o0 = v20 + v28;
+ o1 = v21 + v29;
+ o1 = o1 + select(0u, 1u, o0 < v20);
+ v20 = o0;
+ v21 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v12 ^ v20;
+ xor1 = v13 ^ v21;
+ v12 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v13 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v4 + v12;
+ o1 = v5 + v13;
+ o1 = o1 + select(0u, 1u, o0 < v4);
+ v4 = o0;
+ v5 = o1;
+
+ // a = a + m[sigma[r][2*i+1]]
+ o0 = v4 + m6;
+ o1 = v5 + m7;
+ o1 = o1 + select(0u, 1u, o0 < v4);
+ v4 = o0;
+ v5 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v28 ^ v4;
+ xor1 = v29 ^ v5;
+ v28 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v29 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v20 + v28;
+ o1 = v21 + v29;
+ o1 = o1 + select(0u, 1u, o0 < v20);
+ v20 = o0;
+ v21 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v12 ^ v20;
+ xor1 = v13 ^ v21;
+ v12 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v13 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=8, i=3(x2), a=v[6-7], b=v[14-15], c=v[22-23], d=v[30-31]
+ */
+
+ // a = a + b
+ o0 = v6 + v14;
+ o1 = v7 + v15;
+ o1 = o1 + select(0u, 1u, o0 < v6);
+ v6 = o0;
+ v7 = o1;
+
+ // a = a + m[sigma[r][2*i+0]]
+ o0 = v6 + m0;
+ o1 = v7 + m1;
+ o1 = o1 + select(0u, 1u, o0 < v6);
+ v6 = o0;
+ v7 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v30 ^ v6;
+ xor1 = v31 ^ v7;
+ v30 = xor1;
+ v31 = xor0;
+
+ // c = c + d
+ o0 = v22 + v30;
+ o1 = v23 + v31;
+ o1 = o1 + select(0u, 1u, o0 < v22);
+ v22 = o0;
+ v23 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v14 ^ v22;
+ xor1 = v15 ^ v23;
+ v14 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v15 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v6 + v14;
+ o1 = v7 + v15;
+ o1 = o1 + select(0u, 1u, o0 < v6);
+ v6 = o0;
+ v7 = o1;
+
+ // // a = a + m[sigma[r][2*i+1]]
+ // // skip since adding 0u does nothing
+ // o0 = v6 + 0u;
+ // o1 = v7 + 0u;
+ // if (v6 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v6 = o0;
+ // v7 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v30 ^ v6;
+ xor1 = v31 ^ v7;
+ v30 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v31 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v22 + v30;
+ o1 = v23 + v31;
+ o1 = o1 + select(0u, 1u, o0 < v22);
+ v22 = o0;
+ v23 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v14 ^ v22;
+ xor1 = v15 ^ v23;
+ v14 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v15 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=8, i=4(x2), a=v[0-1], b=v[10-11], c=v[20-21], d=v[30-31]
+ */
+
+ // a = a + b
+ o0 = v0 + v10;
+ o1 = v1 + v11;
+ o1 = o1 + select(0u, 1u, o0 < v0);
+ v0 = o0;
+ v1 = o1;
+
+ // // a = a + m[sigma[r][2*i+0]]
+ // // skip since adding 0u does nothing
+ // o0 = v0 + 0u;
+ // o1 = v1 + 0u;
+ // if (v0 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v0 = o0;
+ // v1 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v30 ^ v0;
+ xor1 = v31 ^ v1;
+ v30 = xor1;
+ v31 = xor0;
+
+ // c = c + d
+ o0 = v20 + v30;
+ o1 = v21 + v31;
+ o1 = o1 + select(0u, 1u, o0 < v20);
+ v20 = o0;
+ v21 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v10 ^ v20;
+ xor1 = v11 ^ v21;
+ v10 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v11 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v0 + v10;
+ o1 = v1 + v11;
+ o1 = o1 + select(0u, 1u, o0 < v0);
+ v0 = o0;
+ v1 = o1;
+
+ // a = a + m[sigma[r][2*i+1]]
+ o0 = v0 + m4;
+ o1 = v1 + m5;
+ o1 = o1 + select(0u, 1u, o0 < v0);
+ v0 = o0;
+ v1 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v30 ^ v0;
+ xor1 = v31 ^ v1;
+ v30 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v31 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v20 + v30;
+ o1 = v21 + v31;
+ o1 = o1 + select(0u, 1u, o0 < v20);
+ v20 = o0;
+ v21 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v10 ^ v20;
+ xor1 = v11 ^ v21;
+ v10 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v11 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=8, i=5(x2), a=v[2-3], b=v[12-13], c=v[22-23], d=v[24-25]
+ */
+
+ // a = a + b
+ o0 = v2 + v12;
+ o1 = v3 + v13;
+ o1 = o1 + select(0u, 1u, o0 < v2);
+ v2 = o0;
+ v3 = o1;
+
+ // // a = a + m[sigma[r][2*i+0]]
+ // // skip since adding 0u does nothing
+ // o0 = v2 + 0u;
+ // o1 = v3 + 0u;
+ // if (v2 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v2 = o0;
+ // v3 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v24 ^ v2;
+ xor1 = v25 ^ v3;
+ v24 = xor1;
+ v25 = xor0;
+
+ // c = c + d
+ o0 = v22 + v24;
+ o1 = v23 + v25;
+ o1 = o1 + select(0u, 1u, o0 < v22);
+ v22 = o0;
+ v23 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v12 ^ v22;
+ xor1 = v13 ^ v23;
+ v12 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v13 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v2 + v12;
+ o1 = v3 + v13;
+ o1 = o1 + select(0u, 1u, o0 < v2);
+ v2 = o0;
+ v3 = o1;
+
+ // // a = a + m[sigma[r][2*i+1]]
+ // // skip since adding 0u does nothing
+ // o0 = v2 + 0u;
+ // o1 = v3 + 0u;
+ // if (v2 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v2 = o0;
+ // v3 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v24 ^ v2;
+ xor1 = v25 ^ v3;
+ v24 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v25 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v22 + v24;
+ o1 = v23 + v25;
+ o1 = o1 + select(0u, 1u, o0 < v22);
+ v22 = o0;
+ v23 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v12 ^ v22;
+ xor1 = v13 ^ v23;
+ v12 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v13 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=8, i=6(x2), a=v[4-5], b=v[14-15], c=v[16-17], d=v[26-27]
+ */
+
+ // a = a + b
+ o0 = v4 + v14;
+ o1 = v5 + v15;
+ o1 = o1 + select(0u, 1u, o0 < v4);
+ v4 = o0;
+ v5 = o1;
+
+ // a = a + m[sigma[r][2*i+0]]
+ o0 = v4 + m2;
+ o1 = v5 + m3;
+ o1 = o1 + select(0u, 1u, o0 < v4);
+ v4 = o0;
+ v5 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v26 ^ v4;
+ xor1 = v27 ^ v5;
+ v26 = xor1;
+ v27 = xor0;
+
+ // c = c + d
+ o0 = v16 + v26;
+ o1 = v17 + v27;
+ o1 = o1 + select(0u, 1u, o0 < v16);
+ v16 = o0;
+ v17 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v14 ^ v16;
+ xor1 = v15 ^ v17;
+ v14 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v15 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v4 + v14;
+ o1 = v5 + v15;
+ o1 = o1 + select(0u, 1u, o0 < v4);
+ v4 = o0;
+ v5 = o1;
+
+ // a = a + m[sigma[r][2*i+1]]
+ o0 = v4 + m8;
+ o1 = v5 + m9;
+ o1 = o1 + select(0u, 1u, o0 < v4);
+ v4 = o0;
+ v5 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v26 ^ v4;
+ xor1 = v27 ^ v5;
+ v26 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v27 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v16 + v26;
+ o1 = v17 + v27;
+ o1 = o1 + select(0u, 1u, o0 < v16);
+ v16 = o0;
+ v17 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v14 ^ v16;
+ xor1 = v15 ^ v17;
+ v14 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v15 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=8, i=7(x2), a=v[6-7], b=v[8-9], c=v[18-19], d=v[28-29]
+ */
+
+ // a = a + b
+ o0 = v6 + v8;
+ o1 = v7 + v9;
+ o1 = o1 + select(0u, 1u, o0 < v6);
+ v6 = o0;
+ v7 = o1;
+
+ // // a = a + m[sigma[r][2*i+0]]
+ // // skip since adding 0u does nothing
+ // o0 = v6 + 0u;
+ // o1 = v7 + 0u;
+ // if (v6 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v6 = o0;
+ // v7 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v28 ^ v6;
+ xor1 = v29 ^ v7;
+ v28 = xor1;
+ v29 = xor0;
+
+ // c = c + d
+ o0 = v18 + v28;
+ o1 = v19 + v29;
+ o1 = o1 + select(0u, 1u, o0 < v18);
+ v18 = o0;
+ v19 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v8 ^ v18;
+ xor1 = v9 ^ v19;
+ v8 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v9 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v6 + v8;
+ o1 = v7 + v9;
+ o1 = o1 + select(0u, 1u, o0 < v6);
+ v6 = o0;
+ v7 = o1;
+
+ // // a = a + m[sigma[r][2*i+1]]
+ // // skip since adding 0u does nothing
+ // o0 = v6 + 0u;
+ // o1 = v7 + 0u;
+ // if (v6 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v6 = o0;
+ // v7 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v28 ^ v6;
+ xor1 = v29 ^ v7;
+ v28 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v29 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v18 + v28;
+ o1 = v19 + v29;
+ o1 = o1 + select(0u, 1u, o0 < v18);
+ v18 = o0;
+ v19 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v8 ^ v18;
+ xor1 = v9 ^ v19;
+ v8 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v9 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /****************************************************************************
+ * ROUND(9) *
+ ****************************************************************************/
+
+ /**
+ * r=9, i=0(x2), a=v[0-1], b=v[8-9], c=v[16-17], d=v[24-25]
+ */
+
+ // a = a + b
+ o0 = v0 + v8;
+ o1 = v1 + v9;
+ o1 = o1 + select(0u, 1u, o0 < v0);
+ v0 = o0;
+ v1 = o1;
+
+ // // a = a + m[sigma[r][2*i+0]]
+ // // skip since adding 0u does nothing
+ // o0 = v0 + 0u;
+ // o1 = v1 + 0u;
+ // if (v0 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v0 = o0;
+ // v1 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v24 ^ v0;
+ xor1 = v25 ^ v1;
+ v24 = xor1;
+ v25 = xor0;
+
+ // c = c + d
+ o0 = v16 + v24;
+ o1 = v17 + v25;
+ o1 = o1 + select(0u, 1u, o0 < v16);
+ v16 = o0;
+ v17 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v8 ^ v16;
+ xor1 = v9 ^ v17;
+ v8 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v9 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v0 + v8;
+ o1 = v1 + v9;
+ o1 = o1 + select(0u, 1u, o0 < v0);
+ v0 = o0;
+ v1 = o1;
+
+ // a = a + m[sigma[r][2*i+1]]
+ o0 = v0 + m4;
+ o1 = v1 + m5;
+ o1 = o1 + select(0u, 1u, o0 < v0);
+ v0 = o0;
+ v1 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v24 ^ v0;
+ xor1 = v25 ^ v1;
+ v24 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v25 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v16 + v24;
+ o1 = v17 + v25;
+ o1 = o1 + select(0u, 1u, o0 < v16);
+ v16 = o0;
+ v17 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v8 ^ v16;
+ xor1 = v9 ^ v17;
+ v8 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v9 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=9, i=1(x2), a=v[2-3], b=v[10-11], c=v[18-19], d=v[26-27]
+ */
+
+ // a = a + b
+ o0 = v2 + v10;
+ o1 = v3 + v11;
+ o1 = o1 + select(0u, 1u, o0 < v2);
+ v2 = o0;
+ v3 = o1;
+
+ // // a = a + m[sigma[r][2*i+0]]
+ // // skip since adding 0u does nothing
+ // o0 = v2 + 0u;
+ // o1 = v3 + 0u;
+ // if (v2 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v2 = o0;
+ // v3 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v26 ^ v2;
+ xor1 = v27 ^ v3;
+ v26 = xor1;
+ v27 = xor0;
+
+ // c = c + d
+ o0 = v18 + v26;
+ o1 = v19 + v27;
+ o1 = o1 + select(0u, 1u, o0 < v18);
+ v18 = o0;
+ v19 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v10 ^ v18;
+ xor1 = v11 ^ v19;
+ v10 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v11 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v2 + v10;
+ o1 = v3 + v11;
+ o1 = o1 + select(0u, 1u, o0 < v2);
+ v2 = o0;
+ v3 = o1;
+
+ // a = a + m[sigma[r][2*i+1]]
+ o0 = v2 + m8;
+ o1 = v3 + m9;
+ o1 = o1 + select(0u, 1u, o0 < v2);
+ v2 = o0;
+ v3 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v26 ^ v2;
+ xor1 = v27 ^ v3;
+ v26 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v27 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v18 + v26;
+ o1 = v19 + v27;
+ o1 = o1 + select(0u, 1u, o0 < v18);
+ v18 = o0;
+ v19 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v10 ^ v18;
+ xor1 = v11 ^ v19;
+ v10 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v11 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=9, i=2(x2), a=v[4-5], b=v[12-13], c=v[20-21], d=v[28-29]
+ */
+
+ // a = a + b
+ o0 = v4 + v12;
+ o1 = v5 + v13;
+ o1 = o1 + select(0u, 1u, o0 < v4);
+ v4 = o0;
+ v5 = o1;
+
+ // // a = a + m[sigma[r][2*i+0]]
+ // // skip since adding 0u does nothing
+ // o0 = v4 + 0u;
+ // o1 = v5 + 0u;
+ // if (v4 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v4 = o0;
+ // v5 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v28 ^ v4;
+ xor1 = v29 ^ v5;
+ v28 = xor1;
+ v29 = xor0;
+
+ // c = c + d
+ o0 = v20 + v28;
+ o1 = v21 + v29;
+ o1 = o1 + select(0u, 1u, o0 < v20);
+ v20 = o0;
+ v21 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v12 ^ v20;
+ xor1 = v13 ^ v21;
+ v12 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v13 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v4 + v12;
+ o1 = v5 + v13;
+ o1 = o1 + select(0u, 1u, o0 < v4);
+ v4 = o0;
+ v5 = o1;
+
+ // // a = a + m[sigma[r][2*i+1]]
+ // // skip since adding 0u does nothing
+ // o0 = v4 + 0u;
+ // o1 = v5 + 0u;
+ // if (v4 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v4 = o0;
+ // v5 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v28 ^ v4;
+ xor1 = v29 ^ v5;
+ v28 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v29 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v20 + v28;
+ o1 = v21 + v29;
+ o1 = o1 + select(0u, 1u, o0 < v20);
+ v20 = o0;
+ v21 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v12 ^ v20;
+ xor1 = v13 ^ v21;
+ v12 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v13 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=9, i=3(x2), a=v[6-7], b=v[14-15], c=v[22-23], d=v[30-31]
+ */
+
+ // a = a + b
+ o0 = v6 + v14;
+ o1 = v7 + v15;
+ o1 = o1 + select(0u, 1u, o0 < v6);
+ v6 = o0;
+ v7 = o1;
+
+ // a = a + m[sigma[r][2*i+0]]
+ o0 = v6 + m2;
+ o1 = v7 + m3;
+ o1 = o1 + select(0u, 1u, o0 < v6);
+ v6 = o0;
+ v7 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v30 ^ v6;
+ xor1 = v31 ^ v7;
+ v30 = xor1;
+ v31 = xor0;
+
+ // c = c + d
+ o0 = v22 + v30;
+ o1 = v23 + v31;
+ o1 = o1 + select(0u, 1u, o0 < v22);
+ v22 = o0;
+ v23 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v14 ^ v22;
+ xor1 = v15 ^ v23;
+ v14 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v15 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v6 + v14;
+ o1 = v7 + v15;
+ o1 = o1 + select(0u, 1u, o0 < v6);
+ v6 = o0;
+ v7 = o1;
+
+ // // a = a + m[sigma[r][2*i+1]]
+ // // skip since adding 0u does nothing
+ // o0 = v6 + 0u;
+ // o1 = v7 + 0u;
+ // if (v6 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v6 = o0;
+ // v7 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v30 ^ v6;
+ xor1 = v31 ^ v7;
+ v30 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v31 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v22 + v30;
+ o1 = v23 + v31;
+ o1 = o1 + select(0u, 1u, o0 < v22);
+ v22 = o0;
+ v23 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v14 ^ v22;
+ xor1 = v15 ^ v23;
+ v14 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v15 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=9, i=4(x2), a=v[0-1], b=v[10-11], c=v[20-21], d=v[30-31]
+ */
+
+ // a = a + b
+ o0 = v0 + v10;
+ o1 = v1 + v11;
+ o1 = o1 + select(0u, 1u, o0 < v0);
+ v0 = o0;
+ v1 = o1;
+
+ // // a = a + m[sigma[r][2*i+0]]
+ // // skip since adding 0u does nothing
+ // o0 = v0 + 0u;
+ // o1 = v1 + 0u;
+ // if (v0 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v0 = o0;
+ // v1 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v30 ^ v0;
+ xor1 = v31 ^ v1;
+ v30 = xor1;
+ v31 = xor0;
+
+ // c = c + d
+ o0 = v20 + v30;
+ o1 = v21 + v31;
+ o1 = o1 + select(0u, 1u, o0 < v20);
+ v20 = o0;
+ v21 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v10 ^ v20;
+ xor1 = v11 ^ v21;
+ v10 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v11 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v0 + v10;
+ o1 = v1 + v11;
+ o1 = o1 + select(0u, 1u, o0 < v0);
+ v0 = o0;
+ v1 = o1;
+
+ // // a = a + m[sigma[r][2*i+1]]
+ // // skip since adding 0u does nothing
+ // o0 = v0 + 0u;
+ // o1 = v1 + 0u;
+ // if (v0 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v0 = o0;
+ // v1 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v30 ^ v0;
+ xor1 = v31 ^ v1;
+ v30 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v31 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v20 + v30;
+ o1 = v21 + v31;
+ o1 = o1 + select(0u, 1u, o0 < v20);
+ v20 = o0;
+ v21 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v10 ^ v20;
+ xor1 = v11 ^ v21;
+ v10 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v11 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=9, i=5(x2), a=v[2-3], b=v[12-13], c=v[22-23], d=v[24-25]
+ */
+
+ // a = a + b
+ o0 = v2 + v12;
+ o1 = v3 + v13;
+ o1 = o1 + select(0u, 1u, o0 < v2);
+ v2 = o0;
+ v3 = o1;
+
+ // // a = a + m[sigma[r][2*i+0]]
+ // // skip since adding 0u does nothing
+ // o0 = v2 + 0u;
+ // o1 = v3 + 0u;
+ // if (v2 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v2 = o0;
+ // v3 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v24 ^ v2;
+ xor1 = v25 ^ v3;
+ v24 = xor1;
+ v25 = xor0;
+
+ // c = c + d
+ o0 = v22 + v24;
+ o1 = v23 + v25;
+ o1 = o1 + select(0u, 1u, o0 < v22);
+ v22 = o0;
+ v23 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v12 ^ v22;
+ xor1 = v13 ^ v23;
+ v12 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v13 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v2 + v12;
+ o1 = v3 + v13;
+ o1 = o1 + select(0u, 1u, o0 < v2);
+ v2 = o0;
+ v3 = o1;
+
+ // // a = a + m[sigma[r][2*i+1]]
+ // // skip since adding 0u does nothing
+ // o0 = v2 + 0u;
+ // o1 = v3 + 0u;
+ // if (v2 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v2 = o0;
+ // v3 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v24 ^ v2;
+ xor1 = v25 ^ v3;
+ v24 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v25 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v22 + v24;
+ o1 = v23 + v25;
+ o1 = o1 + select(0u, 1u, o0 < v22);
+ v22 = o0;
+ v23 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v12 ^ v22;
+ xor1 = v13 ^ v23;
+ v12 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v13 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=9, i=6(x2), a=v[4-5], b=v[14-15], c=v[16-17], d=v[26-27]
+ */
+
+ // a = a + b
+ o0 = v4 + v14;
+ o1 = v5 + v15;
+ o1 = o1 + select(0u, 1u, o0 < v4);
+ v4 = o0;
+ v5 = o1;
+
+ // a = a + m[sigma[r][2*i+0]]
+ o0 = v4 + m6;
+ o1 = v5 + m7;
+ o1 = o1 + select(0u, 1u, o0 < v4);
+ v4 = o0;
+ v5 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v26 ^ v4;
+ xor1 = v27 ^ v5;
+ v26 = xor1;
+ v27 = xor0;
+
+ // c = c + d
+ o0 = v16 + v26;
+ o1 = v17 + v27;
+ o1 = o1 + select(0u, 1u, o0 < v16);
+ v16 = o0;
+ v17 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v14 ^ v16;
+ xor1 = v15 ^ v17;
+ v14 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v15 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v4 + v14;
+ o1 = v5 + v15;
+ o1 = o1 + select(0u, 1u, o0 < v4);
+ v4 = o0;
+ v5 = o1;
+
+ // // a = a + m[sigma[r][2*i+1]]
+ // // skip since adding 0u does nothing
+ // o0 = v4 + 0u;
+ // o1 = v5 + 0u;
+ // if (v4 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v4 = o0;
+ // v5 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v26 ^ v4;
+ xor1 = v27 ^ v5;
+ v26 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v27 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v16 + v26;
+ o1 = v17 + v27;
+ o1 = o1 + select(0u, 1u, o0 < v16);
+ v16 = o0;
+ v17 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v14 ^ v16;
+ xor1 = v15 ^ v17;
+ v14 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v15 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=9, i=7(x2), a=v[6-7], b=v[8-9], c=v[18-19], d=v[28-29]
+ */
+
+ // a = a + b
+ o0 = v6 + v8;
+ o1 = v7 + v9;
+ o1 = o1 + select(0u, 1u, o0 < v6);
+ v6 = o0;
+ v7 = o1;
+
+ // // a = a + m[sigma[r][2*i+0]]
+ // // skip since adding 0u does nothing
+ // o0 = v6 + 0u;
+ // o1 = v7 + 0u;
+ // if (v6 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v6 = o0;
+ // v7 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v28 ^ v6;
+ xor1 = v29 ^ v7;
+ v28 = xor1;
+ v29 = xor0;
+
+ // c = c + d
+ o0 = v18 + v28;
+ o1 = v19 + v29;
+ o1 = o1 + select(0u, 1u, o0 < v18);
+ v18 = o0;
+ v19 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v8 ^ v18;
+ xor1 = v9 ^ v19;
+ v8 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v9 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v6 + v8;
+ o1 = v7 + v9;
+ o1 = o1 + select(0u, 1u, o0 < v6);
+ v6 = o0;
+ v7 = o1;
+
+ // a = a + m[sigma[r][2*i+1]]
+ o0 = v6 + m0;
+ o1 = v7 + m1;
+ o1 = o1 + select(0u, 1u, o0 < v6);
+ v6 = o0;
+ v7 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v28 ^ v6;
+ xor1 = v29 ^ v7;
+ v28 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v29 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v18 + v28;
+ o1 = v19 + v29;
+ o1 = o1 + select(0u, 1u, o0 < v18);
+ v18 = o0;
+ v19 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v8 ^ v18;
+ xor1 = v9 ^ v19;
+ v8 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v9 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /****************************************************************************
+ * ROUND(10) *
+ ****************************************************************************/
+
+ /**
+ * r=10, i=0(x2), a=v[0-1], b=v[8-9], c=v[16-17], d=v[24-25]
+ */
+
+ // a = a + b
+ o0 = v0 + v8;
+ o1 = v1 + v9;
+ o1 = o1 + select(0u, 1u, o0 < v0);
+ v0 = o0;
+ v1 = o1;
+
+ // a = a + m[sigma[r][2*i+0]]
+ o0 = v0 + m0;
+ o1 = v1 + m1;
+ o1 = o1 + select(0u, 1u, o0 < v0);
+ v0 = o0;
+ v1 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v24 ^ v0;
+ xor1 = v25 ^ v1;
+ v24 = xor1;
+ v25 = xor0;
+
+ // c = c + d
+ o0 = v16 + v24;
+ o1 = v17 + v25;
+ o1 = o1 + select(0u, 1u, o0 < v16);
+ v16 = o0;
+ v17 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v8 ^ v16;
+ xor1 = v9 ^ v17;
+ v8 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v9 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v0 + v8;
+ o1 = v1 + v9;
+ o1 = o1 + select(0u, 1u, o0 < v0);
+ v0 = o0;
+ v1 = o1;
+
+ // a = a + m[sigma[r][2*i+1]]
+ o0 = v0 + m2;
+ o1 = v1 + m3;
+ o1 = o1 + select(0u, 1u, o0 < v0);
+ v0 = o0;
+ v1 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v24 ^ v0;
+ xor1 = v25 ^ v1;
+ v24 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v25 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v16 + v24;
+ o1 = v17 + v25;
+ o1 = o1 + select(0u, 1u, o0 < v16);
+ v16 = o0;
+ v17 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v8 ^ v16;
+ xor1 = v9 ^ v17;
+ v8 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v9 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=10, i=1(x2), a=v[2-3], b=v[10-11], c=v[18-19], d=v[26-27]
+ */
+
+ // a = a + b
+ o0 = v2 + v10;
+ o1 = v3 + v11;
+ o1 = o1 + select(0u, 1u, o0 < v2);
+ v2 = o0;
+ v3 = o1;
+
+ // a = a + m[sigma[r][2*i+0]]
+ o0 = v2 + m4;
+ o1 = v3 + m5;
+ o1 = o1 + select(0u, 1u, o0 < v2);
+ v2 = o0;
+ v3 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v26 ^ v2;
+ xor1 = v27 ^ v3;
+ v26 = xor1;
+ v27 = xor0;
+
+ // c = c + d
+ o0 = v18 + v26;
+ o1 = v19 + v27;
+ o1 = o1 + select(0u, 1u, o0 < v18);
+ v18 = o0;
+ v19 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v10 ^ v18;
+ xor1 = v11 ^ v19;
+ v10 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v11 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v2 + v10;
+ o1 = v3 + v11;
+ o1 = o1 + select(0u, 1u, o0 < v2);
+ v2 = o0;
+ v3 = o1;
+
+ // a = a + m[sigma[r][2*i+1]]
+ o0 = v2 + m6;
+ o1 = v3 + m7;
+ o1 = o1 + select(0u, 1u, o0 < v2);
+ v2 = o0;
+ v3 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v26 ^ v2;
+ xor1 = v27 ^ v3;
+ v26 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v27 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v18 + v26;
+ o1 = v19 + v27;
+ o1 = o1 + select(0u, 1u, o0 < v18);
+ v18 = o0;
+ v19 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v10 ^ v18;
+ xor1 = v11 ^ v19;
+ v10 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v11 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=10, i=2(x2), a=v[4-5], b=v[12-13], c=v[20-21], d=v[28-29]
+ */
+
+ // a = a + b
+ o0 = v4 + v12;
+ o1 = v5 + v13;
+ o1 = o1 + select(0u, 1u, o0 < v4);
+ v4 = o0;
+ v5 = o1;
+
+ // a = a + m[sigma[r][2*i+0]]
+ o0 = v4 + m8;
+ o1 = v5 + m9;
+ o1 = o1 + select(0u, 1u, o0 < v4);
+ v4 = o0;
+ v5 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v28 ^ v4;
+ xor1 = v29 ^ v5;
+ v28 = xor1;
+ v29 = xor0;
+
+ // c = c + d
+ o0 = v20 + v28;
+ o1 = v21 + v29;
+ o1 = o1 + select(0u, 1u, o0 < v20);
+ v20 = o0;
+ v21 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v12 ^ v20;
+ xor1 = v13 ^ v21;
+ v12 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v13 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v4 + v12;
+ o1 = v5 + v13;
+ o1 = o1 + select(0u, 1u, o0 < v4);
+ v4 = o0;
+ v5 = o1;
+
+ // // a = a + m[sigma[r][2*i+1]]
+ // // skip since adding 0u does nothing
+ // o0 = v4 + 0u;
+ // o1 = v5 + 0u;
+ // if (v4 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v4 = o0;
+ // v5 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v28 ^ v4;
+ xor1 = v29 ^ v5;
+ v28 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v29 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v20 + v28;
+ o1 = v21 + v29;
+ o1 = o1 + select(0u, 1u, o0 < v20);
+ v20 = o0;
+ v21 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v12 ^ v20;
+ xor1 = v13 ^ v21;
+ v12 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v13 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=10, i=3(x2), a=v[6-7], b=v[14-15], c=v[22-23], d=v[30-31]
+ */
+
+ // a = a + b
+ o0 = v6 + v14;
+ o1 = v7 + v15;
+ o1 = o1 + select(0u, 1u, o0 < v6);
+ v6 = o0;
+ v7 = o1;
+
+ // // a = a + m[sigma[r][2*i+0]]
+ // // skip since adding 0u does nothing
+ // o0 = v6 + 0u;
+ // o1 = v7 + 0u;
+ // if (v6 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v6 = o0;
+ // v7 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v30 ^ v6;
+ xor1 = v31 ^ v7;
+ v30 = xor1;
+ v31 = xor0;
+
+ // c = c + d
+ o0 = v22 + v30;
+ o1 = v23 + v31;
+ o1 = o1 + select(0u, 1u, o0 < v22);
+ v22 = o0;
+ v23 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v14 ^ v22;
+ xor1 = v15 ^ v23;
+ v14 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v15 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v6 + v14;
+ o1 = v7 + v15;
+ o1 = o1 + select(0u, 1u, o0 < v6);
+ v6 = o0;
+ v7 = o1;
+
+ // // a = a + m[sigma[r][2*i+1]]
+ // // skip since adding 0u does nothing
+ // o0 = v6 + 0u;
+ // o1 = v7 + 0u;
+ // if (v6 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v6 = o0;
+ // v7 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v30 ^ v6;
+ xor1 = v31 ^ v7;
+ v30 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v31 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v22 + v30;
+ o1 = v23 + v31;
+ o1 = o1 + select(0u, 1u, o0 < v22);
+ v22 = o0;
+ v23 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v14 ^ v22;
+ xor1 = v15 ^ v23;
+ v14 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v15 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=10, i=4(x2), a=v[0-1], b=v[10-11], c=v[20-21], d=v[30-31]
+ */
+
+ // a = a + b
+ o0 = v0 + v10;
+ o1 = v1 + v11;
+ o1 = o1 + select(0u, 1u, o0 < v0);
+ v0 = o0;
+ v1 = o1;
+
+ // // a = a + m[sigma[r][2*i+0]]
+ // // skip since adding 0u does nothing
+ // o0 = v0 + 0u;
+ // o1 = v1 + 0u;
+ // if (v0 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v0 = o0;
+ // v1 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v30 ^ v0;
+ xor1 = v31 ^ v1;
+ v30 = xor1;
+ v31 = xor0;
+
+ // c = c + d
+ o0 = v20 + v30;
+ o1 = v21 + v31;
+ o1 = o1 + select(0u, 1u, o0 < v20);
+ v20 = o0;
+ v21 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v10 ^ v20;
+ xor1 = v11 ^ v21;
+ v10 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v11 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v0 + v10;
+ o1 = v1 + v11;
+ o1 = o1 + select(0u, 1u, o0 < v0);
+ v0 = o0;
+ v1 = o1;
+
+ // // a = a + m[sigma[r][2*i+1]]
+ // // skip since adding 0u does nothing
+ // o0 = v0 + 0u;
+ // o1 = v1 + 0u;
+ // if (v0 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v0 = o0;
+ // v1 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v30 ^ v0;
+ xor1 = v31 ^ v1;
+ v30 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v31 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v20 + v30;
+ o1 = v21 + v31;
+ o1 = o1 + select(0u, 1u, o0 < v20);
+ v20 = o0;
+ v21 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v10 ^ v20;
+ xor1 = v11 ^ v21;
+ v10 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v11 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=10, i=5(x2), a=v[2-3], b=v[12-13], c=v[22-23], d=v[24-25]
+ */
+
+ // a = a + b
+ o0 = v2 + v12;
+ o1 = v3 + v13;
+ o1 = o1 + select(0u, 1u, o0 < v2);
+ v2 = o0;
+ v3 = o1;
+
+ // // a = a + m[sigma[r][2*i+0]]
+ // // skip since adding 0u does nothing
+ // o0 = v2 + 0u;
+ // o1 = v3 + 0u;
+ // if (v2 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v2 = o0;
+ // v3 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v24 ^ v2;
+ xor1 = v25 ^ v3;
+ v24 = xor1;
+ v25 = xor0;
+
+ // c = c + d
+ o0 = v22 + v24;
+ o1 = v23 + v25;
+ o1 = o1 + select(0u, 1u, o0 < v22);
+ v22 = o0;
+ v23 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v12 ^ v22;
+ xor1 = v13 ^ v23;
+ v12 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v13 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v2 + v12;
+ o1 = v3 + v13;
+ o1 = o1 + select(0u, 1u, o0 < v2);
+ v2 = o0;
+ v3 = o1;
+
+ // // a = a + m[sigma[r][2*i+1]]
+ // // skip since adding 0u does nothing
+ // o0 = v2 + 0u;
+ // o1 = v3 + 0u;
+ // if (v2 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v2 = o0;
+ // v3 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v24 ^ v2;
+ xor1 = v25 ^ v3;
+ v24 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v25 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v22 + v24;
+ o1 = v23 + v25;
+ o1 = o1 + select(0u, 1u, o0 < v22);
+ v22 = o0;
+ v23 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v12 ^ v22;
+ xor1 = v13 ^ v23;
+ v12 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v13 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=10, i=6(x2), a=v[4-5], b=v[14-15], c=v[16-17], d=v[26-27]
+ */
+
+ // a = a + b
+ o0 = v4 + v14;
+ o1 = v5 + v15;
+ o1 = o1 + select(0u, 1u, o0 < v4);
+ v4 = o0;
+ v5 = o1;
+
+ // // a = a + m[sigma[r][2*i+0]]
+ // // skip since adding 0u does nothing
+ // o0 = v4 + 0u;
+ // o1 = v5 + 0u;
+ // if (v4 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v4 = o0;
+ // v5 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v26 ^ v4;
+ xor1 = v27 ^ v5;
+ v26 = xor1;
+ v27 = xor0;
+
+ // c = c + d
+ o0 = v16 + v26;
+ o1 = v17 + v27;
+ o1 = o1 + select(0u, 1u, o0 < v16);
+ v16 = o0;
+ v17 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v14 ^ v16;
+ xor1 = v15 ^ v17;
+ v14 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v15 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v4 + v14;
+ o1 = v5 + v15;
+ o1 = o1 + select(0u, 1u, o0 < v4);
+ v4 = o0;
+ v5 = o1;
+
+ // // a = a + m[sigma[r][2*i+1]]
+ // // skip since adding 0u does nothing
+ // o0 = v4 + 0u;
+ // o1 = v5 + 0u;
+ // if (v4 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v4 = o0;
+ // v5 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v26 ^ v4;
+ xor1 = v27 ^ v5;
+ v26 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v27 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v16 + v26;
+ o1 = v17 + v27;
+ o1 = o1 + select(0u, 1u, o0 < v16);
+ v16 = o0;
+ v17 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v14 ^ v16;
+ xor1 = v15 ^ v17;
+ v14 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v15 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=10, i=7(x2), a=v[6-7], b=v[8-9], c=v[18-19], d=v[28-29]
+ */
+
+ // a = a + b
+ o0 = v6 + v8;
+ o1 = v7 + v9;
+ o1 = o1 + select(0u, 1u, o0 < v6);
+ v6 = o0;
+ v7 = o1;
+
+ // // a = a + m[sigma[r][2*i+0]]
+ // // skip since adding 0u does nothing
+ // o0 = v6 + 0u;
+ // o1 = v7 + 0u;
+ // if (v6 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v6 = o0;
+ // v7 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v28 ^ v6;
+ xor1 = v29 ^ v7;
+ v28 = xor1;
+ v29 = xor0;
+
+ // c = c + d
+ o0 = v18 + v28;
+ o1 = v19 + v29;
+ o1 = o1 + select(0u, 1u, o0 < v18);
+ v18 = o0;
+ v19 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v8 ^ v18;
+ xor1 = v9 ^ v19;
+ v8 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v9 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v6 + v8;
+ o1 = v7 + v9;
+ o1 = o1 + select(0u, 1u, o0 < v6);
+ v6 = o0;
+ v7 = o1;
+
+ // // a = a + m[sigma[r][2*i+1]]
+ // // skip since adding 0u does nothing
+ // o0 = v6 + 0u;
+ // o1 = v7 + 0u;
+ // if (v6 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v6 = o0;
+ // v7 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v28 ^ v6;
+ xor1 = v29 ^ v7;
+ v28 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v29 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v18 + v28;
+ o1 = v19 + v29;
+ o1 = o1 + select(0u, 1u, o0 < v18);
+ v18 = o0;
+ v19 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v8 ^ v18;
+ xor1 = v9 ^ v19;
+ v8 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v9 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /****************************************************************************
+ * ROUND(11) *
+ ****************************************************************************/
+
+ /**
+ * r=11, i=0(x2), a=v[0-1], b=v[8-9], c=v[16-17], d=v[24-25]
+ */
+
+ // a = a + b
+ o0 = v0 + v8;
+ o1 = v1 + v9;
+ o1 = o1 + select(0u, 1u, o0 < v0);
+ v0 = o0;
+ v1 = o1;
+
+ // // a = a + m[sigma[r][2*i+0]]
+ // // skip since adding 0u does nothing
+ // o0 = v0 + 0u;
+ // o1 = v1 + 0u;
+ // if (v0 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v0 = o0;
+ // v1 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v24 ^ v0;
+ xor1 = v25 ^ v1;
+ v24 = xor1;
+ v25 = xor0;
+
+ // c = c + d
+ o0 = v16 + v24;
+ o1 = v17 + v25;
+ o1 = o1 + select(0u, 1u, o0 < v16);
+ v16 = o0;
+ v17 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v8 ^ v16;
+ xor1 = v9 ^ v17;
+ v8 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v9 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v0 + v8;
+ o1 = v1 + v9;
+ o1 = o1 + select(0u, 1u, o0 < v0);
+ v0 = o0;
+ v1 = o1;
+
+ // // a = a + m[sigma[r][2*i+1]]
+ // // skip since adding 0u does nothing
+ // o0 = v0 + 0u;
+ // o1 = v1 + 0u;
+ // if (v0 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v0 = o0;
+ // v1 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v24 ^ v0;
+ xor1 = v25 ^ v1;
+ v24 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v25 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v16 + v24;
+ o1 = v17 + v25;
+ o1 = o1 + select(0u, 1u, o0 < v16);
+ v16 = o0;
+ v17 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v8 ^ v16;
+ xor1 = v9 ^ v17;
+ v8 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v9 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=11, i=1(x2), a=v[2-3], b=v[10-11], c=v[18-19], d=v[26-27]
+ */
+
+ // a = a + b
+ o0 = v2 + v10;
+ o1 = v3 + v11;
+ o1 = o1 + select(0u, 1u, o0 < v2);
+ v2 = o0;
+ v3 = o1;
+
+ // a = a + m[sigma[r][2*i+0]]
+ o0 = v2 + m8;
+ o1 = v3 + m9;
+ o1 = o1 + select(0u, 1u, o0 < v2);
+ v2 = o0;
+ v3 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v26 ^ v2;
+ xor1 = v27 ^ v3;
+ v26 = xor1;
+ v27 = xor0;
+
+ // c = c + d
+ o0 = v18 + v26;
+ o1 = v19 + v27;
+ o1 = o1 + select(0u, 1u, o0 < v18);
+ v18 = o0;
+ v19 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v10 ^ v18;
+ xor1 = v11 ^ v19;
+ v10 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v11 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v2 + v10;
+ o1 = v3 + v11;
+ o1 = o1 + select(0u, 1u, o0 < v2);
+ v2 = o0;
+ v3 = o1;
+
+ // // a = a + m[sigma[r][2*i+1]]
+ // // skip since adding 0u does nothing
+ // o0 = v2 + 0u;
+ // o1 = v3 + 0u;
+ // if (v2 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v2 = o0;
+ // v3 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v26 ^ v2;
+ xor1 = v27 ^ v3;
+ v26 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v27 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v18 + v26;
+ o1 = v19 + v27;
+ o1 = o1 + select(0u, 1u, o0 < v18);
+ v18 = o0;
+ v19 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v10 ^ v18;
+ xor1 = v11 ^ v19;
+ v10 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v11 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=11, i=2(x2), a=v[4-5], b=v[12-13], c=v[20-21], d=v[28-29]
+ */
+
+ // a = a + b
+ o0 = v4 + v12;
+ o1 = v5 + v13;
+ o1 = o1 + select(0u, 1u, o0 < v4);
+ v4 = o0;
+ v5 = o1;
+
+ // // a = a + m[sigma[r][2*i+0]]
+ // // skip since adding 0u does nothing
+ // o0 = v4 + 0u;
+ // o1 = v5 + 0u;
+ // if (v4 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v4 = o0;
+ // v5 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v28 ^ v4;
+ xor1 = v29 ^ v5;
+ v28 = xor1;
+ v29 = xor0;
+
+ // c = c + d
+ o0 = v20 + v28;
+ o1 = v21 + v29;
+ o1 = o1 + select(0u, 1u, o0 < v20);
+ v20 = o0;
+ v21 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v12 ^ v20;
+ xor1 = v13 ^ v21;
+ v12 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v13 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v4 + v12;
+ o1 = v5 + v13;
+ o1 = o1 + select(0u, 1u, o0 < v4);
+ v4 = o0;
+ v5 = o1;
+
+ // // a = a + m[sigma[r][2*i+1]]
+ // // skip since adding 0u does nothing
+ // o0 = v4 + 0u;
+ // o1 = v5 + 0u;
+ // if (v4 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v4 = o0;
+ // v5 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v28 ^ v4;
+ xor1 = v29 ^ v5;
+ v28 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v29 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v20 + v28;
+ o1 = v21 + v29;
+ o1 = o1 + select(0u, 1u, o0 < v20);
+ v20 = o0;
+ v21 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v12 ^ v20;
+ xor1 = v13 ^ v21;
+ v12 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v13 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=11, i=3(x2), a=v[6-7], b=v[14-15], c=v[22-23], d=v[30-31]
+ */
+
+ // a = a + b
+ o0 = v6 + v14;
+ o1 = v7 + v15;
+ o1 = o1 + select(0u, 1u, o0 < v6);
+ v6 = o0;
+ v7 = o1;
+
+ // // a = a + m[sigma[r][2*i+0]]
+ // // skip since adding 0u does nothing
+ // o0 = v6 + 0u;
+ // o1 = v7 + 0u;
+ // if (v6 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v6 = o0;
+ // v7 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v30 ^ v6;
+ xor1 = v31 ^ v7;
+ v30 = xor1;
+ v31 = xor0;
+
+ // c = c + d
+ o0 = v22 + v30;
+ o1 = v23 + v31;
+ o1 = o1 + select(0u, 1u, o0 < v22);
+ v22 = o0;
+ v23 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v14 ^ v22;
+ xor1 = v15 ^ v23;
+ v14 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v15 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v6 + v14;
+ o1 = v7 + v15;
+ o1 = o1 + select(0u, 1u, o0 < v6);
+ v6 = o0;
+ v7 = o1;
+
+ // // a = a + m[sigma[r][2*i+1]]
+ // // skip since adding 0u does nothing
+ // o0 = v6 + 0u;
+ // o1 = v7 + 0u;
+ // if (v6 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v6 = o0;
+ // v7 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v30 ^ v6;
+ xor1 = v31 ^ v7;
+ v30 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v31 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v22 + v30;
+ o1 = v23 + v31;
+ o1 = o1 + select(0u, 1u, o0 < v22);
+ v22 = o0;
+ v23 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v14 ^ v22;
+ xor1 = v15 ^ v23;
+ v14 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v15 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=11, i=4(x2), a=v[0-1], b=v[10-11], c=v[20-21], d=v[30-31]
+ */
+
+ // a = a + b
+ o0 = v0 + v10;
+ o1 = v1 + v11;
+ o1 = o1 + select(0u, 1u, o0 < v0);
+ v0 = o0;
+ v1 = o1;
+
+ // a = a + m[sigma[r][2*i+0]]
+ o0 = v0 + m2;
+ o1 = v1 + m3;
+ o1 = o1 + select(0u, 1u, o0 < v0);
+ v0 = o0;
+ v1 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v30 ^ v0;
+ xor1 = v31 ^ v1;
+ v30 = xor1;
+ v31 = xor0;
+
+ // c = c + d
+ o0 = v20 + v30;
+ o1 = v21 + v31;
+ o1 = o1 + select(0u, 1u, o0 < v20);
+ v20 = o0;
+ v21 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v10 ^ v20;
+ xor1 = v11 ^ v21;
+ v10 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v11 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v0 + v10;
+ o1 = v1 + v11;
+ o1 = o1 + select(0u, 1u, o0 < v0);
+ v0 = o0;
+ v1 = o1;
+
+ // // a = a + m[sigma[r][2*i+1]]
+ // // skip since adding 0u does nothing
+ // o0 = v0 + 0u;
+ // o1 = v1 + 0u;
+ // if (v0 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v0 = o0;
+ // v1 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v30 ^ v0;
+ xor1 = v31 ^ v1;
+ v30 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v31 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v20 + v30;
+ o1 = v21 + v31;
+ o1 = o1 + select(0u, 1u, o0 < v20);
+ v20 = o0;
+ v21 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v10 ^ v20;
+ xor1 = v11 ^ v21;
+ v10 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v11 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=11, i=5(x2), a=v[2-3], b=v[12-13], c=v[22-23], d=v[24-25]
+ */
+
+ // a = a + b
+ o0 = v2 + v12;
+ o1 = v3 + v13;
+ o1 = o1 + select(0u, 1u, o0 < v2);
+ v2 = o0;
+ v3 = o1;
+
+ // a = a + m[sigma[r][2*i+0]]
+ o0 = v2 + m0;
+ o1 = v3 + m1;
+ o1 = o1 + select(0u, 1u, o0 < v2);
+ v2 = o0;
+ v3 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v24 ^ v2;
+ xor1 = v25 ^ v3;
+ v24 = xor1;
+ v25 = xor0;
+
+ // c = c + d
+ o0 = v22 + v24;
+ o1 = v23 + v25;
+ o1 = o1 + select(0u, 1u, o0 < v22);
+ v22 = o0;
+ v23 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v12 ^ v22;
+ xor1 = v13 ^ v23;
+ v12 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v13 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v2 + v12;
+ o1 = v3 + v13;
+ o1 = o1 + select(0u, 1u, o0 < v2);
+ v2 = o0;
+ v3 = o1;
+
+ // a = a + m[sigma[r][2*i+1]]
+ o0 = v2 + m4;
+ o1 = v3 + m5;
+ o1 = o1 + select(0u, 1u, o0 < v2);
+ v2 = o0;
+ v3 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v24 ^ v2;
+ xor1 = v25 ^ v3;
+ v24 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v25 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v22 + v24;
+ o1 = v23 + v25;
+ o1 = o1 + select(0u, 1u, o0 < v22);
+ v22 = o0;
+ v23 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v12 ^ v22;
+ xor1 = v13 ^ v23;
+ v12 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v13 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=11, i=6(x2), a=v[4-5], b=v[14-15], c=v[16-17], d=v[26-27]
+ */
+
+ // a = a + b
+ o0 = v4 + v14;
+ o1 = v5 + v15;
+ o1 = o1 + select(0u, 1u, o0 < v4);
+ v4 = o0;
+ v5 = o1;
+
+ // // a = a + m[sigma[r][2*i+0]]
+ // // skip since adding 0u does nothing
+ // o0 = v4 + 0u;
+ // o1 = v5 + 0u;
+ // if (v4 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v4 = o0;
+ // v5 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v26 ^ v4;
+ xor1 = v27 ^ v5;
+ v26 = xor1;
+ v27 = xor0;
+
+ // c = c + d
+ o0 = v16 + v26;
+ o1 = v17 + v27;
+ o1 = o1 + select(0u, 1u, o0 < v16);
+ v16 = o0;
+ v17 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v14 ^ v16;
+ xor1 = v15 ^ v17;
+ v14 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v15 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v4 + v14;
+ o1 = v5 + v15;
+ o1 = o1 + select(0u, 1u, o0 < v4);
+ v4 = o0;
+ v5 = o1;
+
+ // // a = a + m[sigma[r][2*i+1]]
+ // // skip since adding 0u does nothing
+ // o0 = v4 + 0u;
+ // o1 = v5 + 0u;
+ // if (v4 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v4 = o0;
+ // v5 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v26 ^ v4;
+ xor1 = v27 ^ v5;
+ v26 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v27 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v16 + v26;
+ o1 = v17 + v27;
+ o1 = o1 + select(0u, 1u, o0 < v16);
+ v16 = o0;
+ v17 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v14 ^ v16;
+ xor1 = v15 ^ v17;
+ v14 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v15 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /**
+ * r=11, i=7(x2), a=v[6-7], b=v[8-9], c=v[18-19], d=v[28-29]
+ */
+
+ // a = a + b
+ o0 = v6 + v8;
+ o1 = v7 + v9;
+ o1 = o1 + select(0u, 1u, o0 < v6);
+ v6 = o0;
+ v7 = o1;
+
+ // // a = a + m[sigma[r][2*i+0]]
+ // // skip since adding 0u does nothing
+ // o0 = v6 + 0u;
+ // o1 = v7 + 0u;
+ // if (v6 > 0xFFFFFFFFu - 0u) {
+ // o1 = o1 + 1u;
+ // }
+ // v6 = o0;
+ // v7 = o1;
+
+ // d = rotr64(d ^ a, 32)
+ xor0 = v28 ^ v6;
+ xor1 = v29 ^ v7;
+ v28 = xor1;
+ v29 = xor0;
+
+ // c = c + d
+ o0 = v18 + v28;
+ o1 = v19 + v29;
+ o1 = o1 + select(0u, 1u, o0 < v18);
+ v18 = o0;
+ v19 = o1;
+
+ // b = rotr64(b ^ c, 24)
+ xor0 = v8 ^ v18;
+ xor1 = v9 ^ v19;
+ v8 = (xor0 >> 24u) ^ (xor1 << 8u);
+ v9 = (xor1 >> 24u) ^ (xor0 << 8u);
+
+ // a = a + b
+ o0 = v6 + v8;
+ o1 = v7 + v9;
+ o1 = o1 + select(0u, 1u, o0 < v6);
+ v6 = o0;
+ v7 = o1;
+
+ // a = a + m[sigma[r][2*i+1]]
+ o0 = v6 + m6;
+ o1 = v7 + m7;
+ o1 = o1 + select(0u, 1u, o0 < v6);
+ v6 = o0;
+ v7 = o1;
+
+ // d = rotr64(d ^ a, 16)
+ xor0 = v28 ^ v6;
+ xor1 = v29 ^ v7;
+ v28 = (xor0 >> 16u) ^ (xor1 << 16u);
+ v29 = (xor1 >> 16u) ^ (xor0 << 16u);
+
+ // c = c + d
+ o0 = v18 + v28;
+ o1 = v19 + v29;
+ o1 = o1 + select(0u, 1u, o0 < v18);
+ v18 = o0;
+ v19 = o1;
+
+ // b = rotr64(b ^ c, 63)
+ xor0 = v8 ^ v18;
+ xor1 = v9 ^ v19;
+ v8 = (xor1 >> 31u) ^ (xor0 << 1u);
+ v9 = (xor0 >> 31u) ^ (xor1 << 1u);
+
+
+
+
+
+ /****************************************************************************
+ * NONCE CHECK *
+ ****************************************************************************/
+
+ /**
+ * Set nonce if it passes the threshold and no other thread has set it
+ */
+ if ((BLAKE2B_IV32_1 ^ v1 ^ v17) > threshold && atomicLoad(&work.found) == 0u) {
+ atomicStore(&work.found, 1u);
+ work.nonce.x = m0;
+ work.nonce.y = m1;
+ }
+ return;
+}