1// This file is generated from a similarly-named Perl script in the BoringSSL
2// source tree. Do not edit by hand.
3
4#include <ring-core/asm_base.h>
5
6#if !defined(OPENSSL_NO_ASM) && defined(OPENSSL_X86_64) && defined(__APPLE__)
7.text
8
9
10
11.section	__DATA,__const
12.p2align	6
13L$poly:
14.quad	0xffffffffffffffff, 0x00000000ffffffff, 0x0000000000000000, 0xffffffff00000001
15
16L$One:
17.long	1,1,1,1,1,1,1,1
18L$Two:
19.long	2,2,2,2,2,2,2,2
20L$Three:
21.long	3,3,3,3,3,3,3,3
22L$ONE_mont:
23.quad	0x0000000000000001, 0xffffffff00000000, 0xffffffffffffffff, 0x00000000fffffffe
24
25
26L$ord:
27.quad	0xf3b9cac2fc632551, 0xbce6faada7179e84, 0xffffffffffffffff, 0xffffffff00000000
28L$ordK:
29.quad	0xccd1c8aaee00bc4f
30.text
31
32
33
34.globl	_ecp_nistz256_neg
35.private_extern _ecp_nistz256_neg
36
37.p2align	5
38_ecp_nistz256_neg:
39
40_CET_ENDBR
41	pushq	%r12
42
43	pushq	%r13
44
45L$neg_body:
46
47	xorq	%r8,%r8
48	xorq	%r9,%r9
49	xorq	%r10,%r10
50	xorq	%r11,%r11
51	xorq	%r13,%r13
52
53	subq	0(%rsi),%r8
54	sbbq	8(%rsi),%r9
55	sbbq	16(%rsi),%r10
56	movq	%r8,%rax
57	sbbq	24(%rsi),%r11
58	leaq	L$poly(%rip),%rsi
59	movq	%r9,%rdx
60	sbbq	$0,%r13
61
62	addq	0(%rsi),%r8
63	movq	%r10,%rcx
64	adcq	8(%rsi),%r9
65	adcq	16(%rsi),%r10
66	movq	%r11,%r12
67	adcq	24(%rsi),%r11
68	testq	%r13,%r13
69
70	cmovzq	%rax,%r8
71	cmovzq	%rdx,%r9
72	movq	%r8,0(%rdi)
73	cmovzq	%rcx,%r10
74	movq	%r9,8(%rdi)
75	cmovzq	%r12,%r11
76	movq	%r10,16(%rdi)
77	movq	%r11,24(%rdi)
78
79	movq	0(%rsp),%r13
80
81	movq	8(%rsp),%r12
82
83	leaq	16(%rsp),%rsp
84
85L$neg_epilogue:
86	ret
87
88
89
90
91
92
93
94
95.globl	_ecp_nistz256_ord_mul_mont
96.private_extern _ecp_nistz256_ord_mul_mont
97
98.p2align	5
99_ecp_nistz256_ord_mul_mont:
100
101_CET_ENDBR
102	leaq	_OPENSSL_ia32cap_P(%rip),%rcx
103	movq	8(%rcx),%rcx
104	andl	$0x80100,%ecx
105	cmpl	$0x80100,%ecx
106	je	L$ecp_nistz256_ord_mul_montx
107	pushq	%rbp
108
109	pushq	%rbx
110
111	pushq	%r12
112
113	pushq	%r13
114
115	pushq	%r14
116
117	pushq	%r15
118
119L$ord_mul_body:
120
121	movq	0(%rdx),%rax
122	movq	%rdx,%rbx
123	leaq	L$ord(%rip),%r14
124	movq	L$ordK(%rip),%r15
125
126
127	movq	%rax,%rcx
128	mulq	0(%rsi)
129	movq	%rax,%r8
130	movq	%rcx,%rax
131	movq	%rdx,%r9
132
133	mulq	8(%rsi)
134	addq	%rax,%r9
135	movq	%rcx,%rax
136	adcq	$0,%rdx
137	movq	%rdx,%r10
138
139	mulq	16(%rsi)
140	addq	%rax,%r10
141	movq	%rcx,%rax
142	adcq	$0,%rdx
143
144	movq	%r8,%r13
145	imulq	%r15,%r8
146
147	movq	%rdx,%r11
148	mulq	24(%rsi)
149	addq	%rax,%r11
150	movq	%r8,%rax
151	adcq	$0,%rdx
152	movq	%rdx,%r12
153
154
155	mulq	0(%r14)
156	movq	%r8,%rbp
157	addq	%rax,%r13
158	movq	%r8,%rax
159	adcq	$0,%rdx
160	movq	%rdx,%rcx
161
162	subq	%r8,%r10
163	sbbq	$0,%r8
164
165	mulq	8(%r14)
166	addq	%rcx,%r9
167	adcq	$0,%rdx
168	addq	%rax,%r9
169	movq	%rbp,%rax
170	adcq	%rdx,%r10
171	movq	%rbp,%rdx
172	adcq	$0,%r8
173
174	shlq	$32,%rax
175	shrq	$32,%rdx
176	subq	%rax,%r11
177	movq	8(%rbx),%rax
178	sbbq	%rdx,%rbp
179
180	addq	%r8,%r11
181	adcq	%rbp,%r12
182	adcq	$0,%r13
183
184
185	movq	%rax,%rcx
186	mulq	0(%rsi)
187	addq	%rax,%r9
188	movq	%rcx,%rax
189	adcq	$0,%rdx
190	movq	%rdx,%rbp
191
192	mulq	8(%rsi)
193	addq	%rbp,%r10
194	adcq	$0,%rdx
195	addq	%rax,%r10
196	movq	%rcx,%rax
197	adcq	$0,%rdx
198	movq	%rdx,%rbp
199
200	mulq	16(%rsi)
201	addq	%rbp,%r11
202	adcq	$0,%rdx
203	addq	%rax,%r11
204	movq	%rcx,%rax
205	adcq	$0,%rdx
206
207	movq	%r9,%rcx
208	imulq	%r15,%r9
209
210	movq	%rdx,%rbp
211	mulq	24(%rsi)
212	addq	%rbp,%r12
213	adcq	$0,%rdx
214	xorq	%r8,%r8
215	addq	%rax,%r12
216	movq	%r9,%rax
217	adcq	%rdx,%r13
218	adcq	$0,%r8
219
220
221	mulq	0(%r14)
222	movq	%r9,%rbp
223	addq	%rax,%rcx
224	movq	%r9,%rax
225	adcq	%rdx,%rcx
226
227	subq	%r9,%r11
228	sbbq	$0,%r9
229
230	mulq	8(%r14)
231	addq	%rcx,%r10
232	adcq	$0,%rdx
233	addq	%rax,%r10
234	movq	%rbp,%rax
235	adcq	%rdx,%r11
236	movq	%rbp,%rdx
237	adcq	$0,%r9
238
239	shlq	$32,%rax
240	shrq	$32,%rdx
241	subq	%rax,%r12
242	movq	16(%rbx),%rax
243	sbbq	%rdx,%rbp
244
245	addq	%r9,%r12
246	adcq	%rbp,%r13
247	adcq	$0,%r8
248
249
250	movq	%rax,%rcx
251	mulq	0(%rsi)
252	addq	%rax,%r10
253	movq	%rcx,%rax
254	adcq	$0,%rdx
255	movq	%rdx,%rbp
256
257	mulq	8(%rsi)
258	addq	%rbp,%r11
259	adcq	$0,%rdx
260	addq	%rax,%r11
261	movq	%rcx,%rax
262	adcq	$0,%rdx
263	movq	%rdx,%rbp
264
265	mulq	16(%rsi)
266	addq	%rbp,%r12
267	adcq	$0,%rdx
268	addq	%rax,%r12
269	movq	%rcx,%rax
270	adcq	$0,%rdx
271
272	movq	%r10,%rcx
273	imulq	%r15,%r10
274
275	movq	%rdx,%rbp
276	mulq	24(%rsi)
277	addq	%rbp,%r13
278	adcq	$0,%rdx
279	xorq	%r9,%r9
280	addq	%rax,%r13
281	movq	%r10,%rax
282	adcq	%rdx,%r8
283	adcq	$0,%r9
284
285
286	mulq	0(%r14)
287	movq	%r10,%rbp
288	addq	%rax,%rcx
289	movq	%r10,%rax
290	adcq	%rdx,%rcx
291
292	subq	%r10,%r12
293	sbbq	$0,%r10
294
295	mulq	8(%r14)
296	addq	%rcx,%r11
297	adcq	$0,%rdx
298	addq	%rax,%r11
299	movq	%rbp,%rax
300	adcq	%rdx,%r12
301	movq	%rbp,%rdx
302	adcq	$0,%r10
303
304	shlq	$32,%rax
305	shrq	$32,%rdx
306	subq	%rax,%r13
307	movq	24(%rbx),%rax
308	sbbq	%rdx,%rbp
309
310	addq	%r10,%r13
311	adcq	%rbp,%r8
312	adcq	$0,%r9
313
314
315	movq	%rax,%rcx
316	mulq	0(%rsi)
317	addq	%rax,%r11
318	movq	%rcx,%rax
319	adcq	$0,%rdx
320	movq	%rdx,%rbp
321
322	mulq	8(%rsi)
323	addq	%rbp,%r12
324	adcq	$0,%rdx
325	addq	%rax,%r12
326	movq	%rcx,%rax
327	adcq	$0,%rdx
328	movq	%rdx,%rbp
329
330	mulq	16(%rsi)
331	addq	%rbp,%r13
332	adcq	$0,%rdx
333	addq	%rax,%r13
334	movq	%rcx,%rax
335	adcq	$0,%rdx
336
337	movq	%r11,%rcx
338	imulq	%r15,%r11
339
340	movq	%rdx,%rbp
341	mulq	24(%rsi)
342	addq	%rbp,%r8
343	adcq	$0,%rdx
344	xorq	%r10,%r10
345	addq	%rax,%r8
346	movq	%r11,%rax
347	adcq	%rdx,%r9
348	adcq	$0,%r10
349
350
351	mulq	0(%r14)
352	movq	%r11,%rbp
353	addq	%rax,%rcx
354	movq	%r11,%rax
355	adcq	%rdx,%rcx
356
357	subq	%r11,%r13
358	sbbq	$0,%r11
359
360	mulq	8(%r14)
361	addq	%rcx,%r12
362	adcq	$0,%rdx
363	addq	%rax,%r12
364	movq	%rbp,%rax
365	adcq	%rdx,%r13
366	movq	%rbp,%rdx
367	adcq	$0,%r11
368
369	shlq	$32,%rax
370	shrq	$32,%rdx
371	subq	%rax,%r8
372	sbbq	%rdx,%rbp
373
374	addq	%r11,%r8
375	adcq	%rbp,%r9
376	adcq	$0,%r10
377
378
379	movq	%r12,%rsi
380	subq	0(%r14),%r12
381	movq	%r13,%r11
382	sbbq	8(%r14),%r13
383	movq	%r8,%rcx
384	sbbq	16(%r14),%r8
385	movq	%r9,%rbp
386	sbbq	24(%r14),%r9
387	sbbq	$0,%r10
388
389	cmovcq	%rsi,%r12
390	cmovcq	%r11,%r13
391	cmovcq	%rcx,%r8
392	cmovcq	%rbp,%r9
393
394	movq	%r12,0(%rdi)
395	movq	%r13,8(%rdi)
396	movq	%r8,16(%rdi)
397	movq	%r9,24(%rdi)
398
399	movq	0(%rsp),%r15
400
401	movq	8(%rsp),%r14
402
403	movq	16(%rsp),%r13
404
405	movq	24(%rsp),%r12
406
407	movq	32(%rsp),%rbx
408
409	movq	40(%rsp),%rbp
410
411	leaq	48(%rsp),%rsp
412
413L$ord_mul_epilogue:
414	ret
415
416
417
418
419
420
421
422
423
424.globl	_ecp_nistz256_ord_sqr_mont
425.private_extern _ecp_nistz256_ord_sqr_mont
426
427.p2align	5
428_ecp_nistz256_ord_sqr_mont:
429
430_CET_ENDBR
431	leaq	_OPENSSL_ia32cap_P(%rip),%rcx
432	movq	8(%rcx),%rcx
433	andl	$0x80100,%ecx
434	cmpl	$0x80100,%ecx
435	je	L$ecp_nistz256_ord_sqr_montx
436	pushq	%rbp
437
438	pushq	%rbx
439
440	pushq	%r12
441
442	pushq	%r13
443
444	pushq	%r14
445
446	pushq	%r15
447
448L$ord_sqr_body:
449
450	movq	0(%rsi),%r8
451	movq	8(%rsi),%rax
452	movq	16(%rsi),%r14
453	movq	24(%rsi),%r15
454	leaq	L$ord(%rip),%rsi
455	movq	%rdx,%rbx
456	jmp	L$oop_ord_sqr
457
458.p2align	5
459L$oop_ord_sqr:
460
461	movq	%rax,%rbp
462	mulq	%r8
463	movq	%rax,%r9
464.byte	102,72,15,110,205
465	movq	%r14,%rax
466	movq	%rdx,%r10
467
468	mulq	%r8
469	addq	%rax,%r10
470	movq	%r15,%rax
471.byte	102,73,15,110,214
472	adcq	$0,%rdx
473	movq	%rdx,%r11
474
475	mulq	%r8
476	addq	%rax,%r11
477	movq	%r15,%rax
478.byte	102,73,15,110,223
479	adcq	$0,%rdx
480	movq	%rdx,%r12
481
482
483	mulq	%r14
484	movq	%rax,%r13
485	movq	%r14,%rax
486	movq	%rdx,%r14
487
488
489	mulq	%rbp
490	addq	%rax,%r11
491	movq	%r15,%rax
492	adcq	$0,%rdx
493	movq	%rdx,%r15
494
495	mulq	%rbp
496	addq	%rax,%r12
497	adcq	$0,%rdx
498
499	addq	%r15,%r12
500	adcq	%rdx,%r13
501	adcq	$0,%r14
502
503
504	xorq	%r15,%r15
505	movq	%r8,%rax
506	addq	%r9,%r9
507	adcq	%r10,%r10
508	adcq	%r11,%r11
509	adcq	%r12,%r12
510	adcq	%r13,%r13
511	adcq	%r14,%r14
512	adcq	$0,%r15
513
514
515	mulq	%rax
516	movq	%rax,%r8
517.byte	102,72,15,126,200
518	movq	%rdx,%rbp
519
520	mulq	%rax
521	addq	%rbp,%r9
522	adcq	%rax,%r10
523.byte	102,72,15,126,208
524	adcq	$0,%rdx
525	movq	%rdx,%rbp
526
527	mulq	%rax
528	addq	%rbp,%r11
529	adcq	%rax,%r12
530.byte	102,72,15,126,216
531	adcq	$0,%rdx
532	movq	%rdx,%rbp
533
534	movq	%r8,%rcx
535	imulq	32(%rsi),%r8
536
537	mulq	%rax
538	addq	%rbp,%r13
539	adcq	%rax,%r14
540	movq	0(%rsi),%rax
541	adcq	%rdx,%r15
542
543
544	mulq	%r8
545	movq	%r8,%rbp
546	addq	%rax,%rcx
547	movq	8(%rsi),%rax
548	adcq	%rdx,%rcx
549
550	subq	%r8,%r10
551	sbbq	$0,%rbp
552
553	mulq	%r8
554	addq	%rcx,%r9
555	adcq	$0,%rdx
556	addq	%rax,%r9
557	movq	%r8,%rax
558	adcq	%rdx,%r10
559	movq	%r8,%rdx
560	adcq	$0,%rbp
561
562	movq	%r9,%rcx
563	imulq	32(%rsi),%r9
564
565	shlq	$32,%rax
566	shrq	$32,%rdx
567	subq	%rax,%r11
568	movq	0(%rsi),%rax
569	sbbq	%rdx,%r8
570
571	addq	%rbp,%r11
572	adcq	$0,%r8
573
574
575	mulq	%r9
576	movq	%r9,%rbp
577	addq	%rax,%rcx
578	movq	8(%rsi),%rax
579	adcq	%rdx,%rcx
580
581	subq	%r9,%r11
582	sbbq	$0,%rbp
583
584	mulq	%r9
585	addq	%rcx,%r10
586	adcq	$0,%rdx
587	addq	%rax,%r10
588	movq	%r9,%rax
589	adcq	%rdx,%r11
590	movq	%r9,%rdx
591	adcq	$0,%rbp
592
593	movq	%r10,%rcx
594	imulq	32(%rsi),%r10
595
596	shlq	$32,%rax
597	shrq	$32,%rdx
598	subq	%rax,%r8
599	movq	0(%rsi),%rax
600	sbbq	%rdx,%r9
601
602	addq	%rbp,%r8
603	adcq	$0,%r9
604
605
606	mulq	%r10
607	movq	%r10,%rbp
608	addq	%rax,%rcx
609	movq	8(%rsi),%rax
610	adcq	%rdx,%rcx
611
612	subq	%r10,%r8
613	sbbq	$0,%rbp
614
615	mulq	%r10
616	addq	%rcx,%r11
617	adcq	$0,%rdx
618	addq	%rax,%r11
619	movq	%r10,%rax
620	adcq	%rdx,%r8
621	movq	%r10,%rdx
622	adcq	$0,%rbp
623
624	movq	%r11,%rcx
625	imulq	32(%rsi),%r11
626
627	shlq	$32,%rax
628	shrq	$32,%rdx
629	subq	%rax,%r9
630	movq	0(%rsi),%rax
631	sbbq	%rdx,%r10
632
633	addq	%rbp,%r9
634	adcq	$0,%r10
635
636
637	mulq	%r11
638	movq	%r11,%rbp
639	addq	%rax,%rcx
640	movq	8(%rsi),%rax
641	adcq	%rdx,%rcx
642
643	subq	%r11,%r9
644	sbbq	$0,%rbp
645
646	mulq	%r11
647	addq	%rcx,%r8
648	adcq	$0,%rdx
649	addq	%rax,%r8
650	movq	%r11,%rax
651	adcq	%rdx,%r9
652	movq	%r11,%rdx
653	adcq	$0,%rbp
654
655	shlq	$32,%rax
656	shrq	$32,%rdx
657	subq	%rax,%r10
658	sbbq	%rdx,%r11
659
660	addq	%rbp,%r10
661	adcq	$0,%r11
662
663
664	xorq	%rdx,%rdx
665	addq	%r12,%r8
666	adcq	%r13,%r9
667	movq	%r8,%r12
668	adcq	%r14,%r10
669	adcq	%r15,%r11
670	movq	%r9,%rax
671	adcq	$0,%rdx
672
673
674	subq	0(%rsi),%r8
675	movq	%r10,%r14
676	sbbq	8(%rsi),%r9
677	sbbq	16(%rsi),%r10
678	movq	%r11,%r15
679	sbbq	24(%rsi),%r11
680	sbbq	$0,%rdx
681
682	cmovcq	%r12,%r8
683	cmovncq	%r9,%rax
684	cmovncq	%r10,%r14
685	cmovncq	%r11,%r15
686
687	decq	%rbx
688	jnz	L$oop_ord_sqr
689
690	movq	%r8,0(%rdi)
691	movq	%rax,8(%rdi)
692	pxor	%xmm1,%xmm1
693	movq	%r14,16(%rdi)
694	pxor	%xmm2,%xmm2
695	movq	%r15,24(%rdi)
696	pxor	%xmm3,%xmm3
697
698	movq	0(%rsp),%r15
699
700	movq	8(%rsp),%r14
701
702	movq	16(%rsp),%r13
703
704	movq	24(%rsp),%r12
705
706	movq	32(%rsp),%rbx
707
708	movq	40(%rsp),%rbp
709
710	leaq	48(%rsp),%rsp
711
712L$ord_sqr_epilogue:
713	ret
714
715
716
717
718.p2align	5
719ecp_nistz256_ord_mul_montx:
720
721L$ecp_nistz256_ord_mul_montx:
722	pushq	%rbp
723
724	pushq	%rbx
725
726	pushq	%r12
727
728	pushq	%r13
729
730	pushq	%r14
731
732	pushq	%r15
733
734L$ord_mulx_body:
735
736	movq	%rdx,%rbx
737	movq	0(%rdx),%rdx
738	movq	0(%rsi),%r9
739	movq	8(%rsi),%r10
740	movq	16(%rsi),%r11
741	movq	24(%rsi),%r12
742	leaq	-128(%rsi),%rsi
743	leaq	L$ord-128(%rip),%r14
744	movq	L$ordK(%rip),%r15
745
746
747	mulxq	%r9,%r8,%r9
748	mulxq	%r10,%rcx,%r10
749	mulxq	%r11,%rbp,%r11
750	addq	%rcx,%r9
751	mulxq	%r12,%rcx,%r12
752	movq	%r8,%rdx
753	mulxq	%r15,%rdx,%rax
754	adcq	%rbp,%r10
755	adcq	%rcx,%r11
756	adcq	$0,%r12
757
758
759	xorq	%r13,%r13
760	mulxq	0+128(%r14),%rcx,%rbp
761	adcxq	%rcx,%r8
762	adoxq	%rbp,%r9
763
764	mulxq	8+128(%r14),%rcx,%rbp
765	adcxq	%rcx,%r9
766	adoxq	%rbp,%r10
767
768	mulxq	16+128(%r14),%rcx,%rbp
769	adcxq	%rcx,%r10
770	adoxq	%rbp,%r11
771
772	mulxq	24+128(%r14),%rcx,%rbp
773	movq	8(%rbx),%rdx
774	adcxq	%rcx,%r11
775	adoxq	%rbp,%r12
776	adcxq	%r8,%r12
777	adoxq	%r8,%r13
778	adcq	$0,%r13
779
780
781	mulxq	0+128(%rsi),%rcx,%rbp
782	adcxq	%rcx,%r9
783	adoxq	%rbp,%r10
784
785	mulxq	8+128(%rsi),%rcx,%rbp
786	adcxq	%rcx,%r10
787	adoxq	%rbp,%r11
788
789	mulxq	16+128(%rsi),%rcx,%rbp
790	adcxq	%rcx,%r11
791	adoxq	%rbp,%r12
792
793	mulxq	24+128(%rsi),%rcx,%rbp
794	movq	%r9,%rdx
795	mulxq	%r15,%rdx,%rax
796	adcxq	%rcx,%r12
797	adoxq	%rbp,%r13
798
799	adcxq	%r8,%r13
800	adoxq	%r8,%r8
801	adcq	$0,%r8
802
803
804	mulxq	0+128(%r14),%rcx,%rbp
805	adcxq	%rcx,%r9
806	adoxq	%rbp,%r10
807
808	mulxq	8+128(%r14),%rcx,%rbp
809	adcxq	%rcx,%r10
810	adoxq	%rbp,%r11
811
812	mulxq	16+128(%r14),%rcx,%rbp
813	adcxq	%rcx,%r11
814	adoxq	%rbp,%r12
815
816	mulxq	24+128(%r14),%rcx,%rbp
817	movq	16(%rbx),%rdx
818	adcxq	%rcx,%r12
819	adoxq	%rbp,%r13
820	adcxq	%r9,%r13
821	adoxq	%r9,%r8
822	adcq	$0,%r8
823
824
825	mulxq	0+128(%rsi),%rcx,%rbp
826	adcxq	%rcx,%r10
827	adoxq	%rbp,%r11
828
829	mulxq	8+128(%rsi),%rcx,%rbp
830	adcxq	%rcx,%r11
831	adoxq	%rbp,%r12
832
833	mulxq	16+128(%rsi),%rcx,%rbp
834	adcxq	%rcx,%r12
835	adoxq	%rbp,%r13
836
837	mulxq	24+128(%rsi),%rcx,%rbp
838	movq	%r10,%rdx
839	mulxq	%r15,%rdx,%rax
840	adcxq	%rcx,%r13
841	adoxq	%rbp,%r8
842
843	adcxq	%r9,%r8
844	adoxq	%r9,%r9
845	adcq	$0,%r9
846
847
848	mulxq	0+128(%r14),%rcx,%rbp
849	adcxq	%rcx,%r10
850	adoxq	%rbp,%r11
851
852	mulxq	8+128(%r14),%rcx,%rbp
853	adcxq	%rcx,%r11
854	adoxq	%rbp,%r12
855
856	mulxq	16+128(%r14),%rcx,%rbp
857	adcxq	%rcx,%r12
858	adoxq	%rbp,%r13
859
860	mulxq	24+128(%r14),%rcx,%rbp
861	movq	24(%rbx),%rdx
862	adcxq	%rcx,%r13
863	adoxq	%rbp,%r8
864	adcxq	%r10,%r8
865	adoxq	%r10,%r9
866	adcq	$0,%r9
867
868
869	mulxq	0+128(%rsi),%rcx,%rbp
870	adcxq	%rcx,%r11
871	adoxq	%rbp,%r12
872
873	mulxq	8+128(%rsi),%rcx,%rbp
874	adcxq	%rcx,%r12
875	adoxq	%rbp,%r13
876
877	mulxq	16+128(%rsi),%rcx,%rbp
878	adcxq	%rcx,%r13
879	adoxq	%rbp,%r8
880
881	mulxq	24+128(%rsi),%rcx,%rbp
882	movq	%r11,%rdx
883	mulxq	%r15,%rdx,%rax
884	adcxq	%rcx,%r8
885	adoxq	%rbp,%r9
886
887	adcxq	%r10,%r9
888	adoxq	%r10,%r10
889	adcq	$0,%r10
890
891
892	mulxq	0+128(%r14),%rcx,%rbp
893	adcxq	%rcx,%r11
894	adoxq	%rbp,%r12
895
896	mulxq	8+128(%r14),%rcx,%rbp
897	adcxq	%rcx,%r12
898	adoxq	%rbp,%r13
899
900	mulxq	16+128(%r14),%rcx,%rbp
901	adcxq	%rcx,%r13
902	adoxq	%rbp,%r8
903
904	mulxq	24+128(%r14),%rcx,%rbp
905	leaq	128(%r14),%r14
906	movq	%r12,%rbx
907	adcxq	%rcx,%r8
908	adoxq	%rbp,%r9
909	movq	%r13,%rdx
910	adcxq	%r11,%r9
911	adoxq	%r11,%r10
912	adcq	$0,%r10
913
914
915
916	movq	%r8,%rcx
917	subq	0(%r14),%r12
918	sbbq	8(%r14),%r13
919	sbbq	16(%r14),%r8
920	movq	%r9,%rbp
921	sbbq	24(%r14),%r9
922	sbbq	$0,%r10
923
924	cmovcq	%rbx,%r12
925	cmovcq	%rdx,%r13
926	cmovcq	%rcx,%r8
927	cmovcq	%rbp,%r9
928
929	movq	%r12,0(%rdi)
930	movq	%r13,8(%rdi)
931	movq	%r8,16(%rdi)
932	movq	%r9,24(%rdi)
933
934	movq	0(%rsp),%r15
935
936	movq	8(%rsp),%r14
937
938	movq	16(%rsp),%r13
939
940	movq	24(%rsp),%r12
941
942	movq	32(%rsp),%rbx
943
944	movq	40(%rsp),%rbp
945
946	leaq	48(%rsp),%rsp
947
948L$ord_mulx_epilogue:
949	ret
950
951
952
953
954.p2align	5
955ecp_nistz256_ord_sqr_montx:
956
957L$ecp_nistz256_ord_sqr_montx:
958	pushq	%rbp
959
960	pushq	%rbx
961
962	pushq	%r12
963
964	pushq	%r13
965
966	pushq	%r14
967
968	pushq	%r15
969
970L$ord_sqrx_body:
971
972	movq	%rdx,%rbx
973	movq	0(%rsi),%rdx
974	movq	8(%rsi),%r14
975	movq	16(%rsi),%r15
976	movq	24(%rsi),%r8
977	leaq	L$ord(%rip),%rsi
978	jmp	L$oop_ord_sqrx
979
980.p2align	5
981L$oop_ord_sqrx:
982	mulxq	%r14,%r9,%r10
983	mulxq	%r15,%rcx,%r11
984	movq	%rdx,%rax
985.byte	102,73,15,110,206
986	mulxq	%r8,%rbp,%r12
987	movq	%r14,%rdx
988	addq	%rcx,%r10
989.byte	102,73,15,110,215
990	adcq	%rbp,%r11
991	adcq	$0,%r12
992	xorq	%r13,%r13
993
994	mulxq	%r15,%rcx,%rbp
995	adcxq	%rcx,%r11
996	adoxq	%rbp,%r12
997
998	mulxq	%r8,%rcx,%rbp
999	movq	%r15,%rdx
1000	adcxq	%rcx,%r12
1001	adoxq	%rbp,%r13
1002	adcq	$0,%r13
1003
1004	mulxq	%r8,%rcx,%r14
1005	movq	%rax,%rdx
1006.byte	102,73,15,110,216
1007	xorq	%r15,%r15
1008	adcxq	%r9,%r9
1009	adoxq	%rcx,%r13
1010	adcxq	%r10,%r10
1011	adoxq	%r15,%r14
1012
1013
1014	mulxq	%rdx,%r8,%rbp
1015.byte	102,72,15,126,202
1016	adcxq	%r11,%r11
1017	adoxq	%rbp,%r9
1018	adcxq	%r12,%r12
1019	mulxq	%rdx,%rcx,%rax
1020.byte	102,72,15,126,210
1021	adcxq	%r13,%r13
1022	adoxq	%rcx,%r10
1023	adcxq	%r14,%r14
1024	mulxq	%rdx,%rcx,%rbp
1025.byte	0x67
1026.byte	102,72,15,126,218
1027	adoxq	%rax,%r11
1028	adcxq	%r15,%r15
1029	adoxq	%rcx,%r12
1030	adoxq	%rbp,%r13
1031	mulxq	%rdx,%rcx,%rax
1032	adoxq	%rcx,%r14
1033	adoxq	%rax,%r15
1034
1035
1036	movq	%r8,%rdx
1037	mulxq	32(%rsi),%rdx,%rcx
1038
1039	xorq	%rax,%rax
1040	mulxq	0(%rsi),%rcx,%rbp
1041	adcxq	%rcx,%r8
1042	adoxq	%rbp,%r9
1043	mulxq	8(%rsi),%rcx,%rbp
1044	adcxq	%rcx,%r9
1045	adoxq	%rbp,%r10
1046	mulxq	16(%rsi),%rcx,%rbp
1047	adcxq	%rcx,%r10
1048	adoxq	%rbp,%r11
1049	mulxq	24(%rsi),%rcx,%rbp
1050	adcxq	%rcx,%r11
1051	adoxq	%rbp,%r8
1052	adcxq	%rax,%r8
1053
1054
1055	movq	%r9,%rdx
1056	mulxq	32(%rsi),%rdx,%rcx
1057
1058	mulxq	0(%rsi),%rcx,%rbp
1059	adoxq	%rcx,%r9
1060	adcxq	%rbp,%r10
1061	mulxq	8(%rsi),%rcx,%rbp
1062	adoxq	%rcx,%r10
1063	adcxq	%rbp,%r11
1064	mulxq	16(%rsi),%rcx,%rbp
1065	adoxq	%rcx,%r11
1066	adcxq	%rbp,%r8
1067	mulxq	24(%rsi),%rcx,%rbp
1068	adoxq	%rcx,%r8
1069	adcxq	%rbp,%r9
1070	adoxq	%rax,%r9
1071
1072
1073	movq	%r10,%rdx
1074	mulxq	32(%rsi),%rdx,%rcx
1075
1076	mulxq	0(%rsi),%rcx,%rbp
1077	adcxq	%rcx,%r10
1078	adoxq	%rbp,%r11
1079	mulxq	8(%rsi),%rcx,%rbp
1080	adcxq	%rcx,%r11
1081	adoxq	%rbp,%r8
1082	mulxq	16(%rsi),%rcx,%rbp
1083	adcxq	%rcx,%r8
1084	adoxq	%rbp,%r9
1085	mulxq	24(%rsi),%rcx,%rbp
1086	adcxq	%rcx,%r9
1087	adoxq	%rbp,%r10
1088	adcxq	%rax,%r10
1089
1090
1091	movq	%r11,%rdx
1092	mulxq	32(%rsi),%rdx,%rcx
1093
1094	mulxq	0(%rsi),%rcx,%rbp
1095	adoxq	%rcx,%r11
1096	adcxq	%rbp,%r8
1097	mulxq	8(%rsi),%rcx,%rbp
1098	adoxq	%rcx,%r8
1099	adcxq	%rbp,%r9
1100	mulxq	16(%rsi),%rcx,%rbp
1101	adoxq	%rcx,%r9
1102	adcxq	%rbp,%r10
1103	mulxq	24(%rsi),%rcx,%rbp
1104	adoxq	%rcx,%r10
1105	adcxq	%rbp,%r11
1106	adoxq	%rax,%r11
1107
1108
1109	addq	%r8,%r12
1110	adcq	%r13,%r9
1111	movq	%r12,%rdx
1112	adcq	%r14,%r10
1113	adcq	%r15,%r11
1114	movq	%r9,%r14
1115	adcq	$0,%rax
1116
1117
1118	subq	0(%rsi),%r12
1119	movq	%r10,%r15
1120	sbbq	8(%rsi),%r9
1121	sbbq	16(%rsi),%r10
1122	movq	%r11,%r8
1123	sbbq	24(%rsi),%r11
1124	sbbq	$0,%rax
1125
1126	cmovncq	%r12,%rdx
1127	cmovncq	%r9,%r14
1128	cmovncq	%r10,%r15
1129	cmovncq	%r11,%r8
1130
1131	decq	%rbx
1132	jnz	L$oop_ord_sqrx
1133
1134	movq	%rdx,0(%rdi)
1135	movq	%r14,8(%rdi)
1136	pxor	%xmm1,%xmm1
1137	movq	%r15,16(%rdi)
1138	pxor	%xmm2,%xmm2
1139	movq	%r8,24(%rdi)
1140	pxor	%xmm3,%xmm3
1141
1142	movq	0(%rsp),%r15
1143
1144	movq	8(%rsp),%r14
1145
1146	movq	16(%rsp),%r13
1147
1148	movq	24(%rsp),%r12
1149
1150	movq	32(%rsp),%rbx
1151
1152	movq	40(%rsp),%rbp
1153
1154	leaq	48(%rsp),%rsp
1155
1156L$ord_sqrx_epilogue:
1157	ret
1158
1159
1160
1161
1162
1163
1164
1165
1166.globl	_ecp_nistz256_mul_mont
1167.private_extern _ecp_nistz256_mul_mont
1168
1169.p2align	5
1170_ecp_nistz256_mul_mont:
1171
1172_CET_ENDBR
1173	leaq	_OPENSSL_ia32cap_P(%rip),%rcx
1174	movq	8(%rcx),%rcx
1175	andl	$0x80100,%ecx
1176L$mul_mont:
1177	pushq	%rbp
1178
1179	pushq	%rbx
1180
1181	pushq	%r12
1182
1183	pushq	%r13
1184
1185	pushq	%r14
1186
1187	pushq	%r15
1188
1189L$mul_body:
1190	cmpl	$0x80100,%ecx
1191	je	L$mul_montx
1192	movq	%rdx,%rbx
1193	movq	0(%rdx),%rax
1194	movq	0(%rsi),%r9
1195	movq	8(%rsi),%r10
1196	movq	16(%rsi),%r11
1197	movq	24(%rsi),%r12
1198
1199	call	__ecp_nistz256_mul_montq
1200	jmp	L$mul_mont_done
1201
1202.p2align	5
1203L$mul_montx:
1204	movq	%rdx,%rbx
1205	movq	0(%rdx),%rdx
1206	movq	0(%rsi),%r9
1207	movq	8(%rsi),%r10
1208	movq	16(%rsi),%r11
1209	movq	24(%rsi),%r12
1210	leaq	-128(%rsi),%rsi
1211
1212	call	__ecp_nistz256_mul_montx
1213L$mul_mont_done:
1214	movq	0(%rsp),%r15
1215
1216	movq	8(%rsp),%r14
1217
1218	movq	16(%rsp),%r13
1219
1220	movq	24(%rsp),%r12
1221
1222	movq	32(%rsp),%rbx
1223
1224	movq	40(%rsp),%rbp
1225
1226	leaq	48(%rsp),%rsp
1227
1228L$mul_epilogue:
1229	ret
1230
1231
1232
1233
1234.p2align	5
1235__ecp_nistz256_mul_montq:
1236
1237
1238
1239	movq	%rax,%rbp
1240	mulq	%r9
1241	movq	L$poly+8(%rip),%r14
1242	movq	%rax,%r8
1243	movq	%rbp,%rax
1244	movq	%rdx,%r9
1245
1246	mulq	%r10
1247	movq	L$poly+24(%rip),%r15
1248	addq	%rax,%r9
1249	movq	%rbp,%rax
1250	adcq	$0,%rdx
1251	movq	%rdx,%r10
1252
1253	mulq	%r11
1254	addq	%rax,%r10
1255	movq	%rbp,%rax
1256	adcq	$0,%rdx
1257	movq	%rdx,%r11
1258
1259	mulq	%r12
1260	addq	%rax,%r11
1261	movq	%r8,%rax
1262	adcq	$0,%rdx
1263	xorq	%r13,%r13
1264	movq	%rdx,%r12
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275	movq	%r8,%rbp
1276	shlq	$32,%r8
1277	mulq	%r15
1278	shrq	$32,%rbp
1279	addq	%r8,%r9
1280	adcq	%rbp,%r10
1281	adcq	%rax,%r11
1282	movq	8(%rbx),%rax
1283	adcq	%rdx,%r12
1284	adcq	$0,%r13
1285	xorq	%r8,%r8
1286
1287
1288
1289	movq	%rax,%rbp
1290	mulq	0(%rsi)
1291	addq	%rax,%r9
1292	movq	%rbp,%rax
1293	adcq	$0,%rdx
1294	movq	%rdx,%rcx
1295
1296	mulq	8(%rsi)
1297	addq	%rcx,%r10
1298	adcq	$0,%rdx
1299	addq	%rax,%r10
1300	movq	%rbp,%rax
1301	adcq	$0,%rdx
1302	movq	%rdx,%rcx
1303
1304	mulq	16(%rsi)
1305	addq	%rcx,%r11
1306	adcq	$0,%rdx
1307	addq	%rax,%r11
1308	movq	%rbp,%rax
1309	adcq	$0,%rdx
1310	movq	%rdx,%rcx
1311
1312	mulq	24(%rsi)
1313	addq	%rcx,%r12
1314	adcq	$0,%rdx
1315	addq	%rax,%r12
1316	movq	%r9,%rax
1317	adcq	%rdx,%r13
1318	adcq	$0,%r8
1319
1320
1321
1322	movq	%r9,%rbp
1323	shlq	$32,%r9
1324	mulq	%r15
1325	shrq	$32,%rbp
1326	addq	%r9,%r10
1327	adcq	%rbp,%r11
1328	adcq	%rax,%r12
1329	movq	16(%rbx),%rax
1330	adcq	%rdx,%r13
1331	adcq	$0,%r8
1332	xorq	%r9,%r9
1333
1334
1335
1336	movq	%rax,%rbp
1337	mulq	0(%rsi)
1338	addq	%rax,%r10
1339	movq	%rbp,%rax
1340	adcq	$0,%rdx
1341	movq	%rdx,%rcx
1342
1343	mulq	8(%rsi)
1344	addq	%rcx,%r11
1345	adcq	$0,%rdx
1346	addq	%rax,%r11
1347	movq	%rbp,%rax
1348	adcq	$0,%rdx
1349	movq	%rdx,%rcx
1350
1351	mulq	16(%rsi)
1352	addq	%rcx,%r12
1353	adcq	$0,%rdx
1354	addq	%rax,%r12
1355	movq	%rbp,%rax
1356	adcq	$0,%rdx
1357	movq	%rdx,%rcx
1358
1359	mulq	24(%rsi)
1360	addq	%rcx,%r13
1361	adcq	$0,%rdx
1362	addq	%rax,%r13
1363	movq	%r10,%rax
1364	adcq	%rdx,%r8
1365	adcq	$0,%r9
1366
1367
1368
1369	movq	%r10,%rbp
1370	shlq	$32,%r10
1371	mulq	%r15
1372	shrq	$32,%rbp
1373	addq	%r10,%r11
1374	adcq	%rbp,%r12
1375	adcq	%rax,%r13
1376	movq	24(%rbx),%rax
1377	adcq	%rdx,%r8
1378	adcq	$0,%r9
1379	xorq	%r10,%r10
1380
1381
1382
1383	movq	%rax,%rbp
1384	mulq	0(%rsi)
1385	addq	%rax,%r11
1386	movq	%rbp,%rax
1387	adcq	$0,%rdx
1388	movq	%rdx,%rcx
1389
1390	mulq	8(%rsi)
1391	addq	%rcx,%r12
1392	adcq	$0,%rdx
1393	addq	%rax,%r12
1394	movq	%rbp,%rax
1395	adcq	$0,%rdx
1396	movq	%rdx,%rcx
1397
1398	mulq	16(%rsi)
1399	addq	%rcx,%r13
1400	adcq	$0,%rdx
1401	addq	%rax,%r13
1402	movq	%rbp,%rax
1403	adcq	$0,%rdx
1404	movq	%rdx,%rcx
1405
1406	mulq	24(%rsi)
1407	addq	%rcx,%r8
1408	adcq	$0,%rdx
1409	addq	%rax,%r8
1410	movq	%r11,%rax
1411	adcq	%rdx,%r9
1412	adcq	$0,%r10
1413
1414
1415
1416	movq	%r11,%rbp
1417	shlq	$32,%r11
1418	mulq	%r15
1419	shrq	$32,%rbp
1420	addq	%r11,%r12
1421	adcq	%rbp,%r13
1422	movq	%r12,%rcx
1423	adcq	%rax,%r8
1424	adcq	%rdx,%r9
1425	movq	%r13,%rbp
1426	adcq	$0,%r10
1427
1428
1429
1430	subq	$-1,%r12
1431	movq	%r8,%rbx
1432	sbbq	%r14,%r13
1433	sbbq	$0,%r8
1434	movq	%r9,%rdx
1435	sbbq	%r15,%r9
1436	sbbq	$0,%r10
1437
1438	cmovcq	%rcx,%r12
1439	cmovcq	%rbp,%r13
1440	movq	%r12,0(%rdi)
1441	cmovcq	%rbx,%r8
1442	movq	%r13,8(%rdi)
1443	cmovcq	%rdx,%r9
1444	movq	%r8,16(%rdi)
1445	movq	%r9,24(%rdi)
1446
1447	ret
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458.globl	_ecp_nistz256_sqr_mont
1459.private_extern _ecp_nistz256_sqr_mont
1460
1461.p2align	5
1462_ecp_nistz256_sqr_mont:
1463
1464_CET_ENDBR
1465	leaq	_OPENSSL_ia32cap_P(%rip),%rcx
1466	movq	8(%rcx),%rcx
1467	andl	$0x80100,%ecx
1468	pushq	%rbp
1469
1470	pushq	%rbx
1471
1472	pushq	%r12
1473
1474	pushq	%r13
1475
1476	pushq	%r14
1477
1478	pushq	%r15
1479
1480L$sqr_body:
1481	cmpl	$0x80100,%ecx
1482	je	L$sqr_montx
1483	movq	0(%rsi),%rax
1484	movq	8(%rsi),%r14
1485	movq	16(%rsi),%r15
1486	movq	24(%rsi),%r8
1487
1488	call	__ecp_nistz256_sqr_montq
1489	jmp	L$sqr_mont_done
1490
1491.p2align	5
1492L$sqr_montx:
1493	movq	0(%rsi),%rdx
1494	movq	8(%rsi),%r14
1495	movq	16(%rsi),%r15
1496	movq	24(%rsi),%r8
1497	leaq	-128(%rsi),%rsi
1498
1499	call	__ecp_nistz256_sqr_montx
1500L$sqr_mont_done:
1501	movq	0(%rsp),%r15
1502
1503	movq	8(%rsp),%r14
1504
1505	movq	16(%rsp),%r13
1506
1507	movq	24(%rsp),%r12
1508
1509	movq	32(%rsp),%rbx
1510
1511	movq	40(%rsp),%rbp
1512
1513	leaq	48(%rsp),%rsp
1514
1515L$sqr_epilogue:
1516	ret
1517
1518
1519
1520
1521.p2align	5
1522__ecp_nistz256_sqr_montq:
1523
1524	movq	%rax,%r13
1525	mulq	%r14
1526	movq	%rax,%r9
1527	movq	%r15,%rax
1528	movq	%rdx,%r10
1529
1530	mulq	%r13
1531	addq	%rax,%r10
1532	movq	%r8,%rax
1533	adcq	$0,%rdx
1534	movq	%rdx,%r11
1535
1536	mulq	%r13
1537	addq	%rax,%r11
1538	movq	%r15,%rax
1539	adcq	$0,%rdx
1540	movq	%rdx,%r12
1541
1542
1543	mulq	%r14
1544	addq	%rax,%r11
1545	movq	%r8,%rax
1546	adcq	$0,%rdx
1547	movq	%rdx,%rbp
1548
1549	mulq	%r14
1550	addq	%rax,%r12
1551	movq	%r8,%rax
1552	adcq	$0,%rdx
1553	addq	%rbp,%r12
1554	movq	%rdx,%r13
1555	adcq	$0,%r13
1556
1557
1558	mulq	%r15
1559	xorq	%r15,%r15
1560	addq	%rax,%r13
1561	movq	0(%rsi),%rax
1562	movq	%rdx,%r14
1563	adcq	$0,%r14
1564
1565	addq	%r9,%r9
1566	adcq	%r10,%r10
1567	adcq	%r11,%r11
1568	adcq	%r12,%r12
1569	adcq	%r13,%r13
1570	adcq	%r14,%r14
1571	adcq	$0,%r15
1572
1573	mulq	%rax
1574	movq	%rax,%r8
1575	movq	8(%rsi),%rax
1576	movq	%rdx,%rcx
1577
1578	mulq	%rax
1579	addq	%rcx,%r9
1580	adcq	%rax,%r10
1581	movq	16(%rsi),%rax
1582	adcq	$0,%rdx
1583	movq	%rdx,%rcx
1584
1585	mulq	%rax
1586	addq	%rcx,%r11
1587	adcq	%rax,%r12
1588	movq	24(%rsi),%rax
1589	adcq	$0,%rdx
1590	movq	%rdx,%rcx
1591
1592	mulq	%rax
1593	addq	%rcx,%r13
1594	adcq	%rax,%r14
1595	movq	%r8,%rax
1596	adcq	%rdx,%r15
1597
1598	movq	L$poly+8(%rip),%rsi
1599	movq	L$poly+24(%rip),%rbp
1600
1601
1602
1603
1604	movq	%r8,%rcx
1605	shlq	$32,%r8
1606	mulq	%rbp
1607	shrq	$32,%rcx
1608	addq	%r8,%r9
1609	adcq	%rcx,%r10
1610	adcq	%rax,%r11
1611	movq	%r9,%rax
1612	adcq	$0,%rdx
1613
1614
1615
1616	movq	%r9,%rcx
1617	shlq	$32,%r9
1618	movq	%rdx,%r8
1619	mulq	%rbp
1620	shrq	$32,%rcx
1621	addq	%r9,%r10
1622	adcq	%rcx,%r11
1623	adcq	%rax,%r8
1624	movq	%r10,%rax
1625	adcq	$0,%rdx
1626
1627
1628
1629	movq	%r10,%rcx
1630	shlq	$32,%r10
1631	movq	%rdx,%r9
1632	mulq	%rbp
1633	shrq	$32,%rcx
1634	addq	%r10,%r11
1635	adcq	%rcx,%r8
1636	adcq	%rax,%r9
1637	movq	%r11,%rax
1638	adcq	$0,%rdx
1639
1640
1641
1642	movq	%r11,%rcx
1643	shlq	$32,%r11
1644	movq	%rdx,%r10
1645	mulq	%rbp
1646	shrq	$32,%rcx
1647	addq	%r11,%r8
1648	adcq	%rcx,%r9
1649	adcq	%rax,%r10
1650	adcq	$0,%rdx
1651	xorq	%r11,%r11
1652
1653
1654
1655	addq	%r8,%r12
1656	adcq	%r9,%r13
1657	movq	%r12,%r8
1658	adcq	%r10,%r14
1659	adcq	%rdx,%r15
1660	movq	%r13,%r9
1661	adcq	$0,%r11
1662
1663	subq	$-1,%r12
1664	movq	%r14,%r10
1665	sbbq	%rsi,%r13
1666	sbbq	$0,%r14
1667	movq	%r15,%rcx
1668	sbbq	%rbp,%r15
1669	sbbq	$0,%r11
1670
1671	cmovcq	%r8,%r12
1672	cmovcq	%r9,%r13
1673	movq	%r12,0(%rdi)
1674	cmovcq	%r10,%r14
1675	movq	%r13,8(%rdi)
1676	cmovcq	%rcx,%r15
1677	movq	%r14,16(%rdi)
1678	movq	%r15,24(%rdi)
1679
1680	ret
1681
1682
1683
1684.p2align	5
1685__ecp_nistz256_mul_montx:
1686
1687
1688
1689	mulxq	%r9,%r8,%r9
1690	mulxq	%r10,%rcx,%r10
1691	movq	$32,%r14
1692	xorq	%r13,%r13
1693	mulxq	%r11,%rbp,%r11
1694	movq	L$poly+24(%rip),%r15
1695	adcq	%rcx,%r9
1696	mulxq	%r12,%rcx,%r12
1697	movq	%r8,%rdx
1698	adcq	%rbp,%r10
1699	shlxq	%r14,%r8,%rbp
1700	adcq	%rcx,%r11
1701	shrxq	%r14,%r8,%rcx
1702	adcq	$0,%r12
1703
1704
1705
1706	addq	%rbp,%r9
1707	adcq	%rcx,%r10
1708
1709	mulxq	%r15,%rcx,%rbp
1710	movq	8(%rbx),%rdx
1711	adcq	%rcx,%r11
1712	adcq	%rbp,%r12
1713	adcq	$0,%r13
1714	xorq	%r8,%r8
1715
1716
1717
1718	mulxq	0+128(%rsi),%rcx,%rbp
1719	adcxq	%rcx,%r9
1720	adoxq	%rbp,%r10
1721
1722	mulxq	8+128(%rsi),%rcx,%rbp
1723	adcxq	%rcx,%r10
1724	adoxq	%rbp,%r11
1725
1726	mulxq	16+128(%rsi),%rcx,%rbp
1727	adcxq	%rcx,%r11
1728	adoxq	%rbp,%r12
1729
1730	mulxq	24+128(%rsi),%rcx,%rbp
1731	movq	%r9,%rdx
1732	adcxq	%rcx,%r12
1733	shlxq	%r14,%r9,%rcx
1734	adoxq	%rbp,%r13
1735	shrxq	%r14,%r9,%rbp
1736
1737	adcxq	%r8,%r13
1738	adoxq	%r8,%r8
1739	adcq	$0,%r8
1740
1741
1742
1743	addq	%rcx,%r10
1744	adcq	%rbp,%r11
1745
1746	mulxq	%r15,%rcx,%rbp
1747	movq	16(%rbx),%rdx
1748	adcq	%rcx,%r12
1749	adcq	%rbp,%r13
1750	adcq	$0,%r8
1751	xorq	%r9,%r9
1752
1753
1754
1755	mulxq	0+128(%rsi),%rcx,%rbp
1756	adcxq	%rcx,%r10
1757	adoxq	%rbp,%r11
1758
1759	mulxq	8+128(%rsi),%rcx,%rbp
1760	adcxq	%rcx,%r11
1761	adoxq	%rbp,%r12
1762
1763	mulxq	16+128(%rsi),%rcx,%rbp
1764	adcxq	%rcx,%r12
1765	adoxq	%rbp,%r13
1766
1767	mulxq	24+128(%rsi),%rcx,%rbp
1768	movq	%r10,%rdx
1769	adcxq	%rcx,%r13
1770	shlxq	%r14,%r10,%rcx
1771	adoxq	%rbp,%r8
1772	shrxq	%r14,%r10,%rbp
1773
1774	adcxq	%r9,%r8
1775	adoxq	%r9,%r9
1776	adcq	$0,%r9
1777
1778
1779
1780	addq	%rcx,%r11
1781	adcq	%rbp,%r12
1782
1783	mulxq	%r15,%rcx,%rbp
1784	movq	24(%rbx),%rdx
1785	adcq	%rcx,%r13
1786	adcq	%rbp,%r8
1787	adcq	$0,%r9
1788	xorq	%r10,%r10
1789
1790
1791
1792	mulxq	0+128(%rsi),%rcx,%rbp
1793	adcxq	%rcx,%r11
1794	adoxq	%rbp,%r12
1795
1796	mulxq	8+128(%rsi),%rcx,%rbp
1797	adcxq	%rcx,%r12
1798	adoxq	%rbp,%r13
1799
1800	mulxq	16+128(%rsi),%rcx,%rbp
1801	adcxq	%rcx,%r13
1802	adoxq	%rbp,%r8
1803
1804	mulxq	24+128(%rsi),%rcx,%rbp
1805	movq	%r11,%rdx
1806	adcxq	%rcx,%r8
1807	shlxq	%r14,%r11,%rcx
1808	adoxq	%rbp,%r9
1809	shrxq	%r14,%r11,%rbp
1810
1811	adcxq	%r10,%r9
1812	adoxq	%r10,%r10
1813	adcq	$0,%r10
1814
1815
1816
1817	addq	%rcx,%r12
1818	adcq	%rbp,%r13
1819
1820	mulxq	%r15,%rcx,%rbp
1821	movq	%r12,%rbx
1822	movq	L$poly+8(%rip),%r14
1823	adcq	%rcx,%r8
1824	movq	%r13,%rdx
1825	adcq	%rbp,%r9
1826	adcq	$0,%r10
1827
1828
1829
1830	xorl	%eax,%eax
1831	movq	%r8,%rcx
1832	sbbq	$-1,%r12
1833	sbbq	%r14,%r13
1834	sbbq	$0,%r8
1835	movq	%r9,%rbp
1836	sbbq	%r15,%r9
1837	sbbq	$0,%r10
1838
1839	cmovcq	%rbx,%r12
1840	cmovcq	%rdx,%r13
1841	movq	%r12,0(%rdi)
1842	cmovcq	%rcx,%r8
1843	movq	%r13,8(%rdi)
1844	cmovcq	%rbp,%r9
1845	movq	%r8,16(%rdi)
1846	movq	%r9,24(%rdi)
1847
1848	ret
1849
1850
1851
1852
1853.p2align	5
1854__ecp_nistz256_sqr_montx:
1855
1856	mulxq	%r14,%r9,%r10
1857	mulxq	%r15,%rcx,%r11
1858	xorl	%eax,%eax
1859	adcq	%rcx,%r10
1860	mulxq	%r8,%rbp,%r12
1861	movq	%r14,%rdx
1862	adcq	%rbp,%r11
1863	adcq	$0,%r12
1864	xorq	%r13,%r13
1865
1866
1867	mulxq	%r15,%rcx,%rbp
1868	adcxq	%rcx,%r11
1869	adoxq	%rbp,%r12
1870
1871	mulxq	%r8,%rcx,%rbp
1872	movq	%r15,%rdx
1873	adcxq	%rcx,%r12
1874	adoxq	%rbp,%r13
1875	adcq	$0,%r13
1876
1877
1878	mulxq	%r8,%rcx,%r14
1879	movq	0+128(%rsi),%rdx
1880	xorq	%r15,%r15
1881	adcxq	%r9,%r9
1882	adoxq	%rcx,%r13
1883	adcxq	%r10,%r10
1884	adoxq	%r15,%r14
1885
1886	mulxq	%rdx,%r8,%rbp
1887	movq	8+128(%rsi),%rdx
1888	adcxq	%r11,%r11
1889	adoxq	%rbp,%r9
1890	adcxq	%r12,%r12
1891	mulxq	%rdx,%rcx,%rax
1892	movq	16+128(%rsi),%rdx
1893	adcxq	%r13,%r13
1894	adoxq	%rcx,%r10
1895	adcxq	%r14,%r14
1896.byte	0x67
1897	mulxq	%rdx,%rcx,%rbp
1898	movq	24+128(%rsi),%rdx
1899	adoxq	%rax,%r11
1900	adcxq	%r15,%r15
1901	adoxq	%rcx,%r12
1902	movq	$32,%rsi
1903	adoxq	%rbp,%r13
1904.byte	0x67,0x67
1905	mulxq	%rdx,%rcx,%rax
1906	movq	L$poly+24(%rip),%rdx
1907	adoxq	%rcx,%r14
1908	shlxq	%rsi,%r8,%rcx
1909	adoxq	%rax,%r15
1910	shrxq	%rsi,%r8,%rax
1911	movq	%rdx,%rbp
1912
1913
1914	addq	%rcx,%r9
1915	adcq	%rax,%r10
1916
1917	mulxq	%r8,%rcx,%r8
1918	adcq	%rcx,%r11
1919	shlxq	%rsi,%r9,%rcx
1920	adcq	$0,%r8
1921	shrxq	%rsi,%r9,%rax
1922
1923
1924	addq	%rcx,%r10
1925	adcq	%rax,%r11
1926
1927	mulxq	%r9,%rcx,%r9
1928	adcq	%rcx,%r8
1929	shlxq	%rsi,%r10,%rcx
1930	adcq	$0,%r9
1931	shrxq	%rsi,%r10,%rax
1932
1933
1934	addq	%rcx,%r11
1935	adcq	%rax,%r8
1936
1937	mulxq	%r10,%rcx,%r10
1938	adcq	%rcx,%r9
1939	shlxq	%rsi,%r11,%rcx
1940	adcq	$0,%r10
1941	shrxq	%rsi,%r11,%rax
1942
1943
1944	addq	%rcx,%r8
1945	adcq	%rax,%r9
1946
1947	mulxq	%r11,%rcx,%r11
1948	adcq	%rcx,%r10
1949	adcq	$0,%r11
1950
1951	xorq	%rdx,%rdx
1952	addq	%r8,%r12
1953	movq	L$poly+8(%rip),%rsi
1954	adcq	%r9,%r13
1955	movq	%r12,%r8
1956	adcq	%r10,%r14
1957	adcq	%r11,%r15
1958	movq	%r13,%r9
1959	adcq	$0,%rdx
1960
1961	subq	$-1,%r12
1962	movq	%r14,%r10
1963	sbbq	%rsi,%r13
1964	sbbq	$0,%r14
1965	movq	%r15,%r11
1966	sbbq	%rbp,%r15
1967	sbbq	$0,%rdx
1968
1969	cmovcq	%r8,%r12
1970	cmovcq	%r9,%r13
1971	movq	%r12,0(%rdi)
1972	cmovcq	%r10,%r14
1973	movq	%r13,8(%rdi)
1974	cmovcq	%r11,%r15
1975	movq	%r14,16(%rdi)
1976	movq	%r15,24(%rdi)
1977
1978	ret
1979
1980
1981
1982
1983.globl	_ecp_nistz256_select_w5
1984.private_extern _ecp_nistz256_select_w5
1985
1986.p2align	5
1987_ecp_nistz256_select_w5:
1988
1989_CET_ENDBR
1990	leaq	_OPENSSL_ia32cap_P(%rip),%rax
1991	movq	8(%rax),%rax
1992	testl	$32,%eax
1993	jnz	L$avx2_select_w5
1994	movdqa	L$One(%rip),%xmm0
1995	movd	%edx,%xmm1
1996
1997	pxor	%xmm2,%xmm2
1998	pxor	%xmm3,%xmm3
1999	pxor	%xmm4,%xmm4
2000	pxor	%xmm5,%xmm5
2001	pxor	%xmm6,%xmm6
2002	pxor	%xmm7,%xmm7
2003
2004	movdqa	%xmm0,%xmm8
2005	pshufd	$0,%xmm1,%xmm1
2006
2007	movq	$16,%rax
2008L$select_loop_sse_w5:
2009
2010	movdqa	%xmm8,%xmm15
2011	paddd	%xmm0,%xmm8
2012	pcmpeqd	%xmm1,%xmm15
2013
2014	movdqa	0(%rsi),%xmm9
2015	movdqa	16(%rsi),%xmm10
2016	movdqa	32(%rsi),%xmm11
2017	movdqa	48(%rsi),%xmm12
2018	movdqa	64(%rsi),%xmm13
2019	movdqa	80(%rsi),%xmm14
2020	leaq	96(%rsi),%rsi
2021
2022	pand	%xmm15,%xmm9
2023	pand	%xmm15,%xmm10
2024	por	%xmm9,%xmm2
2025	pand	%xmm15,%xmm11
2026	por	%xmm10,%xmm3
2027	pand	%xmm15,%xmm12
2028	por	%xmm11,%xmm4
2029	pand	%xmm15,%xmm13
2030	por	%xmm12,%xmm5
2031	pand	%xmm15,%xmm14
2032	por	%xmm13,%xmm6
2033	por	%xmm14,%xmm7
2034
2035	decq	%rax
2036	jnz	L$select_loop_sse_w5
2037
2038	movdqu	%xmm2,0(%rdi)
2039	movdqu	%xmm3,16(%rdi)
2040	movdqu	%xmm4,32(%rdi)
2041	movdqu	%xmm5,48(%rdi)
2042	movdqu	%xmm6,64(%rdi)
2043	movdqu	%xmm7,80(%rdi)
2044	ret
2045
2046L$SEH_end_ecp_nistz256_select_w5:
2047
2048
2049
2050
2051.globl	_ecp_nistz256_select_w7
2052.private_extern _ecp_nistz256_select_w7
2053
2054.p2align	5
2055_ecp_nistz256_select_w7:
2056
2057_CET_ENDBR
2058	leaq	_OPENSSL_ia32cap_P(%rip),%rax
2059	movq	8(%rax),%rax
2060	testl	$32,%eax
2061	jnz	L$avx2_select_w7
2062	movdqa	L$One(%rip),%xmm8
2063	movd	%edx,%xmm1
2064
2065	pxor	%xmm2,%xmm2
2066	pxor	%xmm3,%xmm3
2067	pxor	%xmm4,%xmm4
2068	pxor	%xmm5,%xmm5
2069
2070	movdqa	%xmm8,%xmm0
2071	pshufd	$0,%xmm1,%xmm1
2072	movq	$64,%rax
2073
2074L$select_loop_sse_w7:
2075	movdqa	%xmm8,%xmm15
2076	paddd	%xmm0,%xmm8
2077	movdqa	0(%rsi),%xmm9
2078	movdqa	16(%rsi),%xmm10
2079	pcmpeqd	%xmm1,%xmm15
2080	movdqa	32(%rsi),%xmm11
2081	movdqa	48(%rsi),%xmm12
2082	leaq	64(%rsi),%rsi
2083
2084	pand	%xmm15,%xmm9
2085	pand	%xmm15,%xmm10
2086	por	%xmm9,%xmm2
2087	pand	%xmm15,%xmm11
2088	por	%xmm10,%xmm3
2089	pand	%xmm15,%xmm12
2090	por	%xmm11,%xmm4
2091	prefetcht0	255(%rsi)
2092	por	%xmm12,%xmm5
2093
2094	decq	%rax
2095	jnz	L$select_loop_sse_w7
2096
2097	movdqu	%xmm2,0(%rdi)
2098	movdqu	%xmm3,16(%rdi)
2099	movdqu	%xmm4,32(%rdi)
2100	movdqu	%xmm5,48(%rdi)
2101	ret
2102
2103L$SEH_end_ecp_nistz256_select_w7:
2104
2105
2106
2107
2108.p2align	5
2109ecp_nistz256_avx2_select_w5:
2110
2111L$avx2_select_w5:
2112	vzeroupper
2113	vmovdqa	L$Two(%rip),%ymm0
2114
2115	vpxor	%ymm2,%ymm2,%ymm2
2116	vpxor	%ymm3,%ymm3,%ymm3
2117	vpxor	%ymm4,%ymm4,%ymm4
2118
2119	vmovdqa	L$One(%rip),%ymm5
2120	vmovdqa	L$Two(%rip),%ymm10
2121
2122	vmovd	%edx,%xmm1
2123	vpermd	%ymm1,%ymm2,%ymm1
2124
2125	movq	$8,%rax
2126L$select_loop_avx2_w5:
2127
2128	vmovdqa	0(%rsi),%ymm6
2129	vmovdqa	32(%rsi),%ymm7
2130	vmovdqa	64(%rsi),%ymm8
2131
2132	vmovdqa	96(%rsi),%ymm11
2133	vmovdqa	128(%rsi),%ymm12
2134	vmovdqa	160(%rsi),%ymm13
2135
2136	vpcmpeqd	%ymm1,%ymm5,%ymm9
2137	vpcmpeqd	%ymm1,%ymm10,%ymm14
2138
2139	vpaddd	%ymm0,%ymm5,%ymm5
2140	vpaddd	%ymm0,%ymm10,%ymm10
2141	leaq	192(%rsi),%rsi
2142
2143	vpand	%ymm9,%ymm6,%ymm6
2144	vpand	%ymm9,%ymm7,%ymm7
2145	vpand	%ymm9,%ymm8,%ymm8
2146	vpand	%ymm14,%ymm11,%ymm11
2147	vpand	%ymm14,%ymm12,%ymm12
2148	vpand	%ymm14,%ymm13,%ymm13
2149
2150	vpxor	%ymm6,%ymm2,%ymm2
2151	vpxor	%ymm7,%ymm3,%ymm3
2152	vpxor	%ymm8,%ymm4,%ymm4
2153	vpxor	%ymm11,%ymm2,%ymm2
2154	vpxor	%ymm12,%ymm3,%ymm3
2155	vpxor	%ymm13,%ymm4,%ymm4
2156
2157	decq	%rax
2158	jnz	L$select_loop_avx2_w5
2159
2160	vmovdqu	%ymm2,0(%rdi)
2161	vmovdqu	%ymm3,32(%rdi)
2162	vmovdqu	%ymm4,64(%rdi)
2163	vzeroupper
2164	ret
2165
2166L$SEH_end_ecp_nistz256_avx2_select_w5:
2167
2168
2169
2170
2171
2172.p2align	5
2173ecp_nistz256_avx2_select_w7:
2174
2175L$avx2_select_w7:
2176_CET_ENDBR
2177	vzeroupper
2178	vmovdqa	L$Three(%rip),%ymm0
2179
2180	vpxor	%ymm2,%ymm2,%ymm2
2181	vpxor	%ymm3,%ymm3,%ymm3
2182
2183	vmovdqa	L$One(%rip),%ymm4
2184	vmovdqa	L$Two(%rip),%ymm8
2185	vmovdqa	L$Three(%rip),%ymm12
2186
2187	vmovd	%edx,%xmm1
2188	vpermd	%ymm1,%ymm2,%ymm1
2189
2190
2191	movq	$21,%rax
2192L$select_loop_avx2_w7:
2193
2194	vmovdqa	0(%rsi),%ymm5
2195	vmovdqa	32(%rsi),%ymm6
2196
2197	vmovdqa	64(%rsi),%ymm9
2198	vmovdqa	96(%rsi),%ymm10
2199
2200	vmovdqa	128(%rsi),%ymm13
2201	vmovdqa	160(%rsi),%ymm14
2202
2203	vpcmpeqd	%ymm1,%ymm4,%ymm7
2204	vpcmpeqd	%ymm1,%ymm8,%ymm11
2205	vpcmpeqd	%ymm1,%ymm12,%ymm15
2206
2207	vpaddd	%ymm0,%ymm4,%ymm4
2208	vpaddd	%ymm0,%ymm8,%ymm8
2209	vpaddd	%ymm0,%ymm12,%ymm12
2210	leaq	192(%rsi),%rsi
2211
2212	vpand	%ymm7,%ymm5,%ymm5
2213	vpand	%ymm7,%ymm6,%ymm6
2214	vpand	%ymm11,%ymm9,%ymm9
2215	vpand	%ymm11,%ymm10,%ymm10
2216	vpand	%ymm15,%ymm13,%ymm13
2217	vpand	%ymm15,%ymm14,%ymm14
2218
2219	vpxor	%ymm5,%ymm2,%ymm2
2220	vpxor	%ymm6,%ymm3,%ymm3
2221	vpxor	%ymm9,%ymm2,%ymm2
2222	vpxor	%ymm10,%ymm3,%ymm3
2223	vpxor	%ymm13,%ymm2,%ymm2
2224	vpxor	%ymm14,%ymm3,%ymm3
2225
2226	decq	%rax
2227	jnz	L$select_loop_avx2_w7
2228
2229
2230	vmovdqa	0(%rsi),%ymm5
2231	vmovdqa	32(%rsi),%ymm6
2232
2233	vpcmpeqd	%ymm1,%ymm4,%ymm7
2234
2235	vpand	%ymm7,%ymm5,%ymm5
2236	vpand	%ymm7,%ymm6,%ymm6
2237
2238	vpxor	%ymm5,%ymm2,%ymm2
2239	vpxor	%ymm6,%ymm3,%ymm3
2240
2241	vmovdqu	%ymm2,0(%rdi)
2242	vmovdqu	%ymm3,32(%rdi)
2243	vzeroupper
2244	ret
2245
2246L$SEH_end_ecp_nistz256_avx2_select_w7:
2247
2248
2249.p2align	5
2250__ecp_nistz256_add_toq:
2251
2252	xorq	%r11,%r11
2253	addq	0(%rbx),%r12
2254	adcq	8(%rbx),%r13
2255	movq	%r12,%rax
2256	adcq	16(%rbx),%r8
2257	adcq	24(%rbx),%r9
2258	movq	%r13,%rbp
2259	adcq	$0,%r11
2260
2261	subq	$-1,%r12
2262	movq	%r8,%rcx
2263	sbbq	%r14,%r13
2264	sbbq	$0,%r8
2265	movq	%r9,%r10
2266	sbbq	%r15,%r9
2267	sbbq	$0,%r11
2268
2269	cmovcq	%rax,%r12
2270	cmovcq	%rbp,%r13
2271	movq	%r12,0(%rdi)
2272	cmovcq	%rcx,%r8
2273	movq	%r13,8(%rdi)
2274	cmovcq	%r10,%r9
2275	movq	%r8,16(%rdi)
2276	movq	%r9,24(%rdi)
2277
2278	ret
2279
2280
2281
2282
2283.p2align	5
2284__ecp_nistz256_sub_fromq:
2285
2286	subq	0(%rbx),%r12
2287	sbbq	8(%rbx),%r13
2288	movq	%r12,%rax
2289	sbbq	16(%rbx),%r8
2290	sbbq	24(%rbx),%r9
2291	movq	%r13,%rbp
2292	sbbq	%r11,%r11
2293
2294	addq	$-1,%r12
2295	movq	%r8,%rcx
2296	adcq	%r14,%r13
2297	adcq	$0,%r8
2298	movq	%r9,%r10
2299	adcq	%r15,%r9
2300	testq	%r11,%r11
2301
2302	cmovzq	%rax,%r12
2303	cmovzq	%rbp,%r13
2304	movq	%r12,0(%rdi)
2305	cmovzq	%rcx,%r8
2306	movq	%r13,8(%rdi)
2307	cmovzq	%r10,%r9
2308	movq	%r8,16(%rdi)
2309	movq	%r9,24(%rdi)
2310
2311	ret
2312
2313
2314
2315
2316.p2align	5
2317__ecp_nistz256_subq:
2318
2319	subq	%r12,%rax
2320	sbbq	%r13,%rbp
2321	movq	%rax,%r12
2322	sbbq	%r8,%rcx
2323	sbbq	%r9,%r10
2324	movq	%rbp,%r13
2325	sbbq	%r11,%r11
2326
2327	addq	$-1,%rax
2328	movq	%rcx,%r8
2329	adcq	%r14,%rbp
2330	adcq	$0,%rcx
2331	movq	%r10,%r9
2332	adcq	%r15,%r10
2333	testq	%r11,%r11
2334
2335	cmovnzq	%rax,%r12
2336	cmovnzq	%rbp,%r13
2337	cmovnzq	%rcx,%r8
2338	cmovnzq	%r10,%r9
2339
2340	ret
2341
2342
2343
2344
2345.p2align	5
2346__ecp_nistz256_mul_by_2q:
2347
2348	xorq	%r11,%r11
2349	addq	%r12,%r12
2350	adcq	%r13,%r13
2351	movq	%r12,%rax
2352	adcq	%r8,%r8
2353	adcq	%r9,%r9
2354	movq	%r13,%rbp
2355	adcq	$0,%r11
2356
2357	subq	$-1,%r12
2358	movq	%r8,%rcx
2359	sbbq	%r14,%r13
2360	sbbq	$0,%r8
2361	movq	%r9,%r10
2362	sbbq	%r15,%r9
2363	sbbq	$0,%r11
2364
2365	cmovcq	%rax,%r12
2366	cmovcq	%rbp,%r13
2367	movq	%r12,0(%rdi)
2368	cmovcq	%rcx,%r8
2369	movq	%r13,8(%rdi)
2370	cmovcq	%r10,%r9
2371	movq	%r8,16(%rdi)
2372	movq	%r9,24(%rdi)
2373
2374	ret
2375
2376
2377.globl	_ecp_nistz256_point_double
2378.private_extern _ecp_nistz256_point_double
2379
2380.p2align	5
2381_ecp_nistz256_point_double:
2382
2383_CET_ENDBR
2384	leaq	_OPENSSL_ia32cap_P(%rip),%rcx
2385	movq	8(%rcx),%rcx
2386	andl	$0x80100,%ecx
2387	cmpl	$0x80100,%ecx
2388	je	L$point_doublex
2389	pushq	%rbp
2390
2391	pushq	%rbx
2392
2393	pushq	%r12
2394
2395	pushq	%r13
2396
2397	pushq	%r14
2398
2399	pushq	%r15
2400
2401	subq	$160+8,%rsp
2402
2403L$point_doubleq_body:
2404
2405L$point_double_shortcutq:
2406	movdqu	0(%rsi),%xmm0
2407	movq	%rsi,%rbx
2408	movdqu	16(%rsi),%xmm1
2409	movq	32+0(%rsi),%r12
2410	movq	32+8(%rsi),%r13
2411	movq	32+16(%rsi),%r8
2412	movq	32+24(%rsi),%r9
2413	movq	L$poly+8(%rip),%r14
2414	movq	L$poly+24(%rip),%r15
2415	movdqa	%xmm0,96(%rsp)
2416	movdqa	%xmm1,96+16(%rsp)
2417	leaq	32(%rdi),%r10
2418	leaq	64(%rdi),%r11
2419.byte	102,72,15,110,199
2420.byte	102,73,15,110,202
2421.byte	102,73,15,110,211
2422
2423	leaq	0(%rsp),%rdi
2424	call	__ecp_nistz256_mul_by_2q
2425
2426	movq	64+0(%rsi),%rax
2427	movq	64+8(%rsi),%r14
2428	movq	64+16(%rsi),%r15
2429	movq	64+24(%rsi),%r8
2430	leaq	64-0(%rsi),%rsi
2431	leaq	64(%rsp),%rdi
2432	call	__ecp_nistz256_sqr_montq
2433
2434	movq	0+0(%rsp),%rax
2435	movq	8+0(%rsp),%r14
2436	leaq	0+0(%rsp),%rsi
2437	movq	16+0(%rsp),%r15
2438	movq	24+0(%rsp),%r8
2439	leaq	0(%rsp),%rdi
2440	call	__ecp_nistz256_sqr_montq
2441
2442	movq	32(%rbx),%rax
2443	movq	64+0(%rbx),%r9
2444	movq	64+8(%rbx),%r10
2445	movq	64+16(%rbx),%r11
2446	movq	64+24(%rbx),%r12
2447	leaq	64-0(%rbx),%rsi
2448	leaq	32(%rbx),%rbx
2449.byte	102,72,15,126,215
2450	call	__ecp_nistz256_mul_montq
2451	call	__ecp_nistz256_mul_by_2q
2452
2453	movq	96+0(%rsp),%r12
2454	movq	96+8(%rsp),%r13
2455	leaq	64(%rsp),%rbx
2456	movq	96+16(%rsp),%r8
2457	movq	96+24(%rsp),%r9
2458	leaq	32(%rsp),%rdi
2459	call	__ecp_nistz256_add_toq
2460
2461	movq	96+0(%rsp),%r12
2462	movq	96+8(%rsp),%r13
2463	leaq	64(%rsp),%rbx
2464	movq	96+16(%rsp),%r8
2465	movq	96+24(%rsp),%r9
2466	leaq	64(%rsp),%rdi
2467	call	__ecp_nistz256_sub_fromq
2468
2469	movq	0+0(%rsp),%rax
2470	movq	8+0(%rsp),%r14
2471	leaq	0+0(%rsp),%rsi
2472	movq	16+0(%rsp),%r15
2473	movq	24+0(%rsp),%r8
2474.byte	102,72,15,126,207
2475	call	__ecp_nistz256_sqr_montq
2476	xorq	%r9,%r9
2477	movq	%r12,%rax
2478	addq	$-1,%r12
2479	movq	%r13,%r10
2480	adcq	%rsi,%r13
2481	movq	%r14,%rcx
2482	adcq	$0,%r14
2483	movq	%r15,%r8
2484	adcq	%rbp,%r15
2485	adcq	$0,%r9
2486	xorq	%rsi,%rsi
2487	testq	$1,%rax
2488
2489	cmovzq	%rax,%r12
2490	cmovzq	%r10,%r13
2491	cmovzq	%rcx,%r14
2492	cmovzq	%r8,%r15
2493	cmovzq	%rsi,%r9
2494
2495	movq	%r13,%rax
2496	shrq	$1,%r12
2497	shlq	$63,%rax
2498	movq	%r14,%r10
2499	shrq	$1,%r13
2500	orq	%rax,%r12
2501	shlq	$63,%r10
2502	movq	%r15,%rcx
2503	shrq	$1,%r14
2504	orq	%r10,%r13
2505	shlq	$63,%rcx
2506	movq	%r12,0(%rdi)
2507	shrq	$1,%r15
2508	movq	%r13,8(%rdi)
2509	shlq	$63,%r9
2510	orq	%rcx,%r14
2511	orq	%r9,%r15
2512	movq	%r14,16(%rdi)
2513	movq	%r15,24(%rdi)
2514	movq	64(%rsp),%rax
2515	leaq	64(%rsp),%rbx
2516	movq	0+32(%rsp),%r9
2517	movq	8+32(%rsp),%r10
2518	leaq	0+32(%rsp),%rsi
2519	movq	16+32(%rsp),%r11
2520	movq	24+32(%rsp),%r12
2521	leaq	32(%rsp),%rdi
2522	call	__ecp_nistz256_mul_montq
2523
2524	leaq	128(%rsp),%rdi
2525	call	__ecp_nistz256_mul_by_2q
2526
2527	leaq	32(%rsp),%rbx
2528	leaq	32(%rsp),%rdi
2529	call	__ecp_nistz256_add_toq
2530
2531	movq	96(%rsp),%rax
2532	leaq	96(%rsp),%rbx
2533	movq	0+0(%rsp),%r9
2534	movq	8+0(%rsp),%r10
2535	leaq	0+0(%rsp),%rsi
2536	movq	16+0(%rsp),%r11
2537	movq	24+0(%rsp),%r12
2538	leaq	0(%rsp),%rdi
2539	call	__ecp_nistz256_mul_montq
2540
2541	leaq	128(%rsp),%rdi
2542	call	__ecp_nistz256_mul_by_2q
2543
2544	movq	0+32(%rsp),%rax
2545	movq	8+32(%rsp),%r14
2546	leaq	0+32(%rsp),%rsi
2547	movq	16+32(%rsp),%r15
2548	movq	24+32(%rsp),%r8
2549.byte	102,72,15,126,199
2550	call	__ecp_nistz256_sqr_montq
2551
2552	leaq	128(%rsp),%rbx
2553	movq	%r14,%r8
2554	movq	%r15,%r9
2555	movq	%rsi,%r14
2556	movq	%rbp,%r15
2557	call	__ecp_nistz256_sub_fromq
2558
2559	movq	0+0(%rsp),%rax
2560	movq	0+8(%rsp),%rbp
2561	movq	0+16(%rsp),%rcx
2562	movq	0+24(%rsp),%r10
2563	leaq	0(%rsp),%rdi
2564	call	__ecp_nistz256_subq
2565
2566	movq	32(%rsp),%rax
2567	leaq	32(%rsp),%rbx
2568	movq	%r12,%r14
2569	xorl	%ecx,%ecx
2570	movq	%r12,0+0(%rsp)
2571	movq	%r13,%r10
2572	movq	%r13,0+8(%rsp)
2573	cmovzq	%r8,%r11
2574	movq	%r8,0+16(%rsp)
2575	leaq	0-0(%rsp),%rsi
2576	cmovzq	%r9,%r12
2577	movq	%r9,0+24(%rsp)
2578	movq	%r14,%r9
2579	leaq	0(%rsp),%rdi
2580	call	__ecp_nistz256_mul_montq
2581
2582.byte	102,72,15,126,203
2583.byte	102,72,15,126,207
2584	call	__ecp_nistz256_sub_fromq
2585
2586	leaq	160+56(%rsp),%rsi
2587
2588	movq	-48(%rsi),%r15
2589
2590	movq	-40(%rsi),%r14
2591
2592	movq	-32(%rsi),%r13
2593
2594	movq	-24(%rsi),%r12
2595
2596	movq	-16(%rsi),%rbx
2597
2598	movq	-8(%rsi),%rbp
2599
2600	leaq	(%rsi),%rsp
2601
2602L$point_doubleq_epilogue:
2603	ret
2604
2605
2606.globl	_ecp_nistz256_point_add
2607.private_extern _ecp_nistz256_point_add
2608
2609.p2align	5
2610_ecp_nistz256_point_add:
2611
2612_CET_ENDBR
2613	leaq	_OPENSSL_ia32cap_P(%rip),%rcx
2614	movq	8(%rcx),%rcx
2615	andl	$0x80100,%ecx
2616	cmpl	$0x80100,%ecx
2617	je	L$point_addx
2618	pushq	%rbp
2619
2620	pushq	%rbx
2621
2622	pushq	%r12
2623
2624	pushq	%r13
2625
2626	pushq	%r14
2627
2628	pushq	%r15
2629
2630	subq	$576+8,%rsp
2631
2632L$point_addq_body:
2633
2634	movdqu	0(%rsi),%xmm0
2635	movdqu	16(%rsi),%xmm1
2636	movdqu	32(%rsi),%xmm2
2637	movdqu	48(%rsi),%xmm3
2638	movdqu	64(%rsi),%xmm4
2639	movdqu	80(%rsi),%xmm5
2640	movq	%rsi,%rbx
2641	movq	%rdx,%rsi
2642	movdqa	%xmm0,384(%rsp)
2643	movdqa	%xmm1,384+16(%rsp)
2644	movdqa	%xmm2,416(%rsp)
2645	movdqa	%xmm3,416+16(%rsp)
2646	movdqa	%xmm4,448(%rsp)
2647	movdqa	%xmm5,448+16(%rsp)
2648	por	%xmm4,%xmm5
2649
2650	movdqu	0(%rsi),%xmm0
2651	pshufd	$0xb1,%xmm5,%xmm3
2652	movdqu	16(%rsi),%xmm1
2653	movdqu	32(%rsi),%xmm2
2654	por	%xmm3,%xmm5
2655	movdqu	48(%rsi),%xmm3
2656	movq	64+0(%rsi),%rax
2657	movq	64+8(%rsi),%r14
2658	movq	64+16(%rsi),%r15
2659	movq	64+24(%rsi),%r8
2660	movdqa	%xmm0,480(%rsp)
2661	pshufd	$0x1e,%xmm5,%xmm4
2662	movdqa	%xmm1,480+16(%rsp)
2663	movdqu	64(%rsi),%xmm0
2664	movdqu	80(%rsi),%xmm1
2665	movdqa	%xmm2,512(%rsp)
2666	movdqa	%xmm3,512+16(%rsp)
2667	por	%xmm4,%xmm5
2668	pxor	%xmm4,%xmm4
2669	por	%xmm0,%xmm1
2670.byte	102,72,15,110,199
2671
2672	leaq	64-0(%rsi),%rsi
2673	movq	%rax,544+0(%rsp)
2674	movq	%r14,544+8(%rsp)
2675	movq	%r15,544+16(%rsp)
2676	movq	%r8,544+24(%rsp)
2677	leaq	96(%rsp),%rdi
2678	call	__ecp_nistz256_sqr_montq
2679
2680	pcmpeqd	%xmm4,%xmm5
2681	pshufd	$0xb1,%xmm1,%xmm4
2682	por	%xmm1,%xmm4
2683	pshufd	$0,%xmm5,%xmm5
2684	pshufd	$0x1e,%xmm4,%xmm3
2685	por	%xmm3,%xmm4
2686	pxor	%xmm3,%xmm3
2687	pcmpeqd	%xmm3,%xmm4
2688	pshufd	$0,%xmm4,%xmm4
2689	movq	64+0(%rbx),%rax
2690	movq	64+8(%rbx),%r14
2691	movq	64+16(%rbx),%r15
2692	movq	64+24(%rbx),%r8
2693.byte	102,72,15,110,203
2694
2695	leaq	64-0(%rbx),%rsi
2696	leaq	32(%rsp),%rdi
2697	call	__ecp_nistz256_sqr_montq
2698
2699	movq	544(%rsp),%rax
2700	leaq	544(%rsp),%rbx
2701	movq	0+96(%rsp),%r9
2702	movq	8+96(%rsp),%r10
2703	leaq	0+96(%rsp),%rsi
2704	movq	16+96(%rsp),%r11
2705	movq	24+96(%rsp),%r12
2706	leaq	224(%rsp),%rdi
2707	call	__ecp_nistz256_mul_montq
2708
2709	movq	448(%rsp),%rax
2710	leaq	448(%rsp),%rbx
2711	movq	0+32(%rsp),%r9
2712	movq	8+32(%rsp),%r10
2713	leaq	0+32(%rsp),%rsi
2714	movq	16+32(%rsp),%r11
2715	movq	24+32(%rsp),%r12
2716	leaq	256(%rsp),%rdi
2717	call	__ecp_nistz256_mul_montq
2718
2719	movq	416(%rsp),%rax
2720	leaq	416(%rsp),%rbx
2721	movq	0+224(%rsp),%r9
2722	movq	8+224(%rsp),%r10
2723	leaq	0+224(%rsp),%rsi
2724	movq	16+224(%rsp),%r11
2725	movq	24+224(%rsp),%r12
2726	leaq	224(%rsp),%rdi
2727	call	__ecp_nistz256_mul_montq
2728
2729	movq	512(%rsp),%rax
2730	leaq	512(%rsp),%rbx
2731	movq	0+256(%rsp),%r9
2732	movq	8+256(%rsp),%r10
2733	leaq	0+256(%rsp),%rsi
2734	movq	16+256(%rsp),%r11
2735	movq	24+256(%rsp),%r12
2736	leaq	256(%rsp),%rdi
2737	call	__ecp_nistz256_mul_montq
2738
2739	leaq	224(%rsp),%rbx
2740	leaq	64(%rsp),%rdi
2741	call	__ecp_nistz256_sub_fromq
2742
2743	orq	%r13,%r12
2744	movdqa	%xmm4,%xmm2
2745	orq	%r8,%r12
2746	orq	%r9,%r12
2747	por	%xmm5,%xmm2
2748.byte	102,73,15,110,220
2749
2750	movq	384(%rsp),%rax
2751	leaq	384(%rsp),%rbx
2752	movq	0+96(%rsp),%r9
2753	movq	8+96(%rsp),%r10
2754	leaq	0+96(%rsp),%rsi
2755	movq	16+96(%rsp),%r11
2756	movq	24+96(%rsp),%r12
2757	leaq	160(%rsp),%rdi
2758	call	__ecp_nistz256_mul_montq
2759
2760	movq	480(%rsp),%rax
2761	leaq	480(%rsp),%rbx
2762	movq	0+32(%rsp),%r9
2763	movq	8+32(%rsp),%r10
2764	leaq	0+32(%rsp),%rsi
2765	movq	16+32(%rsp),%r11
2766	movq	24+32(%rsp),%r12
2767	leaq	192(%rsp),%rdi
2768	call	__ecp_nistz256_mul_montq
2769
2770	leaq	160(%rsp),%rbx
2771	leaq	0(%rsp),%rdi
2772	call	__ecp_nistz256_sub_fromq
2773
2774	orq	%r13,%r12
2775	orq	%r8,%r12
2776	orq	%r9,%r12
2777
2778.byte	102,73,15,126,208
2779.byte	102,73,15,126,217
2780	orq	%r8,%r12
2781.byte	0x3e
2782	jnz	L$add_proceedq
2783
2784
2785
2786	testq	%r9,%r9
2787	jz	L$add_doubleq
2788
2789
2790
2791
2792
2793
2794.byte	102,72,15,126,199
2795	pxor	%xmm0,%xmm0
2796	movdqu	%xmm0,0(%rdi)
2797	movdqu	%xmm0,16(%rdi)
2798	movdqu	%xmm0,32(%rdi)
2799	movdqu	%xmm0,48(%rdi)
2800	movdqu	%xmm0,64(%rdi)
2801	movdqu	%xmm0,80(%rdi)
2802	jmp	L$add_doneq
2803
2804.p2align	5
2805L$add_doubleq:
2806.byte	102,72,15,126,206
2807.byte	102,72,15,126,199
2808	addq	$416,%rsp
2809
2810	jmp	L$point_double_shortcutq
2811
2812
2813.p2align	5
2814L$add_proceedq:
2815	movq	0+64(%rsp),%rax
2816	movq	8+64(%rsp),%r14
2817	leaq	0+64(%rsp),%rsi
2818	movq	16+64(%rsp),%r15
2819	movq	24+64(%rsp),%r8
2820	leaq	96(%rsp),%rdi
2821	call	__ecp_nistz256_sqr_montq
2822
2823	movq	448(%rsp),%rax
2824	leaq	448(%rsp),%rbx
2825	movq	0+0(%rsp),%r9
2826	movq	8+0(%rsp),%r10
2827	leaq	0+0(%rsp),%rsi
2828	movq	16+0(%rsp),%r11
2829	movq	24+0(%rsp),%r12
2830	leaq	352(%rsp),%rdi
2831	call	__ecp_nistz256_mul_montq
2832
2833	movq	0+0(%rsp),%rax
2834	movq	8+0(%rsp),%r14
2835	leaq	0+0(%rsp),%rsi
2836	movq	16+0(%rsp),%r15
2837	movq	24+0(%rsp),%r8
2838	leaq	32(%rsp),%rdi
2839	call	__ecp_nistz256_sqr_montq
2840
2841	movq	544(%rsp),%rax
2842	leaq	544(%rsp),%rbx
2843	movq	0+352(%rsp),%r9
2844	movq	8+352(%rsp),%r10
2845	leaq	0+352(%rsp),%rsi
2846	movq	16+352(%rsp),%r11
2847	movq	24+352(%rsp),%r12
2848	leaq	352(%rsp),%rdi
2849	call	__ecp_nistz256_mul_montq
2850
2851	movq	0(%rsp),%rax
2852	leaq	0(%rsp),%rbx
2853	movq	0+32(%rsp),%r9
2854	movq	8+32(%rsp),%r10
2855	leaq	0+32(%rsp),%rsi
2856	movq	16+32(%rsp),%r11
2857	movq	24+32(%rsp),%r12
2858	leaq	128(%rsp),%rdi
2859	call	__ecp_nistz256_mul_montq
2860
2861	movq	160(%rsp),%rax
2862	leaq	160(%rsp),%rbx
2863	movq	0+32(%rsp),%r9
2864	movq	8+32(%rsp),%r10
2865	leaq	0+32(%rsp),%rsi
2866	movq	16+32(%rsp),%r11
2867	movq	24+32(%rsp),%r12
2868	leaq	192(%rsp),%rdi
2869	call	__ecp_nistz256_mul_montq
2870
2871
2872
2873
2874	xorq	%r11,%r11
2875	addq	%r12,%r12
2876	leaq	96(%rsp),%rsi
2877	adcq	%r13,%r13
2878	movq	%r12,%rax
2879	adcq	%r8,%r8
2880	adcq	%r9,%r9
2881	movq	%r13,%rbp
2882	adcq	$0,%r11
2883
2884	subq	$-1,%r12
2885	movq	%r8,%rcx
2886	sbbq	%r14,%r13
2887	sbbq	$0,%r8
2888	movq	%r9,%r10
2889	sbbq	%r15,%r9
2890	sbbq	$0,%r11
2891
2892	cmovcq	%rax,%r12
2893	movq	0(%rsi),%rax
2894	cmovcq	%rbp,%r13
2895	movq	8(%rsi),%rbp
2896	cmovcq	%rcx,%r8
2897	movq	16(%rsi),%rcx
2898	cmovcq	%r10,%r9
2899	movq	24(%rsi),%r10
2900
2901	call	__ecp_nistz256_subq
2902
2903	leaq	128(%rsp),%rbx
2904	leaq	288(%rsp),%rdi
2905	call	__ecp_nistz256_sub_fromq
2906
2907	movq	192+0(%rsp),%rax
2908	movq	192+8(%rsp),%rbp
2909	movq	192+16(%rsp),%rcx
2910	movq	192+24(%rsp),%r10
2911	leaq	320(%rsp),%rdi
2912
2913	call	__ecp_nistz256_subq
2914
2915	movq	%r12,0(%rdi)
2916	movq	%r13,8(%rdi)
2917	movq	%r8,16(%rdi)
2918	movq	%r9,24(%rdi)
2919	movq	128(%rsp),%rax
2920	leaq	128(%rsp),%rbx
2921	movq	0+224(%rsp),%r9
2922	movq	8+224(%rsp),%r10
2923	leaq	0+224(%rsp),%rsi
2924	movq	16+224(%rsp),%r11
2925	movq	24+224(%rsp),%r12
2926	leaq	256(%rsp),%rdi
2927	call	__ecp_nistz256_mul_montq
2928
2929	movq	320(%rsp),%rax
2930	leaq	320(%rsp),%rbx
2931	movq	0+64(%rsp),%r9
2932	movq	8+64(%rsp),%r10
2933	leaq	0+64(%rsp),%rsi
2934	movq	16+64(%rsp),%r11
2935	movq	24+64(%rsp),%r12
2936	leaq	320(%rsp),%rdi
2937	call	__ecp_nistz256_mul_montq
2938
2939	leaq	256(%rsp),%rbx
2940	leaq	320(%rsp),%rdi
2941	call	__ecp_nistz256_sub_fromq
2942
2943.byte	102,72,15,126,199
2944
2945	movdqa	%xmm5,%xmm0
2946	movdqa	%xmm5,%xmm1
2947	pandn	352(%rsp),%xmm0
2948	movdqa	%xmm5,%xmm2
2949	pandn	352+16(%rsp),%xmm1
2950	movdqa	%xmm5,%xmm3
2951	pand	544(%rsp),%xmm2
2952	pand	544+16(%rsp),%xmm3
2953	por	%xmm0,%xmm2
2954	por	%xmm1,%xmm3
2955
2956	movdqa	%xmm4,%xmm0
2957	movdqa	%xmm4,%xmm1
2958	pandn	%xmm2,%xmm0
2959	movdqa	%xmm4,%xmm2
2960	pandn	%xmm3,%xmm1
2961	movdqa	%xmm4,%xmm3
2962	pand	448(%rsp),%xmm2
2963	pand	448+16(%rsp),%xmm3
2964	por	%xmm0,%xmm2
2965	por	%xmm1,%xmm3
2966	movdqu	%xmm2,64(%rdi)
2967	movdqu	%xmm3,80(%rdi)
2968
2969	movdqa	%xmm5,%xmm0
2970	movdqa	%xmm5,%xmm1
2971	pandn	288(%rsp),%xmm0
2972	movdqa	%xmm5,%xmm2
2973	pandn	288+16(%rsp),%xmm1
2974	movdqa	%xmm5,%xmm3
2975	pand	480(%rsp),%xmm2
2976	pand	480+16(%rsp),%xmm3
2977	por	%xmm0,%xmm2
2978	por	%xmm1,%xmm3
2979
2980	movdqa	%xmm4,%xmm0
2981	movdqa	%xmm4,%xmm1
2982	pandn	%xmm2,%xmm0
2983	movdqa	%xmm4,%xmm2
2984	pandn	%xmm3,%xmm1
2985	movdqa	%xmm4,%xmm3
2986	pand	384(%rsp),%xmm2
2987	pand	384+16(%rsp),%xmm3
2988	por	%xmm0,%xmm2
2989	por	%xmm1,%xmm3
2990	movdqu	%xmm2,0(%rdi)
2991	movdqu	%xmm3,16(%rdi)
2992
2993	movdqa	%xmm5,%xmm0
2994	movdqa	%xmm5,%xmm1
2995	pandn	320(%rsp),%xmm0
2996	movdqa	%xmm5,%xmm2
2997	pandn	320+16(%rsp),%xmm1
2998	movdqa	%xmm5,%xmm3
2999	pand	512(%rsp),%xmm2
3000	pand	512+16(%rsp),%xmm3
3001	por	%xmm0,%xmm2
3002	por	%xmm1,%xmm3
3003
3004	movdqa	%xmm4,%xmm0
3005	movdqa	%xmm4,%xmm1
3006	pandn	%xmm2,%xmm0
3007	movdqa	%xmm4,%xmm2
3008	pandn	%xmm3,%xmm1
3009	movdqa	%xmm4,%xmm3
3010	pand	416(%rsp),%xmm2
3011	pand	416+16(%rsp),%xmm3
3012	por	%xmm0,%xmm2
3013	por	%xmm1,%xmm3
3014	movdqu	%xmm2,32(%rdi)
3015	movdqu	%xmm3,48(%rdi)
3016
3017L$add_doneq:
3018	leaq	576+56(%rsp),%rsi
3019
3020	movq	-48(%rsi),%r15
3021
3022	movq	-40(%rsi),%r14
3023
3024	movq	-32(%rsi),%r13
3025
3026	movq	-24(%rsi),%r12
3027
3028	movq	-16(%rsi),%rbx
3029
3030	movq	-8(%rsi),%rbp
3031
3032	leaq	(%rsi),%rsp
3033
3034L$point_addq_epilogue:
3035	ret
3036
3037
3038.globl	_ecp_nistz256_point_add_affine
3039.private_extern _ecp_nistz256_point_add_affine
3040
3041.p2align	5
3042_ecp_nistz256_point_add_affine:
3043
3044_CET_ENDBR
3045	leaq	_OPENSSL_ia32cap_P(%rip),%rcx
3046	movq	8(%rcx),%rcx
3047	andl	$0x80100,%ecx
3048	cmpl	$0x80100,%ecx
3049	je	L$point_add_affinex
3050	pushq	%rbp
3051
3052	pushq	%rbx
3053
3054	pushq	%r12
3055
3056	pushq	%r13
3057
3058	pushq	%r14
3059
3060	pushq	%r15
3061
3062	subq	$480+8,%rsp
3063
3064L$add_affineq_body:
3065
3066	movdqu	0(%rsi),%xmm0
3067	movq	%rdx,%rbx
3068	movdqu	16(%rsi),%xmm1
3069	movdqu	32(%rsi),%xmm2
3070	movdqu	48(%rsi),%xmm3
3071	movdqu	64(%rsi),%xmm4
3072	movdqu	80(%rsi),%xmm5
3073	movq	64+0(%rsi),%rax
3074	movq	64+8(%rsi),%r14
3075	movq	64+16(%rsi),%r15
3076	movq	64+24(%rsi),%r8
3077	movdqa	%xmm0,320(%rsp)
3078	movdqa	%xmm1,320+16(%rsp)
3079	movdqa	%xmm2,352(%rsp)
3080	movdqa	%xmm3,352+16(%rsp)
3081	movdqa	%xmm4,384(%rsp)
3082	movdqa	%xmm5,384+16(%rsp)
3083	por	%xmm4,%xmm5
3084
3085	movdqu	0(%rbx),%xmm0
3086	pshufd	$0xb1,%xmm5,%xmm3
3087	movdqu	16(%rbx),%xmm1
3088	movdqu	32(%rbx),%xmm2
3089	por	%xmm3,%xmm5
3090	movdqu	48(%rbx),%xmm3
3091	movdqa	%xmm0,416(%rsp)
3092	pshufd	$0x1e,%xmm5,%xmm4
3093	movdqa	%xmm1,416+16(%rsp)
3094	por	%xmm0,%xmm1
3095.byte	102,72,15,110,199
3096	movdqa	%xmm2,448(%rsp)
3097	movdqa	%xmm3,448+16(%rsp)
3098	por	%xmm2,%xmm3
3099	por	%xmm4,%xmm5
3100	pxor	%xmm4,%xmm4
3101	por	%xmm1,%xmm3
3102
3103	leaq	64-0(%rsi),%rsi
3104	leaq	32(%rsp),%rdi
3105	call	__ecp_nistz256_sqr_montq
3106
3107	pcmpeqd	%xmm4,%xmm5
3108	pshufd	$0xb1,%xmm3,%xmm4
3109	movq	0(%rbx),%rax
3110
3111	movq	%r12,%r9
3112	por	%xmm3,%xmm4
3113	pshufd	$0,%xmm5,%xmm5
3114	pshufd	$0x1e,%xmm4,%xmm3
3115	movq	%r13,%r10
3116	por	%xmm3,%xmm4
3117	pxor	%xmm3,%xmm3
3118	movq	%r14,%r11
3119	pcmpeqd	%xmm3,%xmm4
3120	pshufd	$0,%xmm4,%xmm4
3121
3122	leaq	32-0(%rsp),%rsi
3123	movq	%r15,%r12
3124	leaq	0(%rsp),%rdi
3125	call	__ecp_nistz256_mul_montq
3126
3127	leaq	320(%rsp),%rbx
3128	leaq	64(%rsp),%rdi
3129	call	__ecp_nistz256_sub_fromq
3130
3131	movq	384(%rsp),%rax
3132	leaq	384(%rsp),%rbx
3133	movq	0+32(%rsp),%r9
3134	movq	8+32(%rsp),%r10
3135	leaq	0+32(%rsp),%rsi
3136	movq	16+32(%rsp),%r11
3137	movq	24+32(%rsp),%r12
3138	leaq	32(%rsp),%rdi
3139	call	__ecp_nistz256_mul_montq
3140
3141	movq	384(%rsp),%rax
3142	leaq	384(%rsp),%rbx
3143	movq	0+64(%rsp),%r9
3144	movq	8+64(%rsp),%r10
3145	leaq	0+64(%rsp),%rsi
3146	movq	16+64(%rsp),%r11
3147	movq	24+64(%rsp),%r12
3148	leaq	288(%rsp),%rdi
3149	call	__ecp_nistz256_mul_montq
3150
3151	movq	448(%rsp),%rax
3152	leaq	448(%rsp),%rbx
3153	movq	0+32(%rsp),%r9
3154	movq	8+32(%rsp),%r10
3155	leaq	0+32(%rsp),%rsi
3156	movq	16+32(%rsp),%r11
3157	movq	24+32(%rsp),%r12
3158	leaq	32(%rsp),%rdi
3159	call	__ecp_nistz256_mul_montq
3160
3161	leaq	352(%rsp),%rbx
3162	leaq	96(%rsp),%rdi
3163	call	__ecp_nistz256_sub_fromq
3164
3165	movq	0+64(%rsp),%rax
3166	movq	8+64(%rsp),%r14
3167	leaq	0+64(%rsp),%rsi
3168	movq	16+64(%rsp),%r15
3169	movq	24+64(%rsp),%r8
3170	leaq	128(%rsp),%rdi
3171	call	__ecp_nistz256_sqr_montq
3172
3173	movq	0+96(%rsp),%rax
3174	movq	8+96(%rsp),%r14
3175	leaq	0+96(%rsp),%rsi
3176	movq	16+96(%rsp),%r15
3177	movq	24+96(%rsp),%r8
3178	leaq	192(%rsp),%rdi
3179	call	__ecp_nistz256_sqr_montq
3180
3181	movq	128(%rsp),%rax
3182	leaq	128(%rsp),%rbx
3183	movq	0+64(%rsp),%r9
3184	movq	8+64(%rsp),%r10
3185	leaq	0+64(%rsp),%rsi
3186	movq	16+64(%rsp),%r11
3187	movq	24+64(%rsp),%r12
3188	leaq	160(%rsp),%rdi
3189	call	__ecp_nistz256_mul_montq
3190
3191	movq	320(%rsp),%rax
3192	leaq	320(%rsp),%rbx
3193	movq	0+128(%rsp),%r9
3194	movq	8+128(%rsp),%r10
3195	leaq	0+128(%rsp),%rsi
3196	movq	16+128(%rsp),%r11
3197	movq	24+128(%rsp),%r12
3198	leaq	0(%rsp),%rdi
3199	call	__ecp_nistz256_mul_montq
3200
3201
3202
3203
3204	xorq	%r11,%r11
3205	addq	%r12,%r12
3206	leaq	192(%rsp),%rsi
3207	adcq	%r13,%r13
3208	movq	%r12,%rax
3209	adcq	%r8,%r8
3210	adcq	%r9,%r9
3211	movq	%r13,%rbp
3212	adcq	$0,%r11
3213
3214	subq	$-1,%r12
3215	movq	%r8,%rcx
3216	sbbq	%r14,%r13
3217	sbbq	$0,%r8
3218	movq	%r9,%r10
3219	sbbq	%r15,%r9
3220	sbbq	$0,%r11
3221
3222	cmovcq	%rax,%r12
3223	movq	0(%rsi),%rax
3224	cmovcq	%rbp,%r13
3225	movq	8(%rsi),%rbp
3226	cmovcq	%rcx,%r8
3227	movq	16(%rsi),%rcx
3228	cmovcq	%r10,%r9
3229	movq	24(%rsi),%r10
3230
3231	call	__ecp_nistz256_subq
3232
3233	leaq	160(%rsp),%rbx
3234	leaq	224(%rsp),%rdi
3235	call	__ecp_nistz256_sub_fromq
3236
3237	movq	0+0(%rsp),%rax
3238	movq	0+8(%rsp),%rbp
3239	movq	0+16(%rsp),%rcx
3240	movq	0+24(%rsp),%r10
3241	leaq	64(%rsp),%rdi
3242
3243	call	__ecp_nistz256_subq
3244
3245	movq	%r12,0(%rdi)
3246	movq	%r13,8(%rdi)
3247	movq	%r8,16(%rdi)
3248	movq	%r9,24(%rdi)
3249	movq	352(%rsp),%rax
3250	leaq	352(%rsp),%rbx
3251	movq	0+160(%rsp),%r9
3252	movq	8+160(%rsp),%r10
3253	leaq	0+160(%rsp),%rsi
3254	movq	16+160(%rsp),%r11
3255	movq	24+160(%rsp),%r12
3256	leaq	32(%rsp),%rdi
3257	call	__ecp_nistz256_mul_montq
3258
3259	movq	96(%rsp),%rax
3260	leaq	96(%rsp),%rbx
3261	movq	0+64(%rsp),%r9
3262	movq	8+64(%rsp),%r10
3263	leaq	0+64(%rsp),%rsi
3264	movq	16+64(%rsp),%r11
3265	movq	24+64(%rsp),%r12
3266	leaq	64(%rsp),%rdi
3267	call	__ecp_nistz256_mul_montq
3268
3269	leaq	32(%rsp),%rbx
3270	leaq	256(%rsp),%rdi
3271	call	__ecp_nistz256_sub_fromq
3272
3273.byte	102,72,15,126,199
3274
3275	movdqa	%xmm5,%xmm0
3276	movdqa	%xmm5,%xmm1
3277	pandn	288(%rsp),%xmm0
3278	movdqa	%xmm5,%xmm2
3279	pandn	288+16(%rsp),%xmm1
3280	movdqa	%xmm5,%xmm3
3281	pand	L$ONE_mont(%rip),%xmm2
3282	pand	L$ONE_mont+16(%rip),%xmm3
3283	por	%xmm0,%xmm2
3284	por	%xmm1,%xmm3
3285
3286	movdqa	%xmm4,%xmm0
3287	movdqa	%xmm4,%xmm1
3288	pandn	%xmm2,%xmm0
3289	movdqa	%xmm4,%xmm2
3290	pandn	%xmm3,%xmm1
3291	movdqa	%xmm4,%xmm3
3292	pand	384(%rsp),%xmm2
3293	pand	384+16(%rsp),%xmm3
3294	por	%xmm0,%xmm2
3295	por	%xmm1,%xmm3
3296	movdqu	%xmm2,64(%rdi)
3297	movdqu	%xmm3,80(%rdi)
3298
3299	movdqa	%xmm5,%xmm0
3300	movdqa	%xmm5,%xmm1
3301	pandn	224(%rsp),%xmm0
3302	movdqa	%xmm5,%xmm2
3303	pandn	224+16(%rsp),%xmm1
3304	movdqa	%xmm5,%xmm3
3305	pand	416(%rsp),%xmm2
3306	pand	416+16(%rsp),%xmm3
3307	por	%xmm0,%xmm2
3308	por	%xmm1,%xmm3
3309
3310	movdqa	%xmm4,%xmm0
3311	movdqa	%xmm4,%xmm1
3312	pandn	%xmm2,%xmm0
3313	movdqa	%xmm4,%xmm2
3314	pandn	%xmm3,%xmm1
3315	movdqa	%xmm4,%xmm3
3316	pand	320(%rsp),%xmm2
3317	pand	320+16(%rsp),%xmm3
3318	por	%xmm0,%xmm2
3319	por	%xmm1,%xmm3
3320	movdqu	%xmm2,0(%rdi)
3321	movdqu	%xmm3,16(%rdi)
3322
3323	movdqa	%xmm5,%xmm0
3324	movdqa	%xmm5,%xmm1
3325	pandn	256(%rsp),%xmm0
3326	movdqa	%xmm5,%xmm2
3327	pandn	256+16(%rsp),%xmm1
3328	movdqa	%xmm5,%xmm3
3329	pand	448(%rsp),%xmm2
3330	pand	448+16(%rsp),%xmm3
3331	por	%xmm0,%xmm2
3332	por	%xmm1,%xmm3
3333
3334	movdqa	%xmm4,%xmm0
3335	movdqa	%xmm4,%xmm1
3336	pandn	%xmm2,%xmm0
3337	movdqa	%xmm4,%xmm2
3338	pandn	%xmm3,%xmm1
3339	movdqa	%xmm4,%xmm3
3340	pand	352(%rsp),%xmm2
3341	pand	352+16(%rsp),%xmm3
3342	por	%xmm0,%xmm2
3343	por	%xmm1,%xmm3
3344	movdqu	%xmm2,32(%rdi)
3345	movdqu	%xmm3,48(%rdi)
3346
3347	leaq	480+56(%rsp),%rsi
3348
3349	movq	-48(%rsi),%r15
3350
3351	movq	-40(%rsi),%r14
3352
3353	movq	-32(%rsi),%r13
3354
3355	movq	-24(%rsi),%r12
3356
3357	movq	-16(%rsi),%rbx
3358
3359	movq	-8(%rsi),%rbp
3360
3361	leaq	(%rsi),%rsp
3362
3363L$add_affineq_epilogue:
3364	ret
3365
3366
3367
3368.p2align	5
3369__ecp_nistz256_add_tox:
3370
3371	xorq	%r11,%r11
3372	adcq	0(%rbx),%r12
3373	adcq	8(%rbx),%r13
3374	movq	%r12,%rax
3375	adcq	16(%rbx),%r8
3376	adcq	24(%rbx),%r9
3377	movq	%r13,%rbp
3378	adcq	$0,%r11
3379
3380	xorq	%r10,%r10
3381	sbbq	$-1,%r12
3382	movq	%r8,%rcx
3383	sbbq	%r14,%r13
3384	sbbq	$0,%r8
3385	movq	%r9,%r10
3386	sbbq	%r15,%r9
3387	sbbq	$0,%r11
3388
3389	cmovcq	%rax,%r12
3390	cmovcq	%rbp,%r13
3391	movq	%r12,0(%rdi)
3392	cmovcq	%rcx,%r8
3393	movq	%r13,8(%rdi)
3394	cmovcq	%r10,%r9
3395	movq	%r8,16(%rdi)
3396	movq	%r9,24(%rdi)
3397
3398	ret
3399
3400
3401
3402
3403.p2align	5
3404__ecp_nistz256_sub_fromx:
3405
3406	xorq	%r11,%r11
3407	sbbq	0(%rbx),%r12
3408	sbbq	8(%rbx),%r13
3409	movq	%r12,%rax
3410	sbbq	16(%rbx),%r8
3411	sbbq	24(%rbx),%r9
3412	movq	%r13,%rbp
3413	sbbq	$0,%r11
3414
3415	xorq	%r10,%r10
3416	adcq	$-1,%r12
3417	movq	%r8,%rcx
3418	adcq	%r14,%r13
3419	adcq	$0,%r8
3420	movq	%r9,%r10
3421	adcq	%r15,%r9
3422
3423	btq	$0,%r11
3424	cmovncq	%rax,%r12
3425	cmovncq	%rbp,%r13
3426	movq	%r12,0(%rdi)
3427	cmovncq	%rcx,%r8
3428	movq	%r13,8(%rdi)
3429	cmovncq	%r10,%r9
3430	movq	%r8,16(%rdi)
3431	movq	%r9,24(%rdi)
3432
3433	ret
3434
3435
3436
3437
3438.p2align	5
3439__ecp_nistz256_subx:
3440
3441	xorq	%r11,%r11
3442	sbbq	%r12,%rax
3443	sbbq	%r13,%rbp
3444	movq	%rax,%r12
3445	sbbq	%r8,%rcx
3446	sbbq	%r9,%r10
3447	movq	%rbp,%r13
3448	sbbq	$0,%r11
3449
3450	xorq	%r9,%r9
3451	adcq	$-1,%rax
3452	movq	%rcx,%r8
3453	adcq	%r14,%rbp
3454	adcq	$0,%rcx
3455	movq	%r10,%r9
3456	adcq	%r15,%r10
3457
3458	btq	$0,%r11
3459	cmovcq	%rax,%r12
3460	cmovcq	%rbp,%r13
3461	cmovcq	%rcx,%r8
3462	cmovcq	%r10,%r9
3463
3464	ret
3465
3466
3467
3468
3469.p2align	5
3470__ecp_nistz256_mul_by_2x:
3471
3472	xorq	%r11,%r11
3473	adcq	%r12,%r12
3474	adcq	%r13,%r13
3475	movq	%r12,%rax
3476	adcq	%r8,%r8
3477	adcq	%r9,%r9
3478	movq	%r13,%rbp
3479	adcq	$0,%r11
3480
3481	xorq	%r10,%r10
3482	sbbq	$-1,%r12
3483	movq	%r8,%rcx
3484	sbbq	%r14,%r13
3485	sbbq	$0,%r8
3486	movq	%r9,%r10
3487	sbbq	%r15,%r9
3488	sbbq	$0,%r11
3489
3490	cmovcq	%rax,%r12
3491	cmovcq	%rbp,%r13
3492	movq	%r12,0(%rdi)
3493	cmovcq	%rcx,%r8
3494	movq	%r13,8(%rdi)
3495	cmovcq	%r10,%r9
3496	movq	%r8,16(%rdi)
3497	movq	%r9,24(%rdi)
3498
3499	ret
3500
3501
3502
3503.p2align	5
3504ecp_nistz256_point_doublex:
3505
3506L$point_doublex:
3507	pushq	%rbp
3508
3509	pushq	%rbx
3510
3511	pushq	%r12
3512
3513	pushq	%r13
3514
3515	pushq	%r14
3516
3517	pushq	%r15
3518
3519	subq	$160+8,%rsp
3520
3521L$point_doublex_body:
3522
3523L$point_double_shortcutx:
3524	movdqu	0(%rsi),%xmm0
3525	movq	%rsi,%rbx
3526	movdqu	16(%rsi),%xmm1
3527	movq	32+0(%rsi),%r12
3528	movq	32+8(%rsi),%r13
3529	movq	32+16(%rsi),%r8
3530	movq	32+24(%rsi),%r9
3531	movq	L$poly+8(%rip),%r14
3532	movq	L$poly+24(%rip),%r15
3533	movdqa	%xmm0,96(%rsp)
3534	movdqa	%xmm1,96+16(%rsp)
3535	leaq	32(%rdi),%r10
3536	leaq	64(%rdi),%r11
3537.byte	102,72,15,110,199
3538.byte	102,73,15,110,202
3539.byte	102,73,15,110,211
3540
3541	leaq	0(%rsp),%rdi
3542	call	__ecp_nistz256_mul_by_2x
3543
3544	movq	64+0(%rsi),%rdx
3545	movq	64+8(%rsi),%r14
3546	movq	64+16(%rsi),%r15
3547	movq	64+24(%rsi),%r8
3548	leaq	64-128(%rsi),%rsi
3549	leaq	64(%rsp),%rdi
3550	call	__ecp_nistz256_sqr_montx
3551
3552	movq	0+0(%rsp),%rdx
3553	movq	8+0(%rsp),%r14
3554	leaq	-128+0(%rsp),%rsi
3555	movq	16+0(%rsp),%r15
3556	movq	24+0(%rsp),%r8
3557	leaq	0(%rsp),%rdi
3558	call	__ecp_nistz256_sqr_montx
3559
3560	movq	32(%rbx),%rdx
3561	movq	64+0(%rbx),%r9
3562	movq	64+8(%rbx),%r10
3563	movq	64+16(%rbx),%r11
3564	movq	64+24(%rbx),%r12
3565	leaq	64-128(%rbx),%rsi
3566	leaq	32(%rbx),%rbx
3567.byte	102,72,15,126,215
3568	call	__ecp_nistz256_mul_montx
3569	call	__ecp_nistz256_mul_by_2x
3570
3571	movq	96+0(%rsp),%r12
3572	movq	96+8(%rsp),%r13
3573	leaq	64(%rsp),%rbx
3574	movq	96+16(%rsp),%r8
3575	movq	96+24(%rsp),%r9
3576	leaq	32(%rsp),%rdi
3577	call	__ecp_nistz256_add_tox
3578
3579	movq	96+0(%rsp),%r12
3580	movq	96+8(%rsp),%r13
3581	leaq	64(%rsp),%rbx
3582	movq	96+16(%rsp),%r8
3583	movq	96+24(%rsp),%r9
3584	leaq	64(%rsp),%rdi
3585	call	__ecp_nistz256_sub_fromx
3586
3587	movq	0+0(%rsp),%rdx
3588	movq	8+0(%rsp),%r14
3589	leaq	-128+0(%rsp),%rsi
3590	movq	16+0(%rsp),%r15
3591	movq	24+0(%rsp),%r8
3592.byte	102,72,15,126,207
3593	call	__ecp_nistz256_sqr_montx
3594	xorq	%r9,%r9
3595	movq	%r12,%rax
3596	addq	$-1,%r12
3597	movq	%r13,%r10
3598	adcq	%rsi,%r13
3599	movq	%r14,%rcx
3600	adcq	$0,%r14
3601	movq	%r15,%r8
3602	adcq	%rbp,%r15
3603	adcq	$0,%r9
3604	xorq	%rsi,%rsi
3605	testq	$1,%rax
3606
3607	cmovzq	%rax,%r12
3608	cmovzq	%r10,%r13
3609	cmovzq	%rcx,%r14
3610	cmovzq	%r8,%r15
3611	cmovzq	%rsi,%r9
3612
3613	movq	%r13,%rax
3614	shrq	$1,%r12
3615	shlq	$63,%rax
3616	movq	%r14,%r10
3617	shrq	$1,%r13
3618	orq	%rax,%r12
3619	shlq	$63,%r10
3620	movq	%r15,%rcx
3621	shrq	$1,%r14
3622	orq	%r10,%r13
3623	shlq	$63,%rcx
3624	movq	%r12,0(%rdi)
3625	shrq	$1,%r15
3626	movq	%r13,8(%rdi)
3627	shlq	$63,%r9
3628	orq	%rcx,%r14
3629	orq	%r9,%r15
3630	movq	%r14,16(%rdi)
3631	movq	%r15,24(%rdi)
3632	movq	64(%rsp),%rdx
3633	leaq	64(%rsp),%rbx
3634	movq	0+32(%rsp),%r9
3635	movq	8+32(%rsp),%r10
3636	leaq	-128+32(%rsp),%rsi
3637	movq	16+32(%rsp),%r11
3638	movq	24+32(%rsp),%r12
3639	leaq	32(%rsp),%rdi
3640	call	__ecp_nistz256_mul_montx
3641
3642	leaq	128(%rsp),%rdi
3643	call	__ecp_nistz256_mul_by_2x
3644
3645	leaq	32(%rsp),%rbx
3646	leaq	32(%rsp),%rdi
3647	call	__ecp_nistz256_add_tox
3648
3649	movq	96(%rsp),%rdx
3650	leaq	96(%rsp),%rbx
3651	movq	0+0(%rsp),%r9
3652	movq	8+0(%rsp),%r10
3653	leaq	-128+0(%rsp),%rsi
3654	movq	16+0(%rsp),%r11
3655	movq	24+0(%rsp),%r12
3656	leaq	0(%rsp),%rdi
3657	call	__ecp_nistz256_mul_montx
3658
3659	leaq	128(%rsp),%rdi
3660	call	__ecp_nistz256_mul_by_2x
3661
3662	movq	0+32(%rsp),%rdx
3663	movq	8+32(%rsp),%r14
3664	leaq	-128+32(%rsp),%rsi
3665	movq	16+32(%rsp),%r15
3666	movq	24+32(%rsp),%r8
3667.byte	102,72,15,126,199
3668	call	__ecp_nistz256_sqr_montx
3669
3670	leaq	128(%rsp),%rbx
3671	movq	%r14,%r8
3672	movq	%r15,%r9
3673	movq	%rsi,%r14
3674	movq	%rbp,%r15
3675	call	__ecp_nistz256_sub_fromx
3676
3677	movq	0+0(%rsp),%rax
3678	movq	0+8(%rsp),%rbp
3679	movq	0+16(%rsp),%rcx
3680	movq	0+24(%rsp),%r10
3681	leaq	0(%rsp),%rdi
3682	call	__ecp_nistz256_subx
3683
3684	movq	32(%rsp),%rdx
3685	leaq	32(%rsp),%rbx
3686	movq	%r12,%r14
3687	xorl	%ecx,%ecx
3688	movq	%r12,0+0(%rsp)
3689	movq	%r13,%r10
3690	movq	%r13,0+8(%rsp)
3691	cmovzq	%r8,%r11
3692	movq	%r8,0+16(%rsp)
3693	leaq	0-128(%rsp),%rsi
3694	cmovzq	%r9,%r12
3695	movq	%r9,0+24(%rsp)
3696	movq	%r14,%r9
3697	leaq	0(%rsp),%rdi
3698	call	__ecp_nistz256_mul_montx
3699
3700.byte	102,72,15,126,203
3701.byte	102,72,15,126,207
3702	call	__ecp_nistz256_sub_fromx
3703
3704	leaq	160+56(%rsp),%rsi
3705
3706	movq	-48(%rsi),%r15
3707
3708	movq	-40(%rsi),%r14
3709
3710	movq	-32(%rsi),%r13
3711
3712	movq	-24(%rsi),%r12
3713
3714	movq	-16(%rsi),%rbx
3715
3716	movq	-8(%rsi),%rbp
3717
3718	leaq	(%rsi),%rsp
3719
3720L$point_doublex_epilogue:
3721	ret
3722
3723
3724
3725.p2align	5
3726ecp_nistz256_point_addx:
3727
3728L$point_addx:
3729	pushq	%rbp
3730
3731	pushq	%rbx
3732
3733	pushq	%r12
3734
3735	pushq	%r13
3736
3737	pushq	%r14
3738
3739	pushq	%r15
3740
3741	subq	$576+8,%rsp
3742
3743L$point_addx_body:
3744
3745	movdqu	0(%rsi),%xmm0
3746	movdqu	16(%rsi),%xmm1
3747	movdqu	32(%rsi),%xmm2
3748	movdqu	48(%rsi),%xmm3
3749	movdqu	64(%rsi),%xmm4
3750	movdqu	80(%rsi),%xmm5
3751	movq	%rsi,%rbx
3752	movq	%rdx,%rsi
3753	movdqa	%xmm0,384(%rsp)
3754	movdqa	%xmm1,384+16(%rsp)
3755	movdqa	%xmm2,416(%rsp)
3756	movdqa	%xmm3,416+16(%rsp)
3757	movdqa	%xmm4,448(%rsp)
3758	movdqa	%xmm5,448+16(%rsp)
3759	por	%xmm4,%xmm5
3760
3761	movdqu	0(%rsi),%xmm0
3762	pshufd	$0xb1,%xmm5,%xmm3
3763	movdqu	16(%rsi),%xmm1
3764	movdqu	32(%rsi),%xmm2
3765	por	%xmm3,%xmm5
3766	movdqu	48(%rsi),%xmm3
3767	movq	64+0(%rsi),%rdx
3768	movq	64+8(%rsi),%r14
3769	movq	64+16(%rsi),%r15
3770	movq	64+24(%rsi),%r8
3771	movdqa	%xmm0,480(%rsp)
3772	pshufd	$0x1e,%xmm5,%xmm4
3773	movdqa	%xmm1,480+16(%rsp)
3774	movdqu	64(%rsi),%xmm0
3775	movdqu	80(%rsi),%xmm1
3776	movdqa	%xmm2,512(%rsp)
3777	movdqa	%xmm3,512+16(%rsp)
3778	por	%xmm4,%xmm5
3779	pxor	%xmm4,%xmm4
3780	por	%xmm0,%xmm1
3781.byte	102,72,15,110,199
3782
3783	leaq	64-128(%rsi),%rsi
3784	movq	%rdx,544+0(%rsp)
3785	movq	%r14,544+8(%rsp)
3786	movq	%r15,544+16(%rsp)
3787	movq	%r8,544+24(%rsp)
3788	leaq	96(%rsp),%rdi
3789	call	__ecp_nistz256_sqr_montx
3790
3791	pcmpeqd	%xmm4,%xmm5
3792	pshufd	$0xb1,%xmm1,%xmm4
3793	por	%xmm1,%xmm4
3794	pshufd	$0,%xmm5,%xmm5
3795	pshufd	$0x1e,%xmm4,%xmm3
3796	por	%xmm3,%xmm4
3797	pxor	%xmm3,%xmm3
3798	pcmpeqd	%xmm3,%xmm4
3799	pshufd	$0,%xmm4,%xmm4
3800	movq	64+0(%rbx),%rdx
3801	movq	64+8(%rbx),%r14
3802	movq	64+16(%rbx),%r15
3803	movq	64+24(%rbx),%r8
3804.byte	102,72,15,110,203
3805
3806	leaq	64-128(%rbx),%rsi
3807	leaq	32(%rsp),%rdi
3808	call	__ecp_nistz256_sqr_montx
3809
3810	movq	544(%rsp),%rdx
3811	leaq	544(%rsp),%rbx
3812	movq	0+96(%rsp),%r9
3813	movq	8+96(%rsp),%r10
3814	leaq	-128+96(%rsp),%rsi
3815	movq	16+96(%rsp),%r11
3816	movq	24+96(%rsp),%r12
3817	leaq	224(%rsp),%rdi
3818	call	__ecp_nistz256_mul_montx
3819
3820	movq	448(%rsp),%rdx
3821	leaq	448(%rsp),%rbx
3822	movq	0+32(%rsp),%r9
3823	movq	8+32(%rsp),%r10
3824	leaq	-128+32(%rsp),%rsi
3825	movq	16+32(%rsp),%r11
3826	movq	24+32(%rsp),%r12
3827	leaq	256(%rsp),%rdi
3828	call	__ecp_nistz256_mul_montx
3829
3830	movq	416(%rsp),%rdx
3831	leaq	416(%rsp),%rbx
3832	movq	0+224(%rsp),%r9
3833	movq	8+224(%rsp),%r10
3834	leaq	-128+224(%rsp),%rsi
3835	movq	16+224(%rsp),%r11
3836	movq	24+224(%rsp),%r12
3837	leaq	224(%rsp),%rdi
3838	call	__ecp_nistz256_mul_montx
3839
3840	movq	512(%rsp),%rdx
3841	leaq	512(%rsp),%rbx
3842	movq	0+256(%rsp),%r9
3843	movq	8+256(%rsp),%r10
3844	leaq	-128+256(%rsp),%rsi
3845	movq	16+256(%rsp),%r11
3846	movq	24+256(%rsp),%r12
3847	leaq	256(%rsp),%rdi
3848	call	__ecp_nistz256_mul_montx
3849
3850	leaq	224(%rsp),%rbx
3851	leaq	64(%rsp),%rdi
3852	call	__ecp_nistz256_sub_fromx
3853
3854	orq	%r13,%r12
3855	movdqa	%xmm4,%xmm2
3856	orq	%r8,%r12
3857	orq	%r9,%r12
3858	por	%xmm5,%xmm2
3859.byte	102,73,15,110,220
3860
3861	movq	384(%rsp),%rdx
3862	leaq	384(%rsp),%rbx
3863	movq	0+96(%rsp),%r9
3864	movq	8+96(%rsp),%r10
3865	leaq	-128+96(%rsp),%rsi
3866	movq	16+96(%rsp),%r11
3867	movq	24+96(%rsp),%r12
3868	leaq	160(%rsp),%rdi
3869	call	__ecp_nistz256_mul_montx
3870
3871	movq	480(%rsp),%rdx
3872	leaq	480(%rsp),%rbx
3873	movq	0+32(%rsp),%r9
3874	movq	8+32(%rsp),%r10
3875	leaq	-128+32(%rsp),%rsi
3876	movq	16+32(%rsp),%r11
3877	movq	24+32(%rsp),%r12
3878	leaq	192(%rsp),%rdi
3879	call	__ecp_nistz256_mul_montx
3880
3881	leaq	160(%rsp),%rbx
3882	leaq	0(%rsp),%rdi
3883	call	__ecp_nistz256_sub_fromx
3884
3885	orq	%r13,%r12
3886	orq	%r8,%r12
3887	orq	%r9,%r12
3888
3889.byte	102,73,15,126,208
3890.byte	102,73,15,126,217
3891	orq	%r8,%r12
3892.byte	0x3e
3893	jnz	L$add_proceedx
3894
3895
3896
3897	testq	%r9,%r9
3898	jz	L$add_doublex
3899
3900
3901
3902
3903
3904
3905.byte	102,72,15,126,199
3906	pxor	%xmm0,%xmm0
3907	movdqu	%xmm0,0(%rdi)
3908	movdqu	%xmm0,16(%rdi)
3909	movdqu	%xmm0,32(%rdi)
3910	movdqu	%xmm0,48(%rdi)
3911	movdqu	%xmm0,64(%rdi)
3912	movdqu	%xmm0,80(%rdi)
3913	jmp	L$add_donex
3914
3915.p2align	5
3916L$add_doublex:
3917.byte	102,72,15,126,206
3918.byte	102,72,15,126,199
3919	addq	$416,%rsp
3920
3921	jmp	L$point_double_shortcutx
3922
3923
3924.p2align	5
3925L$add_proceedx:
3926	movq	0+64(%rsp),%rdx
3927	movq	8+64(%rsp),%r14
3928	leaq	-128+64(%rsp),%rsi
3929	movq	16+64(%rsp),%r15
3930	movq	24+64(%rsp),%r8
3931	leaq	96(%rsp),%rdi
3932	call	__ecp_nistz256_sqr_montx
3933
3934	movq	448(%rsp),%rdx
3935	leaq	448(%rsp),%rbx
3936	movq	0+0(%rsp),%r9
3937	movq	8+0(%rsp),%r10
3938	leaq	-128+0(%rsp),%rsi
3939	movq	16+0(%rsp),%r11
3940	movq	24+0(%rsp),%r12
3941	leaq	352(%rsp),%rdi
3942	call	__ecp_nistz256_mul_montx
3943
3944	movq	0+0(%rsp),%rdx
3945	movq	8+0(%rsp),%r14
3946	leaq	-128+0(%rsp),%rsi
3947	movq	16+0(%rsp),%r15
3948	movq	24+0(%rsp),%r8
3949	leaq	32(%rsp),%rdi
3950	call	__ecp_nistz256_sqr_montx
3951
3952	movq	544(%rsp),%rdx
3953	leaq	544(%rsp),%rbx
3954	movq	0+352(%rsp),%r9
3955	movq	8+352(%rsp),%r10
3956	leaq	-128+352(%rsp),%rsi
3957	movq	16+352(%rsp),%r11
3958	movq	24+352(%rsp),%r12
3959	leaq	352(%rsp),%rdi
3960	call	__ecp_nistz256_mul_montx
3961
3962	movq	0(%rsp),%rdx
3963	leaq	0(%rsp),%rbx
3964	movq	0+32(%rsp),%r9
3965	movq	8+32(%rsp),%r10
3966	leaq	-128+32(%rsp),%rsi
3967	movq	16+32(%rsp),%r11
3968	movq	24+32(%rsp),%r12
3969	leaq	128(%rsp),%rdi
3970	call	__ecp_nistz256_mul_montx
3971
3972	movq	160(%rsp),%rdx
3973	leaq	160(%rsp),%rbx
3974	movq	0+32(%rsp),%r9
3975	movq	8+32(%rsp),%r10
3976	leaq	-128+32(%rsp),%rsi
3977	movq	16+32(%rsp),%r11
3978	movq	24+32(%rsp),%r12
3979	leaq	192(%rsp),%rdi
3980	call	__ecp_nistz256_mul_montx
3981
3982
3983
3984
3985	xorq	%r11,%r11
3986	addq	%r12,%r12
3987	leaq	96(%rsp),%rsi
3988	adcq	%r13,%r13
3989	movq	%r12,%rax
3990	adcq	%r8,%r8
3991	adcq	%r9,%r9
3992	movq	%r13,%rbp
3993	adcq	$0,%r11
3994
3995	subq	$-1,%r12
3996	movq	%r8,%rcx
3997	sbbq	%r14,%r13
3998	sbbq	$0,%r8
3999	movq	%r9,%r10
4000	sbbq	%r15,%r9
4001	sbbq	$0,%r11
4002
4003	cmovcq	%rax,%r12
4004	movq	0(%rsi),%rax
4005	cmovcq	%rbp,%r13
4006	movq	8(%rsi),%rbp
4007	cmovcq	%rcx,%r8
4008	movq	16(%rsi),%rcx
4009	cmovcq	%r10,%r9
4010	movq	24(%rsi),%r10
4011
4012	call	__ecp_nistz256_subx
4013
4014	leaq	128(%rsp),%rbx
4015	leaq	288(%rsp),%rdi
4016	call	__ecp_nistz256_sub_fromx
4017
4018	movq	192+0(%rsp),%rax
4019	movq	192+8(%rsp),%rbp
4020	movq	192+16(%rsp),%rcx
4021	movq	192+24(%rsp),%r10
4022	leaq	320(%rsp),%rdi
4023
4024	call	__ecp_nistz256_subx
4025
4026	movq	%r12,0(%rdi)
4027	movq	%r13,8(%rdi)
4028	movq	%r8,16(%rdi)
4029	movq	%r9,24(%rdi)
4030	movq	128(%rsp),%rdx
4031	leaq	128(%rsp),%rbx
4032	movq	0+224(%rsp),%r9
4033	movq	8+224(%rsp),%r10
4034	leaq	-128+224(%rsp),%rsi
4035	movq	16+224(%rsp),%r11
4036	movq	24+224(%rsp),%r12
4037	leaq	256(%rsp),%rdi
4038	call	__ecp_nistz256_mul_montx
4039
4040	movq	320(%rsp),%rdx
4041	leaq	320(%rsp),%rbx
4042	movq	0+64(%rsp),%r9
4043	movq	8+64(%rsp),%r10
4044	leaq	-128+64(%rsp),%rsi
4045	movq	16+64(%rsp),%r11
4046	movq	24+64(%rsp),%r12
4047	leaq	320(%rsp),%rdi
4048	call	__ecp_nistz256_mul_montx
4049
4050	leaq	256(%rsp),%rbx
4051	leaq	320(%rsp),%rdi
4052	call	__ecp_nistz256_sub_fromx
4053
4054.byte	102,72,15,126,199
4055
4056	movdqa	%xmm5,%xmm0
4057	movdqa	%xmm5,%xmm1
4058	pandn	352(%rsp),%xmm0
4059	movdqa	%xmm5,%xmm2
4060	pandn	352+16(%rsp),%xmm1
4061	movdqa	%xmm5,%xmm3
4062	pand	544(%rsp),%xmm2
4063	pand	544+16(%rsp),%xmm3
4064	por	%xmm0,%xmm2
4065	por	%xmm1,%xmm3
4066
4067	movdqa	%xmm4,%xmm0
4068	movdqa	%xmm4,%xmm1
4069	pandn	%xmm2,%xmm0
4070	movdqa	%xmm4,%xmm2
4071	pandn	%xmm3,%xmm1
4072	movdqa	%xmm4,%xmm3
4073	pand	448(%rsp),%xmm2
4074	pand	448+16(%rsp),%xmm3
4075	por	%xmm0,%xmm2
4076	por	%xmm1,%xmm3
4077	movdqu	%xmm2,64(%rdi)
4078	movdqu	%xmm3,80(%rdi)
4079
4080	movdqa	%xmm5,%xmm0
4081	movdqa	%xmm5,%xmm1
4082	pandn	288(%rsp),%xmm0
4083	movdqa	%xmm5,%xmm2
4084	pandn	288+16(%rsp),%xmm1
4085	movdqa	%xmm5,%xmm3
4086	pand	480(%rsp),%xmm2
4087	pand	480+16(%rsp),%xmm3
4088	por	%xmm0,%xmm2
4089	por	%xmm1,%xmm3
4090
4091	movdqa	%xmm4,%xmm0
4092	movdqa	%xmm4,%xmm1
4093	pandn	%xmm2,%xmm0
4094	movdqa	%xmm4,%xmm2
4095	pandn	%xmm3,%xmm1
4096	movdqa	%xmm4,%xmm3
4097	pand	384(%rsp),%xmm2
4098	pand	384+16(%rsp),%xmm3
4099	por	%xmm0,%xmm2
4100	por	%xmm1,%xmm3
4101	movdqu	%xmm2,0(%rdi)
4102	movdqu	%xmm3,16(%rdi)
4103
4104	movdqa	%xmm5,%xmm0
4105	movdqa	%xmm5,%xmm1
4106	pandn	320(%rsp),%xmm0
4107	movdqa	%xmm5,%xmm2
4108	pandn	320+16(%rsp),%xmm1
4109	movdqa	%xmm5,%xmm3
4110	pand	512(%rsp),%xmm2
4111	pand	512+16(%rsp),%xmm3
4112	por	%xmm0,%xmm2
4113	por	%xmm1,%xmm3
4114
4115	movdqa	%xmm4,%xmm0
4116	movdqa	%xmm4,%xmm1
4117	pandn	%xmm2,%xmm0
4118	movdqa	%xmm4,%xmm2
4119	pandn	%xmm3,%xmm1
4120	movdqa	%xmm4,%xmm3
4121	pand	416(%rsp),%xmm2
4122	pand	416+16(%rsp),%xmm3
4123	por	%xmm0,%xmm2
4124	por	%xmm1,%xmm3
4125	movdqu	%xmm2,32(%rdi)
4126	movdqu	%xmm3,48(%rdi)
4127
4128L$add_donex:
4129	leaq	576+56(%rsp),%rsi
4130
4131	movq	-48(%rsi),%r15
4132
4133	movq	-40(%rsi),%r14
4134
4135	movq	-32(%rsi),%r13
4136
4137	movq	-24(%rsi),%r12
4138
4139	movq	-16(%rsi),%rbx
4140
4141	movq	-8(%rsi),%rbp
4142
4143	leaq	(%rsi),%rsp
4144
4145L$point_addx_epilogue:
4146	ret
4147
4148
4149
4150.p2align	5
4151ecp_nistz256_point_add_affinex:
4152
4153L$point_add_affinex:
4154	pushq	%rbp
4155
4156	pushq	%rbx
4157
4158	pushq	%r12
4159
4160	pushq	%r13
4161
4162	pushq	%r14
4163
4164	pushq	%r15
4165
4166	subq	$480+8,%rsp
4167
4168L$add_affinex_body:
4169
4170	movdqu	0(%rsi),%xmm0
4171	movq	%rdx,%rbx
4172	movdqu	16(%rsi),%xmm1
4173	movdqu	32(%rsi),%xmm2
4174	movdqu	48(%rsi),%xmm3
4175	movdqu	64(%rsi),%xmm4
4176	movdqu	80(%rsi),%xmm5
4177	movq	64+0(%rsi),%rdx
4178	movq	64+8(%rsi),%r14
4179	movq	64+16(%rsi),%r15
4180	movq	64+24(%rsi),%r8
4181	movdqa	%xmm0,320(%rsp)
4182	movdqa	%xmm1,320+16(%rsp)
4183	movdqa	%xmm2,352(%rsp)
4184	movdqa	%xmm3,352+16(%rsp)
4185	movdqa	%xmm4,384(%rsp)
4186	movdqa	%xmm5,384+16(%rsp)
4187	por	%xmm4,%xmm5
4188
4189	movdqu	0(%rbx),%xmm0
4190	pshufd	$0xb1,%xmm5,%xmm3
4191	movdqu	16(%rbx),%xmm1
4192	movdqu	32(%rbx),%xmm2
4193	por	%xmm3,%xmm5
4194	movdqu	48(%rbx),%xmm3
4195	movdqa	%xmm0,416(%rsp)
4196	pshufd	$0x1e,%xmm5,%xmm4
4197	movdqa	%xmm1,416+16(%rsp)
4198	por	%xmm0,%xmm1
4199.byte	102,72,15,110,199
4200	movdqa	%xmm2,448(%rsp)
4201	movdqa	%xmm3,448+16(%rsp)
4202	por	%xmm2,%xmm3
4203	por	%xmm4,%xmm5
4204	pxor	%xmm4,%xmm4
4205	por	%xmm1,%xmm3
4206
4207	leaq	64-128(%rsi),%rsi
4208	leaq	32(%rsp),%rdi
4209	call	__ecp_nistz256_sqr_montx
4210
4211	pcmpeqd	%xmm4,%xmm5
4212	pshufd	$0xb1,%xmm3,%xmm4
4213	movq	0(%rbx),%rdx
4214
4215	movq	%r12,%r9
4216	por	%xmm3,%xmm4
4217	pshufd	$0,%xmm5,%xmm5
4218	pshufd	$0x1e,%xmm4,%xmm3
4219	movq	%r13,%r10
4220	por	%xmm3,%xmm4
4221	pxor	%xmm3,%xmm3
4222	movq	%r14,%r11
4223	pcmpeqd	%xmm3,%xmm4
4224	pshufd	$0,%xmm4,%xmm4
4225
4226	leaq	32-128(%rsp),%rsi
4227	movq	%r15,%r12
4228	leaq	0(%rsp),%rdi
4229	call	__ecp_nistz256_mul_montx
4230
4231	leaq	320(%rsp),%rbx
4232	leaq	64(%rsp),%rdi
4233	call	__ecp_nistz256_sub_fromx
4234
4235	movq	384(%rsp),%rdx
4236	leaq	384(%rsp),%rbx
4237	movq	0+32(%rsp),%r9
4238	movq	8+32(%rsp),%r10
4239	leaq	-128+32(%rsp),%rsi
4240	movq	16+32(%rsp),%r11
4241	movq	24+32(%rsp),%r12
4242	leaq	32(%rsp),%rdi
4243	call	__ecp_nistz256_mul_montx
4244
4245	movq	384(%rsp),%rdx
4246	leaq	384(%rsp),%rbx
4247	movq	0+64(%rsp),%r9
4248	movq	8+64(%rsp),%r10
4249	leaq	-128+64(%rsp),%rsi
4250	movq	16+64(%rsp),%r11
4251	movq	24+64(%rsp),%r12
4252	leaq	288(%rsp),%rdi
4253	call	__ecp_nistz256_mul_montx
4254
4255	movq	448(%rsp),%rdx
4256	leaq	448(%rsp),%rbx
4257	movq	0+32(%rsp),%r9
4258	movq	8+32(%rsp),%r10
4259	leaq	-128+32(%rsp),%rsi
4260	movq	16+32(%rsp),%r11
4261	movq	24+32(%rsp),%r12
4262	leaq	32(%rsp),%rdi
4263	call	__ecp_nistz256_mul_montx
4264
4265	leaq	352(%rsp),%rbx
4266	leaq	96(%rsp),%rdi
4267	call	__ecp_nistz256_sub_fromx
4268
4269	movq	0+64(%rsp),%rdx
4270	movq	8+64(%rsp),%r14
4271	leaq	-128+64(%rsp),%rsi
4272	movq	16+64(%rsp),%r15
4273	movq	24+64(%rsp),%r8
4274	leaq	128(%rsp),%rdi
4275	call	__ecp_nistz256_sqr_montx
4276
4277	movq	0+96(%rsp),%rdx
4278	movq	8+96(%rsp),%r14
4279	leaq	-128+96(%rsp),%rsi
4280	movq	16+96(%rsp),%r15
4281	movq	24+96(%rsp),%r8
4282	leaq	192(%rsp),%rdi
4283	call	__ecp_nistz256_sqr_montx
4284
4285	movq	128(%rsp),%rdx
4286	leaq	128(%rsp),%rbx
4287	movq	0+64(%rsp),%r9
4288	movq	8+64(%rsp),%r10
4289	leaq	-128+64(%rsp),%rsi
4290	movq	16+64(%rsp),%r11
4291	movq	24+64(%rsp),%r12
4292	leaq	160(%rsp),%rdi
4293	call	__ecp_nistz256_mul_montx
4294
4295	movq	320(%rsp),%rdx
4296	leaq	320(%rsp),%rbx
4297	movq	0+128(%rsp),%r9
4298	movq	8+128(%rsp),%r10
4299	leaq	-128+128(%rsp),%rsi
4300	movq	16+128(%rsp),%r11
4301	movq	24+128(%rsp),%r12
4302	leaq	0(%rsp),%rdi
4303	call	__ecp_nistz256_mul_montx
4304
4305
4306
4307
4308	xorq	%r11,%r11
4309	addq	%r12,%r12
4310	leaq	192(%rsp),%rsi
4311	adcq	%r13,%r13
4312	movq	%r12,%rax
4313	adcq	%r8,%r8
4314	adcq	%r9,%r9
4315	movq	%r13,%rbp
4316	adcq	$0,%r11
4317
4318	subq	$-1,%r12
4319	movq	%r8,%rcx
4320	sbbq	%r14,%r13
4321	sbbq	$0,%r8
4322	movq	%r9,%r10
4323	sbbq	%r15,%r9
4324	sbbq	$0,%r11
4325
4326	cmovcq	%rax,%r12
4327	movq	0(%rsi),%rax
4328	cmovcq	%rbp,%r13
4329	movq	8(%rsi),%rbp
4330	cmovcq	%rcx,%r8
4331	movq	16(%rsi),%rcx
4332	cmovcq	%r10,%r9
4333	movq	24(%rsi),%r10
4334
4335	call	__ecp_nistz256_subx
4336
4337	leaq	160(%rsp),%rbx
4338	leaq	224(%rsp),%rdi
4339	call	__ecp_nistz256_sub_fromx
4340
4341	movq	0+0(%rsp),%rax
4342	movq	0+8(%rsp),%rbp
4343	movq	0+16(%rsp),%rcx
4344	movq	0+24(%rsp),%r10
4345	leaq	64(%rsp),%rdi
4346
4347	call	__ecp_nistz256_subx
4348
4349	movq	%r12,0(%rdi)
4350	movq	%r13,8(%rdi)
4351	movq	%r8,16(%rdi)
4352	movq	%r9,24(%rdi)
4353	movq	352(%rsp),%rdx
4354	leaq	352(%rsp),%rbx
4355	movq	0+160(%rsp),%r9
4356	movq	8+160(%rsp),%r10
4357	leaq	-128+160(%rsp),%rsi
4358	movq	16+160(%rsp),%r11
4359	movq	24+160(%rsp),%r12
4360	leaq	32(%rsp),%rdi
4361	call	__ecp_nistz256_mul_montx
4362
4363	movq	96(%rsp),%rdx
4364	leaq	96(%rsp),%rbx
4365	movq	0+64(%rsp),%r9
4366	movq	8+64(%rsp),%r10
4367	leaq	-128+64(%rsp),%rsi
4368	movq	16+64(%rsp),%r11
4369	movq	24+64(%rsp),%r12
4370	leaq	64(%rsp),%rdi
4371	call	__ecp_nistz256_mul_montx
4372
4373	leaq	32(%rsp),%rbx
4374	leaq	256(%rsp),%rdi
4375	call	__ecp_nistz256_sub_fromx
4376
4377.byte	102,72,15,126,199
4378
4379	movdqa	%xmm5,%xmm0
4380	movdqa	%xmm5,%xmm1
4381	pandn	288(%rsp),%xmm0
4382	movdqa	%xmm5,%xmm2
4383	pandn	288+16(%rsp),%xmm1
4384	movdqa	%xmm5,%xmm3
4385	pand	L$ONE_mont(%rip),%xmm2
4386	pand	L$ONE_mont+16(%rip),%xmm3
4387	por	%xmm0,%xmm2
4388	por	%xmm1,%xmm3
4389
4390	movdqa	%xmm4,%xmm0
4391	movdqa	%xmm4,%xmm1
4392	pandn	%xmm2,%xmm0
4393	movdqa	%xmm4,%xmm2
4394	pandn	%xmm3,%xmm1
4395	movdqa	%xmm4,%xmm3
4396	pand	384(%rsp),%xmm2
4397	pand	384+16(%rsp),%xmm3
4398	por	%xmm0,%xmm2
4399	por	%xmm1,%xmm3
4400	movdqu	%xmm2,64(%rdi)
4401	movdqu	%xmm3,80(%rdi)
4402
4403	movdqa	%xmm5,%xmm0
4404	movdqa	%xmm5,%xmm1
4405	pandn	224(%rsp),%xmm0
4406	movdqa	%xmm5,%xmm2
4407	pandn	224+16(%rsp),%xmm1
4408	movdqa	%xmm5,%xmm3
4409	pand	416(%rsp),%xmm2
4410	pand	416+16(%rsp),%xmm3
4411	por	%xmm0,%xmm2
4412	por	%xmm1,%xmm3
4413
4414	movdqa	%xmm4,%xmm0
4415	movdqa	%xmm4,%xmm1
4416	pandn	%xmm2,%xmm0
4417	movdqa	%xmm4,%xmm2
4418	pandn	%xmm3,%xmm1
4419	movdqa	%xmm4,%xmm3
4420	pand	320(%rsp),%xmm2
4421	pand	320+16(%rsp),%xmm3
4422	por	%xmm0,%xmm2
4423	por	%xmm1,%xmm3
4424	movdqu	%xmm2,0(%rdi)
4425	movdqu	%xmm3,16(%rdi)
4426
4427	movdqa	%xmm5,%xmm0
4428	movdqa	%xmm5,%xmm1
4429	pandn	256(%rsp),%xmm0
4430	movdqa	%xmm5,%xmm2
4431	pandn	256+16(%rsp),%xmm1
4432	movdqa	%xmm5,%xmm3
4433	pand	448(%rsp),%xmm2
4434	pand	448+16(%rsp),%xmm3
4435	por	%xmm0,%xmm2
4436	por	%xmm1,%xmm3
4437
4438	movdqa	%xmm4,%xmm0
4439	movdqa	%xmm4,%xmm1
4440	pandn	%xmm2,%xmm0
4441	movdqa	%xmm4,%xmm2
4442	pandn	%xmm3,%xmm1
4443	movdqa	%xmm4,%xmm3
4444	pand	352(%rsp),%xmm2
4445	pand	352+16(%rsp),%xmm3
4446	por	%xmm0,%xmm2
4447	por	%xmm1,%xmm3
4448	movdqu	%xmm2,32(%rdi)
4449	movdqu	%xmm3,48(%rdi)
4450
4451	leaq	480+56(%rsp),%rsi
4452
4453	movq	-48(%rsi),%r15
4454
4455	movq	-40(%rsi),%r14
4456
4457	movq	-32(%rsi),%r13
4458
4459	movq	-24(%rsi),%r12
4460
4461	movq	-16(%rsi),%rbx
4462
4463	movq	-8(%rsi),%rbp
4464
4465	leaq	(%rsi),%rsp
4466
4467L$add_affinex_epilogue:
4468	ret
4469
4470
4471#endif
4472