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