nat_amd64.s raw

   1  // Code generated by command: go run nat_amd64_asm.go -out ../nat_amd64.s -pkg bigmod. DO NOT EDIT.
   2  
   3  //go:build !purego
   4  
   5  // func addMulVVW1024(z *uint, x *uint, y uint) (c uint)
   6  // Requires: ADX, BMI2
   7  TEXT ·addMulVVW1024(SB), $0-32
   8  	CMPB ·supportADX+0(SB), $0x01
   9  	JEQ  adx
  10  	MOVQ z+0(FP), CX
  11  	MOVQ x+8(FP), BX
  12  	MOVQ y+16(FP), SI
  13  	XORQ DI, DI
  14  
  15  	// Iteration 0
  16  	MOVQ (BX), AX
  17  	MULQ SI
  18  	ADDQ (CX), AX
  19  	ADCQ $0x00, DX
  20  	ADDQ DI, AX
  21  	ADCQ $0x00, DX
  22  	MOVQ DX, DI
  23  	MOVQ AX, (CX)
  24  
  25  	// Iteration 1
  26  	MOVQ 8(BX), AX
  27  	MULQ SI
  28  	ADDQ 8(CX), AX
  29  	ADCQ $0x00, DX
  30  	ADDQ DI, AX
  31  	ADCQ $0x00, DX
  32  	MOVQ DX, DI
  33  	MOVQ AX, 8(CX)
  34  
  35  	// Iteration 2
  36  	MOVQ 16(BX), AX
  37  	MULQ SI
  38  	ADDQ 16(CX), AX
  39  	ADCQ $0x00, DX
  40  	ADDQ DI, AX
  41  	ADCQ $0x00, DX
  42  	MOVQ DX, DI
  43  	MOVQ AX, 16(CX)
  44  
  45  	// Iteration 3
  46  	MOVQ 24(BX), AX
  47  	MULQ SI
  48  	ADDQ 24(CX), AX
  49  	ADCQ $0x00, DX
  50  	ADDQ DI, AX
  51  	ADCQ $0x00, DX
  52  	MOVQ DX, DI
  53  	MOVQ AX, 24(CX)
  54  
  55  	// Iteration 4
  56  	MOVQ 32(BX), AX
  57  	MULQ SI
  58  	ADDQ 32(CX), AX
  59  	ADCQ $0x00, DX
  60  	ADDQ DI, AX
  61  	ADCQ $0x00, DX
  62  	MOVQ DX, DI
  63  	MOVQ AX, 32(CX)
  64  
  65  	// Iteration 5
  66  	MOVQ 40(BX), AX
  67  	MULQ SI
  68  	ADDQ 40(CX), AX
  69  	ADCQ $0x00, DX
  70  	ADDQ DI, AX
  71  	ADCQ $0x00, DX
  72  	MOVQ DX, DI
  73  	MOVQ AX, 40(CX)
  74  
  75  	// Iteration 6
  76  	MOVQ 48(BX), AX
  77  	MULQ SI
  78  	ADDQ 48(CX), AX
  79  	ADCQ $0x00, DX
  80  	ADDQ DI, AX
  81  	ADCQ $0x00, DX
  82  	MOVQ DX, DI
  83  	MOVQ AX, 48(CX)
  84  
  85  	// Iteration 7
  86  	MOVQ 56(BX), AX
  87  	MULQ SI
  88  	ADDQ 56(CX), AX
  89  	ADCQ $0x00, DX
  90  	ADDQ DI, AX
  91  	ADCQ $0x00, DX
  92  	MOVQ DX, DI
  93  	MOVQ AX, 56(CX)
  94  
  95  	// Iteration 8
  96  	MOVQ 64(BX), AX
  97  	MULQ SI
  98  	ADDQ 64(CX), AX
  99  	ADCQ $0x00, DX
 100  	ADDQ DI, AX
 101  	ADCQ $0x00, DX
 102  	MOVQ DX, DI
 103  	MOVQ AX, 64(CX)
 104  
 105  	// Iteration 9
 106  	MOVQ 72(BX), AX
 107  	MULQ SI
 108  	ADDQ 72(CX), AX
 109  	ADCQ $0x00, DX
 110  	ADDQ DI, AX
 111  	ADCQ $0x00, DX
 112  	MOVQ DX, DI
 113  	MOVQ AX, 72(CX)
 114  
 115  	// Iteration 10
 116  	MOVQ 80(BX), AX
 117  	MULQ SI
 118  	ADDQ 80(CX), AX
 119  	ADCQ $0x00, DX
 120  	ADDQ DI, AX
 121  	ADCQ $0x00, DX
 122  	MOVQ DX, DI
 123  	MOVQ AX, 80(CX)
 124  
 125  	// Iteration 11
 126  	MOVQ 88(BX), AX
 127  	MULQ SI
 128  	ADDQ 88(CX), AX
 129  	ADCQ $0x00, DX
 130  	ADDQ DI, AX
 131  	ADCQ $0x00, DX
 132  	MOVQ DX, DI
 133  	MOVQ AX, 88(CX)
 134  
 135  	// Iteration 12
 136  	MOVQ 96(BX), AX
 137  	MULQ SI
 138  	ADDQ 96(CX), AX
 139  	ADCQ $0x00, DX
 140  	ADDQ DI, AX
 141  	ADCQ $0x00, DX
 142  	MOVQ DX, DI
 143  	MOVQ AX, 96(CX)
 144  
 145  	// Iteration 13
 146  	MOVQ 104(BX), AX
 147  	MULQ SI
 148  	ADDQ 104(CX), AX
 149  	ADCQ $0x00, DX
 150  	ADDQ DI, AX
 151  	ADCQ $0x00, DX
 152  	MOVQ DX, DI
 153  	MOVQ AX, 104(CX)
 154  
 155  	// Iteration 14
 156  	MOVQ 112(BX), AX
 157  	MULQ SI
 158  	ADDQ 112(CX), AX
 159  	ADCQ $0x00, DX
 160  	ADDQ DI, AX
 161  	ADCQ $0x00, DX
 162  	MOVQ DX, DI
 163  	MOVQ AX, 112(CX)
 164  
 165  	// Iteration 15
 166  	MOVQ 120(BX), AX
 167  	MULQ SI
 168  	ADDQ 120(CX), AX
 169  	ADCQ $0x00, DX
 170  	ADDQ DI, AX
 171  	ADCQ $0x00, DX
 172  	MOVQ DX, DI
 173  	MOVQ AX, 120(CX)
 174  	MOVQ DI, c+24(FP)
 175  	RET
 176  
 177  adx:
 178  	MOVQ z+0(FP), AX
 179  	MOVQ x+8(FP), CX
 180  	MOVQ y+16(FP), DX
 181  	XORQ BX, BX
 182  	XORQ SI, SI
 183  
 184  	// Iteration 0
 185  	MULXQ (CX), R8, DI
 186  	ADCXQ BX, R8
 187  	ADOXQ (AX), R8
 188  	MOVQ  R8, (AX)
 189  
 190  	// Iteration 1
 191  	MULXQ 8(CX), R8, BX
 192  	ADCXQ DI, R8
 193  	ADOXQ 8(AX), R8
 194  	MOVQ  R8, 8(AX)
 195  
 196  	// Iteration 2
 197  	MULXQ 16(CX), R8, DI
 198  	ADCXQ BX, R8
 199  	ADOXQ 16(AX), R8
 200  	MOVQ  R8, 16(AX)
 201  
 202  	// Iteration 3
 203  	MULXQ 24(CX), R8, BX
 204  	ADCXQ DI, R8
 205  	ADOXQ 24(AX), R8
 206  	MOVQ  R8, 24(AX)
 207  
 208  	// Iteration 4
 209  	MULXQ 32(CX), R8, DI
 210  	ADCXQ BX, R8
 211  	ADOXQ 32(AX), R8
 212  	MOVQ  R8, 32(AX)
 213  
 214  	// Iteration 5
 215  	MULXQ 40(CX), R8, BX
 216  	ADCXQ DI, R8
 217  	ADOXQ 40(AX), R8
 218  	MOVQ  R8, 40(AX)
 219  
 220  	// Iteration 6
 221  	MULXQ 48(CX), R8, DI
 222  	ADCXQ BX, R8
 223  	ADOXQ 48(AX), R8
 224  	MOVQ  R8, 48(AX)
 225  
 226  	// Iteration 7
 227  	MULXQ 56(CX), R8, BX
 228  	ADCXQ DI, R8
 229  	ADOXQ 56(AX), R8
 230  	MOVQ  R8, 56(AX)
 231  
 232  	// Iteration 8
 233  	MULXQ 64(CX), R8, DI
 234  	ADCXQ BX, R8
 235  	ADOXQ 64(AX), R8
 236  	MOVQ  R8, 64(AX)
 237  
 238  	// Iteration 9
 239  	MULXQ 72(CX), R8, BX
 240  	ADCXQ DI, R8
 241  	ADOXQ 72(AX), R8
 242  	MOVQ  R8, 72(AX)
 243  
 244  	// Iteration 10
 245  	MULXQ 80(CX), R8, DI
 246  	ADCXQ BX, R8
 247  	ADOXQ 80(AX), R8
 248  	MOVQ  R8, 80(AX)
 249  
 250  	// Iteration 11
 251  	MULXQ 88(CX), R8, BX
 252  	ADCXQ DI, R8
 253  	ADOXQ 88(AX), R8
 254  	MOVQ  R8, 88(AX)
 255  
 256  	// Iteration 12
 257  	MULXQ 96(CX), R8, DI
 258  	ADCXQ BX, R8
 259  	ADOXQ 96(AX), R8
 260  	MOVQ  R8, 96(AX)
 261  
 262  	// Iteration 13
 263  	MULXQ 104(CX), R8, BX
 264  	ADCXQ DI, R8
 265  	ADOXQ 104(AX), R8
 266  	MOVQ  R8, 104(AX)
 267  
 268  	// Iteration 14
 269  	MULXQ 112(CX), R8, DI
 270  	ADCXQ BX, R8
 271  	ADOXQ 112(AX), R8
 272  	MOVQ  R8, 112(AX)
 273  
 274  	// Iteration 15
 275  	MULXQ 120(CX), R8, BX
 276  	ADCXQ DI, R8
 277  	ADOXQ 120(AX), R8
 278  	MOVQ  R8, 120(AX)
 279  
 280  	// Add back carry flags and return
 281  	ADCXQ SI, BX
 282  	ADOXQ SI, BX
 283  	MOVQ  BX, c+24(FP)
 284  	RET
 285  
 286  // func addMulVVW1536(z *uint, x *uint, y uint) (c uint)
 287  // Requires: ADX, BMI2
 288  TEXT ·addMulVVW1536(SB), $0-32
 289  	CMPB ·supportADX+0(SB), $0x01
 290  	JEQ  adx
 291  	MOVQ z+0(FP), CX
 292  	MOVQ x+8(FP), BX
 293  	MOVQ y+16(FP), SI
 294  	XORQ DI, DI
 295  
 296  	// Iteration 0
 297  	MOVQ (BX), AX
 298  	MULQ SI
 299  	ADDQ (CX), AX
 300  	ADCQ $0x00, DX
 301  	ADDQ DI, AX
 302  	ADCQ $0x00, DX
 303  	MOVQ DX, DI
 304  	MOVQ AX, (CX)
 305  
 306  	// Iteration 1
 307  	MOVQ 8(BX), AX
 308  	MULQ SI
 309  	ADDQ 8(CX), AX
 310  	ADCQ $0x00, DX
 311  	ADDQ DI, AX
 312  	ADCQ $0x00, DX
 313  	MOVQ DX, DI
 314  	MOVQ AX, 8(CX)
 315  
 316  	// Iteration 2
 317  	MOVQ 16(BX), AX
 318  	MULQ SI
 319  	ADDQ 16(CX), AX
 320  	ADCQ $0x00, DX
 321  	ADDQ DI, AX
 322  	ADCQ $0x00, DX
 323  	MOVQ DX, DI
 324  	MOVQ AX, 16(CX)
 325  
 326  	// Iteration 3
 327  	MOVQ 24(BX), AX
 328  	MULQ SI
 329  	ADDQ 24(CX), AX
 330  	ADCQ $0x00, DX
 331  	ADDQ DI, AX
 332  	ADCQ $0x00, DX
 333  	MOVQ DX, DI
 334  	MOVQ AX, 24(CX)
 335  
 336  	// Iteration 4
 337  	MOVQ 32(BX), AX
 338  	MULQ SI
 339  	ADDQ 32(CX), AX
 340  	ADCQ $0x00, DX
 341  	ADDQ DI, AX
 342  	ADCQ $0x00, DX
 343  	MOVQ DX, DI
 344  	MOVQ AX, 32(CX)
 345  
 346  	// Iteration 5
 347  	MOVQ 40(BX), AX
 348  	MULQ SI
 349  	ADDQ 40(CX), AX
 350  	ADCQ $0x00, DX
 351  	ADDQ DI, AX
 352  	ADCQ $0x00, DX
 353  	MOVQ DX, DI
 354  	MOVQ AX, 40(CX)
 355  
 356  	// Iteration 6
 357  	MOVQ 48(BX), AX
 358  	MULQ SI
 359  	ADDQ 48(CX), AX
 360  	ADCQ $0x00, DX
 361  	ADDQ DI, AX
 362  	ADCQ $0x00, DX
 363  	MOVQ DX, DI
 364  	MOVQ AX, 48(CX)
 365  
 366  	// Iteration 7
 367  	MOVQ 56(BX), AX
 368  	MULQ SI
 369  	ADDQ 56(CX), AX
 370  	ADCQ $0x00, DX
 371  	ADDQ DI, AX
 372  	ADCQ $0x00, DX
 373  	MOVQ DX, DI
 374  	MOVQ AX, 56(CX)
 375  
 376  	// Iteration 8
 377  	MOVQ 64(BX), AX
 378  	MULQ SI
 379  	ADDQ 64(CX), AX
 380  	ADCQ $0x00, DX
 381  	ADDQ DI, AX
 382  	ADCQ $0x00, DX
 383  	MOVQ DX, DI
 384  	MOVQ AX, 64(CX)
 385  
 386  	// Iteration 9
 387  	MOVQ 72(BX), AX
 388  	MULQ SI
 389  	ADDQ 72(CX), AX
 390  	ADCQ $0x00, DX
 391  	ADDQ DI, AX
 392  	ADCQ $0x00, DX
 393  	MOVQ DX, DI
 394  	MOVQ AX, 72(CX)
 395  
 396  	// Iteration 10
 397  	MOVQ 80(BX), AX
 398  	MULQ SI
 399  	ADDQ 80(CX), AX
 400  	ADCQ $0x00, DX
 401  	ADDQ DI, AX
 402  	ADCQ $0x00, DX
 403  	MOVQ DX, DI
 404  	MOVQ AX, 80(CX)
 405  
 406  	// Iteration 11
 407  	MOVQ 88(BX), AX
 408  	MULQ SI
 409  	ADDQ 88(CX), AX
 410  	ADCQ $0x00, DX
 411  	ADDQ DI, AX
 412  	ADCQ $0x00, DX
 413  	MOVQ DX, DI
 414  	MOVQ AX, 88(CX)
 415  
 416  	// Iteration 12
 417  	MOVQ 96(BX), AX
 418  	MULQ SI
 419  	ADDQ 96(CX), AX
 420  	ADCQ $0x00, DX
 421  	ADDQ DI, AX
 422  	ADCQ $0x00, DX
 423  	MOVQ DX, DI
 424  	MOVQ AX, 96(CX)
 425  
 426  	// Iteration 13
 427  	MOVQ 104(BX), AX
 428  	MULQ SI
 429  	ADDQ 104(CX), AX
 430  	ADCQ $0x00, DX
 431  	ADDQ DI, AX
 432  	ADCQ $0x00, DX
 433  	MOVQ DX, DI
 434  	MOVQ AX, 104(CX)
 435  
 436  	// Iteration 14
 437  	MOVQ 112(BX), AX
 438  	MULQ SI
 439  	ADDQ 112(CX), AX
 440  	ADCQ $0x00, DX
 441  	ADDQ DI, AX
 442  	ADCQ $0x00, DX
 443  	MOVQ DX, DI
 444  	MOVQ AX, 112(CX)
 445  
 446  	// Iteration 15
 447  	MOVQ 120(BX), AX
 448  	MULQ SI
 449  	ADDQ 120(CX), AX
 450  	ADCQ $0x00, DX
 451  	ADDQ DI, AX
 452  	ADCQ $0x00, DX
 453  	MOVQ DX, DI
 454  	MOVQ AX, 120(CX)
 455  
 456  	// Iteration 16
 457  	MOVQ 128(BX), AX
 458  	MULQ SI
 459  	ADDQ 128(CX), AX
 460  	ADCQ $0x00, DX
 461  	ADDQ DI, AX
 462  	ADCQ $0x00, DX
 463  	MOVQ DX, DI
 464  	MOVQ AX, 128(CX)
 465  
 466  	// Iteration 17
 467  	MOVQ 136(BX), AX
 468  	MULQ SI
 469  	ADDQ 136(CX), AX
 470  	ADCQ $0x00, DX
 471  	ADDQ DI, AX
 472  	ADCQ $0x00, DX
 473  	MOVQ DX, DI
 474  	MOVQ AX, 136(CX)
 475  
 476  	// Iteration 18
 477  	MOVQ 144(BX), AX
 478  	MULQ SI
 479  	ADDQ 144(CX), AX
 480  	ADCQ $0x00, DX
 481  	ADDQ DI, AX
 482  	ADCQ $0x00, DX
 483  	MOVQ DX, DI
 484  	MOVQ AX, 144(CX)
 485  
 486  	// Iteration 19
 487  	MOVQ 152(BX), AX
 488  	MULQ SI
 489  	ADDQ 152(CX), AX
 490  	ADCQ $0x00, DX
 491  	ADDQ DI, AX
 492  	ADCQ $0x00, DX
 493  	MOVQ DX, DI
 494  	MOVQ AX, 152(CX)
 495  
 496  	// Iteration 20
 497  	MOVQ 160(BX), AX
 498  	MULQ SI
 499  	ADDQ 160(CX), AX
 500  	ADCQ $0x00, DX
 501  	ADDQ DI, AX
 502  	ADCQ $0x00, DX
 503  	MOVQ DX, DI
 504  	MOVQ AX, 160(CX)
 505  
 506  	// Iteration 21
 507  	MOVQ 168(BX), AX
 508  	MULQ SI
 509  	ADDQ 168(CX), AX
 510  	ADCQ $0x00, DX
 511  	ADDQ DI, AX
 512  	ADCQ $0x00, DX
 513  	MOVQ DX, DI
 514  	MOVQ AX, 168(CX)
 515  
 516  	// Iteration 22
 517  	MOVQ 176(BX), AX
 518  	MULQ SI
 519  	ADDQ 176(CX), AX
 520  	ADCQ $0x00, DX
 521  	ADDQ DI, AX
 522  	ADCQ $0x00, DX
 523  	MOVQ DX, DI
 524  	MOVQ AX, 176(CX)
 525  
 526  	// Iteration 23
 527  	MOVQ 184(BX), AX
 528  	MULQ SI
 529  	ADDQ 184(CX), AX
 530  	ADCQ $0x00, DX
 531  	ADDQ DI, AX
 532  	ADCQ $0x00, DX
 533  	MOVQ DX, DI
 534  	MOVQ AX, 184(CX)
 535  	MOVQ DI, c+24(FP)
 536  	RET
 537  
 538  adx:
 539  	MOVQ z+0(FP), AX
 540  	MOVQ x+8(FP), CX
 541  	MOVQ y+16(FP), DX
 542  	XORQ BX, BX
 543  	XORQ SI, SI
 544  
 545  	// Iteration 0
 546  	MULXQ (CX), R8, DI
 547  	ADCXQ BX, R8
 548  	ADOXQ (AX), R8
 549  	MOVQ  R8, (AX)
 550  
 551  	// Iteration 1
 552  	MULXQ 8(CX), R8, BX
 553  	ADCXQ DI, R8
 554  	ADOXQ 8(AX), R8
 555  	MOVQ  R8, 8(AX)
 556  
 557  	// Iteration 2
 558  	MULXQ 16(CX), R8, DI
 559  	ADCXQ BX, R8
 560  	ADOXQ 16(AX), R8
 561  	MOVQ  R8, 16(AX)
 562  
 563  	// Iteration 3
 564  	MULXQ 24(CX), R8, BX
 565  	ADCXQ DI, R8
 566  	ADOXQ 24(AX), R8
 567  	MOVQ  R8, 24(AX)
 568  
 569  	// Iteration 4
 570  	MULXQ 32(CX), R8, DI
 571  	ADCXQ BX, R8
 572  	ADOXQ 32(AX), R8
 573  	MOVQ  R8, 32(AX)
 574  
 575  	// Iteration 5
 576  	MULXQ 40(CX), R8, BX
 577  	ADCXQ DI, R8
 578  	ADOXQ 40(AX), R8
 579  	MOVQ  R8, 40(AX)
 580  
 581  	// Iteration 6
 582  	MULXQ 48(CX), R8, DI
 583  	ADCXQ BX, R8
 584  	ADOXQ 48(AX), R8
 585  	MOVQ  R8, 48(AX)
 586  
 587  	// Iteration 7
 588  	MULXQ 56(CX), R8, BX
 589  	ADCXQ DI, R8
 590  	ADOXQ 56(AX), R8
 591  	MOVQ  R8, 56(AX)
 592  
 593  	// Iteration 8
 594  	MULXQ 64(CX), R8, DI
 595  	ADCXQ BX, R8
 596  	ADOXQ 64(AX), R8
 597  	MOVQ  R8, 64(AX)
 598  
 599  	// Iteration 9
 600  	MULXQ 72(CX), R8, BX
 601  	ADCXQ DI, R8
 602  	ADOXQ 72(AX), R8
 603  	MOVQ  R8, 72(AX)
 604  
 605  	// Iteration 10
 606  	MULXQ 80(CX), R8, DI
 607  	ADCXQ BX, R8
 608  	ADOXQ 80(AX), R8
 609  	MOVQ  R8, 80(AX)
 610  
 611  	// Iteration 11
 612  	MULXQ 88(CX), R8, BX
 613  	ADCXQ DI, R8
 614  	ADOXQ 88(AX), R8
 615  	MOVQ  R8, 88(AX)
 616  
 617  	// Iteration 12
 618  	MULXQ 96(CX), R8, DI
 619  	ADCXQ BX, R8
 620  	ADOXQ 96(AX), R8
 621  	MOVQ  R8, 96(AX)
 622  
 623  	// Iteration 13
 624  	MULXQ 104(CX), R8, BX
 625  	ADCXQ DI, R8
 626  	ADOXQ 104(AX), R8
 627  	MOVQ  R8, 104(AX)
 628  
 629  	// Iteration 14
 630  	MULXQ 112(CX), R8, DI
 631  	ADCXQ BX, R8
 632  	ADOXQ 112(AX), R8
 633  	MOVQ  R8, 112(AX)
 634  
 635  	// Iteration 15
 636  	MULXQ 120(CX), R8, BX
 637  	ADCXQ DI, R8
 638  	ADOXQ 120(AX), R8
 639  	MOVQ  R8, 120(AX)
 640  
 641  	// Iteration 16
 642  	MULXQ 128(CX), R8, DI
 643  	ADCXQ BX, R8
 644  	ADOXQ 128(AX), R8
 645  	MOVQ  R8, 128(AX)
 646  
 647  	// Iteration 17
 648  	MULXQ 136(CX), R8, BX
 649  	ADCXQ DI, R8
 650  	ADOXQ 136(AX), R8
 651  	MOVQ  R8, 136(AX)
 652  
 653  	// Iteration 18
 654  	MULXQ 144(CX), R8, DI
 655  	ADCXQ BX, R8
 656  	ADOXQ 144(AX), R8
 657  	MOVQ  R8, 144(AX)
 658  
 659  	// Iteration 19
 660  	MULXQ 152(CX), R8, BX
 661  	ADCXQ DI, R8
 662  	ADOXQ 152(AX), R8
 663  	MOVQ  R8, 152(AX)
 664  
 665  	// Iteration 20
 666  	MULXQ 160(CX), R8, DI
 667  	ADCXQ BX, R8
 668  	ADOXQ 160(AX), R8
 669  	MOVQ  R8, 160(AX)
 670  
 671  	// Iteration 21
 672  	MULXQ 168(CX), R8, BX
 673  	ADCXQ DI, R8
 674  	ADOXQ 168(AX), R8
 675  	MOVQ  R8, 168(AX)
 676  
 677  	// Iteration 22
 678  	MULXQ 176(CX), R8, DI
 679  	ADCXQ BX, R8
 680  	ADOXQ 176(AX), R8
 681  	MOVQ  R8, 176(AX)
 682  
 683  	// Iteration 23
 684  	MULXQ 184(CX), R8, BX
 685  	ADCXQ DI, R8
 686  	ADOXQ 184(AX), R8
 687  	MOVQ  R8, 184(AX)
 688  
 689  	// Add back carry flags and return
 690  	ADCXQ SI, BX
 691  	ADOXQ SI, BX
 692  	MOVQ  BX, c+24(FP)
 693  	RET
 694  
 695  // func addMulVVW2048(z *uint, x *uint, y uint) (c uint)
 696  // Requires: ADX, BMI2
 697  TEXT ·addMulVVW2048(SB), $0-32
 698  	CMPB ·supportADX+0(SB), $0x01
 699  	JEQ  adx
 700  	MOVQ z+0(FP), CX
 701  	MOVQ x+8(FP), BX
 702  	MOVQ y+16(FP), SI
 703  	XORQ DI, DI
 704  
 705  	// Iteration 0
 706  	MOVQ (BX), AX
 707  	MULQ SI
 708  	ADDQ (CX), AX
 709  	ADCQ $0x00, DX
 710  	ADDQ DI, AX
 711  	ADCQ $0x00, DX
 712  	MOVQ DX, DI
 713  	MOVQ AX, (CX)
 714  
 715  	// Iteration 1
 716  	MOVQ 8(BX), AX
 717  	MULQ SI
 718  	ADDQ 8(CX), AX
 719  	ADCQ $0x00, DX
 720  	ADDQ DI, AX
 721  	ADCQ $0x00, DX
 722  	MOVQ DX, DI
 723  	MOVQ AX, 8(CX)
 724  
 725  	// Iteration 2
 726  	MOVQ 16(BX), AX
 727  	MULQ SI
 728  	ADDQ 16(CX), AX
 729  	ADCQ $0x00, DX
 730  	ADDQ DI, AX
 731  	ADCQ $0x00, DX
 732  	MOVQ DX, DI
 733  	MOVQ AX, 16(CX)
 734  
 735  	// Iteration 3
 736  	MOVQ 24(BX), AX
 737  	MULQ SI
 738  	ADDQ 24(CX), AX
 739  	ADCQ $0x00, DX
 740  	ADDQ DI, AX
 741  	ADCQ $0x00, DX
 742  	MOVQ DX, DI
 743  	MOVQ AX, 24(CX)
 744  
 745  	// Iteration 4
 746  	MOVQ 32(BX), AX
 747  	MULQ SI
 748  	ADDQ 32(CX), AX
 749  	ADCQ $0x00, DX
 750  	ADDQ DI, AX
 751  	ADCQ $0x00, DX
 752  	MOVQ DX, DI
 753  	MOVQ AX, 32(CX)
 754  
 755  	// Iteration 5
 756  	MOVQ 40(BX), AX
 757  	MULQ SI
 758  	ADDQ 40(CX), AX
 759  	ADCQ $0x00, DX
 760  	ADDQ DI, AX
 761  	ADCQ $0x00, DX
 762  	MOVQ DX, DI
 763  	MOVQ AX, 40(CX)
 764  
 765  	// Iteration 6
 766  	MOVQ 48(BX), AX
 767  	MULQ SI
 768  	ADDQ 48(CX), AX
 769  	ADCQ $0x00, DX
 770  	ADDQ DI, AX
 771  	ADCQ $0x00, DX
 772  	MOVQ DX, DI
 773  	MOVQ AX, 48(CX)
 774  
 775  	// Iteration 7
 776  	MOVQ 56(BX), AX
 777  	MULQ SI
 778  	ADDQ 56(CX), AX
 779  	ADCQ $0x00, DX
 780  	ADDQ DI, AX
 781  	ADCQ $0x00, DX
 782  	MOVQ DX, DI
 783  	MOVQ AX, 56(CX)
 784  
 785  	// Iteration 8
 786  	MOVQ 64(BX), AX
 787  	MULQ SI
 788  	ADDQ 64(CX), AX
 789  	ADCQ $0x00, DX
 790  	ADDQ DI, AX
 791  	ADCQ $0x00, DX
 792  	MOVQ DX, DI
 793  	MOVQ AX, 64(CX)
 794  
 795  	// Iteration 9
 796  	MOVQ 72(BX), AX
 797  	MULQ SI
 798  	ADDQ 72(CX), AX
 799  	ADCQ $0x00, DX
 800  	ADDQ DI, AX
 801  	ADCQ $0x00, DX
 802  	MOVQ DX, DI
 803  	MOVQ AX, 72(CX)
 804  
 805  	// Iteration 10
 806  	MOVQ 80(BX), AX
 807  	MULQ SI
 808  	ADDQ 80(CX), AX
 809  	ADCQ $0x00, DX
 810  	ADDQ DI, AX
 811  	ADCQ $0x00, DX
 812  	MOVQ DX, DI
 813  	MOVQ AX, 80(CX)
 814  
 815  	// Iteration 11
 816  	MOVQ 88(BX), AX
 817  	MULQ SI
 818  	ADDQ 88(CX), AX
 819  	ADCQ $0x00, DX
 820  	ADDQ DI, AX
 821  	ADCQ $0x00, DX
 822  	MOVQ DX, DI
 823  	MOVQ AX, 88(CX)
 824  
 825  	// Iteration 12
 826  	MOVQ 96(BX), AX
 827  	MULQ SI
 828  	ADDQ 96(CX), AX
 829  	ADCQ $0x00, DX
 830  	ADDQ DI, AX
 831  	ADCQ $0x00, DX
 832  	MOVQ DX, DI
 833  	MOVQ AX, 96(CX)
 834  
 835  	// Iteration 13
 836  	MOVQ 104(BX), AX
 837  	MULQ SI
 838  	ADDQ 104(CX), AX
 839  	ADCQ $0x00, DX
 840  	ADDQ DI, AX
 841  	ADCQ $0x00, DX
 842  	MOVQ DX, DI
 843  	MOVQ AX, 104(CX)
 844  
 845  	// Iteration 14
 846  	MOVQ 112(BX), AX
 847  	MULQ SI
 848  	ADDQ 112(CX), AX
 849  	ADCQ $0x00, DX
 850  	ADDQ DI, AX
 851  	ADCQ $0x00, DX
 852  	MOVQ DX, DI
 853  	MOVQ AX, 112(CX)
 854  
 855  	// Iteration 15
 856  	MOVQ 120(BX), AX
 857  	MULQ SI
 858  	ADDQ 120(CX), AX
 859  	ADCQ $0x00, DX
 860  	ADDQ DI, AX
 861  	ADCQ $0x00, DX
 862  	MOVQ DX, DI
 863  	MOVQ AX, 120(CX)
 864  
 865  	// Iteration 16
 866  	MOVQ 128(BX), AX
 867  	MULQ SI
 868  	ADDQ 128(CX), AX
 869  	ADCQ $0x00, DX
 870  	ADDQ DI, AX
 871  	ADCQ $0x00, DX
 872  	MOVQ DX, DI
 873  	MOVQ AX, 128(CX)
 874  
 875  	// Iteration 17
 876  	MOVQ 136(BX), AX
 877  	MULQ SI
 878  	ADDQ 136(CX), AX
 879  	ADCQ $0x00, DX
 880  	ADDQ DI, AX
 881  	ADCQ $0x00, DX
 882  	MOVQ DX, DI
 883  	MOVQ AX, 136(CX)
 884  
 885  	// Iteration 18
 886  	MOVQ 144(BX), AX
 887  	MULQ SI
 888  	ADDQ 144(CX), AX
 889  	ADCQ $0x00, DX
 890  	ADDQ DI, AX
 891  	ADCQ $0x00, DX
 892  	MOVQ DX, DI
 893  	MOVQ AX, 144(CX)
 894  
 895  	// Iteration 19
 896  	MOVQ 152(BX), AX
 897  	MULQ SI
 898  	ADDQ 152(CX), AX
 899  	ADCQ $0x00, DX
 900  	ADDQ DI, AX
 901  	ADCQ $0x00, DX
 902  	MOVQ DX, DI
 903  	MOVQ AX, 152(CX)
 904  
 905  	// Iteration 20
 906  	MOVQ 160(BX), AX
 907  	MULQ SI
 908  	ADDQ 160(CX), AX
 909  	ADCQ $0x00, DX
 910  	ADDQ DI, AX
 911  	ADCQ $0x00, DX
 912  	MOVQ DX, DI
 913  	MOVQ AX, 160(CX)
 914  
 915  	// Iteration 21
 916  	MOVQ 168(BX), AX
 917  	MULQ SI
 918  	ADDQ 168(CX), AX
 919  	ADCQ $0x00, DX
 920  	ADDQ DI, AX
 921  	ADCQ $0x00, DX
 922  	MOVQ DX, DI
 923  	MOVQ AX, 168(CX)
 924  
 925  	// Iteration 22
 926  	MOVQ 176(BX), AX
 927  	MULQ SI
 928  	ADDQ 176(CX), AX
 929  	ADCQ $0x00, DX
 930  	ADDQ DI, AX
 931  	ADCQ $0x00, DX
 932  	MOVQ DX, DI
 933  	MOVQ AX, 176(CX)
 934  
 935  	// Iteration 23
 936  	MOVQ 184(BX), AX
 937  	MULQ SI
 938  	ADDQ 184(CX), AX
 939  	ADCQ $0x00, DX
 940  	ADDQ DI, AX
 941  	ADCQ $0x00, DX
 942  	MOVQ DX, DI
 943  	MOVQ AX, 184(CX)
 944  
 945  	// Iteration 24
 946  	MOVQ 192(BX), AX
 947  	MULQ SI
 948  	ADDQ 192(CX), AX
 949  	ADCQ $0x00, DX
 950  	ADDQ DI, AX
 951  	ADCQ $0x00, DX
 952  	MOVQ DX, DI
 953  	MOVQ AX, 192(CX)
 954  
 955  	// Iteration 25
 956  	MOVQ 200(BX), AX
 957  	MULQ SI
 958  	ADDQ 200(CX), AX
 959  	ADCQ $0x00, DX
 960  	ADDQ DI, AX
 961  	ADCQ $0x00, DX
 962  	MOVQ DX, DI
 963  	MOVQ AX, 200(CX)
 964  
 965  	// Iteration 26
 966  	MOVQ 208(BX), AX
 967  	MULQ SI
 968  	ADDQ 208(CX), AX
 969  	ADCQ $0x00, DX
 970  	ADDQ DI, AX
 971  	ADCQ $0x00, DX
 972  	MOVQ DX, DI
 973  	MOVQ AX, 208(CX)
 974  
 975  	// Iteration 27
 976  	MOVQ 216(BX), AX
 977  	MULQ SI
 978  	ADDQ 216(CX), AX
 979  	ADCQ $0x00, DX
 980  	ADDQ DI, AX
 981  	ADCQ $0x00, DX
 982  	MOVQ DX, DI
 983  	MOVQ AX, 216(CX)
 984  
 985  	// Iteration 28
 986  	MOVQ 224(BX), AX
 987  	MULQ SI
 988  	ADDQ 224(CX), AX
 989  	ADCQ $0x00, DX
 990  	ADDQ DI, AX
 991  	ADCQ $0x00, DX
 992  	MOVQ DX, DI
 993  	MOVQ AX, 224(CX)
 994  
 995  	// Iteration 29
 996  	MOVQ 232(BX), AX
 997  	MULQ SI
 998  	ADDQ 232(CX), AX
 999  	ADCQ $0x00, DX
1000  	ADDQ DI, AX
1001  	ADCQ $0x00, DX
1002  	MOVQ DX, DI
1003  	MOVQ AX, 232(CX)
1004  
1005  	// Iteration 30
1006  	MOVQ 240(BX), AX
1007  	MULQ SI
1008  	ADDQ 240(CX), AX
1009  	ADCQ $0x00, DX
1010  	ADDQ DI, AX
1011  	ADCQ $0x00, DX
1012  	MOVQ DX, DI
1013  	MOVQ AX, 240(CX)
1014  
1015  	// Iteration 31
1016  	MOVQ 248(BX), AX
1017  	MULQ SI
1018  	ADDQ 248(CX), AX
1019  	ADCQ $0x00, DX
1020  	ADDQ DI, AX
1021  	ADCQ $0x00, DX
1022  	MOVQ DX, DI
1023  	MOVQ AX, 248(CX)
1024  	MOVQ DI, c+24(FP)
1025  	RET
1026  
1027  adx:
1028  	MOVQ z+0(FP), AX
1029  	MOVQ x+8(FP), CX
1030  	MOVQ y+16(FP), DX
1031  	XORQ BX, BX
1032  	XORQ SI, SI
1033  
1034  	// Iteration 0
1035  	MULXQ (CX), R8, DI
1036  	ADCXQ BX, R8
1037  	ADOXQ (AX), R8
1038  	MOVQ  R8, (AX)
1039  
1040  	// Iteration 1
1041  	MULXQ 8(CX), R8, BX
1042  	ADCXQ DI, R8
1043  	ADOXQ 8(AX), R8
1044  	MOVQ  R8, 8(AX)
1045  
1046  	// Iteration 2
1047  	MULXQ 16(CX), R8, DI
1048  	ADCXQ BX, R8
1049  	ADOXQ 16(AX), R8
1050  	MOVQ  R8, 16(AX)
1051  
1052  	// Iteration 3
1053  	MULXQ 24(CX), R8, BX
1054  	ADCXQ DI, R8
1055  	ADOXQ 24(AX), R8
1056  	MOVQ  R8, 24(AX)
1057  
1058  	// Iteration 4
1059  	MULXQ 32(CX), R8, DI
1060  	ADCXQ BX, R8
1061  	ADOXQ 32(AX), R8
1062  	MOVQ  R8, 32(AX)
1063  
1064  	// Iteration 5
1065  	MULXQ 40(CX), R8, BX
1066  	ADCXQ DI, R8
1067  	ADOXQ 40(AX), R8
1068  	MOVQ  R8, 40(AX)
1069  
1070  	// Iteration 6
1071  	MULXQ 48(CX), R8, DI
1072  	ADCXQ BX, R8
1073  	ADOXQ 48(AX), R8
1074  	MOVQ  R8, 48(AX)
1075  
1076  	// Iteration 7
1077  	MULXQ 56(CX), R8, BX
1078  	ADCXQ DI, R8
1079  	ADOXQ 56(AX), R8
1080  	MOVQ  R8, 56(AX)
1081  
1082  	// Iteration 8
1083  	MULXQ 64(CX), R8, DI
1084  	ADCXQ BX, R8
1085  	ADOXQ 64(AX), R8
1086  	MOVQ  R8, 64(AX)
1087  
1088  	// Iteration 9
1089  	MULXQ 72(CX), R8, BX
1090  	ADCXQ DI, R8
1091  	ADOXQ 72(AX), R8
1092  	MOVQ  R8, 72(AX)
1093  
1094  	// Iteration 10
1095  	MULXQ 80(CX), R8, DI
1096  	ADCXQ BX, R8
1097  	ADOXQ 80(AX), R8
1098  	MOVQ  R8, 80(AX)
1099  
1100  	// Iteration 11
1101  	MULXQ 88(CX), R8, BX
1102  	ADCXQ DI, R8
1103  	ADOXQ 88(AX), R8
1104  	MOVQ  R8, 88(AX)
1105  
1106  	// Iteration 12
1107  	MULXQ 96(CX), R8, DI
1108  	ADCXQ BX, R8
1109  	ADOXQ 96(AX), R8
1110  	MOVQ  R8, 96(AX)
1111  
1112  	// Iteration 13
1113  	MULXQ 104(CX), R8, BX
1114  	ADCXQ DI, R8
1115  	ADOXQ 104(AX), R8
1116  	MOVQ  R8, 104(AX)
1117  
1118  	// Iteration 14
1119  	MULXQ 112(CX), R8, DI
1120  	ADCXQ BX, R8
1121  	ADOXQ 112(AX), R8
1122  	MOVQ  R8, 112(AX)
1123  
1124  	// Iteration 15
1125  	MULXQ 120(CX), R8, BX
1126  	ADCXQ DI, R8
1127  	ADOXQ 120(AX), R8
1128  	MOVQ  R8, 120(AX)
1129  
1130  	// Iteration 16
1131  	MULXQ 128(CX), R8, DI
1132  	ADCXQ BX, R8
1133  	ADOXQ 128(AX), R8
1134  	MOVQ  R8, 128(AX)
1135  
1136  	// Iteration 17
1137  	MULXQ 136(CX), R8, BX
1138  	ADCXQ DI, R8
1139  	ADOXQ 136(AX), R8
1140  	MOVQ  R8, 136(AX)
1141  
1142  	// Iteration 18
1143  	MULXQ 144(CX), R8, DI
1144  	ADCXQ BX, R8
1145  	ADOXQ 144(AX), R8
1146  	MOVQ  R8, 144(AX)
1147  
1148  	// Iteration 19
1149  	MULXQ 152(CX), R8, BX
1150  	ADCXQ DI, R8
1151  	ADOXQ 152(AX), R8
1152  	MOVQ  R8, 152(AX)
1153  
1154  	// Iteration 20
1155  	MULXQ 160(CX), R8, DI
1156  	ADCXQ BX, R8
1157  	ADOXQ 160(AX), R8
1158  	MOVQ  R8, 160(AX)
1159  
1160  	// Iteration 21
1161  	MULXQ 168(CX), R8, BX
1162  	ADCXQ DI, R8
1163  	ADOXQ 168(AX), R8
1164  	MOVQ  R8, 168(AX)
1165  
1166  	// Iteration 22
1167  	MULXQ 176(CX), R8, DI
1168  	ADCXQ BX, R8
1169  	ADOXQ 176(AX), R8
1170  	MOVQ  R8, 176(AX)
1171  
1172  	// Iteration 23
1173  	MULXQ 184(CX), R8, BX
1174  	ADCXQ DI, R8
1175  	ADOXQ 184(AX), R8
1176  	MOVQ  R8, 184(AX)
1177  
1178  	// Iteration 24
1179  	MULXQ 192(CX), R8, DI
1180  	ADCXQ BX, R8
1181  	ADOXQ 192(AX), R8
1182  	MOVQ  R8, 192(AX)
1183  
1184  	// Iteration 25
1185  	MULXQ 200(CX), R8, BX
1186  	ADCXQ DI, R8
1187  	ADOXQ 200(AX), R8
1188  	MOVQ  R8, 200(AX)
1189  
1190  	// Iteration 26
1191  	MULXQ 208(CX), R8, DI
1192  	ADCXQ BX, R8
1193  	ADOXQ 208(AX), R8
1194  	MOVQ  R8, 208(AX)
1195  
1196  	// Iteration 27
1197  	MULXQ 216(CX), R8, BX
1198  	ADCXQ DI, R8
1199  	ADOXQ 216(AX), R8
1200  	MOVQ  R8, 216(AX)
1201  
1202  	// Iteration 28
1203  	MULXQ 224(CX), R8, DI
1204  	ADCXQ BX, R8
1205  	ADOXQ 224(AX), R8
1206  	MOVQ  R8, 224(AX)
1207  
1208  	// Iteration 29
1209  	MULXQ 232(CX), R8, BX
1210  	ADCXQ DI, R8
1211  	ADOXQ 232(AX), R8
1212  	MOVQ  R8, 232(AX)
1213  
1214  	// Iteration 30
1215  	MULXQ 240(CX), R8, DI
1216  	ADCXQ BX, R8
1217  	ADOXQ 240(AX), R8
1218  	MOVQ  R8, 240(AX)
1219  
1220  	// Iteration 31
1221  	MULXQ 248(CX), R8, BX
1222  	ADCXQ DI, R8
1223  	ADOXQ 248(AX), R8
1224  	MOVQ  R8, 248(AX)
1225  
1226  	// Add back carry flags and return
1227  	ADCXQ SI, BX
1228  	ADOXQ SI, BX
1229  	MOVQ  BX, c+24(FP)
1230  	RET
1231