1; This file is generated from a similarly-named Perl script in the BoringSSL
2; source tree. Do not edit by hand.
3
4%ifdef BORINGSSL_PREFIX
5%include "boringssl_prefix_symbols_nasm.inc"
6%endif
7%ifidn __OUTPUT_FORMAT__,obj
8section	code	use32 class=code align=64
9%elifidn __OUTPUT_FORMAT__,win32
10$@feat.00 equ 1
11section	.text	code align=64
12%else
13section	.text	code
14%endif
15;extern	_GFp_ia32cap_P
16L$ONE_mont:
17dd	1,0,0,-1,-1,-1,-2,0
18align	16
19__ecp_nistz256_div_by_2:
20	mov	ebp,DWORD [esi]
21	xor	edx,edx
22	mov	ebx,DWORD [4+esi]
23	mov	eax,ebp
24	and	ebp,1
25	mov	ecx,DWORD [8+esi]
26	sub	edx,ebp
27	add	eax,edx
28	adc	ebx,edx
29	mov	DWORD [edi],eax
30	adc	ecx,edx
31	mov	DWORD [4+edi],ebx
32	mov	DWORD [8+edi],ecx
33	mov	eax,DWORD [12+esi]
34	mov	ebx,DWORD [16+esi]
35	adc	eax,0
36	mov	ecx,DWORD [20+esi]
37	adc	ebx,0
38	mov	DWORD [12+edi],eax
39	adc	ecx,0
40	mov	DWORD [16+edi],ebx
41	mov	DWORD [20+edi],ecx
42	mov	eax,DWORD [24+esi]
43	mov	ebx,DWORD [28+esi]
44	adc	eax,ebp
45	adc	ebx,edx
46	mov	DWORD [24+edi],eax
47	sbb	esi,esi
48	mov	DWORD [28+edi],ebx
49	mov	eax,DWORD [edi]
50	mov	ebx,DWORD [4+edi]
51	mov	ecx,DWORD [8+edi]
52	mov	edx,DWORD [12+edi]
53	shr	eax,1
54	mov	ebp,ebx
55	shl	ebx,31
56	or	eax,ebx
57	shr	ebp,1
58	mov	ebx,ecx
59	shl	ecx,31
60	mov	DWORD [edi],eax
61	or	ebp,ecx
62	mov	eax,DWORD [16+edi]
63	shr	ebx,1
64	mov	ecx,edx
65	shl	edx,31
66	mov	DWORD [4+edi],ebp
67	or	ebx,edx
68	mov	ebp,DWORD [20+edi]
69	shr	ecx,1
70	mov	edx,eax
71	shl	eax,31
72	mov	DWORD [8+edi],ebx
73	or	ecx,eax
74	mov	ebx,DWORD [24+edi]
75	shr	edx,1
76	mov	eax,ebp
77	shl	ebp,31
78	mov	DWORD [12+edi],ecx
79	or	edx,ebp
80	mov	ecx,DWORD [28+edi]
81	shr	eax,1
82	mov	ebp,ebx
83	shl	ebx,31
84	mov	DWORD [16+edi],edx
85	or	eax,ebx
86	shr	ebp,1
87	mov	ebx,ecx
88	shl	ecx,31
89	mov	DWORD [20+edi],eax
90	or	ebp,ecx
91	shr	ebx,1
92	shl	esi,31
93	mov	DWORD [24+edi],ebp
94	or	ebx,esi
95	mov	DWORD [28+edi],ebx
96	ret
97global	_GFp_nistz256_add
98align	16
99_GFp_nistz256_add:
100L$_GFp_nistz256_add_begin:
101	push	ebp
102	push	ebx
103	push	esi
104	push	edi
105	mov	esi,DWORD [24+esp]
106	mov	ebp,DWORD [28+esp]
107	mov	edi,DWORD [20+esp]
108	call	__ecp_nistz256_add
109	pop	edi
110	pop	esi
111	pop	ebx
112	pop	ebp
113	ret
114align	16
115__ecp_nistz256_add:
116	mov	eax,DWORD [esi]
117	mov	ebx,DWORD [4+esi]
118	mov	ecx,DWORD [8+esi]
119	add	eax,DWORD [ebp]
120	mov	edx,DWORD [12+esi]
121	adc	ebx,DWORD [4+ebp]
122	mov	DWORD [edi],eax
123	adc	ecx,DWORD [8+ebp]
124	mov	DWORD [4+edi],ebx
125	adc	edx,DWORD [12+ebp]
126	mov	DWORD [8+edi],ecx
127	mov	DWORD [12+edi],edx
128	mov	eax,DWORD [16+esi]
129	mov	ebx,DWORD [20+esi]
130	mov	ecx,DWORD [24+esi]
131	adc	eax,DWORD [16+ebp]
132	mov	edx,DWORD [28+esi]
133	adc	ebx,DWORD [20+ebp]
134	mov	DWORD [16+edi],eax
135	adc	ecx,DWORD [24+ebp]
136	mov	DWORD [20+edi],ebx
137	mov	esi,0
138	adc	edx,DWORD [28+ebp]
139	mov	DWORD [24+edi],ecx
140	adc	esi,0
141	mov	DWORD [28+edi],edx
142	mov	eax,DWORD [edi]
143	mov	ebx,DWORD [4+edi]
144	mov	ecx,DWORD [8+edi]
145	sub	eax,-1
146	mov	edx,DWORD [12+edi]
147	sbb	ebx,-1
148	mov	eax,DWORD [16+edi]
149	sbb	ecx,-1
150	mov	ebx,DWORD [20+edi]
151	sbb	edx,0
152	mov	ecx,DWORD [24+edi]
153	sbb	eax,0
154	mov	edx,DWORD [28+edi]
155	sbb	ebx,0
156	sbb	ecx,1
157	sbb	edx,-1
158	sbb	esi,0
159	not	esi
160	mov	eax,DWORD [edi]
161	mov	ebp,esi
162	mov	ebx,DWORD [4+edi]
163	shr	ebp,31
164	mov	ecx,DWORD [8+edi]
165	sub	eax,esi
166	mov	edx,DWORD [12+edi]
167	sbb	ebx,esi
168	mov	DWORD [edi],eax
169	sbb	ecx,esi
170	mov	DWORD [4+edi],ebx
171	sbb	edx,0
172	mov	DWORD [8+edi],ecx
173	mov	DWORD [12+edi],edx
174	mov	eax,DWORD [16+edi]
175	mov	ebx,DWORD [20+edi]
176	mov	ecx,DWORD [24+edi]
177	sbb	eax,0
178	mov	edx,DWORD [28+edi]
179	sbb	ebx,0
180	mov	DWORD [16+edi],eax
181	sbb	ecx,ebp
182	mov	DWORD [20+edi],ebx
183	sbb	edx,esi
184	mov	DWORD [24+edi],ecx
185	mov	DWORD [28+edi],edx
186	ret
187align	16
188__ecp_nistz256_sub:
189	mov	eax,DWORD [esi]
190	mov	ebx,DWORD [4+esi]
191	mov	ecx,DWORD [8+esi]
192	sub	eax,DWORD [ebp]
193	mov	edx,DWORD [12+esi]
194	sbb	ebx,DWORD [4+ebp]
195	mov	DWORD [edi],eax
196	sbb	ecx,DWORD [8+ebp]
197	mov	DWORD [4+edi],ebx
198	sbb	edx,DWORD [12+ebp]
199	mov	DWORD [8+edi],ecx
200	mov	DWORD [12+edi],edx
201	mov	eax,DWORD [16+esi]
202	mov	ebx,DWORD [20+esi]
203	mov	ecx,DWORD [24+esi]
204	sbb	eax,DWORD [16+ebp]
205	mov	edx,DWORD [28+esi]
206	sbb	ebx,DWORD [20+ebp]
207	sbb	ecx,DWORD [24+ebp]
208	mov	DWORD [16+edi],eax
209	sbb	edx,DWORD [28+ebp]
210	mov	DWORD [20+edi],ebx
211	sbb	esi,esi
212	mov	DWORD [24+edi],ecx
213	mov	DWORD [28+edi],edx
214	mov	eax,DWORD [edi]
215	mov	ebp,esi
216	mov	ebx,DWORD [4+edi]
217	shr	ebp,31
218	mov	ecx,DWORD [8+edi]
219	add	eax,esi
220	mov	edx,DWORD [12+edi]
221	adc	ebx,esi
222	mov	DWORD [edi],eax
223	adc	ecx,esi
224	mov	DWORD [4+edi],ebx
225	adc	edx,0
226	mov	DWORD [8+edi],ecx
227	mov	DWORD [12+edi],edx
228	mov	eax,DWORD [16+edi]
229	mov	ebx,DWORD [20+edi]
230	mov	ecx,DWORD [24+edi]
231	adc	eax,0
232	mov	edx,DWORD [28+edi]
233	adc	ebx,0
234	mov	DWORD [16+edi],eax
235	adc	ecx,ebp
236	mov	DWORD [20+edi],ebx
237	adc	edx,esi
238	mov	DWORD [24+edi],ecx
239	mov	DWORD [28+edi],edx
240	ret
241global	_GFp_nistz256_neg
242align	16
243_GFp_nistz256_neg:
244L$_GFp_nistz256_neg_begin:
245	push	ebp
246	push	ebx
247	push	esi
248	push	edi
249	mov	ebp,DWORD [24+esp]
250	mov	edi,DWORD [20+esp]
251	xor	eax,eax
252	sub	esp,32
253	mov	DWORD [esp],eax
254	mov	esi,esp
255	mov	DWORD [4+esp],eax
256	mov	DWORD [8+esp],eax
257	mov	DWORD [12+esp],eax
258	mov	DWORD [16+esp],eax
259	mov	DWORD [20+esp],eax
260	mov	DWORD [24+esp],eax
261	mov	DWORD [28+esp],eax
262	call	__ecp_nistz256_sub
263	add	esp,32
264	pop	edi
265	pop	esi
266	pop	ebx
267	pop	ebp
268	ret
269align	16
270__picup_eax:
271	mov	eax,DWORD [esp]
272	ret
273global	_GFp_nistz256_mul_mont
274align	16
275_GFp_nistz256_mul_mont:
276L$_GFp_nistz256_mul_mont_begin:
277	push	ebp
278	push	ebx
279	push	esi
280	push	edi
281	mov	esi,DWORD [24+esp]
282	mov	ebp,DWORD [28+esp]
283	call	__picup_eax
284L$000pic:
285	lea	eax,[_GFp_ia32cap_P]
286	mov	eax,DWORD [eax]
287	mov	edi,DWORD [20+esp]
288	call	__ecp_nistz256_mul_mont
289	pop	edi
290	pop	esi
291	pop	ebx
292	pop	ebp
293	ret
294align	16
295__ecp_nistz256_mul_mont:
296	mov	edx,esp
297	sub	esp,256
298	movd	xmm7,DWORD [ebp]
299	lea	ebp,[4+ebp]
300	pcmpeqd	xmm6,xmm6
301	psrlq	xmm6,48
302	pshuflw	xmm7,xmm7,220
303	and	esp,-64
304	pshufd	xmm7,xmm7,220
305	lea	ebx,[128+esp]
306	movd	xmm0,DWORD [esi]
307	pshufd	xmm0,xmm0,204
308	movd	xmm1,DWORD [4+esi]
309	movdqa	[ebx],xmm0
310	pmuludq	xmm0,xmm7
311	movd	xmm2,DWORD [8+esi]
312	pshufd	xmm1,xmm1,204
313	movdqa	[16+ebx],xmm1
314	pmuludq	xmm1,xmm7
315	movq	xmm4,xmm0
316	pslldq	xmm4,6
317	paddq	xmm4,xmm0
318	movdqa	xmm5,xmm4
319	psrldq	xmm4,10
320	pand	xmm5,xmm6
321	movd	xmm3,DWORD [12+esi]
322	pshufd	xmm2,xmm2,204
323	movdqa	[32+ebx],xmm2
324	pmuludq	xmm2,xmm7
325	paddq	xmm1,xmm4
326	movdqa	[esp],xmm1
327	movd	xmm0,DWORD [16+esi]
328	pshufd	xmm3,xmm3,204
329	movdqa	[48+ebx],xmm3
330	pmuludq	xmm3,xmm7
331	movdqa	[16+esp],xmm2
332	movd	xmm1,DWORD [20+esi]
333	pshufd	xmm0,xmm0,204
334	movdqa	[64+ebx],xmm0
335	pmuludq	xmm0,xmm7
336	paddq	xmm3,xmm5
337	movdqa	[32+esp],xmm3
338	movd	xmm2,DWORD [24+esi]
339	pshufd	xmm1,xmm1,204
340	movdqa	[80+ebx],xmm1
341	pmuludq	xmm1,xmm7
342	movdqa	[48+esp],xmm0
343	pshufd	xmm4,xmm5,177
344	movd	xmm3,DWORD [28+esi]
345	pshufd	xmm2,xmm2,204
346	movdqa	[96+ebx],xmm2
347	pmuludq	xmm2,xmm7
348	movdqa	[64+esp],xmm1
349	psubq	xmm4,xmm5
350	movd	xmm0,DWORD [ebp]
351	pshufd	xmm3,xmm3,204
352	movdqa	[112+ebx],xmm3
353	pmuludq	xmm3,xmm7
354	pshuflw	xmm7,xmm0,220
355	movdqa	xmm0,[ebx]
356	pshufd	xmm7,xmm7,220
357	mov	ecx,6
358	lea	ebp,[4+ebp]
359	jmp	NEAR L$001madd_sse2
360align	16
361L$001madd_sse2:
362	paddq	xmm2,xmm5
363	paddq	xmm3,xmm4
364	movdqa	xmm1,[16+ebx]
365	pmuludq	xmm0,xmm7
366	movdqa	[80+esp],xmm2
367	movdqa	xmm2,[32+ebx]
368	pmuludq	xmm1,xmm7
369	movdqa	[96+esp],xmm3
370	paddq	xmm0,[esp]
371	movdqa	xmm3,[48+ebx]
372	pmuludq	xmm2,xmm7
373	movq	xmm4,xmm0
374	pslldq	xmm4,6
375	paddq	xmm1,[16+esp]
376	paddq	xmm4,xmm0
377	movdqa	xmm5,xmm4
378	psrldq	xmm4,10
379	movdqa	xmm0,[64+ebx]
380	pmuludq	xmm3,xmm7
381	paddq	xmm1,xmm4
382	paddq	xmm2,[32+esp]
383	movdqa	[esp],xmm1
384	movdqa	xmm1,[80+ebx]
385	pmuludq	xmm0,xmm7
386	paddq	xmm3,[48+esp]
387	movdqa	[16+esp],xmm2
388	pand	xmm5,xmm6
389	movdqa	xmm2,[96+ebx]
390	pmuludq	xmm1,xmm7
391	paddq	xmm3,xmm5
392	paddq	xmm0,[64+esp]
393	movdqa	[32+esp],xmm3
394	pshufd	xmm4,xmm5,177
395	movdqa	xmm3,xmm7
396	pmuludq	xmm2,xmm7
397	movd	xmm7,DWORD [ebp]
398	lea	ebp,[4+ebp]
399	paddq	xmm1,[80+esp]
400	psubq	xmm4,xmm5
401	movdqa	[48+esp],xmm0
402	pshuflw	xmm7,xmm7,220
403	pmuludq	xmm3,[112+ebx]
404	pshufd	xmm7,xmm7,220
405	movdqa	xmm0,[ebx]
406	movdqa	[64+esp],xmm1
407	paddq	xmm2,[96+esp]
408	dec	ecx
409	jnz	NEAR L$001madd_sse2
410	paddq	xmm2,xmm5
411	paddq	xmm3,xmm4
412	movdqa	xmm1,[16+ebx]
413	pmuludq	xmm0,xmm7
414	movdqa	[80+esp],xmm2
415	movdqa	xmm2,[32+ebx]
416	pmuludq	xmm1,xmm7
417	movdqa	[96+esp],xmm3
418	paddq	xmm0,[esp]
419	movdqa	xmm3,[48+ebx]
420	pmuludq	xmm2,xmm7
421	movq	xmm4,xmm0
422	pslldq	xmm4,6
423	paddq	xmm1,[16+esp]
424	paddq	xmm4,xmm0
425	movdqa	xmm5,xmm4
426	psrldq	xmm4,10
427	movdqa	xmm0,[64+ebx]
428	pmuludq	xmm3,xmm7
429	paddq	xmm1,xmm4
430	paddq	xmm2,[32+esp]
431	movdqa	[esp],xmm1
432	movdqa	xmm1,[80+ebx]
433	pmuludq	xmm0,xmm7
434	paddq	xmm3,[48+esp]
435	movdqa	[16+esp],xmm2
436	pand	xmm5,xmm6
437	movdqa	xmm2,[96+ebx]
438	pmuludq	xmm1,xmm7
439	paddq	xmm3,xmm5
440	paddq	xmm0,[64+esp]
441	movdqa	[32+esp],xmm3
442	pshufd	xmm4,xmm5,177
443	movdqa	xmm3,[112+ebx]
444	pmuludq	xmm2,xmm7
445	paddq	xmm1,[80+esp]
446	psubq	xmm4,xmm5
447	movdqa	[48+esp],xmm0
448	pmuludq	xmm3,xmm7
449	pcmpeqd	xmm7,xmm7
450	movdqa	xmm0,[esp]
451	pslldq	xmm7,8
452	movdqa	[64+esp],xmm1
453	paddq	xmm2,[96+esp]
454	paddq	xmm2,xmm5
455	paddq	xmm3,xmm4
456	movdqa	[80+esp],xmm2
457	movdqa	[96+esp],xmm3
458	movdqa	xmm1,[16+esp]
459	movdqa	xmm2,[32+esp]
460	movdqa	xmm3,[48+esp]
461	movq	xmm4,xmm0
462	pand	xmm0,xmm7
463	xor	ebp,ebp
464	pslldq	xmm4,6
465	movq	xmm5,xmm1
466	paddq	xmm0,xmm4
467	pand	xmm1,xmm7
468	psrldq	xmm0,6
469	movd	eax,xmm0
470	psrldq	xmm0,4
471	paddq	xmm5,xmm0
472	movdqa	xmm0,[64+esp]
473	sub	eax,-1
474	pslldq	xmm5,6
475	movq	xmm4,xmm2
476	paddq	xmm1,xmm5
477	pand	xmm2,xmm7
478	psrldq	xmm1,6
479	mov	DWORD [edi],eax
480	movd	eax,xmm1
481	psrldq	xmm1,4
482	paddq	xmm4,xmm1
483	movdqa	xmm1,[80+esp]
484	sbb	eax,-1
485	pslldq	xmm4,6
486	movq	xmm5,xmm3
487	paddq	xmm2,xmm4
488	pand	xmm3,xmm7
489	psrldq	xmm2,6
490	mov	DWORD [4+edi],eax
491	movd	eax,xmm2
492	psrldq	xmm2,4
493	paddq	xmm5,xmm2
494	movdqa	xmm2,[96+esp]
495	sbb	eax,-1
496	pslldq	xmm5,6
497	movq	xmm4,xmm0
498	paddq	xmm3,xmm5
499	pand	xmm0,xmm7
500	psrldq	xmm3,6
501	mov	DWORD [8+edi],eax
502	movd	eax,xmm3
503	psrldq	xmm3,4
504	paddq	xmm4,xmm3
505	sbb	eax,0
506	pslldq	xmm4,6
507	movq	xmm5,xmm1
508	paddq	xmm0,xmm4
509	pand	xmm1,xmm7
510	psrldq	xmm0,6
511	mov	DWORD [12+edi],eax
512	movd	eax,xmm0
513	psrldq	xmm0,4
514	paddq	xmm5,xmm0
515	sbb	eax,0
516	pslldq	xmm5,6
517	movq	xmm4,xmm2
518	paddq	xmm1,xmm5
519	pand	xmm2,xmm7
520	psrldq	xmm1,6
521	movd	ebx,xmm1
522	psrldq	xmm1,4
523	mov	esp,edx
524	paddq	xmm4,xmm1
525	pslldq	xmm4,6
526	paddq	xmm2,xmm4
527	psrldq	xmm2,6
528	movd	ecx,xmm2
529	psrldq	xmm2,4
530	sbb	ebx,0
531	movd	edx,xmm2
532	pextrw	esi,xmm2,2
533	sbb	ecx,1
534	sbb	edx,-1
535	sbb	esi,0
536	sub	ebp,esi
537	add	DWORD [edi],esi
538	adc	DWORD [4+edi],esi
539	adc	DWORD [8+edi],esi
540	adc	DWORD [12+edi],0
541	adc	eax,0
542	adc	ebx,0
543	mov	DWORD [16+edi],eax
544	adc	ecx,ebp
545	mov	DWORD [20+edi],ebx
546	adc	edx,esi
547	mov	DWORD [24+edi],ecx
548	mov	DWORD [28+edi],edx
549	ret
550global	_GFp_nistz256_point_double
551align	16
552_GFp_nistz256_point_double:
553L$_GFp_nistz256_point_double_begin:
554	push	ebp
555	push	ebx
556	push	esi
557	push	edi
558	mov	esi,DWORD [24+esp]
559	sub	esp,164
560	call	__picup_eax
561L$002pic:
562	lea	edx,[_GFp_ia32cap_P]
563	mov	ebp,DWORD [edx]
564L$point_double_shortcut:
565	mov	eax,DWORD [esi]
566	mov	ebx,DWORD [4+esi]
567	mov	ecx,DWORD [8+esi]
568	mov	edx,DWORD [12+esi]
569	mov	DWORD [96+esp],eax
570	mov	DWORD [100+esp],ebx
571	mov	DWORD [104+esp],ecx
572	mov	DWORD [108+esp],edx
573	mov	eax,DWORD [16+esi]
574	mov	ebx,DWORD [20+esi]
575	mov	ecx,DWORD [24+esi]
576	mov	edx,DWORD [28+esi]
577	mov	DWORD [112+esp],eax
578	mov	DWORD [116+esp],ebx
579	mov	DWORD [120+esp],ecx
580	mov	DWORD [124+esp],edx
581	mov	DWORD [160+esp],ebp
582	lea	ebp,[32+esi]
583	lea	esi,[32+esi]
584	lea	edi,[esp]
585	call	__ecp_nistz256_add
586	mov	eax,DWORD [160+esp]
587	mov	esi,64
588	add	esi,DWORD [188+esp]
589	lea	edi,[64+esp]
590	mov	ebp,esi
591	call	__ecp_nistz256_mul_mont
592	mov	eax,DWORD [160+esp]
593	lea	esi,[esp]
594	lea	ebp,[esp]
595	lea	edi,[esp]
596	call	__ecp_nistz256_mul_mont
597	mov	eax,DWORD [160+esp]
598	mov	ebp,DWORD [188+esp]
599	lea	esi,[32+ebp]
600	lea	ebp,[64+ebp]
601	lea	edi,[128+esp]
602	call	__ecp_nistz256_mul_mont
603	lea	esi,[96+esp]
604	lea	ebp,[64+esp]
605	lea	edi,[32+esp]
606	call	__ecp_nistz256_add
607	mov	edi,64
608	lea	esi,[128+esp]
609	lea	ebp,[128+esp]
610	add	edi,DWORD [184+esp]
611	call	__ecp_nistz256_add
612	lea	esi,[96+esp]
613	lea	ebp,[64+esp]
614	lea	edi,[64+esp]
615	call	__ecp_nistz256_sub
616	mov	eax,DWORD [160+esp]
617	lea	esi,[esp]
618	lea	ebp,[esp]
619	lea	edi,[128+esp]
620	call	__ecp_nistz256_mul_mont
621	mov	eax,DWORD [160+esp]
622	lea	esi,[32+esp]
623	lea	ebp,[64+esp]
624	lea	edi,[32+esp]
625	call	__ecp_nistz256_mul_mont
626	mov	edi,32
627	lea	esi,[128+esp]
628	add	edi,DWORD [184+esp]
629	call	__ecp_nistz256_div_by_2
630	lea	esi,[32+esp]
631	lea	ebp,[32+esp]
632	lea	edi,[128+esp]
633	call	__ecp_nistz256_add
634	mov	eax,DWORD [160+esp]
635	lea	esi,[96+esp]
636	lea	ebp,[esp]
637	lea	edi,[esp]
638	call	__ecp_nistz256_mul_mont
639	lea	esi,[128+esp]
640	lea	ebp,[32+esp]
641	lea	edi,[32+esp]
642	call	__ecp_nistz256_add
643	lea	esi,[esp]
644	lea	ebp,[esp]
645	lea	edi,[128+esp]
646	call	__ecp_nistz256_add
647	mov	eax,DWORD [160+esp]
648	lea	esi,[32+esp]
649	lea	ebp,[32+esp]
650	mov	edi,DWORD [184+esp]
651	call	__ecp_nistz256_mul_mont
652	mov	esi,edi
653	lea	ebp,[128+esp]
654	call	__ecp_nistz256_sub
655	lea	esi,[esp]
656	mov	ebp,edi
657	lea	edi,[esp]
658	call	__ecp_nistz256_sub
659	mov	eax,DWORD [160+esp]
660	mov	esi,edi
661	lea	ebp,[32+esp]
662	call	__ecp_nistz256_mul_mont
663	mov	ebp,32
664	lea	esi,[esp]
665	add	ebp,DWORD [184+esp]
666	mov	edi,ebp
667	call	__ecp_nistz256_sub
668	add	esp,164
669	pop	edi
670	pop	esi
671	pop	ebx
672	pop	ebp
673	ret
674global	_GFp_nistz256_point_add_affine
675align	16
676_GFp_nistz256_point_add_affine:
677L$_GFp_nistz256_point_add_affine_begin:
678	push	ebp
679	push	ebx
680	push	esi
681	push	edi
682	mov	esi,DWORD [24+esp]
683	sub	esp,492
684	call	__picup_eax
685L$003pic:
686	lea	edx,[_GFp_ia32cap_P]
687	mov	ebp,DWORD [edx]
688	lea	edi,[96+esp]
689	mov	eax,DWORD [esi]
690	mov	ebx,DWORD [4+esi]
691	mov	ecx,DWORD [8+esi]
692	mov	edx,DWORD [12+esi]
693	mov	DWORD [edi],eax
694	mov	DWORD [488+esp],ebp
695	mov	DWORD [4+edi],ebx
696	mov	DWORD [8+edi],ecx
697	mov	DWORD [12+edi],edx
698	mov	eax,DWORD [16+esi]
699	mov	ebx,DWORD [20+esi]
700	mov	ecx,DWORD [24+esi]
701	mov	edx,DWORD [28+esi]
702	mov	DWORD [16+edi],eax
703	mov	DWORD [20+edi],ebx
704	mov	DWORD [24+edi],ecx
705	mov	DWORD [28+edi],edx
706	mov	eax,DWORD [32+esi]
707	mov	ebx,DWORD [36+esi]
708	mov	ecx,DWORD [40+esi]
709	mov	edx,DWORD [44+esi]
710	mov	DWORD [32+edi],eax
711	mov	DWORD [36+edi],ebx
712	mov	DWORD [40+edi],ecx
713	mov	DWORD [44+edi],edx
714	mov	eax,DWORD [48+esi]
715	mov	ebx,DWORD [52+esi]
716	mov	ecx,DWORD [56+esi]
717	mov	edx,DWORD [60+esi]
718	mov	DWORD [48+edi],eax
719	mov	DWORD [52+edi],ebx
720	mov	DWORD [56+edi],ecx
721	mov	DWORD [60+edi],edx
722	mov	eax,DWORD [64+esi]
723	mov	ebx,DWORD [68+esi]
724	mov	ecx,DWORD [72+esi]
725	mov	edx,DWORD [76+esi]
726	mov	DWORD [64+edi],eax
727	mov	ebp,eax
728	mov	DWORD [68+edi],ebx
729	or	ebp,ebx
730	mov	DWORD [72+edi],ecx
731	or	ebp,ecx
732	mov	DWORD [76+edi],edx
733	or	ebp,edx
734	mov	eax,DWORD [80+esi]
735	mov	ebx,DWORD [84+esi]
736	mov	ecx,DWORD [88+esi]
737	mov	edx,DWORD [92+esi]
738	mov	DWORD [80+edi],eax
739	or	ebp,eax
740	mov	DWORD [84+edi],ebx
741	or	ebp,ebx
742	mov	DWORD [88+edi],ecx
743	or	ebp,ecx
744	mov	DWORD [92+edi],edx
745	or	ebp,edx
746	xor	eax,eax
747	mov	esi,DWORD [520+esp]
748	sub	eax,ebp
749	or	ebp,eax
750	sar	ebp,31
751	mov	DWORD [480+esp],ebp
752	lea	edi,[192+esp]
753	mov	eax,DWORD [esi]
754	mov	ebx,DWORD [4+esi]
755	mov	ecx,DWORD [8+esi]
756	mov	edx,DWORD [12+esi]
757	mov	DWORD [edi],eax
758	mov	ebp,eax
759	mov	DWORD [4+edi],ebx
760	or	ebp,ebx
761	mov	DWORD [8+edi],ecx
762	or	ebp,ecx
763	mov	DWORD [12+edi],edx
764	or	ebp,edx
765	mov	eax,DWORD [16+esi]
766	mov	ebx,DWORD [20+esi]
767	mov	ecx,DWORD [24+esi]
768	mov	edx,DWORD [28+esi]
769	mov	DWORD [16+edi],eax
770	or	ebp,eax
771	mov	DWORD [20+edi],ebx
772	or	ebp,ebx
773	mov	DWORD [24+edi],ecx
774	or	ebp,ecx
775	mov	DWORD [28+edi],edx
776	or	ebp,edx
777	mov	eax,DWORD [32+esi]
778	mov	ebx,DWORD [36+esi]
779	mov	ecx,DWORD [40+esi]
780	mov	edx,DWORD [44+esi]
781	mov	DWORD [32+edi],eax
782	or	ebp,eax
783	mov	DWORD [36+edi],ebx
784	or	ebp,ebx
785	mov	DWORD [40+edi],ecx
786	or	ebp,ecx
787	mov	DWORD [44+edi],edx
788	or	ebp,edx
789	mov	eax,DWORD [48+esi]
790	mov	ebx,DWORD [52+esi]
791	mov	ecx,DWORD [56+esi]
792	mov	edx,DWORD [60+esi]
793	mov	DWORD [48+edi],eax
794	or	ebp,eax
795	mov	DWORD [52+edi],ebx
796	or	ebp,ebx
797	mov	DWORD [56+edi],ecx
798	or	ebp,ecx
799	mov	DWORD [60+edi],edx
800	or	ebp,edx
801	xor	ebx,ebx
802	mov	eax,DWORD [488+esp]
803	sub	ebx,ebp
804	lea	esi,[160+esp]
805	or	ebx,ebp
806	lea	ebp,[160+esp]
807	sar	ebx,31
808	lea	edi,[288+esp]
809	mov	DWORD [484+esp],ebx
810	call	__ecp_nistz256_mul_mont
811	mov	eax,DWORD [488+esp]
812	lea	esi,[192+esp]
813	mov	ebp,edi
814	lea	edi,[256+esp]
815	call	__ecp_nistz256_mul_mont
816	mov	eax,DWORD [488+esp]
817	lea	esi,[160+esp]
818	lea	ebp,[288+esp]
819	lea	edi,[288+esp]
820	call	__ecp_nistz256_mul_mont
821	lea	esi,[256+esp]
822	lea	ebp,[96+esp]
823	lea	edi,[320+esp]
824	call	__ecp_nistz256_sub
825	mov	eax,DWORD [488+esp]
826	lea	esi,[224+esp]
827	lea	ebp,[288+esp]
828	lea	edi,[288+esp]
829	call	__ecp_nistz256_mul_mont
830	mov	eax,DWORD [488+esp]
831	lea	esi,[160+esp]
832	lea	ebp,[320+esp]
833	lea	edi,[64+esp]
834	call	__ecp_nistz256_mul_mont
835	lea	esi,[288+esp]
836	lea	ebp,[128+esp]
837	lea	edi,[352+esp]
838	call	__ecp_nistz256_sub
839	mov	eax,DWORD [488+esp]
840	lea	esi,[320+esp]
841	lea	ebp,[320+esp]
842	lea	edi,[384+esp]
843	call	__ecp_nistz256_mul_mont
844	mov	eax,DWORD [488+esp]
845	lea	esi,[352+esp]
846	lea	ebp,[352+esp]
847	lea	edi,[448+esp]
848	call	__ecp_nistz256_mul_mont
849	mov	eax,DWORD [488+esp]
850	lea	esi,[96+esp]
851	lea	ebp,[384+esp]
852	lea	edi,[256+esp]
853	call	__ecp_nistz256_mul_mont
854	mov	eax,DWORD [488+esp]
855	lea	esi,[320+esp]
856	lea	ebp,[384+esp]
857	lea	edi,[416+esp]
858	call	__ecp_nistz256_mul_mont
859	lea	esi,[256+esp]
860	lea	ebp,[256+esp]
861	lea	edi,[384+esp]
862	call	__ecp_nistz256_add
863	lea	esi,[448+esp]
864	lea	ebp,[384+esp]
865	lea	edi,[esp]
866	call	__ecp_nistz256_sub
867	lea	esi,[esp]
868	lea	ebp,[416+esp]
869	lea	edi,[esp]
870	call	__ecp_nistz256_sub
871	lea	esi,[256+esp]
872	lea	ebp,[esp]
873	lea	edi,[32+esp]
874	call	__ecp_nistz256_sub
875	mov	eax,DWORD [488+esp]
876	lea	esi,[416+esp]
877	lea	ebp,[128+esp]
878	lea	edi,[288+esp]
879	call	__ecp_nistz256_mul_mont
880	mov	eax,DWORD [488+esp]
881	lea	esi,[352+esp]
882	lea	ebp,[32+esp]
883	lea	edi,[32+esp]
884	call	__ecp_nistz256_mul_mont
885	lea	esi,[32+esp]
886	lea	ebp,[288+esp]
887	lea	edi,[32+esp]
888	call	__ecp_nistz256_sub
889	mov	ebp,DWORD [480+esp]
890	mov	esi,DWORD [484+esp]
891	mov	edi,DWORD [512+esp]
892	mov	edx,ebp
893	not	ebp
894	and	edx,esi
895	and	ebp,esi
896	not	esi
897	mov	eax,edx
898	and	eax,DWORD [64+esp]
899	mov	ebx,ebp
900	and	ebx,1
901	mov	ecx,esi
902	and	ecx,DWORD [160+esp]
903	or	eax,ebx
904	or	eax,ecx
905	mov	DWORD [64+edi],eax
906	mov	eax,edx
907	and	eax,DWORD [68+esp]
908	mov	ecx,esi
909	and	ecx,DWORD [164+esp]
910	or	eax,ecx
911	mov	DWORD [68+edi],eax
912	mov	eax,edx
913	and	eax,DWORD [72+esp]
914	mov	ecx,esi
915	and	ecx,DWORD [168+esp]
916	or	eax,ecx
917	mov	DWORD [72+edi],eax
918	mov	eax,edx
919	and	eax,DWORD [76+esp]
920	mov	ecx,esi
921	and	ecx,DWORD [172+esp]
922	or	eax,ebp
923	or	eax,ecx
924	mov	DWORD [76+edi],eax
925	mov	eax,edx
926	and	eax,DWORD [80+esp]
927	mov	ecx,esi
928	and	ecx,DWORD [176+esp]
929	or	eax,ebp
930	or	eax,ecx
931	mov	DWORD [80+edi],eax
932	mov	eax,edx
933	and	eax,DWORD [84+esp]
934	mov	ecx,esi
935	and	ecx,DWORD [180+esp]
936	or	eax,ebp
937	or	eax,ecx
938	mov	DWORD [84+edi],eax
939	mov	eax,edx
940	and	eax,DWORD [88+esp]
941	mov	ebx,ebp
942	and	ebx,-2
943	mov	ecx,esi
944	and	ecx,DWORD [184+esp]
945	or	eax,ebx
946	or	eax,ecx
947	mov	DWORD [88+edi],eax
948	mov	eax,edx
949	and	eax,DWORD [92+esp]
950	mov	ecx,esi
951	and	ecx,DWORD [188+esp]
952	or	eax,ecx
953	mov	DWORD [92+edi],eax
954	mov	eax,edx
955	and	eax,DWORD [esp]
956	mov	ebx,ebp
957	and	ebx,DWORD [192+esp]
958	mov	ecx,esi
959	and	ecx,DWORD [96+esp]
960	or	eax,ebx
961	or	eax,ecx
962	mov	DWORD [edi],eax
963	mov	eax,edx
964	and	eax,DWORD [4+esp]
965	mov	ebx,ebp
966	and	ebx,DWORD [196+esp]
967	mov	ecx,esi
968	and	ecx,DWORD [100+esp]
969	or	eax,ebx
970	or	eax,ecx
971	mov	DWORD [4+edi],eax
972	mov	eax,edx
973	and	eax,DWORD [8+esp]
974	mov	ebx,ebp
975	and	ebx,DWORD [200+esp]
976	mov	ecx,esi
977	and	ecx,DWORD [104+esp]
978	or	eax,ebx
979	or	eax,ecx
980	mov	DWORD [8+edi],eax
981	mov	eax,edx
982	and	eax,DWORD [12+esp]
983	mov	ebx,ebp
984	and	ebx,DWORD [204+esp]
985	mov	ecx,esi
986	and	ecx,DWORD [108+esp]
987	or	eax,ebx
988	or	eax,ecx
989	mov	DWORD [12+edi],eax
990	mov	eax,edx
991	and	eax,DWORD [16+esp]
992	mov	ebx,ebp
993	and	ebx,DWORD [208+esp]
994	mov	ecx,esi
995	and	ecx,DWORD [112+esp]
996	or	eax,ebx
997	or	eax,ecx
998	mov	DWORD [16+edi],eax
999	mov	eax,edx
1000	and	eax,DWORD [20+esp]
1001	mov	ebx,ebp
1002	and	ebx,DWORD [212+esp]
1003	mov	ecx,esi
1004	and	ecx,DWORD [116+esp]
1005	or	eax,ebx
1006	or	eax,ecx
1007	mov	DWORD [20+edi],eax
1008	mov	eax,edx
1009	and	eax,DWORD [24+esp]
1010	mov	ebx,ebp
1011	and	ebx,DWORD [216+esp]
1012	mov	ecx,esi
1013	and	ecx,DWORD [120+esp]
1014	or	eax,ebx
1015	or	eax,ecx
1016	mov	DWORD [24+edi],eax
1017	mov	eax,edx
1018	and	eax,DWORD [28+esp]
1019	mov	ebx,ebp
1020	and	ebx,DWORD [220+esp]
1021	mov	ecx,esi
1022	and	ecx,DWORD [124+esp]
1023	or	eax,ebx
1024	or	eax,ecx
1025	mov	DWORD [28+edi],eax
1026	mov	eax,edx
1027	and	eax,DWORD [32+esp]
1028	mov	ebx,ebp
1029	and	ebx,DWORD [224+esp]
1030	mov	ecx,esi
1031	and	ecx,DWORD [128+esp]
1032	or	eax,ebx
1033	or	eax,ecx
1034	mov	DWORD [32+edi],eax
1035	mov	eax,edx
1036	and	eax,DWORD [36+esp]
1037	mov	ebx,ebp
1038	and	ebx,DWORD [228+esp]
1039	mov	ecx,esi
1040	and	ecx,DWORD [132+esp]
1041	or	eax,ebx
1042	or	eax,ecx
1043	mov	DWORD [36+edi],eax
1044	mov	eax,edx
1045	and	eax,DWORD [40+esp]
1046	mov	ebx,ebp
1047	and	ebx,DWORD [232+esp]
1048	mov	ecx,esi
1049	and	ecx,DWORD [136+esp]
1050	or	eax,ebx
1051	or	eax,ecx
1052	mov	DWORD [40+edi],eax
1053	mov	eax,edx
1054	and	eax,DWORD [44+esp]
1055	mov	ebx,ebp
1056	and	ebx,DWORD [236+esp]
1057	mov	ecx,esi
1058	and	ecx,DWORD [140+esp]
1059	or	eax,ebx
1060	or	eax,ecx
1061	mov	DWORD [44+edi],eax
1062	mov	eax,edx
1063	and	eax,DWORD [48+esp]
1064	mov	ebx,ebp
1065	and	ebx,DWORD [240+esp]
1066	mov	ecx,esi
1067	and	ecx,DWORD [144+esp]
1068	or	eax,ebx
1069	or	eax,ecx
1070	mov	DWORD [48+edi],eax
1071	mov	eax,edx
1072	and	eax,DWORD [52+esp]
1073	mov	ebx,ebp
1074	and	ebx,DWORD [244+esp]
1075	mov	ecx,esi
1076	and	ecx,DWORD [148+esp]
1077	or	eax,ebx
1078	or	eax,ecx
1079	mov	DWORD [52+edi],eax
1080	mov	eax,edx
1081	and	eax,DWORD [56+esp]
1082	mov	ebx,ebp
1083	and	ebx,DWORD [248+esp]
1084	mov	ecx,esi
1085	and	ecx,DWORD [152+esp]
1086	or	eax,ebx
1087	or	eax,ecx
1088	mov	DWORD [56+edi],eax
1089	mov	eax,edx
1090	and	eax,DWORD [60+esp]
1091	mov	ebx,ebp
1092	and	ebx,DWORD [252+esp]
1093	mov	ecx,esi
1094	and	ecx,DWORD [156+esp]
1095	or	eax,ebx
1096	or	eax,ecx
1097	mov	DWORD [60+edi],eax
1098	add	esp,492
1099	pop	edi
1100	pop	esi
1101	pop	ebx
1102	pop	ebp
1103	ret
1104segment	.bss
1105common	_GFp_ia32cap_P 16
1106