9#include <botan/internal/sha2_64.h>
11#include <botan/internal/isa_extn.h>
19void BOTAN_FN_ISA_SHA512 SHA_512::compress_digest_armv8(digest_type& digest,
20 std::span<const uint8_t> input8,
22 alignas(128)
static const uint64_t K[] = {
23 0x428A2F98D728AE22, 0x7137449123EF65CD, 0xB5C0FBCFEC4D3B2F, 0xE9B5DBA58189DBBC, 0x3956C25BF348B538,
24 0x59F111F1B605D019, 0x923F82A4AF194F9B, 0xAB1C5ED5DA6D8118, 0xD807AA98A3030242, 0x12835B0145706FBE,
25 0x243185BE4EE4B28C, 0x550C7DC3D5FFB4E2, 0x72BE5D74F27B896F, 0x80DEB1FE3B1696B1, 0x9BDC06A725C71235,
26 0xC19BF174CF692694, 0xE49B69C19EF14AD2, 0xEFBE4786384F25E3, 0x0FC19DC68B8CD5B5, 0x240CA1CC77AC9C65,
27 0x2DE92C6F592B0275, 0x4A7484AA6EA6E483, 0x5CB0A9DCBD41FBD4, 0x76F988DA831153B5, 0x983E5152EE66DFAB,
28 0xA831C66D2DB43210, 0xB00327C898FB213F, 0xBF597FC7BEEF0EE4, 0xC6E00BF33DA88FC2, 0xD5A79147930AA725,
29 0x06CA6351E003826F, 0x142929670A0E6E70, 0x27B70A8546D22FFC, 0x2E1B21385C26C926, 0x4D2C6DFC5AC42AED,
30 0x53380D139D95B3DF, 0x650A73548BAF63DE, 0x766A0ABB3C77B2A8, 0x81C2C92E47EDAEE6, 0x92722C851482353B,
31 0xA2BFE8A14CF10364, 0xA81A664BBC423001, 0xC24B8B70D0F89791, 0xC76C51A30654BE30, 0xD192E819D6EF5218,
32 0xD69906245565A910, 0xF40E35855771202A, 0x106AA07032BBD1B8, 0x19A4C116B8D2D0C8, 0x1E376C085141AB53,
33 0x2748774CDF8EEB99, 0x34B0BCB5E19B48A8, 0x391C0CB3C5C95A63, 0x4ED8AA4AE3418ACB, 0x5B9CCA4F7763E373,
34 0x682E6FF3D6B2B8A3, 0x748F82EE5DEFB2FC, 0x78A5636F43172F60, 0x84C87814A1F0AB72, 0x8CC702081A6439EC,
35 0x90BEFFFA23631E28, 0xA4506CEBDE82BDE9, 0xBEF9A3F7B2C67915, 0xC67178F2E372532B, 0xCA273ECEEA26619C,
36 0xD186B8C721C0C207, 0xEADA7DD6CDE0EB1E, 0xF57D4F7FEE6ED178, 0x06F067AA72176FBA, 0x0A637DC5A2C898A6,
37 0x113F9804BEF90DAE, 0x1B710B35131C471B, 0x28DB77F523047D84, 0x32CAAB7B40C72493, 0x3C9EBE0A15C9BEBC,
38 0x431D67C49C100D4C, 0x4CC5D4BECB3E42B6, 0x597F299CFC657E2A, 0x5FCB6FAB3AD6FAEC, 0x6C44198C4A475817};
41 uint64x2_t STATE0 = vld1q_u64(&digest[0]);
42 uint64x2_t STATE1 = vld1q_u64(&digest[2]);
43 uint64x2_t STATE2 = vld1q_u64(&digest[4]);
44 uint64x2_t STATE3 = vld1q_u64(&digest[6]);
46 const uint64_t* input64 =
reinterpret_cast<const uint64_t*
>(input8.data());
50 const uint64x2_t AB_SAVE = STATE0;
51 const uint64x2_t CD_SAVE = STATE1;
52 const uint64x2_t EF_SAVE = STATE2;
53 const uint64x2_t GH_SAVE = STATE3;
55 uint64x2_t MSG0 = vld1q_u64(input64 + 0);
56 uint64x2_t MSG1 = vld1q_u64(input64 + 2);
57 uint64x2_t MSG2 = vld1q_u64(input64 + 4);
58 uint64x2_t MSG3 = vld1q_u64(input64 + 6);
59 uint64x2_t MSG4 = vld1q_u64(input64 + 8);
60 uint64x2_t MSG5 = vld1q_u64(input64 + 10);
61 uint64x2_t MSG6 = vld1q_u64(input64 + 12);
62 uint64x2_t MSG7 = vld1q_u64(input64 + 14);
64 MSG0 = vreinterpretq_u64_u8(vrev64q_u8(vreinterpretq_u8_u64(MSG0)));
65 MSG1 = vreinterpretq_u64_u8(vrev64q_u8(vreinterpretq_u8_u64(MSG1)));
66 MSG2 = vreinterpretq_u64_u8(vrev64q_u8(vreinterpretq_u8_u64(MSG2)));
67 MSG3 = vreinterpretq_u64_u8(vrev64q_u8(vreinterpretq_u8_u64(MSG3)));
68 MSG4 = vreinterpretq_u64_u8(vrev64q_u8(vreinterpretq_u8_u64(MSG4)));
69 MSG5 = vreinterpretq_u64_u8(vrev64q_u8(vreinterpretq_u8_u64(MSG5)));
70 MSG6 = vreinterpretq_u64_u8(vrev64q_u8(vreinterpretq_u8_u64(MSG6)));
71 MSG7 = vreinterpretq_u64_u8(vrev64q_u8(vreinterpretq_u8_u64(MSG7)));
73 uint64x2_t MSG_K, TSTATE0, TSTATE1;
76 MSG_K = vaddq_u64(MSG0, vld1q_u64(&K[2 * 0]));
77 TSTATE0 = vaddq_u64(vextq_u64(MSG_K, MSG_K, 1), STATE3);
78 TSTATE1 = vsha512hq_u64(TSTATE0, vextq_u64(STATE2, STATE3, 1), vextq_u64(STATE1, STATE2, 1));
79 STATE3 = vsha512h2q_u64(TSTATE1, STATE1, STATE0);
80 STATE1 = vaddq_u64(STATE1, TSTATE1);
81 MSG0 = vsha512su1q_u64(vsha512su0q_u64(MSG0, MSG1), MSG7, vextq_u64(MSG4, MSG5, 1));
84 MSG_K = vaddq_u64(MSG1, vld1q_u64(&K[2 * 1]));
85 TSTATE0 = vaddq_u64(vextq_u64(MSG_K, MSG_K, 1), STATE2);
86 TSTATE1 = vsha512hq_u64(TSTATE0, vextq_u64(STATE1, STATE2, 1), vextq_u64(STATE0, STATE1, 1));
87 STATE2 = vsha512h2q_u64(TSTATE1, STATE0, STATE3);
88 STATE0 = vaddq_u64(STATE0, TSTATE1);
89 MSG1 = vsha512su1q_u64(vsha512su0q_u64(MSG1, MSG2), MSG0, vextq_u64(MSG5, MSG6, 1));
92 MSG_K = vaddq_u64(MSG2, vld1q_u64(&K[2 * 2]));
93 TSTATE0 = vaddq_u64(vextq_u64(MSG_K, MSG_K, 1), STATE1);
94 TSTATE1 = vsha512hq_u64(TSTATE0, vextq_u64(STATE0, STATE1, 1), vextq_u64(STATE3, STATE0, 1));
95 STATE1 = vsha512h2q_u64(TSTATE1, STATE3, STATE2);
96 STATE3 = vaddq_u64(STATE3, TSTATE1);
97 MSG2 = vsha512su1q_u64(vsha512su0q_u64(MSG2, MSG3), MSG1, vextq_u64(MSG6, MSG7, 1));
100 MSG_K = vaddq_u64(MSG3, vld1q_u64(&K[2 * 3]));
101 TSTATE0 = vaddq_u64(vextq_u64(MSG_K, MSG_K, 1), STATE0);
102 TSTATE1 = vsha512hq_u64(TSTATE0, vextq_u64(STATE3, STATE0, 1), vextq_u64(STATE2, STATE3, 1));
103 STATE0 = vsha512h2q_u64(TSTATE1, STATE2, STATE1);
104 STATE2 = vaddq_u64(STATE2, TSTATE1);
105 MSG3 = vsha512su1q_u64(vsha512su0q_u64(MSG3, MSG4), MSG2, vextq_u64(MSG7, MSG0, 1));
108 MSG_K = vaddq_u64(MSG4, vld1q_u64(&K[2 * 4]));
109 TSTATE0 = vaddq_u64(vextq_u64(MSG_K, MSG_K, 1), STATE3);
110 TSTATE1 = vsha512hq_u64(TSTATE0, vextq_u64(STATE2, STATE3, 1), vextq_u64(STATE1, STATE2, 1));
111 STATE3 = vsha512h2q_u64(TSTATE1, STATE1, STATE0);
112 STATE1 = vaddq_u64(STATE1, TSTATE1);
113 MSG4 = vsha512su1q_u64(vsha512su0q_u64(MSG4, MSG5), MSG3, vextq_u64(MSG0, MSG1, 1));
116 MSG_K = vaddq_u64(MSG5, vld1q_u64(&K[2 * 5]));
117 TSTATE0 = vaddq_u64(vextq_u64(MSG_K, MSG_K, 1), STATE2);
118 TSTATE1 = vsha512hq_u64(TSTATE0, vextq_u64(STATE1, STATE2, 1), vextq_u64(STATE0, STATE1, 1));
119 STATE2 = vsha512h2q_u64(TSTATE1, STATE0, STATE3);
120 STATE0 = vaddq_u64(STATE0, TSTATE1);
121 MSG5 = vsha512su1q_u64(vsha512su0q_u64(MSG5, MSG6), MSG4, vextq_u64(MSG1, MSG2, 1));
124 MSG_K = vaddq_u64(MSG6, vld1q_u64(&K[2 * 6]));
125 TSTATE0 = vaddq_u64(vextq_u64(MSG_K, MSG_K, 1), STATE1);
126 TSTATE1 = vsha512hq_u64(TSTATE0, vextq_u64(STATE0, STATE1, 1), vextq_u64(STATE3, STATE0, 1));
127 STATE1 = vsha512h2q_u64(TSTATE1, STATE3, STATE2);
128 STATE3 = vaddq_u64(STATE3, TSTATE1);
129 MSG6 = vsha512su1q_u64(vsha512su0q_u64(MSG6, MSG7), MSG5, vextq_u64(MSG2, MSG3, 1));
132 MSG_K = vaddq_u64(MSG7, vld1q_u64(&K[2 * 7]));
133 TSTATE0 = vaddq_u64(vextq_u64(MSG_K, MSG_K, 1), STATE0);
134 TSTATE1 = vsha512hq_u64(TSTATE0, vextq_u64(STATE3, STATE0, 1), vextq_u64(STATE2, STATE3, 1));
135 STATE0 = vsha512h2q_u64(TSTATE1, STATE2, STATE1);
136 STATE2 = vaddq_u64(STATE2, TSTATE1);
137 MSG7 = vsha512su1q_u64(vsha512su0q_u64(MSG7, MSG0), MSG6, vextq_u64(MSG3, MSG4, 1));
140 MSG_K = vaddq_u64(MSG0, vld1q_u64(&K[2 * 8]));
141 TSTATE0 = vaddq_u64(vextq_u64(MSG_K, MSG_K, 1), STATE3);
142 TSTATE1 = vsha512hq_u64(TSTATE0, vextq_u64(STATE2, STATE3, 1), vextq_u64(STATE1, STATE2, 1));
143 STATE3 = vsha512h2q_u64(TSTATE1, STATE1, STATE0);
144 STATE1 = vaddq_u64(STATE1, TSTATE1);
145 MSG0 = vsha512su1q_u64(vsha512su0q_u64(MSG0, MSG1), MSG7, vextq_u64(MSG4, MSG5, 1));
148 MSG_K = vaddq_u64(MSG1, vld1q_u64(&K[2 * 9]));
149 TSTATE0 = vaddq_u64(vextq_u64(MSG_K, MSG_K, 1), STATE2);
150 TSTATE1 = vsha512hq_u64(TSTATE0, vextq_u64(STATE1, STATE2, 1), vextq_u64(STATE0, STATE1, 1));
151 STATE2 = vsha512h2q_u64(TSTATE1, STATE0, STATE3);
152 STATE0 = vaddq_u64(STATE0, TSTATE1);
153 MSG1 = vsha512su1q_u64(vsha512su0q_u64(MSG1, MSG2), MSG0, vextq_u64(MSG5, MSG6, 1));
156 MSG_K = vaddq_u64(MSG2, vld1q_u64(&K[2 * 10]));
157 TSTATE0 = vaddq_u64(vextq_u64(MSG_K, MSG_K, 1), STATE1);
158 TSTATE1 = vsha512hq_u64(TSTATE0, vextq_u64(STATE0, STATE1, 1), vextq_u64(STATE3, STATE0, 1));
159 STATE1 = vsha512h2q_u64(TSTATE1, STATE3, STATE2);
160 STATE3 = vaddq_u64(STATE3, TSTATE1);
161 MSG2 = vsha512su1q_u64(vsha512su0q_u64(MSG2, MSG3), MSG1, vextq_u64(MSG6, MSG7, 1));
164 MSG_K = vaddq_u64(MSG3, vld1q_u64(&K[2 * 11]));
165 TSTATE0 = vaddq_u64(vextq_u64(MSG_K, MSG_K, 1), STATE0);
166 TSTATE1 = vsha512hq_u64(TSTATE0, vextq_u64(STATE3, STATE0, 1), vextq_u64(STATE2, STATE3, 1));
167 STATE0 = vsha512h2q_u64(TSTATE1, STATE2, STATE1);
168 STATE2 = vaddq_u64(STATE2, TSTATE1);
169 MSG3 = vsha512su1q_u64(vsha512su0q_u64(MSG3, MSG4), MSG2, vextq_u64(MSG7, MSG0, 1));
172 MSG_K = vaddq_u64(MSG4, vld1q_u64(&K[2 * 12]));
173 TSTATE0 = vaddq_u64(vextq_u64(MSG_K, MSG_K, 1), STATE3);
174 TSTATE1 = vsha512hq_u64(TSTATE0, vextq_u64(STATE2, STATE3, 1), vextq_u64(STATE1, STATE2, 1));
175 STATE3 = vsha512h2q_u64(TSTATE1, STATE1, STATE0);
176 STATE1 = vaddq_u64(STATE1, TSTATE1);
177 MSG4 = vsha512su1q_u64(vsha512su0q_u64(MSG4, MSG5), MSG3, vextq_u64(MSG0, MSG1, 1));
180 MSG_K = vaddq_u64(MSG5, vld1q_u64(&K[2 * 13]));
181 TSTATE0 = vaddq_u64(vextq_u64(MSG_K, MSG_K, 1), STATE2);
182 TSTATE1 = vsha512hq_u64(TSTATE0, vextq_u64(STATE1, STATE2, 1), vextq_u64(STATE0, STATE1, 1));
183 STATE2 = vsha512h2q_u64(TSTATE1, STATE0, STATE3);
184 STATE0 = vaddq_u64(STATE0, TSTATE1);
185 MSG5 = vsha512su1q_u64(vsha512su0q_u64(MSG5, MSG6), MSG4, vextq_u64(MSG1, MSG2, 1));
188 MSG_K = vaddq_u64(MSG6, vld1q_u64(&K[2 * 14]));
189 TSTATE0 = vaddq_u64(vextq_u64(MSG_K, MSG_K, 1), STATE1);
190 TSTATE1 = vsha512hq_u64(TSTATE0, vextq_u64(STATE0, STATE1, 1), vextq_u64(STATE3, STATE0, 1));
191 STATE1 = vsha512h2q_u64(TSTATE1, STATE3, STATE2);
192 STATE3 = vaddq_u64(STATE3, TSTATE1);
193 MSG6 = vsha512su1q_u64(vsha512su0q_u64(MSG6, MSG7), MSG5, vextq_u64(MSG2, MSG3, 1));
196 MSG_K = vaddq_u64(MSG7, vld1q_u64(&K[2 * 15]));
197 TSTATE0 = vaddq_u64(vextq_u64(MSG_K, MSG_K, 1), STATE0);
198 TSTATE1 = vsha512hq_u64(TSTATE0, vextq_u64(STATE3, STATE0, 1), vextq_u64(STATE2, STATE3, 1));
199 STATE0 = vsha512h2q_u64(TSTATE1, STATE2, STATE1);
200 STATE2 = vaddq_u64(STATE2, TSTATE1);
201 MSG7 = vsha512su1q_u64(vsha512su0q_u64(MSG7, MSG0), MSG6, vextq_u64(MSG3, MSG4, 1));
204 MSG_K = vaddq_u64(MSG0, vld1q_u64(&K[2 * 16]));
205 TSTATE0 = vaddq_u64(vextq_u64(MSG_K, MSG_K, 1), STATE3);
206 TSTATE1 = vsha512hq_u64(TSTATE0, vextq_u64(STATE2, STATE3, 1), vextq_u64(STATE1, STATE2, 1));
207 STATE3 = vsha512h2q_u64(TSTATE1, STATE1, STATE0);
208 STATE1 = vaddq_u64(STATE1, TSTATE1);
209 MSG0 = vsha512su1q_u64(vsha512su0q_u64(MSG0, MSG1), MSG7, vextq_u64(MSG4, MSG5, 1));
212 MSG_K = vaddq_u64(MSG1, vld1q_u64(&K[2 * 17]));
213 TSTATE0 = vaddq_u64(vextq_u64(MSG_K, MSG_K, 1), STATE2);
214 TSTATE1 = vsha512hq_u64(TSTATE0, vextq_u64(STATE1, STATE2, 1), vextq_u64(STATE0, STATE1, 1));
215 STATE2 = vsha512h2q_u64(TSTATE1, STATE0, STATE3);
216 STATE0 = vaddq_u64(STATE0, TSTATE1);
217 MSG1 = vsha512su1q_u64(vsha512su0q_u64(MSG1, MSG2), MSG0, vextq_u64(MSG5, MSG6, 1));
220 MSG_K = vaddq_u64(MSG2, vld1q_u64(&K[2 * 18]));
221 TSTATE0 = vaddq_u64(vextq_u64(MSG_K, MSG_K, 1), STATE1);
222 TSTATE1 = vsha512hq_u64(TSTATE0, vextq_u64(STATE0, STATE1, 1), vextq_u64(STATE3, STATE0, 1));
223 STATE1 = vsha512h2q_u64(TSTATE1, STATE3, STATE2);
224 STATE3 = vaddq_u64(STATE3, TSTATE1);
225 MSG2 = vsha512su1q_u64(vsha512su0q_u64(MSG2, MSG3), MSG1, vextq_u64(MSG6, MSG7, 1));
228 MSG_K = vaddq_u64(MSG3, vld1q_u64(&K[2 * 19]));
229 TSTATE0 = vaddq_u64(vextq_u64(MSG_K, MSG_K, 1), STATE0);
230 TSTATE1 = vsha512hq_u64(TSTATE0, vextq_u64(STATE3, STATE0, 1), vextq_u64(STATE2, STATE3, 1));
231 STATE0 = vsha512h2q_u64(TSTATE1, STATE2, STATE1);
232 STATE2 = vaddq_u64(STATE2, TSTATE1);
233 MSG3 = vsha512su1q_u64(vsha512su0q_u64(MSG3, MSG4), MSG2, vextq_u64(MSG7, MSG0, 1));
236 MSG_K = vaddq_u64(MSG4, vld1q_u64(&K[2 * 20]));
237 TSTATE0 = vaddq_u64(vextq_u64(MSG_K, MSG_K, 1), STATE3);
238 TSTATE1 = vsha512hq_u64(TSTATE0, vextq_u64(STATE2, STATE3, 1), vextq_u64(STATE1, STATE2, 1));
239 STATE3 = vsha512h2q_u64(TSTATE1, STATE1, STATE0);
240 STATE1 = vaddq_u64(STATE1, TSTATE1);
241 MSG4 = vsha512su1q_u64(vsha512su0q_u64(MSG4, MSG5), MSG3, vextq_u64(MSG0, MSG1, 1));
244 MSG_K = vaddq_u64(MSG5, vld1q_u64(&K[2 * 21]));
245 TSTATE0 = vaddq_u64(vextq_u64(MSG_K, MSG_K, 1), STATE2);
246 TSTATE1 = vsha512hq_u64(TSTATE0, vextq_u64(STATE1, STATE2, 1), vextq_u64(STATE0, STATE1, 1));
247 STATE2 = vsha512h2q_u64(TSTATE1, STATE0, STATE3);
248 STATE0 = vaddq_u64(STATE0, TSTATE1);
249 MSG5 = vsha512su1q_u64(vsha512su0q_u64(MSG5, MSG6), MSG4, vextq_u64(MSG1, MSG2, 1));
252 MSG_K = vaddq_u64(MSG6, vld1q_u64(&K[2 * 22]));
253 TSTATE0 = vaddq_u64(vextq_u64(MSG_K, MSG_K, 1), STATE1);
254 TSTATE1 = vsha512hq_u64(TSTATE0, vextq_u64(STATE0, STATE1, 1), vextq_u64(STATE3, STATE0, 1));
255 STATE1 = vsha512h2q_u64(TSTATE1, STATE3, STATE2);
256 STATE3 = vaddq_u64(STATE3, TSTATE1);
257 MSG6 = vsha512su1q_u64(vsha512su0q_u64(MSG6, MSG7), MSG5, vextq_u64(MSG2, MSG3, 1));
260 MSG_K = vaddq_u64(MSG7, vld1q_u64(&K[2 * 23]));
261 TSTATE0 = vaddq_u64(vextq_u64(MSG_K, MSG_K, 1), STATE0);
262 TSTATE1 = vsha512hq_u64(TSTATE0, vextq_u64(STATE3, STATE0, 1), vextq_u64(STATE2, STATE3, 1));
263 STATE0 = vsha512h2q_u64(TSTATE1, STATE2, STATE1);
264 STATE2 = vaddq_u64(STATE2, TSTATE1);
265 MSG7 = vsha512su1q_u64(vsha512su0q_u64(MSG7, MSG0), MSG6, vextq_u64(MSG3, MSG4, 1));
268 MSG_K = vaddq_u64(MSG0, vld1q_u64(&K[2 * 24]));
269 TSTATE0 = vaddq_u64(vextq_u64(MSG_K, MSG_K, 1), STATE3);
270 TSTATE1 = vsha512hq_u64(TSTATE0, vextq_u64(STATE2, STATE3, 1), vextq_u64(STATE1, STATE2, 1));
271 STATE3 = vsha512h2q_u64(TSTATE1, STATE1, STATE0);
272 STATE1 = vaddq_u64(STATE1, TSTATE1);
273 MSG0 = vsha512su1q_u64(vsha512su0q_u64(MSG0, MSG1), MSG7, vextq_u64(MSG4, MSG5, 1));
276 MSG_K = vaddq_u64(MSG1, vld1q_u64(&K[2 * 25]));
277 TSTATE0 = vaddq_u64(vextq_u64(MSG_K, MSG_K, 1), STATE2);
278 TSTATE1 = vsha512hq_u64(TSTATE0, vextq_u64(STATE1, STATE2, 1), vextq_u64(STATE0, STATE1, 1));
279 STATE2 = vsha512h2q_u64(TSTATE1, STATE0, STATE3);
280 STATE0 = vaddq_u64(STATE0, TSTATE1);
281 MSG1 = vsha512su1q_u64(vsha512su0q_u64(MSG1, MSG2), MSG0, vextq_u64(MSG5, MSG6, 1));
284 MSG_K = vaddq_u64(MSG2, vld1q_u64(&K[2 * 26]));
285 TSTATE0 = vaddq_u64(vextq_u64(MSG_K, MSG_K, 1), STATE1);
286 TSTATE1 = vsha512hq_u64(TSTATE0, vextq_u64(STATE0, STATE1, 1), vextq_u64(STATE3, STATE0, 1));
287 STATE1 = vsha512h2q_u64(TSTATE1, STATE3, STATE2);
288 STATE3 = vaddq_u64(STATE3, TSTATE1);
289 MSG2 = vsha512su1q_u64(vsha512su0q_u64(MSG2, MSG3), MSG1, vextq_u64(MSG6, MSG7, 1));
292 MSG_K = vaddq_u64(MSG3, vld1q_u64(&K[2 * 27]));
293 TSTATE0 = vaddq_u64(vextq_u64(MSG_K, MSG_K, 1), STATE0);
294 TSTATE1 = vsha512hq_u64(TSTATE0, vextq_u64(STATE3, STATE0, 1), vextq_u64(STATE2, STATE3, 1));
295 STATE0 = vsha512h2q_u64(TSTATE1, STATE2, STATE1);
296 STATE2 = vaddq_u64(STATE2, TSTATE1);
297 MSG3 = vsha512su1q_u64(vsha512su0q_u64(MSG3, MSG4), MSG2, vextq_u64(MSG7, MSG0, 1));
300 MSG_K = vaddq_u64(MSG4, vld1q_u64(&K[2 * 28]));
301 TSTATE0 = vaddq_u64(vextq_u64(MSG_K, MSG_K, 1), STATE3);
302 TSTATE1 = vsha512hq_u64(TSTATE0, vextq_u64(STATE2, STATE3, 1), vextq_u64(STATE1, STATE2, 1));
303 STATE3 = vsha512h2q_u64(TSTATE1, STATE1, STATE0);
304 STATE1 = vaddq_u64(STATE1, TSTATE1);
305 MSG4 = vsha512su1q_u64(vsha512su0q_u64(MSG4, MSG5), MSG3, vextq_u64(MSG0, MSG1, 1));
308 MSG_K = vaddq_u64(MSG5, vld1q_u64(&K[2 * 29]));
309 TSTATE0 = vaddq_u64(vextq_u64(MSG_K, MSG_K, 1), STATE2);
310 TSTATE1 = vsha512hq_u64(TSTATE0, vextq_u64(STATE1, STATE2, 1), vextq_u64(STATE0, STATE1, 1));
311 STATE2 = vsha512h2q_u64(TSTATE1, STATE0, STATE3);
312 STATE0 = vaddq_u64(STATE0, TSTATE1);
313 MSG5 = vsha512su1q_u64(vsha512su0q_u64(MSG5, MSG6), MSG4, vextq_u64(MSG1, MSG2, 1));
316 MSG_K = vaddq_u64(MSG6, vld1q_u64(&K[2 * 30]));
317 TSTATE0 = vaddq_u64(vextq_u64(MSG_K, MSG_K, 1), STATE1);
318 TSTATE1 = vsha512hq_u64(TSTATE0, vextq_u64(STATE0, STATE1, 1), vextq_u64(STATE3, STATE0, 1));
319 STATE1 = vsha512h2q_u64(TSTATE1, STATE3, STATE2);
320 STATE3 = vaddq_u64(STATE3, TSTATE1);
321 MSG6 = vsha512su1q_u64(vsha512su0q_u64(MSG6, MSG7), MSG5, vextq_u64(MSG2, MSG3, 1));
324 MSG_K = vaddq_u64(MSG7, vld1q_u64(&K[2 * 31]));
325 TSTATE0 = vaddq_u64(vextq_u64(MSG_K, MSG_K, 1), STATE0);
326 TSTATE1 = vsha512hq_u64(TSTATE0, vextq_u64(STATE3, STATE0, 1), vextq_u64(STATE2, STATE3, 1));
327 STATE0 = vsha512h2q_u64(TSTATE1, STATE2, STATE1);
328 STATE2 = vaddq_u64(STATE2, TSTATE1);
329 MSG7 = vsha512su1q_u64(vsha512su0q_u64(MSG7, MSG0), MSG6, vextq_u64(MSG3, MSG4, 1));
332 MSG_K = vaddq_u64(MSG0, vld1q_u64(&K[2 * 32]));
333 TSTATE0 = vaddq_u64(vextq_u64(MSG_K, MSG_K, 1), STATE3);
334 TSTATE1 = vsha512hq_u64(TSTATE0, vextq_u64(STATE2, STATE3, 1), vextq_u64(STATE1, STATE2, 1));
335 STATE3 = vsha512h2q_u64(TSTATE1, STATE1, STATE0);
336 STATE1 = vaddq_u64(STATE1, TSTATE1);
339 MSG_K = vaddq_u64(MSG1, vld1q_u64(&K[2 * 33]));
340 TSTATE0 = vaddq_u64(vextq_u64(MSG_K, MSG_K, 1), STATE2);
341 TSTATE1 = vsha512hq_u64(TSTATE0, vextq_u64(STATE1, STATE2, 1), vextq_u64(STATE0, STATE1, 1));
342 STATE2 = vsha512h2q_u64(TSTATE1, STATE0, STATE3);
343 STATE0 = vaddq_u64(STATE0, TSTATE1);
346 MSG_K = vaddq_u64(MSG2, vld1q_u64(&K[2 * 34]));
347 TSTATE0 = vaddq_u64(vextq_u64(MSG_K, MSG_K, 1), STATE1);
348 TSTATE1 = vsha512hq_u64(TSTATE0, vextq_u64(STATE0, STATE1, 1), vextq_u64(STATE3, STATE0, 1));
349 STATE1 = vsha512h2q_u64(TSTATE1, STATE3, STATE2);
350 STATE3 = vaddq_u64(STATE3, TSTATE1);
353 MSG_K = vaddq_u64(MSG3, vld1q_u64(&K[2 * 35]));
354 TSTATE0 = vaddq_u64(vextq_u64(MSG_K, MSG_K, 1), STATE0);
355 TSTATE1 = vsha512hq_u64(TSTATE0, vextq_u64(STATE3, STATE0, 1), vextq_u64(STATE2, STATE3, 1));
356 STATE0 = vsha512h2q_u64(TSTATE1, STATE2, STATE1);
357 STATE2 = vaddq_u64(STATE2, TSTATE1);
360 MSG_K = vaddq_u64(MSG4, vld1q_u64(&K[2 * 36]));
361 TSTATE0 = vaddq_u64(vextq_u64(MSG_K, MSG_K, 1), STATE3);
362 TSTATE1 = vsha512hq_u64(TSTATE0, vextq_u64(STATE2, STATE3, 1), vextq_u64(STATE1, STATE2, 1));
363 STATE3 = vsha512h2q_u64(TSTATE1, STATE1, STATE0);
364 STATE1 = vaddq_u64(STATE1, TSTATE1);
367 MSG_K = vaddq_u64(MSG5, vld1q_u64(&K[2 * 37]));
368 TSTATE0 = vaddq_u64(vextq_u64(MSG_K, MSG_K, 1), STATE2);
369 TSTATE1 = vsha512hq_u64(TSTATE0, vextq_u64(STATE1, STATE2, 1), vextq_u64(STATE0, STATE1, 1));
370 STATE2 = vsha512h2q_u64(TSTATE1, STATE0, STATE3);
371 STATE0 = vaddq_u64(STATE0, TSTATE1);
374 MSG_K = vaddq_u64(MSG6, vld1q_u64(&K[2 * 38]));
375 TSTATE0 = vaddq_u64(vextq_u64(MSG_K, MSG_K, 1), STATE1);
376 TSTATE1 = vsha512hq_u64(TSTATE0, vextq_u64(STATE0, STATE1, 1), vextq_u64(STATE3, STATE0, 1));
377 STATE1 = vsha512h2q_u64(TSTATE1, STATE3, STATE2);
378 STATE3 = vaddq_u64(STATE3, TSTATE1);
381 MSG_K = vaddq_u64(MSG7, vld1q_u64(&K[2 * 39]));
382 TSTATE0 = vaddq_u64(vextq_u64(MSG_K, MSG_K, 1), STATE0);
383 TSTATE1 = vsha512hq_u64(TSTATE0, vextq_u64(STATE3, STATE0, 1), vextq_u64(STATE2, STATE3, 1));
384 STATE0 = vsha512h2q_u64(TSTATE1, STATE2, STATE1);
385 STATE2 = vaddq_u64(STATE2, TSTATE1);
388 STATE0 = vaddq_u64(STATE0, AB_SAVE);
389 STATE1 = vaddq_u64(STATE1, CD_SAVE);
390 STATE2 = vaddq_u64(STATE2, EF_SAVE);
391 STATE3 = vaddq_u64(STATE3, GH_SAVE);
398 vst1q_u64(&digest[0], STATE0);
399 vst1q_u64(&digest[2], STATE1);
400 vst1q_u64(&digest[4], STATE2);
401 vst1q_u64(&digest[6], STATE3);