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