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