Text file src/crypto/internal/bigmod/nat_amd64.s

     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  

View as plain text