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