blob: b225c9972d7796e15ad2269b1c699008afc88e93 [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@ SHA512 block procedure for ARMv4. September 2007.
19
20@ This code is ~4.5 (four and a half) times faster than code generated
21@ by gcc 3.4 and it spends ~72 clock cycles per byte [on single-issue
22@ Xscale PXA250 core].
23@
24@ July 2010.
25@
26@ Rescheduling for dual-issue pipeline resulted in 6% improvement on
27@ Cortex A8 core and ~40 cycles per processed byte.
28
29@ February 2011.
30@
31@ Profiler-assisted and platform-specific optimization resulted in 7%
32@ improvement on Coxtex A8 core and ~38 cycles per byte.
33
34@ March 2011.
35@
36@ Add NEON implementation. On Cortex A8 it was measured to process
37@ one byte in 23.3 cycles or ~60% faster than integer-only code.
38
39@ August 2012.
40@
41@ Improve NEON performance by 12% on Snapdragon S4. In absolute
42@ terms it's 22.6 cycles per byte, which is disappointing result.
43@ Technical writers asserted that 3-way S4 pipeline can sustain
44@ multiple NEON instructions per cycle, but dual NEON issue could
45@ not be observed, see http://www.openssl.org/~appro/Snapdragon-S4.html
46@ for further details. On side note Cortex-A15 processes one byte in
47@ 16 cycles.
48
49@ Byte order [in]dependence. =========================================
50@
51@ Originally caller was expected to maintain specific *dword* order in
52@ h[0-7], namely with most significant dword at *lower* address, which
53@ was reflected in below two parameters as 0 and 4. Now caller is
54@ expected to maintain native byte order for whole 64-bit values.
55#ifndef __KERNEL__
56# include <openssl/arm_arch.h>
57# define VFP_ABI_PUSH vstmdb sp!,{d8-d15}
58# define VFP_ABI_POP vldmia sp!,{d8-d15}
59#else
60# define __ARM_ARCH__ __LINUX_ARM_ARCH__
61# define __ARM_MAX_ARCH__ 7
62# define VFP_ABI_PUSH
63# define VFP_ABI_POP
64#endif
65
66#ifdef __ARMEL__
67# define LO 0
68# define HI 4
69# define WORD64(hi0,lo0,hi1,lo1) .word lo0,hi0, lo1,hi1
70#else
71# define HI 0
72# define LO 4
73# define WORD64(hi0,lo0,hi1,lo1) .word hi0,lo0, hi1,lo1
74#endif
75
76.text
77#if defined(__thumb2__)
78.syntax unified
79.thumb
80# define adrl adr
81#else
82.code 32
83#endif
84
85
86.align 5
87K512:
88 WORD64(0x428a2f98,0xd728ae22, 0x71374491,0x23ef65cd)
89 WORD64(0xb5c0fbcf,0xec4d3b2f, 0xe9b5dba5,0x8189dbbc)
90 WORD64(0x3956c25b,0xf348b538, 0x59f111f1,0xb605d019)
91 WORD64(0x923f82a4,0xaf194f9b, 0xab1c5ed5,0xda6d8118)
92 WORD64(0xd807aa98,0xa3030242, 0x12835b01,0x45706fbe)
93 WORD64(0x243185be,0x4ee4b28c, 0x550c7dc3,0xd5ffb4e2)
94 WORD64(0x72be5d74,0xf27b896f, 0x80deb1fe,0x3b1696b1)
95 WORD64(0x9bdc06a7,0x25c71235, 0xc19bf174,0xcf692694)
96 WORD64(0xe49b69c1,0x9ef14ad2, 0xefbe4786,0x384f25e3)
97 WORD64(0x0fc19dc6,0x8b8cd5b5, 0x240ca1cc,0x77ac9c65)
98 WORD64(0x2de92c6f,0x592b0275, 0x4a7484aa,0x6ea6e483)
99 WORD64(0x5cb0a9dc,0xbd41fbd4, 0x76f988da,0x831153b5)
100 WORD64(0x983e5152,0xee66dfab, 0xa831c66d,0x2db43210)
101 WORD64(0xb00327c8,0x98fb213f, 0xbf597fc7,0xbeef0ee4)
102 WORD64(0xc6e00bf3,0x3da88fc2, 0xd5a79147,0x930aa725)
103 WORD64(0x06ca6351,0xe003826f, 0x14292967,0x0a0e6e70)
104 WORD64(0x27b70a85,0x46d22ffc, 0x2e1b2138,0x5c26c926)
105 WORD64(0x4d2c6dfc,0x5ac42aed, 0x53380d13,0x9d95b3df)
106 WORD64(0x650a7354,0x8baf63de, 0x766a0abb,0x3c77b2a8)
107 WORD64(0x81c2c92e,0x47edaee6, 0x92722c85,0x1482353b)
108 WORD64(0xa2bfe8a1,0x4cf10364, 0xa81a664b,0xbc423001)
109 WORD64(0xc24b8b70,0xd0f89791, 0xc76c51a3,0x0654be30)
110 WORD64(0xd192e819,0xd6ef5218, 0xd6990624,0x5565a910)
111 WORD64(0xf40e3585,0x5771202a, 0x106aa070,0x32bbd1b8)
112 WORD64(0x19a4c116,0xb8d2d0c8, 0x1e376c08,0x5141ab53)
113 WORD64(0x2748774c,0xdf8eeb99, 0x34b0bcb5,0xe19b48a8)
114 WORD64(0x391c0cb3,0xc5c95a63, 0x4ed8aa4a,0xe3418acb)
115 WORD64(0x5b9cca4f,0x7763e373, 0x682e6ff3,0xd6b2b8a3)
116 WORD64(0x748f82ee,0x5defb2fc, 0x78a5636f,0x43172f60)
117 WORD64(0x84c87814,0xa1f0ab72, 0x8cc70208,0x1a6439ec)
118 WORD64(0x90befffa,0x23631e28, 0xa4506ceb,0xde82bde9)
119 WORD64(0xbef9a3f7,0xb2c67915, 0xc67178f2,0xe372532b)
120 WORD64(0xca273ece,0xea26619c, 0xd186b8c7,0x21c0c207)
121 WORD64(0xeada7dd6,0xcde0eb1e, 0xf57d4f7f,0xee6ed178)
122 WORD64(0x06f067aa,0x72176fba, 0x0a637dc5,0xa2c898a6)
123 WORD64(0x113f9804,0xbef90dae, 0x1b710b35,0x131c471b)
124 WORD64(0x28db77f5,0x23047d84, 0x32caab7b,0x40c72493)
125 WORD64(0x3c9ebe0a,0x15c9bebc, 0x431d67c4,0x9c100d4c)
126 WORD64(0x4cc5d4be,0xcb3e42b6, 0x597f299c,0xfc657e2a)
127 WORD64(0x5fcb6fab,0x3ad6faec, 0x6c44198c,0x4a475817)
128
129#if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__)
130LOPENSSL_armcap:
131.word OPENSSL_armcap_P-Lsha512_block_data_order
132.skip 32-4
133#else
134.skip 32
135#endif
136
137.globl _sha512_block_data_order
138.private_extern _sha512_block_data_order
139#ifdef __thumb2__
140.thumb_func _sha512_block_data_order
141#endif
142_sha512_block_data_order:
143Lsha512_block_data_order:
144#if __ARM_ARCH__<7 && !defined(__thumb2__)
145 sub r3,pc,#8 @ _sha512_block_data_order
146#else
147 adr r3,Lsha512_block_data_order
148#endif
149#if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__)
150 ldr r12,LOPENSSL_armcap
151 ldr r12,[r3,r12] @ OPENSSL_armcap_P
152#ifdef __APPLE__
153 ldr r12,[r12]
154#endif
155 tst r12,#ARMV7_NEON
156 bne LNEON
157#endif
158 add r2,r1,r2,lsl#7 @ len to point at the end of inp
159 stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr}
160 sub r14,r3,#672 @ K512
161 sub sp,sp,#9*8
162
163 ldr r7,[r0,#32+LO]
164 ldr r8,[r0,#32+HI]
165 ldr r9, [r0,#48+LO]
166 ldr r10, [r0,#48+HI]
167 ldr r11, [r0,#56+LO]
168 ldr r12, [r0,#56+HI]
169Loop:
170 str r9, [sp,#48+0]
171 str r10, [sp,#48+4]
172 str r11, [sp,#56+0]
173 str r12, [sp,#56+4]
174 ldr r5,[r0,#0+LO]
175 ldr r6,[r0,#0+HI]
176 ldr r3,[r0,#8+LO]
177 ldr r4,[r0,#8+HI]
178 ldr r9, [r0,#16+LO]
179 ldr r10, [r0,#16+HI]
180 ldr r11, [r0,#24+LO]
181 ldr r12, [r0,#24+HI]
182 str r3,[sp,#8+0]
183 str r4,[sp,#8+4]
184 str r9, [sp,#16+0]
185 str r10, [sp,#16+4]
186 str r11, [sp,#24+0]
187 str r12, [sp,#24+4]
188 ldr r3,[r0,#40+LO]
189 ldr r4,[r0,#40+HI]
190 str r3,[sp,#40+0]
191 str r4,[sp,#40+4]
192
193L00_15:
194#if __ARM_ARCH__<7
195 ldrb r3,[r1,#7]
196 ldrb r9, [r1,#6]
197 ldrb r10, [r1,#5]
198 ldrb r11, [r1,#4]
199 ldrb r4,[r1,#3]
200 ldrb r12, [r1,#2]
201 orr r3,r3,r9,lsl#8
202 ldrb r9, [r1,#1]
203 orr r3,r3,r10,lsl#16
204 ldrb r10, [r1],#8
205 orr r3,r3,r11,lsl#24
206 orr r4,r4,r12,lsl#8
207 orr r4,r4,r9,lsl#16
208 orr r4,r4,r10,lsl#24
209#else
210 ldr r3,[r1,#4]
211 ldr r4,[r1],#8
212#ifdef __ARMEL__
213 rev r3,r3
214 rev r4,r4
215#endif
216#endif
217 @ Sigma1(x) (ROTR((x),14) ^ ROTR((x),18) ^ ROTR((x),41))
218 @ LO lo>>14^hi<<18 ^ lo>>18^hi<<14 ^ hi>>9^lo<<23
219 @ HI hi>>14^lo<<18 ^ hi>>18^lo<<14 ^ lo>>9^hi<<23
220 mov r9,r7,lsr#14
221 str r3,[sp,#64+0]
222 mov r10,r8,lsr#14
223 str r4,[sp,#64+4]
224 eor r9,r9,r8,lsl#18
225 ldr r11,[sp,#56+0] @ h.lo
226 eor r10,r10,r7,lsl#18
227 ldr r12,[sp,#56+4] @ h.hi
228 eor r9,r9,r7,lsr#18
229 eor r10,r10,r8,lsr#18
230 eor r9,r9,r8,lsl#14
231 eor r10,r10,r7,lsl#14
232 eor r9,r9,r8,lsr#9
233 eor r10,r10,r7,lsr#9
234 eor r9,r9,r7,lsl#23
235 eor r10,r10,r8,lsl#23 @ Sigma1(e)
236 adds r3,r3,r9
237 ldr r9,[sp,#40+0] @ f.lo
238 adc r4,r4,r10 @ T += Sigma1(e)
239 ldr r10,[sp,#40+4] @ f.hi
240 adds r3,r3,r11
241 ldr r11,[sp,#48+0] @ g.lo
242 adc r4,r4,r12 @ T += h
243 ldr r12,[sp,#48+4] @ g.hi
244
245 eor r9,r9,r11
246 str r7,[sp,#32+0]
247 eor r10,r10,r12
248 str r8,[sp,#32+4]
249 and r9,r9,r7
250 str r5,[sp,#0+0]
251 and r10,r10,r8
252 str r6,[sp,#0+4]
253 eor r9,r9,r11
254 ldr r11,[r14,#LO] @ K[i].lo
255 eor r10,r10,r12 @ Ch(e,f,g)
256 ldr r12,[r14,#HI] @ K[i].hi
257
258 adds r3,r3,r9
259 ldr r7,[sp,#24+0] @ d.lo
260 adc r4,r4,r10 @ T += Ch(e,f,g)
261 ldr r8,[sp,#24+4] @ d.hi
262 adds r3,r3,r11
263 and r9,r11,#0xff
264 adc r4,r4,r12 @ T += K[i]
265 adds r7,r7,r3
266 ldr r11,[sp,#8+0] @ b.lo
267 adc r8,r8,r4 @ d += T
268 teq r9,#148
269
270 ldr r12,[sp,#16+0] @ c.lo
271#if __ARM_ARCH__>=7
272 it eq @ Thumb2 thing, sanity check in ARM
273#endif
274 orreq r14,r14,#1
275 @ Sigma0(x) (ROTR((x),28) ^ ROTR((x),34) ^ ROTR((x),39))
276 @ LO lo>>28^hi<<4 ^ hi>>2^lo<<30 ^ hi>>7^lo<<25
277 @ HI hi>>28^lo<<4 ^ lo>>2^hi<<30 ^ lo>>7^hi<<25
278 mov r9,r5,lsr#28
279 mov r10,r6,lsr#28
280 eor r9,r9,r6,lsl#4
281 eor r10,r10,r5,lsl#4
282 eor r9,r9,r6,lsr#2
283 eor r10,r10,r5,lsr#2
284 eor r9,r9,r5,lsl#30
285 eor r10,r10,r6,lsl#30
286 eor r9,r9,r6,lsr#7
287 eor r10,r10,r5,lsr#7
288 eor r9,r9,r5,lsl#25
289 eor r10,r10,r6,lsl#25 @ Sigma0(a)
290 adds r3,r3,r9
291 and r9,r5,r11
292 adc r4,r4,r10 @ T += Sigma0(a)
293
294 ldr r10,[sp,#8+4] @ b.hi
295 orr r5,r5,r11
296 ldr r11,[sp,#16+4] @ c.hi
297 and r5,r5,r12
298 and r12,r6,r10
299 orr r6,r6,r10
300 orr r5,r5,r9 @ Maj(a,b,c).lo
301 and r6,r6,r11
302 adds r5,r5,r3
303 orr r6,r6,r12 @ Maj(a,b,c).hi
304 sub sp,sp,#8
305 adc r6,r6,r4 @ h += T
306 tst r14,#1
307 add r14,r14,#8
308 tst r14,#1
309 beq L00_15
310 ldr r9,[sp,#184+0]
311 ldr r10,[sp,#184+4]
312 bic r14,r14,#1
313L16_79:
314 @ sigma0(x) (ROTR((x),1) ^ ROTR((x),8) ^ ((x)>>7))
315 @ LO lo>>1^hi<<31 ^ lo>>8^hi<<24 ^ lo>>7^hi<<25
316 @ HI hi>>1^lo<<31 ^ hi>>8^lo<<24 ^ hi>>7
317 mov r3,r9,lsr#1
318 ldr r11,[sp,#80+0]
319 mov r4,r10,lsr#1
320 ldr r12,[sp,#80+4]
321 eor r3,r3,r10,lsl#31
322 eor r4,r4,r9,lsl#31
323 eor r3,r3,r9,lsr#8
324 eor r4,r4,r10,lsr#8
325 eor r3,r3,r10,lsl#24
326 eor r4,r4,r9,lsl#24
327 eor r3,r3,r9,lsr#7
328 eor r4,r4,r10,lsr#7
329 eor r3,r3,r10,lsl#25
330
331 @ sigma1(x) (ROTR((x),19) ^ ROTR((x),61) ^ ((x)>>6))
332 @ LO lo>>19^hi<<13 ^ hi>>29^lo<<3 ^ lo>>6^hi<<26
333 @ HI hi>>19^lo<<13 ^ lo>>29^hi<<3 ^ hi>>6
334 mov r9,r11,lsr#19
335 mov r10,r12,lsr#19
336 eor r9,r9,r12,lsl#13
337 eor r10,r10,r11,lsl#13
338 eor r9,r9,r12,lsr#29
339 eor r10,r10,r11,lsr#29
340 eor r9,r9,r11,lsl#3
341 eor r10,r10,r12,lsl#3
342 eor r9,r9,r11,lsr#6
343 eor r10,r10,r12,lsr#6
344 ldr r11,[sp,#120+0]
345 eor r9,r9,r12,lsl#26
346
347 ldr r12,[sp,#120+4]
348 adds r3,r3,r9
349 ldr r9,[sp,#192+0]
350 adc r4,r4,r10
351
352 ldr r10,[sp,#192+4]
353 adds r3,r3,r11
354 adc r4,r4,r12
355 adds r3,r3,r9
356 adc r4,r4,r10
357 @ Sigma1(x) (ROTR((x),14) ^ ROTR((x),18) ^ ROTR((x),41))
358 @ LO lo>>14^hi<<18 ^ lo>>18^hi<<14 ^ hi>>9^lo<<23
359 @ HI hi>>14^lo<<18 ^ hi>>18^lo<<14 ^ lo>>9^hi<<23
360 mov r9,r7,lsr#14
361 str r3,[sp,#64+0]
362 mov r10,r8,lsr#14
363 str r4,[sp,#64+4]
364 eor r9,r9,r8,lsl#18
365 ldr r11,[sp,#56+0] @ h.lo
366 eor r10,r10,r7,lsl#18
367 ldr r12,[sp,#56+4] @ h.hi
368 eor r9,r9,r7,lsr#18
369 eor r10,r10,r8,lsr#18
370 eor r9,r9,r8,lsl#14
371 eor r10,r10,r7,lsl#14
372 eor r9,r9,r8,lsr#9
373 eor r10,r10,r7,lsr#9
374 eor r9,r9,r7,lsl#23
375 eor r10,r10,r8,lsl#23 @ Sigma1(e)
376 adds r3,r3,r9
377 ldr r9,[sp,#40+0] @ f.lo
378 adc r4,r4,r10 @ T += Sigma1(e)
379 ldr r10,[sp,#40+4] @ f.hi
380 adds r3,r3,r11
381 ldr r11,[sp,#48+0] @ g.lo
382 adc r4,r4,r12 @ T += h
383 ldr r12,[sp,#48+4] @ g.hi
384
385 eor r9,r9,r11
386 str r7,[sp,#32+0]
387 eor r10,r10,r12
388 str r8,[sp,#32+4]
389 and r9,r9,r7
390 str r5,[sp,#0+0]
391 and r10,r10,r8
392 str r6,[sp,#0+4]
393 eor r9,r9,r11
394 ldr r11,[r14,#LO] @ K[i].lo
395 eor r10,r10,r12 @ Ch(e,f,g)
396 ldr r12,[r14,#HI] @ K[i].hi
397
398 adds r3,r3,r9
399 ldr r7,[sp,#24+0] @ d.lo
400 adc r4,r4,r10 @ T += Ch(e,f,g)
401 ldr r8,[sp,#24+4] @ d.hi
402 adds r3,r3,r11
403 and r9,r11,#0xff
404 adc r4,r4,r12 @ T += K[i]
405 adds r7,r7,r3
406 ldr r11,[sp,#8+0] @ b.lo
407 adc r8,r8,r4 @ d += T
408 teq r9,#23
409
410 ldr r12,[sp,#16+0] @ c.lo
411#if __ARM_ARCH__>=7
412 it eq @ Thumb2 thing, sanity check in ARM
413#endif
414 orreq r14,r14,#1
415 @ Sigma0(x) (ROTR((x),28) ^ ROTR((x),34) ^ ROTR((x),39))
416 @ LO lo>>28^hi<<4 ^ hi>>2^lo<<30 ^ hi>>7^lo<<25
417 @ HI hi>>28^lo<<4 ^ lo>>2^hi<<30 ^ lo>>7^hi<<25
418 mov r9,r5,lsr#28
419 mov r10,r6,lsr#28
420 eor r9,r9,r6,lsl#4
421 eor r10,r10,r5,lsl#4
422 eor r9,r9,r6,lsr#2
423 eor r10,r10,r5,lsr#2
424 eor r9,r9,r5,lsl#30
425 eor r10,r10,r6,lsl#30
426 eor r9,r9,r6,lsr#7
427 eor r10,r10,r5,lsr#7
428 eor r9,r9,r5,lsl#25
429 eor r10,r10,r6,lsl#25 @ Sigma0(a)
430 adds r3,r3,r9
431 and r9,r5,r11
432 adc r4,r4,r10 @ T += Sigma0(a)
433
434 ldr r10,[sp,#8+4] @ b.hi
435 orr r5,r5,r11
436 ldr r11,[sp,#16+4] @ c.hi
437 and r5,r5,r12
438 and r12,r6,r10
439 orr r6,r6,r10
440 orr r5,r5,r9 @ Maj(a,b,c).lo
441 and r6,r6,r11
442 adds r5,r5,r3
443 orr r6,r6,r12 @ Maj(a,b,c).hi
444 sub sp,sp,#8
445 adc r6,r6,r4 @ h += T
446 tst r14,#1
447 add r14,r14,#8
448#if __ARM_ARCH__>=7
449 ittt eq @ Thumb2 thing, sanity check in ARM
450#endif
451 ldreq r9,[sp,#184+0]
452 ldreq r10,[sp,#184+4]
453 beq L16_79
454 bic r14,r14,#1
455
456 ldr r3,[sp,#8+0]
457 ldr r4,[sp,#8+4]
458 ldr r9, [r0,#0+LO]
459 ldr r10, [r0,#0+HI]
460 ldr r11, [r0,#8+LO]
461 ldr r12, [r0,#8+HI]
462 adds r9,r5,r9
463 str r9, [r0,#0+LO]
464 adc r10,r6,r10
465 str r10, [r0,#0+HI]
466 adds r11,r3,r11
467 str r11, [r0,#8+LO]
468 adc r12,r4,r12
469 str r12, [r0,#8+HI]
470
471 ldr r5,[sp,#16+0]
472 ldr r6,[sp,#16+4]
473 ldr r3,[sp,#24+0]
474 ldr r4,[sp,#24+4]
475 ldr r9, [r0,#16+LO]
476 ldr r10, [r0,#16+HI]
477 ldr r11, [r0,#24+LO]
478 ldr r12, [r0,#24+HI]
479 adds r9,r5,r9
480 str r9, [r0,#16+LO]
481 adc r10,r6,r10
482 str r10, [r0,#16+HI]
483 adds r11,r3,r11
484 str r11, [r0,#24+LO]
485 adc r12,r4,r12
486 str r12, [r0,#24+HI]
487
488 ldr r3,[sp,#40+0]
489 ldr r4,[sp,#40+4]
490 ldr r9, [r0,#32+LO]
491 ldr r10, [r0,#32+HI]
492 ldr r11, [r0,#40+LO]
493 ldr r12, [r0,#40+HI]
494 adds r7,r7,r9
495 str r7,[r0,#32+LO]
496 adc r8,r8,r10
497 str r8,[r0,#32+HI]
498 adds r11,r3,r11
499 str r11, [r0,#40+LO]
500 adc r12,r4,r12
501 str r12, [r0,#40+HI]
502
503 ldr r5,[sp,#48+0]
504 ldr r6,[sp,#48+4]
505 ldr r3,[sp,#56+0]
506 ldr r4,[sp,#56+4]
507 ldr r9, [r0,#48+LO]
508 ldr r10, [r0,#48+HI]
509 ldr r11, [r0,#56+LO]
510 ldr r12, [r0,#56+HI]
511 adds r9,r5,r9
512 str r9, [r0,#48+LO]
513 adc r10,r6,r10
514 str r10, [r0,#48+HI]
515 adds r11,r3,r11
516 str r11, [r0,#56+LO]
517 adc r12,r4,r12
518 str r12, [r0,#56+HI]
519
520 add sp,sp,#640
521 sub r14,r14,#640
522
523 teq r1,r2
524 bne Loop
525
526 add sp,sp,#8*9 @ destroy frame
527#if __ARM_ARCH__>=5
528 ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,pc}
529#else
530 ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr}
531 tst lr,#1
532 moveq pc,lr @ be binary compatible with V4, yet
533.word 0xe12fff1e @ interoperable with Thumb ISA:-)
534#endif
535
536#if __ARM_MAX_ARCH__>=7
537
538
539
540.globl _sha512_block_data_order_neon
541.private_extern _sha512_block_data_order_neon
542#ifdef __thumb2__
543.thumb_func _sha512_block_data_order_neon
544#endif
545.align 4
546_sha512_block_data_order_neon:
547LNEON:
548 dmb @ errata #451034 on early Cortex A8
549 add r2,r1,r2,lsl#7 @ len to point at the end of inp
550 adr r3,K512
551 VFP_ABI_PUSH
552 vldmia r0,{d16,d17,d18,d19,d20,d21,d22,d23} @ load context
553Loop_neon:
554 vshr.u64 d24,d20,#14 @ 0
555#if 0<16
556 vld1.64 {d0},[r1]! @ handles unaligned
557#endif
558 vshr.u64 d25,d20,#18
559#if 0>0
560 vadd.i64 d16,d30 @ h+=Maj from the past
561#endif
562 vshr.u64 d26,d20,#41
563 vld1.64 {d28},[r3,:64]! @ K[i++]
564 vsli.64 d24,d20,#50
565 vsli.64 d25,d20,#46
566 vmov d29,d20
567 vsli.64 d26,d20,#23
568#if 0<16 && defined(__ARMEL__)
569 vrev64.8 d0,d0
570#endif
571 veor d25,d24
572 vbsl d29,d21,d22 @ Ch(e,f,g)
573 vshr.u64 d24,d16,#28
574 veor d26,d25 @ Sigma1(e)
575 vadd.i64 d27,d29,d23
576 vshr.u64 d25,d16,#34
577 vsli.64 d24,d16,#36
578 vadd.i64 d27,d26
579 vshr.u64 d26,d16,#39
580 vadd.i64 d28,d0
581 vsli.64 d25,d16,#30
582 veor d30,d16,d17
583 vsli.64 d26,d16,#25
584 veor d23,d24,d25
585 vadd.i64 d27,d28
586 vbsl d30,d18,d17 @ Maj(a,b,c)
587 veor d23,d26 @ Sigma0(a)
588 vadd.i64 d19,d27
589 vadd.i64 d30,d27
590 @ vadd.i64 d23,d30
591 vshr.u64 d24,d19,#14 @ 1
592#if 1<16
593 vld1.64 {d1},[r1]! @ handles unaligned
594#endif
595 vshr.u64 d25,d19,#18
596#if 1>0
597 vadd.i64 d23,d30 @ h+=Maj from the past
598#endif
599 vshr.u64 d26,d19,#41
600 vld1.64 {d28},[r3,:64]! @ K[i++]
601 vsli.64 d24,d19,#50
602 vsli.64 d25,d19,#46
603 vmov d29,d19
604 vsli.64 d26,d19,#23
605#if 1<16 && defined(__ARMEL__)
606 vrev64.8 d1,d1
607#endif
608 veor d25,d24
609 vbsl d29,d20,d21 @ Ch(e,f,g)
610 vshr.u64 d24,d23,#28
611 veor d26,d25 @ Sigma1(e)
612 vadd.i64 d27,d29,d22
613 vshr.u64 d25,d23,#34
614 vsli.64 d24,d23,#36
615 vadd.i64 d27,d26
616 vshr.u64 d26,d23,#39
617 vadd.i64 d28,d1
618 vsli.64 d25,d23,#30
619 veor d30,d23,d16
620 vsli.64 d26,d23,#25
621 veor d22,d24,d25
622 vadd.i64 d27,d28
623 vbsl d30,d17,d16 @ Maj(a,b,c)
624 veor d22,d26 @ Sigma0(a)
625 vadd.i64 d18,d27
626 vadd.i64 d30,d27
627 @ vadd.i64 d22,d30
628 vshr.u64 d24,d18,#14 @ 2
629#if 2<16
630 vld1.64 {d2},[r1]! @ handles unaligned
631#endif
632 vshr.u64 d25,d18,#18
633#if 2>0
634 vadd.i64 d22,d30 @ h+=Maj from the past
635#endif
636 vshr.u64 d26,d18,#41
637 vld1.64 {d28},[r3,:64]! @ K[i++]
638 vsli.64 d24,d18,#50
639 vsli.64 d25,d18,#46
640 vmov d29,d18
641 vsli.64 d26,d18,#23
642#if 2<16 && defined(__ARMEL__)
643 vrev64.8 d2,d2
644#endif
645 veor d25,d24
646 vbsl d29,d19,d20 @ Ch(e,f,g)
647 vshr.u64 d24,d22,#28
648 veor d26,d25 @ Sigma1(e)
649 vadd.i64 d27,d29,d21
650 vshr.u64 d25,d22,#34
651 vsli.64 d24,d22,#36
652 vadd.i64 d27,d26
653 vshr.u64 d26,d22,#39
654 vadd.i64 d28,d2
655 vsli.64 d25,d22,#30
656 veor d30,d22,d23
657 vsli.64 d26,d22,#25
658 veor d21,d24,d25
659 vadd.i64 d27,d28
660 vbsl d30,d16,d23 @ Maj(a,b,c)
661 veor d21,d26 @ Sigma0(a)
662 vadd.i64 d17,d27
663 vadd.i64 d30,d27
664 @ vadd.i64 d21,d30
665 vshr.u64 d24,d17,#14 @ 3
666#if 3<16
667 vld1.64 {d3},[r1]! @ handles unaligned
668#endif
669 vshr.u64 d25,d17,#18
670#if 3>0
671 vadd.i64 d21,d30 @ h+=Maj from the past
672#endif
673 vshr.u64 d26,d17,#41
674 vld1.64 {d28},[r3,:64]! @ K[i++]
675 vsli.64 d24,d17,#50
676 vsli.64 d25,d17,#46
677 vmov d29,d17
678 vsli.64 d26,d17,#23
679#if 3<16 && defined(__ARMEL__)
680 vrev64.8 d3,d3
681#endif
682 veor d25,d24
683 vbsl d29,d18,d19 @ Ch(e,f,g)
684 vshr.u64 d24,d21,#28
685 veor d26,d25 @ Sigma1(e)
686 vadd.i64 d27,d29,d20
687 vshr.u64 d25,d21,#34
688 vsli.64 d24,d21,#36
689 vadd.i64 d27,d26
690 vshr.u64 d26,d21,#39
691 vadd.i64 d28,d3
692 vsli.64 d25,d21,#30
693 veor d30,d21,d22
694 vsli.64 d26,d21,#25
695 veor d20,d24,d25
696 vadd.i64 d27,d28
697 vbsl d30,d23,d22 @ Maj(a,b,c)
698 veor d20,d26 @ Sigma0(a)
699 vadd.i64 d16,d27
700 vadd.i64 d30,d27
701 @ vadd.i64 d20,d30
702 vshr.u64 d24,d16,#14 @ 4
703#if 4<16
704 vld1.64 {d4},[r1]! @ handles unaligned
705#endif
706 vshr.u64 d25,d16,#18
707#if 4>0
708 vadd.i64 d20,d30 @ h+=Maj from the past
709#endif
710 vshr.u64 d26,d16,#41
711 vld1.64 {d28},[r3,:64]! @ K[i++]
712 vsli.64 d24,d16,#50
713 vsli.64 d25,d16,#46
714 vmov d29,d16
715 vsli.64 d26,d16,#23
716#if 4<16 && defined(__ARMEL__)
717 vrev64.8 d4,d4
718#endif
719 veor d25,d24
720 vbsl d29,d17,d18 @ Ch(e,f,g)
721 vshr.u64 d24,d20,#28
722 veor d26,d25 @ Sigma1(e)
723 vadd.i64 d27,d29,d19
724 vshr.u64 d25,d20,#34
725 vsli.64 d24,d20,#36
726 vadd.i64 d27,d26
727 vshr.u64 d26,d20,#39
728 vadd.i64 d28,d4
729 vsli.64 d25,d20,#30
730 veor d30,d20,d21
731 vsli.64 d26,d20,#25
732 veor d19,d24,d25
733 vadd.i64 d27,d28
734 vbsl d30,d22,d21 @ Maj(a,b,c)
735 veor d19,d26 @ Sigma0(a)
736 vadd.i64 d23,d27
737 vadd.i64 d30,d27
738 @ vadd.i64 d19,d30
739 vshr.u64 d24,d23,#14 @ 5
740#if 5<16
741 vld1.64 {d5},[r1]! @ handles unaligned
742#endif
743 vshr.u64 d25,d23,#18
744#if 5>0
745 vadd.i64 d19,d30 @ h+=Maj from the past
746#endif
747 vshr.u64 d26,d23,#41
748 vld1.64 {d28},[r3,:64]! @ K[i++]
749 vsli.64 d24,d23,#50
750 vsli.64 d25,d23,#46
751 vmov d29,d23
752 vsli.64 d26,d23,#23
753#if 5<16 && defined(__ARMEL__)
754 vrev64.8 d5,d5
755#endif
756 veor d25,d24
757 vbsl d29,d16,d17 @ Ch(e,f,g)
758 vshr.u64 d24,d19,#28
759 veor d26,d25 @ Sigma1(e)
760 vadd.i64 d27,d29,d18
761 vshr.u64 d25,d19,#34
762 vsli.64 d24,d19,#36
763 vadd.i64 d27,d26
764 vshr.u64 d26,d19,#39
765 vadd.i64 d28,d5
766 vsli.64 d25,d19,#30
767 veor d30,d19,d20
768 vsli.64 d26,d19,#25
769 veor d18,d24,d25
770 vadd.i64 d27,d28
771 vbsl d30,d21,d20 @ Maj(a,b,c)
772 veor d18,d26 @ Sigma0(a)
773 vadd.i64 d22,d27
774 vadd.i64 d30,d27
775 @ vadd.i64 d18,d30
776 vshr.u64 d24,d22,#14 @ 6
777#if 6<16
778 vld1.64 {d6},[r1]! @ handles unaligned
779#endif
780 vshr.u64 d25,d22,#18
781#if 6>0
782 vadd.i64 d18,d30 @ h+=Maj from the past
783#endif
784 vshr.u64 d26,d22,#41
785 vld1.64 {d28},[r3,:64]! @ K[i++]
786 vsli.64 d24,d22,#50
787 vsli.64 d25,d22,#46
788 vmov d29,d22
789 vsli.64 d26,d22,#23
790#if 6<16 && defined(__ARMEL__)
791 vrev64.8 d6,d6
792#endif
793 veor d25,d24
794 vbsl d29,d23,d16 @ Ch(e,f,g)
795 vshr.u64 d24,d18,#28
796 veor d26,d25 @ Sigma1(e)
797 vadd.i64 d27,d29,d17
798 vshr.u64 d25,d18,#34
799 vsli.64 d24,d18,#36
800 vadd.i64 d27,d26
801 vshr.u64 d26,d18,#39
802 vadd.i64 d28,d6
803 vsli.64 d25,d18,#30
804 veor d30,d18,d19
805 vsli.64 d26,d18,#25
806 veor d17,d24,d25
807 vadd.i64 d27,d28
808 vbsl d30,d20,d19 @ Maj(a,b,c)
809 veor d17,d26 @ Sigma0(a)
810 vadd.i64 d21,d27
811 vadd.i64 d30,d27
812 @ vadd.i64 d17,d30
813 vshr.u64 d24,d21,#14 @ 7
814#if 7<16
815 vld1.64 {d7},[r1]! @ handles unaligned
816#endif
817 vshr.u64 d25,d21,#18
818#if 7>0
819 vadd.i64 d17,d30 @ h+=Maj from the past
820#endif
821 vshr.u64 d26,d21,#41
822 vld1.64 {d28},[r3,:64]! @ K[i++]
823 vsli.64 d24,d21,#50
824 vsli.64 d25,d21,#46
825 vmov d29,d21
826 vsli.64 d26,d21,#23
827#if 7<16 && defined(__ARMEL__)
828 vrev64.8 d7,d7
829#endif
830 veor d25,d24
831 vbsl d29,d22,d23 @ Ch(e,f,g)
832 vshr.u64 d24,d17,#28
833 veor d26,d25 @ Sigma1(e)
834 vadd.i64 d27,d29,d16
835 vshr.u64 d25,d17,#34
836 vsli.64 d24,d17,#36
837 vadd.i64 d27,d26
838 vshr.u64 d26,d17,#39
839 vadd.i64 d28,d7
840 vsli.64 d25,d17,#30
841 veor d30,d17,d18
842 vsli.64 d26,d17,#25
843 veor d16,d24,d25
844 vadd.i64 d27,d28
845 vbsl d30,d19,d18 @ Maj(a,b,c)
846 veor d16,d26 @ Sigma0(a)
847 vadd.i64 d20,d27
848 vadd.i64 d30,d27
849 @ vadd.i64 d16,d30
850 vshr.u64 d24,d20,#14 @ 8
851#if 8<16
852 vld1.64 {d8},[r1]! @ handles unaligned
853#endif
854 vshr.u64 d25,d20,#18
855#if 8>0
856 vadd.i64 d16,d30 @ h+=Maj from the past
857#endif
858 vshr.u64 d26,d20,#41
859 vld1.64 {d28},[r3,:64]! @ K[i++]
860 vsli.64 d24,d20,#50
861 vsli.64 d25,d20,#46
862 vmov d29,d20
863 vsli.64 d26,d20,#23
864#if 8<16 && defined(__ARMEL__)
865 vrev64.8 d8,d8
866#endif
867 veor d25,d24
868 vbsl d29,d21,d22 @ Ch(e,f,g)
869 vshr.u64 d24,d16,#28
870 veor d26,d25 @ Sigma1(e)
871 vadd.i64 d27,d29,d23
872 vshr.u64 d25,d16,#34
873 vsli.64 d24,d16,#36
874 vadd.i64 d27,d26
875 vshr.u64 d26,d16,#39
876 vadd.i64 d28,d8
877 vsli.64 d25,d16,#30
878 veor d30,d16,d17
879 vsli.64 d26,d16,#25
880 veor d23,d24,d25
881 vadd.i64 d27,d28
882 vbsl d30,d18,d17 @ Maj(a,b,c)
883 veor d23,d26 @ Sigma0(a)
884 vadd.i64 d19,d27
885 vadd.i64 d30,d27
886 @ vadd.i64 d23,d30
887 vshr.u64 d24,d19,#14 @ 9
888#if 9<16
889 vld1.64 {d9},[r1]! @ handles unaligned
890#endif
891 vshr.u64 d25,d19,#18
892#if 9>0
893 vadd.i64 d23,d30 @ h+=Maj from the past
894#endif
895 vshr.u64 d26,d19,#41
896 vld1.64 {d28},[r3,:64]! @ K[i++]
897 vsli.64 d24,d19,#50
898 vsli.64 d25,d19,#46
899 vmov d29,d19
900 vsli.64 d26,d19,#23
901#if 9<16 && defined(__ARMEL__)
902 vrev64.8 d9,d9
903#endif
904 veor d25,d24
905 vbsl d29,d20,d21 @ Ch(e,f,g)
906 vshr.u64 d24,d23,#28
907 veor d26,d25 @ Sigma1(e)
908 vadd.i64 d27,d29,d22
909 vshr.u64 d25,d23,#34
910 vsli.64 d24,d23,#36
911 vadd.i64 d27,d26
912 vshr.u64 d26,d23,#39
913 vadd.i64 d28,d9
914 vsli.64 d25,d23,#30
915 veor d30,d23,d16
916 vsli.64 d26,d23,#25
917 veor d22,d24,d25
918 vadd.i64 d27,d28
919 vbsl d30,d17,d16 @ Maj(a,b,c)
920 veor d22,d26 @ Sigma0(a)
921 vadd.i64 d18,d27
922 vadd.i64 d30,d27
923 @ vadd.i64 d22,d30
924 vshr.u64 d24,d18,#14 @ 10
925#if 10<16
926 vld1.64 {d10},[r1]! @ handles unaligned
927#endif
928 vshr.u64 d25,d18,#18
929#if 10>0
930 vadd.i64 d22,d30 @ h+=Maj from the past
931#endif
932 vshr.u64 d26,d18,#41
933 vld1.64 {d28},[r3,:64]! @ K[i++]
934 vsli.64 d24,d18,#50
935 vsli.64 d25,d18,#46
936 vmov d29,d18
937 vsli.64 d26,d18,#23
938#if 10<16 && defined(__ARMEL__)
939 vrev64.8 d10,d10
940#endif
941 veor d25,d24
942 vbsl d29,d19,d20 @ Ch(e,f,g)
943 vshr.u64 d24,d22,#28
944 veor d26,d25 @ Sigma1(e)
945 vadd.i64 d27,d29,d21
946 vshr.u64 d25,d22,#34
947 vsli.64 d24,d22,#36
948 vadd.i64 d27,d26
949 vshr.u64 d26,d22,#39
950 vadd.i64 d28,d10
951 vsli.64 d25,d22,#30
952 veor d30,d22,d23
953 vsli.64 d26,d22,#25
954 veor d21,d24,d25
955 vadd.i64 d27,d28
956 vbsl d30,d16,d23 @ Maj(a,b,c)
957 veor d21,d26 @ Sigma0(a)
958 vadd.i64 d17,d27
959 vadd.i64 d30,d27
960 @ vadd.i64 d21,d30
961 vshr.u64 d24,d17,#14 @ 11
962#if 11<16
963 vld1.64 {d11},[r1]! @ handles unaligned
964#endif
965 vshr.u64 d25,d17,#18
966#if 11>0
967 vadd.i64 d21,d30 @ h+=Maj from the past
968#endif
969 vshr.u64 d26,d17,#41
970 vld1.64 {d28},[r3,:64]! @ K[i++]
971 vsli.64 d24,d17,#50
972 vsli.64 d25,d17,#46
973 vmov d29,d17
974 vsli.64 d26,d17,#23
975#if 11<16 && defined(__ARMEL__)
976 vrev64.8 d11,d11
977#endif
978 veor d25,d24
979 vbsl d29,d18,d19 @ Ch(e,f,g)
980 vshr.u64 d24,d21,#28
981 veor d26,d25 @ Sigma1(e)
982 vadd.i64 d27,d29,d20
983 vshr.u64 d25,d21,#34
984 vsli.64 d24,d21,#36
985 vadd.i64 d27,d26
986 vshr.u64 d26,d21,#39
987 vadd.i64 d28,d11
988 vsli.64 d25,d21,#30
989 veor d30,d21,d22
990 vsli.64 d26,d21,#25
991 veor d20,d24,d25
992 vadd.i64 d27,d28
993 vbsl d30,d23,d22 @ Maj(a,b,c)
994 veor d20,d26 @ Sigma0(a)
995 vadd.i64 d16,d27
996 vadd.i64 d30,d27
997 @ vadd.i64 d20,d30
998 vshr.u64 d24,d16,#14 @ 12
999#if 12<16
1000 vld1.64 {d12},[r1]! @ handles unaligned
1001#endif
1002 vshr.u64 d25,d16,#18
1003#if 12>0
1004 vadd.i64 d20,d30 @ h+=Maj from the past
1005#endif
1006 vshr.u64 d26,d16,#41
1007 vld1.64 {d28},[r3,:64]! @ K[i++]
1008 vsli.64 d24,d16,#50
1009 vsli.64 d25,d16,#46
1010 vmov d29,d16
1011 vsli.64 d26,d16,#23
1012#if 12<16 && defined(__ARMEL__)
1013 vrev64.8 d12,d12
1014#endif
1015 veor d25,d24
1016 vbsl d29,d17,d18 @ Ch(e,f,g)
1017 vshr.u64 d24,d20,#28
1018 veor d26,d25 @ Sigma1(e)
1019 vadd.i64 d27,d29,d19
1020 vshr.u64 d25,d20,#34
1021 vsli.64 d24,d20,#36
1022 vadd.i64 d27,d26
1023 vshr.u64 d26,d20,#39
1024 vadd.i64 d28,d12
1025 vsli.64 d25,d20,#30
1026 veor d30,d20,d21
1027 vsli.64 d26,d20,#25
1028 veor d19,d24,d25
1029 vadd.i64 d27,d28
1030 vbsl d30,d22,d21 @ Maj(a,b,c)
1031 veor d19,d26 @ Sigma0(a)
1032 vadd.i64 d23,d27
1033 vadd.i64 d30,d27
1034 @ vadd.i64 d19,d30
1035 vshr.u64 d24,d23,#14 @ 13
1036#if 13<16
1037 vld1.64 {d13},[r1]! @ handles unaligned
1038#endif
1039 vshr.u64 d25,d23,#18
1040#if 13>0
1041 vadd.i64 d19,d30 @ h+=Maj from the past
1042#endif
1043 vshr.u64 d26,d23,#41
1044 vld1.64 {d28},[r3,:64]! @ K[i++]
1045 vsli.64 d24,d23,#50
1046 vsli.64 d25,d23,#46
1047 vmov d29,d23
1048 vsli.64 d26,d23,#23
1049#if 13<16 && defined(__ARMEL__)
1050 vrev64.8 d13,d13
1051#endif
1052 veor d25,d24
1053 vbsl d29,d16,d17 @ Ch(e,f,g)
1054 vshr.u64 d24,d19,#28
1055 veor d26,d25 @ Sigma1(e)
1056 vadd.i64 d27,d29,d18
1057 vshr.u64 d25,d19,#34
1058 vsli.64 d24,d19,#36
1059 vadd.i64 d27,d26
1060 vshr.u64 d26,d19,#39
1061 vadd.i64 d28,d13
1062 vsli.64 d25,d19,#30
1063 veor d30,d19,d20
1064 vsli.64 d26,d19,#25
1065 veor d18,d24,d25
1066 vadd.i64 d27,d28
1067 vbsl d30,d21,d20 @ Maj(a,b,c)
1068 veor d18,d26 @ Sigma0(a)
1069 vadd.i64 d22,d27
1070 vadd.i64 d30,d27
1071 @ vadd.i64 d18,d30
1072 vshr.u64 d24,d22,#14 @ 14
1073#if 14<16
1074 vld1.64 {d14},[r1]! @ handles unaligned
1075#endif
1076 vshr.u64 d25,d22,#18
1077#if 14>0
1078 vadd.i64 d18,d30 @ h+=Maj from the past
1079#endif
1080 vshr.u64 d26,d22,#41
1081 vld1.64 {d28},[r3,:64]! @ K[i++]
1082 vsli.64 d24,d22,#50
1083 vsli.64 d25,d22,#46
1084 vmov d29,d22
1085 vsli.64 d26,d22,#23
1086#if 14<16 && defined(__ARMEL__)
1087 vrev64.8 d14,d14
1088#endif
1089 veor d25,d24
1090 vbsl d29,d23,d16 @ Ch(e,f,g)
1091 vshr.u64 d24,d18,#28
1092 veor d26,d25 @ Sigma1(e)
1093 vadd.i64 d27,d29,d17
1094 vshr.u64 d25,d18,#34
1095 vsli.64 d24,d18,#36
1096 vadd.i64 d27,d26
1097 vshr.u64 d26,d18,#39
1098 vadd.i64 d28,d14
1099 vsli.64 d25,d18,#30
1100 veor d30,d18,d19
1101 vsli.64 d26,d18,#25
1102 veor d17,d24,d25
1103 vadd.i64 d27,d28
1104 vbsl d30,d20,d19 @ Maj(a,b,c)
1105 veor d17,d26 @ Sigma0(a)
1106 vadd.i64 d21,d27
1107 vadd.i64 d30,d27
1108 @ vadd.i64 d17,d30
1109 vshr.u64 d24,d21,#14 @ 15
1110#if 15<16
1111 vld1.64 {d15},[r1]! @ handles unaligned
1112#endif
1113 vshr.u64 d25,d21,#18
1114#if 15>0
1115 vadd.i64 d17,d30 @ h+=Maj from the past
1116#endif
1117 vshr.u64 d26,d21,#41
1118 vld1.64 {d28},[r3,:64]! @ K[i++]
1119 vsli.64 d24,d21,#50
1120 vsli.64 d25,d21,#46
1121 vmov d29,d21
1122 vsli.64 d26,d21,#23
1123#if 15<16 && defined(__ARMEL__)
1124 vrev64.8 d15,d15
1125#endif
1126 veor d25,d24
1127 vbsl d29,d22,d23 @ Ch(e,f,g)
1128 vshr.u64 d24,d17,#28
1129 veor d26,d25 @ Sigma1(e)
1130 vadd.i64 d27,d29,d16
1131 vshr.u64 d25,d17,#34
1132 vsli.64 d24,d17,#36
1133 vadd.i64 d27,d26
1134 vshr.u64 d26,d17,#39
1135 vadd.i64 d28,d15
1136 vsli.64 d25,d17,#30
1137 veor d30,d17,d18
1138 vsli.64 d26,d17,#25
1139 veor d16,d24,d25
1140 vadd.i64 d27,d28
1141 vbsl d30,d19,d18 @ Maj(a,b,c)
1142 veor d16,d26 @ Sigma0(a)
1143 vadd.i64 d20,d27
1144 vadd.i64 d30,d27
1145 @ vadd.i64 d16,d30
1146 mov r12,#4
1147L16_79_neon:
1148 subs r12,#1
1149 vshr.u64 q12,q7,#19
1150 vshr.u64 q13,q7,#61
1151 vadd.i64 d16,d30 @ h+=Maj from the past
1152 vshr.u64 q15,q7,#6
1153 vsli.64 q12,q7,#45
1154 vext.8 q14,q0,q1,#8 @ X[i+1]
1155 vsli.64 q13,q7,#3
1156 veor q15,q12
1157 vshr.u64 q12,q14,#1
1158 veor q15,q13 @ sigma1(X[i+14])
1159 vshr.u64 q13,q14,#8
1160 vadd.i64 q0,q15
1161 vshr.u64 q15,q14,#7
1162 vsli.64 q12,q14,#63
1163 vsli.64 q13,q14,#56
1164 vext.8 q14,q4,q5,#8 @ X[i+9]
1165 veor q15,q12
1166 vshr.u64 d24,d20,#14 @ from NEON_00_15
1167 vadd.i64 q0,q14
1168 vshr.u64 d25,d20,#18 @ from NEON_00_15
1169 veor q15,q13 @ sigma0(X[i+1])
1170 vshr.u64 d26,d20,#41 @ from NEON_00_15
1171 vadd.i64 q0,q15
1172 vld1.64 {d28},[r3,:64]! @ K[i++]
1173 vsli.64 d24,d20,#50
1174 vsli.64 d25,d20,#46
1175 vmov d29,d20
1176 vsli.64 d26,d20,#23
1177#if 16<16 && defined(__ARMEL__)
1178 vrev64.8 ,
1179#endif
1180 veor d25,d24
1181 vbsl d29,d21,d22 @ Ch(e,f,g)
1182 vshr.u64 d24,d16,#28
1183 veor d26,d25 @ Sigma1(e)
1184 vadd.i64 d27,d29,d23
1185 vshr.u64 d25,d16,#34
1186 vsli.64 d24,d16,#36
1187 vadd.i64 d27,d26
1188 vshr.u64 d26,d16,#39
1189 vadd.i64 d28,d0
1190 vsli.64 d25,d16,#30
1191 veor d30,d16,d17
1192 vsli.64 d26,d16,#25
1193 veor d23,d24,d25
1194 vadd.i64 d27,d28
1195 vbsl d30,d18,d17 @ Maj(a,b,c)
1196 veor d23,d26 @ Sigma0(a)
1197 vadd.i64 d19,d27
1198 vadd.i64 d30,d27
1199 @ vadd.i64 d23,d30
1200 vshr.u64 d24,d19,#14 @ 17
1201#if 17<16
1202 vld1.64 {d1},[r1]! @ handles unaligned
1203#endif
1204 vshr.u64 d25,d19,#18
1205#if 17>0
1206 vadd.i64 d23,d30 @ h+=Maj from the past
1207#endif
1208 vshr.u64 d26,d19,#41
1209 vld1.64 {d28},[r3,:64]! @ K[i++]
1210 vsli.64 d24,d19,#50
1211 vsli.64 d25,d19,#46
1212 vmov d29,d19
1213 vsli.64 d26,d19,#23
1214#if 17<16 && defined(__ARMEL__)
1215 vrev64.8 ,
1216#endif
1217 veor d25,d24
1218 vbsl d29,d20,d21 @ Ch(e,f,g)
1219 vshr.u64 d24,d23,#28
1220 veor d26,d25 @ Sigma1(e)
1221 vadd.i64 d27,d29,d22
1222 vshr.u64 d25,d23,#34
1223 vsli.64 d24,d23,#36
1224 vadd.i64 d27,d26
1225 vshr.u64 d26,d23,#39
1226 vadd.i64 d28,d1
1227 vsli.64 d25,d23,#30
1228 veor d30,d23,d16
1229 vsli.64 d26,d23,#25
1230 veor d22,d24,d25
1231 vadd.i64 d27,d28
1232 vbsl d30,d17,d16 @ Maj(a,b,c)
1233 veor d22,d26 @ Sigma0(a)
1234 vadd.i64 d18,d27
1235 vadd.i64 d30,d27
1236 @ vadd.i64 d22,d30
1237 vshr.u64 q12,q0,#19
1238 vshr.u64 q13,q0,#61
1239 vadd.i64 d22,d30 @ h+=Maj from the past
1240 vshr.u64 q15,q0,#6
1241 vsli.64 q12,q0,#45
1242 vext.8 q14,q1,q2,#8 @ X[i+1]
1243 vsli.64 q13,q0,#3
1244 veor q15,q12
1245 vshr.u64 q12,q14,#1
1246 veor q15,q13 @ sigma1(X[i+14])
1247 vshr.u64 q13,q14,#8
1248 vadd.i64 q1,q15
1249 vshr.u64 q15,q14,#7
1250 vsli.64 q12,q14,#63
1251 vsli.64 q13,q14,#56
1252 vext.8 q14,q5,q6,#8 @ X[i+9]
1253 veor q15,q12
1254 vshr.u64 d24,d18,#14 @ from NEON_00_15
1255 vadd.i64 q1,q14
1256 vshr.u64 d25,d18,#18 @ from NEON_00_15
1257 veor q15,q13 @ sigma0(X[i+1])
1258 vshr.u64 d26,d18,#41 @ from NEON_00_15
1259 vadd.i64 q1,q15
1260 vld1.64 {d28},[r3,:64]! @ K[i++]
1261 vsli.64 d24,d18,#50
1262 vsli.64 d25,d18,#46
1263 vmov d29,d18
1264 vsli.64 d26,d18,#23
1265#if 18<16 && defined(__ARMEL__)
1266 vrev64.8 ,
1267#endif
1268 veor d25,d24
1269 vbsl d29,d19,d20 @ Ch(e,f,g)
1270 vshr.u64 d24,d22,#28
1271 veor d26,d25 @ Sigma1(e)
1272 vadd.i64 d27,d29,d21
1273 vshr.u64 d25,d22,#34
1274 vsli.64 d24,d22,#36
1275 vadd.i64 d27,d26
1276 vshr.u64 d26,d22,#39
1277 vadd.i64 d28,d2
1278 vsli.64 d25,d22,#30
1279 veor d30,d22,d23
1280 vsli.64 d26,d22,#25
1281 veor d21,d24,d25
1282 vadd.i64 d27,d28
1283 vbsl d30,d16,d23 @ Maj(a,b,c)
1284 veor d21,d26 @ Sigma0(a)
1285 vadd.i64 d17,d27
1286 vadd.i64 d30,d27
1287 @ vadd.i64 d21,d30
1288 vshr.u64 d24,d17,#14 @ 19
1289#if 19<16
1290 vld1.64 {d3},[r1]! @ handles unaligned
1291#endif
1292 vshr.u64 d25,d17,#18
1293#if 19>0
1294 vadd.i64 d21,d30 @ h+=Maj from the past
1295#endif
1296 vshr.u64 d26,d17,#41
1297 vld1.64 {d28},[r3,:64]! @ K[i++]
1298 vsli.64 d24,d17,#50
1299 vsli.64 d25,d17,#46
1300 vmov d29,d17
1301 vsli.64 d26,d17,#23
1302#if 19<16 && defined(__ARMEL__)
1303 vrev64.8 ,
1304#endif
1305 veor d25,d24
1306 vbsl d29,d18,d19 @ Ch(e,f,g)
1307 vshr.u64 d24,d21,#28
1308 veor d26,d25 @ Sigma1(e)
1309 vadd.i64 d27,d29,d20
1310 vshr.u64 d25,d21,#34
1311 vsli.64 d24,d21,#36
1312 vadd.i64 d27,d26
1313 vshr.u64 d26,d21,#39
1314 vadd.i64 d28,d3
1315 vsli.64 d25,d21,#30
1316 veor d30,d21,d22
1317 vsli.64 d26,d21,#25
1318 veor d20,d24,d25
1319 vadd.i64 d27,d28
1320 vbsl d30,d23,d22 @ Maj(a,b,c)
1321 veor d20,d26 @ Sigma0(a)
1322 vadd.i64 d16,d27
1323 vadd.i64 d30,d27
1324 @ vadd.i64 d20,d30
1325 vshr.u64 q12,q1,#19
1326 vshr.u64 q13,q1,#61
1327 vadd.i64 d20,d30 @ h+=Maj from the past
1328 vshr.u64 q15,q1,#6
1329 vsli.64 q12,q1,#45
1330 vext.8 q14,q2,q3,#8 @ X[i+1]
1331 vsli.64 q13,q1,#3
1332 veor q15,q12
1333 vshr.u64 q12,q14,#1
1334 veor q15,q13 @ sigma1(X[i+14])
1335 vshr.u64 q13,q14,#8
1336 vadd.i64 q2,q15
1337 vshr.u64 q15,q14,#7
1338 vsli.64 q12,q14,#63
1339 vsli.64 q13,q14,#56
1340 vext.8 q14,q6,q7,#8 @ X[i+9]
1341 veor q15,q12
1342 vshr.u64 d24,d16,#14 @ from NEON_00_15
1343 vadd.i64 q2,q14
1344 vshr.u64 d25,d16,#18 @ from NEON_00_15
1345 veor q15,q13 @ sigma0(X[i+1])
1346 vshr.u64 d26,d16,#41 @ from NEON_00_15
1347 vadd.i64 q2,q15
1348 vld1.64 {d28},[r3,:64]! @ K[i++]
1349 vsli.64 d24,d16,#50
1350 vsli.64 d25,d16,#46
1351 vmov d29,d16
1352 vsli.64 d26,d16,#23
1353#if 20<16 && defined(__ARMEL__)
1354 vrev64.8 ,
1355#endif
1356 veor d25,d24
1357 vbsl d29,d17,d18 @ Ch(e,f,g)
1358 vshr.u64 d24,d20,#28
1359 veor d26,d25 @ Sigma1(e)
1360 vadd.i64 d27,d29,d19
1361 vshr.u64 d25,d20,#34
1362 vsli.64 d24,d20,#36
1363 vadd.i64 d27,d26
1364 vshr.u64 d26,d20,#39
1365 vadd.i64 d28,d4
1366 vsli.64 d25,d20,#30
1367 veor d30,d20,d21
1368 vsli.64 d26,d20,#25
1369 veor d19,d24,d25
1370 vadd.i64 d27,d28
1371 vbsl d30,d22,d21 @ Maj(a,b,c)
1372 veor d19,d26 @ Sigma0(a)
1373 vadd.i64 d23,d27
1374 vadd.i64 d30,d27
1375 @ vadd.i64 d19,d30
1376 vshr.u64 d24,d23,#14 @ 21
1377#if 21<16
1378 vld1.64 {d5},[r1]! @ handles unaligned
1379#endif
1380 vshr.u64 d25,d23,#18
1381#if 21>0
1382 vadd.i64 d19,d30 @ h+=Maj from the past
1383#endif
1384 vshr.u64 d26,d23,#41
1385 vld1.64 {d28},[r3,:64]! @ K[i++]
1386 vsli.64 d24,d23,#50
1387 vsli.64 d25,d23,#46
1388 vmov d29,d23
1389 vsli.64 d26,d23,#23
1390#if 21<16 && defined(__ARMEL__)
1391 vrev64.8 ,
1392#endif
1393 veor d25,d24
1394 vbsl d29,d16,d17 @ Ch(e,f,g)
1395 vshr.u64 d24,d19,#28
1396 veor d26,d25 @ Sigma1(e)
1397 vadd.i64 d27,d29,d18
1398 vshr.u64 d25,d19,#34
1399 vsli.64 d24,d19,#36
1400 vadd.i64 d27,d26
1401 vshr.u64 d26,d19,#39
1402 vadd.i64 d28,d5
1403 vsli.64 d25,d19,#30
1404 veor d30,d19,d20
1405 vsli.64 d26,d19,#25
1406 veor d18,d24,d25
1407 vadd.i64 d27,d28
1408 vbsl d30,d21,d20 @ Maj(a,b,c)
1409 veor d18,d26 @ Sigma0(a)
1410 vadd.i64 d22,d27
1411 vadd.i64 d30,d27
1412 @ vadd.i64 d18,d30
1413 vshr.u64 q12,q2,#19
1414 vshr.u64 q13,q2,#61
1415 vadd.i64 d18,d30 @ h+=Maj from the past
1416 vshr.u64 q15,q2,#6
1417 vsli.64 q12,q2,#45
1418 vext.8 q14,q3,q4,#8 @ X[i+1]
1419 vsli.64 q13,q2,#3
1420 veor q15,q12
1421 vshr.u64 q12,q14,#1
1422 veor q15,q13 @ sigma1(X[i+14])
1423 vshr.u64 q13,q14,#8
1424 vadd.i64 q3,q15
1425 vshr.u64 q15,q14,#7
1426 vsli.64 q12,q14,#63
1427 vsli.64 q13,q14,#56
1428 vext.8 q14,q7,q0,#8 @ X[i+9]
1429 veor q15,q12
1430 vshr.u64 d24,d22,#14 @ from NEON_00_15
1431 vadd.i64 q3,q14
1432 vshr.u64 d25,d22,#18 @ from NEON_00_15
1433 veor q15,q13 @ sigma0(X[i+1])
1434 vshr.u64 d26,d22,#41 @ from NEON_00_15
1435 vadd.i64 q3,q15
1436 vld1.64 {d28},[r3,:64]! @ K[i++]
1437 vsli.64 d24,d22,#50
1438 vsli.64 d25,d22,#46
1439 vmov d29,d22
1440 vsli.64 d26,d22,#23
1441#if 22<16 && defined(__ARMEL__)
1442 vrev64.8 ,
1443#endif
1444 veor d25,d24
1445 vbsl d29,d23,d16 @ Ch(e,f,g)
1446 vshr.u64 d24,d18,#28
1447 veor d26,d25 @ Sigma1(e)
1448 vadd.i64 d27,d29,d17
1449 vshr.u64 d25,d18,#34
1450 vsli.64 d24,d18,#36
1451 vadd.i64 d27,d26
1452 vshr.u64 d26,d18,#39
1453 vadd.i64 d28,d6
1454 vsli.64 d25,d18,#30
1455 veor d30,d18,d19
1456 vsli.64 d26,d18,#25
1457 veor d17,d24,d25
1458 vadd.i64 d27,d28
1459 vbsl d30,d20,d19 @ Maj(a,b,c)
1460 veor d17,d26 @ Sigma0(a)
1461 vadd.i64 d21,d27
1462 vadd.i64 d30,d27
1463 @ vadd.i64 d17,d30
1464 vshr.u64 d24,d21,#14 @ 23
1465#if 23<16
1466 vld1.64 {d7},[r1]! @ handles unaligned
1467#endif
1468 vshr.u64 d25,d21,#18
1469#if 23>0
1470 vadd.i64 d17,d30 @ h+=Maj from the past
1471#endif
1472 vshr.u64 d26,d21,#41
1473 vld1.64 {d28},[r3,:64]! @ K[i++]
1474 vsli.64 d24,d21,#50
1475 vsli.64 d25,d21,#46
1476 vmov d29,d21
1477 vsli.64 d26,d21,#23
1478#if 23<16 && defined(__ARMEL__)
1479 vrev64.8 ,
1480#endif
1481 veor d25,d24
1482 vbsl d29,d22,d23 @ Ch(e,f,g)
1483 vshr.u64 d24,d17,#28
1484 veor d26,d25 @ Sigma1(e)
1485 vadd.i64 d27,d29,d16
1486 vshr.u64 d25,d17,#34
1487 vsli.64 d24,d17,#36
1488 vadd.i64 d27,d26
1489 vshr.u64 d26,d17,#39
1490 vadd.i64 d28,d7
1491 vsli.64 d25,d17,#30
1492 veor d30,d17,d18
1493 vsli.64 d26,d17,#25
1494 veor d16,d24,d25
1495 vadd.i64 d27,d28
1496 vbsl d30,d19,d18 @ Maj(a,b,c)
1497 veor d16,d26 @ Sigma0(a)
1498 vadd.i64 d20,d27
1499 vadd.i64 d30,d27
1500 @ vadd.i64 d16,d30
1501 vshr.u64 q12,q3,#19
1502 vshr.u64 q13,q3,#61
1503 vadd.i64 d16,d30 @ h+=Maj from the past
1504 vshr.u64 q15,q3,#6
1505 vsli.64 q12,q3,#45
1506 vext.8 q14,q4,q5,#8 @ X[i+1]
1507 vsli.64 q13,q3,#3
1508 veor q15,q12
1509 vshr.u64 q12,q14,#1
1510 veor q15,q13 @ sigma1(X[i+14])
1511 vshr.u64 q13,q14,#8
1512 vadd.i64 q4,q15
1513 vshr.u64 q15,q14,#7
1514 vsli.64 q12,q14,#63
1515 vsli.64 q13,q14,#56
1516 vext.8 q14,q0,q1,#8 @ X[i+9]
1517 veor q15,q12
1518 vshr.u64 d24,d20,#14 @ from NEON_00_15
1519 vadd.i64 q4,q14
1520 vshr.u64 d25,d20,#18 @ from NEON_00_15
1521 veor q15,q13 @ sigma0(X[i+1])
1522 vshr.u64 d26,d20,#41 @ from NEON_00_15
1523 vadd.i64 q4,q15
1524 vld1.64 {d28},[r3,:64]! @ K[i++]
1525 vsli.64 d24,d20,#50
1526 vsli.64 d25,d20,#46
1527 vmov d29,d20
1528 vsli.64 d26,d20,#23
1529#if 24<16 && defined(__ARMEL__)
1530 vrev64.8 ,
1531#endif
1532 veor d25,d24
1533 vbsl d29,d21,d22 @ Ch(e,f,g)
1534 vshr.u64 d24,d16,#28
1535 veor d26,d25 @ Sigma1(e)
1536 vadd.i64 d27,d29,d23
1537 vshr.u64 d25,d16,#34
1538 vsli.64 d24,d16,#36
1539 vadd.i64 d27,d26
1540 vshr.u64 d26,d16,#39
1541 vadd.i64 d28,d8
1542 vsli.64 d25,d16,#30
1543 veor d30,d16,d17
1544 vsli.64 d26,d16,#25
1545 veor d23,d24,d25
1546 vadd.i64 d27,d28
1547 vbsl d30,d18,d17 @ Maj(a,b,c)
1548 veor d23,d26 @ Sigma0(a)
1549 vadd.i64 d19,d27
1550 vadd.i64 d30,d27
1551 @ vadd.i64 d23,d30
1552 vshr.u64 d24,d19,#14 @ 25
1553#if 25<16
1554 vld1.64 {d9},[r1]! @ handles unaligned
1555#endif
1556 vshr.u64 d25,d19,#18
1557#if 25>0
1558 vadd.i64 d23,d30 @ h+=Maj from the past
1559#endif
1560 vshr.u64 d26,d19,#41
1561 vld1.64 {d28},[r3,:64]! @ K[i++]
1562 vsli.64 d24,d19,#50
1563 vsli.64 d25,d19,#46
1564 vmov d29,d19
1565 vsli.64 d26,d19,#23
1566#if 25<16 && defined(__ARMEL__)
1567 vrev64.8 ,
1568#endif
1569 veor d25,d24
1570 vbsl d29,d20,d21 @ Ch(e,f,g)
1571 vshr.u64 d24,d23,#28
1572 veor d26,d25 @ Sigma1(e)
1573 vadd.i64 d27,d29,d22
1574 vshr.u64 d25,d23,#34
1575 vsli.64 d24,d23,#36
1576 vadd.i64 d27,d26
1577 vshr.u64 d26,d23,#39
1578 vadd.i64 d28,d9
1579 vsli.64 d25,d23,#30
1580 veor d30,d23,d16
1581 vsli.64 d26,d23,#25
1582 veor d22,d24,d25
1583 vadd.i64 d27,d28
1584 vbsl d30,d17,d16 @ Maj(a,b,c)
1585 veor d22,d26 @ Sigma0(a)
1586 vadd.i64 d18,d27
1587 vadd.i64 d30,d27
1588 @ vadd.i64 d22,d30
1589 vshr.u64 q12,q4,#19
1590 vshr.u64 q13,q4,#61
1591 vadd.i64 d22,d30 @ h+=Maj from the past
1592 vshr.u64 q15,q4,#6
1593 vsli.64 q12,q4,#45
1594 vext.8 q14,q5,q6,#8 @ X[i+1]
1595 vsli.64 q13,q4,#3
1596 veor q15,q12
1597 vshr.u64 q12,q14,#1
1598 veor q15,q13 @ sigma1(X[i+14])
1599 vshr.u64 q13,q14,#8
1600 vadd.i64 q5,q15
1601 vshr.u64 q15,q14,#7
1602 vsli.64 q12,q14,#63
1603 vsli.64 q13,q14,#56
1604 vext.8 q14,q1,q2,#8 @ X[i+9]
1605 veor q15,q12
1606 vshr.u64 d24,d18,#14 @ from NEON_00_15
1607 vadd.i64 q5,q14
1608 vshr.u64 d25,d18,#18 @ from NEON_00_15
1609 veor q15,q13 @ sigma0(X[i+1])
1610 vshr.u64 d26,d18,#41 @ from NEON_00_15
1611 vadd.i64 q5,q15
1612 vld1.64 {d28},[r3,:64]! @ K[i++]
1613 vsli.64 d24,d18,#50
1614 vsli.64 d25,d18,#46
1615 vmov d29,d18
1616 vsli.64 d26,d18,#23
1617#if 26<16 && defined(__ARMEL__)
1618 vrev64.8 ,
1619#endif
1620 veor d25,d24
1621 vbsl d29,d19,d20 @ Ch(e,f,g)
1622 vshr.u64 d24,d22,#28
1623 veor d26,d25 @ Sigma1(e)
1624 vadd.i64 d27,d29,d21
1625 vshr.u64 d25,d22,#34
1626 vsli.64 d24,d22,#36
1627 vadd.i64 d27,d26
1628 vshr.u64 d26,d22,#39
1629 vadd.i64 d28,d10
1630 vsli.64 d25,d22,#30
1631 veor d30,d22,d23
1632 vsli.64 d26,d22,#25
1633 veor d21,d24,d25
1634 vadd.i64 d27,d28
1635 vbsl d30,d16,d23 @ Maj(a,b,c)
1636 veor d21,d26 @ Sigma0(a)
1637 vadd.i64 d17,d27
1638 vadd.i64 d30,d27
1639 @ vadd.i64 d21,d30
1640 vshr.u64 d24,d17,#14 @ 27
1641#if 27<16
1642 vld1.64 {d11},[r1]! @ handles unaligned
1643#endif
1644 vshr.u64 d25,d17,#18
1645#if 27>0
1646 vadd.i64 d21,d30 @ h+=Maj from the past
1647#endif
1648 vshr.u64 d26,d17,#41
1649 vld1.64 {d28},[r3,:64]! @ K[i++]
1650 vsli.64 d24,d17,#50
1651 vsli.64 d25,d17,#46
1652 vmov d29,d17
1653 vsli.64 d26,d17,#23
1654#if 27<16 && defined(__ARMEL__)
1655 vrev64.8 ,
1656#endif
1657 veor d25,d24
1658 vbsl d29,d18,d19 @ Ch(e,f,g)
1659 vshr.u64 d24,d21,#28
1660 veor d26,d25 @ Sigma1(e)
1661 vadd.i64 d27,d29,d20
1662 vshr.u64 d25,d21,#34
1663 vsli.64 d24,d21,#36
1664 vadd.i64 d27,d26
1665 vshr.u64 d26,d21,#39
1666 vadd.i64 d28,d11
1667 vsli.64 d25,d21,#30
1668 veor d30,d21,d22
1669 vsli.64 d26,d21,#25
1670 veor d20,d24,d25
1671 vadd.i64 d27,d28
1672 vbsl d30,d23,d22 @ Maj(a,b,c)
1673 veor d20,d26 @ Sigma0(a)
1674 vadd.i64 d16,d27
1675 vadd.i64 d30,d27
1676 @ vadd.i64 d20,d30
1677 vshr.u64 q12,q5,#19
1678 vshr.u64 q13,q5,#61
1679 vadd.i64 d20,d30 @ h+=Maj from the past
1680 vshr.u64 q15,q5,#6
1681 vsli.64 q12,q5,#45
1682 vext.8 q14,q6,q7,#8 @ X[i+1]
1683 vsli.64 q13,q5,#3
1684 veor q15,q12
1685 vshr.u64 q12,q14,#1
1686 veor q15,q13 @ sigma1(X[i+14])
1687 vshr.u64 q13,q14,#8
1688 vadd.i64 q6,q15
1689 vshr.u64 q15,q14,#7
1690 vsli.64 q12,q14,#63
1691 vsli.64 q13,q14,#56
1692 vext.8 q14,q2,q3,#8 @ X[i+9]
1693 veor q15,q12
1694 vshr.u64 d24,d16,#14 @ from NEON_00_15
1695 vadd.i64 q6,q14
1696 vshr.u64 d25,d16,#18 @ from NEON_00_15
1697 veor q15,q13 @ sigma0(X[i+1])
1698 vshr.u64 d26,d16,#41 @ from NEON_00_15
1699 vadd.i64 q6,q15
1700 vld1.64 {d28},[r3,:64]! @ K[i++]
1701 vsli.64 d24,d16,#50
1702 vsli.64 d25,d16,#46
1703 vmov d29,d16
1704 vsli.64 d26,d16,#23
1705#if 28<16 && defined(__ARMEL__)
1706 vrev64.8 ,
1707#endif
1708 veor d25,d24
1709 vbsl d29,d17,d18 @ Ch(e,f,g)
1710 vshr.u64 d24,d20,#28
1711 veor d26,d25 @ Sigma1(e)
1712 vadd.i64 d27,d29,d19
1713 vshr.u64 d25,d20,#34
1714 vsli.64 d24,d20,#36
1715 vadd.i64 d27,d26
1716 vshr.u64 d26,d20,#39
1717 vadd.i64 d28,d12
1718 vsli.64 d25,d20,#30
1719 veor d30,d20,d21
1720 vsli.64 d26,d20,#25
1721 veor d19,d24,d25
1722 vadd.i64 d27,d28
1723 vbsl d30,d22,d21 @ Maj(a,b,c)
1724 veor d19,d26 @ Sigma0(a)
1725 vadd.i64 d23,d27
1726 vadd.i64 d30,d27
1727 @ vadd.i64 d19,d30
1728 vshr.u64 d24,d23,#14 @ 29
1729#if 29<16
1730 vld1.64 {d13},[r1]! @ handles unaligned
1731#endif
1732 vshr.u64 d25,d23,#18
1733#if 29>0
1734 vadd.i64 d19,d30 @ h+=Maj from the past
1735#endif
1736 vshr.u64 d26,d23,#41
1737 vld1.64 {d28},[r3,:64]! @ K[i++]
1738 vsli.64 d24,d23,#50
1739 vsli.64 d25,d23,#46
1740 vmov d29,d23
1741 vsli.64 d26,d23,#23
1742#if 29<16 && defined(__ARMEL__)
1743 vrev64.8 ,
1744#endif
1745 veor d25,d24
1746 vbsl d29,d16,d17 @ Ch(e,f,g)
1747 vshr.u64 d24,d19,#28
1748 veor d26,d25 @ Sigma1(e)
1749 vadd.i64 d27,d29,d18
1750 vshr.u64 d25,d19,#34
1751 vsli.64 d24,d19,#36
1752 vadd.i64 d27,d26
1753 vshr.u64 d26,d19,#39
1754 vadd.i64 d28,d13
1755 vsli.64 d25,d19,#30
1756 veor d30,d19,d20
1757 vsli.64 d26,d19,#25
1758 veor d18,d24,d25
1759 vadd.i64 d27,d28
1760 vbsl d30,d21,d20 @ Maj(a,b,c)
1761 veor d18,d26 @ Sigma0(a)
1762 vadd.i64 d22,d27
1763 vadd.i64 d30,d27
1764 @ vadd.i64 d18,d30
1765 vshr.u64 q12,q6,#19
1766 vshr.u64 q13,q6,#61
1767 vadd.i64 d18,d30 @ h+=Maj from the past
1768 vshr.u64 q15,q6,#6
1769 vsli.64 q12,q6,#45
1770 vext.8 q14,q7,q0,#8 @ X[i+1]
1771 vsli.64 q13,q6,#3
1772 veor q15,q12
1773 vshr.u64 q12,q14,#1
1774 veor q15,q13 @ sigma1(X[i+14])
1775 vshr.u64 q13,q14,#8
1776 vadd.i64 q7,q15
1777 vshr.u64 q15,q14,#7
1778 vsli.64 q12,q14,#63
1779 vsli.64 q13,q14,#56
1780 vext.8 q14,q3,q4,#8 @ X[i+9]
1781 veor q15,q12
1782 vshr.u64 d24,d22,#14 @ from NEON_00_15
1783 vadd.i64 q7,q14
1784 vshr.u64 d25,d22,#18 @ from NEON_00_15
1785 veor q15,q13 @ sigma0(X[i+1])
1786 vshr.u64 d26,d22,#41 @ from NEON_00_15
1787 vadd.i64 q7,q15
1788 vld1.64 {d28},[r3,:64]! @ K[i++]
1789 vsli.64 d24,d22,#50
1790 vsli.64 d25,d22,#46
1791 vmov d29,d22
1792 vsli.64 d26,d22,#23
1793#if 30<16 && defined(__ARMEL__)
1794 vrev64.8 ,
1795#endif
1796 veor d25,d24
1797 vbsl d29,d23,d16 @ Ch(e,f,g)
1798 vshr.u64 d24,d18,#28
1799 veor d26,d25 @ Sigma1(e)
1800 vadd.i64 d27,d29,d17
1801 vshr.u64 d25,d18,#34
1802 vsli.64 d24,d18,#36
1803 vadd.i64 d27,d26
1804 vshr.u64 d26,d18,#39
1805 vadd.i64 d28,d14
1806 vsli.64 d25,d18,#30
1807 veor d30,d18,d19
1808 vsli.64 d26,d18,#25
1809 veor d17,d24,d25
1810 vadd.i64 d27,d28
1811 vbsl d30,d20,d19 @ Maj(a,b,c)
1812 veor d17,d26 @ Sigma0(a)
1813 vadd.i64 d21,d27
1814 vadd.i64 d30,d27
1815 @ vadd.i64 d17,d30
1816 vshr.u64 d24,d21,#14 @ 31
1817#if 31<16
1818 vld1.64 {d15},[r1]! @ handles unaligned
1819#endif
1820 vshr.u64 d25,d21,#18
1821#if 31>0
1822 vadd.i64 d17,d30 @ h+=Maj from the past
1823#endif
1824 vshr.u64 d26,d21,#41
1825 vld1.64 {d28},[r3,:64]! @ K[i++]
1826 vsli.64 d24,d21,#50
1827 vsli.64 d25,d21,#46
1828 vmov d29,d21
1829 vsli.64 d26,d21,#23
1830#if 31<16 && defined(__ARMEL__)
1831 vrev64.8 ,
1832#endif
1833 veor d25,d24
1834 vbsl d29,d22,d23 @ Ch(e,f,g)
1835 vshr.u64 d24,d17,#28
1836 veor d26,d25 @ Sigma1(e)
1837 vadd.i64 d27,d29,d16
1838 vshr.u64 d25,d17,#34
1839 vsli.64 d24,d17,#36
1840 vadd.i64 d27,d26
1841 vshr.u64 d26,d17,#39
1842 vadd.i64 d28,d15
1843 vsli.64 d25,d17,#30
1844 veor d30,d17,d18
1845 vsli.64 d26,d17,#25
1846 veor d16,d24,d25
1847 vadd.i64 d27,d28
1848 vbsl d30,d19,d18 @ Maj(a,b,c)
1849 veor d16,d26 @ Sigma0(a)
1850 vadd.i64 d20,d27
1851 vadd.i64 d30,d27
1852 @ vadd.i64 d16,d30
1853 bne L16_79_neon
1854
1855 vadd.i64 d16,d30 @ h+=Maj from the past
1856 vldmia r0,{d24,d25,d26,d27,d28,d29,d30,d31} @ load context to temp
1857 vadd.i64 q8,q12 @ vectorized accumulate
1858 vadd.i64 q9,q13
1859 vadd.i64 q10,q14
1860 vadd.i64 q11,q15
1861 vstmia r0,{d16,d17,d18,d19,d20,d21,d22,d23} @ save context
1862 teq r1,r2
1863 sub r3,#640 @ rewind K512
1864 bne Loop_neon
1865
1866 VFP_ABI_POP
1867 bx lr @ .word 0xe12fff1e
1868
1869#endif
1870.byte 83,72,65,53,49,50,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,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
1871.align 2
1872.align 2
1873#if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__)
1874.comm _OPENSSL_armcap_P,4
1875.non_lazy_symbol_pointer
1876OPENSSL_armcap_P:
1877.indirect_symbol _OPENSSL_armcap_P
1878.long 0
1879.private_extern _OPENSSL_armcap_P
1880#endif