blob: 2ea6517ddef73b78ee458fbc3bdfb77965c1ebb2 [file] [log] [blame]
Robert Sloan8ff03552017-06-14 12:40:58 -07001@ Copyright 2007-2016 The OpenSSL Project Authors. All Rights Reserved.
2@
3@ Licensed under the OpenSSL license (the "License"). You may not use
4@ this file except in compliance with the License. You can obtain a copy
5@ in the file LICENSE in the source distribution or at
6@ https://www.openssl.org/source/license.html
7
8
9@ ====================================================================
10@ Written by Andy Polyakov <appro@openssl.org> for the OpenSSL
11@ project. The module is, however, dual licensed under OpenSSL and
12@ CRYPTOGAMS licenses depending on where you obtain it. For further
13@ details see http://www.openssl.org/~appro/cryptogams/.
14@
15@ Permission to use under GPL terms is granted.
16@ ====================================================================
17
18@ SHA256 block procedure for ARMv4. May 2007.
19
20@ Performance is ~2x better than gcc 3.4 generated code and in "abso-
21@ lute" terms is ~2250 cycles per 64-byte block or ~35 cycles per
22@ byte [on single-issue Xscale PXA250 core].
23
24@ July 2010.
25@
26@ Rescheduling for dual-issue pipeline resulted in 22% improvement on
27@ Cortex A8 core and ~20 cycles per processed byte.
28
29@ February 2011.
30@
31@ Profiler-assisted and platform-specific optimization resulted in 16%
32@ improvement on Cortex A8 core and ~15.4 cycles per processed byte.
33
34@ September 2013.
35@
36@ Add NEON implementation. On Cortex A8 it was measured to process one
37@ byte in 12.5 cycles or 23% faster than integer-only code. Snapdragon
38@ S4 does it in 12.5 cycles too, but it's 50% faster than integer-only
39@ code (meaning that latter performs sub-optimally, nothing was done
40@ about it).
41
42@ May 2014.
43@
44@ Add ARMv8 code path performing at 2.0 cpb on Apple A7.
45
46#ifndef __KERNEL__
47# include <openssl/arm_arch.h>
48#else
49# define __ARM_ARCH__ __LINUX_ARM_ARCH__
50# define __ARM_MAX_ARCH__ 7
51#endif
52
53.text
54#if defined(__thumb2__)
55.syntax unified
56.thumb
57#else
58.code 32
59#endif
60
61
62.align 5
63K256:
64.word 0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5
65.word 0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5
66.word 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3
67.word 0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174
68.word 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc
69.word 0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da
70.word 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7
71.word 0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967
72.word 0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13
73.word 0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85
74.word 0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3
75.word 0xd192e819,0xd6990624,0xf40e3585,0x106aa070
76.word 0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5
77.word 0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3
78.word 0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208
79.word 0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2
80
81.word 0 @ terminator
82#if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__)
83LOPENSSL_armcap:
84.word OPENSSL_armcap_P-Lsha256_block_data_order
85#endif
86.align 5
87
88.globl _sha256_block_data_order
89.private_extern _sha256_block_data_order
90#ifdef __thumb2__
91.thumb_func _sha256_block_data_order
92#endif
93_sha256_block_data_order:
94Lsha256_block_data_order:
95#if __ARM_ARCH__<7 && !defined(__thumb2__)
96 sub r3,pc,#8 @ _sha256_block_data_order
97#else
98 adr r3,Lsha256_block_data_order
99#endif
100#if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__)
101 ldr r12,LOPENSSL_armcap
102 ldr r12,[r3,r12] @ OPENSSL_armcap_P
103#ifdef __APPLE__
104 ldr r12,[r12]
105#endif
106 tst r12,#ARMV8_SHA256
107 bne LARMv8
108 tst r12,#ARMV7_NEON
109 bne LNEON
110#endif
111 add r2,r1,r2,lsl#6 @ len to point at the end of inp
112 stmdb sp!,{r0,r1,r2,r4-r11,lr}
113 ldmia r0,{r4,r5,r6,r7,r8,r9,r10,r11}
114 sub r14,r3,#256+32 @ K256
115 sub sp,sp,#16*4 @ alloca(X[16])
116Loop:
117# if __ARM_ARCH__>=7
118 ldr r2,[r1],#4
119# else
120 ldrb r2,[r1,#3]
121# endif
122 eor r3,r5,r6 @ magic
123 eor r12,r12,r12
124#if __ARM_ARCH__>=7
125 @ ldr r2,[r1],#4 @ 0
126# if 0==15
127 str r1,[sp,#17*4] @ make room for r1
128# endif
129 eor r0,r8,r8,ror#5
130 add r4,r4,r12 @ h+=Maj(a,b,c) from the past
131 eor r0,r0,r8,ror#19 @ Sigma1(e)
132# ifndef __ARMEB__
133 rev r2,r2
134# endif
135#else
136 @ ldrb r2,[r1,#3] @ 0
137 add r4,r4,r12 @ h+=Maj(a,b,c) from the past
138 ldrb r12,[r1,#2]
139 ldrb r0,[r1,#1]
140 orr r2,r2,r12,lsl#8
141 ldrb r12,[r1],#4
142 orr r2,r2,r0,lsl#16
143# if 0==15
144 str r1,[sp,#17*4] @ make room for r1
145# endif
146 eor r0,r8,r8,ror#5
147 orr r2,r2,r12,lsl#24
148 eor r0,r0,r8,ror#19 @ Sigma1(e)
149#endif
150 ldr r12,[r14],#4 @ *K256++
151 add r11,r11,r2 @ h+=X[i]
152 str r2,[sp,#0*4]
153 eor r2,r9,r10
154 add r11,r11,r0,ror#6 @ h+=Sigma1(e)
155 and r2,r2,r8
156 add r11,r11,r12 @ h+=K256[i]
157 eor r2,r2,r10 @ Ch(e,f,g)
158 eor r0,r4,r4,ror#11
159 add r11,r11,r2 @ h+=Ch(e,f,g)
160#if 0==31
161 and r12,r12,#0xff
162 cmp r12,#0xf2 @ done?
163#endif
164#if 0<15
165# if __ARM_ARCH__>=7
166 ldr r2,[r1],#4 @ prefetch
167# else
168 ldrb r2,[r1,#3]
169# endif
170 eor r12,r4,r5 @ a^b, b^c in next round
171#else
172 ldr r2,[sp,#2*4] @ from future BODY_16_xx
173 eor r12,r4,r5 @ a^b, b^c in next round
174 ldr r1,[sp,#15*4] @ from future BODY_16_xx
175#endif
176 eor r0,r0,r4,ror#20 @ Sigma0(a)
177 and r3,r3,r12 @ (b^c)&=(a^b)
178 add r7,r7,r11 @ d+=h
179 eor r3,r3,r5 @ Maj(a,b,c)
180 add r11,r11,r0,ror#2 @ h+=Sigma0(a)
181 @ add r11,r11,r3 @ h+=Maj(a,b,c)
182#if __ARM_ARCH__>=7
183 @ ldr r2,[r1],#4 @ 1
184# if 1==15
185 str r1,[sp,#17*4] @ make room for r1
186# endif
187 eor r0,r7,r7,ror#5
188 add r11,r11,r3 @ h+=Maj(a,b,c) from the past
189 eor r0,r0,r7,ror#19 @ Sigma1(e)
190# ifndef __ARMEB__
191 rev r2,r2
192# endif
193#else
194 @ ldrb r2,[r1,#3] @ 1
195 add r11,r11,r3 @ h+=Maj(a,b,c) from the past
196 ldrb r3,[r1,#2]
197 ldrb r0,[r1,#1]
198 orr r2,r2,r3,lsl#8
199 ldrb r3,[r1],#4
200 orr r2,r2,r0,lsl#16
201# if 1==15
202 str r1,[sp,#17*4] @ make room for r1
203# endif
204 eor r0,r7,r7,ror#5
205 orr r2,r2,r3,lsl#24
206 eor r0,r0,r7,ror#19 @ Sigma1(e)
207#endif
208 ldr r3,[r14],#4 @ *K256++
209 add r10,r10,r2 @ h+=X[i]
210 str r2,[sp,#1*4]
211 eor r2,r8,r9
212 add r10,r10,r0,ror#6 @ h+=Sigma1(e)
213 and r2,r2,r7
214 add r10,r10,r3 @ h+=K256[i]
215 eor r2,r2,r9 @ Ch(e,f,g)
216 eor r0,r11,r11,ror#11
217 add r10,r10,r2 @ h+=Ch(e,f,g)
218#if 1==31
219 and r3,r3,#0xff
220 cmp r3,#0xf2 @ done?
221#endif
222#if 1<15
223# if __ARM_ARCH__>=7
224 ldr r2,[r1],#4 @ prefetch
225# else
226 ldrb r2,[r1,#3]
227# endif
228 eor r3,r11,r4 @ a^b, b^c in next round
229#else
230 ldr r2,[sp,#3*4] @ from future BODY_16_xx
231 eor r3,r11,r4 @ a^b, b^c in next round
232 ldr r1,[sp,#0*4] @ from future BODY_16_xx
233#endif
234 eor r0,r0,r11,ror#20 @ Sigma0(a)
235 and r12,r12,r3 @ (b^c)&=(a^b)
236 add r6,r6,r10 @ d+=h
237 eor r12,r12,r4 @ Maj(a,b,c)
238 add r10,r10,r0,ror#2 @ h+=Sigma0(a)
239 @ add r10,r10,r12 @ h+=Maj(a,b,c)
240#if __ARM_ARCH__>=7
241 @ ldr r2,[r1],#4 @ 2
242# if 2==15
243 str r1,[sp,#17*4] @ make room for r1
244# endif
245 eor r0,r6,r6,ror#5
246 add r10,r10,r12 @ h+=Maj(a,b,c) from the past
247 eor r0,r0,r6,ror#19 @ Sigma1(e)
248# ifndef __ARMEB__
249 rev r2,r2
250# endif
251#else
252 @ ldrb r2,[r1,#3] @ 2
253 add r10,r10,r12 @ h+=Maj(a,b,c) from the past
254 ldrb r12,[r1,#2]
255 ldrb r0,[r1,#1]
256 orr r2,r2,r12,lsl#8
257 ldrb r12,[r1],#4
258 orr r2,r2,r0,lsl#16
259# if 2==15
260 str r1,[sp,#17*4] @ make room for r1
261# endif
262 eor r0,r6,r6,ror#5
263 orr r2,r2,r12,lsl#24
264 eor r0,r0,r6,ror#19 @ Sigma1(e)
265#endif
266 ldr r12,[r14],#4 @ *K256++
267 add r9,r9,r2 @ h+=X[i]
268 str r2,[sp,#2*4]
269 eor r2,r7,r8
270 add r9,r9,r0,ror#6 @ h+=Sigma1(e)
271 and r2,r2,r6
272 add r9,r9,r12 @ h+=K256[i]
273 eor r2,r2,r8 @ Ch(e,f,g)
274 eor r0,r10,r10,ror#11
275 add r9,r9,r2 @ h+=Ch(e,f,g)
276#if 2==31
277 and r12,r12,#0xff
278 cmp r12,#0xf2 @ done?
279#endif
280#if 2<15
281# if __ARM_ARCH__>=7
282 ldr r2,[r1],#4 @ prefetch
283# else
284 ldrb r2,[r1,#3]
285# endif
286 eor r12,r10,r11 @ a^b, b^c in next round
287#else
288 ldr r2,[sp,#4*4] @ from future BODY_16_xx
289 eor r12,r10,r11 @ a^b, b^c in next round
290 ldr r1,[sp,#1*4] @ from future BODY_16_xx
291#endif
292 eor r0,r0,r10,ror#20 @ Sigma0(a)
293 and r3,r3,r12 @ (b^c)&=(a^b)
294 add r5,r5,r9 @ d+=h
295 eor r3,r3,r11 @ Maj(a,b,c)
296 add r9,r9,r0,ror#2 @ h+=Sigma0(a)
297 @ add r9,r9,r3 @ h+=Maj(a,b,c)
298#if __ARM_ARCH__>=7
299 @ ldr r2,[r1],#4 @ 3
300# if 3==15
301 str r1,[sp,#17*4] @ make room for r1
302# endif
303 eor r0,r5,r5,ror#5
304 add r9,r9,r3 @ h+=Maj(a,b,c) from the past
305 eor r0,r0,r5,ror#19 @ Sigma1(e)
306# ifndef __ARMEB__
307 rev r2,r2
308# endif
309#else
310 @ ldrb r2,[r1,#3] @ 3
311 add r9,r9,r3 @ h+=Maj(a,b,c) from the past
312 ldrb r3,[r1,#2]
313 ldrb r0,[r1,#1]
314 orr r2,r2,r3,lsl#8
315 ldrb r3,[r1],#4
316 orr r2,r2,r0,lsl#16
317# if 3==15
318 str r1,[sp,#17*4] @ make room for r1
319# endif
320 eor r0,r5,r5,ror#5
321 orr r2,r2,r3,lsl#24
322 eor r0,r0,r5,ror#19 @ Sigma1(e)
323#endif
324 ldr r3,[r14],#4 @ *K256++
325 add r8,r8,r2 @ h+=X[i]
326 str r2,[sp,#3*4]
327 eor r2,r6,r7
328 add r8,r8,r0,ror#6 @ h+=Sigma1(e)
329 and r2,r2,r5
330 add r8,r8,r3 @ h+=K256[i]
331 eor r2,r2,r7 @ Ch(e,f,g)
332 eor r0,r9,r9,ror#11
333 add r8,r8,r2 @ h+=Ch(e,f,g)
334#if 3==31
335 and r3,r3,#0xff
336 cmp r3,#0xf2 @ done?
337#endif
338#if 3<15
339# if __ARM_ARCH__>=7
340 ldr r2,[r1],#4 @ prefetch
341# else
342 ldrb r2,[r1,#3]
343# endif
344 eor r3,r9,r10 @ a^b, b^c in next round
345#else
346 ldr r2,[sp,#5*4] @ from future BODY_16_xx
347 eor r3,r9,r10 @ a^b, b^c in next round
348 ldr r1,[sp,#2*4] @ from future BODY_16_xx
349#endif
350 eor r0,r0,r9,ror#20 @ Sigma0(a)
351 and r12,r12,r3 @ (b^c)&=(a^b)
352 add r4,r4,r8 @ d+=h
353 eor r12,r12,r10 @ Maj(a,b,c)
354 add r8,r8,r0,ror#2 @ h+=Sigma0(a)
355 @ add r8,r8,r12 @ h+=Maj(a,b,c)
356#if __ARM_ARCH__>=7
357 @ ldr r2,[r1],#4 @ 4
358# if 4==15
359 str r1,[sp,#17*4] @ make room for r1
360# endif
361 eor r0,r4,r4,ror#5
362 add r8,r8,r12 @ h+=Maj(a,b,c) from the past
363 eor r0,r0,r4,ror#19 @ Sigma1(e)
364# ifndef __ARMEB__
365 rev r2,r2
366# endif
367#else
368 @ ldrb r2,[r1,#3] @ 4
369 add r8,r8,r12 @ h+=Maj(a,b,c) from the past
370 ldrb r12,[r1,#2]
371 ldrb r0,[r1,#1]
372 orr r2,r2,r12,lsl#8
373 ldrb r12,[r1],#4
374 orr r2,r2,r0,lsl#16
375# if 4==15
376 str r1,[sp,#17*4] @ make room for r1
377# endif
378 eor r0,r4,r4,ror#5
379 orr r2,r2,r12,lsl#24
380 eor r0,r0,r4,ror#19 @ Sigma1(e)
381#endif
382 ldr r12,[r14],#4 @ *K256++
383 add r7,r7,r2 @ h+=X[i]
384 str r2,[sp,#4*4]
385 eor r2,r5,r6
386 add r7,r7,r0,ror#6 @ h+=Sigma1(e)
387 and r2,r2,r4
388 add r7,r7,r12 @ h+=K256[i]
389 eor r2,r2,r6 @ Ch(e,f,g)
390 eor r0,r8,r8,ror#11
391 add r7,r7,r2 @ h+=Ch(e,f,g)
392#if 4==31
393 and r12,r12,#0xff
394 cmp r12,#0xf2 @ done?
395#endif
396#if 4<15
397# if __ARM_ARCH__>=7
398 ldr r2,[r1],#4 @ prefetch
399# else
400 ldrb r2,[r1,#3]
401# endif
402 eor r12,r8,r9 @ a^b, b^c in next round
403#else
404 ldr r2,[sp,#6*4] @ from future BODY_16_xx
405 eor r12,r8,r9 @ a^b, b^c in next round
406 ldr r1,[sp,#3*4] @ from future BODY_16_xx
407#endif
408 eor r0,r0,r8,ror#20 @ Sigma0(a)
409 and r3,r3,r12 @ (b^c)&=(a^b)
410 add r11,r11,r7 @ d+=h
411 eor r3,r3,r9 @ Maj(a,b,c)
412 add r7,r7,r0,ror#2 @ h+=Sigma0(a)
413 @ add r7,r7,r3 @ h+=Maj(a,b,c)
414#if __ARM_ARCH__>=7
415 @ ldr r2,[r1],#4 @ 5
416# if 5==15
417 str r1,[sp,#17*4] @ make room for r1
418# endif
419 eor r0,r11,r11,ror#5
420 add r7,r7,r3 @ h+=Maj(a,b,c) from the past
421 eor r0,r0,r11,ror#19 @ Sigma1(e)
422# ifndef __ARMEB__
423 rev r2,r2
424# endif
425#else
426 @ ldrb r2,[r1,#3] @ 5
427 add r7,r7,r3 @ h+=Maj(a,b,c) from the past
428 ldrb r3,[r1,#2]
429 ldrb r0,[r1,#1]
430 orr r2,r2,r3,lsl#8
431 ldrb r3,[r1],#4
432 orr r2,r2,r0,lsl#16
433# if 5==15
434 str r1,[sp,#17*4] @ make room for r1
435# endif
436 eor r0,r11,r11,ror#5
437 orr r2,r2,r3,lsl#24
438 eor r0,r0,r11,ror#19 @ Sigma1(e)
439#endif
440 ldr r3,[r14],#4 @ *K256++
441 add r6,r6,r2 @ h+=X[i]
442 str r2,[sp,#5*4]
443 eor r2,r4,r5
444 add r6,r6,r0,ror#6 @ h+=Sigma1(e)
445 and r2,r2,r11
446 add r6,r6,r3 @ h+=K256[i]
447 eor r2,r2,r5 @ Ch(e,f,g)
448 eor r0,r7,r7,ror#11
449 add r6,r6,r2 @ h+=Ch(e,f,g)
450#if 5==31
451 and r3,r3,#0xff
452 cmp r3,#0xf2 @ done?
453#endif
454#if 5<15
455# if __ARM_ARCH__>=7
456 ldr r2,[r1],#4 @ prefetch
457# else
458 ldrb r2,[r1,#3]
459# endif
460 eor r3,r7,r8 @ a^b, b^c in next round
461#else
462 ldr r2,[sp,#7*4] @ from future BODY_16_xx
463 eor r3,r7,r8 @ a^b, b^c in next round
464 ldr r1,[sp,#4*4] @ from future BODY_16_xx
465#endif
466 eor r0,r0,r7,ror#20 @ Sigma0(a)
467 and r12,r12,r3 @ (b^c)&=(a^b)
468 add r10,r10,r6 @ d+=h
469 eor r12,r12,r8 @ Maj(a,b,c)
470 add r6,r6,r0,ror#2 @ h+=Sigma0(a)
471 @ add r6,r6,r12 @ h+=Maj(a,b,c)
472#if __ARM_ARCH__>=7
473 @ ldr r2,[r1],#4 @ 6
474# if 6==15
475 str r1,[sp,#17*4] @ make room for r1
476# endif
477 eor r0,r10,r10,ror#5
478 add r6,r6,r12 @ h+=Maj(a,b,c) from the past
479 eor r0,r0,r10,ror#19 @ Sigma1(e)
480# ifndef __ARMEB__
481 rev r2,r2
482# endif
483#else
484 @ ldrb r2,[r1,#3] @ 6
485 add r6,r6,r12 @ h+=Maj(a,b,c) from the past
486 ldrb r12,[r1,#2]
487 ldrb r0,[r1,#1]
488 orr r2,r2,r12,lsl#8
489 ldrb r12,[r1],#4
490 orr r2,r2,r0,lsl#16
491# if 6==15
492 str r1,[sp,#17*4] @ make room for r1
493# endif
494 eor r0,r10,r10,ror#5
495 orr r2,r2,r12,lsl#24
496 eor r0,r0,r10,ror#19 @ Sigma1(e)
497#endif
498 ldr r12,[r14],#4 @ *K256++
499 add r5,r5,r2 @ h+=X[i]
500 str r2,[sp,#6*4]
501 eor r2,r11,r4
502 add r5,r5,r0,ror#6 @ h+=Sigma1(e)
503 and r2,r2,r10
504 add r5,r5,r12 @ h+=K256[i]
505 eor r2,r2,r4 @ Ch(e,f,g)
506 eor r0,r6,r6,ror#11
507 add r5,r5,r2 @ h+=Ch(e,f,g)
508#if 6==31
509 and r12,r12,#0xff
510 cmp r12,#0xf2 @ done?
511#endif
512#if 6<15
513# if __ARM_ARCH__>=7
514 ldr r2,[r1],#4 @ prefetch
515# else
516 ldrb r2,[r1,#3]
517# endif
518 eor r12,r6,r7 @ a^b, b^c in next round
519#else
520 ldr r2,[sp,#8*4] @ from future BODY_16_xx
521 eor r12,r6,r7 @ a^b, b^c in next round
522 ldr r1,[sp,#5*4] @ from future BODY_16_xx
523#endif
524 eor r0,r0,r6,ror#20 @ Sigma0(a)
525 and r3,r3,r12 @ (b^c)&=(a^b)
526 add r9,r9,r5 @ d+=h
527 eor r3,r3,r7 @ Maj(a,b,c)
528 add r5,r5,r0,ror#2 @ h+=Sigma0(a)
529 @ add r5,r5,r3 @ h+=Maj(a,b,c)
530#if __ARM_ARCH__>=7
531 @ ldr r2,[r1],#4 @ 7
532# if 7==15
533 str r1,[sp,#17*4] @ make room for r1
534# endif
535 eor r0,r9,r9,ror#5
536 add r5,r5,r3 @ h+=Maj(a,b,c) from the past
537 eor r0,r0,r9,ror#19 @ Sigma1(e)
538# ifndef __ARMEB__
539 rev r2,r2
540# endif
541#else
542 @ ldrb r2,[r1,#3] @ 7
543 add r5,r5,r3 @ h+=Maj(a,b,c) from the past
544 ldrb r3,[r1,#2]
545 ldrb r0,[r1,#1]
546 orr r2,r2,r3,lsl#8
547 ldrb r3,[r1],#4
548 orr r2,r2,r0,lsl#16
549# if 7==15
550 str r1,[sp,#17*4] @ make room for r1
551# endif
552 eor r0,r9,r9,ror#5
553 orr r2,r2,r3,lsl#24
554 eor r0,r0,r9,ror#19 @ Sigma1(e)
555#endif
556 ldr r3,[r14],#4 @ *K256++
557 add r4,r4,r2 @ h+=X[i]
558 str r2,[sp,#7*4]
559 eor r2,r10,r11
560 add r4,r4,r0,ror#6 @ h+=Sigma1(e)
561 and r2,r2,r9
562 add r4,r4,r3 @ h+=K256[i]
563 eor r2,r2,r11 @ Ch(e,f,g)
564 eor r0,r5,r5,ror#11
565 add r4,r4,r2 @ h+=Ch(e,f,g)
566#if 7==31
567 and r3,r3,#0xff
568 cmp r3,#0xf2 @ done?
569#endif
570#if 7<15
571# if __ARM_ARCH__>=7
572 ldr r2,[r1],#4 @ prefetch
573# else
574 ldrb r2,[r1,#3]
575# endif
576 eor r3,r5,r6 @ a^b, b^c in next round
577#else
578 ldr r2,[sp,#9*4] @ from future BODY_16_xx
579 eor r3,r5,r6 @ a^b, b^c in next round
580 ldr r1,[sp,#6*4] @ from future BODY_16_xx
581#endif
582 eor r0,r0,r5,ror#20 @ Sigma0(a)
583 and r12,r12,r3 @ (b^c)&=(a^b)
584 add r8,r8,r4 @ d+=h
585 eor r12,r12,r6 @ Maj(a,b,c)
586 add r4,r4,r0,ror#2 @ h+=Sigma0(a)
587 @ add r4,r4,r12 @ h+=Maj(a,b,c)
588#if __ARM_ARCH__>=7
589 @ ldr r2,[r1],#4 @ 8
590# if 8==15
591 str r1,[sp,#17*4] @ make room for r1
592# endif
593 eor r0,r8,r8,ror#5
594 add r4,r4,r12 @ h+=Maj(a,b,c) from the past
595 eor r0,r0,r8,ror#19 @ Sigma1(e)
596# ifndef __ARMEB__
597 rev r2,r2
598# endif
599#else
600 @ ldrb r2,[r1,#3] @ 8
601 add r4,r4,r12 @ h+=Maj(a,b,c) from the past
602 ldrb r12,[r1,#2]
603 ldrb r0,[r1,#1]
604 orr r2,r2,r12,lsl#8
605 ldrb r12,[r1],#4
606 orr r2,r2,r0,lsl#16
607# if 8==15
608 str r1,[sp,#17*4] @ make room for r1
609# endif
610 eor r0,r8,r8,ror#5
611 orr r2,r2,r12,lsl#24
612 eor r0,r0,r8,ror#19 @ Sigma1(e)
613#endif
614 ldr r12,[r14],#4 @ *K256++
615 add r11,r11,r2 @ h+=X[i]
616 str r2,[sp,#8*4]
617 eor r2,r9,r10
618 add r11,r11,r0,ror#6 @ h+=Sigma1(e)
619 and r2,r2,r8
620 add r11,r11,r12 @ h+=K256[i]
621 eor r2,r2,r10 @ Ch(e,f,g)
622 eor r0,r4,r4,ror#11
623 add r11,r11,r2 @ h+=Ch(e,f,g)
624#if 8==31
625 and r12,r12,#0xff
626 cmp r12,#0xf2 @ done?
627#endif
628#if 8<15
629# if __ARM_ARCH__>=7
630 ldr r2,[r1],#4 @ prefetch
631# else
632 ldrb r2,[r1,#3]
633# endif
634 eor r12,r4,r5 @ a^b, b^c in next round
635#else
636 ldr r2,[sp,#10*4] @ from future BODY_16_xx
637 eor r12,r4,r5 @ a^b, b^c in next round
638 ldr r1,[sp,#7*4] @ from future BODY_16_xx
639#endif
640 eor r0,r0,r4,ror#20 @ Sigma0(a)
641 and r3,r3,r12 @ (b^c)&=(a^b)
642 add r7,r7,r11 @ d+=h
643 eor r3,r3,r5 @ Maj(a,b,c)
644 add r11,r11,r0,ror#2 @ h+=Sigma0(a)
645 @ add r11,r11,r3 @ h+=Maj(a,b,c)
646#if __ARM_ARCH__>=7
647 @ ldr r2,[r1],#4 @ 9
648# if 9==15
649 str r1,[sp,#17*4] @ make room for r1
650# endif
651 eor r0,r7,r7,ror#5
652 add r11,r11,r3 @ h+=Maj(a,b,c) from the past
653 eor r0,r0,r7,ror#19 @ Sigma1(e)
654# ifndef __ARMEB__
655 rev r2,r2
656# endif
657#else
658 @ ldrb r2,[r1,#3] @ 9
659 add r11,r11,r3 @ h+=Maj(a,b,c) from the past
660 ldrb r3,[r1,#2]
661 ldrb r0,[r1,#1]
662 orr r2,r2,r3,lsl#8
663 ldrb r3,[r1],#4
664 orr r2,r2,r0,lsl#16
665# if 9==15
666 str r1,[sp,#17*4] @ make room for r1
667# endif
668 eor r0,r7,r7,ror#5
669 orr r2,r2,r3,lsl#24
670 eor r0,r0,r7,ror#19 @ Sigma1(e)
671#endif
672 ldr r3,[r14],#4 @ *K256++
673 add r10,r10,r2 @ h+=X[i]
674 str r2,[sp,#9*4]
675 eor r2,r8,r9
676 add r10,r10,r0,ror#6 @ h+=Sigma1(e)
677 and r2,r2,r7
678 add r10,r10,r3 @ h+=K256[i]
679 eor r2,r2,r9 @ Ch(e,f,g)
680 eor r0,r11,r11,ror#11
681 add r10,r10,r2 @ h+=Ch(e,f,g)
682#if 9==31
683 and r3,r3,#0xff
684 cmp r3,#0xf2 @ done?
685#endif
686#if 9<15
687# if __ARM_ARCH__>=7
688 ldr r2,[r1],#4 @ prefetch
689# else
690 ldrb r2,[r1,#3]
691# endif
692 eor r3,r11,r4 @ a^b, b^c in next round
693#else
694 ldr r2,[sp,#11*4] @ from future BODY_16_xx
695 eor r3,r11,r4 @ a^b, b^c in next round
696 ldr r1,[sp,#8*4] @ from future BODY_16_xx
697#endif
698 eor r0,r0,r11,ror#20 @ Sigma0(a)
699 and r12,r12,r3 @ (b^c)&=(a^b)
700 add r6,r6,r10 @ d+=h
701 eor r12,r12,r4 @ Maj(a,b,c)
702 add r10,r10,r0,ror#2 @ h+=Sigma0(a)
703 @ add r10,r10,r12 @ h+=Maj(a,b,c)
704#if __ARM_ARCH__>=7
705 @ ldr r2,[r1],#4 @ 10
706# if 10==15
707 str r1,[sp,#17*4] @ make room for r1
708# endif
709 eor r0,r6,r6,ror#5
710 add r10,r10,r12 @ h+=Maj(a,b,c) from the past
711 eor r0,r0,r6,ror#19 @ Sigma1(e)
712# ifndef __ARMEB__
713 rev r2,r2
714# endif
715#else
716 @ ldrb r2,[r1,#3] @ 10
717 add r10,r10,r12 @ h+=Maj(a,b,c) from the past
718 ldrb r12,[r1,#2]
719 ldrb r0,[r1,#1]
720 orr r2,r2,r12,lsl#8
721 ldrb r12,[r1],#4
722 orr r2,r2,r0,lsl#16
723# if 10==15
724 str r1,[sp,#17*4] @ make room for r1
725# endif
726 eor r0,r6,r6,ror#5
727 orr r2,r2,r12,lsl#24
728 eor r0,r0,r6,ror#19 @ Sigma1(e)
729#endif
730 ldr r12,[r14],#4 @ *K256++
731 add r9,r9,r2 @ h+=X[i]
732 str r2,[sp,#10*4]
733 eor r2,r7,r8
734 add r9,r9,r0,ror#6 @ h+=Sigma1(e)
735 and r2,r2,r6
736 add r9,r9,r12 @ h+=K256[i]
737 eor r2,r2,r8 @ Ch(e,f,g)
738 eor r0,r10,r10,ror#11
739 add r9,r9,r2 @ h+=Ch(e,f,g)
740#if 10==31
741 and r12,r12,#0xff
742 cmp r12,#0xf2 @ done?
743#endif
744#if 10<15
745# if __ARM_ARCH__>=7
746 ldr r2,[r1],#4 @ prefetch
747# else
748 ldrb r2,[r1,#3]
749# endif
750 eor r12,r10,r11 @ a^b, b^c in next round
751#else
752 ldr r2,[sp,#12*4] @ from future BODY_16_xx
753 eor r12,r10,r11 @ a^b, b^c in next round
754 ldr r1,[sp,#9*4] @ from future BODY_16_xx
755#endif
756 eor r0,r0,r10,ror#20 @ Sigma0(a)
757 and r3,r3,r12 @ (b^c)&=(a^b)
758 add r5,r5,r9 @ d+=h
759 eor r3,r3,r11 @ Maj(a,b,c)
760 add r9,r9,r0,ror#2 @ h+=Sigma0(a)
761 @ add r9,r9,r3 @ h+=Maj(a,b,c)
762#if __ARM_ARCH__>=7
763 @ ldr r2,[r1],#4 @ 11
764# if 11==15
765 str r1,[sp,#17*4] @ make room for r1
766# endif
767 eor r0,r5,r5,ror#5
768 add r9,r9,r3 @ h+=Maj(a,b,c) from the past
769 eor r0,r0,r5,ror#19 @ Sigma1(e)
770# ifndef __ARMEB__
771 rev r2,r2
772# endif
773#else
774 @ ldrb r2,[r1,#3] @ 11
775 add r9,r9,r3 @ h+=Maj(a,b,c) from the past
776 ldrb r3,[r1,#2]
777 ldrb r0,[r1,#1]
778 orr r2,r2,r3,lsl#8
779 ldrb r3,[r1],#4
780 orr r2,r2,r0,lsl#16
781# if 11==15
782 str r1,[sp,#17*4] @ make room for r1
783# endif
784 eor r0,r5,r5,ror#5
785 orr r2,r2,r3,lsl#24
786 eor r0,r0,r5,ror#19 @ Sigma1(e)
787#endif
788 ldr r3,[r14],#4 @ *K256++
789 add r8,r8,r2 @ h+=X[i]
790 str r2,[sp,#11*4]
791 eor r2,r6,r7
792 add r8,r8,r0,ror#6 @ h+=Sigma1(e)
793 and r2,r2,r5
794 add r8,r8,r3 @ h+=K256[i]
795 eor r2,r2,r7 @ Ch(e,f,g)
796 eor r0,r9,r9,ror#11
797 add r8,r8,r2 @ h+=Ch(e,f,g)
798#if 11==31
799 and r3,r3,#0xff
800 cmp r3,#0xf2 @ done?
801#endif
802#if 11<15
803# if __ARM_ARCH__>=7
804 ldr r2,[r1],#4 @ prefetch
805# else
806 ldrb r2,[r1,#3]
807# endif
808 eor r3,r9,r10 @ a^b, b^c in next round
809#else
810 ldr r2,[sp,#13*4] @ from future BODY_16_xx
811 eor r3,r9,r10 @ a^b, b^c in next round
812 ldr r1,[sp,#10*4] @ from future BODY_16_xx
813#endif
814 eor r0,r0,r9,ror#20 @ Sigma0(a)
815 and r12,r12,r3 @ (b^c)&=(a^b)
816 add r4,r4,r8 @ d+=h
817 eor r12,r12,r10 @ Maj(a,b,c)
818 add r8,r8,r0,ror#2 @ h+=Sigma0(a)
819 @ add r8,r8,r12 @ h+=Maj(a,b,c)
820#if __ARM_ARCH__>=7
821 @ ldr r2,[r1],#4 @ 12
822# if 12==15
823 str r1,[sp,#17*4] @ make room for r1
824# endif
825 eor r0,r4,r4,ror#5
826 add r8,r8,r12 @ h+=Maj(a,b,c) from the past
827 eor r0,r0,r4,ror#19 @ Sigma1(e)
828# ifndef __ARMEB__
829 rev r2,r2
830# endif
831#else
832 @ ldrb r2,[r1,#3] @ 12
833 add r8,r8,r12 @ h+=Maj(a,b,c) from the past
834 ldrb r12,[r1,#2]
835 ldrb r0,[r1,#1]
836 orr r2,r2,r12,lsl#8
837 ldrb r12,[r1],#4
838 orr r2,r2,r0,lsl#16
839# if 12==15
840 str r1,[sp,#17*4] @ make room for r1
841# endif
842 eor r0,r4,r4,ror#5
843 orr r2,r2,r12,lsl#24
844 eor r0,r0,r4,ror#19 @ Sigma1(e)
845#endif
846 ldr r12,[r14],#4 @ *K256++
847 add r7,r7,r2 @ h+=X[i]
848 str r2,[sp,#12*4]
849 eor r2,r5,r6
850 add r7,r7,r0,ror#6 @ h+=Sigma1(e)
851 and r2,r2,r4
852 add r7,r7,r12 @ h+=K256[i]
853 eor r2,r2,r6 @ Ch(e,f,g)
854 eor r0,r8,r8,ror#11
855 add r7,r7,r2 @ h+=Ch(e,f,g)
856#if 12==31
857 and r12,r12,#0xff
858 cmp r12,#0xf2 @ done?
859#endif
860#if 12<15
861# if __ARM_ARCH__>=7
862 ldr r2,[r1],#4 @ prefetch
863# else
864 ldrb r2,[r1,#3]
865# endif
866 eor r12,r8,r9 @ a^b, b^c in next round
867#else
868 ldr r2,[sp,#14*4] @ from future BODY_16_xx
869 eor r12,r8,r9 @ a^b, b^c in next round
870 ldr r1,[sp,#11*4] @ from future BODY_16_xx
871#endif
872 eor r0,r0,r8,ror#20 @ Sigma0(a)
873 and r3,r3,r12 @ (b^c)&=(a^b)
874 add r11,r11,r7 @ d+=h
875 eor r3,r3,r9 @ Maj(a,b,c)
876 add r7,r7,r0,ror#2 @ h+=Sigma0(a)
877 @ add r7,r7,r3 @ h+=Maj(a,b,c)
878#if __ARM_ARCH__>=7
879 @ ldr r2,[r1],#4 @ 13
880# if 13==15
881 str r1,[sp,#17*4] @ make room for r1
882# endif
883 eor r0,r11,r11,ror#5
884 add r7,r7,r3 @ h+=Maj(a,b,c) from the past
885 eor r0,r0,r11,ror#19 @ Sigma1(e)
886# ifndef __ARMEB__
887 rev r2,r2
888# endif
889#else
890 @ ldrb r2,[r1,#3] @ 13
891 add r7,r7,r3 @ h+=Maj(a,b,c) from the past
892 ldrb r3,[r1,#2]
893 ldrb r0,[r1,#1]
894 orr r2,r2,r3,lsl#8
895 ldrb r3,[r1],#4
896 orr r2,r2,r0,lsl#16
897# if 13==15
898 str r1,[sp,#17*4] @ make room for r1
899# endif
900 eor r0,r11,r11,ror#5
901 orr r2,r2,r3,lsl#24
902 eor r0,r0,r11,ror#19 @ Sigma1(e)
903#endif
904 ldr r3,[r14],#4 @ *K256++
905 add r6,r6,r2 @ h+=X[i]
906 str r2,[sp,#13*4]
907 eor r2,r4,r5
908 add r6,r6,r0,ror#6 @ h+=Sigma1(e)
909 and r2,r2,r11
910 add r6,r6,r3 @ h+=K256[i]
911 eor r2,r2,r5 @ Ch(e,f,g)
912 eor r0,r7,r7,ror#11
913 add r6,r6,r2 @ h+=Ch(e,f,g)
914#if 13==31
915 and r3,r3,#0xff
916 cmp r3,#0xf2 @ done?
917#endif
918#if 13<15
919# if __ARM_ARCH__>=7
920 ldr r2,[r1],#4 @ prefetch
921# else
922 ldrb r2,[r1,#3]
923# endif
924 eor r3,r7,r8 @ a^b, b^c in next round
925#else
926 ldr r2,[sp,#15*4] @ from future BODY_16_xx
927 eor r3,r7,r8 @ a^b, b^c in next round
928 ldr r1,[sp,#12*4] @ from future BODY_16_xx
929#endif
930 eor r0,r0,r7,ror#20 @ Sigma0(a)
931 and r12,r12,r3 @ (b^c)&=(a^b)
932 add r10,r10,r6 @ d+=h
933 eor r12,r12,r8 @ Maj(a,b,c)
934 add r6,r6,r0,ror#2 @ h+=Sigma0(a)
935 @ add r6,r6,r12 @ h+=Maj(a,b,c)
936#if __ARM_ARCH__>=7
937 @ ldr r2,[r1],#4 @ 14
938# if 14==15
939 str r1,[sp,#17*4] @ make room for r1
940# endif
941 eor r0,r10,r10,ror#5
942 add r6,r6,r12 @ h+=Maj(a,b,c) from the past
943 eor r0,r0,r10,ror#19 @ Sigma1(e)
944# ifndef __ARMEB__
945 rev r2,r2
946# endif
947#else
948 @ ldrb r2,[r1,#3] @ 14
949 add r6,r6,r12 @ h+=Maj(a,b,c) from the past
950 ldrb r12,[r1,#2]
951 ldrb r0,[r1,#1]
952 orr r2,r2,r12,lsl#8
953 ldrb r12,[r1],#4
954 orr r2,r2,r0,lsl#16
955# if 14==15
956 str r1,[sp,#17*4] @ make room for r1
957# endif
958 eor r0,r10,r10,ror#5
959 orr r2,r2,r12,lsl#24
960 eor r0,r0,r10,ror#19 @ Sigma1(e)
961#endif
962 ldr r12,[r14],#4 @ *K256++
963 add r5,r5,r2 @ h+=X[i]
964 str r2,[sp,#14*4]
965 eor r2,r11,r4
966 add r5,r5,r0,ror#6 @ h+=Sigma1(e)
967 and r2,r2,r10
968 add r5,r5,r12 @ h+=K256[i]
969 eor r2,r2,r4 @ Ch(e,f,g)
970 eor r0,r6,r6,ror#11
971 add r5,r5,r2 @ h+=Ch(e,f,g)
972#if 14==31
973 and r12,r12,#0xff
974 cmp r12,#0xf2 @ done?
975#endif
976#if 14<15
977# if __ARM_ARCH__>=7
978 ldr r2,[r1],#4 @ prefetch
979# else
980 ldrb r2,[r1,#3]
981# endif
982 eor r12,r6,r7 @ a^b, b^c in next round
983#else
984 ldr r2,[sp,#0*4] @ from future BODY_16_xx
985 eor r12,r6,r7 @ a^b, b^c in next round
986 ldr r1,[sp,#13*4] @ from future BODY_16_xx
987#endif
988 eor r0,r0,r6,ror#20 @ Sigma0(a)
989 and r3,r3,r12 @ (b^c)&=(a^b)
990 add r9,r9,r5 @ d+=h
991 eor r3,r3,r7 @ Maj(a,b,c)
992 add r5,r5,r0,ror#2 @ h+=Sigma0(a)
993 @ add r5,r5,r3 @ h+=Maj(a,b,c)
994#if __ARM_ARCH__>=7
995 @ ldr r2,[r1],#4 @ 15
996# if 15==15
997 str r1,[sp,#17*4] @ make room for r1
998# endif
999 eor r0,r9,r9,ror#5
1000 add r5,r5,r3 @ h+=Maj(a,b,c) from the past
1001 eor r0,r0,r9,ror#19 @ Sigma1(e)
1002# ifndef __ARMEB__
1003 rev r2,r2
1004# endif
1005#else
1006 @ ldrb r2,[r1,#3] @ 15
1007 add r5,r5,r3 @ h+=Maj(a,b,c) from the past
1008 ldrb r3,[r1,#2]
1009 ldrb r0,[r1,#1]
1010 orr r2,r2,r3,lsl#8
1011 ldrb r3,[r1],#4
1012 orr r2,r2,r0,lsl#16
1013# if 15==15
1014 str r1,[sp,#17*4] @ make room for r1
1015# endif
1016 eor r0,r9,r9,ror#5
1017 orr r2,r2,r3,lsl#24
1018 eor r0,r0,r9,ror#19 @ Sigma1(e)
1019#endif
1020 ldr r3,[r14],#4 @ *K256++
1021 add r4,r4,r2 @ h+=X[i]
1022 str r2,[sp,#15*4]
1023 eor r2,r10,r11
1024 add r4,r4,r0,ror#6 @ h+=Sigma1(e)
1025 and r2,r2,r9
1026 add r4,r4,r3 @ h+=K256[i]
1027 eor r2,r2,r11 @ Ch(e,f,g)
1028 eor r0,r5,r5,ror#11
1029 add r4,r4,r2 @ h+=Ch(e,f,g)
1030#if 15==31
1031 and r3,r3,#0xff
1032 cmp r3,#0xf2 @ done?
1033#endif
1034#if 15<15
1035# if __ARM_ARCH__>=7
1036 ldr r2,[r1],#4 @ prefetch
1037# else
1038 ldrb r2,[r1,#3]
1039# endif
1040 eor r3,r5,r6 @ a^b, b^c in next round
1041#else
1042 ldr r2,[sp,#1*4] @ from future BODY_16_xx
1043 eor r3,r5,r6 @ a^b, b^c in next round
1044 ldr r1,[sp,#14*4] @ from future BODY_16_xx
1045#endif
1046 eor r0,r0,r5,ror#20 @ Sigma0(a)
1047 and r12,r12,r3 @ (b^c)&=(a^b)
1048 add r8,r8,r4 @ d+=h
1049 eor r12,r12,r6 @ Maj(a,b,c)
1050 add r4,r4,r0,ror#2 @ h+=Sigma0(a)
1051 @ add r4,r4,r12 @ h+=Maj(a,b,c)
1052Lrounds_16_xx:
1053 @ ldr r2,[sp,#1*4] @ 16
1054 @ ldr r1,[sp,#14*4]
1055 mov r0,r2,ror#7
1056 add r4,r4,r12 @ h+=Maj(a,b,c) from the past
1057 mov r12,r1,ror#17
1058 eor r0,r0,r2,ror#18
1059 eor r12,r12,r1,ror#19
1060 eor r0,r0,r2,lsr#3 @ sigma0(X[i+1])
1061 ldr r2,[sp,#0*4]
1062 eor r12,r12,r1,lsr#10 @ sigma1(X[i+14])
1063 ldr r1,[sp,#9*4]
1064
1065 add r12,r12,r0
1066 eor r0,r8,r8,ror#5 @ from BODY_00_15
1067 add r2,r2,r12
1068 eor r0,r0,r8,ror#19 @ Sigma1(e)
1069 add r2,r2,r1 @ X[i]
1070 ldr r12,[r14],#4 @ *K256++
1071 add r11,r11,r2 @ h+=X[i]
1072 str r2,[sp,#0*4]
1073 eor r2,r9,r10
1074 add r11,r11,r0,ror#6 @ h+=Sigma1(e)
1075 and r2,r2,r8
1076 add r11,r11,r12 @ h+=K256[i]
1077 eor r2,r2,r10 @ Ch(e,f,g)
1078 eor r0,r4,r4,ror#11
1079 add r11,r11,r2 @ h+=Ch(e,f,g)
1080#if 16==31
1081 and r12,r12,#0xff
1082 cmp r12,#0xf2 @ done?
1083#endif
1084#if 16<15
1085# if __ARM_ARCH__>=7
1086 ldr r2,[r1],#4 @ prefetch
1087# else
1088 ldrb r2,[r1,#3]
1089# endif
1090 eor r12,r4,r5 @ a^b, b^c in next round
1091#else
1092 ldr r2,[sp,#2*4] @ from future BODY_16_xx
1093 eor r12,r4,r5 @ a^b, b^c in next round
1094 ldr r1,[sp,#15*4] @ from future BODY_16_xx
1095#endif
1096 eor r0,r0,r4,ror#20 @ Sigma0(a)
1097 and r3,r3,r12 @ (b^c)&=(a^b)
1098 add r7,r7,r11 @ d+=h
1099 eor r3,r3,r5 @ Maj(a,b,c)
1100 add r11,r11,r0,ror#2 @ h+=Sigma0(a)
1101 @ add r11,r11,r3 @ h+=Maj(a,b,c)
1102 @ ldr r2,[sp,#2*4] @ 17
1103 @ ldr r1,[sp,#15*4]
1104 mov r0,r2,ror#7
1105 add r11,r11,r3 @ h+=Maj(a,b,c) from the past
1106 mov r3,r1,ror#17
1107 eor r0,r0,r2,ror#18
1108 eor r3,r3,r1,ror#19
1109 eor r0,r0,r2,lsr#3 @ sigma0(X[i+1])
1110 ldr r2,[sp,#1*4]
1111 eor r3,r3,r1,lsr#10 @ sigma1(X[i+14])
1112 ldr r1,[sp,#10*4]
1113
1114 add r3,r3,r0
1115 eor r0,r7,r7,ror#5 @ from BODY_00_15
1116 add r2,r2,r3
1117 eor r0,r0,r7,ror#19 @ Sigma1(e)
1118 add r2,r2,r1 @ X[i]
1119 ldr r3,[r14],#4 @ *K256++
1120 add r10,r10,r2 @ h+=X[i]
1121 str r2,[sp,#1*4]
1122 eor r2,r8,r9
1123 add r10,r10,r0,ror#6 @ h+=Sigma1(e)
1124 and r2,r2,r7
1125 add r10,r10,r3 @ h+=K256[i]
1126 eor r2,r2,r9 @ Ch(e,f,g)
1127 eor r0,r11,r11,ror#11
1128 add r10,r10,r2 @ h+=Ch(e,f,g)
1129#if 17==31
1130 and r3,r3,#0xff
1131 cmp r3,#0xf2 @ done?
1132#endif
1133#if 17<15
1134# if __ARM_ARCH__>=7
1135 ldr r2,[r1],#4 @ prefetch
1136# else
1137 ldrb r2,[r1,#3]
1138# endif
1139 eor r3,r11,r4 @ a^b, b^c in next round
1140#else
1141 ldr r2,[sp,#3*4] @ from future BODY_16_xx
1142 eor r3,r11,r4 @ a^b, b^c in next round
1143 ldr r1,[sp,#0*4] @ from future BODY_16_xx
1144#endif
1145 eor r0,r0,r11,ror#20 @ Sigma0(a)
1146 and r12,r12,r3 @ (b^c)&=(a^b)
1147 add r6,r6,r10 @ d+=h
1148 eor r12,r12,r4 @ Maj(a,b,c)
1149 add r10,r10,r0,ror#2 @ h+=Sigma0(a)
1150 @ add r10,r10,r12 @ h+=Maj(a,b,c)
1151 @ ldr r2,[sp,#3*4] @ 18
1152 @ ldr r1,[sp,#0*4]
1153 mov r0,r2,ror#7
1154 add r10,r10,r12 @ h+=Maj(a,b,c) from the past
1155 mov r12,r1,ror#17
1156 eor r0,r0,r2,ror#18
1157 eor r12,r12,r1,ror#19
1158 eor r0,r0,r2,lsr#3 @ sigma0(X[i+1])
1159 ldr r2,[sp,#2*4]
1160 eor r12,r12,r1,lsr#10 @ sigma1(X[i+14])
1161 ldr r1,[sp,#11*4]
1162
1163 add r12,r12,r0
1164 eor r0,r6,r6,ror#5 @ from BODY_00_15
1165 add r2,r2,r12
1166 eor r0,r0,r6,ror#19 @ Sigma1(e)
1167 add r2,r2,r1 @ X[i]
1168 ldr r12,[r14],#4 @ *K256++
1169 add r9,r9,r2 @ h+=X[i]
1170 str r2,[sp,#2*4]
1171 eor r2,r7,r8
1172 add r9,r9,r0,ror#6 @ h+=Sigma1(e)
1173 and r2,r2,r6
1174 add r9,r9,r12 @ h+=K256[i]
1175 eor r2,r2,r8 @ Ch(e,f,g)
1176 eor r0,r10,r10,ror#11
1177 add r9,r9,r2 @ h+=Ch(e,f,g)
1178#if 18==31
1179 and r12,r12,#0xff
1180 cmp r12,#0xf2 @ done?
1181#endif
1182#if 18<15
1183# if __ARM_ARCH__>=7
1184 ldr r2,[r1],#4 @ prefetch
1185# else
1186 ldrb r2,[r1,#3]
1187# endif
1188 eor r12,r10,r11 @ a^b, b^c in next round
1189#else
1190 ldr r2,[sp,#4*4] @ from future BODY_16_xx
1191 eor r12,r10,r11 @ a^b, b^c in next round
1192 ldr r1,[sp,#1*4] @ from future BODY_16_xx
1193#endif
1194 eor r0,r0,r10,ror#20 @ Sigma0(a)
1195 and r3,r3,r12 @ (b^c)&=(a^b)
1196 add r5,r5,r9 @ d+=h
1197 eor r3,r3,r11 @ Maj(a,b,c)
1198 add r9,r9,r0,ror#2 @ h+=Sigma0(a)
1199 @ add r9,r9,r3 @ h+=Maj(a,b,c)
1200 @ ldr r2,[sp,#4*4] @ 19
1201 @ ldr r1,[sp,#1*4]
1202 mov r0,r2,ror#7
1203 add r9,r9,r3 @ h+=Maj(a,b,c) from the past
1204 mov r3,r1,ror#17
1205 eor r0,r0,r2,ror#18
1206 eor r3,r3,r1,ror#19
1207 eor r0,r0,r2,lsr#3 @ sigma0(X[i+1])
1208 ldr r2,[sp,#3*4]
1209 eor r3,r3,r1,lsr#10 @ sigma1(X[i+14])
1210 ldr r1,[sp,#12*4]
1211
1212 add r3,r3,r0
1213 eor r0,r5,r5,ror#5 @ from BODY_00_15
1214 add r2,r2,r3
1215 eor r0,r0,r5,ror#19 @ Sigma1(e)
1216 add r2,r2,r1 @ X[i]
1217 ldr r3,[r14],#4 @ *K256++
1218 add r8,r8,r2 @ h+=X[i]
1219 str r2,[sp,#3*4]
1220 eor r2,r6,r7
1221 add r8,r8,r0,ror#6 @ h+=Sigma1(e)
1222 and r2,r2,r5
1223 add r8,r8,r3 @ h+=K256[i]
1224 eor r2,r2,r7 @ Ch(e,f,g)
1225 eor r0,r9,r9,ror#11
1226 add r8,r8,r2 @ h+=Ch(e,f,g)
1227#if 19==31
1228 and r3,r3,#0xff
1229 cmp r3,#0xf2 @ done?
1230#endif
1231#if 19<15
1232# if __ARM_ARCH__>=7
1233 ldr r2,[r1],#4 @ prefetch
1234# else
1235 ldrb r2,[r1,#3]
1236# endif
1237 eor r3,r9,r10 @ a^b, b^c in next round
1238#else
1239 ldr r2,[sp,#5*4] @ from future BODY_16_xx
1240 eor r3,r9,r10 @ a^b, b^c in next round
1241 ldr r1,[sp,#2*4] @ from future BODY_16_xx
1242#endif
1243 eor r0,r0,r9,ror#20 @ Sigma0(a)
1244 and r12,r12,r3 @ (b^c)&=(a^b)
1245 add r4,r4,r8 @ d+=h
1246 eor r12,r12,r10 @ Maj(a,b,c)
1247 add r8,r8,r0,ror#2 @ h+=Sigma0(a)
1248 @ add r8,r8,r12 @ h+=Maj(a,b,c)
1249 @ ldr r2,[sp,#5*4] @ 20
1250 @ ldr r1,[sp,#2*4]
1251 mov r0,r2,ror#7
1252 add r8,r8,r12 @ h+=Maj(a,b,c) from the past
1253 mov r12,r1,ror#17
1254 eor r0,r0,r2,ror#18
1255 eor r12,r12,r1,ror#19
1256 eor r0,r0,r2,lsr#3 @ sigma0(X[i+1])
1257 ldr r2,[sp,#4*4]
1258 eor r12,r12,r1,lsr#10 @ sigma1(X[i+14])
1259 ldr r1,[sp,#13*4]
1260
1261 add r12,r12,r0
1262 eor r0,r4,r4,ror#5 @ from BODY_00_15
1263 add r2,r2,r12
1264 eor r0,r0,r4,ror#19 @ Sigma1(e)
1265 add r2,r2,r1 @ X[i]
1266 ldr r12,[r14],#4 @ *K256++
1267 add r7,r7,r2 @ h+=X[i]
1268 str r2,[sp,#4*4]
1269 eor r2,r5,r6
1270 add r7,r7,r0,ror#6 @ h+=Sigma1(e)
1271 and r2,r2,r4
1272 add r7,r7,r12 @ h+=K256[i]
1273 eor r2,r2,r6 @ Ch(e,f,g)
1274 eor r0,r8,r8,ror#11
1275 add r7,r7,r2 @ h+=Ch(e,f,g)
1276#if 20==31
1277 and r12,r12,#0xff
1278 cmp r12,#0xf2 @ done?
1279#endif
1280#if 20<15
1281# if __ARM_ARCH__>=7
1282 ldr r2,[r1],#4 @ prefetch
1283# else
1284 ldrb r2,[r1,#3]
1285# endif
1286 eor r12,r8,r9 @ a^b, b^c in next round
1287#else
1288 ldr r2,[sp,#6*4] @ from future BODY_16_xx
1289 eor r12,r8,r9 @ a^b, b^c in next round
1290 ldr r1,[sp,#3*4] @ from future BODY_16_xx
1291#endif
1292 eor r0,r0,r8,ror#20 @ Sigma0(a)
1293 and r3,r3,r12 @ (b^c)&=(a^b)
1294 add r11,r11,r7 @ d+=h
1295 eor r3,r3,r9 @ Maj(a,b,c)
1296 add r7,r7,r0,ror#2 @ h+=Sigma0(a)
1297 @ add r7,r7,r3 @ h+=Maj(a,b,c)
1298 @ ldr r2,[sp,#6*4] @ 21
1299 @ ldr r1,[sp,#3*4]
1300 mov r0,r2,ror#7
1301 add r7,r7,r3 @ h+=Maj(a,b,c) from the past
1302 mov r3,r1,ror#17
1303 eor r0,r0,r2,ror#18
1304 eor r3,r3,r1,ror#19
1305 eor r0,r0,r2,lsr#3 @ sigma0(X[i+1])
1306 ldr r2,[sp,#5*4]
1307 eor r3,r3,r1,lsr#10 @ sigma1(X[i+14])
1308 ldr r1,[sp,#14*4]
1309
1310 add r3,r3,r0
1311 eor r0,r11,r11,ror#5 @ from BODY_00_15
1312 add r2,r2,r3
1313 eor r0,r0,r11,ror#19 @ Sigma1(e)
1314 add r2,r2,r1 @ X[i]
1315 ldr r3,[r14],#4 @ *K256++
1316 add r6,r6,r2 @ h+=X[i]
1317 str r2,[sp,#5*4]
1318 eor r2,r4,r5
1319 add r6,r6,r0,ror#6 @ h+=Sigma1(e)
1320 and r2,r2,r11
1321 add r6,r6,r3 @ h+=K256[i]
1322 eor r2,r2,r5 @ Ch(e,f,g)
1323 eor r0,r7,r7,ror#11
1324 add r6,r6,r2 @ h+=Ch(e,f,g)
1325#if 21==31
1326 and r3,r3,#0xff
1327 cmp r3,#0xf2 @ done?
1328#endif
1329#if 21<15
1330# if __ARM_ARCH__>=7
1331 ldr r2,[r1],#4 @ prefetch
1332# else
1333 ldrb r2,[r1,#3]
1334# endif
1335 eor r3,r7,r8 @ a^b, b^c in next round
1336#else
1337 ldr r2,[sp,#7*4] @ from future BODY_16_xx
1338 eor r3,r7,r8 @ a^b, b^c in next round
1339 ldr r1,[sp,#4*4] @ from future BODY_16_xx
1340#endif
1341 eor r0,r0,r7,ror#20 @ Sigma0(a)
1342 and r12,r12,r3 @ (b^c)&=(a^b)
1343 add r10,r10,r6 @ d+=h
1344 eor r12,r12,r8 @ Maj(a,b,c)
1345 add r6,r6,r0,ror#2 @ h+=Sigma0(a)
1346 @ add r6,r6,r12 @ h+=Maj(a,b,c)
1347 @ ldr r2,[sp,#7*4] @ 22
1348 @ ldr r1,[sp,#4*4]
1349 mov r0,r2,ror#7
1350 add r6,r6,r12 @ h+=Maj(a,b,c) from the past
1351 mov r12,r1,ror#17
1352 eor r0,r0,r2,ror#18
1353 eor r12,r12,r1,ror#19
1354 eor r0,r0,r2,lsr#3 @ sigma0(X[i+1])
1355 ldr r2,[sp,#6*4]
1356 eor r12,r12,r1,lsr#10 @ sigma1(X[i+14])
1357 ldr r1,[sp,#15*4]
1358
1359 add r12,r12,r0
1360 eor r0,r10,r10,ror#5 @ from BODY_00_15
1361 add r2,r2,r12
1362 eor r0,r0,r10,ror#19 @ Sigma1(e)
1363 add r2,r2,r1 @ X[i]
1364 ldr r12,[r14],#4 @ *K256++
1365 add r5,r5,r2 @ h+=X[i]
1366 str r2,[sp,#6*4]
1367 eor r2,r11,r4
1368 add r5,r5,r0,ror#6 @ h+=Sigma1(e)
1369 and r2,r2,r10
1370 add r5,r5,r12 @ h+=K256[i]
1371 eor r2,r2,r4 @ Ch(e,f,g)
1372 eor r0,r6,r6,ror#11
1373 add r5,r5,r2 @ h+=Ch(e,f,g)
1374#if 22==31
1375 and r12,r12,#0xff
1376 cmp r12,#0xf2 @ done?
1377#endif
1378#if 22<15
1379# if __ARM_ARCH__>=7
1380 ldr r2,[r1],#4 @ prefetch
1381# else
1382 ldrb r2,[r1,#3]
1383# endif
1384 eor r12,r6,r7 @ a^b, b^c in next round
1385#else
1386 ldr r2,[sp,#8*4] @ from future BODY_16_xx
1387 eor r12,r6,r7 @ a^b, b^c in next round
1388 ldr r1,[sp,#5*4] @ from future BODY_16_xx
1389#endif
1390 eor r0,r0,r6,ror#20 @ Sigma0(a)
1391 and r3,r3,r12 @ (b^c)&=(a^b)
1392 add r9,r9,r5 @ d+=h
1393 eor r3,r3,r7 @ Maj(a,b,c)
1394 add r5,r5,r0,ror#2 @ h+=Sigma0(a)
1395 @ add r5,r5,r3 @ h+=Maj(a,b,c)
1396 @ ldr r2,[sp,#8*4] @ 23
1397 @ ldr r1,[sp,#5*4]
1398 mov r0,r2,ror#7
1399 add r5,r5,r3 @ h+=Maj(a,b,c) from the past
1400 mov r3,r1,ror#17
1401 eor r0,r0,r2,ror#18
1402 eor r3,r3,r1,ror#19
1403 eor r0,r0,r2,lsr#3 @ sigma0(X[i+1])
1404 ldr r2,[sp,#7*4]
1405 eor r3,r3,r1,lsr#10 @ sigma1(X[i+14])
1406 ldr r1,[sp,#0*4]
1407
1408 add r3,r3,r0
1409 eor r0,r9,r9,ror#5 @ from BODY_00_15
1410 add r2,r2,r3
1411 eor r0,r0,r9,ror#19 @ Sigma1(e)
1412 add r2,r2,r1 @ X[i]
1413 ldr r3,[r14],#4 @ *K256++
1414 add r4,r4,r2 @ h+=X[i]
1415 str r2,[sp,#7*4]
1416 eor r2,r10,r11
1417 add r4,r4,r0,ror#6 @ h+=Sigma1(e)
1418 and r2,r2,r9
1419 add r4,r4,r3 @ h+=K256[i]
1420 eor r2,r2,r11 @ Ch(e,f,g)
1421 eor r0,r5,r5,ror#11
1422 add r4,r4,r2 @ h+=Ch(e,f,g)
1423#if 23==31
1424 and r3,r3,#0xff
1425 cmp r3,#0xf2 @ done?
1426#endif
1427#if 23<15
1428# if __ARM_ARCH__>=7
1429 ldr r2,[r1],#4 @ prefetch
1430# else
1431 ldrb r2,[r1,#3]
1432# endif
1433 eor r3,r5,r6 @ a^b, b^c in next round
1434#else
1435 ldr r2,[sp,#9*4] @ from future BODY_16_xx
1436 eor r3,r5,r6 @ a^b, b^c in next round
1437 ldr r1,[sp,#6*4] @ from future BODY_16_xx
1438#endif
1439 eor r0,r0,r5,ror#20 @ Sigma0(a)
1440 and r12,r12,r3 @ (b^c)&=(a^b)
1441 add r8,r8,r4 @ d+=h
1442 eor r12,r12,r6 @ Maj(a,b,c)
1443 add r4,r4,r0,ror#2 @ h+=Sigma0(a)
1444 @ add r4,r4,r12 @ h+=Maj(a,b,c)
1445 @ ldr r2,[sp,#9*4] @ 24
1446 @ ldr r1,[sp,#6*4]
1447 mov r0,r2,ror#7
1448 add r4,r4,r12 @ h+=Maj(a,b,c) from the past
1449 mov r12,r1,ror#17
1450 eor r0,r0,r2,ror#18
1451 eor r12,r12,r1,ror#19
1452 eor r0,r0,r2,lsr#3 @ sigma0(X[i+1])
1453 ldr r2,[sp,#8*4]
1454 eor r12,r12,r1,lsr#10 @ sigma1(X[i+14])
1455 ldr r1,[sp,#1*4]
1456
1457 add r12,r12,r0
1458 eor r0,r8,r8,ror#5 @ from BODY_00_15
1459 add r2,r2,r12
1460 eor r0,r0,r8,ror#19 @ Sigma1(e)
1461 add r2,r2,r1 @ X[i]
1462 ldr r12,[r14],#4 @ *K256++
1463 add r11,r11,r2 @ h+=X[i]
1464 str r2,[sp,#8*4]
1465 eor r2,r9,r10
1466 add r11,r11,r0,ror#6 @ h+=Sigma1(e)
1467 and r2,r2,r8
1468 add r11,r11,r12 @ h+=K256[i]
1469 eor r2,r2,r10 @ Ch(e,f,g)
1470 eor r0,r4,r4,ror#11
1471 add r11,r11,r2 @ h+=Ch(e,f,g)
1472#if 24==31
1473 and r12,r12,#0xff
1474 cmp r12,#0xf2 @ done?
1475#endif
1476#if 24<15
1477# if __ARM_ARCH__>=7
1478 ldr r2,[r1],#4 @ prefetch
1479# else
1480 ldrb r2,[r1,#3]
1481# endif
1482 eor r12,r4,r5 @ a^b, b^c in next round
1483#else
1484 ldr r2,[sp,#10*4] @ from future BODY_16_xx
1485 eor r12,r4,r5 @ a^b, b^c in next round
1486 ldr r1,[sp,#7*4] @ from future BODY_16_xx
1487#endif
1488 eor r0,r0,r4,ror#20 @ Sigma0(a)
1489 and r3,r3,r12 @ (b^c)&=(a^b)
1490 add r7,r7,r11 @ d+=h
1491 eor r3,r3,r5 @ Maj(a,b,c)
1492 add r11,r11,r0,ror#2 @ h+=Sigma0(a)
1493 @ add r11,r11,r3 @ h+=Maj(a,b,c)
1494 @ ldr r2,[sp,#10*4] @ 25
1495 @ ldr r1,[sp,#7*4]
1496 mov r0,r2,ror#7
1497 add r11,r11,r3 @ h+=Maj(a,b,c) from the past
1498 mov r3,r1,ror#17
1499 eor r0,r0,r2,ror#18
1500 eor r3,r3,r1,ror#19
1501 eor r0,r0,r2,lsr#3 @ sigma0(X[i+1])
1502 ldr r2,[sp,#9*4]
1503 eor r3,r3,r1,lsr#10 @ sigma1(X[i+14])
1504 ldr r1,[sp,#2*4]
1505
1506 add r3,r3,r0
1507 eor r0,r7,r7,ror#5 @ from BODY_00_15
1508 add r2,r2,r3
1509 eor r0,r0,r7,ror#19 @ Sigma1(e)
1510 add r2,r2,r1 @ X[i]
1511 ldr r3,[r14],#4 @ *K256++
1512 add r10,r10,r2 @ h+=X[i]
1513 str r2,[sp,#9*4]
1514 eor r2,r8,r9
1515 add r10,r10,r0,ror#6 @ h+=Sigma1(e)
1516 and r2,r2,r7
1517 add r10,r10,r3 @ h+=K256[i]
1518 eor r2,r2,r9 @ Ch(e,f,g)
1519 eor r0,r11,r11,ror#11
1520 add r10,r10,r2 @ h+=Ch(e,f,g)
1521#if 25==31
1522 and r3,r3,#0xff
1523 cmp r3,#0xf2 @ done?
1524#endif
1525#if 25<15
1526# if __ARM_ARCH__>=7
1527 ldr r2,[r1],#4 @ prefetch
1528# else
1529 ldrb r2,[r1,#3]
1530# endif
1531 eor r3,r11,r4 @ a^b, b^c in next round
1532#else
1533 ldr r2,[sp,#11*4] @ from future BODY_16_xx
1534 eor r3,r11,r4 @ a^b, b^c in next round
1535 ldr r1,[sp,#8*4] @ from future BODY_16_xx
1536#endif
1537 eor r0,r0,r11,ror#20 @ Sigma0(a)
1538 and r12,r12,r3 @ (b^c)&=(a^b)
1539 add r6,r6,r10 @ d+=h
1540 eor r12,r12,r4 @ Maj(a,b,c)
1541 add r10,r10,r0,ror#2 @ h+=Sigma0(a)
1542 @ add r10,r10,r12 @ h+=Maj(a,b,c)
1543 @ ldr r2,[sp,#11*4] @ 26
1544 @ ldr r1,[sp,#8*4]
1545 mov r0,r2,ror#7
1546 add r10,r10,r12 @ h+=Maj(a,b,c) from the past
1547 mov r12,r1,ror#17
1548 eor r0,r0,r2,ror#18
1549 eor r12,r12,r1,ror#19
1550 eor r0,r0,r2,lsr#3 @ sigma0(X[i+1])
1551 ldr r2,[sp,#10*4]
1552 eor r12,r12,r1,lsr#10 @ sigma1(X[i+14])
1553 ldr r1,[sp,#3*4]
1554
1555 add r12,r12,r0
1556 eor r0,r6,r6,ror#5 @ from BODY_00_15
1557 add r2,r2,r12
1558 eor r0,r0,r6,ror#19 @ Sigma1(e)
1559 add r2,r2,r1 @ X[i]
1560 ldr r12,[r14],#4 @ *K256++
1561 add r9,r9,r2 @ h+=X[i]
1562 str r2,[sp,#10*4]
1563 eor r2,r7,r8
1564 add r9,r9,r0,ror#6 @ h+=Sigma1(e)
1565 and r2,r2,r6
1566 add r9,r9,r12 @ h+=K256[i]
1567 eor r2,r2,r8 @ Ch(e,f,g)
1568 eor r0,r10,r10,ror#11
1569 add r9,r9,r2 @ h+=Ch(e,f,g)
1570#if 26==31
1571 and r12,r12,#0xff
1572 cmp r12,#0xf2 @ done?
1573#endif
1574#if 26<15
1575# if __ARM_ARCH__>=7
1576 ldr r2,[r1],#4 @ prefetch
1577# else
1578 ldrb r2,[r1,#3]
1579# endif
1580 eor r12,r10,r11 @ a^b, b^c in next round
1581#else
1582 ldr r2,[sp,#12*4] @ from future BODY_16_xx
1583 eor r12,r10,r11 @ a^b, b^c in next round
1584 ldr r1,[sp,#9*4] @ from future BODY_16_xx
1585#endif
1586 eor r0,r0,r10,ror#20 @ Sigma0(a)
1587 and r3,r3,r12 @ (b^c)&=(a^b)
1588 add r5,r5,r9 @ d+=h
1589 eor r3,r3,r11 @ Maj(a,b,c)
1590 add r9,r9,r0,ror#2 @ h+=Sigma0(a)
1591 @ add r9,r9,r3 @ h+=Maj(a,b,c)
1592 @ ldr r2,[sp,#12*4] @ 27
1593 @ ldr r1,[sp,#9*4]
1594 mov r0,r2,ror#7
1595 add r9,r9,r3 @ h+=Maj(a,b,c) from the past
1596 mov r3,r1,ror#17
1597 eor r0,r0,r2,ror#18
1598 eor r3,r3,r1,ror#19
1599 eor r0,r0,r2,lsr#3 @ sigma0(X[i+1])
1600 ldr r2,[sp,#11*4]
1601 eor r3,r3,r1,lsr#10 @ sigma1(X[i+14])
1602 ldr r1,[sp,#4*4]
1603
1604 add r3,r3,r0
1605 eor r0,r5,r5,ror#5 @ from BODY_00_15
1606 add r2,r2,r3
1607 eor r0,r0,r5,ror#19 @ Sigma1(e)
1608 add r2,r2,r1 @ X[i]
1609 ldr r3,[r14],#4 @ *K256++
1610 add r8,r8,r2 @ h+=X[i]
1611 str r2,[sp,#11*4]
1612 eor r2,r6,r7
1613 add r8,r8,r0,ror#6 @ h+=Sigma1(e)
1614 and r2,r2,r5
1615 add r8,r8,r3 @ h+=K256[i]
1616 eor r2,r2,r7 @ Ch(e,f,g)
1617 eor r0,r9,r9,ror#11
1618 add r8,r8,r2 @ h+=Ch(e,f,g)
1619#if 27==31
1620 and r3,r3,#0xff
1621 cmp r3,#0xf2 @ done?
1622#endif
1623#if 27<15
1624# if __ARM_ARCH__>=7
1625 ldr r2,[r1],#4 @ prefetch
1626# else
1627 ldrb r2,[r1,#3]
1628# endif
1629 eor r3,r9,r10 @ a^b, b^c in next round
1630#else
1631 ldr r2,[sp,#13*4] @ from future BODY_16_xx
1632 eor r3,r9,r10 @ a^b, b^c in next round
1633 ldr r1,[sp,#10*4] @ from future BODY_16_xx
1634#endif
1635 eor r0,r0,r9,ror#20 @ Sigma0(a)
1636 and r12,r12,r3 @ (b^c)&=(a^b)
1637 add r4,r4,r8 @ d+=h
1638 eor r12,r12,r10 @ Maj(a,b,c)
1639 add r8,r8,r0,ror#2 @ h+=Sigma0(a)
1640 @ add r8,r8,r12 @ h+=Maj(a,b,c)
1641 @ ldr r2,[sp,#13*4] @ 28
1642 @ ldr r1,[sp,#10*4]
1643 mov r0,r2,ror#7
1644 add r8,r8,r12 @ h+=Maj(a,b,c) from the past
1645 mov r12,r1,ror#17
1646 eor r0,r0,r2,ror#18
1647 eor r12,r12,r1,ror#19
1648 eor r0,r0,r2,lsr#3 @ sigma0(X[i+1])
1649 ldr r2,[sp,#12*4]
1650 eor r12,r12,r1,lsr#10 @ sigma1(X[i+14])
1651 ldr r1,[sp,#5*4]
1652
1653 add r12,r12,r0
1654 eor r0,r4,r4,ror#5 @ from BODY_00_15
1655 add r2,r2,r12
1656 eor r0,r0,r4,ror#19 @ Sigma1(e)
1657 add r2,r2,r1 @ X[i]
1658 ldr r12,[r14],#4 @ *K256++
1659 add r7,r7,r2 @ h+=X[i]
1660 str r2,[sp,#12*4]
1661 eor r2,r5,r6
1662 add r7,r7,r0,ror#6 @ h+=Sigma1(e)
1663 and r2,r2,r4
1664 add r7,r7,r12 @ h+=K256[i]
1665 eor r2,r2,r6 @ Ch(e,f,g)
1666 eor r0,r8,r8,ror#11
1667 add r7,r7,r2 @ h+=Ch(e,f,g)
1668#if 28==31
1669 and r12,r12,#0xff
1670 cmp r12,#0xf2 @ done?
1671#endif
1672#if 28<15
1673# if __ARM_ARCH__>=7
1674 ldr r2,[r1],#4 @ prefetch
1675# else
1676 ldrb r2,[r1,#3]
1677# endif
1678 eor r12,r8,r9 @ a^b, b^c in next round
1679#else
1680 ldr r2,[sp,#14*4] @ from future BODY_16_xx
1681 eor r12,r8,r9 @ a^b, b^c in next round
1682 ldr r1,[sp,#11*4] @ from future BODY_16_xx
1683#endif
1684 eor r0,r0,r8,ror#20 @ Sigma0(a)
1685 and r3,r3,r12 @ (b^c)&=(a^b)
1686 add r11,r11,r7 @ d+=h
1687 eor r3,r3,r9 @ Maj(a,b,c)
1688 add r7,r7,r0,ror#2 @ h+=Sigma0(a)
1689 @ add r7,r7,r3 @ h+=Maj(a,b,c)
1690 @ ldr r2,[sp,#14*4] @ 29
1691 @ ldr r1,[sp,#11*4]
1692 mov r0,r2,ror#7
1693 add r7,r7,r3 @ h+=Maj(a,b,c) from the past
1694 mov r3,r1,ror#17
1695 eor r0,r0,r2,ror#18
1696 eor r3,r3,r1,ror#19
1697 eor r0,r0,r2,lsr#3 @ sigma0(X[i+1])
1698 ldr r2,[sp,#13*4]
1699 eor r3,r3,r1,lsr#10 @ sigma1(X[i+14])
1700 ldr r1,[sp,#6*4]
1701
1702 add r3,r3,r0
1703 eor r0,r11,r11,ror#5 @ from BODY_00_15
1704 add r2,r2,r3
1705 eor r0,r0,r11,ror#19 @ Sigma1(e)
1706 add r2,r2,r1 @ X[i]
1707 ldr r3,[r14],#4 @ *K256++
1708 add r6,r6,r2 @ h+=X[i]
1709 str r2,[sp,#13*4]
1710 eor r2,r4,r5
1711 add r6,r6,r0,ror#6 @ h+=Sigma1(e)
1712 and r2,r2,r11
1713 add r6,r6,r3 @ h+=K256[i]
1714 eor r2,r2,r5 @ Ch(e,f,g)
1715 eor r0,r7,r7,ror#11
1716 add r6,r6,r2 @ h+=Ch(e,f,g)
1717#if 29==31
1718 and r3,r3,#0xff
1719 cmp r3,#0xf2 @ done?
1720#endif
1721#if 29<15
1722# if __ARM_ARCH__>=7
1723 ldr r2,[r1],#4 @ prefetch
1724# else
1725 ldrb r2,[r1,#3]
1726# endif
1727 eor r3,r7,r8 @ a^b, b^c in next round
1728#else
1729 ldr r2,[sp,#15*4] @ from future BODY_16_xx
1730 eor r3,r7,r8 @ a^b, b^c in next round
1731 ldr r1,[sp,#12*4] @ from future BODY_16_xx
1732#endif
1733 eor r0,r0,r7,ror#20 @ Sigma0(a)
1734 and r12,r12,r3 @ (b^c)&=(a^b)
1735 add r10,r10,r6 @ d+=h
1736 eor r12,r12,r8 @ Maj(a,b,c)
1737 add r6,r6,r0,ror#2 @ h+=Sigma0(a)
1738 @ add r6,r6,r12 @ h+=Maj(a,b,c)
1739 @ ldr r2,[sp,#15*4] @ 30
1740 @ ldr r1,[sp,#12*4]
1741 mov r0,r2,ror#7
1742 add r6,r6,r12 @ h+=Maj(a,b,c) from the past
1743 mov r12,r1,ror#17
1744 eor r0,r0,r2,ror#18
1745 eor r12,r12,r1,ror#19
1746 eor r0,r0,r2,lsr#3 @ sigma0(X[i+1])
1747 ldr r2,[sp,#14*4]
1748 eor r12,r12,r1,lsr#10 @ sigma1(X[i+14])
1749 ldr r1,[sp,#7*4]
1750
1751 add r12,r12,r0
1752 eor r0,r10,r10,ror#5 @ from BODY_00_15
1753 add r2,r2,r12
1754 eor r0,r0,r10,ror#19 @ Sigma1(e)
1755 add r2,r2,r1 @ X[i]
1756 ldr r12,[r14],#4 @ *K256++
1757 add r5,r5,r2 @ h+=X[i]
1758 str r2,[sp,#14*4]
1759 eor r2,r11,r4
1760 add r5,r5,r0,ror#6 @ h+=Sigma1(e)
1761 and r2,r2,r10
1762 add r5,r5,r12 @ h+=K256[i]
1763 eor r2,r2,r4 @ Ch(e,f,g)
1764 eor r0,r6,r6,ror#11
1765 add r5,r5,r2 @ h+=Ch(e,f,g)
1766#if 30==31
1767 and r12,r12,#0xff
1768 cmp r12,#0xf2 @ done?
1769#endif
1770#if 30<15
1771# if __ARM_ARCH__>=7
1772 ldr r2,[r1],#4 @ prefetch
1773# else
1774 ldrb r2,[r1,#3]
1775# endif
1776 eor r12,r6,r7 @ a^b, b^c in next round
1777#else
1778 ldr r2,[sp,#0*4] @ from future BODY_16_xx
1779 eor r12,r6,r7 @ a^b, b^c in next round
1780 ldr r1,[sp,#13*4] @ from future BODY_16_xx
1781#endif
1782 eor r0,r0,r6,ror#20 @ Sigma0(a)
1783 and r3,r3,r12 @ (b^c)&=(a^b)
1784 add r9,r9,r5 @ d+=h
1785 eor r3,r3,r7 @ Maj(a,b,c)
1786 add r5,r5,r0,ror#2 @ h+=Sigma0(a)
1787 @ add r5,r5,r3 @ h+=Maj(a,b,c)
1788 @ ldr r2,[sp,#0*4] @ 31
1789 @ ldr r1,[sp,#13*4]
1790 mov r0,r2,ror#7
1791 add r5,r5,r3 @ h+=Maj(a,b,c) from the past
1792 mov r3,r1,ror#17
1793 eor r0,r0,r2,ror#18
1794 eor r3,r3,r1,ror#19
1795 eor r0,r0,r2,lsr#3 @ sigma0(X[i+1])
1796 ldr r2,[sp,#15*4]
1797 eor r3,r3,r1,lsr#10 @ sigma1(X[i+14])
1798 ldr r1,[sp,#8*4]
1799
1800 add r3,r3,r0
1801 eor r0,r9,r9,ror#5 @ from BODY_00_15
1802 add r2,r2,r3
1803 eor r0,r0,r9,ror#19 @ Sigma1(e)
1804 add r2,r2,r1 @ X[i]
1805 ldr r3,[r14],#4 @ *K256++
1806 add r4,r4,r2 @ h+=X[i]
1807 str r2,[sp,#15*4]
1808 eor r2,r10,r11
1809 add r4,r4,r0,ror#6 @ h+=Sigma1(e)
1810 and r2,r2,r9
1811 add r4,r4,r3 @ h+=K256[i]
1812 eor r2,r2,r11 @ Ch(e,f,g)
1813 eor r0,r5,r5,ror#11
1814 add r4,r4,r2 @ h+=Ch(e,f,g)
1815#if 31==31
1816 and r3,r3,#0xff
1817 cmp r3,#0xf2 @ done?
1818#endif
1819#if 31<15
1820# if __ARM_ARCH__>=7
1821 ldr r2,[r1],#4 @ prefetch
1822# else
1823 ldrb r2,[r1,#3]
1824# endif
1825 eor r3,r5,r6 @ a^b, b^c in next round
1826#else
1827 ldr r2,[sp,#1*4] @ from future BODY_16_xx
1828 eor r3,r5,r6 @ a^b, b^c in next round
1829 ldr r1,[sp,#14*4] @ from future BODY_16_xx
1830#endif
1831 eor r0,r0,r5,ror#20 @ Sigma0(a)
1832 and r12,r12,r3 @ (b^c)&=(a^b)
1833 add r8,r8,r4 @ d+=h
1834 eor r12,r12,r6 @ Maj(a,b,c)
1835 add r4,r4,r0,ror#2 @ h+=Sigma0(a)
1836 @ add r4,r4,r12 @ h+=Maj(a,b,c)
1837#if __ARM_ARCH__>=7
1838 ite eq @ Thumb2 thing, sanity check in ARM
1839#endif
1840 ldreq r3,[sp,#16*4] @ pull ctx
1841 bne Lrounds_16_xx
1842
1843 add r4,r4,r12 @ h+=Maj(a,b,c) from the past
1844 ldr r0,[r3,#0]
1845 ldr r2,[r3,#4]
1846 ldr r12,[r3,#8]
1847 add r4,r4,r0
1848 ldr r0,[r3,#12]
1849 add r5,r5,r2
1850 ldr r2,[r3,#16]
1851 add r6,r6,r12
1852 ldr r12,[r3,#20]
1853 add r7,r7,r0
1854 ldr r0,[r3,#24]
1855 add r8,r8,r2
1856 ldr r2,[r3,#28]
1857 add r9,r9,r12
1858 ldr r1,[sp,#17*4] @ pull inp
1859 ldr r12,[sp,#18*4] @ pull inp+len
1860 add r10,r10,r0
1861 add r11,r11,r2
1862 stmia r3,{r4,r5,r6,r7,r8,r9,r10,r11}
1863 cmp r1,r12
1864 sub r14,r14,#256 @ rewind Ktbl
1865 bne Loop
1866
1867 add sp,sp,#19*4 @ destroy frame
1868#if __ARM_ARCH__>=5
1869 ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,pc}
1870#else
1871 ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,lr}
1872 tst lr,#1
1873 moveq pc,lr @ be binary compatible with V4, yet
1874.word 0xe12fff1e @ interoperable with Thumb ISA:-)
1875#endif
1876
1877#if __ARM_MAX_ARCH__>=7
1878
1879
1880
1881.globl _sha256_block_data_order_neon
1882.private_extern _sha256_block_data_order_neon
1883#ifdef __thumb2__
1884.thumb_func _sha256_block_data_order_neon
1885#endif
1886.align 5
1887.skip 16
1888_sha256_block_data_order_neon:
1889LNEON:
1890 stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr}
1891
1892 sub r11,sp,#16*4+16
1893 adr r14,K256
1894 bic r11,r11,#15 @ align for 128-bit stores
1895 mov r12,sp
1896 mov sp,r11 @ alloca
1897 add r2,r1,r2,lsl#6 @ len to point at the end of inp
1898
1899 vld1.8 {q0},[r1]!
1900 vld1.8 {q1},[r1]!
1901 vld1.8 {q2},[r1]!
1902 vld1.8 {q3},[r1]!
1903 vld1.32 {q8},[r14,:128]!
1904 vld1.32 {q9},[r14,:128]!
1905 vld1.32 {q10},[r14,:128]!
1906 vld1.32 {q11},[r14,:128]!
1907 vrev32.8 q0,q0 @ yes, even on
1908 str r0,[sp,#64]
1909 vrev32.8 q1,q1 @ big-endian
1910 str r1,[sp,#68]
1911 mov r1,sp
1912 vrev32.8 q2,q2
1913 str r2,[sp,#72]
1914 vrev32.8 q3,q3
1915 str r12,[sp,#76] @ save original sp
1916 vadd.i32 q8,q8,q0
1917 vadd.i32 q9,q9,q1
1918 vst1.32 {q8},[r1,:128]!
1919 vadd.i32 q10,q10,q2
1920 vst1.32 {q9},[r1,:128]!
1921 vadd.i32 q11,q11,q3
1922 vst1.32 {q10},[r1,:128]!
1923 vst1.32 {q11},[r1,:128]!
1924
1925 ldmia r0,{r4,r5,r6,r7,r8,r9,r10,r11}
1926 sub r1,r1,#64
1927 ldr r2,[sp,#0]
1928 eor r12,r12,r12
1929 eor r3,r5,r6
1930 b L_00_48
1931
1932.align 4
1933L_00_48:
1934 vext.8 q8,q0,q1,#4
1935 add r11,r11,r2
1936 eor r2,r9,r10
1937 eor r0,r8,r8,ror#5
1938 vext.8 q9,q2,q3,#4
1939 add r4,r4,r12
1940 and r2,r2,r8
1941 eor r12,r0,r8,ror#19
1942 vshr.u32 q10,q8,#7
1943 eor r0,r4,r4,ror#11
1944 eor r2,r2,r10
1945 vadd.i32 q0,q0,q9
1946 add r11,r11,r12,ror#6
1947 eor r12,r4,r5
1948 vshr.u32 q9,q8,#3
1949 eor r0,r0,r4,ror#20
1950 add r11,r11,r2
1951 vsli.32 q10,q8,#25
1952 ldr r2,[sp,#4]
1953 and r3,r3,r12
1954 vshr.u32 q11,q8,#18
1955 add r7,r7,r11
1956 add r11,r11,r0,ror#2
1957 eor r3,r3,r5
1958 veor q9,q9,q10
1959 add r10,r10,r2
1960 vsli.32 q11,q8,#14
1961 eor r2,r8,r9
1962 eor r0,r7,r7,ror#5
1963 vshr.u32 d24,d7,#17
1964 add r11,r11,r3
1965 and r2,r2,r7
1966 veor q9,q9,q11
1967 eor r3,r0,r7,ror#19
1968 eor r0,r11,r11,ror#11
1969 vsli.32 d24,d7,#15
1970 eor r2,r2,r9
1971 add r10,r10,r3,ror#6
1972 vshr.u32 d25,d7,#10
1973 eor r3,r11,r4
1974 eor r0,r0,r11,ror#20
1975 vadd.i32 q0,q0,q9
1976 add r10,r10,r2
1977 ldr r2,[sp,#8]
1978 veor d25,d25,d24
1979 and r12,r12,r3
1980 add r6,r6,r10
1981 vshr.u32 d24,d7,#19
1982 add r10,r10,r0,ror#2
1983 eor r12,r12,r4
1984 vsli.32 d24,d7,#13
1985 add r9,r9,r2
1986 eor r2,r7,r8
1987 veor d25,d25,d24
1988 eor r0,r6,r6,ror#5
1989 add r10,r10,r12
1990 vadd.i32 d0,d0,d25
1991 and r2,r2,r6
1992 eor r12,r0,r6,ror#19
1993 vshr.u32 d24,d0,#17
1994 eor r0,r10,r10,ror#11
1995 eor r2,r2,r8
1996 vsli.32 d24,d0,#15
1997 add r9,r9,r12,ror#6
1998 eor r12,r10,r11
1999 vshr.u32 d25,d0,#10
2000 eor r0,r0,r10,ror#20
2001 add r9,r9,r2
2002 veor d25,d25,d24
2003 ldr r2,[sp,#12]
2004 and r3,r3,r12
2005 vshr.u32 d24,d0,#19
2006 add r5,r5,r9
2007 add r9,r9,r0,ror#2
2008 eor r3,r3,r11
2009 vld1.32 {q8},[r14,:128]!
2010 add r8,r8,r2
2011 vsli.32 d24,d0,#13
2012 eor r2,r6,r7
2013 eor r0,r5,r5,ror#5
2014 veor d25,d25,d24
2015 add r9,r9,r3
2016 and r2,r2,r5
2017 vadd.i32 d1,d1,d25
2018 eor r3,r0,r5,ror#19
2019 eor r0,r9,r9,ror#11
2020 vadd.i32 q8,q8,q0
2021 eor r2,r2,r7
2022 add r8,r8,r3,ror#6
2023 eor r3,r9,r10
2024 eor r0,r0,r9,ror#20
2025 add r8,r8,r2
2026 ldr r2,[sp,#16]
2027 and r12,r12,r3
2028 add r4,r4,r8
2029 vst1.32 {q8},[r1,:128]!
2030 add r8,r8,r0,ror#2
2031 eor r12,r12,r10
2032 vext.8 q8,q1,q2,#4
2033 add r7,r7,r2
2034 eor r2,r5,r6
2035 eor r0,r4,r4,ror#5
2036 vext.8 q9,q3,q0,#4
2037 add r8,r8,r12
2038 and r2,r2,r4
2039 eor r12,r0,r4,ror#19
2040 vshr.u32 q10,q8,#7
2041 eor r0,r8,r8,ror#11
2042 eor r2,r2,r6
2043 vadd.i32 q1,q1,q9
2044 add r7,r7,r12,ror#6
2045 eor r12,r8,r9
2046 vshr.u32 q9,q8,#3
2047 eor r0,r0,r8,ror#20
2048 add r7,r7,r2
2049 vsli.32 q10,q8,#25
2050 ldr r2,[sp,#20]
2051 and r3,r3,r12
2052 vshr.u32 q11,q8,#18
2053 add r11,r11,r7
2054 add r7,r7,r0,ror#2
2055 eor r3,r3,r9
2056 veor q9,q9,q10
2057 add r6,r6,r2
2058 vsli.32 q11,q8,#14
2059 eor r2,r4,r5
2060 eor r0,r11,r11,ror#5
2061 vshr.u32 d24,d1,#17
2062 add r7,r7,r3
2063 and r2,r2,r11
2064 veor q9,q9,q11
2065 eor r3,r0,r11,ror#19
2066 eor r0,r7,r7,ror#11
2067 vsli.32 d24,d1,#15
2068 eor r2,r2,r5
2069 add r6,r6,r3,ror#6
2070 vshr.u32 d25,d1,#10
2071 eor r3,r7,r8
2072 eor r0,r0,r7,ror#20
2073 vadd.i32 q1,q1,q9
2074 add r6,r6,r2
2075 ldr r2,[sp,#24]
2076 veor d25,d25,d24
2077 and r12,r12,r3
2078 add r10,r10,r6
2079 vshr.u32 d24,d1,#19
2080 add r6,r6,r0,ror#2
2081 eor r12,r12,r8
2082 vsli.32 d24,d1,#13
2083 add r5,r5,r2
2084 eor r2,r11,r4
2085 veor d25,d25,d24
2086 eor r0,r10,r10,ror#5
2087 add r6,r6,r12
2088 vadd.i32 d2,d2,d25
2089 and r2,r2,r10
2090 eor r12,r0,r10,ror#19
2091 vshr.u32 d24,d2,#17
2092 eor r0,r6,r6,ror#11
2093 eor r2,r2,r4
2094 vsli.32 d24,d2,#15
2095 add r5,r5,r12,ror#6
2096 eor r12,r6,r7
2097 vshr.u32 d25,d2,#10
2098 eor r0,r0,r6,ror#20
2099 add r5,r5,r2
2100 veor d25,d25,d24
2101 ldr r2,[sp,#28]
2102 and r3,r3,r12
2103 vshr.u32 d24,d2,#19
2104 add r9,r9,r5
2105 add r5,r5,r0,ror#2
2106 eor r3,r3,r7
2107 vld1.32 {q8},[r14,:128]!
2108 add r4,r4,r2
2109 vsli.32 d24,d2,#13
2110 eor r2,r10,r11
2111 eor r0,r9,r9,ror#5
2112 veor d25,d25,d24
2113 add r5,r5,r3
2114 and r2,r2,r9
2115 vadd.i32 d3,d3,d25
2116 eor r3,r0,r9,ror#19
2117 eor r0,r5,r5,ror#11
2118 vadd.i32 q8,q8,q1
2119 eor r2,r2,r11
2120 add r4,r4,r3,ror#6
2121 eor r3,r5,r6
2122 eor r0,r0,r5,ror#20
2123 add r4,r4,r2
2124 ldr r2,[sp,#32]
2125 and r12,r12,r3
2126 add r8,r8,r4
2127 vst1.32 {q8},[r1,:128]!
2128 add r4,r4,r0,ror#2
2129 eor r12,r12,r6
2130 vext.8 q8,q2,q3,#4
2131 add r11,r11,r2
2132 eor r2,r9,r10
2133 eor r0,r8,r8,ror#5
2134 vext.8 q9,q0,q1,#4
2135 add r4,r4,r12
2136 and r2,r2,r8
2137 eor r12,r0,r8,ror#19
2138 vshr.u32 q10,q8,#7
2139 eor r0,r4,r4,ror#11
2140 eor r2,r2,r10
2141 vadd.i32 q2,q2,q9
2142 add r11,r11,r12,ror#6
2143 eor r12,r4,r5
2144 vshr.u32 q9,q8,#3
2145 eor r0,r0,r4,ror#20
2146 add r11,r11,r2
2147 vsli.32 q10,q8,#25
2148 ldr r2,[sp,#36]
2149 and r3,r3,r12
2150 vshr.u32 q11,q8,#18
2151 add r7,r7,r11
2152 add r11,r11,r0,ror#2
2153 eor r3,r3,r5
2154 veor q9,q9,q10
2155 add r10,r10,r2
2156 vsli.32 q11,q8,#14
2157 eor r2,r8,r9
2158 eor r0,r7,r7,ror#5
2159 vshr.u32 d24,d3,#17
2160 add r11,r11,r3
2161 and r2,r2,r7
2162 veor q9,q9,q11
2163 eor r3,r0,r7,ror#19
2164 eor r0,r11,r11,ror#11
2165 vsli.32 d24,d3,#15
2166 eor r2,r2,r9
2167 add r10,r10,r3,ror#6
2168 vshr.u32 d25,d3,#10
2169 eor r3,r11,r4
2170 eor r0,r0,r11,ror#20
2171 vadd.i32 q2,q2,q9
2172 add r10,r10,r2
2173 ldr r2,[sp,#40]
2174 veor d25,d25,d24
2175 and r12,r12,r3
2176 add r6,r6,r10
2177 vshr.u32 d24,d3,#19
2178 add r10,r10,r0,ror#2
2179 eor r12,r12,r4
2180 vsli.32 d24,d3,#13
2181 add r9,r9,r2
2182 eor r2,r7,r8
2183 veor d25,d25,d24
2184 eor r0,r6,r6,ror#5
2185 add r10,r10,r12
2186 vadd.i32 d4,d4,d25
2187 and r2,r2,r6
2188 eor r12,r0,r6,ror#19
2189 vshr.u32 d24,d4,#17
2190 eor r0,r10,r10,ror#11
2191 eor r2,r2,r8
2192 vsli.32 d24,d4,#15
2193 add r9,r9,r12,ror#6
2194 eor r12,r10,r11
2195 vshr.u32 d25,d4,#10
2196 eor r0,r0,r10,ror#20
2197 add r9,r9,r2
2198 veor d25,d25,d24
2199 ldr r2,[sp,#44]
2200 and r3,r3,r12
2201 vshr.u32 d24,d4,#19
2202 add r5,r5,r9
2203 add r9,r9,r0,ror#2
2204 eor r3,r3,r11
2205 vld1.32 {q8},[r14,:128]!
2206 add r8,r8,r2
2207 vsli.32 d24,d4,#13
2208 eor r2,r6,r7
2209 eor r0,r5,r5,ror#5
2210 veor d25,d25,d24
2211 add r9,r9,r3
2212 and r2,r2,r5
2213 vadd.i32 d5,d5,d25
2214 eor r3,r0,r5,ror#19
2215 eor r0,r9,r9,ror#11
2216 vadd.i32 q8,q8,q2
2217 eor r2,r2,r7
2218 add r8,r8,r3,ror#6
2219 eor r3,r9,r10
2220 eor r0,r0,r9,ror#20
2221 add r8,r8,r2
2222 ldr r2,[sp,#48]
2223 and r12,r12,r3
2224 add r4,r4,r8
2225 vst1.32 {q8},[r1,:128]!
2226 add r8,r8,r0,ror#2
2227 eor r12,r12,r10
2228 vext.8 q8,q3,q0,#4
2229 add r7,r7,r2
2230 eor r2,r5,r6
2231 eor r0,r4,r4,ror#5
2232 vext.8 q9,q1,q2,#4
2233 add r8,r8,r12
2234 and r2,r2,r4
2235 eor r12,r0,r4,ror#19
2236 vshr.u32 q10,q8,#7
2237 eor r0,r8,r8,ror#11
2238 eor r2,r2,r6
2239 vadd.i32 q3,q3,q9
2240 add r7,r7,r12,ror#6
2241 eor r12,r8,r9
2242 vshr.u32 q9,q8,#3
2243 eor r0,r0,r8,ror#20
2244 add r7,r7,r2
2245 vsli.32 q10,q8,#25
2246 ldr r2,[sp,#52]
2247 and r3,r3,r12
2248 vshr.u32 q11,q8,#18
2249 add r11,r11,r7
2250 add r7,r7,r0,ror#2
2251 eor r3,r3,r9
2252 veor q9,q9,q10
2253 add r6,r6,r2
2254 vsli.32 q11,q8,#14
2255 eor r2,r4,r5
2256 eor r0,r11,r11,ror#5
2257 vshr.u32 d24,d5,#17
2258 add r7,r7,r3
2259 and r2,r2,r11
2260 veor q9,q9,q11
2261 eor r3,r0,r11,ror#19
2262 eor r0,r7,r7,ror#11
2263 vsli.32 d24,d5,#15
2264 eor r2,r2,r5
2265 add r6,r6,r3,ror#6
2266 vshr.u32 d25,d5,#10
2267 eor r3,r7,r8
2268 eor r0,r0,r7,ror#20
2269 vadd.i32 q3,q3,q9
2270 add r6,r6,r2
2271 ldr r2,[sp,#56]
2272 veor d25,d25,d24
2273 and r12,r12,r3
2274 add r10,r10,r6
2275 vshr.u32 d24,d5,#19
2276 add r6,r6,r0,ror#2
2277 eor r12,r12,r8
2278 vsli.32 d24,d5,#13
2279 add r5,r5,r2
2280 eor r2,r11,r4
2281 veor d25,d25,d24
2282 eor r0,r10,r10,ror#5
2283 add r6,r6,r12
2284 vadd.i32 d6,d6,d25
2285 and r2,r2,r10
2286 eor r12,r0,r10,ror#19
2287 vshr.u32 d24,d6,#17
2288 eor r0,r6,r6,ror#11
2289 eor r2,r2,r4
2290 vsli.32 d24,d6,#15
2291 add r5,r5,r12,ror#6
2292 eor r12,r6,r7
2293 vshr.u32 d25,d6,#10
2294 eor r0,r0,r6,ror#20
2295 add r5,r5,r2
2296 veor d25,d25,d24
2297 ldr r2,[sp,#60]
2298 and r3,r3,r12
2299 vshr.u32 d24,d6,#19
2300 add r9,r9,r5
2301 add r5,r5,r0,ror#2
2302 eor r3,r3,r7
2303 vld1.32 {q8},[r14,:128]!
2304 add r4,r4,r2
2305 vsli.32 d24,d6,#13
2306 eor r2,r10,r11
2307 eor r0,r9,r9,ror#5
2308 veor d25,d25,d24
2309 add r5,r5,r3
2310 and r2,r2,r9
2311 vadd.i32 d7,d7,d25
2312 eor r3,r0,r9,ror#19
2313 eor r0,r5,r5,ror#11
2314 vadd.i32 q8,q8,q3
2315 eor r2,r2,r11
2316 add r4,r4,r3,ror#6
2317 eor r3,r5,r6
2318 eor r0,r0,r5,ror#20
2319 add r4,r4,r2
2320 ldr r2,[r14]
2321 and r12,r12,r3
2322 add r8,r8,r4
2323 vst1.32 {q8},[r1,:128]!
2324 add r4,r4,r0,ror#2
2325 eor r12,r12,r6
2326 teq r2,#0 @ check for K256 terminator
2327 ldr r2,[sp,#0]
2328 sub r1,r1,#64
2329 bne L_00_48
2330
2331 ldr r1,[sp,#68]
2332 ldr r0,[sp,#72]
2333 sub r14,r14,#256 @ rewind r14
2334 teq r1,r0
2335 it eq
2336 subeq r1,r1,#64 @ avoid SEGV
2337 vld1.8 {q0},[r1]! @ load next input block
2338 vld1.8 {q1},[r1]!
2339 vld1.8 {q2},[r1]!
2340 vld1.8 {q3},[r1]!
2341 it ne
2342 strne r1,[sp,#68]
2343 mov r1,sp
2344 add r11,r11,r2
2345 eor r2,r9,r10
2346 eor r0,r8,r8,ror#5
2347 add r4,r4,r12
2348 vld1.32 {q8},[r14,:128]!
2349 and r2,r2,r8
2350 eor r12,r0,r8,ror#19
2351 eor r0,r4,r4,ror#11
2352 eor r2,r2,r10
2353 vrev32.8 q0,q0
2354 add r11,r11,r12,ror#6
2355 eor r12,r4,r5
2356 eor r0,r0,r4,ror#20
2357 add r11,r11,r2
2358 vadd.i32 q8,q8,q0
2359 ldr r2,[sp,#4]
2360 and r3,r3,r12
2361 add r7,r7,r11
2362 add r11,r11,r0,ror#2
2363 eor r3,r3,r5
2364 add r10,r10,r2
2365 eor r2,r8,r9
2366 eor r0,r7,r7,ror#5
2367 add r11,r11,r3
2368 and r2,r2,r7
2369 eor r3,r0,r7,ror#19
2370 eor r0,r11,r11,ror#11
2371 eor r2,r2,r9
2372 add r10,r10,r3,ror#6
2373 eor r3,r11,r4
2374 eor r0,r0,r11,ror#20
2375 add r10,r10,r2
2376 ldr r2,[sp,#8]
2377 and r12,r12,r3
2378 add r6,r6,r10
2379 add r10,r10,r0,ror#2
2380 eor r12,r12,r4
2381 add r9,r9,r2
2382 eor r2,r7,r8
2383 eor r0,r6,r6,ror#5
2384 add r10,r10,r12
2385 and r2,r2,r6
2386 eor r12,r0,r6,ror#19
2387 eor r0,r10,r10,ror#11
2388 eor r2,r2,r8
2389 add r9,r9,r12,ror#6
2390 eor r12,r10,r11
2391 eor r0,r0,r10,ror#20
2392 add r9,r9,r2
2393 ldr r2,[sp,#12]
2394 and r3,r3,r12
2395 add r5,r5,r9
2396 add r9,r9,r0,ror#2
2397 eor r3,r3,r11
2398 add r8,r8,r2
2399 eor r2,r6,r7
2400 eor r0,r5,r5,ror#5
2401 add r9,r9,r3
2402 and r2,r2,r5
2403 eor r3,r0,r5,ror#19
2404 eor r0,r9,r9,ror#11
2405 eor r2,r2,r7
2406 add r8,r8,r3,ror#6
2407 eor r3,r9,r10
2408 eor r0,r0,r9,ror#20
2409 add r8,r8,r2
2410 ldr r2,[sp,#16]
2411 and r12,r12,r3
2412 add r4,r4,r8
2413 add r8,r8,r0,ror#2
2414 eor r12,r12,r10
2415 vst1.32 {q8},[r1,:128]!
2416 add r7,r7,r2
2417 eor r2,r5,r6
2418 eor r0,r4,r4,ror#5
2419 add r8,r8,r12
2420 vld1.32 {q8},[r14,:128]!
2421 and r2,r2,r4
2422 eor r12,r0,r4,ror#19
2423 eor r0,r8,r8,ror#11
2424 eor r2,r2,r6
2425 vrev32.8 q1,q1
2426 add r7,r7,r12,ror#6
2427 eor r12,r8,r9
2428 eor r0,r0,r8,ror#20
2429 add r7,r7,r2
2430 vadd.i32 q8,q8,q1
2431 ldr r2,[sp,#20]
2432 and r3,r3,r12
2433 add r11,r11,r7
2434 add r7,r7,r0,ror#2
2435 eor r3,r3,r9
2436 add r6,r6,r2
2437 eor r2,r4,r5
2438 eor r0,r11,r11,ror#5
2439 add r7,r7,r3
2440 and r2,r2,r11
2441 eor r3,r0,r11,ror#19
2442 eor r0,r7,r7,ror#11
2443 eor r2,r2,r5
2444 add r6,r6,r3,ror#6
2445 eor r3,r7,r8
2446 eor r0,r0,r7,ror#20
2447 add r6,r6,r2
2448 ldr r2,[sp,#24]
2449 and r12,r12,r3
2450 add r10,r10,r6
2451 add r6,r6,r0,ror#2
2452 eor r12,r12,r8
2453 add r5,r5,r2
2454 eor r2,r11,r4
2455 eor r0,r10,r10,ror#5
2456 add r6,r6,r12
2457 and r2,r2,r10
2458 eor r12,r0,r10,ror#19
2459 eor r0,r6,r6,ror#11
2460 eor r2,r2,r4
2461 add r5,r5,r12,ror#6
2462 eor r12,r6,r7
2463 eor r0,r0,r6,ror#20
2464 add r5,r5,r2
2465 ldr r2,[sp,#28]
2466 and r3,r3,r12
2467 add r9,r9,r5
2468 add r5,r5,r0,ror#2
2469 eor r3,r3,r7
2470 add r4,r4,r2
2471 eor r2,r10,r11
2472 eor r0,r9,r9,ror#5
2473 add r5,r5,r3
2474 and r2,r2,r9
2475 eor r3,r0,r9,ror#19
2476 eor r0,r5,r5,ror#11
2477 eor r2,r2,r11
2478 add r4,r4,r3,ror#6
2479 eor r3,r5,r6
2480 eor r0,r0,r5,ror#20
2481 add r4,r4,r2
2482 ldr r2,[sp,#32]
2483 and r12,r12,r3
2484 add r8,r8,r4
2485 add r4,r4,r0,ror#2
2486 eor r12,r12,r6
2487 vst1.32 {q8},[r1,:128]!
2488 add r11,r11,r2
2489 eor r2,r9,r10
2490 eor r0,r8,r8,ror#5
2491 add r4,r4,r12
2492 vld1.32 {q8},[r14,:128]!
2493 and r2,r2,r8
2494 eor r12,r0,r8,ror#19
2495 eor r0,r4,r4,ror#11
2496 eor r2,r2,r10
2497 vrev32.8 q2,q2
2498 add r11,r11,r12,ror#6
2499 eor r12,r4,r5
2500 eor r0,r0,r4,ror#20
2501 add r11,r11,r2
2502 vadd.i32 q8,q8,q2
2503 ldr r2,[sp,#36]
2504 and r3,r3,r12
2505 add r7,r7,r11
2506 add r11,r11,r0,ror#2
2507 eor r3,r3,r5
2508 add r10,r10,r2
2509 eor r2,r8,r9
2510 eor r0,r7,r7,ror#5
2511 add r11,r11,r3
2512 and r2,r2,r7
2513 eor r3,r0,r7,ror#19
2514 eor r0,r11,r11,ror#11
2515 eor r2,r2,r9
2516 add r10,r10,r3,ror#6
2517 eor r3,r11,r4
2518 eor r0,r0,r11,ror#20
2519 add r10,r10,r2
2520 ldr r2,[sp,#40]
2521 and r12,r12,r3
2522 add r6,r6,r10
2523 add r10,r10,r0,ror#2
2524 eor r12,r12,r4
2525 add r9,r9,r2
2526 eor r2,r7,r8
2527 eor r0,r6,r6,ror#5
2528 add r10,r10,r12
2529 and r2,r2,r6
2530 eor r12,r0,r6,ror#19
2531 eor r0,r10,r10,ror#11
2532 eor r2,r2,r8
2533 add r9,r9,r12,ror#6
2534 eor r12,r10,r11
2535 eor r0,r0,r10,ror#20
2536 add r9,r9,r2
2537 ldr r2,[sp,#44]
2538 and r3,r3,r12
2539 add r5,r5,r9
2540 add r9,r9,r0,ror#2
2541 eor r3,r3,r11
2542 add r8,r8,r2
2543 eor r2,r6,r7
2544 eor r0,r5,r5,ror#5
2545 add r9,r9,r3
2546 and r2,r2,r5
2547 eor r3,r0,r5,ror#19
2548 eor r0,r9,r9,ror#11
2549 eor r2,r2,r7
2550 add r8,r8,r3,ror#6
2551 eor r3,r9,r10
2552 eor r0,r0,r9,ror#20
2553 add r8,r8,r2
2554 ldr r2,[sp,#48]
2555 and r12,r12,r3
2556 add r4,r4,r8
2557 add r8,r8,r0,ror#2
2558 eor r12,r12,r10
2559 vst1.32 {q8},[r1,:128]!
2560 add r7,r7,r2
2561 eor r2,r5,r6
2562 eor r0,r4,r4,ror#5
2563 add r8,r8,r12
2564 vld1.32 {q8},[r14,:128]!
2565 and r2,r2,r4
2566 eor r12,r0,r4,ror#19
2567 eor r0,r8,r8,ror#11
2568 eor r2,r2,r6
2569 vrev32.8 q3,q3
2570 add r7,r7,r12,ror#6
2571 eor r12,r8,r9
2572 eor r0,r0,r8,ror#20
2573 add r7,r7,r2
2574 vadd.i32 q8,q8,q3
2575 ldr r2,[sp,#52]
2576 and r3,r3,r12
2577 add r11,r11,r7
2578 add r7,r7,r0,ror#2
2579 eor r3,r3,r9
2580 add r6,r6,r2
2581 eor r2,r4,r5
2582 eor r0,r11,r11,ror#5
2583 add r7,r7,r3
2584 and r2,r2,r11
2585 eor r3,r0,r11,ror#19
2586 eor r0,r7,r7,ror#11
2587 eor r2,r2,r5
2588 add r6,r6,r3,ror#6
2589 eor r3,r7,r8
2590 eor r0,r0,r7,ror#20
2591 add r6,r6,r2
2592 ldr r2,[sp,#56]
2593 and r12,r12,r3
2594 add r10,r10,r6
2595 add r6,r6,r0,ror#2
2596 eor r12,r12,r8
2597 add r5,r5,r2
2598 eor r2,r11,r4
2599 eor r0,r10,r10,ror#5
2600 add r6,r6,r12
2601 and r2,r2,r10
2602 eor r12,r0,r10,ror#19
2603 eor r0,r6,r6,ror#11
2604 eor r2,r2,r4
2605 add r5,r5,r12,ror#6
2606 eor r12,r6,r7
2607 eor r0,r0,r6,ror#20
2608 add r5,r5,r2
2609 ldr r2,[sp,#60]
2610 and r3,r3,r12
2611 add r9,r9,r5
2612 add r5,r5,r0,ror#2
2613 eor r3,r3,r7
2614 add r4,r4,r2
2615 eor r2,r10,r11
2616 eor r0,r9,r9,ror#5
2617 add r5,r5,r3
2618 and r2,r2,r9
2619 eor r3,r0,r9,ror#19
2620 eor r0,r5,r5,ror#11
2621 eor r2,r2,r11
2622 add r4,r4,r3,ror#6
2623 eor r3,r5,r6
2624 eor r0,r0,r5,ror#20
2625 add r4,r4,r2
2626 ldr r2,[sp,#64]
2627 and r12,r12,r3
2628 add r8,r8,r4
2629 add r4,r4,r0,ror#2
2630 eor r12,r12,r6
2631 vst1.32 {q8},[r1,:128]!
2632 ldr r0,[r2,#0]
2633 add r4,r4,r12 @ h+=Maj(a,b,c) from the past
2634 ldr r12,[r2,#4]
2635 ldr r3,[r2,#8]
2636 ldr r1,[r2,#12]
2637 add r4,r4,r0 @ accumulate
2638 ldr r0,[r2,#16]
2639 add r5,r5,r12
2640 ldr r12,[r2,#20]
2641 add r6,r6,r3
2642 ldr r3,[r2,#24]
2643 add r7,r7,r1
2644 ldr r1,[r2,#28]
2645 add r8,r8,r0
2646 str r4,[r2],#4
2647 add r9,r9,r12
2648 str r5,[r2],#4
2649 add r10,r10,r3
2650 str r6,[r2],#4
2651 add r11,r11,r1
2652 str r7,[r2],#4
2653 stmia r2,{r8,r9,r10,r11}
2654
2655 ittte ne
2656 movne r1,sp
2657 ldrne r2,[sp,#0]
2658 eorne r12,r12,r12
2659 ldreq sp,[sp,#76] @ restore original sp
2660 itt ne
2661 eorne r3,r5,r6
2662 bne L_00_48
2663
2664 ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,pc}
2665
2666#endif
2667#if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__)
2668
2669# if defined(__thumb2__)
2670# define INST(a,b,c,d) .byte c,d|0xc,a,b
2671# else
2672# define INST(a,b,c,d) .byte a,b,c,d
2673# endif
2674
2675#ifdef __thumb2__
2676.thumb_func sha256_block_data_order_armv8
2677#endif
2678.align 5
2679sha256_block_data_order_armv8:
2680LARMv8:
2681 vld1.32 {q0,q1},[r0]
2682 sub r3,r3,#256+32
2683 add r2,r1,r2,lsl#6 @ len to point at the end of inp
2684 b Loop_v8
2685
2686.align 4
2687Loop_v8:
2688 vld1.8 {q8,q9},[r1]!
2689 vld1.8 {q10,q11},[r1]!
2690 vld1.32 {q12},[r3]!
2691 vrev32.8 q8,q8
2692 vrev32.8 q9,q9
2693 vrev32.8 q10,q10
2694 vrev32.8 q11,q11
2695 vmov q14,q0 @ offload
2696 vmov q15,q1
2697 teq r1,r2
2698 vld1.32 {q13},[r3]!
2699 vadd.i32 q12,q12,q8
2700 INST(0xe2,0x03,0xfa,0xf3) @ sha256su0 q8,q9
2701 vmov q2,q0
2702 INST(0x68,0x0c,0x02,0xf3) @ sha256h q0,q1,q12
2703 INST(0x68,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q12
2704 INST(0xe6,0x0c,0x64,0xf3) @ sha256su1 q8,q10,q11
2705 vld1.32 {q12},[r3]!
2706 vadd.i32 q13,q13,q9
2707 INST(0xe4,0x23,0xfa,0xf3) @ sha256su0 q9,q10
2708 vmov q2,q0
2709 INST(0x6a,0x0c,0x02,0xf3) @ sha256h q0,q1,q13
2710 INST(0x6a,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q13
2711 INST(0xe0,0x2c,0x66,0xf3) @ sha256su1 q9,q11,q8
2712 vld1.32 {q13},[r3]!
2713 vadd.i32 q12,q12,q10
2714 INST(0xe6,0x43,0xfa,0xf3) @ sha256su0 q10,q11
2715 vmov q2,q0
2716 INST(0x68,0x0c,0x02,0xf3) @ sha256h q0,q1,q12
2717 INST(0x68,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q12
2718 INST(0xe2,0x4c,0x60,0xf3) @ sha256su1 q10,q8,q9
2719 vld1.32 {q12},[r3]!
2720 vadd.i32 q13,q13,q11
2721 INST(0xe0,0x63,0xfa,0xf3) @ sha256su0 q11,q8
2722 vmov q2,q0
2723 INST(0x6a,0x0c,0x02,0xf3) @ sha256h q0,q1,q13
2724 INST(0x6a,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q13
2725 INST(0xe4,0x6c,0x62,0xf3) @ sha256su1 q11,q9,q10
2726 vld1.32 {q13},[r3]!
2727 vadd.i32 q12,q12,q8
2728 INST(0xe2,0x03,0xfa,0xf3) @ sha256su0 q8,q9
2729 vmov q2,q0
2730 INST(0x68,0x0c,0x02,0xf3) @ sha256h q0,q1,q12
2731 INST(0x68,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q12
2732 INST(0xe6,0x0c,0x64,0xf3) @ sha256su1 q8,q10,q11
2733 vld1.32 {q12},[r3]!
2734 vadd.i32 q13,q13,q9
2735 INST(0xe4,0x23,0xfa,0xf3) @ sha256su0 q9,q10
2736 vmov q2,q0
2737 INST(0x6a,0x0c,0x02,0xf3) @ sha256h q0,q1,q13
2738 INST(0x6a,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q13
2739 INST(0xe0,0x2c,0x66,0xf3) @ sha256su1 q9,q11,q8
2740 vld1.32 {q13},[r3]!
2741 vadd.i32 q12,q12,q10
2742 INST(0xe6,0x43,0xfa,0xf3) @ sha256su0 q10,q11
2743 vmov q2,q0
2744 INST(0x68,0x0c,0x02,0xf3) @ sha256h q0,q1,q12
2745 INST(0x68,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q12
2746 INST(0xe2,0x4c,0x60,0xf3) @ sha256su1 q10,q8,q9
2747 vld1.32 {q12},[r3]!
2748 vadd.i32 q13,q13,q11
2749 INST(0xe0,0x63,0xfa,0xf3) @ sha256su0 q11,q8
2750 vmov q2,q0
2751 INST(0x6a,0x0c,0x02,0xf3) @ sha256h q0,q1,q13
2752 INST(0x6a,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q13
2753 INST(0xe4,0x6c,0x62,0xf3) @ sha256su1 q11,q9,q10
2754 vld1.32 {q13},[r3]!
2755 vadd.i32 q12,q12,q8
2756 INST(0xe2,0x03,0xfa,0xf3) @ sha256su0 q8,q9
2757 vmov q2,q0
2758 INST(0x68,0x0c,0x02,0xf3) @ sha256h q0,q1,q12
2759 INST(0x68,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q12
2760 INST(0xe6,0x0c,0x64,0xf3) @ sha256su1 q8,q10,q11
2761 vld1.32 {q12},[r3]!
2762 vadd.i32 q13,q13,q9
2763 INST(0xe4,0x23,0xfa,0xf3) @ sha256su0 q9,q10
2764 vmov q2,q0
2765 INST(0x6a,0x0c,0x02,0xf3) @ sha256h q0,q1,q13
2766 INST(0x6a,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q13
2767 INST(0xe0,0x2c,0x66,0xf3) @ sha256su1 q9,q11,q8
2768 vld1.32 {q13},[r3]!
2769 vadd.i32 q12,q12,q10
2770 INST(0xe6,0x43,0xfa,0xf3) @ sha256su0 q10,q11
2771 vmov q2,q0
2772 INST(0x68,0x0c,0x02,0xf3) @ sha256h q0,q1,q12
2773 INST(0x68,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q12
2774 INST(0xe2,0x4c,0x60,0xf3) @ sha256su1 q10,q8,q9
2775 vld1.32 {q12},[r3]!
2776 vadd.i32 q13,q13,q11
2777 INST(0xe0,0x63,0xfa,0xf3) @ sha256su0 q11,q8
2778 vmov q2,q0
2779 INST(0x6a,0x0c,0x02,0xf3) @ sha256h q0,q1,q13
2780 INST(0x6a,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q13
2781 INST(0xe4,0x6c,0x62,0xf3) @ sha256su1 q11,q9,q10
2782 vld1.32 {q13},[r3]!
2783 vadd.i32 q12,q12,q8
2784 vmov q2,q0
2785 INST(0x68,0x0c,0x02,0xf3) @ sha256h q0,q1,q12
2786 INST(0x68,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q12
2787
2788 vld1.32 {q12},[r3]!
2789 vadd.i32 q13,q13,q9
2790 vmov q2,q0
2791 INST(0x6a,0x0c,0x02,0xf3) @ sha256h q0,q1,q13
2792 INST(0x6a,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q13
2793
2794 vld1.32 {q13},[r3]
2795 vadd.i32 q12,q12,q10
2796 sub r3,r3,#256-16 @ rewind
2797 vmov q2,q0
2798 INST(0x68,0x0c,0x02,0xf3) @ sha256h q0,q1,q12
2799 INST(0x68,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q12
2800
2801 vadd.i32 q13,q13,q11
2802 vmov q2,q0
2803 INST(0x6a,0x0c,0x02,0xf3) @ sha256h q0,q1,q13
2804 INST(0x6a,0x2c,0x14,0xf3) @ sha256h2 q1,q2,q13
2805
2806 vadd.i32 q0,q0,q14
2807 vadd.i32 q1,q1,q15
2808 it ne
2809 bne Loop_v8
2810
2811 vst1.32 {q0,q1},[r0]
2812
2813 bx lr @ bx lr
2814
2815#endif
2816.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,52,47,78,69,79,78,47,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
2817.align 2
2818.align 2
2819#if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__)
2820.comm _OPENSSL_armcap_P,4
2821.non_lazy_symbol_pointer
2822OPENSSL_armcap_P:
2823.indirect_symbol _OPENSSL_armcap_P
2824.long 0
2825.private_extern _OPENSSL_armcap_P
2826#endif