Merge tag 'drm-fixes-5.5-2019-12-12' of git://people.freedesktop.org/~agd5f/linux...
[sfrench/cifs-2.6.git] / arch / arm / crypto / curve25519-core.S
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 .fpu neon
14 .arch armv7-a
15 .align 4
16
17 ENTRY(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}
2062 ENDPROC(curve25519_neon)