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