Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / third_party / boringssl / win-x86_64 / crypto / bn / modexp512-x86_64.asm
1 default rel
2 %define XMMWORD
3 %define YMMWORD
4 %define ZMMWORD
5 section .text code align=64
6
7
8
9 ALIGN   16
10 MULADD_128x512:
11         mov     rax,QWORD[rsi]
12         mul     rbp
13         add     r8,rax
14         adc     rdx,0
15         mov     QWORD[rcx],r8
16         mov     rbx,rdx
17
18         mov     rax,QWORD[8+rsi]
19         mul     rbp
20         add     r9,rax
21         adc     rdx,0
22         add     r9,rbx
23         adc     rdx,0
24         mov     rbx,rdx
25
26         mov     rax,QWORD[16+rsi]
27         mul     rbp
28         add     r10,rax
29         adc     rdx,0
30         add     r10,rbx
31         adc     rdx,0
32         mov     rbx,rdx
33
34         mov     rax,QWORD[24+rsi]
35         mul     rbp
36         add     r11,rax
37         adc     rdx,0
38         add     r11,rbx
39         adc     rdx,0
40         mov     rbx,rdx
41
42         mov     rax,QWORD[32+rsi]
43         mul     rbp
44         add     r12,rax
45         adc     rdx,0
46         add     r12,rbx
47         adc     rdx,0
48         mov     rbx,rdx
49
50         mov     rax,QWORD[40+rsi]
51         mul     rbp
52         add     r13,rax
53         adc     rdx,0
54         add     r13,rbx
55         adc     rdx,0
56         mov     rbx,rdx
57
58         mov     rax,QWORD[48+rsi]
59         mul     rbp
60         add     r14,rax
61         adc     rdx,0
62         add     r14,rbx
63         adc     rdx,0
64         mov     rbx,rdx
65
66         mov     rax,QWORD[56+rsi]
67         mul     rbp
68         add     r15,rax
69         adc     rdx,0
70         add     r15,rbx
71         adc     rdx,0
72         mov     r8,rdx
73         mov     rbp,QWORD[8+rdi]
74         mov     rax,QWORD[rsi]
75         mul     rbp
76         add     r9,rax
77         adc     rdx,0
78         mov     QWORD[8+rcx],r9
79         mov     rbx,rdx
80
81         mov     rax,QWORD[8+rsi]
82         mul     rbp
83         add     r10,rax
84         adc     rdx,0
85         add     r10,rbx
86         adc     rdx,0
87         mov     rbx,rdx
88
89         mov     rax,QWORD[16+rsi]
90         mul     rbp
91         add     r11,rax
92         adc     rdx,0
93         add     r11,rbx
94         adc     rdx,0
95         mov     rbx,rdx
96
97         mov     rax,QWORD[24+rsi]
98         mul     rbp
99         add     r12,rax
100         adc     rdx,0
101         add     r12,rbx
102         adc     rdx,0
103         mov     rbx,rdx
104
105         mov     rax,QWORD[32+rsi]
106         mul     rbp
107         add     r13,rax
108         adc     rdx,0
109         add     r13,rbx
110         adc     rdx,0
111         mov     rbx,rdx
112
113         mov     rax,QWORD[40+rsi]
114         mul     rbp
115         add     r14,rax
116         adc     rdx,0
117         add     r14,rbx
118         adc     rdx,0
119         mov     rbx,rdx
120
121         mov     rax,QWORD[48+rsi]
122         mul     rbp
123         add     r15,rax
124         adc     rdx,0
125         add     r15,rbx
126         adc     rdx,0
127         mov     rbx,rdx
128
129         mov     rax,QWORD[56+rsi]
130         mul     rbp
131         add     r8,rax
132         adc     rdx,0
133         add     r8,rbx
134         adc     rdx,0
135         mov     r9,rdx
136         DB      0F3h,0C3h               ;repret
137
138
139 ALIGN   16
140 mont_reduce:
141         lea     rdi,[192+rsp]
142         mov     rsi,QWORD[32+rsp]
143         add     rsi,576
144         lea     rcx,[520+rsp]
145
146         mov     rbp,QWORD[96+rcx]
147         mov     rax,QWORD[rsi]
148         mul     rbp
149         mov     r8,QWORD[rcx]
150         add     r8,rax
151         adc     rdx,0
152         mov     QWORD[rdi],r8
153         mov     rbx,rdx
154
155         mov     rax,QWORD[8+rsi]
156         mul     rbp
157         mov     r9,QWORD[8+rcx]
158         add     r9,rax
159         adc     rdx,0
160         add     r9,rbx
161         adc     rdx,0
162         mov     rbx,rdx
163
164         mov     rax,QWORD[16+rsi]
165         mul     rbp
166         mov     r10,QWORD[16+rcx]
167         add     r10,rax
168         adc     rdx,0
169         add     r10,rbx
170         adc     rdx,0
171         mov     rbx,rdx
172
173         mov     rax,QWORD[24+rsi]
174         mul     rbp
175         mov     r11,QWORD[24+rcx]
176         add     r11,rax
177         adc     rdx,0
178         add     r11,rbx
179         adc     rdx,0
180         mov     rbx,rdx
181
182         mov     rax,QWORD[32+rsi]
183         mul     rbp
184         mov     r12,QWORD[32+rcx]
185         add     r12,rax
186         adc     rdx,0
187         add     r12,rbx
188         adc     rdx,0
189         mov     rbx,rdx
190
191         mov     rax,QWORD[40+rsi]
192         mul     rbp
193         mov     r13,QWORD[40+rcx]
194         add     r13,rax
195         adc     rdx,0
196         add     r13,rbx
197         adc     rdx,0
198         mov     rbx,rdx
199
200         mov     rax,QWORD[48+rsi]
201         mul     rbp
202         mov     r14,QWORD[48+rcx]
203         add     r14,rax
204         adc     rdx,0
205         add     r14,rbx
206         adc     rdx,0
207         mov     rbx,rdx
208
209         mov     rax,QWORD[56+rsi]
210         mul     rbp
211         mov     r15,QWORD[56+rcx]
212         add     r15,rax
213         adc     rdx,0
214         add     r15,rbx
215         adc     rdx,0
216         mov     r8,rdx
217         mov     rbp,QWORD[104+rcx]
218         mov     rax,QWORD[rsi]
219         mul     rbp
220         add     r9,rax
221         adc     rdx,0
222         mov     QWORD[8+rdi],r9
223         mov     rbx,rdx
224
225         mov     rax,QWORD[8+rsi]
226         mul     rbp
227         add     r10,rax
228         adc     rdx,0
229         add     r10,rbx
230         adc     rdx,0
231         mov     rbx,rdx
232
233         mov     rax,QWORD[16+rsi]
234         mul     rbp
235         add     r11,rax
236         adc     rdx,0
237         add     r11,rbx
238         adc     rdx,0
239         mov     rbx,rdx
240
241         mov     rax,QWORD[24+rsi]
242         mul     rbp
243         add     r12,rax
244         adc     rdx,0
245         add     r12,rbx
246         adc     rdx,0
247         mov     rbx,rdx
248
249         mov     rax,QWORD[32+rsi]
250         mul     rbp
251         add     r13,rax
252         adc     rdx,0
253         add     r13,rbx
254         adc     rdx,0
255         mov     rbx,rdx
256
257         mov     rax,QWORD[40+rsi]
258         mul     rbp
259         add     r14,rax
260         adc     rdx,0
261         add     r14,rbx
262         adc     rdx,0
263         mov     rbx,rdx
264
265         mov     rax,QWORD[48+rsi]
266         mul     rbp
267         add     r15,rax
268         adc     rdx,0
269         add     r15,rbx
270         adc     rdx,0
271         mov     rbx,rdx
272
273         mov     rax,QWORD[56+rsi]
274         mul     rbp
275         add     r8,rax
276         adc     rdx,0
277         add     r8,rbx
278         adc     rdx,0
279         mov     r9,rdx
280         mov     rbp,QWORD[112+rcx]
281         mov     rax,QWORD[rsi]
282         mul     rbp
283         add     r10,rax
284         adc     rdx,0
285         mov     QWORD[16+rdi],r10
286         mov     rbx,rdx
287
288         mov     rax,QWORD[8+rsi]
289         mul     rbp
290         add     r11,rax
291         adc     rdx,0
292         add     r11,rbx
293         adc     rdx,0
294         mov     rbx,rdx
295
296         mov     rax,QWORD[16+rsi]
297         mul     rbp
298         add     r12,rax
299         adc     rdx,0
300         add     r12,rbx
301         adc     rdx,0
302         mov     rbx,rdx
303
304         mov     rax,QWORD[24+rsi]
305         mul     rbp
306         add     r13,rax
307         adc     rdx,0
308         add     r13,rbx
309         adc     rdx,0
310         mov     rbx,rdx
311
312         mov     rax,QWORD[32+rsi]
313         mul     rbp
314         add     r14,rax
315         adc     rdx,0
316         add     r14,rbx
317         adc     rdx,0
318         mov     rbx,rdx
319
320         mov     rax,QWORD[40+rsi]
321         mul     rbp
322         add     r15,rax
323         adc     rdx,0
324         add     r15,rbx
325         adc     rdx,0
326         mov     rbx,rdx
327
328         mov     rax,QWORD[48+rsi]
329         mul     rbp
330         add     r8,rax
331         adc     rdx,0
332         add     r8,rbx
333         adc     rdx,0
334         mov     rbx,rdx
335
336         mov     rax,QWORD[56+rsi]
337         mul     rbp
338         add     r9,rax
339         adc     rdx,0
340         add     r9,rbx
341         adc     rdx,0
342         mov     r10,rdx
343         mov     rbp,QWORD[120+rcx]
344         mov     rax,QWORD[rsi]
345         mul     rbp
346         add     r11,rax
347         adc     rdx,0
348         mov     QWORD[24+rdi],r11
349         mov     rbx,rdx
350
351         mov     rax,QWORD[8+rsi]
352         mul     rbp
353         add     r12,rax
354         adc     rdx,0
355         add     r12,rbx
356         adc     rdx,0
357         mov     rbx,rdx
358
359         mov     rax,QWORD[16+rsi]
360         mul     rbp
361         add     r13,rax
362         adc     rdx,0
363         add     r13,rbx
364         adc     rdx,0
365         mov     rbx,rdx
366
367         mov     rax,QWORD[24+rsi]
368         mul     rbp
369         add     r14,rax
370         adc     rdx,0
371         add     r14,rbx
372         adc     rdx,0
373         mov     rbx,rdx
374
375         mov     rax,QWORD[32+rsi]
376         mul     rbp
377         add     r15,rax
378         adc     rdx,0
379         add     r15,rbx
380         adc     rdx,0
381         mov     rbx,rdx
382
383         mov     rax,QWORD[40+rsi]
384         mul     rbp
385         add     r8,rax
386         adc     rdx,0
387         add     r8,rbx
388         adc     rdx,0
389         mov     rbx,rdx
390
391         mov     rax,QWORD[48+rsi]
392         mul     rbp
393         add     r9,rax
394         adc     rdx,0
395         add     r9,rbx
396         adc     rdx,0
397         mov     rbx,rdx
398
399         mov     rax,QWORD[56+rsi]
400         mul     rbp
401         add     r10,rax
402         adc     rdx,0
403         add     r10,rbx
404         adc     rdx,0
405         mov     r11,rdx
406         xor     rax,rax
407
408         add     r8,QWORD[64+rcx]
409         adc     r9,QWORD[72+rcx]
410         adc     r10,QWORD[80+rcx]
411         adc     r11,QWORD[88+rcx]
412         adc     rax,0
413
414
415
416
417         mov     QWORD[64+rdi],r8
418         mov     QWORD[72+rdi],r9
419         mov     rbp,r10
420         mov     QWORD[88+rdi],r11
421
422         mov     QWORD[384+rsp],rax
423
424         mov     r8,QWORD[rdi]
425         mov     r9,QWORD[8+rdi]
426         mov     r10,QWORD[16+rdi]
427         mov     r11,QWORD[24+rdi]
428
429
430
431
432
433
434
435
436         add     rdi,8*10
437
438         add     rsi,64
439         lea     rcx,[296+rsp]
440
441         call    MULADD_128x512
442
443         mov     rax,QWORD[384+rsp]
444
445
446         add     r8,QWORD[((-16))+rdi]
447         adc     r9,QWORD[((-8))+rdi]
448         mov     QWORD[64+rcx],r8
449         mov     QWORD[72+rcx],r9
450
451         adc     rax,rax
452         mov     QWORD[384+rsp],rax
453
454         lea     rdi,[192+rsp]
455         add     rsi,64
456
457
458
459
460
461         mov     r8,QWORD[rsi]
462         mov     rbx,QWORD[8+rsi]
463
464         mov     rax,QWORD[rcx]
465         mul     r8
466         mov     rbp,rax
467         mov     r9,rdx
468
469         mov     rax,QWORD[8+rcx]
470         mul     r8
471         add     r9,rax
472
473         mov     rax,QWORD[rcx]
474         mul     rbx
475         add     r9,rax
476
477         mov     QWORD[8+rdi],r9
478
479
480         sub     rsi,192
481
482         mov     r8,QWORD[rcx]
483         mov     r9,QWORD[8+rcx]
484
485         call    MULADD_128x512
486
487
488
489
490         mov     rax,QWORD[rsi]
491         mov     rbx,QWORD[8+rsi]
492         mov     rdi,QWORD[16+rsi]
493         mov     rdx,QWORD[24+rsi]
494
495
496         mov     rbp,QWORD[384+rsp]
497
498         add     r8,QWORD[64+rcx]
499         adc     r9,QWORD[72+rcx]
500
501
502         adc     rbp,rbp
503
504
505
506         shl     rbp,3
507         mov     rcx,QWORD[32+rsp]
508         add     rbp,rcx
509
510
511         xor     rsi,rsi
512
513         add     r10,QWORD[rbp]
514         adc     r11,QWORD[64+rbp]
515         adc     r12,QWORD[128+rbp]
516         adc     r13,QWORD[192+rbp]
517         adc     r14,QWORD[256+rbp]
518         adc     r15,QWORD[320+rbp]
519         adc     r8,QWORD[384+rbp]
520         adc     r9,QWORD[448+rbp]
521
522
523
524         sbb     rsi,0
525
526
527         and     rax,rsi
528         and     rbx,rsi
529         and     rdi,rsi
530         and     rdx,rsi
531
532         mov     rbp,1
533         sub     r10,rax
534         sbb     r11,rbx
535         sbb     r12,rdi
536         sbb     r13,rdx
537
538
539
540
541         sbb     rbp,0
542
543
544
545         add     rcx,512
546         mov     rax,QWORD[32+rcx]
547         mov     rbx,QWORD[40+rcx]
548         mov     rdi,QWORD[48+rcx]
549         mov     rdx,QWORD[56+rcx]
550
551
552
553         and     rax,rsi
554         and     rbx,rsi
555         and     rdi,rsi
556         and     rdx,rsi
557
558
559
560         sub     rbp,1
561
562         sbb     r14,rax
563         sbb     r15,rbx
564         sbb     r8,rdi
565         sbb     r9,rdx
566
567
568
569         mov     rsi,QWORD[144+rsp]
570         mov     QWORD[rsi],r10
571         mov     QWORD[8+rsi],r11
572         mov     QWORD[16+rsi],r12
573         mov     QWORD[24+rsi],r13
574         mov     QWORD[32+rsi],r14
575         mov     QWORD[40+rsi],r15
576         mov     QWORD[48+rsi],r8
577         mov     QWORD[56+rsi],r9
578
579         DB      0F3h,0C3h               ;repret
580
581
582 ALIGN   16
583 mont_mul_a3b:
584
585
586
587
588         mov     rbp,QWORD[rdi]
589
590         mov     rax,r10
591         mul     rbp
592         mov     QWORD[520+rsp],rax
593         mov     r10,rdx
594         mov     rax,r11
595         mul     rbp
596         add     r10,rax
597         adc     rdx,0
598         mov     r11,rdx
599         mov     rax,r12
600         mul     rbp
601         add     r11,rax
602         adc     rdx,0
603         mov     r12,rdx
604         mov     rax,r13
605         mul     rbp
606         add     r12,rax
607         adc     rdx,0
608         mov     r13,rdx
609         mov     rax,r14
610         mul     rbp
611         add     r13,rax
612         adc     rdx,0
613         mov     r14,rdx
614         mov     rax,r15
615         mul     rbp
616         add     r14,rax
617         adc     rdx,0
618         mov     r15,rdx
619         mov     rax,r8
620         mul     rbp
621         add     r15,rax
622         adc     rdx,0
623         mov     r8,rdx
624         mov     rax,r9
625         mul     rbp
626         add     r8,rax
627         adc     rdx,0
628         mov     r9,rdx
629         mov     rbp,QWORD[8+rdi]
630         mov     rax,QWORD[rsi]
631         mul     rbp
632         add     r10,rax
633         adc     rdx,0
634         mov     QWORD[528+rsp],r10
635         mov     rbx,rdx
636
637         mov     rax,QWORD[8+rsi]
638         mul     rbp
639         add     r11,rax
640         adc     rdx,0
641         add     r11,rbx
642         adc     rdx,0
643         mov     rbx,rdx
644
645         mov     rax,QWORD[16+rsi]
646         mul     rbp
647         add     r12,rax
648         adc     rdx,0
649         add     r12,rbx
650         adc     rdx,0
651         mov     rbx,rdx
652
653         mov     rax,QWORD[24+rsi]
654         mul     rbp
655         add     r13,rax
656         adc     rdx,0
657         add     r13,rbx
658         adc     rdx,0
659         mov     rbx,rdx
660
661         mov     rax,QWORD[32+rsi]
662         mul     rbp
663         add     r14,rax
664         adc     rdx,0
665         add     r14,rbx
666         adc     rdx,0
667         mov     rbx,rdx
668
669         mov     rax,QWORD[40+rsi]
670         mul     rbp
671         add     r15,rax
672         adc     rdx,0
673         add     r15,rbx
674         adc     rdx,0
675         mov     rbx,rdx
676
677         mov     rax,QWORD[48+rsi]
678         mul     rbp
679         add     r8,rax
680         adc     rdx,0
681         add     r8,rbx
682         adc     rdx,0
683         mov     rbx,rdx
684
685         mov     rax,QWORD[56+rsi]
686         mul     rbp
687         add     r9,rax
688         adc     rdx,0
689         add     r9,rbx
690         adc     rdx,0
691         mov     r10,rdx
692         mov     rbp,QWORD[16+rdi]
693         mov     rax,QWORD[rsi]
694         mul     rbp
695         add     r11,rax
696         adc     rdx,0
697         mov     QWORD[536+rsp],r11
698         mov     rbx,rdx
699
700         mov     rax,QWORD[8+rsi]
701         mul     rbp
702         add     r12,rax
703         adc     rdx,0
704         add     r12,rbx
705         adc     rdx,0
706         mov     rbx,rdx
707
708         mov     rax,QWORD[16+rsi]
709         mul     rbp
710         add     r13,rax
711         adc     rdx,0
712         add     r13,rbx
713         adc     rdx,0
714         mov     rbx,rdx
715
716         mov     rax,QWORD[24+rsi]
717         mul     rbp
718         add     r14,rax
719         adc     rdx,0
720         add     r14,rbx
721         adc     rdx,0
722         mov     rbx,rdx
723
724         mov     rax,QWORD[32+rsi]
725         mul     rbp
726         add     r15,rax
727         adc     rdx,0
728         add     r15,rbx
729         adc     rdx,0
730         mov     rbx,rdx
731
732         mov     rax,QWORD[40+rsi]
733         mul     rbp
734         add     r8,rax
735         adc     rdx,0
736         add     r8,rbx
737         adc     rdx,0
738         mov     rbx,rdx
739
740         mov     rax,QWORD[48+rsi]
741         mul     rbp
742         add     r9,rax
743         adc     rdx,0
744         add     r9,rbx
745         adc     rdx,0
746         mov     rbx,rdx
747
748         mov     rax,QWORD[56+rsi]
749         mul     rbp
750         add     r10,rax
751         adc     rdx,0
752         add     r10,rbx
753         adc     rdx,0
754         mov     r11,rdx
755         mov     rbp,QWORD[24+rdi]
756         mov     rax,QWORD[rsi]
757         mul     rbp
758         add     r12,rax
759         adc     rdx,0
760         mov     QWORD[544+rsp],r12
761         mov     rbx,rdx
762
763         mov     rax,QWORD[8+rsi]
764         mul     rbp
765         add     r13,rax
766         adc     rdx,0
767         add     r13,rbx
768         adc     rdx,0
769         mov     rbx,rdx
770
771         mov     rax,QWORD[16+rsi]
772         mul     rbp
773         add     r14,rax
774         adc     rdx,0
775         add     r14,rbx
776         adc     rdx,0
777         mov     rbx,rdx
778
779         mov     rax,QWORD[24+rsi]
780         mul     rbp
781         add     r15,rax
782         adc     rdx,0
783         add     r15,rbx
784         adc     rdx,0
785         mov     rbx,rdx
786
787         mov     rax,QWORD[32+rsi]
788         mul     rbp
789         add     r8,rax
790         adc     rdx,0
791         add     r8,rbx
792         adc     rdx,0
793         mov     rbx,rdx
794
795         mov     rax,QWORD[40+rsi]
796         mul     rbp
797         add     r9,rax
798         adc     rdx,0
799         add     r9,rbx
800         adc     rdx,0
801         mov     rbx,rdx
802
803         mov     rax,QWORD[48+rsi]
804         mul     rbp
805         add     r10,rax
806         adc     rdx,0
807         add     r10,rbx
808         adc     rdx,0
809         mov     rbx,rdx
810
811         mov     rax,QWORD[56+rsi]
812         mul     rbp
813         add     r11,rax
814         adc     rdx,0
815         add     r11,rbx
816         adc     rdx,0
817         mov     r12,rdx
818         mov     rbp,QWORD[32+rdi]
819         mov     rax,QWORD[rsi]
820         mul     rbp
821         add     r13,rax
822         adc     rdx,0
823         mov     QWORD[552+rsp],r13
824         mov     rbx,rdx
825
826         mov     rax,QWORD[8+rsi]
827         mul     rbp
828         add     r14,rax
829         adc     rdx,0
830         add     r14,rbx
831         adc     rdx,0
832         mov     rbx,rdx
833
834         mov     rax,QWORD[16+rsi]
835         mul     rbp
836         add     r15,rax
837         adc     rdx,0
838         add     r15,rbx
839         adc     rdx,0
840         mov     rbx,rdx
841
842         mov     rax,QWORD[24+rsi]
843         mul     rbp
844         add     r8,rax
845         adc     rdx,0
846         add     r8,rbx
847         adc     rdx,0
848         mov     rbx,rdx
849
850         mov     rax,QWORD[32+rsi]
851         mul     rbp
852         add     r9,rax
853         adc     rdx,0
854         add     r9,rbx
855         adc     rdx,0
856         mov     rbx,rdx
857
858         mov     rax,QWORD[40+rsi]
859         mul     rbp
860         add     r10,rax
861         adc     rdx,0
862         add     r10,rbx
863         adc     rdx,0
864         mov     rbx,rdx
865
866         mov     rax,QWORD[48+rsi]
867         mul     rbp
868         add     r11,rax
869         adc     rdx,0
870         add     r11,rbx
871         adc     rdx,0
872         mov     rbx,rdx
873
874         mov     rax,QWORD[56+rsi]
875         mul     rbp
876         add     r12,rax
877         adc     rdx,0
878         add     r12,rbx
879         adc     rdx,0
880         mov     r13,rdx
881         mov     rbp,QWORD[40+rdi]
882         mov     rax,QWORD[rsi]
883         mul     rbp
884         add     r14,rax
885         adc     rdx,0
886         mov     QWORD[560+rsp],r14
887         mov     rbx,rdx
888
889         mov     rax,QWORD[8+rsi]
890         mul     rbp
891         add     r15,rax
892         adc     rdx,0
893         add     r15,rbx
894         adc     rdx,0
895         mov     rbx,rdx
896
897         mov     rax,QWORD[16+rsi]
898         mul     rbp
899         add     r8,rax
900         adc     rdx,0
901         add     r8,rbx
902         adc     rdx,0
903         mov     rbx,rdx
904
905         mov     rax,QWORD[24+rsi]
906         mul     rbp
907         add     r9,rax
908         adc     rdx,0
909         add     r9,rbx
910         adc     rdx,0
911         mov     rbx,rdx
912
913         mov     rax,QWORD[32+rsi]
914         mul     rbp
915         add     r10,rax
916         adc     rdx,0
917         add     r10,rbx
918         adc     rdx,0
919         mov     rbx,rdx
920
921         mov     rax,QWORD[40+rsi]
922         mul     rbp
923         add     r11,rax
924         adc     rdx,0
925         add     r11,rbx
926         adc     rdx,0
927         mov     rbx,rdx
928
929         mov     rax,QWORD[48+rsi]
930         mul     rbp
931         add     r12,rax
932         adc     rdx,0
933         add     r12,rbx
934         adc     rdx,0
935         mov     rbx,rdx
936
937         mov     rax,QWORD[56+rsi]
938         mul     rbp
939         add     r13,rax
940         adc     rdx,0
941         add     r13,rbx
942         adc     rdx,0
943         mov     r14,rdx
944         mov     rbp,QWORD[48+rdi]
945         mov     rax,QWORD[rsi]
946         mul     rbp
947         add     r15,rax
948         adc     rdx,0
949         mov     QWORD[568+rsp],r15
950         mov     rbx,rdx
951
952         mov     rax,QWORD[8+rsi]
953         mul     rbp
954         add     r8,rax
955         adc     rdx,0
956         add     r8,rbx
957         adc     rdx,0
958         mov     rbx,rdx
959
960         mov     rax,QWORD[16+rsi]
961         mul     rbp
962         add     r9,rax
963         adc     rdx,0
964         add     r9,rbx
965         adc     rdx,0
966         mov     rbx,rdx
967
968         mov     rax,QWORD[24+rsi]
969         mul     rbp
970         add     r10,rax
971         adc     rdx,0
972         add     r10,rbx
973         adc     rdx,0
974         mov     rbx,rdx
975
976         mov     rax,QWORD[32+rsi]
977         mul     rbp
978         add     r11,rax
979         adc     rdx,0
980         add     r11,rbx
981         adc     rdx,0
982         mov     rbx,rdx
983
984         mov     rax,QWORD[40+rsi]
985         mul     rbp
986         add     r12,rax
987         adc     rdx,0
988         add     r12,rbx
989         adc     rdx,0
990         mov     rbx,rdx
991
992         mov     rax,QWORD[48+rsi]
993         mul     rbp
994         add     r13,rax
995         adc     rdx,0
996         add     r13,rbx
997         adc     rdx,0
998         mov     rbx,rdx
999
1000         mov     rax,QWORD[56+rsi]
1001         mul     rbp
1002         add     r14,rax
1003         adc     rdx,0
1004         add     r14,rbx
1005         adc     rdx,0
1006         mov     r15,rdx
1007         mov     rbp,QWORD[56+rdi]
1008         mov     rax,QWORD[rsi]
1009         mul     rbp
1010         add     r8,rax
1011         adc     rdx,0
1012         mov     QWORD[576+rsp],r8
1013         mov     rbx,rdx
1014
1015         mov     rax,QWORD[8+rsi]
1016         mul     rbp
1017         add     r9,rax
1018         adc     rdx,0
1019         add     r9,rbx
1020         adc     rdx,0
1021         mov     rbx,rdx
1022
1023         mov     rax,QWORD[16+rsi]
1024         mul     rbp
1025         add     r10,rax
1026         adc     rdx,0
1027         add     r10,rbx
1028         adc     rdx,0
1029         mov     rbx,rdx
1030
1031         mov     rax,QWORD[24+rsi]
1032         mul     rbp
1033         add     r11,rax
1034         adc     rdx,0
1035         add     r11,rbx
1036         adc     rdx,0
1037         mov     rbx,rdx
1038
1039         mov     rax,QWORD[32+rsi]
1040         mul     rbp
1041         add     r12,rax
1042         adc     rdx,0
1043         add     r12,rbx
1044         adc     rdx,0
1045         mov     rbx,rdx
1046
1047         mov     rax,QWORD[40+rsi]
1048         mul     rbp
1049         add     r13,rax
1050         adc     rdx,0
1051         add     r13,rbx
1052         adc     rdx,0
1053         mov     rbx,rdx
1054
1055         mov     rax,QWORD[48+rsi]
1056         mul     rbp
1057         add     r14,rax
1058         adc     rdx,0
1059         add     r14,rbx
1060         adc     rdx,0
1061         mov     rbx,rdx
1062
1063         mov     rax,QWORD[56+rsi]
1064         mul     rbp
1065         add     r15,rax
1066         adc     rdx,0
1067         add     r15,rbx
1068         adc     rdx,0
1069         mov     r8,rdx
1070         mov     QWORD[584+rsp],r9
1071         mov     QWORD[592+rsp],r10
1072         mov     QWORD[600+rsp],r11
1073         mov     QWORD[608+rsp],r12
1074         mov     QWORD[616+rsp],r13
1075         mov     QWORD[624+rsp],r14
1076         mov     QWORD[632+rsp],r15
1077         mov     QWORD[640+rsp],r8
1078
1079
1080
1081
1082
1083         jmp     NEAR mont_reduce
1084
1085
1086
1087
1088 ALIGN   16
1089 sqr_reduce:
1090         mov     rcx,QWORD[16+rsp]
1091
1092
1093
1094         mov     rbx,r10
1095
1096         mov     rax,r11
1097         mul     rbx
1098         mov     QWORD[528+rsp],rax
1099         mov     r10,rdx
1100         mov     rax,r12
1101         mul     rbx
1102         add     r10,rax
1103         adc     rdx,0
1104         mov     r11,rdx
1105         mov     rax,r13
1106         mul     rbx
1107         add     r11,rax
1108         adc     rdx,0
1109         mov     r12,rdx
1110         mov     rax,r14
1111         mul     rbx
1112         add     r12,rax
1113         adc     rdx,0
1114         mov     r13,rdx
1115         mov     rax,r15
1116         mul     rbx
1117         add     r13,rax
1118         adc     rdx,0
1119         mov     r14,rdx
1120         mov     rax,r8
1121         mul     rbx
1122         add     r14,rax
1123         adc     rdx,0
1124         mov     r15,rdx
1125         mov     rax,r9
1126         mul     rbx
1127         add     r15,rax
1128         adc     rdx,0
1129         mov     rsi,rdx
1130
1131         mov     QWORD[536+rsp],r10
1132
1133
1134
1135
1136
1137         mov     rbx,QWORD[8+rcx]
1138
1139         mov     rax,QWORD[16+rcx]
1140         mul     rbx
1141         add     r11,rax
1142         adc     rdx,0
1143         mov     QWORD[544+rsp],r11
1144
1145         mov     r10,rdx
1146         mov     rax,QWORD[24+rcx]
1147         mul     rbx
1148         add     r12,rax
1149         adc     rdx,0
1150         add     r12,r10
1151         adc     rdx,0
1152         mov     QWORD[552+rsp],r12
1153
1154         mov     r10,rdx
1155         mov     rax,QWORD[32+rcx]
1156         mul     rbx
1157         add     r13,rax
1158         adc     rdx,0
1159         add     r13,r10
1160         adc     rdx,0
1161
1162         mov     r10,rdx
1163         mov     rax,QWORD[40+rcx]
1164         mul     rbx
1165         add     r14,rax
1166         adc     rdx,0
1167         add     r14,r10
1168         adc     rdx,0
1169
1170         mov     r10,rdx
1171         mov     rax,r8
1172         mul     rbx
1173         add     r15,rax
1174         adc     rdx,0
1175         add     r15,r10
1176         adc     rdx,0
1177
1178         mov     r10,rdx
1179         mov     rax,r9
1180         mul     rbx
1181         add     rsi,rax
1182         adc     rdx,0
1183         add     rsi,r10
1184         adc     rdx,0
1185
1186         mov     r11,rdx
1187
1188
1189
1190
1191         mov     rbx,QWORD[16+rcx]
1192
1193         mov     rax,QWORD[24+rcx]
1194         mul     rbx
1195         add     r13,rax
1196         adc     rdx,0
1197         mov     QWORD[560+rsp],r13
1198
1199         mov     r10,rdx
1200         mov     rax,QWORD[32+rcx]
1201         mul     rbx
1202         add     r14,rax
1203         adc     rdx,0
1204         add     r14,r10
1205         adc     rdx,0
1206         mov     QWORD[568+rsp],r14
1207
1208         mov     r10,rdx
1209         mov     rax,QWORD[40+rcx]
1210         mul     rbx
1211         add     r15,rax
1212         adc     rdx,0
1213         add     r15,r10
1214         adc     rdx,0
1215
1216         mov     r10,rdx
1217         mov     rax,r8
1218         mul     rbx
1219         add     rsi,rax
1220         adc     rdx,0
1221         add     rsi,r10
1222         adc     rdx,0
1223
1224         mov     r10,rdx
1225         mov     rax,r9
1226         mul     rbx
1227         add     r11,rax
1228         adc     rdx,0
1229         add     r11,r10
1230         adc     rdx,0
1231
1232         mov     r12,rdx
1233
1234
1235
1236
1237
1238         mov     rbx,QWORD[24+rcx]
1239
1240         mov     rax,QWORD[32+rcx]
1241         mul     rbx
1242         add     r15,rax
1243         adc     rdx,0
1244         mov     QWORD[576+rsp],r15
1245
1246         mov     r10,rdx
1247         mov     rax,QWORD[40+rcx]
1248         mul     rbx
1249         add     rsi,rax
1250         adc     rdx,0
1251         add     rsi,r10
1252         adc     rdx,0
1253         mov     QWORD[584+rsp],rsi
1254
1255         mov     r10,rdx
1256         mov     rax,r8
1257         mul     rbx
1258         add     r11,rax
1259         adc     rdx,0
1260         add     r11,r10
1261         adc     rdx,0
1262
1263         mov     r10,rdx
1264         mov     rax,r9
1265         mul     rbx
1266         add     r12,rax
1267         adc     rdx,0
1268         add     r12,r10
1269         adc     rdx,0
1270
1271         mov     r15,rdx
1272
1273
1274
1275
1276         mov     rbx,QWORD[32+rcx]
1277
1278         mov     rax,QWORD[40+rcx]
1279         mul     rbx
1280         add     r11,rax
1281         adc     rdx,0
1282         mov     QWORD[592+rsp],r11
1283
1284         mov     r10,rdx
1285         mov     rax,r8
1286         mul     rbx
1287         add     r12,rax
1288         adc     rdx,0
1289         add     r12,r10
1290         adc     rdx,0
1291         mov     QWORD[600+rsp],r12
1292
1293         mov     r10,rdx
1294         mov     rax,r9
1295         mul     rbx
1296         add     r15,rax
1297         adc     rdx,0
1298         add     r15,r10
1299         adc     rdx,0
1300
1301         mov     r11,rdx
1302
1303
1304
1305
1306         mov     rbx,QWORD[40+rcx]
1307
1308         mov     rax,r8
1309         mul     rbx
1310         add     r15,rax
1311         adc     rdx,0
1312         mov     QWORD[608+rsp],r15
1313
1314         mov     r10,rdx
1315         mov     rax,r9
1316         mul     rbx
1317         add     r11,rax
1318         adc     rdx,0
1319         add     r11,r10
1320         adc     rdx,0
1321         mov     QWORD[616+rsp],r11
1322
1323         mov     r12,rdx
1324
1325
1326
1327
1328         mov     rbx,r8
1329
1330         mov     rax,r9
1331         mul     rbx
1332         add     r12,rax
1333         adc     rdx,0
1334         mov     QWORD[624+rsp],r12
1335
1336         mov     QWORD[632+rsp],rdx
1337
1338
1339         mov     r10,QWORD[528+rsp]
1340         mov     r11,QWORD[536+rsp]
1341         mov     r12,QWORD[544+rsp]
1342         mov     r13,QWORD[552+rsp]
1343         mov     r14,QWORD[560+rsp]
1344         mov     r15,QWORD[568+rsp]
1345
1346         mov     rax,QWORD[24+rcx]
1347         mul     rax
1348         mov     rdi,rax
1349         mov     r8,rdx
1350
1351         add     r10,r10
1352         adc     r11,r11
1353         adc     r12,r12
1354         adc     r13,r13
1355         adc     r14,r14
1356         adc     r15,r15
1357         adc     r8,0
1358
1359         mov     rax,QWORD[rcx]
1360         mul     rax
1361         mov     QWORD[520+rsp],rax
1362         mov     rbx,rdx
1363
1364         mov     rax,QWORD[8+rcx]
1365         mul     rax
1366
1367         add     r10,rbx
1368         adc     r11,rax
1369         adc     rdx,0
1370
1371         mov     rbx,rdx
1372         mov     QWORD[528+rsp],r10
1373         mov     QWORD[536+rsp],r11
1374
1375         mov     rax,QWORD[16+rcx]
1376         mul     rax
1377
1378         add     r12,rbx
1379         adc     r13,rax
1380         adc     rdx,0
1381
1382         mov     rbx,rdx
1383
1384         mov     QWORD[544+rsp],r12
1385         mov     QWORD[552+rsp],r13
1386
1387         xor     rbp,rbp
1388         add     r14,rbx
1389         adc     r15,rdi
1390         adc     rbp,0
1391
1392         mov     QWORD[560+rsp],r14
1393         mov     QWORD[568+rsp],r15
1394
1395
1396
1397
1398         mov     r10,QWORD[576+rsp]
1399         mov     r11,QWORD[584+rsp]
1400         mov     r12,QWORD[592+rsp]
1401         mov     r13,QWORD[600+rsp]
1402         mov     r14,QWORD[608+rsp]
1403         mov     r15,QWORD[616+rsp]
1404         mov     rdi,QWORD[624+rsp]
1405         mov     rsi,QWORD[632+rsp]
1406
1407         mov     rax,r9
1408         mul     rax
1409         mov     r9,rax
1410         mov     rbx,rdx
1411
1412         add     r10,r10
1413         adc     r11,r11
1414         adc     r12,r12
1415         adc     r13,r13
1416         adc     r14,r14
1417         adc     r15,r15
1418         adc     rdi,rdi
1419         adc     rsi,rsi
1420         adc     rbx,0
1421
1422         add     r10,rbp
1423
1424         mov     rax,QWORD[32+rcx]
1425         mul     rax
1426
1427         add     r10,r8
1428         adc     r11,rax
1429         adc     rdx,0
1430
1431         mov     rbp,rdx
1432
1433         mov     QWORD[576+rsp],r10
1434         mov     QWORD[584+rsp],r11
1435
1436         mov     rax,QWORD[40+rcx]
1437         mul     rax
1438
1439         add     r12,rbp
1440         adc     r13,rax
1441         adc     rdx,0
1442
1443         mov     rbp,rdx
1444
1445         mov     QWORD[592+rsp],r12
1446         mov     QWORD[600+rsp],r13
1447
1448         mov     rax,QWORD[48+rcx]
1449         mul     rax
1450
1451         add     r14,rbp
1452         adc     r15,rax
1453         adc     rdx,0
1454
1455         mov     QWORD[608+rsp],r14
1456         mov     QWORD[616+rsp],r15
1457
1458         add     rdi,rdx
1459         adc     rsi,r9
1460         adc     rbx,0
1461
1462         mov     QWORD[624+rsp],rdi
1463         mov     QWORD[632+rsp],rsi
1464         mov     QWORD[640+rsp],rbx
1465
1466         jmp     NEAR mont_reduce
1467
1468
1469
1470 global  mod_exp_512
1471
1472 mod_exp_512:
1473         mov     QWORD[8+rsp],rdi        ;WIN64 prologue
1474         mov     QWORD[16+rsp],rsi
1475         mov     rax,rsp
1476 $L$SEH_begin_mod_exp_512:
1477         mov     rdi,rcx
1478         mov     rsi,rdx
1479         mov     rdx,r8
1480         mov     rcx,r9
1481
1482
1483         push    rbp
1484         push    rbx
1485         push    r12
1486         push    r13
1487         push    r14
1488         push    r15
1489
1490
1491         mov     r8,rsp
1492         sub     rsp,2688
1493         and     rsp,-64
1494
1495
1496         mov     QWORD[rsp],r8
1497         mov     QWORD[8+rsp],rdi
1498         mov     QWORD[16+rsp],rsi
1499         mov     QWORD[24+rsp],rcx
1500 $L$body:
1501
1502
1503
1504         pxor    xmm4,xmm4
1505         movdqu  xmm0,XMMWORD[rsi]
1506         movdqu  xmm1,XMMWORD[16+rsi]
1507         movdqu  xmm2,XMMWORD[32+rsi]
1508         movdqu  xmm3,XMMWORD[48+rsi]
1509         movdqa  XMMWORD[512+rsp],xmm4
1510         movdqa  XMMWORD[528+rsp],xmm4
1511         movdqa  XMMWORD[608+rsp],xmm4
1512         movdqa  XMMWORD[624+rsp],xmm4
1513         movdqa  XMMWORD[544+rsp],xmm0
1514         movdqa  XMMWORD[560+rsp],xmm1
1515         movdqa  XMMWORD[576+rsp],xmm2
1516         movdqa  XMMWORD[592+rsp],xmm3
1517
1518
1519         movdqu  xmm0,XMMWORD[rdx]
1520         movdqu  xmm1,XMMWORD[16+rdx]
1521         movdqu  xmm2,XMMWORD[32+rdx]
1522         movdqu  xmm3,XMMWORD[48+rdx]
1523
1524         lea     rbx,[384+rsp]
1525         mov     QWORD[136+rsp],rbx
1526         call    mont_reduce
1527
1528
1529         lea     rcx,[448+rsp]
1530         xor     rax,rax
1531         mov     QWORD[rcx],rax
1532         mov     QWORD[8+rcx],rax
1533         mov     QWORD[24+rcx],rax
1534         mov     QWORD[32+rcx],rax
1535         mov     QWORD[40+rcx],rax
1536         mov     QWORD[48+rcx],rax
1537         mov     QWORD[56+rcx],rax
1538         mov     QWORD[128+rsp],rax
1539         mov     QWORD[16+rcx],1
1540
1541         lea     rbp,[640+rsp]
1542         mov     rsi,rcx
1543         mov     rdi,rbp
1544         mov     rax,8
1545 loop_0:
1546         mov     rbx,QWORD[rcx]
1547         mov     WORD[rdi],bx
1548         shr     rbx,16
1549         mov     WORD[64+rdi],bx
1550         shr     rbx,16
1551         mov     WORD[128+rdi],bx
1552         shr     rbx,16
1553         mov     WORD[192+rdi],bx
1554         lea     rcx,[8+rcx]
1555         lea     rdi,[256+rdi]
1556         dec     rax
1557         jnz     NEAR loop_0
1558         mov     rax,31
1559         mov     QWORD[32+rsp],rax
1560         mov     QWORD[40+rsp],rbp
1561
1562         mov     QWORD[136+rsp],rsi
1563         mov     r10,QWORD[rsi]
1564         mov     r11,QWORD[8+rsi]
1565         mov     r12,QWORD[16+rsi]
1566         mov     r13,QWORD[24+rsi]
1567         mov     r14,QWORD[32+rsi]
1568         mov     r15,QWORD[40+rsi]
1569         mov     r8,QWORD[48+rsi]
1570         mov     r9,QWORD[56+rsi]
1571 init_loop:
1572         lea     rdi,[384+rsp]
1573         call    mont_mul_a3b
1574         lea     rsi,[448+rsp]
1575         mov     rbp,QWORD[40+rsp]
1576         add     rbp,2
1577         mov     QWORD[40+rsp],rbp
1578         mov     rcx,rsi
1579         mov     rax,8
1580 loop_1:
1581         mov     rbx,QWORD[rcx]
1582         mov     WORD[rbp],bx
1583         shr     rbx,16
1584         mov     WORD[64+rbp],bx
1585         shr     rbx,16
1586         mov     WORD[128+rbp],bx
1587         shr     rbx,16
1588         mov     WORD[192+rbp],bx
1589         lea     rcx,[8+rcx]
1590         lea     rbp,[256+rbp]
1591         dec     rax
1592         jnz     NEAR loop_1
1593         mov     rax,QWORD[32+rsp]
1594         sub     rax,1
1595         mov     QWORD[32+rsp],rax
1596         jne     NEAR init_loop
1597
1598
1599
1600         movdqa  XMMWORD[64+rsp],xmm0
1601         movdqa  XMMWORD[80+rsp],xmm1
1602         movdqa  XMMWORD[96+rsp],xmm2
1603         movdqa  XMMWORD[112+rsp],xmm3
1604
1605
1606
1607
1608
1609         mov     eax,DWORD[126+rsp]
1610         mov     rdx,rax
1611         shr     rax,11
1612         and     edx,0x07FF
1613         mov     DWORD[126+rsp],edx
1614         lea     rsi,[640+rax*2+rsp]
1615         mov     rdx,QWORD[8+rsp]
1616         mov     rbp,4
1617 loop_2:
1618         movzx   rbx,WORD[192+rsi]
1619         movzx   rax,WORD[448+rsi]
1620         shl     rbx,16
1621         shl     rax,16
1622         mov     bx,WORD[128+rsi]
1623         mov     ax,WORD[384+rsi]
1624         shl     rbx,16
1625         shl     rax,16
1626         mov     bx,WORD[64+rsi]
1627         mov     ax,WORD[320+rsi]
1628         shl     rbx,16
1629         shl     rax,16
1630         mov     bx,WORD[rsi]
1631         mov     ax,WORD[256+rsi]
1632         mov     QWORD[rdx],rbx
1633         mov     QWORD[8+rdx],rax
1634         lea     rsi,[512+rsi]
1635         lea     rdx,[16+rdx]
1636         sub     rbp,1
1637         jnz     NEAR loop_2
1638         mov     QWORD[48+rsp],505
1639
1640         mov     rcx,QWORD[8+rsp]
1641         mov     QWORD[136+rsp],rcx
1642         mov     r10,QWORD[rcx]
1643         mov     r11,QWORD[8+rcx]
1644         mov     r12,QWORD[16+rcx]
1645         mov     r13,QWORD[24+rcx]
1646         mov     r14,QWORD[32+rcx]
1647         mov     r15,QWORD[40+rcx]
1648         mov     r8,QWORD[48+rcx]
1649         mov     r9,QWORD[56+rcx]
1650         jmp     NEAR sqr_2
1651
1652 main_loop_a3b:
1653         call    sqr_reduce
1654         call    sqr_reduce
1655         call    sqr_reduce
1656 sqr_2:
1657         call    sqr_reduce
1658         call    sqr_reduce
1659
1660
1661
1662         mov     rcx,QWORD[48+rsp]
1663         mov     rax,rcx
1664         shr     rax,4
1665         mov     edx,DWORD[64+rax*2+rsp]
1666         and     rcx,15
1667         shr     rdx,cl
1668         and     rdx,0x1F
1669
1670         lea     rsi,[640+rdx*2+rsp]
1671         lea     rdx,[448+rsp]
1672         mov     rdi,rdx
1673         mov     rbp,4
1674 loop_3:
1675         movzx   rbx,WORD[192+rsi]
1676         movzx   rax,WORD[448+rsi]
1677         shl     rbx,16
1678         shl     rax,16
1679         mov     bx,WORD[128+rsi]
1680         mov     ax,WORD[384+rsi]
1681         shl     rbx,16
1682         shl     rax,16
1683         mov     bx,WORD[64+rsi]
1684         mov     ax,WORD[320+rsi]
1685         shl     rbx,16
1686         shl     rax,16
1687         mov     bx,WORD[rsi]
1688         mov     ax,WORD[256+rsi]
1689         mov     QWORD[rdx],rbx
1690         mov     QWORD[8+rdx],rax
1691         lea     rsi,[512+rsi]
1692         lea     rdx,[16+rdx]
1693         sub     rbp,1
1694         jnz     NEAR loop_3
1695         mov     rsi,QWORD[8+rsp]
1696         call    mont_mul_a3b
1697
1698
1699
1700         mov     rcx,QWORD[48+rsp]
1701         sub     rcx,5
1702         mov     QWORD[48+rsp],rcx
1703         jge     NEAR main_loop_a3b
1704
1705
1706
1707 end_main_loop_a3b:
1708
1709
1710         mov     rdx,QWORD[8+rsp]
1711         pxor    xmm4,xmm4
1712         movdqu  xmm0,XMMWORD[rdx]
1713         movdqu  xmm1,XMMWORD[16+rdx]
1714         movdqu  xmm2,XMMWORD[32+rdx]
1715         movdqu  xmm3,XMMWORD[48+rdx]
1716         movdqa  XMMWORD[576+rsp],xmm4
1717         movdqa  XMMWORD[592+rsp],xmm4
1718         movdqa  XMMWORD[608+rsp],xmm4
1719         movdqa  XMMWORD[624+rsp],xmm4
1720         movdqa  XMMWORD[512+rsp],xmm0
1721         movdqa  XMMWORD[528+rsp],xmm1
1722         movdqa  XMMWORD[544+rsp],xmm2
1723         movdqa  XMMWORD[560+rsp],xmm3
1724         call    mont_reduce
1725
1726
1727
1728         mov     rax,QWORD[8+rsp]
1729         mov     r8,QWORD[rax]
1730         mov     r9,QWORD[8+rax]
1731         mov     r10,QWORD[16+rax]
1732         mov     r11,QWORD[24+rax]
1733         mov     r12,QWORD[32+rax]
1734         mov     r13,QWORD[40+rax]
1735         mov     r14,QWORD[48+rax]
1736         mov     r15,QWORD[56+rax]
1737
1738
1739         mov     rbx,QWORD[24+rsp]
1740         add     rbx,512
1741
1742         sub     r8,QWORD[rbx]
1743         sbb     r9,QWORD[8+rbx]
1744         sbb     r10,QWORD[16+rbx]
1745         sbb     r11,QWORD[24+rbx]
1746         sbb     r12,QWORD[32+rbx]
1747         sbb     r13,QWORD[40+rbx]
1748         sbb     r14,QWORD[48+rbx]
1749         sbb     r15,QWORD[56+rbx]
1750
1751
1752         mov     rsi,QWORD[rax]
1753         mov     rdi,QWORD[8+rax]
1754         mov     rcx,QWORD[16+rax]
1755         mov     rdx,QWORD[24+rax]
1756         cmovnc  rsi,r8
1757         cmovnc  rdi,r9
1758         cmovnc  rcx,r10
1759         cmovnc  rdx,r11
1760         mov     QWORD[rax],rsi
1761         mov     QWORD[8+rax],rdi
1762         mov     QWORD[16+rax],rcx
1763         mov     QWORD[24+rax],rdx
1764
1765         mov     rsi,QWORD[32+rax]
1766         mov     rdi,QWORD[40+rax]
1767         mov     rcx,QWORD[48+rax]
1768         mov     rdx,QWORD[56+rax]
1769         cmovnc  rsi,r12
1770         cmovnc  rdi,r13
1771         cmovnc  rcx,r14
1772         cmovnc  rdx,r15
1773         mov     QWORD[32+rax],rsi
1774         mov     QWORD[40+rax],rdi
1775         mov     QWORD[48+rax],rcx
1776         mov     QWORD[56+rax],rdx
1777
1778         mov     rsi,QWORD[rsp]
1779         mov     r15,QWORD[rsi]
1780         mov     r14,QWORD[8+rsi]
1781         mov     r13,QWORD[16+rsi]
1782         mov     r12,QWORD[24+rsi]
1783         mov     rbx,QWORD[32+rsi]
1784         mov     rbp,QWORD[40+rsi]
1785         lea     rsp,[48+rsi]
1786 $L$epilogue:
1787         mov     rdi,QWORD[8+rsp]        ;WIN64 epilogue
1788         mov     rsi,QWORD[16+rsp]
1789         DB      0F3h,0C3h               ;repret
1790 $L$SEH_end_mod_exp_512:
1791 EXTERN  __imp_RtlVirtualUnwind
1792
1793 ALIGN   16
1794 mod_exp_512_se_handler:
1795         push    rsi
1796         push    rdi
1797         push    rbx
1798         push    rbp
1799         push    r12
1800         push    r13
1801         push    r14
1802         push    r15
1803         pushfq
1804         sub     rsp,64
1805
1806         mov     rax,QWORD[120+r8]
1807         mov     rbx,QWORD[248+r8]
1808
1809         lea     r10,[$L$body]
1810         cmp     rbx,r10
1811         jb      NEAR $L$in_prologue
1812
1813         mov     rax,QWORD[152+r8]
1814
1815         lea     r10,[$L$epilogue]
1816         cmp     rbx,r10
1817         jae     NEAR $L$in_prologue
1818
1819         mov     rax,QWORD[rax]
1820
1821         mov     rbx,QWORD[32+rax]
1822         mov     rbp,QWORD[40+rax]
1823         mov     r12,QWORD[24+rax]
1824         mov     r13,QWORD[16+rax]
1825         mov     r14,QWORD[8+rax]
1826         mov     r15,QWORD[rax]
1827         lea     rax,[48+rax]
1828         mov     QWORD[144+r8],rbx
1829         mov     QWORD[160+r8],rbp
1830         mov     QWORD[216+r8],r12
1831         mov     QWORD[224+r8],r13
1832         mov     QWORD[232+r8],r14
1833         mov     QWORD[240+r8],r15
1834
1835 $L$in_prologue:
1836         mov     rdi,QWORD[8+rax]
1837         mov     rsi,QWORD[16+rax]
1838         mov     QWORD[152+r8],rax
1839         mov     QWORD[168+r8],rsi
1840         mov     QWORD[176+r8],rdi
1841
1842         mov     rdi,QWORD[40+r9]
1843         mov     rsi,r8
1844         mov     ecx,154
1845         DD      0xa548f3fc
1846
1847         mov     rsi,r9
1848         xor     rcx,rcx
1849         mov     rdx,QWORD[8+rsi]
1850         mov     r8,QWORD[rsi]
1851         mov     r9,QWORD[16+rsi]
1852         mov     r10,QWORD[40+rsi]
1853         lea     r11,[56+rsi]
1854         lea     r12,[24+rsi]
1855         mov     QWORD[32+rsp],r10
1856         mov     QWORD[40+rsp],r11
1857         mov     QWORD[48+rsp],r12
1858         mov     QWORD[56+rsp],rcx
1859         call    QWORD[__imp_RtlVirtualUnwind]
1860
1861         mov     eax,1
1862         add     rsp,64
1863         popfq
1864         pop     r15
1865         pop     r14
1866         pop     r13
1867         pop     r12
1868         pop     rbp
1869         pop     rbx
1870         pop     rdi
1871         pop     rsi
1872         DB      0F3h,0C3h               ;repret
1873
1874
1875 section .pdata rdata align=4
1876 ALIGN   4
1877         DD      $L$SEH_begin_mod_exp_512 wrt ..imagebase
1878         DD      $L$SEH_end_mod_exp_512 wrt ..imagebase
1879         DD      $L$SEH_info_mod_exp_512 wrt ..imagebase
1880
1881 section .xdata rdata align=8
1882 ALIGN   8
1883 $L$SEH_info_mod_exp_512:
1884 DB      9,0,0,0
1885         DD      mod_exp_512_se_handler wrt ..imagebase