Код:
/ *
* Myriadcoin Groestl ядра реализации (Groestl-512 + SHA-256)
*
* ========================== (ЛИЦЕНЗИЯ НАЧАТЬ) =================== =========
*
* Copyright (с) 2007-2010 Томас Pornin
* Copyright (с) 2014 PhM
* Copyright (с) 2014-2015 Джон Деринг
*
* Разрешение Настоящим предоставляется бесплатно, любому лицу, приобретающему
* Копию этого программного обеспечения и связанных с ними файлов документации (
* "Программного обеспечения"), Чтобы иметь дело в Программное обеспечение без ограничений, в том числе
* Без ограничения права на использование, копирование, изменение, объединение, публикацию,
* Распространять, лицензировать и / или продавать копии программного обеспечения, и
* Разрешать лицам, которым Программное обеспечение мебелью, чтобы сделать это, при условии
* следующие условия:
*
* Приведенное выше уведомление об авторских правах и данное разрешение должно быть
* Включены во все копии или существенные части Программного обеспечения.
*
* ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ "КАК ЕСТЬ", БЕЗ КАКИХ,
* ЯВНЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ГАРАНТИИ
* КОММЕРЧЕСКОЙ ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ И ОТСУТСТВИЯ НАРУШЕНИЙ.
* НИ ПРИ ОБСТОЯТЕЛЬСТВАХ АВТОРЫ ИЛИ ПРАВООБЛАДАТЕЛИ ОТВЕТСТВЕННОСТИ ЗА
* ЗАЯВКА, ИЛИ УБЫТКИ, НЕЗАВИСИМО ОТ ДЕЙСТВИЯ ДОГОВОРА,
* ПРАВОНАРУШЕНИЯ ИЛИ ИНАЧЕ, ВОЗНИКАЮЩИЕ ИЗ, ИЛИ В СВЯЗИ С
* ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ИЛИ ИСПОЛЬЗОВАНИЕМ ИЛИ ИНЫМИ ДЕЙСТВИЯМИ НА ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ.
*
* =========================== (ЛИЦЕНЗИОННОЕ END) ================== ===========
* /
#ifndef MYRIADCOIN_GROESTL_CL
#define MYRIADCOIN_GROESTL_CL
#if __ENDIAN_LITTLE__
#define SPH_LITTLE_ENDIAN 1
#else
#define SPH_BIG_ENDIAN 1
#endif
#define С32 (а) ((UINT) (а ## U))
#define Т32 (а) (as_uint (а))
#define ROTL32 (а, б) поворот (as_uint (а), as_uint (б))
#define ROTR32 (а, б) ROTL32 (а, (32 - (б)))
#define С64 (а) ((ULONG) (а ## UL))
#define T64 (а) (as_ulong (а))
#undef USE_LE
#if SPH_GROESTL_LITTLE_ENDIAN
#define USE_LE 1
#elif SPH_GROESTL_BIG_ENDIAN
#define USE_LE 0
#elif SPH_LITTLE_ENDIAN
#define USE_LE 1
#endif
#if USE_LE
#define C64e (х) ((С64 (х) >> 56) \
| ((С64 (х) >> 40) & C64 (0x000000000000FF00)) \
| ((С64 (х) >> 24) & C64 (0x0000000000FF0000)) \
| ((С64 (х) >> 8) & C64 (0x00000000FF000000)) \
| ((С64 (х) << 8) & C64 (0x000000FF00000000)) \
| ((С64 (х) << 24) & C64 (0x0000FF0000000000)) \
| ((С64 (х) << 40) & C64 (0x00FF000000000000)) \
| ((С64 (х) << 56) & С64 (0xFF00000000000000)))
#define B64_0 (х) ((х) & 0xFF)
#define B64_1 (х) (((х) >> 8) & 0xFF)
#define B64_2 (х) (((х) >> 16) & 0xFF)
#define B64_3 (х) (((х) >> 24) & 0xFF)
#define B64_4 (х) (((х) >> 32) & 0xFF)
#define B64_5 (х) (((х) >> 40) & 0xFF)
#define B64_6 (х) (((х) >> 48) & 0xFF)
#define B64_7 (х) ((х) >> 56)
#define PC64 (к, г) ((ULONG) ((J) + (г)))
#define QC64 (к, г) (((ULONG) (г) << 56) ^ T64 (~ ((ULONG) (к) << 56)))
#define Н15 (((ULONG) (512 & 0xFF) << 56) | ((ULONG) (512 & 0xFF00) << 40))
#else
#define C64e (х) С64 (х)
#define B64_0 (х) ((х) >> 56)
#define B64_1 (х) (((х) >> 48) & 0xFF)
#define B64_2 (х) (((х) >> 40) & 0xFF)
#define B64_3 (х) (((х) >> 32) & 0xFF)
#define B64_4 (х) (((х) >> 24) & 0xFF)
#define B64_5 (х) (((х) >> 16) & 0xFF)
#define B64_6 (х) (((х) >> 8) & 0xFF)
#define B64_7 (х) ((х) & 0xFF)
#define PC64 (к, г) ((ULONG) ((J) + (г)) << 56)
#define QC64 (J, г) ((ULONG) (г) ^ T64 (~ (ULONG) (J)))
#define Н15 (ULONG) 512
#endif
#define M15 0x100000000000000
__constant ULONG Т0 [] = {
C64e (0xc632f4a5f497a5c6), C64e (0xf86f978497eb84f8),
C64e (0xee5eb099b0c799ee), C64e (0xf67a8c8d8cf78df6),
C64e (0xffe8170d17e50dff), C64e (0xd60adcbddcb7bdd6),
C64e (0xde16c8b1c8a7b1de), C64e (0x916dfc54fc395491),
C64e (0x6090f050f0c05060), C64e (0x0207050305040302),
C64e (0xce2ee0a9e087a9ce), C64e (0x56d1877d87ac7d56),
C64e (0xe7cc2b192bd519e7), C64e (0xb513a662a67162b5),
C64e (0x4d7c31e6319ae64d), C64e (0xec59b59ab5c39aec),
C64e (0x8f40cf45cf05458f), C64e (0x1fa3bc9dbc3e9d1f),
C64e (0x8949c040c0094089), C64e (0xfa68928792ef87fa),
C64e (0xefd03f153fc515ef), C64e (0xb29426eb267febb2),
C64e (0x8ece40c94007c98e), C64e (0xfbe61d0b1ded0bfb),
C64e (0x416e2fec2f82ec41), C64e (0xb31aa967a97d67b3),
C64e (0x5f431cfd1cbefd5f), C64e (0x456025ea258aea45),
C64e (0x23f9dabfda46bf23), C64e (0x535102f702a6f753),
C64e (0xe445a196a1d396e4), C64e (0x9b76ed5bed2d5b9b),
C64e (0x75285dc25deac275), C64e (0xe1c5241c24d91ce1),
C64e (0x3dd4e9aee97aae3d), C64e (0x4cf2be6abe986a4c),
C64e (0x6c82ee5aeed85a6c), C64e (0x7ebdc341c3fc417e),
C64e (0xf5f3060206f102f5), C64e (0x8352d14fd11d4f83),
C64e (0x688ce45ce4d05c68), C64e (0x515607f407a2f451),
C64e (0xd18d5c345cb934d1), C64e (0xf9e1180818e908f9),
C64e (0xe24cae93aedf93e2), C64e (0xab3e9573954d73ab),
C64e (0x6297f553f5c45362), C64e (0x2a6b413f41543f2a),
C64e (0x081c140c14100c08), C64e (0x9563f652f6315295),
C64e (0x46e9af65af8c6546), C64e (0x9d7fe25ee2215e9d),
C64e (0x3048782878602830), C64e (0x37cff8a1f86ea137),
C64e (0x0a1b110f11140f0a), C64e (0x2febc4b5c45eb52f),
C64e (0x0e151b091b1c090e), C64e (0x247e5a365a483624),
C64e (0x1badb69bb6369b1b), C64e (0xdf98473d47a53ddf),
C64e (0xcda76a266a8126cd), C64e (0x4ef5bb69bb9c694e),
C64e (0x7f334ccd4cfecd7f), C64e (0xea50ba9fbacf9fea),
C64e (0x123f2d1b2d241b12), C64e (0x1da4b99eb93a9e1d),
C64e (0x58c49c749cb07458), C64e (0x3446722e72682e34),
C64e (0x3641772d776c2d36), C64e (0xdc11cdb2cda3b2dc),
C64e (0xb49d29ee2973eeb4), C64e (0x5b4d16fb16b6fb5b),
C64e (0xa4a501f60153f6a4), C64e (0x76a1d74dd7ec4d76),
C64e (0xb714a361a37561b7), C64e (0x7d3449ce49face7d),
C64e (0x52df8d7b8da47b52), C64e (0xdd9f423e42a13edd),
C64e (0x5ecd937193bc715e), C64e (0x13b1a297a2269713),
C64e (0xa6a204f50457f5a6), C64e (0xb901b868b86968b9),
C64e (0x0000000000000000), C64e (0xc1b5742c74992cc1),
C64e (0x40e0a060a0806040), C64e (0xe3c2211f21dd1fe3),
C64e (0x793a43c843f2c879), C64e (0xb69a2ced2c77edb6),
C64e (0xd40dd9bed9b3bed4), C64e (0x8d47ca46ca01468d),
C64e (0x671770d970ced967), C64e (0x72afdd4bdde44b72),
C64e (0x94ed79de7933de94), C64e (0x98ff67d4672bd498),
C64e (0xb09323e8237be8b0), C64e (0x855bde4ade114a85),
C64e (0xbb06bd6bbd6d6bbb), C64e (0xc5bb7e2a7e912ac5),
C64e (0x4f7b34e5349ee54f), C64e (0xedd73a163ac116ed),
C64e (0x86d254c55417c586), C64e (0x9af862d7622fd79a),
C64e (0x6699ff55ffcc5566), C64e (0x11b6a794a7229411),
C64e (0x8ac04acf4a0fcf8a), C64e (0xe9d9301030c910e9),
C64e (0x040e0a060a080604), C64e (0xfe66988198e781fe),
C64e (0xa0ab0bf00b5bf0a0), C64e (0x78b4cc44ccf04478),
C64e (0x25f0d5bad54aba25), C64e (0x4b753ee33e96e34b),
C64e (0xa2ac0ef30e5ff3a2), C64e (0x5d4419fe19bafe5d),
C64e (0x80db5bc05b1bc080), C64e (0x0580858a850a8a05),
C64e (0x3fd3ecadec7ead3f), C64e (0x21fedfbcdf42bc21),
C64e (0x70a8d848d8e04870), C64e (0xf1fd0c040cf904f1),
C64e (0x63197adf7ac6df63), C64e (0x772f58c158eec177),
C64e (0xaf309f759f4575af), C64e (0x42e7a563a5846342),
C64e (0x2070503050403020), C64e (0xe5cb2e1a2ed11ae5),
C64e (0xfdef120e12e10efd), C64e (0xbf08b76db7656dbf),
C64e (0x8155d44cd4194c81), C64e (0x18243c143c301418),
C64e (0x26795f355f4c3526), C64e (0xc3b2712f719d2fc3),
C64e (0xbe8638e13867e1be), C64e (0x35c8fda2fd6aa235),
C64e (0x88c74fcc4f0bcc88), C64e (0x2e654b394b5c392e),
C64e (0x936af957f93d5793), C64e (0x55580df20daaf255),
C64e (0xfc619d829de382fc), C64e (0x7ab3c947c9f4477a),
C64e (0xc827efacef8bacc8), C64e (0xba8832e7326fe7ba),
C64e (0x324f7d2b7d642b32), C64e (0xe642a495a4d795e6),
C64e (0xc03bfba0fb9ba0c0), C64e (0x19aab398b3329819),
C64e (0x9ef668d16827d19e), C64e (0xa322817f815d7fa3),
C64e (0x44eeaa66aa886644), C64e (0x54d6827e82a87e54),
C64e (0x3bdde6abe676ab3b), C64e (0x0b959e839e16830b),
C64e (0x8cc945ca4503ca8c), C64e (0xc7bc7b297b9529c7),
C64e (0x6b056ed36ed6d36b), C64e (0x286c443c44503c28),
C64e (0xa72c8b798b5579a7), C64e (0xbc813de23d63e2bc),
C64e (0x1631271d272c1d16), C64e (0xad379a769a4176ad),
C64e (0xdb964d3b4dad3bdb), C64e (0x649efa56fac85664),
C64e (0x74a6d24ed2e84e74), C64e (0x1436221e22281e14),
C64e (0x92e476db763fdb92), C64e (0x0c121e0a1e180a0c),
C64e (0x48fcb46cb4906c48), C64e (0xb88f37e4376be4b8),
C64e (0x9f78e75de7255d9f), C64e (0xbd0fb26eb2616ebd),
C64e (0x43692aef2a86ef43), C64e (0xc435f1a6f193a6c4),
C64e (0x39dae3a8e372a839), C64e (0x31c6f7a4f762a431),
C64e (0xd38a593759bd37d3), C64e (0xf274868b86ff8bf2),
C64e (0xd583563256b132d5), C64e (0x8b4ec543c50d438b),
C64e (0x6e85eb59ebdc596e), C64e (0xda18c2b7c2afb7da),
C64e (0x018e8f8c8f028c01), C64e (0xb11dac64ac7964b1),
C64e (0x9cf16dd26d23d29c), C64e (0x49723be03b92e049),
C64e (0xd81fc7b4c7abb4d8), C64e (0xacb915fa1543faac),
C64e (0xf3fa090709fd07f3), C64e (0xcfa06f256f8525cf),
C64e (0xca20eaafea8fafca), C64e (0xf47d898e89f38ef4),
C64e (0x476720e9208ee947), C64e (0x1038281828201810),
C64e (0x6f0b64d564ded56f), C64e (0xf073838883fb88f0),
C64e (0x4afbb16fb1946f4a), C64e (0x5cca967296b8725c),
C64e (0x38546c246c702438), C64e (0x575f08f108aef157),
C64e (0x732152c752e6c773), C64e (0x9764f351f3355197),
C64e (0xcbae6523658d23cb), C64e (0xa125847c84597ca1),
C64e (0xe857bf9cbfcb9ce8), C64e (0x3e5d6321637c213e),
C64e (0x96ea7cdd7c37dd96), C64e (0x611e7fdc7fc2dc61),
C64e (0x0d9c9186911a860d), C64e (0x0f9b9485941e850f),
C64e (0xe04bab90abdb90e0), C64e (0x7cbac642c6f8427c),
C64e (0x712657c457e2c471), C64e (0xcc29e5aae583aacc),
C64e (0x90e373d8733bd890), C64e (0x06090f050f0c0506),
C64e (0xf7f4030103f501f7), C64e (0x1c2a36123638121c),
C64e (0xc23cfea3fe9fa3c2), C64e (0x6a8be15fe1d45f6a),
C64e (0xaebe10f91047f9ae), C64e (0x69026bd06bd2d069),
C64e (0x17bfa891a82e9117), C64e (0x9971e858e8295899),
C64e (0x3a5369276974273a), C64e (0x27f7d0b9d04eb927),
C64e (0xd991483848a938d9), C64e (0xebde351335cd13eb),
C64e (0x2be5ceb3ce56b32b), C64e (0x2277553355443322),
C64e (0xd204d6bbd6bfbbd2), C64e (0xa9399070904970a9),
C64e (0x07878089800e8907), C64e (0x33c1f2a7f266a733),
C64e (0x2decc1b6c15ab62d), C64e (0x3c5a66226678223c),
C64e (0x15b8ad92ad2a9215), C64e (0xc9a96020608920c9),
C64e (0x875cdb49db154987), C64e (0xaab01aff1a4fffaa),
C64e (0x50d8887888a07850), C64e (0xa52b8e7a8e517aa5),
C64e (0x03898a8f8a068f03), C64e (0x594a13f813b2f859),
C64e (0x09929b809b128009), C64e (0x1a2339173934171a),
C64e (0x651075da75cada65), C64e (0xd784533153b531d7),
C64e (0x84d551c65113c684), C64e (0xd003d3b8d3bbb8d0),
C64e (0x82dc5ec35e1fc382), C64e (0x29e2cbb0cb52b029),
C64e (0x5ac3997799b4775a), C64e (0x1e2d3311333c111e),
C64e (0x7b3d46cb46f6cb7b), C64e (0xa8b71ffc1f4bfca8),
C64e (0x6d0c61d661dad66d), C64e (0x2c624e3a4e583a2c)
};
#define РБТТ (д, а, b0, b1, b2, b3, b4, b5, b6, b7) делают {\
т [D] = Т0 [B64_0 (а [b0])] \
^ Т1 [B64_1 (а [б1])] \
^ Т2 [B64_2 (а [б2])] \
^ T3 [B64_3 (а [b3])] \
^ T4 [B64_4 (а [b4])] \
^ T5 [B64_5 (а [b5])] \
^ T6 [B64_6 (а [b6])] \
^ Т7 [B64_7 (а [B7])]; \
} В то время как (0)
#define ROUND_BIG_P (а, г) делают {\
а [0] ^ = PC64 (0x00, г); \
а [1] ^ = PC64 (0x10, г); \
а [2] ^ = PC64 (0x20, г); \
а [3] ^ = PC64 (0x30, г); \
а [4] ^ = PC64 (0x40, г); \
а [5] ^ = PC64 (0x50, г); \
а [6] ^ = PC64 (0x60, г); \
а [7] ^ = PC64 (0x70, г); \
а [8] ^ = PC64 (0x80, г); \
а [9] ^ = PC64 (0x90, г); \
а [10] ^ = PC64 (0xA0, г); \
а [11] ^ = PC64 (0xB0, г); \
а [12] ^ = PC64 (0xC0, г); \
а [13] ^ = PC64 (0xD0, г); \
а [14] ^ = PC64 (0xE0, г); \
а [15] ^ = PC64 (0xF0, г); \
РБТТ (0, а, 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0xB); \
РБТТ (1, а, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0xC); \
РБТТ (2, а, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0xD); \
РБТТ (3, а, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xE); \
РБТТ (4, а, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0xF); \
РБТТ (5, а, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0xB, 0x0); \
РБТТ (6, а, 0x6, 0x7, 0x8, 0x9, 0xA, 0xB, 0xC, 0x1); \
РБТТ (7, а, 0x7, 0x8, 0x9, 0xA, 0xB, 0xC, 0xD, 0x2); \
РБТТ (8, а, 0x8, 0x9, 0xA, 0xB, 0xC, 0xD, 0xE, 0x3); \
РБТТ (9, а, 0x9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF, 0x4); \
РБТТ (10, а, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF, 0x0, 0x5); \
РБТТ (11, а, 0xB, 0xC, 0xD, 0xE, 0xF, 0x0, 0x1, 0x6); \
РБТТ (12, а, 0xC, 0xD, 0xE, 0xF, 0x0, 0x1, 0x2, 0x7); \
РБТТ (13, а, 0xD, 0xE, 0xF, 0x0, 0x1, 0x2, 0x3, 0x8); \
РБТТ (14, а, 0xE, 0xF, 0x0, 0x1, 0x2, 0x3, 0x4, 0x9); \
РБТТ (15, а, 0xF, 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0xA); \
а [0] = т [0]; \
а [1] = т [1]; \
а [2] = т [2]; \
а [3] = т [3]; \
а [4] = т [4]; \
а [5] = т [5]; \
а [6] = т [6]; \
а [7] = т [7]; \
а [8] = т [8]; \
а [9] = т [9]; \
а [10] = т [10]; \
а [11] = т [11]; \
а [12] = т [12]; \
[13] = т [13]; \
а [14] = т [14]; \
а [15] = т [15]; \
} В то время как (0)
#define ROUND_BIG_Q (а, г) делают {\
а [0] ^ = QC64 (0x00, г); \
а [1] ^ = QC64 (0x10, г); \
а [2] ^ = QC64 (0x20, г); \
а [3] ^ = QC64 (0x30, г); \
а [4] ^ = QC64 (0x40, г); \
а [5] ^ = QC64 (0x50, г); \
а [6] ^ = QC64 (0x60, г); \
а [7] ^ = QC64 (0x70, г); \
а [8] ^ = QC64 (0x80, г); \
а [9] ^ = QC64 (0x90, г); \
а [10] ^ = QC64 (0xA0, г); \
а [11] ^ = QC64 (0xB0, г); \
а [12] ^ = QC64 (0xC0, г); \
а [13] ^ = QC64 (0xD0, г); \
а [14] ^ = QC64 (0xE0, г); \
а [15] ^ = QC64 (0xF0, г); \
РБТТ (0x0, а, 0x1, 0x3, 0x5, 0xB, 0x0, 0x2, 0x4, 0x6); \
РБТТ (0x1, а, 0x2, 0x4, 0x6, 0xC, 0x1, 0x3, 0x5, 0x7); \
РБТТ (0x2, а, 0x3, 0x5, 0x7, 0xD, 0x2, 0x4, 0x6, 0x8); \
РБТТ (0х3, а, 0x4, 0x6, 0x8, 0xE, 0x3, 0x5, 0x7, 0x9); \
РБТТ (0х4, а, 0x5, 0x7, 0x9, 0xF, 0x4, 0x6, 0x8, 0xA); \
РБТТ (0x5, а, 0x6, 0x8, 0xA, 0x0, 0x5, 0x7, 0x9, 0xB); \
РБТТ (0x6, а, 0x7, 0x9, 0xB, 0x1, 0x6, 0x8, 0xA, 0xC); \
РБТТ (0x7, а, 0x8, 0xA, 0xC, 0x2, 0x7, 0x9, 0xB, 0xD); \
РБТТ (0x8, а, 0x9, 0xB, 0xD, 0x3, 0x8, 0xA, 0xC, 0xE); \
РБТТ (0x9, а, 0xA, 0xC, 0xE, 0x4, 0x9, 0xB, 0xD, 0xF); \
РБТТ (0xA, а, 0xB, 0xD, 0xF, 0x5, 0xA, 0xC, 0xE, 0x0); \
РБТТ (0xB, а, 0xC, 0xE, 0x0, 0x6, 0xB, 0xD, 0xF, 0x1); \
РБТТ (0xC, а, 0xD, 0xF, 0x1, 0x7, 0xC, 0xE, 0x0, 0x2); \
РБТТ (0xD, а, 0xE, 0x0, 0x2, 0x8, 0xD, 0xF, 0x1, 0x3); \
РБТТ (0xE, а, 0xF, 0x1, 0x3, 0x9, 0xE, 0x0, 0x2, 0x4); \
РБТТ (0xF, а, 0x0, 0x2, 0x4, 0xA, 0xF, 0x1, 0x3, 0x5); \
а [0] = т [0]; \
а [1] = т [1]; \
а [2] = т [2]; \
а [3] = т [3]; \
а [4] = т [4]; \
а [5] = т [5]; \
а [6] = т [6]; \
а [7] = т [7]; \
а [8] = т [8]; \
а [9] = т [9]; \
а [10] = т [10]; \
а [11] = т [11]; \
а [12] = т [12]; \
[13] = т [13]; \
а [14] = т [14]; \
а [15] = т [15]; \
} В то время как (0)
#define SWAP4 (х) as_uint (as_uchar4 (х) .wzyx)
#define SWAP8 (х) as_ulong (as_uchar8 (х) .s76543210)
#if SPH_BIG_ENDIAN
#define ENC64E (х) SWAP8 (х)
#define DEC64E (х) SWAP8 (* (Const Подружился ULONG *) (х));
#else
#define ENC64E (х) (х)
#define DEC64E (х) (* (Const Подружился ULONG *) (х));
#endif
#define ШР (х, п) ((х) >> п)
#define SWAP32 (а) (as_uint (as_uchar4 (а) .wzyx))
#define S0 (х) (ROTL32 (х, 25) ^ ROTL32 (х, 14) ^ ШР (х, 3))
#define S1 (х) (ROTL32 (х, 15) ^ ROTL32 (х, 13) ^ ШР (х, 10))
#define S2 (х) (ROTL32 (х, 30) ^ ROTL32 (х, 19) ^ ROTL32 (х, 10))
#define S3 (х) (ROTL32 (х, 26) ^ ROTL32 (х, 21) ^ ROTL32 (х, 7))
#define Р (а, б, в, г, д, е, ж, з, х, К) {\
Темп = А + S3, (е) + F1 (д, е, ж) + (К + х); \
D + = темп; ч = темп + S2 (а) + Р0 (а, б, в); \
}
#define PLAST (а, б, в, г, д, е, ж, з, х, К) {\
D + = H + S3 (е) + F1 (д, е, ж) + (х + К); \
}
#define Р0 (у, х, г) bitselect (х, у, г ^ х)
#define F1 (х, у, г) bitselect (х, у, х)
#define R0 (W0 = S1 (W14) + W9 + S0 (W1) + W0)
#define R1 (W1 = S1 (W15) + W10 + S0 (W2) + W1)
#define R2 (W2 = S1 (W0) + W11 + S0 (W3) + W2)
#define R3 (W3 = S1 (W1) + W12 + S0 (W4) + W3)
#define R4 (W4 = S1 (W2) + W13 + S0 (W5) + W4)
#define R5 (W5 = S1 (W3) + W14 + S0 (W6) + W5)
#define R6 (W6 = S1 (W4) + W15 + S0 (W7) + W6)
#define R7 (W7 = S1 (W5) + W0 + S0 (W8) + W7)
#define R8 (W8 = S1 (W6) + W1 + S0 (W9) + W8)
#define R9 (W9 = S1 (W7) + W2 + S0 (W10) + W9)
#define R10 (W10 = S1 (W8) + W3 + S0 (W11) + W10)
#define R 11 (W11 = S1 (W9) + W4 + S0 (W12) + W11)
#define R12 (W12 = S1 (W10) + W5 + S0 (W13) + W12)
#define R13 (W13 = S1 (W11) + W6 + S0 (W14) + W13)
#define R14 (W14 = S1 (W12) + W7 + S0 (W15) + W14)
#define R15 (W15 = S1 (W13) + W8 + S0 (W0) + W15)
#define RD14 (S1 (W12) + W7 + S0 (W15) + W14)
#define RD15 (S1 (W13) + W8 + S0 (W0) + W15)
__kernel __attribute __ ((vec_type_hint (uint4)))
__kernel __attribute __ ((reqd_work_group_size (WORKSIZE, 1, 1)))
__kernel недействительным поиска (__ глобального неподписанного символ * блок, летучий Подружился UINT * выход,
Const ULONG мишень)
UINT glbid = get_global_id (0);
UINT lclid = get_local_id (0);
ULONG г;
UINT I;
/ * Groestl-512 * /
__private ulong16 GMT [3];
ULONG * г = (ULONG *) &Текущее время: [0];
ULONG * т = (ULONG *) &Текущее время: [1];
ULONG * т = (ULONG *) &GMT [2];
__local ULONG T0_L [256], T1_L [256], T2_L [256], T3_L [256],
T4_L [256], T5_L [256], T6_L [256], T7_L [256];
/ * Вычисляет таблицу * /
#if (WORKSIZE == 64)
T0_L [lclid] = Т0 [lclid];
T0_L [lclid + 64] = Т0 [lclid + 64];
T0_L [lclid + 128] = Т0 [lclid + 128];
T0_L [lclid + 192] = Т0 [lclid + 192];
T1_L [lclid] = повернуть (T0 [lclid], 8UL);
T1_L [lclid + 64] = вращаться (Т0 [lclid + 64], 8UL);
T1_L [lclid + 128] = поворот (Т0 [lclid + 128], 8UL);
T1_L [lclid + 192] = поворот (Т0 [lclid + 192], 8UL);
T2_L [lclid] = повернуть (T0 [lclid], 16UL);
T2_L [lclid + 64] = вращаться (Т0 [lclid + 64], 16UL);
T2_L [lclid + 128] = поворот (Т0 [lclid + 128], 16UL);
T2_L [lclid + 192] = поворот (Т0 [lclid + 192], 16UL);
T3_L [lclid] = повернуть (T0 [lclid], 24UL);
T3_L [lclid + 64] = вращаться (Т0 [lclid + 64], 24UL);
T3_L [lclid + 128] = поворот (Т0 [lclid + 128], 24UL);
T3_L [lclid + 192] = поворот (Т0 [lclid + 192], 24UL);
T4_L [lclid] = повернуть (T0 [lclid], 32UL);
T4_L [lclid + 64] = вращаться (Т0 [lclid + 64], 32UL);
T4_L [lclid + 128] = поворот (Т0 [lclid + 128], 32UL);
T4_L [lclid + 192] = поворот (Т0 [lclid + 192], 32UL);
T5_L [lclid] = повернуть (T0 [lclid], 40UL);
T5_L [lclid + 64] = вращаться (Т0 [lclid + 64], 40UL);
T5_L [lclid + 128] = поворот (Т0 [lclid + 128], 40UL);
T5_L [lclid + 192] = поворот (Т0 [lclid + 192], 40UL);
T6_L [lclid] = повернуть (T0 [lclid], 48UL);
T6_L [lclid + 64] = вращаться (Т0 [lclid + 64], 48UL);
T6_L [lclid + 128] = поворот (Т0 [lclid + 128], 48UL);
T6_L [lclid + 192] = поворот (Т0 [lclid + 192], 48UL);
T7_L [lclid] = повернуть (T0 [lclid], 56UL);
T7_L [lclid + 64] = вращаться (Т0 [lclid + 64], 56UL);
T7_L [lclid + 128] = поворот (Т0 [lclid + 128], 56UL);
T7_L [lclid + 192] = поворот (Т0 [lclid + 192], 56UL);
#elif (WORKSIZE == 128)
T0_L [lclid] = Т0 [lclid];
T0_L [lclid + 128] = Т0 [lclid + 128];
T1_L [lclid] = повернуть (T0 [lclid], 8UL);
T1_L [lclid + 128] = поворот (Т0 [lclid + 128], 8UL);
T2_L [lclid] = повернуть (T0 [lclid], 16UL);
T2_L [lclid + 128] = поворот (Т0 [lclid + 128], 16UL);
T3_L [lclid] = повернуть (T0 [lclid], 24UL);
T3_L [lclid + 128] = поворот (Т0 [lclid + 128], 24UL);
T4_L [lclid] = повернуть (T0 [lclid], 32UL);
T4_L [lclid + 128] = поворот (Т0 [lclid + 128], 32UL);
T5_L [lclid] = повернуть (T0 [lclid], 40UL);
T5_L [lclid + 128] = поворот (Т0 [lclid + 128], 40UL);
T6_L [lclid] = повернуть (T0 [lclid], 48UL);
T6_L [lclid + 128] = поворот (Т0 [lclid + 128], 48UL);
T7_L [lclid] = повернуть (T0 [lclid], 56UL);
T7_L [lclid + 128] = поворот (Т0 [lclid + 128], 56UL);
#elif (WORKSIZE == 256)
T0_L [lclid] = Т0 [lclid];
T1_L [lclid] = повернуть (T0 [lclid], 8UL);
T2_L [lclid] = повернуть (T0 [lclid], 16UL);
T3_L [lclid] = повернуть (T0 [lclid], 24UL);
T4_L [lclid] = повернуть (T0 [lclid], 32UL);
T5_L [lclid] = повернуть (T0 [lclid], 40UL);
T6_L [lclid] = повернуть (T0 [lclid], 48UL);
T7_L [lclid] = повернуть (T0 [lclid], 56UL);
#else
вернуть;
#endif
#define T0 T0_L
#define Т1 T1_L
#define Т2 T2_L
#define T3 T3_L
#define T4 T4_L
#define T5 T5_L
#define T6 T6_L
#define T7 T7_L
м [0] = DEC64E (блок);
м [1] = DEC64E (блок + 8);
м [2] = DEC64E (блок + 16);
м [3] = DEC64E (блок + 24);
м [4] = DEC64E (блок + 32);
м [5] = DEC64E (блок + 40);
м [6] = DEC64E (блок + 48);
м [7] = DEC64E (блок + 56);
м [8] = DEC64E (блок + 64);
м [9] = DEC64E (блок + 72);
м [9] &= 0x00000000FFFFFFFF;
м [9]
#endif / * MYRIADCOIN_GROESTL_CL * /
* Myriadcoin Groestl ядра реализации (Groestl-512 + SHA-256)
*
* ========================== (ЛИЦЕНЗИЯ НАЧАТЬ) =================== =========
*
* Copyright (с) 2007-2010 Томас Pornin
* Copyright (с) 2014 PhM
* Copyright (с) 2014-2015 Джон Деринг
*
* Разрешение Настоящим предоставляется бесплатно, любому лицу, приобретающему
* Копию этого программного обеспечения и связанных с ними файлов документации (
* "Программного обеспечения"), Чтобы иметь дело в Программное обеспечение без ограничений, в том числе
* Без ограничения права на использование, копирование, изменение, объединение, публикацию,
* Распространять, лицензировать и / или продавать копии программного обеспечения, и
* Разрешать лицам, которым Программное обеспечение мебелью, чтобы сделать это, при условии
* следующие условия:
*
* Приведенное выше уведомление об авторских правах и данное разрешение должно быть
* Включены во все копии или существенные части Программного обеспечения.
*
* ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ "КАК ЕСТЬ", БЕЗ КАКИХ,
* ЯВНЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ГАРАНТИИ
* КОММЕРЧЕСКОЙ ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ И ОТСУТСТВИЯ НАРУШЕНИЙ.
* НИ ПРИ ОБСТОЯТЕЛЬСТВАХ АВТОРЫ ИЛИ ПРАВООБЛАДАТЕЛИ ОТВЕТСТВЕННОСТИ ЗА
* ЗАЯВКА, ИЛИ УБЫТКИ, НЕЗАВИСИМО ОТ ДЕЙСТВИЯ ДОГОВОРА,
* ПРАВОНАРУШЕНИЯ ИЛИ ИНАЧЕ, ВОЗНИКАЮЩИЕ ИЗ, ИЛИ В СВЯЗИ С
* ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ИЛИ ИСПОЛЬЗОВАНИЕМ ИЛИ ИНЫМИ ДЕЙСТВИЯМИ НА ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ.
*
* =========================== (ЛИЦЕНЗИОННОЕ END) ================== ===========
* /
#ifndef MYRIADCOIN_GROESTL_CL
#define MYRIADCOIN_GROESTL_CL
#if __ENDIAN_LITTLE__
#define SPH_LITTLE_ENDIAN 1
#else
#define SPH_BIG_ENDIAN 1
#endif
#define С32 (а) ((UINT) (а ## U))
#define Т32 (а) (as_uint (а))
#define ROTL32 (а, б) поворот (as_uint (а), as_uint (б))
#define ROTR32 (а, б) ROTL32 (а, (32 - (б)))
#define С64 (а) ((ULONG) (а ## UL))
#define T64 (а) (as_ulong (а))
#undef USE_LE
#if SPH_GROESTL_LITTLE_ENDIAN
#define USE_LE 1
#elif SPH_GROESTL_BIG_ENDIAN
#define USE_LE 0
#elif SPH_LITTLE_ENDIAN
#define USE_LE 1
#endif
#if USE_LE
#define C64e (х) ((С64 (х) >> 56) \
| ((С64 (х) >> 40) & C64 (0x000000000000FF00)) \
| ((С64 (х) >> 24) & C64 (0x0000000000FF0000)) \
| ((С64 (х) >> 8) & C64 (0x00000000FF000000)) \
| ((С64 (х) << 8) & C64 (0x000000FF00000000)) \
| ((С64 (х) << 24) & C64 (0x0000FF0000000000)) \
| ((С64 (х) << 40) & C64 (0x00FF000000000000)) \
| ((С64 (х) << 56) & С64 (0xFF00000000000000)))
#define B64_0 (х) ((х) & 0xFF)
#define B64_1 (х) (((х) >> 8) & 0xFF)
#define B64_2 (х) (((х) >> 16) & 0xFF)
#define B64_3 (х) (((х) >> 24) & 0xFF)
#define B64_4 (х) (((х) >> 32) & 0xFF)
#define B64_5 (х) (((х) >> 40) & 0xFF)
#define B64_6 (х) (((х) >> 48) & 0xFF)
#define B64_7 (х) ((х) >> 56)
#define PC64 (к, г) ((ULONG) ((J) + (г)))
#define QC64 (к, г) (((ULONG) (г) << 56) ^ T64 (~ ((ULONG) (к) << 56)))
#define Н15 (((ULONG) (512 & 0xFF) << 56) | ((ULONG) (512 & 0xFF00) << 40))
#else
#define C64e (х) С64 (х)
#define B64_0 (х) ((х) >> 56)
#define B64_1 (х) (((х) >> 48) & 0xFF)
#define B64_2 (х) (((х) >> 40) & 0xFF)
#define B64_3 (х) (((х) >> 32) & 0xFF)
#define B64_4 (х) (((х) >> 24) & 0xFF)
#define B64_5 (х) (((х) >> 16) & 0xFF)
#define B64_6 (х) (((х) >> 8) & 0xFF)
#define B64_7 (х) ((х) & 0xFF)
#define PC64 (к, г) ((ULONG) ((J) + (г)) << 56)
#define QC64 (J, г) ((ULONG) (г) ^ T64 (~ (ULONG) (J)))
#define Н15 (ULONG) 512
#endif
#define M15 0x100000000000000
__constant ULONG Т0 [] = {
C64e (0xc632f4a5f497a5c6), C64e (0xf86f978497eb84f8),
C64e (0xee5eb099b0c799ee), C64e (0xf67a8c8d8cf78df6),
C64e (0xffe8170d17e50dff), C64e (0xd60adcbddcb7bdd6),
C64e (0xde16c8b1c8a7b1de), C64e (0x916dfc54fc395491),
C64e (0x6090f050f0c05060), C64e (0x0207050305040302),
C64e (0xce2ee0a9e087a9ce), C64e (0x56d1877d87ac7d56),
C64e (0xe7cc2b192bd519e7), C64e (0xb513a662a67162b5),
C64e (0x4d7c31e6319ae64d), C64e (0xec59b59ab5c39aec),
C64e (0x8f40cf45cf05458f), C64e (0x1fa3bc9dbc3e9d1f),
C64e (0x8949c040c0094089), C64e (0xfa68928792ef87fa),
C64e (0xefd03f153fc515ef), C64e (0xb29426eb267febb2),
C64e (0x8ece40c94007c98e), C64e (0xfbe61d0b1ded0bfb),
C64e (0x416e2fec2f82ec41), C64e (0xb31aa967a97d67b3),
C64e (0x5f431cfd1cbefd5f), C64e (0x456025ea258aea45),
C64e (0x23f9dabfda46bf23), C64e (0x535102f702a6f753),
C64e (0xe445a196a1d396e4), C64e (0x9b76ed5bed2d5b9b),
C64e (0x75285dc25deac275), C64e (0xe1c5241c24d91ce1),
C64e (0x3dd4e9aee97aae3d), C64e (0x4cf2be6abe986a4c),
C64e (0x6c82ee5aeed85a6c), C64e (0x7ebdc341c3fc417e),
C64e (0xf5f3060206f102f5), C64e (0x8352d14fd11d4f83),
C64e (0x688ce45ce4d05c68), C64e (0x515607f407a2f451),
C64e (0xd18d5c345cb934d1), C64e (0xf9e1180818e908f9),
C64e (0xe24cae93aedf93e2), C64e (0xab3e9573954d73ab),
C64e (0x6297f553f5c45362), C64e (0x2a6b413f41543f2a),
C64e (0x081c140c14100c08), C64e (0x9563f652f6315295),
C64e (0x46e9af65af8c6546), C64e (0x9d7fe25ee2215e9d),
C64e (0x3048782878602830), C64e (0x37cff8a1f86ea137),
C64e (0x0a1b110f11140f0a), C64e (0x2febc4b5c45eb52f),
C64e (0x0e151b091b1c090e), C64e (0x247e5a365a483624),
C64e (0x1badb69bb6369b1b), C64e (0xdf98473d47a53ddf),
C64e (0xcda76a266a8126cd), C64e (0x4ef5bb69bb9c694e),
C64e (0x7f334ccd4cfecd7f), C64e (0xea50ba9fbacf9fea),
C64e (0x123f2d1b2d241b12), C64e (0x1da4b99eb93a9e1d),
C64e (0x58c49c749cb07458), C64e (0x3446722e72682e34),
C64e (0x3641772d776c2d36), C64e (0xdc11cdb2cda3b2dc),
C64e (0xb49d29ee2973eeb4), C64e (0x5b4d16fb16b6fb5b),
C64e (0xa4a501f60153f6a4), C64e (0x76a1d74dd7ec4d76),
C64e (0xb714a361a37561b7), C64e (0x7d3449ce49face7d),
C64e (0x52df8d7b8da47b52), C64e (0xdd9f423e42a13edd),
C64e (0x5ecd937193bc715e), C64e (0x13b1a297a2269713),
C64e (0xa6a204f50457f5a6), C64e (0xb901b868b86968b9),
C64e (0x0000000000000000), C64e (0xc1b5742c74992cc1),
C64e (0x40e0a060a0806040), C64e (0xe3c2211f21dd1fe3),
C64e (0x793a43c843f2c879), C64e (0xb69a2ced2c77edb6),
C64e (0xd40dd9bed9b3bed4), C64e (0x8d47ca46ca01468d),
C64e (0x671770d970ced967), C64e (0x72afdd4bdde44b72),
C64e (0x94ed79de7933de94), C64e (0x98ff67d4672bd498),
C64e (0xb09323e8237be8b0), C64e (0x855bde4ade114a85),
C64e (0xbb06bd6bbd6d6bbb), C64e (0xc5bb7e2a7e912ac5),
C64e (0x4f7b34e5349ee54f), C64e (0xedd73a163ac116ed),
C64e (0x86d254c55417c586), C64e (0x9af862d7622fd79a),
C64e (0x6699ff55ffcc5566), C64e (0x11b6a794a7229411),
C64e (0x8ac04acf4a0fcf8a), C64e (0xe9d9301030c910e9),
C64e (0x040e0a060a080604), C64e (0xfe66988198e781fe),
C64e (0xa0ab0bf00b5bf0a0), C64e (0x78b4cc44ccf04478),
C64e (0x25f0d5bad54aba25), C64e (0x4b753ee33e96e34b),
C64e (0xa2ac0ef30e5ff3a2), C64e (0x5d4419fe19bafe5d),
C64e (0x80db5bc05b1bc080), C64e (0x0580858a850a8a05),
C64e (0x3fd3ecadec7ead3f), C64e (0x21fedfbcdf42bc21),
C64e (0x70a8d848d8e04870), C64e (0xf1fd0c040cf904f1),
C64e (0x63197adf7ac6df63), C64e (0x772f58c158eec177),
C64e (0xaf309f759f4575af), C64e (0x42e7a563a5846342),
C64e (0x2070503050403020), C64e (0xe5cb2e1a2ed11ae5),
C64e (0xfdef120e12e10efd), C64e (0xbf08b76db7656dbf),
C64e (0x8155d44cd4194c81), C64e (0x18243c143c301418),
C64e (0x26795f355f4c3526), C64e (0xc3b2712f719d2fc3),
C64e (0xbe8638e13867e1be), C64e (0x35c8fda2fd6aa235),
C64e (0x88c74fcc4f0bcc88), C64e (0x2e654b394b5c392e),
C64e (0x936af957f93d5793), C64e (0x55580df20daaf255),
C64e (0xfc619d829de382fc), C64e (0x7ab3c947c9f4477a),
C64e (0xc827efacef8bacc8), C64e (0xba8832e7326fe7ba),
C64e (0x324f7d2b7d642b32), C64e (0xe642a495a4d795e6),
C64e (0xc03bfba0fb9ba0c0), C64e (0x19aab398b3329819),
C64e (0x9ef668d16827d19e), C64e (0xa322817f815d7fa3),
C64e (0x44eeaa66aa886644), C64e (0x54d6827e82a87e54),
C64e (0x3bdde6abe676ab3b), C64e (0x0b959e839e16830b),
C64e (0x8cc945ca4503ca8c), C64e (0xc7bc7b297b9529c7),
C64e (0x6b056ed36ed6d36b), C64e (0x286c443c44503c28),
C64e (0xa72c8b798b5579a7), C64e (0xbc813de23d63e2bc),
C64e (0x1631271d272c1d16), C64e (0xad379a769a4176ad),
C64e (0xdb964d3b4dad3bdb), C64e (0x649efa56fac85664),
C64e (0x74a6d24ed2e84e74), C64e (0x1436221e22281e14),
C64e (0x92e476db763fdb92), C64e (0x0c121e0a1e180a0c),
C64e (0x48fcb46cb4906c48), C64e (0xb88f37e4376be4b8),
C64e (0x9f78e75de7255d9f), C64e (0xbd0fb26eb2616ebd),
C64e (0x43692aef2a86ef43), C64e (0xc435f1a6f193a6c4),
C64e (0x39dae3a8e372a839), C64e (0x31c6f7a4f762a431),
C64e (0xd38a593759bd37d3), C64e (0xf274868b86ff8bf2),
C64e (0xd583563256b132d5), C64e (0x8b4ec543c50d438b),
C64e (0x6e85eb59ebdc596e), C64e (0xda18c2b7c2afb7da),
C64e (0x018e8f8c8f028c01), C64e (0xb11dac64ac7964b1),
C64e (0x9cf16dd26d23d29c), C64e (0x49723be03b92e049),
C64e (0xd81fc7b4c7abb4d8), C64e (0xacb915fa1543faac),
C64e (0xf3fa090709fd07f3), C64e (0xcfa06f256f8525cf),
C64e (0xca20eaafea8fafca), C64e (0xf47d898e89f38ef4),
C64e (0x476720e9208ee947), C64e (0x1038281828201810),
C64e (0x6f0b64d564ded56f), C64e (0xf073838883fb88f0),
C64e (0x4afbb16fb1946f4a), C64e (0x5cca967296b8725c),
C64e (0x38546c246c702438), C64e (0x575f08f108aef157),
C64e (0x732152c752e6c773), C64e (0x9764f351f3355197),
C64e (0xcbae6523658d23cb), C64e (0xa125847c84597ca1),
C64e (0xe857bf9cbfcb9ce8), C64e (0x3e5d6321637c213e),
C64e (0x96ea7cdd7c37dd96), C64e (0x611e7fdc7fc2dc61),
C64e (0x0d9c9186911a860d), C64e (0x0f9b9485941e850f),
C64e (0xe04bab90abdb90e0), C64e (0x7cbac642c6f8427c),
C64e (0x712657c457e2c471), C64e (0xcc29e5aae583aacc),
C64e (0x90e373d8733bd890), C64e (0x06090f050f0c0506),
C64e (0xf7f4030103f501f7), C64e (0x1c2a36123638121c),
C64e (0xc23cfea3fe9fa3c2), C64e (0x6a8be15fe1d45f6a),
C64e (0xaebe10f91047f9ae), C64e (0x69026bd06bd2d069),
C64e (0x17bfa891a82e9117), C64e (0x9971e858e8295899),
C64e (0x3a5369276974273a), C64e (0x27f7d0b9d04eb927),
C64e (0xd991483848a938d9), C64e (0xebde351335cd13eb),
C64e (0x2be5ceb3ce56b32b), C64e (0x2277553355443322),
C64e (0xd204d6bbd6bfbbd2), C64e (0xa9399070904970a9),
C64e (0x07878089800e8907), C64e (0x33c1f2a7f266a733),
C64e (0x2decc1b6c15ab62d), C64e (0x3c5a66226678223c),
C64e (0x15b8ad92ad2a9215), C64e (0xc9a96020608920c9),
C64e (0x875cdb49db154987), C64e (0xaab01aff1a4fffaa),
C64e (0x50d8887888a07850), C64e (0xa52b8e7a8e517aa5),
C64e (0x03898a8f8a068f03), C64e (0x594a13f813b2f859),
C64e (0x09929b809b128009), C64e (0x1a2339173934171a),
C64e (0x651075da75cada65), C64e (0xd784533153b531d7),
C64e (0x84d551c65113c684), C64e (0xd003d3b8d3bbb8d0),
C64e (0x82dc5ec35e1fc382), C64e (0x29e2cbb0cb52b029),
C64e (0x5ac3997799b4775a), C64e (0x1e2d3311333c111e),
C64e (0x7b3d46cb46f6cb7b), C64e (0xa8b71ffc1f4bfca8),
C64e (0x6d0c61d661dad66d), C64e (0x2c624e3a4e583a2c)
};
#define РБТТ (д, а, b0, b1, b2, b3, b4, b5, b6, b7) делают {\
т [D] = Т0 [B64_0 (а [b0])] \
^ Т1 [B64_1 (а [б1])] \
^ Т2 [B64_2 (а [б2])] \
^ T3 [B64_3 (а [b3])] \
^ T4 [B64_4 (а [b4])] \
^ T5 [B64_5 (а [b5])] \
^ T6 [B64_6 (а [b6])] \
^ Т7 [B64_7 (а [B7])]; \
} В то время как (0)
#define ROUND_BIG_P (а, г) делают {\
а [0] ^ = PC64 (0x00, г); \
а [1] ^ = PC64 (0x10, г); \
а [2] ^ = PC64 (0x20, г); \
а [3] ^ = PC64 (0x30, г); \
а [4] ^ = PC64 (0x40, г); \
а [5] ^ = PC64 (0x50, г); \
а [6] ^ = PC64 (0x60, г); \
а [7] ^ = PC64 (0x70, г); \
а [8] ^ = PC64 (0x80, г); \
а [9] ^ = PC64 (0x90, г); \
а [10] ^ = PC64 (0xA0, г); \
а [11] ^ = PC64 (0xB0, г); \
а [12] ^ = PC64 (0xC0, г); \
а [13] ^ = PC64 (0xD0, г); \
а [14] ^ = PC64 (0xE0, г); \
а [15] ^ = PC64 (0xF0, г); \
РБТТ (0, а, 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0xB); \
РБТТ (1, а, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0xC); \
РБТТ (2, а, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0xD); \
РБТТ (3, а, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xE); \
РБТТ (4, а, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0xF); \
РБТТ (5, а, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0xB, 0x0); \
РБТТ (6, а, 0x6, 0x7, 0x8, 0x9, 0xA, 0xB, 0xC, 0x1); \
РБТТ (7, а, 0x7, 0x8, 0x9, 0xA, 0xB, 0xC, 0xD, 0x2); \
РБТТ (8, а, 0x8, 0x9, 0xA, 0xB, 0xC, 0xD, 0xE, 0x3); \
РБТТ (9, а, 0x9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF, 0x4); \
РБТТ (10, а, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF, 0x0, 0x5); \
РБТТ (11, а, 0xB, 0xC, 0xD, 0xE, 0xF, 0x0, 0x1, 0x6); \
РБТТ (12, а, 0xC, 0xD, 0xE, 0xF, 0x0, 0x1, 0x2, 0x7); \
РБТТ (13, а, 0xD, 0xE, 0xF, 0x0, 0x1, 0x2, 0x3, 0x8); \
РБТТ (14, а, 0xE, 0xF, 0x0, 0x1, 0x2, 0x3, 0x4, 0x9); \
РБТТ (15, а, 0xF, 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0xA); \
а [0] = т [0]; \
а [1] = т [1]; \
а [2] = т [2]; \
а [3] = т [3]; \
а [4] = т [4]; \
а [5] = т [5]; \
а [6] = т [6]; \
а [7] = т [7]; \
а [8] = т [8]; \
а [9] = т [9]; \
а [10] = т [10]; \
а [11] = т [11]; \
а [12] = т [12]; \
[13] = т [13]; \
а [14] = т [14]; \
а [15] = т [15]; \
} В то время как (0)
#define ROUND_BIG_Q (а, г) делают {\
а [0] ^ = QC64 (0x00, г); \
а [1] ^ = QC64 (0x10, г); \
а [2] ^ = QC64 (0x20, г); \
а [3] ^ = QC64 (0x30, г); \
а [4] ^ = QC64 (0x40, г); \
а [5] ^ = QC64 (0x50, г); \
а [6] ^ = QC64 (0x60, г); \
а [7] ^ = QC64 (0x70, г); \
а [8] ^ = QC64 (0x80, г); \
а [9] ^ = QC64 (0x90, г); \
а [10] ^ = QC64 (0xA0, г); \
а [11] ^ = QC64 (0xB0, г); \
а [12] ^ = QC64 (0xC0, г); \
а [13] ^ = QC64 (0xD0, г); \
а [14] ^ = QC64 (0xE0, г); \
а [15] ^ = QC64 (0xF0, г); \
РБТТ (0x0, а, 0x1, 0x3, 0x5, 0xB, 0x0, 0x2, 0x4, 0x6); \
РБТТ (0x1, а, 0x2, 0x4, 0x6, 0xC, 0x1, 0x3, 0x5, 0x7); \
РБТТ (0x2, а, 0x3, 0x5, 0x7, 0xD, 0x2, 0x4, 0x6, 0x8); \
РБТТ (0х3, а, 0x4, 0x6, 0x8, 0xE, 0x3, 0x5, 0x7, 0x9); \
РБТТ (0х4, а, 0x5, 0x7, 0x9, 0xF, 0x4, 0x6, 0x8, 0xA); \
РБТТ (0x5, а, 0x6, 0x8, 0xA, 0x0, 0x5, 0x7, 0x9, 0xB); \
РБТТ (0x6, а, 0x7, 0x9, 0xB, 0x1, 0x6, 0x8, 0xA, 0xC); \
РБТТ (0x7, а, 0x8, 0xA, 0xC, 0x2, 0x7, 0x9, 0xB, 0xD); \
РБТТ (0x8, а, 0x9, 0xB, 0xD, 0x3, 0x8, 0xA, 0xC, 0xE); \
РБТТ (0x9, а, 0xA, 0xC, 0xE, 0x4, 0x9, 0xB, 0xD, 0xF); \
РБТТ (0xA, а, 0xB, 0xD, 0xF, 0x5, 0xA, 0xC, 0xE, 0x0); \
РБТТ (0xB, а, 0xC, 0xE, 0x0, 0x6, 0xB, 0xD, 0xF, 0x1); \
РБТТ (0xC, а, 0xD, 0xF, 0x1, 0x7, 0xC, 0xE, 0x0, 0x2); \
РБТТ (0xD, а, 0xE, 0x0, 0x2, 0x8, 0xD, 0xF, 0x1, 0x3); \
РБТТ (0xE, а, 0xF, 0x1, 0x3, 0x9, 0xE, 0x0, 0x2, 0x4); \
РБТТ (0xF, а, 0x0, 0x2, 0x4, 0xA, 0xF, 0x1, 0x3, 0x5); \
а [0] = т [0]; \
а [1] = т [1]; \
а [2] = т [2]; \
а [3] = т [3]; \
а [4] = т [4]; \
а [5] = т [5]; \
а [6] = т [6]; \
а [7] = т [7]; \
а [8] = т [8]; \
а [9] = т [9]; \
а [10] = т [10]; \
а [11] = т [11]; \
а [12] = т [12]; \
[13] = т [13]; \
а [14] = т [14]; \
а [15] = т [15]; \
} В то время как (0)
#define SWAP4 (х) as_uint (as_uchar4 (х) .wzyx)
#define SWAP8 (х) as_ulong (as_uchar8 (х) .s76543210)
#if SPH_BIG_ENDIAN
#define ENC64E (х) SWAP8 (х)
#define DEC64E (х) SWAP8 (* (Const Подружился ULONG *) (х));
#else
#define ENC64E (х) (х)
#define DEC64E (х) (* (Const Подружился ULONG *) (х));
#endif
#define ШР (х, п) ((х) >> п)
#define SWAP32 (а) (as_uint (as_uchar4 (а) .wzyx))
#define S0 (х) (ROTL32 (х, 25) ^ ROTL32 (х, 14) ^ ШР (х, 3))
#define S1 (х) (ROTL32 (х, 15) ^ ROTL32 (х, 13) ^ ШР (х, 10))
#define S2 (х) (ROTL32 (х, 30) ^ ROTL32 (х, 19) ^ ROTL32 (х, 10))
#define S3 (х) (ROTL32 (х, 26) ^ ROTL32 (х, 21) ^ ROTL32 (х, 7))
#define Р (а, б, в, г, д, е, ж, з, х, К) {\
Темп = А + S3, (е) + F1 (д, е, ж) + (К + х); \
D + = темп; ч = темп + S2 (а) + Р0 (а, б, в); \
}
#define PLAST (а, б, в, г, д, е, ж, з, х, К) {\
D + = H + S3 (е) + F1 (д, е, ж) + (х + К); \
}
#define Р0 (у, х, г) bitselect (х, у, г ^ х)
#define F1 (х, у, г) bitselect (х, у, х)
#define R0 (W0 = S1 (W14) + W9 + S0 (W1) + W0)
#define R1 (W1 = S1 (W15) + W10 + S0 (W2) + W1)
#define R2 (W2 = S1 (W0) + W11 + S0 (W3) + W2)
#define R3 (W3 = S1 (W1) + W12 + S0 (W4) + W3)
#define R4 (W4 = S1 (W2) + W13 + S0 (W5) + W4)
#define R5 (W5 = S1 (W3) + W14 + S0 (W6) + W5)
#define R6 (W6 = S1 (W4) + W15 + S0 (W7) + W6)
#define R7 (W7 = S1 (W5) + W0 + S0 (W8) + W7)
#define R8 (W8 = S1 (W6) + W1 + S0 (W9) + W8)
#define R9 (W9 = S1 (W7) + W2 + S0 (W10) + W9)
#define R10 (W10 = S1 (W8) + W3 + S0 (W11) + W10)
#define R 11 (W11 = S1 (W9) + W4 + S0 (W12) + W11)
#define R12 (W12 = S1 (W10) + W5 + S0 (W13) + W12)
#define R13 (W13 = S1 (W11) + W6 + S0 (W14) + W13)
#define R14 (W14 = S1 (W12) + W7 + S0 (W15) + W14)
#define R15 (W15 = S1 (W13) + W8 + S0 (W0) + W15)
#define RD14 (S1 (W12) + W7 + S0 (W15) + W14)
#define RD15 (S1 (W13) + W8 + S0 (W0) + W15)
__kernel __attribute __ ((vec_type_hint (uint4)))
__kernel __attribute __ ((reqd_work_group_size (WORKSIZE, 1, 1)))
__kernel недействительным поиска (__ глобального неподписанного символ * блок, летучий Подружился UINT * выход,
Const ULONG мишень)
UINT glbid = get_global_id (0);
UINT lclid = get_local_id (0);
ULONG г;
UINT I;
/ * Groestl-512 * /
__private ulong16 GMT [3];
ULONG * г = (ULONG *) &Текущее время: [0];
ULONG * т = (ULONG *) &Текущее время: [1];
ULONG * т = (ULONG *) &GMT [2];
__local ULONG T0_L [256], T1_L [256], T2_L [256], T3_L [256],
T4_L [256], T5_L [256], T6_L [256], T7_L [256];
/ * Вычисляет таблицу * /
#if (WORKSIZE == 64)
T0_L [lclid] = Т0 [lclid];
T0_L [lclid + 64] = Т0 [lclid + 64];
T0_L [lclid + 128] = Т0 [lclid + 128];
T0_L [lclid + 192] = Т0 [lclid + 192];
T1_L [lclid] = повернуть (T0 [lclid], 8UL);
T1_L [lclid + 64] = вращаться (Т0 [lclid + 64], 8UL);
T1_L [lclid + 128] = поворот (Т0 [lclid + 128], 8UL);
T1_L [lclid + 192] = поворот (Т0 [lclid + 192], 8UL);
T2_L [lclid] = повернуть (T0 [lclid], 16UL);
T2_L [lclid + 64] = вращаться (Т0 [lclid + 64], 16UL);
T2_L [lclid + 128] = поворот (Т0 [lclid + 128], 16UL);
T2_L [lclid + 192] = поворот (Т0 [lclid + 192], 16UL);
T3_L [lclid] = повернуть (T0 [lclid], 24UL);
T3_L [lclid + 64] = вращаться (Т0 [lclid + 64], 24UL);
T3_L [lclid + 128] = поворот (Т0 [lclid + 128], 24UL);
T3_L [lclid + 192] = поворот (Т0 [lclid + 192], 24UL);
T4_L [lclid] = повернуть (T0 [lclid], 32UL);
T4_L [lclid + 64] = вращаться (Т0 [lclid + 64], 32UL);
T4_L [lclid + 128] = поворот (Т0 [lclid + 128], 32UL);
T4_L [lclid + 192] = поворот (Т0 [lclid + 192], 32UL);
T5_L [lclid] = повернуть (T0 [lclid], 40UL);
T5_L [lclid + 64] = вращаться (Т0 [lclid + 64], 40UL);
T5_L [lclid + 128] = поворот (Т0 [lclid + 128], 40UL);
T5_L [lclid + 192] = поворот (Т0 [lclid + 192], 40UL);
T6_L [lclid] = повернуть (T0 [lclid], 48UL);
T6_L [lclid + 64] = вращаться (Т0 [lclid + 64], 48UL);
T6_L [lclid + 128] = поворот (Т0 [lclid + 128], 48UL);
T6_L [lclid + 192] = поворот (Т0 [lclid + 192], 48UL);
T7_L [lclid] = повернуть (T0 [lclid], 56UL);
T7_L [lclid + 64] = вращаться (Т0 [lclid + 64], 56UL);
T7_L [lclid + 128] = поворот (Т0 [lclid + 128], 56UL);
T7_L [lclid + 192] = поворот (Т0 [lclid + 192], 56UL);
#elif (WORKSIZE == 128)
T0_L [lclid] = Т0 [lclid];
T0_L [lclid + 128] = Т0 [lclid + 128];
T1_L [lclid] = повернуть (T0 [lclid], 8UL);
T1_L [lclid + 128] = поворот (Т0 [lclid + 128], 8UL);
T2_L [lclid] = повернуть (T0 [lclid], 16UL);
T2_L [lclid + 128] = поворот (Т0 [lclid + 128], 16UL);
T3_L [lclid] = повернуть (T0 [lclid], 24UL);
T3_L [lclid + 128] = поворот (Т0 [lclid + 128], 24UL);
T4_L [lclid] = повернуть (T0 [lclid], 32UL);
T4_L [lclid + 128] = поворот (Т0 [lclid + 128], 32UL);
T5_L [lclid] = повернуть (T0 [lclid], 40UL);
T5_L [lclid + 128] = поворот (Т0 [lclid + 128], 40UL);
T6_L [lclid] = повернуть (T0 [lclid], 48UL);
T6_L [lclid + 128] = поворот (Т0 [lclid + 128], 48UL);
T7_L [lclid] = повернуть (T0 [lclid], 56UL);
T7_L [lclid + 128] = поворот (Т0 [lclid + 128], 56UL);
#elif (WORKSIZE == 256)
T0_L [lclid] = Т0 [lclid];
T1_L [lclid] = повернуть (T0 [lclid], 8UL);
T2_L [lclid] = повернуть (T0 [lclid], 16UL);
T3_L [lclid] = повернуть (T0 [lclid], 24UL);
T4_L [lclid] = повернуть (T0 [lclid], 32UL);
T5_L [lclid] = повернуть (T0 [lclid], 40UL);
T6_L [lclid] = повернуть (T0 [lclid], 48UL);
T7_L [lclid] = повернуть (T0 [lclid], 56UL);
#else
вернуть;
#endif
#define T0 T0_L
#define Т1 T1_L
#define Т2 T2_L
#define T3 T3_L
#define T4 T4_L
#define T5 T5_L
#define T6 T6_L
#define T7 T7_L
м [0] = DEC64E (блок);
м [1] = DEC64E (блок + 8);
м [2] = DEC64E (блок + 16);
м [3] = DEC64E (блок + 24);
м [4] = DEC64E (блок + 32);
м [5] = DEC64E (блок + 40);
м [6] = DEC64E (блок + 48);
м [7] = DEC64E (блок + 56);
м [8] = DEC64E (блок + 64);
м [9] = DEC64E (блок + 72);
м [9] &= 0x00000000FFFFFFFF;
м [9]
#endif / * MYRIADCOIN_GROESTL_CL * /