]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - secure/lib/libcrypto/amd64/x86_64-mont5.S
Regen amd64 assembly files for OpenSSL 1.1.1.
[FreeBSD/FreeBSD.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
6
7 .globl  bn_mul_mont_gather5
8 .type   bn_mul_mont_gather5,@function
9 .align  64
10 bn_mul_mont_gather5:
11 .cfi_startproc  
12         movl    %r9d,%r9d
13         movq    %rsp,%rax
14 .cfi_def_cfa_register   %rax
15         testl   $7,%r9d
16         jnz     .Lmul_enter
17         movl    OPENSSL_ia32cap_P+8(%rip),%r11d
18         jmp     .Lmul4x_enter
19
20 .align  16
21 .Lmul_enter:
22         movd    8(%rsp),%xmm5
23         pushq   %rbx
24 .cfi_offset     %rbx,-16
25         pushq   %rbp
26 .cfi_offset     %rbp,-24
27         pushq   %r12
28 .cfi_offset     %r12,-32
29         pushq   %r13
30 .cfi_offset     %r13,-40
31         pushq   %r14
32 .cfi_offset     %r14,-48
33         pushq   %r15
34 .cfi_offset     %r15,-56
35
36         negq    %r9
37         movq    %rsp,%r11
38         leaq    -280(%rsp,%r9,8),%r10
39         negq    %r9
40         andq    $-1024,%r10
41
42
43
44
45
46
47
48
49
50         subq    %r10,%r11
51         andq    $-4096,%r11
52         leaq    (%r10,%r11,1),%rsp
53         movq    (%rsp),%r11
54         cmpq    %r10,%rsp
55         ja      .Lmul_page_walk
56         jmp     .Lmul_page_walk_done
57
58 .Lmul_page_walk:
59         leaq    -4096(%rsp),%rsp
60         movq    (%rsp),%r11
61         cmpq    %r10,%rsp
62         ja      .Lmul_page_walk
63 .Lmul_page_walk_done:
64
65         leaq    .Linc(%rip),%r10
66         movq    %rax,8(%rsp,%r9,8)
67 .cfi_escape     0x0f,0x0a,0x77,0x08,0x79,0x00,0x38,0x1e,0x22,0x06,0x23,0x08
68 .Lmul_body:
69
70         leaq    128(%rdx),%r12
71         movdqa  0(%r10),%xmm0
72         movdqa  16(%r10),%xmm1
73         leaq    24-112(%rsp,%r9,8),%r10
74         andq    $-16,%r10
75
76         pshufd  $0,%xmm5,%xmm5
77         movdqa  %xmm1,%xmm4
78         movdqa  %xmm1,%xmm2
79         paddd   %xmm0,%xmm1
80         pcmpeqd %xmm5,%xmm0
81 .byte   0x67
82         movdqa  %xmm4,%xmm3
83         paddd   %xmm1,%xmm2
84         pcmpeqd %xmm5,%xmm1
85         movdqa  %xmm0,112(%r10)
86         movdqa  %xmm4,%xmm0
87
88         paddd   %xmm2,%xmm3
89         pcmpeqd %xmm5,%xmm2
90         movdqa  %xmm1,128(%r10)
91         movdqa  %xmm4,%xmm1
92
93         paddd   %xmm3,%xmm0
94         pcmpeqd %xmm5,%xmm3
95         movdqa  %xmm2,144(%r10)
96         movdqa  %xmm4,%xmm2
97
98         paddd   %xmm0,%xmm1
99         pcmpeqd %xmm5,%xmm0
100         movdqa  %xmm3,160(%r10)
101         movdqa  %xmm4,%xmm3
102         paddd   %xmm1,%xmm2
103         pcmpeqd %xmm5,%xmm1
104         movdqa  %xmm0,176(%r10)
105         movdqa  %xmm4,%xmm0
106
107         paddd   %xmm2,%xmm3
108         pcmpeqd %xmm5,%xmm2
109         movdqa  %xmm1,192(%r10)
110         movdqa  %xmm4,%xmm1
111
112         paddd   %xmm3,%xmm0
113         pcmpeqd %xmm5,%xmm3
114         movdqa  %xmm2,208(%r10)
115         movdqa  %xmm4,%xmm2
116
117         paddd   %xmm0,%xmm1
118         pcmpeqd %xmm5,%xmm0
119         movdqa  %xmm3,224(%r10)
120         movdqa  %xmm4,%xmm3
121         paddd   %xmm1,%xmm2
122         pcmpeqd %xmm5,%xmm1
123         movdqa  %xmm0,240(%r10)
124         movdqa  %xmm4,%xmm0
125
126         paddd   %xmm2,%xmm3
127         pcmpeqd %xmm5,%xmm2
128         movdqa  %xmm1,256(%r10)
129         movdqa  %xmm4,%xmm1
130
131         paddd   %xmm3,%xmm0
132         pcmpeqd %xmm5,%xmm3
133         movdqa  %xmm2,272(%r10)
134         movdqa  %xmm4,%xmm2
135
136         paddd   %xmm0,%xmm1
137         pcmpeqd %xmm5,%xmm0
138         movdqa  %xmm3,288(%r10)
139         movdqa  %xmm4,%xmm3
140         paddd   %xmm1,%xmm2
141         pcmpeqd %xmm5,%xmm1
142         movdqa  %xmm0,304(%r10)
143
144         paddd   %xmm2,%xmm3
145 .byte   0x67
146         pcmpeqd %xmm5,%xmm2
147         movdqa  %xmm1,320(%r10)
148
149         pcmpeqd %xmm5,%xmm3
150         movdqa  %xmm2,336(%r10)
151         pand    64(%r12),%xmm0
152
153         pand    80(%r12),%xmm1
154         pand    96(%r12),%xmm2
155         movdqa  %xmm3,352(%r10)
156         pand    112(%r12),%xmm3
157         por     %xmm2,%xmm0
158         por     %xmm3,%xmm1
159         movdqa  -128(%r12),%xmm4
160         movdqa  -112(%r12),%xmm5
161         movdqa  -96(%r12),%xmm2
162         pand    112(%r10),%xmm4
163         movdqa  -80(%r12),%xmm3
164         pand    128(%r10),%xmm5
165         por     %xmm4,%xmm0
166         pand    144(%r10),%xmm2
167         por     %xmm5,%xmm1
168         pand    160(%r10),%xmm3
169         por     %xmm2,%xmm0
170         por     %xmm3,%xmm1
171         movdqa  -64(%r12),%xmm4
172         movdqa  -48(%r12),%xmm5
173         movdqa  -32(%r12),%xmm2
174         pand    176(%r10),%xmm4
175         movdqa  -16(%r12),%xmm3
176         pand    192(%r10),%xmm5
177         por     %xmm4,%xmm0
178         pand    208(%r10),%xmm2
179         por     %xmm5,%xmm1
180         pand    224(%r10),%xmm3
181         por     %xmm2,%xmm0
182         por     %xmm3,%xmm1
183         movdqa  0(%r12),%xmm4
184         movdqa  16(%r12),%xmm5
185         movdqa  32(%r12),%xmm2
186         pand    240(%r10),%xmm4
187         movdqa  48(%r12),%xmm3
188         pand    256(%r10),%xmm5
189         por     %xmm4,%xmm0
190         pand    272(%r10),%xmm2
191         por     %xmm5,%xmm1
192         pand    288(%r10),%xmm3
193         por     %xmm2,%xmm0
194         por     %xmm3,%xmm1
195         por     %xmm1,%xmm0
196         pshufd  $0x4e,%xmm0,%xmm1
197         por     %xmm1,%xmm0
198         leaq    256(%r12),%r12
199 .byte   102,72,15,126,195
200
201         movq    (%r8),%r8
202         movq    (%rsi),%rax
203
204         xorq    %r14,%r14
205         xorq    %r15,%r15
206
207         movq    %r8,%rbp
208         mulq    %rbx
209         movq    %rax,%r10
210         movq    (%rcx),%rax
211
212         imulq   %r10,%rbp
213         movq    %rdx,%r11
214
215         mulq    %rbp
216         addq    %rax,%r10
217         movq    8(%rsi),%rax
218         adcq    $0,%rdx
219         movq    %rdx,%r13
220
221         leaq    1(%r15),%r15
222         jmp     .L1st_enter
223
224 .align  16
225 .L1st:
226         addq    %rax,%r13
227         movq    (%rsi,%r15,8),%rax
228         adcq    $0,%rdx
229         addq    %r11,%r13
230         movq    %r10,%r11
231         adcq    $0,%rdx
232         movq    %r13,-16(%rsp,%r15,8)
233         movq    %rdx,%r13
234
235 .L1st_enter:
236         mulq    %rbx
237         addq    %rax,%r11
238         movq    (%rcx,%r15,8),%rax
239         adcq    $0,%rdx
240         leaq    1(%r15),%r15
241         movq    %rdx,%r10
242
243         mulq    %rbp
244         cmpq    %r9,%r15
245         jne     .L1st
246
247
248         addq    %rax,%r13
249         adcq    $0,%rdx
250         addq    %r11,%r13
251         adcq    $0,%rdx
252         movq    %r13,-16(%rsp,%r9,8)
253         movq    %rdx,%r13
254         movq    %r10,%r11
255
256         xorq    %rdx,%rdx
257         addq    %r11,%r13
258         adcq    $0,%rdx
259         movq    %r13,-8(%rsp,%r9,8)
260         movq    %rdx,(%rsp,%r9,8)
261
262         leaq    1(%r14),%r14
263         jmp     .Louter
264 .align  16
265 .Louter:
266         leaq    24+128(%rsp,%r9,8),%rdx
267         andq    $-16,%rdx
268         pxor    %xmm4,%xmm4
269         pxor    %xmm5,%xmm5
270         movdqa  -128(%r12),%xmm0
271         movdqa  -112(%r12),%xmm1
272         movdqa  -96(%r12),%xmm2
273         movdqa  -80(%r12),%xmm3
274         pand    -128(%rdx),%xmm0
275         pand    -112(%rdx),%xmm1
276         por     %xmm0,%xmm4
277         pand    -96(%rdx),%xmm2
278         por     %xmm1,%xmm5
279         pand    -80(%rdx),%xmm3
280         por     %xmm2,%xmm4
281         por     %xmm3,%xmm5
282         movdqa  -64(%r12),%xmm0
283         movdqa  -48(%r12),%xmm1
284         movdqa  -32(%r12),%xmm2
285         movdqa  -16(%r12),%xmm3
286         pand    -64(%rdx),%xmm0
287         pand    -48(%rdx),%xmm1
288         por     %xmm0,%xmm4
289         pand    -32(%rdx),%xmm2
290         por     %xmm1,%xmm5
291         pand    -16(%rdx),%xmm3
292         por     %xmm2,%xmm4
293         por     %xmm3,%xmm5
294         movdqa  0(%r12),%xmm0
295         movdqa  16(%r12),%xmm1
296         movdqa  32(%r12),%xmm2
297         movdqa  48(%r12),%xmm3
298         pand    0(%rdx),%xmm0
299         pand    16(%rdx),%xmm1
300         por     %xmm0,%xmm4
301         pand    32(%rdx),%xmm2
302         por     %xmm1,%xmm5
303         pand    48(%rdx),%xmm3
304         por     %xmm2,%xmm4
305         por     %xmm3,%xmm5
306         movdqa  64(%r12),%xmm0
307         movdqa  80(%r12),%xmm1
308         movdqa  96(%r12),%xmm2
309         movdqa  112(%r12),%xmm3
310         pand    64(%rdx),%xmm0
311         pand    80(%rdx),%xmm1
312         por     %xmm0,%xmm4
313         pand    96(%rdx),%xmm2
314         por     %xmm1,%xmm5
315         pand    112(%rdx),%xmm3
316         por     %xmm2,%xmm4
317         por     %xmm3,%xmm5
318         por     %xmm5,%xmm4
319         pshufd  $0x4e,%xmm4,%xmm0
320         por     %xmm4,%xmm0
321         leaq    256(%r12),%r12
322
323         movq    (%rsi),%rax
324 .byte   102,72,15,126,195
325
326         xorq    %r15,%r15
327         movq    %r8,%rbp
328         movq    (%rsp),%r10
329
330         mulq    %rbx
331         addq    %rax,%r10
332         movq    (%rcx),%rax
333         adcq    $0,%rdx
334
335         imulq   %r10,%rbp
336         movq    %rdx,%r11
337
338         mulq    %rbp
339         addq    %rax,%r10
340         movq    8(%rsi),%rax
341         adcq    $0,%rdx
342         movq    8(%rsp),%r10
343         movq    %rdx,%r13
344
345         leaq    1(%r15),%r15
346         jmp     .Linner_enter
347
348 .align  16
349 .Linner:
350         addq    %rax,%r13
351         movq    (%rsi,%r15,8),%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 .Linner_enter:
360         mulq    %rbx
361         addq    %rax,%r11
362         movq    (%rcx,%r15,8),%rax
363         adcq    $0,%rdx
364         addq    %r11,%r10
365         movq    %rdx,%r11
366         adcq    $0,%r11
367         leaq    1(%r15),%r15
368
369         mulq    %rbp
370         cmpq    %r9,%r15
371         jne     .Linner
372
373         addq    %rax,%r13
374         adcq    $0,%rdx
375         addq    %r10,%r13
376         movq    (%rsp,%r9,8),%r10
377         adcq    $0,%rdx
378         movq    %r13,-16(%rsp,%r9,8)
379         movq    %rdx,%r13
380
381         xorq    %rdx,%rdx
382         addq    %r11,%r13
383         adcq    $0,%rdx
384         addq    %r10,%r13
385         adcq    $0,%rdx
386         movq    %r13,-8(%rsp,%r9,8)
387         movq    %rdx,(%rsp,%r9,8)
388
389         leaq    1(%r14),%r14
390         cmpq    %r9,%r14
391         jb      .Louter
392
393         xorq    %r14,%r14
394         movq    (%rsp),%rax
395         leaq    (%rsp),%rsi
396         movq    %r9,%r15
397         jmp     .Lsub
398 .align  16
399 .Lsub:  sbbq    (%rcx,%r14,8),%rax
400         movq    %rax,(%rdi,%r14,8)
401         movq    8(%rsi,%r14,8),%rax
402         leaq    1(%r14),%r14
403         decq    %r15
404         jnz     .Lsub
405
406         sbbq    $0,%rax
407         movq    $-1,%rbx
408         xorq    %rax,%rbx
409         xorq    %r14,%r14
410         movq    %r9,%r15
411
412 .Lcopy:
413         movq    (%rdi,%r14,8),%rcx
414         movq    (%rsp,%r14,8),%rdx
415         andq    %rbx,%rcx
416         andq    %rax,%rdx
417         movq    %r14,(%rsp,%r14,8)
418         orq     %rcx,%rdx
419         movq    %rdx,(%rdi,%r14,8)
420         leaq    1(%r14),%r14
421         subq    $1,%r15
422         jnz     .Lcopy
423
424         movq    8(%rsp,%r9,8),%rsi
425 .cfi_def_cfa    %rsi,8
426         movq    $1,%rax
427
428         movq    -48(%rsi),%r15
429 .cfi_restore    %r15
430         movq    -40(%rsi),%r14
431 .cfi_restore    %r14
432         movq    -32(%rsi),%r13
433 .cfi_restore    %r13
434         movq    -24(%rsi),%r12
435 .cfi_restore    %r12
436         movq    -16(%rsi),%rbp
437 .cfi_restore    %rbp
438         movq    -8(%rsi),%rbx
439 .cfi_restore    %rbx
440         leaq    (%rsi),%rsp
441 .cfi_def_cfa_register   %rsp
442 .Lmul_epilogue:
443         .byte   0xf3,0xc3
444 .cfi_endproc    
445 .size   bn_mul_mont_gather5,.-bn_mul_mont_gather5
446 .type   bn_mul4x_mont_gather5,@function
447 .align  32
448 bn_mul4x_mont_gather5:
449 .cfi_startproc  
450 .byte   0x67
451         movq    %rsp,%rax
452 .cfi_def_cfa_register   %rax
453 .Lmul4x_enter:
454         andl    $0x80108,%r11d
455         cmpl    $0x80108,%r11d
456         je      .Lmulx4x_enter
457         pushq   %rbx
458 .cfi_offset     %rbx,-16
459         pushq   %rbp
460 .cfi_offset     %rbp,-24
461         pushq   %r12
462 .cfi_offset     %r12,-32
463         pushq   %r13
464 .cfi_offset     %r13,-40
465         pushq   %r14
466 .cfi_offset     %r14,-48
467         pushq   %r15
468 .cfi_offset     %r15,-56
469 .Lmul4x_prologue:
470
471 .byte   0x67
472         shll    $3,%r9d
473         leaq    (%r9,%r9,2),%r10
474         negq    %r9
475
476
477
478
479
480
481
482
483
484
485         leaq    -320(%rsp,%r9,2),%r11
486         movq    %rsp,%rbp
487         subq    %rdi,%r11
488         andq    $4095,%r11
489         cmpq    %r11,%r10
490         jb      .Lmul4xsp_alt
491         subq    %r11,%rbp
492         leaq    -320(%rbp,%r9,2),%rbp
493         jmp     .Lmul4xsp_done
494
495 .align  32
496 .Lmul4xsp_alt:
497         leaq    4096-320(,%r9,2),%r10
498         leaq    -320(%rbp,%r9,2),%rbp
499         subq    %r10,%r11
500         movq    $0,%r10
501         cmovcq  %r10,%r11
502         subq    %r11,%rbp
503 .Lmul4xsp_done:
504         andq    $-64,%rbp
505         movq    %rsp,%r11
506         subq    %rbp,%r11
507         andq    $-4096,%r11
508         leaq    (%r11,%rbp,1),%rsp
509         movq    (%rsp),%r10
510         cmpq    %rbp,%rsp
511         ja      .Lmul4x_page_walk
512         jmp     .Lmul4x_page_walk_done
513
514 .Lmul4x_page_walk:
515         leaq    -4096(%rsp),%rsp
516         movq    (%rsp),%r10
517         cmpq    %rbp,%rsp
518         ja      .Lmul4x_page_walk
519 .Lmul4x_page_walk_done:
520
521         negq    %r9
522
523         movq    %rax,40(%rsp)
524 .cfi_escape     0x0f,0x05,0x77,0x28,0x06,0x23,0x08
525 .Lmul4x_body:
526
527         call    mul4x_internal
528
529         movq    40(%rsp),%rsi
530 .cfi_def_cfa    %rsi,8
531         movq    $1,%rax
532
533         movq    -48(%rsi),%r15
534 .cfi_restore    %r15
535         movq    -40(%rsi),%r14
536 .cfi_restore    %r14
537         movq    -32(%rsi),%r13
538 .cfi_restore    %r13
539         movq    -24(%rsi),%r12
540 .cfi_restore    %r12
541         movq    -16(%rsi),%rbp
542 .cfi_restore    %rbp
543         movq    -8(%rsi),%rbx
544 .cfi_restore    %rbx
545         leaq    (%rsi),%rsp
546 .cfi_def_cfa_register   %rsp
547 .Lmul4x_epilogue:
548         .byte   0xf3,0xc3
549 .cfi_endproc    
550 .size   bn_mul4x_mont_gather5,.-bn_mul4x_mont_gather5
551
552 .type   mul4x_internal,@function
553 .align  32
554 mul4x_internal:
555         shlq    $5,%r9
556         movd    8(%rax),%xmm5
557         leaq    .Linc(%rip),%rax
558         leaq    128(%rdx,%r9,1),%r13
559         shrq    $5,%r9
560         movdqa  0(%rax),%xmm0
561         movdqa  16(%rax),%xmm1
562         leaq    88-112(%rsp,%r9,1),%r10
563         leaq    128(%rdx),%r12
564
565         pshufd  $0,%xmm5,%xmm5
566         movdqa  %xmm1,%xmm4
567 .byte   0x67,0x67
568         movdqa  %xmm1,%xmm2
569         paddd   %xmm0,%xmm1
570         pcmpeqd %xmm5,%xmm0
571 .byte   0x67
572         movdqa  %xmm4,%xmm3
573         paddd   %xmm1,%xmm2
574         pcmpeqd %xmm5,%xmm1
575         movdqa  %xmm0,112(%r10)
576         movdqa  %xmm4,%xmm0
577
578         paddd   %xmm2,%xmm3
579         pcmpeqd %xmm5,%xmm2
580         movdqa  %xmm1,128(%r10)
581         movdqa  %xmm4,%xmm1
582
583         paddd   %xmm3,%xmm0
584         pcmpeqd %xmm5,%xmm3
585         movdqa  %xmm2,144(%r10)
586         movdqa  %xmm4,%xmm2
587
588         paddd   %xmm0,%xmm1
589         pcmpeqd %xmm5,%xmm0
590         movdqa  %xmm3,160(%r10)
591         movdqa  %xmm4,%xmm3
592         paddd   %xmm1,%xmm2
593         pcmpeqd %xmm5,%xmm1
594         movdqa  %xmm0,176(%r10)
595         movdqa  %xmm4,%xmm0
596
597         paddd   %xmm2,%xmm3
598         pcmpeqd %xmm5,%xmm2
599         movdqa  %xmm1,192(%r10)
600         movdqa  %xmm4,%xmm1
601
602         paddd   %xmm3,%xmm0
603         pcmpeqd %xmm5,%xmm3
604         movdqa  %xmm2,208(%r10)
605         movdqa  %xmm4,%xmm2
606
607         paddd   %xmm0,%xmm1
608         pcmpeqd %xmm5,%xmm0
609         movdqa  %xmm3,224(%r10)
610         movdqa  %xmm4,%xmm3
611         paddd   %xmm1,%xmm2
612         pcmpeqd %xmm5,%xmm1
613         movdqa  %xmm0,240(%r10)
614         movdqa  %xmm4,%xmm0
615
616         paddd   %xmm2,%xmm3
617         pcmpeqd %xmm5,%xmm2
618         movdqa  %xmm1,256(%r10)
619         movdqa  %xmm4,%xmm1
620
621         paddd   %xmm3,%xmm0
622         pcmpeqd %xmm5,%xmm3
623         movdqa  %xmm2,272(%r10)
624         movdqa  %xmm4,%xmm2
625
626         paddd   %xmm0,%xmm1
627         pcmpeqd %xmm5,%xmm0
628         movdqa  %xmm3,288(%r10)
629         movdqa  %xmm4,%xmm3
630         paddd   %xmm1,%xmm2
631         pcmpeqd %xmm5,%xmm1
632         movdqa  %xmm0,304(%r10)
633
634         paddd   %xmm2,%xmm3
635 .byte   0x67
636         pcmpeqd %xmm5,%xmm2
637         movdqa  %xmm1,320(%r10)
638
639         pcmpeqd %xmm5,%xmm3
640         movdqa  %xmm2,336(%r10)
641         pand    64(%r12),%xmm0
642
643         pand    80(%r12),%xmm1
644         pand    96(%r12),%xmm2
645         movdqa  %xmm3,352(%r10)
646         pand    112(%r12),%xmm3
647         por     %xmm2,%xmm0
648         por     %xmm3,%xmm1
649         movdqa  -128(%r12),%xmm4
650         movdqa  -112(%r12),%xmm5
651         movdqa  -96(%r12),%xmm2
652         pand    112(%r10),%xmm4
653         movdqa  -80(%r12),%xmm3
654         pand    128(%r10),%xmm5
655         por     %xmm4,%xmm0
656         pand    144(%r10),%xmm2
657         por     %xmm5,%xmm1
658         pand    160(%r10),%xmm3
659         por     %xmm2,%xmm0
660         por     %xmm3,%xmm1
661         movdqa  -64(%r12),%xmm4
662         movdqa  -48(%r12),%xmm5
663         movdqa  -32(%r12),%xmm2
664         pand    176(%r10),%xmm4
665         movdqa  -16(%r12),%xmm3
666         pand    192(%r10),%xmm5
667         por     %xmm4,%xmm0
668         pand    208(%r10),%xmm2
669         por     %xmm5,%xmm1
670         pand    224(%r10),%xmm3
671         por     %xmm2,%xmm0
672         por     %xmm3,%xmm1
673         movdqa  0(%r12),%xmm4
674         movdqa  16(%r12),%xmm5
675         movdqa  32(%r12),%xmm2
676         pand    240(%r10),%xmm4
677         movdqa  48(%r12),%xmm3
678         pand    256(%r10),%xmm5
679         por     %xmm4,%xmm0
680         pand    272(%r10),%xmm2
681         por     %xmm5,%xmm1
682         pand    288(%r10),%xmm3
683         por     %xmm2,%xmm0
684         por     %xmm3,%xmm1
685         por     %xmm1,%xmm0
686         pshufd  $0x4e,%xmm0,%xmm1
687         por     %xmm1,%xmm0
688         leaq    256(%r12),%r12
689 .byte   102,72,15,126,195
690
691         movq    %r13,16+8(%rsp)
692         movq    %rdi,56+8(%rsp)
693
694         movq    (%r8),%r8
695         movq    (%rsi),%rax
696         leaq    (%rsi,%r9,1),%rsi
697         negq    %r9
698
699         movq    %r8,%rbp
700         mulq    %rbx
701         movq    %rax,%r10
702         movq    (%rcx),%rax
703
704         imulq   %r10,%rbp
705         leaq    64+8(%rsp),%r14
706         movq    %rdx,%r11
707
708         mulq    %rbp
709         addq    %rax,%r10
710         movq    8(%rsi,%r9,1),%rax
711         adcq    $0,%rdx
712         movq    %rdx,%rdi
713
714         mulq    %rbx
715         addq    %rax,%r11
716         movq    8(%rcx),%rax
717         adcq    $0,%rdx
718         movq    %rdx,%r10
719
720         mulq    %rbp
721         addq    %rax,%rdi
722         movq    16(%rsi,%r9,1),%rax
723         adcq    $0,%rdx
724         addq    %r11,%rdi
725         leaq    32(%r9),%r15
726         leaq    32(%rcx),%rcx
727         adcq    $0,%rdx
728         movq    %rdi,(%r14)
729         movq    %rdx,%r13
730         jmp     .L1st4x
731
732 .align  32
733 .L1st4x:
734         mulq    %rbx
735         addq    %rax,%r10
736         movq    -16(%rcx),%rax
737         leaq    32(%r14),%r14
738         adcq    $0,%rdx
739         movq    %rdx,%r11
740
741         mulq    %rbp
742         addq    %rax,%r13
743         movq    -8(%rsi,%r15,1),%rax
744         adcq    $0,%rdx
745         addq    %r10,%r13
746         adcq    $0,%rdx
747         movq    %r13,-24(%r14)
748         movq    %rdx,%rdi
749
750         mulq    %rbx
751         addq    %rax,%r11
752         movq    -8(%rcx),%rax
753         adcq    $0,%rdx
754         movq    %rdx,%r10
755
756         mulq    %rbp
757         addq    %rax,%rdi
758         movq    (%rsi,%r15,1),%rax
759         adcq    $0,%rdx
760         addq    %r11,%rdi
761         adcq    $0,%rdx
762         movq    %rdi,-16(%r14)
763         movq    %rdx,%r13
764
765         mulq    %rbx
766         addq    %rax,%r10
767         movq    0(%rcx),%rax
768         adcq    $0,%rdx
769         movq    %rdx,%r11
770
771         mulq    %rbp
772         addq    %rax,%r13
773         movq    8(%rsi,%r15,1),%rax
774         adcq    $0,%rdx
775         addq    %r10,%r13
776         adcq    $0,%rdx
777         movq    %r13,-8(%r14)
778         movq    %rdx,%rdi
779
780         mulq    %rbx
781         addq    %rax,%r11
782         movq    8(%rcx),%rax
783         adcq    $0,%rdx
784         movq    %rdx,%r10
785
786         mulq    %rbp
787         addq    %rax,%rdi
788         movq    16(%rsi,%r15,1),%rax
789         adcq    $0,%rdx
790         addq    %r11,%rdi
791         leaq    32(%rcx),%rcx
792         adcq    $0,%rdx
793         movq    %rdi,(%r14)
794         movq    %rdx,%r13
795
796         addq    $32,%r15
797         jnz     .L1st4x
798
799         mulq    %rbx
800         addq    %rax,%r10
801         movq    -16(%rcx),%rax
802         leaq    32(%r14),%r14
803         adcq    $0,%rdx
804         movq    %rdx,%r11
805
806         mulq    %rbp
807         addq    %rax,%r13
808         movq    -8(%rsi),%rax
809         adcq    $0,%rdx
810         addq    %r10,%r13
811         adcq    $0,%rdx
812         movq    %r13,-24(%r14)
813         movq    %rdx,%rdi
814
815         mulq    %rbx
816         addq    %rax,%r11
817         movq    -8(%rcx),%rax
818         adcq    $0,%rdx
819         movq    %rdx,%r10
820
821         mulq    %rbp
822         addq    %rax,%rdi
823         movq    (%rsi,%r9,1),%rax
824         adcq    $0,%rdx
825         addq    %r11,%rdi
826         adcq    $0,%rdx
827         movq    %rdi,-16(%r14)
828         movq    %rdx,%r13
829
830         leaq    (%rcx,%r9,1),%rcx
831
832         xorq    %rdi,%rdi
833         addq    %r10,%r13
834         adcq    $0,%rdi
835         movq    %r13,-8(%r14)
836
837         jmp     .Louter4x
838
839 .align  32
840 .Louter4x:
841         leaq    16+128(%r14),%rdx
842         pxor    %xmm4,%xmm4
843         pxor    %xmm5,%xmm5
844         movdqa  -128(%r12),%xmm0
845         movdqa  -112(%r12),%xmm1
846         movdqa  -96(%r12),%xmm2
847         movdqa  -80(%r12),%xmm3
848         pand    -128(%rdx),%xmm0
849         pand    -112(%rdx),%xmm1
850         por     %xmm0,%xmm4
851         pand    -96(%rdx),%xmm2
852         por     %xmm1,%xmm5
853         pand    -80(%rdx),%xmm3
854         por     %xmm2,%xmm4
855         por     %xmm3,%xmm5
856         movdqa  -64(%r12),%xmm0
857         movdqa  -48(%r12),%xmm1
858         movdqa  -32(%r12),%xmm2
859         movdqa  -16(%r12),%xmm3
860         pand    -64(%rdx),%xmm0
861         pand    -48(%rdx),%xmm1
862         por     %xmm0,%xmm4
863         pand    -32(%rdx),%xmm2
864         por     %xmm1,%xmm5
865         pand    -16(%rdx),%xmm3
866         por     %xmm2,%xmm4
867         por     %xmm3,%xmm5
868         movdqa  0(%r12),%xmm0
869         movdqa  16(%r12),%xmm1
870         movdqa  32(%r12),%xmm2
871         movdqa  48(%r12),%xmm3
872         pand    0(%rdx),%xmm0
873         pand    16(%rdx),%xmm1
874         por     %xmm0,%xmm4
875         pand    32(%rdx),%xmm2
876         por     %xmm1,%xmm5
877         pand    48(%rdx),%xmm3
878         por     %xmm2,%xmm4
879         por     %xmm3,%xmm5
880         movdqa  64(%r12),%xmm0
881         movdqa  80(%r12),%xmm1
882         movdqa  96(%r12),%xmm2
883         movdqa  112(%r12),%xmm3
884         pand    64(%rdx),%xmm0
885         pand    80(%rdx),%xmm1
886         por     %xmm0,%xmm4
887         pand    96(%rdx),%xmm2
888         por     %xmm1,%xmm5
889         pand    112(%rdx),%xmm3
890         por     %xmm2,%xmm4
891         por     %xmm3,%xmm5
892         por     %xmm5,%xmm4
893         pshufd  $0x4e,%xmm4,%xmm0
894         por     %xmm4,%xmm0
895         leaq    256(%r12),%r12
896 .byte   102,72,15,126,195
897
898         movq    (%r14,%r9,1),%r10
899         movq    %r8,%rbp
900         mulq    %rbx
901         addq    %rax,%r10
902         movq    (%rcx),%rax
903         adcq    $0,%rdx
904
905         imulq   %r10,%rbp
906         movq    %rdx,%r11
907         movq    %rdi,(%r14)
908
909         leaq    (%r14,%r9,1),%r14
910
911         mulq    %rbp
912         addq    %rax,%r10
913         movq    8(%rsi,%r9,1),%rax
914         adcq    $0,%rdx
915         movq    %rdx,%rdi
916
917         mulq    %rbx
918         addq    %rax,%r11
919         movq    8(%rcx),%rax
920         adcq    $0,%rdx
921         addq    8(%r14),%r11
922         adcq    $0,%rdx
923         movq    %rdx,%r10
924
925         mulq    %rbp
926         addq    %rax,%rdi
927         movq    16(%rsi,%r9,1),%rax
928         adcq    $0,%rdx
929         addq    %r11,%rdi
930         leaq    32(%r9),%r15
931         leaq    32(%rcx),%rcx
932         adcq    $0,%rdx
933         movq    %rdx,%r13
934         jmp     .Linner4x
935
936 .align  32
937 .Linner4x:
938         mulq    %rbx
939         addq    %rax,%r10
940         movq    -16(%rcx),%rax
941         adcq    $0,%rdx
942         addq    16(%r14),%r10
943         leaq    32(%r14),%r14
944         adcq    $0,%rdx
945         movq    %rdx,%r11
946
947         mulq    %rbp
948         addq    %rax,%r13
949         movq    -8(%rsi,%r15,1),%rax
950         adcq    $0,%rdx
951         addq    %r10,%r13
952         adcq    $0,%rdx
953         movq    %rdi,-32(%r14)
954         movq    %rdx,%rdi
955
956         mulq    %rbx
957         addq    %rax,%r11
958         movq    -8(%rcx),%rax
959         adcq    $0,%rdx
960         addq    -8(%r14),%r11
961         adcq    $0,%rdx
962         movq    %rdx,%r10
963
964         mulq    %rbp
965         addq    %rax,%rdi
966         movq    (%rsi,%r15,1),%rax
967         adcq    $0,%rdx
968         addq    %r11,%rdi
969         adcq    $0,%rdx
970         movq    %r13,-24(%r14)
971         movq    %rdx,%r13
972
973         mulq    %rbx
974         addq    %rax,%r10
975         movq    0(%rcx),%rax
976         adcq    $0,%rdx
977         addq    (%r14),%r10
978         adcq    $0,%rdx
979         movq    %rdx,%r11
980
981         mulq    %rbp
982         addq    %rax,%r13
983         movq    8(%rsi,%r15,1),%rax
984         adcq    $0,%rdx
985         addq    %r10,%r13
986         adcq    $0,%rdx
987         movq    %rdi,-16(%r14)
988         movq    %rdx,%rdi
989
990         mulq    %rbx
991         addq    %rax,%r11
992         movq    8(%rcx),%rax
993         adcq    $0,%rdx
994         addq    8(%r14),%r11
995         adcq    $0,%rdx
996         movq    %rdx,%r10
997
998         mulq    %rbp
999         addq    %rax,%rdi
1000         movq    16(%rsi,%r15,1),%rax
1001         adcq    $0,%rdx
1002         addq    %r11,%rdi
1003         leaq    32(%rcx),%rcx
1004         adcq    $0,%rdx
1005         movq    %r13,-8(%r14)
1006         movq    %rdx,%r13
1007
1008         addq    $32,%r15
1009         jnz     .Linner4x
1010
1011         mulq    %rbx
1012         addq    %rax,%r10
1013         movq    -16(%rcx),%rax
1014         adcq    $0,%rdx
1015         addq    16(%r14),%r10
1016         leaq    32(%r14),%r14
1017         adcq    $0,%rdx
1018         movq    %rdx,%r11
1019
1020         mulq    %rbp
1021         addq    %rax,%r13
1022         movq    -8(%rsi),%rax
1023         adcq    $0,%rdx
1024         addq    %r10,%r13
1025         adcq    $0,%rdx
1026         movq    %rdi,-32(%r14)
1027         movq    %rdx,%rdi
1028
1029         mulq    %rbx
1030         addq    %rax,%r11
1031         movq    %rbp,%rax
1032         movq    -8(%rcx),%rbp
1033         adcq    $0,%rdx
1034         addq    -8(%r14),%r11
1035         adcq    $0,%rdx
1036         movq    %rdx,%r10
1037
1038         mulq    %rbp
1039         addq    %rax,%rdi
1040         movq    (%rsi,%r9,1),%rax
1041         adcq    $0,%rdx
1042         addq    %r11,%rdi
1043         adcq    $0,%rdx
1044         movq    %r13,-24(%r14)
1045         movq    %rdx,%r13
1046
1047         movq    %rdi,-16(%r14)
1048         leaq    (%rcx,%r9,1),%rcx
1049
1050         xorq    %rdi,%rdi
1051         addq    %r10,%r13
1052         adcq    $0,%rdi
1053         addq    (%r14),%r13
1054         adcq    $0,%rdi
1055         movq    %r13,-8(%r14)
1056
1057         cmpq    16+8(%rsp),%r12
1058         jb      .Louter4x
1059         xorq    %rax,%rax
1060         subq    %r13,%rbp
1061         adcq    %r15,%r15
1062         orq     %r15,%rdi
1063         subq    %rdi,%rax
1064         leaq    (%r14,%r9,1),%rbx
1065         movq    (%rcx),%r12
1066         leaq    (%rcx),%rbp
1067         movq    %r9,%rcx
1068         sarq    $3+2,%rcx
1069         movq    56+8(%rsp),%rdi
1070         decq    %r12
1071         xorq    %r10,%r10
1072         movq    8(%rbp),%r13
1073         movq    16(%rbp),%r14
1074         movq    24(%rbp),%r15
1075         jmp     .Lsqr4x_sub_entry
1076 .size   mul4x_internal,.-mul4x_internal
1077 .globl  bn_power5
1078 .type   bn_power5,@function
1079 .align  32
1080 bn_power5:
1081 .cfi_startproc  
1082         movq    %rsp,%rax
1083 .cfi_def_cfa_register   %rax
1084         movl    OPENSSL_ia32cap_P+8(%rip),%r11d
1085         andl    $0x80108,%r11d
1086         cmpl    $0x80108,%r11d
1087         je      .Lpowerx5_enter
1088         pushq   %rbx
1089 .cfi_offset     %rbx,-16
1090         pushq   %rbp
1091 .cfi_offset     %rbp,-24
1092         pushq   %r12
1093 .cfi_offset     %r12,-32
1094         pushq   %r13
1095 .cfi_offset     %r13,-40
1096         pushq   %r14
1097 .cfi_offset     %r14,-48
1098         pushq   %r15
1099 .cfi_offset     %r15,-56
1100 .Lpower5_prologue:
1101
1102         shll    $3,%r9d
1103         leal    (%r9,%r9,2),%r10d
1104         negq    %r9
1105         movq    (%r8),%r8
1106
1107
1108
1109
1110
1111
1112
1113
1114         leaq    -320(%rsp,%r9,2),%r11
1115         movq    %rsp,%rbp
1116         subq    %rdi,%r11
1117         andq    $4095,%r11
1118         cmpq    %r11,%r10
1119         jb      .Lpwr_sp_alt
1120         subq    %r11,%rbp
1121         leaq    -320(%rbp,%r9,2),%rbp
1122         jmp     .Lpwr_sp_done
1123
1124 .align  32
1125 .Lpwr_sp_alt:
1126         leaq    4096-320(,%r9,2),%r10
1127         leaq    -320(%rbp,%r9,2),%rbp
1128         subq    %r10,%r11
1129         movq    $0,%r10
1130         cmovcq  %r10,%r11
1131         subq    %r11,%rbp
1132 .Lpwr_sp_done:
1133         andq    $-64,%rbp
1134         movq    %rsp,%r11
1135         subq    %rbp,%r11
1136         andq    $-4096,%r11
1137         leaq    (%r11,%rbp,1),%rsp
1138         movq    (%rsp),%r10
1139         cmpq    %rbp,%rsp
1140         ja      .Lpwr_page_walk
1141         jmp     .Lpwr_page_walk_done
1142
1143 .Lpwr_page_walk:
1144         leaq    -4096(%rsp),%rsp
1145         movq    (%rsp),%r10
1146         cmpq    %rbp,%rsp
1147         ja      .Lpwr_page_walk
1148 .Lpwr_page_walk_done:
1149
1150         movq    %r9,%r10
1151         negq    %r9
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162         movq    %r8,32(%rsp)
1163         movq    %rax,40(%rsp)
1164 .cfi_escape     0x0f,0x05,0x77,0x28,0x06,0x23,0x08
1165 .Lpower5_body:
1166 .byte   102,72,15,110,207
1167 .byte   102,72,15,110,209
1168 .byte   102,73,15,110,218
1169 .byte   102,72,15,110,226
1170
1171         call    __bn_sqr8x_internal
1172         call    __bn_post4x_internal
1173         call    __bn_sqr8x_internal
1174         call    __bn_post4x_internal
1175         call    __bn_sqr8x_internal
1176         call    __bn_post4x_internal
1177         call    __bn_sqr8x_internal
1178         call    __bn_post4x_internal
1179         call    __bn_sqr8x_internal
1180         call    __bn_post4x_internal
1181
1182 .byte   102,72,15,126,209
1183 .byte   102,72,15,126,226
1184         movq    %rsi,%rdi
1185         movq    40(%rsp),%rax
1186         leaq    32(%rsp),%r8
1187
1188         call    mul4x_internal
1189
1190         movq    40(%rsp),%rsi
1191 .cfi_def_cfa    %rsi,8
1192         movq    $1,%rax
1193         movq    -48(%rsi),%r15
1194 .cfi_restore    %r15
1195         movq    -40(%rsi),%r14
1196 .cfi_restore    %r14
1197         movq    -32(%rsi),%r13
1198 .cfi_restore    %r13
1199         movq    -24(%rsi),%r12
1200 .cfi_restore    %r12
1201         movq    -16(%rsi),%rbp
1202 .cfi_restore    %rbp
1203         movq    -8(%rsi),%rbx
1204 .cfi_restore    %rbx
1205         leaq    (%rsi),%rsp
1206 .cfi_def_cfa_register   %rsp
1207 .Lpower5_epilogue:
1208         .byte   0xf3,0xc3
1209 .cfi_endproc    
1210 .size   bn_power5,.-bn_power5
1211
1212 .globl  bn_sqr8x_internal
1213 .hidden bn_sqr8x_internal
1214 .type   bn_sqr8x_internal,@function
1215 .align  32
1216 bn_sqr8x_internal:
1217 __bn_sqr8x_internal:
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291         leaq    32(%r10),%rbp
1292         leaq    (%rsi,%r9,1),%rsi
1293
1294         movq    %r9,%rcx
1295
1296
1297         movq    -32(%rsi,%rbp,1),%r14
1298         leaq    48+8(%rsp,%r9,2),%rdi
1299         movq    -24(%rsi,%rbp,1),%rax
1300         leaq    -32(%rdi,%rbp,1),%rdi
1301         movq    -16(%rsi,%rbp,1),%rbx
1302         movq    %rax,%r15
1303
1304         mulq    %r14
1305         movq    %rax,%r10
1306         movq    %rbx,%rax
1307         movq    %rdx,%r11
1308         movq    %r10,-24(%rdi,%rbp,1)
1309
1310         mulq    %r14
1311         addq    %rax,%r11
1312         movq    %rbx,%rax
1313         adcq    $0,%rdx
1314         movq    %r11,-16(%rdi,%rbp,1)
1315         movq    %rdx,%r10
1316
1317
1318         movq    -8(%rsi,%rbp,1),%rbx
1319         mulq    %r15
1320         movq    %rax,%r12
1321         movq    %rbx,%rax
1322         movq    %rdx,%r13
1323
1324         leaq    (%rbp),%rcx
1325         mulq    %r14
1326         addq    %rax,%r10
1327         movq    %rbx,%rax
1328         movq    %rdx,%r11
1329         adcq    $0,%r11
1330         addq    %r12,%r10
1331         adcq    $0,%r11
1332         movq    %r10,-8(%rdi,%rcx,1)
1333         jmp     .Lsqr4x_1st
1334
1335 .align  32
1336 .Lsqr4x_1st:
1337         movq    (%rsi,%rcx,1),%rbx
1338         mulq    %r15
1339         addq    %rax,%r13
1340         movq    %rbx,%rax
1341         movq    %rdx,%r12
1342         adcq    $0,%r12
1343
1344         mulq    %r14
1345         addq    %rax,%r11
1346         movq    %rbx,%rax
1347         movq    8(%rsi,%rcx,1),%rbx
1348         movq    %rdx,%r10
1349         adcq    $0,%r10
1350         addq    %r13,%r11
1351         adcq    $0,%r10
1352
1353
1354         mulq    %r15
1355         addq    %rax,%r12
1356         movq    %rbx,%rax
1357         movq    %r11,(%rdi,%rcx,1)
1358         movq    %rdx,%r13
1359         adcq    $0,%r13
1360
1361         mulq    %r14
1362         addq    %rax,%r10
1363         movq    %rbx,%rax
1364         movq    16(%rsi,%rcx,1),%rbx
1365         movq    %rdx,%r11
1366         adcq    $0,%r11
1367         addq    %r12,%r10
1368         adcq    $0,%r11
1369
1370         mulq    %r15
1371         addq    %rax,%r13
1372         movq    %rbx,%rax
1373         movq    %r10,8(%rdi,%rcx,1)
1374         movq    %rdx,%r12
1375         adcq    $0,%r12
1376
1377         mulq    %r14
1378         addq    %rax,%r11
1379         movq    %rbx,%rax
1380         movq    24(%rsi,%rcx,1),%rbx
1381         movq    %rdx,%r10
1382         adcq    $0,%r10
1383         addq    %r13,%r11
1384         adcq    $0,%r10
1385
1386
1387         mulq    %r15
1388         addq    %rax,%r12
1389         movq    %rbx,%rax
1390         movq    %r11,16(%rdi,%rcx,1)
1391         movq    %rdx,%r13
1392         adcq    $0,%r13
1393         leaq    32(%rcx),%rcx
1394
1395         mulq    %r14
1396         addq    %rax,%r10
1397         movq    %rbx,%rax
1398         movq    %rdx,%r11
1399         adcq    $0,%r11
1400         addq    %r12,%r10
1401         adcq    $0,%r11
1402         movq    %r10,-8(%rdi,%rcx,1)
1403
1404         cmpq    $0,%rcx
1405         jne     .Lsqr4x_1st
1406
1407         mulq    %r15
1408         addq    %rax,%r13
1409         leaq    16(%rbp),%rbp
1410         adcq    $0,%rdx
1411         addq    %r11,%r13
1412         adcq    $0,%rdx
1413
1414         movq    %r13,(%rdi)
1415         movq    %rdx,%r12
1416         movq    %rdx,8(%rdi)
1417         jmp     .Lsqr4x_outer
1418
1419 .align  32
1420 .Lsqr4x_outer:
1421         movq    -32(%rsi,%rbp,1),%r14
1422         leaq    48+8(%rsp,%r9,2),%rdi
1423         movq    -24(%rsi,%rbp,1),%rax
1424         leaq    -32(%rdi,%rbp,1),%rdi
1425         movq    -16(%rsi,%rbp,1),%rbx
1426         movq    %rax,%r15
1427
1428         mulq    %r14
1429         movq    -24(%rdi,%rbp,1),%r10
1430         addq    %rax,%r10
1431         movq    %rbx,%rax
1432         adcq    $0,%rdx
1433         movq    %r10,-24(%rdi,%rbp,1)
1434         movq    %rdx,%r11
1435
1436         mulq    %r14
1437         addq    %rax,%r11
1438         movq    %rbx,%rax
1439         adcq    $0,%rdx
1440         addq    -16(%rdi,%rbp,1),%r11
1441         movq    %rdx,%r10
1442         adcq    $0,%r10
1443         movq    %r11,-16(%rdi,%rbp,1)
1444
1445         xorq    %r12,%r12
1446
1447         movq    -8(%rsi,%rbp,1),%rbx
1448         mulq    %r15
1449         addq    %rax,%r12
1450         movq    %rbx,%rax
1451         adcq    $0,%rdx
1452         addq    -8(%rdi,%rbp,1),%r12
1453         movq    %rdx,%r13
1454         adcq    $0,%r13
1455
1456         mulq    %r14
1457         addq    %rax,%r10
1458         movq    %rbx,%rax
1459         adcq    $0,%rdx
1460         addq    %r12,%r10
1461         movq    %rdx,%r11
1462         adcq    $0,%r11
1463         movq    %r10,-8(%rdi,%rbp,1)
1464
1465         leaq    (%rbp),%rcx
1466         jmp     .Lsqr4x_inner
1467
1468 .align  32
1469 .Lsqr4x_inner:
1470         movq    (%rsi,%rcx,1),%rbx
1471         mulq    %r15
1472         addq    %rax,%r13
1473         movq    %rbx,%rax
1474         movq    %rdx,%r12
1475         adcq    $0,%r12
1476         addq    (%rdi,%rcx,1),%r13
1477         adcq    $0,%r12
1478
1479 .byte   0x67
1480         mulq    %r14
1481         addq    %rax,%r11
1482         movq    %rbx,%rax
1483         movq    8(%rsi,%rcx,1),%rbx
1484         movq    %rdx,%r10
1485         adcq    $0,%r10
1486         addq    %r13,%r11
1487         adcq    $0,%r10
1488
1489         mulq    %r15
1490         addq    %rax,%r12
1491         movq    %r11,(%rdi,%rcx,1)
1492         movq    %rbx,%rax
1493         movq    %rdx,%r13
1494         adcq    $0,%r13
1495         addq    8(%rdi,%rcx,1),%r12
1496         leaq    16(%rcx),%rcx
1497         adcq    $0,%r13
1498
1499         mulq    %r14
1500         addq    %rax,%r10
1501         movq    %rbx,%rax
1502         adcq    $0,%rdx
1503         addq    %r12,%r10
1504         movq    %rdx,%r11
1505         adcq    $0,%r11
1506         movq    %r10,-8(%rdi,%rcx,1)
1507
1508         cmpq    $0,%rcx
1509         jne     .Lsqr4x_inner
1510
1511 .byte   0x67
1512         mulq    %r15
1513         addq    %rax,%r13
1514         adcq    $0,%rdx
1515         addq    %r11,%r13
1516         adcq    $0,%rdx
1517
1518         movq    %r13,(%rdi)
1519         movq    %rdx,%r12
1520         movq    %rdx,8(%rdi)
1521
1522         addq    $16,%rbp
1523         jnz     .Lsqr4x_outer
1524
1525
1526         movq    -32(%rsi),%r14
1527         leaq    48+8(%rsp,%r9,2),%rdi
1528         movq    -24(%rsi),%rax
1529         leaq    -32(%rdi,%rbp,1),%rdi
1530         movq    -16(%rsi),%rbx
1531         movq    %rax,%r15
1532
1533         mulq    %r14
1534         addq    %rax,%r10
1535         movq    %rbx,%rax
1536         movq    %rdx,%r11
1537         adcq    $0,%r11
1538
1539         mulq    %r14
1540         addq    %rax,%r11
1541         movq    %rbx,%rax
1542         movq    %r10,-24(%rdi)
1543         movq    %rdx,%r10
1544         adcq    $0,%r10
1545         addq    %r13,%r11
1546         movq    -8(%rsi),%rbx
1547         adcq    $0,%r10
1548
1549         mulq    %r15
1550         addq    %rax,%r12
1551         movq    %rbx,%rax
1552         movq    %r11,-16(%rdi)
1553         movq    %rdx,%r13
1554         adcq    $0,%r13
1555
1556         mulq    %r14
1557         addq    %rax,%r10
1558         movq    %rbx,%rax
1559         movq    %rdx,%r11
1560         adcq    $0,%r11
1561         addq    %r12,%r10
1562         adcq    $0,%r11
1563         movq    %r10,-8(%rdi)
1564
1565         mulq    %r15
1566         addq    %rax,%r13
1567         movq    -16(%rsi),%rax
1568         adcq    $0,%rdx
1569         addq    %r11,%r13
1570         adcq    $0,%rdx
1571
1572         movq    %r13,(%rdi)
1573         movq    %rdx,%r12
1574         movq    %rdx,8(%rdi)
1575
1576         mulq    %rbx
1577         addq    $16,%rbp
1578         xorq    %r14,%r14
1579         subq    %r9,%rbp
1580         xorq    %r15,%r15
1581
1582         addq    %r12,%rax
1583         adcq    $0,%rdx
1584         movq    %rax,8(%rdi)
1585         movq    %rdx,16(%rdi)
1586         movq    %r15,24(%rdi)
1587
1588         movq    -16(%rsi,%rbp,1),%rax
1589         leaq    48+8(%rsp),%rdi
1590         xorq    %r10,%r10
1591         movq    8(%rdi),%r11
1592
1593         leaq    (%r14,%r10,2),%r12
1594         shrq    $63,%r10
1595         leaq    (%rcx,%r11,2),%r13
1596         shrq    $63,%r11
1597         orq     %r10,%r13
1598         movq    16(%rdi),%r10
1599         movq    %r11,%r14
1600         mulq    %rax
1601         negq    %r15
1602         movq    24(%rdi),%r11
1603         adcq    %rax,%r12
1604         movq    -8(%rsi,%rbp,1),%rax
1605         movq    %r12,(%rdi)
1606         adcq    %rdx,%r13
1607
1608         leaq    (%r14,%r10,2),%rbx
1609         movq    %r13,8(%rdi)
1610         sbbq    %r15,%r15
1611         shrq    $63,%r10
1612         leaq    (%rcx,%r11,2),%r8
1613         shrq    $63,%r11
1614         orq     %r10,%r8
1615         movq    32(%rdi),%r10
1616         movq    %r11,%r14
1617         mulq    %rax
1618         negq    %r15
1619         movq    40(%rdi),%r11
1620         adcq    %rax,%rbx
1621         movq    0(%rsi,%rbp,1),%rax
1622         movq    %rbx,16(%rdi)
1623         adcq    %rdx,%r8
1624         leaq    16(%rbp),%rbp
1625         movq    %r8,24(%rdi)
1626         sbbq    %r15,%r15
1627         leaq    64(%rdi),%rdi
1628         jmp     .Lsqr4x_shift_n_add
1629
1630 .align  32
1631 .Lsqr4x_shift_n_add:
1632         leaq    (%r14,%r10,2),%r12
1633         shrq    $63,%r10
1634         leaq    (%rcx,%r11,2),%r13
1635         shrq    $63,%r11
1636         orq     %r10,%r13
1637         movq    -16(%rdi),%r10
1638         movq    %r11,%r14
1639         mulq    %rax
1640         negq    %r15
1641         movq    -8(%rdi),%r11
1642         adcq    %rax,%r12
1643         movq    -8(%rsi,%rbp,1),%rax
1644         movq    %r12,-32(%rdi)
1645         adcq    %rdx,%r13
1646
1647         leaq    (%r14,%r10,2),%rbx
1648         movq    %r13,-24(%rdi)
1649         sbbq    %r15,%r15
1650         shrq    $63,%r10
1651         leaq    (%rcx,%r11,2),%r8
1652         shrq    $63,%r11
1653         orq     %r10,%r8
1654         movq    0(%rdi),%r10
1655         movq    %r11,%r14
1656         mulq    %rax
1657         negq    %r15
1658         movq    8(%rdi),%r11
1659         adcq    %rax,%rbx
1660         movq    0(%rsi,%rbp,1),%rax
1661         movq    %rbx,-16(%rdi)
1662         adcq    %rdx,%r8
1663
1664         leaq    (%r14,%r10,2),%r12
1665         movq    %r8,-8(%rdi)
1666         sbbq    %r15,%r15
1667         shrq    $63,%r10
1668         leaq    (%rcx,%r11,2),%r13
1669         shrq    $63,%r11
1670         orq     %r10,%r13
1671         movq    16(%rdi),%r10
1672         movq    %r11,%r14
1673         mulq    %rax
1674         negq    %r15
1675         movq    24(%rdi),%r11
1676         adcq    %rax,%r12
1677         movq    8(%rsi,%rbp,1),%rax
1678         movq    %r12,0(%rdi)
1679         adcq    %rdx,%r13
1680
1681         leaq    (%r14,%r10,2),%rbx
1682         movq    %r13,8(%rdi)
1683         sbbq    %r15,%r15
1684         shrq    $63,%r10
1685         leaq    (%rcx,%r11,2),%r8
1686         shrq    $63,%r11
1687         orq     %r10,%r8
1688         movq    32(%rdi),%r10
1689         movq    %r11,%r14
1690         mulq    %rax
1691         negq    %r15
1692         movq    40(%rdi),%r11
1693         adcq    %rax,%rbx
1694         movq    16(%rsi,%rbp,1),%rax
1695         movq    %rbx,16(%rdi)
1696         adcq    %rdx,%r8
1697         movq    %r8,24(%rdi)
1698         sbbq    %r15,%r15
1699         leaq    64(%rdi),%rdi
1700         addq    $32,%rbp
1701         jnz     .Lsqr4x_shift_n_add
1702
1703         leaq    (%r14,%r10,2),%r12
1704 .byte   0x67
1705         shrq    $63,%r10
1706         leaq    (%rcx,%r11,2),%r13
1707         shrq    $63,%r11
1708         orq     %r10,%r13
1709         movq    -16(%rdi),%r10
1710         movq    %r11,%r14
1711         mulq    %rax
1712         negq    %r15
1713         movq    -8(%rdi),%r11
1714         adcq    %rax,%r12
1715         movq    -8(%rsi),%rax
1716         movq    %r12,-32(%rdi)
1717         adcq    %rdx,%r13
1718
1719         leaq    (%r14,%r10,2),%rbx
1720         movq    %r13,-24(%rdi)
1721         sbbq    %r15,%r15
1722         shrq    $63,%r10
1723         leaq    (%rcx,%r11,2),%r8
1724         shrq    $63,%r11
1725         orq     %r10,%r8
1726         mulq    %rax
1727         negq    %r15
1728         adcq    %rax,%rbx
1729         adcq    %rdx,%r8
1730         movq    %rbx,-16(%rdi)
1731         movq    %r8,-8(%rdi)
1732 .byte   102,72,15,126,213
1733 __bn_sqr8x_reduction:
1734         xorq    %rax,%rax
1735         leaq    (%r9,%rbp,1),%rcx
1736         leaq    48+8(%rsp,%r9,2),%rdx
1737         movq    %rcx,0+8(%rsp)
1738         leaq    48+8(%rsp,%r9,1),%rdi
1739         movq    %rdx,8+8(%rsp)
1740         negq    %r9
1741         jmp     .L8x_reduction_loop
1742
1743 .align  32
1744 .L8x_reduction_loop:
1745         leaq    (%rdi,%r9,1),%rdi
1746 .byte   0x66
1747         movq    0(%rdi),%rbx
1748         movq    8(%rdi),%r9
1749         movq    16(%rdi),%r10
1750         movq    24(%rdi),%r11
1751         movq    32(%rdi),%r12
1752         movq    40(%rdi),%r13
1753         movq    48(%rdi),%r14
1754         movq    56(%rdi),%r15
1755         movq    %rax,(%rdx)
1756         leaq    64(%rdi),%rdi
1757
1758 .byte   0x67
1759         movq    %rbx,%r8
1760         imulq   32+8(%rsp),%rbx
1761         movq    0(%rbp),%rax
1762         movl    $8,%ecx
1763         jmp     .L8x_reduce
1764
1765 .align  32
1766 .L8x_reduce:
1767         mulq    %rbx
1768         movq    8(%rbp),%rax
1769         negq    %r8
1770         movq    %rdx,%r8
1771         adcq    $0,%r8
1772
1773         mulq    %rbx
1774         addq    %rax,%r9
1775         movq    16(%rbp),%rax
1776         adcq    $0,%rdx
1777         addq    %r9,%r8
1778         movq    %rbx,48-8+8(%rsp,%rcx,8)
1779         movq    %rdx,%r9
1780         adcq    $0,%r9
1781
1782         mulq    %rbx
1783         addq    %rax,%r10
1784         movq    24(%rbp),%rax
1785         adcq    $0,%rdx
1786         addq    %r10,%r9
1787         movq    32+8(%rsp),%rsi
1788         movq    %rdx,%r10
1789         adcq    $0,%r10
1790
1791         mulq    %rbx
1792         addq    %rax,%r11
1793         movq    32(%rbp),%rax
1794         adcq    $0,%rdx
1795         imulq   %r8,%rsi
1796         addq    %r11,%r10
1797         movq    %rdx,%r11
1798         adcq    $0,%r11
1799
1800         mulq    %rbx
1801         addq    %rax,%r12
1802         movq    40(%rbp),%rax
1803         adcq    $0,%rdx
1804         addq    %r12,%r11
1805         movq    %rdx,%r12
1806         adcq    $0,%r12
1807
1808         mulq    %rbx
1809         addq    %rax,%r13
1810         movq    48(%rbp),%rax
1811         adcq    $0,%rdx
1812         addq    %r13,%r12
1813         movq    %rdx,%r13
1814         adcq    $0,%r13
1815
1816         mulq    %rbx
1817         addq    %rax,%r14
1818         movq    56(%rbp),%rax
1819         adcq    $0,%rdx
1820         addq    %r14,%r13
1821         movq    %rdx,%r14
1822         adcq    $0,%r14
1823
1824         mulq    %rbx
1825         movq    %rsi,%rbx
1826         addq    %rax,%r15
1827         movq    0(%rbp),%rax
1828         adcq    $0,%rdx
1829         addq    %r15,%r14
1830         movq    %rdx,%r15
1831         adcq    $0,%r15
1832
1833         decl    %ecx
1834         jnz     .L8x_reduce
1835
1836         leaq    64(%rbp),%rbp
1837         xorq    %rax,%rax
1838         movq    8+8(%rsp),%rdx
1839         cmpq    0+8(%rsp),%rbp
1840         jae     .L8x_no_tail
1841
1842 .byte   0x66
1843         addq    0(%rdi),%r8
1844         adcq    8(%rdi),%r9
1845         adcq    16(%rdi),%r10
1846         adcq    24(%rdi),%r11
1847         adcq    32(%rdi),%r12
1848         adcq    40(%rdi),%r13
1849         adcq    48(%rdi),%r14
1850         adcq    56(%rdi),%r15
1851         sbbq    %rsi,%rsi
1852
1853         movq    48+56+8(%rsp),%rbx
1854         movl    $8,%ecx
1855         movq    0(%rbp),%rax
1856         jmp     .L8x_tail
1857
1858 .align  32
1859 .L8x_tail:
1860         mulq    %rbx
1861         addq    %rax,%r8
1862         movq    8(%rbp),%rax
1863         movq    %r8,(%rdi)
1864         movq    %rdx,%r8
1865         adcq    $0,%r8
1866
1867         mulq    %rbx
1868         addq    %rax,%r9
1869         movq    16(%rbp),%rax
1870         adcq    $0,%rdx
1871         addq    %r9,%r8
1872         leaq    8(%rdi),%rdi
1873         movq    %rdx,%r9
1874         adcq    $0,%r9
1875
1876         mulq    %rbx
1877         addq    %rax,%r10
1878         movq    24(%rbp),%rax
1879         adcq    $0,%rdx
1880         addq    %r10,%r9
1881         movq    %rdx,%r10
1882         adcq    $0,%r10
1883
1884         mulq    %rbx
1885         addq    %rax,%r11
1886         movq    32(%rbp),%rax
1887         adcq    $0,%rdx
1888         addq    %r11,%r10
1889         movq    %rdx,%r11
1890         adcq    $0,%r11
1891
1892         mulq    %rbx
1893         addq    %rax,%r12
1894         movq    40(%rbp),%rax
1895         adcq    $0,%rdx
1896         addq    %r12,%r11
1897         movq    %rdx,%r12
1898         adcq    $0,%r12
1899
1900         mulq    %rbx
1901         addq    %rax,%r13
1902         movq    48(%rbp),%rax
1903         adcq    $0,%rdx
1904         addq    %r13,%r12
1905         movq    %rdx,%r13
1906         adcq    $0,%r13
1907
1908         mulq    %rbx
1909         addq    %rax,%r14
1910         movq    56(%rbp),%rax
1911         adcq    $0,%rdx
1912         addq    %r14,%r13
1913         movq    %rdx,%r14
1914         adcq    $0,%r14
1915
1916         mulq    %rbx
1917         movq    48-16+8(%rsp,%rcx,8),%rbx
1918         addq    %rax,%r15
1919         adcq    $0,%rdx
1920         addq    %r15,%r14
1921         movq    0(%rbp),%rax
1922         movq    %rdx,%r15
1923         adcq    $0,%r15
1924
1925         decl    %ecx
1926         jnz     .L8x_tail
1927
1928         leaq    64(%rbp),%rbp
1929         movq    8+8(%rsp),%rdx
1930         cmpq    0+8(%rsp),%rbp
1931         jae     .L8x_tail_done
1932
1933         movq    48+56+8(%rsp),%rbx
1934         negq    %rsi
1935         movq    0(%rbp),%rax
1936         adcq    0(%rdi),%r8
1937         adcq    8(%rdi),%r9
1938         adcq    16(%rdi),%r10
1939         adcq    24(%rdi),%r11
1940         adcq    32(%rdi),%r12
1941         adcq    40(%rdi),%r13
1942         adcq    48(%rdi),%r14
1943         adcq    56(%rdi),%r15
1944         sbbq    %rsi,%rsi
1945
1946         movl    $8,%ecx
1947         jmp     .L8x_tail
1948
1949 .align  32
1950 .L8x_tail_done:
1951         xorq    %rax,%rax
1952         addq    (%rdx),%r8
1953         adcq    $0,%r9
1954         adcq    $0,%r10
1955         adcq    $0,%r11
1956         adcq    $0,%r12
1957         adcq    $0,%r13
1958         adcq    $0,%r14
1959         adcq    $0,%r15
1960         adcq    $0,%rax
1961
1962         negq    %rsi
1963 .L8x_no_tail:
1964         adcq    0(%rdi),%r8
1965         adcq    8(%rdi),%r9
1966         adcq    16(%rdi),%r10
1967         adcq    24(%rdi),%r11
1968         adcq    32(%rdi),%r12
1969         adcq    40(%rdi),%r13
1970         adcq    48(%rdi),%r14
1971         adcq    56(%rdi),%r15
1972         adcq    $0,%rax
1973         movq    -8(%rbp),%rcx
1974         xorq    %rsi,%rsi
1975
1976 .byte   102,72,15,126,213
1977
1978         movq    %r8,0(%rdi)
1979         movq    %r9,8(%rdi)
1980 .byte   102,73,15,126,217
1981         movq    %r10,16(%rdi)
1982         movq    %r11,24(%rdi)
1983         movq    %r12,32(%rdi)
1984         movq    %r13,40(%rdi)
1985         movq    %r14,48(%rdi)
1986         movq    %r15,56(%rdi)
1987         leaq    64(%rdi),%rdi
1988
1989         cmpq    %rdx,%rdi
1990         jb      .L8x_reduction_loop
1991         .byte   0xf3,0xc3
1992 .size   bn_sqr8x_internal,.-bn_sqr8x_internal
1993 .type   __bn_post4x_internal,@function
1994 .align  32
1995 __bn_post4x_internal:
1996         movq    0(%rbp),%r12
1997         leaq    (%rdi,%r9,1),%rbx
1998         movq    %r9,%rcx
1999 .byte   102,72,15,126,207
2000         negq    %rax
2001 .byte   102,72,15,126,206
2002         sarq    $3+2,%rcx
2003         decq    %r12
2004         xorq    %r10,%r10
2005         movq    8(%rbp),%r13
2006         movq    16(%rbp),%r14
2007         movq    24(%rbp),%r15
2008         jmp     .Lsqr4x_sub_entry
2009
2010 .align  16
2011 .Lsqr4x_sub:
2012         movq    0(%rbp),%r12
2013         movq    8(%rbp),%r13
2014         movq    16(%rbp),%r14
2015         movq    24(%rbp),%r15
2016 .Lsqr4x_sub_entry:
2017         leaq    32(%rbp),%rbp
2018         notq    %r12
2019         notq    %r13
2020         notq    %r14
2021         notq    %r15
2022         andq    %rax,%r12
2023         andq    %rax,%r13
2024         andq    %rax,%r14
2025         andq    %rax,%r15
2026
2027         negq    %r10
2028         adcq    0(%rbx),%r12
2029         adcq    8(%rbx),%r13
2030         adcq    16(%rbx),%r14
2031         adcq    24(%rbx),%r15
2032         movq    %r12,0(%rdi)
2033         leaq    32(%rbx),%rbx
2034         movq    %r13,8(%rdi)
2035         sbbq    %r10,%r10
2036         movq    %r14,16(%rdi)
2037         movq    %r15,24(%rdi)
2038         leaq    32(%rdi),%rdi
2039
2040         incq    %rcx
2041         jnz     .Lsqr4x_sub
2042
2043         movq    %r9,%r10
2044         negq    %r9
2045         .byte   0xf3,0xc3
2046 .size   __bn_post4x_internal,.-__bn_post4x_internal
2047 .globl  bn_from_montgomery
2048 .type   bn_from_montgomery,@function
2049 .align  32
2050 bn_from_montgomery:
2051         testl   $7,%r9d
2052         jz      bn_from_mont8x
2053         xorl    %eax,%eax
2054         .byte   0xf3,0xc3
2055 .size   bn_from_montgomery,.-bn_from_montgomery
2056
2057 .type   bn_from_mont8x,@function
2058 .align  32
2059 bn_from_mont8x:
2060 .cfi_startproc  
2061 .byte   0x67
2062         movq    %rsp,%rax
2063 .cfi_def_cfa_register   %rax
2064         pushq   %rbx
2065 .cfi_offset     %rbx,-16
2066         pushq   %rbp
2067 .cfi_offset     %rbp,-24
2068         pushq   %r12
2069 .cfi_offset     %r12,-32
2070         pushq   %r13
2071 .cfi_offset     %r13,-40
2072         pushq   %r14
2073 .cfi_offset     %r14,-48
2074         pushq   %r15
2075 .cfi_offset     %r15,-56
2076 .Lfrom_prologue:
2077
2078         shll    $3,%r9d
2079         leaq    (%r9,%r9,2),%r10
2080         negq    %r9
2081         movq    (%r8),%r8
2082
2083
2084
2085
2086
2087
2088
2089
2090         leaq    -320(%rsp,%r9,2),%r11
2091         movq    %rsp,%rbp
2092         subq    %rdi,%r11
2093         andq    $4095,%r11
2094         cmpq    %r11,%r10
2095         jb      .Lfrom_sp_alt
2096         subq    %r11,%rbp
2097         leaq    -320(%rbp,%r9,2),%rbp
2098         jmp     .Lfrom_sp_done
2099
2100 .align  32
2101 .Lfrom_sp_alt:
2102         leaq    4096-320(,%r9,2),%r10
2103         leaq    -320(%rbp,%r9,2),%rbp
2104         subq    %r10,%r11
2105         movq    $0,%r10
2106         cmovcq  %r10,%r11
2107         subq    %r11,%rbp
2108 .Lfrom_sp_done:
2109         andq    $-64,%rbp
2110         movq    %rsp,%r11
2111         subq    %rbp,%r11
2112         andq    $-4096,%r11
2113         leaq    (%r11,%rbp,1),%rsp
2114         movq    (%rsp),%r10
2115         cmpq    %rbp,%rsp
2116         ja      .Lfrom_page_walk
2117         jmp     .Lfrom_page_walk_done
2118
2119 .Lfrom_page_walk:
2120         leaq    -4096(%rsp),%rsp
2121         movq    (%rsp),%r10
2122         cmpq    %rbp,%rsp
2123         ja      .Lfrom_page_walk
2124 .Lfrom_page_walk_done:
2125
2126         movq    %r9,%r10
2127         negq    %r9
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138         movq    %r8,32(%rsp)
2139         movq    %rax,40(%rsp)
2140 .cfi_escape     0x0f,0x05,0x77,0x28,0x06,0x23,0x08
2141 .Lfrom_body:
2142         movq    %r9,%r11
2143         leaq    48(%rsp),%rax
2144         pxor    %xmm0,%xmm0
2145         jmp     .Lmul_by_1
2146
2147 .align  32
2148 .Lmul_by_1:
2149         movdqu  (%rsi),%xmm1
2150         movdqu  16(%rsi),%xmm2
2151         movdqu  32(%rsi),%xmm3
2152         movdqa  %xmm0,(%rax,%r9,1)
2153         movdqu  48(%rsi),%xmm4
2154         movdqa  %xmm0,16(%rax,%r9,1)
2155 .byte   0x48,0x8d,0xb6,0x40,0x00,0x00,0x00
2156         movdqa  %xmm1,(%rax)
2157         movdqa  %xmm0,32(%rax,%r9,1)
2158         movdqa  %xmm2,16(%rax)
2159         movdqa  %xmm0,48(%rax,%r9,1)
2160         movdqa  %xmm3,32(%rax)
2161         movdqa  %xmm4,48(%rax)
2162         leaq    64(%rax),%rax
2163         subq    $64,%r11
2164         jnz     .Lmul_by_1
2165
2166 .byte   102,72,15,110,207
2167 .byte   102,72,15,110,209
2168 .byte   0x67
2169         movq    %rcx,%rbp
2170 .byte   102,73,15,110,218
2171         movl    OPENSSL_ia32cap_P+8(%rip),%r11d
2172         andl    $0x80108,%r11d
2173         cmpl    $0x80108,%r11d
2174         jne     .Lfrom_mont_nox
2175
2176         leaq    (%rax,%r9,1),%rdi
2177         call    __bn_sqrx8x_reduction
2178         call    __bn_postx4x_internal
2179
2180         pxor    %xmm0,%xmm0
2181         leaq    48(%rsp),%rax
2182         jmp     .Lfrom_mont_zero
2183
2184 .align  32
2185 .Lfrom_mont_nox:
2186         call    __bn_sqr8x_reduction
2187         call    __bn_post4x_internal
2188
2189         pxor    %xmm0,%xmm0
2190         leaq    48(%rsp),%rax
2191         jmp     .Lfrom_mont_zero
2192
2193 .align  32
2194 .Lfrom_mont_zero:
2195         movq    40(%rsp),%rsi
2196 .cfi_def_cfa    %rsi,8
2197         movdqa  %xmm0,0(%rax)
2198         movdqa  %xmm0,16(%rax)
2199         movdqa  %xmm0,32(%rax)
2200         movdqa  %xmm0,48(%rax)
2201         leaq    64(%rax),%rax
2202         subq    $32,%r9
2203         jnz     .Lfrom_mont_zero
2204
2205         movq    $1,%rax
2206         movq    -48(%rsi),%r15
2207 .cfi_restore    %r15
2208         movq    -40(%rsi),%r14
2209 .cfi_restore    %r14
2210         movq    -32(%rsi),%r13
2211 .cfi_restore    %r13
2212         movq    -24(%rsi),%r12
2213 .cfi_restore    %r12
2214         movq    -16(%rsi),%rbp
2215 .cfi_restore    %rbp
2216         movq    -8(%rsi),%rbx
2217 .cfi_restore    %rbx
2218         leaq    (%rsi),%rsp
2219 .cfi_def_cfa_register   %rsp
2220 .Lfrom_epilogue:
2221         .byte   0xf3,0xc3
2222 .cfi_endproc    
2223 .size   bn_from_mont8x,.-bn_from_mont8x
2224 .type   bn_mulx4x_mont_gather5,@function
2225 .align  32
2226 bn_mulx4x_mont_gather5:
2227 .cfi_startproc  
2228         movq    %rsp,%rax
2229 .cfi_def_cfa_register   %rax
2230 .Lmulx4x_enter:
2231         pushq   %rbx
2232 .cfi_offset     %rbx,-16
2233         pushq   %rbp
2234 .cfi_offset     %rbp,-24
2235         pushq   %r12
2236 .cfi_offset     %r12,-32
2237         pushq   %r13
2238 .cfi_offset     %r13,-40
2239         pushq   %r14
2240 .cfi_offset     %r14,-48
2241         pushq   %r15
2242 .cfi_offset     %r15,-56
2243 .Lmulx4x_prologue:
2244
2245         shll    $3,%r9d
2246         leaq    (%r9,%r9,2),%r10
2247         negq    %r9
2248         movq    (%r8),%r8
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259         leaq    -320(%rsp,%r9,2),%r11
2260         movq    %rsp,%rbp
2261         subq    %rdi,%r11
2262         andq    $4095,%r11
2263         cmpq    %r11,%r10
2264         jb      .Lmulx4xsp_alt
2265         subq    %r11,%rbp
2266         leaq    -320(%rbp,%r9,2),%rbp
2267         jmp     .Lmulx4xsp_done
2268
2269 .Lmulx4xsp_alt:
2270         leaq    4096-320(,%r9,2),%r10
2271         leaq    -320(%rbp,%r9,2),%rbp
2272         subq    %r10,%r11
2273         movq    $0,%r10
2274         cmovcq  %r10,%r11
2275         subq    %r11,%rbp
2276 .Lmulx4xsp_done:
2277         andq    $-64,%rbp
2278         movq    %rsp,%r11
2279         subq    %rbp,%r11
2280         andq    $-4096,%r11
2281         leaq    (%r11,%rbp,1),%rsp
2282         movq    (%rsp),%r10
2283         cmpq    %rbp,%rsp
2284         ja      .Lmulx4x_page_walk
2285         jmp     .Lmulx4x_page_walk_done
2286
2287 .Lmulx4x_page_walk:
2288         leaq    -4096(%rsp),%rsp
2289         movq    (%rsp),%r10
2290         cmpq    %rbp,%rsp
2291         ja      .Lmulx4x_page_walk
2292 .Lmulx4x_page_walk_done:
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306         movq    %r8,32(%rsp)
2307         movq    %rax,40(%rsp)
2308 .cfi_escape     0x0f,0x05,0x77,0x28,0x06,0x23,0x08
2309 .Lmulx4x_body:
2310         call    mulx4x_internal
2311
2312         movq    40(%rsp),%rsi
2313 .cfi_def_cfa    %rsi,8
2314         movq    $1,%rax
2315
2316         movq    -48(%rsi),%r15
2317 .cfi_restore    %r15
2318         movq    -40(%rsi),%r14
2319 .cfi_restore    %r14
2320         movq    -32(%rsi),%r13
2321 .cfi_restore    %r13
2322         movq    -24(%rsi),%r12
2323 .cfi_restore    %r12
2324         movq    -16(%rsi),%rbp
2325 .cfi_restore    %rbp
2326         movq    -8(%rsi),%rbx
2327 .cfi_restore    %rbx
2328         leaq    (%rsi),%rsp
2329 .cfi_def_cfa_register   %rsp
2330 .Lmulx4x_epilogue:
2331         .byte   0xf3,0xc3
2332 .cfi_endproc    
2333 .size   bn_mulx4x_mont_gather5,.-bn_mulx4x_mont_gather5
2334
2335 .type   mulx4x_internal,@function
2336 .align  32
2337 mulx4x_internal:
2338         movq    %r9,8(%rsp)
2339         movq    %r9,%r10
2340         negq    %r9
2341         shlq    $5,%r9
2342         negq    %r10
2343         leaq    128(%rdx,%r9,1),%r13
2344         shrq    $5+5,%r9
2345         movd    8(%rax),%xmm5
2346         subq    $1,%r9
2347         leaq    .Linc(%rip),%rax
2348         movq    %r13,16+8(%rsp)
2349         movq    %r9,24+8(%rsp)
2350         movq    %rdi,56+8(%rsp)
2351         movdqa  0(%rax),%xmm0
2352         movdqa  16(%rax),%xmm1
2353         leaq    88-112(%rsp,%r10,1),%r10
2354         leaq    128(%rdx),%rdi
2355
2356         pshufd  $0,%xmm5,%xmm5
2357         movdqa  %xmm1,%xmm4
2358 .byte   0x67
2359         movdqa  %xmm1,%xmm2
2360 .byte   0x67
2361         paddd   %xmm0,%xmm1
2362         pcmpeqd %xmm5,%xmm0
2363         movdqa  %xmm4,%xmm3
2364         paddd   %xmm1,%xmm2
2365         pcmpeqd %xmm5,%xmm1
2366         movdqa  %xmm0,112(%r10)
2367         movdqa  %xmm4,%xmm0
2368
2369         paddd   %xmm2,%xmm3
2370         pcmpeqd %xmm5,%xmm2
2371         movdqa  %xmm1,128(%r10)
2372         movdqa  %xmm4,%xmm1
2373
2374         paddd   %xmm3,%xmm0
2375         pcmpeqd %xmm5,%xmm3
2376         movdqa  %xmm2,144(%r10)
2377         movdqa  %xmm4,%xmm2
2378
2379         paddd   %xmm0,%xmm1
2380         pcmpeqd %xmm5,%xmm0
2381         movdqa  %xmm3,160(%r10)
2382         movdqa  %xmm4,%xmm3
2383         paddd   %xmm1,%xmm2
2384         pcmpeqd %xmm5,%xmm1
2385         movdqa  %xmm0,176(%r10)
2386         movdqa  %xmm4,%xmm0
2387
2388         paddd   %xmm2,%xmm3
2389         pcmpeqd %xmm5,%xmm2
2390         movdqa  %xmm1,192(%r10)
2391         movdqa  %xmm4,%xmm1
2392
2393         paddd   %xmm3,%xmm0
2394         pcmpeqd %xmm5,%xmm3
2395         movdqa  %xmm2,208(%r10)
2396         movdqa  %xmm4,%xmm2
2397
2398         paddd   %xmm0,%xmm1
2399         pcmpeqd %xmm5,%xmm0
2400         movdqa  %xmm3,224(%r10)
2401         movdqa  %xmm4,%xmm3
2402         paddd   %xmm1,%xmm2
2403         pcmpeqd %xmm5,%xmm1
2404         movdqa  %xmm0,240(%r10)
2405         movdqa  %xmm4,%xmm0
2406
2407         paddd   %xmm2,%xmm3
2408         pcmpeqd %xmm5,%xmm2
2409         movdqa  %xmm1,256(%r10)
2410         movdqa  %xmm4,%xmm1
2411
2412         paddd   %xmm3,%xmm0
2413         pcmpeqd %xmm5,%xmm3
2414         movdqa  %xmm2,272(%r10)
2415         movdqa  %xmm4,%xmm2
2416
2417         paddd   %xmm0,%xmm1
2418         pcmpeqd %xmm5,%xmm0
2419         movdqa  %xmm3,288(%r10)
2420         movdqa  %xmm4,%xmm3
2421 .byte   0x67
2422         paddd   %xmm1,%xmm2
2423         pcmpeqd %xmm5,%xmm1
2424         movdqa  %xmm0,304(%r10)
2425
2426         paddd   %xmm2,%xmm3
2427         pcmpeqd %xmm5,%xmm2
2428         movdqa  %xmm1,320(%r10)
2429
2430         pcmpeqd %xmm5,%xmm3
2431         movdqa  %xmm2,336(%r10)
2432
2433         pand    64(%rdi),%xmm0
2434         pand    80(%rdi),%xmm1
2435         pand    96(%rdi),%xmm2
2436         movdqa  %xmm3,352(%r10)
2437         pand    112(%rdi),%xmm3
2438         por     %xmm2,%xmm0
2439         por     %xmm3,%xmm1
2440         movdqa  -128(%rdi),%xmm4
2441         movdqa  -112(%rdi),%xmm5
2442         movdqa  -96(%rdi),%xmm2
2443         pand    112(%r10),%xmm4
2444         movdqa  -80(%rdi),%xmm3
2445         pand    128(%r10),%xmm5
2446         por     %xmm4,%xmm0
2447         pand    144(%r10),%xmm2
2448         por     %xmm5,%xmm1
2449         pand    160(%r10),%xmm3
2450         por     %xmm2,%xmm0
2451         por     %xmm3,%xmm1
2452         movdqa  -64(%rdi),%xmm4
2453         movdqa  -48(%rdi),%xmm5
2454         movdqa  -32(%rdi),%xmm2
2455         pand    176(%r10),%xmm4
2456         movdqa  -16(%rdi),%xmm3
2457         pand    192(%r10),%xmm5
2458         por     %xmm4,%xmm0
2459         pand    208(%r10),%xmm2
2460         por     %xmm5,%xmm1
2461         pand    224(%r10),%xmm3
2462         por     %xmm2,%xmm0
2463         por     %xmm3,%xmm1
2464         movdqa  0(%rdi),%xmm4
2465         movdqa  16(%rdi),%xmm5
2466         movdqa  32(%rdi),%xmm2
2467         pand    240(%r10),%xmm4
2468         movdqa  48(%rdi),%xmm3
2469         pand    256(%r10),%xmm5
2470         por     %xmm4,%xmm0
2471         pand    272(%r10),%xmm2
2472         por     %xmm5,%xmm1
2473         pand    288(%r10),%xmm3
2474         por     %xmm2,%xmm0
2475         por     %xmm3,%xmm1
2476         pxor    %xmm1,%xmm0
2477         pshufd  $0x4e,%xmm0,%xmm1
2478         por     %xmm1,%xmm0
2479         leaq    256(%rdi),%rdi
2480 .byte   102,72,15,126,194
2481         leaq    64+32+8(%rsp),%rbx
2482
2483         movq    %rdx,%r9
2484         mulxq   0(%rsi),%r8,%rax
2485         mulxq   8(%rsi),%r11,%r12
2486         addq    %rax,%r11
2487         mulxq   16(%rsi),%rax,%r13
2488         adcq    %rax,%r12
2489         adcq    $0,%r13
2490         mulxq   24(%rsi),%rax,%r14
2491
2492         movq    %r8,%r15
2493         imulq   32+8(%rsp),%r8
2494         xorq    %rbp,%rbp
2495         movq    %r8,%rdx
2496
2497         movq    %rdi,8+8(%rsp)
2498
2499         leaq    32(%rsi),%rsi
2500         adcxq   %rax,%r13
2501         adcxq   %rbp,%r14
2502
2503         mulxq   0(%rcx),%rax,%r10
2504         adcxq   %rax,%r15
2505         adoxq   %r11,%r10
2506         mulxq   8(%rcx),%rax,%r11
2507         adcxq   %rax,%r10
2508         adoxq   %r12,%r11
2509         mulxq   16(%rcx),%rax,%r12
2510         movq    24+8(%rsp),%rdi
2511         movq    %r10,-32(%rbx)
2512         adcxq   %rax,%r11
2513         adoxq   %r13,%r12
2514         mulxq   24(%rcx),%rax,%r15
2515         movq    %r9,%rdx
2516         movq    %r11,-24(%rbx)
2517         adcxq   %rax,%r12
2518         adoxq   %rbp,%r15
2519         leaq    32(%rcx),%rcx
2520         movq    %r12,-16(%rbx)
2521         jmp     .Lmulx4x_1st
2522
2523 .align  32
2524 .Lmulx4x_1st:
2525         adcxq   %rbp,%r15
2526         mulxq   0(%rsi),%r10,%rax
2527         adcxq   %r14,%r10
2528         mulxq   8(%rsi),%r11,%r14
2529         adcxq   %rax,%r11
2530         mulxq   16(%rsi),%r12,%rax
2531         adcxq   %r14,%r12
2532         mulxq   24(%rsi),%r13,%r14
2533 .byte   0x67,0x67
2534         movq    %r8,%rdx
2535         adcxq   %rax,%r13
2536         adcxq   %rbp,%r14
2537         leaq    32(%rsi),%rsi
2538         leaq    32(%rbx),%rbx
2539
2540         adoxq   %r15,%r10
2541         mulxq   0(%rcx),%rax,%r15
2542         adcxq   %rax,%r10
2543         adoxq   %r15,%r11
2544         mulxq   8(%rcx),%rax,%r15
2545         adcxq   %rax,%r11
2546         adoxq   %r15,%r12
2547         mulxq   16(%rcx),%rax,%r15
2548         movq    %r10,-40(%rbx)
2549         adcxq   %rax,%r12
2550         movq    %r11,-32(%rbx)
2551         adoxq   %r15,%r13
2552         mulxq   24(%rcx),%rax,%r15
2553         movq    %r9,%rdx
2554         movq    %r12,-24(%rbx)
2555         adcxq   %rax,%r13
2556         adoxq   %rbp,%r15
2557         leaq    32(%rcx),%rcx
2558         movq    %r13,-16(%rbx)
2559
2560         decq    %rdi
2561         jnz     .Lmulx4x_1st
2562
2563         movq    8(%rsp),%rax
2564         adcq    %rbp,%r15
2565         leaq    (%rsi,%rax,1),%rsi
2566         addq    %r15,%r14
2567         movq    8+8(%rsp),%rdi
2568         adcq    %rbp,%rbp
2569         movq    %r14,-8(%rbx)
2570         jmp     .Lmulx4x_outer
2571
2572 .align  32
2573 .Lmulx4x_outer:
2574         leaq    16-256(%rbx),%r10
2575         pxor    %xmm4,%xmm4
2576 .byte   0x67,0x67
2577         pxor    %xmm5,%xmm5
2578         movdqa  -128(%rdi),%xmm0
2579         movdqa  -112(%rdi),%xmm1
2580         movdqa  -96(%rdi),%xmm2
2581         pand    256(%r10),%xmm0
2582         movdqa  -80(%rdi),%xmm3
2583         pand    272(%r10),%xmm1
2584         por     %xmm0,%xmm4
2585         pand    288(%r10),%xmm2
2586         por     %xmm1,%xmm5
2587         pand    304(%r10),%xmm3
2588         por     %xmm2,%xmm4
2589         por     %xmm3,%xmm5
2590         movdqa  -64(%rdi),%xmm0
2591         movdqa  -48(%rdi),%xmm1
2592         movdqa  -32(%rdi),%xmm2
2593         pand    320(%r10),%xmm0
2594         movdqa  -16(%rdi),%xmm3
2595         pand    336(%r10),%xmm1
2596         por     %xmm0,%xmm4
2597         pand    352(%r10),%xmm2
2598         por     %xmm1,%xmm5
2599         pand    368(%r10),%xmm3
2600         por     %xmm2,%xmm4
2601         por     %xmm3,%xmm5
2602         movdqa  0(%rdi),%xmm0
2603         movdqa  16(%rdi),%xmm1
2604         movdqa  32(%rdi),%xmm2
2605         pand    384(%r10),%xmm0
2606         movdqa  48(%rdi),%xmm3
2607         pand    400(%r10),%xmm1
2608         por     %xmm0,%xmm4
2609         pand    416(%r10),%xmm2
2610         por     %xmm1,%xmm5
2611         pand    432(%r10),%xmm3
2612         por     %xmm2,%xmm4
2613         por     %xmm3,%xmm5
2614         movdqa  64(%rdi),%xmm0
2615         movdqa  80(%rdi),%xmm1
2616         movdqa  96(%rdi),%xmm2
2617         pand    448(%r10),%xmm0
2618         movdqa  112(%rdi),%xmm3
2619         pand    464(%r10),%xmm1
2620         por     %xmm0,%xmm4
2621         pand    480(%r10),%xmm2
2622         por     %xmm1,%xmm5
2623         pand    496(%r10),%xmm3
2624         por     %xmm2,%xmm4
2625         por     %xmm3,%xmm5
2626         por     %xmm5,%xmm4
2627         pshufd  $0x4e,%xmm4,%xmm0
2628         por     %xmm4,%xmm0
2629         leaq    256(%rdi),%rdi
2630 .byte   102,72,15,126,194
2631
2632         movq    %rbp,(%rbx)
2633         leaq    32(%rbx,%rax,1),%rbx
2634         mulxq   0(%rsi),%r8,%r11
2635         xorq    %rbp,%rbp
2636         movq    %rdx,%r9
2637         mulxq   8(%rsi),%r14,%r12
2638         adoxq   -32(%rbx),%r8
2639         adcxq   %r14,%r11
2640         mulxq   16(%rsi),%r15,%r13
2641         adoxq   -24(%rbx),%r11
2642         adcxq   %r15,%r12
2643         mulxq   24(%rsi),%rdx,%r14
2644         adoxq   -16(%rbx),%r12
2645         adcxq   %rdx,%r13
2646         leaq    (%rcx,%rax,1),%rcx
2647         leaq    32(%rsi),%rsi
2648         adoxq   -8(%rbx),%r13
2649         adcxq   %rbp,%r14
2650         adoxq   %rbp,%r14
2651
2652         movq    %r8,%r15
2653         imulq   32+8(%rsp),%r8
2654
2655         movq    %r8,%rdx
2656         xorq    %rbp,%rbp
2657         movq    %rdi,8+8(%rsp)
2658
2659         mulxq   0(%rcx),%rax,%r10
2660         adcxq   %rax,%r15
2661         adoxq   %r11,%r10
2662         mulxq   8(%rcx),%rax,%r11
2663         adcxq   %rax,%r10
2664         adoxq   %r12,%r11
2665         mulxq   16(%rcx),%rax,%r12
2666         adcxq   %rax,%r11
2667         adoxq   %r13,%r12
2668         mulxq   24(%rcx),%rax,%r15
2669         movq    %r9,%rdx
2670         movq    24+8(%rsp),%rdi
2671         movq    %r10,-32(%rbx)
2672         adcxq   %rax,%r12
2673         movq    %r11,-24(%rbx)
2674         adoxq   %rbp,%r15
2675         movq    %r12,-16(%rbx)
2676         leaq    32(%rcx),%rcx
2677         jmp     .Lmulx4x_inner
2678
2679 .align  32
2680 .Lmulx4x_inner:
2681         mulxq   0(%rsi),%r10,%rax
2682         adcxq   %rbp,%r15
2683         adoxq   %r14,%r10
2684         mulxq   8(%rsi),%r11,%r14
2685         adcxq   0(%rbx),%r10
2686         adoxq   %rax,%r11
2687         mulxq   16(%rsi),%r12,%rax
2688         adcxq   8(%rbx),%r11
2689         adoxq   %r14,%r12
2690         mulxq   24(%rsi),%r13,%r14
2691         movq    %r8,%rdx
2692         adcxq   16(%rbx),%r12
2693         adoxq   %rax,%r13
2694         adcxq   24(%rbx),%r13
2695         adoxq   %rbp,%r14
2696         leaq    32(%rsi),%rsi
2697         leaq    32(%rbx),%rbx
2698         adcxq   %rbp,%r14
2699
2700         adoxq   %r15,%r10
2701         mulxq   0(%rcx),%rax,%r15
2702         adcxq   %rax,%r10
2703         adoxq   %r15,%r11
2704         mulxq   8(%rcx),%rax,%r15
2705         adcxq   %rax,%r11
2706         adoxq   %r15,%r12
2707         mulxq   16(%rcx),%rax,%r15
2708         movq    %r10,-40(%rbx)
2709         adcxq   %rax,%r12
2710         adoxq   %r15,%r13
2711         movq    %r11,-32(%rbx)
2712         mulxq   24(%rcx),%rax,%r15
2713         movq    %r9,%rdx
2714         leaq    32(%rcx),%rcx
2715         movq    %r12,-24(%rbx)
2716         adcxq   %rax,%r13
2717         adoxq   %rbp,%r15
2718         movq    %r13,-16(%rbx)
2719
2720         decq    %rdi
2721         jnz     .Lmulx4x_inner
2722
2723         movq    0+8(%rsp),%rax
2724         adcq    %rbp,%r15
2725         subq    0(%rbx),%rdi
2726         movq    8+8(%rsp),%rdi
2727         movq    16+8(%rsp),%r10
2728         adcq    %r15,%r14
2729         leaq    (%rsi,%rax,1),%rsi
2730         adcq    %rbp,%rbp
2731         movq    %r14,-8(%rbx)
2732
2733         cmpq    %r10,%rdi
2734         jb      .Lmulx4x_outer
2735
2736         movq    -8(%rcx),%r10
2737         movq    %rbp,%r8
2738         movq    (%rcx,%rax,1),%r12
2739         leaq    (%rcx,%rax,1),%rbp
2740         movq    %rax,%rcx
2741         leaq    (%rbx,%rax,1),%rdi
2742         xorl    %eax,%eax
2743         xorq    %r15,%r15
2744         subq    %r14,%r10
2745         adcq    %r15,%r15
2746         orq     %r15,%r8
2747         sarq    $3+2,%rcx
2748         subq    %r8,%rax
2749         movq    56+8(%rsp),%rdx
2750         decq    %r12
2751         movq    8(%rbp),%r13
2752         xorq    %r8,%r8
2753         movq    16(%rbp),%r14
2754         movq    24(%rbp),%r15
2755         jmp     .Lsqrx4x_sub_entry
2756 .size   mulx4x_internal,.-mulx4x_internal
2757 .type   bn_powerx5,@function
2758 .align  32
2759 bn_powerx5:
2760 .cfi_startproc  
2761         movq    %rsp,%rax
2762 .cfi_def_cfa_register   %rax
2763 .Lpowerx5_enter:
2764         pushq   %rbx
2765 .cfi_offset     %rbx,-16
2766         pushq   %rbp
2767 .cfi_offset     %rbp,-24
2768         pushq   %r12
2769 .cfi_offset     %r12,-32
2770         pushq   %r13
2771 .cfi_offset     %r13,-40
2772         pushq   %r14
2773 .cfi_offset     %r14,-48
2774         pushq   %r15
2775 .cfi_offset     %r15,-56
2776 .Lpowerx5_prologue:
2777
2778         shll    $3,%r9d
2779         leaq    (%r9,%r9,2),%r10
2780         negq    %r9
2781         movq    (%r8),%r8
2782
2783
2784
2785
2786
2787
2788
2789
2790         leaq    -320(%rsp,%r9,2),%r11
2791         movq    %rsp,%rbp
2792         subq    %rdi,%r11
2793         andq    $4095,%r11
2794         cmpq    %r11,%r10
2795         jb      .Lpwrx_sp_alt
2796         subq    %r11,%rbp
2797         leaq    -320(%rbp,%r9,2),%rbp
2798         jmp     .Lpwrx_sp_done
2799
2800 .align  32
2801 .Lpwrx_sp_alt:
2802         leaq    4096-320(,%r9,2),%r10
2803         leaq    -320(%rbp,%r9,2),%rbp
2804         subq    %r10,%r11
2805         movq    $0,%r10
2806         cmovcq  %r10,%r11
2807         subq    %r11,%rbp
2808 .Lpwrx_sp_done:
2809         andq    $-64,%rbp
2810         movq    %rsp,%r11
2811         subq    %rbp,%r11
2812         andq    $-4096,%r11
2813         leaq    (%r11,%rbp,1),%rsp
2814         movq    (%rsp),%r10
2815         cmpq    %rbp,%rsp
2816         ja      .Lpwrx_page_walk
2817         jmp     .Lpwrx_page_walk_done
2818
2819 .Lpwrx_page_walk:
2820         leaq    -4096(%rsp),%rsp
2821         movq    (%rsp),%r10
2822         cmpq    %rbp,%rsp
2823         ja      .Lpwrx_page_walk
2824 .Lpwrx_page_walk_done:
2825
2826         movq    %r9,%r10
2827         negq    %r9
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840         pxor    %xmm0,%xmm0
2841 .byte   102,72,15,110,207
2842 .byte   102,72,15,110,209
2843 .byte   102,73,15,110,218
2844 .byte   102,72,15,110,226
2845         movq    %r8,32(%rsp)
2846         movq    %rax,40(%rsp)
2847 .cfi_escape     0x0f,0x05,0x77,0x28,0x06,0x23,0x08
2848 .Lpowerx5_body:
2849
2850         call    __bn_sqrx8x_internal
2851         call    __bn_postx4x_internal
2852         call    __bn_sqrx8x_internal
2853         call    __bn_postx4x_internal
2854         call    __bn_sqrx8x_internal
2855         call    __bn_postx4x_internal
2856         call    __bn_sqrx8x_internal
2857         call    __bn_postx4x_internal
2858         call    __bn_sqrx8x_internal
2859         call    __bn_postx4x_internal
2860
2861         movq    %r10,%r9
2862         movq    %rsi,%rdi
2863 .byte   102,72,15,126,209
2864 .byte   102,72,15,126,226
2865         movq    40(%rsp),%rax
2866
2867         call    mulx4x_internal
2868
2869         movq    40(%rsp),%rsi
2870 .cfi_def_cfa    %rsi,8
2871         movq    $1,%rax
2872
2873         movq    -48(%rsi),%r15
2874 .cfi_restore    %r15
2875         movq    -40(%rsi),%r14
2876 .cfi_restore    %r14
2877         movq    -32(%rsi),%r13
2878 .cfi_restore    %r13
2879         movq    -24(%rsi),%r12
2880 .cfi_restore    %r12
2881         movq    -16(%rsi),%rbp
2882 .cfi_restore    %rbp
2883         movq    -8(%rsi),%rbx
2884 .cfi_restore    %rbx
2885         leaq    (%rsi),%rsp
2886 .cfi_def_cfa_register   %rsp
2887 .Lpowerx5_epilogue:
2888         .byte   0xf3,0xc3
2889 .cfi_endproc    
2890 .size   bn_powerx5,.-bn_powerx5
2891
2892 .globl  bn_sqrx8x_internal
2893 .hidden bn_sqrx8x_internal
2894 .type   bn_sqrx8x_internal,@function
2895 .align  32
2896 bn_sqrx8x_internal:
2897 __bn_sqrx8x_internal:
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938         leaq    48+8(%rsp),%rdi
2939         leaq    (%rsi,%r9,1),%rbp
2940         movq    %r9,0+8(%rsp)
2941         movq    %rbp,8+8(%rsp)
2942         jmp     .Lsqr8x_zero_start
2943
2944 .align  32
2945 .byte   0x66,0x66,0x66,0x2e,0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00
2946 .Lsqrx8x_zero:
2947 .byte   0x3e
2948         movdqa  %xmm0,0(%rdi)
2949         movdqa  %xmm0,16(%rdi)
2950         movdqa  %xmm0,32(%rdi)
2951         movdqa  %xmm0,48(%rdi)
2952 .Lsqr8x_zero_start:
2953         movdqa  %xmm0,64(%rdi)
2954         movdqa  %xmm0,80(%rdi)
2955         movdqa  %xmm0,96(%rdi)
2956         movdqa  %xmm0,112(%rdi)
2957         leaq    128(%rdi),%rdi
2958         subq    $64,%r9
2959         jnz     .Lsqrx8x_zero
2960
2961         movq    0(%rsi),%rdx
2962
2963         xorq    %r10,%r10
2964         xorq    %r11,%r11
2965         xorq    %r12,%r12
2966         xorq    %r13,%r13
2967         xorq    %r14,%r14
2968         xorq    %r15,%r15
2969         leaq    48+8(%rsp),%rdi
2970         xorq    %rbp,%rbp
2971         jmp     .Lsqrx8x_outer_loop
2972
2973 .align  32
2974 .Lsqrx8x_outer_loop:
2975         mulxq   8(%rsi),%r8,%rax
2976         adcxq   %r9,%r8
2977         adoxq   %rax,%r10
2978         mulxq   16(%rsi),%r9,%rax
2979         adcxq   %r10,%r9
2980         adoxq   %rax,%r11
2981 .byte   0xc4,0xe2,0xab,0xf6,0x86,0x18,0x00,0x00,0x00
2982         adcxq   %r11,%r10
2983         adoxq   %rax,%r12
2984 .byte   0xc4,0xe2,0xa3,0xf6,0x86,0x20,0x00,0x00,0x00
2985         adcxq   %r12,%r11
2986         adoxq   %rax,%r13
2987         mulxq   40(%rsi),%r12,%rax
2988         adcxq   %r13,%r12
2989         adoxq   %rax,%r14
2990         mulxq   48(%rsi),%r13,%rax
2991         adcxq   %r14,%r13
2992         adoxq   %r15,%rax
2993         mulxq   56(%rsi),%r14,%r15
2994         movq    8(%rsi),%rdx
2995         adcxq   %rax,%r14
2996         adoxq   %rbp,%r15
2997         adcq    64(%rdi),%r15
2998         movq    %r8,8(%rdi)
2999         movq    %r9,16(%rdi)
3000         sbbq    %rcx,%rcx
3001         xorq    %rbp,%rbp
3002
3003
3004         mulxq   16(%rsi),%r8,%rbx
3005         mulxq   24(%rsi),%r9,%rax
3006         adcxq   %r10,%r8
3007         adoxq   %rbx,%r9
3008         mulxq   32(%rsi),%r10,%rbx
3009         adcxq   %r11,%r9
3010         adoxq   %rax,%r10
3011 .byte   0xc4,0xe2,0xa3,0xf6,0x86,0x28,0x00,0x00,0x00
3012         adcxq   %r12,%r10
3013         adoxq   %rbx,%r11
3014 .byte   0xc4,0xe2,0x9b,0xf6,0x9e,0x30,0x00,0x00,0x00
3015         adcxq   %r13,%r11
3016         adoxq   %r14,%r12
3017 .byte   0xc4,0x62,0x93,0xf6,0xb6,0x38,0x00,0x00,0x00
3018         movq    16(%rsi),%rdx
3019         adcxq   %rax,%r12
3020         adoxq   %rbx,%r13
3021         adcxq   %r15,%r13
3022         adoxq   %rbp,%r14
3023         adcxq   %rbp,%r14
3024
3025         movq    %r8,24(%rdi)
3026         movq    %r9,32(%rdi)
3027
3028         mulxq   24(%rsi),%r8,%rbx
3029         mulxq   32(%rsi),%r9,%rax
3030         adcxq   %r10,%r8
3031         adoxq   %rbx,%r9
3032         mulxq   40(%rsi),%r10,%rbx
3033         adcxq   %r11,%r9
3034         adoxq   %rax,%r10
3035 .byte   0xc4,0xe2,0xa3,0xf6,0x86,0x30,0x00,0x00,0x00
3036         adcxq   %r12,%r10
3037         adoxq   %r13,%r11
3038 .byte   0xc4,0x62,0x9b,0xf6,0xae,0x38,0x00,0x00,0x00
3039 .byte   0x3e
3040         movq    24(%rsi),%rdx
3041         adcxq   %rbx,%r11
3042         adoxq   %rax,%r12
3043         adcxq   %r14,%r12
3044         movq    %r8,40(%rdi)
3045         movq    %r9,48(%rdi)
3046         mulxq   32(%rsi),%r8,%rax
3047         adoxq   %rbp,%r13
3048         adcxq   %rbp,%r13
3049
3050         mulxq   40(%rsi),%r9,%rbx
3051         adcxq   %r10,%r8
3052         adoxq   %rax,%r9
3053         mulxq   48(%rsi),%r10,%rax
3054         adcxq   %r11,%r9
3055         adoxq   %r12,%r10
3056         mulxq   56(%rsi),%r11,%r12
3057         movq    32(%rsi),%rdx
3058         movq    40(%rsi),%r14
3059         adcxq   %rbx,%r10
3060         adoxq   %rax,%r11
3061         movq    48(%rsi),%r15
3062         adcxq   %r13,%r11
3063         adoxq   %rbp,%r12
3064         adcxq   %rbp,%r12
3065
3066         movq    %r8,56(%rdi)
3067         movq    %r9,64(%rdi)
3068
3069         mulxq   %r14,%r9,%rax
3070         movq    56(%rsi),%r8
3071         adcxq   %r10,%r9
3072         mulxq   %r15,%r10,%rbx
3073         adoxq   %rax,%r10
3074         adcxq   %r11,%r10
3075         mulxq   %r8,%r11,%rax
3076         movq    %r14,%rdx
3077         adoxq   %rbx,%r11
3078         adcxq   %r12,%r11
3079
3080         adcxq   %rbp,%rax
3081
3082         mulxq   %r15,%r14,%rbx
3083         mulxq   %r8,%r12,%r13
3084         movq    %r15,%rdx
3085         leaq    64(%rsi),%rsi
3086         adcxq   %r14,%r11
3087         adoxq   %rbx,%r12
3088         adcxq   %rax,%r12
3089         adoxq   %rbp,%r13
3090
3091 .byte   0x67,0x67
3092         mulxq   %r8,%r8,%r14
3093         adcxq   %r8,%r13
3094         adcxq   %rbp,%r14
3095
3096         cmpq    8+8(%rsp),%rsi
3097         je      .Lsqrx8x_outer_break
3098
3099         negq    %rcx
3100         movq    $-8,%rcx
3101         movq    %rbp,%r15
3102         movq    64(%rdi),%r8
3103         adcxq   72(%rdi),%r9
3104         adcxq   80(%rdi),%r10
3105         adcxq   88(%rdi),%r11
3106         adcq    96(%rdi),%r12
3107         adcq    104(%rdi),%r13
3108         adcq    112(%rdi),%r14
3109         adcq    120(%rdi),%r15
3110         leaq    (%rsi),%rbp
3111         leaq    128(%rdi),%rdi
3112         sbbq    %rax,%rax
3113
3114         movq    -64(%rsi),%rdx
3115         movq    %rax,16+8(%rsp)
3116         movq    %rdi,24+8(%rsp)
3117
3118
3119         xorl    %eax,%eax
3120         jmp     .Lsqrx8x_loop
3121
3122 .align  32
3123 .Lsqrx8x_loop:
3124         movq    %r8,%rbx
3125         mulxq   0(%rbp),%rax,%r8
3126         adcxq   %rax,%rbx
3127         adoxq   %r9,%r8
3128
3129         mulxq   8(%rbp),%rax,%r9
3130         adcxq   %rax,%r8
3131         adoxq   %r10,%r9
3132
3133         mulxq   16(%rbp),%rax,%r10
3134         adcxq   %rax,%r9
3135         adoxq   %r11,%r10
3136
3137         mulxq   24(%rbp),%rax,%r11
3138         adcxq   %rax,%r10
3139         adoxq   %r12,%r11
3140
3141 .byte   0xc4,0x62,0xfb,0xf6,0xa5,0x20,0x00,0x00,0x00
3142         adcxq   %rax,%r11
3143         adoxq   %r13,%r12
3144
3145         mulxq   40(%rbp),%rax,%r13
3146         adcxq   %rax,%r12
3147         adoxq   %r14,%r13
3148
3149         mulxq   48(%rbp),%rax,%r14
3150         movq    %rbx,(%rdi,%rcx,8)
3151         movl    $0,%ebx
3152         adcxq   %rax,%r13
3153         adoxq   %r15,%r14
3154
3155 .byte   0xc4,0x62,0xfb,0xf6,0xbd,0x38,0x00,0x00,0x00
3156         movq    8(%rsi,%rcx,8),%rdx
3157         adcxq   %rax,%r14
3158         adoxq   %rbx,%r15
3159         adcxq   %rbx,%r15
3160
3161 .byte   0x67
3162         incq    %rcx
3163         jnz     .Lsqrx8x_loop
3164
3165         leaq    64(%rbp),%rbp
3166         movq    $-8,%rcx
3167         cmpq    8+8(%rsp),%rbp
3168         je      .Lsqrx8x_break
3169
3170         subq    16+8(%rsp),%rbx
3171 .byte   0x66
3172         movq    -64(%rsi),%rdx
3173         adcxq   0(%rdi),%r8
3174         adcxq   8(%rdi),%r9
3175         adcq    16(%rdi),%r10
3176         adcq    24(%rdi),%r11
3177         adcq    32(%rdi),%r12
3178         adcq    40(%rdi),%r13
3179         adcq    48(%rdi),%r14
3180         adcq    56(%rdi),%r15
3181         leaq    64(%rdi),%rdi
3182 .byte   0x67
3183         sbbq    %rax,%rax
3184         xorl    %ebx,%ebx
3185         movq    %rax,16+8(%rsp)
3186         jmp     .Lsqrx8x_loop
3187
3188 .align  32
3189 .Lsqrx8x_break:
3190         xorq    %rbp,%rbp
3191         subq    16+8(%rsp),%rbx
3192         adcxq   %rbp,%r8
3193         movq    24+8(%rsp),%rcx
3194         adcxq   %rbp,%r9
3195         movq    0(%rsi),%rdx
3196         adcq    $0,%r10
3197         movq    %r8,0(%rdi)
3198         adcq    $0,%r11
3199         adcq    $0,%r12
3200         adcq    $0,%r13
3201         adcq    $0,%r14
3202         adcq    $0,%r15
3203         cmpq    %rcx,%rdi
3204         je      .Lsqrx8x_outer_loop
3205
3206         movq    %r9,8(%rdi)
3207         movq    8(%rcx),%r9
3208         movq    %r10,16(%rdi)
3209         movq    16(%rcx),%r10
3210         movq    %r11,24(%rdi)
3211         movq    24(%rcx),%r11
3212         movq    %r12,32(%rdi)
3213         movq    32(%rcx),%r12
3214         movq    %r13,40(%rdi)
3215         movq    40(%rcx),%r13
3216         movq    %r14,48(%rdi)
3217         movq    48(%rcx),%r14
3218         movq    %r15,56(%rdi)
3219         movq    56(%rcx),%r15
3220         movq    %rcx,%rdi
3221         jmp     .Lsqrx8x_outer_loop
3222
3223 .align  32
3224 .Lsqrx8x_outer_break:
3225         movq    %r9,72(%rdi)
3226 .byte   102,72,15,126,217
3227         movq    %r10,80(%rdi)
3228         movq    %r11,88(%rdi)
3229         movq    %r12,96(%rdi)
3230         movq    %r13,104(%rdi)
3231         movq    %r14,112(%rdi)
3232         leaq    48+8(%rsp),%rdi
3233         movq    (%rsi,%rcx,1),%rdx
3234
3235         movq    8(%rdi),%r11
3236         xorq    %r10,%r10
3237         movq    0+8(%rsp),%r9
3238         adoxq   %r11,%r11
3239         movq    16(%rdi),%r12
3240         movq    24(%rdi),%r13
3241
3242
3243 .align  32
3244 .Lsqrx4x_shift_n_add:
3245         mulxq   %rdx,%rax,%rbx
3246         adoxq   %r12,%r12
3247         adcxq   %r10,%rax
3248 .byte   0x48,0x8b,0x94,0x0e,0x08,0x00,0x00,0x00
3249 .byte   0x4c,0x8b,0x97,0x20,0x00,0x00,0x00
3250         adoxq   %r13,%r13
3251         adcxq   %r11,%rbx
3252         movq    40(%rdi),%r11
3253         movq    %rax,0(%rdi)
3254         movq    %rbx,8(%rdi)
3255
3256         mulxq   %rdx,%rax,%rbx
3257         adoxq   %r10,%r10
3258         adcxq   %r12,%rax
3259         movq    16(%rsi,%rcx,1),%rdx
3260         movq    48(%rdi),%r12
3261         adoxq   %r11,%r11
3262         adcxq   %r13,%rbx
3263         movq    56(%rdi),%r13
3264         movq    %rax,16(%rdi)
3265         movq    %rbx,24(%rdi)
3266
3267         mulxq   %rdx,%rax,%rbx
3268         adoxq   %r12,%r12
3269         adcxq   %r10,%rax
3270         movq    24(%rsi,%rcx,1),%rdx
3271         leaq    32(%rcx),%rcx
3272         movq    64(%rdi),%r10
3273         adoxq   %r13,%r13
3274         adcxq   %r11,%rbx
3275         movq    72(%rdi),%r11
3276         movq    %rax,32(%rdi)
3277         movq    %rbx,40(%rdi)
3278
3279         mulxq   %rdx,%rax,%rbx
3280         adoxq   %r10,%r10
3281         adcxq   %r12,%rax
3282         jrcxz   .Lsqrx4x_shift_n_add_break
3283 .byte   0x48,0x8b,0x94,0x0e,0x00,0x00,0x00,0x00
3284         adoxq   %r11,%r11
3285         adcxq   %r13,%rbx
3286         movq    80(%rdi),%r12
3287         movq    88(%rdi),%r13
3288         movq    %rax,48(%rdi)
3289         movq    %rbx,56(%rdi)
3290         leaq    64(%rdi),%rdi
3291         nop
3292         jmp     .Lsqrx4x_shift_n_add
3293
3294 .align  32
3295 .Lsqrx4x_shift_n_add_break:
3296         adcxq   %r13,%rbx
3297         movq    %rax,48(%rdi)
3298         movq    %rbx,56(%rdi)
3299         leaq    64(%rdi),%rdi
3300 .byte   102,72,15,126,213
3301 __bn_sqrx8x_reduction:
3302         xorl    %eax,%eax
3303         movq    32+8(%rsp),%rbx
3304         movq    48+8(%rsp),%rdx
3305         leaq    -64(%rbp,%r9,1),%rcx
3306
3307         movq    %rcx,0+8(%rsp)
3308         movq    %rdi,8+8(%rsp)
3309
3310         leaq    48+8(%rsp),%rdi
3311         jmp     .Lsqrx8x_reduction_loop
3312
3313 .align  32
3314 .Lsqrx8x_reduction_loop:
3315         movq    8(%rdi),%r9
3316         movq    16(%rdi),%r10
3317         movq    24(%rdi),%r11
3318         movq    32(%rdi),%r12
3319         movq    %rdx,%r8
3320         imulq   %rbx,%rdx
3321         movq    40(%rdi),%r13
3322         movq    48(%rdi),%r14
3323         movq    56(%rdi),%r15
3324         movq    %rax,24+8(%rsp)
3325
3326         leaq    64(%rdi),%rdi
3327         xorq    %rsi,%rsi
3328         movq    $-8,%rcx
3329         jmp     .Lsqrx8x_reduce
3330
3331 .align  32
3332 .Lsqrx8x_reduce:
3333         movq    %r8,%rbx
3334         mulxq   0(%rbp),%rax,%r8
3335         adcxq   %rbx,%rax
3336         adoxq   %r9,%r8
3337
3338         mulxq   8(%rbp),%rbx,%r9
3339         adcxq   %rbx,%r8
3340         adoxq   %r10,%r9
3341
3342         mulxq   16(%rbp),%rbx,%r10
3343         adcxq   %rbx,%r9
3344         adoxq   %r11,%r10
3345
3346         mulxq   24(%rbp),%rbx,%r11
3347         adcxq   %rbx,%r10
3348         adoxq   %r12,%r11
3349
3350 .byte   0xc4,0x62,0xe3,0xf6,0xa5,0x20,0x00,0x00,0x00
3351         movq    %rdx,%rax
3352         movq    %r8,%rdx
3353         adcxq   %rbx,%r11
3354         adoxq   %r13,%r12
3355
3356         mulxq   32+8(%rsp),%rbx,%rdx
3357         movq    %rax,%rdx
3358         movq    %rax,64+48+8(%rsp,%rcx,8)
3359
3360         mulxq   40(%rbp),%rax,%r13
3361         adcxq   %rax,%r12
3362         adoxq   %r14,%r13
3363
3364         mulxq   48(%rbp),%rax,%r14
3365         adcxq   %rax,%r13
3366         adoxq   %r15,%r14
3367
3368         mulxq   56(%rbp),%rax,%r15
3369         movq    %rbx,%rdx
3370         adcxq   %rax,%r14
3371         adoxq   %rsi,%r15
3372         adcxq   %rsi,%r15
3373
3374 .byte   0x67,0x67,0x67
3375         incq    %rcx
3376         jnz     .Lsqrx8x_reduce
3377
3378         movq    %rsi,%rax
3379         cmpq    0+8(%rsp),%rbp
3380         jae     .Lsqrx8x_no_tail
3381
3382         movq    48+8(%rsp),%rdx
3383         addq    0(%rdi),%r8
3384         leaq    64(%rbp),%rbp
3385         movq    $-8,%rcx
3386         adcxq   8(%rdi),%r9
3387         adcxq   16(%rdi),%r10
3388         adcq    24(%rdi),%r11
3389         adcq    32(%rdi),%r12
3390         adcq    40(%rdi),%r13
3391         adcq    48(%rdi),%r14
3392         adcq    56(%rdi),%r15
3393         leaq    64(%rdi),%rdi
3394         sbbq    %rax,%rax
3395
3396         xorq    %rsi,%rsi
3397         movq    %rax,16+8(%rsp)
3398         jmp     .Lsqrx8x_tail
3399
3400 .align  32
3401 .Lsqrx8x_tail:
3402         movq    %r8,%rbx
3403         mulxq   0(%rbp),%rax,%r8
3404         adcxq   %rax,%rbx
3405         adoxq   %r9,%r8
3406
3407         mulxq   8(%rbp),%rax,%r9
3408         adcxq   %rax,%r8
3409         adoxq   %r10,%r9
3410
3411         mulxq   16(%rbp),%rax,%r10
3412         adcxq   %rax,%r9
3413         adoxq   %r11,%r10
3414
3415         mulxq   24(%rbp),%rax,%r11
3416         adcxq   %rax,%r10
3417         adoxq   %r12,%r11
3418
3419 .byte   0xc4,0x62,0xfb,0xf6,0xa5,0x20,0x00,0x00,0x00
3420         adcxq   %rax,%r11
3421         adoxq   %r13,%r12
3422
3423         mulxq   40(%rbp),%rax,%r13
3424         adcxq   %rax,%r12
3425         adoxq   %r14,%r13
3426
3427         mulxq   48(%rbp),%rax,%r14
3428         adcxq   %rax,%r13
3429         adoxq   %r15,%r14
3430
3431         mulxq   56(%rbp),%rax,%r15
3432         movq    72+48+8(%rsp,%rcx,8),%rdx
3433         adcxq   %rax,%r14
3434         adoxq   %rsi,%r15
3435         movq    %rbx,(%rdi,%rcx,8)
3436         movq    %r8,%rbx
3437         adcxq   %rsi,%r15
3438
3439         incq    %rcx
3440         jnz     .Lsqrx8x_tail
3441
3442         cmpq    0+8(%rsp),%rbp
3443         jae     .Lsqrx8x_tail_done
3444
3445         subq    16+8(%rsp),%rsi
3446         movq    48+8(%rsp),%rdx
3447         leaq    64(%rbp),%rbp
3448         adcq    0(%rdi),%r8
3449         adcq    8(%rdi),%r9
3450         adcq    16(%rdi),%r10
3451         adcq    24(%rdi),%r11
3452         adcq    32(%rdi),%r12
3453         adcq    40(%rdi),%r13
3454         adcq    48(%rdi),%r14
3455         adcq    56(%rdi),%r15
3456         leaq    64(%rdi),%rdi
3457         sbbq    %rax,%rax
3458         subq    $8,%rcx
3459
3460         xorq    %rsi,%rsi
3461         movq    %rax,16+8(%rsp)
3462         jmp     .Lsqrx8x_tail
3463
3464 .align  32
3465 .Lsqrx8x_tail_done:
3466         xorq    %rax,%rax
3467         addq    24+8(%rsp),%r8
3468         adcq    $0,%r9
3469         adcq    $0,%r10
3470         adcq    $0,%r11
3471         adcq    $0,%r12
3472         adcq    $0,%r13
3473         adcq    $0,%r14
3474         adcq    $0,%r15
3475         adcq    $0,%rax
3476
3477         subq    16+8(%rsp),%rsi
3478 .Lsqrx8x_no_tail:
3479         adcq    0(%rdi),%r8
3480 .byte   102,72,15,126,217
3481         adcq    8(%rdi),%r9
3482         movq    56(%rbp),%rsi
3483 .byte   102,72,15,126,213
3484         adcq    16(%rdi),%r10
3485         adcq    24(%rdi),%r11
3486         adcq    32(%rdi),%r12
3487         adcq    40(%rdi),%r13
3488         adcq    48(%rdi),%r14
3489         adcq    56(%rdi),%r15
3490         adcq    $0,%rax
3491
3492         movq    32+8(%rsp),%rbx
3493         movq    64(%rdi,%rcx,1),%rdx
3494
3495         movq    %r8,0(%rdi)
3496         leaq    64(%rdi),%r8
3497         movq    %r9,8(%rdi)
3498         movq    %r10,16(%rdi)
3499         movq    %r11,24(%rdi)
3500         movq    %r12,32(%rdi)
3501         movq    %r13,40(%rdi)
3502         movq    %r14,48(%rdi)
3503         movq    %r15,56(%rdi)
3504
3505         leaq    64(%rdi,%rcx,1),%rdi
3506         cmpq    8+8(%rsp),%r8
3507         jb      .Lsqrx8x_reduction_loop
3508         .byte   0xf3,0xc3
3509 .size   bn_sqrx8x_internal,.-bn_sqrx8x_internal
3510 .align  32
3511 __bn_postx4x_internal:
3512         movq    0(%rbp),%r12
3513         movq    %rcx,%r10
3514         movq    %rcx,%r9
3515         negq    %rax
3516         sarq    $3+2,%rcx
3517
3518 .byte   102,72,15,126,202
3519 .byte   102,72,15,126,206
3520         decq    %r12
3521         movq    8(%rbp),%r13
3522         xorq    %r8,%r8
3523         movq    16(%rbp),%r14
3524         movq    24(%rbp),%r15
3525         jmp     .Lsqrx4x_sub_entry
3526
3527 .align  16
3528 .Lsqrx4x_sub:
3529         movq    0(%rbp),%r12
3530         movq    8(%rbp),%r13
3531         movq    16(%rbp),%r14
3532         movq    24(%rbp),%r15
3533 .Lsqrx4x_sub_entry:
3534         andnq   %rax,%r12,%r12
3535         leaq    32(%rbp),%rbp
3536         andnq   %rax,%r13,%r13
3537         andnq   %rax,%r14,%r14
3538         andnq   %rax,%r15,%r15
3539
3540         negq    %r8
3541         adcq    0(%rdi),%r12
3542         adcq    8(%rdi),%r13
3543         adcq    16(%rdi),%r14
3544         adcq    24(%rdi),%r15
3545         movq    %r12,0(%rdx)
3546         leaq    32(%rdi),%rdi
3547         movq    %r13,8(%rdx)
3548         sbbq    %r8,%r8
3549         movq    %r14,16(%rdx)
3550         movq    %r15,24(%rdx)
3551         leaq    32(%rdx),%rdx
3552
3553         incq    %rcx
3554         jnz     .Lsqrx4x_sub
3555
3556         negq    %r9
3557
3558         .byte   0xf3,0xc3
3559 .size   __bn_postx4x_internal,.-__bn_postx4x_internal
3560 .globl  bn_get_bits5
3561 .type   bn_get_bits5,@function
3562 .align  16
3563 bn_get_bits5:
3564         leaq    0(%rdi),%r10
3565         leaq    1(%rdi),%r11
3566         movl    %esi,%ecx
3567         shrl    $4,%esi
3568         andl    $15,%ecx
3569         leal    -8(%rcx),%eax
3570         cmpl    $11,%ecx
3571         cmovaq  %r11,%r10
3572         cmoval  %eax,%ecx
3573         movzwl  (%r10,%rsi,2),%eax
3574         shrl    %cl,%eax
3575         andl    $31,%eax
3576         .byte   0xf3,0xc3
3577 .size   bn_get_bits5,.-bn_get_bits5
3578
3579 .globl  bn_scatter5
3580 .type   bn_scatter5,@function
3581 .align  16
3582 bn_scatter5:
3583         cmpl    $0,%esi
3584         jz      .Lscatter_epilogue
3585         leaq    (%rdx,%rcx,8),%rdx
3586 .Lscatter:
3587         movq    (%rdi),%rax
3588         leaq    8(%rdi),%rdi
3589         movq    %rax,(%rdx)
3590         leaq    256(%rdx),%rdx
3591         subl    $1,%esi
3592         jnz     .Lscatter
3593 .Lscatter_epilogue:
3594         .byte   0xf3,0xc3
3595 .size   bn_scatter5,.-bn_scatter5
3596
3597 .globl  bn_gather5
3598 .type   bn_gather5,@function
3599 .align  32
3600 bn_gather5:
3601 .LSEH_begin_bn_gather5:
3602
3603 .byte   0x4c,0x8d,0x14,0x24
3604 .byte   0x48,0x81,0xec,0x08,0x01,0x00,0x00
3605         leaq    .Linc(%rip),%rax
3606         andq    $-16,%rsp
3607
3608         movd    %ecx,%xmm5
3609         movdqa  0(%rax),%xmm0
3610         movdqa  16(%rax),%xmm1
3611         leaq    128(%rdx),%r11
3612         leaq    128(%rsp),%rax
3613
3614         pshufd  $0,%xmm5,%xmm5
3615         movdqa  %xmm1,%xmm4
3616         movdqa  %xmm1,%xmm2
3617         paddd   %xmm0,%xmm1
3618         pcmpeqd %xmm5,%xmm0
3619         movdqa  %xmm4,%xmm3
3620
3621         paddd   %xmm1,%xmm2
3622         pcmpeqd %xmm5,%xmm1
3623         movdqa  %xmm0,-128(%rax)
3624         movdqa  %xmm4,%xmm0
3625
3626         paddd   %xmm2,%xmm3
3627         pcmpeqd %xmm5,%xmm2
3628         movdqa  %xmm1,-112(%rax)
3629         movdqa  %xmm4,%xmm1
3630
3631         paddd   %xmm3,%xmm0
3632         pcmpeqd %xmm5,%xmm3
3633         movdqa  %xmm2,-96(%rax)
3634         movdqa  %xmm4,%xmm2
3635         paddd   %xmm0,%xmm1
3636         pcmpeqd %xmm5,%xmm0
3637         movdqa  %xmm3,-80(%rax)
3638         movdqa  %xmm4,%xmm3
3639
3640         paddd   %xmm1,%xmm2
3641         pcmpeqd %xmm5,%xmm1
3642         movdqa  %xmm0,-64(%rax)
3643         movdqa  %xmm4,%xmm0
3644
3645         paddd   %xmm2,%xmm3
3646         pcmpeqd %xmm5,%xmm2
3647         movdqa  %xmm1,-48(%rax)
3648         movdqa  %xmm4,%xmm1
3649
3650         paddd   %xmm3,%xmm0
3651         pcmpeqd %xmm5,%xmm3
3652         movdqa  %xmm2,-32(%rax)
3653         movdqa  %xmm4,%xmm2
3654         paddd   %xmm0,%xmm1
3655         pcmpeqd %xmm5,%xmm0
3656         movdqa  %xmm3,-16(%rax)
3657         movdqa  %xmm4,%xmm3
3658
3659         paddd   %xmm1,%xmm2
3660         pcmpeqd %xmm5,%xmm1
3661         movdqa  %xmm0,0(%rax)
3662         movdqa  %xmm4,%xmm0
3663
3664         paddd   %xmm2,%xmm3
3665         pcmpeqd %xmm5,%xmm2
3666         movdqa  %xmm1,16(%rax)
3667         movdqa  %xmm4,%xmm1
3668
3669         paddd   %xmm3,%xmm0
3670         pcmpeqd %xmm5,%xmm3
3671         movdqa  %xmm2,32(%rax)
3672         movdqa  %xmm4,%xmm2
3673         paddd   %xmm0,%xmm1
3674         pcmpeqd %xmm5,%xmm0
3675         movdqa  %xmm3,48(%rax)
3676         movdqa  %xmm4,%xmm3
3677
3678         paddd   %xmm1,%xmm2
3679         pcmpeqd %xmm5,%xmm1
3680         movdqa  %xmm0,64(%rax)
3681         movdqa  %xmm4,%xmm0
3682
3683         paddd   %xmm2,%xmm3
3684         pcmpeqd %xmm5,%xmm2
3685         movdqa  %xmm1,80(%rax)
3686         movdqa  %xmm4,%xmm1
3687
3688         paddd   %xmm3,%xmm0
3689         pcmpeqd %xmm5,%xmm3
3690         movdqa  %xmm2,96(%rax)
3691         movdqa  %xmm4,%xmm2
3692         movdqa  %xmm3,112(%rax)
3693         jmp     .Lgather
3694
3695 .align  32
3696 .Lgather:
3697         pxor    %xmm4,%xmm4
3698         pxor    %xmm5,%xmm5
3699         movdqa  -128(%r11),%xmm0
3700         movdqa  -112(%r11),%xmm1
3701         movdqa  -96(%r11),%xmm2
3702         pand    -128(%rax),%xmm0
3703         movdqa  -80(%r11),%xmm3
3704         pand    -112(%rax),%xmm1
3705         por     %xmm0,%xmm4
3706         pand    -96(%rax),%xmm2
3707         por     %xmm1,%xmm5
3708         pand    -80(%rax),%xmm3
3709         por     %xmm2,%xmm4
3710         por     %xmm3,%xmm5
3711         movdqa  -64(%r11),%xmm0
3712         movdqa  -48(%r11),%xmm1
3713         movdqa  -32(%r11),%xmm2
3714         pand    -64(%rax),%xmm0
3715         movdqa  -16(%r11),%xmm3
3716         pand    -48(%rax),%xmm1
3717         por     %xmm0,%xmm4
3718         pand    -32(%rax),%xmm2
3719         por     %xmm1,%xmm5
3720         pand    -16(%rax),%xmm3
3721         por     %xmm2,%xmm4
3722         por     %xmm3,%xmm5
3723         movdqa  0(%r11),%xmm0
3724         movdqa  16(%r11),%xmm1
3725         movdqa  32(%r11),%xmm2
3726         pand    0(%rax),%xmm0
3727         movdqa  48(%r11),%xmm3
3728         pand    16(%rax),%xmm1
3729         por     %xmm0,%xmm4
3730         pand    32(%rax),%xmm2
3731         por     %xmm1,%xmm5
3732         pand    48(%rax),%xmm3
3733         por     %xmm2,%xmm4
3734         por     %xmm3,%xmm5
3735         movdqa  64(%r11),%xmm0
3736         movdqa  80(%r11),%xmm1
3737         movdqa  96(%r11),%xmm2
3738         pand    64(%rax),%xmm0
3739         movdqa  112(%r11),%xmm3
3740         pand    80(%rax),%xmm1
3741         por     %xmm0,%xmm4
3742         pand    96(%rax),%xmm2
3743         por     %xmm1,%xmm5
3744         pand    112(%rax),%xmm3
3745         por     %xmm2,%xmm4
3746         por     %xmm3,%xmm5
3747         por     %xmm5,%xmm4
3748         leaq    256(%r11),%r11
3749         pshufd  $0x4e,%xmm4,%xmm0
3750         por     %xmm4,%xmm0
3751         movq    %xmm0,(%rdi)
3752         leaq    8(%rdi),%rdi
3753         subl    $1,%esi
3754         jnz     .Lgather
3755
3756         leaq    (%r10),%rsp
3757         .byte   0xf3,0xc3
3758 .LSEH_end_bn_gather5:
3759 .size   bn_gather5,.-bn_gather5
3760 .align  64
3761 .Linc:
3762 .long   0,0, 1,1
3763 .long   2,2, 2,2
3764 .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