github.com/consensys/gnark-crypto@v0.14.0/ecc/bw6-633/fp/element_mul_amd64.s (about)

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