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