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