289 lines
5.1 KiB
NASM
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
|