1238405Sjkim	# $FreeBSD$
2238405Sjkim.text
3238405Sjkim
4238405Sjkim.type	MULADD_128x512,@function
5238405Sjkim.align	16
6238405SjkimMULADD_128x512:
7238405Sjkim	movq	0(%rsi),%rax
8238405Sjkim	mulq	%rbp
9238405Sjkim	addq	%rax,%r8
10238405Sjkim	adcq	$0,%rdx
11238405Sjkim	movq	%r8,0(%rcx)
12238405Sjkim	movq	%rdx,%rbx
13238405Sjkim
14238405Sjkim	movq	8(%rsi),%rax
15238405Sjkim	mulq	%rbp
16238405Sjkim	addq	%rax,%r9
17238405Sjkim	adcq	$0,%rdx
18238405Sjkim	addq	%rbx,%r9
19238405Sjkim	adcq	$0,%rdx
20238405Sjkim	movq	%rdx,%rbx
21238405Sjkim
22238405Sjkim	movq	16(%rsi),%rax
23238405Sjkim	mulq	%rbp
24238405Sjkim	addq	%rax,%r10
25238405Sjkim	adcq	$0,%rdx
26238405Sjkim	addq	%rbx,%r10
27238405Sjkim	adcq	$0,%rdx
28238405Sjkim	movq	%rdx,%rbx
29238405Sjkim
30238405Sjkim	movq	24(%rsi),%rax
31238405Sjkim	mulq	%rbp
32238405Sjkim	addq	%rax,%r11
33238405Sjkim	adcq	$0,%rdx
34238405Sjkim	addq	%rbx,%r11
35238405Sjkim	adcq	$0,%rdx
36238405Sjkim	movq	%rdx,%rbx
37238405Sjkim
38238405Sjkim	movq	32(%rsi),%rax
39238405Sjkim	mulq	%rbp
40238405Sjkim	addq	%rax,%r12
41238405Sjkim	adcq	$0,%rdx
42238405Sjkim	addq	%rbx,%r12
43238405Sjkim	adcq	$0,%rdx
44238405Sjkim	movq	%rdx,%rbx
45238405Sjkim
46238405Sjkim	movq	40(%rsi),%rax
47238405Sjkim	mulq	%rbp
48238405Sjkim	addq	%rax,%r13
49238405Sjkim	adcq	$0,%rdx
50238405Sjkim	addq	%rbx,%r13
51238405Sjkim	adcq	$0,%rdx
52238405Sjkim	movq	%rdx,%rbx
53238405Sjkim
54238405Sjkim	movq	48(%rsi),%rax
55238405Sjkim	mulq	%rbp
56238405Sjkim	addq	%rax,%r14
57238405Sjkim	adcq	$0,%rdx
58238405Sjkim	addq	%rbx,%r14
59238405Sjkim	adcq	$0,%rdx
60238405Sjkim	movq	%rdx,%rbx
61238405Sjkim
62238405Sjkim	movq	56(%rsi),%rax
63238405Sjkim	mulq	%rbp
64238405Sjkim	addq	%rax,%r15
65238405Sjkim	adcq	$0,%rdx
66238405Sjkim	addq	%rbx,%r15
67238405Sjkim	adcq	$0,%rdx
68238405Sjkim	movq	%rdx,%r8
69238405Sjkim	movq	8(%rdi),%rbp
70238405Sjkim	movq	0(%rsi),%rax
71238405Sjkim	mulq	%rbp
72238405Sjkim	addq	%rax,%r9
73238405Sjkim	adcq	$0,%rdx
74238405Sjkim	movq	%r9,8(%rcx)
75238405Sjkim	movq	%rdx,%rbx
76238405Sjkim
77238405Sjkim	movq	8(%rsi),%rax
78238405Sjkim	mulq	%rbp
79238405Sjkim	addq	%rax,%r10
80238405Sjkim	adcq	$0,%rdx
81238405Sjkim	addq	%rbx,%r10
82238405Sjkim	adcq	$0,%rdx
83238405Sjkim	movq	%rdx,%rbx
84238405Sjkim
85238405Sjkim	movq	16(%rsi),%rax
86238405Sjkim	mulq	%rbp
87238405Sjkim	addq	%rax,%r11
88238405Sjkim	adcq	$0,%rdx
89238405Sjkim	addq	%rbx,%r11
90238405Sjkim	adcq	$0,%rdx
91238405Sjkim	movq	%rdx,%rbx
92238405Sjkim
93238405Sjkim	movq	24(%rsi),%rax
94238405Sjkim	mulq	%rbp
95238405Sjkim	addq	%rax,%r12
96238405Sjkim	adcq	$0,%rdx
97238405Sjkim	addq	%rbx,%r12
98238405Sjkim	adcq	$0,%rdx
99238405Sjkim	movq	%rdx,%rbx
100238405Sjkim
101238405Sjkim	movq	32(%rsi),%rax
102238405Sjkim	mulq	%rbp
103238405Sjkim	addq	%rax,%r13
104238405Sjkim	adcq	$0,%rdx
105238405Sjkim	addq	%rbx,%r13
106238405Sjkim	adcq	$0,%rdx
107238405Sjkim	movq	%rdx,%rbx
108238405Sjkim
109238405Sjkim	movq	40(%rsi),%rax
110238405Sjkim	mulq	%rbp
111238405Sjkim	addq	%rax,%r14
112238405Sjkim	adcq	$0,%rdx
113238405Sjkim	addq	%rbx,%r14
114238405Sjkim	adcq	$0,%rdx
115238405Sjkim	movq	%rdx,%rbx
116238405Sjkim
117238405Sjkim	movq	48(%rsi),%rax
118238405Sjkim	mulq	%rbp
119238405Sjkim	addq	%rax,%r15
120238405Sjkim	adcq	$0,%rdx
121238405Sjkim	addq	%rbx,%r15
122238405Sjkim	adcq	$0,%rdx
123238405Sjkim	movq	%rdx,%rbx
124238405Sjkim
125238405Sjkim	movq	56(%rsi),%rax
126238405Sjkim	mulq	%rbp
127238405Sjkim	addq	%rax,%r8
128238405Sjkim	adcq	$0,%rdx
129238405Sjkim	addq	%rbx,%r8
130238405Sjkim	adcq	$0,%rdx
131238405Sjkim	movq	%rdx,%r9
132238405Sjkim	.byte	0xf3,0xc3
133238405Sjkim.size	MULADD_128x512,.-MULADD_128x512
134238405Sjkim.type	mont_reduce,@function
135238405Sjkim.align	16
136238405Sjkimmont_reduce:
137238405Sjkim	leaq	192(%rsp),%rdi
138238405Sjkim	movq	32(%rsp),%rsi
139238405Sjkim	addq	$576,%rsi
140238405Sjkim	leaq	520(%rsp),%rcx
141238405Sjkim
142238405Sjkim	movq	96(%rcx),%rbp
143238405Sjkim	movq	0(%rsi),%rax
144238405Sjkim	mulq	%rbp
145238405Sjkim	movq	(%rcx),%r8
146238405Sjkim	addq	%rax,%r8
147238405Sjkim	adcq	$0,%rdx
148238405Sjkim	movq	%r8,0(%rdi)
149238405Sjkim	movq	%rdx,%rbx
150238405Sjkim
151238405Sjkim	movq	8(%rsi),%rax
152238405Sjkim	mulq	%rbp
153238405Sjkim	movq	8(%rcx),%r9
154238405Sjkim	addq	%rax,%r9
155238405Sjkim	adcq	$0,%rdx
156238405Sjkim	addq	%rbx,%r9
157238405Sjkim	adcq	$0,%rdx
158238405Sjkim	movq	%rdx,%rbx
159238405Sjkim
160238405Sjkim	movq	16(%rsi),%rax
161238405Sjkim	mulq	%rbp
162238405Sjkim	movq	16(%rcx),%r10
163238405Sjkim	addq	%rax,%r10
164238405Sjkim	adcq	$0,%rdx
165238405Sjkim	addq	%rbx,%r10
166238405Sjkim	adcq	$0,%rdx
167238405Sjkim	movq	%rdx,%rbx
168238405Sjkim
169238405Sjkim	movq	24(%rsi),%rax
170238405Sjkim	mulq	%rbp
171238405Sjkim	movq	24(%rcx),%r11
172238405Sjkim	addq	%rax,%r11
173238405Sjkim	adcq	$0,%rdx
174238405Sjkim	addq	%rbx,%r11
175238405Sjkim	adcq	$0,%rdx
176238405Sjkim	movq	%rdx,%rbx
177238405Sjkim
178238405Sjkim	movq	32(%rsi),%rax
179238405Sjkim	mulq	%rbp
180238405Sjkim	movq	32(%rcx),%r12
181238405Sjkim	addq	%rax,%r12
182238405Sjkim	adcq	$0,%rdx
183238405Sjkim	addq	%rbx,%r12
184238405Sjkim	adcq	$0,%rdx
185238405Sjkim	movq	%rdx,%rbx
186238405Sjkim
187238405Sjkim	movq	40(%rsi),%rax
188238405Sjkim	mulq	%rbp
189238405Sjkim	movq	40(%rcx),%r13
190238405Sjkim	addq	%rax,%r13
191238405Sjkim	adcq	$0,%rdx
192238405Sjkim	addq	%rbx,%r13
193238405Sjkim	adcq	$0,%rdx
194238405Sjkim	movq	%rdx,%rbx
195238405Sjkim
196238405Sjkim	movq	48(%rsi),%rax
197238405Sjkim	mulq	%rbp
198238405Sjkim	movq	48(%rcx),%r14
199238405Sjkim	addq	%rax,%r14
200238405Sjkim	adcq	$0,%rdx
201238405Sjkim	addq	%rbx,%r14
202238405Sjkim	adcq	$0,%rdx
203238405Sjkim	movq	%rdx,%rbx
204238405Sjkim
205238405Sjkim	movq	56(%rsi),%rax
206238405Sjkim	mulq	%rbp
207238405Sjkim	movq	56(%rcx),%r15
208238405Sjkim	addq	%rax,%r15
209238405Sjkim	adcq	$0,%rdx
210238405Sjkim	addq	%rbx,%r15
211238405Sjkim	adcq	$0,%rdx
212238405Sjkim	movq	%rdx,%r8
213238405Sjkim	movq	104(%rcx),%rbp
214238405Sjkim	movq	0(%rsi),%rax
215238405Sjkim	mulq	%rbp
216238405Sjkim	addq	%rax,%r9
217238405Sjkim	adcq	$0,%rdx
218238405Sjkim	movq	%r9,8(%rdi)
219238405Sjkim	movq	%rdx,%rbx
220238405Sjkim
221238405Sjkim	movq	8(%rsi),%rax
222238405Sjkim	mulq	%rbp
223238405Sjkim	addq	%rax,%r10
224238405Sjkim	adcq	$0,%rdx
225238405Sjkim	addq	%rbx,%r10
226238405Sjkim	adcq	$0,%rdx
227238405Sjkim	movq	%rdx,%rbx
228238405Sjkim
229238405Sjkim	movq	16(%rsi),%rax
230238405Sjkim	mulq	%rbp
231238405Sjkim	addq	%rax,%r11
232238405Sjkim	adcq	$0,%rdx
233238405Sjkim	addq	%rbx,%r11
234238405Sjkim	adcq	$0,%rdx
235238405Sjkim	movq	%rdx,%rbx
236238405Sjkim
237238405Sjkim	movq	24(%rsi),%rax
238238405Sjkim	mulq	%rbp
239238405Sjkim	addq	%rax,%r12
240238405Sjkim	adcq	$0,%rdx
241238405Sjkim	addq	%rbx,%r12
242238405Sjkim	adcq	$0,%rdx
243238405Sjkim	movq	%rdx,%rbx
244238405Sjkim
245238405Sjkim	movq	32(%rsi),%rax
246238405Sjkim	mulq	%rbp
247238405Sjkim	addq	%rax,%r13
248238405Sjkim	adcq	$0,%rdx
249238405Sjkim	addq	%rbx,%r13
250238405Sjkim	adcq	$0,%rdx
251238405Sjkim	movq	%rdx,%rbx
252238405Sjkim
253238405Sjkim	movq	40(%rsi),%rax
254238405Sjkim	mulq	%rbp
255238405Sjkim	addq	%rax,%r14
256238405Sjkim	adcq	$0,%rdx
257238405Sjkim	addq	%rbx,%r14
258238405Sjkim	adcq	$0,%rdx
259238405Sjkim	movq	%rdx,%rbx
260238405Sjkim
261238405Sjkim	movq	48(%rsi),%rax
262238405Sjkim	mulq	%rbp
263238405Sjkim	addq	%rax,%r15
264238405Sjkim	adcq	$0,%rdx
265238405Sjkim	addq	%rbx,%r15
266238405Sjkim	adcq	$0,%rdx
267238405Sjkim	movq	%rdx,%rbx
268238405Sjkim
269238405Sjkim	movq	56(%rsi),%rax
270238405Sjkim	mulq	%rbp
271238405Sjkim	addq	%rax,%r8
272238405Sjkim	adcq	$0,%rdx
273238405Sjkim	addq	%rbx,%r8
274238405Sjkim	adcq	$0,%rdx
275238405Sjkim	movq	%rdx,%r9
276238405Sjkim	movq	112(%rcx),%rbp
277238405Sjkim	movq	0(%rsi),%rax
278238405Sjkim	mulq	%rbp
279238405Sjkim	addq	%rax,%r10
280238405Sjkim	adcq	$0,%rdx
281238405Sjkim	movq	%r10,16(%rdi)
282238405Sjkim	movq	%rdx,%rbx
283238405Sjkim
284238405Sjkim	movq	8(%rsi),%rax
285238405Sjkim	mulq	%rbp
286238405Sjkim	addq	%rax,%r11
287238405Sjkim	adcq	$0,%rdx
288238405Sjkim	addq	%rbx,%r11
289238405Sjkim	adcq	$0,%rdx
290238405Sjkim	movq	%rdx,%rbx
291238405Sjkim
292238405Sjkim	movq	16(%rsi),%rax
293238405Sjkim	mulq	%rbp
294238405Sjkim	addq	%rax,%r12
295238405Sjkim	adcq	$0,%rdx
296238405Sjkim	addq	%rbx,%r12
297238405Sjkim	adcq	$0,%rdx
298238405Sjkim	movq	%rdx,%rbx
299238405Sjkim
300238405Sjkim	movq	24(%rsi),%rax
301238405Sjkim	mulq	%rbp
302238405Sjkim	addq	%rax,%r13
303238405Sjkim	adcq	$0,%rdx
304238405Sjkim	addq	%rbx,%r13
305238405Sjkim	adcq	$0,%rdx
306238405Sjkim	movq	%rdx,%rbx
307238405Sjkim
308238405Sjkim	movq	32(%rsi),%rax
309238405Sjkim	mulq	%rbp
310238405Sjkim	addq	%rax,%r14
311238405Sjkim	adcq	$0,%rdx
312238405Sjkim	addq	%rbx,%r14
313238405Sjkim	adcq	$0,%rdx
314238405Sjkim	movq	%rdx,%rbx
315238405Sjkim
316238405Sjkim	movq	40(%rsi),%rax
317238405Sjkim	mulq	%rbp
318238405Sjkim	addq	%rax,%r15
319238405Sjkim	adcq	$0,%rdx
320238405Sjkim	addq	%rbx,%r15
321238405Sjkim	adcq	$0,%rdx
322238405Sjkim	movq	%rdx,%rbx
323238405Sjkim
324238405Sjkim	movq	48(%rsi),%rax
325238405Sjkim	mulq	%rbp
326238405Sjkim	addq	%rax,%r8
327238405Sjkim	adcq	$0,%rdx
328238405Sjkim	addq	%rbx,%r8
329238405Sjkim	adcq	$0,%rdx
330238405Sjkim	movq	%rdx,%rbx
331238405Sjkim
332238405Sjkim	movq	56(%rsi),%rax
333238405Sjkim	mulq	%rbp
334238405Sjkim	addq	%rax,%r9
335238405Sjkim	adcq	$0,%rdx
336238405Sjkim	addq	%rbx,%r9
337238405Sjkim	adcq	$0,%rdx
338238405Sjkim	movq	%rdx,%r10
339238405Sjkim	movq	120(%rcx),%rbp
340238405Sjkim	movq	0(%rsi),%rax
341238405Sjkim	mulq	%rbp
342238405Sjkim	addq	%rax,%r11
343238405Sjkim	adcq	$0,%rdx
344238405Sjkim	movq	%r11,24(%rdi)
345238405Sjkim	movq	%rdx,%rbx
346238405Sjkim
347238405Sjkim	movq	8(%rsi),%rax
348238405Sjkim	mulq	%rbp
349238405Sjkim	addq	%rax,%r12
350238405Sjkim	adcq	$0,%rdx
351238405Sjkim	addq	%rbx,%r12
352238405Sjkim	adcq	$0,%rdx
353238405Sjkim	movq	%rdx,%rbx
354238405Sjkim
355238405Sjkim	movq	16(%rsi),%rax
356238405Sjkim	mulq	%rbp
357238405Sjkim	addq	%rax,%r13
358238405Sjkim	adcq	$0,%rdx
359238405Sjkim	addq	%rbx,%r13
360238405Sjkim	adcq	$0,%rdx
361238405Sjkim	movq	%rdx,%rbx
362238405Sjkim
363238405Sjkim	movq	24(%rsi),%rax
364238405Sjkim	mulq	%rbp
365238405Sjkim	addq	%rax,%r14
366238405Sjkim	adcq	$0,%rdx
367238405Sjkim	addq	%rbx,%r14
368238405Sjkim	adcq	$0,%rdx
369238405Sjkim	movq	%rdx,%rbx
370238405Sjkim
371238405Sjkim	movq	32(%rsi),%rax
372238405Sjkim	mulq	%rbp
373238405Sjkim	addq	%rax,%r15
374238405Sjkim	adcq	$0,%rdx
375238405Sjkim	addq	%rbx,%r15
376238405Sjkim	adcq	$0,%rdx
377238405Sjkim	movq	%rdx,%rbx
378238405Sjkim
379238405Sjkim	movq	40(%rsi),%rax
380238405Sjkim	mulq	%rbp
381238405Sjkim	addq	%rax,%r8
382238405Sjkim	adcq	$0,%rdx
383238405Sjkim	addq	%rbx,%r8
384238405Sjkim	adcq	$0,%rdx
385238405Sjkim	movq	%rdx,%rbx
386238405Sjkim
387238405Sjkim	movq	48(%rsi),%rax
388238405Sjkim	mulq	%rbp
389238405Sjkim	addq	%rax,%r9
390238405Sjkim	adcq	$0,%rdx
391238405Sjkim	addq	%rbx,%r9
392238405Sjkim	adcq	$0,%rdx
393238405Sjkim	movq	%rdx,%rbx
394238405Sjkim
395238405Sjkim	movq	56(%rsi),%rax
396238405Sjkim	mulq	%rbp
397238405Sjkim	addq	%rax,%r10
398238405Sjkim	adcq	$0,%rdx
399238405Sjkim	addq	%rbx,%r10
400238405Sjkim	adcq	$0,%rdx
401238405Sjkim	movq	%rdx,%r11
402238405Sjkim	xorq	%rax,%rax
403238405Sjkim
404238405Sjkim	addq	64(%rcx),%r8
405238405Sjkim	adcq	72(%rcx),%r9
406238405Sjkim	adcq	80(%rcx),%r10
407238405Sjkim	adcq	88(%rcx),%r11
408238405Sjkim	adcq	$0,%rax
409238405Sjkim
410238405Sjkim
411238405Sjkim
412238405Sjkim
413238405Sjkim	movq	%r8,64(%rdi)
414238405Sjkim	movq	%r9,72(%rdi)
415238405Sjkim	movq	%r10,%rbp
416238405Sjkim	movq	%r11,88(%rdi)
417238405Sjkim
418238405Sjkim	movq	%rax,384(%rsp)
419238405Sjkim
420238405Sjkim	movq	0(%rdi),%r8
421238405Sjkim	movq	8(%rdi),%r9
422238405Sjkim	movq	16(%rdi),%r10
423238405Sjkim	movq	24(%rdi),%r11
424238405Sjkim
425238405Sjkim
426238405Sjkim
427238405Sjkim
428238405Sjkim
429238405Sjkim
430238405Sjkim
431238405Sjkim
432238405Sjkim	addq	$80,%rdi
433238405Sjkim
434238405Sjkim	addq	$64,%rsi
435238405Sjkim	leaq	296(%rsp),%rcx
436238405Sjkim
437238405Sjkim	call	MULADD_128x512
438238405Sjkim
439238405Sjkim	movq	384(%rsp),%rax
440238405Sjkim
441238405Sjkim
442238405Sjkim	addq	-16(%rdi),%r8
443238405Sjkim	adcq	-8(%rdi),%r9
444238405Sjkim	movq	%r8,64(%rcx)
445238405Sjkim	movq	%r9,72(%rcx)
446238405Sjkim
447238405Sjkim	adcq	%rax,%rax
448238405Sjkim	movq	%rax,384(%rsp)
449238405Sjkim
450238405Sjkim	leaq	192(%rsp),%rdi
451238405Sjkim	addq	$64,%rsi
452238405Sjkim
453238405Sjkim
454238405Sjkim
455238405Sjkim
456238405Sjkim
457238405Sjkim	movq	(%rsi),%r8
458238405Sjkim	movq	8(%rsi),%rbx
459238405Sjkim
460238405Sjkim	movq	(%rcx),%rax
461238405Sjkim	mulq	%r8
462238405Sjkim	movq	%rax,%rbp
463238405Sjkim	movq	%rdx,%r9
464238405Sjkim
465238405Sjkim	movq	8(%rcx),%rax
466238405Sjkim	mulq	%r8
467238405Sjkim	addq	%rax,%r9
468238405Sjkim
469238405Sjkim	movq	(%rcx),%rax
470238405Sjkim	mulq	%rbx
471238405Sjkim	addq	%rax,%r9
472238405Sjkim
473238405Sjkim	movq	%r9,8(%rdi)
474238405Sjkim
475238405Sjkim
476238405Sjkim	subq	$192,%rsi
477238405Sjkim
478238405Sjkim	movq	(%rcx),%r8
479238405Sjkim	movq	8(%rcx),%r9
480238405Sjkim
481238405Sjkim	call	MULADD_128x512
482238405Sjkim
483238405Sjkim
484238405Sjkim
485238405Sjkim
486238405Sjkim	movq	0(%rsi),%rax
487238405Sjkim	movq	8(%rsi),%rbx
488238405Sjkim	movq	16(%rsi),%rdi
489238405Sjkim	movq	24(%rsi),%rdx
490238405Sjkim
491238405Sjkim
492238405Sjkim	movq	384(%rsp),%rbp
493238405Sjkim
494238405Sjkim	addq	64(%rcx),%r8
495238405Sjkim	adcq	72(%rcx),%r9
496238405Sjkim
497238405Sjkim
498238405Sjkim	adcq	%rbp,%rbp
499238405Sjkim
500238405Sjkim
501238405Sjkim
502238405Sjkim	shlq	$3,%rbp
503238405Sjkim	movq	32(%rsp),%rcx
504238405Sjkim	addq	%rcx,%rbp
505238405Sjkim
506238405Sjkim
507238405Sjkim	xorq	%rsi,%rsi
508238405Sjkim
509238405Sjkim	addq	0(%rbp),%r10
510238405Sjkim	adcq	64(%rbp),%r11
511238405Sjkim	adcq	128(%rbp),%r12
512238405Sjkim	adcq	192(%rbp),%r13
513238405Sjkim	adcq	256(%rbp),%r14
514238405Sjkim	adcq	320(%rbp),%r15
515238405Sjkim	adcq	384(%rbp),%r8
516238405Sjkim	adcq	448(%rbp),%r9
517238405Sjkim
518238405Sjkim
519238405Sjkim
520238405Sjkim	sbbq	$0,%rsi
521238405Sjkim
522238405Sjkim
523238405Sjkim	andq	%rsi,%rax
524238405Sjkim	andq	%rsi,%rbx
525238405Sjkim	andq	%rsi,%rdi
526238405Sjkim	andq	%rsi,%rdx
527238405Sjkim
528238405Sjkim	movq	$1,%rbp
529238405Sjkim	subq	%rax,%r10
530238405Sjkim	sbbq	%rbx,%r11
531238405Sjkim	sbbq	%rdi,%r12
532238405Sjkim	sbbq	%rdx,%r13
533238405Sjkim
534238405Sjkim
535238405Sjkim
536238405Sjkim
537238405Sjkim	sbbq	$0,%rbp
538238405Sjkim
539238405Sjkim
540238405Sjkim
541238405Sjkim	addq	$512,%rcx
542238405Sjkim	movq	32(%rcx),%rax
543238405Sjkim	movq	40(%rcx),%rbx
544238405Sjkim	movq	48(%rcx),%rdi
545238405Sjkim	movq	56(%rcx),%rdx
546238405Sjkim
547238405Sjkim
548238405Sjkim
549238405Sjkim	andq	%rsi,%rax
550238405Sjkim	andq	%rsi,%rbx
551238405Sjkim	andq	%rsi,%rdi
552238405Sjkim	andq	%rsi,%rdx
553238405Sjkim
554238405Sjkim
555238405Sjkim
556238405Sjkim	subq	$1,%rbp
557238405Sjkim
558238405Sjkim	sbbq	%rax,%r14
559238405Sjkim	sbbq	%rbx,%r15
560238405Sjkim	sbbq	%rdi,%r8
561238405Sjkim	sbbq	%rdx,%r9
562238405Sjkim
563238405Sjkim
564238405Sjkim
565238405Sjkim	movq	144(%rsp),%rsi
566238405Sjkim	movq	%r10,0(%rsi)
567238405Sjkim	movq	%r11,8(%rsi)
568238405Sjkim	movq	%r12,16(%rsi)
569238405Sjkim	movq	%r13,24(%rsi)
570238405Sjkim	movq	%r14,32(%rsi)
571238405Sjkim	movq	%r15,40(%rsi)
572238405Sjkim	movq	%r8,48(%rsi)
573238405Sjkim	movq	%r9,56(%rsi)
574238405Sjkim
575238405Sjkim	.byte	0xf3,0xc3
576238405Sjkim.size	mont_reduce,.-mont_reduce
577238405Sjkim.type	mont_mul_a3b,@function
578238405Sjkim.align	16
579238405Sjkimmont_mul_a3b:
580238405Sjkim
581238405Sjkim
582238405Sjkim
583238405Sjkim
584238405Sjkim	movq	0(%rdi),%rbp
585238405Sjkim
586238405Sjkim	movq	%r10,%rax
587238405Sjkim	mulq	%rbp
588238405Sjkim	movq	%rax,520(%rsp)
589238405Sjkim	movq	%rdx,%r10
590238405Sjkim	movq	%r11,%rax
591238405Sjkim	mulq	%rbp
592238405Sjkim	addq	%rax,%r10
593238405Sjkim	adcq	$0,%rdx
594238405Sjkim	movq	%rdx,%r11
595238405Sjkim	movq	%r12,%rax
596238405Sjkim	mulq	%rbp
597238405Sjkim	addq	%rax,%r11
598238405Sjkim	adcq	$0,%rdx
599238405Sjkim	movq	%rdx,%r12
600238405Sjkim	movq	%r13,%rax
601238405Sjkim	mulq	%rbp
602238405Sjkim	addq	%rax,%r12
603238405Sjkim	adcq	$0,%rdx
604238405Sjkim	movq	%rdx,%r13
605238405Sjkim	movq	%r14,%rax
606238405Sjkim	mulq	%rbp
607238405Sjkim	addq	%rax,%r13
608238405Sjkim	adcq	$0,%rdx
609238405Sjkim	movq	%rdx,%r14
610238405Sjkim	movq	%r15,%rax
611238405Sjkim	mulq	%rbp
612238405Sjkim	addq	%rax,%r14
613238405Sjkim	adcq	$0,%rdx
614238405Sjkim	movq	%rdx,%r15
615238405Sjkim	movq	%r8,%rax
616238405Sjkim	mulq	%rbp
617238405Sjkim	addq	%rax,%r15
618238405Sjkim	adcq	$0,%rdx
619238405Sjkim	movq	%rdx,%r8
620238405Sjkim	movq	%r9,%rax
621238405Sjkim	mulq	%rbp
622238405Sjkim	addq	%rax,%r8
623238405Sjkim	adcq	$0,%rdx
624238405Sjkim	movq	%rdx,%r9
625238405Sjkim	movq	8(%rdi),%rbp
626238405Sjkim	movq	0(%rsi),%rax
627238405Sjkim	mulq	%rbp
628238405Sjkim	addq	%rax,%r10
629238405Sjkim	adcq	$0,%rdx
630238405Sjkim	movq	%r10,528(%rsp)
631238405Sjkim	movq	%rdx,%rbx
632238405Sjkim
633238405Sjkim	movq	8(%rsi),%rax
634238405Sjkim	mulq	%rbp
635238405Sjkim	addq	%rax,%r11
636238405Sjkim	adcq	$0,%rdx
637238405Sjkim	addq	%rbx,%r11
638238405Sjkim	adcq	$0,%rdx
639238405Sjkim	movq	%rdx,%rbx
640238405Sjkim
641238405Sjkim	movq	16(%rsi),%rax
642238405Sjkim	mulq	%rbp
643238405Sjkim	addq	%rax,%r12
644238405Sjkim	adcq	$0,%rdx
645238405Sjkim	addq	%rbx,%r12
646238405Sjkim	adcq	$0,%rdx
647238405Sjkim	movq	%rdx,%rbx
648238405Sjkim
649238405Sjkim	movq	24(%rsi),%rax
650238405Sjkim	mulq	%rbp
651238405Sjkim	addq	%rax,%r13
652238405Sjkim	adcq	$0,%rdx
653238405Sjkim	addq	%rbx,%r13
654238405Sjkim	adcq	$0,%rdx
655238405Sjkim	movq	%rdx,%rbx
656238405Sjkim
657238405Sjkim	movq	32(%rsi),%rax
658238405Sjkim	mulq	%rbp
659238405Sjkim	addq	%rax,%r14
660238405Sjkim	adcq	$0,%rdx
661238405Sjkim	addq	%rbx,%r14
662238405Sjkim	adcq	$0,%rdx
663238405Sjkim	movq	%rdx,%rbx
664238405Sjkim
665238405Sjkim	movq	40(%rsi),%rax
666238405Sjkim	mulq	%rbp
667238405Sjkim	addq	%rax,%r15
668238405Sjkim	adcq	$0,%rdx
669238405Sjkim	addq	%rbx,%r15
670238405Sjkim	adcq	$0,%rdx
671238405Sjkim	movq	%rdx,%rbx
672238405Sjkim
673238405Sjkim	movq	48(%rsi),%rax
674238405Sjkim	mulq	%rbp
675238405Sjkim	addq	%rax,%r8
676238405Sjkim	adcq	$0,%rdx
677238405Sjkim	addq	%rbx,%r8
678238405Sjkim	adcq	$0,%rdx
679238405Sjkim	movq	%rdx,%rbx
680238405Sjkim
681238405Sjkim	movq	56(%rsi),%rax
682238405Sjkim	mulq	%rbp
683238405Sjkim	addq	%rax,%r9
684238405Sjkim	adcq	$0,%rdx
685238405Sjkim	addq	%rbx,%r9
686238405Sjkim	adcq	$0,%rdx
687238405Sjkim	movq	%rdx,%r10
688238405Sjkim	movq	16(%rdi),%rbp
689238405Sjkim	movq	0(%rsi),%rax
690238405Sjkim	mulq	%rbp
691238405Sjkim	addq	%rax,%r11
692238405Sjkim	adcq	$0,%rdx
693238405Sjkim	movq	%r11,536(%rsp)
694238405Sjkim	movq	%rdx,%rbx
695238405Sjkim
696238405Sjkim	movq	8(%rsi),%rax
697238405Sjkim	mulq	%rbp
698238405Sjkim	addq	%rax,%r12
699238405Sjkim	adcq	$0,%rdx
700238405Sjkim	addq	%rbx,%r12
701238405Sjkim	adcq	$0,%rdx
702238405Sjkim	movq	%rdx,%rbx
703238405Sjkim
704238405Sjkim	movq	16(%rsi),%rax
705238405Sjkim	mulq	%rbp
706238405Sjkim	addq	%rax,%r13
707238405Sjkim	adcq	$0,%rdx
708238405Sjkim	addq	%rbx,%r13
709238405Sjkim	adcq	$0,%rdx
710238405Sjkim	movq	%rdx,%rbx
711238405Sjkim
712238405Sjkim	movq	24(%rsi),%rax
713238405Sjkim	mulq	%rbp
714238405Sjkim	addq	%rax,%r14
715238405Sjkim	adcq	$0,%rdx
716238405Sjkim	addq	%rbx,%r14
717238405Sjkim	adcq	$0,%rdx
718238405Sjkim	movq	%rdx,%rbx
719238405Sjkim
720238405Sjkim	movq	32(%rsi),%rax
721238405Sjkim	mulq	%rbp
722238405Sjkim	addq	%rax,%r15
723238405Sjkim	adcq	$0,%rdx
724238405Sjkim	addq	%rbx,%r15
725238405Sjkim	adcq	$0,%rdx
726238405Sjkim	movq	%rdx,%rbx
727238405Sjkim
728238405Sjkim	movq	40(%rsi),%rax
729238405Sjkim	mulq	%rbp
730238405Sjkim	addq	%rax,%r8
731238405Sjkim	adcq	$0,%rdx
732238405Sjkim	addq	%rbx,%r8
733238405Sjkim	adcq	$0,%rdx
734238405Sjkim	movq	%rdx,%rbx
735238405Sjkim
736238405Sjkim	movq	48(%rsi),%rax
737238405Sjkim	mulq	%rbp
738238405Sjkim	addq	%rax,%r9
739238405Sjkim	adcq	$0,%rdx
740238405Sjkim	addq	%rbx,%r9
741238405Sjkim	adcq	$0,%rdx
742238405Sjkim	movq	%rdx,%rbx
743238405Sjkim
744238405Sjkim	movq	56(%rsi),%rax
745238405Sjkim	mulq	%rbp
746238405Sjkim	addq	%rax,%r10
747238405Sjkim	adcq	$0,%rdx
748238405Sjkim	addq	%rbx,%r10
749238405Sjkim	adcq	$0,%rdx
750238405Sjkim	movq	%rdx,%r11
751238405Sjkim	movq	24(%rdi),%rbp
752238405Sjkim	movq	0(%rsi),%rax
753238405Sjkim	mulq	%rbp
754238405Sjkim	addq	%rax,%r12
755238405Sjkim	adcq	$0,%rdx
756238405Sjkim	movq	%r12,544(%rsp)
757238405Sjkim	movq	%rdx,%rbx
758238405Sjkim
759238405Sjkim	movq	8(%rsi),%rax
760238405Sjkim	mulq	%rbp
761238405Sjkim	addq	%rax,%r13
762238405Sjkim	adcq	$0,%rdx
763238405Sjkim	addq	%rbx,%r13
764238405Sjkim	adcq	$0,%rdx
765238405Sjkim	movq	%rdx,%rbx
766238405Sjkim
767238405Sjkim	movq	16(%rsi),%rax
768238405Sjkim	mulq	%rbp
769238405Sjkim	addq	%rax,%r14
770238405Sjkim	adcq	$0,%rdx
771238405Sjkim	addq	%rbx,%r14
772238405Sjkim	adcq	$0,%rdx
773238405Sjkim	movq	%rdx,%rbx
774238405Sjkim
775238405Sjkim	movq	24(%rsi),%rax
776238405Sjkim	mulq	%rbp
777238405Sjkim	addq	%rax,%r15
778238405Sjkim	adcq	$0,%rdx
779238405Sjkim	addq	%rbx,%r15
780238405Sjkim	adcq	$0,%rdx
781238405Sjkim	movq	%rdx,%rbx
782238405Sjkim
783238405Sjkim	movq	32(%rsi),%rax
784238405Sjkim	mulq	%rbp
785238405Sjkim	addq	%rax,%r8
786238405Sjkim	adcq	$0,%rdx
787238405Sjkim	addq	%rbx,%r8
788238405Sjkim	adcq	$0,%rdx
789238405Sjkim	movq	%rdx,%rbx
790238405Sjkim
791238405Sjkim	movq	40(%rsi),%rax
792238405Sjkim	mulq	%rbp
793238405Sjkim	addq	%rax,%r9
794238405Sjkim	adcq	$0,%rdx
795238405Sjkim	addq	%rbx,%r9
796238405Sjkim	adcq	$0,%rdx
797238405Sjkim	movq	%rdx,%rbx
798238405Sjkim
799238405Sjkim	movq	48(%rsi),%rax
800238405Sjkim	mulq	%rbp
801238405Sjkim	addq	%rax,%r10
802238405Sjkim	adcq	$0,%rdx
803238405Sjkim	addq	%rbx,%r10
804238405Sjkim	adcq	$0,%rdx
805238405Sjkim	movq	%rdx,%rbx
806238405Sjkim
807238405Sjkim	movq	56(%rsi),%rax
808238405Sjkim	mulq	%rbp
809238405Sjkim	addq	%rax,%r11
810238405Sjkim	adcq	$0,%rdx
811238405Sjkim	addq	%rbx,%r11
812238405Sjkim	adcq	$0,%rdx
813238405Sjkim	movq	%rdx,%r12
814238405Sjkim	movq	32(%rdi),%rbp
815238405Sjkim	movq	0(%rsi),%rax
816238405Sjkim	mulq	%rbp
817238405Sjkim	addq	%rax,%r13
818238405Sjkim	adcq	$0,%rdx
819238405Sjkim	movq	%r13,552(%rsp)
820238405Sjkim	movq	%rdx,%rbx
821238405Sjkim
822238405Sjkim	movq	8(%rsi),%rax
823238405Sjkim	mulq	%rbp
824238405Sjkim	addq	%rax,%r14
825238405Sjkim	adcq	$0,%rdx
826238405Sjkim	addq	%rbx,%r14
827238405Sjkim	adcq	$0,%rdx
828238405Sjkim	movq	%rdx,%rbx
829238405Sjkim
830238405Sjkim	movq	16(%rsi),%rax
831238405Sjkim	mulq	%rbp
832238405Sjkim	addq	%rax,%r15
833238405Sjkim	adcq	$0,%rdx
834238405Sjkim	addq	%rbx,%r15
835238405Sjkim	adcq	$0,%rdx
836238405Sjkim	movq	%rdx,%rbx
837238405Sjkim
838238405Sjkim	movq	24(%rsi),%rax
839238405Sjkim	mulq	%rbp
840238405Sjkim	addq	%rax,%r8
841238405Sjkim	adcq	$0,%rdx
842238405Sjkim	addq	%rbx,%r8
843238405Sjkim	adcq	$0,%rdx
844238405Sjkim	movq	%rdx,%rbx
845238405Sjkim
846238405Sjkim	movq	32(%rsi),%rax
847238405Sjkim	mulq	%rbp
848238405Sjkim	addq	%rax,%r9
849238405Sjkim	adcq	$0,%rdx
850238405Sjkim	addq	%rbx,%r9
851238405Sjkim	adcq	$0,%rdx
852238405Sjkim	movq	%rdx,%rbx
853238405Sjkim
854238405Sjkim	movq	40(%rsi),%rax
855238405Sjkim	mulq	%rbp
856238405Sjkim	addq	%rax,%r10
857238405Sjkim	adcq	$0,%rdx
858238405Sjkim	addq	%rbx,%r10
859238405Sjkim	adcq	$0,%rdx
860238405Sjkim	movq	%rdx,%rbx
861238405Sjkim
862238405Sjkim	movq	48(%rsi),%rax
863238405Sjkim	mulq	%rbp
864238405Sjkim	addq	%rax,%r11
865238405Sjkim	adcq	$0,%rdx
866238405Sjkim	addq	%rbx,%r11
867238405Sjkim	adcq	$0,%rdx
868238405Sjkim	movq	%rdx,%rbx
869238405Sjkim
870238405Sjkim	movq	56(%rsi),%rax
871238405Sjkim	mulq	%rbp
872238405Sjkim	addq	%rax,%r12
873238405Sjkim	adcq	$0,%rdx
874238405Sjkim	addq	%rbx,%r12
875238405Sjkim	adcq	$0,%rdx
876238405Sjkim	movq	%rdx,%r13
877238405Sjkim	movq	40(%rdi),%rbp
878238405Sjkim	movq	0(%rsi),%rax
879238405Sjkim	mulq	%rbp
880238405Sjkim	addq	%rax,%r14
881238405Sjkim	adcq	$0,%rdx
882238405Sjkim	movq	%r14,560(%rsp)
883238405Sjkim	movq	%rdx,%rbx
884238405Sjkim
885238405Sjkim	movq	8(%rsi),%rax
886238405Sjkim	mulq	%rbp
887238405Sjkim	addq	%rax,%r15
888238405Sjkim	adcq	$0,%rdx
889238405Sjkim	addq	%rbx,%r15
890238405Sjkim	adcq	$0,%rdx
891238405Sjkim	movq	%rdx,%rbx
892238405Sjkim
893238405Sjkim	movq	16(%rsi),%rax
894238405Sjkim	mulq	%rbp
895238405Sjkim	addq	%rax,%r8
896238405Sjkim	adcq	$0,%rdx
897238405Sjkim	addq	%rbx,%r8
898238405Sjkim	adcq	$0,%rdx
899238405Sjkim	movq	%rdx,%rbx
900238405Sjkim
901238405Sjkim	movq	24(%rsi),%rax
902238405Sjkim	mulq	%rbp
903238405Sjkim	addq	%rax,%r9
904238405Sjkim	adcq	$0,%rdx
905238405Sjkim	addq	%rbx,%r9
906238405Sjkim	adcq	$0,%rdx
907238405Sjkim	movq	%rdx,%rbx
908238405Sjkim
909238405Sjkim	movq	32(%rsi),%rax
910238405Sjkim	mulq	%rbp
911238405Sjkim	addq	%rax,%r10
912238405Sjkim	adcq	$0,%rdx
913238405Sjkim	addq	%rbx,%r10
914238405Sjkim	adcq	$0,%rdx
915238405Sjkim	movq	%rdx,%rbx
916238405Sjkim
917238405Sjkim	movq	40(%rsi),%rax
918238405Sjkim	mulq	%rbp
919238405Sjkim	addq	%rax,%r11
920238405Sjkim	adcq	$0,%rdx
921238405Sjkim	addq	%rbx,%r11
922238405Sjkim	adcq	$0,%rdx
923238405Sjkim	movq	%rdx,%rbx
924238405Sjkim
925238405Sjkim	movq	48(%rsi),%rax
926238405Sjkim	mulq	%rbp
927238405Sjkim	addq	%rax,%r12
928238405Sjkim	adcq	$0,%rdx
929238405Sjkim	addq	%rbx,%r12
930238405Sjkim	adcq	$0,%rdx
931238405Sjkim	movq	%rdx,%rbx
932238405Sjkim
933238405Sjkim	movq	56(%rsi),%rax
934238405Sjkim	mulq	%rbp
935238405Sjkim	addq	%rax,%r13
936238405Sjkim	adcq	$0,%rdx
937238405Sjkim	addq	%rbx,%r13
938238405Sjkim	adcq	$0,%rdx
939238405Sjkim	movq	%rdx,%r14
940238405Sjkim	movq	48(%rdi),%rbp
941238405Sjkim	movq	0(%rsi),%rax
942238405Sjkim	mulq	%rbp
943238405Sjkim	addq	%rax,%r15
944238405Sjkim	adcq	$0,%rdx
945238405Sjkim	movq	%r15,568(%rsp)
946238405Sjkim	movq	%rdx,%rbx
947238405Sjkim
948238405Sjkim	movq	8(%rsi),%rax
949238405Sjkim	mulq	%rbp
950238405Sjkim	addq	%rax,%r8
951238405Sjkim	adcq	$0,%rdx
952238405Sjkim	addq	%rbx,%r8
953238405Sjkim	adcq	$0,%rdx
954238405Sjkim	movq	%rdx,%rbx
955238405Sjkim
956238405Sjkim	movq	16(%rsi),%rax
957238405Sjkim	mulq	%rbp
958238405Sjkim	addq	%rax,%r9
959238405Sjkim	adcq	$0,%rdx
960238405Sjkim	addq	%rbx,%r9
961238405Sjkim	adcq	$0,%rdx
962238405Sjkim	movq	%rdx,%rbx
963238405Sjkim
964238405Sjkim	movq	24(%rsi),%rax
965238405Sjkim	mulq	%rbp
966238405Sjkim	addq	%rax,%r10
967238405Sjkim	adcq	$0,%rdx
968238405Sjkim	addq	%rbx,%r10
969238405Sjkim	adcq	$0,%rdx
970238405Sjkim	movq	%rdx,%rbx
971238405Sjkim
972238405Sjkim	movq	32(%rsi),%rax
973238405Sjkim	mulq	%rbp
974238405Sjkim	addq	%rax,%r11
975238405Sjkim	adcq	$0,%rdx
976238405Sjkim	addq	%rbx,%r11
977238405Sjkim	adcq	$0,%rdx
978238405Sjkim	movq	%rdx,%rbx
979238405Sjkim
980238405Sjkim	movq	40(%rsi),%rax
981238405Sjkim	mulq	%rbp
982238405Sjkim	addq	%rax,%r12
983238405Sjkim	adcq	$0,%rdx
984238405Sjkim	addq	%rbx,%r12
985238405Sjkim	adcq	$0,%rdx
986238405Sjkim	movq	%rdx,%rbx
987238405Sjkim
988238405Sjkim	movq	48(%rsi),%rax
989238405Sjkim	mulq	%rbp
990238405Sjkim	addq	%rax,%r13
991238405Sjkim	adcq	$0,%rdx
992238405Sjkim	addq	%rbx,%r13
993238405Sjkim	adcq	$0,%rdx
994238405Sjkim	movq	%rdx,%rbx
995238405Sjkim
996238405Sjkim	movq	56(%rsi),%rax
997238405Sjkim	mulq	%rbp
998238405Sjkim	addq	%rax,%r14
999238405Sjkim	adcq	$0,%rdx
1000238405Sjkim	addq	%rbx,%r14
1001238405Sjkim	adcq	$0,%rdx
1002238405Sjkim	movq	%rdx,%r15
1003238405Sjkim	movq	56(%rdi),%rbp
1004238405Sjkim	movq	0(%rsi),%rax
1005238405Sjkim	mulq	%rbp
1006238405Sjkim	addq	%rax,%r8
1007238405Sjkim	adcq	$0,%rdx
1008238405Sjkim	movq	%r8,576(%rsp)
1009238405Sjkim	movq	%rdx,%rbx
1010238405Sjkim
1011238405Sjkim	movq	8(%rsi),%rax
1012238405Sjkim	mulq	%rbp
1013238405Sjkim	addq	%rax,%r9
1014238405Sjkim	adcq	$0,%rdx
1015238405Sjkim	addq	%rbx,%r9
1016238405Sjkim	adcq	$0,%rdx
1017238405Sjkim	movq	%rdx,%rbx
1018238405Sjkim
1019238405Sjkim	movq	16(%rsi),%rax
1020238405Sjkim	mulq	%rbp
1021238405Sjkim	addq	%rax,%r10
1022238405Sjkim	adcq	$0,%rdx
1023238405Sjkim	addq	%rbx,%r10
1024238405Sjkim	adcq	$0,%rdx
1025238405Sjkim	movq	%rdx,%rbx
1026238405Sjkim
1027238405Sjkim	movq	24(%rsi),%rax
1028238405Sjkim	mulq	%rbp
1029238405Sjkim	addq	%rax,%r11
1030238405Sjkim	adcq	$0,%rdx
1031238405Sjkim	addq	%rbx,%r11
1032238405Sjkim	adcq	$0,%rdx
1033238405Sjkim	movq	%rdx,%rbx
1034238405Sjkim
1035238405Sjkim	movq	32(%rsi),%rax
1036238405Sjkim	mulq	%rbp
1037238405Sjkim	addq	%rax,%r12
1038238405Sjkim	adcq	$0,%rdx
1039238405Sjkim	addq	%rbx,%r12
1040238405Sjkim	adcq	$0,%rdx
1041238405Sjkim	movq	%rdx,%rbx
1042238405Sjkim
1043238405Sjkim	movq	40(%rsi),%rax
1044238405Sjkim	mulq	%rbp
1045238405Sjkim	addq	%rax,%r13
1046238405Sjkim	adcq	$0,%rdx
1047238405Sjkim	addq	%rbx,%r13
1048238405Sjkim	adcq	$0,%rdx
1049238405Sjkim	movq	%rdx,%rbx
1050238405Sjkim
1051238405Sjkim	movq	48(%rsi),%rax
1052238405Sjkim	mulq	%rbp
1053238405Sjkim	addq	%rax,%r14
1054238405Sjkim	adcq	$0,%rdx
1055238405Sjkim	addq	%rbx,%r14
1056238405Sjkim	adcq	$0,%rdx
1057238405Sjkim	movq	%rdx,%rbx
1058238405Sjkim
1059238405Sjkim	movq	56(%rsi),%rax
1060238405Sjkim	mulq	%rbp
1061238405Sjkim	addq	%rax,%r15
1062238405Sjkim	adcq	$0,%rdx
1063238405Sjkim	addq	%rbx,%r15
1064238405Sjkim	adcq	$0,%rdx
1065238405Sjkim	movq	%rdx,%r8
1066238405Sjkim	movq	%r9,584(%rsp)
1067238405Sjkim	movq	%r10,592(%rsp)
1068238405Sjkim	movq	%r11,600(%rsp)
1069238405Sjkim	movq	%r12,608(%rsp)
1070238405Sjkim	movq	%r13,616(%rsp)
1071238405Sjkim	movq	%r14,624(%rsp)
1072238405Sjkim	movq	%r15,632(%rsp)
1073238405Sjkim	movq	%r8,640(%rsp)
1074238405Sjkim
1075238405Sjkim
1076238405Sjkim
1077238405Sjkim
1078238405Sjkim
1079238405Sjkim	jmp	mont_reduce
1080238405Sjkim
1081238405Sjkim
1082238405Sjkim.size	mont_mul_a3b,.-mont_mul_a3b
1083238405Sjkim.type	sqr_reduce,@function
1084238405Sjkim.align	16
1085238405Sjkimsqr_reduce:
1086238405Sjkim	movq	16(%rsp),%rcx
1087238405Sjkim
1088238405Sjkim
1089238405Sjkim
1090238405Sjkim	movq	%r10,%rbx
1091238405Sjkim
1092238405Sjkim	movq	%r11,%rax
1093238405Sjkim	mulq	%rbx
1094238405Sjkim	movq	%rax,528(%rsp)
1095238405Sjkim	movq	%rdx,%r10
1096238405Sjkim	movq	%r12,%rax
1097238405Sjkim	mulq	%rbx
1098238405Sjkim	addq	%rax,%r10
1099238405Sjkim	adcq	$0,%rdx
1100238405Sjkim	movq	%rdx,%r11
1101238405Sjkim	movq	%r13,%rax
1102238405Sjkim	mulq	%rbx
1103238405Sjkim	addq	%rax,%r11
1104238405Sjkim	adcq	$0,%rdx
1105238405Sjkim	movq	%rdx,%r12
1106238405Sjkim	movq	%r14,%rax
1107238405Sjkim	mulq	%rbx
1108238405Sjkim	addq	%rax,%r12
1109238405Sjkim	adcq	$0,%rdx
1110238405Sjkim	movq	%rdx,%r13
1111238405Sjkim	movq	%r15,%rax
1112238405Sjkim	mulq	%rbx
1113238405Sjkim	addq	%rax,%r13
1114238405Sjkim	adcq	$0,%rdx
1115238405Sjkim	movq	%rdx,%r14
1116238405Sjkim	movq	%r8,%rax
1117238405Sjkim	mulq	%rbx
1118238405Sjkim	addq	%rax,%r14
1119238405Sjkim	adcq	$0,%rdx
1120238405Sjkim	movq	%rdx,%r15
1121238405Sjkim	movq	%r9,%rax
1122238405Sjkim	mulq	%rbx
1123238405Sjkim	addq	%rax,%r15
1124238405Sjkim	adcq	$0,%rdx
1125238405Sjkim	movq	%rdx,%rsi
1126238405Sjkim
1127238405Sjkim	movq	%r10,536(%rsp)
1128238405Sjkim
1129238405Sjkim
1130238405Sjkim
1131238405Sjkim
1132238405Sjkim
1133238405Sjkim	movq	8(%rcx),%rbx
1134238405Sjkim
1135238405Sjkim	movq	16(%rcx),%rax
1136238405Sjkim	mulq	%rbx
1137238405Sjkim	addq	%rax,%r11
1138238405Sjkim	adcq	$0,%rdx
1139238405Sjkim	movq	%r11,544(%rsp)
1140238405Sjkim
1141238405Sjkim	movq	%rdx,%r10
1142238405Sjkim	movq	24(%rcx),%rax
1143238405Sjkim	mulq	%rbx
1144238405Sjkim	addq	%rax,%r12
1145238405Sjkim	adcq	$0,%rdx
1146238405Sjkim	addq	%r10,%r12
1147238405Sjkim	adcq	$0,%rdx
1148238405Sjkim	movq	%r12,552(%rsp)
1149238405Sjkim
1150238405Sjkim	movq	%rdx,%r10
1151238405Sjkim	movq	32(%rcx),%rax
1152238405Sjkim	mulq	%rbx
1153238405Sjkim	addq	%rax,%r13
1154238405Sjkim	adcq	$0,%rdx
1155238405Sjkim	addq	%r10,%r13
1156238405Sjkim	adcq	$0,%rdx
1157238405Sjkim
1158238405Sjkim	movq	%rdx,%r10
1159238405Sjkim	movq	40(%rcx),%rax
1160238405Sjkim	mulq	%rbx
1161238405Sjkim	addq	%rax,%r14
1162238405Sjkim	adcq	$0,%rdx
1163238405Sjkim	addq	%r10,%r14
1164238405Sjkim	adcq	$0,%rdx
1165238405Sjkim
1166238405Sjkim	movq	%rdx,%r10
1167238405Sjkim	movq	%r8,%rax
1168238405Sjkim	mulq	%rbx
1169238405Sjkim	addq	%rax,%r15
1170238405Sjkim	adcq	$0,%rdx
1171238405Sjkim	addq	%r10,%r15
1172238405Sjkim	adcq	$0,%rdx
1173238405Sjkim
1174238405Sjkim	movq	%rdx,%r10
1175238405Sjkim	movq	%r9,%rax
1176238405Sjkim	mulq	%rbx
1177238405Sjkim	addq	%rax,%rsi
1178238405Sjkim	adcq	$0,%rdx
1179238405Sjkim	addq	%r10,%rsi
1180238405Sjkim	adcq	$0,%rdx
1181238405Sjkim
1182238405Sjkim	movq	%rdx,%r11
1183238405Sjkim
1184238405Sjkim
1185238405Sjkim
1186238405Sjkim
1187238405Sjkim	movq	16(%rcx),%rbx
1188238405Sjkim
1189238405Sjkim	movq	24(%rcx),%rax
1190238405Sjkim	mulq	%rbx
1191238405Sjkim	addq	%rax,%r13
1192238405Sjkim	adcq	$0,%rdx
1193238405Sjkim	movq	%r13,560(%rsp)
1194238405Sjkim
1195238405Sjkim	movq	%rdx,%r10
1196238405Sjkim	movq	32(%rcx),%rax
1197238405Sjkim	mulq	%rbx
1198238405Sjkim	addq	%rax,%r14
1199238405Sjkim	adcq	$0,%rdx
1200238405Sjkim	addq	%r10,%r14
1201238405Sjkim	adcq	$0,%rdx
1202238405Sjkim	movq	%r14,568(%rsp)
1203238405Sjkim
1204238405Sjkim	movq	%rdx,%r10
1205238405Sjkim	movq	40(%rcx),%rax
1206238405Sjkim	mulq	%rbx
1207238405Sjkim	addq	%rax,%r15
1208238405Sjkim	adcq	$0,%rdx
1209238405Sjkim	addq	%r10,%r15
1210238405Sjkim	adcq	$0,%rdx
1211238405Sjkim
1212238405Sjkim	movq	%rdx,%r10
1213238405Sjkim	movq	%r8,%rax
1214238405Sjkim	mulq	%rbx
1215238405Sjkim	addq	%rax,%rsi
1216238405Sjkim	adcq	$0,%rdx
1217238405Sjkim	addq	%r10,%rsi
1218238405Sjkim	adcq	$0,%rdx
1219238405Sjkim
1220238405Sjkim	movq	%rdx,%r10
1221238405Sjkim	movq	%r9,%rax
1222238405Sjkim	mulq	%rbx
1223238405Sjkim	addq	%rax,%r11
1224238405Sjkim	adcq	$0,%rdx
1225238405Sjkim	addq	%r10,%r11
1226238405Sjkim	adcq	$0,%rdx
1227238405Sjkim
1228238405Sjkim	movq	%rdx,%r12
1229238405Sjkim
1230238405Sjkim
1231238405Sjkim
1232238405Sjkim
1233238405Sjkim
1234238405Sjkim	movq	24(%rcx),%rbx
1235238405Sjkim
1236238405Sjkim	movq	32(%rcx),%rax
1237238405Sjkim	mulq	%rbx
1238238405Sjkim	addq	%rax,%r15
1239238405Sjkim	adcq	$0,%rdx
1240238405Sjkim	movq	%r15,576(%rsp)
1241238405Sjkim
1242238405Sjkim	movq	%rdx,%r10
1243238405Sjkim	movq	40(%rcx),%rax
1244238405Sjkim	mulq	%rbx
1245238405Sjkim	addq	%rax,%rsi
1246238405Sjkim	adcq	$0,%rdx
1247238405Sjkim	addq	%r10,%rsi
1248238405Sjkim	adcq	$0,%rdx
1249238405Sjkim	movq	%rsi,584(%rsp)
1250238405Sjkim
1251238405Sjkim	movq	%rdx,%r10
1252238405Sjkim	movq	%r8,%rax
1253238405Sjkim	mulq	%rbx
1254238405Sjkim	addq	%rax,%r11
1255238405Sjkim	adcq	$0,%rdx
1256238405Sjkim	addq	%r10,%r11
1257238405Sjkim	adcq	$0,%rdx
1258238405Sjkim
1259238405Sjkim	movq	%rdx,%r10
1260238405Sjkim	movq	%r9,%rax
1261238405Sjkim	mulq	%rbx
1262238405Sjkim	addq	%rax,%r12
1263238405Sjkim	adcq	$0,%rdx
1264238405Sjkim	addq	%r10,%r12
1265238405Sjkim	adcq	$0,%rdx
1266238405Sjkim
1267238405Sjkim	movq	%rdx,%r15
1268238405Sjkim
1269238405Sjkim
1270238405Sjkim
1271238405Sjkim
1272238405Sjkim	movq	32(%rcx),%rbx
1273238405Sjkim
1274238405Sjkim	movq	40(%rcx),%rax
1275238405Sjkim	mulq	%rbx
1276238405Sjkim	addq	%rax,%r11
1277238405Sjkim	adcq	$0,%rdx
1278238405Sjkim	movq	%r11,592(%rsp)
1279238405Sjkim
1280238405Sjkim	movq	%rdx,%r10
1281238405Sjkim	movq	%r8,%rax
1282238405Sjkim	mulq	%rbx
1283238405Sjkim	addq	%rax,%r12
1284238405Sjkim	adcq	$0,%rdx
1285238405Sjkim	addq	%r10,%r12
1286238405Sjkim	adcq	$0,%rdx
1287238405Sjkim	movq	%r12,600(%rsp)
1288238405Sjkim
1289238405Sjkim	movq	%rdx,%r10
1290238405Sjkim	movq	%r9,%rax
1291238405Sjkim	mulq	%rbx
1292238405Sjkim	addq	%rax,%r15
1293238405Sjkim	adcq	$0,%rdx
1294238405Sjkim	addq	%r10,%r15
1295238405Sjkim	adcq	$0,%rdx
1296238405Sjkim
1297238405Sjkim	movq	%rdx,%r11
1298238405Sjkim
1299238405Sjkim
1300238405Sjkim
1301238405Sjkim
1302238405Sjkim	movq	40(%rcx),%rbx
1303238405Sjkim
1304238405Sjkim	movq	%r8,%rax
1305238405Sjkim	mulq	%rbx
1306238405Sjkim	addq	%rax,%r15
1307238405Sjkim	adcq	$0,%rdx
1308238405Sjkim	movq	%r15,608(%rsp)
1309238405Sjkim
1310238405Sjkim	movq	%rdx,%r10
1311238405Sjkim	movq	%r9,%rax
1312238405Sjkim	mulq	%rbx
1313238405Sjkim	addq	%rax,%r11
1314238405Sjkim	adcq	$0,%rdx
1315238405Sjkim	addq	%r10,%r11
1316238405Sjkim	adcq	$0,%rdx
1317238405Sjkim	movq	%r11,616(%rsp)
1318238405Sjkim
1319238405Sjkim	movq	%rdx,%r12
1320238405Sjkim
1321238405Sjkim
1322238405Sjkim
1323238405Sjkim
1324238405Sjkim	movq	%r8,%rbx
1325238405Sjkim
1326238405Sjkim	movq	%r9,%rax
1327238405Sjkim	mulq	%rbx
1328238405Sjkim	addq	%rax,%r12
1329238405Sjkim	adcq	$0,%rdx
1330238405Sjkim	movq	%r12,624(%rsp)
1331238405Sjkim
1332238405Sjkim	movq	%rdx,632(%rsp)
1333238405Sjkim
1334238405Sjkim
1335238405Sjkim	movq	528(%rsp),%r10
1336238405Sjkim	movq	536(%rsp),%r11
1337238405Sjkim	movq	544(%rsp),%r12
1338238405Sjkim	movq	552(%rsp),%r13
1339238405Sjkim	movq	560(%rsp),%r14
1340238405Sjkim	movq	568(%rsp),%r15
1341238405Sjkim
1342238405Sjkim	movq	24(%rcx),%rax
1343238405Sjkim	mulq	%rax
1344238405Sjkim	movq	%rax,%rdi
1345238405Sjkim	movq	%rdx,%r8
1346238405Sjkim
1347238405Sjkim	addq	%r10,%r10
1348238405Sjkim	adcq	%r11,%r11
1349238405Sjkim	adcq	%r12,%r12
1350238405Sjkim	adcq	%r13,%r13
1351238405Sjkim	adcq	%r14,%r14
1352238405Sjkim	adcq	%r15,%r15
1353238405Sjkim	adcq	$0,%r8
1354238405Sjkim
1355238405Sjkim	movq	0(%rcx),%rax
1356238405Sjkim	mulq	%rax
1357238405Sjkim	movq	%rax,520(%rsp)
1358238405Sjkim	movq	%rdx,%rbx
1359238405Sjkim
1360238405Sjkim	movq	8(%rcx),%rax
1361238405Sjkim	mulq	%rax
1362238405Sjkim
1363238405Sjkim	addq	%rbx,%r10
1364238405Sjkim	adcq	%rax,%r11
1365238405Sjkim	adcq	$0,%rdx
1366238405Sjkim
1367238405Sjkim	movq	%rdx,%rbx
1368238405Sjkim	movq	%r10,528(%rsp)
1369238405Sjkim	movq	%r11,536(%rsp)
1370238405Sjkim
1371238405Sjkim	movq	16(%rcx),%rax
1372238405Sjkim	mulq	%rax
1373238405Sjkim
1374238405Sjkim	addq	%rbx,%r12
1375238405Sjkim	adcq	%rax,%r13
1376238405Sjkim	adcq	$0,%rdx
1377238405Sjkim
1378238405Sjkim	movq	%rdx,%rbx
1379238405Sjkim
1380238405Sjkim	movq	%r12,544(%rsp)
1381238405Sjkim	movq	%r13,552(%rsp)
1382238405Sjkim
1383238405Sjkim	xorq	%rbp,%rbp
1384238405Sjkim	addq	%rbx,%r14
1385238405Sjkim	adcq	%rdi,%r15
1386238405Sjkim	adcq	$0,%rbp
1387238405Sjkim
1388238405Sjkim	movq	%r14,560(%rsp)
1389238405Sjkim	movq	%r15,568(%rsp)
1390238405Sjkim
1391238405Sjkim
1392238405Sjkim
1393238405Sjkim
1394238405Sjkim	movq	576(%rsp),%r10
1395238405Sjkim	movq	584(%rsp),%r11
1396238405Sjkim	movq	592(%rsp),%r12
1397238405Sjkim	movq	600(%rsp),%r13
1398238405Sjkim	movq	608(%rsp),%r14
1399238405Sjkim	movq	616(%rsp),%r15
1400238405Sjkim	movq	624(%rsp),%rdi
1401238405Sjkim	movq	632(%rsp),%rsi
1402238405Sjkim
1403238405Sjkim	movq	%r9,%rax
1404238405Sjkim	mulq	%rax
1405238405Sjkim	movq	%rax,%r9
1406238405Sjkim	movq	%rdx,%rbx
1407238405Sjkim
1408238405Sjkim	addq	%r10,%r10
1409238405Sjkim	adcq	%r11,%r11
1410238405Sjkim	adcq	%r12,%r12
1411238405Sjkim	adcq	%r13,%r13
1412238405Sjkim	adcq	%r14,%r14
1413238405Sjkim	adcq	%r15,%r15
1414238405Sjkim	adcq	%rdi,%rdi
1415238405Sjkim	adcq	%rsi,%rsi
1416238405Sjkim	adcq	$0,%rbx
1417238405Sjkim
1418238405Sjkim	addq	%rbp,%r10
1419238405Sjkim
1420238405Sjkim	movq	32(%rcx),%rax
1421238405Sjkim	mulq	%rax
1422238405Sjkim
1423238405Sjkim	addq	%r8,%r10
1424238405Sjkim	adcq	%rax,%r11
1425238405Sjkim	adcq	$0,%rdx
1426238405Sjkim
1427238405Sjkim	movq	%rdx,%rbp
1428238405Sjkim
1429238405Sjkim	movq	%r10,576(%rsp)
1430238405Sjkim	movq	%r11,584(%rsp)
1431238405Sjkim
1432238405Sjkim	movq	40(%rcx),%rax
1433238405Sjkim	mulq	%rax
1434238405Sjkim
1435238405Sjkim	addq	%rbp,%r12
1436238405Sjkim	adcq	%rax,%r13
1437238405Sjkim	adcq	$0,%rdx
1438238405Sjkim
1439238405Sjkim	movq	%rdx,%rbp
1440238405Sjkim
1441238405Sjkim	movq	%r12,592(%rsp)
1442238405Sjkim	movq	%r13,600(%rsp)
1443238405Sjkim
1444238405Sjkim	movq	48(%rcx),%rax
1445238405Sjkim	mulq	%rax
1446238405Sjkim
1447238405Sjkim	addq	%rbp,%r14
1448238405Sjkim	adcq	%rax,%r15
1449238405Sjkim	adcq	$0,%rdx
1450238405Sjkim
1451238405Sjkim	movq	%r14,608(%rsp)
1452238405Sjkim	movq	%r15,616(%rsp)
1453238405Sjkim
1454238405Sjkim	addq	%rdx,%rdi
1455238405Sjkim	adcq	%r9,%rsi
1456238405Sjkim	adcq	$0,%rbx
1457238405Sjkim
1458238405Sjkim	movq	%rdi,624(%rsp)
1459238405Sjkim	movq	%rsi,632(%rsp)
1460238405Sjkim	movq	%rbx,640(%rsp)
1461238405Sjkim
1462238405Sjkim	jmp	mont_reduce
1463238405Sjkim
1464238405Sjkim
1465238405Sjkim.size	sqr_reduce,.-sqr_reduce
1466238405Sjkim.globl	mod_exp_512
1467238405Sjkim.type	mod_exp_512,@function
1468238405Sjkimmod_exp_512:
1469238405Sjkim	pushq	%rbp
1470238405Sjkim	pushq	%rbx
1471238405Sjkim	pushq	%r12
1472238405Sjkim	pushq	%r13
1473238405Sjkim	pushq	%r14
1474238405Sjkim	pushq	%r15
1475238405Sjkim
1476238405Sjkim
1477238405Sjkim	movq	%rsp,%r8
1478238405Sjkim	subq	$2688,%rsp
1479238405Sjkim	andq	$-64,%rsp
1480238405Sjkim
1481238405Sjkim
1482238405Sjkim	movq	%r8,0(%rsp)
1483238405Sjkim	movq	%rdi,8(%rsp)
1484238405Sjkim	movq	%rsi,16(%rsp)
1485238405Sjkim	movq	%rcx,24(%rsp)
1486238405Sjkim.Lbody:
1487238405Sjkim
1488238405Sjkim
1489238405Sjkim
1490238405Sjkim	pxor	%xmm4,%xmm4
1491238405Sjkim	movdqu	0(%rsi),%xmm0
1492238405Sjkim	movdqu	16(%rsi),%xmm1
1493238405Sjkim	movdqu	32(%rsi),%xmm2
1494238405Sjkim	movdqu	48(%rsi),%xmm3
1495238405Sjkim	movdqa	%xmm4,512(%rsp)
1496238405Sjkim	movdqa	%xmm4,528(%rsp)
1497238405Sjkim	movdqa	%xmm4,608(%rsp)
1498238405Sjkim	movdqa	%xmm4,624(%rsp)
1499238405Sjkim	movdqa	%xmm0,544(%rsp)
1500238405Sjkim	movdqa	%xmm1,560(%rsp)
1501238405Sjkim	movdqa	%xmm2,576(%rsp)
1502238405Sjkim	movdqa	%xmm3,592(%rsp)
1503238405Sjkim
1504238405Sjkim
1505238405Sjkim	movdqu	0(%rdx),%xmm0
1506238405Sjkim	movdqu	16(%rdx),%xmm1
1507238405Sjkim	movdqu	32(%rdx),%xmm2
1508238405Sjkim	movdqu	48(%rdx),%xmm3
1509238405Sjkim
1510238405Sjkim	leaq	384(%rsp),%rbx
1511238405Sjkim	movq	%rbx,136(%rsp)
1512238405Sjkim	call	mont_reduce
1513238405Sjkim
1514238405Sjkim
1515238405Sjkim	leaq	448(%rsp),%rcx
1516238405Sjkim	xorq	%rax,%rax
1517238405Sjkim	movq	%rax,0(%rcx)
1518238405Sjkim	movq	%rax,8(%rcx)
1519238405Sjkim	movq	%rax,24(%rcx)
1520238405Sjkim	movq	%rax,32(%rcx)
1521238405Sjkim	movq	%rax,40(%rcx)
1522238405Sjkim	movq	%rax,48(%rcx)
1523238405Sjkim	movq	%rax,56(%rcx)
1524238405Sjkim	movq	%rax,128(%rsp)
1525238405Sjkim	movq	$1,16(%rcx)
1526238405Sjkim
1527238405Sjkim	leaq	640(%rsp),%rbp
1528238405Sjkim	movq	%rcx,%rsi
1529238405Sjkim	movq	%rbp,%rdi
1530238405Sjkim	movq	$8,%rax
1531238405Sjkimloop_0:
1532238405Sjkim	movq	(%rcx),%rbx
1533238405Sjkim	movw	%bx,(%rdi)
1534238405Sjkim	shrq	$16,%rbx
1535238405Sjkim	movw	%bx,64(%rdi)
1536238405Sjkim	shrq	$16,%rbx
1537238405Sjkim	movw	%bx,128(%rdi)
1538238405Sjkim	shrq	$16,%rbx
1539238405Sjkim	movw	%bx,192(%rdi)
1540238405Sjkim	leaq	8(%rcx),%rcx
1541238405Sjkim	leaq	256(%rdi),%rdi
1542238405Sjkim	decq	%rax
1543238405Sjkim	jnz	loop_0
1544238405Sjkim	movq	$31,%rax
1545238405Sjkim	movq	%rax,32(%rsp)
1546238405Sjkim	movq	%rbp,40(%rsp)
1547238405Sjkim
1548238405Sjkim	movq	%rsi,136(%rsp)
1549238405Sjkim	movq	0(%rsi),%r10
1550238405Sjkim	movq	8(%rsi),%r11
1551238405Sjkim	movq	16(%rsi),%r12
1552238405Sjkim	movq	24(%rsi),%r13
1553238405Sjkim	movq	32(%rsi),%r14
1554238405Sjkim	movq	40(%rsi),%r15
1555238405Sjkim	movq	48(%rsi),%r8
1556238405Sjkim	movq	56(%rsi),%r9
1557238405Sjkiminit_loop:
1558238405Sjkim	leaq	384(%rsp),%rdi
1559238405Sjkim	call	mont_mul_a3b
1560238405Sjkim	leaq	448(%rsp),%rsi
1561238405Sjkim	movq	40(%rsp),%rbp
1562238405Sjkim	addq	$2,%rbp
1563238405Sjkim	movq	%rbp,40(%rsp)
1564238405Sjkim	movq	%rsi,%rcx
1565238405Sjkim	movq	$8,%rax
1566238405Sjkimloop_1:
1567238405Sjkim	movq	(%rcx),%rbx
1568238405Sjkim	movw	%bx,(%rbp)
1569238405Sjkim	shrq	$16,%rbx
1570238405Sjkim	movw	%bx,64(%rbp)
1571238405Sjkim	shrq	$16,%rbx
1572238405Sjkim	movw	%bx,128(%rbp)
1573238405Sjkim	shrq	$16,%rbx
1574238405Sjkim	movw	%bx,192(%rbp)
1575238405Sjkim	leaq	8(%rcx),%rcx
1576238405Sjkim	leaq	256(%rbp),%rbp
1577238405Sjkim	decq	%rax
1578238405Sjkim	jnz	loop_1
1579238405Sjkim	movq	32(%rsp),%rax
1580238405Sjkim	subq	$1,%rax
1581238405Sjkim	movq	%rax,32(%rsp)
1582238405Sjkim	jne	init_loop
1583238405Sjkim
1584238405Sjkim
1585238405Sjkim
1586238405Sjkim	movdqa	%xmm0,64(%rsp)
1587238405Sjkim	movdqa	%xmm1,80(%rsp)
1588238405Sjkim	movdqa	%xmm2,96(%rsp)
1589238405Sjkim	movdqa	%xmm3,112(%rsp)
1590238405Sjkim
1591238405Sjkim
1592238405Sjkim
1593238405Sjkim
1594238405Sjkim
1595238405Sjkim	movl	126(%rsp),%eax
1596238405Sjkim	movq	%rax,%rdx
1597238405Sjkim	shrq	$11,%rax
1598238405Sjkim	andl	$2047,%edx
1599238405Sjkim	movl	%edx,126(%rsp)
1600238405Sjkim	leaq	640(%rsp,%rax,2),%rsi
1601238405Sjkim	movq	8(%rsp),%rdx
1602238405Sjkim	movq	$4,%rbp
1603238405Sjkimloop_2:
1604238405Sjkim	movzwq	192(%rsi),%rbx
1605238405Sjkim	movzwq	448(%rsi),%rax
1606238405Sjkim	shlq	$16,%rbx
1607238405Sjkim	shlq	$16,%rax
1608238405Sjkim	movw	128(%rsi),%bx
1609238405Sjkim	movw	384(%rsi),%ax
1610238405Sjkim	shlq	$16,%rbx
1611238405Sjkim	shlq	$16,%rax
1612238405Sjkim	movw	64(%rsi),%bx
1613238405Sjkim	movw	320(%rsi),%ax
1614238405Sjkim	shlq	$16,%rbx
1615238405Sjkim	shlq	$16,%rax
1616238405Sjkim	movw	0(%rsi),%bx
1617238405Sjkim	movw	256(%rsi),%ax
1618238405Sjkim	movq	%rbx,0(%rdx)
1619238405Sjkim	movq	%rax,8(%rdx)
1620238405Sjkim	leaq	512(%rsi),%rsi
1621238405Sjkim	leaq	16(%rdx),%rdx
1622238405Sjkim	subq	$1,%rbp
1623238405Sjkim	jnz	loop_2
1624238405Sjkim	movq	$505,48(%rsp)
1625238405Sjkim
1626238405Sjkim	movq	8(%rsp),%rcx
1627238405Sjkim	movq	%rcx,136(%rsp)
1628238405Sjkim	movq	0(%rcx),%r10
1629238405Sjkim	movq	8(%rcx),%r11
1630238405Sjkim	movq	16(%rcx),%r12
1631238405Sjkim	movq	24(%rcx),%r13
1632238405Sjkim	movq	32(%rcx),%r14
1633238405Sjkim	movq	40(%rcx),%r15
1634238405Sjkim	movq	48(%rcx),%r8
1635238405Sjkim	movq	56(%rcx),%r9
1636238405Sjkim	jmp	sqr_2
1637238405Sjkim
1638238405Sjkimmain_loop_a3b:
1639238405Sjkim	call	sqr_reduce
1640238405Sjkim	call	sqr_reduce
1641238405Sjkim	call	sqr_reduce
1642238405Sjkimsqr_2:
1643238405Sjkim	call	sqr_reduce
1644238405Sjkim	call	sqr_reduce
1645238405Sjkim
1646238405Sjkim
1647238405Sjkim
1648238405Sjkim	movq	48(%rsp),%rcx
1649238405Sjkim	movq	%rcx,%rax
1650238405Sjkim	shrq	$4,%rax
1651238405Sjkim	movl	64(%rsp,%rax,2),%edx
1652238405Sjkim	andq	$15,%rcx
1653238405Sjkim	shrq	%cl,%rdx
1654238405Sjkim	andq	$31,%rdx
1655238405Sjkim
1656238405Sjkim	leaq	640(%rsp,%rdx,2),%rsi
1657238405Sjkim	leaq	448(%rsp),%rdx
1658238405Sjkim	movq	%rdx,%rdi
1659238405Sjkim	movq	$4,%rbp
1660238405Sjkimloop_3:
1661238405Sjkim	movzwq	192(%rsi),%rbx
1662238405Sjkim	movzwq	448(%rsi),%rax
1663238405Sjkim	shlq	$16,%rbx
1664238405Sjkim	shlq	$16,%rax
1665238405Sjkim	movw	128(%rsi),%bx
1666238405Sjkim	movw	384(%rsi),%ax
1667238405Sjkim	shlq	$16,%rbx
1668238405Sjkim	shlq	$16,%rax
1669238405Sjkim	movw	64(%rsi),%bx
1670238405Sjkim	movw	320(%rsi),%ax
1671238405Sjkim	shlq	$16,%rbx
1672238405Sjkim	shlq	$16,%rax
1673238405Sjkim	movw	0(%rsi),%bx
1674238405Sjkim	movw	256(%rsi),%ax
1675238405Sjkim	movq	%rbx,0(%rdx)
1676238405Sjkim	movq	%rax,8(%rdx)
1677238405Sjkim	leaq	512(%rsi),%rsi
1678238405Sjkim	leaq	16(%rdx),%rdx
1679238405Sjkim	subq	$1,%rbp
1680238405Sjkim	jnz	loop_3
1681238405Sjkim	movq	8(%rsp),%rsi
1682238405Sjkim	call	mont_mul_a3b
1683238405Sjkim
1684238405Sjkim
1685238405Sjkim
1686238405Sjkim	movq	48(%rsp),%rcx
1687238405Sjkim	subq	$5,%rcx
1688238405Sjkim	movq	%rcx,48(%rsp)
1689238405Sjkim	jge	main_loop_a3b
1690238405Sjkim
1691238405Sjkim
1692238405Sjkim
1693238405Sjkimend_main_loop_a3b:
1694238405Sjkim
1695238405Sjkim
1696238405Sjkim	movq	8(%rsp),%rdx
1697238405Sjkim	pxor	%xmm4,%xmm4
1698238405Sjkim	movdqu	0(%rdx),%xmm0
1699238405Sjkim	movdqu	16(%rdx),%xmm1
1700238405Sjkim	movdqu	32(%rdx),%xmm2
1701238405Sjkim	movdqu	48(%rdx),%xmm3
1702238405Sjkim	movdqa	%xmm4,576(%rsp)
1703238405Sjkim	movdqa	%xmm4,592(%rsp)
1704238405Sjkim	movdqa	%xmm4,608(%rsp)
1705238405Sjkim	movdqa	%xmm4,624(%rsp)
1706238405Sjkim	movdqa	%xmm0,512(%rsp)
1707238405Sjkim	movdqa	%xmm1,528(%rsp)
1708238405Sjkim	movdqa	%xmm2,544(%rsp)
1709238405Sjkim	movdqa	%xmm3,560(%rsp)
1710238405Sjkim	call	mont_reduce
1711238405Sjkim
1712238405Sjkim
1713238405Sjkim
1714238405Sjkim	movq	8(%rsp),%rax
1715238405Sjkim	movq	0(%rax),%r8
1716238405Sjkim	movq	8(%rax),%r9
1717238405Sjkim	movq	16(%rax),%r10
1718238405Sjkim	movq	24(%rax),%r11
1719238405Sjkim	movq	32(%rax),%r12
1720238405Sjkim	movq	40(%rax),%r13
1721238405Sjkim	movq	48(%rax),%r14
1722238405Sjkim	movq	56(%rax),%r15
1723238405Sjkim
1724238405Sjkim
1725238405Sjkim	movq	24(%rsp),%rbx
1726238405Sjkim	addq	$512,%rbx
1727238405Sjkim
1728238405Sjkim	subq	0(%rbx),%r8
1729238405Sjkim	sbbq	8(%rbx),%r9
1730238405Sjkim	sbbq	16(%rbx),%r10
1731238405Sjkim	sbbq	24(%rbx),%r11
1732238405Sjkim	sbbq	32(%rbx),%r12
1733238405Sjkim	sbbq	40(%rbx),%r13
1734238405Sjkim	sbbq	48(%rbx),%r14
1735238405Sjkim	sbbq	56(%rbx),%r15
1736238405Sjkim
1737238405Sjkim
1738238405Sjkim	movq	0(%rax),%rsi
1739238405Sjkim	movq	8(%rax),%rdi
1740238405Sjkim	movq	16(%rax),%rcx
1741238405Sjkim	movq	24(%rax),%rdx
1742238405Sjkim	cmovncq	%r8,%rsi
1743238405Sjkim	cmovncq	%r9,%rdi
1744238405Sjkim	cmovncq	%r10,%rcx
1745238405Sjkim	cmovncq	%r11,%rdx
1746238405Sjkim	movq	%rsi,0(%rax)
1747238405Sjkim	movq	%rdi,8(%rax)
1748238405Sjkim	movq	%rcx,16(%rax)
1749238405Sjkim	movq	%rdx,24(%rax)
1750238405Sjkim
1751238405Sjkim	movq	32(%rax),%rsi
1752238405Sjkim	movq	40(%rax),%rdi
1753238405Sjkim	movq	48(%rax),%rcx
1754238405Sjkim	movq	56(%rax),%rdx
1755238405Sjkim	cmovncq	%r12,%rsi
1756238405Sjkim	cmovncq	%r13,%rdi
1757238405Sjkim	cmovncq	%r14,%rcx
1758238405Sjkim	cmovncq	%r15,%rdx
1759238405Sjkim	movq	%rsi,32(%rax)
1760238405Sjkim	movq	%rdi,40(%rax)
1761238405Sjkim	movq	%rcx,48(%rax)
1762238405Sjkim	movq	%rdx,56(%rax)
1763238405Sjkim
1764238405Sjkim	movq	0(%rsp),%rsi
1765238405Sjkim	movq	0(%rsi),%r15
1766238405Sjkim	movq	8(%rsi),%r14
1767238405Sjkim	movq	16(%rsi),%r13
1768238405Sjkim	movq	24(%rsi),%r12
1769238405Sjkim	movq	32(%rsi),%rbx
1770238405Sjkim	movq	40(%rsi),%rbp
1771238405Sjkim	leaq	48(%rsi),%rsp
1772238405Sjkim.Lepilogue:
1773238405Sjkim	.byte	0xf3,0xc3
1774238405Sjkim.size	mod_exp_512, . - mod_exp_512
1775