github.com/emmansun/gmsm@v0.29.1/internal/bigmod/nat_amd64.s (about)

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