Coverage Report

Created: 2026-10-03 10:33

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/tmp/bitcoin/src/crypto/sha256_arm_shani.cpp
Line
Count
Source
1
// Copyright (c) 2022-present The Bitcoin Core developers
2
// Distributed under the MIT software license, see the accompanying
3
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
4
//
5
// Based on https://github.com/noloader/SHA-Intrinsics/blob/master/sha256-arm.c,
6
// Written and placed in public domain by Jeffrey Walton.
7
// Based on code from ARM, and by Johannes Schneiders, Skip Hovsmith and
8
// Barry O'Rourke for the mbedTLS project.
9
// Variant specialized for 64-byte inputs added by Pieter Wuille.
10
11
#ifdef ENABLE_ARM_SHANI
12
13
#include <array>
14
#include <cstdint>
15
#include <cstddef>
16
#include <arm_neon.h>
17
18
namespace {
19
alignas(uint32x4_t) static constexpr std::array<uint32_t, 64> K =
20
{
21
    0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5,
22
    0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5,
23
    0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3,
24
    0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174,
25
    0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC,
26
    0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA,
27
    0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7,
28
    0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967,
29
    0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13,
30
    0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85,
31
    0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3,
32
    0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070,
33
    0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5,
34
    0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3,
35
    0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208,
36
    0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2,
37
};
38
}
39
40
namespace sha256_arm_shani {
41
void Transform(uint32_t* s, const unsigned char* chunk, size_t blocks)
42
119M
{
43
119M
    uint32x4_t STATE0, STATE1, ABCD_SAVE, EFGH_SAVE;
44
119M
    uint32x4_t MSG0, MSG1, MSG2, MSG3;
45
119M
    uint32x4_t TMP0, TMP2;
46
47
    // Load state
48
119M
    STATE0 = vld1q_u32(&s[0]);
49
119M
    STATE1 = vld1q_u32(&s[4]);
50
51
366M
    while (blocks--)
52
246M
    {
53
        // Save state
54
246M
        ABCD_SAVE = STATE0;
55
246M
        EFGH_SAVE = STATE1;
56
57
        // Load and convert input chunk to Big Endian
58
246M
        MSG0 = vreinterpretq_u32_u8(vrev32q_u8(vld1q_u8(chunk + 0)));
59
246M
        MSG1 = vreinterpretq_u32_u8(vrev32q_u8(vld1q_u8(chunk + 16)));
60
246M
        MSG2 = vreinterpretq_u32_u8(vrev32q_u8(vld1q_u8(chunk + 32)));
61
246M
        MSG3 = vreinterpretq_u32_u8(vrev32q_u8(vld1q_u8(chunk + 48)));
62
246M
        chunk += 64;
63
64
        // Original implementation preloaded message and constant addition which was 1-3% slower.
65
        // Now included as first step in quad round code saving one Q Neon register
66
        // "TMP0 = vaddq_u32(MSG0, vld1q_u32(&K[0]));"
67
68
        // Rounds 1-4
69
246M
        TMP0 = vaddq_u32(MSG0, vld1q_u32(&K[0]));
70
246M
        TMP2 = STATE0;
71
246M
        MSG0 = vsha256su0q_u32(MSG0, MSG1);
72
246M
        STATE0 = vsha256hq_u32(STATE0, STATE1, TMP0);
73
246M
        STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP0);
74
246M
        MSG0 = vsha256su1q_u32(MSG0, MSG2, MSG3);
75
76
        // Rounds 5-8
77
246M
        TMP0 = vaddq_u32(MSG1, vld1q_u32(&K[4]));
78
246M
        TMP2 = STATE0;
79
246M
        MSG1 = vsha256su0q_u32(MSG1, MSG2);
80
246M
        STATE0 = vsha256hq_u32(STATE0, STATE1, TMP0);
81
246M
        STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP0);
82
246M
        MSG1 = vsha256su1q_u32(MSG1, MSG3, MSG0);
83
84
        // Rounds 9-12
85
246M
        TMP0 = vaddq_u32(MSG2, vld1q_u32(&K[8]));
86
246M
        TMP2 = STATE0;
87
246M
        MSG2 = vsha256su0q_u32(MSG2, MSG3);
88
246M
        STATE0 = vsha256hq_u32(STATE0, STATE1, TMP0);
89
246M
        STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP0);
90
246M
        MSG2 = vsha256su1q_u32(MSG2, MSG0, MSG1);
91
92
        // Rounds 13-16
93
246M
        TMP0 = vaddq_u32(MSG3, vld1q_u32(&K[12]));
94
246M
        TMP2 = STATE0;
95
246M
        MSG3 = vsha256su0q_u32(MSG3, MSG0);
96
246M
        STATE0 = vsha256hq_u32(STATE0, STATE1, TMP0);
97
246M
        STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP0);
98
246M
        MSG3 = vsha256su1q_u32(MSG3, MSG1, MSG2);
99
100
        // Rounds 17-20
101
246M
        TMP0 = vaddq_u32(MSG0, vld1q_u32(&K[16]));
102
246M
        TMP2 = STATE0;
103
246M
        MSG0 = vsha256su0q_u32(MSG0, MSG1);
104
246M
        STATE0 = vsha256hq_u32(STATE0, STATE1, TMP0);
105
246M
        STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP0);
106
246M
        MSG0 = vsha256su1q_u32(MSG0, MSG2, MSG3);
107
108
        // Rounds 21-24
109
246M
        TMP0 = vaddq_u32(MSG1, vld1q_u32(&K[20]));
110
246M
        TMP2 = STATE0;
111
246M
        MSG1 = vsha256su0q_u32(MSG1, MSG2);
112
246M
        STATE0 = vsha256hq_u32(STATE0, STATE1, TMP0);
113
246M
        STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP0);
114
246M
        MSG1 = vsha256su1q_u32(MSG1, MSG3, MSG0);
115
116
        // Rounds 25-28
117
246M
        TMP0 = vaddq_u32(MSG2, vld1q_u32(&K[24]));
118
246M
        TMP2 = STATE0;
119
246M
        MSG2 = vsha256su0q_u32(MSG2, MSG3);
120
246M
        STATE0 = vsha256hq_u32(STATE0, STATE1, TMP0);
121
246M
        STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP0);
122
246M
        MSG2 = vsha256su1q_u32(MSG2, MSG0, MSG1);
123
124
        // Rounds 29-32
125
246M
        TMP0 = vaddq_u32(MSG3, vld1q_u32(&K[28]));
126
246M
        TMP2 = STATE0;
127
246M
        MSG3 = vsha256su0q_u32(MSG3, MSG0);
128
246M
        STATE0 = vsha256hq_u32(STATE0, STATE1, TMP0);
129
246M
        STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP0);
130
246M
        MSG3 = vsha256su1q_u32(MSG3, MSG1, MSG2);
131
132
        // Rounds 33-36
133
246M
        TMP0 = vaddq_u32(MSG0, vld1q_u32(&K[32]));
134
246M
        TMP2 = STATE0;
135
246M
        MSG0 = vsha256su0q_u32(MSG0, MSG1);
136
246M
        STATE0 = vsha256hq_u32(STATE0, STATE1, TMP0);
137
246M
        STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP0);
138
246M
        MSG0 = vsha256su1q_u32(MSG0, MSG2, MSG3);
139
140
        // Rounds 37-40
141
246M
        TMP0 = vaddq_u32(MSG1, vld1q_u32(&K[36]));
142
246M
        TMP2 = STATE0;
143
246M
        MSG1 = vsha256su0q_u32(MSG1, MSG2);
144
246M
        STATE0 = vsha256hq_u32(STATE0, STATE1, TMP0);
145
246M
        STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP0);
146
246M
        MSG1 = vsha256su1q_u32(MSG1, MSG3, MSG0);
147
148
        // Rounds 41-44
149
246M
        TMP0 = vaddq_u32(MSG2, vld1q_u32(&K[40]));
150
246M
        TMP2 = STATE0;
151
246M
        MSG2 = vsha256su0q_u32(MSG2, MSG3);
152
246M
        STATE0 = vsha256hq_u32(STATE0, STATE1, TMP0);
153
246M
        STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP0);
154
246M
        MSG2 = vsha256su1q_u32(MSG2, MSG0, MSG1);
155
156
        // Rounds 45-48
157
246M
        TMP0 = vaddq_u32(MSG3, vld1q_u32(&K[44]));
158
246M
        TMP2 = STATE0;
159
246M
        MSG3 = vsha256su0q_u32(MSG3, MSG0);
160
246M
        STATE0 = vsha256hq_u32(STATE0, STATE1, TMP0);
161
246M
        STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP0);
162
246M
        MSG3 = vsha256su1q_u32(MSG3, MSG1, MSG2);
163
164
        // Rounds 49-52
165
246M
        TMP0 = vaddq_u32(MSG0, vld1q_u32(&K[48]));
166
246M
        TMP2 = STATE0;
167
246M
        STATE0 = vsha256hq_u32(STATE0, STATE1, TMP0);
168
246M
        STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP0);
169
170
        // Rounds 53-56
171
246M
        TMP0 = vaddq_u32(MSG1, vld1q_u32(&K[52]));
172
246M
        TMP2 = STATE0;
173
246M
        STATE0 = vsha256hq_u32(STATE0, STATE1, TMP0);
174
246M
        STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP0);
175
176
        // Rounds 57-60
177
246M
        TMP0 = vaddq_u32(MSG2, vld1q_u32(&K[56]));
178
246M
        TMP2 = STATE0;
179
246M
        STATE0 = vsha256hq_u32(STATE0, STATE1, TMP0);
180
246M
        STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP0);
181
182
        // Rounds 61-64
183
246M
        TMP0 = vaddq_u32(MSG3, vld1q_u32(&K[60]));
184
246M
        TMP2 = STATE0;
185
246M
        STATE0 = vsha256hq_u32(STATE0, STATE1, TMP0);
186
246M
        STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP0);
187
188
        // Update state
189
246M
        STATE0 = vaddq_u32(STATE0, ABCD_SAVE);
190
246M
        STATE1 = vaddq_u32(STATE1, EFGH_SAVE);
191
246M
    }
192
193
    // Save final state
194
119M
    vst1q_u32(&s[0], STATE0);
195
119M
    vst1q_u32(&s[4], STATE1);
196
119M
}
197
}
198
199
namespace sha256d64_arm_shani {
200
void Transform_2way(unsigned char* output, const unsigned char* input)
201
193k
{
202
    /* Initial state. */
203
193k
    alignas(uint32x4_t) static constexpr std::array<uint32_t, 8> INIT = {
204
193k
        0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a,
205
193k
        0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19
206
193k
    };
207
208
    /* Precomputed message schedule for the 2nd transform. */
209
193k
    alignas(uint32x4_t) static constexpr std::array<uint32_t, 64> MIDS = {
210
193k
        0xc28a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
211
193k
        0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
212
193k
        0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
213
193k
        0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf374,
214
193k
        0x649b69c1, 0xf0fe4786, 0x0fe1edc6, 0x240cf254,
215
193k
        0x4fe9346f, 0x6cc984be, 0x61b9411e, 0x16f988fa,
216
193k
        0xf2c65152, 0xa88e5a6d, 0xb019fc65, 0xb9d99ec7,
217
193k
        0x9a1231c3, 0xe70eeaa0, 0xfdb1232b, 0xc7353eb0,
218
193k
        0x3069bad5, 0xcb976d5f, 0x5a0f118f, 0xdc1eeefd,
219
193k
        0x0a35b689, 0xde0b7a04, 0x58f4ca9d, 0xe15d5b16,
220
193k
        0x007f3e86, 0x37088980, 0xa507ea32, 0x6fab9537,
221
193k
        0x17406110, 0x0d8cd6f1, 0xcdaa3b6d, 0xc0bbbe37,
222
193k
        0x83613bda, 0xdb48a363, 0x0b02e931, 0x6fd15ca7,
223
193k
        0x521afaca, 0x31338431, 0x6ed41a95, 0x6d437890,
224
193k
        0xc39c91f2, 0x9eccabbd, 0xb5c9a0e6, 0x532fb63c,
225
193k
        0xd2c741c6, 0x07237ea3, 0xa4954b68, 0x4c191d76
226
193k
    };
227
228
    /* A few precomputed message schedule values for the 3rd transform. */
229
193k
    alignas(uint32x4_t) static constexpr std::array<uint32_t, 12> FINS = {
230
193k
        0x5807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
231
193k
        0x80000000, 0x00000000, 0x00000000, 0x00000000,
232
193k
        0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf274
233
193k
    };
234
235
    /* Padding processed in the 3rd transform (byteswapped). */
236
193k
    alignas(uint32x4_t) static constexpr std::array<uint32_t, 8> FINAL = {0x80000000, 0, 0, 0, 0, 0, 0, 0x100};
237
238
193k
    uint32x4_t STATE0A, STATE0B, STATE1A, STATE1B, ABCD_SAVEA, ABCD_SAVEB, EFGH_SAVEA, EFGH_SAVEB;
239
193k
    uint32x4_t MSG0A, MSG0B, MSG1A, MSG1B, MSG2A, MSG2B, MSG3A, MSG3B;
240
193k
    uint32x4_t TMP0A, TMP0B, TMP2A, TMP2B, TMP;
241
242
    // Transform 1: Load state
243
193k
    STATE0A = vld1q_u32(&INIT[0]);
244
193k
    STATE0B = STATE0A;
245
193k
    STATE1A = vld1q_u32(&INIT[4]);
246
193k
    STATE1B = STATE1A;
247
248
    // Transform 1: Load and convert input chunk to Big Endian
249
193k
    MSG0A = vreinterpretq_u32_u8(vrev32q_u8(vld1q_u8(input + 0)));
250
193k
    MSG1A = vreinterpretq_u32_u8(vrev32q_u8(vld1q_u8(input + 16)));
251
193k
    MSG2A = vreinterpretq_u32_u8(vrev32q_u8(vld1q_u8(input + 32)));
252
193k
    MSG3A = vreinterpretq_u32_u8(vrev32q_u8(vld1q_u8(input + 48)));
253
193k
    MSG0B = vreinterpretq_u32_u8(vrev32q_u8(vld1q_u8(input + 64)));
254
193k
    MSG1B = vreinterpretq_u32_u8(vrev32q_u8(vld1q_u8(input + 80)));
255
193k
    MSG2B = vreinterpretq_u32_u8(vrev32q_u8(vld1q_u8(input + 96)));
256
193k
    MSG3B = vreinterpretq_u32_u8(vrev32q_u8(vld1q_u8(input + 112)));
257
258
    // Transform 1: Rounds 1-4
259
193k
    TMP = vld1q_u32(&K[0]);
260
193k
    TMP0A = vaddq_u32(MSG0A, TMP);
261
193k
    TMP0B = vaddq_u32(MSG0B, TMP);
262
193k
    TMP2A = STATE0A;
263
193k
    TMP2B = STATE0B;
264
193k
    MSG0A = vsha256su0q_u32(MSG0A, MSG1A);
265
193k
    MSG0B = vsha256su0q_u32(MSG0B, MSG1B);
266
193k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP0A);
267
193k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP0B);
268
193k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP0A);
269
193k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP0B);
270
193k
    MSG0A = vsha256su1q_u32(MSG0A, MSG2A, MSG3A);
271
193k
    MSG0B = vsha256su1q_u32(MSG0B, MSG2B, MSG3B);
272
273
    // Transform 1: Rounds 5-8
274
193k
    TMP = vld1q_u32(&K[4]);
275
193k
    TMP0A = vaddq_u32(MSG1A, TMP);
276
193k
    TMP0B = vaddq_u32(MSG1B, TMP);
277
193k
    TMP2A = STATE0A;
278
193k
    TMP2B = STATE0B;
279
193k
    MSG1A = vsha256su0q_u32(MSG1A, MSG2A);
280
193k
    MSG1B = vsha256su0q_u32(MSG1B, MSG2B);
281
193k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP0A);
282
193k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP0B);
283
193k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP0A);
284
193k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP0B);
285
193k
    MSG1A = vsha256su1q_u32(MSG1A, MSG3A, MSG0A);
286
193k
    MSG1B = vsha256su1q_u32(MSG1B, MSG3B, MSG0B);
287
288
    // Transform 1: Rounds 9-12
289
193k
    TMP = vld1q_u32(&K[8]);
290
193k
    TMP0A = vaddq_u32(MSG2A, TMP);
291
193k
    TMP0B = vaddq_u32(MSG2B, TMP);
292
193k
    TMP2A = STATE0A;
293
193k
    TMP2B = STATE0B;
294
193k
    MSG2A = vsha256su0q_u32(MSG2A, MSG3A);
295
193k
    MSG2B = vsha256su0q_u32(MSG2B, MSG3B);
296
193k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP0A);
297
193k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP0B);
298
193k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP0A);
299
193k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP0B);
300
193k
    MSG2A = vsha256su1q_u32(MSG2A, MSG0A, MSG1A);
301
193k
    MSG2B = vsha256su1q_u32(MSG2B, MSG0B, MSG1B);
302
303
    // Transform 1: Rounds 13-16
304
193k
    TMP = vld1q_u32(&K[12]);
305
193k
    TMP0A = vaddq_u32(MSG3A, TMP);
306
193k
    TMP0B = vaddq_u32(MSG3B, TMP);
307
193k
    TMP2A = STATE0A;
308
193k
    TMP2B = STATE0B;
309
193k
    MSG3A = vsha256su0q_u32(MSG3A, MSG0A);
310
193k
    MSG3B = vsha256su0q_u32(MSG3B, MSG0B);
311
193k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP0A);
312
193k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP0B);
313
193k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP0A);
314
193k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP0B);
315
193k
    MSG3A = vsha256su1q_u32(MSG3A, MSG1A, MSG2A);
316
193k
    MSG3B = vsha256su1q_u32(MSG3B, MSG1B, MSG2B);
317
318
    // Transform 1: Rounds 17-20
319
193k
    TMP = vld1q_u32(&K[16]);
320
193k
    TMP0A = vaddq_u32(MSG0A, TMP);
321
193k
    TMP0B = vaddq_u32(MSG0B, TMP);
322
193k
    TMP2A = STATE0A;
323
193k
    TMP2B = STATE0B;
324
193k
    MSG0A = vsha256su0q_u32(MSG0A, MSG1A);
325
193k
    MSG0B = vsha256su0q_u32(MSG0B, MSG1B);
326
193k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP0A);
327
193k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP0B);
328
193k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP0A);
329
193k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP0B);
330
193k
    MSG0A = vsha256su1q_u32(MSG0A, MSG2A, MSG3A);
331
193k
    MSG0B = vsha256su1q_u32(MSG0B, MSG2B, MSG3B);
332
333
    // Transform 1: Rounds 21-24
334
193k
    TMP = vld1q_u32(&K[20]);
335
193k
    TMP0A = vaddq_u32(MSG1A, TMP);
336
193k
    TMP0B = vaddq_u32(MSG1B, TMP);
337
193k
    TMP2A = STATE0A;
338
193k
    TMP2B = STATE0B;
339
193k
    MSG1A = vsha256su0q_u32(MSG1A, MSG2A);
340
193k
    MSG1B = vsha256su0q_u32(MSG1B, MSG2B);
341
193k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP0A);
342
193k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP0B);
343
193k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP0A);
344
193k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP0B);
345
193k
    MSG1A = vsha256su1q_u32(MSG1A, MSG3A, MSG0A);
346
193k
    MSG1B = vsha256su1q_u32(MSG1B, MSG3B, MSG0B);
347
348
    // Transform 1: Rounds 25-28
349
193k
    TMP = vld1q_u32(&K[24]);
350
193k
    TMP0A = vaddq_u32(MSG2A, TMP);
351
193k
    TMP0B = vaddq_u32(MSG2B, TMP);
352
193k
    TMP2A = STATE0A;
353
193k
    TMP2B = STATE0B;
354
193k
    MSG2A = vsha256su0q_u32(MSG2A, MSG3A);
355
193k
    MSG2B = vsha256su0q_u32(MSG2B, MSG3B);
356
193k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP0A);
357
193k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP0B);
358
193k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP0A);
359
193k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP0B);
360
193k
    MSG2A = vsha256su1q_u32(MSG2A, MSG0A, MSG1A);
361
193k
    MSG2B = vsha256su1q_u32(MSG2B, MSG0B, MSG1B);
362
363
    // Transform 1: Rounds 29-32
364
193k
    TMP = vld1q_u32(&K[28]);
365
193k
    TMP0A = vaddq_u32(MSG3A, TMP);
366
193k
    TMP0B = vaddq_u32(MSG3B, TMP);
367
193k
    TMP2A = STATE0A;
368
193k
    TMP2B = STATE0B;
369
193k
    MSG3A = vsha256su0q_u32(MSG3A, MSG0A);
370
193k
    MSG3B = vsha256su0q_u32(MSG3B, MSG0B);
371
193k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP0A);
372
193k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP0B);
373
193k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP0A);
374
193k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP0B);
375
193k
    MSG3A = vsha256su1q_u32(MSG3A, MSG1A, MSG2A);
376
193k
    MSG3B = vsha256su1q_u32(MSG3B, MSG1B, MSG2B);
377
378
    // Transform 1: Rounds 33-36
379
193k
    TMP = vld1q_u32(&K[32]);
380
193k
    TMP0A = vaddq_u32(MSG0A, TMP);
381
193k
    TMP0B = vaddq_u32(MSG0B, TMP);
382
193k
    TMP2A = STATE0A;
383
193k
    TMP2B = STATE0B;
384
193k
    MSG0A = vsha256su0q_u32(MSG0A, MSG1A);
385
193k
    MSG0B = vsha256su0q_u32(MSG0B, MSG1B);
386
193k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP0A);
387
193k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP0B);
388
193k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP0A);
389
193k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP0B);
390
193k
    MSG0A = vsha256su1q_u32(MSG0A, MSG2A, MSG3A);
391
193k
    MSG0B = vsha256su1q_u32(MSG0B, MSG2B, MSG3B);
392
393
    // Transform 1: Rounds 37-40
394
193k
    TMP = vld1q_u32(&K[36]);
395
193k
    TMP0A = vaddq_u32(MSG1A, TMP);
396
193k
    TMP0B = vaddq_u32(MSG1B, TMP);
397
193k
    TMP2A = STATE0A;
398
193k
    TMP2B = STATE0B;
399
193k
    MSG1A = vsha256su0q_u32(MSG1A, MSG2A);
400
193k
    MSG1B = vsha256su0q_u32(MSG1B, MSG2B);
401
193k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP0A);
402
193k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP0B);
403
193k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP0A);
404
193k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP0B);
405
193k
    MSG1A = vsha256su1q_u32(MSG1A, MSG3A, MSG0A);
406
193k
    MSG1B = vsha256su1q_u32(MSG1B, MSG3B, MSG0B);
407
408
    // Transform 1: Rounds 41-44
409
193k
    TMP = vld1q_u32(&K[40]);
410
193k
    TMP0A = vaddq_u32(MSG2A, TMP);
411
193k
    TMP0B = vaddq_u32(MSG2B, TMP);
412
193k
    TMP2A = STATE0A;
413
193k
    TMP2B = STATE0B;
414
193k
    MSG2A = vsha256su0q_u32(MSG2A, MSG3A);
415
193k
    MSG2B = vsha256su0q_u32(MSG2B, MSG3B);
416
193k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP0A);
417
193k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP0B);
418
193k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP0A);
419
193k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP0B);
420
193k
    MSG2A = vsha256su1q_u32(MSG2A, MSG0A, MSG1A);
421
193k
    MSG2B = vsha256su1q_u32(MSG2B, MSG0B, MSG1B);
422
423
    // Transform 1: Rounds 45-48
424
193k
    TMP = vld1q_u32(&K[44]);
425
193k
    TMP0A = vaddq_u32(MSG3A, TMP);
426
193k
    TMP0B = vaddq_u32(MSG3B, TMP);
427
193k
    TMP2A = STATE0A;
428
193k
    TMP2B = STATE0B;
429
193k
    MSG3A = vsha256su0q_u32(MSG3A, MSG0A);
430
193k
    MSG3B = vsha256su0q_u32(MSG3B, MSG0B);
431
193k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP0A);
432
193k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP0B);
433
193k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP0A);
434
193k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP0B);
435
193k
    MSG3A = vsha256su1q_u32(MSG3A, MSG1A, MSG2A);
436
193k
    MSG3B = vsha256su1q_u32(MSG3B, MSG1B, MSG2B);
437
438
    // Transform 1: Rounds 49-52
439
193k
    TMP = vld1q_u32(&K[48]);
440
193k
    TMP0A = vaddq_u32(MSG0A, TMP);
441
193k
    TMP0B = vaddq_u32(MSG0B, TMP);
442
193k
    TMP2A = STATE0A;
443
193k
    TMP2B = STATE0B;
444
193k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP0A);
445
193k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP0B);
446
193k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP0A);
447
193k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP0B);
448
449
    // Transform 1: Rounds 53-56
450
193k
    TMP = vld1q_u32(&K[52]);
451
193k
    TMP0A = vaddq_u32(MSG1A, TMP);
452
193k
    TMP0B = vaddq_u32(MSG1B, TMP);
453
193k
    TMP2A = STATE0A;
454
193k
    TMP2B = STATE0B;
455
193k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP0A);
456
193k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP0B);
457
193k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP0A);
458
193k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP0B);
459
460
    // Transform 1: Rounds 57-60
461
193k
    TMP = vld1q_u32(&K[56]);
462
193k
    TMP0A = vaddq_u32(MSG2A, TMP);
463
193k
    TMP0B = vaddq_u32(MSG2B, TMP);
464
193k
    TMP2A = STATE0A;
465
193k
    TMP2B = STATE0B;
466
193k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP0A);
467
193k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP0B);
468
193k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP0A);
469
193k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP0B);
470
471
    // Transform 1: Rounds 61-64
472
193k
    TMP = vld1q_u32(&K[60]);
473
193k
    TMP0A = vaddq_u32(MSG3A, TMP);
474
193k
    TMP0B = vaddq_u32(MSG3B, TMP);
475
193k
    TMP2A = STATE0A;
476
193k
    TMP2B = STATE0B;
477
193k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP0A);
478
193k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP0B);
479
193k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP0A);
480
193k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP0B);
481
482
    // Transform 1: Update state
483
193k
    TMP = vld1q_u32(&INIT[0]);
484
193k
    STATE0A = vaddq_u32(STATE0A, TMP);
485
193k
    STATE0B = vaddq_u32(STATE0B, TMP);
486
193k
    TMP = vld1q_u32(&INIT[4]);
487
193k
    STATE1A = vaddq_u32(STATE1A, TMP);
488
193k
    STATE1B = vaddq_u32(STATE1B, TMP);
489
490
    // Transform 2: Save state
491
193k
    ABCD_SAVEA = STATE0A;
492
193k
    ABCD_SAVEB = STATE0B;
493
193k
    EFGH_SAVEA = STATE1A;
494
193k
    EFGH_SAVEB = STATE1B;
495
496
    // Transform 2: Rounds 1-4
497
193k
    TMP = vld1q_u32(&MIDS[0]);
498
193k
    TMP2A = STATE0A;
499
193k
    TMP2B = STATE0B;
500
193k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP);
501
193k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP);
502
193k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP);
503
193k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP);
504
505
    // Transform 2: Rounds 5-8
506
193k
    TMP = vld1q_u32(&MIDS[4]);
507
193k
    TMP2A = STATE0A;
508
193k
    TMP2B = STATE0B;
509
193k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP);
510
193k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP);
511
193k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP);
512
193k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP);
513
514
    // Transform 2: Rounds 9-12
515
193k
    TMP = vld1q_u32(&MIDS[8]);
516
193k
    TMP2A = STATE0A;
517
193k
    TMP2B = STATE0B;
518
193k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP);
519
193k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP);
520
193k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP);
521
193k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP);
522
523
    // Transform 2: Rounds 13-16
524
193k
    TMP = vld1q_u32(&MIDS[12]);
525
193k
    TMP2A = STATE0A;
526
193k
    TMP2B = STATE0B;
527
193k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP);
528
193k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP);
529
193k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP);
530
193k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP);
531
532
    // Transform 2: Rounds 17-20
533
193k
    TMP = vld1q_u32(&MIDS[16]);
534
193k
    TMP2A = STATE0A;
535
193k
    TMP2B = STATE0B;
536
193k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP);
537
193k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP);
538
193k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP);
539
193k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP);
540
541
    // Transform 2: Rounds 21-24
542
193k
    TMP = vld1q_u32(&MIDS[20]);
543
193k
    TMP2A = STATE0A;
544
193k
    TMP2B = STATE0B;
545
193k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP);
546
193k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP);
547
193k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP);
548
193k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP);
549
550
    // Transform 2: Rounds 25-28
551
193k
    TMP = vld1q_u32(&MIDS[24]);
552
193k
    TMP2A = STATE0A;
553
193k
    TMP2B = STATE0B;
554
193k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP);
555
193k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP);
556
193k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP);
557
193k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP);
558
559
    // Transform 2: Rounds 29-32
560
193k
    TMP = vld1q_u32(&MIDS[28]);
561
193k
    TMP2A = STATE0A;
562
193k
    TMP2B = STATE0B;
563
193k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP);
564
193k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP);
565
193k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP);
566
193k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP);
567
568
    // Transform 2: Rounds 33-36
569
193k
    TMP = vld1q_u32(&MIDS[32]);
570
193k
    TMP2A = STATE0A;
571
193k
    TMP2B = STATE0B;
572
193k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP);
573
193k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP);
574
193k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP);
575
193k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP);
576
577
    // Transform 2: Rounds 37-40
578
193k
    TMP = vld1q_u32(&MIDS[36]);
579
193k
    TMP2A = STATE0A;
580
193k
    TMP2B = STATE0B;
581
193k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP);
582
193k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP);
583
193k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP);
584
193k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP);
585
586
    // Transform 2: Rounds 41-44
587
193k
    TMP = vld1q_u32(&MIDS[40]);
588
193k
    TMP2A = STATE0A;
589
193k
    TMP2B = STATE0B;
590
193k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP);
591
193k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP);
592
193k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP);
593
193k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP);
594
595
    // Transform 2: Rounds 45-48
596
193k
    TMP = vld1q_u32(&MIDS[44]);
597
193k
    TMP2A = STATE0A;
598
193k
    TMP2B = STATE0B;
599
193k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP);
600
193k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP);
601
193k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP);
602
193k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP);
603
604
    // Transform 2: Rounds 49-52
605
193k
    TMP = vld1q_u32(&MIDS[48]);
606
193k
    TMP2A = STATE0A;
607
193k
    TMP2B = STATE0B;
608
193k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP);
609
193k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP);
610
193k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP);
611
193k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP);
612
613
    // Transform 2: Rounds 53-56
614
193k
    TMP = vld1q_u32(&MIDS[52]);
615
193k
    TMP2A = STATE0A;
616
193k
    TMP2B = STATE0B;
617
193k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP);
618
193k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP);
619
193k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP);
620
193k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP);
621
622
    // Transform 2: Rounds 57-60
623
193k
    TMP = vld1q_u32(&MIDS[56]);
624
193k
    TMP2A = STATE0A;
625
193k
    TMP2B = STATE0B;
626
193k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP);
627
193k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP);
628
193k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP);
629
193k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP);
630
631
    // Transform 2: Rounds 61-64
632
193k
    TMP = vld1q_u32(&MIDS[60]);
633
193k
    TMP2A = STATE0A;
634
193k
    TMP2B = STATE0B;
635
193k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP);
636
193k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP);
637
193k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP);
638
193k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP);
639
640
    // Transform 2: Update state
641
193k
    STATE0A = vaddq_u32(STATE0A, ABCD_SAVEA);
642
193k
    STATE0B = vaddq_u32(STATE0B, ABCD_SAVEB);
643
193k
    STATE1A = vaddq_u32(STATE1A, EFGH_SAVEA);
644
193k
    STATE1B = vaddq_u32(STATE1B, EFGH_SAVEB);
645
646
    // Transform 3: Pad previous output
647
193k
    MSG0A = STATE0A;
648
193k
    MSG0B = STATE0B;
649
193k
    MSG1A = STATE1A;
650
193k
    MSG1B = STATE1B;
651
193k
    MSG2A = vld1q_u32(&FINAL[0]);
652
193k
    MSG2B = MSG2A;
653
193k
    MSG3A = vld1q_u32(&FINAL[4]);
654
193k
    MSG3B = MSG3A;
655
656
    // Transform 3: Load state
657
193k
    STATE0A = vld1q_u32(&INIT[0]);
658
193k
    STATE0B = STATE0A;
659
193k
    STATE1A = vld1q_u32(&INIT[4]);
660
193k
    STATE1B = STATE1A;
661
662
    // Transform 3: Rounds 1-4
663
193k
    TMP = vld1q_u32(&K[0]);
664
193k
    TMP0A = vaddq_u32(MSG0A, TMP);
665
193k
    TMP0B = vaddq_u32(MSG0B, TMP);
666
193k
    TMP2A = STATE0A;
667
193k
    TMP2B = STATE0B;
668
193k
    MSG0A = vsha256su0q_u32(MSG0A, MSG1A);
669
193k
    MSG0B = vsha256su0q_u32(MSG0B, MSG1B);
670
193k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP0A);
671
193k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP0B);
672
193k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP0A);
673
193k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP0B);
674
193k
    MSG0A = vsha256su1q_u32(MSG0A, MSG2A, MSG3A);
675
193k
    MSG0B = vsha256su1q_u32(MSG0B, MSG2B, MSG3B);
676
677
    // Transform 3: Rounds 5-8
678
193k
    TMP = vld1q_u32(&K[4]);
679
193k
    TMP0A = vaddq_u32(MSG1A, TMP);
680
193k
    TMP0B = vaddq_u32(MSG1B, TMP);
681
193k
    TMP2A = STATE0A;
682
193k
    TMP2B = STATE0B;
683
193k
    MSG1A = vsha256su0q_u32(MSG1A, MSG2A);
684
193k
    MSG1B = vsha256su0q_u32(MSG1B, MSG2B);
685
193k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP0A);
686
193k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP0B);
687
193k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP0A);
688
193k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP0B);
689
193k
    MSG1A = vsha256su1q_u32(MSG1A, MSG3A, MSG0A);
690
193k
    MSG1B = vsha256su1q_u32(MSG1B, MSG3B, MSG0B);
691
692
    // Transform 3: Rounds 9-12
693
193k
    TMP = vld1q_u32(&FINS[0]);
694
193k
    TMP2A = STATE0A;
695
193k
    TMP2B = STATE0B;
696
193k
    MSG2A = vld1q_u32(&FINS[4]);
697
193k
    MSG2B = MSG2A;
698
193k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP);
699
193k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP);
700
193k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP);
701
193k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP);
702
193k
    MSG2A = vsha256su1q_u32(MSG2A, MSG0A, MSG1A);
703
193k
    MSG2B = vsha256su1q_u32(MSG2B, MSG0B, MSG1B);
704
705
    // Transform 3: Rounds 13-16
706
193k
    TMP = vld1q_u32(&FINS[8]);
707
193k
    TMP2A = STATE0A;
708
193k
    TMP2B = STATE0B;
709
193k
    MSG3A = vsha256su0q_u32(MSG3A, MSG0A);
710
193k
    MSG3B = vsha256su0q_u32(MSG3B, MSG0B);
711
193k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP);
712
193k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP);
713
193k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP);
714
193k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP);
715
193k
    MSG3A = vsha256su1q_u32(MSG3A, MSG1A, MSG2A);
716
193k
    MSG3B = vsha256su1q_u32(MSG3B, MSG1B, MSG2B);
717
718
    // Transform 3: Rounds 17-20
719
193k
    TMP = vld1q_u32(&K[16]);
720
193k
    TMP0A = vaddq_u32(MSG0A, TMP);
721
193k
    TMP0B = vaddq_u32(MSG0B, TMP);
722
193k
    TMP2A = STATE0A;
723
193k
    TMP2B = STATE0B;
724
193k
    MSG0A = vsha256su0q_u32(MSG0A, MSG1A);
725
193k
    MSG0B = vsha256su0q_u32(MSG0B, MSG1B);
726
193k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP0A);
727
193k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP0B);
728
193k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP0A);
729
193k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP0B);
730
193k
    MSG0A = vsha256su1q_u32(MSG0A, MSG2A, MSG3A);
731
193k
    MSG0B = vsha256su1q_u32(MSG0B, MSG2B, MSG3B);
732
733
    // Transform 3: Rounds 21-24
734
193k
    TMP = vld1q_u32(&K[20]);
735
193k
    TMP0A = vaddq_u32(MSG1A, TMP);
736
193k
    TMP0B = vaddq_u32(MSG1B, TMP);
737
193k
    TMP2A = STATE0A;
738
193k
    TMP2B = STATE0B;
739
193k
    MSG1A = vsha256su0q_u32(MSG1A, MSG2A);
740
193k
    MSG1B = vsha256su0q_u32(MSG1B, MSG2B);
741
193k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP0A);
742
193k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP0B);
743
193k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP0A);
744
193k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP0B);
745
193k
    MSG1A = vsha256su1q_u32(MSG1A, MSG3A, MSG0A);
746
193k
    MSG1B = vsha256su1q_u32(MSG1B, MSG3B, MSG0B);
747
748
    // Transform 3: Rounds 25-28
749
193k
    TMP = vld1q_u32(&K[24]);
750
193k
    TMP0A = vaddq_u32(MSG2A, TMP);
751
193k
    TMP0B = vaddq_u32(MSG2B, TMP);
752
193k
    TMP2A = STATE0A;
753
193k
    TMP2B = STATE0B;
754
193k
    MSG2A = vsha256su0q_u32(MSG2A, MSG3A);
755
193k
    MSG2B = vsha256su0q_u32(MSG2B, MSG3B);
756
193k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP0A);
757
193k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP0B);
758
193k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP0A);
759
193k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP0B);
760
193k
    MSG2A = vsha256su1q_u32(MSG2A, MSG0A, MSG1A);
761
193k
    MSG2B = vsha256su1q_u32(MSG2B, MSG0B, MSG1B);
762
763
    // Transform 3: Rounds 29-32
764
193k
    TMP = vld1q_u32(&K[28]);
765
193k
    TMP0A = vaddq_u32(MSG3A, TMP);
766
193k
    TMP0B = vaddq_u32(MSG3B, TMP);
767
193k
    TMP2A = STATE0A;
768
193k
    TMP2B = STATE0B;
769
193k
    MSG3A = vsha256su0q_u32(MSG3A, MSG0A);
770
193k
    MSG3B = vsha256su0q_u32(MSG3B, MSG0B);
771
193k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP0A);
772
193k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP0B);
773
193k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP0A);
774
193k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP0B);
775
193k
    MSG3A = vsha256su1q_u32(MSG3A, MSG1A, MSG2A);
776
193k
    MSG3B = vsha256su1q_u32(MSG3B, MSG1B, MSG2B);
777
778
    // Transform 3: Rounds 33-36
779
193k
    TMP = vld1q_u32(&K[32]);
780
193k
    TMP0A = vaddq_u32(MSG0A, TMP);
781
193k
    TMP0B = vaddq_u32(MSG0B, TMP);
782
193k
    TMP2A = STATE0A;
783
193k
    TMP2B = STATE0B;
784
193k
    MSG0A = vsha256su0q_u32(MSG0A, MSG1A);
785
193k
    MSG0B = vsha256su0q_u32(MSG0B, MSG1B);
786
193k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP0A);
787
193k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP0B);
788
193k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP0A);
789
193k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP0B);
790
193k
    MSG0A = vsha256su1q_u32(MSG0A, MSG2A, MSG3A);
791
193k
    MSG0B = vsha256su1q_u32(MSG0B, MSG2B, MSG3B);
792
793
    // Transform 3: Rounds 37-40
794
193k
    TMP = vld1q_u32(&K[36]);
795
193k
    TMP0A = vaddq_u32(MSG1A, TMP);
796
193k
    TMP0B = vaddq_u32(MSG1B, TMP);
797
193k
    TMP2A = STATE0A;
798
193k
    TMP2B = STATE0B;
799
193k
    MSG1A = vsha256su0q_u32(MSG1A, MSG2A);
800
193k
    MSG1B = vsha256su0q_u32(MSG1B, MSG2B);
801
193k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP0A);
802
193k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP0B);
803
193k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP0A);
804
193k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP0B);
805
193k
    MSG1A = vsha256su1q_u32(MSG1A, MSG3A, MSG0A);
806
193k
    MSG1B = vsha256su1q_u32(MSG1B, MSG3B, MSG0B);
807
808
    // Transform 3: Rounds 41-44
809
193k
    TMP = vld1q_u32(&K[40]);
810
193k
    TMP0A = vaddq_u32(MSG2A, TMP);
811
193k
    TMP0B = vaddq_u32(MSG2B, TMP);
812
193k
    TMP2A = STATE0A;
813
193k
    TMP2B = STATE0B;
814
193k
    MSG2A = vsha256su0q_u32(MSG2A, MSG3A);
815
193k
    MSG2B = vsha256su0q_u32(MSG2B, MSG3B);
816
193k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP0A);
817
193k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP0B);
818
193k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP0A);
819
193k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP0B);
820
193k
    MSG2A = vsha256su1q_u32(MSG2A, MSG0A, MSG1A);
821
193k
    MSG2B = vsha256su1q_u32(MSG2B, MSG0B, MSG1B);
822
823
    // Transform 3: Rounds 45-48
824
193k
    TMP = vld1q_u32(&K[44]);
825
193k
    TMP0A = vaddq_u32(MSG3A, TMP);
826
193k
    TMP0B = vaddq_u32(MSG3B, TMP);
827
193k
    TMP2A = STATE0A;
828
193k
    TMP2B = STATE0B;
829
193k
    MSG3A = vsha256su0q_u32(MSG3A, MSG0A);
830
193k
    MSG3B = vsha256su0q_u32(MSG3B, MSG0B);
831
193k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP0A);
832
193k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP0B);
833
193k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP0A);
834
193k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP0B);
835
193k
    MSG3A = vsha256su1q_u32(MSG3A, MSG1A, MSG2A);
836
193k
    MSG3B = vsha256su1q_u32(MSG3B, MSG1B, MSG2B);
837
838
    // Transform 3: Rounds 49-52
839
193k
    TMP = vld1q_u32(&K[48]);
840
193k
    TMP0A = vaddq_u32(MSG0A, TMP);
841
193k
    TMP0B = vaddq_u32(MSG0B, TMP);
842
193k
    TMP2A = STATE0A;
843
193k
    TMP2B = STATE0B;
844
193k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP0A);
845
193k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP0B);
846
193k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP0A);
847
193k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP0B);
848
849
    // Transform 3: Rounds 53-56
850
193k
    TMP = vld1q_u32(&K[52]);
851
193k
    TMP0A = vaddq_u32(MSG1A, TMP);
852
193k
    TMP0B = vaddq_u32(MSG1B, TMP);
853
193k
    TMP2A = STATE0A;
854
193k
    TMP2B = STATE0B;
855
193k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP0A);
856
193k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP0B);
857
193k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP0A);
858
193k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP0B);
859
860
    // Transform 3: Rounds 57-60
861
193k
    TMP = vld1q_u32(&K[56]);
862
193k
    TMP0A = vaddq_u32(MSG2A, TMP);
863
193k
    TMP0B = vaddq_u32(MSG2B, TMP);
864
193k
    TMP2A = STATE0A;
865
193k
    TMP2B = STATE0B;
866
193k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP0A);
867
193k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP0B);
868
193k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP0A);
869
193k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP0B);
870
871
    // Transform 3: Rounds 61-64
872
193k
    TMP = vld1q_u32(&K[60]);
873
193k
    TMP0A = vaddq_u32(MSG3A, TMP);
874
193k
    TMP0B = vaddq_u32(MSG3B, TMP);
875
193k
    TMP2A = STATE0A;
876
193k
    TMP2B = STATE0B;
877
193k
    STATE0A = vsha256hq_u32(STATE0A, STATE1A, TMP0A);
878
193k
    STATE0B = vsha256hq_u32(STATE0B, STATE1B, TMP0B);
879
193k
    STATE1A = vsha256h2q_u32(STATE1A, TMP2A, TMP0A);
880
193k
    STATE1B = vsha256h2q_u32(STATE1B, TMP2B, TMP0B);
881
882
    // Transform 3: Update state
883
193k
    TMP = vld1q_u32(&INIT[0]);
884
193k
    STATE0A = vaddq_u32(STATE0A, TMP);
885
193k
    STATE0B = vaddq_u32(STATE0B, TMP);
886
193k
    TMP = vld1q_u32(&INIT[4]);
887
193k
    STATE1A = vaddq_u32(STATE1A, TMP);
888
193k
    STATE1B = vaddq_u32(STATE1B, TMP);
889
890
    // Store result
891
193k
    vst1q_u8(output, vrev32q_u8(vreinterpretq_u8_u32(STATE0A)));
892
193k
    vst1q_u8(output + 16, vrev32q_u8(vreinterpretq_u8_u32(STATE1A)));
893
193k
    vst1q_u8(output + 32, vrev32q_u8(vreinterpretq_u8_u32(STATE0B)));
894
    vst1q_u8(output + 48, vrev32q_u8(vreinterpretq_u8_u32(STATE1B)));
895
193k
}
896
}
897
898
#endif