#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;
}