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