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