Compare commits

...

1 Commits

Author SHA1 Message Date
Jay D Dee
eaa4bd8152 v3.8.8 2018-04-23 12:47:43 -04:00
15 changed files with 399 additions and 300 deletions

View File

@@ -29,3 +29,5 @@ Wolf0
Optiminer Optiminer
Jay D Dee Jay D Dee
xcouiz@gmail.com

143
README.md
View File

@@ -45,83 +45,84 @@ MacOS, OSx and Android are not supported.
Supported Algorithms Supported Algorithms
-------------------- --------------------
allium Garlicoin allium Garlicoin
anime Animecoin anime Animecoin
argon2 Argon2 coin (AR2) argon2 Argon2 coin (AR2)
argon2d250 argon2d-crds, Credits (CRDS) argon2d250 argon2d-crds, Credits (CRDS)
argon2d500 argon2d-dyn, Dynamic (DYN) argon2d500 argon2d-dyn, Dynamic (DYN)
argon2d4096 argon2d-uis, Unitus, (UIS) argon2d4096 argon2d-uis, Unitus, (UIS)
axiom Shabal-256 MemoHash axiom Shabal-256 MemoHash
bastion bastion
blake Blake-256 (SFR) blake Blake-256 (SFR)
blakecoin blake256r8 blakecoin blake256r8
blake2s Blake-2 S blake2s Blake-2 S
bmw BMW 256 bmw BMW 256
c11 Chaincoin c11 Chaincoin
cryptolight Cryptonight-light cryptolight Cryptonight-light
cryptonight cryptonote, Monero (XMR) cryptonight
cryptonightv7 Monero (XMR)
decred decred
deep Deepcoin (DCN) deep Deepcoin (DCN)
dmd-gr Diamond-Groestl dmd-gr Diamond-Groestl
drop Dropcoin drop Dropcoin
fresh Fresh fresh Fresh
groestl Groestl coin groestl Groestl coin
heavy Heavy heavy Heavy
hmq1725 Espers hmq1725 Espers
hodl Hodlcoin hodl Hodlcoin
jha Jackpotcoin jha Jackpotcoin
keccak Maxcoin keccak Maxcoin
keccakc Creative coin keccakc Creative coin
lbry LBC, LBRY Credits lbry LBC, LBRY Credits
luffa Luffa luffa Luffa
lyra2h Hppcoin lyra2h Hppcoin
lyra2re lyra2 lyra2re lyra2
lyra2rev2 lyra2v2, Vertcoin lyra2rev2 lyra2v2, Vertcoin
lyra2z Zcoin (XZC) lyra2z Zcoin (XZC)
lyra2z330 Lyra2 330 rows, Zoin (ZOI) lyra2z330 Lyra2 330 rows, Zoin (ZOI)
m7m Magi (XMG) m7m Magi (XMG)
myr-gr Myriad-Groestl myr-gr Myriad-Groestl
neoscrypt NeoScrypt(128, 2, 1) neoscrypt NeoScrypt(128, 2, 1)
nist5 Nist5 nist5 Nist5
pentablake Pentablake pentablake Pentablake
phi1612 phi, LUX coin phi1612 phi, LUX coin
pluck Pluck:128 (Supcoin) pluck Pluck:128 (Supcoin)
polytimos Ninja polytimos Ninja
quark Quark quark Quark
qubit Qubit qubit Qubit
scrypt scrypt(1024, 1, 1) (default) scrypt scrypt(1024, 1, 1) (default)
scrypt:N scrypt(N, 1, 1) scrypt:N scrypt(N, 1, 1)
scryptjane:nf scryptjane:nf
sha256d Double SHA-256 sha256d Double SHA-256
sha256t Triple SHA-256, Onecoin (OC) sha256t Triple SHA-256, Onecoin (OC)
shavite3 Shavite3 shavite3 Shavite3
skein Skein+Sha (Skeincoin) skein Skein+Sha (Skeincoin)
skein2 Double Skein (Woodcoin) skein2 Double Skein (Woodcoin)
skunk Signatum (SIGT) skunk Signatum (SIGT)
timetravel Machinecoin (MAC) timetravel Machinecoin (MAC)
timetravel10 Bitcore timetravel10 Bitcore
tribus Denarius (DNR) tribus Denarius (DNR)
vanilla blake256r8vnl (VCash) vanilla blake256r8vnl (VCash)
veltor (VLT) veltor (VLT)
whirlpool whirlpool
whirlpoolx whirlpoolx
x11 Dash x11 Dash
x11evo Revolvercoin x11evo Revolvercoin
x11gost sib (SibCoin) x11gost sib (SibCoin)
x12 Galaxie Cash (GCH) x12 Galaxie Cash (GCH)
x13 X13 x13 X13
x13sm3 hsr (Hshare) x13sm3 hsr (Hshare)
x14 X14 x14 X14
x15 X15 x15 X15
x16r Ravencoin (RVN) x16r Ravencoin (RVN)
x16s pigeoncoin (PGN) x16s pigeoncoin (PGN)
x17 x17
xevan Bitsend (BSD) xevan Bitsend (BSD)
yescrypt Globalboost-Y (BSTY) yescrypt Globalboost-Y (BSTY)
yescryptr8 BitZeny (ZNY) yescryptr8 BitZeny (ZNY)
yescryptr16 Yenten (YTN) yescryptr16 Yenten (YTN)
yescryptr32 WAVI yescryptr32 WAVI
zr5 Ziftr zr5 Ziftr
Errata Errata
------ ------

View File

@@ -28,6 +28,7 @@ Exe name Compile flags Arch name
cpuminer-sse2.exe "-msse2" Core2, Nehalem cpuminer-sse2.exe "-msse2" Core2, Nehalem
cpuminer-aes-sse42.exe "-march=westmere" Westmere, Sandy-Ivybridge cpuminer-aes-sse42.exe "-march=westmere" Westmere, Sandy-Ivybridge
cpuminer-avx.exe "-march=corei7-avx" Sandy-Ivybridge
cpuminer-avx2.exe "-march=core-avx2" Haswell, Sky-Kaby-Coffeelake cpuminer-avx2.exe "-march=core-avx2" Haswell, Sky-Kaby-Coffeelake
cpuminer-avx2-sha.exe "-march=core-avx2 -msha" Ryzen cpuminer-avx2-sha.exe "-march=core-avx2 -msha" Ryzen

View File

@@ -160,6 +160,10 @@ Support for even older x86_64 without AES_NI or SSE2 is not availble.
Change Log Change Log
---------- ----------
v3.8.8
Added cryptonightv7 for Monero.
v3.8.7.2 v3.8.7.2
Fixed argon2d-dyn regression in v3.8.7.1. Fixed argon2d-dyn regression in v3.8.7.1.

View File

@@ -157,82 +157,83 @@ bool register_algo_gate( int algo, algo_gate_t *gate )
switch (algo) switch (algo)
{ {
case ALGO_ALLIUM: register_allium_algo ( gate ); break; case ALGO_ALLIUM: register_allium_algo ( gate ); break;
case ALGO_ANIME: register_anime_algo ( gate ); break; case ALGO_ANIME: register_anime_algo ( gate ); break;
case ALGO_ARGON2: register_argon2_algo ( gate ); break; case ALGO_ARGON2: register_argon2_algo ( gate ); break;
case ALGO_ARGON2D250: register_argon2d_crds_algo( gate ); break; case ALGO_ARGON2D250: register_argon2d_crds_algo ( gate ); break;
case ALGO_ARGON2D500: register_argon2d_dyn_algo ( gate ); break; case ALGO_ARGON2D500: register_argon2d_dyn_algo ( gate ); break;
case ALGO_ARGON2D4096: register_argon2d4096_algo ( gate ); break; case ALGO_ARGON2D4096: register_argon2d4096_algo ( gate ); break;
case ALGO_AXIOM: register_axiom_algo ( gate ); break; case ALGO_AXIOM: register_axiom_algo ( gate ); break;
case ALGO_BASTION: register_bastion_algo ( gate ); break; case ALGO_BASTION: register_bastion_algo ( gate ); break;
case ALGO_BLAKE: register_blake_algo ( gate ); break; case ALGO_BLAKE: register_blake_algo ( gate ); break;
case ALGO_BLAKECOIN: register_blakecoin_algo ( gate ); break; case ALGO_BLAKECOIN: register_blakecoin_algo ( gate ); break;
// case ALGO_BLAKE2B: register_blake2b_algo ( gate ); break; // case ALGO_BLAKE2B: register_blake2b_algo ( gate ); break;
case ALGO_BLAKE2S: register_blake2s_algo ( gate ); break; case ALGO_BLAKE2S: register_blake2s_algo ( gate ); break;
case ALGO_C11: register_c11_algo ( gate ); break; case ALGO_C11: register_c11_algo ( gate ); break;
case ALGO_CRYPTOLIGHT: register_cryptolight_algo ( gate ); break; case ALGO_CRYPTOLIGHT: register_cryptolight_algo ( gate ); break;
case ALGO_CRYPTONIGHT: register_cryptonight_algo ( gate ); break; case ALGO_CRYPTONIGHT: register_cryptonight_algo ( gate ); break;
case ALGO_DECRED: register_decred_algo ( gate ); break; case ALGO_CRYPTONIGHTV7:register_cryptonightv7_algo( gate ); break;
case ALGO_DEEP: register_deep_algo ( gate ); break; case ALGO_DECRED: register_decred_algo ( gate ); break;
case ALGO_DMD_GR: register_dmd_gr_algo ( gate ); break; case ALGO_DEEP: register_deep_algo ( gate ); break;
case ALGO_DROP: register_drop_algo ( gate ); break; case ALGO_DMD_GR: register_dmd_gr_algo ( gate ); break;
case ALGO_FRESH: register_fresh_algo ( gate ); break; case ALGO_DROP: register_drop_algo ( gate ); break;
case ALGO_GROESTL: register_groestl_algo ( gate ); break; case ALGO_FRESH: register_fresh_algo ( gate ); break;
case ALGO_HEAVY: register_heavy_algo ( gate ); break; case ALGO_GROESTL: register_groestl_algo ( gate ); break;
case ALGO_HMQ1725: register_hmq1725_algo ( gate ); break; case ALGO_HEAVY: register_heavy_algo ( gate ); break;
case ALGO_HODL: register_hodl_algo ( gate ); break; case ALGO_HMQ1725: register_hmq1725_algo ( gate ); break;
case ALGO_JHA: register_jha_algo ( gate ); break; case ALGO_HODL: register_hodl_algo ( gate ); break;
case ALGO_KECCAK: register_keccak_algo ( gate ); break; case ALGO_JHA: register_jha_algo ( gate ); break;
case ALGO_KECCAKC: register_keccakc_algo ( gate ); break; case ALGO_KECCAK: register_keccak_algo ( gate ); break;
case ALGO_LBRY: register_lbry_algo ( gate ); break; case ALGO_KECCAKC: register_keccakc_algo ( gate ); break;
case ALGO_LUFFA: register_luffa_algo ( gate ); break; case ALGO_LBRY: register_lbry_algo ( gate ); break;
case ALGO_LYRA2H: register_lyra2h_algo ( gate ); break; case ALGO_LUFFA: register_luffa_algo ( gate ); break;
case ALGO_LYRA2RE: register_lyra2re_algo ( gate ); break; case ALGO_LYRA2H: register_lyra2h_algo ( gate ); break;
case ALGO_LYRA2REV2: register_lyra2rev2_algo ( gate ); break; case ALGO_LYRA2RE: register_lyra2re_algo ( gate ); break;
case ALGO_LYRA2Z: register_lyra2z_algo ( gate ); break; case ALGO_LYRA2REV2: register_lyra2rev2_algo ( gate ); break;
case ALGO_LYRA2Z330: register_lyra2z330_algo ( gate ); break; case ALGO_LYRA2Z: register_lyra2z_algo ( gate ); break;
case ALGO_M7M: register_m7m_algo ( gate ); break; case ALGO_LYRA2Z330: register_lyra2z330_algo ( gate ); break;
case ALGO_MYR_GR: register_myriad_algo ( gate ); break; case ALGO_M7M: register_m7m_algo ( gate ); break;
case ALGO_NEOSCRYPT: register_neoscrypt_algo ( gate ); break; case ALGO_MYR_GR: register_myriad_algo ( gate ); break;
case ALGO_NIST5: register_nist5_algo ( gate ); break; case ALGO_NEOSCRYPT: register_neoscrypt_algo ( gate ); break;
case ALGO_PENTABLAKE: register_pentablake_algo ( gate ); break; case ALGO_NIST5: register_nist5_algo ( gate ); break;
case ALGO_PHI1612: register_phi1612_algo ( gate ); break; case ALGO_PENTABLAKE: register_pentablake_algo ( gate ); break;
case ALGO_PLUCK: register_pluck_algo ( gate ); break; case ALGO_PHI1612: register_phi1612_algo ( gate ); break;
case ALGO_POLYTIMOS: register_polytimos_algo ( gate ); break; case ALGO_PLUCK: register_pluck_algo ( gate ); break;
case ALGO_QUARK: register_quark_algo ( gate ); break; case ALGO_POLYTIMOS: register_polytimos_algo ( gate ); break;
case ALGO_QUBIT: register_qubit_algo ( gate ); break; case ALGO_QUARK: register_quark_algo ( gate ); break;
case ALGO_SCRYPT: register_scrypt_algo ( gate ); break; case ALGO_QUBIT: register_qubit_algo ( gate ); break;
case ALGO_SCRYPTJANE: register_scryptjane_algo ( gate ); break; case ALGO_SCRYPT: register_scrypt_algo ( gate ); break;
case ALGO_SHA256D: register_sha256d_algo ( gate ); break; case ALGO_SCRYPTJANE: register_scryptjane_algo ( gate ); break;
case ALGO_SHA256T: register_sha256t_algo ( gate ); break; case ALGO_SHA256D: register_sha256d_algo ( gate ); break;
case ALGO_SHAVITE3: register_shavite_algo ( gate ); break; case ALGO_SHA256T: register_sha256t_algo ( gate ); break;
case ALGO_SKEIN: register_skein_algo ( gate ); break; case ALGO_SHAVITE3: register_shavite_algo ( gate ); break;
case ALGO_SKEIN2: register_skein2_algo ( gate ); break; case ALGO_SKEIN: register_skein_algo ( gate ); break;
case ALGO_SKUNK: register_skunk_algo ( gate ); break; case ALGO_SKEIN2: register_skein2_algo ( gate ); break;
case ALGO_TIMETRAVEL: register_timetravel_algo ( gate ); break; case ALGO_SKUNK: register_skunk_algo ( gate ); break;
case ALGO_TIMETRAVEL10: register_timetravel10_algo( gate ); break; case ALGO_TIMETRAVEL: register_timetravel_algo ( gate ); break;
case ALGO_TRIBUS: register_tribus_algo ( gate ); break; case ALGO_TIMETRAVEL10: register_timetravel10_algo ( gate ); break;
case ALGO_VANILLA: register_vanilla_algo ( gate ); break; case ALGO_TRIBUS: register_tribus_algo ( gate ); break;
case ALGO_VELTOR: register_veltor_algo ( gate ); break; case ALGO_VANILLA: register_vanilla_algo ( gate ); break;
case ALGO_WHIRLPOOL: register_whirlpool_algo ( gate ); break; case ALGO_VELTOR: register_veltor_algo ( gate ); break;
case ALGO_WHIRLPOOLX: register_whirlpoolx_algo ( gate ); break; case ALGO_WHIRLPOOL: register_whirlpool_algo ( gate ); break;
case ALGO_X11: register_x11_algo ( gate ); break; case ALGO_WHIRLPOOLX: register_whirlpoolx_algo ( gate ); break;
case ALGO_X11EVO: register_x11evo_algo ( gate ); break; case ALGO_X11: register_x11_algo ( gate ); break;
case ALGO_X11GOST: register_x11gost_algo ( gate ); break; case ALGO_X11EVO: register_x11evo_algo ( gate ); break;
case ALGO_X12: register_x12_algo ( gate ); break; case ALGO_X11GOST: register_x11gost_algo ( gate ); break;
case ALGO_X13: register_x13_algo ( gate ); break; case ALGO_X12: register_x12_algo ( gate ); break;
case ALGO_X13SM3: register_x13sm3_algo ( gate ); break; case ALGO_X13: register_x13_algo ( gate ); break;
case ALGO_X14: register_x14_algo ( gate ); break; case ALGO_X13SM3: register_x13sm3_algo ( gate ); break;
case ALGO_X15: register_x15_algo ( gate ); break; case ALGO_X14: register_x14_algo ( gate ); break;
case ALGO_X16R: register_x16r_algo ( gate ); break; case ALGO_X15: register_x15_algo ( gate ); break;
case ALGO_X16S: register_x16s_algo ( gate ); break; case ALGO_X16R: register_x16r_algo ( gate ); break;
case ALGO_X17: register_x17_algo ( gate ); break; case ALGO_X16S: register_x16s_algo ( gate ); break;
case ALGO_XEVAN: register_xevan_algo ( gate ); break; case ALGO_X17: register_x17_algo ( gate ); break;
case ALGO_YESCRYPT: register_yescrypt_algo ( gate ); break; case ALGO_XEVAN: register_xevan_algo ( gate ); break;
case ALGO_YESCRYPTR8: register_yescryptr8_algo ( gate ); break; case ALGO_YESCRYPT: register_yescrypt_algo ( gate ); break;
case ALGO_YESCRYPTR16: register_yescryptr16_algo ( gate ); break; case ALGO_YESCRYPTR8: register_yescryptr8_algo ( gate ); break;
case ALGO_YESCRYPTR32: register_yescryptr32_algo ( gate ); break; case ALGO_YESCRYPTR16: register_yescryptr16_algo ( gate ); break;
case ALGO_ZR5: register_zr5_algo ( gate ); break; case ALGO_YESCRYPTR32: register_yescryptr32_algo ( gate ); break;
case ALGO_ZR5: register_zr5_algo ( gate ); break;
default: default:
applog(LOG_ERR,"FAIL: algo_gate registration failed, unknown algo %s.\n", algo_names[opt_algo] ); applog(LOG_ERR,"FAIL: algo_gate registration failed, unknown algo %s.\n", algo_names[opt_algo] );
return false; return false;

View File

@@ -325,7 +325,7 @@ int scanhash_cryptolight(int thr_id, struct work *work,
struct cryptonight_ctx *ctx = (struct cryptonight_ctx*)malloc(sizeof(struct cryptonight_ctx)); struct cryptonight_ctx *ctx = (struct cryptonight_ctx*)malloc(sizeof(struct cryptonight_ctx));
#ifndef NO_AES_NI #if defined(__AES__)
do { do {
*nonceptr = ++n; *nonceptr = ++n;
cryptolight_hash_ctx_aes_ni(hash, pdata, 76, ctx); cryptolight_hash_ctx_aes_ni(hash, pdata, 76, ctx);

View File

@@ -1,14 +1,11 @@
#if defined(__AES__)
#include <x86intrin.h> #include <x86intrin.h>
#include <memory.h> #include <memory.h>
#include "cryptonight.h" #include "cryptonight.h"
#include "miner.h" #include "miner.h"
#include "crypto/c_keccak.h" #include "crypto/c_keccak.h"
#include <immintrin.h> #include <immintrin.h>
//#include "avxdefs.h"
void aesni_parallel_noxor(uint8_t *long_state, uint8_t *text, uint8_t *ExpandedKey);
void aesni_parallel_xor(uint8_t *text, uint8_t *ExpandedKey, uint8_t *long_state);
void that_fucking_loop(uint8_t a[16], uint8_t b[16], uint8_t *long_state);
static inline void ExpandAESKey256_sub1(__m128i *tmp1, __m128i *tmp2) static inline void ExpandAESKey256_sub1(__m128i *tmp1, __m128i *tmp2)
{ {
@@ -25,7 +22,6 @@ static inline void ExpandAESKey256_sub1(__m128i *tmp1, __m128i *tmp2)
static inline void ExpandAESKey256_sub2(__m128i *tmp1, __m128i *tmp3) static inline void ExpandAESKey256_sub2(__m128i *tmp1, __m128i *tmp3)
{ {
#ifndef NO_AES_NI
__m128i tmp2, tmp4; __m128i tmp2, tmp4;
tmp4 = _mm_aeskeygenassist_si128(*tmp1, 0x00); tmp4 = _mm_aeskeygenassist_si128(*tmp1, 0x00);
@@ -37,14 +33,12 @@ static inline void ExpandAESKey256_sub2(__m128i *tmp1, __m128i *tmp3)
tmp4 = _mm_slli_si128(tmp4, 0x04); tmp4 = _mm_slli_si128(tmp4, 0x04);
*tmp3 = _mm_xor_si128(*tmp3, tmp4); *tmp3 = _mm_xor_si128(*tmp3, tmp4);
*tmp3 = _mm_xor_si128(*tmp3, tmp2); *tmp3 = _mm_xor_si128(*tmp3, tmp2);
#endif
} }
// Special thanks to Intel for helping me // Special thanks to Intel for helping me
// with ExpandAESKey256() and its subroutines // with ExpandAESKey256() and its subroutines
static inline void ExpandAESKey256(char *keybuf) static inline void ExpandAESKey256(char *keybuf)
{ {
#ifndef NO_AES_NI
__m128i tmp1, tmp2, tmp3, *keys; __m128i tmp1, tmp2, tmp3, *keys;
keys = (__m128i *)keybuf; keys = (__m128i *)keybuf;
@@ -91,7 +85,6 @@ static inline void ExpandAESKey256(char *keybuf)
tmp2 = _mm_aeskeygenassist_si128(tmp3, 0x40); tmp2 = _mm_aeskeygenassist_si128(tmp3, 0x40);
ExpandAESKey256_sub1(&tmp1, &tmp2); ExpandAESKey256_sub1(&tmp1, &tmp2);
keys[14] = tmp1; keys[14] = tmp1;
#endif
} }
// align to 64 byte cache line // align to 64 byte cache line
@@ -109,13 +102,19 @@ static __thread cryptonight_ctx ctx;
void cryptonight_hash_aes( void *restrict output, const void *input, int len ) void cryptonight_hash_aes( void *restrict output, const void *input, int len )
{ {
#ifndef NO_AES_NI
uint8_t ExpandedKey[256] __attribute__((aligned(64))); uint8_t ExpandedKey[256] __attribute__((aligned(64)));
__m128i *longoutput, *expkey, *xmminput; __m128i *longoutput, *expkey, *xmminput;
size_t i, j; size_t i, j;
keccak( (const uint8_t*)input, 76, (char*)&ctx.state.hs.b, 200 ); keccak( (const uint8_t*)input, 76, (char*)&ctx.state.hs.b, 200 );
if ( cryptonightV7 && len < 43 )
return;
const uint64_t tweak = cryptonightV7
? *((const uint64_t*) (((const uint8_t*)input) + 35))
^ ctx.state.hs.w[24] : 0;
memcpy( ExpandedKey, ctx.state.hs.b, AES_KEY_SIZE ); memcpy( ExpandedKey, ctx.state.hs.b, AES_KEY_SIZE );
ExpandAESKey256( ExpandedKey ); ExpandAESKey256( ExpandedKey );
memcpy( ctx.text, ctx.state.init, INIT_SIZE_BYTE ); memcpy( ctx.text, ctx.state.init, INIT_SIZE_BYTE );
@@ -214,7 +213,15 @@ void cryptonight_hash_aes( void *restrict output, const void *input, int len )
_mm_store_si128( (__m128i*)c, c_x ); _mm_store_si128( (__m128i*)c, c_x );
b_x = _mm_xor_si128( b_x, c_x ); b_x = _mm_xor_si128( b_x, c_x );
nextblock = (uint64_t *)&ctx.long_state[c[0] & 0x1FFFF0]; nextblock = (uint64_t *)&ctx.long_state[c[0] & 0x1FFFF0];
_mm_store_si128( lsa, b_x ); _mm_store_si128( lsa, b_x );
if ( cryptonightV7 )
{
const uint8_t tmp = ( (const uint8_t*)(lsa) )[11];
const uint8_t index = ( ( (tmp >> 3) & 6 ) | (tmp & 1) ) << 1;
((uint8_t*)(lsa))[11] = tmp ^ ( ( 0x75310 >> index) & 0x30 );
}
b[0] = nextblock[0]; b[0] = nextblock[0];
b[1] = nextblock[1]; b[1] = nextblock[1];
@@ -227,10 +234,14 @@ void cryptonight_hash_aes( void *restrict output, const void *input, int len )
: "cc" ); : "cc" );
b_x = c_x; b_x = c_x;
nextblock[0] = a[0] + hi;
nextblock[1] = a[1] + lo; a[0] += hi;
a[0] = b[0] ^ nextblock[0]; a[1] += lo;
a[1] = b[1] ^ nextblock[1]; nextblock[0] = a[0];
nextblock[1] = cryptonightV7 ? a[1] ^ tweak : a[1];
a[0] ^= b[0];
a[1] ^= b[1];
lsa = (__m128i*)&ctx.long_state[ a[0] & 0x1FFFF0 ]; lsa = (__m128i*)&ctx.long_state[ a[0] & 0x1FFFF0 ];
a_x = _mm_load_si128( (__m128i*)a ); a_x = _mm_load_si128( (__m128i*)a );
c_x = _mm_load_si128( lsa ); c_x = _mm_load_si128( lsa );
@@ -241,6 +252,14 @@ void cryptonight_hash_aes( void *restrict output, const void *input, int len )
b_x = _mm_xor_si128( b_x, c_x ); b_x = _mm_xor_si128( b_x, c_x );
nextblock = (uint64_t *)&ctx.long_state[c[0] & 0x1FFFF0]; nextblock = (uint64_t *)&ctx.long_state[c[0] & 0x1FFFF0];
_mm_store_si128( lsa, b_x ); _mm_store_si128( lsa, b_x );
if ( cryptonightV7 )
{
const uint8_t tmp = ( (const uint8_t*)(lsa) )[11];
const uint8_t index = ( ( (tmp >> 3) & 6 ) | (tmp & 1) ) << 1;
((uint8_t*)(lsa))[11] = tmp ^ ( ( 0x75310 >> index) & 0x30 );
}
b[0] = nextblock[0]; b[0] = nextblock[0];
b[1] = nextblock[1]; b[1] = nextblock[1];
@@ -251,8 +270,12 @@ void cryptonight_hash_aes( void *restrict output, const void *input, int len )
"rm" ( b[0] ) "rm" ( b[0] )
: "cc" ); : "cc" );
nextblock[0] = a[0] + hi; a[0] += hi;
nextblock[1] = a[1] + lo; a[1] += lo;
nextblock[0] = a[0];
nextblock[1] = cryptonightV7 ? a[1] ^ tweak : a[1];
a[0] ^= b[0];
a[1] ^= b[1];
memcpy( ExpandedKey, &ctx.state.hs.b[32], AES_KEY_SIZE ); memcpy( ExpandedKey, &ctx.state.hs.b[32], AES_KEY_SIZE );
ExpandAESKey256( ExpandedKey ); ExpandAESKey256( ExpandedKey );
@@ -330,5 +353,5 @@ void cryptonight_hash_aes( void *restrict output, const void *input, int len )
keccakf( (uint64_t*)&ctx.state.hs.w, 24 ); keccakf( (uint64_t*)&ctx.state.hs.w, 24 );
extra_hashes[ctx.state.hs.b[0] & 3](&ctx.state, 200, output); extra_hashes[ctx.state.hs.b[0] & 3](&ctx.state, 200, output);
#endif
} }
#endif

View File

@@ -7,11 +7,11 @@
#include "cpuminer-config.h" #include "cpuminer-config.h"
#include "algo-gate-api.h" #include "algo-gate-api.h"
#ifndef NO_AES_NI #if defined(__AES__)
#include "algo/groestl/aes_ni/hash-groestl256.h" #include "algo/groestl/aes_ni/hash-groestl256.h"
#endif #else
#include "crypto/c_groestl.h" #include "crypto/c_groestl.h"
#endif
#include "crypto/c_blake256.h" #include "crypto/c_blake256.h"
#include "crypto/c_jh.h" #include "crypto/c_jh.h"
#include "crypto/c_skein.h" #include "crypto/c_skein.h"
@@ -30,12 +30,12 @@ void do_blake_hash(const void* input, size_t len, char* output) {
} }
void do_groestl_hash(const void* input, size_t len, char* output) { void do_groestl_hash(const void* input, size_t len, char* output) {
#ifdef NO_AES_NI #if defined(__AES__)
groestl(input, len * 8, (uint8_t*)output);
#else
hashState_groestl256 ctx; hashState_groestl256 ctx;
init_groestl256( &ctx, 32 ); init_groestl256( &ctx, 32 );
update_and_final_groestl256( &ctx, output, input, len * 8 ); update_and_final_groestl256( &ctx, output, input, len * 8 );
#else
groestl(input, len * 8, (uint8_t*)output);
#endif #endif
} }
@@ -52,23 +52,24 @@ void (* const extra_hashes[4])( const void *, size_t, char *) =
void cryptonight_hash( void *restrict output, const void *input, int len ) void cryptonight_hash( void *restrict output, const void *input, int len )
{ {
#if defined(__AES__)
#ifdef NO_AES_NI
cryptonight_hash_ctx ( output, input, len );
#else
cryptonight_hash_aes( output, input, len ); cryptonight_hash_aes( output, input, len );
#else
cryptonight_hash_ctx ( output, input, len );
#endif #endif
} }
void cryptonight_hash_suw( void *restrict output, const void *input ) void cryptonight_hash_suw( void *restrict output, const void *input )
{ {
#ifdef NO_AES_NI #if defined(__AES__)
cryptonight_hash_ctx ( output, input, 76 );
#else
cryptonight_hash_aes( output, input, 76 ); cryptonight_hash_aes( output, input, 76 );
#else
cryptonight_hash_ctx ( output, input, 76 );
#endif #endif
} }
bool cryptonightV7 = false;
int scanhash_cryptonight( int thr_id, struct work *work, uint32_t max_nonce, int scanhash_cryptonight( int thr_id, struct work *work, uint32_t max_nonce,
uint64_t *hashes_done ) uint64_t *hashes_done )
{ {
@@ -80,6 +81,11 @@ int scanhash_cryptonight( int thr_id, struct work *work, uint32_t max_nonce,
const uint32_t first_nonce = n + 1; const uint32_t first_nonce = n + 1;
const uint32_t Htarg = ptarget[7]; const uint32_t Htarg = ptarget[7];
uint32_t hash[32 / 4] __attribute__((aligned(32))); uint32_t hash[32 / 4] __attribute__((aligned(32)));
if ( ( cryptonightV7 && ( *(uint8_t*)pdata < 7 ) )
|| ( !cryptonightV7 && ( *(uint8_t*)pdata == 7 ) ) )
applog(LOG_WARNING,"Cryptonight variant mismatch, shares may be rejected.");
do do
{ {
*nonceptr = ++n; *nonceptr = ++n;
@@ -97,6 +103,7 @@ int scanhash_cryptonight( int thr_id, struct work *work, uint32_t max_nonce,
bool register_cryptonight_algo( algo_gate_t* gate ) bool register_cryptonight_algo( algo_gate_t* gate )
{ {
cryptonightV7 = false;
register_json_rpc2( gate ); register_json_rpc2( gate );
gate->optimizations = SSE2_OPT | AES_OPT; gate->optimizations = SSE2_OPT | AES_OPT;
gate->scanhash = (void*)&scanhash_cryptonight; gate->scanhash = (void*)&scanhash_cryptonight;
@@ -106,3 +113,15 @@ bool register_cryptonight_algo( algo_gate_t* gate )
return true; return true;
}; };
bool register_cryptonightv7_algo( algo_gate_t* gate )
{
cryptonightV7 = true;
register_json_rpc2( gate );
gate->optimizations = SSE2_OPT | AES_OPT;
gate->scanhash = (void*)&scanhash_cryptonight;
gate->hash = (void*)&cryptonight_hash;
gate->hash_suw = (void*)&cryptonight_hash_suw;
gate->get_max64 = (void*)&get_max64_0x40LL;
return true;
};

View File

@@ -20,8 +20,8 @@
#include "crypto/c_jh.h" #include "crypto/c_jh.h"
#include "crypto/c_skein.h" #include "crypto/c_skein.h"
#include "crypto/int-util.h" #include "crypto/int-util.h"
#include "crypto/hash-ops.h" //#include "crypto/hash-ops.h"
//#include "cryptonight.h" #include "cryptonight.h"
#if USE_INT128 #if USE_INT128
@@ -51,6 +51,7 @@ typedef __uint128_t uint128_t;
#define INIT_SIZE_BLK 8 #define INIT_SIZE_BLK 8
#define INIT_SIZE_BYTE (INIT_SIZE_BLK * AES_BLOCK_SIZE) #define INIT_SIZE_BYTE (INIT_SIZE_BLK * AES_BLOCK_SIZE)
/*
#pragma pack(push, 1) #pragma pack(push, 1)
union cn_slow_hash_state { union cn_slow_hash_state {
union hash_state hs; union hash_state hs;
@@ -78,6 +79,7 @@ static void do_skein_hash(const void* input, size_t len, char* output) {
int r = skein_hash(8 * HASH_SIZE, input, 8 * len, (uint8_t*)output); int r = skein_hash(8 * HASH_SIZE, input, 8 * len, (uint8_t*)output);
assert(likely(SKEIN_SUCCESS == r)); assert(likely(SKEIN_SUCCESS == r));
} }
*/
extern int aesb_single_round(const uint8_t *in, uint8_t*out, const uint8_t *expandedKey); extern int aesb_single_round(const uint8_t *in, uint8_t*out, const uint8_t *expandedKey);
extern int aesb_pseudo_round_mut(uint8_t *val, uint8_t *expandedKey); extern int aesb_pseudo_round_mut(uint8_t *val, uint8_t *expandedKey);
@@ -120,9 +122,11 @@ static uint64_t mul128(uint64_t multiplier, uint64_t multiplicand, uint64_t* pro
extern uint64_t mul128(uint64_t multiplier, uint64_t multiplicand, uint64_t* product_hi); extern uint64_t mul128(uint64_t multiplier, uint64_t multiplicand, uint64_t* product_hi);
#endif #endif
/*
static void (* const extra_hashes[4])(const void *, size_t, char *) = { static void (* const extra_hashes[4])(const void *, size_t, char *) = {
do_blake_hash, do_groestl_hash, do_jh_hash, do_skein_hash do_blake_hash, do_groestl_hash, do_jh_hash, do_skein_hash
}; };
*/
static inline size_t e2i(const uint8_t* a) { static inline size_t e2i(const uint8_t* a) {
#if !LITE #if !LITE
@@ -132,14 +136,16 @@ static inline size_t e2i(const uint8_t* a) {
#endif #endif
} }
static inline void mul_sum_xor_dst(const uint8_t* a, uint8_t* c, uint8_t* dst) { static inline void mul_sum_xor_dst( const uint8_t* a, uint8_t* c, uint8_t* dst,
const uint64_t tweak )
{
uint64_t hi, lo = mul128(((uint64_t*) a)[0], ((uint64_t*) dst)[0], &hi) + ((uint64_t*) c)[1]; uint64_t hi, lo = mul128(((uint64_t*) a)[0], ((uint64_t*) dst)[0], &hi) + ((uint64_t*) c)[1];
hi += ((uint64_t*) c)[0]; hi += ((uint64_t*) c)[0];
((uint64_t*) c)[0] = ((uint64_t*) dst)[0] ^ hi; ((uint64_t*) c)[0] = ((uint64_t*) dst)[0] ^ hi;
((uint64_t*) c)[1] = ((uint64_t*) dst)[1] ^ lo; ((uint64_t*) c)[1] = ((uint64_t*) dst)[1] ^ lo;
((uint64_t*) dst)[0] = hi; ((uint64_t*) dst)[0] = hi;
((uint64_t*) dst)[1] = lo; ((uint64_t*) dst)[1] = cryptonightV7 ? lo ^ tweak : lo;
} }
static inline void xor_blocks(uint8_t* a, const uint8_t* b) { static inline void xor_blocks(uint8_t* a, const uint8_t* b) {
@@ -174,8 +180,16 @@ static __thread cryptonight_ctx ctx;
void cryptonight_hash_ctx(void* output, const void* input, int len) void cryptonight_hash_ctx(void* output, const void* input, int len)
{ {
hash_process(&ctx.state.hs, (const uint8_t*) input, len); // hash_process(&ctx.state.hs, (const uint8_t*) input, len);
ctx.aes_ctx = (oaes_ctx*) oaes_alloc(); keccak( (const uint8_t*)input, 76, (char*)&ctx.state.hs.b, 200 );
if ( cryptonightV7 && len < 43 )
return;
const uint64_t tweak = cryptonightV7
? *((const uint64_t*) (((const uint8_t*)input) + 35))
^ ctx.state.hs.w[24] : 0;
ctx.aes_ctx = (oaes_ctx*) oaes_alloc();
__builtin_prefetch( ctx.text, 0, 3 ); __builtin_prefetch( ctx.text, 0, 3 );
__builtin_prefetch( ctx.text + 64, 0, 3 ); __builtin_prefetch( ctx.text + 64, 0, 3 );
@@ -211,23 +225,44 @@ void cryptonight_hash_ctx(void* output, const void* input, int len)
xor_blocks_dst(&ctx.state.k[0], &ctx.state.k[32], ctx.a); xor_blocks_dst(&ctx.state.k[0], &ctx.state.k[32], ctx.a);
xor_blocks_dst(&ctx.state.k[16], &ctx.state.k[48], ctx.b); xor_blocks_dst(&ctx.state.k[16], &ctx.state.k[48], ctx.b);
for (i = 0; likely(i < ITER / 4); ++i) { for (i = 0; likely(i < ITER / 4); ++i)
/* Dependency chain: address -> read value ------+ {
* written value <-+ hard function (AES or MUL) <+ /* Dependency chain: address -> read value ------+
* next address <-+ * written value <-+ hard function (AES or MUL) <+
*/ * next address <-+
/* Iteration 1 */ */
j = e2i(ctx.a); /* Iteration 1 */
aesb_single_round(&ctx.long_state[j], ctx.c, ctx.a); j = e2i(ctx.a);
xor_blocks_dst(ctx.c, ctx.b, &ctx.long_state[j]); aesb_single_round(&ctx.long_state[j], ctx.c, ctx.a);
/* Iteration 2 */ xor_blocks_dst(ctx.c, ctx.b, &ctx.long_state[j]);
mul_sum_xor_dst(ctx.c, ctx.a, &ctx.long_state[e2i(ctx.c)]);
/* Iteration 3 */ if ( cryptonightV7 )
j = e2i(ctx.a); {
aesb_single_round(&ctx.long_state[j], ctx.b, ctx.a); uint8_t *lsa = (uint8_t*)&ctx.long_state[((uint64_t *)(ctx.a))[0] & 0x1FFFF0];
xor_blocks_dst(ctx.b, ctx.c, &ctx.long_state[j]); const uint8_t tmp = lsa[11];
/* Iteration 4 */ const uint8_t index = ( ( (tmp >> 3) & 6 ) | (tmp & 1) ) << 1;
mul_sum_xor_dst(ctx.b, ctx.a, &ctx.long_state[e2i(ctx.b)]); lsa[11] = tmp ^ ( ( 0x75310 >> index) & 0x30 );
}
/* Iteration 2 */
mul_sum_xor_dst(ctx.c, ctx.a, &ctx.long_state[e2i(ctx.c)], tweak );
/* Iteration 3 */
j = e2i(ctx.a);
aesb_single_round(&ctx.long_state[j], ctx.b, ctx.a);
xor_blocks_dst(ctx.b, ctx.c, &ctx.long_state[j]);
if ( cryptonightV7 )
{
uint8_t *lsa = (uint8_t*)&ctx.long_state[((uint64_t *)(ctx.a))[0] & 0x1FFFF0];
const uint8_t tmp = lsa[11];
const uint8_t index = ( ( (tmp >> 3) & 6 ) | (tmp & 1) ) << 1;
lsa[11] = tmp ^ ( ( 0x75310 >> index) & 0x30 );
}
/* Iteration 4 */
mul_sum_xor_dst(ctx.b, ctx.a, &ctx.long_state[e2i(ctx.b)], tweak );
} }
__builtin_prefetch( ctx.text, 0, 3 ); __builtin_prefetch( ctx.text, 0, 3 );
@@ -266,7 +301,8 @@ void cryptonight_hash_ctx(void* output, const void* input, int len)
aesb_pseudo_round_mut(&ctx.text[7 * AES_BLOCK_SIZE], ctx.aes_ctx->key->exp_data); aesb_pseudo_round_mut(&ctx.text[7 * AES_BLOCK_SIZE], ctx.aes_ctx->key->exp_data);
} }
memcpy(ctx.state.init, ctx.text, INIT_SIZE_BYTE); memcpy(ctx.state.init, ctx.text, INIT_SIZE_BYTE);
hash_permutation(&ctx.state.hs); // hash_permutation(&ctx.state.hs);
keccakf( (uint64_t*)&ctx.state.hs.w, 24 );
/*memcpy(hash, &state, 32);*/ /*memcpy(hash, &state, 32);*/
extra_hashes[ctx.state.hs.b[0] & 3](&ctx.state, 200, output); extra_hashes[ctx.state.hs.b[0] & 3](&ctx.state, 200, output);
oaes_free((OAES_CTX **) &ctx.aes_ctx); oaes_free((OAES_CTX **) &ctx.aes_ctx);

View File

@@ -45,5 +45,7 @@ int scanhash_cryptonight( int thr_id, struct work *work, uint32_t max_nonce,
void cryptonight_hash_aes( void *restrict output, const void *input, int len ); void cryptonight_hash_aes( void *restrict output, const void *input, int len );
extern bool cryptonightV7;
#endif #endif

20
configure vendored
View File

@@ -1,6 +1,6 @@
#! /bin/sh #! /bin/sh
# Guess values for system-dependent variables and create Makefiles. # Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.69 for cpuminer-opt 3.8.7.2. # Generated by GNU Autoconf 2.69 for cpuminer-opt 3.8.8.
# #
# #
# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
@@ -577,8 +577,8 @@ MAKEFLAGS=
# Identity of this package. # Identity of this package.
PACKAGE_NAME='cpuminer-opt' PACKAGE_NAME='cpuminer-opt'
PACKAGE_TARNAME='cpuminer-opt' PACKAGE_TARNAME='cpuminer-opt'
PACKAGE_VERSION='3.8.7.2' PACKAGE_VERSION='3.8.8'
PACKAGE_STRING='cpuminer-opt 3.8.7.2' PACKAGE_STRING='cpuminer-opt 3.8.8'
PACKAGE_BUGREPORT='' PACKAGE_BUGREPORT=''
PACKAGE_URL='' PACKAGE_URL=''
@@ -1321,7 +1321,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing. # Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh. # This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF cat <<_ACEOF
\`configure' configures cpuminer-opt 3.8.7.2 to adapt to many kinds of systems. \`configure' configures cpuminer-opt 3.8.8 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]... Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1392,7 +1392,7 @@ fi
if test -n "$ac_init_help"; then if test -n "$ac_init_help"; then
case $ac_init_help in case $ac_init_help in
short | recursive ) echo "Configuration of cpuminer-opt 3.8.7.2:";; short | recursive ) echo "Configuration of cpuminer-opt 3.8.8:";;
esac esac
cat <<\_ACEOF cat <<\_ACEOF
@@ -1497,7 +1497,7 @@ fi
test -n "$ac_init_help" && exit $ac_status test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then if $ac_init_version; then
cat <<\_ACEOF cat <<\_ACEOF
cpuminer-opt configure 3.8.7.2 cpuminer-opt configure 3.8.8
generated by GNU Autoconf 2.69 generated by GNU Autoconf 2.69
Copyright (C) 2012 Free Software Foundation, Inc. Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2000,7 +2000,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake. running configure, to aid debugging if configure makes a mistake.
It was created by cpuminer-opt $as_me 3.8.7.2, which was It was created by cpuminer-opt $as_me 3.8.8, which was
generated by GNU Autoconf 2.69. Invocation command line was generated by GNU Autoconf 2.69. Invocation command line was
$ $0 $@ $ $0 $@
@@ -2981,7 +2981,7 @@ fi
# Define the identity of the package. # Define the identity of the package.
PACKAGE='cpuminer-opt' PACKAGE='cpuminer-opt'
VERSION='3.8.7.2' VERSION='3.8.8'
cat >>confdefs.h <<_ACEOF cat >>confdefs.h <<_ACEOF
@@ -6677,7 +6677,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# report actual input values of CONFIG_FILES etc. instead of their # report actual input values of CONFIG_FILES etc. instead of their
# values after options handling. # values after options handling.
ac_log=" ac_log="
This file was extended by cpuminer-opt $as_me 3.8.7.2, which was This file was extended by cpuminer-opt $as_me 3.8.8, which was
generated by GNU Autoconf 2.69. Invocation command line was generated by GNU Autoconf 2.69. Invocation command line was
CONFIG_FILES = $CONFIG_FILES CONFIG_FILES = $CONFIG_FILES
@@ -6743,7 +6743,7 @@ _ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\ ac_cs_version="\\
cpuminer-opt config.status 3.8.7.2 cpuminer-opt config.status 3.8.8
configured by $0, generated by GNU Autoconf 2.69, configured by $0, generated by GNU Autoconf 2.69,
with options \\"\$ac_cs_config\\" with options \\"\$ac_cs_config\\"

View File

@@ -1,4 +1,4 @@
AC_INIT([cpuminer-opt], [3.8.7.2]) AC_INIT([cpuminer-opt], [3.8.8])
AC_PREREQ([2.59c]) AC_PREREQ([2.59c])
AC_CANONICAL_SYSTEM AC_CANONICAL_SYSTEM

View File

@@ -3002,11 +3002,13 @@ bool check_cpu_capability ()
bool cpu_has_sse2 = has_sse2(); bool cpu_has_sse2 = has_sse2();
bool cpu_has_aes = has_aes_ni(); bool cpu_has_aes = has_aes_ni();
bool cpu_has_sse42 = has_sse42(); bool cpu_has_sse42 = has_sse42();
bool cpu_has_avx = has_avx1();
bool cpu_has_avx2 = has_avx2(); bool cpu_has_avx2 = has_avx2();
bool cpu_has_sha = has_sha(); bool cpu_has_sha = has_sha();
bool cpu_has_avx512 = has_avx512f(); bool cpu_has_avx512 = has_avx512f();
bool sw_has_aes = false; bool sw_has_aes = false;
bool sw_has_sse42 = false; bool sw_has_sse42 = false;
bool sw_has_avx = false;
bool sw_has_avx2 = false; bool sw_has_avx2 = false;
bool sw_has_avx512 = false; bool sw_has_avx512 = false;
bool sw_has_sha = false; bool sw_has_sha = false;
@@ -3031,6 +3033,9 @@ bool check_cpu_capability ()
#ifdef __SSE4_2__ #ifdef __SSE4_2__
sw_has_sse42 = true; sw_has_sse42 = true;
#endif #endif
#ifdef __AVX__
sw_has_avx = true;
#endif
#ifdef __AVX2__ #ifdef __AVX2__
sw_has_avx2 = true; sw_has_avx2 = true;
#endif #endif
@@ -3059,19 +3064,21 @@ bool check_cpu_capability ()
#endif #endif
printf("CPU features:"); printf("CPU features:");
if ( cpu_has_sse2 ) printf( " SSE2" ); if ( cpu_has_sse2 ) printf( " SSE2" );
if ( cpu_has_aes ) printf( " AES" ); if ( cpu_has_aes ) printf( " AES" );
if ( cpu_has_sse42 ) printf( " SSE4.2" ); if ( cpu_has_sse42 ) printf( " SSE4.2" );
if ( cpu_has_avx2 ) printf( " AVX2" ); if ( cpu_has_avx ) printf( " AVX" );
if ( cpu_has_avx2 ) printf( " AVX2" );
if ( cpu_has_avx512 ) printf( " AVX512" ); if ( cpu_has_avx512 ) printf( " AVX512" );
if ( cpu_has_sha ) printf( " SHA" ); if ( cpu_has_sha ) printf( " SHA" );
printf(".\nSW features: SSE2"); printf(".\nSW features: SSE2");
if ( sw_has_aes ) printf( " AES" ); if ( sw_has_aes ) printf( " AES" );
if ( sw_has_sse42 ) printf( " SSE4.2" ); if ( sw_has_sse42 ) printf( " SSE4.2" );
if ( sw_has_avx2 ) printf( " AVX2" ); if ( sw_has_avx ) printf( " AVX" );
if ( sw_has_avx2 ) printf( " AVX2" );
if ( sw_has_avx512 ) printf( " AVX512" ); if ( sw_has_avx512 ) printf( " AVX512" );
if ( sw_has_sha ) printf( " SHA" ); if ( sw_has_sha ) printf( " SHA" );
printf(".\nAlgo features:"); printf(".\nAlgo features:");

145
miner.h
View File

@@ -498,7 +498,8 @@ enum algos {
ALGO_BMW, ALGO_BMW,
ALGO_C11, ALGO_C11,
ALGO_CRYPTOLIGHT, ALGO_CRYPTOLIGHT,
ALGO_CRYPTONIGHT, ALGO_CRYPTONIGHT,
ALGO_CRYPTONIGHTV7,
ALGO_DECRED, ALGO_DECRED,
ALGO_DEEP, ALGO_DEEP,
ALGO_DMD_GR, ALGO_DMD_GR,
@@ -580,6 +581,7 @@ static const char* const algo_names[] = {
"c11", "c11",
"cryptolight", "cryptolight",
"cryptonight", "cryptonight",
"cryptonightv7",
"decred", "decred",
"deep", "deep",
"dmd-gr", "dmd-gr",
@@ -704,83 +706,84 @@ static char const usage[] = "\
Usage: " PACKAGE_NAME " [OPTIONS]\n\ Usage: " PACKAGE_NAME " [OPTIONS]\n\
Options:\n\ Options:\n\
-a, --algo=ALGO specify the algorithm to use\n\ -a, --algo=ALGO specify the algorithm to use\n\
allium Garlicoin (GRLC)\n\ allium Garlicoin (GRLC)\n\
anime Animecoin (ANI)\n\ anime Animecoin (ANI)\n\
argon2 Argon2 Coin (AR2)\n\ argon2 Argon2 Coin (AR2)\n\
argon2d250 argon2d-crds, Credits (CRDS)\n\ argon2d250 argon2d-crds, Credits (CRDS)\n\
argon2d500 argon2d-dyn, Dynamic (DYN)\n\ argon2d500 argon2d-dyn, Dynamic (DYN)\n\
argon2d4096 argon2d-uis, Unitus (UIS)\n\ argon2d4096 argon2d-uis, Unitus (UIS)\n\
axiom Shabal-256 MemoHash\n\ axiom Shabal-256 MemoHash\n\
bastion\n\ bastion\n\
blake blake256r14 (SFR)\n\ blake blake256r14 (SFR)\n\
blakecoin blake256r8\n\ blakecoin blake256r8\n\
blake2s Blake-2 S\n\ blake2s Blake-2 S\n\
bmw BMW 256\n\ bmw BMW 256\n\
c11 Chaincoin\n\ c11 Chaincoin\n\
cryptolight Cryptonight-light\n\ cryptolight Cryptonight-light\n\
cryptonight cryptonote, Monero (XMR)\n\ cryptonight Cryptonote legacy\n\
decred Blake256r14dcr\n\ cryptonightv7 variant 7, Monero (XMR)\n\
deep Deepcoin (DCN)\n\ decred Blake256r14dcr\n\
dmd-gr Diamond\n\ deep Deepcoin (DCN)\n\
drop Dropcoin\n\ dmd-gr Diamond\n\
fresh Fresh\n\ drop Dropcoin\n\
groestl Groestl coin\n\ fresh Fresh\n\
heavy Heavy\n\ groestl Groestl coin\n\
hmq1725 Espers\n\ heavy Heavy\n\
hodl Hodlcoin\n\ hmq1725 Espers\n\
jha jackppot (Jackpotcoin)\n\ hodl Hodlcoin\n\
keccak Maxcoin\n\ jha jackppot (Jackpotcoin)\n\
keccakc Creative Coin\n\ keccak Maxcoin\n\
lbry LBC, LBRY Credits\n\ keccakc Creative Coin\n\
luffa Luffa\n\ lbry LBC, LBRY Credits\n\
lyra2h Hppcoin\n\ luffa Luffa\n\
lyra2re lyra2\n\ lyra2h Hppcoin\n\
lyra2rev2 lyrav2, Vertcoin\n\ lyra2re lyra2\n\
lyra2z Zcoin (XZC)\n\ lyra2rev2 lyrav2, Vertcoin\n\
lyra2z330 Lyra2 330 rows, Zoin (ZOI)\n\ lyra2z Zcoin (XZC)\n\
m7m Magi (XMG)\n\ lyra2z330 Lyra2 330 rows, Zoin (ZOI)\n\
myr-gr Myriad-Groestl\n\ m7m Magi (XMG)\n\
neoscrypt NeoScrypt(128, 2, 1)\n\ myr-gr Myriad-Groestl\n\
nist5 Nist5\n\ neoscrypt NeoScrypt(128, 2, 1)\n\
pentablake 5 x blake512\n\ nist5 Nist5\n\
phi1612 phi, LUX coin\n\ pentablake 5 x blake512\n\
pluck Pluck:128 (Supcoin)\n\ phi1612 phi, LUX coin\n\
pluck Pluck:128 (Supcoin)\n\
polytimos\n\ polytimos\n\
quark Quark\n\ quark Quark\n\
qubit Qubit\n\ qubit Qubit\n\
scrypt scrypt(1024, 1, 1) (default)\n\ scrypt scrypt(1024, 1, 1) (default)\n\
scrypt:N scrypt(N, 1, 1)\n\ scrypt:N scrypt(N, 1, 1)\n\
scryptjane:nf\n\ scryptjane:nf\n\
sha256d Double SHA-256\n\ sha256d Double SHA-256\n\
sha256t Triple SHA-256, Onecoin (OC)\n\ sha256t Triple SHA-256, Onecoin (OC)\n\
shavite3 Shavite3\n\ shavite3 Shavite3\n\
skein Skein+Sha (Skeincoin)\n\ skein Skein+Sha (Skeincoin)\n\
skein2 Double Skein (Woodcoin)\n\ skein2 Double Skein (Woodcoin)\n\
skunk Signatum (SIGT)\n\ skunk Signatum (SIGT)\n\
timetravel timeravel8, Machinecoin (MAC)\n\ timetravel timeravel8, Machinecoin (MAC)\n\
timetravel10 Bitcore (BTX)\n\ timetravel10 Bitcore (BTX)\n\
tribus Denarius (DNR)\n\ tribus Denarius (DNR)\n\
vanilla blake256r8vnl (VCash)\n\ vanilla blake256r8vnl (VCash)\n\
veltor\n\ veltor\n\
whirlpool\n\ whirlpool\n\
whirlpoolx\n\ whirlpoolx\n\
x11 Dash\n\ x11 Dash\n\
x11evo Revolvercoin (XRE)\n\ x11evo Revolvercoin (XRE)\n\
x11gost sib (SibCoin)\n\ x11gost sib (SibCoin)\n\
x12 Galaxie Cash (GCH)\n\ x12 Galaxie Cash (GCH)\n\
x13 X13\n\ x13 X13\n\
x13sm3 hsr (Hshare)\n\ x13sm3 hsr (Hshare)\n\
x14 X14\n\ x14 X14\n\
x15 X15\n\ x15 X15\n\
x16r Ravencoin (RVN)\n\ x16r Ravencoin (RVN)\n\
x16s Pigeoncoin (PGN)\n\ x16s Pigeoncoin (PGN)\n\
x17\n\ x17\n\
xevan Bitsend (BSD)\n\ xevan Bitsend (BSD)\n\
yescrypt Globlboost-Y (BSTY)\n\ yescrypt Globlboost-Y (BSTY)\n\
yescryptr8 BitZeny (ZNY)\n\ yescryptr8 BitZeny (ZNY)\n\
yescryptr16 Yenten (YTN)\n\ yescryptr16 Yenten (YTN)\n\
yescryptr32 WAVI\n\ yescryptr32 WAVI\n\
zr5 Ziftr\n\ zr5 Ziftr\n\
-o, --url=URL URL of mining server\n\ -o, --url=URL URL of mining server\n\
-O, --userpass=U:P username:password pair for mining server\n\ -O, --userpass=U:P username:password pair for mining server\n\
-u, --user=USERNAME username for mining server\n\ -u, --user=USERNAME username for mining server\n\

View File

@@ -46,12 +46,12 @@ mv cpuminer.exe release/cpuminer-avx2.exe
#mv cpuminer.exe release/cpuminer-aes-sha.exe #mv cpuminer.exe release/cpuminer-aes-sha.exe
#make clean || echo clean make clean || echo clean
#rm -f config.status rm -f config.status
#CFLAGS="-O3 -march=corei7-avx -Wall" ./configure $F CFLAGS="-O3 -march=corei7-avx -Wall" ./configure $F
#make make
#strip -s cpuminer.exe strip -s cpuminer.exe
#mv cpuminer.exe release/cpuminer-aes-avx.exe mv cpuminer.exe release/cpuminer-avx.exe
# -march=westmere is supported in gcc5 # -march=westmere is supported in gcc5
make clean || echo clean make clean || echo clean