Text file src/crypto/internal/fips140/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 !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), DX
    20  	LEAQ (DX)(DX*8), AX
    21  	LEAQ (DX)(AX*2), AX
    22  	MULQ 32(BX)
    23  	ADDQ AX, DI
    24  	ADCQ DX, SI
    25  
    26  	// r0 += 19×a2×b3
    27  	MOVQ 16(CX), DX
    28  	LEAQ (DX)(DX*8), AX
    29  	LEAQ (DX)(AX*2), AX
    30  	MULQ 24(BX)
    31  	ADDQ AX, DI
    32  	ADCQ DX, SI
    33  
    34  	// r0 += 19×a3×b2
    35  	MOVQ 24(CX), DX
    36  	LEAQ (DX)(DX*8), AX
    37  	LEAQ (DX)(AX*2), AX
    38  	MULQ 16(BX)
    39  	ADDQ AX, DI
    40  	ADCQ DX, SI
    41  
    42  	// r0 += 19×a4×b1
    43  	MOVQ 32(CX), DX
    44  	LEAQ (DX)(DX*8), AX
    45  	LEAQ (DX)(AX*2), AX
    46  	MULQ 8(BX)
    47  	ADDQ AX, DI
    48  	ADCQ DX, SI
    49  
    50  	// r1 = a0×b1
    51  	MOVQ (CX), AX
    52  	MULQ 8(BX)
    53  	MOVQ AX, R9
    54  	MOVQ DX, R8
    55  
    56  	// r1 += a1×b0
    57  	MOVQ 8(CX), AX
    58  	MULQ (BX)
    59  	ADDQ AX, R9
    60  	ADCQ DX, R8
    61  
    62  	// r1 += 19×a2×b4
    63  	MOVQ 16(CX), DX
    64  	LEAQ (DX)(DX*8), AX
    65  	LEAQ (DX)(AX*2), AX
    66  	MULQ 32(BX)
    67  	ADDQ AX, R9
    68  	ADCQ DX, R8
    69  
    70  	// r1 += 19×a3×b3
    71  	MOVQ 24(CX), DX
    72  	LEAQ (DX)(DX*8), AX
    73  	LEAQ (DX)(AX*2), AX
    74  	MULQ 24(BX)
    75  	ADDQ AX, R9
    76  	ADCQ DX, R8
    77  
    78  	// r1 += 19×a4×b2
    79  	MOVQ 32(CX), DX
    80  	LEAQ (DX)(DX*8), AX
    81  	LEAQ (DX)(AX*2), AX
    82  	MULQ 16(BX)
    83  	ADDQ AX, R9
    84  	ADCQ DX, R8
    85  
    86  	// r2 = a0×b2
    87  	MOVQ (CX), AX
    88  	MULQ 16(BX)
    89  	MOVQ AX, R11
    90  	MOVQ DX, R10
    91  
    92  	// r2 += a1×b1
    93  	MOVQ 8(CX), AX
    94  	MULQ 8(BX)
    95  	ADDQ AX, R11
    96  	ADCQ DX, R10
    97  
    98  	// r2 += a2×b0
    99  	MOVQ 16(CX), AX
   100  	MULQ (BX)
   101  	ADDQ AX, R11
   102  	ADCQ DX, R10
   103  
   104  	// r2 += 19×a3×b4
   105  	MOVQ 24(CX), DX
   106  	LEAQ (DX)(DX*8), AX
   107  	LEAQ (DX)(AX*2), AX
   108  	MULQ 32(BX)
   109  	ADDQ AX, R11
   110  	ADCQ DX, R10
   111  
   112  	// r2 += 19×a4×b3
   113  	MOVQ 32(CX), DX
   114  	LEAQ (DX)(DX*8), AX
   115  	LEAQ (DX)(AX*2), AX
   116  	MULQ 24(BX)
   117  	ADDQ AX, R11
   118  	ADCQ DX, R10
   119  
   120  	// r3 = a0×b3
   121  	MOVQ (CX), AX
   122  	MULQ 24(BX)
   123  	MOVQ AX, R13
   124  	MOVQ DX, R12
   125  
   126  	// r3 += a1×b2
   127  	MOVQ 8(CX), AX
   128  	MULQ 16(BX)
   129  	ADDQ AX, R13
   130  	ADCQ DX, R12
   131  
   132  	// r3 += a2×b1
   133  	MOVQ 16(CX), AX
   134  	MULQ 8(BX)
   135  	ADDQ AX, R13
   136  	ADCQ DX, R12
   137  
   138  	// r3 += a3×b0
   139  	MOVQ 24(CX), AX
   140  	MULQ (BX)
   141  	ADDQ AX, R13
   142  	ADCQ DX, R12
   143  
   144  	// r3 += 19×a4×b4
   145  	MOVQ 32(CX), DX
   146  	LEAQ (DX)(DX*8), AX
   147  	LEAQ (DX)(AX*2), AX
   148  	MULQ 32(BX)
   149  	ADDQ AX, R13
   150  	ADCQ DX, R12
   151  
   152  	// r4 = a0×b4
   153  	MOVQ (CX), AX
   154  	MULQ 32(BX)
   155  	MOVQ AX, R15
   156  	MOVQ DX, R14
   157  
   158  	// r4 += a1×b3
   159  	MOVQ 8(CX), AX
   160  	MULQ 24(BX)
   161  	ADDQ AX, R15
   162  	ADCQ DX, R14
   163  
   164  	// r4 += a2×b2
   165  	MOVQ 16(CX), AX
   166  	MULQ 16(BX)
   167  	ADDQ AX, R15
   168  	ADCQ DX, R14
   169  
   170  	// r4 += a3×b1
   171  	MOVQ 24(CX), AX
   172  	MULQ 8(BX)
   173  	ADDQ AX, R15
   174  	ADCQ DX, R14
   175  
   176  	// r4 += a4×b0
   177  	MOVQ 32(CX), AX
   178  	MULQ (BX)
   179  	ADDQ AX, R15
   180  	ADCQ DX, R14
   181  
   182  	// First reduction chain
   183  	MOVQ   $0x0007ffffffffffff, AX
   184  	SHLQ   $0x0d, DI, SI
   185  	SHLQ   $0x0d, R9, R8
   186  	SHLQ   $0x0d, R11, R10
   187  	SHLQ   $0x0d, R13, R12
   188  	SHLQ   $0x0d, R15, R14
   189  	ANDQ   AX, DI
   190  	IMUL3Q $0x13, R14, R14
   191  	ADDQ   R14, DI
   192  	ANDQ   AX, R9
   193  	ADDQ   SI, R9
   194  	ANDQ   AX, R11
   195  	ADDQ   R8, R11
   196  	ANDQ   AX, R13
   197  	ADDQ   R10, R13
   198  	ANDQ   AX, R15
   199  	ADDQ   R12, R15
   200  
   201  	// Second reduction chain (carryPropagate)
   202  	MOVQ   DI, SI
   203  	SHRQ   $0x33, SI
   204  	MOVQ   R9, R8
   205  	SHRQ   $0x33, R8
   206  	MOVQ   R11, R10
   207  	SHRQ   $0x33, R10
   208  	MOVQ   R13, R12
   209  	SHRQ   $0x33, R12
   210  	MOVQ   R15, R14
   211  	SHRQ   $0x33, R14
   212  	ANDQ   AX, DI
   213  	IMUL3Q $0x13, R14, R14
   214  	ADDQ   R14, DI
   215  	ANDQ   AX, R9
   216  	ADDQ   SI, R9
   217  	ANDQ   AX, R11
   218  	ADDQ   R8, R11
   219  	ANDQ   AX, R13
   220  	ADDQ   R10, R13
   221  	ANDQ   AX, R15
   222  	ADDQ   R12, R15
   223  
   224  	// Store output
   225  	MOVQ out+0(FP), AX
   226  	MOVQ DI, (AX)
   227  	MOVQ R9, 8(AX)
   228  	MOVQ R11, 16(AX)
   229  	MOVQ R13, 24(AX)
   230  	MOVQ R15, 32(AX)
   231  	RET
   232  

View as plain text