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

source code of linux/arch/arm/crypto/curve25519-core.S