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