github.com/consensys/gnark-crypto@v0.14.0/ecc/bw6-633/fp/element_mul_amd64.s (about) 1 // +build !purego 2 3 // Copyright 2020 ConsenSys Software Inc. 4 // 5 // Licensed under the Apache License, Version 2.0 (the "License"); 6 // you may not use this file except in compliance with the License. 7 // You may obtain a copy of the License at 8 // 9 // http://www.apache.org/licenses/LICENSE-2.0 10 // 11 // Unless required by applicable law or agreed to in writing, software 12 // distributed under the License is distributed on an "AS IS" BASIS, 13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 // See the License for the specific language governing permissions and 15 // limitations under the License. 16 17 #include "textflag.h" 18 #include "funcdata.h" 19 20 // modulus q 21 DATA q<>+0(SB)/8, $0xd74916ea4570000d 22 DATA q<>+8(SB)/8, $0x3d369bd31147f73c 23 DATA q<>+16(SB)/8, $0xd7b5ce7ab839c225 24 DATA q<>+24(SB)/8, $0x7e0e8850edbda407 25 DATA q<>+32(SB)/8, $0xb8da9f5e83f57c49 26 DATA q<>+40(SB)/8, $0x8152a6c0fadea490 27 DATA q<>+48(SB)/8, $0x4e59769ad9bbda2f 28 DATA q<>+56(SB)/8, $0xa8fcd8c75d79d2c7 29 DATA q<>+64(SB)/8, $0xfc1a174f01d72ab5 30 DATA q<>+72(SB)/8, $0x0126633cc0f35f63 31 GLOBL q<>(SB), (RODATA+NOPTR), $80 32 33 // qInv0 q'[0] 34 DATA qInv0<>(SB)/8, $0xb50f29ab0b03b13b 35 GLOBL qInv0<>(SB), (RODATA+NOPTR), $8 36 37 #define REDUCE(ra0, ra1, ra2, ra3, ra4, ra5, ra6, ra7, ra8, ra9, rb0, rb1, rb2, rb3, rb4, rb5, rb6, rb7, rb8, rb9) \ 38 MOVQ ra0, rb0; \ 39 SUBQ q<>(SB), ra0; \ 40 MOVQ ra1, rb1; \ 41 SBBQ q<>+8(SB), ra1; \ 42 MOVQ ra2, rb2; \ 43 SBBQ q<>+16(SB), ra2; \ 44 MOVQ ra3, rb3; \ 45 SBBQ q<>+24(SB), ra3; \ 46 MOVQ ra4, rb4; \ 47 SBBQ q<>+32(SB), ra4; \ 48 MOVQ ra5, rb5; \ 49 SBBQ q<>+40(SB), ra5; \ 50 MOVQ ra6, rb6; \ 51 SBBQ q<>+48(SB), ra6; \ 52 MOVQ ra7, rb7; \ 53 SBBQ q<>+56(SB), ra7; \ 54 MOVQ ra8, rb8; \ 55 SBBQ q<>+64(SB), ra8; \ 56 MOVQ ra9, rb9; \ 57 SBBQ q<>+72(SB), ra9; \ 58 CMOVQCS rb0, ra0; \ 59 CMOVQCS rb1, ra1; \ 60 CMOVQCS rb2, ra2; \ 61 CMOVQCS rb3, ra3; \ 62 CMOVQCS rb4, ra4; \ 63 CMOVQCS rb5, ra5; \ 64 CMOVQCS rb6, ra6; \ 65 CMOVQCS rb7, ra7; \ 66 CMOVQCS rb8, ra8; \ 67 CMOVQCS rb9, ra9; \ 68 69 // mul(res, x, y *Element) 70 TEXT ·mul(SB), $64-24 71 72 // the algorithm is described in the Element.Mul declaration (.go) 73 // however, to benefit from the ADCX and ADOX carry chains 74 // we split the inner loops in 2: 75 // for i=0 to N-1 76 // for j=0 to N-1 77 // (A,t[j]) := t[j] + x[j]*y[i] + A 78 // m := t[0]*q'[0] mod W 79 // C,_ := t[0] + m*q[0] 80 // for j=1 to N-1 81 // (C,t[j-1]) := t[j] + m*q[j] + C 82 // t[N-1] = C + A 83 84 NO_LOCAL_POINTERS 85 CMPB ·supportAdx(SB), $1 86 JNE l1 87 MOVQ x+8(FP), R12 88 MOVQ y+16(FP), R13 89 90 // A -> BP 91 // t[0] -> R14 92 // t[1] -> R15 93 // t[2] -> CX 94 // t[3] -> BX 95 // t[4] -> SI 96 // t[5] -> DI 97 // t[6] -> R8 98 // t[7] -> R9 99 // t[8] -> R10 100 // t[9] -> R11 101 // clear the flags 102 XORQ AX, AX 103 MOVQ 0(R13), DX 104 105 // (A,t[0]) := x[0]*y[0] + A 106 MULXQ 0(R12), R14, R15 107 108 // (A,t[1]) := x[1]*y[0] + A 109 MULXQ 8(R12), AX, CX 110 ADOXQ AX, R15 111 112 // (A,t[2]) := x[2]*y[0] + A 113 MULXQ 16(R12), AX, BX 114 ADOXQ AX, CX 115 116 // (A,t[3]) := x[3]*y[0] + A 117 MULXQ 24(R12), AX, SI 118 ADOXQ AX, BX 119 120 // (A,t[4]) := x[4]*y[0] + A 121 MULXQ 32(R12), AX, DI 122 ADOXQ AX, SI 123 124 // (A,t[5]) := x[5]*y[0] + A 125 MULXQ 40(R12), AX, R8 126 ADOXQ AX, DI 127 128 // (A,t[6]) := x[6]*y[0] + A 129 MULXQ 48(R12), AX, R9 130 ADOXQ AX, R8 131 132 // (A,t[7]) := x[7]*y[0] + A 133 MULXQ 56(R12), AX, R10 134 ADOXQ AX, R9 135 136 // (A,t[8]) := x[8]*y[0] + A 137 MULXQ 64(R12), AX, R11 138 ADOXQ AX, R10 139 140 // (A,t[9]) := x[9]*y[0] + A 141 MULXQ 72(R12), AX, BP 142 ADOXQ AX, R11 143 144 // A += carries from ADCXQ and ADOXQ 145 MOVQ $0, AX 146 ADOXQ AX, BP 147 PUSHQ BP 148 149 // m := t[0]*q'[0] mod W 150 MOVQ qInv0<>(SB), DX 151 IMULQ R14, DX 152 153 // clear the flags 154 XORQ AX, AX 155 156 // C,_ := t[0] + m*q[0] 157 MULXQ q<>+0(SB), AX, BP 158 ADCXQ R14, AX 159 MOVQ BP, R14 160 POPQ BP 161 162 // (C,t[0]) := t[1] + m*q[1] + C 163 ADCXQ R15, R14 164 MULXQ q<>+8(SB), AX, R15 165 ADOXQ AX, R14 166 167 // (C,t[1]) := t[2] + m*q[2] + C 168 ADCXQ CX, R15 169 MULXQ q<>+16(SB), AX, CX 170 ADOXQ AX, R15 171 172 // (C,t[2]) := t[3] + m*q[3] + C 173 ADCXQ BX, CX 174 MULXQ q<>+24(SB), AX, BX 175 ADOXQ AX, CX 176 177 // (C,t[3]) := t[4] + m*q[4] + C 178 ADCXQ SI, BX 179 MULXQ q<>+32(SB), AX, SI 180 ADOXQ AX, BX 181 182 // (C,t[4]) := t[5] + m*q[5] + C 183 ADCXQ DI, SI 184 MULXQ q<>+40(SB), AX, DI 185 ADOXQ AX, SI 186 187 // (C,t[5]) := t[6] + m*q[6] + C 188 ADCXQ R8, DI 189 MULXQ q<>+48(SB), AX, R8 190 ADOXQ AX, DI 191 192 // (C,t[6]) := t[7] + m*q[7] + C 193 ADCXQ R9, R8 194 MULXQ q<>+56(SB), AX, R9 195 ADOXQ AX, R8 196 197 // (C,t[7]) := t[8] + m*q[8] + C 198 ADCXQ R10, R9 199 MULXQ q<>+64(SB), AX, R10 200 ADOXQ AX, R9 201 202 // (C,t[8]) := t[9] + m*q[9] + C 203 ADCXQ R11, R10 204 MULXQ q<>+72(SB), AX, R11 205 ADOXQ AX, R10 206 207 // t[9] = C + A 208 MOVQ $0, AX 209 ADCXQ AX, R11 210 ADOXQ BP, R11 211 212 // clear the flags 213 XORQ AX, AX 214 MOVQ 8(R13), DX 215 216 // (A,t[0]) := t[0] + x[0]*y[1] + A 217 MULXQ 0(R12), AX, BP 218 ADOXQ AX, R14 219 220 // (A,t[1]) := t[1] + x[1]*y[1] + A 221 ADCXQ BP, R15 222 MULXQ 8(R12), AX, BP 223 ADOXQ AX, R15 224 225 // (A,t[2]) := t[2] + x[2]*y[1] + A 226 ADCXQ BP, CX 227 MULXQ 16(R12), AX, BP 228 ADOXQ AX, CX 229 230 // (A,t[3]) := t[3] + x[3]*y[1] + A 231 ADCXQ BP, BX 232 MULXQ 24(R12), AX, BP 233 ADOXQ AX, BX 234 235 // (A,t[4]) := t[4] + x[4]*y[1] + A 236 ADCXQ BP, SI 237 MULXQ 32(R12), AX, BP 238 ADOXQ AX, SI 239 240 // (A,t[5]) := t[5] + x[5]*y[1] + A 241 ADCXQ BP, DI 242 MULXQ 40(R12), AX, BP 243 ADOXQ AX, DI 244 245 // (A,t[6]) := t[6] + x[6]*y[1] + A 246 ADCXQ BP, R8 247 MULXQ 48(R12), AX, BP 248 ADOXQ AX, R8 249 250 // (A,t[7]) := t[7] + x[7]*y[1] + A 251 ADCXQ BP, R9 252 MULXQ 56(R12), AX, BP 253 ADOXQ AX, R9 254 255 // (A,t[8]) := t[8] + x[8]*y[1] + A 256 ADCXQ BP, R10 257 MULXQ 64(R12), AX, BP 258 ADOXQ AX, R10 259 260 // (A,t[9]) := t[9] + x[9]*y[1] + A 261 ADCXQ BP, R11 262 MULXQ 72(R12), AX, BP 263 ADOXQ AX, R11 264 265 // A += carries from ADCXQ and ADOXQ 266 MOVQ $0, AX 267 ADCXQ AX, BP 268 ADOXQ AX, BP 269 PUSHQ BP 270 271 // m := t[0]*q'[0] mod W 272 MOVQ qInv0<>(SB), DX 273 IMULQ R14, DX 274 275 // clear the flags 276 XORQ AX, AX 277 278 // C,_ := t[0] + m*q[0] 279 MULXQ q<>+0(SB), AX, BP 280 ADCXQ R14, AX 281 MOVQ BP, R14 282 POPQ BP 283 284 // (C,t[0]) := t[1] + m*q[1] + C 285 ADCXQ R15, R14 286 MULXQ q<>+8(SB), AX, R15 287 ADOXQ AX, R14 288 289 // (C,t[1]) := t[2] + m*q[2] + C 290 ADCXQ CX, R15 291 MULXQ q<>+16(SB), AX, CX 292 ADOXQ AX, R15 293 294 // (C,t[2]) := t[3] + m*q[3] + C 295 ADCXQ BX, CX 296 MULXQ q<>+24(SB), AX, BX 297 ADOXQ AX, CX 298 299 // (C,t[3]) := t[4] + m*q[4] + C 300 ADCXQ SI, BX 301 MULXQ q<>+32(SB), AX, SI 302 ADOXQ AX, BX 303 304 // (C,t[4]) := t[5] + m*q[5] + C 305 ADCXQ DI, SI 306 MULXQ q<>+40(SB), AX, DI 307 ADOXQ AX, SI 308 309 // (C,t[5]) := t[6] + m*q[6] + C 310 ADCXQ R8, DI 311 MULXQ q<>+48(SB), AX, R8 312 ADOXQ AX, DI 313 314 // (C,t[6]) := t[7] + m*q[7] + C 315 ADCXQ R9, R8 316 MULXQ q<>+56(SB), AX, R9 317 ADOXQ AX, R8 318 319 // (C,t[7]) := t[8] + m*q[8] + C 320 ADCXQ R10, R9 321 MULXQ q<>+64(SB), AX, R10 322 ADOXQ AX, R9 323 324 // (C,t[8]) := t[9] + m*q[9] + C 325 ADCXQ R11, R10 326 MULXQ q<>+72(SB), AX, R11 327 ADOXQ AX, R10 328 329 // t[9] = C + A 330 MOVQ $0, AX 331 ADCXQ AX, R11 332 ADOXQ BP, R11 333 334 // clear the flags 335 XORQ AX, AX 336 MOVQ 16(R13), DX 337 338 // (A,t[0]) := t[0] + x[0]*y[2] + A 339 MULXQ 0(R12), AX, BP 340 ADOXQ AX, R14 341 342 // (A,t[1]) := t[1] + x[1]*y[2] + A 343 ADCXQ BP, R15 344 MULXQ 8(R12), AX, BP 345 ADOXQ AX, R15 346 347 // (A,t[2]) := t[2] + x[2]*y[2] + A 348 ADCXQ BP, CX 349 MULXQ 16(R12), AX, BP 350 ADOXQ AX, CX 351 352 // (A,t[3]) := t[3] + x[3]*y[2] + A 353 ADCXQ BP, BX 354 MULXQ 24(R12), AX, BP 355 ADOXQ AX, BX 356 357 // (A,t[4]) := t[4] + x[4]*y[2] + A 358 ADCXQ BP, SI 359 MULXQ 32(R12), AX, BP 360 ADOXQ AX, SI 361 362 // (A,t[5]) := t[5] + x[5]*y[2] + A 363 ADCXQ BP, DI 364 MULXQ 40(R12), AX, BP 365 ADOXQ AX, DI 366 367 // (A,t[6]) := t[6] + x[6]*y[2] + A 368 ADCXQ BP, R8 369 MULXQ 48(R12), AX, BP 370 ADOXQ AX, R8 371 372 // (A,t[7]) := t[7] + x[7]*y[2] + A 373 ADCXQ BP, R9 374 MULXQ 56(R12), AX, BP 375 ADOXQ AX, R9 376 377 // (A,t[8]) := t[8] + x[8]*y[2] + A 378 ADCXQ BP, R10 379 MULXQ 64(R12), AX, BP 380 ADOXQ AX, R10 381 382 // (A,t[9]) := t[9] + x[9]*y[2] + A 383 ADCXQ BP, R11 384 MULXQ 72(R12), AX, BP 385 ADOXQ AX, R11 386 387 // A += carries from ADCXQ and ADOXQ 388 MOVQ $0, AX 389 ADCXQ AX, BP 390 ADOXQ AX, BP 391 PUSHQ BP 392 393 // m := t[0]*q'[0] mod W 394 MOVQ qInv0<>(SB), DX 395 IMULQ R14, DX 396 397 // clear the flags 398 XORQ AX, AX 399 400 // C,_ := t[0] + m*q[0] 401 MULXQ q<>+0(SB), AX, BP 402 ADCXQ R14, AX 403 MOVQ BP, R14 404 POPQ BP 405 406 // (C,t[0]) := t[1] + m*q[1] + C 407 ADCXQ R15, R14 408 MULXQ q<>+8(SB), AX, R15 409 ADOXQ AX, R14 410 411 // (C,t[1]) := t[2] + m*q[2] + C 412 ADCXQ CX, R15 413 MULXQ q<>+16(SB), AX, CX 414 ADOXQ AX, R15 415 416 // (C,t[2]) := t[3] + m*q[3] + C 417 ADCXQ BX, CX 418 MULXQ q<>+24(SB), AX, BX 419 ADOXQ AX, CX 420 421 // (C,t[3]) := t[4] + m*q[4] + C 422 ADCXQ SI, BX 423 MULXQ q<>+32(SB), AX, SI 424 ADOXQ AX, BX 425 426 // (C,t[4]) := t[5] + m*q[5] + C 427 ADCXQ DI, SI 428 MULXQ q<>+40(SB), AX, DI 429 ADOXQ AX, SI 430 431 // (C,t[5]) := t[6] + m*q[6] + C 432 ADCXQ R8, DI 433 MULXQ q<>+48(SB), AX, R8 434 ADOXQ AX, DI 435 436 // (C,t[6]) := t[7] + m*q[7] + C 437 ADCXQ R9, R8 438 MULXQ q<>+56(SB), AX, R9 439 ADOXQ AX, R8 440 441 // (C,t[7]) := t[8] + m*q[8] + C 442 ADCXQ R10, R9 443 MULXQ q<>+64(SB), AX, R10 444 ADOXQ AX, R9 445 446 // (C,t[8]) := t[9] + m*q[9] + C 447 ADCXQ R11, R10 448 MULXQ q<>+72(SB), AX, R11 449 ADOXQ AX, R10 450 451 // t[9] = C + A 452 MOVQ $0, AX 453 ADCXQ AX, R11 454 ADOXQ BP, R11 455 456 // clear the flags 457 XORQ AX, AX 458 MOVQ 24(R13), DX 459 460 // (A,t[0]) := t[0] + x[0]*y[3] + A 461 MULXQ 0(R12), AX, BP 462 ADOXQ AX, R14 463 464 // (A,t[1]) := t[1] + x[1]*y[3] + A 465 ADCXQ BP, R15 466 MULXQ 8(R12), AX, BP 467 ADOXQ AX, R15 468 469 // (A,t[2]) := t[2] + x[2]*y[3] + A 470 ADCXQ BP, CX 471 MULXQ 16(R12), AX, BP 472 ADOXQ AX, CX 473 474 // (A,t[3]) := t[3] + x[3]*y[3] + A 475 ADCXQ BP, BX 476 MULXQ 24(R12), AX, BP 477 ADOXQ AX, BX 478 479 // (A,t[4]) := t[4] + x[4]*y[3] + A 480 ADCXQ BP, SI 481 MULXQ 32(R12), AX, BP 482 ADOXQ AX, SI 483 484 // (A,t[5]) := t[5] + x[5]*y[3] + A 485 ADCXQ BP, DI 486 MULXQ 40(R12), AX, BP 487 ADOXQ AX, DI 488 489 // (A,t[6]) := t[6] + x[6]*y[3] + A 490 ADCXQ BP, R8 491 MULXQ 48(R12), AX, BP 492 ADOXQ AX, R8 493 494 // (A,t[7]) := t[7] + x[7]*y[3] + A 495 ADCXQ BP, R9 496 MULXQ 56(R12), AX, BP 497 ADOXQ AX, R9 498 499 // (A,t[8]) := t[8] + x[8]*y[3] + A 500 ADCXQ BP, R10 501 MULXQ 64(R12), AX, BP 502 ADOXQ AX, R10 503 504 // (A,t[9]) := t[9] + x[9]*y[3] + A 505 ADCXQ BP, R11 506 MULXQ 72(R12), AX, BP 507 ADOXQ AX, R11 508 509 // A += carries from ADCXQ and ADOXQ 510 MOVQ $0, AX 511 ADCXQ AX, BP 512 ADOXQ AX, BP 513 PUSHQ BP 514 515 // m := t[0]*q'[0] mod W 516 MOVQ qInv0<>(SB), DX 517 IMULQ R14, DX 518 519 // clear the flags 520 XORQ AX, AX 521 522 // C,_ := t[0] + m*q[0] 523 MULXQ q<>+0(SB), AX, BP 524 ADCXQ R14, AX 525 MOVQ BP, R14 526 POPQ BP 527 528 // (C,t[0]) := t[1] + m*q[1] + C 529 ADCXQ R15, R14 530 MULXQ q<>+8(SB), AX, R15 531 ADOXQ AX, R14 532 533 // (C,t[1]) := t[2] + m*q[2] + C 534 ADCXQ CX, R15 535 MULXQ q<>+16(SB), AX, CX 536 ADOXQ AX, R15 537 538 // (C,t[2]) := t[3] + m*q[3] + C 539 ADCXQ BX, CX 540 MULXQ q<>+24(SB), AX, BX 541 ADOXQ AX, CX 542 543 // (C,t[3]) := t[4] + m*q[4] + C 544 ADCXQ SI, BX 545 MULXQ q<>+32(SB), AX, SI 546 ADOXQ AX, BX 547 548 // (C,t[4]) := t[5] + m*q[5] + C 549 ADCXQ DI, SI 550 MULXQ q<>+40(SB), AX, DI 551 ADOXQ AX, SI 552 553 // (C,t[5]) := t[6] + m*q[6] + C 554 ADCXQ R8, DI 555 MULXQ q<>+48(SB), AX, R8 556 ADOXQ AX, DI 557 558 // (C,t[6]) := t[7] + m*q[7] + C 559 ADCXQ R9, R8 560 MULXQ q<>+56(SB), AX, R9 561 ADOXQ AX, R8 562 563 // (C,t[7]) := t[8] + m*q[8] + C 564 ADCXQ R10, R9 565 MULXQ q<>+64(SB), AX, R10 566 ADOXQ AX, R9 567 568 // (C,t[8]) := t[9] + m*q[9] + C 569 ADCXQ R11, R10 570 MULXQ q<>+72(SB), AX, R11 571 ADOXQ AX, R10 572 573 // t[9] = C + A 574 MOVQ $0, AX 575 ADCXQ AX, R11 576 ADOXQ BP, R11 577 578 // clear the flags 579 XORQ AX, AX 580 MOVQ 32(R13), DX 581 582 // (A,t[0]) := t[0] + x[0]*y[4] + A 583 MULXQ 0(R12), AX, BP 584 ADOXQ AX, R14 585 586 // (A,t[1]) := t[1] + x[1]*y[4] + A 587 ADCXQ BP, R15 588 MULXQ 8(R12), AX, BP 589 ADOXQ AX, R15 590 591 // (A,t[2]) := t[2] + x[2]*y[4] + A 592 ADCXQ BP, CX 593 MULXQ 16(R12), AX, BP 594 ADOXQ AX, CX 595 596 // (A,t[3]) := t[3] + x[3]*y[4] + A 597 ADCXQ BP, BX 598 MULXQ 24(R12), AX, BP 599 ADOXQ AX, BX 600 601 // (A,t[4]) := t[4] + x[4]*y[4] + A 602 ADCXQ BP, SI 603 MULXQ 32(R12), AX, BP 604 ADOXQ AX, SI 605 606 // (A,t[5]) := t[5] + x[5]*y[4] + A 607 ADCXQ BP, DI 608 MULXQ 40(R12), AX, BP 609 ADOXQ AX, DI 610 611 // (A,t[6]) := t[6] + x[6]*y[4] + A 612 ADCXQ BP, R8 613 MULXQ 48(R12), AX, BP 614 ADOXQ AX, R8 615 616 // (A,t[7]) := t[7] + x[7]*y[4] + A 617 ADCXQ BP, R9 618 MULXQ 56(R12), AX, BP 619 ADOXQ AX, R9 620 621 // (A,t[8]) := t[8] + x[8]*y[4] + A 622 ADCXQ BP, R10 623 MULXQ 64(R12), AX, BP 624 ADOXQ AX, R10 625 626 // (A,t[9]) := t[9] + x[9]*y[4] + A 627 ADCXQ BP, R11 628 MULXQ 72(R12), AX, BP 629 ADOXQ AX, R11 630 631 // A += carries from ADCXQ and ADOXQ 632 MOVQ $0, AX 633 ADCXQ AX, BP 634 ADOXQ AX, BP 635 PUSHQ BP 636 637 // m := t[0]*q'[0] mod W 638 MOVQ qInv0<>(SB), DX 639 IMULQ R14, DX 640 641 // clear the flags 642 XORQ AX, AX 643 644 // C,_ := t[0] + m*q[0] 645 MULXQ q<>+0(SB), AX, BP 646 ADCXQ R14, AX 647 MOVQ BP, R14 648 POPQ BP 649 650 // (C,t[0]) := t[1] + m*q[1] + C 651 ADCXQ R15, R14 652 MULXQ q<>+8(SB), AX, R15 653 ADOXQ AX, R14 654 655 // (C,t[1]) := t[2] + m*q[2] + C 656 ADCXQ CX, R15 657 MULXQ q<>+16(SB), AX, CX 658 ADOXQ AX, R15 659 660 // (C,t[2]) := t[3] + m*q[3] + C 661 ADCXQ BX, CX 662 MULXQ q<>+24(SB), AX, BX 663 ADOXQ AX, CX 664 665 // (C,t[3]) := t[4] + m*q[4] + C 666 ADCXQ SI, BX 667 MULXQ q<>+32(SB), AX, SI 668 ADOXQ AX, BX 669 670 // (C,t[4]) := t[5] + m*q[5] + C 671 ADCXQ DI, SI 672 MULXQ q<>+40(SB), AX, DI 673 ADOXQ AX, SI 674 675 // (C,t[5]) := t[6] + m*q[6] + C 676 ADCXQ R8, DI 677 MULXQ q<>+48(SB), AX, R8 678 ADOXQ AX, DI 679 680 // (C,t[6]) := t[7] + m*q[7] + C 681 ADCXQ R9, R8 682 MULXQ q<>+56(SB), AX, R9 683 ADOXQ AX, R8 684 685 // (C,t[7]) := t[8] + m*q[8] + C 686 ADCXQ R10, R9 687 MULXQ q<>+64(SB), AX, R10 688 ADOXQ AX, R9 689 690 // (C,t[8]) := t[9] + m*q[9] + C 691 ADCXQ R11, R10 692 MULXQ q<>+72(SB), AX, R11 693 ADOXQ AX, R10 694 695 // t[9] = C + A 696 MOVQ $0, AX 697 ADCXQ AX, R11 698 ADOXQ BP, R11 699 700 // clear the flags 701 XORQ AX, AX 702 MOVQ 40(R13), DX 703 704 // (A,t[0]) := t[0] + x[0]*y[5] + A 705 MULXQ 0(R12), AX, BP 706 ADOXQ AX, R14 707 708 // (A,t[1]) := t[1] + x[1]*y[5] + A 709 ADCXQ BP, R15 710 MULXQ 8(R12), AX, BP 711 ADOXQ AX, R15 712 713 // (A,t[2]) := t[2] + x[2]*y[5] + A 714 ADCXQ BP, CX 715 MULXQ 16(R12), AX, BP 716 ADOXQ AX, CX 717 718 // (A,t[3]) := t[3] + x[3]*y[5] + A 719 ADCXQ BP, BX 720 MULXQ 24(R12), AX, BP 721 ADOXQ AX, BX 722 723 // (A,t[4]) := t[4] + x[4]*y[5] + A 724 ADCXQ BP, SI 725 MULXQ 32(R12), AX, BP 726 ADOXQ AX, SI 727 728 // (A,t[5]) := t[5] + x[5]*y[5] + A 729 ADCXQ BP, DI 730 MULXQ 40(R12), AX, BP 731 ADOXQ AX, DI 732 733 // (A,t[6]) := t[6] + x[6]*y[5] + A 734 ADCXQ BP, R8 735 MULXQ 48(R12), AX, BP 736 ADOXQ AX, R8 737 738 // (A,t[7]) := t[7] + x[7]*y[5] + A 739 ADCXQ BP, R9 740 MULXQ 56(R12), AX, BP 741 ADOXQ AX, R9 742 743 // (A,t[8]) := t[8] + x[8]*y[5] + A 744 ADCXQ BP, R10 745 MULXQ 64(R12), AX, BP 746 ADOXQ AX, R10 747 748 // (A,t[9]) := t[9] + x[9]*y[5] + A 749 ADCXQ BP, R11 750 MULXQ 72(R12), AX, BP 751 ADOXQ AX, R11 752 753 // A += carries from ADCXQ and ADOXQ 754 MOVQ $0, AX 755 ADCXQ AX, BP 756 ADOXQ AX, BP 757 PUSHQ BP 758 759 // m := t[0]*q'[0] mod W 760 MOVQ qInv0<>(SB), DX 761 IMULQ R14, DX 762 763 // clear the flags 764 XORQ AX, AX 765 766 // C,_ := t[0] + m*q[0] 767 MULXQ q<>+0(SB), AX, BP 768 ADCXQ R14, AX 769 MOVQ BP, R14 770 POPQ BP 771 772 // (C,t[0]) := t[1] + m*q[1] + C 773 ADCXQ R15, R14 774 MULXQ q<>+8(SB), AX, R15 775 ADOXQ AX, R14 776 777 // (C,t[1]) := t[2] + m*q[2] + C 778 ADCXQ CX, R15 779 MULXQ q<>+16(SB), AX, CX 780 ADOXQ AX, R15 781 782 // (C,t[2]) := t[3] + m*q[3] + C 783 ADCXQ BX, CX 784 MULXQ q<>+24(SB), AX, BX 785 ADOXQ AX, CX 786 787 // (C,t[3]) := t[4] + m*q[4] + C 788 ADCXQ SI, BX 789 MULXQ q<>+32(SB), AX, SI 790 ADOXQ AX, BX 791 792 // (C,t[4]) := t[5] + m*q[5] + C 793 ADCXQ DI, SI 794 MULXQ q<>+40(SB), AX, DI 795 ADOXQ AX, SI 796 797 // (C,t[5]) := t[6] + m*q[6] + C 798 ADCXQ R8, DI 799 MULXQ q<>+48(SB), AX, R8 800 ADOXQ AX, DI 801 802 // (C,t[6]) := t[7] + m*q[7] + C 803 ADCXQ R9, R8 804 MULXQ q<>+56(SB), AX, R9 805 ADOXQ AX, R8 806 807 // (C,t[7]) := t[8] + m*q[8] + C 808 ADCXQ R10, R9 809 MULXQ q<>+64(SB), AX, R10 810 ADOXQ AX, R9 811 812 // (C,t[8]) := t[9] + m*q[9] + C 813 ADCXQ R11, R10 814 MULXQ q<>+72(SB), AX, R11 815 ADOXQ AX, R10 816 817 // t[9] = C + A 818 MOVQ $0, AX 819 ADCXQ AX, R11 820 ADOXQ BP, R11 821 822 // clear the flags 823 XORQ AX, AX 824 MOVQ 48(R13), DX 825 826 // (A,t[0]) := t[0] + x[0]*y[6] + A 827 MULXQ 0(R12), AX, BP 828 ADOXQ AX, R14 829 830 // (A,t[1]) := t[1] + x[1]*y[6] + A 831 ADCXQ BP, R15 832 MULXQ 8(R12), AX, BP 833 ADOXQ AX, R15 834 835 // (A,t[2]) := t[2] + x[2]*y[6] + A 836 ADCXQ BP, CX 837 MULXQ 16(R12), AX, BP 838 ADOXQ AX, CX 839 840 // (A,t[3]) := t[3] + x[3]*y[6] + A 841 ADCXQ BP, BX 842 MULXQ 24(R12), AX, BP 843 ADOXQ AX, BX 844 845 // (A,t[4]) := t[4] + x[4]*y[6] + A 846 ADCXQ BP, SI 847 MULXQ 32(R12), AX, BP 848 ADOXQ AX, SI 849 850 // (A,t[5]) := t[5] + x[5]*y[6] + A 851 ADCXQ BP, DI 852 MULXQ 40(R12), AX, BP 853 ADOXQ AX, DI 854 855 // (A,t[6]) := t[6] + x[6]*y[6] + A 856 ADCXQ BP, R8 857 MULXQ 48(R12), AX, BP 858 ADOXQ AX, R8 859 860 // (A,t[7]) := t[7] + x[7]*y[6] + A 861 ADCXQ BP, R9 862 MULXQ 56(R12), AX, BP 863 ADOXQ AX, R9 864 865 // (A,t[8]) := t[8] + x[8]*y[6] + A 866 ADCXQ BP, R10 867 MULXQ 64(R12), AX, BP 868 ADOXQ AX, R10 869 870 // (A,t[9]) := t[9] + x[9]*y[6] + A 871 ADCXQ BP, R11 872 MULXQ 72(R12), AX, BP 873 ADOXQ AX, R11 874 875 // A += carries from ADCXQ and ADOXQ 876 MOVQ $0, AX 877 ADCXQ AX, BP 878 ADOXQ AX, BP 879 PUSHQ BP 880 881 // m := t[0]*q'[0] mod W 882 MOVQ qInv0<>(SB), DX 883 IMULQ R14, DX 884 885 // clear the flags 886 XORQ AX, AX 887 888 // C,_ := t[0] + m*q[0] 889 MULXQ q<>+0(SB), AX, BP 890 ADCXQ R14, AX 891 MOVQ BP, R14 892 POPQ BP 893 894 // (C,t[0]) := t[1] + m*q[1] + C 895 ADCXQ R15, R14 896 MULXQ q<>+8(SB), AX, R15 897 ADOXQ AX, R14 898 899 // (C,t[1]) := t[2] + m*q[2] + C 900 ADCXQ CX, R15 901 MULXQ q<>+16(SB), AX, CX 902 ADOXQ AX, R15 903 904 // (C,t[2]) := t[3] + m*q[3] + C 905 ADCXQ BX, CX 906 MULXQ q<>+24(SB), AX, BX 907 ADOXQ AX, CX 908 909 // (C,t[3]) := t[4] + m*q[4] + C 910 ADCXQ SI, BX 911 MULXQ q<>+32(SB), AX, SI 912 ADOXQ AX, BX 913 914 // (C,t[4]) := t[5] + m*q[5] + C 915 ADCXQ DI, SI 916 MULXQ q<>+40(SB), AX, DI 917 ADOXQ AX, SI 918 919 // (C,t[5]) := t[6] + m*q[6] + C 920 ADCXQ R8, DI 921 MULXQ q<>+48(SB), AX, R8 922 ADOXQ AX, DI 923 924 // (C,t[6]) := t[7] + m*q[7] + C 925 ADCXQ R9, R8 926 MULXQ q<>+56(SB), AX, R9 927 ADOXQ AX, R8 928 929 // (C,t[7]) := t[8] + m*q[8] + C 930 ADCXQ R10, R9 931 MULXQ q<>+64(SB), AX, R10 932 ADOXQ AX, R9 933 934 // (C,t[8]) := t[9] + m*q[9] + C 935 ADCXQ R11, R10 936 MULXQ q<>+72(SB), AX, R11 937 ADOXQ AX, R10 938 939 // t[9] = C + A 940 MOVQ $0, AX 941 ADCXQ AX, R11 942 ADOXQ BP, R11 943 944 // clear the flags 945 XORQ AX, AX 946 MOVQ 56(R13), DX 947 948 // (A,t[0]) := t[0] + x[0]*y[7] + A 949 MULXQ 0(R12), AX, BP 950 ADOXQ AX, R14 951 952 // (A,t[1]) := t[1] + x[1]*y[7] + A 953 ADCXQ BP, R15 954 MULXQ 8(R12), AX, BP 955 ADOXQ AX, R15 956 957 // (A,t[2]) := t[2] + x[2]*y[7] + A 958 ADCXQ BP, CX 959 MULXQ 16(R12), AX, BP 960 ADOXQ AX, CX 961 962 // (A,t[3]) := t[3] + x[3]*y[7] + A 963 ADCXQ BP, BX 964 MULXQ 24(R12), AX, BP 965 ADOXQ AX, BX 966 967 // (A,t[4]) := t[4] + x[4]*y[7] + A 968 ADCXQ BP, SI 969 MULXQ 32(R12), AX, BP 970 ADOXQ AX, SI 971 972 // (A,t[5]) := t[5] + x[5]*y[7] + A 973 ADCXQ BP, DI 974 MULXQ 40(R12), AX, BP 975 ADOXQ AX, DI 976 977 // (A,t[6]) := t[6] + x[6]*y[7] + A 978 ADCXQ BP, R8 979 MULXQ 48(R12), AX, BP 980 ADOXQ AX, R8 981 982 // (A,t[7]) := t[7] + x[7]*y[7] + A 983 ADCXQ BP, R9 984 MULXQ 56(R12), AX, BP 985 ADOXQ AX, R9 986 987 // (A,t[8]) := t[8] + x[8]*y[7] + A 988 ADCXQ BP, R10 989 MULXQ 64(R12), AX, BP 990 ADOXQ AX, R10 991 992 // (A,t[9]) := t[9] + x[9]*y[7] + A 993 ADCXQ BP, R11 994 MULXQ 72(R12), AX, BP 995 ADOXQ AX, R11 996 997 // A += carries from ADCXQ and ADOXQ 998 MOVQ $0, AX 999 ADCXQ AX, BP 1000 ADOXQ AX, BP 1001 PUSHQ BP 1002 1003 // m := t[0]*q'[0] mod W 1004 MOVQ qInv0<>(SB), DX 1005 IMULQ R14, DX 1006 1007 // clear the flags 1008 XORQ AX, AX 1009 1010 // C,_ := t[0] + m*q[0] 1011 MULXQ q<>+0(SB), AX, BP 1012 ADCXQ R14, AX 1013 MOVQ BP, R14 1014 POPQ BP 1015 1016 // (C,t[0]) := t[1] + m*q[1] + C 1017 ADCXQ R15, R14 1018 MULXQ q<>+8(SB), AX, R15 1019 ADOXQ AX, R14 1020 1021 // (C,t[1]) := t[2] + m*q[2] + C 1022 ADCXQ CX, R15 1023 MULXQ q<>+16(SB), AX, CX 1024 ADOXQ AX, R15 1025 1026 // (C,t[2]) := t[3] + m*q[3] + C 1027 ADCXQ BX, CX 1028 MULXQ q<>+24(SB), AX, BX 1029 ADOXQ AX, CX 1030 1031 // (C,t[3]) := t[4] + m*q[4] + C 1032 ADCXQ SI, BX 1033 MULXQ q<>+32(SB), AX, SI 1034 ADOXQ AX, BX 1035 1036 // (C,t[4]) := t[5] + m*q[5] + C 1037 ADCXQ DI, SI 1038 MULXQ q<>+40(SB), AX, DI 1039 ADOXQ AX, SI 1040 1041 // (C,t[5]) := t[6] + m*q[6] + C 1042 ADCXQ R8, DI 1043 MULXQ q<>+48(SB), AX, R8 1044 ADOXQ AX, DI 1045 1046 // (C,t[6]) := t[7] + m*q[7] + C 1047 ADCXQ R9, R8 1048 MULXQ q<>+56(SB), AX, R9 1049 ADOXQ AX, R8 1050 1051 // (C,t[7]) := t[8] + m*q[8] + C 1052 ADCXQ R10, R9 1053 MULXQ q<>+64(SB), AX, R10 1054 ADOXQ AX, R9 1055 1056 // (C,t[8]) := t[9] + m*q[9] + C 1057 ADCXQ R11, R10 1058 MULXQ q<>+72(SB), AX, R11 1059 ADOXQ AX, R10 1060 1061 // t[9] = C + A 1062 MOVQ $0, AX 1063 ADCXQ AX, R11 1064 ADOXQ BP, R11 1065 1066 // clear the flags 1067 XORQ AX, AX 1068 MOVQ 64(R13), DX 1069 1070 // (A,t[0]) := t[0] + x[0]*y[8] + A 1071 MULXQ 0(R12), AX, BP 1072 ADOXQ AX, R14 1073 1074 // (A,t[1]) := t[1] + x[1]*y[8] + A 1075 ADCXQ BP, R15 1076 MULXQ 8(R12), AX, BP 1077 ADOXQ AX, R15 1078 1079 // (A,t[2]) := t[2] + x[2]*y[8] + A 1080 ADCXQ BP, CX 1081 MULXQ 16(R12), AX, BP 1082 ADOXQ AX, CX 1083 1084 // (A,t[3]) := t[3] + x[3]*y[8] + A 1085 ADCXQ BP, BX 1086 MULXQ 24(R12), AX, BP 1087 ADOXQ AX, BX 1088 1089 // (A,t[4]) := t[4] + x[4]*y[8] + A 1090 ADCXQ BP, SI 1091 MULXQ 32(R12), AX, BP 1092 ADOXQ AX, SI 1093 1094 // (A,t[5]) := t[5] + x[5]*y[8] + A 1095 ADCXQ BP, DI 1096 MULXQ 40(R12), AX, BP 1097 ADOXQ AX, DI 1098 1099 // (A,t[6]) := t[6] + x[6]*y[8] + A 1100 ADCXQ BP, R8 1101 MULXQ 48(R12), AX, BP 1102 ADOXQ AX, R8 1103 1104 // (A,t[7]) := t[7] + x[7]*y[8] + A 1105 ADCXQ BP, R9 1106 MULXQ 56(R12), AX, BP 1107 ADOXQ AX, R9 1108 1109 // (A,t[8]) := t[8] + x[8]*y[8] + A 1110 ADCXQ BP, R10 1111 MULXQ 64(R12), AX, BP 1112 ADOXQ AX, R10 1113 1114 // (A,t[9]) := t[9] + x[9]*y[8] + A 1115 ADCXQ BP, R11 1116 MULXQ 72(R12), AX, BP 1117 ADOXQ AX, R11 1118 1119 // A += carries from ADCXQ and ADOXQ 1120 MOVQ $0, AX 1121 ADCXQ AX, BP 1122 ADOXQ AX, BP 1123 PUSHQ BP 1124 1125 // m := t[0]*q'[0] mod W 1126 MOVQ qInv0<>(SB), DX 1127 IMULQ R14, DX 1128 1129 // clear the flags 1130 XORQ AX, AX 1131 1132 // C,_ := t[0] + m*q[0] 1133 MULXQ q<>+0(SB), AX, BP 1134 ADCXQ R14, AX 1135 MOVQ BP, R14 1136 POPQ BP 1137 1138 // (C,t[0]) := t[1] + m*q[1] + C 1139 ADCXQ R15, R14 1140 MULXQ q<>+8(SB), AX, R15 1141 ADOXQ AX, R14 1142 1143 // (C,t[1]) := t[2] + m*q[2] + C 1144 ADCXQ CX, R15 1145 MULXQ q<>+16(SB), AX, CX 1146 ADOXQ AX, R15 1147 1148 // (C,t[2]) := t[3] + m*q[3] + C 1149 ADCXQ BX, CX 1150 MULXQ q<>+24(SB), AX, BX 1151 ADOXQ AX, CX 1152 1153 // (C,t[3]) := t[4] + m*q[4] + C 1154 ADCXQ SI, BX 1155 MULXQ q<>+32(SB), AX, SI 1156 ADOXQ AX, BX 1157 1158 // (C,t[4]) := t[5] + m*q[5] + C 1159 ADCXQ DI, SI 1160 MULXQ q<>+40(SB), AX, DI 1161 ADOXQ AX, SI 1162 1163 // (C,t[5]) := t[6] + m*q[6] + C 1164 ADCXQ R8, DI 1165 MULXQ q<>+48(SB), AX, R8 1166 ADOXQ AX, DI 1167 1168 // (C,t[6]) := t[7] + m*q[7] + C 1169 ADCXQ R9, R8 1170 MULXQ q<>+56(SB), AX, R9 1171 ADOXQ AX, R8 1172 1173 // (C,t[7]) := t[8] + m*q[8] + C 1174 ADCXQ R10, R9 1175 MULXQ q<>+64(SB), AX, R10 1176 ADOXQ AX, R9 1177 1178 // (C,t[8]) := t[9] + m*q[9] + C 1179 ADCXQ R11, R10 1180 MULXQ q<>+72(SB), AX, R11 1181 ADOXQ AX, R10 1182 1183 // t[9] = C + A 1184 MOVQ $0, AX 1185 ADCXQ AX, R11 1186 ADOXQ BP, R11 1187 1188 // clear the flags 1189 XORQ AX, AX 1190 MOVQ 72(R13), DX 1191 1192 // (A,t[0]) := t[0] + x[0]*y[9] + A 1193 MULXQ 0(R12), AX, BP 1194 ADOXQ AX, R14 1195 1196 // (A,t[1]) := t[1] + x[1]*y[9] + A 1197 ADCXQ BP, R15 1198 MULXQ 8(R12), AX, BP 1199 ADOXQ AX, R15 1200 1201 // (A,t[2]) := t[2] + x[2]*y[9] + A 1202 ADCXQ BP, CX 1203 MULXQ 16(R12), AX, BP 1204 ADOXQ AX, CX 1205 1206 // (A,t[3]) := t[3] + x[3]*y[9] + A 1207 ADCXQ BP, BX 1208 MULXQ 24(R12), AX, BP 1209 ADOXQ AX, BX 1210 1211 // (A,t[4]) := t[4] + x[4]*y[9] + A 1212 ADCXQ BP, SI 1213 MULXQ 32(R12), AX, BP 1214 ADOXQ AX, SI 1215 1216 // (A,t[5]) := t[5] + x[5]*y[9] + A 1217 ADCXQ BP, DI 1218 MULXQ 40(R12), AX, BP 1219 ADOXQ AX, DI 1220 1221 // (A,t[6]) := t[6] + x[6]*y[9] + A 1222 ADCXQ BP, R8 1223 MULXQ 48(R12), AX, BP 1224 ADOXQ AX, R8 1225 1226 // (A,t[7]) := t[7] + x[7]*y[9] + A 1227 ADCXQ BP, R9 1228 MULXQ 56(R12), AX, BP 1229 ADOXQ AX, R9 1230 1231 // (A,t[8]) := t[8] + x[8]*y[9] + A 1232 ADCXQ BP, R10 1233 MULXQ 64(R12), AX, BP 1234 ADOXQ AX, R10 1235 1236 // (A,t[9]) := t[9] + x[9]*y[9] + A 1237 ADCXQ BP, R11 1238 MULXQ 72(R12), AX, BP 1239 ADOXQ AX, R11 1240 1241 // A += carries from ADCXQ and ADOXQ 1242 MOVQ $0, AX 1243 ADCXQ AX, BP 1244 ADOXQ AX, BP 1245 PUSHQ BP 1246 1247 // m := t[0]*q'[0] mod W 1248 MOVQ qInv0<>(SB), DX 1249 IMULQ R14, DX 1250 1251 // clear the flags 1252 XORQ AX, AX 1253 1254 // C,_ := t[0] + m*q[0] 1255 MULXQ q<>+0(SB), AX, BP 1256 ADCXQ R14, AX 1257 MOVQ BP, R14 1258 POPQ BP 1259 1260 // (C,t[0]) := t[1] + m*q[1] + C 1261 ADCXQ R15, R14 1262 MULXQ q<>+8(SB), AX, R15 1263 ADOXQ AX, R14 1264 1265 // (C,t[1]) := t[2] + m*q[2] + C 1266 ADCXQ CX, R15 1267 MULXQ q<>+16(SB), AX, CX 1268 ADOXQ AX, R15 1269 1270 // (C,t[2]) := t[3] + m*q[3] + C 1271 ADCXQ BX, CX 1272 MULXQ q<>+24(SB), AX, BX 1273 ADOXQ AX, CX 1274 1275 // (C,t[3]) := t[4] + m*q[4] + C 1276 ADCXQ SI, BX 1277 MULXQ q<>+32(SB), AX, SI 1278 ADOXQ AX, BX 1279 1280 // (C,t[4]) := t[5] + m*q[5] + C 1281 ADCXQ DI, SI 1282 MULXQ q<>+40(SB), AX, DI 1283 ADOXQ AX, SI 1284 1285 // (C,t[5]) := t[6] + m*q[6] + C 1286 ADCXQ R8, DI 1287 MULXQ q<>+48(SB), AX, R8 1288 ADOXQ AX, DI 1289 1290 // (C,t[6]) := t[7] + m*q[7] + C 1291 ADCXQ R9, R8 1292 MULXQ q<>+56(SB), AX, R9 1293 ADOXQ AX, R8 1294 1295 // (C,t[7]) := t[8] + m*q[8] + C 1296 ADCXQ R10, R9 1297 MULXQ q<>+64(SB), AX, R10 1298 ADOXQ AX, R9 1299 1300 // (C,t[8]) := t[9] + m*q[9] + C 1301 ADCXQ R11, R10 1302 MULXQ q<>+72(SB), AX, R11 1303 ADOXQ AX, R10 1304 1305 // t[9] = C + A 1306 MOVQ $0, AX 1307 ADCXQ AX, R11 1308 ADOXQ BP, R11 1309 1310 // reduce element(R14,R15,CX,BX,SI,DI,R8,R9,R10,R11) using temp registers (R12,R13,s0-8(SP),s1-16(SP),s2-24(SP),s3-32(SP),s4-40(SP),s5-48(SP),s6-56(SP),s7-64(SP)) 1311 REDUCE(R14,R15,CX,BX,SI,DI,R8,R9,R10,R11,R12,R13,s0-8(SP),s1-16(SP),s2-24(SP),s3-32(SP),s4-40(SP),s5-48(SP),s6-56(SP),s7-64(SP)) 1312 1313 MOVQ res+0(FP), AX 1314 MOVQ R14, 0(AX) 1315 MOVQ R15, 8(AX) 1316 MOVQ CX, 16(AX) 1317 MOVQ BX, 24(AX) 1318 MOVQ SI, 32(AX) 1319 MOVQ DI, 40(AX) 1320 MOVQ R8, 48(AX) 1321 MOVQ R9, 56(AX) 1322 MOVQ R10, 64(AX) 1323 MOVQ R11, 72(AX) 1324 RET 1325 1326 l1: 1327 MOVQ res+0(FP), AX 1328 MOVQ AX, (SP) 1329 MOVQ x+8(FP), AX 1330 MOVQ AX, 8(SP) 1331 MOVQ y+16(FP), AX 1332 MOVQ AX, 16(SP) 1333 CALL ·_mulGeneric(SB) 1334 RET 1335 1336 TEXT ·fromMont(SB), $64-8 1337 NO_LOCAL_POINTERS 1338 1339 // the algorithm is described here 1340 // https://hackmd.io/@gnark/modular_multiplication 1341 // when y = 1 we have: 1342 // for i=0 to N-1 1343 // t[i] = x[i] 1344 // for i=0 to N-1 1345 // m := t[0]*q'[0] mod W 1346 // C,_ := t[0] + m*q[0] 1347 // for j=1 to N-1 1348 // (C,t[j-1]) := t[j] + m*q[j] + C 1349 // t[N-1] = C 1350 CMPB ·supportAdx(SB), $1 1351 JNE l2 1352 MOVQ res+0(FP), DX 1353 MOVQ 0(DX), R14 1354 MOVQ 8(DX), R15 1355 MOVQ 16(DX), CX 1356 MOVQ 24(DX), BX 1357 MOVQ 32(DX), SI 1358 MOVQ 40(DX), DI 1359 MOVQ 48(DX), R8 1360 MOVQ 56(DX), R9 1361 MOVQ 64(DX), R10 1362 MOVQ 72(DX), R11 1363 XORQ DX, DX 1364 1365 // m := t[0]*q'[0] mod W 1366 MOVQ qInv0<>(SB), DX 1367 IMULQ R14, DX 1368 XORQ AX, AX 1369 1370 // C,_ := t[0] + m*q[0] 1371 MULXQ q<>+0(SB), AX, BP 1372 ADCXQ R14, AX 1373 MOVQ BP, R14 1374 1375 // (C,t[0]) := t[1] + m*q[1] + C 1376 ADCXQ R15, R14 1377 MULXQ q<>+8(SB), AX, R15 1378 ADOXQ AX, R14 1379 1380 // (C,t[1]) := t[2] + m*q[2] + C 1381 ADCXQ CX, R15 1382 MULXQ q<>+16(SB), AX, CX 1383 ADOXQ AX, R15 1384 1385 // (C,t[2]) := t[3] + m*q[3] + C 1386 ADCXQ BX, CX 1387 MULXQ q<>+24(SB), AX, BX 1388 ADOXQ AX, CX 1389 1390 // (C,t[3]) := t[4] + m*q[4] + C 1391 ADCXQ SI, BX 1392 MULXQ q<>+32(SB), AX, SI 1393 ADOXQ AX, BX 1394 1395 // (C,t[4]) := t[5] + m*q[5] + C 1396 ADCXQ DI, SI 1397 MULXQ q<>+40(SB), AX, DI 1398 ADOXQ AX, SI 1399 1400 // (C,t[5]) := t[6] + m*q[6] + C 1401 ADCXQ R8, DI 1402 MULXQ q<>+48(SB), AX, R8 1403 ADOXQ AX, DI 1404 1405 // (C,t[6]) := t[7] + m*q[7] + C 1406 ADCXQ R9, R8 1407 MULXQ q<>+56(SB), AX, R9 1408 ADOXQ AX, R8 1409 1410 // (C,t[7]) := t[8] + m*q[8] + C 1411 ADCXQ R10, R9 1412 MULXQ q<>+64(SB), AX, R10 1413 ADOXQ AX, R9 1414 1415 // (C,t[8]) := t[9] + m*q[9] + C 1416 ADCXQ R11, R10 1417 MULXQ q<>+72(SB), AX, R11 1418 ADOXQ AX, R10 1419 MOVQ $0, AX 1420 ADCXQ AX, R11 1421 ADOXQ AX, R11 1422 XORQ DX, DX 1423 1424 // m := t[0]*q'[0] mod W 1425 MOVQ qInv0<>(SB), DX 1426 IMULQ R14, DX 1427 XORQ AX, AX 1428 1429 // C,_ := t[0] + m*q[0] 1430 MULXQ q<>+0(SB), AX, BP 1431 ADCXQ R14, AX 1432 MOVQ BP, R14 1433 1434 // (C,t[0]) := t[1] + m*q[1] + C 1435 ADCXQ R15, R14 1436 MULXQ q<>+8(SB), AX, R15 1437 ADOXQ AX, R14 1438 1439 // (C,t[1]) := t[2] + m*q[2] + C 1440 ADCXQ CX, R15 1441 MULXQ q<>+16(SB), AX, CX 1442 ADOXQ AX, R15 1443 1444 // (C,t[2]) := t[3] + m*q[3] + C 1445 ADCXQ BX, CX 1446 MULXQ q<>+24(SB), AX, BX 1447 ADOXQ AX, CX 1448 1449 // (C,t[3]) := t[4] + m*q[4] + C 1450 ADCXQ SI, BX 1451 MULXQ q<>+32(SB), AX, SI 1452 ADOXQ AX, BX 1453 1454 // (C,t[4]) := t[5] + m*q[5] + C 1455 ADCXQ DI, SI 1456 MULXQ q<>+40(SB), AX, DI 1457 ADOXQ AX, SI 1458 1459 // (C,t[5]) := t[6] + m*q[6] + C 1460 ADCXQ R8, DI 1461 MULXQ q<>+48(SB), AX, R8 1462 ADOXQ AX, DI 1463 1464 // (C,t[6]) := t[7] + m*q[7] + C 1465 ADCXQ R9, R8 1466 MULXQ q<>+56(SB), AX, R9 1467 ADOXQ AX, R8 1468 1469 // (C,t[7]) := t[8] + m*q[8] + C 1470 ADCXQ R10, R9 1471 MULXQ q<>+64(SB), AX, R10 1472 ADOXQ AX, R9 1473 1474 // (C,t[8]) := t[9] + m*q[9] + C 1475 ADCXQ R11, R10 1476 MULXQ q<>+72(SB), AX, R11 1477 ADOXQ AX, R10 1478 MOVQ $0, AX 1479 ADCXQ AX, R11 1480 ADOXQ AX, R11 1481 XORQ DX, DX 1482 1483 // m := t[0]*q'[0] mod W 1484 MOVQ qInv0<>(SB), DX 1485 IMULQ R14, DX 1486 XORQ AX, AX 1487 1488 // C,_ := t[0] + m*q[0] 1489 MULXQ q<>+0(SB), AX, BP 1490 ADCXQ R14, AX 1491 MOVQ BP, R14 1492 1493 // (C,t[0]) := t[1] + m*q[1] + C 1494 ADCXQ R15, R14 1495 MULXQ q<>+8(SB), AX, R15 1496 ADOXQ AX, R14 1497 1498 // (C,t[1]) := t[2] + m*q[2] + C 1499 ADCXQ CX, R15 1500 MULXQ q<>+16(SB), AX, CX 1501 ADOXQ AX, R15 1502 1503 // (C,t[2]) := t[3] + m*q[3] + C 1504 ADCXQ BX, CX 1505 MULXQ q<>+24(SB), AX, BX 1506 ADOXQ AX, CX 1507 1508 // (C,t[3]) := t[4] + m*q[4] + C 1509 ADCXQ SI, BX 1510 MULXQ q<>+32(SB), AX, SI 1511 ADOXQ AX, BX 1512 1513 // (C,t[4]) := t[5] + m*q[5] + C 1514 ADCXQ DI, SI 1515 MULXQ q<>+40(SB), AX, DI 1516 ADOXQ AX, SI 1517 1518 // (C,t[5]) := t[6] + m*q[6] + C 1519 ADCXQ R8, DI 1520 MULXQ q<>+48(SB), AX, R8 1521 ADOXQ AX, DI 1522 1523 // (C,t[6]) := t[7] + m*q[7] + C 1524 ADCXQ R9, R8 1525 MULXQ q<>+56(SB), AX, R9 1526 ADOXQ AX, R8 1527 1528 // (C,t[7]) := t[8] + m*q[8] + C 1529 ADCXQ R10, R9 1530 MULXQ q<>+64(SB), AX, R10 1531 ADOXQ AX, R9 1532 1533 // (C,t[8]) := t[9] + m*q[9] + C 1534 ADCXQ R11, R10 1535 MULXQ q<>+72(SB), AX, R11 1536 ADOXQ AX, R10 1537 MOVQ $0, AX 1538 ADCXQ AX, R11 1539 ADOXQ AX, R11 1540 XORQ DX, DX 1541 1542 // m := t[0]*q'[0] mod W 1543 MOVQ qInv0<>(SB), DX 1544 IMULQ R14, DX 1545 XORQ AX, AX 1546 1547 // C,_ := t[0] + m*q[0] 1548 MULXQ q<>+0(SB), AX, BP 1549 ADCXQ R14, AX 1550 MOVQ BP, R14 1551 1552 // (C,t[0]) := t[1] + m*q[1] + C 1553 ADCXQ R15, R14 1554 MULXQ q<>+8(SB), AX, R15 1555 ADOXQ AX, R14 1556 1557 // (C,t[1]) := t[2] + m*q[2] + C 1558 ADCXQ CX, R15 1559 MULXQ q<>+16(SB), AX, CX 1560 ADOXQ AX, R15 1561 1562 // (C,t[2]) := t[3] + m*q[3] + C 1563 ADCXQ BX, CX 1564 MULXQ q<>+24(SB), AX, BX 1565 ADOXQ AX, CX 1566 1567 // (C,t[3]) := t[4] + m*q[4] + C 1568 ADCXQ SI, BX 1569 MULXQ q<>+32(SB), AX, SI 1570 ADOXQ AX, BX 1571 1572 // (C,t[4]) := t[5] + m*q[5] + C 1573 ADCXQ DI, SI 1574 MULXQ q<>+40(SB), AX, DI 1575 ADOXQ AX, SI 1576 1577 // (C,t[5]) := t[6] + m*q[6] + C 1578 ADCXQ R8, DI 1579 MULXQ q<>+48(SB), AX, R8 1580 ADOXQ AX, DI 1581 1582 // (C,t[6]) := t[7] + m*q[7] + C 1583 ADCXQ R9, R8 1584 MULXQ q<>+56(SB), AX, R9 1585 ADOXQ AX, R8 1586 1587 // (C,t[7]) := t[8] + m*q[8] + C 1588 ADCXQ R10, R9 1589 MULXQ q<>+64(SB), AX, R10 1590 ADOXQ AX, R9 1591 1592 // (C,t[8]) := t[9] + m*q[9] + C 1593 ADCXQ R11, R10 1594 MULXQ q<>+72(SB), AX, R11 1595 ADOXQ AX, R10 1596 MOVQ $0, AX 1597 ADCXQ AX, R11 1598 ADOXQ AX, R11 1599 XORQ DX, DX 1600 1601 // m := t[0]*q'[0] mod W 1602 MOVQ qInv0<>(SB), DX 1603 IMULQ R14, DX 1604 XORQ AX, AX 1605 1606 // C,_ := t[0] + m*q[0] 1607 MULXQ q<>+0(SB), AX, BP 1608 ADCXQ R14, AX 1609 MOVQ BP, R14 1610 1611 // (C,t[0]) := t[1] + m*q[1] + C 1612 ADCXQ R15, R14 1613 MULXQ q<>+8(SB), AX, R15 1614 ADOXQ AX, R14 1615 1616 // (C,t[1]) := t[2] + m*q[2] + C 1617 ADCXQ CX, R15 1618 MULXQ q<>+16(SB), AX, CX 1619 ADOXQ AX, R15 1620 1621 // (C,t[2]) := t[3] + m*q[3] + C 1622 ADCXQ BX, CX 1623 MULXQ q<>+24(SB), AX, BX 1624 ADOXQ AX, CX 1625 1626 // (C,t[3]) := t[4] + m*q[4] + C 1627 ADCXQ SI, BX 1628 MULXQ q<>+32(SB), AX, SI 1629 ADOXQ AX, BX 1630 1631 // (C,t[4]) := t[5] + m*q[5] + C 1632 ADCXQ DI, SI 1633 MULXQ q<>+40(SB), AX, DI 1634 ADOXQ AX, SI 1635 1636 // (C,t[5]) := t[6] + m*q[6] + C 1637 ADCXQ R8, DI 1638 MULXQ q<>+48(SB), AX, R8 1639 ADOXQ AX, DI 1640 1641 // (C,t[6]) := t[7] + m*q[7] + C 1642 ADCXQ R9, R8 1643 MULXQ q<>+56(SB), AX, R9 1644 ADOXQ AX, R8 1645 1646 // (C,t[7]) := t[8] + m*q[8] + C 1647 ADCXQ R10, R9 1648 MULXQ q<>+64(SB), AX, R10 1649 ADOXQ AX, R9 1650 1651 // (C,t[8]) := t[9] + m*q[9] + C 1652 ADCXQ R11, R10 1653 MULXQ q<>+72(SB), AX, R11 1654 ADOXQ AX, R10 1655 MOVQ $0, AX 1656 ADCXQ AX, R11 1657 ADOXQ AX, R11 1658 XORQ DX, DX 1659 1660 // m := t[0]*q'[0] mod W 1661 MOVQ qInv0<>(SB), DX 1662 IMULQ R14, DX 1663 XORQ AX, AX 1664 1665 // C,_ := t[0] + m*q[0] 1666 MULXQ q<>+0(SB), AX, BP 1667 ADCXQ R14, AX 1668 MOVQ BP, R14 1669 1670 // (C,t[0]) := t[1] + m*q[1] + C 1671 ADCXQ R15, R14 1672 MULXQ q<>+8(SB), AX, R15 1673 ADOXQ AX, R14 1674 1675 // (C,t[1]) := t[2] + m*q[2] + C 1676 ADCXQ CX, R15 1677 MULXQ q<>+16(SB), AX, CX 1678 ADOXQ AX, R15 1679 1680 // (C,t[2]) := t[3] + m*q[3] + C 1681 ADCXQ BX, CX 1682 MULXQ q<>+24(SB), AX, BX 1683 ADOXQ AX, CX 1684 1685 // (C,t[3]) := t[4] + m*q[4] + C 1686 ADCXQ SI, BX 1687 MULXQ q<>+32(SB), AX, SI 1688 ADOXQ AX, BX 1689 1690 // (C,t[4]) := t[5] + m*q[5] + C 1691 ADCXQ DI, SI 1692 MULXQ q<>+40(SB), AX, DI 1693 ADOXQ AX, SI 1694 1695 // (C,t[5]) := t[6] + m*q[6] + C 1696 ADCXQ R8, DI 1697 MULXQ q<>+48(SB), AX, R8 1698 ADOXQ AX, DI 1699 1700 // (C,t[6]) := t[7] + m*q[7] + C 1701 ADCXQ R9, R8 1702 MULXQ q<>+56(SB), AX, R9 1703 ADOXQ AX, R8 1704 1705 // (C,t[7]) := t[8] + m*q[8] + C 1706 ADCXQ R10, R9 1707 MULXQ q<>+64(SB), AX, R10 1708 ADOXQ AX, R9 1709 1710 // (C,t[8]) := t[9] + m*q[9] + C 1711 ADCXQ R11, R10 1712 MULXQ q<>+72(SB), AX, R11 1713 ADOXQ AX, R10 1714 MOVQ $0, AX 1715 ADCXQ AX, R11 1716 ADOXQ AX, R11 1717 XORQ DX, DX 1718 1719 // m := t[0]*q'[0] mod W 1720 MOVQ qInv0<>(SB), DX 1721 IMULQ R14, DX 1722 XORQ AX, AX 1723 1724 // C,_ := t[0] + m*q[0] 1725 MULXQ q<>+0(SB), AX, BP 1726 ADCXQ R14, AX 1727 MOVQ BP, R14 1728 1729 // (C,t[0]) := t[1] + m*q[1] + C 1730 ADCXQ R15, R14 1731 MULXQ q<>+8(SB), AX, R15 1732 ADOXQ AX, R14 1733 1734 // (C,t[1]) := t[2] + m*q[2] + C 1735 ADCXQ CX, R15 1736 MULXQ q<>+16(SB), AX, CX 1737 ADOXQ AX, R15 1738 1739 // (C,t[2]) := t[3] + m*q[3] + C 1740 ADCXQ BX, CX 1741 MULXQ q<>+24(SB), AX, BX 1742 ADOXQ AX, CX 1743 1744 // (C,t[3]) := t[4] + m*q[4] + C 1745 ADCXQ SI, BX 1746 MULXQ q<>+32(SB), AX, SI 1747 ADOXQ AX, BX 1748 1749 // (C,t[4]) := t[5] + m*q[5] + C 1750 ADCXQ DI, SI 1751 MULXQ q<>+40(SB), AX, DI 1752 ADOXQ AX, SI 1753 1754 // (C,t[5]) := t[6] + m*q[6] + C 1755 ADCXQ R8, DI 1756 MULXQ q<>+48(SB), AX, R8 1757 ADOXQ AX, DI 1758 1759 // (C,t[6]) := t[7] + m*q[7] + C 1760 ADCXQ R9, R8 1761 MULXQ q<>+56(SB), AX, R9 1762 ADOXQ AX, R8 1763 1764 // (C,t[7]) := t[8] + m*q[8] + C 1765 ADCXQ R10, R9 1766 MULXQ q<>+64(SB), AX, R10 1767 ADOXQ AX, R9 1768 1769 // (C,t[8]) := t[9] + m*q[9] + C 1770 ADCXQ R11, R10 1771 MULXQ q<>+72(SB), AX, R11 1772 ADOXQ AX, R10 1773 MOVQ $0, AX 1774 ADCXQ AX, R11 1775 ADOXQ AX, R11 1776 XORQ DX, DX 1777 1778 // m := t[0]*q'[0] mod W 1779 MOVQ qInv0<>(SB), DX 1780 IMULQ R14, DX 1781 XORQ AX, AX 1782 1783 // C,_ := t[0] + m*q[0] 1784 MULXQ q<>+0(SB), AX, BP 1785 ADCXQ R14, AX 1786 MOVQ BP, R14 1787 1788 // (C,t[0]) := t[1] + m*q[1] + C 1789 ADCXQ R15, R14 1790 MULXQ q<>+8(SB), AX, R15 1791 ADOXQ AX, R14 1792 1793 // (C,t[1]) := t[2] + m*q[2] + C 1794 ADCXQ CX, R15 1795 MULXQ q<>+16(SB), AX, CX 1796 ADOXQ AX, R15 1797 1798 // (C,t[2]) := t[3] + m*q[3] + C 1799 ADCXQ BX, CX 1800 MULXQ q<>+24(SB), AX, BX 1801 ADOXQ AX, CX 1802 1803 // (C,t[3]) := t[4] + m*q[4] + C 1804 ADCXQ SI, BX 1805 MULXQ q<>+32(SB), AX, SI 1806 ADOXQ AX, BX 1807 1808 // (C,t[4]) := t[5] + m*q[5] + C 1809 ADCXQ DI, SI 1810 MULXQ q<>+40(SB), AX, DI 1811 ADOXQ AX, SI 1812 1813 // (C,t[5]) := t[6] + m*q[6] + C 1814 ADCXQ R8, DI 1815 MULXQ q<>+48(SB), AX, R8 1816 ADOXQ AX, DI 1817 1818 // (C,t[6]) := t[7] + m*q[7] + C 1819 ADCXQ R9, R8 1820 MULXQ q<>+56(SB), AX, R9 1821 ADOXQ AX, R8 1822 1823 // (C,t[7]) := t[8] + m*q[8] + C 1824 ADCXQ R10, R9 1825 MULXQ q<>+64(SB), AX, R10 1826 ADOXQ AX, R9 1827 1828 // (C,t[8]) := t[9] + m*q[9] + C 1829 ADCXQ R11, R10 1830 MULXQ q<>+72(SB), AX, R11 1831 ADOXQ AX, R10 1832 MOVQ $0, AX 1833 ADCXQ AX, R11 1834 ADOXQ AX, R11 1835 XORQ DX, DX 1836 1837 // m := t[0]*q'[0] mod W 1838 MOVQ qInv0<>(SB), DX 1839 IMULQ R14, DX 1840 XORQ AX, AX 1841 1842 // C,_ := t[0] + m*q[0] 1843 MULXQ q<>+0(SB), AX, BP 1844 ADCXQ R14, AX 1845 MOVQ BP, R14 1846 1847 // (C,t[0]) := t[1] + m*q[1] + C 1848 ADCXQ R15, R14 1849 MULXQ q<>+8(SB), AX, R15 1850 ADOXQ AX, R14 1851 1852 // (C,t[1]) := t[2] + m*q[2] + C 1853 ADCXQ CX, R15 1854 MULXQ q<>+16(SB), AX, CX 1855 ADOXQ AX, R15 1856 1857 // (C,t[2]) := t[3] + m*q[3] + C 1858 ADCXQ BX, CX 1859 MULXQ q<>+24(SB), AX, BX 1860 ADOXQ AX, CX 1861 1862 // (C,t[3]) := t[4] + m*q[4] + C 1863 ADCXQ SI, BX 1864 MULXQ q<>+32(SB), AX, SI 1865 ADOXQ AX, BX 1866 1867 // (C,t[4]) := t[5] + m*q[5] + C 1868 ADCXQ DI, SI 1869 MULXQ q<>+40(SB), AX, DI 1870 ADOXQ AX, SI 1871 1872 // (C,t[5]) := t[6] + m*q[6] + C 1873 ADCXQ R8, DI 1874 MULXQ q<>+48(SB), AX, R8 1875 ADOXQ AX, DI 1876 1877 // (C,t[6]) := t[7] + m*q[7] + C 1878 ADCXQ R9, R8 1879 MULXQ q<>+56(SB), AX, R9 1880 ADOXQ AX, R8 1881 1882 // (C,t[7]) := t[8] + m*q[8] + C 1883 ADCXQ R10, R9 1884 MULXQ q<>+64(SB), AX, R10 1885 ADOXQ AX, R9 1886 1887 // (C,t[8]) := t[9] + m*q[9] + C 1888 ADCXQ R11, R10 1889 MULXQ q<>+72(SB), AX, R11 1890 ADOXQ AX, R10 1891 MOVQ $0, AX 1892 ADCXQ AX, R11 1893 ADOXQ AX, R11 1894 XORQ DX, DX 1895 1896 // m := t[0]*q'[0] mod W 1897 MOVQ qInv0<>(SB), DX 1898 IMULQ R14, DX 1899 XORQ AX, AX 1900 1901 // C,_ := t[0] + m*q[0] 1902 MULXQ q<>+0(SB), AX, BP 1903 ADCXQ R14, AX 1904 MOVQ BP, R14 1905 1906 // (C,t[0]) := t[1] + m*q[1] + C 1907 ADCXQ R15, R14 1908 MULXQ q<>+8(SB), AX, R15 1909 ADOXQ AX, R14 1910 1911 // (C,t[1]) := t[2] + m*q[2] + C 1912 ADCXQ CX, R15 1913 MULXQ q<>+16(SB), AX, CX 1914 ADOXQ AX, R15 1915 1916 // (C,t[2]) := t[3] + m*q[3] + C 1917 ADCXQ BX, CX 1918 MULXQ q<>+24(SB), AX, BX 1919 ADOXQ AX, CX 1920 1921 // (C,t[3]) := t[4] + m*q[4] + C 1922 ADCXQ SI, BX 1923 MULXQ q<>+32(SB), AX, SI 1924 ADOXQ AX, BX 1925 1926 // (C,t[4]) := t[5] + m*q[5] + C 1927 ADCXQ DI, SI 1928 MULXQ q<>+40(SB), AX, DI 1929 ADOXQ AX, SI 1930 1931 // (C,t[5]) := t[6] + m*q[6] + C 1932 ADCXQ R8, DI 1933 MULXQ q<>+48(SB), AX, R8 1934 ADOXQ AX, DI 1935 1936 // (C,t[6]) := t[7] + m*q[7] + C 1937 ADCXQ R9, R8 1938 MULXQ q<>+56(SB), AX, R9 1939 ADOXQ AX, R8 1940 1941 // (C,t[7]) := t[8] + m*q[8] + C 1942 ADCXQ R10, R9 1943 MULXQ q<>+64(SB), AX, R10 1944 ADOXQ AX, R9 1945 1946 // (C,t[8]) := t[9] + m*q[9] + C 1947 ADCXQ R11, R10 1948 MULXQ q<>+72(SB), AX, R11 1949 ADOXQ AX, R10 1950 MOVQ $0, AX 1951 ADCXQ AX, R11 1952 ADOXQ AX, R11 1953 1954 // reduce element(R14,R15,CX,BX,SI,DI,R8,R9,R10,R11) using temp registers (R12,R13,s0-8(SP),s1-16(SP),s2-24(SP),s3-32(SP),s4-40(SP),s5-48(SP),s6-56(SP),s7-64(SP)) 1955 REDUCE(R14,R15,CX,BX,SI,DI,R8,R9,R10,R11,R12,R13,s0-8(SP),s1-16(SP),s2-24(SP),s3-32(SP),s4-40(SP),s5-48(SP),s6-56(SP),s7-64(SP)) 1956 1957 MOVQ res+0(FP), AX 1958 MOVQ R14, 0(AX) 1959 MOVQ R15, 8(AX) 1960 MOVQ CX, 16(AX) 1961 MOVQ BX, 24(AX) 1962 MOVQ SI, 32(AX) 1963 MOVQ DI, 40(AX) 1964 MOVQ R8, 48(AX) 1965 MOVQ R9, 56(AX) 1966 MOVQ R10, 64(AX) 1967 MOVQ R11, 72(AX) 1968 RET 1969 1970 l2: 1971 MOVQ res+0(FP), AX 1972 MOVQ AX, (SP) 1973 CALL ·_fromMontGeneric(SB) 1974 RET