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