GOSTcoin support for ccminer CUDA miner project, compatible with most nvidia cards
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

1359 lines
68 KiB

/**
* Whirlpool for X15
* Adaptation from different sources (cpuminer-multi + sgminer)
* tpruvot@github
*/
#include <stdio.h>
#include <stdint.h>
#include <cuda_runtime.h>
#define NULLTEST 0
extern cudaError_t MyStreamSynchronize(cudaStream_t stream, int situation, int thr_id);
#define SPH_64 (1)
#define SPH_SMALL_FOOTPRINT_WHIRLPOOL (1)
#define __constant
#define SPH_C64(x) ((uint64_t)(x ## ULL))
#define SPH_T64(x) ((x) & SPH_C64(0xFFFFFFFFFFFFFFFF))
#define SPH_ROTL64(x, n) SPH_T64(((x) << (n)) | ((x) >> (64 - (n))))
#define SPH_ROTR64(x, n) SPH_ROTL64(x, (64 - (n)))
#define SWAB32(x) ( __byte_perm(x, x, 0x0123) )
#if __CUDA_ARCH__ < 350
// Kepler (Compute 3.0)
#define ROTL32(x, n) SPH_T32(((x) << (n)) | ((x) >> (32 - (n))))
#else
// Kepler (Compute 3.5)
#define ROTL32(x, n) __funnelshift_l( (x), (x), (n) )
#endif
#if 0
static __constant__ uint64_t d_plain_T0[256];
#if !SPH_SMALL_FOOTPRINT_WHIRLPOOL
static __constant__ uint64_t d_plain_T1[256];
static __constant__ uint64_t d_plain_T2[256];
static __constant__ uint64_t d_plain_T3[256];
static __constant__ uint64_t d_plain_T4[256];
static __constant__ uint64_t d_plain_T5[256];
static __constant__ uint64_t d_plain_T6[256];
static __constant__ uint64_t d_plain_T7[256];
#endif
static __constant__ uint64_t d_plain_RC[10];
#endif
/* $Id: whirlpool.c 227 2010-06-16 17:28:38Z tp $ */
/*
* WHIRLPOOL implementation.
*
* Internally, we use little-endian convention, on the assumption that
* architectures which favour big-endian encoding are:
* 1. rarer
* 2. in decreasing numbers
* 3. able to decode little-endian data efficiently anyway
*
* The most common big-endian architecture is Sparc, and Ultrasparc CPU
* include special opcodes to perform little-endian accesses, which we use
* (see sph_types.h). Most modern CPU designs can work with both endianness
* and architecture designer now favour little-endian (basically, x86 has
* won the endianness war).
*
* TODO: implement a 32-bit version. Not only such a version would be handy
* for non-64-bit-able architectures, but it may also use smaller tables,
* at the expense of more lookups and XORs.
*
* ==========================(LICENSE BEGIN)============================
*
* Copyright (c) 2007-2010 Projet RNRT SAPHIR
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
* ===========================(LICENSE END)=============================
*
* @author Thomas Pornin <thomas.pornin@cryptolog.com>
*/
#if SPH_64
/* ====================================================================== */
/*
* Constants for plain WHIRLPOOL (current version).
*/
__device__ static const uint64_t plain_T0[256] = {
SPH_C64(0xD83078C018601818), SPH_C64(0x2646AF05238C2323),
SPH_C64(0xB891F97EC63FC6C6), SPH_C64(0xFBCD6F13E887E8E8),
SPH_C64(0xCB13A14C87268787), SPH_C64(0x116D62A9B8DAB8B8),
SPH_C64(0x0902050801040101), SPH_C64(0x0D9E6E424F214F4F),
SPH_C64(0x9B6CEEAD36D83636), SPH_C64(0xFF510459A6A2A6A6),
SPH_C64(0x0CB9BDDED26FD2D2), SPH_C64(0x0EF706FBF5F3F5F5),
SPH_C64(0x96F280EF79F97979), SPH_C64(0x30DECE5F6FA16F6F),
SPH_C64(0x6D3FEFFC917E9191), SPH_C64(0xF8A407AA52555252),
SPH_C64(0x47C0FD27609D6060), SPH_C64(0x35657689BCCABCBC),
SPH_C64(0x372BCDAC9B569B9B), SPH_C64(0x8A018C048E028E8E),
SPH_C64(0xD25B1571A3B6A3A3), SPH_C64(0x6C183C600C300C0C),
SPH_C64(0x84F68AFF7BF17B7B), SPH_C64(0x806AE1B535D43535),
SPH_C64(0xF53A69E81D741D1D), SPH_C64(0xB3DD4753E0A7E0E0),
SPH_C64(0x21B3ACF6D77BD7D7), SPH_C64(0x9C99ED5EC22FC2C2),
SPH_C64(0x435C966D2EB82E2E), SPH_C64(0x29967A624B314B4B),
SPH_C64(0x5DE121A3FEDFFEFE), SPH_C64(0xD5AE168257415757),
SPH_C64(0xBD2A41A815541515), SPH_C64(0xE8EEB69F77C17777),
SPH_C64(0x926EEBA537DC3737), SPH_C64(0x9ED7567BE5B3E5E5),
SPH_C64(0x1323D98C9F469F9F), SPH_C64(0x23FD17D3F0E7F0F0),
SPH_C64(0x20947F6A4A354A4A), SPH_C64(0x44A9959EDA4FDADA),
SPH_C64(0xA2B025FA587D5858), SPH_C64(0xCF8FCA06C903C9C9),
SPH_C64(0x7C528D5529A42929), SPH_C64(0x5A1422500A280A0A),
SPH_C64(0x507F4FE1B1FEB1B1), SPH_C64(0xC95D1A69A0BAA0A0),
SPH_C64(0x14D6DA7F6BB16B6B), SPH_C64(0xD917AB5C852E8585),
SPH_C64(0x3C677381BDCEBDBD), SPH_C64(0x8FBA34D25D695D5D),
SPH_C64(0x9020508010401010), SPH_C64(0x07F503F3F4F7F4F4),
SPH_C64(0xDD8BC016CB0BCBCB), SPH_C64(0xD37CC6ED3EF83E3E),
SPH_C64(0x2D0A112805140505), SPH_C64(0x78CEE61F67816767),
SPH_C64(0x97D55373E4B7E4E4), SPH_C64(0x024EBB25279C2727),
SPH_C64(0x7382583241194141), SPH_C64(0xA70B9D2C8B168B8B),
SPH_C64(0xF6530151A7A6A7A7), SPH_C64(0xB2FA94CF7DE97D7D),
SPH_C64(0x4937FBDC956E9595), SPH_C64(0x56AD9F8ED847D8D8),
SPH_C64(0x70EB308BFBCBFBFB), SPH_C64(0xCDC17123EE9FEEEE),
SPH_C64(0xBBF891C77CED7C7C), SPH_C64(0x71CCE31766856666),
SPH_C64(0x7BA78EA6DD53DDDD), SPH_C64(0xAF2E4BB8175C1717),
SPH_C64(0x458E460247014747), SPH_C64(0x1A21DC849E429E9E),
SPH_C64(0xD489C51ECA0FCACA), SPH_C64(0x585A99752DB42D2D),
SPH_C64(0x2E637991BFC6BFBF), SPH_C64(0x3F0E1B38071C0707),
SPH_C64(0xAC472301AD8EADAD), SPH_C64(0xB0B42FEA5A755A5A),
SPH_C64(0xEF1BB56C83368383), SPH_C64(0xB666FF8533CC3333),
SPH_C64(0x5CC6F23F63916363), SPH_C64(0x12040A1002080202),
SPH_C64(0x93493839AA92AAAA), SPH_C64(0xDEE2A8AF71D97171),
SPH_C64(0xC68DCF0EC807C8C8), SPH_C64(0xD1327DC819641919),
SPH_C64(0x3B92707249394949), SPH_C64(0x5FAF9A86D943D9D9),
SPH_C64(0x31F91DC3F2EFF2F2), SPH_C64(0xA8DB484BE3ABE3E3),
SPH_C64(0xB9B62AE25B715B5B), SPH_C64(0xBC0D9234881A8888),
SPH_C64(0x3E29C8A49A529A9A), SPH_C64(0x0B4CBE2D26982626),
SPH_C64(0xBF64FA8D32C83232), SPH_C64(0x597D4AE9B0FAB0B0),
SPH_C64(0xF2CF6A1BE983E9E9), SPH_C64(0x771E33780F3C0F0F),
SPH_C64(0x33B7A6E6D573D5D5), SPH_C64(0xF41DBA74803A8080),
SPH_C64(0x27617C99BEC2BEBE), SPH_C64(0xEB87DE26CD13CDCD),
SPH_C64(0x8968E4BD34D03434), SPH_C64(0x3290757A483D4848),
SPH_C64(0x54E324ABFFDBFFFF), SPH_C64(0x8DF48FF77AF57A7A),
SPH_C64(0x643DEAF4907A9090), SPH_C64(0x9DBE3EC25F615F5F),
SPH_C64(0x3D40A01D20802020), SPH_C64(0x0FD0D56768BD6868),
SPH_C64(0xCA3472D01A681A1A), SPH_C64(0xB7412C19AE82AEAE),
SPH_C64(0x7D755EC9B4EAB4B4), SPH_C64(0xCEA8199A544D5454),
SPH_C64(0x7F3BE5EC93769393), SPH_C64(0x2F44AA0D22882222),
SPH_C64(0x63C8E907648D6464), SPH_C64(0x2AFF12DBF1E3F1F1),
SPH_C64(0xCCE6A2BF73D17373), SPH_C64(0x82245A9012481212),
SPH_C64(0x7A805D3A401D4040), SPH_C64(0x4810284008200808),
SPH_C64(0x959BE856C32BC3C3), SPH_C64(0xDFC57B33EC97ECEC),
SPH_C64(0x4DAB9096DB4BDBDB), SPH_C64(0xC05F1F61A1BEA1A1),
SPH_C64(0x9107831C8D0E8D8D), SPH_C64(0xC87AC9F53DF43D3D),
SPH_C64(0x5B33F1CC97669797), SPH_C64(0x0000000000000000),
SPH_C64(0xF983D436CF1BCFCF), SPH_C64(0x6E5687452BAC2B2B),
SPH_C64(0xE1ECB39776C57676), SPH_C64(0xE619B06482328282),
SPH_C64(0x28B1A9FED67FD6D6), SPH_C64(0xC33677D81B6C1B1B),
SPH_C64(0x74775BC1B5EEB5B5), SPH_C64(0xBE432911AF86AFAF),
SPH_C64(0x1DD4DF776AB56A6A), SPH_C64(0xEAA00DBA505D5050),
SPH_C64(0x578A4C1245094545), SPH_C64(0x38FB18CBF3EBF3F3),
SPH_C64(0xAD60F09D30C03030), SPH_C64(0xC4C3742BEF9BEFEF),
SPH_C64(0xDA7EC3E53FFC3F3F), SPH_C64(0xC7AA1C9255495555),
SPH_C64(0xDB591079A2B2A2A2), SPH_C64(0xE9C96503EA8FEAEA),
SPH_C64(0x6ACAEC0F65896565), SPH_C64(0x036968B9BAD2BABA),
SPH_C64(0x4A5E93652FBC2F2F), SPH_C64(0x8E9DE74EC027C0C0),
SPH_C64(0x60A181BEDE5FDEDE), SPH_C64(0xFC386CE01C701C1C),
SPH_C64(0x46E72EBBFDD3FDFD), SPH_C64(0x1F9A64524D294D4D),
SPH_C64(0x7639E0E492729292), SPH_C64(0xFAEABC8F75C97575),
SPH_C64(0x360C1E3006180606), SPH_C64(0xAE0998248A128A8A),
SPH_C64(0x4B7940F9B2F2B2B2), SPH_C64(0x85D15963E6BFE6E6),
SPH_C64(0x7E1C36700E380E0E), SPH_C64(0xE73E63F81F7C1F1F),
SPH_C64(0x55C4F73762956262), SPH_C64(0x3AB5A3EED477D4D4),
SPH_C64(0x814D3229A89AA8A8), SPH_C64(0x5231F4C496629696),
SPH_C64(0x62EF3A9BF9C3F9F9), SPH_C64(0xA397F666C533C5C5),
SPH_C64(0x104AB13525942525), SPH_C64(0xABB220F259795959),
SPH_C64(0xD015AE54842A8484), SPH_C64(0xC5E4A7B772D57272),
SPH_C64(0xEC72DDD539E43939), SPH_C64(0x1698615A4C2D4C4C),
SPH_C64(0x94BC3BCA5E655E5E), SPH_C64(0x9FF085E778FD7878),
SPH_C64(0xE570D8DD38E03838), SPH_C64(0x980586148C0A8C8C),
SPH_C64(0x17BFB2C6D163D1D1), SPH_C64(0xE4570B41A5AEA5A5),
SPH_C64(0xA1D94D43E2AFE2E2), SPH_C64(0x4EC2F82F61996161),
SPH_C64(0x427B45F1B3F6B3B3), SPH_C64(0x3442A51521842121),
SPH_C64(0x0825D6949C4A9C9C), SPH_C64(0xEE3C66F01E781E1E),
SPH_C64(0x6186522243114343), SPH_C64(0xB193FC76C73BC7C7),
SPH_C64(0x4FE52BB3FCD7FCFC), SPH_C64(0x2408142004100404),
SPH_C64(0xE3A208B251595151), SPH_C64(0x252FC7BC995E9999),
SPH_C64(0x22DAC44F6DA96D6D), SPH_C64(0x651A39680D340D0D),
SPH_C64(0x79E93583FACFFAFA), SPH_C64(0x69A384B6DF5BDFDF),
SPH_C64(0xA9FC9BD77EE57E7E), SPH_C64(0x1948B43D24902424),
SPH_C64(0xFE76D7C53BEC3B3B), SPH_C64(0x9A4B3D31AB96ABAB),
SPH_C64(0xF081D13ECE1FCECE), SPH_C64(0x9922558811441111),
SPH_C64(0x8303890C8F068F8F), SPH_C64(0x049C6B4A4E254E4E),
SPH_C64(0x667351D1B7E6B7B7), SPH_C64(0xE0CB600BEB8BEBEB),
SPH_C64(0xC178CCFD3CF03C3C), SPH_C64(0xFD1FBF7C813E8181),
SPH_C64(0x4035FED4946A9494), SPH_C64(0x1CF30CEBF7FBF7F7),
SPH_C64(0x186F67A1B9DEB9B9), SPH_C64(0x8B265F98134C1313),
SPH_C64(0x51589C7D2CB02C2C), SPH_C64(0x05BBB8D6D36BD3D3),
SPH_C64(0x8CD35C6BE7BBE7E7), SPH_C64(0x39DCCB576EA56E6E),
SPH_C64(0xAA95F36EC437C4C4), SPH_C64(0x1B060F18030C0303),
SPH_C64(0xDCAC138A56455656), SPH_C64(0x5E88491A440D4444),
SPH_C64(0xA0FE9EDF7FE17F7F), SPH_C64(0x884F3721A99EA9A9),
SPH_C64(0x6754824D2AA82A2A), SPH_C64(0x0A6B6DB1BBD6BBBB),
SPH_C64(0x879FE246C123C1C1), SPH_C64(0xF1A602A253515353),
SPH_C64(0x72A58BAEDC57DCDC), SPH_C64(0x531627580B2C0B0B),
SPH_C64(0x0127D39C9D4E9D9D), SPH_C64(0x2BD8C1476CAD6C6C),
SPH_C64(0xA462F59531C43131), SPH_C64(0xF3E8B98774CD7474),
SPH_C64(0x15F109E3F6FFF6F6), SPH_C64(0x4C8C430A46054646),
SPH_C64(0xA5452609AC8AACAC), SPH_C64(0xB50F973C891E8989),
SPH_C64(0xB42844A014501414), SPH_C64(0xBADF425BE1A3E1E1),
SPH_C64(0xA62C4EB016581616), SPH_C64(0xF774D2CD3AE83A3A),
SPH_C64(0x06D2D06F69B96969), SPH_C64(0x41122D4809240909),
SPH_C64(0xD7E0ADA770DD7070), SPH_C64(0x6F7154D9B6E2B6B6),
SPH_C64(0x1EBDB7CED067D0D0), SPH_C64(0xD6C77E3BED93EDED),
SPH_C64(0xE285DB2ECC17CCCC), SPH_C64(0x6884572A42154242),
SPH_C64(0x2C2DC2B4985A9898), SPH_C64(0xED550E49A4AAA4A4),
SPH_C64(0x7550885D28A02828), SPH_C64(0x86B831DA5C6D5C5C),
SPH_C64(0x6BED3F93F8C7F8F8), SPH_C64(0xC211A44486228686)
};
#if !SPH_SMALL_FOOTPRINT_WHIRLPOOL
__device__ static const uint64_t plain_T1[256] = {
SPH_C64(0x3078C018601818D8), SPH_C64(0x46AF05238C232326),
SPH_C64(0x91F97EC63FC6C6B8), SPH_C64(0xCD6F13E887E8E8FB),
SPH_C64(0x13A14C87268787CB), SPH_C64(0x6D62A9B8DAB8B811),
SPH_C64(0x0205080104010109), SPH_C64(0x9E6E424F214F4F0D),
SPH_C64(0x6CEEAD36D836369B), SPH_C64(0x510459A6A2A6A6FF),
SPH_C64(0xB9BDDED26FD2D20C), SPH_C64(0xF706FBF5F3F5F50E),
SPH_C64(0xF280EF79F9797996), SPH_C64(0xDECE5F6FA16F6F30),
SPH_C64(0x3FEFFC917E91916D), SPH_C64(0xA407AA52555252F8),
SPH_C64(0xC0FD27609D606047), SPH_C64(0x657689BCCABCBC35),
SPH_C64(0x2BCDAC9B569B9B37), SPH_C64(0x018C048E028E8E8A),
SPH_C64(0x5B1571A3B6A3A3D2), SPH_C64(0x183C600C300C0C6C),
SPH_C64(0xF68AFF7BF17B7B84), SPH_C64(0x6AE1B535D4353580),
SPH_C64(0x3A69E81D741D1DF5), SPH_C64(0xDD4753E0A7E0E0B3),
SPH_C64(0xB3ACF6D77BD7D721), SPH_C64(0x99ED5EC22FC2C29C),
SPH_C64(0x5C966D2EB82E2E43), SPH_C64(0x967A624B314B4B29),
SPH_C64(0xE121A3FEDFFEFE5D), SPH_C64(0xAE168257415757D5),
SPH_C64(0x2A41A815541515BD), SPH_C64(0xEEB69F77C17777E8),
SPH_C64(0x6EEBA537DC373792), SPH_C64(0xD7567BE5B3E5E59E),
SPH_C64(0x23D98C9F469F9F13), SPH_C64(0xFD17D3F0E7F0F023),
SPH_C64(0x947F6A4A354A4A20), SPH_C64(0xA9959EDA4FDADA44),
SPH_C64(0xB025FA587D5858A2), SPH_C64(0x8FCA06C903C9C9CF),
SPH_C64(0x528D5529A429297C), SPH_C64(0x1422500A280A0A5A),
SPH_C64(0x7F4FE1B1FEB1B150), SPH_C64(0x5D1A69A0BAA0A0C9),
SPH_C64(0xD6DA7F6BB16B6B14), SPH_C64(0x17AB5C852E8585D9),
SPH_C64(0x677381BDCEBDBD3C), SPH_C64(0xBA34D25D695D5D8F),
SPH_C64(0x2050801040101090), SPH_C64(0xF503F3F4F7F4F407),
SPH_C64(0x8BC016CB0BCBCBDD), SPH_C64(0x7CC6ED3EF83E3ED3),
SPH_C64(0x0A1128051405052D), SPH_C64(0xCEE61F6781676778),
SPH_C64(0xD55373E4B7E4E497), SPH_C64(0x4EBB25279C272702),
SPH_C64(0x8258324119414173), SPH_C64(0x0B9D2C8B168B8BA7),
SPH_C64(0x530151A7A6A7A7F6), SPH_C64(0xFA94CF7DE97D7DB2),
SPH_C64(0x37FBDC956E959549), SPH_C64(0xAD9F8ED847D8D856),
SPH_C64(0xEB308BFBCBFBFB70), SPH_C64(0xC17123EE9FEEEECD),
SPH_C64(0xF891C77CED7C7CBB), SPH_C64(0xCCE3176685666671),
SPH_C64(0xA78EA6DD53DDDD7B), SPH_C64(0x2E4BB8175C1717AF),
SPH_C64(0x8E46024701474745), SPH_C64(0x21DC849E429E9E1A),
SPH_C64(0x89C51ECA0FCACAD4), SPH_C64(0x5A99752DB42D2D58),
SPH_C64(0x637991BFC6BFBF2E), SPH_C64(0x0E1B38071C07073F),
SPH_C64(0x472301AD8EADADAC), SPH_C64(0xB42FEA5A755A5AB0),
SPH_C64(0x1BB56C83368383EF), SPH_C64(0x66FF8533CC3333B6),
SPH_C64(0xC6F23F639163635C), SPH_C64(0x040A100208020212),
SPH_C64(0x493839AA92AAAA93), SPH_C64(0xE2A8AF71D97171DE),
SPH_C64(0x8DCF0EC807C8C8C6), SPH_C64(0x327DC819641919D1),
SPH_C64(0x927072493949493B), SPH_C64(0xAF9A86D943D9D95F),
SPH_C64(0xF91DC3F2EFF2F231), SPH_C64(0xDB484BE3ABE3E3A8),
SPH_C64(0xB62AE25B715B5BB9), SPH_C64(0x0D9234881A8888BC),
SPH_C64(0x29C8A49A529A9A3E), SPH_C64(0x4CBE2D269826260B),
SPH_C64(0x64FA8D32C83232BF), SPH_C64(0x7D4AE9B0FAB0B059),
SPH_C64(0xCF6A1BE983E9E9F2), SPH_C64(0x1E33780F3C0F0F77),
SPH_C64(0xB7A6E6D573D5D533), SPH_C64(0x1DBA74803A8080F4),
SPH_C64(0x617C99BEC2BEBE27), SPH_C64(0x87DE26CD13CDCDEB),
SPH_C64(0x68E4BD34D0343489), SPH_C64(0x90757A483D484832),
SPH_C64(0xE324ABFFDBFFFF54), SPH_C64(0xF48FF77AF57A7A8D),
SPH_C64(0x3DEAF4907A909064), SPH_C64(0xBE3EC25F615F5F9D),
SPH_C64(0x40A01D208020203D), SPH_C64(0xD0D56768BD68680F),
SPH_C64(0x3472D01A681A1ACA), SPH_C64(0x412C19AE82AEAEB7),
SPH_C64(0x755EC9B4EAB4B47D), SPH_C64(0xA8199A544D5454CE),
SPH_C64(0x3BE5EC937693937F), SPH_C64(0x44AA0D228822222F),
SPH_C64(0xC8E907648D646463), SPH_C64(0xFF12DBF1E3F1F12A),
SPH_C64(0xE6A2BF73D17373CC), SPH_C64(0x245A901248121282),
SPH_C64(0x805D3A401D40407A), SPH_C64(0x1028400820080848),
SPH_C64(0x9BE856C32BC3C395), SPH_C64(0xC57B33EC97ECECDF),
SPH_C64(0xAB9096DB4BDBDB4D), SPH_C64(0x5F1F61A1BEA1A1C0),
SPH_C64(0x07831C8D0E8D8D91), SPH_C64(0x7AC9F53DF43D3DC8),
SPH_C64(0x33F1CC976697975B), SPH_C64(0x0000000000000000),
SPH_C64(0x83D436CF1BCFCFF9), SPH_C64(0x5687452BAC2B2B6E),
SPH_C64(0xECB39776C57676E1), SPH_C64(0x19B06482328282E6),
SPH_C64(0xB1A9FED67FD6D628), SPH_C64(0x3677D81B6C1B1BC3),
SPH_C64(0x775BC1B5EEB5B574), SPH_C64(0x432911AF86AFAFBE),
SPH_C64(0xD4DF776AB56A6A1D), SPH_C64(0xA00DBA505D5050EA),
SPH_C64(0x8A4C124509454557), SPH_C64(0xFB18CBF3EBF3F338),
SPH_C64(0x60F09D30C03030AD), SPH_C64(0xC3742BEF9BEFEFC4),
SPH_C64(0x7EC3E53FFC3F3FDA), SPH_C64(0xAA1C9255495555C7),
SPH_C64(0x591079A2B2A2A2DB), SPH_C64(0xC96503EA8FEAEAE9),
SPH_C64(0xCAEC0F658965656A), SPH_C64(0x6968B9BAD2BABA03),
SPH_C64(0x5E93652FBC2F2F4A), SPH_C64(0x9DE74EC027C0C08E),
SPH_C64(0xA181BEDE5FDEDE60), SPH_C64(0x386CE01C701C1CFC),
SPH_C64(0xE72EBBFDD3FDFD46), SPH_C64(0x9A64524D294D4D1F),
SPH_C64(0x39E0E49272929276), SPH_C64(0xEABC8F75C97575FA),
SPH_C64(0x0C1E300618060636), SPH_C64(0x0998248A128A8AAE),
SPH_C64(0x7940F9B2F2B2B24B), SPH_C64(0xD15963E6BFE6E685),
SPH_C64(0x1C36700E380E0E7E), SPH_C64(0x3E63F81F7C1F1FE7),
SPH_C64(0xC4F7376295626255), SPH_C64(0xB5A3EED477D4D43A),
SPH_C64(0x4D3229A89AA8A881), SPH_C64(0x31F4C49662969652),
SPH_C64(0xEF3A9BF9C3F9F962), SPH_C64(0x97F666C533C5C5A3),
SPH_C64(0x4AB1352594252510), SPH_C64(0xB220F259795959AB),
SPH_C64(0x15AE54842A8484D0), SPH_C64(0xE4A7B772D57272C5),
SPH_C64(0x72DDD539E43939EC), SPH_C64(0x98615A4C2D4C4C16),
SPH_C64(0xBC3BCA5E655E5E94), SPH_C64(0xF085E778FD78789F),
SPH_C64(0x70D8DD38E03838E5), SPH_C64(0x0586148C0A8C8C98),
SPH_C64(0xBFB2C6D163D1D117), SPH_C64(0x570B41A5AEA5A5E4),
SPH_C64(0xD94D43E2AFE2E2A1), SPH_C64(0xC2F82F619961614E),
SPH_C64(0x7B45F1B3F6B3B342), SPH_C64(0x42A5152184212134),
SPH_C64(0x25D6949C4A9C9C08), SPH_C64(0x3C66F01E781E1EEE),
SPH_C64(0x8652224311434361), SPH_C64(0x93FC76C73BC7C7B1),
SPH_C64(0xE52BB3FCD7FCFC4F), SPH_C64(0x0814200410040424),
SPH_C64(0xA208B251595151E3), SPH_C64(0x2FC7BC995E999925),
SPH_C64(0xDAC44F6DA96D6D22), SPH_C64(0x1A39680D340D0D65),
SPH_C64(0xE93583FACFFAFA79), SPH_C64(0xA384B6DF5BDFDF69),
SPH_C64(0xFC9BD77EE57E7EA9), SPH_C64(0x48B43D2490242419),
SPH_C64(0x76D7C53BEC3B3BFE), SPH_C64(0x4B3D31AB96ABAB9A),
SPH_C64(0x81D13ECE1FCECEF0), SPH_C64(0x2255881144111199),
SPH_C64(0x03890C8F068F8F83), SPH_C64(0x9C6B4A4E254E4E04),
SPH_C64(0x7351D1B7E6B7B766), SPH_C64(0xCB600BEB8BEBEBE0),
SPH_C64(0x78CCFD3CF03C3CC1), SPH_C64(0x1FBF7C813E8181FD),
SPH_C64(0x35FED4946A949440), SPH_C64(0xF30CEBF7FBF7F71C),
SPH_C64(0x6F67A1B9DEB9B918), SPH_C64(0x265F98134C13138B),
SPH_C64(0x589C7D2CB02C2C51), SPH_C64(0xBBB8D6D36BD3D305),
SPH_C64(0xD35C6BE7BBE7E78C), SPH_C64(0xDCCB576EA56E6E39),
SPH_C64(0x95F36EC437C4C4AA), SPH_C64(0x060F18030C03031B),
SPH_C64(0xAC138A56455656DC), SPH_C64(0x88491A440D44445E),
SPH_C64(0xFE9EDF7FE17F7FA0), SPH_C64(0x4F3721A99EA9A988),
SPH_C64(0x54824D2AA82A2A67), SPH_C64(0x6B6DB1BBD6BBBB0A),
SPH_C64(0x9FE246C123C1C187), SPH_C64(0xA602A253515353F1),
SPH_C64(0xA58BAEDC57DCDC72), SPH_C64(0x1627580B2C0B0B53),
SPH_C64(0x27D39C9D4E9D9D01), SPH_C64(0xD8C1476CAD6C6C2B),
SPH_C64(0x62F59531C43131A4), SPH_C64(0xE8B98774CD7474F3),
SPH_C64(0xF109E3F6FFF6F615), SPH_C64(0x8C430A460546464C),
SPH_C64(0x452609AC8AACACA5), SPH_C64(0x0F973C891E8989B5),
SPH_C64(0x2844A014501414B4), SPH_C64(0xDF425BE1A3E1E1BA),
SPH_C64(0x2C4EB016581616A6), SPH_C64(0x74D2CD3AE83A3AF7),
SPH_C64(0xD2D06F69B9696906), SPH_C64(0x122D480924090941),
SPH_C64(0xE0ADA770DD7070D7), SPH_C64(0x7154D9B6E2B6B66F),
SPH_C64(0xBDB7CED067D0D01E), SPH_C64(0xC77E3BED93EDEDD6),
SPH_C64(0x85DB2ECC17CCCCE2), SPH_C64(0x84572A4215424268),
SPH_C64(0x2DC2B4985A98982C), SPH_C64(0x550E49A4AAA4A4ED),
SPH_C64(0x50885D28A0282875), SPH_C64(0xB831DA5C6D5C5C86),
SPH_C64(0xED3F93F8C7F8F86B), SPH_C64(0x11A44486228686C2)
};
__device__ static const uint64_t plain_T2[256] = {
SPH_C64(0x78C018601818D830), SPH_C64(0xAF05238C23232646),
SPH_C64(0xF97EC63FC6C6B891), SPH_C64(0x6F13E887E8E8FBCD),
SPH_C64(0xA14C87268787CB13), SPH_C64(0x62A9B8DAB8B8116D),
SPH_C64(0x0508010401010902), SPH_C64(0x6E424F214F4F0D9E),
SPH_C64(0xEEAD36D836369B6C), SPH_C64(0x0459A6A2A6A6FF51),
SPH_C64(0xBDDED26FD2D20CB9), SPH_C64(0x06FBF5F3F5F50EF7),
SPH_C64(0x80EF79F9797996F2), SPH_C64(0xCE5F6FA16F6F30DE),
SPH_C64(0xEFFC917E91916D3F), SPH_C64(0x07AA52555252F8A4),
SPH_C64(0xFD27609D606047C0), SPH_C64(0x7689BCCABCBC3565),
SPH_C64(0xCDAC9B569B9B372B), SPH_C64(0x8C048E028E8E8A01),
SPH_C64(0x1571A3B6A3A3D25B), SPH_C64(0x3C600C300C0C6C18),
SPH_C64(0x8AFF7BF17B7B84F6), SPH_C64(0xE1B535D43535806A),
SPH_C64(0x69E81D741D1DF53A), SPH_C64(0x4753E0A7E0E0B3DD),
SPH_C64(0xACF6D77BD7D721B3), SPH_C64(0xED5EC22FC2C29C99),
SPH_C64(0x966D2EB82E2E435C), SPH_C64(0x7A624B314B4B2996),
SPH_C64(0x21A3FEDFFEFE5DE1), SPH_C64(0x168257415757D5AE),
SPH_C64(0x41A815541515BD2A), SPH_C64(0xB69F77C17777E8EE),
SPH_C64(0xEBA537DC3737926E), SPH_C64(0x567BE5B3E5E59ED7),
SPH_C64(0xD98C9F469F9F1323), SPH_C64(0x17D3F0E7F0F023FD),
SPH_C64(0x7F6A4A354A4A2094), SPH_C64(0x959EDA4FDADA44A9),
SPH_C64(0x25FA587D5858A2B0), SPH_C64(0xCA06C903C9C9CF8F),
SPH_C64(0x8D5529A429297C52), SPH_C64(0x22500A280A0A5A14),
SPH_C64(0x4FE1B1FEB1B1507F), SPH_C64(0x1A69A0BAA0A0C95D),
SPH_C64(0xDA7F6BB16B6B14D6), SPH_C64(0xAB5C852E8585D917),
SPH_C64(0x7381BDCEBDBD3C67), SPH_C64(0x34D25D695D5D8FBA),
SPH_C64(0x5080104010109020), SPH_C64(0x03F3F4F7F4F407F5),
SPH_C64(0xC016CB0BCBCBDD8B), SPH_C64(0xC6ED3EF83E3ED37C),
SPH_C64(0x1128051405052D0A), SPH_C64(0xE61F6781676778CE),
SPH_C64(0x5373E4B7E4E497D5), SPH_C64(0xBB25279C2727024E),
SPH_C64(0x5832411941417382), SPH_C64(0x9D2C8B168B8BA70B),
SPH_C64(0x0151A7A6A7A7F653), SPH_C64(0x94CF7DE97D7DB2FA),
SPH_C64(0xFBDC956E95954937), SPH_C64(0x9F8ED847D8D856AD),
SPH_C64(0x308BFBCBFBFB70EB), SPH_C64(0x7123EE9FEEEECDC1),
SPH_C64(0x91C77CED7C7CBBF8), SPH_C64(0xE3176685666671CC),
SPH_C64(0x8EA6DD53DDDD7BA7), SPH_C64(0x4BB8175C1717AF2E),
SPH_C64(0x460247014747458E), SPH_C64(0xDC849E429E9E1A21),
SPH_C64(0xC51ECA0FCACAD489), SPH_C64(0x99752DB42D2D585A),
SPH_C64(0x7991BFC6BFBF2E63), SPH_C64(0x1B38071C07073F0E),
SPH_C64(0x2301AD8EADADAC47), SPH_C64(0x2FEA5A755A5AB0B4),
SPH_C64(0xB56C83368383EF1B), SPH_C64(0xFF8533CC3333B666),
SPH_C64(0xF23F639163635CC6), SPH_C64(0x0A10020802021204),
SPH_C64(0x3839AA92AAAA9349), SPH_C64(0xA8AF71D97171DEE2),
SPH_C64(0xCF0EC807C8C8C68D), SPH_C64(0x7DC819641919D132),
SPH_C64(0x7072493949493B92), SPH_C64(0x9A86D943D9D95FAF),
SPH_C64(0x1DC3F2EFF2F231F9), SPH_C64(0x484BE3ABE3E3A8DB),
SPH_C64(0x2AE25B715B5BB9B6), SPH_C64(0x9234881A8888BC0D),
SPH_C64(0xC8A49A529A9A3E29), SPH_C64(0xBE2D269826260B4C),
SPH_C64(0xFA8D32C83232BF64), SPH_C64(0x4AE9B0FAB0B0597D),
SPH_C64(0x6A1BE983E9E9F2CF), SPH_C64(0x33780F3C0F0F771E),
SPH_C64(0xA6E6D573D5D533B7), SPH_C64(0xBA74803A8080F41D),
SPH_C64(0x7C99BEC2BEBE2761), SPH_C64(0xDE26CD13CDCDEB87),
SPH_C64(0xE4BD34D034348968), SPH_C64(0x757A483D48483290),
SPH_C64(0x24ABFFDBFFFF54E3), SPH_C64(0x8FF77AF57A7A8DF4),
SPH_C64(0xEAF4907A9090643D), SPH_C64(0x3EC25F615F5F9DBE),
SPH_C64(0xA01D208020203D40), SPH_C64(0xD56768BD68680FD0),
SPH_C64(0x72D01A681A1ACA34), SPH_C64(0x2C19AE82AEAEB741),
SPH_C64(0x5EC9B4EAB4B47D75), SPH_C64(0x199A544D5454CEA8),
SPH_C64(0xE5EC937693937F3B), SPH_C64(0xAA0D228822222F44),
SPH_C64(0xE907648D646463C8), SPH_C64(0x12DBF1E3F1F12AFF),
SPH_C64(0xA2BF73D17373CCE6), SPH_C64(0x5A90124812128224),
SPH_C64(0x5D3A401D40407A80), SPH_C64(0x2840082008084810),
SPH_C64(0xE856C32BC3C3959B), SPH_C64(0x7B33EC97ECECDFC5),
SPH_C64(0x9096DB4BDBDB4DAB), SPH_C64(0x1F61A1BEA1A1C05F),
SPH_C64(0x831C8D0E8D8D9107), SPH_C64(0xC9F53DF43D3DC87A),
SPH_C64(0xF1CC976697975B33), SPH_C64(0x0000000000000000),
SPH_C64(0xD436CF1BCFCFF983), SPH_C64(0x87452BAC2B2B6E56),
SPH_C64(0xB39776C57676E1EC), SPH_C64(0xB06482328282E619),
SPH_C64(0xA9FED67FD6D628B1), SPH_C64(0x77D81B6C1B1BC336),
SPH_C64(0x5BC1B5EEB5B57477), SPH_C64(0x2911AF86AFAFBE43),
SPH_C64(0xDF776AB56A6A1DD4), SPH_C64(0x0DBA505D5050EAA0),
SPH_C64(0x4C1245094545578A), SPH_C64(0x18CBF3EBF3F338FB),
SPH_C64(0xF09D30C03030AD60), SPH_C64(0x742BEF9BEFEFC4C3),
SPH_C64(0xC3E53FFC3F3FDA7E), SPH_C64(0x1C9255495555C7AA),
SPH_C64(0x1079A2B2A2A2DB59), SPH_C64(0x6503EA8FEAEAE9C9),
SPH_C64(0xEC0F658965656ACA), SPH_C64(0x68B9BAD2BABA0369),
SPH_C64(0x93652FBC2F2F4A5E), SPH_C64(0xE74EC027C0C08E9D),
SPH_C64(0x81BEDE5FDEDE60A1), SPH_C64(0x6CE01C701C1CFC38),
SPH_C64(0x2EBBFDD3FDFD46E7), SPH_C64(0x64524D294D4D1F9A),
SPH_C64(0xE0E4927292927639), SPH_C64(0xBC8F75C97575FAEA),
SPH_C64(0x1E3006180606360C), SPH_C64(0x98248A128A8AAE09),
SPH_C64(0x40F9B2F2B2B24B79), SPH_C64(0x5963E6BFE6E685D1),
SPH_C64(0x36700E380E0E7E1C), SPH_C64(0x63F81F7C1F1FE73E),
SPH_C64(0xF7376295626255C4), SPH_C64(0xA3EED477D4D43AB5),
SPH_C64(0x3229A89AA8A8814D), SPH_C64(0xF4C4966296965231),
SPH_C64(0x3A9BF9C3F9F962EF), SPH_C64(0xF666C533C5C5A397),
SPH_C64(0xB13525942525104A), SPH_C64(0x20F259795959ABB2),
SPH_C64(0xAE54842A8484D015), SPH_C64(0xA7B772D57272C5E4),
SPH_C64(0xDDD539E43939EC72), SPH_C64(0x615A4C2D4C4C1698),
SPH_C64(0x3BCA5E655E5E94BC), SPH_C64(0x85E778FD78789FF0),
SPH_C64(0xD8DD38E03838E570), SPH_C64(0x86148C0A8C8C9805),
SPH_C64(0xB2C6D163D1D117BF), SPH_C64(0x0B41A5AEA5A5E457),
SPH_C64(0x4D43E2AFE2E2A1D9), SPH_C64(0xF82F619961614EC2),
SPH_C64(0x45F1B3F6B3B3427B), SPH_C64(0xA515218421213442),
SPH_C64(0xD6949C4A9C9C0825), SPH_C64(0x66F01E781E1EEE3C),
SPH_C64(0x5222431143436186), SPH_C64(0xFC76C73BC7C7B193),
SPH_C64(0x2BB3FCD7FCFC4FE5), SPH_C64(0x1420041004042408),
SPH_C64(0x08B251595151E3A2), SPH_C64(0xC7BC995E9999252F),
SPH_C64(0xC44F6DA96D6D22DA), SPH_C64(0x39680D340D0D651A),
SPH_C64(0x3583FACFFAFA79E9), SPH_C64(0x84B6DF5BDFDF69A3),
SPH_C64(0x9BD77EE57E7EA9FC), SPH_C64(0xB43D249024241948),
SPH_C64(0xD7C53BEC3B3BFE76), SPH_C64(0x3D31AB96ABAB9A4B),
SPH_C64(0xD13ECE1FCECEF081), SPH_C64(0x5588114411119922),
SPH_C64(0x890C8F068F8F8303), SPH_C64(0x6B4A4E254E4E049C),
SPH_C64(0x51D1B7E6B7B76673), SPH_C64(0x600BEB8BEBEBE0CB),
SPH_C64(0xCCFD3CF03C3CC178), SPH_C64(0xBF7C813E8181FD1F),
SPH_C64(0xFED4946A94944035), SPH_C64(0x0CEBF7FBF7F71CF3),
SPH_C64(0x67A1B9DEB9B9186F), SPH_C64(0x5F98134C13138B26),
SPH_C64(0x9C7D2CB02C2C5158), SPH_C64(0xB8D6D36BD3D305BB),
SPH_C64(0x5C6BE7BBE7E78CD3), SPH_C64(0xCB576EA56E6E39DC),
SPH_C64(0xF36EC437C4C4AA95), SPH_C64(0x0F18030C03031B06),
SPH_C64(0x138A56455656DCAC), SPH_C64(0x491A440D44445E88),
SPH_C64(0x9EDF7FE17F7FA0FE), SPH_C64(0x3721A99EA9A9884F),
SPH_C64(0x824D2AA82A2A6754), SPH_C64(0x6DB1BBD6BBBB0A6B),
SPH_C64(0xE246C123C1C1879F), SPH_C64(0x02A253515353F1A6),
SPH_C64(0x8BAEDC57DCDC72A5), SPH_C64(0x27580B2C0B0B5316),
SPH_C64(0xD39C9D4E9D9D0127), SPH_C64(0xC1476CAD6C6C2BD8),
SPH_C64(0xF59531C43131A462), SPH_C64(0xB98774CD7474F3E8),
SPH_C64(0x09E3F6FFF6F615F1), SPH_C64(0x430A460546464C8C),
SPH_C64(0x2609AC8AACACA545), SPH_C64(0x973C891E8989B50F),
SPH_C64(0x44A014501414B428), SPH_C64(0x425BE1A3E1E1BADF),
SPH_C64(0x4EB016581616A62C), SPH_C64(0xD2CD3AE83A3AF774),
SPH_C64(0xD06F69B9696906D2), SPH_C64(0x2D48092409094112),
SPH_C64(0xADA770DD7070D7E0), SPH_C64(0x54D9B6E2B6B66F71),
SPH_C64(0xB7CED067D0D01EBD), SPH_C64(0x7E3BED93EDEDD6C7),
SPH_C64(0xDB2ECC17CCCCE285), SPH_C64(0x572A421542426884),
SPH_C64(0xC2B4985A98982C2D), SPH_C64(0x0E49A4AAA4A4ED55),
SPH_C64(0x885D28A028287550), SPH_C64(0x31DA5C6D5C5C86B8),
SPH_C64(0x3F93F8C7F8F86BED), SPH_C64(0xA44486228686C211)
};
__device__ static const uint64_t plain_T3[256] = {
SPH_C64(0xC018601818D83078), SPH_C64(0x05238C23232646AF),
SPH_C64(0x7EC63FC6C6B891F9), SPH_C64(0x13E887E8E8FBCD6F),
SPH_C64(0x4C87268787CB13A1), SPH_C64(0xA9B8DAB8B8116D62),
SPH_C64(0x0801040101090205), SPH_C64(0x424F214F4F0D9E6E),
SPH_C64(0xAD36D836369B6CEE), SPH_C64(0x59A6A2A6A6FF5104),
SPH_C64(0xDED26FD2D20CB9BD), SPH_C64(0xFBF5F3F5F50EF706),
SPH_C64(0xEF79F9797996F280), SPH_C64(0x5F6FA16F6F30DECE),
SPH_C64(0xFC917E91916D3FEF), SPH_C64(0xAA52555252F8A407),
SPH_C64(0x27609D606047C0FD), SPH_C64(0x89BCCABCBC356576),
SPH_C64(0xAC9B569B9B372BCD), SPH_C64(0x048E028E8E8A018C),
SPH_C64(0x71A3B6A3A3D25B15), SPH_C64(0x600C300C0C6C183C),
SPH_C64(0xFF7BF17B7B84F68A), SPH_C64(0xB535D43535806AE1),
SPH_C64(0xE81D741D1DF53A69), SPH_C64(0x53E0A7E0E0B3DD47),
SPH_C64(0xF6D77BD7D721B3AC), SPH_C64(0x5EC22FC2C29C99ED),
SPH_C64(0x6D2EB82E2E435C96), SPH_C64(0x624B314B4B29967A),
SPH_C64(0xA3FEDFFEFE5DE121), SPH_C64(0x8257415757D5AE16),
SPH_C64(0xA815541515BD2A41), SPH_C64(0x9F77C17777E8EEB6),
SPH_C64(0xA537DC3737926EEB), SPH_C64(0x7BE5B3E5E59ED756),
SPH_C64(0x8C9F469F9F1323D9), SPH_C64(0xD3F0E7F0F023FD17),
SPH_C64(0x6A4A354A4A20947F), SPH_C64(0x9EDA4FDADA44A995),
SPH_C64(0xFA587D5858A2B025), SPH_C64(0x06C903C9C9CF8FCA),
SPH_C64(0x5529A429297C528D), SPH_C64(0x500A280A0A5A1422),
SPH_C64(0xE1B1FEB1B1507F4F), SPH_C64(0x69A0BAA0A0C95D1A),
SPH_C64(0x7F6BB16B6B14D6DA), SPH_C64(0x5C852E8585D917AB),
SPH_C64(0x81BDCEBDBD3C6773), SPH_C64(0xD25D695D5D8FBA34),
SPH_C64(0x8010401010902050), SPH_C64(0xF3F4F7F4F407F503),
SPH_C64(0x16CB0BCBCBDD8BC0), SPH_C64(0xED3EF83E3ED37CC6),
SPH_C64(0x28051405052D0A11), SPH_C64(0x1F6781676778CEE6),
SPH_C64(0x73E4B7E4E497D553), SPH_C64(0x25279C2727024EBB),
SPH_C64(0x3241194141738258), SPH_C64(0x2C8B168B8BA70B9D),
SPH_C64(0x51A7A6A7A7F65301), SPH_C64(0xCF7DE97D7DB2FA94),
SPH_C64(0xDC956E95954937FB), SPH_C64(0x8ED847D8D856AD9F),
SPH_C64(0x8BFBCBFBFB70EB30), SPH_C64(0x23EE9FEEEECDC171),
SPH_C64(0xC77CED7C7CBBF891), SPH_C64(0x176685666671CCE3),
SPH_C64(0xA6DD53DDDD7BA78E), SPH_C64(0xB8175C1717AF2E4B),
SPH_C64(0x0247014747458E46), SPH_C64(0x849E429E9E1A21DC),
SPH_C64(0x1ECA0FCACAD489C5), SPH_C64(0x752DB42D2D585A99),
SPH_C64(0x91BFC6BFBF2E6379), SPH_C64(0x38071C07073F0E1B),
SPH_C64(0x01AD8EADADAC4723), SPH_C64(0xEA5A755A5AB0B42F),
SPH_C64(0x6C83368383EF1BB5), SPH_C64(0x8533CC3333B666FF),
SPH_C64(0x3F639163635CC6F2), SPH_C64(0x100208020212040A),
SPH_C64(0x39AA92AAAA934938), SPH_C64(0xAF71D97171DEE2A8),
SPH_C64(0x0EC807C8C8C68DCF), SPH_C64(0xC819641919D1327D),
SPH_C64(0x72493949493B9270), SPH_C64(0x86D943D9D95FAF9A),
SPH_C64(0xC3F2EFF2F231F91D), SPH_C64(0x4BE3ABE3E3A8DB48),
SPH_C64(0xE25B715B5BB9B62A), SPH_C64(0x34881A8888BC0D92),
SPH_C64(0xA49A529A9A3E29C8), SPH_C64(0x2D269826260B4CBE),
SPH_C64(0x8D32C83232BF64FA), SPH_C64(0xE9B0FAB0B0597D4A),
SPH_C64(0x1BE983E9E9F2CF6A), SPH_C64(0x780F3C0F0F771E33),
SPH_C64(0xE6D573D5D533B7A6), SPH_C64(0x74803A8080F41DBA),
SPH_C64(0x99BEC2BEBE27617C), SPH_C64(0x26CD13CDCDEB87DE),
SPH_C64(0xBD34D034348968E4), SPH_C64(0x7A483D4848329075),
SPH_C64(0xABFFDBFFFF54E324), SPH_C64(0xF77AF57A7A8DF48F),
SPH_C64(0xF4907A9090643DEA), SPH_C64(0xC25F615F5F9DBE3E),
SPH_C64(0x1D208020203D40A0), SPH_C64(0x6768BD68680FD0D5),
SPH_C64(0xD01A681A1ACA3472), SPH_C64(0x19AE82AEAEB7412C),
SPH_C64(0xC9B4EAB4B47D755E), SPH_C64(0x9A544D5454CEA819),
SPH_C64(0xEC937693937F3BE5), SPH_C64(0x0D228822222F44AA),
SPH_C64(0x07648D646463C8E9), SPH_C64(0xDBF1E3F1F12AFF12),
SPH_C64(0xBF73D17373CCE6A2), SPH_C64(0x901248121282245A),
SPH_C64(0x3A401D40407A805D), SPH_C64(0x4008200808481028),
SPH_C64(0x56C32BC3C3959BE8), SPH_C64(0x33EC97ECECDFC57B),
SPH_C64(0x96DB4BDBDB4DAB90), SPH_C64(0x61A1BEA1A1C05F1F),
SPH_C64(0x1C8D0E8D8D910783), SPH_C64(0xF53DF43D3DC87AC9),
SPH_C64(0xCC976697975B33F1), SPH_C64(0x0000000000000000),
SPH_C64(0x36CF1BCFCFF983D4), SPH_C64(0x452BAC2B2B6E5687),
SPH_C64(0x9776C57676E1ECB3), SPH_C64(0x6482328282E619B0),
SPH_C64(0xFED67FD6D628B1A9), SPH_C64(0xD81B6C1B1BC33677),
SPH_C64(0xC1B5EEB5B574775B), SPH_C64(0x11AF86AFAFBE4329),
SPH_C64(0x776AB56A6A1DD4DF), SPH_C64(0xBA505D5050EAA00D),
SPH_C64(0x1245094545578A4C), SPH_C64(0xCBF3EBF3F338FB18),
SPH_C64(0x9D30C03030AD60F0), SPH_C64(0x2BEF9BEFEFC4C374),
SPH_C64(0xE53FFC3F3FDA7EC3), SPH_C64(0x9255495555C7AA1C),
SPH_C64(0x79A2B2A2A2DB5910), SPH_C64(0x03EA8FEAEAE9C965),
SPH_C64(0x0F658965656ACAEC), SPH_C64(0xB9BAD2BABA036968),
SPH_C64(0x652FBC2F2F4A5E93), SPH_C64(0x4EC027C0C08E9DE7),
SPH_C64(0xBEDE5FDEDE60A181), SPH_C64(0xE01C701C1CFC386C),
SPH_C64(0xBBFDD3FDFD46E72E), SPH_C64(0x524D294D4D1F9A64),
SPH_C64(0xE4927292927639E0), SPH_C64(0x8F75C97575FAEABC),
SPH_C64(0x3006180606360C1E), SPH_C64(0x248A128A8AAE0998),
SPH_C64(0xF9B2F2B2B24B7940), SPH_C64(0x63E6BFE6E685D159),
SPH_C64(0x700E380E0E7E1C36), SPH_C64(0xF81F7C1F1FE73E63),
SPH_C64(0x376295626255C4F7), SPH_C64(0xEED477D4D43AB5A3),
SPH_C64(0x29A89AA8A8814D32), SPH_C64(0xC4966296965231F4),
SPH_C64(0x9BF9C3F9F962EF3A), SPH_C64(0x66C533C5C5A397F6),
SPH_C64(0x3525942525104AB1), SPH_C64(0xF259795959ABB220),
SPH_C64(0x54842A8484D015AE), SPH_C64(0xB772D57272C5E4A7),
SPH_C64(0xD539E43939EC72DD), SPH_C64(0x5A4C2D4C4C169861),
SPH_C64(0xCA5E655E5E94BC3B), SPH_C64(0xE778FD78789FF085),
SPH_C64(0xDD38E03838E570D8), SPH_C64(0x148C0A8C8C980586),
SPH_C64(0xC6D163D1D117BFB2), SPH_C64(0x41A5AEA5A5E4570B),
SPH_C64(0x43E2AFE2E2A1D94D), SPH_C64(0x2F619961614EC2F8),
SPH_C64(0xF1B3F6B3B3427B45), SPH_C64(0x15218421213442A5),
SPH_C64(0x949C4A9C9C0825D6), SPH_C64(0xF01E781E1EEE3C66),
SPH_C64(0x2243114343618652), SPH_C64(0x76C73BC7C7B193FC),
SPH_C64(0xB3FCD7FCFC4FE52B), SPH_C64(0x2004100404240814),
SPH_C64(0xB251595151E3A208), SPH_C64(0xBC995E9999252FC7),
SPH_C64(0x4F6DA96D6D22DAC4), SPH_C64(0x680D340D0D651A39),
SPH_C64(0x83FACFFAFA79E935), SPH_C64(0xB6DF5BDFDF69A384),
SPH_C64(0xD77EE57E7EA9FC9B), SPH_C64(0x3D249024241948B4),
SPH_C64(0xC53BEC3B3BFE76D7), SPH_C64(0x31AB96ABAB9A4B3D),
SPH_C64(0x3ECE1FCECEF081D1), SPH_C64(0x8811441111992255),
SPH_C64(0x0C8F068F8F830389), SPH_C64(0x4A4E254E4E049C6B),
SPH_C64(0xD1B7E6B7B7667351), SPH_C64(0x0BEB8BEBEBE0CB60),
SPH_C64(0xFD3CF03C3CC178CC), SPH_C64(0x7C813E8181FD1FBF),
SPH_C64(0xD4946A94944035FE), SPH_C64(0xEBF7FBF7F71CF30C),
SPH_C64(0xA1B9DEB9B9186F67), SPH_C64(0x98134C13138B265F),
SPH_C64(0x7D2CB02C2C51589C), SPH_C64(0xD6D36BD3D305BBB8),
SPH_C64(0x6BE7BBE7E78CD35C), SPH_C64(0x576EA56E6E39DCCB),
SPH_C64(0x6EC437C4C4AA95F3), SPH_C64(0x18030C03031B060F),
SPH_C64(0x8A56455656DCAC13), SPH_C64(0x1A440D44445E8849),
SPH_C64(0xDF7FE17F7FA0FE9E), SPH_C64(0x21A99EA9A9884F37),
SPH_C64(0x4D2AA82A2A675482), SPH_C64(0xB1BBD6BBBB0A6B6D),
SPH_C64(0x46C123C1C1879FE2), SPH_C64(0xA253515353F1A602),
SPH_C64(0xAEDC57DCDC72A58B), SPH_C64(0x580B2C0B0B531627),
SPH_C64(0x9C9D4E9D9D0127D3), SPH_C64(0x476CAD6C6C2BD8C1),
SPH_C64(0x9531C43131A462F5), SPH_C64(0x8774CD7474F3E8B9),
SPH_C64(0xE3F6FFF6F615F109), SPH_C64(0x0A460546464C8C43),
SPH_C64(0x09AC8AACACA54526), SPH_C64(0x3C891E8989B50F97),
SPH_C64(0xA014501414B42844), SPH_C64(0x5BE1A3E1E1BADF42),
SPH_C64(0xB016581616A62C4E), SPH_C64(0xCD3AE83A3AF774D2),
SPH_C64(0x6F69B9696906D2D0), SPH_C64(0x480924090941122D),
SPH_C64(0xA770DD7070D7E0AD), SPH_C64(0xD9B6E2B6B66F7154),
SPH_C64(0xCED067D0D01EBDB7), SPH_C64(0x3BED93EDEDD6C77E),
SPH_C64(0x2ECC17CCCCE285DB), SPH_C64(0x2A42154242688457),
SPH_C64(0xB4985A98982C2DC2), SPH_C64(0x49A4AAA4A4ED550E),
SPH_C64(0x5D28A02828755088), SPH_C64(0xDA5C6D5C5C86B831),
SPH_C64(0x93F8C7F8F86BED3F), SPH_C64(0x4486228686C211A4)
};
__device__ static const uint64_t plain_T4[256] = {
SPH_C64(0x18601818D83078C0), SPH_C64(0x238C23232646AF05),
SPH_C64(0xC63FC6C6B891F97E), SPH_C64(0xE887E8E8FBCD6F13),
SPH_C64(0x87268787CB13A14C), SPH_C64(0xB8DAB8B8116D62A9),
SPH_C64(0x0104010109020508), SPH_C64(0x4F214F4F0D9E6E42),
SPH_C64(0x36D836369B6CEEAD), SPH_C64(0xA6A2A6A6FF510459),
SPH_C64(0xD26FD2D20CB9BDDE), SPH_C64(0xF5F3F5F50EF706FB),
SPH_C64(0x79F9797996F280EF), SPH_C64(0x6FA16F6F30DECE5F),
SPH_C64(0x917E91916D3FEFFC), SPH_C64(0x52555252F8A407AA),
SPH_C64(0x609D606047C0FD27), SPH_C64(0xBCCABCBC35657689),
SPH_C64(0x9B569B9B372BCDAC), SPH_C64(0x8E028E8E8A018C04),
SPH_C64(0xA3B6A3A3D25B1571), SPH_C64(0x0C300C0C6C183C60),
SPH_C64(0x7BF17B7B84F68AFF), SPH_C64(0x35D43535806AE1B5),
SPH_C64(0x1D741D1DF53A69E8), SPH_C64(0xE0A7E0E0B3DD4753),
SPH_C64(0xD77BD7D721B3ACF6), SPH_C64(0xC22FC2C29C99ED5E),
SPH_C64(0x2EB82E2E435C966D), SPH_C64(0x4B314B4B29967A62),
SPH_C64(0xFEDFFEFE5DE121A3), SPH_C64(0x57415757D5AE1682),
SPH_C64(0x15541515BD2A41A8), SPH_C64(0x77C17777E8EEB69F),
SPH_C64(0x37DC3737926EEBA5), SPH_C64(0xE5B3E5E59ED7567B),
SPH_C64(0x9F469F9F1323D98C), SPH_C64(0xF0E7F0F023FD17D3),
SPH_C64(0x4A354A4A20947F6A), SPH_C64(0xDA4FDADA44A9959E),
SPH_C64(0x587D5858A2B025FA), SPH_C64(0xC903C9C9CF8FCA06),
SPH_C64(0x29A429297C528D55), SPH_C64(0x0A280A0A5A142250),
SPH_C64(0xB1FEB1B1507F4FE1), SPH_C64(0xA0BAA0A0C95D1A69),
SPH_C64(0x6BB16B6B14D6DA7F), SPH_C64(0x852E8585D917AB5C),
SPH_C64(0xBDCEBDBD3C677381), SPH_C64(0x5D695D5D8FBA34D2),
SPH_C64(0x1040101090205080), SPH_C64(0xF4F7F4F407F503F3),
SPH_C64(0xCB0BCBCBDD8BC016), SPH_C64(0x3EF83E3ED37CC6ED),
SPH_C64(0x051405052D0A1128), SPH_C64(0x6781676778CEE61F),
SPH_C64(0xE4B7E4E497D55373), SPH_C64(0x279C2727024EBB25),
SPH_C64(0x4119414173825832), SPH_C64(0x8B168B8BA70B9D2C),
SPH_C64(0xA7A6A7A7F6530151), SPH_C64(0x7DE97D7DB2FA94CF),
SPH_C64(0x956E95954937FBDC), SPH_C64(0xD847D8D856AD9F8E),
SPH_C64(0xFBCBFBFB70EB308B), SPH_C64(0xEE9FEEEECDC17123),
SPH_C64(0x7CED7C7CBBF891C7), SPH_C64(0x6685666671CCE317),
SPH_C64(0xDD53DDDD7BA78EA6), SPH_C64(0x175C1717AF2E4BB8),
SPH_C64(0x47014747458E4602), SPH_C64(0x9E429E9E1A21DC84),
SPH_C64(0xCA0FCACAD489C51E), SPH_C64(0x2DB42D2D585A9975),
SPH_C64(0xBFC6BFBF2E637991), SPH_C64(0x071C07073F0E1B38),
SPH_C64(0xAD8EADADAC472301), SPH_C64(0x5A755A5AB0B42FEA),
SPH_C64(0x83368383EF1BB56C), SPH_C64(0x33CC3333B666FF85),
SPH_C64(0x639163635CC6F23F), SPH_C64(0x0208020212040A10),
SPH_C64(0xAA92AAAA93493839), SPH_C64(0x71D97171DEE2A8AF),
SPH_C64(0xC807C8C8C68DCF0E), SPH_C64(0x19641919D1327DC8),
SPH_C64(0x493949493B927072), SPH_C64(0xD943D9D95FAF9A86),
SPH_C64(0xF2EFF2F231F91DC3), SPH_C64(0xE3ABE3E3A8DB484B),
SPH_C64(0x5B715B5BB9B62AE2), SPH_C64(0x881A8888BC0D9234),
SPH_C64(0x9A529A9A3E29C8A4), SPH_C64(0x269826260B4CBE2D),
SPH_C64(0x32C83232BF64FA8D), SPH_C64(0xB0FAB0B0597D4AE9),
SPH_C64(0xE983E9E9F2CF6A1B), SPH_C64(0x0F3C0F0F771E3378),
SPH_C64(0xD573D5D533B7A6E6), SPH_C64(0x803A8080F41DBA74),
SPH_C64(0xBEC2BEBE27617C99), SPH_C64(0xCD13CDCDEB87DE26),
SPH_C64(0x34D034348968E4BD), SPH_C64(0x483D48483290757A),
SPH_C64(0xFFDBFFFF54E324AB), SPH_C64(0x7AF57A7A8DF48FF7),
SPH_C64(0x907A9090643DEAF4), SPH_C64(0x5F615F5F9DBE3EC2),
SPH_C64(0x208020203D40A01D), SPH_C64(0x68BD68680FD0D567),
SPH_C64(0x1A681A1ACA3472D0), SPH_C64(0xAE82AEAEB7412C19),
SPH_C64(0xB4EAB4B47D755EC9), SPH_C64(0x544D5454CEA8199A),
SPH_C64(0x937693937F3BE5EC), SPH_C64(0x228822222F44AA0D),
SPH_C64(0x648D646463C8E907), SPH_C64(0xF1E3F1F12AFF12DB),
SPH_C64(0x73D17373CCE6A2BF), SPH_C64(0x1248121282245A90),
SPH_C64(0x401D40407A805D3A), SPH_C64(0x0820080848102840),
SPH_C64(0xC32BC3C3959BE856), SPH_C64(0xEC97ECECDFC57B33),
SPH_C64(0xDB4BDBDB4DAB9096), SPH_C64(0xA1BEA1A1C05F1F61),
SPH_C64(0x8D0E8D8D9107831C), SPH_C64(0x3DF43D3DC87AC9F5),
SPH_C64(0x976697975B33F1CC), SPH_C64(0x0000000000000000),
SPH_C64(0xCF1BCFCFF983D436), SPH_C64(0x2BAC2B2B6E568745),
SPH_C64(0x76C57676E1ECB397), SPH_C64(0x82328282E619B064),
SPH_C64(0xD67FD6D628B1A9FE), SPH_C64(0x1B6C1B1BC33677D8),
SPH_C64(0xB5EEB5B574775BC1), SPH_C64(0xAF86AFAFBE432911),
SPH_C64(0x6AB56A6A1DD4DF77), SPH_C64(0x505D5050EAA00DBA),
SPH_C64(0x45094545578A4C12), SPH_C64(0xF3EBF3F338FB18CB),
SPH_C64(0x30C03030AD60F09D), SPH_C64(0xEF9BEFEFC4C3742B),
SPH_C64(0x3FFC3F3FDA7EC3E5), SPH_C64(0x55495555C7AA1C92),
SPH_C64(0xA2B2A2A2DB591079), SPH_C64(0xEA8FEAEAE9C96503),
SPH_C64(0x658965656ACAEC0F), SPH_C64(0xBAD2BABA036968B9),
SPH_C64(0x2FBC2F2F4A5E9365), SPH_C64(0xC027C0C08E9DE74E),
SPH_C64(0xDE5FDEDE60A181BE), SPH_C64(0x1C701C1CFC386CE0),
SPH_C64(0xFDD3FDFD46E72EBB), SPH_C64(0x4D294D4D1F9A6452),
SPH_C64(0x927292927639E0E4), SPH_C64(0x75C97575FAEABC8F),
SPH_C64(0x06180606360C1E30), SPH_C64(0x8A128A8AAE099824),
SPH_C64(0xB2F2B2B24B7940F9), SPH_C64(0xE6BFE6E685D15963),
SPH_C64(0x0E380E0E7E1C3670), SPH_C64(0x1F7C1F1FE73E63F8),
SPH_C64(0x6295626255C4F737), SPH_C64(0xD477D4D43AB5A3EE),
SPH_C64(0xA89AA8A8814D3229), SPH_C64(0x966296965231F4C4),
SPH_C64(0xF9C3F9F962EF3A9B), SPH_C64(0xC533C5C5A397F666),
SPH_C64(0x25942525104AB135), SPH_C64(0x59795959ABB220F2),
SPH_C64(0x842A8484D015AE54), SPH_C64(0x72D57272C5E4A7B7),
SPH_C64(0x39E43939EC72DDD5), SPH_C64(0x4C2D4C4C1698615A),
SPH_C64(0x5E655E5E94BC3BCA), SPH_C64(0x78FD78789FF085E7),
SPH_C64(0x38E03838E570D8DD), SPH_C64(0x8C0A8C8C98058614),
SPH_C64(0xD163D1D117BFB2C6), SPH_C64(0xA5AEA5A5E4570B41),
SPH_C64(0xE2AFE2E2A1D94D43), SPH_C64(0x619961614EC2F82F),
SPH_C64(0xB3F6B3B3427B45F1), SPH_C64(0x218421213442A515),
SPH_C64(0x9C4A9C9C0825D694), SPH_C64(0x1E781E1EEE3C66F0),
SPH_C64(0x4311434361865222), SPH_C64(0xC73BC7C7B193FC76),
SPH_C64(0xFCD7FCFC4FE52BB3), SPH_C64(0x0410040424081420),
SPH_C64(0x51595151E3A208B2), SPH_C64(0x995E9999252FC7BC),
SPH_C64(0x6DA96D6D22DAC44F), SPH_C64(0x0D340D0D651A3968),
SPH_C64(0xFACFFAFA79E93583), SPH_C64(0xDF5BDFDF69A384B6),
SPH_C64(0x7EE57E7EA9FC9BD7), SPH_C64(0x249024241948B43D),
SPH_C64(0x3BEC3B3BFE76D7C5), SPH_C64(0xAB96ABAB9A4B3D31),
SPH_C64(0xCE1FCECEF081D13E), SPH_C64(0x1144111199225588),
SPH_C64(0x8F068F8F8303890C), SPH_C64(0x4E254E4E049C6B4A),
SPH_C64(0xB7E6B7B7667351D1), SPH_C64(0xEB8BEBEBE0CB600B),
SPH_C64(0x3CF03C3CC178CCFD), SPH_C64(0x813E8181FD1FBF7C),
SPH_C64(0x946A94944035FED4), SPH_C64(0xF7FBF7F71CF30CEB),
SPH_C64(0xB9DEB9B9186F67A1), SPH_C64(0x134C13138B265F98),
SPH_C64(0x2CB02C2C51589C7D), SPH_C64(0xD36BD3D305BBB8D6),
SPH_C64(0xE7BBE7E78CD35C6B), SPH_C64(0x6EA56E6E39DCCB57),
SPH_C64(0xC437C4C4AA95F36E), SPH_C64(0x030C03031B060F18),
SPH_C64(0x56455656DCAC138A), SPH_C64(0x440D44445E88491A),
SPH_C64(0x7FE17F7FA0FE9EDF), SPH_C64(0xA99EA9A9884F3721),
SPH_C64(0x2AA82A2A6754824D), SPH_C64(0xBBD6BBBB0A6B6DB1),
SPH_C64(0xC123C1C1879FE246), SPH_C64(0x53515353F1A602A2),
SPH_C64(0xDC57DCDC72A58BAE), SPH_C64(0x0B2C0B0B53162758),
SPH_C64(0x9D4E9D9D0127D39C), SPH_C64(0x6CAD6C6C2BD8C147),
SPH_C64(0x31C43131A462F595), SPH_C64(0x74CD7474F3E8B987),
SPH_C64(0xF6FFF6F615F109E3), SPH_C64(0x460546464C8C430A),
SPH_C64(0xAC8AACACA5452609), SPH_C64(0x891E8989B50F973C),
SPH_C64(0x14501414B42844A0), SPH_C64(0xE1A3E1E1BADF425B),
SPH_C64(0x16581616A62C4EB0), SPH_C64(0x3AE83A3AF774D2CD),
SPH_C64(0x69B9696906D2D06F), SPH_C64(0x0924090941122D48),
SPH_C64(0x70DD7070D7E0ADA7), SPH_C64(0xB6E2B6B66F7154D9),
SPH_C64(0xD067D0D01EBDB7CE), SPH_C64(0xED93EDEDD6C77E3B),
SPH_C64(0xCC17CCCCE285DB2E), SPH_C64(0x421542426884572A),
SPH_C64(0x985A98982C2DC2B4), SPH_C64(0xA4AAA4A4ED550E49),
SPH_C64(0x28A028287550885D), SPH_C64(0x5C6D5C5C86B831DA),
SPH_C64(0xF8C7F8F86BED3F93), SPH_C64(0x86228686C211A444)
};
__device__ static const uint64_t plain_T5[256] = {
SPH_C64(0x601818D83078C018), SPH_C64(0x8C23232646AF0523),
SPH_C64(0x3FC6C6B891F97EC6), SPH_C64(0x87E8E8FBCD6F13E8),
SPH_C64(0x268787CB13A14C87), SPH_C64(0xDAB8B8116D62A9B8),
SPH_C64(0x0401010902050801), SPH_C64(0x214F4F0D9E6E424F),
SPH_C64(0xD836369B6CEEAD36), SPH_C64(0xA2A6A6FF510459A6),
SPH_C64(0x6FD2D20CB9BDDED2), SPH_C64(0xF3F5F50EF706FBF5),
SPH_C64(0xF9797996F280EF79), SPH_C64(0xA16F6F30DECE5F6F),
SPH_C64(0x7E91916D3FEFFC91), SPH_C64(0x555252F8A407AA52),
SPH_C64(0x9D606047C0FD2760), SPH_C64(0xCABCBC35657689BC),
SPH_C64(0x569B9B372BCDAC9B), SPH_C64(0x028E8E8A018C048E),
SPH_C64(0xB6A3A3D25B1571A3), SPH_C64(0x300C0C6C183C600C),
SPH_C64(0xF17B7B84F68AFF7B), SPH_C64(0xD43535806AE1B535),
SPH_C64(0x741D1DF53A69E81D), SPH_C64(0xA7E0E0B3DD4753E0),
SPH_C64(0x7BD7D721B3ACF6D7), SPH_C64(0x2FC2C29C99ED5EC2),
SPH_C64(0xB82E2E435C966D2E), SPH_C64(0x314B4B29967A624B),
SPH_C64(0xDFFEFE5DE121A3FE), SPH_C64(0x415757D5AE168257),
SPH_C64(0x541515BD2A41A815), SPH_C64(0xC17777E8EEB69F77),
SPH_C64(0xDC3737926EEBA537), SPH_C64(0xB3E5E59ED7567BE5),
SPH_C64(0x469F9F1323D98C9F), SPH_C64(0xE7F0F023FD17D3F0),
SPH_C64(0x354A4A20947F6A4A), SPH_C64(0x4FDADA44A9959EDA),
SPH_C64(0x7D5858A2B025FA58), SPH_C64(0x03C9C9CF8FCA06C9),
SPH_C64(0xA429297C528D5529), SPH_C64(0x280A0A5A1422500A),
SPH_C64(0xFEB1B1507F4FE1B1), SPH_C64(0xBAA0A0C95D1A69A0),
SPH_C64(0xB16B6B14D6DA7F6B), SPH_C64(0x2E8585D917AB5C85),
SPH_C64(0xCEBDBD3C677381BD), SPH_C64(0x695D5D8FBA34D25D),
SPH_C64(0x4010109020508010), SPH_C64(0xF7F4F407F503F3F4),
SPH_C64(0x0BCBCBDD8BC016CB), SPH_C64(0xF83E3ED37CC6ED3E),
SPH_C64(0x1405052D0A112805), SPH_C64(0x81676778CEE61F67),
SPH_C64(0xB7E4E497D55373E4), SPH_C64(0x9C2727024EBB2527),
SPH_C64(0x1941417382583241), SPH_C64(0x168B8BA70B9D2C8B),
SPH_C64(0xA6A7A7F6530151A7), SPH_C64(0xE97D7DB2FA94CF7D),
SPH_C64(0x6E95954937FBDC95), SPH_C64(0x47D8D856AD9F8ED8),
SPH_C64(0xCBFBFB70EB308BFB), SPH_C64(0x9FEEEECDC17123EE),
SPH_C64(0xED7C7CBBF891C77C), SPH_C64(0x85666671CCE31766),
SPH_C64(0x53DDDD7BA78EA6DD), SPH_C64(0x5C1717AF2E4BB817),
SPH_C64(0x014747458E460247), SPH_C64(0x429E9E1A21DC849E),
SPH_C64(0x0FCACAD489C51ECA), SPH_C64(0xB42D2D585A99752D),
SPH_C64(0xC6BFBF2E637991BF), SPH_C64(0x1C07073F0E1B3807),
SPH_C64(0x8EADADAC472301AD), SPH_C64(0x755A5AB0B42FEA5A),
SPH_C64(0x368383EF1BB56C83), SPH_C64(0xCC3333B666FF8533),
SPH_C64(0x9163635CC6F23F63), SPH_C64(0x08020212040A1002),
SPH_C64(0x92AAAA93493839AA), SPH_C64(0xD97171DEE2A8AF71),
SPH_C64(0x07C8C8C68DCF0EC8), SPH_C64(0x641919D1327DC819),
SPH_C64(0x3949493B92707249), SPH_C64(0x43D9D95FAF9A86D9),
SPH_C64(0xEFF2F231F91DC3F2), SPH_C64(0xABE3E3A8DB484BE3),
SPH_C64(0x715B5BB9B62AE25B), SPH_C64(0x1A8888BC0D923488),
SPH_C64(0x529A9A3E29C8A49A), SPH_C64(0x9826260B4CBE2D26),
SPH_C64(0xC83232BF64FA8D32), SPH_C64(0xFAB0B0597D4AE9B0),
SPH_C64(0x83E9E9F2CF6A1BE9), SPH_C64(0x3C0F0F771E33780F),
SPH_C64(0x73D5D533B7A6E6D5), SPH_C64(0x3A8080F41DBA7480),
SPH_C64(0xC2BEBE27617C99BE), SPH_C64(0x13CDCDEB87DE26CD),
SPH_C64(0xD034348968E4BD34), SPH_C64(0x3D48483290757A48),
SPH_C64(0xDBFFFF54E324ABFF), SPH_C64(0xF57A7A8DF48FF77A),
SPH_C64(0x7A9090643DEAF490), SPH_C64(0x615F5F9DBE3EC25F),
SPH_C64(0x8020203D40A01D20), SPH_C64(0xBD68680FD0D56768),
SPH_C64(0x681A1ACA3472D01A), SPH_C64(0x82AEAEB7412C19AE),
SPH_C64(0xEAB4B47D755EC9B4), SPH_C64(0x4D5454CEA8199A54),
SPH_C64(0x7693937F3BE5EC93), SPH_C64(0x8822222F44AA0D22),
SPH_C64(0x8D646463C8E90764), SPH_C64(0xE3F1F12AFF12DBF1),
SPH_C64(0xD17373CCE6A2BF73), SPH_C64(0x48121282245A9012),
SPH_C64(0x1D40407A805D3A40), SPH_C64(0x2008084810284008),
SPH_C64(0x2BC3C3959BE856C3), SPH_C64(0x97ECECDFC57B33EC),
SPH_C64(0x4BDBDB4DAB9096DB), SPH_C64(0xBEA1A1C05F1F61A1),
SPH_C64(0x0E8D8D9107831C8D), SPH_C64(0xF43D3DC87AC9F53D),
SPH_C64(0x6697975B33F1CC97), SPH_C64(0x0000000000000000),
SPH_C64(0x1BCFCFF983D436CF), SPH_C64(0xAC2B2B6E5687452B),
SPH_C64(0xC57676E1ECB39776), SPH_C64(0x328282E619B06482),
SPH_C64(0x7FD6D628B1A9FED6), SPH_C64(0x6C1B1BC33677D81B),
SPH_C64(0xEEB5B574775BC1B5), SPH_C64(0x86AFAFBE432911AF),
SPH_C64(0xB56A6A1DD4DF776A), SPH_C64(0x5D5050EAA00DBA50),
SPH_C64(0x094545578A4C1245), SPH_C64(0xEBF3F338FB18CBF3),
SPH_C64(0xC03030AD60F09D30), SPH_C64(0x9BEFEFC4C3742BEF),
SPH_C64(0xFC3F3FDA7EC3E53F), SPH_C64(0x495555C7AA1C9255),
SPH_C64(0xB2A2A2DB591079A2), SPH_C64(0x8FEAEAE9C96503EA),
SPH_C64(0x8965656ACAEC0F65), SPH_C64(0xD2BABA036968B9BA),
SPH_C64(0xBC2F2F4A5E93652F), SPH_C64(0x27C0C08E9DE74EC0),
SPH_C64(0x5FDEDE60A181BEDE), SPH_C64(0x701C1CFC386CE01C),
SPH_C64(0xD3FDFD46E72EBBFD), SPH_C64(0x294D4D1F9A64524D),
SPH_C64(0x7292927639E0E492), SPH_C64(0xC97575FAEABC8F75),
SPH_C64(0x180606360C1E3006), SPH_C64(0x128A8AAE0998248A),
SPH_C64(0xF2B2B24B7940F9B2), SPH_C64(0xBFE6E685D15963E6),
SPH_C64(0x380E0E7E1C36700E), SPH_C64(0x7C1F1FE73E63F81F),
SPH_C64(0x95626255C4F73762), SPH_C64(0x77D4D43AB5A3EED4),
SPH_C64(0x9AA8A8814D3229A8), SPH_C64(0x6296965231F4C496),
SPH_C64(0xC3F9F962EF3A9BF9), SPH_C64(0x33C5C5A397F666C5),
SPH_C64(0x942525104AB13525), SPH_C64(0x795959ABB220F259),
SPH_C64(0x2A8484D015AE5484), SPH_C64(0xD57272C5E4A7B772),
SPH_C64(0xE43939EC72DDD539), SPH_C64(0x2D4C4C1698615A4C),
SPH_C64(0x655E5E94BC3BCA5E), SPH_C64(0xFD78789FF085E778),
SPH_C64(0xE03838E570D8DD38), SPH_C64(0x0A8C8C980586148C),
SPH_C64(0x63D1D117BFB2C6D1), SPH_C64(0xAEA5A5E4570B41A5),
SPH_C64(0xAFE2E2A1D94D43E2), SPH_C64(0x9961614EC2F82F61),
SPH_C64(0xF6B3B3427B45F1B3), SPH_C64(0x8421213442A51521),
SPH_C64(0x4A9C9C0825D6949C), SPH_C64(0x781E1EEE3C66F01E),
SPH_C64(0x1143436186522243), SPH_C64(0x3BC7C7B193FC76C7),
SPH_C64(0xD7FCFC4FE52BB3FC), SPH_C64(0x1004042408142004),
SPH_C64(0x595151E3A208B251), SPH_C64(0x5E9999252FC7BC99),
SPH_C64(0xA96D6D22DAC44F6D), SPH_C64(0x340D0D651A39680D),
SPH_C64(0xCFFAFA79E93583FA), SPH_C64(0x5BDFDF69A384B6DF),
SPH_C64(0xE57E7EA9FC9BD77E), SPH_C64(0x9024241948B43D24),
SPH_C64(0xEC3B3BFE76D7C53B), SPH_C64(0x96ABAB9A4B3D31AB),
SPH_C64(0x1FCECEF081D13ECE), SPH_C64(0x4411119922558811),
SPH_C64(0x068F8F8303890C8F), SPH_C64(0x254E4E049C6B4A4E),
SPH_C64(0xE6B7B7667351D1B7), SPH_C64(0x8BEBEBE0CB600BEB),
SPH_C64(0xF03C3CC178CCFD3C), SPH_C64(0x3E8181FD1FBF7C81),
SPH_C64(0x6A94944035FED494), SPH_C64(0xFBF7F71CF30CEBF7),
SPH_C64(0xDEB9B9186F67A1B9), SPH_C64(0x4C13138B265F9813),
SPH_C64(0xB02C2C51589C7D2C), SPH_C64(0x6BD3D305BBB8D6D3),
SPH_C64(0xBBE7E78CD35C6BE7), SPH_C64(0xA56E6E39DCCB576E),
SPH_C64(0x37C4C4AA95F36EC4), SPH_C64(0x0C03031B060F1803),
SPH_C64(0x455656DCAC138A56), SPH_C64(0x0D44445E88491A44),
SPH_C64(0xE17F7FA0FE9EDF7F), SPH_C64(0x9EA9A9884F3721A9),
SPH_C64(0xA82A2A6754824D2A), SPH_C64(0xD6BBBB0A6B6DB1BB),
SPH_C64(0x23C1C1879FE246C1), SPH_C64(0x515353F1A602A253),
SPH_C64(0x57DCDC72A58BAEDC), SPH_C64(0x2C0B0B531627580B),
SPH_C64(0x4E9D9D0127D39C9D), SPH_C64(0xAD6C6C2BD8C1476C),
SPH_C64(0xC43131A462F59531), SPH_C64(0xCD7474F3E8B98774),
SPH_C64(0xFFF6F615F109E3F6), SPH_C64(0x0546464C8C430A46),
SPH_C64(0x8AACACA5452609AC), SPH_C64(0x1E8989B50F973C89),
SPH_C64(0x501414B42844A014), SPH_C64(0xA3E1E1BADF425BE1),
SPH_C64(0x581616A62C4EB016), SPH_C64(0xE83A3AF774D2CD3A),
SPH_C64(0xB9696906D2D06F69), SPH_C64(0x24090941122D4809),
SPH_C64(0xDD7070D7E0ADA770), SPH_C64(0xE2B6B66F7154D9B6),
SPH_C64(0x67D0D01EBDB7CED0), SPH_C64(0x93EDEDD6C77E3BED),
SPH_C64(0x17CCCCE285DB2ECC), SPH_C64(0x1542426884572A42),
SPH_C64(0x5A98982C2DC2B498), SPH_C64(0xAAA4A4ED550E49A4),
SPH_C64(0xA028287550885D28), SPH_C64(0x6D5C5C86B831DA5C),
SPH_C64(0xC7F8F86BED3F93F8), SPH_C64(0x228686C211A44486)
};
__device__ static const uint64_t plain_T6[256] = {
SPH_C64(0x1818D83078C01860), SPH_C64(0x23232646AF05238C),
SPH_C64(0xC6C6B891F97EC63F), SPH_C64(0xE8E8FBCD6F13E887),
SPH_C64(0x8787CB13A14C8726), SPH_C64(0xB8B8116D62A9B8DA),
SPH_C64(0x0101090205080104), SPH_C64(0x4F4F0D9E6E424F21),
SPH_C64(0x36369B6CEEAD36D8), SPH_C64(0xA6A6FF510459A6A2),
SPH_C64(0xD2D20CB9BDDED26F), SPH_C64(0xF5F50EF706FBF5F3),
SPH_C64(0x797996F280EF79F9), SPH_C64(0x6F6F30DECE5F6FA1),
SPH_C64(0x91916D3FEFFC917E), SPH_C64(0x5252F8A407AA5255),
SPH_C64(0x606047C0FD27609D), SPH_C64(0xBCBC35657689BCCA),
SPH_C64(0x9B9B372BCDAC9B56), SPH_C64(0x8E8E8A018C048E02),
SPH_C64(0xA3A3D25B1571A3B6), SPH_C64(0x0C0C6C183C600C30),
SPH_C64(0x7B7B84F68AFF7BF1), SPH_C64(0x3535806AE1B535D4),
SPH_C64(0x1D1DF53A69E81D74), SPH_C64(0xE0E0B3DD4753E0A7),
SPH_C64(0xD7D721B3ACF6D77B), SPH_C64(0xC2C29C99ED5EC22F),
SPH_C64(0x2E2E435C966D2EB8), SPH_C64(0x4B4B29967A624B31),
SPH_C64(0xFEFE5DE121A3FEDF), SPH_C64(0x5757D5AE16825741),
SPH_C64(0x1515BD2A41A81554), SPH_C64(0x7777E8EEB69F77C1),
SPH_C64(0x3737926EEBA537DC), SPH_C64(0xE5E59ED7567BE5B3),
SPH_C64(0x9F9F1323D98C9F46), SPH_C64(0xF0F023FD17D3F0E7),
SPH_C64(0x4A4A20947F6A4A35), SPH_C64(0xDADA44A9959EDA4F),
SPH_C64(0x5858A2B025FA587D), SPH_C64(0xC9C9CF8FCA06C903),
SPH_C64(0x29297C528D5529A4), SPH_C64(0x0A0A5A1422500A28),
SPH_C64(0xB1B1507F4FE1B1FE), SPH_C64(0xA0A0C95D1A69A0BA),
SPH_C64(0x6B6B14D6DA7F6BB1), SPH_C64(0x8585D917AB5C852E),
SPH_C64(0xBDBD3C677381BDCE), SPH_C64(0x5D5D8FBA34D25D69),
SPH_C64(0x1010902050801040), SPH_C64(0xF4F407F503F3F4F7),
SPH_C64(0xCBCBDD8BC016CB0B), SPH_C64(0x3E3ED37CC6ED3EF8),
SPH_C64(0x05052D0A11280514), SPH_C64(0x676778CEE61F6781),
SPH_C64(0xE4E497D55373E4B7), SPH_C64(0x2727024EBB25279C),
SPH_C64(0x4141738258324119), SPH_C64(0x8B8BA70B9D2C8B16),
SPH_C64(0xA7A7F6530151A7A6), SPH_C64(0x7D7DB2FA94CF7DE9),
SPH_C64(0x95954937FBDC956E), SPH_C64(0xD8D856AD9F8ED847),
SPH_C64(0xFBFB70EB308BFBCB), SPH_C64(0xEEEECDC17123EE9F),
SPH_C64(0x7C7CBBF891C77CED), SPH_C64(0x666671CCE3176685),
SPH_C64(0xDDDD7BA78EA6DD53), SPH_C64(0x1717AF2E4BB8175C),
SPH_C64(0x4747458E46024701), SPH_C64(0x9E9E1A21DC849E42),
SPH_C64(0xCACAD489C51ECA0F), SPH_C64(0x2D2D585A99752DB4),
SPH_C64(0xBFBF2E637991BFC6), SPH_C64(0x07073F0E1B38071C),
SPH_C64(0xADADAC472301AD8E), SPH_C64(0x5A5AB0B42FEA5A75),
SPH_C64(0x8383EF1BB56C8336), SPH_C64(0x3333B666FF8533CC),
SPH_C64(0x63635CC6F23F6391), SPH_C64(0x020212040A100208),
SPH_C64(0xAAAA93493839AA92), SPH_C64(0x7171DEE2A8AF71D9),
SPH_C64(0xC8C8C68DCF0EC807), SPH_C64(0x1919D1327DC81964),
SPH_C64(0x49493B9270724939), SPH_C64(0xD9D95FAF9A86D943),
SPH_C64(0xF2F231F91DC3F2EF), SPH_C64(0xE3E3A8DB484BE3AB),
SPH_C64(0x5B5BB9B62AE25B71), SPH_C64(0x8888BC0D9234881A),
SPH_C64(0x9A9A3E29C8A49A52), SPH_C64(0x26260B4CBE2D2698),
SPH_C64(0x3232BF64FA8D32C8), SPH_C64(0xB0B0597D4AE9B0FA),
SPH_C64(0xE9E9F2CF6A1BE983), SPH_C64(0x0F0F771E33780F3C),
SPH_C64(0xD5D533B7A6E6D573), SPH_C64(0x8080F41DBA74803A),
SPH_C64(0xBEBE27617C99BEC2), SPH_C64(0xCDCDEB87DE26CD13),
SPH_C64(0x34348968E4BD34D0), SPH_C64(0x48483290757A483D),
SPH_C64(0xFFFF54E324ABFFDB), SPH_C64(0x7A7A8DF48FF77AF5),
SPH_C64(0x9090643DEAF4907A), SPH_C64(0x5F5F9DBE3EC25F61),
SPH_C64(0x20203D40A01D2080), SPH_C64(0x68680FD0D56768BD),
SPH_C64(0x1A1ACA3472D01A68), SPH_C64(0xAEAEB7412C19AE82),
SPH_C64(0xB4B47D755EC9B4EA), SPH_C64(0x5454CEA8199A544D),
SPH_C64(0x93937F3BE5EC9376), SPH_C64(0x22222F44AA0D2288),
SPH_C64(0x646463C8E907648D), SPH_C64(0xF1F12AFF12DBF1E3),
SPH_C64(0x7373CCE6A2BF73D1), SPH_C64(0x121282245A901248),
SPH_C64(0x40407A805D3A401D), SPH_C64(0x0808481028400820),
SPH_C64(0xC3C3959BE856C32B), SPH_C64(0xECECDFC57B33EC97),
SPH_C64(0xDBDB4DAB9096DB4B), SPH_C64(0xA1A1C05F1F61A1BE),
SPH_C64(0x8D8D9107831C8D0E), SPH_C64(0x3D3DC87AC9F53DF4),
SPH_C64(0x97975B33F1CC9766), SPH_C64(0x0000000000000000),
SPH_C64(0xCFCFF983D436CF1B), SPH_C64(0x2B2B6E5687452BAC),
SPH_C64(0x7676E1ECB39776C5), SPH_C64(0x8282E619B0648232),
SPH_C64(0xD6D628B1A9FED67F), SPH_C64(0x1B1BC33677D81B6C),
SPH_C64(0xB5B574775BC1B5EE), SPH_C64(0xAFAFBE432911AF86),
SPH_C64(0x6A6A1DD4DF776AB5), SPH_C64(0x5050EAA00DBA505D),
SPH_C64(0x4545578A4C124509), SPH_C64(0xF3F338FB18CBF3EB),
SPH_C64(0x3030AD60F09D30C0), SPH_C64(0xEFEFC4C3742BEF9B),
SPH_C64(0x3F3FDA7EC3E53FFC), SPH_C64(0x5555C7AA1C925549),
SPH_C64(0xA2A2DB591079A2B2), SPH_C64(0xEAEAE9C96503EA8F),
SPH_C64(0x65656ACAEC0F6589), SPH_C64(0xBABA036968B9BAD2),
SPH_C64(0x2F2F4A5E93652FBC), SPH_C64(0xC0C08E9DE74EC027),
SPH_C64(0xDEDE60A181BEDE5F), SPH_C64(0x1C1CFC386CE01C70),
SPH_C64(0xFDFD46E72EBBFDD3), SPH_C64(0x4D4D1F9A64524D29),
SPH_C64(0x92927639E0E49272), SPH_C64(0x7575FAEABC8F75C9),
SPH_C64(0x0606360C1E300618), SPH_C64(0x8A8AAE0998248A12),
SPH_C64(0xB2B24B7940F9B2F2), SPH_C64(0xE6E685D15963E6BF),
SPH_C64(0x0E0E7E1C36700E38), SPH_C64(0x1F1FE73E63F81F7C),
SPH_C64(0x626255C4F7376295), SPH_C64(0xD4D43AB5A3EED477),
SPH_C64(0xA8A8814D3229A89A), SPH_C64(0x96965231F4C49662),
SPH_C64(0xF9F962EF3A9BF9C3), SPH_C64(0xC5C5A397F666C533),
SPH_C64(0x2525104AB1352594), SPH_C64(0x5959ABB220F25979),
SPH_C64(0x8484D015AE54842A), SPH_C64(0x7272C5E4A7B772D5),
SPH_C64(0x3939EC72DDD539E4), SPH_C64(0x4C4C1698615A4C2D),
SPH_C64(0x5E5E94BC3BCA5E65), SPH_C64(0x78789FF085E778FD),
SPH_C64(0x3838E570D8DD38E0), SPH_C64(0x8C8C980586148C0A),
SPH_C64(0xD1D117BFB2C6D163), SPH_C64(0xA5A5E4570B41A5AE),
SPH_C64(0xE2E2A1D94D43E2AF), SPH_C64(0x61614EC2F82F6199),
SPH_C64(0xB3B3427B45F1B3F6), SPH_C64(0x21213442A5152184),
SPH_C64(0x9C9C0825D6949C4A), SPH_C64(0x1E1EEE3C66F01E78),
SPH_C64(0x4343618652224311), SPH_C64(0xC7C7B193FC76C73B),
SPH_C64(0xFCFC4FE52BB3FCD7), SPH_C64(0x0404240814200410),
SPH_C64(0x5151E3A208B25159), SPH_C64(0x9999252FC7BC995E),
SPH_C64(0x6D6D22DAC44F6DA9), SPH_C64(0x0D0D651A39680D34),
SPH_C64(0xFAFA79E93583FACF), SPH_C64(0xDFDF69A384B6DF5B),
SPH_C64(0x7E7EA9FC9BD77EE5), SPH_C64(0x24241948B43D2490),
SPH_C64(0x3B3BFE76D7C53BEC), SPH_C64(0xABAB9A4B3D31AB96),
SPH_C64(0xCECEF081D13ECE1F), SPH_C64(0x1111992255881144),
SPH_C64(0x8F8F8303890C8F06), SPH_C64(0x4E4E049C6B4A4E25),
SPH_C64(0xB7B7667351D1B7E6), SPH_C64(0xEBEBE0CB600BEB8B),
SPH_C64(0x3C3CC178CCFD3CF0), SPH_C64(0x8181FD1FBF7C813E),
SPH_C64(0x94944035FED4946A), SPH_C64(0xF7F71CF30CEBF7FB),
SPH_C64(0xB9B9186F67A1B9DE), SPH_C64(0x13138B265F98134C),
SPH_C64(0x2C2C51589C7D2CB0), SPH_C64(0xD3D305BBB8D6D36B),
SPH_C64(0xE7E78CD35C6BE7BB), SPH_C64(0x6E6E39DCCB576EA5),
SPH_C64(0xC4C4AA95F36EC437), SPH_C64(0x03031B060F18030C),
SPH_C64(0x5656DCAC138A5645), SPH_C64(0x44445E88491A440D),
SPH_C64(0x7F7FA0FE9EDF7FE1), SPH_C64(0xA9A9884F3721A99E),
SPH_C64(0x2A2A6754824D2AA8), SPH_C64(0xBBBB0A6B6DB1BBD6),
SPH_C64(0xC1C1879FE246C123), SPH_C64(0x5353F1A602A25351),
SPH_C64(0xDCDC72A58BAEDC57), SPH_C64(0x0B0B531627580B2C),
SPH_C64(0x9D9D0127D39C9D4E), SPH_C64(0x6C6C2BD8C1476CAD),
SPH_C64(0x3131A462F59531C4), SPH_C64(0x7474F3E8B98774CD),
SPH_C64(0xF6F615F109E3F6FF), SPH_C64(0x46464C8C430A4605),
SPH_C64(0xACACA5452609AC8A), SPH_C64(0x8989B50F973C891E),
SPH_C64(0x1414B42844A01450), SPH_C64(0xE1E1BADF425BE1A3),
SPH_C64(0x1616A62C4EB01658), SPH_C64(0x3A3AF774D2CD3AE8),
SPH_C64(0x696906D2D06F69B9), SPH_C64(0x090941122D480924),
SPH_C64(0x7070D7E0ADA770DD), SPH_C64(0xB6B66F7154D9B6E2),
SPH_C64(0xD0D01EBDB7CED067), SPH_C64(0xEDEDD6C77E3BED93),
SPH_C64(0xCCCCE285DB2ECC17), SPH_C64(0x42426884572A4215),
SPH_C64(0x98982C2DC2B4985A), SPH_C64(0xA4A4ED550E49A4AA),
SPH_C64(0x28287550885D28A0), SPH_C64(0x5C5C86B831DA5C6D),
SPH_C64(0xF8F86BED3F93F8C7), SPH_C64(0x8686C211A4448622)
};
__device__ static const uint64_t plain_T7[256] = {
SPH_C64(0x18D83078C0186018), SPH_C64(0x232646AF05238C23),
SPH_C64(0xC6B891F97EC63FC6), SPH_C64(0xE8FBCD6F13E887E8),
SPH_C64(0x87CB13A14C872687), SPH_C64(0xB8116D62A9B8DAB8),
SPH_C64(0x0109020508010401), SPH_C64(0x4F0D9E6E424F214F),
SPH_C64(0x369B6CEEAD36D836), SPH_C64(0xA6FF510459A6A2A6),
SPH_C64(0xD20CB9BDDED26FD2), SPH_C64(0xF50EF706FBF5F3F5),
SPH_C64(0x7996F280EF79F979), SPH_C64(0x6F30DECE5F6FA16F),
SPH_C64(0x916D3FEFFC917E91), SPH_C64(0x52F8A407AA525552),
SPH_C64(0x6047C0FD27609D60), SPH_C64(0xBC35657689BCCABC),
SPH_C64(0x9B372BCDAC9B569B), SPH_C64(0x8E8A018C048E028E),
SPH_C64(0xA3D25B1571A3B6A3), SPH_C64(0x0C6C183C600C300C),
SPH_C64(0x7B84F68AFF7BF17B), SPH_C64(0x35806AE1B535D435),
SPH_C64(0x1DF53A69E81D741D), SPH_C64(0xE0B3DD4753E0A7E0),
SPH_C64(0xD721B3ACF6D77BD7), SPH_C64(0xC29C99ED5EC22FC2),
SPH_C64(0x2E435C966D2EB82E), SPH_C64(0x4B29967A624B314B),
SPH_C64(0xFE5DE121A3FEDFFE), SPH_C64(0x57D5AE1682574157),
SPH_C64(0x15BD2A41A8155415), SPH_C64(0x77E8EEB69F77C177),
SPH_C64(0x37926EEBA537DC37), SPH_C64(0xE59ED7567BE5B3E5),
SPH_C64(0x9F1323D98C9F469F), SPH_C64(0xF023FD17D3F0E7F0),
SPH_C64(0x4A20947F6A4A354A), SPH_C64(0xDA44A9959EDA4FDA),
SPH_C64(0x58A2B025FA587D58), SPH_C64(0xC9CF8FCA06C903C9),
SPH_C64(0x297C528D5529A429), SPH_C64(0x0A5A1422500A280A),
SPH_C64(0xB1507F4FE1B1FEB1), SPH_C64(0xA0C95D1A69A0BAA0),
SPH_C64(0x6B14D6DA7F6BB16B), SPH_C64(0x85D917AB5C852E85),
SPH_C64(0xBD3C677381BDCEBD), SPH_C64(0x5D8FBA34D25D695D),
SPH_C64(0x1090205080104010), SPH_C64(0xF407F503F3F4F7F4),
SPH_C64(0xCBDD8BC016CB0BCB), SPH_C64(0x3ED37CC6ED3EF83E),
SPH_C64(0x052D0A1128051405), SPH_C64(0x6778CEE61F678167),
SPH_C64(0xE497D55373E4B7E4), SPH_C64(0x27024EBB25279C27),
SPH_C64(0x4173825832411941), SPH_C64(0x8BA70B9D2C8B168B),
SPH_C64(0xA7F6530151A7A6A7), SPH_C64(0x7DB2FA94CF7DE97D),
SPH_C64(0x954937FBDC956E95), SPH_C64(0xD856AD9F8ED847D8),
SPH_C64(0xFB70EB308BFBCBFB), SPH_C64(0xEECDC17123EE9FEE),
SPH_C64(0x7CBBF891C77CED7C), SPH_C64(0x6671CCE317668566),
SPH_C64(0xDD7BA78EA6DD53DD), SPH_C64(0x17AF2E4BB8175C17),
SPH_C64(0x47458E4602470147), SPH_C64(0x9E1A21DC849E429E),
SPH_C64(0xCAD489C51ECA0FCA), SPH_C64(0x2D585A99752DB42D),
SPH_C64(0xBF2E637991BFC6BF), SPH_C64(0x073F0E1B38071C07),
SPH_C64(0xADAC472301AD8EAD), SPH_C64(0x5AB0B42FEA5A755A),
SPH_C64(0x83EF1BB56C833683), SPH_C64(0x33B666FF8533CC33),
SPH_C64(0x635CC6F23F639163), SPH_C64(0x0212040A10020802),
SPH_C64(0xAA93493839AA92AA), SPH_C64(0x71DEE2A8AF71D971),
SPH_C64(0xC8C68DCF0EC807C8), SPH_C64(0x19D1327DC8196419),
SPH_C64(0x493B927072493949), SPH_C64(0xD95FAF9A86D943D9),
SPH_C64(0xF231F91DC3F2EFF2), SPH_C64(0xE3A8DB484BE3ABE3),
SPH_C64(0x5BB9B62AE25B715B), SPH_C64(0x88BC0D9234881A88),
SPH_C64(0x9A3E29C8A49A529A), SPH_C64(0x260B4CBE2D269826),
SPH_C64(0x32BF64FA8D32C832), SPH_C64(0xB0597D4AE9B0FAB0),
SPH_C64(0xE9F2CF6A1BE983E9), SPH_C64(0x0F771E33780F3C0F),
SPH_C64(0xD533B7A6E6D573D5), SPH_C64(0x80F41DBA74803A80),
SPH_C64(0xBE27617C99BEC2BE), SPH_C64(0xCDEB87DE26CD13CD),
SPH_C64(0x348968E4BD34D034), SPH_C64(0x483290757A483D48),
SPH_C64(0xFF54E324ABFFDBFF), SPH_C64(0x7A8DF48FF77AF57A),
SPH_C64(0x90643DEAF4907A90), SPH_C64(0x5F9DBE3EC25F615F),
SPH_C64(0x203D40A01D208020), SPH_C64(0x680FD0D56768BD68),
SPH_C64(0x1ACA3472D01A681A), SPH_C64(0xAEB7412C19AE82AE),
SPH_C64(0xB47D755EC9B4EAB4), SPH_C64(0x54CEA8199A544D54),
SPH_C64(0x937F3BE5EC937693), SPH_C64(0x222F44AA0D228822),
SPH_C64(0x6463C8E907648D64), SPH_C64(0xF12AFF12DBF1E3F1),
SPH_C64(0x73CCE6A2BF73D173), SPH_C64(0x1282245A90124812),
SPH_C64(0x407A805D3A401D40), SPH_C64(0x0848102840082008),
SPH_C64(0xC3959BE856C32BC3), SPH_C64(0xECDFC57B33EC97EC),
SPH_C64(0xDB4DAB9096DB4BDB), SPH_C64(0xA1C05F1F61A1BEA1),
SPH_C64(0x8D9107831C8D0E8D), SPH_C64(0x3DC87AC9F53DF43D),
SPH_C64(0x975B33F1CC976697), SPH_C64(0x0000000000000000),
SPH_C64(0xCFF983D436CF1BCF), SPH_C64(0x2B6E5687452BAC2B),
SPH_C64(0x76E1ECB39776C576), SPH_C64(0x82E619B064823282),
SPH_C64(0xD628B1A9FED67FD6), SPH_C64(0x1BC33677D81B6C1B),
SPH_C64(0xB574775BC1B5EEB5), SPH_C64(0xAFBE432911AF86AF),
SPH_C64(0x6A1DD4DF776AB56A), SPH_C64(0x50EAA00DBA505D50),
SPH_C64(0x45578A4C12450945), SPH_C64(0xF338FB18CBF3EBF3),
SPH_C64(0x30AD60F09D30C030), SPH_C64(0xEFC4C3742BEF9BEF),
SPH_C64(0x3FDA7EC3E53FFC3F), SPH_C64(0x55C7AA1C92554955),
SPH_C64(0xA2DB591079A2B2A2), SPH_C64(0xEAE9C96503EA8FEA),
SPH_C64(0x656ACAEC0F658965), SPH_C64(0xBA036968B9BAD2BA),
SPH_C64(0x2F4A5E93652FBC2F), SPH_C64(0xC08E9DE74EC027C0),
SPH_C64(0xDE60A181BEDE5FDE), SPH_C64(0x1CFC386CE01C701C),
SPH_C64(0xFD46E72EBBFDD3FD), SPH_C64(0x4D1F9A64524D294D),
SPH_C64(0x927639E0E4927292), SPH_C64(0x75FAEABC8F75C975),
SPH_C64(0x06360C1E30061806), SPH_C64(0x8AAE0998248A128A),
SPH_C64(0xB24B7940F9B2F2B2), SPH_C64(0xE685D15963E6BFE6),
SPH_C64(0x0E7E1C36700E380E), SPH_C64(0x1FE73E63F81F7C1F),
SPH_C64(0x6255C4F737629562), SPH_C64(0xD43AB5A3EED477D4),
SPH_C64(0xA8814D3229A89AA8), SPH_C64(0x965231F4C4966296),
SPH_C64(0xF962EF3A9BF9C3F9), SPH_C64(0xC5A397F666C533C5),
SPH_C64(0x25104AB135259425), SPH_C64(0x59ABB220F2597959),
SPH_C64(0x84D015AE54842A84), SPH_C64(0x72C5E4A7B772D572),
SPH_C64(0x39EC72DDD539E439), SPH_C64(0x4C1698615A4C2D4C),
SPH_C64(0x5E94BC3BCA5E655E), SPH_C64(0x789FF085E778FD78),
SPH_C64(0x38E570D8DD38E038), SPH_C64(0x8C980586148C0A8C),
SPH_C64(0xD117BFB2C6D163D1), SPH_C64(0xA5E4570B41A5AEA5),
SPH_C64(0xE2A1D94D43E2AFE2), SPH_C64(0x614EC2F82F619961),
SPH_C64(0xB3427B45F1B3F6B3), SPH_C64(0x213442A515218421),
SPH_C64(0x9C0825D6949C4A9C), SPH_C64(0x1EEE3C66F01E781E),
SPH_C64(0x4361865222431143), SPH_C64(0xC7B193FC76C73BC7),
SPH_C64(0xFC4FE52BB3FCD7FC), SPH_C64(0x0424081420041004),
SPH_C64(0x51E3A208B2515951), SPH_C64(0x99252FC7BC995E99),
SPH_C64(0x6D22DAC44F6DA96D), SPH_C64(0x0D651A39680D340D),
SPH_C64(0xFA79E93583FACFFA), SPH_C64(0xDF69A384B6DF5BDF),
SPH_C64(0x7EA9FC9BD77EE57E), SPH_C64(0x241948B43D249024),
SPH_C64(0x3BFE76D7C53BEC3B), SPH_C64(0xAB9A4B3D31AB96AB),
SPH_C64(0xCEF081D13ECE1FCE), SPH_C64(0x1199225588114411),
SPH_C64(0x8F8303890C8F068F), SPH_C64(0x4E049C6B4A4E254E),
SPH_C64(0xB7667351D1B7E6B7), SPH_C64(0xEBE0CB600BEB8BEB),
SPH_C64(0x3CC178CCFD3CF03C), SPH_C64(0x81FD1FBF7C813E81),
SPH_C64(0x944035FED4946A94), SPH_C64(0xF71CF30CEBF7FBF7),
SPH_C64(0xB9186F67A1B9DEB9), SPH_C64(0x138B265F98134C13),
SPH_C64(0x2C51589C7D2CB02C), SPH_C64(0xD305BBB8D6D36BD3),
SPH_C64(0xE78CD35C6BE7BBE7), SPH_C64(0x6E39DCCB576EA56E),
SPH_C64(0xC4AA95F36EC437C4), SPH_C64(0x031B060F18030C03),
SPH_C64(0x56DCAC138A564556), SPH_C64(0x445E88491A440D44),
SPH_C64(0x7FA0FE9EDF7FE17F), SPH_C64(0xA9884F3721A99EA9),
SPH_C64(0x2A6754824D2AA82A), SPH_C64(0xBB0A6B6DB1BBD6BB),
SPH_C64(0xC1879FE246C123C1), SPH_C64(0x53F1A602A2535153),
SPH_C64(0xDC72A58BAEDC57DC), SPH_C64(0x0B531627580B2C0B),
SPH_C64(0x9D0127D39C9D4E9D), SPH_C64(0x6C2BD8C1476CAD6C),
SPH_C64(0x31A462F59531C431), SPH_C64(0x74F3E8B98774CD74),
SPH_C64(0xF615F109E3F6FFF6), SPH_C64(0x464C8C430A460546),
SPH_C64(0xACA5452609AC8AAC), SPH_C64(0x89B50F973C891E89),
SPH_C64(0x14B42844A0145014), SPH_C64(0xE1BADF425BE1A3E1),
SPH_C64(0x16A62C4EB0165816), SPH_C64(0x3AF774D2CD3AE83A),
SPH_C64(0x6906D2D06F69B969), SPH_C64(0x0941122D48092409),
SPH_C64(0x70D7E0ADA770DD70), SPH_C64(0xB66F7154D9B6E2B6),
SPH_C64(0xD01EBDB7CED067D0), SPH_C64(0xEDD6C77E3BED93ED),
SPH_C64(0xCCE285DB2ECC17CC), SPH_C64(0x426884572A421542),
SPH_C64(0x982C2DC2B4985A98), SPH_C64(0xA4ED550E49A4AAA4),
SPH_C64(0x287550885D28A028), SPH_C64(0x5C86B831DA5C6D5C),
SPH_C64(0xF86BED3F93F8C7F8), SPH_C64(0x86C211A444862286)
};
#endif /* !SPH_SMALL_FOOTPRINT_WHIRLPOOL */
/*
* Round constants.
*/
__device__ static const uint64_t plain_RC[10] = {
SPH_C64(0x4F01B887E8C62318),
SPH_C64(0x52916F79F5D2A636),
SPH_C64(0x357B0CA38E9BBC60),
SPH_C64(0x57FE4B2EC2D7E01D),
SPH_C64(0xDA4AF09FE5377715),
SPH_C64(0x856BA0B10A29C958),
SPH_C64(0x67053ECBF4105DBD),
SPH_C64(0xD8957DA78B4127E4),
SPH_C64(0x9E4717DD667CEEFB),
SPH_C64(0x33835AAD07BF2DCA)
};
/* ====================================================================== */
#if SPH_SMALL_FOOTPRINT_WHIRLPOOL
__device__ static uint64_t table_skew(uint64_t val, int num) {
return SPH_ROTL64(val, 8 * num);
}
#define BYTE(x, n) ((unsigned)((x) >> (8 * (n))) & 0xFF)
#define ROUND_ELT(table, in, i0, i1, i2, i3, i4, i5, i6, i7) \
(table ## 0[BYTE(in ## i0, 0)] \
^ table_skew(table ## 0[BYTE(in ## i1, 1)], 1) \
^ table_skew(table ## 0[BYTE(in ## i2, 2)], 2) \
^ table_skew(table ## 0[BYTE(in ## i3, 3)], 3) \
^ table_skew(table ## 0[BYTE(in ## i4, 4)], 4) \
^ table_skew(table ## 0[BYTE(in ## i5, 5)], 5) \
^ table_skew(table ## 0[BYTE(in ## i6, 6)], 6) \
^ table_skew(table ## 0[BYTE(in ## i7, 7)], 7))
#else
#define ROUND_ELT(table, in, i0, i1, i2, i3, i4, i5, i6, i7) \
(table ## 0[BYTE(in ## i0, 0)] \
^ table ## 1[BYTE(in ## i1, 1)] \
^ table ## 2[BYTE(in ## i2, 2)] \
^ table ## 3[BYTE(in ## i3, 3)] \
^ table ## 4[BYTE(in ## i4, 4)] \
^ table ## 5[BYTE(in ## i5, 5)] \
^ table ## 6[BYTE(in ## i6, 6)] \
^ table ## 7[BYTE(in ## i7, 7)])
#endif
#define ROUND(table, in, out, c0, c1, c2, c3, c4, c5, c6, c7) do { \
out ## 0 = ROUND_ELT(table, in, 0, 7, 6, 5, 4, 3, 2, 1) ^ c0; \
out ## 1 = ROUND_ELT(table, in, 1, 0, 7, 6, 5, 4, 3, 2) ^ c1; \
out ## 2 = ROUND_ELT(table, in, 2, 1, 0, 7, 6, 5, 4, 3) ^ c2; \
out ## 3 = ROUND_ELT(table, in, 3, 2, 1, 0, 7, 6, 5, 4) ^ c3; \
out ## 4 = ROUND_ELT(table, in, 4, 3, 2, 1, 0, 7, 6, 5) ^ c4; \
out ## 5 = ROUND_ELT(table, in, 5, 4, 3, 2, 1, 0, 7, 6) ^ c5; \
out ## 6 = ROUND_ELT(table, in, 6, 5, 4, 3, 2, 1, 0, 7) ^ c6; \
out ## 7 = ROUND_ELT(table, in, 7, 6, 5, 4, 3, 2, 1, 0) ^ c7; \
} while (0)
#define ROUND_KSCHED(table, in, out, c) \
ROUND(table, in, out, c, 0, 0, 0, 0, 0, 0, 0)
#define ROUND_WENC(table, in, key, out) \
ROUND(table, in, out, key ## 0, key ## 1, key ## 2, \
key ## 3, key ## 4, key ## 5, key ## 6, key ## 7)
#define TRANSFER(dst, src) do { \
dst ## 0 = src ## 0; \
dst ## 1 = src ## 1; \
dst ## 2 = src ## 2; \
dst ## 3 = src ## 3; \
dst ## 4 = src ## 4; \
dst ## 5 = src ## 5; \
dst ## 6 = src ## 6; \
dst ## 7 = src ## 7; \
} while (0)
#endif
/***************************************************/
// GPU Hash Function
__global__ void x15_whirlpool_gpu_hash_64(int threads, uint32_t startNounce, uint64_t *g_hash, uint32_t *g_nonceVector)
{
__syncthreads();
int thread = (blockDim.x * blockIdx.x + threadIdx.x);
if (thread < threads)
{
uint32_t nounce = (g_nonceVector != NULL) ? g_nonceVector[thread] : (startNounce + thread);
uint32_t hashPosition = nounce - startNounce;
uint64_t *hash = (g_hash + hashPosition);
#if NULLTEST
for (int i = 0; i < 8; i++)
hash[i] = 0;
#endif
// whirlpool
uint64_t n0, n1, n2, n3, n4, n5, n6, n7;
uint64_t h0, h1, h2, h3, h4, h5, h6, h7;
uint64_t state[8];
n0 = (hash[0]);
n1 = (hash[1]);
n2 = (hash[2]);
n3 = (hash[3]);
n4 = (hash[4]);
n5 = (hash[5]);
n6 = (hash[6]);
n7 = (hash[7]);
h0 = h1 = h2 = h3 = h4 = h5 = h6 = h7 = 0;
n0 ^= h0;
n1 ^= h1;
n2 ^= h2;
n3 ^= h3;
n4 ^= h4;
n5 ^= h5;
n6 ^= h6;
n7 ^= h7;
#pragma unroll 10
for (unsigned r = 0; r < 10; r++)
{
uint64_t tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
ROUND_KSCHED(plain_T, h, tmp, plain_RC[r]);
TRANSFER(h, tmp);
ROUND_WENC(plain_T, n, h, tmp);
TRANSFER(n, tmp);
}
state[0] = n0 ^ (hash[0]);
state[1] = n1 ^ (hash[1]);
state[2] = n2 ^ (hash[2]);
state[3] = n3 ^ (hash[3]);
state[4] = n4 ^ (hash[4]);
state[5] = n5 ^ (hash[5]);
state[6] = n6 ^ (hash[6]);
state[7] = n7 ^ (hash[7]);
n0 = 0x80;
n1 = n2 = n3 = n4 = n5 = n6 = 0;
n7 = 0x2000000000000;
h0 = state[0];
h1 = state[1];
h2 = state[2];
h3 = state[3];
h4 = state[4];
h5 = state[5];
h6 = state[6];
h7 = state[7];
n0 ^= h0;
n1 ^= h1;
n2 ^= h2;
n3 ^= h3;
n4 ^= h4;
n5 ^= h5;
n6 ^= h6;
n7 ^= h7;
#pragma unroll 10
for (unsigned r = 0; r < 10; r++)
{
uint64_t tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
ROUND_KSCHED(plain_T, h, tmp, plain_RC[r]);
TRANSFER(h, tmp);
ROUND_WENC(plain_T, n, h, tmp);
TRANSFER(n, tmp);
}
state[0] ^= n0 ^ 0x80;
state[1] ^= n1;
state[2] ^= n2;
state[3] ^= n3;
state[4] ^= n4;
state[5] ^= n5;
state[6] ^= n6;
state[7] ^= n7 ^ 0x2000000000000;
for (unsigned i = 0; i < 8; i++)
hash[i] = state[i];
// bool result = (hash[3] <= target);
}
}
__host__ void x15_whirlpool_cpu_init(int thr_id, int threads)
{
}
__host__ void x15_whirlpool_cpu_hash_64(int thr_id, int threads, uint32_t startNounce, uint32_t *d_nonceVector, uint32_t *d_hash, int order)
{
const int threadsperblock = 256;
dim3 grid((threads + threadsperblock - 1) / threadsperblock);
dim3 block(threadsperblock);
size_t shared_size = 0;
// fprintf(stderr, "threads=%d, %d blocks, %d threads per block, %d bytes shared\n", threads, grid.x, block.x, shared_size);
x15_whirlpool_gpu_hash_64<<<grid, block, shared_size>>>(threads, startNounce, (uint64_t*)d_hash, d_nonceVector);
MyStreamSynchronize(NULL, order, thr_id);
}