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