xref: /freebsd/sys/crypto/openssl/amd64/x86_64-mont5.S (revision a90b9d0159070121c221b966469c3e36d912bf82)
1/* Do not modify. This file is auto-generated from x86_64-mont5.pl. */
2.text
3
4
5
6.globl	bn_mul_mont_gather5
7.type	bn_mul_mont_gather5,@function
8.align	64
9bn_mul_mont_gather5:
10.cfi_startproc
11	movl	%r9d,%r9d
12	movq	%rsp,%rax
13.cfi_def_cfa_register	%rax
14	testl	$7,%r9d
15	jnz	.Lmul_enter
16	movl	OPENSSL_ia32cap_P+8(%rip),%r11d
17	jmp	.Lmul4x_enter
18
19.align	16
20.Lmul_enter:
21	movd	8(%rsp),%xmm5
22	pushq	%rbx
23.cfi_offset	%rbx,-16
24	pushq	%rbp
25.cfi_offset	%rbp,-24
26	pushq	%r12
27.cfi_offset	%r12,-32
28	pushq	%r13
29.cfi_offset	%r13,-40
30	pushq	%r14
31.cfi_offset	%r14,-48
32	pushq	%r15
33.cfi_offset	%r15,-56
34
35	negq	%r9
36	movq	%rsp,%r11
37	leaq	-280(%rsp,%r9,8),%r10
38	negq	%r9
39	andq	$-1024,%r10
40
41
42
43
44
45
46
47
48
49	subq	%r10,%r11
50	andq	$-4096,%r11
51	leaq	(%r10,%r11,1),%rsp
52	movq	(%rsp),%r11
53	cmpq	%r10,%rsp
54	ja	.Lmul_page_walk
55	jmp	.Lmul_page_walk_done
56
57.Lmul_page_walk:
58	leaq	-4096(%rsp),%rsp
59	movq	(%rsp),%r11
60	cmpq	%r10,%rsp
61	ja	.Lmul_page_walk
62.Lmul_page_walk_done:
63
64	leaq	.Linc(%rip),%r10
65	movq	%rax,8(%rsp,%r9,8)
66.cfi_escape	0x0f,0x0a,0x77,0x08,0x79,0x00,0x38,0x1e,0x22,0x06,0x23,0x08
67.Lmul_body:
68
69	leaq	128(%rdx),%r12
70	movdqa	0(%r10),%xmm0
71	movdqa	16(%r10),%xmm1
72	leaq	24-112(%rsp,%r9,8),%r10
73	andq	$-16,%r10
74
75	pshufd	$0,%xmm5,%xmm5
76	movdqa	%xmm1,%xmm4
77	movdqa	%xmm1,%xmm2
78	paddd	%xmm0,%xmm1
79	pcmpeqd	%xmm5,%xmm0
80.byte	0x67
81	movdqa	%xmm4,%xmm3
82	paddd	%xmm1,%xmm2
83	pcmpeqd	%xmm5,%xmm1
84	movdqa	%xmm0,112(%r10)
85	movdqa	%xmm4,%xmm0
86
87	paddd	%xmm2,%xmm3
88	pcmpeqd	%xmm5,%xmm2
89	movdqa	%xmm1,128(%r10)
90	movdqa	%xmm4,%xmm1
91
92	paddd	%xmm3,%xmm0
93	pcmpeqd	%xmm5,%xmm3
94	movdqa	%xmm2,144(%r10)
95	movdqa	%xmm4,%xmm2
96
97	paddd	%xmm0,%xmm1
98	pcmpeqd	%xmm5,%xmm0
99	movdqa	%xmm3,160(%r10)
100	movdqa	%xmm4,%xmm3
101	paddd	%xmm1,%xmm2
102	pcmpeqd	%xmm5,%xmm1
103	movdqa	%xmm0,176(%r10)
104	movdqa	%xmm4,%xmm0
105
106	paddd	%xmm2,%xmm3
107	pcmpeqd	%xmm5,%xmm2
108	movdqa	%xmm1,192(%r10)
109	movdqa	%xmm4,%xmm1
110
111	paddd	%xmm3,%xmm0
112	pcmpeqd	%xmm5,%xmm3
113	movdqa	%xmm2,208(%r10)
114	movdqa	%xmm4,%xmm2
115
116	paddd	%xmm0,%xmm1
117	pcmpeqd	%xmm5,%xmm0
118	movdqa	%xmm3,224(%r10)
119	movdqa	%xmm4,%xmm3
120	paddd	%xmm1,%xmm2
121	pcmpeqd	%xmm5,%xmm1
122	movdqa	%xmm0,240(%r10)
123	movdqa	%xmm4,%xmm0
124
125	paddd	%xmm2,%xmm3
126	pcmpeqd	%xmm5,%xmm2
127	movdqa	%xmm1,256(%r10)
128	movdqa	%xmm4,%xmm1
129
130	paddd	%xmm3,%xmm0
131	pcmpeqd	%xmm5,%xmm3
132	movdqa	%xmm2,272(%r10)
133	movdqa	%xmm4,%xmm2
134
135	paddd	%xmm0,%xmm1
136	pcmpeqd	%xmm5,%xmm0
137	movdqa	%xmm3,288(%r10)
138	movdqa	%xmm4,%xmm3
139	paddd	%xmm1,%xmm2
140	pcmpeqd	%xmm5,%xmm1
141	movdqa	%xmm0,304(%r10)
142
143	paddd	%xmm2,%xmm3
144.byte	0x67
145	pcmpeqd	%xmm5,%xmm2
146	movdqa	%xmm1,320(%r10)
147
148	pcmpeqd	%xmm5,%xmm3
149	movdqa	%xmm2,336(%r10)
150	pand	64(%r12),%xmm0
151
152	pand	80(%r12),%xmm1
153	pand	96(%r12),%xmm2
154	movdqa	%xmm3,352(%r10)
155	pand	112(%r12),%xmm3
156	por	%xmm2,%xmm0
157	por	%xmm3,%xmm1
158	movdqa	-128(%r12),%xmm4
159	movdqa	-112(%r12),%xmm5
160	movdqa	-96(%r12),%xmm2
161	pand	112(%r10),%xmm4
162	movdqa	-80(%r12),%xmm3
163	pand	128(%r10),%xmm5
164	por	%xmm4,%xmm0
165	pand	144(%r10),%xmm2
166	por	%xmm5,%xmm1
167	pand	160(%r10),%xmm3
168	por	%xmm2,%xmm0
169	por	%xmm3,%xmm1
170	movdqa	-64(%r12),%xmm4
171	movdqa	-48(%r12),%xmm5
172	movdqa	-32(%r12),%xmm2
173	pand	176(%r10),%xmm4
174	movdqa	-16(%r12),%xmm3
175	pand	192(%r10),%xmm5
176	por	%xmm4,%xmm0
177	pand	208(%r10),%xmm2
178	por	%xmm5,%xmm1
179	pand	224(%r10),%xmm3
180	por	%xmm2,%xmm0
181	por	%xmm3,%xmm1
182	movdqa	0(%r12),%xmm4
183	movdqa	16(%r12),%xmm5
184	movdqa	32(%r12),%xmm2
185	pand	240(%r10),%xmm4
186	movdqa	48(%r12),%xmm3
187	pand	256(%r10),%xmm5
188	por	%xmm4,%xmm0
189	pand	272(%r10),%xmm2
190	por	%xmm5,%xmm1
191	pand	288(%r10),%xmm3
192	por	%xmm2,%xmm0
193	por	%xmm3,%xmm1
194	por	%xmm1,%xmm0
195	pshufd	$0x4e,%xmm0,%xmm1
196	por	%xmm1,%xmm0
197	leaq	256(%r12),%r12
198.byte	102,72,15,126,195
199
200	movq	(%r8),%r8
201	movq	(%rsi),%rax
202
203	xorq	%r14,%r14
204	xorq	%r15,%r15
205
206	movq	%r8,%rbp
207	mulq	%rbx
208	movq	%rax,%r10
209	movq	(%rcx),%rax
210
211	imulq	%r10,%rbp
212	movq	%rdx,%r11
213
214	mulq	%rbp
215	addq	%rax,%r10
216	movq	8(%rsi),%rax
217	adcq	$0,%rdx
218	movq	%rdx,%r13
219
220	leaq	1(%r15),%r15
221	jmp	.L1st_enter
222
223.align	16
224.L1st:
225	addq	%rax,%r13
226	movq	(%rsi,%r15,8),%rax
227	adcq	$0,%rdx
228	addq	%r11,%r13
229	movq	%r10,%r11
230	adcq	$0,%rdx
231	movq	%r13,-16(%rsp,%r15,8)
232	movq	%rdx,%r13
233
234.L1st_enter:
235	mulq	%rbx
236	addq	%rax,%r11
237	movq	(%rcx,%r15,8),%rax
238	adcq	$0,%rdx
239	leaq	1(%r15),%r15
240	movq	%rdx,%r10
241
242	mulq	%rbp
243	cmpq	%r9,%r15
244	jne	.L1st
245
246
247	addq	%rax,%r13
248	adcq	$0,%rdx
249	addq	%r11,%r13
250	adcq	$0,%rdx
251	movq	%r13,-16(%rsp,%r9,8)
252	movq	%rdx,%r13
253	movq	%r10,%r11
254
255	xorq	%rdx,%rdx
256	addq	%r11,%r13
257	adcq	$0,%rdx
258	movq	%r13,-8(%rsp,%r9,8)
259	movq	%rdx,(%rsp,%r9,8)
260
261	leaq	1(%r14),%r14
262	jmp	.Louter
263.align	16
264.Louter:
265	leaq	24+128(%rsp,%r9,8),%rdx
266	andq	$-16,%rdx
267	pxor	%xmm4,%xmm4
268	pxor	%xmm5,%xmm5
269	movdqa	-128(%r12),%xmm0
270	movdqa	-112(%r12),%xmm1
271	movdqa	-96(%r12),%xmm2
272	movdqa	-80(%r12),%xmm3
273	pand	-128(%rdx),%xmm0
274	pand	-112(%rdx),%xmm1
275	por	%xmm0,%xmm4
276	pand	-96(%rdx),%xmm2
277	por	%xmm1,%xmm5
278	pand	-80(%rdx),%xmm3
279	por	%xmm2,%xmm4
280	por	%xmm3,%xmm5
281	movdqa	-64(%r12),%xmm0
282	movdqa	-48(%r12),%xmm1
283	movdqa	-32(%r12),%xmm2
284	movdqa	-16(%r12),%xmm3
285	pand	-64(%rdx),%xmm0
286	pand	-48(%rdx),%xmm1
287	por	%xmm0,%xmm4
288	pand	-32(%rdx),%xmm2
289	por	%xmm1,%xmm5
290	pand	-16(%rdx),%xmm3
291	por	%xmm2,%xmm4
292	por	%xmm3,%xmm5
293	movdqa	0(%r12),%xmm0
294	movdqa	16(%r12),%xmm1
295	movdqa	32(%r12),%xmm2
296	movdqa	48(%r12),%xmm3
297	pand	0(%rdx),%xmm0
298	pand	16(%rdx),%xmm1
299	por	%xmm0,%xmm4
300	pand	32(%rdx),%xmm2
301	por	%xmm1,%xmm5
302	pand	48(%rdx),%xmm3
303	por	%xmm2,%xmm4
304	por	%xmm3,%xmm5
305	movdqa	64(%r12),%xmm0
306	movdqa	80(%r12),%xmm1
307	movdqa	96(%r12),%xmm2
308	movdqa	112(%r12),%xmm3
309	pand	64(%rdx),%xmm0
310	pand	80(%rdx),%xmm1
311	por	%xmm0,%xmm4
312	pand	96(%rdx),%xmm2
313	por	%xmm1,%xmm5
314	pand	112(%rdx),%xmm3
315	por	%xmm2,%xmm4
316	por	%xmm3,%xmm5
317	por	%xmm5,%xmm4
318	pshufd	$0x4e,%xmm4,%xmm0
319	por	%xmm4,%xmm0
320	leaq	256(%r12),%r12
321
322	movq	(%rsi),%rax
323.byte	102,72,15,126,195
324
325	xorq	%r15,%r15
326	movq	%r8,%rbp
327	movq	(%rsp),%r10
328
329	mulq	%rbx
330	addq	%rax,%r10
331	movq	(%rcx),%rax
332	adcq	$0,%rdx
333
334	imulq	%r10,%rbp
335	movq	%rdx,%r11
336
337	mulq	%rbp
338	addq	%rax,%r10
339	movq	8(%rsi),%rax
340	adcq	$0,%rdx
341	movq	8(%rsp),%r10
342	movq	%rdx,%r13
343
344	leaq	1(%r15),%r15
345	jmp	.Linner_enter
346
347.align	16
348.Linner:
349	addq	%rax,%r13
350	movq	(%rsi,%r15,8),%rax
351	adcq	$0,%rdx
352	addq	%r10,%r13
353	movq	(%rsp,%r15,8),%r10
354	adcq	$0,%rdx
355	movq	%r13,-16(%rsp,%r15,8)
356	movq	%rdx,%r13
357
358.Linner_enter:
359	mulq	%rbx
360	addq	%rax,%r11
361	movq	(%rcx,%r15,8),%rax
362	adcq	$0,%rdx
363	addq	%r11,%r10
364	movq	%rdx,%r11
365	adcq	$0,%r11
366	leaq	1(%r15),%r15
367
368	mulq	%rbp
369	cmpq	%r9,%r15
370	jne	.Linner
371
372	addq	%rax,%r13
373	adcq	$0,%rdx
374	addq	%r10,%r13
375	movq	(%rsp,%r9,8),%r10
376	adcq	$0,%rdx
377	movq	%r13,-16(%rsp,%r9,8)
378	movq	%rdx,%r13
379
380	xorq	%rdx,%rdx
381	addq	%r11,%r13
382	adcq	$0,%rdx
383	addq	%r10,%r13
384	adcq	$0,%rdx
385	movq	%r13,-8(%rsp,%r9,8)
386	movq	%rdx,(%rsp,%r9,8)
387
388	leaq	1(%r14),%r14
389	cmpq	%r9,%r14
390	jb	.Louter
391
392	xorq	%r14,%r14
393	movq	(%rsp),%rax
394	leaq	(%rsp),%rsi
395	movq	%r9,%r15
396	jmp	.Lsub
397.align	16
398.Lsub:	sbbq	(%rcx,%r14,8),%rax
399	movq	%rax,(%rdi,%r14,8)
400	movq	8(%rsi,%r14,8),%rax
401	leaq	1(%r14),%r14
402	decq	%r15
403	jnz	.Lsub
404
405	sbbq	$0,%rax
406	movq	$-1,%rbx
407	xorq	%rax,%rbx
408	xorq	%r14,%r14
409	movq	%r9,%r15
410
411.Lcopy:
412	movq	(%rdi,%r14,8),%rcx
413	movq	(%rsp,%r14,8),%rdx
414	andq	%rbx,%rcx
415	andq	%rax,%rdx
416	movq	%r14,(%rsp,%r14,8)
417	orq	%rcx,%rdx
418	movq	%rdx,(%rdi,%r14,8)
419	leaq	1(%r14),%r14
420	subq	$1,%r15
421	jnz	.Lcopy
422
423	movq	8(%rsp,%r9,8),%rsi
424.cfi_def_cfa	%rsi,8
425	movq	$1,%rax
426
427	movq	-48(%rsi),%r15
428.cfi_restore	%r15
429	movq	-40(%rsi),%r14
430.cfi_restore	%r14
431	movq	-32(%rsi),%r13
432.cfi_restore	%r13
433	movq	-24(%rsi),%r12
434.cfi_restore	%r12
435	movq	-16(%rsi),%rbp
436.cfi_restore	%rbp
437	movq	-8(%rsi),%rbx
438.cfi_restore	%rbx
439	leaq	(%rsi),%rsp
440.cfi_def_cfa_register	%rsp
441.Lmul_epilogue:
442	.byte	0xf3,0xc3
443.cfi_endproc
444.size	bn_mul_mont_gather5,.-bn_mul_mont_gather5
445.type	bn_mul4x_mont_gather5,@function
446.align	32
447bn_mul4x_mont_gather5:
448.cfi_startproc
449.byte	0x67
450	movq	%rsp,%rax
451.cfi_def_cfa_register	%rax
452.Lmul4x_enter:
453	andl	$0x80108,%r11d
454	cmpl	$0x80108,%r11d
455	je	.Lmulx4x_enter
456	pushq	%rbx
457.cfi_offset	%rbx,-16
458	pushq	%rbp
459.cfi_offset	%rbp,-24
460	pushq	%r12
461.cfi_offset	%r12,-32
462	pushq	%r13
463.cfi_offset	%r13,-40
464	pushq	%r14
465.cfi_offset	%r14,-48
466	pushq	%r15
467.cfi_offset	%r15,-56
468.Lmul4x_prologue:
469
470.byte	0x67
471	shll	$3,%r9d
472	leaq	(%r9,%r9,2),%r10
473	negq	%r9
474
475
476
477
478
479
480
481
482
483
484	leaq	-320(%rsp,%r9,2),%r11
485	movq	%rsp,%rbp
486	subq	%rdi,%r11
487	andq	$4095,%r11
488	cmpq	%r11,%r10
489	jb	.Lmul4xsp_alt
490	subq	%r11,%rbp
491	leaq	-320(%rbp,%r9,2),%rbp
492	jmp	.Lmul4xsp_done
493
494.align	32
495.Lmul4xsp_alt:
496	leaq	4096-320(,%r9,2),%r10
497	leaq	-320(%rbp,%r9,2),%rbp
498	subq	%r10,%r11
499	movq	$0,%r10
500	cmovcq	%r10,%r11
501	subq	%r11,%rbp
502.Lmul4xsp_done:
503	andq	$-64,%rbp
504	movq	%rsp,%r11
505	subq	%rbp,%r11
506	andq	$-4096,%r11
507	leaq	(%r11,%rbp,1),%rsp
508	movq	(%rsp),%r10
509	cmpq	%rbp,%rsp
510	ja	.Lmul4x_page_walk
511	jmp	.Lmul4x_page_walk_done
512
513.Lmul4x_page_walk:
514	leaq	-4096(%rsp),%rsp
515	movq	(%rsp),%r10
516	cmpq	%rbp,%rsp
517	ja	.Lmul4x_page_walk
518.Lmul4x_page_walk_done:
519
520	negq	%r9
521
522	movq	%rax,40(%rsp)
523.cfi_escape	0x0f,0x05,0x77,0x28,0x06,0x23,0x08
524.Lmul4x_body:
525
526	call	mul4x_internal
527
528	movq	40(%rsp),%rsi
529.cfi_def_cfa	%rsi,8
530	movq	$1,%rax
531
532	movq	-48(%rsi),%r15
533.cfi_restore	%r15
534	movq	-40(%rsi),%r14
535.cfi_restore	%r14
536	movq	-32(%rsi),%r13
537.cfi_restore	%r13
538	movq	-24(%rsi),%r12
539.cfi_restore	%r12
540	movq	-16(%rsi),%rbp
541.cfi_restore	%rbp
542	movq	-8(%rsi),%rbx
543.cfi_restore	%rbx
544	leaq	(%rsi),%rsp
545.cfi_def_cfa_register	%rsp
546.Lmul4x_epilogue:
547	.byte	0xf3,0xc3
548.cfi_endproc
549.size	bn_mul4x_mont_gather5,.-bn_mul4x_mont_gather5
550
551.type	mul4x_internal,@function
552.align	32
553mul4x_internal:
554.cfi_startproc
555	shlq	$5,%r9
556	movd	8(%rax),%xmm5
557	leaq	.Linc(%rip),%rax
558	leaq	128(%rdx,%r9,1),%r13
559	shrq	$5,%r9
560	movdqa	0(%rax),%xmm0
561	movdqa	16(%rax),%xmm1
562	leaq	88-112(%rsp,%r9,1),%r10
563	leaq	128(%rdx),%r12
564
565	pshufd	$0,%xmm5,%xmm5
566	movdqa	%xmm1,%xmm4
567.byte	0x67,0x67
568	movdqa	%xmm1,%xmm2
569	paddd	%xmm0,%xmm1
570	pcmpeqd	%xmm5,%xmm0
571.byte	0x67
572	movdqa	%xmm4,%xmm3
573	paddd	%xmm1,%xmm2
574	pcmpeqd	%xmm5,%xmm1
575	movdqa	%xmm0,112(%r10)
576	movdqa	%xmm4,%xmm0
577
578	paddd	%xmm2,%xmm3
579	pcmpeqd	%xmm5,%xmm2
580	movdqa	%xmm1,128(%r10)
581	movdqa	%xmm4,%xmm1
582
583	paddd	%xmm3,%xmm0
584	pcmpeqd	%xmm5,%xmm3
585	movdqa	%xmm2,144(%r10)
586	movdqa	%xmm4,%xmm2
587
588	paddd	%xmm0,%xmm1
589	pcmpeqd	%xmm5,%xmm0
590	movdqa	%xmm3,160(%r10)
591	movdqa	%xmm4,%xmm3
592	paddd	%xmm1,%xmm2
593	pcmpeqd	%xmm5,%xmm1
594	movdqa	%xmm0,176(%r10)
595	movdqa	%xmm4,%xmm0
596
597	paddd	%xmm2,%xmm3
598	pcmpeqd	%xmm5,%xmm2
599	movdqa	%xmm1,192(%r10)
600	movdqa	%xmm4,%xmm1
601
602	paddd	%xmm3,%xmm0
603	pcmpeqd	%xmm5,%xmm3
604	movdqa	%xmm2,208(%r10)
605	movdqa	%xmm4,%xmm2
606
607	paddd	%xmm0,%xmm1
608	pcmpeqd	%xmm5,%xmm0
609	movdqa	%xmm3,224(%r10)
610	movdqa	%xmm4,%xmm3
611	paddd	%xmm1,%xmm2
612	pcmpeqd	%xmm5,%xmm1
613	movdqa	%xmm0,240(%r10)
614	movdqa	%xmm4,%xmm0
615
616	paddd	%xmm2,%xmm3
617	pcmpeqd	%xmm5,%xmm2
618	movdqa	%xmm1,256(%r10)
619	movdqa	%xmm4,%xmm1
620
621	paddd	%xmm3,%xmm0
622	pcmpeqd	%xmm5,%xmm3
623	movdqa	%xmm2,272(%r10)
624	movdqa	%xmm4,%xmm2
625
626	paddd	%xmm0,%xmm1
627	pcmpeqd	%xmm5,%xmm0
628	movdqa	%xmm3,288(%r10)
629	movdqa	%xmm4,%xmm3
630	paddd	%xmm1,%xmm2
631	pcmpeqd	%xmm5,%xmm1
632	movdqa	%xmm0,304(%r10)
633
634	paddd	%xmm2,%xmm3
635.byte	0x67
636	pcmpeqd	%xmm5,%xmm2
637	movdqa	%xmm1,320(%r10)
638
639	pcmpeqd	%xmm5,%xmm3
640	movdqa	%xmm2,336(%r10)
641	pand	64(%r12),%xmm0
642
643	pand	80(%r12),%xmm1
644	pand	96(%r12),%xmm2
645	movdqa	%xmm3,352(%r10)
646	pand	112(%r12),%xmm3
647	por	%xmm2,%xmm0
648	por	%xmm3,%xmm1
649	movdqa	-128(%r12),%xmm4
650	movdqa	-112(%r12),%xmm5
651	movdqa	-96(%r12),%xmm2
652	pand	112(%r10),%xmm4
653	movdqa	-80(%r12),%xmm3
654	pand	128(%r10),%xmm5
655	por	%xmm4,%xmm0
656	pand	144(%r10),%xmm2
657	por	%xmm5,%xmm1
658	pand	160(%r10),%xmm3
659	por	%xmm2,%xmm0
660	por	%xmm3,%xmm1
661	movdqa	-64(%r12),%xmm4
662	movdqa	-48(%r12),%xmm5
663	movdqa	-32(%r12),%xmm2
664	pand	176(%r10),%xmm4
665	movdqa	-16(%r12),%xmm3
666	pand	192(%r10),%xmm5
667	por	%xmm4,%xmm0
668	pand	208(%r10),%xmm2
669	por	%xmm5,%xmm1
670	pand	224(%r10),%xmm3
671	por	%xmm2,%xmm0
672	por	%xmm3,%xmm1
673	movdqa	0(%r12),%xmm4
674	movdqa	16(%r12),%xmm5
675	movdqa	32(%r12),%xmm2
676	pand	240(%r10),%xmm4
677	movdqa	48(%r12),%xmm3
678	pand	256(%r10),%xmm5
679	por	%xmm4,%xmm0
680	pand	272(%r10),%xmm2
681	por	%xmm5,%xmm1
682	pand	288(%r10),%xmm3
683	por	%xmm2,%xmm0
684	por	%xmm3,%xmm1
685	por	%xmm1,%xmm0
686	pshufd	$0x4e,%xmm0,%xmm1
687	por	%xmm1,%xmm0
688	leaq	256(%r12),%r12
689.byte	102,72,15,126,195
690
691	movq	%r13,16+8(%rsp)
692	movq	%rdi,56+8(%rsp)
693
694	movq	(%r8),%r8
695	movq	(%rsi),%rax
696	leaq	(%rsi,%r9,1),%rsi
697	negq	%r9
698
699	movq	%r8,%rbp
700	mulq	%rbx
701	movq	%rax,%r10
702	movq	(%rcx),%rax
703
704	imulq	%r10,%rbp
705	leaq	64+8(%rsp),%r14
706	movq	%rdx,%r11
707
708	mulq	%rbp
709	addq	%rax,%r10
710	movq	8(%rsi,%r9,1),%rax
711	adcq	$0,%rdx
712	movq	%rdx,%rdi
713
714	mulq	%rbx
715	addq	%rax,%r11
716	movq	8(%rcx),%rax
717	adcq	$0,%rdx
718	movq	%rdx,%r10
719
720	mulq	%rbp
721	addq	%rax,%rdi
722	movq	16(%rsi,%r9,1),%rax
723	adcq	$0,%rdx
724	addq	%r11,%rdi
725	leaq	32(%r9),%r15
726	leaq	32(%rcx),%rcx
727	adcq	$0,%rdx
728	movq	%rdi,(%r14)
729	movq	%rdx,%r13
730	jmp	.L1st4x
731
732.align	32
733.L1st4x:
734	mulq	%rbx
735	addq	%rax,%r10
736	movq	-16(%rcx),%rax
737	leaq	32(%r14),%r14
738	adcq	$0,%rdx
739	movq	%rdx,%r11
740
741	mulq	%rbp
742	addq	%rax,%r13
743	movq	-8(%rsi,%r15,1),%rax
744	adcq	$0,%rdx
745	addq	%r10,%r13
746	adcq	$0,%rdx
747	movq	%r13,-24(%r14)
748	movq	%rdx,%rdi
749
750	mulq	%rbx
751	addq	%rax,%r11
752	movq	-8(%rcx),%rax
753	adcq	$0,%rdx
754	movq	%rdx,%r10
755
756	mulq	%rbp
757	addq	%rax,%rdi
758	movq	(%rsi,%r15,1),%rax
759	adcq	$0,%rdx
760	addq	%r11,%rdi
761	adcq	$0,%rdx
762	movq	%rdi,-16(%r14)
763	movq	%rdx,%r13
764
765	mulq	%rbx
766	addq	%rax,%r10
767	movq	0(%rcx),%rax
768	adcq	$0,%rdx
769	movq	%rdx,%r11
770
771	mulq	%rbp
772	addq	%rax,%r13
773	movq	8(%rsi,%r15,1),%rax
774	adcq	$0,%rdx
775	addq	%r10,%r13
776	adcq	$0,%rdx
777	movq	%r13,-8(%r14)
778	movq	%rdx,%rdi
779
780	mulq	%rbx
781	addq	%rax,%r11
782	movq	8(%rcx),%rax
783	adcq	$0,%rdx
784	movq	%rdx,%r10
785
786	mulq	%rbp
787	addq	%rax,%rdi
788	movq	16(%rsi,%r15,1),%rax
789	adcq	$0,%rdx
790	addq	%r11,%rdi
791	leaq	32(%rcx),%rcx
792	adcq	$0,%rdx
793	movq	%rdi,(%r14)
794	movq	%rdx,%r13
795
796	addq	$32,%r15
797	jnz	.L1st4x
798
799	mulq	%rbx
800	addq	%rax,%r10
801	movq	-16(%rcx),%rax
802	leaq	32(%r14),%r14
803	adcq	$0,%rdx
804	movq	%rdx,%r11
805
806	mulq	%rbp
807	addq	%rax,%r13
808	movq	-8(%rsi),%rax
809	adcq	$0,%rdx
810	addq	%r10,%r13
811	adcq	$0,%rdx
812	movq	%r13,-24(%r14)
813	movq	%rdx,%rdi
814
815	mulq	%rbx
816	addq	%rax,%r11
817	movq	-8(%rcx),%rax
818	adcq	$0,%rdx
819	movq	%rdx,%r10
820
821	mulq	%rbp
822	addq	%rax,%rdi
823	movq	(%rsi,%r9,1),%rax
824	adcq	$0,%rdx
825	addq	%r11,%rdi
826	adcq	$0,%rdx
827	movq	%rdi,-16(%r14)
828	movq	%rdx,%r13
829
830	leaq	(%rcx,%r9,1),%rcx
831
832	xorq	%rdi,%rdi
833	addq	%r10,%r13
834	adcq	$0,%rdi
835	movq	%r13,-8(%r14)
836
837	jmp	.Louter4x
838
839.align	32
840.Louter4x:
841	leaq	16+128(%r14),%rdx
842	pxor	%xmm4,%xmm4
843	pxor	%xmm5,%xmm5
844	movdqa	-128(%r12),%xmm0
845	movdqa	-112(%r12),%xmm1
846	movdqa	-96(%r12),%xmm2
847	movdqa	-80(%r12),%xmm3
848	pand	-128(%rdx),%xmm0
849	pand	-112(%rdx),%xmm1
850	por	%xmm0,%xmm4
851	pand	-96(%rdx),%xmm2
852	por	%xmm1,%xmm5
853	pand	-80(%rdx),%xmm3
854	por	%xmm2,%xmm4
855	por	%xmm3,%xmm5
856	movdqa	-64(%r12),%xmm0
857	movdqa	-48(%r12),%xmm1
858	movdqa	-32(%r12),%xmm2
859	movdqa	-16(%r12),%xmm3
860	pand	-64(%rdx),%xmm0
861	pand	-48(%rdx),%xmm1
862	por	%xmm0,%xmm4
863	pand	-32(%rdx),%xmm2
864	por	%xmm1,%xmm5
865	pand	-16(%rdx),%xmm3
866	por	%xmm2,%xmm4
867	por	%xmm3,%xmm5
868	movdqa	0(%r12),%xmm0
869	movdqa	16(%r12),%xmm1
870	movdqa	32(%r12),%xmm2
871	movdqa	48(%r12),%xmm3
872	pand	0(%rdx),%xmm0
873	pand	16(%rdx),%xmm1
874	por	%xmm0,%xmm4
875	pand	32(%rdx),%xmm2
876	por	%xmm1,%xmm5
877	pand	48(%rdx),%xmm3
878	por	%xmm2,%xmm4
879	por	%xmm3,%xmm5
880	movdqa	64(%r12),%xmm0
881	movdqa	80(%r12),%xmm1
882	movdqa	96(%r12),%xmm2
883	movdqa	112(%r12),%xmm3
884	pand	64(%rdx),%xmm0
885	pand	80(%rdx),%xmm1
886	por	%xmm0,%xmm4
887	pand	96(%rdx),%xmm2
888	por	%xmm1,%xmm5
889	pand	112(%rdx),%xmm3
890	por	%xmm2,%xmm4
891	por	%xmm3,%xmm5
892	por	%xmm5,%xmm4
893	pshufd	$0x4e,%xmm4,%xmm0
894	por	%xmm4,%xmm0
895	leaq	256(%r12),%r12
896.byte	102,72,15,126,195
897
898	movq	(%r14,%r9,1),%r10
899	movq	%r8,%rbp
900	mulq	%rbx
901	addq	%rax,%r10
902	movq	(%rcx),%rax
903	adcq	$0,%rdx
904
905	imulq	%r10,%rbp
906	movq	%rdx,%r11
907	movq	%rdi,(%r14)
908
909	leaq	(%r14,%r9,1),%r14
910
911	mulq	%rbp
912	addq	%rax,%r10
913	movq	8(%rsi,%r9,1),%rax
914	adcq	$0,%rdx
915	movq	%rdx,%rdi
916
917	mulq	%rbx
918	addq	%rax,%r11
919	movq	8(%rcx),%rax
920	adcq	$0,%rdx
921	addq	8(%r14),%r11
922	adcq	$0,%rdx
923	movq	%rdx,%r10
924
925	mulq	%rbp
926	addq	%rax,%rdi
927	movq	16(%rsi,%r9,1),%rax
928	adcq	$0,%rdx
929	addq	%r11,%rdi
930	leaq	32(%r9),%r15
931	leaq	32(%rcx),%rcx
932	adcq	$0,%rdx
933	movq	%rdx,%r13
934	jmp	.Linner4x
935
936.align	32
937.Linner4x:
938	mulq	%rbx
939	addq	%rax,%r10
940	movq	-16(%rcx),%rax
941	adcq	$0,%rdx
942	addq	16(%r14),%r10
943	leaq	32(%r14),%r14
944	adcq	$0,%rdx
945	movq	%rdx,%r11
946
947	mulq	%rbp
948	addq	%rax,%r13
949	movq	-8(%rsi,%r15,1),%rax
950	adcq	$0,%rdx
951	addq	%r10,%r13
952	adcq	$0,%rdx
953	movq	%rdi,-32(%r14)
954	movq	%rdx,%rdi
955
956	mulq	%rbx
957	addq	%rax,%r11
958	movq	-8(%rcx),%rax
959	adcq	$0,%rdx
960	addq	-8(%r14),%r11
961	adcq	$0,%rdx
962	movq	%rdx,%r10
963
964	mulq	%rbp
965	addq	%rax,%rdi
966	movq	(%rsi,%r15,1),%rax
967	adcq	$0,%rdx
968	addq	%r11,%rdi
969	adcq	$0,%rdx
970	movq	%r13,-24(%r14)
971	movq	%rdx,%r13
972
973	mulq	%rbx
974	addq	%rax,%r10
975	movq	0(%rcx),%rax
976	adcq	$0,%rdx
977	addq	(%r14),%r10
978	adcq	$0,%rdx
979	movq	%rdx,%r11
980
981	mulq	%rbp
982	addq	%rax,%r13
983	movq	8(%rsi,%r15,1),%rax
984	adcq	$0,%rdx
985	addq	%r10,%r13
986	adcq	$0,%rdx
987	movq	%rdi,-16(%r14)
988	movq	%rdx,%rdi
989
990	mulq	%rbx
991	addq	%rax,%r11
992	movq	8(%rcx),%rax
993	adcq	$0,%rdx
994	addq	8(%r14),%r11
995	adcq	$0,%rdx
996	movq	%rdx,%r10
997
998	mulq	%rbp
999	addq	%rax,%rdi
1000	movq	16(%rsi,%r15,1),%rax
1001	adcq	$0,%rdx
1002	addq	%r11,%rdi
1003	leaq	32(%rcx),%rcx
1004	adcq	$0,%rdx
1005	movq	%r13,-8(%r14)
1006	movq	%rdx,%r13
1007
1008	addq	$32,%r15
1009	jnz	.Linner4x
1010
1011	mulq	%rbx
1012	addq	%rax,%r10
1013	movq	-16(%rcx),%rax
1014	adcq	$0,%rdx
1015	addq	16(%r14),%r10
1016	leaq	32(%r14),%r14
1017	adcq	$0,%rdx
1018	movq	%rdx,%r11
1019
1020	mulq	%rbp
1021	addq	%rax,%r13
1022	movq	-8(%rsi),%rax
1023	adcq	$0,%rdx
1024	addq	%r10,%r13
1025	adcq	$0,%rdx
1026	movq	%rdi,-32(%r14)
1027	movq	%rdx,%rdi
1028
1029	mulq	%rbx
1030	addq	%rax,%r11
1031	movq	%rbp,%rax
1032	movq	-8(%rcx),%rbp
1033	adcq	$0,%rdx
1034	addq	-8(%r14),%r11
1035	adcq	$0,%rdx
1036	movq	%rdx,%r10
1037
1038	mulq	%rbp
1039	addq	%rax,%rdi
1040	movq	(%rsi,%r9,1),%rax
1041	adcq	$0,%rdx
1042	addq	%r11,%rdi
1043	adcq	$0,%rdx
1044	movq	%r13,-24(%r14)
1045	movq	%rdx,%r13
1046
1047	movq	%rdi,-16(%r14)
1048	leaq	(%rcx,%r9,1),%rcx
1049
1050	xorq	%rdi,%rdi
1051	addq	%r10,%r13
1052	adcq	$0,%rdi
1053	addq	(%r14),%r13
1054	adcq	$0,%rdi
1055	movq	%r13,-8(%r14)
1056
1057	cmpq	16+8(%rsp),%r12
1058	jb	.Louter4x
1059	xorq	%rax,%rax
1060	subq	%r13,%rbp
1061	adcq	%r15,%r15
1062	orq	%r15,%rdi
1063	subq	%rdi,%rax
1064	leaq	(%r14,%r9,1),%rbx
1065	movq	(%rcx),%r12
1066	leaq	(%rcx),%rbp
1067	movq	%r9,%rcx
1068	sarq	$3+2,%rcx
1069	movq	56+8(%rsp),%rdi
1070	decq	%r12
1071	xorq	%r10,%r10
1072	movq	8(%rbp),%r13
1073	movq	16(%rbp),%r14
1074	movq	24(%rbp),%r15
1075	jmp	.Lsqr4x_sub_entry
1076.cfi_endproc
1077.size	mul4x_internal,.-mul4x_internal
1078.globl	bn_power5
1079.type	bn_power5,@function
1080.align	32
1081bn_power5:
1082.cfi_startproc
1083	movq	%rsp,%rax
1084.cfi_def_cfa_register	%rax
1085	movl	OPENSSL_ia32cap_P+8(%rip),%r11d
1086	andl	$0x80108,%r11d
1087	cmpl	$0x80108,%r11d
1088	je	.Lpowerx5_enter
1089	pushq	%rbx
1090.cfi_offset	%rbx,-16
1091	pushq	%rbp
1092.cfi_offset	%rbp,-24
1093	pushq	%r12
1094.cfi_offset	%r12,-32
1095	pushq	%r13
1096.cfi_offset	%r13,-40
1097	pushq	%r14
1098.cfi_offset	%r14,-48
1099	pushq	%r15
1100.cfi_offset	%r15,-56
1101.Lpower5_prologue:
1102
1103	shll	$3,%r9d
1104	leal	(%r9,%r9,2),%r10d
1105	negq	%r9
1106	movq	(%r8),%r8
1107
1108
1109
1110
1111
1112
1113
1114
1115	leaq	-320(%rsp,%r9,2),%r11
1116	movq	%rsp,%rbp
1117	subq	%rdi,%r11
1118	andq	$4095,%r11
1119	cmpq	%r11,%r10
1120	jb	.Lpwr_sp_alt
1121	subq	%r11,%rbp
1122	leaq	-320(%rbp,%r9,2),%rbp
1123	jmp	.Lpwr_sp_done
1124
1125.align	32
1126.Lpwr_sp_alt:
1127	leaq	4096-320(,%r9,2),%r10
1128	leaq	-320(%rbp,%r9,2),%rbp
1129	subq	%r10,%r11
1130	movq	$0,%r10
1131	cmovcq	%r10,%r11
1132	subq	%r11,%rbp
1133.Lpwr_sp_done:
1134	andq	$-64,%rbp
1135	movq	%rsp,%r11
1136	subq	%rbp,%r11
1137	andq	$-4096,%r11
1138	leaq	(%r11,%rbp,1),%rsp
1139	movq	(%rsp),%r10
1140	cmpq	%rbp,%rsp
1141	ja	.Lpwr_page_walk
1142	jmp	.Lpwr_page_walk_done
1143
1144.Lpwr_page_walk:
1145	leaq	-4096(%rsp),%rsp
1146	movq	(%rsp),%r10
1147	cmpq	%rbp,%rsp
1148	ja	.Lpwr_page_walk
1149.Lpwr_page_walk_done:
1150
1151	movq	%r9,%r10
1152	negq	%r9
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163	movq	%r8,32(%rsp)
1164	movq	%rax,40(%rsp)
1165.cfi_escape	0x0f,0x05,0x77,0x28,0x06,0x23,0x08
1166.Lpower5_body:
1167.byte	102,72,15,110,207
1168.byte	102,72,15,110,209
1169.byte	102,73,15,110,218
1170.byte	102,72,15,110,226
1171
1172	call	__bn_sqr8x_internal
1173	call	__bn_post4x_internal
1174	call	__bn_sqr8x_internal
1175	call	__bn_post4x_internal
1176	call	__bn_sqr8x_internal
1177	call	__bn_post4x_internal
1178	call	__bn_sqr8x_internal
1179	call	__bn_post4x_internal
1180	call	__bn_sqr8x_internal
1181	call	__bn_post4x_internal
1182
1183.byte	102,72,15,126,209
1184.byte	102,72,15,126,226
1185	movq	%rsi,%rdi
1186	movq	40(%rsp),%rax
1187	leaq	32(%rsp),%r8
1188
1189	call	mul4x_internal
1190
1191	movq	40(%rsp),%rsi
1192.cfi_def_cfa	%rsi,8
1193	movq	$1,%rax
1194	movq	-48(%rsi),%r15
1195.cfi_restore	%r15
1196	movq	-40(%rsi),%r14
1197.cfi_restore	%r14
1198	movq	-32(%rsi),%r13
1199.cfi_restore	%r13
1200	movq	-24(%rsi),%r12
1201.cfi_restore	%r12
1202	movq	-16(%rsi),%rbp
1203.cfi_restore	%rbp
1204	movq	-8(%rsi),%rbx
1205.cfi_restore	%rbx
1206	leaq	(%rsi),%rsp
1207.cfi_def_cfa_register	%rsp
1208.Lpower5_epilogue:
1209	.byte	0xf3,0xc3
1210.cfi_endproc
1211.size	bn_power5,.-bn_power5
1212
1213.globl	bn_sqr8x_internal
1214.hidden	bn_sqr8x_internal
1215.type	bn_sqr8x_internal,@function
1216.align	32
1217bn_sqr8x_internal:
1218__bn_sqr8x_internal:
1219.cfi_startproc
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293	leaq	32(%r10),%rbp
1294	leaq	(%rsi,%r9,1),%rsi
1295
1296	movq	%r9,%rcx
1297
1298
1299	movq	-32(%rsi,%rbp,1),%r14
1300	leaq	48+8(%rsp,%r9,2),%rdi
1301	movq	-24(%rsi,%rbp,1),%rax
1302	leaq	-32(%rdi,%rbp,1),%rdi
1303	movq	-16(%rsi,%rbp,1),%rbx
1304	movq	%rax,%r15
1305
1306	mulq	%r14
1307	movq	%rax,%r10
1308	movq	%rbx,%rax
1309	movq	%rdx,%r11
1310	movq	%r10,-24(%rdi,%rbp,1)
1311
1312	mulq	%r14
1313	addq	%rax,%r11
1314	movq	%rbx,%rax
1315	adcq	$0,%rdx
1316	movq	%r11,-16(%rdi,%rbp,1)
1317	movq	%rdx,%r10
1318
1319
1320	movq	-8(%rsi,%rbp,1),%rbx
1321	mulq	%r15
1322	movq	%rax,%r12
1323	movq	%rbx,%rax
1324	movq	%rdx,%r13
1325
1326	leaq	(%rbp),%rcx
1327	mulq	%r14
1328	addq	%rax,%r10
1329	movq	%rbx,%rax
1330	movq	%rdx,%r11
1331	adcq	$0,%r11
1332	addq	%r12,%r10
1333	adcq	$0,%r11
1334	movq	%r10,-8(%rdi,%rcx,1)
1335	jmp	.Lsqr4x_1st
1336
1337.align	32
1338.Lsqr4x_1st:
1339	movq	(%rsi,%rcx,1),%rbx
1340	mulq	%r15
1341	addq	%rax,%r13
1342	movq	%rbx,%rax
1343	movq	%rdx,%r12
1344	adcq	$0,%r12
1345
1346	mulq	%r14
1347	addq	%rax,%r11
1348	movq	%rbx,%rax
1349	movq	8(%rsi,%rcx,1),%rbx
1350	movq	%rdx,%r10
1351	adcq	$0,%r10
1352	addq	%r13,%r11
1353	adcq	$0,%r10
1354
1355
1356	mulq	%r15
1357	addq	%rax,%r12
1358	movq	%rbx,%rax
1359	movq	%r11,(%rdi,%rcx,1)
1360	movq	%rdx,%r13
1361	adcq	$0,%r13
1362
1363	mulq	%r14
1364	addq	%rax,%r10
1365	movq	%rbx,%rax
1366	movq	16(%rsi,%rcx,1),%rbx
1367	movq	%rdx,%r11
1368	adcq	$0,%r11
1369	addq	%r12,%r10
1370	adcq	$0,%r11
1371
1372	mulq	%r15
1373	addq	%rax,%r13
1374	movq	%rbx,%rax
1375	movq	%r10,8(%rdi,%rcx,1)
1376	movq	%rdx,%r12
1377	adcq	$0,%r12
1378
1379	mulq	%r14
1380	addq	%rax,%r11
1381	movq	%rbx,%rax
1382	movq	24(%rsi,%rcx,1),%rbx
1383	movq	%rdx,%r10
1384	adcq	$0,%r10
1385	addq	%r13,%r11
1386	adcq	$0,%r10
1387
1388
1389	mulq	%r15
1390	addq	%rax,%r12
1391	movq	%rbx,%rax
1392	movq	%r11,16(%rdi,%rcx,1)
1393	movq	%rdx,%r13
1394	adcq	$0,%r13
1395	leaq	32(%rcx),%rcx
1396
1397	mulq	%r14
1398	addq	%rax,%r10
1399	movq	%rbx,%rax
1400	movq	%rdx,%r11
1401	adcq	$0,%r11
1402	addq	%r12,%r10
1403	adcq	$0,%r11
1404	movq	%r10,-8(%rdi,%rcx,1)
1405
1406	cmpq	$0,%rcx
1407	jne	.Lsqr4x_1st
1408
1409	mulq	%r15
1410	addq	%rax,%r13
1411	leaq	16(%rbp),%rbp
1412	adcq	$0,%rdx
1413	addq	%r11,%r13
1414	adcq	$0,%rdx
1415
1416	movq	%r13,(%rdi)
1417	movq	%rdx,%r12
1418	movq	%rdx,8(%rdi)
1419	jmp	.Lsqr4x_outer
1420
1421.align	32
1422.Lsqr4x_outer:
1423	movq	-32(%rsi,%rbp,1),%r14
1424	leaq	48+8(%rsp,%r9,2),%rdi
1425	movq	-24(%rsi,%rbp,1),%rax
1426	leaq	-32(%rdi,%rbp,1),%rdi
1427	movq	-16(%rsi,%rbp,1),%rbx
1428	movq	%rax,%r15
1429
1430	mulq	%r14
1431	movq	-24(%rdi,%rbp,1),%r10
1432	addq	%rax,%r10
1433	movq	%rbx,%rax
1434	adcq	$0,%rdx
1435	movq	%r10,-24(%rdi,%rbp,1)
1436	movq	%rdx,%r11
1437
1438	mulq	%r14
1439	addq	%rax,%r11
1440	movq	%rbx,%rax
1441	adcq	$0,%rdx
1442	addq	-16(%rdi,%rbp,1),%r11
1443	movq	%rdx,%r10
1444	adcq	$0,%r10
1445	movq	%r11,-16(%rdi,%rbp,1)
1446
1447	xorq	%r12,%r12
1448
1449	movq	-8(%rsi,%rbp,1),%rbx
1450	mulq	%r15
1451	addq	%rax,%r12
1452	movq	%rbx,%rax
1453	adcq	$0,%rdx
1454	addq	-8(%rdi,%rbp,1),%r12
1455	movq	%rdx,%r13
1456	adcq	$0,%r13
1457
1458	mulq	%r14
1459	addq	%rax,%r10
1460	movq	%rbx,%rax
1461	adcq	$0,%rdx
1462	addq	%r12,%r10
1463	movq	%rdx,%r11
1464	adcq	$0,%r11
1465	movq	%r10,-8(%rdi,%rbp,1)
1466
1467	leaq	(%rbp),%rcx
1468	jmp	.Lsqr4x_inner
1469
1470.align	32
1471.Lsqr4x_inner:
1472	movq	(%rsi,%rcx,1),%rbx
1473	mulq	%r15
1474	addq	%rax,%r13
1475	movq	%rbx,%rax
1476	movq	%rdx,%r12
1477	adcq	$0,%r12
1478	addq	(%rdi,%rcx,1),%r13
1479	adcq	$0,%r12
1480
1481.byte	0x67
1482	mulq	%r14
1483	addq	%rax,%r11
1484	movq	%rbx,%rax
1485	movq	8(%rsi,%rcx,1),%rbx
1486	movq	%rdx,%r10
1487	adcq	$0,%r10
1488	addq	%r13,%r11
1489	adcq	$0,%r10
1490
1491	mulq	%r15
1492	addq	%rax,%r12
1493	movq	%r11,(%rdi,%rcx,1)
1494	movq	%rbx,%rax
1495	movq	%rdx,%r13
1496	adcq	$0,%r13
1497	addq	8(%rdi,%rcx,1),%r12
1498	leaq	16(%rcx),%rcx
1499	adcq	$0,%r13
1500
1501	mulq	%r14
1502	addq	%rax,%r10
1503	movq	%rbx,%rax
1504	adcq	$0,%rdx
1505	addq	%r12,%r10
1506	movq	%rdx,%r11
1507	adcq	$0,%r11
1508	movq	%r10,-8(%rdi,%rcx,1)
1509
1510	cmpq	$0,%rcx
1511	jne	.Lsqr4x_inner
1512
1513.byte	0x67
1514	mulq	%r15
1515	addq	%rax,%r13
1516	adcq	$0,%rdx
1517	addq	%r11,%r13
1518	adcq	$0,%rdx
1519
1520	movq	%r13,(%rdi)
1521	movq	%rdx,%r12
1522	movq	%rdx,8(%rdi)
1523
1524	addq	$16,%rbp
1525	jnz	.Lsqr4x_outer
1526
1527
1528	movq	-32(%rsi),%r14
1529	leaq	48+8(%rsp,%r9,2),%rdi
1530	movq	-24(%rsi),%rax
1531	leaq	-32(%rdi,%rbp,1),%rdi
1532	movq	-16(%rsi),%rbx
1533	movq	%rax,%r15
1534
1535	mulq	%r14
1536	addq	%rax,%r10
1537	movq	%rbx,%rax
1538	movq	%rdx,%r11
1539	adcq	$0,%r11
1540
1541	mulq	%r14
1542	addq	%rax,%r11
1543	movq	%rbx,%rax
1544	movq	%r10,-24(%rdi)
1545	movq	%rdx,%r10
1546	adcq	$0,%r10
1547	addq	%r13,%r11
1548	movq	-8(%rsi),%rbx
1549	adcq	$0,%r10
1550
1551	mulq	%r15
1552	addq	%rax,%r12
1553	movq	%rbx,%rax
1554	movq	%r11,-16(%rdi)
1555	movq	%rdx,%r13
1556	adcq	$0,%r13
1557
1558	mulq	%r14
1559	addq	%rax,%r10
1560	movq	%rbx,%rax
1561	movq	%rdx,%r11
1562	adcq	$0,%r11
1563	addq	%r12,%r10
1564	adcq	$0,%r11
1565	movq	%r10,-8(%rdi)
1566
1567	mulq	%r15
1568	addq	%rax,%r13
1569	movq	-16(%rsi),%rax
1570	adcq	$0,%rdx
1571	addq	%r11,%r13
1572	adcq	$0,%rdx
1573
1574	movq	%r13,(%rdi)
1575	movq	%rdx,%r12
1576	movq	%rdx,8(%rdi)
1577
1578	mulq	%rbx
1579	addq	$16,%rbp
1580	xorq	%r14,%r14
1581	subq	%r9,%rbp
1582	xorq	%r15,%r15
1583
1584	addq	%r12,%rax
1585	adcq	$0,%rdx
1586	movq	%rax,8(%rdi)
1587	movq	%rdx,16(%rdi)
1588	movq	%r15,24(%rdi)
1589
1590	movq	-16(%rsi,%rbp,1),%rax
1591	leaq	48+8(%rsp),%rdi
1592	xorq	%r10,%r10
1593	movq	8(%rdi),%r11
1594
1595	leaq	(%r14,%r10,2),%r12
1596	shrq	$63,%r10
1597	leaq	(%rcx,%r11,2),%r13
1598	shrq	$63,%r11
1599	orq	%r10,%r13
1600	movq	16(%rdi),%r10
1601	movq	%r11,%r14
1602	mulq	%rax
1603	negq	%r15
1604	movq	24(%rdi),%r11
1605	adcq	%rax,%r12
1606	movq	-8(%rsi,%rbp,1),%rax
1607	movq	%r12,(%rdi)
1608	adcq	%rdx,%r13
1609
1610	leaq	(%r14,%r10,2),%rbx
1611	movq	%r13,8(%rdi)
1612	sbbq	%r15,%r15
1613	shrq	$63,%r10
1614	leaq	(%rcx,%r11,2),%r8
1615	shrq	$63,%r11
1616	orq	%r10,%r8
1617	movq	32(%rdi),%r10
1618	movq	%r11,%r14
1619	mulq	%rax
1620	negq	%r15
1621	movq	40(%rdi),%r11
1622	adcq	%rax,%rbx
1623	movq	0(%rsi,%rbp,1),%rax
1624	movq	%rbx,16(%rdi)
1625	adcq	%rdx,%r8
1626	leaq	16(%rbp),%rbp
1627	movq	%r8,24(%rdi)
1628	sbbq	%r15,%r15
1629	leaq	64(%rdi),%rdi
1630	jmp	.Lsqr4x_shift_n_add
1631
1632.align	32
1633.Lsqr4x_shift_n_add:
1634	leaq	(%r14,%r10,2),%r12
1635	shrq	$63,%r10
1636	leaq	(%rcx,%r11,2),%r13
1637	shrq	$63,%r11
1638	orq	%r10,%r13
1639	movq	-16(%rdi),%r10
1640	movq	%r11,%r14
1641	mulq	%rax
1642	negq	%r15
1643	movq	-8(%rdi),%r11
1644	adcq	%rax,%r12
1645	movq	-8(%rsi,%rbp,1),%rax
1646	movq	%r12,-32(%rdi)
1647	adcq	%rdx,%r13
1648
1649	leaq	(%r14,%r10,2),%rbx
1650	movq	%r13,-24(%rdi)
1651	sbbq	%r15,%r15
1652	shrq	$63,%r10
1653	leaq	(%rcx,%r11,2),%r8
1654	shrq	$63,%r11
1655	orq	%r10,%r8
1656	movq	0(%rdi),%r10
1657	movq	%r11,%r14
1658	mulq	%rax
1659	negq	%r15
1660	movq	8(%rdi),%r11
1661	adcq	%rax,%rbx
1662	movq	0(%rsi,%rbp,1),%rax
1663	movq	%rbx,-16(%rdi)
1664	adcq	%rdx,%r8
1665
1666	leaq	(%r14,%r10,2),%r12
1667	movq	%r8,-8(%rdi)
1668	sbbq	%r15,%r15
1669	shrq	$63,%r10
1670	leaq	(%rcx,%r11,2),%r13
1671	shrq	$63,%r11
1672	orq	%r10,%r13
1673	movq	16(%rdi),%r10
1674	movq	%r11,%r14
1675	mulq	%rax
1676	negq	%r15
1677	movq	24(%rdi),%r11
1678	adcq	%rax,%r12
1679	movq	8(%rsi,%rbp,1),%rax
1680	movq	%r12,0(%rdi)
1681	adcq	%rdx,%r13
1682
1683	leaq	(%r14,%r10,2),%rbx
1684	movq	%r13,8(%rdi)
1685	sbbq	%r15,%r15
1686	shrq	$63,%r10
1687	leaq	(%rcx,%r11,2),%r8
1688	shrq	$63,%r11
1689	orq	%r10,%r8
1690	movq	32(%rdi),%r10
1691	movq	%r11,%r14
1692	mulq	%rax
1693	negq	%r15
1694	movq	40(%rdi),%r11
1695	adcq	%rax,%rbx
1696	movq	16(%rsi,%rbp,1),%rax
1697	movq	%rbx,16(%rdi)
1698	adcq	%rdx,%r8
1699	movq	%r8,24(%rdi)
1700	sbbq	%r15,%r15
1701	leaq	64(%rdi),%rdi
1702	addq	$32,%rbp
1703	jnz	.Lsqr4x_shift_n_add
1704
1705	leaq	(%r14,%r10,2),%r12
1706.byte	0x67
1707	shrq	$63,%r10
1708	leaq	(%rcx,%r11,2),%r13
1709	shrq	$63,%r11
1710	orq	%r10,%r13
1711	movq	-16(%rdi),%r10
1712	movq	%r11,%r14
1713	mulq	%rax
1714	negq	%r15
1715	movq	-8(%rdi),%r11
1716	adcq	%rax,%r12
1717	movq	-8(%rsi),%rax
1718	movq	%r12,-32(%rdi)
1719	adcq	%rdx,%r13
1720
1721	leaq	(%r14,%r10,2),%rbx
1722	movq	%r13,-24(%rdi)
1723	sbbq	%r15,%r15
1724	shrq	$63,%r10
1725	leaq	(%rcx,%r11,2),%r8
1726	shrq	$63,%r11
1727	orq	%r10,%r8
1728	mulq	%rax
1729	negq	%r15
1730	adcq	%rax,%rbx
1731	adcq	%rdx,%r8
1732	movq	%rbx,-16(%rdi)
1733	movq	%r8,-8(%rdi)
1734.byte	102,72,15,126,213
1735__bn_sqr8x_reduction:
1736	xorq	%rax,%rax
1737	leaq	(%r9,%rbp,1),%rcx
1738	leaq	48+8(%rsp,%r9,2),%rdx
1739	movq	%rcx,0+8(%rsp)
1740	leaq	48+8(%rsp,%r9,1),%rdi
1741	movq	%rdx,8+8(%rsp)
1742	negq	%r9
1743	jmp	.L8x_reduction_loop
1744
1745.align	32
1746.L8x_reduction_loop:
1747	leaq	(%rdi,%r9,1),%rdi
1748.byte	0x66
1749	movq	0(%rdi),%rbx
1750	movq	8(%rdi),%r9
1751	movq	16(%rdi),%r10
1752	movq	24(%rdi),%r11
1753	movq	32(%rdi),%r12
1754	movq	40(%rdi),%r13
1755	movq	48(%rdi),%r14
1756	movq	56(%rdi),%r15
1757	movq	%rax,(%rdx)
1758	leaq	64(%rdi),%rdi
1759
1760.byte	0x67
1761	movq	%rbx,%r8
1762	imulq	32+8(%rsp),%rbx
1763	movq	0(%rbp),%rax
1764	movl	$8,%ecx
1765	jmp	.L8x_reduce
1766
1767.align	32
1768.L8x_reduce:
1769	mulq	%rbx
1770	movq	8(%rbp),%rax
1771	negq	%r8
1772	movq	%rdx,%r8
1773	adcq	$0,%r8
1774
1775	mulq	%rbx
1776	addq	%rax,%r9
1777	movq	16(%rbp),%rax
1778	adcq	$0,%rdx
1779	addq	%r9,%r8
1780	movq	%rbx,48-8+8(%rsp,%rcx,8)
1781	movq	%rdx,%r9
1782	adcq	$0,%r9
1783
1784	mulq	%rbx
1785	addq	%rax,%r10
1786	movq	24(%rbp),%rax
1787	adcq	$0,%rdx
1788	addq	%r10,%r9
1789	movq	32+8(%rsp),%rsi
1790	movq	%rdx,%r10
1791	adcq	$0,%r10
1792
1793	mulq	%rbx
1794	addq	%rax,%r11
1795	movq	32(%rbp),%rax
1796	adcq	$0,%rdx
1797	imulq	%r8,%rsi
1798	addq	%r11,%r10
1799	movq	%rdx,%r11
1800	adcq	$0,%r11
1801
1802	mulq	%rbx
1803	addq	%rax,%r12
1804	movq	40(%rbp),%rax
1805	adcq	$0,%rdx
1806	addq	%r12,%r11
1807	movq	%rdx,%r12
1808	adcq	$0,%r12
1809
1810	mulq	%rbx
1811	addq	%rax,%r13
1812	movq	48(%rbp),%rax
1813	adcq	$0,%rdx
1814	addq	%r13,%r12
1815	movq	%rdx,%r13
1816	adcq	$0,%r13
1817
1818	mulq	%rbx
1819	addq	%rax,%r14
1820	movq	56(%rbp),%rax
1821	adcq	$0,%rdx
1822	addq	%r14,%r13
1823	movq	%rdx,%r14
1824	adcq	$0,%r14
1825
1826	mulq	%rbx
1827	movq	%rsi,%rbx
1828	addq	%rax,%r15
1829	movq	0(%rbp),%rax
1830	adcq	$0,%rdx
1831	addq	%r15,%r14
1832	movq	%rdx,%r15
1833	adcq	$0,%r15
1834
1835	decl	%ecx
1836	jnz	.L8x_reduce
1837
1838	leaq	64(%rbp),%rbp
1839	xorq	%rax,%rax
1840	movq	8+8(%rsp),%rdx
1841	cmpq	0+8(%rsp),%rbp
1842	jae	.L8x_no_tail
1843
1844.byte	0x66
1845	addq	0(%rdi),%r8
1846	adcq	8(%rdi),%r9
1847	adcq	16(%rdi),%r10
1848	adcq	24(%rdi),%r11
1849	adcq	32(%rdi),%r12
1850	adcq	40(%rdi),%r13
1851	adcq	48(%rdi),%r14
1852	adcq	56(%rdi),%r15
1853	sbbq	%rsi,%rsi
1854
1855	movq	48+56+8(%rsp),%rbx
1856	movl	$8,%ecx
1857	movq	0(%rbp),%rax
1858	jmp	.L8x_tail
1859
1860.align	32
1861.L8x_tail:
1862	mulq	%rbx
1863	addq	%rax,%r8
1864	movq	8(%rbp),%rax
1865	movq	%r8,(%rdi)
1866	movq	%rdx,%r8
1867	adcq	$0,%r8
1868
1869	mulq	%rbx
1870	addq	%rax,%r9
1871	movq	16(%rbp),%rax
1872	adcq	$0,%rdx
1873	addq	%r9,%r8
1874	leaq	8(%rdi),%rdi
1875	movq	%rdx,%r9
1876	adcq	$0,%r9
1877
1878	mulq	%rbx
1879	addq	%rax,%r10
1880	movq	24(%rbp),%rax
1881	adcq	$0,%rdx
1882	addq	%r10,%r9
1883	movq	%rdx,%r10
1884	adcq	$0,%r10
1885
1886	mulq	%rbx
1887	addq	%rax,%r11
1888	movq	32(%rbp),%rax
1889	adcq	$0,%rdx
1890	addq	%r11,%r10
1891	movq	%rdx,%r11
1892	adcq	$0,%r11
1893
1894	mulq	%rbx
1895	addq	%rax,%r12
1896	movq	40(%rbp),%rax
1897	adcq	$0,%rdx
1898	addq	%r12,%r11
1899	movq	%rdx,%r12
1900	adcq	$0,%r12
1901
1902	mulq	%rbx
1903	addq	%rax,%r13
1904	movq	48(%rbp),%rax
1905	adcq	$0,%rdx
1906	addq	%r13,%r12
1907	movq	%rdx,%r13
1908	adcq	$0,%r13
1909
1910	mulq	%rbx
1911	addq	%rax,%r14
1912	movq	56(%rbp),%rax
1913	adcq	$0,%rdx
1914	addq	%r14,%r13
1915	movq	%rdx,%r14
1916	adcq	$0,%r14
1917
1918	mulq	%rbx
1919	movq	48-16+8(%rsp,%rcx,8),%rbx
1920	addq	%rax,%r15
1921	adcq	$0,%rdx
1922	addq	%r15,%r14
1923	movq	0(%rbp),%rax
1924	movq	%rdx,%r15
1925	adcq	$0,%r15
1926
1927	decl	%ecx
1928	jnz	.L8x_tail
1929
1930	leaq	64(%rbp),%rbp
1931	movq	8+8(%rsp),%rdx
1932	cmpq	0+8(%rsp),%rbp
1933	jae	.L8x_tail_done
1934
1935	movq	48+56+8(%rsp),%rbx
1936	negq	%rsi
1937	movq	0(%rbp),%rax
1938	adcq	0(%rdi),%r8
1939	adcq	8(%rdi),%r9
1940	adcq	16(%rdi),%r10
1941	adcq	24(%rdi),%r11
1942	adcq	32(%rdi),%r12
1943	adcq	40(%rdi),%r13
1944	adcq	48(%rdi),%r14
1945	adcq	56(%rdi),%r15
1946	sbbq	%rsi,%rsi
1947
1948	movl	$8,%ecx
1949	jmp	.L8x_tail
1950
1951.align	32
1952.L8x_tail_done:
1953	xorq	%rax,%rax
1954	addq	(%rdx),%r8
1955	adcq	$0,%r9
1956	adcq	$0,%r10
1957	adcq	$0,%r11
1958	adcq	$0,%r12
1959	adcq	$0,%r13
1960	adcq	$0,%r14
1961	adcq	$0,%r15
1962	adcq	$0,%rax
1963
1964	negq	%rsi
1965.L8x_no_tail:
1966	adcq	0(%rdi),%r8
1967	adcq	8(%rdi),%r9
1968	adcq	16(%rdi),%r10
1969	adcq	24(%rdi),%r11
1970	adcq	32(%rdi),%r12
1971	adcq	40(%rdi),%r13
1972	adcq	48(%rdi),%r14
1973	adcq	56(%rdi),%r15
1974	adcq	$0,%rax
1975	movq	-8(%rbp),%rcx
1976	xorq	%rsi,%rsi
1977
1978.byte	102,72,15,126,213
1979
1980	movq	%r8,0(%rdi)
1981	movq	%r9,8(%rdi)
1982.byte	102,73,15,126,217
1983	movq	%r10,16(%rdi)
1984	movq	%r11,24(%rdi)
1985	movq	%r12,32(%rdi)
1986	movq	%r13,40(%rdi)
1987	movq	%r14,48(%rdi)
1988	movq	%r15,56(%rdi)
1989	leaq	64(%rdi),%rdi
1990
1991	cmpq	%rdx,%rdi
1992	jb	.L8x_reduction_loop
1993	.byte	0xf3,0xc3
1994.cfi_endproc
1995.size	bn_sqr8x_internal,.-bn_sqr8x_internal
1996.type	__bn_post4x_internal,@function
1997.align	32
1998__bn_post4x_internal:
1999.cfi_startproc
2000	movq	0(%rbp),%r12
2001	leaq	(%rdi,%r9,1),%rbx
2002	movq	%r9,%rcx
2003.byte	102,72,15,126,207
2004	negq	%rax
2005.byte	102,72,15,126,206
2006	sarq	$3+2,%rcx
2007	decq	%r12
2008	xorq	%r10,%r10
2009	movq	8(%rbp),%r13
2010	movq	16(%rbp),%r14
2011	movq	24(%rbp),%r15
2012	jmp	.Lsqr4x_sub_entry
2013
2014.align	16
2015.Lsqr4x_sub:
2016	movq	0(%rbp),%r12
2017	movq	8(%rbp),%r13
2018	movq	16(%rbp),%r14
2019	movq	24(%rbp),%r15
2020.Lsqr4x_sub_entry:
2021	leaq	32(%rbp),%rbp
2022	notq	%r12
2023	notq	%r13
2024	notq	%r14
2025	notq	%r15
2026	andq	%rax,%r12
2027	andq	%rax,%r13
2028	andq	%rax,%r14
2029	andq	%rax,%r15
2030
2031	negq	%r10
2032	adcq	0(%rbx),%r12
2033	adcq	8(%rbx),%r13
2034	adcq	16(%rbx),%r14
2035	adcq	24(%rbx),%r15
2036	movq	%r12,0(%rdi)
2037	leaq	32(%rbx),%rbx
2038	movq	%r13,8(%rdi)
2039	sbbq	%r10,%r10
2040	movq	%r14,16(%rdi)
2041	movq	%r15,24(%rdi)
2042	leaq	32(%rdi),%rdi
2043
2044	incq	%rcx
2045	jnz	.Lsqr4x_sub
2046
2047	movq	%r9,%r10
2048	negq	%r9
2049	.byte	0xf3,0xc3
2050.cfi_endproc
2051.size	__bn_post4x_internal,.-__bn_post4x_internal
2052.type	bn_mulx4x_mont_gather5,@function
2053.align	32
2054bn_mulx4x_mont_gather5:
2055.cfi_startproc
2056	movq	%rsp,%rax
2057.cfi_def_cfa_register	%rax
2058.Lmulx4x_enter:
2059	pushq	%rbx
2060.cfi_offset	%rbx,-16
2061	pushq	%rbp
2062.cfi_offset	%rbp,-24
2063	pushq	%r12
2064.cfi_offset	%r12,-32
2065	pushq	%r13
2066.cfi_offset	%r13,-40
2067	pushq	%r14
2068.cfi_offset	%r14,-48
2069	pushq	%r15
2070.cfi_offset	%r15,-56
2071.Lmulx4x_prologue:
2072
2073	shll	$3,%r9d
2074	leaq	(%r9,%r9,2),%r10
2075	negq	%r9
2076	movq	(%r8),%r8
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087	leaq	-320(%rsp,%r9,2),%r11
2088	movq	%rsp,%rbp
2089	subq	%rdi,%r11
2090	andq	$4095,%r11
2091	cmpq	%r11,%r10
2092	jb	.Lmulx4xsp_alt
2093	subq	%r11,%rbp
2094	leaq	-320(%rbp,%r9,2),%rbp
2095	jmp	.Lmulx4xsp_done
2096
2097.Lmulx4xsp_alt:
2098	leaq	4096-320(,%r9,2),%r10
2099	leaq	-320(%rbp,%r9,2),%rbp
2100	subq	%r10,%r11
2101	movq	$0,%r10
2102	cmovcq	%r10,%r11
2103	subq	%r11,%rbp
2104.Lmulx4xsp_done:
2105	andq	$-64,%rbp
2106	movq	%rsp,%r11
2107	subq	%rbp,%r11
2108	andq	$-4096,%r11
2109	leaq	(%r11,%rbp,1),%rsp
2110	movq	(%rsp),%r10
2111	cmpq	%rbp,%rsp
2112	ja	.Lmulx4x_page_walk
2113	jmp	.Lmulx4x_page_walk_done
2114
2115.Lmulx4x_page_walk:
2116	leaq	-4096(%rsp),%rsp
2117	movq	(%rsp),%r10
2118	cmpq	%rbp,%rsp
2119	ja	.Lmulx4x_page_walk
2120.Lmulx4x_page_walk_done:
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134	movq	%r8,32(%rsp)
2135	movq	%rax,40(%rsp)
2136.cfi_escape	0x0f,0x05,0x77,0x28,0x06,0x23,0x08
2137.Lmulx4x_body:
2138	call	mulx4x_internal
2139
2140	movq	40(%rsp),%rsi
2141.cfi_def_cfa	%rsi,8
2142	movq	$1,%rax
2143
2144	movq	-48(%rsi),%r15
2145.cfi_restore	%r15
2146	movq	-40(%rsi),%r14
2147.cfi_restore	%r14
2148	movq	-32(%rsi),%r13
2149.cfi_restore	%r13
2150	movq	-24(%rsi),%r12
2151.cfi_restore	%r12
2152	movq	-16(%rsi),%rbp
2153.cfi_restore	%rbp
2154	movq	-8(%rsi),%rbx
2155.cfi_restore	%rbx
2156	leaq	(%rsi),%rsp
2157.cfi_def_cfa_register	%rsp
2158.Lmulx4x_epilogue:
2159	.byte	0xf3,0xc3
2160.cfi_endproc
2161.size	bn_mulx4x_mont_gather5,.-bn_mulx4x_mont_gather5
2162
2163.type	mulx4x_internal,@function
2164.align	32
2165mulx4x_internal:
2166.cfi_startproc
2167	movq	%r9,8(%rsp)
2168	movq	%r9,%r10
2169	negq	%r9
2170	shlq	$5,%r9
2171	negq	%r10
2172	leaq	128(%rdx,%r9,1),%r13
2173	shrq	$5+5,%r9
2174	movd	8(%rax),%xmm5
2175	subq	$1,%r9
2176	leaq	.Linc(%rip),%rax
2177	movq	%r13,16+8(%rsp)
2178	movq	%r9,24+8(%rsp)
2179	movq	%rdi,56+8(%rsp)
2180	movdqa	0(%rax),%xmm0
2181	movdqa	16(%rax),%xmm1
2182	leaq	88-112(%rsp,%r10,1),%r10
2183	leaq	128(%rdx),%rdi
2184
2185	pshufd	$0,%xmm5,%xmm5
2186	movdqa	%xmm1,%xmm4
2187.byte	0x67
2188	movdqa	%xmm1,%xmm2
2189.byte	0x67
2190	paddd	%xmm0,%xmm1
2191	pcmpeqd	%xmm5,%xmm0
2192	movdqa	%xmm4,%xmm3
2193	paddd	%xmm1,%xmm2
2194	pcmpeqd	%xmm5,%xmm1
2195	movdqa	%xmm0,112(%r10)
2196	movdqa	%xmm4,%xmm0
2197
2198	paddd	%xmm2,%xmm3
2199	pcmpeqd	%xmm5,%xmm2
2200	movdqa	%xmm1,128(%r10)
2201	movdqa	%xmm4,%xmm1
2202
2203	paddd	%xmm3,%xmm0
2204	pcmpeqd	%xmm5,%xmm3
2205	movdqa	%xmm2,144(%r10)
2206	movdqa	%xmm4,%xmm2
2207
2208	paddd	%xmm0,%xmm1
2209	pcmpeqd	%xmm5,%xmm0
2210	movdqa	%xmm3,160(%r10)
2211	movdqa	%xmm4,%xmm3
2212	paddd	%xmm1,%xmm2
2213	pcmpeqd	%xmm5,%xmm1
2214	movdqa	%xmm0,176(%r10)
2215	movdqa	%xmm4,%xmm0
2216
2217	paddd	%xmm2,%xmm3
2218	pcmpeqd	%xmm5,%xmm2
2219	movdqa	%xmm1,192(%r10)
2220	movdqa	%xmm4,%xmm1
2221
2222	paddd	%xmm3,%xmm0
2223	pcmpeqd	%xmm5,%xmm3
2224	movdqa	%xmm2,208(%r10)
2225	movdqa	%xmm4,%xmm2
2226
2227	paddd	%xmm0,%xmm1
2228	pcmpeqd	%xmm5,%xmm0
2229	movdqa	%xmm3,224(%r10)
2230	movdqa	%xmm4,%xmm3
2231	paddd	%xmm1,%xmm2
2232	pcmpeqd	%xmm5,%xmm1
2233	movdqa	%xmm0,240(%r10)
2234	movdqa	%xmm4,%xmm0
2235
2236	paddd	%xmm2,%xmm3
2237	pcmpeqd	%xmm5,%xmm2
2238	movdqa	%xmm1,256(%r10)
2239	movdqa	%xmm4,%xmm1
2240
2241	paddd	%xmm3,%xmm0
2242	pcmpeqd	%xmm5,%xmm3
2243	movdqa	%xmm2,272(%r10)
2244	movdqa	%xmm4,%xmm2
2245
2246	paddd	%xmm0,%xmm1
2247	pcmpeqd	%xmm5,%xmm0
2248	movdqa	%xmm3,288(%r10)
2249	movdqa	%xmm4,%xmm3
2250.byte	0x67
2251	paddd	%xmm1,%xmm2
2252	pcmpeqd	%xmm5,%xmm1
2253	movdqa	%xmm0,304(%r10)
2254
2255	paddd	%xmm2,%xmm3
2256	pcmpeqd	%xmm5,%xmm2
2257	movdqa	%xmm1,320(%r10)
2258
2259	pcmpeqd	%xmm5,%xmm3
2260	movdqa	%xmm2,336(%r10)
2261
2262	pand	64(%rdi),%xmm0
2263	pand	80(%rdi),%xmm1
2264	pand	96(%rdi),%xmm2
2265	movdqa	%xmm3,352(%r10)
2266	pand	112(%rdi),%xmm3
2267	por	%xmm2,%xmm0
2268	por	%xmm3,%xmm1
2269	movdqa	-128(%rdi),%xmm4
2270	movdqa	-112(%rdi),%xmm5
2271	movdqa	-96(%rdi),%xmm2
2272	pand	112(%r10),%xmm4
2273	movdqa	-80(%rdi),%xmm3
2274	pand	128(%r10),%xmm5
2275	por	%xmm4,%xmm0
2276	pand	144(%r10),%xmm2
2277	por	%xmm5,%xmm1
2278	pand	160(%r10),%xmm3
2279	por	%xmm2,%xmm0
2280	por	%xmm3,%xmm1
2281	movdqa	-64(%rdi),%xmm4
2282	movdqa	-48(%rdi),%xmm5
2283	movdqa	-32(%rdi),%xmm2
2284	pand	176(%r10),%xmm4
2285	movdqa	-16(%rdi),%xmm3
2286	pand	192(%r10),%xmm5
2287	por	%xmm4,%xmm0
2288	pand	208(%r10),%xmm2
2289	por	%xmm5,%xmm1
2290	pand	224(%r10),%xmm3
2291	por	%xmm2,%xmm0
2292	por	%xmm3,%xmm1
2293	movdqa	0(%rdi),%xmm4
2294	movdqa	16(%rdi),%xmm5
2295	movdqa	32(%rdi),%xmm2
2296	pand	240(%r10),%xmm4
2297	movdqa	48(%rdi),%xmm3
2298	pand	256(%r10),%xmm5
2299	por	%xmm4,%xmm0
2300	pand	272(%r10),%xmm2
2301	por	%xmm5,%xmm1
2302	pand	288(%r10),%xmm3
2303	por	%xmm2,%xmm0
2304	por	%xmm3,%xmm1
2305	pxor	%xmm1,%xmm0
2306	pshufd	$0x4e,%xmm0,%xmm1
2307	por	%xmm1,%xmm0
2308	leaq	256(%rdi),%rdi
2309.byte	102,72,15,126,194
2310	leaq	64+32+8(%rsp),%rbx
2311
2312	movq	%rdx,%r9
2313	mulxq	0(%rsi),%r8,%rax
2314	mulxq	8(%rsi),%r11,%r12
2315	addq	%rax,%r11
2316	mulxq	16(%rsi),%rax,%r13
2317	adcq	%rax,%r12
2318	adcq	$0,%r13
2319	mulxq	24(%rsi),%rax,%r14
2320
2321	movq	%r8,%r15
2322	imulq	32+8(%rsp),%r8
2323	xorq	%rbp,%rbp
2324	movq	%r8,%rdx
2325
2326	movq	%rdi,8+8(%rsp)
2327
2328	leaq	32(%rsi),%rsi
2329	adcxq	%rax,%r13
2330	adcxq	%rbp,%r14
2331
2332	mulxq	0(%rcx),%rax,%r10
2333	adcxq	%rax,%r15
2334	adoxq	%r11,%r10
2335	mulxq	8(%rcx),%rax,%r11
2336	adcxq	%rax,%r10
2337	adoxq	%r12,%r11
2338	mulxq	16(%rcx),%rax,%r12
2339	movq	24+8(%rsp),%rdi
2340	movq	%r10,-32(%rbx)
2341	adcxq	%rax,%r11
2342	adoxq	%r13,%r12
2343	mulxq	24(%rcx),%rax,%r15
2344	movq	%r9,%rdx
2345	movq	%r11,-24(%rbx)
2346	adcxq	%rax,%r12
2347	adoxq	%rbp,%r15
2348	leaq	32(%rcx),%rcx
2349	movq	%r12,-16(%rbx)
2350	jmp	.Lmulx4x_1st
2351
2352.align	32
2353.Lmulx4x_1st:
2354	adcxq	%rbp,%r15
2355	mulxq	0(%rsi),%r10,%rax
2356	adcxq	%r14,%r10
2357	mulxq	8(%rsi),%r11,%r14
2358	adcxq	%rax,%r11
2359	mulxq	16(%rsi),%r12,%rax
2360	adcxq	%r14,%r12
2361	mulxq	24(%rsi),%r13,%r14
2362.byte	0x67,0x67
2363	movq	%r8,%rdx
2364	adcxq	%rax,%r13
2365	adcxq	%rbp,%r14
2366	leaq	32(%rsi),%rsi
2367	leaq	32(%rbx),%rbx
2368
2369	adoxq	%r15,%r10
2370	mulxq	0(%rcx),%rax,%r15
2371	adcxq	%rax,%r10
2372	adoxq	%r15,%r11
2373	mulxq	8(%rcx),%rax,%r15
2374	adcxq	%rax,%r11
2375	adoxq	%r15,%r12
2376	mulxq	16(%rcx),%rax,%r15
2377	movq	%r10,-40(%rbx)
2378	adcxq	%rax,%r12
2379	movq	%r11,-32(%rbx)
2380	adoxq	%r15,%r13
2381	mulxq	24(%rcx),%rax,%r15
2382	movq	%r9,%rdx
2383	movq	%r12,-24(%rbx)
2384	adcxq	%rax,%r13
2385	adoxq	%rbp,%r15
2386	leaq	32(%rcx),%rcx
2387	movq	%r13,-16(%rbx)
2388
2389	decq	%rdi
2390	jnz	.Lmulx4x_1st
2391
2392	movq	8(%rsp),%rax
2393	adcq	%rbp,%r15
2394	leaq	(%rsi,%rax,1),%rsi
2395	addq	%r15,%r14
2396	movq	8+8(%rsp),%rdi
2397	adcq	%rbp,%rbp
2398	movq	%r14,-8(%rbx)
2399	jmp	.Lmulx4x_outer
2400
2401.align	32
2402.Lmulx4x_outer:
2403	leaq	16-256(%rbx),%r10
2404	pxor	%xmm4,%xmm4
2405.byte	0x67,0x67
2406	pxor	%xmm5,%xmm5
2407	movdqa	-128(%rdi),%xmm0
2408	movdqa	-112(%rdi),%xmm1
2409	movdqa	-96(%rdi),%xmm2
2410	pand	256(%r10),%xmm0
2411	movdqa	-80(%rdi),%xmm3
2412	pand	272(%r10),%xmm1
2413	por	%xmm0,%xmm4
2414	pand	288(%r10),%xmm2
2415	por	%xmm1,%xmm5
2416	pand	304(%r10),%xmm3
2417	por	%xmm2,%xmm4
2418	por	%xmm3,%xmm5
2419	movdqa	-64(%rdi),%xmm0
2420	movdqa	-48(%rdi),%xmm1
2421	movdqa	-32(%rdi),%xmm2
2422	pand	320(%r10),%xmm0
2423	movdqa	-16(%rdi),%xmm3
2424	pand	336(%r10),%xmm1
2425	por	%xmm0,%xmm4
2426	pand	352(%r10),%xmm2
2427	por	%xmm1,%xmm5
2428	pand	368(%r10),%xmm3
2429	por	%xmm2,%xmm4
2430	por	%xmm3,%xmm5
2431	movdqa	0(%rdi),%xmm0
2432	movdqa	16(%rdi),%xmm1
2433	movdqa	32(%rdi),%xmm2
2434	pand	384(%r10),%xmm0
2435	movdqa	48(%rdi),%xmm3
2436	pand	400(%r10),%xmm1
2437	por	%xmm0,%xmm4
2438	pand	416(%r10),%xmm2
2439	por	%xmm1,%xmm5
2440	pand	432(%r10),%xmm3
2441	por	%xmm2,%xmm4
2442	por	%xmm3,%xmm5
2443	movdqa	64(%rdi),%xmm0
2444	movdqa	80(%rdi),%xmm1
2445	movdqa	96(%rdi),%xmm2
2446	pand	448(%r10),%xmm0
2447	movdqa	112(%rdi),%xmm3
2448	pand	464(%r10),%xmm1
2449	por	%xmm0,%xmm4
2450	pand	480(%r10),%xmm2
2451	por	%xmm1,%xmm5
2452	pand	496(%r10),%xmm3
2453	por	%xmm2,%xmm4
2454	por	%xmm3,%xmm5
2455	por	%xmm5,%xmm4
2456	pshufd	$0x4e,%xmm4,%xmm0
2457	por	%xmm4,%xmm0
2458	leaq	256(%rdi),%rdi
2459.byte	102,72,15,126,194
2460
2461	movq	%rbp,(%rbx)
2462	leaq	32(%rbx,%rax,1),%rbx
2463	mulxq	0(%rsi),%r8,%r11
2464	xorq	%rbp,%rbp
2465	movq	%rdx,%r9
2466	mulxq	8(%rsi),%r14,%r12
2467	adoxq	-32(%rbx),%r8
2468	adcxq	%r14,%r11
2469	mulxq	16(%rsi),%r15,%r13
2470	adoxq	-24(%rbx),%r11
2471	adcxq	%r15,%r12
2472	mulxq	24(%rsi),%rdx,%r14
2473	adoxq	-16(%rbx),%r12
2474	adcxq	%rdx,%r13
2475	leaq	(%rcx,%rax,1),%rcx
2476	leaq	32(%rsi),%rsi
2477	adoxq	-8(%rbx),%r13
2478	adcxq	%rbp,%r14
2479	adoxq	%rbp,%r14
2480
2481	movq	%r8,%r15
2482	imulq	32+8(%rsp),%r8
2483
2484	movq	%r8,%rdx
2485	xorq	%rbp,%rbp
2486	movq	%rdi,8+8(%rsp)
2487
2488	mulxq	0(%rcx),%rax,%r10
2489	adcxq	%rax,%r15
2490	adoxq	%r11,%r10
2491	mulxq	8(%rcx),%rax,%r11
2492	adcxq	%rax,%r10
2493	adoxq	%r12,%r11
2494	mulxq	16(%rcx),%rax,%r12
2495	adcxq	%rax,%r11
2496	adoxq	%r13,%r12
2497	mulxq	24(%rcx),%rax,%r15
2498	movq	%r9,%rdx
2499	movq	24+8(%rsp),%rdi
2500	movq	%r10,-32(%rbx)
2501	adcxq	%rax,%r12
2502	movq	%r11,-24(%rbx)
2503	adoxq	%rbp,%r15
2504	movq	%r12,-16(%rbx)
2505	leaq	32(%rcx),%rcx
2506	jmp	.Lmulx4x_inner
2507
2508.align	32
2509.Lmulx4x_inner:
2510	mulxq	0(%rsi),%r10,%rax
2511	adcxq	%rbp,%r15
2512	adoxq	%r14,%r10
2513	mulxq	8(%rsi),%r11,%r14
2514	adcxq	0(%rbx),%r10
2515	adoxq	%rax,%r11
2516	mulxq	16(%rsi),%r12,%rax
2517	adcxq	8(%rbx),%r11
2518	adoxq	%r14,%r12
2519	mulxq	24(%rsi),%r13,%r14
2520	movq	%r8,%rdx
2521	adcxq	16(%rbx),%r12
2522	adoxq	%rax,%r13
2523	adcxq	24(%rbx),%r13
2524	adoxq	%rbp,%r14
2525	leaq	32(%rsi),%rsi
2526	leaq	32(%rbx),%rbx
2527	adcxq	%rbp,%r14
2528
2529	adoxq	%r15,%r10
2530	mulxq	0(%rcx),%rax,%r15
2531	adcxq	%rax,%r10
2532	adoxq	%r15,%r11
2533	mulxq	8(%rcx),%rax,%r15
2534	adcxq	%rax,%r11
2535	adoxq	%r15,%r12
2536	mulxq	16(%rcx),%rax,%r15
2537	movq	%r10,-40(%rbx)
2538	adcxq	%rax,%r12
2539	adoxq	%r15,%r13
2540	movq	%r11,-32(%rbx)
2541	mulxq	24(%rcx),%rax,%r15
2542	movq	%r9,%rdx
2543	leaq	32(%rcx),%rcx
2544	movq	%r12,-24(%rbx)
2545	adcxq	%rax,%r13
2546	adoxq	%rbp,%r15
2547	movq	%r13,-16(%rbx)
2548
2549	decq	%rdi
2550	jnz	.Lmulx4x_inner
2551
2552	movq	0+8(%rsp),%rax
2553	adcq	%rbp,%r15
2554	subq	0(%rbx),%rdi
2555	movq	8+8(%rsp),%rdi
2556	movq	16+8(%rsp),%r10
2557	adcq	%r15,%r14
2558	leaq	(%rsi,%rax,1),%rsi
2559	adcq	%rbp,%rbp
2560	movq	%r14,-8(%rbx)
2561
2562	cmpq	%r10,%rdi
2563	jb	.Lmulx4x_outer
2564
2565	movq	-8(%rcx),%r10
2566	movq	%rbp,%r8
2567	movq	(%rcx,%rax,1),%r12
2568	leaq	(%rcx,%rax,1),%rbp
2569	movq	%rax,%rcx
2570	leaq	(%rbx,%rax,1),%rdi
2571	xorl	%eax,%eax
2572	xorq	%r15,%r15
2573	subq	%r14,%r10
2574	adcq	%r15,%r15
2575	orq	%r15,%r8
2576	sarq	$3+2,%rcx
2577	subq	%r8,%rax
2578	movq	56+8(%rsp),%rdx
2579	decq	%r12
2580	movq	8(%rbp),%r13
2581	xorq	%r8,%r8
2582	movq	16(%rbp),%r14
2583	movq	24(%rbp),%r15
2584	jmp	.Lsqrx4x_sub_entry
2585.cfi_endproc
2586.size	mulx4x_internal,.-mulx4x_internal
2587.type	bn_powerx5,@function
2588.align	32
2589bn_powerx5:
2590.cfi_startproc
2591	movq	%rsp,%rax
2592.cfi_def_cfa_register	%rax
2593.Lpowerx5_enter:
2594	pushq	%rbx
2595.cfi_offset	%rbx,-16
2596	pushq	%rbp
2597.cfi_offset	%rbp,-24
2598	pushq	%r12
2599.cfi_offset	%r12,-32
2600	pushq	%r13
2601.cfi_offset	%r13,-40
2602	pushq	%r14
2603.cfi_offset	%r14,-48
2604	pushq	%r15
2605.cfi_offset	%r15,-56
2606.Lpowerx5_prologue:
2607
2608	shll	$3,%r9d
2609	leaq	(%r9,%r9,2),%r10
2610	negq	%r9
2611	movq	(%r8),%r8
2612
2613
2614
2615
2616
2617
2618
2619
2620	leaq	-320(%rsp,%r9,2),%r11
2621	movq	%rsp,%rbp
2622	subq	%rdi,%r11
2623	andq	$4095,%r11
2624	cmpq	%r11,%r10
2625	jb	.Lpwrx_sp_alt
2626	subq	%r11,%rbp
2627	leaq	-320(%rbp,%r9,2),%rbp
2628	jmp	.Lpwrx_sp_done
2629
2630.align	32
2631.Lpwrx_sp_alt:
2632	leaq	4096-320(,%r9,2),%r10
2633	leaq	-320(%rbp,%r9,2),%rbp
2634	subq	%r10,%r11
2635	movq	$0,%r10
2636	cmovcq	%r10,%r11
2637	subq	%r11,%rbp
2638.Lpwrx_sp_done:
2639	andq	$-64,%rbp
2640	movq	%rsp,%r11
2641	subq	%rbp,%r11
2642	andq	$-4096,%r11
2643	leaq	(%r11,%rbp,1),%rsp
2644	movq	(%rsp),%r10
2645	cmpq	%rbp,%rsp
2646	ja	.Lpwrx_page_walk
2647	jmp	.Lpwrx_page_walk_done
2648
2649.Lpwrx_page_walk:
2650	leaq	-4096(%rsp),%rsp
2651	movq	(%rsp),%r10
2652	cmpq	%rbp,%rsp
2653	ja	.Lpwrx_page_walk
2654.Lpwrx_page_walk_done:
2655
2656	movq	%r9,%r10
2657	negq	%r9
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670	pxor	%xmm0,%xmm0
2671.byte	102,72,15,110,207
2672.byte	102,72,15,110,209
2673.byte	102,73,15,110,218
2674.byte	102,72,15,110,226
2675	movq	%r8,32(%rsp)
2676	movq	%rax,40(%rsp)
2677.cfi_escape	0x0f,0x05,0x77,0x28,0x06,0x23,0x08
2678.Lpowerx5_body:
2679
2680	call	__bn_sqrx8x_internal
2681	call	__bn_postx4x_internal
2682	call	__bn_sqrx8x_internal
2683	call	__bn_postx4x_internal
2684	call	__bn_sqrx8x_internal
2685	call	__bn_postx4x_internal
2686	call	__bn_sqrx8x_internal
2687	call	__bn_postx4x_internal
2688	call	__bn_sqrx8x_internal
2689	call	__bn_postx4x_internal
2690
2691	movq	%r10,%r9
2692	movq	%rsi,%rdi
2693.byte	102,72,15,126,209
2694.byte	102,72,15,126,226
2695	movq	40(%rsp),%rax
2696
2697	call	mulx4x_internal
2698
2699	movq	40(%rsp),%rsi
2700.cfi_def_cfa	%rsi,8
2701	movq	$1,%rax
2702
2703	movq	-48(%rsi),%r15
2704.cfi_restore	%r15
2705	movq	-40(%rsi),%r14
2706.cfi_restore	%r14
2707	movq	-32(%rsi),%r13
2708.cfi_restore	%r13
2709	movq	-24(%rsi),%r12
2710.cfi_restore	%r12
2711	movq	-16(%rsi),%rbp
2712.cfi_restore	%rbp
2713	movq	-8(%rsi),%rbx
2714.cfi_restore	%rbx
2715	leaq	(%rsi),%rsp
2716.cfi_def_cfa_register	%rsp
2717.Lpowerx5_epilogue:
2718	.byte	0xf3,0xc3
2719.cfi_endproc
2720.size	bn_powerx5,.-bn_powerx5
2721
2722.globl	bn_sqrx8x_internal
2723.hidden	bn_sqrx8x_internal
2724.type	bn_sqrx8x_internal,@function
2725.align	32
2726bn_sqrx8x_internal:
2727__bn_sqrx8x_internal:
2728.cfi_startproc
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769	leaq	48+8(%rsp),%rdi
2770	leaq	(%rsi,%r9,1),%rbp
2771	movq	%r9,0+8(%rsp)
2772	movq	%rbp,8+8(%rsp)
2773	jmp	.Lsqr8x_zero_start
2774
2775.align	32
2776.byte	0x66,0x66,0x66,0x2e,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00
2777.Lsqrx8x_zero:
2778.byte	0x3e
2779	movdqa	%xmm0,0(%rdi)
2780	movdqa	%xmm0,16(%rdi)
2781	movdqa	%xmm0,32(%rdi)
2782	movdqa	%xmm0,48(%rdi)
2783.Lsqr8x_zero_start:
2784	movdqa	%xmm0,64(%rdi)
2785	movdqa	%xmm0,80(%rdi)
2786	movdqa	%xmm0,96(%rdi)
2787	movdqa	%xmm0,112(%rdi)
2788	leaq	128(%rdi),%rdi
2789	subq	$64,%r9
2790	jnz	.Lsqrx8x_zero
2791
2792	movq	0(%rsi),%rdx
2793
2794	xorq	%r10,%r10
2795	xorq	%r11,%r11
2796	xorq	%r12,%r12
2797	xorq	%r13,%r13
2798	xorq	%r14,%r14
2799	xorq	%r15,%r15
2800	leaq	48+8(%rsp),%rdi
2801	xorq	%rbp,%rbp
2802	jmp	.Lsqrx8x_outer_loop
2803
2804.align	32
2805.Lsqrx8x_outer_loop:
2806	mulxq	8(%rsi),%r8,%rax
2807	adcxq	%r9,%r8
2808	adoxq	%rax,%r10
2809	mulxq	16(%rsi),%r9,%rax
2810	adcxq	%r10,%r9
2811	adoxq	%rax,%r11
2812.byte	0xc4,0xe2,0xab,0xf6,0x86,0x18,0x00,0x00,0x00
2813	adcxq	%r11,%r10
2814	adoxq	%rax,%r12
2815.byte	0xc4,0xe2,0xa3,0xf6,0x86,0x20,0x00,0x00,0x00
2816	adcxq	%r12,%r11
2817	adoxq	%rax,%r13
2818	mulxq	40(%rsi),%r12,%rax
2819	adcxq	%r13,%r12
2820	adoxq	%rax,%r14
2821	mulxq	48(%rsi),%r13,%rax
2822	adcxq	%r14,%r13
2823	adoxq	%r15,%rax
2824	mulxq	56(%rsi),%r14,%r15
2825	movq	8(%rsi),%rdx
2826	adcxq	%rax,%r14
2827	adoxq	%rbp,%r15
2828	adcq	64(%rdi),%r15
2829	movq	%r8,8(%rdi)
2830	movq	%r9,16(%rdi)
2831	sbbq	%rcx,%rcx
2832	xorq	%rbp,%rbp
2833
2834
2835	mulxq	16(%rsi),%r8,%rbx
2836	mulxq	24(%rsi),%r9,%rax
2837	adcxq	%r10,%r8
2838	adoxq	%rbx,%r9
2839	mulxq	32(%rsi),%r10,%rbx
2840	adcxq	%r11,%r9
2841	adoxq	%rax,%r10
2842.byte	0xc4,0xe2,0xa3,0xf6,0x86,0x28,0x00,0x00,0x00
2843	adcxq	%r12,%r10
2844	adoxq	%rbx,%r11
2845.byte	0xc4,0xe2,0x9b,0xf6,0x9e,0x30,0x00,0x00,0x00
2846	adcxq	%r13,%r11
2847	adoxq	%r14,%r12
2848.byte	0xc4,0x62,0x93,0xf6,0xb6,0x38,0x00,0x00,0x00
2849	movq	16(%rsi),%rdx
2850	adcxq	%rax,%r12
2851	adoxq	%rbx,%r13
2852	adcxq	%r15,%r13
2853	adoxq	%rbp,%r14
2854	adcxq	%rbp,%r14
2855
2856	movq	%r8,24(%rdi)
2857	movq	%r9,32(%rdi)
2858
2859	mulxq	24(%rsi),%r8,%rbx
2860	mulxq	32(%rsi),%r9,%rax
2861	adcxq	%r10,%r8
2862	adoxq	%rbx,%r9
2863	mulxq	40(%rsi),%r10,%rbx
2864	adcxq	%r11,%r9
2865	adoxq	%rax,%r10
2866.byte	0xc4,0xe2,0xa3,0xf6,0x86,0x30,0x00,0x00,0x00
2867	adcxq	%r12,%r10
2868	adoxq	%r13,%r11
2869.byte	0xc4,0x62,0x9b,0xf6,0xae,0x38,0x00,0x00,0x00
2870.byte	0x3e
2871	movq	24(%rsi),%rdx
2872	adcxq	%rbx,%r11
2873	adoxq	%rax,%r12
2874	adcxq	%r14,%r12
2875	movq	%r8,40(%rdi)
2876	movq	%r9,48(%rdi)
2877	mulxq	32(%rsi),%r8,%rax
2878	adoxq	%rbp,%r13
2879	adcxq	%rbp,%r13
2880
2881	mulxq	40(%rsi),%r9,%rbx
2882	adcxq	%r10,%r8
2883	adoxq	%rax,%r9
2884	mulxq	48(%rsi),%r10,%rax
2885	adcxq	%r11,%r9
2886	adoxq	%r12,%r10
2887	mulxq	56(%rsi),%r11,%r12
2888	movq	32(%rsi),%rdx
2889	movq	40(%rsi),%r14
2890	adcxq	%rbx,%r10
2891	adoxq	%rax,%r11
2892	movq	48(%rsi),%r15
2893	adcxq	%r13,%r11
2894	adoxq	%rbp,%r12
2895	adcxq	%rbp,%r12
2896
2897	movq	%r8,56(%rdi)
2898	movq	%r9,64(%rdi)
2899
2900	mulxq	%r14,%r9,%rax
2901	movq	56(%rsi),%r8
2902	adcxq	%r10,%r9
2903	mulxq	%r15,%r10,%rbx
2904	adoxq	%rax,%r10
2905	adcxq	%r11,%r10
2906	mulxq	%r8,%r11,%rax
2907	movq	%r14,%rdx
2908	adoxq	%rbx,%r11
2909	adcxq	%r12,%r11
2910
2911	adcxq	%rbp,%rax
2912
2913	mulxq	%r15,%r14,%rbx
2914	mulxq	%r8,%r12,%r13
2915	movq	%r15,%rdx
2916	leaq	64(%rsi),%rsi
2917	adcxq	%r14,%r11
2918	adoxq	%rbx,%r12
2919	adcxq	%rax,%r12
2920	adoxq	%rbp,%r13
2921
2922.byte	0x67,0x67
2923	mulxq	%r8,%r8,%r14
2924	adcxq	%r8,%r13
2925	adcxq	%rbp,%r14
2926
2927	cmpq	8+8(%rsp),%rsi
2928	je	.Lsqrx8x_outer_break
2929
2930	negq	%rcx
2931	movq	$-8,%rcx
2932	movq	%rbp,%r15
2933	movq	64(%rdi),%r8
2934	adcxq	72(%rdi),%r9
2935	adcxq	80(%rdi),%r10
2936	adcxq	88(%rdi),%r11
2937	adcq	96(%rdi),%r12
2938	adcq	104(%rdi),%r13
2939	adcq	112(%rdi),%r14
2940	adcq	120(%rdi),%r15
2941	leaq	(%rsi),%rbp
2942	leaq	128(%rdi),%rdi
2943	sbbq	%rax,%rax
2944
2945	movq	-64(%rsi),%rdx
2946	movq	%rax,16+8(%rsp)
2947	movq	%rdi,24+8(%rsp)
2948
2949
2950	xorl	%eax,%eax
2951	jmp	.Lsqrx8x_loop
2952
2953.align	32
2954.Lsqrx8x_loop:
2955	movq	%r8,%rbx
2956	mulxq	0(%rbp),%rax,%r8
2957	adcxq	%rax,%rbx
2958	adoxq	%r9,%r8
2959
2960	mulxq	8(%rbp),%rax,%r9
2961	adcxq	%rax,%r8
2962	adoxq	%r10,%r9
2963
2964	mulxq	16(%rbp),%rax,%r10
2965	adcxq	%rax,%r9
2966	adoxq	%r11,%r10
2967
2968	mulxq	24(%rbp),%rax,%r11
2969	adcxq	%rax,%r10
2970	adoxq	%r12,%r11
2971
2972.byte	0xc4,0x62,0xfb,0xf6,0xa5,0x20,0x00,0x00,0x00
2973	adcxq	%rax,%r11
2974	adoxq	%r13,%r12
2975
2976	mulxq	40(%rbp),%rax,%r13
2977	adcxq	%rax,%r12
2978	adoxq	%r14,%r13
2979
2980	mulxq	48(%rbp),%rax,%r14
2981	movq	%rbx,(%rdi,%rcx,8)
2982	movl	$0,%ebx
2983	adcxq	%rax,%r13
2984	adoxq	%r15,%r14
2985
2986.byte	0xc4,0x62,0xfb,0xf6,0xbd,0x38,0x00,0x00,0x00
2987	movq	8(%rsi,%rcx,8),%rdx
2988	adcxq	%rax,%r14
2989	adoxq	%rbx,%r15
2990	adcxq	%rbx,%r15
2991
2992.byte	0x67
2993	incq	%rcx
2994	jnz	.Lsqrx8x_loop
2995
2996	leaq	64(%rbp),%rbp
2997	movq	$-8,%rcx
2998	cmpq	8+8(%rsp),%rbp
2999	je	.Lsqrx8x_break
3000
3001	subq	16+8(%rsp),%rbx
3002.byte	0x66
3003	movq	-64(%rsi),%rdx
3004	adcxq	0(%rdi),%r8
3005	adcxq	8(%rdi),%r9
3006	adcq	16(%rdi),%r10
3007	adcq	24(%rdi),%r11
3008	adcq	32(%rdi),%r12
3009	adcq	40(%rdi),%r13
3010	adcq	48(%rdi),%r14
3011	adcq	56(%rdi),%r15
3012	leaq	64(%rdi),%rdi
3013.byte	0x67
3014	sbbq	%rax,%rax
3015	xorl	%ebx,%ebx
3016	movq	%rax,16+8(%rsp)
3017	jmp	.Lsqrx8x_loop
3018
3019.align	32
3020.Lsqrx8x_break:
3021	xorq	%rbp,%rbp
3022	subq	16+8(%rsp),%rbx
3023	adcxq	%rbp,%r8
3024	movq	24+8(%rsp),%rcx
3025	adcxq	%rbp,%r9
3026	movq	0(%rsi),%rdx
3027	adcq	$0,%r10
3028	movq	%r8,0(%rdi)
3029	adcq	$0,%r11
3030	adcq	$0,%r12
3031	adcq	$0,%r13
3032	adcq	$0,%r14
3033	adcq	$0,%r15
3034	cmpq	%rcx,%rdi
3035	je	.Lsqrx8x_outer_loop
3036
3037	movq	%r9,8(%rdi)
3038	movq	8(%rcx),%r9
3039	movq	%r10,16(%rdi)
3040	movq	16(%rcx),%r10
3041	movq	%r11,24(%rdi)
3042	movq	24(%rcx),%r11
3043	movq	%r12,32(%rdi)
3044	movq	32(%rcx),%r12
3045	movq	%r13,40(%rdi)
3046	movq	40(%rcx),%r13
3047	movq	%r14,48(%rdi)
3048	movq	48(%rcx),%r14
3049	movq	%r15,56(%rdi)
3050	movq	56(%rcx),%r15
3051	movq	%rcx,%rdi
3052	jmp	.Lsqrx8x_outer_loop
3053
3054.align	32
3055.Lsqrx8x_outer_break:
3056	movq	%r9,72(%rdi)
3057.byte	102,72,15,126,217
3058	movq	%r10,80(%rdi)
3059	movq	%r11,88(%rdi)
3060	movq	%r12,96(%rdi)
3061	movq	%r13,104(%rdi)
3062	movq	%r14,112(%rdi)
3063	leaq	48+8(%rsp),%rdi
3064	movq	(%rsi,%rcx,1),%rdx
3065
3066	movq	8(%rdi),%r11
3067	xorq	%r10,%r10
3068	movq	0+8(%rsp),%r9
3069	adoxq	%r11,%r11
3070	movq	16(%rdi),%r12
3071	movq	24(%rdi),%r13
3072
3073
3074.align	32
3075.Lsqrx4x_shift_n_add:
3076	mulxq	%rdx,%rax,%rbx
3077	adoxq	%r12,%r12
3078	adcxq	%r10,%rax
3079.byte	0x48,0x8b,0x94,0x0e,0x08,0x00,0x00,0x00
3080.byte	0x4c,0x8b,0x97,0x20,0x00,0x00,0x00
3081	adoxq	%r13,%r13
3082	adcxq	%r11,%rbx
3083	movq	40(%rdi),%r11
3084	movq	%rax,0(%rdi)
3085	movq	%rbx,8(%rdi)
3086
3087	mulxq	%rdx,%rax,%rbx
3088	adoxq	%r10,%r10
3089	adcxq	%r12,%rax
3090	movq	16(%rsi,%rcx,1),%rdx
3091	movq	48(%rdi),%r12
3092	adoxq	%r11,%r11
3093	adcxq	%r13,%rbx
3094	movq	56(%rdi),%r13
3095	movq	%rax,16(%rdi)
3096	movq	%rbx,24(%rdi)
3097
3098	mulxq	%rdx,%rax,%rbx
3099	adoxq	%r12,%r12
3100	adcxq	%r10,%rax
3101	movq	24(%rsi,%rcx,1),%rdx
3102	leaq	32(%rcx),%rcx
3103	movq	64(%rdi),%r10
3104	adoxq	%r13,%r13
3105	adcxq	%r11,%rbx
3106	movq	72(%rdi),%r11
3107	movq	%rax,32(%rdi)
3108	movq	%rbx,40(%rdi)
3109
3110	mulxq	%rdx,%rax,%rbx
3111	adoxq	%r10,%r10
3112	adcxq	%r12,%rax
3113	jrcxz	.Lsqrx4x_shift_n_add_break
3114.byte	0x48,0x8b,0x94,0x0e,0x00,0x00,0x00,0x00
3115	adoxq	%r11,%r11
3116	adcxq	%r13,%rbx
3117	movq	80(%rdi),%r12
3118	movq	88(%rdi),%r13
3119	movq	%rax,48(%rdi)
3120	movq	%rbx,56(%rdi)
3121	leaq	64(%rdi),%rdi
3122	nop
3123	jmp	.Lsqrx4x_shift_n_add
3124
3125.align	32
3126.Lsqrx4x_shift_n_add_break:
3127	adcxq	%r13,%rbx
3128	movq	%rax,48(%rdi)
3129	movq	%rbx,56(%rdi)
3130	leaq	64(%rdi),%rdi
3131.byte	102,72,15,126,213
3132__bn_sqrx8x_reduction:
3133	xorl	%eax,%eax
3134	movq	32+8(%rsp),%rbx
3135	movq	48+8(%rsp),%rdx
3136	leaq	-64(%rbp,%r9,1),%rcx
3137
3138	movq	%rcx,0+8(%rsp)
3139	movq	%rdi,8+8(%rsp)
3140
3141	leaq	48+8(%rsp),%rdi
3142	jmp	.Lsqrx8x_reduction_loop
3143
3144.align	32
3145.Lsqrx8x_reduction_loop:
3146	movq	8(%rdi),%r9
3147	movq	16(%rdi),%r10
3148	movq	24(%rdi),%r11
3149	movq	32(%rdi),%r12
3150	movq	%rdx,%r8
3151	imulq	%rbx,%rdx
3152	movq	40(%rdi),%r13
3153	movq	48(%rdi),%r14
3154	movq	56(%rdi),%r15
3155	movq	%rax,24+8(%rsp)
3156
3157	leaq	64(%rdi),%rdi
3158	xorq	%rsi,%rsi
3159	movq	$-8,%rcx
3160	jmp	.Lsqrx8x_reduce
3161
3162.align	32
3163.Lsqrx8x_reduce:
3164	movq	%r8,%rbx
3165	mulxq	0(%rbp),%rax,%r8
3166	adcxq	%rbx,%rax
3167	adoxq	%r9,%r8
3168
3169	mulxq	8(%rbp),%rbx,%r9
3170	adcxq	%rbx,%r8
3171	adoxq	%r10,%r9
3172
3173	mulxq	16(%rbp),%rbx,%r10
3174	adcxq	%rbx,%r9
3175	adoxq	%r11,%r10
3176
3177	mulxq	24(%rbp),%rbx,%r11
3178	adcxq	%rbx,%r10
3179	adoxq	%r12,%r11
3180
3181.byte	0xc4,0x62,0xe3,0xf6,0xa5,0x20,0x00,0x00,0x00
3182	movq	%rdx,%rax
3183	movq	%r8,%rdx
3184	adcxq	%rbx,%r11
3185	adoxq	%r13,%r12
3186
3187	mulxq	32+8(%rsp),%rbx,%rdx
3188	movq	%rax,%rdx
3189	movq	%rax,64+48+8(%rsp,%rcx,8)
3190
3191	mulxq	40(%rbp),%rax,%r13
3192	adcxq	%rax,%r12
3193	adoxq	%r14,%r13
3194
3195	mulxq	48(%rbp),%rax,%r14
3196	adcxq	%rax,%r13
3197	adoxq	%r15,%r14
3198
3199	mulxq	56(%rbp),%rax,%r15
3200	movq	%rbx,%rdx
3201	adcxq	%rax,%r14
3202	adoxq	%rsi,%r15
3203	adcxq	%rsi,%r15
3204
3205.byte	0x67,0x67,0x67
3206	incq	%rcx
3207	jnz	.Lsqrx8x_reduce
3208
3209	movq	%rsi,%rax
3210	cmpq	0+8(%rsp),%rbp
3211	jae	.Lsqrx8x_no_tail
3212
3213	movq	48+8(%rsp),%rdx
3214	addq	0(%rdi),%r8
3215	leaq	64(%rbp),%rbp
3216	movq	$-8,%rcx
3217	adcxq	8(%rdi),%r9
3218	adcxq	16(%rdi),%r10
3219	adcq	24(%rdi),%r11
3220	adcq	32(%rdi),%r12
3221	adcq	40(%rdi),%r13
3222	adcq	48(%rdi),%r14
3223	adcq	56(%rdi),%r15
3224	leaq	64(%rdi),%rdi
3225	sbbq	%rax,%rax
3226
3227	xorq	%rsi,%rsi
3228	movq	%rax,16+8(%rsp)
3229	jmp	.Lsqrx8x_tail
3230
3231.align	32
3232.Lsqrx8x_tail:
3233	movq	%r8,%rbx
3234	mulxq	0(%rbp),%rax,%r8
3235	adcxq	%rax,%rbx
3236	adoxq	%r9,%r8
3237
3238	mulxq	8(%rbp),%rax,%r9
3239	adcxq	%rax,%r8
3240	adoxq	%r10,%r9
3241
3242	mulxq	16(%rbp),%rax,%r10
3243	adcxq	%rax,%r9
3244	adoxq	%r11,%r10
3245
3246	mulxq	24(%rbp),%rax,%r11
3247	adcxq	%rax,%r10
3248	adoxq	%r12,%r11
3249
3250.byte	0xc4,0x62,0xfb,0xf6,0xa5,0x20,0x00,0x00,0x00
3251	adcxq	%rax,%r11
3252	adoxq	%r13,%r12
3253
3254	mulxq	40(%rbp),%rax,%r13
3255	adcxq	%rax,%r12
3256	adoxq	%r14,%r13
3257
3258	mulxq	48(%rbp),%rax,%r14
3259	adcxq	%rax,%r13
3260	adoxq	%r15,%r14
3261
3262	mulxq	56(%rbp),%rax,%r15
3263	movq	72+48+8(%rsp,%rcx,8),%rdx
3264	adcxq	%rax,%r14
3265	adoxq	%rsi,%r15
3266	movq	%rbx,(%rdi,%rcx,8)
3267	movq	%r8,%rbx
3268	adcxq	%rsi,%r15
3269
3270	incq	%rcx
3271	jnz	.Lsqrx8x_tail
3272
3273	cmpq	0+8(%rsp),%rbp
3274	jae	.Lsqrx8x_tail_done
3275
3276	subq	16+8(%rsp),%rsi
3277	movq	48+8(%rsp),%rdx
3278	leaq	64(%rbp),%rbp
3279	adcq	0(%rdi),%r8
3280	adcq	8(%rdi),%r9
3281	adcq	16(%rdi),%r10
3282	adcq	24(%rdi),%r11
3283	adcq	32(%rdi),%r12
3284	adcq	40(%rdi),%r13
3285	adcq	48(%rdi),%r14
3286	adcq	56(%rdi),%r15
3287	leaq	64(%rdi),%rdi
3288	sbbq	%rax,%rax
3289	subq	$8,%rcx
3290
3291	xorq	%rsi,%rsi
3292	movq	%rax,16+8(%rsp)
3293	jmp	.Lsqrx8x_tail
3294
3295.align	32
3296.Lsqrx8x_tail_done:
3297	xorq	%rax,%rax
3298	addq	24+8(%rsp),%r8
3299	adcq	$0,%r9
3300	adcq	$0,%r10
3301	adcq	$0,%r11
3302	adcq	$0,%r12
3303	adcq	$0,%r13
3304	adcq	$0,%r14
3305	adcq	$0,%r15
3306	adcq	$0,%rax
3307
3308	subq	16+8(%rsp),%rsi
3309.Lsqrx8x_no_tail:
3310	adcq	0(%rdi),%r8
3311.byte	102,72,15,126,217
3312	adcq	8(%rdi),%r9
3313	movq	56(%rbp),%rsi
3314.byte	102,72,15,126,213
3315	adcq	16(%rdi),%r10
3316	adcq	24(%rdi),%r11
3317	adcq	32(%rdi),%r12
3318	adcq	40(%rdi),%r13
3319	adcq	48(%rdi),%r14
3320	adcq	56(%rdi),%r15
3321	adcq	$0,%rax
3322
3323	movq	32+8(%rsp),%rbx
3324	movq	64(%rdi,%rcx,1),%rdx
3325
3326	movq	%r8,0(%rdi)
3327	leaq	64(%rdi),%r8
3328	movq	%r9,8(%rdi)
3329	movq	%r10,16(%rdi)
3330	movq	%r11,24(%rdi)
3331	movq	%r12,32(%rdi)
3332	movq	%r13,40(%rdi)
3333	movq	%r14,48(%rdi)
3334	movq	%r15,56(%rdi)
3335
3336	leaq	64(%rdi,%rcx,1),%rdi
3337	cmpq	8+8(%rsp),%r8
3338	jb	.Lsqrx8x_reduction_loop
3339	.byte	0xf3,0xc3
3340.cfi_endproc
3341.size	bn_sqrx8x_internal,.-bn_sqrx8x_internal
3342.align	32
3343__bn_postx4x_internal:
3344.cfi_startproc
3345	movq	0(%rbp),%r12
3346	movq	%rcx,%r10
3347	movq	%rcx,%r9
3348	negq	%rax
3349	sarq	$3+2,%rcx
3350
3351.byte	102,72,15,126,202
3352.byte	102,72,15,126,206
3353	decq	%r12
3354	movq	8(%rbp),%r13
3355	xorq	%r8,%r8
3356	movq	16(%rbp),%r14
3357	movq	24(%rbp),%r15
3358	jmp	.Lsqrx4x_sub_entry
3359
3360.align	16
3361.Lsqrx4x_sub:
3362	movq	0(%rbp),%r12
3363	movq	8(%rbp),%r13
3364	movq	16(%rbp),%r14
3365	movq	24(%rbp),%r15
3366.Lsqrx4x_sub_entry:
3367	andnq	%rax,%r12,%r12
3368	leaq	32(%rbp),%rbp
3369	andnq	%rax,%r13,%r13
3370	andnq	%rax,%r14,%r14
3371	andnq	%rax,%r15,%r15
3372
3373	negq	%r8
3374	adcq	0(%rdi),%r12
3375	adcq	8(%rdi),%r13
3376	adcq	16(%rdi),%r14
3377	adcq	24(%rdi),%r15
3378	movq	%r12,0(%rdx)
3379	leaq	32(%rdi),%rdi
3380	movq	%r13,8(%rdx)
3381	sbbq	%r8,%r8
3382	movq	%r14,16(%rdx)
3383	movq	%r15,24(%rdx)
3384	leaq	32(%rdx),%rdx
3385
3386	incq	%rcx
3387	jnz	.Lsqrx4x_sub
3388
3389	negq	%r9
3390
3391	.byte	0xf3,0xc3
3392.cfi_endproc
3393.size	__bn_postx4x_internal,.-__bn_postx4x_internal
3394.globl	bn_get_bits5
3395.type	bn_get_bits5,@function
3396.align	16
3397bn_get_bits5:
3398.cfi_startproc
3399	leaq	0(%rdi),%r10
3400	leaq	1(%rdi),%r11
3401	movl	%esi,%ecx
3402	shrl	$4,%esi
3403	andl	$15,%ecx
3404	leal	-8(%rcx),%eax
3405	cmpl	$11,%ecx
3406	cmovaq	%r11,%r10
3407	cmoval	%eax,%ecx
3408	movzwl	(%r10,%rsi,2),%eax
3409	shrl	%cl,%eax
3410	andl	$31,%eax
3411	.byte	0xf3,0xc3
3412.cfi_endproc
3413.size	bn_get_bits5,.-bn_get_bits5
3414
3415.globl	bn_scatter5
3416.type	bn_scatter5,@function
3417.align	16
3418bn_scatter5:
3419.cfi_startproc
3420	cmpl	$0,%esi
3421	jz	.Lscatter_epilogue
3422	leaq	(%rdx,%rcx,8),%rdx
3423.Lscatter:
3424	movq	(%rdi),%rax
3425	leaq	8(%rdi),%rdi
3426	movq	%rax,(%rdx)
3427	leaq	256(%rdx),%rdx
3428	subl	$1,%esi
3429	jnz	.Lscatter
3430.Lscatter_epilogue:
3431	.byte	0xf3,0xc3
3432.cfi_endproc
3433.size	bn_scatter5,.-bn_scatter5
3434
3435.globl	bn_gather5
3436.type	bn_gather5,@function
3437.align	32
3438bn_gather5:
3439.LSEH_begin_bn_gather5:
3440.cfi_startproc
3441
3442.byte	0x4c,0x8d,0x14,0x24
3443.byte	0x48,0x81,0xec,0x08,0x01,0x00,0x00
3444	leaq	.Linc(%rip),%rax
3445	andq	$-16,%rsp
3446
3447	movd	%ecx,%xmm5
3448	movdqa	0(%rax),%xmm0
3449	movdqa	16(%rax),%xmm1
3450	leaq	128(%rdx),%r11
3451	leaq	128(%rsp),%rax
3452
3453	pshufd	$0,%xmm5,%xmm5
3454	movdqa	%xmm1,%xmm4
3455	movdqa	%xmm1,%xmm2
3456	paddd	%xmm0,%xmm1
3457	pcmpeqd	%xmm5,%xmm0
3458	movdqa	%xmm4,%xmm3
3459
3460	paddd	%xmm1,%xmm2
3461	pcmpeqd	%xmm5,%xmm1
3462	movdqa	%xmm0,-128(%rax)
3463	movdqa	%xmm4,%xmm0
3464
3465	paddd	%xmm2,%xmm3
3466	pcmpeqd	%xmm5,%xmm2
3467	movdqa	%xmm1,-112(%rax)
3468	movdqa	%xmm4,%xmm1
3469
3470	paddd	%xmm3,%xmm0
3471	pcmpeqd	%xmm5,%xmm3
3472	movdqa	%xmm2,-96(%rax)
3473	movdqa	%xmm4,%xmm2
3474	paddd	%xmm0,%xmm1
3475	pcmpeqd	%xmm5,%xmm0
3476	movdqa	%xmm3,-80(%rax)
3477	movdqa	%xmm4,%xmm3
3478
3479	paddd	%xmm1,%xmm2
3480	pcmpeqd	%xmm5,%xmm1
3481	movdqa	%xmm0,-64(%rax)
3482	movdqa	%xmm4,%xmm0
3483
3484	paddd	%xmm2,%xmm3
3485	pcmpeqd	%xmm5,%xmm2
3486	movdqa	%xmm1,-48(%rax)
3487	movdqa	%xmm4,%xmm1
3488
3489	paddd	%xmm3,%xmm0
3490	pcmpeqd	%xmm5,%xmm3
3491	movdqa	%xmm2,-32(%rax)
3492	movdqa	%xmm4,%xmm2
3493	paddd	%xmm0,%xmm1
3494	pcmpeqd	%xmm5,%xmm0
3495	movdqa	%xmm3,-16(%rax)
3496	movdqa	%xmm4,%xmm3
3497
3498	paddd	%xmm1,%xmm2
3499	pcmpeqd	%xmm5,%xmm1
3500	movdqa	%xmm0,0(%rax)
3501	movdqa	%xmm4,%xmm0
3502
3503	paddd	%xmm2,%xmm3
3504	pcmpeqd	%xmm5,%xmm2
3505	movdqa	%xmm1,16(%rax)
3506	movdqa	%xmm4,%xmm1
3507
3508	paddd	%xmm3,%xmm0
3509	pcmpeqd	%xmm5,%xmm3
3510	movdqa	%xmm2,32(%rax)
3511	movdqa	%xmm4,%xmm2
3512	paddd	%xmm0,%xmm1
3513	pcmpeqd	%xmm5,%xmm0
3514	movdqa	%xmm3,48(%rax)
3515	movdqa	%xmm4,%xmm3
3516
3517	paddd	%xmm1,%xmm2
3518	pcmpeqd	%xmm5,%xmm1
3519	movdqa	%xmm0,64(%rax)
3520	movdqa	%xmm4,%xmm0
3521
3522	paddd	%xmm2,%xmm3
3523	pcmpeqd	%xmm5,%xmm2
3524	movdqa	%xmm1,80(%rax)
3525	movdqa	%xmm4,%xmm1
3526
3527	paddd	%xmm3,%xmm0
3528	pcmpeqd	%xmm5,%xmm3
3529	movdqa	%xmm2,96(%rax)
3530	movdqa	%xmm4,%xmm2
3531	movdqa	%xmm3,112(%rax)
3532	jmp	.Lgather
3533
3534.align	32
3535.Lgather:
3536	pxor	%xmm4,%xmm4
3537	pxor	%xmm5,%xmm5
3538	movdqa	-128(%r11),%xmm0
3539	movdqa	-112(%r11),%xmm1
3540	movdqa	-96(%r11),%xmm2
3541	pand	-128(%rax),%xmm0
3542	movdqa	-80(%r11),%xmm3
3543	pand	-112(%rax),%xmm1
3544	por	%xmm0,%xmm4
3545	pand	-96(%rax),%xmm2
3546	por	%xmm1,%xmm5
3547	pand	-80(%rax),%xmm3
3548	por	%xmm2,%xmm4
3549	por	%xmm3,%xmm5
3550	movdqa	-64(%r11),%xmm0
3551	movdqa	-48(%r11),%xmm1
3552	movdqa	-32(%r11),%xmm2
3553	pand	-64(%rax),%xmm0
3554	movdqa	-16(%r11),%xmm3
3555	pand	-48(%rax),%xmm1
3556	por	%xmm0,%xmm4
3557	pand	-32(%rax),%xmm2
3558	por	%xmm1,%xmm5
3559	pand	-16(%rax),%xmm3
3560	por	%xmm2,%xmm4
3561	por	%xmm3,%xmm5
3562	movdqa	0(%r11),%xmm0
3563	movdqa	16(%r11),%xmm1
3564	movdqa	32(%r11),%xmm2
3565	pand	0(%rax),%xmm0
3566	movdqa	48(%r11),%xmm3
3567	pand	16(%rax),%xmm1
3568	por	%xmm0,%xmm4
3569	pand	32(%rax),%xmm2
3570	por	%xmm1,%xmm5
3571	pand	48(%rax),%xmm3
3572	por	%xmm2,%xmm4
3573	por	%xmm3,%xmm5
3574	movdqa	64(%r11),%xmm0
3575	movdqa	80(%r11),%xmm1
3576	movdqa	96(%r11),%xmm2
3577	pand	64(%rax),%xmm0
3578	movdqa	112(%r11),%xmm3
3579	pand	80(%rax),%xmm1
3580	por	%xmm0,%xmm4
3581	pand	96(%rax),%xmm2
3582	por	%xmm1,%xmm5
3583	pand	112(%rax),%xmm3
3584	por	%xmm2,%xmm4
3585	por	%xmm3,%xmm5
3586	por	%xmm5,%xmm4
3587	leaq	256(%r11),%r11
3588	pshufd	$0x4e,%xmm4,%xmm0
3589	por	%xmm4,%xmm0
3590	movq	%xmm0,(%rdi)
3591	leaq	8(%rdi),%rdi
3592	subl	$1,%esi
3593	jnz	.Lgather
3594
3595	leaq	(%r10),%rsp
3596	.byte	0xf3,0xc3
3597.LSEH_end_bn_gather5:
3598.cfi_endproc
3599.size	bn_gather5,.-bn_gather5
3600.align	64
3601.Linc:
3602.long	0,0, 1,1
3603.long	2,2, 2,2
3604.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
3605	.section ".note.gnu.property", "a"
3606	.p2align 3
3607	.long 1f - 0f
3608	.long 4f - 1f
3609	.long 5
36100:
3611	# "GNU" encoded with .byte, since .asciz isn't supported
3612	# on Solaris.
3613	.byte 0x47
3614	.byte 0x4e
3615	.byte 0x55
3616	.byte 0
36171:
3618	.p2align 3
3619	.long 0xc0000002
3620	.long 3f - 2f
36212:
3622	.long 3
36233:
3624	.p2align 3
36254:
3626