1	# $FreeBSD$
2.file	"bn-586.s"
3.text
4.globl	bn_mul_add_words
5.type	bn_mul_add_words,@function
6.align	16
7bn_mul_add_words:
8.L_bn_mul_add_words_begin:
9	leal	OPENSSL_ia32cap_P,%eax
10	btl	$26,(%eax)
11	jnc	.L000maw_non_sse2
12	movl	4(%esp),%eax
13	movl	8(%esp),%edx
14	movl	12(%esp),%ecx
15	movd	16(%esp),%mm0
16	pxor	%mm1,%mm1
17	jmp	.L001maw_sse2_entry
18.align	16
19.L002maw_sse2_unrolled:
20	movd	(%eax),%mm3
21	paddq	%mm3,%mm1
22	movd	(%edx),%mm2
23	pmuludq	%mm0,%mm2
24	movd	4(%edx),%mm4
25	pmuludq	%mm0,%mm4
26	movd	8(%edx),%mm6
27	pmuludq	%mm0,%mm6
28	movd	12(%edx),%mm7
29	pmuludq	%mm0,%mm7
30	paddq	%mm2,%mm1
31	movd	4(%eax),%mm3
32	paddq	%mm4,%mm3
33	movd	8(%eax),%mm5
34	paddq	%mm6,%mm5
35	movd	12(%eax),%mm4
36	paddq	%mm4,%mm7
37	movd	%mm1,(%eax)
38	movd	16(%edx),%mm2
39	pmuludq	%mm0,%mm2
40	psrlq	$32,%mm1
41	movd	20(%edx),%mm4
42	pmuludq	%mm0,%mm4
43	paddq	%mm3,%mm1
44	movd	24(%edx),%mm6
45	pmuludq	%mm0,%mm6
46	movd	%mm1,4(%eax)
47	psrlq	$32,%mm1
48	movd	28(%edx),%mm3
49	addl	$32,%edx
50	pmuludq	%mm0,%mm3
51	paddq	%mm5,%mm1
52	movd	16(%eax),%mm5
53	paddq	%mm5,%mm2
54	movd	%mm1,8(%eax)
55	psrlq	$32,%mm1
56	paddq	%mm7,%mm1
57	movd	20(%eax),%mm5
58	paddq	%mm5,%mm4
59	movd	%mm1,12(%eax)
60	psrlq	$32,%mm1
61	paddq	%mm2,%mm1
62	movd	24(%eax),%mm5
63	paddq	%mm5,%mm6
64	movd	%mm1,16(%eax)
65	psrlq	$32,%mm1
66	paddq	%mm4,%mm1
67	movd	28(%eax),%mm5
68	paddq	%mm5,%mm3
69	movd	%mm1,20(%eax)
70	psrlq	$32,%mm1
71	paddq	%mm6,%mm1
72	movd	%mm1,24(%eax)
73	psrlq	$32,%mm1
74	paddq	%mm3,%mm1
75	movd	%mm1,28(%eax)
76	leal	32(%eax),%eax
77	psrlq	$32,%mm1
78	subl	$8,%ecx
79	jz	.L003maw_sse2_exit
80.L001maw_sse2_entry:
81	testl	$4294967288,%ecx
82	jnz	.L002maw_sse2_unrolled
83.align	4
84.L004maw_sse2_loop:
85	movd	(%edx),%mm2
86	movd	(%eax),%mm3
87	pmuludq	%mm0,%mm2
88	leal	4(%edx),%edx
89	paddq	%mm3,%mm1
90	paddq	%mm2,%mm1
91	movd	%mm1,(%eax)
92	subl	$1,%ecx
93	psrlq	$32,%mm1
94	leal	4(%eax),%eax
95	jnz	.L004maw_sse2_loop
96.L003maw_sse2_exit:
97	movd	%mm1,%eax
98	emms
99	ret
100.align	16
101.L000maw_non_sse2:
102	pushl	%ebp
103	pushl	%ebx
104	pushl	%esi
105	pushl	%edi
106
107	xorl	%esi,%esi
108	movl	20(%esp),%edi
109	movl	28(%esp),%ecx
110	movl	24(%esp),%ebx
111	andl	$4294967288,%ecx
112	movl	32(%esp),%ebp
113	pushl	%ecx
114	jz	.L005maw_finish
115.align	16
116.L006maw_loop:
117
118	movl	(%ebx),%eax
119	mull	%ebp
120	addl	%esi,%eax
121	adcl	$0,%edx
122	addl	(%edi),%eax
123	adcl	$0,%edx
124	movl	%eax,(%edi)
125	movl	%edx,%esi
126
127	movl	4(%ebx),%eax
128	mull	%ebp
129	addl	%esi,%eax
130	adcl	$0,%edx
131	addl	4(%edi),%eax
132	adcl	$0,%edx
133	movl	%eax,4(%edi)
134	movl	%edx,%esi
135
136	movl	8(%ebx),%eax
137	mull	%ebp
138	addl	%esi,%eax
139	adcl	$0,%edx
140	addl	8(%edi),%eax
141	adcl	$0,%edx
142	movl	%eax,8(%edi)
143	movl	%edx,%esi
144
145	movl	12(%ebx),%eax
146	mull	%ebp
147	addl	%esi,%eax
148	adcl	$0,%edx
149	addl	12(%edi),%eax
150	adcl	$0,%edx
151	movl	%eax,12(%edi)
152	movl	%edx,%esi
153
154	movl	16(%ebx),%eax
155	mull	%ebp
156	addl	%esi,%eax
157	adcl	$0,%edx
158	addl	16(%edi),%eax
159	adcl	$0,%edx
160	movl	%eax,16(%edi)
161	movl	%edx,%esi
162
163	movl	20(%ebx),%eax
164	mull	%ebp
165	addl	%esi,%eax
166	adcl	$0,%edx
167	addl	20(%edi),%eax
168	adcl	$0,%edx
169	movl	%eax,20(%edi)
170	movl	%edx,%esi
171
172	movl	24(%ebx),%eax
173	mull	%ebp
174	addl	%esi,%eax
175	adcl	$0,%edx
176	addl	24(%edi),%eax
177	adcl	$0,%edx
178	movl	%eax,24(%edi)
179	movl	%edx,%esi
180
181	movl	28(%ebx),%eax
182	mull	%ebp
183	addl	%esi,%eax
184	adcl	$0,%edx
185	addl	28(%edi),%eax
186	adcl	$0,%edx
187	movl	%eax,28(%edi)
188	movl	%edx,%esi
189
190	subl	$8,%ecx
191	leal	32(%ebx),%ebx
192	leal	32(%edi),%edi
193	jnz	.L006maw_loop
194.L005maw_finish:
195	movl	32(%esp),%ecx
196	andl	$7,%ecx
197	jnz	.L007maw_finish2
198	jmp	.L008maw_end
199.L007maw_finish2:
200
201	movl	(%ebx),%eax
202	mull	%ebp
203	addl	%esi,%eax
204	adcl	$0,%edx
205	addl	(%edi),%eax
206	adcl	$0,%edx
207	decl	%ecx
208	movl	%eax,(%edi)
209	movl	%edx,%esi
210	jz	.L008maw_end
211
212	movl	4(%ebx),%eax
213	mull	%ebp
214	addl	%esi,%eax
215	adcl	$0,%edx
216	addl	4(%edi),%eax
217	adcl	$0,%edx
218	decl	%ecx
219	movl	%eax,4(%edi)
220	movl	%edx,%esi
221	jz	.L008maw_end
222
223	movl	8(%ebx),%eax
224	mull	%ebp
225	addl	%esi,%eax
226	adcl	$0,%edx
227	addl	8(%edi),%eax
228	adcl	$0,%edx
229	decl	%ecx
230	movl	%eax,8(%edi)
231	movl	%edx,%esi
232	jz	.L008maw_end
233
234	movl	12(%ebx),%eax
235	mull	%ebp
236	addl	%esi,%eax
237	adcl	$0,%edx
238	addl	12(%edi),%eax
239	adcl	$0,%edx
240	decl	%ecx
241	movl	%eax,12(%edi)
242	movl	%edx,%esi
243	jz	.L008maw_end
244
245	movl	16(%ebx),%eax
246	mull	%ebp
247	addl	%esi,%eax
248	adcl	$0,%edx
249	addl	16(%edi),%eax
250	adcl	$0,%edx
251	decl	%ecx
252	movl	%eax,16(%edi)
253	movl	%edx,%esi
254	jz	.L008maw_end
255
256	movl	20(%ebx),%eax
257	mull	%ebp
258	addl	%esi,%eax
259	adcl	$0,%edx
260	addl	20(%edi),%eax
261	adcl	$0,%edx
262	decl	%ecx
263	movl	%eax,20(%edi)
264	movl	%edx,%esi
265	jz	.L008maw_end
266
267	movl	24(%ebx),%eax
268	mull	%ebp
269	addl	%esi,%eax
270	adcl	$0,%edx
271	addl	24(%edi),%eax
272	adcl	$0,%edx
273	movl	%eax,24(%edi)
274	movl	%edx,%esi
275.L008maw_end:
276	movl	%esi,%eax
277	popl	%ecx
278	popl	%edi
279	popl	%esi
280	popl	%ebx
281	popl	%ebp
282	ret
283.size	bn_mul_add_words,.-.L_bn_mul_add_words_begin
284.globl	bn_mul_words
285.type	bn_mul_words,@function
286.align	16
287bn_mul_words:
288.L_bn_mul_words_begin:
289	leal	OPENSSL_ia32cap_P,%eax
290	btl	$26,(%eax)
291	jnc	.L009mw_non_sse2
292	movl	4(%esp),%eax
293	movl	8(%esp),%edx
294	movl	12(%esp),%ecx
295	movd	16(%esp),%mm0
296	pxor	%mm1,%mm1
297.align	16
298.L010mw_sse2_loop:
299	movd	(%edx),%mm2
300	pmuludq	%mm0,%mm2
301	leal	4(%edx),%edx
302	paddq	%mm2,%mm1
303	movd	%mm1,(%eax)
304	subl	$1,%ecx
305	psrlq	$32,%mm1
306	leal	4(%eax),%eax
307	jnz	.L010mw_sse2_loop
308	movd	%mm1,%eax
309	emms
310	ret
311.align	16
312.L009mw_non_sse2:
313	pushl	%ebp
314	pushl	%ebx
315	pushl	%esi
316	pushl	%edi
317
318	xorl	%esi,%esi
319	movl	20(%esp),%edi
320	movl	24(%esp),%ebx
321	movl	28(%esp),%ebp
322	movl	32(%esp),%ecx
323	andl	$4294967288,%ebp
324	jz	.L011mw_finish
325.L012mw_loop:
326
327	movl	(%ebx),%eax
328	mull	%ecx
329	addl	%esi,%eax
330	adcl	$0,%edx
331	movl	%eax,(%edi)
332	movl	%edx,%esi
333
334	movl	4(%ebx),%eax
335	mull	%ecx
336	addl	%esi,%eax
337	adcl	$0,%edx
338	movl	%eax,4(%edi)
339	movl	%edx,%esi
340
341	movl	8(%ebx),%eax
342	mull	%ecx
343	addl	%esi,%eax
344	adcl	$0,%edx
345	movl	%eax,8(%edi)
346	movl	%edx,%esi
347
348	movl	12(%ebx),%eax
349	mull	%ecx
350	addl	%esi,%eax
351	adcl	$0,%edx
352	movl	%eax,12(%edi)
353	movl	%edx,%esi
354
355	movl	16(%ebx),%eax
356	mull	%ecx
357	addl	%esi,%eax
358	adcl	$0,%edx
359	movl	%eax,16(%edi)
360	movl	%edx,%esi
361
362	movl	20(%ebx),%eax
363	mull	%ecx
364	addl	%esi,%eax
365	adcl	$0,%edx
366	movl	%eax,20(%edi)
367	movl	%edx,%esi
368
369	movl	24(%ebx),%eax
370	mull	%ecx
371	addl	%esi,%eax
372	adcl	$0,%edx
373	movl	%eax,24(%edi)
374	movl	%edx,%esi
375
376	movl	28(%ebx),%eax
377	mull	%ecx
378	addl	%esi,%eax
379	adcl	$0,%edx
380	movl	%eax,28(%edi)
381	movl	%edx,%esi
382
383	addl	$32,%ebx
384	addl	$32,%edi
385	subl	$8,%ebp
386	jz	.L011mw_finish
387	jmp	.L012mw_loop
388.L011mw_finish:
389	movl	28(%esp),%ebp
390	andl	$7,%ebp
391	jnz	.L013mw_finish2
392	jmp	.L014mw_end
393.L013mw_finish2:
394
395	movl	(%ebx),%eax
396	mull	%ecx
397	addl	%esi,%eax
398	adcl	$0,%edx
399	movl	%eax,(%edi)
400	movl	%edx,%esi
401	decl	%ebp
402	jz	.L014mw_end
403
404	movl	4(%ebx),%eax
405	mull	%ecx
406	addl	%esi,%eax
407	adcl	$0,%edx
408	movl	%eax,4(%edi)
409	movl	%edx,%esi
410	decl	%ebp
411	jz	.L014mw_end
412
413	movl	8(%ebx),%eax
414	mull	%ecx
415	addl	%esi,%eax
416	adcl	$0,%edx
417	movl	%eax,8(%edi)
418	movl	%edx,%esi
419	decl	%ebp
420	jz	.L014mw_end
421
422	movl	12(%ebx),%eax
423	mull	%ecx
424	addl	%esi,%eax
425	adcl	$0,%edx
426	movl	%eax,12(%edi)
427	movl	%edx,%esi
428	decl	%ebp
429	jz	.L014mw_end
430
431	movl	16(%ebx),%eax
432	mull	%ecx
433	addl	%esi,%eax
434	adcl	$0,%edx
435	movl	%eax,16(%edi)
436	movl	%edx,%esi
437	decl	%ebp
438	jz	.L014mw_end
439
440	movl	20(%ebx),%eax
441	mull	%ecx
442	addl	%esi,%eax
443	adcl	$0,%edx
444	movl	%eax,20(%edi)
445	movl	%edx,%esi
446	decl	%ebp
447	jz	.L014mw_end
448
449	movl	24(%ebx),%eax
450	mull	%ecx
451	addl	%esi,%eax
452	adcl	$0,%edx
453	movl	%eax,24(%edi)
454	movl	%edx,%esi
455.L014mw_end:
456	movl	%esi,%eax
457	popl	%edi
458	popl	%esi
459	popl	%ebx
460	popl	%ebp
461	ret
462.size	bn_mul_words,.-.L_bn_mul_words_begin
463.globl	bn_sqr_words
464.type	bn_sqr_words,@function
465.align	16
466bn_sqr_words:
467.L_bn_sqr_words_begin:
468	leal	OPENSSL_ia32cap_P,%eax
469	btl	$26,(%eax)
470	jnc	.L015sqr_non_sse2
471	movl	4(%esp),%eax
472	movl	8(%esp),%edx
473	movl	12(%esp),%ecx
474.align	16
475.L016sqr_sse2_loop:
476	movd	(%edx),%mm0
477	pmuludq	%mm0,%mm0
478	leal	4(%edx),%edx
479	movq	%mm0,(%eax)
480	subl	$1,%ecx
481	leal	8(%eax),%eax
482	jnz	.L016sqr_sse2_loop
483	emms
484	ret
485.align	16
486.L015sqr_non_sse2:
487	pushl	%ebp
488	pushl	%ebx
489	pushl	%esi
490	pushl	%edi
491
492	movl	20(%esp),%esi
493	movl	24(%esp),%edi
494	movl	28(%esp),%ebx
495	andl	$4294967288,%ebx
496	jz	.L017sw_finish
497.L018sw_loop:
498
499	movl	(%edi),%eax
500	mull	%eax
501	movl	%eax,(%esi)
502	movl	%edx,4(%esi)
503
504	movl	4(%edi),%eax
505	mull	%eax
506	movl	%eax,8(%esi)
507	movl	%edx,12(%esi)
508
509	movl	8(%edi),%eax
510	mull	%eax
511	movl	%eax,16(%esi)
512	movl	%edx,20(%esi)
513
514	movl	12(%edi),%eax
515	mull	%eax
516	movl	%eax,24(%esi)
517	movl	%edx,28(%esi)
518
519	movl	16(%edi),%eax
520	mull	%eax
521	movl	%eax,32(%esi)
522	movl	%edx,36(%esi)
523
524	movl	20(%edi),%eax
525	mull	%eax
526	movl	%eax,40(%esi)
527	movl	%edx,44(%esi)
528
529	movl	24(%edi),%eax
530	mull	%eax
531	movl	%eax,48(%esi)
532	movl	%edx,52(%esi)
533
534	movl	28(%edi),%eax
535	mull	%eax
536	movl	%eax,56(%esi)
537	movl	%edx,60(%esi)
538
539	addl	$32,%edi
540	addl	$64,%esi
541	subl	$8,%ebx
542	jnz	.L018sw_loop
543.L017sw_finish:
544	movl	28(%esp),%ebx
545	andl	$7,%ebx
546	jz	.L019sw_end
547
548	movl	(%edi),%eax
549	mull	%eax
550	movl	%eax,(%esi)
551	decl	%ebx
552	movl	%edx,4(%esi)
553	jz	.L019sw_end
554
555	movl	4(%edi),%eax
556	mull	%eax
557	movl	%eax,8(%esi)
558	decl	%ebx
559	movl	%edx,12(%esi)
560	jz	.L019sw_end
561
562	movl	8(%edi),%eax
563	mull	%eax
564	movl	%eax,16(%esi)
565	decl	%ebx
566	movl	%edx,20(%esi)
567	jz	.L019sw_end
568
569	movl	12(%edi),%eax
570	mull	%eax
571	movl	%eax,24(%esi)
572	decl	%ebx
573	movl	%edx,28(%esi)
574	jz	.L019sw_end
575
576	movl	16(%edi),%eax
577	mull	%eax
578	movl	%eax,32(%esi)
579	decl	%ebx
580	movl	%edx,36(%esi)
581	jz	.L019sw_end
582
583	movl	20(%edi),%eax
584	mull	%eax
585	movl	%eax,40(%esi)
586	decl	%ebx
587	movl	%edx,44(%esi)
588	jz	.L019sw_end
589
590	movl	24(%edi),%eax
591	mull	%eax
592	movl	%eax,48(%esi)
593	movl	%edx,52(%esi)
594.L019sw_end:
595	popl	%edi
596	popl	%esi
597	popl	%ebx
598	popl	%ebp
599	ret
600.size	bn_sqr_words,.-.L_bn_sqr_words_begin
601.globl	bn_div_words
602.type	bn_div_words,@function
603.align	16
604bn_div_words:
605.L_bn_div_words_begin:
606	movl	4(%esp),%edx
607	movl	8(%esp),%eax
608	movl	12(%esp),%ecx
609	divl	%ecx
610	ret
611.size	bn_div_words,.-.L_bn_div_words_begin
612.globl	bn_add_words
613.type	bn_add_words,@function
614.align	16
615bn_add_words:
616.L_bn_add_words_begin:
617	pushl	%ebp
618	pushl	%ebx
619	pushl	%esi
620	pushl	%edi
621
622	movl	20(%esp),%ebx
623	movl	24(%esp),%esi
624	movl	28(%esp),%edi
625	movl	32(%esp),%ebp
626	xorl	%eax,%eax
627	andl	$4294967288,%ebp
628	jz	.L020aw_finish
629.L021aw_loop:
630
631	movl	(%esi),%ecx
632	movl	(%edi),%edx
633	addl	%eax,%ecx
634	movl	$0,%eax
635	adcl	%eax,%eax
636	addl	%edx,%ecx
637	adcl	$0,%eax
638	movl	%ecx,(%ebx)
639
640	movl	4(%esi),%ecx
641	movl	4(%edi),%edx
642	addl	%eax,%ecx
643	movl	$0,%eax
644	adcl	%eax,%eax
645	addl	%edx,%ecx
646	adcl	$0,%eax
647	movl	%ecx,4(%ebx)
648
649	movl	8(%esi),%ecx
650	movl	8(%edi),%edx
651	addl	%eax,%ecx
652	movl	$0,%eax
653	adcl	%eax,%eax
654	addl	%edx,%ecx
655	adcl	$0,%eax
656	movl	%ecx,8(%ebx)
657
658	movl	12(%esi),%ecx
659	movl	12(%edi),%edx
660	addl	%eax,%ecx
661	movl	$0,%eax
662	adcl	%eax,%eax
663	addl	%edx,%ecx
664	adcl	$0,%eax
665	movl	%ecx,12(%ebx)
666
667	movl	16(%esi),%ecx
668	movl	16(%edi),%edx
669	addl	%eax,%ecx
670	movl	$0,%eax
671	adcl	%eax,%eax
672	addl	%edx,%ecx
673	adcl	$0,%eax
674	movl	%ecx,16(%ebx)
675
676	movl	20(%esi),%ecx
677	movl	20(%edi),%edx
678	addl	%eax,%ecx
679	movl	$0,%eax
680	adcl	%eax,%eax
681	addl	%edx,%ecx
682	adcl	$0,%eax
683	movl	%ecx,20(%ebx)
684
685	movl	24(%esi),%ecx
686	movl	24(%edi),%edx
687	addl	%eax,%ecx
688	movl	$0,%eax
689	adcl	%eax,%eax
690	addl	%edx,%ecx
691	adcl	$0,%eax
692	movl	%ecx,24(%ebx)
693
694	movl	28(%esi),%ecx
695	movl	28(%edi),%edx
696	addl	%eax,%ecx
697	movl	$0,%eax
698	adcl	%eax,%eax
699	addl	%edx,%ecx
700	adcl	$0,%eax
701	movl	%ecx,28(%ebx)
702
703	addl	$32,%esi
704	addl	$32,%edi
705	addl	$32,%ebx
706	subl	$8,%ebp
707	jnz	.L021aw_loop
708.L020aw_finish:
709	movl	32(%esp),%ebp
710	andl	$7,%ebp
711	jz	.L022aw_end
712
713	movl	(%esi),%ecx
714	movl	(%edi),%edx
715	addl	%eax,%ecx
716	movl	$0,%eax
717	adcl	%eax,%eax
718	addl	%edx,%ecx
719	adcl	$0,%eax
720	decl	%ebp
721	movl	%ecx,(%ebx)
722	jz	.L022aw_end
723
724	movl	4(%esi),%ecx
725	movl	4(%edi),%edx
726	addl	%eax,%ecx
727	movl	$0,%eax
728	adcl	%eax,%eax
729	addl	%edx,%ecx
730	adcl	$0,%eax
731	decl	%ebp
732	movl	%ecx,4(%ebx)
733	jz	.L022aw_end
734
735	movl	8(%esi),%ecx
736	movl	8(%edi),%edx
737	addl	%eax,%ecx
738	movl	$0,%eax
739	adcl	%eax,%eax
740	addl	%edx,%ecx
741	adcl	$0,%eax
742	decl	%ebp
743	movl	%ecx,8(%ebx)
744	jz	.L022aw_end
745
746	movl	12(%esi),%ecx
747	movl	12(%edi),%edx
748	addl	%eax,%ecx
749	movl	$0,%eax
750	adcl	%eax,%eax
751	addl	%edx,%ecx
752	adcl	$0,%eax
753	decl	%ebp
754	movl	%ecx,12(%ebx)
755	jz	.L022aw_end
756
757	movl	16(%esi),%ecx
758	movl	16(%edi),%edx
759	addl	%eax,%ecx
760	movl	$0,%eax
761	adcl	%eax,%eax
762	addl	%edx,%ecx
763	adcl	$0,%eax
764	decl	%ebp
765	movl	%ecx,16(%ebx)
766	jz	.L022aw_end
767
768	movl	20(%esi),%ecx
769	movl	20(%edi),%edx
770	addl	%eax,%ecx
771	movl	$0,%eax
772	adcl	%eax,%eax
773	addl	%edx,%ecx
774	adcl	$0,%eax
775	decl	%ebp
776	movl	%ecx,20(%ebx)
777	jz	.L022aw_end
778
779	movl	24(%esi),%ecx
780	movl	24(%edi),%edx
781	addl	%eax,%ecx
782	movl	$0,%eax
783	adcl	%eax,%eax
784	addl	%edx,%ecx
785	adcl	$0,%eax
786	movl	%ecx,24(%ebx)
787.L022aw_end:
788	popl	%edi
789	popl	%esi
790	popl	%ebx
791	popl	%ebp
792	ret
793.size	bn_add_words,.-.L_bn_add_words_begin
794.globl	bn_sub_words
795.type	bn_sub_words,@function
796.align	16
797bn_sub_words:
798.L_bn_sub_words_begin:
799	pushl	%ebp
800	pushl	%ebx
801	pushl	%esi
802	pushl	%edi
803
804	movl	20(%esp),%ebx
805	movl	24(%esp),%esi
806	movl	28(%esp),%edi
807	movl	32(%esp),%ebp
808	xorl	%eax,%eax
809	andl	$4294967288,%ebp
810	jz	.L023aw_finish
811.L024aw_loop:
812
813	movl	(%esi),%ecx
814	movl	(%edi),%edx
815	subl	%eax,%ecx
816	movl	$0,%eax
817	adcl	%eax,%eax
818	subl	%edx,%ecx
819	adcl	$0,%eax
820	movl	%ecx,(%ebx)
821
822	movl	4(%esi),%ecx
823	movl	4(%edi),%edx
824	subl	%eax,%ecx
825	movl	$0,%eax
826	adcl	%eax,%eax
827	subl	%edx,%ecx
828	adcl	$0,%eax
829	movl	%ecx,4(%ebx)
830
831	movl	8(%esi),%ecx
832	movl	8(%edi),%edx
833	subl	%eax,%ecx
834	movl	$0,%eax
835	adcl	%eax,%eax
836	subl	%edx,%ecx
837	adcl	$0,%eax
838	movl	%ecx,8(%ebx)
839
840	movl	12(%esi),%ecx
841	movl	12(%edi),%edx
842	subl	%eax,%ecx
843	movl	$0,%eax
844	adcl	%eax,%eax
845	subl	%edx,%ecx
846	adcl	$0,%eax
847	movl	%ecx,12(%ebx)
848
849	movl	16(%esi),%ecx
850	movl	16(%edi),%edx
851	subl	%eax,%ecx
852	movl	$0,%eax
853	adcl	%eax,%eax
854	subl	%edx,%ecx
855	adcl	$0,%eax
856	movl	%ecx,16(%ebx)
857
858	movl	20(%esi),%ecx
859	movl	20(%edi),%edx
860	subl	%eax,%ecx
861	movl	$0,%eax
862	adcl	%eax,%eax
863	subl	%edx,%ecx
864	adcl	$0,%eax
865	movl	%ecx,20(%ebx)
866
867	movl	24(%esi),%ecx
868	movl	24(%edi),%edx
869	subl	%eax,%ecx
870	movl	$0,%eax
871	adcl	%eax,%eax
872	subl	%edx,%ecx
873	adcl	$0,%eax
874	movl	%ecx,24(%ebx)
875
876	movl	28(%esi),%ecx
877	movl	28(%edi),%edx
878	subl	%eax,%ecx
879	movl	$0,%eax
880	adcl	%eax,%eax
881	subl	%edx,%ecx
882	adcl	$0,%eax
883	movl	%ecx,28(%ebx)
884
885	addl	$32,%esi
886	addl	$32,%edi
887	addl	$32,%ebx
888	subl	$8,%ebp
889	jnz	.L024aw_loop
890.L023aw_finish:
891	movl	32(%esp),%ebp
892	andl	$7,%ebp
893	jz	.L025aw_end
894
895	movl	(%esi),%ecx
896	movl	(%edi),%edx
897	subl	%eax,%ecx
898	movl	$0,%eax
899	adcl	%eax,%eax
900	subl	%edx,%ecx
901	adcl	$0,%eax
902	decl	%ebp
903	movl	%ecx,(%ebx)
904	jz	.L025aw_end
905
906	movl	4(%esi),%ecx
907	movl	4(%edi),%edx
908	subl	%eax,%ecx
909	movl	$0,%eax
910	adcl	%eax,%eax
911	subl	%edx,%ecx
912	adcl	$0,%eax
913	decl	%ebp
914	movl	%ecx,4(%ebx)
915	jz	.L025aw_end
916
917	movl	8(%esi),%ecx
918	movl	8(%edi),%edx
919	subl	%eax,%ecx
920	movl	$0,%eax
921	adcl	%eax,%eax
922	subl	%edx,%ecx
923	adcl	$0,%eax
924	decl	%ebp
925	movl	%ecx,8(%ebx)
926	jz	.L025aw_end
927
928	movl	12(%esi),%ecx
929	movl	12(%edi),%edx
930	subl	%eax,%ecx
931	movl	$0,%eax
932	adcl	%eax,%eax
933	subl	%edx,%ecx
934	adcl	$0,%eax
935	decl	%ebp
936	movl	%ecx,12(%ebx)
937	jz	.L025aw_end
938
939	movl	16(%esi),%ecx
940	movl	16(%edi),%edx
941	subl	%eax,%ecx
942	movl	$0,%eax
943	adcl	%eax,%eax
944	subl	%edx,%ecx
945	adcl	$0,%eax
946	decl	%ebp
947	movl	%ecx,16(%ebx)
948	jz	.L025aw_end
949
950	movl	20(%esi),%ecx
951	movl	20(%edi),%edx
952	subl	%eax,%ecx
953	movl	$0,%eax
954	adcl	%eax,%eax
955	subl	%edx,%ecx
956	adcl	$0,%eax
957	decl	%ebp
958	movl	%ecx,20(%ebx)
959	jz	.L025aw_end
960
961	movl	24(%esi),%ecx
962	movl	24(%edi),%edx
963	subl	%eax,%ecx
964	movl	$0,%eax
965	adcl	%eax,%eax
966	subl	%edx,%ecx
967	adcl	$0,%eax
968	movl	%ecx,24(%ebx)
969.L025aw_end:
970	popl	%edi
971	popl	%esi
972	popl	%ebx
973	popl	%ebp
974	ret
975.size	bn_sub_words,.-.L_bn_sub_words_begin
976.globl	bn_sub_part_words
977.type	bn_sub_part_words,@function
978.align	16
979bn_sub_part_words:
980.L_bn_sub_part_words_begin:
981	pushl	%ebp
982	pushl	%ebx
983	pushl	%esi
984	pushl	%edi
985
986	movl	20(%esp),%ebx
987	movl	24(%esp),%esi
988	movl	28(%esp),%edi
989	movl	32(%esp),%ebp
990	xorl	%eax,%eax
991	andl	$4294967288,%ebp
992	jz	.L026aw_finish
993.L027aw_loop:
994
995	movl	(%esi),%ecx
996	movl	(%edi),%edx
997	subl	%eax,%ecx
998	movl	$0,%eax
999	adcl	%eax,%eax
1000	subl	%edx,%ecx
1001	adcl	$0,%eax
1002	movl	%ecx,(%ebx)
1003
1004	movl	4(%esi),%ecx
1005	movl	4(%edi),%edx
1006	subl	%eax,%ecx
1007	movl	$0,%eax
1008	adcl	%eax,%eax
1009	subl	%edx,%ecx
1010	adcl	$0,%eax
1011	movl	%ecx,4(%ebx)
1012
1013	movl	8(%esi),%ecx
1014	movl	8(%edi),%edx
1015	subl	%eax,%ecx
1016	movl	$0,%eax
1017	adcl	%eax,%eax
1018	subl	%edx,%ecx
1019	adcl	$0,%eax
1020	movl	%ecx,8(%ebx)
1021
1022	movl	12(%esi),%ecx
1023	movl	12(%edi),%edx
1024	subl	%eax,%ecx
1025	movl	$0,%eax
1026	adcl	%eax,%eax
1027	subl	%edx,%ecx
1028	adcl	$0,%eax
1029	movl	%ecx,12(%ebx)
1030
1031	movl	16(%esi),%ecx
1032	movl	16(%edi),%edx
1033	subl	%eax,%ecx
1034	movl	$0,%eax
1035	adcl	%eax,%eax
1036	subl	%edx,%ecx
1037	adcl	$0,%eax
1038	movl	%ecx,16(%ebx)
1039
1040	movl	20(%esi),%ecx
1041	movl	20(%edi),%edx
1042	subl	%eax,%ecx
1043	movl	$0,%eax
1044	adcl	%eax,%eax
1045	subl	%edx,%ecx
1046	adcl	$0,%eax
1047	movl	%ecx,20(%ebx)
1048
1049	movl	24(%esi),%ecx
1050	movl	24(%edi),%edx
1051	subl	%eax,%ecx
1052	movl	$0,%eax
1053	adcl	%eax,%eax
1054	subl	%edx,%ecx
1055	adcl	$0,%eax
1056	movl	%ecx,24(%ebx)
1057
1058	movl	28(%esi),%ecx
1059	movl	28(%edi),%edx
1060	subl	%eax,%ecx
1061	movl	$0,%eax
1062	adcl	%eax,%eax
1063	subl	%edx,%ecx
1064	adcl	$0,%eax
1065	movl	%ecx,28(%ebx)
1066
1067	addl	$32,%esi
1068	addl	$32,%edi
1069	addl	$32,%ebx
1070	subl	$8,%ebp
1071	jnz	.L027aw_loop
1072.L026aw_finish:
1073	movl	32(%esp),%ebp
1074	andl	$7,%ebp
1075	jz	.L028aw_end
1076
1077	movl	(%esi),%ecx
1078	movl	(%edi),%edx
1079	subl	%eax,%ecx
1080	movl	$0,%eax
1081	adcl	%eax,%eax
1082	subl	%edx,%ecx
1083	adcl	$0,%eax
1084	movl	%ecx,(%ebx)
1085	addl	$4,%esi
1086	addl	$4,%edi
1087	addl	$4,%ebx
1088	decl	%ebp
1089	jz	.L028aw_end
1090
1091	movl	(%esi),%ecx
1092	movl	(%edi),%edx
1093	subl	%eax,%ecx
1094	movl	$0,%eax
1095	adcl	%eax,%eax
1096	subl	%edx,%ecx
1097	adcl	$0,%eax
1098	movl	%ecx,(%ebx)
1099	addl	$4,%esi
1100	addl	$4,%edi
1101	addl	$4,%ebx
1102	decl	%ebp
1103	jz	.L028aw_end
1104
1105	movl	(%esi),%ecx
1106	movl	(%edi),%edx
1107	subl	%eax,%ecx
1108	movl	$0,%eax
1109	adcl	%eax,%eax
1110	subl	%edx,%ecx
1111	adcl	$0,%eax
1112	movl	%ecx,(%ebx)
1113	addl	$4,%esi
1114	addl	$4,%edi
1115	addl	$4,%ebx
1116	decl	%ebp
1117	jz	.L028aw_end
1118
1119	movl	(%esi),%ecx
1120	movl	(%edi),%edx
1121	subl	%eax,%ecx
1122	movl	$0,%eax
1123	adcl	%eax,%eax
1124	subl	%edx,%ecx
1125	adcl	$0,%eax
1126	movl	%ecx,(%ebx)
1127	addl	$4,%esi
1128	addl	$4,%edi
1129	addl	$4,%ebx
1130	decl	%ebp
1131	jz	.L028aw_end
1132
1133	movl	(%esi),%ecx
1134	movl	(%edi),%edx
1135	subl	%eax,%ecx
1136	movl	$0,%eax
1137	adcl	%eax,%eax
1138	subl	%edx,%ecx
1139	adcl	$0,%eax
1140	movl	%ecx,(%ebx)
1141	addl	$4,%esi
1142	addl	$4,%edi
1143	addl	$4,%ebx
1144	decl	%ebp
1145	jz	.L028aw_end
1146
1147	movl	(%esi),%ecx
1148	movl	(%edi),%edx
1149	subl	%eax,%ecx
1150	movl	$0,%eax
1151	adcl	%eax,%eax
1152	subl	%edx,%ecx
1153	adcl	$0,%eax
1154	movl	%ecx,(%ebx)
1155	addl	$4,%esi
1156	addl	$4,%edi
1157	addl	$4,%ebx
1158	decl	%ebp
1159	jz	.L028aw_end
1160
1161	movl	(%esi),%ecx
1162	movl	(%edi),%edx
1163	subl	%eax,%ecx
1164	movl	$0,%eax
1165	adcl	%eax,%eax
1166	subl	%edx,%ecx
1167	adcl	$0,%eax
1168	movl	%ecx,(%ebx)
1169	addl	$4,%esi
1170	addl	$4,%edi
1171	addl	$4,%ebx
1172.L028aw_end:
1173	cmpl	$0,36(%esp)
1174	je	.L029pw_end
1175	movl	36(%esp),%ebp
1176	cmpl	$0,%ebp
1177	je	.L029pw_end
1178	jge	.L030pw_pos
1179
1180	movl	$0,%edx
1181	subl	%ebp,%edx
1182	movl	%edx,%ebp
1183	andl	$4294967288,%ebp
1184	jz	.L031pw_neg_finish
1185.L032pw_neg_loop:
1186
1187	movl	$0,%ecx
1188	movl	(%edi),%edx
1189	subl	%eax,%ecx
1190	movl	$0,%eax
1191	adcl	%eax,%eax
1192	subl	%edx,%ecx
1193	adcl	$0,%eax
1194	movl	%ecx,(%ebx)
1195
1196	movl	$0,%ecx
1197	movl	4(%edi),%edx
1198	subl	%eax,%ecx
1199	movl	$0,%eax
1200	adcl	%eax,%eax
1201	subl	%edx,%ecx
1202	adcl	$0,%eax
1203	movl	%ecx,4(%ebx)
1204
1205	movl	$0,%ecx
1206	movl	8(%edi),%edx
1207	subl	%eax,%ecx
1208	movl	$0,%eax
1209	adcl	%eax,%eax
1210	subl	%edx,%ecx
1211	adcl	$0,%eax
1212	movl	%ecx,8(%ebx)
1213
1214	movl	$0,%ecx
1215	movl	12(%edi),%edx
1216	subl	%eax,%ecx
1217	movl	$0,%eax
1218	adcl	%eax,%eax
1219	subl	%edx,%ecx
1220	adcl	$0,%eax
1221	movl	%ecx,12(%ebx)
1222
1223	movl	$0,%ecx
1224	movl	16(%edi),%edx
1225	subl	%eax,%ecx
1226	movl	$0,%eax
1227	adcl	%eax,%eax
1228	subl	%edx,%ecx
1229	adcl	$0,%eax
1230	movl	%ecx,16(%ebx)
1231
1232	movl	$0,%ecx
1233	movl	20(%edi),%edx
1234	subl	%eax,%ecx
1235	movl	$0,%eax
1236	adcl	%eax,%eax
1237	subl	%edx,%ecx
1238	adcl	$0,%eax
1239	movl	%ecx,20(%ebx)
1240
1241	movl	$0,%ecx
1242	movl	24(%edi),%edx
1243	subl	%eax,%ecx
1244	movl	$0,%eax
1245	adcl	%eax,%eax
1246	subl	%edx,%ecx
1247	adcl	$0,%eax
1248	movl	%ecx,24(%ebx)
1249
1250	movl	$0,%ecx
1251	movl	28(%edi),%edx
1252	subl	%eax,%ecx
1253	movl	$0,%eax
1254	adcl	%eax,%eax
1255	subl	%edx,%ecx
1256	adcl	$0,%eax
1257	movl	%ecx,28(%ebx)
1258
1259	addl	$32,%edi
1260	addl	$32,%ebx
1261	subl	$8,%ebp
1262	jnz	.L032pw_neg_loop
1263.L031pw_neg_finish:
1264	movl	36(%esp),%edx
1265	movl	$0,%ebp
1266	subl	%edx,%ebp
1267	andl	$7,%ebp
1268	jz	.L029pw_end
1269
1270	movl	$0,%ecx
1271	movl	(%edi),%edx
1272	subl	%eax,%ecx
1273	movl	$0,%eax
1274	adcl	%eax,%eax
1275	subl	%edx,%ecx
1276	adcl	$0,%eax
1277	decl	%ebp
1278	movl	%ecx,(%ebx)
1279	jz	.L029pw_end
1280
1281	movl	$0,%ecx
1282	movl	4(%edi),%edx
1283	subl	%eax,%ecx
1284	movl	$0,%eax
1285	adcl	%eax,%eax
1286	subl	%edx,%ecx
1287	adcl	$0,%eax
1288	decl	%ebp
1289	movl	%ecx,4(%ebx)
1290	jz	.L029pw_end
1291
1292	movl	$0,%ecx
1293	movl	8(%edi),%edx
1294	subl	%eax,%ecx
1295	movl	$0,%eax
1296	adcl	%eax,%eax
1297	subl	%edx,%ecx
1298	adcl	$0,%eax
1299	decl	%ebp
1300	movl	%ecx,8(%ebx)
1301	jz	.L029pw_end
1302
1303	movl	$0,%ecx
1304	movl	12(%edi),%edx
1305	subl	%eax,%ecx
1306	movl	$0,%eax
1307	adcl	%eax,%eax
1308	subl	%edx,%ecx
1309	adcl	$0,%eax
1310	decl	%ebp
1311	movl	%ecx,12(%ebx)
1312	jz	.L029pw_end
1313
1314	movl	$0,%ecx
1315	movl	16(%edi),%edx
1316	subl	%eax,%ecx
1317	movl	$0,%eax
1318	adcl	%eax,%eax
1319	subl	%edx,%ecx
1320	adcl	$0,%eax
1321	decl	%ebp
1322	movl	%ecx,16(%ebx)
1323	jz	.L029pw_end
1324
1325	movl	$0,%ecx
1326	movl	20(%edi),%edx
1327	subl	%eax,%ecx
1328	movl	$0,%eax
1329	adcl	%eax,%eax
1330	subl	%edx,%ecx
1331	adcl	$0,%eax
1332	decl	%ebp
1333	movl	%ecx,20(%ebx)
1334	jz	.L029pw_end
1335
1336	movl	$0,%ecx
1337	movl	24(%edi),%edx
1338	subl	%eax,%ecx
1339	movl	$0,%eax
1340	adcl	%eax,%eax
1341	subl	%edx,%ecx
1342	adcl	$0,%eax
1343	movl	%ecx,24(%ebx)
1344	jmp	.L029pw_end
1345.L030pw_pos:
1346	andl	$4294967288,%ebp
1347	jz	.L033pw_pos_finish
1348.L034pw_pos_loop:
1349
1350	movl	(%esi),%ecx
1351	subl	%eax,%ecx
1352	movl	%ecx,(%ebx)
1353	jnc	.L035pw_nc0
1354
1355	movl	4(%esi),%ecx
1356	subl	%eax,%ecx
1357	movl	%ecx,4(%ebx)
1358	jnc	.L036pw_nc1
1359
1360	movl	8(%esi),%ecx
1361	subl	%eax,%ecx
1362	movl	%ecx,8(%ebx)
1363	jnc	.L037pw_nc2
1364
1365	movl	12(%esi),%ecx
1366	subl	%eax,%ecx
1367	movl	%ecx,12(%ebx)
1368	jnc	.L038pw_nc3
1369
1370	movl	16(%esi),%ecx
1371	subl	%eax,%ecx
1372	movl	%ecx,16(%ebx)
1373	jnc	.L039pw_nc4
1374
1375	movl	20(%esi),%ecx
1376	subl	%eax,%ecx
1377	movl	%ecx,20(%ebx)
1378	jnc	.L040pw_nc5
1379
1380	movl	24(%esi),%ecx
1381	subl	%eax,%ecx
1382	movl	%ecx,24(%ebx)
1383	jnc	.L041pw_nc6
1384
1385	movl	28(%esi),%ecx
1386	subl	%eax,%ecx
1387	movl	%ecx,28(%ebx)
1388	jnc	.L042pw_nc7
1389
1390	addl	$32,%esi
1391	addl	$32,%ebx
1392	subl	$8,%ebp
1393	jnz	.L034pw_pos_loop
1394.L033pw_pos_finish:
1395	movl	36(%esp),%ebp
1396	andl	$7,%ebp
1397	jz	.L029pw_end
1398
1399	movl	(%esi),%ecx
1400	subl	%eax,%ecx
1401	movl	%ecx,(%ebx)
1402	jnc	.L043pw_tail_nc0
1403	decl	%ebp
1404	jz	.L029pw_end
1405
1406	movl	4(%esi),%ecx
1407	subl	%eax,%ecx
1408	movl	%ecx,4(%ebx)
1409	jnc	.L044pw_tail_nc1
1410	decl	%ebp
1411	jz	.L029pw_end
1412
1413	movl	8(%esi),%ecx
1414	subl	%eax,%ecx
1415	movl	%ecx,8(%ebx)
1416	jnc	.L045pw_tail_nc2
1417	decl	%ebp
1418	jz	.L029pw_end
1419
1420	movl	12(%esi),%ecx
1421	subl	%eax,%ecx
1422	movl	%ecx,12(%ebx)
1423	jnc	.L046pw_tail_nc3
1424	decl	%ebp
1425	jz	.L029pw_end
1426
1427	movl	16(%esi),%ecx
1428	subl	%eax,%ecx
1429	movl	%ecx,16(%ebx)
1430	jnc	.L047pw_tail_nc4
1431	decl	%ebp
1432	jz	.L029pw_end
1433
1434	movl	20(%esi),%ecx
1435	subl	%eax,%ecx
1436	movl	%ecx,20(%ebx)
1437	jnc	.L048pw_tail_nc5
1438	decl	%ebp
1439	jz	.L029pw_end
1440
1441	movl	24(%esi),%ecx
1442	subl	%eax,%ecx
1443	movl	%ecx,24(%ebx)
1444	jnc	.L049pw_tail_nc6
1445	movl	$1,%eax
1446	jmp	.L029pw_end
1447.L050pw_nc_loop:
1448	movl	(%esi),%ecx
1449	movl	%ecx,(%ebx)
1450.L035pw_nc0:
1451	movl	4(%esi),%ecx
1452	movl	%ecx,4(%ebx)
1453.L036pw_nc1:
1454	movl	8(%esi),%ecx
1455	movl	%ecx,8(%ebx)
1456.L037pw_nc2:
1457	movl	12(%esi),%ecx
1458	movl	%ecx,12(%ebx)
1459.L038pw_nc3:
1460	movl	16(%esi),%ecx
1461	movl	%ecx,16(%ebx)
1462.L039pw_nc4:
1463	movl	20(%esi),%ecx
1464	movl	%ecx,20(%ebx)
1465.L040pw_nc5:
1466	movl	24(%esi),%ecx
1467	movl	%ecx,24(%ebx)
1468.L041pw_nc6:
1469	movl	28(%esi),%ecx
1470	movl	%ecx,28(%ebx)
1471.L042pw_nc7:
1472
1473	addl	$32,%esi
1474	addl	$32,%ebx
1475	subl	$8,%ebp
1476	jnz	.L050pw_nc_loop
1477	movl	36(%esp),%ebp
1478	andl	$7,%ebp
1479	jz	.L051pw_nc_end
1480	movl	(%esi),%ecx
1481	movl	%ecx,(%ebx)
1482.L043pw_tail_nc0:
1483	decl	%ebp
1484	jz	.L051pw_nc_end
1485	movl	4(%esi),%ecx
1486	movl	%ecx,4(%ebx)
1487.L044pw_tail_nc1:
1488	decl	%ebp
1489	jz	.L051pw_nc_end
1490	movl	8(%esi),%ecx
1491	movl	%ecx,8(%ebx)
1492.L045pw_tail_nc2:
1493	decl	%ebp
1494	jz	.L051pw_nc_end
1495	movl	12(%esi),%ecx
1496	movl	%ecx,12(%ebx)
1497.L046pw_tail_nc3:
1498	decl	%ebp
1499	jz	.L051pw_nc_end
1500	movl	16(%esi),%ecx
1501	movl	%ecx,16(%ebx)
1502.L047pw_tail_nc4:
1503	decl	%ebp
1504	jz	.L051pw_nc_end
1505	movl	20(%esi),%ecx
1506	movl	%ecx,20(%ebx)
1507.L048pw_tail_nc5:
1508	decl	%ebp
1509	jz	.L051pw_nc_end
1510	movl	24(%esi),%ecx
1511	movl	%ecx,24(%ebx)
1512.L049pw_tail_nc6:
1513.L051pw_nc_end:
1514	movl	$0,%eax
1515.L029pw_end:
1516	popl	%edi
1517	popl	%esi
1518	popl	%ebx
1519	popl	%ebp
1520	ret
1521.size	bn_sub_part_words,.-.L_bn_sub_part_words_begin
1522.comm	OPENSSL_ia32cap_P,8,4
1523