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