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