2 /* Do not modify. This file is auto-generated from armv4-mont.pl. */
8 #if __ARM_MAX_ARCH__>=7
11 .word OPENSSL_armcap_P-bn_mul_mont
15 .type bn_mul_mont,%function
19 ldr ip,[sp,#4] @ load num
20 stmdb sp!,{r0,r2} @ sp points at argument block
21 #if __ARM_MAX_ARCH__>=7
25 ldr r2,.LOPENSSL_armcap
27 tst r0,#1 @ NEON available?
41 stmdb sp!,{r4-r12,lr} @ save 10 registers
43 mov r0,r0,lsl#2 @ rescale r0 for byte count
44 sub sp,sp,r0 @ alloca(4*num)
45 sub sp,sp,#4 @ +extra dword
46 sub r0,r0,#4 @ "num=num-1"
47 add r4,r2,r0 @ &bp[num-1]
49 add r0,sp,r0 @ r0 to point at &tp[num-1]
50 ldr r8,[r0,#14*4] @ &n0
52 ldr r5,[r1],#4 @ ap[0],ap++
53 ldr r6,[r3],#4 @ np[0],np++
55 str r4,[r0,#15*4] @ save &bp[num]
57 umull r10,r11,r5,r2 @ ap[0]*bp[0]
58 str r8,[r0,#14*4] @ save n0 value
59 mul r8,r10,r8 @ "tp[0]"*n0
61 umlal r10,r12,r6,r8 @ np[0]*n0+"t[0]"
65 ldr r5,[r1],#4 @ ap[j],ap++
67 ldr r6,[r3],#4 @ np[j],np++
69 umlal r10,r11,r5,r2 @ ap[j]*bp[0]
71 umlal r12,r14,r6,r8 @ np[j]*n0
73 str r12,[r4],#4 @ tp[j-1]=,tp++
79 ldr r4,[r0,#13*4] @ restore bp
81 ldr r8,[r0,#14*4] @ restore n0
83 str r12,[r0] @ tp[num-1]=
84 str r14,[r0,#4] @ tp[num]=
87 sub r7,r0,sp @ "original" r0-1 value
88 sub r1,r1,r7 @ "rewind" ap to &ap[1]
89 ldr r2,[r4,#4]! @ *(++bp)
90 sub r3,r3,r7 @ "rewind" np to &np[1]
91 ldr r5,[r1,#-4] @ ap[0]
93 ldr r6,[r3,#-4] @ np[0]
94 ldr r7,[sp,#4] @ tp[1]
97 umlal r10,r11,r5,r2 @ ap[0]*bp[i]+tp[0]
98 str r4,[r0,#13*4] @ save bp
101 umlal r10,r12,r6,r8 @ np[0]*n0+"tp[0]"
105 ldr r5,[r1],#4 @ ap[j],ap++
106 adds r10,r11,r7 @ +=tp[j]
107 ldr r6,[r3],#4 @ np[j],np++
109 umlal r10,r11,r5,r2 @ ap[j]*bp[i]
111 umlal r12,r14,r6,r8 @ np[j]*n0
113 ldr r7,[r4,#8] @ tp[j+1]
115 str r12,[r4],#4 @ tp[j-1]=,tp++
122 ldr r4,[r0,#13*4] @ restore bp
124 ldr r8,[r0,#14*4] @ restore n0
126 ldr r7,[r0,#15*4] @ restore &bp[num]
128 str r12,[r0] @ tp[num-1]=
129 str r14,[r0,#4] @ tp[num]=
134 ldr r2,[r0,#12*4] @ pull rp
135 add r0,r0,#4 @ r0 to point at &tp[num]
136 sub r5,r0,sp @ "original" num value
137 mov r4,sp @ "rewind" r4
138 mov r1,r4 @ "borrow" r1
139 sub r3,r3,r5 @ "rewind" r3 to &np[0]
141 subs r7,r7,r7 @ "clear" carry flag
142 .Lsub: ldr r7,[r4],#4
144 sbcs r7,r7,r6 @ tp[j]-np[j]
145 str r7,[r2],#4 @ rp[j]=
146 teq r4,r0 @ preserve carry
148 sbcs r14,r14,#0 @ upmost carry
149 mov r4,sp @ "rewind" r4
150 sub r2,r2,r5 @ "rewind" r2
152 .Lcopy: ldr r7,[r4] @ conditional copy
154 str sp,[r4],#4 @ zap tp
160 teq r4,r0 @ preserve carry
163 add sp,r0,#4 @ skip over tp[num+1]
164 ldmia sp!,{r4-r12,lr} @ restore registers
165 add sp,sp,#2*4 @ skip over {r0,r2}
169 bx lr @ .word 0xe12fff1e
172 moveq pc,lr @ be binary compatible with V4, yet
173 .word 0xe12fff1e @ interoperable with Thumb ISA:-)
175 .size bn_mul_mont,.-bn_mul_mont
176 #if __ARM_MAX_ARCH__>=7
180 .type bn_mul8x_mont_neon,%function
185 vstmdb sp!,{d8-d15} @ ABI specification says so
186 ldmia ip,{r4-r5} @ load rest of parameter block
189 vld1.32 {d28[0]}, [r2,:32]!
191 vld1.32 {d0-d3}, [r1]! @ can't specify :32 :-(
193 vld1.32 {d30[0]}, [r4,:32]
199 vmull.u32 q6,d28,d0[0]
200 vmull.u32 q7,d28,d0[1]
201 vmull.u32 q8,d28,d1[0]
203 vmull.u32 q9,d28,d1[1]
209 vmull.u32 q10,d28,d2[0]
210 vld1.32 {d4-d7}, [r3]!
211 vmull.u32 q11,d28,d2[1]
212 vmull.u32 q12,d28,d3[0]
214 vmull.u32 q13,d28,d3[1]
218 @ special case for num=8, everything is in register bank...
220 vmlal.u32 q6,d29,d4[0]
222 vmlal.u32 q7,d29,d4[1]
223 vmlal.u32 q8,d29,d5[0]
224 vmlal.u32 q9,d29,d5[1]
226 vmlal.u32 q10,d29,d6[0]
228 vmlal.u32 q11,d29,d6[1]
230 vmlal.u32 q12,d29,d7[0]
232 vmlal.u32 q13,d29,d7[1]
247 vld1.32 {d28[0]}, [r2,:32]!
252 vmlal.u32 q6,d28,d0[0]
253 vmlal.u32 q7,d28,d0[1]
254 vmlal.u32 q8,d28,d1[0]
256 vmlal.u32 q9,d28,d1[1]
263 vmlal.u32 q10,d28,d2[0]
264 vmlal.u32 q11,d28,d2[1]
265 vmlal.u32 q12,d28,d3[0]
267 vmlal.u32 q13,d28,d3[1]
269 vmlal.u32 q6,d29,d4[0]
270 vmlal.u32 q7,d29,d4[1]
271 vmlal.u32 q8,d29,d5[0]
272 vmlal.u32 q9,d29,d5[1]
274 vmlal.u32 q10,d29,d6[0]
276 vmlal.u32 q11,d29,d6[1]
278 vmlal.u32 q12,d29,d7[0]
280 vmlal.u32 q13,d29,d7[1]
306 vmlal.u32 q6,d29,d4[0]
307 vld1.32 {d0-d3}, [r1]!
308 vmlal.u32 q7,d29,d4[1]
310 vmlal.u32 q8,d29,d5[0]
311 vmlal.u32 q9,d29,d5[1]
313 vmlal.u32 q10,d29,d6[0]
314 vld1.32 {d4-d5}, [r3]!
315 vmlal.u32 q11,d29,d6[1]
316 vst1.64 {q6-q7}, [r7,:256]!
317 vmlal.u32 q12,d29,d7[0]
318 vmlal.u32 q13,d29,d7[1]
319 vst1.64 {q8-q9}, [r7,:256]!
321 vmull.u32 q6,d28,d0[0]
322 vld1.32 {d6-d7}, [r3]!
323 vmull.u32 q7,d28,d0[1]
324 vst1.64 {q10-q11}, [r7,:256]!
325 vmull.u32 q8,d28,d1[0]
326 vmull.u32 q9,d28,d1[1]
327 vst1.64 {q12-q13}, [r7,:256]!
329 vmull.u32 q10,d28,d2[0]
330 vmull.u32 q11,d28,d2[1]
331 vmull.u32 q12,d28,d3[0]
332 vmull.u32 q13,d28,d3[1]
336 vmlal.u32 q6,d29,d4[0]
338 vmlal.u32 q7,d29,d4[1]
339 sub r1,r1,r5,lsl#2 @ rewind r1
340 vmlal.u32 q8,d29,d5[0]
341 vld1.64 {q5}, [sp,:128]
342 vmlal.u32 q9,d29,d5[1]
345 vmlal.u32 q10,d29,d6[0]
346 vst1.64 {q6-q7}, [r7,:256]!
347 vmlal.u32 q11,d29,d6[1]
349 vld1.64 {q6}, [r6, :128]!
350 vmlal.u32 q12,d29,d7[0]
351 vst1.64 {q8-q9}, [r7,:256]!
352 vmlal.u32 q13,d29,d7[1]
354 vst1.64 {q10-q11}, [r7,:256]!
357 vst1.64 {q12-q13}, [r7,:256]!
358 vld1.64 {q7-q8}, [r6, :256]!
359 vst1.64 {q4}, [r7,:128]
366 vld1.32 {d28[0]}, [r2,:32]!
367 sub r3,r3,r5,lsl#2 @ rewind r3
368 vld1.32 {d0-d3}, [r1]!
375 vmlal.u32 q6,d28,d0[0]
376 vld1.64 {q9-q10},[r6,:256]!
377 vmlal.u32 q7,d28,d0[1]
378 vmlal.u32 q8,d28,d1[0]
379 vld1.64 {q11-q12},[r6,:256]!
380 vmlal.u32 q9,d28,d1[1]
385 vld1.64 {q13},[r6,:128]!
388 vmlal.u32 q10,d28,d2[0]
389 vld1.32 {d4-d7}, [r3]!
390 vmlal.u32 q11,d28,d2[1]
391 vmlal.u32 q12,d28,d3[0]
393 vmlal.u32 q13,d28,d3[1]
396 vmlal.u32 q6,d29,d4[0]
397 vld1.32 {d0-d3}, [r1]!
398 vmlal.u32 q7,d29,d4[1]
400 vmlal.u32 q8,d29,d5[0]
401 vmlal.u32 q9,d29,d5[1]
402 vst1.64 {q6-q7}, [r7,:256]!
404 vmlal.u32 q10,d29,d6[0]
405 vld1.64 {q6}, [r6, :128]!
406 vmlal.u32 q11,d29,d6[1]
407 vst1.64 {q8-q9}, [r7,:256]!
408 vmlal.u32 q12,d29,d7[0]
409 vld1.64 {q7-q8}, [r6, :256]!
410 vmlal.u32 q13,d29,d7[1]
411 vst1.64 {q10-q11}, [r7,:256]!
413 vmlal.u32 q6,d28,d0[0]
414 vld1.64 {q9-q10}, [r6, :256]!
415 vmlal.u32 q7,d28,d0[1]
416 vst1.64 {q12-q13}, [r7,:256]!
417 vmlal.u32 q8,d28,d1[0]
418 vld1.64 {q11-q12}, [r6, :256]!
419 vmlal.u32 q9,d28,d1[1]
420 vld1.32 {d4-d7}, [r3]!
422 vmlal.u32 q10,d28,d2[0]
423 vld1.64 {q13}, [r6, :128]!
424 vmlal.u32 q11,d28,d2[1]
425 vmlal.u32 q12,d28,d3[0]
426 vmlal.u32 q13,d28,d3[1]
430 vmlal.u32 q6,d29,d4[0]
432 vmlal.u32 q7,d29,d4[1]
433 sub r1,r1,r5,lsl#2 @ rewind r1
434 vmlal.u32 q8,d29,d5[0]
435 vld1.64 {q5}, [sp,:128]
436 vmlal.u32 q9,d29,d5[1]
439 vmlal.u32 q10,d29,d6[0]
440 vst1.64 {q6-q7}, [r7,:256]!
441 vmlal.u32 q11,d29,d6[1]
442 vld1.64 {q6}, [r6, :128]!
444 vst1.64 {q8-q9}, [r7,:256]!
445 vmlal.u32 q12,d29,d7[0]
446 vld1.64 {q7-q8}, [r6, :256]!
447 vmlal.u32 q13,d29,d7[1]
449 vst1.64 {q10-q11}, [r7,:256]!
451 vst1.64 {q12-q13}, [r7,:256]!
461 vld1.64 {q9-q10}, [r6, :256]!
464 vld1.64 {q11-q12}, [r6, :256]!
466 vld1.64 {q13}, [r6, :128]!
471 vst1.32 {d12[0]}, [r7, :32]!
478 vst1.32 {d14[0]}, [r7, :32]!
485 vst1.32 {d16[0]}, [r7, :32]!
492 vst1.32 {d18[0]}, [r7, :32]!
499 vst1.32 {d20[0]}, [r7, :32]!
506 vst1.32 {d22[0]}, [r7, :32]!
509 vld1.64 {q6}, [r6, :128]!
514 vst1.32 {d24[0]}, [r7, :32]!
517 vld1.64 {q7-q8}, [r6, :256]!
521 vst1.32 {d26[0]}, [r7, :32]!
525 vst1.32 {d10[0]}, [r7, :32] @ top-most bit
526 sub r3,r3,r5,lsl#2 @ rewind r3
527 subs r1,sp,#0 @ clear carry flag
537 teq r1,r2 @ preserves carry
541 ldr r10, [r1] @ load top-most bit
543 sub r11,r2,sp @ this is num*4
546 sub r0,r0,r11 @ rewind r0
547 mov r3,r2 @ second 3/4th of frame
548 sbcs r10,r10,#0 @ result is carry flag
554 vst1.64 {q0-q1}, [r3,:256]! @ wipe
557 vst1.64 {q0-q1}, [r3,:256]! @ wipe
564 vst1.64 {q0-q1}, [r1,:256]! @ wipe
567 vst1.64 {q0-q1}, [r3,:256]! @ wipe
569 teq r1,r2 @ preserves carry
571 bne .LNEON_copy_n_zap
576 bx lr @ .word 0xe12fff1e
577 .size bn_mul8x_mont_neon,.-bn_mul8x_mont_neon
579 .asciz "Montgomery multiplication for ARMv4/NEON, CRYPTOGAMS by <appro@openssl.org>"
581 #if __ARM_MAX_ARCH__>=7
582 .comm OPENSSL_armcap_P,4,4