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