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