deps/openssl/asm/x64-win32-masm/bn/modexp512-x86_64.asm

Summary

Maintainability
Test Coverage
OPTION    DOTNAME
.text$    SEGMENT ALIGN(64) 'CODE'


ALIGN    16
MULADD_128x512    PROC PRIVATE
    mov    rax,QWORD PTR[rsi]
    mul    rbp
    add    r8,rax
    adc    rdx,0
    mov    QWORD PTR[rcx],r8
    mov    rbx,rdx

    mov    rax,QWORD PTR[8+rsi]
    mul    rbp
    add    r9,rax
    adc    rdx,0
    add    r9,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[16+rsi]
    mul    rbp
    add    r10,rax
    adc    rdx,0
    add    r10,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[24+rsi]
    mul    rbp
    add    r11,rax
    adc    rdx,0
    add    r11,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[32+rsi]
    mul    rbp
    add    r12,rax
    adc    rdx,0
    add    r12,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[40+rsi]
    mul    rbp
    add    r13,rax
    adc    rdx,0
    add    r13,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[48+rsi]
    mul    rbp
    add    r14,rax
    adc    rdx,0
    add    r14,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[56+rsi]
    mul    rbp
    add    r15,rax
    adc    rdx,0
    add    r15,rbx
    adc    rdx,0
    mov    r8,rdx
    mov    rbp,QWORD PTR[8+rdi]
    mov    rax,QWORD PTR[rsi]
    mul    rbp
    add    r9,rax
    adc    rdx,0
    mov    QWORD PTR[8+rcx],r9
    mov    rbx,rdx

    mov    rax,QWORD PTR[8+rsi]
    mul    rbp
    add    r10,rax
    adc    rdx,0
    add    r10,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[16+rsi]
    mul    rbp
    add    r11,rax
    adc    rdx,0
    add    r11,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[24+rsi]
    mul    rbp
    add    r12,rax
    adc    rdx,0
    add    r12,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[32+rsi]
    mul    rbp
    add    r13,rax
    adc    rdx,0
    add    r13,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[40+rsi]
    mul    rbp
    add    r14,rax
    adc    rdx,0
    add    r14,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[48+rsi]
    mul    rbp
    add    r15,rax
    adc    rdx,0
    add    r15,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[56+rsi]
    mul    rbp
    add    r8,rax
    adc    rdx,0
    add    r8,rbx
    adc    rdx,0
    mov    r9,rdx
    DB    0F3h,0C3h        ;repret
MULADD_128x512    ENDP

ALIGN    16
mont_reduce    PROC PRIVATE
    lea    rdi,QWORD PTR[192+rsp]
    mov    rsi,QWORD PTR[32+rsp]
    add    rsi,576
    lea    rcx,QWORD PTR[520+rsp]

    mov    rbp,QWORD PTR[96+rcx]
    mov    rax,QWORD PTR[rsi]
    mul    rbp
    mov    r8,QWORD PTR[rcx]
    add    r8,rax
    adc    rdx,0
    mov    QWORD PTR[rdi],r8
    mov    rbx,rdx

    mov    rax,QWORD PTR[8+rsi]
    mul    rbp
    mov    r9,QWORD PTR[8+rcx]
    add    r9,rax
    adc    rdx,0
    add    r9,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[16+rsi]
    mul    rbp
    mov    r10,QWORD PTR[16+rcx]
    add    r10,rax
    adc    rdx,0
    add    r10,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[24+rsi]
    mul    rbp
    mov    r11,QWORD PTR[24+rcx]
    add    r11,rax
    adc    rdx,0
    add    r11,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[32+rsi]
    mul    rbp
    mov    r12,QWORD PTR[32+rcx]
    add    r12,rax
    adc    rdx,0
    add    r12,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[40+rsi]
    mul    rbp
    mov    r13,QWORD PTR[40+rcx]
    add    r13,rax
    adc    rdx,0
    add    r13,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[48+rsi]
    mul    rbp
    mov    r14,QWORD PTR[48+rcx]
    add    r14,rax
    adc    rdx,0
    add    r14,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[56+rsi]
    mul    rbp
    mov    r15,QWORD PTR[56+rcx]
    add    r15,rax
    adc    rdx,0
    add    r15,rbx
    adc    rdx,0
    mov    r8,rdx
    mov    rbp,QWORD PTR[104+rcx]
    mov    rax,QWORD PTR[rsi]
    mul    rbp
    add    r9,rax
    adc    rdx,0
    mov    QWORD PTR[8+rdi],r9
    mov    rbx,rdx

    mov    rax,QWORD PTR[8+rsi]
    mul    rbp
    add    r10,rax
    adc    rdx,0
    add    r10,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[16+rsi]
    mul    rbp
    add    r11,rax
    adc    rdx,0
    add    r11,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[24+rsi]
    mul    rbp
    add    r12,rax
    adc    rdx,0
    add    r12,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[32+rsi]
    mul    rbp
    add    r13,rax
    adc    rdx,0
    add    r13,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[40+rsi]
    mul    rbp
    add    r14,rax
    adc    rdx,0
    add    r14,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[48+rsi]
    mul    rbp
    add    r15,rax
    adc    rdx,0
    add    r15,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[56+rsi]
    mul    rbp
    add    r8,rax
    adc    rdx,0
    add    r8,rbx
    adc    rdx,0
    mov    r9,rdx
    mov    rbp,QWORD PTR[112+rcx]
    mov    rax,QWORD PTR[rsi]
    mul    rbp
    add    r10,rax
    adc    rdx,0
    mov    QWORD PTR[16+rdi],r10
    mov    rbx,rdx

    mov    rax,QWORD PTR[8+rsi]
    mul    rbp
    add    r11,rax
    adc    rdx,0
    add    r11,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[16+rsi]
    mul    rbp
    add    r12,rax
    adc    rdx,0
    add    r12,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[24+rsi]
    mul    rbp
    add    r13,rax
    adc    rdx,0
    add    r13,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[32+rsi]
    mul    rbp
    add    r14,rax
    adc    rdx,0
    add    r14,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[40+rsi]
    mul    rbp
    add    r15,rax
    adc    rdx,0
    add    r15,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[48+rsi]
    mul    rbp
    add    r8,rax
    adc    rdx,0
    add    r8,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[56+rsi]
    mul    rbp
    add    r9,rax
    adc    rdx,0
    add    r9,rbx
    adc    rdx,0
    mov    r10,rdx
    mov    rbp,QWORD PTR[120+rcx]
    mov    rax,QWORD PTR[rsi]
    mul    rbp
    add    r11,rax
    adc    rdx,0
    mov    QWORD PTR[24+rdi],r11
    mov    rbx,rdx

    mov    rax,QWORD PTR[8+rsi]
    mul    rbp
    add    r12,rax
    adc    rdx,0
    add    r12,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[16+rsi]
    mul    rbp
    add    r13,rax
    adc    rdx,0
    add    r13,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[24+rsi]
    mul    rbp
    add    r14,rax
    adc    rdx,0
    add    r14,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[32+rsi]
    mul    rbp
    add    r15,rax
    adc    rdx,0
    add    r15,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[40+rsi]
    mul    rbp
    add    r8,rax
    adc    rdx,0
    add    r8,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[48+rsi]
    mul    rbp
    add    r9,rax
    adc    rdx,0
    add    r9,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[56+rsi]
    mul    rbp
    add    r10,rax
    adc    rdx,0
    add    r10,rbx
    adc    rdx,0
    mov    r11,rdx
    xor    rax,rax

    add    r8,QWORD PTR[64+rcx]
    adc    r9,QWORD PTR[72+rcx]
    adc    r10,QWORD PTR[80+rcx]
    adc    r11,QWORD PTR[88+rcx]
    adc    rax,0




    mov    QWORD PTR[64+rdi],r8
    mov    QWORD PTR[72+rdi],r9
    mov    rbp,r10
    mov    QWORD PTR[88+rdi],r11

    mov    QWORD PTR[384+rsp],rax

    mov    r8,QWORD PTR[rdi]
    mov    r9,QWORD PTR[8+rdi]
    mov    r10,QWORD PTR[16+rdi]
    mov    r11,QWORD PTR[24+rdi]








    add    rdi,8*10

    add    rsi,64
    lea    rcx,QWORD PTR[296+rsp]

    call    MULADD_128x512


    mov    rax,QWORD PTR[384+rsp]


    add    r8,QWORD PTR[((-16))+rdi]
    adc    r9,QWORD PTR[((-8))+rdi]
    mov    QWORD PTR[64+rcx],r8
    mov    QWORD PTR[72+rcx],r9

    adc    rax,rax
    mov    QWORD PTR[384+rsp],rax

    lea    rdi,QWORD PTR[192+rsp]
    add    rsi,64





    mov    r8,QWORD PTR[rsi]
    mov    rbx,QWORD PTR[8+rsi]

    mov    rax,QWORD PTR[rcx]
    mul    r8
    mov    rbp,rax
    mov    r9,rdx

    mov    rax,QWORD PTR[8+rcx]
    mul    r8
    add    r9,rax

    mov    rax,QWORD PTR[rcx]
    mul    rbx
    add    r9,rax

    mov    QWORD PTR[8+rdi],r9


    sub    rsi,192

    mov    r8,QWORD PTR[rcx]
    mov    r9,QWORD PTR[8+rcx]

    call    MULADD_128x512





    mov    rax,QWORD PTR[rsi]
    mov    rbx,QWORD PTR[8+rsi]
    mov    rdi,QWORD PTR[16+rsi]
    mov    rdx,QWORD PTR[24+rsi]


    mov    rbp,QWORD PTR[384+rsp]

    add    r8,QWORD PTR[64+rcx]
    adc    r9,QWORD PTR[72+rcx]


    adc    rbp,rbp



    shl    rbp,3
    mov    rcx,QWORD PTR[32+rsp]
    add    rbp,rcx


    xor    rsi,rsi

    add    r10,QWORD PTR[rbp]
    adc    r11,QWORD PTR[64+rbp]
    adc    r12,QWORD PTR[128+rbp]
    adc    r13,QWORD PTR[192+rbp]
    adc    r14,QWORD PTR[256+rbp]
    adc    r15,QWORD PTR[320+rbp]
    adc    r8,QWORD PTR[384+rbp]
    adc    r9,QWORD PTR[448+rbp]



    sbb    rsi,0


    and    rax,rsi
    and    rbx,rsi
    and    rdi,rsi
    and    rdx,rsi

    mov    rbp,1
    sub    r10,rax
    sbb    r11,rbx
    sbb    r12,rdi
    sbb    r13,rdx




    sbb    rbp,0



    add    rcx,512
    mov    rax,QWORD PTR[32+rcx]
    mov    rbx,QWORD PTR[40+rcx]
    mov    rdi,QWORD PTR[48+rcx]
    mov    rdx,QWORD PTR[56+rcx]



    and    rax,rsi
    and    rbx,rsi
    and    rdi,rsi
    and    rdx,rsi



    sub    rbp,1

    sbb    r14,rax
    sbb    r15,rbx
    sbb    r8,rdi
    sbb    r9,rdx



    mov    rsi,QWORD PTR[144+rsp]
    mov    QWORD PTR[rsi],r10
    mov    QWORD PTR[8+rsi],r11
    mov    QWORD PTR[16+rsi],r12
    mov    QWORD PTR[24+rsi],r13
    mov    QWORD PTR[32+rsi],r14
    mov    QWORD PTR[40+rsi],r15
    mov    QWORD PTR[48+rsi],r8
    mov    QWORD PTR[56+rsi],r9

    DB    0F3h,0C3h        ;repret
mont_reduce    ENDP

ALIGN    16
mont_mul_a3b    PROC PRIVATE




    mov    rbp,QWORD PTR[rdi]

    mov    rax,r10
    mul    rbp
    mov    QWORD PTR[520+rsp],rax
    mov    r10,rdx
    mov    rax,r11
    mul    rbp
    add    r10,rax
    adc    rdx,0
    mov    r11,rdx
    mov    rax,r12
    mul    rbp
    add    r11,rax
    adc    rdx,0
    mov    r12,rdx
    mov    rax,r13
    mul    rbp
    add    r12,rax
    adc    rdx,0
    mov    r13,rdx
    mov    rax,r14
    mul    rbp
    add    r13,rax
    adc    rdx,0
    mov    r14,rdx
    mov    rax,r15
    mul    rbp
    add    r14,rax
    adc    rdx,0
    mov    r15,rdx
    mov    rax,r8
    mul    rbp
    add    r15,rax
    adc    rdx,0
    mov    r8,rdx
    mov    rax,r9
    mul    rbp
    add    r8,rax
    adc    rdx,0
    mov    r9,rdx
    mov    rbp,QWORD PTR[8+rdi]
    mov    rax,QWORD PTR[rsi]
    mul    rbp
    add    r10,rax
    adc    rdx,0
    mov    QWORD PTR[528+rsp],r10
    mov    rbx,rdx

    mov    rax,QWORD PTR[8+rsi]
    mul    rbp
    add    r11,rax
    adc    rdx,0
    add    r11,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[16+rsi]
    mul    rbp
    add    r12,rax
    adc    rdx,0
    add    r12,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[24+rsi]
    mul    rbp
    add    r13,rax
    adc    rdx,0
    add    r13,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[32+rsi]
    mul    rbp
    add    r14,rax
    adc    rdx,0
    add    r14,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[40+rsi]
    mul    rbp
    add    r15,rax
    adc    rdx,0
    add    r15,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[48+rsi]
    mul    rbp
    add    r8,rax
    adc    rdx,0
    add    r8,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[56+rsi]
    mul    rbp
    add    r9,rax
    adc    rdx,0
    add    r9,rbx
    adc    rdx,0
    mov    r10,rdx
    mov    rbp,QWORD PTR[16+rdi]
    mov    rax,QWORD PTR[rsi]
    mul    rbp
    add    r11,rax
    adc    rdx,0
    mov    QWORD PTR[536+rsp],r11
    mov    rbx,rdx

    mov    rax,QWORD PTR[8+rsi]
    mul    rbp
    add    r12,rax
    adc    rdx,0
    add    r12,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[16+rsi]
    mul    rbp
    add    r13,rax
    adc    rdx,0
    add    r13,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[24+rsi]
    mul    rbp
    add    r14,rax
    adc    rdx,0
    add    r14,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[32+rsi]
    mul    rbp
    add    r15,rax
    adc    rdx,0
    add    r15,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[40+rsi]
    mul    rbp
    add    r8,rax
    adc    rdx,0
    add    r8,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[48+rsi]
    mul    rbp
    add    r9,rax
    adc    rdx,0
    add    r9,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[56+rsi]
    mul    rbp
    add    r10,rax
    adc    rdx,0
    add    r10,rbx
    adc    rdx,0
    mov    r11,rdx
    mov    rbp,QWORD PTR[24+rdi]
    mov    rax,QWORD PTR[rsi]
    mul    rbp
    add    r12,rax
    adc    rdx,0
    mov    QWORD PTR[544+rsp],r12
    mov    rbx,rdx

    mov    rax,QWORD PTR[8+rsi]
    mul    rbp
    add    r13,rax
    adc    rdx,0
    add    r13,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[16+rsi]
    mul    rbp
    add    r14,rax
    adc    rdx,0
    add    r14,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[24+rsi]
    mul    rbp
    add    r15,rax
    adc    rdx,0
    add    r15,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[32+rsi]
    mul    rbp
    add    r8,rax
    adc    rdx,0
    add    r8,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[40+rsi]
    mul    rbp
    add    r9,rax
    adc    rdx,0
    add    r9,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[48+rsi]
    mul    rbp
    add    r10,rax
    adc    rdx,0
    add    r10,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[56+rsi]
    mul    rbp
    add    r11,rax
    adc    rdx,0
    add    r11,rbx
    adc    rdx,0
    mov    r12,rdx
    mov    rbp,QWORD PTR[32+rdi]
    mov    rax,QWORD PTR[rsi]
    mul    rbp
    add    r13,rax
    adc    rdx,0
    mov    QWORD PTR[552+rsp],r13
    mov    rbx,rdx

    mov    rax,QWORD PTR[8+rsi]
    mul    rbp
    add    r14,rax
    adc    rdx,0
    add    r14,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[16+rsi]
    mul    rbp
    add    r15,rax
    adc    rdx,0
    add    r15,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[24+rsi]
    mul    rbp
    add    r8,rax
    adc    rdx,0
    add    r8,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[32+rsi]
    mul    rbp
    add    r9,rax
    adc    rdx,0
    add    r9,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[40+rsi]
    mul    rbp
    add    r10,rax
    adc    rdx,0
    add    r10,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[48+rsi]
    mul    rbp
    add    r11,rax
    adc    rdx,0
    add    r11,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[56+rsi]
    mul    rbp
    add    r12,rax
    adc    rdx,0
    add    r12,rbx
    adc    rdx,0
    mov    r13,rdx
    mov    rbp,QWORD PTR[40+rdi]
    mov    rax,QWORD PTR[rsi]
    mul    rbp
    add    r14,rax
    adc    rdx,0
    mov    QWORD PTR[560+rsp],r14
    mov    rbx,rdx

    mov    rax,QWORD PTR[8+rsi]
    mul    rbp
    add    r15,rax
    adc    rdx,0
    add    r15,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[16+rsi]
    mul    rbp
    add    r8,rax
    adc    rdx,0
    add    r8,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[24+rsi]
    mul    rbp
    add    r9,rax
    adc    rdx,0
    add    r9,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[32+rsi]
    mul    rbp
    add    r10,rax
    adc    rdx,0
    add    r10,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[40+rsi]
    mul    rbp
    add    r11,rax
    adc    rdx,0
    add    r11,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[48+rsi]
    mul    rbp
    add    r12,rax
    adc    rdx,0
    add    r12,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[56+rsi]
    mul    rbp
    add    r13,rax
    adc    rdx,0
    add    r13,rbx
    adc    rdx,0
    mov    r14,rdx
    mov    rbp,QWORD PTR[48+rdi]
    mov    rax,QWORD PTR[rsi]
    mul    rbp
    add    r15,rax
    adc    rdx,0
    mov    QWORD PTR[568+rsp],r15
    mov    rbx,rdx

    mov    rax,QWORD PTR[8+rsi]
    mul    rbp
    add    r8,rax
    adc    rdx,0
    add    r8,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[16+rsi]
    mul    rbp
    add    r9,rax
    adc    rdx,0
    add    r9,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[24+rsi]
    mul    rbp
    add    r10,rax
    adc    rdx,0
    add    r10,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[32+rsi]
    mul    rbp
    add    r11,rax
    adc    rdx,0
    add    r11,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[40+rsi]
    mul    rbp
    add    r12,rax
    adc    rdx,0
    add    r12,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[48+rsi]
    mul    rbp
    add    r13,rax
    adc    rdx,0
    add    r13,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[56+rsi]
    mul    rbp
    add    r14,rax
    adc    rdx,0
    add    r14,rbx
    adc    rdx,0
    mov    r15,rdx
    mov    rbp,QWORD PTR[56+rdi]
    mov    rax,QWORD PTR[rsi]
    mul    rbp
    add    r8,rax
    adc    rdx,0
    mov    QWORD PTR[576+rsp],r8
    mov    rbx,rdx

    mov    rax,QWORD PTR[8+rsi]
    mul    rbp
    add    r9,rax
    adc    rdx,0
    add    r9,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[16+rsi]
    mul    rbp
    add    r10,rax
    adc    rdx,0
    add    r10,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[24+rsi]
    mul    rbp
    add    r11,rax
    adc    rdx,0
    add    r11,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[32+rsi]
    mul    rbp
    add    r12,rax
    adc    rdx,0
    add    r12,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[40+rsi]
    mul    rbp
    add    r13,rax
    adc    rdx,0
    add    r13,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[48+rsi]
    mul    rbp
    add    r14,rax
    adc    rdx,0
    add    r14,rbx
    adc    rdx,0
    mov    rbx,rdx

    mov    rax,QWORD PTR[56+rsi]
    mul    rbp
    add    r15,rax
    adc    rdx,0
    add    r15,rbx
    adc    rdx,0
    mov    r8,rdx
    mov    QWORD PTR[584+rsp],r9
    mov    QWORD PTR[592+rsp],r10
    mov    QWORD PTR[600+rsp],r11
    mov    QWORD PTR[608+rsp],r12
    mov    QWORD PTR[616+rsp],r13
    mov    QWORD PTR[624+rsp],r14
    mov    QWORD PTR[632+rsp],r15
    mov    QWORD PTR[640+rsp],r8





    jmp    mont_reduce


mont_mul_a3b    ENDP

ALIGN    16
sqr_reduce    PROC PRIVATE
    mov    rcx,QWORD PTR[16+rsp]



    mov    rbx,r10

    mov    rax,r11
    mul    rbx
    mov    QWORD PTR[528+rsp],rax
    mov    r10,rdx
    mov    rax,r12
    mul    rbx
    add    r10,rax
    adc    rdx,0
    mov    r11,rdx
    mov    rax,r13
    mul    rbx
    add    r11,rax
    adc    rdx,0
    mov    r12,rdx
    mov    rax,r14
    mul    rbx
    add    r12,rax
    adc    rdx,0
    mov    r13,rdx
    mov    rax,r15
    mul    rbx
    add    r13,rax
    adc    rdx,0
    mov    r14,rdx
    mov    rax,r8
    mul    rbx
    add    r14,rax
    adc    rdx,0
    mov    r15,rdx
    mov    rax,r9
    mul    rbx
    add    r15,rax
    adc    rdx,0
    mov    rsi,rdx

    mov    QWORD PTR[536+rsp],r10





    mov    rbx,QWORD PTR[8+rcx]

    mov    rax,QWORD PTR[16+rcx]
    mul    rbx
    add    r11,rax
    adc    rdx,0
    mov    QWORD PTR[544+rsp],r11

    mov    r10,rdx
    mov    rax,QWORD PTR[24+rcx]
    mul    rbx
    add    r12,rax
    adc    rdx,0
    add    r12,r10
    adc    rdx,0
    mov    QWORD PTR[552+rsp],r12

    mov    r10,rdx
    mov    rax,QWORD PTR[32+rcx]
    mul    rbx
    add    r13,rax
    adc    rdx,0
    add    r13,r10
    adc    rdx,0

    mov    r10,rdx
    mov    rax,QWORD PTR[40+rcx]
    mul    rbx
    add    r14,rax
    adc    rdx,0
    add    r14,r10
    adc    rdx,0

    mov    r10,rdx
    mov    rax,r8
    mul    rbx
    add    r15,rax
    adc    rdx,0
    add    r15,r10
    adc    rdx,0

    mov    r10,rdx
    mov    rax,r9
    mul    rbx
    add    rsi,rax
    adc    rdx,0
    add    rsi,r10
    adc    rdx,0

    mov    r11,rdx




    mov    rbx,QWORD PTR[16+rcx]

    mov    rax,QWORD PTR[24+rcx]
    mul    rbx
    add    r13,rax
    adc    rdx,0
    mov    QWORD PTR[560+rsp],r13

    mov    r10,rdx
    mov    rax,QWORD PTR[32+rcx]
    mul    rbx
    add    r14,rax
    adc    rdx,0
    add    r14,r10
    adc    rdx,0
    mov    QWORD PTR[568+rsp],r14

    mov    r10,rdx
    mov    rax,QWORD PTR[40+rcx]
    mul    rbx
    add    r15,rax
    adc    rdx,0
    add    r15,r10
    adc    rdx,0

    mov    r10,rdx
    mov    rax,r8
    mul    rbx
    add    rsi,rax
    adc    rdx,0
    add    rsi,r10
    adc    rdx,0

    mov    r10,rdx
    mov    rax,r9
    mul    rbx
    add    r11,rax
    adc    rdx,0
    add    r11,r10
    adc    rdx,0

    mov    r12,rdx





    mov    rbx,QWORD PTR[24+rcx]

    mov    rax,QWORD PTR[32+rcx]
    mul    rbx
    add    r15,rax
    adc    rdx,0
    mov    QWORD PTR[576+rsp],r15

    mov    r10,rdx
    mov    rax,QWORD PTR[40+rcx]
    mul    rbx
    add    rsi,rax
    adc    rdx,0
    add    rsi,r10
    adc    rdx,0
    mov    QWORD PTR[584+rsp],rsi

    mov    r10,rdx
    mov    rax,r8
    mul    rbx
    add    r11,rax
    adc    rdx,0
    add    r11,r10
    adc    rdx,0

    mov    r10,rdx
    mov    rax,r9
    mul    rbx
    add    r12,rax
    adc    rdx,0
    add    r12,r10
    adc    rdx,0

    mov    r15,rdx




    mov    rbx,QWORD PTR[32+rcx]

    mov    rax,QWORD PTR[40+rcx]
    mul    rbx
    add    r11,rax
    adc    rdx,0
    mov    QWORD PTR[592+rsp],r11

    mov    r10,rdx
    mov    rax,r8
    mul    rbx
    add    r12,rax
    adc    rdx,0
    add    r12,r10
    adc    rdx,0
    mov    QWORD PTR[600+rsp],r12

    mov    r10,rdx
    mov    rax,r9
    mul    rbx
    add    r15,rax
    adc    rdx,0
    add    r15,r10
    adc    rdx,0

    mov    r11,rdx




    mov    rbx,QWORD PTR[40+rcx]

    mov    rax,r8
    mul    rbx
    add    r15,rax
    adc    rdx,0
    mov    QWORD PTR[608+rsp],r15

    mov    r10,rdx
    mov    rax,r9
    mul    rbx
    add    r11,rax
    adc    rdx,0
    add    r11,r10
    adc    rdx,0
    mov    QWORD PTR[616+rsp],r11

    mov    r12,rdx




    mov    rbx,r8

    mov    rax,r9
    mul    rbx
    add    r12,rax
    adc    rdx,0
    mov    QWORD PTR[624+rsp],r12

    mov    QWORD PTR[632+rsp],rdx


    mov    r10,QWORD PTR[528+rsp]
    mov    r11,QWORD PTR[536+rsp]
    mov    r12,QWORD PTR[544+rsp]
    mov    r13,QWORD PTR[552+rsp]
    mov    r14,QWORD PTR[560+rsp]
    mov    r15,QWORD PTR[568+rsp]

    mov    rax,QWORD PTR[24+rcx]
    mul    rax
    mov    rdi,rax
    mov    r8,rdx

    add    r10,r10
    adc    r11,r11
    adc    r12,r12
    adc    r13,r13
    adc    r14,r14
    adc    r15,r15
    adc    r8,0

    mov    rax,QWORD PTR[rcx]
    mul    rax
    mov    QWORD PTR[520+rsp],rax
    mov    rbx,rdx

    mov    rax,QWORD PTR[8+rcx]
    mul    rax

    add    r10,rbx
    adc    r11,rax
    adc    rdx,0

    mov    rbx,rdx
    mov    QWORD PTR[528+rsp],r10
    mov    QWORD PTR[536+rsp],r11

    mov    rax,QWORD PTR[16+rcx]
    mul    rax

    add    r12,rbx
    adc    r13,rax
    adc    rdx,0

    mov    rbx,rdx

    mov    QWORD PTR[544+rsp],r12
    mov    QWORD PTR[552+rsp],r13

    xor    rbp,rbp
    add    r14,rbx
    adc    r15,rdi
    adc    rbp,0

    mov    QWORD PTR[560+rsp],r14
    mov    QWORD PTR[568+rsp],r15




    mov    r10,QWORD PTR[576+rsp]
    mov    r11,QWORD PTR[584+rsp]
    mov    r12,QWORD PTR[592+rsp]
    mov    r13,QWORD PTR[600+rsp]
    mov    r14,QWORD PTR[608+rsp]
    mov    r15,QWORD PTR[616+rsp]
    mov    rdi,QWORD PTR[624+rsp]
    mov    rsi,QWORD PTR[632+rsp]

    mov    rax,r9
    mul    rax
    mov    r9,rax
    mov    rbx,rdx

    add    r10,r10
    adc    r11,r11
    adc    r12,r12
    adc    r13,r13
    adc    r14,r14
    adc    r15,r15
    adc    rdi,rdi
    adc    rsi,rsi
    adc    rbx,0

    add    r10,rbp

    mov    rax,QWORD PTR[32+rcx]
    mul    rax

    add    r10,r8
    adc    r11,rax
    adc    rdx,0

    mov    rbp,rdx

    mov    QWORD PTR[576+rsp],r10
    mov    QWORD PTR[584+rsp],r11

    mov    rax,QWORD PTR[40+rcx]
    mul    rax

    add    r12,rbp
    adc    r13,rax
    adc    rdx,0

    mov    rbp,rdx

    mov    QWORD PTR[592+rsp],r12
    mov    QWORD PTR[600+rsp],r13

    mov    rax,QWORD PTR[48+rcx]
    mul    rax

    add    r14,rbp
    adc    r15,rax
    adc    rdx,0

    mov    QWORD PTR[608+rsp],r14
    mov    QWORD PTR[616+rsp],r15

    add    rdi,rdx
    adc    rsi,r9
    adc    rbx,0

    mov    QWORD PTR[624+rsp],rdi
    mov    QWORD PTR[632+rsp],rsi
    mov    QWORD PTR[640+rsp],rbx

    jmp    mont_reduce


sqr_reduce    ENDP
PUBLIC    mod_exp_512

mod_exp_512    PROC PUBLIC
    mov    QWORD PTR[8+rsp],rdi    ;WIN64 prologue
    mov    QWORD PTR[16+rsp],rsi
    mov    rax,rsp
$L$SEH_begin_mod_exp_512::
    mov    rdi,rcx
    mov    rsi,rdx
    mov    rdx,r8
    mov    rcx,r9


    push    rbp
    push    rbx
    push    r12
    push    r13
    push    r14
    push    r15


    mov    r8,rsp
    sub    rsp,2688
    and    rsp,-64


    mov    QWORD PTR[rsp],r8
    mov    QWORD PTR[8+rsp],rdi
    mov    QWORD PTR[16+rsp],rsi
    mov    QWORD PTR[24+rsp],rcx
$L$body::



    pxor    xmm4,xmm4
    movdqu    xmm0,XMMWORD PTR[rsi]
    movdqu    xmm1,XMMWORD PTR[16+rsi]
    movdqu    xmm2,XMMWORD PTR[32+rsi]
    movdqu    xmm3,XMMWORD PTR[48+rsi]
    movdqa    XMMWORD PTR[512+rsp],xmm4
    movdqa    XMMWORD PTR[528+rsp],xmm4
    movdqa    XMMWORD PTR[608+rsp],xmm4
    movdqa    XMMWORD PTR[624+rsp],xmm4
    movdqa    XMMWORD PTR[544+rsp],xmm0
    movdqa    XMMWORD PTR[560+rsp],xmm1
    movdqa    XMMWORD PTR[576+rsp],xmm2
    movdqa    XMMWORD PTR[592+rsp],xmm3


    movdqu    xmm0,XMMWORD PTR[rdx]
    movdqu    xmm1,XMMWORD PTR[16+rdx]
    movdqu    xmm2,XMMWORD PTR[32+rdx]
    movdqu    xmm3,XMMWORD PTR[48+rdx]

    lea    rbx,QWORD PTR[384+rsp]
    mov    QWORD PTR[136+rsp],rbx
    call    mont_reduce


    lea    rcx,QWORD PTR[448+rsp]
    xor    rax,rax
    mov    QWORD PTR[rcx],rax
    mov    QWORD PTR[8+rcx],rax
    mov    QWORD PTR[24+rcx],rax
    mov    QWORD PTR[32+rcx],rax
    mov    QWORD PTR[40+rcx],rax
    mov    QWORD PTR[48+rcx],rax
    mov    QWORD PTR[56+rcx],rax
    mov    QWORD PTR[128+rsp],rax
    mov    QWORD PTR[16+rcx],1

    lea    rbp,QWORD PTR[640+rsp]
    mov    rsi,rcx
    mov    rdi,rbp
    mov    rax,8
loop_0::
    mov    rbx,QWORD PTR[rcx]
    mov    WORD PTR[rdi],bx
    shr    rbx,16
    mov    WORD PTR[64+rdi],bx
    shr    rbx,16
    mov    WORD PTR[128+rdi],bx
    shr    rbx,16
    mov    WORD PTR[192+rdi],bx
    lea    rcx,QWORD PTR[8+rcx]
    lea    rdi,QWORD PTR[256+rdi]
    dec    rax
    jnz    loop_0
    mov    rax,31
    mov    QWORD PTR[32+rsp],rax
    mov    QWORD PTR[40+rsp],rbp

    mov    QWORD PTR[136+rsp],rsi
    mov    r10,QWORD PTR[rsi]
    mov    r11,QWORD PTR[8+rsi]
    mov    r12,QWORD PTR[16+rsi]
    mov    r13,QWORD PTR[24+rsi]
    mov    r14,QWORD PTR[32+rsi]
    mov    r15,QWORD PTR[40+rsi]
    mov    r8,QWORD PTR[48+rsi]
    mov    r9,QWORD PTR[56+rsi]
init_loop::
    lea    rdi,QWORD PTR[384+rsp]
    call    mont_mul_a3b
    lea    rsi,QWORD PTR[448+rsp]
    mov    rbp,QWORD PTR[40+rsp]
    add    rbp,2
    mov    QWORD PTR[40+rsp],rbp
    mov    rcx,rsi
    mov    rax,8
loop_1::
    mov    rbx,QWORD PTR[rcx]
    mov    WORD PTR[rbp],bx
    shr    rbx,16
    mov    WORD PTR[64+rbp],bx
    shr    rbx,16
    mov    WORD PTR[128+rbp],bx
    shr    rbx,16
    mov    WORD PTR[192+rbp],bx
    lea    rcx,QWORD PTR[8+rcx]
    lea    rbp,QWORD PTR[256+rbp]
    dec    rax
    jnz    loop_1
    mov    rax,QWORD PTR[32+rsp]
    sub    rax,1
    mov    QWORD PTR[32+rsp],rax
    jne    init_loop



    movdqa    XMMWORD PTR[64+rsp],xmm0
    movdqa    XMMWORD PTR[80+rsp],xmm1
    movdqa    XMMWORD PTR[96+rsp],xmm2
    movdqa    XMMWORD PTR[112+rsp],xmm3





    mov    eax,DWORD PTR[126+rsp]
    mov    rdx,rax
    shr    rax,11
    and    edx,007FFh
    mov    DWORD PTR[126+rsp],edx
    lea    rsi,QWORD PTR[640+rax*2+rsp]
    mov    rdx,QWORD PTR[8+rsp]
    mov    rbp,4
loop_2::
    movzx    rbx,WORD PTR[192+rsi]
    movzx    rax,WORD PTR[448+rsi]
    shl    rbx,16
    shl    rax,16
    mov    bx,WORD PTR[128+rsi]
    mov    ax,WORD PTR[384+rsi]
    shl    rbx,16
    shl    rax,16
    mov    bx,WORD PTR[64+rsi]
    mov    ax,WORD PTR[320+rsi]
    shl    rbx,16
    shl    rax,16
    mov    bx,WORD PTR[rsi]
    mov    ax,WORD PTR[256+rsi]
    mov    QWORD PTR[rdx],rbx
    mov    QWORD PTR[8+rdx],rax
    lea    rsi,QWORD PTR[512+rsi]
    lea    rdx,QWORD PTR[16+rdx]
    sub    rbp,1
    jnz    loop_2
    mov    QWORD PTR[48+rsp],505

    mov    rcx,QWORD PTR[8+rsp]
    mov    QWORD PTR[136+rsp],rcx
    mov    r10,QWORD PTR[rcx]
    mov    r11,QWORD PTR[8+rcx]
    mov    r12,QWORD PTR[16+rcx]
    mov    r13,QWORD PTR[24+rcx]
    mov    r14,QWORD PTR[32+rcx]
    mov    r15,QWORD PTR[40+rcx]
    mov    r8,QWORD PTR[48+rcx]
    mov    r9,QWORD PTR[56+rcx]
    jmp    sqr_2

main_loop_a3b::
    call    sqr_reduce
    call    sqr_reduce
    call    sqr_reduce
sqr_2::
    call    sqr_reduce
    call    sqr_reduce



    mov    rcx,QWORD PTR[48+rsp]
    mov    rax,rcx
    shr    rax,4
    mov    edx,DWORD PTR[64+rax*2+rsp]
    and    rcx,15
    shr    rdx,cl
    and    rdx,01Fh

    lea    rsi,QWORD PTR[640+rdx*2+rsp]
    lea    rdx,QWORD PTR[448+rsp]
    mov    rdi,rdx
    mov    rbp,4
loop_3::
    movzx    rbx,WORD PTR[192+rsi]
    movzx    rax,WORD PTR[448+rsi]
    shl    rbx,16
    shl    rax,16
    mov    bx,WORD PTR[128+rsi]
    mov    ax,WORD PTR[384+rsi]
    shl    rbx,16
    shl    rax,16
    mov    bx,WORD PTR[64+rsi]
    mov    ax,WORD PTR[320+rsi]
    shl    rbx,16
    shl    rax,16
    mov    bx,WORD PTR[rsi]
    mov    ax,WORD PTR[256+rsi]
    mov    QWORD PTR[rdx],rbx
    mov    QWORD PTR[8+rdx],rax
    lea    rsi,QWORD PTR[512+rsi]
    lea    rdx,QWORD PTR[16+rdx]
    sub    rbp,1
    jnz    loop_3
    mov    rsi,QWORD PTR[8+rsp]
    call    mont_mul_a3b



    mov    rcx,QWORD PTR[48+rsp]
    sub    rcx,5
    mov    QWORD PTR[48+rsp],rcx
    jge    main_loop_a3b



end_main_loop_a3b::


    mov    rdx,QWORD PTR[8+rsp]
    pxor    xmm4,xmm4
    movdqu    xmm0,XMMWORD PTR[rdx]
    movdqu    xmm1,XMMWORD PTR[16+rdx]
    movdqu    xmm2,XMMWORD PTR[32+rdx]
    movdqu    xmm3,XMMWORD PTR[48+rdx]
    movdqa    XMMWORD PTR[576+rsp],xmm4
    movdqa    XMMWORD PTR[592+rsp],xmm4
    movdqa    XMMWORD PTR[608+rsp],xmm4
    movdqa    XMMWORD PTR[624+rsp],xmm4
    movdqa    XMMWORD PTR[512+rsp],xmm0
    movdqa    XMMWORD PTR[528+rsp],xmm1
    movdqa    XMMWORD PTR[544+rsp],xmm2
    movdqa    XMMWORD PTR[560+rsp],xmm3
    call    mont_reduce



    mov    rax,QWORD PTR[8+rsp]
    mov    r8,QWORD PTR[rax]
    mov    r9,QWORD PTR[8+rax]
    mov    r10,QWORD PTR[16+rax]
    mov    r11,QWORD PTR[24+rax]
    mov    r12,QWORD PTR[32+rax]
    mov    r13,QWORD PTR[40+rax]
    mov    r14,QWORD PTR[48+rax]
    mov    r15,QWORD PTR[56+rax]


    mov    rbx,QWORD PTR[24+rsp]
    add    rbx,512

    sub    r8,QWORD PTR[rbx]
    sbb    r9,QWORD PTR[8+rbx]
    sbb    r10,QWORD PTR[16+rbx]
    sbb    r11,QWORD PTR[24+rbx]
    sbb    r12,QWORD PTR[32+rbx]
    sbb    r13,QWORD PTR[40+rbx]
    sbb    r14,QWORD PTR[48+rbx]
    sbb    r15,QWORD PTR[56+rbx]


    mov    rsi,QWORD PTR[rax]
    mov    rdi,QWORD PTR[8+rax]
    mov    rcx,QWORD PTR[16+rax]
    mov    rdx,QWORD PTR[24+rax]
    cmovnc    rsi,r8
    cmovnc    rdi,r9
    cmovnc    rcx,r10
    cmovnc    rdx,r11
    mov    QWORD PTR[rax],rsi
    mov    QWORD PTR[8+rax],rdi
    mov    QWORD PTR[16+rax],rcx
    mov    QWORD PTR[24+rax],rdx

    mov    rsi,QWORD PTR[32+rax]
    mov    rdi,QWORD PTR[40+rax]
    mov    rcx,QWORD PTR[48+rax]
    mov    rdx,QWORD PTR[56+rax]
    cmovnc    rsi,r12
    cmovnc    rdi,r13
    cmovnc    rcx,r14
    cmovnc    rdx,r15
    mov    QWORD PTR[32+rax],rsi
    mov    QWORD PTR[40+rax],rdi
    mov    QWORD PTR[48+rax],rcx
    mov    QWORD PTR[56+rax],rdx

    mov    rsi,QWORD PTR[rsp]
    mov    r15,QWORD PTR[rsi]
    mov    r14,QWORD PTR[8+rsi]
    mov    r13,QWORD PTR[16+rsi]
    mov    r12,QWORD PTR[24+rsi]
    mov    rbx,QWORD PTR[32+rsi]
    mov    rbp,QWORD PTR[40+rsi]
    lea    rsp,QWORD PTR[48+rsi]
$L$epilogue::
    mov    rdi,QWORD PTR[8+rsp]    ;WIN64 epilogue
    mov    rsi,QWORD PTR[16+rsp]
    DB    0F3h,0C3h        ;repret
$L$SEH_end_mod_exp_512::
mod_exp_512    ENDP
EXTERN    __imp_RtlVirtualUnwind:NEAR

ALIGN    16
mod_exp_512_se_handler    PROC PRIVATE
    push    rsi
    push    rdi
    push    rbx
    push    rbp
    push    r12
    push    r13
    push    r14
    push    r15
    pushfq
    sub    rsp,64

    mov    rax,QWORD PTR[120+r8]
    mov    rbx,QWORD PTR[248+r8]

    lea    r10,QWORD PTR[$L$body]
    cmp    rbx,r10
    jb    $L$in_prologue

    mov    rax,QWORD PTR[152+r8]

    lea    r10,QWORD PTR[$L$epilogue]
    cmp    rbx,r10
    jae    $L$in_prologue

    mov    rax,QWORD PTR[rax]

    mov    rbx,QWORD PTR[32+rax]
    mov    rbp,QWORD PTR[40+rax]
    mov    r12,QWORD PTR[24+rax]
    mov    r13,QWORD PTR[16+rax]
    mov    r14,QWORD PTR[8+rax]
    mov    r15,QWORD PTR[rax]
    lea    rax,QWORD PTR[48+rax]
    mov    QWORD PTR[144+r8],rbx
    mov    QWORD PTR[160+r8],rbp
    mov    QWORD PTR[216+r8],r12
    mov    QWORD PTR[224+r8],r13
    mov    QWORD PTR[232+r8],r14
    mov    QWORD PTR[240+r8],r15

$L$in_prologue::
    mov    rdi,QWORD PTR[8+rax]
    mov    rsi,QWORD PTR[16+rax]
    mov    QWORD PTR[152+r8],rax
    mov    QWORD PTR[168+r8],rsi
    mov    QWORD PTR[176+r8],rdi

    mov    rdi,QWORD PTR[40+r9]
    mov    rsi,r8
    mov    ecx,154
    DD    0a548f3fch


    mov    rsi,r9
    xor    rcx,rcx
    mov    rdx,QWORD PTR[8+rsi]
    mov    r8,QWORD PTR[rsi]
    mov    r9,QWORD PTR[16+rsi]
    mov    r10,QWORD PTR[40+rsi]
    lea    r11,QWORD PTR[56+rsi]
    lea    r12,QWORD PTR[24+rsi]
    mov    QWORD PTR[32+rsp],r10
    mov    QWORD PTR[40+rsp],r11
    mov    QWORD PTR[48+rsp],r12
    mov    QWORD PTR[56+rsp],rcx
    call    QWORD PTR[__imp_RtlVirtualUnwind]

    mov    eax,1
    add    rsp,64
    popfq
    pop    r15
    pop    r14
    pop    r13
    pop    r12
    pop    rbp
    pop    rbx
    pop    rdi
    pop    rsi
    DB    0F3h,0C3h        ;repret
mod_exp_512_se_handler    ENDP

.text$    ENDS
.pdata    SEGMENT READONLY ALIGN(4)
ALIGN    4
    DD    imagerel $L$SEH_begin_mod_exp_512
    DD    imagerel $L$SEH_end_mod_exp_512
    DD    imagerel $L$SEH_info_mod_exp_512

.pdata    ENDS
.xdata    SEGMENT READONLY ALIGN(8)
ALIGN    8
$L$SEH_info_mod_exp_512::
DB    9,0,0,0
    DD    imagerel mod_exp_512_se_handler

.xdata    ENDS
END