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