Coverage Report

Created: 2026-09-14 20:36

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