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