Merge Chromium + Blink git repositories
[chromium-blink-merge.git] / third_party / boringssl / linux-x86_64 / crypto / bn / x86_64-mont.S
blob4d401c6743f84448e533db45a600b0fdc5e52a21
1 #if defined(__x86_64__)
2 .text   
4 .extern OPENSSL_ia32cap_P
5 .hidden OPENSSL_ia32cap_P
7 .globl  bn_mul_mont
8 .hidden bn_mul_mont
9 .type   bn_mul_mont,@function
10 .align  16
11 bn_mul_mont:
12         testl   $3,%r9d
13         jnz     .Lmul_enter
14         cmpl    $8,%r9d
15         jb      .Lmul_enter
16         cmpq    %rsi,%rdx
17         jne     .Lmul4x_enter
18         testl   $7,%r9d
19         jz      .Lsqr8x_enter
20         jmp     .Lmul4x_enter
22 .align  16
23 .Lmul_enter:
24         pushq   %rbx
25         pushq   %rbp
26         pushq   %r12
27         pushq   %r13
28         pushq   %r14
29         pushq   %r15
31         movl    %r9d,%r9d
32         leaq    2(%r9),%r10
33         movq    %rsp,%r11
34         negq    %r10
35         leaq    (%rsp,%r10,8),%rsp
36         andq    $-1024,%rsp
38         movq    %r11,8(%rsp,%r9,8)
39 .Lmul_body:
40         movq    %rdx,%r12
41         movq    (%r8),%r8
42         movq    (%r12),%rbx
43         movq    (%rsi),%rax
45         xorq    %r14,%r14
46         xorq    %r15,%r15
48         movq    %r8,%rbp
49         mulq    %rbx
50         movq    %rax,%r10
51         movq    (%rcx),%rax
53         imulq   %r10,%rbp
54         movq    %rdx,%r11
56         mulq    %rbp
57         addq    %rax,%r10
58         movq    8(%rsi),%rax
59         adcq    $0,%rdx
60         movq    %rdx,%r13
62         leaq    1(%r15),%r15
63         jmp     .L1st_enter
65 .align  16
66 .L1st:
67         addq    %rax,%r13
68         movq    (%rsi,%r15,8),%rax
69         adcq    $0,%rdx
70         addq    %r11,%r13
71         movq    %r10,%r11
72         adcq    $0,%rdx
73         movq    %r13,-16(%rsp,%r15,8)
74         movq    %rdx,%r13
76 .L1st_enter:
77         mulq    %rbx
78         addq    %rax,%r11
79         movq    (%rcx,%r15,8),%rax
80         adcq    $0,%rdx
81         leaq    1(%r15),%r15
82         movq    %rdx,%r10
84         mulq    %rbp
85         cmpq    %r9,%r15
86         jne     .L1st
88         addq    %rax,%r13
89         movq    (%rsi),%rax
90         adcq    $0,%rdx
91         addq    %r11,%r13
92         adcq    $0,%rdx
93         movq    %r13,-16(%rsp,%r15,8)
94         movq    %rdx,%r13
95         movq    %r10,%r11
97         xorq    %rdx,%rdx
98         addq    %r11,%r13
99         adcq    $0,%rdx
100         movq    %r13,-8(%rsp,%r9,8)
101         movq    %rdx,(%rsp,%r9,8)
103         leaq    1(%r14),%r14
104         jmp     .Louter
105 .align  16
106 .Louter:
107         movq    (%r12,%r14,8),%rbx
108         xorq    %r15,%r15
109         movq    %r8,%rbp
110         movq    (%rsp),%r10
111         mulq    %rbx
112         addq    %rax,%r10
113         movq    (%rcx),%rax
114         adcq    $0,%rdx
116         imulq   %r10,%rbp
117         movq    %rdx,%r11
119         mulq    %rbp
120         addq    %rax,%r10
121         movq    8(%rsi),%rax
122         adcq    $0,%rdx
123         movq    8(%rsp),%r10
124         movq    %rdx,%r13
126         leaq    1(%r15),%r15
127         jmp     .Linner_enter
129 .align  16
130 .Linner:
131         addq    %rax,%r13
132         movq    (%rsi,%r15,8),%rax
133         adcq    $0,%rdx
134         addq    %r10,%r13
135         movq    (%rsp,%r15,8),%r10
136         adcq    $0,%rdx
137         movq    %r13,-16(%rsp,%r15,8)
138         movq    %rdx,%r13
140 .Linner_enter:
141         mulq    %rbx
142         addq    %rax,%r11
143         movq    (%rcx,%r15,8),%rax
144         adcq    $0,%rdx
145         addq    %r11,%r10
146         movq    %rdx,%r11
147         adcq    $0,%r11
148         leaq    1(%r15),%r15
150         mulq    %rbp
151         cmpq    %r9,%r15
152         jne     .Linner
154         addq    %rax,%r13
155         movq    (%rsi),%rax
156         adcq    $0,%rdx
157         addq    %r10,%r13
158         movq    (%rsp,%r15,8),%r10
159         adcq    $0,%rdx
160         movq    %r13,-16(%rsp,%r15,8)
161         movq    %rdx,%r13
163         xorq    %rdx,%rdx
164         addq    %r11,%r13
165         adcq    $0,%rdx
166         addq    %r10,%r13
167         adcq    $0,%rdx
168         movq    %r13,-8(%rsp,%r9,8)
169         movq    %rdx,(%rsp,%r9,8)
171         leaq    1(%r14),%r14
172         cmpq    %r9,%r14
173         jb      .Louter
175         xorq    %r14,%r14
176         movq    (%rsp),%rax
177         leaq    (%rsp),%rsi
178         movq    %r9,%r15
179         jmp     .Lsub
180 .align  16
181 .Lsub:  sbbq    (%rcx,%r14,8),%rax
182         movq    %rax,(%rdi,%r14,8)
183         movq    8(%rsi,%r14,8),%rax
184         leaq    1(%r14),%r14
185         decq    %r15
186         jnz     .Lsub
188         sbbq    $0,%rax
189         xorq    %r14,%r14
190         movq    %r9,%r15
191 .align  16
192 .Lcopy:
193         movq    (%rsp,%r14,8),%rsi
194         movq    (%rdi,%r14,8),%rcx
195         xorq    %rcx,%rsi
196         andq    %rax,%rsi
197         xorq    %rcx,%rsi
198         movq    %r14,(%rsp,%r14,8)
199         movq    %rsi,(%rdi,%r14,8)
200         leaq    1(%r14),%r14
201         subq    $1,%r15
202         jnz     .Lcopy
204         movq    8(%rsp,%r9,8),%rsi
205         movq    $1,%rax
206         movq    (%rsi),%r15
207         movq    8(%rsi),%r14
208         movq    16(%rsi),%r13
209         movq    24(%rsi),%r12
210         movq    32(%rsi),%rbp
211         movq    40(%rsi),%rbx
212         leaq    48(%rsi),%rsp
213 .Lmul_epilogue:
214         .byte   0xf3,0xc3
215 .size   bn_mul_mont,.-bn_mul_mont
216 .type   bn_mul4x_mont,@function
217 .align  16
218 bn_mul4x_mont:
219 .Lmul4x_enter:
220         pushq   %rbx
221         pushq   %rbp
222         pushq   %r12
223         pushq   %r13
224         pushq   %r14
225         pushq   %r15
227         movl    %r9d,%r9d
228         leaq    4(%r9),%r10
229         movq    %rsp,%r11
230         negq    %r10
231         leaq    (%rsp,%r10,8),%rsp
232         andq    $-1024,%rsp
234         movq    %r11,8(%rsp,%r9,8)
235 .Lmul4x_body:
236         movq    %rdi,16(%rsp,%r9,8)
237         movq    %rdx,%r12
238         movq    (%r8),%r8
239         movq    (%r12),%rbx
240         movq    (%rsi),%rax
242         xorq    %r14,%r14
243         xorq    %r15,%r15
245         movq    %r8,%rbp
246         mulq    %rbx
247         movq    %rax,%r10
248         movq    (%rcx),%rax
250         imulq   %r10,%rbp
251         movq    %rdx,%r11
253         mulq    %rbp
254         addq    %rax,%r10
255         movq    8(%rsi),%rax
256         adcq    $0,%rdx
257         movq    %rdx,%rdi
259         mulq    %rbx
260         addq    %rax,%r11
261         movq    8(%rcx),%rax
262         adcq    $0,%rdx
263         movq    %rdx,%r10
265         mulq    %rbp
266         addq    %rax,%rdi
267         movq    16(%rsi),%rax
268         adcq    $0,%rdx
269         addq    %r11,%rdi
270         leaq    4(%r15),%r15
271         adcq    $0,%rdx
272         movq    %rdi,(%rsp)
273         movq    %rdx,%r13
274         jmp     .L1st4x
275 .align  16
276 .L1st4x:
277         mulq    %rbx
278         addq    %rax,%r10
279         movq    -16(%rcx,%r15,8),%rax
280         adcq    $0,%rdx
281         movq    %rdx,%r11
283         mulq    %rbp
284         addq    %rax,%r13
285         movq    -8(%rsi,%r15,8),%rax
286         adcq    $0,%rdx
287         addq    %r10,%r13
288         adcq    $0,%rdx
289         movq    %r13,-24(%rsp,%r15,8)
290         movq    %rdx,%rdi
292         mulq    %rbx
293         addq    %rax,%r11
294         movq    -8(%rcx,%r15,8),%rax
295         adcq    $0,%rdx
296         movq    %rdx,%r10
298         mulq    %rbp
299         addq    %rax,%rdi
300         movq    (%rsi,%r15,8),%rax
301         adcq    $0,%rdx
302         addq    %r11,%rdi
303         adcq    $0,%rdx
304         movq    %rdi,-16(%rsp,%r15,8)
305         movq    %rdx,%r13
307         mulq    %rbx
308         addq    %rax,%r10
309         movq    (%rcx,%r15,8),%rax
310         adcq    $0,%rdx
311         movq    %rdx,%r11
313         mulq    %rbp
314         addq    %rax,%r13
315         movq    8(%rsi,%r15,8),%rax
316         adcq    $0,%rdx
317         addq    %r10,%r13
318         adcq    $0,%rdx
319         movq    %r13,-8(%rsp,%r15,8)
320         movq    %rdx,%rdi
322         mulq    %rbx
323         addq    %rax,%r11
324         movq    8(%rcx,%r15,8),%rax
325         adcq    $0,%rdx
326         leaq    4(%r15),%r15
327         movq    %rdx,%r10
329         mulq    %rbp
330         addq    %rax,%rdi
331         movq    -16(%rsi,%r15,8),%rax
332         adcq    $0,%rdx
333         addq    %r11,%rdi
334         adcq    $0,%rdx
335         movq    %rdi,-32(%rsp,%r15,8)
336         movq    %rdx,%r13
337         cmpq    %r9,%r15
338         jb      .L1st4x
340         mulq    %rbx
341         addq    %rax,%r10
342         movq    -16(%rcx,%r15,8),%rax
343         adcq    $0,%rdx
344         movq    %rdx,%r11
346         mulq    %rbp
347         addq    %rax,%r13
348         movq    -8(%rsi,%r15,8),%rax
349         adcq    $0,%rdx
350         addq    %r10,%r13
351         adcq    $0,%rdx
352         movq    %r13,-24(%rsp,%r15,8)
353         movq    %rdx,%rdi
355         mulq    %rbx
356         addq    %rax,%r11
357         movq    -8(%rcx,%r15,8),%rax
358         adcq    $0,%rdx
359         movq    %rdx,%r10
361         mulq    %rbp
362         addq    %rax,%rdi
363         movq    (%rsi),%rax
364         adcq    $0,%rdx
365         addq    %r11,%rdi
366         adcq    $0,%rdx
367         movq    %rdi,-16(%rsp,%r15,8)
368         movq    %rdx,%r13
370         xorq    %rdi,%rdi
371         addq    %r10,%r13
372         adcq    $0,%rdi
373         movq    %r13,-8(%rsp,%r15,8)
374         movq    %rdi,(%rsp,%r15,8)
376         leaq    1(%r14),%r14
377 .align  4
378 .Louter4x:
379         movq    (%r12,%r14,8),%rbx
380         xorq    %r15,%r15
381         movq    (%rsp),%r10
382         movq    %r8,%rbp
383         mulq    %rbx
384         addq    %rax,%r10
385         movq    (%rcx),%rax
386         adcq    $0,%rdx
388         imulq   %r10,%rbp
389         movq    %rdx,%r11
391         mulq    %rbp
392         addq    %rax,%r10
393         movq    8(%rsi),%rax
394         adcq    $0,%rdx
395         movq    %rdx,%rdi
397         mulq    %rbx
398         addq    %rax,%r11
399         movq    8(%rcx),%rax
400         adcq    $0,%rdx
401         addq    8(%rsp),%r11
402         adcq    $0,%rdx
403         movq    %rdx,%r10
405         mulq    %rbp
406         addq    %rax,%rdi
407         movq    16(%rsi),%rax
408         adcq    $0,%rdx
409         addq    %r11,%rdi
410         leaq    4(%r15),%r15
411         adcq    $0,%rdx
412         movq    %rdi,(%rsp)
413         movq    %rdx,%r13
414         jmp     .Linner4x
415 .align  16
416 .Linner4x:
417         mulq    %rbx
418         addq    %rax,%r10
419         movq    -16(%rcx,%r15,8),%rax
420         adcq    $0,%rdx
421         addq    -16(%rsp,%r15,8),%r10
422         adcq    $0,%rdx
423         movq    %rdx,%r11
425         mulq    %rbp
426         addq    %rax,%r13
427         movq    -8(%rsi,%r15,8),%rax
428         adcq    $0,%rdx
429         addq    %r10,%r13
430         adcq    $0,%rdx
431         movq    %r13,-24(%rsp,%r15,8)
432         movq    %rdx,%rdi
434         mulq    %rbx
435         addq    %rax,%r11
436         movq    -8(%rcx,%r15,8),%rax
437         adcq    $0,%rdx
438         addq    -8(%rsp,%r15,8),%r11
439         adcq    $0,%rdx
440         movq    %rdx,%r10
442         mulq    %rbp
443         addq    %rax,%rdi
444         movq    (%rsi,%r15,8),%rax
445         adcq    $0,%rdx
446         addq    %r11,%rdi
447         adcq    $0,%rdx
448         movq    %rdi,-16(%rsp,%r15,8)
449         movq    %rdx,%r13
451         mulq    %rbx
452         addq    %rax,%r10
453         movq    (%rcx,%r15,8),%rax
454         adcq    $0,%rdx
455         addq    (%rsp,%r15,8),%r10
456         adcq    $0,%rdx
457         movq    %rdx,%r11
459         mulq    %rbp
460         addq    %rax,%r13
461         movq    8(%rsi,%r15,8),%rax
462         adcq    $0,%rdx
463         addq    %r10,%r13
464         adcq    $0,%rdx
465         movq    %r13,-8(%rsp,%r15,8)
466         movq    %rdx,%rdi
468         mulq    %rbx
469         addq    %rax,%r11
470         movq    8(%rcx,%r15,8),%rax
471         adcq    $0,%rdx
472         addq    8(%rsp,%r15,8),%r11
473         adcq    $0,%rdx
474         leaq    4(%r15),%r15
475         movq    %rdx,%r10
477         mulq    %rbp
478         addq    %rax,%rdi
479         movq    -16(%rsi,%r15,8),%rax
480         adcq    $0,%rdx
481         addq    %r11,%rdi
482         adcq    $0,%rdx
483         movq    %rdi,-32(%rsp,%r15,8)
484         movq    %rdx,%r13
485         cmpq    %r9,%r15
486         jb      .Linner4x
488         mulq    %rbx
489         addq    %rax,%r10
490         movq    -16(%rcx,%r15,8),%rax
491         adcq    $0,%rdx
492         addq    -16(%rsp,%r15,8),%r10
493         adcq    $0,%rdx
494         movq    %rdx,%r11
496         mulq    %rbp
497         addq    %rax,%r13
498         movq    -8(%rsi,%r15,8),%rax
499         adcq    $0,%rdx
500         addq    %r10,%r13
501         adcq    $0,%rdx
502         movq    %r13,-24(%rsp,%r15,8)
503         movq    %rdx,%rdi
505         mulq    %rbx
506         addq    %rax,%r11
507         movq    -8(%rcx,%r15,8),%rax
508         adcq    $0,%rdx
509         addq    -8(%rsp,%r15,8),%r11
510         adcq    $0,%rdx
511         leaq    1(%r14),%r14
512         movq    %rdx,%r10
514         mulq    %rbp
515         addq    %rax,%rdi
516         movq    (%rsi),%rax
517         adcq    $0,%rdx
518         addq    %r11,%rdi
519         adcq    $0,%rdx
520         movq    %rdi,-16(%rsp,%r15,8)
521         movq    %rdx,%r13
523         xorq    %rdi,%rdi
524         addq    %r10,%r13
525         adcq    $0,%rdi
526         addq    (%rsp,%r9,8),%r13
527         adcq    $0,%rdi
528         movq    %r13,-8(%rsp,%r15,8)
529         movq    %rdi,(%rsp,%r15,8)
531         cmpq    %r9,%r14
532         jb      .Louter4x
533         movq    16(%rsp,%r9,8),%rdi
534         movq    0(%rsp),%rax
535         movq    8(%rsp),%rdx
536         shrq    $2,%r9
537         leaq    (%rsp),%rsi
538         xorq    %r14,%r14
540         subq    0(%rcx),%rax
541         movq    16(%rsi),%rbx
542         movq    24(%rsi),%rbp
543         sbbq    8(%rcx),%rdx
544         leaq    -1(%r9),%r15
545         jmp     .Lsub4x
546 .align  16
547 .Lsub4x:
548         movq    %rax,0(%rdi,%r14,8)
549         movq    %rdx,8(%rdi,%r14,8)
550         sbbq    16(%rcx,%r14,8),%rbx
551         movq    32(%rsi,%r14,8),%rax
552         movq    40(%rsi,%r14,8),%rdx
553         sbbq    24(%rcx,%r14,8),%rbp
554         movq    %rbx,16(%rdi,%r14,8)
555         movq    %rbp,24(%rdi,%r14,8)
556         sbbq    32(%rcx,%r14,8),%rax
557         movq    48(%rsi,%r14,8),%rbx
558         movq    56(%rsi,%r14,8),%rbp
559         sbbq    40(%rcx,%r14,8),%rdx
560         leaq    4(%r14),%r14
561         decq    %r15
562         jnz     .Lsub4x
564         movq    %rax,0(%rdi,%r14,8)
565         movq    32(%rsi,%r14,8),%rax
566         sbbq    16(%rcx,%r14,8),%rbx
567         movq    %rdx,8(%rdi,%r14,8)
568         sbbq    24(%rcx,%r14,8),%rbp
569         movq    %rbx,16(%rdi,%r14,8)
571         sbbq    $0,%rax
572         movq    %rax,%xmm0
573         punpcklqdq      %xmm0,%xmm0
574         movq    %rbp,24(%rdi,%r14,8)
575         xorq    %r14,%r14
577         movq    %r9,%r15
578         pxor    %xmm5,%xmm5
579         jmp     .Lcopy4x
580 .align  16
581 .Lcopy4x:
582         movdqu  (%rsp,%r14,1),%xmm2
583         movdqu  16(%rsp,%r14,1),%xmm4
584         movdqu  (%rdi,%r14,1),%xmm1
585         movdqu  16(%rdi,%r14,1),%xmm3
586         pxor    %xmm1,%xmm2
587         pxor    %xmm3,%xmm4
588         pand    %xmm0,%xmm2
589         pand    %xmm0,%xmm4
590         pxor    %xmm1,%xmm2
591         pxor    %xmm3,%xmm4
592         movdqu  %xmm2,(%rdi,%r14,1)
593         movdqu  %xmm4,16(%rdi,%r14,1)
594         movdqa  %xmm5,(%rsp,%r14,1)
595         movdqa  %xmm5,16(%rsp,%r14,1)
597         leaq    32(%r14),%r14
598         decq    %r15
599         jnz     .Lcopy4x
601         shlq    $2,%r9
602         movq    8(%rsp,%r9,8),%rsi
603         movq    $1,%rax
604         movq    (%rsi),%r15
605         movq    8(%rsi),%r14
606         movq    16(%rsi),%r13
607         movq    24(%rsi),%r12
608         movq    32(%rsi),%rbp
609         movq    40(%rsi),%rbx
610         leaq    48(%rsi),%rsp
611 .Lmul4x_epilogue:
612         .byte   0xf3,0xc3
613 .size   bn_mul4x_mont,.-bn_mul4x_mont
614 .extern bn_sqr8x_internal
615 .hidden bn_sqr8x_internal
617 .type   bn_sqr8x_mont,@function
618 .align  32
619 bn_sqr8x_mont:
620 .Lsqr8x_enter:
621         movq    %rsp,%rax
622         pushq   %rbx
623         pushq   %rbp
624         pushq   %r12
625         pushq   %r13
626         pushq   %r14
627         pushq   %r15
629         movl    %r9d,%r10d
630         shll    $3,%r9d
631         shlq    $3+2,%r10
632         negq    %r9
639         leaq    -64(%rsp,%r9,4),%r11
640         movq    (%r8),%r8
641         subq    %rsi,%r11
642         andq    $4095,%r11
643         cmpq    %r11,%r10
644         jb      .Lsqr8x_sp_alt
645         subq    %r11,%rsp
646         leaq    -64(%rsp,%r9,4),%rsp
647         jmp     .Lsqr8x_sp_done
649 .align  32
650 .Lsqr8x_sp_alt:
651         leaq    4096-64(,%r9,4),%r10
652         leaq    -64(%rsp,%r9,4),%rsp
653         subq    %r10,%r11
654         movq    $0,%r10
655         cmovcq  %r10,%r11
656         subq    %r11,%rsp
657 .Lsqr8x_sp_done:
658         andq    $-64,%rsp
659         movq    %r9,%r10
660         negq    %r9
662         leaq    64(%rsp,%r9,2),%r11
663         movq    %r8,32(%rsp)
664         movq    %rax,40(%rsp)
665 .Lsqr8x_body:
667         movq    %r9,%rbp
668 .byte   102,73,15,110,211
669         shrq    $3+2,%rbp
670         movl    OPENSSL_ia32cap_P+8(%rip),%eax
671         jmp     .Lsqr8x_copy_n
673 .align  32
674 .Lsqr8x_copy_n:
675         movq    0(%rcx),%xmm0
676         movq    8(%rcx),%xmm1
677         movq    16(%rcx),%xmm3
678         movq    24(%rcx),%xmm4
679         leaq    32(%rcx),%rcx
680         movdqa  %xmm0,0(%r11)
681         movdqa  %xmm1,16(%r11)
682         movdqa  %xmm3,32(%r11)
683         movdqa  %xmm4,48(%r11)
684         leaq    64(%r11),%r11
685         decq    %rbp
686         jnz     .Lsqr8x_copy_n
688         pxor    %xmm0,%xmm0
689 .byte   102,72,15,110,207
690 .byte   102,73,15,110,218
691         call    bn_sqr8x_internal
693         pxor    %xmm0,%xmm0
694         leaq    48(%rsp),%rax
695         leaq    64(%rsp,%r9,2),%rdx
696         shrq    $3+2,%r9
697         movq    40(%rsp),%rsi
698         jmp     .Lsqr8x_zero
700 .align  32
701 .Lsqr8x_zero:
702         movdqa  %xmm0,0(%rax)
703         movdqa  %xmm0,16(%rax)
704         movdqa  %xmm0,32(%rax)
705         movdqa  %xmm0,48(%rax)
706         leaq    64(%rax),%rax
707         movdqa  %xmm0,0(%rdx)
708         movdqa  %xmm0,16(%rdx)
709         movdqa  %xmm0,32(%rdx)
710         movdqa  %xmm0,48(%rdx)
711         leaq    64(%rdx),%rdx
712         decq    %r9
713         jnz     .Lsqr8x_zero
715         movq    $1,%rax
716         movq    -48(%rsi),%r15
717         movq    -40(%rsi),%r14
718         movq    -32(%rsi),%r13
719         movq    -24(%rsi),%r12
720         movq    -16(%rsi),%rbp
721         movq    -8(%rsi),%rbx
722         leaq    (%rsi),%rsp
723 .Lsqr8x_epilogue:
724         .byte   0xf3,0xc3
725 .size   bn_sqr8x_mont,.-bn_sqr8x_mont
726 .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
727 .align  16
728 #endif