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