Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / third_party / boringssl / win-x86_64 / crypto / bn / rsaz-x86_64.asm
1 OPTION  DOTNAME
2 .text$  SEGMENT ALIGN(256) 'CODE'
3
4 EXTERN  OPENSSL_ia32cap_P:NEAR
5
6 PUBLIC  rsaz_512_sqr
7
8 ALIGN   32
9 rsaz_512_sqr    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_rsaz_512_sqr::
14         mov     rdi,rcx
15         mov     rsi,rdx
16         mov     rdx,r8
17         mov     rcx,r9
18         mov     r8,QWORD PTR[40+rsp]
19
20
21         push    rbx
22         push    rbp
23         push    r12
24         push    r13
25         push    r14
26         push    r15
27
28         sub     rsp,128+24
29 $L$sqr_body::
30         mov     rbp,rdx
31         mov     rdx,QWORD PTR[rsi]
32         mov     rax,QWORD PTR[8+rsi]
33         mov     QWORD PTR[128+rsp],rcx
34         jmp     $L$oop_sqr
35
36 ALIGN   32
37 $L$oop_sqr::
38         mov     DWORD PTR[((128+8))+rsp],r8d
39
40         mov     rbx,rdx
41         mul     rdx
42         mov     r8,rax
43         mov     rax,QWORD PTR[16+rsi]
44         mov     r9,rdx
45
46         mul     rbx
47         add     r9,rax
48         mov     rax,QWORD PTR[24+rsi]
49         mov     r10,rdx
50         adc     r10,0
51
52         mul     rbx
53         add     r10,rax
54         mov     rax,QWORD PTR[32+rsi]
55         mov     r11,rdx
56         adc     r11,0
57
58         mul     rbx
59         add     r11,rax
60         mov     rax,QWORD PTR[40+rsi]
61         mov     r12,rdx
62         adc     r12,0
63
64         mul     rbx
65         add     r12,rax
66         mov     rax,QWORD PTR[48+rsi]
67         mov     r13,rdx
68         adc     r13,0
69
70         mul     rbx
71         add     r13,rax
72         mov     rax,QWORD PTR[56+rsi]
73         mov     r14,rdx
74         adc     r14,0
75
76         mul     rbx
77         add     r14,rax
78         mov     rax,rbx
79         mov     r15,rdx
80         adc     r15,0
81
82         add     r8,r8
83         mov     rcx,r9
84         adc     r9,r9
85
86         mul     rax
87         mov     QWORD PTR[rsp],rax
88         add     r8,rdx
89         adc     r9,0
90
91         mov     QWORD PTR[8+rsp],r8
92         shr     rcx,63
93
94
95         mov     r8,QWORD PTR[8+rsi]
96         mov     rax,QWORD PTR[16+rsi]
97         mul     r8
98         add     r10,rax
99         mov     rax,QWORD PTR[24+rsi]
100         mov     rbx,rdx
101         adc     rbx,0
102
103         mul     r8
104         add     r11,rax
105         mov     rax,QWORD PTR[32+rsi]
106         adc     rdx,0
107         add     r11,rbx
108         mov     rbx,rdx
109         adc     rbx,0
110
111         mul     r8
112         add     r12,rax
113         mov     rax,QWORD PTR[40+rsi]
114         adc     rdx,0
115         add     r12,rbx
116         mov     rbx,rdx
117         adc     rbx,0
118
119         mul     r8
120         add     r13,rax
121         mov     rax,QWORD PTR[48+rsi]
122         adc     rdx,0
123         add     r13,rbx
124         mov     rbx,rdx
125         adc     rbx,0
126
127         mul     r8
128         add     r14,rax
129         mov     rax,QWORD PTR[56+rsi]
130         adc     rdx,0
131         add     r14,rbx
132         mov     rbx,rdx
133         adc     rbx,0
134
135         mul     r8
136         add     r15,rax
137         mov     rax,r8
138         adc     rdx,0
139         add     r15,rbx
140         mov     r8,rdx
141         mov     rdx,r10
142         adc     r8,0
143
144         add     rdx,rdx
145         lea     r10,QWORD PTR[r10*2+rcx]
146         mov     rbx,r11
147         adc     r11,r11
148
149         mul     rax
150         add     r9,rax
151         adc     r10,rdx
152         adc     r11,0
153
154         mov     QWORD PTR[16+rsp],r9
155         mov     QWORD PTR[24+rsp],r10
156         shr     rbx,63
157
158
159         mov     r9,QWORD PTR[16+rsi]
160         mov     rax,QWORD PTR[24+rsi]
161         mul     r9
162         add     r12,rax
163         mov     rax,QWORD PTR[32+rsi]
164         mov     rcx,rdx
165         adc     rcx,0
166
167         mul     r9
168         add     r13,rax
169         mov     rax,QWORD PTR[40+rsi]
170         adc     rdx,0
171         add     r13,rcx
172         mov     rcx,rdx
173         adc     rcx,0
174
175         mul     r9
176         add     r14,rax
177         mov     rax,QWORD PTR[48+rsi]
178         adc     rdx,0
179         add     r14,rcx
180         mov     rcx,rdx
181         adc     rcx,0
182
183         mul     r9
184         mov     r10,r12
185         lea     r12,QWORD PTR[r12*2+rbx]
186         add     r15,rax
187         mov     rax,QWORD PTR[56+rsi]
188         adc     rdx,0
189         add     r15,rcx
190         mov     rcx,rdx
191         adc     rcx,0
192
193         mul     r9
194         shr     r10,63
195         add     r8,rax
196         mov     rax,r9
197         adc     rdx,0
198         add     r8,rcx
199         mov     r9,rdx
200         adc     r9,0
201
202         mov     rcx,r13
203         lea     r13,QWORD PTR[r13*2+r10]
204
205         mul     rax
206         add     r11,rax
207         adc     r12,rdx
208         adc     r13,0
209
210         mov     QWORD PTR[32+rsp],r11
211         mov     QWORD PTR[40+rsp],r12
212         shr     rcx,63
213
214
215         mov     r10,QWORD PTR[24+rsi]
216         mov     rax,QWORD PTR[32+rsi]
217         mul     r10
218         add     r14,rax
219         mov     rax,QWORD PTR[40+rsi]
220         mov     rbx,rdx
221         adc     rbx,0
222
223         mul     r10
224         add     r15,rax
225         mov     rax,QWORD PTR[48+rsi]
226         adc     rdx,0
227         add     r15,rbx
228         mov     rbx,rdx
229         adc     rbx,0
230
231         mul     r10
232         mov     r12,r14
233         lea     r14,QWORD PTR[r14*2+rcx]
234         add     r8,rax
235         mov     rax,QWORD PTR[56+rsi]
236         adc     rdx,0
237         add     r8,rbx
238         mov     rbx,rdx
239         adc     rbx,0
240
241         mul     r10
242         shr     r12,63
243         add     r9,rax
244         mov     rax,r10
245         adc     rdx,0
246         add     r9,rbx
247         mov     r10,rdx
248         adc     r10,0
249
250         mov     rbx,r15
251         lea     r15,QWORD PTR[r15*2+r12]
252
253         mul     rax
254         add     r13,rax
255         adc     r14,rdx
256         adc     r15,0
257
258         mov     QWORD PTR[48+rsp],r13
259         mov     QWORD PTR[56+rsp],r14
260         shr     rbx,63
261
262
263         mov     r11,QWORD PTR[32+rsi]
264         mov     rax,QWORD PTR[40+rsi]
265         mul     r11
266         add     r8,rax
267         mov     rax,QWORD PTR[48+rsi]
268         mov     rcx,rdx
269         adc     rcx,0
270
271         mul     r11
272         add     r9,rax
273         mov     rax,QWORD PTR[56+rsi]
274         adc     rdx,0
275         mov     r12,r8
276         lea     r8,QWORD PTR[r8*2+rbx]
277         add     r9,rcx
278         mov     rcx,rdx
279         adc     rcx,0
280
281         mul     r11
282         shr     r12,63
283         add     r10,rax
284         mov     rax,r11
285         adc     rdx,0
286         add     r10,rcx
287         mov     r11,rdx
288         adc     r11,0
289
290         mov     rcx,r9
291         lea     r9,QWORD PTR[r9*2+r12]
292
293         mul     rax
294         add     r15,rax
295         adc     r8,rdx
296         adc     r9,0
297
298         mov     QWORD PTR[64+rsp],r15
299         mov     QWORD PTR[72+rsp],r8
300         shr     rcx,63
301
302
303         mov     r12,QWORD PTR[40+rsi]
304         mov     rax,QWORD PTR[48+rsi]
305         mul     r12
306         add     r10,rax
307         mov     rax,QWORD PTR[56+rsi]
308         mov     rbx,rdx
309         adc     rbx,0
310
311         mul     r12
312         add     r11,rax
313         mov     rax,r12
314         mov     r15,r10
315         lea     r10,QWORD PTR[r10*2+rcx]
316         adc     rdx,0
317         shr     r15,63
318         add     r11,rbx
319         mov     r12,rdx
320         adc     r12,0
321
322         mov     rbx,r11
323         lea     r11,QWORD PTR[r11*2+r15]
324
325         mul     rax
326         add     r9,rax
327         adc     r10,rdx
328         adc     r11,0
329
330         mov     QWORD PTR[80+rsp],r9
331         mov     QWORD PTR[88+rsp],r10
332
333
334         mov     r13,QWORD PTR[48+rsi]
335         mov     rax,QWORD PTR[56+rsi]
336         mul     r13
337         add     r12,rax
338         mov     rax,r13
339         mov     r13,rdx
340         adc     r13,0
341
342         xor     r14,r14
343         shl     rbx,1
344         adc     r12,r12
345         adc     r13,r13
346         adc     r14,r14
347
348         mul     rax
349         add     r11,rax
350         adc     r12,rdx
351         adc     r13,0
352
353         mov     QWORD PTR[96+rsp],r11
354         mov     QWORD PTR[104+rsp],r12
355
356
357         mov     rax,QWORD PTR[56+rsi]
358         mul     rax
359         add     r13,rax
360         adc     rdx,0
361
362         add     r14,rdx
363
364         mov     QWORD PTR[112+rsp],r13
365         mov     QWORD PTR[120+rsp],r14
366
367         mov     r8,QWORD PTR[rsp]
368         mov     r9,QWORD PTR[8+rsp]
369         mov     r10,QWORD PTR[16+rsp]
370         mov     r11,QWORD PTR[24+rsp]
371         mov     r12,QWORD PTR[32+rsp]
372         mov     r13,QWORD PTR[40+rsp]
373         mov     r14,QWORD PTR[48+rsp]
374         mov     r15,QWORD PTR[56+rsp]
375
376         call    __rsaz_512_reduce
377
378         add     r8,QWORD PTR[64+rsp]
379         adc     r9,QWORD PTR[72+rsp]
380         adc     r10,QWORD PTR[80+rsp]
381         adc     r11,QWORD PTR[88+rsp]
382         adc     r12,QWORD PTR[96+rsp]
383         adc     r13,QWORD PTR[104+rsp]
384         adc     r14,QWORD PTR[112+rsp]
385         adc     r15,QWORD PTR[120+rsp]
386         sbb     rcx,rcx
387
388         call    __rsaz_512_subtract
389
390         mov     rdx,r8
391         mov     rax,r9
392         mov     r8d,DWORD PTR[((128+8))+rsp]
393         mov     rsi,rdi
394
395         dec     r8d
396         jnz     $L$oop_sqr
397
398         lea     rax,QWORD PTR[((128+24+48))+rsp]
399         mov     r15,QWORD PTR[((-48))+rax]
400         mov     r14,QWORD PTR[((-40))+rax]
401         mov     r13,QWORD PTR[((-32))+rax]
402         mov     r12,QWORD PTR[((-24))+rax]
403         mov     rbp,QWORD PTR[((-16))+rax]
404         mov     rbx,QWORD PTR[((-8))+rax]
405         lea     rsp,QWORD PTR[rax]
406 $L$sqr_epilogue::
407         mov     rdi,QWORD PTR[8+rsp]    ;WIN64 epilogue
408         mov     rsi,QWORD PTR[16+rsp]
409         DB      0F3h,0C3h               ;repret
410 $L$SEH_end_rsaz_512_sqr::
411 rsaz_512_sqr    ENDP
412 PUBLIC  rsaz_512_mul
413
414 ALIGN   32
415 rsaz_512_mul    PROC PUBLIC
416         mov     QWORD PTR[8+rsp],rdi    ;WIN64 prologue
417         mov     QWORD PTR[16+rsp],rsi
418         mov     rax,rsp
419 $L$SEH_begin_rsaz_512_mul::
420         mov     rdi,rcx
421         mov     rsi,rdx
422         mov     rdx,r8
423         mov     rcx,r9
424         mov     r8,QWORD PTR[40+rsp]
425
426
427         push    rbx
428         push    rbp
429         push    r12
430         push    r13
431         push    r14
432         push    r15
433
434         sub     rsp,128+24
435 $L$mul_body::
436 DB      102,72,15,110,199
437 DB      102,72,15,110,201
438         mov     QWORD PTR[128+rsp],r8
439         mov     rbx,QWORD PTR[rdx]
440         mov     rbp,rdx
441         call    __rsaz_512_mul
442
443 DB      102,72,15,126,199
444 DB      102,72,15,126,205
445
446         mov     r8,QWORD PTR[rsp]
447         mov     r9,QWORD PTR[8+rsp]
448         mov     r10,QWORD PTR[16+rsp]
449         mov     r11,QWORD PTR[24+rsp]
450         mov     r12,QWORD PTR[32+rsp]
451         mov     r13,QWORD PTR[40+rsp]
452         mov     r14,QWORD PTR[48+rsp]
453         mov     r15,QWORD PTR[56+rsp]
454
455         call    __rsaz_512_reduce
456         add     r8,QWORD PTR[64+rsp]
457         adc     r9,QWORD PTR[72+rsp]
458         adc     r10,QWORD PTR[80+rsp]
459         adc     r11,QWORD PTR[88+rsp]
460         adc     r12,QWORD PTR[96+rsp]
461         adc     r13,QWORD PTR[104+rsp]
462         adc     r14,QWORD PTR[112+rsp]
463         adc     r15,QWORD PTR[120+rsp]
464         sbb     rcx,rcx
465
466         call    __rsaz_512_subtract
467
468         lea     rax,QWORD PTR[((128+24+48))+rsp]
469         mov     r15,QWORD PTR[((-48))+rax]
470         mov     r14,QWORD PTR[((-40))+rax]
471         mov     r13,QWORD PTR[((-32))+rax]
472         mov     r12,QWORD PTR[((-24))+rax]
473         mov     rbp,QWORD PTR[((-16))+rax]
474         mov     rbx,QWORD PTR[((-8))+rax]
475         lea     rsp,QWORD PTR[rax]
476 $L$mul_epilogue::
477         mov     rdi,QWORD PTR[8+rsp]    ;WIN64 epilogue
478         mov     rsi,QWORD PTR[16+rsp]
479         DB      0F3h,0C3h               ;repret
480 $L$SEH_end_rsaz_512_mul::
481 rsaz_512_mul    ENDP
482 PUBLIC  rsaz_512_mul_gather4
483
484 ALIGN   32
485 rsaz_512_mul_gather4    PROC PUBLIC
486         mov     QWORD PTR[8+rsp],rdi    ;WIN64 prologue
487         mov     QWORD PTR[16+rsp],rsi
488         mov     rax,rsp
489 $L$SEH_begin_rsaz_512_mul_gather4::
490         mov     rdi,rcx
491         mov     rsi,rdx
492         mov     rdx,r8
493         mov     rcx,r9
494         mov     r8,QWORD PTR[40+rsp]
495         mov     r9,QWORD PTR[48+rsp]
496
497
498         push    rbx
499         push    rbp
500         push    r12
501         push    r13
502         push    r14
503         push    r15
504
505         mov     r9d,r9d
506         sub     rsp,128+24
507 $L$mul_gather4_body::
508         mov     eax,DWORD PTR[64+r9*4+rdx]
509 DB      102,72,15,110,199
510         mov     ebx,DWORD PTR[r9*4+rdx]
511 DB      102,72,15,110,201
512         mov     QWORD PTR[128+rsp],r8
513
514         shl     rax,32
515         or      rbx,rax
516         mov     rax,QWORD PTR[rsi]
517         mov     rcx,QWORD PTR[8+rsi]
518         lea     rbp,QWORD PTR[128+r9*4+rdx]
519         mul     rbx
520         mov     QWORD PTR[rsp],rax
521         mov     rax,rcx
522         mov     r8,rdx
523
524         mul     rbx
525         movd    xmm4,DWORD PTR[rbp]
526         add     r8,rax
527         mov     rax,QWORD PTR[16+rsi]
528         mov     r9,rdx
529         adc     r9,0
530
531         mul     rbx
532         movd    xmm5,DWORD PTR[64+rbp]
533         add     r9,rax
534         mov     rax,QWORD PTR[24+rsi]
535         mov     r10,rdx
536         adc     r10,0
537
538         mul     rbx
539         pslldq  xmm5,4
540         add     r10,rax
541         mov     rax,QWORD PTR[32+rsi]
542         mov     r11,rdx
543         adc     r11,0
544
545         mul     rbx
546         por     xmm4,xmm5
547         add     r11,rax
548         mov     rax,QWORD PTR[40+rsi]
549         mov     r12,rdx
550         adc     r12,0
551
552         mul     rbx
553         add     r12,rax
554         mov     rax,QWORD PTR[48+rsi]
555         mov     r13,rdx
556         adc     r13,0
557
558         mul     rbx
559         lea     rbp,QWORD PTR[128+rbp]
560         add     r13,rax
561         mov     rax,QWORD PTR[56+rsi]
562         mov     r14,rdx
563         adc     r14,0
564
565         mul     rbx
566 DB      102,72,15,126,227
567         add     r14,rax
568         mov     rax,QWORD PTR[rsi]
569         mov     r15,rdx
570         adc     r15,0
571
572         lea     rdi,QWORD PTR[8+rsp]
573         mov     ecx,7
574         jmp     $L$oop_mul_gather
575
576 ALIGN   32
577 $L$oop_mul_gather::
578         mul     rbx
579         add     r8,rax
580         mov     rax,QWORD PTR[8+rsi]
581         mov     QWORD PTR[rdi],r8
582         mov     r8,rdx
583         adc     r8,0
584
585         mul     rbx
586         movd    xmm4,DWORD PTR[rbp]
587         add     r9,rax
588         mov     rax,QWORD PTR[16+rsi]
589         adc     rdx,0
590         add     r8,r9
591         mov     r9,rdx
592         adc     r9,0
593
594         mul     rbx
595         movd    xmm5,DWORD PTR[64+rbp]
596         add     r10,rax
597         mov     rax,QWORD PTR[24+rsi]
598         adc     rdx,0
599         add     r9,r10
600         mov     r10,rdx
601         adc     r10,0
602
603         mul     rbx
604         pslldq  xmm5,4
605         add     r11,rax
606         mov     rax,QWORD PTR[32+rsi]
607         adc     rdx,0
608         add     r10,r11
609         mov     r11,rdx
610         adc     r11,0
611
612         mul     rbx
613         por     xmm4,xmm5
614         add     r12,rax
615         mov     rax,QWORD PTR[40+rsi]
616         adc     rdx,0
617         add     r11,r12
618         mov     r12,rdx
619         adc     r12,0
620
621         mul     rbx
622         add     r13,rax
623         mov     rax,QWORD PTR[48+rsi]
624         adc     rdx,0
625         add     r12,r13
626         mov     r13,rdx
627         adc     r13,0
628
629         mul     rbx
630         add     r14,rax
631         mov     rax,QWORD PTR[56+rsi]
632         adc     rdx,0
633         add     r13,r14
634         mov     r14,rdx
635         adc     r14,0
636
637         mul     rbx
638 DB      102,72,15,126,227
639         add     r15,rax
640         mov     rax,QWORD PTR[rsi]
641         adc     rdx,0
642         add     r14,r15
643         mov     r15,rdx
644         adc     r15,0
645
646         lea     rbp,QWORD PTR[128+rbp]
647         lea     rdi,QWORD PTR[8+rdi]
648
649         dec     ecx
650         jnz     $L$oop_mul_gather
651
652         mov     QWORD PTR[rdi],r8
653         mov     QWORD PTR[8+rdi],r9
654         mov     QWORD PTR[16+rdi],r10
655         mov     QWORD PTR[24+rdi],r11
656         mov     QWORD PTR[32+rdi],r12
657         mov     QWORD PTR[40+rdi],r13
658         mov     QWORD PTR[48+rdi],r14
659         mov     QWORD PTR[56+rdi],r15
660
661 DB      102,72,15,126,199
662 DB      102,72,15,126,205
663
664         mov     r8,QWORD PTR[rsp]
665         mov     r9,QWORD PTR[8+rsp]
666         mov     r10,QWORD PTR[16+rsp]
667         mov     r11,QWORD PTR[24+rsp]
668         mov     r12,QWORD PTR[32+rsp]
669         mov     r13,QWORD PTR[40+rsp]
670         mov     r14,QWORD PTR[48+rsp]
671         mov     r15,QWORD PTR[56+rsp]
672
673         call    __rsaz_512_reduce
674         add     r8,QWORD PTR[64+rsp]
675         adc     r9,QWORD PTR[72+rsp]
676         adc     r10,QWORD PTR[80+rsp]
677         adc     r11,QWORD PTR[88+rsp]
678         adc     r12,QWORD PTR[96+rsp]
679         adc     r13,QWORD PTR[104+rsp]
680         adc     r14,QWORD PTR[112+rsp]
681         adc     r15,QWORD PTR[120+rsp]
682         sbb     rcx,rcx
683
684         call    __rsaz_512_subtract
685
686         lea     rax,QWORD PTR[((128+24+48))+rsp]
687         mov     r15,QWORD PTR[((-48))+rax]
688         mov     r14,QWORD PTR[((-40))+rax]
689         mov     r13,QWORD PTR[((-32))+rax]
690         mov     r12,QWORD PTR[((-24))+rax]
691         mov     rbp,QWORD PTR[((-16))+rax]
692         mov     rbx,QWORD PTR[((-8))+rax]
693         lea     rsp,QWORD PTR[rax]
694 $L$mul_gather4_epilogue::
695         mov     rdi,QWORD PTR[8+rsp]    ;WIN64 epilogue
696         mov     rsi,QWORD PTR[16+rsp]
697         DB      0F3h,0C3h               ;repret
698 $L$SEH_end_rsaz_512_mul_gather4::
699 rsaz_512_mul_gather4    ENDP
700 PUBLIC  rsaz_512_mul_scatter4
701
702 ALIGN   32
703 rsaz_512_mul_scatter4   PROC PUBLIC
704         mov     QWORD PTR[8+rsp],rdi    ;WIN64 prologue
705         mov     QWORD PTR[16+rsp],rsi
706         mov     rax,rsp
707 $L$SEH_begin_rsaz_512_mul_scatter4::
708         mov     rdi,rcx
709         mov     rsi,rdx
710         mov     rdx,r8
711         mov     rcx,r9
712         mov     r8,QWORD PTR[40+rsp]
713         mov     r9,QWORD PTR[48+rsp]
714
715
716         push    rbx
717         push    rbp
718         push    r12
719         push    r13
720         push    r14
721         push    r15
722
723         mov     r9d,r9d
724         sub     rsp,128+24
725 $L$mul_scatter4_body::
726         lea     r8,QWORD PTR[r9*4+r8]
727 DB      102,72,15,110,199
728 DB      102,72,15,110,202
729 DB      102,73,15,110,208
730         mov     QWORD PTR[128+rsp],rcx
731
732         mov     rbp,rdi
733         mov     rbx,QWORD PTR[rdi]
734         call    __rsaz_512_mul
735
736 DB      102,72,15,126,199
737 DB      102,72,15,126,205
738
739         mov     r8,QWORD PTR[rsp]
740         mov     r9,QWORD PTR[8+rsp]
741         mov     r10,QWORD PTR[16+rsp]
742         mov     r11,QWORD PTR[24+rsp]
743         mov     r12,QWORD PTR[32+rsp]
744         mov     r13,QWORD PTR[40+rsp]
745         mov     r14,QWORD PTR[48+rsp]
746         mov     r15,QWORD PTR[56+rsp]
747
748         call    __rsaz_512_reduce
749         add     r8,QWORD PTR[64+rsp]
750         adc     r9,QWORD PTR[72+rsp]
751         adc     r10,QWORD PTR[80+rsp]
752         adc     r11,QWORD PTR[88+rsp]
753         adc     r12,QWORD PTR[96+rsp]
754         adc     r13,QWORD PTR[104+rsp]
755         adc     r14,QWORD PTR[112+rsp]
756         adc     r15,QWORD PTR[120+rsp]
757 DB      102,72,15,126,214
758         sbb     rcx,rcx
759
760         call    __rsaz_512_subtract
761
762         mov     DWORD PTR[rsi],r8d
763         shr     r8,32
764         mov     DWORD PTR[128+rsi],r9d
765         shr     r9,32
766         mov     DWORD PTR[256+rsi],r10d
767         shr     r10,32
768         mov     DWORD PTR[384+rsi],r11d
769         shr     r11,32
770         mov     DWORD PTR[512+rsi],r12d
771         shr     r12,32
772         mov     DWORD PTR[640+rsi],r13d
773         shr     r13,32
774         mov     DWORD PTR[768+rsi],r14d
775         shr     r14,32
776         mov     DWORD PTR[896+rsi],r15d
777         shr     r15,32
778         mov     DWORD PTR[64+rsi],r8d
779         mov     DWORD PTR[192+rsi],r9d
780         mov     DWORD PTR[320+rsi],r10d
781         mov     DWORD PTR[448+rsi],r11d
782         mov     DWORD PTR[576+rsi],r12d
783         mov     DWORD PTR[704+rsi],r13d
784         mov     DWORD PTR[832+rsi],r14d
785         mov     DWORD PTR[960+rsi],r15d
786
787         lea     rax,QWORD PTR[((128+24+48))+rsp]
788         mov     r15,QWORD PTR[((-48))+rax]
789         mov     r14,QWORD PTR[((-40))+rax]
790         mov     r13,QWORD PTR[((-32))+rax]
791         mov     r12,QWORD PTR[((-24))+rax]
792         mov     rbp,QWORD PTR[((-16))+rax]
793         mov     rbx,QWORD PTR[((-8))+rax]
794         lea     rsp,QWORD PTR[rax]
795 $L$mul_scatter4_epilogue::
796         mov     rdi,QWORD PTR[8+rsp]    ;WIN64 epilogue
797         mov     rsi,QWORD PTR[16+rsp]
798         DB      0F3h,0C3h               ;repret
799 $L$SEH_end_rsaz_512_mul_scatter4::
800 rsaz_512_mul_scatter4   ENDP
801 PUBLIC  rsaz_512_mul_by_one
802
803 ALIGN   32
804 rsaz_512_mul_by_one     PROC PUBLIC
805         mov     QWORD PTR[8+rsp],rdi    ;WIN64 prologue
806         mov     QWORD PTR[16+rsp],rsi
807         mov     rax,rsp
808 $L$SEH_begin_rsaz_512_mul_by_one::
809         mov     rdi,rcx
810         mov     rsi,rdx
811         mov     rdx,r8
812         mov     rcx,r9
813
814
815         push    rbx
816         push    rbp
817         push    r12
818         push    r13
819         push    r14
820         push    r15
821
822         sub     rsp,128+24
823 $L$mul_by_one_body::
824         mov     rbp,rdx
825         mov     QWORD PTR[128+rsp],rcx
826
827         mov     r8,QWORD PTR[rsi]
828         pxor    xmm0,xmm0
829         mov     r9,QWORD PTR[8+rsi]
830         mov     r10,QWORD PTR[16+rsi]
831         mov     r11,QWORD PTR[24+rsi]
832         mov     r12,QWORD PTR[32+rsi]
833         mov     r13,QWORD PTR[40+rsi]
834         mov     r14,QWORD PTR[48+rsi]
835         mov     r15,QWORD PTR[56+rsi]
836
837         movdqa  XMMWORD PTR[rsp],xmm0
838         movdqa  XMMWORD PTR[16+rsp],xmm0
839         movdqa  XMMWORD PTR[32+rsp],xmm0
840         movdqa  XMMWORD PTR[48+rsp],xmm0
841         movdqa  XMMWORD PTR[64+rsp],xmm0
842         movdqa  XMMWORD PTR[80+rsp],xmm0
843         movdqa  XMMWORD PTR[96+rsp],xmm0
844         call    __rsaz_512_reduce
845         mov     QWORD PTR[rdi],r8
846         mov     QWORD PTR[8+rdi],r9
847         mov     QWORD PTR[16+rdi],r10
848         mov     QWORD PTR[24+rdi],r11
849         mov     QWORD PTR[32+rdi],r12
850         mov     QWORD PTR[40+rdi],r13
851         mov     QWORD PTR[48+rdi],r14
852         mov     QWORD PTR[56+rdi],r15
853
854         lea     rax,QWORD PTR[((128+24+48))+rsp]
855         mov     r15,QWORD PTR[((-48))+rax]
856         mov     r14,QWORD PTR[((-40))+rax]
857         mov     r13,QWORD PTR[((-32))+rax]
858         mov     r12,QWORD PTR[((-24))+rax]
859         mov     rbp,QWORD PTR[((-16))+rax]
860         mov     rbx,QWORD PTR[((-8))+rax]
861         lea     rsp,QWORD PTR[rax]
862 $L$mul_by_one_epilogue::
863         mov     rdi,QWORD PTR[8+rsp]    ;WIN64 epilogue
864         mov     rsi,QWORD PTR[16+rsp]
865         DB      0F3h,0C3h               ;repret
866 $L$SEH_end_rsaz_512_mul_by_one::
867 rsaz_512_mul_by_one     ENDP
868
869 ALIGN   32
870 __rsaz_512_reduce       PROC PRIVATE
871         mov     rbx,r8
872         imul    rbx,QWORD PTR[((128+8))+rsp]
873         mov     rax,QWORD PTR[rbp]
874         mov     ecx,8
875         jmp     $L$reduction_loop
876
877 ALIGN   32
878 $L$reduction_loop::
879         mul     rbx
880         mov     rax,QWORD PTR[8+rbp]
881         neg     r8
882         mov     r8,rdx
883         adc     r8,0
884
885         mul     rbx
886         add     r9,rax
887         mov     rax,QWORD PTR[16+rbp]
888         adc     rdx,0
889         add     r8,r9
890         mov     r9,rdx
891         adc     r9,0
892
893         mul     rbx
894         add     r10,rax
895         mov     rax,QWORD PTR[24+rbp]
896         adc     rdx,0
897         add     r9,r10
898         mov     r10,rdx
899         adc     r10,0
900
901         mul     rbx
902         add     r11,rax
903         mov     rax,QWORD PTR[32+rbp]
904         adc     rdx,0
905         add     r10,r11
906         mov     rsi,QWORD PTR[((128+8))+rsp]
907
908
909         adc     rdx,0
910         mov     r11,rdx
911
912         mul     rbx
913         add     r12,rax
914         mov     rax,QWORD PTR[40+rbp]
915         adc     rdx,0
916         imul    rsi,r8
917         add     r11,r12
918         mov     r12,rdx
919         adc     r12,0
920
921         mul     rbx
922         add     r13,rax
923         mov     rax,QWORD PTR[48+rbp]
924         adc     rdx,0
925         add     r12,r13
926         mov     r13,rdx
927         adc     r13,0
928
929         mul     rbx
930         add     r14,rax
931         mov     rax,QWORD PTR[56+rbp]
932         adc     rdx,0
933         add     r13,r14
934         mov     r14,rdx
935         adc     r14,0
936
937         mul     rbx
938         mov     rbx,rsi
939         add     r15,rax
940         mov     rax,QWORD PTR[rbp]
941         adc     rdx,0
942         add     r14,r15
943         mov     r15,rdx
944         adc     r15,0
945
946         dec     ecx
947         jne     $L$reduction_loop
948
949         DB      0F3h,0C3h               ;repret
950 __rsaz_512_reduce       ENDP
951
952 ALIGN   32
953 __rsaz_512_subtract     PROC PRIVATE
954         mov     QWORD PTR[rdi],r8
955         mov     QWORD PTR[8+rdi],r9
956         mov     QWORD PTR[16+rdi],r10
957         mov     QWORD PTR[24+rdi],r11
958         mov     QWORD PTR[32+rdi],r12
959         mov     QWORD PTR[40+rdi],r13
960         mov     QWORD PTR[48+rdi],r14
961         mov     QWORD PTR[56+rdi],r15
962
963         mov     r8,QWORD PTR[rbp]
964         mov     r9,QWORD PTR[8+rbp]
965         neg     r8
966         not     r9
967         and     r8,rcx
968         mov     r10,QWORD PTR[16+rbp]
969         and     r9,rcx
970         not     r10
971         mov     r11,QWORD PTR[24+rbp]
972         and     r10,rcx
973         not     r11
974         mov     r12,QWORD PTR[32+rbp]
975         and     r11,rcx
976         not     r12
977         mov     r13,QWORD PTR[40+rbp]
978         and     r12,rcx
979         not     r13
980         mov     r14,QWORD PTR[48+rbp]
981         and     r13,rcx
982         not     r14
983         mov     r15,QWORD PTR[56+rbp]
984         and     r14,rcx
985         not     r15
986         and     r15,rcx
987
988         add     r8,QWORD PTR[rdi]
989         adc     r9,QWORD PTR[8+rdi]
990         adc     r10,QWORD PTR[16+rdi]
991         adc     r11,QWORD PTR[24+rdi]
992         adc     r12,QWORD PTR[32+rdi]
993         adc     r13,QWORD PTR[40+rdi]
994         adc     r14,QWORD PTR[48+rdi]
995         adc     r15,QWORD PTR[56+rdi]
996
997         mov     QWORD PTR[rdi],r8
998         mov     QWORD PTR[8+rdi],r9
999         mov     QWORD PTR[16+rdi],r10
1000         mov     QWORD PTR[24+rdi],r11
1001         mov     QWORD PTR[32+rdi],r12
1002         mov     QWORD PTR[40+rdi],r13
1003         mov     QWORD PTR[48+rdi],r14
1004         mov     QWORD PTR[56+rdi],r15
1005
1006         DB      0F3h,0C3h               ;repret
1007 __rsaz_512_subtract     ENDP
1008
1009 ALIGN   32
1010 __rsaz_512_mul  PROC PRIVATE
1011         lea     rdi,QWORD PTR[8+rsp]
1012
1013         mov     rax,QWORD PTR[rsi]
1014         mul     rbx
1015         mov     QWORD PTR[rdi],rax
1016         mov     rax,QWORD PTR[8+rsi]
1017         mov     r8,rdx
1018
1019         mul     rbx
1020         add     r8,rax
1021         mov     rax,QWORD PTR[16+rsi]
1022         mov     r9,rdx
1023         adc     r9,0
1024
1025         mul     rbx
1026         add     r9,rax
1027         mov     rax,QWORD PTR[24+rsi]
1028         mov     r10,rdx
1029         adc     r10,0
1030
1031         mul     rbx
1032         add     r10,rax
1033         mov     rax,QWORD PTR[32+rsi]
1034         mov     r11,rdx
1035         adc     r11,0
1036
1037         mul     rbx
1038         add     r11,rax
1039         mov     rax,QWORD PTR[40+rsi]
1040         mov     r12,rdx
1041         adc     r12,0
1042
1043         mul     rbx
1044         add     r12,rax
1045         mov     rax,QWORD PTR[48+rsi]
1046         mov     r13,rdx
1047         adc     r13,0
1048
1049         mul     rbx
1050         add     r13,rax
1051         mov     rax,QWORD PTR[56+rsi]
1052         mov     r14,rdx
1053         adc     r14,0
1054
1055         mul     rbx
1056         add     r14,rax
1057         mov     rax,QWORD PTR[rsi]
1058         mov     r15,rdx
1059         adc     r15,0
1060
1061         lea     rbp,QWORD PTR[8+rbp]
1062         lea     rdi,QWORD PTR[8+rdi]
1063
1064         mov     ecx,7
1065         jmp     $L$oop_mul
1066
1067 ALIGN   32
1068 $L$oop_mul::
1069         mov     rbx,QWORD PTR[rbp]
1070         mul     rbx
1071         add     r8,rax
1072         mov     rax,QWORD PTR[8+rsi]
1073         mov     QWORD PTR[rdi],r8
1074         mov     r8,rdx
1075         adc     r8,0
1076
1077         mul     rbx
1078         add     r9,rax
1079         mov     rax,QWORD PTR[16+rsi]
1080         adc     rdx,0
1081         add     r8,r9
1082         mov     r9,rdx
1083         adc     r9,0
1084
1085         mul     rbx
1086         add     r10,rax
1087         mov     rax,QWORD PTR[24+rsi]
1088         adc     rdx,0
1089         add     r9,r10
1090         mov     r10,rdx
1091         adc     r10,0
1092
1093         mul     rbx
1094         add     r11,rax
1095         mov     rax,QWORD PTR[32+rsi]
1096         adc     rdx,0
1097         add     r10,r11
1098         mov     r11,rdx
1099         adc     r11,0
1100
1101         mul     rbx
1102         add     r12,rax
1103         mov     rax,QWORD PTR[40+rsi]
1104         adc     rdx,0
1105         add     r11,r12
1106         mov     r12,rdx
1107         adc     r12,0
1108
1109         mul     rbx
1110         add     r13,rax
1111         mov     rax,QWORD PTR[48+rsi]
1112         adc     rdx,0
1113         add     r12,r13
1114         mov     r13,rdx
1115         adc     r13,0
1116
1117         mul     rbx
1118         add     r14,rax
1119         mov     rax,QWORD PTR[56+rsi]
1120         adc     rdx,0
1121         add     r13,r14
1122         mov     r14,rdx
1123         lea     rbp,QWORD PTR[8+rbp]
1124         adc     r14,0
1125
1126         mul     rbx
1127         add     r15,rax
1128         mov     rax,QWORD PTR[rsi]
1129         adc     rdx,0
1130         add     r14,r15
1131         mov     r15,rdx
1132         adc     r15,0
1133
1134         lea     rdi,QWORD PTR[8+rdi]
1135
1136         dec     ecx
1137         jnz     $L$oop_mul
1138
1139         mov     QWORD PTR[rdi],r8
1140         mov     QWORD PTR[8+rdi],r9
1141         mov     QWORD PTR[16+rdi],r10
1142         mov     QWORD PTR[24+rdi],r11
1143         mov     QWORD PTR[32+rdi],r12
1144         mov     QWORD PTR[40+rdi],r13
1145         mov     QWORD PTR[48+rdi],r14
1146         mov     QWORD PTR[56+rdi],r15
1147
1148         DB      0F3h,0C3h               ;repret
1149 __rsaz_512_mul  ENDP
1150 PUBLIC  rsaz_512_scatter4
1151
1152 ALIGN   16
1153 rsaz_512_scatter4       PROC PUBLIC
1154         lea     rcx,QWORD PTR[r8*4+rcx]
1155         mov     r9d,8
1156         jmp     $L$oop_scatter
1157 ALIGN   16
1158 $L$oop_scatter::
1159         mov     rax,QWORD PTR[rdx]
1160         lea     rdx,QWORD PTR[8+rdx]
1161         mov     DWORD PTR[rcx],eax
1162         shr     rax,32
1163         mov     DWORD PTR[64+rcx],eax
1164         lea     rcx,QWORD PTR[128+rcx]
1165         dec     r9d
1166         jnz     $L$oop_scatter
1167         DB      0F3h,0C3h               ;repret
1168 rsaz_512_scatter4       ENDP
1169
1170 PUBLIC  rsaz_512_gather4
1171
1172 ALIGN   16
1173 rsaz_512_gather4        PROC PUBLIC
1174         lea     rdx,QWORD PTR[r8*4+rdx]
1175         mov     r9d,8
1176         jmp     $L$oop_gather
1177 ALIGN   16
1178 $L$oop_gather::
1179         mov     eax,DWORD PTR[rdx]
1180         mov     r8d,DWORD PTR[64+rdx]
1181         lea     rdx,QWORD PTR[128+rdx]
1182         shl     r8,32
1183         or      rax,r8
1184         mov     QWORD PTR[rcx],rax
1185         lea     rcx,QWORD PTR[8+rcx]
1186         dec     r9d
1187         jnz     $L$oop_gather
1188         DB      0F3h,0C3h               ;repret
1189 rsaz_512_gather4        ENDP
1190 EXTERN  __imp_RtlVirtualUnwind:NEAR
1191
1192 ALIGN   16
1193 se_handler      PROC PRIVATE
1194         push    rsi
1195         push    rdi
1196         push    rbx
1197         push    rbp
1198         push    r12
1199         push    r13
1200         push    r14
1201         push    r15
1202         pushfq
1203         sub     rsp,64
1204
1205         mov     rax,QWORD PTR[120+r8]
1206         mov     rbx,QWORD PTR[248+r8]
1207
1208         mov     rsi,QWORD PTR[8+r9]
1209         mov     r11,QWORD PTR[56+r9]
1210
1211         mov     r10d,DWORD PTR[r11]
1212         lea     r10,QWORD PTR[r10*1+rsi]
1213         cmp     rbx,r10
1214         jb      $L$common_seh_tail
1215
1216         mov     rax,QWORD PTR[152+r8]
1217
1218         mov     r10d,DWORD PTR[4+r11]
1219         lea     r10,QWORD PTR[r10*1+rsi]
1220         cmp     rbx,r10
1221         jae     $L$common_seh_tail
1222
1223         lea     rax,QWORD PTR[((128+24+48))+rax]
1224
1225         mov     rbx,QWORD PTR[((-8))+rax]
1226         mov     rbp,QWORD PTR[((-16))+rax]
1227         mov     r12,QWORD PTR[((-24))+rax]
1228         mov     r13,QWORD PTR[((-32))+rax]
1229         mov     r14,QWORD PTR[((-40))+rax]
1230         mov     r15,QWORD PTR[((-48))+rax]
1231         mov     QWORD PTR[144+r8],rbx
1232         mov     QWORD PTR[160+r8],rbp
1233         mov     QWORD PTR[216+r8],r12
1234         mov     QWORD PTR[224+r8],r13
1235         mov     QWORD PTR[232+r8],r14
1236         mov     QWORD PTR[240+r8],r15
1237
1238 $L$common_seh_tail::
1239         mov     rdi,QWORD PTR[8+rax]
1240         mov     rsi,QWORD PTR[16+rax]
1241         mov     QWORD PTR[152+r8],rax
1242         mov     QWORD PTR[168+r8],rsi
1243         mov     QWORD PTR[176+r8],rdi
1244
1245         mov     rdi,QWORD PTR[40+r9]
1246         mov     rsi,r8
1247         mov     ecx,154
1248         DD      0a548f3fch
1249
1250         mov     rsi,r9
1251         xor     rcx,rcx
1252         mov     rdx,QWORD PTR[8+rsi]
1253         mov     r8,QWORD PTR[rsi]
1254         mov     r9,QWORD PTR[16+rsi]
1255         mov     r10,QWORD PTR[40+rsi]
1256         lea     r11,QWORD PTR[56+rsi]
1257         lea     r12,QWORD PTR[24+rsi]
1258         mov     QWORD PTR[32+rsp],r10
1259         mov     QWORD PTR[40+rsp],r11
1260         mov     QWORD PTR[48+rsp],r12
1261         mov     QWORD PTR[56+rsp],rcx
1262         call    QWORD PTR[__imp_RtlVirtualUnwind]
1263
1264         mov     eax,1
1265         add     rsp,64
1266         popfq
1267         pop     r15
1268         pop     r14
1269         pop     r13
1270         pop     r12
1271         pop     rbp
1272         pop     rbx
1273         pop     rdi
1274         pop     rsi
1275         DB      0F3h,0C3h               ;repret
1276 se_handler      ENDP
1277
1278 .text$  ENDS
1279 .pdata  SEGMENT READONLY ALIGN(4)
1280 ALIGN   4
1281         DD      imagerel $L$SEH_begin_rsaz_512_sqr
1282         DD      imagerel $L$SEH_end_rsaz_512_sqr
1283         DD      imagerel $L$SEH_info_rsaz_512_sqr
1284
1285         DD      imagerel $L$SEH_begin_rsaz_512_mul
1286         DD      imagerel $L$SEH_end_rsaz_512_mul
1287         DD      imagerel $L$SEH_info_rsaz_512_mul
1288
1289         DD      imagerel $L$SEH_begin_rsaz_512_mul_gather4
1290         DD      imagerel $L$SEH_end_rsaz_512_mul_gather4
1291         DD      imagerel $L$SEH_info_rsaz_512_mul_gather4
1292
1293         DD      imagerel $L$SEH_begin_rsaz_512_mul_scatter4
1294         DD      imagerel $L$SEH_end_rsaz_512_mul_scatter4
1295         DD      imagerel $L$SEH_info_rsaz_512_mul_scatter4
1296
1297         DD      imagerel $L$SEH_begin_rsaz_512_mul_by_one
1298         DD      imagerel $L$SEH_end_rsaz_512_mul_by_one
1299         DD      imagerel $L$SEH_info_rsaz_512_mul_by_one
1300
1301 .pdata  ENDS
1302 .xdata  SEGMENT READONLY ALIGN(8)
1303 ALIGN   8
1304 $L$SEH_info_rsaz_512_sqr::
1305 DB      9,0,0,0
1306         DD      imagerel se_handler
1307         DD      imagerel $L$sqr_body,imagerel $L$sqr_epilogue
1308 $L$SEH_info_rsaz_512_mul::
1309 DB      9,0,0,0
1310         DD      imagerel se_handler
1311         DD      imagerel $L$mul_body,imagerel $L$mul_epilogue
1312 $L$SEH_info_rsaz_512_mul_gather4::
1313 DB      9,0,0,0
1314         DD      imagerel se_handler
1315         DD      imagerel $L$mul_gather4_body,imagerel $L$mul_gather4_epilogue
1316 $L$SEH_info_rsaz_512_mul_scatter4::
1317 DB      9,0,0,0
1318         DD      imagerel se_handler
1319         DD      imagerel $L$mul_scatter4_body,imagerel $L$mul_scatter4_epilogue
1320 $L$SEH_info_rsaz_512_mul_by_one::
1321 DB      9,0,0,0
1322         DD      imagerel se_handler
1323         DD      imagerel $L$mul_by_one_body,imagerel $L$mul_by_one_epilogue
1324
1325 .xdata  ENDS
1326 END