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