x86_64-mont.S revision 298999
1 # $FreeBSD: stable/10/secure/lib/libcrypto/amd64/x86_64-mont.S 298999 2016-05-03 18:54:20Z jkim $ 2.text 3 4.globl bn_mul_mont 5.type bn_mul_mont,@function 6.align 16 7bn_mul_mont: 8 testl $3,%r9d 9 jnz .Lmul_enter 10 cmpl $8,%r9d 11 jb .Lmul_enter 12 cmpq %rsi,%rdx 13 jne .Lmul4x_enter 14 jmp .Lsqr4x_enter 15 16.align 16 17.Lmul_enter: 18 pushq %rbx 19 pushq %rbp 20 pushq %r12 21 pushq %r13 22 pushq %r14 23 pushq %r15 24 25 movl %r9d,%r9d 26 leaq 2(%r9),%r10 27 movq %rsp,%r11 28 negq %r10 29 leaq (%rsp,%r10,8),%rsp 30 andq $-1024,%rsp 31 32 movq %r11,8(%rsp,%r9,8) 33.Lmul_body: 34 35 36 37 38 39 40 subq %rsp,%r11 41 andq $-4096,%r11 42.Lmul_page_walk: 43 movq (%rsp,%r11,1),%r10 44 subq $4096,%r11 45.byte 0x66,0x2e 46 jnc .Lmul_page_walk 47 48 movq %rdx,%r12 49 movq (%r8),%r8 50 movq (%r12),%rbx 51 movq (%rsi),%rax 52 53 xorq %r14,%r14 54 xorq %r15,%r15 55 56 movq %r8,%rbp 57 mulq %rbx 58 movq %rax,%r10 59 movq (%rcx),%rax 60 61 imulq %r10,%rbp 62 movq %rdx,%r11 63 64 mulq %rbp 65 addq %rax,%r10 66 movq 8(%rsi),%rax 67 adcq $0,%rdx 68 movq %rdx,%r13 69 70 leaq 1(%r15),%r15 71 jmp .L1st_enter 72 73.align 16 74.L1st: 75 addq %rax,%r13 76 movq (%rsi,%r15,8),%rax 77 adcq $0,%rdx 78 addq %r11,%r13 79 movq %r10,%r11 80 adcq $0,%rdx 81 movq %r13,-16(%rsp,%r15,8) 82 movq %rdx,%r13 83 84.L1st_enter: 85 mulq %rbx 86 addq %rax,%r11 87 movq (%rcx,%r15,8),%rax 88 adcq $0,%rdx 89 leaq 1(%r15),%r15 90 movq %rdx,%r10 91 92 mulq %rbp 93 cmpq %r9,%r15 94 jne .L1st 95 96 addq %rax,%r13 97 movq (%rsi),%rax 98 adcq $0,%rdx 99 addq %r11,%r13 100 adcq $0,%rdx 101 movq %r13,-16(%rsp,%r15,8) 102 movq %rdx,%r13 103 movq %r10,%r11 104 105 xorq %rdx,%rdx 106 addq %r11,%r13 107 adcq $0,%rdx 108 movq %r13,-8(%rsp,%r9,8) 109 movq %rdx,(%rsp,%r9,8) 110 111 leaq 1(%r14),%r14 112 jmp .Louter 113.align 16 114.Louter: 115 movq (%r12,%r14,8),%rbx 116 xorq %r15,%r15 117 movq %r8,%rbp 118 movq (%rsp),%r10 119 mulq %rbx 120 addq %rax,%r10 121 movq (%rcx),%rax 122 adcq $0,%rdx 123 124 imulq %r10,%rbp 125 movq %rdx,%r11 126 127 mulq %rbp 128 addq %rax,%r10 129 movq 8(%rsi),%rax 130 adcq $0,%rdx 131 movq 8(%rsp),%r10 132 movq %rdx,%r13 133 134 leaq 1(%r15),%r15 135 jmp .Linner_enter 136 137.align 16 138.Linner: 139 addq %rax,%r13 140 movq (%rsi,%r15,8),%rax 141 adcq $0,%rdx 142 addq %r10,%r13 143 movq (%rsp,%r15,8),%r10 144 adcq $0,%rdx 145 movq %r13,-16(%rsp,%r15,8) 146 movq %rdx,%r13 147 148.Linner_enter: 149 mulq %rbx 150 addq %rax,%r11 151 movq (%rcx,%r15,8),%rax 152 adcq $0,%rdx 153 addq %r11,%r10 154 movq %rdx,%r11 155 adcq $0,%r11 156 leaq 1(%r15),%r15 157 158 mulq %rbp 159 cmpq %r9,%r15 160 jne .Linner 161 162 addq %rax,%r13 163 movq (%rsi),%rax 164 adcq $0,%rdx 165 addq %r10,%r13 166 movq (%rsp,%r15,8),%r10 167 adcq $0,%rdx 168 movq %r13,-16(%rsp,%r15,8) 169 movq %rdx,%r13 170 171 xorq %rdx,%rdx 172 addq %r11,%r13 173 adcq $0,%rdx 174 addq %r10,%r13 175 adcq $0,%rdx 176 movq %r13,-8(%rsp,%r9,8) 177 movq %rdx,(%rsp,%r9,8) 178 179 leaq 1(%r14),%r14 180 cmpq %r9,%r14 181 jl .Louter 182 183 xorq %r14,%r14 184 movq (%rsp),%rax 185 leaq (%rsp),%rsi 186 movq %r9,%r15 187 jmp .Lsub 188.align 16 189.Lsub: sbbq (%rcx,%r14,8),%rax 190 movq %rax,(%rdi,%r14,8) 191 movq 8(%rsi,%r14,8),%rax 192 leaq 1(%r14),%r14 193 decq %r15 194 jnz .Lsub 195 196 sbbq $0,%rax 197 xorq %r14,%r14 198 andq %rax,%rsi 199 notq %rax 200 movq %rdi,%rcx 201 andq %rax,%rcx 202 movq %r9,%r15 203 orq %rcx,%rsi 204.align 16 205.Lcopy: 206 movq (%rsi,%r14,8),%rax 207 movq %r14,(%rsp,%r14,8) 208 movq %rax,(%rdi,%r14,8) 209 leaq 1(%r14),%r14 210 subq $1,%r15 211 jnz .Lcopy 212 213 movq 8(%rsp,%r9,8),%rsi 214 movq $1,%rax 215 movq (%rsi),%r15 216 movq 8(%rsi),%r14 217 movq 16(%rsi),%r13 218 movq 24(%rsi),%r12 219 movq 32(%rsi),%rbp 220 movq 40(%rsi),%rbx 221 leaq 48(%rsi),%rsp 222.Lmul_epilogue: 223 .byte 0xf3,0xc3 224.size bn_mul_mont,.-bn_mul_mont 225.type bn_mul4x_mont,@function 226.align 16 227bn_mul4x_mont: 228.Lmul4x_enter: 229 pushq %rbx 230 pushq %rbp 231 pushq %r12 232 pushq %r13 233 pushq %r14 234 pushq %r15 235 236 movl %r9d,%r9d 237 leaq 4(%r9),%r10 238 movq %rsp,%r11 239 negq %r10 240 leaq (%rsp,%r10,8),%rsp 241 andq $-1024,%rsp 242 243 movq %r11,8(%rsp,%r9,8) 244.Lmul4x_body: 245 subq %rsp,%r11 246 andq $-4096,%r11 247.Lmul4x_page_walk: 248 movq (%rsp,%r11,1),%r10 249 subq $4096,%r11 250.byte 0x2e 251 jnc .Lmul4x_page_walk 252 253 movq %rdi,16(%rsp,%r9,8) 254 movq %rdx,%r12 255 movq (%r8),%r8 256 movq (%r12),%rbx 257 movq (%rsi),%rax 258 259 xorq %r14,%r14 260 xorq %r15,%r15 261 262 movq %r8,%rbp 263 mulq %rbx 264 movq %rax,%r10 265 movq (%rcx),%rax 266 267 imulq %r10,%rbp 268 movq %rdx,%r11 269 270 mulq %rbp 271 addq %rax,%r10 272 movq 8(%rsi),%rax 273 adcq $0,%rdx 274 movq %rdx,%rdi 275 276 mulq %rbx 277 addq %rax,%r11 278 movq 8(%rcx),%rax 279 adcq $0,%rdx 280 movq %rdx,%r10 281 282 mulq %rbp 283 addq %rax,%rdi 284 movq 16(%rsi),%rax 285 adcq $0,%rdx 286 addq %r11,%rdi 287 leaq 4(%r15),%r15 288 adcq $0,%rdx 289 movq %rdi,(%rsp) 290 movq %rdx,%r13 291 jmp .L1st4x 292.align 16 293.L1st4x: 294 mulq %rbx 295 addq %rax,%r10 296 movq -16(%rcx,%r15,8),%rax 297 adcq $0,%rdx 298 movq %rdx,%r11 299 300 mulq %rbp 301 addq %rax,%r13 302 movq -8(%rsi,%r15,8),%rax 303 adcq $0,%rdx 304 addq %r10,%r13 305 adcq $0,%rdx 306 movq %r13,-24(%rsp,%r15,8) 307 movq %rdx,%rdi 308 309 mulq %rbx 310 addq %rax,%r11 311 movq -8(%rcx,%r15,8),%rax 312 adcq $0,%rdx 313 movq %rdx,%r10 314 315 mulq %rbp 316 addq %rax,%rdi 317 movq (%rsi,%r15,8),%rax 318 adcq $0,%rdx 319 addq %r11,%rdi 320 adcq $0,%rdx 321 movq %rdi,-16(%rsp,%r15,8) 322 movq %rdx,%r13 323 324 mulq %rbx 325 addq %rax,%r10 326 movq (%rcx,%r15,8),%rax 327 adcq $0,%rdx 328 movq %rdx,%r11 329 330 mulq %rbp 331 addq %rax,%r13 332 movq 8(%rsi,%r15,8),%rax 333 adcq $0,%rdx 334 addq %r10,%r13 335 adcq $0,%rdx 336 movq %r13,-8(%rsp,%r15,8) 337 movq %rdx,%rdi 338 339 mulq %rbx 340 addq %rax,%r11 341 movq 8(%rcx,%r15,8),%rax 342 adcq $0,%rdx 343 leaq 4(%r15),%r15 344 movq %rdx,%r10 345 346 mulq %rbp 347 addq %rax,%rdi 348 movq -16(%rsi,%r15,8),%rax 349 adcq $0,%rdx 350 addq %r11,%rdi 351 adcq $0,%rdx 352 movq %rdi,-32(%rsp,%r15,8) 353 movq %rdx,%r13 354 cmpq %r9,%r15 355 jl .L1st4x 356 357 mulq %rbx 358 addq %rax,%r10 359 movq -16(%rcx,%r15,8),%rax 360 adcq $0,%rdx 361 movq %rdx,%r11 362 363 mulq %rbp 364 addq %rax,%r13 365 movq -8(%rsi,%r15,8),%rax 366 adcq $0,%rdx 367 addq %r10,%r13 368 adcq $0,%rdx 369 movq %r13,-24(%rsp,%r15,8) 370 movq %rdx,%rdi 371 372 mulq %rbx 373 addq %rax,%r11 374 movq -8(%rcx,%r15,8),%rax 375 adcq $0,%rdx 376 movq %rdx,%r10 377 378 mulq %rbp 379 addq %rax,%rdi 380 movq (%rsi),%rax 381 adcq $0,%rdx 382 addq %r11,%rdi 383 adcq $0,%rdx 384 movq %rdi,-16(%rsp,%r15,8) 385 movq %rdx,%r13 386 387 xorq %rdi,%rdi 388 addq %r10,%r13 389 adcq $0,%rdi 390 movq %r13,-8(%rsp,%r15,8) 391 movq %rdi,(%rsp,%r15,8) 392 393 leaq 1(%r14),%r14 394.align 4 395.Louter4x: 396 movq (%r12,%r14,8),%rbx 397 xorq %r15,%r15 398 movq (%rsp),%r10 399 movq %r8,%rbp 400 mulq %rbx 401 addq %rax,%r10 402 movq (%rcx),%rax 403 adcq $0,%rdx 404 405 imulq %r10,%rbp 406 movq %rdx,%r11 407 408 mulq %rbp 409 addq %rax,%r10 410 movq 8(%rsi),%rax 411 adcq $0,%rdx 412 movq %rdx,%rdi 413 414 mulq %rbx 415 addq %rax,%r11 416 movq 8(%rcx),%rax 417 adcq $0,%rdx 418 addq 8(%rsp),%r11 419 adcq $0,%rdx 420 movq %rdx,%r10 421 422 mulq %rbp 423 addq %rax,%rdi 424 movq 16(%rsi),%rax 425 adcq $0,%rdx 426 addq %r11,%rdi 427 leaq 4(%r15),%r15 428 adcq $0,%rdx 429 movq %rdi,(%rsp) 430 movq %rdx,%r13 431 jmp .Linner4x 432.align 16 433.Linner4x: 434 mulq %rbx 435 addq %rax,%r10 436 movq -16(%rcx,%r15,8),%rax 437 adcq $0,%rdx 438 addq -16(%rsp,%r15,8),%r10 439 adcq $0,%rdx 440 movq %rdx,%r11 441 442 mulq %rbp 443 addq %rax,%r13 444 movq -8(%rsi,%r15,8),%rax 445 adcq $0,%rdx 446 addq %r10,%r13 447 adcq $0,%rdx 448 movq %r13,-24(%rsp,%r15,8) 449 movq %rdx,%rdi 450 451 mulq %rbx 452 addq %rax,%r11 453 movq -8(%rcx,%r15,8),%rax 454 adcq $0,%rdx 455 addq -8(%rsp,%r15,8),%r11 456 adcq $0,%rdx 457 movq %rdx,%r10 458 459 mulq %rbp 460 addq %rax,%rdi 461 movq (%rsi,%r15,8),%rax 462 adcq $0,%rdx 463 addq %r11,%rdi 464 adcq $0,%rdx 465 movq %rdi,-16(%rsp,%r15,8) 466 movq %rdx,%r13 467 468 mulq %rbx 469 addq %rax,%r10 470 movq (%rcx,%r15,8),%rax 471 adcq $0,%rdx 472 addq (%rsp,%r15,8),%r10 473 adcq $0,%rdx 474 movq %rdx,%r11 475 476 mulq %rbp 477 addq %rax,%r13 478 movq 8(%rsi,%r15,8),%rax 479 adcq $0,%rdx 480 addq %r10,%r13 481 adcq $0,%rdx 482 movq %r13,-8(%rsp,%r15,8) 483 movq %rdx,%rdi 484 485 mulq %rbx 486 addq %rax,%r11 487 movq 8(%rcx,%r15,8),%rax 488 adcq $0,%rdx 489 addq 8(%rsp,%r15,8),%r11 490 adcq $0,%rdx 491 leaq 4(%r15),%r15 492 movq %rdx,%r10 493 494 mulq %rbp 495 addq %rax,%rdi 496 movq -16(%rsi,%r15,8),%rax 497 adcq $0,%rdx 498 addq %r11,%rdi 499 adcq $0,%rdx 500 movq %rdi,-32(%rsp,%r15,8) 501 movq %rdx,%r13 502 cmpq %r9,%r15 503 jl .Linner4x 504 505 mulq %rbx 506 addq %rax,%r10 507 movq -16(%rcx,%r15,8),%rax 508 adcq $0,%rdx 509 addq -16(%rsp,%r15,8),%r10 510 adcq $0,%rdx 511 movq %rdx,%r11 512 513 mulq %rbp 514 addq %rax,%r13 515 movq -8(%rsi,%r15,8),%rax 516 adcq $0,%rdx 517 addq %r10,%r13 518 adcq $0,%rdx 519 movq %r13,-24(%rsp,%r15,8) 520 movq %rdx,%rdi 521 522 mulq %rbx 523 addq %rax,%r11 524 movq -8(%rcx,%r15,8),%rax 525 adcq $0,%rdx 526 addq -8(%rsp,%r15,8),%r11 527 adcq $0,%rdx 528 leaq 1(%r14),%r14 529 movq %rdx,%r10 530 531 mulq %rbp 532 addq %rax,%rdi 533 movq (%rsi),%rax 534 adcq $0,%rdx 535 addq %r11,%rdi 536 adcq $0,%rdx 537 movq %rdi,-16(%rsp,%r15,8) 538 movq %rdx,%r13 539 540 xorq %rdi,%rdi 541 addq %r10,%r13 542 adcq $0,%rdi 543 addq (%rsp,%r9,8),%r13 544 adcq $0,%rdi 545 movq %r13,-8(%rsp,%r15,8) 546 movq %rdi,(%rsp,%r15,8) 547 548 cmpq %r9,%r14 549 jl .Louter4x 550 movq 16(%rsp,%r9,8),%rdi 551 movq 0(%rsp),%rax 552 pxor %xmm0,%xmm0 553 movq 8(%rsp),%rdx 554 shrq $2,%r9 555 leaq (%rsp),%rsi 556 xorq %r14,%r14 557 558 subq 0(%rcx),%rax 559 movq 16(%rsi),%rbx 560 movq 24(%rsi),%rbp 561 sbbq 8(%rcx),%rdx 562 leaq -1(%r9),%r15 563 jmp .Lsub4x 564.align 16 565.Lsub4x: 566 movq %rax,0(%rdi,%r14,8) 567 movq %rdx,8(%rdi,%r14,8) 568 sbbq 16(%rcx,%r14,8),%rbx 569 movq 32(%rsi,%r14,8),%rax 570 movq 40(%rsi,%r14,8),%rdx 571 sbbq 24(%rcx,%r14,8),%rbp 572 movq %rbx,16(%rdi,%r14,8) 573 movq %rbp,24(%rdi,%r14,8) 574 sbbq 32(%rcx,%r14,8),%rax 575 movq 48(%rsi,%r14,8),%rbx 576 movq 56(%rsi,%r14,8),%rbp 577 sbbq 40(%rcx,%r14,8),%rdx 578 leaq 4(%r14),%r14 579 decq %r15 580 jnz .Lsub4x 581 582 movq %rax,0(%rdi,%r14,8) 583 movq 32(%rsi,%r14,8),%rax 584 sbbq 16(%rcx,%r14,8),%rbx 585 movq %rdx,8(%rdi,%r14,8) 586 sbbq 24(%rcx,%r14,8),%rbp 587 movq %rbx,16(%rdi,%r14,8) 588 589 sbbq $0,%rax 590 movq %rbp,24(%rdi,%r14,8) 591 xorq %r14,%r14 592 andq %rax,%rsi 593 notq %rax 594 movq %rdi,%rcx 595 andq %rax,%rcx 596 leaq -1(%r9),%r15 597 orq %rcx,%rsi 598 599 movdqu (%rsi),%xmm1 600 movdqa %xmm0,(%rsp) 601 movdqu %xmm1,(%rdi) 602 jmp .Lcopy4x 603.align 16 604.Lcopy4x: 605 movdqu 16(%rsi,%r14,1),%xmm2 606 movdqu 32(%rsi,%r14,1),%xmm1 607 movdqa %xmm0,16(%rsp,%r14,1) 608 movdqu %xmm2,16(%rdi,%r14,1) 609 movdqa %xmm0,32(%rsp,%r14,1) 610 movdqu %xmm1,32(%rdi,%r14,1) 611 leaq 32(%r14),%r14 612 decq %r15 613 jnz .Lcopy4x 614 615 shlq $2,%r9 616 movdqu 16(%rsi,%r14,1),%xmm2 617 movdqa %xmm0,16(%rsp,%r14,1) 618 movdqu %xmm2,16(%rdi,%r14,1) 619 movq 8(%rsp,%r9,8),%rsi 620 movq $1,%rax 621 movq (%rsi),%r15 622 movq 8(%rsi),%r14 623 movq 16(%rsi),%r13 624 movq 24(%rsi),%r12 625 movq 32(%rsi),%rbp 626 movq 40(%rsi),%rbx 627 leaq 48(%rsi),%rsp 628.Lmul4x_epilogue: 629 .byte 0xf3,0xc3 630.size bn_mul4x_mont,.-bn_mul4x_mont 631.type bn_sqr4x_mont,@function 632.align 16 633bn_sqr4x_mont: 634.Lsqr4x_enter: 635 movq %rsp,%rax 636 pushq %rbx 637 pushq %rbp 638 pushq %r12 639 pushq %r13 640 pushq %r14 641 pushq %r15 642 643 shll $3,%r9d 644 movq %rsp,%r11 645 negq %r9 646 movq (%r8),%r8 647 leaq -72(%rsp,%r9,2),%rsp 648 andq $-1024,%rsp 649 650 subq %rsp,%r11 651 andq $-4096,%r11 652.Lsqr4x_page_walk: 653 movq (%rsp,%r11,1),%r10 654 subq $4096,%r11 655.byte 0x2e 656 jnc .Lsqr4x_page_walk 657 658 movq %r9,%r10 659 negq %r9 660 leaq -48(%rax),%r11 661 662 663 664 665 666 667 668 669 670 671 672 movq %rdi,32(%rsp) 673 movq %rcx,40(%rsp) 674 movq %r8,48(%rsp) 675 movq %r11,56(%rsp) 676.Lsqr4x_body: 677 678 679 680 681 682 683 684 leaq 32(%r10),%rbp 685 leaq (%rsi,%r9,1),%rsi 686 687 movq %r9,%rcx 688 689 690 movq -32(%rsi,%rbp,1),%r14 691 leaq 64(%rsp,%r9,2),%rdi 692 movq -24(%rsi,%rbp,1),%rax 693 leaq -32(%rdi,%rbp,1),%rdi 694 movq -16(%rsi,%rbp,1),%rbx 695 movq %rax,%r15 696 697 mulq %r14 698 movq %rax,%r10 699 movq %rbx,%rax 700 movq %rdx,%r11 701 movq %r10,-24(%rdi,%rbp,1) 702 703 xorq %r10,%r10 704 mulq %r14 705 addq %rax,%r11 706 movq %rbx,%rax 707 adcq %rdx,%r10 708 movq %r11,-16(%rdi,%rbp,1) 709 710 leaq -16(%rbp),%rcx 711 712 713 movq 8(%rsi,%rcx,1),%rbx 714 mulq %r15 715 movq %rax,%r12 716 movq %rbx,%rax 717 movq %rdx,%r13 718 719 xorq %r11,%r11 720 addq %r12,%r10 721 leaq 16(%rcx),%rcx 722 adcq $0,%r11 723 mulq %r14 724 addq %rax,%r10 725 movq %rbx,%rax 726 adcq %rdx,%r11 727 movq %r10,-8(%rdi,%rcx,1) 728 jmp .Lsqr4x_1st 729 730.align 16 731.Lsqr4x_1st: 732 movq (%rsi,%rcx,1),%rbx 733 xorq %r12,%r12 734 mulq %r15 735 addq %rax,%r13 736 movq %rbx,%rax 737 adcq %rdx,%r12 738 739 xorq %r10,%r10 740 addq %r13,%r11 741 adcq $0,%r10 742 mulq %r14 743 addq %rax,%r11 744 movq %rbx,%rax 745 adcq %rdx,%r10 746 movq %r11,(%rdi,%rcx,1) 747 748 749 movq 8(%rsi,%rcx,1),%rbx 750 xorq %r13,%r13 751 mulq %r15 752 addq %rax,%r12 753 movq %rbx,%rax 754 adcq %rdx,%r13 755 756 xorq %r11,%r11 757 addq %r12,%r10 758 adcq $0,%r11 759 mulq %r14 760 addq %rax,%r10 761 movq %rbx,%rax 762 adcq %rdx,%r11 763 movq %r10,8(%rdi,%rcx,1) 764 765 movq 16(%rsi,%rcx,1),%rbx 766 xorq %r12,%r12 767 mulq %r15 768 addq %rax,%r13 769 movq %rbx,%rax 770 adcq %rdx,%r12 771 772 xorq %r10,%r10 773 addq %r13,%r11 774 adcq $0,%r10 775 mulq %r14 776 addq %rax,%r11 777 movq %rbx,%rax 778 adcq %rdx,%r10 779 movq %r11,16(%rdi,%rcx,1) 780 781 782 movq 24(%rsi,%rcx,1),%rbx 783 xorq %r13,%r13 784 mulq %r15 785 addq %rax,%r12 786 movq %rbx,%rax 787 adcq %rdx,%r13 788 789 xorq %r11,%r11 790 addq %r12,%r10 791 leaq 32(%rcx),%rcx 792 adcq $0,%r11 793 mulq %r14 794 addq %rax,%r10 795 movq %rbx,%rax 796 adcq %rdx,%r11 797 movq %r10,-8(%rdi,%rcx,1) 798 799 cmpq $0,%rcx 800 jne .Lsqr4x_1st 801 802 xorq %r12,%r12 803 addq %r11,%r13 804 adcq $0,%r12 805 mulq %r15 806 addq %rax,%r13 807 adcq %rdx,%r12 808 809 movq %r13,(%rdi) 810 leaq 16(%rbp),%rbp 811 movq %r12,8(%rdi) 812 jmp .Lsqr4x_outer 813 814.align 16 815.Lsqr4x_outer: 816 movq -32(%rsi,%rbp,1),%r14 817 leaq 64(%rsp,%r9,2),%rdi 818 movq -24(%rsi,%rbp,1),%rax 819 leaq -32(%rdi,%rbp,1),%rdi 820 movq -16(%rsi,%rbp,1),%rbx 821 movq %rax,%r15 822 823 movq -24(%rdi,%rbp,1),%r10 824 xorq %r11,%r11 825 mulq %r14 826 addq %rax,%r10 827 movq %rbx,%rax 828 adcq %rdx,%r11 829 movq %r10,-24(%rdi,%rbp,1) 830 831 xorq %r10,%r10 832 addq -16(%rdi,%rbp,1),%r11 833 adcq $0,%r10 834 mulq %r14 835 addq %rax,%r11 836 movq %rbx,%rax 837 adcq %rdx,%r10 838 movq %r11,-16(%rdi,%rbp,1) 839 840 leaq -16(%rbp),%rcx 841 xorq %r12,%r12 842 843 844 movq 8(%rsi,%rcx,1),%rbx 845 xorq %r13,%r13 846 addq 8(%rdi,%rcx,1),%r12 847 adcq $0,%r13 848 mulq %r15 849 addq %rax,%r12 850 movq %rbx,%rax 851 adcq %rdx,%r13 852 853 xorq %r11,%r11 854 addq %r12,%r10 855 adcq $0,%r11 856 mulq %r14 857 addq %rax,%r10 858 movq %rbx,%rax 859 adcq %rdx,%r11 860 movq %r10,8(%rdi,%rcx,1) 861 862 leaq 16(%rcx),%rcx 863 jmp .Lsqr4x_inner 864 865.align 16 866.Lsqr4x_inner: 867 movq (%rsi,%rcx,1),%rbx 868 xorq %r12,%r12 869 addq (%rdi,%rcx,1),%r13 870 adcq $0,%r12 871 mulq %r15 872 addq %rax,%r13 873 movq %rbx,%rax 874 adcq %rdx,%r12 875 876 xorq %r10,%r10 877 addq %r13,%r11 878 adcq $0,%r10 879 mulq %r14 880 addq %rax,%r11 881 movq %rbx,%rax 882 adcq %rdx,%r10 883 movq %r11,(%rdi,%rcx,1) 884 885 movq 8(%rsi,%rcx,1),%rbx 886 xorq %r13,%r13 887 addq 8(%rdi,%rcx,1),%r12 888 adcq $0,%r13 889 mulq %r15 890 addq %rax,%r12 891 movq %rbx,%rax 892 adcq %rdx,%r13 893 894 xorq %r11,%r11 895 addq %r12,%r10 896 leaq 16(%rcx),%rcx 897 adcq $0,%r11 898 mulq %r14 899 addq %rax,%r10 900 movq %rbx,%rax 901 adcq %rdx,%r11 902 movq %r10,-8(%rdi,%rcx,1) 903 904 cmpq $0,%rcx 905 jne .Lsqr4x_inner 906 907 xorq %r12,%r12 908 addq %r11,%r13 909 adcq $0,%r12 910 mulq %r15 911 addq %rax,%r13 912 adcq %rdx,%r12 913 914 movq %r13,(%rdi) 915 movq %r12,8(%rdi) 916 917 addq $16,%rbp 918 jnz .Lsqr4x_outer 919 920 921 movq -32(%rsi),%r14 922 leaq 64(%rsp,%r9,2),%rdi 923 movq -24(%rsi),%rax 924 leaq -32(%rdi,%rbp,1),%rdi 925 movq -16(%rsi),%rbx 926 movq %rax,%r15 927 928 xorq %r11,%r11 929 mulq %r14 930 addq %rax,%r10 931 movq %rbx,%rax 932 adcq %rdx,%r11 933 movq %r10,-24(%rdi) 934 935 xorq %r10,%r10 936 addq %r13,%r11 937 adcq $0,%r10 938 mulq %r14 939 addq %rax,%r11 940 movq %rbx,%rax 941 adcq %rdx,%r10 942 movq %r11,-16(%rdi) 943 944 movq -8(%rsi),%rbx 945 mulq %r15 946 addq %rax,%r12 947 movq %rbx,%rax 948 adcq $0,%rdx 949 950 xorq %r11,%r11 951 addq %r12,%r10 952 movq %rdx,%r13 953 adcq $0,%r11 954 mulq %r14 955 addq %rax,%r10 956 movq %rbx,%rax 957 adcq %rdx,%r11 958 movq %r10,-8(%rdi) 959 960 xorq %r12,%r12 961 addq %r11,%r13 962 adcq $0,%r12 963 mulq %r15 964 addq %rax,%r13 965 movq -16(%rsi),%rax 966 adcq %rdx,%r12 967 968 movq %r13,(%rdi) 969 movq %r12,8(%rdi) 970 971 mulq %rbx 972 addq $16,%rbp 973 xorq %r14,%r14 974 subq %r9,%rbp 975 xorq %r15,%r15 976 977 addq %r12,%rax 978 adcq $0,%rdx 979 movq %rax,8(%rdi) 980 movq %rdx,16(%rdi) 981 movq %r15,24(%rdi) 982 983 movq -16(%rsi,%rbp,1),%rax 984 leaq 64(%rsp,%r9,2),%rdi 985 xorq %r10,%r10 986 movq -24(%rdi,%rbp,2),%r11 987 988 leaq (%r14,%r10,2),%r12 989 shrq $63,%r10 990 leaq (%rcx,%r11,2),%r13 991 shrq $63,%r11 992 orq %r10,%r13 993 movq -16(%rdi,%rbp,2),%r10 994 movq %r11,%r14 995 mulq %rax 996 negq %r15 997 movq -8(%rdi,%rbp,2),%r11 998 adcq %rax,%r12 999 movq -8(%rsi,%rbp,1),%rax 1000 movq %r12,-32(%rdi,%rbp,2) 1001 adcq %rdx,%r13 1002 1003 leaq (%r14,%r10,2),%rbx 1004 movq %r13,-24(%rdi,%rbp,2) 1005 sbbq %r15,%r15 1006 shrq $63,%r10 1007 leaq (%rcx,%r11,2),%r8 1008 shrq $63,%r11 1009 orq %r10,%r8 1010 movq 0(%rdi,%rbp,2),%r10 1011 movq %r11,%r14 1012 mulq %rax 1013 negq %r15 1014 movq 8(%rdi,%rbp,2),%r11 1015 adcq %rax,%rbx 1016 movq 0(%rsi,%rbp,1),%rax 1017 movq %rbx,-16(%rdi,%rbp,2) 1018 adcq %rdx,%r8 1019 leaq 16(%rbp),%rbp 1020 movq %r8,-40(%rdi,%rbp,2) 1021 sbbq %r15,%r15 1022 jmp .Lsqr4x_shift_n_add 1023 1024.align 16 1025.Lsqr4x_shift_n_add: 1026 leaq (%r14,%r10,2),%r12 1027 shrq $63,%r10 1028 leaq (%rcx,%r11,2),%r13 1029 shrq $63,%r11 1030 orq %r10,%r13 1031 movq -16(%rdi,%rbp,2),%r10 1032 movq %r11,%r14 1033 mulq %rax 1034 negq %r15 1035 movq -8(%rdi,%rbp,2),%r11 1036 adcq %rax,%r12 1037 movq -8(%rsi,%rbp,1),%rax 1038 movq %r12,-32(%rdi,%rbp,2) 1039 adcq %rdx,%r13 1040 1041 leaq (%r14,%r10,2),%rbx 1042 movq %r13,-24(%rdi,%rbp,2) 1043 sbbq %r15,%r15 1044 shrq $63,%r10 1045 leaq (%rcx,%r11,2),%r8 1046 shrq $63,%r11 1047 orq %r10,%r8 1048 movq 0(%rdi,%rbp,2),%r10 1049 movq %r11,%r14 1050 mulq %rax 1051 negq %r15 1052 movq 8(%rdi,%rbp,2),%r11 1053 adcq %rax,%rbx 1054 movq 0(%rsi,%rbp,1),%rax 1055 movq %rbx,-16(%rdi,%rbp,2) 1056 adcq %rdx,%r8 1057 1058 leaq (%r14,%r10,2),%r12 1059 movq %r8,-8(%rdi,%rbp,2) 1060 sbbq %r15,%r15 1061 shrq $63,%r10 1062 leaq (%rcx,%r11,2),%r13 1063 shrq $63,%r11 1064 orq %r10,%r13 1065 movq 16(%rdi,%rbp,2),%r10 1066 movq %r11,%r14 1067 mulq %rax 1068 negq %r15 1069 movq 24(%rdi,%rbp,2),%r11 1070 adcq %rax,%r12 1071 movq 8(%rsi,%rbp,1),%rax 1072 movq %r12,0(%rdi,%rbp,2) 1073 adcq %rdx,%r13 1074 1075 leaq (%r14,%r10,2),%rbx 1076 movq %r13,8(%rdi,%rbp,2) 1077 sbbq %r15,%r15 1078 shrq $63,%r10 1079 leaq (%rcx,%r11,2),%r8 1080 shrq $63,%r11 1081 orq %r10,%r8 1082 movq 32(%rdi,%rbp,2),%r10 1083 movq %r11,%r14 1084 mulq %rax 1085 negq %r15 1086 movq 40(%rdi,%rbp,2),%r11 1087 adcq %rax,%rbx 1088 movq 16(%rsi,%rbp,1),%rax 1089 movq %rbx,16(%rdi,%rbp,2) 1090 adcq %rdx,%r8 1091 movq %r8,24(%rdi,%rbp,2) 1092 sbbq %r15,%r15 1093 addq $32,%rbp 1094 jnz .Lsqr4x_shift_n_add 1095 1096 leaq (%r14,%r10,2),%r12 1097 shrq $63,%r10 1098 leaq (%rcx,%r11,2),%r13 1099 shrq $63,%r11 1100 orq %r10,%r13 1101 movq -16(%rdi),%r10 1102 movq %r11,%r14 1103 mulq %rax 1104 negq %r15 1105 movq -8(%rdi),%r11 1106 adcq %rax,%r12 1107 movq -8(%rsi),%rax 1108 movq %r12,-32(%rdi) 1109 adcq %rdx,%r13 1110 1111 leaq (%r14,%r10,2),%rbx 1112 movq %r13,-24(%rdi) 1113 sbbq %r15,%r15 1114 shrq $63,%r10 1115 leaq (%rcx,%r11,2),%r8 1116 shrq $63,%r11 1117 orq %r10,%r8 1118 mulq %rax 1119 negq %r15 1120 adcq %rax,%rbx 1121 adcq %rdx,%r8 1122 movq %rbx,-16(%rdi) 1123 movq %r8,-8(%rdi) 1124 movq 40(%rsp),%rsi 1125 movq 48(%rsp),%r8 1126 xorq %rcx,%rcx 1127 movq %r9,0(%rsp) 1128 subq %r9,%rcx 1129 movq 64(%rsp),%r10 1130 movq %r8,%r14 1131 leaq 64(%rsp,%r9,2),%rax 1132 leaq 64(%rsp,%r9,1),%rdi 1133 movq %rax,8(%rsp) 1134 leaq (%rsi,%r9,1),%rsi 1135 xorq %rbp,%rbp 1136 1137 movq 0(%rsi,%rcx,1),%rax 1138 movq 8(%rsi,%rcx,1),%r9 1139 imulq %r10,%r14 1140 movq %rax,%rbx 1141 jmp .Lsqr4x_mont_outer 1142 1143.align 16 1144.Lsqr4x_mont_outer: 1145 xorq %r11,%r11 1146 mulq %r14 1147 addq %rax,%r10 1148 movq %r9,%rax 1149 adcq %rdx,%r11 1150 movq %r8,%r15 1151 1152 xorq %r10,%r10 1153 addq 8(%rdi,%rcx,1),%r11 1154 adcq $0,%r10 1155 mulq %r14 1156 addq %rax,%r11 1157 movq %rbx,%rax 1158 adcq %rdx,%r10 1159 1160 imulq %r11,%r15 1161 1162 movq 16(%rsi,%rcx,1),%rbx 1163 xorq %r13,%r13 1164 addq %r11,%r12 1165 adcq $0,%r13 1166 mulq %r15 1167 addq %rax,%r12 1168 movq %rbx,%rax 1169 adcq %rdx,%r13 1170 movq %r12,8(%rdi,%rcx,1) 1171 1172 xorq %r11,%r11 1173 addq 16(%rdi,%rcx,1),%r10 1174 adcq $0,%r11 1175 mulq %r14 1176 addq %rax,%r10 1177 movq %r9,%rax 1178 adcq %rdx,%r11 1179 1180 movq 24(%rsi,%rcx,1),%r9 1181 xorq %r12,%r12 1182 addq %r10,%r13 1183 adcq $0,%r12 1184 mulq %r15 1185 addq %rax,%r13 1186 movq %r9,%rax 1187 adcq %rdx,%r12 1188 movq %r13,16(%rdi,%rcx,1) 1189 1190 xorq %r10,%r10 1191 addq 24(%rdi,%rcx,1),%r11 1192 leaq 32(%rcx),%rcx 1193 adcq $0,%r10 1194 mulq %r14 1195 addq %rax,%r11 1196 movq %rbx,%rax 1197 adcq %rdx,%r10 1198 jmp .Lsqr4x_mont_inner 1199 1200.align 16 1201.Lsqr4x_mont_inner: 1202 movq (%rsi,%rcx,1),%rbx 1203 xorq %r13,%r13 1204 addq %r11,%r12 1205 adcq $0,%r13 1206 mulq %r15 1207 addq %rax,%r12 1208 movq %rbx,%rax 1209 adcq %rdx,%r13 1210 movq %r12,-8(%rdi,%rcx,1) 1211 1212 xorq %r11,%r11 1213 addq (%rdi,%rcx,1),%r10 1214 adcq $0,%r11 1215 mulq %r14 1216 addq %rax,%r10 1217 movq %r9,%rax 1218 adcq %rdx,%r11 1219 1220 movq 8(%rsi,%rcx,1),%r9 1221 xorq %r12,%r12 1222 addq %r10,%r13 1223 adcq $0,%r12 1224 mulq %r15 1225 addq %rax,%r13 1226 movq %r9,%rax 1227 adcq %rdx,%r12 1228 movq %r13,(%rdi,%rcx,1) 1229 1230 xorq %r10,%r10 1231 addq 8(%rdi,%rcx,1),%r11 1232 adcq $0,%r10 1233 mulq %r14 1234 addq %rax,%r11 1235 movq %rbx,%rax 1236 adcq %rdx,%r10 1237 1238 1239 movq 16(%rsi,%rcx,1),%rbx 1240 xorq %r13,%r13 1241 addq %r11,%r12 1242 adcq $0,%r13 1243 mulq %r15 1244 addq %rax,%r12 1245 movq %rbx,%rax 1246 adcq %rdx,%r13 1247 movq %r12,8(%rdi,%rcx,1) 1248 1249 xorq %r11,%r11 1250 addq 16(%rdi,%rcx,1),%r10 1251 adcq $0,%r11 1252 mulq %r14 1253 addq %rax,%r10 1254 movq %r9,%rax 1255 adcq %rdx,%r11 1256 1257 movq 24(%rsi,%rcx,1),%r9 1258 xorq %r12,%r12 1259 addq %r10,%r13 1260 adcq $0,%r12 1261 mulq %r15 1262 addq %rax,%r13 1263 movq %r9,%rax 1264 adcq %rdx,%r12 1265 movq %r13,16(%rdi,%rcx,1) 1266 1267 xorq %r10,%r10 1268 addq 24(%rdi,%rcx,1),%r11 1269 leaq 32(%rcx),%rcx 1270 adcq $0,%r10 1271 mulq %r14 1272 addq %rax,%r11 1273 movq %rbx,%rax 1274 adcq %rdx,%r10 1275 cmpq $0,%rcx 1276 jne .Lsqr4x_mont_inner 1277 1278 subq 0(%rsp),%rcx 1279 movq %r8,%r14 1280 1281 xorq %r13,%r13 1282 addq %r11,%r12 1283 adcq $0,%r13 1284 mulq %r15 1285 addq %rax,%r12 1286 movq %r9,%rax 1287 adcq %rdx,%r13 1288 movq %r12,-8(%rdi) 1289 1290 xorq %r11,%r11 1291 addq (%rdi),%r10 1292 adcq $0,%r11 1293 movq 0(%rsi,%rcx,1),%rbx 1294 addq %rbp,%r10 1295 adcq $0,%r11 1296 1297 imulq 16(%rdi,%rcx,1),%r14 1298 xorq %r12,%r12 1299 movq 8(%rsi,%rcx,1),%r9 1300 addq %r10,%r13 1301 movq 16(%rdi,%rcx,1),%r10 1302 adcq $0,%r12 1303 mulq %r15 1304 addq %rax,%r13 1305 movq %rbx,%rax 1306 adcq %rdx,%r12 1307 movq %r13,(%rdi) 1308 1309 xorq %rbp,%rbp 1310 addq 8(%rdi),%r12 1311 adcq %rbp,%rbp 1312 addq %r11,%r12 1313 leaq 16(%rdi),%rdi 1314 adcq $0,%rbp 1315 movq %r12,-8(%rdi) 1316 cmpq 8(%rsp),%rdi 1317 jb .Lsqr4x_mont_outer 1318 1319 movq 0(%rsp),%r9 1320 movq %rbp,(%rdi) 1321 movq 64(%rsp,%r9,1),%rax 1322 leaq 64(%rsp,%r9,1),%rbx 1323 movq 40(%rsp),%rsi 1324 shrq $5,%r9 1325 movq 8(%rbx),%rdx 1326 xorq %rbp,%rbp 1327 1328 movq 32(%rsp),%rdi 1329 subq 0(%rsi),%rax 1330 movq 16(%rbx),%r10 1331 movq 24(%rbx),%r11 1332 sbbq 8(%rsi),%rdx 1333 leaq -1(%r9),%rcx 1334 jmp .Lsqr4x_sub 1335.align 16 1336.Lsqr4x_sub: 1337 movq %rax,0(%rdi,%rbp,8) 1338 movq %rdx,8(%rdi,%rbp,8) 1339 sbbq 16(%rsi,%rbp,8),%r10 1340 movq 32(%rbx,%rbp,8),%rax 1341 movq 40(%rbx,%rbp,8),%rdx 1342 sbbq 24(%rsi,%rbp,8),%r11 1343 movq %r10,16(%rdi,%rbp,8) 1344 movq %r11,24(%rdi,%rbp,8) 1345 sbbq 32(%rsi,%rbp,8),%rax 1346 movq 48(%rbx,%rbp,8),%r10 1347 movq 56(%rbx,%rbp,8),%r11 1348 sbbq 40(%rsi,%rbp,8),%rdx 1349 leaq 4(%rbp),%rbp 1350 decq %rcx 1351 jnz .Lsqr4x_sub 1352 1353 movq %rax,0(%rdi,%rbp,8) 1354 movq 32(%rbx,%rbp,8),%rax 1355 sbbq 16(%rsi,%rbp,8),%r10 1356 movq %rdx,8(%rdi,%rbp,8) 1357 sbbq 24(%rsi,%rbp,8),%r11 1358 movq %r10,16(%rdi,%rbp,8) 1359 1360 sbbq $0,%rax 1361 movq %r11,24(%rdi,%rbp,8) 1362 xorq %rbp,%rbp 1363 andq %rax,%rbx 1364 notq %rax 1365 movq %rdi,%rsi 1366 andq %rax,%rsi 1367 leaq -1(%r9),%rcx 1368 orq %rsi,%rbx 1369 1370 pxor %xmm0,%xmm0 1371 leaq 64(%rsp,%r9,8),%rsi 1372 movdqu (%rbx),%xmm1 1373 leaq (%rsi,%r9,8),%rsi 1374 movdqa %xmm0,64(%rsp) 1375 movdqa %xmm0,(%rsi) 1376 movdqu %xmm1,(%rdi) 1377 jmp .Lsqr4x_copy 1378.align 16 1379.Lsqr4x_copy: 1380 movdqu 16(%rbx,%rbp,1),%xmm2 1381 movdqu 32(%rbx,%rbp,1),%xmm1 1382 movdqa %xmm0,80(%rsp,%rbp,1) 1383 movdqa %xmm0,96(%rsp,%rbp,1) 1384 movdqa %xmm0,16(%rsi,%rbp,1) 1385 movdqa %xmm0,32(%rsi,%rbp,1) 1386 movdqu %xmm2,16(%rdi,%rbp,1) 1387 movdqu %xmm1,32(%rdi,%rbp,1) 1388 leaq 32(%rbp),%rbp 1389 decq %rcx 1390 jnz .Lsqr4x_copy 1391 1392 movdqu 16(%rbx,%rbp,1),%xmm2 1393 movdqa %xmm0,80(%rsp,%rbp,1) 1394 movdqa %xmm0,16(%rsi,%rbp,1) 1395 movdqu %xmm2,16(%rdi,%rbp,1) 1396 movq 56(%rsp),%rsi 1397 movq $1,%rax 1398 movq 0(%rsi),%r15 1399 movq 8(%rsi),%r14 1400 movq 16(%rsi),%r13 1401 movq 24(%rsi),%r12 1402 movq 32(%rsi),%rbp 1403 movq 40(%rsi),%rbx 1404 leaq 48(%rsi),%rsp 1405.Lsqr4x_epilogue: 1406 .byte 0xf3,0xc3 1407.size bn_sqr4x_mont,.-bn_sqr4x_mont 1408.byte 77,111,110,116,103,111,109,101,114,121,32,77,117,108,116,105,112,108,105,99,97,116,105,111,110,32,102,111,114,32,120,56,54,95,54,52,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 1409.align 16 1410