1@ Copyright 2007-2019 The OpenSSL Project Authors. All Rights Reserved.
2@
3@ ====================================================================
4@ Written by Andy Polyakov <appro@openssl.org> for the OpenSSL
5@ project. The module is, however, dual licensed under OpenSSL and
6@ CRYPTOGAMS licenses depending on where you obtain it. For further
7@ details see http://www.openssl.org/~appro/cryptogams/.
8@ ====================================================================
9
10@ JW, MAY 2019: Begin defines from taken from arm_arch.h
11@               The defines were included through the header.
12
13# if !defined(__ARM_ARCH__)
14#  if defined(__CC_ARM)
15#   define __ARM_ARCH__ __TARGET_ARCH_ARM
16#   if defined(__BIG_ENDIAN)
17#    define __ARMEB__
18#   else
19#    define __ARMEL__
20#   endif
21#  elif defined(__GNUC__)
22#   if   defined(__aarch64__)
23#    define __ARM_ARCH__ 8
24#    if __BYTE_ORDER__==__ORDER_BIG_ENDIAN__
25#     define __ARMEB__
26#    else
27#     define __ARMEL__
28#    endif
29
30#   elif defined(__ARM_ARCH)
31#    define __ARM_ARCH__ __ARM_ARCH
32#   elif defined(__ARM_ARCH_8A__)
33#    define __ARM_ARCH__ 8
34#   elif defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__)     || \
35        defined(__ARM_ARCH_7R__)|| defined(__ARM_ARCH_7M__)     || \
36        defined(__ARM_ARCH_7EM__)
37#    define __ARM_ARCH__ 7
38#   elif defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__)     || \
39        defined(__ARM_ARCH_6K__)|| defined(__ARM_ARCH_6M__)     || \
40        defined(__ARM_ARCH_6Z__)|| defined(__ARM_ARCH_6ZK__)    || \
41        defined(__ARM_ARCH_6T2__)
42#    define __ARM_ARCH__ 6
43#   elif defined(__ARM_ARCH_5__) || defined(__ARM_ARCH_5T__)     || \
44        defined(__ARM_ARCH_5E__)|| defined(__ARM_ARCH_5TE__)    || \
45        defined(__ARM_ARCH_5TEJ__)
46#    define __ARM_ARCH__ 5
47#   elif defined(__ARM_ARCH_4__) || defined(__ARM_ARCH_4T__)
48#    define __ARM_ARCH__ 4
49#   else
50#    error "unsupported ARM architecture"
51#   endif
52#  endif
53# endif
54
55# if !defined(__ARM_MAX_ARCH__)
56#  define __ARM_MAX_ARCH__ __ARM_ARCH__
57# endif
58
59# if __ARM_MAX_ARCH__<__ARM_ARCH__
60#  error "__ARM_MAX_ARCH__ can't be less than __ARM_ARCH__"
61# elif __ARM_MAX_ARCH__!=__ARM_ARCH__
62#  if __ARM_ARCH__<7 && __ARM_MAX_ARCH__>=7 && defined(__ARMEB__)
63#   error "can't build universal big-endian binary"
64#  endif
65# endif
66
67# define CRYPTOGAMS_ARMV7_NEON      (1<<0)
68
69@ JW, MAY 2019: End defines from taken from arm_arch.h
70@               Back to original Cryptogams code
71
72#ifdef __ARMEL__
73# define LO 0
74# define HI 4
75# define WORD64(hi0,lo0,hi1,lo1)	.word	lo0,hi0, lo1,hi1
76#else
77# define HI 0
78# define LO 4
79# define WORD64(hi0,lo0,hi1,lo1)	.word	hi0,lo0, hi1,lo1
80#endif
81
82#if defined(__thumb2__)
83.syntax	unified
84.thumb
85# define adrl adr
86#else
87.code	32
88#endif
89
90.text
91
92.type	K512,%object
93.align	5
94K512:
95	WORD64(0x428a2f98,0xd728ae22,	0x71374491,0x23ef65cd)
96	WORD64(0xb5c0fbcf,0xec4d3b2f,	0xe9b5dba5,0x8189dbbc)
97	WORD64(0x3956c25b,0xf348b538,	0x59f111f1,0xb605d019)
98	WORD64(0x923f82a4,0xaf194f9b,	0xab1c5ed5,0xda6d8118)
99	WORD64(0xd807aa98,0xa3030242,	0x12835b01,0x45706fbe)
100	WORD64(0x243185be,0x4ee4b28c,	0x550c7dc3,0xd5ffb4e2)
101	WORD64(0x72be5d74,0xf27b896f,	0x80deb1fe,0x3b1696b1)
102	WORD64(0x9bdc06a7,0x25c71235,	0xc19bf174,0xcf692694)
103	WORD64(0xe49b69c1,0x9ef14ad2,	0xefbe4786,0x384f25e3)
104	WORD64(0x0fc19dc6,0x8b8cd5b5,	0x240ca1cc,0x77ac9c65)
105	WORD64(0x2de92c6f,0x592b0275,	0x4a7484aa,0x6ea6e483)
106	WORD64(0x5cb0a9dc,0xbd41fbd4,	0x76f988da,0x831153b5)
107	WORD64(0x983e5152,0xee66dfab,	0xa831c66d,0x2db43210)
108	WORD64(0xb00327c8,0x98fb213f,	0xbf597fc7,0xbeef0ee4)
109	WORD64(0xc6e00bf3,0x3da88fc2,	0xd5a79147,0x930aa725)
110	WORD64(0x06ca6351,0xe003826f,	0x14292967,0x0a0e6e70)
111	WORD64(0x27b70a85,0x46d22ffc,	0x2e1b2138,0x5c26c926)
112	WORD64(0x4d2c6dfc,0x5ac42aed,	0x53380d13,0x9d95b3df)
113	WORD64(0x650a7354,0x8baf63de,	0x766a0abb,0x3c77b2a8)
114	WORD64(0x81c2c92e,0x47edaee6,	0x92722c85,0x1482353b)
115	WORD64(0xa2bfe8a1,0x4cf10364,	0xa81a664b,0xbc423001)
116	WORD64(0xc24b8b70,0xd0f89791,	0xc76c51a3,0x0654be30)
117	WORD64(0xd192e819,0xd6ef5218,	0xd6990624,0x5565a910)
118	WORD64(0xf40e3585,0x5771202a,	0x106aa070,0x32bbd1b8)
119	WORD64(0x19a4c116,0xb8d2d0c8,	0x1e376c08,0x5141ab53)
120	WORD64(0x2748774c,0xdf8eeb99,	0x34b0bcb5,0xe19b48a8)
121	WORD64(0x391c0cb3,0xc5c95a63,	0x4ed8aa4a,0xe3418acb)
122	WORD64(0x5b9cca4f,0x7763e373,	0x682e6ff3,0xd6b2b8a3)
123	WORD64(0x748f82ee,0x5defb2fc,	0x78a5636f,0x43172f60)
124	WORD64(0x84c87814,0xa1f0ab72,	0x8cc70208,0x1a6439ec)
125	WORD64(0x90befffa,0x23631e28,	0xa4506ceb,0xde82bde9)
126	WORD64(0xbef9a3f7,0xb2c67915,	0xc67178f2,0xe372532b)
127	WORD64(0xca273ece,0xea26619c,	0xd186b8c7,0x21c0c207)
128	WORD64(0xeada7dd6,0xcde0eb1e,	0xf57d4f7f,0xee6ed178)
129	WORD64(0x06f067aa,0x72176fba,	0x0a637dc5,0xa2c898a6)
130	WORD64(0x113f9804,0xbef90dae,	0x1b710b35,0x131c471b)
131	WORD64(0x28db77f5,0x23047d84,	0x32caab7b,0x40c72493)
132	WORD64(0x3c9ebe0a,0x15c9bebc,	0x431d67c4,0x9c100d4c)
133	WORD64(0x4cc5d4be,0xcb3e42b6,	0x597f299c,0xfc657e2a)
134	WORD64(0x5fcb6fab,0x3ad6faec,	0x6c44198c,0x4a475817)
135.size	K512,.-K512
136
137.skip	32
138
139.align	5
140.globl	cryptogams_sha512_block_data_order
141.type	cryptogams_sha512_block_data_order,%function
142
143cryptogams_sha512_block_data_order:
144.Lcryptogams_sha512_block_data_order:
145
146#if __ARM_ARCH__<7 && !defined(__thumb2__)
147	sub	r3,pc,#8		@ cryptogams_sha512_block_data_order
148#else
149	adr	r3,.Lcryptogams_sha512_block_data_order
150#endif
151
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#ifdef	__thumb2__
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#ifdef	__thumb2__
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#ifdef	__thumb2__
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	cryptogams_sha512_block_data_order,.-cryptogams_sha512_block_data_order
530
531#if __ARM_MAX_ARCH__>=7
532.arch	armv7-a
533.fpu	neon
534
535.align	4
536.globl	cryptogams_sha512_block_data_order_neon
537.type	cryptogams_sha512_block_data_order_neon,%function
538
539cryptogams_sha512_block_data_order_neon:
540
541	dmb	@ errata #451034 on early Cortex A8
542	add	r2,r1,r2,lsl#7	@ len to point at the end of inp
543	adr	r3,K512
544	vstmdb  sp!,{d8-d15}
545	vldmia	r0,{d16,d17,d18,d19,d20,d21,d22,d23}		@ load context
546.Loop_neon:
547	vshr.u64	d24,d20,#14	@ 0
548#if 0<16
549	vld1.64	{d0},[r1]!	@ handles unaligned
550#endif
551	vshr.u64	d25,d20,#18
552#if 0>0
553	vadd.i64	d16,d30			@ h+=Maj from the past
554#endif
555	vshr.u64	d26,d20,#41
556	vld1.64	{d28},[r3,:64]!	@ K[i++]
557	vsli.64	d24,d20,#50
558	vsli.64	d25,d20,#46
559	vmov	d29,d20
560	vsli.64	d26,d20,#23
561#if 0<16 && defined(__ARMEL__)
562	vrev64.8	d0,d0
563#endif
564	veor	d25,d24
565	vbsl	d29,d21,d22		@ Ch(e,f,g)
566	vshr.u64	d24,d16,#28
567	veor	d26,d25			@ Sigma1(e)
568	vadd.i64	d27,d29,d23
569	vshr.u64	d25,d16,#34
570	vsli.64	d24,d16,#36
571	vadd.i64	d27,d26
572	vshr.u64	d26,d16,#39
573	vadd.i64	d28,d0
574	vsli.64	d25,d16,#30
575	veor	d30,d16,d17
576	vsli.64	d26,d16,#25
577	veor	d23,d24,d25
578	vadd.i64	d27,d28
579	vbsl	d30,d18,d17		@ Maj(a,b,c)
580	veor	d23,d26			@ Sigma0(a)
581	vadd.i64	d19,d27
582	vadd.i64	d30,d27
583	@ vadd.i64	d23,d30
584	vshr.u64	d24,d19,#14	@ 1
585#if 1<16
586	vld1.64	{d1},[r1]!	@ handles unaligned
587#endif
588	vshr.u64	d25,d19,#18
589#if 1>0
590	vadd.i64	d23,d30			@ h+=Maj from the past
591#endif
592	vshr.u64	d26,d19,#41
593	vld1.64	{d28},[r3,:64]!	@ K[i++]
594	vsli.64	d24,d19,#50
595	vsli.64	d25,d19,#46
596	vmov	d29,d19
597	vsli.64	d26,d19,#23
598#if 1<16 && defined(__ARMEL__)
599	vrev64.8	d1,d1
600#endif
601	veor	d25,d24
602	vbsl	d29,d20,d21		@ Ch(e,f,g)
603	vshr.u64	d24,d23,#28
604	veor	d26,d25			@ Sigma1(e)
605	vadd.i64	d27,d29,d22
606	vshr.u64	d25,d23,#34
607	vsli.64	d24,d23,#36
608	vadd.i64	d27,d26
609	vshr.u64	d26,d23,#39
610	vadd.i64	d28,d1
611	vsli.64	d25,d23,#30
612	veor	d30,d23,d16
613	vsli.64	d26,d23,#25
614	veor	d22,d24,d25
615	vadd.i64	d27,d28
616	vbsl	d30,d17,d16		@ Maj(a,b,c)
617	veor	d22,d26			@ Sigma0(a)
618	vadd.i64	d18,d27
619	vadd.i64	d30,d27
620	@ vadd.i64	d22,d30
621	vshr.u64	d24,d18,#14	@ 2
622#if 2<16
623	vld1.64	{d2},[r1]!	@ handles unaligned
624#endif
625	vshr.u64	d25,d18,#18
626#if 2>0
627	vadd.i64	d22,d30			@ h+=Maj from the past
628#endif
629	vshr.u64	d26,d18,#41
630	vld1.64	{d28},[r3,:64]!	@ K[i++]
631	vsli.64	d24,d18,#50
632	vsli.64	d25,d18,#46
633	vmov	d29,d18
634	vsli.64	d26,d18,#23
635#if 2<16 && defined(__ARMEL__)
636	vrev64.8	d2,d2
637#endif
638	veor	d25,d24
639	vbsl	d29,d19,d20		@ Ch(e,f,g)
640	vshr.u64	d24,d22,#28
641	veor	d26,d25			@ Sigma1(e)
642	vadd.i64	d27,d29,d21
643	vshr.u64	d25,d22,#34
644	vsli.64	d24,d22,#36
645	vadd.i64	d27,d26
646	vshr.u64	d26,d22,#39
647	vadd.i64	d28,d2
648	vsli.64	d25,d22,#30
649	veor	d30,d22,d23
650	vsli.64	d26,d22,#25
651	veor	d21,d24,d25
652	vadd.i64	d27,d28
653	vbsl	d30,d16,d23		@ Maj(a,b,c)
654	veor	d21,d26			@ Sigma0(a)
655	vadd.i64	d17,d27
656	vadd.i64	d30,d27
657	@ vadd.i64	d21,d30
658	vshr.u64	d24,d17,#14	@ 3
659#if 3<16
660	vld1.64	{d3},[r1]!	@ handles unaligned
661#endif
662	vshr.u64	d25,d17,#18
663#if 3>0
664	vadd.i64	d21,d30			@ h+=Maj from the past
665#endif
666	vshr.u64	d26,d17,#41
667	vld1.64	{d28},[r3,:64]!	@ K[i++]
668	vsli.64	d24,d17,#50
669	vsli.64	d25,d17,#46
670	vmov	d29,d17
671	vsli.64	d26,d17,#23
672#if 3<16 && defined(__ARMEL__)
673	vrev64.8	d3,d3
674#endif
675	veor	d25,d24
676	vbsl	d29,d18,d19		@ Ch(e,f,g)
677	vshr.u64	d24,d21,#28
678	veor	d26,d25			@ Sigma1(e)
679	vadd.i64	d27,d29,d20
680	vshr.u64	d25,d21,#34
681	vsli.64	d24,d21,#36
682	vadd.i64	d27,d26
683	vshr.u64	d26,d21,#39
684	vadd.i64	d28,d3
685	vsli.64	d25,d21,#30
686	veor	d30,d21,d22
687	vsli.64	d26,d21,#25
688	veor	d20,d24,d25
689	vadd.i64	d27,d28
690	vbsl	d30,d23,d22		@ Maj(a,b,c)
691	veor	d20,d26			@ Sigma0(a)
692	vadd.i64	d16,d27
693	vadd.i64	d30,d27
694	@ vadd.i64	d20,d30
695	vshr.u64	d24,d16,#14	@ 4
696#if 4<16
697	vld1.64	{d4},[r1]!	@ handles unaligned
698#endif
699	vshr.u64	d25,d16,#18
700#if 4>0
701	vadd.i64	d20,d30			@ h+=Maj from the past
702#endif
703	vshr.u64	d26,d16,#41
704	vld1.64	{d28},[r3,:64]!	@ K[i++]
705	vsli.64	d24,d16,#50
706	vsli.64	d25,d16,#46
707	vmov	d29,d16
708	vsli.64	d26,d16,#23
709#if 4<16 && defined(__ARMEL__)
710	vrev64.8	d4,d4
711#endif
712	veor	d25,d24
713	vbsl	d29,d17,d18		@ Ch(e,f,g)
714	vshr.u64	d24,d20,#28
715	veor	d26,d25			@ Sigma1(e)
716	vadd.i64	d27,d29,d19
717	vshr.u64	d25,d20,#34
718	vsli.64	d24,d20,#36
719	vadd.i64	d27,d26
720	vshr.u64	d26,d20,#39
721	vadd.i64	d28,d4
722	vsli.64	d25,d20,#30
723	veor	d30,d20,d21
724	vsli.64	d26,d20,#25
725	veor	d19,d24,d25
726	vadd.i64	d27,d28
727	vbsl	d30,d22,d21		@ Maj(a,b,c)
728	veor	d19,d26			@ Sigma0(a)
729	vadd.i64	d23,d27
730	vadd.i64	d30,d27
731	@ vadd.i64	d19,d30
732	vshr.u64	d24,d23,#14	@ 5
733#if 5<16
734	vld1.64	{d5},[r1]!	@ handles unaligned
735#endif
736	vshr.u64	d25,d23,#18
737#if 5>0
738	vadd.i64	d19,d30			@ h+=Maj from the past
739#endif
740	vshr.u64	d26,d23,#41
741	vld1.64	{d28},[r3,:64]!	@ K[i++]
742	vsli.64	d24,d23,#50
743	vsli.64	d25,d23,#46
744	vmov	d29,d23
745	vsli.64	d26,d23,#23
746#if 5<16 && defined(__ARMEL__)
747	vrev64.8	d5,d5
748#endif
749	veor	d25,d24
750	vbsl	d29,d16,d17		@ Ch(e,f,g)
751	vshr.u64	d24,d19,#28
752	veor	d26,d25			@ Sigma1(e)
753	vadd.i64	d27,d29,d18
754	vshr.u64	d25,d19,#34
755	vsli.64	d24,d19,#36
756	vadd.i64	d27,d26
757	vshr.u64	d26,d19,#39
758	vadd.i64	d28,d5
759	vsli.64	d25,d19,#30
760	veor	d30,d19,d20
761	vsli.64	d26,d19,#25
762	veor	d18,d24,d25
763	vadd.i64	d27,d28
764	vbsl	d30,d21,d20		@ Maj(a,b,c)
765	veor	d18,d26			@ Sigma0(a)
766	vadd.i64	d22,d27
767	vadd.i64	d30,d27
768	@ vadd.i64	d18,d30
769	vshr.u64	d24,d22,#14	@ 6
770#if 6<16
771	vld1.64	{d6},[r1]!	@ handles unaligned
772#endif
773	vshr.u64	d25,d22,#18
774#if 6>0
775	vadd.i64	d18,d30			@ h+=Maj from the past
776#endif
777	vshr.u64	d26,d22,#41
778	vld1.64	{d28},[r3,:64]!	@ K[i++]
779	vsli.64	d24,d22,#50
780	vsli.64	d25,d22,#46
781	vmov	d29,d22
782	vsli.64	d26,d22,#23
783#if 6<16 && defined(__ARMEL__)
784	vrev64.8	d6,d6
785#endif
786	veor	d25,d24
787	vbsl	d29,d23,d16		@ Ch(e,f,g)
788	vshr.u64	d24,d18,#28
789	veor	d26,d25			@ Sigma1(e)
790	vadd.i64	d27,d29,d17
791	vshr.u64	d25,d18,#34
792	vsli.64	d24,d18,#36
793	vadd.i64	d27,d26
794	vshr.u64	d26,d18,#39
795	vadd.i64	d28,d6
796	vsli.64	d25,d18,#30
797	veor	d30,d18,d19
798	vsli.64	d26,d18,#25
799	veor	d17,d24,d25
800	vadd.i64	d27,d28
801	vbsl	d30,d20,d19		@ Maj(a,b,c)
802	veor	d17,d26			@ Sigma0(a)
803	vadd.i64	d21,d27
804	vadd.i64	d30,d27
805	@ vadd.i64	d17,d30
806	vshr.u64	d24,d21,#14	@ 7
807#if 7<16
808	vld1.64	{d7},[r1]!	@ handles unaligned
809#endif
810	vshr.u64	d25,d21,#18
811#if 7>0
812	vadd.i64	d17,d30			@ h+=Maj from the past
813#endif
814	vshr.u64	d26,d21,#41
815	vld1.64	{d28},[r3,:64]!	@ K[i++]
816	vsli.64	d24,d21,#50
817	vsli.64	d25,d21,#46
818	vmov	d29,d21
819	vsli.64	d26,d21,#23
820#if 7<16 && defined(__ARMEL__)
821	vrev64.8	d7,d7
822#endif
823	veor	d25,d24
824	vbsl	d29,d22,d23		@ Ch(e,f,g)
825	vshr.u64	d24,d17,#28
826	veor	d26,d25			@ Sigma1(e)
827	vadd.i64	d27,d29,d16
828	vshr.u64	d25,d17,#34
829	vsli.64	d24,d17,#36
830	vadd.i64	d27,d26
831	vshr.u64	d26,d17,#39
832	vadd.i64	d28,d7
833	vsli.64	d25,d17,#30
834	veor	d30,d17,d18
835	vsli.64	d26,d17,#25
836	veor	d16,d24,d25
837	vadd.i64	d27,d28
838	vbsl	d30,d19,d18		@ Maj(a,b,c)
839	veor	d16,d26			@ Sigma0(a)
840	vadd.i64	d20,d27
841	vadd.i64	d30,d27
842	@ vadd.i64	d16,d30
843	vshr.u64	d24,d20,#14	@ 8
844#if 8<16
845	vld1.64	{d8},[r1]!	@ handles unaligned
846#endif
847	vshr.u64	d25,d20,#18
848#if 8>0
849	vadd.i64	d16,d30			@ h+=Maj from the past
850#endif
851	vshr.u64	d26,d20,#41
852	vld1.64	{d28},[r3,:64]!	@ K[i++]
853	vsli.64	d24,d20,#50
854	vsli.64	d25,d20,#46
855	vmov	d29,d20
856	vsli.64	d26,d20,#23
857#if 8<16 && defined(__ARMEL__)
858	vrev64.8	d8,d8
859#endif
860	veor	d25,d24
861	vbsl	d29,d21,d22		@ Ch(e,f,g)
862	vshr.u64	d24,d16,#28
863	veor	d26,d25			@ Sigma1(e)
864	vadd.i64	d27,d29,d23
865	vshr.u64	d25,d16,#34
866	vsli.64	d24,d16,#36
867	vadd.i64	d27,d26
868	vshr.u64	d26,d16,#39
869	vadd.i64	d28,d8
870	vsli.64	d25,d16,#30
871	veor	d30,d16,d17
872	vsli.64	d26,d16,#25
873	veor	d23,d24,d25
874	vadd.i64	d27,d28
875	vbsl	d30,d18,d17		@ Maj(a,b,c)
876	veor	d23,d26			@ Sigma0(a)
877	vadd.i64	d19,d27
878	vadd.i64	d30,d27
879	@ vadd.i64	d23,d30
880	vshr.u64	d24,d19,#14	@ 9
881#if 9<16
882	vld1.64	{d9},[r1]!	@ handles unaligned
883#endif
884	vshr.u64	d25,d19,#18
885#if 9>0
886	vadd.i64	d23,d30			@ h+=Maj from the past
887#endif
888	vshr.u64	d26,d19,#41
889	vld1.64	{d28},[r3,:64]!	@ K[i++]
890	vsli.64	d24,d19,#50
891	vsli.64	d25,d19,#46
892	vmov	d29,d19
893	vsli.64	d26,d19,#23
894#if 9<16 && defined(__ARMEL__)
895	vrev64.8	d9,d9
896#endif
897	veor	d25,d24
898	vbsl	d29,d20,d21		@ Ch(e,f,g)
899	vshr.u64	d24,d23,#28
900	veor	d26,d25			@ Sigma1(e)
901	vadd.i64	d27,d29,d22
902	vshr.u64	d25,d23,#34
903	vsli.64	d24,d23,#36
904	vadd.i64	d27,d26
905	vshr.u64	d26,d23,#39
906	vadd.i64	d28,d9
907	vsli.64	d25,d23,#30
908	veor	d30,d23,d16
909	vsli.64	d26,d23,#25
910	veor	d22,d24,d25
911	vadd.i64	d27,d28
912	vbsl	d30,d17,d16		@ Maj(a,b,c)
913	veor	d22,d26			@ Sigma0(a)
914	vadd.i64	d18,d27
915	vadd.i64	d30,d27
916	@ vadd.i64	d22,d30
917	vshr.u64	d24,d18,#14	@ 10
918#if 10<16
919	vld1.64	{d10},[r1]!	@ handles unaligned
920#endif
921	vshr.u64	d25,d18,#18
922#if 10>0
923	vadd.i64	d22,d30			@ h+=Maj from the past
924#endif
925	vshr.u64	d26,d18,#41
926	vld1.64	{d28},[r3,:64]!	@ K[i++]
927	vsli.64	d24,d18,#50
928	vsli.64	d25,d18,#46
929	vmov	d29,d18
930	vsli.64	d26,d18,#23
931#if 10<16 && defined(__ARMEL__)
932	vrev64.8	d10,d10
933#endif
934	veor	d25,d24
935	vbsl	d29,d19,d20		@ Ch(e,f,g)
936	vshr.u64	d24,d22,#28
937	veor	d26,d25			@ Sigma1(e)
938	vadd.i64	d27,d29,d21
939	vshr.u64	d25,d22,#34
940	vsli.64	d24,d22,#36
941	vadd.i64	d27,d26
942	vshr.u64	d26,d22,#39
943	vadd.i64	d28,d10
944	vsli.64	d25,d22,#30
945	veor	d30,d22,d23
946	vsli.64	d26,d22,#25
947	veor	d21,d24,d25
948	vadd.i64	d27,d28
949	vbsl	d30,d16,d23		@ Maj(a,b,c)
950	veor	d21,d26			@ Sigma0(a)
951	vadd.i64	d17,d27
952	vadd.i64	d30,d27
953	@ vadd.i64	d21,d30
954	vshr.u64	d24,d17,#14	@ 11
955#if 11<16
956	vld1.64	{d11},[r1]!	@ handles unaligned
957#endif
958	vshr.u64	d25,d17,#18
959#if 11>0
960	vadd.i64	d21,d30			@ h+=Maj from the past
961#endif
962	vshr.u64	d26,d17,#41
963	vld1.64	{d28},[r3,:64]!	@ K[i++]
964	vsli.64	d24,d17,#50
965	vsli.64	d25,d17,#46
966	vmov	d29,d17
967	vsli.64	d26,d17,#23
968#if 11<16 && defined(__ARMEL__)
969	vrev64.8	d11,d11
970#endif
971	veor	d25,d24
972	vbsl	d29,d18,d19		@ Ch(e,f,g)
973	vshr.u64	d24,d21,#28
974	veor	d26,d25			@ Sigma1(e)
975	vadd.i64	d27,d29,d20
976	vshr.u64	d25,d21,#34
977	vsli.64	d24,d21,#36
978	vadd.i64	d27,d26
979	vshr.u64	d26,d21,#39
980	vadd.i64	d28,d11
981	vsli.64	d25,d21,#30
982	veor	d30,d21,d22
983	vsli.64	d26,d21,#25
984	veor	d20,d24,d25
985	vadd.i64	d27,d28
986	vbsl	d30,d23,d22		@ Maj(a,b,c)
987	veor	d20,d26			@ Sigma0(a)
988	vadd.i64	d16,d27
989	vadd.i64	d30,d27
990	@ vadd.i64	d20,d30
991	vshr.u64	d24,d16,#14	@ 12
992#if 12<16
993	vld1.64	{d12},[r1]!	@ handles unaligned
994#endif
995	vshr.u64	d25,d16,#18
996#if 12>0
997	vadd.i64	d20,d30			@ h+=Maj from the past
998#endif
999	vshr.u64	d26,d16,#41
1000	vld1.64	{d28},[r3,:64]!	@ K[i++]
1001	vsli.64	d24,d16,#50
1002	vsli.64	d25,d16,#46
1003	vmov	d29,d16
1004	vsli.64	d26,d16,#23
1005#if 12<16 && defined(__ARMEL__)
1006	vrev64.8	d12,d12
1007#endif
1008	veor	d25,d24
1009	vbsl	d29,d17,d18		@ Ch(e,f,g)
1010	vshr.u64	d24,d20,#28
1011	veor	d26,d25			@ Sigma1(e)
1012	vadd.i64	d27,d29,d19
1013	vshr.u64	d25,d20,#34
1014	vsli.64	d24,d20,#36
1015	vadd.i64	d27,d26
1016	vshr.u64	d26,d20,#39
1017	vadd.i64	d28,d12
1018	vsli.64	d25,d20,#30
1019	veor	d30,d20,d21
1020	vsli.64	d26,d20,#25
1021	veor	d19,d24,d25
1022	vadd.i64	d27,d28
1023	vbsl	d30,d22,d21		@ Maj(a,b,c)
1024	veor	d19,d26			@ Sigma0(a)
1025	vadd.i64	d23,d27
1026	vadd.i64	d30,d27
1027	@ vadd.i64	d19,d30
1028	vshr.u64	d24,d23,#14	@ 13
1029#if 13<16
1030	vld1.64	{d13},[r1]!	@ handles unaligned
1031#endif
1032	vshr.u64	d25,d23,#18
1033#if 13>0
1034	vadd.i64	d19,d30			@ h+=Maj from the past
1035#endif
1036	vshr.u64	d26,d23,#41
1037	vld1.64	{d28},[r3,:64]!	@ K[i++]
1038	vsli.64	d24,d23,#50
1039	vsli.64	d25,d23,#46
1040	vmov	d29,d23
1041	vsli.64	d26,d23,#23
1042#if 13<16 && defined(__ARMEL__)
1043	vrev64.8	d13,d13
1044#endif
1045	veor	d25,d24
1046	vbsl	d29,d16,d17		@ Ch(e,f,g)
1047	vshr.u64	d24,d19,#28
1048	veor	d26,d25			@ Sigma1(e)
1049	vadd.i64	d27,d29,d18
1050	vshr.u64	d25,d19,#34
1051	vsli.64	d24,d19,#36
1052	vadd.i64	d27,d26
1053	vshr.u64	d26,d19,#39
1054	vadd.i64	d28,d13
1055	vsli.64	d25,d19,#30
1056	veor	d30,d19,d20
1057	vsli.64	d26,d19,#25
1058	veor	d18,d24,d25
1059	vadd.i64	d27,d28
1060	vbsl	d30,d21,d20		@ Maj(a,b,c)
1061	veor	d18,d26			@ Sigma0(a)
1062	vadd.i64	d22,d27
1063	vadd.i64	d30,d27
1064	@ vadd.i64	d18,d30
1065	vshr.u64	d24,d22,#14	@ 14
1066#if 14<16
1067	vld1.64	{d14},[r1]!	@ handles unaligned
1068#endif
1069	vshr.u64	d25,d22,#18
1070#if 14>0
1071	vadd.i64	d18,d30			@ h+=Maj from the past
1072#endif
1073	vshr.u64	d26,d22,#41
1074	vld1.64	{d28},[r3,:64]!	@ K[i++]
1075	vsli.64	d24,d22,#50
1076	vsli.64	d25,d22,#46
1077	vmov	d29,d22
1078	vsli.64	d26,d22,#23
1079#if 14<16 && defined(__ARMEL__)
1080	vrev64.8	d14,d14
1081#endif
1082	veor	d25,d24
1083	vbsl	d29,d23,d16		@ Ch(e,f,g)
1084	vshr.u64	d24,d18,#28
1085	veor	d26,d25			@ Sigma1(e)
1086	vadd.i64	d27,d29,d17
1087	vshr.u64	d25,d18,#34
1088	vsli.64	d24,d18,#36
1089	vadd.i64	d27,d26
1090	vshr.u64	d26,d18,#39
1091	vadd.i64	d28,d14
1092	vsli.64	d25,d18,#30
1093	veor	d30,d18,d19
1094	vsli.64	d26,d18,#25
1095	veor	d17,d24,d25
1096	vadd.i64	d27,d28
1097	vbsl	d30,d20,d19		@ Maj(a,b,c)
1098	veor	d17,d26			@ Sigma0(a)
1099	vadd.i64	d21,d27
1100	vadd.i64	d30,d27
1101	@ vadd.i64	d17,d30
1102	vshr.u64	d24,d21,#14	@ 15
1103#if 15<16
1104	vld1.64	{d15},[r1]!	@ handles unaligned
1105#endif
1106	vshr.u64	d25,d21,#18
1107#if 15>0
1108	vadd.i64	d17,d30			@ h+=Maj from the past
1109#endif
1110	vshr.u64	d26,d21,#41
1111	vld1.64	{d28},[r3,:64]!	@ K[i++]
1112	vsli.64	d24,d21,#50
1113	vsli.64	d25,d21,#46
1114	vmov	d29,d21
1115	vsli.64	d26,d21,#23
1116#if 15<16 && defined(__ARMEL__)
1117	vrev64.8	d15,d15
1118#endif
1119	veor	d25,d24
1120	vbsl	d29,d22,d23		@ Ch(e,f,g)
1121	vshr.u64	d24,d17,#28
1122	veor	d26,d25			@ Sigma1(e)
1123	vadd.i64	d27,d29,d16
1124	vshr.u64	d25,d17,#34
1125	vsli.64	d24,d17,#36
1126	vadd.i64	d27,d26
1127	vshr.u64	d26,d17,#39
1128	vadd.i64	d28,d15
1129	vsli.64	d25,d17,#30
1130	veor	d30,d17,d18
1131	vsli.64	d26,d17,#25
1132	veor	d16,d24,d25
1133	vadd.i64	d27,d28
1134	vbsl	d30,d19,d18		@ Maj(a,b,c)
1135	veor	d16,d26			@ Sigma0(a)
1136	vadd.i64	d20,d27
1137	vadd.i64	d30,d27
1138	@ vadd.i64	d16,d30
1139	mov	r12,#4
1140.L16_79_neon:
1141	subs	r12,#1
1142	vshr.u64	q12,q7,#19
1143	vshr.u64	q13,q7,#61
1144	vadd.i64	d16,d30			@ h+=Maj from the past
1145	vshr.u64	q15,q7,#6
1146	vsli.64	q12,q7,#45
1147	vext.8	q14,q0,q1,#8	@ X[i+1]
1148	vsli.64	q13,q7,#3
1149	veor	q15,q12
1150	vshr.u64	q12,q14,#1
1151	veor	q15,q13				@ sigma1(X[i+14])
1152	vshr.u64	q13,q14,#8
1153	vadd.i64	q0,q15
1154	vshr.u64	q15,q14,#7
1155	vsli.64	q12,q14,#63
1156	vsli.64	q13,q14,#56
1157	vext.8	q14,q4,q5,#8	@ X[i+9]
1158	veor	q15,q12
1159	vshr.u64	d24,d20,#14		@ from NEON_00_15
1160	vadd.i64	q0,q14
1161	vshr.u64	d25,d20,#18		@ from NEON_00_15
1162	veor	q15,q13				@ sigma0(X[i+1])
1163	vshr.u64	d26,d20,#41		@ from NEON_00_15
1164	vadd.i64	q0,q15
1165	vld1.64	{d28},[r3,:64]!	@ K[i++]
1166	vsli.64	d24,d20,#50
1167	vsli.64	d25,d20,#46
1168	vmov	d29,d20
1169	vsli.64	d26,d20,#23
1170#if 16<16 && defined(__ARMEL__)
1171	vrev64.8	,
1172#endif
1173	veor	d25,d24
1174	vbsl	d29,d21,d22		@ Ch(e,f,g)
1175	vshr.u64	d24,d16,#28
1176	veor	d26,d25			@ Sigma1(e)
1177	vadd.i64	d27,d29,d23
1178	vshr.u64	d25,d16,#34
1179	vsli.64	d24,d16,#36
1180	vadd.i64	d27,d26
1181	vshr.u64	d26,d16,#39
1182	vadd.i64	d28,d0
1183	vsli.64	d25,d16,#30
1184	veor	d30,d16,d17
1185	vsli.64	d26,d16,#25
1186	veor	d23,d24,d25
1187	vadd.i64	d27,d28
1188	vbsl	d30,d18,d17		@ Maj(a,b,c)
1189	veor	d23,d26			@ Sigma0(a)
1190	vadd.i64	d19,d27
1191	vadd.i64	d30,d27
1192	@ vadd.i64	d23,d30
1193	vshr.u64	d24,d19,#14	@ 17
1194#if 17<16
1195	vld1.64	{d1},[r1]!	@ handles unaligned
1196#endif
1197	vshr.u64	d25,d19,#18
1198#if 17>0
1199	vadd.i64	d23,d30			@ h+=Maj from the past
1200#endif
1201	vshr.u64	d26,d19,#41
1202	vld1.64	{d28},[r3,:64]!	@ K[i++]
1203	vsli.64	d24,d19,#50
1204	vsli.64	d25,d19,#46
1205	vmov	d29,d19
1206	vsli.64	d26,d19,#23
1207#if 17<16 && defined(__ARMEL__)
1208	vrev64.8	,
1209#endif
1210	veor	d25,d24
1211	vbsl	d29,d20,d21		@ Ch(e,f,g)
1212	vshr.u64	d24,d23,#28
1213	veor	d26,d25			@ Sigma1(e)
1214	vadd.i64	d27,d29,d22
1215	vshr.u64	d25,d23,#34
1216	vsli.64	d24,d23,#36
1217	vadd.i64	d27,d26
1218	vshr.u64	d26,d23,#39
1219	vadd.i64	d28,d1
1220	vsli.64	d25,d23,#30
1221	veor	d30,d23,d16
1222	vsli.64	d26,d23,#25
1223	veor	d22,d24,d25
1224	vadd.i64	d27,d28
1225	vbsl	d30,d17,d16		@ Maj(a,b,c)
1226	veor	d22,d26			@ Sigma0(a)
1227	vadd.i64	d18,d27
1228	vadd.i64	d30,d27
1229	@ vadd.i64	d22,d30
1230	vshr.u64	q12,q0,#19
1231	vshr.u64	q13,q0,#61
1232	vadd.i64	d22,d30			@ h+=Maj from the past
1233	vshr.u64	q15,q0,#6
1234	vsli.64	q12,q0,#45
1235	vext.8	q14,q1,q2,#8	@ X[i+1]
1236	vsli.64	q13,q0,#3
1237	veor	q15,q12
1238	vshr.u64	q12,q14,#1
1239	veor	q15,q13				@ sigma1(X[i+14])
1240	vshr.u64	q13,q14,#8
1241	vadd.i64	q1,q15
1242	vshr.u64	q15,q14,#7
1243	vsli.64	q12,q14,#63
1244	vsli.64	q13,q14,#56
1245	vext.8	q14,q5,q6,#8	@ X[i+9]
1246	veor	q15,q12
1247	vshr.u64	d24,d18,#14		@ from NEON_00_15
1248	vadd.i64	q1,q14
1249	vshr.u64	d25,d18,#18		@ from NEON_00_15
1250	veor	q15,q13				@ sigma0(X[i+1])
1251	vshr.u64	d26,d18,#41		@ from NEON_00_15
1252	vadd.i64	q1,q15
1253	vld1.64	{d28},[r3,:64]!	@ K[i++]
1254	vsli.64	d24,d18,#50
1255	vsli.64	d25,d18,#46
1256	vmov	d29,d18
1257	vsli.64	d26,d18,#23
1258#if 18<16 && defined(__ARMEL__)
1259	vrev64.8	,
1260#endif
1261	veor	d25,d24
1262	vbsl	d29,d19,d20		@ Ch(e,f,g)
1263	vshr.u64	d24,d22,#28
1264	veor	d26,d25			@ Sigma1(e)
1265	vadd.i64	d27,d29,d21
1266	vshr.u64	d25,d22,#34
1267	vsli.64	d24,d22,#36
1268	vadd.i64	d27,d26
1269	vshr.u64	d26,d22,#39
1270	vadd.i64	d28,d2
1271	vsli.64	d25,d22,#30
1272	veor	d30,d22,d23
1273	vsli.64	d26,d22,#25
1274	veor	d21,d24,d25
1275	vadd.i64	d27,d28
1276	vbsl	d30,d16,d23		@ Maj(a,b,c)
1277	veor	d21,d26			@ Sigma0(a)
1278	vadd.i64	d17,d27
1279	vadd.i64	d30,d27
1280	@ vadd.i64	d21,d30
1281	vshr.u64	d24,d17,#14	@ 19
1282#if 19<16
1283	vld1.64	{d3},[r1]!	@ handles unaligned
1284#endif
1285	vshr.u64	d25,d17,#18
1286#if 19>0
1287	vadd.i64	d21,d30			@ h+=Maj from the past
1288#endif
1289	vshr.u64	d26,d17,#41
1290	vld1.64	{d28},[r3,:64]!	@ K[i++]
1291	vsli.64	d24,d17,#50
1292	vsli.64	d25,d17,#46
1293	vmov	d29,d17
1294	vsli.64	d26,d17,#23
1295#if 19<16 && defined(__ARMEL__)
1296	vrev64.8	,
1297#endif
1298	veor	d25,d24
1299	vbsl	d29,d18,d19		@ Ch(e,f,g)
1300	vshr.u64	d24,d21,#28
1301	veor	d26,d25			@ Sigma1(e)
1302	vadd.i64	d27,d29,d20
1303	vshr.u64	d25,d21,#34
1304	vsli.64	d24,d21,#36
1305	vadd.i64	d27,d26
1306	vshr.u64	d26,d21,#39
1307	vadd.i64	d28,d3
1308	vsli.64	d25,d21,#30
1309	veor	d30,d21,d22
1310	vsli.64	d26,d21,#25
1311	veor	d20,d24,d25
1312	vadd.i64	d27,d28
1313	vbsl	d30,d23,d22		@ Maj(a,b,c)
1314	veor	d20,d26			@ Sigma0(a)
1315	vadd.i64	d16,d27
1316	vadd.i64	d30,d27
1317	@ vadd.i64	d20,d30
1318	vshr.u64	q12,q1,#19
1319	vshr.u64	q13,q1,#61
1320	vadd.i64	d20,d30			@ h+=Maj from the past
1321	vshr.u64	q15,q1,#6
1322	vsli.64	q12,q1,#45
1323	vext.8	q14,q2,q3,#8	@ X[i+1]
1324	vsli.64	q13,q1,#3
1325	veor	q15,q12
1326	vshr.u64	q12,q14,#1
1327	veor	q15,q13				@ sigma1(X[i+14])
1328	vshr.u64	q13,q14,#8
1329	vadd.i64	q2,q15
1330	vshr.u64	q15,q14,#7
1331	vsli.64	q12,q14,#63
1332	vsli.64	q13,q14,#56
1333	vext.8	q14,q6,q7,#8	@ X[i+9]
1334	veor	q15,q12
1335	vshr.u64	d24,d16,#14		@ from NEON_00_15
1336	vadd.i64	q2,q14
1337	vshr.u64	d25,d16,#18		@ from NEON_00_15
1338	veor	q15,q13				@ sigma0(X[i+1])
1339	vshr.u64	d26,d16,#41		@ from NEON_00_15
1340	vadd.i64	q2,q15
1341	vld1.64	{d28},[r3,:64]!	@ K[i++]
1342	vsli.64	d24,d16,#50
1343	vsli.64	d25,d16,#46
1344	vmov	d29,d16
1345	vsli.64	d26,d16,#23
1346#if 20<16 && defined(__ARMEL__)
1347	vrev64.8	,
1348#endif
1349	veor	d25,d24
1350	vbsl	d29,d17,d18		@ Ch(e,f,g)
1351	vshr.u64	d24,d20,#28
1352	veor	d26,d25			@ Sigma1(e)
1353	vadd.i64	d27,d29,d19
1354	vshr.u64	d25,d20,#34
1355	vsli.64	d24,d20,#36
1356	vadd.i64	d27,d26
1357	vshr.u64	d26,d20,#39
1358	vadd.i64	d28,d4
1359	vsli.64	d25,d20,#30
1360	veor	d30,d20,d21
1361	vsli.64	d26,d20,#25
1362	veor	d19,d24,d25
1363	vadd.i64	d27,d28
1364	vbsl	d30,d22,d21		@ Maj(a,b,c)
1365	veor	d19,d26			@ Sigma0(a)
1366	vadd.i64	d23,d27
1367	vadd.i64	d30,d27
1368	@ vadd.i64	d19,d30
1369	vshr.u64	d24,d23,#14	@ 21
1370#if 21<16
1371	vld1.64	{d5},[r1]!	@ handles unaligned
1372#endif
1373	vshr.u64	d25,d23,#18
1374#if 21>0
1375	vadd.i64	d19,d30			@ h+=Maj from the past
1376#endif
1377	vshr.u64	d26,d23,#41
1378	vld1.64	{d28},[r3,:64]!	@ K[i++]
1379	vsli.64	d24,d23,#50
1380	vsli.64	d25,d23,#46
1381	vmov	d29,d23
1382	vsli.64	d26,d23,#23
1383#if 21<16 && defined(__ARMEL__)
1384	vrev64.8	,
1385#endif
1386	veor	d25,d24
1387	vbsl	d29,d16,d17		@ Ch(e,f,g)
1388	vshr.u64	d24,d19,#28
1389	veor	d26,d25			@ Sigma1(e)
1390	vadd.i64	d27,d29,d18
1391	vshr.u64	d25,d19,#34
1392	vsli.64	d24,d19,#36
1393	vadd.i64	d27,d26
1394	vshr.u64	d26,d19,#39
1395	vadd.i64	d28,d5
1396	vsli.64	d25,d19,#30
1397	veor	d30,d19,d20
1398	vsli.64	d26,d19,#25
1399	veor	d18,d24,d25
1400	vadd.i64	d27,d28
1401	vbsl	d30,d21,d20		@ Maj(a,b,c)
1402	veor	d18,d26			@ Sigma0(a)
1403	vadd.i64	d22,d27
1404	vadd.i64	d30,d27
1405	@ vadd.i64	d18,d30
1406	vshr.u64	q12,q2,#19
1407	vshr.u64	q13,q2,#61
1408	vadd.i64	d18,d30			@ h+=Maj from the past
1409	vshr.u64	q15,q2,#6
1410	vsli.64	q12,q2,#45
1411	vext.8	q14,q3,q4,#8	@ X[i+1]
1412	vsli.64	q13,q2,#3
1413	veor	q15,q12
1414	vshr.u64	q12,q14,#1
1415	veor	q15,q13				@ sigma1(X[i+14])
1416	vshr.u64	q13,q14,#8
1417	vadd.i64	q3,q15
1418	vshr.u64	q15,q14,#7
1419	vsli.64	q12,q14,#63
1420	vsli.64	q13,q14,#56
1421	vext.8	q14,q7,q0,#8	@ X[i+9]
1422	veor	q15,q12
1423	vshr.u64	d24,d22,#14		@ from NEON_00_15
1424	vadd.i64	q3,q14
1425	vshr.u64	d25,d22,#18		@ from NEON_00_15
1426	veor	q15,q13				@ sigma0(X[i+1])
1427	vshr.u64	d26,d22,#41		@ from NEON_00_15
1428	vadd.i64	q3,q15
1429	vld1.64	{d28},[r3,:64]!	@ K[i++]
1430	vsli.64	d24,d22,#50
1431	vsli.64	d25,d22,#46
1432	vmov	d29,d22
1433	vsli.64	d26,d22,#23
1434#if 22<16 && defined(__ARMEL__)
1435	vrev64.8	,
1436#endif
1437	veor	d25,d24
1438	vbsl	d29,d23,d16		@ Ch(e,f,g)
1439	vshr.u64	d24,d18,#28
1440	veor	d26,d25			@ Sigma1(e)
1441	vadd.i64	d27,d29,d17
1442	vshr.u64	d25,d18,#34
1443	vsli.64	d24,d18,#36
1444	vadd.i64	d27,d26
1445	vshr.u64	d26,d18,#39
1446	vadd.i64	d28,d6
1447	vsli.64	d25,d18,#30
1448	veor	d30,d18,d19
1449	vsli.64	d26,d18,#25
1450	veor	d17,d24,d25
1451	vadd.i64	d27,d28
1452	vbsl	d30,d20,d19		@ Maj(a,b,c)
1453	veor	d17,d26			@ Sigma0(a)
1454	vadd.i64	d21,d27
1455	vadd.i64	d30,d27
1456	@ vadd.i64	d17,d30
1457	vshr.u64	d24,d21,#14	@ 23
1458#if 23<16
1459	vld1.64	{d7},[r1]!	@ handles unaligned
1460#endif
1461	vshr.u64	d25,d21,#18
1462#if 23>0
1463	vadd.i64	d17,d30			@ h+=Maj from the past
1464#endif
1465	vshr.u64	d26,d21,#41
1466	vld1.64	{d28},[r3,:64]!	@ K[i++]
1467	vsli.64	d24,d21,#50
1468	vsli.64	d25,d21,#46
1469	vmov	d29,d21
1470	vsli.64	d26,d21,#23
1471#if 23<16 && defined(__ARMEL__)
1472	vrev64.8	,
1473#endif
1474	veor	d25,d24
1475	vbsl	d29,d22,d23		@ Ch(e,f,g)
1476	vshr.u64	d24,d17,#28
1477	veor	d26,d25			@ Sigma1(e)
1478	vadd.i64	d27,d29,d16
1479	vshr.u64	d25,d17,#34
1480	vsli.64	d24,d17,#36
1481	vadd.i64	d27,d26
1482	vshr.u64	d26,d17,#39
1483	vadd.i64	d28,d7
1484	vsli.64	d25,d17,#30
1485	veor	d30,d17,d18
1486	vsli.64	d26,d17,#25
1487	veor	d16,d24,d25
1488	vadd.i64	d27,d28
1489	vbsl	d30,d19,d18		@ Maj(a,b,c)
1490	veor	d16,d26			@ Sigma0(a)
1491	vadd.i64	d20,d27
1492	vadd.i64	d30,d27
1493	@ vadd.i64	d16,d30
1494	vshr.u64	q12,q3,#19
1495	vshr.u64	q13,q3,#61
1496	vadd.i64	d16,d30			@ h+=Maj from the past
1497	vshr.u64	q15,q3,#6
1498	vsli.64	q12,q3,#45
1499	vext.8	q14,q4,q5,#8	@ X[i+1]
1500	vsli.64	q13,q3,#3
1501	veor	q15,q12
1502	vshr.u64	q12,q14,#1
1503	veor	q15,q13				@ sigma1(X[i+14])
1504	vshr.u64	q13,q14,#8
1505	vadd.i64	q4,q15
1506	vshr.u64	q15,q14,#7
1507	vsli.64	q12,q14,#63
1508	vsli.64	q13,q14,#56
1509	vext.8	q14,q0,q1,#8	@ X[i+9]
1510	veor	q15,q12
1511	vshr.u64	d24,d20,#14		@ from NEON_00_15
1512	vadd.i64	q4,q14
1513	vshr.u64	d25,d20,#18		@ from NEON_00_15
1514	veor	q15,q13				@ sigma0(X[i+1])
1515	vshr.u64	d26,d20,#41		@ from NEON_00_15
1516	vadd.i64	q4,q15
1517	vld1.64	{d28},[r3,:64]!	@ K[i++]
1518	vsli.64	d24,d20,#50
1519	vsli.64	d25,d20,#46
1520	vmov	d29,d20
1521	vsli.64	d26,d20,#23
1522#if 24<16 && defined(__ARMEL__)
1523	vrev64.8	,
1524#endif
1525	veor	d25,d24
1526	vbsl	d29,d21,d22		@ Ch(e,f,g)
1527	vshr.u64	d24,d16,#28
1528	veor	d26,d25			@ Sigma1(e)
1529	vadd.i64	d27,d29,d23
1530	vshr.u64	d25,d16,#34
1531	vsli.64	d24,d16,#36
1532	vadd.i64	d27,d26
1533	vshr.u64	d26,d16,#39
1534	vadd.i64	d28,d8
1535	vsli.64	d25,d16,#30
1536	veor	d30,d16,d17
1537	vsli.64	d26,d16,#25
1538	veor	d23,d24,d25
1539	vadd.i64	d27,d28
1540	vbsl	d30,d18,d17		@ Maj(a,b,c)
1541	veor	d23,d26			@ Sigma0(a)
1542	vadd.i64	d19,d27
1543	vadd.i64	d30,d27
1544	@ vadd.i64	d23,d30
1545	vshr.u64	d24,d19,#14	@ 25
1546#if 25<16
1547	vld1.64	{d9},[r1]!	@ handles unaligned
1548#endif
1549	vshr.u64	d25,d19,#18
1550#if 25>0
1551	vadd.i64	d23,d30			@ h+=Maj from the past
1552#endif
1553	vshr.u64	d26,d19,#41
1554	vld1.64	{d28},[r3,:64]!	@ K[i++]
1555	vsli.64	d24,d19,#50
1556	vsli.64	d25,d19,#46
1557	vmov	d29,d19
1558	vsli.64	d26,d19,#23
1559#if 25<16 && defined(__ARMEL__)
1560	vrev64.8	,
1561#endif
1562	veor	d25,d24
1563	vbsl	d29,d20,d21		@ Ch(e,f,g)
1564	vshr.u64	d24,d23,#28
1565	veor	d26,d25			@ Sigma1(e)
1566	vadd.i64	d27,d29,d22
1567	vshr.u64	d25,d23,#34
1568	vsli.64	d24,d23,#36
1569	vadd.i64	d27,d26
1570	vshr.u64	d26,d23,#39
1571	vadd.i64	d28,d9
1572	vsli.64	d25,d23,#30
1573	veor	d30,d23,d16
1574	vsli.64	d26,d23,#25
1575	veor	d22,d24,d25
1576	vadd.i64	d27,d28
1577	vbsl	d30,d17,d16		@ Maj(a,b,c)
1578	veor	d22,d26			@ Sigma0(a)
1579	vadd.i64	d18,d27
1580	vadd.i64	d30,d27
1581	@ vadd.i64	d22,d30
1582	vshr.u64	q12,q4,#19
1583	vshr.u64	q13,q4,#61
1584	vadd.i64	d22,d30			@ h+=Maj from the past
1585	vshr.u64	q15,q4,#6
1586	vsli.64	q12,q4,#45
1587	vext.8	q14,q5,q6,#8	@ X[i+1]
1588	vsli.64	q13,q4,#3
1589	veor	q15,q12
1590	vshr.u64	q12,q14,#1
1591	veor	q15,q13				@ sigma1(X[i+14])
1592	vshr.u64	q13,q14,#8
1593	vadd.i64	q5,q15
1594	vshr.u64	q15,q14,#7
1595	vsli.64	q12,q14,#63
1596	vsli.64	q13,q14,#56
1597	vext.8	q14,q1,q2,#8	@ X[i+9]
1598	veor	q15,q12
1599	vshr.u64	d24,d18,#14		@ from NEON_00_15
1600	vadd.i64	q5,q14
1601	vshr.u64	d25,d18,#18		@ from NEON_00_15
1602	veor	q15,q13				@ sigma0(X[i+1])
1603	vshr.u64	d26,d18,#41		@ from NEON_00_15
1604	vadd.i64	q5,q15
1605	vld1.64	{d28},[r3,:64]!	@ K[i++]
1606	vsli.64	d24,d18,#50
1607	vsli.64	d25,d18,#46
1608	vmov	d29,d18
1609	vsli.64	d26,d18,#23
1610#if 26<16 && defined(__ARMEL__)
1611	vrev64.8	,
1612#endif
1613	veor	d25,d24
1614	vbsl	d29,d19,d20		@ Ch(e,f,g)
1615	vshr.u64	d24,d22,#28
1616	veor	d26,d25			@ Sigma1(e)
1617	vadd.i64	d27,d29,d21
1618	vshr.u64	d25,d22,#34
1619	vsli.64	d24,d22,#36
1620	vadd.i64	d27,d26
1621	vshr.u64	d26,d22,#39
1622	vadd.i64	d28,d10
1623	vsli.64	d25,d22,#30
1624	veor	d30,d22,d23
1625	vsli.64	d26,d22,#25
1626	veor	d21,d24,d25
1627	vadd.i64	d27,d28
1628	vbsl	d30,d16,d23		@ Maj(a,b,c)
1629	veor	d21,d26			@ Sigma0(a)
1630	vadd.i64	d17,d27
1631	vadd.i64	d30,d27
1632	@ vadd.i64	d21,d30
1633	vshr.u64	d24,d17,#14	@ 27
1634#if 27<16
1635	vld1.64	{d11},[r1]!	@ handles unaligned
1636#endif
1637	vshr.u64	d25,d17,#18
1638#if 27>0
1639	vadd.i64	d21,d30			@ h+=Maj from the past
1640#endif
1641	vshr.u64	d26,d17,#41
1642	vld1.64	{d28},[r3,:64]!	@ K[i++]
1643	vsli.64	d24,d17,#50
1644	vsli.64	d25,d17,#46
1645	vmov	d29,d17
1646	vsli.64	d26,d17,#23
1647#if 27<16 && defined(__ARMEL__)
1648	vrev64.8	,
1649#endif
1650	veor	d25,d24
1651	vbsl	d29,d18,d19		@ Ch(e,f,g)
1652	vshr.u64	d24,d21,#28
1653	veor	d26,d25			@ Sigma1(e)
1654	vadd.i64	d27,d29,d20
1655	vshr.u64	d25,d21,#34
1656	vsli.64	d24,d21,#36
1657	vadd.i64	d27,d26
1658	vshr.u64	d26,d21,#39
1659	vadd.i64	d28,d11
1660	vsli.64	d25,d21,#30
1661	veor	d30,d21,d22
1662	vsli.64	d26,d21,#25
1663	veor	d20,d24,d25
1664	vadd.i64	d27,d28
1665	vbsl	d30,d23,d22		@ Maj(a,b,c)
1666	veor	d20,d26			@ Sigma0(a)
1667	vadd.i64	d16,d27
1668	vadd.i64	d30,d27
1669	@ vadd.i64	d20,d30
1670	vshr.u64	q12,q5,#19
1671	vshr.u64	q13,q5,#61
1672	vadd.i64	d20,d30			@ h+=Maj from the past
1673	vshr.u64	q15,q5,#6
1674	vsli.64	q12,q5,#45
1675	vext.8	q14,q6,q7,#8	@ X[i+1]
1676	vsli.64	q13,q5,#3
1677	veor	q15,q12
1678	vshr.u64	q12,q14,#1
1679	veor	q15,q13				@ sigma1(X[i+14])
1680	vshr.u64	q13,q14,#8
1681	vadd.i64	q6,q15
1682	vshr.u64	q15,q14,#7
1683	vsli.64	q12,q14,#63
1684	vsli.64	q13,q14,#56
1685	vext.8	q14,q2,q3,#8	@ X[i+9]
1686	veor	q15,q12
1687	vshr.u64	d24,d16,#14		@ from NEON_00_15
1688	vadd.i64	q6,q14
1689	vshr.u64	d25,d16,#18		@ from NEON_00_15
1690	veor	q15,q13				@ sigma0(X[i+1])
1691	vshr.u64	d26,d16,#41		@ from NEON_00_15
1692	vadd.i64	q6,q15
1693	vld1.64	{d28},[r3,:64]!	@ K[i++]
1694	vsli.64	d24,d16,#50
1695	vsli.64	d25,d16,#46
1696	vmov	d29,d16
1697	vsli.64	d26,d16,#23
1698#if 28<16 && defined(__ARMEL__)
1699	vrev64.8	,
1700#endif
1701	veor	d25,d24
1702	vbsl	d29,d17,d18		@ Ch(e,f,g)
1703	vshr.u64	d24,d20,#28
1704	veor	d26,d25			@ Sigma1(e)
1705	vadd.i64	d27,d29,d19
1706	vshr.u64	d25,d20,#34
1707	vsli.64	d24,d20,#36
1708	vadd.i64	d27,d26
1709	vshr.u64	d26,d20,#39
1710	vadd.i64	d28,d12
1711	vsli.64	d25,d20,#30
1712	veor	d30,d20,d21
1713	vsli.64	d26,d20,#25
1714	veor	d19,d24,d25
1715	vadd.i64	d27,d28
1716	vbsl	d30,d22,d21		@ Maj(a,b,c)
1717	veor	d19,d26			@ Sigma0(a)
1718	vadd.i64	d23,d27
1719	vadd.i64	d30,d27
1720	@ vadd.i64	d19,d30
1721	vshr.u64	d24,d23,#14	@ 29
1722#if 29<16
1723	vld1.64	{d13},[r1]!	@ handles unaligned
1724#endif
1725	vshr.u64	d25,d23,#18
1726#if 29>0
1727	vadd.i64	d19,d30			@ h+=Maj from the past
1728#endif
1729	vshr.u64	d26,d23,#41
1730	vld1.64	{d28},[r3,:64]!	@ K[i++]
1731	vsli.64	d24,d23,#50
1732	vsli.64	d25,d23,#46
1733	vmov	d29,d23
1734	vsli.64	d26,d23,#23
1735#if 29<16 && defined(__ARMEL__)
1736	vrev64.8	,
1737#endif
1738	veor	d25,d24
1739	vbsl	d29,d16,d17		@ Ch(e,f,g)
1740	vshr.u64	d24,d19,#28
1741	veor	d26,d25			@ Sigma1(e)
1742	vadd.i64	d27,d29,d18
1743	vshr.u64	d25,d19,#34
1744	vsli.64	d24,d19,#36
1745	vadd.i64	d27,d26
1746	vshr.u64	d26,d19,#39
1747	vadd.i64	d28,d13
1748	vsli.64	d25,d19,#30
1749	veor	d30,d19,d20
1750	vsli.64	d26,d19,#25
1751	veor	d18,d24,d25
1752	vadd.i64	d27,d28
1753	vbsl	d30,d21,d20		@ Maj(a,b,c)
1754	veor	d18,d26			@ Sigma0(a)
1755	vadd.i64	d22,d27
1756	vadd.i64	d30,d27
1757	@ vadd.i64	d18,d30
1758	vshr.u64	q12,q6,#19
1759	vshr.u64	q13,q6,#61
1760	vadd.i64	d18,d30			@ h+=Maj from the past
1761	vshr.u64	q15,q6,#6
1762	vsli.64	q12,q6,#45
1763	vext.8	q14,q7,q0,#8	@ X[i+1]
1764	vsli.64	q13,q6,#3
1765	veor	q15,q12
1766	vshr.u64	q12,q14,#1
1767	veor	q15,q13				@ sigma1(X[i+14])
1768	vshr.u64	q13,q14,#8
1769	vadd.i64	q7,q15
1770	vshr.u64	q15,q14,#7
1771	vsli.64	q12,q14,#63
1772	vsli.64	q13,q14,#56
1773	vext.8	q14,q3,q4,#8	@ X[i+9]
1774	veor	q15,q12
1775	vshr.u64	d24,d22,#14		@ from NEON_00_15
1776	vadd.i64	q7,q14
1777	vshr.u64	d25,d22,#18		@ from NEON_00_15
1778	veor	q15,q13				@ sigma0(X[i+1])
1779	vshr.u64	d26,d22,#41		@ from NEON_00_15
1780	vadd.i64	q7,q15
1781	vld1.64	{d28},[r3,:64]!	@ K[i++]
1782	vsli.64	d24,d22,#50
1783	vsli.64	d25,d22,#46
1784	vmov	d29,d22
1785	vsli.64	d26,d22,#23
1786#if 30<16 && defined(__ARMEL__)
1787	vrev64.8	,
1788#endif
1789	veor	d25,d24
1790	vbsl	d29,d23,d16		@ Ch(e,f,g)
1791	vshr.u64	d24,d18,#28
1792	veor	d26,d25			@ Sigma1(e)
1793	vadd.i64	d27,d29,d17
1794	vshr.u64	d25,d18,#34
1795	vsli.64	d24,d18,#36
1796	vadd.i64	d27,d26
1797	vshr.u64	d26,d18,#39
1798	vadd.i64	d28,d14
1799	vsli.64	d25,d18,#30
1800	veor	d30,d18,d19
1801	vsli.64	d26,d18,#25
1802	veor	d17,d24,d25
1803	vadd.i64	d27,d28
1804	vbsl	d30,d20,d19		@ Maj(a,b,c)
1805	veor	d17,d26			@ Sigma0(a)
1806	vadd.i64	d21,d27
1807	vadd.i64	d30,d27
1808	@ vadd.i64	d17,d30
1809	vshr.u64	d24,d21,#14	@ 31
1810#if 31<16
1811	vld1.64	{d15},[r1]!	@ handles unaligned
1812#endif
1813	vshr.u64	d25,d21,#18
1814#if 31>0
1815	vadd.i64	d17,d30			@ h+=Maj from the past
1816#endif
1817	vshr.u64	d26,d21,#41
1818	vld1.64	{d28},[r3,:64]!	@ K[i++]
1819	vsli.64	d24,d21,#50
1820	vsli.64	d25,d21,#46
1821	vmov	d29,d21
1822	vsli.64	d26,d21,#23
1823#if 31<16 && defined(__ARMEL__)
1824	vrev64.8	,
1825#endif
1826	veor	d25,d24
1827	vbsl	d29,d22,d23		@ Ch(e,f,g)
1828	vshr.u64	d24,d17,#28
1829	veor	d26,d25			@ Sigma1(e)
1830	vadd.i64	d27,d29,d16
1831	vshr.u64	d25,d17,#34
1832	vsli.64	d24,d17,#36
1833	vadd.i64	d27,d26
1834	vshr.u64	d26,d17,#39
1835	vadd.i64	d28,d15
1836	vsli.64	d25,d17,#30
1837	veor	d30,d17,d18
1838	vsli.64	d26,d17,#25
1839	veor	d16,d24,d25
1840	vadd.i64	d27,d28
1841	vbsl	d30,d19,d18		@ Maj(a,b,c)
1842	veor	d16,d26			@ Sigma0(a)
1843	vadd.i64	d20,d27
1844	vadd.i64	d30,d27
1845	@ vadd.i64	d16,d30
1846	bne	.L16_79_neon
1847
1848	vadd.i64	d16,d30		@ h+=Maj from the past
1849	vldmia	r0,{d24,d25,d26,d27,d28,d29,d30,d31}	@ load context to temp
1850	vadd.i64	q8,q12		@ vectorized accumulate
1851	vadd.i64	q9,q13
1852	vadd.i64	q10,q14
1853	vadd.i64	q11,q15
1854	vstmia	r0,{d16,d17,d18,d19,d20,d21,d22,d23}	@ save context
1855	teq	r1,r2
1856	sub	r3,#640	@ rewind K512
1857	bne	.Loop_neon
1858	vldmia  sp!,{d8-d15}
1859	bx	lr				@ .word	0xe12fff1e
1860.size	cryptogams_sha512_block_data_order_neon,.-cryptogams_sha512_block_data_order_neon
1861#endif
1862