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