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