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