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