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