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