Text file src/crypto/internal/fips140/nistec/p256_asm_amd64.s

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

View as plain text