fe_amd64.s raw

   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  
 233  // func feSquare(out *Element, a *Element)
 234  TEXT ·feSquare(SB), NOSPLIT, $0-16
 235  	MOVQ a+8(FP), CX
 236  
 237  	// r0 = l0×l0
 238  	MOVQ (CX), AX
 239  	MULQ (CX)
 240  	MOVQ AX, SI
 241  	MOVQ DX, BX
 242  
 243  	// r0 += 38×l1×l4
 244  	MOVQ 8(CX), DX
 245  	LEAQ (DX)(DX*8), AX
 246  	LEAQ (DX)(AX*2), AX
 247  	SHLQ $0x01, AX
 248  	MULQ 32(CX)
 249  	ADDQ AX, SI
 250  	ADCQ DX, BX
 251  
 252  	// r0 += 38×l2×l3
 253  	MOVQ 16(CX), DX
 254  	LEAQ (DX)(DX*8), AX
 255  	LEAQ (DX)(AX*2), AX
 256  	SHLQ $0x01, AX
 257  	MULQ 24(CX)
 258  	ADDQ AX, SI
 259  	ADCQ DX, BX
 260  
 261  	// r1 = 2×l0×l1
 262  	MOVQ (CX), AX
 263  	SHLQ $0x01, AX
 264  	MULQ 8(CX)
 265  	MOVQ AX, R8
 266  	MOVQ DX, DI
 267  
 268  	// r1 += 38×l2×l4
 269  	MOVQ 16(CX), DX
 270  	LEAQ (DX)(DX*8), AX
 271  	LEAQ (DX)(AX*2), AX
 272  	SHLQ $0x01, AX
 273  	MULQ 32(CX)
 274  	ADDQ AX, R8
 275  	ADCQ DX, DI
 276  
 277  	// r1 += 19×l3×l3
 278  	MOVQ 24(CX), DX
 279  	LEAQ (DX)(DX*8), AX
 280  	LEAQ (DX)(AX*2), AX
 281  	MULQ 24(CX)
 282  	ADDQ AX, R8
 283  	ADCQ DX, DI
 284  
 285  	// r2 = 2×l0×l2
 286  	MOVQ (CX), AX
 287  	SHLQ $0x01, AX
 288  	MULQ 16(CX)
 289  	MOVQ AX, R10
 290  	MOVQ DX, R9
 291  
 292  	// r2 += l1×l1
 293  	MOVQ 8(CX), AX
 294  	MULQ 8(CX)
 295  	ADDQ AX, R10
 296  	ADCQ DX, R9
 297  
 298  	// r2 += 38×l3×l4
 299  	MOVQ 24(CX), DX
 300  	LEAQ (DX)(DX*8), AX
 301  	LEAQ (DX)(AX*2), AX
 302  	SHLQ $0x01, AX
 303  	MULQ 32(CX)
 304  	ADDQ AX, R10
 305  	ADCQ DX, R9
 306  
 307  	// r3 = 2×l0×l3
 308  	MOVQ (CX), AX
 309  	SHLQ $0x01, AX
 310  	MULQ 24(CX)
 311  	MOVQ AX, R12
 312  	MOVQ DX, R11
 313  
 314  	// r3 += 2×l1×l2
 315  	MOVQ 8(CX), AX
 316  	SHLQ $0x01, AX
 317  	MULQ 16(CX)
 318  	ADDQ AX, R12
 319  	ADCQ DX, R11
 320  
 321  	// r3 += 19×l4×l4
 322  	MOVQ 32(CX), DX
 323  	LEAQ (DX)(DX*8), AX
 324  	LEAQ (DX)(AX*2), AX
 325  	MULQ 32(CX)
 326  	ADDQ AX, R12
 327  	ADCQ DX, R11
 328  
 329  	// r4 = 2×l0×l4
 330  	MOVQ (CX), AX
 331  	SHLQ $0x01, AX
 332  	MULQ 32(CX)
 333  	MOVQ AX, R14
 334  	MOVQ DX, R13
 335  
 336  	// r4 += 2×l1×l3
 337  	MOVQ 8(CX), AX
 338  	SHLQ $0x01, AX
 339  	MULQ 24(CX)
 340  	ADDQ AX, R14
 341  	ADCQ DX, R13
 342  
 343  	// r4 += l2×l2
 344  	MOVQ 16(CX), AX
 345  	MULQ 16(CX)
 346  	ADDQ AX, R14
 347  	ADCQ DX, R13
 348  
 349  	// First reduction chain
 350  	MOVQ   $0x0007ffffffffffff, AX
 351  	SHLQ   $0x0d, SI, BX
 352  	SHLQ   $0x0d, R8, DI
 353  	SHLQ   $0x0d, R10, R9
 354  	SHLQ   $0x0d, R12, R11
 355  	SHLQ   $0x0d, R14, R13
 356  	ANDQ   AX, SI
 357  	IMUL3Q $0x13, R13, R13
 358  	ADDQ   R13, SI
 359  	ANDQ   AX, R8
 360  	ADDQ   BX, R8
 361  	ANDQ   AX, R10
 362  	ADDQ   DI, R10
 363  	ANDQ   AX, R12
 364  	ADDQ   R9, R12
 365  	ANDQ   AX, R14
 366  	ADDQ   R11, R14
 367  
 368  	// Second reduction chain (carryPropagate)
 369  	MOVQ   SI, BX
 370  	SHRQ   $0x33, BX
 371  	MOVQ   R8, DI
 372  	SHRQ   $0x33, DI
 373  	MOVQ   R10, R9
 374  	SHRQ   $0x33, R9
 375  	MOVQ   R12, R11
 376  	SHRQ   $0x33, R11
 377  	MOVQ   R14, R13
 378  	SHRQ   $0x33, R13
 379  	ANDQ   AX, SI
 380  	IMUL3Q $0x13, R13, R13
 381  	ADDQ   R13, SI
 382  	ANDQ   AX, R8
 383  	ADDQ   BX, R8
 384  	ANDQ   AX, R10
 385  	ADDQ   DI, R10
 386  	ANDQ   AX, R12
 387  	ADDQ   R9, R12
 388  	ANDQ   AX, R14
 389  	ADDQ   R11, R14
 390  
 391  	// Store output
 392  	MOVQ out+0(FP), AX
 393  	MOVQ SI, (AX)
 394  	MOVQ R8, 8(AX)
 395  	MOVQ R10, 16(AX)
 396  	MOVQ R12, 24(AX)
 397  	MOVQ R14, 32(AX)
 398  	RET
 399