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