openssl/crypto/bn/asm/x86nt32.asm
1998-12-21 10:52:47 +00:00

289 lines
5.1 KiB
NASM

TITLE bn_mulw.c
.386P
.model FLAT
PUBLIC _bn_mul_add_word
_TEXT SEGMENT
; File bn_mulw.c
_bn_mul_add_word PROC NEAR
push ebp
push ebx
push esi
push edi
mov edi,DWORD PTR 20[esp] ; r
mov ebx,DWORD PTR 24[esp] ; a
mov ecx,DWORD PTR 32[esp] ; w
xor esi,esi ; c=0
mov ebp,DWORD PTR 28[esp] ; num
shr ebp,2 ; num/4
jz $L666
$L546:
; Round one
mov eax,DWORD PTR [ebx] ; edx:eax = *a * w
mul ecx
add eax,DWORD PTR [edi] ; *r+=ax
adc edx,0
add eax,esi ; edx:eax += c
adc edx,0
mov DWORD PTR [edi],eax ; *r+=ax
mov esi,edx ; c = overflow
; Round two
mov eax,DWORD PTR 4[ebx] ; edx:eax = *a * w
mul ecx
add eax,DWORD PTR 4[edi] ; *r+=ax
adc edx,0
add eax,esi ; edx:eax += c
adc edx,0
mov DWORD PTR 4[edi],eax ; *r+=ax
mov esi,edx ; c = overflow
; Round three
mov eax,DWORD PTR 8[ebx] ; edx:eax = *a * w
mul ecx
add eax,DWORD PTR 8[edi] ; *r+=ax
adc edx,0
add eax,esi ; edx:eax += c
adc edx,0
mov DWORD PTR 8[edi],eax ; *r+=ax
mov esi,edx ; c = overflow
; Round four
mov eax,DWORD PTR 12[ebx] ; edx:eax = *a * w
mul ecx
add eax,DWORD PTR 12[edi] ; *r+=ax
adc edx,0
add eax,esi ; edx:eax += c
adc edx,0
mov DWORD PTR 12[edi],eax ; *r+=ax
mov esi,edx ; c = overflow
add ebx,16
add edi,16
dec ebp
jz $L666
jmp $L546
$L666:
mov ebp,DWORD PTR 28[esp] ; num
and ebp,3 ; num%4
jz $L547
; Round one
mov eax,DWORD PTR [ebx] ; edx:eax = *a * w
mul ecx
add eax,DWORD PTR [edi] ; *r+=ax
adc edx,0
add eax,esi ; edx:eax += c
adc edx,0
mov DWORD PTR [edi],eax ; *r+=ax
mov esi,edx ; c = overflow
dec ebp
jz $L547
; Round two
mov eax,DWORD PTR 4[ebx] ; edx:eax = *a * w
mul ecx
add eax,DWORD PTR 4[edi] ; *r+=ax
adc edx,0
add eax,esi ; edx:eax += c
adc edx,0
mov DWORD PTR 4[edi],eax ; *r+=ax
mov esi,edx ; c = overflow
dec ebp
jz $L547
; Round three
mov eax,DWORD PTR 8[ebx] ; edx:eax = *a * w
mul ecx
add eax,DWORD PTR 8[edi] ; *r+=ax
adc edx,0
add eax,esi ; edx:eax += c
adc edx,0
mov DWORD PTR 8[edi],eax ; *r+=ax
mov esi,edx ; c = overflow
$L547:
mov eax,esi
pop edi
pop esi
pop ebx
pop ebp
ret
_bn_mul_add_word ENDP
_TEXT ENDS
PUBLIC _bn_mul_word
_TEXT SEGMENT
_bn_mul_word PROC NEAR
push ebp
push ebx
push esi
push edi
mov edi,DWORD PTR 20[esp] ; r
mov ebx,DWORD PTR 24[esp] ; a
mov ebp,DWORD PTR 28[esp] ; num
mov ecx,DWORD PTR 32[esp] ; w
xor esi,esi ; c=0
shr ebp,2 ; num/4
jz $L266
$L593:
; Round one
mov eax,DWORD PTR [ebx] ; edx:eax= w * *a
mul ecx
add eax,esi ; edx:eax+=c
adc edx,0
mov DWORD PTR [edi],eax ; *r=eax
mov esi,edx ; c=edx
; Round two
mov eax,DWORD PTR 4[ebx] ; edx:eax= w * *a
mul ecx
add eax,esi ; edx:eax+=c
adc edx,0
mov DWORD PTR 4[edi],eax ; *r=eax
mov esi,edx ; c=edx
; Round three
mov eax,DWORD PTR 8[ebx] ; edx:eax= w * *a
mul ecx
add eax,esi ; edx:eax+=c
adc edx,0
mov DWORD PTR 8[edi],eax ; *r=eax
mov esi,edx ; c=edx
; Round four
mov eax,DWORD PTR 12[ebx] ; edx:eax= w * *a
mul ecx
add eax,esi ; edx:eax+=c
adc edx,0
mov DWORD PTR 12[edi],eax ; *r=eax
mov esi,edx ; c=edx
add ebx,16
add edi,16
dec ebp
jz $L266
jmp $L593
$L266:
mov ebp,DWORD PTR 28[esp] ; num
and ebp,3
jz $L601
; Round one
mov eax,DWORD PTR [ebx] ; edx:eax= w * *a
mul ecx
add eax,esi ; edx:eax+=c
adc edx,0
mov DWORD PTR [edi],eax ; *r=eax
mov esi,edx ; c=edx
dec ebp
jz $L601
; Round two
mov eax,DWORD PTR 4[ebx] ; edx:eax= w * *a
mul ecx
add eax,esi ; edx:eax+=c
adc edx,0
mov DWORD PTR 4[edi],eax ; *r=eax
mov esi,edx ; c=edx
dec ebp
jz $L601
; Round three
mov eax,DWORD PTR 8[ebx] ; edx:eax= w * *a
mul ecx
add eax,esi ; edx:eax+=c
adc edx,0
mov DWORD PTR 8[edi],eax ; *r=eax
mov esi,edx ; c=edx
$L601:
mov eax,esi
pop edi
pop esi
pop ebx
pop ebp
ret
_bn_mul_word ENDP
_TEXT ENDS
PUBLIC _bn_sqr_words
_TEXT SEGMENT
_bn_sqr_words PROC NEAR
push ebx
push esi
push edi
mov esi,DWORD PTR 16[esp] ; r
mov edi,DWORD PTR 20[esp] ; a
mov ebx,DWORD PTR 24[esp] ; num
shr ebx,2 ; num/4
jz $L111
$L640:
; Round 1
mov eax, DWORD PTR [edi]
mul eax ; *a * *a
mov DWORD PTR [esi],eax
mov DWORD PTR 4[esi],edx
; Round 2
mov eax, DWORD PTR 4[edi]
mul eax ; *a * *a
mov DWORD PTR 8[esi],eax
mov DWORD PTR 12[esi],edx
; Round 3
mov eax, DWORD PTR 8[edi]
mul eax ; *a * *a
mov DWORD PTR 16[esi],eax
mov DWORD PTR 20[esi],edx
; Round 4
mov eax, DWORD PTR 12[edi]
mul eax ; *a * *a
mov DWORD PTR 24[esi],eax
mov DWORD PTR 28[esi],edx
add edi,16
add esi,32
dec ebx
jz $L111
jmp $L640
$L111:
mov ebx,DWORD PTR 24[esp] ; num
and ebx,3 ; num%3
jz $L645
; Round 1
mov eax, DWORD PTR [edi]
mul eax ; *a * *a
mov DWORD PTR [esi],eax
mov DWORD PTR 4[esi],edx
dec ebx
jz $L645
; Round 2
mov eax, DWORD PTR 4[edi]
mul eax ; *a * *a
mov DWORD PTR 8[esi],eax
mov DWORD PTR 12[esi],edx
dec ebx
jz $L645
; Round 3
mov eax, DWORD PTR 8[edi]
mul eax ; *a * *a
mov DWORD PTR 16[esi],eax
mov DWORD PTR 20[esi],edx
$L645:
pop edi
pop esi
pop ebx
ret
_bn_sqr_words ENDP
_TEXT ENDS
PUBLIC _bn_div64
_TEXT SEGMENT
_bn_div64 PROC NEAR
mov edx, DWORD PTR 4[esp]
mov eax, DWORD PTR 8[esp]
div DWORD PTR 12[esp]
ret
_bn_div64 ENDP
_TEXT ENDS
END