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