mirror of
https://github.com/JayDDee/cpuminer-opt.git
synced 2025-09-17 23:44:27 +00:00
Initial upload v3.4.7
This commit is contained in:
57
algo/groestl/sse2/grso.c
Normal file
57
algo/groestl/sse2/grso.c
Normal file
@@ -0,0 +1,57 @@
|
||||
/* hash.c January 2011
|
||||
*
|
||||
* Groestl-512 implementation with inline assembly containing mmx and
|
||||
* sse instructions. Optimized for Opteron.
|
||||
* Authors: Krystian Matusiewicz and Soeren S. Thomsen
|
||||
*
|
||||
* This code is placed in the public domain
|
||||
*/
|
||||
|
||||
#include "algo/groestl/sse2/grso-asm.h"
|
||||
#include "algo/groestl/sse2/grso.h"
|
||||
#include "algo/groestl/sse2/grsotab.h"
|
||||
|
||||
/* digest up to len bytes of input (full blocks only) */
|
||||
void grsoTransform(grsoState *ctx,
|
||||
const unsigned char *in,
|
||||
unsigned long long len) {
|
||||
u64 y[grsoCOLS+2] __attribute__ ((aligned (16)));
|
||||
u64 z[grsoCOLS+2] __attribute__ ((aligned (16)));
|
||||
u64 *m, *h = (u64*)ctx->grsstate;
|
||||
int i;
|
||||
|
||||
/* increment block counter */
|
||||
ctx->grsblock_counter += len/grsoSIZE;
|
||||
|
||||
/* digest message, one block at a time */
|
||||
for (; len >= grsoSIZE; len -= grsoSIZE, in += grsoSIZE) {
|
||||
m = (u64*)in;
|
||||
for (i = 0; i < grsoCOLS; i++) {
|
||||
y[i] = m[i];
|
||||
z[i] = m[i] ^ h[i];
|
||||
}
|
||||
|
||||
grsoQ1024ASM(y);
|
||||
grsoP1024ASM(z);
|
||||
|
||||
/* h' == h + Q(m) + P(h+m) */
|
||||
for (i = 0; i < grsoCOLS; i++) {
|
||||
h[i] ^= z[i] ^ y[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* given state h, do h <- P(h)+h */
|
||||
void grsoOutputTransformation(grsoState *ctx) {
|
||||
u64 z[grsoCOLS] __attribute__ ((aligned (16)));
|
||||
int j;
|
||||
|
||||
for (j = 0; j < grsoCOLS; j++) {
|
||||
z[j] = ctx->grsstate[j];
|
||||
}
|
||||
grsoP1024ASM(z);
|
||||
for (j = 0; j < grsoCOLS; j++) {
|
||||
ctx->grsstate[j] ^= z[j];
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user