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