Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
tpruvot
GitHub Repository: tpruvot/cpuminer-multi
Path: blob/linux/scryptjane/scrypt-jane-romix-template.h
1201 views
1
#if !defined(SCRYPT_CHOOSE_COMPILETIME) || !defined(SCRYPT_HAVE_ROMIX)
2
3
#if defined(SCRYPT_CHOOSE_COMPILETIME)
4
#undef SCRYPT_ROMIX_FN
5
#define SCRYPT_ROMIX_FN scrypt_ROMix
6
#endif
7
8
#undef SCRYPT_HAVE_ROMIX
9
#define SCRYPT_HAVE_ROMIX
10
11
#if !defined(SCRYPT_CHUNKMIX_FN)
12
13
#define SCRYPT_CHUNKMIX_FN scrypt_ChunkMix_basic
14
15
/*
16
Bout = ChunkMix(Bin)
17
18
2*r: number of blocks in the chunk
19
*/
20
static void /* asm_calling_convention */
21
SCRYPT_CHUNKMIX_FN(scrypt_mix_word_t *Bout/*[chunkWords]*/, scrypt_mix_word_t *Bin/*[chunkWords]*/, scrypt_mix_word_t *Bxor/*[chunkWords]*/, uint32_t r) {
22
scrypt_mix_word_t MM16 X[SCRYPT_BLOCK_WORDS], *block;
23
uint32_t i, j, blocksPerChunk = r * 2, half = 0;
24
25
/* 1: X = B_{2r - 1} */
26
block = scrypt_block(Bin, blocksPerChunk - 1);
27
for (i = 0; i < SCRYPT_BLOCK_WORDS; i++)
28
X[i] = block[i];
29
30
if (Bxor) {
31
block = scrypt_block(Bxor, blocksPerChunk - 1);
32
for (i = 0; i < SCRYPT_BLOCK_WORDS; i++)
33
X[i] ^= block[i];
34
}
35
36
/* 2: for i = 0 to 2r - 1 do */
37
for (i = 0; i < blocksPerChunk; i++, half ^= r) {
38
/* 3: X = H(X ^ B_i) */
39
block = scrypt_block(Bin, i);
40
for (j = 0; j < SCRYPT_BLOCK_WORDS; j++)
41
X[j] ^= block[j];
42
43
if (Bxor) {
44
block = scrypt_block(Bxor, i);
45
for (j = 0; j < SCRYPT_BLOCK_WORDS; j++)
46
X[j] ^= block[j];
47
}
48
SCRYPT_MIX_FN(X);
49
50
/* 4: Y_i = X */
51
/* 6: B'[0..r-1] = Y_even */
52
/* 6: B'[r..2r-1] = Y_odd */
53
block = scrypt_block(Bout, (i / 2) + half);
54
for (j = 0; j < SCRYPT_BLOCK_WORDS; j++)
55
block[j] = X[j];
56
}
57
}
58
#endif
59
60
/*
61
X = ROMix(X)
62
63
X: chunk to mix
64
Y: scratch chunk
65
N: number of rounds
66
V[N]: array of chunks to randomly index in to
67
2*r: number of blocks in a chunk
68
*/
69
70
static void NOINLINE FASTCALL
71
SCRYPT_ROMIX_FN(scrypt_mix_word_t *X/*[chunkWords]*/, scrypt_mix_word_t *Y/*[chunkWords]*/, scrypt_mix_word_t *V/*[N * chunkWords]*/, uint32_t N, uint32_t r) {
72
uint32_t i, j, chunkWords = SCRYPT_BLOCK_WORDS * r * 2;
73
scrypt_mix_word_t *block = V;
74
75
SCRYPT_ROMIX_TANGLE_FN(X, r * 2);
76
77
/* 1: X = B */
78
/* implicit */
79
80
/* 2: for i = 0 to N - 1 do */
81
memcpy(block, X, chunkWords * sizeof(scrypt_mix_word_t));
82
for (i = 0; i < N - 1; i++, block += chunkWords) {
83
/* 3: V_i = X */
84
/* 4: X = H(X) */
85
SCRYPT_CHUNKMIX_FN(block + chunkWords, block, NULL, r);
86
}
87
SCRYPT_CHUNKMIX_FN(X, block, NULL, r);
88
89
/* 6: for i = 0 to N - 1 do */
90
for (i = 0; i < N; i += 2) {
91
/* 7: j = Integerify(X) % N */
92
j = X[chunkWords - SCRYPT_BLOCK_WORDS] & (N - 1);
93
94
/* 8: X = H(Y ^ V_j) */
95
SCRYPT_CHUNKMIX_FN(Y, X, scrypt_item(V, j, chunkWords), r);
96
97
/* 7: j = Integerify(Y) % N */
98
j = Y[chunkWords - SCRYPT_BLOCK_WORDS] & (N - 1);
99
100
/* 8: X = H(Y ^ V_j) */
101
SCRYPT_CHUNKMIX_FN(X, Y, scrypt_item(V, j, chunkWords), r);
102
}
103
104
/* 10: B' = X */
105
/* implicit */
106
107
SCRYPT_ROMIX_UNTANGLE_FN(X, r * 2);
108
}
109
110
/*
111
* Special version with hard-coded r = 1
112
* - mikaelh
113
*/
114
static void NOINLINE FASTCALL
115
scrypt_ROMix_1(scrypt_mix_word_t *X/*[chunkWords]*/, scrypt_mix_word_t *Y/*[chunkWords]*/, scrypt_mix_word_t *V/*[N * chunkWords]*/, uint32_t N) {
116
const uint32_t r = 1;
117
uint32_t i, j, chunkWords = SCRYPT_BLOCK_WORDS * r * 2;
118
scrypt_mix_word_t *block = V;
119
120
SCRYPT_ROMIX_TANGLE_FN(X, r * 2);
121
122
/* 1: X = B */
123
/* implicit */
124
125
/* 2: for i = 0 to N - 1 do */
126
memcpy(block, X, chunkWords * sizeof(scrypt_mix_word_t));
127
for (i = 0; i < N - 1; i++, block += chunkWords) {
128
/* 3: V_i = X */
129
/* 4: X = H(X) */
130
#ifdef SCRYPT_CHUNKMIX_1_FN
131
SCRYPT_CHUNKMIX_1_FN(block + chunkWords, block);
132
#else
133
SCRYPT_CHUNKMIX_FN(block + chunkWords, block, NULL, r);
134
#endif
135
}
136
#ifdef SCRYPT_CHUNKMIX_1_FN
137
SCRYPT_CHUNKMIX_1_FN(X, block);
138
#else
139
SCRYPT_CHUNKMIX_FN(X, block, NULL, r);
140
#endif
141
142
/* 6: for i = 0 to N - 1 do */
143
for (i = 0; i < N; i += 2) {
144
/* 7: j = Integerify(X) % N */
145
j = X[chunkWords - SCRYPT_BLOCK_WORDS] & (N - 1);
146
147
/* 8: X = H(Y ^ V_j) */
148
#ifdef SCRYPT_CHUNKMIX_1_XOR_FN
149
SCRYPT_CHUNKMIX_1_XOR_FN(Y, X, scrypt_item(V, j, chunkWords));
150
#else
151
SCRYPT_CHUNKMIX_FN(Y, X, scrypt_item(V, j, chunkWords), r);
152
#endif
153
154
/* 7: j = Integerify(Y) % N */
155
j = Y[chunkWords - SCRYPT_BLOCK_WORDS] & (N - 1);
156
157
/* 8: X = H(Y ^ V_j) */
158
#ifdef SCRYPT_CHUNKMIX_1_XOR_FN
159
SCRYPT_CHUNKMIX_1_XOR_FN(X, Y, scrypt_item(V, j, chunkWords));
160
#else
161
SCRYPT_CHUNKMIX_FN(X, Y, scrypt_item(V, j, chunkWords), r);
162
#endif
163
}
164
165
/* 10: B' = X */
166
/* implicit */
167
168
SCRYPT_ROMIX_UNTANGLE_FN(X, r * 2);
169
}
170
171
#endif /* !defined(SCRYPT_CHOOSE_COMPILETIME) || !defined(SCRYPT_HAVE_ROMIX) */
172
173
174
#undef SCRYPT_CHUNKMIX_FN
175
#undef SCRYPT_ROMIX_FN
176
#undef SCRYPT_MIX_FN
177
#undef SCRYPT_ROMIX_TANGLE_FN
178
#undef SCRYPT_ROMIX_UNTANGLE_FN
179
180
181