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