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