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