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