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