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