• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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	_OPENSSL_ia32cap_P
16global	_bn_mul_add_words
17align	16
18_bn_mul_add_words:
19L$_bn_mul_add_words_begin:
20	lea	eax,[_OPENSSL_ia32cap_P]
21	bt	DWORD [eax],26
22	jnc	NEAR L$000maw_non_sse2
23	mov	eax,DWORD [4+esp]
24	mov	edx,DWORD [8+esp]
25	mov	ecx,DWORD [12+esp]
26	movd	mm0,DWORD [16+esp]
27	pxor	mm1,mm1
28	jmp	NEAR L$001maw_sse2_entry
29align	16
30L$002maw_sse2_unrolled:
31	movd	mm3,DWORD [eax]
32	paddq	mm1,mm3
33	movd	mm2,DWORD [edx]
34	pmuludq	mm2,mm0
35	movd	mm4,DWORD [4+edx]
36	pmuludq	mm4,mm0
37	movd	mm6,DWORD [8+edx]
38	pmuludq	mm6,mm0
39	movd	mm7,DWORD [12+edx]
40	pmuludq	mm7,mm0
41	paddq	mm1,mm2
42	movd	mm3,DWORD [4+eax]
43	paddq	mm3,mm4
44	movd	mm5,DWORD [8+eax]
45	paddq	mm5,mm6
46	movd	mm4,DWORD [12+eax]
47	paddq	mm7,mm4
48	movd	DWORD [eax],mm1
49	movd	mm2,DWORD [16+edx]
50	pmuludq	mm2,mm0
51	psrlq	mm1,32
52	movd	mm4,DWORD [20+edx]
53	pmuludq	mm4,mm0
54	paddq	mm1,mm3
55	movd	mm6,DWORD [24+edx]
56	pmuludq	mm6,mm0
57	movd	DWORD [4+eax],mm1
58	psrlq	mm1,32
59	movd	mm3,DWORD [28+edx]
60	add	edx,32
61	pmuludq	mm3,mm0
62	paddq	mm1,mm5
63	movd	mm5,DWORD [16+eax]
64	paddq	mm2,mm5
65	movd	DWORD [8+eax],mm1
66	psrlq	mm1,32
67	paddq	mm1,mm7
68	movd	mm5,DWORD [20+eax]
69	paddq	mm4,mm5
70	movd	DWORD [12+eax],mm1
71	psrlq	mm1,32
72	paddq	mm1,mm2
73	movd	mm5,DWORD [24+eax]
74	paddq	mm6,mm5
75	movd	DWORD [16+eax],mm1
76	psrlq	mm1,32
77	paddq	mm1,mm4
78	movd	mm5,DWORD [28+eax]
79	paddq	mm3,mm5
80	movd	DWORD [20+eax],mm1
81	psrlq	mm1,32
82	paddq	mm1,mm6
83	movd	DWORD [24+eax],mm1
84	psrlq	mm1,32
85	paddq	mm1,mm3
86	movd	DWORD [28+eax],mm1
87	lea	eax,[32+eax]
88	psrlq	mm1,32
89	sub	ecx,8
90	jz	NEAR L$003maw_sse2_exit
91L$001maw_sse2_entry:
92	test	ecx,4294967288
93	jnz	NEAR L$002maw_sse2_unrolled
94align	4
95L$004maw_sse2_loop:
96	movd	mm2,DWORD [edx]
97	movd	mm3,DWORD [eax]
98	pmuludq	mm2,mm0
99	lea	edx,[4+edx]
100	paddq	mm1,mm3
101	paddq	mm1,mm2
102	movd	DWORD [eax],mm1
103	sub	ecx,1
104	psrlq	mm1,32
105	lea	eax,[4+eax]
106	jnz	NEAR L$004maw_sse2_loop
107L$003maw_sse2_exit:
108	movd	eax,mm1
109	emms
110	ret
111align	16
112L$000maw_non_sse2:
113	push	ebp
114	push	ebx
115	push	esi
116	push	edi
117	;
118	xor	esi,esi
119	mov	edi,DWORD [20+esp]
120	mov	ecx,DWORD [28+esp]
121	mov	ebx,DWORD [24+esp]
122	and	ecx,4294967288
123	mov	ebp,DWORD [32+esp]
124	push	ecx
125	jz	NEAR L$005maw_finish
126align	16
127L$006maw_loop:
128	; Round 0
129	mov	eax,DWORD [ebx]
130	mul	ebp
131	add	eax,esi
132	adc	edx,0
133	add	eax,DWORD [edi]
134	adc	edx,0
135	mov	DWORD [edi],eax
136	mov	esi,edx
137	; Round 4
138	mov	eax,DWORD [4+ebx]
139	mul	ebp
140	add	eax,esi
141	adc	edx,0
142	add	eax,DWORD [4+edi]
143	adc	edx,0
144	mov	DWORD [4+edi],eax
145	mov	esi,edx
146	; Round 8
147	mov	eax,DWORD [8+ebx]
148	mul	ebp
149	add	eax,esi
150	adc	edx,0
151	add	eax,DWORD [8+edi]
152	adc	edx,0
153	mov	DWORD [8+edi],eax
154	mov	esi,edx
155	; Round 12
156	mov	eax,DWORD [12+ebx]
157	mul	ebp
158	add	eax,esi
159	adc	edx,0
160	add	eax,DWORD [12+edi]
161	adc	edx,0
162	mov	DWORD [12+edi],eax
163	mov	esi,edx
164	; Round 16
165	mov	eax,DWORD [16+ebx]
166	mul	ebp
167	add	eax,esi
168	adc	edx,0
169	add	eax,DWORD [16+edi]
170	adc	edx,0
171	mov	DWORD [16+edi],eax
172	mov	esi,edx
173	; Round 20
174	mov	eax,DWORD [20+ebx]
175	mul	ebp
176	add	eax,esi
177	adc	edx,0
178	add	eax,DWORD [20+edi]
179	adc	edx,0
180	mov	DWORD [20+edi],eax
181	mov	esi,edx
182	; Round 24
183	mov	eax,DWORD [24+ebx]
184	mul	ebp
185	add	eax,esi
186	adc	edx,0
187	add	eax,DWORD [24+edi]
188	adc	edx,0
189	mov	DWORD [24+edi],eax
190	mov	esi,edx
191	; Round 28
192	mov	eax,DWORD [28+ebx]
193	mul	ebp
194	add	eax,esi
195	adc	edx,0
196	add	eax,DWORD [28+edi]
197	adc	edx,0
198	mov	DWORD [28+edi],eax
199	mov	esi,edx
200	;
201	sub	ecx,8
202	lea	ebx,[32+ebx]
203	lea	edi,[32+edi]
204	jnz	NEAR L$006maw_loop
205L$005maw_finish:
206	mov	ecx,DWORD [32+esp]
207	and	ecx,7
208	jnz	NEAR L$007maw_finish2
209	jmp	NEAR L$008maw_end
210L$007maw_finish2:
211	; Tail Round 0
212	mov	eax,DWORD [ebx]
213	mul	ebp
214	add	eax,esi
215	adc	edx,0
216	add	eax,DWORD [edi]
217	adc	edx,0
218	dec	ecx
219	mov	DWORD [edi],eax
220	mov	esi,edx
221	jz	NEAR L$008maw_end
222	; Tail Round 1
223	mov	eax,DWORD [4+ebx]
224	mul	ebp
225	add	eax,esi
226	adc	edx,0
227	add	eax,DWORD [4+edi]
228	adc	edx,0
229	dec	ecx
230	mov	DWORD [4+edi],eax
231	mov	esi,edx
232	jz	NEAR L$008maw_end
233	; Tail Round 2
234	mov	eax,DWORD [8+ebx]
235	mul	ebp
236	add	eax,esi
237	adc	edx,0
238	add	eax,DWORD [8+edi]
239	adc	edx,0
240	dec	ecx
241	mov	DWORD [8+edi],eax
242	mov	esi,edx
243	jz	NEAR L$008maw_end
244	; Tail Round 3
245	mov	eax,DWORD [12+ebx]
246	mul	ebp
247	add	eax,esi
248	adc	edx,0
249	add	eax,DWORD [12+edi]
250	adc	edx,0
251	dec	ecx
252	mov	DWORD [12+edi],eax
253	mov	esi,edx
254	jz	NEAR L$008maw_end
255	; Tail Round 4
256	mov	eax,DWORD [16+ebx]
257	mul	ebp
258	add	eax,esi
259	adc	edx,0
260	add	eax,DWORD [16+edi]
261	adc	edx,0
262	dec	ecx
263	mov	DWORD [16+edi],eax
264	mov	esi,edx
265	jz	NEAR L$008maw_end
266	; Tail Round 5
267	mov	eax,DWORD [20+ebx]
268	mul	ebp
269	add	eax,esi
270	adc	edx,0
271	add	eax,DWORD [20+edi]
272	adc	edx,0
273	dec	ecx
274	mov	DWORD [20+edi],eax
275	mov	esi,edx
276	jz	NEAR L$008maw_end
277	; Tail Round 6
278	mov	eax,DWORD [24+ebx]
279	mul	ebp
280	add	eax,esi
281	adc	edx,0
282	add	eax,DWORD [24+edi]
283	adc	edx,0
284	mov	DWORD [24+edi],eax
285	mov	esi,edx
286L$008maw_end:
287	mov	eax,esi
288	pop	ecx
289	pop	edi
290	pop	esi
291	pop	ebx
292	pop	ebp
293	ret
294global	_bn_mul_words
295align	16
296_bn_mul_words:
297L$_bn_mul_words_begin:
298	lea	eax,[_OPENSSL_ia32cap_P]
299	bt	DWORD [eax],26
300	jnc	NEAR L$009mw_non_sse2
301	mov	eax,DWORD [4+esp]
302	mov	edx,DWORD [8+esp]
303	mov	ecx,DWORD [12+esp]
304	movd	mm0,DWORD [16+esp]
305	pxor	mm1,mm1
306align	16
307L$010mw_sse2_loop:
308	movd	mm2,DWORD [edx]
309	pmuludq	mm2,mm0
310	lea	edx,[4+edx]
311	paddq	mm1,mm2
312	movd	DWORD [eax],mm1
313	sub	ecx,1
314	psrlq	mm1,32
315	lea	eax,[4+eax]
316	jnz	NEAR L$010mw_sse2_loop
317	movd	eax,mm1
318	emms
319	ret
320align	16
321L$009mw_non_sse2:
322	push	ebp
323	push	ebx
324	push	esi
325	push	edi
326	;
327	xor	esi,esi
328	mov	edi,DWORD [20+esp]
329	mov	ebx,DWORD [24+esp]
330	mov	ebp,DWORD [28+esp]
331	mov	ecx,DWORD [32+esp]
332	and	ebp,4294967288
333	jz	NEAR L$011mw_finish
334L$012mw_loop:
335	; Round 0
336	mov	eax,DWORD [ebx]
337	mul	ecx
338	add	eax,esi
339	adc	edx,0
340	mov	DWORD [edi],eax
341	mov	esi,edx
342	; Round 4
343	mov	eax,DWORD [4+ebx]
344	mul	ecx
345	add	eax,esi
346	adc	edx,0
347	mov	DWORD [4+edi],eax
348	mov	esi,edx
349	; Round 8
350	mov	eax,DWORD [8+ebx]
351	mul	ecx
352	add	eax,esi
353	adc	edx,0
354	mov	DWORD [8+edi],eax
355	mov	esi,edx
356	; Round 12
357	mov	eax,DWORD [12+ebx]
358	mul	ecx
359	add	eax,esi
360	adc	edx,0
361	mov	DWORD [12+edi],eax
362	mov	esi,edx
363	; Round 16
364	mov	eax,DWORD [16+ebx]
365	mul	ecx
366	add	eax,esi
367	adc	edx,0
368	mov	DWORD [16+edi],eax
369	mov	esi,edx
370	; Round 20
371	mov	eax,DWORD [20+ebx]
372	mul	ecx
373	add	eax,esi
374	adc	edx,0
375	mov	DWORD [20+edi],eax
376	mov	esi,edx
377	; Round 24
378	mov	eax,DWORD [24+ebx]
379	mul	ecx
380	add	eax,esi
381	adc	edx,0
382	mov	DWORD [24+edi],eax
383	mov	esi,edx
384	; Round 28
385	mov	eax,DWORD [28+ebx]
386	mul	ecx
387	add	eax,esi
388	adc	edx,0
389	mov	DWORD [28+edi],eax
390	mov	esi,edx
391	;
392	add	ebx,32
393	add	edi,32
394	sub	ebp,8
395	jz	NEAR L$011mw_finish
396	jmp	NEAR L$012mw_loop
397L$011mw_finish:
398	mov	ebp,DWORD [28+esp]
399	and	ebp,7
400	jnz	NEAR L$013mw_finish2
401	jmp	NEAR L$014mw_end
402L$013mw_finish2:
403	; Tail Round 0
404	mov	eax,DWORD [ebx]
405	mul	ecx
406	add	eax,esi
407	adc	edx,0
408	mov	DWORD [edi],eax
409	mov	esi,edx
410	dec	ebp
411	jz	NEAR L$014mw_end
412	; Tail Round 1
413	mov	eax,DWORD [4+ebx]
414	mul	ecx
415	add	eax,esi
416	adc	edx,0
417	mov	DWORD [4+edi],eax
418	mov	esi,edx
419	dec	ebp
420	jz	NEAR L$014mw_end
421	; Tail Round 2
422	mov	eax,DWORD [8+ebx]
423	mul	ecx
424	add	eax,esi
425	adc	edx,0
426	mov	DWORD [8+edi],eax
427	mov	esi,edx
428	dec	ebp
429	jz	NEAR L$014mw_end
430	; Tail Round 3
431	mov	eax,DWORD [12+ebx]
432	mul	ecx
433	add	eax,esi
434	adc	edx,0
435	mov	DWORD [12+edi],eax
436	mov	esi,edx
437	dec	ebp
438	jz	NEAR L$014mw_end
439	; Tail Round 4
440	mov	eax,DWORD [16+ebx]
441	mul	ecx
442	add	eax,esi
443	adc	edx,0
444	mov	DWORD [16+edi],eax
445	mov	esi,edx
446	dec	ebp
447	jz	NEAR L$014mw_end
448	; Tail Round 5
449	mov	eax,DWORD [20+ebx]
450	mul	ecx
451	add	eax,esi
452	adc	edx,0
453	mov	DWORD [20+edi],eax
454	mov	esi,edx
455	dec	ebp
456	jz	NEAR L$014mw_end
457	; Tail Round 6
458	mov	eax,DWORD [24+ebx]
459	mul	ecx
460	add	eax,esi
461	adc	edx,0
462	mov	DWORD [24+edi],eax
463	mov	esi,edx
464L$014mw_end:
465	mov	eax,esi
466	pop	edi
467	pop	esi
468	pop	ebx
469	pop	ebp
470	ret
471global	_bn_sqr_words
472align	16
473_bn_sqr_words:
474L$_bn_sqr_words_begin:
475	lea	eax,[_OPENSSL_ia32cap_P]
476	bt	DWORD [eax],26
477	jnc	NEAR L$015sqr_non_sse2
478	mov	eax,DWORD [4+esp]
479	mov	edx,DWORD [8+esp]
480	mov	ecx,DWORD [12+esp]
481align	16
482L$016sqr_sse2_loop:
483	movd	mm0,DWORD [edx]
484	pmuludq	mm0,mm0
485	lea	edx,[4+edx]
486	movq	[eax],mm0
487	sub	ecx,1
488	lea	eax,[8+eax]
489	jnz	NEAR L$016sqr_sse2_loop
490	emms
491	ret
492align	16
493L$015sqr_non_sse2:
494	push	ebp
495	push	ebx
496	push	esi
497	push	edi
498	;
499	mov	esi,DWORD [20+esp]
500	mov	edi,DWORD [24+esp]
501	mov	ebx,DWORD [28+esp]
502	and	ebx,4294967288
503	jz	NEAR L$017sw_finish
504L$018sw_loop:
505	; Round 0
506	mov	eax,DWORD [edi]
507	mul	eax
508	mov	DWORD [esi],eax
509	mov	DWORD [4+esi],edx
510	; Round 4
511	mov	eax,DWORD [4+edi]
512	mul	eax
513	mov	DWORD [8+esi],eax
514	mov	DWORD [12+esi],edx
515	; Round 8
516	mov	eax,DWORD [8+edi]
517	mul	eax
518	mov	DWORD [16+esi],eax
519	mov	DWORD [20+esi],edx
520	; Round 12
521	mov	eax,DWORD [12+edi]
522	mul	eax
523	mov	DWORD [24+esi],eax
524	mov	DWORD [28+esi],edx
525	; Round 16
526	mov	eax,DWORD [16+edi]
527	mul	eax
528	mov	DWORD [32+esi],eax
529	mov	DWORD [36+esi],edx
530	; Round 20
531	mov	eax,DWORD [20+edi]
532	mul	eax
533	mov	DWORD [40+esi],eax
534	mov	DWORD [44+esi],edx
535	; Round 24
536	mov	eax,DWORD [24+edi]
537	mul	eax
538	mov	DWORD [48+esi],eax
539	mov	DWORD [52+esi],edx
540	; Round 28
541	mov	eax,DWORD [28+edi]
542	mul	eax
543	mov	DWORD [56+esi],eax
544	mov	DWORD [60+esi],edx
545	;
546	add	edi,32
547	add	esi,64
548	sub	ebx,8
549	jnz	NEAR L$018sw_loop
550L$017sw_finish:
551	mov	ebx,DWORD [28+esp]
552	and	ebx,7
553	jz	NEAR L$019sw_end
554	; Tail Round 0
555	mov	eax,DWORD [edi]
556	mul	eax
557	mov	DWORD [esi],eax
558	dec	ebx
559	mov	DWORD [4+esi],edx
560	jz	NEAR L$019sw_end
561	; Tail Round 1
562	mov	eax,DWORD [4+edi]
563	mul	eax
564	mov	DWORD [8+esi],eax
565	dec	ebx
566	mov	DWORD [12+esi],edx
567	jz	NEAR L$019sw_end
568	; Tail Round 2
569	mov	eax,DWORD [8+edi]
570	mul	eax
571	mov	DWORD [16+esi],eax
572	dec	ebx
573	mov	DWORD [20+esi],edx
574	jz	NEAR L$019sw_end
575	; Tail Round 3
576	mov	eax,DWORD [12+edi]
577	mul	eax
578	mov	DWORD [24+esi],eax
579	dec	ebx
580	mov	DWORD [28+esi],edx
581	jz	NEAR L$019sw_end
582	; Tail Round 4
583	mov	eax,DWORD [16+edi]
584	mul	eax
585	mov	DWORD [32+esi],eax
586	dec	ebx
587	mov	DWORD [36+esi],edx
588	jz	NEAR L$019sw_end
589	; Tail Round 5
590	mov	eax,DWORD [20+edi]
591	mul	eax
592	mov	DWORD [40+esi],eax
593	dec	ebx
594	mov	DWORD [44+esi],edx
595	jz	NEAR L$019sw_end
596	; Tail Round 6
597	mov	eax,DWORD [24+edi]
598	mul	eax
599	mov	DWORD [48+esi],eax
600	mov	DWORD [52+esi],edx
601L$019sw_end:
602	pop	edi
603	pop	esi
604	pop	ebx
605	pop	ebp
606	ret
607global	_bn_div_words
608align	16
609_bn_div_words:
610L$_bn_div_words_begin:
611	mov	edx,DWORD [4+esp]
612	mov	eax,DWORD [8+esp]
613	mov	ecx,DWORD [12+esp]
614	div	ecx
615	ret
616global	_bn_add_words
617align	16
618_bn_add_words:
619L$_bn_add_words_begin:
620	push	ebp
621	push	ebx
622	push	esi
623	push	edi
624	;
625	mov	ebx,DWORD [20+esp]
626	mov	esi,DWORD [24+esp]
627	mov	edi,DWORD [28+esp]
628	mov	ebp,DWORD [32+esp]
629	xor	eax,eax
630	and	ebp,4294967288
631	jz	NEAR L$020aw_finish
632L$021aw_loop:
633	; Round 0
634	mov	ecx,DWORD [esi]
635	mov	edx,DWORD [edi]
636	add	ecx,eax
637	mov	eax,0
638	adc	eax,eax
639	add	ecx,edx
640	adc	eax,0
641	mov	DWORD [ebx],ecx
642	; Round 1
643	mov	ecx,DWORD [4+esi]
644	mov	edx,DWORD [4+edi]
645	add	ecx,eax
646	mov	eax,0
647	adc	eax,eax
648	add	ecx,edx
649	adc	eax,0
650	mov	DWORD [4+ebx],ecx
651	; Round 2
652	mov	ecx,DWORD [8+esi]
653	mov	edx,DWORD [8+edi]
654	add	ecx,eax
655	mov	eax,0
656	adc	eax,eax
657	add	ecx,edx
658	adc	eax,0
659	mov	DWORD [8+ebx],ecx
660	; Round 3
661	mov	ecx,DWORD [12+esi]
662	mov	edx,DWORD [12+edi]
663	add	ecx,eax
664	mov	eax,0
665	adc	eax,eax
666	add	ecx,edx
667	adc	eax,0
668	mov	DWORD [12+ebx],ecx
669	; Round 4
670	mov	ecx,DWORD [16+esi]
671	mov	edx,DWORD [16+edi]
672	add	ecx,eax
673	mov	eax,0
674	adc	eax,eax
675	add	ecx,edx
676	adc	eax,0
677	mov	DWORD [16+ebx],ecx
678	; Round 5
679	mov	ecx,DWORD [20+esi]
680	mov	edx,DWORD [20+edi]
681	add	ecx,eax
682	mov	eax,0
683	adc	eax,eax
684	add	ecx,edx
685	adc	eax,0
686	mov	DWORD [20+ebx],ecx
687	; Round 6
688	mov	ecx,DWORD [24+esi]
689	mov	edx,DWORD [24+edi]
690	add	ecx,eax
691	mov	eax,0
692	adc	eax,eax
693	add	ecx,edx
694	adc	eax,0
695	mov	DWORD [24+ebx],ecx
696	; Round 7
697	mov	ecx,DWORD [28+esi]
698	mov	edx,DWORD [28+edi]
699	add	ecx,eax
700	mov	eax,0
701	adc	eax,eax
702	add	ecx,edx
703	adc	eax,0
704	mov	DWORD [28+ebx],ecx
705	;
706	add	esi,32
707	add	edi,32
708	add	ebx,32
709	sub	ebp,8
710	jnz	NEAR L$021aw_loop
711L$020aw_finish:
712	mov	ebp,DWORD [32+esp]
713	and	ebp,7
714	jz	NEAR L$022aw_end
715	; Tail Round 0
716	mov	ecx,DWORD [esi]
717	mov	edx,DWORD [edi]
718	add	ecx,eax
719	mov	eax,0
720	adc	eax,eax
721	add	ecx,edx
722	adc	eax,0
723	dec	ebp
724	mov	DWORD [ebx],ecx
725	jz	NEAR L$022aw_end
726	; Tail Round 1
727	mov	ecx,DWORD [4+esi]
728	mov	edx,DWORD [4+edi]
729	add	ecx,eax
730	mov	eax,0
731	adc	eax,eax
732	add	ecx,edx
733	adc	eax,0
734	dec	ebp
735	mov	DWORD [4+ebx],ecx
736	jz	NEAR L$022aw_end
737	; Tail Round 2
738	mov	ecx,DWORD [8+esi]
739	mov	edx,DWORD [8+edi]
740	add	ecx,eax
741	mov	eax,0
742	adc	eax,eax
743	add	ecx,edx
744	adc	eax,0
745	dec	ebp
746	mov	DWORD [8+ebx],ecx
747	jz	NEAR L$022aw_end
748	; Tail Round 3
749	mov	ecx,DWORD [12+esi]
750	mov	edx,DWORD [12+edi]
751	add	ecx,eax
752	mov	eax,0
753	adc	eax,eax
754	add	ecx,edx
755	adc	eax,0
756	dec	ebp
757	mov	DWORD [12+ebx],ecx
758	jz	NEAR L$022aw_end
759	; Tail Round 4
760	mov	ecx,DWORD [16+esi]
761	mov	edx,DWORD [16+edi]
762	add	ecx,eax
763	mov	eax,0
764	adc	eax,eax
765	add	ecx,edx
766	adc	eax,0
767	dec	ebp
768	mov	DWORD [16+ebx],ecx
769	jz	NEAR L$022aw_end
770	; Tail Round 5
771	mov	ecx,DWORD [20+esi]
772	mov	edx,DWORD [20+edi]
773	add	ecx,eax
774	mov	eax,0
775	adc	eax,eax
776	add	ecx,edx
777	adc	eax,0
778	dec	ebp
779	mov	DWORD [20+ebx],ecx
780	jz	NEAR L$022aw_end
781	; Tail Round 6
782	mov	ecx,DWORD [24+esi]
783	mov	edx,DWORD [24+edi]
784	add	ecx,eax
785	mov	eax,0
786	adc	eax,eax
787	add	ecx,edx
788	adc	eax,0
789	mov	DWORD [24+ebx],ecx
790L$022aw_end:
791	pop	edi
792	pop	esi
793	pop	ebx
794	pop	ebp
795	ret
796global	_bn_sub_words
797align	16
798_bn_sub_words:
799L$_bn_sub_words_begin:
800	push	ebp
801	push	ebx
802	push	esi
803	push	edi
804	;
805	mov	ebx,DWORD [20+esp]
806	mov	esi,DWORD [24+esp]
807	mov	edi,DWORD [28+esp]
808	mov	ebp,DWORD [32+esp]
809	xor	eax,eax
810	and	ebp,4294967288
811	jz	NEAR L$023aw_finish
812L$024aw_loop:
813	; Round 0
814	mov	ecx,DWORD [esi]
815	mov	edx,DWORD [edi]
816	sub	ecx,eax
817	mov	eax,0
818	adc	eax,eax
819	sub	ecx,edx
820	adc	eax,0
821	mov	DWORD [ebx],ecx
822	; Round 1
823	mov	ecx,DWORD [4+esi]
824	mov	edx,DWORD [4+edi]
825	sub	ecx,eax
826	mov	eax,0
827	adc	eax,eax
828	sub	ecx,edx
829	adc	eax,0
830	mov	DWORD [4+ebx],ecx
831	; Round 2
832	mov	ecx,DWORD [8+esi]
833	mov	edx,DWORD [8+edi]
834	sub	ecx,eax
835	mov	eax,0
836	adc	eax,eax
837	sub	ecx,edx
838	adc	eax,0
839	mov	DWORD [8+ebx],ecx
840	; Round 3
841	mov	ecx,DWORD [12+esi]
842	mov	edx,DWORD [12+edi]
843	sub	ecx,eax
844	mov	eax,0
845	adc	eax,eax
846	sub	ecx,edx
847	adc	eax,0
848	mov	DWORD [12+ebx],ecx
849	; Round 4
850	mov	ecx,DWORD [16+esi]
851	mov	edx,DWORD [16+edi]
852	sub	ecx,eax
853	mov	eax,0
854	adc	eax,eax
855	sub	ecx,edx
856	adc	eax,0
857	mov	DWORD [16+ebx],ecx
858	; Round 5
859	mov	ecx,DWORD [20+esi]
860	mov	edx,DWORD [20+edi]
861	sub	ecx,eax
862	mov	eax,0
863	adc	eax,eax
864	sub	ecx,edx
865	adc	eax,0
866	mov	DWORD [20+ebx],ecx
867	; Round 6
868	mov	ecx,DWORD [24+esi]
869	mov	edx,DWORD [24+edi]
870	sub	ecx,eax
871	mov	eax,0
872	adc	eax,eax
873	sub	ecx,edx
874	adc	eax,0
875	mov	DWORD [24+ebx],ecx
876	; Round 7
877	mov	ecx,DWORD [28+esi]
878	mov	edx,DWORD [28+edi]
879	sub	ecx,eax
880	mov	eax,0
881	adc	eax,eax
882	sub	ecx,edx
883	adc	eax,0
884	mov	DWORD [28+ebx],ecx
885	;
886	add	esi,32
887	add	edi,32
888	add	ebx,32
889	sub	ebp,8
890	jnz	NEAR L$024aw_loop
891L$023aw_finish:
892	mov	ebp,DWORD [32+esp]
893	and	ebp,7
894	jz	NEAR L$025aw_end
895	; Tail Round 0
896	mov	ecx,DWORD [esi]
897	mov	edx,DWORD [edi]
898	sub	ecx,eax
899	mov	eax,0
900	adc	eax,eax
901	sub	ecx,edx
902	adc	eax,0
903	dec	ebp
904	mov	DWORD [ebx],ecx
905	jz	NEAR L$025aw_end
906	; Tail Round 1
907	mov	ecx,DWORD [4+esi]
908	mov	edx,DWORD [4+edi]
909	sub	ecx,eax
910	mov	eax,0
911	adc	eax,eax
912	sub	ecx,edx
913	adc	eax,0
914	dec	ebp
915	mov	DWORD [4+ebx],ecx
916	jz	NEAR L$025aw_end
917	; Tail Round 2
918	mov	ecx,DWORD [8+esi]
919	mov	edx,DWORD [8+edi]
920	sub	ecx,eax
921	mov	eax,0
922	adc	eax,eax
923	sub	ecx,edx
924	adc	eax,0
925	dec	ebp
926	mov	DWORD [8+ebx],ecx
927	jz	NEAR L$025aw_end
928	; Tail Round 3
929	mov	ecx,DWORD [12+esi]
930	mov	edx,DWORD [12+edi]
931	sub	ecx,eax
932	mov	eax,0
933	adc	eax,eax
934	sub	ecx,edx
935	adc	eax,0
936	dec	ebp
937	mov	DWORD [12+ebx],ecx
938	jz	NEAR L$025aw_end
939	; Tail Round 4
940	mov	ecx,DWORD [16+esi]
941	mov	edx,DWORD [16+edi]
942	sub	ecx,eax
943	mov	eax,0
944	adc	eax,eax
945	sub	ecx,edx
946	adc	eax,0
947	dec	ebp
948	mov	DWORD [16+ebx],ecx
949	jz	NEAR L$025aw_end
950	; Tail Round 5
951	mov	ecx,DWORD [20+esi]
952	mov	edx,DWORD [20+edi]
953	sub	ecx,eax
954	mov	eax,0
955	adc	eax,eax
956	sub	ecx,edx
957	adc	eax,0
958	dec	ebp
959	mov	DWORD [20+ebx],ecx
960	jz	NEAR L$025aw_end
961	; Tail Round 6
962	mov	ecx,DWORD [24+esi]
963	mov	edx,DWORD [24+edi]
964	sub	ecx,eax
965	mov	eax,0
966	adc	eax,eax
967	sub	ecx,edx
968	adc	eax,0
969	mov	DWORD [24+ebx],ecx
970L$025aw_end:
971	pop	edi
972	pop	esi
973	pop	ebx
974	pop	ebp
975	ret
976segment	.bss
977common	_OPENSSL_ia32cap_P 16
978