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