1 // Code generated by command: go run p256_asm.go -out ../p256_asm_amd64.s. DO NOT EDIT.
2
3 //go:build !purego
4
5 #include "textflag.h"
6
7 // func p256MovCond(res *P256Point, a *P256Point, b *P256Point, cond int)
8 // Requires: SSE2
9 TEXT ·p256MovCond(SB), NOSPLIT, $0-32
10 MOVQ res+0(FP), DI
11 MOVQ a+8(FP), SI
12 MOVQ b+16(FP), CX
13 MOVQ cond+24(FP), X12
14 PXOR X13, X13
15 PSHUFD $0x00, X12, X12
16 PCMPEQL X13, X12
17 MOVOU X12, X0
18 MOVOU (SI), X6
19 PANDN X6, X0
20 MOVOU X12, X1
21 MOVOU 16(SI), X7
22 PANDN X7, X1
23 MOVOU X12, X2
24 MOVOU 32(SI), X8
25 PANDN X8, X2
26 MOVOU X12, X3
27 MOVOU 48(SI), X9
28 PANDN X9, X3
29 MOVOU X12, X4
30 MOVOU 64(SI), X10
31 PANDN X10, X4
32 MOVOU X12, X5
33 MOVOU 80(SI), X11
34 PANDN X11, X5
35 MOVOU (CX), X6
36 MOVOU 16(CX), X7
37 MOVOU 32(CX), X8
38 MOVOU 48(CX), X9
39 MOVOU 64(CX), X10
40 MOVOU 80(CX), X11
41 PAND X12, X6
42 PAND X12, X7
43 PAND X12, X8
44 PAND X12, X9
45 PAND X12, X10
46 PAND X12, X11
47 PXOR X6, X0
48 PXOR X7, X1
49 PXOR X8, X2
50 PXOR X9, X3
51 PXOR X10, X4
52 PXOR X11, X5
53 MOVOU X0, (DI)
54 MOVOU X1, 16(DI)
55 MOVOU X2, 32(DI)
56 MOVOU X3, 48(DI)
57 MOVOU X4, 64(DI)
58 MOVOU X5, 80(DI)
59 RET
60
61 // func p256NegCond(val *p256Element, cond int)
62 // Requires: CMOV
63 TEXT ·p256NegCond(SB), NOSPLIT, $0-16
64 MOVQ val+0(FP), DI
65 MOVQ cond+8(FP), R14
66
67 // acc = poly
68 MOVQ $-1, R8
69 MOVQ p256const0<>+0(SB), R9
70 MOVQ $+0, R10
71 MOVQ p256const1<>+0(SB), R11
72
73 // Load the original value
74 MOVQ (DI), R13
75 MOVQ 8(DI), SI
76 MOVQ 16(DI), CX
77 MOVQ 24(DI), R15
78
79 // Speculatively subtract
80 SUBQ R13, R8
81 SBBQ SI, R9
82 SBBQ CX, R10
83 SBBQ R15, R11
84
85 // If condition is 0, keep original value
86 TESTQ R14, R14
87 CMOVQEQ R13, R8
88 CMOVQEQ SI, R9
89 CMOVQEQ CX, R10
90 CMOVQEQ R15, R11
91
92 // Store result
93 MOVQ R8, (DI)
94 MOVQ R9, 8(DI)
95 MOVQ R10, 16(DI)
96 MOVQ R11, 24(DI)
97 RET
98
99 DATA p256const0<>+0(SB)/8, $0x00000000ffffffff
100 GLOBL p256const0<>(SB), RODATA, $8
101
102 DATA p256const1<>+0(SB)/8, $0xffffffff00000001
103 GLOBL p256const1<>(SB), RODATA, $8
104
105 // func p256Sqr(res *p256Element, in *p256Element, n int)
106 // Requires: CMOV
107 TEXT ·p256Sqr(SB), NOSPLIT, $0-24
108 MOVQ res+0(FP), DI
109 MOVQ in+8(FP), SI
110 MOVQ n+16(FP), BX
111
112 sqrLoop:
113 // y[1:] * y[0]
114 MOVQ (SI), R14
115 MOVQ 8(SI), AX
116 MULQ R14
117 MOVQ AX, R9
118 MOVQ DX, R10
119 MOVQ 16(SI), AX
120 MULQ R14
121 ADDQ AX, R10
122 ADCQ $0x00, DX
123 MOVQ DX, R11
124 MOVQ 24(SI), AX
125 MULQ R14
126 ADDQ AX, R11
127 ADCQ $0x00, DX
128 MOVQ DX, R12
129
130 // y[2:] * y[1]
131 MOVQ 8(SI), R14
132 MOVQ 16(SI), AX
133 MULQ R14
134 ADDQ AX, R11
135 ADCQ $0x00, DX
136 MOVQ DX, R15
137 MOVQ 24(SI), AX
138 MULQ R14
139 ADDQ R15, R12
140 ADCQ $0x00, DX
141 ADDQ AX, R12
142 ADCQ $0x00, DX
143 MOVQ DX, R13
144
145 // y[3] * y[2]
146 MOVQ 16(SI), R14
147 MOVQ 24(SI), AX
148 MULQ R14
149 ADDQ AX, R13
150 ADCQ $0x00, DX
151 MOVQ DX, CX
152 XORQ R15, R15
153
154 // *2
155 ADDQ R9, R9
156 ADCQ R10, R10
157 ADCQ R11, R11
158 ADCQ R12, R12
159 ADCQ R13, R13
160 ADCQ CX, CX
161 ADCQ $0x00, R15
162
163 // Missing products
164 MOVQ (SI), AX
165 MULQ AX
166 MOVQ AX, R8
167 MOVQ DX, R14
168 MOVQ 8(SI), AX
169 MULQ AX
170 ADDQ R14, R9
171 ADCQ AX, R10
172 ADCQ $0x00, DX
173 MOVQ DX, R14
174 MOVQ 16(SI), AX
175 MULQ AX
176 ADDQ R14, R11
177 ADCQ AX, R12
178 ADCQ $0x00, DX
179 MOVQ DX, R14
180 MOVQ 24(SI), AX
181 MULQ AX
182 ADDQ R14, R13
183 ADCQ AX, CX
184 ADCQ DX, R15
185 MOVQ R15, SI
186
187 // First reduction step
188 MOVQ R8, AX
189 MOVQ R8, R15
190 SHLQ $0x20, R8
191 MULQ p256const1<>+0(SB)
192 SHRQ $0x20, R15
193 ADDQ R8, R9
194 ADCQ R15, R10
195 ADCQ AX, R11
196 ADCQ $0x00, DX
197 MOVQ DX, R8
198
199 // Second reduction step
200 MOVQ R9, AX
201 MOVQ R9, R15
202 SHLQ $0x20, R9
203 MULQ p256const1<>+0(SB)
204 SHRQ $0x20, R15
205 ADDQ R9, R10
206 ADCQ R15, R11
207 ADCQ AX, R8
208 ADCQ $0x00, DX
209 MOVQ DX, R9
210
211 // Third reduction step
212 MOVQ R10, AX
213 MOVQ R10, R15
214 SHLQ $0x20, R10
215 MULQ p256const1<>+0(SB)
216 SHRQ $0x20, R15
217 ADDQ R10, R11
218 ADCQ R15, R8
219 ADCQ AX, R9
220 ADCQ $0x00, DX
221 MOVQ DX, R10
222
223 // Last reduction step
224 XORQ R14, R14
225 MOVQ R11, AX
226 MOVQ R11, R15
227 SHLQ $0x20, R11
228 MULQ p256const1<>+0(SB)
229 SHRQ $0x20, R15
230 ADDQ R11, R8
231 ADCQ R15, R9
232 ADCQ AX, R10
233 ADCQ $0x00, DX
234 MOVQ DX, R11
235
236 // Add bits [511:256] of the sqr result
237 ADCQ R12, R8
238 ADCQ R13, R9
239 ADCQ CX, R10
240 ADCQ SI, R11
241 ADCQ $0x00, R14
242 MOVQ R8, R12
243 MOVQ R9, R13
244 MOVQ R10, CX
245 MOVQ R11, R15
246
247 // Subtract p256
248 SUBQ $-1, R8
249 SBBQ p256const0<>+0(SB), R9
250 SBBQ $0x00, R10
251 SBBQ p256const1<>+0(SB), R11
252 SBBQ $0x00, R14
253 CMOVQCS R12, R8
254 CMOVQCS R13, R9
255 CMOVQCS CX, R10
256 CMOVQCS R15, R11
257 MOVQ R8, (DI)
258 MOVQ R9, 8(DI)
259 MOVQ R10, 16(DI)
260 MOVQ R11, 24(DI)
261 MOVQ DI, SI
262 DECQ BX
263 JNE sqrLoop
264 RET
265
266 // func p256Mul(res *p256Element, in1 *p256Element, in2 *p256Element)
267 // Requires: CMOV
268 TEXT ·p256Mul(SB), NOSPLIT, $0-24
269 MOVQ res+0(FP), DI
270 MOVQ in1+8(FP), SI
271 MOVQ in2+16(FP), CX
272
273 // x * y[0]
274 MOVQ (CX), R14
275 MOVQ (SI), AX
276 MULQ R14
277 MOVQ AX, R8
278 MOVQ DX, R9
279 MOVQ 8(SI), AX
280 MULQ R14
281 ADDQ AX, R9
282 ADCQ $0x00, DX
283 MOVQ DX, R10
284 MOVQ 16(SI), AX
285 MULQ R14
286 ADDQ AX, R10
287 ADCQ $0x00, DX
288 MOVQ DX, R11
289 MOVQ 24(SI), AX
290 MULQ R14
291 ADDQ AX, R11
292 ADCQ $0x00, DX
293 MOVQ DX, R12
294 XORQ R13, R13
295
296 // First reduction step
297 MOVQ R8, AX
298 MOVQ R8, R15
299 SHLQ $0x20, R8
300 MULQ p256const1<>+0(SB)
301 SHRQ $0x20, R15
302 ADDQ R8, R9
303 ADCQ R15, R10
304 ADCQ AX, R11
305 ADCQ DX, R12
306 ADCQ $0x00, R13
307 XORQ R8, R8
308
309 // x * y[1]
310 MOVQ 8(CX), R14
311 MOVQ (SI), AX
312 MULQ R14
313 ADDQ AX, R9
314 ADCQ $0x00, DX
315 MOVQ DX, R15
316 MOVQ 8(SI), AX
317 MULQ R14
318 ADDQ R15, R10
319 ADCQ $0x00, DX
320 ADDQ AX, R10
321 ADCQ $0x00, DX
322 MOVQ DX, R15
323 MOVQ 16(SI), AX
324 MULQ R14
325 ADDQ R15, R11
326 ADCQ $0x00, DX
327 ADDQ AX, R11
328 ADCQ $0x00, DX
329 MOVQ DX, R15
330 MOVQ 24(SI), AX
331 MULQ R14
332 ADDQ R15, R12
333 ADCQ $0x00, DX
334 ADDQ AX, R12
335 ADCQ DX, R13
336 ADCQ $0x00, R8
337
338 // Second reduction step
339 MOVQ R9, AX
340 MOVQ R9, R15
341 SHLQ $0x20, R9
342 MULQ p256const1<>+0(SB)
343 SHRQ $0x20, R15
344 ADDQ R9, R10
345 ADCQ R15, R11
346 ADCQ AX, R12
347 ADCQ DX, R13
348 ADCQ $0x00, R8
349 XORQ R9, R9
350
351 // x * y[2]
352 MOVQ 16(CX), R14
353 MOVQ (SI), AX
354 MULQ R14
355 ADDQ AX, R10
356 ADCQ $0x00, DX
357 MOVQ DX, R15
358 MOVQ 8(SI), AX
359 MULQ R14
360 ADDQ R15, R11
361 ADCQ $0x00, DX
362 ADDQ AX, R11
363 ADCQ $0x00, DX
364 MOVQ DX, R15
365 MOVQ 16(SI), AX
366 MULQ R14
367 ADDQ R15, R12
368 ADCQ $0x00, DX
369 ADDQ AX, R12
370 ADCQ $0x00, DX
371 MOVQ DX, R15
372 MOVQ 24(SI), AX
373 MULQ R14
374 ADDQ R15, R13
375 ADCQ $0x00, DX
376 ADDQ AX, R13
377 ADCQ DX, R8
378 ADCQ $0x00, R9
379
380 // Third reduction step
381 MOVQ R10, AX
382 MOVQ R10, R15
383 SHLQ $0x20, R10
384 MULQ p256const1<>+0(SB)
385 SHRQ $0x20, R15
386 ADDQ R10, R11
387 ADCQ R15, R12
388 ADCQ AX, R13
389 ADCQ DX, R8
390 ADCQ $0x00, R9
391 XORQ R10, R10
392
393 // x * y[3]
394 MOVQ 24(CX), R14
395 MOVQ (SI), AX
396 MULQ R14
397 ADDQ AX, R11
398 ADCQ $0x00, DX
399 MOVQ DX, R15
400 MOVQ 8(SI), AX
401 MULQ R14
402 ADDQ R15, R12
403 ADCQ $0x00, DX
404 ADDQ AX, R12
405 ADCQ $0x00, DX
406 MOVQ DX, R15
407 MOVQ 16(SI), AX
408 MULQ R14
409 ADDQ R15, R13
410 ADCQ $0x00, DX
411 ADDQ AX, R13
412 ADCQ $0x00, DX
413 MOVQ DX, R15
414 MOVQ 24(SI), AX
415 MULQ R14
416 ADDQ R15, R8
417 ADCQ $0x00, DX
418 ADDQ AX, R8
419 ADCQ DX, R9
420 ADCQ $0x00, R10
421
422 // Last reduction step
423 MOVQ R11, AX
424 MOVQ R11, R15
425 SHLQ $0x20, R11
426 MULQ p256const1<>+0(SB)
427 SHRQ $0x20, R15
428 ADDQ R11, R12
429 ADCQ R15, R13
430 ADCQ AX, R8
431 ADCQ DX, R9
432 ADCQ $0x00, R10
433
434 // Copy result [255:0]
435 MOVQ R12, SI
436 MOVQ R13, R11
437 MOVQ R8, R14
438 MOVQ R9, R15
439
440 // Subtract p256
441 SUBQ $-1, R12
442 SBBQ p256const0<>+0(SB), R13
443 SBBQ $0x00, R8
444 SBBQ p256const1<>+0(SB), R9
445 SBBQ $0x00, R10
446 CMOVQCS SI, R12
447 CMOVQCS R11, R13
448 CMOVQCS R14, R8
449 CMOVQCS R15, R9
450 MOVQ R12, (DI)
451 MOVQ R13, 8(DI)
452 MOVQ R8, 16(DI)
453 MOVQ R9, 24(DI)
454 RET
455
456 // func p256FromMont(res *p256Element, in *p256Element)
457 // Requires: CMOV
458 TEXT ·p256FromMont(SB), NOSPLIT, $0-16
459 MOVQ res+0(FP), DI
460 MOVQ in+8(FP), SI
461 MOVQ (SI), R8
462 MOVQ 8(SI), R9
463 MOVQ 16(SI), R10
464 MOVQ 24(SI), R11
465 XORQ R12, R12
466
467 // Only reduce, no multiplications are needed
468 // First stage
469 MOVQ R8, AX
470 MOVQ R8, R15
471 SHLQ $0x20, R8
472 MULQ p256const1<>+0(SB)
473 SHRQ $0x20, R15
474 ADDQ R8, R9
475 ADCQ R15, R10
476 ADCQ AX, R11
477 ADCQ DX, R12
478 XORQ R13, R13
479
480 // Second stage
481 MOVQ R9, AX
482 MOVQ R9, R15
483 SHLQ $0x20, R9
484 MULQ p256const1<>+0(SB)
485 SHRQ $0x20, R15
486 ADDQ R9, R10
487 ADCQ R15, R11
488 ADCQ AX, R12
489 ADCQ DX, R13
490 XORQ R8, R8
491
492 // Third stage
493 MOVQ R10, AX
494 MOVQ R10, R15
495 SHLQ $0x20, R10
496 MULQ p256const1<>+0(SB)
497 SHRQ $0x20, R15
498 ADDQ R10, R11
499 ADCQ R15, R12
500 ADCQ AX, R13
501 ADCQ DX, R8
502 XORQ R9, R9
503
504 // Last stage
505 MOVQ R11, AX
506 MOVQ R11, R15
507 SHLQ $0x20, R11
508 MULQ p256const1<>+0(SB)
509 SHRQ $0x20, R15
510 ADDQ R11, R12
511 ADCQ R15, R13
512 ADCQ AX, R8
513 ADCQ DX, R9
514 MOVQ R12, SI
515 MOVQ R13, R11
516 MOVQ R8, R14
517 MOVQ R9, R15
518 SUBQ $-1, R12
519 SBBQ p256const0<>+0(SB), R13
520 SBBQ $0x00, R8
521 SBBQ p256const1<>+0(SB), R9
522 CMOVQCS SI, R12
523 CMOVQCS R11, R13
524 CMOVQCS R14, R8
525 CMOVQCS R15, R9
526 MOVQ R12, (DI)
527 MOVQ R13, 8(DI)
528 MOVQ R8, 16(DI)
529 MOVQ R9, 24(DI)
530 RET
531
532 // func p256Select(res *P256Point, table *p256Table, idx int)
533 // Requires: SSE2
534 TEXT ·p256Select(SB), NOSPLIT, $0-24
535 MOVQ idx+16(FP), AX
536 MOVQ table+8(FP), DI
537 MOVQ res+0(FP), DX
538 PXOR X15, X15
539 PCMPEQL X14, X14
540 PSUBL X14, X15
541 MOVL AX, X14
542 PSHUFD $0x00, X14, X14
543 PXOR X0, X0
544 PXOR X1, X1
545 PXOR X2, X2
546 PXOR X3, X3
547 PXOR X4, X4
548 PXOR X5, X5
549 MOVQ $0x00000010, AX
550 MOVOU X15, X13
551
552 loop_select:
553 MOVOU X13, X12
554 PADDL X15, X13
555 PCMPEQL X14, X12
556 MOVOU (DI), X6
557 MOVOU 16(DI), X7
558 MOVOU 32(DI), X8
559 MOVOU 48(DI), X9
560 MOVOU 64(DI), X10
561 MOVOU 80(DI), X11
562 ADDQ $0x60, DI
563 PAND X12, X6
564 PAND X12, X7
565 PAND X12, X8
566 PAND X12, X9
567 PAND X12, X10
568 PAND X12, X11
569 PXOR X6, X0
570 PXOR X7, X1
571 PXOR X8, X2
572 PXOR X9, X3
573 PXOR X10, X4
574 PXOR X11, X5
575 DECQ AX
576 JNE loop_select
577 MOVOU X0, (DX)
578 MOVOU X1, 16(DX)
579 MOVOU X2, 32(DX)
580 MOVOU X3, 48(DX)
581 MOVOU X4, 64(DX)
582 MOVOU X5, 80(DX)
583 RET
584
585 // func p256SelectAffine(res *p256AffinePoint, table *p256AffineTable, idx int)
586 // Requires: SSE2
587 TEXT ·p256SelectAffine(SB), NOSPLIT, $0-24
588 MOVQ idx+16(FP), AX
589 MOVQ table+8(FP), DI
590 MOVQ res+0(FP), DX
591 PXOR X15, X15
592 PCMPEQL X14, X14
593 PSUBL X14, X15
594 MOVL AX, X14
595 PSHUFD $0x00, X14, X14
596 PXOR X0, X0
597 PXOR X1, X1
598 PXOR X2, X2
599 PXOR X3, X3
600 MOVQ $0x00000010, AX
601 MOVOU X15, X13
602
603 loop_select_base:
604 MOVOU X13, X12
605 PADDL X15, X13
606 PCMPEQL X14, X12
607 MOVOU (DI), X4
608 MOVOU 16(DI), X5
609 MOVOU 32(DI), X6
610 MOVOU 48(DI), X7
611 MOVOU 64(DI), X8
612 MOVOU 80(DI), X9
613 MOVOU 96(DI), X10
614 MOVOU 112(DI), X11
615 ADDQ $0x80, DI
616 PAND X12, X4
617 PAND X12, X5
618 PAND X12, X6
619 PAND X12, X7
620 MOVOU X13, X12
621 PADDL X15, X13
622 PCMPEQL X14, X12
623 PAND X12, X8
624 PAND X12, X9
625 PAND X12, X10
626 PAND X12, X11
627 PXOR X4, X0
628 PXOR X5, X1
629 PXOR X6, X2
630 PXOR X7, X3
631 PXOR X8, X0
632 PXOR X9, X1
633 PXOR X10, X2
634 PXOR X11, X3
635 DECQ AX
636 JNE loop_select_base
637 MOVOU X0, (DX)
638 MOVOU X1, 16(DX)
639 MOVOU X2, 32(DX)
640 MOVOU X3, 48(DX)
641 RET
642
643 // func p256SubInternal()
644 // Requires: CMOV
645 TEXT p256SubInternal(SB), NOSPLIT, $0
646 XORQ AX, AX
647 SUBQ R14, R10
648 SBBQ R15, R11
649 SBBQ DI, R12
650 SBBQ SI, R13
651 SBBQ $0x00, AX
652 MOVQ R10, BX
653 MOVQ R11, CX
654 MOVQ R12, R8
655 MOVQ R13, R9
656 ADDQ $-1, R10
657 ADCQ p256const0<>+0(SB), R11
658 ADCQ $0x00, R12
659 ADCQ p256const1<>+0(SB), R13
660 ANDQ $0x01, AX
661 CMOVQEQ BX, R10
662 CMOVQEQ CX, R11
663 CMOVQEQ R8, R12
664 CMOVQEQ R9, R13
665 RET
666
667 // func p256MulInternal()
668 // Requires: CMOV
669 TEXT p256MulInternal(SB), NOSPLIT, $8
670 MOVQ R10, AX
671 MULQ R14
672 MOVQ AX, BX
673 MOVQ DX, CX
674 MOVQ R10, AX
675 MULQ R15
676 ADDQ AX, CX
677 ADCQ $0x00, DX
678 MOVQ DX, R8
679 MOVQ R10, AX
680 MULQ DI
681 ADDQ AX, R8
682 ADCQ $0x00, DX
683 MOVQ DX, R9
684 MOVQ R10, AX
685 MULQ SI
686 ADDQ AX, R9
687 ADCQ $0x00, DX
688 MOVQ DX, R10
689 MOVQ R11, AX
690 MULQ R14
691 ADDQ AX, CX
692 ADCQ $0x00, DX
693 MOVQ DX, BP
694 MOVQ R11, AX
695 MULQ R15
696 ADDQ BP, R8
697 ADCQ $0x00, DX
698 ADDQ AX, R8
699 ADCQ $0x00, DX
700 MOVQ DX, BP
701 MOVQ R11, AX
702 MULQ DI
703 ADDQ BP, R9
704 ADCQ $0x00, DX
705 ADDQ AX, R9
706 ADCQ $0x00, DX
707 MOVQ DX, BP
708 MOVQ R11, AX
709 MULQ SI
710 ADDQ BP, R10
711 ADCQ $0x00, DX
712 ADDQ AX, R10
713 ADCQ $0x00, DX
714 MOVQ DX, R11
715 MOVQ R12, AX
716 MULQ R14
717 ADDQ AX, R8
718 ADCQ $0x00, DX
719 MOVQ DX, BP
720 MOVQ R12, AX
721 MULQ R15
722 ADDQ BP, R9
723 ADCQ $0x00, DX
724 ADDQ AX, R9
725 ADCQ $0x00, DX
726 MOVQ DX, BP
727 MOVQ R12, AX
728 MULQ DI
729 ADDQ BP, R10
730 ADCQ $0x00, DX
731 ADDQ AX, R10
732 ADCQ $0x00, DX
733 MOVQ DX, BP
734 MOVQ R12, AX
735 MULQ SI
736 ADDQ BP, R11
737 ADCQ $0x00, DX
738 ADDQ AX, R11
739 ADCQ $0x00, DX
740 MOVQ DX, R12
741 MOVQ R13, AX
742 MULQ R14
743 ADDQ AX, R9
744 ADCQ $0x00, DX
745 MOVQ DX, BP
746 MOVQ R13, AX
747 MULQ R15
748 ADDQ BP, R10
749 ADCQ $0x00, DX
750 ADDQ AX, R10
751 ADCQ $0x00, DX
752 MOVQ DX, BP
753 MOVQ R13, AX
754 MULQ DI
755 ADDQ BP, R11
756 ADCQ $0x00, DX
757 ADDQ AX, R11
758 ADCQ $0x00, DX
759 MOVQ DX, BP
760 MOVQ R13, AX
761 MULQ SI
762 ADDQ BP, R12
763 ADCQ $0x00, DX
764 ADDQ AX, R12
765 ADCQ $0x00, DX
766 MOVQ DX, R13
767
768 // First reduction step
769 MOVQ BX, AX
770 MOVQ BX, BP
771 SHLQ $0x20, BX
772 MULQ p256const1<>+0(SB)
773 SHRQ $0x20, BP
774 ADDQ BX, CX
775 ADCQ BP, R8
776 ADCQ AX, R9
777 ADCQ $0x00, DX
778 MOVQ DX, BX
779
780 // Second reduction step
781 MOVQ CX, AX
782 MOVQ CX, BP
783 SHLQ $0x20, CX
784 MULQ p256const1<>+0(SB)
785 SHRQ $0x20, BP
786 ADDQ CX, R8
787 ADCQ BP, R9
788 ADCQ AX, BX
789 ADCQ $0x00, DX
790 MOVQ DX, CX
791
792 // Third reduction step
793 MOVQ R8, AX
794 MOVQ R8, BP
795 SHLQ $0x20, R8
796 MULQ p256const1<>+0(SB)
797 SHRQ $0x20, BP
798 ADDQ R8, R9
799 ADCQ BP, BX
800 ADCQ AX, CX
801 ADCQ $0x00, DX
802 MOVQ DX, R8
803
804 // Last reduction step
805 MOVQ R9, AX
806 MOVQ R9, BP
807 SHLQ $0x20, R9
808 MULQ p256const1<>+0(SB)
809 SHRQ $0x20, BP
810 ADDQ R9, BX
811 ADCQ BP, CX
812 ADCQ AX, R8
813 ADCQ $0x00, DX
814 MOVQ DX, R9
815 MOVQ $0x00000000, BP
816
817 // Add bits [511:256] of the result
818 ADCQ BX, R10
819 ADCQ CX, R11
820 ADCQ R8, R12
821 ADCQ R9, R13
822 ADCQ $0x00, BP
823
824 // Copy result
825 MOVQ R10, BX
826 MOVQ R11, CX
827 MOVQ R12, R8
828 MOVQ R13, R9
829
830 // Subtract p256
831 SUBQ $-1, R10
832 SBBQ p256const0<>+0(SB), R11
833 SBBQ $0x00, R12
834 SBBQ p256const1<>+0(SB), R13
835 SBBQ $0x00, BP
836
837 // If the result of the subtraction is negative, restore the previous result
838 CMOVQCS BX, R10
839 CMOVQCS CX, R11
840 CMOVQCS R8, R12
841 CMOVQCS R9, R13
842 RET
843
844 // func p256SqrInternal()
845 // Requires: CMOV
846 TEXT p256SqrInternal(SB), NOSPLIT, $8
847 MOVQ R10, AX
848 MULQ R11
849 MOVQ AX, CX
850 MOVQ DX, R8
851 MOVQ R10, AX
852 MULQ R12
853 ADDQ AX, R8
854 ADCQ $0x00, DX
855 MOVQ DX, R9
856 MOVQ R10, AX
857 MULQ R13
858 ADDQ AX, R9
859 ADCQ $0x00, DX
860 MOVQ DX, R14
861 MOVQ R11, AX
862 MULQ R12
863 ADDQ AX, R9
864 ADCQ $0x00, DX
865 MOVQ DX, BP
866 MOVQ R11, AX
867 MULQ R13
868 ADDQ BP, R14
869 ADCQ $0x00, DX
870 ADDQ AX, R14
871 ADCQ $0x00, DX
872 MOVQ DX, R15
873 MOVQ R12, AX
874 MULQ R13
875 ADDQ AX, R15
876 ADCQ $0x00, DX
877 MOVQ DX, DI
878 XORQ SI, SI
879
880 // *2
881 ADDQ CX, CX
882 ADCQ R8, R8
883 ADCQ R9, R9
884 ADCQ R14, R14
885 ADCQ R15, R15
886 ADCQ DI, DI
887 ADCQ $0x00, SI
888
889 // Missing products
890 MOVQ R10, AX
891 MULQ AX
892 MOVQ AX, BX
893 MOVQ DX, R10
894 MOVQ R11, AX
895 MULQ AX
896 ADDQ R10, CX
897 ADCQ AX, R8
898 ADCQ $0x00, DX
899 MOVQ DX, R10
900 MOVQ R12, AX
901 MULQ AX
902 ADDQ R10, R9
903 ADCQ AX, R14
904 ADCQ $0x00, DX
905 MOVQ DX, R10
906 MOVQ R13, AX
907 MULQ AX
908 ADDQ R10, R15
909 ADCQ AX, DI
910 ADCQ DX, SI
911
912 // First reduction step
913 MOVQ BX, AX
914 MOVQ BX, BP
915 SHLQ $0x20, BX
916 MULQ p256const1<>+0(SB)
917 SHRQ $0x20, BP
918 ADDQ BX, CX
919 ADCQ BP, R8
920 ADCQ AX, R9
921 ADCQ $0x00, DX
922 MOVQ DX, BX
923
924 // Second reduction step
925 MOVQ CX, AX
926 MOVQ CX, BP
927 SHLQ $0x20, CX
928 MULQ p256const1<>+0(SB)
929 SHRQ $0x20, BP
930 ADDQ CX, R8
931 ADCQ BP, R9
932 ADCQ AX, BX
933 ADCQ $0x00, DX
934 MOVQ DX, CX
935
936 // Third reduction step
937 MOVQ R8, AX
938 MOVQ R8, BP
939 SHLQ $0x20, R8
940 MULQ p256const1<>+0(SB)
941 SHRQ $0x20, BP
942 ADDQ R8, R9
943 ADCQ BP, BX
944 ADCQ AX, CX
945 ADCQ $0x00, DX
946 MOVQ DX, R8
947
948 // Last reduction step
949 MOVQ R9, AX
950 MOVQ R9, BP
951 SHLQ $0x20, R9
952 MULQ p256const1<>+0(SB)
953 SHRQ $0x20, BP
954 ADDQ R9, BX
955 ADCQ BP, CX
956 ADCQ AX, R8
957 ADCQ $0x00, DX
958 MOVQ DX, R9
959 MOVQ $0x00000000, BP
960
961 // Add bits [511:256] of the result
962 ADCQ BX, R14
963 ADCQ CX, R15
964 ADCQ R8, DI
965 ADCQ R9, SI
966 ADCQ $0x00, BP
967
968 // Copy result
969 MOVQ R14, R10
970 MOVQ R15, R11
971 MOVQ DI, R12
972 MOVQ SI, R13
973
974 // Subtract p256
975 SUBQ $-1, R10
976 SBBQ p256const0<>+0(SB), R11
977 SBBQ $0x00, R12
978 SBBQ p256const1<>+0(SB), R13
979 SBBQ $0x00, BP
980
981 // If the result of the subtraction is negative, restore the previous result
982 CMOVQCS R14, R10
983 CMOVQCS R15, R11
984 CMOVQCS DI, R12
985 CMOVQCS SI, R13
986 RET
987
988 // func p256PointAddAffineAsm(res *P256Point, in1 *P256Point, in2 *p256AffinePoint, sign int, sel int, zero int)
989 // Requires: CMOV, SSE2
990 TEXT ·p256PointAddAffineAsm(SB), $512-48
991 MOVQ res+0(FP), AX
992 MOVQ in1+8(FP), BX
993 MOVQ in2+16(FP), CX
994 MOVQ sign+24(FP), DX
995 MOVQ sel+32(FP), R15
996 MOVQ zero+40(FP), DI
997 MOVOU (BX), X0
998 MOVOU 16(BX), X1
999 MOVOU 32(BX), X2
1000 MOVOU 48(BX), X3
1001 MOVOU 64(BX), X4
1002 MOVOU 80(BX), X5
1003 MOVOU X0, (SP)
1004 MOVOU X1, 16(SP)
1005 MOVOU X2, 32(SP)
1006 MOVOU X3, 48(SP)
1007 MOVOU X4, 64(SP)
1008 MOVOU X5, 80(SP)
1009 MOVOU (CX), X0
1010 MOVOU 16(CX), X1
1011 MOVOU X0, 96(SP)
1012 MOVOU X1, 112(SP)
1013
1014 // Store pointer to result
1015 MOVQ AX, 480(SP)
1016 MOVL R15, 488(SP)
1017 MOVL DI, 492(SP)
1018
1019 // Negate y2in based on sign
1020 MOVQ 32(CX), R10
1021 MOVQ 40(CX), R11
1022 MOVQ 48(CX), R12
1023 MOVQ 56(CX), R13
1024 MOVQ $-1, BX
1025 MOVQ p256const0<>+0(SB), CX
1026 MOVQ $0x00000000, R8
1027 MOVQ p256const1<>+0(SB), R9
1028 XORQ AX, AX
1029
1030 // Speculatively subtract
1031 SUBQ R10, BX
1032 SBBQ R11, CX
1033 SBBQ R12, R8
1034 SBBQ R13, R9
1035 SBBQ $0x00, AX
1036 MOVQ BX, R14
1037 MOVQ CX, R15
1038 MOVQ R8, DI
1039 MOVQ R9, SI
1040
1041 // Add in case the operand was > p256
1042 ADDQ $-1, BX
1043 ADCQ p256const0<>+0(SB), CX
1044 ADCQ $0x00, R8
1045 ADCQ p256const1<>+0(SB), R9
1046 ADCQ $0x00, AX
1047 CMOVQNE R14, BX
1048 CMOVQNE R15, CX
1049 CMOVQNE DI, R8
1050 CMOVQNE SI, R9
1051
1052 // If condition is 0, keep original value
1053 TESTQ DX, DX
1054 CMOVQEQ R10, BX
1055 CMOVQEQ R11, CX
1056 CMOVQEQ R12, R8
1057 CMOVQEQ R13, R9
1058
1059 // Store result
1060 MOVQ BX, 128(SP)
1061 MOVQ CX, 136(SP)
1062 MOVQ R8, 144(SP)
1063 MOVQ R9, 152(SP)
1064
1065 // Begin point add
1066 MOVQ 64(SP), R10
1067 MOVQ 72(SP), R11
1068 MOVQ 80(SP), R12
1069 MOVQ 88(SP), R13
1070 CALL p256SqrInternal(SB)
1071 MOVQ R10, 288(SP)
1072 MOVQ R11, 296(SP)
1073 MOVQ R12, 304(SP)
1074 MOVQ R13, 312(SP)
1075 MOVQ 96(SP), R14
1076 MOVQ 104(SP), R15
1077 MOVQ 112(SP), DI
1078 MOVQ 120(SP), SI
1079 CALL p256MulInternal(SB)
1080 MOVQ (SP), R14
1081 MOVQ 8(SP), R15
1082 MOVQ 16(SP), DI
1083 MOVQ 24(SP), SI
1084 CALL p256SubInternal(SB)
1085 MOVQ R10, 320(SP)
1086 MOVQ R11, 328(SP)
1087 MOVQ R12, 336(SP)
1088 MOVQ R13, 344(SP)
1089 MOVQ 64(SP), R14
1090 MOVQ 72(SP), R15
1091 MOVQ 80(SP), DI
1092 MOVQ 88(SP), SI
1093 CALL p256MulInternal(SB)
1094 MOVQ R10, 224(SP)
1095 MOVQ R11, 232(SP)
1096 MOVQ R12, 240(SP)
1097 MOVQ R13, 248(SP)
1098 MOVQ 288(SP), R10
1099 MOVQ 296(SP), R11
1100 MOVQ 304(SP), R12
1101 MOVQ 312(SP), R13
1102 CALL p256MulInternal(SB)
1103 MOVQ 128(SP), R14
1104 MOVQ 136(SP), R15
1105 MOVQ 144(SP), DI
1106 MOVQ 152(SP), SI
1107 CALL p256MulInternal(SB)
1108 MOVQ R10, 256(SP)
1109 MOVQ R11, 264(SP)
1110 MOVQ R12, 272(SP)
1111 MOVQ R13, 280(SP)
1112 MOVQ 32(SP), R14
1113 MOVQ 40(SP), R15
1114 MOVQ 48(SP), DI
1115 MOVQ 56(SP), SI
1116 CALL p256SubInternal(SB)
1117 MOVQ R10, 352(SP)
1118 MOVQ R11, 360(SP)
1119 MOVQ R12, 368(SP)
1120 MOVQ R13, 376(SP)
1121 CALL p256SqrInternal(SB)
1122 MOVQ R10, 416(SP)
1123 MOVQ R11, 424(SP)
1124 MOVQ R12, 432(SP)
1125 MOVQ R13, 440(SP)
1126 MOVQ 320(SP), R10
1127 MOVQ 328(SP), R11
1128 MOVQ 336(SP), R12
1129 MOVQ 344(SP), R13
1130 CALL p256SqrInternal(SB)
1131 MOVQ R10, 384(SP)
1132 MOVQ R11, 392(SP)
1133 MOVQ R12, 400(SP)
1134 MOVQ R13, 408(SP)
1135 MOVQ 320(SP), R14
1136 MOVQ 328(SP), R15
1137 MOVQ 336(SP), DI
1138 MOVQ 344(SP), SI
1139 CALL p256MulInternal(SB)
1140 MOVQ R10, 448(SP)
1141 MOVQ R11, 456(SP)
1142 MOVQ R12, 464(SP)
1143 MOVQ R13, 472(SP)
1144 MOVQ 32(SP), R14
1145 MOVQ 40(SP), R15
1146 MOVQ 48(SP), DI
1147 MOVQ 56(SP), SI
1148 CALL p256MulInternal(SB)
1149 MOVQ R10, 256(SP)
1150 MOVQ R11, 264(SP)
1151 MOVQ R12, 272(SP)
1152 MOVQ R13, 280(SP)
1153 MOVQ (SP), R10
1154 MOVQ 8(SP), R11
1155 MOVQ 16(SP), R12
1156 MOVQ 24(SP), R13
1157 MOVQ 384(SP), R14
1158 MOVQ 392(SP), R15
1159 MOVQ 400(SP), DI
1160 MOVQ 408(SP), SI
1161 CALL p256MulInternal(SB)
1162 MOVQ R10, 320(SP)
1163 MOVQ R11, 328(SP)
1164 MOVQ R12, 336(SP)
1165 MOVQ R13, 344(SP)
1166 XORQ AX, AX
1167 ADDQ R10, R10
1168 ADCQ R11, R11
1169 ADCQ R12, R12
1170 ADCQ R13, R13
1171 ADCQ $+0, AX
1172 MOVQ R10, R14
1173 MOVQ R11, R15
1174 MOVQ R12, DI
1175 MOVQ R13, SI
1176 SUBQ $-1, R14
1177 SBBQ p256const0<>+0(SB), R15
1178 SBBQ $+0, DI
1179 SBBQ p256const1<>+0(SB), SI
1180 SBBQ $+0, AX
1181 CMOVQCS R10, R14
1182 CMOVQCS R11, R15
1183 CMOVQCS R12, DI
1184 CMOVQCS R13, SI
1185 MOVQ 416(SP), R10
1186 MOVQ 424(SP), R11
1187 MOVQ 432(SP), R12
1188 MOVQ 440(SP), R13
1189 CALL p256SubInternal(SB)
1190 MOVQ 448(SP), R14
1191 MOVQ 456(SP), R15
1192 MOVQ 464(SP), DI
1193 MOVQ 472(SP), SI
1194 CALL p256SubInternal(SB)
1195 MOVQ R10, 160(SP)
1196 MOVQ R11, 168(SP)
1197 MOVQ R12, 176(SP)
1198 MOVQ R13, 184(SP)
1199 MOVQ R10, R14
1200 MOVQ R11, R15
1201 MOVQ R12, DI
1202 MOVQ R13, SI
1203 MOVQ 320(SP), R10
1204 MOVQ 328(SP), R11
1205 MOVQ 336(SP), R12
1206 MOVQ 344(SP), R13
1207 CALL p256SubInternal(SB)
1208 MOVQ 352(SP), R14
1209 MOVQ 360(SP), R15
1210 MOVQ 368(SP), DI
1211 MOVQ 376(SP), SI
1212 CALL p256MulInternal(SB)
1213 MOVQ 256(SP), R14
1214 MOVQ 264(SP), R15
1215 MOVQ 272(SP), DI
1216 MOVQ 280(SP), SI
1217 CALL p256SubInternal(SB)
1218 MOVQ R10, 192(SP)
1219 MOVQ R11, 200(SP)
1220 MOVQ R12, 208(SP)
1221 MOVQ R13, 216(SP)
1222
1223 // Load stored values from stack
1224 MOVQ 480(SP), AX
1225 MOVL 488(SP), BX
1226 MOVL 492(SP), CX
1227
1228 // The result is not valid if (sel == 0), conditional choose
1229 MOVOU 160(SP), X0
1230 MOVOU 176(SP), X1
1231 MOVOU 192(SP), X2
1232 MOVOU 208(SP), X3
1233 MOVOU 224(SP), X4
1234 MOVOU 240(SP), X5
1235 MOVL BX, X6
1236 MOVL CX, X7
1237 PXOR X8, X8
1238 PCMPEQL X9, X9
1239 PSHUFD $0x00, X6, X6
1240 PSHUFD $0x00, X7, X7
1241 PCMPEQL X8, X6
1242 PCMPEQL X8, X7
1243 MOVOU X6, X15
1244 PANDN X9, X15
1245 MOVOU (SP), X9
1246 MOVOU 16(SP), X10
1247 MOVOU 32(SP), X11
1248 MOVOU 48(SP), X12
1249 MOVOU 64(SP), X13
1250 MOVOU 80(SP), X14
1251 PAND X15, X0
1252 PAND X15, X1
1253 PAND X15, X2
1254 PAND X15, X3
1255 PAND X15, X4
1256 PAND X15, X5
1257 PAND X6, X9
1258 PAND X6, X10
1259 PAND X6, X11
1260 PAND X6, X12
1261 PAND X6, X13
1262 PAND X6, X14
1263 PXOR X9, X0
1264 PXOR X10, X1
1265 PXOR X11, X2
1266 PXOR X12, X3
1267 PXOR X13, X4
1268 PXOR X14, X5
1269
1270 // Similarly if zero == 0
1271 PCMPEQL X9, X9
1272 MOVOU X7, X15
1273 PANDN X9, X15
1274 MOVOU 96(SP), X9
1275 MOVOU 112(SP), X10
1276 MOVOU 128(SP), X11
1277 MOVOU 144(SP), X12
1278 MOVOU p256one<>+0(SB), X13
1279 MOVOU p256one<>+16(SB), X14
1280 PAND X15, X0
1281 PAND X15, X1
1282 PAND X15, X2
1283 PAND X15, X3
1284 PAND X15, X4
1285 PAND X15, X5
1286 PAND X7, X9
1287 PAND X7, X10
1288 PAND X7, X11
1289 PAND X7, X12
1290 PAND X7, X13
1291 PAND X7, X14
1292 PXOR X9, X0
1293 PXOR X10, X1
1294 PXOR X11, X2
1295 PXOR X12, X3
1296 PXOR X13, X4
1297 PXOR X14, X5
1298
1299 // Finally output the result
1300 MOVOU X0, (AX)
1301 MOVOU X1, 16(AX)
1302 MOVOU X2, 32(AX)
1303 MOVOU X3, 48(AX)
1304 MOVOU X4, 64(AX)
1305 MOVOU X5, 80(AX)
1306 MOVQ $0x00000000, 480(SP)
1307 RET
1308
1309 DATA p256one<>+0(SB)/8, $0x0000000000000001
1310 DATA p256one<>+8(SB)/8, $0xffffffff00000000
1311 DATA p256one<>+16(SB)/8, $0xffffffffffffffff
1312 DATA p256one<>+24(SB)/8, $0x00000000fffffffe
1313 GLOBL p256one<>(SB), RODATA, $32
1314
1315 // func p256IsZero()
1316 // Requires: CMOV
1317 TEXT p256IsZero(SB), NOSPLIT, $0
1318 // AX contains a flag that is set if the input is zero.
1319 XORQ AX, AX
1320 MOVQ $0x00000001, R15
1321
1322 // Check whether [acc4..acc7] are all zero.
1323 MOVQ R10, R14
1324 ORQ R11, R14
1325 ORQ R12, R14
1326 ORQ R13, R14
1327
1328 // Set the zero flag if so. (CMOV of a constant to a register doesn't
1329 // appear to be supported in Go. Thus t1 = 1.)
1330 CMOVQEQ R15, AX
1331
1332 // XOR [acc4..acc7] with P and compare with zero again.
1333 XORQ $-1, R10
1334 XORQ p256const0<>+0(SB), R11
1335 XORQ p256const1<>+0(SB), R13
1336 ORQ R11, R10
1337 ORQ R12, R10
1338 ORQ R13, R10
1339
1340 // Set the zero flag if so.
1341 CMOVQEQ R15, AX
1342 RET
1343
1344 // func p256PointAddAsm(res *P256Point, in1 *P256Point, in2 *P256Point) int
1345 // Requires: CMOV, SSE2
1346 TEXT ·p256PointAddAsm(SB), $680-32
1347 // Move input to stack in order to free registers
1348 MOVQ res+0(FP), AX
1349 MOVQ in1+8(FP), BX
1350 MOVQ in2+16(FP), CX
1351 MOVOU (BX), X0
1352 MOVOU 16(BX), X1
1353 MOVOU 32(BX), X2
1354 MOVOU 48(BX), X3
1355 MOVOU 64(BX), X4
1356 MOVOU 80(BX), X5
1357 MOVOU X0, (SP)
1358 MOVOU X1, 16(SP)
1359 MOVOU X2, 32(SP)
1360 MOVOU X3, 48(SP)
1361 MOVOU X4, 64(SP)
1362 MOVOU X5, 80(SP)
1363 MOVOU (CX), X0
1364 MOVOU 16(CX), X1
1365 MOVOU 32(CX), X2
1366 MOVOU 48(CX), X3
1367 MOVOU 64(CX), X4
1368 MOVOU 80(CX), X5
1369 MOVOU X0, 96(SP)
1370 MOVOU X1, 112(SP)
1371 MOVOU X2, 128(SP)
1372 MOVOU X3, 144(SP)
1373 MOVOU X4, 160(SP)
1374 MOVOU X5, 176(SP)
1375
1376 // Store pointer to result
1377 MOVQ AX, 640(SP)
1378
1379 // Begin point add
1380 MOVQ 160(SP), R10
1381 MOVQ 168(SP), R11
1382 MOVQ 176(SP), R12
1383 MOVQ 184(SP), R13
1384 CALL p256SqrInternal(SB)
1385 MOVQ R10, 448(SP)
1386 MOVQ R11, 456(SP)
1387 MOVQ R12, 464(SP)
1388 MOVQ R13, 472(SP)
1389 MOVQ 160(SP), R14
1390 MOVQ 168(SP), R15
1391 MOVQ 176(SP), DI
1392 MOVQ 184(SP), SI
1393 CALL p256MulInternal(SB)
1394 MOVQ 32(SP), R14
1395 MOVQ 40(SP), R15
1396 MOVQ 48(SP), DI
1397 MOVQ 56(SP), SI
1398 CALL p256MulInternal(SB)
1399 MOVQ R10, 352(SP)
1400 MOVQ R11, 360(SP)
1401 MOVQ R12, 368(SP)
1402 MOVQ R13, 376(SP)
1403 MOVQ 64(SP), R10
1404 MOVQ 72(SP), R11
1405 MOVQ 80(SP), R12
1406 MOVQ 88(SP), R13
1407 CALL p256SqrInternal(SB)
1408 MOVQ R10, 416(SP)
1409 MOVQ R11, 424(SP)
1410 MOVQ R12, 432(SP)
1411 MOVQ R13, 440(SP)
1412 MOVQ 64(SP), R14
1413 MOVQ 72(SP), R15
1414 MOVQ 80(SP), DI
1415 MOVQ 88(SP), SI
1416 CALL p256MulInternal(SB)
1417 MOVQ 128(SP), R14
1418 MOVQ 136(SP), R15
1419 MOVQ 144(SP), DI
1420 MOVQ 152(SP), SI
1421 CALL p256MulInternal(SB)
1422 MOVQ R10, 384(SP)
1423 MOVQ R11, 392(SP)
1424 MOVQ R12, 400(SP)
1425 MOVQ R13, 408(SP)
1426 MOVQ 352(SP), R14
1427 MOVQ 360(SP), R15
1428 MOVQ 368(SP), DI
1429 MOVQ 376(SP), SI
1430 CALL p256SubInternal(SB)
1431 MOVQ R10, 512(SP)
1432 MOVQ R11, 520(SP)
1433 MOVQ R12, 528(SP)
1434 MOVQ R13, 536(SP)
1435 CALL p256IsZero(SB)
1436 MOVQ AX, 648(SP)
1437 MOVQ 448(SP), R10
1438 MOVQ 456(SP), R11
1439 MOVQ 464(SP), R12
1440 MOVQ 472(SP), R13
1441 MOVQ (SP), R14
1442 MOVQ 8(SP), R15
1443 MOVQ 16(SP), DI
1444 MOVQ 24(SP), SI
1445 CALL p256MulInternal(SB)
1446 MOVQ R10, 288(SP)
1447 MOVQ R11, 296(SP)
1448 MOVQ R12, 304(SP)
1449 MOVQ R13, 312(SP)
1450 MOVQ 416(SP), R10
1451 MOVQ 424(SP), R11
1452 MOVQ 432(SP), R12
1453 MOVQ 440(SP), R13
1454 MOVQ 96(SP), R14
1455 MOVQ 104(SP), R15
1456 MOVQ 112(SP), DI
1457 MOVQ 120(SP), SI
1458 CALL p256MulInternal(SB)
1459 MOVQ R10, 320(SP)
1460 MOVQ R11, 328(SP)
1461 MOVQ R12, 336(SP)
1462 MOVQ R13, 344(SP)
1463 MOVQ 288(SP), R14
1464 MOVQ 296(SP), R15
1465 MOVQ 304(SP), DI
1466 MOVQ 312(SP), SI
1467 CALL p256SubInternal(SB)
1468 MOVQ R10, 480(SP)
1469 MOVQ R11, 488(SP)
1470 MOVQ R12, 496(SP)
1471 MOVQ R13, 504(SP)
1472 CALL p256IsZero(SB)
1473 ANDQ 648(SP), AX
1474 MOVQ AX, 648(SP)
1475 MOVQ 512(SP), R10
1476 MOVQ 520(SP), R11
1477 MOVQ 528(SP), R12
1478 MOVQ 536(SP), R13
1479 CALL p256SqrInternal(SB)
1480 MOVQ R10, 576(SP)
1481 MOVQ R11, 584(SP)
1482 MOVQ R12, 592(SP)
1483 MOVQ R13, 600(SP)
1484 MOVQ 480(SP), R10
1485 MOVQ 488(SP), R11
1486 MOVQ 496(SP), R12
1487 MOVQ 504(SP), R13
1488 CALL p256SqrInternal(SB)
1489 MOVQ R10, 544(SP)
1490 MOVQ R11, 552(SP)
1491 MOVQ R12, 560(SP)
1492 MOVQ R13, 568(SP)
1493 MOVQ 480(SP), R14
1494 MOVQ 488(SP), R15
1495 MOVQ 496(SP), DI
1496 MOVQ 504(SP), SI
1497 CALL p256MulInternal(SB)
1498 MOVQ R10, 608(SP)
1499 MOVQ R11, 616(SP)
1500 MOVQ R12, 624(SP)
1501 MOVQ R13, 632(SP)
1502 MOVQ 352(SP), R14
1503 MOVQ 360(SP), R15
1504 MOVQ 368(SP), DI
1505 MOVQ 376(SP), SI
1506 CALL p256MulInternal(SB)
1507 MOVQ R10, 384(SP)
1508 MOVQ R11, 392(SP)
1509 MOVQ R12, 400(SP)
1510 MOVQ R13, 408(SP)
1511 MOVQ 64(SP), R10
1512 MOVQ 72(SP), R11
1513 MOVQ 80(SP), R12
1514 MOVQ 88(SP), R13
1515 MOVQ 160(SP), R14
1516 MOVQ 168(SP), R15
1517 MOVQ 176(SP), DI
1518 MOVQ 184(SP), SI
1519 CALL p256MulInternal(SB)
1520 MOVQ 480(SP), R14
1521 MOVQ 488(SP), R15
1522 MOVQ 496(SP), DI
1523 MOVQ 504(SP), SI
1524 CALL p256MulInternal(SB)
1525 MOVQ R10, 256(SP)
1526 MOVQ R11, 264(SP)
1527 MOVQ R12, 272(SP)
1528 MOVQ R13, 280(SP)
1529 MOVQ 544(SP), R10
1530 MOVQ 552(SP), R11
1531 MOVQ 560(SP), R12
1532 MOVQ 568(SP), R13
1533 MOVQ 288(SP), R14
1534 MOVQ 296(SP), R15
1535 MOVQ 304(SP), DI
1536 MOVQ 312(SP), SI
1537 CALL p256MulInternal(SB)
1538 MOVQ R10, 320(SP)
1539 MOVQ R11, 328(SP)
1540 MOVQ R12, 336(SP)
1541 MOVQ R13, 344(SP)
1542 XORQ AX, AX
1543 ADDQ R10, R10
1544 ADCQ R11, R11
1545 ADCQ R12, R12
1546 ADCQ R13, R13
1547 ADCQ $+0, AX
1548 MOVQ R10, R14
1549 MOVQ R11, R15
1550 MOVQ R12, DI
1551 MOVQ R13, SI
1552 SUBQ $-1, R14
1553 SBBQ p256const0<>+0(SB), R15
1554 SBBQ $+0, DI
1555 SBBQ p256const1<>+0(SB), SI
1556 SBBQ $+0, AX
1557 CMOVQCS R10, R14
1558 CMOVQCS R11, R15
1559 CMOVQCS R12, DI
1560 CMOVQCS R13, SI
1561 MOVQ 576(SP), R10
1562 MOVQ 584(SP), R11
1563 MOVQ 592(SP), R12
1564 MOVQ 600(SP), R13
1565 CALL p256SubInternal(SB)
1566 MOVQ 608(SP), R14
1567 MOVQ 616(SP), R15
1568 MOVQ 624(SP), DI
1569 MOVQ 632(SP), SI
1570 CALL p256SubInternal(SB)
1571 MOVQ R10, 192(SP)
1572 MOVQ R11, 200(SP)
1573 MOVQ R12, 208(SP)
1574 MOVQ R13, 216(SP)
1575 MOVQ R10, R14
1576 MOVQ R11, R15
1577 MOVQ R12, DI
1578 MOVQ R13, SI
1579 MOVQ 320(SP), R10
1580 MOVQ 328(SP), R11
1581 MOVQ 336(SP), R12
1582 MOVQ 344(SP), R13
1583 CALL p256SubInternal(SB)
1584 MOVQ 512(SP), R14
1585 MOVQ 520(SP), R15
1586 MOVQ 528(SP), DI
1587 MOVQ 536(SP), SI
1588 CALL p256MulInternal(SB)
1589 MOVQ 384(SP), R14
1590 MOVQ 392(SP), R15
1591 MOVQ 400(SP), DI
1592 MOVQ 408(SP), SI
1593 CALL p256SubInternal(SB)
1594 MOVQ R10, 224(SP)
1595 MOVQ R11, 232(SP)
1596 MOVQ R12, 240(SP)
1597 MOVQ R13, 248(SP)
1598 MOVOU 192(SP), X0
1599 MOVOU 208(SP), X1
1600 MOVOU 224(SP), X2
1601 MOVOU 240(SP), X3
1602 MOVOU 256(SP), X4
1603 MOVOU 272(SP), X5
1604
1605 // Finally output the result
1606 MOVQ 640(SP), AX
1607 MOVQ $0x00000000, 640(SP)
1608 MOVOU X0, (AX)
1609 MOVOU X1, 16(AX)
1610 MOVOU X2, 32(AX)
1611 MOVOU X3, 48(AX)
1612 MOVOU X4, 64(AX)
1613 MOVOU X5, 80(AX)
1614 MOVQ 648(SP), AX
1615 MOVQ AX, ret+24(FP)
1616 RET
1617
1618 // func p256PointDoubleAsm(res *P256Point, in *P256Point)
1619 // Requires: CMOV, SSE2
1620 TEXT ·p256PointDoubleAsm(SB), NOSPLIT, $256-16
1621 MOVQ res+0(FP), AX
1622 MOVQ in+8(FP), BX
1623 MOVOU (BX), X0
1624 MOVOU 16(BX), X1
1625 MOVOU 32(BX), X2
1626 MOVOU 48(BX), X3
1627 MOVOU 64(BX), X4
1628 MOVOU 80(BX), X5
1629 MOVOU X0, (SP)
1630 MOVOU X1, 16(SP)
1631 MOVOU X2, 32(SP)
1632 MOVOU X3, 48(SP)
1633 MOVOU X4, 64(SP)
1634 MOVOU X5, 80(SP)
1635
1636 // Store pointer to result
1637 MOVQ AX, 224(SP)
1638
1639 // Begin point double
1640 MOVQ 64(SP), R10
1641 MOVQ 72(SP), R11
1642 MOVQ 80(SP), R12
1643 MOVQ 88(SP), R13
1644 CALL p256SqrInternal(SB)
1645 MOVQ R10, 160(SP)
1646 MOVQ R11, 168(SP)
1647 MOVQ R12, 176(SP)
1648 MOVQ R13, 184(SP)
1649 MOVQ (SP), R14
1650 MOVQ 8(SP), R15
1651 MOVQ 16(SP), DI
1652 MOVQ 24(SP), SI
1653 XORQ AX, AX
1654 ADDQ R14, R10
1655 ADCQ R15, R11
1656 ADCQ DI, R12
1657 ADCQ SI, R13
1658 ADCQ $+0, AX
1659 MOVQ R10, R14
1660 MOVQ R11, R15
1661 MOVQ R12, DI
1662 MOVQ R13, SI
1663 SUBQ $-1, R14
1664 SBBQ p256const0<>+0(SB), R15
1665 SBBQ $+0, DI
1666 SBBQ p256const1<>+0(SB), SI
1667 SBBQ $+0, AX
1668 CMOVQCS R10, R14
1669 CMOVQCS R11, R15
1670 CMOVQCS R12, DI
1671 CMOVQCS R13, SI
1672 MOVQ R14, 128(SP)
1673 MOVQ R15, 136(SP)
1674 MOVQ DI, 144(SP)
1675 MOVQ SI, 152(SP)
1676 MOVQ 64(SP), R10
1677 MOVQ 72(SP), R11
1678 MOVQ 80(SP), R12
1679 MOVQ 88(SP), R13
1680 MOVQ 32(SP), R14
1681 MOVQ 40(SP), R15
1682 MOVQ 48(SP), DI
1683 MOVQ 56(SP), SI
1684 CALL p256MulInternal(SB)
1685 XORQ AX, AX
1686 ADDQ R10, R10
1687 ADCQ R11, R11
1688 ADCQ R12, R12
1689 ADCQ R13, R13
1690 ADCQ $+0, AX
1691 MOVQ R10, R14
1692 MOVQ R11, R15
1693 MOVQ R12, DI
1694 MOVQ R13, SI
1695 SUBQ $-1, R14
1696 SBBQ p256const0<>+0(SB), R15
1697 SBBQ $+0, DI
1698 SBBQ p256const1<>+0(SB), SI
1699 SBBQ $+0, AX
1700 CMOVQCS R10, R14
1701 CMOVQCS R11, R15
1702 CMOVQCS R12, DI
1703 CMOVQCS R13, SI
1704 MOVQ 224(SP), AX
1705
1706 // Store z
1707 MOVQ R14, 64(AX)
1708 MOVQ R15, 72(AX)
1709 MOVQ DI, 80(AX)
1710 MOVQ SI, 88(AX)
1711 MOVQ (SP), R10
1712 MOVQ 8(SP), R11
1713 MOVQ 16(SP), R12
1714 MOVQ 24(SP), R13
1715 MOVQ 160(SP), R14
1716 MOVQ 168(SP), R15
1717 MOVQ 176(SP), DI
1718 MOVQ 184(SP), SI
1719 CALL p256SubInternal(SB)
1720 MOVQ 128(SP), R14
1721 MOVQ 136(SP), R15
1722 MOVQ 144(SP), DI
1723 MOVQ 152(SP), SI
1724 CALL p256MulInternal(SB)
1725 MOVQ R10, 128(SP)
1726 MOVQ R11, 136(SP)
1727 MOVQ R12, 144(SP)
1728 MOVQ R13, 152(SP)
1729
1730 // Multiply by 3
1731 XORQ AX, AX
1732 ADDQ R10, R10
1733 ADCQ R11, R11
1734 ADCQ R12, R12
1735 ADCQ R13, R13
1736 ADCQ $+0, AX
1737 MOVQ R10, R14
1738 MOVQ R11, R15
1739 MOVQ R12, DI
1740 MOVQ R13, SI
1741 SUBQ $-1, R14
1742 SBBQ p256const0<>+0(SB), R15
1743 SBBQ $+0, DI
1744 SBBQ p256const1<>+0(SB), SI
1745 SBBQ $+0, AX
1746 CMOVQCS R10, R14
1747 CMOVQCS R11, R15
1748 CMOVQCS R12, DI
1749 CMOVQCS R13, SI
1750 MOVQ 128(SP), R10
1751 MOVQ 136(SP), R11
1752 MOVQ 144(SP), R12
1753 MOVQ 152(SP), R13
1754 XORQ AX, AX
1755 ADDQ R14, R10
1756 ADCQ R15, R11
1757 ADCQ DI, R12
1758 ADCQ SI, R13
1759 ADCQ $+0, AX
1760 MOVQ R10, R14
1761 MOVQ R11, R15
1762 MOVQ R12, DI
1763 MOVQ R13, SI
1764 SUBQ $-1, R14
1765 SBBQ p256const0<>+0(SB), R15
1766 SBBQ $+0, DI
1767 SBBQ p256const1<>+0(SB), SI
1768 SBBQ $+0, AX
1769 CMOVQCS R10, R14
1770 CMOVQCS R11, R15
1771 CMOVQCS R12, DI
1772 CMOVQCS R13, SI
1773 MOVQ R14, 128(SP)
1774 MOVQ R15, 136(SP)
1775 MOVQ DI, 144(SP)
1776 MOVQ SI, 152(SP)
1777
1778 // ////////////////////////
1779 MOVQ 32(SP), R10
1780 MOVQ 40(SP), R11
1781 MOVQ 48(SP), R12
1782 MOVQ 56(SP), R13
1783 XORQ AX, AX
1784 ADDQ R10, R10
1785 ADCQ R11, R11
1786 ADCQ R12, R12
1787 ADCQ R13, R13
1788 ADCQ $+0, AX
1789 MOVQ R10, R14
1790 MOVQ R11, R15
1791 MOVQ R12, DI
1792 MOVQ R13, SI
1793 SUBQ $-1, R14
1794 SBBQ p256const0<>+0(SB), R15
1795 SBBQ $+0, DI
1796 SBBQ p256const1<>+0(SB), SI
1797 SBBQ $+0, AX
1798 CMOVQCS R10, R14
1799 CMOVQCS R11, R15
1800 CMOVQCS R12, DI
1801 CMOVQCS R13, SI
1802 MOVQ R14, R10
1803 MOVQ R15, R11
1804 MOVQ DI, R12
1805 MOVQ SI, R13
1806 CALL p256SqrInternal(SB)
1807 MOVQ R10, 96(SP)
1808 MOVQ R11, 104(SP)
1809 MOVQ R12, 112(SP)
1810 MOVQ R13, 120(SP)
1811 CALL p256SqrInternal(SB)
1812
1813 // Divide by 2
1814 XORQ AX, AX
1815 MOVQ R10, R14
1816 MOVQ R11, R15
1817 MOVQ R12, DI
1818 MOVQ R13, SI
1819 ADDQ $-1, R10
1820 ADCQ p256const0<>+0(SB), R11
1821 ADCQ $0x00, R12
1822 ADCQ p256const1<>+0(SB), R13
1823 ADCQ $0x00, AX
1824 TESTQ $0x00000001, R14
1825 CMOVQEQ R14, R10
1826 CMOVQEQ R15, R11
1827 CMOVQEQ DI, R12
1828 CMOVQEQ SI, R13
1829 ANDQ R14, AX
1830 SHRQ $0x01, R11, R10
1831 SHRQ $0x01, R12, R11
1832 SHRQ $0x01, R13, R12
1833 SHRQ $0x01, AX, R13
1834 MOVQ R10, 32(SP)
1835 MOVQ R11, 40(SP)
1836 MOVQ R12, 48(SP)
1837 MOVQ R13, 56(SP)
1838
1839 // /////////////////////////
1840 MOVQ (SP), R10
1841 MOVQ 8(SP), R11
1842 MOVQ 16(SP), R12
1843 MOVQ 24(SP), R13
1844 MOVQ 96(SP), R14
1845 MOVQ 104(SP), R15
1846 MOVQ 112(SP), DI
1847 MOVQ 120(SP), SI
1848 CALL p256MulInternal(SB)
1849 MOVQ R10, 96(SP)
1850 MOVQ R11, 104(SP)
1851 MOVQ R12, 112(SP)
1852 MOVQ R13, 120(SP)
1853 XORQ AX, AX
1854 ADDQ R10, R10
1855 ADCQ R11, R11
1856 ADCQ R12, R12
1857 ADCQ R13, R13
1858 ADCQ $+0, AX
1859 MOVQ R10, R14
1860 MOVQ R11, R15
1861 MOVQ R12, DI
1862 MOVQ R13, SI
1863 SUBQ $-1, R14
1864 SBBQ p256const0<>+0(SB), R15
1865 SBBQ $+0, DI
1866 SBBQ p256const1<>+0(SB), SI
1867 SBBQ $+0, AX
1868 CMOVQCS R10, R14
1869 CMOVQCS R11, R15
1870 CMOVQCS R12, DI
1871 CMOVQCS R13, SI
1872 MOVQ R14, 192(SP)
1873 MOVQ R15, 200(SP)
1874 MOVQ DI, 208(SP)
1875 MOVQ SI, 216(SP)
1876 MOVQ 128(SP), R10
1877 MOVQ 136(SP), R11
1878 MOVQ 144(SP), R12
1879 MOVQ 152(SP), R13
1880 CALL p256SqrInternal(SB)
1881 MOVQ 192(SP), R14
1882 MOVQ 200(SP), R15
1883 MOVQ 208(SP), DI
1884 MOVQ 216(SP), SI
1885 CALL p256SubInternal(SB)
1886 MOVQ 224(SP), AX
1887
1888 // Store x
1889 MOVQ R10, (AX)
1890 MOVQ R11, 8(AX)
1891 MOVQ R12, 16(AX)
1892 MOVQ R13, 24(AX)
1893 MOVQ R10, R14
1894 MOVQ R11, R15
1895 MOVQ R12, DI
1896 MOVQ R13, SI
1897 MOVQ 96(SP), R10
1898 MOVQ 104(SP), R11
1899 MOVQ 112(SP), R12
1900 MOVQ 120(SP), R13
1901 CALL p256SubInternal(SB)
1902 MOVQ 128(SP), R14
1903 MOVQ 136(SP), R15
1904 MOVQ 144(SP), DI
1905 MOVQ 152(SP), SI
1906 CALL p256MulInternal(SB)
1907 MOVQ 32(SP), R14
1908 MOVQ 40(SP), R15
1909 MOVQ 48(SP), DI
1910 MOVQ 56(SP), SI
1911 CALL p256SubInternal(SB)
1912 MOVQ 224(SP), AX
1913
1914 // Store y
1915 MOVQ R10, 32(AX)
1916 MOVQ R11, 40(AX)
1917 MOVQ R12, 48(AX)
1918 MOVQ R13, 56(AX)
1919
1920 // ///////////////////////
1921 MOVQ $0x00000000, 224(SP)
1922 RET
1923
View as plain text