github.com/deroproject/derosuite@v2.1.6-1.0.20200307070847-0f2e589c7a2b+incompatible/crypto/edwards25519_femul_amd64.s (about)

     1  // Copyright (c) 2017 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  // +build amd64
     6  
     7  #include "textflag.h"
     8  
     9  // func FeMul(outp *uint64, xp *uint64, yp *uint64)
    10  TEXT ·FeMul(SB),NOSPLIT,$0
    11  	MOVQ outp+0(FP), DI
    12  	MOVQ xp+8(FP), BX
    13  	MOVQ yp+16(FP), CX
    14  
    15  	// Calculate r0
    16  	MOVQ 0(BX), AX     // rax <-- x0
    17  	MULQ 0(CX)         // rdx, rax <-- x0*y0
    18  	MOVQ AX, SI        // r00 = rax
    19  	MOVQ DX, BP        // r01 = rdx
    20  
    21  	MOVQ 8(BX), DX     // rdx <-- x1
    22  	IMUL3Q $19, DX, AX // rax <-- x1*19
    23  	MULQ 32(CX)        // rdx, rax <-- x1_19*y4
    24  	ADDQ AX, SI        // r00 += rax
    25  	ADCQ DX, BP        // r01 += rdx
    26  
    27  	MOVQ 16(BX), DX    // rdx <-- x2
    28  	IMUL3Q $19, DX, AX // rax <-- x2*19
    29  	MULQ 24(CX)        // rdx, rax <-- x2_19*y3
    30  	ADDQ AX, SI        // r00 += rax
    31  	ADCQ DX, BP        // r01 += rdx
    32  
    33  	MOVQ 24(BX), DX    // rdx <-- x3
    34  	IMUL3Q $19, DX, AX // rax <-- x3*19
    35  	MULQ 16(CX)        // rdx, rax <-- x3_19 * y2
    36  	ADDQ AX, SI        // r00 += rax
    37  	ADCQ DX, BP        // r01 += rdx
    38  
    39  	MOVQ 32(BX), DX    // rdx <-- x4
    40  	IMUL3Q $19, DX, AX // rax <-- x4*19
    41  	MULQ 8(CX)         // rdx rax <-- x4_19*y1
    42  	ADDQ AX, SI        // r00 += rax
    43  	ADCQ DX, BP        // r01 += rdx
    44  
    45  	// Calculate r1
    46  	MOVQ 0(BX), AX
    47  	MULQ 8(CX)
    48  	MOVQ AX, R8 // r10
    49  	MOVQ DX, R9 // r11
    50  
    51  	MOVQ 8(BX), AX
    52  	MULQ 0(CX)
    53  	ADDQ AX, R8
    54  	ADCQ DX, R9
    55  
    56  	MOVQ 16(BX), DX
    57  	IMUL3Q $19, DX, AX
    58  	MULQ 32(CX)
    59  	ADDQ AX, R8
    60  	ADCQ DX, R9
    61  
    62  	MOVQ 24(BX), DX
    63  	IMUL3Q $19, DX, AX
    64  	MULQ 24(CX)
    65  	ADDQ AX, R8
    66  	ADCQ DX, R9
    67  
    68  	MOVQ 32(BX), DX
    69  	IMUL3Q $19, DX, AX
    70  	MULQ 16(CX)
    71  	ADDQ AX, R8
    72  	ADCQ DX, R9
    73  
    74  	// Calculate r2
    75  	MOVQ 0(BX), AX
    76  	MULQ 16(CX)
    77  	MOVQ AX, R10 // r20
    78  	MOVQ DX, R11 // r21
    79  
    80  	MOVQ 8(BX), AX
    81  	MULQ 8(CX)
    82  	ADDQ AX, R10
    83  	ADCQ DX, R11
    84  
    85  	MOVQ 16(BX), AX
    86  	MULQ 0(CX)
    87  	ADDQ AX, R10
    88  	ADCQ DX, R11
    89  
    90  	MOVQ 24(BX), DX
    91  	IMUL3Q $19, DX, AX
    92  	MULQ 32(CX)
    93  	ADDQ AX, R10
    94  	ADCQ DX, R11
    95  
    96  	MOVQ 32(BX), DX
    97  	IMUL3Q $19, DX, AX
    98  	MULQ 24(CX)
    99  	ADDQ AX, R10
   100  	ADCQ DX, R11
   101  
   102  	// Calculate r3
   103  	MOVQ 0(BX), AX
   104  	MULQ 24(CX)
   105  	MOVQ AX, R12 // r30
   106  	MOVQ DX, R13 // r31
   107  
   108  	MOVQ 8(BX), AX
   109  	MULQ 16(CX)
   110  	ADDQ AX, R12
   111  	ADCQ DX, R13
   112  
   113  	MOVQ 16(BX), AX
   114  	MULQ 8(CX)
   115  	ADDQ AX, R12
   116  	ADCQ DX, R13
   117  
   118  	MOVQ 24(BX), AX
   119  	MULQ 0(CX)
   120  	ADDQ AX, R12
   121  	ADCQ DX, R13
   122  
   123  	MOVQ 32(BX), DX
   124  	IMUL3Q $19, DX, AX
   125  	MULQ 32(CX)
   126  	ADDQ AX, R12
   127  	ADCQ DX, R13
   128  
   129  	// Calculate r4
   130  	MOVQ 0(BX), AX
   131  	MULQ 32(CX)
   132  	MOVQ AX, R14 // r40
   133  	MOVQ DX, R15 // r41
   134  
   135  	MOVQ 8(BX), AX
   136  	MULQ 24(CX)
   137  	ADDQ AX, R14
   138  	ADCQ DX, R15
   139  
   140  	MOVQ 16(BX), AX
   141  	MULQ 16(CX)
   142  	ADDQ AX, R14
   143  	ADCQ DX, R15
   144  
   145  	MOVQ 24(BX), AX
   146  	MULQ 8(CX)
   147  	ADDQ AX, R14
   148  	ADCQ DX, R15
   149  
   150  	MOVQ 32(BX), AX
   151  	MULQ 0(CX)
   152  	ADDQ AX, R14
   153  	ADCQ DX, R15
   154  
   155  
   156  	MOVQ $2251799813685247, AX // (1<<51) - 1
   157  	SHLQ $13, SI, BP     // r01 = shld with r00
   158  	ANDQ AX, SI          // r00 &= mask51
   159  	SHLQ $13, R8, R9     // r11 = shld with r10
   160  	ANDQ AX, R8          // r10 &= mask51
   161  	ADDQ BP, R8          // r10 += r01
   162  	SHLQ $13, R10, R11   // r21 = shld with r20
   163  	ANDQ AX, R10         // r20 &= mask51
   164  	ADDQ R9, R10         // r20 += r11
   165  	SHLQ $13, R12, R13   // r31 = shld with r30
   166  	ANDQ AX, R12         // r30 &= mask51
   167  	ADDQ R11, R12        // r30 += r21
   168  	SHLQ $13, R14, R15   // r41 = shld with r40
   169  	ANDQ AX, R14         // r40 &= mask51
   170  	ADDQ R13, R14        // r40 += r31
   171  	IMUL3Q $19, R15, R15 // r41 = r41*19
   172  	ADDQ R15, SI         // r00 += r41
   173  
   174  	MOVQ SI, DX          // rdx <-- r00
   175  	SHRQ $51, DX         // rdx <-- r00 >> 51
   176  	ADDQ DX, R8          // r10 += r00 >> 51
   177  	MOVQ R8, DX          // rdx <-- r10
   178  	SHRQ $51, DX         // rdx <-- r10 >> 51
   179  	ANDQ AX, SI          // r00 &= mask51
   180  	ADDQ DX, R10         // r20 += r10 >> 51
   181  	MOVQ R10, DX         // rdx <-- r20
   182  	SHRQ $51, DX         // rdx <-- r20 >> 51
   183  	ANDQ AX, R8          // r10 &= mask51
   184  	ADDQ DX, R12         // r30 += r20 >> 51
   185  	MOVQ R12, DX         // rdx <-- r30
   186  	SHRQ $51, DX         // rdx <-- r30 >> 51
   187  	ANDQ AX, R10         // r20 &= mask51
   188  	ADDQ DX, R14         // r40 += r30 >> 51
   189  	MOVQ R14, DX         // rdx <-- r40
   190  	SHRQ $51, DX         // rdx <-- r40 >> 51
   191  	ANDQ AX, R12         // r30 &= mask51
   192  	IMUL3Q $19, DX, DX   // rdx <-- (r40 >> 51) * 19
   193  	ADDQ DX, SI          // r00 += (r40 >> 51) *19
   194  	ANDQ AX, R14         // r40 &= mask51
   195  
   196  	MOVQ SI, 0(DI)
   197  	MOVQ R8, 8(DI)
   198  	MOVQ R10, 16(DI)
   199  	MOVQ R12, 24(DI)
   200  	MOVQ R14, 32(DI)
   201  	RET
   202