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 27bn_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 207bn_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.comm OPENSSL_armcap_P,4,4 961#endif 962