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