github.com/consensys/gnark-crypto@v0.14.0/ecc/bls12-381/internal/fptower/e2_amd64.s (about)

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