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