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