Text file src/vendor/golang.org/x/crypto/curve25519/internal/field/fe_amd64.s

     1  // Code generated by command: go run fe_amd64_asm.go -out ../fe_amd64.s -stubs ../fe_amd64.go -pkg field. DO NOT EDIT.
     2  
     3  //go:build amd64 && gc && !purego
     4  // +build amd64,gc,!purego
     5  
     6  #include "textflag.h"
     7  
     8  // func feMul(out *Element, a *Element, b *Element)
     9  TEXT ·feMul(SB), NOSPLIT, $0-24
    10  	MOVQ a+8(FP), CX
    11  	MOVQ b+16(FP), BX
    12  
    13  	// r0 = a0×b0
    14  	MOVQ (CX), AX
    15  	MULQ (BX)
    16  	MOVQ AX, DI
    17  	MOVQ DX, SI
    18  
    19  	// r0 += 19×a1×b4
    20  	MOVQ   8(CX), AX
    21  	IMUL3Q $0x13, AX, AX
    22  	MULQ   32(BX)
    23  	ADDQ   AX, DI
    24  	ADCQ   DX, SI
    25  
    26  	// r0 += 19×a2×b3
    27  	MOVQ   16(CX), AX
    28  	IMUL3Q $0x13, AX, AX
    29  	MULQ   24(BX)
    30  	ADDQ   AX, DI
    31  	ADCQ   DX, SI
    32  
    33  	// r0 += 19×a3×b2
    34  	MOVQ   24(CX), AX
    35  	IMUL3Q $0x13, AX, AX
    36  	MULQ   16(BX)
    37  	ADDQ   AX, DI
    38  	ADCQ   DX, SI
    39  
    40  	// r0 += 19×a4×b1
    41  	MOVQ   32(CX), AX
    42  	IMUL3Q $0x13, AX, AX
    43  	MULQ   8(BX)
    44  	ADDQ   AX, DI
    45  	ADCQ   DX, SI
    46  
    47  	// r1 = a0×b1
    48  	MOVQ (CX), AX
    49  	MULQ 8(BX)
    50  	MOVQ AX, R9
    51  	MOVQ DX, R8
    52  
    53  	// r1 += a1×b0
    54  	MOVQ 8(CX), AX
    55  	MULQ (BX)
    56  	ADDQ AX, R9
    57  	ADCQ DX, R8
    58  
    59  	// r1 += 19×a2×b4
    60  	MOVQ   16(CX), AX
    61  	IMUL3Q $0x13, AX, AX
    62  	MULQ   32(BX)
    63  	ADDQ   AX, R9
    64  	ADCQ   DX, R8
    65  
    66  	// r1 += 19×a3×b3
    67  	MOVQ   24(CX), AX
    68  	IMUL3Q $0x13, AX, AX
    69  	MULQ   24(BX)
    70  	ADDQ   AX, R9
    71  	ADCQ   DX, R8
    72  
    73  	// r1 += 19×a4×b2
    74  	MOVQ   32(CX), AX
    75  	IMUL3Q $0x13, AX, AX
    76  	MULQ   16(BX)
    77  	ADDQ   AX, R9
    78  	ADCQ   DX, R8
    79  
    80  	// r2 = a0×b2
    81  	MOVQ (CX), AX
    82  	MULQ 16(BX)
    83  	MOVQ AX, R11
    84  	MOVQ DX, R10
    85  
    86  	// r2 += a1×b1
    87  	MOVQ 8(CX), AX
    88  	MULQ 8(BX)
    89  	ADDQ AX, R11
    90  	ADCQ DX, R10
    91  
    92  	// r2 += a2×b0
    93  	MOVQ 16(CX), AX
    94  	MULQ (BX)
    95  	ADDQ AX, R11
    96  	ADCQ DX, R10
    97  
    98  	// r2 += 19×a3×b4
    99  	MOVQ   24(CX), AX
   100  	IMUL3Q $0x13, AX, AX
   101  	MULQ   32(BX)
   102  	ADDQ   AX, R11
   103  	ADCQ   DX, R10
   104  
   105  	// r2 += 19×a4×b3
   106  	MOVQ   32(CX), AX
   107  	IMUL3Q $0x13, AX, AX
   108  	MULQ   24(BX)
   109  	ADDQ   AX, R11
   110  	ADCQ   DX, R10
   111  
   112  	// r3 = a0×b3
   113  	MOVQ (CX), AX
   114  	MULQ 24(BX)
   115  	MOVQ AX, R13
   116  	MOVQ DX, R12
   117  
   118  	// r3 += a1×b2
   119  	MOVQ 8(CX), AX
   120  	MULQ 16(BX)
   121  	ADDQ AX, R13
   122  	ADCQ DX, R12
   123  
   124  	// r3 += a2×b1
   125  	MOVQ 16(CX), AX
   126  	MULQ 8(BX)
   127  	ADDQ AX, R13
   128  	ADCQ DX, R12
   129  
   130  	// r3 += a3×b0
   131  	MOVQ 24(CX), AX
   132  	MULQ (BX)
   133  	ADDQ AX, R13
   134  	ADCQ DX, R12
   135  
   136  	// r3 += 19×a4×b4
   137  	MOVQ   32(CX), AX
   138  	IMUL3Q $0x13, AX, AX
   139  	MULQ   32(BX)
   140  	ADDQ   AX, R13
   141  	ADCQ   DX, R12
   142  
   143  	// r4 = a0×b4
   144  	MOVQ (CX), AX
   145  	MULQ 32(BX)
   146  	MOVQ AX, R15
   147  	MOVQ DX, R14
   148  
   149  	// r4 += a1×b3
   150  	MOVQ 8(CX), AX
   151  	MULQ 24(BX)
   152  	ADDQ AX, R15
   153  	ADCQ DX, R14
   154  
   155  	// r4 += a2×b2
   156  	MOVQ 16(CX), AX
   157  	MULQ 16(BX)
   158  	ADDQ AX, R15
   159  	ADCQ DX, R14
   160  
   161  	// r4 += a3×b1
   162  	MOVQ 24(CX), AX
   163  	MULQ 8(BX)
   164  	ADDQ AX, R15
   165  	ADCQ DX, R14
   166  
   167  	// r4 += a4×b0
   168  	MOVQ 32(CX), AX
   169  	MULQ (BX)
   170  	ADDQ AX, R15
   171  	ADCQ DX, R14
   172  
   173  	// First reduction chain
   174  	MOVQ   $0x0007ffffffffffff, AX
   175  	SHLQ   $0x0d, DI, SI
   176  	SHLQ   $0x0d, R9, R8
   177  	SHLQ   $0x0d, R11, R10
   178  	SHLQ   $0x0d, R13, R12
   179  	SHLQ   $0x0d, R15, R14
   180  	ANDQ   AX, DI
   181  	IMUL3Q $0x13, R14, R14
   182  	ADDQ   R14, DI
   183  	ANDQ   AX, R9
   184  	ADDQ   SI, R9
   185  	ANDQ   AX, R11
   186  	ADDQ   R8, R11
   187  	ANDQ   AX, R13
   188  	ADDQ   R10, R13
   189  	ANDQ   AX, R15
   190  	ADDQ   R12, R15
   191  
   192  	// Second reduction chain (carryPropagate)
   193  	MOVQ   DI, SI
   194  	SHRQ   $0x33, SI
   195  	MOVQ   R9, R8
   196  	SHRQ   $0x33, R8
   197  	MOVQ   R11, R10
   198  	SHRQ   $0x33, R10
   199  	MOVQ   R13, R12
   200  	SHRQ   $0x33, R12
   201  	MOVQ   R15, R14
   202  	SHRQ   $0x33, R14
   203  	ANDQ   AX, DI
   204  	IMUL3Q $0x13, R14, R14
   205  	ADDQ   R14, DI
   206  	ANDQ   AX, R9
   207  	ADDQ   SI, R9
   208  	ANDQ   AX, R11
   209  	ADDQ   R8, R11
   210  	ANDQ   AX, R13
   211  	ADDQ   R10, R13
   212  	ANDQ   AX, R15
   213  	ADDQ   R12, R15
   214  
   215  	// Store output
   216  	MOVQ out+0(FP), AX
   217  	MOVQ DI, (AX)
   218  	MOVQ R9, 8(AX)
   219  	MOVQ R11, 16(AX)
   220  	MOVQ R13, 24(AX)
   221  	MOVQ R15, 32(AX)
   222  	RET
   223  
   224  // func feSquare(out *Element, a *Element)
   225  TEXT ·feSquare(SB), NOSPLIT, $0-16
   226  	MOVQ a+8(FP), CX
   227  
   228  	// r0 = l0×l0
   229  	MOVQ (CX), AX
   230  	MULQ (CX)
   231  	MOVQ AX, SI
   232  	MOVQ DX, BX
   233  
   234  	// r0 += 38×l1×l4
   235  	MOVQ   8(CX), AX
   236  	IMUL3Q $0x26, AX, AX
   237  	MULQ   32(CX)
   238  	ADDQ   AX, SI
   239  	ADCQ   DX, BX
   240  
   241  	// r0 += 38×l2×l3
   242  	MOVQ   16(CX), AX
   243  	IMUL3Q $0x26, AX, AX
   244  	MULQ   24(CX)
   245  	ADDQ   AX, SI
   246  	ADCQ   DX, BX
   247  
   248  	// r1 = 2×l0×l1
   249  	MOVQ (CX), AX
   250  	SHLQ $0x01, AX
   251  	MULQ 8(CX)
   252  	MOVQ AX, R8
   253  	MOVQ DX, DI
   254  
   255  	// r1 += 38×l2×l4
   256  	MOVQ   16(CX), AX
   257  	IMUL3Q $0x26, AX, AX
   258  	MULQ   32(CX)
   259  	ADDQ   AX, R8
   260  	ADCQ   DX, DI
   261  
   262  	// r1 += 19×l3×l3
   263  	MOVQ   24(CX), AX
   264  	IMUL3Q $0x13, AX, AX
   265  	MULQ   24(CX)
   266  	ADDQ   AX, R8
   267  	ADCQ   DX, DI
   268  
   269  	// r2 = 2×l0×l2
   270  	MOVQ (CX), AX
   271  	SHLQ $0x01, AX
   272  	MULQ 16(CX)
   273  	MOVQ AX, R10
   274  	MOVQ DX, R9
   275  
   276  	// r2 += l1×l1
   277  	MOVQ 8(CX), AX
   278  	MULQ 8(CX)
   279  	ADDQ AX, R10
   280  	ADCQ DX, R9
   281  
   282  	// r2 += 38×l3×l4
   283  	MOVQ   24(CX), AX
   284  	IMUL3Q $0x26, AX, AX
   285  	MULQ   32(CX)
   286  	ADDQ   AX, R10
   287  	ADCQ   DX, R9
   288  
   289  	// r3 = 2×l0×l3
   290  	MOVQ (CX), AX
   291  	SHLQ $0x01, AX
   292  	MULQ 24(CX)
   293  	MOVQ AX, R12
   294  	MOVQ DX, R11
   295  
   296  	// r3 += 2×l1×l2
   297  	MOVQ   8(CX), AX
   298  	IMUL3Q $0x02, AX, AX
   299  	MULQ   16(CX)
   300  	ADDQ   AX, R12
   301  	ADCQ   DX, R11
   302  
   303  	// r3 += 19×l4×l4
   304  	MOVQ   32(CX), AX
   305  	IMUL3Q $0x13, AX, AX
   306  	MULQ   32(CX)
   307  	ADDQ   AX, R12
   308  	ADCQ   DX, R11
   309  
   310  	// r4 = 2×l0×l4
   311  	MOVQ (CX), AX
   312  	SHLQ $0x01, AX
   313  	MULQ 32(CX)
   314  	MOVQ AX, R14
   315  	MOVQ DX, R13
   316  
   317  	// r4 += 2×l1×l3
   318  	MOVQ   8(CX), AX
   319  	IMUL3Q $0x02, AX, AX
   320  	MULQ   24(CX)
   321  	ADDQ   AX, R14
   322  	ADCQ   DX, R13
   323  
   324  	// r4 += l2×l2
   325  	MOVQ 16(CX), AX
   326  	MULQ 16(CX)
   327  	ADDQ AX, R14
   328  	ADCQ DX, R13
   329  
   330  	// First reduction chain
   331  	MOVQ   $0x0007ffffffffffff, AX
   332  	SHLQ   $0x0d, SI, BX
   333  	SHLQ   $0x0d, R8, DI
   334  	SHLQ   $0x0d, R10, R9
   335  	SHLQ   $0x0d, R12, R11
   336  	SHLQ   $0x0d, R14, R13
   337  	ANDQ   AX, SI
   338  	IMUL3Q $0x13, R13, R13
   339  	ADDQ   R13, SI
   340  	ANDQ   AX, R8
   341  	ADDQ   BX, R8
   342  	ANDQ   AX, R10
   343  	ADDQ   DI, R10
   344  	ANDQ   AX, R12
   345  	ADDQ   R9, R12
   346  	ANDQ   AX, R14
   347  	ADDQ   R11, R14
   348  
   349  	// Second reduction chain (carryPropagate)
   350  	MOVQ   SI, BX
   351  	SHRQ   $0x33, BX
   352  	MOVQ   R8, DI
   353  	SHRQ   $0x33, DI
   354  	MOVQ   R10, R9
   355  	SHRQ   $0x33, R9
   356  	MOVQ   R12, R11
   357  	SHRQ   $0x33, R11
   358  	MOVQ   R14, R13
   359  	SHRQ   $0x33, R13
   360  	ANDQ   AX, SI
   361  	IMUL3Q $0x13, R13, R13
   362  	ADDQ   R13, SI
   363  	ANDQ   AX, R8
   364  	ADDQ   BX, R8
   365  	ANDQ   AX, R10
   366  	ADDQ   DI, R10
   367  	ANDQ   AX, R12
   368  	ADDQ   R9, R12
   369  	ANDQ   AX, R14
   370  	ADDQ   R11, R14
   371  
   372  	// Store output
   373  	MOVQ out+0(FP), AX
   374  	MOVQ SI, (AX)
   375  	MOVQ R8, 8(AX)
   376  	MOVQ R10, 16(AX)
   377  	MOVQ R12, 24(AX)
   378  	MOVQ R14, 32(AX)
   379  	RET
   380  

View as plain text