1299481Sjkim# $FreeBSD: releng/11.0/secure/lib/libcrypto/amd64/x86_64-mont.S 314125 2017-02-23 07:11:48Z delphij $
2299481Sjkim# Do not modify. This file is auto-generated from x86_64-mont.pl.
3238405Sjkim.text
4238405Sjkim
5290207Sjkim
6290207Sjkim
7238405Sjkim.globl	bn_mul_mont
8238405Sjkim.type	bn_mul_mont,@function
9238405Sjkim.align	16
10238405Sjkimbn_mul_mont:
11306198Sjkim	movl	%r9d,%r9d
12306198Sjkim	movq	%rsp,%rax
13238405Sjkim	testl	$3,%r9d
14238405Sjkim	jnz	.Lmul_enter
15238405Sjkim	cmpl	$8,%r9d
16238405Sjkim	jb	.Lmul_enter
17299481Sjkim	movl	OPENSSL_ia32cap_P+8(%rip),%r11d
18238405Sjkim	cmpq	%rsi,%rdx
19238405Sjkim	jne	.Lmul4x_enter
20290207Sjkim	testl	$7,%r9d
21290207Sjkim	jz	.Lsqr8x_enter
22290207Sjkim	jmp	.Lmul4x_enter
23238405Sjkim
24238405Sjkim.align	16
25238405Sjkim.Lmul_enter:
26238405Sjkim	pushq	%rbx
27238405Sjkim	pushq	%rbp
28238405Sjkim	pushq	%r12
29238405Sjkim	pushq	%r13
30238405Sjkim	pushq	%r14
31238405Sjkim	pushq	%r15
32238405Sjkim
33306198Sjkim	negq	%r9
34238405Sjkim	movq	%rsp,%r11
35306198Sjkim	leaq	-16(%rsp,%r9,8),%r10
36306198Sjkim	negq	%r9
37306198Sjkim	andq	$-1024,%r10
38238405Sjkim
39298998Sjkim
40298998Sjkim
41298998Sjkim
42298998Sjkim
43298998Sjkim
44298998Sjkim
45306198Sjkim	subq	%r10,%r11
46298998Sjkim	andq	$-4096,%r11
47306198Sjkim	leaq	(%r10,%r11,1),%rsp
48306198Sjkim	movq	(%rsp),%r11
49306198Sjkim	cmpq	%r10,%rsp
50306198Sjkim	ja	.Lmul_page_walk
51306198Sjkim	jmp	.Lmul_page_walk_done
52306198Sjkim
53306198Sjkim.align	16
54298998Sjkim.Lmul_page_walk:
55306198Sjkim	leaq	-4096(%rsp),%rsp
56306198Sjkim	movq	(%rsp),%r11
57306198Sjkim	cmpq	%r10,%rsp
58306198Sjkim	ja	.Lmul_page_walk
59306198Sjkim.Lmul_page_walk_done:
60298998Sjkim
61306198Sjkim	movq	%rax,8(%rsp,%r9,8)
62306198Sjkim.Lmul_body:
63238405Sjkim	movq	%rdx,%r12
64238405Sjkim	movq	(%r8),%r8
65238405Sjkim	movq	(%r12),%rbx
66238405Sjkim	movq	(%rsi),%rax
67238405Sjkim
68238405Sjkim	xorq	%r14,%r14
69238405Sjkim	xorq	%r15,%r15
70238405Sjkim
71238405Sjkim	movq	%r8,%rbp
72238405Sjkim	mulq	%rbx
73238405Sjkim	movq	%rax,%r10
74238405Sjkim	movq	(%rcx),%rax
75238405Sjkim
76238405Sjkim	imulq	%r10,%rbp
77238405Sjkim	movq	%rdx,%r11
78238405Sjkim
79238405Sjkim	mulq	%rbp
80238405Sjkim	addq	%rax,%r10
81238405Sjkim	movq	8(%rsi),%rax
82238405Sjkim	adcq	$0,%rdx
83238405Sjkim	movq	%rdx,%r13
84238405Sjkim
85238405Sjkim	leaq	1(%r15),%r15
86238405Sjkim	jmp	.L1st_enter
87238405Sjkim
88238405Sjkim.align	16
89238405Sjkim.L1st:
90238405Sjkim	addq	%rax,%r13
91238405Sjkim	movq	(%rsi,%r15,8),%rax
92238405Sjkim	adcq	$0,%rdx
93238405Sjkim	addq	%r11,%r13
94238405Sjkim	movq	%r10,%r11
95238405Sjkim	adcq	$0,%rdx
96238405Sjkim	movq	%r13,-16(%rsp,%r15,8)
97238405Sjkim	movq	%rdx,%r13
98238405Sjkim
99238405Sjkim.L1st_enter:
100238405Sjkim	mulq	%rbx
101238405Sjkim	addq	%rax,%r11
102238405Sjkim	movq	(%rcx,%r15,8),%rax
103238405Sjkim	adcq	$0,%rdx
104238405Sjkim	leaq	1(%r15),%r15
105238405Sjkim	movq	%rdx,%r10
106238405Sjkim
107238405Sjkim	mulq	%rbp
108238405Sjkim	cmpq	%r9,%r15
109238405Sjkim	jne	.L1st
110238405Sjkim
111238405Sjkim	addq	%rax,%r13
112238405Sjkim	movq	(%rsi),%rax
113238405Sjkim	adcq	$0,%rdx
114238405Sjkim	addq	%r11,%r13
115238405Sjkim	adcq	$0,%rdx
116238405Sjkim	movq	%r13,-16(%rsp,%r15,8)
117238405Sjkim	movq	%rdx,%r13
118238405Sjkim	movq	%r10,%r11
119238405Sjkim
120238405Sjkim	xorq	%rdx,%rdx
121238405Sjkim	addq	%r11,%r13
122238405Sjkim	adcq	$0,%rdx
123238405Sjkim	movq	%r13,-8(%rsp,%r9,8)
124238405Sjkim	movq	%rdx,(%rsp,%r9,8)
125238405Sjkim
126238405Sjkim	leaq	1(%r14),%r14
127238405Sjkim	jmp	.Louter
128238405Sjkim.align	16
129238405Sjkim.Louter:
130238405Sjkim	movq	(%r12,%r14,8),%rbx
131238405Sjkim	xorq	%r15,%r15
132238405Sjkim	movq	%r8,%rbp
133238405Sjkim	movq	(%rsp),%r10
134238405Sjkim	mulq	%rbx
135238405Sjkim	addq	%rax,%r10
136238405Sjkim	movq	(%rcx),%rax
137238405Sjkim	adcq	$0,%rdx
138238405Sjkim
139238405Sjkim	imulq	%r10,%rbp
140238405Sjkim	movq	%rdx,%r11
141238405Sjkim
142238405Sjkim	mulq	%rbp
143238405Sjkim	addq	%rax,%r10
144238405Sjkim	movq	8(%rsi),%rax
145238405Sjkim	adcq	$0,%rdx
146238405Sjkim	movq	8(%rsp),%r10
147238405Sjkim	movq	%rdx,%r13
148238405Sjkim
149238405Sjkim	leaq	1(%r15),%r15
150238405Sjkim	jmp	.Linner_enter
151238405Sjkim
152238405Sjkim.align	16
153238405Sjkim.Linner:
154238405Sjkim	addq	%rax,%r13
155238405Sjkim	movq	(%rsi,%r15,8),%rax
156238405Sjkim	adcq	$0,%rdx
157238405Sjkim	addq	%r10,%r13
158238405Sjkim	movq	(%rsp,%r15,8),%r10
159238405Sjkim	adcq	$0,%rdx
160238405Sjkim	movq	%r13,-16(%rsp,%r15,8)
161238405Sjkim	movq	%rdx,%r13
162238405Sjkim
163238405Sjkim.Linner_enter:
164238405Sjkim	mulq	%rbx
165238405Sjkim	addq	%rax,%r11
166238405Sjkim	movq	(%rcx,%r15,8),%rax
167238405Sjkim	adcq	$0,%rdx
168238405Sjkim	addq	%r11,%r10
169238405Sjkim	movq	%rdx,%r11
170238405Sjkim	adcq	$0,%r11
171238405Sjkim	leaq	1(%r15),%r15
172238405Sjkim
173238405Sjkim	mulq	%rbp
174238405Sjkim	cmpq	%r9,%r15
175238405Sjkim	jne	.Linner
176238405Sjkim
177238405Sjkim	addq	%rax,%r13
178238405Sjkim	movq	(%rsi),%rax
179238405Sjkim	adcq	$0,%rdx
180238405Sjkim	addq	%r10,%r13
181238405Sjkim	movq	(%rsp,%r15,8),%r10
182238405Sjkim	adcq	$0,%rdx
183238405Sjkim	movq	%r13,-16(%rsp,%r15,8)
184238405Sjkim	movq	%rdx,%r13
185238405Sjkim
186238405Sjkim	xorq	%rdx,%rdx
187238405Sjkim	addq	%r11,%r13
188238405Sjkim	adcq	$0,%rdx
189238405Sjkim	addq	%r10,%r13
190238405Sjkim	adcq	$0,%rdx
191238405Sjkim	movq	%r13,-8(%rsp,%r9,8)
192238405Sjkim	movq	%rdx,(%rsp,%r9,8)
193238405Sjkim
194238405Sjkim	leaq	1(%r14),%r14
195238405Sjkim	cmpq	%r9,%r14
196290207Sjkim	jb	.Louter
197238405Sjkim
198238405Sjkim	xorq	%r14,%r14
199238405Sjkim	movq	(%rsp),%rax
200238405Sjkim	leaq	(%rsp),%rsi
201238405Sjkim	movq	%r9,%r15
202238405Sjkim	jmp	.Lsub
203238405Sjkim.align	16
204238405Sjkim.Lsub:	sbbq	(%rcx,%r14,8),%rax
205238405Sjkim	movq	%rax,(%rdi,%r14,8)
206238405Sjkim	movq	8(%rsi,%r14,8),%rax
207238405Sjkim	leaq	1(%r14),%r14
208238405Sjkim	decq	%r15
209238405Sjkim	jnz	.Lsub
210238405Sjkim
211238405Sjkim	sbbq	$0,%rax
212238405Sjkim	xorq	%r14,%r14
213238405Sjkim	andq	%rax,%rsi
214238405Sjkim	notq	%rax
215238405Sjkim	movq	%rdi,%rcx
216238405Sjkim	andq	%rax,%rcx
217238405Sjkim	movq	%r9,%r15
218238405Sjkim	orq	%rcx,%rsi
219238405Sjkim.align	16
220238405Sjkim.Lcopy:
221238405Sjkim	movq	(%rsi,%r14,8),%rax
222238405Sjkim	movq	%r14,(%rsp,%r14,8)
223238405Sjkim	movq	%rax,(%rdi,%r14,8)
224238405Sjkim	leaq	1(%r14),%r14
225238405Sjkim	subq	$1,%r15
226238405Sjkim	jnz	.Lcopy
227238405Sjkim
228238405Sjkim	movq	8(%rsp,%r9,8),%rsi
229238405Sjkim	movq	$1,%rax
230306198Sjkim	movq	-48(%rsi),%r15
231306198Sjkim	movq	-40(%rsi),%r14
232306198Sjkim	movq	-32(%rsi),%r13
233306198Sjkim	movq	-24(%rsi),%r12
234306198Sjkim	movq	-16(%rsi),%rbp
235306198Sjkim	movq	-8(%rsi),%rbx
236306198Sjkim	leaq	(%rsi),%rsp
237238405Sjkim.Lmul_epilogue:
238238405Sjkim	.byte	0xf3,0xc3
239238405Sjkim.size	bn_mul_mont,.-bn_mul_mont
240238405Sjkim.type	bn_mul4x_mont,@function
241238405Sjkim.align	16
242238405Sjkimbn_mul4x_mont:
243306198Sjkim	movl	%r9d,%r9d
244306198Sjkim	movq	%rsp,%rax
245238405Sjkim.Lmul4x_enter:
246299481Sjkim	andl	$0x80100,%r11d
247299481Sjkim	cmpl	$0x80100,%r11d
248299481Sjkim	je	.Lmulx4x_enter
249238405Sjkim	pushq	%rbx
250238405Sjkim	pushq	%rbp
251238405Sjkim	pushq	%r12
252238405Sjkim	pushq	%r13
253238405Sjkim	pushq	%r14
254238405Sjkim	pushq	%r15
255238405Sjkim
256306198Sjkim	negq	%r9
257238405Sjkim	movq	%rsp,%r11
258306198Sjkim	leaq	-32(%rsp,%r9,8),%r10
259306198Sjkim	negq	%r9
260306198Sjkim	andq	$-1024,%r10
261238405Sjkim
262306198Sjkim	subq	%r10,%r11
263298998Sjkim	andq	$-4096,%r11
264306198Sjkim	leaq	(%r10,%r11,1),%rsp
265306198Sjkim	movq	(%rsp),%r11
266306198Sjkim	cmpq	%r10,%rsp
267306198Sjkim	ja	.Lmul4x_page_walk
268306198Sjkim	jmp	.Lmul4x_page_walk_done
269306198Sjkim
270298998Sjkim.Lmul4x_page_walk:
271306198Sjkim	leaq	-4096(%rsp),%rsp
272306198Sjkim	movq	(%rsp),%r11
273306198Sjkim	cmpq	%r10,%rsp
274306198Sjkim	ja	.Lmul4x_page_walk
275306198Sjkim.Lmul4x_page_walk_done:
276298998Sjkim
277306198Sjkim	movq	%rax,8(%rsp,%r9,8)
278306198Sjkim.Lmul4x_body:
279238405Sjkim	movq	%rdi,16(%rsp,%r9,8)
280238405Sjkim	movq	%rdx,%r12
281238405Sjkim	movq	(%r8),%r8
282238405Sjkim	movq	(%r12),%rbx
283238405Sjkim	movq	(%rsi),%rax
284238405Sjkim
285238405Sjkim	xorq	%r14,%r14
286238405Sjkim	xorq	%r15,%r15
287238405Sjkim
288238405Sjkim	movq	%r8,%rbp
289238405Sjkim	mulq	%rbx
290238405Sjkim	movq	%rax,%r10
291238405Sjkim	movq	(%rcx),%rax
292238405Sjkim
293238405Sjkim	imulq	%r10,%rbp
294238405Sjkim	movq	%rdx,%r11
295238405Sjkim
296238405Sjkim	mulq	%rbp
297238405Sjkim	addq	%rax,%r10
298238405Sjkim	movq	8(%rsi),%rax
299238405Sjkim	adcq	$0,%rdx
300238405Sjkim	movq	%rdx,%rdi
301238405Sjkim
302238405Sjkim	mulq	%rbx
303238405Sjkim	addq	%rax,%r11
304238405Sjkim	movq	8(%rcx),%rax
305238405Sjkim	adcq	$0,%rdx
306238405Sjkim	movq	%rdx,%r10
307238405Sjkim
308238405Sjkim	mulq	%rbp
309238405Sjkim	addq	%rax,%rdi
310238405Sjkim	movq	16(%rsi),%rax
311238405Sjkim	adcq	$0,%rdx
312238405Sjkim	addq	%r11,%rdi
313238405Sjkim	leaq	4(%r15),%r15
314238405Sjkim	adcq	$0,%rdx
315238405Sjkim	movq	%rdi,(%rsp)
316238405Sjkim	movq	%rdx,%r13
317238405Sjkim	jmp	.L1st4x
318238405Sjkim.align	16
319238405Sjkim.L1st4x:
320238405Sjkim	mulq	%rbx
321238405Sjkim	addq	%rax,%r10
322238405Sjkim	movq	-16(%rcx,%r15,8),%rax
323238405Sjkim	adcq	$0,%rdx
324238405Sjkim	movq	%rdx,%r11
325238405Sjkim
326238405Sjkim	mulq	%rbp
327238405Sjkim	addq	%rax,%r13
328238405Sjkim	movq	-8(%rsi,%r15,8),%rax
329238405Sjkim	adcq	$0,%rdx
330238405Sjkim	addq	%r10,%r13
331238405Sjkim	adcq	$0,%rdx
332238405Sjkim	movq	%r13,-24(%rsp,%r15,8)
333238405Sjkim	movq	%rdx,%rdi
334238405Sjkim
335238405Sjkim	mulq	%rbx
336238405Sjkim	addq	%rax,%r11
337238405Sjkim	movq	-8(%rcx,%r15,8),%rax
338238405Sjkim	adcq	$0,%rdx
339238405Sjkim	movq	%rdx,%r10
340238405Sjkim
341238405Sjkim	mulq	%rbp
342238405Sjkim	addq	%rax,%rdi
343238405Sjkim	movq	(%rsi,%r15,8),%rax
344238405Sjkim	adcq	$0,%rdx
345238405Sjkim	addq	%r11,%rdi
346238405Sjkim	adcq	$0,%rdx
347238405Sjkim	movq	%rdi,-16(%rsp,%r15,8)
348238405Sjkim	movq	%rdx,%r13
349238405Sjkim
350238405Sjkim	mulq	%rbx
351238405Sjkim	addq	%rax,%r10
352238405Sjkim	movq	(%rcx,%r15,8),%rax
353238405Sjkim	adcq	$0,%rdx
354238405Sjkim	movq	%rdx,%r11
355238405Sjkim
356238405Sjkim	mulq	%rbp
357238405Sjkim	addq	%rax,%r13
358238405Sjkim	movq	8(%rsi,%r15,8),%rax
359238405Sjkim	adcq	$0,%rdx
360238405Sjkim	addq	%r10,%r13
361238405Sjkim	adcq	$0,%rdx
362238405Sjkim	movq	%r13,-8(%rsp,%r15,8)
363238405Sjkim	movq	%rdx,%rdi
364238405Sjkim
365238405Sjkim	mulq	%rbx
366238405Sjkim	addq	%rax,%r11
367238405Sjkim	movq	8(%rcx,%r15,8),%rax
368238405Sjkim	adcq	$0,%rdx
369238405Sjkim	leaq	4(%r15),%r15
370238405Sjkim	movq	%rdx,%r10
371238405Sjkim
372238405Sjkim	mulq	%rbp
373238405Sjkim	addq	%rax,%rdi
374238405Sjkim	movq	-16(%rsi,%r15,8),%rax
375238405Sjkim	adcq	$0,%rdx
376238405Sjkim	addq	%r11,%rdi
377238405Sjkim	adcq	$0,%rdx
378238405Sjkim	movq	%rdi,-32(%rsp,%r15,8)
379238405Sjkim	movq	%rdx,%r13
380238405Sjkim	cmpq	%r9,%r15
381290207Sjkim	jb	.L1st4x
382238405Sjkim
383238405Sjkim	mulq	%rbx
384238405Sjkim	addq	%rax,%r10
385238405Sjkim	movq	-16(%rcx,%r15,8),%rax
386238405Sjkim	adcq	$0,%rdx
387238405Sjkim	movq	%rdx,%r11
388238405Sjkim
389238405Sjkim	mulq	%rbp
390238405Sjkim	addq	%rax,%r13
391238405Sjkim	movq	-8(%rsi,%r15,8),%rax
392238405Sjkim	adcq	$0,%rdx
393238405Sjkim	addq	%r10,%r13
394238405Sjkim	adcq	$0,%rdx
395238405Sjkim	movq	%r13,-24(%rsp,%r15,8)
396238405Sjkim	movq	%rdx,%rdi
397238405Sjkim
398238405Sjkim	mulq	%rbx
399238405Sjkim	addq	%rax,%r11
400238405Sjkim	movq	-8(%rcx,%r15,8),%rax
401238405Sjkim	adcq	$0,%rdx
402238405Sjkim	movq	%rdx,%r10
403238405Sjkim
404238405Sjkim	mulq	%rbp
405238405Sjkim	addq	%rax,%rdi
406238405Sjkim	movq	(%rsi),%rax
407238405Sjkim	adcq	$0,%rdx
408238405Sjkim	addq	%r11,%rdi
409238405Sjkim	adcq	$0,%rdx
410238405Sjkim	movq	%rdi,-16(%rsp,%r15,8)
411238405Sjkim	movq	%rdx,%r13
412238405Sjkim
413238405Sjkim	xorq	%rdi,%rdi
414238405Sjkim	addq	%r10,%r13
415238405Sjkim	adcq	$0,%rdi
416238405Sjkim	movq	%r13,-8(%rsp,%r15,8)
417238405Sjkim	movq	%rdi,(%rsp,%r15,8)
418238405Sjkim
419238405Sjkim	leaq	1(%r14),%r14
420238405Sjkim.align	4
421238405Sjkim.Louter4x:
422238405Sjkim	movq	(%r12,%r14,8),%rbx
423238405Sjkim	xorq	%r15,%r15
424238405Sjkim	movq	(%rsp),%r10
425238405Sjkim	movq	%r8,%rbp
426238405Sjkim	mulq	%rbx
427238405Sjkim	addq	%rax,%r10
428238405Sjkim	movq	(%rcx),%rax
429238405Sjkim	adcq	$0,%rdx
430238405Sjkim
431238405Sjkim	imulq	%r10,%rbp
432238405Sjkim	movq	%rdx,%r11
433238405Sjkim
434238405Sjkim	mulq	%rbp
435238405Sjkim	addq	%rax,%r10
436238405Sjkim	movq	8(%rsi),%rax
437238405Sjkim	adcq	$0,%rdx
438238405Sjkim	movq	%rdx,%rdi
439238405Sjkim
440238405Sjkim	mulq	%rbx
441238405Sjkim	addq	%rax,%r11
442238405Sjkim	movq	8(%rcx),%rax
443238405Sjkim	adcq	$0,%rdx
444238405Sjkim	addq	8(%rsp),%r11
445238405Sjkim	adcq	$0,%rdx
446238405Sjkim	movq	%rdx,%r10
447238405Sjkim
448238405Sjkim	mulq	%rbp
449238405Sjkim	addq	%rax,%rdi
450238405Sjkim	movq	16(%rsi),%rax
451238405Sjkim	adcq	$0,%rdx
452238405Sjkim	addq	%r11,%rdi
453238405Sjkim	leaq	4(%r15),%r15
454238405Sjkim	adcq	$0,%rdx
455238405Sjkim	movq	%rdi,(%rsp)
456238405Sjkim	movq	%rdx,%r13
457238405Sjkim	jmp	.Linner4x
458238405Sjkim.align	16
459238405Sjkim.Linner4x:
460238405Sjkim	mulq	%rbx
461238405Sjkim	addq	%rax,%r10
462238405Sjkim	movq	-16(%rcx,%r15,8),%rax
463238405Sjkim	adcq	$0,%rdx
464238405Sjkim	addq	-16(%rsp,%r15,8),%r10
465238405Sjkim	adcq	$0,%rdx
466238405Sjkim	movq	%rdx,%r11
467238405Sjkim
468238405Sjkim	mulq	%rbp
469238405Sjkim	addq	%rax,%r13
470238405Sjkim	movq	-8(%rsi,%r15,8),%rax
471238405Sjkim	adcq	$0,%rdx
472238405Sjkim	addq	%r10,%r13
473238405Sjkim	adcq	$0,%rdx
474238405Sjkim	movq	%r13,-24(%rsp,%r15,8)
475238405Sjkim	movq	%rdx,%rdi
476238405Sjkim
477238405Sjkim	mulq	%rbx
478238405Sjkim	addq	%rax,%r11
479238405Sjkim	movq	-8(%rcx,%r15,8),%rax
480238405Sjkim	adcq	$0,%rdx
481238405Sjkim	addq	-8(%rsp,%r15,8),%r11
482238405Sjkim	adcq	$0,%rdx
483238405Sjkim	movq	%rdx,%r10
484238405Sjkim
485238405Sjkim	mulq	%rbp
486238405Sjkim	addq	%rax,%rdi
487238405Sjkim	movq	(%rsi,%r15,8),%rax
488238405Sjkim	adcq	$0,%rdx
489238405Sjkim	addq	%r11,%rdi
490238405Sjkim	adcq	$0,%rdx
491238405Sjkim	movq	%rdi,-16(%rsp,%r15,8)
492238405Sjkim	movq	%rdx,%r13
493238405Sjkim
494238405Sjkim	mulq	%rbx
495238405Sjkim	addq	%rax,%r10
496238405Sjkim	movq	(%rcx,%r15,8),%rax
497238405Sjkim	adcq	$0,%rdx
498238405Sjkim	addq	(%rsp,%r15,8),%r10
499238405Sjkim	adcq	$0,%rdx
500238405Sjkim	movq	%rdx,%r11
501238405Sjkim
502238405Sjkim	mulq	%rbp
503238405Sjkim	addq	%rax,%r13
504238405Sjkim	movq	8(%rsi,%r15,8),%rax
505238405Sjkim	adcq	$0,%rdx
506238405Sjkim	addq	%r10,%r13
507238405Sjkim	adcq	$0,%rdx
508238405Sjkim	movq	%r13,-8(%rsp,%r15,8)
509238405Sjkim	movq	%rdx,%rdi
510238405Sjkim
511238405Sjkim	mulq	%rbx
512238405Sjkim	addq	%rax,%r11
513238405Sjkim	movq	8(%rcx,%r15,8),%rax
514238405Sjkim	adcq	$0,%rdx
515238405Sjkim	addq	8(%rsp,%r15,8),%r11
516238405Sjkim	adcq	$0,%rdx
517238405Sjkim	leaq	4(%r15),%r15
518238405Sjkim	movq	%rdx,%r10
519238405Sjkim
520238405Sjkim	mulq	%rbp
521238405Sjkim	addq	%rax,%rdi
522238405Sjkim	movq	-16(%rsi,%r15,8),%rax
523238405Sjkim	adcq	$0,%rdx
524238405Sjkim	addq	%r11,%rdi
525238405Sjkim	adcq	$0,%rdx
526238405Sjkim	movq	%rdi,-32(%rsp,%r15,8)
527238405Sjkim	movq	%rdx,%r13
528238405Sjkim	cmpq	%r9,%r15
529290207Sjkim	jb	.Linner4x
530238405Sjkim
531238405Sjkim	mulq	%rbx
532238405Sjkim	addq	%rax,%r10
533238405Sjkim	movq	-16(%rcx,%r15,8),%rax
534238405Sjkim	adcq	$0,%rdx
535238405Sjkim	addq	-16(%rsp,%r15,8),%r10
536238405Sjkim	adcq	$0,%rdx
537238405Sjkim	movq	%rdx,%r11
538238405Sjkim
539238405Sjkim	mulq	%rbp
540238405Sjkim	addq	%rax,%r13
541238405Sjkim	movq	-8(%rsi,%r15,8),%rax
542238405Sjkim	adcq	$0,%rdx
543238405Sjkim	addq	%r10,%r13
544238405Sjkim	adcq	$0,%rdx
545238405Sjkim	movq	%r13,-24(%rsp,%r15,8)
546238405Sjkim	movq	%rdx,%rdi
547238405Sjkim
548238405Sjkim	mulq	%rbx
549238405Sjkim	addq	%rax,%r11
550238405Sjkim	movq	-8(%rcx,%r15,8),%rax
551238405Sjkim	adcq	$0,%rdx
552238405Sjkim	addq	-8(%rsp,%r15,8),%r11
553238405Sjkim	adcq	$0,%rdx
554238405Sjkim	leaq	1(%r14),%r14
555238405Sjkim	movq	%rdx,%r10
556238405Sjkim
557238405Sjkim	mulq	%rbp
558238405Sjkim	addq	%rax,%rdi
559238405Sjkim	movq	(%rsi),%rax
560238405Sjkim	adcq	$0,%rdx
561238405Sjkim	addq	%r11,%rdi
562238405Sjkim	adcq	$0,%rdx
563238405Sjkim	movq	%rdi,-16(%rsp,%r15,8)
564238405Sjkim	movq	%rdx,%r13
565238405Sjkim
566238405Sjkim	xorq	%rdi,%rdi
567238405Sjkim	addq	%r10,%r13
568238405Sjkim	adcq	$0,%rdi
569238405Sjkim	addq	(%rsp,%r9,8),%r13
570238405Sjkim	adcq	$0,%rdi
571238405Sjkim	movq	%r13,-8(%rsp,%r15,8)
572238405Sjkim	movq	%rdi,(%rsp,%r15,8)
573238405Sjkim
574238405Sjkim	cmpq	%r9,%r14
575290207Sjkim	jb	.Louter4x
576238405Sjkim	movq	16(%rsp,%r9,8),%rdi
577238405Sjkim	movq	0(%rsp),%rax
578238405Sjkim	pxor	%xmm0,%xmm0
579238405Sjkim	movq	8(%rsp),%rdx
580238405Sjkim	shrq	$2,%r9
581238405Sjkim	leaq	(%rsp),%rsi
582238405Sjkim	xorq	%r14,%r14
583238405Sjkim
584238405Sjkim	subq	0(%rcx),%rax
585238405Sjkim	movq	16(%rsi),%rbx
586238405Sjkim	movq	24(%rsi),%rbp
587238405Sjkim	sbbq	8(%rcx),%rdx
588238405Sjkim	leaq	-1(%r9),%r15
589238405Sjkim	jmp	.Lsub4x
590238405Sjkim.align	16
591238405Sjkim.Lsub4x:
592238405Sjkim	movq	%rax,0(%rdi,%r14,8)
593238405Sjkim	movq	%rdx,8(%rdi,%r14,8)
594238405Sjkim	sbbq	16(%rcx,%r14,8),%rbx
595238405Sjkim	movq	32(%rsi,%r14,8),%rax
596238405Sjkim	movq	40(%rsi,%r14,8),%rdx
597238405Sjkim	sbbq	24(%rcx,%r14,8),%rbp
598238405Sjkim	movq	%rbx,16(%rdi,%r14,8)
599238405Sjkim	movq	%rbp,24(%rdi,%r14,8)
600238405Sjkim	sbbq	32(%rcx,%r14,8),%rax
601238405Sjkim	movq	48(%rsi,%r14,8),%rbx
602238405Sjkim	movq	56(%rsi,%r14,8),%rbp
603238405Sjkim	sbbq	40(%rcx,%r14,8),%rdx
604238405Sjkim	leaq	4(%r14),%r14
605238405Sjkim	decq	%r15
606238405Sjkim	jnz	.Lsub4x
607238405Sjkim
608238405Sjkim	movq	%rax,0(%rdi,%r14,8)
609238405Sjkim	movq	32(%rsi,%r14,8),%rax
610238405Sjkim	sbbq	16(%rcx,%r14,8),%rbx
611238405Sjkim	movq	%rdx,8(%rdi,%r14,8)
612238405Sjkim	sbbq	24(%rcx,%r14,8),%rbp
613238405Sjkim	movq	%rbx,16(%rdi,%r14,8)
614238405Sjkim
615238405Sjkim	sbbq	$0,%rax
616238405Sjkim	movq	%rbp,24(%rdi,%r14,8)
617238405Sjkim	xorq	%r14,%r14
618238405Sjkim	andq	%rax,%rsi
619238405Sjkim	notq	%rax
620238405Sjkim	movq	%rdi,%rcx
621238405Sjkim	andq	%rax,%rcx
622238405Sjkim	leaq	-1(%r9),%r15
623238405Sjkim	orq	%rcx,%rsi
624238405Sjkim
625238405Sjkim	movdqu	(%rsi),%xmm1
626238405Sjkim	movdqa	%xmm0,(%rsp)
627238405Sjkim	movdqu	%xmm1,(%rdi)
628238405Sjkim	jmp	.Lcopy4x
629238405Sjkim.align	16
630238405Sjkim.Lcopy4x:
631238405Sjkim	movdqu	16(%rsi,%r14,1),%xmm2
632238405Sjkim	movdqu	32(%rsi,%r14,1),%xmm1
633238405Sjkim	movdqa	%xmm0,16(%rsp,%r14,1)
634238405Sjkim	movdqu	%xmm2,16(%rdi,%r14,1)
635238405Sjkim	movdqa	%xmm0,32(%rsp,%r14,1)
636238405Sjkim	movdqu	%xmm1,32(%rdi,%r14,1)
637238405Sjkim	leaq	32(%r14),%r14
638238405Sjkim	decq	%r15
639238405Sjkim	jnz	.Lcopy4x
640238405Sjkim
641238405Sjkim	shlq	$2,%r9
642238405Sjkim	movdqu	16(%rsi,%r14,1),%xmm2
643238405Sjkim	movdqa	%xmm0,16(%rsp,%r14,1)
644238405Sjkim	movdqu	%xmm2,16(%rdi,%r14,1)
645238405Sjkim	movq	8(%rsp,%r9,8),%rsi
646238405Sjkim	movq	$1,%rax
647306198Sjkim	movq	-48(%rsi),%r15
648306198Sjkim	movq	-40(%rsi),%r14
649306198Sjkim	movq	-32(%rsi),%r13
650306198Sjkim	movq	-24(%rsi),%r12
651306198Sjkim	movq	-16(%rsi),%rbp
652306198Sjkim	movq	-8(%rsi),%rbx
653306198Sjkim	leaq	(%rsi),%rsp
654238405Sjkim.Lmul4x_epilogue:
655238405Sjkim	.byte	0xf3,0xc3
656238405Sjkim.size	bn_mul4x_mont,.-bn_mul4x_mont
657290207Sjkim
658290207Sjkim
659299481Sjkim
660290207Sjkim.type	bn_sqr8x_mont,@function
661290207Sjkim.align	32
662290207Sjkimbn_sqr8x_mont:
663306198Sjkim	movq	%rsp,%rax
664290207Sjkim.Lsqr8x_enter:
665238405Sjkim	pushq	%rbx
666238405Sjkim	pushq	%rbp
667238405Sjkim	pushq	%r12
668238405Sjkim	pushq	%r13
669238405Sjkim	pushq	%r14
670238405Sjkim	pushq	%r15
671306198Sjkim.Lsqr8x_prologue:
672238405Sjkim
673290207Sjkim	movl	%r9d,%r10d
674238405Sjkim	shll	$3,%r9d
675290207Sjkim	shlq	$3+2,%r10
676290207Sjkim	negq	%r9
677238405Sjkim
678238405Sjkim
679238405Sjkim
680238405Sjkim
681238405Sjkim
682238405Sjkim
683296279Sjkim	leaq	-64(%rsp,%r9,2),%r11
684306198Sjkim	movq	%rsp,%rbp
685290207Sjkim	movq	(%r8),%r8
686290207Sjkim	subq	%rsi,%r11
687290207Sjkim	andq	$4095,%r11
688290207Sjkim	cmpq	%r11,%r10
689290207Sjkim	jb	.Lsqr8x_sp_alt
690306198Sjkim	subq	%r11,%rbp
691306198Sjkim	leaq	-64(%rbp,%r9,2),%rbp
692290207Sjkim	jmp	.Lsqr8x_sp_done
693238405Sjkim
694290207Sjkim.align	32
695290207Sjkim.Lsqr8x_sp_alt:
696296279Sjkim	leaq	4096-64(,%r9,2),%r10
697306198Sjkim	leaq	-64(%rbp,%r9,2),%rbp
698290207Sjkim	subq	%r10,%r11
699290207Sjkim	movq	$0,%r10
700290207Sjkim	cmovcq	%r10,%r11
701306198Sjkim	subq	%r11,%rbp
702290207Sjkim.Lsqr8x_sp_done:
703306198Sjkim	andq	$-64,%rbp
704306198Sjkim	movq	%rsp,%r11
705306198Sjkim	subq	%rbp,%r11
706298998Sjkim	andq	$-4096,%r11
707306198Sjkim	leaq	(%r11,%rbp,1),%rsp
708306198Sjkim	movq	(%rsp),%r10
709306198Sjkim	cmpq	%rbp,%rsp
710306198Sjkim	ja	.Lsqr8x_page_walk
711306198Sjkim	jmp	.Lsqr8x_page_walk_done
712306198Sjkim
713306198Sjkim.align	16
714298998Sjkim.Lsqr8x_page_walk:
715306198Sjkim	leaq	-4096(%rsp),%rsp
716306198Sjkim	movq	(%rsp),%r10
717306198Sjkim	cmpq	%rbp,%rsp
718306198Sjkim	ja	.Lsqr8x_page_walk
719306198Sjkim.Lsqr8x_page_walk_done:
720298998Sjkim
721290207Sjkim	movq	%r9,%r10
722290207Sjkim	negq	%r9
723238405Sjkim
724290207Sjkim	movq	%r8,32(%rsp)
725290207Sjkim	movq	%rax,40(%rsp)
726290207Sjkim.Lsqr8x_body:
727238405Sjkim
728296279Sjkim.byte	102,72,15,110,209
729290207Sjkim	pxor	%xmm0,%xmm0
730290207Sjkim.byte	102,72,15,110,207
731290207Sjkim.byte	102,73,15,110,218
732299481Sjkim	movl	OPENSSL_ia32cap_P+8(%rip),%eax
733299481Sjkim	andl	$0x80100,%eax
734299481Sjkim	cmpl	$0x80100,%eax
735299481Sjkim	jne	.Lsqr8x_nox
736299481Sjkim
737299481Sjkim	call	bn_sqrx8x_internal
738299481Sjkim
739299481Sjkim
740299481Sjkim
741299481Sjkim
742299481Sjkim	leaq	(%r8,%rcx,1),%rbx
743299481Sjkim	movq	%rcx,%r9
744299481Sjkim	movq	%rcx,%rdx
745299481Sjkim.byte	102,72,15,126,207
746299481Sjkim	sarq	$3+2,%rcx
747299481Sjkim	jmp	.Lsqr8x_sub
748299481Sjkim
749299481Sjkim.align	32
750299481Sjkim.Lsqr8x_nox:
751290207Sjkim	call	bn_sqr8x_internal
752238405Sjkim
753296279Sjkim
754296279Sjkim
755296279Sjkim
756296279Sjkim	leaq	(%rdi,%r9,1),%rbx
757296279Sjkim	movq	%r9,%rcx
758296279Sjkim	movq	%r9,%rdx
759296279Sjkim.byte	102,72,15,126,207
760296279Sjkim	sarq	$3+2,%rcx
761296279Sjkim	jmp	.Lsqr8x_sub
762296279Sjkim
763296279Sjkim.align	32
764296279Sjkim.Lsqr8x_sub:
765296279Sjkim	movq	0(%rbx),%r12
766296279Sjkim	movq	8(%rbx),%r13
767296279Sjkim	movq	16(%rbx),%r14
768296279Sjkim	movq	24(%rbx),%r15
769296279Sjkim	leaq	32(%rbx),%rbx
770296279Sjkim	sbbq	0(%rbp),%r12
771296279Sjkim	sbbq	8(%rbp),%r13
772296279Sjkim	sbbq	16(%rbp),%r14
773296279Sjkim	sbbq	24(%rbp),%r15
774296279Sjkim	leaq	32(%rbp),%rbp
775296279Sjkim	movq	%r12,0(%rdi)
776296279Sjkim	movq	%r13,8(%rdi)
777296279Sjkim	movq	%r14,16(%rdi)
778296279Sjkim	movq	%r15,24(%rdi)
779296279Sjkim	leaq	32(%rdi),%rdi
780296279Sjkim	incq	%rcx
781296279Sjkim	jnz	.Lsqr8x_sub
782296279Sjkim
783296279Sjkim	sbbq	$0,%rax
784296279Sjkim	leaq	(%rbx,%r9,1),%rbx
785296279Sjkim	leaq	(%rdi,%r9,1),%rdi
786296279Sjkim
787296279Sjkim.byte	102,72,15,110,200
788290207Sjkim	pxor	%xmm0,%xmm0
789296279Sjkim	pshufd	$0,%xmm1,%xmm1
790238405Sjkim	movq	40(%rsp),%rsi
791296279Sjkim	jmp	.Lsqr8x_cond_copy
792238405Sjkim
793290207Sjkim.align	32
794296279Sjkim.Lsqr8x_cond_copy:
795296279Sjkim	movdqa	0(%rbx),%xmm2
796296279Sjkim	movdqa	16(%rbx),%xmm3
797296279Sjkim	leaq	32(%rbx),%rbx
798296279Sjkim	movdqu	0(%rdi),%xmm4
799296279Sjkim	movdqu	16(%rdi),%xmm5
800296279Sjkim	leaq	32(%rdi),%rdi
801296279Sjkim	movdqa	%xmm0,-32(%rbx)
802296279Sjkim	movdqa	%xmm0,-16(%rbx)
803296279Sjkim	movdqa	%xmm0,-32(%rbx,%rdx,1)
804296279Sjkim	movdqa	%xmm0,-16(%rbx,%rdx,1)
805296279Sjkim	pcmpeqd	%xmm1,%xmm0
806296279Sjkim	pand	%xmm1,%xmm2
807296279Sjkim	pand	%xmm1,%xmm3
808296279Sjkim	pand	%xmm0,%xmm4
809296279Sjkim	pand	%xmm0,%xmm5
810296279Sjkim	pxor	%xmm0,%xmm0
811296279Sjkim	por	%xmm2,%xmm4
812296279Sjkim	por	%xmm3,%xmm5
813296279Sjkim	movdqu	%xmm4,-32(%rdi)
814296279Sjkim	movdqu	%xmm5,-16(%rdi)
815296279Sjkim	addq	$32,%r9
816296279Sjkim	jnz	.Lsqr8x_cond_copy
817238405Sjkim
818238405Sjkim	movq	$1,%rax
819290207Sjkim	movq	-48(%rsi),%r15
820290207Sjkim	movq	-40(%rsi),%r14
821290207Sjkim	movq	-32(%rsi),%r13
822290207Sjkim	movq	-24(%rsi),%r12
823290207Sjkim	movq	-16(%rsi),%rbp
824290207Sjkim	movq	-8(%rsi),%rbx
825290207Sjkim	leaq	(%rsi),%rsp
826290207Sjkim.Lsqr8x_epilogue:
827238405Sjkim	.byte	0xf3,0xc3
828290207Sjkim.size	bn_sqr8x_mont,.-bn_sqr8x_mont
829299481Sjkim.type	bn_mulx4x_mont,@function
830299481Sjkim.align	32
831299481Sjkimbn_mulx4x_mont:
832306198Sjkim	movq	%rsp,%rax
833299481Sjkim.Lmulx4x_enter:
834299481Sjkim	pushq	%rbx
835299481Sjkim	pushq	%rbp
836299481Sjkim	pushq	%r12
837299481Sjkim	pushq	%r13
838299481Sjkim	pushq	%r14
839299481Sjkim	pushq	%r15
840306198Sjkim.Lmulx4x_prologue:
841299481Sjkim
842299481Sjkim	shll	$3,%r9d
843299481Sjkim	xorq	%r10,%r10
844299481Sjkim	subq	%r9,%r10
845299481Sjkim	movq	(%r8),%r8
846306198Sjkim	leaq	-72(%rsp,%r10,1),%rbp
847306198Sjkim	andq	$-128,%rbp
848306198Sjkim	movq	%rsp,%r11
849306198Sjkim	subq	%rbp,%r11
850299481Sjkim	andq	$-4096,%r11
851306198Sjkim	leaq	(%r11,%rbp,1),%rsp
852306198Sjkim	movq	(%rsp),%r10
853306198Sjkim	cmpq	%rbp,%rsp
854306198Sjkim	ja	.Lmulx4x_page_walk
855306198Sjkim	jmp	.Lmulx4x_page_walk_done
856306198Sjkim
857306198Sjkim.align	16
858299481Sjkim.Lmulx4x_page_walk:
859306198Sjkim	leaq	-4096(%rsp),%rsp
860306198Sjkim	movq	(%rsp),%r10
861306198Sjkim	cmpq	%rbp,%rsp
862306198Sjkim	ja	.Lmulx4x_page_walk
863306198Sjkim.Lmulx4x_page_walk_done:
864299481Sjkim
865299481Sjkim	leaq	(%rdx,%r9,1),%r10
866299481Sjkim
867299481Sjkim
868299481Sjkim
869299481Sjkim
870299481Sjkim
871299481Sjkim
872299481Sjkim
873299481Sjkim
874299481Sjkim
875299481Sjkim
876299481Sjkim
877299481Sjkim
878299481Sjkim	movq	%r9,0(%rsp)
879299481Sjkim	shrq	$5,%r9
880299481Sjkim	movq	%r10,16(%rsp)
881299481Sjkim	subq	$1,%r9
882299481Sjkim	movq	%r8,24(%rsp)
883299481Sjkim	movq	%rdi,32(%rsp)
884299481Sjkim	movq	%rax,40(%rsp)
885299481Sjkim	movq	%r9,48(%rsp)
886299481Sjkim	jmp	.Lmulx4x_body
887299481Sjkim
888299481Sjkim.align	32
889299481Sjkim.Lmulx4x_body:
890299481Sjkim	leaq	8(%rdx),%rdi
891299481Sjkim	movq	(%rdx),%rdx
892299481Sjkim	leaq	64+32(%rsp),%rbx
893299481Sjkim	movq	%rdx,%r9
894299481Sjkim
895299481Sjkim	mulxq	0(%rsi),%r8,%rax
896299481Sjkim	mulxq	8(%rsi),%r11,%r14
897299481Sjkim	addq	%rax,%r11
898299481Sjkim	movq	%rdi,8(%rsp)
899299481Sjkim	mulxq	16(%rsi),%r12,%r13
900299481Sjkim	adcq	%r14,%r12
901299481Sjkim	adcq	$0,%r13
902299481Sjkim
903299481Sjkim	movq	%r8,%rdi
904299481Sjkim	imulq	24(%rsp),%r8
905299481Sjkim	xorq	%rbp,%rbp
906299481Sjkim
907299481Sjkim	mulxq	24(%rsi),%rax,%r14
908299481Sjkim	movq	%r8,%rdx
909299481Sjkim	leaq	32(%rsi),%rsi
910299481Sjkim	adcxq	%rax,%r13
911299481Sjkim	adcxq	%rbp,%r14
912299481Sjkim
913299481Sjkim	mulxq	0(%rcx),%rax,%r10
914299481Sjkim	adcxq	%rax,%rdi
915299481Sjkim	adoxq	%r11,%r10
916299481Sjkim	mulxq	8(%rcx),%rax,%r11
917299481Sjkim	adcxq	%rax,%r10
918299481Sjkim	adoxq	%r12,%r11
919299481Sjkim.byte	0xc4,0x62,0xfb,0xf6,0xa1,0x10,0x00,0x00,0x00
920299481Sjkim	movq	48(%rsp),%rdi
921299481Sjkim	movq	%r10,-32(%rbx)
922299481Sjkim	adcxq	%rax,%r11
923299481Sjkim	adoxq	%r13,%r12
924299481Sjkim	mulxq	24(%rcx),%rax,%r15
925299481Sjkim	movq	%r9,%rdx
926299481Sjkim	movq	%r11,-24(%rbx)
927299481Sjkim	adcxq	%rax,%r12
928299481Sjkim	adoxq	%rbp,%r15
929299481Sjkim	leaq	32(%rcx),%rcx
930299481Sjkim	movq	%r12,-16(%rbx)
931299481Sjkim
932299481Sjkim	jmp	.Lmulx4x_1st
933299481Sjkim
934299481Sjkim.align	32
935299481Sjkim.Lmulx4x_1st:
936299481Sjkim	adcxq	%rbp,%r15
937299481Sjkim	mulxq	0(%rsi),%r10,%rax
938299481Sjkim	adcxq	%r14,%r10
939299481Sjkim	mulxq	8(%rsi),%r11,%r14
940299481Sjkim	adcxq	%rax,%r11
941299481Sjkim	mulxq	16(%rsi),%r12,%rax
942299481Sjkim	adcxq	%r14,%r12
943299481Sjkim	mulxq	24(%rsi),%r13,%r14
944299481Sjkim.byte	0x67,0x67
945299481Sjkim	movq	%r8,%rdx
946299481Sjkim	adcxq	%rax,%r13
947299481Sjkim	adcxq	%rbp,%r14
948299481Sjkim	leaq	32(%rsi),%rsi
949299481Sjkim	leaq	32(%rbx),%rbx
950299481Sjkim
951299481Sjkim	adoxq	%r15,%r10
952299481Sjkim	mulxq	0(%rcx),%rax,%r15
953299481Sjkim	adcxq	%rax,%r10
954299481Sjkim	adoxq	%r15,%r11
955299481Sjkim	mulxq	8(%rcx),%rax,%r15
956299481Sjkim	adcxq	%rax,%r11
957299481Sjkim	adoxq	%r15,%r12
958299481Sjkim	mulxq	16(%rcx),%rax,%r15
959299481Sjkim	movq	%r10,-40(%rbx)
960299481Sjkim	adcxq	%rax,%r12
961299481Sjkim	movq	%r11,-32(%rbx)
962299481Sjkim	adoxq	%r15,%r13
963299481Sjkim	mulxq	24(%rcx),%rax,%r15
964299481Sjkim	movq	%r9,%rdx
965299481Sjkim	movq	%r12,-24(%rbx)
966299481Sjkim	adcxq	%rax,%r13
967299481Sjkim	adoxq	%rbp,%r15
968299481Sjkim	leaq	32(%rcx),%rcx
969299481Sjkim	movq	%r13,-16(%rbx)
970299481Sjkim
971299481Sjkim	decq	%rdi
972299481Sjkim	jnz	.Lmulx4x_1st
973299481Sjkim
974299481Sjkim	movq	0(%rsp),%rax
975299481Sjkim	movq	8(%rsp),%rdi
976299481Sjkim	adcq	%rbp,%r15
977299481Sjkim	addq	%r15,%r14
978299481Sjkim	sbbq	%r15,%r15
979299481Sjkim	movq	%r14,-8(%rbx)
980299481Sjkim	jmp	.Lmulx4x_outer
981299481Sjkim
982299481Sjkim.align	32
983299481Sjkim.Lmulx4x_outer:
984299481Sjkim	movq	(%rdi),%rdx
985299481Sjkim	leaq	8(%rdi),%rdi
986299481Sjkim	subq	%rax,%rsi
987299481Sjkim	movq	%r15,(%rbx)
988299481Sjkim	leaq	64+32(%rsp),%rbx
989299481Sjkim	subq	%rax,%rcx
990299481Sjkim
991299481Sjkim	mulxq	0(%rsi),%r8,%r11
992299481Sjkim	xorl	%ebp,%ebp
993299481Sjkim	movq	%rdx,%r9
994299481Sjkim	mulxq	8(%rsi),%r14,%r12
995299481Sjkim	adoxq	-32(%rbx),%r8
996299481Sjkim	adcxq	%r14,%r11
997299481Sjkim	mulxq	16(%rsi),%r15,%r13
998299481Sjkim	adoxq	-24(%rbx),%r11
999299481Sjkim	adcxq	%r15,%r12
1000314125Sdelphij	adoxq	-16(%rbx),%r12
1001299481Sjkim	adcxq	%rbp,%r13
1002314125Sdelphij	adoxq	%rbp,%r13
1003299481Sjkim
1004299481Sjkim	movq	%rdi,8(%rsp)
1005299481Sjkim	movq	%r8,%r15
1006299481Sjkim	imulq	24(%rsp),%r8
1007299481Sjkim	xorl	%ebp,%ebp
1008299481Sjkim
1009299481Sjkim	mulxq	24(%rsi),%rax,%r14
1010299481Sjkim	movq	%r8,%rdx
1011299481Sjkim	adcxq	%rax,%r13
1012299481Sjkim	adoxq	-8(%rbx),%r13
1013299481Sjkim	adcxq	%rbp,%r14
1014299481Sjkim	leaq	32(%rsi),%rsi
1015299481Sjkim	adoxq	%rbp,%r14
1016299481Sjkim
1017299481Sjkim	mulxq	0(%rcx),%rax,%r10
1018299481Sjkim	adcxq	%rax,%r15
1019299481Sjkim	adoxq	%r11,%r10
1020299481Sjkim	mulxq	8(%rcx),%rax,%r11
1021299481Sjkim	adcxq	%rax,%r10
1022299481Sjkim	adoxq	%r12,%r11
1023299481Sjkim	mulxq	16(%rcx),%rax,%r12
1024299481Sjkim	movq	%r10,-32(%rbx)
1025299481Sjkim	adcxq	%rax,%r11
1026299481Sjkim	adoxq	%r13,%r12
1027299481Sjkim	mulxq	24(%rcx),%rax,%r15
1028299481Sjkim	movq	%r9,%rdx
1029299481Sjkim	movq	%r11,-24(%rbx)
1030299481Sjkim	leaq	32(%rcx),%rcx
1031299481Sjkim	adcxq	%rax,%r12
1032299481Sjkim	adoxq	%rbp,%r15
1033299481Sjkim	movq	48(%rsp),%rdi
1034299481Sjkim	movq	%r12,-16(%rbx)
1035299481Sjkim
1036299481Sjkim	jmp	.Lmulx4x_inner
1037299481Sjkim
1038299481Sjkim.align	32
1039299481Sjkim.Lmulx4x_inner:
1040299481Sjkim	mulxq	0(%rsi),%r10,%rax
1041299481Sjkim	adcxq	%rbp,%r15
1042299481Sjkim	adoxq	%r14,%r10
1043299481Sjkim	mulxq	8(%rsi),%r11,%r14
1044299481Sjkim	adcxq	0(%rbx),%r10
1045299481Sjkim	adoxq	%rax,%r11
1046299481Sjkim	mulxq	16(%rsi),%r12,%rax
1047299481Sjkim	adcxq	8(%rbx),%r11
1048299481Sjkim	adoxq	%r14,%r12
1049299481Sjkim	mulxq	24(%rsi),%r13,%r14
1050299481Sjkim	movq	%r8,%rdx
1051299481Sjkim	adcxq	16(%rbx),%r12
1052299481Sjkim	adoxq	%rax,%r13
1053299481Sjkim	adcxq	24(%rbx),%r13
1054299481Sjkim	adoxq	%rbp,%r14
1055299481Sjkim	leaq	32(%rsi),%rsi
1056299481Sjkim	leaq	32(%rbx),%rbx
1057299481Sjkim	adcxq	%rbp,%r14
1058299481Sjkim
1059299481Sjkim	adoxq	%r15,%r10
1060299481Sjkim	mulxq	0(%rcx),%rax,%r15
1061299481Sjkim	adcxq	%rax,%r10
1062299481Sjkim	adoxq	%r15,%r11
1063299481Sjkim	mulxq	8(%rcx),%rax,%r15
1064299481Sjkim	adcxq	%rax,%r11
1065299481Sjkim	adoxq	%r15,%r12
1066299481Sjkim	mulxq	16(%rcx),%rax,%r15
1067299481Sjkim	movq	%r10,-40(%rbx)
1068299481Sjkim	adcxq	%rax,%r12
1069299481Sjkim	adoxq	%r15,%r13
1070299481Sjkim	mulxq	24(%rcx),%rax,%r15
1071299481Sjkim	movq	%r9,%rdx
1072299481Sjkim	movq	%r11,-32(%rbx)
1073299481Sjkim	movq	%r12,-24(%rbx)
1074299481Sjkim	adcxq	%rax,%r13
1075299481Sjkim	adoxq	%rbp,%r15
1076299481Sjkim	leaq	32(%rcx),%rcx
1077299481Sjkim	movq	%r13,-16(%rbx)
1078299481Sjkim
1079299481Sjkim	decq	%rdi
1080299481Sjkim	jnz	.Lmulx4x_inner
1081299481Sjkim
1082299481Sjkim	movq	0(%rsp),%rax
1083299481Sjkim	movq	8(%rsp),%rdi
1084299481Sjkim	adcq	%rbp,%r15
1085299481Sjkim	subq	0(%rbx),%rbp
1086299481Sjkim	adcq	%r15,%r14
1087299481Sjkim	sbbq	%r15,%r15
1088299481Sjkim	movq	%r14,-8(%rbx)
1089299481Sjkim
1090299481Sjkim	cmpq	16(%rsp),%rdi
1091299481Sjkim	jne	.Lmulx4x_outer
1092299481Sjkim
1093299481Sjkim	leaq	64(%rsp),%rbx
1094299481Sjkim	subq	%rax,%rcx
1095299481Sjkim	negq	%r15
1096299481Sjkim	movq	%rax,%rdx
1097299481Sjkim	shrq	$3+2,%rax
1098299481Sjkim	movq	32(%rsp),%rdi
1099299481Sjkim	jmp	.Lmulx4x_sub
1100299481Sjkim
1101299481Sjkim.align	32
1102299481Sjkim.Lmulx4x_sub:
1103299481Sjkim	movq	0(%rbx),%r11
1104299481Sjkim	movq	8(%rbx),%r12
1105299481Sjkim	movq	16(%rbx),%r13
1106299481Sjkim	movq	24(%rbx),%r14
1107299481Sjkim	leaq	32(%rbx),%rbx
1108299481Sjkim	sbbq	0(%rcx),%r11
1109299481Sjkim	sbbq	8(%rcx),%r12
1110299481Sjkim	sbbq	16(%rcx),%r13
1111299481Sjkim	sbbq	24(%rcx),%r14
1112299481Sjkim	leaq	32(%rcx),%rcx
1113299481Sjkim	movq	%r11,0(%rdi)
1114299481Sjkim	movq	%r12,8(%rdi)
1115299481Sjkim	movq	%r13,16(%rdi)
1116299481Sjkim	movq	%r14,24(%rdi)
1117299481Sjkim	leaq	32(%rdi),%rdi
1118299481Sjkim	decq	%rax
1119299481Sjkim	jnz	.Lmulx4x_sub
1120299481Sjkim
1121299481Sjkim	sbbq	$0,%r15
1122299481Sjkim	leaq	64(%rsp),%rbx
1123299481Sjkim	subq	%rdx,%rdi
1124299481Sjkim
1125299481Sjkim.byte	102,73,15,110,207
1126299481Sjkim	pxor	%xmm0,%xmm0
1127299481Sjkim	pshufd	$0,%xmm1,%xmm1
1128299481Sjkim	movq	40(%rsp),%rsi
1129299481Sjkim	jmp	.Lmulx4x_cond_copy
1130299481Sjkim
1131299481Sjkim.align	32
1132299481Sjkim.Lmulx4x_cond_copy:
1133299481Sjkim	movdqa	0(%rbx),%xmm2
1134299481Sjkim	movdqa	16(%rbx),%xmm3
1135299481Sjkim	leaq	32(%rbx),%rbx
1136299481Sjkim	movdqu	0(%rdi),%xmm4
1137299481Sjkim	movdqu	16(%rdi),%xmm5
1138299481Sjkim	leaq	32(%rdi),%rdi
1139299481Sjkim	movdqa	%xmm0,-32(%rbx)
1140299481Sjkim	movdqa	%xmm0,-16(%rbx)
1141299481Sjkim	pcmpeqd	%xmm1,%xmm0
1142299481Sjkim	pand	%xmm1,%xmm2
1143299481Sjkim	pand	%xmm1,%xmm3
1144299481Sjkim	pand	%xmm0,%xmm4
1145299481Sjkim	pand	%xmm0,%xmm5
1146299481Sjkim	pxor	%xmm0,%xmm0
1147299481Sjkim	por	%xmm2,%xmm4
1148299481Sjkim	por	%xmm3,%xmm5
1149299481Sjkim	movdqu	%xmm4,-32(%rdi)
1150299481Sjkim	movdqu	%xmm5,-16(%rdi)
1151299481Sjkim	subq	$32,%rdx
1152299481Sjkim	jnz	.Lmulx4x_cond_copy
1153299481Sjkim
1154299481Sjkim	movq	%rdx,(%rbx)
1155299481Sjkim
1156299481Sjkim	movq	$1,%rax
1157299481Sjkim	movq	-48(%rsi),%r15
1158299481Sjkim	movq	-40(%rsi),%r14
1159299481Sjkim	movq	-32(%rsi),%r13
1160299481Sjkim	movq	-24(%rsi),%r12
1161299481Sjkim	movq	-16(%rsi),%rbp
1162299481Sjkim	movq	-8(%rsi),%rbx
1163299481Sjkim	leaq	(%rsi),%rsp
1164299481Sjkim.Lmulx4x_epilogue:
1165299481Sjkim	.byte	0xf3,0xc3
1166299481Sjkim.size	bn_mulx4x_mont,.-bn_mulx4x_mont
1167238405Sjkim.byte	77,111,110,116,103,111,109,101,114,121,32,77,117,108,116,105,112,108,105,99,97,116,105,111,110,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0
1168238405Sjkim.align	16
1169