]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/crypto/openssl/aarch64/sha256-armv8.S
Merge OpenSSL 1.1.1i.
[FreeBSD/FreeBSD.git] / sys / crypto / openssl / aarch64 / sha256-armv8.S
1 /* $FreeBSD$ */
2 /* Do not modify. This file is auto-generated from sha512-armv8.pl. */
3 // Copyright 2014-2020 The OpenSSL Project Authors. All Rights Reserved.
4 //
5 // Licensed under the OpenSSL license (the "License").  You may not use
6 // this file except in compliance with the License.  You can obtain a copy
7 // in the file LICENSE in the source distribution or at
8 // https://www.openssl.org/source/license.html
9
10 // ====================================================================
11 // Written by Andy Polyakov <appro@openssl.org> for the OpenSSL
12 // project. The module is, however, dual licensed under OpenSSL and
13 // CRYPTOGAMS licenses depending on where you obtain it. For further
14 // details see http://www.openssl.org/~appro/cryptogams/.
15 //
16 // Permission to use under GPLv2 terms is granted.
17 // ====================================================================
18 //
19 // SHA256/512 for ARMv8.
20 //
21 // Performance in cycles per processed byte and improvement coefficient
22 // over code generated with "default" compiler:
23 //
24 //              SHA256-hw       SHA256(*)       SHA512
25 // Apple A7     1.97            10.5 (+33%)     6.73 (-1%(**))
26 // Cortex-A53   2.38            15.5 (+115%)    10.0 (+150%(***))
27 // Cortex-A57   2.31            11.6 (+86%)     7.51 (+260%(***))
28 // Denver       2.01            10.5 (+26%)     6.70 (+8%)
29 // X-Gene                       20.0 (+100%)    12.8 (+300%(***))
30 // Mongoose     2.36            13.0 (+50%)     8.36 (+33%)
31 // Kryo         1.92            17.4 (+30%)     11.2 (+8%)
32 //
33 // (*)  Software SHA256 results are of lesser relevance, presented
34 //      mostly for informational purposes.
35 // (**) The result is a trade-off: it's possible to improve it by
36 //      10% (or by 1 cycle per round), but at the cost of 20% loss
37 //      on Cortex-A53 (or by 4 cycles per round).
38 // (***)        Super-impressive coefficients over gcc-generated code are
39 //      indication of some compiler "pathology", most notably code
40 //      generated with -mgeneral-regs-only is significantly faster
41 //      and the gap is only 40-90%.
42 //
43 // October 2016.
44 //
45 // Originally it was reckoned that it makes no sense to implement NEON
46 // version of SHA256 for 64-bit processors. This is because performance
47 // improvement on most wide-spread Cortex-A5x processors was observed
48 // to be marginal, same on Cortex-A53 and ~10% on A57. But then it was
49 // observed that 32-bit NEON SHA256 performs significantly better than
50 // 64-bit scalar version on *some* of the more recent processors. As
51 // result 64-bit NEON version of SHA256 was added to provide best
52 // all-round performance. For example it executes ~30% faster on X-Gene
53 // and Mongoose. [For reference, NEON version of SHA512 is bound to
54 // deliver much less improvement, likely *negative* on Cortex-A5x.
55 // Which is why NEON support is limited to SHA256.]
56
57 #ifndef __KERNEL__
58 # include "arm_arch.h"
59 #endif
60
61 .text
62
63
64 .hidden OPENSSL_armcap_P
65 .globl  sha256_block_data_order
66 .type   sha256_block_data_order,%function
67 .align  6
68 sha256_block_data_order:
69 #ifndef __KERNEL__
70 # ifdef __ILP32__
71         ldrsw   x16,.LOPENSSL_armcap_P
72 # else
73         ldr     x16,.LOPENSSL_armcap_P
74 # endif
75         adr     x17,.LOPENSSL_armcap_P
76         add     x16,x16,x17
77         ldr     w16,[x16]
78         tst     w16,#ARMV8_SHA256
79         b.ne    .Lv8_entry
80         tst     w16,#ARMV7_NEON
81         b.ne    .Lneon_entry
82 #endif
83 .inst   0xd503233f                              // paciasp
84         stp     x29,x30,[sp,#-128]!
85         add     x29,sp,#0
86
87         stp     x19,x20,[sp,#16]
88         stp     x21,x22,[sp,#32]
89         stp     x23,x24,[sp,#48]
90         stp     x25,x26,[sp,#64]
91         stp     x27,x28,[sp,#80]
92         sub     sp,sp,#4*4
93
94         ldp     w20,w21,[x0]                            // load context
95         ldp     w22,w23,[x0,#2*4]
96         ldp     w24,w25,[x0,#4*4]
97         add     x2,x1,x2,lsl#6  // end of input
98         ldp     w26,w27,[x0,#6*4]
99         adr     x30,.LK256
100         stp     x0,x2,[x29,#96]
101
102 .Loop:
103         ldp     w3,w4,[x1],#2*4
104         ldr     w19,[x30],#4                    // *K++
105         eor     w28,w21,w22                             // magic seed
106         str     x1,[x29,#112]
107 #ifndef __AARCH64EB__
108         rev     w3,w3                   // 0
109 #endif
110         ror     w16,w24,#6
111         add     w27,w27,w19                     // h+=K[i]
112         eor     w6,w24,w24,ror#14
113         and     w17,w25,w24
114         bic     w19,w26,w24
115         add     w27,w27,w3                      // h+=X[i]
116         orr     w17,w17,w19                     // Ch(e,f,g)
117         eor     w19,w20,w21                     // a^b, b^c in next round
118         eor     w16,w16,w6,ror#11       // Sigma1(e)
119         ror     w6,w20,#2
120         add     w27,w27,w17                     // h+=Ch(e,f,g)
121         eor     w17,w20,w20,ror#9
122         add     w27,w27,w16                     // h+=Sigma1(e)
123         and     w28,w28,w19                     // (b^c)&=(a^b)
124         add     w23,w23,w27                     // d+=h
125         eor     w28,w28,w21                     // Maj(a,b,c)
126         eor     w17,w6,w17,ror#13       // Sigma0(a)
127         add     w27,w27,w28                     // h+=Maj(a,b,c)
128         ldr     w28,[x30],#4            // *K++, w19 in next round
129         //add   w27,w27,w17                     // h+=Sigma0(a)
130 #ifndef __AARCH64EB__
131         rev     w4,w4                   // 1
132 #endif
133         ldp     w5,w6,[x1],#2*4
134         add     w27,w27,w17                     // h+=Sigma0(a)
135         ror     w16,w23,#6
136         add     w26,w26,w28                     // h+=K[i]
137         eor     w7,w23,w23,ror#14
138         and     w17,w24,w23
139         bic     w28,w25,w23
140         add     w26,w26,w4                      // h+=X[i]
141         orr     w17,w17,w28                     // Ch(e,f,g)
142         eor     w28,w27,w20                     // a^b, b^c in next round
143         eor     w16,w16,w7,ror#11       // Sigma1(e)
144         ror     w7,w27,#2
145         add     w26,w26,w17                     // h+=Ch(e,f,g)
146         eor     w17,w27,w27,ror#9
147         add     w26,w26,w16                     // h+=Sigma1(e)
148         and     w19,w19,w28                     // (b^c)&=(a^b)
149         add     w22,w22,w26                     // d+=h
150         eor     w19,w19,w20                     // Maj(a,b,c)
151         eor     w17,w7,w17,ror#13       // Sigma0(a)
152         add     w26,w26,w19                     // h+=Maj(a,b,c)
153         ldr     w19,[x30],#4            // *K++, w28 in next round
154         //add   w26,w26,w17                     // h+=Sigma0(a)
155 #ifndef __AARCH64EB__
156         rev     w5,w5                   // 2
157 #endif
158         add     w26,w26,w17                     // h+=Sigma0(a)
159         ror     w16,w22,#6
160         add     w25,w25,w19                     // h+=K[i]
161         eor     w8,w22,w22,ror#14
162         and     w17,w23,w22
163         bic     w19,w24,w22
164         add     w25,w25,w5                      // h+=X[i]
165         orr     w17,w17,w19                     // Ch(e,f,g)
166         eor     w19,w26,w27                     // a^b, b^c in next round
167         eor     w16,w16,w8,ror#11       // Sigma1(e)
168         ror     w8,w26,#2
169         add     w25,w25,w17                     // h+=Ch(e,f,g)
170         eor     w17,w26,w26,ror#9
171         add     w25,w25,w16                     // h+=Sigma1(e)
172         and     w28,w28,w19                     // (b^c)&=(a^b)
173         add     w21,w21,w25                     // d+=h
174         eor     w28,w28,w27                     // Maj(a,b,c)
175         eor     w17,w8,w17,ror#13       // Sigma0(a)
176         add     w25,w25,w28                     // h+=Maj(a,b,c)
177         ldr     w28,[x30],#4            // *K++, w19 in next round
178         //add   w25,w25,w17                     // h+=Sigma0(a)
179 #ifndef __AARCH64EB__
180         rev     w6,w6                   // 3
181 #endif
182         ldp     w7,w8,[x1],#2*4
183         add     w25,w25,w17                     // h+=Sigma0(a)
184         ror     w16,w21,#6
185         add     w24,w24,w28                     // h+=K[i]
186         eor     w9,w21,w21,ror#14
187         and     w17,w22,w21
188         bic     w28,w23,w21
189         add     w24,w24,w6                      // h+=X[i]
190         orr     w17,w17,w28                     // Ch(e,f,g)
191         eor     w28,w25,w26                     // a^b, b^c in next round
192         eor     w16,w16,w9,ror#11       // Sigma1(e)
193         ror     w9,w25,#2
194         add     w24,w24,w17                     // h+=Ch(e,f,g)
195         eor     w17,w25,w25,ror#9
196         add     w24,w24,w16                     // h+=Sigma1(e)
197         and     w19,w19,w28                     // (b^c)&=(a^b)
198         add     w20,w20,w24                     // d+=h
199         eor     w19,w19,w26                     // Maj(a,b,c)
200         eor     w17,w9,w17,ror#13       // Sigma0(a)
201         add     w24,w24,w19                     // h+=Maj(a,b,c)
202         ldr     w19,[x30],#4            // *K++, w28 in next round
203         //add   w24,w24,w17                     // h+=Sigma0(a)
204 #ifndef __AARCH64EB__
205         rev     w7,w7                   // 4
206 #endif
207         add     w24,w24,w17                     // h+=Sigma0(a)
208         ror     w16,w20,#6
209         add     w23,w23,w19                     // h+=K[i]
210         eor     w10,w20,w20,ror#14
211         and     w17,w21,w20
212         bic     w19,w22,w20
213         add     w23,w23,w7                      // h+=X[i]
214         orr     w17,w17,w19                     // Ch(e,f,g)
215         eor     w19,w24,w25                     // a^b, b^c in next round
216         eor     w16,w16,w10,ror#11      // Sigma1(e)
217         ror     w10,w24,#2
218         add     w23,w23,w17                     // h+=Ch(e,f,g)
219         eor     w17,w24,w24,ror#9
220         add     w23,w23,w16                     // h+=Sigma1(e)
221         and     w28,w28,w19                     // (b^c)&=(a^b)
222         add     w27,w27,w23                     // d+=h
223         eor     w28,w28,w25                     // Maj(a,b,c)
224         eor     w17,w10,w17,ror#13      // Sigma0(a)
225         add     w23,w23,w28                     // h+=Maj(a,b,c)
226         ldr     w28,[x30],#4            // *K++, w19 in next round
227         //add   w23,w23,w17                     // h+=Sigma0(a)
228 #ifndef __AARCH64EB__
229         rev     w8,w8                   // 5
230 #endif
231         ldp     w9,w10,[x1],#2*4
232         add     w23,w23,w17                     // h+=Sigma0(a)
233         ror     w16,w27,#6
234         add     w22,w22,w28                     // h+=K[i]
235         eor     w11,w27,w27,ror#14
236         and     w17,w20,w27
237         bic     w28,w21,w27
238         add     w22,w22,w8                      // h+=X[i]
239         orr     w17,w17,w28                     // Ch(e,f,g)
240         eor     w28,w23,w24                     // a^b, b^c in next round
241         eor     w16,w16,w11,ror#11      // Sigma1(e)
242         ror     w11,w23,#2
243         add     w22,w22,w17                     // h+=Ch(e,f,g)
244         eor     w17,w23,w23,ror#9
245         add     w22,w22,w16                     // h+=Sigma1(e)
246         and     w19,w19,w28                     // (b^c)&=(a^b)
247         add     w26,w26,w22                     // d+=h
248         eor     w19,w19,w24                     // Maj(a,b,c)
249         eor     w17,w11,w17,ror#13      // Sigma0(a)
250         add     w22,w22,w19                     // h+=Maj(a,b,c)
251         ldr     w19,[x30],#4            // *K++, w28 in next round
252         //add   w22,w22,w17                     // h+=Sigma0(a)
253 #ifndef __AARCH64EB__
254         rev     w9,w9                   // 6
255 #endif
256         add     w22,w22,w17                     // h+=Sigma0(a)
257         ror     w16,w26,#6
258         add     w21,w21,w19                     // h+=K[i]
259         eor     w12,w26,w26,ror#14
260         and     w17,w27,w26
261         bic     w19,w20,w26
262         add     w21,w21,w9                      // h+=X[i]
263         orr     w17,w17,w19                     // Ch(e,f,g)
264         eor     w19,w22,w23                     // a^b, b^c in next round
265         eor     w16,w16,w12,ror#11      // Sigma1(e)
266         ror     w12,w22,#2
267         add     w21,w21,w17                     // h+=Ch(e,f,g)
268         eor     w17,w22,w22,ror#9
269         add     w21,w21,w16                     // h+=Sigma1(e)
270         and     w28,w28,w19                     // (b^c)&=(a^b)
271         add     w25,w25,w21                     // d+=h
272         eor     w28,w28,w23                     // Maj(a,b,c)
273         eor     w17,w12,w17,ror#13      // Sigma0(a)
274         add     w21,w21,w28                     // h+=Maj(a,b,c)
275         ldr     w28,[x30],#4            // *K++, w19 in next round
276         //add   w21,w21,w17                     // h+=Sigma0(a)
277 #ifndef __AARCH64EB__
278         rev     w10,w10                 // 7
279 #endif
280         ldp     w11,w12,[x1],#2*4
281         add     w21,w21,w17                     // h+=Sigma0(a)
282         ror     w16,w25,#6
283         add     w20,w20,w28                     // h+=K[i]
284         eor     w13,w25,w25,ror#14
285         and     w17,w26,w25
286         bic     w28,w27,w25
287         add     w20,w20,w10                     // h+=X[i]
288         orr     w17,w17,w28                     // Ch(e,f,g)
289         eor     w28,w21,w22                     // a^b, b^c in next round
290         eor     w16,w16,w13,ror#11      // Sigma1(e)
291         ror     w13,w21,#2
292         add     w20,w20,w17                     // h+=Ch(e,f,g)
293         eor     w17,w21,w21,ror#9
294         add     w20,w20,w16                     // h+=Sigma1(e)
295         and     w19,w19,w28                     // (b^c)&=(a^b)
296         add     w24,w24,w20                     // d+=h
297         eor     w19,w19,w22                     // Maj(a,b,c)
298         eor     w17,w13,w17,ror#13      // Sigma0(a)
299         add     w20,w20,w19                     // h+=Maj(a,b,c)
300         ldr     w19,[x30],#4            // *K++, w28 in next round
301         //add   w20,w20,w17                     // h+=Sigma0(a)
302 #ifndef __AARCH64EB__
303         rev     w11,w11                 // 8
304 #endif
305         add     w20,w20,w17                     // h+=Sigma0(a)
306         ror     w16,w24,#6
307         add     w27,w27,w19                     // h+=K[i]
308         eor     w14,w24,w24,ror#14
309         and     w17,w25,w24
310         bic     w19,w26,w24
311         add     w27,w27,w11                     // h+=X[i]
312         orr     w17,w17,w19                     // Ch(e,f,g)
313         eor     w19,w20,w21                     // a^b, b^c in next round
314         eor     w16,w16,w14,ror#11      // Sigma1(e)
315         ror     w14,w20,#2
316         add     w27,w27,w17                     // h+=Ch(e,f,g)
317         eor     w17,w20,w20,ror#9
318         add     w27,w27,w16                     // h+=Sigma1(e)
319         and     w28,w28,w19                     // (b^c)&=(a^b)
320         add     w23,w23,w27                     // d+=h
321         eor     w28,w28,w21                     // Maj(a,b,c)
322         eor     w17,w14,w17,ror#13      // Sigma0(a)
323         add     w27,w27,w28                     // h+=Maj(a,b,c)
324         ldr     w28,[x30],#4            // *K++, w19 in next round
325         //add   w27,w27,w17                     // h+=Sigma0(a)
326 #ifndef __AARCH64EB__
327         rev     w12,w12                 // 9
328 #endif
329         ldp     w13,w14,[x1],#2*4
330         add     w27,w27,w17                     // h+=Sigma0(a)
331         ror     w16,w23,#6
332         add     w26,w26,w28                     // h+=K[i]
333         eor     w15,w23,w23,ror#14
334         and     w17,w24,w23
335         bic     w28,w25,w23
336         add     w26,w26,w12                     // h+=X[i]
337         orr     w17,w17,w28                     // Ch(e,f,g)
338         eor     w28,w27,w20                     // a^b, b^c in next round
339         eor     w16,w16,w15,ror#11      // Sigma1(e)
340         ror     w15,w27,#2
341         add     w26,w26,w17                     // h+=Ch(e,f,g)
342         eor     w17,w27,w27,ror#9
343         add     w26,w26,w16                     // h+=Sigma1(e)
344         and     w19,w19,w28                     // (b^c)&=(a^b)
345         add     w22,w22,w26                     // d+=h
346         eor     w19,w19,w20                     // Maj(a,b,c)
347         eor     w17,w15,w17,ror#13      // Sigma0(a)
348         add     w26,w26,w19                     // h+=Maj(a,b,c)
349         ldr     w19,[x30],#4            // *K++, w28 in next round
350         //add   w26,w26,w17                     // h+=Sigma0(a)
351 #ifndef __AARCH64EB__
352         rev     w13,w13                 // 10
353 #endif
354         add     w26,w26,w17                     // h+=Sigma0(a)
355         ror     w16,w22,#6
356         add     w25,w25,w19                     // h+=K[i]
357         eor     w0,w22,w22,ror#14
358         and     w17,w23,w22
359         bic     w19,w24,w22
360         add     w25,w25,w13                     // h+=X[i]
361         orr     w17,w17,w19                     // Ch(e,f,g)
362         eor     w19,w26,w27                     // a^b, b^c in next round
363         eor     w16,w16,w0,ror#11       // Sigma1(e)
364         ror     w0,w26,#2
365         add     w25,w25,w17                     // h+=Ch(e,f,g)
366         eor     w17,w26,w26,ror#9
367         add     w25,w25,w16                     // h+=Sigma1(e)
368         and     w28,w28,w19                     // (b^c)&=(a^b)
369         add     w21,w21,w25                     // d+=h
370         eor     w28,w28,w27                     // Maj(a,b,c)
371         eor     w17,w0,w17,ror#13       // Sigma0(a)
372         add     w25,w25,w28                     // h+=Maj(a,b,c)
373         ldr     w28,[x30],#4            // *K++, w19 in next round
374         //add   w25,w25,w17                     // h+=Sigma0(a)
375 #ifndef __AARCH64EB__
376         rev     w14,w14                 // 11
377 #endif
378         ldp     w15,w0,[x1],#2*4
379         add     w25,w25,w17                     // h+=Sigma0(a)
380         str     w6,[sp,#12]
381         ror     w16,w21,#6
382         add     w24,w24,w28                     // h+=K[i]
383         eor     w6,w21,w21,ror#14
384         and     w17,w22,w21
385         bic     w28,w23,w21
386         add     w24,w24,w14                     // h+=X[i]
387         orr     w17,w17,w28                     // Ch(e,f,g)
388         eor     w28,w25,w26                     // a^b, b^c in next round
389         eor     w16,w16,w6,ror#11       // Sigma1(e)
390         ror     w6,w25,#2
391         add     w24,w24,w17                     // h+=Ch(e,f,g)
392         eor     w17,w25,w25,ror#9
393         add     w24,w24,w16                     // h+=Sigma1(e)
394         and     w19,w19,w28                     // (b^c)&=(a^b)
395         add     w20,w20,w24                     // d+=h
396         eor     w19,w19,w26                     // Maj(a,b,c)
397         eor     w17,w6,w17,ror#13       // Sigma0(a)
398         add     w24,w24,w19                     // h+=Maj(a,b,c)
399         ldr     w19,[x30],#4            // *K++, w28 in next round
400         //add   w24,w24,w17                     // h+=Sigma0(a)
401 #ifndef __AARCH64EB__
402         rev     w15,w15                 // 12
403 #endif
404         add     w24,w24,w17                     // h+=Sigma0(a)
405         str     w7,[sp,#0]
406         ror     w16,w20,#6
407         add     w23,w23,w19                     // h+=K[i]
408         eor     w7,w20,w20,ror#14
409         and     w17,w21,w20
410         bic     w19,w22,w20
411         add     w23,w23,w15                     // h+=X[i]
412         orr     w17,w17,w19                     // Ch(e,f,g)
413         eor     w19,w24,w25                     // a^b, b^c in next round
414         eor     w16,w16,w7,ror#11       // Sigma1(e)
415         ror     w7,w24,#2
416         add     w23,w23,w17                     // h+=Ch(e,f,g)
417         eor     w17,w24,w24,ror#9
418         add     w23,w23,w16                     // h+=Sigma1(e)
419         and     w28,w28,w19                     // (b^c)&=(a^b)
420         add     w27,w27,w23                     // d+=h
421         eor     w28,w28,w25                     // Maj(a,b,c)
422         eor     w17,w7,w17,ror#13       // Sigma0(a)
423         add     w23,w23,w28                     // h+=Maj(a,b,c)
424         ldr     w28,[x30],#4            // *K++, w19 in next round
425         //add   w23,w23,w17                     // h+=Sigma0(a)
426 #ifndef __AARCH64EB__
427         rev     w0,w0                   // 13
428 #endif
429         ldp     w1,w2,[x1]
430         add     w23,w23,w17                     // h+=Sigma0(a)
431         str     w8,[sp,#4]
432         ror     w16,w27,#6
433         add     w22,w22,w28                     // h+=K[i]
434         eor     w8,w27,w27,ror#14
435         and     w17,w20,w27
436         bic     w28,w21,w27
437         add     w22,w22,w0                      // h+=X[i]
438         orr     w17,w17,w28                     // Ch(e,f,g)
439         eor     w28,w23,w24                     // a^b, b^c in next round
440         eor     w16,w16,w8,ror#11       // Sigma1(e)
441         ror     w8,w23,#2
442         add     w22,w22,w17                     // h+=Ch(e,f,g)
443         eor     w17,w23,w23,ror#9
444         add     w22,w22,w16                     // h+=Sigma1(e)
445         and     w19,w19,w28                     // (b^c)&=(a^b)
446         add     w26,w26,w22                     // d+=h
447         eor     w19,w19,w24                     // Maj(a,b,c)
448         eor     w17,w8,w17,ror#13       // Sigma0(a)
449         add     w22,w22,w19                     // h+=Maj(a,b,c)
450         ldr     w19,[x30],#4            // *K++, w28 in next round
451         //add   w22,w22,w17                     // h+=Sigma0(a)
452 #ifndef __AARCH64EB__
453         rev     w1,w1                   // 14
454 #endif
455         ldr     w6,[sp,#12]
456         add     w22,w22,w17                     // h+=Sigma0(a)
457         str     w9,[sp,#8]
458         ror     w16,w26,#6
459         add     w21,w21,w19                     // h+=K[i]
460         eor     w9,w26,w26,ror#14
461         and     w17,w27,w26
462         bic     w19,w20,w26
463         add     w21,w21,w1                      // h+=X[i]
464         orr     w17,w17,w19                     // Ch(e,f,g)
465         eor     w19,w22,w23                     // a^b, b^c in next round
466         eor     w16,w16,w9,ror#11       // Sigma1(e)
467         ror     w9,w22,#2
468         add     w21,w21,w17                     // h+=Ch(e,f,g)
469         eor     w17,w22,w22,ror#9
470         add     w21,w21,w16                     // h+=Sigma1(e)
471         and     w28,w28,w19                     // (b^c)&=(a^b)
472         add     w25,w25,w21                     // d+=h
473         eor     w28,w28,w23                     // Maj(a,b,c)
474         eor     w17,w9,w17,ror#13       // Sigma0(a)
475         add     w21,w21,w28                     // h+=Maj(a,b,c)
476         ldr     w28,[x30],#4            // *K++, w19 in next round
477         //add   w21,w21,w17                     // h+=Sigma0(a)
478 #ifndef __AARCH64EB__
479         rev     w2,w2                   // 15
480 #endif
481         ldr     w7,[sp,#0]
482         add     w21,w21,w17                     // h+=Sigma0(a)
483         str     w10,[sp,#12]
484         ror     w16,w25,#6
485         add     w20,w20,w28                     // h+=K[i]
486         ror     w9,w4,#7
487         and     w17,w26,w25
488         ror     w8,w1,#17
489         bic     w28,w27,w25
490         ror     w10,w21,#2
491         add     w20,w20,w2                      // h+=X[i]
492         eor     w16,w16,w25,ror#11
493         eor     w9,w9,w4,ror#18
494         orr     w17,w17,w28                     // Ch(e,f,g)
495         eor     w28,w21,w22                     // a^b, b^c in next round
496         eor     w16,w16,w25,ror#25      // Sigma1(e)
497         eor     w10,w10,w21,ror#13
498         add     w20,w20,w17                     // h+=Ch(e,f,g)
499         and     w19,w19,w28                     // (b^c)&=(a^b)
500         eor     w8,w8,w1,ror#19
501         eor     w9,w9,w4,lsr#3  // sigma0(X[i+1])
502         add     w20,w20,w16                     // h+=Sigma1(e)
503         eor     w19,w19,w22                     // Maj(a,b,c)
504         eor     w17,w10,w21,ror#22      // Sigma0(a)
505         eor     w8,w8,w1,lsr#10 // sigma1(X[i+14])
506         add     w3,w3,w12
507         add     w24,w24,w20                     // d+=h
508         add     w20,w20,w19                     // h+=Maj(a,b,c)
509         ldr     w19,[x30],#4            // *K++, w28 in next round
510         add     w3,w3,w9
511         add     w20,w20,w17                     // h+=Sigma0(a)
512         add     w3,w3,w8
513 .Loop_16_xx:
514         ldr     w8,[sp,#4]
515         str     w11,[sp,#0]
516         ror     w16,w24,#6
517         add     w27,w27,w19                     // h+=K[i]
518         ror     w10,w5,#7
519         and     w17,w25,w24
520         ror     w9,w2,#17
521         bic     w19,w26,w24
522         ror     w11,w20,#2
523         add     w27,w27,w3                      // h+=X[i]
524         eor     w16,w16,w24,ror#11
525         eor     w10,w10,w5,ror#18
526         orr     w17,w17,w19                     // Ch(e,f,g)
527         eor     w19,w20,w21                     // a^b, b^c in next round
528         eor     w16,w16,w24,ror#25      // Sigma1(e)
529         eor     w11,w11,w20,ror#13
530         add     w27,w27,w17                     // h+=Ch(e,f,g)
531         and     w28,w28,w19                     // (b^c)&=(a^b)
532         eor     w9,w9,w2,ror#19
533         eor     w10,w10,w5,lsr#3        // sigma0(X[i+1])
534         add     w27,w27,w16                     // h+=Sigma1(e)
535         eor     w28,w28,w21                     // Maj(a,b,c)
536         eor     w17,w11,w20,ror#22      // Sigma0(a)
537         eor     w9,w9,w2,lsr#10 // sigma1(X[i+14])
538         add     w4,w4,w13
539         add     w23,w23,w27                     // d+=h
540         add     w27,w27,w28                     // h+=Maj(a,b,c)
541         ldr     w28,[x30],#4            // *K++, w19 in next round
542         add     w4,w4,w10
543         add     w27,w27,w17                     // h+=Sigma0(a)
544         add     w4,w4,w9
545         ldr     w9,[sp,#8]
546         str     w12,[sp,#4]
547         ror     w16,w23,#6
548         add     w26,w26,w28                     // h+=K[i]
549         ror     w11,w6,#7
550         and     w17,w24,w23
551         ror     w10,w3,#17
552         bic     w28,w25,w23
553         ror     w12,w27,#2
554         add     w26,w26,w4                      // h+=X[i]
555         eor     w16,w16,w23,ror#11
556         eor     w11,w11,w6,ror#18
557         orr     w17,w17,w28                     // Ch(e,f,g)
558         eor     w28,w27,w20                     // a^b, b^c in next round
559         eor     w16,w16,w23,ror#25      // Sigma1(e)
560         eor     w12,w12,w27,ror#13
561         add     w26,w26,w17                     // h+=Ch(e,f,g)
562         and     w19,w19,w28                     // (b^c)&=(a^b)
563         eor     w10,w10,w3,ror#19
564         eor     w11,w11,w6,lsr#3        // sigma0(X[i+1])
565         add     w26,w26,w16                     // h+=Sigma1(e)
566         eor     w19,w19,w20                     // Maj(a,b,c)
567         eor     w17,w12,w27,ror#22      // Sigma0(a)
568         eor     w10,w10,w3,lsr#10       // sigma1(X[i+14])
569         add     w5,w5,w14
570         add     w22,w22,w26                     // d+=h
571         add     w26,w26,w19                     // h+=Maj(a,b,c)
572         ldr     w19,[x30],#4            // *K++, w28 in next round
573         add     w5,w5,w11
574         add     w26,w26,w17                     // h+=Sigma0(a)
575         add     w5,w5,w10
576         ldr     w10,[sp,#12]
577         str     w13,[sp,#8]
578         ror     w16,w22,#6
579         add     w25,w25,w19                     // h+=K[i]
580         ror     w12,w7,#7
581         and     w17,w23,w22
582         ror     w11,w4,#17
583         bic     w19,w24,w22
584         ror     w13,w26,#2
585         add     w25,w25,w5                      // h+=X[i]
586         eor     w16,w16,w22,ror#11
587         eor     w12,w12,w7,ror#18
588         orr     w17,w17,w19                     // Ch(e,f,g)
589         eor     w19,w26,w27                     // a^b, b^c in next round
590         eor     w16,w16,w22,ror#25      // Sigma1(e)
591         eor     w13,w13,w26,ror#13
592         add     w25,w25,w17                     // h+=Ch(e,f,g)
593         and     w28,w28,w19                     // (b^c)&=(a^b)
594         eor     w11,w11,w4,ror#19
595         eor     w12,w12,w7,lsr#3        // sigma0(X[i+1])
596         add     w25,w25,w16                     // h+=Sigma1(e)
597         eor     w28,w28,w27                     // Maj(a,b,c)
598         eor     w17,w13,w26,ror#22      // Sigma0(a)
599         eor     w11,w11,w4,lsr#10       // sigma1(X[i+14])
600         add     w6,w6,w15
601         add     w21,w21,w25                     // d+=h
602         add     w25,w25,w28                     // h+=Maj(a,b,c)
603         ldr     w28,[x30],#4            // *K++, w19 in next round
604         add     w6,w6,w12
605         add     w25,w25,w17                     // h+=Sigma0(a)
606         add     w6,w6,w11
607         ldr     w11,[sp,#0]
608         str     w14,[sp,#12]
609         ror     w16,w21,#6
610         add     w24,w24,w28                     // h+=K[i]
611         ror     w13,w8,#7
612         and     w17,w22,w21
613         ror     w12,w5,#17
614         bic     w28,w23,w21
615         ror     w14,w25,#2
616         add     w24,w24,w6                      // h+=X[i]
617         eor     w16,w16,w21,ror#11
618         eor     w13,w13,w8,ror#18
619         orr     w17,w17,w28                     // Ch(e,f,g)
620         eor     w28,w25,w26                     // a^b, b^c in next round
621         eor     w16,w16,w21,ror#25      // Sigma1(e)
622         eor     w14,w14,w25,ror#13
623         add     w24,w24,w17                     // h+=Ch(e,f,g)
624         and     w19,w19,w28                     // (b^c)&=(a^b)
625         eor     w12,w12,w5,ror#19
626         eor     w13,w13,w8,lsr#3        // sigma0(X[i+1])
627         add     w24,w24,w16                     // h+=Sigma1(e)
628         eor     w19,w19,w26                     // Maj(a,b,c)
629         eor     w17,w14,w25,ror#22      // Sigma0(a)
630         eor     w12,w12,w5,lsr#10       // sigma1(X[i+14])
631         add     w7,w7,w0
632         add     w20,w20,w24                     // d+=h
633         add     w24,w24,w19                     // h+=Maj(a,b,c)
634         ldr     w19,[x30],#4            // *K++, w28 in next round
635         add     w7,w7,w13
636         add     w24,w24,w17                     // h+=Sigma0(a)
637         add     w7,w7,w12
638         ldr     w12,[sp,#4]
639         str     w15,[sp,#0]
640         ror     w16,w20,#6
641         add     w23,w23,w19                     // h+=K[i]
642         ror     w14,w9,#7
643         and     w17,w21,w20
644         ror     w13,w6,#17
645         bic     w19,w22,w20
646         ror     w15,w24,#2
647         add     w23,w23,w7                      // h+=X[i]
648         eor     w16,w16,w20,ror#11
649         eor     w14,w14,w9,ror#18
650         orr     w17,w17,w19                     // Ch(e,f,g)
651         eor     w19,w24,w25                     // a^b, b^c in next round
652         eor     w16,w16,w20,ror#25      // Sigma1(e)
653         eor     w15,w15,w24,ror#13
654         add     w23,w23,w17                     // h+=Ch(e,f,g)
655         and     w28,w28,w19                     // (b^c)&=(a^b)
656         eor     w13,w13,w6,ror#19
657         eor     w14,w14,w9,lsr#3        // sigma0(X[i+1])
658         add     w23,w23,w16                     // h+=Sigma1(e)
659         eor     w28,w28,w25                     // Maj(a,b,c)
660         eor     w17,w15,w24,ror#22      // Sigma0(a)
661         eor     w13,w13,w6,lsr#10       // sigma1(X[i+14])
662         add     w8,w8,w1
663         add     w27,w27,w23                     // d+=h
664         add     w23,w23,w28                     // h+=Maj(a,b,c)
665         ldr     w28,[x30],#4            // *K++, w19 in next round
666         add     w8,w8,w14
667         add     w23,w23,w17                     // h+=Sigma0(a)
668         add     w8,w8,w13
669         ldr     w13,[sp,#8]
670         str     w0,[sp,#4]
671         ror     w16,w27,#6
672         add     w22,w22,w28                     // h+=K[i]
673         ror     w15,w10,#7
674         and     w17,w20,w27
675         ror     w14,w7,#17
676         bic     w28,w21,w27
677         ror     w0,w23,#2
678         add     w22,w22,w8                      // h+=X[i]
679         eor     w16,w16,w27,ror#11
680         eor     w15,w15,w10,ror#18
681         orr     w17,w17,w28                     // Ch(e,f,g)
682         eor     w28,w23,w24                     // a^b, b^c in next round
683         eor     w16,w16,w27,ror#25      // Sigma1(e)
684         eor     w0,w0,w23,ror#13
685         add     w22,w22,w17                     // h+=Ch(e,f,g)
686         and     w19,w19,w28                     // (b^c)&=(a^b)
687         eor     w14,w14,w7,ror#19
688         eor     w15,w15,w10,lsr#3       // sigma0(X[i+1])
689         add     w22,w22,w16                     // h+=Sigma1(e)
690         eor     w19,w19,w24                     // Maj(a,b,c)
691         eor     w17,w0,w23,ror#22       // Sigma0(a)
692         eor     w14,w14,w7,lsr#10       // sigma1(X[i+14])
693         add     w9,w9,w2
694         add     w26,w26,w22                     // d+=h
695         add     w22,w22,w19                     // h+=Maj(a,b,c)
696         ldr     w19,[x30],#4            // *K++, w28 in next round
697         add     w9,w9,w15
698         add     w22,w22,w17                     // h+=Sigma0(a)
699         add     w9,w9,w14
700         ldr     w14,[sp,#12]
701         str     w1,[sp,#8]
702         ror     w16,w26,#6
703         add     w21,w21,w19                     // h+=K[i]
704         ror     w0,w11,#7
705         and     w17,w27,w26
706         ror     w15,w8,#17
707         bic     w19,w20,w26
708         ror     w1,w22,#2
709         add     w21,w21,w9                      // h+=X[i]
710         eor     w16,w16,w26,ror#11
711         eor     w0,w0,w11,ror#18
712         orr     w17,w17,w19                     // Ch(e,f,g)
713         eor     w19,w22,w23                     // a^b, b^c in next round
714         eor     w16,w16,w26,ror#25      // Sigma1(e)
715         eor     w1,w1,w22,ror#13
716         add     w21,w21,w17                     // h+=Ch(e,f,g)
717         and     w28,w28,w19                     // (b^c)&=(a^b)
718         eor     w15,w15,w8,ror#19
719         eor     w0,w0,w11,lsr#3 // sigma0(X[i+1])
720         add     w21,w21,w16                     // h+=Sigma1(e)
721         eor     w28,w28,w23                     // Maj(a,b,c)
722         eor     w17,w1,w22,ror#22       // Sigma0(a)
723         eor     w15,w15,w8,lsr#10       // sigma1(X[i+14])
724         add     w10,w10,w3
725         add     w25,w25,w21                     // d+=h
726         add     w21,w21,w28                     // h+=Maj(a,b,c)
727         ldr     w28,[x30],#4            // *K++, w19 in next round
728         add     w10,w10,w0
729         add     w21,w21,w17                     // h+=Sigma0(a)
730         add     w10,w10,w15
731         ldr     w15,[sp,#0]
732         str     w2,[sp,#12]
733         ror     w16,w25,#6
734         add     w20,w20,w28                     // h+=K[i]
735         ror     w1,w12,#7
736         and     w17,w26,w25
737         ror     w0,w9,#17
738         bic     w28,w27,w25
739         ror     w2,w21,#2
740         add     w20,w20,w10                     // h+=X[i]
741         eor     w16,w16,w25,ror#11
742         eor     w1,w1,w12,ror#18
743         orr     w17,w17,w28                     // Ch(e,f,g)
744         eor     w28,w21,w22                     // a^b, b^c in next round
745         eor     w16,w16,w25,ror#25      // Sigma1(e)
746         eor     w2,w2,w21,ror#13
747         add     w20,w20,w17                     // h+=Ch(e,f,g)
748         and     w19,w19,w28                     // (b^c)&=(a^b)
749         eor     w0,w0,w9,ror#19
750         eor     w1,w1,w12,lsr#3 // sigma0(X[i+1])
751         add     w20,w20,w16                     // h+=Sigma1(e)
752         eor     w19,w19,w22                     // Maj(a,b,c)
753         eor     w17,w2,w21,ror#22       // Sigma0(a)
754         eor     w0,w0,w9,lsr#10 // sigma1(X[i+14])
755         add     w11,w11,w4
756         add     w24,w24,w20                     // d+=h
757         add     w20,w20,w19                     // h+=Maj(a,b,c)
758         ldr     w19,[x30],#4            // *K++, w28 in next round
759         add     w11,w11,w1
760         add     w20,w20,w17                     // h+=Sigma0(a)
761         add     w11,w11,w0
762         ldr     w0,[sp,#4]
763         str     w3,[sp,#0]
764         ror     w16,w24,#6
765         add     w27,w27,w19                     // h+=K[i]
766         ror     w2,w13,#7
767         and     w17,w25,w24
768         ror     w1,w10,#17
769         bic     w19,w26,w24
770         ror     w3,w20,#2
771         add     w27,w27,w11                     // h+=X[i]
772         eor     w16,w16,w24,ror#11
773         eor     w2,w2,w13,ror#18
774         orr     w17,w17,w19                     // Ch(e,f,g)
775         eor     w19,w20,w21                     // a^b, b^c in next round
776         eor     w16,w16,w24,ror#25      // Sigma1(e)
777         eor     w3,w3,w20,ror#13
778         add     w27,w27,w17                     // h+=Ch(e,f,g)
779         and     w28,w28,w19                     // (b^c)&=(a^b)
780         eor     w1,w1,w10,ror#19
781         eor     w2,w2,w13,lsr#3 // sigma0(X[i+1])
782         add     w27,w27,w16                     // h+=Sigma1(e)
783         eor     w28,w28,w21                     // Maj(a,b,c)
784         eor     w17,w3,w20,ror#22       // Sigma0(a)
785         eor     w1,w1,w10,lsr#10        // sigma1(X[i+14])
786         add     w12,w12,w5
787         add     w23,w23,w27                     // d+=h
788         add     w27,w27,w28                     // h+=Maj(a,b,c)
789         ldr     w28,[x30],#4            // *K++, w19 in next round
790         add     w12,w12,w2
791         add     w27,w27,w17                     // h+=Sigma0(a)
792         add     w12,w12,w1
793         ldr     w1,[sp,#8]
794         str     w4,[sp,#4]
795         ror     w16,w23,#6
796         add     w26,w26,w28                     // h+=K[i]
797         ror     w3,w14,#7
798         and     w17,w24,w23
799         ror     w2,w11,#17
800         bic     w28,w25,w23
801         ror     w4,w27,#2
802         add     w26,w26,w12                     // h+=X[i]
803         eor     w16,w16,w23,ror#11
804         eor     w3,w3,w14,ror#18
805         orr     w17,w17,w28                     // Ch(e,f,g)
806         eor     w28,w27,w20                     // a^b, b^c in next round
807         eor     w16,w16,w23,ror#25      // Sigma1(e)
808         eor     w4,w4,w27,ror#13
809         add     w26,w26,w17                     // h+=Ch(e,f,g)
810         and     w19,w19,w28                     // (b^c)&=(a^b)
811         eor     w2,w2,w11,ror#19
812         eor     w3,w3,w14,lsr#3 // sigma0(X[i+1])
813         add     w26,w26,w16                     // h+=Sigma1(e)
814         eor     w19,w19,w20                     // Maj(a,b,c)
815         eor     w17,w4,w27,ror#22       // Sigma0(a)
816         eor     w2,w2,w11,lsr#10        // sigma1(X[i+14])
817         add     w13,w13,w6
818         add     w22,w22,w26                     // d+=h
819         add     w26,w26,w19                     // h+=Maj(a,b,c)
820         ldr     w19,[x30],#4            // *K++, w28 in next round
821         add     w13,w13,w3
822         add     w26,w26,w17                     // h+=Sigma0(a)
823         add     w13,w13,w2
824         ldr     w2,[sp,#12]
825         str     w5,[sp,#8]
826         ror     w16,w22,#6
827         add     w25,w25,w19                     // h+=K[i]
828         ror     w4,w15,#7
829         and     w17,w23,w22
830         ror     w3,w12,#17
831         bic     w19,w24,w22
832         ror     w5,w26,#2
833         add     w25,w25,w13                     // h+=X[i]
834         eor     w16,w16,w22,ror#11
835         eor     w4,w4,w15,ror#18
836         orr     w17,w17,w19                     // Ch(e,f,g)
837         eor     w19,w26,w27                     // a^b, b^c in next round
838         eor     w16,w16,w22,ror#25      // Sigma1(e)
839         eor     w5,w5,w26,ror#13
840         add     w25,w25,w17                     // h+=Ch(e,f,g)
841         and     w28,w28,w19                     // (b^c)&=(a^b)
842         eor     w3,w3,w12,ror#19
843         eor     w4,w4,w15,lsr#3 // sigma0(X[i+1])
844         add     w25,w25,w16                     // h+=Sigma1(e)
845         eor     w28,w28,w27                     // Maj(a,b,c)
846         eor     w17,w5,w26,ror#22       // Sigma0(a)
847         eor     w3,w3,w12,lsr#10        // sigma1(X[i+14])
848         add     w14,w14,w7
849         add     w21,w21,w25                     // d+=h
850         add     w25,w25,w28                     // h+=Maj(a,b,c)
851         ldr     w28,[x30],#4            // *K++, w19 in next round
852         add     w14,w14,w4
853         add     w25,w25,w17                     // h+=Sigma0(a)
854         add     w14,w14,w3
855         ldr     w3,[sp,#0]
856         str     w6,[sp,#12]
857         ror     w16,w21,#6
858         add     w24,w24,w28                     // h+=K[i]
859         ror     w5,w0,#7
860         and     w17,w22,w21
861         ror     w4,w13,#17
862         bic     w28,w23,w21
863         ror     w6,w25,#2
864         add     w24,w24,w14                     // h+=X[i]
865         eor     w16,w16,w21,ror#11
866         eor     w5,w5,w0,ror#18
867         orr     w17,w17,w28                     // Ch(e,f,g)
868         eor     w28,w25,w26                     // a^b, b^c in next round
869         eor     w16,w16,w21,ror#25      // Sigma1(e)
870         eor     w6,w6,w25,ror#13
871         add     w24,w24,w17                     // h+=Ch(e,f,g)
872         and     w19,w19,w28                     // (b^c)&=(a^b)
873         eor     w4,w4,w13,ror#19
874         eor     w5,w5,w0,lsr#3  // sigma0(X[i+1])
875         add     w24,w24,w16                     // h+=Sigma1(e)
876         eor     w19,w19,w26                     // Maj(a,b,c)
877         eor     w17,w6,w25,ror#22       // Sigma0(a)
878         eor     w4,w4,w13,lsr#10        // sigma1(X[i+14])
879         add     w15,w15,w8
880         add     w20,w20,w24                     // d+=h
881         add     w24,w24,w19                     // h+=Maj(a,b,c)
882         ldr     w19,[x30],#4            // *K++, w28 in next round
883         add     w15,w15,w5
884         add     w24,w24,w17                     // h+=Sigma0(a)
885         add     w15,w15,w4
886         ldr     w4,[sp,#4]
887         str     w7,[sp,#0]
888         ror     w16,w20,#6
889         add     w23,w23,w19                     // h+=K[i]
890         ror     w6,w1,#7
891         and     w17,w21,w20
892         ror     w5,w14,#17
893         bic     w19,w22,w20
894         ror     w7,w24,#2
895         add     w23,w23,w15                     // h+=X[i]
896         eor     w16,w16,w20,ror#11
897         eor     w6,w6,w1,ror#18
898         orr     w17,w17,w19                     // Ch(e,f,g)
899         eor     w19,w24,w25                     // a^b, b^c in next round
900         eor     w16,w16,w20,ror#25      // Sigma1(e)
901         eor     w7,w7,w24,ror#13
902         add     w23,w23,w17                     // h+=Ch(e,f,g)
903         and     w28,w28,w19                     // (b^c)&=(a^b)
904         eor     w5,w5,w14,ror#19
905         eor     w6,w6,w1,lsr#3  // sigma0(X[i+1])
906         add     w23,w23,w16                     // h+=Sigma1(e)
907         eor     w28,w28,w25                     // Maj(a,b,c)
908         eor     w17,w7,w24,ror#22       // Sigma0(a)
909         eor     w5,w5,w14,lsr#10        // sigma1(X[i+14])
910         add     w0,w0,w9
911         add     w27,w27,w23                     // d+=h
912         add     w23,w23,w28                     // h+=Maj(a,b,c)
913         ldr     w28,[x30],#4            // *K++, w19 in next round
914         add     w0,w0,w6
915         add     w23,w23,w17                     // h+=Sigma0(a)
916         add     w0,w0,w5
917         ldr     w5,[sp,#8]
918         str     w8,[sp,#4]
919         ror     w16,w27,#6
920         add     w22,w22,w28                     // h+=K[i]
921         ror     w7,w2,#7
922         and     w17,w20,w27
923         ror     w6,w15,#17
924         bic     w28,w21,w27
925         ror     w8,w23,#2
926         add     w22,w22,w0                      // h+=X[i]
927         eor     w16,w16,w27,ror#11
928         eor     w7,w7,w2,ror#18
929         orr     w17,w17,w28                     // Ch(e,f,g)
930         eor     w28,w23,w24                     // a^b, b^c in next round
931         eor     w16,w16,w27,ror#25      // Sigma1(e)
932         eor     w8,w8,w23,ror#13
933         add     w22,w22,w17                     // h+=Ch(e,f,g)
934         and     w19,w19,w28                     // (b^c)&=(a^b)
935         eor     w6,w6,w15,ror#19
936         eor     w7,w7,w2,lsr#3  // sigma0(X[i+1])
937         add     w22,w22,w16                     // h+=Sigma1(e)
938         eor     w19,w19,w24                     // Maj(a,b,c)
939         eor     w17,w8,w23,ror#22       // Sigma0(a)
940         eor     w6,w6,w15,lsr#10        // sigma1(X[i+14])
941         add     w1,w1,w10
942         add     w26,w26,w22                     // d+=h
943         add     w22,w22,w19                     // h+=Maj(a,b,c)
944         ldr     w19,[x30],#4            // *K++, w28 in next round
945         add     w1,w1,w7
946         add     w22,w22,w17                     // h+=Sigma0(a)
947         add     w1,w1,w6
948         ldr     w6,[sp,#12]
949         str     w9,[sp,#8]
950         ror     w16,w26,#6
951         add     w21,w21,w19                     // h+=K[i]
952         ror     w8,w3,#7
953         and     w17,w27,w26
954         ror     w7,w0,#17
955         bic     w19,w20,w26
956         ror     w9,w22,#2
957         add     w21,w21,w1                      // h+=X[i]
958         eor     w16,w16,w26,ror#11
959         eor     w8,w8,w3,ror#18
960         orr     w17,w17,w19                     // Ch(e,f,g)
961         eor     w19,w22,w23                     // a^b, b^c in next round
962         eor     w16,w16,w26,ror#25      // Sigma1(e)
963         eor     w9,w9,w22,ror#13
964         add     w21,w21,w17                     // h+=Ch(e,f,g)
965         and     w28,w28,w19                     // (b^c)&=(a^b)
966         eor     w7,w7,w0,ror#19
967         eor     w8,w8,w3,lsr#3  // sigma0(X[i+1])
968         add     w21,w21,w16                     // h+=Sigma1(e)
969         eor     w28,w28,w23                     // Maj(a,b,c)
970         eor     w17,w9,w22,ror#22       // Sigma0(a)
971         eor     w7,w7,w0,lsr#10 // sigma1(X[i+14])
972         add     w2,w2,w11
973         add     w25,w25,w21                     // d+=h
974         add     w21,w21,w28                     // h+=Maj(a,b,c)
975         ldr     w28,[x30],#4            // *K++, w19 in next round
976         add     w2,w2,w8
977         add     w21,w21,w17                     // h+=Sigma0(a)
978         add     w2,w2,w7
979         ldr     w7,[sp,#0]
980         str     w10,[sp,#12]
981         ror     w16,w25,#6
982         add     w20,w20,w28                     // h+=K[i]
983         ror     w9,w4,#7
984         and     w17,w26,w25
985         ror     w8,w1,#17
986         bic     w28,w27,w25
987         ror     w10,w21,#2
988         add     w20,w20,w2                      // h+=X[i]
989         eor     w16,w16,w25,ror#11
990         eor     w9,w9,w4,ror#18
991         orr     w17,w17,w28                     // Ch(e,f,g)
992         eor     w28,w21,w22                     // a^b, b^c in next round
993         eor     w16,w16,w25,ror#25      // Sigma1(e)
994         eor     w10,w10,w21,ror#13
995         add     w20,w20,w17                     // h+=Ch(e,f,g)
996         and     w19,w19,w28                     // (b^c)&=(a^b)
997         eor     w8,w8,w1,ror#19
998         eor     w9,w9,w4,lsr#3  // sigma0(X[i+1])
999         add     w20,w20,w16                     // h+=Sigma1(e)
1000         eor     w19,w19,w22                     // Maj(a,b,c)
1001         eor     w17,w10,w21,ror#22      // Sigma0(a)
1002         eor     w8,w8,w1,lsr#10 // sigma1(X[i+14])
1003         add     w3,w3,w12
1004         add     w24,w24,w20                     // d+=h
1005         add     w20,w20,w19                     // h+=Maj(a,b,c)
1006         ldr     w19,[x30],#4            // *K++, w28 in next round
1007         add     w3,w3,w9
1008         add     w20,w20,w17                     // h+=Sigma0(a)
1009         add     w3,w3,w8
1010         cbnz    w19,.Loop_16_xx
1011
1012         ldp     x0,x2,[x29,#96]
1013         ldr     x1,[x29,#112]
1014         sub     x30,x30,#260            // rewind
1015
1016         ldp     w3,w4,[x0]
1017         ldp     w5,w6,[x0,#2*4]
1018         add     x1,x1,#14*4                     // advance input pointer
1019         ldp     w7,w8,[x0,#4*4]
1020         add     w20,w20,w3
1021         ldp     w9,w10,[x0,#6*4]
1022         add     w21,w21,w4
1023         add     w22,w22,w5
1024         add     w23,w23,w6
1025         stp     w20,w21,[x0]
1026         add     w24,w24,w7
1027         add     w25,w25,w8
1028         stp     w22,w23,[x0,#2*4]
1029         add     w26,w26,w9
1030         add     w27,w27,w10
1031         cmp     x1,x2
1032         stp     w24,w25,[x0,#4*4]
1033         stp     w26,w27,[x0,#6*4]
1034         b.ne    .Loop
1035
1036         ldp     x19,x20,[x29,#16]
1037         add     sp,sp,#4*4
1038         ldp     x21,x22,[x29,#32]
1039         ldp     x23,x24,[x29,#48]
1040         ldp     x25,x26,[x29,#64]
1041         ldp     x27,x28,[x29,#80]
1042         ldp     x29,x30,[sp],#128
1043 .inst   0xd50323bf                              // autiasp
1044         ret
1045 .size   sha256_block_data_order,.-sha256_block_data_order
1046
1047 .align  6
1048 .type   .LK256,%object
1049 .LK256:
1050 .long   0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5
1051 .long   0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5
1052 .long   0xd807aa98,0x12835b01,0x243185be,0x550c7dc3
1053 .long   0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174
1054 .long   0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc
1055 .long   0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da
1056 .long   0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7
1057 .long   0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967
1058 .long   0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13
1059 .long   0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85
1060 .long   0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3
1061 .long   0xd192e819,0xd6990624,0xf40e3585,0x106aa070
1062 .long   0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5
1063 .long   0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3
1064 .long   0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208
1065 .long   0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2
1066 .long   0       //terminator
1067 .size   .LK256,.-.LK256
1068 #ifndef __KERNEL__
1069 .align  3
1070 .LOPENSSL_armcap_P:
1071 # ifdef __ILP32__
1072 .long   OPENSSL_armcap_P-.
1073 # else
1074 .quad   OPENSSL_armcap_P-.
1075 # endif
1076 #endif
1077 .byte   83,72,65,50,53,54,32,98,108,111,99,107,32,116,114,97,110,115,102,111,114,109,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0
1078 .align  2
1079 .align  2
1080 #ifndef __KERNEL__
1081 .type   sha256_block_armv8,%function
1082 .align  6
1083 sha256_block_armv8:
1084 .Lv8_entry:
1085         stp     x29,x30,[sp,#-16]!
1086         add     x29,sp,#0
1087
1088         ld1     {v0.4s,v1.4s},[x0]
1089         adr     x3,.LK256
1090
1091 .Loop_hw:
1092         ld1     {v4.16b,v5.16b,v6.16b,v7.16b},[x1],#64
1093         sub     x2,x2,#1
1094         ld1     {v16.4s},[x3],#16
1095         rev32   v4.16b,v4.16b
1096         rev32   v5.16b,v5.16b
1097         rev32   v6.16b,v6.16b
1098         rev32   v7.16b,v7.16b
1099         orr     v18.16b,v0.16b,v0.16b           // offload
1100         orr     v19.16b,v1.16b,v1.16b
1101         ld1     {v17.4s},[x3],#16
1102         add     v16.4s,v16.4s,v4.4s
1103 .inst   0x5e2828a4      //sha256su0 v4.16b,v5.16b
1104         orr     v2.16b,v0.16b,v0.16b
1105 .inst   0x5e104020      //sha256h v0.16b,v1.16b,v16.4s
1106 .inst   0x5e105041      //sha256h2 v1.16b,v2.16b,v16.4s
1107 .inst   0x5e0760c4      //sha256su1 v4.16b,v6.16b,v7.16b
1108         ld1     {v16.4s},[x3],#16
1109         add     v17.4s,v17.4s,v5.4s
1110 .inst   0x5e2828c5      //sha256su0 v5.16b,v6.16b
1111         orr     v2.16b,v0.16b,v0.16b
1112 .inst   0x5e114020      //sha256h v0.16b,v1.16b,v17.4s
1113 .inst   0x5e115041      //sha256h2 v1.16b,v2.16b,v17.4s
1114 .inst   0x5e0460e5      //sha256su1 v5.16b,v7.16b,v4.16b
1115         ld1     {v17.4s},[x3],#16
1116         add     v16.4s,v16.4s,v6.4s
1117 .inst   0x5e2828e6      //sha256su0 v6.16b,v7.16b
1118         orr     v2.16b,v0.16b,v0.16b
1119 .inst   0x5e104020      //sha256h v0.16b,v1.16b,v16.4s
1120 .inst   0x5e105041      //sha256h2 v1.16b,v2.16b,v16.4s
1121 .inst   0x5e056086      //sha256su1 v6.16b,v4.16b,v5.16b
1122         ld1     {v16.4s},[x3],#16
1123         add     v17.4s,v17.4s,v7.4s
1124 .inst   0x5e282887      //sha256su0 v7.16b,v4.16b
1125         orr     v2.16b,v0.16b,v0.16b
1126 .inst   0x5e114020      //sha256h v0.16b,v1.16b,v17.4s
1127 .inst   0x5e115041      //sha256h2 v1.16b,v2.16b,v17.4s
1128 .inst   0x5e0660a7      //sha256su1 v7.16b,v5.16b,v6.16b
1129         ld1     {v17.4s},[x3],#16
1130         add     v16.4s,v16.4s,v4.4s
1131 .inst   0x5e2828a4      //sha256su0 v4.16b,v5.16b
1132         orr     v2.16b,v0.16b,v0.16b
1133 .inst   0x5e104020      //sha256h v0.16b,v1.16b,v16.4s
1134 .inst   0x5e105041      //sha256h2 v1.16b,v2.16b,v16.4s
1135 .inst   0x5e0760c4      //sha256su1 v4.16b,v6.16b,v7.16b
1136         ld1     {v16.4s},[x3],#16
1137         add     v17.4s,v17.4s,v5.4s
1138 .inst   0x5e2828c5      //sha256su0 v5.16b,v6.16b
1139         orr     v2.16b,v0.16b,v0.16b
1140 .inst   0x5e114020      //sha256h v0.16b,v1.16b,v17.4s
1141 .inst   0x5e115041      //sha256h2 v1.16b,v2.16b,v17.4s
1142 .inst   0x5e0460e5      //sha256su1 v5.16b,v7.16b,v4.16b
1143         ld1     {v17.4s},[x3],#16
1144         add     v16.4s,v16.4s,v6.4s
1145 .inst   0x5e2828e6      //sha256su0 v6.16b,v7.16b
1146         orr     v2.16b,v0.16b,v0.16b
1147 .inst   0x5e104020      //sha256h v0.16b,v1.16b,v16.4s
1148 .inst   0x5e105041      //sha256h2 v1.16b,v2.16b,v16.4s
1149 .inst   0x5e056086      //sha256su1 v6.16b,v4.16b,v5.16b
1150         ld1     {v16.4s},[x3],#16
1151         add     v17.4s,v17.4s,v7.4s
1152 .inst   0x5e282887      //sha256su0 v7.16b,v4.16b
1153         orr     v2.16b,v0.16b,v0.16b
1154 .inst   0x5e114020      //sha256h v0.16b,v1.16b,v17.4s
1155 .inst   0x5e115041      //sha256h2 v1.16b,v2.16b,v17.4s
1156 .inst   0x5e0660a7      //sha256su1 v7.16b,v5.16b,v6.16b
1157         ld1     {v17.4s},[x3],#16
1158         add     v16.4s,v16.4s,v4.4s
1159 .inst   0x5e2828a4      //sha256su0 v4.16b,v5.16b
1160         orr     v2.16b,v0.16b,v0.16b
1161 .inst   0x5e104020      //sha256h v0.16b,v1.16b,v16.4s
1162 .inst   0x5e105041      //sha256h2 v1.16b,v2.16b,v16.4s
1163 .inst   0x5e0760c4      //sha256su1 v4.16b,v6.16b,v7.16b
1164         ld1     {v16.4s},[x3],#16
1165         add     v17.4s,v17.4s,v5.4s
1166 .inst   0x5e2828c5      //sha256su0 v5.16b,v6.16b
1167         orr     v2.16b,v0.16b,v0.16b
1168 .inst   0x5e114020      //sha256h v0.16b,v1.16b,v17.4s
1169 .inst   0x5e115041      //sha256h2 v1.16b,v2.16b,v17.4s
1170 .inst   0x5e0460e5      //sha256su1 v5.16b,v7.16b,v4.16b
1171         ld1     {v17.4s},[x3],#16
1172         add     v16.4s,v16.4s,v6.4s
1173 .inst   0x5e2828e6      //sha256su0 v6.16b,v7.16b
1174         orr     v2.16b,v0.16b,v0.16b
1175 .inst   0x5e104020      //sha256h v0.16b,v1.16b,v16.4s
1176 .inst   0x5e105041      //sha256h2 v1.16b,v2.16b,v16.4s
1177 .inst   0x5e056086      //sha256su1 v6.16b,v4.16b,v5.16b
1178         ld1     {v16.4s},[x3],#16
1179         add     v17.4s,v17.4s,v7.4s
1180 .inst   0x5e282887      //sha256su0 v7.16b,v4.16b
1181         orr     v2.16b,v0.16b,v0.16b
1182 .inst   0x5e114020      //sha256h v0.16b,v1.16b,v17.4s
1183 .inst   0x5e115041      //sha256h2 v1.16b,v2.16b,v17.4s
1184 .inst   0x5e0660a7      //sha256su1 v7.16b,v5.16b,v6.16b
1185         ld1     {v17.4s},[x3],#16
1186         add     v16.4s,v16.4s,v4.4s
1187         orr     v2.16b,v0.16b,v0.16b
1188 .inst   0x5e104020      //sha256h v0.16b,v1.16b,v16.4s
1189 .inst   0x5e105041      //sha256h2 v1.16b,v2.16b,v16.4s
1190
1191         ld1     {v16.4s},[x3],#16
1192         add     v17.4s,v17.4s,v5.4s
1193         orr     v2.16b,v0.16b,v0.16b
1194 .inst   0x5e114020      //sha256h v0.16b,v1.16b,v17.4s
1195 .inst   0x5e115041      //sha256h2 v1.16b,v2.16b,v17.4s
1196
1197         ld1     {v17.4s},[x3]
1198         add     v16.4s,v16.4s,v6.4s
1199         sub     x3,x3,#64*4-16  // rewind
1200         orr     v2.16b,v0.16b,v0.16b
1201 .inst   0x5e104020      //sha256h v0.16b,v1.16b,v16.4s
1202 .inst   0x5e105041      //sha256h2 v1.16b,v2.16b,v16.4s
1203
1204         add     v17.4s,v17.4s,v7.4s
1205         orr     v2.16b,v0.16b,v0.16b
1206 .inst   0x5e114020      //sha256h v0.16b,v1.16b,v17.4s
1207 .inst   0x5e115041      //sha256h2 v1.16b,v2.16b,v17.4s
1208
1209         add     v0.4s,v0.4s,v18.4s
1210         add     v1.4s,v1.4s,v19.4s
1211
1212         cbnz    x2,.Loop_hw
1213
1214         st1     {v0.4s,v1.4s},[x0]
1215
1216         ldr     x29,[sp],#16
1217         ret
1218 .size   sha256_block_armv8,.-sha256_block_armv8
1219 #endif
1220 #ifdef  __KERNEL__
1221 .globl  sha256_block_neon
1222 #endif
1223 .type   sha256_block_neon,%function
1224 .align  4
1225 sha256_block_neon:
1226 .Lneon_entry:
1227         stp     x29, x30, [sp, #-16]!
1228         mov     x29, sp
1229         sub     sp,sp,#16*4
1230
1231         adr     x16,.LK256
1232         add     x2,x1,x2,lsl#6  // len to point at the end of inp
1233
1234         ld1     {v0.16b},[x1], #16
1235         ld1     {v1.16b},[x1], #16
1236         ld1     {v2.16b},[x1], #16
1237         ld1     {v3.16b},[x1], #16
1238         ld1     {v4.4s},[x16], #16
1239         ld1     {v5.4s},[x16], #16
1240         ld1     {v6.4s},[x16], #16
1241         ld1     {v7.4s},[x16], #16
1242         rev32   v0.16b,v0.16b           // yes, even on
1243         rev32   v1.16b,v1.16b           // big-endian
1244         rev32   v2.16b,v2.16b
1245         rev32   v3.16b,v3.16b
1246         mov     x17,sp
1247         add     v4.4s,v4.4s,v0.4s
1248         add     v5.4s,v5.4s,v1.4s
1249         add     v6.4s,v6.4s,v2.4s
1250         st1     {v4.4s,v5.4s},[x17], #32
1251         add     v7.4s,v7.4s,v3.4s
1252         st1     {v6.4s,v7.4s},[x17]
1253         sub     x17,x17,#32
1254
1255         ldp     w3,w4,[x0]
1256         ldp     w5,w6,[x0,#8]
1257         ldp     w7,w8,[x0,#16]
1258         ldp     w9,w10,[x0,#24]
1259         ldr     w12,[sp,#0]
1260         mov     w13,wzr
1261         eor     w14,w4,w5
1262         mov     w15,wzr
1263         b       .L_00_48
1264
1265 .align  4
1266 .L_00_48:
1267         ext     v4.16b,v0.16b,v1.16b,#4
1268         add     w10,w10,w12
1269         add     w3,w3,w15
1270         and     w12,w8,w7
1271         bic     w15,w9,w7
1272         ext     v7.16b,v2.16b,v3.16b,#4
1273         eor     w11,w7,w7,ror#5
1274         add     w3,w3,w13
1275         mov     d19,v3.d[1]
1276         orr     w12,w12,w15
1277         eor     w11,w11,w7,ror#19
1278         ushr    v6.4s,v4.4s,#7
1279         eor     w15,w3,w3,ror#11
1280         ushr    v5.4s,v4.4s,#3
1281         add     w10,w10,w12
1282         add     v0.4s,v0.4s,v7.4s
1283         ror     w11,w11,#6
1284         sli     v6.4s,v4.4s,#25
1285         eor     w13,w3,w4
1286         eor     w15,w15,w3,ror#20
1287         ushr    v7.4s,v4.4s,#18
1288         add     w10,w10,w11
1289         ldr     w12,[sp,#4]
1290         and     w14,w14,w13
1291         eor     v5.16b,v5.16b,v6.16b
1292         ror     w15,w15,#2
1293         add     w6,w6,w10
1294         sli     v7.4s,v4.4s,#14
1295         eor     w14,w14,w4
1296         ushr    v16.4s,v19.4s,#17
1297         add     w9,w9,w12
1298         add     w10,w10,w15
1299         and     w12,w7,w6
1300         eor     v5.16b,v5.16b,v7.16b
1301         bic     w15,w8,w6
1302         eor     w11,w6,w6,ror#5
1303         sli     v16.4s,v19.4s,#15
1304         add     w10,w10,w14
1305         orr     w12,w12,w15
1306         ushr    v17.4s,v19.4s,#10
1307         eor     w11,w11,w6,ror#19
1308         eor     w15,w10,w10,ror#11
1309         ushr    v7.4s,v19.4s,#19
1310         add     w9,w9,w12
1311         ror     w11,w11,#6
1312         add     v0.4s,v0.4s,v5.4s
1313         eor     w14,w10,w3
1314         eor     w15,w15,w10,ror#20
1315         sli     v7.4s,v19.4s,#13
1316         add     w9,w9,w11
1317         ldr     w12,[sp,#8]
1318         and     w13,w13,w14
1319         eor     v17.16b,v17.16b,v16.16b
1320         ror     w15,w15,#2
1321         add     w5,w5,w9
1322         eor     w13,w13,w3
1323         eor     v17.16b,v17.16b,v7.16b
1324         add     w8,w8,w12
1325         add     w9,w9,w15
1326         and     w12,w6,w5
1327         add     v0.4s,v0.4s,v17.4s
1328         bic     w15,w7,w5
1329         eor     w11,w5,w5,ror#5
1330         add     w9,w9,w13
1331         ushr    v18.4s,v0.4s,#17
1332         orr     w12,w12,w15
1333         ushr    v19.4s,v0.4s,#10
1334         eor     w11,w11,w5,ror#19
1335         eor     w15,w9,w9,ror#11
1336         sli     v18.4s,v0.4s,#15
1337         add     w8,w8,w12
1338         ushr    v17.4s,v0.4s,#19
1339         ror     w11,w11,#6
1340         eor     w13,w9,w10
1341         eor     v19.16b,v19.16b,v18.16b
1342         eor     w15,w15,w9,ror#20
1343         add     w8,w8,w11
1344         sli     v17.4s,v0.4s,#13
1345         ldr     w12,[sp,#12]
1346         and     w14,w14,w13
1347         ror     w15,w15,#2
1348         ld1     {v4.4s},[x16], #16
1349         add     w4,w4,w8
1350         eor     v19.16b,v19.16b,v17.16b
1351         eor     w14,w14,w10
1352         eor     v17.16b,v17.16b,v17.16b
1353         add     w7,w7,w12
1354         add     w8,w8,w15
1355         and     w12,w5,w4
1356         mov     v17.d[1],v19.d[0]
1357         bic     w15,w6,w4
1358         eor     w11,w4,w4,ror#5
1359         add     w8,w8,w14
1360         add     v0.4s,v0.4s,v17.4s
1361         orr     w12,w12,w15
1362         eor     w11,w11,w4,ror#19
1363         eor     w15,w8,w8,ror#11
1364         add     v4.4s,v4.4s,v0.4s
1365         add     w7,w7,w12
1366         ror     w11,w11,#6
1367         eor     w14,w8,w9
1368         eor     w15,w15,w8,ror#20
1369         add     w7,w7,w11
1370         ldr     w12,[sp,#16]
1371         and     w13,w13,w14
1372         ror     w15,w15,#2
1373         add     w3,w3,w7
1374         eor     w13,w13,w9
1375         st1     {v4.4s},[x17], #16
1376         ext     v4.16b,v1.16b,v2.16b,#4
1377         add     w6,w6,w12
1378         add     w7,w7,w15
1379         and     w12,w4,w3
1380         bic     w15,w5,w3
1381         ext     v7.16b,v3.16b,v0.16b,#4
1382         eor     w11,w3,w3,ror#5
1383         add     w7,w7,w13
1384         mov     d19,v0.d[1]
1385         orr     w12,w12,w15
1386         eor     w11,w11,w3,ror#19
1387         ushr    v6.4s,v4.4s,#7
1388         eor     w15,w7,w7,ror#11
1389         ushr    v5.4s,v4.4s,#3
1390         add     w6,w6,w12
1391         add     v1.4s,v1.4s,v7.4s
1392         ror     w11,w11,#6
1393         sli     v6.4s,v4.4s,#25
1394         eor     w13,w7,w8
1395         eor     w15,w15,w7,ror#20
1396         ushr    v7.4s,v4.4s,#18
1397         add     w6,w6,w11
1398         ldr     w12,[sp,#20]
1399         and     w14,w14,w13
1400         eor     v5.16b,v5.16b,v6.16b
1401         ror     w15,w15,#2
1402         add     w10,w10,w6
1403         sli     v7.4s,v4.4s,#14
1404         eor     w14,w14,w8
1405         ushr    v16.4s,v19.4s,#17
1406         add     w5,w5,w12
1407         add     w6,w6,w15
1408         and     w12,w3,w10
1409         eor     v5.16b,v5.16b,v7.16b
1410         bic     w15,w4,w10
1411         eor     w11,w10,w10,ror#5
1412         sli     v16.4s,v19.4s,#15
1413         add     w6,w6,w14
1414         orr     w12,w12,w15
1415         ushr    v17.4s,v19.4s,#10
1416         eor     w11,w11,w10,ror#19
1417         eor     w15,w6,w6,ror#11
1418         ushr    v7.4s,v19.4s,#19
1419         add     w5,w5,w12
1420         ror     w11,w11,#6
1421         add     v1.4s,v1.4s,v5.4s
1422         eor     w14,w6,w7
1423         eor     w15,w15,w6,ror#20
1424         sli     v7.4s,v19.4s,#13
1425         add     w5,w5,w11
1426         ldr     w12,[sp,#24]
1427         and     w13,w13,w14
1428         eor     v17.16b,v17.16b,v16.16b
1429         ror     w15,w15,#2
1430         add     w9,w9,w5
1431         eor     w13,w13,w7
1432         eor     v17.16b,v17.16b,v7.16b
1433         add     w4,w4,w12
1434         add     w5,w5,w15
1435         and     w12,w10,w9
1436         add     v1.4s,v1.4s,v17.4s
1437         bic     w15,w3,w9
1438         eor     w11,w9,w9,ror#5
1439         add     w5,w5,w13
1440         ushr    v18.4s,v1.4s,#17
1441         orr     w12,w12,w15
1442         ushr    v19.4s,v1.4s,#10
1443         eor     w11,w11,w9,ror#19
1444         eor     w15,w5,w5,ror#11
1445         sli     v18.4s,v1.4s,#15
1446         add     w4,w4,w12
1447         ushr    v17.4s,v1.4s,#19
1448         ror     w11,w11,#6
1449         eor     w13,w5,w6
1450         eor     v19.16b,v19.16b,v18.16b
1451         eor     w15,w15,w5,ror#20
1452         add     w4,w4,w11
1453         sli     v17.4s,v1.4s,#13
1454         ldr     w12,[sp,#28]
1455         and     w14,w14,w13
1456         ror     w15,w15,#2
1457         ld1     {v4.4s},[x16], #16
1458         add     w8,w8,w4
1459         eor     v19.16b,v19.16b,v17.16b
1460         eor     w14,w14,w6
1461         eor     v17.16b,v17.16b,v17.16b
1462         add     w3,w3,w12
1463         add     w4,w4,w15
1464         and     w12,w9,w8
1465         mov     v17.d[1],v19.d[0]
1466         bic     w15,w10,w8
1467         eor     w11,w8,w8,ror#5
1468         add     w4,w4,w14
1469         add     v1.4s,v1.4s,v17.4s
1470         orr     w12,w12,w15
1471         eor     w11,w11,w8,ror#19
1472         eor     w15,w4,w4,ror#11
1473         add     v4.4s,v4.4s,v1.4s
1474         add     w3,w3,w12
1475         ror     w11,w11,#6
1476         eor     w14,w4,w5
1477         eor     w15,w15,w4,ror#20
1478         add     w3,w3,w11
1479         ldr     w12,[sp,#32]
1480         and     w13,w13,w14
1481         ror     w15,w15,#2
1482         add     w7,w7,w3
1483         eor     w13,w13,w5
1484         st1     {v4.4s},[x17], #16
1485         ext     v4.16b,v2.16b,v3.16b,#4
1486         add     w10,w10,w12
1487         add     w3,w3,w15
1488         and     w12,w8,w7
1489         bic     w15,w9,w7
1490         ext     v7.16b,v0.16b,v1.16b,#4
1491         eor     w11,w7,w7,ror#5
1492         add     w3,w3,w13
1493         mov     d19,v1.d[1]
1494         orr     w12,w12,w15
1495         eor     w11,w11,w7,ror#19
1496         ushr    v6.4s,v4.4s,#7
1497         eor     w15,w3,w3,ror#11
1498         ushr    v5.4s,v4.4s,#3
1499         add     w10,w10,w12
1500         add     v2.4s,v2.4s,v7.4s
1501         ror     w11,w11,#6
1502         sli     v6.4s,v4.4s,#25
1503         eor     w13,w3,w4
1504         eor     w15,w15,w3,ror#20
1505         ushr    v7.4s,v4.4s,#18
1506         add     w10,w10,w11
1507         ldr     w12,[sp,#36]
1508         and     w14,w14,w13
1509         eor     v5.16b,v5.16b,v6.16b
1510         ror     w15,w15,#2
1511         add     w6,w6,w10
1512         sli     v7.4s,v4.4s,#14
1513         eor     w14,w14,w4
1514         ushr    v16.4s,v19.4s,#17
1515         add     w9,w9,w12
1516         add     w10,w10,w15
1517         and     w12,w7,w6
1518         eor     v5.16b,v5.16b,v7.16b
1519         bic     w15,w8,w6
1520         eor     w11,w6,w6,ror#5
1521         sli     v16.4s,v19.4s,#15
1522         add     w10,w10,w14
1523         orr     w12,w12,w15
1524         ushr    v17.4s,v19.4s,#10
1525         eor     w11,w11,w6,ror#19
1526         eor     w15,w10,w10,ror#11
1527         ushr    v7.4s,v19.4s,#19
1528         add     w9,w9,w12
1529         ror     w11,w11,#6
1530         add     v2.4s,v2.4s,v5.4s
1531         eor     w14,w10,w3
1532         eor     w15,w15,w10,ror#20
1533         sli     v7.4s,v19.4s,#13
1534         add     w9,w9,w11
1535         ldr     w12,[sp,#40]
1536         and     w13,w13,w14
1537         eor     v17.16b,v17.16b,v16.16b
1538         ror     w15,w15,#2
1539         add     w5,w5,w9
1540         eor     w13,w13,w3
1541         eor     v17.16b,v17.16b,v7.16b
1542         add     w8,w8,w12
1543         add     w9,w9,w15
1544         and     w12,w6,w5
1545         add     v2.4s,v2.4s,v17.4s
1546         bic     w15,w7,w5
1547         eor     w11,w5,w5,ror#5
1548         add     w9,w9,w13
1549         ushr    v18.4s,v2.4s,#17
1550         orr     w12,w12,w15
1551         ushr    v19.4s,v2.4s,#10
1552         eor     w11,w11,w5,ror#19
1553         eor     w15,w9,w9,ror#11
1554         sli     v18.4s,v2.4s,#15
1555         add     w8,w8,w12
1556         ushr    v17.4s,v2.4s,#19
1557         ror     w11,w11,#6
1558         eor     w13,w9,w10
1559         eor     v19.16b,v19.16b,v18.16b
1560         eor     w15,w15,w9,ror#20
1561         add     w8,w8,w11
1562         sli     v17.4s,v2.4s,#13
1563         ldr     w12,[sp,#44]
1564         and     w14,w14,w13
1565         ror     w15,w15,#2
1566         ld1     {v4.4s},[x16], #16
1567         add     w4,w4,w8
1568         eor     v19.16b,v19.16b,v17.16b
1569         eor     w14,w14,w10
1570         eor     v17.16b,v17.16b,v17.16b
1571         add     w7,w7,w12
1572         add     w8,w8,w15
1573         and     w12,w5,w4
1574         mov     v17.d[1],v19.d[0]
1575         bic     w15,w6,w4
1576         eor     w11,w4,w4,ror#5
1577         add     w8,w8,w14
1578         add     v2.4s,v2.4s,v17.4s
1579         orr     w12,w12,w15
1580         eor     w11,w11,w4,ror#19
1581         eor     w15,w8,w8,ror#11
1582         add     v4.4s,v4.4s,v2.4s
1583         add     w7,w7,w12
1584         ror     w11,w11,#6
1585         eor     w14,w8,w9
1586         eor     w15,w15,w8,ror#20
1587         add     w7,w7,w11
1588         ldr     w12,[sp,#48]
1589         and     w13,w13,w14
1590         ror     w15,w15,#2
1591         add     w3,w3,w7
1592         eor     w13,w13,w9
1593         st1     {v4.4s},[x17], #16
1594         ext     v4.16b,v3.16b,v0.16b,#4
1595         add     w6,w6,w12
1596         add     w7,w7,w15
1597         and     w12,w4,w3
1598         bic     w15,w5,w3
1599         ext     v7.16b,v1.16b,v2.16b,#4
1600         eor     w11,w3,w3,ror#5
1601         add     w7,w7,w13
1602         mov     d19,v2.d[1]
1603         orr     w12,w12,w15
1604         eor     w11,w11,w3,ror#19
1605         ushr    v6.4s,v4.4s,#7
1606         eor     w15,w7,w7,ror#11
1607         ushr    v5.4s,v4.4s,#3
1608         add     w6,w6,w12
1609         add     v3.4s,v3.4s,v7.4s
1610         ror     w11,w11,#6
1611         sli     v6.4s,v4.4s,#25
1612         eor     w13,w7,w8
1613         eor     w15,w15,w7,ror#20
1614         ushr    v7.4s,v4.4s,#18
1615         add     w6,w6,w11
1616         ldr     w12,[sp,#52]
1617         and     w14,w14,w13
1618         eor     v5.16b,v5.16b,v6.16b
1619         ror     w15,w15,#2
1620         add     w10,w10,w6
1621         sli     v7.4s,v4.4s,#14
1622         eor     w14,w14,w8
1623         ushr    v16.4s,v19.4s,#17
1624         add     w5,w5,w12
1625         add     w6,w6,w15
1626         and     w12,w3,w10
1627         eor     v5.16b,v5.16b,v7.16b
1628         bic     w15,w4,w10
1629         eor     w11,w10,w10,ror#5
1630         sli     v16.4s,v19.4s,#15
1631         add     w6,w6,w14
1632         orr     w12,w12,w15
1633         ushr    v17.4s,v19.4s,#10
1634         eor     w11,w11,w10,ror#19
1635         eor     w15,w6,w6,ror#11
1636         ushr    v7.4s,v19.4s,#19
1637         add     w5,w5,w12
1638         ror     w11,w11,#6
1639         add     v3.4s,v3.4s,v5.4s
1640         eor     w14,w6,w7
1641         eor     w15,w15,w6,ror#20
1642         sli     v7.4s,v19.4s,#13
1643         add     w5,w5,w11
1644         ldr     w12,[sp,#56]
1645         and     w13,w13,w14
1646         eor     v17.16b,v17.16b,v16.16b
1647         ror     w15,w15,#2
1648         add     w9,w9,w5
1649         eor     w13,w13,w7
1650         eor     v17.16b,v17.16b,v7.16b
1651         add     w4,w4,w12
1652         add     w5,w5,w15
1653         and     w12,w10,w9
1654         add     v3.4s,v3.4s,v17.4s
1655         bic     w15,w3,w9
1656         eor     w11,w9,w9,ror#5
1657         add     w5,w5,w13
1658         ushr    v18.4s,v3.4s,#17
1659         orr     w12,w12,w15
1660         ushr    v19.4s,v3.4s,#10
1661         eor     w11,w11,w9,ror#19
1662         eor     w15,w5,w5,ror#11
1663         sli     v18.4s,v3.4s,#15
1664         add     w4,w4,w12
1665         ushr    v17.4s,v3.4s,#19
1666         ror     w11,w11,#6
1667         eor     w13,w5,w6
1668         eor     v19.16b,v19.16b,v18.16b
1669         eor     w15,w15,w5,ror#20
1670         add     w4,w4,w11
1671         sli     v17.4s,v3.4s,#13
1672         ldr     w12,[sp,#60]
1673         and     w14,w14,w13
1674         ror     w15,w15,#2
1675         ld1     {v4.4s},[x16], #16
1676         add     w8,w8,w4
1677         eor     v19.16b,v19.16b,v17.16b
1678         eor     w14,w14,w6
1679         eor     v17.16b,v17.16b,v17.16b
1680         add     w3,w3,w12
1681         add     w4,w4,w15
1682         and     w12,w9,w8
1683         mov     v17.d[1],v19.d[0]
1684         bic     w15,w10,w8
1685         eor     w11,w8,w8,ror#5
1686         add     w4,w4,w14
1687         add     v3.4s,v3.4s,v17.4s
1688         orr     w12,w12,w15
1689         eor     w11,w11,w8,ror#19
1690         eor     w15,w4,w4,ror#11
1691         add     v4.4s,v4.4s,v3.4s
1692         add     w3,w3,w12
1693         ror     w11,w11,#6
1694         eor     w14,w4,w5
1695         eor     w15,w15,w4,ror#20
1696         add     w3,w3,w11
1697         ldr     w12,[x16]
1698         and     w13,w13,w14
1699         ror     w15,w15,#2
1700         add     w7,w7,w3
1701         eor     w13,w13,w5
1702         st1     {v4.4s},[x17], #16
1703         cmp     w12,#0                          // check for K256 terminator
1704         ldr     w12,[sp,#0]
1705         sub     x17,x17,#64
1706         bne     .L_00_48
1707
1708         sub     x16,x16,#256            // rewind x16
1709         cmp     x1,x2
1710         mov     x17, #64
1711         csel    x17, x17, xzr, eq
1712         sub     x1,x1,x17                       // avoid SEGV
1713         mov     x17,sp
1714         add     w10,w10,w12
1715         add     w3,w3,w15
1716         and     w12,w8,w7
1717         ld1     {v0.16b},[x1],#16
1718         bic     w15,w9,w7
1719         eor     w11,w7,w7,ror#5
1720         ld1     {v4.4s},[x16],#16
1721         add     w3,w3,w13
1722         orr     w12,w12,w15
1723         eor     w11,w11,w7,ror#19
1724         eor     w15,w3,w3,ror#11
1725         rev32   v0.16b,v0.16b
1726         add     w10,w10,w12
1727         ror     w11,w11,#6
1728         eor     w13,w3,w4
1729         eor     w15,w15,w3,ror#20
1730         add     v4.4s,v4.4s,v0.4s
1731         add     w10,w10,w11
1732         ldr     w12,[sp,#4]
1733         and     w14,w14,w13
1734         ror     w15,w15,#2
1735         add     w6,w6,w10
1736         eor     w14,w14,w4
1737         add     w9,w9,w12
1738         add     w10,w10,w15
1739         and     w12,w7,w6
1740         bic     w15,w8,w6
1741         eor     w11,w6,w6,ror#5
1742         add     w10,w10,w14
1743         orr     w12,w12,w15
1744         eor     w11,w11,w6,ror#19
1745         eor     w15,w10,w10,ror#11
1746         add     w9,w9,w12
1747         ror     w11,w11,#6
1748         eor     w14,w10,w3
1749         eor     w15,w15,w10,ror#20
1750         add     w9,w9,w11
1751         ldr     w12,[sp,#8]
1752         and     w13,w13,w14
1753         ror     w15,w15,#2
1754         add     w5,w5,w9
1755         eor     w13,w13,w3
1756         add     w8,w8,w12
1757         add     w9,w9,w15
1758         and     w12,w6,w5
1759         bic     w15,w7,w5
1760         eor     w11,w5,w5,ror#5
1761         add     w9,w9,w13
1762         orr     w12,w12,w15
1763         eor     w11,w11,w5,ror#19
1764         eor     w15,w9,w9,ror#11
1765         add     w8,w8,w12
1766         ror     w11,w11,#6
1767         eor     w13,w9,w10
1768         eor     w15,w15,w9,ror#20
1769         add     w8,w8,w11
1770         ldr     w12,[sp,#12]
1771         and     w14,w14,w13
1772         ror     w15,w15,#2
1773         add     w4,w4,w8
1774         eor     w14,w14,w10
1775         add     w7,w7,w12
1776         add     w8,w8,w15
1777         and     w12,w5,w4
1778         bic     w15,w6,w4
1779         eor     w11,w4,w4,ror#5
1780         add     w8,w8,w14
1781         orr     w12,w12,w15
1782         eor     w11,w11,w4,ror#19
1783         eor     w15,w8,w8,ror#11
1784         add     w7,w7,w12
1785         ror     w11,w11,#6
1786         eor     w14,w8,w9
1787         eor     w15,w15,w8,ror#20
1788         add     w7,w7,w11
1789         ldr     w12,[sp,#16]
1790         and     w13,w13,w14
1791         ror     w15,w15,#2
1792         add     w3,w3,w7
1793         eor     w13,w13,w9
1794         st1     {v4.4s},[x17], #16
1795         add     w6,w6,w12
1796         add     w7,w7,w15
1797         and     w12,w4,w3
1798         ld1     {v1.16b},[x1],#16
1799         bic     w15,w5,w3
1800         eor     w11,w3,w3,ror#5
1801         ld1     {v4.4s},[x16],#16
1802         add     w7,w7,w13
1803         orr     w12,w12,w15
1804         eor     w11,w11,w3,ror#19
1805         eor     w15,w7,w7,ror#11
1806         rev32   v1.16b,v1.16b
1807         add     w6,w6,w12
1808         ror     w11,w11,#6
1809         eor     w13,w7,w8
1810         eor     w15,w15,w7,ror#20
1811         add     v4.4s,v4.4s,v1.4s
1812         add     w6,w6,w11
1813         ldr     w12,[sp,#20]
1814         and     w14,w14,w13
1815         ror     w15,w15,#2
1816         add     w10,w10,w6
1817         eor     w14,w14,w8
1818         add     w5,w5,w12
1819         add     w6,w6,w15
1820         and     w12,w3,w10
1821         bic     w15,w4,w10
1822         eor     w11,w10,w10,ror#5
1823         add     w6,w6,w14
1824         orr     w12,w12,w15
1825         eor     w11,w11,w10,ror#19
1826         eor     w15,w6,w6,ror#11
1827         add     w5,w5,w12
1828         ror     w11,w11,#6
1829         eor     w14,w6,w7
1830         eor     w15,w15,w6,ror#20
1831         add     w5,w5,w11
1832         ldr     w12,[sp,#24]
1833         and     w13,w13,w14
1834         ror     w15,w15,#2
1835         add     w9,w9,w5
1836         eor     w13,w13,w7
1837         add     w4,w4,w12
1838         add     w5,w5,w15
1839         and     w12,w10,w9
1840         bic     w15,w3,w9
1841         eor     w11,w9,w9,ror#5
1842         add     w5,w5,w13
1843         orr     w12,w12,w15
1844         eor     w11,w11,w9,ror#19
1845         eor     w15,w5,w5,ror#11
1846         add     w4,w4,w12
1847         ror     w11,w11,#6
1848         eor     w13,w5,w6
1849         eor     w15,w15,w5,ror#20
1850         add     w4,w4,w11
1851         ldr     w12,[sp,#28]
1852         and     w14,w14,w13
1853         ror     w15,w15,#2
1854         add     w8,w8,w4
1855         eor     w14,w14,w6
1856         add     w3,w3,w12
1857         add     w4,w4,w15
1858         and     w12,w9,w8
1859         bic     w15,w10,w8
1860         eor     w11,w8,w8,ror#5
1861         add     w4,w4,w14
1862         orr     w12,w12,w15
1863         eor     w11,w11,w8,ror#19
1864         eor     w15,w4,w4,ror#11
1865         add     w3,w3,w12
1866         ror     w11,w11,#6
1867         eor     w14,w4,w5
1868         eor     w15,w15,w4,ror#20
1869         add     w3,w3,w11
1870         ldr     w12,[sp,#32]
1871         and     w13,w13,w14
1872         ror     w15,w15,#2
1873         add     w7,w7,w3
1874         eor     w13,w13,w5
1875         st1     {v4.4s},[x17], #16
1876         add     w10,w10,w12
1877         add     w3,w3,w15
1878         and     w12,w8,w7
1879         ld1     {v2.16b},[x1],#16
1880         bic     w15,w9,w7
1881         eor     w11,w7,w7,ror#5
1882         ld1     {v4.4s},[x16],#16
1883         add     w3,w3,w13
1884         orr     w12,w12,w15
1885         eor     w11,w11,w7,ror#19
1886         eor     w15,w3,w3,ror#11
1887         rev32   v2.16b,v2.16b
1888         add     w10,w10,w12
1889         ror     w11,w11,#6
1890         eor     w13,w3,w4
1891         eor     w15,w15,w3,ror#20
1892         add     v4.4s,v4.4s,v2.4s
1893         add     w10,w10,w11
1894         ldr     w12,[sp,#36]
1895         and     w14,w14,w13
1896         ror     w15,w15,#2
1897         add     w6,w6,w10
1898         eor     w14,w14,w4
1899         add     w9,w9,w12
1900         add     w10,w10,w15
1901         and     w12,w7,w6
1902         bic     w15,w8,w6
1903         eor     w11,w6,w6,ror#5
1904         add     w10,w10,w14
1905         orr     w12,w12,w15
1906         eor     w11,w11,w6,ror#19
1907         eor     w15,w10,w10,ror#11
1908         add     w9,w9,w12
1909         ror     w11,w11,#6
1910         eor     w14,w10,w3
1911         eor     w15,w15,w10,ror#20
1912         add     w9,w9,w11
1913         ldr     w12,[sp,#40]
1914         and     w13,w13,w14
1915         ror     w15,w15,#2
1916         add     w5,w5,w9
1917         eor     w13,w13,w3
1918         add     w8,w8,w12
1919         add     w9,w9,w15
1920         and     w12,w6,w5
1921         bic     w15,w7,w5
1922         eor     w11,w5,w5,ror#5
1923         add     w9,w9,w13
1924         orr     w12,w12,w15
1925         eor     w11,w11,w5,ror#19
1926         eor     w15,w9,w9,ror#11
1927         add     w8,w8,w12
1928         ror     w11,w11,#6
1929         eor     w13,w9,w10
1930         eor     w15,w15,w9,ror#20
1931         add     w8,w8,w11
1932         ldr     w12,[sp,#44]
1933         and     w14,w14,w13
1934         ror     w15,w15,#2
1935         add     w4,w4,w8
1936         eor     w14,w14,w10
1937         add     w7,w7,w12
1938         add     w8,w8,w15
1939         and     w12,w5,w4
1940         bic     w15,w6,w4
1941         eor     w11,w4,w4,ror#5
1942         add     w8,w8,w14
1943         orr     w12,w12,w15
1944         eor     w11,w11,w4,ror#19
1945         eor     w15,w8,w8,ror#11
1946         add     w7,w7,w12
1947         ror     w11,w11,#6
1948         eor     w14,w8,w9
1949         eor     w15,w15,w8,ror#20
1950         add     w7,w7,w11
1951         ldr     w12,[sp,#48]
1952         and     w13,w13,w14
1953         ror     w15,w15,#2
1954         add     w3,w3,w7
1955         eor     w13,w13,w9
1956         st1     {v4.4s},[x17], #16
1957         add     w6,w6,w12
1958         add     w7,w7,w15
1959         and     w12,w4,w3
1960         ld1     {v3.16b},[x1],#16
1961         bic     w15,w5,w3
1962         eor     w11,w3,w3,ror#5
1963         ld1     {v4.4s},[x16],#16
1964         add     w7,w7,w13
1965         orr     w12,w12,w15
1966         eor     w11,w11,w3,ror#19
1967         eor     w15,w7,w7,ror#11
1968         rev32   v3.16b,v3.16b
1969         add     w6,w6,w12
1970         ror     w11,w11,#6
1971         eor     w13,w7,w8
1972         eor     w15,w15,w7,ror#20
1973         add     v4.4s,v4.4s,v3.4s
1974         add     w6,w6,w11
1975         ldr     w12,[sp,#52]
1976         and     w14,w14,w13
1977         ror     w15,w15,#2
1978         add     w10,w10,w6
1979         eor     w14,w14,w8
1980         add     w5,w5,w12
1981         add     w6,w6,w15
1982         and     w12,w3,w10
1983         bic     w15,w4,w10
1984         eor     w11,w10,w10,ror#5
1985         add     w6,w6,w14
1986         orr     w12,w12,w15
1987         eor     w11,w11,w10,ror#19
1988         eor     w15,w6,w6,ror#11
1989         add     w5,w5,w12
1990         ror     w11,w11,#6
1991         eor     w14,w6,w7
1992         eor     w15,w15,w6,ror#20
1993         add     w5,w5,w11
1994         ldr     w12,[sp,#56]
1995         and     w13,w13,w14
1996         ror     w15,w15,#2
1997         add     w9,w9,w5
1998         eor     w13,w13,w7
1999         add     w4,w4,w12
2000         add     w5,w5,w15
2001         and     w12,w10,w9
2002         bic     w15,w3,w9
2003         eor     w11,w9,w9,ror#5
2004         add     w5,w5,w13
2005         orr     w12,w12,w15
2006         eor     w11,w11,w9,ror#19
2007         eor     w15,w5,w5,ror#11
2008         add     w4,w4,w12
2009         ror     w11,w11,#6
2010         eor     w13,w5,w6
2011         eor     w15,w15,w5,ror#20
2012         add     w4,w4,w11
2013         ldr     w12,[sp,#60]
2014         and     w14,w14,w13
2015         ror     w15,w15,#2
2016         add     w8,w8,w4
2017         eor     w14,w14,w6
2018         add     w3,w3,w12
2019         add     w4,w4,w15
2020         and     w12,w9,w8
2021         bic     w15,w10,w8
2022         eor     w11,w8,w8,ror#5
2023         add     w4,w4,w14
2024         orr     w12,w12,w15
2025         eor     w11,w11,w8,ror#19
2026         eor     w15,w4,w4,ror#11
2027         add     w3,w3,w12
2028         ror     w11,w11,#6
2029         eor     w14,w4,w5
2030         eor     w15,w15,w4,ror#20
2031         add     w3,w3,w11
2032         and     w13,w13,w14
2033         ror     w15,w15,#2
2034         add     w7,w7,w3
2035         eor     w13,w13,w5
2036         st1     {v4.4s},[x17], #16
2037         add     w3,w3,w15                       // h+=Sigma0(a) from the past
2038         ldp     w11,w12,[x0,#0]
2039         add     w3,w3,w13                       // h+=Maj(a,b,c) from the past
2040         ldp     w13,w14,[x0,#8]
2041         add     w3,w3,w11                       // accumulate
2042         add     w4,w4,w12
2043         ldp     w11,w12,[x0,#16]
2044         add     w5,w5,w13
2045         add     w6,w6,w14
2046         ldp     w13,w14,[x0,#24]
2047         add     w7,w7,w11
2048         add     w8,w8,w12
2049         ldr     w12,[sp,#0]
2050         stp     w3,w4,[x0,#0]
2051         add     w9,w9,w13
2052         mov     w13,wzr
2053         stp     w5,w6,[x0,#8]
2054         add     w10,w10,w14
2055         stp     w7,w8,[x0,#16]
2056         eor     w14,w4,w5
2057         stp     w9,w10,[x0,#24]
2058         mov     w15,wzr
2059         mov     x17,sp
2060         b.ne    .L_00_48
2061
2062         ldr     x29,[x29]
2063         add     sp,sp,#16*4+16
2064         ret
2065 .size   sha256_block_neon,.-sha256_block_neon