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