1 @ Copyright 2007-2020 The OpenSSL Project Authors. All Rights Reserved.
2 @
3 @ Licensed under the Apache License 2.0 (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 "arm_arch.h"
57 # define VFP_ABI_PUSH	vstmdb	sp!,{d8-d15}
58 # define VFP_ABI_POP	vldmia	sp!,{d8-d15}
59 #else
60 # define __ARM_ARCH__ __LINUX_ARM_ARCH__
61 # define __ARM_MAX_ARCH__ 7
62 # define VFP_ABI_PUSH
63 # define VFP_ABI_POP
64 #endif
65 
66 #ifdef __ARMEL__
67 # define LO 0
68 # define HI 4
69 # define WORD64(hi0,lo0,hi1,lo1)	.word	lo0,hi0, lo1,hi1
70 #else
71 # define HI 0
72 # define LO 4
73 # define WORD64(hi0,lo0,hi1,lo1)	.word	hi0,lo0, hi1,lo1
74 #endif
75 
76 #if defined(__thumb2__)
77 .syntax	unified
78 .thumb
79 # define adrl adr
80 #else
81 .code	32
82 #endif
83 
84 .text
85 
86 .type	K512,%object
87 .align	5
88 K512:
89 	WORD64(0x428a2f98,0xd728ae22,	0x71374491,0x23ef65cd)
90 	WORD64(0xb5c0fbcf,0xec4d3b2f,	0xe9b5dba5,0x8189dbbc)
91 	WORD64(0x3956c25b,0xf348b538,	0x59f111f1,0xb605d019)
92 	WORD64(0x923f82a4,0xaf194f9b,	0xab1c5ed5,0xda6d8118)
93 	WORD64(0xd807aa98,0xa3030242,	0x12835b01,0x45706fbe)
94 	WORD64(0x243185be,0x4ee4b28c,	0x550c7dc3,0xd5ffb4e2)
95 	WORD64(0x72be5d74,0xf27b896f,	0x80deb1fe,0x3b1696b1)
96 	WORD64(0x9bdc06a7,0x25c71235,	0xc19bf174,0xcf692694)
97 	WORD64(0xe49b69c1,0x9ef14ad2,	0xefbe4786,0x384f25e3)
98 	WORD64(0x0fc19dc6,0x8b8cd5b5,	0x240ca1cc,0x77ac9c65)
99 	WORD64(0x2de92c6f,0x592b0275,	0x4a7484aa,0x6ea6e483)
100 	WORD64(0x5cb0a9dc,0xbd41fbd4,	0x76f988da,0x831153b5)
101 	WORD64(0x983e5152,0xee66dfab,	0xa831c66d,0x2db43210)
102 	WORD64(0xb00327c8,0x98fb213f,	0xbf597fc7,0xbeef0ee4)
103 	WORD64(0xc6e00bf3,0x3da88fc2,	0xd5a79147,0x930aa725)
104 	WORD64(0x06ca6351,0xe003826f,	0x14292967,0x0a0e6e70)
105 	WORD64(0x27b70a85,0x46d22ffc,	0x2e1b2138,0x5c26c926)
106 	WORD64(0x4d2c6dfc,0x5ac42aed,	0x53380d13,0x9d95b3df)
107 	WORD64(0x650a7354,0x8baf63de,	0x766a0abb,0x3c77b2a8)
108 	WORD64(0x81c2c92e,0x47edaee6,	0x92722c85,0x1482353b)
109 	WORD64(0xa2bfe8a1,0x4cf10364,	0xa81a664b,0xbc423001)
110 	WORD64(0xc24b8b70,0xd0f89791,	0xc76c51a3,0x0654be30)
111 	WORD64(0xd192e819,0xd6ef5218,	0xd6990624,0x5565a910)
112 	WORD64(0xf40e3585,0x5771202a,	0x106aa070,0x32bbd1b8)
113 	WORD64(0x19a4c116,0xb8d2d0c8,	0x1e376c08,0x5141ab53)
114 	WORD64(0x2748774c,0xdf8eeb99,	0x34b0bcb5,0xe19b48a8)
115 	WORD64(0x391c0cb3,0xc5c95a63,	0x4ed8aa4a,0xe3418acb)
116 	WORD64(0x5b9cca4f,0x7763e373,	0x682e6ff3,0xd6b2b8a3)
117 	WORD64(0x748f82ee,0x5defb2fc,	0x78a5636f,0x43172f60)
118 	WORD64(0x84c87814,0xa1f0ab72,	0x8cc70208,0x1a6439ec)
119 	WORD64(0x90befffa,0x23631e28,	0xa4506ceb,0xde82bde9)
120 	WORD64(0xbef9a3f7,0xb2c67915,	0xc67178f2,0xe372532b)
121 	WORD64(0xca273ece,0xea26619c,	0xd186b8c7,0x21c0c207)
122 	WORD64(0xeada7dd6,0xcde0eb1e,	0xf57d4f7f,0xee6ed178)
123 	WORD64(0x06f067aa,0x72176fba,	0x0a637dc5,0xa2c898a6)
124 	WORD64(0x113f9804,0xbef90dae,	0x1b710b35,0x131c471b)
125 	WORD64(0x28db77f5,0x23047d84,	0x32caab7b,0x40c72493)
126 	WORD64(0x3c9ebe0a,0x15c9bebc,	0x431d67c4,0x9c100d4c)
127 	WORD64(0x4cc5d4be,0xcb3e42b6,	0x597f299c,0xfc657e2a)
128 	WORD64(0x5fcb6fab,0x3ad6faec,	0x6c44198c,0x4a475817)
129 .size	K512,.-K512
130 #if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__)
131 .LOPENSSL_armcap:
132 # ifdef	_WIN32
133 .word	OPENSSL_armcap_P
134 # else
135 .word	OPENSSL_armcap_P-.Lsha512_block_data_order
136 # endif
137 .skip	32-4
138 #else
139 .skip	32
140 #endif
141 
142 .globl	sha512_block_data_order
143 .type	sha512_block_data_order,%function
144 sha512_block_data_order:
145 .Lsha512_block_data_order:
146 #if __ARM_ARCH__<7 && !defined(__thumb2__)
147 	sub	r3,pc,#8		@ sha512_block_data_order
148 #else
149 	adr	r3,.Lsha512_block_data_order
150 #endif
151 #if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__)
152 	ldr	r12,.LOPENSSL_armcap
153 # if !defined(_WIN32)
154 	ldr	r12,[r3,r12]		@ OPENSSL_armcap_P
155 # endif
156 # if defined(__APPLE__) || defined(_WIN32)
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]
173 .Loop:
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 
197 .L00_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 #ifdef	__thumb2__
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
317 .L16_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 #ifdef	__thumb2__
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 #ifdef	__thumb2__
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 .size	sha512_block_data_order,.-sha512_block_data_order
540 #if __ARM_MAX_ARCH__>=7
541 .arch	armv7-a
542 .fpu	neon
543 
544 .globl	sha512_block_data_order_neon
545 .type	sha512_block_data_order_neon,%function
546 .align	4
547 sha512_block_data_order_neon:
548 .LNEON:
549 	dmb	@ errata #451034 on early Cortex A8
550 	add	r2,r1,r2,lsl#7	@ len to point at the end of inp
551 	adr	r3,K512
552 	VFP_ABI_PUSH
553 	vldmia	r0,{d16,d17,d18,d19,d20,d21,d22,d23}		@ load context
554 .Loop_neon:
555 	vshr.u64	d24,d20,#14	@ 0
556 #if 0<16
557 	vld1.64	{d0},[r1]!	@ handles unaligned
558 #endif
559 	vshr.u64	d25,d20,#18
560 #if 0>0
561 	vadd.i64	d16,d30			@ h+=Maj from the past
562 #endif
563 	vshr.u64	d26,d20,#41
564 	vld1.64	{d28},[r3,:64]!	@ K[i++]
565 	vsli.64	d24,d20,#50
566 	vsli.64	d25,d20,#46
567 	vmov	d29,d20
568 	vsli.64	d26,d20,#23
569 #if 0<16 && defined(__ARMEL__)
570 	vrev64.8	d0,d0
571 #endif
572 	veor	d25,d24
573 	vbsl	d29,d21,d22		@ Ch(e,f,g)
574 	vshr.u64	d24,d16,#28
575 	veor	d26,d25			@ Sigma1(e)
576 	vadd.i64	d27,d29,d23
577 	vshr.u64	d25,d16,#34
578 	vsli.64	d24,d16,#36
579 	vadd.i64	d27,d26
580 	vshr.u64	d26,d16,#39
581 	vadd.i64	d28,d0
582 	vsli.64	d25,d16,#30
583 	veor	d30,d16,d17
584 	vsli.64	d26,d16,#25
585 	veor	d23,d24,d25
586 	vadd.i64	d27,d28
587 	vbsl	d30,d18,d17		@ Maj(a,b,c)
588 	veor	d23,d26			@ Sigma0(a)
589 	vadd.i64	d19,d27
590 	vadd.i64	d30,d27
591 	@ vadd.i64	d23,d30
592 	vshr.u64	d24,d19,#14	@ 1
593 #if 1<16
594 	vld1.64	{d1},[r1]!	@ handles unaligned
595 #endif
596 	vshr.u64	d25,d19,#18
597 #if 1>0
598 	vadd.i64	d23,d30			@ h+=Maj from the past
599 #endif
600 	vshr.u64	d26,d19,#41
601 	vld1.64	{d28},[r3,:64]!	@ K[i++]
602 	vsli.64	d24,d19,#50
603 	vsli.64	d25,d19,#46
604 	vmov	d29,d19
605 	vsli.64	d26,d19,#23
606 #if 1<16 && defined(__ARMEL__)
607 	vrev64.8	d1,d1
608 #endif
609 	veor	d25,d24
610 	vbsl	d29,d20,d21		@ Ch(e,f,g)
611 	vshr.u64	d24,d23,#28
612 	veor	d26,d25			@ Sigma1(e)
613 	vadd.i64	d27,d29,d22
614 	vshr.u64	d25,d23,#34
615 	vsli.64	d24,d23,#36
616 	vadd.i64	d27,d26
617 	vshr.u64	d26,d23,#39
618 	vadd.i64	d28,d1
619 	vsli.64	d25,d23,#30
620 	veor	d30,d23,d16
621 	vsli.64	d26,d23,#25
622 	veor	d22,d24,d25
623 	vadd.i64	d27,d28
624 	vbsl	d30,d17,d16		@ Maj(a,b,c)
625 	veor	d22,d26			@ Sigma0(a)
626 	vadd.i64	d18,d27
627 	vadd.i64	d30,d27
628 	@ vadd.i64	d22,d30
629 	vshr.u64	d24,d18,#14	@ 2
630 #if 2<16
631 	vld1.64	{d2},[r1]!	@ handles unaligned
632 #endif
633 	vshr.u64	d25,d18,#18
634 #if 2>0
635 	vadd.i64	d22,d30			@ h+=Maj from the past
636 #endif
637 	vshr.u64	d26,d18,#41
638 	vld1.64	{d28},[r3,:64]!	@ K[i++]
639 	vsli.64	d24,d18,#50
640 	vsli.64	d25,d18,#46
641 	vmov	d29,d18
642 	vsli.64	d26,d18,#23
643 #if 2<16 && defined(__ARMEL__)
644 	vrev64.8	d2,d2
645 #endif
646 	veor	d25,d24
647 	vbsl	d29,d19,d20		@ Ch(e,f,g)
648 	vshr.u64	d24,d22,#28
649 	veor	d26,d25			@ Sigma1(e)
650 	vadd.i64	d27,d29,d21
651 	vshr.u64	d25,d22,#34
652 	vsli.64	d24,d22,#36
653 	vadd.i64	d27,d26
654 	vshr.u64	d26,d22,#39
655 	vadd.i64	d28,d2
656 	vsli.64	d25,d22,#30
657 	veor	d30,d22,d23
658 	vsli.64	d26,d22,#25
659 	veor	d21,d24,d25
660 	vadd.i64	d27,d28
661 	vbsl	d30,d16,d23		@ Maj(a,b,c)
662 	veor	d21,d26			@ Sigma0(a)
663 	vadd.i64	d17,d27
664 	vadd.i64	d30,d27
665 	@ vadd.i64	d21,d30
666 	vshr.u64	d24,d17,#14	@ 3
667 #if 3<16
668 	vld1.64	{d3},[r1]!	@ handles unaligned
669 #endif
670 	vshr.u64	d25,d17,#18
671 #if 3>0
672 	vadd.i64	d21,d30			@ h+=Maj from the past
673 #endif
674 	vshr.u64	d26,d17,#41
675 	vld1.64	{d28},[r3,:64]!	@ K[i++]
676 	vsli.64	d24,d17,#50
677 	vsli.64	d25,d17,#46
678 	vmov	d29,d17
679 	vsli.64	d26,d17,#23
680 #if 3<16 && defined(__ARMEL__)
681 	vrev64.8	d3,d3
682 #endif
683 	veor	d25,d24
684 	vbsl	d29,d18,d19		@ Ch(e,f,g)
685 	vshr.u64	d24,d21,#28
686 	veor	d26,d25			@ Sigma1(e)
687 	vadd.i64	d27,d29,d20
688 	vshr.u64	d25,d21,#34
689 	vsli.64	d24,d21,#36
690 	vadd.i64	d27,d26
691 	vshr.u64	d26,d21,#39
692 	vadd.i64	d28,d3
693 	vsli.64	d25,d21,#30
694 	veor	d30,d21,d22
695 	vsli.64	d26,d21,#25
696 	veor	d20,d24,d25
697 	vadd.i64	d27,d28
698 	vbsl	d30,d23,d22		@ Maj(a,b,c)
699 	veor	d20,d26			@ Sigma0(a)
700 	vadd.i64	d16,d27
701 	vadd.i64	d30,d27
702 	@ vadd.i64	d20,d30
703 	vshr.u64	d24,d16,#14	@ 4
704 #if 4<16
705 	vld1.64	{d4},[r1]!	@ handles unaligned
706 #endif
707 	vshr.u64	d25,d16,#18
708 #if 4>0
709 	vadd.i64	d20,d30			@ h+=Maj from the past
710 #endif
711 	vshr.u64	d26,d16,#41
712 	vld1.64	{d28},[r3,:64]!	@ K[i++]
713 	vsli.64	d24,d16,#50
714 	vsli.64	d25,d16,#46
715 	vmov	d29,d16
716 	vsli.64	d26,d16,#23
717 #if 4<16 && defined(__ARMEL__)
718 	vrev64.8	d4,d4
719 #endif
720 	veor	d25,d24
721 	vbsl	d29,d17,d18		@ Ch(e,f,g)
722 	vshr.u64	d24,d20,#28
723 	veor	d26,d25			@ Sigma1(e)
724 	vadd.i64	d27,d29,d19
725 	vshr.u64	d25,d20,#34
726 	vsli.64	d24,d20,#36
727 	vadd.i64	d27,d26
728 	vshr.u64	d26,d20,#39
729 	vadd.i64	d28,d4
730 	vsli.64	d25,d20,#30
731 	veor	d30,d20,d21
732 	vsli.64	d26,d20,#25
733 	veor	d19,d24,d25
734 	vadd.i64	d27,d28
735 	vbsl	d30,d22,d21		@ Maj(a,b,c)
736 	veor	d19,d26			@ Sigma0(a)
737 	vadd.i64	d23,d27
738 	vadd.i64	d30,d27
739 	@ vadd.i64	d19,d30
740 	vshr.u64	d24,d23,#14	@ 5
741 #if 5<16
742 	vld1.64	{d5},[r1]!	@ handles unaligned
743 #endif
744 	vshr.u64	d25,d23,#18
745 #if 5>0
746 	vadd.i64	d19,d30			@ h+=Maj from the past
747 #endif
748 	vshr.u64	d26,d23,#41
749 	vld1.64	{d28},[r3,:64]!	@ K[i++]
750 	vsli.64	d24,d23,#50
751 	vsli.64	d25,d23,#46
752 	vmov	d29,d23
753 	vsli.64	d26,d23,#23
754 #if 5<16 && defined(__ARMEL__)
755 	vrev64.8	d5,d5
756 #endif
757 	veor	d25,d24
758 	vbsl	d29,d16,d17		@ Ch(e,f,g)
759 	vshr.u64	d24,d19,#28
760 	veor	d26,d25			@ Sigma1(e)
761 	vadd.i64	d27,d29,d18
762 	vshr.u64	d25,d19,#34
763 	vsli.64	d24,d19,#36
764 	vadd.i64	d27,d26
765 	vshr.u64	d26,d19,#39
766 	vadd.i64	d28,d5
767 	vsli.64	d25,d19,#30
768 	veor	d30,d19,d20
769 	vsli.64	d26,d19,#25
770 	veor	d18,d24,d25
771 	vadd.i64	d27,d28
772 	vbsl	d30,d21,d20		@ Maj(a,b,c)
773 	veor	d18,d26			@ Sigma0(a)
774 	vadd.i64	d22,d27
775 	vadd.i64	d30,d27
776 	@ vadd.i64	d18,d30
777 	vshr.u64	d24,d22,#14	@ 6
778 #if 6<16
779 	vld1.64	{d6},[r1]!	@ handles unaligned
780 #endif
781 	vshr.u64	d25,d22,#18
782 #if 6>0
783 	vadd.i64	d18,d30			@ h+=Maj from the past
784 #endif
785 	vshr.u64	d26,d22,#41
786 	vld1.64	{d28},[r3,:64]!	@ K[i++]
787 	vsli.64	d24,d22,#50
788 	vsli.64	d25,d22,#46
789 	vmov	d29,d22
790 	vsli.64	d26,d22,#23
791 #if 6<16 && defined(__ARMEL__)
792 	vrev64.8	d6,d6
793 #endif
794 	veor	d25,d24
795 	vbsl	d29,d23,d16		@ Ch(e,f,g)
796 	vshr.u64	d24,d18,#28
797 	veor	d26,d25			@ Sigma1(e)
798 	vadd.i64	d27,d29,d17
799 	vshr.u64	d25,d18,#34
800 	vsli.64	d24,d18,#36
801 	vadd.i64	d27,d26
802 	vshr.u64	d26,d18,#39
803 	vadd.i64	d28,d6
804 	vsli.64	d25,d18,#30
805 	veor	d30,d18,d19
806 	vsli.64	d26,d18,#25
807 	veor	d17,d24,d25
808 	vadd.i64	d27,d28
809 	vbsl	d30,d20,d19		@ Maj(a,b,c)
810 	veor	d17,d26			@ Sigma0(a)
811 	vadd.i64	d21,d27
812 	vadd.i64	d30,d27
813 	@ vadd.i64	d17,d30
814 	vshr.u64	d24,d21,#14	@ 7
815 #if 7<16
816 	vld1.64	{d7},[r1]!	@ handles unaligned
817 #endif
818 	vshr.u64	d25,d21,#18
819 #if 7>0
820 	vadd.i64	d17,d30			@ h+=Maj from the past
821 #endif
822 	vshr.u64	d26,d21,#41
823 	vld1.64	{d28},[r3,:64]!	@ K[i++]
824 	vsli.64	d24,d21,#50
825 	vsli.64	d25,d21,#46
826 	vmov	d29,d21
827 	vsli.64	d26,d21,#23
828 #if 7<16 && defined(__ARMEL__)
829 	vrev64.8	d7,d7
830 #endif
831 	veor	d25,d24
832 	vbsl	d29,d22,d23		@ Ch(e,f,g)
833 	vshr.u64	d24,d17,#28
834 	veor	d26,d25			@ Sigma1(e)
835 	vadd.i64	d27,d29,d16
836 	vshr.u64	d25,d17,#34
837 	vsli.64	d24,d17,#36
838 	vadd.i64	d27,d26
839 	vshr.u64	d26,d17,#39
840 	vadd.i64	d28,d7
841 	vsli.64	d25,d17,#30
842 	veor	d30,d17,d18
843 	vsli.64	d26,d17,#25
844 	veor	d16,d24,d25
845 	vadd.i64	d27,d28
846 	vbsl	d30,d19,d18		@ Maj(a,b,c)
847 	veor	d16,d26			@ Sigma0(a)
848 	vadd.i64	d20,d27
849 	vadd.i64	d30,d27
850 	@ vadd.i64	d16,d30
851 	vshr.u64	d24,d20,#14	@ 8
852 #if 8<16
853 	vld1.64	{d8},[r1]!	@ handles unaligned
854 #endif
855 	vshr.u64	d25,d20,#18
856 #if 8>0
857 	vadd.i64	d16,d30			@ h+=Maj from the past
858 #endif
859 	vshr.u64	d26,d20,#41
860 	vld1.64	{d28},[r3,:64]!	@ K[i++]
861 	vsli.64	d24,d20,#50
862 	vsli.64	d25,d20,#46
863 	vmov	d29,d20
864 	vsli.64	d26,d20,#23
865 #if 8<16 && defined(__ARMEL__)
866 	vrev64.8	d8,d8
867 #endif
868 	veor	d25,d24
869 	vbsl	d29,d21,d22		@ Ch(e,f,g)
870 	vshr.u64	d24,d16,#28
871 	veor	d26,d25			@ Sigma1(e)
872 	vadd.i64	d27,d29,d23
873 	vshr.u64	d25,d16,#34
874 	vsli.64	d24,d16,#36
875 	vadd.i64	d27,d26
876 	vshr.u64	d26,d16,#39
877 	vadd.i64	d28,d8
878 	vsli.64	d25,d16,#30
879 	veor	d30,d16,d17
880 	vsli.64	d26,d16,#25
881 	veor	d23,d24,d25
882 	vadd.i64	d27,d28
883 	vbsl	d30,d18,d17		@ Maj(a,b,c)
884 	veor	d23,d26			@ Sigma0(a)
885 	vadd.i64	d19,d27
886 	vadd.i64	d30,d27
887 	@ vadd.i64	d23,d30
888 	vshr.u64	d24,d19,#14	@ 9
889 #if 9<16
890 	vld1.64	{d9},[r1]!	@ handles unaligned
891 #endif
892 	vshr.u64	d25,d19,#18
893 #if 9>0
894 	vadd.i64	d23,d30			@ h+=Maj from the past
895 #endif
896 	vshr.u64	d26,d19,#41
897 	vld1.64	{d28},[r3,:64]!	@ K[i++]
898 	vsli.64	d24,d19,#50
899 	vsli.64	d25,d19,#46
900 	vmov	d29,d19
901 	vsli.64	d26,d19,#23
902 #if 9<16 && defined(__ARMEL__)
903 	vrev64.8	d9,d9
904 #endif
905 	veor	d25,d24
906 	vbsl	d29,d20,d21		@ Ch(e,f,g)
907 	vshr.u64	d24,d23,#28
908 	veor	d26,d25			@ Sigma1(e)
909 	vadd.i64	d27,d29,d22
910 	vshr.u64	d25,d23,#34
911 	vsli.64	d24,d23,#36
912 	vadd.i64	d27,d26
913 	vshr.u64	d26,d23,#39
914 	vadd.i64	d28,d9
915 	vsli.64	d25,d23,#30
916 	veor	d30,d23,d16
917 	vsli.64	d26,d23,#25
918 	veor	d22,d24,d25
919 	vadd.i64	d27,d28
920 	vbsl	d30,d17,d16		@ Maj(a,b,c)
921 	veor	d22,d26			@ Sigma0(a)
922 	vadd.i64	d18,d27
923 	vadd.i64	d30,d27
924 	@ vadd.i64	d22,d30
925 	vshr.u64	d24,d18,#14	@ 10
926 #if 10<16
927 	vld1.64	{d10},[r1]!	@ handles unaligned
928 #endif
929 	vshr.u64	d25,d18,#18
930 #if 10>0
931 	vadd.i64	d22,d30			@ h+=Maj from the past
932 #endif
933 	vshr.u64	d26,d18,#41
934 	vld1.64	{d28},[r3,:64]!	@ K[i++]
935 	vsli.64	d24,d18,#50
936 	vsli.64	d25,d18,#46
937 	vmov	d29,d18
938 	vsli.64	d26,d18,#23
939 #if 10<16 && defined(__ARMEL__)
940 	vrev64.8	d10,d10
941 #endif
942 	veor	d25,d24
943 	vbsl	d29,d19,d20		@ Ch(e,f,g)
944 	vshr.u64	d24,d22,#28
945 	veor	d26,d25			@ Sigma1(e)
946 	vadd.i64	d27,d29,d21
947 	vshr.u64	d25,d22,#34
948 	vsli.64	d24,d22,#36
949 	vadd.i64	d27,d26
950 	vshr.u64	d26,d22,#39
951 	vadd.i64	d28,d10
952 	vsli.64	d25,d22,#30
953 	veor	d30,d22,d23
954 	vsli.64	d26,d22,#25
955 	veor	d21,d24,d25
956 	vadd.i64	d27,d28
957 	vbsl	d30,d16,d23		@ Maj(a,b,c)
958 	veor	d21,d26			@ Sigma0(a)
959 	vadd.i64	d17,d27
960 	vadd.i64	d30,d27
961 	@ vadd.i64	d21,d30
962 	vshr.u64	d24,d17,#14	@ 11
963 #if 11<16
964 	vld1.64	{d11},[r1]!	@ handles unaligned
965 #endif
966 	vshr.u64	d25,d17,#18
967 #if 11>0
968 	vadd.i64	d21,d30			@ h+=Maj from the past
969 #endif
970 	vshr.u64	d26,d17,#41
971 	vld1.64	{d28},[r3,:64]!	@ K[i++]
972 	vsli.64	d24,d17,#50
973 	vsli.64	d25,d17,#46
974 	vmov	d29,d17
975 	vsli.64	d26,d17,#23
976 #if 11<16 && defined(__ARMEL__)
977 	vrev64.8	d11,d11
978 #endif
979 	veor	d25,d24
980 	vbsl	d29,d18,d19		@ Ch(e,f,g)
981 	vshr.u64	d24,d21,#28
982 	veor	d26,d25			@ Sigma1(e)
983 	vadd.i64	d27,d29,d20
984 	vshr.u64	d25,d21,#34
985 	vsli.64	d24,d21,#36
986 	vadd.i64	d27,d26
987 	vshr.u64	d26,d21,#39
988 	vadd.i64	d28,d11
989 	vsli.64	d25,d21,#30
990 	veor	d30,d21,d22
991 	vsli.64	d26,d21,#25
992 	veor	d20,d24,d25
993 	vadd.i64	d27,d28
994 	vbsl	d30,d23,d22		@ Maj(a,b,c)
995 	veor	d20,d26			@ Sigma0(a)
996 	vadd.i64	d16,d27
997 	vadd.i64	d30,d27
998 	@ vadd.i64	d20,d30
999 	vshr.u64	d24,d16,#14	@ 12
1000 #if 12<16
1001 	vld1.64	{d12},[r1]!	@ handles unaligned
1002 #endif
1003 	vshr.u64	d25,d16,#18
1004 #if 12>0
1005 	vadd.i64	d20,d30			@ h+=Maj from the past
1006 #endif
1007 	vshr.u64	d26,d16,#41
1008 	vld1.64	{d28},[r3,:64]!	@ K[i++]
1009 	vsli.64	d24,d16,#50
1010 	vsli.64	d25,d16,#46
1011 	vmov	d29,d16
1012 	vsli.64	d26,d16,#23
1013 #if 12<16 && defined(__ARMEL__)
1014 	vrev64.8	d12,d12
1015 #endif
1016 	veor	d25,d24
1017 	vbsl	d29,d17,d18		@ Ch(e,f,g)
1018 	vshr.u64	d24,d20,#28
1019 	veor	d26,d25			@ Sigma1(e)
1020 	vadd.i64	d27,d29,d19
1021 	vshr.u64	d25,d20,#34
1022 	vsli.64	d24,d20,#36
1023 	vadd.i64	d27,d26
1024 	vshr.u64	d26,d20,#39
1025 	vadd.i64	d28,d12
1026 	vsli.64	d25,d20,#30
1027 	veor	d30,d20,d21
1028 	vsli.64	d26,d20,#25
1029 	veor	d19,d24,d25
1030 	vadd.i64	d27,d28
1031 	vbsl	d30,d22,d21		@ Maj(a,b,c)
1032 	veor	d19,d26			@ Sigma0(a)
1033 	vadd.i64	d23,d27
1034 	vadd.i64	d30,d27
1035 	@ vadd.i64	d19,d30
1036 	vshr.u64	d24,d23,#14	@ 13
1037 #if 13<16
1038 	vld1.64	{d13},[r1]!	@ handles unaligned
1039 #endif
1040 	vshr.u64	d25,d23,#18
1041 #if 13>0
1042 	vadd.i64	d19,d30			@ h+=Maj from the past
1043 #endif
1044 	vshr.u64	d26,d23,#41
1045 	vld1.64	{d28},[r3,:64]!	@ K[i++]
1046 	vsli.64	d24,d23,#50
1047 	vsli.64	d25,d23,#46
1048 	vmov	d29,d23
1049 	vsli.64	d26,d23,#23
1050 #if 13<16 && defined(__ARMEL__)
1051 	vrev64.8	d13,d13
1052 #endif
1053 	veor	d25,d24
1054 	vbsl	d29,d16,d17		@ Ch(e,f,g)
1055 	vshr.u64	d24,d19,#28
1056 	veor	d26,d25			@ Sigma1(e)
1057 	vadd.i64	d27,d29,d18
1058 	vshr.u64	d25,d19,#34
1059 	vsli.64	d24,d19,#36
1060 	vadd.i64	d27,d26
1061 	vshr.u64	d26,d19,#39
1062 	vadd.i64	d28,d13
1063 	vsli.64	d25,d19,#30
1064 	veor	d30,d19,d20
1065 	vsli.64	d26,d19,#25
1066 	veor	d18,d24,d25
1067 	vadd.i64	d27,d28
1068 	vbsl	d30,d21,d20		@ Maj(a,b,c)
1069 	veor	d18,d26			@ Sigma0(a)
1070 	vadd.i64	d22,d27
1071 	vadd.i64	d30,d27
1072 	@ vadd.i64	d18,d30
1073 	vshr.u64	d24,d22,#14	@ 14
1074 #if 14<16
1075 	vld1.64	{d14},[r1]!	@ handles unaligned
1076 #endif
1077 	vshr.u64	d25,d22,#18
1078 #if 14>0
1079 	vadd.i64	d18,d30			@ h+=Maj from the past
1080 #endif
1081 	vshr.u64	d26,d22,#41
1082 	vld1.64	{d28},[r3,:64]!	@ K[i++]
1083 	vsli.64	d24,d22,#50
1084 	vsli.64	d25,d22,#46
1085 	vmov	d29,d22
1086 	vsli.64	d26,d22,#23
1087 #if 14<16 && defined(__ARMEL__)
1088 	vrev64.8	d14,d14
1089 #endif
1090 	veor	d25,d24
1091 	vbsl	d29,d23,d16		@ Ch(e,f,g)
1092 	vshr.u64	d24,d18,#28
1093 	veor	d26,d25			@ Sigma1(e)
1094 	vadd.i64	d27,d29,d17
1095 	vshr.u64	d25,d18,#34
1096 	vsli.64	d24,d18,#36
1097 	vadd.i64	d27,d26
1098 	vshr.u64	d26,d18,#39
1099 	vadd.i64	d28,d14
1100 	vsli.64	d25,d18,#30
1101 	veor	d30,d18,d19
1102 	vsli.64	d26,d18,#25
1103 	veor	d17,d24,d25
1104 	vadd.i64	d27,d28
1105 	vbsl	d30,d20,d19		@ Maj(a,b,c)
1106 	veor	d17,d26			@ Sigma0(a)
1107 	vadd.i64	d21,d27
1108 	vadd.i64	d30,d27
1109 	@ vadd.i64	d17,d30
1110 	vshr.u64	d24,d21,#14	@ 15
1111 #if 15<16
1112 	vld1.64	{d15},[r1]!	@ handles unaligned
1113 #endif
1114 	vshr.u64	d25,d21,#18
1115 #if 15>0
1116 	vadd.i64	d17,d30			@ h+=Maj from the past
1117 #endif
1118 	vshr.u64	d26,d21,#41
1119 	vld1.64	{d28},[r3,:64]!	@ K[i++]
1120 	vsli.64	d24,d21,#50
1121 	vsli.64	d25,d21,#46
1122 	vmov	d29,d21
1123 	vsli.64	d26,d21,#23
1124 #if 15<16 && defined(__ARMEL__)
1125 	vrev64.8	d15,d15
1126 #endif
1127 	veor	d25,d24
1128 	vbsl	d29,d22,d23		@ Ch(e,f,g)
1129 	vshr.u64	d24,d17,#28
1130 	veor	d26,d25			@ Sigma1(e)
1131 	vadd.i64	d27,d29,d16
1132 	vshr.u64	d25,d17,#34
1133 	vsli.64	d24,d17,#36
1134 	vadd.i64	d27,d26
1135 	vshr.u64	d26,d17,#39
1136 	vadd.i64	d28,d15
1137 	vsli.64	d25,d17,#30
1138 	veor	d30,d17,d18
1139 	vsli.64	d26,d17,#25
1140 	veor	d16,d24,d25
1141 	vadd.i64	d27,d28
1142 	vbsl	d30,d19,d18		@ Maj(a,b,c)
1143 	veor	d16,d26			@ Sigma0(a)
1144 	vadd.i64	d20,d27
1145 	vadd.i64	d30,d27
1146 	@ vadd.i64	d16,d30
1147 	mov	r12,#4
1148 .L16_79_neon:
1149 	subs	r12,#1
1150 	vshr.u64	q12,q7,#19
1151 	vshr.u64	q13,q7,#61
1152 	vadd.i64	d16,d30			@ h+=Maj from the past
1153 	vshr.u64	q15,q7,#6
1154 	vsli.64	q12,q7,#45
1155 	vext.8	q14,q0,q1,#8	@ X[i+1]
1156 	vsli.64	q13,q7,#3
1157 	veor	q15,q12
1158 	vshr.u64	q12,q14,#1
1159 	veor	q15,q13				@ sigma1(X[i+14])
1160 	vshr.u64	q13,q14,#8
1161 	vadd.i64	q0,q15
1162 	vshr.u64	q15,q14,#7
1163 	vsli.64	q12,q14,#63
1164 	vsli.64	q13,q14,#56
1165 	vext.8	q14,q4,q5,#8	@ X[i+9]
1166 	veor	q15,q12
1167 	vshr.u64	d24,d20,#14		@ from NEON_00_15
1168 	vadd.i64	q0,q14
1169 	vshr.u64	d25,d20,#18		@ from NEON_00_15
1170 	veor	q15,q13				@ sigma0(X[i+1])
1171 	vshr.u64	d26,d20,#41		@ from NEON_00_15
1172 	vadd.i64	q0,q15
1173 	vld1.64	{d28},[r3,:64]!	@ K[i++]
1174 	vsli.64	d24,d20,#50
1175 	vsli.64	d25,d20,#46
1176 	vmov	d29,d20
1177 	vsli.64	d26,d20,#23
1178 #if 16<16 && defined(__ARMEL__)
1179 	vrev64.8	,
1180 #endif
1181 	veor	d25,d24
1182 	vbsl	d29,d21,d22		@ Ch(e,f,g)
1183 	vshr.u64	d24,d16,#28
1184 	veor	d26,d25			@ Sigma1(e)
1185 	vadd.i64	d27,d29,d23
1186 	vshr.u64	d25,d16,#34
1187 	vsli.64	d24,d16,#36
1188 	vadd.i64	d27,d26
1189 	vshr.u64	d26,d16,#39
1190 	vadd.i64	d28,d0
1191 	vsli.64	d25,d16,#30
1192 	veor	d30,d16,d17
1193 	vsli.64	d26,d16,#25
1194 	veor	d23,d24,d25
1195 	vadd.i64	d27,d28
1196 	vbsl	d30,d18,d17		@ Maj(a,b,c)
1197 	veor	d23,d26			@ Sigma0(a)
1198 	vadd.i64	d19,d27
1199 	vadd.i64	d30,d27
1200 	@ vadd.i64	d23,d30
1201 	vshr.u64	d24,d19,#14	@ 17
1202 #if 17<16
1203 	vld1.64	{d1},[r1]!	@ handles unaligned
1204 #endif
1205 	vshr.u64	d25,d19,#18
1206 #if 17>0
1207 	vadd.i64	d23,d30			@ h+=Maj from the past
1208 #endif
1209 	vshr.u64	d26,d19,#41
1210 	vld1.64	{d28},[r3,:64]!	@ K[i++]
1211 	vsli.64	d24,d19,#50
1212 	vsli.64	d25,d19,#46
1213 	vmov	d29,d19
1214 	vsli.64	d26,d19,#23
1215 #if 17<16 && defined(__ARMEL__)
1216 	vrev64.8	,
1217 #endif
1218 	veor	d25,d24
1219 	vbsl	d29,d20,d21		@ Ch(e,f,g)
1220 	vshr.u64	d24,d23,#28
1221 	veor	d26,d25			@ Sigma1(e)
1222 	vadd.i64	d27,d29,d22
1223 	vshr.u64	d25,d23,#34
1224 	vsli.64	d24,d23,#36
1225 	vadd.i64	d27,d26
1226 	vshr.u64	d26,d23,#39
1227 	vadd.i64	d28,d1
1228 	vsli.64	d25,d23,#30
1229 	veor	d30,d23,d16
1230 	vsli.64	d26,d23,#25
1231 	veor	d22,d24,d25
1232 	vadd.i64	d27,d28
1233 	vbsl	d30,d17,d16		@ Maj(a,b,c)
1234 	veor	d22,d26			@ Sigma0(a)
1235 	vadd.i64	d18,d27
1236 	vadd.i64	d30,d27
1237 	@ vadd.i64	d22,d30
1238 	vshr.u64	q12,q0,#19
1239 	vshr.u64	q13,q0,#61
1240 	vadd.i64	d22,d30			@ h+=Maj from the past
1241 	vshr.u64	q15,q0,#6
1242 	vsli.64	q12,q0,#45
1243 	vext.8	q14,q1,q2,#8	@ X[i+1]
1244 	vsli.64	q13,q0,#3
1245 	veor	q15,q12
1246 	vshr.u64	q12,q14,#1
1247 	veor	q15,q13				@ sigma1(X[i+14])
1248 	vshr.u64	q13,q14,#8
1249 	vadd.i64	q1,q15
1250 	vshr.u64	q15,q14,#7
1251 	vsli.64	q12,q14,#63
1252 	vsli.64	q13,q14,#56
1253 	vext.8	q14,q5,q6,#8	@ X[i+9]
1254 	veor	q15,q12
1255 	vshr.u64	d24,d18,#14		@ from NEON_00_15
1256 	vadd.i64	q1,q14
1257 	vshr.u64	d25,d18,#18		@ from NEON_00_15
1258 	veor	q15,q13				@ sigma0(X[i+1])
1259 	vshr.u64	d26,d18,#41		@ from NEON_00_15
1260 	vadd.i64	q1,q15
1261 	vld1.64	{d28},[r3,:64]!	@ K[i++]
1262 	vsli.64	d24,d18,#50
1263 	vsli.64	d25,d18,#46
1264 	vmov	d29,d18
1265 	vsli.64	d26,d18,#23
1266 #if 18<16 && defined(__ARMEL__)
1267 	vrev64.8	,
1268 #endif
1269 	veor	d25,d24
1270 	vbsl	d29,d19,d20		@ Ch(e,f,g)
1271 	vshr.u64	d24,d22,#28
1272 	veor	d26,d25			@ Sigma1(e)
1273 	vadd.i64	d27,d29,d21
1274 	vshr.u64	d25,d22,#34
1275 	vsli.64	d24,d22,#36
1276 	vadd.i64	d27,d26
1277 	vshr.u64	d26,d22,#39
1278 	vadd.i64	d28,d2
1279 	vsli.64	d25,d22,#30
1280 	veor	d30,d22,d23
1281 	vsli.64	d26,d22,#25
1282 	veor	d21,d24,d25
1283 	vadd.i64	d27,d28
1284 	vbsl	d30,d16,d23		@ Maj(a,b,c)
1285 	veor	d21,d26			@ Sigma0(a)
1286 	vadd.i64	d17,d27
1287 	vadd.i64	d30,d27
1288 	@ vadd.i64	d21,d30
1289 	vshr.u64	d24,d17,#14	@ 19
1290 #if 19<16
1291 	vld1.64	{d3},[r1]!	@ handles unaligned
1292 #endif
1293 	vshr.u64	d25,d17,#18
1294 #if 19>0
1295 	vadd.i64	d21,d30			@ h+=Maj from the past
1296 #endif
1297 	vshr.u64	d26,d17,#41
1298 	vld1.64	{d28},[r3,:64]!	@ K[i++]
1299 	vsli.64	d24,d17,#50
1300 	vsli.64	d25,d17,#46
1301 	vmov	d29,d17
1302 	vsli.64	d26,d17,#23
1303 #if 19<16 && defined(__ARMEL__)
1304 	vrev64.8	,
1305 #endif
1306 	veor	d25,d24
1307 	vbsl	d29,d18,d19		@ Ch(e,f,g)
1308 	vshr.u64	d24,d21,#28
1309 	veor	d26,d25			@ Sigma1(e)
1310 	vadd.i64	d27,d29,d20
1311 	vshr.u64	d25,d21,#34
1312 	vsli.64	d24,d21,#36
1313 	vadd.i64	d27,d26
1314 	vshr.u64	d26,d21,#39
1315 	vadd.i64	d28,d3
1316 	vsli.64	d25,d21,#30
1317 	veor	d30,d21,d22
1318 	vsli.64	d26,d21,#25
1319 	veor	d20,d24,d25
1320 	vadd.i64	d27,d28
1321 	vbsl	d30,d23,d22		@ Maj(a,b,c)
1322 	veor	d20,d26			@ Sigma0(a)
1323 	vadd.i64	d16,d27
1324 	vadd.i64	d30,d27
1325 	@ vadd.i64	d20,d30
1326 	vshr.u64	q12,q1,#19
1327 	vshr.u64	q13,q1,#61
1328 	vadd.i64	d20,d30			@ h+=Maj from the past
1329 	vshr.u64	q15,q1,#6
1330 	vsli.64	q12,q1,#45
1331 	vext.8	q14,q2,q3,#8	@ X[i+1]
1332 	vsli.64	q13,q1,#3
1333 	veor	q15,q12
1334 	vshr.u64	q12,q14,#1
1335 	veor	q15,q13				@ sigma1(X[i+14])
1336 	vshr.u64	q13,q14,#8
1337 	vadd.i64	q2,q15
1338 	vshr.u64	q15,q14,#7
1339 	vsli.64	q12,q14,#63
1340 	vsli.64	q13,q14,#56
1341 	vext.8	q14,q6,q7,#8	@ X[i+9]
1342 	veor	q15,q12
1343 	vshr.u64	d24,d16,#14		@ from NEON_00_15
1344 	vadd.i64	q2,q14
1345 	vshr.u64	d25,d16,#18		@ from NEON_00_15
1346 	veor	q15,q13				@ sigma0(X[i+1])
1347 	vshr.u64	d26,d16,#41		@ from NEON_00_15
1348 	vadd.i64	q2,q15
1349 	vld1.64	{d28},[r3,:64]!	@ K[i++]
1350 	vsli.64	d24,d16,#50
1351 	vsli.64	d25,d16,#46
1352 	vmov	d29,d16
1353 	vsli.64	d26,d16,#23
1354 #if 20<16 && defined(__ARMEL__)
1355 	vrev64.8	,
1356 #endif
1357 	veor	d25,d24
1358 	vbsl	d29,d17,d18		@ Ch(e,f,g)
1359 	vshr.u64	d24,d20,#28
1360 	veor	d26,d25			@ Sigma1(e)
1361 	vadd.i64	d27,d29,d19
1362 	vshr.u64	d25,d20,#34
1363 	vsli.64	d24,d20,#36
1364 	vadd.i64	d27,d26
1365 	vshr.u64	d26,d20,#39
1366 	vadd.i64	d28,d4
1367 	vsli.64	d25,d20,#30
1368 	veor	d30,d20,d21
1369 	vsli.64	d26,d20,#25
1370 	veor	d19,d24,d25
1371 	vadd.i64	d27,d28
1372 	vbsl	d30,d22,d21		@ Maj(a,b,c)
1373 	veor	d19,d26			@ Sigma0(a)
1374 	vadd.i64	d23,d27
1375 	vadd.i64	d30,d27
1376 	@ vadd.i64	d19,d30
1377 	vshr.u64	d24,d23,#14	@ 21
1378 #if 21<16
1379 	vld1.64	{d5},[r1]!	@ handles unaligned
1380 #endif
1381 	vshr.u64	d25,d23,#18
1382 #if 21>0
1383 	vadd.i64	d19,d30			@ h+=Maj from the past
1384 #endif
1385 	vshr.u64	d26,d23,#41
1386 	vld1.64	{d28},[r3,:64]!	@ K[i++]
1387 	vsli.64	d24,d23,#50
1388 	vsli.64	d25,d23,#46
1389 	vmov	d29,d23
1390 	vsli.64	d26,d23,#23
1391 #if 21<16 && defined(__ARMEL__)
1392 	vrev64.8	,
1393 #endif
1394 	veor	d25,d24
1395 	vbsl	d29,d16,d17		@ Ch(e,f,g)
1396 	vshr.u64	d24,d19,#28
1397 	veor	d26,d25			@ Sigma1(e)
1398 	vadd.i64	d27,d29,d18
1399 	vshr.u64	d25,d19,#34
1400 	vsli.64	d24,d19,#36
1401 	vadd.i64	d27,d26
1402 	vshr.u64	d26,d19,#39
1403 	vadd.i64	d28,d5
1404 	vsli.64	d25,d19,#30
1405 	veor	d30,d19,d20
1406 	vsli.64	d26,d19,#25
1407 	veor	d18,d24,d25
1408 	vadd.i64	d27,d28
1409 	vbsl	d30,d21,d20		@ Maj(a,b,c)
1410 	veor	d18,d26			@ Sigma0(a)
1411 	vadd.i64	d22,d27
1412 	vadd.i64	d30,d27
1413 	@ vadd.i64	d18,d30
1414 	vshr.u64	q12,q2,#19
1415 	vshr.u64	q13,q2,#61
1416 	vadd.i64	d18,d30			@ h+=Maj from the past
1417 	vshr.u64	q15,q2,#6
1418 	vsli.64	q12,q2,#45
1419 	vext.8	q14,q3,q4,#8	@ X[i+1]
1420 	vsli.64	q13,q2,#3
1421 	veor	q15,q12
1422 	vshr.u64	q12,q14,#1
1423 	veor	q15,q13				@ sigma1(X[i+14])
1424 	vshr.u64	q13,q14,#8
1425 	vadd.i64	q3,q15
1426 	vshr.u64	q15,q14,#7
1427 	vsli.64	q12,q14,#63
1428 	vsli.64	q13,q14,#56
1429 	vext.8	q14,q7,q0,#8	@ X[i+9]
1430 	veor	q15,q12
1431 	vshr.u64	d24,d22,#14		@ from NEON_00_15
1432 	vadd.i64	q3,q14
1433 	vshr.u64	d25,d22,#18		@ from NEON_00_15
1434 	veor	q15,q13				@ sigma0(X[i+1])
1435 	vshr.u64	d26,d22,#41		@ from NEON_00_15
1436 	vadd.i64	q3,q15
1437 	vld1.64	{d28},[r3,:64]!	@ K[i++]
1438 	vsli.64	d24,d22,#50
1439 	vsli.64	d25,d22,#46
1440 	vmov	d29,d22
1441 	vsli.64	d26,d22,#23
1442 #if 22<16 && defined(__ARMEL__)
1443 	vrev64.8	,
1444 #endif
1445 	veor	d25,d24
1446 	vbsl	d29,d23,d16		@ Ch(e,f,g)
1447 	vshr.u64	d24,d18,#28
1448 	veor	d26,d25			@ Sigma1(e)
1449 	vadd.i64	d27,d29,d17
1450 	vshr.u64	d25,d18,#34
1451 	vsli.64	d24,d18,#36
1452 	vadd.i64	d27,d26
1453 	vshr.u64	d26,d18,#39
1454 	vadd.i64	d28,d6
1455 	vsli.64	d25,d18,#30
1456 	veor	d30,d18,d19
1457 	vsli.64	d26,d18,#25
1458 	veor	d17,d24,d25
1459 	vadd.i64	d27,d28
1460 	vbsl	d30,d20,d19		@ Maj(a,b,c)
1461 	veor	d17,d26			@ Sigma0(a)
1462 	vadd.i64	d21,d27
1463 	vadd.i64	d30,d27
1464 	@ vadd.i64	d17,d30
1465 	vshr.u64	d24,d21,#14	@ 23
1466 #if 23<16
1467 	vld1.64	{d7},[r1]!	@ handles unaligned
1468 #endif
1469 	vshr.u64	d25,d21,#18
1470 #if 23>0
1471 	vadd.i64	d17,d30			@ h+=Maj from the past
1472 #endif
1473 	vshr.u64	d26,d21,#41
1474 	vld1.64	{d28},[r3,:64]!	@ K[i++]
1475 	vsli.64	d24,d21,#50
1476 	vsli.64	d25,d21,#46
1477 	vmov	d29,d21
1478 	vsli.64	d26,d21,#23
1479 #if 23<16 && defined(__ARMEL__)
1480 	vrev64.8	,
1481 #endif
1482 	veor	d25,d24
1483 	vbsl	d29,d22,d23		@ Ch(e,f,g)
1484 	vshr.u64	d24,d17,#28
1485 	veor	d26,d25			@ Sigma1(e)
1486 	vadd.i64	d27,d29,d16
1487 	vshr.u64	d25,d17,#34
1488 	vsli.64	d24,d17,#36
1489 	vadd.i64	d27,d26
1490 	vshr.u64	d26,d17,#39
1491 	vadd.i64	d28,d7
1492 	vsli.64	d25,d17,#30
1493 	veor	d30,d17,d18
1494 	vsli.64	d26,d17,#25
1495 	veor	d16,d24,d25
1496 	vadd.i64	d27,d28
1497 	vbsl	d30,d19,d18		@ Maj(a,b,c)
1498 	veor	d16,d26			@ Sigma0(a)
1499 	vadd.i64	d20,d27
1500 	vadd.i64	d30,d27
1501 	@ vadd.i64	d16,d30
1502 	vshr.u64	q12,q3,#19
1503 	vshr.u64	q13,q3,#61
1504 	vadd.i64	d16,d30			@ h+=Maj from the past
1505 	vshr.u64	q15,q3,#6
1506 	vsli.64	q12,q3,#45
1507 	vext.8	q14,q4,q5,#8	@ X[i+1]
1508 	vsli.64	q13,q3,#3
1509 	veor	q15,q12
1510 	vshr.u64	q12,q14,#1
1511 	veor	q15,q13				@ sigma1(X[i+14])
1512 	vshr.u64	q13,q14,#8
1513 	vadd.i64	q4,q15
1514 	vshr.u64	q15,q14,#7
1515 	vsli.64	q12,q14,#63
1516 	vsli.64	q13,q14,#56
1517 	vext.8	q14,q0,q1,#8	@ X[i+9]
1518 	veor	q15,q12
1519 	vshr.u64	d24,d20,#14		@ from NEON_00_15
1520 	vadd.i64	q4,q14
1521 	vshr.u64	d25,d20,#18		@ from NEON_00_15
1522 	veor	q15,q13				@ sigma0(X[i+1])
1523 	vshr.u64	d26,d20,#41		@ from NEON_00_15
1524 	vadd.i64	q4,q15
1525 	vld1.64	{d28},[r3,:64]!	@ K[i++]
1526 	vsli.64	d24,d20,#50
1527 	vsli.64	d25,d20,#46
1528 	vmov	d29,d20
1529 	vsli.64	d26,d20,#23
1530 #if 24<16 && defined(__ARMEL__)
1531 	vrev64.8	,
1532 #endif
1533 	veor	d25,d24
1534 	vbsl	d29,d21,d22		@ Ch(e,f,g)
1535 	vshr.u64	d24,d16,#28
1536 	veor	d26,d25			@ Sigma1(e)
1537 	vadd.i64	d27,d29,d23
1538 	vshr.u64	d25,d16,#34
1539 	vsli.64	d24,d16,#36
1540 	vadd.i64	d27,d26
1541 	vshr.u64	d26,d16,#39
1542 	vadd.i64	d28,d8
1543 	vsli.64	d25,d16,#30
1544 	veor	d30,d16,d17
1545 	vsli.64	d26,d16,#25
1546 	veor	d23,d24,d25
1547 	vadd.i64	d27,d28
1548 	vbsl	d30,d18,d17		@ Maj(a,b,c)
1549 	veor	d23,d26			@ Sigma0(a)
1550 	vadd.i64	d19,d27
1551 	vadd.i64	d30,d27
1552 	@ vadd.i64	d23,d30
1553 	vshr.u64	d24,d19,#14	@ 25
1554 #if 25<16
1555 	vld1.64	{d9},[r1]!	@ handles unaligned
1556 #endif
1557 	vshr.u64	d25,d19,#18
1558 #if 25>0
1559 	vadd.i64	d23,d30			@ h+=Maj from the past
1560 #endif
1561 	vshr.u64	d26,d19,#41
1562 	vld1.64	{d28},[r3,:64]!	@ K[i++]
1563 	vsli.64	d24,d19,#50
1564 	vsli.64	d25,d19,#46
1565 	vmov	d29,d19
1566 	vsli.64	d26,d19,#23
1567 #if 25<16 && defined(__ARMEL__)
1568 	vrev64.8	,
1569 #endif
1570 	veor	d25,d24
1571 	vbsl	d29,d20,d21		@ Ch(e,f,g)
1572 	vshr.u64	d24,d23,#28
1573 	veor	d26,d25			@ Sigma1(e)
1574 	vadd.i64	d27,d29,d22
1575 	vshr.u64	d25,d23,#34
1576 	vsli.64	d24,d23,#36
1577 	vadd.i64	d27,d26
1578 	vshr.u64	d26,d23,#39
1579 	vadd.i64	d28,d9
1580 	vsli.64	d25,d23,#30
1581 	veor	d30,d23,d16
1582 	vsli.64	d26,d23,#25
1583 	veor	d22,d24,d25
1584 	vadd.i64	d27,d28
1585 	vbsl	d30,d17,d16		@ Maj(a,b,c)
1586 	veor	d22,d26			@ Sigma0(a)
1587 	vadd.i64	d18,d27
1588 	vadd.i64	d30,d27
1589 	@ vadd.i64	d22,d30
1590 	vshr.u64	q12,q4,#19
1591 	vshr.u64	q13,q4,#61
1592 	vadd.i64	d22,d30			@ h+=Maj from the past
1593 	vshr.u64	q15,q4,#6
1594 	vsli.64	q12,q4,#45
1595 	vext.8	q14,q5,q6,#8	@ X[i+1]
1596 	vsli.64	q13,q4,#3
1597 	veor	q15,q12
1598 	vshr.u64	q12,q14,#1
1599 	veor	q15,q13				@ sigma1(X[i+14])
1600 	vshr.u64	q13,q14,#8
1601 	vadd.i64	q5,q15
1602 	vshr.u64	q15,q14,#7
1603 	vsli.64	q12,q14,#63
1604 	vsli.64	q13,q14,#56
1605 	vext.8	q14,q1,q2,#8	@ X[i+9]
1606 	veor	q15,q12
1607 	vshr.u64	d24,d18,#14		@ from NEON_00_15
1608 	vadd.i64	q5,q14
1609 	vshr.u64	d25,d18,#18		@ from NEON_00_15
1610 	veor	q15,q13				@ sigma0(X[i+1])
1611 	vshr.u64	d26,d18,#41		@ from NEON_00_15
1612 	vadd.i64	q5,q15
1613 	vld1.64	{d28},[r3,:64]!	@ K[i++]
1614 	vsli.64	d24,d18,#50
1615 	vsli.64	d25,d18,#46
1616 	vmov	d29,d18
1617 	vsli.64	d26,d18,#23
1618 #if 26<16 && defined(__ARMEL__)
1619 	vrev64.8	,
1620 #endif
1621 	veor	d25,d24
1622 	vbsl	d29,d19,d20		@ Ch(e,f,g)
1623 	vshr.u64	d24,d22,#28
1624 	veor	d26,d25			@ Sigma1(e)
1625 	vadd.i64	d27,d29,d21
1626 	vshr.u64	d25,d22,#34
1627 	vsli.64	d24,d22,#36
1628 	vadd.i64	d27,d26
1629 	vshr.u64	d26,d22,#39
1630 	vadd.i64	d28,d10
1631 	vsli.64	d25,d22,#30
1632 	veor	d30,d22,d23
1633 	vsli.64	d26,d22,#25
1634 	veor	d21,d24,d25
1635 	vadd.i64	d27,d28
1636 	vbsl	d30,d16,d23		@ Maj(a,b,c)
1637 	veor	d21,d26			@ Sigma0(a)
1638 	vadd.i64	d17,d27
1639 	vadd.i64	d30,d27
1640 	@ vadd.i64	d21,d30
1641 	vshr.u64	d24,d17,#14	@ 27
1642 #if 27<16
1643 	vld1.64	{d11},[r1]!	@ handles unaligned
1644 #endif
1645 	vshr.u64	d25,d17,#18
1646 #if 27>0
1647 	vadd.i64	d21,d30			@ h+=Maj from the past
1648 #endif
1649 	vshr.u64	d26,d17,#41
1650 	vld1.64	{d28},[r3,:64]!	@ K[i++]
1651 	vsli.64	d24,d17,#50
1652 	vsli.64	d25,d17,#46
1653 	vmov	d29,d17
1654 	vsli.64	d26,d17,#23
1655 #if 27<16 && defined(__ARMEL__)
1656 	vrev64.8	,
1657 #endif
1658 	veor	d25,d24
1659 	vbsl	d29,d18,d19		@ Ch(e,f,g)
1660 	vshr.u64	d24,d21,#28
1661 	veor	d26,d25			@ Sigma1(e)
1662 	vadd.i64	d27,d29,d20
1663 	vshr.u64	d25,d21,#34
1664 	vsli.64	d24,d21,#36
1665 	vadd.i64	d27,d26
1666 	vshr.u64	d26,d21,#39
1667 	vadd.i64	d28,d11
1668 	vsli.64	d25,d21,#30
1669 	veor	d30,d21,d22
1670 	vsli.64	d26,d21,#25
1671 	veor	d20,d24,d25
1672 	vadd.i64	d27,d28
1673 	vbsl	d30,d23,d22		@ Maj(a,b,c)
1674 	veor	d20,d26			@ Sigma0(a)
1675 	vadd.i64	d16,d27
1676 	vadd.i64	d30,d27
1677 	@ vadd.i64	d20,d30
1678 	vshr.u64	q12,q5,#19
1679 	vshr.u64	q13,q5,#61
1680 	vadd.i64	d20,d30			@ h+=Maj from the past
1681 	vshr.u64	q15,q5,#6
1682 	vsli.64	q12,q5,#45
1683 	vext.8	q14,q6,q7,#8	@ X[i+1]
1684 	vsli.64	q13,q5,#3
1685 	veor	q15,q12
1686 	vshr.u64	q12,q14,#1
1687 	veor	q15,q13				@ sigma1(X[i+14])
1688 	vshr.u64	q13,q14,#8
1689 	vadd.i64	q6,q15
1690 	vshr.u64	q15,q14,#7
1691 	vsli.64	q12,q14,#63
1692 	vsli.64	q13,q14,#56
1693 	vext.8	q14,q2,q3,#8	@ X[i+9]
1694 	veor	q15,q12
1695 	vshr.u64	d24,d16,#14		@ from NEON_00_15
1696 	vadd.i64	q6,q14
1697 	vshr.u64	d25,d16,#18		@ from NEON_00_15
1698 	veor	q15,q13				@ sigma0(X[i+1])
1699 	vshr.u64	d26,d16,#41		@ from NEON_00_15
1700 	vadd.i64	q6,q15
1701 	vld1.64	{d28},[r3,:64]!	@ K[i++]
1702 	vsli.64	d24,d16,#50
1703 	vsli.64	d25,d16,#46
1704 	vmov	d29,d16
1705 	vsli.64	d26,d16,#23
1706 #if 28<16 && defined(__ARMEL__)
1707 	vrev64.8	,
1708 #endif
1709 	veor	d25,d24
1710 	vbsl	d29,d17,d18		@ Ch(e,f,g)
1711 	vshr.u64	d24,d20,#28
1712 	veor	d26,d25			@ Sigma1(e)
1713 	vadd.i64	d27,d29,d19
1714 	vshr.u64	d25,d20,#34
1715 	vsli.64	d24,d20,#36
1716 	vadd.i64	d27,d26
1717 	vshr.u64	d26,d20,#39
1718 	vadd.i64	d28,d12
1719 	vsli.64	d25,d20,#30
1720 	veor	d30,d20,d21
1721 	vsli.64	d26,d20,#25
1722 	veor	d19,d24,d25
1723 	vadd.i64	d27,d28
1724 	vbsl	d30,d22,d21		@ Maj(a,b,c)
1725 	veor	d19,d26			@ Sigma0(a)
1726 	vadd.i64	d23,d27
1727 	vadd.i64	d30,d27
1728 	@ vadd.i64	d19,d30
1729 	vshr.u64	d24,d23,#14	@ 29
1730 #if 29<16
1731 	vld1.64	{d13},[r1]!	@ handles unaligned
1732 #endif
1733 	vshr.u64	d25,d23,#18
1734 #if 29>0
1735 	vadd.i64	d19,d30			@ h+=Maj from the past
1736 #endif
1737 	vshr.u64	d26,d23,#41
1738 	vld1.64	{d28},[r3,:64]!	@ K[i++]
1739 	vsli.64	d24,d23,#50
1740 	vsli.64	d25,d23,#46
1741 	vmov	d29,d23
1742 	vsli.64	d26,d23,#23
1743 #if 29<16 && defined(__ARMEL__)
1744 	vrev64.8	,
1745 #endif
1746 	veor	d25,d24
1747 	vbsl	d29,d16,d17		@ Ch(e,f,g)
1748 	vshr.u64	d24,d19,#28
1749 	veor	d26,d25			@ Sigma1(e)
1750 	vadd.i64	d27,d29,d18
1751 	vshr.u64	d25,d19,#34
1752 	vsli.64	d24,d19,#36
1753 	vadd.i64	d27,d26
1754 	vshr.u64	d26,d19,#39
1755 	vadd.i64	d28,d13
1756 	vsli.64	d25,d19,#30
1757 	veor	d30,d19,d20
1758 	vsli.64	d26,d19,#25
1759 	veor	d18,d24,d25
1760 	vadd.i64	d27,d28
1761 	vbsl	d30,d21,d20		@ Maj(a,b,c)
1762 	veor	d18,d26			@ Sigma0(a)
1763 	vadd.i64	d22,d27
1764 	vadd.i64	d30,d27
1765 	@ vadd.i64	d18,d30
1766 	vshr.u64	q12,q6,#19
1767 	vshr.u64	q13,q6,#61
1768 	vadd.i64	d18,d30			@ h+=Maj from the past
1769 	vshr.u64	q15,q6,#6
1770 	vsli.64	q12,q6,#45
1771 	vext.8	q14,q7,q0,#8	@ X[i+1]
1772 	vsli.64	q13,q6,#3
1773 	veor	q15,q12
1774 	vshr.u64	q12,q14,#1
1775 	veor	q15,q13				@ sigma1(X[i+14])
1776 	vshr.u64	q13,q14,#8
1777 	vadd.i64	q7,q15
1778 	vshr.u64	q15,q14,#7
1779 	vsli.64	q12,q14,#63
1780 	vsli.64	q13,q14,#56
1781 	vext.8	q14,q3,q4,#8	@ X[i+9]
1782 	veor	q15,q12
1783 	vshr.u64	d24,d22,#14		@ from NEON_00_15
1784 	vadd.i64	q7,q14
1785 	vshr.u64	d25,d22,#18		@ from NEON_00_15
1786 	veor	q15,q13				@ sigma0(X[i+1])
1787 	vshr.u64	d26,d22,#41		@ from NEON_00_15
1788 	vadd.i64	q7,q15
1789 	vld1.64	{d28},[r3,:64]!	@ K[i++]
1790 	vsli.64	d24,d22,#50
1791 	vsli.64	d25,d22,#46
1792 	vmov	d29,d22
1793 	vsli.64	d26,d22,#23
1794 #if 30<16 && defined(__ARMEL__)
1795 	vrev64.8	,
1796 #endif
1797 	veor	d25,d24
1798 	vbsl	d29,d23,d16		@ Ch(e,f,g)
1799 	vshr.u64	d24,d18,#28
1800 	veor	d26,d25			@ Sigma1(e)
1801 	vadd.i64	d27,d29,d17
1802 	vshr.u64	d25,d18,#34
1803 	vsli.64	d24,d18,#36
1804 	vadd.i64	d27,d26
1805 	vshr.u64	d26,d18,#39
1806 	vadd.i64	d28,d14
1807 	vsli.64	d25,d18,#30
1808 	veor	d30,d18,d19
1809 	vsli.64	d26,d18,#25
1810 	veor	d17,d24,d25
1811 	vadd.i64	d27,d28
1812 	vbsl	d30,d20,d19		@ Maj(a,b,c)
1813 	veor	d17,d26			@ Sigma0(a)
1814 	vadd.i64	d21,d27
1815 	vadd.i64	d30,d27
1816 	@ vadd.i64	d17,d30
1817 	vshr.u64	d24,d21,#14	@ 31
1818 #if 31<16
1819 	vld1.64	{d15},[r1]!	@ handles unaligned
1820 #endif
1821 	vshr.u64	d25,d21,#18
1822 #if 31>0
1823 	vadd.i64	d17,d30			@ h+=Maj from the past
1824 #endif
1825 	vshr.u64	d26,d21,#41
1826 	vld1.64	{d28},[r3,:64]!	@ K[i++]
1827 	vsli.64	d24,d21,#50
1828 	vsli.64	d25,d21,#46
1829 	vmov	d29,d21
1830 	vsli.64	d26,d21,#23
1831 #if 31<16 && defined(__ARMEL__)
1832 	vrev64.8	,
1833 #endif
1834 	veor	d25,d24
1835 	vbsl	d29,d22,d23		@ Ch(e,f,g)
1836 	vshr.u64	d24,d17,#28
1837 	veor	d26,d25			@ Sigma1(e)
1838 	vadd.i64	d27,d29,d16
1839 	vshr.u64	d25,d17,#34
1840 	vsli.64	d24,d17,#36
1841 	vadd.i64	d27,d26
1842 	vshr.u64	d26,d17,#39
1843 	vadd.i64	d28,d15
1844 	vsli.64	d25,d17,#30
1845 	veor	d30,d17,d18
1846 	vsli.64	d26,d17,#25
1847 	veor	d16,d24,d25
1848 	vadd.i64	d27,d28
1849 	vbsl	d30,d19,d18		@ Maj(a,b,c)
1850 	veor	d16,d26			@ Sigma0(a)
1851 	vadd.i64	d20,d27
1852 	vadd.i64	d30,d27
1853 	@ vadd.i64	d16,d30
1854 	bne	.L16_79_neon
1855 
1856 	vadd.i64	d16,d30		@ h+=Maj from the past
1857 	vldmia	r0,{d24,d25,d26,d27,d28,d29,d30,d31}	@ load context to temp
1858 	vadd.i64	q8,q12		@ vectorized accumulate
1859 	vadd.i64	q9,q13
1860 	vadd.i64	q10,q14
1861 	vadd.i64	q11,q15
1862 	vstmia	r0,{d16,d17,d18,d19,d20,d21,d22,d23}	@ save context
1863 	teq	r1,r2
1864 	sub	r3,#640	@ rewind K512
1865 	bne	.Loop_neon
1866 
1867 	VFP_ABI_POP
1868 	bx	lr				@ .word	0xe12fff1e
1869 .size	sha512_block_data_order_neon,.-sha512_block_data_order_neon
1870 #endif
1871 .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
1872 .align	2
1873 .align	2
1874 #if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__)
1875 .comm	OPENSSL_armcap_P,4,4
1876 #endif
1877