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