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