Bitcoin Forum
September 26, 2017, 07:06:29 PM *
News: Latest stable version of Bitcoin Core: 0.15.0.1  [Torrent]. (New!)
 
   Home   Help Search Donate Login Register  
Pages: « 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 [16] 17 18 19 »  All
  Print  
Author Topic: [Preview] Smelter - GPU miner for WhirlpoolX (Vanillacoin)  (Read 130448 times)
verloren
Sr. Member
****
Offline Offline

Activity: 321


View Profile
March 23, 2014, 04:21:34 AM
 #301


Doesn't work on XPM.

No idea on the share hash above the target question.
1506452789
Hero Member
*
Offline Offline

Posts: 1506452789

View Profile Personal Message (Offline)

Ignore
1506452789
Reply with quote  #2

1506452789
Report to moderator
Advertised sites are not endorsed by the Bitcoin Forum. They may be unsafe, untrustworthy, or illegal in your jurisdiction. Advertise here.
1506452789
Hero Member
*
Offline Offline

Posts: 1506452789

View Profile Personal Message (Offline)

Ignore
1506452789
Reply with quote  #2

1506452789
Report to moderator
cbuchner1
Hero Member
*****
Offline Offline

Activity: 742


View Profile
March 31, 2014, 04:28:51 PM
 #302

You guys are hoping too much.

This's practically not possible. The 3 random rounds require decision making, making the algo unsuitable for GPU computation. Ever wondered why your OS doesn't run on GPU? Or Apache doesn't run on GPU?

the 3 rounds of (pseudo)random 2-way divergent branching only require a bit of stream compaction, followed by sequential execution of each of the two branches.

it's no obstacle for a skilled GPU programmer.

Christian
smolen
Hero Member
*****
Offline Offline

Activity: 525


View Profile
October 22, 2014, 01:25:43 AM
 #303

I'm publishing OpenCL code of Smelter - let's hope it will find new home in some other miner.

Blake:
Code:
#define M0 hash64[ 0]
#define M1 hash64[ 1]
#define M2 hash64[ 2]
#define M3 hash64[ 3]
#define M4 hash64[ 4]
#define M5 hash64[ 5]
#define M6 hash64[ 6]
#define M7 hash64[ 7]

M0 = BSWAP64(hash64[ 0]);
M1 = BSWAP64(hash64[ 1]);
M2 = BSWAP64(hash64[ 2]);
M3 = BSWAP64(hash64[ 3]);
M4 = BSWAP64(hash64[ 4]);
M5 = BSWAP64(hash64[ 5]);
M6 = BSWAP64(hash64[ 6]);
M7 = BSWAP64(hash64[ 7]);

V0 = 0xbb1838e7a1a34bd9ULL + (M0 ^ 0x13198A2E03707344ULL);
VC = ROTR64(0x452821E638D01177ULL ^ V0, 32);
V8 = 0x243F6A8885A308D3ULL + VC;
V4 = ROTR64(0x510E527FADE682D1ULL ^ V8, 25);
V0 += V4 + (M1 ^ 0x243F6A8885A308D3ULL);
VC = ROTR64(VC ^ V0, 16);
V8 += VC;
V4 = ROTR64(V4 ^ V8, 11);
V1 = 0x566d1711b009135aULL + (M2 ^ 0x082EFA98EC4E6C89ULL);
VD = ROTR64(0xBE5466CF34E90E6CULL ^ V1, 32);
V9 = 0x13198A2E03707344ULL + VD;
V5 = ROTR64(0x9B05688C2B3E6C1FULL ^ V9, 25);
V1 += V5 + (M3 ^ 0xA4093822299F31D0ULL);
VD = ROTR64(VD ^ V1, 16);
V9 += VD;
V5 = ROTR64(V5 ^ V9, 11);
V2 = 0x5bf2cd1ef9d6b596ULL + (M4 ^ 0xBE5466CF34E90C6CULL);
VE = ROTR64(0xC0AC29B7C97C50DDULL ^ V2, 32);
VA = 0xA4093822299F31D0ULL + VE;
V6 = ROTR64(0x1F83D9ABFB41BD6BULL ^ VA, 25);
V2 += V6 + (M5 ^ 0x452821E638D01377ULL);
VE = ROTR64(VE ^ V2, 16);
VA += VE;
V6 = ROTR64(V6 ^ VA, 11);
V3 = 0x0130c253729b586aULL + (M6 ^ 0x3F84D5B5B5470917ULL);
VF = ROTR64(0x3F84D5B5B5470917ULL ^ V3, 32);
VB = 0x082EFA98EC4E6C89ULL + VF;
V7 = ROTR64(0x5BE0CD19137E2179ULL ^ VB, 25);
V3 += V7 + (M7 ^ 0xC0AC29B7C97C50DDULL);
VF = ROTR64(VF ^ V3, 16);
VB += VF;
V7 = ROTR64(V7 ^ VB, 11);
V0 += V5 + 0x51310BA698DFB5ACULL;
VF = ROTR64(VF ^ V0, 32);
VA += VF;
V5 = ROTR64(V5 ^ VA, 25);
V0 += V5 + 0x9216D5D98979FB1BULL;
VF = ROTR64(VF ^ V0, 16);
VA += VF;
V5 = ROTR64(V5 ^ VA, 11);
V1 += V6 + 0xB8E1AFED6A267E96ULL;
VC = ROTR64(VC ^ V1, 32);
VB += VC;
V6 = ROTR64(V6 ^ VB, 25);
V1 += V6 + 0x2FFD72DBD01ADFB7ULL;
VC = ROTR64(VC ^ V1, 16);
VB += VC;
V6 = ROTR64(V6 ^ VB, 11);
V2 += V7 + 0x24A19947B3916CF7ULL;
VD = ROTR64(VD ^ V2, 32);
V8 += VD;
V7 = ROTR64(V7 ^ V8, 25);
V2 += V7 + 0xBA7C9045F12C7F98ULL;
VD = ROTR64(VD ^ V2, 16);
V8 += VD;
V7 = ROTR64(V7 ^ V8, 11);
V3 += V4 + 0x636920D871574E69ULL;
VE = ROTR64(VE ^ V3, 32);
V9 += VE;
V4 = ROTR64(V4 ^ V9, 25);
V3 += V4 + 0x0801F2E2858EFE16ULL;
VE = ROTR64(VE ^ V3, 16);
V9 += VE;
V4 = ROTR64(V4 ^ V9, 11);
V0 += V4 + 0x2FFD72DBD01ADFB7ULL;
VC = ROTR64(VC ^ V0, 32);
V8 += VC;
V4 = ROTR64(V4 ^ V8, 25);
V0 += V4 + 0x0801F2E2858EFC16ULL;
VC = ROTR64(VC ^ V0, 16);
V8 += VC;
V4 = ROTR64(V4 ^ V8, 11);
V1 += V5 + (M4 ^ 0x9216D5D98979FB1BULL);
VD = ROTR64(VD ^ V1, 32);
V9 += VD;
V5 = ROTR64(V5 ^ V9, 25);
V1 += V5 + 0xC52821E638D01377ULL;
VD = ROTR64(VD ^ V1, 16);
V9 += VD;
V5 = ROTR64(V5 ^ V9, 11);
V2 += V6 + 0x636920D871574E69ULL;
VE = ROTR64(VE ^ V2, 32);
VA += VE;
V6 = ROTR64(V6 ^ VA, 25);
V2 += V6 + 0xD1310BA698DFB7ACULL;
VE = ROTR64(VE ^ V2, 16);
VA += VE;
V6 = ROTR64(V6 ^ VA, 11);
V3 += V7 + 0xC0AC29B7C97C50DCULL;
VF = ROTR64(VF ^ V3, 32);
VB += VF;
V7 = ROTR64(V7 ^ VB, 25);
V3 += V7 + (M6 ^ 0x24A19947B3916CF7ULL);
VF = ROTR64(VF ^ V3, 16);
VB += VF;
V7 = ROTR64(V7 ^ VB, 11);
V0 += V5 + (M1 ^ 0xBA7C9045F12C7F99ULL);
VF = ROTR64(VF ^ V0, 32);
VA += VF;
V5 = ROTR64(V5 ^ VA, 25);
V0 += V5 + 0x13198A2E03707344ULL;
VF = ROTR64(VF ^ V0, 16);
VA += VF;
V5 = ROTR64(V5 ^ VA, 11);
V1 += V6 + (M0 ^ 0xA4093822299F31D0ULL);
VC = ROTR64(VC ^ V1, 32);
VB += VC;
V6 = ROTR64(V6 ^ VB, 25);
V1 += V6 + (M2 ^ 0x243F6A8885A308D3ULL);
VC = ROTR64(VC ^ V1, 16);
VB += VC;
V6 = ROTR64(V6 ^ VB, 11);
V2 += V7 + 0x3F84D5B5B5470917ULL;
VD = ROTR64(VD ^ V2, 32);
V8 += VD;
V7 = ROTR64(V7 ^ V8, 25);
V2 += V7 + (M7 ^ 0xB8E1AFED6A267E96ULL);
VD = ROTR64(VD ^ V2, 16);
V8 += VD;
V7 = ROTR64(V7 ^ V8, 11);
V3 += V4 + (M5 ^ 0x082EFA98EC4E6C89ULL);
VE = ROTR64(VE ^ V3, 32);
V9 += VE;
V4 = ROTR64(V4 ^ V9, 25);
V3 += V4 + (M3 ^ 0xBE5466CF34E90C6CULL);
VE = ROTR64(VE ^ V3, 16);
V9 += VE;
V4 = ROTR64(V4 ^ V9, 11);
V0 += V4 + 0x9216D5D98979FB1BULL;
VC = ROTR64(VC ^ V0, 32);
V8 += VC;
V4 = ROTR64(V4 ^ V8, 25);
V0 += V4 + 0x38E1AFED6A267E96ULL;
VC = ROTR64(VC ^ V0, 16);
V8 += VC;
V4 = ROTR64(V4 ^ V8, 11);
V1 += V5 + 0x243F6A8885A308D3ULL;
VD = ROTR64(VD ^ V1, 32);
V9 += VD;
V5 = ROTR64(V5 ^ V9, 25);
V1 += V5 + (M0 ^ 0xBA7C9045F12C7F99ULL);
VD = ROTR64(VD ^ V1, 16);
V9 += VD;
V5 = ROTR64(V5 ^ V9, 11);
V2 += V6 + (M5 ^ 0xA4093822299F31D0ULL);
VE = ROTR64(VE ^ V2, 32);
VA += VE;
V6 = ROTR64(V6 ^ VA, 25);
V2 += V6 + (M2 ^ 0xBE5466CF34E90C6CULL);
VE = ROTR64(VE ^ V2, 16);
VA += VE;
V6 = ROTR64(V6 ^ VA, 11);
V3 += V7 + 0x24A19947B3916EF7ULL;
VF = ROTR64(VF ^ V3, 32);
VB += VF;
V7 = ROTR64(V7 ^ VB, 25);
V3 += V7 + 0x636920D871574E68ULL;
VF = ROTR64(VF ^ V3, 16);
VB += VF;
V7 = ROTR64(V7 ^ VB, 11);
V0 += V5 + 0x0801F2E2858EFC16ULL;
VF = ROTR64(VF ^ V0, 32);
VA += VF;
V5 = ROTR64(V5 ^ VA, 25);
V0 += V5 + 0x2FFD72DBD01ADFB7ULL;
VF = ROTR64(VF ^ V0, 16);
VA += VF;
V5 = ROTR64(V5 ^ VA, 11);
V1 += V6 + (M3 ^ 0xC0AC29B7C97C50DDULL);
VC = ROTR64(VC ^ V1, 32);
VB += VC;
V6 = ROTR64(V6 ^ VB, 25);
V1 += V6 + (M6 ^ 0x082EFA98EC4E6C89ULL);
VC = ROTR64(VC ^ V1, 16);
VB += VC;
V6 = ROTR64(V6 ^ VB, 11);
V2 += V7 + (M7 ^ 0x13198A2E03707344ULL);
VD = ROTR64(VD ^ V2, 32);
V8 += VD;
V7 = ROTR64(V7 ^ V8, 25);
V2 += V7 + (M1 ^ 0x3F84D5B5B5470917ULL);
VD = ROTR64(VD ^ V2, 16);
V8 += VD;
V7 = ROTR64(V7 ^ V8, 11);
V3 += V4 + 0x452821E638D01377ULL;
VE = ROTR64(VE ^ V3, 32);
V9 += VE;
V4 = ROTR64(V4 ^ V9, 25);
V3 += V4 + (M4 ^ 0xD1310BA698DFB5ACULL);
VE = ROTR64(VE ^ V3, 16);
V9 += VE;
V4 = ROTR64(V4 ^ V9, 11);
V0 += V4 + (M7 ^ 0xD1310BA698DFB5ACULL);
VC = ROTR64(VC ^ V0, 32);
V8 += VC;
V4 = ROTR64(V4 ^ V8, 25);
V0 += V4 + 0x3F84D5B5B5470917ULL;
VC = ROTR64(VC ^ V0, 16);
V8 += VC;
V4 = ROTR64(V4 ^ V8, 11);
V1 += V5 + (M3 ^ 0x13198A2E03707344ULL);
VD = ROTR64(VD ^ V1, 32);
V9 += VD;
V5 = ROTR64(V5 ^ V9, 25);
V1 += V5 + (M1 ^ 0x082EFA98EC4E6C89ULL);
VD = ROTR64(VD ^ V1, 16);
V9 += VD;
V5 = ROTR64(V5 ^ V9, 11);
V2 += V6 + 0xBA7C9045F12C7F98ULL;
VE = ROTR64(VE ^ V2, 32);
VA += VE;
V6 = ROTR64(V6 ^ VA, 25);
V2 += V6 + 0x24A19947B3916CF7ULL;
VE = ROTR64(VE ^ V2, 16);
VA += VE;
V6 = ROTR64(V6 ^ VA, 11);
V3 += V7 + 0x0801F2E2858EFC16ULL;
VF = ROTR64(VF ^ V3, 32);
VB += VF;
V7 = ROTR64(V7 ^ VB, 25);
V3 += V7 + 0xB8E1AFED6A267E96ULL;
VF = ROTR64(VF ^ V3, 16);
VB += VF;
V7 = ROTR64(V7 ^ VB, 11);
V0 += V5 + (M2 ^ 0xC0AC29B7C97C50DDULL);
VF = ROTR64(VF ^ V0, 32);
VA += VF;
V5 = ROTR64(V5 ^ VA, 25);
V0 += V5 + (M6 ^ 0xA4093822299F31D0ULL);
VF = ROTR64(VF ^ V0, 16);
VA += VF;
V5 = ROTR64(V5 ^ VA, 11);
V1 += V6 + (M5 ^ 0x2FFD72DBD01ADFB7ULL);
VC = ROTR64(VC ^ V1, 32);
VB += VC;
V6 = ROTR64(V6 ^ VB, 25);
V1 += V6 + 0xBE5466CF34E90C6CULL;
VC = ROTR64(VC ^ V1, 16);
VB += VC;
V6 = ROTR64(V6 ^ VB, 11);
V2 += V7 + (M4 ^ 0x243F6A8885A308D3ULL);
VD = ROTR64(VD ^ V2, 32);
V8 += VD;
V7 = ROTR64(V7 ^ V8, 25);
V2 += V7 + (M0 ^ 0x452821E638D01377ULL);
VD = ROTR64(VD ^ V2, 16);
V8 += VD;
V7 = ROTR64(V7 ^ V8, 11);
V3 += V4 + 0x9216D5D98979F91BULL;
VE = ROTR64(VE ^ V3, 32);
V9 += VE;
V4 = ROTR64(V4 ^ V9, 25);
V3 += V4 + 0xE36920D871574E69ULL;
VE = ROTR64(VE ^ V3, 16);
V9 += VE;
V4 = ROTR64(V4 ^ V9, 11);
V0 += V4 + 0x243F6A8885A308D3ULL;
VC = ROTR64(VC ^ V0, 32);
V8 += VC;
V4 = ROTR64(V4 ^ V8, 25);
V0 += V4 + (M0 ^ 0xD1310BA698DFB5ACULL);
VC = ROTR64(VC ^ V0, 16);
V8 += VC;
V4 = ROTR64(V4 ^ V8, 11);
V1 += V5 + (M5 ^ 0x3F84D5B5B5470917ULL);
VD = ROTR64(VD ^ V1, 32);
V9 += VD;
V5 = ROTR64(V5 ^ V9, 25);
V1 += V5 + (M7 ^ 0xBE5466CF34E90C6CULL);
VD = ROTR64(VD ^ V1, 16);
V9 += VD;
V5 = ROTR64(V5 ^ V9, 11);
V2 += V6 + (M2 ^ 0x452821E638D01377ULL);
VE = ROTR64(VE ^ V2, 32);
VA += VE;
V6 = ROTR64(V6 ^ VA, 25);
V2 += V6 + (M4 ^ 0xA4093822299F31D0ULL);
VE = ROTR64(VE ^ V2, 16);
VA += VE;
V6 = ROTR64(V6 ^ VA, 11);
V3 += V7 + 0x636920D871574E69ULL;
VF = ROTR64(VF ^ V3, 32);
VB += VF;
V7 = ROTR64(V7 ^ VB, 25);
V3 += V7 + 0x2FFD72DBD01ADDB7ULL;
VF = ROTR64(VF ^ V3, 16);
VB += VF;
V7 = ROTR64(V7 ^ VB, 11);
V0 += V5 + 0x13198A2E03707344ULL;
VF = ROTR64(VF ^ V0, 32);
VA += VF;
V5 = ROTR64(V5 ^ VA, 25);
V0 += V5 + (M1 ^ 0x0801F2E2858EFC16ULL);
VF = ROTR64(VF ^ V0, 16);
VA += VF;
V5 = ROTR64(V5 ^ VA, 11);
V1 += V6 + 0xBA7C9045F12C7F99ULL;
VC = ROTR64(VC ^ V1, 32);
VB += VC;
V6 = ROTR64(V6 ^ VB, 25);
V1 += V6 + 0xB8E1AFED6A267E96ULL;
VC = ROTR64(VC ^ V1, 16);
VB += VC;
V6 = ROTR64(V6 ^ VB, 11);
V2 += V7 + (M6 ^ 0x9216D5D98979FB1BULL);
VD = ROTR64(VD ^ V2, 32);
V8 += VD;
V7 = ROTR64(V7 ^ V8, 25);
V2 += V7 + 0x40AC29B7C97C50DDULL;
VD = ROTR64(VD ^ V2, 16);
V8 += VD;
V7 = ROTR64(V7 ^ V8, 11);
V3 += V4 + (M3 ^ 0x24A19947B3916CF7ULL);
VE = ROTR64(VE ^ V3, 32);
V9 += VE;
V4 = ROTR64(V4 ^ V9, 25);
V3 += V4 + 0x082EFA98EC4E6C88ULL;
VE = ROTR64(VE ^ V3, 16);
V9 += VE;
V4 = ROTR64(V4 ^ V9, 11);
V0 += V4 + (M2 ^ 0xBA7C9045F12C7F99ULL);
VC = ROTR64(VC ^ V0, 32);
V8 += VC;
V4 = ROTR64(V4 ^ V8, 25);
V0 += V4 + 0xA4093822299F31D0ULL;
VC = ROTR64(VC ^ V0, 16);
V8 += VC;
V4 = ROTR64(V4 ^ V8, 11);
V1 += V5 + (M6 ^ 0x2FFD72DBD01ADFB7ULL);
VD = ROTR64(VD ^ V1, 32);
V9 += VD;
V5 = ROTR64(V5 ^ V9, 25);
V1 += V5 + 0xC0AC29B7C97C50DDULL;
VD = ROTR64(VD ^ V1, 16);
V9 += VD;
V5 = ROTR64(V5 ^ V9, 11);
V2 += V6 + (M0 ^ 0xB8E1AFED6A267E96ULL);
VE = ROTR64(VE ^ V2, 32);
VA += VE;
V6 = ROTR64(V6 ^ VA, 25);
V2 += V6 + 0x243F6A8885A308D3ULL;
VE = ROTR64(VE ^ V2, 16);
VA += VE;
V6 = ROTR64(V6 ^ VA, 11);
V3 += V7 + 0x882EFA98EC4E6C89ULL;
VF = ROTR64(VF ^ V3, 32);
VB += VF;
V7 = ROTR64(V7 ^ VB, 25);
V3 += V7 + (M3 ^ 0x9216D5D98979FB1BULL);
VF = ROTR64(VF ^ V3, 16);
VB += VF;
V7 = ROTR64(V7 ^ VB, 11);
V0 += V5 + (M4 ^ 0x24A19947B3916CF7ULL);
VF = ROTR64(VF ^ V0, 32);
VA += VF;
V5 = ROTR64(V5 ^ VA, 25);
V0 += V5 + 0x452821E638D01376ULL;
VF = ROTR64(VF ^ V0, 16);
VA += VF;
V5 = ROTR64(V5 ^ VA, 11);
V1 += V6 + (M7 ^ 0xBE5466CF34E90C6CULL);
VC = ROTR64(VC ^ V1, 32);
VB += VC;
V6 = ROTR64(V6 ^ VB, 25);
V1 += V6 + (M5 ^ 0x3F84D5B5B5470917ULL);
VC = ROTR64(VC ^ V1, 16);
VB += VC;
V6 = ROTR64(V6 ^ VB, 11);
V2 += V7 + 0x0801F2E2858EFE16ULL;
VD = ROTR64(VD ^ V2, 32);
V8 += VD;
V7 = ROTR64(V7 ^ V8, 25);
V2 += V7 + 0x636920D871574E69ULL;
VD = ROTR64(VD ^ V2, 16);
V8 += VD;
V7 = ROTR64(V7 ^ V8, 11);
V3 += V4 + (M1 ^ 0xD1310BA698DFB5ACULL);
VE = ROTR64(VE ^ V3, 32);
V9 += VE;
V4 = ROTR64(V4 ^ V9, 25);
V3 += V4 + 0x13198A2E03707344ULL;
VE = ROTR64(VE ^ V3, 16);
V9 += VE;
V4 = ROTR64(V4 ^ V9, 11);
V0 += V4 + 0xBE5466CF34E90C6CULL;
VC = ROTR64(VC ^ V0, 32);
V8 += VC;
V4 = ROTR64(V4 ^ V8, 25);
V0 += V4 + (M5 ^ 0xBA7C9045F12C7F99ULL);
VC = ROTR64(VC ^ V0, 16);
V8 += VC;
V4 = ROTR64(V4 ^ V8, 11);
V1 += V5 + (M1 ^ 0x636920D871574E69ULL);
VD = ROTR64(VD ^ V1, 32);
V9 += VD;
V5 = ROTR64(V5 ^ V9, 25);
V1 += V5 + 0x13198A2E03707144ULL;
VD = ROTR64(VD ^ V1, 16);
V9 += VD;
V5 = ROTR64(V5 ^ V9, 11);
V2 += V6 + 0x24A19947B3916CF7ULL;
VE = ROTR64(VE ^ V2, 32);
VA += VE;
V6 = ROTR64(V6 ^ VA, 25);
V2 += V6 + 0x0801F2E2858EFC17ULL;
VE = ROTR64(VE ^ V2, 16);
VA += VE;
V6 = ROTR64(V6 ^ VA, 11);
V3 += V7 + (M4 ^ 0x2FFD72DBD01ADFB7ULL);
VF = ROTR64(VF ^ V3, 32);
VB += VF;
V7 = ROTR64(V7 ^ VB, 25);
V3 += V7 + 0x452821E638D01377ULL;
VF = ROTR64(VF ^ V3, 16);
VB += VF;
V7 = ROTR64(V7 ^ VB, 11);
V0 += V5 + (M0 ^ 0x3F84D5B5B5470917ULL);
VF = ROTR64(VF ^ V0, 32);
VA += VF;
V5 = ROTR64(V5 ^ VA, 25);
V0 += V5 + (M7 ^ 0x243F6A8885A308D3ULL);
VF = ROTR64(VF ^ V0, 16);
VA += VF;
V5 = ROTR64(V5 ^ VA, 11);
V1 += V6 + (M6 ^ 0x082EFA98EC4E6C89ULL);
VC = ROTR64(VC ^ V1, 32);
VB += VC;
V6 = ROTR64(V6 ^ VB, 25);
V1 += V6 + (M3 ^ 0xC0AC29B7C97C50DDULL);
VC = ROTR64(VC ^ V1, 16);
VB += VC;
V6 = ROTR64(V6 ^ VB, 11);
V2 += V7 + 0xA4093822299F31D0ULL;
VD = ROTR64(VD ^ V2, 32);
V8 += VD;
V7 = ROTR64(V7 ^ V8, 25);
V2 += V7 + (M2 ^ 0xD1310BA698DFB5ACULL);
VD = ROTR64(VD ^ V2, 16);
V8 += VD;
V7 = ROTR64(V7 ^ V8, 11);
V3 += V4 + 0x38E1AFED6A267E96ULL;
VE = ROTR64(VE ^ V3, 32);
V9 += VE;
V4 = ROTR64(V4 ^ V9, 25);
V3 += V4 + 0x9216D5D98979FB1BULL;
VE = ROTR64(VE ^ V3, 16);
V9 += VE;
V4 = ROTR64(V4 ^ V9, 11);
V0 += V4 + 0xB8E1AFED6A267E97ULL;
VC = ROTR64(VC ^ V0, 32);
V8 += VC;
V4 = ROTR64(V4 ^ V8, 25);
V0 += V4 + 0x24A19947B3916CF7ULL;
VC = ROTR64(VC ^ V0, 16);
V8 += VC;
V4 = ROTR64(V4 ^ V8, 11);
V1 += V5 + (M7 ^ 0x0801F2E2858EFC16ULL);
VD = ROTR64(VD ^ V1, 32);
V9 += VD;
V5 = ROTR64(V5 ^ V9, 25);
V1 += V5 + 0x3F84D5B5B5470917ULL;
VD = ROTR64(VD ^ V1, 16);
V9 += VD;
V5 = ROTR64(V5 ^ V9, 11);
V2 += V6 + 0x13198A2E03707344ULL;
VE = ROTR64(VE ^ V2, 32);
VA += VE;
V6 = ROTR64(V6 ^ VA, 25);
V2 += V6 + (M1 ^ 0xBA7C9045F12C7F99ULL);
VE = ROTR64(VE ^ V2, 16);
VA += VE;
V6 = ROTR64(V6 ^ VA, 11);
V3 += V7 + (M3 ^ 0xD1310BA698DFB5ACULL);
VF = ROTR64(VF ^ V3, 32);
VB += VF;
V7 = ROTR64(V7 ^ VB, 25);
V3 += V7 + 0x082EFA98EC4E6C89ULL;
VF = ROTR64(VF ^ V3, 16);
VB += VF;
V7 = ROTR64(V7 ^ VB, 11);
V0 += V5 + (M5 ^ 0x243F6A8885A308D3ULL);
VF = ROTR64(VF ^ V0, 32);
VA += VF;
V5 = ROTR64(V5 ^ VA, 25);
V0 += V5 + (M0 ^ 0xBE5466CF34E90C6CULL);
VF = ROTR64(VF ^ V0, 16);
VA += VF;
V5 = ROTR64(V5 ^ VA, 11);
V1 += V6 + 0x452821E638D01177ULL;
VC = ROTR64(VC ^ V1, 32);
VB += VC;
V6 = ROTR64(V6 ^ VB, 25);
V1 += V6 + (M4 ^ 0x636920D871574E69ULL);
VC = ROTR64(VC ^ V1, 16);
VB += VC;
V6 = ROTR64(V6 ^ VB, 11);
V2 += V7 + 0x40AC29B7C97C50DDULL;
VD = ROTR64(VD ^ V2, 32);
V8 += VD;
V7 = ROTR64(V7 ^ V8, 25);
V2 += V7 + (M6 ^ 0x9216D5D98979FB1BULL);
VD = ROTR64(VD ^ V2, 16);
V8 += VD;
V7 = ROTR64(V7 ^ V8, 11);
V3 += V4 + (M2 ^ 0x2FFD72DBD01ADFB7ULL);
VE = ROTR64(VE ^ V3, 32);
V9 += VE;
V4 = ROTR64(V4 ^ V9, 25);
V3 += V4 + 0xA4093822299F31D0ULL;
VE = ROTR64(VE ^ V3, 16);
V9 += VE;
V4 = ROTR64(V4 ^ V9, 11);
V0 += V4 + (M6 ^ 0x636920D871574E69ULL);
VC = ROTR64(VC ^ V0, 32);
V8 += VC;
V4 = ROTR64(V4 ^ V8, 25);
V0 += V4 + 0xC0AC29B7C97C52DDULL;
VC = ROTR64(VC ^ V0, 16);
V8 += VC;
V4 = ROTR64(V4 ^ V8, 11);
V1 += V5 + 0xD1310BA698DFB5ACULL;
VD = ROTR64(VD ^ V1, 32);
V9 += VD;
V5 = ROTR64(V5 ^ V9, 25);
V1 += V5 + 0x0801F2E2858EFC16ULL;
VD = ROTR64(VD ^ V1, 16);
V9 += VD;
V5 = ROTR64(V5 ^ V9, 11);
V2 += V6 + 0x082EFA98EC4E6C89ULL;
VE = ROTR64(VE ^ V2, 32);
VA += VE;
V6 = ROTR64(V6 ^ VA, 25);
V2 += V6 + (M3 ^ 0xB8E1AFED6A267E96ULL);
VE = ROTR64(VE ^ V2, 16);
VA += VE;
V6 = ROTR64(V6 ^ VA, 11);
V3 += V7 + (M0 ^ 0x9216D5D98979FB1BULL);
VF = ROTR64(VF ^ V3, 32);
VB += VF;
V7 = ROTR64(V7 ^ VB, 25);
V3 += V7 + 0xA43F6A8885A308D3ULL;
VF = ROTR64(VF ^ V3, 16);
VB += VF;
V7 = ROTR64(V7 ^ VB, 11);
V0 += V5 + 0xA4093822299F31D0ULL;
VF = ROTR64(VF ^ V0, 32);
VA += VF;
V5 = ROTR64(V5 ^ VA, 25);
V0 += V5 + (M2 ^ 0xBA7C9045F12C7F99ULL);
VF = ROTR64(VF ^ V0, 16);
VA += VF;
V5 = ROTR64(V5 ^ VA, 11);
V1 += V6 + 0x3F84D5B5B5470916ULL;
VC = ROTR64(VC ^ V1, 32);
VB += VC;
V6 = ROTR64(V6 ^ VB, 25);
V1 += V6 + (M7 ^ 0x24A19947B3916CF7ULL);
VC = ROTR64(VC ^ V1, 16);
VB += VC;
V6 = ROTR64(V6 ^ VB, 11);
V2 += V7 + (M1 ^ 0x452821E638D01377ULL);
VD = ROTR64(VD ^ V2, 32);
V8 += VD;
V7 = ROTR64(V7 ^ V8, 25);
V2 += V7 + (M4 ^ 0x13198A2E03707344ULL);
VD = ROTR64(VD ^ V2, 16);
V8 += VD;
V7 = ROTR64(V7 ^ V8, 11);
V3 += V4 + 0xBE5466CF34E90C6CULL;
VE = ROTR64(VE ^ V3, 32);
V9 += VE;
V4 = ROTR64(V4 ^ V9, 25);
V3 += V4 + (M5 ^ 0x2FFD72DBD01ADFB7ULL);
VE = ROTR64(VE ^ V3, 16);
V9 += VE;
V4 = ROTR64(V4 ^ V9, 11);
V0 += V4 + 0xA4093822299F31D0ULL;
VC = ROTR64(VC ^ V0, 32);
V8 += VC;
V4 = ROTR64(V4 ^ V8, 25);
V0 += V4 + (M2 ^ 0x2FFD72DBD01ADFB7ULL);
VC = ROTR64(VC ^ V0, 16);
V8 += VC;
V4 = ROTR64(V4 ^ V8, 11);
V1 += V5 + 0xC52821E638D01377ULL;
VD = ROTR64(VD ^ V1, 32);
V9 += VD;
V5 = ROTR64(V5 ^ V9, 25);
V1 += V5 + (M4 ^ 0x9216D5D98979FB1BULL);
VD = ROTR64(VD ^ V1, 16);
V9 += VD;
V5 = ROTR64(V5 ^ V9, 11);
V2 += V6 + (M7 ^ 0xC0AC29B7C97C50DDULL);
VE = ROTR64(VE ^ V2, 32);
VA += VE;
V6 = ROTR64(V6 ^ VA, 25);
V2 += V6 + (M6 ^ 0x3F84D5B5B5470917ULL);
VE = ROTR64(VE ^ V2, 16);
VA += VE;
V6 = ROTR64(V6 ^ VA, 11);
V3 += V7 + (M1 ^ 0xBE5466CF34E90C6CULL);
VF = ROTR64(VF ^ V3, 32);
VB += VF;
V7 = ROTR64(V7 ^ VB, 25);
V3 += V7 + (M5 ^ 0x13198A2E03707344ULL);
VF = ROTR64(VF ^ V3, 16);
VB += VF;
V7 = ROTR64(V7 ^ VB, 11);
V0 += V5 + 0xB8E1AFED6A267C96ULL;
VF = ROTR64(VF ^ V0, 32);
VA += VF;
V5 = ROTR64(V5 ^ VA, 25);
V0 += V5 + 0x636920D871574E69ULL;
VF = ROTR64(VF ^ V0, 16);
VA += VF;
V5 = ROTR64(V5 ^ VA, 11);
V1 += V6 + 0x0801F2E2858EFC16ULL;
VC = ROTR64(VC ^ V1, 32);
VB += VC;
V6 = ROTR64(V6 ^ VB, 25);
V1 += V6 + 0xD1310BA698DFB5ACULL;
VC = ROTR64(VC ^ V1, 16);
VB += VC;
V6 = ROTR64(V6 ^ VB, 11);
V2 += V7 + (M3 ^ 0xBA7C9045F12C7F99ULL);
VD = ROTR64(VD ^ V2, 32);
V8 += VD;
V7 = ROTR64(V7 ^ V8, 25);
V2 += V7 + 0x082EFA98EC4E6C89ULL;
VD = ROTR64(VD ^ V2, 16);
V8 += VD;
V7 = ROTR64(V7 ^ V8, 11);
V3 += V4 + 0x243F6A8885A308D2ULL;
VE = ROTR64(VE ^ V3, 32);
V9 += VE;
V4 = ROTR64(V4 ^ V9, 25);
V3 += V4 + (M0 ^ 0x24A19947B3916CF7ULL);
VE = ROTR64(VE ^ V3, 16);
V9 += VE;
V4 = ROTR64(V4 ^ V9, 11);
V0 += V4 + (M0 ^ 0x13198A2E03707344ULL);
VC = ROTR64(VC ^ V0, 32);
V8 += VC;
V4 = ROTR64(V4 ^ V8, 25);
V0 += V4 + (M1 ^ 0x243F6A8885A308D3ULL);
VC = ROTR64(VC ^ V0, 16);
V8 += VC;
V4 = ROTR64(V4 ^ V8, 11);
V1 += V5 + (M2 ^ 0x082EFA98EC4E6C89ULL);
VD = ROTR64(VD ^ V1, 32);
V9 += VD;
V5 = ROTR64(V5 ^ V9, 25);
V1 += V5 + (M3 ^ 0xA4093822299F31D0ULL);
VD = ROTR64(VD ^ V1, 16);
V9 += VD;
V5 = ROTR64(V5 ^ V9, 11);
V2 += V6 + (M4 ^ 0xBE5466CF34E90C6CULL);
VE = ROTR64(VE ^ V2, 32);
VA += VE;
V6 = ROTR64(V6 ^ VA, 25);
V2 += V6 + (M5 ^ 0x452821E638D01377ULL);
VE = ROTR64(VE ^ V2, 16);
VA += VE;
V6 = ROTR64(V6 ^ VA, 11);
V3 += V7 + (M6 ^ 0x3F84D5B5B5470917ULL);
VF = ROTR64(VF ^ V3, 32);
VB += VF;
V7 = ROTR64(V7 ^ VB, 25);
V3 += V7 + (M7 ^ 0xC0AC29B7C97C50DDULL);
VF = ROTR64(VF ^ V3, 16);
VB += VF;
V7 = ROTR64(V7 ^ VB, 11);
V0 += V5 + 0x51310BA698DFB5ACULL;
VF = ROTR64(VF ^ V0, 32);
VA += VF;
V5 = ROTR64(V5 ^ VA, 25);
V0 += V5 + 0x9216D5D98979FB1BULL;
VF = ROTR64(VF ^ V0, 16);
VA += VF;
V5 = ROTR64(V5 ^ VA, 11);
V1 += V6 + 0xB8E1AFED6A267E96ULL;
VC = ROTR64(VC ^ V1, 32);
VB += VC;
V6 = ROTR64(V6 ^ VB, 25);
V1 += V6 + 0x2FFD72DBD01ADFB7ULL;
VC = ROTR64(VC ^ V1, 16);
VB += VC;
V6 = ROTR64(V6 ^ VB, 11);
V2 += V7 + 0x24A19947B3916CF7ULL;
VD = ROTR64(VD ^ V2, 32);
V8 += VD;
V7 = ROTR64(V7 ^ V8, 25);
V2 += V7 + 0xBA7C9045F12C7F98ULL;
VD = ROTR64(VD ^ V2, 16);
V8 += VD;
V7 = ROTR64(V7 ^ V8, 11);
V3 += V4 + 0x636920D871574E69ULL;
VE = ROTR64(VE ^ V3, 32);
V9 += VE;
V4 = ROTR64(V4 ^ V9, 25);
V3 += V4 + 0x0801F2E2858EFE16ULL;
VE = ROTR64(VE ^ V3, 16);
V9 += VE;
V4 = ROTR64(V4 ^ V9, 11);
V0 += V4 + 0x2FFD72DBD01ADFB7ULL;
VC = ROTR64(VC ^ V0, 32);
V8 += VC;
V4 = ROTR64(V4 ^ V8, 25);
V0 += V4 + 0x0801F2E2858EFC16ULL;
VC = ROTR64(VC ^ V0, 16);
V8 += VC;
V4 = ROTR64(V4 ^ V8, 11);
V1 += V5 + (M4 ^ 0x9216D5D98979FB1BULL);
VD = ROTR64(VD ^ V1, 32);
V9 += VD;
V5 = ROTR64(V5 ^ V9, 25);
V1 += V5 + 0xC52821E638D01377ULL;
VD = ROTR64(VD ^ V1, 16);
V9 += VD;
V5 = ROTR64(V5 ^ V9, 11);
V2 += V6 + 0x636920D871574E69ULL;
VE = ROTR64(VE ^ V2, 32);
VA += VE;
V6 = ROTR64(V6 ^ VA, 25);
V2 += V6 + 0xD1310BA698DFB7ACULL;
VE = ROTR64(VE ^ V2, 16);
VA += VE;
V6 = ROTR64(V6 ^ VA, 11);
V3 += V7 + 0xC0AC29B7C97C50DCULL;
VF = ROTR64(VF ^ V3, 32);
VB += VF;
V7 = ROTR64(V7 ^ VB, 25);
V3 += V7 + (M6 ^ 0x24A19947B3916CF7ULL);
VF = ROTR64(VF ^ V3, 16);
VB += VF;
V7 = ROTR64(V7 ^ VB, 11);
V0 += V5 + (M1 ^ 0xBA7C9045F12C7F99ULL);
VF = ROTR64(VF ^ V0, 32);
VA += VF;
V5 = ROTR64(V5 ^ VA, 25);
V0 += V5 + 0x13198A2E03707344ULL;
VF = ROTR64(VF ^ V0, 16);
VA += VF;
V5 = ROTR64(V5 ^ VA, 11);
V1 += V6 + (M0 ^ 0xA4093822299F31D0ULL);
VC = ROTR64(VC ^ V1, 32);
VB += VC;
V6 = ROTR64(V6 ^ VB, 25);
V1 += V6 + (M2 ^ 0x243F6A8885A308D3ULL);
VC = ROTR64(VC ^ V1, 16);
VB += VC;
V6 = ROTR64(V6 ^ VB, 11);
V2 += V7 + 0x3F84D5B5B5470917ULL;
VD = ROTR64(VD ^ V2, 32);
V8 += VD;
V7 = ROTR64(V7 ^ V8, 25);
V2 += V7 + (M7 ^ 0xB8E1AFED6A267E96ULL);
VD = ROTR64(VD ^ V2, 16);
V8 += VD;
V7 = ROTR64(V7 ^ V8, 11);
V3 += V4 + (M5 ^ 0x082EFA98EC4E6C89ULL);
VE = ROTR64(VE ^ V3, 32);
V9 += VE;
V4 = ROTR64(V4 ^ V9, 25);
V3 += V4 + (M3 ^ 0xBE5466CF34E90C6CULL);
VE = ROTR64(VE ^ V3, 16);
V9 += VE;
V4 = ROTR64(V4 ^ V9, 11);
V0 += V4 + 0x9216D5D98979FB1BULL;
VC = ROTR64(VC ^ V0, 32);
V8 += VC;
V4 = ROTR64(V4 ^ V8, 25);
V0 += V4 + 0x38E1AFED6A267E96ULL;
VC = ROTR64(VC ^ V0, 16);
V8 += VC;
V4 = ROTR64(V4 ^ V8, 11);
V1 += V5 + 0x243F6A8885A308D3ULL;
VD = ROTR64(VD ^ V1, 32);
V9 += VD;
V5 = ROTR64(V5 ^ V9, 25);
V1 += V5 + (M0 ^ 0xBA7C9045F12C7F99ULL);
VD = ROTR64(VD ^ V1, 16);
V9 += VD;
V5 = ROTR64(V5 ^ V9, 11);
V2 += V6 + (M5 ^ 0xA4093822299F31D0ULL);
VE = ROTR64(VE ^ V2, 32);
VA += VE;
V6 = ROTR64(V6 ^ VA, 25);
V2 += V6 + (M2 ^ 0xBE5466CF34E90C6CULL);
VE = ROTR64(VE ^ V2, 16);
VA += VE;
V6 = ROTR64(V6 ^ VA, 11);
V3 += V7 + 0x24A19947B3916EF7ULL;
VF = ROTR64(VF ^ V3, 32);
VB += VF;
V7 = ROTR64(V7 ^ VB, 25);
V3 += V7 + 0x636920D871574E68ULL;
VF = ROTR64(VF ^ V3, 16);
VB += VF;
V7 = ROTR64(V7 ^ VB, 11);
V0 += V5 + 0x0801F2E2858EFC16ULL;
VF = ROTR64(VF ^ V0, 32);
VA += VF;
V5 = ROTR64(V5 ^ VA, 25);
V0 += V5 + 0x2FFD72DBD01ADFB7ULL;
VF = ROTR64(VF ^ V0, 16);
VA += VF;
V5 = ROTR64(V5 ^ VA, 11);
V1 += V6 + (M3 ^ 0xC0AC29B7C97C50DDULL);
VC = ROTR64(VC ^ V1, 32);
VB += VC;
V6 = ROTR64(V6 ^ VB, 25);
V1 += V6 + (M6 ^ 0x082EFA98EC4E6C89ULL);
VC = ROTR64(VC ^ V1, 16);
VB += VC;
V6 = ROTR64(V6 ^ VB, 11);
V2 += V7 + (M7 ^ 0x13198A2E03707344ULL);
VD = ROTR64(VD ^ V2, 32);
V8 += VD;
V7 = ROTR64(V7 ^ V8, 25);
V2 += V7 + (M1 ^ 0x3F84D5B5B5470917ULL);
VD = ROTR64(VD ^ V2, 16);
V8 += VD;
V7 = ROTR64(V7 ^ V8, 11);
V3 += V4 + 0x452821E638D01377ULL;
VE = ROTR64(VE ^ V3, 32);
V9 += VE;
V4 = ROTR64(V4 ^ V9, 25);
V3 += V4 + (M4 ^ 0xD1310BA698DFB5ACULL);
VE = ROTR64(VE ^ V3, 16);
V9 += VE;
V4 = ROTR64(V4 ^ V9, 11);
V0 += V4 + (M7 ^ 0xD1310BA698DFB5ACULL);
VC = ROTR64(VC ^ V0, 32);
V8 += VC;
V4 = ROTR64(V4 ^ V8, 25);
V0 += V4 + 0x3F84D5B5B5470917ULL;
VC = ROTR64(VC ^ V0, 16);
V8 += VC;
V4 = ROTR64(V4 ^ V8, 11);
V1 += V5 + (M3 ^ 0x13198A2E03707344ULL);
VD = ROTR64(VD ^ V1, 32);
V9 += VD;
V5 = ROTR64(V5 ^ V9, 25);
V1 += V5 + (M1 ^ 0x082EFA98EC4E6C89ULL);
VD = ROTR64(VD ^ V1, 16);
V9 += VD;
V5 = ROTR64(V5 ^ V9, 11);
V2 += V6 + 0xBA7C9045F12C7F98ULL;
VE = ROTR64(VE ^ V2, 32);
VA += VE;
V6 = ROTR64(V6 ^ VA, 25);
V2 += V6 + 0x24A19947B3916CF7ULL;
VE = ROTR64(VE ^ V2, 16);
VA += VE;
V6 = ROTR64(V6 ^ VA, 11);
V3 += V7 + 0x0801F2E2858EFC16ULL;
VF = ROTR64(VF ^ V3, 32);
VB += VF;
V7 = ROTR64(V7 ^ VB, 25);
V3 += V7 + 0xB8E1AFED6A267E96ULL;
VF = ROTR64(VF ^ V3, 16);
VB += VF;
V7 = ROTR64(V7 ^ VB, 11);
V0 += V5 + (M2 ^ 0xC0AC29B7C97C50DDULL);
VF = ROTR64(VF ^ V0, 32);
VA += VF;
V5 = ROTR64(V5 ^ VA, 25);
V0 += V5 + (M6 ^ 0xA4093822299F31D0ULL);
VF = ROTR64(VF ^ V0, 16);
VA += VF;
V5 = ROTR64(V5 ^ VA, 11);
V1 += V6 + (M5 ^ 0x2FFD72DBD01ADFB7ULL);
VC = ROTR64(VC ^ V1, 32);
VB += VC;
V6 = ROTR64(V6 ^ VB, 25);
V1 += V6 + 0xBE5466CF34E90C6CULL;
VC = ROTR64(VC ^ V1, 16);
VB += VC;
V6 = ROTR64(V6 ^ VB, 11);
V2 += V7 + (M4 ^ 0x243F6A8885A308D3ULL);
VD = ROTR64(VD ^ V2, 32);
V8 += VD;
V7 = ROTR64(V7 ^ V8, 25);
V2 += V7 + (M0 ^ 0x452821E638D01377ULL);
VD = ROTR64(VD ^ V2, 16);
V8 += VD;
V7 = ROTR64(V7 ^ V8, 11);
V3 += V4 + 0x9216D5D98979F91BULL;
VE = ROTR64(VE ^ V3, 32);
V9 += VE;
V4 = ROTR64(V4 ^ V9, 25);
V3 += V4 + 0xE36920D871574E69ULL;
VE = ROTR64(VE ^ V3, 16);
V9 += VE;
V4 = ROTR64(V4 ^ V9, 11);
V0 += V4 + 0x243F6A8885A308D3ULL;
VC = ROTR64(VC ^ V0, 32);
V8 += VC;
V4 = ROTR64(V4 ^ V8, 25);
V0 += V4 + (M0 ^ 0xD1310BA698DFB5ACULL);
VC = ROTR64(VC ^ V0, 16);
V8 += VC;
V4 = ROTR64(V4 ^ V8, 11);
V1 += V5 + (M5 ^ 0x3F84D5B5B5470917ULL);
VD = ROTR64(VD ^ V1, 32);
V9 += VD;
V5 = ROTR64(V5 ^ V9, 25);
V1 += V5 + (M7 ^ 0xBE5466CF34E90C6CULL);
VD = ROTR64(VD ^ V1, 16);
V9 += VD;
V5 = ROTR64(V5 ^ V9, 11);
V2 += V6 + (M2 ^ 0x452821E638D01377ULL);
VE = ROTR64(VE ^ V2, 32);
VA += VE;
V6 = ROTR64(V6 ^ VA, 25);
V2 += V6 + (M4 ^ 0xA4093822299F31D0ULL);
VE = ROTR64(VE ^ V2, 16);
VA += VE;
V6 = ROTR64(V6 ^ VA, 11);
V3 += V7 + 0x636920D871574E69ULL;
VF = ROTR64(VF ^ V3, 32);
VB += VF;
V7 = ROTR64(V7 ^ VB, 25);
V3 += V7 + 0x2FFD72DBD01ADDB7ULL;
VF = ROTR64(VF ^ V3, 16);
VB += VF;
V7 = ROTR64(V7 ^ VB, 11);
V0 += V5 + 0x13198A2E03707344ULL;
VF = ROTR64(VF ^ V0, 32);
VA += VF;
V5 = ROTR64(V5 ^ VA, 25);
V0 += V5 + (M1 ^ 0x0801F2E2858EFC16ULL);
VF = ROTR64(VF ^ V0, 16);
VA += VF;
V5 = ROTR64(V5 ^ VA, 11);
V1 += V6 + 0xBA7C9045F12C7F99ULL;
VC = ROTR64(VC ^ V1, 32);
VB += VC;
V6 = ROTR64(V6 ^ VB, 25);
V1 += V6 + 0xB8E1AFED6A267E96ULL;
VC = ROTR64(VC ^ V1, 16);
VB += VC;
V6 = ROTR64(V6 ^ VB, 11);
V2 += V7 + (M6 ^ 0x9216D5D98979FB1BULL);
VD = ROTR64(VD ^ V2, 32);
V8 += VD;
V7 = ROTR64(V7 ^ V8, 25);
V2 += V7 + 0x40AC29B7C97C50DDULL;
VD = ROTR64(VD ^ V2, 16);
V8 += VD;
V7 = ROTR64(V7 ^ V8, 11);
V3 += V4 + (M3 ^ 0x24A19947B3916CF7ULL);
VE = ROTR64(VE ^ V3, 32);
V9 += VE;
V4 = ROTR64(V4 ^ V9, 25);
V3 += V4 + 0x082EFA98EC4E6C88ULL;
VE = ROTR64(VE ^ V3, 16);
V9 += VE;
V4 = ROTR64(V4 ^ V9, 11);
V0 += V4 + (M2 ^ 0xBA7C9045F12C7F99ULL);
VC = ROTR64(VC ^ V0, 32);
V8 += VC;
V4 = ROTR64(V4 ^ V8, 25);
V0 += V4 + 0xA4093822299F31D0ULL;
VC = ROTR64(VC ^ V0, 16);
V8 += VC;
V4 = ROTR64(V4 ^ V8, 11);
V1 += V5 + (M6 ^ 0x2FFD72DBD01ADFB7ULL);
VD = ROTR64(VD ^ V1, 32);
V9 += VD;
V5 = ROTR64(V5 ^ V9, 25);
V1 += V5 + 0xC0AC29B7C97C50DDULL;
VD = ROTR64(VD ^ V1, 16);
V9 += VD;
V5 = ROTR64(V5 ^ V9, 11);
V2 += V6 + (M0 ^ 0xB8E1AFED6A267E96ULL);
VE = ROTR64(VE ^ V2, 32);
VA += VE;
V6 = ROTR64(V6 ^ VA, 25);
V2 += V6 + 0x243F6A8885A308D3ULL;
VE = ROTR64(VE ^ V2, 16);
VA += VE;
V6 = ROTR64(V6 ^ VA, 11);
V3 += V7 + 0x882EFA98EC4E6C89ULL;
VF = ROTR64(VF ^ V3, 32);
VB += VF;
V7 = ROTR64(V7 ^ VB, 25);
V3 += V7 + (M3 ^ 0x9216D5D98979FB1BULL);
VF = ROTR64(VF ^ V3, 16);
VB += VF;
V7 = ROTR64(V7 ^ VB, 11);
V0 += V5 + (M4 ^ 0x24A19947B3916CF7ULL);
VF = ROTR64(VF ^ V0, 32);
VA += VF;
V5 = ROTR64(V5 ^ VA, 25);
V0 += V5 + 0x452821E638D01376ULL;
VF = ROTR64(VF ^ V0, 16);
VA += VF;
V5 = ROTR64(V5 ^ VA, 11);
V1 += V6 + (M7 ^ 0xBE5466CF34E90C6CULL);
VC = ROTR64(VC ^ V1, 32);
VB += VC;
V6 = ROTR64(V6 ^ VB, 25);
V1 += V6 + (M5 ^ 0x3F84D5B5B5470917ULL);
VC = ROTR64(VC ^ V1, 16);
VB += VC;
V6 = ROTR64(V6 ^ VB, 11);
V2 += V7 + 0x0801F2E2858EFE16ULL;
VD = ROTR64(VD ^ V2, 32);
V8 += VD;
V7 = ROTR64(V7 ^ V8, 25);
V2 += V7 + 0x636920D871574E69ULL;
VD = ROTR64(VD ^ V2, 16);
V8 += VD;
V7 = ROTR64(V7 ^ V8, 11);
V3 += V4 + (M1 ^ 0xD1310BA698DFB5ACULL);
VE = ROTR64(VE ^ V3, 32);
V9 += VE;
V4 = ROTR64(V4 ^ V9, 25);
V3 += V4 + 0x13198A2E03707344ULL;
VE = ROTR64(VE ^ V3, 16);
V9 += VE;
V4 = ROTR64(V4 ^ V9, 11);

#undef M0
#undef M1
#undef M2
#undef M3
#undef M4
#undef M5
#undef M6
#undef M7

hash64[0] = BSWAP64(V0 ^ V8 ^ 0x6A09E667F3BCC908ULL);
hash64[1] = BSWAP64(V1 ^ V9 ^ 0xBB67AE8584CAA73BULL);
hash64[2] = BSWAP64(V2 ^ VA ^ 0x3C6EF372FE94F82BULL);
hash64[3] = BSWAP64(V3 ^ VB ^ 0xA54FF53A5F1D36F1ULL);
hash64[4] = BSWAP64(V4 ^ VC ^ 0x510E527FADE682D1ULL);
hash64[5] = BSWAP64(V5 ^ VD ^ 0x9B05688C2B3E6C1FULL);
hash64[6] = BSWAP64(V6 ^ VE ^ 0x1F83D9ABFB41BD6BULL);
hash64[7] = BSWAP64(V7 ^ VF ^ 0x5BE0CD19137E2179ULL);


Of course I gave you bad advice. Good one is way out of your price range.
smolen
Hero Member
*****
Offline Offline

Activity: 525


View Profile
October 22, 2014, 01:33:33 AM
 #304

BMW:
Code:
INLINE void QuarkBMW0_64(UINT64 *hash64)
{
UINT64 bmw_h2[16];
UINT64 bmw_qt[32];
UINT64 bmw_xl, bmw_xh;
UINT64 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
UINT64 spare0, spare1;

tmp0 = ROTL64(hash64[0], 1);
tmp1 = ROTL64(hash64[1], 2);
tmp2 = ROTL64(hash64[2], 3);
tmp3 = ROTL64(hash64[3], 4);
tmp4 = ROTL64(hash64[4], 5);
tmp5 = ROTL64(hash64[5], 6);
tmp6 = ROTL64(hash64[6], 7);
tmp7 = ROTL64(hash64[7], 8);

bmw_qt[16] = 0xB8B9BABBBCBDBEBFULL ^ (0x5555555555555550ULL + tmp0 + tmp3);
bmw_qt[17] = 0xC0C1C2C3C4C5C6C7ULL ^ (0x5aaaaaaaaaaaaaa5ULL + tmp1 + tmp4);
bmw_qt[18] = 0xC8C9CACBCCCDCECFULL ^ (0x5ffffffffffffffaULL + tmp2 + tmp5);
bmw_qt[19] = 0xD0D1D2D3D4D5D6D7ULL ^ (0x655555555555554fULL + tmp3 + tmp6);
bmw_qt[20] = 0xD8D9DADBDCDDDEDFULL ^ (0x6aaaaaaaaaaaaaa4ULL + tmp4 + tmp7);
bmw_qt[21] = 0xE0E1E2E3E4E5E6E7ULL ^ (0x6ffffffffe00fff9ULL + tmp5);
bmw_qt[22] = 0xE8E9EAEBECEDEEEFULL ^ (0x755555555555554eULL + tmp6 - tmp0);
bmw_qt[23] = 0xF0F1F2F3F4F5F6F7ULL ^ (0x7aaaaaaaaaaaaaa3ULL + tmp7 - tmp1);
bmw_qt[24] = 0xF8F9FAFBFCFDFEFFULL ^ (0x800000000000fff8ULL - tmp2);
bmw_qt[25] = 0x8081828384858687ULL ^ (0x855555555555554dULL - tmp3);
bmw_qt[26] = 0x88898A8B8C8D8E8FULL ^ (0x8aaaaaaaaaaaaaa2ULL - tmp4);
bmw_qt[27] = 0x9091929394959697ULL ^ (0x8ffffffffffffff7ULL - tmp5);
bmw_qt[28] = 0x98999A9B9C9D9E9FULL ^ (0x955555555755554cULL - tmp6);
bmw_qt[29] = 0xA0A1A2A3A4A5A6A7ULL ^ (0x9aaaaaaaaaaaaaa1ULL + tmp0 - tmp7);
bmw_qt[30] = 0xA8A9AAABACADAEAFULL ^ (0x9ffffffffffefff6ULL + tmp1);
bmw_qt[31] = 0xB0B1B2B3B4B5B6B7ULL ^ (0xa55555555755554bULL + tmp2);
// free tmpX

tmp0 = hash64[0] ^ 0x8081828384858687ULL;
tmp1 = hash64[1] ^ 0x88898A8B8C8D8E8FULL;
tmp2 = hash64[2] ^ 0x9091929394959697ULL;
tmp3 = hash64[3] ^ 0x98999A9B9C9D9E9FULL;
tmp4 = hash64[4] ^ 0xA0A1A2A3A4A5A6A7ULL;
tmp5 = hash64[5] ^ 0xA8A9AAABACADAEAFULL;
tmp6 = hash64[7] ^ 0xB8B9BABBBCBDBEBFULL;
tmp7 = hash64[6] ^ 0xB0B1B2B3B4B5B6B7ULL;
spare0 = tmp4 + tmp6;
spare1 = tmp3 - tmp7;


{
UINT64 pre_01 = (0xaaadb0b3b6b9bcbdULL + tmp5 - tmp6);
bmw_qt[0] = ((pre_01 >> 1) ^ SHIFTL64(pre_01, 3) ^ ROTL64(pre_01, 4) ^ ROTL64(pre_01, 37)) + 0x88898A8B8C8D8E8FULL;
bmw_qt[16] += (bmw_qt[0] >> 1) ^ SHIFTL64(bmw_qt[0], 2) ^ ROTL64(bmw_qt[0], 13) ^ ROTL64(bmw_qt[0], 43);
}

{
UINT64 pre_02 = (0x1010101010101290ULL + tmp7);
bmw_qt[1] = ((pre_02 >> 1) ^ SHIFTL64(pre_02, 2) ^ ROTL64(pre_02, 13) ^ ROTL64(pre_02, 43)) + 0x9091929394959697ULL;
bmw_qt[16] += (bmw_qt[1] >> 2) ^ SHIFTL64(bmw_qt[1], 1) ^ ROTL64(bmw_qt[1], 19) ^ ROTL64(bmw_qt[1], 53);
bmw_qt[17] += (bmw_qt[1] >> 1) ^ SHIFTL64(bmw_qt[1], 2) ^ ROTL64(bmw_qt[1], 13) ^ ROTL64(bmw_qt[1], 43);
}

{
UINT64 pre_03 = (0xe0e1e2e3e4e5e4e7ULL + tmp0 + tmp6);
bmw_qt[2] = ((pre_03 >> 2) ^ SHIFTL64(pre_03, 1) ^ ROTL64(pre_03, 19) ^ ROTL64(pre_03, 53)) + 0x98999A9B9C9D9E9FULL;
bmw_qt[16] += (bmw_qt[2] >> 2) ^ SHIFTL64(bmw_qt[2], 2) ^ ROTL64(bmw_qt[2], 28) ^ ROTL64(bmw_qt[2], 59);
bmw_qt[17] += (bmw_qt[2] >> 2) ^ SHIFTL64(bmw_qt[2], 1) ^ ROTL64(bmw_qt[2], 19) ^ ROTL64(bmw_qt[2], 53);
bmw_qt[18] += bmw_qt[2] ;
}

{
UINT64 pre_04 = (0xd8d9dadbdcddde5fULL + tmp0 - tmp1);
bmw_qt[3] = ((pre_04 >> 2) ^ SHIFTL64(pre_04, 2) ^ ROTL64(pre_04, 28) ^ ROTL64(pre_04, 59)) + 0xA0A1A2A3A4A5A6A7ULL;
bmw_qt[16] += (bmw_qt[3] >> 1) ^ SHIFTL64(bmw_qt[3], 3) ^ ROTL64(bmw_qt[3], 4) ^ ROTL64(bmw_qt[3], 37);
bmw_qt[17] += (bmw_qt[3] >> 2) ^ SHIFTL64(bmw_qt[3], 2) ^ ROTL64(bmw_qt[3], 28) ^ ROTL64(bmw_qt[3], 59);
bmw_qt[18] += ROTL64(bmw_qt[3], 5) ;
bmw_qt[19] += bmw_qt[3] ;
}

{
UINT64 pre_05 = (0xfefdfcfbfaf9f8f9ULL + tmp1 + tmp2);
bmw_qt[4] = ((pre_05 >> 1) ^ pre_05) + 0xA8A9AAABACADAEAFULL;
bmw_qt[16] += (bmw_qt[4] >> 1) ^ SHIFTL64(bmw_qt[4], 2) ^ ROTL64(bmw_qt[4], 13) ^ ROTL64(bmw_qt[4], 43);
bmw_qt[17] += (bmw_qt[4] >> 1) ^ SHIFTL64(bmw_qt[4], 3) ^ ROTL64(bmw_qt[4], 4) ^ ROTL64(bmw_qt[4], 37);
bmw_qt[18] += bmw_qt[4] ;
bmw_qt[19] += ROTL64(bmw_qt[4], 5) ;
bmw_qt[20] += bmw_qt[4] ;
}

{
UINT64 pre_06 = (0xe8e9eaebecedecefULL + tmp3 - tmp2);
bmw_qt[5] = ((pre_06 >> 1) ^ SHIFTL64(pre_06, 3) ^ ROTL64(pre_06, 4) ^ ROTL64(pre_06, 37)) + 0xB0B1B2B3B4B5B6B7ULL;
bmw_qt[16] += (bmw_qt[5] >> 2) ^ SHIFTL64(bmw_qt[5], 1) ^ ROTL64(bmw_qt[5], 19) ^ ROTL64(bmw_qt[5], 53);
bmw_qt[17] += (bmw_qt[5] >> 1) ^ SHIFTL64(bmw_qt[5], 2) ^ ROTL64(bmw_qt[5], 13) ^ ROTL64(bmw_qt[5], 43);
bmw_qt[19] += bmw_qt[5] ;
bmw_qt[20] += ROTL64(bmw_qt[5], 5) ;
bmw_qt[21] += bmw_qt[5] ;
}

{
UINT64 pre_00 = (0x1010101010101010ULL + tmp4 - tmp0 - tmp3);
bmw_qt[6] = ((pre_00 >> 1) ^ SHIFTL64(pre_00, 2) ^ ROTL64(pre_00, 13) ^ ROTL64(pre_00, 43)) + 0xB8B9BABBBCBDBEBFULL;
bmw_qt[16] += (bmw_qt[6] >> 2) ^ SHIFTL64(bmw_qt[6], 2) ^ ROTL64(bmw_qt[6], 28) ^ ROTL64(bmw_qt[6], 59);
bmw_qt[17] += (bmw_qt[6] >> 2) ^ SHIFTL64(bmw_qt[6], 1) ^ ROTL64(bmw_qt[6], 19) ^ ROTL64(bmw_qt[6], 53);
bmw_qt[20] += bmw_qt[6] ;
bmw_qt[21] += ROTL64(bmw_qt[6], 5) ;
bmw_qt[22] += bmw_qt[6] ;
}

{
UINT64 pre_07 = (0x2e2c2a2826242222ULL + tmp1 - tmp4 - tmp5);
bmw_qt[7] = ((pre_07 >> 2) ^ SHIFTL64(pre_07, 1) ^ ROTL64(pre_07, 19) ^ ROTL64(pre_07, 53)) + 0xC0C1C2C3C4C5C6C7ULL;
bmw_qt[16] += (bmw_qt[7] >> 1) ^ SHIFTL64(bmw_qt[7], 3) ^ ROTL64(bmw_qt[7], 4) ^ ROTL64(bmw_qt[7], 37);
bmw_qt[17] += (bmw_qt[7] >> 2) ^ SHIFTL64(bmw_qt[7], 2) ^ ROTL64(bmw_qt[7], 28) ^ ROTL64(bmw_qt[7], 59);
bmw_qt[21] += bmw_qt[7] ;
bmw_qt[22] += ROTL64(bmw_qt[7], 5) ;
bmw_qt[23] += bmw_qt[7] ;
}

{
UINT64 pre_08 = (0xefefefefefeff1f0ULL + tmp2 - tmp5 - tmp7);
bmw_qt[8] = ((pre_08 >> 2) ^ SHIFTL64(pre_08, 2) ^ ROTL64(pre_08, 28) ^ ROTL64(pre_08, 59)) + 0xC8C9CACBCCCDCECFULL;
bmw_qt[16] += (bmw_qt[8] >> 1) ^ SHIFTL64(bmw_qt[8], 2) ^ ROTL64(bmw_qt[8], 13) ^ ROTL64(bmw_qt[8], 43);
bmw_qt[17] += (bmw_qt[8] >> 1) ^ SHIFTL64(bmw_qt[8], 3) ^ ROTL64(bmw_qt[8], 4) ^ ROTL64(bmw_qt[8], 37);
bmw_qt[22] += bmw_qt[8] ;
bmw_qt[23] += ROTL64(bmw_qt[8], 5) ;
bmw_qt[24] += bmw_qt[8] ;
}

{
UINT64 pre_09 = (0xF0F1F2F3F4F5F6F7ULL + tmp0 - spare1 - tmp6);
bmw_qt[9] = ((pre_09 >> 1) ^ pre_09) + 0xD0D1D2D3D4D5D6D7ULL;
bmw_qt[16] += (bmw_qt[9] >> 2) ^ SHIFTL64(bmw_qt[9], 1) ^ ROTL64(bmw_qt[9], 19) ^ ROTL64(bmw_qt[9], 53);
bmw_qt[17] += (bmw_qt[9] >> 1) ^ SHIFTL64(bmw_qt[9], 2) ^ ROTL64(bmw_qt[9], 13) ^ ROTL64(bmw_qt[9], 43);
bmw_qt[23] += bmw_qt[9] ;
bmw_qt[24] += ROTL64(bmw_qt[9], 5) ;
bmw_qt[25] += bmw_qt[9] ;
}

{
UINT64 pre_10 = (0xb9bbbdbfc1c3c346ULL - tmp1 - spare0);
bmw_qt[10] = ((pre_10 >> 1) ^ SHIFTL64(pre_10, 3) ^ ROTL64(pre_10, 4) ^ ROTL64(pre_10, 37)) + 0xD8D9DADBDCDDDEDFULL;
bmw_qt[16] += (bmw_qt[10] >> 2) ^ SHIFTL64(bmw_qt[10], 2) ^ ROTL64(bmw_qt[10], 28) ^ ROTL64(bmw_qt[10], 59);
bmw_qt[17] += (bmw_qt[10] >> 2) ^ SHIFTL64(bmw_qt[10], 1) ^ ROTL64(bmw_qt[10], 19) ^ ROTL64(bmw_qt[10], 53);
bmw_qt[24] += bmw_qt[10];
bmw_qt[25] += ROTL64(bmw_qt[10], 5);
bmw_qt[26] += bmw_qt[10];
}

{
UINT64 pre_11 = (0x898b8d8f91939516ULL - tmp0 - tmp2 - tmp5);
bmw_qt[11] = ((pre_11 >> 1) ^ SHIFTL64(pre_11, 2) ^ ROTL64(pre_11, 13) ^ ROTL64(pre_11, 43)) + 0xE0E1E2E3E4E5E6E7ULL;
bmw_qt[16] += (bmw_qt[11] >> 1) ^ SHIFTL64(bmw_qt[11], 3) ^ ROTL64(bmw_qt[11], 4) ^ ROTL64(bmw_qt[11], 37);
bmw_qt[17] += (bmw_qt[11] >> 2) ^ SHIFTL64(bmw_qt[11], 2) ^ ROTL64(bmw_qt[11], 28) ^ ROTL64(bmw_qt[11], 59);
bmw_qt[25] += bmw_qt[11];
bmw_qt[26] += ROTL64(bmw_qt[11], 5);
bmw_qt[27] += bmw_qt[11];
}

{
UINT64 pre_12 = (0x0808080808080808ULL + tmp1 + spare1);
bmw_qt[12] = ((pre_12 >> 2) ^ SHIFTL64(pre_12, 1) ^ ROTL64(pre_12, 19) ^ ROTL64(pre_12, 53)) + 0xE8E9EAEBECEDEEEFULL;
bmw_qt[16] += (bmw_qt[12] >> 1) ^ SHIFTL64(bmw_qt[12], 2) ^ ROTL64(bmw_qt[12], 13) ^ ROTL64(bmw_qt[12], 43);
bmw_qt[17] += (bmw_qt[12] >> 1) ^ SHIFTL64(bmw_qt[12], 3) ^ ROTL64(bmw_qt[12], 4) ^ ROTL64(bmw_qt[12], 37);
bmw_qt[26] += bmw_qt[12];
bmw_qt[27] += ROTL64(bmw_qt[12], 5);
bmw_qt[28] += bmw_qt[12];
}

{
UINT64 pre_13 = (0xa9abadafb1b3b5b6ULL + tmp2 + spare0);
bmw_qt[13] = ((pre_13 >> 2) ^ SHIFTL64(pre_13, 2) ^ ROTL64(pre_13, 28) ^ ROTL64(pre_13, 59)) + 0xF0F1F2F3F4F5F6F7ULL;
bmw_qt[16] += (bmw_qt[13] >> 2) ^ SHIFTL64(bmw_qt[13], 1) ^ ROTL64(bmw_qt[13], 19) ^ ROTL64(bmw_qt[13], 53);
bmw_qt[17] += (bmw_qt[13] >> 1) ^ SHIFTL64(bmw_qt[13], 2) ^ ROTL64(bmw_qt[13], 13) ^ ROTL64(bmw_qt[13], 43);
bmw_qt[27] += bmw_qt[13];
bmw_qt[28] += ROTL64(bmw_qt[13], 5);
bmw_qt[29] += bmw_qt[13];
}

{
UINT64 pre_14 = (0x0706050403020081ULL + tmp3 - tmp5);
bmw_qt[14] = ((pre_14 >> 1) ^ pre_14) + 0xF8F9FAFBFCFDFEFFULL;
bmw_qt[16] += (bmw_qt[14] >> 2) ^ SHIFTL64(bmw_qt[14], 2) ^ ROTL64(bmw_qt[14], 28) ^ ROTL64(bmw_qt[14], 59);
bmw_qt[17] += (bmw_qt[14] >> 2) ^ SHIFTL64(bmw_qt[14], 1) ^ ROTL64(bmw_qt[14], 19) ^ ROTL64(bmw_qt[14], 53);
bmw_qt[28] += bmw_qt[14];
bmw_qt[29] += ROTL64(bmw_qt[14], 5);
bmw_qt[30] += bmw_qt[14];
}

{
UINT64 pre_15 = (0x0102030405060707ULL - tmp4 - tmp7);
bmw_qt[15] = ((pre_15 >> 1) ^ SHIFTL64(pre_15, 3) ^ ROTL64(pre_15, 4) ^ ROTL64(pre_15, 37)) + 0x8081828384858687ULL;
bmw_qt[16] += (bmw_qt[15] >> 1) ^ SHIFTL64(bmw_qt[15], 3) ^ ROTL64(bmw_qt[15], 4) ^ ROTL64(bmw_qt[15], 37);
bmw_qt[17] += (bmw_qt[15] >> 2) ^ SHIFTL64(bmw_qt[15], 2) ^ ROTL64(bmw_qt[15], 28) ^ ROTL64(bmw_qt[15], 59);
bmw_qt[17] += (bmw_qt[16] >> 1) ^ SHIFTL64(bmw_qt[16], 3) ^ ROTL64(bmw_qt[16], 4) ^ ROTL64(bmw_qt[16], 37);
bmw_qt[29] += bmw_qt[15];
bmw_qt[30] += ROTL64(bmw_qt[15], 5);
bmw_qt[31] += bmw_qt[15];
bmw_qt[31] += ROTL64(bmw_qt[16], 5);
bmw_qt[30] += bmw_qt[16];
bmw_qt[31] += bmw_qt[17];
}
// free tmpX
// free spare0, spare1


bmw_qt[18] += ROTL64(bmw_qt[5] , 11) + bmw_qt[6]  + ROTL64(bmw_qt[7] , 27) + bmw_qt[8]  + ROTL64(bmw_qt[9], 32) + bmw_qt[10] + ROTL64(bmw_qt[11], 37) + bmw_qt[12] + ROTL64(bmw_qt[13], 43) + bmw_qt[14] + ROTL64(bmw_qt[15], 53) + ((bmw_qt[16] >> 1) ^ bmw_qt[16]) + ((bmw_qt[17] >> 2) ^ bmw_qt[17]);
bmw_qt[19] += ROTL64(bmw_qt[6] , 11) + bmw_qt[7]  + ROTL64(bmw_qt[8] , 27) + bmw_qt[9]  + ROTL64(bmw_qt[10], 32) + bmw_qt[11] + ROTL64(bmw_qt[12], 37) + bmw_qt[13] + ROTL64(bmw_qt[14], 43) + bmw_qt[15] + ROTL64(bmw_qt[16], 53) + ((bmw_qt[17] >> 1) ^ bmw_qt[17]) + ((bmw_qt[18] >> 2) ^ bmw_qt[18]);
bmw_qt[20] += ROTL64(bmw_qt[7] , 11) + bmw_qt[8]  + ROTL64(bmw_qt[9] , 27) + bmw_qt[10] + ROTL64(bmw_qt[11], 32) + bmw_qt[12] + ROTL64(bmw_qt[13], 37) + bmw_qt[14] + ROTL64(bmw_qt[15], 43) + bmw_qt[16] + ROTL64(bmw_qt[17], 53) + ((bmw_qt[18] >> 1) ^ bmw_qt[18]) + ((bmw_qt[19] >> 2) ^ bmw_qt[19]);
bmw_qt[21] += ROTL64(bmw_qt[8] , 11) + bmw_qt[9]  + ROTL64(bmw_qt[10], 27) + bmw_qt[11] + ROTL64(bmw_qt[12], 32) + bmw_qt[13] + ROTL64(bmw_qt[14], 37) + bmw_qt[15] + ROTL64(bmw_qt[16], 43) + bmw_qt[17] + ROTL64(bmw_qt[18], 53) + ((bmw_qt[19] >> 1) ^ bmw_qt[19]) + ((bmw_qt[20] >> 2) ^ bmw_qt[20]);
bmw_qt[22] += ROTL64(bmw_qt[9] , 11) + bmw_qt[10] + ROTL64(bmw_qt[11], 27) + bmw_qt[12] + ROTL64(bmw_qt[13], 32) + bmw_qt[14] + ROTL64(bmw_qt[15], 37) + bmw_qt[16] + ROTL64(bmw_qt[17], 43) + bmw_qt[18] + ROTL64(bmw_qt[19], 53) + ((bmw_qt[20] >> 1) ^ bmw_qt[20]) + ((bmw_qt[21] >> 2) ^ bmw_qt[21]);
bmw_qt[23] += ROTL64(bmw_qt[10], 11) + bmw_qt[11] + ROTL64(bmw_qt[12], 27) + bmw_qt[13] + ROTL64(bmw_qt[14], 32) + bmw_qt[15] + ROTL64(bmw_qt[16], 37) + bmw_qt[17] + ROTL64(bmw_qt[18], 43) + bmw_qt[19] + ROTL64(bmw_qt[20], 53) + ((bmw_qt[21] >> 1) ^ bmw_qt[21]) + ((bmw_qt[22] >> 2) ^ bmw_qt[22]);
bmw_qt[24] += ROTL64(bmw_qt[11], 11) + bmw_qt[12] + ROTL64(bmw_qt[13], 27) + bmw_qt[14] + ROTL64(bmw_qt[15], 32) + bmw_qt[16] + ROTL64(bmw_qt[17], 37) + bmw_qt[18] + ROTL64(bmw_qt[19], 43) + bmw_qt[20] + ROTL64(bmw_qt[21], 53) + ((bmw_qt[22] >> 1) ^ bmw_qt[22]) + ((bmw_qt[23] >> 2) ^ bmw_qt[23]);
bmw_qt[25] += ROTL64(bmw_qt[12], 11) + bmw_qt[13] + ROTL64(bmw_qt[14], 27) + bmw_qt[15] + ROTL64(bmw_qt[16], 32) + bmw_qt[17] + ROTL64(bmw_qt[18], 37) + bmw_qt[19] + ROTL64(bmw_qt[20], 43) + bmw_qt[21] + ROTL64(bmw_qt[22], 53) + ((bmw_qt[23] >> 1) ^ bmw_qt[23]) + ((bmw_qt[24] >> 2) ^ bmw_qt[24]);
bmw_qt[26] += ROTL64(bmw_qt[13], 11) + bmw_qt[14] + ROTL64(bmw_qt[15], 27) + bmw_qt[16] + ROTL64(bmw_qt[17], 32) + bmw_qt[18] + ROTL64(bmw_qt[19], 37) + bmw_qt[20] + ROTL64(bmw_qt[21], 43) + bmw_qt[22] + ROTL64(bmw_qt[23], 53) + ((bmw_qt[24] >> 1) ^ bmw_qt[24]) + ((bmw_qt[25] >> 2) ^ bmw_qt[25]);
bmw_qt[27] += ROTL64(bmw_qt[14], 11) + bmw_qt[15] + ROTL64(bmw_qt[16], 27) + bmw_qt[17] + ROTL64(bmw_qt[18], 32) + bmw_qt[19] + ROTL64(bmw_qt[20], 37) + bmw_qt[21] + ROTL64(bmw_qt[22], 43) + bmw_qt[23] + ROTL64(bmw_qt[24], 53) + ((bmw_qt[25] >> 1) ^ bmw_qt[25]) + ((bmw_qt[26] >> 2) ^ bmw_qt[26]);
bmw_qt[28] += ROTL64(bmw_qt[15], 11) + bmw_qt[16] + ROTL64(bmw_qt[17], 27) + bmw_qt[18] + ROTL64(bmw_qt[19], 32) + bmw_qt[20] + ROTL64(bmw_qt[21], 37) + bmw_qt[22] + ROTL64(bmw_qt[23], 43) + bmw_qt[24] + ROTL64(bmw_qt[25], 53) + ((bmw_qt[26] >> 1) ^ bmw_qt[26]) + ((bmw_qt[27] >> 2) ^ bmw_qt[27]);
bmw_qt[29] += ROTL64(bmw_qt[16], 11) + bmw_qt[17] + ROTL64(bmw_qt[18], 27) + bmw_qt[19] + ROTL64(bmw_qt[20], 32) + bmw_qt[21] + ROTL64(bmw_qt[22], 37) + bmw_qt[23] + ROTL64(bmw_qt[24], 43) + bmw_qt[25] + ROTL64(bmw_qt[26], 53) + ((bmw_qt[27] >> 1) ^ bmw_qt[27]) + ((bmw_qt[28] >> 2) ^ bmw_qt[28]);
bmw_qt[30] += ROTL64(bmw_qt[17], 11) + bmw_qt[18] + ROTL64(bmw_qt[19], 27) + bmw_qt[20] + ROTL64(bmw_qt[21], 32) + bmw_qt[22] + ROTL64(bmw_qt[23], 37) + bmw_qt[24] + ROTL64(bmw_qt[25], 43) + bmw_qt[26] + ROTL64(bmw_qt[27], 53) + ((bmw_qt[28] >> 1) ^ bmw_qt[28]) + ((bmw_qt[29] >> 2) ^ bmw_qt[29]);
bmw_qt[31] += ROTL64(bmw_qt[18], 11) + bmw_qt[19] + ROTL64(bmw_qt[20], 27) + bmw_qt[21] + ROTL64(bmw_qt[22], 32) + bmw_qt[23] + ROTL64(bmw_qt[24], 37) + bmw_qt[25] + ROTL64(bmw_qt[26], 43) + bmw_qt[27] + ROTL64(bmw_qt[28], 53) + ((bmw_qt[29] >> 1) ^ bmw_qt[29]) + ((bmw_qt[30] >> 2) ^ bmw_qt[30]);

bmw_xl = bmw_qt[16] ^ bmw_qt[17] ^ bmw_qt[18] ^ bmw_qt[19] ^ bmw_qt[20] ^ bmw_qt[21] ^ bmw_qt[22] ^ bmw_qt[23];
bmw_xh = bmw_xl ^ bmw_qt[24] ^ bmw_qt[25] ^ bmw_qt[26] ^ bmw_qt[27] ^ bmw_qt[28] ^ bmw_qt[29] ^ bmw_qt[30] ^ bmw_qt[31];

bmw_h2[0]  = ((bmw_xh <<  5) ^ (bmw_qt[16] >>  5) ^ hash64[0])
+ (bmw_xl ^ bmw_qt[24] ^ bmw_qt[0]);
bmw_h2[1]  = ((bmw_xh >>  7) ^ (bmw_qt[17] <<  8) ^ hash64[1])
+ (bmw_xl ^ bmw_qt[25] ^ bmw_qt[1]);
bmw_h2[2]  = ((bmw_xh >>  5) ^ (bmw_qt[18] <<  5) ^ hash64[2])
+ (bmw_xl ^ bmw_qt[26] ^ bmw_qt[2]);
bmw_h2[3]  = ((bmw_xh >>  1) ^ (bmw_qt[19] <<  5) ^ hash64[3])
+ (bmw_xl ^ bmw_qt[27] ^ bmw_qt[3]);
bmw_h2[4]  = ((bmw_xh >>  3) ^ (bmw_qt[20] <<  0) ^ hash64[4])
+ (bmw_xl ^ bmw_qt[28] ^ bmw_qt[4]);
bmw_h2[5]  = ((bmw_xh <<  6) ^ (bmw_qt[21] >>  6) ^ hash64[5])
+ (bmw_xl ^ bmw_qt[29] ^ bmw_qt[5]);
bmw_h2[6]  = ((bmw_xh >>  4) ^ (bmw_qt[22] <<  6) ^ hash64[6])
+ (bmw_xl ^ bmw_qt[30] ^ bmw_qt[6]);
bmw_h2[7]  = ((bmw_xh >> 11) ^ (bmw_qt[23] <<  2) ^ hash64[7])
+ (bmw_xl ^ (bmw_qt[31]) ^ bmw_qt[7]);
bmw_h2[8]  = ROTL64(bmw_h2[4],  9) + (bmw_xh ^ bmw_qt[24] ^ 0x80ULL) + ((bmw_xl << 8) ^ bmw_qt[23] ^ bmw_qt[8]);
bmw_h2[9]  = ROTL64(bmw_h2[5], 10) + (bmw_xh ^ bmw_qt[25]) + ((bmw_xl >> 6) ^ bmw_qt[16] ^ bmw_qt[9]);
bmw_h2[10] = ROTL64(bmw_h2[6], 11) + (bmw_xh ^ bmw_qt[26]) + ((bmw_xl << 6) ^ bmw_qt[17] ^ bmw_qt[10]);
bmw_h2[11] = ROTL64(bmw_h2[7], 12) + (bmw_xh ^ bmw_qt[27]) + ((bmw_xl << 4) ^ bmw_qt[18] ^ bmw_qt[11]);
bmw_h2[12] = ROTL64(bmw_h2[0], 13) + (bmw_xh ^ bmw_qt[28]) + ((bmw_xl >> 3) ^ bmw_qt[19] ^ bmw_qt[12]);
bmw_h2[13] = ROTL64(bmw_h2[1], 14) + (bmw_xh ^ bmw_qt[29]) + ((bmw_xl >> 4) ^ bmw_qt[20] ^ bmw_qt[13]);
bmw_h2[14] = ROTL64(bmw_h2[2], 15) + (bmw_xh ^ bmw_qt[30]) + ((bmw_xl >> 7) ^ bmw_qt[21] ^ bmw_qt[14]);
bmw_h2[15] = ROTL64(bmw_h2[3], 16) + (bmw_xh ^ bmw_qt[31] ^ 0x200ULL) + ((bmw_xl >> 2) ^ bmw_qt[22] ^ bmw_qt[15]);

// ======

{
UINT64 hre_00 = (bmw_h2[5] ^ 0xaaaaaaaaaaaaaaa5ULL);
UINT64 hre_01 = (bmw_h2[6] ^ 0xaaaaaaaaaaaaaaa6ULL);
UINT64 hre_02 = (bmw_h2[7] ^ 0xaaaaaaaaaaaaaaa7ULL);
UINT64 hre_03 = (bmw_h2[10] ^ 0xaaaaaaaaaaaaaaaaULL);
UINT64 hre_04 = (bmw_h2[13] ^ 0xaaaaaaaaaaaaaaadULL);
UINT64 hre_05 = (bmw_h2[14] ^ 0xaaaaaaaaaaaaaaaeULL);
UINT64 hre_06 = (bmw_h2[8] ^ 0xaaaaaaaaaaaaaaa8ULL);
UINT64 hre_07 = (bmw_h2[11] ^ 0xaaaaaaaaaaaaaaabULL);
UINT64 hre_08 = (bmw_h2[0] ^ 0xaaaaaaaaaaaaaaa0ULL);
UINT64 hre_09 = (bmw_h2[9] ^ 0xaaaaaaaaaaaaaaa9ULL);
UINT64 hre_10 = (bmw_h2[1] ^ 0xaaaaaaaaaaaaaaa1ULL);
UINT64 hre_11 = (bmw_h2[15] ^ 0xaaaaaaaaaaaaaaafULL);
UINT64 hre_12 = (bmw_h2[12] ^ 0xaaaaaaaaaaaaaaacULL);
UINT64 hre_13 = (bmw_h2[2] ^ 0xaaaaaaaaaaaaaaa2ULL);
UINT64 hre_14 = (bmw_h2[3] ^ 0xaaaaaaaaaaaaaaa3ULL);
UINT64 hre_15 = (bmw_h2[4] ^ 0xaaaaaaaaaaaaaaa4ULL);
UINT64 hl_00 = (hre_00 - hre_02 + hre_03 + hre_04 + hre_05);
UINT64 hl_01 = (hre_01 - hre_06 + hre_07 + hre_05 - hre_11);
UINT64 hl_02 = (hre_08 + hre_02 + hre_09 - hre_12 + hre_11);
UINT64 hl_03 = (hre_08 - hre_10 + hre_06 - hre_03 + hre_04);
UINT64 hl_04 = (hre_10 + hre_13 + hre_09 - hre_07 - hre_05);
UINT64 hl_05 = (hre_14 - hre_13 + hre_03 - hre_12 + hre_11);
UINT64 hl_06 = (hre_15 - hre_08 - hre_14 - hre_07 + hre_04);
UINT64 hl_07 = (hre_10 - hre_15 - hre_00 - hre_12 - hre_05);
UINT64 hl_08 = (hre_13 - hre_00 - hre_01 + hre_04 - hre_11);
UINT64 hl_09 = (hre_08 - hre_14 + hre_01 - hre_02 + hre_05);
UINT64 hl_10 = (hre_06 - hre_10 - hre_15 - hre_02 + hre_11);
UINT64 hl_11 = (hre_06 - hre_08 - hre_13 - hre_00 + hre_09);
UINT64 hl_12 = (hre_10 + hre_14 - hre_01 - hre_09 + hre_03);
UINT64 hl_13 = (hre_13 + hre_15 + hre_02 + hre_03 + hre_07);
UINT64 hl_14 = (hre_14 - hre_00 + hre_06 - hre_07 - hre_12);
UINT64 hl_15 = (hre_12 - hre_15 - hre_01 - hre_09 + hre_04);

bmw_qt[0] = ((hl_00 >> 1) ^ SHIFTL64(hl_00, 3) ^ ROTL64(hl_00, 4) ^ ROTL64(hl_00, 37)) + 0xaaaaaaaaaaaaaaa1ULL;
bmw_qt[1] = ((hl_01 >> 1) ^ SHIFTL64(hl_01, 2) ^ ROTL64(hl_01, 13) ^ ROTL64(hl_01, 43)) + 0xaaaaaaaaaaaaaaa2ULL;
bmw_qt[2] = ((hl_02 >> 2) ^ SHIFTL64(hl_02, 1) ^ ROTL64(hl_02, 19) ^ ROTL64(hl_02, 53)) + 0xaaaaaaaaaaaaaaa3ULL;
bmw_qt[3] = ((hl_03 >> 2) ^ SHIFTL64(hl_03, 2) ^ ROTL64(hl_03, 28) ^ ROTL64(hl_03, 59)) + 0xaaaaaaaaaaaaaaa4ULL;
bmw_qt[4] = ((hl_04 >> 1) ^ hl_04) + 0xaaaaaaaaaaaaaaa5ULL;
bmw_qt[5] = ((hl_05 >> 1) ^ SHIFTL64(hl_05, 3) ^ ROTL64(hl_05, 4) ^ ROTL64(hl_05, 37)) + 0xaaaaaaaaaaaaaaa6ULL;
bmw_qt[6] = ((hl_06 >> 1) ^ SHIFTL64(hl_06, 2) ^ ROTL64(hl_06, 13) ^ ROTL64(hl_06, 43)) + 0xaaaaaaaaaaaaaaa7ULL;
bmw_qt[7] = ((hl_07 >> 2) ^ SHIFTL64(hl_07, 1) ^ ROTL64(hl_07, 19) ^ ROTL64(hl_07, 53)) + 0xaaaaaaaaaaaaaaa8ULL;
bmw_qt[8] = ((hl_08 >> 2) ^ SHIFTL64(hl_08, 2) ^ ROTL64(hl_08, 28) ^ ROTL64(hl_08, 59)) + 0xaaaaaaaaaaaaaaa9ULL;
bmw_qt[9] = ((hl_09 >> 1) ^ hl_09) + 0xaaaaaaaaaaaaaaaaULL;
bmw_qt[10] = ((hl_10 >> 1) ^ SHIFTL64(hl_10, 3) ^ ROTL64(hl_10, 4) ^ ROTL64(hl_10, 37)) + 0xaaaaaaaaaaaaaaabULL;
bmw_qt[11] = ((hl_11 >> 1) ^ SHIFTL64(hl_11, 2) ^ ROTL64(hl_11, 13) ^ ROTL64(hl_11, 43)) + 0xaaaaaaaaaaaaaaacULL;
bmw_qt[12] = ((hl_12 >> 2) ^ SHIFTL64(hl_12, 1) ^ ROTL64(hl_12, 19) ^ ROTL64(hl_12, 53)) + 0xaaaaaaaaaaaaaaadULL;
bmw_qt[13] = ((hl_13 >> 2) ^ SHIFTL64(hl_13, 2) ^ ROTL64(hl_13, 28) ^ ROTL64(hl_13, 59)) + 0xaaaaaaaaaaaaaaaeULL;
bmw_qt[14] = ((hl_14 >> 1) ^ hl_14) + 0xaaaaaaaaaaaaaaafULL;
bmw_qt[15] = ((hl_15 >> 1) ^ SHIFTL64(hl_15, 3) ^ ROTL64(hl_15, 4) ^ ROTL64(hl_15, 37)) + 0xaaaaaaaaaaaaaaa0ULL;

bmw_qt[16] = (((bmw_qt[0] >> 1) ^ SHIFTL64(bmw_qt[0], 2) ^ ROTL64(bmw_qt[0], 13) ^ ROTL64(bmw_qt[0], 43)) + ((bmw_qt[1] >> 2) ^ SHIFTL64(bmw_qt[1], 1) ^ ROTL64(bmw_qt[1], 19) ^ ROTL64(bmw_qt[1], 53)) + ((bmw_qt[2] >> 2) ^ SHIFTL64(bmw_qt[2], 2) ^ ROTL64(bmw_qt[2], 28) ^ ROTL64(bmw_qt[2], 59)) + ((bmw_qt[3] >> 1) ^ SHIFTL64(bmw_qt[3], 3) ^ ROTL64(bmw_qt[3], 4) ^ ROTL64(bmw_qt[3], 37)) + ((bmw_qt[4] >> 1) ^ SHIFTL64(bmw_qt[4], 2) ^ ROTL64(bmw_qt[4], 13) ^ ROTL64(bmw_qt[4], 43)) + ((bmw_qt[5] >> 2) ^ SHIFTL64(bmw_qt[5], 1) ^ ROTL64(bmw_qt[5], 19) ^ ROTL64(bmw_qt[5], 53)) + ((bmw_qt[6] >> 2) ^ SHIFTL64(bmw_qt[6], 2) ^ ROTL64(bmw_qt[6], 28) ^ ROTL64(bmw_qt[6], 59)) + ((bmw_qt[7] >> 1) ^ SHIFTL64(bmw_qt[7], 3) ^ ROTL64(bmw_qt[7], 4) ^ ROTL64(bmw_qt[7], 37)) + ((bmw_qt[8] >> 1) ^ SHIFTL64(bmw_qt[8], 2) ^ ROTL64(bmw_qt[8], 13) ^ ROTL64(bmw_qt[8], 43)) + ((bmw_qt[9] >> 2) ^ SHIFTL64(bmw_qt[9], 1) ^ ROTL64(bmw_qt[9], 19) ^ ROTL64(bmw_qt[9], 53)) + ((bmw_qt[10] >> 2) ^ SHIFTL64(bmw_qt[10], 2) ^ ROTL64(bmw_qt[10], 28) ^ ROTL64(bmw_qt[10], 59)) + ((bmw_qt[11] >> 1) ^ SHIFTL64(bmw_qt[11], 3) ^ ROTL64(bmw_qt[11], 4) ^ ROTL64(bmw_qt[11], 37)) + ((bmw_qt[12] >> 1) ^ SHIFTL64(bmw_qt[12], 2) ^ ROTL64(bmw_qt[12], 13) ^ ROTL64(bmw_qt[12], 43)) + ((bmw_qt[13] >> 2) ^ SHIFTL64(bmw_qt[13], 1) ^ ROTL64(bmw_qt[13], 19) ^ ROTL64(bmw_qt[13], 53)) + ((bmw_qt[14] >> 2) ^ SHIFTL64(bmw_qt[14], 2) ^ ROTL64(bmw_qt[14], 28) ^ ROTL64(bmw_qt[14], 59)) + ((bmw_qt[15] >> 1) ^ SHIFTL64(bmw_qt[15], 3) ^ ROTL64(bmw_qt[15], 4) ^ ROTL64(bmw_qt[15], 37)) + ((ROTL64(bmw_h2[0], 1) + ROTL64(bmw_h2[3], 4) - ROTL64(bmw_h2[10], 11) + 0x5555555555555550ULL) ^ 0xaaaaaaaaaaaaaaa7ULL));
bmw_qt[17] = (((bmw_qt[1] >> 1) ^ SHIFTL64(bmw_qt[1], 2) ^ ROTL64(bmw_qt[1], 13) ^ ROTL64(bmw_qt[1], 43)) + ((bmw_qt[2] >> 2) ^ SHIFTL64(bmw_qt[2], 1) ^ ROTL64(bmw_qt[2], 19) ^ ROTL64(bmw_qt[2], 53)) + ((bmw_qt[3] >> 2) ^ SHIFTL64(bmw_qt[3], 2) ^ ROTL64(bmw_qt[3], 28) ^ ROTL64(bmw_qt[3], 59)) + ((bmw_qt[4] >> 1) ^ SHIFTL64(bmw_qt[4], 3) ^ ROTL64(bmw_qt[4], 4) ^ ROTL64(bmw_qt[4], 37)) + ((bmw_qt[5] >> 1) ^ SHIFTL64(bmw_qt[5], 2) ^ ROTL64(bmw_qt[5], 13) ^ ROTL64(bmw_qt[5], 43)) + ((bmw_qt[6] >> 2) ^ SHIFTL64(bmw_qt[6], 1) ^ ROTL64(bmw_qt[6], 19) ^ ROTL64(bmw_qt[6], 53)) + ((bmw_qt[7] >> 2) ^ SHIFTL64(bmw_qt[7], 2) ^ ROTL64(bmw_qt[7], 28) ^ ROTL64(bmw_qt[7], 59)) + ((bmw_qt[8] >> 1) ^ SHIFTL64(bmw_qt[8], 3) ^ ROTL64(bmw_qt[8], 4) ^ ROTL64(bmw_qt[8], 37)) + ((bmw_qt[9] >> 1) ^ SHIFTL64(bmw_qt[9], 2) ^ ROTL64(bmw_qt[9], 13) ^ ROTL64(bmw_qt[9], 43)) + ((bmw_qt[10] >> 2) ^ SHIFTL64(bmw_qt[10], 1) ^ ROTL64(bmw_qt[10], 19) ^ ROTL64(bmw_qt[10], 53)) + ((bmw_qt[11] >> 2) ^ SHIFTL64(bmw_qt[11], 2) ^ ROTL64(bmw_qt[11], 28) ^ ROTL64(bmw_qt[11], 59)) + ((bmw_qt[12] >> 1) ^ SHIFTL64(bmw_qt[12], 3) ^ ROTL64(bmw_qt[12], 4) ^ ROTL64(bmw_qt[12], 37)) + ((bmw_qt[13] >> 1) ^ SHIFTL64(bmw_qt[13], 2) ^ ROTL64(bmw_qt[13], 13) ^ ROTL64(bmw_qt[13], 43)) + ((bmw_qt[14] >> 2) ^ SHIFTL64(bmw_qt[14], 1) ^ ROTL64(bmw_qt[14], 19) ^ ROTL64(bmw_qt[14], 53)) + ((bmw_qt[15] >> 2) ^ SHIFTL64(bmw_qt[15], 2) ^ ROTL64(bmw_qt[15], 28) ^ ROTL64(bmw_qt[15], 59)) + ((bmw_qt[16] >> 1) ^ SHIFTL64(bmw_qt[16], 3) ^ ROTL64(bmw_qt[16], 4) ^ ROTL64(bmw_qt[16], 37)) + ((ROTL64(bmw_h2[1], 2) + ROTL64(bmw_h2[4], 5) - ROTL64(bmw_h2[11], 12) + 0x5aaaaaaaaaaaaaa5ULL) ^ 0xaaaaaaaaaaaaaaa8ULL));

bmw_qt[18] = (bmw_qt[2]  + ROTL64(bmw_qt[3], 5)  + bmw_qt[4]  + ROTL64(bmw_qt[5] , 11) + bmw_qt[6]  + ROTL64(bmw_qt[7] , 27) + bmw_qt[8]  + ROTL64(bmw_qt[9], 32) + bmw_qt[10] + ROTL64(bmw_qt[11], 37) + bmw_qt[12] + ROTL64(bmw_qt[13], 43) + bmw_qt[14] + ROTL64(bmw_qt[15], 53) + ((bmw_qt[16] >> 1) ^ bmw_qt[16]) + ((bmw_qt[17] >> 2) ^ bmw_qt[17]) + ((ROTL64(bmw_h2[2], 3) + ROTL64(bmw_h2[5], 6) - ROTL64(bmw_h2[12], 13) + 0x5ffffffffffffffaULL) ^ 0xaaaaaaaaaaaaaaa9ULL));
bmw_qt[19] = (bmw_qt[3]  + ROTL64(bmw_qt[4], 5)  + bmw_qt[5]  + ROTL64(bmw_qt[6] , 11) + bmw_qt[7]  + ROTL64(bmw_qt[8] , 27) + bmw_qt[9]  + ROTL64(bmw_qt[10], 32) + bmw_qt[11] + ROTL64(bmw_qt[12], 37) + bmw_qt[13] + ROTL64(bmw_qt[14], 43) + bmw_qt[15] + ROTL64(bmw_qt[16], 53) + ((bmw_qt[17] >> 1) ^ bmw_qt[17]) + ((bmw_qt[18] >> 2) ^ bmw_qt[18]) + ((ROTL64(bmw_h2[3], 4) + ROTL64(bmw_h2[6], 7) - ROTL64(bmw_h2[13], 14) + 0x655555555555554fULL) ^ 0xaaaaaaaaaaaaaaaaULL));
bmw_qt[20] = (bmw_qt[4]  + ROTL64(bmw_qt[5], 5)  + bmw_qt[6]  + ROTL64(bmw_qt[7] , 11) + bmw_qt[8]  + ROTL64(bmw_qt[9] , 27) + bmw_qt[10] + ROTL64(bmw_qt[11], 32) + bmw_qt[12] + ROTL64(bmw_qt[13], 37) + bmw_qt[14] + ROTL64(bmw_qt[15], 43) + bmw_qt[16] + ROTL64(bmw_qt[17], 53) + ((bmw_qt[18] >> 1) ^ bmw_qt[18]) + ((bmw_qt[19] >> 2) ^ bmw_qt[19]) + ((ROTL64(bmw_h2[4], 5) + ROTL64(bmw_h2[7], 8) - ROTL64(bmw_h2[14], 15) + 0x6aaaaaaaaaaaaaa4ULL) ^ 0xaaaaaaaaaaaaaaabULL));
bmw_qt[21] = (bmw_qt[5]  + ROTL64(bmw_qt[6], 5)  + bmw_qt[7]  + ROTL64(bmw_qt[8] , 11) + bmw_qt[9]  + ROTL64(bmw_qt[10], 27) + bmw_qt[11] + ROTL64(bmw_qt[12], 32) + bmw_qt[13] + ROTL64(bmw_qt[14], 37) + bmw_qt[15] + ROTL64(bmw_qt[16], 43) + bmw_qt[17] + ROTL64(bmw_qt[18], 53) + ((bmw_qt[19] >> 1) ^ bmw_qt[19]) + ((bmw_qt[20] >> 2) ^ bmw_qt[20]) + ((ROTL64(bmw_h2[5], 6) + ROTL64(bmw_h2[8], 9) - ROTL64(bmw_h2[15], 16) + 0x6ffffffffffffff9ULL) ^ 0xaaaaaaaaaaaaaaacULL));
bmw_qt[22] = (bmw_qt[6]  + ROTL64(bmw_qt[7], 5)  + bmw_qt[8]  + ROTL64(bmw_qt[9] , 11) + bmw_qt[10] + ROTL64(bmw_qt[11], 27) + bmw_qt[12] + ROTL64(bmw_qt[13], 32) + bmw_qt[14] + ROTL64(bmw_qt[15], 37) + bmw_qt[16] + ROTL64(bmw_qt[17], 43) + bmw_qt[18] + ROTL64(bmw_qt[19], 53) + ((bmw_qt[20] >> 1) ^ bmw_qt[20]) + ((bmw_qt[21] >> 2) ^ bmw_qt[21]) + ((ROTL64(bmw_h2[6], 7) + ROTL64(bmw_h2[9], 10) - ROTL64(bmw_h2[0], 1) + 0x755555555555554eULL) ^ 0xaaaaaaaaaaaaaaadULL));
bmw_qt[23] = (bmw_qt[7]  + ROTL64(bmw_qt[8], 5)  + bmw_qt[9]  + ROTL64(bmw_qt[10], 11) + bmw_qt[11] + ROTL64(bmw_qt[12], 27) + bmw_qt[13] + ROTL64(bmw_qt[14], 32) + bmw_qt[15] + ROTL64(bmw_qt[16], 37) + bmw_qt[17] + ROTL64(bmw_qt[18], 43) + bmw_qt[19] + ROTL64(bmw_qt[20], 53) + ((bmw_qt[21] >> 1) ^ bmw_qt[21]) + ((bmw_qt[22] >> 2) ^ bmw_qt[22]) + ((ROTL64(bmw_h2[7], 8) + ROTL64(bmw_h2[10], 11) - ROTL64(bmw_h2[1], 2) + 0x7aaaaaaaaaaaaaa3ULL) ^ 0xaaaaaaaaaaaaaaaeULL));
bmw_qt[24] = (bmw_qt[8]  + ROTL64(bmw_qt[9], 5)  + bmw_qt[10] + ROTL64(bmw_qt[11], 11) + bmw_qt[12] + ROTL64(bmw_qt[13], 27) + bmw_qt[14] + ROTL64(bmw_qt[15], 32) + bmw_qt[16] + ROTL64(bmw_qt[17], 37) + bmw_qt[18] + ROTL64(bmw_qt[19], 43) + bmw_qt[20] + ROTL64(bmw_qt[21], 53) + ((bmw_qt[22] >> 1) ^ bmw_qt[22]) + ((bmw_qt[23] >> 2) ^ bmw_qt[23]) + ((ROTL64(bmw_h2[8], 9) + ROTL64(bmw_h2[11], 12) - ROTL64(bmw_h2[2], 3) + 0x7ffffffffffffff8ULL) ^ 0xaaaaaaaaaaaaaaafULL));
bmw_qt[25] = (bmw_qt[9]  + ROTL64(bmw_qt[10], 5) + bmw_qt[11] + ROTL64(bmw_qt[12], 11) + bmw_qt[13] + ROTL64(bmw_qt[14], 27) + bmw_qt[15] + ROTL64(bmw_qt[16], 32) + bmw_qt[17] + ROTL64(bmw_qt[18], 37) + bmw_qt[19] + ROTL64(bmw_qt[20], 43) + bmw_qt[21] + ROTL64(bmw_qt[22], 53) + ((bmw_qt[23] >> 1) ^ bmw_qt[23]) + ((bmw_qt[24] >> 2) ^ bmw_qt[24]) + ((ROTL64(bmw_h2[9], 10) + ROTL64(bmw_h2[12], 13) - ROTL64(bmw_h2[3], 4) + 0x855555555555554dULL) ^ 0xaaaaaaaaaaaaaaa0ULL));
bmw_qt[26] = (bmw_qt[10] + ROTL64(bmw_qt[11], 5) + bmw_qt[12] + ROTL64(bmw_qt[13], 11) + bmw_qt[14] + ROTL64(bmw_qt[15], 27) + bmw_qt[16] + ROTL64(bmw_qt[17], 32) + bmw_qt[18] + ROTL64(bmw_qt[19], 37) + bmw_qt[20] + ROTL64(bmw_qt[21], 43) + bmw_qt[22] + ROTL64(bmw_qt[23], 53) + ((bmw_qt[24] >> 1) ^ bmw_qt[24]) + ((bmw_qt[25] >> 2) ^ bmw_qt[25]) + ((ROTL64(bmw_h2[10], 11) + ROTL64(bmw_h2[13], 14) - ROTL64(bmw_h2[4], 5) + 0x8aaaaaaaaaaaaaa2ULL) ^ 0xaaaaaaaaaaaaaaa1ULL));
bmw_qt[27] = (bmw_qt[11] + ROTL64(bmw_qt[12], 5) + bmw_qt[13] + ROTL64(bmw_qt[14], 11) + bmw_qt[15] + ROTL64(bmw_qt[16], 27) + bmw_qt[17] + ROTL64(bmw_qt[18], 32) + bmw_qt[19] + ROTL64(bmw_qt[20], 37) + bmw_qt[21] + ROTL64(bmw_qt[22], 43) + bmw_qt[23] + ROTL64(bmw_qt[24], 53) + ((bmw_qt[25] >> 1) ^ bmw_qt[25]) + ((bmw_qt[26] >> 2) ^ bmw_qt[26]) + ((ROTL64(bmw_h2[11], 12) + ROTL64(bmw_h2[14], 15) - ROTL64(bmw_h2[5], 6) + 0x8ffffffffffffff7ULL) ^ 0xaaaaaaaaaaaaaaa2ULL));
bmw_qt[28] = (bmw_qt[12] + ROTL64(bmw_qt[13], 5) + bmw_qt[14] + ROTL64(bmw_qt[15], 11) + bmw_qt[16] + ROTL64(bmw_qt[17], 27) + bmw_qt[18] + ROTL64(bmw_qt[19], 32) + bmw_qt[20] + ROTL64(bmw_qt[21], 37) + bmw_qt[22] + ROTL64(bmw_qt[23], 43) + bmw_qt[24] + ROTL64(bmw_qt[25], 53) + ((bmw_qt[26] >> 1) ^ bmw_qt[26]) + ((bmw_qt[27] >> 2) ^ bmw_qt[27]) + ((ROTL64(bmw_h2[12], 13) + ROTL64(bmw_h2[15], 16) - ROTL64(bmw_h2[6], 7) + 0x955555555555554cULL) ^ 0xaaaaaaaaaaaaaaa3ULL));
bmw_qt[29] = (bmw_qt[13] + ROTL64(bmw_qt[14], 5) + bmw_qt[15] + ROTL64(bmw_qt[16], 11) + bmw_qt[17] + ROTL64(bmw_qt[18], 27) + bmw_qt[19] + ROTL64(bmw_qt[20], 32) + bmw_qt[21] + ROTL64(bmw_qt[22], 37) + bmw_qt[23] + ROTL64(bmw_qt[24], 43) + bmw_qt[25] + ROTL64(bmw_qt[26], 53) + ((bmw_qt[27] >> 1) ^ bmw_qt[27]) + ((bmw_qt[28] >> 2) ^ bmw_qt[28]) + ((ROTL64(bmw_h2[13], 14) + ROTL64(bmw_h2[0], 1) - ROTL64(bmw_h2[7], 8) + 0x9aaaaaaaaaaaaaa1ULL) ^ 0xaaaaaaaaaaaaaaa4ULL));
bmw_qt[30] = (bmw_qt[14] + ROTL64(bmw_qt[15], 5) + bmw_qt[16] + ROTL64(bmw_qt[17], 11) + bmw_qt[18] + ROTL64(bmw_qt[19], 27) + bmw_qt[20] + ROTL64(bmw_qt[21], 32) + bmw_qt[22] + ROTL64(bmw_qt[23], 37) + bmw_qt[24] + ROTL64(bmw_qt[25], 43) + bmw_qt[26] + ROTL64(bmw_qt[27], 53) + ((bmw_qt[28] >> 1) ^ bmw_qt[28]) + ((bmw_qt[29] >> 2) ^ bmw_qt[29]) + ((ROTL64(bmw_h2[14], 15) + ROTL64(bmw_h2[1], 2) - ROTL64(bmw_h2[8], 9) + 0x9ffffffffffffff6ULL) ^ 0xaaaaaaaaaaaaaaa5ULL));
bmw_qt[31] = (bmw_qt[15] + ROTL64(bmw_qt[16], 5) + bmw_qt[17] + ROTL64(bmw_qt[18], 11) + bmw_qt[19] + ROTL64(bmw_qt[20], 27) + bmw_qt[21] + ROTL64(bmw_qt[22], 32) + bmw_qt[23] + ROTL64(bmw_qt[24], 37) + bmw_qt[25] + ROTL64(bmw_qt[26], 43) + bmw_qt[27] + ROTL64(bmw_qt[28], 53) + ((bmw_qt[29] >> 1) ^ bmw_qt[29]) + ((bmw_qt[30] >> 2) ^ bmw_qt[30]) + ((ROTL64(bmw_h2[15], 16) + ROTL64(bmw_h2[2], 3) - ROTL64(bmw_h2[9], 10) + 0xa55555555555554bULL) ^ 0xaaaaaaaaaaaaaaa6ULL));

bmw_xl = bmw_qt[16] ^ bmw_qt[17] ^ bmw_qt[18] ^ bmw_qt[19] ^ bmw_qt[20] ^ bmw_qt[21] ^ bmw_qt[22] ^ bmw_qt[23];
bmw_xh = bmw_xl ^ bmw_qt[24] ^ bmw_qt[25] ^ bmw_qt[26] ^ bmw_qt[27] ^ bmw_qt[28] ^ bmw_qt[29] ^ bmw_qt[30] ^ bmw_qt[31];
bmw_h2[0]  = ((bmw_xh <<  5) ^ (bmw_qt[16] >>  5) ^ bmw_h2[0]) + (bmw_xl ^ bmw_qt[24] ^ bmw_qt[0]);
bmw_h2[1]  = ((bmw_xh >>  7) ^ (bmw_qt[17] <<  8) ^ bmw_h2[1]) + (bmw_xl ^ bmw_qt[25] ^ bmw_qt[1]);
bmw_h2[2]  = ((bmw_xh >>  5) ^ (bmw_qt[18] <<  5) ^ bmw_h2[2]) + (bmw_xl ^ bmw_qt[26] ^ bmw_qt[2]);
bmw_h2[3]  = ((bmw_xh >>  1) ^ (bmw_qt[19] <<  5) ^ bmw_h2[3]) + (bmw_xl ^ bmw_qt[27] ^ bmw_qt[3]);
bmw_h2[4]  = ((bmw_xh >>  3) ^ (bmw_qt[20] <<  0) ^ bmw_h2[4]) + (bmw_xl ^ bmw_qt[28] ^ bmw_qt[4]);
bmw_h2[5]  = ((bmw_xh <<  6) ^ (bmw_qt[21] >>  6) ^ bmw_h2[5]) + (bmw_xl ^ bmw_qt[29] ^ bmw_qt[5]);
bmw_h2[6]  = ((bmw_xh >>  4) ^ (bmw_qt[22] <<  6) ^ bmw_h2[6]) + (bmw_xl ^ bmw_qt[30] ^ bmw_qt[6]);
bmw_h2[7]  = ((bmw_xh >> 11) ^ (bmw_qt[23] <<  2) ^ bmw_h2[7]) + (bmw_xl ^ (bmw_qt[31]) ^ bmw_qt[7]);
hash64[0] = ROTL64(bmw_h2[4],  9) + (bmw_xh ^ bmw_qt[24] ^ bmw_h2[8])  + ((bmw_xl << 8) ^ bmw_qt[23] ^ bmw_qt[8]);
hash64[1] = ROTL64(bmw_h2[5], 10) + (bmw_xh ^ bmw_qt[25] ^ bmw_h2[9])  + ((bmw_xl >> 6) ^ bmw_qt[16] ^ bmw_qt[9]);
hash64[2] = ROTL64(bmw_h2[6], 11) + (bmw_xh ^ bmw_qt[26] ^ bmw_h2[10]) + ((bmw_xl << 6) ^ bmw_qt[17] ^ bmw_qt[10]);
hash64[3] = ROTL64(bmw_h2[7], 12) + (bmw_xh ^ bmw_qt[27] ^ bmw_h2[11]) + ((bmw_xl << 4) ^ bmw_qt[18] ^ bmw_qt[11]);
hash64[4] = ROTL64(bmw_h2[0], 13) + (bmw_xh ^ bmw_qt[28] ^ bmw_h2[12]) + ((bmw_xl >> 3) ^ bmw_qt[19] ^ bmw_qt[12]);
hash64[5] = ROTL64(bmw_h2[1], 14) + (bmw_xh ^ bmw_qt[29] ^ bmw_h2[13]) + ((bmw_xl >> 4) ^ bmw_qt[20] ^ bmw_qt[13]);
hash64[6] = ROTL64(bmw_h2[2], 15) + (bmw_xh ^ bmw_qt[30] ^ bmw_h2[14]) + ((bmw_xl >> 7) ^ bmw_qt[21] ^ bmw_qt[14]);
hash64[7] = ROTL64(bmw_h2[3], 16) + (bmw_xh ^ (bmw_qt[31]) ^ bmw_h2[15]) + ((bmw_xl >> 2) ^ bmw_qt[22] ^ bmw_qt[15]);
}
}

Of course I gave you bad advice. Good one is way out of your price range.
smolen
Hero Member
*****
Offline Offline

Activity: 525


View Profile
October 22, 2014, 01:38:00 AM
 #305

Groestl:
Code:
#define groestl_EXT_BYTE_0(n) EXT_BYTE32_0(n)
#define groestl_EXT_BYTE_1(n) EXT_BYTE32_1(n)
#define groestl_EXT_BYTE_2(n) EXT_BYTE32_2(n)
#define groestl_EXT_BYTE_3(n) EXT_BYTE32_3(n)

#define groestl_PMIX(src, dst, r)\
src[ 0] ^= (r);\
src[ 2] ^= 0x00000010u^(r);\
src[ 4] ^= 0x00000020u^(r);\
src[ 6] ^= 0x00000030u^(r);\
src[ 8] ^= 0x00000040u^(r);\
src[10] ^= 0x00000050u^(r);\
src[12] ^= 0x00000060u^(r);\
src[14] ^= 0x00000070u^(r);\
src[16] ^= 0x00000080u^(r);\
src[18] ^= 0x00000090u^(r);\
src[20] ^= 0x000000a0u^(r);\
src[22] ^= 0x000000b0u^(r);\
src[24] ^= 0x000000c0u^(r);\
src[26] ^= 0x000000d0u^(r);\
src[28] ^= 0x000000e0u^(r);\
src[30] ^= 0x000000f0u^(r);\
dst[ 0]  = groestl_T0[groestl_EXT_BYTE_0(src[ 0])];\
dst[ 1]  = groestl_T0[groestl_EXT_BYTE_0(src[ 9])];\
dst[ 2]  = groestl_T0[groestl_EXT_BYTE_0(src[ 2])];\
dst[ 3]  = groestl_T0[groestl_EXT_BYTE_0(src[11])];\
dst[ 4]  = groestl_T0[groestl_EXT_BYTE_0(src[ 4])];\
dst[ 5]  = groestl_T0[groestl_EXT_BYTE_0(src[13])];\
dst[ 6]  = groestl_T0[groestl_EXT_BYTE_0(src[ 6])];\
dst[ 7]  = groestl_T0[groestl_EXT_BYTE_0(src[15])];\
dst[ 8]  = groestl_T0[groestl_EXT_BYTE_0(src[ 8])];\
dst[ 9]  = groestl_T0[groestl_EXT_BYTE_0(src[17])];\
dst[10]  = groestl_T0[groestl_EXT_BYTE_0(src[10])];\
dst[11]  = groestl_T0[groestl_EXT_BYTE_0(src[19])];\
dst[12]  = groestl_T0[groestl_EXT_BYTE_0(src[12])];\
dst[13]  = groestl_T0[groestl_EXT_BYTE_0(src[21])];\
dst[14]  = groestl_T0[groestl_EXT_BYTE_0(src[14])];\
dst[15]  = groestl_T0[groestl_EXT_BYTE_0(src[23])];\
dst[16]  = groestl_T0[groestl_EXT_BYTE_0(src[16])];\
dst[17]  = groestl_T0[groestl_EXT_BYTE_0(src[25])];\
dst[18]  = groestl_T0[groestl_EXT_BYTE_0(src[18])];\
dst[19]  = groestl_T0[groestl_EXT_BYTE_0(src[27])];\
dst[20]  = groestl_T0[groestl_EXT_BYTE_0(src[20])];\
dst[21]  = groestl_T0[groestl_EXT_BYTE_0(src[29])];\
dst[22]  = groestl_T0[groestl_EXT_BYTE_0(src[22])];\
dst[23]  = groestl_T0[groestl_EXT_BYTE_0(src[31])];\
dst[24]  = groestl_T0[groestl_EXT_BYTE_0(src[24])];\
dst[25]  = groestl_T0[groestl_EXT_BYTE_0(src[ 1])];\
dst[26]  = groestl_T0[groestl_EXT_BYTE_0(src[26])];\
dst[27]  = groestl_T0[groestl_EXT_BYTE_0(src[ 3])];\
dst[28]  = groestl_T0[groestl_EXT_BYTE_0(src[28])];\
dst[29]  = groestl_T0[groestl_EXT_BYTE_0(src[ 5])];\
dst[30]  = groestl_T0[groestl_EXT_BYTE_0(src[30])];\
dst[31]  = groestl_T0[groestl_EXT_BYTE_0(src[ 7])];\
dst[ 0] ^= groestl_T1[groestl_EXT_BYTE_1(src[ 2])];\
dst[ 1] ^= groestl_T1[groestl_EXT_BYTE_1(src[11])];\
dst[ 2] ^= groestl_T1[groestl_EXT_BYTE_1(src[ 4])];\
dst[ 3] ^= groestl_T1[groestl_EXT_BYTE_1(src[13])];\
dst[ 4] ^= groestl_T1[groestl_EXT_BYTE_1(src[ 6])];\
dst[ 5] ^= groestl_T1[groestl_EXT_BYTE_1(src[15])];\
dst[ 6] ^= groestl_T1[groestl_EXT_BYTE_1(src[ 8])];\
dst[ 7] ^= groestl_T1[groestl_EXT_BYTE_1(src[17])];\
dst[ 8] ^= groestl_T1[groestl_EXT_BYTE_1(src[10])];\
dst[ 9] ^= groestl_T1[groestl_EXT_BYTE_1(src[19])];\
dst[10] ^= groestl_T1[groestl_EXT_BYTE_1(src[12])];\
dst[11] ^= groestl_T1[groestl_EXT_BYTE_1(src[21])];\
dst[12] ^= groestl_T1[groestl_EXT_BYTE_1(src[14])];\
dst[13] ^= groestl_T1[groestl_EXT_BYTE_1(src[23])];\
dst[14] ^= groestl_T1[groestl_EXT_BYTE_1(src[16])];\
dst[15] ^= groestl_T1[groestl_EXT_BYTE_1(src[25])];\
dst[16] ^= groestl_T1[groestl_EXT_BYTE_1(src[18])];\
dst[17] ^= groestl_T1[groestl_EXT_BYTE_1(src[27])];\
dst[18] ^= groestl_T1[groestl_EXT_BYTE_1(src[20])];\
dst[19] ^= groestl_T1[groestl_EXT_BYTE_1(src[29])];\
dst[20] ^= groestl_T1[groestl_EXT_BYTE_1(src[22])];\
dst[21] ^= groestl_T1[groestl_EXT_BYTE_1(src[31])];\
dst[22] ^= groestl_T1[groestl_EXT_BYTE_1(src[24])];\
dst[23] ^= groestl_T1[groestl_EXT_BYTE_1(src[ 1])];\
dst[24] ^= groestl_T1[groestl_EXT_BYTE_1(src[26])];\
dst[25] ^= groestl_T1[groestl_EXT_BYTE_1(src[ 3])];\
dst[26] ^= groestl_T1[groestl_EXT_BYTE_1(src[28])];\
dst[27] ^= groestl_T1[groestl_EXT_BYTE_1(src[ 5])];\
dst[28] ^= groestl_T1[groestl_EXT_BYTE_1(src[30])];\
dst[29] ^= groestl_T1[groestl_EXT_BYTE_1(src[ 7])];\
dst[30] ^= groestl_T1[groestl_EXT_BYTE_1(src[ 0])];\
dst[31] ^= groestl_T1[groestl_EXT_BYTE_1(src[ 9])];\
dst[ 0] ^= groestl_T2[groestl_EXT_BYTE_2(src[ 4])];\
dst[ 1] ^= groestl_T2[groestl_EXT_BYTE_2(src[13])];\
dst[ 2] ^= groestl_T2[groestl_EXT_BYTE_2(src[ 6])];\
dst[ 3] ^= groestl_T2[groestl_EXT_BYTE_2(src[15])];\
dst[ 4] ^= groestl_T2[groestl_EXT_BYTE_2(src[ 8])];\
dst[ 5] ^= groestl_T2[groestl_EXT_BYTE_2(src[17])];\
dst[ 6] ^= groestl_T2[groestl_EXT_BYTE_2(src[10])];\
dst[ 7] ^= groestl_T2[groestl_EXT_BYTE_2(src[19])];\
dst[ 8] ^= groestl_T2[groestl_EXT_BYTE_2(src[12])];\
dst[ 9] ^= groestl_T2[groestl_EXT_BYTE_2(src[21])];\
dst[10] ^= groestl_T2[groestl_EXT_BYTE_2(src[14])];\
dst[11] ^= groestl_T2[groestl_EXT_BYTE_2(src[23])];\
dst[12] ^= groestl_T2[groestl_EXT_BYTE_2(src[16])];\
dst[13] ^= groestl_T2[groestl_EXT_BYTE_2(src[25])];\
dst[14] ^= groestl_T2[groestl_EXT_BYTE_2(src[18])];\
dst[15] ^= groestl_T2[groestl_EXT_BYTE_2(src[27])];\
dst[16] ^= groestl_T2[groestl_EXT_BYTE_2(src[20])];\
dst[17] ^= groestl_T2[groestl_EXT_BYTE_2(src[29])];\
dst[18] ^= groestl_T2[groestl_EXT_BYTE_2(src[22])];\
dst[19] ^= groestl_T2[groestl_EXT_BYTE_2(src[31])];\
dst[20] ^= groestl_T2[groestl_EXT_BYTE_2(src[24])];\
dst[21] ^= groestl_T2[groestl_EXT_BYTE_2(src[ 1])];\
dst[22] ^= groestl_T2[groestl_EXT_BYTE_2(src[26])];\
dst[23] ^= groestl_T2[groestl_EXT_BYTE_2(src[ 3])];\
dst[24] ^= groestl_T2[groestl_EXT_BYTE_2(src[28])];\
dst[25] ^= groestl_T2[groestl_EXT_BYTE_2(src[ 5])];\
dst[26] ^= groestl_T2[groestl_EXT_BYTE_2(src[30])];\
dst[27] ^= groestl_T2[groestl_EXT_BYTE_2(src[ 7])];\
dst[28] ^= groestl_T2[groestl_EXT_BYTE_2(src[ 0])];\
dst[29] ^= groestl_T2[groestl_EXT_BYTE_2(src[ 9])];\
dst[30] ^= groestl_T2[groestl_EXT_BYTE_2(src[ 2])];\
dst[31] ^= groestl_T2[groestl_EXT_BYTE_2(src[11])];\
dst[ 0] ^= groestl_T3[groestl_EXT_BYTE_3(src[ 6])];\
dst[ 1] ^= groestl_T3[groestl_EXT_BYTE_3(src[23])];\
dst[ 2] ^= groestl_T3[groestl_EXT_BYTE_3(src[ 8])];\
dst[ 3] ^= groestl_T3[groestl_EXT_BYTE_3(src[25])];\
dst[ 4] ^= groestl_T3[groestl_EXT_BYTE_3(src[10])];\
dst[ 5] ^= groestl_T3[groestl_EXT_BYTE_3(src[27])];\
dst[ 6] ^= groestl_T3[groestl_EXT_BYTE_3(src[12])];\
dst[ 7] ^= groestl_T3[groestl_EXT_BYTE_3(src[29])];\
dst[ 8] ^= groestl_T3[groestl_EXT_BYTE_3(src[14])];\
dst[ 9] ^= groestl_T3[groestl_EXT_BYTE_3(src[31])];\
dst[10] ^= groestl_T3[groestl_EXT_BYTE_3(src[16])];\
dst[11] ^= groestl_T3[groestl_EXT_BYTE_3(src[ 1])];\
dst[12] ^= groestl_T3[groestl_EXT_BYTE_3(src[18])];\
dst[13] ^= groestl_T3[groestl_EXT_BYTE_3(src[ 3])];\
dst[14] ^= groestl_T3[groestl_EXT_BYTE_3(src[20])];\
dst[15] ^= groestl_T3[groestl_EXT_BYTE_3(src[ 5])];\
dst[16] ^= groestl_T3[groestl_EXT_BYTE_3(src[22])];\
dst[17] ^= groestl_T3[groestl_EXT_BYTE_3(src[ 7])];\
dst[18] ^= groestl_T3[groestl_EXT_BYTE_3(src[24])];\
dst[19] ^= groestl_T3[groestl_EXT_BYTE_3(src[ 9])];\
dst[20] ^= groestl_T3[groestl_EXT_BYTE_3(src[26])];\
dst[21] ^= groestl_T3[groestl_EXT_BYTE_3(src[11])];\
dst[22] ^= groestl_T3[groestl_EXT_BYTE_3(src[28])];\
dst[23] ^= groestl_T3[groestl_EXT_BYTE_3(src[13])];\
dst[24] ^= groestl_T3[groestl_EXT_BYTE_3(src[30])];\
dst[25] ^= groestl_T3[groestl_EXT_BYTE_3(src[15])];\
dst[26] ^= groestl_T3[groestl_EXT_BYTE_3(src[ 0])];\
dst[27] ^= groestl_T3[groestl_EXT_BYTE_3(src[17])];\
dst[28] ^= groestl_T3[groestl_EXT_BYTE_3(src[ 2])];\
dst[29] ^= groestl_T3[groestl_EXT_BYTE_3(src[19])];\
dst[30] ^= groestl_T3[groestl_EXT_BYTE_3(src[ 4])];\
dst[31] ^= groestl_T3[groestl_EXT_BYTE_3(src[21])];\
dst[ 0] ^= groestl_T4[groestl_EXT_BYTE_0(src[ 9])];\
dst[ 1] ^= groestl_T4[groestl_EXT_BYTE_0(src[ 0])];\
dst[ 2] ^= groestl_T4[groestl_EXT_BYTE_0(src[11])];\
dst[ 3] ^= groestl_T4[groestl_EXT_BYTE_0(src[ 2])];\
dst[ 4] ^= groestl_T4[groestl_EXT_BYTE_0(src[13])];\
dst[ 5] ^= groestl_T4[groestl_EXT_BYTE_0(src[ 4])];\
dst[ 6] ^= groestl_T4[groestl_EXT_BYTE_0(src[15])];\
dst[ 7] ^= groestl_T4[groestl_EXT_BYTE_0(src[ 6])];\
dst[ 8] ^= groestl_T4[groestl_EXT_BYTE_0(src[17])];\
dst[ 9] ^= groestl_T4[groestl_EXT_BYTE_0(src[ 8])];\
dst[10] ^= groestl_T4[groestl_EXT_BYTE_0(src[19])];\
dst[11] ^= groestl_T4[groestl_EXT_BYTE_0(src[10])];\
dst[12] ^= groestl_T4[groestl_EXT_BYTE_0(src[21])];\
dst[13] ^= groestl_T4[groestl_EXT_BYTE_0(src[12])];\
dst[14] ^= groestl_T4[groestl_EXT_BYTE_0(src[23])];\
dst[15] ^= groestl_T4[groestl_EXT_BYTE_0(src[14])];\
dst[16] ^= groestl_T4[groestl_EXT_BYTE_0(src[25])];\
dst[17] ^= groestl_T4[groestl_EXT_BYTE_0(src[16])];\
dst[18] ^= groestl_T4[groestl_EXT_BYTE_0(src[27])];\
dst[19] ^= groestl_T4[groestl_EXT_BYTE_0(src[18])];\
dst[20] ^= groestl_T4[groestl_EXT_BYTE_0(src[29])];\
dst[21] ^= groestl_T4[groestl_EXT_BYTE_0(src[20])];\
dst[22] ^= groestl_T4[groestl_EXT_BYTE_0(src[31])];\
dst[23] ^= groestl_T4[groestl_EXT_BYTE_0(src[22])];\
dst[24] ^= groestl_T4[groestl_EXT_BYTE_0(src[ 1])];\
dst[25] ^= groestl_T4[groestl_EXT_BYTE_0(src[24])];\
dst[26] ^= groestl_T4[groestl_EXT_BYTE_0(src[ 3])];\
dst[27] ^= groestl_T4[groestl_EXT_BYTE_0(src[26])];\
dst[28] ^= groestl_T4[groestl_EXT_BYTE_0(src[ 5])];\
dst[29] ^= groestl_T4[groestl_EXT_BYTE_0(src[28])];\
dst[30] ^= groestl_T4[groestl_EXT_BYTE_0(src[ 7])];\
dst[31] ^= groestl_T4[groestl_EXT_BYTE_0(src[30])];\
dst[ 0] ^= groestl_T5[groestl_EXT_BYTE_1(src[11])];\
dst[ 1] ^= groestl_T5[groestl_EXT_BYTE_1(src[ 2])];\
dst[ 2] ^= groestl_T5[groestl_EXT_BYTE_1(src[13])];\
dst[ 3] ^= groestl_T5[groestl_EXT_BYTE_1(src[ 4])];\
dst[ 4] ^= groestl_T5[groestl_EXT_BYTE_1(src[15])];\
dst[ 5] ^= groestl_T5[groestl_EXT_BYTE_1(src[ 6])];\
dst[ 6] ^= groestl_T5[groestl_EXT_BYTE_1(src[17])];\
dst[ 7] ^= groestl_T5[groestl_EXT_BYTE_1(src[ 8])];\
dst[ 8] ^= groestl_T5[groestl_EXT_BYTE_1(src[19])];\
dst[ 9] ^= groestl_T5[groestl_EXT_BYTE_1(src[10])];\
dst[10] ^= groestl_T5[groestl_EXT_BYTE_1(src[21])];\
dst[11] ^= groestl_T5[groestl_EXT_BYTE_1(src[12])];\
dst[12] ^= groestl_T5[groestl_EXT_BYTE_1(src[23])];\
dst[13] ^= groestl_T5[groestl_EXT_BYTE_1(src[14])];\
dst[14] ^= groestl_T5[groestl_EXT_BYTE_1(src[25])];\
dst[15] ^= groestl_T5[groestl_EXT_BYTE_1(src[16])];\
dst[16] ^= groestl_T5[groestl_EXT_BYTE_1(src[27])];\
dst[17] ^= groestl_T5[groestl_EXT_BYTE_1(src[18])];\
dst[18] ^= groestl_T5[groestl_EXT_BYTE_1(src[29])];\
dst[19] ^= groestl_T5[groestl_EXT_BYTE_1(src[20])];\
dst[20] ^= groestl_T5[groestl_EXT_BYTE_1(src[31])];\
dst[21] ^= groestl_T5[groestl_EXT_BYTE_1(src[22])];\
dst[22] ^= groestl_T5[groestl_EXT_BYTE_1(src[ 1])];\
dst[23] ^= groestl_T5[groestl_EXT_BYTE_1(src[24])];\
dst[24] ^= groestl_T5[groestl_EXT_BYTE_1(src[ 3])];\
dst[25] ^= groestl_T5[groestl_EXT_BYTE_1(src[26])];\
dst[26] ^= groestl_T5[groestl_EXT_BYTE_1(src[ 5])];\
dst[27] ^= groestl_T5[groestl_EXT_BYTE_1(src[28])];\
dst[28] ^= groestl_T5[groestl_EXT_BYTE_1(src[ 7])];\
dst[29] ^= groestl_T5[groestl_EXT_BYTE_1(src[30])];\
dst[30] ^= groestl_T5[groestl_EXT_BYTE_1(src[ 9])];\
dst[31] ^= groestl_T5[groestl_EXT_BYTE_1(src[ 0])];\
dst[ 0] ^= groestl_T6[groestl_EXT_BYTE_2(src[13])];\
dst[ 1] ^= groestl_T6[groestl_EXT_BYTE_2(src[ 4])];\
dst[ 2] ^= groestl_T6[groestl_EXT_BYTE_2(src[15])];\
dst[ 3] ^= groestl_T6[groestl_EXT_BYTE_2(src[ 6])];\
dst[ 4] ^= groestl_T6[groestl_EXT_BYTE_2(src[17])];\
dst[ 5] ^= groestl_T6[groestl_EXT_BYTE_2(src[ 8])];\
dst[ 6] ^= groestl_T6[groestl_EXT_BYTE_2(src[19])];\
dst[ 7] ^= groestl_T6[groestl_EXT_BYTE_2(src[10])];\
dst[ 8] ^= groestl_T6[groestl_EXT_BYTE_2(src[21])];\
dst[ 9] ^= groestl_T6[groestl_EXT_BYTE_2(src[12])];\
dst[10] ^= groestl_T6[groestl_EXT_BYTE_2(src[23])];\
dst[11] ^= groestl_T6[groestl_EXT_BYTE_2(src[14])];\
dst[12] ^= groestl_T6[groestl_EXT_BYTE_2(src[25])];\
dst[13] ^= groestl_T6[groestl_EXT_BYTE_2(src[16])];\
dst[14] ^= groestl_T6[groestl_EXT_BYTE_2(src[27])];\
dst[15] ^= groestl_T6[groestl_EXT_BYTE_2(src[18])];\
dst[16] ^= groestl_T6[groestl_EXT_BYTE_2(src[29])];\
dst[17] ^= groestl_T6[groestl_EXT_BYTE_2(src[20])];\
dst[18] ^= groestl_T6[groestl_EXT_BYTE_2(src[31])];\
dst[19] ^= groestl_T6[groestl_EXT_BYTE_2(src[22])];\
dst[20] ^= groestl_T6[groestl_EXT_BYTE_2(src[ 1])];\
dst[21] ^= groestl_T6[groestl_EXT_BYTE_2(src[24])];\
dst[22] ^= groestl_T6[groestl_EXT_BYTE_2(src[ 3])];\
dst[23] ^= groestl_T6[groestl_EXT_BYTE_2(src[26])];\
dst[24] ^= groestl_T6[groestl_EXT_BYTE_2(src[ 5])];\
dst[25] ^= groestl_T6[groestl_EXT_BYTE_2(src[28])];\
dst[26] ^= groestl_T6[groestl_EXT_BYTE_2(src[ 7])];\
dst[27] ^= groestl_T6[groestl_EXT_BYTE_2(src[30])];\
dst[28] ^= groestl_T6[groestl_EXT_BYTE_2(src[ 9])];\
dst[29] ^= groestl_T6[groestl_EXT_BYTE_2(src[ 0])];\
dst[30] ^= groestl_T6[groestl_EXT_BYTE_2(src[11])];\
dst[31] ^= groestl_T6[groestl_EXT_BYTE_2(src[ 2])];\
dst[ 0] ^= groestl_T7[groestl_EXT_BYTE_3(src[23])];\
dst[ 1] ^= groestl_T7[groestl_EXT_BYTE_3(src[ 6])];\
dst[ 2] ^= groestl_T7[groestl_EXT_BYTE_3(src[25])];\
dst[ 3] ^= groestl_T7[groestl_EXT_BYTE_3(src[ 8])];\
dst[ 4] ^= groestl_T7[groestl_EXT_BYTE_3(src[27])];\
dst[ 5] ^= groestl_T7[groestl_EXT_BYTE_3(src[10])];\
dst[ 6] ^= groestl_T7[groestl_EXT_BYTE_3(src[29])];\
dst[ 7] ^= groestl_T7[groestl_EXT_BYTE_3(src[12])];\
dst[ 8] ^= groestl_T7[groestl_EXT_BYTE_3(src[31])];\
dst[ 9] ^= groestl_T7[groestl_EXT_BYTE_3(src[14])];\
dst[10] ^= groestl_T7[groestl_EXT_BYTE_3(src[ 1])];\
dst[11] ^= groestl_T7[groestl_EXT_BYTE_3(src[16])];\
dst[12] ^= groestl_T7[groestl_EXT_BYTE_3(src[ 3])];\
dst[13] ^= groestl_T7[groestl_EXT_BYTE_3(src[18])];\
dst[14] ^= groestl_T7[groestl_EXT_BYTE_3(src[ 5])];\
dst[15] ^= groestl_T7[groestl_EXT_BYTE_3(src[20])];\
dst[16] ^= groestl_T7[groestl_EXT_BYTE_3(src[ 7])];\
dst[17] ^= groestl_T7[groestl_EXT_BYTE_3(src[22])];\
dst[18] ^= groestl_T7[groestl_EXT_BYTE_3(src[ 9])];\
dst[19] ^= groestl_T7[groestl_EXT_BYTE_3(src[24])];\
dst[20] ^= groestl_T7[groestl_EXT_BYTE_3(src[11])];\
dst[21] ^= groestl_T7[groestl_EXT_BYTE_3(src[26])];\
dst[22] ^= groestl_T7[groestl_EXT_BYTE_3(src[13])];\
dst[23] ^= groestl_T7[groestl_EXT_BYTE_3(src[28])];\
dst[24] ^= groestl_T7[groestl_EXT_BYTE_3(src[15])];\
dst[25] ^= groestl_T7[groestl_EXT_BYTE_3(src[30])];\
dst[26] ^= groestl_T7[groestl_EXT_BYTE_3(src[17])];\
dst[27] ^= groestl_T7[groestl_EXT_BYTE_3(src[ 0])];\
dst[28] ^= groestl_T7[groestl_EXT_BYTE_3(src[19])];\
dst[29] ^= groestl_T7[groestl_EXT_BYTE_3(src[ 2])];\
dst[30] ^= groestl_T7[groestl_EXT_BYTE_3(src[21])];\
dst[31] ^= groestl_T7[groestl_EXT_BYTE_3(src[ 4])];

#define groestl_QMIX(src, dst, r)\
src[ 0] = ~src[ 0];\
src[ 1] ^= ~(r);\
src[ 2] = ~src[ 2];\
src[ 3] ^= 0xefffffffu^(r);\
src[ 4] = ~src[ 4];\
src[ 5] ^= 0xdfffffffu^(r);\
src[ 6] = ~src[ 6];\
src[ 7] ^= 0xcfffffffu^(r);\
src[ 8] = ~src[ 8];\
src[ 9] ^= 0xbfffffffu^(r);\
src[10] = ~src[10];\
src[11] ^= 0xafffffffu^(r);\
src[12] = ~src[12];\
src[13] ^= 0x9fffffffu^(r);\
src[14] = ~src[14];\
src[15] ^= 0x8fffffffu^(r);\
src[16] = ~src[16];\
src[17] ^= 0x7fffffffu^(r);\
src[18] = ~src[18];\
src[19] ^= 0x6fffffffu^(r);\
src[20] = ~src[20];\
src[21] ^= 0x5fffffffu^(r);\
src[22] = ~src[22];\
src[23] ^= 0x4fffffffu^(r);\
src[24] = ~src[24];\
src[25] ^= 0x3fffffffu^(r);\
src[26] = ~src[26];\
src[27] ^= 0x2fffffffu^(r);\
src[28] = ~src[28];\
src[29] ^= 0x1fffffffu^(r);\
src[30] = ~src[30];\
src[31] ^= 0x0fffffffu^(r);\
dst[ 0]  = groestl_T0[groestl_EXT_BYTE_0(src[ 2])];\
dst[ 1]  = groestl_T0[groestl_EXT_BYTE_0(src[ 1])];\
dst[ 2]  = groestl_T0[groestl_EXT_BYTE_0(src[ 4])];\
dst[ 3]  = groestl_T0[groestl_EXT_BYTE_0(src[ 3])];\
dst[ 4]  = groestl_T0[groestl_EXT_BYTE_0(src[ 6])];\
dst[ 5]  = groestl_T0[groestl_EXT_BYTE_0(src[ 5])];\
dst[ 6]  = groestl_T0[groestl_EXT_BYTE_0(src[ 8])];\
dst[ 7]  = groestl_T0[groestl_EXT_BYTE_0(src[ 7])];\
dst[ 8]  = groestl_T0[groestl_EXT_BYTE_0(src[10])];\
dst[ 9]  = groestl_T0[groestl_EXT_BYTE_0(src[ 9])];\
dst[10]  = groestl_T0[groestl_EXT_BYTE_0(src[12])];\
dst[11]  = groestl_T0[groestl_EXT_BYTE_0(src[11])];\
dst[12]  = groestl_T0[groestl_EXT_BYTE_0(src[14])];\
dst[13]  = groestl_T0[groestl_EXT_BYTE_0(src[13])];\
dst[14]  = groestl_T0[groestl_EXT_BYTE_0(src[16])];\
dst[15]  = groestl_T0[groestl_EXT_BYTE_0(src[15])];\
dst[16]  = groestl_T0[groestl_EXT_BYTE_0(src[18])];\
dst[17]  = groestl_T0[groestl_EXT_BYTE_0(src[17])];\
dst[18]  = groestl_T0[groestl_EXT_BYTE_0(src[20])];\
dst[19]  = groestl_T0[groestl_EXT_BYTE_0(src[19])];\
dst[20]  = groestl_T0[groestl_EXT_BYTE_0(src[22])];\
dst[21]  = groestl_T0[groestl_EXT_BYTE_0(src[21])];\
dst[22]  = groestl_T0[groestl_EXT_BYTE_0(src[24])];\
dst[23]  = groestl_T0[groestl_EXT_BYTE_0(src[23])];\
dst[24]  = groestl_T0[groestl_EXT_BYTE_0(src[26])];\
dst[25]  = groestl_T0[groestl_EXT_BYTE_0(src[25])];\
dst[26]  = groestl_T0[groestl_EXT_BYTE_0(src[28])];\
dst[27]  = groestl_T0[groestl_EXT_BYTE_0(src[27])];\
dst[28]  = groestl_T0[groestl_EXT_BYTE_0(src[30])];\
dst[29]  = groestl_T0[groestl_EXT_BYTE_0(src[29])];\
dst[30]  = groestl_T0[groestl_EXT_BYTE_0(src[ 0])];\
dst[31]  = groestl_T0[groestl_EXT_BYTE_0(src[31])];\
dst[ 0] ^= groestl_T1[groestl_EXT_BYTE_1(src[ 6])];\
dst[ 1] ^= groestl_T1[groestl_EXT_BYTE_1(src[ 5])];\
dst[ 2] ^= groestl_T1[groestl_EXT_BYTE_1(src[ 8])];\
dst[ 3] ^= groestl_T1[groestl_EXT_BYTE_1(src[ 7])];\
dst[ 4] ^= groestl_T1[groestl_EXT_BYTE_1(src[10])];\
dst[ 5] ^= groestl_T1[groestl_EXT_BYTE_1(src[ 9])];\
dst[ 6] ^= groestl_T1[groestl_EXT_BYTE_1(src[12])];\
dst[ 7] ^= groestl_T1[groestl_EXT_BYTE_1(src[11])];\
dst[ 8] ^= groestl_T1[groestl_EXT_BYTE_1(src[14])];\
dst[ 9] ^= groestl_T1[groestl_EXT_BYTE_1(src[13])];\
dst[10] ^= groestl_T1[groestl_EXT_BYTE_1(src[16])];\
dst[11] ^= groestl_T1[groestl_EXT_BYTE_1(src[15])];\
dst[12] ^= groestl_T1[groestl_EXT_BYTE_1(src[18])];\
dst[13] ^= groestl_T1[groestl_EXT_BYTE_1(src[17])];\
dst[14] ^= groestl_T1[groestl_EXT_BYTE_1(src[20])];\
dst[15] ^= groestl_T1[groestl_EXT_BYTE_1(src[19])];\
dst[16] ^= groestl_T1[groestl_EXT_BYTE_1(src[22])];\
dst[17] ^= groestl_T1[groestl_EXT_BYTE_1(src[21])];\
dst[18] ^= groestl_T1[groestl_EXT_BYTE_1(src[24])];\
dst[19] ^= groestl_T1[groestl_EXT_BYTE_1(src[23])];\
dst[20] ^= groestl_T1[groestl_EXT_BYTE_1(src[26])];\
dst[21] ^= groestl_T1[groestl_EXT_BYTE_1(src[25])];\
dst[22] ^= groestl_T1[groestl_EXT_BYTE_1(src[28])];\
dst[23] ^= groestl_T1[groestl_EXT_BYTE_1(src[27])];\
dst[24] ^= groestl_T1[groestl_EXT_BYTE_1(src[30])];\
dst[25] ^= groestl_T1[groestl_EXT_BYTE_1(src[29])];\
dst[26] ^= groestl_T1[groestl_EXT_BYTE_1(src[ 0])];\
dst[27] ^= groestl_T1[groestl_EXT_BYTE_1(src[31])];\
dst[28] ^= groestl_T1[groestl_EXT_BYTE_1(src[ 2])];\
dst[29] ^= groestl_T1[groestl_EXT_BYTE_1(src[ 1])];\
dst[30] ^= groestl_T1[groestl_EXT_BYTE_1(src[ 4])];\
dst[31] ^= groestl_T1[groestl_EXT_BYTE_1(src[ 3])];\
dst[ 0] ^= groestl_T2[groestl_EXT_BYTE_2(src[10])];\
dst[ 1] ^= groestl_T2[groestl_EXT_BYTE_2(src[ 9])];\
dst[ 2] ^= groestl_T2[groestl_EXT_BYTE_2(src[12])];\
dst[ 3] ^= groestl_T2[groestl_EXT_BYTE_2(src[11])];\
dst[ 4] ^= groestl_T2[groestl_EXT_BYTE_2(src[14])];\
dst[ 5] ^= groestl_T2[groestl_EXT_BYTE_2(src[13])];\
dst[ 6] ^= groestl_T2[groestl_EXT_BYTE_2(src[16])];\
dst[ 7] ^= groestl_T2[groestl_EXT_BYTE_2(src[15])];\
dst[ 8] ^= groestl_T2[groestl_EXT_BYTE_2(src[18])];\
dst[ 9] ^= groestl_T2[groestl_EXT_BYTE_2(src[17])];\
dst[10] ^= groestl_T2[groestl_EXT_BYTE_2(src[20])];\
dst[11] ^= groestl_T2[groestl_EXT_BYTE_2(src[19])];\
dst[12] ^= groestl_T2[groestl_EXT_BYTE_2(src[22])];\
dst[13] ^= groestl_T2[groestl_EXT_BYTE_2(src[21])];\
dst[14] ^= groestl_T2[groestl_EXT_BYTE_2(src[24])];\
dst[15] ^= groestl_T2[groestl_EXT_BYTE_2(src[23])];\
dst[16] ^= groestl_T2[groestl_EXT_BYTE_2(src[26])];\
dst[17] ^= groestl_T2[groestl_EXT_BYTE_2(src[25])];\
dst[18] ^= groestl_T2[groestl_EXT_BYTE_2(src[28])];\
dst[19] ^= groestl_T2[groestl_EXT_BYTE_2(src[27])];\
dst[20] ^= groestl_T2[groestl_EXT_BYTE_2(src[30])];\
dst[21] ^= groestl_T2[groestl_EXT_BYTE_2(src[29])];\
dst[22] ^= groestl_T2[groestl_EXT_BYTE_2(src[ 0])];\
dst[23] ^= groestl_T2[groestl_EXT_BYTE_2(src[31])];\
dst[24] ^= groestl_T2[groestl_EXT_BYTE_2(src[ 2])];\
dst[25] ^= groestl_T2[groestl_EXT_BYTE_2(src[ 1])];\
dst[26] ^= groestl_T2[groestl_EXT_BYTE_2(src[ 4])];\
dst[27] ^= groestl_T2[groestl_EXT_BYTE_2(src[ 3])];\
dst[28] ^= groestl_T2[groestl_EXT_BYTE_2(src[ 6])];\
dst[29] ^= groestl_T2[groestl_EXT_BYTE_2(src[ 5])];\
dst[30] ^= groestl_T2[groestl_EXT_BYTE_2(src[ 8])];\
dst[31] ^= groestl_T2[groestl_EXT_BYTE_2(src[ 7])];\
dst[ 0] ^= groestl_T3[groestl_EXT_BYTE_3(src[22])];\
dst[ 1] ^= groestl_T3[groestl_EXT_BYTE_3(src[13])];\
dst[ 2] ^= groestl_T3[groestl_EXT_BYTE_3(src[24])];\
dst[ 3] ^= groestl_T3[groestl_EXT_BYTE_3(src[15])];\
dst[ 4] ^= groestl_T3[groestl_EXT_BYTE_3(src[26])];\
dst[ 5] ^= groestl_T3[groestl_EXT_BYTE_3(src[17])];\
dst[ 6] ^= groestl_T3[groestl_EXT_BYTE_3(src[28])];\
dst[ 7] ^= groestl_T3[groestl_EXT_BYTE_3(src[19])];\
dst[ 8] ^= groestl_T3[groestl_EXT_BYTE_3(src[30])];\
dst[ 9] ^= groestl_T3[groestl_EXT_BYTE_3(src[21])];\
dst[10] ^= groestl_T3[groestl_EXT_BYTE_3(src[ 0])];\
dst[11] ^= groestl_T3[groestl_EXT_BYTE_3(src[23])];\
dst[12] ^= groestl_T3[groestl_EXT_BYTE_3(src[ 2])];\
dst[13] ^= groestl_T3[groestl_EXT_BYTE_3(src[25])];\
dst[14] ^= groestl_T3[groestl_EXT_BYTE_3(src[ 4])];\
dst[15] ^= groestl_T3[groestl_EXT_BYTE_3(src[27])];\
dst[16] ^= groestl_T3[groestl_EXT_BYTE_3(src[ 6])];\
dst[17] ^= groestl_T3[groestl_EXT_BYTE_3(src[29])];\
dst[18] ^= groestl_T3[groestl_EXT_BYTE_3(src[ 8])];\
dst[19] ^= groestl_T3[groestl_EXT_BYTE_3(src[31])];\
dst[20] ^= groestl_T3[groestl_EXT_BYTE_3(src[10])];\
dst[21] ^= groestl_T3[groestl_EXT_BYTE_3(src[ 1])];\
dst[22] ^= groestl_T3[groestl_EXT_BYTE_3(src[12])];\
dst[23] ^= groestl_T3[groestl_EXT_BYTE_3(src[ 3])];\
dst[24] ^= groestl_T3[groestl_EXT_BYTE_3(src[14])];\
dst[25] ^= groestl_T3[groestl_EXT_BYTE_3(src[ 5])];\
dst[26] ^= groestl_T3[groestl_EXT_BYTE_3(src[16])];\
dst[27] ^= groestl_T3[groestl_EXT_BYTE_3(src[ 7])];\
dst[28] ^= groestl_T3[groestl_EXT_BYTE_3(src[18])];\
dst[29] ^= groestl_T3[groestl_EXT_BYTE_3(src[ 9])];\
dst[30] ^= groestl_T3[groestl_EXT_BYTE_3(src[20])];\
dst[31] ^= groestl_T3[groestl_EXT_BYTE_3(src[11])];\
dst[ 0] ^= groestl_T4[groestl_EXT_BYTE_0(src[ 1])];\
dst[ 1] ^= groestl_T4[groestl_EXT_BYTE_0(src[ 2])];\
dst[ 2] ^= groestl_T4[groestl_EXT_BYTE_0(src[ 3])];\
dst[ 3] ^= groestl_T4[groestl_EXT_BYTE_0(src[ 4])];\
dst[ 4] ^= groestl_T4[groestl_EXT_BYTE_0(src[ 5])];\
dst[ 5] ^= groestl_T4[groestl_EXT_BYTE_0(src[ 6])];\
dst[ 6] ^= groestl_T4[groestl_EXT_BYTE_0(src[ 7])];\
dst[ 7] ^= groestl_T4[groestl_EXT_BYTE_0(src[ 8])];\
dst[ 8] ^= groestl_T4[groestl_EXT_BYTE_0(src[ 9])];\
dst[ 9] ^= groestl_T4[groestl_EXT_BYTE_0(src[10])];\
dst[10] ^= groestl_T4[groestl_EXT_BYTE_0(src[11])];\
dst[11] ^= groestl_T4[groestl_EXT_BYTE_0(src[12])];\
dst[12] ^= groestl_T4[groestl_EXT_BYTE_0(src[13])];\
dst[13] ^= groestl_T4[groestl_EXT_BYTE_0(src[14])];\
dst[14] ^= groestl_T4[groestl_EXT_BYTE_0(src[15])];\
dst[15] ^= groestl_T4[groestl_EXT_BYTE_0(src[16])];\
dst[16] ^= groestl_T4[groestl_EXT_BYTE_0(src[17])];\
dst[17] ^= groestl_T4[groestl_EXT_BYTE_0(src[18])];\
dst[18] ^= groestl_T4[groestl_EXT_BYTE_0(src[19])];\
dst[19] ^= groestl_T4[groestl_EXT_BYTE_0(src[20])];\
dst[20] ^= groestl_T4[groestl_EXT_BYTE_0(src[21])];\
dst[21] ^= groestl_T4[groestl_EXT_BYTE_0(src[22])];\
dst[22] ^= groestl_T4[groestl_EXT_BYTE_0(src[23])];\
dst[23] ^= groestl_T4[groestl_EXT_BYTE_0(src[24])];\
dst[24] ^= groestl_T4[groestl_EXT_BYTE_0(src[25])];\
dst[25] ^= groestl_T4[groestl_EXT_BYTE_0(src[26])];\
dst[26] ^= groestl_T4[groestl_EXT_BYTE_0(src[27])];\
dst[27] ^= groestl_T4[groestl_EXT_BYTE_0(src[28])];\
dst[28] ^= groestl_T4[groestl_EXT_BYTE_0(src[29])];\
dst[29] ^= groestl_T4[groestl_EXT_BYTE_0(src[30])];\
dst[30] ^= groestl_T4[groestl_EXT_BYTE_0(src[31])];\
dst[31] ^= groestl_T4[groestl_EXT_BYTE_0(src[ 0])];\
dst[ 0] ^= groestl_T5[groestl_EXT_BYTE_1(src[ 5])];\
dst[ 1] ^= groestl_T5[groestl_EXT_BYTE_1(src[ 6])];\
dst[ 2] ^= groestl_T5[groestl_EXT_BYTE_1(src[ 7])];\
dst[ 3] ^= groestl_T5[groestl_EXT_BYTE_1(src[ 8])];\
dst[ 4] ^= groestl_T5[groestl_EXT_BYTE_1(src[ 9])];\
dst[ 5] ^= groestl_T5[groestl_EXT_BYTE_1(src[10])];\
dst[ 6] ^= groestl_T5[groestl_EXT_BYTE_1(src[11])];\
dst[ 7] ^= groestl_T5[groestl_EXT_BYTE_1(src[12])];\
dst[ 8] ^= groestl_T5[groestl_EXT_BYTE_1(src[13])];\
dst[ 9] ^= groestl_T5[groestl_EXT_BYTE_1(src[14])];\
dst[10] ^= groestl_T5[groestl_EXT_BYTE_1(src[15])];\
dst[11] ^= groestl_T5[groestl_EXT_BYTE_1(src[16])];\
dst[12] ^= groestl_T5[groestl_EXT_BYTE_1(src[17])];\
dst[13] ^= groestl_T5[groestl_EXT_BYTE_1(src[18])];\
dst[14] ^= groestl_T5[groestl_EXT_BYTE_1(src[19])];\
dst[15] ^= groestl_T5[groestl_EXT_BYTE_1(src[20])];\
dst[16] ^= groestl_T5[groestl_EXT_BYTE_1(src[21])];\
dst[17] ^= groestl_T5[groestl_EXT_BYTE_1(src[22])];\
dst[18] ^= groestl_T5[groestl_EXT_BYTE_1(src[23])];\
dst[19] ^= groestl_T5[groestl_EXT_BYTE_1(src[24])];\
dst[20] ^= groestl_T5[groestl_EXT_BYTE_1(src[25])];\
dst[21] ^= groestl_T5[groestl_EXT_BYTE_1(src[26])];\
dst[22] ^= groestl_T5[groestl_EXT_BYTE_1(src[27])];\
dst[23] ^= groestl_T5[groestl_EXT_BYTE_1(src[28])];\
dst[24] ^= groestl_T5[groestl_EXT_BYTE_1(src[29])];\
dst[25] ^= groestl_T5[groestl_EXT_BYTE_1(src[30])];\
dst[26] ^= groestl_T5[groestl_EXT_BYTE_1(src[31])];\
dst[27] ^= groestl_T5[groestl_EXT_BYTE_1(src[ 0])];\
dst[28] ^= groestl_T5[groestl_EXT_BYTE_1(src[ 1])];\
dst[29] ^= groestl_T5[groestl_EXT_BYTE_1(src[ 2])];\
dst[30] ^= groestl_T5[groestl_EXT_BYTE_1(src[ 3])];\
dst[31] ^= groestl_T5[groestl_EXT_BYTE_1(src[ 4])];\
dst[ 0] ^= groestl_T6[groestl_EXT_BYTE_2(src[ 9])];\
dst[ 1] ^= groestl_T6[groestl_EXT_BYTE_2(src[10])];\
dst[ 2] ^= groestl_T6[groestl_EXT_BYTE_2(src[11])];\
dst[ 3] ^= groestl_T6[groestl_EXT_BYTE_2(src[12])];\
dst[ 4] ^= groestl_T6[groestl_EXT_BYTE_2(src[13])];\
dst[ 5] ^= groestl_T6[groestl_EXT_BYTE_2(src[14])];\
dst[ 6] ^= groestl_T6[groestl_EXT_BYTE_2(src[15])];\
dst[ 7] ^= groestl_T6[groestl_EXT_BYTE_2(src[16])];\
dst[ 8] ^= groestl_T6[groestl_EXT_BYTE_2(src[17])];\
dst[ 9] ^= groestl_T6[groestl_EXT_BYTE_2(src[18])];\
dst[10] ^= groestl_T6[groestl_EXT_BYTE_2(src[19])];\
dst[11] ^= groestl_T6[groestl_EXT_BYTE_2(src[20])];\
dst[12] ^= groestl_T6[groestl_EXT_BYTE_2(src[21])];\
dst[13] ^= groestl_T6[groestl_EXT_BYTE_2(src[22])];\
dst[14] ^= groestl_T6[groestl_EXT_BYTE_2(src[23])];\
dst[15] ^= groestl_T6[groestl_EXT_BYTE_2(src[24])];\
dst[16] ^= groestl_T6[groestl_EXT_BYTE_2(src[25])];\
dst[17] ^= groestl_T6[groestl_EXT_BYTE_2(src[26])];\
dst[18] ^= groestl_T6[groestl_EXT_BYTE_2(src[27])];\
dst[19] ^= groestl_T6[groestl_EXT_BYTE_2(src[28])];\
dst[20] ^= groestl_T6[groestl_EXT_BYTE_2(src[29])];\
dst[21] ^= groestl_T6[groestl_EXT_BYTE_2(src[30])];\
dst[22] ^= groestl_T6[groestl_EXT_BYTE_2(src[31])];\
dst[23] ^= groestl_T6[groestl_EXT_BYTE_2(src[ 0])];\
dst[24] ^= groestl_T6[groestl_EXT_BYTE_2(src[ 1])];\
dst[25] ^= groestl_T6[groestl_EXT_BYTE_2(src[ 2])];\
dst[26] ^= groestl_T6[groestl_EXT_BYTE_2(src[ 3])];\
dst[27] ^= groestl_T6[groestl_EXT_BYTE_2(src[ 4])];\
dst[28] ^= groestl_T6[groestl_EXT_BYTE_2(src[ 5])];\
dst[29] ^= groestl_T6[groestl_EXT_BYTE_2(src[ 6])];\
dst[30] ^= groestl_T6[groestl_EXT_BYTE_2(src[ 7])];\
dst[31] ^= groestl_T6[groestl_EXT_BYTE_2(src[ 8])];\
dst[ 0] ^= groestl_T7[groestl_EXT_BYTE_3(src[13])];\
dst[ 1] ^= groestl_T7[groestl_EXT_BYTE_3(src[22])];\
dst[ 2] ^= groestl_T7[groestl_EXT_BYTE_3(src[15])];\
dst[ 3] ^= groestl_T7[groestl_EXT_BYTE_3(src[24])];\
dst[ 4] ^= groestl_T7[groestl_EXT_BYTE_3(src[17])];\
dst[ 5] ^= groestl_T7[groestl_EXT_BYTE_3(src[26])];\
dst[ 6] ^= groestl_T7[groestl_EXT_BYTE_3(src[19])];\
dst[ 7] ^= groestl_T7[groestl_EXT_BYTE_3(src[28])];\
dst[ 8] ^= groestl_T7[groestl_EXT_BYTE_3(src[21])];\
dst[ 9] ^= groestl_T7[groestl_EXT_BYTE_3(src[30])];\
dst[10] ^= groestl_T7[groestl_EXT_BYTE_3(src[23])];\
dst[11] ^= groestl_T7[groestl_EXT_BYTE_3(src[ 0])];\
dst[12] ^= groestl_T7[groestl_EXT_BYTE_3(src[25])];\
dst[13] ^= groestl_T7[groestl_EXT_BYTE_3(src[ 2])];\
dst[14] ^= groestl_T7[groestl_EXT_BYTE_3(src[27])];\
dst[15] ^= groestl_T7[groestl_EXT_BYTE_3(src[ 4])];\
dst[16] ^= groestl_T7[groestl_EXT_BYTE_3(src[29])];\
dst[17] ^= groestl_T7[groestl_EXT_BYTE_3(src[ 6])];\
dst[18] ^= groestl_T7[groestl_EXT_BYTE_3(src[31])];\
dst[19] ^= groestl_T7[groestl_EXT_BYTE_3(src[ 8])];\
dst[20] ^= groestl_T7[groestl_EXT_BYTE_3(src[ 1])];\
dst[21] ^= groestl_T7[groestl_EXT_BYTE_3(src[10])];\
dst[22] ^= groestl_T7[groestl_EXT_BYTE_3(src[ 3])];\
dst[23] ^= groestl_T7[groestl_EXT_BYTE_3(src[12])];\
dst[24] ^= groestl_T7[groestl_EXT_BYTE_3(src[ 5])];\
dst[25] ^= groestl_T7[groestl_EXT_BYTE_3(src[14])];\
dst[26] ^= groestl_T7[groestl_EXT_BYTE_3(src[ 7])];\
dst[27] ^= groestl_T7[groestl_EXT_BYTE_3(src[16])];\
dst[28] ^= groestl_T7[groestl_EXT_BYTE_3(src[ 9])];\
dst[29] ^= groestl_T7[groestl_EXT_BYTE_3(src[18])];\
dst[30] ^= groestl_T7[groestl_EXT_BYTE_3(src[11])];\
dst[31] ^= groestl_T7[groestl_EXT_BYTE_3(src[20])];

// init
const CONSTANT UINT32 groestl_T_init[256*8] =
{
0xa5f432c6UL,0x84976ff8UL,0x99b05eeeUL,0x8d8c7af6UL,0x0d17e8ffUL,0xbddc0ad6UL,0xb1c816deUL,0x54fc6d91UL,0x50f09060UL,0x03050702UL,0xa9e02eceUL,0x7d87d156UL,0x192bcce7UL,0x62a613b5UL,0xe6317c4dUL,0x9ab559ecUL,0x45cf408fUL,0x9dbca31fUL,0x40c04989UL,0x879268faUL,0x153fd0efUL,0xeb2694b2UL,0xc940ce8eUL,0x0b1de6fbUL,0xec2f6e41UL,0x67a91ab3UL,0xfd1c435fUL,0xea256045UL,0xbfdaf923UL,0xf7025153UL,0x96a145e4UL,0x5bed769bUL,0xc25d2875UL,0x1c24c5e1UL,0xaee9d43dUL,0x6abef24cUL,0x5aee826cUL,0x41c3bd7eUL,0x0206f3f5UL,0x4fd15283UL,0x5ce48c68UL,0xf4075651UL,0x345c8dd1UL,0x0818e1f9UL,0x93ae4ce2UL,0x73953eabUL,0x53f59762UL,0x3f416b2aUL,0x0c141c08UL,0x52f66395UL,0x65afe946UL,0x5ee27f9dUL,0x28784830UL,0xa1f8cf37UL,0x0f111b0aUL,0xb5c4eb2fUL,0x091b150eUL,0x365a7e24UL,0x9bb6ad1bUL,0x3d4798dfUL,0x266aa7cdUL,0x69bbf54eUL,0xcd4c337fUL,0x9fba50eaUL,0x1b2d3f12UL,0x9eb9a41dUL,0x749cc458UL,0x2e724634UL,0x2d774136UL,0xb2cd11dcUL,0xee299db4UL,0xfb164d5bUL,0xf601a5a4UL,0x4dd7a176UL,0x61a314b7UL,0xce49347dUL,0x7b8ddf52UL,0x3e429fddUL,0x7193cd5eUL,0x97a2b113UL,0xf504a2a6UL,0x68b801b9UL,0x00000000UL,0x2c74b5c1UL,0x60a0e040UL,0x1f21c2e3UL,0xc8433a79UL,0xed2c9ab6UL,0xbed90dd4UL,0x46ca478dUL,0xd9701767UL,0x4bddaf72UL,0xde79ed94UL,0xd467ff98UL,0xe82393b0UL,0x4ade5b85UL,0x6bbd06bbUL,0x2a7ebbc5UL,0xe5347b4fUL,0x163ad7edUL,0xc554d286UL,0xd762f89aUL,0x55ff9966UL,0x94a7b611UL,0xcf4ac08aUL,0x1030d9e9UL,0x060a0e04UL,0x819866feUL,0xf00baba0UL,0x44ccb478UL,0xbad5f025UL,0xe33e754bUL,0xf30eaca2UL,0xfe19445dUL,0xc05bdb80UL,0x8a858005UL,0xadecd33fUL,0xbcdffe21UL,0x48d8a870UL,0x040cfdf1UL,0xdf7a1963UL,0xc1582f77UL,0x759f30afUL,0x63a5e742UL,0x30507020UL,0x1a2ecbe5UL,0x0e12effdUL,0x6db708bfUL,0x4cd45581UL,0x143c2418UL,0x355f7926UL,0x2f71b2c3UL,0xe13886beUL,0xa2fdc835UL,0xcc4fc788UL,0x394b652eUL,0x57f96a93UL,0xf20d5855UL,0x829d61fcUL,0x47c9b37aUL,0xacef27c8UL,0xe73288baUL,0x2b7d4f32UL,0x95a442e6UL,0xa0fb3bc0UL,0x98b3aa19UL,0xd168f69eUL,0x7f8122a3UL,0x66aaee44UL,0x7e82d654UL,0xabe6dd3bUL,0x839e950bUL,0xca45c98cUL,0x297bbcc7UL,0xd36e056bUL,0x3c446c28UL,0x798b2ca7UL,0xe23d81bcUL,0x1d273116UL,0x769a37adUL,0x3b4d96dbUL,0x56fa9e64UL,0x4ed2a674UL,0x1e223614UL,0xdb76e492UL,0x0a1e120cUL,0x6cb4fc48UL,0xe4378fb8UL,0x5de7789fUL,0x6eb20fbdUL,0xef2a6943UL,0xa6f135c4UL,0xa8e3da39UL,0xa4f7c631UL,0x37598ad3UL,0x8b8674f2UL,0x325683d5UL,0x43c54e8bUL,0x59eb856eUL,0xb7c218daUL,0x8c8f8e01UL,0x64ac1db1UL,0xd26df19cUL,0xe03b7249UL,0xb4c71fd8UL,0xfa15b9acUL,0x0709faf3UL,0x256fa0cfUL,0xafea20caUL,0x8e897df4UL,0xe9206747UL,0x18283810UL,0xd5640b6fUL,0x888373f0UL,0x6fb1fb4aUL,0x7296ca5cUL,0x246c5438UL,0xf1085f57UL,0xc7522173UL,0x51f36497UL,0x2365aecbUL,0x7c8425a1UL,0x9cbf57e8UL,0x21635d3eUL,0xdd7cea96UL,0xdc7f1e61UL,0x86919c0dUL,0x85949b0fUL,0x90ab4be0UL,0x42c6ba7cUL,0xc4572671UL,0xaae529ccUL,0xd873e390UL,0x050f0906UL,0x0103f4f7UL,0x12362a1cUL,0xa3fe3cc2UL,0x5fe18b6aUL,0xf910beaeUL,0xd06b0269UL,0x91a8bf17UL,0x58e87199UL,0x2769533aUL,0xb9d0f727UL,0x384891d9UL,0x1335deebUL,0xb3cee52bUL,0x33557722UL,0xbbd604d2UL,0x709039a9UL,0x89808707UL,0xa7f2c133UL,0xb6c1ec2dUL,0x22665a3cUL,0x92adb815UL,0x2060a9c9UL,0x49db5c87UL,0xff1ab0aaUL,0x7888d850UL,0x7a8e2ba5UL,0x8f8a8903UL,0xf8134a59UL,0x809b9209UL,0x1739231aUL,0xda751065UL,0x315384d7UL,0xc651d584UL,0xb8d303d0UL,0xc35edc82UL,0xb0cbe229UL,0x7799c35aUL,0x11332d1eUL,0xcb463d7bUL,0xfc1fb7a8UL,0xd6610c6dUL,0x3a4e622cUL,
0xf432c6c6UL,0x976ff8f8UL,0xb05eeeeeUL,0x8c7af6f6UL,0x17e8ffffUL,0xdc0ad6d6UL,0xc816dedeUL,0xfc6d9191UL,0xf0906060UL,0x05070202UL,0xe02ececeUL,0x87d15656UL,0x2bcce7e7UL,0xa613b5b5UL,0x317c4d4dUL,0xb559ececUL,0xcf408f8fUL,0xbca31f1fUL,0xc0498989UL,0x9268fafaUL,0x3fd0efefUL,0x2694b2b2UL,0x40ce8e8eUL,0x1de6fbfbUL,0x2f6e4141UL,0xa91ab3b3UL,0x1c435f5fUL,0x25604545UL,0xdaf92323UL,0x02515353UL,0xa145e4e4UL,0xed769b9bUL,0x5d287575UL,0x24c5e1e1UL,0xe9d43d3dUL,0xbef24c4cUL,0xee826c6cUL,0xc3bd7e7eUL,0x06f3f5f5UL,0xd1528383UL,0xe48c6868UL,0x07565151UL,0x5c8dd1d1UL,0x18e1f9f9UL,0xae4ce2e2UL,0x953eababUL,0xf5976262UL,0x416b2a2aUL,0x141c0808UL,0xf6639595UL,0xafe94646UL,0xe27f9d9dUL,0x78483030UL,0xf8cf3737UL,0x111b0a0aUL,0xc4eb2f2fUL,0x1b150e0eUL,0x5a7e2424UL,0xb6ad1b1bUL,0x4798dfdfUL,0x6aa7cdcdUL,0xbbf54e4eUL,0x4c337f7fUL,0xba50eaeaUL,0x2d3f1212UL,0xb9a41d1dUL,0x9cc45858UL,0x72463434UL,0x77413636UL,0xcd11dcdcUL,0x299db4b4UL,0x164d5b5bUL,0x01a5a4a4UL,0xd7a17676UL,0xa314b7b7UL,0x49347d7dUL,0x8ddf5252UL,0x429fddddUL,0x93cd5e5eUL,0xa2b11313UL,0x04a2a6a6UL,0xb801b9b9UL,0x00000000UL,0x74b5c1c1UL,0xa0e04040UL,0x21c2e3e3UL,0x433a7979UL,0x2c9ab6b6UL,0xd90dd4d4UL,0xca478d8dUL,0x70176767UL,0xddaf7272UL,0x79ed9494UL,0x67ff9898UL,0x2393b0b0UL,0xde5b8585UL,0xbd06bbbbUL,0x7ebbc5c5UL,0x347b4f4fUL,0x3ad7ededUL,0x54d28686UL,0x62f89a9aUL,0xff996666UL,0xa7b61111UL,0x4ac08a8aUL,0x30d9e9e9UL,0x0a0e0404UL,0x9866fefeUL,0x0baba0a0UL,0xccb47878UL,0xd5f02525UL,0x3e754b4bUL,0x0eaca2a2UL,0x19445d5dUL,0x5bdb8080UL,0x85800505UL,0xecd33f3fUL,0xdffe2121UL,0xd8a87070UL,0x0cfdf1f1UL,0x7a196363UL,0x582f7777UL,0x9f30afafUL,0xa5e74242UL,0x50702020UL,0x2ecbe5e5UL,0x12effdfdUL,0xb708bfbfUL,0xd4558181UL,0x3c241818UL,0x5f792626UL,0x71b2c3c3UL,0x3886bebeUL,0xfdc83535UL,0x4fc78888UL,0x4b652e2eUL,0xf96a9393UL,0x0d585555UL,0x9d61fcfcUL,0xc9b37a7aUL,0xef27c8c8UL,0x3288babaUL,0x7d4f3232UL,0xa442e6e6UL,0xfb3bc0c0UL,0xb3aa1919UL,0x68f69e9eUL,0x8122a3a3UL,0xaaee4444UL,0x82d65454UL,0xe6dd3b3bUL,0x9e950b0bUL,0x45c98c8cUL,0x7bbcc7c7UL,0x6e056b6bUL,0x446c2828UL,0x8b2ca7a7UL,0x3d81bcbcUL,0x27311616UL,0x9a37adadUL,0x4d96dbdbUL,0xfa9e6464UL,0xd2a67474UL,0x22361414UL,0x76e49292UL,0x1e120c0cUL,0xb4fc4848UL,0x378fb8b8UL,0xe7789f9fUL,0xb20fbdbdUL,0x2a694343UL,0xf135c4c4UL,0xe3da3939UL,0xf7c63131UL,0x598ad3d3UL,0x8674f2f2UL,0x5683d5d5UL,0xc54e8b8bUL,0xeb856e6eUL,0xc218dadaUL,0x8f8e0101UL,0xac1db1b1UL,0x6df19c9cUL,0x3b724949UL,0xc71fd8d8UL,0x15b9acacUL,0x09faf3f3UL,0x6fa0cfcfUL,0xea20cacaUL,0x897df4f4UL,0x20674747UL,0x28381010UL,0x640b6f6fUL,0x8373f0f0UL,0xb1fb4a4aUL,0x96ca5c5cUL,0x6c543838UL,0x085f5757UL,0x52217373UL,0xf3649797UL,0x65aecbcbUL,0x8425a1a1UL,0xbf57e8e8UL,0x635d3e3eUL,0x7cea9696UL,0x7f1e6161UL,0x919c0d0dUL,0x949b0f0fUL,0xab4be0e0UL,0xc6ba7c7cUL,0x57267171UL,0xe529ccccUL,0x73e39090UL,0x0f090606UL,0x03f4f7f7UL,0x362a1c1cUL,0xfe3cc2c2UL,0xe18b6a6aUL,0x10beaeaeUL,0x6b026969UL,0xa8bf1717UL,0xe8719999UL,0x69533a3aUL,0xd0f72727UL,0x4891d9d9UL,0x35deebebUL,0xcee52b2bUL,0x55772222UL,0xd604d2d2UL,0x9039a9a9UL,0x80870707UL,0xf2c13333UL,0xc1ec2d2dUL,0x665a3c3cUL,0xadb81515UL,0x60a9c9c9UL,0xdb5c8787UL,0x1ab0aaaaUL,0x88d85050UL,0x8e2ba5a5UL,0x8a890303UL,0x134a5959UL,0x9b920909UL,0x39231a1aUL,0x75106565UL,0x5384d7d7UL,0x51d58484UL,0xd303d0d0UL,0x5edc8282UL,0xcbe22929UL,0x99c35a5aUL,0x332d1e1eUL,0x463d7b7bUL,0x1fb7a8a8UL,0x610c6d6dUL,0x4e622c2cUL,
0x32c6c6a5UL,0x6ff8f884UL,0x5eeeee99UL,0x7af6f68dUL,0xe8ffff0dUL,0x0ad6d6bdUL,0x16dedeb1UL,0x6d919154UL,0x90606050UL,0x07020203UL,0x2ececea9UL,0xd156567dUL,0xcce7e719UL,0x13b5b562UL,0x7c4d4de6UL,0x59ecec9aUL,0x408f8f45UL,0xa31f1f9dUL,0x49898940UL,0x68fafa87UL,0xd0efef15UL,0x94b2b2ebUL,0xce8e8ec9UL,0xe6fbfb0bUL,0x6e4141ecUL,0x1ab3b367UL,0x435f5ffdUL,0x604545eaUL,0xf92323bfUL,0x515353f7UL,0x45e4e496UL,0x769b9b5bUL,0x287575c2UL,0xc5e1e11cUL,0xd43d3daeUL,0xf24c4c6aUL,0x826c6c5aUL,0xbd7e7e41UL,0xf3f5f502UL,0x5283834fUL,0x8c68685cUL,0x565151f4UL,0x8dd1d134UL,0xe1f9f908UL,0x4ce2e293UL,0x3eabab73UL,0x97626253UL,0x6b2a2a3fUL,0x1c08080cUL,0x63959552UL,0xe9464665UL,0x7f9d9d5eUL,0x48303028UL,0xcf3737a1UL,0x1b0a0a0fUL,0xeb2f2fb5UL,0x150e0e09UL,0x7e242436UL,0xad1b1b9bUL,0x98dfdf3dUL,0xa7cdcd26UL,0xf54e4e69UL,0x337f7fcdUL,0x50eaea9fUL,0x3f12121bUL,0xa41d1d9eUL,0xc4585874UL,0x4634342eUL,0x4136362dUL,0x11dcdcb2UL,0x9db4b4eeUL,0x4d5b5bfbUL,0xa5a4a4f6UL,0xa176764dUL,0x14b7b761UL,0x347d7dceUL,0xdf52527bUL,0x9fdddd3eUL,0xcd5e5e71UL,0xb1131397UL,0xa2a6a6f5UL,0x01b9b968UL,0x00000000UL,0xb5c1c12cUL,0xe0404060UL,0xc2e3e31fUL,0x3a7979c8UL,0x9ab6b6edUL,0x0dd4d4beUL,0x478d8d46UL,0x176767d9UL,0xaf72724bUL,0xed9494deUL,0xff9898d4UL,0x93b0b0e8UL,0x5b85854aUL,0x06bbbb6bUL,0xbbc5c52aUL,0x7b4f4fe5UL,0xd7eded16UL,0xd28686c5UL,0xf89a9ad7UL,0x99666655UL,0xb6111194UL,0xc08a8acfUL,0xd9e9e910UL,0x0e040406UL,0x66fefe81UL,0xaba0a0f0UL,0xb4787844UL,0xf02525baUL,0x754b4be3UL,0xaca2a2f3UL,0x445d5dfeUL,0xdb8080c0UL,0x8005058aUL,0xd33f3fadUL,0xfe2121bcUL,0xa8707048UL,0xfdf1f104UL,0x196363dfUL,0x2f7777c1UL,0x30afaf75UL,0xe7424263UL,0x70202030UL,0xcbe5e51aUL,0xeffdfd0eUL,0x08bfbf6dUL,0x5581814cUL,0x24181814UL,0x79262635UL,0xb2c3c32fUL,0x86bebee1UL,0xc83535a2UL,0xc78888ccUL,0x652e2e39UL,0x6a939357UL,0x585555f2UL,0x61fcfc82UL,0xb37a7a47UL,0x27c8c8acUL,0x88babae7UL,0x4f32322bUL,0x42e6e695UL,0x3bc0c0a0UL,0xaa191998UL,0xf69e9ed1UL,0x22a3a37fUL,0xee444466UL,0xd654547eUL,0xdd3b3babUL,0x950b0b83UL,0xc98c8ccaUL,0xbcc7c729UL,0x056b6bd3UL,0x6c28283cUL,0x2ca7a779UL,0x81bcbce2UL,0x3116161dUL,0x37adad76UL,0x96dbdb3bUL,0x9e646456UL,0xa674744eUL,0x3614141eUL,0xe49292dbUL,0x120c0c0aUL,0xfc48486cUL,0x8fb8b8e4UL,0x789f9f5dUL,0x0fbdbd6eUL,0x694343efUL,0x35c4c4a6UL,0xda3939a8UL,0xc63131a4UL,0x8ad3d337UL,0x74f2f28bUL,0x83d5d532UL,0x4e8b8b43UL,0x856e6e59UL,0x18dadab7UL,0x8e01018cUL,0x1db1b164UL,0xf19c9cd2UL,0x724949e0UL,0x1fd8d8b4UL,0xb9acacfaUL,0xfaf3f307UL,0xa0cfcf25UL,0x20cacaafUL,0x7df4f48eUL,0x674747e9UL,0x38101018UL,0x0b6f6fd5UL,0x73f0f088UL,0xfb4a4a6fUL,0xca5c5c72UL,0x54383824UL,0x5f5757f1UL,0x217373c7UL,0x64979751UL,0xaecbcb23UL,0x25a1a17cUL,0x57e8e89cUL,0x5d3e3e21UL,0xea9696ddUL,0x1e6161dcUL,0x9c0d0d86UL,0x9b0f0f85UL,0x4be0e090UL,0xba7c7c42UL,0x267171c4UL,0x29ccccaaUL,0xe39090d8UL,0x09060605UL,0xf4f7f701UL,0x2a1c1c12UL,0x3cc2c2a3UL,0x8b6a6a5fUL,0xbeaeaef9UL,0x026969d0UL,0xbf171791UL,0x71999958UL,0x533a3a27UL,0xf72727b9UL,0x91d9d938UL,0xdeebeb13UL,0xe52b2bb3UL,0x77222233UL,0x04d2d2bbUL,0x39a9a970UL,0x87070789UL,0xc13333a7UL,0xec2d2db6UL,0x5a3c3c22UL,0xb8151592UL,0xa9c9c920UL,0x5c878749UL,0xb0aaaaffUL,0xd8505078UL,0x2ba5a57aUL,0x8903038fUL,0x4a5959f8UL,0x92090980UL,0x231a1a17UL,0x106565daUL,0x84d7d731UL,0xd58484c6UL,0x03d0d0b8UL,0xdc8282c3UL,0xe22929b0UL,0xc35a5a77UL,0x2d1e1e11UL,0x3d7b7bcbUL,0xb7a8a8fcUL,0x0c6d6dd6UL,0x622c2c3aUL,
0xc6c6a597UL,0xf8f884ebUL,0xeeee99c7UL,0xf6f68df7UL,0xffff0de5UL,0xd6d6bdb7UL,0xdedeb1a7UL,0x91915439UL,0x606050c0UL,0x02020304UL,0xcecea987UL,0x56567dacUL,0xe7e719d5UL,0xb5b56271UL,0x4d4de69aUL,0xecec9ac3UL,0x8f8f4505UL,0x1f1f9d3eUL,0x89894009UL,0xfafa87efUL,0xefef15c5UL,0xb2b2eb7fUL,0x8e8ec907UL,0xfbfb0bedUL,0x4141ec82UL,0xb3b3677dUL,0x5f5ffdbeUL,0x4545ea8aUL,0x2323bf46UL,0x5353f7a6UL,0xe4e496d3UL,0x9b9b5b2dUL,0x7575c2eaUL,0xe1e11cd9UL,0x3d3dae7aUL,0x4c4c6a98UL,0x6c6c5ad8UL,0x7e7e41fcUL,0xf5f502f1UL,0x83834f1dUL,0x68685cd0UL,0x5151f4a2UL,0xd1d134b9UL,0xf9f908e9UL,0xe2e293dfUL,0xabab734dUL,0x626253c4UL,0x2a2a3f54UL,0x08080c10UL,0x95955231UL,0x4646658cUL,0x9d9d5e21UL,0x30302860UL,0x3737a16eUL,0x0a0a0f14UL,0x2f2fb55eUL,0x0e0e091cUL,0x24243648UL,0x1b1b9b36UL,0xdfdf3da5UL,0xcdcd2681UL,0x4e4e699cUL,0x7f7fcdfeUL,0xeaea9fcfUL,0x12121b24UL,0x1d1d9e3aUL,0x585874b0UL,0x34342e68UL,0x36362d6cUL,0xdcdcb2a3UL,0xb4b4ee73UL,0x5b5bfbb6UL,0xa4a4f653UL,0x76764decUL,0xb7b76175UL,0x7d7dcefaUL,0x52527ba4UL,0xdddd3ea1UL,0x5e5e71bcUL,0x13139726UL,0xa6a6f557UL,0xb9b96869UL,0x00000000UL,0xc1c12c99UL,0x40406080UL,0xe3e31fddUL,0x7979c8f2UL,0xb6b6ed77UL,0xd4d4beb3UL,0x8d8d4601UL,0x6767d9ceUL,0x72724be4UL,0x9494de33UL,0x9898d42bUL,0xb0b0e87bUL,0x85854a11UL,0xbbbb6b6dUL,0xc5c52a91UL,0x4f4fe59eUL,0xeded16c1UL,0x8686c517UL,0x9a9ad72fUL,0x666655ccUL,0x11119422UL,0x8a8acf0fUL,0xe9e910c9UL,0x04040608UL,0xfefe81e7UL,0xa0a0f05bUL,0x787844f0UL,0x2525ba4aUL,0x4b4be396UL,0xa2a2f35fUL,0x5d5dfebaUL,0x8080c01bUL,0x05058a0aUL,0x3f3fad7eUL,0x2121bc42UL,0x707048e0UL,0xf1f104f9UL,0x6363dfc6UL,0x7777c1eeUL,0xafaf7545UL,0x42426384UL,0x20203040UL,0xe5e51ad1UL,0xfdfd0ee1UL,0xbfbf6d65UL,0x81814c19UL,0x18181430UL,0x2626354cUL,0xc3c32f9dUL,0xbebee167UL,0x3535a26aUL,0x8888cc0bUL,0x2e2e395cUL,0x9393573dUL,0x5555f2aaUL,0xfcfc82e3UL,0x7a7a47f4UL,0xc8c8ac8bUL,0xbabae76fUL,0x32322b64UL,0xe6e695d7UL,0xc0c0a09bUL,0x19199832UL,0x9e9ed127UL,0xa3a37f5dUL,0x44446688UL,0x54547ea8UL,0x3b3bab76UL,0x0b0b8316UL,0x8c8cca03UL,0xc7c72995UL,0x6b6bd3d6UL,0x28283c50UL,0xa7a77955UL,0xbcbce263UL,0x16161d2cUL,0xadad7641UL,0xdbdb3badUL,0x646456c8UL,0x74744ee8UL,0x14141e28UL,0x9292db3fUL,0x0c0c0a18UL,0x48486c90UL,0xb8b8e46bUL,0x9f9f5d25UL,0xbdbd6e61UL,0x4343ef86UL,0xc4c4a693UL,0x3939a872UL,0x3131a462UL,0xd3d337bdUL,0xf2f28bffUL,0xd5d532b1UL,0x8b8b430dUL,0x6e6e59dcUL,0xdadab7afUL,0x01018c02UL,0xb1b16479UL,0x9c9cd223UL,0x4949e092UL,0xd8d8b4abUL,0xacacfa43UL,0xf3f307fdUL,0xcfcf2585UL,0xcacaaf8fUL,0xf4f48ef3UL,0x4747e98eUL,0x10101820UL,0x6f6fd5deUL,0xf0f088fbUL,0x4a4a6f94UL,0x5c5c72b8UL,0x38382470UL,0x5757f1aeUL,0x7373c7e6UL,0x97975135UL,0xcbcb238dUL,0xa1a17c59UL,0xe8e89ccbUL,0x3e3e217cUL,0x9696dd37UL,0x6161dcc2UL,0x0d0d861aUL,0x0f0f851eUL,0xe0e090dbUL,0x7c7c42f8UL,0x7171c4e2UL,0xccccaa83UL,0x9090d83bUL,0x0606050cUL,0xf7f701f5UL,0x1c1c1238UL,0xc2c2a39fUL,0x6a6a5fd4UL,0xaeaef947UL,0x6969d0d2UL,0x1717912eUL,0x99995829UL,0x3a3a2774UL,0x2727b94eUL,0xd9d938a9UL,0xebeb13cdUL,0x2b2bb356UL,0x22223344UL,0xd2d2bbbfUL,0xa9a97049UL,0x0707890eUL,0x3333a766UL,0x2d2db65aUL,0x3c3c2278UL,0x1515922aUL,0xc9c92089UL,0x87874915UL,0xaaaaff4fUL,0x505078a0UL,0xa5a57a51UL,0x03038f06UL,0x5959f8b2UL,0x09098012UL,0x1a1a1734UL,0x6565dacaUL,0xd7d731b5UL,0x8484c613UL,0xd0d0b8bbUL,0x8282c31fUL,0x2929b052UL,0x5a5a77b4UL,0x1e1e113cUL,0x7b7bcbf6UL,0xa8a8fc4bUL,0x6d6dd6daUL,0x2c2c3a58UL,
0xc6a597f4UL,0xf884eb97UL,0xee99c7b0UL,0xf68df78cUL,0xff0de517UL,0xd6bdb7dcUL,0xdeb1a7c8UL,0x915439fcUL,0x6050c0f0UL,0x02030405UL,0xcea987e0UL,0x567dac87UL,0xe719d52bUL,0xb56271a6UL,0x4de69a31UL,0xec9ac3b5UL,0x8f4505cfUL,0x1f9d3ebcUL,0x894009c0UL,0xfa87ef92UL,0xef15c53fUL,0xb2eb7f26UL,0x8ec90740UL,0xfb0bed1dUL,0x41ec822fUL,0xb3677da9UL,0x5ffdbe1cUL,0x45ea8a25UL,0x23bf46daUL,0x53f7a602UL,0xe496d3a1UL,0x9b5b2dedUL,0x75c2ea5dUL,0xe11cd924UL,0x3dae7ae9UL,0x4c6a98beUL,0x6c5ad8eeUL,0x7e41fcc3UL,0xf502f106UL,0x834f1dd1UL,0x685cd0e4UL,0x51f4a207UL,0xd134b95cUL,0xf908e918UL,0xe293dfaeUL,0xab734d95UL,0x6253c4f5UL,0x2a3f5441UL,0x080c1014UL,0x955231f6UL,0x46658cafUL,0x9d5e21e2UL,0x30286078UL,0x37a16ef8UL,0x0a0f1411UL,0x2fb55ec4UL,0x0e091c1bUL,0x2436485aUL,0x1b9b36b6UL,0xdf3da547UL,0xcd26816aUL,0x4e699cbbUL,0x7fcdfe4cUL,0xea9fcfbaUL,0x121b242dUL,0x1d9e3ab9UL,0x5874b09cUL,0x342e6872UL,0x362d6c77UL,0xdcb2a3cdUL,0xb4ee7329UL,0x5bfbb616UL,0xa4f65301UL,0x764decd7UL,0xb76175a3UL,0x7dcefa49UL,0x527ba48dUL,0xdd3ea142UL,0x5e71bc93UL,0x139726a2UL,0xa6f55704UL,0xb96869b8UL,0x00000000UL,0xc12c9974UL,0x406080a0UL,0xe31fdd21UL,0x79c8f243UL,0xb6ed772cUL,0xd4beb3d9UL,0x8d4601caUL,0x67d9ce70UL,0x724be4ddUL,0x94de3379UL,0x98d42b67UL,0xb0e87b23UL,0x854a11deUL,0xbb6b6dbdUL,0xc52a917eUL,0x4fe59e34UL,0xed16c13aUL,0x86c51754UL,0x9ad72f62UL,0x6655ccffUL,0x119422a7UL,0x8acf0f4aUL,0xe910c930UL,0x0406080aUL,0xfe81e798UL,0xa0f05b0bUL,0x7844f0ccUL,0x25ba4ad5UL,0x4be3963eUL,0xa2f35f0eUL,0x5dfeba19UL,0x80c01b5bUL,0x058a0a85UL,0x3fad7eecUL,0x21bc42dfUL,0x7048e0d8UL,0xf104f90cUL,0x63dfc67aUL,0x77c1ee58UL,0xaf75459fUL,0x426384a5UL,0x20304050UL,0xe51ad12eUL,0xfd0ee112UL,0xbf6d65b7UL,0x814c19d4UL,0x1814303cUL,0x26354c5fUL,0xc32f9d71UL,0xbee16738UL,0x35a26afdUL,0x88cc0b4fUL,0x2e395c4bUL,0x93573df9UL,0x55f2aa0dUL,0xfc82e39dUL,0x7a47f4c9UL,0xc8ac8befUL,0xbae76f32UL,0x322b647dUL,0xe695d7a4UL,0xc0a09bfbUL,0x199832b3UL,0x9ed12768UL,0xa37f5d81UL,0x446688aaUL,0x547ea882UL,0x3bab76e6UL,0x0b83169eUL,0x8cca0345UL,0xc729957bUL,0x6bd3d66eUL,0x283c5044UL,0xa779558bUL,0xbce2633dUL,0x161d2c27UL,0xad76419aUL,0xdb3bad4dUL,0x6456c8faUL,0x744ee8d2UL,0x141e2822UL,0x92db3f76UL,0x0c0a181eUL,0x486c90b4UL,0xb8e46b37UL,0x9f5d25e7UL,0xbd6e61b2UL,0x43ef862aUL,0xc4a693f1UL,0x39a872e3UL,0x31a462f7UL,0xd337bd59UL,0xf28bff86UL,0xd532b156UL,0x8b430dc5UL,0x6e59dcebUL,0xdab7afc2UL,0x018c028fUL,0xb16479acUL,0x9cd2236dUL,0x49e0923bUL,0xd8b4abc7UL,0xacfa4315UL,0xf307fd09UL,0xcf25856fUL,0xcaaf8feaUL,0xf48ef389UL,0x47e98e20UL,0x10182028UL,0x6fd5de64UL,0xf088fb83UL,0x4a6f94b1UL,0x5c72b896UL,0x3824706cUL,0x57f1ae08UL,0x73c7e652UL,0x975135f3UL,0xcb238d65UL,0xa17c5984UL,0xe89ccbbfUL,0x3e217c63UL,0x96dd377cUL,0x61dcc27fUL,0x0d861a91UL,0x0f851e94UL,0xe090dbabUL,0x7c42f8c6UL,0x71c4e257UL,0xccaa83e5UL,0x90d83b73UL,0x06050c0fUL,0xf701f503UL,0x1c123836UL,0xc2a39ffeUL,0x6a5fd4e1UL,0xaef94710UL,0x69d0d26bUL,0x17912ea8UL,0x995829e8UL,0x3a277469UL,0x27b94ed0UL,0xd938a948UL,0xeb13cd35UL,0x2bb356ceUL,0x22334455UL,0xd2bbbfd6UL,0xa9704990UL,0x07890e80UL,0x33a766f2UL,0x2db65ac1UL,0x3c227866UL,0x15922aadUL,0xc9208960UL,0x874915dbUL,0xaaff4f1aUL,0x5078a088UL,0xa57a518eUL,0x038f068aUL,0x59f8b213UL,0x0980129bUL,0x1a173439UL,0x65daca75UL,0xd731b553UL,0x84c61351UL,0xd0b8bbd3UL,0x82c31f5eUL,0x29b052cbUL,0x5a77b499UL,0x1e113c33UL,0x7bcbf646UL,0xa8fc4b1fUL,0x6dd6da61UL,0x2c3a584eUL,
0xa597f4a5UL,0x84eb9784UL,0x99c7b099UL,0x8df78c8dUL,0x0de5170dUL,0xbdb7dcbdUL,0xb1a7c8b1UL,0x5439fc54UL,0x50c0f050UL,0x03040503UL,0xa987e0a9UL,0x7dac877dUL,0x19d52b19UL,0x6271a662UL,0xe69a31e6UL,0x9ac3b59aUL,0x4505cf45UL,0x9d3ebc9dUL,0x4009c040UL,0x87ef9287UL,0x15c53f15UL,0xeb7f26ebUL,0xc90740c9UL,0x0bed1d0bUL,0xec822fecUL,0x677da967UL,0xfdbe1cfdUL,0xea8a25eaUL,0xbf46dabfUL,0xf7a602f7UL,0x96d3a196UL,0x5b2ded5bUL,0xc2ea5dc2UL,0x1cd9241cUL,0xae7ae9aeUL,0x6a98be6aUL,0x5ad8ee5aUL,0x41fcc341UL,0x02f10602UL,0x4f1dd14fUL,0x5cd0e45cUL,0xf4a207f4UL,0x34b95c34UL,0x08e91808UL,0x93dfae93UL,0x734d9573UL,0x53c4f553UL,0x3f54413fUL,0x0c10140cUL,0x5231f652UL,0x658caf65UL,0x5e21e25eUL,0x28607828UL,0xa16ef8a1UL,0x0f14110fUL,0xb55ec4b5UL,0x091c1b09UL,0x36485a36UL,0x9b36b69bUL,0x3da5473dUL,0x26816a26UL,0x699cbb69UL,0xcdfe4ccdUL,0x9fcfba9fUL,0x1b242d1bUL,0x9e3ab99eUL,0x74b09c74UL,0x2e68722eUL,0x2d6c772dUL,0xb2a3cdb2UL,0xee7329eeUL,0xfbb616fbUL,0xf65301f6UL,0x4decd74dUL,0x6175a361UL,0xcefa49ceUL,0x7ba48d7bUL,0x3ea1423eUL,0x71bc9371UL,0x9726a297UL,0xf55704f5UL,0x6869b868UL,0x00000000UL,0x2c99742cUL,0x6080a060UL,0x1fdd211fUL,0xc8f243c8UL,0xed772cedUL,0xbeb3d9beUL,0x4601ca46UL,0xd9ce70d9UL,0x4be4dd4bUL,0xde3379deUL,0xd42b67d4UL,0xe87b23e8UL,0x4a11de4aUL,0x6b6dbd6bUL,0x2a917e2aUL,0xe59e34e5UL,0x16c13a16UL,0xc51754c5UL,0xd72f62d7UL,0x55ccff55UL,0x9422a794UL,0xcf0f4acfUL,0x10c93010UL,0x06080a06UL,0x81e79881UL,0xf05b0bf0UL,0x44f0cc44UL,0xba4ad5baUL,0xe3963ee3UL,0xf35f0ef3UL,0xfeba19feUL,0xc01b5bc0UL,0x8a0a858aUL,0xad7eecadUL,0xbc42dfbcUL,0x48e0d848UL,0x04f90c04UL,0xdfc67adfUL,0xc1ee58c1UL,0x75459f75UL,0x6384a563UL,0x30405030UL,0x1ad12e1aUL,0x0ee1120eUL,0x6d65b76dUL,0x4c19d44cUL,0x14303c14UL,0x354c5f35UL,0x2f9d712fUL,0xe16738e1UL,0xa26afda2UL,0xcc0b4fccUL,0x395c4b39UL,0x573df957UL,0xf2aa0df2UL,0x82e39d82UL,0x47f4c947UL,0xac8befacUL,0xe76f32e7UL,0x2b647d2bUL,0x95d7a495UL,0xa09bfba0UL,0x9832b398UL,0xd12768d1UL,0x7f5d817fUL,0x6688aa66UL,0x7ea8827eUL,0xab76e6abUL,0x83169e83UL,0xca0345caUL,0x29957b29UL,0xd3d66ed3UL,0x3c50443cUL,0x79558b79UL,0xe2633de2UL,0x1d2c271dUL,0x76419a76UL,0x3bad4d3bUL,0x56c8fa56UL,0x4ee8d24eUL,0x1e28221eUL,0xdb3f76dbUL,0x0a181e0aUL,0x6c90b46cUL,0xe46b37e4UL,0x5d25e75dUL,0x6e61b26eUL,0xef862aefUL,0xa693f1a6UL,0xa872e3a8UL,0xa462f7a4UL,0x37bd5937UL,0x8bff868bUL,0x32b15632UL,0x430dc543UL,0x59dceb59UL,0xb7afc2b7UL,0x8c028f8cUL,0x6479ac64UL,0xd2236dd2UL,0xe0923be0UL,0xb4abc7b4UL,0xfa4315faUL,0x07fd0907UL,0x25856f25UL,0xaf8feaafUL,0x8ef3898eUL,0xe98e20e9UL,0x18202818UL,0xd5de64d5UL,0x88fb8388UL,0x6f94b16fUL,0x72b89672UL,0x24706c24UL,0xf1ae08f1UL,0xc7e652c7UL,0x5135f351UL,0x238d6523UL,0x7c59847cUL,0x9ccbbf9cUL,0x217c6321UL,0xdd377cddUL,0xdcc27fdcUL,0x861a9186UL,0x851e9485UL,0x90dbab90UL,0x42f8c642UL,0xc4e257c4UL,0xaa83e5aaUL,0xd83b73d8UL,0x050c0f05UL,0x01f50301UL,0x12383612UL,0xa39ffea3UL,0x5fd4e15fUL,0xf94710f9UL,0xd0d26bd0UL,0x912ea891UL,0x5829e858UL,0x27746927UL,0xb94ed0b9UL,0x38a94838UL,0x13cd3513UL,0xb356ceb3UL,0x33445533UL,0xbbbfd6bbUL,0x70499070UL,0x890e8089UL,0xa766f2a7UL,0xb65ac1b6UL,0x22786622UL,0x922aad92UL,0x20896020UL,0x4915db49UL,0xff4f1affUL,0x78a08878UL,0x7a518e7aUL,0x8f068a8fUL,0xf8b213f8UL,0x80129b80UL,0x17343917UL,0xdaca75daUL,0x31b55331UL,0xc61351c6UL,0xb8bbd3b8UL,0xc31f5ec3UL,0xb052cbb0UL,0x77b49977UL,0x113c3311UL,0xcbf646cbUL,0xfc4b1ffcUL,0xd6da61d6UL,0x3a584e3aUL,
0x97f4a5f4UL,0xeb978497UL,0xc7b099b0UL,0xf78c8d8cUL,0xe5170d17UL,0xb7dcbddcUL,0xa7c8b1c8UL,0x39fc54fcUL,0xc0f050f0UL,0x04050305UL,0x87e0a9e0UL,0xac877d87UL,0xd52b192bUL,0x71a662a6UL,0x9a31e631UL,0xc3b59ab5UL,0x05cf45cfUL,0x3ebc9dbcUL,0x09c040c0UL,0xef928792UL,0xc53f153fUL,0x7f26eb26UL,0x0740c940UL,0xed1d0b1dUL,0x822fec2fUL,0x7da967a9UL,0xbe1cfd1cUL,0x8a25ea25UL,0x46dabfdaUL,0xa602f702UL,0xd3a196a1UL,0x2ded5bedUL,0xea5dc25dUL,0xd9241c24UL,0x7ae9aee9UL,0x98be6abeUL,0xd8ee5aeeUL,0xfcc341c3UL,0xf1060206UL,0x1dd14fd1UL,0xd0e45ce4UL,0xa207f407UL,0xb95c345cUL,0xe9180818UL,0xdfae93aeUL,0x4d957395UL,0xc4f553f5UL,0x54413f41UL,0x10140c14UL,0x31f652f6UL,0x8caf65afUL,0x21e25ee2UL,0x60782878UL,0x6ef8a1f8UL,0x14110f11UL,0x5ec4b5c4UL,0x1c1b091bUL,0x485a365aUL,0x36b69bb6UL,0xa5473d47UL,0x816a266aUL,0x9cbb69bbUL,0xfe4ccd4cUL,0xcfba9fbaUL,0x242d1b2dUL,0x3ab99eb9UL,0xb09c749cUL,0x68722e72UL,0x6c772d77UL,0xa3cdb2cdUL,0x7329ee29UL,0xb616fb16UL,0x5301f601UL,0xecd74dd7UL,0x75a361a3UL,0xfa49ce49UL,0xa48d7b8dUL,0xa1423e42UL,0xbc937193UL,0x26a297a2UL,0x5704f504UL,0x69b868b8UL,0x00000000UL,0x99742c74UL,0x80a060a0UL,0xdd211f21UL,0xf243c843UL,0x772ced2cUL,0xb3d9bed9UL,0x01ca46caUL,0xce70d970UL,0xe4dd4bddUL,0x3379de79UL,0x2b67d467UL,0x7b23e823UL,0x11de4adeUL,0x6dbd6bbdUL,0x917e2a7eUL,0x9e34e534UL,0xc13a163aUL,0x1754c554UL,0x2f62d762UL,0xccff55ffUL,0x22a794a7UL,0x0f4acf4aUL,0xc9301030UL,0x080a060aUL,0xe7988198UL,0x5b0bf00bUL,0xf0cc44ccUL,0x4ad5bad5UL,0x963ee33eUL,0x5f0ef30eUL,0xba19fe19UL,0x1b5bc05bUL,0x0a858a85UL,0x7eecadecUL,0x42dfbcdfUL,0xe0d848d8UL,0xf90c040cUL,0xc67adf7aUL,0xee58c158UL,0x459f759fUL,0x84a563a5UL,0x40503050UL,0xd12e1a2eUL,0xe1120e12UL,0x65b76db7UL,0x19d44cd4UL,0x303c143cUL,0x4c5f355fUL,0x9d712f71UL,0x6738e138UL,0x6afda2fdUL,0x0b4fcc4fUL,0x5c4b394bUL,0x3df957f9UL,0xaa0df20dUL,0xe39d829dUL,0xf4c947c9UL,0x8befacefUL,0x6f32e732UL,0x647d2b7dUL,0xd7a495a4UL,0x9bfba0fbUL,0x32b398b3UL,0x2768d168UL,0x5d817f81UL,0x88aa66aaUL,0xa8827e82UL,0x76e6abe6UL,0x169e839eUL,0x0345ca45UL,0x957b297bUL,0xd66ed36eUL,0x50443c44UL,0x558b798bUL,0x633de23dUL,0x2c271d27UL,0x419a769aUL,0xad4d3b4dUL,0xc8fa56faUL,0xe8d24ed2UL,0x28221e22UL,0x3f76db76UL,0x181e0a1eUL,0x90b46cb4UL,0x6b37e437UL,0x25e75de7UL,0x61b26eb2UL,0x862aef2aUL,0x93f1a6f1UL,0x72e3a8e3UL,0x62f7a4f7UL,0xbd593759UL,0xff868b86UL,0xb1563256UL,0x0dc543c5UL,0xdceb59ebUL,0xafc2b7c2UL,0x028f8c8fUL,0x79ac64acUL,0x236dd26dUL,0x923be03bUL,0xabc7b4c7UL,0x4315fa15UL,0xfd090709UL,0x856f256fUL,0x8feaafeaUL,0xf3898e89UL,0x8e20e920UL,0x20281828UL,0xde64d564UL,0xfb838883UL,0x94b16fb1UL,0xb8967296UL,0x706c246cUL,0xae08f108UL,0xe652c752UL,0x35f351f3UL,0x8d652365UL,0x59847c84UL,0xcbbf9cbfUL,0x7c632163UL,0x377cdd7cUL,0xc27fdc7fUL,0x1a918691UL,0x1e948594UL,0xdbab90abUL,0xf8c642c6UL,0xe257c457UL,0x83e5aae5UL,0x3b73d873UL,0x0c0f050fUL,0xf5030103UL,0x38361236UL,0x9ffea3feUL,0xd4e15fe1UL,0x4710f910UL,0xd26bd06bUL,0x2ea891a8UL,0x29e858e8UL,0x74692769UL,0x4ed0b9d0UL,0xa9483848UL,0xcd351335UL,0x56ceb3ceUL,0x44553355UL,0xbfd6bbd6UL,0x49907090UL,0x0e808980UL,0x66f2a7f2UL,0x5ac1b6c1UL,0x78662266UL,0x2aad92adUL,0x89602060UL,0x15db49dbUL,0x4f1aff1aUL,0xa0887888UL,0x518e7a8eUL,0x068a8f8aUL,0xb213f813UL,0x129b809bUL,0x34391739UL,0xca75da75UL,0xb5533153UL,0x1351c651UL,0xbbd3b8d3UL,0x1f5ec35eUL,0x52cbb0cbUL,0xb4997799UL,0x3c331133UL,0xf646cb46UL,0x4b1ffc1fUL,0xda61d661UL,0x584e3a4eUL,
0xf4a5f432UL,0x9784976fUL,0xb099b05eUL,0x8c8d8c7aUL,0x170d17e8UL,0xdcbddc0aUL,0xc8b1c816UL,0xfc54fc6dUL,0xf050f090UL,0x05030507UL,0xe0a9e02eUL,0x877d87d1UL,0x2b192bccUL,0xa662a613UL,0x31e6317cUL,0xb59ab559UL,0xcf45cf40UL,0xbc9dbca3UL,0xc040c049UL,0x92879268UL,0x3f153fd0UL,0x26eb2694UL,0x40c940ceUL,0x1d0b1de6UL,0x2fec2f6eUL,0xa967a91aUL,0x1cfd1c43UL,0x25ea2560UL,0xdabfdaf9UL,0x02f70251UL,0xa196a145UL,0xed5bed76UL,0x5dc25d28UL,0x241c24c5UL,0xe9aee9d4UL,0xbe6abef2UL,0xee5aee82UL,0xc341c3bdUL,0x060206f3UL,0xd14fd152UL,0xe45ce48cUL,0x07f40756UL,0x5c345c8dUL,0x180818e1UL,0xae93ae4cUL,0x9573953eUL,0xf553f597UL,0x413f416bUL,0x140c141cUL,0xf652f663UL,0xaf65afe9UL,0xe25ee27fUL,0x78287848UL,0xf8a1f8cfUL,0x110f111bUL,0xc4b5c4ebUL,0x1b091b15UL,0x5a365a7eUL,0xb69bb6adUL,0x473d4798UL,0x6a266aa7UL,0xbb69bbf5UL,0x4ccd4c33UL,0xba9fba50UL,0x2d1b2d3fUL,0xb99eb9a4UL,0x9c749cc4UL,0x722e7246UL,0x772d7741UL,0xcdb2cd11UL,0x29ee299dUL,0x16fb164dUL,0x01f601a5UL,0xd74dd7a1UL,0xa361a314UL,0x49ce4934UL,0x8d7b8ddfUL,0x423e429fUL,0x937193cdUL,0xa297a2b1UL,0x04f504a2UL,0xb868b801UL,0x00000000UL,0x742c74b5UL,0xa060a0e0UL,0x211f21c2UL,0x43c8433aUL,0x2ced2c9aUL,0xd9bed90dUL,0xca46ca47UL,0x70d97017UL,0xdd4bddafUL,0x79de79edUL,0x67d467ffUL,0x23e82393UL,0xde4ade5bUL,0xbd6bbd06UL,0x7e2a7ebbUL,0x34e5347bUL,0x3a163ad7UL,0x54c554d2UL,0x62d762f8UL,0xff55ff99UL,0xa794a7b6UL,0x4acf4ac0UL,0x301030d9UL,0x0a060a0eUL,0x98819866UL,0x0bf00babUL,0xcc44ccb4UL,0xd5bad5f0UL,0x3ee33e75UL,0x0ef30eacUL,0x19fe1944UL,0x5bc05bdbUL,0x858a8580UL,0xecadecd3UL,0xdfbcdffeUL,0xd848d8a8UL,0x0c040cfdUL,0x7adf7a19UL,0x58c1582fUL,0x9f759f30UL,0xa563a5e7UL,0x50305070UL,0x2e1a2ecbUL,0x120e12efUL,0xb76db708UL,0xd44cd455UL,0x3c143c24UL,0x5f355f79UL,0x712f71b2UL,0x38e13886UL,0xfda2fdc8UL,0x4fcc4fc7UL,0x4b394b65UL,0xf957f96aUL,0x0df20d58UL,0x9d829d61UL,0xc947c9b3UL,0xefacef27UL,0x32e73288UL,0x7d2b7d4fUL,0xa495a442UL,0xfba0fb3bUL,0xb398b3aaUL,0x68d168f6UL,0x817f8122UL,0xaa66aaeeUL,0x827e82d6UL,0xe6abe6ddUL,0x9e839e95UL,0x45ca45c9UL,0x7b297bbcUL,0x6ed36e05UL,0x443c446cUL,0x8b798b2cUL,0x3de23d81UL,0x271d2731UL,0x9a769a37UL,0x4d3b4d96UL,0xfa56fa9eUL,0xd24ed2a6UL,0x221e2236UL,0x76db76e4UL,0x1e0a1e12UL,0xb46cb4fcUL,0x37e4378fUL,0xe75de778UL,0xb26eb20fUL,0x2aef2a69UL,0xf1a6f135UL,0xe3a8e3daUL,0xf7a4f7c6UL,0x5937598aUL,0x868b8674UL,0x56325683UL,0xc543c54eUL,0xeb59eb85UL,0xc2b7c218UL,0x8f8c8f8eUL,0xac64ac1dUL,0x6dd26df1UL,0x3be03b72UL,0xc7b4c71fUL,0x15fa15b9UL,0x090709faUL,0x6f256fa0UL,0xeaafea20UL,0x898e897dUL,0x20e92067UL,0x28182838UL,0x64d5640bUL,0x83888373UL,0xb16fb1fbUL,0x967296caUL,0x6c246c54UL,0x08f1085fUL,0x52c75221UL,0xf351f364UL,0x652365aeUL,0x847c8425UL,0xbf9cbf57UL,0x6321635dUL,0x7cdd7ceaUL,0x7fdc7f1eUL,0x9186919cUL,0x9485949bUL,0xab90ab4bUL,0xc642c6baUL,0x57c45726UL,0xe5aae529UL,0x73d873e3UL,0x0f050f09UL,0x030103f4UL,0x3612362aUL,0xfea3fe3cUL,0xe15fe18bUL,0x10f910beUL,0x6bd06b02UL,0xa891a8bfUL,0xe858e871UL,0x69276953UL,0xd0b9d0f7UL,0x48384891UL,0x351335deUL,0xceb3cee5UL,0x55335577UL,0xd6bbd604UL,0x90709039UL,0x80898087UL,0xf2a7f2c1UL,0xc1b6c1ecUL,0x6622665aUL,0xad92adb8UL,0x602060a9UL,0xdb49db5cUL,0x1aff1ab0UL,0x887888d8UL,0x8e7a8e2bUL,0x8a8f8a89UL,0x13f8134aUL,0x9b809b92UL,0x39173923UL,0x75da7510UL,0x53315384UL,0x51c651d5UL,0xd3b8d303UL,0x5ec35edcUL,0xcbb0cbe2UL,0x997799c3UL,0x3311332dUL,0x46cb463dUL,0x1ffc1fb7UL,0x61d6610cUL,0x4e3a4e62UL
};

LOCAL UINT32 groestl_T_local[256*8];
const UINT32 LOCAL *groestl_T0 = &groestl_T_local[0 * 256];
const UINT32 LOCAL *groestl_T1 = &groestl_T_local[1 * 256];
const UINT32 LOCAL *groestl_T2 = &groestl_T_local[2 * 256];
const UINT32 LOCAL *groestl_T3 = &groestl_T_local[3 * 256];
const UINT32 LOCAL *groestl_T4 = &groestl_T_local[4 * 256];
const UINT32 LOCAL *groestl_T5 = &groestl_T_local[5 * 256];
const UINT32 LOCAL *groestl_T6 = &groestl_T_local[6 * 256];
const UINT32 LOCAL *groestl_T7 = &groestl_T_local[7 * 256];

UINT32 nLocalId = LOCALID;
{
for(i = 0; i < 256 * 8; i += WORKSIZE)
groestl_T_local[i + nLocalId ] = groestl_T_init[i + nLocalId];
}

// body
groestl_BuffC[16] = hash[16] = 0x80;
groestl_BuffC[17] = hash[17] = 0;
groestl_BuffC[18] = hash[18] = 0;
groestl_BuffC[19] = hash[19] = 0;
groestl_BuffC[20] = hash[20] = 0;
groestl_BuffC[21] = hash[21] = 0;
groestl_BuffC[22] = hash[22] = 0;
groestl_BuffC[23] = hash[23] = 0;
groestl_BuffC[24] = hash[24] = 0;
groestl_BuffC[25] = hash[25] = 0;
groestl_BuffC[26] = hash[26] = 0;
groestl_BuffC[27] = hash[27] = 0;
groestl_BuffC[28] = hash[28] = 0;
groestl_BuffC[29] = hash[29] = 0;
groestl_BuffC[30] = hash[30] = 0;
hash[31] = 0x01000000;
groestl_BuffC[31] = 0x01020000L;

#pragma unroll 16
for (groestl_i = 0; groestl_i < 16; groestl_i++)
{
groestl_BuffC[groestl_i] = hash[groestl_i];
}

for(groestl_i=0; groestl_i < 0x0d000000u; groestl_i+=0x01000000u)
{
groestl_QMIX(hash, groestl_BuffB, groestl_i)
groestl_i+=0x01000000u;
groestl_QMIX(groestl_BuffB, hash, groestl_i)
}

for(groestl_i=0; groestl_i<13; ++groestl_i)
{
groestl_PMIX(groestl_BuffC, groestl_BuffB, groestl_i)
++groestl_i;
groestl_PMIX(groestl_BuffB, groestl_BuffC, groestl_i)
}

#pragma unroll 32
for(groestl_i = 0; groestl_i < 32-1; groestl_i++)
{
hash[groestl_i] ^= groestl_BuffC[groestl_i];
groestl_BuffB[groestl_i] = hash[groestl_i];
}
hash[31] ^= 0x00020000UL ^ groestl_BuffC[31];
groestl_BuffB[31] = hash[31];

for(groestl_i = 0; groestl_i < 14;)
{
groestl_PMIX(groestl_BuffB, groestl_BuffC, groestl_i)
++groestl_i;
groestl_PMIX(groestl_BuffC, groestl_BuffB, groestl_i)
++groestl_i;
}

#pragma unroll 16
for(groestl_i = 0; groestl_i < 16; ++groestl_i)
{
hash[groestl_i] = groestl_BuffB[16+groestl_i] ^ hash[16+groestl_i];
}



Of course I gave you bad advice. Good one is way out of your price range.
smolen
Hero Member
*****
Offline Offline

Activity: 525


View Profile
October 22, 2014, 01:42:53 AM
 #306

skein
Code:
skein_p[0] = hash64[0];
skein_p[1] = hash64[1];
skein_p[2] = hash64[2];
skein_p[3] = hash64[3];
skein_p[4] = hash64[4];
skein_p[5] = hash64[5];
skein_p[6] = hash64[6];
skein_p[7] = hash64[7];

skein_p[0] += 0x4903ADFF749C51CEULL;
skein_p[1] += 0x0D95DE399746DF03ULL;
skein_p[2] += 0x8FD1934127C79BCEULL;
skein_p[3] += 0x9A255629FF352CB1ULL;
skein_p[4] += 0x5DB62599DF6CA7B0ULL;
skein_p[5] += 0xEABE394CA9D5C434ULL;
skein_p[6] += 0x891112C71A75B523ULL;
skein_p[7] += 0xAE18A40B660FCC33ULL;
skein_p[0] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1], 46) ^ skein_p[0];
skein_p[2] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 36) ^ skein_p[2];
skein_p[4] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 19) ^ skein_p[4];
skein_p[6] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7], 37) ^ skein_p[6];
skein_p[2] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1], 33) ^ skein_p[2];
skein_p[4] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7], 27) ^ skein_p[4];
skein_p[6] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 14) ^ skein_p[6];
skein_p[0] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 42) ^ skein_p[0];
skein_p[4] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1], 17) ^ skein_p[4];
skein_p[6] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 49) ^ skein_p[6];
skein_p[0] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 36) ^ skein_p[0];
skein_p[2] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7], 39) ^ skein_p[2];
skein_p[6] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1], 44) ^ skein_p[6];
skein_p[0] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7],  9) ^ skein_p[0];
skein_p[2] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 54) ^ skein_p[2];
skein_p[4] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 56) ^ skein_p[4];
skein_p[0] += 0x0D95DE399746DF03ULL;
skein_p[1] += 0x8FD1934127C79BCEULL;
skein_p[2] += 0x9A255629FF352CB1ULL;
skein_p[3] += 0x5DB62599DF6CA7B0ULL;
skein_p[4] += 0xEABE394CA9D5C3F4ULL;
skein_p[5] += 0x891112C71A75B523ULL;
skein_p[6] += 0x9E18A40B660FCC73ULL;
skein_p[7] += 0xcab2076d98173ec4ULL + (UINT64) 1;
skein_p[0] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1], 39) ^ skein_p[0];
skein_p[2] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 30) ^ skein_p[2];
skein_p[4] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 34) ^ skein_p[4];
skein_p[6] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7], 24) ^ skein_p[6];
skein_p[2] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1], 13) ^ skein_p[2];
skein_p[4] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7], 50) ^ skein_p[4];
skein_p[6] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 10) ^ skein_p[6];
skein_p[0] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 17) ^ skein_p[0];
skein_p[4] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1], 25) ^ skein_p[4];
skein_p[6] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 29) ^ skein_p[6];
skein_p[0] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 39) ^ skein_p[0];
skein_p[2] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7], 43) ^ skein_p[2];
skein_p[6] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1],  8) ^ skein_p[6];
skein_p[0] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7], 35) ^ skein_p[0];
skein_p[2] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 56) ^ skein_p[2];
skein_p[4] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 22) ^ skein_p[4];
skein_p[0] += 0x8FD1934127C79BCEULL;
skein_p[1] += 0x9A255629FF352CB1ULL;
skein_p[2] += 0x5DB62599DF6CA7B0ULL;
skein_p[3] += 0xEABE394CA9D5C3F4ULL;
skein_p[4] += 0x991112C71A75B523ULL;
skein_p[5] += 0x9E18A40B660FCC73ULL;
skein_p[6] += 0xCAB2076D98173F04ULL;
skein_p[7] += 0x4903ADFF749C51D0ULL;
skein_p[0] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1], 46) ^ skein_p[0];
skein_p[2] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 36) ^ skein_p[2];
skein_p[4] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 19) ^ skein_p[4];
skein_p[6] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7], 37) ^ skein_p[6];
skein_p[2] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1], 33) ^ skein_p[2];
skein_p[4] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7], 27) ^ skein_p[4];
skein_p[6] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 14) ^ skein_p[6];
skein_p[0] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 42) ^ skein_p[0];
skein_p[4] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1], 17) ^ skein_p[4];
skein_p[6] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 49) ^ skein_p[6];
skein_p[0] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 36) ^ skein_p[0];
skein_p[2] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7], 39) ^ skein_p[2];
skein_p[6] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1], 44) ^ skein_p[6];
skein_p[0] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7],  9) ^ skein_p[0];
skein_p[2] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 54) ^ skein_p[2];
skein_p[4] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 56) ^ skein_p[4];
skein_p[0] += 0x9A255629FF352CB1ULL;
skein_p[1] += 0x5DB62599DF6CA7B0ULL;
skein_p[2] += 0xEABE394CA9D5C3F4ULL;
skein_p[3] += 0x991112C71A75B523ULL;
skein_p[4] += 0xAE18A40B660FCC33ULL;
skein_p[5] += 0xcab2076d98173f04ULL;
skein_p[6] += 0x3903ADFF749C51CEULL;
skein_p[7] += 0x0D95DE399746DF03ULL + (UINT64) 3;
skein_p[0] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1], 39) ^ skein_p[0];
skein_p[2] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 30) ^ skein_p[2];
skein_p[4] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 34) ^ skein_p[4];
skein_p[6] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7], 24) ^ skein_p[6];
skein_p[2] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1], 13) ^ skein_p[2];
skein_p[4] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7], 50) ^ skein_p[4];
skein_p[6] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 10) ^ skein_p[6];
skein_p[0] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 17) ^ skein_p[0];
skein_p[4] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1], 25) ^ skein_p[4];
skein_p[6] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 29) ^ skein_p[6];
skein_p[0] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 39) ^ skein_p[0];
skein_p[2] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7], 43) ^ skein_p[2];
skein_p[6] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1],  8) ^ skein_p[6];
skein_p[0] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7], 35) ^ skein_p[0];
skein_p[2] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 56) ^ skein_p[2];
skein_p[4] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 22) ^ skein_p[4];
skein_p[0] += 0x5DB62599DF6CA7B0ULL;
skein_p[1] += 0xEABE394CA9D5C3F4ULL;
skein_p[2] += 0x991112C71A75B523ULL;
skein_p[3] += 0xAE18A40B660FCC33ULL;
skein_p[4] += 0xcab2076d98173ec4ULL;
skein_p[5] += 0x3903ADFF749C51CEULL;
skein_p[6] += 0xFD95DE399746DF43ULL;
skein_p[7] += 0x8FD1934127C79BD2ULL;
skein_p[0] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1], 46) ^ skein_p[0];
skein_p[2] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 36) ^ skein_p[2];
skein_p[4] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 19) ^ skein_p[4];
skein_p[6] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7], 37) ^ skein_p[6];
skein_p[2] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1], 33) ^ skein_p[2];
skein_p[4] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7], 27) ^ skein_p[4];
skein_p[6] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 14) ^ skein_p[6];
skein_p[0] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 42) ^ skein_p[0];
skein_p[4] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1], 17) ^ skein_p[4];
skein_p[6] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 49) ^ skein_p[6];
skein_p[0] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 36) ^ skein_p[0];
skein_p[2] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7], 39) ^ skein_p[2];
skein_p[6] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1], 44) ^ skein_p[6];
skein_p[0] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7],  9) ^ skein_p[0];
skein_p[2] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 54) ^ skein_p[2];
skein_p[4] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 56) ^ skein_p[4];
skein_p[0] += 0xEABE394CA9D5C3F4ULL;
skein_p[1] += 0x991112C71A75B523ULL;
skein_p[2] += 0xAE18A40B660FCC33ULL;
skein_p[3] += 0xcab2076d98173ec4ULL;
skein_p[4] += 0x4903ADFF749C51CEULL;
skein_p[5] += 0x0D95DE399746DF03ULL + 0xf000000000000040ULL;
skein_p[6] += 0x8FD1934127C79BCEULL + 0x0000000000000040ULL;
skein_p[7] += 0x9A255629FF352CB1ULL + (UINT64) 5;
skein_p[0] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1], 39) ^ skein_p[0];
skein_p[2] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 30) ^ skein_p[2];
skein_p[4] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 34) ^ skein_p[4];
skein_p[6] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7], 24) ^ skein_p[6];
skein_p[2] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1], 13) ^ skein_p[2];
skein_p[4] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7], 50) ^ skein_p[4];
skein_p[6] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 10) ^ skein_p[6];
skein_p[0] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 17) ^ skein_p[0];
skein_p[4] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1], 25) ^ skein_p[4];
skein_p[6] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 29) ^ skein_p[6];
skein_p[0] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 39) ^ skein_p[0];
skein_p[2] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7], 43) ^ skein_p[2];
skein_p[6] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1],  8) ^ skein_p[6];
skein_p[0] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7], 35) ^ skein_p[0];
skein_p[2] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 56) ^ skein_p[2];
skein_p[4] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 22) ^ skein_p[4];
skein_p[0] += 0x991112C71A75B523ULL;
skein_p[1] += 0xAE18A40B660FCC33ULL;
skein_p[2] += 0xcab2076d98173ec4ULL;
skein_p[3] += 0x4903ADFF749C51CEULL;
skein_p[4] += 0x0D95DE399746DF03ULL;
skein_p[5] += 0x8FD1934127C79BCEULL + 0x0000000000000040ULL;
skein_p[6] += 0x8A255629FF352CB1ULL;
skein_p[7] += 0x5DB62599DF6CA7B0ULL + (UINT64) 6;
skein_p[0] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1], 46) ^ skein_p[0];
skein_p[2] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 36) ^ skein_p[2];
skein_p[4] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 19) ^ skein_p[4];
skein_p[6] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7], 37) ^ skein_p[6];
skein_p[2] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1], 33) ^ skein_p[2];
skein_p[4] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7], 27) ^ skein_p[4];
skein_p[6] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 14) ^ skein_p[6];
skein_p[0] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 42) ^ skein_p[0];
skein_p[4] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1], 17) ^ skein_p[4];
skein_p[6] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 49) ^ skein_p[6];
skein_p[0] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 36) ^ skein_p[0];
skein_p[2] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7], 39) ^ skein_p[2];
skein_p[6] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1], 44) ^ skein_p[6];
skein_p[0] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7],  9) ^ skein_p[0];
skein_p[2] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 54) ^ skein_p[2];
skein_p[4] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 56) ^ skein_p[4];
skein_p[0] += 0xAE18A40B660FCC33ULL;
skein_p[1] += 0xcab2076d98173ec4ULL;
skein_p[2] += 0x4903ADFF749C51CEULL;
skein_p[3] += 0x0D95DE399746DF03ULL;
skein_p[4] += 0x8FD1934127C79BCEULL;
skein_p[5] += 0x8A255629FF352CB1ULL;
skein_p[6] += 0x4DB62599DF6CA7F0ULL;
skein_p[7] += 0xEABE394CA9D5C3F4ULL + (UINT64) 7;
skein_p[0] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1], 39) ^ skein_p[0];
skein_p[2] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 30) ^ skein_p[2];
skein_p[4] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 34) ^ skein_p[4];
skein_p[6] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7], 24) ^ skein_p[6];
skein_p[2] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1], 13) ^ skein_p[2];
skein_p[4] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7], 50) ^ skein_p[4];
skein_p[6] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 10) ^ skein_p[6];
skein_p[0] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 17) ^ skein_p[0];
skein_p[4] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1], 25) ^ skein_p[4];
skein_p[6] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 29) ^ skein_p[6];
skein_p[0] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 39) ^ skein_p[0];
skein_p[2] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7], 43) ^ skein_p[2];
skein_p[6] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1],  8) ^ skein_p[6];
skein_p[0] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7], 35) ^ skein_p[0];
skein_p[2] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 56) ^ skein_p[2];
skein_p[4] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 22) ^ skein_p[4];
skein_p[0] += 0xcab2076d98173ec4ULL;
skein_p[1] += 0x4903ADFF749C51CEULL;
skein_p[2] += 0x0D95DE399746DF03ULL;
skein_p[3] += 0x8FD1934127C79BCEULL;
skein_p[4] += 0x9A255629FF352CB1ULL;
skein_p[5] += 0x4DB62599DF6CA7F0ULL;
skein_p[6] += 0xEABE394CA9D5C434ULL;
skein_p[7] += 0x991112C71A75B52BULL;
skein_p[0] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1], 46) ^ skein_p[0];
skein_p[2] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 36) ^ skein_p[2];
skein_p[4] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 19) ^ skein_p[4];
skein_p[6] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7], 37) ^ skein_p[6];
skein_p[2] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1], 33) ^ skein_p[2];
skein_p[4] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7], 27) ^ skein_p[4];
skein_p[6] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 14) ^ skein_p[6];
skein_p[0] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 42) ^ skein_p[0];
skein_p[4] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1], 17) ^ skein_p[4];
skein_p[6] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 49) ^ skein_p[6];
skein_p[0] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 36) ^ skein_p[0];
skein_p[2] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7], 39) ^ skein_p[2];
skein_p[6] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1], 44) ^ skein_p[6];
skein_p[0] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7],  9) ^ skein_p[0];
skein_p[2] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 54) ^ skein_p[2];
skein_p[4] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 56) ^ skein_p[4];
skein_p[0] += 0x4903ADFF749C51CEULL;
skein_p[1] += 0x0D95DE399746DF03ULL;
skein_p[2] += 0x8FD1934127C79BCEULL;
skein_p[3] += 0x9A255629FF352CB1ULL;
skein_p[4] += 0x5DB62599DF6CA7B0ULL;
skein_p[5] += 0xEABE394CA9D5C434ULL;
skein_p[6] += 0x891112C71A75B523ULL;
skein_p[7] += 0xAE18A40B660FCC33ULL + (UINT64) 9;
skein_p[0] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1], 39) ^ skein_p[0];
skein_p[2] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 30) ^ skein_p[2];
skein_p[4] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 34) ^ skein_p[4];
skein_p[6] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7], 24) ^ skein_p[6];
skein_p[2] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1], 13) ^ skein_p[2];
skein_p[4] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7], 50) ^ skein_p[4];
skein_p[6] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 10) ^ skein_p[6];
skein_p[0] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 17) ^ skein_p[0];
skein_p[4] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1], 25) ^ skein_p[4];
skein_p[6] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 29) ^ skein_p[6];
skein_p[0] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 39) ^ skein_p[0];
skein_p[2] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7], 43) ^ skein_p[2];
skein_p[6] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1],  8) ^ skein_p[6];
skein_p[0] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7], 35) ^ skein_p[0];
skein_p[2] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 56) ^ skein_p[2];
skein_p[4] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 22) ^ skein_p[4];
skein_p[0] += 0x0D95DE399746DF03ULL;
skein_p[1] += 0x8FD1934127C79BCEULL;
skein_p[2] += 0x9A255629FF352CB1ULL;
skein_p[3] += 0x5DB62599DF6CA7B0ULL;
skein_p[4] += 0xEABE394CA9D5C3F4ULL;
skein_p[5] += 0x891112C71A75B523ULL;
skein_p[6] += 0x9E18A40B660FCC73ULL;
skein_p[7] += 0xcab2076d98173eceULL;
skein_p[0] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1], 46) ^ skein_p[0];
skein_p[2] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 36) ^ skein_p[2];
skein_p[4] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 19) ^ skein_p[4];
skein_p[6] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7], 37) ^ skein_p[6];
skein_p[2] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1], 33) ^ skein_p[2];
skein_p[4] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7], 27) ^ skein_p[4];
skein_p[6] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 14) ^ skein_p[6];
skein_p[0] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 42) ^ skein_p[0];
skein_p[4] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1], 17) ^ skein_p[4];
skein_p[6] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 49) ^ skein_p[6];
skein_p[0] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 36) ^ skein_p[0];
skein_p[2] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7], 39) ^ skein_p[2];
skein_p[6] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1], 44) ^ skein_p[6];
skein_p[0] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7],  9) ^ skein_p[0];
skein_p[2] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 54) ^ skein_p[2];
skein_p[4] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 56) ^ skein_p[4];
skein_p[0] += 0x8FD1934127C79BCEULL;
skein_p[1] += 0x9A255629FF352CB1ULL;
skein_p[2] += 0x5DB62599DF6CA7B0ULL;
skein_p[3] += 0xEABE394CA9D5C3F4ULL;
skein_p[4] += 0x991112C71A75B523ULL;
skein_p[5] += 0x9E18A40B660FCC73ULL;
skein_p[6] += 0xcab2076d98173ec4ULL + 0x0000000000000040ULL;
skein_p[7] += 0x4903ADFF749C51CEULL + (UINT64)11;
skein_p[0] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1], 39) ^ skein_p[0];
skein_p[2] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 30) ^ skein_p[2];
skein_p[4] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 34) ^ skein_p[4];
skein_p[6] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7], 24) ^ skein_p[6];
skein_p[2] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1], 13) ^ skein_p[2];
skein_p[4] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7], 50) ^ skein_p[4];
skein_p[6] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 10) ^ skein_p[6];
skein_p[0] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 17) ^ skein_p[0];
skein_p[4] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1], 25) ^ skein_p[4];
skein_p[6] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 29) ^ skein_p[6];
skein_p[0] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 39) ^ skein_p[0];
skein_p[2] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7], 43) ^ skein_p[2];
skein_p[6] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1],  8) ^ skein_p[6];
skein_p[0] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7], 35) ^ skein_p[0];
skein_p[2] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 56) ^ skein_p[2];
skein_p[4] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 22) ^ skein_p[4];
skein_p[0] += 0x9A255629FF352CB1ULL;
skein_p[1] += 0x5DB62599DF6CA7B0ULL;
skein_p[2] += 0xEABE394CA9D5C3F4ULL;
skein_p[3] += 0x991112C71A75B523ULL;
skein_p[4] += 0xAE18A40B660FCC33ULL;
skein_p[5] += 0xcab2076d98173ec4ULL + 0x0000000000000040ULL;
skein_p[6] += 0x3903ADFF749C51CEULL;
skein_p[7] += 0x0D95DE399746DF03ULL + (UINT64)12;
skein_p[0] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1], 46) ^ skein_p[0];
skein_p[2] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 36) ^ skein_p[2];
skein_p[4] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 19) ^ skein_p[4];
skein_p[6] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7], 37) ^ skein_p[6];
skein_p[2] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1], 33) ^ skein_p[2];
skein_p[4] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7], 27) ^ skein_p[4];
skein_p[6] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 14) ^ skein_p[6];
skein_p[0] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 42) ^ skein_p[0];
skein_p[4] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1], 17) ^ skein_p[4];
skein_p[6] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 49) ^ skein_p[6];
skein_p[0] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 36) ^ skein_p[0];
skein_p[2] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7], 39) ^ skein_p[2];
skein_p[6] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1], 44) ^ skein_p[6];
skein_p[0] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7],  9) ^ skein_p[0];
skein_p[2] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 54) ^ skein_p[2];
skein_p[4] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 56) ^ skein_p[4];
skein_p[0] += 0x5DB62599DF6CA7B0ULL;
skein_p[1] += 0xEABE394CA9D5C3F4ULL;
skein_p[2] += 0x991112C71A75B523ULL;
skein_p[3] += 0xAE18A40B660FCC33ULL;
skein_p[4] += 0xcab2076d98173ec4ULL;
skein_p[5] += 0x3903ADFF749C51CEULL;
skein_p[6] += 0x0D95DE399746DF03ULL + 0xf000000000000040ULL;
skein_p[7] += 0x8FD1934127C79BCEULL + (UINT64)13;
skein_p[0] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1], 39) ^ skein_p[0];
skein_p[2] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 30) ^ skein_p[2];
skein_p[4] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 34) ^ skein_p[4];
skein_p[6] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7], 24) ^ skein_p[6];
skein_p[2] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1], 13) ^ skein_p[2];
skein_p[4] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7], 50) ^ skein_p[4];
skein_p[6] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 10) ^ skein_p[6];
skein_p[0] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 17) ^ skein_p[0];
skein_p[4] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1], 25) ^ skein_p[4];
skein_p[6] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 29) ^ skein_p[6];
skein_p[0] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 39) ^ skein_p[0];
skein_p[2] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7], 43) ^ skein_p[2];
skein_p[6] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1],  8) ^ skein_p[6];
skein_p[0] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7], 35) ^ skein_p[0];
skein_p[2] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 56) ^ skein_p[2];
skein_p[4] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 22) ^ skein_p[4];
skein_p[0] += 0xEABE394CA9D5C3F4ULL;
skein_p[1] += 0x991112C71A75B523ULL;
skein_p[2] += 0xAE18A40B660FCC33ULL;
skein_p[3] += 0xcab2076d98173ec4ULL;
skein_p[4] += 0x4903ADFF749C51CEULL;
skein_p[5] += 0x0D95DE399746DF03ULL + 0xf000000000000040ULL;
skein_p[6] += 0x8FD1934127C79BCEULL + 0x0000000000000040ULL;
skein_p[7] += 0x9A255629FF352CB1ULL + (UINT64)14;
skein_p[0] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1], 46) ^ skein_p[0];
skein_p[2] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 36) ^ skein_p[2];
skein_p[4] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 19) ^ skein_p[4];
skein_p[6] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7], 37) ^ skein_p[6];
skein_p[2] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1], 33) ^ skein_p[2];
skein_p[4] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7], 27) ^ skein_p[4];
skein_p[6] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 14) ^ skein_p[6];
skein_p[0] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 42) ^ skein_p[0];
skein_p[4] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1], 17) ^ skein_p[4];
skein_p[6] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 49) ^ skein_p[6];
skein_p[0] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 36) ^ skein_p[0];
skein_p[2] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7], 39) ^ skein_p[2];
skein_p[6] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1], 44) ^ skein_p[6];
skein_p[0] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7],  9) ^ skein_p[0];
skein_p[2] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 54) ^ skein_p[2];
skein_p[4] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 56) ^ skein_p[4];
skein_p[0] += 0x991112C71A75B523ULL;
skein_p[1] += 0xAE18A40B660FCC33ULL;
skein_p[2] += 0xcab2076d98173ec4ULL;
skein_p[3] += 0x4903ADFF749C51CEULL;
skein_p[4] += 0x0D95DE399746DF03ULL;
skein_p[5] += 0x8FD1934127C79BCEULL + 0x0000000000000040ULL;
skein_p[6] += 0x8A255629FF352CB1ULL;
skein_p[7] += 0x5DB62599DF6CA7B0ULL + (UINT64)15;
skein_p[0] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1], 39) ^ skein_p[0];
skein_p[2] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 30) ^ skein_p[2];
skein_p[4] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 34) ^ skein_p[4];
skein_p[6] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7], 24) ^ skein_p[6];
skein_p[2] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1], 13) ^ skein_p[2];
skein_p[4] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7], 50) ^ skein_p[4];
skein_p[6] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 10) ^ skein_p[6];
skein_p[0] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 17) ^ skein_p[0];
skein_p[4] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1], 25) ^ skein_p[4];
skein_p[6] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 29) ^ skein_p[6];
skein_p[0] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 39) ^ skein_p[0];
skein_p[2] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7], 43) ^ skein_p[2];
skein_p[6] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1],  8) ^ skein_p[6];
skein_p[0] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7], 35) ^ skein_p[0];
skein_p[2] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 56) ^ skein_p[2];
skein_p[4] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 22) ^ skein_p[4];
skein_p[0] += 0xAE18A40B660FCC33ULL;
skein_p[1] += 0xcab2076d98173ec4ULL;
skein_p[2] += 0x4903ADFF749C51CEULL;
skein_p[3] += 0x0D95DE399746DF03ULL;
skein_p[4] += 0x8FD1934127C79BCEULL;
skein_p[5] += 0x8A255629FF352CB1ULL;
skein_p[6] += 0x4DB62599DF6CA7F0ULL;
skein_p[7] += 0xEABE394CA9D5C3F4ULL + (UINT64)16;
skein_p[0] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1], 46) ^ skein_p[0];
skein_p[2] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 36) ^ skein_p[2];
skein_p[4] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 19) ^ skein_p[4];
skein_p[6] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7], 37) ^ skein_p[6];
skein_p[2] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1], 33) ^ skein_p[2];
skein_p[4] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7], 27) ^ skein_p[4];
skein_p[6] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 14) ^ skein_p[6];
skein_p[0] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 42) ^ skein_p[0];
skein_p[4] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1], 17) ^ skein_p[4];
skein_p[6] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 49) ^ skein_p[6];
skein_p[0] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 36) ^ skein_p[0];
skein_p[2] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7], 39) ^ skein_p[2];
skein_p[6] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1], 44) ^ skein_p[6];
skein_p[0] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7],  9) ^ skein_p[0];
skein_p[2] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 54) ^ skein_p[2];
skein_p[4] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 56) ^ skein_p[4];
skein_p[0] += 0xcab2076d98173ec4ULL;
skein_p[1] += 0x4903ADFF749C51CEULL;
skein_p[2] += 0x0D95DE399746DF03ULL;
skein_p[3] += 0x8FD1934127C79BCEULL;
skein_p[4] += 0x9A255629FF352CB1ULL;
skein_p[5] += 0x4DB62599DF6CA7F0ULL;
skein_p[6] += 0xEABE394CA9D5C3F4ULL + 0x0000000000000040ULL;
skein_p[7] += 0x991112C71A75B523ULL + (UINT64)17;
skein_p[0] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1], 39) ^ skein_p[0];
skein_p[2] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 30) ^ skein_p[2];
skein_p[4] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 34) ^ skein_p[4];
skein_p[6] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7], 24) ^ skein_p[6];
skein_p[2] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1], 13) ^ skein_p[2];
skein_p[4] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7], 50) ^ skein_p[4];
skein_p[6] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 10) ^ skein_p[6];
skein_p[0] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 17) ^ skein_p[0];
skein_p[4] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1], 25) ^ skein_p[4];
skein_p[6] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 29) ^ skein_p[6];
skein_p[0] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 39) ^ skein_p[0];
skein_p[2] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7], 43) ^ skein_p[2];
skein_p[6] += skein_p[1];
skein_p[1] = ROTL64(skein_p[1],  8) ^ skein_p[6];
skein_p[0] += skein_p[7];
skein_p[7] = ROTL64(skein_p[7], 35) ^ skein_p[0];
skein_p[2] += skein_p[5];
skein_p[5] = ROTL64(skein_p[5], 56) ^ skein_p[2];
skein_p[4] += skein_p[3];
skein_p[3] = ROTL64(skein_p[3], 22) ^ skein_p[4];
skein_p[0] += 0x4903ADFF749C51CEULL;
skein_p[1] += 0x0D95DE399746DF03ULL;
skein_p[2] += 0x8FD1934127C79BCEULL;
skein_p[3] += 0x9A255629FF352CB1ULL;
skein_p[4] += 0x5DB62599DF6CA7B0ULL;
skein_p[5] += 0xEABE394CA9D5C3F4ULL + 0x0000000000000040ULL;
skein_p[6] += 0x891112C71A75B523ULL;
skein_p[7] += 0xAE18A40B660FCC33ULL + (UINT64)18;

#define h0 skein_p[0]
#define h1 skein_p[1]
#define h2 skein_p[2]
#define h3 skein_p[3]
#define h4 skein_p[4]
#define h5 skein_p[5]
#define h6 skein_p[6]
#define h7 skein_p[7]
h0 ^= hash64[0];
h1 ^= hash64[1];
h2 ^= hash64[2];
h3 ^= hash64[3];
h4 ^= hash64[4];
h5 ^= hash64[5];
h6 ^= hash64[6];
h7 ^= hash64[7];

hash64[0] = 0;
hash64[1] = 0;
hash64[2] = 0;
hash64[3] = 0;
hash64[4] = 0;
hash64[5] = 0;
hash64[6] = 0;
hash64[7] = 0;

skein_h8 = h0 ^ h1 ^ h2 ^ h3 ^ h4 ^ h5 ^ h6 ^ h7 ^ 0x1BD11BDAA9FC1A22ULL;

hash64[0] = (hash64[0] + h0);
hash64[1] = (hash64[1] + h1);
hash64[2] = (hash64[2] + h2);
hash64[3] = (hash64[3] + h3);
hash64[4] = (hash64[4] + h4);
hash64[5] = (hash64[5] + h5 + 8ULL);
hash64[6] = (hash64[6] + h6 + 0xff00000000000000ULL);
hash64[7] = (hash64[7] + h7 + (UINT64)0);
hash64[0] += hash64[1];
hash64[1] = ROTL64(hash64[1], 46) ^ hash64[0];
hash64[2] += hash64[3];
hash64[3] = ROTL64(hash64[3], 36) ^ hash64[2];
hash64[4] += hash64[5];
hash64[5] = ROTL64(hash64[5], 19) ^ hash64[4];
hash64[6] += hash64[7];
hash64[7] = ROTL64(hash64[7], 37) ^ hash64[6];
hash64[2] += hash64[1];
hash64[1] = ROTL64(hash64[1], 33) ^ hash64[2];
hash64[4] += hash64[7];
hash64[7] = ROTL64(hash64[7], 27) ^ hash64[4];
hash64[6] += hash64[5];
hash64[5] = ROTL64(hash64[5], 14) ^ hash64[6];
hash64[0] += hash64[3];
hash64[3] = ROTL64(hash64[3], 42) ^ hash64[0];
hash64[4] += hash64[1];
hash64[1] = ROTL64(hash64[1], 17) ^ hash64[4];
hash64[6] += hash64[3];
hash64[3] = ROTL64(hash64[3], 49) ^ hash64[6];
hash64[0] += hash64[5];
hash64[5] = ROTL64(hash64[5], 36) ^ hash64[0];
hash64[2] += hash64[7];
hash64[7] = ROTL64(hash64[7], 39) ^ hash64[2];
hash64[6] += hash64[1];
hash64[1] = ROTL64(hash64[1], 44) ^ hash64[6];
hash64[0] += hash64[7];
hash64[7] = ROTL64(hash64[7], 9) ^ hash64[0];
hash64[2] += hash64[5];
hash64[5] = ROTL64(hash64[5], 54) ^ hash64[2];
hash64[4] += hash64[3];
hash64[3] = ROTL64(hash64[3], 56) ^ hash64[4];
hash64[0] = (hash64[0] + h1);
hash64[1] = (hash64[1] + h2);
hash64[2] = (hash64[2] + h3);
hash64[3] = (hash64[3] + h4);
hash64[4] = (hash64[4] + h5);
hash64[5] = (hash64[5] + h6 + 0xff00000000000000ULL);
hash64[6] = (hash64[6] + h7 + 0xff00000000000008ULL);
hash64[7] = (hash64[7] + skein_h8 + (UINT64)1);
hash64[0] += hash64[1];
hash64[1] = ROTL64(hash64[1], 39) ^ hash64[0];
hash64[2] += hash64[3];
hash64[3] = ROTL64(hash64[3], 30) ^ hash64[2];
hash64[4] += hash64[5];
hash64[5] = ROTL64(hash64[5], 34) ^ hash64[4];
hash64[6] += hash64[7];
hash64[7] = ROTL64(hash64[7], 24) ^ hash64[6];
hash64[2] += hash64[1];
hash64[1] = ROTL64(hash64[1], 13) ^ hash64[2];
hash64[4] += hash64[7];
hash64[7] = ROTL64(hash64[7], 50) ^ hash64[4];
hash64[6] += hash64[5];
hash64[5] = ROTL64(hash64[5], 10) ^ hash64[6];
hash64[0] += hash64[3];
hash64[3] = ROTL64(hash64[3], 17) ^ hash64[0];
hash64[4] += hash64[1];
hash64[1] = ROTL64(hash64[1], 25) ^ hash64[4];
hash64[6] += hash64[3];
hash64[3] = ROTL64(hash64[3], 29) ^ hash64[6];
hash64[0] += hash64[5];
hash64[5] = ROTL64(hash64[5], 39) ^ hash64[0];
hash64[2] += hash64[7];
hash64[7] = ROTL64(hash64[7], 43) ^ hash64[2];
hash64[6] += hash64[1];
hash64[1] = ROTL64(hash64[1], 8) ^ hash64[6];
hash64[0] += hash64[7];
hash64[7] = ROTL64(hash64[7], 35) ^ hash64[0];
hash64[2] += hash64[5];
hash64[5] = ROTL64(hash64[5], 56) ^ hash64[2];
hash64[4] += hash64[3];
hash64[3] = ROTL64(hash64[3], 22) ^ hash64[4];
hash64[0] = (hash64[0] + h2);
hash64[1] = (hash64[1] + h3);
hash64[2] = (hash64[2] + h4);
hash64[3] = (hash64[3] + h5);
hash64[4] = (hash64[4] + h6);
hash64[5] = (hash64[5] + h7 + 0xff00000000000008ULL);
hash64[6] = (hash64[6] + skein_h8 + 8ULL);
hash64[7] = (hash64[7] + h0 + (UINT64)2);
hash64[0] += hash64[1];
hash64[1] = ROTL64(hash64[1], 46) ^ hash64[0];
hash64[2] += hash64[3];
hash64[3] = ROTL64(hash64[3], 36) ^ hash64[2];
hash64[4] += hash64[5];
hash64[5] = ROTL64(hash64[5], 19) ^ hash64[4];
hash64[6] += hash64[7];
hash64[7] = ROTL64(hash64[7], 37) ^ hash64[6];
hash64[2] += hash64[1];
hash64[1] = ROTL64(hash64[1], 33) ^ hash64[2];
hash64[4] += hash64[7];
hash64[7] = ROTL64(hash64[7], 27) ^ hash64[4];
hash64[6] += hash64[5];
hash64[5] = ROTL64(hash64[5], 14) ^ hash64[6];
hash64[0] += hash64[3];
hash64[3] = ROTL64(hash64[3], 42) ^ hash64[0];
hash64[4] += hash64[1];
hash64[1] = ROTL64(hash64[1], 17) ^ hash64[4];
hash64[6] += hash64[3];
hash64[3] = ROTL64(hash64[3], 49) ^ hash64[6];
hash64[0] += hash64[5];
hash64[5] = ROTL64(hash64[5], 36) ^ hash64[0];
hash64[2] += hash64[7];
hash64[7] = ROTL64(hash64[7], 39) ^ hash64[2];
hash64[6] += hash64[1];
hash64[1] = ROTL64(hash64[1], 44) ^ hash64[6];
hash64[0] += hash64[7];
hash64[7] = ROTL64(hash64[7], 9) ^ hash64[0];
hash64[2] += hash64[5];
hash64[5] = ROTL64(hash64[5], 54) ^ hash64[2];
hash64[4] += hash64[3];
hash64[3] = ROTL64(hash64[3], 56) ^ hash64[4];
hash64[0] = (hash64[0] + h3);
hash64[1] = (hash64[1] + h4);
hash64[2] = (hash64[2] + h5);
hash64[3] = (hash64[3] + h6);
hash64[4] = (hash64[4] + h7);
hash64[5] = (hash64[5] + skein_h8 + 8ULL);
hash64[6] = (hash64[6] + h0 + 0xff00000000000000ULL);
hash64[7] = (hash64[7] + h1 + (UINT64)3);
hash64[0] += hash64[1];
hash64[1] = ROTL64(hash64[1], 39) ^ hash64[0];
hash64[2] += hash64[3];
hash64[3] = ROTL64(hash64[3], 30) ^ hash64[2];
hash64[4] += hash64[5];
hash64[5] = ROTL64(hash64[5], 34) ^ hash64[4];
hash64[6] += hash64[7];
hash64[7] = ROTL64(hash64[7], 24) ^ hash64[6];
hash64[2] += hash64[1];
hash64[1] = ROTL64(hash64[1], 13) ^ hash64[2];
hash64[4] += hash64[7];
hash64[7] = ROTL64(hash64[7], 50) ^ hash64[4];
hash64[6] += hash64[5];
hash64[5] = ROTL64(hash64[5], 10) ^ hash64[6];
hash64[0] += hash64[3];
hash64[3] = ROTL64(hash64[3], 17) ^ hash64[0];
hash64[4] += hash64[1];
hash64[1] = ROTL64(hash64[1], 25) ^ hash64[4];
hash64[6] += hash64[3];
hash64[3] = ROTL64(hash64[3], 29) ^ hash64[6];
hash64[0] += hash64[5];
hash64[5] = ROTL64(hash64[5], 39) ^ hash64[0];
hash64[2] += hash64[7];
hash64[7] = ROTL64(hash64[7], 43) ^ hash64[2];
hash64[6] += hash64[1];
hash64[1] = ROTL64(hash64[1], 8) ^ hash64[6];
hash64[0] += hash64[7];
hash64[7] = ROTL64(hash64[7], 35) ^ hash64[0];
hash64[2] += hash64[5];
hash64[5] = ROTL64(hash64[5], 56) ^ hash64[2];
hash64[4] += hash64[3];
hash64[3] = ROTL64(hash64[3], 22) ^ hash64[4];
hash64[0] = (hash64[0] + h4);
hash64[1] = (hash64[1] + h5);
hash64[2] = (hash64[2] + h6);
hash64[3] = (hash64[3] + h7);
hash64[4] = (hash64[4] + skein_h8);
hash64[5] = (hash64[5] + h0 + 0xff00000000000000ULL);
hash64[6] = (hash64[6] + h1 + 0xff00000000000008ULL);
hash64[7] = (hash64[7] + h2 + (UINT64)4);
hash64[0] += hash64[1];
hash64[1] = ROTL64(hash64[1], 46) ^ hash64[0];
hash64[2] += hash64[3];
hash64[3] = ROTL64(hash64[3], 36) ^ hash64[2];
hash64[4] += hash64[5];
hash64[5] = ROTL64(hash64[5], 19) ^ hash64[4];
hash64[6] += hash64[7];
hash64[7] = ROTL64(hash64[7], 37) ^ hash64[6];
hash64[2] += hash64[1];
hash64[1] = ROTL64(hash64[1], 33) ^ hash64[2];
hash64[4] += hash64[7];
hash64[7] = ROTL64(hash64[7], 27) ^ hash64[4];
hash64[6] += hash64[5];
hash64[5] = ROTL64(hash64[5], 14) ^ hash64[6];
hash64[0] += hash64[3];
hash64[3] = ROTL64(hash64[3], 42) ^ hash64[0];
hash64[4] += hash64[1];
hash64[1] = ROTL64(hash64[1], 17) ^ hash64[4];
hash64[6] += hash64[3];
hash64[3] = ROTL64(hash64[3], 49) ^ hash64[6];
hash64[0] += hash64[5];
hash64[5] = ROTL64(hash64[5], 36) ^ hash64[0];
hash64[2] += hash64[7];
hash64[7] = ROTL64(hash64[7], 39) ^ hash64[2];
hash64[6] += hash64[1];
hash64[1] = ROTL64(hash64[1], 44) ^ hash64[6];
hash64[0] += hash64[7];
hash64[7] = ROTL64(hash64[7], 9) ^ hash64[0];
hash64[2] += hash64[5];
hash64[5] = ROTL64(hash64[5], 54) ^ hash64[2];
hash64[4] += hash64[3];
hash64[3] = ROTL64(hash64[3], 56) ^ hash64[4];
hash64[0] = (hash64[0] + h5);
hash64[1] = (hash64[1] + h6);
hash64[2] = (hash64[2] + h7);
hash64[3] = (hash64[3] + skein_h8);
hash64[4] = (hash64[4] + h0);
hash64[5] = (hash64[5] + h1 + 0xff00000000000008ULL);
hash64[6] = (hash64[6] + h2 + 8ULL);
hash64[7] = (hash64[7] + h3 + (UINT64)5);
hash64[0] += hash64[1];
hash64[1] = ROTL64(hash64[1], 39) ^ hash64[0];
hash64[2] += hash64[3];
hash64[3] = ROTL64(hash64[3], 30) ^ hash64[2];
hash64[4] += hash64[5];
hash64[5] = ROTL64(hash64[5], 34) ^ hash64[4];
hash64[6] += hash64[7];
hash64[7] = ROTL64(hash64[7], 24) ^ hash64[6];
hash64[2] += hash64[1];
hash64[1] = ROTL64(hash64[1], 13) ^ hash64[2];
hash64[4] += hash64[7];
hash64[7] = ROTL64(hash64[7], 50) ^ hash64[4];
hash64[6] += hash64[5];
hash64[5] = ROTL64(hash64[5], 10) ^ hash64[6];
hash64[0] += hash64[3];
hash64[3] = ROTL64(hash64[3], 17) ^ hash64[0];
hash64[4] += hash64[1];
hash64[1] = ROTL64(hash64[1], 25) ^ hash64[4];
hash64[6] += hash64[3];
hash64[3] = ROTL64(hash64[3], 29) ^ hash64[6];
hash64[0] += hash64[5];
hash64[5] = ROTL64(hash64[5], 39) ^ hash64[0];
hash64[2] += hash64[7];
hash64[7] = ROTL64(hash64[7], 43) ^ hash64[2];
hash64[6] += hash64[1];
hash64[1] = ROTL64(hash64[1], 8) ^ hash64[6];
hash64[0] += hash64[7];
hash64[7] = ROTL64(hash64[7], 35) ^ hash64[0];
hash64[2] += hash64[5];
hash64[5] = ROTL64(hash64[5], 56) ^ hash64[2];
hash64[4] += hash64[3];
hash64[3] = ROTL64(hash64[3], 22) ^ hash64[4];
hash64[0] = (hash64[0] + h6);
hash64[1] = (hash64[1] + h7);
hash64[2] = (hash64[2] + skein_h8);
hash64[3] = (hash64[3] + h0);
hash64[4] = (hash64[4] + h1);
hash64[5] = (hash64[5] + h2 + 8ULL);
hash64[6] = (hash64[6] + h3 + 0xff00000000000000ULL);
hash64[7] = (hash64[7] + h4 + (UINT64)6);
hash64[0] += hash64[1];
hash64[1] = ROTL64(hash64[1], 46) ^ hash64[0];
hash64[2] += hash64[3];
hash64[3] = ROTL64(hash64[3], 36) ^ hash64[2];
hash64[4] += hash64[5];
hash64[5] = ROTL64(hash64[5], 19) ^ hash64[4];
hash64[6] += hash64[7];
hash64[7] = ROTL64(hash64[7], 37) ^ hash64[6];
hash64[2] += hash64[1];
hash64[1] = ROTL64(hash64[1], 33) ^ hash64[2];
hash64[4] += hash64[7];
hash64[7] = ROTL64(hash64[7], 27) ^ hash64[4];
hash64[6] += hash64[5];
hash64[5] = ROTL64(hash64[5], 14) ^ hash64[6];
hash64[0] += hash64[3];
hash64[3] = ROTL64(hash64[3], 42) ^ hash64[0];
hash64[4] += hash64[1];
hash64[1] = ROTL64(hash64[1], 17) ^ hash64[4];
hash64[6] += hash64[3];
hash64[3] = ROTL64(hash64[3], 49) ^ hash64[6];
hash64[0] += hash64[5];
hash64[5] = ROTL64(hash64[5], 36) ^ hash64[0];
hash64[2] += hash64[7];
hash64[7] = ROTL64(hash64[7], 39) ^ hash64[2];
hash64[6] += hash64[1];
hash64[1] = ROTL64(hash64[1], 44) ^ hash64[6];
hash64[0] += hash64[7];
hash64[7] = ROTL64(hash64[7], 9) ^ hash64[0];
hash64[2] += hash64[5];
hash64[5] = ROTL64(hash64[5], 54) ^ hash64[2];
hash64[4] += hash64[3];
hash64[3] = ROTL64(hash64[3], 56) ^ hash64[4];
hash64[0] = (hash64[0] + h7);
hash64[1] = (hash64[1] + skein_h8);
hash64[2] = (hash64[2] + h0);
hash64[3] = (hash64[3] + h1);
hash64[4] = (hash64[4] + h2);
hash64[5] = (hash64[5] + h3 + 0xff00000000000000ULL);
hash64[6] = (hash64[6] + h4 + 0xff00000000000008ULL);
hash64[7] = (hash64[7] + h5 + (UINT64)7);
hash64[0] += hash64[1];
hash64[1] = ROTL64(hash64[1], 39) ^ hash64[0];
hash64[2] += hash64[3];
hash64[3] = ROTL64(hash64[3], 30) ^ hash64[2];
hash64[4] += hash64[5];
hash64[5] = ROTL64(hash64[5], 34) ^ hash64[4];
hash64[6] += hash64[7];
hash64[7] = ROTL64(hash64[7], 24) ^ hash64[6];
hash64[2] += hash64[1];
hash64[1] = ROTL64(hash64[1], 13) ^ hash64[2];
hash64[4] += hash64[7];
hash64[7] = ROTL64(hash64[7], 50) ^ hash64[4];
hash64[6] += hash64[5];
hash64[5] = ROTL64(hash64[5], 10) ^ hash64[6];
hash64[0] += hash64[3];
hash64[3] = ROTL64(hash64[3], 17) ^ hash64[0];
hash64[4] += hash64[1];
hash64[1] = ROTL64(hash64[1], 25) ^ hash64[4];
hash64[6] += hash64[3];
hash64[3] = ROTL64(hash64[3], 29) ^ hash64[6];
hash64[0] += hash64[5];
hash64[5] = ROTL64(hash64[5], 39) ^ hash64[0];
hash64[2] += hash64[7];
hash64[7] = ROTL64(hash64[7], 43) ^ hash64[2];
hash64[6] += hash64[1];
hash64[1] = ROTL64(hash64[1], 8) ^ hash64[6];
hash64[0] += hash64[7];
hash64[7] = ROTL64(hash64[7], 35) ^ hash64[0];
hash64[2] += hash64[5];
hash64[5] = ROTL64(hash64[5], 56) ^ hash64[2];
hash64[4] += hash64[3];
hash64[3] = ROTL64(hash64[3], 22) ^ hash64[4];
hash64[0] = (hash64[0] + skein_h8);
hash64[1] = (hash64[1] + h0);
hash64[2] = (hash64[2] + h1);
hash64[3] = (hash64[3] + h2);
hash64[4] = (hash64[4] + h3);
hash64[5] = (hash64[5] + h4 + 0xff00000000000008ULL);
hash64[6] = (hash64[6] + h5 + 8ULL);
hash64[7] = (hash64[7] + h6 + (UINT64)8);
hash64[0] += hash64[1];
hash64[1] = ROTL64(hash64[1], 46) ^ hash64[0];
hash64[2] += hash64[3];
hash64[3] = ROTL64(hash64[3], 36) ^ hash64[2];
hash64[4] += hash64[5];
hash64[5] = ROTL64(hash64[5], 19) ^ hash64[4];
hash64[6] += hash64[7];
hash64[7] = ROTL64(hash64[7], 37) ^ hash64[6];
hash64[2] += hash64[1];
hash64[1] = ROTL64(hash64[1], 33) ^ hash64[2];
hash64[4] += hash64[7];
hash64[7] = ROTL64(hash64[7], 27) ^ hash64[4];
hash64[6] += hash64[5];
hash64[5] = ROTL64(hash64[5], 14) ^ hash64[6];
hash64[0] += hash64[3];
hash64[3] = ROTL64(hash64[3], 42) ^ hash64[0];
hash64[4] += hash64[1];
hash64[1] = ROTL64(hash64[1], 17) ^ hash64[4];
hash64[6] += hash64[3];
hash64[3] = ROTL64(hash64[3], 49) ^ hash64[6];
hash64[0] += hash64[5];
hash64[5] = ROTL64(hash64[5], 36) ^ hash64[0];
hash64[2] += hash64[7];
hash64[7] = ROTL64(hash64[7], 39) ^ hash64[2];
hash64[6] += hash64[1];
hash64[1] = ROTL64(hash64[1], 44) ^ hash64[6];
hash64[0] += hash64[7];
hash64[7] = ROTL64(hash64[7], 9) ^ hash64[0];
hash64[2] += hash64[5];
hash64[5] = ROTL64(hash64[5], 54) ^ hash64[2];
hash64[4] += hash64[3];
hash64[3] = ROTL64(hash64[3], 56) ^ hash64[4];
hash64[0] = (hash64[0] + h0);
hash64[1] = (hash64[1] + h1);
hash64[2] = (hash64[2] + h2);
hash64[3] = (hash64[3] + h3);
hash64[4] = (hash64[4] + h4);
hash64[5] = (hash64[5] + h5 + 8ULL);
hash64[6] = (hash64[6] + h6 + 0xff00000000000000ULL);
hash64[7] = (hash64[7] + h7 + (UINT64)9);
hash64[0] += hash64[1];
hash64[1] = ROTL64(hash64[1], 39) ^ hash64[0];
hash64[2] += hash64[3];
hash64[3] = ROTL64(hash64[3], 30) ^ hash64[2];
hash64[4] += hash64[5];
hash64[5] = ROTL64(hash64[5], 34) ^ hash64[4];
hash64[6] += hash64[7];
hash64[7] = ROTL64(hash64[7], 24) ^ hash64[6];
hash64[2] += hash64[1];
hash64[1] = ROTL64(hash64[1], 13) ^ hash64[2];
hash64[4] += hash64[7];
hash64[7] = ROTL64(hash64[7], 50) ^ hash64[4];
hash64[6] += hash64[5];
hash64[5] = ROTL64(hash64[5], 10) ^ hash64[6];
hash64[0] += hash64[3];
hash64[3] = ROTL64(hash64[3], 17) ^ hash64[0];
hash64[4] += hash64[1];
hash64[1] = ROTL64(hash64[1], 25) ^ hash64[4];
hash64[6] += hash64[3];
hash64[3] = ROTL64(hash64[3], 29) ^ hash64[6];
hash64[0] += hash64[5];
hash64[5] = ROTL64(hash64[5], 39) ^ hash64[0];
hash64[2] += hash64[7];
hash64[7] = ROTL64(hash64[7], 43) ^ hash64[2];
hash64[6] += hash64[1];
hash64[1] = ROTL64(hash64[1], 8) ^ hash64[6];
hash64[0] += hash64[7];
hash64[7] = ROTL64(hash64[7], 35) ^ hash64[0];
hash64[2] += hash64[5];
hash64[5] = ROTL64(hash64[5], 56) ^ hash64[2];
hash64[4] += hash64[3];
hash64[3] = ROTL64(hash64[3], 22) ^ hash64[4];

hash64[0] = (hash64[0] + h1);
hash64[1] = (hash64[1] + h2);
hash64[2] = (hash64[2] + h3);
hash64[3] = (hash64[3] + h4);
hash64[4] = (hash64[4] + h5);
hash64[5] = (hash64[5] + h6 + 0xff00000000000000ULL);
hash64[6] = (hash64[6] + h7 + 0xff00000000000008ULL);
hash64[7] = (hash64[7] + skein_h8 + (UINT64)10);
hash64[0] += hash64[1];
hash64[1] = ROTL64(hash64[1], 46) ^ hash64[0];
hash64[2] += hash64[3];
hash64[3] = ROTL64(hash64[3], 36) ^ hash64[2];
hash64[4] += hash64[5];
hash64[5] = ROTL64(hash64[5], 19) ^ hash64[4];
hash64[6] += hash64[7];
hash64[7] = ROTL64(hash64[7], 37) ^ hash64[6];
hash64[2] += hash64[1];
hash64[1] = ROTL64(hash64[1], 33) ^ hash64[2];
hash64[4] += hash64[7];
hash64[7] = ROTL64(hash64[7], 27) ^ hash64[4];
hash64[6] += hash64[5];
hash64[5] = ROTL64(hash64[5], 14) ^ hash64[6];
hash64[0] += hash64[3];
hash64[3] = ROTL64(hash64[3], 42) ^ hash64[0];
hash64[4] += hash64[1];
hash64[1] = ROTL64(hash64[1], 17) ^ hash64[4];
hash64[6] += hash64[3];
hash64[3] = ROTL64(hash64[3], 49) ^ hash64[6];
hash64[0] += hash64[5];
hash64[5] = ROTL64(hash64[5], 36) ^ hash64[0];
hash64[2] += hash64[7];
hash64[7] = ROTL64(hash64[7], 39) ^ hash64[2];
hash64[6] += hash64[1];
hash64[1] = ROTL64(hash64[1], 44) ^ hash64[6];
hash64[0] += hash64[7];
hash64[7] = ROTL64(hash64[7], 9) ^ hash64[0];
hash64[2] += hash64[5];
hash64[5] = ROTL64(hash64[5], 54) ^ hash64[2];
hash64[4] += hash64[3];
hash64[3] = ROTL64(hash64[3], 56) ^ hash64[4];
hash64[0] = (hash64[0] + h2);
hash64[1] = (hash64[1] + h3);
hash64[2] = (hash64[2] + h4);
hash64[3] = (hash64[3] + h5);
hash64[4] = (hash64[4] + h6);
hash64[5] = (hash64[5] + h7 + 0xff00000000000008ULL);
hash64[6] = (hash64[6] + skein_h8 + 8ULL);
hash64[7] = (hash64[7] + h0 + (UINT64)11);
hash64[0] += hash64[1];
hash64[1] = ROTL64(hash64[1], 39) ^ hash64[0];
hash64[2] += hash64[3];
hash64[3] = ROTL64(hash64[3], 30) ^ hash64[2];
hash64[4] += hash64[5];
hash64[5] = ROTL64(hash64[5], 34) ^ hash64[4];
hash64[6] += hash64[7];
hash64[7] = ROTL64(hash64[7], 24) ^ hash64[6];
hash64[2] += hash64[1];
hash64[1] = ROTL64(hash64[1], 13) ^ hash64[2];
hash64[4] += hash64[7];
hash64[7] = ROTL64(hash64[7], 50) ^ hash64[4];
hash64[6] += hash64[5];
hash64[5] = ROTL64(hash64[5], 10) ^ hash64[6];
hash64[0] += hash64[3];
hash64[3] = ROTL64(hash64[3], 17) ^ hash64[0];
hash64[4] += hash64[1];
hash64[1] = ROTL64(hash64[1], 25) ^ hash64[4];
hash64[6] += hash64[3];
hash64[3] = ROTL64(hash64[3], 29) ^ hash64[6];
hash64[0] += hash64[5];
hash64[5] = ROTL64(hash64[5], 39) ^ hash64[0];
hash64[2] += hash64[7];
hash64[7] = ROTL64(hash64[7], 43) ^ hash64[2];
hash64[6] += hash64[1];
hash64[1] = ROTL64(hash64[1], 8) ^ hash64[6];
hash64[0] += hash64[7];
hash64[7] = ROTL64(hash64[7], 35) ^ hash64[0];
hash64[2] += hash64[5];
hash64[5] = ROTL64(hash64[5], 56) ^ hash64[2];
hash64[4] += hash64[3];
hash64[3] = ROTL64(hash64[3], 22) ^ hash64[4];
hash64[0] = (hash64[0] + h3);
hash64[1] = (hash64[1] + h4);
hash64[2] = (hash64[2] + h5);
hash64[3] = (hash64[3] + h6);
hash64[4] = (hash64[4] + h7);
hash64[5] = (hash64[5] + skein_h8 + 8ULL);
hash64[6] = (hash64[6] + h0 + 0xff00000000000000ULL);
hash64[7] = (hash64[7] + h1 + (UINT64)12);
hash64[0] += hash64[1];
hash64[1] = ROTL64(hash64[1], 46) ^ hash64[0];
hash64[2] += hash64[3];
hash64[3] = ROTL64(hash64[3], 36) ^ hash64[2];
hash64[4] += hash64[5];
hash64[5] = ROTL64(hash64[5], 19) ^ hash64[4];
hash64[6] += hash64[7];
hash64[7] = ROTL64(hash64[7], 37) ^ hash64[6];
hash64[2] += hash64[1];
hash64[1] = ROTL64(hash64[1], 33) ^ hash64[2];
hash64[4] += hash64[7];
hash64[7] = ROTL64(hash64[7], 27) ^ hash64[4];
hash64[6] += hash64[5];
hash64[5] = ROTL64(hash64[5], 14) ^ hash64[6];
hash64[0] += hash64[3];
hash64[3] = ROTL64(hash64[3], 42) ^ hash64[0];
hash64[4] += hash64[1];
hash64[1] = ROTL64(hash64[1], 17) ^ hash64[4];
hash64[6] += hash64[3];
hash64[3] = ROTL64(hash64[3], 49) ^ hash64[6];
hash64[0] += hash64[5];
hash64[5] = ROTL64(hash64[5], 36) ^ hash64[0];
hash64[2] += hash64[7];
hash64[7] = ROTL64(hash64[7], 39) ^ hash64[2];
hash64[6] += hash64[1];
hash64[1] = ROTL64(hash64[1], 44) ^ hash64[6];
hash64[0] += hash64[7];
hash64[7] = ROTL64(hash64[7], 9) ^ hash64[0];
hash64[2] += hash64[5];
hash64[5] = ROTL64(hash64[5], 54) ^ hash64[2];
hash64[4] += hash64[3];
hash64[3] = ROTL64(hash64[3], 56) ^ hash64[4];
hash64[0] = (hash64[0] + h4);
hash64[1] = (hash64[1] + h5);
hash64[2] = (hash64[2] + h6);
hash64[3] = (hash64[3] + h7);
hash64[4] = (hash64[4] + skein_h8);
hash64[5] = (hash64[5] + h0 + 0xff00000000000000ULL);
hash64[6] = (hash64[6] + h1 + 0xff00000000000008ULL);
hash64[7] = (hash64[7] + h2 + (UINT64)13);
hash64[0] += hash64[1];
hash64[1] = ROTL64(hash64[1], 39) ^ hash64[0];
hash64[2] += hash64[3];
hash64[3] = ROTL64(hash64[3], 30) ^ hash64[2];
hash64[4] += hash64[5];
hash64[5] = ROTL64(hash64[5], 34) ^ hash64[4];
hash64[6] += hash64[7];
hash64[7] = ROTL64(hash64[7], 24) ^ hash64[6];
hash64[2] += hash64[1];
hash64[1] = ROTL64(hash64[1], 13) ^ hash64[2];
hash64[4] += hash64[7];
hash64[7] = ROTL64(hash64[7], 50) ^ hash64[4];
hash64[6] += hash64[5];
hash64[5] = ROTL64(hash64[5], 10) ^ hash64[6];
hash64[0] += hash64[3];
hash64[3] = ROTL64(hash64[3], 17) ^ hash64[0];
hash64[4] += hash64[1];
hash64[1] = ROTL64(hash64[1], 25) ^ hash64[4];
hash64[6] += hash64[3];
hash64[3] = ROTL64(hash64[3], 29) ^ hash64[6];
hash64[0] += hash64[5];
hash64[5] = ROTL64(hash64[5], 39) ^ hash64[0];
hash64[2] += hash64[7];
hash64[7] = ROTL64(hash64[7], 43) ^ hash64[2];
hash64[6] += hash64[1];
hash64[1] = ROTL64(hash64[1], 8) ^ hash64[6];
hash64[0] += hash64[7];
hash64[7] = ROTL64(hash64[7], 35) ^ hash64[0];
hash64[2] += hash64[5];
hash64[5] = ROTL64(hash64[5], 56) ^ hash64[2];
hash64[4] += hash64[3];
hash64[3] = ROTL64(hash64[3], 22) ^ hash64[4];
hash64[0] = (hash64[0] + h5);
hash64[1] = (hash64[1] + h6);
hash64[2] = (hash64[2] + h7);
hash64[3] = (hash64[3] + skein_h8);
hash64[4] = (hash64[4] + h0);
hash64[5] = (hash64[5] + h1 + 0xff00000000000008ULL);
hash64[6] = (hash64[6] + h2 + 8ULL);
hash64[7] = (hash64[7] + h3 + (UINT64)14);
hash64[0] += hash64[1];
hash64[1] = ROTL64(hash64[1], 46) ^ hash64[0];
hash64[2] += hash64[3];
hash64[3] = ROTL64(hash64[3], 36) ^ hash64[2];
hash64[4] += hash64[5];
hash64[5] = ROTL64(hash64[5], 19) ^ hash64[4];
hash64[6] += hash64[7];
hash64[7] = ROTL64(hash64[7], 37) ^ hash64[6];
hash64[2] += hash64[1];
hash64[1] = ROTL64(hash64[1], 33) ^ hash64[2];
hash64[4] += hash64[7];
hash64[7] = ROTL64(hash64[7], 27) ^ hash64[4];
hash64[6] += hash64[5];
hash64[5] = ROTL64(hash64[5], 14) ^ hash64[6];
hash64[0] += hash64[3];
hash64[3] = ROTL64(hash64[3], 42) ^ hash64[0];
hash64[4] += hash64[1];
hash64[1] = ROTL64(hash64[1], 17) ^ hash64[4];
hash64[6] += hash64[3];
hash64[3] = ROTL64(hash64[3], 49) ^ hash64[6];
hash64[0] += hash64[5];
hash64[5] = ROTL64(hash64[5], 36) ^ hash64[0];
hash64[2] += hash64[7];
hash64[7] = ROTL64(hash64[7], 39) ^ hash64[2];
hash64[6] += hash64[1];
hash64[1] = ROTL64(hash64[1], 44) ^ hash64[6];
hash64[0] += hash64[7];
hash64[7] = ROTL64(hash64[7], 9) ^ hash64[0];
hash64[2] += hash64[5];
hash64[5] = ROTL64(hash64[5], 54) ^ hash64[2];
hash64[4] += hash64[3];
hash64[3] = ROTL64(hash64[3], 56) ^ hash64[4];
hash64[0] = (hash64[0] + h6);
hash64[1] = (hash64[1] + h7);
hash64[2] = (hash64[2] + skein_h8);
hash64[3] = (hash64[3] + h0);
hash64[4] = (hash64[4] + h1);
hash64[5] = (hash64[5] + h2 + 8ULL);
hash64[6] = (hash64[6] + h3 + 0xff00000000000000ULL);
hash64[7] = (hash64[7] + h4 + (UINT64)15);
hash64[0] += hash64[1];
hash64[1] = ROTL64(hash64[1], 39) ^ hash64[0];
hash64[2] += hash64[3];
hash64[3] = ROTL64(hash64[3], 30) ^ hash64[2];
hash64[4] += hash64[5];
hash64[5] = ROTL64(hash64[5], 34) ^ hash64[4];
hash64[6] += hash64[7];
hash64[7] = ROTL64(hash64[7], 24) ^ hash64[6];
hash64[2] += hash64[1];
hash64[1] = ROTL64(hash64[1], 13) ^ hash64[2];
hash64[4] += hash64[7];
hash64[7] = ROTL64(hash64[7], 50) ^ hash64[4];
hash64[6] += hash64[5];
hash64[5] = ROTL64(hash64[5], 10) ^ hash64[6];
hash64[0] += hash64[3];
hash64[3] = ROTL64(hash64[3], 17) ^ hash64[0];
hash64[4] += hash64[1];
hash64[1] = ROTL64(hash64[1], 25) ^ hash64[4];
hash64[6] += hash64[3];
hash64[3] = ROTL64(hash64[3], 29) ^ hash64[6];
hash64[0] += hash64[5];
hash64[5] = ROTL64(hash64[5], 39) ^ hash64[0];
hash64[2] += hash64[7];
hash64[7] = ROTL64(hash64[7], 43) ^ hash64[2];
hash64[6] += hash64[1];
hash64[1] = ROTL64(hash64[1], 8) ^ hash64[6];
hash64[0] += hash64[7];
hash64[7] = ROTL64(hash64[7], 35) ^ hash64[0];
hash64[2] += hash64[5];
hash64[5] = ROTL64(hash64[5], 56) ^ hash64[2];
hash64[4] += hash64[3];
hash64[3] = ROTL64(hash64[3], 22) ^ hash64[4];
hash64[0] = (hash64[0] + h7);
hash64[1] = (hash64[1] + skein_h8);
hash64[2] = (hash64[2] + h0);
hash64[3] = (hash64[3] + h1);
hash64[4] = (hash64[4] + h2);
hash64[5] = (hash64[5] + h3 + 0xff00000000000000ULL);
hash64[6] = (hash64[6] + h4 + 0xff00000000000008ULL);
hash64[7] = (hash64[7] + h5 + (UINT64)16);
hash64[0] += hash64[1];
hash64[1] = ROTL64(hash64[1], 46) ^ hash64[0];
hash64[2] += hash64[3];
hash64[3] = ROTL64(hash64[3], 36) ^ hash64[2];
hash64[4] += hash64[5];
hash64[5] = ROTL64(hash64[5], 19) ^ hash64[4];
hash64[6] += hash64[7];
hash64[7] = ROTL64(hash64[7], 37) ^ hash64[6];
hash64[2] += hash64[1];
hash64[1] = ROTL64(hash64[1], 33) ^ hash64[2];
hash64[4] += hash64[7];
hash64[7] = ROTL64(hash64[7], 27) ^ hash64[4];
hash64[6] += hash64[5];
hash64[5] = ROTL64(hash64[5], 14) ^ hash64[6];
hash64[0] += hash64[3];
hash64[3] = ROTL64(hash64[3], 42) ^ hash64[0];
hash64[4] += hash64[1];
hash64[1] = ROTL64(hash64[1], 17) ^ hash64[4];
hash64[6] += hash64[3];
hash64[3] = ROTL64(hash64[3], 49) ^ hash64[6];
hash64[0] += hash64[5];
hash64[5] = ROTL64(hash64[5], 36) ^ hash64[0];
hash64[2] += hash64[7];
hash64[7] = ROTL64(hash64[7], 39) ^ hash64[2];
hash64[6] += hash64[1];
hash64[1] = ROTL64(hash64[1], 44) ^ hash64[6];
hash64[0] += hash64[7];
hash64[7] = ROTL64(hash64[7], 9) ^ hash64[0];
hash64[2] += hash64[5];
hash64[5] = ROTL64(hash64[5], 54) ^ hash64[2];
hash64[4] += hash64[3];
hash64[3] = ROTL64(hash64[3], 56) ^ hash64[4];
hash64[0] = (hash64[0] + skein_h8);
hash64[1] = (hash64[1] + h0);
hash64[2] = (hash64[2] + h1);
hash64[3] = (hash64[3] + h2);
hash64[4] = (hash64[4] + h3);
hash64[5] = (hash64[5] + h4 + 0xff00000000000008ULL);
hash64[6] = (hash64[6] + h5 + 8ULL);
hash64[7] = (hash64[7] + h6 + (UINT64)17);
hash64[0] += hash64[1];
hash64[1] = ROTL64(hash64[1], 39) ^ hash64[0];
hash64[2] += hash64[3];
hash64[3] = ROTL64(hash64[3], 30) ^ hash64[2];
hash64[4] += hash64[5];
hash64[5] = ROTL64(hash64[5], 34) ^ hash64[4];
hash64[6] += hash64[7];
hash64[7] = ROTL64(hash64[7], 24) ^ hash64[6];
hash64[2] += hash64[1];
hash64[1] = ROTL64(hash64[1], 13) ^ hash64[2];
hash64[4] += hash64[7];
hash64[7] = ROTL64(hash64[7], 50) ^ hash64[4];
hash64[6] += hash64[5];
hash64[5] = ROTL64(hash64[5], 10) ^ hash64[6];
hash64[0] += hash64[3];
hash64[3] = ROTL64(hash64[3], 17) ^ hash64[0];
hash64[4] += hash64[1];
hash64[1] = ROTL64(hash64[1], 25) ^ hash64[4];
hash64[6] += hash64[3];
hash64[3] = ROTL64(hash64[3], 29) ^ hash64[6];
hash64[0] += hash64[5];
hash64[5] = ROTL64(hash64[5], 39) ^ hash64[0];
hash64[2] += hash64[7];
hash64[7] = ROTL64(hash64[7], 43) ^ hash64[2];
hash64[6] += hash64[1];
hash64[1] = ROTL64(hash64[1], 8) ^ hash64[6];
hash64[0] += hash64[7];
hash64[7] = ROTL64(hash64[7], 35) ^ hash64[0];
hash64[2] += hash64[5];
hash64[5] = ROTL64(hash64[5], 56) ^ hash64[2];
hash64[4] += hash64[3];
hash64[3] = ROTL64(hash64[3], 22) ^ hash64[4];

hash64[0] = (hash64[0] + h0);
hash64[1] = (hash64[1] + h1);
hash64[2] = (hash64[2] + h2);
hash64[3] = (hash64[3] + h3);
hash64[4] = (hash64[4] + h4);
hash64[5] = (hash64[5] + h5 + 8ULL);
hash64[6] = (hash64[6] + h6 + 0xff00000000000000ULL);
hash64[7] = (hash64[7] + h7 + (UINT64)18);

#undef h0
#undef h1
#undef h2
#undef h3
#undef h4
#undef h5
#undef h6
#undef h7

Of course I gave you bad advice. Good one is way out of your price range.
smolen
Hero Member
*****
Offline Offline

Activity: 525


View Profile
October 22, 2014, 01:47:45 AM
 #307

keccak

Of course I gave you bad advice. Good one is way out of your price range.
smolen
Hero Member
*****
Offline Offline

Activity: 525


View Profile
October 22, 2014, 01:53:30 AM
 #308

JH
part 1
part 2
part 3

Of course I gave you bad advice. Good one is way out of your price range.
smolen
Hero Member
*****
Offline Offline

Activity: 525


View Profile
April 12, 2015, 04:58:34 AM
 #309

Archiving old announcement
I finally got rid from the last pieces of GPL'ed code in my own miner and can now release it to the public. This miner is not free, a royalty of 1/8 (12.5%) is deducted from every mined block. (Coinbase transaction have 2 outputs, so I get my fee at exactly the same moment you'll get your coins).

Download link:https://mega.co.nz/#!QMMEFBYY!AgH4OGrKaRHkRjiVfVXXzxBHbTIlgdD5o3ak2VFuU78

Edit quarkcoin.conf (or Offering.conf, or securecoin.conf) file of your wallet to enable solo-mining, put your own username and password there:
listen=1
rpcallowip=127.0.0.1
rpcuser=username
rpcpassword=password
rpcport=8772
server=1

Edit sm.cmd from downloaded archive, put your own username, password and wallet address there:
smelter -o http://127.0.0.1:8772 -u username -p password -a QNiGvoYctyMwzV1ZjNbjhEoKdQVzFKsmVw

This is pre-alpha software, expect all kinds of bugs to be found, don't hesitate to report it here!
NVidia and old/rare AMD cards are not supported. Please, give me some time to iron out bugs Smiley

Of course I gave you bad advice. Good one is way out of your price range.
smolen
Hero Member
*****
Offline Offline

Activity: 525


View Profile
April 12, 2015, 05:08:53 AM
 #310

New public version, now it's Smelter for WhirlpoolX. Closed-sourced, buggy as hell, Windows-only, Tahiti (R9 280x) only, Stratum-only - but free.

Of course I gave you bad advice. Good one is way out of your price range.
grizscom
Sr. Member
****
Offline Offline

Activity: 248


View Profile WWW
April 12, 2015, 05:14:23 AM
 #311

And what is about  linux version?

http://ethereumpool.co/ - Stable, fair & transparent Ethereum mining pool
smolen
Hero Member
*****
Offline Offline

Activity: 525


View Profile
April 12, 2015, 05:17:27 AM
 #312

And what is about  linux version?
I'm going to release it, but later. Paranoid about "modified build process" clause in one of licenses in the toolchain, so it's time to try LLVM.

Of course I gave you bad advice. Good one is way out of your price range.
smolen
Hero Member
*****
Offline Offline

Activity: 525


View Profile
April 14, 2015, 10:50:58 AM
 #313

Getting Stratum work. Nicehash changes work and rises difficulty from 1/256 to 10.24, couple of stale shares slip to the server. The right thing to do is to follow protocol specification and start enforcing new work and difficulty only after mining.notify, but at such rates server may ban miner.

Code:
1:0 A:1464 R:22 HW:0 Speed: 519.26MH/s 5s: 519.67MH/s
STRATUM: mining.set_extranonce: new ExtraNonce1=48001aa4eb new size of ExtraNonce2=3
STRATUM: mining.set_difficulty: 0.003906
STRATUM: mining.notify
1:0 A:1566 R:22 HW:0 Speed: 519.26MH/s 5s: 520.09MH/s
1:0 A:1734 R:22 HW:0 Speed: 519.27MH/s 5s: 520.30MH/s
STRATUM: mining.set_extranonce: new ExtraNonce1=77ff7c94a8 new size of ExtraNonce2=3
STRATUM: mining.set_difficulty: 10.24
STRATUM: mining.notify
STRATUM: Share rejected (Error code 21, Job not found.)
STRATUM: Share rejected (Error code 21, Job not found.)
STRATUM: Share rejected (Error code 21, Job not found.)
1:0 A:1735 R:25 HW:0 Speed: 519.27MH/s 5s: 519.88MH/s

Of course I gave you bad advice. Good one is way out of your price range.
Wolf0
Legendary
*
Offline Offline

Activity: 1694


Miner Developer


View Profile
April 14, 2015, 02:49:44 PM
 #314

Getting Stratum work. Nicehash changes work and rises difficulty from 1/256 to 10.24, couple of stale shares slip to the server. The right thing to do is to follow protocol specification and start enforcing new work and difficulty only after mining.notify, but at such rates server may ban miner.

Code:
1:0 A:1464 R:22 HW:0 Speed: 519.26MH/s 5s: 519.67MH/s
STRATUM: mining.set_extranonce: new ExtraNonce1=48001aa4eb new size of ExtraNonce2=3
STRATUM: mining.set_difficulty: 0.003906
STRATUM: mining.notify
1:0 A:1566 R:22 HW:0 Speed: 519.26MH/s 5s: 520.09MH/s
1:0 A:1734 R:22 HW:0 Speed: 519.27MH/s 5s: 520.30MH/s
STRATUM: mining.set_extranonce: new ExtraNonce1=77ff7c94a8 new size of ExtraNonce2=3
STRATUM: mining.set_difficulty: 10.24
STRATUM: mining.notify
STRATUM: Share rejected (Error code 21, Job not found.)
STRATUM: Share rejected (Error code 21, Job not found.)
STRATUM: Share rejected (Error code 21, Job not found.)
1:0 A:1735 R:25 HW:0 Speed: 519.27MH/s 5s: 519.88MH/s

You were enforcing it immediately? I'm storing the new difficulty in another variable, then setting a flag if the current diff is outdated - the mining.notify handler checks the flag, and if it's set, copies the new diff from its storage space to the main diff variable, then clears the flag. I also only enforce a miner thread restart if the pool server tells me to clear the jobs.

Code:
Donations: BTC: 1WoLFdwcfNEg64fTYsX1P25KUzzSjtEZC -- XMR: 45SLUTzk7UXYHmzJ7bFN6FPfzTusdUVAZjPRgmEDw7G3SeimWM2kCdnDQXwDBYGUWaBtZNgjYtEYA22aMQT4t8KfU3vHLHG
smolen
Hero Member
*****
Offline Offline

Activity: 525


View Profile
April 14, 2015, 08:55:30 PM
 #315

You were enforcing it immediately? I'm storing the new difficulty in another variable, then setting a flag if the current diff is outdated - the mining.notify handler checks the flag, and if it's set, copies the new diff from its storage space to the main diff variable, then clears the flag. I also only enforce a miner thread restart if the pool server tells me to clear the jobs.
I did postponed diff/job update, as spec says, then tried instant job change, without waiting for mining.notify, now it's time to revert back, do the build and let everyone meet the bugs Smiley
Another issue with Nicehash - sometime response to mining.submit is delayed, sometime (rarely) there is no response at all. Every request has to be stored and checked for timeouts.

Of course I gave you bad advice. Good one is way out of your price range.
smolen
Hero Member
*****
Offline Offline

Activity: 525


View Profile
April 15, 2015, 01:05:37 AM
 #316

Next build is out, with more work on Stratum.
Tested only with single 280x, but those cards should work:
   Juniper (6770, 6750, 5750, 5770)
   Pitcairn (7850, 7870, Curacao: 265, 270, 270X)
   Tahiti (7870, 7950, 7970, 280, 290X)
   Tonga (285)

Of course I gave you bad advice. Good one is way out of your price range.
JuanHungLo
Hero Member
*****
Offline Offline

Activity: 757


I don't always drink...


View Profile
April 15, 2015, 01:28:18 PM
 #317

Next build is out, with more work on Stratum.
Tested only with single 280x, but those cards should work:
   Juniper (6770, 6750, 5750, 5770)
   Pitcairn (7850, 7870, Curacao: 265, 270, 270X)
   Tahiti (7870, 7950, 7970, 280, 290X)
   Tonga (285)


Thanks for your efforts.  What command line settings work for 280x please?

I'm glad I'm not judgmental like all you smug, superficial idiots
smolen
Hero Member
*****
Offline Offline

Activity: 525


View Profile
April 15, 2015, 05:03:52 PM
 #318

Thanks for your efforts.  What command line settings work for 280x please?
Oh, yes, detailed announcement and readme are missing, mea culpa

There isn't much to be configured. User can play with worksize (64, 128 and 256) and number of threads. To flood the screen with tons of diagnostics use --debug. Before claiming that I violated GPL, take a look at 'smelter --copyrights' output. To exit, use control-C or type any letter and then ENTER.
Intensity options is missing, it was removed to protect users from one obscure driver bug, with too high value PC is dead hang. There is no way yet to select GPU to run or set clock, those options are in my TODO list.

Typical command line looks like this, just change pool address, user name and password. 280x runs well with 4 threads and worksize 64, I hope users will share best settings for other cards.
Code:
smelter -o stratum+tcp://vnl.suprnova.cc:1111 -u user -p pass -g 4 -W 64

Full list of options:
Code:
Program options:
  -? [ --help ]           This help message
  --copyrights            Print libraries copyright message(s)
  -o [ --url ] arg        pool url (ex: -o http://pool:port )
  -u [ --user ] arg       Pool username
  -p [ --pass ] arg       Pool password
  -w [ --worksize ] arg   Worksize
  -g [ --gputhreads ] arg Threads per GPU
  -D [ --debug ]          Enable debug output

Of course I gave you bad advice. Good one is way out of your price range.
Bombadil
Hero Member
*****
Offline Offline

Activity: 644



View Profile
April 16, 2015, 07:13:14 AM
 #319

Intensity options is missing, it was removed to protect users from one obscure driver bug, with too high value PC is dead hang. There is no way yet to select GPU to run or set clock, those options are in my TODO list.

You aren't used to cudamining, I guess Tongue It's regular beef here that the system needs a complete reboot if you're playing with intensities and overclock Cheesy
Part of the fun, isn't it? ^^" (Sucks too, my bitcoin blockchain gets corrupted that way if I'm running it)
smolen
Hero Member
*****
Offline Offline

Activity: 525


View Profile
April 16, 2015, 07:25:52 AM
 #320

Intensity options is missing, it was removed to protect users from one obscure driver bug, with too high value PC is dead hang. There is no way yet to select GPU to run or set clock, those options are in my TODO list.

You aren't used to cudamining, I guess Tongue It's regular beef here that the system needs a complete reboot if you're playing with intensities and overclock Cheesy
Part of the fun, isn't it? ^^" (Sucks too, my bitcoin blockchain gets corrupted that way if I'm running it)
Looks like driver can't handle more than 2^32 scheduled workitems at once - no matter how splitted between threads and kernels. Not a pleasure to play with it on work PC, have I backups or not Smiley

Of course I gave you bad advice. Good one is way out of your price range.
Pages: « 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 [16] 17 18 19 »  All
  Print  
 
Jump to:  

Sponsored by , a Bitcoin-accepting VPN.
Powered by MySQL Powered by PHP Powered by SMF 1.1.19 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!