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