mirror of
https://github.com/JayDDee/cpuminer-opt.git
synced 2025-09-17 23:44:27 +00:00
v3.5.13
This commit is contained in:
@@ -10,10 +10,7 @@
|
||||
#endif
|
||||
#include "cubehash_sse2.h"
|
||||
#include "algo/sha3/sha3-defs.h"
|
||||
|
||||
//enum { SUCCESS = 0, FAIL = 1, BAD_HASHBITLEN = 2 };
|
||||
|
||||
//#if defined(OPTIMIZE_SSE2)
|
||||
//#include "avxdefs.h"
|
||||
|
||||
static void transform( cubehashParam *sp )
|
||||
{
|
||||
@@ -143,72 +140,71 @@ int cubehashInit(cubehashParam *sp, int hashbitlen, int rounds, int blockbytes)
|
||||
if ( blockbytes <= 0 || blockbytes >= 256)
|
||||
blockbytes = CUBEHASH_BLOCKBYTES;
|
||||
|
||||
sp->hashbitlen = hashbitlen;
|
||||
sp->rounds = rounds;
|
||||
sp->blockbytes = blockbytes;
|
||||
// all sizes of __m128i
|
||||
sp->hashlen = hashbitlen/128;
|
||||
sp->blocksize = blockbytes/16;
|
||||
sp->rounds = rounds;
|
||||
sp->pos = 0;
|
||||
|
||||
for ( i = 0; i < 8; ++i )
|
||||
sp->x[i] = _mm_set_epi32(0, 0, 0, 0);
|
||||
sp->x[0] = _mm_set_epi32(0, sp->rounds, sp->blockbytes, hashbitlen / 8);
|
||||
|
||||
sp->x[0] = _mm_set_epi32( 0, rounds, blockbytes, hashbitlen / 8 );
|
||||
|
||||
for ( i = 0; i < 10; ++i )
|
||||
transform(sp);
|
||||
sp->pos = 0;
|
||||
// sp->pos = 0;
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
int
|
||||
cubehashReset(cubehashParam *sp)
|
||||
{
|
||||
return cubehashInit(sp, sp->hashbitlen, sp->rounds, sp->blockbytes);
|
||||
}
|
||||
|
||||
int cubehashUpdate( cubehashParam *sp, const byte *data, size_t size )
|
||||
{
|
||||
uint64_t databitlen = 8 * size;
|
||||
const int len = size / 16;
|
||||
const __m128i* in = (__m128i*)data;
|
||||
int i;
|
||||
|
||||
/* caller promises us that previous data had integral number of bytes */
|
||||
/* so sp->pos is a multiple of 8 */
|
||||
// It is assumed data is aligned to 256 bits and is a multiple of 128 bits.
|
||||
// Current usage sata is either 64 or 80 bytes.
|
||||
|
||||
while ( databitlen >= 8 )
|
||||
for ( i = 0; i < len; i++ )
|
||||
{
|
||||
( (unsigned char *)sp->x )[sp->pos/8] ^= *data;
|
||||
data += 1;
|
||||
databitlen -= 8;
|
||||
sp->pos += 8;
|
||||
if ( sp->pos == 8 * sp->blockbytes )
|
||||
sp->x[ sp->pos ] = _mm_xor_si128( sp->x[ sp->pos ], in[i] );
|
||||
sp->pos++;
|
||||
if ( sp->pos == sp->blocksize )
|
||||
{
|
||||
transform( sp );
|
||||
sp->pos = 0;
|
||||
}
|
||||
}
|
||||
if ( databitlen > 0 )
|
||||
{
|
||||
( (unsigned char *)sp->x )[sp->pos/8] ^= *data;
|
||||
sp->pos += databitlen;
|
||||
transform( sp );
|
||||
sp->pos = 0;
|
||||
}
|
||||
}
|
||||
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
int cubehashDigest( cubehashParam *sp, byte *digest )
|
||||
{
|
||||
__m128i* hash = (__m128i*)digest;
|
||||
int i;
|
||||
|
||||
( (unsigned char *)sp->x )[sp->pos/8] ^= ( 128 >> (sp->pos % 8) );
|
||||
transform(sp);
|
||||
// pos is zero for 64 byte data, 1 for 80 byte data.
|
||||
sp->x[ sp->pos ] = _mm_xor_si128( sp->x[ sp->pos ],
|
||||
_mm_set_epi8( 0,0,0,0, 0,0,0,0,
|
||||
0,0,0,0, 0,0,0,0x80 ) );
|
||||
transform( sp );
|
||||
|
||||
sp->x[7] = _mm_xor_si128(sp->x[7], _mm_set_epi32(1, 0, 0, 0));
|
||||
transform(sp);
|
||||
transform(sp);
|
||||
transform(sp);
|
||||
transform(sp);
|
||||
transform(sp);
|
||||
transform(sp);
|
||||
transform(sp);
|
||||
transform(sp);
|
||||
transform(sp);
|
||||
transform(sp);
|
||||
sp->x[7] = _mm_xor_si128( sp->x[7], _mm_set_epi32( 1,0,0,0 ) );
|
||||
transform( sp );
|
||||
transform( sp );
|
||||
transform( sp );
|
||||
transform( sp );
|
||||
transform( sp );
|
||||
transform( sp );
|
||||
transform( sp );
|
||||
transform( sp );
|
||||
transform( sp );
|
||||
transform( sp );
|
||||
|
||||
for ( i = 0; i < sp->hashbitlen / 8; ++i )
|
||||
digest[i] = ((unsigned char *) sp->x)[i];
|
||||
for ( i = 0; i < sp->hashlen; i++ )
|
||||
hash[i] = sp->x[i];
|
||||
|
||||
return SUCCESS;
|
||||
}
|
||||
@@ -216,48 +212,45 @@ int cubehashDigest( cubehashParam *sp, byte *digest )
|
||||
int cubehashUpdateDigest( cubehashParam *sp, byte *digest,
|
||||
const byte *data, size_t size )
|
||||
{
|
||||
uint64_t databitlen = 8 * size;
|
||||
int hashlen128 = sp->hashbitlen/128;
|
||||
const int len = size / 16;
|
||||
const __m128i* in = (__m128i*)data;
|
||||
__m128i* hash = (__m128i*)digest;
|
||||
int i;
|
||||
|
||||
/* caller promises us that previous data had integral number of bytes */
|
||||
/* so sp->pos is a multiple of 8 */
|
||||
// It is assumed data is aligned to 256 bits and is a multiple of 128 bits.
|
||||
// Current usage sata is either 64 or 80 bytes.
|
||||
|
||||
while ( databitlen >= 8 )
|
||||
for ( i = 0; i < len; i++ )
|
||||
{
|
||||
( (unsigned char *)sp->x )[sp->pos/8] ^= *data;
|
||||
data += 1;
|
||||
databitlen -= 8;
|
||||
sp->pos += 8;
|
||||
if ( sp->pos == 8 * sp->blockbytes )
|
||||
sp->x[ sp->pos ] = _mm_xor_si128( sp->x[ sp->pos ], in[i] );
|
||||
sp->pos++;
|
||||
if ( sp->pos == sp->blocksize )
|
||||
{
|
||||
transform(sp);
|
||||
sp->pos = 0;
|
||||
transform( sp );
|
||||
sp->pos = 0;
|
||||
}
|
||||
}
|
||||
if ( databitlen > 0 )
|
||||
{
|
||||
( (unsigned char *)sp->x )[sp->pos/8] ^= *data;
|
||||
sp->pos += databitlen;
|
||||
}
|
||||
|
||||
( (unsigned char *)sp->x )[sp->pos/8] ^= ( 128 >> (sp->pos % 8) );
|
||||
// pos is zero for 64 byte data, 1 for 80 byte data.
|
||||
sp->x[ sp->pos ] = _mm_xor_si128( sp->x[ sp->pos ],
|
||||
_mm_set_epi8( 0,0,0,0, 0,0,0,0,
|
||||
0,0,0,0, 0,0,0,0x80 ) );
|
||||
transform( sp );
|
||||
|
||||
sp->x[7] = _mm_xor_si128( sp->x[7], _mm_set_epi32(1,0,0,0) );
|
||||
transform(sp);
|
||||
transform(sp);
|
||||
transform(sp);
|
||||
transform(sp);
|
||||
transform(sp);
|
||||
transform(sp);
|
||||
transform(sp);
|
||||
transform(sp);
|
||||
transform(sp);
|
||||
transform(sp);
|
||||
sp->x[7] = _mm_xor_si128( sp->x[7], _mm_set_epi32( 1,0,0,0 ) );
|
||||
transform( sp );
|
||||
transform( sp );
|
||||
transform( sp );
|
||||
transform( sp );
|
||||
transform( sp );
|
||||
transform( sp );
|
||||
transform( sp );
|
||||
transform( sp );
|
||||
transform( sp );
|
||||
transform( sp );
|
||||
|
||||
for ( i = 0; i < hashlen128; i++ )
|
||||
( (__m128i*)digest )[i] = ( (__m128i*)sp->x )[i];
|
||||
for ( i = 0; i < sp->hashlen; i++ )
|
||||
hash[i] = sp->x[i];
|
||||
|
||||
return SUCCESS;
|
||||
}
|
||||
|
@@ -4,57 +4,34 @@
|
||||
#include "compat.h"
|
||||
#include <stdint.h>
|
||||
#include "algo/sha3/sha3-defs.h"
|
||||
//#include <beecrypt/beecrypt.h>
|
||||
|
||||
//#if defined(__SSE2__)
|
||||
#define OPTIMIZE_SSE2
|
||||
//#endif
|
||||
|
||||
#if defined(OPTIMIZE_SSE2)
|
||||
#include <emmintrin.h>
|
||||
#endif
|
||||
|
||||
/*!\brief Holds all the parameters necessary for the CUBEHASH algorithm.
|
||||
* \ingroup HASH_cubehash_m
|
||||
*/
|
||||
|
||||
struct _cubehashParam
|
||||
//#endif
|
||||
{
|
||||
int hashbitlen;
|
||||
int hashlen; // __m128i
|
||||
int rounds;
|
||||
int blockbytes;
|
||||
int pos; /* number of bits read into x from current block */
|
||||
#if defined(OPTIMIZE_SSE2)
|
||||
__m128i _ALIGN(256) x[8];
|
||||
#else
|
||||
uint32_t x[32];
|
||||
#endif
|
||||
int blocksize; // __m128i
|
||||
int pos; // number of __m128i read into x from current block
|
||||
__m128i _ALIGN(256) x[8]; // aligned for __m256i
|
||||
};
|
||||
|
||||
//#ifndef __cplusplus
|
||||
typedef struct _cubehashParam cubehashParam;
|
||||
//#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*!\var cubehash256
|
||||
* \brief Holds the full API description of the CUBEHASH algorithm.
|
||||
*/
|
||||
//extern BEECRYPTAPI const hashFunction cubehash256;
|
||||
|
||||
//BEECRYPTAPI
|
||||
int cubehashInit(cubehashParam* sp, int hashbitlen, int rounds, int blockbytes);
|
||||
|
||||
//BEECRYPTAPI
|
||||
int cubehashReset(cubehashParam* sp);
|
||||
|
||||
//BEECRYPTAPI
|
||||
int cubehashUpdate(cubehashParam* sp, const byte *data, size_t size);
|
||||
|
||||
//BEECRYPTAPI
|
||||
int cubehashDigest(cubehashParam* sp, byte *digest);
|
||||
|
||||
int cubehashUpdateDigest( cubehashParam *sp, byte *digest, const byte *data,
|
||||
|
Reference in New Issue
Block a user