github.com/twelsh-aw/go/src@v0.0.0-20230516233729-a56fe86a7c81/crypto/internal/edwards25519/field/fe_amd64.s (about) 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