xref: /aosp_15_r20/external/cronet/third_party/boringssl/src/gen/bcm/p256-x86_64-asm-apple.S (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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 <openssl/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.globl	_ecp_nistz256_avx2_select_w7
2172.private_extern _ecp_nistz256_avx2_select_w7
2173
2174.p2align	5
2175_ecp_nistz256_avx2_select_w7:
2176
2177L$avx2_select_w7:
2178_CET_ENDBR
2179	vzeroupper
2180	vmovdqa	L$Three(%rip),%ymm0
2181
2182	vpxor	%ymm2,%ymm2,%ymm2
2183	vpxor	%ymm3,%ymm3,%ymm3
2184
2185	vmovdqa	L$One(%rip),%ymm4
2186	vmovdqa	L$Two(%rip),%ymm8
2187	vmovdqa	L$Three(%rip),%ymm12
2188
2189	vmovd	%edx,%xmm1
2190	vpermd	%ymm1,%ymm2,%ymm1
2191
2192
2193	movq	$21,%rax
2194L$select_loop_avx2_w7:
2195
2196	vmovdqa	0(%rsi),%ymm5
2197	vmovdqa	32(%rsi),%ymm6
2198
2199	vmovdqa	64(%rsi),%ymm9
2200	vmovdqa	96(%rsi),%ymm10
2201
2202	vmovdqa	128(%rsi),%ymm13
2203	vmovdqa	160(%rsi),%ymm14
2204
2205	vpcmpeqd	%ymm1,%ymm4,%ymm7
2206	vpcmpeqd	%ymm1,%ymm8,%ymm11
2207	vpcmpeqd	%ymm1,%ymm12,%ymm15
2208
2209	vpaddd	%ymm0,%ymm4,%ymm4
2210	vpaddd	%ymm0,%ymm8,%ymm8
2211	vpaddd	%ymm0,%ymm12,%ymm12
2212	leaq	192(%rsi),%rsi
2213
2214	vpand	%ymm7,%ymm5,%ymm5
2215	vpand	%ymm7,%ymm6,%ymm6
2216	vpand	%ymm11,%ymm9,%ymm9
2217	vpand	%ymm11,%ymm10,%ymm10
2218	vpand	%ymm15,%ymm13,%ymm13
2219	vpand	%ymm15,%ymm14,%ymm14
2220
2221	vpxor	%ymm5,%ymm2,%ymm2
2222	vpxor	%ymm6,%ymm3,%ymm3
2223	vpxor	%ymm9,%ymm2,%ymm2
2224	vpxor	%ymm10,%ymm3,%ymm3
2225	vpxor	%ymm13,%ymm2,%ymm2
2226	vpxor	%ymm14,%ymm3,%ymm3
2227
2228	decq	%rax
2229	jnz	L$select_loop_avx2_w7
2230
2231
2232	vmovdqa	0(%rsi),%ymm5
2233	vmovdqa	32(%rsi),%ymm6
2234
2235	vpcmpeqd	%ymm1,%ymm4,%ymm7
2236
2237	vpand	%ymm7,%ymm5,%ymm5
2238	vpand	%ymm7,%ymm6,%ymm6
2239
2240	vpxor	%ymm5,%ymm2,%ymm2
2241	vpxor	%ymm6,%ymm3,%ymm3
2242
2243	vmovdqu	%ymm2,0(%rdi)
2244	vmovdqu	%ymm3,32(%rdi)
2245	vzeroupper
2246	ret
2247
2248L$SEH_end_ecp_nistz256_avx2_select_w7:
2249
2250
2251.p2align	5
2252__ecp_nistz256_add_toq:
2253
2254	xorq	%r11,%r11
2255	addq	0(%rbx),%r12
2256	adcq	8(%rbx),%r13
2257	movq	%r12,%rax
2258	adcq	16(%rbx),%r8
2259	adcq	24(%rbx),%r9
2260	movq	%r13,%rbp
2261	adcq	$0,%r11
2262
2263	subq	$-1,%r12
2264	movq	%r8,%rcx
2265	sbbq	%r14,%r13
2266	sbbq	$0,%r8
2267	movq	%r9,%r10
2268	sbbq	%r15,%r9
2269	sbbq	$0,%r11
2270
2271	cmovcq	%rax,%r12
2272	cmovcq	%rbp,%r13
2273	movq	%r12,0(%rdi)
2274	cmovcq	%rcx,%r8
2275	movq	%r13,8(%rdi)
2276	cmovcq	%r10,%r9
2277	movq	%r8,16(%rdi)
2278	movq	%r9,24(%rdi)
2279
2280	ret
2281
2282
2283
2284
2285.p2align	5
2286__ecp_nistz256_sub_fromq:
2287
2288	subq	0(%rbx),%r12
2289	sbbq	8(%rbx),%r13
2290	movq	%r12,%rax
2291	sbbq	16(%rbx),%r8
2292	sbbq	24(%rbx),%r9
2293	movq	%r13,%rbp
2294	sbbq	%r11,%r11
2295
2296	addq	$-1,%r12
2297	movq	%r8,%rcx
2298	adcq	%r14,%r13
2299	adcq	$0,%r8
2300	movq	%r9,%r10
2301	adcq	%r15,%r9
2302	testq	%r11,%r11
2303
2304	cmovzq	%rax,%r12
2305	cmovzq	%rbp,%r13
2306	movq	%r12,0(%rdi)
2307	cmovzq	%rcx,%r8
2308	movq	%r13,8(%rdi)
2309	cmovzq	%r10,%r9
2310	movq	%r8,16(%rdi)
2311	movq	%r9,24(%rdi)
2312
2313	ret
2314
2315
2316
2317
2318.p2align	5
2319__ecp_nistz256_subq:
2320
2321	subq	%r12,%rax
2322	sbbq	%r13,%rbp
2323	movq	%rax,%r12
2324	sbbq	%r8,%rcx
2325	sbbq	%r9,%r10
2326	movq	%rbp,%r13
2327	sbbq	%r11,%r11
2328
2329	addq	$-1,%rax
2330	movq	%rcx,%r8
2331	adcq	%r14,%rbp
2332	adcq	$0,%rcx
2333	movq	%r10,%r9
2334	adcq	%r15,%r10
2335	testq	%r11,%r11
2336
2337	cmovnzq	%rax,%r12
2338	cmovnzq	%rbp,%r13
2339	cmovnzq	%rcx,%r8
2340	cmovnzq	%r10,%r9
2341
2342	ret
2343
2344
2345
2346
2347.p2align	5
2348__ecp_nistz256_mul_by_2q:
2349
2350	xorq	%r11,%r11
2351	addq	%r12,%r12
2352	adcq	%r13,%r13
2353	movq	%r12,%rax
2354	adcq	%r8,%r8
2355	adcq	%r9,%r9
2356	movq	%r13,%rbp
2357	adcq	$0,%r11
2358
2359	subq	$-1,%r12
2360	movq	%r8,%rcx
2361	sbbq	%r14,%r13
2362	sbbq	$0,%r8
2363	movq	%r9,%r10
2364	sbbq	%r15,%r9
2365	sbbq	$0,%r11
2366
2367	cmovcq	%rax,%r12
2368	cmovcq	%rbp,%r13
2369	movq	%r12,0(%rdi)
2370	cmovcq	%rcx,%r8
2371	movq	%r13,8(%rdi)
2372	cmovcq	%r10,%r9
2373	movq	%r8,16(%rdi)
2374	movq	%r9,24(%rdi)
2375
2376	ret
2377
2378
2379.globl	_ecp_nistz256_point_double
2380.private_extern _ecp_nistz256_point_double
2381
2382.p2align	5
2383_ecp_nistz256_point_double:
2384
2385_CET_ENDBR
2386	leaq	_OPENSSL_ia32cap_P(%rip),%rcx
2387	movq	8(%rcx),%rcx
2388	andl	$0x80100,%ecx
2389	cmpl	$0x80100,%ecx
2390	je	L$point_doublex
2391	pushq	%rbp
2392
2393	pushq	%rbx
2394
2395	pushq	%r12
2396
2397	pushq	%r13
2398
2399	pushq	%r14
2400
2401	pushq	%r15
2402
2403	subq	$160+8,%rsp
2404
2405L$point_doubleq_body:
2406
2407L$point_double_shortcutq:
2408	movdqu	0(%rsi),%xmm0
2409	movq	%rsi,%rbx
2410	movdqu	16(%rsi),%xmm1
2411	movq	32+0(%rsi),%r12
2412	movq	32+8(%rsi),%r13
2413	movq	32+16(%rsi),%r8
2414	movq	32+24(%rsi),%r9
2415	movq	L$poly+8(%rip),%r14
2416	movq	L$poly+24(%rip),%r15
2417	movdqa	%xmm0,96(%rsp)
2418	movdqa	%xmm1,96+16(%rsp)
2419	leaq	32(%rdi),%r10
2420	leaq	64(%rdi),%r11
2421.byte	102,72,15,110,199
2422.byte	102,73,15,110,202
2423.byte	102,73,15,110,211
2424
2425	leaq	0(%rsp),%rdi
2426	call	__ecp_nistz256_mul_by_2q
2427
2428	movq	64+0(%rsi),%rax
2429	movq	64+8(%rsi),%r14
2430	movq	64+16(%rsi),%r15
2431	movq	64+24(%rsi),%r8
2432	leaq	64-0(%rsi),%rsi
2433	leaq	64(%rsp),%rdi
2434	call	__ecp_nistz256_sqr_montq
2435
2436	movq	0+0(%rsp),%rax
2437	movq	8+0(%rsp),%r14
2438	leaq	0+0(%rsp),%rsi
2439	movq	16+0(%rsp),%r15
2440	movq	24+0(%rsp),%r8
2441	leaq	0(%rsp),%rdi
2442	call	__ecp_nistz256_sqr_montq
2443
2444	movq	32(%rbx),%rax
2445	movq	64+0(%rbx),%r9
2446	movq	64+8(%rbx),%r10
2447	movq	64+16(%rbx),%r11
2448	movq	64+24(%rbx),%r12
2449	leaq	64-0(%rbx),%rsi
2450	leaq	32(%rbx),%rbx
2451.byte	102,72,15,126,215
2452	call	__ecp_nistz256_mul_montq
2453	call	__ecp_nistz256_mul_by_2q
2454
2455	movq	96+0(%rsp),%r12
2456	movq	96+8(%rsp),%r13
2457	leaq	64(%rsp),%rbx
2458	movq	96+16(%rsp),%r8
2459	movq	96+24(%rsp),%r9
2460	leaq	32(%rsp),%rdi
2461	call	__ecp_nistz256_add_toq
2462
2463	movq	96+0(%rsp),%r12
2464	movq	96+8(%rsp),%r13
2465	leaq	64(%rsp),%rbx
2466	movq	96+16(%rsp),%r8
2467	movq	96+24(%rsp),%r9
2468	leaq	64(%rsp),%rdi
2469	call	__ecp_nistz256_sub_fromq
2470
2471	movq	0+0(%rsp),%rax
2472	movq	8+0(%rsp),%r14
2473	leaq	0+0(%rsp),%rsi
2474	movq	16+0(%rsp),%r15
2475	movq	24+0(%rsp),%r8
2476.byte	102,72,15,126,207
2477	call	__ecp_nistz256_sqr_montq
2478	xorq	%r9,%r9
2479	movq	%r12,%rax
2480	addq	$-1,%r12
2481	movq	%r13,%r10
2482	adcq	%rsi,%r13
2483	movq	%r14,%rcx
2484	adcq	$0,%r14
2485	movq	%r15,%r8
2486	adcq	%rbp,%r15
2487	adcq	$0,%r9
2488	xorq	%rsi,%rsi
2489	testq	$1,%rax
2490
2491	cmovzq	%rax,%r12
2492	cmovzq	%r10,%r13
2493	cmovzq	%rcx,%r14
2494	cmovzq	%r8,%r15
2495	cmovzq	%rsi,%r9
2496
2497	movq	%r13,%rax
2498	shrq	$1,%r12
2499	shlq	$63,%rax
2500	movq	%r14,%r10
2501	shrq	$1,%r13
2502	orq	%rax,%r12
2503	shlq	$63,%r10
2504	movq	%r15,%rcx
2505	shrq	$1,%r14
2506	orq	%r10,%r13
2507	shlq	$63,%rcx
2508	movq	%r12,0(%rdi)
2509	shrq	$1,%r15
2510	movq	%r13,8(%rdi)
2511	shlq	$63,%r9
2512	orq	%rcx,%r14
2513	orq	%r9,%r15
2514	movq	%r14,16(%rdi)
2515	movq	%r15,24(%rdi)
2516	movq	64(%rsp),%rax
2517	leaq	64(%rsp),%rbx
2518	movq	0+32(%rsp),%r9
2519	movq	8+32(%rsp),%r10
2520	leaq	0+32(%rsp),%rsi
2521	movq	16+32(%rsp),%r11
2522	movq	24+32(%rsp),%r12
2523	leaq	32(%rsp),%rdi
2524	call	__ecp_nistz256_mul_montq
2525
2526	leaq	128(%rsp),%rdi
2527	call	__ecp_nistz256_mul_by_2q
2528
2529	leaq	32(%rsp),%rbx
2530	leaq	32(%rsp),%rdi
2531	call	__ecp_nistz256_add_toq
2532
2533	movq	96(%rsp),%rax
2534	leaq	96(%rsp),%rbx
2535	movq	0+0(%rsp),%r9
2536	movq	8+0(%rsp),%r10
2537	leaq	0+0(%rsp),%rsi
2538	movq	16+0(%rsp),%r11
2539	movq	24+0(%rsp),%r12
2540	leaq	0(%rsp),%rdi
2541	call	__ecp_nistz256_mul_montq
2542
2543	leaq	128(%rsp),%rdi
2544	call	__ecp_nistz256_mul_by_2q
2545
2546	movq	0+32(%rsp),%rax
2547	movq	8+32(%rsp),%r14
2548	leaq	0+32(%rsp),%rsi
2549	movq	16+32(%rsp),%r15
2550	movq	24+32(%rsp),%r8
2551.byte	102,72,15,126,199
2552	call	__ecp_nistz256_sqr_montq
2553
2554	leaq	128(%rsp),%rbx
2555	movq	%r14,%r8
2556	movq	%r15,%r9
2557	movq	%rsi,%r14
2558	movq	%rbp,%r15
2559	call	__ecp_nistz256_sub_fromq
2560
2561	movq	0+0(%rsp),%rax
2562	movq	0+8(%rsp),%rbp
2563	movq	0+16(%rsp),%rcx
2564	movq	0+24(%rsp),%r10
2565	leaq	0(%rsp),%rdi
2566	call	__ecp_nistz256_subq
2567
2568	movq	32(%rsp),%rax
2569	leaq	32(%rsp),%rbx
2570	movq	%r12,%r14
2571	xorl	%ecx,%ecx
2572	movq	%r12,0+0(%rsp)
2573	movq	%r13,%r10
2574	movq	%r13,0+8(%rsp)
2575	cmovzq	%r8,%r11
2576	movq	%r8,0+16(%rsp)
2577	leaq	0-0(%rsp),%rsi
2578	cmovzq	%r9,%r12
2579	movq	%r9,0+24(%rsp)
2580	movq	%r14,%r9
2581	leaq	0(%rsp),%rdi
2582	call	__ecp_nistz256_mul_montq
2583
2584.byte	102,72,15,126,203
2585.byte	102,72,15,126,207
2586	call	__ecp_nistz256_sub_fromq
2587
2588	leaq	160+56(%rsp),%rsi
2589
2590	movq	-48(%rsi),%r15
2591
2592	movq	-40(%rsi),%r14
2593
2594	movq	-32(%rsi),%r13
2595
2596	movq	-24(%rsi),%r12
2597
2598	movq	-16(%rsi),%rbx
2599
2600	movq	-8(%rsi),%rbp
2601
2602	leaq	(%rsi),%rsp
2603
2604L$point_doubleq_epilogue:
2605	ret
2606
2607
2608.globl	_ecp_nistz256_point_add
2609.private_extern _ecp_nistz256_point_add
2610
2611.p2align	5
2612_ecp_nistz256_point_add:
2613
2614_CET_ENDBR
2615	leaq	_OPENSSL_ia32cap_P(%rip),%rcx
2616	movq	8(%rcx),%rcx
2617	andl	$0x80100,%ecx
2618	cmpl	$0x80100,%ecx
2619	je	L$point_addx
2620	pushq	%rbp
2621
2622	pushq	%rbx
2623
2624	pushq	%r12
2625
2626	pushq	%r13
2627
2628	pushq	%r14
2629
2630	pushq	%r15
2631
2632	subq	$576+8,%rsp
2633
2634L$point_addq_body:
2635
2636	movdqu	0(%rsi),%xmm0
2637	movdqu	16(%rsi),%xmm1
2638	movdqu	32(%rsi),%xmm2
2639	movdqu	48(%rsi),%xmm3
2640	movdqu	64(%rsi),%xmm4
2641	movdqu	80(%rsi),%xmm5
2642	movq	%rsi,%rbx
2643	movq	%rdx,%rsi
2644	movdqa	%xmm0,384(%rsp)
2645	movdqa	%xmm1,384+16(%rsp)
2646	movdqa	%xmm2,416(%rsp)
2647	movdqa	%xmm3,416+16(%rsp)
2648	movdqa	%xmm4,448(%rsp)
2649	movdqa	%xmm5,448+16(%rsp)
2650	por	%xmm4,%xmm5
2651
2652	movdqu	0(%rsi),%xmm0
2653	pshufd	$0xb1,%xmm5,%xmm3
2654	movdqu	16(%rsi),%xmm1
2655	movdqu	32(%rsi),%xmm2
2656	por	%xmm3,%xmm5
2657	movdqu	48(%rsi),%xmm3
2658	movq	64+0(%rsi),%rax
2659	movq	64+8(%rsi),%r14
2660	movq	64+16(%rsi),%r15
2661	movq	64+24(%rsi),%r8
2662	movdqa	%xmm0,480(%rsp)
2663	pshufd	$0x1e,%xmm5,%xmm4
2664	movdqa	%xmm1,480+16(%rsp)
2665	movdqu	64(%rsi),%xmm0
2666	movdqu	80(%rsi),%xmm1
2667	movdqa	%xmm2,512(%rsp)
2668	movdqa	%xmm3,512+16(%rsp)
2669	por	%xmm4,%xmm5
2670	pxor	%xmm4,%xmm4
2671	por	%xmm0,%xmm1
2672.byte	102,72,15,110,199
2673
2674	leaq	64-0(%rsi),%rsi
2675	movq	%rax,544+0(%rsp)
2676	movq	%r14,544+8(%rsp)
2677	movq	%r15,544+16(%rsp)
2678	movq	%r8,544+24(%rsp)
2679	leaq	96(%rsp),%rdi
2680	call	__ecp_nistz256_sqr_montq
2681
2682	pcmpeqd	%xmm4,%xmm5
2683	pshufd	$0xb1,%xmm1,%xmm4
2684	por	%xmm1,%xmm4
2685	pshufd	$0,%xmm5,%xmm5
2686	pshufd	$0x1e,%xmm4,%xmm3
2687	por	%xmm3,%xmm4
2688	pxor	%xmm3,%xmm3
2689	pcmpeqd	%xmm3,%xmm4
2690	pshufd	$0,%xmm4,%xmm4
2691	movq	64+0(%rbx),%rax
2692	movq	64+8(%rbx),%r14
2693	movq	64+16(%rbx),%r15
2694	movq	64+24(%rbx),%r8
2695.byte	102,72,15,110,203
2696
2697	leaq	64-0(%rbx),%rsi
2698	leaq	32(%rsp),%rdi
2699	call	__ecp_nistz256_sqr_montq
2700
2701	movq	544(%rsp),%rax
2702	leaq	544(%rsp),%rbx
2703	movq	0+96(%rsp),%r9
2704	movq	8+96(%rsp),%r10
2705	leaq	0+96(%rsp),%rsi
2706	movq	16+96(%rsp),%r11
2707	movq	24+96(%rsp),%r12
2708	leaq	224(%rsp),%rdi
2709	call	__ecp_nistz256_mul_montq
2710
2711	movq	448(%rsp),%rax
2712	leaq	448(%rsp),%rbx
2713	movq	0+32(%rsp),%r9
2714	movq	8+32(%rsp),%r10
2715	leaq	0+32(%rsp),%rsi
2716	movq	16+32(%rsp),%r11
2717	movq	24+32(%rsp),%r12
2718	leaq	256(%rsp),%rdi
2719	call	__ecp_nistz256_mul_montq
2720
2721	movq	416(%rsp),%rax
2722	leaq	416(%rsp),%rbx
2723	movq	0+224(%rsp),%r9
2724	movq	8+224(%rsp),%r10
2725	leaq	0+224(%rsp),%rsi
2726	movq	16+224(%rsp),%r11
2727	movq	24+224(%rsp),%r12
2728	leaq	224(%rsp),%rdi
2729	call	__ecp_nistz256_mul_montq
2730
2731	movq	512(%rsp),%rax
2732	leaq	512(%rsp),%rbx
2733	movq	0+256(%rsp),%r9
2734	movq	8+256(%rsp),%r10
2735	leaq	0+256(%rsp),%rsi
2736	movq	16+256(%rsp),%r11
2737	movq	24+256(%rsp),%r12
2738	leaq	256(%rsp),%rdi
2739	call	__ecp_nistz256_mul_montq
2740
2741	leaq	224(%rsp),%rbx
2742	leaq	64(%rsp),%rdi
2743	call	__ecp_nistz256_sub_fromq
2744
2745	orq	%r13,%r12
2746	movdqa	%xmm4,%xmm2
2747	orq	%r8,%r12
2748	orq	%r9,%r12
2749	por	%xmm5,%xmm2
2750.byte	102,73,15,110,220
2751
2752	movq	384(%rsp),%rax
2753	leaq	384(%rsp),%rbx
2754	movq	0+96(%rsp),%r9
2755	movq	8+96(%rsp),%r10
2756	leaq	0+96(%rsp),%rsi
2757	movq	16+96(%rsp),%r11
2758	movq	24+96(%rsp),%r12
2759	leaq	160(%rsp),%rdi
2760	call	__ecp_nistz256_mul_montq
2761
2762	movq	480(%rsp),%rax
2763	leaq	480(%rsp),%rbx
2764	movq	0+32(%rsp),%r9
2765	movq	8+32(%rsp),%r10
2766	leaq	0+32(%rsp),%rsi
2767	movq	16+32(%rsp),%r11
2768	movq	24+32(%rsp),%r12
2769	leaq	192(%rsp),%rdi
2770	call	__ecp_nistz256_mul_montq
2771
2772	leaq	160(%rsp),%rbx
2773	leaq	0(%rsp),%rdi
2774	call	__ecp_nistz256_sub_fromq
2775
2776	orq	%r13,%r12
2777	orq	%r8,%r12
2778	orq	%r9,%r12
2779
2780.byte	102,73,15,126,208
2781.byte	102,73,15,126,217
2782	orq	%r8,%r12
2783.byte	0x3e
2784	jnz	L$add_proceedq
2785
2786
2787
2788	testq	%r9,%r9
2789	jz	L$add_doubleq
2790
2791
2792
2793
2794
2795
2796.byte	102,72,15,126,199
2797	pxor	%xmm0,%xmm0
2798	movdqu	%xmm0,0(%rdi)
2799	movdqu	%xmm0,16(%rdi)
2800	movdqu	%xmm0,32(%rdi)
2801	movdqu	%xmm0,48(%rdi)
2802	movdqu	%xmm0,64(%rdi)
2803	movdqu	%xmm0,80(%rdi)
2804	jmp	L$add_doneq
2805
2806.p2align	5
2807L$add_doubleq:
2808.byte	102,72,15,126,206
2809.byte	102,72,15,126,199
2810	addq	$416,%rsp
2811
2812	jmp	L$point_double_shortcutq
2813
2814
2815.p2align	5
2816L$add_proceedq:
2817	movq	0+64(%rsp),%rax
2818	movq	8+64(%rsp),%r14
2819	leaq	0+64(%rsp),%rsi
2820	movq	16+64(%rsp),%r15
2821	movq	24+64(%rsp),%r8
2822	leaq	96(%rsp),%rdi
2823	call	__ecp_nistz256_sqr_montq
2824
2825	movq	448(%rsp),%rax
2826	leaq	448(%rsp),%rbx
2827	movq	0+0(%rsp),%r9
2828	movq	8+0(%rsp),%r10
2829	leaq	0+0(%rsp),%rsi
2830	movq	16+0(%rsp),%r11
2831	movq	24+0(%rsp),%r12
2832	leaq	352(%rsp),%rdi
2833	call	__ecp_nistz256_mul_montq
2834
2835	movq	0+0(%rsp),%rax
2836	movq	8+0(%rsp),%r14
2837	leaq	0+0(%rsp),%rsi
2838	movq	16+0(%rsp),%r15
2839	movq	24+0(%rsp),%r8
2840	leaq	32(%rsp),%rdi
2841	call	__ecp_nistz256_sqr_montq
2842
2843	movq	544(%rsp),%rax
2844	leaq	544(%rsp),%rbx
2845	movq	0+352(%rsp),%r9
2846	movq	8+352(%rsp),%r10
2847	leaq	0+352(%rsp),%rsi
2848	movq	16+352(%rsp),%r11
2849	movq	24+352(%rsp),%r12
2850	leaq	352(%rsp),%rdi
2851	call	__ecp_nistz256_mul_montq
2852
2853	movq	0(%rsp),%rax
2854	leaq	0(%rsp),%rbx
2855	movq	0+32(%rsp),%r9
2856	movq	8+32(%rsp),%r10
2857	leaq	0+32(%rsp),%rsi
2858	movq	16+32(%rsp),%r11
2859	movq	24+32(%rsp),%r12
2860	leaq	128(%rsp),%rdi
2861	call	__ecp_nistz256_mul_montq
2862
2863	movq	160(%rsp),%rax
2864	leaq	160(%rsp),%rbx
2865	movq	0+32(%rsp),%r9
2866	movq	8+32(%rsp),%r10
2867	leaq	0+32(%rsp),%rsi
2868	movq	16+32(%rsp),%r11
2869	movq	24+32(%rsp),%r12
2870	leaq	192(%rsp),%rdi
2871	call	__ecp_nistz256_mul_montq
2872
2873
2874
2875
2876	xorq	%r11,%r11
2877	addq	%r12,%r12
2878	leaq	96(%rsp),%rsi
2879	adcq	%r13,%r13
2880	movq	%r12,%rax
2881	adcq	%r8,%r8
2882	adcq	%r9,%r9
2883	movq	%r13,%rbp
2884	adcq	$0,%r11
2885
2886	subq	$-1,%r12
2887	movq	%r8,%rcx
2888	sbbq	%r14,%r13
2889	sbbq	$0,%r8
2890	movq	%r9,%r10
2891	sbbq	%r15,%r9
2892	sbbq	$0,%r11
2893
2894	cmovcq	%rax,%r12
2895	movq	0(%rsi),%rax
2896	cmovcq	%rbp,%r13
2897	movq	8(%rsi),%rbp
2898	cmovcq	%rcx,%r8
2899	movq	16(%rsi),%rcx
2900	cmovcq	%r10,%r9
2901	movq	24(%rsi),%r10
2902
2903	call	__ecp_nistz256_subq
2904
2905	leaq	128(%rsp),%rbx
2906	leaq	288(%rsp),%rdi
2907	call	__ecp_nistz256_sub_fromq
2908
2909	movq	192+0(%rsp),%rax
2910	movq	192+8(%rsp),%rbp
2911	movq	192+16(%rsp),%rcx
2912	movq	192+24(%rsp),%r10
2913	leaq	320(%rsp),%rdi
2914
2915	call	__ecp_nistz256_subq
2916
2917	movq	%r12,0(%rdi)
2918	movq	%r13,8(%rdi)
2919	movq	%r8,16(%rdi)
2920	movq	%r9,24(%rdi)
2921	movq	128(%rsp),%rax
2922	leaq	128(%rsp),%rbx
2923	movq	0+224(%rsp),%r9
2924	movq	8+224(%rsp),%r10
2925	leaq	0+224(%rsp),%rsi
2926	movq	16+224(%rsp),%r11
2927	movq	24+224(%rsp),%r12
2928	leaq	256(%rsp),%rdi
2929	call	__ecp_nistz256_mul_montq
2930
2931	movq	320(%rsp),%rax
2932	leaq	320(%rsp),%rbx
2933	movq	0+64(%rsp),%r9
2934	movq	8+64(%rsp),%r10
2935	leaq	0+64(%rsp),%rsi
2936	movq	16+64(%rsp),%r11
2937	movq	24+64(%rsp),%r12
2938	leaq	320(%rsp),%rdi
2939	call	__ecp_nistz256_mul_montq
2940
2941	leaq	256(%rsp),%rbx
2942	leaq	320(%rsp),%rdi
2943	call	__ecp_nistz256_sub_fromq
2944
2945.byte	102,72,15,126,199
2946
2947	movdqa	%xmm5,%xmm0
2948	movdqa	%xmm5,%xmm1
2949	pandn	352(%rsp),%xmm0
2950	movdqa	%xmm5,%xmm2
2951	pandn	352+16(%rsp),%xmm1
2952	movdqa	%xmm5,%xmm3
2953	pand	544(%rsp),%xmm2
2954	pand	544+16(%rsp),%xmm3
2955	por	%xmm0,%xmm2
2956	por	%xmm1,%xmm3
2957
2958	movdqa	%xmm4,%xmm0
2959	movdqa	%xmm4,%xmm1
2960	pandn	%xmm2,%xmm0
2961	movdqa	%xmm4,%xmm2
2962	pandn	%xmm3,%xmm1
2963	movdqa	%xmm4,%xmm3
2964	pand	448(%rsp),%xmm2
2965	pand	448+16(%rsp),%xmm3
2966	por	%xmm0,%xmm2
2967	por	%xmm1,%xmm3
2968	movdqu	%xmm2,64(%rdi)
2969	movdqu	%xmm3,80(%rdi)
2970
2971	movdqa	%xmm5,%xmm0
2972	movdqa	%xmm5,%xmm1
2973	pandn	288(%rsp),%xmm0
2974	movdqa	%xmm5,%xmm2
2975	pandn	288+16(%rsp),%xmm1
2976	movdqa	%xmm5,%xmm3
2977	pand	480(%rsp),%xmm2
2978	pand	480+16(%rsp),%xmm3
2979	por	%xmm0,%xmm2
2980	por	%xmm1,%xmm3
2981
2982	movdqa	%xmm4,%xmm0
2983	movdqa	%xmm4,%xmm1
2984	pandn	%xmm2,%xmm0
2985	movdqa	%xmm4,%xmm2
2986	pandn	%xmm3,%xmm1
2987	movdqa	%xmm4,%xmm3
2988	pand	384(%rsp),%xmm2
2989	pand	384+16(%rsp),%xmm3
2990	por	%xmm0,%xmm2
2991	por	%xmm1,%xmm3
2992	movdqu	%xmm2,0(%rdi)
2993	movdqu	%xmm3,16(%rdi)
2994
2995	movdqa	%xmm5,%xmm0
2996	movdqa	%xmm5,%xmm1
2997	pandn	320(%rsp),%xmm0
2998	movdqa	%xmm5,%xmm2
2999	pandn	320+16(%rsp),%xmm1
3000	movdqa	%xmm5,%xmm3
3001	pand	512(%rsp),%xmm2
3002	pand	512+16(%rsp),%xmm3
3003	por	%xmm0,%xmm2
3004	por	%xmm1,%xmm3
3005
3006	movdqa	%xmm4,%xmm0
3007	movdqa	%xmm4,%xmm1
3008	pandn	%xmm2,%xmm0
3009	movdqa	%xmm4,%xmm2
3010	pandn	%xmm3,%xmm1
3011	movdqa	%xmm4,%xmm3
3012	pand	416(%rsp),%xmm2
3013	pand	416+16(%rsp),%xmm3
3014	por	%xmm0,%xmm2
3015	por	%xmm1,%xmm3
3016	movdqu	%xmm2,32(%rdi)
3017	movdqu	%xmm3,48(%rdi)
3018
3019L$add_doneq:
3020	leaq	576+56(%rsp),%rsi
3021
3022	movq	-48(%rsi),%r15
3023
3024	movq	-40(%rsi),%r14
3025
3026	movq	-32(%rsi),%r13
3027
3028	movq	-24(%rsi),%r12
3029
3030	movq	-16(%rsi),%rbx
3031
3032	movq	-8(%rsi),%rbp
3033
3034	leaq	(%rsi),%rsp
3035
3036L$point_addq_epilogue:
3037	ret
3038
3039
3040.globl	_ecp_nistz256_point_add_affine
3041.private_extern _ecp_nistz256_point_add_affine
3042
3043.p2align	5
3044_ecp_nistz256_point_add_affine:
3045
3046_CET_ENDBR
3047	leaq	_OPENSSL_ia32cap_P(%rip),%rcx
3048	movq	8(%rcx),%rcx
3049	andl	$0x80100,%ecx
3050	cmpl	$0x80100,%ecx
3051	je	L$point_add_affinex
3052	pushq	%rbp
3053
3054	pushq	%rbx
3055
3056	pushq	%r12
3057
3058	pushq	%r13
3059
3060	pushq	%r14
3061
3062	pushq	%r15
3063
3064	subq	$480+8,%rsp
3065
3066L$add_affineq_body:
3067
3068	movdqu	0(%rsi),%xmm0
3069	movq	%rdx,%rbx
3070	movdqu	16(%rsi),%xmm1
3071	movdqu	32(%rsi),%xmm2
3072	movdqu	48(%rsi),%xmm3
3073	movdqu	64(%rsi),%xmm4
3074	movdqu	80(%rsi),%xmm5
3075	movq	64+0(%rsi),%rax
3076	movq	64+8(%rsi),%r14
3077	movq	64+16(%rsi),%r15
3078	movq	64+24(%rsi),%r8
3079	movdqa	%xmm0,320(%rsp)
3080	movdqa	%xmm1,320+16(%rsp)
3081	movdqa	%xmm2,352(%rsp)
3082	movdqa	%xmm3,352+16(%rsp)
3083	movdqa	%xmm4,384(%rsp)
3084	movdqa	%xmm5,384+16(%rsp)
3085	por	%xmm4,%xmm5
3086
3087	movdqu	0(%rbx),%xmm0
3088	pshufd	$0xb1,%xmm5,%xmm3
3089	movdqu	16(%rbx),%xmm1
3090	movdqu	32(%rbx),%xmm2
3091	por	%xmm3,%xmm5
3092	movdqu	48(%rbx),%xmm3
3093	movdqa	%xmm0,416(%rsp)
3094	pshufd	$0x1e,%xmm5,%xmm4
3095	movdqa	%xmm1,416+16(%rsp)
3096	por	%xmm0,%xmm1
3097.byte	102,72,15,110,199
3098	movdqa	%xmm2,448(%rsp)
3099	movdqa	%xmm3,448+16(%rsp)
3100	por	%xmm2,%xmm3
3101	por	%xmm4,%xmm5
3102	pxor	%xmm4,%xmm4
3103	por	%xmm1,%xmm3
3104
3105	leaq	64-0(%rsi),%rsi
3106	leaq	32(%rsp),%rdi
3107	call	__ecp_nistz256_sqr_montq
3108
3109	pcmpeqd	%xmm4,%xmm5
3110	pshufd	$0xb1,%xmm3,%xmm4
3111	movq	0(%rbx),%rax
3112
3113	movq	%r12,%r9
3114	por	%xmm3,%xmm4
3115	pshufd	$0,%xmm5,%xmm5
3116	pshufd	$0x1e,%xmm4,%xmm3
3117	movq	%r13,%r10
3118	por	%xmm3,%xmm4
3119	pxor	%xmm3,%xmm3
3120	movq	%r14,%r11
3121	pcmpeqd	%xmm3,%xmm4
3122	pshufd	$0,%xmm4,%xmm4
3123
3124	leaq	32-0(%rsp),%rsi
3125	movq	%r15,%r12
3126	leaq	0(%rsp),%rdi
3127	call	__ecp_nistz256_mul_montq
3128
3129	leaq	320(%rsp),%rbx
3130	leaq	64(%rsp),%rdi
3131	call	__ecp_nistz256_sub_fromq
3132
3133	movq	384(%rsp),%rax
3134	leaq	384(%rsp),%rbx
3135	movq	0+32(%rsp),%r9
3136	movq	8+32(%rsp),%r10
3137	leaq	0+32(%rsp),%rsi
3138	movq	16+32(%rsp),%r11
3139	movq	24+32(%rsp),%r12
3140	leaq	32(%rsp),%rdi
3141	call	__ecp_nistz256_mul_montq
3142
3143	movq	384(%rsp),%rax
3144	leaq	384(%rsp),%rbx
3145	movq	0+64(%rsp),%r9
3146	movq	8+64(%rsp),%r10
3147	leaq	0+64(%rsp),%rsi
3148	movq	16+64(%rsp),%r11
3149	movq	24+64(%rsp),%r12
3150	leaq	288(%rsp),%rdi
3151	call	__ecp_nistz256_mul_montq
3152
3153	movq	448(%rsp),%rax
3154	leaq	448(%rsp),%rbx
3155	movq	0+32(%rsp),%r9
3156	movq	8+32(%rsp),%r10
3157	leaq	0+32(%rsp),%rsi
3158	movq	16+32(%rsp),%r11
3159	movq	24+32(%rsp),%r12
3160	leaq	32(%rsp),%rdi
3161	call	__ecp_nistz256_mul_montq
3162
3163	leaq	352(%rsp),%rbx
3164	leaq	96(%rsp),%rdi
3165	call	__ecp_nistz256_sub_fromq
3166
3167	movq	0+64(%rsp),%rax
3168	movq	8+64(%rsp),%r14
3169	leaq	0+64(%rsp),%rsi
3170	movq	16+64(%rsp),%r15
3171	movq	24+64(%rsp),%r8
3172	leaq	128(%rsp),%rdi
3173	call	__ecp_nistz256_sqr_montq
3174
3175	movq	0+96(%rsp),%rax
3176	movq	8+96(%rsp),%r14
3177	leaq	0+96(%rsp),%rsi
3178	movq	16+96(%rsp),%r15
3179	movq	24+96(%rsp),%r8
3180	leaq	192(%rsp),%rdi
3181	call	__ecp_nistz256_sqr_montq
3182
3183	movq	128(%rsp),%rax
3184	leaq	128(%rsp),%rbx
3185	movq	0+64(%rsp),%r9
3186	movq	8+64(%rsp),%r10
3187	leaq	0+64(%rsp),%rsi
3188	movq	16+64(%rsp),%r11
3189	movq	24+64(%rsp),%r12
3190	leaq	160(%rsp),%rdi
3191	call	__ecp_nistz256_mul_montq
3192
3193	movq	320(%rsp),%rax
3194	leaq	320(%rsp),%rbx
3195	movq	0+128(%rsp),%r9
3196	movq	8+128(%rsp),%r10
3197	leaq	0+128(%rsp),%rsi
3198	movq	16+128(%rsp),%r11
3199	movq	24+128(%rsp),%r12
3200	leaq	0(%rsp),%rdi
3201	call	__ecp_nistz256_mul_montq
3202
3203
3204
3205
3206	xorq	%r11,%r11
3207	addq	%r12,%r12
3208	leaq	192(%rsp),%rsi
3209	adcq	%r13,%r13
3210	movq	%r12,%rax
3211	adcq	%r8,%r8
3212	adcq	%r9,%r9
3213	movq	%r13,%rbp
3214	adcq	$0,%r11
3215
3216	subq	$-1,%r12
3217	movq	%r8,%rcx
3218	sbbq	%r14,%r13
3219	sbbq	$0,%r8
3220	movq	%r9,%r10
3221	sbbq	%r15,%r9
3222	sbbq	$0,%r11
3223
3224	cmovcq	%rax,%r12
3225	movq	0(%rsi),%rax
3226	cmovcq	%rbp,%r13
3227	movq	8(%rsi),%rbp
3228	cmovcq	%rcx,%r8
3229	movq	16(%rsi),%rcx
3230	cmovcq	%r10,%r9
3231	movq	24(%rsi),%r10
3232
3233	call	__ecp_nistz256_subq
3234
3235	leaq	160(%rsp),%rbx
3236	leaq	224(%rsp),%rdi
3237	call	__ecp_nistz256_sub_fromq
3238
3239	movq	0+0(%rsp),%rax
3240	movq	0+8(%rsp),%rbp
3241	movq	0+16(%rsp),%rcx
3242	movq	0+24(%rsp),%r10
3243	leaq	64(%rsp),%rdi
3244
3245	call	__ecp_nistz256_subq
3246
3247	movq	%r12,0(%rdi)
3248	movq	%r13,8(%rdi)
3249	movq	%r8,16(%rdi)
3250	movq	%r9,24(%rdi)
3251	movq	352(%rsp),%rax
3252	leaq	352(%rsp),%rbx
3253	movq	0+160(%rsp),%r9
3254	movq	8+160(%rsp),%r10
3255	leaq	0+160(%rsp),%rsi
3256	movq	16+160(%rsp),%r11
3257	movq	24+160(%rsp),%r12
3258	leaq	32(%rsp),%rdi
3259	call	__ecp_nistz256_mul_montq
3260
3261	movq	96(%rsp),%rax
3262	leaq	96(%rsp),%rbx
3263	movq	0+64(%rsp),%r9
3264	movq	8+64(%rsp),%r10
3265	leaq	0+64(%rsp),%rsi
3266	movq	16+64(%rsp),%r11
3267	movq	24+64(%rsp),%r12
3268	leaq	64(%rsp),%rdi
3269	call	__ecp_nistz256_mul_montq
3270
3271	leaq	32(%rsp),%rbx
3272	leaq	256(%rsp),%rdi
3273	call	__ecp_nistz256_sub_fromq
3274
3275.byte	102,72,15,126,199
3276
3277	movdqa	%xmm5,%xmm0
3278	movdqa	%xmm5,%xmm1
3279	pandn	288(%rsp),%xmm0
3280	movdqa	%xmm5,%xmm2
3281	pandn	288+16(%rsp),%xmm1
3282	movdqa	%xmm5,%xmm3
3283	pand	L$ONE_mont(%rip),%xmm2
3284	pand	L$ONE_mont+16(%rip),%xmm3
3285	por	%xmm0,%xmm2
3286	por	%xmm1,%xmm3
3287
3288	movdqa	%xmm4,%xmm0
3289	movdqa	%xmm4,%xmm1
3290	pandn	%xmm2,%xmm0
3291	movdqa	%xmm4,%xmm2
3292	pandn	%xmm3,%xmm1
3293	movdqa	%xmm4,%xmm3
3294	pand	384(%rsp),%xmm2
3295	pand	384+16(%rsp),%xmm3
3296	por	%xmm0,%xmm2
3297	por	%xmm1,%xmm3
3298	movdqu	%xmm2,64(%rdi)
3299	movdqu	%xmm3,80(%rdi)
3300
3301	movdqa	%xmm5,%xmm0
3302	movdqa	%xmm5,%xmm1
3303	pandn	224(%rsp),%xmm0
3304	movdqa	%xmm5,%xmm2
3305	pandn	224+16(%rsp),%xmm1
3306	movdqa	%xmm5,%xmm3
3307	pand	416(%rsp),%xmm2
3308	pand	416+16(%rsp),%xmm3
3309	por	%xmm0,%xmm2
3310	por	%xmm1,%xmm3
3311
3312	movdqa	%xmm4,%xmm0
3313	movdqa	%xmm4,%xmm1
3314	pandn	%xmm2,%xmm0
3315	movdqa	%xmm4,%xmm2
3316	pandn	%xmm3,%xmm1
3317	movdqa	%xmm4,%xmm3
3318	pand	320(%rsp),%xmm2
3319	pand	320+16(%rsp),%xmm3
3320	por	%xmm0,%xmm2
3321	por	%xmm1,%xmm3
3322	movdqu	%xmm2,0(%rdi)
3323	movdqu	%xmm3,16(%rdi)
3324
3325	movdqa	%xmm5,%xmm0
3326	movdqa	%xmm5,%xmm1
3327	pandn	256(%rsp),%xmm0
3328	movdqa	%xmm5,%xmm2
3329	pandn	256+16(%rsp),%xmm1
3330	movdqa	%xmm5,%xmm3
3331	pand	448(%rsp),%xmm2
3332	pand	448+16(%rsp),%xmm3
3333	por	%xmm0,%xmm2
3334	por	%xmm1,%xmm3
3335
3336	movdqa	%xmm4,%xmm0
3337	movdqa	%xmm4,%xmm1
3338	pandn	%xmm2,%xmm0
3339	movdqa	%xmm4,%xmm2
3340	pandn	%xmm3,%xmm1
3341	movdqa	%xmm4,%xmm3
3342	pand	352(%rsp),%xmm2
3343	pand	352+16(%rsp),%xmm3
3344	por	%xmm0,%xmm2
3345	por	%xmm1,%xmm3
3346	movdqu	%xmm2,32(%rdi)
3347	movdqu	%xmm3,48(%rdi)
3348
3349	leaq	480+56(%rsp),%rsi
3350
3351	movq	-48(%rsi),%r15
3352
3353	movq	-40(%rsi),%r14
3354
3355	movq	-32(%rsi),%r13
3356
3357	movq	-24(%rsi),%r12
3358
3359	movq	-16(%rsi),%rbx
3360
3361	movq	-8(%rsi),%rbp
3362
3363	leaq	(%rsi),%rsp
3364
3365L$add_affineq_epilogue:
3366	ret
3367
3368
3369
3370.p2align	5
3371__ecp_nistz256_add_tox:
3372
3373	xorq	%r11,%r11
3374	adcq	0(%rbx),%r12
3375	adcq	8(%rbx),%r13
3376	movq	%r12,%rax
3377	adcq	16(%rbx),%r8
3378	adcq	24(%rbx),%r9
3379	movq	%r13,%rbp
3380	adcq	$0,%r11
3381
3382	xorq	%r10,%r10
3383	sbbq	$-1,%r12
3384	movq	%r8,%rcx
3385	sbbq	%r14,%r13
3386	sbbq	$0,%r8
3387	movq	%r9,%r10
3388	sbbq	%r15,%r9
3389	sbbq	$0,%r11
3390
3391	cmovcq	%rax,%r12
3392	cmovcq	%rbp,%r13
3393	movq	%r12,0(%rdi)
3394	cmovcq	%rcx,%r8
3395	movq	%r13,8(%rdi)
3396	cmovcq	%r10,%r9
3397	movq	%r8,16(%rdi)
3398	movq	%r9,24(%rdi)
3399
3400	ret
3401
3402
3403
3404
3405.p2align	5
3406__ecp_nistz256_sub_fromx:
3407
3408	xorq	%r11,%r11
3409	sbbq	0(%rbx),%r12
3410	sbbq	8(%rbx),%r13
3411	movq	%r12,%rax
3412	sbbq	16(%rbx),%r8
3413	sbbq	24(%rbx),%r9
3414	movq	%r13,%rbp
3415	sbbq	$0,%r11
3416
3417	xorq	%r10,%r10
3418	adcq	$-1,%r12
3419	movq	%r8,%rcx
3420	adcq	%r14,%r13
3421	adcq	$0,%r8
3422	movq	%r9,%r10
3423	adcq	%r15,%r9
3424
3425	btq	$0,%r11
3426	cmovncq	%rax,%r12
3427	cmovncq	%rbp,%r13
3428	movq	%r12,0(%rdi)
3429	cmovncq	%rcx,%r8
3430	movq	%r13,8(%rdi)
3431	cmovncq	%r10,%r9
3432	movq	%r8,16(%rdi)
3433	movq	%r9,24(%rdi)
3434
3435	ret
3436
3437
3438
3439
3440.p2align	5
3441__ecp_nistz256_subx:
3442
3443	xorq	%r11,%r11
3444	sbbq	%r12,%rax
3445	sbbq	%r13,%rbp
3446	movq	%rax,%r12
3447	sbbq	%r8,%rcx
3448	sbbq	%r9,%r10
3449	movq	%rbp,%r13
3450	sbbq	$0,%r11
3451
3452	xorq	%r9,%r9
3453	adcq	$-1,%rax
3454	movq	%rcx,%r8
3455	adcq	%r14,%rbp
3456	adcq	$0,%rcx
3457	movq	%r10,%r9
3458	adcq	%r15,%r10
3459
3460	btq	$0,%r11
3461	cmovcq	%rax,%r12
3462	cmovcq	%rbp,%r13
3463	cmovcq	%rcx,%r8
3464	cmovcq	%r10,%r9
3465
3466	ret
3467
3468
3469
3470
3471.p2align	5
3472__ecp_nistz256_mul_by_2x:
3473
3474	xorq	%r11,%r11
3475	adcq	%r12,%r12
3476	adcq	%r13,%r13
3477	movq	%r12,%rax
3478	adcq	%r8,%r8
3479	adcq	%r9,%r9
3480	movq	%r13,%rbp
3481	adcq	$0,%r11
3482
3483	xorq	%r10,%r10
3484	sbbq	$-1,%r12
3485	movq	%r8,%rcx
3486	sbbq	%r14,%r13
3487	sbbq	$0,%r8
3488	movq	%r9,%r10
3489	sbbq	%r15,%r9
3490	sbbq	$0,%r11
3491
3492	cmovcq	%rax,%r12
3493	cmovcq	%rbp,%r13
3494	movq	%r12,0(%rdi)
3495	cmovcq	%rcx,%r8
3496	movq	%r13,8(%rdi)
3497	cmovcq	%r10,%r9
3498	movq	%r8,16(%rdi)
3499	movq	%r9,24(%rdi)
3500
3501	ret
3502
3503
3504
3505.p2align	5
3506ecp_nistz256_point_doublex:
3507
3508L$point_doublex:
3509	pushq	%rbp
3510
3511	pushq	%rbx
3512
3513	pushq	%r12
3514
3515	pushq	%r13
3516
3517	pushq	%r14
3518
3519	pushq	%r15
3520
3521	subq	$160+8,%rsp
3522
3523L$point_doublex_body:
3524
3525L$point_double_shortcutx:
3526	movdqu	0(%rsi),%xmm0
3527	movq	%rsi,%rbx
3528	movdqu	16(%rsi),%xmm1
3529	movq	32+0(%rsi),%r12
3530	movq	32+8(%rsi),%r13
3531	movq	32+16(%rsi),%r8
3532	movq	32+24(%rsi),%r9
3533	movq	L$poly+8(%rip),%r14
3534	movq	L$poly+24(%rip),%r15
3535	movdqa	%xmm0,96(%rsp)
3536	movdqa	%xmm1,96+16(%rsp)
3537	leaq	32(%rdi),%r10
3538	leaq	64(%rdi),%r11
3539.byte	102,72,15,110,199
3540.byte	102,73,15,110,202
3541.byte	102,73,15,110,211
3542
3543	leaq	0(%rsp),%rdi
3544	call	__ecp_nistz256_mul_by_2x
3545
3546	movq	64+0(%rsi),%rdx
3547	movq	64+8(%rsi),%r14
3548	movq	64+16(%rsi),%r15
3549	movq	64+24(%rsi),%r8
3550	leaq	64-128(%rsi),%rsi
3551	leaq	64(%rsp),%rdi
3552	call	__ecp_nistz256_sqr_montx
3553
3554	movq	0+0(%rsp),%rdx
3555	movq	8+0(%rsp),%r14
3556	leaq	-128+0(%rsp),%rsi
3557	movq	16+0(%rsp),%r15
3558	movq	24+0(%rsp),%r8
3559	leaq	0(%rsp),%rdi
3560	call	__ecp_nistz256_sqr_montx
3561
3562	movq	32(%rbx),%rdx
3563	movq	64+0(%rbx),%r9
3564	movq	64+8(%rbx),%r10
3565	movq	64+16(%rbx),%r11
3566	movq	64+24(%rbx),%r12
3567	leaq	64-128(%rbx),%rsi
3568	leaq	32(%rbx),%rbx
3569.byte	102,72,15,126,215
3570	call	__ecp_nistz256_mul_montx
3571	call	__ecp_nistz256_mul_by_2x
3572
3573	movq	96+0(%rsp),%r12
3574	movq	96+8(%rsp),%r13
3575	leaq	64(%rsp),%rbx
3576	movq	96+16(%rsp),%r8
3577	movq	96+24(%rsp),%r9
3578	leaq	32(%rsp),%rdi
3579	call	__ecp_nistz256_add_tox
3580
3581	movq	96+0(%rsp),%r12
3582	movq	96+8(%rsp),%r13
3583	leaq	64(%rsp),%rbx
3584	movq	96+16(%rsp),%r8
3585	movq	96+24(%rsp),%r9
3586	leaq	64(%rsp),%rdi
3587	call	__ecp_nistz256_sub_fromx
3588
3589	movq	0+0(%rsp),%rdx
3590	movq	8+0(%rsp),%r14
3591	leaq	-128+0(%rsp),%rsi
3592	movq	16+0(%rsp),%r15
3593	movq	24+0(%rsp),%r8
3594.byte	102,72,15,126,207
3595	call	__ecp_nistz256_sqr_montx
3596	xorq	%r9,%r9
3597	movq	%r12,%rax
3598	addq	$-1,%r12
3599	movq	%r13,%r10
3600	adcq	%rsi,%r13
3601	movq	%r14,%rcx
3602	adcq	$0,%r14
3603	movq	%r15,%r8
3604	adcq	%rbp,%r15
3605	adcq	$0,%r9
3606	xorq	%rsi,%rsi
3607	testq	$1,%rax
3608
3609	cmovzq	%rax,%r12
3610	cmovzq	%r10,%r13
3611	cmovzq	%rcx,%r14
3612	cmovzq	%r8,%r15
3613	cmovzq	%rsi,%r9
3614
3615	movq	%r13,%rax
3616	shrq	$1,%r12
3617	shlq	$63,%rax
3618	movq	%r14,%r10
3619	shrq	$1,%r13
3620	orq	%rax,%r12
3621	shlq	$63,%r10
3622	movq	%r15,%rcx
3623	shrq	$1,%r14
3624	orq	%r10,%r13
3625	shlq	$63,%rcx
3626	movq	%r12,0(%rdi)
3627	shrq	$1,%r15
3628	movq	%r13,8(%rdi)
3629	shlq	$63,%r9
3630	orq	%rcx,%r14
3631	orq	%r9,%r15
3632	movq	%r14,16(%rdi)
3633	movq	%r15,24(%rdi)
3634	movq	64(%rsp),%rdx
3635	leaq	64(%rsp),%rbx
3636	movq	0+32(%rsp),%r9
3637	movq	8+32(%rsp),%r10
3638	leaq	-128+32(%rsp),%rsi
3639	movq	16+32(%rsp),%r11
3640	movq	24+32(%rsp),%r12
3641	leaq	32(%rsp),%rdi
3642	call	__ecp_nistz256_mul_montx
3643
3644	leaq	128(%rsp),%rdi
3645	call	__ecp_nistz256_mul_by_2x
3646
3647	leaq	32(%rsp),%rbx
3648	leaq	32(%rsp),%rdi
3649	call	__ecp_nistz256_add_tox
3650
3651	movq	96(%rsp),%rdx
3652	leaq	96(%rsp),%rbx
3653	movq	0+0(%rsp),%r9
3654	movq	8+0(%rsp),%r10
3655	leaq	-128+0(%rsp),%rsi
3656	movq	16+0(%rsp),%r11
3657	movq	24+0(%rsp),%r12
3658	leaq	0(%rsp),%rdi
3659	call	__ecp_nistz256_mul_montx
3660
3661	leaq	128(%rsp),%rdi
3662	call	__ecp_nistz256_mul_by_2x
3663
3664	movq	0+32(%rsp),%rdx
3665	movq	8+32(%rsp),%r14
3666	leaq	-128+32(%rsp),%rsi
3667	movq	16+32(%rsp),%r15
3668	movq	24+32(%rsp),%r8
3669.byte	102,72,15,126,199
3670	call	__ecp_nistz256_sqr_montx
3671
3672	leaq	128(%rsp),%rbx
3673	movq	%r14,%r8
3674	movq	%r15,%r9
3675	movq	%rsi,%r14
3676	movq	%rbp,%r15
3677	call	__ecp_nistz256_sub_fromx
3678
3679	movq	0+0(%rsp),%rax
3680	movq	0+8(%rsp),%rbp
3681	movq	0+16(%rsp),%rcx
3682	movq	0+24(%rsp),%r10
3683	leaq	0(%rsp),%rdi
3684	call	__ecp_nistz256_subx
3685
3686	movq	32(%rsp),%rdx
3687	leaq	32(%rsp),%rbx
3688	movq	%r12,%r14
3689	xorl	%ecx,%ecx
3690	movq	%r12,0+0(%rsp)
3691	movq	%r13,%r10
3692	movq	%r13,0+8(%rsp)
3693	cmovzq	%r8,%r11
3694	movq	%r8,0+16(%rsp)
3695	leaq	0-128(%rsp),%rsi
3696	cmovzq	%r9,%r12
3697	movq	%r9,0+24(%rsp)
3698	movq	%r14,%r9
3699	leaq	0(%rsp),%rdi
3700	call	__ecp_nistz256_mul_montx
3701
3702.byte	102,72,15,126,203
3703.byte	102,72,15,126,207
3704	call	__ecp_nistz256_sub_fromx
3705
3706	leaq	160+56(%rsp),%rsi
3707
3708	movq	-48(%rsi),%r15
3709
3710	movq	-40(%rsi),%r14
3711
3712	movq	-32(%rsi),%r13
3713
3714	movq	-24(%rsi),%r12
3715
3716	movq	-16(%rsi),%rbx
3717
3718	movq	-8(%rsi),%rbp
3719
3720	leaq	(%rsi),%rsp
3721
3722L$point_doublex_epilogue:
3723	ret
3724
3725
3726
3727.p2align	5
3728ecp_nistz256_point_addx:
3729
3730L$point_addx:
3731	pushq	%rbp
3732
3733	pushq	%rbx
3734
3735	pushq	%r12
3736
3737	pushq	%r13
3738
3739	pushq	%r14
3740
3741	pushq	%r15
3742
3743	subq	$576+8,%rsp
3744
3745L$point_addx_body:
3746
3747	movdqu	0(%rsi),%xmm0
3748	movdqu	16(%rsi),%xmm1
3749	movdqu	32(%rsi),%xmm2
3750	movdqu	48(%rsi),%xmm3
3751	movdqu	64(%rsi),%xmm4
3752	movdqu	80(%rsi),%xmm5
3753	movq	%rsi,%rbx
3754	movq	%rdx,%rsi
3755	movdqa	%xmm0,384(%rsp)
3756	movdqa	%xmm1,384+16(%rsp)
3757	movdqa	%xmm2,416(%rsp)
3758	movdqa	%xmm3,416+16(%rsp)
3759	movdqa	%xmm4,448(%rsp)
3760	movdqa	%xmm5,448+16(%rsp)
3761	por	%xmm4,%xmm5
3762
3763	movdqu	0(%rsi),%xmm0
3764	pshufd	$0xb1,%xmm5,%xmm3
3765	movdqu	16(%rsi),%xmm1
3766	movdqu	32(%rsi),%xmm2
3767	por	%xmm3,%xmm5
3768	movdqu	48(%rsi),%xmm3
3769	movq	64+0(%rsi),%rdx
3770	movq	64+8(%rsi),%r14
3771	movq	64+16(%rsi),%r15
3772	movq	64+24(%rsi),%r8
3773	movdqa	%xmm0,480(%rsp)
3774	pshufd	$0x1e,%xmm5,%xmm4
3775	movdqa	%xmm1,480+16(%rsp)
3776	movdqu	64(%rsi),%xmm0
3777	movdqu	80(%rsi),%xmm1
3778	movdqa	%xmm2,512(%rsp)
3779	movdqa	%xmm3,512+16(%rsp)
3780	por	%xmm4,%xmm5
3781	pxor	%xmm4,%xmm4
3782	por	%xmm0,%xmm1
3783.byte	102,72,15,110,199
3784
3785	leaq	64-128(%rsi),%rsi
3786	movq	%rdx,544+0(%rsp)
3787	movq	%r14,544+8(%rsp)
3788	movq	%r15,544+16(%rsp)
3789	movq	%r8,544+24(%rsp)
3790	leaq	96(%rsp),%rdi
3791	call	__ecp_nistz256_sqr_montx
3792
3793	pcmpeqd	%xmm4,%xmm5
3794	pshufd	$0xb1,%xmm1,%xmm4
3795	por	%xmm1,%xmm4
3796	pshufd	$0,%xmm5,%xmm5
3797	pshufd	$0x1e,%xmm4,%xmm3
3798	por	%xmm3,%xmm4
3799	pxor	%xmm3,%xmm3
3800	pcmpeqd	%xmm3,%xmm4
3801	pshufd	$0,%xmm4,%xmm4
3802	movq	64+0(%rbx),%rdx
3803	movq	64+8(%rbx),%r14
3804	movq	64+16(%rbx),%r15
3805	movq	64+24(%rbx),%r8
3806.byte	102,72,15,110,203
3807
3808	leaq	64-128(%rbx),%rsi
3809	leaq	32(%rsp),%rdi
3810	call	__ecp_nistz256_sqr_montx
3811
3812	movq	544(%rsp),%rdx
3813	leaq	544(%rsp),%rbx
3814	movq	0+96(%rsp),%r9
3815	movq	8+96(%rsp),%r10
3816	leaq	-128+96(%rsp),%rsi
3817	movq	16+96(%rsp),%r11
3818	movq	24+96(%rsp),%r12
3819	leaq	224(%rsp),%rdi
3820	call	__ecp_nistz256_mul_montx
3821
3822	movq	448(%rsp),%rdx
3823	leaq	448(%rsp),%rbx
3824	movq	0+32(%rsp),%r9
3825	movq	8+32(%rsp),%r10
3826	leaq	-128+32(%rsp),%rsi
3827	movq	16+32(%rsp),%r11
3828	movq	24+32(%rsp),%r12
3829	leaq	256(%rsp),%rdi
3830	call	__ecp_nistz256_mul_montx
3831
3832	movq	416(%rsp),%rdx
3833	leaq	416(%rsp),%rbx
3834	movq	0+224(%rsp),%r9
3835	movq	8+224(%rsp),%r10
3836	leaq	-128+224(%rsp),%rsi
3837	movq	16+224(%rsp),%r11
3838	movq	24+224(%rsp),%r12
3839	leaq	224(%rsp),%rdi
3840	call	__ecp_nistz256_mul_montx
3841
3842	movq	512(%rsp),%rdx
3843	leaq	512(%rsp),%rbx
3844	movq	0+256(%rsp),%r9
3845	movq	8+256(%rsp),%r10
3846	leaq	-128+256(%rsp),%rsi
3847	movq	16+256(%rsp),%r11
3848	movq	24+256(%rsp),%r12
3849	leaq	256(%rsp),%rdi
3850	call	__ecp_nistz256_mul_montx
3851
3852	leaq	224(%rsp),%rbx
3853	leaq	64(%rsp),%rdi
3854	call	__ecp_nistz256_sub_fromx
3855
3856	orq	%r13,%r12
3857	movdqa	%xmm4,%xmm2
3858	orq	%r8,%r12
3859	orq	%r9,%r12
3860	por	%xmm5,%xmm2
3861.byte	102,73,15,110,220
3862
3863	movq	384(%rsp),%rdx
3864	leaq	384(%rsp),%rbx
3865	movq	0+96(%rsp),%r9
3866	movq	8+96(%rsp),%r10
3867	leaq	-128+96(%rsp),%rsi
3868	movq	16+96(%rsp),%r11
3869	movq	24+96(%rsp),%r12
3870	leaq	160(%rsp),%rdi
3871	call	__ecp_nistz256_mul_montx
3872
3873	movq	480(%rsp),%rdx
3874	leaq	480(%rsp),%rbx
3875	movq	0+32(%rsp),%r9
3876	movq	8+32(%rsp),%r10
3877	leaq	-128+32(%rsp),%rsi
3878	movq	16+32(%rsp),%r11
3879	movq	24+32(%rsp),%r12
3880	leaq	192(%rsp),%rdi
3881	call	__ecp_nistz256_mul_montx
3882
3883	leaq	160(%rsp),%rbx
3884	leaq	0(%rsp),%rdi
3885	call	__ecp_nistz256_sub_fromx
3886
3887	orq	%r13,%r12
3888	orq	%r8,%r12
3889	orq	%r9,%r12
3890
3891.byte	102,73,15,126,208
3892.byte	102,73,15,126,217
3893	orq	%r8,%r12
3894.byte	0x3e
3895	jnz	L$add_proceedx
3896
3897
3898
3899	testq	%r9,%r9
3900	jz	L$add_doublex
3901
3902
3903
3904
3905
3906
3907.byte	102,72,15,126,199
3908	pxor	%xmm0,%xmm0
3909	movdqu	%xmm0,0(%rdi)
3910	movdqu	%xmm0,16(%rdi)
3911	movdqu	%xmm0,32(%rdi)
3912	movdqu	%xmm0,48(%rdi)
3913	movdqu	%xmm0,64(%rdi)
3914	movdqu	%xmm0,80(%rdi)
3915	jmp	L$add_donex
3916
3917.p2align	5
3918L$add_doublex:
3919.byte	102,72,15,126,206
3920.byte	102,72,15,126,199
3921	addq	$416,%rsp
3922
3923	jmp	L$point_double_shortcutx
3924
3925
3926.p2align	5
3927L$add_proceedx:
3928	movq	0+64(%rsp),%rdx
3929	movq	8+64(%rsp),%r14
3930	leaq	-128+64(%rsp),%rsi
3931	movq	16+64(%rsp),%r15
3932	movq	24+64(%rsp),%r8
3933	leaq	96(%rsp),%rdi
3934	call	__ecp_nistz256_sqr_montx
3935
3936	movq	448(%rsp),%rdx
3937	leaq	448(%rsp),%rbx
3938	movq	0+0(%rsp),%r9
3939	movq	8+0(%rsp),%r10
3940	leaq	-128+0(%rsp),%rsi
3941	movq	16+0(%rsp),%r11
3942	movq	24+0(%rsp),%r12
3943	leaq	352(%rsp),%rdi
3944	call	__ecp_nistz256_mul_montx
3945
3946	movq	0+0(%rsp),%rdx
3947	movq	8+0(%rsp),%r14
3948	leaq	-128+0(%rsp),%rsi
3949	movq	16+0(%rsp),%r15
3950	movq	24+0(%rsp),%r8
3951	leaq	32(%rsp),%rdi
3952	call	__ecp_nistz256_sqr_montx
3953
3954	movq	544(%rsp),%rdx
3955	leaq	544(%rsp),%rbx
3956	movq	0+352(%rsp),%r9
3957	movq	8+352(%rsp),%r10
3958	leaq	-128+352(%rsp),%rsi
3959	movq	16+352(%rsp),%r11
3960	movq	24+352(%rsp),%r12
3961	leaq	352(%rsp),%rdi
3962	call	__ecp_nistz256_mul_montx
3963
3964	movq	0(%rsp),%rdx
3965	leaq	0(%rsp),%rbx
3966	movq	0+32(%rsp),%r9
3967	movq	8+32(%rsp),%r10
3968	leaq	-128+32(%rsp),%rsi
3969	movq	16+32(%rsp),%r11
3970	movq	24+32(%rsp),%r12
3971	leaq	128(%rsp),%rdi
3972	call	__ecp_nistz256_mul_montx
3973
3974	movq	160(%rsp),%rdx
3975	leaq	160(%rsp),%rbx
3976	movq	0+32(%rsp),%r9
3977	movq	8+32(%rsp),%r10
3978	leaq	-128+32(%rsp),%rsi
3979	movq	16+32(%rsp),%r11
3980	movq	24+32(%rsp),%r12
3981	leaq	192(%rsp),%rdi
3982	call	__ecp_nistz256_mul_montx
3983
3984
3985
3986
3987	xorq	%r11,%r11
3988	addq	%r12,%r12
3989	leaq	96(%rsp),%rsi
3990	adcq	%r13,%r13
3991	movq	%r12,%rax
3992	adcq	%r8,%r8
3993	adcq	%r9,%r9
3994	movq	%r13,%rbp
3995	adcq	$0,%r11
3996
3997	subq	$-1,%r12
3998	movq	%r8,%rcx
3999	sbbq	%r14,%r13
4000	sbbq	$0,%r8
4001	movq	%r9,%r10
4002	sbbq	%r15,%r9
4003	sbbq	$0,%r11
4004
4005	cmovcq	%rax,%r12
4006	movq	0(%rsi),%rax
4007	cmovcq	%rbp,%r13
4008	movq	8(%rsi),%rbp
4009	cmovcq	%rcx,%r8
4010	movq	16(%rsi),%rcx
4011	cmovcq	%r10,%r9
4012	movq	24(%rsi),%r10
4013
4014	call	__ecp_nistz256_subx
4015
4016	leaq	128(%rsp),%rbx
4017	leaq	288(%rsp),%rdi
4018	call	__ecp_nistz256_sub_fromx
4019
4020	movq	192+0(%rsp),%rax
4021	movq	192+8(%rsp),%rbp
4022	movq	192+16(%rsp),%rcx
4023	movq	192+24(%rsp),%r10
4024	leaq	320(%rsp),%rdi
4025
4026	call	__ecp_nistz256_subx
4027
4028	movq	%r12,0(%rdi)
4029	movq	%r13,8(%rdi)
4030	movq	%r8,16(%rdi)
4031	movq	%r9,24(%rdi)
4032	movq	128(%rsp),%rdx
4033	leaq	128(%rsp),%rbx
4034	movq	0+224(%rsp),%r9
4035	movq	8+224(%rsp),%r10
4036	leaq	-128+224(%rsp),%rsi
4037	movq	16+224(%rsp),%r11
4038	movq	24+224(%rsp),%r12
4039	leaq	256(%rsp),%rdi
4040	call	__ecp_nistz256_mul_montx
4041
4042	movq	320(%rsp),%rdx
4043	leaq	320(%rsp),%rbx
4044	movq	0+64(%rsp),%r9
4045	movq	8+64(%rsp),%r10
4046	leaq	-128+64(%rsp),%rsi
4047	movq	16+64(%rsp),%r11
4048	movq	24+64(%rsp),%r12
4049	leaq	320(%rsp),%rdi
4050	call	__ecp_nistz256_mul_montx
4051
4052	leaq	256(%rsp),%rbx
4053	leaq	320(%rsp),%rdi
4054	call	__ecp_nistz256_sub_fromx
4055
4056.byte	102,72,15,126,199
4057
4058	movdqa	%xmm5,%xmm0
4059	movdqa	%xmm5,%xmm1
4060	pandn	352(%rsp),%xmm0
4061	movdqa	%xmm5,%xmm2
4062	pandn	352+16(%rsp),%xmm1
4063	movdqa	%xmm5,%xmm3
4064	pand	544(%rsp),%xmm2
4065	pand	544+16(%rsp),%xmm3
4066	por	%xmm0,%xmm2
4067	por	%xmm1,%xmm3
4068
4069	movdqa	%xmm4,%xmm0
4070	movdqa	%xmm4,%xmm1
4071	pandn	%xmm2,%xmm0
4072	movdqa	%xmm4,%xmm2
4073	pandn	%xmm3,%xmm1
4074	movdqa	%xmm4,%xmm3
4075	pand	448(%rsp),%xmm2
4076	pand	448+16(%rsp),%xmm3
4077	por	%xmm0,%xmm2
4078	por	%xmm1,%xmm3
4079	movdqu	%xmm2,64(%rdi)
4080	movdqu	%xmm3,80(%rdi)
4081
4082	movdqa	%xmm5,%xmm0
4083	movdqa	%xmm5,%xmm1
4084	pandn	288(%rsp),%xmm0
4085	movdqa	%xmm5,%xmm2
4086	pandn	288+16(%rsp),%xmm1
4087	movdqa	%xmm5,%xmm3
4088	pand	480(%rsp),%xmm2
4089	pand	480+16(%rsp),%xmm3
4090	por	%xmm0,%xmm2
4091	por	%xmm1,%xmm3
4092
4093	movdqa	%xmm4,%xmm0
4094	movdqa	%xmm4,%xmm1
4095	pandn	%xmm2,%xmm0
4096	movdqa	%xmm4,%xmm2
4097	pandn	%xmm3,%xmm1
4098	movdqa	%xmm4,%xmm3
4099	pand	384(%rsp),%xmm2
4100	pand	384+16(%rsp),%xmm3
4101	por	%xmm0,%xmm2
4102	por	%xmm1,%xmm3
4103	movdqu	%xmm2,0(%rdi)
4104	movdqu	%xmm3,16(%rdi)
4105
4106	movdqa	%xmm5,%xmm0
4107	movdqa	%xmm5,%xmm1
4108	pandn	320(%rsp),%xmm0
4109	movdqa	%xmm5,%xmm2
4110	pandn	320+16(%rsp),%xmm1
4111	movdqa	%xmm5,%xmm3
4112	pand	512(%rsp),%xmm2
4113	pand	512+16(%rsp),%xmm3
4114	por	%xmm0,%xmm2
4115	por	%xmm1,%xmm3
4116
4117	movdqa	%xmm4,%xmm0
4118	movdqa	%xmm4,%xmm1
4119	pandn	%xmm2,%xmm0
4120	movdqa	%xmm4,%xmm2
4121	pandn	%xmm3,%xmm1
4122	movdqa	%xmm4,%xmm3
4123	pand	416(%rsp),%xmm2
4124	pand	416+16(%rsp),%xmm3
4125	por	%xmm0,%xmm2
4126	por	%xmm1,%xmm3
4127	movdqu	%xmm2,32(%rdi)
4128	movdqu	%xmm3,48(%rdi)
4129
4130L$add_donex:
4131	leaq	576+56(%rsp),%rsi
4132
4133	movq	-48(%rsi),%r15
4134
4135	movq	-40(%rsi),%r14
4136
4137	movq	-32(%rsi),%r13
4138
4139	movq	-24(%rsi),%r12
4140
4141	movq	-16(%rsi),%rbx
4142
4143	movq	-8(%rsi),%rbp
4144
4145	leaq	(%rsi),%rsp
4146
4147L$point_addx_epilogue:
4148	ret
4149
4150
4151
4152.p2align	5
4153ecp_nistz256_point_add_affinex:
4154
4155L$point_add_affinex:
4156	pushq	%rbp
4157
4158	pushq	%rbx
4159
4160	pushq	%r12
4161
4162	pushq	%r13
4163
4164	pushq	%r14
4165
4166	pushq	%r15
4167
4168	subq	$480+8,%rsp
4169
4170L$add_affinex_body:
4171
4172	movdqu	0(%rsi),%xmm0
4173	movq	%rdx,%rbx
4174	movdqu	16(%rsi),%xmm1
4175	movdqu	32(%rsi),%xmm2
4176	movdqu	48(%rsi),%xmm3
4177	movdqu	64(%rsi),%xmm4
4178	movdqu	80(%rsi),%xmm5
4179	movq	64+0(%rsi),%rdx
4180	movq	64+8(%rsi),%r14
4181	movq	64+16(%rsi),%r15
4182	movq	64+24(%rsi),%r8
4183	movdqa	%xmm0,320(%rsp)
4184	movdqa	%xmm1,320+16(%rsp)
4185	movdqa	%xmm2,352(%rsp)
4186	movdqa	%xmm3,352+16(%rsp)
4187	movdqa	%xmm4,384(%rsp)
4188	movdqa	%xmm5,384+16(%rsp)
4189	por	%xmm4,%xmm5
4190
4191	movdqu	0(%rbx),%xmm0
4192	pshufd	$0xb1,%xmm5,%xmm3
4193	movdqu	16(%rbx),%xmm1
4194	movdqu	32(%rbx),%xmm2
4195	por	%xmm3,%xmm5
4196	movdqu	48(%rbx),%xmm3
4197	movdqa	%xmm0,416(%rsp)
4198	pshufd	$0x1e,%xmm5,%xmm4
4199	movdqa	%xmm1,416+16(%rsp)
4200	por	%xmm0,%xmm1
4201.byte	102,72,15,110,199
4202	movdqa	%xmm2,448(%rsp)
4203	movdqa	%xmm3,448+16(%rsp)
4204	por	%xmm2,%xmm3
4205	por	%xmm4,%xmm5
4206	pxor	%xmm4,%xmm4
4207	por	%xmm1,%xmm3
4208
4209	leaq	64-128(%rsi),%rsi
4210	leaq	32(%rsp),%rdi
4211	call	__ecp_nistz256_sqr_montx
4212
4213	pcmpeqd	%xmm4,%xmm5
4214	pshufd	$0xb1,%xmm3,%xmm4
4215	movq	0(%rbx),%rdx
4216
4217	movq	%r12,%r9
4218	por	%xmm3,%xmm4
4219	pshufd	$0,%xmm5,%xmm5
4220	pshufd	$0x1e,%xmm4,%xmm3
4221	movq	%r13,%r10
4222	por	%xmm3,%xmm4
4223	pxor	%xmm3,%xmm3
4224	movq	%r14,%r11
4225	pcmpeqd	%xmm3,%xmm4
4226	pshufd	$0,%xmm4,%xmm4
4227
4228	leaq	32-128(%rsp),%rsi
4229	movq	%r15,%r12
4230	leaq	0(%rsp),%rdi
4231	call	__ecp_nistz256_mul_montx
4232
4233	leaq	320(%rsp),%rbx
4234	leaq	64(%rsp),%rdi
4235	call	__ecp_nistz256_sub_fromx
4236
4237	movq	384(%rsp),%rdx
4238	leaq	384(%rsp),%rbx
4239	movq	0+32(%rsp),%r9
4240	movq	8+32(%rsp),%r10
4241	leaq	-128+32(%rsp),%rsi
4242	movq	16+32(%rsp),%r11
4243	movq	24+32(%rsp),%r12
4244	leaq	32(%rsp),%rdi
4245	call	__ecp_nistz256_mul_montx
4246
4247	movq	384(%rsp),%rdx
4248	leaq	384(%rsp),%rbx
4249	movq	0+64(%rsp),%r9
4250	movq	8+64(%rsp),%r10
4251	leaq	-128+64(%rsp),%rsi
4252	movq	16+64(%rsp),%r11
4253	movq	24+64(%rsp),%r12
4254	leaq	288(%rsp),%rdi
4255	call	__ecp_nistz256_mul_montx
4256
4257	movq	448(%rsp),%rdx
4258	leaq	448(%rsp),%rbx
4259	movq	0+32(%rsp),%r9
4260	movq	8+32(%rsp),%r10
4261	leaq	-128+32(%rsp),%rsi
4262	movq	16+32(%rsp),%r11
4263	movq	24+32(%rsp),%r12
4264	leaq	32(%rsp),%rdi
4265	call	__ecp_nistz256_mul_montx
4266
4267	leaq	352(%rsp),%rbx
4268	leaq	96(%rsp),%rdi
4269	call	__ecp_nistz256_sub_fromx
4270
4271	movq	0+64(%rsp),%rdx
4272	movq	8+64(%rsp),%r14
4273	leaq	-128+64(%rsp),%rsi
4274	movq	16+64(%rsp),%r15
4275	movq	24+64(%rsp),%r8
4276	leaq	128(%rsp),%rdi
4277	call	__ecp_nistz256_sqr_montx
4278
4279	movq	0+96(%rsp),%rdx
4280	movq	8+96(%rsp),%r14
4281	leaq	-128+96(%rsp),%rsi
4282	movq	16+96(%rsp),%r15
4283	movq	24+96(%rsp),%r8
4284	leaq	192(%rsp),%rdi
4285	call	__ecp_nistz256_sqr_montx
4286
4287	movq	128(%rsp),%rdx
4288	leaq	128(%rsp),%rbx
4289	movq	0+64(%rsp),%r9
4290	movq	8+64(%rsp),%r10
4291	leaq	-128+64(%rsp),%rsi
4292	movq	16+64(%rsp),%r11
4293	movq	24+64(%rsp),%r12
4294	leaq	160(%rsp),%rdi
4295	call	__ecp_nistz256_mul_montx
4296
4297	movq	320(%rsp),%rdx
4298	leaq	320(%rsp),%rbx
4299	movq	0+128(%rsp),%r9
4300	movq	8+128(%rsp),%r10
4301	leaq	-128+128(%rsp),%rsi
4302	movq	16+128(%rsp),%r11
4303	movq	24+128(%rsp),%r12
4304	leaq	0(%rsp),%rdi
4305	call	__ecp_nistz256_mul_montx
4306
4307
4308
4309
4310	xorq	%r11,%r11
4311	addq	%r12,%r12
4312	leaq	192(%rsp),%rsi
4313	adcq	%r13,%r13
4314	movq	%r12,%rax
4315	adcq	%r8,%r8
4316	adcq	%r9,%r9
4317	movq	%r13,%rbp
4318	adcq	$0,%r11
4319
4320	subq	$-1,%r12
4321	movq	%r8,%rcx
4322	sbbq	%r14,%r13
4323	sbbq	$0,%r8
4324	movq	%r9,%r10
4325	sbbq	%r15,%r9
4326	sbbq	$0,%r11
4327
4328	cmovcq	%rax,%r12
4329	movq	0(%rsi),%rax
4330	cmovcq	%rbp,%r13
4331	movq	8(%rsi),%rbp
4332	cmovcq	%rcx,%r8
4333	movq	16(%rsi),%rcx
4334	cmovcq	%r10,%r9
4335	movq	24(%rsi),%r10
4336
4337	call	__ecp_nistz256_subx
4338
4339	leaq	160(%rsp),%rbx
4340	leaq	224(%rsp),%rdi
4341	call	__ecp_nistz256_sub_fromx
4342
4343	movq	0+0(%rsp),%rax
4344	movq	0+8(%rsp),%rbp
4345	movq	0+16(%rsp),%rcx
4346	movq	0+24(%rsp),%r10
4347	leaq	64(%rsp),%rdi
4348
4349	call	__ecp_nistz256_subx
4350
4351	movq	%r12,0(%rdi)
4352	movq	%r13,8(%rdi)
4353	movq	%r8,16(%rdi)
4354	movq	%r9,24(%rdi)
4355	movq	352(%rsp),%rdx
4356	leaq	352(%rsp),%rbx
4357	movq	0+160(%rsp),%r9
4358	movq	8+160(%rsp),%r10
4359	leaq	-128+160(%rsp),%rsi
4360	movq	16+160(%rsp),%r11
4361	movq	24+160(%rsp),%r12
4362	leaq	32(%rsp),%rdi
4363	call	__ecp_nistz256_mul_montx
4364
4365	movq	96(%rsp),%rdx
4366	leaq	96(%rsp),%rbx
4367	movq	0+64(%rsp),%r9
4368	movq	8+64(%rsp),%r10
4369	leaq	-128+64(%rsp),%rsi
4370	movq	16+64(%rsp),%r11
4371	movq	24+64(%rsp),%r12
4372	leaq	64(%rsp),%rdi
4373	call	__ecp_nistz256_mul_montx
4374
4375	leaq	32(%rsp),%rbx
4376	leaq	256(%rsp),%rdi
4377	call	__ecp_nistz256_sub_fromx
4378
4379.byte	102,72,15,126,199
4380
4381	movdqa	%xmm5,%xmm0
4382	movdqa	%xmm5,%xmm1
4383	pandn	288(%rsp),%xmm0
4384	movdqa	%xmm5,%xmm2
4385	pandn	288+16(%rsp),%xmm1
4386	movdqa	%xmm5,%xmm3
4387	pand	L$ONE_mont(%rip),%xmm2
4388	pand	L$ONE_mont+16(%rip),%xmm3
4389	por	%xmm0,%xmm2
4390	por	%xmm1,%xmm3
4391
4392	movdqa	%xmm4,%xmm0
4393	movdqa	%xmm4,%xmm1
4394	pandn	%xmm2,%xmm0
4395	movdqa	%xmm4,%xmm2
4396	pandn	%xmm3,%xmm1
4397	movdqa	%xmm4,%xmm3
4398	pand	384(%rsp),%xmm2
4399	pand	384+16(%rsp),%xmm3
4400	por	%xmm0,%xmm2
4401	por	%xmm1,%xmm3
4402	movdqu	%xmm2,64(%rdi)
4403	movdqu	%xmm3,80(%rdi)
4404
4405	movdqa	%xmm5,%xmm0
4406	movdqa	%xmm5,%xmm1
4407	pandn	224(%rsp),%xmm0
4408	movdqa	%xmm5,%xmm2
4409	pandn	224+16(%rsp),%xmm1
4410	movdqa	%xmm5,%xmm3
4411	pand	416(%rsp),%xmm2
4412	pand	416+16(%rsp),%xmm3
4413	por	%xmm0,%xmm2
4414	por	%xmm1,%xmm3
4415
4416	movdqa	%xmm4,%xmm0
4417	movdqa	%xmm4,%xmm1
4418	pandn	%xmm2,%xmm0
4419	movdqa	%xmm4,%xmm2
4420	pandn	%xmm3,%xmm1
4421	movdqa	%xmm4,%xmm3
4422	pand	320(%rsp),%xmm2
4423	pand	320+16(%rsp),%xmm3
4424	por	%xmm0,%xmm2
4425	por	%xmm1,%xmm3
4426	movdqu	%xmm2,0(%rdi)
4427	movdqu	%xmm3,16(%rdi)
4428
4429	movdqa	%xmm5,%xmm0
4430	movdqa	%xmm5,%xmm1
4431	pandn	256(%rsp),%xmm0
4432	movdqa	%xmm5,%xmm2
4433	pandn	256+16(%rsp),%xmm1
4434	movdqa	%xmm5,%xmm3
4435	pand	448(%rsp),%xmm2
4436	pand	448+16(%rsp),%xmm3
4437	por	%xmm0,%xmm2
4438	por	%xmm1,%xmm3
4439
4440	movdqa	%xmm4,%xmm0
4441	movdqa	%xmm4,%xmm1
4442	pandn	%xmm2,%xmm0
4443	movdqa	%xmm4,%xmm2
4444	pandn	%xmm3,%xmm1
4445	movdqa	%xmm4,%xmm3
4446	pand	352(%rsp),%xmm2
4447	pand	352+16(%rsp),%xmm3
4448	por	%xmm0,%xmm2
4449	por	%xmm1,%xmm3
4450	movdqu	%xmm2,32(%rdi)
4451	movdqu	%xmm3,48(%rdi)
4452
4453	leaq	480+56(%rsp),%rsi
4454
4455	movq	-48(%rsi),%r15
4456
4457	movq	-40(%rsi),%r14
4458
4459	movq	-32(%rsi),%r13
4460
4461	movq	-24(%rsi),%r12
4462
4463	movq	-16(%rsi),%rbx
4464
4465	movq	-8(%rsi),%rbp
4466
4467	leaq	(%rsi),%rsp
4468
4469L$add_affinex_epilogue:
4470	ret
4471
4472
4473#endif
4474