Coverage Report

Created: 2026-09-21 19:49

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