Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/crypto/openssl/arm/armv4-mont.S
39482 views
1
/* Do not modify. This file is auto-generated from armv4-mont.pl. */
2
#include "arm_arch.h"
3
4
#if defined(__thumb2__)
5
.syntax unified
6
.thumb
7
#else
8
.code 32
9
#endif
10
11
.text
12
13
#if __ARM_MAX_ARCH__>=7
14
.align 5
15
.LOPENSSL_armcap:
16
# ifdef _WIN32
17
.word OPENSSL_armcap_P
18
# else
19
.word OPENSSL_armcap_P-.Lbn_mul_mont
20
# endif
21
#endif
22
23
.globl bn_mul_mont
24
.type bn_mul_mont,%function
25
26
.align 5
27
bn_mul_mont:
28
.Lbn_mul_mont:
29
ldr ip,[sp,#4] @ load num
30
stmdb sp!,{r0,r2} @ sp points at argument block
31
#if __ARM_MAX_ARCH__>=7
32
tst ip,#7
33
bne .Lialu
34
ldr r0,.LOPENSSL_armcap
35
#if !defined(_WIN32)
36
adr r2,.Lbn_mul_mont
37
ldr r0,[r0,r2]
38
# endif
39
# if defined(__APPLE__) || defined(_WIN32)
40
ldr r0,[r0]
41
# endif
42
tst r0,#ARMV7_NEON @ NEON available?
43
ldmia sp, {r0,r2}
44
beq .Lialu
45
add sp,sp,#8
46
b bn_mul8x_mont_neon
47
.align 4
48
.Lialu:
49
#endif
50
cmp ip,#2
51
mov r0,ip @ load num
52
#ifdef __thumb2__
53
ittt lt
54
#endif
55
movlt r0,#0
56
addlt sp,sp,#2*4
57
blt .Labrt
58
59
stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} @ save 10 registers
60
61
mov r0,r0,lsl#2 @ rescale r0 for byte count
62
sub sp,sp,r0 @ alloca(4*num)
63
sub sp,sp,#4 @ +extra dword
64
sub r0,r0,#4 @ "num=num-1"
65
add r4,r2,r0 @ &bp[num-1]
66
67
add r0,sp,r0 @ r0 to point at &tp[num-1]
68
ldr r8,[r0,#14*4] @ &n0
69
ldr r2,[r2] @ bp[0]
70
ldr r5,[r1],#4 @ ap[0],ap++
71
ldr r6,[r3],#4 @ np[0],np++
72
ldr r8,[r8] @ *n0
73
str r4,[r0,#15*4] @ save &bp[num]
74
75
umull r10,r11,r5,r2 @ ap[0]*bp[0]
76
str r8,[r0,#14*4] @ save n0 value
77
mul r8,r10,r8 @ "tp[0]"*n0
78
mov r12,#0
79
umlal r10,r12,r6,r8 @ np[0]*n0+"t[0]"
80
mov r4,sp
81
82
.L1st:
83
ldr r5,[r1],#4 @ ap[j],ap++
84
mov r10,r11
85
ldr r6,[r3],#4 @ np[j],np++
86
mov r11,#0
87
umlal r10,r11,r5,r2 @ ap[j]*bp[0]
88
mov r14,#0
89
umlal r12,r14,r6,r8 @ np[j]*n0
90
adds r12,r12,r10
91
str r12,[r4],#4 @ tp[j-1]=,tp++
92
adc r12,r14,#0
93
cmp r4,r0
94
bne .L1st
95
96
adds r12,r12,r11
97
ldr r4,[r0,#13*4] @ restore bp
98
mov r14,#0
99
ldr r8,[r0,#14*4] @ restore n0
100
adc r14,r14,#0
101
str r12,[r0] @ tp[num-1]=
102
mov r7,sp
103
str r14,[r0,#4] @ tp[num]=
104
105
.Louter:
106
sub r7,r0,r7 @ "original" r0-1 value
107
sub r1,r1,r7 @ "rewind" ap to &ap[1]
108
ldr r2,[r4,#4]! @ *(++bp)
109
sub r3,r3,r7 @ "rewind" np to &np[1]
110
ldr r5,[r1,#-4] @ ap[0]
111
ldr r10,[sp] @ tp[0]
112
ldr r6,[r3,#-4] @ np[0]
113
ldr r7,[sp,#4] @ tp[1]
114
115
mov r11,#0
116
umlal r10,r11,r5,r2 @ ap[0]*bp[i]+tp[0]
117
str r4,[r0,#13*4] @ save bp
118
mul r8,r10,r8
119
mov r12,#0
120
umlal r10,r12,r6,r8 @ np[0]*n0+"tp[0]"
121
mov r4,sp
122
123
.Linner:
124
ldr r5,[r1],#4 @ ap[j],ap++
125
adds r10,r11,r7 @ +=tp[j]
126
ldr r6,[r3],#4 @ np[j],np++
127
mov r11,#0
128
umlal r10,r11,r5,r2 @ ap[j]*bp[i]
129
mov r14,#0
130
umlal r12,r14,r6,r8 @ np[j]*n0
131
adc r11,r11,#0
132
ldr r7,[r4,#8] @ tp[j+1]
133
adds r12,r12,r10
134
str r12,[r4],#4 @ tp[j-1]=,tp++
135
adc r12,r14,#0
136
cmp r4,r0
137
bne .Linner
138
139
adds r12,r12,r11
140
mov r14,#0
141
ldr r4,[r0,#13*4] @ restore bp
142
adc r14,r14,#0
143
ldr r8,[r0,#14*4] @ restore n0
144
adds r12,r12,r7
145
ldr r7,[r0,#15*4] @ restore &bp[num]
146
adc r14,r14,#0
147
str r12,[r0] @ tp[num-1]=
148
str r14,[r0,#4] @ tp[num]=
149
150
cmp r4,r7
151
#ifdef __thumb2__
152
itt ne
153
#endif
154
movne r7,sp
155
bne .Louter
156
157
ldr r2,[r0,#12*4] @ pull rp
158
mov r5,sp
159
add r0,r0,#4 @ r0 to point at &tp[num]
160
sub r5,r0,r5 @ "original" num value
161
mov r4,sp @ "rewind" r4
162
mov r1,r4 @ "borrow" r1
163
sub r3,r3,r5 @ "rewind" r3 to &np[0]
164
165
subs r7,r7,r7 @ "clear" carry flag
166
.Lsub: ldr r7,[r4],#4
167
ldr r6,[r3],#4
168
sbcs r7,r7,r6 @ tp[j]-np[j]
169
str r7,[r2],#4 @ rp[j]=
170
teq r4,r0 @ preserve carry
171
bne .Lsub
172
sbcs r14,r14,#0 @ upmost carry
173
mov r4,sp @ "rewind" r4
174
sub r2,r2,r5 @ "rewind" r2
175
176
.Lcopy: ldr r7,[r4] @ conditional copy
177
ldr r5,[r2]
178
str sp,[r4],#4 @ zap tp
179
#ifdef __thumb2__
180
it cc
181
#endif
182
movcc r5,r7
183
str r5,[r2],#4
184
teq r4,r0 @ preserve carry
185
bne .Lcopy
186
187
mov sp,r0
188
add sp,sp,#4 @ skip over tp[num+1]
189
ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr} @ restore registers
190
add sp,sp,#2*4 @ skip over {r0,r2}
191
mov r0,#1
192
.Labrt:
193
#if __ARM_ARCH__>=5
194
bx lr @ bx lr
195
#else
196
tst lr,#1
197
moveq pc,lr @ be binary compatible with V4, yet
198
.word 0xe12fff1e @ interoperable with Thumb ISA:-)
199
#endif
200
.size bn_mul_mont,.-bn_mul_mont
201
#if __ARM_MAX_ARCH__>=7
202
.arch armv7-a
203
.fpu neon
204
205
.type bn_mul8x_mont_neon,%function
206
.align 5
207
bn_mul8x_mont_neon:
208
mov ip,sp
209
stmdb sp!,{r4,r5,r6,r7,r8,r9,r10,r11}
210
vstmdb sp!,{d8,d9,d10,d11,d12,d13,d14,d15} @ ABI specification says so
211
ldmia ip,{r4,r5} @ load rest of parameter block
212
mov ip,sp
213
214
cmp r5,#8
215
bhi .LNEON_8n
216
217
@ special case for r5==8, everything is in register bank...
218
219
vld1.32 {d28[0]}, [r2,:32]!
220
veor d8,d8,d8
221
sub r7,sp,r5,lsl#4
222
vld1.32 {d0,d1,d2,d3}, [r1]! @ can't specify :32 :-(
223
and r7,r7,#-64
224
vld1.32 {d30[0]}, [r4,:32]
225
mov sp,r7 @ alloca
226
vzip.16 d28,d8
227
228
vmull.u32 q6,d28,d0[0]
229
vmull.u32 q7,d28,d0[1]
230
vmull.u32 q8,d28,d1[0]
231
vshl.i64 d29,d13,#16
232
vmull.u32 q9,d28,d1[1]
233
234
vadd.u64 d29,d29,d12
235
veor d8,d8,d8
236
vmul.u32 d29,d29,d30
237
238
vmull.u32 q10,d28,d2[0]
239
vld1.32 {d4,d5,d6,d7}, [r3]!
240
vmull.u32 q11,d28,d2[1]
241
vmull.u32 q12,d28,d3[0]
242
vzip.16 d29,d8
243
vmull.u32 q13,d28,d3[1]
244
245
vmlal.u32 q6,d29,d4[0]
246
sub r9,r5,#1
247
vmlal.u32 q7,d29,d4[1]
248
vmlal.u32 q8,d29,d5[0]
249
vmlal.u32 q9,d29,d5[1]
250
251
vmlal.u32 q10,d29,d6[0]
252
vmov q5,q6
253
vmlal.u32 q11,d29,d6[1]
254
vmov q6,q7
255
vmlal.u32 q12,d29,d7[0]
256
vmov q7,q8
257
vmlal.u32 q13,d29,d7[1]
258
vmov q8,q9
259
vmov q9,q10
260
vshr.u64 d10,d10,#16
261
vmov q10,q11
262
vmov q11,q12
263
vadd.u64 d10,d10,d11
264
vmov q12,q13
265
veor q13,q13
266
vshr.u64 d10,d10,#16
267
268
b .LNEON_outer8
269
270
.align 4
271
.LNEON_outer8:
272
vld1.32 {d28[0]}, [r2,:32]!
273
veor d8,d8,d8
274
vzip.16 d28,d8
275
vadd.u64 d12,d12,d10
276
277
vmlal.u32 q6,d28,d0[0]
278
vmlal.u32 q7,d28,d0[1]
279
vmlal.u32 q8,d28,d1[0]
280
vshl.i64 d29,d13,#16
281
vmlal.u32 q9,d28,d1[1]
282
283
vadd.u64 d29,d29,d12
284
veor d8,d8,d8
285
subs r9,r9,#1
286
vmul.u32 d29,d29,d30
287
288
vmlal.u32 q10,d28,d2[0]
289
vmlal.u32 q11,d28,d2[1]
290
vmlal.u32 q12,d28,d3[0]
291
vzip.16 d29,d8
292
vmlal.u32 q13,d28,d3[1]
293
294
vmlal.u32 q6,d29,d4[0]
295
vmlal.u32 q7,d29,d4[1]
296
vmlal.u32 q8,d29,d5[0]
297
vmlal.u32 q9,d29,d5[1]
298
299
vmlal.u32 q10,d29,d6[0]
300
vmov q5,q6
301
vmlal.u32 q11,d29,d6[1]
302
vmov q6,q7
303
vmlal.u32 q12,d29,d7[0]
304
vmov q7,q8
305
vmlal.u32 q13,d29,d7[1]
306
vmov q8,q9
307
vmov q9,q10
308
vshr.u64 d10,d10,#16
309
vmov q10,q11
310
vmov q11,q12
311
vadd.u64 d10,d10,d11
312
vmov q12,q13
313
veor q13,q13
314
vshr.u64 d10,d10,#16
315
316
bne .LNEON_outer8
317
318
vadd.u64 d12,d12,d10
319
mov r7,sp
320
vshr.u64 d10,d12,#16
321
mov r8,r5
322
vadd.u64 d13,d13,d10
323
add r6,sp,#96
324
vshr.u64 d10,d13,#16
325
vzip.16 d12,d13
326
327
b .LNEON_tail_entry
328
329
.align 4
330
.LNEON_8n:
331
veor q6,q6,q6
332
sub r7,sp,#128
333
veor q7,q7,q7
334
sub r7,r7,r5,lsl#4
335
veor q8,q8,q8
336
and r7,r7,#-64
337
veor q9,q9,q9
338
mov sp,r7 @ alloca
339
veor q10,q10,q10
340
add r7,r7,#256
341
veor q11,q11,q11
342
sub r8,r5,#8
343
veor q12,q12,q12
344
veor q13,q13,q13
345
346
.LNEON_8n_init:
347
vst1.64 {q6,q7},[r7,:256]!
348
subs r8,r8,#8
349
vst1.64 {q8,q9},[r7,:256]!
350
vst1.64 {q10,q11},[r7,:256]!
351
vst1.64 {q12,q13},[r7,:256]!
352
bne .LNEON_8n_init
353
354
add r6,sp,#256
355
vld1.32 {d0,d1,d2,d3},[r1]!
356
add r10,sp,#8
357
vld1.32 {d30[0]},[r4,:32]
358
mov r9,r5
359
b .LNEON_8n_outer
360
361
.align 4
362
.LNEON_8n_outer:
363
vld1.32 {d28[0]},[r2,:32]! @ *b++
364
veor d8,d8,d8
365
vzip.16 d28,d8
366
add r7,sp,#128
367
vld1.32 {d4,d5,d6,d7},[r3]!
368
369
vmlal.u32 q6,d28,d0[0]
370
vmlal.u32 q7,d28,d0[1]
371
veor d8,d8,d8
372
vmlal.u32 q8,d28,d1[0]
373
vshl.i64 d29,d13,#16
374
vmlal.u32 q9,d28,d1[1]
375
vadd.u64 d29,d29,d12
376
vmlal.u32 q10,d28,d2[0]
377
vmul.u32 d29,d29,d30
378
vmlal.u32 q11,d28,d2[1]
379
vst1.32 {d28},[sp,:64] @ put aside smashed b[8*i+0]
380
vmlal.u32 q12,d28,d3[0]
381
vzip.16 d29,d8
382
vmlal.u32 q13,d28,d3[1]
383
vld1.32 {d28[0]},[r2,:32]! @ *b++
384
vmlal.u32 q6,d29,d4[0]
385
veor d10,d10,d10
386
vmlal.u32 q7,d29,d4[1]
387
vzip.16 d28,d10
388
vmlal.u32 q8,d29,d5[0]
389
vshr.u64 d12,d12,#16
390
vmlal.u32 q9,d29,d5[1]
391
vmlal.u32 q10,d29,d6[0]
392
vadd.u64 d12,d12,d13
393
vmlal.u32 q11,d29,d6[1]
394
vshr.u64 d12,d12,#16
395
vmlal.u32 q12,d29,d7[0]
396
vmlal.u32 q13,d29,d7[1]
397
vadd.u64 d14,d14,d12
398
vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+0]
399
vmlal.u32 q7,d28,d0[0]
400
vld1.64 {q6},[r6,:128]!
401
vmlal.u32 q8,d28,d0[1]
402
veor d8,d8,d8
403
vmlal.u32 q9,d28,d1[0]
404
vshl.i64 d29,d15,#16
405
vmlal.u32 q10,d28,d1[1]
406
vadd.u64 d29,d29,d14
407
vmlal.u32 q11,d28,d2[0]
408
vmul.u32 d29,d29,d30
409
vmlal.u32 q12,d28,d2[1]
410
vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+1]
411
vmlal.u32 q13,d28,d3[0]
412
vzip.16 d29,d8
413
vmlal.u32 q6,d28,d3[1]
414
vld1.32 {d28[0]},[r2,:32]! @ *b++
415
vmlal.u32 q7,d29,d4[0]
416
veor d10,d10,d10
417
vmlal.u32 q8,d29,d4[1]
418
vzip.16 d28,d10
419
vmlal.u32 q9,d29,d5[0]
420
vshr.u64 d14,d14,#16
421
vmlal.u32 q10,d29,d5[1]
422
vmlal.u32 q11,d29,d6[0]
423
vadd.u64 d14,d14,d15
424
vmlal.u32 q12,d29,d6[1]
425
vshr.u64 d14,d14,#16
426
vmlal.u32 q13,d29,d7[0]
427
vmlal.u32 q6,d29,d7[1]
428
vadd.u64 d16,d16,d14
429
vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+1]
430
vmlal.u32 q8,d28,d0[0]
431
vld1.64 {q7},[r6,:128]!
432
vmlal.u32 q9,d28,d0[1]
433
veor d8,d8,d8
434
vmlal.u32 q10,d28,d1[0]
435
vshl.i64 d29,d17,#16
436
vmlal.u32 q11,d28,d1[1]
437
vadd.u64 d29,d29,d16
438
vmlal.u32 q12,d28,d2[0]
439
vmul.u32 d29,d29,d30
440
vmlal.u32 q13,d28,d2[1]
441
vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+2]
442
vmlal.u32 q6,d28,d3[0]
443
vzip.16 d29,d8
444
vmlal.u32 q7,d28,d3[1]
445
vld1.32 {d28[0]},[r2,:32]! @ *b++
446
vmlal.u32 q8,d29,d4[0]
447
veor d10,d10,d10
448
vmlal.u32 q9,d29,d4[1]
449
vzip.16 d28,d10
450
vmlal.u32 q10,d29,d5[0]
451
vshr.u64 d16,d16,#16
452
vmlal.u32 q11,d29,d5[1]
453
vmlal.u32 q12,d29,d6[0]
454
vadd.u64 d16,d16,d17
455
vmlal.u32 q13,d29,d6[1]
456
vshr.u64 d16,d16,#16
457
vmlal.u32 q6,d29,d7[0]
458
vmlal.u32 q7,d29,d7[1]
459
vadd.u64 d18,d18,d16
460
vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+2]
461
vmlal.u32 q9,d28,d0[0]
462
vld1.64 {q8},[r6,:128]!
463
vmlal.u32 q10,d28,d0[1]
464
veor d8,d8,d8
465
vmlal.u32 q11,d28,d1[0]
466
vshl.i64 d29,d19,#16
467
vmlal.u32 q12,d28,d1[1]
468
vadd.u64 d29,d29,d18
469
vmlal.u32 q13,d28,d2[0]
470
vmul.u32 d29,d29,d30
471
vmlal.u32 q6,d28,d2[1]
472
vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+3]
473
vmlal.u32 q7,d28,d3[0]
474
vzip.16 d29,d8
475
vmlal.u32 q8,d28,d3[1]
476
vld1.32 {d28[0]},[r2,:32]! @ *b++
477
vmlal.u32 q9,d29,d4[0]
478
veor d10,d10,d10
479
vmlal.u32 q10,d29,d4[1]
480
vzip.16 d28,d10
481
vmlal.u32 q11,d29,d5[0]
482
vshr.u64 d18,d18,#16
483
vmlal.u32 q12,d29,d5[1]
484
vmlal.u32 q13,d29,d6[0]
485
vadd.u64 d18,d18,d19
486
vmlal.u32 q6,d29,d6[1]
487
vshr.u64 d18,d18,#16
488
vmlal.u32 q7,d29,d7[0]
489
vmlal.u32 q8,d29,d7[1]
490
vadd.u64 d20,d20,d18
491
vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+3]
492
vmlal.u32 q10,d28,d0[0]
493
vld1.64 {q9},[r6,:128]!
494
vmlal.u32 q11,d28,d0[1]
495
veor d8,d8,d8
496
vmlal.u32 q12,d28,d1[0]
497
vshl.i64 d29,d21,#16
498
vmlal.u32 q13,d28,d1[1]
499
vadd.u64 d29,d29,d20
500
vmlal.u32 q6,d28,d2[0]
501
vmul.u32 d29,d29,d30
502
vmlal.u32 q7,d28,d2[1]
503
vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+4]
504
vmlal.u32 q8,d28,d3[0]
505
vzip.16 d29,d8
506
vmlal.u32 q9,d28,d3[1]
507
vld1.32 {d28[0]},[r2,:32]! @ *b++
508
vmlal.u32 q10,d29,d4[0]
509
veor d10,d10,d10
510
vmlal.u32 q11,d29,d4[1]
511
vzip.16 d28,d10
512
vmlal.u32 q12,d29,d5[0]
513
vshr.u64 d20,d20,#16
514
vmlal.u32 q13,d29,d5[1]
515
vmlal.u32 q6,d29,d6[0]
516
vadd.u64 d20,d20,d21
517
vmlal.u32 q7,d29,d6[1]
518
vshr.u64 d20,d20,#16
519
vmlal.u32 q8,d29,d7[0]
520
vmlal.u32 q9,d29,d7[1]
521
vadd.u64 d22,d22,d20
522
vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+4]
523
vmlal.u32 q11,d28,d0[0]
524
vld1.64 {q10},[r6,:128]!
525
vmlal.u32 q12,d28,d0[1]
526
veor d8,d8,d8
527
vmlal.u32 q13,d28,d1[0]
528
vshl.i64 d29,d23,#16
529
vmlal.u32 q6,d28,d1[1]
530
vadd.u64 d29,d29,d22
531
vmlal.u32 q7,d28,d2[0]
532
vmul.u32 d29,d29,d30
533
vmlal.u32 q8,d28,d2[1]
534
vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+5]
535
vmlal.u32 q9,d28,d3[0]
536
vzip.16 d29,d8
537
vmlal.u32 q10,d28,d3[1]
538
vld1.32 {d28[0]},[r2,:32]! @ *b++
539
vmlal.u32 q11,d29,d4[0]
540
veor d10,d10,d10
541
vmlal.u32 q12,d29,d4[1]
542
vzip.16 d28,d10
543
vmlal.u32 q13,d29,d5[0]
544
vshr.u64 d22,d22,#16
545
vmlal.u32 q6,d29,d5[1]
546
vmlal.u32 q7,d29,d6[0]
547
vadd.u64 d22,d22,d23
548
vmlal.u32 q8,d29,d6[1]
549
vshr.u64 d22,d22,#16
550
vmlal.u32 q9,d29,d7[0]
551
vmlal.u32 q10,d29,d7[1]
552
vadd.u64 d24,d24,d22
553
vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+5]
554
vmlal.u32 q12,d28,d0[0]
555
vld1.64 {q11},[r6,:128]!
556
vmlal.u32 q13,d28,d0[1]
557
veor d8,d8,d8
558
vmlal.u32 q6,d28,d1[0]
559
vshl.i64 d29,d25,#16
560
vmlal.u32 q7,d28,d1[1]
561
vadd.u64 d29,d29,d24
562
vmlal.u32 q8,d28,d2[0]
563
vmul.u32 d29,d29,d30
564
vmlal.u32 q9,d28,d2[1]
565
vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+6]
566
vmlal.u32 q10,d28,d3[0]
567
vzip.16 d29,d8
568
vmlal.u32 q11,d28,d3[1]
569
vld1.32 {d28[0]},[r2,:32]! @ *b++
570
vmlal.u32 q12,d29,d4[0]
571
veor d10,d10,d10
572
vmlal.u32 q13,d29,d4[1]
573
vzip.16 d28,d10
574
vmlal.u32 q6,d29,d5[0]
575
vshr.u64 d24,d24,#16
576
vmlal.u32 q7,d29,d5[1]
577
vmlal.u32 q8,d29,d6[0]
578
vadd.u64 d24,d24,d25
579
vmlal.u32 q9,d29,d6[1]
580
vshr.u64 d24,d24,#16
581
vmlal.u32 q10,d29,d7[0]
582
vmlal.u32 q11,d29,d7[1]
583
vadd.u64 d26,d26,d24
584
vst1.32 {d29},[r10,:64]! @ put aside smashed m[8*i+6]
585
vmlal.u32 q13,d28,d0[0]
586
vld1.64 {q12},[r6,:128]!
587
vmlal.u32 q6,d28,d0[1]
588
veor d8,d8,d8
589
vmlal.u32 q7,d28,d1[0]
590
vshl.i64 d29,d27,#16
591
vmlal.u32 q8,d28,d1[1]
592
vadd.u64 d29,d29,d26
593
vmlal.u32 q9,d28,d2[0]
594
vmul.u32 d29,d29,d30
595
vmlal.u32 q10,d28,d2[1]
596
vst1.32 {d28},[r10,:64]! @ put aside smashed b[8*i+7]
597
vmlal.u32 q11,d28,d3[0]
598
vzip.16 d29,d8
599
vmlal.u32 q12,d28,d3[1]
600
vld1.32 {d28},[sp,:64] @ pull smashed b[8*i+0]
601
vmlal.u32 q13,d29,d4[0]
602
vld1.32 {d0,d1,d2,d3},[r1]!
603
vmlal.u32 q6,d29,d4[1]
604
vmlal.u32 q7,d29,d5[0]
605
vshr.u64 d26,d26,#16
606
vmlal.u32 q8,d29,d5[1]
607
vmlal.u32 q9,d29,d6[0]
608
vadd.u64 d26,d26,d27
609
vmlal.u32 q10,d29,d6[1]
610
vshr.u64 d26,d26,#16
611
vmlal.u32 q11,d29,d7[0]
612
vmlal.u32 q12,d29,d7[1]
613
vadd.u64 d12,d12,d26
614
vst1.32 {d29},[r10,:64] @ put aside smashed m[8*i+7]
615
add r10,sp,#8 @ rewind
616
sub r8,r5,#8
617
b .LNEON_8n_inner
618
619
.align 4
620
.LNEON_8n_inner:
621
subs r8,r8,#8
622
vmlal.u32 q6,d28,d0[0]
623
vld1.64 {q13},[r6,:128]
624
vmlal.u32 q7,d28,d0[1]
625
vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+0]
626
vmlal.u32 q8,d28,d1[0]
627
vld1.32 {d4,d5,d6,d7},[r3]!
628
vmlal.u32 q9,d28,d1[1]
629
it ne
630
addne r6,r6,#16 @ don't advance in last iteration
631
vmlal.u32 q10,d28,d2[0]
632
vmlal.u32 q11,d28,d2[1]
633
vmlal.u32 q12,d28,d3[0]
634
vmlal.u32 q13,d28,d3[1]
635
vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+1]
636
vmlal.u32 q6,d29,d4[0]
637
vmlal.u32 q7,d29,d4[1]
638
vmlal.u32 q8,d29,d5[0]
639
vmlal.u32 q9,d29,d5[1]
640
vmlal.u32 q10,d29,d6[0]
641
vmlal.u32 q11,d29,d6[1]
642
vmlal.u32 q12,d29,d7[0]
643
vmlal.u32 q13,d29,d7[1]
644
vst1.64 {q6},[r7,:128]!
645
vmlal.u32 q7,d28,d0[0]
646
vld1.64 {q6},[r6,:128]
647
vmlal.u32 q8,d28,d0[1]
648
vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+1]
649
vmlal.u32 q9,d28,d1[0]
650
it ne
651
addne r6,r6,#16 @ don't advance in last iteration
652
vmlal.u32 q10,d28,d1[1]
653
vmlal.u32 q11,d28,d2[0]
654
vmlal.u32 q12,d28,d2[1]
655
vmlal.u32 q13,d28,d3[0]
656
vmlal.u32 q6,d28,d3[1]
657
vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+2]
658
vmlal.u32 q7,d29,d4[0]
659
vmlal.u32 q8,d29,d4[1]
660
vmlal.u32 q9,d29,d5[0]
661
vmlal.u32 q10,d29,d5[1]
662
vmlal.u32 q11,d29,d6[0]
663
vmlal.u32 q12,d29,d6[1]
664
vmlal.u32 q13,d29,d7[0]
665
vmlal.u32 q6,d29,d7[1]
666
vst1.64 {q7},[r7,:128]!
667
vmlal.u32 q8,d28,d0[0]
668
vld1.64 {q7},[r6,:128]
669
vmlal.u32 q9,d28,d0[1]
670
vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+2]
671
vmlal.u32 q10,d28,d1[0]
672
it ne
673
addne r6,r6,#16 @ don't advance in last iteration
674
vmlal.u32 q11,d28,d1[1]
675
vmlal.u32 q12,d28,d2[0]
676
vmlal.u32 q13,d28,d2[1]
677
vmlal.u32 q6,d28,d3[0]
678
vmlal.u32 q7,d28,d3[1]
679
vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+3]
680
vmlal.u32 q8,d29,d4[0]
681
vmlal.u32 q9,d29,d4[1]
682
vmlal.u32 q10,d29,d5[0]
683
vmlal.u32 q11,d29,d5[1]
684
vmlal.u32 q12,d29,d6[0]
685
vmlal.u32 q13,d29,d6[1]
686
vmlal.u32 q6,d29,d7[0]
687
vmlal.u32 q7,d29,d7[1]
688
vst1.64 {q8},[r7,:128]!
689
vmlal.u32 q9,d28,d0[0]
690
vld1.64 {q8},[r6,:128]
691
vmlal.u32 q10,d28,d0[1]
692
vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+3]
693
vmlal.u32 q11,d28,d1[0]
694
it ne
695
addne r6,r6,#16 @ don't advance in last iteration
696
vmlal.u32 q12,d28,d1[1]
697
vmlal.u32 q13,d28,d2[0]
698
vmlal.u32 q6,d28,d2[1]
699
vmlal.u32 q7,d28,d3[0]
700
vmlal.u32 q8,d28,d3[1]
701
vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+4]
702
vmlal.u32 q9,d29,d4[0]
703
vmlal.u32 q10,d29,d4[1]
704
vmlal.u32 q11,d29,d5[0]
705
vmlal.u32 q12,d29,d5[1]
706
vmlal.u32 q13,d29,d6[0]
707
vmlal.u32 q6,d29,d6[1]
708
vmlal.u32 q7,d29,d7[0]
709
vmlal.u32 q8,d29,d7[1]
710
vst1.64 {q9},[r7,:128]!
711
vmlal.u32 q10,d28,d0[0]
712
vld1.64 {q9},[r6,:128]
713
vmlal.u32 q11,d28,d0[1]
714
vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+4]
715
vmlal.u32 q12,d28,d1[0]
716
it ne
717
addne r6,r6,#16 @ don't advance in last iteration
718
vmlal.u32 q13,d28,d1[1]
719
vmlal.u32 q6,d28,d2[0]
720
vmlal.u32 q7,d28,d2[1]
721
vmlal.u32 q8,d28,d3[0]
722
vmlal.u32 q9,d28,d3[1]
723
vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+5]
724
vmlal.u32 q10,d29,d4[0]
725
vmlal.u32 q11,d29,d4[1]
726
vmlal.u32 q12,d29,d5[0]
727
vmlal.u32 q13,d29,d5[1]
728
vmlal.u32 q6,d29,d6[0]
729
vmlal.u32 q7,d29,d6[1]
730
vmlal.u32 q8,d29,d7[0]
731
vmlal.u32 q9,d29,d7[1]
732
vst1.64 {q10},[r7,:128]!
733
vmlal.u32 q11,d28,d0[0]
734
vld1.64 {q10},[r6,:128]
735
vmlal.u32 q12,d28,d0[1]
736
vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+5]
737
vmlal.u32 q13,d28,d1[0]
738
it ne
739
addne r6,r6,#16 @ don't advance in last iteration
740
vmlal.u32 q6,d28,d1[1]
741
vmlal.u32 q7,d28,d2[0]
742
vmlal.u32 q8,d28,d2[1]
743
vmlal.u32 q9,d28,d3[0]
744
vmlal.u32 q10,d28,d3[1]
745
vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+6]
746
vmlal.u32 q11,d29,d4[0]
747
vmlal.u32 q12,d29,d4[1]
748
vmlal.u32 q13,d29,d5[0]
749
vmlal.u32 q6,d29,d5[1]
750
vmlal.u32 q7,d29,d6[0]
751
vmlal.u32 q8,d29,d6[1]
752
vmlal.u32 q9,d29,d7[0]
753
vmlal.u32 q10,d29,d7[1]
754
vst1.64 {q11},[r7,:128]!
755
vmlal.u32 q12,d28,d0[0]
756
vld1.64 {q11},[r6,:128]
757
vmlal.u32 q13,d28,d0[1]
758
vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+6]
759
vmlal.u32 q6,d28,d1[0]
760
it ne
761
addne r6,r6,#16 @ don't advance in last iteration
762
vmlal.u32 q7,d28,d1[1]
763
vmlal.u32 q8,d28,d2[0]
764
vmlal.u32 q9,d28,d2[1]
765
vmlal.u32 q10,d28,d3[0]
766
vmlal.u32 q11,d28,d3[1]
767
vld1.32 {d28},[r10,:64]! @ pull smashed b[8*i+7]
768
vmlal.u32 q12,d29,d4[0]
769
vmlal.u32 q13,d29,d4[1]
770
vmlal.u32 q6,d29,d5[0]
771
vmlal.u32 q7,d29,d5[1]
772
vmlal.u32 q8,d29,d6[0]
773
vmlal.u32 q9,d29,d6[1]
774
vmlal.u32 q10,d29,d7[0]
775
vmlal.u32 q11,d29,d7[1]
776
vst1.64 {q12},[r7,:128]!
777
vmlal.u32 q13,d28,d0[0]
778
vld1.64 {q12},[r6,:128]
779
vmlal.u32 q6,d28,d0[1]
780
vld1.32 {d29},[r10,:64]! @ pull smashed m[8*i+7]
781
vmlal.u32 q7,d28,d1[0]
782
it ne
783
addne r6,r6,#16 @ don't advance in last iteration
784
vmlal.u32 q8,d28,d1[1]
785
vmlal.u32 q9,d28,d2[0]
786
vmlal.u32 q10,d28,d2[1]
787
vmlal.u32 q11,d28,d3[0]
788
vmlal.u32 q12,d28,d3[1]
789
it eq
790
subeq r1,r1,r5,lsl#2 @ rewind
791
vmlal.u32 q13,d29,d4[0]
792
vld1.32 {d28},[sp,:64] @ pull smashed b[8*i+0]
793
vmlal.u32 q6,d29,d4[1]
794
vld1.32 {d0,d1,d2,d3},[r1]!
795
vmlal.u32 q7,d29,d5[0]
796
add r10,sp,#8 @ rewind
797
vmlal.u32 q8,d29,d5[1]
798
vmlal.u32 q9,d29,d6[0]
799
vmlal.u32 q10,d29,d6[1]
800
vmlal.u32 q11,d29,d7[0]
801
vst1.64 {q13},[r7,:128]!
802
vmlal.u32 q12,d29,d7[1]
803
804
bne .LNEON_8n_inner
805
add r6,sp,#128
806
vst1.64 {q6,q7},[r7,:256]!
807
veor q2,q2,q2 @ d4-d5
808
vst1.64 {q8,q9},[r7,:256]!
809
veor q3,q3,q3 @ d6-d7
810
vst1.64 {q10,q11},[r7,:256]!
811
vst1.64 {q12},[r7,:128]
812
813
subs r9,r9,#8
814
vld1.64 {q6,q7},[r6,:256]!
815
vld1.64 {q8,q9},[r6,:256]!
816
vld1.64 {q10,q11},[r6,:256]!
817
vld1.64 {q12,q13},[r6,:256]!
818
819
itt ne
820
subne r3,r3,r5,lsl#2 @ rewind
821
bne .LNEON_8n_outer
822
823
add r7,sp,#128
824
vst1.64 {q2,q3}, [sp,:256]! @ start wiping stack frame
825
vshr.u64 d10,d12,#16
826
vst1.64 {q2,q3},[sp,:256]!
827
vadd.u64 d13,d13,d10
828
vst1.64 {q2,q3}, [sp,:256]!
829
vshr.u64 d10,d13,#16
830
vst1.64 {q2,q3}, [sp,:256]!
831
vzip.16 d12,d13
832
833
mov r8,r5
834
b .LNEON_tail_entry
835
836
.align 4
837
.LNEON_tail:
838
vadd.u64 d12,d12,d10
839
vshr.u64 d10,d12,#16
840
vld1.64 {q8,q9}, [r6, :256]!
841
vadd.u64 d13,d13,d10
842
vld1.64 {q10,q11}, [r6, :256]!
843
vshr.u64 d10,d13,#16
844
vld1.64 {q12,q13}, [r6, :256]!
845
vzip.16 d12,d13
846
847
.LNEON_tail_entry:
848
vadd.u64 d14,d14,d10
849
vst1.32 {d12[0]}, [r7, :32]!
850
vshr.u64 d10,d14,#16
851
vadd.u64 d15,d15,d10
852
vshr.u64 d10,d15,#16
853
vzip.16 d14,d15
854
vadd.u64 d16,d16,d10
855
vst1.32 {d14[0]}, [r7, :32]!
856
vshr.u64 d10,d16,#16
857
vadd.u64 d17,d17,d10
858
vshr.u64 d10,d17,#16
859
vzip.16 d16,d17
860
vadd.u64 d18,d18,d10
861
vst1.32 {d16[0]}, [r7, :32]!
862
vshr.u64 d10,d18,#16
863
vadd.u64 d19,d19,d10
864
vshr.u64 d10,d19,#16
865
vzip.16 d18,d19
866
vadd.u64 d20,d20,d10
867
vst1.32 {d18[0]}, [r7, :32]!
868
vshr.u64 d10,d20,#16
869
vadd.u64 d21,d21,d10
870
vshr.u64 d10,d21,#16
871
vzip.16 d20,d21
872
vadd.u64 d22,d22,d10
873
vst1.32 {d20[0]}, [r7, :32]!
874
vshr.u64 d10,d22,#16
875
vadd.u64 d23,d23,d10
876
vshr.u64 d10,d23,#16
877
vzip.16 d22,d23
878
vadd.u64 d24,d24,d10
879
vst1.32 {d22[0]}, [r7, :32]!
880
vshr.u64 d10,d24,#16
881
vadd.u64 d25,d25,d10
882
vshr.u64 d10,d25,#16
883
vzip.16 d24,d25
884
vadd.u64 d26,d26,d10
885
vst1.32 {d24[0]}, [r7, :32]!
886
vshr.u64 d10,d26,#16
887
vadd.u64 d27,d27,d10
888
vshr.u64 d10,d27,#16
889
vzip.16 d26,d27
890
vld1.64 {q6,q7}, [r6, :256]!
891
subs r8,r8,#8
892
vst1.32 {d26[0]}, [r7, :32]!
893
bne .LNEON_tail
894
895
vst1.32 {d10[0]}, [r7, :32] @ top-most bit
896
sub r3,r3,r5,lsl#2 @ rewind r3
897
subs r1,sp,#0 @ clear carry flag
898
add r2,sp,r5,lsl#2
899
900
.LNEON_sub:
901
ldmia r1!, {r4,r5,r6,r7}
902
ldmia r3!, {r8,r9,r10,r11}
903
sbcs r8, r4,r8
904
sbcs r9, r5,r9
905
sbcs r10,r6,r10
906
sbcs r11,r7,r11
907
teq r1,r2 @ preserves carry
908
stmia r0!, {r8,r9,r10,r11}
909
bne .LNEON_sub
910
911
ldr r10, [r1] @ load top-most bit
912
mov r11,sp
913
veor q0,q0,q0
914
sub r11,r2,r11 @ this is num*4
915
veor q1,q1,q1
916
mov r1,sp
917
sub r0,r0,r11 @ rewind r0
918
mov r3,r2 @ second 3/4th of frame
919
sbcs r10,r10,#0 @ result is carry flag
920
921
.LNEON_copy_n_zap:
922
ldmia r1!, {r4,r5,r6,r7}
923
ldmia r0, {r8,r9,r10,r11}
924
it cc
925
movcc r8, r4
926
vst1.64 {q0,q1}, [r3,:256]! @ wipe
927
itt cc
928
movcc r9, r5
929
movcc r10,r6
930
vst1.64 {q0,q1}, [r3,:256]! @ wipe
931
it cc
932
movcc r11,r7
933
ldmia r1, {r4,r5,r6,r7}
934
stmia r0!, {r8,r9,r10,r11}
935
sub r1,r1,#16
936
ldmia r0, {r8,r9,r10,r11}
937
it cc
938
movcc r8, r4
939
vst1.64 {q0,q1}, [r1,:256]! @ wipe
940
itt cc
941
movcc r9, r5
942
movcc r10,r6
943
vst1.64 {q0,q1}, [r3,:256]! @ wipe
944
it cc
945
movcc r11,r7
946
teq r1,r2 @ preserves carry
947
stmia r0!, {r8,r9,r10,r11}
948
bne .LNEON_copy_n_zap
949
950
mov sp,ip
951
vldmia sp!,{d8,d9,d10,d11,d12,d13,d14,d15}
952
ldmia sp!,{r4,r5,r6,r7,r8,r9,r10,r11}
953
bx lr @ bx lr
954
.size bn_mul8x_mont_neon,.-bn_mul8x_mont_neon
955
#endif
956
.byte 77,111,110,116,103,111,109,101,114,121,32,109,117,108,116,105,112,108,105,99,97,116,105,111,110,32,102,111,114,32,65,82,77,118,52,47,78,69,79,78,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0
957
.align 2
958
.align 2
959
#if __ARM_MAX_ARCH__>=7
960
961
.hidden OPENSSL_armcap_P
962
#endif
963
964