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