xref: /freebsd/sys/contrib/openzfs/module/icp/asm-arm/sha2/sha512-armv7.S (revision 2e3507c25e42292b45a5482e116d278f5515d04d)
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#if __ARM_ARCH__ >= 7
497.arch	armv7-a
498.fpu	neon
499
500.globl	zfs_sha512_block_neon
501.type	zfs_sha512_block_neon,%function
502.align	4
503zfs_sha512_block_neon:
504.LNEON:
505	dmb	@ errata #451034 on early Cortex A8
506	add	r2,r1,r2,lsl#7	@ len to point at the end of inp
507	adr	r3,K512
508	VFP_ABI_PUSH
509	vldmia	r0,{d16,d17,d18,d19,d20,d21,d22,d23}		@ load context
510.Loop_neon:
511	vshr.u64	d24,d20,#14	@ 0
512#if 0<16
513	vld1.64	{d0},[r1]!	@ handles unaligned
514#endif
515	vshr.u64	d25,d20,#18
516#if 0>0
517	vadd.i64	d16,d30			@ h+=Maj from the past
518#endif
519	vshr.u64	d26,d20,#41
520	vld1.64	{d28},[r3,:64]!	@ K[i++]
521	vsli.64	d24,d20,#50
522	vsli.64	d25,d20,#46
523	vmov	d29,d20
524	vsli.64	d26,d20,#23
525#if 0<16 && defined(__ARMEL__)
526	vrev64.8	d0,d0
527#endif
528	veor	d25,d24
529	vbsl	d29,d21,d22		@ Ch(e,f,g)
530	vshr.u64	d24,d16,#28
531	veor	d26,d25			@ Sigma1(e)
532	vadd.i64	d27,d29,d23
533	vshr.u64	d25,d16,#34
534	vsli.64	d24,d16,#36
535	vadd.i64	d27,d26
536	vshr.u64	d26,d16,#39
537	vadd.i64	d28,d0
538	vsli.64	d25,d16,#30
539	veor	d30,d16,d17
540	vsli.64	d26,d16,#25
541	veor	d23,d24,d25
542	vadd.i64	d27,d28
543	vbsl	d30,d18,d17		@ Maj(a,b,c)
544	veor	d23,d26			@ Sigma0(a)
545	vadd.i64	d19,d27
546	vadd.i64	d30,d27
547	@ vadd.i64	d23,d30
548	vshr.u64	d24,d19,#14	@ 1
549#if 1<16
550	vld1.64	{d1},[r1]!	@ handles unaligned
551#endif
552	vshr.u64	d25,d19,#18
553#if 1>0
554	vadd.i64	d23,d30			@ h+=Maj from the past
555#endif
556	vshr.u64	d26,d19,#41
557	vld1.64	{d28},[r3,:64]!	@ K[i++]
558	vsli.64	d24,d19,#50
559	vsli.64	d25,d19,#46
560	vmov	d29,d19
561	vsli.64	d26,d19,#23
562#if 1<16 && defined(__ARMEL__)
563	vrev64.8	d1,d1
564#endif
565	veor	d25,d24
566	vbsl	d29,d20,d21		@ Ch(e,f,g)
567	vshr.u64	d24,d23,#28
568	veor	d26,d25			@ Sigma1(e)
569	vadd.i64	d27,d29,d22
570	vshr.u64	d25,d23,#34
571	vsli.64	d24,d23,#36
572	vadd.i64	d27,d26
573	vshr.u64	d26,d23,#39
574	vadd.i64	d28,d1
575	vsli.64	d25,d23,#30
576	veor	d30,d23,d16
577	vsli.64	d26,d23,#25
578	veor	d22,d24,d25
579	vadd.i64	d27,d28
580	vbsl	d30,d17,d16		@ Maj(a,b,c)
581	veor	d22,d26			@ Sigma0(a)
582	vadd.i64	d18,d27
583	vadd.i64	d30,d27
584	@ vadd.i64	d22,d30
585	vshr.u64	d24,d18,#14	@ 2
586#if 2<16
587	vld1.64	{d2},[r1]!	@ handles unaligned
588#endif
589	vshr.u64	d25,d18,#18
590#if 2>0
591	vadd.i64	d22,d30			@ h+=Maj from the past
592#endif
593	vshr.u64	d26,d18,#41
594	vld1.64	{d28},[r3,:64]!	@ K[i++]
595	vsli.64	d24,d18,#50
596	vsli.64	d25,d18,#46
597	vmov	d29,d18
598	vsli.64	d26,d18,#23
599#if 2<16 && defined(__ARMEL__)
600	vrev64.8	d2,d2
601#endif
602	veor	d25,d24
603	vbsl	d29,d19,d20		@ Ch(e,f,g)
604	vshr.u64	d24,d22,#28
605	veor	d26,d25			@ Sigma1(e)
606	vadd.i64	d27,d29,d21
607	vshr.u64	d25,d22,#34
608	vsli.64	d24,d22,#36
609	vadd.i64	d27,d26
610	vshr.u64	d26,d22,#39
611	vadd.i64	d28,d2
612	vsli.64	d25,d22,#30
613	veor	d30,d22,d23
614	vsli.64	d26,d22,#25
615	veor	d21,d24,d25
616	vadd.i64	d27,d28
617	vbsl	d30,d16,d23		@ Maj(a,b,c)
618	veor	d21,d26			@ Sigma0(a)
619	vadd.i64	d17,d27
620	vadd.i64	d30,d27
621	@ vadd.i64	d21,d30
622	vshr.u64	d24,d17,#14	@ 3
623#if 3<16
624	vld1.64	{d3},[r1]!	@ handles unaligned
625#endif
626	vshr.u64	d25,d17,#18
627#if 3>0
628	vadd.i64	d21,d30			@ h+=Maj from the past
629#endif
630	vshr.u64	d26,d17,#41
631	vld1.64	{d28},[r3,:64]!	@ K[i++]
632	vsli.64	d24,d17,#50
633	vsli.64	d25,d17,#46
634	vmov	d29,d17
635	vsli.64	d26,d17,#23
636#if 3<16 && defined(__ARMEL__)
637	vrev64.8	d3,d3
638#endif
639	veor	d25,d24
640	vbsl	d29,d18,d19		@ Ch(e,f,g)
641	vshr.u64	d24,d21,#28
642	veor	d26,d25			@ Sigma1(e)
643	vadd.i64	d27,d29,d20
644	vshr.u64	d25,d21,#34
645	vsli.64	d24,d21,#36
646	vadd.i64	d27,d26
647	vshr.u64	d26,d21,#39
648	vadd.i64	d28,d3
649	vsli.64	d25,d21,#30
650	veor	d30,d21,d22
651	vsli.64	d26,d21,#25
652	veor	d20,d24,d25
653	vadd.i64	d27,d28
654	vbsl	d30,d23,d22		@ Maj(a,b,c)
655	veor	d20,d26			@ Sigma0(a)
656	vadd.i64	d16,d27
657	vadd.i64	d30,d27
658	@ vadd.i64	d20,d30
659	vshr.u64	d24,d16,#14	@ 4
660#if 4<16
661	vld1.64	{d4},[r1]!	@ handles unaligned
662#endif
663	vshr.u64	d25,d16,#18
664#if 4>0
665	vadd.i64	d20,d30			@ h+=Maj from the past
666#endif
667	vshr.u64	d26,d16,#41
668	vld1.64	{d28},[r3,:64]!	@ K[i++]
669	vsli.64	d24,d16,#50
670	vsli.64	d25,d16,#46
671	vmov	d29,d16
672	vsli.64	d26,d16,#23
673#if 4<16 && defined(__ARMEL__)
674	vrev64.8	d4,d4
675#endif
676	veor	d25,d24
677	vbsl	d29,d17,d18		@ Ch(e,f,g)
678	vshr.u64	d24,d20,#28
679	veor	d26,d25			@ Sigma1(e)
680	vadd.i64	d27,d29,d19
681	vshr.u64	d25,d20,#34
682	vsli.64	d24,d20,#36
683	vadd.i64	d27,d26
684	vshr.u64	d26,d20,#39
685	vadd.i64	d28,d4
686	vsli.64	d25,d20,#30
687	veor	d30,d20,d21
688	vsli.64	d26,d20,#25
689	veor	d19,d24,d25
690	vadd.i64	d27,d28
691	vbsl	d30,d22,d21		@ Maj(a,b,c)
692	veor	d19,d26			@ Sigma0(a)
693	vadd.i64	d23,d27
694	vadd.i64	d30,d27
695	@ vadd.i64	d19,d30
696	vshr.u64	d24,d23,#14	@ 5
697#if 5<16
698	vld1.64	{d5},[r1]!	@ handles unaligned
699#endif
700	vshr.u64	d25,d23,#18
701#if 5>0
702	vadd.i64	d19,d30			@ h+=Maj from the past
703#endif
704	vshr.u64	d26,d23,#41
705	vld1.64	{d28},[r3,:64]!	@ K[i++]
706	vsli.64	d24,d23,#50
707	vsli.64	d25,d23,#46
708	vmov	d29,d23
709	vsli.64	d26,d23,#23
710#if 5<16 && defined(__ARMEL__)
711	vrev64.8	d5,d5
712#endif
713	veor	d25,d24
714	vbsl	d29,d16,d17		@ Ch(e,f,g)
715	vshr.u64	d24,d19,#28
716	veor	d26,d25			@ Sigma1(e)
717	vadd.i64	d27,d29,d18
718	vshr.u64	d25,d19,#34
719	vsli.64	d24,d19,#36
720	vadd.i64	d27,d26
721	vshr.u64	d26,d19,#39
722	vadd.i64	d28,d5
723	vsli.64	d25,d19,#30
724	veor	d30,d19,d20
725	vsli.64	d26,d19,#25
726	veor	d18,d24,d25
727	vadd.i64	d27,d28
728	vbsl	d30,d21,d20		@ Maj(a,b,c)
729	veor	d18,d26			@ Sigma0(a)
730	vadd.i64	d22,d27
731	vadd.i64	d30,d27
732	@ vadd.i64	d18,d30
733	vshr.u64	d24,d22,#14	@ 6
734#if 6<16
735	vld1.64	{d6},[r1]!	@ handles unaligned
736#endif
737	vshr.u64	d25,d22,#18
738#if 6>0
739	vadd.i64	d18,d30			@ h+=Maj from the past
740#endif
741	vshr.u64	d26,d22,#41
742	vld1.64	{d28},[r3,:64]!	@ K[i++]
743	vsli.64	d24,d22,#50
744	vsli.64	d25,d22,#46
745	vmov	d29,d22
746	vsli.64	d26,d22,#23
747#if 6<16 && defined(__ARMEL__)
748	vrev64.8	d6,d6
749#endif
750	veor	d25,d24
751	vbsl	d29,d23,d16		@ Ch(e,f,g)
752	vshr.u64	d24,d18,#28
753	veor	d26,d25			@ Sigma1(e)
754	vadd.i64	d27,d29,d17
755	vshr.u64	d25,d18,#34
756	vsli.64	d24,d18,#36
757	vadd.i64	d27,d26
758	vshr.u64	d26,d18,#39
759	vadd.i64	d28,d6
760	vsli.64	d25,d18,#30
761	veor	d30,d18,d19
762	vsli.64	d26,d18,#25
763	veor	d17,d24,d25
764	vadd.i64	d27,d28
765	vbsl	d30,d20,d19		@ Maj(a,b,c)
766	veor	d17,d26			@ Sigma0(a)
767	vadd.i64	d21,d27
768	vadd.i64	d30,d27
769	@ vadd.i64	d17,d30
770	vshr.u64	d24,d21,#14	@ 7
771#if 7<16
772	vld1.64	{d7},[r1]!	@ handles unaligned
773#endif
774	vshr.u64	d25,d21,#18
775#if 7>0
776	vadd.i64	d17,d30			@ h+=Maj from the past
777#endif
778	vshr.u64	d26,d21,#41
779	vld1.64	{d28},[r3,:64]!	@ K[i++]
780	vsli.64	d24,d21,#50
781	vsli.64	d25,d21,#46
782	vmov	d29,d21
783	vsli.64	d26,d21,#23
784#if 7<16 && defined(__ARMEL__)
785	vrev64.8	d7,d7
786#endif
787	veor	d25,d24
788	vbsl	d29,d22,d23		@ Ch(e,f,g)
789	vshr.u64	d24,d17,#28
790	veor	d26,d25			@ Sigma1(e)
791	vadd.i64	d27,d29,d16
792	vshr.u64	d25,d17,#34
793	vsli.64	d24,d17,#36
794	vadd.i64	d27,d26
795	vshr.u64	d26,d17,#39
796	vadd.i64	d28,d7
797	vsli.64	d25,d17,#30
798	veor	d30,d17,d18
799	vsli.64	d26,d17,#25
800	veor	d16,d24,d25
801	vadd.i64	d27,d28
802	vbsl	d30,d19,d18		@ Maj(a,b,c)
803	veor	d16,d26			@ Sigma0(a)
804	vadd.i64	d20,d27
805	vadd.i64	d30,d27
806	@ vadd.i64	d16,d30
807	vshr.u64	d24,d20,#14	@ 8
808#if 8<16
809	vld1.64	{d8},[r1]!	@ handles unaligned
810#endif
811	vshr.u64	d25,d20,#18
812#if 8>0
813	vadd.i64	d16,d30			@ h+=Maj from the past
814#endif
815	vshr.u64	d26,d20,#41
816	vld1.64	{d28},[r3,:64]!	@ K[i++]
817	vsli.64	d24,d20,#50
818	vsli.64	d25,d20,#46
819	vmov	d29,d20
820	vsli.64	d26,d20,#23
821#if 8<16 && defined(__ARMEL__)
822	vrev64.8	d8,d8
823#endif
824	veor	d25,d24
825	vbsl	d29,d21,d22		@ Ch(e,f,g)
826	vshr.u64	d24,d16,#28
827	veor	d26,d25			@ Sigma1(e)
828	vadd.i64	d27,d29,d23
829	vshr.u64	d25,d16,#34
830	vsli.64	d24,d16,#36
831	vadd.i64	d27,d26
832	vshr.u64	d26,d16,#39
833	vadd.i64	d28,d8
834	vsli.64	d25,d16,#30
835	veor	d30,d16,d17
836	vsli.64	d26,d16,#25
837	veor	d23,d24,d25
838	vadd.i64	d27,d28
839	vbsl	d30,d18,d17		@ Maj(a,b,c)
840	veor	d23,d26			@ Sigma0(a)
841	vadd.i64	d19,d27
842	vadd.i64	d30,d27
843	@ vadd.i64	d23,d30
844	vshr.u64	d24,d19,#14	@ 9
845#if 9<16
846	vld1.64	{d9},[r1]!	@ handles unaligned
847#endif
848	vshr.u64	d25,d19,#18
849#if 9>0
850	vadd.i64	d23,d30			@ h+=Maj from the past
851#endif
852	vshr.u64	d26,d19,#41
853	vld1.64	{d28},[r3,:64]!	@ K[i++]
854	vsli.64	d24,d19,#50
855	vsli.64	d25,d19,#46
856	vmov	d29,d19
857	vsli.64	d26,d19,#23
858#if 9<16 && defined(__ARMEL__)
859	vrev64.8	d9,d9
860#endif
861	veor	d25,d24
862	vbsl	d29,d20,d21		@ Ch(e,f,g)
863	vshr.u64	d24,d23,#28
864	veor	d26,d25			@ Sigma1(e)
865	vadd.i64	d27,d29,d22
866	vshr.u64	d25,d23,#34
867	vsli.64	d24,d23,#36
868	vadd.i64	d27,d26
869	vshr.u64	d26,d23,#39
870	vadd.i64	d28,d9
871	vsli.64	d25,d23,#30
872	veor	d30,d23,d16
873	vsli.64	d26,d23,#25
874	veor	d22,d24,d25
875	vadd.i64	d27,d28
876	vbsl	d30,d17,d16		@ Maj(a,b,c)
877	veor	d22,d26			@ Sigma0(a)
878	vadd.i64	d18,d27
879	vadd.i64	d30,d27
880	@ vadd.i64	d22,d30
881	vshr.u64	d24,d18,#14	@ 10
882#if 10<16
883	vld1.64	{d10},[r1]!	@ handles unaligned
884#endif
885	vshr.u64	d25,d18,#18
886#if 10>0
887	vadd.i64	d22,d30			@ h+=Maj from the past
888#endif
889	vshr.u64	d26,d18,#41
890	vld1.64	{d28},[r3,:64]!	@ K[i++]
891	vsli.64	d24,d18,#50
892	vsli.64	d25,d18,#46
893	vmov	d29,d18
894	vsli.64	d26,d18,#23
895#if 10<16 && defined(__ARMEL__)
896	vrev64.8	d10,d10
897#endif
898	veor	d25,d24
899	vbsl	d29,d19,d20		@ Ch(e,f,g)
900	vshr.u64	d24,d22,#28
901	veor	d26,d25			@ Sigma1(e)
902	vadd.i64	d27,d29,d21
903	vshr.u64	d25,d22,#34
904	vsli.64	d24,d22,#36
905	vadd.i64	d27,d26
906	vshr.u64	d26,d22,#39
907	vadd.i64	d28,d10
908	vsli.64	d25,d22,#30
909	veor	d30,d22,d23
910	vsli.64	d26,d22,#25
911	veor	d21,d24,d25
912	vadd.i64	d27,d28
913	vbsl	d30,d16,d23		@ Maj(a,b,c)
914	veor	d21,d26			@ Sigma0(a)
915	vadd.i64	d17,d27
916	vadd.i64	d30,d27
917	@ vadd.i64	d21,d30
918	vshr.u64	d24,d17,#14	@ 11
919#if 11<16
920	vld1.64	{d11},[r1]!	@ handles unaligned
921#endif
922	vshr.u64	d25,d17,#18
923#if 11>0
924	vadd.i64	d21,d30			@ h+=Maj from the past
925#endif
926	vshr.u64	d26,d17,#41
927	vld1.64	{d28},[r3,:64]!	@ K[i++]
928	vsli.64	d24,d17,#50
929	vsli.64	d25,d17,#46
930	vmov	d29,d17
931	vsli.64	d26,d17,#23
932#if 11<16 && defined(__ARMEL__)
933	vrev64.8	d11,d11
934#endif
935	veor	d25,d24
936	vbsl	d29,d18,d19		@ Ch(e,f,g)
937	vshr.u64	d24,d21,#28
938	veor	d26,d25			@ Sigma1(e)
939	vadd.i64	d27,d29,d20
940	vshr.u64	d25,d21,#34
941	vsli.64	d24,d21,#36
942	vadd.i64	d27,d26
943	vshr.u64	d26,d21,#39
944	vadd.i64	d28,d11
945	vsli.64	d25,d21,#30
946	veor	d30,d21,d22
947	vsli.64	d26,d21,#25
948	veor	d20,d24,d25
949	vadd.i64	d27,d28
950	vbsl	d30,d23,d22		@ Maj(a,b,c)
951	veor	d20,d26			@ Sigma0(a)
952	vadd.i64	d16,d27
953	vadd.i64	d30,d27
954	@ vadd.i64	d20,d30
955	vshr.u64	d24,d16,#14	@ 12
956#if 12<16
957	vld1.64	{d12},[r1]!	@ handles unaligned
958#endif
959	vshr.u64	d25,d16,#18
960#if 12>0
961	vadd.i64	d20,d30			@ h+=Maj from the past
962#endif
963	vshr.u64	d26,d16,#41
964	vld1.64	{d28},[r3,:64]!	@ K[i++]
965	vsli.64	d24,d16,#50
966	vsli.64	d25,d16,#46
967	vmov	d29,d16
968	vsli.64	d26,d16,#23
969#if 12<16 && defined(__ARMEL__)
970	vrev64.8	d12,d12
971#endif
972	veor	d25,d24
973	vbsl	d29,d17,d18		@ Ch(e,f,g)
974	vshr.u64	d24,d20,#28
975	veor	d26,d25			@ Sigma1(e)
976	vadd.i64	d27,d29,d19
977	vshr.u64	d25,d20,#34
978	vsli.64	d24,d20,#36
979	vadd.i64	d27,d26
980	vshr.u64	d26,d20,#39
981	vadd.i64	d28,d12
982	vsli.64	d25,d20,#30
983	veor	d30,d20,d21
984	vsli.64	d26,d20,#25
985	veor	d19,d24,d25
986	vadd.i64	d27,d28
987	vbsl	d30,d22,d21		@ Maj(a,b,c)
988	veor	d19,d26			@ Sigma0(a)
989	vadd.i64	d23,d27
990	vadd.i64	d30,d27
991	@ vadd.i64	d19,d30
992	vshr.u64	d24,d23,#14	@ 13
993#if 13<16
994	vld1.64	{d13},[r1]!	@ handles unaligned
995#endif
996	vshr.u64	d25,d23,#18
997#if 13>0
998	vadd.i64	d19,d30			@ h+=Maj from the past
999#endif
1000	vshr.u64	d26,d23,#41
1001	vld1.64	{d28},[r3,:64]!	@ K[i++]
1002	vsli.64	d24,d23,#50
1003	vsli.64	d25,d23,#46
1004	vmov	d29,d23
1005	vsli.64	d26,d23,#23
1006#if 13<16 && defined(__ARMEL__)
1007	vrev64.8	d13,d13
1008#endif
1009	veor	d25,d24
1010	vbsl	d29,d16,d17		@ Ch(e,f,g)
1011	vshr.u64	d24,d19,#28
1012	veor	d26,d25			@ Sigma1(e)
1013	vadd.i64	d27,d29,d18
1014	vshr.u64	d25,d19,#34
1015	vsli.64	d24,d19,#36
1016	vadd.i64	d27,d26
1017	vshr.u64	d26,d19,#39
1018	vadd.i64	d28,d13
1019	vsli.64	d25,d19,#30
1020	veor	d30,d19,d20
1021	vsli.64	d26,d19,#25
1022	veor	d18,d24,d25
1023	vadd.i64	d27,d28
1024	vbsl	d30,d21,d20		@ Maj(a,b,c)
1025	veor	d18,d26			@ Sigma0(a)
1026	vadd.i64	d22,d27
1027	vadd.i64	d30,d27
1028	@ vadd.i64	d18,d30
1029	vshr.u64	d24,d22,#14	@ 14
1030#if 14<16
1031	vld1.64	{d14},[r1]!	@ handles unaligned
1032#endif
1033	vshr.u64	d25,d22,#18
1034#if 14>0
1035	vadd.i64	d18,d30			@ h+=Maj from the past
1036#endif
1037	vshr.u64	d26,d22,#41
1038	vld1.64	{d28},[r3,:64]!	@ K[i++]
1039	vsli.64	d24,d22,#50
1040	vsli.64	d25,d22,#46
1041	vmov	d29,d22
1042	vsli.64	d26,d22,#23
1043#if 14<16 && defined(__ARMEL__)
1044	vrev64.8	d14,d14
1045#endif
1046	veor	d25,d24
1047	vbsl	d29,d23,d16		@ Ch(e,f,g)
1048	vshr.u64	d24,d18,#28
1049	veor	d26,d25			@ Sigma1(e)
1050	vadd.i64	d27,d29,d17
1051	vshr.u64	d25,d18,#34
1052	vsli.64	d24,d18,#36
1053	vadd.i64	d27,d26
1054	vshr.u64	d26,d18,#39
1055	vadd.i64	d28,d14
1056	vsli.64	d25,d18,#30
1057	veor	d30,d18,d19
1058	vsli.64	d26,d18,#25
1059	veor	d17,d24,d25
1060	vadd.i64	d27,d28
1061	vbsl	d30,d20,d19		@ Maj(a,b,c)
1062	veor	d17,d26			@ Sigma0(a)
1063	vadd.i64	d21,d27
1064	vadd.i64	d30,d27
1065	@ vadd.i64	d17,d30
1066	vshr.u64	d24,d21,#14	@ 15
1067#if 15<16
1068	vld1.64	{d15},[r1]!	@ handles unaligned
1069#endif
1070	vshr.u64	d25,d21,#18
1071#if 15>0
1072	vadd.i64	d17,d30			@ h+=Maj from the past
1073#endif
1074	vshr.u64	d26,d21,#41
1075	vld1.64	{d28},[r3,:64]!	@ K[i++]
1076	vsli.64	d24,d21,#50
1077	vsli.64	d25,d21,#46
1078	vmov	d29,d21
1079	vsli.64	d26,d21,#23
1080#if 15<16 && defined(__ARMEL__)
1081	vrev64.8	d15,d15
1082#endif
1083	veor	d25,d24
1084	vbsl	d29,d22,d23		@ Ch(e,f,g)
1085	vshr.u64	d24,d17,#28
1086	veor	d26,d25			@ Sigma1(e)
1087	vadd.i64	d27,d29,d16
1088	vshr.u64	d25,d17,#34
1089	vsli.64	d24,d17,#36
1090	vadd.i64	d27,d26
1091	vshr.u64	d26,d17,#39
1092	vadd.i64	d28,d15
1093	vsli.64	d25,d17,#30
1094	veor	d30,d17,d18
1095	vsli.64	d26,d17,#25
1096	veor	d16,d24,d25
1097	vadd.i64	d27,d28
1098	vbsl	d30,d19,d18		@ Maj(a,b,c)
1099	veor	d16,d26			@ Sigma0(a)
1100	vadd.i64	d20,d27
1101	vadd.i64	d30,d27
1102	@ vadd.i64	d16,d30
1103	mov	r12,#4
1104.L16_79_neon:
1105	subs	r12,#1
1106	vshr.u64	q12,q7,#19
1107	vshr.u64	q13,q7,#61
1108	vadd.i64	d16,d30			@ h+=Maj from the past
1109	vshr.u64	q15,q7,#6
1110	vsli.64	q12,q7,#45
1111	vext.8	q14,q0,q1,#8	@ X[i+1]
1112	vsli.64	q13,q7,#3
1113	veor	q15,q12
1114	vshr.u64	q12,q14,#1
1115	veor	q15,q13				@ sigma1(X[i+14])
1116	vshr.u64	q13,q14,#8
1117	vadd.i64	q0,q15
1118	vshr.u64	q15,q14,#7
1119	vsli.64	q12,q14,#63
1120	vsli.64	q13,q14,#56
1121	vext.8	q14,q4,q5,#8	@ X[i+9]
1122	veor	q15,q12
1123	vshr.u64	d24,d20,#14		@ from NEON_00_15
1124	vadd.i64	q0,q14
1125	vshr.u64	d25,d20,#18		@ from NEON_00_15
1126	veor	q15,q13				@ sigma0(X[i+1])
1127	vshr.u64	d26,d20,#41		@ from NEON_00_15
1128	vadd.i64	q0,q15
1129	vld1.64	{d28},[r3,:64]!	@ K[i++]
1130	vsli.64	d24,d20,#50
1131	vsli.64	d25,d20,#46
1132	vmov	d29,d20
1133	vsli.64	d26,d20,#23
1134#if 16<16 && defined(__ARMEL__)
1135	vrev64.8	,
1136#endif
1137	veor	d25,d24
1138	vbsl	d29,d21,d22		@ Ch(e,f,g)
1139	vshr.u64	d24,d16,#28
1140	veor	d26,d25			@ Sigma1(e)
1141	vadd.i64	d27,d29,d23
1142	vshr.u64	d25,d16,#34
1143	vsli.64	d24,d16,#36
1144	vadd.i64	d27,d26
1145	vshr.u64	d26,d16,#39
1146	vadd.i64	d28,d0
1147	vsli.64	d25,d16,#30
1148	veor	d30,d16,d17
1149	vsli.64	d26,d16,#25
1150	veor	d23,d24,d25
1151	vadd.i64	d27,d28
1152	vbsl	d30,d18,d17		@ Maj(a,b,c)
1153	veor	d23,d26			@ Sigma0(a)
1154	vadd.i64	d19,d27
1155	vadd.i64	d30,d27
1156	@ vadd.i64	d23,d30
1157	vshr.u64	d24,d19,#14	@ 17
1158#if 17<16
1159	vld1.64	{d1},[r1]!	@ handles unaligned
1160#endif
1161	vshr.u64	d25,d19,#18
1162#if 17>0
1163	vadd.i64	d23,d30			@ h+=Maj from the past
1164#endif
1165	vshr.u64	d26,d19,#41
1166	vld1.64	{d28},[r3,:64]!	@ K[i++]
1167	vsli.64	d24,d19,#50
1168	vsli.64	d25,d19,#46
1169	vmov	d29,d19
1170	vsli.64	d26,d19,#23
1171#if 17<16 && defined(__ARMEL__)
1172	vrev64.8	,
1173#endif
1174	veor	d25,d24
1175	vbsl	d29,d20,d21		@ Ch(e,f,g)
1176	vshr.u64	d24,d23,#28
1177	veor	d26,d25			@ Sigma1(e)
1178	vadd.i64	d27,d29,d22
1179	vshr.u64	d25,d23,#34
1180	vsli.64	d24,d23,#36
1181	vadd.i64	d27,d26
1182	vshr.u64	d26,d23,#39
1183	vadd.i64	d28,d1
1184	vsli.64	d25,d23,#30
1185	veor	d30,d23,d16
1186	vsli.64	d26,d23,#25
1187	veor	d22,d24,d25
1188	vadd.i64	d27,d28
1189	vbsl	d30,d17,d16		@ Maj(a,b,c)
1190	veor	d22,d26			@ Sigma0(a)
1191	vadd.i64	d18,d27
1192	vadd.i64	d30,d27
1193	@ vadd.i64	d22,d30
1194	vshr.u64	q12,q0,#19
1195	vshr.u64	q13,q0,#61
1196	vadd.i64	d22,d30			@ h+=Maj from the past
1197	vshr.u64	q15,q0,#6
1198	vsli.64	q12,q0,#45
1199	vext.8	q14,q1,q2,#8	@ X[i+1]
1200	vsli.64	q13,q0,#3
1201	veor	q15,q12
1202	vshr.u64	q12,q14,#1
1203	veor	q15,q13				@ sigma1(X[i+14])
1204	vshr.u64	q13,q14,#8
1205	vadd.i64	q1,q15
1206	vshr.u64	q15,q14,#7
1207	vsli.64	q12,q14,#63
1208	vsli.64	q13,q14,#56
1209	vext.8	q14,q5,q6,#8	@ X[i+9]
1210	veor	q15,q12
1211	vshr.u64	d24,d18,#14		@ from NEON_00_15
1212	vadd.i64	q1,q14
1213	vshr.u64	d25,d18,#18		@ from NEON_00_15
1214	veor	q15,q13				@ sigma0(X[i+1])
1215	vshr.u64	d26,d18,#41		@ from NEON_00_15
1216	vadd.i64	q1,q15
1217	vld1.64	{d28},[r3,:64]!	@ K[i++]
1218	vsli.64	d24,d18,#50
1219	vsli.64	d25,d18,#46
1220	vmov	d29,d18
1221	vsli.64	d26,d18,#23
1222#if 18<16 && defined(__ARMEL__)
1223	vrev64.8	,
1224#endif
1225	veor	d25,d24
1226	vbsl	d29,d19,d20		@ Ch(e,f,g)
1227	vshr.u64	d24,d22,#28
1228	veor	d26,d25			@ Sigma1(e)
1229	vadd.i64	d27,d29,d21
1230	vshr.u64	d25,d22,#34
1231	vsli.64	d24,d22,#36
1232	vadd.i64	d27,d26
1233	vshr.u64	d26,d22,#39
1234	vadd.i64	d28,d2
1235	vsli.64	d25,d22,#30
1236	veor	d30,d22,d23
1237	vsli.64	d26,d22,#25
1238	veor	d21,d24,d25
1239	vadd.i64	d27,d28
1240	vbsl	d30,d16,d23		@ Maj(a,b,c)
1241	veor	d21,d26			@ Sigma0(a)
1242	vadd.i64	d17,d27
1243	vadd.i64	d30,d27
1244	@ vadd.i64	d21,d30
1245	vshr.u64	d24,d17,#14	@ 19
1246#if 19<16
1247	vld1.64	{d3},[r1]!	@ handles unaligned
1248#endif
1249	vshr.u64	d25,d17,#18
1250#if 19>0
1251	vadd.i64	d21,d30			@ h+=Maj from the past
1252#endif
1253	vshr.u64	d26,d17,#41
1254	vld1.64	{d28},[r3,:64]!	@ K[i++]
1255	vsli.64	d24,d17,#50
1256	vsli.64	d25,d17,#46
1257	vmov	d29,d17
1258	vsli.64	d26,d17,#23
1259#if 19<16 && defined(__ARMEL__)
1260	vrev64.8	,
1261#endif
1262	veor	d25,d24
1263	vbsl	d29,d18,d19		@ Ch(e,f,g)
1264	vshr.u64	d24,d21,#28
1265	veor	d26,d25			@ Sigma1(e)
1266	vadd.i64	d27,d29,d20
1267	vshr.u64	d25,d21,#34
1268	vsli.64	d24,d21,#36
1269	vadd.i64	d27,d26
1270	vshr.u64	d26,d21,#39
1271	vadd.i64	d28,d3
1272	vsli.64	d25,d21,#30
1273	veor	d30,d21,d22
1274	vsli.64	d26,d21,#25
1275	veor	d20,d24,d25
1276	vadd.i64	d27,d28
1277	vbsl	d30,d23,d22		@ Maj(a,b,c)
1278	veor	d20,d26			@ Sigma0(a)
1279	vadd.i64	d16,d27
1280	vadd.i64	d30,d27
1281	@ vadd.i64	d20,d30
1282	vshr.u64	q12,q1,#19
1283	vshr.u64	q13,q1,#61
1284	vadd.i64	d20,d30			@ h+=Maj from the past
1285	vshr.u64	q15,q1,#6
1286	vsli.64	q12,q1,#45
1287	vext.8	q14,q2,q3,#8	@ X[i+1]
1288	vsli.64	q13,q1,#3
1289	veor	q15,q12
1290	vshr.u64	q12,q14,#1
1291	veor	q15,q13				@ sigma1(X[i+14])
1292	vshr.u64	q13,q14,#8
1293	vadd.i64	q2,q15
1294	vshr.u64	q15,q14,#7
1295	vsli.64	q12,q14,#63
1296	vsli.64	q13,q14,#56
1297	vext.8	q14,q6,q7,#8	@ X[i+9]
1298	veor	q15,q12
1299	vshr.u64	d24,d16,#14		@ from NEON_00_15
1300	vadd.i64	q2,q14
1301	vshr.u64	d25,d16,#18		@ from NEON_00_15
1302	veor	q15,q13				@ sigma0(X[i+1])
1303	vshr.u64	d26,d16,#41		@ from NEON_00_15
1304	vadd.i64	q2,q15
1305	vld1.64	{d28},[r3,:64]!	@ K[i++]
1306	vsli.64	d24,d16,#50
1307	vsli.64	d25,d16,#46
1308	vmov	d29,d16
1309	vsli.64	d26,d16,#23
1310#if 20<16 && defined(__ARMEL__)
1311	vrev64.8	,
1312#endif
1313	veor	d25,d24
1314	vbsl	d29,d17,d18		@ Ch(e,f,g)
1315	vshr.u64	d24,d20,#28
1316	veor	d26,d25			@ Sigma1(e)
1317	vadd.i64	d27,d29,d19
1318	vshr.u64	d25,d20,#34
1319	vsli.64	d24,d20,#36
1320	vadd.i64	d27,d26
1321	vshr.u64	d26,d20,#39
1322	vadd.i64	d28,d4
1323	vsli.64	d25,d20,#30
1324	veor	d30,d20,d21
1325	vsli.64	d26,d20,#25
1326	veor	d19,d24,d25
1327	vadd.i64	d27,d28
1328	vbsl	d30,d22,d21		@ Maj(a,b,c)
1329	veor	d19,d26			@ Sigma0(a)
1330	vadd.i64	d23,d27
1331	vadd.i64	d30,d27
1332	@ vadd.i64	d19,d30
1333	vshr.u64	d24,d23,#14	@ 21
1334#if 21<16
1335	vld1.64	{d5},[r1]!	@ handles unaligned
1336#endif
1337	vshr.u64	d25,d23,#18
1338#if 21>0
1339	vadd.i64	d19,d30			@ h+=Maj from the past
1340#endif
1341	vshr.u64	d26,d23,#41
1342	vld1.64	{d28},[r3,:64]!	@ K[i++]
1343	vsli.64	d24,d23,#50
1344	vsli.64	d25,d23,#46
1345	vmov	d29,d23
1346	vsli.64	d26,d23,#23
1347#if 21<16 && defined(__ARMEL__)
1348	vrev64.8	,
1349#endif
1350	veor	d25,d24
1351	vbsl	d29,d16,d17		@ Ch(e,f,g)
1352	vshr.u64	d24,d19,#28
1353	veor	d26,d25			@ Sigma1(e)
1354	vadd.i64	d27,d29,d18
1355	vshr.u64	d25,d19,#34
1356	vsli.64	d24,d19,#36
1357	vadd.i64	d27,d26
1358	vshr.u64	d26,d19,#39
1359	vadd.i64	d28,d5
1360	vsli.64	d25,d19,#30
1361	veor	d30,d19,d20
1362	vsli.64	d26,d19,#25
1363	veor	d18,d24,d25
1364	vadd.i64	d27,d28
1365	vbsl	d30,d21,d20		@ Maj(a,b,c)
1366	veor	d18,d26			@ Sigma0(a)
1367	vadd.i64	d22,d27
1368	vadd.i64	d30,d27
1369	@ vadd.i64	d18,d30
1370	vshr.u64	q12,q2,#19
1371	vshr.u64	q13,q2,#61
1372	vadd.i64	d18,d30			@ h+=Maj from the past
1373	vshr.u64	q15,q2,#6
1374	vsli.64	q12,q2,#45
1375	vext.8	q14,q3,q4,#8	@ X[i+1]
1376	vsli.64	q13,q2,#3
1377	veor	q15,q12
1378	vshr.u64	q12,q14,#1
1379	veor	q15,q13				@ sigma1(X[i+14])
1380	vshr.u64	q13,q14,#8
1381	vadd.i64	q3,q15
1382	vshr.u64	q15,q14,#7
1383	vsli.64	q12,q14,#63
1384	vsli.64	q13,q14,#56
1385	vext.8	q14,q7,q0,#8	@ X[i+9]
1386	veor	q15,q12
1387	vshr.u64	d24,d22,#14		@ from NEON_00_15
1388	vadd.i64	q3,q14
1389	vshr.u64	d25,d22,#18		@ from NEON_00_15
1390	veor	q15,q13				@ sigma0(X[i+1])
1391	vshr.u64	d26,d22,#41		@ from NEON_00_15
1392	vadd.i64	q3,q15
1393	vld1.64	{d28},[r3,:64]!	@ K[i++]
1394	vsli.64	d24,d22,#50
1395	vsli.64	d25,d22,#46
1396	vmov	d29,d22
1397	vsli.64	d26,d22,#23
1398#if 22<16 && defined(__ARMEL__)
1399	vrev64.8	,
1400#endif
1401	veor	d25,d24
1402	vbsl	d29,d23,d16		@ Ch(e,f,g)
1403	vshr.u64	d24,d18,#28
1404	veor	d26,d25			@ Sigma1(e)
1405	vadd.i64	d27,d29,d17
1406	vshr.u64	d25,d18,#34
1407	vsli.64	d24,d18,#36
1408	vadd.i64	d27,d26
1409	vshr.u64	d26,d18,#39
1410	vadd.i64	d28,d6
1411	vsli.64	d25,d18,#30
1412	veor	d30,d18,d19
1413	vsli.64	d26,d18,#25
1414	veor	d17,d24,d25
1415	vadd.i64	d27,d28
1416	vbsl	d30,d20,d19		@ Maj(a,b,c)
1417	veor	d17,d26			@ Sigma0(a)
1418	vadd.i64	d21,d27
1419	vadd.i64	d30,d27
1420	@ vadd.i64	d17,d30
1421	vshr.u64	d24,d21,#14	@ 23
1422#if 23<16
1423	vld1.64	{d7},[r1]!	@ handles unaligned
1424#endif
1425	vshr.u64	d25,d21,#18
1426#if 23>0
1427	vadd.i64	d17,d30			@ h+=Maj from the past
1428#endif
1429	vshr.u64	d26,d21,#41
1430	vld1.64	{d28},[r3,:64]!	@ K[i++]
1431	vsli.64	d24,d21,#50
1432	vsli.64	d25,d21,#46
1433	vmov	d29,d21
1434	vsli.64	d26,d21,#23
1435#if 23<16 && defined(__ARMEL__)
1436	vrev64.8	,
1437#endif
1438	veor	d25,d24
1439	vbsl	d29,d22,d23		@ Ch(e,f,g)
1440	vshr.u64	d24,d17,#28
1441	veor	d26,d25			@ Sigma1(e)
1442	vadd.i64	d27,d29,d16
1443	vshr.u64	d25,d17,#34
1444	vsli.64	d24,d17,#36
1445	vadd.i64	d27,d26
1446	vshr.u64	d26,d17,#39
1447	vadd.i64	d28,d7
1448	vsli.64	d25,d17,#30
1449	veor	d30,d17,d18
1450	vsli.64	d26,d17,#25
1451	veor	d16,d24,d25
1452	vadd.i64	d27,d28
1453	vbsl	d30,d19,d18		@ Maj(a,b,c)
1454	veor	d16,d26			@ Sigma0(a)
1455	vadd.i64	d20,d27
1456	vadd.i64	d30,d27
1457	@ vadd.i64	d16,d30
1458	vshr.u64	q12,q3,#19
1459	vshr.u64	q13,q3,#61
1460	vadd.i64	d16,d30			@ h+=Maj from the past
1461	vshr.u64	q15,q3,#6
1462	vsli.64	q12,q3,#45
1463	vext.8	q14,q4,q5,#8	@ X[i+1]
1464	vsli.64	q13,q3,#3
1465	veor	q15,q12
1466	vshr.u64	q12,q14,#1
1467	veor	q15,q13				@ sigma1(X[i+14])
1468	vshr.u64	q13,q14,#8
1469	vadd.i64	q4,q15
1470	vshr.u64	q15,q14,#7
1471	vsli.64	q12,q14,#63
1472	vsli.64	q13,q14,#56
1473	vext.8	q14,q0,q1,#8	@ X[i+9]
1474	veor	q15,q12
1475	vshr.u64	d24,d20,#14		@ from NEON_00_15
1476	vadd.i64	q4,q14
1477	vshr.u64	d25,d20,#18		@ from NEON_00_15
1478	veor	q15,q13				@ sigma0(X[i+1])
1479	vshr.u64	d26,d20,#41		@ from NEON_00_15
1480	vadd.i64	q4,q15
1481	vld1.64	{d28},[r3,:64]!	@ K[i++]
1482	vsli.64	d24,d20,#50
1483	vsli.64	d25,d20,#46
1484	vmov	d29,d20
1485	vsli.64	d26,d20,#23
1486#if 24<16 && defined(__ARMEL__)
1487	vrev64.8	,
1488#endif
1489	veor	d25,d24
1490	vbsl	d29,d21,d22		@ Ch(e,f,g)
1491	vshr.u64	d24,d16,#28
1492	veor	d26,d25			@ Sigma1(e)
1493	vadd.i64	d27,d29,d23
1494	vshr.u64	d25,d16,#34
1495	vsli.64	d24,d16,#36
1496	vadd.i64	d27,d26
1497	vshr.u64	d26,d16,#39
1498	vadd.i64	d28,d8
1499	vsli.64	d25,d16,#30
1500	veor	d30,d16,d17
1501	vsli.64	d26,d16,#25
1502	veor	d23,d24,d25
1503	vadd.i64	d27,d28
1504	vbsl	d30,d18,d17		@ Maj(a,b,c)
1505	veor	d23,d26			@ Sigma0(a)
1506	vadd.i64	d19,d27
1507	vadd.i64	d30,d27
1508	@ vadd.i64	d23,d30
1509	vshr.u64	d24,d19,#14	@ 25
1510#if 25<16
1511	vld1.64	{d9},[r1]!	@ handles unaligned
1512#endif
1513	vshr.u64	d25,d19,#18
1514#if 25>0
1515	vadd.i64	d23,d30			@ h+=Maj from the past
1516#endif
1517	vshr.u64	d26,d19,#41
1518	vld1.64	{d28},[r3,:64]!	@ K[i++]
1519	vsli.64	d24,d19,#50
1520	vsli.64	d25,d19,#46
1521	vmov	d29,d19
1522	vsli.64	d26,d19,#23
1523#if 25<16 && defined(__ARMEL__)
1524	vrev64.8	,
1525#endif
1526	veor	d25,d24
1527	vbsl	d29,d20,d21		@ Ch(e,f,g)
1528	vshr.u64	d24,d23,#28
1529	veor	d26,d25			@ Sigma1(e)
1530	vadd.i64	d27,d29,d22
1531	vshr.u64	d25,d23,#34
1532	vsli.64	d24,d23,#36
1533	vadd.i64	d27,d26
1534	vshr.u64	d26,d23,#39
1535	vadd.i64	d28,d9
1536	vsli.64	d25,d23,#30
1537	veor	d30,d23,d16
1538	vsli.64	d26,d23,#25
1539	veor	d22,d24,d25
1540	vadd.i64	d27,d28
1541	vbsl	d30,d17,d16		@ Maj(a,b,c)
1542	veor	d22,d26			@ Sigma0(a)
1543	vadd.i64	d18,d27
1544	vadd.i64	d30,d27
1545	@ vadd.i64	d22,d30
1546	vshr.u64	q12,q4,#19
1547	vshr.u64	q13,q4,#61
1548	vadd.i64	d22,d30			@ h+=Maj from the past
1549	vshr.u64	q15,q4,#6
1550	vsli.64	q12,q4,#45
1551	vext.8	q14,q5,q6,#8	@ X[i+1]
1552	vsli.64	q13,q4,#3
1553	veor	q15,q12
1554	vshr.u64	q12,q14,#1
1555	veor	q15,q13				@ sigma1(X[i+14])
1556	vshr.u64	q13,q14,#8
1557	vadd.i64	q5,q15
1558	vshr.u64	q15,q14,#7
1559	vsli.64	q12,q14,#63
1560	vsli.64	q13,q14,#56
1561	vext.8	q14,q1,q2,#8	@ X[i+9]
1562	veor	q15,q12
1563	vshr.u64	d24,d18,#14		@ from NEON_00_15
1564	vadd.i64	q5,q14
1565	vshr.u64	d25,d18,#18		@ from NEON_00_15
1566	veor	q15,q13				@ sigma0(X[i+1])
1567	vshr.u64	d26,d18,#41		@ from NEON_00_15
1568	vadd.i64	q5,q15
1569	vld1.64	{d28},[r3,:64]!	@ K[i++]
1570	vsli.64	d24,d18,#50
1571	vsli.64	d25,d18,#46
1572	vmov	d29,d18
1573	vsli.64	d26,d18,#23
1574#if 26<16 && defined(__ARMEL__)
1575	vrev64.8	,
1576#endif
1577	veor	d25,d24
1578	vbsl	d29,d19,d20		@ Ch(e,f,g)
1579	vshr.u64	d24,d22,#28
1580	veor	d26,d25			@ Sigma1(e)
1581	vadd.i64	d27,d29,d21
1582	vshr.u64	d25,d22,#34
1583	vsli.64	d24,d22,#36
1584	vadd.i64	d27,d26
1585	vshr.u64	d26,d22,#39
1586	vadd.i64	d28,d10
1587	vsli.64	d25,d22,#30
1588	veor	d30,d22,d23
1589	vsli.64	d26,d22,#25
1590	veor	d21,d24,d25
1591	vadd.i64	d27,d28
1592	vbsl	d30,d16,d23		@ Maj(a,b,c)
1593	veor	d21,d26			@ Sigma0(a)
1594	vadd.i64	d17,d27
1595	vadd.i64	d30,d27
1596	@ vadd.i64	d21,d30
1597	vshr.u64	d24,d17,#14	@ 27
1598#if 27<16
1599	vld1.64	{d11},[r1]!	@ handles unaligned
1600#endif
1601	vshr.u64	d25,d17,#18
1602#if 27>0
1603	vadd.i64	d21,d30			@ h+=Maj from the past
1604#endif
1605	vshr.u64	d26,d17,#41
1606	vld1.64	{d28},[r3,:64]!	@ K[i++]
1607	vsli.64	d24,d17,#50
1608	vsli.64	d25,d17,#46
1609	vmov	d29,d17
1610	vsli.64	d26,d17,#23
1611#if 27<16 && defined(__ARMEL__)
1612	vrev64.8	,
1613#endif
1614	veor	d25,d24
1615	vbsl	d29,d18,d19		@ Ch(e,f,g)
1616	vshr.u64	d24,d21,#28
1617	veor	d26,d25			@ Sigma1(e)
1618	vadd.i64	d27,d29,d20
1619	vshr.u64	d25,d21,#34
1620	vsli.64	d24,d21,#36
1621	vadd.i64	d27,d26
1622	vshr.u64	d26,d21,#39
1623	vadd.i64	d28,d11
1624	vsli.64	d25,d21,#30
1625	veor	d30,d21,d22
1626	vsli.64	d26,d21,#25
1627	veor	d20,d24,d25
1628	vadd.i64	d27,d28
1629	vbsl	d30,d23,d22		@ Maj(a,b,c)
1630	veor	d20,d26			@ Sigma0(a)
1631	vadd.i64	d16,d27
1632	vadd.i64	d30,d27
1633	@ vadd.i64	d20,d30
1634	vshr.u64	q12,q5,#19
1635	vshr.u64	q13,q5,#61
1636	vadd.i64	d20,d30			@ h+=Maj from the past
1637	vshr.u64	q15,q5,#6
1638	vsli.64	q12,q5,#45
1639	vext.8	q14,q6,q7,#8	@ X[i+1]
1640	vsli.64	q13,q5,#3
1641	veor	q15,q12
1642	vshr.u64	q12,q14,#1
1643	veor	q15,q13				@ sigma1(X[i+14])
1644	vshr.u64	q13,q14,#8
1645	vadd.i64	q6,q15
1646	vshr.u64	q15,q14,#7
1647	vsli.64	q12,q14,#63
1648	vsli.64	q13,q14,#56
1649	vext.8	q14,q2,q3,#8	@ X[i+9]
1650	veor	q15,q12
1651	vshr.u64	d24,d16,#14		@ from NEON_00_15
1652	vadd.i64	q6,q14
1653	vshr.u64	d25,d16,#18		@ from NEON_00_15
1654	veor	q15,q13				@ sigma0(X[i+1])
1655	vshr.u64	d26,d16,#41		@ from NEON_00_15
1656	vadd.i64	q6,q15
1657	vld1.64	{d28},[r3,:64]!	@ K[i++]
1658	vsli.64	d24,d16,#50
1659	vsli.64	d25,d16,#46
1660	vmov	d29,d16
1661	vsli.64	d26,d16,#23
1662#if 28<16 && defined(__ARMEL__)
1663	vrev64.8	,
1664#endif
1665	veor	d25,d24
1666	vbsl	d29,d17,d18		@ Ch(e,f,g)
1667	vshr.u64	d24,d20,#28
1668	veor	d26,d25			@ Sigma1(e)
1669	vadd.i64	d27,d29,d19
1670	vshr.u64	d25,d20,#34
1671	vsli.64	d24,d20,#36
1672	vadd.i64	d27,d26
1673	vshr.u64	d26,d20,#39
1674	vadd.i64	d28,d12
1675	vsli.64	d25,d20,#30
1676	veor	d30,d20,d21
1677	vsli.64	d26,d20,#25
1678	veor	d19,d24,d25
1679	vadd.i64	d27,d28
1680	vbsl	d30,d22,d21		@ Maj(a,b,c)
1681	veor	d19,d26			@ Sigma0(a)
1682	vadd.i64	d23,d27
1683	vadd.i64	d30,d27
1684	@ vadd.i64	d19,d30
1685	vshr.u64	d24,d23,#14	@ 29
1686#if 29<16
1687	vld1.64	{d13},[r1]!	@ handles unaligned
1688#endif
1689	vshr.u64	d25,d23,#18
1690#if 29>0
1691	vadd.i64	d19,d30			@ h+=Maj from the past
1692#endif
1693	vshr.u64	d26,d23,#41
1694	vld1.64	{d28},[r3,:64]!	@ K[i++]
1695	vsli.64	d24,d23,#50
1696	vsli.64	d25,d23,#46
1697	vmov	d29,d23
1698	vsli.64	d26,d23,#23
1699#if 29<16 && defined(__ARMEL__)
1700	vrev64.8	,
1701#endif
1702	veor	d25,d24
1703	vbsl	d29,d16,d17		@ Ch(e,f,g)
1704	vshr.u64	d24,d19,#28
1705	veor	d26,d25			@ Sigma1(e)
1706	vadd.i64	d27,d29,d18
1707	vshr.u64	d25,d19,#34
1708	vsli.64	d24,d19,#36
1709	vadd.i64	d27,d26
1710	vshr.u64	d26,d19,#39
1711	vadd.i64	d28,d13
1712	vsli.64	d25,d19,#30
1713	veor	d30,d19,d20
1714	vsli.64	d26,d19,#25
1715	veor	d18,d24,d25
1716	vadd.i64	d27,d28
1717	vbsl	d30,d21,d20		@ Maj(a,b,c)
1718	veor	d18,d26			@ Sigma0(a)
1719	vadd.i64	d22,d27
1720	vadd.i64	d30,d27
1721	@ vadd.i64	d18,d30
1722	vshr.u64	q12,q6,#19
1723	vshr.u64	q13,q6,#61
1724	vadd.i64	d18,d30			@ h+=Maj from the past
1725	vshr.u64	q15,q6,#6
1726	vsli.64	q12,q6,#45
1727	vext.8	q14,q7,q0,#8	@ X[i+1]
1728	vsli.64	q13,q6,#3
1729	veor	q15,q12
1730	vshr.u64	q12,q14,#1
1731	veor	q15,q13				@ sigma1(X[i+14])
1732	vshr.u64	q13,q14,#8
1733	vadd.i64	q7,q15
1734	vshr.u64	q15,q14,#7
1735	vsli.64	q12,q14,#63
1736	vsli.64	q13,q14,#56
1737	vext.8	q14,q3,q4,#8	@ X[i+9]
1738	veor	q15,q12
1739	vshr.u64	d24,d22,#14		@ from NEON_00_15
1740	vadd.i64	q7,q14
1741	vshr.u64	d25,d22,#18		@ from NEON_00_15
1742	veor	q15,q13				@ sigma0(X[i+1])
1743	vshr.u64	d26,d22,#41		@ from NEON_00_15
1744	vadd.i64	q7,q15
1745	vld1.64	{d28},[r3,:64]!	@ K[i++]
1746	vsli.64	d24,d22,#50
1747	vsli.64	d25,d22,#46
1748	vmov	d29,d22
1749	vsli.64	d26,d22,#23
1750#if 30<16 && defined(__ARMEL__)
1751	vrev64.8	,
1752#endif
1753	veor	d25,d24
1754	vbsl	d29,d23,d16		@ Ch(e,f,g)
1755	vshr.u64	d24,d18,#28
1756	veor	d26,d25			@ Sigma1(e)
1757	vadd.i64	d27,d29,d17
1758	vshr.u64	d25,d18,#34
1759	vsli.64	d24,d18,#36
1760	vadd.i64	d27,d26
1761	vshr.u64	d26,d18,#39
1762	vadd.i64	d28,d14
1763	vsli.64	d25,d18,#30
1764	veor	d30,d18,d19
1765	vsli.64	d26,d18,#25
1766	veor	d17,d24,d25
1767	vadd.i64	d27,d28
1768	vbsl	d30,d20,d19		@ Maj(a,b,c)
1769	veor	d17,d26			@ Sigma0(a)
1770	vadd.i64	d21,d27
1771	vadd.i64	d30,d27
1772	@ vadd.i64	d17,d30
1773	vshr.u64	d24,d21,#14	@ 31
1774#if 31<16
1775	vld1.64	{d15},[r1]!	@ handles unaligned
1776#endif
1777	vshr.u64	d25,d21,#18
1778#if 31>0
1779	vadd.i64	d17,d30			@ h+=Maj from the past
1780#endif
1781	vshr.u64	d26,d21,#41
1782	vld1.64	{d28},[r3,:64]!	@ K[i++]
1783	vsli.64	d24,d21,#50
1784	vsli.64	d25,d21,#46
1785	vmov	d29,d21
1786	vsli.64	d26,d21,#23
1787#if 31<16 && defined(__ARMEL__)
1788	vrev64.8	,
1789#endif
1790	veor	d25,d24
1791	vbsl	d29,d22,d23		@ Ch(e,f,g)
1792	vshr.u64	d24,d17,#28
1793	veor	d26,d25			@ Sigma1(e)
1794	vadd.i64	d27,d29,d16
1795	vshr.u64	d25,d17,#34
1796	vsli.64	d24,d17,#36
1797	vadd.i64	d27,d26
1798	vshr.u64	d26,d17,#39
1799	vadd.i64	d28,d15
1800	vsli.64	d25,d17,#30
1801	veor	d30,d17,d18
1802	vsli.64	d26,d17,#25
1803	veor	d16,d24,d25
1804	vadd.i64	d27,d28
1805	vbsl	d30,d19,d18		@ Maj(a,b,c)
1806	veor	d16,d26			@ Sigma0(a)
1807	vadd.i64	d20,d27
1808	vadd.i64	d30,d27
1809	@ vadd.i64	d16,d30
1810	bne	.L16_79_neon
1811
1812	vadd.i64	d16,d30		@ h+=Maj from the past
1813	vldmia	r0,{d24,d25,d26,d27,d28,d29,d30,d31}	@ load context to temp
1814	vadd.i64	q8,q12		@ vectorized accumulate
1815	vadd.i64	q9,q13
1816	vadd.i64	q10,q14
1817	vadd.i64	q11,q15
1818	vstmia	r0,{d16,d17,d18,d19,d20,d21,d22,d23}	@ save context
1819	teq	r1,r2
1820	sub	r3,#640	@ rewind K512
1821	bne	.Loop_neon
1822
1823	VFP_ABI_POP
1824	bx	lr				@ .word	0xe12fff1e
1825.size	zfs_sha512_block_neon,.-zfs_sha512_block_neon
1826#endif // #if __ARM_ARCH__ >= 7
1827#endif // #if defined(__arm__)
1828