blob: d3e4a618f94af8c49319bdaa73f6eba934ede1f6 [file] [log] [blame]
OPTION DOTNAME
.text$ SEGMENT ALIGN(256) '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