mirror of https://github.com/lukechilds/node.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
484 lines
9.1 KiB
484 lines
9.1 KiB
TITLE ../openssl/crypto/bn/asm/x86-mont.asm
|
|
IF @Version LT 800
|
|
ECHO MASM version 8.00 or later is strongly recommended.
|
|
ENDIF
|
|
.686
|
|
.XMM
|
|
IF @Version LT 800
|
|
XMMWORD STRUCT 16
|
|
DQ 2 dup (?)
|
|
XMMWORD ENDS
|
|
ENDIF
|
|
|
|
.MODEL FLAT
|
|
OPTION DOTNAME
|
|
IF @Version LT 800
|
|
.text$ SEGMENT PAGE 'CODE'
|
|
ELSE
|
|
.text$ SEGMENT ALIGN(64) 'CODE'
|
|
ENDIF
|
|
;EXTERN _OPENSSL_ia32cap_P:NEAR
|
|
ALIGN 16
|
|
_bn_mul_mont PROC PUBLIC
|
|
$L_bn_mul_mont_begin::
|
|
push ebp
|
|
push ebx
|
|
push esi
|
|
push edi
|
|
xor eax,eax
|
|
mov edi,DWORD PTR 40[esp]
|
|
cmp edi,4
|
|
jl $L000just_leave
|
|
lea esi,DWORD PTR 20[esp]
|
|
lea edx,DWORD PTR 24[esp]
|
|
mov ebp,esp
|
|
add edi,2
|
|
neg edi
|
|
lea esp,DWORD PTR [edi*4+esp-32]
|
|
neg edi
|
|
mov eax,esp
|
|
sub eax,edx
|
|
and eax,2047
|
|
sub esp,eax
|
|
xor edx,esp
|
|
and edx,2048
|
|
xor edx,2048
|
|
sub esp,edx
|
|
and esp,-64
|
|
mov eax,ebp
|
|
sub eax,esp
|
|
and eax,-4096
|
|
$L001page_walk:
|
|
mov edx,DWORD PTR [eax*1+esp]
|
|
sub eax,4096
|
|
DB 46
|
|
jnc $L001page_walk
|
|
mov eax,DWORD PTR [esi]
|
|
mov ebx,DWORD PTR 4[esi]
|
|
mov ecx,DWORD PTR 8[esi]
|
|
mov edx,DWORD PTR 12[esi]
|
|
mov esi,DWORD PTR 16[esi]
|
|
mov esi,DWORD PTR [esi]
|
|
mov DWORD PTR 4[esp],eax
|
|
mov DWORD PTR 8[esp],ebx
|
|
mov DWORD PTR 12[esp],ecx
|
|
mov DWORD PTR 16[esp],edx
|
|
mov DWORD PTR 20[esp],esi
|
|
lea ebx,DWORD PTR [edi-3]
|
|
mov DWORD PTR 24[esp],ebp
|
|
lea eax,DWORD PTR _OPENSSL_ia32cap_P
|
|
bt DWORD PTR [eax],26
|
|
jnc $L002non_sse2
|
|
mov eax,-1
|
|
movd mm7,eax
|
|
mov esi,DWORD PTR 8[esp]
|
|
mov edi,DWORD PTR 12[esp]
|
|
mov ebp,DWORD PTR 16[esp]
|
|
xor edx,edx
|
|
xor ecx,ecx
|
|
movd mm4,DWORD PTR [edi]
|
|
movd mm5,DWORD PTR [esi]
|
|
movd mm3,DWORD PTR [ebp]
|
|
pmuludq mm5,mm4
|
|
movq mm2,mm5
|
|
movq mm0,mm5
|
|
pand mm0,mm7
|
|
pmuludq mm5,QWORD PTR 20[esp]
|
|
pmuludq mm3,mm5
|
|
paddq mm3,mm0
|
|
movd mm1,DWORD PTR 4[ebp]
|
|
movd mm0,DWORD PTR 4[esi]
|
|
psrlq mm2,32
|
|
psrlq mm3,32
|
|
inc ecx
|
|
ALIGN 16
|
|
$L0031st:
|
|
pmuludq mm0,mm4
|
|
pmuludq mm1,mm5
|
|
paddq mm2,mm0
|
|
paddq mm3,mm1
|
|
movq mm0,mm2
|
|
pand mm0,mm7
|
|
movd mm1,DWORD PTR 4[ecx*4+ebp]
|
|
paddq mm3,mm0
|
|
movd mm0,DWORD PTR 4[ecx*4+esi]
|
|
psrlq mm2,32
|
|
movd DWORD PTR 28[ecx*4+esp],mm3
|
|
psrlq mm3,32
|
|
lea ecx,DWORD PTR 1[ecx]
|
|
cmp ecx,ebx
|
|
jl $L0031st
|
|
pmuludq mm0,mm4
|
|
pmuludq mm1,mm5
|
|
paddq mm2,mm0
|
|
paddq mm3,mm1
|
|
movq mm0,mm2
|
|
pand mm0,mm7
|
|
paddq mm3,mm0
|
|
movd DWORD PTR 28[ecx*4+esp],mm3
|
|
psrlq mm2,32
|
|
psrlq mm3,32
|
|
paddq mm3,mm2
|
|
movq QWORD PTR 32[ebx*4+esp],mm3
|
|
inc edx
|
|
$L004outer:
|
|
xor ecx,ecx
|
|
movd mm4,DWORD PTR [edx*4+edi]
|
|
movd mm5,DWORD PTR [esi]
|
|
movd mm6,DWORD PTR 32[esp]
|
|
movd mm3,DWORD PTR [ebp]
|
|
pmuludq mm5,mm4
|
|
paddq mm5,mm6
|
|
movq mm0,mm5
|
|
movq mm2,mm5
|
|
pand mm0,mm7
|
|
pmuludq mm5,QWORD PTR 20[esp]
|
|
pmuludq mm3,mm5
|
|
paddq mm3,mm0
|
|
movd mm6,DWORD PTR 36[esp]
|
|
movd mm1,DWORD PTR 4[ebp]
|
|
movd mm0,DWORD PTR 4[esi]
|
|
psrlq mm2,32
|
|
psrlq mm3,32
|
|
paddq mm2,mm6
|
|
inc ecx
|
|
dec ebx
|
|
$L005inner:
|
|
pmuludq mm0,mm4
|
|
pmuludq mm1,mm5
|
|
paddq mm2,mm0
|
|
paddq mm3,mm1
|
|
movq mm0,mm2
|
|
movd mm6,DWORD PTR 36[ecx*4+esp]
|
|
pand mm0,mm7
|
|
movd mm1,DWORD PTR 4[ecx*4+ebp]
|
|
paddq mm3,mm0
|
|
movd mm0,DWORD PTR 4[ecx*4+esi]
|
|
psrlq mm2,32
|
|
movd DWORD PTR 28[ecx*4+esp],mm3
|
|
psrlq mm3,32
|
|
paddq mm2,mm6
|
|
dec ebx
|
|
lea ecx,DWORD PTR 1[ecx]
|
|
jnz $L005inner
|
|
mov ebx,ecx
|
|
pmuludq mm0,mm4
|
|
pmuludq mm1,mm5
|
|
paddq mm2,mm0
|
|
paddq mm3,mm1
|
|
movq mm0,mm2
|
|
pand mm0,mm7
|
|
paddq mm3,mm0
|
|
movd DWORD PTR 28[ecx*4+esp],mm3
|
|
psrlq mm2,32
|
|
psrlq mm3,32
|
|
movd mm6,DWORD PTR 36[ebx*4+esp]
|
|
paddq mm3,mm2
|
|
paddq mm3,mm6
|
|
movq QWORD PTR 32[ebx*4+esp],mm3
|
|
lea edx,DWORD PTR 1[edx]
|
|
cmp edx,ebx
|
|
jle $L004outer
|
|
emms
|
|
jmp $L006common_tail
|
|
ALIGN 16
|
|
$L002non_sse2:
|
|
mov esi,DWORD PTR 8[esp]
|
|
lea ebp,DWORD PTR 1[ebx]
|
|
mov edi,DWORD PTR 12[esp]
|
|
xor ecx,ecx
|
|
mov edx,esi
|
|
and ebp,1
|
|
sub edx,edi
|
|
lea eax,DWORD PTR 4[ebx*4+edi]
|
|
or ebp,edx
|
|
mov edi,DWORD PTR [edi]
|
|
jz $L007bn_sqr_mont
|
|
mov DWORD PTR 28[esp],eax
|
|
mov eax,DWORD PTR [esi]
|
|
xor edx,edx
|
|
ALIGN 16
|
|
$L008mull:
|
|
mov ebp,edx
|
|
mul edi
|
|
add ebp,eax
|
|
lea ecx,DWORD PTR 1[ecx]
|
|
adc edx,0
|
|
mov eax,DWORD PTR [ecx*4+esi]
|
|
cmp ecx,ebx
|
|
mov DWORD PTR 28[ecx*4+esp],ebp
|
|
jl $L008mull
|
|
mov ebp,edx
|
|
mul edi
|
|
mov edi,DWORD PTR 20[esp]
|
|
add eax,ebp
|
|
mov esi,DWORD PTR 16[esp]
|
|
adc edx,0
|
|
imul edi,DWORD PTR 32[esp]
|
|
mov DWORD PTR 32[ebx*4+esp],eax
|
|
xor ecx,ecx
|
|
mov DWORD PTR 36[ebx*4+esp],edx
|
|
mov DWORD PTR 40[ebx*4+esp],ecx
|
|
mov eax,DWORD PTR [esi]
|
|
mul edi
|
|
add eax,DWORD PTR 32[esp]
|
|
mov eax,DWORD PTR 4[esi]
|
|
adc edx,0
|
|
inc ecx
|
|
jmp $L0092ndmadd
|
|
ALIGN 16
|
|
$L0101stmadd:
|
|
mov ebp,edx
|
|
mul edi
|
|
add ebp,DWORD PTR 32[ecx*4+esp]
|
|
lea ecx,DWORD PTR 1[ecx]
|
|
adc edx,0
|
|
add ebp,eax
|
|
mov eax,DWORD PTR [ecx*4+esi]
|
|
adc edx,0
|
|
cmp ecx,ebx
|
|
mov DWORD PTR 28[ecx*4+esp],ebp
|
|
jl $L0101stmadd
|
|
mov ebp,edx
|
|
mul edi
|
|
add eax,DWORD PTR 32[ebx*4+esp]
|
|
mov edi,DWORD PTR 20[esp]
|
|
adc edx,0
|
|
mov esi,DWORD PTR 16[esp]
|
|
add ebp,eax
|
|
adc edx,0
|
|
imul edi,DWORD PTR 32[esp]
|
|
xor ecx,ecx
|
|
add edx,DWORD PTR 36[ebx*4+esp]
|
|
mov DWORD PTR 32[ebx*4+esp],ebp
|
|
adc ecx,0
|
|
mov eax,DWORD PTR [esi]
|
|
mov DWORD PTR 36[ebx*4+esp],edx
|
|
mov DWORD PTR 40[ebx*4+esp],ecx
|
|
mul edi
|
|
add eax,DWORD PTR 32[esp]
|
|
mov eax,DWORD PTR 4[esi]
|
|
adc edx,0
|
|
mov ecx,1
|
|
ALIGN 16
|
|
$L0092ndmadd:
|
|
mov ebp,edx
|
|
mul edi
|
|
add ebp,DWORD PTR 32[ecx*4+esp]
|
|
lea ecx,DWORD PTR 1[ecx]
|
|
adc edx,0
|
|
add ebp,eax
|
|
mov eax,DWORD PTR [ecx*4+esi]
|
|
adc edx,0
|
|
cmp ecx,ebx
|
|
mov DWORD PTR 24[ecx*4+esp],ebp
|
|
jl $L0092ndmadd
|
|
mov ebp,edx
|
|
mul edi
|
|
add ebp,DWORD PTR 32[ebx*4+esp]
|
|
adc edx,0
|
|
add ebp,eax
|
|
adc edx,0
|
|
mov DWORD PTR 28[ebx*4+esp],ebp
|
|
xor eax,eax
|
|
mov ecx,DWORD PTR 12[esp]
|
|
add edx,DWORD PTR 36[ebx*4+esp]
|
|
adc eax,DWORD PTR 40[ebx*4+esp]
|
|
lea ecx,DWORD PTR 4[ecx]
|
|
mov DWORD PTR 32[ebx*4+esp],edx
|
|
cmp ecx,DWORD PTR 28[esp]
|
|
mov DWORD PTR 36[ebx*4+esp],eax
|
|
je $L006common_tail
|
|
mov edi,DWORD PTR [ecx]
|
|
mov esi,DWORD PTR 8[esp]
|
|
mov DWORD PTR 12[esp],ecx
|
|
xor ecx,ecx
|
|
xor edx,edx
|
|
mov eax,DWORD PTR [esi]
|
|
jmp $L0101stmadd
|
|
ALIGN 16
|
|
$L007bn_sqr_mont:
|
|
mov DWORD PTR [esp],ebx
|
|
mov DWORD PTR 12[esp],ecx
|
|
mov eax,edi
|
|
mul edi
|
|
mov DWORD PTR 32[esp],eax
|
|
mov ebx,edx
|
|
shr edx,1
|
|
and ebx,1
|
|
inc ecx
|
|
ALIGN 16
|
|
$L011sqr:
|
|
mov eax,DWORD PTR [ecx*4+esi]
|
|
mov ebp,edx
|
|
mul edi
|
|
add eax,ebp
|
|
lea ecx,DWORD PTR 1[ecx]
|
|
adc edx,0
|
|
lea ebp,DWORD PTR [eax*2+ebx]
|
|
shr eax,31
|
|
cmp ecx,DWORD PTR [esp]
|
|
mov ebx,eax
|
|
mov DWORD PTR 28[ecx*4+esp],ebp
|
|
jl $L011sqr
|
|
mov eax,DWORD PTR [ecx*4+esi]
|
|
mov ebp,edx
|
|
mul edi
|
|
add eax,ebp
|
|
mov edi,DWORD PTR 20[esp]
|
|
adc edx,0
|
|
mov esi,DWORD PTR 16[esp]
|
|
lea ebp,DWORD PTR [eax*2+ebx]
|
|
imul edi,DWORD PTR 32[esp]
|
|
shr eax,31
|
|
mov DWORD PTR 32[ecx*4+esp],ebp
|
|
lea ebp,DWORD PTR [edx*2+eax]
|
|
mov eax,DWORD PTR [esi]
|
|
shr edx,31
|
|
mov DWORD PTR 36[ecx*4+esp],ebp
|
|
mov DWORD PTR 40[ecx*4+esp],edx
|
|
mul edi
|
|
add eax,DWORD PTR 32[esp]
|
|
mov ebx,ecx
|
|
adc edx,0
|
|
mov eax,DWORD PTR 4[esi]
|
|
mov ecx,1
|
|
ALIGN 16
|
|
$L0123rdmadd:
|
|
mov ebp,edx
|
|
mul edi
|
|
add ebp,DWORD PTR 32[ecx*4+esp]
|
|
adc edx,0
|
|
add ebp,eax
|
|
mov eax,DWORD PTR 4[ecx*4+esi]
|
|
adc edx,0
|
|
mov DWORD PTR 28[ecx*4+esp],ebp
|
|
mov ebp,edx
|
|
mul edi
|
|
add ebp,DWORD PTR 36[ecx*4+esp]
|
|
lea ecx,DWORD PTR 2[ecx]
|
|
adc edx,0
|
|
add ebp,eax
|
|
mov eax,DWORD PTR [ecx*4+esi]
|
|
adc edx,0
|
|
cmp ecx,ebx
|
|
mov DWORD PTR 24[ecx*4+esp],ebp
|
|
jl $L0123rdmadd
|
|
mov ebp,edx
|
|
mul edi
|
|
add ebp,DWORD PTR 32[ebx*4+esp]
|
|
adc edx,0
|
|
add ebp,eax
|
|
adc edx,0
|
|
mov DWORD PTR 28[ebx*4+esp],ebp
|
|
mov ecx,DWORD PTR 12[esp]
|
|
xor eax,eax
|
|
mov esi,DWORD PTR 8[esp]
|
|
add edx,DWORD PTR 36[ebx*4+esp]
|
|
adc eax,DWORD PTR 40[ebx*4+esp]
|
|
mov DWORD PTR 32[ebx*4+esp],edx
|
|
cmp ecx,ebx
|
|
mov DWORD PTR 36[ebx*4+esp],eax
|
|
je $L006common_tail
|
|
mov edi,DWORD PTR 4[ecx*4+esi]
|
|
lea ecx,DWORD PTR 1[ecx]
|
|
mov eax,edi
|
|
mov DWORD PTR 12[esp],ecx
|
|
mul edi
|
|
add eax,DWORD PTR 32[ecx*4+esp]
|
|
adc edx,0
|
|
mov DWORD PTR 32[ecx*4+esp],eax
|
|
xor ebp,ebp
|
|
cmp ecx,ebx
|
|
lea ecx,DWORD PTR 1[ecx]
|
|
je $L013sqrlast
|
|
mov ebx,edx
|
|
shr edx,1
|
|
and ebx,1
|
|
ALIGN 16
|
|
$L014sqradd:
|
|
mov eax,DWORD PTR [ecx*4+esi]
|
|
mov ebp,edx
|
|
mul edi
|
|
add eax,ebp
|
|
lea ebp,DWORD PTR [eax*1+eax]
|
|
adc edx,0
|
|
shr eax,31
|
|
add ebp,DWORD PTR 32[ecx*4+esp]
|
|
lea ecx,DWORD PTR 1[ecx]
|
|
adc eax,0
|
|
add ebp,ebx
|
|
adc eax,0
|
|
cmp ecx,DWORD PTR [esp]
|
|
mov DWORD PTR 28[ecx*4+esp],ebp
|
|
mov ebx,eax
|
|
jle $L014sqradd
|
|
mov ebp,edx
|
|
add edx,edx
|
|
shr ebp,31
|
|
add edx,ebx
|
|
adc ebp,0
|
|
$L013sqrlast:
|
|
mov edi,DWORD PTR 20[esp]
|
|
mov esi,DWORD PTR 16[esp]
|
|
imul edi,DWORD PTR 32[esp]
|
|
add edx,DWORD PTR 32[ecx*4+esp]
|
|
mov eax,DWORD PTR [esi]
|
|
adc ebp,0
|
|
mov DWORD PTR 32[ecx*4+esp],edx
|
|
mov DWORD PTR 36[ecx*4+esp],ebp
|
|
mul edi
|
|
add eax,DWORD PTR 32[esp]
|
|
lea ebx,DWORD PTR [ecx-1]
|
|
adc edx,0
|
|
mov ecx,1
|
|
mov eax,DWORD PTR 4[esi]
|
|
jmp $L0123rdmadd
|
|
ALIGN 16
|
|
$L006common_tail:
|
|
mov ebp,DWORD PTR 16[esp]
|
|
mov edi,DWORD PTR 4[esp]
|
|
lea esi,DWORD PTR 32[esp]
|
|
mov eax,DWORD PTR [esi]
|
|
mov ecx,ebx
|
|
xor edx,edx
|
|
ALIGN 16
|
|
$L015sub:
|
|
sbb eax,DWORD PTR [edx*4+ebp]
|
|
mov DWORD PTR [edx*4+edi],eax
|
|
dec ecx
|
|
mov eax,DWORD PTR 4[edx*4+esi]
|
|
lea edx,DWORD PTR 1[edx]
|
|
jge $L015sub
|
|
sbb eax,0
|
|
and esi,eax
|
|
not eax
|
|
mov ebp,edi
|
|
and ebp,eax
|
|
or esi,ebp
|
|
ALIGN 16
|
|
$L016copy:
|
|
mov eax,DWORD PTR [ebx*4+esi]
|
|
mov DWORD PTR [ebx*4+edi],eax
|
|
mov DWORD PTR 32[ebx*4+esp],ecx
|
|
dec ebx
|
|
jge $L016copy
|
|
mov esp,DWORD PTR 24[esp]
|
|
mov eax,1
|
|
$L000just_leave:
|
|
pop edi
|
|
pop esi
|
|
pop ebx
|
|
pop ebp
|
|
ret
|
|
_bn_mul_mont ENDP
|
|
DB 77,111,110,116,103,111,109,101,114,121,32,77,117,108,116,105
|
|
DB 112,108,105,99,97,116,105,111,110,32,102,111,114,32,120,56
|
|
DB 54,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121
|
|
DB 32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46
|
|
DB 111,114,103,62,0
|
|
.text$ ENDS
|
|
.bss SEGMENT 'BSS'
|
|
COMM _OPENSSL_ia32cap_P:DWORD:4
|
|
.bss ENDS
|
|
END
|
|
|