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