279 lines
7.4 KiB
C
279 lines
7.4 KiB
C
#include <stdint.h>
|
|
uint32_t shfl(uint32_t v, uint32_t mask) __attribute__((const));
|
|
static inline uint32_t rotl_imm(uint32_t x, unsigned n) { return (x << n) | (x >> (32u - n)); }
|
|
static inline uint32_t rotr_var(uint32_t x, uint32_t s) { s &= 31u; return s ? ((x >> s) | (x << (32u - s))) : x; }
|
|
static inline uint32_t mulhi(uint32_t a, uint32_t b) { return (uint32_t)(((uint64_t)a * (uint64_t)b) >> 32); }
|
|
void pass(uint32_t *r, uint32_t sel) {
|
|
uint32_t r0 = r[0];
|
|
uint32_t r1 = r[1];
|
|
uint32_t r2 = r[2];
|
|
uint32_t r3 = r[3];
|
|
uint32_t r4 = r[4];
|
|
uint32_t r5 = r[5];
|
|
uint32_t r6 = r[6];
|
|
uint32_t r7 = r[7];
|
|
r2 = rotl_imm(r2, 10u);
|
|
r3 = r3 + r6 + ((((sel >> 31u) & 1u) != 0u) ? 0x6ef59996u : 0xab42dc8du);
|
|
r1 = r1 ^ shfl(r0, 1u);
|
|
r1 = mulhi(r1, r6);
|
|
r4 = r4 - r0;
|
|
r1 = rotl_imm(r1, 26u);
|
|
r6 = r6 ^ shfl(r0, 1u);
|
|
r3 = r3 + r7 + ((((sel >> 5u) & 1u) != 0u) ? 0x45d3d08bu : 0xbdcc8acdu);
|
|
r1 = r6 * r3 + r1;
|
|
r6 = r6 + r1 + ((((sel >> 16u) & 1u) != 0u) ? 0xfaa09c55u : 0x35ea23dcu);
|
|
r0 = r0 ^ r5;
|
|
r7 = r7 - r4;
|
|
r0 = r0 * r7;
|
|
r3 = r3 ^ shfl(r0, 1u);
|
|
r7 = r3 * r5 + r7;
|
|
r7 = r7 - r1;
|
|
r0 = r0 ^ r1;
|
|
r1 = r1 + r3 + ((((sel >> 17u) & 1u) != 0u) ? 0x55703eb3u : 0x51b1dbfau);
|
|
r6 = r6 ^ r7;
|
|
r6 = r6 + r4 + ((((sel >> 4u) & 1u) != 0u) ? 0x3d846fabu : 0x7d55d1d3u);
|
|
r1 = rotr_var(r1, r0);
|
|
r5 = r5 ^ shfl(r1, 8u);
|
|
r1 = r1 ^ shfl(r6, 2u);
|
|
r2 = r2 * r7;
|
|
r6 = rotr_var(r6, r4);
|
|
r0 = r3 * r2 + r0;
|
|
r6 = r6 ^ r0;
|
|
r6 = r6 * r5;
|
|
r5 = rotr_var(r5, r3);
|
|
r3 = r5 * r7 + r3;
|
|
r2 = r5 * r6 + r2;
|
|
r5 = r3 * r2 + r5;
|
|
r1 = mulhi(r1, r6);
|
|
r2 = r2 ^ r3;
|
|
r5 = r5 - r6;
|
|
r2 = r2 ^ r6;
|
|
r6 = r3 * r7 + r6;
|
|
r6 = r6 ^ shfl(r0, 8u);
|
|
r4 = r4 * r6;
|
|
r1 = r1 ^ r5;
|
|
r3 = rotr_var(r3, r4);
|
|
r5 = mulhi(r5, r2);
|
|
r4 = r4 ^ shfl(r0, 8u);
|
|
r5 = rotl_imm(r5, 19u);
|
|
r0 = r7 * r2 + r0;
|
|
r3 = r3 ^ r4;
|
|
r4 = mulhi(r4, r6);
|
|
r6 = r4 * r4 + r6;
|
|
r1 = r1 ^ r0;
|
|
r1 = r1 - r7;
|
|
r4 = r4 | r1;
|
|
r1 = r5 * r6 + r1;
|
|
r5 = r5 * r6;
|
|
r4 = r4 ^ r0;
|
|
r7 = r5 * r6 + r7;
|
|
r7 = r7 ^ r1;
|
|
r2 = r2 ^ r5;
|
|
r4 = r4 ^ r0;
|
|
r2 = rotl_imm(r2, 7u);
|
|
r1 = r1 ^ shfl(r6, 1u);
|
|
r4 = rotr_var(r4, r7);
|
|
r6 = r6 ^ shfl(r5, 16u);
|
|
r5 = mulhi(r5, r6);
|
|
r2 = mulhi(r2, r4);
|
|
r6 = r6 ^ r4;
|
|
r5 = mulhi(r5, r2);
|
|
r7 = r5 * r5 + r7;
|
|
r6 = r6 ^ r4;
|
|
r3 = r3 * r5;
|
|
r4 = r4 ^ r2;
|
|
r6 = r6 * r1;
|
|
r3 = r3 ^ r0;
|
|
r3 = mulhi(r3, r5);
|
|
r6 = rotr_var(r6, r4);
|
|
r6 = r6 + r4 + ((((sel >> 31u) & 1u) != 0u) ? 0xb3b344bau : 0xe7169cecu);
|
|
r0 = r2 * r3 + r0;
|
|
r1 = r1 * r7;
|
|
r6 = mulhi(r6, r5);
|
|
r5 = r5 * r1;
|
|
r3 = r3 - r5;
|
|
r2 = rotr_var(r2, r4);
|
|
r4 = rotr_var(r4, r0);
|
|
r6 = rotr_var(r6, r5);
|
|
r5 = r5 | r2;
|
|
r7 = r7 + r0 + ((((sel >> 18u) & 1u) != 0u) ? 0x37478b4eu : 0xe94ff297u);
|
|
r3 = r3 * r0;
|
|
r7 = r7 | r0;
|
|
r4 = r5 * r2 + r4;
|
|
r0 = rotl_imm(r0, 30u);
|
|
r0 = rotl_imm(r0, 31u);
|
|
r1 = r1 - r4;
|
|
r5 = r5 ^ shfl(r0, 16u);
|
|
r5 = r5 * r1;
|
|
r3 = r3 ^ shfl(r2, 4u);
|
|
r1 = r1 | r4;
|
|
r0 = r0 * r3;
|
|
r0 = r0 ^ r7;
|
|
r0 = rotl_imm(r0, 17u);
|
|
r0 = r0 * r5;
|
|
r5 = r5 ^ r2;
|
|
r5 = r5 ^ shfl(r1, 8u);
|
|
r2 = rotl_imm(r2, 10u);
|
|
r0 = r7 * r5 + r0;
|
|
r6 = r6 * r0;
|
|
r1 = r1 * r4;
|
|
r0 = r0 ^ shfl(r5, 4u);
|
|
r0 = r0 ^ r3;
|
|
r0 = r0 + r2 + ((((sel >> 22u) & 1u) != 0u) ? 0xec1522a4u : 0x4d3100e0u);
|
|
r7 = mulhi(r7, r2);
|
|
r1 = r1 ^ shfl(r7, 16u);
|
|
r3 = r3 ^ r2;
|
|
r3 = r3 ^ shfl(r2, 8u);
|
|
r3 = r3 + r5 + ((((sel >> 31u) & 1u) != 0u) ? 0x4717d483u : 0xbeee4787u);
|
|
r3 = r3 + r1 + ((((sel >> 27u) & 1u) != 0u) ? 0xdf7dcaf8u : 0x8da9f412u);
|
|
r7 = r7 + r5 + ((((sel >> 1u) & 1u) != 0u) ? 0x412d825fu : 0xeaee5720u);
|
|
r5 = r5 + r2 + ((((sel >> 1u) & 1u) != 0u) ? 0x63b09601u : 0x6f8106d6u);
|
|
r0 = r0 ^ shfl(r4, 1u);
|
|
r1 = r1 ^ shfl(r2, 16u);
|
|
r7 = r7 - r5;
|
|
r6 = r6 + r1 + ((((sel >> 14u) & 1u) != 0u) ? 0xaf6b5726u : 0xb52b8a97u);
|
|
r0 = r3 * r5 + r0;
|
|
r7 = r7 ^ shfl(r6, 16u);
|
|
r1 = r1 ^ shfl(r0, 4u);
|
|
r7 = mulhi(r7, r5);
|
|
r0 = r2 * r5 + r0;
|
|
r7 = mulhi(r7, r2);
|
|
r7 = r7 ^ r6;
|
|
r1 = rotr_var(r1, r7);
|
|
r5 = r5 - r2;
|
|
r0 = mulhi(r0, r7);
|
|
r5 = r5 ^ r0;
|
|
r2 = mulhi(r2, r1);
|
|
r5 = r5 ^ r0;
|
|
r4 = rotr_var(r4, r1);
|
|
r0 = r0 * r7;
|
|
r3 = r3 - r6;
|
|
r5 = rotl_imm(r5, 2u);
|
|
r5 = r5 + r3 + ((((sel >> 12u) & 1u) != 0u) ? 0xbb2210d3u : 0x09216229u);
|
|
r6 = r6 + r1 + ((((sel >> 21u) & 1u) != 0u) ? 0xad65bbd1u : 0xeb49de07u);
|
|
r5 = r5 - r7;
|
|
r7 = r7 ^ r4;
|
|
r5 = r5 - r3;
|
|
r2 = r2 ^ shfl(r1, 16u);
|
|
r2 = rotl_imm(r2, 27u);
|
|
r6 = r6 * r0;
|
|
r4 = r4 ^ shfl(r0, 16u);
|
|
r1 = r1 ^ shfl(r0, 16u);
|
|
r7 = mulhi(r7, r4);
|
|
r3 = r3 ^ r0;
|
|
r1 = mulhi(r1, r4);
|
|
r3 = r3 ^ shfl(r0, 4u);
|
|
r5 = r5 ^ r4;
|
|
r3 = mulhi(r3, r4);
|
|
r4 = mulhi(r4, r6);
|
|
r6 = r6 * r2;
|
|
r1 = r1 + r0 + ((((sel >> 26u) & 1u) != 0u) ? 0x2e31e926u : 0xf7861795u);
|
|
r6 = r6 ^ shfl(r1, 4u);
|
|
r4 = r4 ^ r5;
|
|
r1 = r1 | r3;
|
|
r3 = r3 ^ r6;
|
|
r7 = r7 + r1 + ((((sel >> 21u) & 1u) != 0u) ? 0x89256dabu : 0xf8cd4602u);
|
|
r3 = rotr_var(r3, r4);
|
|
r7 = rotl_imm(r7, 5u);
|
|
r0 = r0 - r6;
|
|
r1 = r4 * r1 + r1;
|
|
r5 = r5 + r1 + ((((sel >> 9u) & 1u) != 0u) ? 0xb1a7abfdu : 0xb5230e29u);
|
|
r2 = r2 ^ shfl(r0, 2u);
|
|
r0 = r0 | r6;
|
|
r7 = rotr_var(r7, r4);
|
|
r2 = rotl_imm(r2, 19u);
|
|
r4 = r4 + r3 + ((((sel >> 22u) & 1u) != 0u) ? 0xf1e9e601u : 0xe7bded55u);
|
|
r2 = r2 * r6;
|
|
r1 = rotr_var(r1, r3);
|
|
r0 = rotr_var(r0, r7);
|
|
r7 = r7 | r2;
|
|
r4 = rotl_imm(r4, 6u);
|
|
r4 = r4 ^ r7;
|
|
r1 = r1 ^ shfl(r0, 2u);
|
|
r4 = mulhi(r4, r0);
|
|
r4 = rotr_var(r4, r6);
|
|
r5 = r5 ^ r1;
|
|
r4 = rotr_var(r4, r0);
|
|
r6 = r6 * r7;
|
|
r6 = r6 | r7;
|
|
r1 = r1 - r2;
|
|
r5 = r5 + r4 + ((((sel >> 29u) & 1u) != 0u) ? 0xee34d6e4u : 0x2eb286f6u);
|
|
r4 = r3 * r7 + r4;
|
|
r2 = r2 | r4;
|
|
r4 = r4 * r7;
|
|
r0 = r0 ^ r2;
|
|
r3 = rotl_imm(r3, 20u);
|
|
r0 = r0 ^ r2;
|
|
r2 = r2 + r6 + ((((sel >> 30u) & 1u) != 0u) ? 0xa1da063cu : 0x90fafe81u);
|
|
r6 = r6 - r0;
|
|
r6 = r0 * r1 + r6;
|
|
r3 = r3 - r2;
|
|
r7 = r7 ^ r1;
|
|
r2 = r2 | r0;
|
|
r7 = r7 + r3 + ((((sel >> 3u) & 1u) != 0u) ? 0x8467eafau : 0x994e43feu);
|
|
r1 = mulhi(r1, r6);
|
|
r1 = rotr_var(r1, r3);
|
|
r6 = r2 * r0 + r6;
|
|
r0 = r0 ^ r7;
|
|
r7 = r7 ^ shfl(r5, 8u);
|
|
r1 = r1 ^ r7;
|
|
r1 = r1 * r7;
|
|
r5 = mulhi(r5, r2);
|
|
r0 = r4 * r1 + r0;
|
|
r0 = r4 * r2 + r0;
|
|
r6 = rotr_var(r6, r3);
|
|
r0 = r0 * r1;
|
|
r5 = r5 + r6 + ((((sel >> 25u) & 1u) != 0u) ? 0x355f1374u : 0xcc44b0b7u);
|
|
r6 = r6 - r3;
|
|
r3 = r3 ^ r0;
|
|
r3 = r3 + r7 + ((((sel >> 10u) & 1u) != 0u) ? 0x9b0cb60eu : 0xb496be92u);
|
|
r3 = r3 ^ r0;
|
|
r7 = r7 - r3;
|
|
r7 = r6 * r0 + r7;
|
|
r6 = r6 * r3;
|
|
r1 = rotr_var(r1, r2);
|
|
r1 = r1 + r6 + ((((sel >> 2u) & 1u) != 0u) ? 0xcfeeb3a7u : 0x21156fcfu);
|
|
r6 = r6 + r4 + ((((sel >> 9u) & 1u) != 0u) ? 0x71594a7cu : 0xf2a294b0u);
|
|
r3 = rotr_var(r3, r4);
|
|
r6 = rotl_imm(r6, 3u);
|
|
r2 = r2 + r7 + ((((sel >> 26u) & 1u) != 0u) ? 0x38c75136u : 0x6e58b645u);
|
|
r4 = r5 * r1 + r4;
|
|
r3 = r3 - r0;
|
|
r3 = r3 ^ shfl(r1, 1u);
|
|
r7 = r2 * r4 + r7;
|
|
r7 = r7 + r0 + ((((sel >> 6u) & 1u) != 0u) ? 0x15804358u : 0x1bdd34c6u);
|
|
r3 = r5 * r6 + r3;
|
|
r7 = r7 ^ r2;
|
|
r0 = rotl_imm(r0, 18u);
|
|
r4 = rotl_imm(r4, 26u);
|
|
r6 = r6 ^ r3;
|
|
r1 = r2 * r2 + r1;
|
|
r6 = r6 ^ shfl(r0, 8u);
|
|
r0 = r0 * r3;
|
|
r3 = r3 + r2 + ((((sel >> 12u) & 1u) != 0u) ? 0xc03003e4u : 0xbe75233eu);
|
|
r0 = mulhi(r0, r4);
|
|
r2 = r2 - r5;
|
|
r0 = rotl_imm(r0, 31u);
|
|
r5 = r5 ^ shfl(r2, 2u);
|
|
r6 = r6 * r2;
|
|
r3 = r3 ^ r4;
|
|
r5 = r5 - r2;
|
|
r5 = r5 * r7;
|
|
r3 = r3 + r2 + ((((sel >> 21u) & 1u) != 0u) ? 0x89c0b922u : 0xfdc528feu);
|
|
r6 = rotl_imm(r6, 13u);
|
|
r2 = r1 * r7 + r2;
|
|
r2 = r2 * r5;
|
|
r0 = rotl_imm(r0, 12u);
|
|
r5 = r5 * r7;
|
|
r2 = r2 * r4;
|
|
r4 = r4 ^ r6;
|
|
r7 = r7 ^ shfl(r0, 4u);
|
|
r[0] = r0;
|
|
r[1] = r1;
|
|
r[2] = r2;
|
|
r[3] = r3;
|
|
r[4] = r4;
|
|
r[5] = r5;
|
|
r[6] = r6;
|
|
r[7] = r7;
|
|
}
|