OpenCL GPU miner
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

424 lines
17 KiB

#define RIPEMD160_IN(x) W[x]
// Round functions for RIPEMD-128 and RIPEMD-160.
#define F1(x, y, z) ((x) ^ (y) ^ (z))
#define F2(x, y, z) ((((y) ^ (z)) & (x)) ^ (z))
#define F3(x, y, z) (((x) | ~(y)) ^ (z))
#define F4(x, y, z) ((((x) ^ (y)) & (z)) ^ (y))
#define F5(x, y, z) ((x) ^ ((y) | ~(z)))
#define K11 0x00000000
#define K12 0x5A827999
#define K13 0x6ED9EBA1
#define K14 0x8F1BBCDC
#define K15 0xA953FD4E
#define K21 0x50A28BE6
#define K22 0x5C4DD124
#define K23 0x6D703EF3
#define K24 0x7A6D76E9
#define K25 0x00000000
const __constant uint RMD160_IV[5] = { 0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0 };
#define RR(a, b, c, d, e, f, s, r, k) do { \
const uint rrtmp = a + f(b, c, d) + r + k; \
a = amd_bitalign(rrtmp, rrtmp, 32U - (uint)s) + e; \
c = amd_bitalign(c, c, 32U - 10U); \
} while (0)
#define ROUND1(a, b, c, d, e, f, s, r, k) \
RR(a ## 1, b ## 1, c ## 1, d ## 1, e ## 1, f, s, r, K1 ## k)
#define ROUND2(a, b, c, d, e, f, s, r, k) \
RR(a ## 2, b ## 2, c ## 2, d ## 2, e ## 2, f, s, r, K2 ## k)
/*
* This macro defines the body for a RIPEMD-160 compression function
* implementation. The "in" parameter should evaluate, when applied to a
* numerical input parameter from 0 to 15, to an expression which yields
* the corresponding input block. The "h" parameter should evaluate to
* an array or pointer expression designating the array of 5 words which
* contains the input and output of the compression function.
*/
//#define RIPEMD160_ROUND_BODY(in, h) do { \
uint A1, B1, C1, D1, E1; \
uint A2, B2, C2, D2, E2; \
uint tmp; \
\
A1 = A2 = (h)[0]; \
B1 = B2 = (h)[1]; \
C1 = C2 = (h)[2]; \
D1 = D2 = (h)[3]; \
E1 = E2 = (h)[4]; \
\
ROUND1(A, B, C, D, E, F1, 11, (in)[ 0], 1); \
ROUND1(E, A, B, C, D, F1, 14, (in)[ 1], 1); \
ROUND1(D, E, A, B, C, F1, 15, (in)[ 2], 1); \
ROUND1(C, D, E, A, B, F1, 12, (in)[ 3], 1); \
ROUND1(B, C, D, E, A, F1, 5, (in)[ 4], 1); \
ROUND1(A, B, C, D, E, F1, 8, (in)[ 5], 1); \
ROUND1(E, A, B, C, D, F1, 7, (in)[ 6], 1); \
ROUND1(D, E, A, B, C, F1, 9, (in)[ 7], 1); \
ROUND1(C, D, E, A, B, F1, 11, (in)[ 8], 1); \
ROUND1(B, C, D, E, A, F1, 13, (in)[ 9], 1); \
ROUND1(A, B, C, D, E, F1, 14, (in)[10], 1); \
ROUND1(E, A, B, C, D, F1, 15, (in)[11], 1); \
ROUND1(D, E, A, B, C, F1, 6, (in)[12], 1); \
ROUND1(C, D, E, A, B, F1, 7, (in)[13], 1); \
ROUND1(B, C, D, E, A, F1, 9, (in)[14], 1); \
ROUND1(A, B, C, D, E, F1, 8, (in)[15], 1); \
\
ROUND1(E, A, B, C, D, F2, 7, (in)[ 7], 2); \
ROUND1(D, E, A, B, C, F2, 6, (in)[ 4], 2); \
ROUND1(C, D, E, A, B, F2, 8, (in)[13], 2); \
ROUND1(B, C, D, E, A, F2, 13, (in)[ 1], 2); \
ROUND1(A, B, C, D, E, F2, 11, (in)[10], 2); \
ROUND1(E, A, B, C, D, F2, 9, (in)[ 6], 2); \
ROUND1(D, E, A, B, C, F2, 7, (in)[15], 2); \
ROUND1(C, D, E, A, B, F2, 15, (in)[ 3], 2); \
ROUND1(B, C, D, E, A, F2, 7, (in)[12], 2); \
ROUND1(A, B, C, D, E, F2, 12, (in)[ 0], 2); \
ROUND1(E, A, B, C, D, F2, 15, (in)[ 9], 2); \
ROUND1(D, E, A, B, C, F2, 9, (in)[ 5], 2); \
ROUND1(C, D, E, A, B, F2, 11, (in)[ 2], 2); \
ROUND1(B, C, D, E, A, F2, 7, (in)[14], 2); \
ROUND1(A, B, C, D, E, F2, 13, (in)[11], 2); \
ROUND1(E, A, B, C, D, F2, 12, (in)[ 8], 2); \
\
ROUND1(D, E, A, B, C, F3, 11, (in)[ 3], 3); \
ROUND1(C, D, E, A, B, F3, 13, (in)[10], 3); \
ROUND1(B, C, D, E, A, F3, 6, (in)[14], 3); \
ROUND1(A, B, C, D, E, F3, 7, (in)[ 4], 3); \
ROUND1(E, A, B, C, D, F3, 14, (in)[ 9], 3); \
ROUND1(D, E, A, B, C, F3, 9, (in)[15], 3); \
ROUND1(C, D, E, A, B, F3, 13, (in)[ 8], 3); \
ROUND1(B, C, D, E, A, F3, 15, (in)[ 1], 3); \
ROUND1(A, B, C, D, E, F3, 14, (in)[ 2], 3); \
ROUND1(E, A, B, C, D, F3, 8, (in)[ 7], 3); \
ROUND1(D, E, A, B, C, F3, 13, (in)[ 0], 3); \
ROUND1(C, D, E, A, B, F3, 6, (in)[ 6], 3); \
ROUND1(B, C, D, E, A, F3, 5, (in)[13], 3); \
ROUND1(A, B, C, D, E, F3, 12, (in)[11], 3); \
ROUND1(E, A, B, C, D, F3, 7, (in)[ 5], 3); \
ROUND1(D, E, A, B, C, F3, 5, (in)[12], 3); \
\
ROUND1(C, D, E, A, B, F4, 11, (in)[ 1], 4); \
ROUND1(B, C, D, E, A, F4, 12, (in)[ 9], 4); \
ROUND1(A, B, C, D, E, F4, 14, (in)[11], 4); \
ROUND1(E, A, B, C, D, F4, 15, (in)[10], 4); \
ROUND1(D, E, A, B, C, F4, 14, (in)[ 0], 4); \
ROUND1(C, D, E, A, B, F4, 15, (in)[ 8], 4); \
ROUND1(B, C, D, E, A, F4, 9, (in)[12], 4); \
ROUND1(A, B, C, D, E, F4, 8, (in)[ 4], 4); \
ROUND1(E, A, B, C, D, F4, 9, (in)[13], 4); \
ROUND1(D, E, A, B, C, F4, 14, (in)[ 3], 4); \
ROUND1(C, D, E, A, B, F4, 5, (in)[ 7], 4); \
ROUND1(B, C, D, E, A, F4, 6, (in)[15], 4); \
ROUND1(A, B, C, D, E, F4, 8, (in)[14], 4); \
ROUND1(E, A, B, C, D, F4, 6, (in)[ 5], 4); \
ROUND1(D, E, A, B, C, F4, 5, (in)[ 6], 4); \
ROUND1(C, D, E, A, B, F4, 12, (in)[ 2], 4); \
\
ROUND1(B, C, D, E, A, F5, 9, (in)[ 4], 5); \
ROUND1(A, B, C, D, E, F5, 15, (in)[ 0], 5); \
ROUND1(E, A, B, C, D, F5, 5, (in)[ 5], 5); \
ROUND1(D, E, A, B, C, F5, 11, (in)[ 9], 5); \
ROUND1(C, D, E, A, B, F5, 6, (in)[ 7], 5); \
ROUND1(B, C, D, E, A, F5, 8, (in)[12], 5); \
ROUND1(A, B, C, D, E, F5, 13, (in)[ 2], 5); \
ROUND1(E, A, B, C, D, F5, 12, (in)[10], 5); \
ROUND1(D, E, A, B, C, F5, 5, (in)[14], 5); \
ROUND1(C, D, E, A, B, F5, 12, (in)[ 1], 5); \
ROUND1(B, C, D, E, A, F5, 13, (in)[ 3], 5); \
ROUND1(A, B, C, D, E, F5, 14, (in)[ 8], 5); \
ROUND1(E, A, B, C, D, F5, 11, (in)[11], 5); \
ROUND1(D, E, A, B, C, F5, 8, (in)[ 6], 5); \
ROUND1(C, D, E, A, B, F5, 5, (in)[15], 5); \
ROUND1(B, C, D, E, A, F5, 6, (in)[13], 5); \
\
ROUND2(A, B, C, D, E, F5, 8, (in)[ 5], 1); \
ROUND2(E, A, B, C, D, F5, 9, (in)[14], 1); \
ROUND2(D, E, A, B, C, F5, 9, (in)[ 7], 1); \
ROUND2(C, D, E, A, B, F5, 11, (in)[ 0], 1); \
ROUND2(B, C, D, E, A, F5, 13, (in)[ 9], 1); \
ROUND2(A, B, C, D, E, F5, 15, (in)[ 2], 1); \
ROUND2(E, A, B, C, D, F5, 15, (in)[11], 1); \
ROUND2(D, E, A, B, C, F5, 5, (in)[ 4], 1); \
ROUND2(C, D, E, A, B, F5, 7, (in)[13], 1); \
ROUND2(B, C, D, E, A, F5, 7, (in)[ 6], 1); \
ROUND2(A, B, C, D, E, F5, 8, (in)[15], 1); \
ROUND2(E, A, B, C, D, F5, 11, (in)[ 8], 1); \
ROUND2(D, E, A, B, C, F5, 14, (in)[ 1], 1); \
ROUND2(C, D, E, A, B, F5, 14, (in)[10], 1); \
ROUND2(B, C, D, E, A, F5, 12, (in)[ 3], 1); \
ROUND2(A, B, C, D, E, F5, 6, (in)[12], 1); \
\
ROUND2(E, A, B, C, D, F4, 9, (in)[ 6], 2); \
ROUND2(D, E, A, B, C, F4, 13, (in)[11], 2); \
ROUND2(C, D, E, A, B, F4, 15, (in)[ 3], 2); \
ROUND2(B, C, D, E, A, F4, 7, (in)[ 7], 2); \
ROUND2(A, B, C, D, E, F4, 12, (in)[ 0], 2); \
ROUND2(E, A, B, C, D, F4, 8, (in)[13], 2); \
ROUND2(D, E, A, B, C, F4, 9, (in)[ 5], 2); \
ROUND2(C, D, E, A, B, F4, 11, (in)[10], 2); \
ROUND2(B, C, D, E, A, F4, 7, (in)[14], 2); \
ROUND2(A, B, C, D, E, F4, 7, (in)[15], 2); \
ROUND2(E, A, B, C, D, F4, 12, (in)[ 8], 2); \
ROUND2(D, E, A, B, C, F4, 7, (in)[12], 2); \
ROUND2(C, D, E, A, B, F4, 6, (in)[ 4], 2); \
ROUND2(B, C, D, E, A, F4, 15, (in)[ 9], 2); \
ROUND2(A, B, C, D, E, F4, 13, (in)[ 1], 2); \
ROUND2(E, A, B, C, D, F4, 11, (in)[ 2], 2); \
\
ROUND2(D, E, A, B, C, F3, 9, (in)[15], 3); \
ROUND2(C, D, E, A, B, F3, 7, (in)[ 5], 3); \
ROUND2(B, C, D, E, A, F3, 15, (in)[ 1], 3); \
ROUND2(A, B, C, D, E, F3, 11, (in)[ 3], 3); \
ROUND2(E, A, B, C, D, F3, 8, (in)[ 7], 3); \
ROUND2(D, E, A, B, C, F3, 6, (in)[14], 3); \
ROUND2(C, D, E, A, B, F3, 6, (in)[ 6], 3); \
ROUND2(B, C, D, E, A, F3, 14, (in)[ 9], 3); \
ROUND2(A, B, C, D, E, F3, 12, (in)[11], 3); \
ROUND2(E, A, B, C, D, F3, 13, (in)[ 8], 3); \
ROUND2(D, E, A, B, C, F3, 5, (in)[12], 3); \
ROUND2(C, D, E, A, B, F3, 14, (in)[ 2], 3); \
ROUND2(B, C, D, E, A, F3, 13, (in)[10], 3); \
ROUND2(A, B, C, D, E, F3, 13, (in)[ 0], 3); \
ROUND2(E, A, B, C, D, F3, 7, (in)[ 4], 3); \
ROUND2(D, E, A, B, C, F3, 5, (in)[13], 3); \
\
ROUND2(C, D, E, A, B, F2, 15, (in)[ 8], 4); \
ROUND2(B, C, D, E, A, F2, 5, (in)[ 6], 4); \
ROUND2(A, B, C, D, E, F2, 8, (in)[ 4], 4); \
ROUND2(E, A, B, C, D, F2, 11, (in)[ 1], 4); \
ROUND2(D, E, A, B, C, F2, 14, (in)[ 3], 4); \
ROUND2(C, D, E, A, B, F2, 14, (in)[11], 4); \
ROUND2(B, C, D, E, A, F2, 6, (in)[15], 4); \
ROUND2(A, B, C, D, E, F2, 14, (in)[ 0], 4); \
ROUND2(E, A, B, C, D, F2, 6, (in)[ 5], 4); \
ROUND2(D, E, A, B, C, F2, 9, (in)[12], 4); \
ROUND2(C, D, E, A, B, F2, 12, (in)[ 2], 4); \
ROUND2(B, C, D, E, A, F2, 9, (in)[13], 4); \
ROUND2(A, B, C, D, E, F2, 12, (in)[ 9], 4); \
ROUND2(E, A, B, C, D, F2, 5, (in)[ 7], 4); \
ROUND2(D, E, A, B, C, F2, 15, (in)[10], 4); \
ROUND2(C, D, E, A, B, F2, 8, (in)[14], 4); \
\
ROUND2(B, C, D, E, A, F1, 8, (in)[12], 5); \
ROUND2(A, B, C, D, E, F1, 5, (in)[15], 5); \
ROUND2(E, A, B, C, D, F1, 12, (in)[10], 5); \
ROUND2(D, E, A, B, C, F1, 9, (in)[ 4], 5); \
ROUND2(C, D, E, A, B, F1, 12, (in)[ 1], 5); \
ROUND2(B, C, D, E, A, F1, 5, (in)[ 5], 5); \
ROUND2(A, B, C, D, E, F1, 14, (in)[ 8], 5); \
ROUND2(E, A, B, C, D, F1, 6, (in)[ 7], 5); \
ROUND2(D, E, A, B, C, F1, 8, (in)[ 6], 5); \
ROUND2(C, D, E, A, B, F1, 13, (in)[ 2], 5); \
ROUND2(B, C, D, E, A, F1, 6, (in)[13], 5); \
ROUND2(A, B, C, D, E, F1, 5, (in)[14], 5); \
ROUND2(E, A, B, C, D, F1, 15, (in)[ 0], 5); \
ROUND2(D, E, A, B, C, F1, 13, (in)[ 3], 5); \
ROUND2(C, D, E, A, B, F1, 11, (in)[ 9], 5); \
ROUND2(B, C, D, E, A, F1, 11, (in)[11], 5); \
\
tmp = (h)[1] + C1 + D2; \
(h)[1] = (h)[2] + D1 + E2; \
(h)[2] = (h)[3] + E1 + A2; \
(h)[3] = (h)[4] + A1 + B2; \
(h)[4] = (h)[0] + B1 + C2; \
(h)[0] = tmp; \
} while (0)
void RIPEMD160_ROUND_BODY(uint *in, uint *h)
{
uint A1, B1, C1, D1, E1;
uint A2, B2, C2, D2, E2;
uint tmp;
A1 = A2 = (h)[0];
B1 = B2 = (h)[1];
C1 = C2 = (h)[2];
D1 = D2 = (h)[3];
E1 = E2 = (h)[4];
ROUND1(A, B, C, D, E, F1, 11, (in)[ 0], 1);
ROUND1(E, A, B, C, D, F1, 14, (in)[ 1], 1);
ROUND1(D, E, A, B, C, F1, 15, (in)[ 2], 1);
ROUND1(C, D, E, A, B, F1, 12, (in)[ 3], 1);
ROUND1(B, C, D, E, A, F1, 5, (in)[ 4], 1);
ROUND1(A, B, C, D, E, F1, 8, (in)[ 5], 1);
ROUND1(E, A, B, C, D, F1, 7, (in)[ 6], 1);
ROUND1(D, E, A, B, C, F1, 9, (in)[ 7], 1);
ROUND1(C, D, E, A, B, F1, 11, (in)[ 8], 1);
ROUND1(B, C, D, E, A, F1, 13, (in)[ 9], 1);
ROUND1(A, B, C, D, E, F1, 14, (in)[10], 1);
ROUND1(E, A, B, C, D, F1, 15, (in)[11], 1);
ROUND1(D, E, A, B, C, F1, 6, (in)[12], 1);
ROUND1(C, D, E, A, B, F1, 7, (in)[13], 1);
ROUND1(B, C, D, E, A, F1, 9, (in)[14], 1);
ROUND1(A, B, C, D, E, F1, 8, (in)[15], 1);
ROUND1(E, A, B, C, D, F2, 7, (in)[ 7], 2);
ROUND1(D, E, A, B, C, F2, 6, (in)[ 4], 2);
ROUND1(C, D, E, A, B, F2, 8, (in)[13], 2);
ROUND1(B, C, D, E, A, F2, 13, (in)[ 1], 2);
ROUND1(A, B, C, D, E, F2, 11, (in)[10], 2);
ROUND1(E, A, B, C, D, F2, 9, (in)[ 6], 2);
ROUND1(D, E, A, B, C, F2, 7, (in)[15], 2);
ROUND1(C, D, E, A, B, F2, 15, (in)[ 3], 2);
ROUND1(B, C, D, E, A, F2, 7, (in)[12], 2);
ROUND1(A, B, C, D, E, F2, 12, (in)[ 0], 2);
ROUND1(E, A, B, C, D, F2, 15, (in)[ 9], 2);
ROUND1(D, E, A, B, C, F2, 9, (in)[ 5], 2);
ROUND1(C, D, E, A, B, F2, 11, (in)[ 2], 2);
ROUND1(B, C, D, E, A, F2, 7, (in)[14], 2);
ROUND1(A, B, C, D, E, F2, 13, (in)[11], 2);
ROUND1(E, A, B, C, D, F2, 12, (in)[ 8], 2);
ROUND1(D, E, A, B, C, F3, 11, (in)[ 3], 3);
ROUND1(C, D, E, A, B, F3, 13, (in)[10], 3);
ROUND1(B, C, D, E, A, F3, 6, (in)[14], 3);
ROUND1(A, B, C, D, E, F3, 7, (in)[ 4], 3);
ROUND1(E, A, B, C, D, F3, 14, (in)[ 9], 3);
ROUND1(D, E, A, B, C, F3, 9, (in)[15], 3);
ROUND1(C, D, E, A, B, F3, 13, (in)[ 8], 3);
ROUND1(B, C, D, E, A, F3, 15, (in)[ 1], 3);
ROUND1(A, B, C, D, E, F3, 14, (in)[ 2], 3);
ROUND1(E, A, B, C, D, F3, 8, (in)[ 7], 3);
ROUND1(D, E, A, B, C, F3, 13, (in)[ 0], 3);
ROUND1(C, D, E, A, B, F3, 6, (in)[ 6], 3);
ROUND1(B, C, D, E, A, F3, 5, (in)[13], 3);
ROUND1(A, B, C, D, E, F3, 12, (in)[11], 3);
ROUND1(E, A, B, C, D, F3, 7, (in)[ 5], 3);
ROUND1(D, E, A, B, C, F3, 5, (in)[12], 3);
ROUND1(C, D, E, A, B, F4, 11, (in)[ 1], 4);
ROUND1(B, C, D, E, A, F4, 12, (in)[ 9], 4);
ROUND1(A, B, C, D, E, F4, 14, (in)[11], 4);
ROUND1(E, A, B, C, D, F4, 15, (in)[10], 4);
ROUND1(D, E, A, B, C, F4, 14, (in)[ 0], 4);
ROUND1(C, D, E, A, B, F4, 15, (in)[ 8], 4);
ROUND1(B, C, D, E, A, F4, 9, (in)[12], 4);
ROUND1(A, B, C, D, E, F4, 8, (in)[ 4], 4);
ROUND1(E, A, B, C, D, F4, 9, (in)[13], 4);
ROUND1(D, E, A, B, C, F4, 14, (in)[ 3], 4);
ROUND1(C, D, E, A, B, F4, 5, (in)[ 7], 4);
ROUND1(B, C, D, E, A, F4, 6, (in)[15], 4);
ROUND1(A, B, C, D, E, F4, 8, (in)[14], 4);
ROUND1(E, A, B, C, D, F4, 6, (in)[ 5], 4);
ROUND1(D, E, A, B, C, F4, 5, (in)[ 6], 4);
ROUND1(C, D, E, A, B, F4, 12, (in)[ 2], 4);
ROUND1(B, C, D, E, A, F5, 9, (in)[ 4], 5);
ROUND1(A, B, C, D, E, F5, 15, (in)[ 0], 5);
ROUND1(E, A, B, C, D, F5, 5, (in)[ 5], 5);
ROUND1(D, E, A, B, C, F5, 11, (in)[ 9], 5);
ROUND1(C, D, E, A, B, F5, 6, (in)[ 7], 5);
ROUND1(B, C, D, E, A, F5, 8, (in)[12], 5);
ROUND1(A, B, C, D, E, F5, 13, (in)[ 2], 5);
ROUND1(E, A, B, C, D, F5, 12, (in)[10], 5);
ROUND1(D, E, A, B, C, F5, 5, (in)[14], 5);
ROUND1(C, D, E, A, B, F5, 12, (in)[ 1], 5);
ROUND1(B, C, D, E, A, F5, 13, (in)[ 3], 5);
ROUND1(A, B, C, D, E, F5, 14, (in)[ 8], 5);
ROUND1(E, A, B, C, D, F5, 11, (in)[11], 5);
ROUND1(D, E, A, B, C, F5, 8, (in)[ 6], 5);
ROUND1(C, D, E, A, B, F5, 5, (in)[15], 5);
ROUND1(B, C, D, E, A, F5, 6, (in)[13], 5);
ROUND2(A, B, C, D, E, F5, 8, (in)[ 5], 1);
ROUND2(E, A, B, C, D, F5, 9, (in)[14], 1);
ROUND2(D, E, A, B, C, F5, 9, (in)[ 7], 1);
ROUND2(C, D, E, A, B, F5, 11, (in)[ 0], 1);
ROUND2(B, C, D, E, A, F5, 13, (in)[ 9], 1);
ROUND2(A, B, C, D, E, F5, 15, (in)[ 2], 1);
ROUND2(E, A, B, C, D, F5, 15, (in)[11], 1);
ROUND2(D, E, A, B, C, F5, 5, (in)[ 4], 1);
ROUND2(C, D, E, A, B, F5, 7, (in)[13], 1);
ROUND2(B, C, D, E, A, F5, 7, (in)[ 6], 1);
ROUND2(A, B, C, D, E, F5, 8, (in)[15], 1);
ROUND2(E, A, B, C, D, F5, 11, (in)[ 8], 1);
ROUND2(D, E, A, B, C, F5, 14, (in)[ 1], 1);
ROUND2(C, D, E, A, B, F5, 14, (in)[10], 1);
ROUND2(B, C, D, E, A, F5, 12, (in)[ 3], 1);
ROUND2(A, B, C, D, E, F5, 6, (in)[12], 1);
ROUND2(E, A, B, C, D, F4, 9, (in)[ 6], 2);
ROUND2(D, E, A, B, C, F4, 13, (in)[11], 2);
ROUND2(C, D, E, A, B, F4, 15, (in)[ 3], 2);
ROUND2(B, C, D, E, A, F4, 7, (in)[ 7], 2);
ROUND2(A, B, C, D, E, F4, 12, (in)[ 0], 2);
ROUND2(E, A, B, C, D, F4, 8, (in)[13], 2);
ROUND2(D, E, A, B, C, F4, 9, (in)[ 5], 2);
ROUND2(C, D, E, A, B, F4, 11, (in)[10], 2);
ROUND2(B, C, D, E, A, F4, 7, (in)[14], 2);
ROUND2(A, B, C, D, E, F4, 7, (in)[15], 2);
ROUND2(E, A, B, C, D, F4, 12, (in)[ 8], 2);
ROUND2(D, E, A, B, C, F4, 7, (in)[12], 2);
ROUND2(C, D, E, A, B, F4, 6, (in)[ 4], 2);
ROUND2(B, C, D, E, A, F4, 15, (in)[ 9], 2);
ROUND2(A, B, C, D, E, F4, 13, (in)[ 1], 2);
ROUND2(E, A, B, C, D, F4, 11, (in)[ 2], 2);
ROUND2(D, E, A, B, C, F3, 9, (in)[15], 3);
ROUND2(C, D, E, A, B, F3, 7, (in)[ 5], 3);
ROUND2(B, C, D, E, A, F3, 15, (in)[ 1], 3);
ROUND2(A, B, C, D, E, F3, 11, (in)[ 3], 3);
ROUND2(E, A, B, C, D, F3, 8, (in)[ 7], 3);
ROUND2(D, E, A, B, C, F3, 6, (in)[14], 3);
ROUND2(C, D, E, A, B, F3, 6, (in)[ 6], 3);
ROUND2(B, C, D, E, A, F3, 14, (in)[ 9], 3);
ROUND2(A, B, C, D, E, F3, 12, (in)[11], 3);
ROUND2(E, A, B, C, D, F3, 13, (in)[ 8], 3);
ROUND2(D, E, A, B, C, F3, 5, (in)[12], 3);
ROUND2(C, D, E, A, B, F3, 14, (in)[ 2], 3);
ROUND2(B, C, D, E, A, F3, 13, (in)[10], 3);
ROUND2(A, B, C, D, E, F3, 13, (in)[ 0], 3);
ROUND2(E, A, B, C, D, F3, 7, (in)[ 4], 3);
ROUND2(D, E, A, B, C, F3, 5, (in)[13], 3);
ROUND2(C, D, E, A, B, F2, 15, (in)[ 8], 4);
ROUND2(B, C, D, E, A, F2, 5, (in)[ 6], 4);
ROUND2(A, B, C, D, E, F2, 8, (in)[ 4], 4);
ROUND2(E, A, B, C, D, F2, 11, (in)[ 1], 4);
ROUND2(D, E, A, B, C, F2, 14, (in)[ 3], 4);
ROUND2(C, D, E, A, B, F2, 14, (in)[11], 4);
ROUND2(B, C, D, E, A, F2, 6, (in)[15], 4);
ROUND2(A, B, C, D, E, F2, 14, (in)[ 0], 4);
ROUND2(E, A, B, C, D, F2, 6, (in)[ 5], 4);
ROUND2(D, E, A, B, C, F2, 9, (in)[12], 4);
ROUND2(C, D, E, A, B, F2, 12, (in)[ 2], 4);
ROUND2(B, C, D, E, A, F2, 9, (in)[13], 4);
ROUND2(A, B, C, D, E, F2, 12, (in)[ 9], 4);
ROUND2(E, A, B, C, D, F2, 5, (in)[ 7], 4);
ROUND2(D, E, A, B, C, F2, 15, (in)[10], 4);
ROUND2(C, D, E, A, B, F2, 8, (in)[14], 4);
ROUND2(B, C, D, E, A, F1, 8, (in)[12], 5);
ROUND2(A, B, C, D, E, F1, 5, (in)[15], 5);
ROUND2(E, A, B, C, D, F1, 12, (in)[10], 5);
ROUND2(D, E, A, B, C, F1, 9, (in)[ 4], 5);
ROUND2(C, D, E, A, B, F1, 12, (in)[ 1], 5);
ROUND2(B, C, D, E, A, F1, 5, (in)[ 5], 5);
ROUND2(A, B, C, D, E, F1, 14, (in)[ 8], 5);
ROUND2(E, A, B, C, D, F1, 6, (in)[ 7], 5);
ROUND2(D, E, A, B, C, F1, 8, (in)[ 6], 5);
ROUND2(C, D, E, A, B, F1, 13, (in)[ 2], 5);
ROUND2(B, C, D, E, A, F1, 6, (in)[13], 5);
ROUND2(A, B, C, D, E, F1, 5, (in)[14], 5);
ROUND2(E, A, B, C, D, F1, 15, (in)[ 0], 5);
ROUND2(D, E, A, B, C, F1, 13, (in)[ 3], 5);
ROUND2(C, D, E, A, B, F1, 11, (in)[ 9], 5);
ROUND2(B, C, D, E, A, F1, 11, (in)[11], 5);
tmp = (h)[1] + C1 + D2;
(h)[1] = (h)[2] + D1 + E2;
(h)[2] = (h)[3] + E1 + A2;
(h)[3] = (h)[4] + A1 + B2;
(h)[4] = (h)[0] + B1 + C2;
(h)[0] = tmp;
}