github.com/consensys/gnark-crypto@v0.14.0/ecc/bls12-381/internal/fptower/e2_amd64.s (about) 1 // Copyright 2020 ConsenSys Software Inc. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 #include "textflag.h" 16 #include "funcdata.h" 17 18 // modulus q 19 DATA q<>+0(SB)/8, $0xb9feffffffffaaab 20 DATA q<>+8(SB)/8, $0x1eabfffeb153ffff 21 DATA q<>+16(SB)/8, $0x6730d2a0f6b0f624 22 DATA q<>+24(SB)/8, $0x64774b84f38512bf 23 DATA q<>+32(SB)/8, $0x4b1ba7b6434bacd7 24 DATA q<>+40(SB)/8, $0x1a0111ea397fe69a 25 GLOBL q<>(SB), (RODATA+NOPTR), $48 26 27 // qInv0 q'[0] 28 DATA qInv0<>(SB)/8, $0x89f3fffcfffcfffd 29 GLOBL qInv0<>(SB), (RODATA+NOPTR), $8 30 31 #define REDUCE(ra0, ra1, ra2, ra3, ra4, ra5, rb0, rb1, rb2, rb3, rb4, rb5) \ 32 MOVQ ra0, rb0; \ 33 SUBQ q<>(SB), ra0; \ 34 MOVQ ra1, rb1; \ 35 SBBQ q<>+8(SB), ra1; \ 36 MOVQ ra2, rb2; \ 37 SBBQ q<>+16(SB), ra2; \ 38 MOVQ ra3, rb3; \ 39 SBBQ q<>+24(SB), ra3; \ 40 MOVQ ra4, rb4; \ 41 SBBQ q<>+32(SB), ra4; \ 42 MOVQ ra5, rb5; \ 43 SBBQ q<>+40(SB), ra5; \ 44 CMOVQCS rb0, ra0; \ 45 CMOVQCS rb1, ra1; \ 46 CMOVQCS rb2, ra2; \ 47 CMOVQCS rb3, ra3; \ 48 CMOVQCS rb4, ra4; \ 49 CMOVQCS rb5, ra5; \ 50 51 TEXT ·addE2(SB), NOSPLIT, $0-24 52 MOVQ x+8(FP), AX 53 MOVQ 0(AX), BX 54 MOVQ 8(AX), SI 55 MOVQ 16(AX), DI 56 MOVQ 24(AX), R8 57 MOVQ 32(AX), R9 58 MOVQ 40(AX), R10 59 MOVQ y+16(FP), DX 60 ADDQ 0(DX), BX 61 ADCQ 8(DX), SI 62 ADCQ 16(DX), DI 63 ADCQ 24(DX), R8 64 ADCQ 32(DX), R9 65 ADCQ 40(DX), R10 66 67 // reduce element(BX,SI,DI,R8,R9,R10) using temp registers (R11,R12,R13,R14,R15,s0-8(SP)) 68 REDUCE(BX,SI,DI,R8,R9,R10,R11,R12,R13,R14,R15,s0-8(SP)) 69 70 MOVQ res+0(FP), CX 71 MOVQ BX, 0(CX) 72 MOVQ SI, 8(CX) 73 MOVQ DI, 16(CX) 74 MOVQ R8, 24(CX) 75 MOVQ R9, 32(CX) 76 MOVQ R10, 40(CX) 77 MOVQ 48(AX), BX 78 MOVQ 56(AX), SI 79 MOVQ 64(AX), DI 80 MOVQ 72(AX), R8 81 MOVQ 80(AX), R9 82 MOVQ 88(AX), R10 83 ADDQ 48(DX), BX 84 ADCQ 56(DX), SI 85 ADCQ 64(DX), DI 86 ADCQ 72(DX), R8 87 ADCQ 80(DX), R9 88 ADCQ 88(DX), R10 89 90 // reduce element(BX,SI,DI,R8,R9,R10) using temp registers (R11,R12,R13,R14,R15,s0-8(SP)) 91 REDUCE(BX,SI,DI,R8,R9,R10,R11,R12,R13,R14,R15,s0-8(SP)) 92 93 MOVQ BX, 48(CX) 94 MOVQ SI, 56(CX) 95 MOVQ DI, 64(CX) 96 MOVQ R8, 72(CX) 97 MOVQ R9, 80(CX) 98 MOVQ R10, 88(CX) 99 RET 100 101 TEXT ·doubleE2(SB), NOSPLIT, $0-16 102 MOVQ res+0(FP), DX 103 MOVQ x+8(FP), AX 104 MOVQ 0(AX), CX 105 MOVQ 8(AX), BX 106 MOVQ 16(AX), SI 107 MOVQ 24(AX), DI 108 MOVQ 32(AX), R8 109 MOVQ 40(AX), R9 110 ADDQ CX, CX 111 ADCQ BX, BX 112 ADCQ SI, SI 113 ADCQ DI, DI 114 ADCQ R8, R8 115 ADCQ R9, R9 116 117 // reduce element(CX,BX,SI,DI,R8,R9) using temp registers (R10,R11,R12,R13,R14,R15) 118 REDUCE(CX,BX,SI,DI,R8,R9,R10,R11,R12,R13,R14,R15) 119 120 MOVQ CX, 0(DX) 121 MOVQ BX, 8(DX) 122 MOVQ SI, 16(DX) 123 MOVQ DI, 24(DX) 124 MOVQ R8, 32(DX) 125 MOVQ R9, 40(DX) 126 MOVQ 48(AX), CX 127 MOVQ 56(AX), BX 128 MOVQ 64(AX), SI 129 MOVQ 72(AX), DI 130 MOVQ 80(AX), R8 131 MOVQ 88(AX), R9 132 ADDQ CX, CX 133 ADCQ BX, BX 134 ADCQ SI, SI 135 ADCQ DI, DI 136 ADCQ R8, R8 137 ADCQ R9, R9 138 139 // reduce element(CX,BX,SI,DI,R8,R9) using temp registers (R10,R11,R12,R13,R14,R15) 140 REDUCE(CX,BX,SI,DI,R8,R9,R10,R11,R12,R13,R14,R15) 141 142 MOVQ CX, 48(DX) 143 MOVQ BX, 56(DX) 144 MOVQ SI, 64(DX) 145 MOVQ DI, 72(DX) 146 MOVQ R8, 80(DX) 147 MOVQ R9, 88(DX) 148 RET 149 150 TEXT ·subE2(SB), NOSPLIT, $0-24 151 XORQ R9, R9 152 MOVQ x+8(FP), R8 153 MOVQ 0(R8), AX 154 MOVQ 8(R8), DX 155 MOVQ 16(R8), CX 156 MOVQ 24(R8), BX 157 MOVQ 32(R8), SI 158 MOVQ 40(R8), DI 159 MOVQ y+16(FP), R8 160 SUBQ 0(R8), AX 161 SBBQ 8(R8), DX 162 SBBQ 16(R8), CX 163 SBBQ 24(R8), BX 164 SBBQ 32(R8), SI 165 SBBQ 40(R8), DI 166 MOVQ x+8(FP), R8 167 MOVQ $0xb9feffffffffaaab, R10 168 MOVQ $0x1eabfffeb153ffff, R11 169 MOVQ $0x6730d2a0f6b0f624, R12 170 MOVQ $0x64774b84f38512bf, R13 171 MOVQ $0x4b1ba7b6434bacd7, R14 172 MOVQ $0x1a0111ea397fe69a, R15 173 CMOVQCC R9, R10 174 CMOVQCC R9, R11 175 CMOVQCC R9, R12 176 CMOVQCC R9, R13 177 CMOVQCC R9, R14 178 CMOVQCC R9, R15 179 ADDQ R10, AX 180 ADCQ R11, DX 181 ADCQ R12, CX 182 ADCQ R13, BX 183 ADCQ R14, SI 184 ADCQ R15, DI 185 MOVQ res+0(FP), R10 186 MOVQ AX, 0(R10) 187 MOVQ DX, 8(R10) 188 MOVQ CX, 16(R10) 189 MOVQ BX, 24(R10) 190 MOVQ SI, 32(R10) 191 MOVQ DI, 40(R10) 192 MOVQ 48(R8), AX 193 MOVQ 56(R8), DX 194 MOVQ 64(R8), CX 195 MOVQ 72(R8), BX 196 MOVQ 80(R8), SI 197 MOVQ 88(R8), DI 198 MOVQ y+16(FP), R8 199 SUBQ 48(R8), AX 200 SBBQ 56(R8), DX 201 SBBQ 64(R8), CX 202 SBBQ 72(R8), BX 203 SBBQ 80(R8), SI 204 SBBQ 88(R8), DI 205 MOVQ $0xb9feffffffffaaab, R11 206 MOVQ $0x1eabfffeb153ffff, R12 207 MOVQ $0x6730d2a0f6b0f624, R13 208 MOVQ $0x64774b84f38512bf, R14 209 MOVQ $0x4b1ba7b6434bacd7, R15 210 MOVQ $0x1a0111ea397fe69a, R10 211 CMOVQCC R9, R11 212 CMOVQCC R9, R12 213 CMOVQCC R9, R13 214 CMOVQCC R9, R14 215 CMOVQCC R9, R15 216 CMOVQCC R9, R10 217 ADDQ R11, AX 218 ADCQ R12, DX 219 ADCQ R13, CX 220 ADCQ R14, BX 221 ADCQ R15, SI 222 ADCQ R10, DI 223 MOVQ res+0(FP), R8 224 MOVQ AX, 48(R8) 225 MOVQ DX, 56(R8) 226 MOVQ CX, 64(R8) 227 MOVQ BX, 72(R8) 228 MOVQ SI, 80(R8) 229 MOVQ DI, 88(R8) 230 RET 231 232 TEXT ·negE2(SB), NOSPLIT, $0-16 233 MOVQ res+0(FP), DX 234 MOVQ x+8(FP), AX 235 MOVQ 0(AX), BX 236 MOVQ 8(AX), SI 237 MOVQ 16(AX), DI 238 MOVQ 24(AX), R8 239 MOVQ 32(AX), R9 240 MOVQ 40(AX), R10 241 MOVQ BX, AX 242 ORQ SI, AX 243 ORQ DI, AX 244 ORQ R8, AX 245 ORQ R9, AX 246 ORQ R10, AX 247 TESTQ AX, AX 248 JNE l1 249 MOVQ AX, 0(DX) 250 MOVQ AX, 8(DX) 251 MOVQ AX, 16(DX) 252 MOVQ AX, 24(DX) 253 MOVQ AX, 32(DX) 254 MOVQ AX, 40(DX) 255 JMP l3 256 257 l1: 258 MOVQ $0xb9feffffffffaaab, CX 259 SUBQ BX, CX 260 MOVQ CX, 0(DX) 261 MOVQ $0x1eabfffeb153ffff, CX 262 SBBQ SI, CX 263 MOVQ CX, 8(DX) 264 MOVQ $0x6730d2a0f6b0f624, CX 265 SBBQ DI, CX 266 MOVQ CX, 16(DX) 267 MOVQ $0x64774b84f38512bf, CX 268 SBBQ R8, CX 269 MOVQ CX, 24(DX) 270 MOVQ $0x4b1ba7b6434bacd7, CX 271 SBBQ R9, CX 272 MOVQ CX, 32(DX) 273 MOVQ $0x1a0111ea397fe69a, CX 274 SBBQ R10, CX 275 MOVQ CX, 40(DX) 276 277 l3: 278 MOVQ x+8(FP), AX 279 MOVQ 48(AX), BX 280 MOVQ 56(AX), SI 281 MOVQ 64(AX), DI 282 MOVQ 72(AX), R8 283 MOVQ 80(AX), R9 284 MOVQ 88(AX), R10 285 MOVQ BX, AX 286 ORQ SI, AX 287 ORQ DI, AX 288 ORQ R8, AX 289 ORQ R9, AX 290 ORQ R10, AX 291 TESTQ AX, AX 292 JNE l2 293 MOVQ AX, 48(DX) 294 MOVQ AX, 56(DX) 295 MOVQ AX, 64(DX) 296 MOVQ AX, 72(DX) 297 MOVQ AX, 80(DX) 298 MOVQ AX, 88(DX) 299 RET 300 301 l2: 302 MOVQ $0xb9feffffffffaaab, CX 303 SUBQ BX, CX 304 MOVQ CX, 48(DX) 305 MOVQ $0x1eabfffeb153ffff, CX 306 SBBQ SI, CX 307 MOVQ CX, 56(DX) 308 MOVQ $0x6730d2a0f6b0f624, CX 309 SBBQ DI, CX 310 MOVQ CX, 64(DX) 311 MOVQ $0x64774b84f38512bf, CX 312 SBBQ R8, CX 313 MOVQ CX, 72(DX) 314 MOVQ $0x4b1ba7b6434bacd7, CX 315 SBBQ R9, CX 316 MOVQ CX, 80(DX) 317 MOVQ $0x1a0111ea397fe69a, CX 318 SBBQ R10, CX 319 MOVQ CX, 88(DX) 320 RET 321 322 TEXT ·mulNonResE2(SB), NOSPLIT, $0-16 323 XORQ R15, R15 324 MOVQ x+8(FP), R14 325 MOVQ 0(R14), AX 326 MOVQ 8(R14), DX 327 MOVQ 16(R14), CX 328 MOVQ 24(R14), BX 329 MOVQ 32(R14), SI 330 MOVQ 40(R14), DI 331 SUBQ 48(R14), AX 332 SBBQ 56(R14), DX 333 SBBQ 64(R14), CX 334 SBBQ 72(R14), BX 335 SBBQ 80(R14), SI 336 SBBQ 88(R14), DI 337 MOVQ $0xb9feffffffffaaab, R8 338 MOVQ $0x1eabfffeb153ffff, R9 339 MOVQ $0x6730d2a0f6b0f624, R10 340 MOVQ $0x64774b84f38512bf, R11 341 MOVQ $0x4b1ba7b6434bacd7, R12 342 MOVQ $0x1a0111ea397fe69a, R13 343 CMOVQCC R15, R8 344 CMOVQCC R15, R9 345 CMOVQCC R15, R10 346 CMOVQCC R15, R11 347 CMOVQCC R15, R12 348 CMOVQCC R15, R13 349 ADDQ R8, AX 350 ADCQ R9, DX 351 ADCQ R10, CX 352 ADCQ R11, BX 353 ADCQ R12, SI 354 ADCQ R13, DI 355 MOVQ 48(R14), R8 356 MOVQ 56(R14), R9 357 MOVQ 64(R14), R10 358 MOVQ 72(R14), R11 359 MOVQ 80(R14), R12 360 MOVQ 88(R14), R13 361 ADDQ 0(R14), R8 362 ADCQ 8(R14), R9 363 ADCQ 16(R14), R10 364 ADCQ 24(R14), R11 365 ADCQ 32(R14), R12 366 ADCQ 40(R14), R13 367 MOVQ res+0(FP), R15 368 MOVQ AX, 0(R15) 369 MOVQ DX, 8(R15) 370 MOVQ CX, 16(R15) 371 MOVQ BX, 24(R15) 372 MOVQ SI, 32(R15) 373 MOVQ DI, 40(R15) 374 375 // reduce element(R8,R9,R10,R11,R12,R13) using temp registers (AX,DX,CX,BX,SI,DI) 376 REDUCE(R8,R9,R10,R11,R12,R13,AX,DX,CX,BX,SI,DI) 377 378 MOVQ R8, 48(R15) 379 MOVQ R9, 56(R15) 380 MOVQ R10, 64(R15) 381 MOVQ R11, 72(R15) 382 MOVQ R12, 80(R15) 383 MOVQ R13, 88(R15) 384 RET 385 386 TEXT ·squareAdxE2(SB), $48-16 387 NO_LOCAL_POINTERS 388 389 // z.A0 = (x.A0 + x.A1) * (x.A0 - x.A1) 390 // z.A1 = 2 * x.A0 * x.A1 391 392 CMPB ·supportAdx(SB), $1 393 JNE l4 394 395 // 2 * x.A0 * x.A1 396 MOVQ x+8(FP), AX 397 398 // 2 * x.A1[0] -> R14 399 // 2 * x.A1[1] -> R15 400 // 2 * x.A1[2] -> CX 401 // 2 * x.A1[3] -> BX 402 // 2 * x.A1[4] -> SI 403 // 2 * x.A1[5] -> DI 404 MOVQ 48(AX), R14 405 MOVQ 56(AX), R15 406 MOVQ 64(AX), CX 407 MOVQ 72(AX), BX 408 MOVQ 80(AX), SI 409 MOVQ 88(AX), DI 410 ADDQ R14, R14 411 ADCQ R15, R15 412 ADCQ CX, CX 413 ADCQ BX, BX 414 ADCQ SI, SI 415 ADCQ DI, DI 416 417 // A -> BP 418 // t[0] -> R8 419 // t[1] -> R9 420 // t[2] -> R10 421 // t[3] -> R11 422 // t[4] -> R12 423 // t[5] -> R13 424 // clear the flags 425 XORQ AX, AX 426 MOVQ x+8(FP), DX 427 MOVQ 0(DX), DX 428 429 // (A,t[0]) := x[0]*y[0] + A 430 MULXQ R14, R8, R9 431 432 // (A,t[1]) := x[1]*y[0] + A 433 MULXQ R15, AX, R10 434 ADOXQ AX, R9 435 436 // (A,t[2]) := x[2]*y[0] + A 437 MULXQ CX, AX, R11 438 ADOXQ AX, R10 439 440 // (A,t[3]) := x[3]*y[0] + A 441 MULXQ BX, AX, R12 442 ADOXQ AX, R11 443 444 // (A,t[4]) := x[4]*y[0] + A 445 MULXQ SI, AX, R13 446 ADOXQ AX, R12 447 448 // (A,t[5]) := x[5]*y[0] + A 449 MULXQ DI, AX, BP 450 ADOXQ AX, R13 451 452 // A += carries from ADCXQ and ADOXQ 453 MOVQ $0, AX 454 ADOXQ AX, BP 455 PUSHQ BP 456 457 // m := t[0]*q'[0] mod W 458 MOVQ qInv0<>(SB), DX 459 IMULQ R8, DX 460 461 // clear the flags 462 XORQ AX, AX 463 464 // C,_ := t[0] + m*q[0] 465 MULXQ q<>+0(SB), AX, BP 466 ADCXQ R8, AX 467 MOVQ BP, R8 468 POPQ BP 469 470 // (C,t[0]) := t[1] + m*q[1] + C 471 ADCXQ R9, R8 472 MULXQ q<>+8(SB), AX, R9 473 ADOXQ AX, R8 474 475 // (C,t[1]) := t[2] + m*q[2] + C 476 ADCXQ R10, R9 477 MULXQ q<>+16(SB), AX, R10 478 ADOXQ AX, R9 479 480 // (C,t[2]) := t[3] + m*q[3] + C 481 ADCXQ R11, R10 482 MULXQ q<>+24(SB), AX, R11 483 ADOXQ AX, R10 484 485 // (C,t[3]) := t[4] + m*q[4] + C 486 ADCXQ R12, R11 487 MULXQ q<>+32(SB), AX, R12 488 ADOXQ AX, R11 489 490 // (C,t[4]) := t[5] + m*q[5] + C 491 ADCXQ R13, R12 492 MULXQ q<>+40(SB), AX, R13 493 ADOXQ AX, R12 494 495 // t[5] = C + A 496 MOVQ $0, AX 497 ADCXQ AX, R13 498 ADOXQ BP, R13 499 500 // clear the flags 501 XORQ AX, AX 502 MOVQ x+8(FP), DX 503 MOVQ 8(DX), DX 504 505 // (A,t[0]) := t[0] + x[0]*y[1] + A 506 MULXQ R14, AX, BP 507 ADOXQ AX, R8 508 509 // (A,t[1]) := t[1] + x[1]*y[1] + A 510 ADCXQ BP, R9 511 MULXQ R15, AX, BP 512 ADOXQ AX, R9 513 514 // (A,t[2]) := t[2] + x[2]*y[1] + A 515 ADCXQ BP, R10 516 MULXQ CX, AX, BP 517 ADOXQ AX, R10 518 519 // (A,t[3]) := t[3] + x[3]*y[1] + A 520 ADCXQ BP, R11 521 MULXQ BX, AX, BP 522 ADOXQ AX, R11 523 524 // (A,t[4]) := t[4] + x[4]*y[1] + A 525 ADCXQ BP, R12 526 MULXQ SI, AX, BP 527 ADOXQ AX, R12 528 529 // (A,t[5]) := t[5] + x[5]*y[1] + A 530 ADCXQ BP, R13 531 MULXQ DI, AX, BP 532 ADOXQ AX, R13 533 534 // A += carries from ADCXQ and ADOXQ 535 MOVQ $0, AX 536 ADCXQ AX, BP 537 ADOXQ AX, BP 538 PUSHQ BP 539 540 // m := t[0]*q'[0] mod W 541 MOVQ qInv0<>(SB), DX 542 IMULQ R8, DX 543 544 // clear the flags 545 XORQ AX, AX 546 547 // C,_ := t[0] + m*q[0] 548 MULXQ q<>+0(SB), AX, BP 549 ADCXQ R8, AX 550 MOVQ BP, R8 551 POPQ BP 552 553 // (C,t[0]) := t[1] + m*q[1] + C 554 ADCXQ R9, R8 555 MULXQ q<>+8(SB), AX, R9 556 ADOXQ AX, R8 557 558 // (C,t[1]) := t[2] + m*q[2] + C 559 ADCXQ R10, R9 560 MULXQ q<>+16(SB), AX, R10 561 ADOXQ AX, R9 562 563 // (C,t[2]) := t[3] + m*q[3] + C 564 ADCXQ R11, R10 565 MULXQ q<>+24(SB), AX, R11 566 ADOXQ AX, R10 567 568 // (C,t[3]) := t[4] + m*q[4] + C 569 ADCXQ R12, R11 570 MULXQ q<>+32(SB), AX, R12 571 ADOXQ AX, R11 572 573 // (C,t[4]) := t[5] + m*q[5] + C 574 ADCXQ R13, R12 575 MULXQ q<>+40(SB), AX, R13 576 ADOXQ AX, R12 577 578 // t[5] = C + A 579 MOVQ $0, AX 580 ADCXQ AX, R13 581 ADOXQ BP, R13 582 583 // clear the flags 584 XORQ AX, AX 585 MOVQ x+8(FP), DX 586 MOVQ 16(DX), DX 587 588 // (A,t[0]) := t[0] + x[0]*y[2] + A 589 MULXQ R14, AX, BP 590 ADOXQ AX, R8 591 592 // (A,t[1]) := t[1] + x[1]*y[2] + A 593 ADCXQ BP, R9 594 MULXQ R15, AX, BP 595 ADOXQ AX, R9 596 597 // (A,t[2]) := t[2] + x[2]*y[2] + A 598 ADCXQ BP, R10 599 MULXQ CX, AX, BP 600 ADOXQ AX, R10 601 602 // (A,t[3]) := t[3] + x[3]*y[2] + A 603 ADCXQ BP, R11 604 MULXQ BX, AX, BP 605 ADOXQ AX, R11 606 607 // (A,t[4]) := t[4] + x[4]*y[2] + A 608 ADCXQ BP, R12 609 MULXQ SI, AX, BP 610 ADOXQ AX, R12 611 612 // (A,t[5]) := t[5] + x[5]*y[2] + A 613 ADCXQ BP, R13 614 MULXQ DI, AX, BP 615 ADOXQ AX, R13 616 617 // A += carries from ADCXQ and ADOXQ 618 MOVQ $0, AX 619 ADCXQ AX, BP 620 ADOXQ AX, BP 621 PUSHQ BP 622 623 // m := t[0]*q'[0] mod W 624 MOVQ qInv0<>(SB), DX 625 IMULQ R8, DX 626 627 // clear the flags 628 XORQ AX, AX 629 630 // C,_ := t[0] + m*q[0] 631 MULXQ q<>+0(SB), AX, BP 632 ADCXQ R8, AX 633 MOVQ BP, R8 634 POPQ BP 635 636 // (C,t[0]) := t[1] + m*q[1] + C 637 ADCXQ R9, R8 638 MULXQ q<>+8(SB), AX, R9 639 ADOXQ AX, R8 640 641 // (C,t[1]) := t[2] + m*q[2] + C 642 ADCXQ R10, R9 643 MULXQ q<>+16(SB), AX, R10 644 ADOXQ AX, R9 645 646 // (C,t[2]) := t[3] + m*q[3] + C 647 ADCXQ R11, R10 648 MULXQ q<>+24(SB), AX, R11 649 ADOXQ AX, R10 650 651 // (C,t[3]) := t[4] + m*q[4] + C 652 ADCXQ R12, R11 653 MULXQ q<>+32(SB), AX, R12 654 ADOXQ AX, R11 655 656 // (C,t[4]) := t[5] + m*q[5] + C 657 ADCXQ R13, R12 658 MULXQ q<>+40(SB), AX, R13 659 ADOXQ AX, R12 660 661 // t[5] = C + A 662 MOVQ $0, AX 663 ADCXQ AX, R13 664 ADOXQ BP, R13 665 666 // clear the flags 667 XORQ AX, AX 668 MOVQ x+8(FP), DX 669 MOVQ 24(DX), DX 670 671 // (A,t[0]) := t[0] + x[0]*y[3] + A 672 MULXQ R14, AX, BP 673 ADOXQ AX, R8 674 675 // (A,t[1]) := t[1] + x[1]*y[3] + A 676 ADCXQ BP, R9 677 MULXQ R15, AX, BP 678 ADOXQ AX, R9 679 680 // (A,t[2]) := t[2] + x[2]*y[3] + A 681 ADCXQ BP, R10 682 MULXQ CX, AX, BP 683 ADOXQ AX, R10 684 685 // (A,t[3]) := t[3] + x[3]*y[3] + A 686 ADCXQ BP, R11 687 MULXQ BX, AX, BP 688 ADOXQ AX, R11 689 690 // (A,t[4]) := t[4] + x[4]*y[3] + A 691 ADCXQ BP, R12 692 MULXQ SI, AX, BP 693 ADOXQ AX, R12 694 695 // (A,t[5]) := t[5] + x[5]*y[3] + A 696 ADCXQ BP, R13 697 MULXQ DI, AX, BP 698 ADOXQ AX, R13 699 700 // A += carries from ADCXQ and ADOXQ 701 MOVQ $0, AX 702 ADCXQ AX, BP 703 ADOXQ AX, BP 704 PUSHQ BP 705 706 // m := t[0]*q'[0] mod W 707 MOVQ qInv0<>(SB), DX 708 IMULQ R8, DX 709 710 // clear the flags 711 XORQ AX, AX 712 713 // C,_ := t[0] + m*q[0] 714 MULXQ q<>+0(SB), AX, BP 715 ADCXQ R8, AX 716 MOVQ BP, R8 717 POPQ BP 718 719 // (C,t[0]) := t[1] + m*q[1] + C 720 ADCXQ R9, R8 721 MULXQ q<>+8(SB), AX, R9 722 ADOXQ AX, R8 723 724 // (C,t[1]) := t[2] + m*q[2] + C 725 ADCXQ R10, R9 726 MULXQ q<>+16(SB), AX, R10 727 ADOXQ AX, R9 728 729 // (C,t[2]) := t[3] + m*q[3] + C 730 ADCXQ R11, R10 731 MULXQ q<>+24(SB), AX, R11 732 ADOXQ AX, R10 733 734 // (C,t[3]) := t[4] + m*q[4] + C 735 ADCXQ R12, R11 736 MULXQ q<>+32(SB), AX, R12 737 ADOXQ AX, R11 738 739 // (C,t[4]) := t[5] + m*q[5] + C 740 ADCXQ R13, R12 741 MULXQ q<>+40(SB), AX, R13 742 ADOXQ AX, R12 743 744 // t[5] = C + A 745 MOVQ $0, AX 746 ADCXQ AX, R13 747 ADOXQ BP, R13 748 749 // clear the flags 750 XORQ AX, AX 751 MOVQ x+8(FP), DX 752 MOVQ 32(DX), DX 753 754 // (A,t[0]) := t[0] + x[0]*y[4] + A 755 MULXQ R14, AX, BP 756 ADOXQ AX, R8 757 758 // (A,t[1]) := t[1] + x[1]*y[4] + A 759 ADCXQ BP, R9 760 MULXQ R15, AX, BP 761 ADOXQ AX, R9 762 763 // (A,t[2]) := t[2] + x[2]*y[4] + A 764 ADCXQ BP, R10 765 MULXQ CX, AX, BP 766 ADOXQ AX, R10 767 768 // (A,t[3]) := t[3] + x[3]*y[4] + A 769 ADCXQ BP, R11 770 MULXQ BX, AX, BP 771 ADOXQ AX, R11 772 773 // (A,t[4]) := t[4] + x[4]*y[4] + A 774 ADCXQ BP, R12 775 MULXQ SI, AX, BP 776 ADOXQ AX, R12 777 778 // (A,t[5]) := t[5] + x[5]*y[4] + A 779 ADCXQ BP, R13 780 MULXQ DI, AX, BP 781 ADOXQ AX, R13 782 783 // A += carries from ADCXQ and ADOXQ 784 MOVQ $0, AX 785 ADCXQ AX, BP 786 ADOXQ AX, BP 787 PUSHQ BP 788 789 // m := t[0]*q'[0] mod W 790 MOVQ qInv0<>(SB), DX 791 IMULQ R8, DX 792 793 // clear the flags 794 XORQ AX, AX 795 796 // C,_ := t[0] + m*q[0] 797 MULXQ q<>+0(SB), AX, BP 798 ADCXQ R8, AX 799 MOVQ BP, R8 800 POPQ BP 801 802 // (C,t[0]) := t[1] + m*q[1] + C 803 ADCXQ R9, R8 804 MULXQ q<>+8(SB), AX, R9 805 ADOXQ AX, R8 806 807 // (C,t[1]) := t[2] + m*q[2] + C 808 ADCXQ R10, R9 809 MULXQ q<>+16(SB), AX, R10 810 ADOXQ AX, R9 811 812 // (C,t[2]) := t[3] + m*q[3] + C 813 ADCXQ R11, R10 814 MULXQ q<>+24(SB), AX, R11 815 ADOXQ AX, R10 816 817 // (C,t[3]) := t[4] + m*q[4] + C 818 ADCXQ R12, R11 819 MULXQ q<>+32(SB), AX, R12 820 ADOXQ AX, R11 821 822 // (C,t[4]) := t[5] + m*q[5] + C 823 ADCXQ R13, R12 824 MULXQ q<>+40(SB), AX, R13 825 ADOXQ AX, R12 826 827 // t[5] = C + A 828 MOVQ $0, AX 829 ADCXQ AX, R13 830 ADOXQ BP, R13 831 832 // clear the flags 833 XORQ AX, AX 834 MOVQ x+8(FP), DX 835 MOVQ 40(DX), DX 836 837 // (A,t[0]) := t[0] + x[0]*y[5] + A 838 MULXQ R14, AX, BP 839 ADOXQ AX, R8 840 841 // (A,t[1]) := t[1] + x[1]*y[5] + A 842 ADCXQ BP, R9 843 MULXQ R15, AX, BP 844 ADOXQ AX, R9 845 846 // (A,t[2]) := t[2] + x[2]*y[5] + A 847 ADCXQ BP, R10 848 MULXQ CX, AX, BP 849 ADOXQ AX, R10 850 851 // (A,t[3]) := t[3] + x[3]*y[5] + A 852 ADCXQ BP, R11 853 MULXQ BX, AX, BP 854 ADOXQ AX, R11 855 856 // (A,t[4]) := t[4] + x[4]*y[5] + A 857 ADCXQ BP, R12 858 MULXQ SI, AX, BP 859 ADOXQ AX, R12 860 861 // (A,t[5]) := t[5] + x[5]*y[5] + A 862 ADCXQ BP, R13 863 MULXQ DI, AX, BP 864 ADOXQ AX, R13 865 866 // A += carries from ADCXQ and ADOXQ 867 MOVQ $0, AX 868 ADCXQ AX, BP 869 ADOXQ AX, BP 870 PUSHQ BP 871 872 // m := t[0]*q'[0] mod W 873 MOVQ qInv0<>(SB), DX 874 IMULQ R8, DX 875 876 // clear the flags 877 XORQ AX, AX 878 879 // C,_ := t[0] + m*q[0] 880 MULXQ q<>+0(SB), AX, BP 881 ADCXQ R8, AX 882 MOVQ BP, R8 883 POPQ BP 884 885 // (C,t[0]) := t[1] + m*q[1] + C 886 ADCXQ R9, R8 887 MULXQ q<>+8(SB), AX, R9 888 ADOXQ AX, R8 889 890 // (C,t[1]) := t[2] + m*q[2] + C 891 ADCXQ R10, R9 892 MULXQ q<>+16(SB), AX, R10 893 ADOXQ AX, R9 894 895 // (C,t[2]) := t[3] + m*q[3] + C 896 ADCXQ R11, R10 897 MULXQ q<>+24(SB), AX, R11 898 ADOXQ AX, R10 899 900 // (C,t[3]) := t[4] + m*q[4] + C 901 ADCXQ R12, R11 902 MULXQ q<>+32(SB), AX, R12 903 ADOXQ AX, R11 904 905 // (C,t[4]) := t[5] + m*q[5] + C 906 ADCXQ R13, R12 907 MULXQ q<>+40(SB), AX, R13 908 ADOXQ AX, R12 909 910 // t[5] = C + A 911 MOVQ $0, AX 912 ADCXQ AX, R13 913 ADOXQ BP, R13 914 915 // reduce element(R8,R9,R10,R11,R12,R13) using temp registers (R14,R15,CX,BX,SI,DI) 916 REDUCE(R8,R9,R10,R11,R12,R13,R14,R15,CX,BX,SI,DI) 917 918 MOVQ x+8(FP), AX 919 920 // x.A1[0] -> R14 921 // x.A1[1] -> R15 922 // x.A1[2] -> CX 923 // x.A1[3] -> BX 924 // x.A1[4] -> SI 925 // x.A1[5] -> DI 926 MOVQ 48(AX), R14 927 MOVQ 56(AX), R15 928 MOVQ 64(AX), CX 929 MOVQ 72(AX), BX 930 MOVQ 80(AX), SI 931 MOVQ 88(AX), DI 932 MOVQ res+0(FP), DX 933 MOVQ R8, 48(DX) 934 MOVQ R9, 56(DX) 935 MOVQ R10, 64(DX) 936 MOVQ R11, 72(DX) 937 MOVQ R12, 80(DX) 938 MOVQ R13, 88(DX) 939 MOVQ R14, R8 940 MOVQ R15, R9 941 MOVQ CX, R10 942 MOVQ BX, R11 943 MOVQ SI, R12 944 MOVQ DI, R13 945 946 // Add(&x.A0, &x.A1) 947 ADDQ 0(AX), R14 948 ADCQ 8(AX), R15 949 ADCQ 16(AX), CX 950 ADCQ 24(AX), BX 951 ADCQ 32(AX), SI 952 ADCQ 40(AX), DI 953 MOVQ R14, s0-8(SP) 954 MOVQ R15, s1-16(SP) 955 MOVQ CX, s2-24(SP) 956 MOVQ BX, s3-32(SP) 957 MOVQ SI, s4-40(SP) 958 MOVQ DI, s5-48(SP) 959 XORQ BP, BP 960 961 // Sub(&x.A0, &x.A1) 962 MOVQ 0(AX), R14 963 MOVQ 8(AX), R15 964 MOVQ 16(AX), CX 965 MOVQ 24(AX), BX 966 MOVQ 32(AX), SI 967 MOVQ 40(AX), DI 968 SUBQ R8, R14 969 SBBQ R9, R15 970 SBBQ R10, CX 971 SBBQ R11, BX 972 SBBQ R12, SI 973 SBBQ R13, DI 974 MOVQ $0xb9feffffffffaaab, R8 975 MOVQ $0x1eabfffeb153ffff, R9 976 MOVQ $0x6730d2a0f6b0f624, R10 977 MOVQ $0x64774b84f38512bf, R11 978 MOVQ $0x4b1ba7b6434bacd7, R12 979 MOVQ $0x1a0111ea397fe69a, R13 980 CMOVQCC BP, R8 981 CMOVQCC BP, R9 982 CMOVQCC BP, R10 983 CMOVQCC BP, R11 984 CMOVQCC BP, R12 985 CMOVQCC BP, R13 986 ADDQ R8, R14 987 ADCQ R9, R15 988 ADCQ R10, CX 989 ADCQ R11, BX 990 ADCQ R12, SI 991 ADCQ R13, DI 992 993 // A -> BP 994 // t[0] -> R8 995 // t[1] -> R9 996 // t[2] -> R10 997 // t[3] -> R11 998 // t[4] -> R12 999 // t[5] -> R13 1000 // clear the flags 1001 XORQ AX, AX 1002 MOVQ s0-8(SP), DX 1003 1004 // (A,t[0]) := x[0]*y[0] + A 1005 MULXQ R14, R8, R9 1006 1007 // (A,t[1]) := x[1]*y[0] + A 1008 MULXQ R15, AX, R10 1009 ADOXQ AX, R9 1010 1011 // (A,t[2]) := x[2]*y[0] + A 1012 MULXQ CX, AX, R11 1013 ADOXQ AX, R10 1014 1015 // (A,t[3]) := x[3]*y[0] + A 1016 MULXQ BX, AX, R12 1017 ADOXQ AX, R11 1018 1019 // (A,t[4]) := x[4]*y[0] + A 1020 MULXQ SI, AX, R13 1021 ADOXQ AX, R12 1022 1023 // (A,t[5]) := x[5]*y[0] + A 1024 MULXQ DI, AX, BP 1025 ADOXQ AX, R13 1026 1027 // A += carries from ADCXQ and ADOXQ 1028 MOVQ $0, AX 1029 ADOXQ AX, BP 1030 PUSHQ BP 1031 1032 // m := t[0]*q'[0] mod W 1033 MOVQ qInv0<>(SB), DX 1034 IMULQ R8, DX 1035 1036 // clear the flags 1037 XORQ AX, AX 1038 1039 // C,_ := t[0] + m*q[0] 1040 MULXQ q<>+0(SB), AX, BP 1041 ADCXQ R8, AX 1042 MOVQ BP, R8 1043 POPQ BP 1044 1045 // (C,t[0]) := t[1] + m*q[1] + C 1046 ADCXQ R9, R8 1047 MULXQ q<>+8(SB), AX, R9 1048 ADOXQ AX, R8 1049 1050 // (C,t[1]) := t[2] + m*q[2] + C 1051 ADCXQ R10, R9 1052 MULXQ q<>+16(SB), AX, R10 1053 ADOXQ AX, R9 1054 1055 // (C,t[2]) := t[3] + m*q[3] + C 1056 ADCXQ R11, R10 1057 MULXQ q<>+24(SB), AX, R11 1058 ADOXQ AX, R10 1059 1060 // (C,t[3]) := t[4] + m*q[4] + C 1061 ADCXQ R12, R11 1062 MULXQ q<>+32(SB), AX, R12 1063 ADOXQ AX, R11 1064 1065 // (C,t[4]) := t[5] + m*q[5] + C 1066 ADCXQ R13, R12 1067 MULXQ q<>+40(SB), AX, R13 1068 ADOXQ AX, R12 1069 1070 // t[5] = C + A 1071 MOVQ $0, AX 1072 ADCXQ AX, R13 1073 ADOXQ BP, R13 1074 1075 // clear the flags 1076 XORQ AX, AX 1077 MOVQ s1-16(SP), DX 1078 1079 // (A,t[0]) := t[0] + x[0]*y[1] + A 1080 MULXQ R14, AX, BP 1081 ADOXQ AX, R8 1082 1083 // (A,t[1]) := t[1] + x[1]*y[1] + A 1084 ADCXQ BP, R9 1085 MULXQ R15, AX, BP 1086 ADOXQ AX, R9 1087 1088 // (A,t[2]) := t[2] + x[2]*y[1] + A 1089 ADCXQ BP, R10 1090 MULXQ CX, AX, BP 1091 ADOXQ AX, R10 1092 1093 // (A,t[3]) := t[3] + x[3]*y[1] + A 1094 ADCXQ BP, R11 1095 MULXQ BX, AX, BP 1096 ADOXQ AX, R11 1097 1098 // (A,t[4]) := t[4] + x[4]*y[1] + A 1099 ADCXQ BP, R12 1100 MULXQ SI, AX, BP 1101 ADOXQ AX, R12 1102 1103 // (A,t[5]) := t[5] + x[5]*y[1] + A 1104 ADCXQ BP, R13 1105 MULXQ DI, AX, BP 1106 ADOXQ AX, R13 1107 1108 // A += carries from ADCXQ and ADOXQ 1109 MOVQ $0, AX 1110 ADCXQ AX, BP 1111 ADOXQ AX, BP 1112 PUSHQ BP 1113 1114 // m := t[0]*q'[0] mod W 1115 MOVQ qInv0<>(SB), DX 1116 IMULQ R8, DX 1117 1118 // clear the flags 1119 XORQ AX, AX 1120 1121 // C,_ := t[0] + m*q[0] 1122 MULXQ q<>+0(SB), AX, BP 1123 ADCXQ R8, AX 1124 MOVQ BP, R8 1125 POPQ BP 1126 1127 // (C,t[0]) := t[1] + m*q[1] + C 1128 ADCXQ R9, R8 1129 MULXQ q<>+8(SB), AX, R9 1130 ADOXQ AX, R8 1131 1132 // (C,t[1]) := t[2] + m*q[2] + C 1133 ADCXQ R10, R9 1134 MULXQ q<>+16(SB), AX, R10 1135 ADOXQ AX, R9 1136 1137 // (C,t[2]) := t[3] + m*q[3] + C 1138 ADCXQ R11, R10 1139 MULXQ q<>+24(SB), AX, R11 1140 ADOXQ AX, R10 1141 1142 // (C,t[3]) := t[4] + m*q[4] + C 1143 ADCXQ R12, R11 1144 MULXQ q<>+32(SB), AX, R12 1145 ADOXQ AX, R11 1146 1147 // (C,t[4]) := t[5] + m*q[5] + C 1148 ADCXQ R13, R12 1149 MULXQ q<>+40(SB), AX, R13 1150 ADOXQ AX, R12 1151 1152 // t[5] = C + A 1153 MOVQ $0, AX 1154 ADCXQ AX, R13 1155 ADOXQ BP, R13 1156 1157 // clear the flags 1158 XORQ AX, AX 1159 MOVQ s2-24(SP), DX 1160 1161 // (A,t[0]) := t[0] + x[0]*y[2] + A 1162 MULXQ R14, AX, BP 1163 ADOXQ AX, R8 1164 1165 // (A,t[1]) := t[1] + x[1]*y[2] + A 1166 ADCXQ BP, R9 1167 MULXQ R15, AX, BP 1168 ADOXQ AX, R9 1169 1170 // (A,t[2]) := t[2] + x[2]*y[2] + A 1171 ADCXQ BP, R10 1172 MULXQ CX, AX, BP 1173 ADOXQ AX, R10 1174 1175 // (A,t[3]) := t[3] + x[3]*y[2] + A 1176 ADCXQ BP, R11 1177 MULXQ BX, AX, BP 1178 ADOXQ AX, R11 1179 1180 // (A,t[4]) := t[4] + x[4]*y[2] + A 1181 ADCXQ BP, R12 1182 MULXQ SI, AX, BP 1183 ADOXQ AX, R12 1184 1185 // (A,t[5]) := t[5] + x[5]*y[2] + A 1186 ADCXQ BP, R13 1187 MULXQ DI, AX, BP 1188 ADOXQ AX, R13 1189 1190 // A += carries from ADCXQ and ADOXQ 1191 MOVQ $0, AX 1192 ADCXQ AX, BP 1193 ADOXQ AX, BP 1194 PUSHQ BP 1195 1196 // m := t[0]*q'[0] mod W 1197 MOVQ qInv0<>(SB), DX 1198 IMULQ R8, DX 1199 1200 // clear the flags 1201 XORQ AX, AX 1202 1203 // C,_ := t[0] + m*q[0] 1204 MULXQ q<>+0(SB), AX, BP 1205 ADCXQ R8, AX 1206 MOVQ BP, R8 1207 POPQ BP 1208 1209 // (C,t[0]) := t[1] + m*q[1] + C 1210 ADCXQ R9, R8 1211 MULXQ q<>+8(SB), AX, R9 1212 ADOXQ AX, R8 1213 1214 // (C,t[1]) := t[2] + m*q[2] + C 1215 ADCXQ R10, R9 1216 MULXQ q<>+16(SB), AX, R10 1217 ADOXQ AX, R9 1218 1219 // (C,t[2]) := t[3] + m*q[3] + C 1220 ADCXQ R11, R10 1221 MULXQ q<>+24(SB), AX, R11 1222 ADOXQ AX, R10 1223 1224 // (C,t[3]) := t[4] + m*q[4] + C 1225 ADCXQ R12, R11 1226 MULXQ q<>+32(SB), AX, R12 1227 ADOXQ AX, R11 1228 1229 // (C,t[4]) := t[5] + m*q[5] + C 1230 ADCXQ R13, R12 1231 MULXQ q<>+40(SB), AX, R13 1232 ADOXQ AX, R12 1233 1234 // t[5] = C + A 1235 MOVQ $0, AX 1236 ADCXQ AX, R13 1237 ADOXQ BP, R13 1238 1239 // clear the flags 1240 XORQ AX, AX 1241 MOVQ s3-32(SP), DX 1242 1243 // (A,t[0]) := t[0] + x[0]*y[3] + A 1244 MULXQ R14, AX, BP 1245 ADOXQ AX, R8 1246 1247 // (A,t[1]) := t[1] + x[1]*y[3] + A 1248 ADCXQ BP, R9 1249 MULXQ R15, AX, BP 1250 ADOXQ AX, R9 1251 1252 // (A,t[2]) := t[2] + x[2]*y[3] + A 1253 ADCXQ BP, R10 1254 MULXQ CX, AX, BP 1255 ADOXQ AX, R10 1256 1257 // (A,t[3]) := t[3] + x[3]*y[3] + A 1258 ADCXQ BP, R11 1259 MULXQ BX, AX, BP 1260 ADOXQ AX, R11 1261 1262 // (A,t[4]) := t[4] + x[4]*y[3] + A 1263 ADCXQ BP, R12 1264 MULXQ SI, AX, BP 1265 ADOXQ AX, R12 1266 1267 // (A,t[5]) := t[5] + x[5]*y[3] + A 1268 ADCXQ BP, R13 1269 MULXQ DI, AX, BP 1270 ADOXQ AX, R13 1271 1272 // A += carries from ADCXQ and ADOXQ 1273 MOVQ $0, AX 1274 ADCXQ AX, BP 1275 ADOXQ AX, BP 1276 PUSHQ BP 1277 1278 // m := t[0]*q'[0] mod W 1279 MOVQ qInv0<>(SB), DX 1280 IMULQ R8, DX 1281 1282 // clear the flags 1283 XORQ AX, AX 1284 1285 // C,_ := t[0] + m*q[0] 1286 MULXQ q<>+0(SB), AX, BP 1287 ADCXQ R8, AX 1288 MOVQ BP, R8 1289 POPQ BP 1290 1291 // (C,t[0]) := t[1] + m*q[1] + C 1292 ADCXQ R9, R8 1293 MULXQ q<>+8(SB), AX, R9 1294 ADOXQ AX, R8 1295 1296 // (C,t[1]) := t[2] + m*q[2] + C 1297 ADCXQ R10, R9 1298 MULXQ q<>+16(SB), AX, R10 1299 ADOXQ AX, R9 1300 1301 // (C,t[2]) := t[3] + m*q[3] + C 1302 ADCXQ R11, R10 1303 MULXQ q<>+24(SB), AX, R11 1304 ADOXQ AX, R10 1305 1306 // (C,t[3]) := t[4] + m*q[4] + C 1307 ADCXQ R12, R11 1308 MULXQ q<>+32(SB), AX, R12 1309 ADOXQ AX, R11 1310 1311 // (C,t[4]) := t[5] + m*q[5] + C 1312 ADCXQ R13, R12 1313 MULXQ q<>+40(SB), AX, R13 1314 ADOXQ AX, R12 1315 1316 // t[5] = C + A 1317 MOVQ $0, AX 1318 ADCXQ AX, R13 1319 ADOXQ BP, R13 1320 1321 // clear the flags 1322 XORQ AX, AX 1323 MOVQ s4-40(SP), DX 1324 1325 // (A,t[0]) := t[0] + x[0]*y[4] + A 1326 MULXQ R14, AX, BP 1327 ADOXQ AX, R8 1328 1329 // (A,t[1]) := t[1] + x[1]*y[4] + A 1330 ADCXQ BP, R9 1331 MULXQ R15, AX, BP 1332 ADOXQ AX, R9 1333 1334 // (A,t[2]) := t[2] + x[2]*y[4] + A 1335 ADCXQ BP, R10 1336 MULXQ CX, AX, BP 1337 ADOXQ AX, R10 1338 1339 // (A,t[3]) := t[3] + x[3]*y[4] + A 1340 ADCXQ BP, R11 1341 MULXQ BX, AX, BP 1342 ADOXQ AX, R11 1343 1344 // (A,t[4]) := t[4] + x[4]*y[4] + A 1345 ADCXQ BP, R12 1346 MULXQ SI, AX, BP 1347 ADOXQ AX, R12 1348 1349 // (A,t[5]) := t[5] + x[5]*y[4] + A 1350 ADCXQ BP, R13 1351 MULXQ DI, AX, BP 1352 ADOXQ AX, R13 1353 1354 // A += carries from ADCXQ and ADOXQ 1355 MOVQ $0, AX 1356 ADCXQ AX, BP 1357 ADOXQ AX, BP 1358 PUSHQ BP 1359 1360 // m := t[0]*q'[0] mod W 1361 MOVQ qInv0<>(SB), DX 1362 IMULQ R8, DX 1363 1364 // clear the flags 1365 XORQ AX, AX 1366 1367 // C,_ := t[0] + m*q[0] 1368 MULXQ q<>+0(SB), AX, BP 1369 ADCXQ R8, AX 1370 MOVQ BP, R8 1371 POPQ BP 1372 1373 // (C,t[0]) := t[1] + m*q[1] + C 1374 ADCXQ R9, R8 1375 MULXQ q<>+8(SB), AX, R9 1376 ADOXQ AX, R8 1377 1378 // (C,t[1]) := t[2] + m*q[2] + C 1379 ADCXQ R10, R9 1380 MULXQ q<>+16(SB), AX, R10 1381 ADOXQ AX, R9 1382 1383 // (C,t[2]) := t[3] + m*q[3] + C 1384 ADCXQ R11, R10 1385 MULXQ q<>+24(SB), AX, R11 1386 ADOXQ AX, R10 1387 1388 // (C,t[3]) := t[4] + m*q[4] + C 1389 ADCXQ R12, R11 1390 MULXQ q<>+32(SB), AX, R12 1391 ADOXQ AX, R11 1392 1393 // (C,t[4]) := t[5] + m*q[5] + C 1394 ADCXQ R13, R12 1395 MULXQ q<>+40(SB), AX, R13 1396 ADOXQ AX, R12 1397 1398 // t[5] = C + A 1399 MOVQ $0, AX 1400 ADCXQ AX, R13 1401 ADOXQ BP, R13 1402 1403 // clear the flags 1404 XORQ AX, AX 1405 MOVQ s5-48(SP), DX 1406 1407 // (A,t[0]) := t[0] + x[0]*y[5] + A 1408 MULXQ R14, AX, BP 1409 ADOXQ AX, R8 1410 1411 // (A,t[1]) := t[1] + x[1]*y[5] + A 1412 ADCXQ BP, R9 1413 MULXQ R15, AX, BP 1414 ADOXQ AX, R9 1415 1416 // (A,t[2]) := t[2] + x[2]*y[5] + A 1417 ADCXQ BP, R10 1418 MULXQ CX, AX, BP 1419 ADOXQ AX, R10 1420 1421 // (A,t[3]) := t[3] + x[3]*y[5] + A 1422 ADCXQ BP, R11 1423 MULXQ BX, AX, BP 1424 ADOXQ AX, R11 1425 1426 // (A,t[4]) := t[4] + x[4]*y[5] + A 1427 ADCXQ BP, R12 1428 MULXQ SI, AX, BP 1429 ADOXQ AX, R12 1430 1431 // (A,t[5]) := t[5] + x[5]*y[5] + A 1432 ADCXQ BP, R13 1433 MULXQ DI, AX, BP 1434 ADOXQ AX, R13 1435 1436 // A += carries from ADCXQ and ADOXQ 1437 MOVQ $0, AX 1438 ADCXQ AX, BP 1439 ADOXQ AX, BP 1440 PUSHQ BP 1441 1442 // m := t[0]*q'[0] mod W 1443 MOVQ qInv0<>(SB), DX 1444 IMULQ R8, DX 1445 1446 // clear the flags 1447 XORQ AX, AX 1448 1449 // C,_ := t[0] + m*q[0] 1450 MULXQ q<>+0(SB), AX, BP 1451 ADCXQ R8, AX 1452 MOVQ BP, R8 1453 POPQ BP 1454 1455 // (C,t[0]) := t[1] + m*q[1] + C 1456 ADCXQ R9, R8 1457 MULXQ q<>+8(SB), AX, R9 1458 ADOXQ AX, R8 1459 1460 // (C,t[1]) := t[2] + m*q[2] + C 1461 ADCXQ R10, R9 1462 MULXQ q<>+16(SB), AX, R10 1463 ADOXQ AX, R9 1464 1465 // (C,t[2]) := t[3] + m*q[3] + C 1466 ADCXQ R11, R10 1467 MULXQ q<>+24(SB), AX, R11 1468 ADOXQ AX, R10 1469 1470 // (C,t[3]) := t[4] + m*q[4] + C 1471 ADCXQ R12, R11 1472 MULXQ q<>+32(SB), AX, R12 1473 ADOXQ AX, R11 1474 1475 // (C,t[4]) := t[5] + m*q[5] + C 1476 ADCXQ R13, R12 1477 MULXQ q<>+40(SB), AX, R13 1478 ADOXQ AX, R12 1479 1480 // t[5] = C + A 1481 MOVQ $0, AX 1482 ADCXQ AX, R13 1483 ADOXQ BP, R13 1484 1485 // reduce element(R8,R9,R10,R11,R12,R13) using temp registers (R14,R15,CX,BX,SI,DI) 1486 REDUCE(R8,R9,R10,R11,R12,R13,R14,R15,CX,BX,SI,DI) 1487 1488 MOVQ res+0(FP), AX 1489 MOVQ R8, 0(AX) 1490 MOVQ R9, 8(AX) 1491 MOVQ R10, 16(AX) 1492 MOVQ R11, 24(AX) 1493 MOVQ R12, 32(AX) 1494 MOVQ R13, 40(AX) 1495 RET 1496 1497 l4: 1498 MOVQ res+0(FP), AX 1499 MOVQ AX, (SP) 1500 MOVQ x+8(FP), AX 1501 MOVQ AX, 8(SP) 1502 CALL ·squareGenericE2(SB) 1503 RET 1504 1505 TEXT ·mulAdxE2(SB), $96-24 1506 NO_LOCAL_POINTERS 1507 1508 // var a, b, c fp.Element 1509 // a.Add(&x.A0, &x.A1) 1510 // b.Add(&y.A0, &y.A1) 1511 // a.Mul(&a, &b) 1512 // b.Mul(&x.A0, &y.A0) 1513 // c.Mul(&x.A1, &y.A1) 1514 // z.A1.Sub(&a, &b).Sub(&z.A1, &c) 1515 // z.A0.Sub(&b, &c) 1516 1517 CMPB ·supportAdx(SB), $1 1518 JNE l5 1519 MOVQ x+8(FP), AX 1520 MOVQ 48(AX), R14 1521 MOVQ 56(AX), R15 1522 MOVQ 64(AX), CX 1523 MOVQ 72(AX), BX 1524 MOVQ 80(AX), SI 1525 MOVQ 88(AX), DI 1526 1527 // A -> BP 1528 // t[0] -> R8 1529 // t[1] -> R9 1530 // t[2] -> R10 1531 // t[3] -> R11 1532 // t[4] -> R12 1533 // t[5] -> R13 1534 // clear the flags 1535 XORQ AX, AX 1536 MOVQ y+16(FP), DX 1537 MOVQ 48(DX), DX 1538 1539 // (A,t[0]) := x[0]*y[0] + A 1540 MULXQ R14, R8, R9 1541 1542 // (A,t[1]) := x[1]*y[0] + A 1543 MULXQ R15, AX, R10 1544 ADOXQ AX, R9 1545 1546 // (A,t[2]) := x[2]*y[0] + A 1547 MULXQ CX, AX, R11 1548 ADOXQ AX, R10 1549 1550 // (A,t[3]) := x[3]*y[0] + A 1551 MULXQ BX, AX, R12 1552 ADOXQ AX, R11 1553 1554 // (A,t[4]) := x[4]*y[0] + A 1555 MULXQ SI, AX, R13 1556 ADOXQ AX, R12 1557 1558 // (A,t[5]) := x[5]*y[0] + A 1559 MULXQ DI, AX, BP 1560 ADOXQ AX, R13 1561 1562 // A += carries from ADCXQ and ADOXQ 1563 MOVQ $0, AX 1564 ADOXQ AX, BP 1565 PUSHQ BP 1566 1567 // m := t[0]*q'[0] mod W 1568 MOVQ qInv0<>(SB), DX 1569 IMULQ R8, DX 1570 1571 // clear the flags 1572 XORQ AX, AX 1573 1574 // C,_ := t[0] + m*q[0] 1575 MULXQ q<>+0(SB), AX, BP 1576 ADCXQ R8, AX 1577 MOVQ BP, R8 1578 POPQ BP 1579 1580 // (C,t[0]) := t[1] + m*q[1] + C 1581 ADCXQ R9, R8 1582 MULXQ q<>+8(SB), AX, R9 1583 ADOXQ AX, R8 1584 1585 // (C,t[1]) := t[2] + m*q[2] + C 1586 ADCXQ R10, R9 1587 MULXQ q<>+16(SB), AX, R10 1588 ADOXQ AX, R9 1589 1590 // (C,t[2]) := t[3] + m*q[3] + C 1591 ADCXQ R11, R10 1592 MULXQ q<>+24(SB), AX, R11 1593 ADOXQ AX, R10 1594 1595 // (C,t[3]) := t[4] + m*q[4] + C 1596 ADCXQ R12, R11 1597 MULXQ q<>+32(SB), AX, R12 1598 ADOXQ AX, R11 1599 1600 // (C,t[4]) := t[5] + m*q[5] + C 1601 ADCXQ R13, R12 1602 MULXQ q<>+40(SB), AX, R13 1603 ADOXQ AX, R12 1604 1605 // t[5] = C + A 1606 MOVQ $0, AX 1607 ADCXQ AX, R13 1608 ADOXQ BP, R13 1609 1610 // clear the flags 1611 XORQ AX, AX 1612 MOVQ y+16(FP), DX 1613 MOVQ 56(DX), DX 1614 1615 // (A,t[0]) := t[0] + x[0]*y[1] + A 1616 MULXQ R14, AX, BP 1617 ADOXQ AX, R8 1618 1619 // (A,t[1]) := t[1] + x[1]*y[1] + A 1620 ADCXQ BP, R9 1621 MULXQ R15, AX, BP 1622 ADOXQ AX, R9 1623 1624 // (A,t[2]) := t[2] + x[2]*y[1] + A 1625 ADCXQ BP, R10 1626 MULXQ CX, AX, BP 1627 ADOXQ AX, R10 1628 1629 // (A,t[3]) := t[3] + x[3]*y[1] + A 1630 ADCXQ BP, R11 1631 MULXQ BX, AX, BP 1632 ADOXQ AX, R11 1633 1634 // (A,t[4]) := t[4] + x[4]*y[1] + A 1635 ADCXQ BP, R12 1636 MULXQ SI, AX, BP 1637 ADOXQ AX, R12 1638 1639 // (A,t[5]) := t[5] + x[5]*y[1] + A 1640 ADCXQ BP, R13 1641 MULXQ DI, AX, BP 1642 ADOXQ AX, R13 1643 1644 // A += carries from ADCXQ and ADOXQ 1645 MOVQ $0, AX 1646 ADCXQ AX, BP 1647 ADOXQ AX, BP 1648 PUSHQ BP 1649 1650 // m := t[0]*q'[0] mod W 1651 MOVQ qInv0<>(SB), DX 1652 IMULQ R8, DX 1653 1654 // clear the flags 1655 XORQ AX, AX 1656 1657 // C,_ := t[0] + m*q[0] 1658 MULXQ q<>+0(SB), AX, BP 1659 ADCXQ R8, AX 1660 MOVQ BP, R8 1661 POPQ BP 1662 1663 // (C,t[0]) := t[1] + m*q[1] + C 1664 ADCXQ R9, R8 1665 MULXQ q<>+8(SB), AX, R9 1666 ADOXQ AX, R8 1667 1668 // (C,t[1]) := t[2] + m*q[2] + C 1669 ADCXQ R10, R9 1670 MULXQ q<>+16(SB), AX, R10 1671 ADOXQ AX, R9 1672 1673 // (C,t[2]) := t[3] + m*q[3] + C 1674 ADCXQ R11, R10 1675 MULXQ q<>+24(SB), AX, R11 1676 ADOXQ AX, R10 1677 1678 // (C,t[3]) := t[4] + m*q[4] + C 1679 ADCXQ R12, R11 1680 MULXQ q<>+32(SB), AX, R12 1681 ADOXQ AX, R11 1682 1683 // (C,t[4]) := t[5] + m*q[5] + C 1684 ADCXQ R13, R12 1685 MULXQ q<>+40(SB), AX, R13 1686 ADOXQ AX, R12 1687 1688 // t[5] = C + A 1689 MOVQ $0, AX 1690 ADCXQ AX, R13 1691 ADOXQ BP, R13 1692 1693 // clear the flags 1694 XORQ AX, AX 1695 MOVQ y+16(FP), DX 1696 MOVQ 64(DX), DX 1697 1698 // (A,t[0]) := t[0] + x[0]*y[2] + A 1699 MULXQ R14, AX, BP 1700 ADOXQ AX, R8 1701 1702 // (A,t[1]) := t[1] + x[1]*y[2] + A 1703 ADCXQ BP, R9 1704 MULXQ R15, AX, BP 1705 ADOXQ AX, R9 1706 1707 // (A,t[2]) := t[2] + x[2]*y[2] + A 1708 ADCXQ BP, R10 1709 MULXQ CX, AX, BP 1710 ADOXQ AX, R10 1711 1712 // (A,t[3]) := t[3] + x[3]*y[2] + A 1713 ADCXQ BP, R11 1714 MULXQ BX, AX, BP 1715 ADOXQ AX, R11 1716 1717 // (A,t[4]) := t[4] + x[4]*y[2] + A 1718 ADCXQ BP, R12 1719 MULXQ SI, AX, BP 1720 ADOXQ AX, R12 1721 1722 // (A,t[5]) := t[5] + x[5]*y[2] + A 1723 ADCXQ BP, R13 1724 MULXQ DI, AX, BP 1725 ADOXQ AX, R13 1726 1727 // A += carries from ADCXQ and ADOXQ 1728 MOVQ $0, AX 1729 ADCXQ AX, BP 1730 ADOXQ AX, BP 1731 PUSHQ BP 1732 1733 // m := t[0]*q'[0] mod W 1734 MOVQ qInv0<>(SB), DX 1735 IMULQ R8, DX 1736 1737 // clear the flags 1738 XORQ AX, AX 1739 1740 // C,_ := t[0] + m*q[0] 1741 MULXQ q<>+0(SB), AX, BP 1742 ADCXQ R8, AX 1743 MOVQ BP, R8 1744 POPQ BP 1745 1746 // (C,t[0]) := t[1] + m*q[1] + C 1747 ADCXQ R9, R8 1748 MULXQ q<>+8(SB), AX, R9 1749 ADOXQ AX, R8 1750 1751 // (C,t[1]) := t[2] + m*q[2] + C 1752 ADCXQ R10, R9 1753 MULXQ q<>+16(SB), AX, R10 1754 ADOXQ AX, R9 1755 1756 // (C,t[2]) := t[3] + m*q[3] + C 1757 ADCXQ R11, R10 1758 MULXQ q<>+24(SB), AX, R11 1759 ADOXQ AX, R10 1760 1761 // (C,t[3]) := t[4] + m*q[4] + C 1762 ADCXQ R12, R11 1763 MULXQ q<>+32(SB), AX, R12 1764 ADOXQ AX, R11 1765 1766 // (C,t[4]) := t[5] + m*q[5] + C 1767 ADCXQ R13, R12 1768 MULXQ q<>+40(SB), AX, R13 1769 ADOXQ AX, R12 1770 1771 // t[5] = C + A 1772 MOVQ $0, AX 1773 ADCXQ AX, R13 1774 ADOXQ BP, R13 1775 1776 // clear the flags 1777 XORQ AX, AX 1778 MOVQ y+16(FP), DX 1779 MOVQ 72(DX), DX 1780 1781 // (A,t[0]) := t[0] + x[0]*y[3] + A 1782 MULXQ R14, AX, BP 1783 ADOXQ AX, R8 1784 1785 // (A,t[1]) := t[1] + x[1]*y[3] + A 1786 ADCXQ BP, R9 1787 MULXQ R15, AX, BP 1788 ADOXQ AX, R9 1789 1790 // (A,t[2]) := t[2] + x[2]*y[3] + A 1791 ADCXQ BP, R10 1792 MULXQ CX, AX, BP 1793 ADOXQ AX, R10 1794 1795 // (A,t[3]) := t[3] + x[3]*y[3] + A 1796 ADCXQ BP, R11 1797 MULXQ BX, AX, BP 1798 ADOXQ AX, R11 1799 1800 // (A,t[4]) := t[4] + x[4]*y[3] + A 1801 ADCXQ BP, R12 1802 MULXQ SI, AX, BP 1803 ADOXQ AX, R12 1804 1805 // (A,t[5]) := t[5] + x[5]*y[3] + A 1806 ADCXQ BP, R13 1807 MULXQ DI, AX, BP 1808 ADOXQ AX, R13 1809 1810 // A += carries from ADCXQ and ADOXQ 1811 MOVQ $0, AX 1812 ADCXQ AX, BP 1813 ADOXQ AX, BP 1814 PUSHQ BP 1815 1816 // m := t[0]*q'[0] mod W 1817 MOVQ qInv0<>(SB), DX 1818 IMULQ R8, DX 1819 1820 // clear the flags 1821 XORQ AX, AX 1822 1823 // C,_ := t[0] + m*q[0] 1824 MULXQ q<>+0(SB), AX, BP 1825 ADCXQ R8, AX 1826 MOVQ BP, R8 1827 POPQ BP 1828 1829 // (C,t[0]) := t[1] + m*q[1] + C 1830 ADCXQ R9, R8 1831 MULXQ q<>+8(SB), AX, R9 1832 ADOXQ AX, R8 1833 1834 // (C,t[1]) := t[2] + m*q[2] + C 1835 ADCXQ R10, R9 1836 MULXQ q<>+16(SB), AX, R10 1837 ADOXQ AX, R9 1838 1839 // (C,t[2]) := t[3] + m*q[3] + C 1840 ADCXQ R11, R10 1841 MULXQ q<>+24(SB), AX, R11 1842 ADOXQ AX, R10 1843 1844 // (C,t[3]) := t[4] + m*q[4] + C 1845 ADCXQ R12, R11 1846 MULXQ q<>+32(SB), AX, R12 1847 ADOXQ AX, R11 1848 1849 // (C,t[4]) := t[5] + m*q[5] + C 1850 ADCXQ R13, R12 1851 MULXQ q<>+40(SB), AX, R13 1852 ADOXQ AX, R12 1853 1854 // t[5] = C + A 1855 MOVQ $0, AX 1856 ADCXQ AX, R13 1857 ADOXQ BP, R13 1858 1859 // clear the flags 1860 XORQ AX, AX 1861 MOVQ y+16(FP), DX 1862 MOVQ 80(DX), DX 1863 1864 // (A,t[0]) := t[0] + x[0]*y[4] + A 1865 MULXQ R14, AX, BP 1866 ADOXQ AX, R8 1867 1868 // (A,t[1]) := t[1] + x[1]*y[4] + A 1869 ADCXQ BP, R9 1870 MULXQ R15, AX, BP 1871 ADOXQ AX, R9 1872 1873 // (A,t[2]) := t[2] + x[2]*y[4] + A 1874 ADCXQ BP, R10 1875 MULXQ CX, AX, BP 1876 ADOXQ AX, R10 1877 1878 // (A,t[3]) := t[3] + x[3]*y[4] + A 1879 ADCXQ BP, R11 1880 MULXQ BX, AX, BP 1881 ADOXQ AX, R11 1882 1883 // (A,t[4]) := t[4] + x[4]*y[4] + A 1884 ADCXQ BP, R12 1885 MULXQ SI, AX, BP 1886 ADOXQ AX, R12 1887 1888 // (A,t[5]) := t[5] + x[5]*y[4] + A 1889 ADCXQ BP, R13 1890 MULXQ DI, AX, BP 1891 ADOXQ AX, R13 1892 1893 // A += carries from ADCXQ and ADOXQ 1894 MOVQ $0, AX 1895 ADCXQ AX, BP 1896 ADOXQ AX, BP 1897 PUSHQ BP 1898 1899 // m := t[0]*q'[0] mod W 1900 MOVQ qInv0<>(SB), DX 1901 IMULQ R8, DX 1902 1903 // clear the flags 1904 XORQ AX, AX 1905 1906 // C,_ := t[0] + m*q[0] 1907 MULXQ q<>+0(SB), AX, BP 1908 ADCXQ R8, AX 1909 MOVQ BP, R8 1910 POPQ BP 1911 1912 // (C,t[0]) := t[1] + m*q[1] + C 1913 ADCXQ R9, R8 1914 MULXQ q<>+8(SB), AX, R9 1915 ADOXQ AX, R8 1916 1917 // (C,t[1]) := t[2] + m*q[2] + C 1918 ADCXQ R10, R9 1919 MULXQ q<>+16(SB), AX, R10 1920 ADOXQ AX, R9 1921 1922 // (C,t[2]) := t[3] + m*q[3] + C 1923 ADCXQ R11, R10 1924 MULXQ q<>+24(SB), AX, R11 1925 ADOXQ AX, R10 1926 1927 // (C,t[3]) := t[4] + m*q[4] + C 1928 ADCXQ R12, R11 1929 MULXQ q<>+32(SB), AX, R12 1930 ADOXQ AX, R11 1931 1932 // (C,t[4]) := t[5] + m*q[5] + C 1933 ADCXQ R13, R12 1934 MULXQ q<>+40(SB), AX, R13 1935 ADOXQ AX, R12 1936 1937 // t[5] = C + A 1938 MOVQ $0, AX 1939 ADCXQ AX, R13 1940 ADOXQ BP, R13 1941 1942 // clear the flags 1943 XORQ AX, AX 1944 MOVQ y+16(FP), DX 1945 MOVQ 88(DX), DX 1946 1947 // (A,t[0]) := t[0] + x[0]*y[5] + A 1948 MULXQ R14, AX, BP 1949 ADOXQ AX, R8 1950 1951 // (A,t[1]) := t[1] + x[1]*y[5] + A 1952 ADCXQ BP, R9 1953 MULXQ R15, AX, BP 1954 ADOXQ AX, R9 1955 1956 // (A,t[2]) := t[2] + x[2]*y[5] + A 1957 ADCXQ BP, R10 1958 MULXQ CX, AX, BP 1959 ADOXQ AX, R10 1960 1961 // (A,t[3]) := t[3] + x[3]*y[5] + A 1962 ADCXQ BP, R11 1963 MULXQ BX, AX, BP 1964 ADOXQ AX, R11 1965 1966 // (A,t[4]) := t[4] + x[4]*y[5] + A 1967 ADCXQ BP, R12 1968 MULXQ SI, AX, BP 1969 ADOXQ AX, R12 1970 1971 // (A,t[5]) := t[5] + x[5]*y[5] + A 1972 ADCXQ BP, R13 1973 MULXQ DI, AX, BP 1974 ADOXQ AX, R13 1975 1976 // A += carries from ADCXQ and ADOXQ 1977 MOVQ $0, AX 1978 ADCXQ AX, BP 1979 ADOXQ AX, BP 1980 PUSHQ BP 1981 1982 // m := t[0]*q'[0] mod W 1983 MOVQ qInv0<>(SB), DX 1984 IMULQ R8, DX 1985 1986 // clear the flags 1987 XORQ AX, AX 1988 1989 // C,_ := t[0] + m*q[0] 1990 MULXQ q<>+0(SB), AX, BP 1991 ADCXQ R8, AX 1992 MOVQ BP, R8 1993 POPQ BP 1994 1995 // (C,t[0]) := t[1] + m*q[1] + C 1996 ADCXQ R9, R8 1997 MULXQ q<>+8(SB), AX, R9 1998 ADOXQ AX, R8 1999 2000 // (C,t[1]) := t[2] + m*q[2] + C 2001 ADCXQ R10, R9 2002 MULXQ q<>+16(SB), AX, R10 2003 ADOXQ AX, R9 2004 2005 // (C,t[2]) := t[3] + m*q[3] + C 2006 ADCXQ R11, R10 2007 MULXQ q<>+24(SB), AX, R11 2008 ADOXQ AX, R10 2009 2010 // (C,t[3]) := t[4] + m*q[4] + C 2011 ADCXQ R12, R11 2012 MULXQ q<>+32(SB), AX, R12 2013 ADOXQ AX, R11 2014 2015 // (C,t[4]) := t[5] + m*q[5] + C 2016 ADCXQ R13, R12 2017 MULXQ q<>+40(SB), AX, R13 2018 ADOXQ AX, R12 2019 2020 // t[5] = C + A 2021 MOVQ $0, AX 2022 ADCXQ AX, R13 2023 ADOXQ BP, R13 2024 2025 // reduce element(R8,R9,R10,R11,R12,R13) using temp registers (R14,R15,CX,BX,SI,DI) 2026 REDUCE(R8,R9,R10,R11,R12,R13,R14,R15,CX,BX,SI,DI) 2027 2028 MOVQ R8, s6-56(SP) 2029 MOVQ R9, s7-64(SP) 2030 MOVQ R10, s8-72(SP) 2031 MOVQ R11, s9-80(SP) 2032 MOVQ R12, s10-88(SP) 2033 MOVQ R13, s11-96(SP) 2034 MOVQ x+8(FP), AX 2035 MOVQ y+16(FP), DX 2036 MOVQ 48(AX), R14 2037 MOVQ 56(AX), R15 2038 MOVQ 64(AX), CX 2039 MOVQ 72(AX), BX 2040 MOVQ 80(AX), SI 2041 MOVQ 88(AX), DI 2042 ADDQ 0(AX), R14 2043 ADCQ 8(AX), R15 2044 ADCQ 16(AX), CX 2045 ADCQ 24(AX), BX 2046 ADCQ 32(AX), SI 2047 ADCQ 40(AX), DI 2048 MOVQ R14, s0-8(SP) 2049 MOVQ R15, s1-16(SP) 2050 MOVQ CX, s2-24(SP) 2051 MOVQ BX, s3-32(SP) 2052 MOVQ SI, s4-40(SP) 2053 MOVQ DI, s5-48(SP) 2054 MOVQ 0(DX), R14 2055 MOVQ 8(DX), R15 2056 MOVQ 16(DX), CX 2057 MOVQ 24(DX), BX 2058 MOVQ 32(DX), SI 2059 MOVQ 40(DX), DI 2060 ADDQ 48(DX), R14 2061 ADCQ 56(DX), R15 2062 ADCQ 64(DX), CX 2063 ADCQ 72(DX), BX 2064 ADCQ 80(DX), SI 2065 ADCQ 88(DX), DI 2066 2067 // A -> BP 2068 // t[0] -> R8 2069 // t[1] -> R9 2070 // t[2] -> R10 2071 // t[3] -> R11 2072 // t[4] -> R12 2073 // t[5] -> R13 2074 // clear the flags 2075 XORQ AX, AX 2076 MOVQ s0-8(SP), DX 2077 2078 // (A,t[0]) := x[0]*y[0] + A 2079 MULXQ R14, R8, R9 2080 2081 // (A,t[1]) := x[1]*y[0] + A 2082 MULXQ R15, AX, R10 2083 ADOXQ AX, R9 2084 2085 // (A,t[2]) := x[2]*y[0] + A 2086 MULXQ CX, AX, R11 2087 ADOXQ AX, R10 2088 2089 // (A,t[3]) := x[3]*y[0] + A 2090 MULXQ BX, AX, R12 2091 ADOXQ AX, R11 2092 2093 // (A,t[4]) := x[4]*y[0] + A 2094 MULXQ SI, AX, R13 2095 ADOXQ AX, R12 2096 2097 // (A,t[5]) := x[5]*y[0] + A 2098 MULXQ DI, AX, BP 2099 ADOXQ AX, R13 2100 2101 // A += carries from ADCXQ and ADOXQ 2102 MOVQ $0, AX 2103 ADOXQ AX, BP 2104 PUSHQ BP 2105 2106 // m := t[0]*q'[0] mod W 2107 MOVQ qInv0<>(SB), DX 2108 IMULQ R8, DX 2109 2110 // clear the flags 2111 XORQ AX, AX 2112 2113 // C,_ := t[0] + m*q[0] 2114 MULXQ q<>+0(SB), AX, BP 2115 ADCXQ R8, AX 2116 MOVQ BP, R8 2117 POPQ BP 2118 2119 // (C,t[0]) := t[1] + m*q[1] + C 2120 ADCXQ R9, R8 2121 MULXQ q<>+8(SB), AX, R9 2122 ADOXQ AX, R8 2123 2124 // (C,t[1]) := t[2] + m*q[2] + C 2125 ADCXQ R10, R9 2126 MULXQ q<>+16(SB), AX, R10 2127 ADOXQ AX, R9 2128 2129 // (C,t[2]) := t[3] + m*q[3] + C 2130 ADCXQ R11, R10 2131 MULXQ q<>+24(SB), AX, R11 2132 ADOXQ AX, R10 2133 2134 // (C,t[3]) := t[4] + m*q[4] + C 2135 ADCXQ R12, R11 2136 MULXQ q<>+32(SB), AX, R12 2137 ADOXQ AX, R11 2138 2139 // (C,t[4]) := t[5] + m*q[5] + C 2140 ADCXQ R13, R12 2141 MULXQ q<>+40(SB), AX, R13 2142 ADOXQ AX, R12 2143 2144 // t[5] = C + A 2145 MOVQ $0, AX 2146 ADCXQ AX, R13 2147 ADOXQ BP, R13 2148 2149 // clear the flags 2150 XORQ AX, AX 2151 MOVQ s1-16(SP), DX 2152 2153 // (A,t[0]) := t[0] + x[0]*y[1] + A 2154 MULXQ R14, AX, BP 2155 ADOXQ AX, R8 2156 2157 // (A,t[1]) := t[1] + x[1]*y[1] + A 2158 ADCXQ BP, R9 2159 MULXQ R15, AX, BP 2160 ADOXQ AX, R9 2161 2162 // (A,t[2]) := t[2] + x[2]*y[1] + A 2163 ADCXQ BP, R10 2164 MULXQ CX, AX, BP 2165 ADOXQ AX, R10 2166 2167 // (A,t[3]) := t[3] + x[3]*y[1] + A 2168 ADCXQ BP, R11 2169 MULXQ BX, AX, BP 2170 ADOXQ AX, R11 2171 2172 // (A,t[4]) := t[4] + x[4]*y[1] + A 2173 ADCXQ BP, R12 2174 MULXQ SI, AX, BP 2175 ADOXQ AX, R12 2176 2177 // (A,t[5]) := t[5] + x[5]*y[1] + A 2178 ADCXQ BP, R13 2179 MULXQ DI, AX, BP 2180 ADOXQ AX, R13 2181 2182 // A += carries from ADCXQ and ADOXQ 2183 MOVQ $0, AX 2184 ADCXQ AX, BP 2185 ADOXQ AX, BP 2186 PUSHQ BP 2187 2188 // m := t[0]*q'[0] mod W 2189 MOVQ qInv0<>(SB), DX 2190 IMULQ R8, DX 2191 2192 // clear the flags 2193 XORQ AX, AX 2194 2195 // C,_ := t[0] + m*q[0] 2196 MULXQ q<>+0(SB), AX, BP 2197 ADCXQ R8, AX 2198 MOVQ BP, R8 2199 POPQ BP 2200 2201 // (C,t[0]) := t[1] + m*q[1] + C 2202 ADCXQ R9, R8 2203 MULXQ q<>+8(SB), AX, R9 2204 ADOXQ AX, R8 2205 2206 // (C,t[1]) := t[2] + m*q[2] + C 2207 ADCXQ R10, R9 2208 MULXQ q<>+16(SB), AX, R10 2209 ADOXQ AX, R9 2210 2211 // (C,t[2]) := t[3] + m*q[3] + C 2212 ADCXQ R11, R10 2213 MULXQ q<>+24(SB), AX, R11 2214 ADOXQ AX, R10 2215 2216 // (C,t[3]) := t[4] + m*q[4] + C 2217 ADCXQ R12, R11 2218 MULXQ q<>+32(SB), AX, R12 2219 ADOXQ AX, R11 2220 2221 // (C,t[4]) := t[5] + m*q[5] + C 2222 ADCXQ R13, R12 2223 MULXQ q<>+40(SB), AX, R13 2224 ADOXQ AX, R12 2225 2226 // t[5] = C + A 2227 MOVQ $0, AX 2228 ADCXQ AX, R13 2229 ADOXQ BP, R13 2230 2231 // clear the flags 2232 XORQ AX, AX 2233 MOVQ s2-24(SP), DX 2234 2235 // (A,t[0]) := t[0] + x[0]*y[2] + A 2236 MULXQ R14, AX, BP 2237 ADOXQ AX, R8 2238 2239 // (A,t[1]) := t[1] + x[1]*y[2] + A 2240 ADCXQ BP, R9 2241 MULXQ R15, AX, BP 2242 ADOXQ AX, R9 2243 2244 // (A,t[2]) := t[2] + x[2]*y[2] + A 2245 ADCXQ BP, R10 2246 MULXQ CX, AX, BP 2247 ADOXQ AX, R10 2248 2249 // (A,t[3]) := t[3] + x[3]*y[2] + A 2250 ADCXQ BP, R11 2251 MULXQ BX, AX, BP 2252 ADOXQ AX, R11 2253 2254 // (A,t[4]) := t[4] + x[4]*y[2] + A 2255 ADCXQ BP, R12 2256 MULXQ SI, AX, BP 2257 ADOXQ AX, R12 2258 2259 // (A,t[5]) := t[5] + x[5]*y[2] + A 2260 ADCXQ BP, R13 2261 MULXQ DI, AX, BP 2262 ADOXQ AX, R13 2263 2264 // A += carries from ADCXQ and ADOXQ 2265 MOVQ $0, AX 2266 ADCXQ AX, BP 2267 ADOXQ AX, BP 2268 PUSHQ BP 2269 2270 // m := t[0]*q'[0] mod W 2271 MOVQ qInv0<>(SB), DX 2272 IMULQ R8, DX 2273 2274 // clear the flags 2275 XORQ AX, AX 2276 2277 // C,_ := t[0] + m*q[0] 2278 MULXQ q<>+0(SB), AX, BP 2279 ADCXQ R8, AX 2280 MOVQ BP, R8 2281 POPQ BP 2282 2283 // (C,t[0]) := t[1] + m*q[1] + C 2284 ADCXQ R9, R8 2285 MULXQ q<>+8(SB), AX, R9 2286 ADOXQ AX, R8 2287 2288 // (C,t[1]) := t[2] + m*q[2] + C 2289 ADCXQ R10, R9 2290 MULXQ q<>+16(SB), AX, R10 2291 ADOXQ AX, R9 2292 2293 // (C,t[2]) := t[3] + m*q[3] + C 2294 ADCXQ R11, R10 2295 MULXQ q<>+24(SB), AX, R11 2296 ADOXQ AX, R10 2297 2298 // (C,t[3]) := t[4] + m*q[4] + C 2299 ADCXQ R12, R11 2300 MULXQ q<>+32(SB), AX, R12 2301 ADOXQ AX, R11 2302 2303 // (C,t[4]) := t[5] + m*q[5] + C 2304 ADCXQ R13, R12 2305 MULXQ q<>+40(SB), AX, R13 2306 ADOXQ AX, R12 2307 2308 // t[5] = C + A 2309 MOVQ $0, AX 2310 ADCXQ AX, R13 2311 ADOXQ BP, R13 2312 2313 // clear the flags 2314 XORQ AX, AX 2315 MOVQ s3-32(SP), DX 2316 2317 // (A,t[0]) := t[0] + x[0]*y[3] + A 2318 MULXQ R14, AX, BP 2319 ADOXQ AX, R8 2320 2321 // (A,t[1]) := t[1] + x[1]*y[3] + A 2322 ADCXQ BP, R9 2323 MULXQ R15, AX, BP 2324 ADOXQ AX, R9 2325 2326 // (A,t[2]) := t[2] + x[2]*y[3] + A 2327 ADCXQ BP, R10 2328 MULXQ CX, AX, BP 2329 ADOXQ AX, R10 2330 2331 // (A,t[3]) := t[3] + x[3]*y[3] + A 2332 ADCXQ BP, R11 2333 MULXQ BX, AX, BP 2334 ADOXQ AX, R11 2335 2336 // (A,t[4]) := t[4] + x[4]*y[3] + A 2337 ADCXQ BP, R12 2338 MULXQ SI, AX, BP 2339 ADOXQ AX, R12 2340 2341 // (A,t[5]) := t[5] + x[5]*y[3] + A 2342 ADCXQ BP, R13 2343 MULXQ DI, AX, BP 2344 ADOXQ AX, R13 2345 2346 // A += carries from ADCXQ and ADOXQ 2347 MOVQ $0, AX 2348 ADCXQ AX, BP 2349 ADOXQ AX, BP 2350 PUSHQ BP 2351 2352 // m := t[0]*q'[0] mod W 2353 MOVQ qInv0<>(SB), DX 2354 IMULQ R8, DX 2355 2356 // clear the flags 2357 XORQ AX, AX 2358 2359 // C,_ := t[0] + m*q[0] 2360 MULXQ q<>+0(SB), AX, BP 2361 ADCXQ R8, AX 2362 MOVQ BP, R8 2363 POPQ BP 2364 2365 // (C,t[0]) := t[1] + m*q[1] + C 2366 ADCXQ R9, R8 2367 MULXQ q<>+8(SB), AX, R9 2368 ADOXQ AX, R8 2369 2370 // (C,t[1]) := t[2] + m*q[2] + C 2371 ADCXQ R10, R9 2372 MULXQ q<>+16(SB), AX, R10 2373 ADOXQ AX, R9 2374 2375 // (C,t[2]) := t[3] + m*q[3] + C 2376 ADCXQ R11, R10 2377 MULXQ q<>+24(SB), AX, R11 2378 ADOXQ AX, R10 2379 2380 // (C,t[3]) := t[4] + m*q[4] + C 2381 ADCXQ R12, R11 2382 MULXQ q<>+32(SB), AX, R12 2383 ADOXQ AX, R11 2384 2385 // (C,t[4]) := t[5] + m*q[5] + C 2386 ADCXQ R13, R12 2387 MULXQ q<>+40(SB), AX, R13 2388 ADOXQ AX, R12 2389 2390 // t[5] = C + A 2391 MOVQ $0, AX 2392 ADCXQ AX, R13 2393 ADOXQ BP, R13 2394 2395 // clear the flags 2396 XORQ AX, AX 2397 MOVQ s4-40(SP), DX 2398 2399 // (A,t[0]) := t[0] + x[0]*y[4] + A 2400 MULXQ R14, AX, BP 2401 ADOXQ AX, R8 2402 2403 // (A,t[1]) := t[1] + x[1]*y[4] + A 2404 ADCXQ BP, R9 2405 MULXQ R15, AX, BP 2406 ADOXQ AX, R9 2407 2408 // (A,t[2]) := t[2] + x[2]*y[4] + A 2409 ADCXQ BP, R10 2410 MULXQ CX, AX, BP 2411 ADOXQ AX, R10 2412 2413 // (A,t[3]) := t[3] + x[3]*y[4] + A 2414 ADCXQ BP, R11 2415 MULXQ BX, AX, BP 2416 ADOXQ AX, R11 2417 2418 // (A,t[4]) := t[4] + x[4]*y[4] + A 2419 ADCXQ BP, R12 2420 MULXQ SI, AX, BP 2421 ADOXQ AX, R12 2422 2423 // (A,t[5]) := t[5] + x[5]*y[4] + A 2424 ADCXQ BP, R13 2425 MULXQ DI, AX, BP 2426 ADOXQ AX, R13 2427 2428 // A += carries from ADCXQ and ADOXQ 2429 MOVQ $0, AX 2430 ADCXQ AX, BP 2431 ADOXQ AX, BP 2432 PUSHQ BP 2433 2434 // m := t[0]*q'[0] mod W 2435 MOVQ qInv0<>(SB), DX 2436 IMULQ R8, DX 2437 2438 // clear the flags 2439 XORQ AX, AX 2440 2441 // C,_ := t[0] + m*q[0] 2442 MULXQ q<>+0(SB), AX, BP 2443 ADCXQ R8, AX 2444 MOVQ BP, R8 2445 POPQ BP 2446 2447 // (C,t[0]) := t[1] + m*q[1] + C 2448 ADCXQ R9, R8 2449 MULXQ q<>+8(SB), AX, R9 2450 ADOXQ AX, R8 2451 2452 // (C,t[1]) := t[2] + m*q[2] + C 2453 ADCXQ R10, R9 2454 MULXQ q<>+16(SB), AX, R10 2455 ADOXQ AX, R9 2456 2457 // (C,t[2]) := t[3] + m*q[3] + C 2458 ADCXQ R11, R10 2459 MULXQ q<>+24(SB), AX, R11 2460 ADOXQ AX, R10 2461 2462 // (C,t[3]) := t[4] + m*q[4] + C 2463 ADCXQ R12, R11 2464 MULXQ q<>+32(SB), AX, R12 2465 ADOXQ AX, R11 2466 2467 // (C,t[4]) := t[5] + m*q[5] + C 2468 ADCXQ R13, R12 2469 MULXQ q<>+40(SB), AX, R13 2470 ADOXQ AX, R12 2471 2472 // t[5] = C + A 2473 MOVQ $0, AX 2474 ADCXQ AX, R13 2475 ADOXQ BP, R13 2476 2477 // clear the flags 2478 XORQ AX, AX 2479 MOVQ s5-48(SP), DX 2480 2481 // (A,t[0]) := t[0] + x[0]*y[5] + A 2482 MULXQ R14, AX, BP 2483 ADOXQ AX, R8 2484 2485 // (A,t[1]) := t[1] + x[1]*y[5] + A 2486 ADCXQ BP, R9 2487 MULXQ R15, AX, BP 2488 ADOXQ AX, R9 2489 2490 // (A,t[2]) := t[2] + x[2]*y[5] + A 2491 ADCXQ BP, R10 2492 MULXQ CX, AX, BP 2493 ADOXQ AX, R10 2494 2495 // (A,t[3]) := t[3] + x[3]*y[5] + A 2496 ADCXQ BP, R11 2497 MULXQ BX, AX, BP 2498 ADOXQ AX, R11 2499 2500 // (A,t[4]) := t[4] + x[4]*y[5] + A 2501 ADCXQ BP, R12 2502 MULXQ SI, AX, BP 2503 ADOXQ AX, R12 2504 2505 // (A,t[5]) := t[5] + x[5]*y[5] + A 2506 ADCXQ BP, R13 2507 MULXQ DI, AX, BP 2508 ADOXQ AX, R13 2509 2510 // A += carries from ADCXQ and ADOXQ 2511 MOVQ $0, AX 2512 ADCXQ AX, BP 2513 ADOXQ AX, BP 2514 PUSHQ BP 2515 2516 // m := t[0]*q'[0] mod W 2517 MOVQ qInv0<>(SB), DX 2518 IMULQ R8, DX 2519 2520 // clear the flags 2521 XORQ AX, AX 2522 2523 // C,_ := t[0] + m*q[0] 2524 MULXQ q<>+0(SB), AX, BP 2525 ADCXQ R8, AX 2526 MOVQ BP, R8 2527 POPQ BP 2528 2529 // (C,t[0]) := t[1] + m*q[1] + C 2530 ADCXQ R9, R8 2531 MULXQ q<>+8(SB), AX, R9 2532 ADOXQ AX, R8 2533 2534 // (C,t[1]) := t[2] + m*q[2] + C 2535 ADCXQ R10, R9 2536 MULXQ q<>+16(SB), AX, R10 2537 ADOXQ AX, R9 2538 2539 // (C,t[2]) := t[3] + m*q[3] + C 2540 ADCXQ R11, R10 2541 MULXQ q<>+24(SB), AX, R11 2542 ADOXQ AX, R10 2543 2544 // (C,t[3]) := t[4] + m*q[4] + C 2545 ADCXQ R12, R11 2546 MULXQ q<>+32(SB), AX, R12 2547 ADOXQ AX, R11 2548 2549 // (C,t[4]) := t[5] + m*q[5] + C 2550 ADCXQ R13, R12 2551 MULXQ q<>+40(SB), AX, R13 2552 ADOXQ AX, R12 2553 2554 // t[5] = C + A 2555 MOVQ $0, AX 2556 ADCXQ AX, R13 2557 ADOXQ BP, R13 2558 2559 // reduce element(R8,R9,R10,R11,R12,R13) using temp registers (R14,R15,CX,BX,SI,DI) 2560 REDUCE(R8,R9,R10,R11,R12,R13,R14,R15,CX,BX,SI,DI) 2561 2562 MOVQ R8, s0-8(SP) 2563 MOVQ R9, s1-16(SP) 2564 MOVQ R10, s2-24(SP) 2565 MOVQ R11, s3-32(SP) 2566 MOVQ R12, s4-40(SP) 2567 MOVQ R13, s5-48(SP) 2568 MOVQ x+8(FP), AX 2569 MOVQ 0(AX), R14 2570 MOVQ 8(AX), R15 2571 MOVQ 16(AX), CX 2572 MOVQ 24(AX), BX 2573 MOVQ 32(AX), SI 2574 MOVQ 40(AX), DI 2575 2576 // A -> BP 2577 // t[0] -> R8 2578 // t[1] -> R9 2579 // t[2] -> R10 2580 // t[3] -> R11 2581 // t[4] -> R12 2582 // t[5] -> R13 2583 // clear the flags 2584 XORQ AX, AX 2585 MOVQ y+16(FP), DX 2586 MOVQ 0(DX), DX 2587 2588 // (A,t[0]) := x[0]*y[0] + A 2589 MULXQ R14, R8, R9 2590 2591 // (A,t[1]) := x[1]*y[0] + A 2592 MULXQ R15, AX, R10 2593 ADOXQ AX, R9 2594 2595 // (A,t[2]) := x[2]*y[0] + A 2596 MULXQ CX, AX, R11 2597 ADOXQ AX, R10 2598 2599 // (A,t[3]) := x[3]*y[0] + A 2600 MULXQ BX, AX, R12 2601 ADOXQ AX, R11 2602 2603 // (A,t[4]) := x[4]*y[0] + A 2604 MULXQ SI, AX, R13 2605 ADOXQ AX, R12 2606 2607 // (A,t[5]) := x[5]*y[0] + A 2608 MULXQ DI, AX, BP 2609 ADOXQ AX, R13 2610 2611 // A += carries from ADCXQ and ADOXQ 2612 MOVQ $0, AX 2613 ADOXQ AX, BP 2614 PUSHQ BP 2615 2616 // m := t[0]*q'[0] mod W 2617 MOVQ qInv0<>(SB), DX 2618 IMULQ R8, DX 2619 2620 // clear the flags 2621 XORQ AX, AX 2622 2623 // C,_ := t[0] + m*q[0] 2624 MULXQ q<>+0(SB), AX, BP 2625 ADCXQ R8, AX 2626 MOVQ BP, R8 2627 POPQ BP 2628 2629 // (C,t[0]) := t[1] + m*q[1] + C 2630 ADCXQ R9, R8 2631 MULXQ q<>+8(SB), AX, R9 2632 ADOXQ AX, R8 2633 2634 // (C,t[1]) := t[2] + m*q[2] + C 2635 ADCXQ R10, R9 2636 MULXQ q<>+16(SB), AX, R10 2637 ADOXQ AX, R9 2638 2639 // (C,t[2]) := t[3] + m*q[3] + C 2640 ADCXQ R11, R10 2641 MULXQ q<>+24(SB), AX, R11 2642 ADOXQ AX, R10 2643 2644 // (C,t[3]) := t[4] + m*q[4] + C 2645 ADCXQ R12, R11 2646 MULXQ q<>+32(SB), AX, R12 2647 ADOXQ AX, R11 2648 2649 // (C,t[4]) := t[5] + m*q[5] + C 2650 ADCXQ R13, R12 2651 MULXQ q<>+40(SB), AX, R13 2652 ADOXQ AX, R12 2653 2654 // t[5] = C + A 2655 MOVQ $0, AX 2656 ADCXQ AX, R13 2657 ADOXQ BP, R13 2658 2659 // clear the flags 2660 XORQ AX, AX 2661 MOVQ y+16(FP), DX 2662 MOVQ 8(DX), DX 2663 2664 // (A,t[0]) := t[0] + x[0]*y[1] + A 2665 MULXQ R14, AX, BP 2666 ADOXQ AX, R8 2667 2668 // (A,t[1]) := t[1] + x[1]*y[1] + A 2669 ADCXQ BP, R9 2670 MULXQ R15, AX, BP 2671 ADOXQ AX, R9 2672 2673 // (A,t[2]) := t[2] + x[2]*y[1] + A 2674 ADCXQ BP, R10 2675 MULXQ CX, AX, BP 2676 ADOXQ AX, R10 2677 2678 // (A,t[3]) := t[3] + x[3]*y[1] + A 2679 ADCXQ BP, R11 2680 MULXQ BX, AX, BP 2681 ADOXQ AX, R11 2682 2683 // (A,t[4]) := t[4] + x[4]*y[1] + A 2684 ADCXQ BP, R12 2685 MULXQ SI, AX, BP 2686 ADOXQ AX, R12 2687 2688 // (A,t[5]) := t[5] + x[5]*y[1] + A 2689 ADCXQ BP, R13 2690 MULXQ DI, AX, BP 2691 ADOXQ AX, R13 2692 2693 // A += carries from ADCXQ and ADOXQ 2694 MOVQ $0, AX 2695 ADCXQ AX, BP 2696 ADOXQ AX, BP 2697 PUSHQ BP 2698 2699 // m := t[0]*q'[0] mod W 2700 MOVQ qInv0<>(SB), DX 2701 IMULQ R8, DX 2702 2703 // clear the flags 2704 XORQ AX, AX 2705 2706 // C,_ := t[0] + m*q[0] 2707 MULXQ q<>+0(SB), AX, BP 2708 ADCXQ R8, AX 2709 MOVQ BP, R8 2710 POPQ BP 2711 2712 // (C,t[0]) := t[1] + m*q[1] + C 2713 ADCXQ R9, R8 2714 MULXQ q<>+8(SB), AX, R9 2715 ADOXQ AX, R8 2716 2717 // (C,t[1]) := t[2] + m*q[2] + C 2718 ADCXQ R10, R9 2719 MULXQ q<>+16(SB), AX, R10 2720 ADOXQ AX, R9 2721 2722 // (C,t[2]) := t[3] + m*q[3] + C 2723 ADCXQ R11, R10 2724 MULXQ q<>+24(SB), AX, R11 2725 ADOXQ AX, R10 2726 2727 // (C,t[3]) := t[4] + m*q[4] + C 2728 ADCXQ R12, R11 2729 MULXQ q<>+32(SB), AX, R12 2730 ADOXQ AX, R11 2731 2732 // (C,t[4]) := t[5] + m*q[5] + C 2733 ADCXQ R13, R12 2734 MULXQ q<>+40(SB), AX, R13 2735 ADOXQ AX, R12 2736 2737 // t[5] = C + A 2738 MOVQ $0, AX 2739 ADCXQ AX, R13 2740 ADOXQ BP, R13 2741 2742 // clear the flags 2743 XORQ AX, AX 2744 MOVQ y+16(FP), DX 2745 MOVQ 16(DX), DX 2746 2747 // (A,t[0]) := t[0] + x[0]*y[2] + A 2748 MULXQ R14, AX, BP 2749 ADOXQ AX, R8 2750 2751 // (A,t[1]) := t[1] + x[1]*y[2] + A 2752 ADCXQ BP, R9 2753 MULXQ R15, AX, BP 2754 ADOXQ AX, R9 2755 2756 // (A,t[2]) := t[2] + x[2]*y[2] + A 2757 ADCXQ BP, R10 2758 MULXQ CX, AX, BP 2759 ADOXQ AX, R10 2760 2761 // (A,t[3]) := t[3] + x[3]*y[2] + A 2762 ADCXQ BP, R11 2763 MULXQ BX, AX, BP 2764 ADOXQ AX, R11 2765 2766 // (A,t[4]) := t[4] + x[4]*y[2] + A 2767 ADCXQ BP, R12 2768 MULXQ SI, AX, BP 2769 ADOXQ AX, R12 2770 2771 // (A,t[5]) := t[5] + x[5]*y[2] + A 2772 ADCXQ BP, R13 2773 MULXQ DI, AX, BP 2774 ADOXQ AX, R13 2775 2776 // A += carries from ADCXQ and ADOXQ 2777 MOVQ $0, AX 2778 ADCXQ AX, BP 2779 ADOXQ AX, BP 2780 PUSHQ BP 2781 2782 // m := t[0]*q'[0] mod W 2783 MOVQ qInv0<>(SB), DX 2784 IMULQ R8, DX 2785 2786 // clear the flags 2787 XORQ AX, AX 2788 2789 // C,_ := t[0] + m*q[0] 2790 MULXQ q<>+0(SB), AX, BP 2791 ADCXQ R8, AX 2792 MOVQ BP, R8 2793 POPQ BP 2794 2795 // (C,t[0]) := t[1] + m*q[1] + C 2796 ADCXQ R9, R8 2797 MULXQ q<>+8(SB), AX, R9 2798 ADOXQ AX, R8 2799 2800 // (C,t[1]) := t[2] + m*q[2] + C 2801 ADCXQ R10, R9 2802 MULXQ q<>+16(SB), AX, R10 2803 ADOXQ AX, R9 2804 2805 // (C,t[2]) := t[3] + m*q[3] + C 2806 ADCXQ R11, R10 2807 MULXQ q<>+24(SB), AX, R11 2808 ADOXQ AX, R10 2809 2810 // (C,t[3]) := t[4] + m*q[4] + C 2811 ADCXQ R12, R11 2812 MULXQ q<>+32(SB), AX, R12 2813 ADOXQ AX, R11 2814 2815 // (C,t[4]) := t[5] + m*q[5] + C 2816 ADCXQ R13, R12 2817 MULXQ q<>+40(SB), AX, R13 2818 ADOXQ AX, R12 2819 2820 // t[5] = C + A 2821 MOVQ $0, AX 2822 ADCXQ AX, R13 2823 ADOXQ BP, R13 2824 2825 // clear the flags 2826 XORQ AX, AX 2827 MOVQ y+16(FP), DX 2828 MOVQ 24(DX), DX 2829 2830 // (A,t[0]) := t[0] + x[0]*y[3] + A 2831 MULXQ R14, AX, BP 2832 ADOXQ AX, R8 2833 2834 // (A,t[1]) := t[1] + x[1]*y[3] + A 2835 ADCXQ BP, R9 2836 MULXQ R15, AX, BP 2837 ADOXQ AX, R9 2838 2839 // (A,t[2]) := t[2] + x[2]*y[3] + A 2840 ADCXQ BP, R10 2841 MULXQ CX, AX, BP 2842 ADOXQ AX, R10 2843 2844 // (A,t[3]) := t[3] + x[3]*y[3] + A 2845 ADCXQ BP, R11 2846 MULXQ BX, AX, BP 2847 ADOXQ AX, R11 2848 2849 // (A,t[4]) := t[4] + x[4]*y[3] + A 2850 ADCXQ BP, R12 2851 MULXQ SI, AX, BP 2852 ADOXQ AX, R12 2853 2854 // (A,t[5]) := t[5] + x[5]*y[3] + A 2855 ADCXQ BP, R13 2856 MULXQ DI, AX, BP 2857 ADOXQ AX, R13 2858 2859 // A += carries from ADCXQ and ADOXQ 2860 MOVQ $0, AX 2861 ADCXQ AX, BP 2862 ADOXQ AX, BP 2863 PUSHQ BP 2864 2865 // m := t[0]*q'[0] mod W 2866 MOVQ qInv0<>(SB), DX 2867 IMULQ R8, DX 2868 2869 // clear the flags 2870 XORQ AX, AX 2871 2872 // C,_ := t[0] + m*q[0] 2873 MULXQ q<>+0(SB), AX, BP 2874 ADCXQ R8, AX 2875 MOVQ BP, R8 2876 POPQ BP 2877 2878 // (C,t[0]) := t[1] + m*q[1] + C 2879 ADCXQ R9, R8 2880 MULXQ q<>+8(SB), AX, R9 2881 ADOXQ AX, R8 2882 2883 // (C,t[1]) := t[2] + m*q[2] + C 2884 ADCXQ R10, R9 2885 MULXQ q<>+16(SB), AX, R10 2886 ADOXQ AX, R9 2887 2888 // (C,t[2]) := t[3] + m*q[3] + C 2889 ADCXQ R11, R10 2890 MULXQ q<>+24(SB), AX, R11 2891 ADOXQ AX, R10 2892 2893 // (C,t[3]) := t[4] + m*q[4] + C 2894 ADCXQ R12, R11 2895 MULXQ q<>+32(SB), AX, R12 2896 ADOXQ AX, R11 2897 2898 // (C,t[4]) := t[5] + m*q[5] + C 2899 ADCXQ R13, R12 2900 MULXQ q<>+40(SB), AX, R13 2901 ADOXQ AX, R12 2902 2903 // t[5] = C + A 2904 MOVQ $0, AX 2905 ADCXQ AX, R13 2906 ADOXQ BP, R13 2907 2908 // clear the flags 2909 XORQ AX, AX 2910 MOVQ y+16(FP), DX 2911 MOVQ 32(DX), DX 2912 2913 // (A,t[0]) := t[0] + x[0]*y[4] + A 2914 MULXQ R14, AX, BP 2915 ADOXQ AX, R8 2916 2917 // (A,t[1]) := t[1] + x[1]*y[4] + A 2918 ADCXQ BP, R9 2919 MULXQ R15, AX, BP 2920 ADOXQ AX, R9 2921 2922 // (A,t[2]) := t[2] + x[2]*y[4] + A 2923 ADCXQ BP, R10 2924 MULXQ CX, AX, BP 2925 ADOXQ AX, R10 2926 2927 // (A,t[3]) := t[3] + x[3]*y[4] + A 2928 ADCXQ BP, R11 2929 MULXQ BX, AX, BP 2930 ADOXQ AX, R11 2931 2932 // (A,t[4]) := t[4] + x[4]*y[4] + A 2933 ADCXQ BP, R12 2934 MULXQ SI, AX, BP 2935 ADOXQ AX, R12 2936 2937 // (A,t[5]) := t[5] + x[5]*y[4] + A 2938 ADCXQ BP, R13 2939 MULXQ DI, AX, BP 2940 ADOXQ AX, R13 2941 2942 // A += carries from ADCXQ and ADOXQ 2943 MOVQ $0, AX 2944 ADCXQ AX, BP 2945 ADOXQ AX, BP 2946 PUSHQ BP 2947 2948 // m := t[0]*q'[0] mod W 2949 MOVQ qInv0<>(SB), DX 2950 IMULQ R8, DX 2951 2952 // clear the flags 2953 XORQ AX, AX 2954 2955 // C,_ := t[0] + m*q[0] 2956 MULXQ q<>+0(SB), AX, BP 2957 ADCXQ R8, AX 2958 MOVQ BP, R8 2959 POPQ BP 2960 2961 // (C,t[0]) := t[1] + m*q[1] + C 2962 ADCXQ R9, R8 2963 MULXQ q<>+8(SB), AX, R9 2964 ADOXQ AX, R8 2965 2966 // (C,t[1]) := t[2] + m*q[2] + C 2967 ADCXQ R10, R9 2968 MULXQ q<>+16(SB), AX, R10 2969 ADOXQ AX, R9 2970 2971 // (C,t[2]) := t[3] + m*q[3] + C 2972 ADCXQ R11, R10 2973 MULXQ q<>+24(SB), AX, R11 2974 ADOXQ AX, R10 2975 2976 // (C,t[3]) := t[4] + m*q[4] + C 2977 ADCXQ R12, R11 2978 MULXQ q<>+32(SB), AX, R12 2979 ADOXQ AX, R11 2980 2981 // (C,t[4]) := t[5] + m*q[5] + C 2982 ADCXQ R13, R12 2983 MULXQ q<>+40(SB), AX, R13 2984 ADOXQ AX, R12 2985 2986 // t[5] = C + A 2987 MOVQ $0, AX 2988 ADCXQ AX, R13 2989 ADOXQ BP, R13 2990 2991 // clear the flags 2992 XORQ AX, AX 2993 MOVQ y+16(FP), DX 2994 MOVQ 40(DX), DX 2995 2996 // (A,t[0]) := t[0] + x[0]*y[5] + A 2997 MULXQ R14, AX, BP 2998 ADOXQ AX, R8 2999 3000 // (A,t[1]) := t[1] + x[1]*y[5] + A 3001 ADCXQ BP, R9 3002 MULXQ R15, AX, BP 3003 ADOXQ AX, R9 3004 3005 // (A,t[2]) := t[2] + x[2]*y[5] + A 3006 ADCXQ BP, R10 3007 MULXQ CX, AX, BP 3008 ADOXQ AX, R10 3009 3010 // (A,t[3]) := t[3] + x[3]*y[5] + A 3011 ADCXQ BP, R11 3012 MULXQ BX, AX, BP 3013 ADOXQ AX, R11 3014 3015 // (A,t[4]) := t[4] + x[4]*y[5] + A 3016 ADCXQ BP, R12 3017 MULXQ SI, AX, BP 3018 ADOXQ AX, R12 3019 3020 // (A,t[5]) := t[5] + x[5]*y[5] + A 3021 ADCXQ BP, R13 3022 MULXQ DI, AX, BP 3023 ADOXQ AX, R13 3024 3025 // A += carries from ADCXQ and ADOXQ 3026 MOVQ $0, AX 3027 ADCXQ AX, BP 3028 ADOXQ AX, BP 3029 PUSHQ BP 3030 3031 // m := t[0]*q'[0] mod W 3032 MOVQ qInv0<>(SB), DX 3033 IMULQ R8, DX 3034 3035 // clear the flags 3036 XORQ AX, AX 3037 3038 // C,_ := t[0] + m*q[0] 3039 MULXQ q<>+0(SB), AX, BP 3040 ADCXQ R8, AX 3041 MOVQ BP, R8 3042 POPQ BP 3043 3044 // (C,t[0]) := t[1] + m*q[1] + C 3045 ADCXQ R9, R8 3046 MULXQ q<>+8(SB), AX, R9 3047 ADOXQ AX, R8 3048 3049 // (C,t[1]) := t[2] + m*q[2] + C 3050 ADCXQ R10, R9 3051 MULXQ q<>+16(SB), AX, R10 3052 ADOXQ AX, R9 3053 3054 // (C,t[2]) := t[3] + m*q[3] + C 3055 ADCXQ R11, R10 3056 MULXQ q<>+24(SB), AX, R11 3057 ADOXQ AX, R10 3058 3059 // (C,t[3]) := t[4] + m*q[4] + C 3060 ADCXQ R12, R11 3061 MULXQ q<>+32(SB), AX, R12 3062 ADOXQ AX, R11 3063 3064 // (C,t[4]) := t[5] + m*q[5] + C 3065 ADCXQ R13, R12 3066 MULXQ q<>+40(SB), AX, R13 3067 ADOXQ AX, R12 3068 3069 // t[5] = C + A 3070 MOVQ $0, AX 3071 ADCXQ AX, R13 3072 ADOXQ BP, R13 3073 3074 // reduce element(R8,R9,R10,R11,R12,R13) using temp registers (R14,R15,CX,BX,SI,DI) 3075 REDUCE(R8,R9,R10,R11,R12,R13,R14,R15,CX,BX,SI,DI) 3076 3077 XORQ DX, DX 3078 MOVQ s0-8(SP), R14 3079 MOVQ s1-16(SP), R15 3080 MOVQ s2-24(SP), CX 3081 MOVQ s3-32(SP), BX 3082 MOVQ s4-40(SP), SI 3083 MOVQ s5-48(SP), DI 3084 SUBQ R8, R14 3085 SBBQ R9, R15 3086 SBBQ R10, CX 3087 SBBQ R11, BX 3088 SBBQ R12, SI 3089 SBBQ R13, DI 3090 MOVQ R8, s0-8(SP) 3091 MOVQ R9, s1-16(SP) 3092 MOVQ R10, s2-24(SP) 3093 MOVQ R11, s3-32(SP) 3094 MOVQ R12, s4-40(SP) 3095 MOVQ R13, s5-48(SP) 3096 MOVQ $0xb9feffffffffaaab, R8 3097 MOVQ $0x1eabfffeb153ffff, R9 3098 MOVQ $0x6730d2a0f6b0f624, R10 3099 MOVQ $0x64774b84f38512bf, R11 3100 MOVQ $0x4b1ba7b6434bacd7, R12 3101 MOVQ $0x1a0111ea397fe69a, R13 3102 CMOVQCC DX, R8 3103 CMOVQCC DX, R9 3104 CMOVQCC DX, R10 3105 CMOVQCC DX, R11 3106 CMOVQCC DX, R12 3107 CMOVQCC DX, R13 3108 ADDQ R8, R14 3109 ADCQ R9, R15 3110 ADCQ R10, CX 3111 ADCQ R11, BX 3112 ADCQ R12, SI 3113 ADCQ R13, DI 3114 SUBQ s6-56(SP), R14 3115 SBBQ s7-64(SP), R15 3116 SBBQ s8-72(SP), CX 3117 SBBQ s9-80(SP), BX 3118 SBBQ s10-88(SP), SI 3119 SBBQ s11-96(SP), DI 3120 MOVQ $0xb9feffffffffaaab, R8 3121 MOVQ $0x1eabfffeb153ffff, R9 3122 MOVQ $0x6730d2a0f6b0f624, R10 3123 MOVQ $0x64774b84f38512bf, R11 3124 MOVQ $0x4b1ba7b6434bacd7, R12 3125 MOVQ $0x1a0111ea397fe69a, R13 3126 CMOVQCC DX, R8 3127 CMOVQCC DX, R9 3128 CMOVQCC DX, R10 3129 CMOVQCC DX, R11 3130 CMOVQCC DX, R12 3131 CMOVQCC DX, R13 3132 ADDQ R8, R14 3133 ADCQ R9, R15 3134 ADCQ R10, CX 3135 ADCQ R11, BX 3136 ADCQ R12, SI 3137 ADCQ R13, DI 3138 MOVQ z+0(FP), AX 3139 MOVQ R14, 48(AX) 3140 MOVQ R15, 56(AX) 3141 MOVQ CX, 64(AX) 3142 MOVQ BX, 72(AX) 3143 MOVQ SI, 80(AX) 3144 MOVQ DI, 88(AX) 3145 MOVQ s0-8(SP), R8 3146 MOVQ s1-16(SP), R9 3147 MOVQ s2-24(SP), R10 3148 MOVQ s3-32(SP), R11 3149 MOVQ s4-40(SP), R12 3150 MOVQ s5-48(SP), R13 3151 SUBQ s6-56(SP), R8 3152 SBBQ s7-64(SP), R9 3153 SBBQ s8-72(SP), R10 3154 SBBQ s9-80(SP), R11 3155 SBBQ s10-88(SP), R12 3156 SBBQ s11-96(SP), R13 3157 MOVQ $0xb9feffffffffaaab, R14 3158 MOVQ $0x1eabfffeb153ffff, R15 3159 MOVQ $0x6730d2a0f6b0f624, CX 3160 MOVQ $0x64774b84f38512bf, BX 3161 MOVQ $0x4b1ba7b6434bacd7, SI 3162 MOVQ $0x1a0111ea397fe69a, DI 3163 CMOVQCC DX, R14 3164 CMOVQCC DX, R15 3165 CMOVQCC DX, CX 3166 CMOVQCC DX, BX 3167 CMOVQCC DX, SI 3168 CMOVQCC DX, DI 3169 ADDQ R14, R8 3170 ADCQ R15, R9 3171 ADCQ CX, R10 3172 ADCQ BX, R11 3173 ADCQ SI, R12 3174 ADCQ DI, R13 3175 MOVQ R8, 0(AX) 3176 MOVQ R9, 8(AX) 3177 MOVQ R10, 16(AX) 3178 MOVQ R11, 24(AX) 3179 MOVQ R12, 32(AX) 3180 MOVQ R13, 40(AX) 3181 RET 3182 3183 l5: 3184 MOVQ z+0(FP), AX 3185 MOVQ AX, (SP) 3186 MOVQ x+8(FP), AX 3187 MOVQ AX, 8(SP) 3188 MOVQ y+16(FP), AX 3189 MOVQ AX, 16(SP) 3190 CALL ·mulGenericE2(SB) 3191 RET