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

View as plain text