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