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