1#if defined(__arm__)
2@ Copyright 2007-2016 The OpenSSL Project Authors. All Rights Reserved.
3@
4@ Licensed under the OpenSSL license (the "License").  You may not use
5@ this file except in compliance with the License.  You can obtain a copy
6@ in the file LICENSE in the source distribution or at
7@ https://www.openssl.org/source/license.html
8
9
10@ ====================================================================
11@ Written by Andy Polyakov <appro@openssl.org> for the OpenSSL
12@ project. The module is, however, dual licensed under OpenSSL and
13@ CRYPTOGAMS licenses depending on where you obtain it. For further
14@ details see http://www.openssl.org/~appro/cryptogams/.
15@
16@ Permission to use under GPL terms is granted.
17@ ====================================================================
18
19@ SHA512 block procedure for ARMv4. September 2007.
20
21@ This code is ~4.5 (four and a half) times faster than code generated
22@ by gcc 3.4 and it spends ~72 clock cycles per byte [on single-issue
23@ Xscale PXA250 core].
24@
25@ July 2010.
26@
27@ Rescheduling for dual-issue pipeline resulted in 6% improvement on
28@ Cortex A8 core and ~40 cycles per processed byte.
29
30@ February 2011.
31@
32@ Profiler-assisted and platform-specific optimization resulted in 7%
33@ improvement on Coxtex A8 core and ~38 cycles per byte.
34
35@ March 2011.
36@
37@ Add NEON implementation. On Cortex A8 it was measured to process
38@ one byte in 23.3 cycles or ~60% faster than integer-only code.
39
40@ August 2012.
41@
42@ Improve NEON performance by 12% on Snapdragon S4. In absolute
43@ terms it's 22.6 cycles per byte, which is disappointing result.
44@ Technical writers asserted that 3-way S4 pipeline can sustain
45@ multiple NEON instructions per cycle, but dual NEON issue could
46@ not be observed, see http://www.openssl.org/~appro/Snapdragon-S4.html
47@ for further details. On side note Cortex-A15 processes one byte in
48@ 16 cycles.
49
50@ Byte order [in]dependence. =========================================
51@
52@ Originally caller was expected to maintain specific *dword* order in
53@ h[0-7], namely with most significant dword at *lower* address, which
54@ was reflected in below two parameters as 0 and 4. Now caller is
55@ expected to maintain native byte order for whole 64-bit values.
56#ifndef __KERNEL__
57# include <openssl/arm_arch.h>
58# define VFP_ABI_PUSH	vstmdb	sp!,{d8-d15}
59# define VFP_ABI_POP	vldmia	sp!,{d8-d15}
60#else
61# define __ARM_ARCH__ __LINUX_ARM_ARCH__
62# define __ARM_MAX_ARCH__ 7
63# define VFP_ABI_PUSH
64# define VFP_ABI_POP
65#endif
66
67@ Silence ARMv8 deprecated IT instruction warnings. This file is used by both
68@ ARMv7 and ARMv8 processors and does not use ARMv8 instructions.
69.arch	armv7-a
70
71#ifdef __ARMEL__
72# define LO 0
73# define HI 4
74# define WORD64(hi0,lo0,hi1,lo1)	.word	lo0,hi0, lo1,hi1
75#else
76# define HI 0
77# define LO 4
78# define WORD64(hi0,lo0,hi1,lo1)	.word	hi0,lo0, hi1,lo1
79#endif
80
81.text
82#if defined(__thumb2__)
83.syntax	unified
84.thumb
85# define adrl adr
86#else
87.code	32
88#endif
89
90.type	K512,%object
91.align	5
92K512:
93	WORD64(0x428a2f98,0xd728ae22,	0x71374491,0x23ef65cd)
94	WORD64(0xb5c0fbcf,0xec4d3b2f,	0xe9b5dba5,0x8189dbbc)
95	WORD64(0x3956c25b,0xf348b538,	0x59f111f1,0xb605d019)
96	WORD64(0x923f82a4,0xaf194f9b,	0xab1c5ed5,0xda6d8118)
97	WORD64(0xd807aa98,0xa3030242,	0x12835b01,0x45706fbe)
98	WORD64(0x243185be,0x4ee4b28c,	0x550c7dc3,0xd5ffb4e2)
99	WORD64(0x72be5d74,0xf27b896f,	0x80deb1fe,0x3b1696b1)
100	WORD64(0x9bdc06a7,0x25c71235,	0xc19bf174,0xcf692694)
101	WORD64(0xe49b69c1,0x9ef14ad2,	0xefbe4786,0x384f25e3)
102	WORD64(0x0fc19dc6,0x8b8cd5b5,	0x240ca1cc,0x77ac9c65)
103	WORD64(0x2de92c6f,0x592b0275,	0x4a7484aa,0x6ea6e483)
104	WORD64(0x5cb0a9dc,0xbd41fbd4,	0x76f988da,0x831153b5)
105	WORD64(0x983e5152,0xee66dfab,	0xa831c66d,0x2db43210)
106	WORD64(0xb00327c8,0x98fb213f,	0xbf597fc7,0xbeef0ee4)
107	WORD64(0xc6e00bf3,0x3da88fc2,	0xd5a79147,0x930aa725)
108	WORD64(0x06ca6351,0xe003826f,	0x14292967,0x0a0e6e70)
109	WORD64(0x27b70a85,0x46d22ffc,	0x2e1b2138,0x5c26c926)
110	WORD64(0x4d2c6dfc,0x5ac42aed,	0x53380d13,0x9d95b3df)
111	WORD64(0x650a7354,0x8baf63de,	0x766a0abb,0x3c77b2a8)
112	WORD64(0x81c2c92e,0x47edaee6,	0x92722c85,0x1482353b)
113	WORD64(0xa2bfe8a1,0x4cf10364,	0xa81a664b,0xbc423001)
114	WORD64(0xc24b8b70,0xd0f89791,	0xc76c51a3,0x0654be30)
115	WORD64(0xd192e819,0xd6ef5218,	0xd6990624,0x5565a910)
116	WORD64(0xf40e3585,0x5771202a,	0x106aa070,0x32bbd1b8)
117	WORD64(0x19a4c116,0xb8d2d0c8,	0x1e376c08,0x5141ab53)
118	WORD64(0x2748774c,0xdf8eeb99,	0x34b0bcb5,0xe19b48a8)
119	WORD64(0x391c0cb3,0xc5c95a63,	0x4ed8aa4a,0xe3418acb)
120	WORD64(0x5b9cca4f,0x7763e373,	0x682e6ff3,0xd6b2b8a3)
121	WORD64(0x748f82ee,0x5defb2fc,	0x78a5636f,0x43172f60)
122	WORD64(0x84c87814,0xa1f0ab72,	0x8cc70208,0x1a6439ec)
123	WORD64(0x90befffa,0x23631e28,	0xa4506ceb,0xde82bde9)
124	WORD64(0xbef9a3f7,0xb2c67915,	0xc67178f2,0xe372532b)
125	WORD64(0xca273ece,0xea26619c,	0xd186b8c7,0x21c0c207)
126	WORD64(0xeada7dd6,0xcde0eb1e,	0xf57d4f7f,0xee6ed178)
127	WORD64(0x06f067aa,0x72176fba,	0x0a637dc5,0xa2c898a6)
128	WORD64(0x113f9804,0xbef90dae,	0x1b710b35,0x131c471b)
129	WORD64(0x28db77f5,0x23047d84,	0x32caab7b,0x40c72493)
130	WORD64(0x3c9ebe0a,0x15c9bebc,	0x431d67c4,0x9c100d4c)
131	WORD64(0x4cc5d4be,0xcb3e42b6,	0x597f299c,0xfc657e2a)
132	WORD64(0x5fcb6fab,0x3ad6faec,	0x6c44198c,0x4a475817)
133.size	K512,.-K512
134#if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__)
135.LOPENSSL_armcap:
136.word	OPENSSL_armcap_P-.Lsha512_block_data_order
137.skip	32-4
138#else
139.skip	32
140#endif
141
142.globl	sha512_block_data_order
143.hidden	sha512_block_data_order
144.type	sha512_block_data_order,%function
145sha512_block_data_order:
146.Lsha512_block_data_order:
147#if __ARM_ARCH__<7 && !defined(__thumb2__)
148	sub	r3,pc,#8		@ sha512_block_data_order
149#else
150	adr	r3,.Lsha512_block_data_order
151#endif
152#if __ARM_MAX_ARCH__>=7 && !defined(__KERNEL__)
153	ldr	r12,.LOPENSSL_armcap
154	ldr	r12,[r3,r12]		@ OPENSSL_armcap_P
155#ifdef	__APPLE__
156	ldr	r12,[r12]
157#endif
158	tst	r12,#ARMV7_NEON
159	bne	.LNEON
160#endif
161	add	r2,r1,r2,lsl#7	@ len to point at the end of inp
162	stmdb	sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr}
163	sub	r14,r3,#672		@ K512
164	sub	sp,sp,#9*8
165
166	ldr	r7,[r0,#32+LO]
167	ldr	r8,[r0,#32+HI]
168	ldr	r9, [r0,#48+LO]
169	ldr	r10, [r0,#48+HI]
170	ldr	r11, [r0,#56+LO]
171	ldr	r12, [r0,#56+HI]
172.Loop:
173	str	r9, [sp,#48+0]
174	str	r10, [sp,#48+4]
175	str	r11, [sp,#56+0]
176	str	r12, [sp,#56+4]
177	ldr	r5,[r0,#0+LO]
178	ldr	r6,[r0,#0+HI]
179	ldr	r3,[r0,#8+LO]
180	ldr	r4,[r0,#8+HI]
181	ldr	r9, [r0,#16+LO]
182	ldr	r10, [r0,#16+HI]
183	ldr	r11, [r0,#24+LO]
184	ldr	r12, [r0,#24+HI]
185	str	r3,[sp,#8+0]
186	str	r4,[sp,#8+4]
187	str	r9, [sp,#16+0]
188	str	r10, [sp,#16+4]
189	str	r11, [sp,#24+0]
190	str	r12, [sp,#24+4]
191	ldr	r3,[r0,#40+LO]
192	ldr	r4,[r0,#40+HI]
193	str	r3,[sp,#40+0]
194	str	r4,[sp,#40+4]
195
196.L00_15:
197#if __ARM_ARCH__<7
198	ldrb	r3,[r1,#7]
199	ldrb	r9, [r1,#6]
200	ldrb	r10, [r1,#5]
201	ldrb	r11, [r1,#4]
202	ldrb	r4,[r1,#3]
203	ldrb	r12, [r1,#2]
204	orr	r3,r3,r9,lsl#8
205	ldrb	r9, [r1,#1]
206	orr	r3,r3,r10,lsl#16
207	ldrb	r10, [r1],#8
208	orr	r3,r3,r11,lsl#24
209	orr	r4,r4,r12,lsl#8
210	orr	r4,r4,r9,lsl#16
211	orr	r4,r4,r10,lsl#24
212#else
213	ldr	r3,[r1,#4]
214	ldr	r4,[r1],#8
215#ifdef __ARMEL__
216	rev	r3,r3
217	rev	r4,r4
218#endif
219#endif
220	@ Sigma1(x)	(ROTR((x),14) ^ ROTR((x),18)  ^ ROTR((x),41))
221	@ LO		lo>>14^hi<<18 ^ lo>>18^hi<<14 ^ hi>>9^lo<<23
222	@ HI		hi>>14^lo<<18 ^ hi>>18^lo<<14 ^ lo>>9^hi<<23
223	mov	r9,r7,lsr#14
224	str	r3,[sp,#64+0]
225	mov	r10,r8,lsr#14
226	str	r4,[sp,#64+4]
227	eor	r9,r9,r8,lsl#18
228	ldr	r11,[sp,#56+0]	@ h.lo
229	eor	r10,r10,r7,lsl#18
230	ldr	r12,[sp,#56+4]	@ h.hi
231	eor	r9,r9,r7,lsr#18
232	eor	r10,r10,r8,lsr#18
233	eor	r9,r9,r8,lsl#14
234	eor	r10,r10,r7,lsl#14
235	eor	r9,r9,r8,lsr#9
236	eor	r10,r10,r7,lsr#9
237	eor	r9,r9,r7,lsl#23
238	eor	r10,r10,r8,lsl#23	@ Sigma1(e)
239	adds	r3,r3,r9
240	ldr	r9,[sp,#40+0]	@ f.lo
241	adc	r4,r4,r10		@ T += Sigma1(e)
242	ldr	r10,[sp,#40+4]	@ f.hi
243	adds	r3,r3,r11
244	ldr	r11,[sp,#48+0]	@ g.lo
245	adc	r4,r4,r12		@ T += h
246	ldr	r12,[sp,#48+4]	@ g.hi
247
248	eor	r9,r9,r11
249	str	r7,[sp,#32+0]
250	eor	r10,r10,r12
251	str	r8,[sp,#32+4]
252	and	r9,r9,r7
253	str	r5,[sp,#0+0]
254	and	r10,r10,r8
255	str	r6,[sp,#0+4]
256	eor	r9,r9,r11
257	ldr	r11,[r14,#LO]	@ K[i].lo
258	eor	r10,r10,r12		@ Ch(e,f,g)
259	ldr	r12,[r14,#HI]	@ K[i].hi
260
261	adds	r3,r3,r9
262	ldr	r7,[sp,#24+0]	@ d.lo
263	adc	r4,r4,r10		@ T += Ch(e,f,g)
264	ldr	r8,[sp,#24+4]	@ d.hi
265	adds	r3,r3,r11
266	and	r9,r11,#0xff
267	adc	r4,r4,r12		@ T += K[i]
268	adds	r7,r7,r3
269	ldr	r11,[sp,#8+0]	@ b.lo
270	adc	r8,r8,r4		@ d += T
271	teq	r9,#148
272
273	ldr	r12,[sp,#16+0]	@ c.lo
274#if __ARM_ARCH__>=7
275	it	eq			@ Thumb2 thing, sanity check in ARM
276#endif
277	orreq	r14,r14,#1
278	@ Sigma0(x)	(ROTR((x),28) ^ ROTR((x),34) ^ ROTR((x),39))
279	@ LO		lo>>28^hi<<4  ^ hi>>2^lo<<30 ^ hi>>7^lo<<25
280	@ HI		hi>>28^lo<<4  ^ lo>>2^hi<<30 ^ lo>>7^hi<<25
281	mov	r9,r5,lsr#28
282	mov	r10,r6,lsr#28
283	eor	r9,r9,r6,lsl#4
284	eor	r10,r10,r5,lsl#4
285	eor	r9,r9,r6,lsr#2
286	eor	r10,r10,r5,lsr#2
287	eor	r9,r9,r5,lsl#30
288	eor	r10,r10,r6,lsl#30
289	eor	r9,r9,r6,lsr#7
290	eor	r10,r10,r5,lsr#7
291	eor	r9,r9,r5,lsl#25
292	eor	r10,r10,r6,lsl#25	@ Sigma0(a)
293	adds	r3,r3,r9
294	and	r9,r5,r11
295	adc	r4,r4,r10		@ T += Sigma0(a)
296
297	ldr	r10,[sp,#8+4]	@ b.hi
298	orr	r5,r5,r11
299	ldr	r11,[sp,#16+4]	@ c.hi
300	and	r5,r5,r12
301	and	r12,r6,r10
302	orr	r6,r6,r10
303	orr	r5,r5,r9		@ Maj(a,b,c).lo
304	and	r6,r6,r11
305	adds	r5,r5,r3
306	orr	r6,r6,r12		@ Maj(a,b,c).hi
307	sub	sp,sp,#8
308	adc	r6,r6,r4		@ h += T
309	tst	r14,#1
310	add	r14,r14,#8
311	tst	r14,#1
312	beq	.L00_15
313	ldr	r9,[sp,#184+0]
314	ldr	r10,[sp,#184+4]
315	bic	r14,r14,#1
316.L16_79:
317	@ sigma0(x)	(ROTR((x),1)  ^ ROTR((x),8)  ^ ((x)>>7))
318	@ LO		lo>>1^hi<<31  ^ lo>>8^hi<<24 ^ lo>>7^hi<<25
319	@ HI		hi>>1^lo<<31  ^ hi>>8^lo<<24 ^ hi>>7
320	mov	r3,r9,lsr#1
321	ldr	r11,[sp,#80+0]
322	mov	r4,r10,lsr#1
323	ldr	r12,[sp,#80+4]
324	eor	r3,r3,r10,lsl#31
325	eor	r4,r4,r9,lsl#31
326	eor	r3,r3,r9,lsr#8
327	eor	r4,r4,r10,lsr#8
328	eor	r3,r3,r10,lsl#24
329	eor	r4,r4,r9,lsl#24
330	eor	r3,r3,r9,lsr#7
331	eor	r4,r4,r10,lsr#7
332	eor	r3,r3,r10,lsl#25
333
334	@ sigma1(x)	(ROTR((x),19) ^ ROTR((x),61) ^ ((x)>>6))
335	@ LO		lo>>19^hi<<13 ^ hi>>29^lo<<3 ^ lo>>6^hi<<26
336	@ HI		hi>>19^lo<<13 ^ lo>>29^hi<<3 ^ hi>>6
337	mov	r9,r11,lsr#19
338	mov	r10,r12,lsr#19
339	eor	r9,r9,r12,lsl#13
340	eor	r10,r10,r11,lsl#13
341	eor	r9,r9,r12,lsr#29
342	eor	r10,r10,r11,lsr#29
343	eor	r9,r9,r11,lsl#3
344	eor	r10,r10,r12,lsl#3
345	eor	r9,r9,r11,lsr#6
346	eor	r10,r10,r12,lsr#6
347	ldr	r11,[sp,#120+0]
348	eor	r9,r9,r12,lsl#26
349
350	ldr	r12,[sp,#120+4]
351	adds	r3,r3,r9
352	ldr	r9,[sp,#192+0]
353	adc	r4,r4,r10
354
355	ldr	r10,[sp,#192+4]
356	adds	r3,r3,r11
357	adc	r4,r4,r12
358	adds	r3,r3,r9
359	adc	r4,r4,r10
360	@ Sigma1(x)	(ROTR((x),14) ^ ROTR((x),18)  ^ ROTR((x),41))
361	@ LO		lo>>14^hi<<18 ^ lo>>18^hi<<14 ^ hi>>9^lo<<23
362	@ HI		hi>>14^lo<<18 ^ hi>>18^lo<<14 ^ lo>>9^hi<<23
363	mov	r9,r7,lsr#14
364	str	r3,[sp,#64+0]
365	mov	r10,r8,lsr#14
366	str	r4,[sp,#64+4]
367	eor	r9,r9,r8,lsl#18
368	ldr	r11,[sp,#56+0]	@ h.lo
369	eor	r10,r10,r7,lsl#18
370	ldr	r12,[sp,#56+4]	@ h.hi
371	eor	r9,r9,r7,lsr#18
372	eor	r10,r10,r8,lsr#18
373	eor	r9,r9,r8,lsl#14
374	eor	r10,r10,r7,lsl#14
375	eor	r9,r9,r8,lsr#9
376	eor	r10,r10,r7,lsr#9
377	eor	r9,r9,r7,lsl#23
378	eor	r10,r10,r8,lsl#23	@ Sigma1(e)
379	adds	r3,r3,r9
380	ldr	r9,[sp,#40+0]	@ f.lo
381	adc	r4,r4,r10		@ T += Sigma1(e)
382	ldr	r10,[sp,#40+4]	@ f.hi
383	adds	r3,r3,r11
384	ldr	r11,[sp,#48+0]	@ g.lo
385	adc	r4,r4,r12		@ T += h
386	ldr	r12,[sp,#48+4]	@ g.hi
387
388	eor	r9,r9,r11
389	str	r7,[sp,#32+0]
390	eor	r10,r10,r12
391	str	r8,[sp,#32+4]
392	and	r9,r9,r7
393	str	r5,[sp,#0+0]
394	and	r10,r10,r8
395	str	r6,[sp,#0+4]
396	eor	r9,r9,r11
397	ldr	r11,[r14,#LO]	@ K[i].lo
398	eor	r10,r10,r12		@ Ch(e,f,g)
399	ldr	r12,[r14,#HI]	@ K[i].hi
400
401	adds	r3,r3,r9
402	ldr	r7,[sp,#24+0]	@ d.lo
403	adc	r4,r4,r10		@ T += Ch(e,f,g)
404	ldr	r8,[sp,#24+4]	@ d.hi
405	adds	r3,r3,r11
406	and	r9,r11,#0xff
407	adc	r4,r4,r12		@ T += K[i]
408	adds	r7,r7,r3
409	ldr	r11,[sp,#8+0]	@ b.lo
410	adc	r8,r8,r4		@ d += T
411	teq	r9,#23
412
413	ldr	r12,[sp,#16+0]	@ c.lo
414#if __ARM_ARCH__>=7
415	it	eq			@ Thumb2 thing, sanity check in ARM
416#endif
417	orreq	r14,r14,#1
418	@ Sigma0(x)	(ROTR((x),28) ^ ROTR((x),34) ^ ROTR((x),39))
419	@ LO		lo>>28^hi<<4  ^ hi>>2^lo<<30 ^ hi>>7^lo<<25
420	@ HI		hi>>28^lo<<4  ^ lo>>2^hi<<30 ^ lo>>7^hi<<25
421	mov	r9,r5,lsr#28
422	mov	r10,r6,lsr#28
423	eor	r9,r9,r6,lsl#4
424	eor	r10,r10,r5,lsl#4
425	eor	r9,r9,r6,lsr#2
426	eor	r10,r10,r5,lsr#2
427	eor	r9,r9,r5,lsl#30
428	eor	r10,r10,r6,lsl#30
429	eor	r9,r9,r6,lsr#7
430	eor	r10,r10,r5,lsr#7
431	eor	r9,r9,r5,lsl#25
432	eor	r10,r10,r6,lsl#25	@ Sigma0(a)
433	adds	r3,r3,r9
434	and	r9,r5,r11
435	adc	r4,r4,r10		@ T += Sigma0(a)
436
437	ldr	r10,[sp,#8+4]	@ b.hi
438	orr	r5,r5,r11
439	ldr	r11,[sp,#16+4]	@ c.hi
440	and	r5,r5,r12
441	and	r12,r6,r10
442	orr	r6,r6,r10
443	orr	r5,r5,r9		@ Maj(a,b,c).lo
444	and	r6,r6,r11
445	adds	r5,r5,r3
446	orr	r6,r6,r12		@ Maj(a,b,c).hi
447	sub	sp,sp,#8
448	adc	r6,r6,r4		@ h += T
449	tst	r14,#1
450	add	r14,r14,#8
451#if __ARM_ARCH__>=7
452	ittt	eq			@ Thumb2 thing, sanity check in ARM
453#endif
454	ldreq	r9,[sp,#184+0]
455	ldreq	r10,[sp,#184+4]
456	beq	.L16_79
457	bic	r14,r14,#1
458
459	ldr	r3,[sp,#8+0]
460	ldr	r4,[sp,#8+4]
461	ldr	r9, [r0,#0+LO]
462	ldr	r10, [r0,#0+HI]
463	ldr	r11, [r0,#8+LO]
464	ldr	r12, [r0,#8+HI]
465	adds	r9,r5,r9
466	str	r9, [r0,#0+LO]
467	adc	r10,r6,r10
468	str	r10, [r0,#0+HI]
469	adds	r11,r3,r11
470	str	r11, [r0,#8+LO]
471	adc	r12,r4,r12
472	str	r12, [r0,#8+HI]
473
474	ldr	r5,[sp,#16+0]
475	ldr	r6,[sp,#16+4]
476	ldr	r3,[sp,#24+0]
477	ldr	r4,[sp,#24+4]
478	ldr	r9, [r0,#16+LO]
479	ldr	r10, [r0,#16+HI]
480	ldr	r11, [r0,#24+LO]
481	ldr	r12, [r0,#24+HI]
482	adds	r9,r5,r9
483	str	r9, [r0,#16+LO]
484	adc	r10,r6,r10
485	str	r10, [r0,#16+HI]
486	adds	r11,r3,r11
487	str	r11, [r0,#24+LO]
488	adc	r12,r4,r12
489	str	r12, [r0,#24+HI]
490
491	ldr	r3,[sp,#40+0]
492	ldr	r4,[sp,#40+4]
493	ldr	r9, [r0,#32+LO]
494	ldr	r10, [r0,#32+HI]
495	ldr	r11, [r0,#40+LO]
496	ldr	r12, [r0,#40+HI]
497	adds	r7,r7,r9
498	str	r7,[r0,#32+LO]
499	adc	r8,r8,r10
500	str	r8,[r0,#32+HI]
501	adds	r11,r3,r11
502	str	r11, [r0,#40+LO]
503	adc	r12,r4,r12
504	str	r12, [r0,#40+HI]
505
506	ldr	r5,[sp,#48+0]
507	ldr	r6,[sp,#48+4]
508	ldr	r3,[sp,#56+0]
509	ldr	r4,[sp,#56+4]
510	ldr	r9, [r0,#48+LO]
511	ldr	r10, [r0,#48+HI]
512	ldr	r11, [r0,#56+LO]
513	ldr	r12, [r0,#56+HI]
514	adds	r9,r5,r9
515	str	r9, [r0,#48+LO]
516	adc	r10,r6,r10
517	str	r10, [r0,#48+HI]
518	adds	r11,r3,r11
519	str	r11, [r0,#56+LO]
520	adc	r12,r4,r12
521	str	r12, [r0,#56+HI]
522
523	add	sp,sp,#640
524	sub	r14,r14,#640
525
526	teq	r1,r2
527	bne	.Loop
528
529	add	sp,sp,#8*9		@ destroy frame
530#if __ARM_ARCH__>=5
531	ldmia	sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,pc}
532#else
533	ldmia	sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr}
534	tst	lr,#1
535	moveq	pc,lr			@ be binary compatible with V4, yet
536.word	0xe12fff1e			@ interoperable with Thumb ISA:-)
537#endif
538.size	sha512_block_data_order,.-sha512_block_data_order
539#if __ARM_MAX_ARCH__>=7
540.arch	armv7-a
541.fpu	neon
542
543.globl	sha512_block_data_order_neon
544.hidden	sha512_block_data_order_neon
545.type	sha512_block_data_order_neon,%function
546.align	4
547sha512_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.hidden	OPENSSL_armcap_P
1877#endif
1878#endif
1879