xref: /freebsd/sys/crypto/openssl/aarch64/chacha-armv8.S (revision fe75646a0234a261c0013bf1840fdac4acaf0cec)
1/* Do not modify. This file is auto-generated from chacha-armv8.pl. */
2#include "arm_arch.h"
3#ifndef	__KERNEL__
4
5.hidden	OPENSSL_armcap_P
6#endif
7
8.text
9
10.align	5
11.Lsigma:
12.quad	0x3320646e61707865,0x6b20657479622d32		// endian-neutral
13.Lone:
14.long	1,2,3,4
15.Lrot24:
16.long	0x02010003,0x06050407,0x0a09080b,0x0e0d0c0f
17.byte	67,104,97,67,104,97,50,48,32,102,111,114,32,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,64,100,111,116,45,97,115,109,0
18.align	2
19
20.globl	ChaCha20_ctr32
21.type	ChaCha20_ctr32,%function
22.align	5
23ChaCha20_ctr32:
24	AARCH64_SIGN_LINK_REGISTER
25	cbz	x2,.Labort
26	cmp	x2,#192
27	b.lo	.Lshort
28
29#ifndef	__KERNEL__
30	adrp	x17,OPENSSL_armcap_P
31	ldr	w17,[x17,#:lo12:OPENSSL_armcap_P]
32	tst	w17,#ARMV7_NEON
33	b.ne	.LChaCha20_neon
34#endif
35
36.Lshort:
37	stp	x29,x30,[sp,#-96]!
38	add	x29,sp,#0
39
40	adr	x5,.Lsigma
41	stp	x19,x20,[sp,#16]
42	stp	x21,x22,[sp,#32]
43	stp	x23,x24,[sp,#48]
44	stp	x25,x26,[sp,#64]
45	stp	x27,x28,[sp,#80]
46	sub	sp,sp,#64
47
48	ldp	x22,x23,[x5]		// load sigma
49	ldp	x24,x25,[x3]		// load key
50	ldp	x26,x27,[x3,#16]
51	ldp	x28,x30,[x4]		// load counter
52#ifdef	__AARCH64EB__
53	ror	x24,x24,#32
54	ror	x25,x25,#32
55	ror	x26,x26,#32
56	ror	x27,x27,#32
57	ror	x28,x28,#32
58	ror	x30,x30,#32
59#endif
60
61.Loop_outer:
62	mov	w5,w22			// unpack key block
63	lsr	x6,x22,#32
64	mov	w7,w23
65	lsr	x8,x23,#32
66	mov	w9,w24
67	lsr	x10,x24,#32
68	mov	w11,w25
69	lsr	x12,x25,#32
70	mov	w13,w26
71	lsr	x14,x26,#32
72	mov	w15,w27
73	lsr	x16,x27,#32
74	mov	w17,w28
75	lsr	x19,x28,#32
76	mov	w20,w30
77	lsr	x21,x30,#32
78
79	mov	x4,#10
80	subs	x2,x2,#64
81.Loop:
82	sub	x4,x4,#1
83	add	w5,w5,w9
84	add	w6,w6,w10
85	add	w7,w7,w11
86	add	w8,w8,w12
87	eor	w17,w17,w5
88	eor	w19,w19,w6
89	eor	w20,w20,w7
90	eor	w21,w21,w8
91	ror	w17,w17,#16
92	ror	w19,w19,#16
93	ror	w20,w20,#16
94	ror	w21,w21,#16
95	add	w13,w13,w17
96	add	w14,w14,w19
97	add	w15,w15,w20
98	add	w16,w16,w21
99	eor	w9,w9,w13
100	eor	w10,w10,w14
101	eor	w11,w11,w15
102	eor	w12,w12,w16
103	ror	w9,w9,#20
104	ror	w10,w10,#20
105	ror	w11,w11,#20
106	ror	w12,w12,#20
107	add	w5,w5,w9
108	add	w6,w6,w10
109	add	w7,w7,w11
110	add	w8,w8,w12
111	eor	w17,w17,w5
112	eor	w19,w19,w6
113	eor	w20,w20,w7
114	eor	w21,w21,w8
115	ror	w17,w17,#24
116	ror	w19,w19,#24
117	ror	w20,w20,#24
118	ror	w21,w21,#24
119	add	w13,w13,w17
120	add	w14,w14,w19
121	add	w15,w15,w20
122	add	w16,w16,w21
123	eor	w9,w9,w13
124	eor	w10,w10,w14
125	eor	w11,w11,w15
126	eor	w12,w12,w16
127	ror	w9,w9,#25
128	ror	w10,w10,#25
129	ror	w11,w11,#25
130	ror	w12,w12,#25
131	add	w5,w5,w10
132	add	w6,w6,w11
133	add	w7,w7,w12
134	add	w8,w8,w9
135	eor	w21,w21,w5
136	eor	w17,w17,w6
137	eor	w19,w19,w7
138	eor	w20,w20,w8
139	ror	w21,w21,#16
140	ror	w17,w17,#16
141	ror	w19,w19,#16
142	ror	w20,w20,#16
143	add	w15,w15,w21
144	add	w16,w16,w17
145	add	w13,w13,w19
146	add	w14,w14,w20
147	eor	w10,w10,w15
148	eor	w11,w11,w16
149	eor	w12,w12,w13
150	eor	w9,w9,w14
151	ror	w10,w10,#20
152	ror	w11,w11,#20
153	ror	w12,w12,#20
154	ror	w9,w9,#20
155	add	w5,w5,w10
156	add	w6,w6,w11
157	add	w7,w7,w12
158	add	w8,w8,w9
159	eor	w21,w21,w5
160	eor	w17,w17,w6
161	eor	w19,w19,w7
162	eor	w20,w20,w8
163	ror	w21,w21,#24
164	ror	w17,w17,#24
165	ror	w19,w19,#24
166	ror	w20,w20,#24
167	add	w15,w15,w21
168	add	w16,w16,w17
169	add	w13,w13,w19
170	add	w14,w14,w20
171	eor	w10,w10,w15
172	eor	w11,w11,w16
173	eor	w12,w12,w13
174	eor	w9,w9,w14
175	ror	w10,w10,#25
176	ror	w11,w11,#25
177	ror	w12,w12,#25
178	ror	w9,w9,#25
179	cbnz	x4,.Loop
180
181	add	w5,w5,w22		// accumulate key block
182	add	x6,x6,x22,lsr#32
183	add	w7,w7,w23
184	add	x8,x8,x23,lsr#32
185	add	w9,w9,w24
186	add	x10,x10,x24,lsr#32
187	add	w11,w11,w25
188	add	x12,x12,x25,lsr#32
189	add	w13,w13,w26
190	add	x14,x14,x26,lsr#32
191	add	w15,w15,w27
192	add	x16,x16,x27,lsr#32
193	add	w17,w17,w28
194	add	x19,x19,x28,lsr#32
195	add	w20,w20,w30
196	add	x21,x21,x30,lsr#32
197
198	b.lo	.Ltail
199
200	add	x5,x5,x6,lsl#32	// pack
201	add	x7,x7,x8,lsl#32
202	ldp	x6,x8,[x1,#0]		// load input
203	add	x9,x9,x10,lsl#32
204	add	x11,x11,x12,lsl#32
205	ldp	x10,x12,[x1,#16]
206	add	x13,x13,x14,lsl#32
207	add	x15,x15,x16,lsl#32
208	ldp	x14,x16,[x1,#32]
209	add	x17,x17,x19,lsl#32
210	add	x20,x20,x21,lsl#32
211	ldp	x19,x21,[x1,#48]
212	add	x1,x1,#64
213#ifdef	__AARCH64EB__
214	rev	x5,x5
215	rev	x7,x7
216	rev	x9,x9
217	rev	x11,x11
218	rev	x13,x13
219	rev	x15,x15
220	rev	x17,x17
221	rev	x20,x20
222#endif
223	eor	x5,x5,x6
224	eor	x7,x7,x8
225	eor	x9,x9,x10
226	eor	x11,x11,x12
227	eor	x13,x13,x14
228	eor	x15,x15,x16
229	eor	x17,x17,x19
230	eor	x20,x20,x21
231
232	stp	x5,x7,[x0,#0]		// store output
233	add	x28,x28,#1			// increment counter
234	stp	x9,x11,[x0,#16]
235	stp	x13,x15,[x0,#32]
236	stp	x17,x20,[x0,#48]
237	add	x0,x0,#64
238
239	b.hi	.Loop_outer
240
241	ldp	x19,x20,[x29,#16]
242	add	sp,sp,#64
243	ldp	x21,x22,[x29,#32]
244	ldp	x23,x24,[x29,#48]
245	ldp	x25,x26,[x29,#64]
246	ldp	x27,x28,[x29,#80]
247	ldp	x29,x30,[sp],#96
248.Labort:
249	AARCH64_VALIDATE_LINK_REGISTER
250	ret
251
252.align	4
253.Ltail:
254	add	x2,x2,#64
255.Less_than_64:
256	sub	x0,x0,#1
257	add	x1,x1,x2
258	add	x0,x0,x2
259	add	x4,sp,x2
260	neg	x2,x2
261
262	add	x5,x5,x6,lsl#32	// pack
263	add	x7,x7,x8,lsl#32
264	add	x9,x9,x10,lsl#32
265	add	x11,x11,x12,lsl#32
266	add	x13,x13,x14,lsl#32
267	add	x15,x15,x16,lsl#32
268	add	x17,x17,x19,lsl#32
269	add	x20,x20,x21,lsl#32
270#ifdef	__AARCH64EB__
271	rev	x5,x5
272	rev	x7,x7
273	rev	x9,x9
274	rev	x11,x11
275	rev	x13,x13
276	rev	x15,x15
277	rev	x17,x17
278	rev	x20,x20
279#endif
280	stp	x5,x7,[sp,#0]
281	stp	x9,x11,[sp,#16]
282	stp	x13,x15,[sp,#32]
283	stp	x17,x20,[sp,#48]
284
285.Loop_tail:
286	ldrb	w10,[x1,x2]
287	ldrb	w11,[x4,x2]
288	add	x2,x2,#1
289	eor	w10,w10,w11
290	strb	w10,[x0,x2]
291	cbnz	x2,.Loop_tail
292
293	stp	xzr,xzr,[sp,#0]
294	stp	xzr,xzr,[sp,#16]
295	stp	xzr,xzr,[sp,#32]
296	stp	xzr,xzr,[sp,#48]
297
298	ldp	x19,x20,[x29,#16]
299	add	sp,sp,#64
300	ldp	x21,x22,[x29,#32]
301	ldp	x23,x24,[x29,#48]
302	ldp	x25,x26,[x29,#64]
303	ldp	x27,x28,[x29,#80]
304	ldp	x29,x30,[sp],#96
305	AARCH64_VALIDATE_LINK_REGISTER
306	ret
307.size	ChaCha20_ctr32,.-ChaCha20_ctr32
308
309#ifdef	__KERNEL__
310.globl	ChaCha20_neon
311#endif
312.type	ChaCha20_neon,%function
313.align	5
314ChaCha20_neon:
315	AARCH64_SIGN_LINK_REGISTER
316.LChaCha20_neon:
317	stp	x29,x30,[sp,#-96]!
318	add	x29,sp,#0
319
320	adr	x5,.Lsigma
321	stp	x19,x20,[sp,#16]
322	stp	x21,x22,[sp,#32]
323	stp	x23,x24,[sp,#48]
324	stp	x25,x26,[sp,#64]
325	stp	x27,x28,[sp,#80]
326	cmp	x2,#512
327	b.hs	.L512_or_more_neon
328
329	sub	sp,sp,#64
330
331	ldp	x22,x23,[x5]		// load sigma
332	ld1	{v0.4s},[x5],#16
333	ldp	x24,x25,[x3]		// load key
334	ldp	x26,x27,[x3,#16]
335	ld1	{v1.4s,v2.4s},[x3]
336	ldp	x28,x30,[x4]		// load counter
337	ld1	{v3.4s},[x4]
338	stp	d8,d9,[sp]			// meet ABI requirements
339	ld1	{v8.4s,v9.4s},[x5]
340#ifdef	__AARCH64EB__
341	rev64	v0.4s,v0.4s
342	ror	x24,x24,#32
343	ror	x25,x25,#32
344	ror	x26,x26,#32
345	ror	x27,x27,#32
346	ror	x28,x28,#32
347	ror	x30,x30,#32
348#endif
349
350.Loop_outer_neon:
351	dup	v16.4s,v0.s[0]			// unpack key block
352	mov	w5,w22
353	dup	v20.4s,v0.s[1]
354	lsr	x6,x22,#32
355	dup	v24.4s,v0.s[2]
356	mov	w7,w23
357	dup	v28.4s,v0.s[3]
358	lsr	x8,x23,#32
359	dup	v17.4s,v1.s[0]
360	mov	w9,w24
361	dup	v21.4s,v1.s[1]
362	lsr	x10,x24,#32
363	dup	v25.4s,v1.s[2]
364	mov	w11,w25
365	dup	v29.4s,v1.s[3]
366	lsr	x12,x25,#32
367	dup	v19.4s,v3.s[0]
368	mov	w13,w26
369	dup	v23.4s,v3.s[1]
370	lsr	x14,x26,#32
371	dup	v27.4s,v3.s[2]
372	mov	w15,w27
373	dup	v31.4s,v3.s[3]
374	lsr	x16,x27,#32
375	add	v19.4s,v19.4s,v8.4s
376	mov	w17,w28
377	dup	v18.4s,v2.s[0]
378	lsr	x19,x28,#32
379	dup	v22.4s,v2.s[1]
380	mov	w20,w30
381	dup	v26.4s,v2.s[2]
382	lsr	x21,x30,#32
383	dup	v30.4s,v2.s[3]
384
385	mov	x4,#10
386	subs	x2,x2,#320
387.Loop_neon:
388	sub	x4,x4,#1
389	add	v16.4s,v16.4s,v17.4s
390	add	w5,w5,w9
391	add	v20.4s,v20.4s,v21.4s
392	add	w6,w6,w10
393	add	v24.4s,v24.4s,v25.4s
394	add	w7,w7,w11
395	add	v28.4s,v28.4s,v29.4s
396	add	w8,w8,w12
397	eor	v19.16b,v19.16b,v16.16b
398	eor	w17,w17,w5
399	eor	v23.16b,v23.16b,v20.16b
400	eor	w19,w19,w6
401	eor	v27.16b,v27.16b,v24.16b
402	eor	w20,w20,w7
403	eor	v31.16b,v31.16b,v28.16b
404	eor	w21,w21,w8
405	rev32	v19.8h,v19.8h
406	ror	w17,w17,#16
407	rev32	v23.8h,v23.8h
408	ror	w19,w19,#16
409	rev32	v27.8h,v27.8h
410	ror	w20,w20,#16
411	rev32	v31.8h,v31.8h
412	ror	w21,w21,#16
413	add	v18.4s,v18.4s,v19.4s
414	add	w13,w13,w17
415	add	v22.4s,v22.4s,v23.4s
416	add	w14,w14,w19
417	add	v26.4s,v26.4s,v27.4s
418	add	w15,w15,w20
419	add	v30.4s,v30.4s,v31.4s
420	add	w16,w16,w21
421	eor	v4.16b,v17.16b,v18.16b
422	eor	w9,w9,w13
423	eor	v5.16b,v21.16b,v22.16b
424	eor	w10,w10,w14
425	eor	v6.16b,v25.16b,v26.16b
426	eor	w11,w11,w15
427	eor	v7.16b,v29.16b,v30.16b
428	eor	w12,w12,w16
429	ushr	v17.4s,v4.4s,#20
430	ror	w9,w9,#20
431	ushr	v21.4s,v5.4s,#20
432	ror	w10,w10,#20
433	ushr	v25.4s,v6.4s,#20
434	ror	w11,w11,#20
435	ushr	v29.4s,v7.4s,#20
436	ror	w12,w12,#20
437	sli	v17.4s,v4.4s,#12
438	add	w5,w5,w9
439	sli	v21.4s,v5.4s,#12
440	add	w6,w6,w10
441	sli	v25.4s,v6.4s,#12
442	add	w7,w7,w11
443	sli	v29.4s,v7.4s,#12
444	add	w8,w8,w12
445	add	v16.4s,v16.4s,v17.4s
446	eor	w17,w17,w5
447	add	v20.4s,v20.4s,v21.4s
448	eor	w19,w19,w6
449	add	v24.4s,v24.4s,v25.4s
450	eor	w20,w20,w7
451	add	v28.4s,v28.4s,v29.4s
452	eor	w21,w21,w8
453	eor	v4.16b,v19.16b,v16.16b
454	ror	w17,w17,#24
455	eor	v5.16b,v23.16b,v20.16b
456	ror	w19,w19,#24
457	eor	v6.16b,v27.16b,v24.16b
458	ror	w20,w20,#24
459	eor	v7.16b,v31.16b,v28.16b
460	ror	w21,w21,#24
461	tbl	v19.16b,{v4.16b},v9.16b
462	add	w13,w13,w17
463	tbl	v23.16b,{v5.16b},v9.16b
464	add	w14,w14,w19
465	tbl	v27.16b,{v6.16b},v9.16b
466	add	w15,w15,w20
467	tbl	v31.16b,{v7.16b},v9.16b
468	add	w16,w16,w21
469	add	v18.4s,v18.4s,v19.4s
470	eor	w9,w9,w13
471	add	v22.4s,v22.4s,v23.4s
472	eor	w10,w10,w14
473	add	v26.4s,v26.4s,v27.4s
474	eor	w11,w11,w15
475	add	v30.4s,v30.4s,v31.4s
476	eor	w12,w12,w16
477	eor	v4.16b,v17.16b,v18.16b
478	ror	w9,w9,#25
479	eor	v5.16b,v21.16b,v22.16b
480	ror	w10,w10,#25
481	eor	v6.16b,v25.16b,v26.16b
482	ror	w11,w11,#25
483	eor	v7.16b,v29.16b,v30.16b
484	ror	w12,w12,#25
485	ushr	v17.4s,v4.4s,#25
486	ushr	v21.4s,v5.4s,#25
487	ushr	v25.4s,v6.4s,#25
488	ushr	v29.4s,v7.4s,#25
489	sli	v17.4s,v4.4s,#7
490	sli	v21.4s,v5.4s,#7
491	sli	v25.4s,v6.4s,#7
492	sli	v29.4s,v7.4s,#7
493	add	v16.4s,v16.4s,v21.4s
494	add	w5,w5,w10
495	add	v20.4s,v20.4s,v25.4s
496	add	w6,w6,w11
497	add	v24.4s,v24.4s,v29.4s
498	add	w7,w7,w12
499	add	v28.4s,v28.4s,v17.4s
500	add	w8,w8,w9
501	eor	v31.16b,v31.16b,v16.16b
502	eor	w21,w21,w5
503	eor	v19.16b,v19.16b,v20.16b
504	eor	w17,w17,w6
505	eor	v23.16b,v23.16b,v24.16b
506	eor	w19,w19,w7
507	eor	v27.16b,v27.16b,v28.16b
508	eor	w20,w20,w8
509	rev32	v31.8h,v31.8h
510	ror	w21,w21,#16
511	rev32	v19.8h,v19.8h
512	ror	w17,w17,#16
513	rev32	v23.8h,v23.8h
514	ror	w19,w19,#16
515	rev32	v27.8h,v27.8h
516	ror	w20,w20,#16
517	add	v26.4s,v26.4s,v31.4s
518	add	w15,w15,w21
519	add	v30.4s,v30.4s,v19.4s
520	add	w16,w16,w17
521	add	v18.4s,v18.4s,v23.4s
522	add	w13,w13,w19
523	add	v22.4s,v22.4s,v27.4s
524	add	w14,w14,w20
525	eor	v4.16b,v21.16b,v26.16b
526	eor	w10,w10,w15
527	eor	v5.16b,v25.16b,v30.16b
528	eor	w11,w11,w16
529	eor	v6.16b,v29.16b,v18.16b
530	eor	w12,w12,w13
531	eor	v7.16b,v17.16b,v22.16b
532	eor	w9,w9,w14
533	ushr	v21.4s,v4.4s,#20
534	ror	w10,w10,#20
535	ushr	v25.4s,v5.4s,#20
536	ror	w11,w11,#20
537	ushr	v29.4s,v6.4s,#20
538	ror	w12,w12,#20
539	ushr	v17.4s,v7.4s,#20
540	ror	w9,w9,#20
541	sli	v21.4s,v4.4s,#12
542	add	w5,w5,w10
543	sli	v25.4s,v5.4s,#12
544	add	w6,w6,w11
545	sli	v29.4s,v6.4s,#12
546	add	w7,w7,w12
547	sli	v17.4s,v7.4s,#12
548	add	w8,w8,w9
549	add	v16.4s,v16.4s,v21.4s
550	eor	w21,w21,w5
551	add	v20.4s,v20.4s,v25.4s
552	eor	w17,w17,w6
553	add	v24.4s,v24.4s,v29.4s
554	eor	w19,w19,w7
555	add	v28.4s,v28.4s,v17.4s
556	eor	w20,w20,w8
557	eor	v4.16b,v31.16b,v16.16b
558	ror	w21,w21,#24
559	eor	v5.16b,v19.16b,v20.16b
560	ror	w17,w17,#24
561	eor	v6.16b,v23.16b,v24.16b
562	ror	w19,w19,#24
563	eor	v7.16b,v27.16b,v28.16b
564	ror	w20,w20,#24
565	tbl	v31.16b,{v4.16b},v9.16b
566	add	w15,w15,w21
567	tbl	v19.16b,{v5.16b},v9.16b
568	add	w16,w16,w17
569	tbl	v23.16b,{v6.16b},v9.16b
570	add	w13,w13,w19
571	tbl	v27.16b,{v7.16b},v9.16b
572	add	w14,w14,w20
573	add	v26.4s,v26.4s,v31.4s
574	eor	w10,w10,w15
575	add	v30.4s,v30.4s,v19.4s
576	eor	w11,w11,w16
577	add	v18.4s,v18.4s,v23.4s
578	eor	w12,w12,w13
579	add	v22.4s,v22.4s,v27.4s
580	eor	w9,w9,w14
581	eor	v4.16b,v21.16b,v26.16b
582	ror	w10,w10,#25
583	eor	v5.16b,v25.16b,v30.16b
584	ror	w11,w11,#25
585	eor	v6.16b,v29.16b,v18.16b
586	ror	w12,w12,#25
587	eor	v7.16b,v17.16b,v22.16b
588	ror	w9,w9,#25
589	ushr	v21.4s,v4.4s,#25
590	ushr	v25.4s,v5.4s,#25
591	ushr	v29.4s,v6.4s,#25
592	ushr	v17.4s,v7.4s,#25
593	sli	v21.4s,v4.4s,#7
594	sli	v25.4s,v5.4s,#7
595	sli	v29.4s,v6.4s,#7
596	sli	v17.4s,v7.4s,#7
597	cbnz	x4,.Loop_neon
598
599	add	v19.4s,v19.4s,v8.4s
600
601	zip1	v4.4s,v16.4s,v20.4s			// transpose data
602	zip1	v5.4s,v24.4s,v28.4s
603	zip2	v6.4s,v16.4s,v20.4s
604	zip2	v7.4s,v24.4s,v28.4s
605	zip1	v16.2d,v4.2d,v5.2d
606	zip2	v20.2d,v4.2d,v5.2d
607	zip1	v24.2d,v6.2d,v7.2d
608	zip2	v28.2d,v6.2d,v7.2d
609
610	zip1	v4.4s,v17.4s,v21.4s
611	zip1	v5.4s,v25.4s,v29.4s
612	zip2	v6.4s,v17.4s,v21.4s
613	zip2	v7.4s,v25.4s,v29.4s
614	zip1	v17.2d,v4.2d,v5.2d
615	zip2	v21.2d,v4.2d,v5.2d
616	zip1	v25.2d,v6.2d,v7.2d
617	zip2	v29.2d,v6.2d,v7.2d
618
619	zip1	v4.4s,v18.4s,v22.4s
620	add	w5,w5,w22		// accumulate key block
621	zip1	v5.4s,v26.4s,v30.4s
622	add	x6,x6,x22,lsr#32
623	zip2	v6.4s,v18.4s,v22.4s
624	add	w7,w7,w23
625	zip2	v7.4s,v26.4s,v30.4s
626	add	x8,x8,x23,lsr#32
627	zip1	v18.2d,v4.2d,v5.2d
628	add	w9,w9,w24
629	zip2	v22.2d,v4.2d,v5.2d
630	add	x10,x10,x24,lsr#32
631	zip1	v26.2d,v6.2d,v7.2d
632	add	w11,w11,w25
633	zip2	v30.2d,v6.2d,v7.2d
634	add	x12,x12,x25,lsr#32
635
636	zip1	v4.4s,v19.4s,v23.4s
637	add	w13,w13,w26
638	zip1	v5.4s,v27.4s,v31.4s
639	add	x14,x14,x26,lsr#32
640	zip2	v6.4s,v19.4s,v23.4s
641	add	w15,w15,w27
642	zip2	v7.4s,v27.4s,v31.4s
643	add	x16,x16,x27,lsr#32
644	zip1	v19.2d,v4.2d,v5.2d
645	add	w17,w17,w28
646	zip2	v23.2d,v4.2d,v5.2d
647	add	x19,x19,x28,lsr#32
648	zip1	v27.2d,v6.2d,v7.2d
649	add	w20,w20,w30
650	zip2	v31.2d,v6.2d,v7.2d
651	add	x21,x21,x30,lsr#32
652
653	b.lo	.Ltail_neon
654
655	add	x5,x5,x6,lsl#32	// pack
656	add	x7,x7,x8,lsl#32
657	ldp	x6,x8,[x1,#0]		// load input
658	add	v16.4s,v16.4s,v0.4s			// accumulate key block
659	add	x9,x9,x10,lsl#32
660	add	x11,x11,x12,lsl#32
661	ldp	x10,x12,[x1,#16]
662	add	v17.4s,v17.4s,v1.4s
663	add	x13,x13,x14,lsl#32
664	add	x15,x15,x16,lsl#32
665	ldp	x14,x16,[x1,#32]
666	add	v18.4s,v18.4s,v2.4s
667	add	x17,x17,x19,lsl#32
668	add	x20,x20,x21,lsl#32
669	ldp	x19,x21,[x1,#48]
670	add	v19.4s,v19.4s,v3.4s
671	add	x1,x1,#64
672#ifdef	__AARCH64EB__
673	rev	x5,x5
674	rev	x7,x7
675	rev	x9,x9
676	rev	x11,x11
677	rev	x13,x13
678	rev	x15,x15
679	rev	x17,x17
680	rev	x20,x20
681#endif
682	ld1	{v4.16b,v5.16b,v6.16b,v7.16b},[x1],#64
683	eor	x5,x5,x6
684	add	v20.4s,v20.4s,v0.4s
685	eor	x7,x7,x8
686	add	v21.4s,v21.4s,v1.4s
687	eor	x9,x9,x10
688	add	v22.4s,v22.4s,v2.4s
689	eor	x11,x11,x12
690	add	v23.4s,v23.4s,v3.4s
691	eor	x13,x13,x14
692	eor	v16.16b,v16.16b,v4.16b
693	movi	v4.4s,#5
694	eor	x15,x15,x16
695	eor	v17.16b,v17.16b,v5.16b
696	eor	x17,x17,x19
697	eor	v18.16b,v18.16b,v6.16b
698	eor	x20,x20,x21
699	eor	v19.16b,v19.16b,v7.16b
700	add	v8.4s,v8.4s,v4.4s			// += 5
701	ld1	{v4.16b,v5.16b,v6.16b,v7.16b},[x1],#64
702
703	stp	x5,x7,[x0,#0]		// store output
704	add	x28,x28,#5			// increment counter
705	stp	x9,x11,[x0,#16]
706	stp	x13,x15,[x0,#32]
707	stp	x17,x20,[x0,#48]
708	add	x0,x0,#64
709
710	st1	{v16.16b,v17.16b,v18.16b,v19.16b},[x0],#64
711	add	v24.4s,v24.4s,v0.4s
712	add	v25.4s,v25.4s,v1.4s
713	add	v26.4s,v26.4s,v2.4s
714	add	v27.4s,v27.4s,v3.4s
715	ld1	{v16.16b,v17.16b,v18.16b,v19.16b},[x1],#64
716
717	eor	v20.16b,v20.16b,v4.16b
718	eor	v21.16b,v21.16b,v5.16b
719	eor	v22.16b,v22.16b,v6.16b
720	eor	v23.16b,v23.16b,v7.16b
721	st1	{v20.16b,v21.16b,v22.16b,v23.16b},[x0],#64
722	add	v28.4s,v28.4s,v0.4s
723	add	v29.4s,v29.4s,v1.4s
724	add	v30.4s,v30.4s,v2.4s
725	add	v31.4s,v31.4s,v3.4s
726	ld1	{v20.16b,v21.16b,v22.16b,v23.16b},[x1],#64
727
728	eor	v24.16b,v24.16b,v16.16b
729	eor	v25.16b,v25.16b,v17.16b
730	eor	v26.16b,v26.16b,v18.16b
731	eor	v27.16b,v27.16b,v19.16b
732	st1	{v24.16b,v25.16b,v26.16b,v27.16b},[x0],#64
733
734	eor	v28.16b,v28.16b,v20.16b
735	eor	v29.16b,v29.16b,v21.16b
736	eor	v30.16b,v30.16b,v22.16b
737	eor	v31.16b,v31.16b,v23.16b
738	st1	{v28.16b,v29.16b,v30.16b,v31.16b},[x0],#64
739
740	b.hi	.Loop_outer_neon
741
742	ldp	d8,d9,[sp]			// meet ABI requirements
743
744	ldp	x19,x20,[x29,#16]
745	add	sp,sp,#64
746	ldp	x21,x22,[x29,#32]
747	ldp	x23,x24,[x29,#48]
748	ldp	x25,x26,[x29,#64]
749	ldp	x27,x28,[x29,#80]
750	ldp	x29,x30,[sp],#96
751	AARCH64_VALIDATE_LINK_REGISTER
752	ret
753
754.align	4
755.Ltail_neon:
756	add	x2,x2,#320
757	ldp	d8,d9,[sp]			// meet ABI requirements
758	cmp	x2,#64
759	b.lo	.Less_than_64
760
761	add	x5,x5,x6,lsl#32	// pack
762	add	x7,x7,x8,lsl#32
763	ldp	x6,x8,[x1,#0]		// load input
764	add	x9,x9,x10,lsl#32
765	add	x11,x11,x12,lsl#32
766	ldp	x10,x12,[x1,#16]
767	add	x13,x13,x14,lsl#32
768	add	x15,x15,x16,lsl#32
769	ldp	x14,x16,[x1,#32]
770	add	x17,x17,x19,lsl#32
771	add	x20,x20,x21,lsl#32
772	ldp	x19,x21,[x1,#48]
773	add	x1,x1,#64
774#ifdef	__AARCH64EB__
775	rev	x5,x5
776	rev	x7,x7
777	rev	x9,x9
778	rev	x11,x11
779	rev	x13,x13
780	rev	x15,x15
781	rev	x17,x17
782	rev	x20,x20
783#endif
784	eor	x5,x5,x6
785	eor	x7,x7,x8
786	eor	x9,x9,x10
787	eor	x11,x11,x12
788	eor	x13,x13,x14
789	eor	x15,x15,x16
790	eor	x17,x17,x19
791	eor	x20,x20,x21
792
793	stp	x5,x7,[x0,#0]		// store output
794	add	v16.4s,v16.4s,v0.4s			// accumulate key block
795	stp	x9,x11,[x0,#16]
796	add	v17.4s,v17.4s,v1.4s
797	stp	x13,x15,[x0,#32]
798	add	v18.4s,v18.4s,v2.4s
799	stp	x17,x20,[x0,#48]
800	add	v19.4s,v19.4s,v3.4s
801	add	x0,x0,#64
802	b.eq	.Ldone_neon
803	sub	x2,x2,#64
804	cmp	x2,#64
805	b.lo	.Last_neon
806
807	ld1	{v4.16b,v5.16b,v6.16b,v7.16b},[x1],#64
808	eor	v16.16b,v16.16b,v4.16b
809	eor	v17.16b,v17.16b,v5.16b
810	eor	v18.16b,v18.16b,v6.16b
811	eor	v19.16b,v19.16b,v7.16b
812	st1	{v16.16b,v17.16b,v18.16b,v19.16b},[x0],#64
813	b.eq	.Ldone_neon
814
815	add	v16.4s,v20.4s,v0.4s
816	add	v17.4s,v21.4s,v1.4s
817	sub	x2,x2,#64
818	add	v18.4s,v22.4s,v2.4s
819	cmp	x2,#64
820	add	v19.4s,v23.4s,v3.4s
821	b.lo	.Last_neon
822
823	ld1	{v4.16b,v5.16b,v6.16b,v7.16b},[x1],#64
824	eor	v20.16b,v16.16b,v4.16b
825	eor	v21.16b,v17.16b,v5.16b
826	eor	v22.16b,v18.16b,v6.16b
827	eor	v23.16b,v19.16b,v7.16b
828	st1	{v20.16b,v21.16b,v22.16b,v23.16b},[x0],#64
829	b.eq	.Ldone_neon
830
831	add	v16.4s,v24.4s,v0.4s
832	add	v17.4s,v25.4s,v1.4s
833	sub	x2,x2,#64
834	add	v18.4s,v26.4s,v2.4s
835	cmp	x2,#64
836	add	v19.4s,v27.4s,v3.4s
837	b.lo	.Last_neon
838
839	ld1	{v4.16b,v5.16b,v6.16b,v7.16b},[x1],#64
840	eor	v24.16b,v16.16b,v4.16b
841	eor	v25.16b,v17.16b,v5.16b
842	eor	v26.16b,v18.16b,v6.16b
843	eor	v27.16b,v19.16b,v7.16b
844	st1	{v24.16b,v25.16b,v26.16b,v27.16b},[x0],#64
845	b.eq	.Ldone_neon
846
847	add	v16.4s,v28.4s,v0.4s
848	add	v17.4s,v29.4s,v1.4s
849	add	v18.4s,v30.4s,v2.4s
850	add	v19.4s,v31.4s,v3.4s
851	sub	x2,x2,#64
852
853.Last_neon:
854	st1	{v16.16b,v17.16b,v18.16b,v19.16b},[sp]
855
856	sub	x0,x0,#1
857	add	x1,x1,x2
858	add	x0,x0,x2
859	add	x4,sp,x2
860	neg	x2,x2
861
862.Loop_tail_neon:
863	ldrb	w10,[x1,x2]
864	ldrb	w11,[x4,x2]
865	add	x2,x2,#1
866	eor	w10,w10,w11
867	strb	w10,[x0,x2]
868	cbnz	x2,.Loop_tail_neon
869
870	stp	xzr,xzr,[sp,#0]
871	stp	xzr,xzr,[sp,#16]
872	stp	xzr,xzr,[sp,#32]
873	stp	xzr,xzr,[sp,#48]
874
875.Ldone_neon:
876	ldp	x19,x20,[x29,#16]
877	add	sp,sp,#64
878	ldp	x21,x22,[x29,#32]
879	ldp	x23,x24,[x29,#48]
880	ldp	x25,x26,[x29,#64]
881	ldp	x27,x28,[x29,#80]
882	ldp	x29,x30,[sp],#96
883	AARCH64_VALIDATE_LINK_REGISTER
884	ret
885.size	ChaCha20_neon,.-ChaCha20_neon
886.type	ChaCha20_512_neon,%function
887.align	5
888ChaCha20_512_neon:
889	AARCH64_SIGN_LINK_REGISTER
890	stp	x29,x30,[sp,#-96]!
891	add	x29,sp,#0
892
893	adr	x5,.Lsigma
894	stp	x19,x20,[sp,#16]
895	stp	x21,x22,[sp,#32]
896	stp	x23,x24,[sp,#48]
897	stp	x25,x26,[sp,#64]
898	stp	x27,x28,[sp,#80]
899
900.L512_or_more_neon:
901	sub	sp,sp,#128+64
902
903	eor	v7.16b,v7.16b,v7.16b
904	ldp	x22,x23,[x5]		// load sigma
905	ld1	{v0.4s},[x5],#16
906	ldp	x24,x25,[x3]		// load key
907	ldp	x26,x27,[x3,#16]
908	ld1	{v1.4s,v2.4s},[x3]
909	ldp	x28,x30,[x4]		// load counter
910	ld1	{v3.4s},[x4]
911	ld1	{v7.s}[0],[x5]
912	add	x3,x5,#16			// .Lrot24
913#ifdef	__AARCH64EB__
914	rev64	v0.4s,v0.4s
915	ror	x24,x24,#32
916	ror	x25,x25,#32
917	ror	x26,x26,#32
918	ror	x27,x27,#32
919	ror	x28,x28,#32
920	ror	x30,x30,#32
921#endif
922	add	v3.4s,v3.4s,v7.4s		// += 1
923	stp	q0,q1,[sp,#0]		// off-load key block, invariant part
924	add	v3.4s,v3.4s,v7.4s		// not typo
925	str	q2,[sp,#32]
926	add	v4.4s,v3.4s,v7.4s
927	add	v5.4s,v4.4s,v7.4s
928	add	v6.4s,v5.4s,v7.4s
929	shl	v7.4s,v7.4s,#2			// 1 -> 4
930
931	stp	d8,d9,[sp,#128+0]		// meet ABI requirements
932	stp	d10,d11,[sp,#128+16]
933	stp	d12,d13,[sp,#128+32]
934	stp	d14,d15,[sp,#128+48]
935
936	sub	x2,x2,#512			// not typo
937
938.Loop_outer_512_neon:
939	mov	v8.16b,v0.16b
940	mov	v12.16b,v0.16b
941	mov	v16.16b,v0.16b
942	mov	v20.16b,v0.16b
943	mov	v24.16b,v0.16b
944	mov	v28.16b,v0.16b
945	mov	v9.16b,v1.16b
946	mov	w5,w22			// unpack key block
947	mov	v13.16b,v1.16b
948	lsr	x6,x22,#32
949	mov	v17.16b,v1.16b
950	mov	w7,w23
951	mov	v21.16b,v1.16b
952	lsr	x8,x23,#32
953	mov	v25.16b,v1.16b
954	mov	w9,w24
955	mov	v29.16b,v1.16b
956	lsr	x10,x24,#32
957	mov	v11.16b,v3.16b
958	mov	w11,w25
959	mov	v15.16b,v4.16b
960	lsr	x12,x25,#32
961	mov	v19.16b,v5.16b
962	mov	w13,w26
963	mov	v23.16b,v6.16b
964	lsr	x14,x26,#32
965	mov	v10.16b,v2.16b
966	mov	w15,w27
967	mov	v14.16b,v2.16b
968	lsr	x16,x27,#32
969	add	v27.4s,v11.4s,v7.4s			// +4
970	mov	w17,w28
971	add	v31.4s,v15.4s,v7.4s			// +4
972	lsr	x19,x28,#32
973	mov	v18.16b,v2.16b
974	mov	w20,w30
975	mov	v22.16b,v2.16b
976	lsr	x21,x30,#32
977	mov	v26.16b,v2.16b
978	stp	q3,q4,[sp,#48]		// off-load key block, variable part
979	mov	v30.16b,v2.16b
980	stp	q5,q6,[sp,#80]
981
982	mov	x4,#5
983	ld1	{v6.4s},[x3]
984	subs	x2,x2,#512
985.Loop_upper_neon:
986	sub	x4,x4,#1
987	add	v8.4s,v8.4s,v9.4s
988	add	w5,w5,w9
989	add	v12.4s,v12.4s,v13.4s
990	add	w6,w6,w10
991	add	v16.4s,v16.4s,v17.4s
992	add	w7,w7,w11
993	add	v20.4s,v20.4s,v21.4s
994	add	w8,w8,w12
995	add	v24.4s,v24.4s,v25.4s
996	eor	w17,w17,w5
997	add	v28.4s,v28.4s,v29.4s
998	eor	w19,w19,w6
999	eor	v11.16b,v11.16b,v8.16b
1000	eor	w20,w20,w7
1001	eor	v15.16b,v15.16b,v12.16b
1002	eor	w21,w21,w8
1003	eor	v19.16b,v19.16b,v16.16b
1004	ror	w17,w17,#16
1005	eor	v23.16b,v23.16b,v20.16b
1006	ror	w19,w19,#16
1007	eor	v27.16b,v27.16b,v24.16b
1008	ror	w20,w20,#16
1009	eor	v31.16b,v31.16b,v28.16b
1010	ror	w21,w21,#16
1011	rev32	v11.8h,v11.8h
1012	add	w13,w13,w17
1013	rev32	v15.8h,v15.8h
1014	add	w14,w14,w19
1015	rev32	v19.8h,v19.8h
1016	add	w15,w15,w20
1017	rev32	v23.8h,v23.8h
1018	add	w16,w16,w21
1019	rev32	v27.8h,v27.8h
1020	eor	w9,w9,w13
1021	rev32	v31.8h,v31.8h
1022	eor	w10,w10,w14
1023	add	v10.4s,v10.4s,v11.4s
1024	eor	w11,w11,w15
1025	add	v14.4s,v14.4s,v15.4s
1026	eor	w12,w12,w16
1027	add	v18.4s,v18.4s,v19.4s
1028	ror	w9,w9,#20
1029	add	v22.4s,v22.4s,v23.4s
1030	ror	w10,w10,#20
1031	add	v26.4s,v26.4s,v27.4s
1032	ror	w11,w11,#20
1033	add	v30.4s,v30.4s,v31.4s
1034	ror	w12,w12,#20
1035	eor	v0.16b,v9.16b,v10.16b
1036	add	w5,w5,w9
1037	eor	v1.16b,v13.16b,v14.16b
1038	add	w6,w6,w10
1039	eor	v2.16b,v17.16b,v18.16b
1040	add	w7,w7,w11
1041	eor	v3.16b,v21.16b,v22.16b
1042	add	w8,w8,w12
1043	eor	v4.16b,v25.16b,v26.16b
1044	eor	w17,w17,w5
1045	eor	v5.16b,v29.16b,v30.16b
1046	eor	w19,w19,w6
1047	ushr	v9.4s,v0.4s,#20
1048	eor	w20,w20,w7
1049	ushr	v13.4s,v1.4s,#20
1050	eor	w21,w21,w8
1051	ushr	v17.4s,v2.4s,#20
1052	ror	w17,w17,#24
1053	ushr	v21.4s,v3.4s,#20
1054	ror	w19,w19,#24
1055	ushr	v25.4s,v4.4s,#20
1056	ror	w20,w20,#24
1057	ushr	v29.4s,v5.4s,#20
1058	ror	w21,w21,#24
1059	sli	v9.4s,v0.4s,#12
1060	add	w13,w13,w17
1061	sli	v13.4s,v1.4s,#12
1062	add	w14,w14,w19
1063	sli	v17.4s,v2.4s,#12
1064	add	w15,w15,w20
1065	sli	v21.4s,v3.4s,#12
1066	add	w16,w16,w21
1067	sli	v25.4s,v4.4s,#12
1068	eor	w9,w9,w13
1069	sli	v29.4s,v5.4s,#12
1070	eor	w10,w10,w14
1071	add	v8.4s,v8.4s,v9.4s
1072	eor	w11,w11,w15
1073	add	v12.4s,v12.4s,v13.4s
1074	eor	w12,w12,w16
1075	add	v16.4s,v16.4s,v17.4s
1076	ror	w9,w9,#25
1077	add	v20.4s,v20.4s,v21.4s
1078	ror	w10,w10,#25
1079	add	v24.4s,v24.4s,v25.4s
1080	ror	w11,w11,#25
1081	add	v28.4s,v28.4s,v29.4s
1082	ror	w12,w12,#25
1083	eor	v11.16b,v11.16b,v8.16b
1084	add	w5,w5,w10
1085	eor	v15.16b,v15.16b,v12.16b
1086	add	w6,w6,w11
1087	eor	v19.16b,v19.16b,v16.16b
1088	add	w7,w7,w12
1089	eor	v23.16b,v23.16b,v20.16b
1090	add	w8,w8,w9
1091	eor	v27.16b,v27.16b,v24.16b
1092	eor	w21,w21,w5
1093	eor	v31.16b,v31.16b,v28.16b
1094	eor	w17,w17,w6
1095	tbl	v11.16b,{v11.16b},v6.16b
1096	eor	w19,w19,w7
1097	tbl	v15.16b,{v15.16b},v6.16b
1098	eor	w20,w20,w8
1099	tbl	v19.16b,{v19.16b},v6.16b
1100	ror	w21,w21,#16
1101	tbl	v23.16b,{v23.16b},v6.16b
1102	ror	w17,w17,#16
1103	tbl	v27.16b,{v27.16b},v6.16b
1104	ror	w19,w19,#16
1105	tbl	v31.16b,{v31.16b},v6.16b
1106	ror	w20,w20,#16
1107	add	v10.4s,v10.4s,v11.4s
1108	add	w15,w15,w21
1109	add	v14.4s,v14.4s,v15.4s
1110	add	w16,w16,w17
1111	add	v18.4s,v18.4s,v19.4s
1112	add	w13,w13,w19
1113	add	v22.4s,v22.4s,v23.4s
1114	add	w14,w14,w20
1115	add	v26.4s,v26.4s,v27.4s
1116	eor	w10,w10,w15
1117	add	v30.4s,v30.4s,v31.4s
1118	eor	w11,w11,w16
1119	eor	v0.16b,v9.16b,v10.16b
1120	eor	w12,w12,w13
1121	eor	v1.16b,v13.16b,v14.16b
1122	eor	w9,w9,w14
1123	eor	v2.16b,v17.16b,v18.16b
1124	ror	w10,w10,#20
1125	eor	v3.16b,v21.16b,v22.16b
1126	ror	w11,w11,#20
1127	eor	v4.16b,v25.16b,v26.16b
1128	ror	w12,w12,#20
1129	eor	v5.16b,v29.16b,v30.16b
1130	ror	w9,w9,#20
1131	ushr	v9.4s,v0.4s,#25
1132	add	w5,w5,w10
1133	ushr	v13.4s,v1.4s,#25
1134	add	w6,w6,w11
1135	ushr	v17.4s,v2.4s,#25
1136	add	w7,w7,w12
1137	ushr	v21.4s,v3.4s,#25
1138	add	w8,w8,w9
1139	ushr	v25.4s,v4.4s,#25
1140	eor	w21,w21,w5
1141	ushr	v29.4s,v5.4s,#25
1142	eor	w17,w17,w6
1143	sli	v9.4s,v0.4s,#7
1144	eor	w19,w19,w7
1145	sli	v13.4s,v1.4s,#7
1146	eor	w20,w20,w8
1147	sli	v17.4s,v2.4s,#7
1148	ror	w21,w21,#24
1149	sli	v21.4s,v3.4s,#7
1150	ror	w17,w17,#24
1151	sli	v25.4s,v4.4s,#7
1152	ror	w19,w19,#24
1153	sli	v29.4s,v5.4s,#7
1154	ror	w20,w20,#24
1155	ext	v10.16b,v10.16b,v10.16b,#8
1156	add	w15,w15,w21
1157	ext	v14.16b,v14.16b,v14.16b,#8
1158	add	w16,w16,w17
1159	ext	v18.16b,v18.16b,v18.16b,#8
1160	add	w13,w13,w19
1161	ext	v22.16b,v22.16b,v22.16b,#8
1162	add	w14,w14,w20
1163	ext	v26.16b,v26.16b,v26.16b,#8
1164	eor	w10,w10,w15
1165	ext	v30.16b,v30.16b,v30.16b,#8
1166	eor	w11,w11,w16
1167	ext	v11.16b,v11.16b,v11.16b,#12
1168	eor	w12,w12,w13
1169	ext	v15.16b,v15.16b,v15.16b,#12
1170	eor	w9,w9,w14
1171	ext	v19.16b,v19.16b,v19.16b,#12
1172	ror	w10,w10,#25
1173	ext	v23.16b,v23.16b,v23.16b,#12
1174	ror	w11,w11,#25
1175	ext	v27.16b,v27.16b,v27.16b,#12
1176	ror	w12,w12,#25
1177	ext	v31.16b,v31.16b,v31.16b,#12
1178	ror	w9,w9,#25
1179	ext	v9.16b,v9.16b,v9.16b,#4
1180	ext	v13.16b,v13.16b,v13.16b,#4
1181	ext	v17.16b,v17.16b,v17.16b,#4
1182	ext	v21.16b,v21.16b,v21.16b,#4
1183	ext	v25.16b,v25.16b,v25.16b,#4
1184	ext	v29.16b,v29.16b,v29.16b,#4
1185	add	v8.4s,v8.4s,v9.4s
1186	add	w5,w5,w9
1187	add	v12.4s,v12.4s,v13.4s
1188	add	w6,w6,w10
1189	add	v16.4s,v16.4s,v17.4s
1190	add	w7,w7,w11
1191	add	v20.4s,v20.4s,v21.4s
1192	add	w8,w8,w12
1193	add	v24.4s,v24.4s,v25.4s
1194	eor	w17,w17,w5
1195	add	v28.4s,v28.4s,v29.4s
1196	eor	w19,w19,w6
1197	eor	v11.16b,v11.16b,v8.16b
1198	eor	w20,w20,w7
1199	eor	v15.16b,v15.16b,v12.16b
1200	eor	w21,w21,w8
1201	eor	v19.16b,v19.16b,v16.16b
1202	ror	w17,w17,#16
1203	eor	v23.16b,v23.16b,v20.16b
1204	ror	w19,w19,#16
1205	eor	v27.16b,v27.16b,v24.16b
1206	ror	w20,w20,#16
1207	eor	v31.16b,v31.16b,v28.16b
1208	ror	w21,w21,#16
1209	rev32	v11.8h,v11.8h
1210	add	w13,w13,w17
1211	rev32	v15.8h,v15.8h
1212	add	w14,w14,w19
1213	rev32	v19.8h,v19.8h
1214	add	w15,w15,w20
1215	rev32	v23.8h,v23.8h
1216	add	w16,w16,w21
1217	rev32	v27.8h,v27.8h
1218	eor	w9,w9,w13
1219	rev32	v31.8h,v31.8h
1220	eor	w10,w10,w14
1221	add	v10.4s,v10.4s,v11.4s
1222	eor	w11,w11,w15
1223	add	v14.4s,v14.4s,v15.4s
1224	eor	w12,w12,w16
1225	add	v18.4s,v18.4s,v19.4s
1226	ror	w9,w9,#20
1227	add	v22.4s,v22.4s,v23.4s
1228	ror	w10,w10,#20
1229	add	v26.4s,v26.4s,v27.4s
1230	ror	w11,w11,#20
1231	add	v30.4s,v30.4s,v31.4s
1232	ror	w12,w12,#20
1233	eor	v0.16b,v9.16b,v10.16b
1234	add	w5,w5,w9
1235	eor	v1.16b,v13.16b,v14.16b
1236	add	w6,w6,w10
1237	eor	v2.16b,v17.16b,v18.16b
1238	add	w7,w7,w11
1239	eor	v3.16b,v21.16b,v22.16b
1240	add	w8,w8,w12
1241	eor	v4.16b,v25.16b,v26.16b
1242	eor	w17,w17,w5
1243	eor	v5.16b,v29.16b,v30.16b
1244	eor	w19,w19,w6
1245	ushr	v9.4s,v0.4s,#20
1246	eor	w20,w20,w7
1247	ushr	v13.4s,v1.4s,#20
1248	eor	w21,w21,w8
1249	ushr	v17.4s,v2.4s,#20
1250	ror	w17,w17,#24
1251	ushr	v21.4s,v3.4s,#20
1252	ror	w19,w19,#24
1253	ushr	v25.4s,v4.4s,#20
1254	ror	w20,w20,#24
1255	ushr	v29.4s,v5.4s,#20
1256	ror	w21,w21,#24
1257	sli	v9.4s,v0.4s,#12
1258	add	w13,w13,w17
1259	sli	v13.4s,v1.4s,#12
1260	add	w14,w14,w19
1261	sli	v17.4s,v2.4s,#12
1262	add	w15,w15,w20
1263	sli	v21.4s,v3.4s,#12
1264	add	w16,w16,w21
1265	sli	v25.4s,v4.4s,#12
1266	eor	w9,w9,w13
1267	sli	v29.4s,v5.4s,#12
1268	eor	w10,w10,w14
1269	add	v8.4s,v8.4s,v9.4s
1270	eor	w11,w11,w15
1271	add	v12.4s,v12.4s,v13.4s
1272	eor	w12,w12,w16
1273	add	v16.4s,v16.4s,v17.4s
1274	ror	w9,w9,#25
1275	add	v20.4s,v20.4s,v21.4s
1276	ror	w10,w10,#25
1277	add	v24.4s,v24.4s,v25.4s
1278	ror	w11,w11,#25
1279	add	v28.4s,v28.4s,v29.4s
1280	ror	w12,w12,#25
1281	eor	v11.16b,v11.16b,v8.16b
1282	add	w5,w5,w10
1283	eor	v15.16b,v15.16b,v12.16b
1284	add	w6,w6,w11
1285	eor	v19.16b,v19.16b,v16.16b
1286	add	w7,w7,w12
1287	eor	v23.16b,v23.16b,v20.16b
1288	add	w8,w8,w9
1289	eor	v27.16b,v27.16b,v24.16b
1290	eor	w21,w21,w5
1291	eor	v31.16b,v31.16b,v28.16b
1292	eor	w17,w17,w6
1293	tbl	v11.16b,{v11.16b},v6.16b
1294	eor	w19,w19,w7
1295	tbl	v15.16b,{v15.16b},v6.16b
1296	eor	w20,w20,w8
1297	tbl	v19.16b,{v19.16b},v6.16b
1298	ror	w21,w21,#16
1299	tbl	v23.16b,{v23.16b},v6.16b
1300	ror	w17,w17,#16
1301	tbl	v27.16b,{v27.16b},v6.16b
1302	ror	w19,w19,#16
1303	tbl	v31.16b,{v31.16b},v6.16b
1304	ror	w20,w20,#16
1305	add	v10.4s,v10.4s,v11.4s
1306	add	w15,w15,w21
1307	add	v14.4s,v14.4s,v15.4s
1308	add	w16,w16,w17
1309	add	v18.4s,v18.4s,v19.4s
1310	add	w13,w13,w19
1311	add	v22.4s,v22.4s,v23.4s
1312	add	w14,w14,w20
1313	add	v26.4s,v26.4s,v27.4s
1314	eor	w10,w10,w15
1315	add	v30.4s,v30.4s,v31.4s
1316	eor	w11,w11,w16
1317	eor	v0.16b,v9.16b,v10.16b
1318	eor	w12,w12,w13
1319	eor	v1.16b,v13.16b,v14.16b
1320	eor	w9,w9,w14
1321	eor	v2.16b,v17.16b,v18.16b
1322	ror	w10,w10,#20
1323	eor	v3.16b,v21.16b,v22.16b
1324	ror	w11,w11,#20
1325	eor	v4.16b,v25.16b,v26.16b
1326	ror	w12,w12,#20
1327	eor	v5.16b,v29.16b,v30.16b
1328	ror	w9,w9,#20
1329	ushr	v9.4s,v0.4s,#25
1330	add	w5,w5,w10
1331	ushr	v13.4s,v1.4s,#25
1332	add	w6,w6,w11
1333	ushr	v17.4s,v2.4s,#25
1334	add	w7,w7,w12
1335	ushr	v21.4s,v3.4s,#25
1336	add	w8,w8,w9
1337	ushr	v25.4s,v4.4s,#25
1338	eor	w21,w21,w5
1339	ushr	v29.4s,v5.4s,#25
1340	eor	w17,w17,w6
1341	sli	v9.4s,v0.4s,#7
1342	eor	w19,w19,w7
1343	sli	v13.4s,v1.4s,#7
1344	eor	w20,w20,w8
1345	sli	v17.4s,v2.4s,#7
1346	ror	w21,w21,#24
1347	sli	v21.4s,v3.4s,#7
1348	ror	w17,w17,#24
1349	sli	v25.4s,v4.4s,#7
1350	ror	w19,w19,#24
1351	sli	v29.4s,v5.4s,#7
1352	ror	w20,w20,#24
1353	ext	v10.16b,v10.16b,v10.16b,#8
1354	add	w15,w15,w21
1355	ext	v14.16b,v14.16b,v14.16b,#8
1356	add	w16,w16,w17
1357	ext	v18.16b,v18.16b,v18.16b,#8
1358	add	w13,w13,w19
1359	ext	v22.16b,v22.16b,v22.16b,#8
1360	add	w14,w14,w20
1361	ext	v26.16b,v26.16b,v26.16b,#8
1362	eor	w10,w10,w15
1363	ext	v30.16b,v30.16b,v30.16b,#8
1364	eor	w11,w11,w16
1365	ext	v11.16b,v11.16b,v11.16b,#4
1366	eor	w12,w12,w13
1367	ext	v15.16b,v15.16b,v15.16b,#4
1368	eor	w9,w9,w14
1369	ext	v19.16b,v19.16b,v19.16b,#4
1370	ror	w10,w10,#25
1371	ext	v23.16b,v23.16b,v23.16b,#4
1372	ror	w11,w11,#25
1373	ext	v27.16b,v27.16b,v27.16b,#4
1374	ror	w12,w12,#25
1375	ext	v31.16b,v31.16b,v31.16b,#4
1376	ror	w9,w9,#25
1377	ext	v9.16b,v9.16b,v9.16b,#12
1378	ext	v13.16b,v13.16b,v13.16b,#12
1379	ext	v17.16b,v17.16b,v17.16b,#12
1380	ext	v21.16b,v21.16b,v21.16b,#12
1381	ext	v25.16b,v25.16b,v25.16b,#12
1382	ext	v29.16b,v29.16b,v29.16b,#12
1383	cbnz	x4,.Loop_upper_neon
1384
1385	add	w5,w5,w22		// accumulate key block
1386	add	x6,x6,x22,lsr#32
1387	add	w7,w7,w23
1388	add	x8,x8,x23,lsr#32
1389	add	w9,w9,w24
1390	add	x10,x10,x24,lsr#32
1391	add	w11,w11,w25
1392	add	x12,x12,x25,lsr#32
1393	add	w13,w13,w26
1394	add	x14,x14,x26,lsr#32
1395	add	w15,w15,w27
1396	add	x16,x16,x27,lsr#32
1397	add	w17,w17,w28
1398	add	x19,x19,x28,lsr#32
1399	add	w20,w20,w30
1400	add	x21,x21,x30,lsr#32
1401
1402	add	x5,x5,x6,lsl#32	// pack
1403	add	x7,x7,x8,lsl#32
1404	ldp	x6,x8,[x1,#0]		// load input
1405	add	x9,x9,x10,lsl#32
1406	add	x11,x11,x12,lsl#32
1407	ldp	x10,x12,[x1,#16]
1408	add	x13,x13,x14,lsl#32
1409	add	x15,x15,x16,lsl#32
1410	ldp	x14,x16,[x1,#32]
1411	add	x17,x17,x19,lsl#32
1412	add	x20,x20,x21,lsl#32
1413	ldp	x19,x21,[x1,#48]
1414	add	x1,x1,#64
1415#ifdef	__AARCH64EB__
1416	rev	x5,x5
1417	rev	x7,x7
1418	rev	x9,x9
1419	rev	x11,x11
1420	rev	x13,x13
1421	rev	x15,x15
1422	rev	x17,x17
1423	rev	x20,x20
1424#endif
1425	eor	x5,x5,x6
1426	eor	x7,x7,x8
1427	eor	x9,x9,x10
1428	eor	x11,x11,x12
1429	eor	x13,x13,x14
1430	eor	x15,x15,x16
1431	eor	x17,x17,x19
1432	eor	x20,x20,x21
1433
1434	stp	x5,x7,[x0,#0]		// store output
1435	add	x28,x28,#1			// increment counter
1436	mov	w5,w22			// unpack key block
1437	lsr	x6,x22,#32
1438	stp	x9,x11,[x0,#16]
1439	mov	w7,w23
1440	lsr	x8,x23,#32
1441	stp	x13,x15,[x0,#32]
1442	mov	w9,w24
1443	lsr	x10,x24,#32
1444	stp	x17,x20,[x0,#48]
1445	add	x0,x0,#64
1446	mov	w11,w25
1447	lsr	x12,x25,#32
1448	mov	w13,w26
1449	lsr	x14,x26,#32
1450	mov	w15,w27
1451	lsr	x16,x27,#32
1452	mov	w17,w28
1453	lsr	x19,x28,#32
1454	mov	w20,w30
1455	lsr	x21,x30,#32
1456
1457	mov	x4,#5
1458.Loop_lower_neon:
1459	sub	x4,x4,#1
1460	add	v8.4s,v8.4s,v9.4s
1461	add	w5,w5,w9
1462	add	v12.4s,v12.4s,v13.4s
1463	add	w6,w6,w10
1464	add	v16.4s,v16.4s,v17.4s
1465	add	w7,w7,w11
1466	add	v20.4s,v20.4s,v21.4s
1467	add	w8,w8,w12
1468	add	v24.4s,v24.4s,v25.4s
1469	eor	w17,w17,w5
1470	add	v28.4s,v28.4s,v29.4s
1471	eor	w19,w19,w6
1472	eor	v11.16b,v11.16b,v8.16b
1473	eor	w20,w20,w7
1474	eor	v15.16b,v15.16b,v12.16b
1475	eor	w21,w21,w8
1476	eor	v19.16b,v19.16b,v16.16b
1477	ror	w17,w17,#16
1478	eor	v23.16b,v23.16b,v20.16b
1479	ror	w19,w19,#16
1480	eor	v27.16b,v27.16b,v24.16b
1481	ror	w20,w20,#16
1482	eor	v31.16b,v31.16b,v28.16b
1483	ror	w21,w21,#16
1484	rev32	v11.8h,v11.8h
1485	add	w13,w13,w17
1486	rev32	v15.8h,v15.8h
1487	add	w14,w14,w19
1488	rev32	v19.8h,v19.8h
1489	add	w15,w15,w20
1490	rev32	v23.8h,v23.8h
1491	add	w16,w16,w21
1492	rev32	v27.8h,v27.8h
1493	eor	w9,w9,w13
1494	rev32	v31.8h,v31.8h
1495	eor	w10,w10,w14
1496	add	v10.4s,v10.4s,v11.4s
1497	eor	w11,w11,w15
1498	add	v14.4s,v14.4s,v15.4s
1499	eor	w12,w12,w16
1500	add	v18.4s,v18.4s,v19.4s
1501	ror	w9,w9,#20
1502	add	v22.4s,v22.4s,v23.4s
1503	ror	w10,w10,#20
1504	add	v26.4s,v26.4s,v27.4s
1505	ror	w11,w11,#20
1506	add	v30.4s,v30.4s,v31.4s
1507	ror	w12,w12,#20
1508	eor	v0.16b,v9.16b,v10.16b
1509	add	w5,w5,w9
1510	eor	v1.16b,v13.16b,v14.16b
1511	add	w6,w6,w10
1512	eor	v2.16b,v17.16b,v18.16b
1513	add	w7,w7,w11
1514	eor	v3.16b,v21.16b,v22.16b
1515	add	w8,w8,w12
1516	eor	v4.16b,v25.16b,v26.16b
1517	eor	w17,w17,w5
1518	eor	v5.16b,v29.16b,v30.16b
1519	eor	w19,w19,w6
1520	ushr	v9.4s,v0.4s,#20
1521	eor	w20,w20,w7
1522	ushr	v13.4s,v1.4s,#20
1523	eor	w21,w21,w8
1524	ushr	v17.4s,v2.4s,#20
1525	ror	w17,w17,#24
1526	ushr	v21.4s,v3.4s,#20
1527	ror	w19,w19,#24
1528	ushr	v25.4s,v4.4s,#20
1529	ror	w20,w20,#24
1530	ushr	v29.4s,v5.4s,#20
1531	ror	w21,w21,#24
1532	sli	v9.4s,v0.4s,#12
1533	add	w13,w13,w17
1534	sli	v13.4s,v1.4s,#12
1535	add	w14,w14,w19
1536	sli	v17.4s,v2.4s,#12
1537	add	w15,w15,w20
1538	sli	v21.4s,v3.4s,#12
1539	add	w16,w16,w21
1540	sli	v25.4s,v4.4s,#12
1541	eor	w9,w9,w13
1542	sli	v29.4s,v5.4s,#12
1543	eor	w10,w10,w14
1544	add	v8.4s,v8.4s,v9.4s
1545	eor	w11,w11,w15
1546	add	v12.4s,v12.4s,v13.4s
1547	eor	w12,w12,w16
1548	add	v16.4s,v16.4s,v17.4s
1549	ror	w9,w9,#25
1550	add	v20.4s,v20.4s,v21.4s
1551	ror	w10,w10,#25
1552	add	v24.4s,v24.4s,v25.4s
1553	ror	w11,w11,#25
1554	add	v28.4s,v28.4s,v29.4s
1555	ror	w12,w12,#25
1556	eor	v11.16b,v11.16b,v8.16b
1557	add	w5,w5,w10
1558	eor	v15.16b,v15.16b,v12.16b
1559	add	w6,w6,w11
1560	eor	v19.16b,v19.16b,v16.16b
1561	add	w7,w7,w12
1562	eor	v23.16b,v23.16b,v20.16b
1563	add	w8,w8,w9
1564	eor	v27.16b,v27.16b,v24.16b
1565	eor	w21,w21,w5
1566	eor	v31.16b,v31.16b,v28.16b
1567	eor	w17,w17,w6
1568	tbl	v11.16b,{v11.16b},v6.16b
1569	eor	w19,w19,w7
1570	tbl	v15.16b,{v15.16b},v6.16b
1571	eor	w20,w20,w8
1572	tbl	v19.16b,{v19.16b},v6.16b
1573	ror	w21,w21,#16
1574	tbl	v23.16b,{v23.16b},v6.16b
1575	ror	w17,w17,#16
1576	tbl	v27.16b,{v27.16b},v6.16b
1577	ror	w19,w19,#16
1578	tbl	v31.16b,{v31.16b},v6.16b
1579	ror	w20,w20,#16
1580	add	v10.4s,v10.4s,v11.4s
1581	add	w15,w15,w21
1582	add	v14.4s,v14.4s,v15.4s
1583	add	w16,w16,w17
1584	add	v18.4s,v18.4s,v19.4s
1585	add	w13,w13,w19
1586	add	v22.4s,v22.4s,v23.4s
1587	add	w14,w14,w20
1588	add	v26.4s,v26.4s,v27.4s
1589	eor	w10,w10,w15
1590	add	v30.4s,v30.4s,v31.4s
1591	eor	w11,w11,w16
1592	eor	v0.16b,v9.16b,v10.16b
1593	eor	w12,w12,w13
1594	eor	v1.16b,v13.16b,v14.16b
1595	eor	w9,w9,w14
1596	eor	v2.16b,v17.16b,v18.16b
1597	ror	w10,w10,#20
1598	eor	v3.16b,v21.16b,v22.16b
1599	ror	w11,w11,#20
1600	eor	v4.16b,v25.16b,v26.16b
1601	ror	w12,w12,#20
1602	eor	v5.16b,v29.16b,v30.16b
1603	ror	w9,w9,#20
1604	ushr	v9.4s,v0.4s,#25
1605	add	w5,w5,w10
1606	ushr	v13.4s,v1.4s,#25
1607	add	w6,w6,w11
1608	ushr	v17.4s,v2.4s,#25
1609	add	w7,w7,w12
1610	ushr	v21.4s,v3.4s,#25
1611	add	w8,w8,w9
1612	ushr	v25.4s,v4.4s,#25
1613	eor	w21,w21,w5
1614	ushr	v29.4s,v5.4s,#25
1615	eor	w17,w17,w6
1616	sli	v9.4s,v0.4s,#7
1617	eor	w19,w19,w7
1618	sli	v13.4s,v1.4s,#7
1619	eor	w20,w20,w8
1620	sli	v17.4s,v2.4s,#7
1621	ror	w21,w21,#24
1622	sli	v21.4s,v3.4s,#7
1623	ror	w17,w17,#24
1624	sli	v25.4s,v4.4s,#7
1625	ror	w19,w19,#24
1626	sli	v29.4s,v5.4s,#7
1627	ror	w20,w20,#24
1628	ext	v10.16b,v10.16b,v10.16b,#8
1629	add	w15,w15,w21
1630	ext	v14.16b,v14.16b,v14.16b,#8
1631	add	w16,w16,w17
1632	ext	v18.16b,v18.16b,v18.16b,#8
1633	add	w13,w13,w19
1634	ext	v22.16b,v22.16b,v22.16b,#8
1635	add	w14,w14,w20
1636	ext	v26.16b,v26.16b,v26.16b,#8
1637	eor	w10,w10,w15
1638	ext	v30.16b,v30.16b,v30.16b,#8
1639	eor	w11,w11,w16
1640	ext	v11.16b,v11.16b,v11.16b,#12
1641	eor	w12,w12,w13
1642	ext	v15.16b,v15.16b,v15.16b,#12
1643	eor	w9,w9,w14
1644	ext	v19.16b,v19.16b,v19.16b,#12
1645	ror	w10,w10,#25
1646	ext	v23.16b,v23.16b,v23.16b,#12
1647	ror	w11,w11,#25
1648	ext	v27.16b,v27.16b,v27.16b,#12
1649	ror	w12,w12,#25
1650	ext	v31.16b,v31.16b,v31.16b,#12
1651	ror	w9,w9,#25
1652	ext	v9.16b,v9.16b,v9.16b,#4
1653	ext	v13.16b,v13.16b,v13.16b,#4
1654	ext	v17.16b,v17.16b,v17.16b,#4
1655	ext	v21.16b,v21.16b,v21.16b,#4
1656	ext	v25.16b,v25.16b,v25.16b,#4
1657	ext	v29.16b,v29.16b,v29.16b,#4
1658	add	v8.4s,v8.4s,v9.4s
1659	add	w5,w5,w9
1660	add	v12.4s,v12.4s,v13.4s
1661	add	w6,w6,w10
1662	add	v16.4s,v16.4s,v17.4s
1663	add	w7,w7,w11
1664	add	v20.4s,v20.4s,v21.4s
1665	add	w8,w8,w12
1666	add	v24.4s,v24.4s,v25.4s
1667	eor	w17,w17,w5
1668	add	v28.4s,v28.4s,v29.4s
1669	eor	w19,w19,w6
1670	eor	v11.16b,v11.16b,v8.16b
1671	eor	w20,w20,w7
1672	eor	v15.16b,v15.16b,v12.16b
1673	eor	w21,w21,w8
1674	eor	v19.16b,v19.16b,v16.16b
1675	ror	w17,w17,#16
1676	eor	v23.16b,v23.16b,v20.16b
1677	ror	w19,w19,#16
1678	eor	v27.16b,v27.16b,v24.16b
1679	ror	w20,w20,#16
1680	eor	v31.16b,v31.16b,v28.16b
1681	ror	w21,w21,#16
1682	rev32	v11.8h,v11.8h
1683	add	w13,w13,w17
1684	rev32	v15.8h,v15.8h
1685	add	w14,w14,w19
1686	rev32	v19.8h,v19.8h
1687	add	w15,w15,w20
1688	rev32	v23.8h,v23.8h
1689	add	w16,w16,w21
1690	rev32	v27.8h,v27.8h
1691	eor	w9,w9,w13
1692	rev32	v31.8h,v31.8h
1693	eor	w10,w10,w14
1694	add	v10.4s,v10.4s,v11.4s
1695	eor	w11,w11,w15
1696	add	v14.4s,v14.4s,v15.4s
1697	eor	w12,w12,w16
1698	add	v18.4s,v18.4s,v19.4s
1699	ror	w9,w9,#20
1700	add	v22.4s,v22.4s,v23.4s
1701	ror	w10,w10,#20
1702	add	v26.4s,v26.4s,v27.4s
1703	ror	w11,w11,#20
1704	add	v30.4s,v30.4s,v31.4s
1705	ror	w12,w12,#20
1706	eor	v0.16b,v9.16b,v10.16b
1707	add	w5,w5,w9
1708	eor	v1.16b,v13.16b,v14.16b
1709	add	w6,w6,w10
1710	eor	v2.16b,v17.16b,v18.16b
1711	add	w7,w7,w11
1712	eor	v3.16b,v21.16b,v22.16b
1713	add	w8,w8,w12
1714	eor	v4.16b,v25.16b,v26.16b
1715	eor	w17,w17,w5
1716	eor	v5.16b,v29.16b,v30.16b
1717	eor	w19,w19,w6
1718	ushr	v9.4s,v0.4s,#20
1719	eor	w20,w20,w7
1720	ushr	v13.4s,v1.4s,#20
1721	eor	w21,w21,w8
1722	ushr	v17.4s,v2.4s,#20
1723	ror	w17,w17,#24
1724	ushr	v21.4s,v3.4s,#20
1725	ror	w19,w19,#24
1726	ushr	v25.4s,v4.4s,#20
1727	ror	w20,w20,#24
1728	ushr	v29.4s,v5.4s,#20
1729	ror	w21,w21,#24
1730	sli	v9.4s,v0.4s,#12
1731	add	w13,w13,w17
1732	sli	v13.4s,v1.4s,#12
1733	add	w14,w14,w19
1734	sli	v17.4s,v2.4s,#12
1735	add	w15,w15,w20
1736	sli	v21.4s,v3.4s,#12
1737	add	w16,w16,w21
1738	sli	v25.4s,v4.4s,#12
1739	eor	w9,w9,w13
1740	sli	v29.4s,v5.4s,#12
1741	eor	w10,w10,w14
1742	add	v8.4s,v8.4s,v9.4s
1743	eor	w11,w11,w15
1744	add	v12.4s,v12.4s,v13.4s
1745	eor	w12,w12,w16
1746	add	v16.4s,v16.4s,v17.4s
1747	ror	w9,w9,#25
1748	add	v20.4s,v20.4s,v21.4s
1749	ror	w10,w10,#25
1750	add	v24.4s,v24.4s,v25.4s
1751	ror	w11,w11,#25
1752	add	v28.4s,v28.4s,v29.4s
1753	ror	w12,w12,#25
1754	eor	v11.16b,v11.16b,v8.16b
1755	add	w5,w5,w10
1756	eor	v15.16b,v15.16b,v12.16b
1757	add	w6,w6,w11
1758	eor	v19.16b,v19.16b,v16.16b
1759	add	w7,w7,w12
1760	eor	v23.16b,v23.16b,v20.16b
1761	add	w8,w8,w9
1762	eor	v27.16b,v27.16b,v24.16b
1763	eor	w21,w21,w5
1764	eor	v31.16b,v31.16b,v28.16b
1765	eor	w17,w17,w6
1766	tbl	v11.16b,{v11.16b},v6.16b
1767	eor	w19,w19,w7
1768	tbl	v15.16b,{v15.16b},v6.16b
1769	eor	w20,w20,w8
1770	tbl	v19.16b,{v19.16b},v6.16b
1771	ror	w21,w21,#16
1772	tbl	v23.16b,{v23.16b},v6.16b
1773	ror	w17,w17,#16
1774	tbl	v27.16b,{v27.16b},v6.16b
1775	ror	w19,w19,#16
1776	tbl	v31.16b,{v31.16b},v6.16b
1777	ror	w20,w20,#16
1778	add	v10.4s,v10.4s,v11.4s
1779	add	w15,w15,w21
1780	add	v14.4s,v14.4s,v15.4s
1781	add	w16,w16,w17
1782	add	v18.4s,v18.4s,v19.4s
1783	add	w13,w13,w19
1784	add	v22.4s,v22.4s,v23.4s
1785	add	w14,w14,w20
1786	add	v26.4s,v26.4s,v27.4s
1787	eor	w10,w10,w15
1788	add	v30.4s,v30.4s,v31.4s
1789	eor	w11,w11,w16
1790	eor	v0.16b,v9.16b,v10.16b
1791	eor	w12,w12,w13
1792	eor	v1.16b,v13.16b,v14.16b
1793	eor	w9,w9,w14
1794	eor	v2.16b,v17.16b,v18.16b
1795	ror	w10,w10,#20
1796	eor	v3.16b,v21.16b,v22.16b
1797	ror	w11,w11,#20
1798	eor	v4.16b,v25.16b,v26.16b
1799	ror	w12,w12,#20
1800	eor	v5.16b,v29.16b,v30.16b
1801	ror	w9,w9,#20
1802	ushr	v9.4s,v0.4s,#25
1803	add	w5,w5,w10
1804	ushr	v13.4s,v1.4s,#25
1805	add	w6,w6,w11
1806	ushr	v17.4s,v2.4s,#25
1807	add	w7,w7,w12
1808	ushr	v21.4s,v3.4s,#25
1809	add	w8,w8,w9
1810	ushr	v25.4s,v4.4s,#25
1811	eor	w21,w21,w5
1812	ushr	v29.4s,v5.4s,#25
1813	eor	w17,w17,w6
1814	sli	v9.4s,v0.4s,#7
1815	eor	w19,w19,w7
1816	sli	v13.4s,v1.4s,#7
1817	eor	w20,w20,w8
1818	sli	v17.4s,v2.4s,#7
1819	ror	w21,w21,#24
1820	sli	v21.4s,v3.4s,#7
1821	ror	w17,w17,#24
1822	sli	v25.4s,v4.4s,#7
1823	ror	w19,w19,#24
1824	sli	v29.4s,v5.4s,#7
1825	ror	w20,w20,#24
1826	ext	v10.16b,v10.16b,v10.16b,#8
1827	add	w15,w15,w21
1828	ext	v14.16b,v14.16b,v14.16b,#8
1829	add	w16,w16,w17
1830	ext	v18.16b,v18.16b,v18.16b,#8
1831	add	w13,w13,w19
1832	ext	v22.16b,v22.16b,v22.16b,#8
1833	add	w14,w14,w20
1834	ext	v26.16b,v26.16b,v26.16b,#8
1835	eor	w10,w10,w15
1836	ext	v30.16b,v30.16b,v30.16b,#8
1837	eor	w11,w11,w16
1838	ext	v11.16b,v11.16b,v11.16b,#4
1839	eor	w12,w12,w13
1840	ext	v15.16b,v15.16b,v15.16b,#4
1841	eor	w9,w9,w14
1842	ext	v19.16b,v19.16b,v19.16b,#4
1843	ror	w10,w10,#25
1844	ext	v23.16b,v23.16b,v23.16b,#4
1845	ror	w11,w11,#25
1846	ext	v27.16b,v27.16b,v27.16b,#4
1847	ror	w12,w12,#25
1848	ext	v31.16b,v31.16b,v31.16b,#4
1849	ror	w9,w9,#25
1850	ext	v9.16b,v9.16b,v9.16b,#12
1851	ext	v13.16b,v13.16b,v13.16b,#12
1852	ext	v17.16b,v17.16b,v17.16b,#12
1853	ext	v21.16b,v21.16b,v21.16b,#12
1854	ext	v25.16b,v25.16b,v25.16b,#12
1855	ext	v29.16b,v29.16b,v29.16b,#12
1856	cbnz	x4,.Loop_lower_neon
1857
1858	add	w5,w5,w22		// accumulate key block
1859	ldp	q0,q1,[sp,#0]
1860	add	x6,x6,x22,lsr#32
1861	ldp	q2,q3,[sp,#32]
1862	add	w7,w7,w23
1863	ldp	q4,q5,[sp,#64]
1864	add	x8,x8,x23,lsr#32
1865	ldr	q6,[sp,#96]
1866	add	v8.4s,v8.4s,v0.4s
1867	add	w9,w9,w24
1868	add	v12.4s,v12.4s,v0.4s
1869	add	x10,x10,x24,lsr#32
1870	add	v16.4s,v16.4s,v0.4s
1871	add	w11,w11,w25
1872	add	v20.4s,v20.4s,v0.4s
1873	add	x12,x12,x25,lsr#32
1874	add	v24.4s,v24.4s,v0.4s
1875	add	w13,w13,w26
1876	add	v28.4s,v28.4s,v0.4s
1877	add	x14,x14,x26,lsr#32
1878	add	v10.4s,v10.4s,v2.4s
1879	add	w15,w15,w27
1880	add	v14.4s,v14.4s,v2.4s
1881	add	x16,x16,x27,lsr#32
1882	add	v18.4s,v18.4s,v2.4s
1883	add	w17,w17,w28
1884	add	v22.4s,v22.4s,v2.4s
1885	add	x19,x19,x28,lsr#32
1886	add	v26.4s,v26.4s,v2.4s
1887	add	w20,w20,w30
1888	add	v30.4s,v30.4s,v2.4s
1889	add	x21,x21,x30,lsr#32
1890	add	v27.4s,v27.4s,v7.4s			// +4
1891	add	x5,x5,x6,lsl#32	// pack
1892	add	v31.4s,v31.4s,v7.4s			// +4
1893	add	x7,x7,x8,lsl#32
1894	add	v11.4s,v11.4s,v3.4s
1895	ldp	x6,x8,[x1,#0]		// load input
1896	add	v15.4s,v15.4s,v4.4s
1897	add	x9,x9,x10,lsl#32
1898	add	v19.4s,v19.4s,v5.4s
1899	add	x11,x11,x12,lsl#32
1900	add	v23.4s,v23.4s,v6.4s
1901	ldp	x10,x12,[x1,#16]
1902	add	v27.4s,v27.4s,v3.4s
1903	add	x13,x13,x14,lsl#32
1904	add	v31.4s,v31.4s,v4.4s
1905	add	x15,x15,x16,lsl#32
1906	add	v9.4s,v9.4s,v1.4s
1907	ldp	x14,x16,[x1,#32]
1908	add	v13.4s,v13.4s,v1.4s
1909	add	x17,x17,x19,lsl#32
1910	add	v17.4s,v17.4s,v1.4s
1911	add	x20,x20,x21,lsl#32
1912	add	v21.4s,v21.4s,v1.4s
1913	ldp	x19,x21,[x1,#48]
1914	add	v25.4s,v25.4s,v1.4s
1915	add	x1,x1,#64
1916	add	v29.4s,v29.4s,v1.4s
1917
1918#ifdef	__AARCH64EB__
1919	rev	x5,x5
1920	rev	x7,x7
1921	rev	x9,x9
1922	rev	x11,x11
1923	rev	x13,x13
1924	rev	x15,x15
1925	rev	x17,x17
1926	rev	x20,x20
1927#endif
1928	ld1	{v0.16b,v1.16b,v2.16b,v3.16b},[x1],#64
1929	eor	x5,x5,x6
1930	eor	x7,x7,x8
1931	eor	x9,x9,x10
1932	eor	x11,x11,x12
1933	eor	x13,x13,x14
1934	eor	v8.16b,v8.16b,v0.16b
1935	eor	x15,x15,x16
1936	eor	v9.16b,v9.16b,v1.16b
1937	eor	x17,x17,x19
1938	eor	v10.16b,v10.16b,v2.16b
1939	eor	x20,x20,x21
1940	eor	v11.16b,v11.16b,v3.16b
1941	ld1	{v0.16b,v1.16b,v2.16b,v3.16b},[x1],#64
1942
1943	stp	x5,x7,[x0,#0]		// store output
1944	add	x28,x28,#7			// increment counter
1945	stp	x9,x11,[x0,#16]
1946	stp	x13,x15,[x0,#32]
1947	stp	x17,x20,[x0,#48]
1948	add	x0,x0,#64
1949	st1	{v8.16b,v9.16b,v10.16b,v11.16b},[x0],#64
1950
1951	ld1	{v8.16b,v9.16b,v10.16b,v11.16b},[x1],#64
1952	eor	v12.16b,v12.16b,v0.16b
1953	eor	v13.16b,v13.16b,v1.16b
1954	eor	v14.16b,v14.16b,v2.16b
1955	eor	v15.16b,v15.16b,v3.16b
1956	st1	{v12.16b,v13.16b,v14.16b,v15.16b},[x0],#64
1957
1958	ld1	{v12.16b,v13.16b,v14.16b,v15.16b},[x1],#64
1959	eor	v16.16b,v16.16b,v8.16b
1960	ldp	q0,q1,[sp,#0]
1961	eor	v17.16b,v17.16b,v9.16b
1962	ldp	q2,q3,[sp,#32]
1963	eor	v18.16b,v18.16b,v10.16b
1964	eor	v19.16b,v19.16b,v11.16b
1965	st1	{v16.16b,v17.16b,v18.16b,v19.16b},[x0],#64
1966
1967	ld1	{v16.16b,v17.16b,v18.16b,v19.16b},[x1],#64
1968	eor	v20.16b,v20.16b,v12.16b
1969	eor	v21.16b,v21.16b,v13.16b
1970	eor	v22.16b,v22.16b,v14.16b
1971	eor	v23.16b,v23.16b,v15.16b
1972	st1	{v20.16b,v21.16b,v22.16b,v23.16b},[x0],#64
1973
1974	ld1	{v20.16b,v21.16b,v22.16b,v23.16b},[x1],#64
1975	eor	v24.16b,v24.16b,v16.16b
1976	eor	v25.16b,v25.16b,v17.16b
1977	eor	v26.16b,v26.16b,v18.16b
1978	eor	v27.16b,v27.16b,v19.16b
1979	st1	{v24.16b,v25.16b,v26.16b,v27.16b},[x0],#64
1980
1981	shl	v8.4s,v7.4s,#1			// 4 -> 8
1982	eor	v28.16b,v28.16b,v20.16b
1983	eor	v29.16b,v29.16b,v21.16b
1984	eor	v30.16b,v30.16b,v22.16b
1985	eor	v31.16b,v31.16b,v23.16b
1986	st1	{v28.16b,v29.16b,v30.16b,v31.16b},[x0],#64
1987
1988	add	v3.4s,v3.4s,v8.4s			// += 8
1989	add	v4.4s,v4.4s,v8.4s
1990	add	v5.4s,v5.4s,v8.4s
1991	add	v6.4s,v6.4s,v8.4s
1992
1993	b.hs	.Loop_outer_512_neon
1994
1995	adds	x2,x2,#512
1996	ushr	v7.4s,v7.4s,#1			// 4 -> 2
1997
1998	ldp	d10,d11,[sp,#128+16]		// meet ABI requirements
1999	ldp	d12,d13,[sp,#128+32]
2000	ldp	d14,d15,[sp,#128+48]
2001
2002	stp	q0,q0,[sp,#0]		// wipe off-load area
2003	stp	q0,q0,[sp,#32]
2004	stp	q0,q0,[sp,#64]
2005
2006	b.eq	.Ldone_512_neon
2007
2008	sub	x3,x3,#16			// .Lone
2009	cmp	x2,#192
2010	add	sp,sp,#128
2011	sub	v3.4s,v3.4s,v7.4s		// -= 2
2012	ld1	{v8.4s,v9.4s},[x3]
2013	b.hs	.Loop_outer_neon
2014
2015	ldp	d8,d9,[sp,#0]			// meet ABI requirements
2016	eor	v1.16b,v1.16b,v1.16b
2017	eor	v2.16b,v2.16b,v2.16b
2018	eor	v3.16b,v3.16b,v3.16b
2019	eor	v4.16b,v4.16b,v4.16b
2020	eor	v5.16b,v5.16b,v5.16b
2021	eor	v6.16b,v6.16b,v6.16b
2022	b	.Loop_outer
2023
2024.Ldone_512_neon:
2025	ldp	d8,d9,[sp,#128+0]		// meet ABI requirements
2026	ldp	x19,x20,[x29,#16]
2027	add	sp,sp,#128+64
2028	ldp	x21,x22,[x29,#32]
2029	ldp	x23,x24,[x29,#48]
2030	ldp	x25,x26,[x29,#64]
2031	ldp	x27,x28,[x29,#80]
2032	ldp	x29,x30,[sp],#96
2033	AARCH64_VALIDATE_LINK_REGISTER
2034	ret
2035.size	ChaCha20_512_neon,.-ChaCha20_512_neon
2036