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