Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / third_party / boringssl / win-x86_64 / crypto / bn / x86_64-mont.asm
1 OPTION  DOTNAME
2 .text$  SEGMENT ALIGN(256) 'CODE'
3
4 EXTERN  OPENSSL_ia32cap_P:NEAR
5
6 PUBLIC  bn_mul_mont
7
8 ALIGN   16
9 bn_mul_mont     PROC PUBLIC
10         mov     QWORD PTR[8+rsp],rdi    ;WIN64 prologue
11         mov     QWORD PTR[16+rsp],rsi
12         mov     rax,rsp
13 $L$SEH_begin_bn_mul_mont::
14         mov     rdi,rcx
15         mov     rsi,rdx
16         mov     rdx,r8
17         mov     rcx,r9
18         mov     r8,QWORD PTR[40+rsp]
19         mov     r9,QWORD PTR[48+rsp]
20
21
22         test    r9d,3
23         jnz     $L$mul_enter
24         cmp     r9d,8
25         jb      $L$mul_enter
26         cmp     rdx,rsi
27         jne     $L$mul4x_enter
28         test    r9d,7
29         jz      $L$sqr8x_enter
30         jmp     $L$mul4x_enter
31
32 ALIGN   16
33 $L$mul_enter::
34         push    rbx
35         push    rbp
36         push    r12
37         push    r13
38         push    r14
39         push    r15
40
41         mov     r9d,r9d
42         lea     r10,QWORD PTR[2+r9]
43         mov     r11,rsp
44         neg     r10
45         lea     rsp,QWORD PTR[r10*8+rsp]
46         and     rsp,-1024
47
48         mov     QWORD PTR[8+r9*8+rsp],r11
49 $L$mul_body::
50         mov     r12,rdx
51         mov     r8,QWORD PTR[r8]
52         mov     rbx,QWORD PTR[r12]
53         mov     rax,QWORD PTR[rsi]
54
55         xor     r14,r14
56         xor     r15,r15
57
58         mov     rbp,r8
59         mul     rbx
60         mov     r10,rax
61         mov     rax,QWORD PTR[rcx]
62
63         imul    rbp,r10
64         mov     r11,rdx
65
66         mul     rbp
67         add     r10,rax
68         mov     rax,QWORD PTR[8+rsi]
69         adc     rdx,0
70         mov     r13,rdx
71
72         lea     r15,QWORD PTR[1+r15]
73         jmp     $L$1st_enter
74
75 ALIGN   16
76 $L$1st::
77         add     r13,rax
78         mov     rax,QWORD PTR[r15*8+rsi]
79         adc     rdx,0
80         add     r13,r11
81         mov     r11,r10
82         adc     rdx,0
83         mov     QWORD PTR[((-16))+r15*8+rsp],r13
84         mov     r13,rdx
85
86 $L$1st_enter::
87         mul     rbx
88         add     r11,rax
89         mov     rax,QWORD PTR[r15*8+rcx]
90         adc     rdx,0
91         lea     r15,QWORD PTR[1+r15]
92         mov     r10,rdx
93
94         mul     rbp
95         cmp     r15,r9
96         jne     $L$1st
97
98         add     r13,rax
99         mov     rax,QWORD PTR[rsi]
100         adc     rdx,0
101         add     r13,r11
102         adc     rdx,0
103         mov     QWORD PTR[((-16))+r15*8+rsp],r13
104         mov     r13,rdx
105         mov     r11,r10
106
107         xor     rdx,rdx
108         add     r13,r11
109         adc     rdx,0
110         mov     QWORD PTR[((-8))+r9*8+rsp],r13
111         mov     QWORD PTR[r9*8+rsp],rdx
112
113         lea     r14,QWORD PTR[1+r14]
114         jmp     $L$outer
115 ALIGN   16
116 $L$outer::
117         mov     rbx,QWORD PTR[r14*8+r12]
118         xor     r15,r15
119         mov     rbp,r8
120         mov     r10,QWORD PTR[rsp]
121         mul     rbx
122         add     r10,rax
123         mov     rax,QWORD PTR[rcx]
124         adc     rdx,0
125
126         imul    rbp,r10
127         mov     r11,rdx
128
129         mul     rbp
130         add     r10,rax
131         mov     rax,QWORD PTR[8+rsi]
132         adc     rdx,0
133         mov     r10,QWORD PTR[8+rsp]
134         mov     r13,rdx
135
136         lea     r15,QWORD PTR[1+r15]
137         jmp     $L$inner_enter
138
139 ALIGN   16
140 $L$inner::
141         add     r13,rax
142         mov     rax,QWORD PTR[r15*8+rsi]
143         adc     rdx,0
144         add     r13,r10
145         mov     r10,QWORD PTR[r15*8+rsp]
146         adc     rdx,0
147         mov     QWORD PTR[((-16))+r15*8+rsp],r13
148         mov     r13,rdx
149
150 $L$inner_enter::
151         mul     rbx
152         add     r11,rax
153         mov     rax,QWORD PTR[r15*8+rcx]
154         adc     rdx,0
155         add     r10,r11
156         mov     r11,rdx
157         adc     r11,0
158         lea     r15,QWORD PTR[1+r15]
159
160         mul     rbp
161         cmp     r15,r9
162         jne     $L$inner
163
164         add     r13,rax
165         mov     rax,QWORD PTR[rsi]
166         adc     rdx,0
167         add     r13,r10
168         mov     r10,QWORD PTR[r15*8+rsp]
169         adc     rdx,0
170         mov     QWORD PTR[((-16))+r15*8+rsp],r13
171         mov     r13,rdx
172
173         xor     rdx,rdx
174         add     r13,r11
175         adc     rdx,0
176         add     r13,r10
177         adc     rdx,0
178         mov     QWORD PTR[((-8))+r9*8+rsp],r13
179         mov     QWORD PTR[r9*8+rsp],rdx
180
181         lea     r14,QWORD PTR[1+r14]
182         cmp     r14,r9
183         jb      $L$outer
184
185         xor     r14,r14
186         mov     rax,QWORD PTR[rsp]
187         lea     rsi,QWORD PTR[rsp]
188         mov     r15,r9
189         jmp     $L$sub
190 ALIGN   16
191 $L$sub::        sbb     rax,QWORD PTR[r14*8+rcx]
192         mov     QWORD PTR[r14*8+rdi],rax
193         mov     rax,QWORD PTR[8+r14*8+rsi]
194         lea     r14,QWORD PTR[1+r14]
195         dec     r15
196         jnz     $L$sub
197
198         sbb     rax,0
199         xor     r14,r14
200         mov     r15,r9
201 ALIGN   16
202 $L$copy::
203         mov     rsi,QWORD PTR[r14*8+rsp]
204         mov     rcx,QWORD PTR[r14*8+rdi]
205         xor     rsi,rcx
206         and     rsi,rax
207         xor     rsi,rcx
208         mov     QWORD PTR[r14*8+rsp],r14
209         mov     QWORD PTR[r14*8+rdi],rsi
210         lea     r14,QWORD PTR[1+r14]
211         sub     r15,1
212         jnz     $L$copy
213
214         mov     rsi,QWORD PTR[8+r9*8+rsp]
215         mov     rax,1
216         mov     r15,QWORD PTR[rsi]
217         mov     r14,QWORD PTR[8+rsi]
218         mov     r13,QWORD PTR[16+rsi]
219         mov     r12,QWORD PTR[24+rsi]
220         mov     rbp,QWORD PTR[32+rsi]
221         mov     rbx,QWORD PTR[40+rsi]
222         lea     rsp,QWORD PTR[48+rsi]
223 $L$mul_epilogue::
224         mov     rdi,QWORD PTR[8+rsp]    ;WIN64 epilogue
225         mov     rsi,QWORD PTR[16+rsp]
226         DB      0F3h,0C3h               ;repret
227 $L$SEH_end_bn_mul_mont::
228 bn_mul_mont     ENDP
229
230 ALIGN   16
231 bn_mul4x_mont   PROC PRIVATE
232         mov     QWORD PTR[8+rsp],rdi    ;WIN64 prologue
233         mov     QWORD PTR[16+rsp],rsi
234         mov     rax,rsp
235 $L$SEH_begin_bn_mul4x_mont::
236         mov     rdi,rcx
237         mov     rsi,rdx
238         mov     rdx,r8
239         mov     rcx,r9
240         mov     r8,QWORD PTR[40+rsp]
241         mov     r9,QWORD PTR[48+rsp]
242
243
244 $L$mul4x_enter::
245         push    rbx
246         push    rbp
247         push    r12
248         push    r13
249         push    r14
250         push    r15
251
252         mov     r9d,r9d
253         lea     r10,QWORD PTR[4+r9]
254         mov     r11,rsp
255         neg     r10
256         lea     rsp,QWORD PTR[r10*8+rsp]
257         and     rsp,-1024
258
259         mov     QWORD PTR[8+r9*8+rsp],r11
260 $L$mul4x_body::
261         mov     QWORD PTR[16+r9*8+rsp],rdi
262         mov     r12,rdx
263         mov     r8,QWORD PTR[r8]
264         mov     rbx,QWORD PTR[r12]
265         mov     rax,QWORD PTR[rsi]
266
267         xor     r14,r14
268         xor     r15,r15
269
270         mov     rbp,r8
271         mul     rbx
272         mov     r10,rax
273         mov     rax,QWORD PTR[rcx]
274
275         imul    rbp,r10
276         mov     r11,rdx
277
278         mul     rbp
279         add     r10,rax
280         mov     rax,QWORD PTR[8+rsi]
281         adc     rdx,0
282         mov     rdi,rdx
283
284         mul     rbx
285         add     r11,rax
286         mov     rax,QWORD PTR[8+rcx]
287         adc     rdx,0
288         mov     r10,rdx
289
290         mul     rbp
291         add     rdi,rax
292         mov     rax,QWORD PTR[16+rsi]
293         adc     rdx,0
294         add     rdi,r11
295         lea     r15,QWORD PTR[4+r15]
296         adc     rdx,0
297         mov     QWORD PTR[rsp],rdi
298         mov     r13,rdx
299         jmp     $L$1st4x
300 ALIGN   16
301 $L$1st4x::
302         mul     rbx
303         add     r10,rax
304         mov     rax,QWORD PTR[((-16))+r15*8+rcx]
305         adc     rdx,0
306         mov     r11,rdx
307
308         mul     rbp
309         add     r13,rax
310         mov     rax,QWORD PTR[((-8))+r15*8+rsi]
311         adc     rdx,0
312         add     r13,r10
313         adc     rdx,0
314         mov     QWORD PTR[((-24))+r15*8+rsp],r13
315         mov     rdi,rdx
316
317         mul     rbx
318         add     r11,rax
319         mov     rax,QWORD PTR[((-8))+r15*8+rcx]
320         adc     rdx,0
321         mov     r10,rdx
322
323         mul     rbp
324         add     rdi,rax
325         mov     rax,QWORD PTR[r15*8+rsi]
326         adc     rdx,0
327         add     rdi,r11
328         adc     rdx,0
329         mov     QWORD PTR[((-16))+r15*8+rsp],rdi
330         mov     r13,rdx
331
332         mul     rbx
333         add     r10,rax
334         mov     rax,QWORD PTR[r15*8+rcx]
335         adc     rdx,0
336         mov     r11,rdx
337
338         mul     rbp
339         add     r13,rax
340         mov     rax,QWORD PTR[8+r15*8+rsi]
341         adc     rdx,0
342         add     r13,r10
343         adc     rdx,0
344         mov     QWORD PTR[((-8))+r15*8+rsp],r13
345         mov     rdi,rdx
346
347         mul     rbx
348         add     r11,rax
349         mov     rax,QWORD PTR[8+r15*8+rcx]
350         adc     rdx,0
351         lea     r15,QWORD PTR[4+r15]
352         mov     r10,rdx
353
354         mul     rbp
355         add     rdi,rax
356         mov     rax,QWORD PTR[((-16))+r15*8+rsi]
357         adc     rdx,0
358         add     rdi,r11
359         adc     rdx,0
360         mov     QWORD PTR[((-32))+r15*8+rsp],rdi
361         mov     r13,rdx
362         cmp     r15,r9
363         jb      $L$1st4x
364
365         mul     rbx
366         add     r10,rax
367         mov     rax,QWORD PTR[((-16))+r15*8+rcx]
368         adc     rdx,0
369         mov     r11,rdx
370
371         mul     rbp
372         add     r13,rax
373         mov     rax,QWORD PTR[((-8))+r15*8+rsi]
374         adc     rdx,0
375         add     r13,r10
376         adc     rdx,0
377         mov     QWORD PTR[((-24))+r15*8+rsp],r13
378         mov     rdi,rdx
379
380         mul     rbx
381         add     r11,rax
382         mov     rax,QWORD PTR[((-8))+r15*8+rcx]
383         adc     rdx,0
384         mov     r10,rdx
385
386         mul     rbp
387         add     rdi,rax
388         mov     rax,QWORD PTR[rsi]
389         adc     rdx,0
390         add     rdi,r11
391         adc     rdx,0
392         mov     QWORD PTR[((-16))+r15*8+rsp],rdi
393         mov     r13,rdx
394
395         xor     rdi,rdi
396         add     r13,r10
397         adc     rdi,0
398         mov     QWORD PTR[((-8))+r15*8+rsp],r13
399         mov     QWORD PTR[r15*8+rsp],rdi
400
401         lea     r14,QWORD PTR[1+r14]
402 ALIGN   4
403 $L$outer4x::
404         mov     rbx,QWORD PTR[r14*8+r12]
405         xor     r15,r15
406         mov     r10,QWORD PTR[rsp]
407         mov     rbp,r8
408         mul     rbx
409         add     r10,rax
410         mov     rax,QWORD PTR[rcx]
411         adc     rdx,0
412
413         imul    rbp,r10
414         mov     r11,rdx
415
416         mul     rbp
417         add     r10,rax
418         mov     rax,QWORD PTR[8+rsi]
419         adc     rdx,0
420         mov     rdi,rdx
421
422         mul     rbx
423         add     r11,rax
424         mov     rax,QWORD PTR[8+rcx]
425         adc     rdx,0
426         add     r11,QWORD PTR[8+rsp]
427         adc     rdx,0
428         mov     r10,rdx
429
430         mul     rbp
431         add     rdi,rax
432         mov     rax,QWORD PTR[16+rsi]
433         adc     rdx,0
434         add     rdi,r11
435         lea     r15,QWORD PTR[4+r15]
436         adc     rdx,0
437         mov     QWORD PTR[rsp],rdi
438         mov     r13,rdx
439         jmp     $L$inner4x
440 ALIGN   16
441 $L$inner4x::
442         mul     rbx
443         add     r10,rax
444         mov     rax,QWORD PTR[((-16))+r15*8+rcx]
445         adc     rdx,0
446         add     r10,QWORD PTR[((-16))+r15*8+rsp]
447         adc     rdx,0
448         mov     r11,rdx
449
450         mul     rbp
451         add     r13,rax
452         mov     rax,QWORD PTR[((-8))+r15*8+rsi]
453         adc     rdx,0
454         add     r13,r10
455         adc     rdx,0
456         mov     QWORD PTR[((-24))+r15*8+rsp],r13
457         mov     rdi,rdx
458
459         mul     rbx
460         add     r11,rax
461         mov     rax,QWORD PTR[((-8))+r15*8+rcx]
462         adc     rdx,0
463         add     r11,QWORD PTR[((-8))+r15*8+rsp]
464         adc     rdx,0
465         mov     r10,rdx
466
467         mul     rbp
468         add     rdi,rax
469         mov     rax,QWORD PTR[r15*8+rsi]
470         adc     rdx,0
471         add     rdi,r11
472         adc     rdx,0
473         mov     QWORD PTR[((-16))+r15*8+rsp],rdi
474         mov     r13,rdx
475
476         mul     rbx
477         add     r10,rax
478         mov     rax,QWORD PTR[r15*8+rcx]
479         adc     rdx,0
480         add     r10,QWORD PTR[r15*8+rsp]
481         adc     rdx,0
482         mov     r11,rdx
483
484         mul     rbp
485         add     r13,rax
486         mov     rax,QWORD PTR[8+r15*8+rsi]
487         adc     rdx,0
488         add     r13,r10
489         adc     rdx,0
490         mov     QWORD PTR[((-8))+r15*8+rsp],r13
491         mov     rdi,rdx
492
493         mul     rbx
494         add     r11,rax
495         mov     rax,QWORD PTR[8+r15*8+rcx]
496         adc     rdx,0
497         add     r11,QWORD PTR[8+r15*8+rsp]
498         adc     rdx,0
499         lea     r15,QWORD PTR[4+r15]
500         mov     r10,rdx
501
502         mul     rbp
503         add     rdi,rax
504         mov     rax,QWORD PTR[((-16))+r15*8+rsi]
505         adc     rdx,0
506         add     rdi,r11
507         adc     rdx,0
508         mov     QWORD PTR[((-32))+r15*8+rsp],rdi
509         mov     r13,rdx
510         cmp     r15,r9
511         jb      $L$inner4x
512
513         mul     rbx
514         add     r10,rax
515         mov     rax,QWORD PTR[((-16))+r15*8+rcx]
516         adc     rdx,0
517         add     r10,QWORD PTR[((-16))+r15*8+rsp]
518         adc     rdx,0
519         mov     r11,rdx
520
521         mul     rbp
522         add     r13,rax
523         mov     rax,QWORD PTR[((-8))+r15*8+rsi]
524         adc     rdx,0
525         add     r13,r10
526         adc     rdx,0
527         mov     QWORD PTR[((-24))+r15*8+rsp],r13
528         mov     rdi,rdx
529
530         mul     rbx
531         add     r11,rax
532         mov     rax,QWORD PTR[((-8))+r15*8+rcx]
533         adc     rdx,0
534         add     r11,QWORD PTR[((-8))+r15*8+rsp]
535         adc     rdx,0
536         lea     r14,QWORD PTR[1+r14]
537         mov     r10,rdx
538
539         mul     rbp
540         add     rdi,rax
541         mov     rax,QWORD PTR[rsi]
542         adc     rdx,0
543         add     rdi,r11
544         adc     rdx,0
545         mov     QWORD PTR[((-16))+r15*8+rsp],rdi
546         mov     r13,rdx
547
548         xor     rdi,rdi
549         add     r13,r10
550         adc     rdi,0
551         add     r13,QWORD PTR[r9*8+rsp]
552         adc     rdi,0
553         mov     QWORD PTR[((-8))+r15*8+rsp],r13
554         mov     QWORD PTR[r15*8+rsp],rdi
555
556         cmp     r14,r9
557         jb      $L$outer4x
558         mov     rdi,QWORD PTR[16+r9*8+rsp]
559         mov     rax,QWORD PTR[rsp]
560         mov     rdx,QWORD PTR[8+rsp]
561         shr     r9,2
562         lea     rsi,QWORD PTR[rsp]
563         xor     r14,r14
564
565         sub     rax,QWORD PTR[rcx]
566         mov     rbx,QWORD PTR[16+rsi]
567         mov     rbp,QWORD PTR[24+rsi]
568         sbb     rdx,QWORD PTR[8+rcx]
569         lea     r15,QWORD PTR[((-1))+r9]
570         jmp     $L$sub4x
571 ALIGN   16
572 $L$sub4x::
573         mov     QWORD PTR[r14*8+rdi],rax
574         mov     QWORD PTR[8+r14*8+rdi],rdx
575         sbb     rbx,QWORD PTR[16+r14*8+rcx]
576         mov     rax,QWORD PTR[32+r14*8+rsi]
577         mov     rdx,QWORD PTR[40+r14*8+rsi]
578         sbb     rbp,QWORD PTR[24+r14*8+rcx]
579         mov     QWORD PTR[16+r14*8+rdi],rbx
580         mov     QWORD PTR[24+r14*8+rdi],rbp
581         sbb     rax,QWORD PTR[32+r14*8+rcx]
582         mov     rbx,QWORD PTR[48+r14*8+rsi]
583         mov     rbp,QWORD PTR[56+r14*8+rsi]
584         sbb     rdx,QWORD PTR[40+r14*8+rcx]
585         lea     r14,QWORD PTR[4+r14]
586         dec     r15
587         jnz     $L$sub4x
588
589         mov     QWORD PTR[r14*8+rdi],rax
590         mov     rax,QWORD PTR[32+r14*8+rsi]
591         sbb     rbx,QWORD PTR[16+r14*8+rcx]
592         mov     QWORD PTR[8+r14*8+rdi],rdx
593         sbb     rbp,QWORD PTR[24+r14*8+rcx]
594         mov     QWORD PTR[16+r14*8+rdi],rbx
595
596         sbb     rax,0
597 DB 66h, 48h, 0fh, 6eh, 0c0h
598         punpcklqdq      xmm0,xmm0
599         mov     QWORD PTR[24+r14*8+rdi],rbp
600         xor     r14,r14
601
602         mov     r15,r9
603         pxor    xmm5,xmm5
604         jmp     $L$copy4x
605 ALIGN   16
606 $L$copy4x::
607         movdqu  xmm2,XMMWORD PTR[r14*1+rsp]
608         movdqu  xmm4,XMMWORD PTR[16+r14*1+rsp]
609         movdqu  xmm1,XMMWORD PTR[r14*1+rdi]
610         movdqu  xmm3,XMMWORD PTR[16+r14*1+rdi]
611         pxor    xmm2,xmm1
612         pxor    xmm4,xmm3
613         pand    xmm2,xmm0
614         pand    xmm4,xmm0
615         pxor    xmm2,xmm1
616         pxor    xmm4,xmm3
617         movdqu  XMMWORD PTR[r14*1+rdi],xmm2
618         movdqu  XMMWORD PTR[16+r14*1+rdi],xmm4
619         movdqa  XMMWORD PTR[r14*1+rsp],xmm5
620         movdqa  XMMWORD PTR[16+r14*1+rsp],xmm5
621
622         lea     r14,QWORD PTR[32+r14]
623         dec     r15
624         jnz     $L$copy4x
625
626         shl     r9,2
627         mov     rsi,QWORD PTR[8+r9*8+rsp]
628         mov     rax,1
629         mov     r15,QWORD PTR[rsi]
630         mov     r14,QWORD PTR[8+rsi]
631         mov     r13,QWORD PTR[16+rsi]
632         mov     r12,QWORD PTR[24+rsi]
633         mov     rbp,QWORD PTR[32+rsi]
634         mov     rbx,QWORD PTR[40+rsi]
635         lea     rsp,QWORD PTR[48+rsi]
636 $L$mul4x_epilogue::
637         mov     rdi,QWORD PTR[8+rsp]    ;WIN64 epilogue
638         mov     rsi,QWORD PTR[16+rsp]
639         DB      0F3h,0C3h               ;repret
640 $L$SEH_end_bn_mul4x_mont::
641 bn_mul4x_mont   ENDP
642 EXTERN  bn_sqr8x_internal:NEAR
643
644
645 ALIGN   32
646 bn_sqr8x_mont   PROC PRIVATE
647         mov     QWORD PTR[8+rsp],rdi    ;WIN64 prologue
648         mov     QWORD PTR[16+rsp],rsi
649         mov     rax,rsp
650 $L$SEH_begin_bn_sqr8x_mont::
651         mov     rdi,rcx
652         mov     rsi,rdx
653         mov     rdx,r8
654         mov     rcx,r9
655         mov     r8,QWORD PTR[40+rsp]
656         mov     r9,QWORD PTR[48+rsp]
657
658
659 $L$sqr8x_enter::
660         mov     rax,rsp
661         push    rbx
662         push    rbp
663         push    r12
664         push    r13
665         push    r14
666         push    r15
667
668         mov     r10d,r9d
669         shl     r9d,3
670         shl     r10,3+2
671         neg     r9
672
673
674
675
676
677
678         lea     r11,QWORD PTR[((-64))+r9*4+rsp]
679         mov     r8,QWORD PTR[r8]
680         sub     r11,rsi
681         and     r11,4095
682         cmp     r10,r11
683         jb      $L$sqr8x_sp_alt
684         sub     rsp,r11
685         lea     rsp,QWORD PTR[((-64))+r9*4+rsp]
686         jmp     $L$sqr8x_sp_done
687
688 ALIGN   32
689 $L$sqr8x_sp_alt::
690         lea     r10,QWORD PTR[((4096-64))+r9*4]
691         lea     rsp,QWORD PTR[((-64))+r9*4+rsp]
692         sub     r11,r10
693         mov     r10,0
694         cmovc   r11,r10
695         sub     rsp,r11
696 $L$sqr8x_sp_done::
697         and     rsp,-64
698         mov     r10,r9
699         neg     r9
700
701         lea     r11,QWORD PTR[64+r9*2+rsp]
702         mov     QWORD PTR[32+rsp],r8
703         mov     QWORD PTR[40+rsp],rax
704 $L$sqr8x_body::
705
706         mov     rbp,r9
707 DB      102,73,15,110,211
708         shr     rbp,3+2
709         mov     eax,DWORD PTR[((OPENSSL_ia32cap_P+8))]
710         jmp     $L$sqr8x_copy_n
711
712 ALIGN   32
713 $L$sqr8x_copy_n::
714         movq    xmm0,QWORD PTR[rcx]
715         movq    xmm1,QWORD PTR[8+rcx]
716         movq    xmm3,QWORD PTR[16+rcx]
717         movq    xmm4,QWORD PTR[24+rcx]
718         lea     rcx,QWORD PTR[32+rcx]
719         movdqa  XMMWORD PTR[r11],xmm0
720         movdqa  XMMWORD PTR[16+r11],xmm1
721         movdqa  XMMWORD PTR[32+r11],xmm3
722         movdqa  XMMWORD PTR[48+r11],xmm4
723         lea     r11,QWORD PTR[64+r11]
724         dec     rbp
725         jnz     $L$sqr8x_copy_n
726
727         pxor    xmm0,xmm0
728 DB      102,72,15,110,207
729 DB      102,73,15,110,218
730         call    bn_sqr8x_internal
731
732         pxor    xmm0,xmm0
733         lea     rax,QWORD PTR[48+rsp]
734         lea     rdx,QWORD PTR[64+r9*2+rsp]
735         shr     r9,3+2
736         mov     rsi,QWORD PTR[40+rsp]
737         jmp     $L$sqr8x_zero
738
739 ALIGN   32
740 $L$sqr8x_zero::
741         movdqa  XMMWORD PTR[rax],xmm0
742         movdqa  XMMWORD PTR[16+rax],xmm0
743         movdqa  XMMWORD PTR[32+rax],xmm0
744         movdqa  XMMWORD PTR[48+rax],xmm0
745         lea     rax,QWORD PTR[64+rax]
746         movdqa  XMMWORD PTR[rdx],xmm0
747         movdqa  XMMWORD PTR[16+rdx],xmm0
748         movdqa  XMMWORD PTR[32+rdx],xmm0
749         movdqa  XMMWORD PTR[48+rdx],xmm0
750         lea     rdx,QWORD PTR[64+rdx]
751         dec     r9
752         jnz     $L$sqr8x_zero
753
754         mov     rax,1
755         mov     r15,QWORD PTR[((-48))+rsi]
756         mov     r14,QWORD PTR[((-40))+rsi]
757         mov     r13,QWORD PTR[((-32))+rsi]
758         mov     r12,QWORD PTR[((-24))+rsi]
759         mov     rbp,QWORD PTR[((-16))+rsi]
760         mov     rbx,QWORD PTR[((-8))+rsi]
761         lea     rsp,QWORD PTR[rsi]
762 $L$sqr8x_epilogue::
763         mov     rdi,QWORD PTR[8+rsp]    ;WIN64 epilogue
764         mov     rsi,QWORD PTR[16+rsp]
765         DB      0F3h,0C3h               ;repret
766 $L$SEH_end_bn_sqr8x_mont::
767 bn_sqr8x_mont   ENDP
768 DB      77,111,110,116,103,111,109,101,114,121,32,77,117,108,116,105
769 DB      112,108,105,99,97,116,105,111,110,32,102,111,114,32,120,56
770 DB      54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83
771 DB      32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115
772 DB      115,108,46,111,114,103,62,0
773 ALIGN   16
774 EXTERN  __imp_RtlVirtualUnwind:NEAR
775
776 ALIGN   16
777 mul_handler     PROC PRIVATE
778         push    rsi
779         push    rdi
780         push    rbx
781         push    rbp
782         push    r12
783         push    r13
784         push    r14
785         push    r15
786         pushfq
787         sub     rsp,64
788
789         mov     rax,QWORD PTR[120+r8]
790         mov     rbx,QWORD PTR[248+r8]
791
792         mov     rsi,QWORD PTR[8+r9]
793         mov     r11,QWORD PTR[56+r9]
794
795         mov     r10d,DWORD PTR[r11]
796         lea     r10,QWORD PTR[r10*1+rsi]
797         cmp     rbx,r10
798         jb      $L$common_seh_tail
799
800         mov     rax,QWORD PTR[152+r8]
801
802         mov     r10d,DWORD PTR[4+r11]
803         lea     r10,QWORD PTR[r10*1+rsi]
804         cmp     rbx,r10
805         jae     $L$common_seh_tail
806
807         mov     r10,QWORD PTR[192+r8]
808         mov     rax,QWORD PTR[8+r10*8+rax]
809         lea     rax,QWORD PTR[48+rax]
810
811         mov     rbx,QWORD PTR[((-8))+rax]
812         mov     rbp,QWORD PTR[((-16))+rax]
813         mov     r12,QWORD PTR[((-24))+rax]
814         mov     r13,QWORD PTR[((-32))+rax]
815         mov     r14,QWORD PTR[((-40))+rax]
816         mov     r15,QWORD PTR[((-48))+rax]
817         mov     QWORD PTR[144+r8],rbx
818         mov     QWORD PTR[160+r8],rbp
819         mov     QWORD PTR[216+r8],r12
820         mov     QWORD PTR[224+r8],r13
821         mov     QWORD PTR[232+r8],r14
822         mov     QWORD PTR[240+r8],r15
823
824         jmp     $L$common_seh_tail
825 mul_handler     ENDP
826
827
828 ALIGN   16
829 sqr_handler     PROC PRIVATE
830         push    rsi
831         push    rdi
832         push    rbx
833         push    rbp
834         push    r12
835         push    r13
836         push    r14
837         push    r15
838         pushfq
839         sub     rsp,64
840
841         mov     rax,QWORD PTR[120+r8]
842         mov     rbx,QWORD PTR[248+r8]
843
844         mov     rsi,QWORD PTR[8+r9]
845         mov     r11,QWORD PTR[56+r9]
846
847         mov     r10d,DWORD PTR[r11]
848         lea     r10,QWORD PTR[r10*1+rsi]
849         cmp     rbx,r10
850         jb      $L$common_seh_tail
851
852         mov     rax,QWORD PTR[152+r8]
853
854         mov     r10d,DWORD PTR[4+r11]
855         lea     r10,QWORD PTR[r10*1+rsi]
856         cmp     rbx,r10
857         jae     $L$common_seh_tail
858
859         mov     rax,QWORD PTR[40+rax]
860
861         mov     rbx,QWORD PTR[((-8))+rax]
862         mov     rbp,QWORD PTR[((-16))+rax]
863         mov     r12,QWORD PTR[((-24))+rax]
864         mov     r13,QWORD PTR[((-32))+rax]
865         mov     r14,QWORD PTR[((-40))+rax]
866         mov     r15,QWORD PTR[((-48))+rax]
867         mov     QWORD PTR[144+r8],rbx
868         mov     QWORD PTR[160+r8],rbp
869         mov     QWORD PTR[216+r8],r12
870         mov     QWORD PTR[224+r8],r13
871         mov     QWORD PTR[232+r8],r14
872         mov     QWORD PTR[240+r8],r15
873
874 $L$common_seh_tail::
875         mov     rdi,QWORD PTR[8+rax]
876         mov     rsi,QWORD PTR[16+rax]
877         mov     QWORD PTR[152+r8],rax
878         mov     QWORD PTR[168+r8],rsi
879         mov     QWORD PTR[176+r8],rdi
880
881         mov     rdi,QWORD PTR[40+r9]
882         mov     rsi,r8
883         mov     ecx,154
884         DD      0a548f3fch
885
886         mov     rsi,r9
887         xor     rcx,rcx
888         mov     rdx,QWORD PTR[8+rsi]
889         mov     r8,QWORD PTR[rsi]
890         mov     r9,QWORD PTR[16+rsi]
891         mov     r10,QWORD PTR[40+rsi]
892         lea     r11,QWORD PTR[56+rsi]
893         lea     r12,QWORD PTR[24+rsi]
894         mov     QWORD PTR[32+rsp],r10
895         mov     QWORD PTR[40+rsp],r11
896         mov     QWORD PTR[48+rsp],r12
897         mov     QWORD PTR[56+rsp],rcx
898         call    QWORD PTR[__imp_RtlVirtualUnwind]
899
900         mov     eax,1
901         add     rsp,64
902         popfq
903         pop     r15
904         pop     r14
905         pop     r13
906         pop     r12
907         pop     rbp
908         pop     rbx
909         pop     rdi
910         pop     rsi
911         DB      0F3h,0C3h               ;repret
912 sqr_handler     ENDP
913
914 .text$  ENDS
915 .pdata  SEGMENT READONLY ALIGN(4)
916 ALIGN   4
917         DD      imagerel $L$SEH_begin_bn_mul_mont
918         DD      imagerel $L$SEH_end_bn_mul_mont
919         DD      imagerel $L$SEH_info_bn_mul_mont
920
921         DD      imagerel $L$SEH_begin_bn_mul4x_mont
922         DD      imagerel $L$SEH_end_bn_mul4x_mont
923         DD      imagerel $L$SEH_info_bn_mul4x_mont
924
925         DD      imagerel $L$SEH_begin_bn_sqr8x_mont
926         DD      imagerel $L$SEH_end_bn_sqr8x_mont
927         DD      imagerel $L$SEH_info_bn_sqr8x_mont
928 .pdata  ENDS
929 .xdata  SEGMENT READONLY ALIGN(8)
930 ALIGN   8
931 $L$SEH_info_bn_mul_mont::
932 DB      9,0,0,0
933         DD      imagerel mul_handler
934         DD      imagerel $L$mul_body,imagerel $L$mul_epilogue
935 $L$SEH_info_bn_mul4x_mont::
936 DB      9,0,0,0
937         DD      imagerel mul_handler
938         DD      imagerel $L$mul4x_body,imagerel $L$mul4x_epilogue
939 $L$SEH_info_bn_sqr8x_mont::
940 DB      9,0,0,0
941         DD      imagerel sqr_handler
942         DD      imagerel $L$sqr8x_body,imagerel $L$sqr8x_epilogue
943
944 .xdata  ENDS
945 END