blob: 43811dd867d28409a5bafd4573271d3c5eb4cb86 [file] [log] [blame]
Robert Sloan8ff03552017-06-14 12:40:58 -07001// 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#ifndef __KERNEL__
41# include <openssl/arm_arch.h>
42#endif
43
44.text
45
46
47.globl _sha256_block_data_order
48.private_extern _sha256_block_data_order
49
50.align 6
51_sha256_block_data_order:
52#ifndef __KERNEL__
53# ifdef __ILP32__
54 ldrsw x16,LOPENSSL_armcap_P
55# else
56 ldr x16,LOPENSSL_armcap_P
57# endif
58 adr x17,LOPENSSL_armcap_P
59 add x16,x16,x17
60 ldr w16,[x16]
61 tst w16,#ARMV8_SHA256
62 b.ne Lv8_entry
63#endif
64 stp x29,x30,[sp,#-128]!
65 add x29,sp,#0
66
67 stp x19,x20,[sp,#16]
68 stp x21,x22,[sp,#32]
69 stp x23,x24,[sp,#48]
70 stp x25,x26,[sp,#64]
71 stp x27,x28,[sp,#80]
72 sub sp,sp,#4*4
73
74 ldp w20,w21,[x0] // load context
75 ldp w22,w23,[x0,#2*4]
76 ldp w24,w25,[x0,#4*4]
77 add x2,x1,x2,lsl#6 // end of input
78 ldp w26,w27,[x0,#6*4]
79 adr x30,LK256
80 stp x0,x2,[x29,#96]
81
82Loop:
83 ldp w3,w4,[x1],#2*4
84 ldr w19,[x30],#4 // *K++
85 eor w28,w21,w22 // magic seed
86 str x1,[x29,#112]
87#ifndef __ARMEB__
88 rev w3,w3 // 0
89#endif
90 ror w16,w24,#6
91 add w27,w27,w19 // h+=K[i]
92 eor w6,w24,w24,ror#14
93 and w17,w25,w24
94 bic w19,w26,w24
95 add w27,w27,w3 // h+=X[i]
96 orr w17,w17,w19 // Ch(e,f,g)
97 eor w19,w20,w21 // a^b, b^c in next round
98 eor w16,w16,w6,ror#11 // Sigma1(e)
99 ror w6,w20,#2
100 add w27,w27,w17 // h+=Ch(e,f,g)
101 eor w17,w20,w20,ror#9
102 add w27,w27,w16 // h+=Sigma1(e)
103 and w28,w28,w19 // (b^c)&=(a^b)
104 add w23,w23,w27 // d+=h
105 eor w28,w28,w21 // Maj(a,b,c)
106 eor w17,w6,w17,ror#13 // Sigma0(a)
107 add w27,w27,w28 // h+=Maj(a,b,c)
108 ldr w28,[x30],#4 // *K++, w19 in next round
109 //add w27,w27,w17 // h+=Sigma0(a)
110#ifndef __ARMEB__
111 rev w4,w4 // 1
112#endif
113 ldp w5,w6,[x1],#2*4
114 add w27,w27,w17 // h+=Sigma0(a)
115 ror w16,w23,#6
116 add w26,w26,w28 // h+=K[i]
117 eor w7,w23,w23,ror#14
118 and w17,w24,w23
119 bic w28,w25,w23
120 add w26,w26,w4 // h+=X[i]
121 orr w17,w17,w28 // Ch(e,f,g)
122 eor w28,w27,w20 // a^b, b^c in next round
123 eor w16,w16,w7,ror#11 // Sigma1(e)
124 ror w7,w27,#2
125 add w26,w26,w17 // h+=Ch(e,f,g)
126 eor w17,w27,w27,ror#9
127 add w26,w26,w16 // h+=Sigma1(e)
128 and w19,w19,w28 // (b^c)&=(a^b)
129 add w22,w22,w26 // d+=h
130 eor w19,w19,w20 // Maj(a,b,c)
131 eor w17,w7,w17,ror#13 // Sigma0(a)
132 add w26,w26,w19 // h+=Maj(a,b,c)
133 ldr w19,[x30],#4 // *K++, w28 in next round
134 //add w26,w26,w17 // h+=Sigma0(a)
135#ifndef __ARMEB__
136 rev w5,w5 // 2
137#endif
138 add w26,w26,w17 // h+=Sigma0(a)
139 ror w16,w22,#6
140 add w25,w25,w19 // h+=K[i]
141 eor w8,w22,w22,ror#14
142 and w17,w23,w22
143 bic w19,w24,w22
144 add w25,w25,w5 // h+=X[i]
145 orr w17,w17,w19 // Ch(e,f,g)
146 eor w19,w26,w27 // a^b, b^c in next round
147 eor w16,w16,w8,ror#11 // Sigma1(e)
148 ror w8,w26,#2
149 add w25,w25,w17 // h+=Ch(e,f,g)
150 eor w17,w26,w26,ror#9
151 add w25,w25,w16 // h+=Sigma1(e)
152 and w28,w28,w19 // (b^c)&=(a^b)
153 add w21,w21,w25 // d+=h
154 eor w28,w28,w27 // Maj(a,b,c)
155 eor w17,w8,w17,ror#13 // Sigma0(a)
156 add w25,w25,w28 // h+=Maj(a,b,c)
157 ldr w28,[x30],#4 // *K++, w19 in next round
158 //add w25,w25,w17 // h+=Sigma0(a)
159#ifndef __ARMEB__
160 rev w6,w6 // 3
161#endif
162 ldp w7,w8,[x1],#2*4
163 add w25,w25,w17 // h+=Sigma0(a)
164 ror w16,w21,#6
165 add w24,w24,w28 // h+=K[i]
166 eor w9,w21,w21,ror#14
167 and w17,w22,w21
168 bic w28,w23,w21
169 add w24,w24,w6 // h+=X[i]
170 orr w17,w17,w28 // Ch(e,f,g)
171 eor w28,w25,w26 // a^b, b^c in next round
172 eor w16,w16,w9,ror#11 // Sigma1(e)
173 ror w9,w25,#2
174 add w24,w24,w17 // h+=Ch(e,f,g)
175 eor w17,w25,w25,ror#9
176 add w24,w24,w16 // h+=Sigma1(e)
177 and w19,w19,w28 // (b^c)&=(a^b)
178 add w20,w20,w24 // d+=h
179 eor w19,w19,w26 // Maj(a,b,c)
180 eor w17,w9,w17,ror#13 // Sigma0(a)
181 add w24,w24,w19 // h+=Maj(a,b,c)
182 ldr w19,[x30],#4 // *K++, w28 in next round
183 //add w24,w24,w17 // h+=Sigma0(a)
184#ifndef __ARMEB__
185 rev w7,w7 // 4
186#endif
187 add w24,w24,w17 // h+=Sigma0(a)
188 ror w16,w20,#6
189 add w23,w23,w19 // h+=K[i]
190 eor w10,w20,w20,ror#14
191 and w17,w21,w20
192 bic w19,w22,w20
193 add w23,w23,w7 // h+=X[i]
194 orr w17,w17,w19 // Ch(e,f,g)
195 eor w19,w24,w25 // a^b, b^c in next round
196 eor w16,w16,w10,ror#11 // Sigma1(e)
197 ror w10,w24,#2
198 add w23,w23,w17 // h+=Ch(e,f,g)
199 eor w17,w24,w24,ror#9
200 add w23,w23,w16 // h+=Sigma1(e)
201 and w28,w28,w19 // (b^c)&=(a^b)
202 add w27,w27,w23 // d+=h
203 eor w28,w28,w25 // Maj(a,b,c)
204 eor w17,w10,w17,ror#13 // Sigma0(a)
205 add w23,w23,w28 // h+=Maj(a,b,c)
206 ldr w28,[x30],#4 // *K++, w19 in next round
207 //add w23,w23,w17 // h+=Sigma0(a)
208#ifndef __ARMEB__
209 rev w8,w8 // 5
210#endif
211 ldp w9,w10,[x1],#2*4
212 add w23,w23,w17 // h+=Sigma0(a)
213 ror w16,w27,#6
214 add w22,w22,w28 // h+=K[i]
215 eor w11,w27,w27,ror#14
216 and w17,w20,w27
217 bic w28,w21,w27
218 add w22,w22,w8 // h+=X[i]
219 orr w17,w17,w28 // Ch(e,f,g)
220 eor w28,w23,w24 // a^b, b^c in next round
221 eor w16,w16,w11,ror#11 // Sigma1(e)
222 ror w11,w23,#2
223 add w22,w22,w17 // h+=Ch(e,f,g)
224 eor w17,w23,w23,ror#9
225 add w22,w22,w16 // h+=Sigma1(e)
226 and w19,w19,w28 // (b^c)&=(a^b)
227 add w26,w26,w22 // d+=h
228 eor w19,w19,w24 // Maj(a,b,c)
229 eor w17,w11,w17,ror#13 // Sigma0(a)
230 add w22,w22,w19 // h+=Maj(a,b,c)
231 ldr w19,[x30],#4 // *K++, w28 in next round
232 //add w22,w22,w17 // h+=Sigma0(a)
233#ifndef __ARMEB__
234 rev w9,w9 // 6
235#endif
236 add w22,w22,w17 // h+=Sigma0(a)
237 ror w16,w26,#6
238 add w21,w21,w19 // h+=K[i]
239 eor w12,w26,w26,ror#14
240 and w17,w27,w26
241 bic w19,w20,w26
242 add w21,w21,w9 // h+=X[i]
243 orr w17,w17,w19 // Ch(e,f,g)
244 eor w19,w22,w23 // a^b, b^c in next round
245 eor w16,w16,w12,ror#11 // Sigma1(e)
246 ror w12,w22,#2
247 add w21,w21,w17 // h+=Ch(e,f,g)
248 eor w17,w22,w22,ror#9
249 add w21,w21,w16 // h+=Sigma1(e)
250 and w28,w28,w19 // (b^c)&=(a^b)
251 add w25,w25,w21 // d+=h
252 eor w28,w28,w23 // Maj(a,b,c)
253 eor w17,w12,w17,ror#13 // Sigma0(a)
254 add w21,w21,w28 // h+=Maj(a,b,c)
255 ldr w28,[x30],#4 // *K++, w19 in next round
256 //add w21,w21,w17 // h+=Sigma0(a)
257#ifndef __ARMEB__
258 rev w10,w10 // 7
259#endif
260 ldp w11,w12,[x1],#2*4
261 add w21,w21,w17 // h+=Sigma0(a)
262 ror w16,w25,#6
263 add w20,w20,w28 // h+=K[i]
264 eor w13,w25,w25,ror#14
265 and w17,w26,w25
266 bic w28,w27,w25
267 add w20,w20,w10 // h+=X[i]
268 orr w17,w17,w28 // Ch(e,f,g)
269 eor w28,w21,w22 // a^b, b^c in next round
270 eor w16,w16,w13,ror#11 // Sigma1(e)
271 ror w13,w21,#2
272 add w20,w20,w17 // h+=Ch(e,f,g)
273 eor w17,w21,w21,ror#9
274 add w20,w20,w16 // h+=Sigma1(e)
275 and w19,w19,w28 // (b^c)&=(a^b)
276 add w24,w24,w20 // d+=h
277 eor w19,w19,w22 // Maj(a,b,c)
278 eor w17,w13,w17,ror#13 // Sigma0(a)
279 add w20,w20,w19 // h+=Maj(a,b,c)
280 ldr w19,[x30],#4 // *K++, w28 in next round
281 //add w20,w20,w17 // h+=Sigma0(a)
282#ifndef __ARMEB__
283 rev w11,w11 // 8
284#endif
285 add w20,w20,w17 // h+=Sigma0(a)
286 ror w16,w24,#6
287 add w27,w27,w19 // h+=K[i]
288 eor w14,w24,w24,ror#14
289 and w17,w25,w24
290 bic w19,w26,w24
291 add w27,w27,w11 // h+=X[i]
292 orr w17,w17,w19 // Ch(e,f,g)
293 eor w19,w20,w21 // a^b, b^c in next round
294 eor w16,w16,w14,ror#11 // Sigma1(e)
295 ror w14,w20,#2
296 add w27,w27,w17 // h+=Ch(e,f,g)
297 eor w17,w20,w20,ror#9
298 add w27,w27,w16 // h+=Sigma1(e)
299 and w28,w28,w19 // (b^c)&=(a^b)
300 add w23,w23,w27 // d+=h
301 eor w28,w28,w21 // Maj(a,b,c)
302 eor w17,w14,w17,ror#13 // Sigma0(a)
303 add w27,w27,w28 // h+=Maj(a,b,c)
304 ldr w28,[x30],#4 // *K++, w19 in next round
305 //add w27,w27,w17 // h+=Sigma0(a)
306#ifndef __ARMEB__
307 rev w12,w12 // 9
308#endif
309 ldp w13,w14,[x1],#2*4
310 add w27,w27,w17 // h+=Sigma0(a)
311 ror w16,w23,#6
312 add w26,w26,w28 // h+=K[i]
313 eor w15,w23,w23,ror#14
314 and w17,w24,w23
315 bic w28,w25,w23
316 add w26,w26,w12 // h+=X[i]
317 orr w17,w17,w28 // Ch(e,f,g)
318 eor w28,w27,w20 // a^b, b^c in next round
319 eor w16,w16,w15,ror#11 // Sigma1(e)
320 ror w15,w27,#2
321 add w26,w26,w17 // h+=Ch(e,f,g)
322 eor w17,w27,w27,ror#9
323 add w26,w26,w16 // h+=Sigma1(e)
324 and w19,w19,w28 // (b^c)&=(a^b)
325 add w22,w22,w26 // d+=h
326 eor w19,w19,w20 // Maj(a,b,c)
327 eor w17,w15,w17,ror#13 // Sigma0(a)
328 add w26,w26,w19 // h+=Maj(a,b,c)
329 ldr w19,[x30],#4 // *K++, w28 in next round
330 //add w26,w26,w17 // h+=Sigma0(a)
331#ifndef __ARMEB__
332 rev w13,w13 // 10
333#endif
334 add w26,w26,w17 // h+=Sigma0(a)
335 ror w16,w22,#6
336 add w25,w25,w19 // h+=K[i]
337 eor w0,w22,w22,ror#14
338 and w17,w23,w22
339 bic w19,w24,w22
340 add w25,w25,w13 // h+=X[i]
341 orr w17,w17,w19 // Ch(e,f,g)
342 eor w19,w26,w27 // a^b, b^c in next round
343 eor w16,w16,w0,ror#11 // Sigma1(e)
344 ror w0,w26,#2
345 add w25,w25,w17 // h+=Ch(e,f,g)
346 eor w17,w26,w26,ror#9
347 add w25,w25,w16 // h+=Sigma1(e)
348 and w28,w28,w19 // (b^c)&=(a^b)
349 add w21,w21,w25 // d+=h
350 eor w28,w28,w27 // Maj(a,b,c)
351 eor w17,w0,w17,ror#13 // Sigma0(a)
352 add w25,w25,w28 // h+=Maj(a,b,c)
353 ldr w28,[x30],#4 // *K++, w19 in next round
354 //add w25,w25,w17 // h+=Sigma0(a)
355#ifndef __ARMEB__
356 rev w14,w14 // 11
357#endif
358 ldp w15,w0,[x1],#2*4
359 add w25,w25,w17 // h+=Sigma0(a)
360 str w6,[sp,#12]
361 ror w16,w21,#6
362 add w24,w24,w28 // h+=K[i]
363 eor w6,w21,w21,ror#14
364 and w17,w22,w21
365 bic w28,w23,w21
366 add w24,w24,w14 // h+=X[i]
367 orr w17,w17,w28 // Ch(e,f,g)
368 eor w28,w25,w26 // a^b, b^c in next round
369 eor w16,w16,w6,ror#11 // Sigma1(e)
370 ror w6,w25,#2
371 add w24,w24,w17 // h+=Ch(e,f,g)
372 eor w17,w25,w25,ror#9
373 add w24,w24,w16 // h+=Sigma1(e)
374 and w19,w19,w28 // (b^c)&=(a^b)
375 add w20,w20,w24 // d+=h
376 eor w19,w19,w26 // Maj(a,b,c)
377 eor w17,w6,w17,ror#13 // Sigma0(a)
378 add w24,w24,w19 // h+=Maj(a,b,c)
379 ldr w19,[x30],#4 // *K++, w28 in next round
380 //add w24,w24,w17 // h+=Sigma0(a)
381#ifndef __ARMEB__
382 rev w15,w15 // 12
383#endif
384 add w24,w24,w17 // h+=Sigma0(a)
385 str w7,[sp,#0]
386 ror w16,w20,#6
387 add w23,w23,w19 // h+=K[i]
388 eor w7,w20,w20,ror#14
389 and w17,w21,w20
390 bic w19,w22,w20
391 add w23,w23,w15 // h+=X[i]
392 orr w17,w17,w19 // Ch(e,f,g)
393 eor w19,w24,w25 // a^b, b^c in next round
394 eor w16,w16,w7,ror#11 // Sigma1(e)
395 ror w7,w24,#2
396 add w23,w23,w17 // h+=Ch(e,f,g)
397 eor w17,w24,w24,ror#9
398 add w23,w23,w16 // h+=Sigma1(e)
399 and w28,w28,w19 // (b^c)&=(a^b)
400 add w27,w27,w23 // d+=h
401 eor w28,w28,w25 // Maj(a,b,c)
402 eor w17,w7,w17,ror#13 // Sigma0(a)
403 add w23,w23,w28 // h+=Maj(a,b,c)
404 ldr w28,[x30],#4 // *K++, w19 in next round
405 //add w23,w23,w17 // h+=Sigma0(a)
406#ifndef __ARMEB__
407 rev w0,w0 // 13
408#endif
409 ldp w1,w2,[x1]
410 add w23,w23,w17 // h+=Sigma0(a)
411 str w8,[sp,#4]
412 ror w16,w27,#6
413 add w22,w22,w28 // h+=K[i]
414 eor w8,w27,w27,ror#14
415 and w17,w20,w27
416 bic w28,w21,w27
417 add w22,w22,w0 // h+=X[i]
418 orr w17,w17,w28 // Ch(e,f,g)
419 eor w28,w23,w24 // a^b, b^c in next round
420 eor w16,w16,w8,ror#11 // Sigma1(e)
421 ror w8,w23,#2
422 add w22,w22,w17 // h+=Ch(e,f,g)
423 eor w17,w23,w23,ror#9
424 add w22,w22,w16 // h+=Sigma1(e)
425 and w19,w19,w28 // (b^c)&=(a^b)
426 add w26,w26,w22 // d+=h
427 eor w19,w19,w24 // Maj(a,b,c)
428 eor w17,w8,w17,ror#13 // Sigma0(a)
429 add w22,w22,w19 // h+=Maj(a,b,c)
430 ldr w19,[x30],#4 // *K++, w28 in next round
431 //add w22,w22,w17 // h+=Sigma0(a)
432#ifndef __ARMEB__
433 rev w1,w1 // 14
434#endif
435 ldr w6,[sp,#12]
436 add w22,w22,w17 // h+=Sigma0(a)
437 str w9,[sp,#8]
438 ror w16,w26,#6
439 add w21,w21,w19 // h+=K[i]
440 eor w9,w26,w26,ror#14
441 and w17,w27,w26
442 bic w19,w20,w26
443 add w21,w21,w1 // h+=X[i]
444 orr w17,w17,w19 // Ch(e,f,g)
445 eor w19,w22,w23 // a^b, b^c in next round
446 eor w16,w16,w9,ror#11 // Sigma1(e)
447 ror w9,w22,#2
448 add w21,w21,w17 // h+=Ch(e,f,g)
449 eor w17,w22,w22,ror#9
450 add w21,w21,w16 // h+=Sigma1(e)
451 and w28,w28,w19 // (b^c)&=(a^b)
452 add w25,w25,w21 // d+=h
453 eor w28,w28,w23 // Maj(a,b,c)
454 eor w17,w9,w17,ror#13 // Sigma0(a)
455 add w21,w21,w28 // h+=Maj(a,b,c)
456 ldr w28,[x30],#4 // *K++, w19 in next round
457 //add w21,w21,w17 // h+=Sigma0(a)
458#ifndef __ARMEB__
459 rev w2,w2 // 15
460#endif
461 ldr w7,[sp,#0]
462 add w21,w21,w17 // h+=Sigma0(a)
463 str w10,[sp,#12]
464 ror w16,w25,#6
465 add w20,w20,w28 // h+=K[i]
466 ror w9,w4,#7
467 and w17,w26,w25
468 ror w8,w1,#17
469 bic w28,w27,w25
470 ror w10,w21,#2
471 add w20,w20,w2 // h+=X[i]
472 eor w16,w16,w25,ror#11
473 eor w9,w9,w4,ror#18
474 orr w17,w17,w28 // Ch(e,f,g)
475 eor w28,w21,w22 // a^b, b^c in next round
476 eor w16,w16,w25,ror#25 // Sigma1(e)
477 eor w10,w10,w21,ror#13
478 add w20,w20,w17 // h+=Ch(e,f,g)
479 and w19,w19,w28 // (b^c)&=(a^b)
480 eor w8,w8,w1,ror#19
481 eor w9,w9,w4,lsr#3 // sigma0(X[i+1])
482 add w20,w20,w16 // h+=Sigma1(e)
483 eor w19,w19,w22 // Maj(a,b,c)
484 eor w17,w10,w21,ror#22 // Sigma0(a)
485 eor w8,w8,w1,lsr#10 // sigma1(X[i+14])
486 add w3,w3,w12
487 add w24,w24,w20 // d+=h
488 add w20,w20,w19 // h+=Maj(a,b,c)
489 ldr w19,[x30],#4 // *K++, w28 in next round
490 add w3,w3,w9
491 add w20,w20,w17 // h+=Sigma0(a)
492 add w3,w3,w8
493Loop_16_xx:
494 ldr w8,[sp,#4]
495 str w11,[sp,#0]
496 ror w16,w24,#6
497 add w27,w27,w19 // h+=K[i]
498 ror w10,w5,#7
499 and w17,w25,w24
500 ror w9,w2,#17
501 bic w19,w26,w24
502 ror w11,w20,#2
503 add w27,w27,w3 // h+=X[i]
504 eor w16,w16,w24,ror#11
505 eor w10,w10,w5,ror#18
506 orr w17,w17,w19 // Ch(e,f,g)
507 eor w19,w20,w21 // a^b, b^c in next round
508 eor w16,w16,w24,ror#25 // Sigma1(e)
509 eor w11,w11,w20,ror#13
510 add w27,w27,w17 // h+=Ch(e,f,g)
511 and w28,w28,w19 // (b^c)&=(a^b)
512 eor w9,w9,w2,ror#19
513 eor w10,w10,w5,lsr#3 // sigma0(X[i+1])
514 add w27,w27,w16 // h+=Sigma1(e)
515 eor w28,w28,w21 // Maj(a,b,c)
516 eor w17,w11,w20,ror#22 // Sigma0(a)
517 eor w9,w9,w2,lsr#10 // sigma1(X[i+14])
518 add w4,w4,w13
519 add w23,w23,w27 // d+=h
520 add w27,w27,w28 // h+=Maj(a,b,c)
521 ldr w28,[x30],#4 // *K++, w19 in next round
522 add w4,w4,w10
523 add w27,w27,w17 // h+=Sigma0(a)
524 add w4,w4,w9
525 ldr w9,[sp,#8]
526 str w12,[sp,#4]
527 ror w16,w23,#6
528 add w26,w26,w28 // h+=K[i]
529 ror w11,w6,#7
530 and w17,w24,w23
531 ror w10,w3,#17
532 bic w28,w25,w23
533 ror w12,w27,#2
534 add w26,w26,w4 // h+=X[i]
535 eor w16,w16,w23,ror#11
536 eor w11,w11,w6,ror#18
537 orr w17,w17,w28 // Ch(e,f,g)
538 eor w28,w27,w20 // a^b, b^c in next round
539 eor w16,w16,w23,ror#25 // Sigma1(e)
540 eor w12,w12,w27,ror#13
541 add w26,w26,w17 // h+=Ch(e,f,g)
542 and w19,w19,w28 // (b^c)&=(a^b)
543 eor w10,w10,w3,ror#19
544 eor w11,w11,w6,lsr#3 // sigma0(X[i+1])
545 add w26,w26,w16 // h+=Sigma1(e)
546 eor w19,w19,w20 // Maj(a,b,c)
547 eor w17,w12,w27,ror#22 // Sigma0(a)
548 eor w10,w10,w3,lsr#10 // sigma1(X[i+14])
549 add w5,w5,w14
550 add w22,w22,w26 // d+=h
551 add w26,w26,w19 // h+=Maj(a,b,c)
552 ldr w19,[x30],#4 // *K++, w28 in next round
553 add w5,w5,w11
554 add w26,w26,w17 // h+=Sigma0(a)
555 add w5,w5,w10
556 ldr w10,[sp,#12]
557 str w13,[sp,#8]
558 ror w16,w22,#6
559 add w25,w25,w19 // h+=K[i]
560 ror w12,w7,#7
561 and w17,w23,w22
562 ror w11,w4,#17
563 bic w19,w24,w22
564 ror w13,w26,#2
565 add w25,w25,w5 // h+=X[i]
566 eor w16,w16,w22,ror#11
567 eor w12,w12,w7,ror#18
568 orr w17,w17,w19 // Ch(e,f,g)
569 eor w19,w26,w27 // a^b, b^c in next round
570 eor w16,w16,w22,ror#25 // Sigma1(e)
571 eor w13,w13,w26,ror#13
572 add w25,w25,w17 // h+=Ch(e,f,g)
573 and w28,w28,w19 // (b^c)&=(a^b)
574 eor w11,w11,w4,ror#19
575 eor w12,w12,w7,lsr#3 // sigma0(X[i+1])
576 add w25,w25,w16 // h+=Sigma1(e)
577 eor w28,w28,w27 // Maj(a,b,c)
578 eor w17,w13,w26,ror#22 // Sigma0(a)
579 eor w11,w11,w4,lsr#10 // sigma1(X[i+14])
580 add w6,w6,w15
581 add w21,w21,w25 // d+=h
582 add w25,w25,w28 // h+=Maj(a,b,c)
583 ldr w28,[x30],#4 // *K++, w19 in next round
584 add w6,w6,w12
585 add w25,w25,w17 // h+=Sigma0(a)
586 add w6,w6,w11
587 ldr w11,[sp,#0]
588 str w14,[sp,#12]
589 ror w16,w21,#6
590 add w24,w24,w28 // h+=K[i]
591 ror w13,w8,#7
592 and w17,w22,w21
593 ror w12,w5,#17
594 bic w28,w23,w21
595 ror w14,w25,#2
596 add w24,w24,w6 // h+=X[i]
597 eor w16,w16,w21,ror#11
598 eor w13,w13,w8,ror#18
599 orr w17,w17,w28 // Ch(e,f,g)
600 eor w28,w25,w26 // a^b, b^c in next round
601 eor w16,w16,w21,ror#25 // Sigma1(e)
602 eor w14,w14,w25,ror#13
603 add w24,w24,w17 // h+=Ch(e,f,g)
604 and w19,w19,w28 // (b^c)&=(a^b)
605 eor w12,w12,w5,ror#19
606 eor w13,w13,w8,lsr#3 // sigma0(X[i+1])
607 add w24,w24,w16 // h+=Sigma1(e)
608 eor w19,w19,w26 // Maj(a,b,c)
609 eor w17,w14,w25,ror#22 // Sigma0(a)
610 eor w12,w12,w5,lsr#10 // sigma1(X[i+14])
611 add w7,w7,w0
612 add w20,w20,w24 // d+=h
613 add w24,w24,w19 // h+=Maj(a,b,c)
614 ldr w19,[x30],#4 // *K++, w28 in next round
615 add w7,w7,w13
616 add w24,w24,w17 // h+=Sigma0(a)
617 add w7,w7,w12
618 ldr w12,[sp,#4]
619 str w15,[sp,#0]
620 ror w16,w20,#6
621 add w23,w23,w19 // h+=K[i]
622 ror w14,w9,#7
623 and w17,w21,w20
624 ror w13,w6,#17
625 bic w19,w22,w20
626 ror w15,w24,#2
627 add w23,w23,w7 // h+=X[i]
628 eor w16,w16,w20,ror#11
629 eor w14,w14,w9,ror#18
630 orr w17,w17,w19 // Ch(e,f,g)
631 eor w19,w24,w25 // a^b, b^c in next round
632 eor w16,w16,w20,ror#25 // Sigma1(e)
633 eor w15,w15,w24,ror#13
634 add w23,w23,w17 // h+=Ch(e,f,g)
635 and w28,w28,w19 // (b^c)&=(a^b)
636 eor w13,w13,w6,ror#19
637 eor w14,w14,w9,lsr#3 // sigma0(X[i+1])
638 add w23,w23,w16 // h+=Sigma1(e)
639 eor w28,w28,w25 // Maj(a,b,c)
640 eor w17,w15,w24,ror#22 // Sigma0(a)
641 eor w13,w13,w6,lsr#10 // sigma1(X[i+14])
642 add w8,w8,w1
643 add w27,w27,w23 // d+=h
644 add w23,w23,w28 // h+=Maj(a,b,c)
645 ldr w28,[x30],#4 // *K++, w19 in next round
646 add w8,w8,w14
647 add w23,w23,w17 // h+=Sigma0(a)
648 add w8,w8,w13
649 ldr w13,[sp,#8]
650 str w0,[sp,#4]
651 ror w16,w27,#6
652 add w22,w22,w28 // h+=K[i]
653 ror w15,w10,#7
654 and w17,w20,w27
655 ror w14,w7,#17
656 bic w28,w21,w27
657 ror w0,w23,#2
658 add w22,w22,w8 // h+=X[i]
659 eor w16,w16,w27,ror#11
660 eor w15,w15,w10,ror#18
661 orr w17,w17,w28 // Ch(e,f,g)
662 eor w28,w23,w24 // a^b, b^c in next round
663 eor w16,w16,w27,ror#25 // Sigma1(e)
664 eor w0,w0,w23,ror#13
665 add w22,w22,w17 // h+=Ch(e,f,g)
666 and w19,w19,w28 // (b^c)&=(a^b)
667 eor w14,w14,w7,ror#19
668 eor w15,w15,w10,lsr#3 // sigma0(X[i+1])
669 add w22,w22,w16 // h+=Sigma1(e)
670 eor w19,w19,w24 // Maj(a,b,c)
671 eor w17,w0,w23,ror#22 // Sigma0(a)
672 eor w14,w14,w7,lsr#10 // sigma1(X[i+14])
673 add w9,w9,w2
674 add w26,w26,w22 // d+=h
675 add w22,w22,w19 // h+=Maj(a,b,c)
676 ldr w19,[x30],#4 // *K++, w28 in next round
677 add w9,w9,w15
678 add w22,w22,w17 // h+=Sigma0(a)
679 add w9,w9,w14
680 ldr w14,[sp,#12]
681 str w1,[sp,#8]
682 ror w16,w26,#6
683 add w21,w21,w19 // h+=K[i]
684 ror w0,w11,#7
685 and w17,w27,w26
686 ror w15,w8,#17
687 bic w19,w20,w26
688 ror w1,w22,#2
689 add w21,w21,w9 // h+=X[i]
690 eor w16,w16,w26,ror#11
691 eor w0,w0,w11,ror#18
692 orr w17,w17,w19 // Ch(e,f,g)
693 eor w19,w22,w23 // a^b, b^c in next round
694 eor w16,w16,w26,ror#25 // Sigma1(e)
695 eor w1,w1,w22,ror#13
696 add w21,w21,w17 // h+=Ch(e,f,g)
697 and w28,w28,w19 // (b^c)&=(a^b)
698 eor w15,w15,w8,ror#19
699 eor w0,w0,w11,lsr#3 // sigma0(X[i+1])
700 add w21,w21,w16 // h+=Sigma1(e)
701 eor w28,w28,w23 // Maj(a,b,c)
702 eor w17,w1,w22,ror#22 // Sigma0(a)
703 eor w15,w15,w8,lsr#10 // sigma1(X[i+14])
704 add w10,w10,w3
705 add w25,w25,w21 // d+=h
706 add w21,w21,w28 // h+=Maj(a,b,c)
707 ldr w28,[x30],#4 // *K++, w19 in next round
708 add w10,w10,w0
709 add w21,w21,w17 // h+=Sigma0(a)
710 add w10,w10,w15
711 ldr w15,[sp,#0]
712 str w2,[sp,#12]
713 ror w16,w25,#6
714 add w20,w20,w28 // h+=K[i]
715 ror w1,w12,#7
716 and w17,w26,w25
717 ror w0,w9,#17
718 bic w28,w27,w25
719 ror w2,w21,#2
720 add w20,w20,w10 // h+=X[i]
721 eor w16,w16,w25,ror#11
722 eor w1,w1,w12,ror#18
723 orr w17,w17,w28 // Ch(e,f,g)
724 eor w28,w21,w22 // a^b, b^c in next round
725 eor w16,w16,w25,ror#25 // Sigma1(e)
726 eor w2,w2,w21,ror#13
727 add w20,w20,w17 // h+=Ch(e,f,g)
728 and w19,w19,w28 // (b^c)&=(a^b)
729 eor w0,w0,w9,ror#19
730 eor w1,w1,w12,lsr#3 // sigma0(X[i+1])
731 add w20,w20,w16 // h+=Sigma1(e)
732 eor w19,w19,w22 // Maj(a,b,c)
733 eor w17,w2,w21,ror#22 // Sigma0(a)
734 eor w0,w0,w9,lsr#10 // sigma1(X[i+14])
735 add w11,w11,w4
736 add w24,w24,w20 // d+=h
737 add w20,w20,w19 // h+=Maj(a,b,c)
738 ldr w19,[x30],#4 // *K++, w28 in next round
739 add w11,w11,w1
740 add w20,w20,w17 // h+=Sigma0(a)
741 add w11,w11,w0
742 ldr w0,[sp,#4]
743 str w3,[sp,#0]
744 ror w16,w24,#6
745 add w27,w27,w19 // h+=K[i]
746 ror w2,w13,#7
747 and w17,w25,w24
748 ror w1,w10,#17
749 bic w19,w26,w24
750 ror w3,w20,#2
751 add w27,w27,w11 // h+=X[i]
752 eor w16,w16,w24,ror#11
753 eor w2,w2,w13,ror#18
754 orr w17,w17,w19 // Ch(e,f,g)
755 eor w19,w20,w21 // a^b, b^c in next round
756 eor w16,w16,w24,ror#25 // Sigma1(e)
757 eor w3,w3,w20,ror#13
758 add w27,w27,w17 // h+=Ch(e,f,g)
759 and w28,w28,w19 // (b^c)&=(a^b)
760 eor w1,w1,w10,ror#19
761 eor w2,w2,w13,lsr#3 // sigma0(X[i+1])
762 add w27,w27,w16 // h+=Sigma1(e)
763 eor w28,w28,w21 // Maj(a,b,c)
764 eor w17,w3,w20,ror#22 // Sigma0(a)
765 eor w1,w1,w10,lsr#10 // sigma1(X[i+14])
766 add w12,w12,w5
767 add w23,w23,w27 // d+=h
768 add w27,w27,w28 // h+=Maj(a,b,c)
769 ldr w28,[x30],#4 // *K++, w19 in next round
770 add w12,w12,w2
771 add w27,w27,w17 // h+=Sigma0(a)
772 add w12,w12,w1
773 ldr w1,[sp,#8]
774 str w4,[sp,#4]
775 ror w16,w23,#6
776 add w26,w26,w28 // h+=K[i]
777 ror w3,w14,#7
778 and w17,w24,w23
779 ror w2,w11,#17
780 bic w28,w25,w23
781 ror w4,w27,#2
782 add w26,w26,w12 // h+=X[i]
783 eor w16,w16,w23,ror#11
784 eor w3,w3,w14,ror#18
785 orr w17,w17,w28 // Ch(e,f,g)
786 eor w28,w27,w20 // a^b, b^c in next round
787 eor w16,w16,w23,ror#25 // Sigma1(e)
788 eor w4,w4,w27,ror#13
789 add w26,w26,w17 // h+=Ch(e,f,g)
790 and w19,w19,w28 // (b^c)&=(a^b)
791 eor w2,w2,w11,ror#19
792 eor w3,w3,w14,lsr#3 // sigma0(X[i+1])
793 add w26,w26,w16 // h+=Sigma1(e)
794 eor w19,w19,w20 // Maj(a,b,c)
795 eor w17,w4,w27,ror#22 // Sigma0(a)
796 eor w2,w2,w11,lsr#10 // sigma1(X[i+14])
797 add w13,w13,w6
798 add w22,w22,w26 // d+=h
799 add w26,w26,w19 // h+=Maj(a,b,c)
800 ldr w19,[x30],#4 // *K++, w28 in next round
801 add w13,w13,w3
802 add w26,w26,w17 // h+=Sigma0(a)
803 add w13,w13,w2
804 ldr w2,[sp,#12]
805 str w5,[sp,#8]
806 ror w16,w22,#6
807 add w25,w25,w19 // h+=K[i]
808 ror w4,w15,#7
809 and w17,w23,w22
810 ror w3,w12,#17
811 bic w19,w24,w22
812 ror w5,w26,#2
813 add w25,w25,w13 // h+=X[i]
814 eor w16,w16,w22,ror#11
815 eor w4,w4,w15,ror#18
816 orr w17,w17,w19 // Ch(e,f,g)
817 eor w19,w26,w27 // a^b, b^c in next round
818 eor w16,w16,w22,ror#25 // Sigma1(e)
819 eor w5,w5,w26,ror#13
820 add w25,w25,w17 // h+=Ch(e,f,g)
821 and w28,w28,w19 // (b^c)&=(a^b)
822 eor w3,w3,w12,ror#19
823 eor w4,w4,w15,lsr#3 // sigma0(X[i+1])
824 add w25,w25,w16 // h+=Sigma1(e)
825 eor w28,w28,w27 // Maj(a,b,c)
826 eor w17,w5,w26,ror#22 // Sigma0(a)
827 eor w3,w3,w12,lsr#10 // sigma1(X[i+14])
828 add w14,w14,w7
829 add w21,w21,w25 // d+=h
830 add w25,w25,w28 // h+=Maj(a,b,c)
831 ldr w28,[x30],#4 // *K++, w19 in next round
832 add w14,w14,w4
833 add w25,w25,w17 // h+=Sigma0(a)
834 add w14,w14,w3
835 ldr w3,[sp,#0]
836 str w6,[sp,#12]
837 ror w16,w21,#6
838 add w24,w24,w28 // h+=K[i]
839 ror w5,w0,#7
840 and w17,w22,w21
841 ror w4,w13,#17
842 bic w28,w23,w21
843 ror w6,w25,#2
844 add w24,w24,w14 // h+=X[i]
845 eor w16,w16,w21,ror#11
846 eor w5,w5,w0,ror#18
847 orr w17,w17,w28 // Ch(e,f,g)
848 eor w28,w25,w26 // a^b, b^c in next round
849 eor w16,w16,w21,ror#25 // Sigma1(e)
850 eor w6,w6,w25,ror#13
851 add w24,w24,w17 // h+=Ch(e,f,g)
852 and w19,w19,w28 // (b^c)&=(a^b)
853 eor w4,w4,w13,ror#19
854 eor w5,w5,w0,lsr#3 // sigma0(X[i+1])
855 add w24,w24,w16 // h+=Sigma1(e)
856 eor w19,w19,w26 // Maj(a,b,c)
857 eor w17,w6,w25,ror#22 // Sigma0(a)
858 eor w4,w4,w13,lsr#10 // sigma1(X[i+14])
859 add w15,w15,w8
860 add w20,w20,w24 // d+=h
861 add w24,w24,w19 // h+=Maj(a,b,c)
862 ldr w19,[x30],#4 // *K++, w28 in next round
863 add w15,w15,w5
864 add w24,w24,w17 // h+=Sigma0(a)
865 add w15,w15,w4
866 ldr w4,[sp,#4]
867 str w7,[sp,#0]
868 ror w16,w20,#6
869 add w23,w23,w19 // h+=K[i]
870 ror w6,w1,#7
871 and w17,w21,w20
872 ror w5,w14,#17
873 bic w19,w22,w20
874 ror w7,w24,#2
875 add w23,w23,w15 // h+=X[i]
876 eor w16,w16,w20,ror#11
877 eor w6,w6,w1,ror#18
878 orr w17,w17,w19 // Ch(e,f,g)
879 eor w19,w24,w25 // a^b, b^c in next round
880 eor w16,w16,w20,ror#25 // Sigma1(e)
881 eor w7,w7,w24,ror#13
882 add w23,w23,w17 // h+=Ch(e,f,g)
883 and w28,w28,w19 // (b^c)&=(a^b)
884 eor w5,w5,w14,ror#19
885 eor w6,w6,w1,lsr#3 // sigma0(X[i+1])
886 add w23,w23,w16 // h+=Sigma1(e)
887 eor w28,w28,w25 // Maj(a,b,c)
888 eor w17,w7,w24,ror#22 // Sigma0(a)
889 eor w5,w5,w14,lsr#10 // sigma1(X[i+14])
890 add w0,w0,w9
891 add w27,w27,w23 // d+=h
892 add w23,w23,w28 // h+=Maj(a,b,c)
893 ldr w28,[x30],#4 // *K++, w19 in next round
894 add w0,w0,w6
895 add w23,w23,w17 // h+=Sigma0(a)
896 add w0,w0,w5
897 ldr w5,[sp,#8]
898 str w8,[sp,#4]
899 ror w16,w27,#6
900 add w22,w22,w28 // h+=K[i]
901 ror w7,w2,#7
902 and w17,w20,w27
903 ror w6,w15,#17
904 bic w28,w21,w27
905 ror w8,w23,#2
906 add w22,w22,w0 // h+=X[i]
907 eor w16,w16,w27,ror#11
908 eor w7,w7,w2,ror#18
909 orr w17,w17,w28 // Ch(e,f,g)
910 eor w28,w23,w24 // a^b, b^c in next round
911 eor w16,w16,w27,ror#25 // Sigma1(e)
912 eor w8,w8,w23,ror#13
913 add w22,w22,w17 // h+=Ch(e,f,g)
914 and w19,w19,w28 // (b^c)&=(a^b)
915 eor w6,w6,w15,ror#19
916 eor w7,w7,w2,lsr#3 // sigma0(X[i+1])
917 add w22,w22,w16 // h+=Sigma1(e)
918 eor w19,w19,w24 // Maj(a,b,c)
919 eor w17,w8,w23,ror#22 // Sigma0(a)
920 eor w6,w6,w15,lsr#10 // sigma1(X[i+14])
921 add w1,w1,w10
922 add w26,w26,w22 // d+=h
923 add w22,w22,w19 // h+=Maj(a,b,c)
924 ldr w19,[x30],#4 // *K++, w28 in next round
925 add w1,w1,w7
926 add w22,w22,w17 // h+=Sigma0(a)
927 add w1,w1,w6
928 ldr w6,[sp,#12]
929 str w9,[sp,#8]
930 ror w16,w26,#6
931 add w21,w21,w19 // h+=K[i]
932 ror w8,w3,#7
933 and w17,w27,w26
934 ror w7,w0,#17
935 bic w19,w20,w26
936 ror w9,w22,#2
937 add w21,w21,w1 // h+=X[i]
938 eor w16,w16,w26,ror#11
939 eor w8,w8,w3,ror#18
940 orr w17,w17,w19 // Ch(e,f,g)
941 eor w19,w22,w23 // a^b, b^c in next round
942 eor w16,w16,w26,ror#25 // Sigma1(e)
943 eor w9,w9,w22,ror#13
944 add w21,w21,w17 // h+=Ch(e,f,g)
945 and w28,w28,w19 // (b^c)&=(a^b)
946 eor w7,w7,w0,ror#19
947 eor w8,w8,w3,lsr#3 // sigma0(X[i+1])
948 add w21,w21,w16 // h+=Sigma1(e)
949 eor w28,w28,w23 // Maj(a,b,c)
950 eor w17,w9,w22,ror#22 // Sigma0(a)
951 eor w7,w7,w0,lsr#10 // sigma1(X[i+14])
952 add w2,w2,w11
953 add w25,w25,w21 // d+=h
954 add w21,w21,w28 // h+=Maj(a,b,c)
955 ldr w28,[x30],#4 // *K++, w19 in next round
956 add w2,w2,w8
957 add w21,w21,w17 // h+=Sigma0(a)
958 add w2,w2,w7
959 ldr w7,[sp,#0]
960 str w10,[sp,#12]
961 ror w16,w25,#6
962 add w20,w20,w28 // h+=K[i]
963 ror w9,w4,#7
964 and w17,w26,w25
965 ror w8,w1,#17
966 bic w28,w27,w25
967 ror w10,w21,#2
968 add w20,w20,w2 // h+=X[i]
969 eor w16,w16,w25,ror#11
970 eor w9,w9,w4,ror#18
971 orr w17,w17,w28 // Ch(e,f,g)
972 eor w28,w21,w22 // a^b, b^c in next round
973 eor w16,w16,w25,ror#25 // Sigma1(e)
974 eor w10,w10,w21,ror#13
975 add w20,w20,w17 // h+=Ch(e,f,g)
976 and w19,w19,w28 // (b^c)&=(a^b)
977 eor w8,w8,w1,ror#19
978 eor w9,w9,w4,lsr#3 // sigma0(X[i+1])
979 add w20,w20,w16 // h+=Sigma1(e)
980 eor w19,w19,w22 // Maj(a,b,c)
981 eor w17,w10,w21,ror#22 // Sigma0(a)
982 eor w8,w8,w1,lsr#10 // sigma1(X[i+14])
983 add w3,w3,w12
984 add w24,w24,w20 // d+=h
985 add w20,w20,w19 // h+=Maj(a,b,c)
986 ldr w19,[x30],#4 // *K++, w28 in next round
987 add w3,w3,w9
988 add w20,w20,w17 // h+=Sigma0(a)
989 add w3,w3,w8
990 cbnz w19,Loop_16_xx
991
992 ldp x0,x2,[x29,#96]
993 ldr x1,[x29,#112]
994 sub x30,x30,#260 // rewind
995
996 ldp w3,w4,[x0]
997 ldp w5,w6,[x0,#2*4]
998 add x1,x1,#14*4 // advance input pointer
999 ldp w7,w8,[x0,#4*4]
1000 add w20,w20,w3
1001 ldp w9,w10,[x0,#6*4]
1002 add w21,w21,w4
1003 add w22,w22,w5
1004 add w23,w23,w6
1005 stp w20,w21,[x0]
1006 add w24,w24,w7
1007 add w25,w25,w8
1008 stp w22,w23,[x0,#2*4]
1009 add w26,w26,w9
1010 add w27,w27,w10
1011 cmp x1,x2
1012 stp w24,w25,[x0,#4*4]
1013 stp w26,w27,[x0,#6*4]
1014 b.ne Loop
1015
1016 ldp x19,x20,[x29,#16]
1017 add sp,sp,#4*4
1018 ldp x21,x22,[x29,#32]
1019 ldp x23,x24,[x29,#48]
1020 ldp x25,x26,[x29,#64]
1021 ldp x27,x28,[x29,#80]
1022 ldp x29,x30,[sp],#128
1023 ret
1024
1025
1026.align 6
1027
1028LK256:
1029.long 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5
1030.long 0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5
1031.long 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3
1032.long 0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174
1033.long 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc
1034.long 0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da
1035.long 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7
1036.long 0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967
1037.long 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13
1038.long 0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85
1039.long 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3
1040.long 0xd192e819,0xd6990624,0xf40e3585,0x106aa070
1041.long 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5
1042.long 0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3
1043.long 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208
1044.long 0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2
1045.long 0 //terminator
1046
1047#ifndef __KERNEL__
1048.align 3
1049LOPENSSL_armcap_P:
1050# ifdef __ILP32__
1051.long _OPENSSL_armcap_P-.
1052# else
1053.quad _OPENSSL_armcap_P-.
1054# endif
1055#endif
1056.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
1057.align 2
1058.align 2
1059#ifndef __KERNEL__
1060
1061.align 6
1062sha256_block_armv8:
1063Lv8_entry:
1064 stp x29,x30,[sp,#-16]!
1065 add x29,sp,#0
1066
1067 ld1 {v0.4s,v1.4s},[x0]
1068 adr x3,LK256
1069
1070Loop_hw:
1071 ld1 {v4.16b,v5.16b,v6.16b,v7.16b},[x1],#64
1072 sub x2,x2,#1
1073 ld1 {v16.4s},[x3],#16
1074 rev32 v4.16b,v4.16b
1075 rev32 v5.16b,v5.16b
1076 rev32 v6.16b,v6.16b
1077 rev32 v7.16b,v7.16b
1078 orr v18.16b,v0.16b,v0.16b // offload
1079 orr v19.16b,v1.16b,v1.16b
1080 ld1 {v17.4s},[x3],#16
1081 add v16.4s,v16.4s,v4.4s
1082.long 0x5e2828a4 //sha256su0 v4.16b,v5.16b
1083 orr v2.16b,v0.16b,v0.16b
1084.long 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
1085.long 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
1086.long 0x5e0760c4 //sha256su1 v4.16b,v6.16b,v7.16b
1087 ld1 {v16.4s},[x3],#16
1088 add v17.4s,v17.4s,v5.4s
1089.long 0x5e2828c5 //sha256su0 v5.16b,v6.16b
1090 orr v2.16b,v0.16b,v0.16b
1091.long 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
1092.long 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
1093.long 0x5e0460e5 //sha256su1 v5.16b,v7.16b,v4.16b
1094 ld1 {v17.4s},[x3],#16
1095 add v16.4s,v16.4s,v6.4s
1096.long 0x5e2828e6 //sha256su0 v6.16b,v7.16b
1097 orr v2.16b,v0.16b,v0.16b
1098.long 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
1099.long 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
1100.long 0x5e056086 //sha256su1 v6.16b,v4.16b,v5.16b
1101 ld1 {v16.4s},[x3],#16
1102 add v17.4s,v17.4s,v7.4s
1103.long 0x5e282887 //sha256su0 v7.16b,v4.16b
1104 orr v2.16b,v0.16b,v0.16b
1105.long 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
1106.long 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
1107.long 0x5e0660a7 //sha256su1 v7.16b,v5.16b,v6.16b
1108 ld1 {v17.4s},[x3],#16
1109 add v16.4s,v16.4s,v4.4s
1110.long 0x5e2828a4 //sha256su0 v4.16b,v5.16b
1111 orr v2.16b,v0.16b,v0.16b
1112.long 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
1113.long 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
1114.long 0x5e0760c4 //sha256su1 v4.16b,v6.16b,v7.16b
1115 ld1 {v16.4s},[x3],#16
1116 add v17.4s,v17.4s,v5.4s
1117.long 0x5e2828c5 //sha256su0 v5.16b,v6.16b
1118 orr v2.16b,v0.16b,v0.16b
1119.long 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
1120.long 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
1121.long 0x5e0460e5 //sha256su1 v5.16b,v7.16b,v4.16b
1122 ld1 {v17.4s},[x3],#16
1123 add v16.4s,v16.4s,v6.4s
1124.long 0x5e2828e6 //sha256su0 v6.16b,v7.16b
1125 orr v2.16b,v0.16b,v0.16b
1126.long 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
1127.long 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
1128.long 0x5e056086 //sha256su1 v6.16b,v4.16b,v5.16b
1129 ld1 {v16.4s},[x3],#16
1130 add v17.4s,v17.4s,v7.4s
1131.long 0x5e282887 //sha256su0 v7.16b,v4.16b
1132 orr v2.16b,v0.16b,v0.16b
1133.long 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
1134.long 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
1135.long 0x5e0660a7 //sha256su1 v7.16b,v5.16b,v6.16b
1136 ld1 {v17.4s},[x3],#16
1137 add v16.4s,v16.4s,v4.4s
1138.long 0x5e2828a4 //sha256su0 v4.16b,v5.16b
1139 orr v2.16b,v0.16b,v0.16b
1140.long 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
1141.long 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
1142.long 0x5e0760c4 //sha256su1 v4.16b,v6.16b,v7.16b
1143 ld1 {v16.4s},[x3],#16
1144 add v17.4s,v17.4s,v5.4s
1145.long 0x5e2828c5 //sha256su0 v5.16b,v6.16b
1146 orr v2.16b,v0.16b,v0.16b
1147.long 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
1148.long 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
1149.long 0x5e0460e5 //sha256su1 v5.16b,v7.16b,v4.16b
1150 ld1 {v17.4s},[x3],#16
1151 add v16.4s,v16.4s,v6.4s
1152.long 0x5e2828e6 //sha256su0 v6.16b,v7.16b
1153 orr v2.16b,v0.16b,v0.16b
1154.long 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
1155.long 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
1156.long 0x5e056086 //sha256su1 v6.16b,v4.16b,v5.16b
1157 ld1 {v16.4s},[x3],#16
1158 add v17.4s,v17.4s,v7.4s
1159.long 0x5e282887 //sha256su0 v7.16b,v4.16b
1160 orr v2.16b,v0.16b,v0.16b
1161.long 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
1162.long 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
1163.long 0x5e0660a7 //sha256su1 v7.16b,v5.16b,v6.16b
1164 ld1 {v17.4s},[x3],#16
1165 add v16.4s,v16.4s,v4.4s
1166 orr v2.16b,v0.16b,v0.16b
1167.long 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
1168.long 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
1169
1170 ld1 {v16.4s},[x3],#16
1171 add v17.4s,v17.4s,v5.4s
1172 orr v2.16b,v0.16b,v0.16b
1173.long 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
1174.long 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
1175
1176 ld1 {v17.4s},[x3]
1177 add v16.4s,v16.4s,v6.4s
1178 sub x3,x3,#64*4-16 // rewind
1179 orr v2.16b,v0.16b,v0.16b
1180.long 0x5e104020 //sha256h v0.16b,v1.16b,v16.4s
1181.long 0x5e105041 //sha256h2 v1.16b,v2.16b,v16.4s
1182
1183 add v17.4s,v17.4s,v7.4s
1184 orr v2.16b,v0.16b,v0.16b
1185.long 0x5e114020 //sha256h v0.16b,v1.16b,v17.4s
1186.long 0x5e115041 //sha256h2 v1.16b,v2.16b,v17.4s
1187
1188 add v0.4s,v0.4s,v18.4s
1189 add v1.4s,v1.4s,v19.4s
1190
1191 cbnz x2,Loop_hw
1192
1193 st1 {v0.4s,v1.4s},[x0]
1194
1195 ldr x29,[sp],#16
1196 ret
1197
1198#endif
1199#ifndef __KERNEL__
1200.comm _OPENSSL_armcap_P,4,4
1201#endif