aboutsummaryrefslogtreecommitdiffstats
path: root/crypto/bn/asm
diff options
context:
space:
mode:
Diffstat (limited to 'crypto/bn/asm')
-rw-r--r--crypto/bn/asm/bn-win32.asm2122
-rw-r--r--crypto/bn/asm/x86w16.asm297
-rw-r--r--crypto/bn/asm/x86w32.asm360
3 files changed, 2779 insertions, 0 deletions
diff --git a/crypto/bn/asm/bn-win32.asm b/crypto/bn/asm/bn-win32.asm
new file mode 100644
index 00000000000..871bd88d77f
--- /dev/null
+++ b/crypto/bn/asm/bn-win32.asm
@@ -0,0 +1,2122 @@
+ ; Don't even think of reading this code
+ ; It was automatically generated by bn-586.pl
+ ; Which is a perl program used to generate the x86 assember for
+ ; any of elf, a.out, BSDI,Win32, or Solaris
+ ;
+ TITLE bn-586.asm
+ .386
+.model FLAT
+_TEXT SEGMENT
+PUBLIC _bn_mul_add_words
+
+_bn_mul_add_words PROC NEAR
+ push ebp
+ push ebx
+ push esi
+ push edi
+ ;
+ xor esi, esi
+ mov edi, DWORD PTR 20[esp]
+ mov ecx, DWORD PTR 28[esp]
+ mov ebx, DWORD PTR 24[esp]
+ and ecx, 4294967288
+ mov ebp, DWORD PTR 32[esp]
+ push ecx
+ jz $L000maw_finish
+L001maw_loop:
+ mov DWORD PTR [esp],ecx
+ ; Round 0
+ mov eax, DWORD PTR [ebx]
+ mul ebp
+ add eax, esi
+ mov esi, DWORD PTR [edi]
+ adc edx, 0
+ add eax, esi
+ adc edx, 0
+ mov DWORD PTR [edi],eax
+ mov esi, edx
+ ; Round 4
+ mov eax, DWORD PTR 4[ebx]
+ mul ebp
+ add eax, esi
+ mov esi, DWORD PTR 4[edi]
+ adc edx, 0
+ add eax, esi
+ adc edx, 0
+ mov DWORD PTR 4[edi],eax
+ mov esi, edx
+ ; Round 8
+ mov eax, DWORD PTR 8[ebx]
+ mul ebp
+ add eax, esi
+ mov esi, DWORD PTR 8[edi]
+ adc edx, 0
+ add eax, esi
+ adc edx, 0
+ mov DWORD PTR 8[edi],eax
+ mov esi, edx
+ ; Round 12
+ mov eax, DWORD PTR 12[ebx]
+ mul ebp
+ add eax, esi
+ mov esi, DWORD PTR 12[edi]
+ adc edx, 0
+ add eax, esi
+ adc edx, 0
+ mov DWORD PTR 12[edi],eax
+ mov esi, edx
+ ; Round 16
+ mov eax, DWORD PTR 16[ebx]
+ mul ebp
+ add eax, esi
+ mov esi, DWORD PTR 16[edi]
+ adc edx, 0
+ add eax, esi
+ adc edx, 0
+ mov DWORD PTR 16[edi],eax
+ mov esi, edx
+ ; Round 20
+ mov eax, DWORD PTR 20[ebx]
+ mul ebp
+ add eax, esi
+ mov esi, DWORD PTR 20[edi]
+ adc edx, 0
+ add eax, esi
+ adc edx, 0
+ mov DWORD PTR 20[edi],eax
+ mov esi, edx
+ ; Round 24
+ mov eax, DWORD PTR 24[ebx]
+ mul ebp
+ add eax, esi
+ mov esi, DWORD PTR 24[edi]
+ adc edx, 0
+ add eax, esi
+ adc edx, 0
+ mov DWORD PTR 24[edi],eax
+ mov esi, edx
+ ; Round 28
+ mov eax, DWORD PTR 28[ebx]
+ mul ebp
+ add eax, esi
+ mov esi, DWORD PTR 28[edi]
+ adc edx, 0
+ add eax, esi
+ adc edx, 0
+ mov DWORD PTR 28[edi],eax
+ mov esi, edx
+ ;
+ mov ecx, DWORD PTR [esp]
+ add ebx, 32
+ add edi, 32
+ sub ecx, 8
+ jnz L001maw_loop
+$L000maw_finish:
+ mov ecx, DWORD PTR 32[esp]
+ and ecx, 7
+ jnz $L002maw_finish2
+ jmp $L003maw_end
+$L002maw_finish2:
+ ; Tail Round 0
+ mov eax, DWORD PTR [ebx]
+ mul ebp
+ add eax, esi
+ mov esi, DWORD PTR [edi]
+ adc edx, 0
+ add eax, esi
+ adc edx, 0
+ dec ecx
+ mov DWORD PTR [edi],eax
+ mov esi, edx
+ jz $L003maw_end
+ ; Tail Round 1
+ mov eax, DWORD PTR 4[ebx]
+ mul ebp
+ add eax, esi
+ mov esi, DWORD PTR 4[edi]
+ adc edx, 0
+ add eax, esi
+ adc edx, 0
+ dec ecx
+ mov DWORD PTR 4[edi],eax
+ mov esi, edx
+ jz $L003maw_end
+ ; Tail Round 2
+ mov eax, DWORD PTR 8[ebx]
+ mul ebp
+ add eax, esi
+ mov esi, DWORD PTR 8[edi]
+ adc edx, 0
+ add eax, esi
+ adc edx, 0
+ dec ecx
+ mov DWORD PTR 8[edi],eax
+ mov esi, edx
+ jz $L003maw_end
+ ; Tail Round 3
+ mov eax, DWORD PTR 12[ebx]
+ mul ebp
+ add eax, esi
+ mov esi, DWORD PTR 12[edi]
+ adc edx, 0
+ add eax, esi
+ adc edx, 0
+ dec ecx
+ mov DWORD PTR 12[edi],eax
+ mov esi, edx
+ jz $L003maw_end
+ ; Tail Round 4
+ mov eax, DWORD PTR 16[ebx]
+ mul ebp
+ add eax, esi
+ mov esi, DWORD PTR 16[edi]
+ adc edx, 0
+ add eax, esi
+ adc edx, 0
+ dec ecx
+ mov DWORD PTR 16[edi],eax
+ mov esi, edx
+ jz $L003maw_end
+ ; Tail Round 5
+ mov eax, DWORD PTR 20[ebx]
+ mul ebp
+ add eax, esi
+ mov esi, DWORD PTR 20[edi]
+ adc edx, 0
+ add eax, esi
+ adc edx, 0
+ dec ecx
+ mov DWORD PTR 20[edi],eax
+ mov esi, edx
+ jz $L003maw_end
+ ; Tail Round 6
+ mov eax, DWORD PTR 24[ebx]
+ mul ebp
+ add eax, esi
+ mov esi, DWORD PTR 24[edi]
+ adc edx, 0
+ add eax, esi
+ adc edx, 0
+ mov DWORD PTR 24[edi],eax
+ mov esi, edx
+$L003maw_end:
+ mov eax, esi
+ pop ecx
+ pop edi
+ pop esi
+ pop ebx
+ pop ebp
+ ret
+_bn_mul_add_words ENDP
+_TEXT ENDS
+_TEXT SEGMENT
+PUBLIC _bn_mul_words
+
+_bn_mul_words PROC NEAR
+ push ebp
+ push ebx
+ push esi
+ push edi
+ ;
+ xor esi, esi
+ mov edi, DWORD PTR 20[esp]
+ mov ebx, DWORD PTR 24[esp]
+ mov ebp, DWORD PTR 28[esp]
+ mov ecx, DWORD PTR 32[esp]
+ and ebp, 4294967288
+ jz $L004mw_finish
+L005mw_loop:
+ ; Round 0
+ mov eax, DWORD PTR [ebx]
+ mul ecx
+ add eax, esi
+ adc edx, 0
+ mov DWORD PTR [edi],eax
+ mov esi, edx
+ ; Round 4
+ mov eax, DWORD PTR 4[ebx]
+ mul ecx
+ add eax, esi
+ adc edx, 0
+ mov DWORD PTR 4[edi],eax
+ mov esi, edx
+ ; Round 8
+ mov eax, DWORD PTR 8[ebx]
+ mul ecx
+ add eax, esi
+ adc edx, 0
+ mov DWORD PTR 8[edi],eax
+ mov esi, edx
+ ; Round 12
+ mov eax, DWORD PTR 12[ebx]
+ mul ecx
+ add eax, esi
+ adc edx, 0
+ mov DWORD PTR 12[edi],eax
+ mov esi, edx
+ ; Round 16
+ mov eax, DWORD PTR 16[ebx]
+ mul ecx
+ add eax, esi
+ adc edx, 0
+ mov DWORD PTR 16[edi],eax
+ mov esi, edx
+ ; Round 20
+ mov eax, DWORD PTR 20[ebx]
+ mul ecx
+ add eax, esi
+ adc edx, 0
+ mov DWORD PTR 20[edi],eax
+ mov esi, edx
+ ; Round 24
+ mov eax, DWORD PTR 24[ebx]
+ mul ecx
+ add eax, esi
+ adc edx, 0
+ mov DWORD PTR 24[edi],eax
+ mov esi, edx
+ ; Round 28
+ mov eax, DWORD PTR 28[ebx]
+ mul ecx
+ add eax, esi
+ adc edx, 0
+ mov DWORD PTR 28[edi],eax
+ mov esi, edx
+ ;
+ add ebx, 32
+ add edi, 32
+ sub ebp, 8
+ jz $L004mw_finish
+ jmp L005mw_loop
+$L004mw_finish:
+ mov ebp, DWORD PTR 28[esp]
+ and ebp, 7
+ jnz $L006mw_finish2
+ jmp $L007mw_end
+$L006mw_finish2:
+ ; Tail Round 0
+ mov eax, DWORD PTR [ebx]
+ mul ecx
+ add eax, esi
+ adc edx, 0
+ mov DWORD PTR [edi],eax
+ mov esi, edx
+ dec ebp
+ jz $L007mw_end
+ ; Tail Round 1
+ mov eax, DWORD PTR 4[ebx]
+ mul ecx
+ add eax, esi
+ adc edx, 0
+ mov DWORD PTR 4[edi],eax
+ mov esi, edx
+ dec ebp
+ jz $L007mw_end
+ ; Tail Round 2
+ mov eax, DWORD PTR 8[ebx]
+ mul ecx
+ add eax, esi
+ adc edx, 0
+ mov DWORD PTR 8[edi],eax
+ mov esi, edx
+ dec ebp
+ jz $L007mw_end
+ ; Tail Round 3
+ mov eax, DWORD PTR 12[ebx]
+ mul ecx
+ add eax, esi
+ adc edx, 0
+ mov DWORD PTR 12[edi],eax
+ mov esi, edx
+ dec ebp
+ jz $L007mw_end
+ ; Tail Round 4
+ mov eax, DWORD PTR 16[ebx]
+ mul ecx
+ add eax, esi
+ adc edx, 0
+ mov DWORD PTR 16[edi],eax
+ mov esi, edx
+ dec ebp
+ jz $L007mw_end
+ ; Tail Round 5
+ mov eax, DWORD PTR 20[ebx]
+ mul ecx
+ add eax, esi
+ adc edx, 0
+ mov DWORD PTR 20[edi],eax
+ mov esi, edx
+ dec ebp
+ jz $L007mw_end
+ ; Tail Round 6
+ mov eax, DWORD PTR 24[ebx]
+ mul ecx
+ add eax, esi
+ adc edx, 0
+ mov DWORD PTR 24[edi],eax
+ mov esi, edx
+$L007mw_end:
+ mov eax, esi
+ pop edi
+ pop esi
+ pop ebx
+ pop ebp
+ ret
+_bn_mul_words ENDP
+_TEXT ENDS
+_TEXT SEGMENT
+PUBLIC _bn_sqr_words
+
+_bn_sqr_words PROC NEAR
+ push ebp
+ push ebx
+ push esi
+ push edi
+ ;
+ mov esi, DWORD PTR 20[esp]
+ mov edi, DWORD PTR 24[esp]
+ mov ebx, DWORD PTR 28[esp]
+ and ebx, 4294967288
+ jz $L008sw_finish
+L009sw_loop:
+ ; Round 0
+ mov eax, DWORD PTR [edi]
+ mul eax
+ mov DWORD PTR [esi],eax
+ mov DWORD PTR 4[esi],edx
+ ; Round 4
+ mov eax, DWORD PTR 4[edi]
+ mul eax
+ mov DWORD PTR 8[esi],eax
+ mov DWORD PTR 12[esi],edx
+ ; Round 8
+ mov eax, DWORD PTR 8[edi]
+ mul eax
+ mov DWORD PTR 16[esi],eax
+ mov DWORD PTR 20[esi],edx
+ ; Round 12
+ mov eax, DWORD PTR 12[edi]
+ mul eax
+ mov DWORD PTR 24[esi],eax
+ mov DWORD PTR 28[esi],edx
+ ; Round 16
+ mov eax, DWORD PTR 16[edi]
+ mul eax
+ mov DWORD PTR 32[esi],eax
+ mov DWORD PTR 36[esi],edx
+ ; Round 20
+ mov eax, DWORD PTR 20[edi]
+ mul eax
+ mov DWORD PTR 40[esi],eax
+ mov DWORD PTR 44[esi],edx
+ ; Round 24
+ mov eax, DWORD PTR 24[edi]
+ mul eax
+ mov DWORD PTR 48[esi],eax
+ mov DWORD PTR 52[esi],edx
+ ; Round 28
+ mov eax, DWORD PTR 28[edi]
+ mul eax
+ mov DWORD PTR 56[esi],eax
+ mov DWORD PTR 60[esi],edx
+ ;
+ add edi, 32
+ add esi, 64
+ sub ebx, 8
+ jnz L009sw_loop
+$L008sw_finish:
+ mov ebx, DWORD PTR 28[esp]
+ and ebx, 7
+ jz $L010sw_end
+ ; Tail Round 0
+ mov eax, DWORD PTR [edi]
+ mul eax
+ mov DWORD PTR [esi],eax
+ dec ebx
+ mov DWORD PTR 4[esi],edx
+ jz $L010sw_end
+ ; Tail Round 1
+ mov eax, DWORD PTR 4[edi]
+ mul eax
+ mov DWORD PTR 8[esi],eax
+ dec ebx
+ mov DWORD PTR 12[esi],edx
+ jz $L010sw_end
+ ; Tail Round 2
+ mov eax, DWORD PTR 8[edi]
+ mul eax
+ mov DWORD PTR 16[esi],eax
+ dec ebx
+ mov DWORD PTR 20[esi],edx
+ jz $L010sw_end
+ ; Tail Round 3
+ mov eax, DWORD PTR 12[edi]
+ mul eax
+ mov DWORD PTR 24[esi],eax
+ dec ebx
+ mov DWORD PTR 28[esi],edx
+ jz $L010sw_end
+ ; Tail Round 4
+ mov eax, DWORD PTR 16[edi]
+ mul eax
+ mov DWORD PTR 32[esi],eax
+ dec ebx
+ mov DWORD PTR 36[esi],edx
+ jz $L010sw_end
+ ; Tail Round 5
+ mov eax, DWORD PTR 20[edi]
+ mul eax
+ mov DWORD PTR 40[esi],eax
+ dec ebx
+ mov DWORD PTR 44[esi],edx
+ jz $L010sw_end
+ ; Tail Round 6
+ mov eax, DWORD PTR 24[edi]
+ mul eax
+ mov DWORD PTR 48[esi],eax
+ mov DWORD PTR 52[esi],edx
+$L010sw_end:
+ pop edi
+ pop esi
+ pop ebx
+ pop ebp
+ ret
+_bn_sqr_words ENDP
+_TEXT ENDS
+_TEXT SEGMENT
+PUBLIC _bn_div_words
+
+_bn_div_words PROC NEAR
+ push ebp
+ push ebx
+ push esi
+ push edi
+ mov edx, DWORD PTR 20[esp]
+ mov eax, DWORD PTR 24[esp]
+ mov ebx, DWORD PTR 28[esp]
+ div ebx
+ pop edi
+ pop esi
+ pop ebx
+ pop ebp
+ ret
+_bn_div_words ENDP
+_TEXT ENDS
+_TEXT SEGMENT
+PUBLIC _bn_add_words
+
+_bn_add_words PROC NEAR
+ push ebp
+ push ebx
+ push esi
+ push edi
+ ;
+ mov ebx, DWORD PTR 20[esp]
+ mov esi, DWORD PTR 24[esp]
+ mov edi, DWORD PTR 28[esp]
+ mov ebp, DWORD PTR 32[esp]
+ xor eax, eax
+ and ebp, 4294967288
+ jz $L011aw_finish
+L012aw_loop:
+ ; Round 0
+ mov ecx, DWORD PTR [esi]
+ mov edx, DWORD PTR [edi]
+ add ecx, eax
+ mov eax, 0
+ adc eax, eax
+ add ecx, edx
+ adc eax, 0
+ mov DWORD PTR [ebx],ecx
+ ; Round 1
+ mov ecx, DWORD PTR 4[esi]
+ mov edx, DWORD PTR 4[edi]
+ add ecx, eax
+ mov eax, 0
+ adc eax, eax
+ add ecx, edx
+ adc eax, 0
+ mov DWORD PTR 4[ebx],ecx
+ ; Round 2
+ mov ecx, DWORD PTR 8[esi]
+ mov edx, DWORD PTR 8[edi]
+ add ecx, eax
+ mov eax, 0
+ adc eax, eax
+ add ecx, edx
+ adc eax, 0
+ mov DWORD PTR 8[ebx],ecx
+ ; Round 3
+ mov ecx, DWORD PTR 12[esi]
+ mov edx, DWORD PTR 12[edi]
+ add ecx, eax
+ mov eax, 0
+ adc eax, eax
+ add ecx, edx
+ adc eax, 0
+ mov DWORD PTR 12[ebx],ecx
+ ; Round 4
+ mov ecx, DWORD PTR 16[esi]
+ mov edx, DWORD PTR 16[edi]
+ add ecx, eax
+ mov eax, 0
+ adc eax, eax
+ add ecx, edx
+ adc eax, 0
+ mov DWORD PTR 16[ebx],ecx
+ ; Round 5
+ mov ecx, DWORD PTR 20[esi]
+ mov edx, DWORD PTR 20[edi]
+ add ecx, eax
+ mov eax, 0
+ adc eax, eax
+ add ecx, edx
+ adc eax, 0
+ mov DWORD PTR 20[ebx],ecx
+ ; Round 6
+ mov ecx, DWORD PTR 24[esi]
+ mov edx, DWORD PTR 24[edi]
+ add ecx, eax
+ mov eax, 0
+ adc eax, eax
+ add ecx, edx
+ adc eax, 0
+ mov DWORD PTR 24[ebx],ecx
+ ; Round 7
+ mov ecx, DWORD PTR 28[esi]
+ mov edx, DWORD PTR 28[edi]
+ add ecx, eax
+ mov eax, 0
+ adc eax, eax
+ add ecx, edx
+ adc eax, 0
+ mov DWORD PTR 28[ebx],ecx
+ ;
+ add esi, 32
+ add edi, 32
+ add ebx, 32
+ sub ebp, 8
+ jnz L012aw_loop
+$L011aw_finish:
+ mov ebp, DWORD PTR 32[esp]
+ and ebp, 7
+ jz $L013aw_end
+ ; Tail Round 0
+ mov ecx, DWORD PTR [esi]
+ mov edx, DWORD PTR [edi]
+ add ecx, eax
+ mov eax, 0
+ adc eax, eax
+ add ecx, edx
+ adc eax, 0
+ dec ebp
+ mov DWORD PTR [ebx],ecx
+ jz $L013aw_end
+ ; Tail Round 1
+ mov ecx, DWORD PTR 4[esi]
+ mov edx, DWORD PTR 4[edi]
+ add ecx, eax
+ mov eax, 0
+ adc eax, eax
+ add ecx, edx
+ adc eax, 0
+ dec ebp
+ mov DWORD PTR 4[ebx],ecx
+ jz $L013aw_end
+ ; Tail Round 2
+ mov ecx, DWORD PTR 8[esi]
+ mov edx, DWORD PTR 8[edi]
+ add ecx, eax
+ mov eax, 0
+ adc eax, eax
+ add ecx, edx
+ adc eax, 0
+ dec ebp
+ mov DWORD PTR 8[ebx],ecx
+ jz $L013aw_end
+ ; Tail Round 3
+ mov ecx, DWORD PTR 12[esi]
+ mov edx, DWORD PTR 12[edi]
+ add ecx, eax
+ mov eax, 0
+ adc eax, eax
+ add ecx, edx
+ adc eax, 0
+ dec ebp
+ mov DWORD PTR 12[ebx],ecx
+ jz $L013aw_end
+ ; Tail Round 4
+ mov ecx, DWORD PTR 16[esi]
+ mov edx, DWORD PTR 16[edi]
+ add ecx, eax
+ mov eax, 0
+ adc eax, eax
+ add ecx, edx
+ adc eax, 0
+ dec ebp
+ mov DWORD PTR 16[ebx],ecx
+ jz $L013aw_end
+ ; Tail Round 5
+ mov ecx, DWORD PTR 20[esi]
+ mov edx, DWORD PTR 20[edi]
+ add ecx, eax
+ mov eax, 0
+ adc eax, eax
+ add ecx, edx
+ adc eax, 0
+ dec ebp
+ mov DWORD PTR 20[ebx],ecx
+ jz $L013aw_end
+ ; Tail Round 6
+ mov ecx, DWORD PTR 24[esi]
+ mov edx, DWORD PTR 24[edi]
+ add ecx, eax
+ mov eax, 0
+ adc eax, eax
+ add ecx, edx
+ adc eax, 0
+ mov DWORD PTR 24[ebx],ecx
+$L013aw_end:
+ pop edi
+ pop esi
+ pop ebx
+ pop ebp
+ ret
+_bn_add_words ENDP
+_TEXT ENDS
+_TEXT SEGMENT
+PUBLIC _bn_sub_words
+
+_bn_sub_words PROC NEAR
+ push ebp
+ push ebx
+ push esi
+ push edi
+ ;
+ mov ebx, DWORD PTR 20[esp]
+ mov esi, DWORD PTR 24[esp]
+ mov edi, DWORD PTR 28[esp]
+ mov ebp, DWORD PTR 32[esp]
+ xor eax, eax
+ and ebp, 4294967288
+ jz $L014aw_finish
+L015aw_loop:
+ ; Round 0
+ mov ecx, DWORD PTR [esi]
+ mov edx, DWORD PTR [edi]
+ sub ecx, eax
+ mov eax, 0
+ adc eax, eax
+ sub ecx, edx
+ adc eax, 0
+ mov DWORD PTR [ebx],ecx
+ ; Round 1
+ mov ecx, DWORD PTR 4[esi]
+ mov edx, DWORD PTR 4[edi]
+ sub ecx, eax
+ mov eax, 0
+ adc eax, eax
+ sub ecx, edx
+ adc eax, 0
+ mov DWORD PTR 4[ebx],ecx
+ ; Round 2
+ mov ecx, DWORD PTR 8[esi]
+ mov edx, DWORD PTR 8[edi]
+ sub ecx, eax
+ mov eax, 0
+ adc eax, eax
+ sub ecx, edx
+ adc eax, 0
+ mov DWORD PTR 8[ebx],ecx
+ ; Round 3
+ mov ecx, DWORD PTR 12[esi]
+ mov edx, DWORD PTR 12[edi]
+ sub ecx, eax
+ mov eax, 0
+ adc eax, eax
+ sub ecx, edx
+ adc eax, 0
+ mov DWORD PTR 12[ebx],ecx
+ ; Round 4
+ mov ecx, DWORD PTR 16[esi]
+ mov edx, DWORD PTR 16[edi]
+ sub ecx, eax
+ mov eax, 0
+ adc eax, eax
+ sub ecx, edx
+ adc eax, 0
+ mov DWORD PTR 16[ebx],ecx
+ ; Round 5
+ mov ecx, DWORD PTR 20[esi]
+ mov edx, DWORD PTR 20[edi]
+ sub ecx, eax
+ mov eax, 0
+ adc eax, eax
+ sub ecx, edx
+ adc eax, 0
+ mov DWORD PTR 20[ebx],ecx
+ ; Round 6
+ mov ecx, DWORD PTR 24[esi]
+ mov edx, DWORD PTR 24[edi]
+ sub ecx, eax
+ mov eax, 0
+ adc eax, eax
+ sub ecx, edx
+ adc eax, 0
+ mov DWORD PTR 24[ebx],ecx
+ ; Round 7
+ mov ecx, DWORD PTR 28[esi]
+ mov edx, DWORD PTR 28[edi]
+ sub ecx, eax
+ mov eax, 0
+ adc eax, eax
+ sub ecx, edx
+ adc eax, 0
+ mov DWORD PTR 28[ebx],ecx
+ ;
+ add esi, 32
+ add edi, 32
+ add ebx, 32
+ sub ebp, 8
+ jnz L015aw_loop
+$L014aw_finish:
+ mov ebp, DWORD PTR 32[esp]
+ and ebp, 7
+ jz $L016aw_end
+ ; Tail Round 0
+ mov ecx, DWORD PTR [esi]
+ mov edx, DWORD PTR [edi]
+ sub ecx, eax
+ mov eax, 0
+ adc eax, eax
+ sub ecx, edx
+ adc eax, 0
+ dec ebp
+ mov DWORD PTR [ebx],ecx
+ jz $L016aw_end
+ ; Tail Round 1
+ mov ecx, DWORD PTR 4[esi]
+ mov edx, DWORD PTR 4[edi]
+ sub ecx, eax
+ mov eax, 0
+ adc eax, eax
+ sub ecx, edx
+ adc eax, 0
+ dec ebp
+ mov DWORD PTR 4[ebx],ecx
+ jz $L016aw_end
+ ; Tail Round 2
+ mov ecx, DWORD PTR 8[esi]
+ mov edx, DWORD PTR 8[edi]
+ sub ecx, eax
+ mov eax, 0
+ adc eax, eax
+ sub ecx, edx
+ adc eax, 0
+ dec ebp
+ mov DWORD PTR 8[ebx],ecx
+ jz $L016aw_end
+ ; Tail Round 3
+ mov ecx, DWORD PTR 12[esi]
+ mov edx, DWORD PTR 12[edi]
+ sub ecx, eax
+ mov eax, 0
+ adc eax, eax
+ sub ecx, edx
+ adc eax, 0
+ dec ebp
+ mov DWORD PTR 12[ebx],ecx
+ jz $L016aw_end
+ ; Tail Round 4
+ mov ecx, DWORD PTR 16[esi]
+ mov edx, DWORD PTR 16[edi]
+ sub ecx, eax
+ mov eax, 0
+ adc eax, eax
+ sub ecx, edx
+ adc eax, 0
+ dec ebp
+ mov DWORD PTR 16[ebx],ecx
+ jz $L016aw_end
+ ; Tail Round 5
+ mov ecx, DWORD PTR 20[esi]
+ mov edx, DWORD PTR 20[edi]
+ sub ecx, eax
+ mov eax, 0
+ adc eax, eax
+ sub ecx, edx
+ adc eax, 0
+ dec ebp
+ mov DWORD PTR 20[ebx],ecx
+ jz $L016aw_end
+ ; Tail Round 6
+ mov ecx, DWORD PTR 24[esi]
+ mov edx, DWORD PTR 24[edi]
+ sub ecx, eax
+ mov eax, 0
+ adc eax, eax
+ sub ecx, edx
+ adc eax, 0
+ mov DWORD PTR 24[ebx],ecx
+$L016aw_end:
+ pop edi
+ pop esi
+ pop ebx
+ pop ebp
+ ret
+_bn_sub_words ENDP
+_TEXT ENDS
+_TEXT SEGMENT
+PUBLIC _bn_mul_comba8
+
+_bn_mul_comba8 PROC NEAR
+ push esi
+ mov esi, DWORD PTR 12[esp]
+ push edi
+ mov edi, DWORD PTR 20[esp]
+ push ebp
+ push ebx
+ xor ebx, ebx
+ mov eax, DWORD PTR [esi]
+ xor ecx, ecx
+ mov edx, DWORD PTR [edi]
+ ; ################## Calculate word 0
+ xor ebp, ebp
+ ; mul a[0]*b[0]
+ mul edx
+ add ebx, eax
+ mov eax, DWORD PTR 20[esp]
+ adc ecx, edx
+ mov edx, DWORD PTR [edi]
+ adc ebp, 0
+ mov DWORD PTR [eax],ebx
+ mov eax, DWORD PTR 4[esi]
+ ; saved r[0]
+ ; ################## Calculate word 1
+ xor ebx, ebx
+ ; mul a[1]*b[0]
+ mul edx
+ add ecx, eax
+ mov eax, DWORD PTR [esi]
+ adc ebp, edx
+ mov edx, DWORD PTR 4[edi]
+ adc ebx, 0
+ ; mul a[0]*b[1]
+ mul edx
+ add ecx, eax
+ mov eax, DWORD PTR 20[esp]
+ adc ebp, edx
+ mov edx, DWORD PTR [edi]
+ adc ebx, 0
+ mov DWORD PTR 4[eax],ecx
+ mov eax, DWORD PTR 8[esi]
+ ; saved r[1]
+ ; ################## Calculate word 2
+ xor ecx, ecx
+ ; mul a[2]*b[0]
+ mul edx
+ add ebp, eax
+ mov eax, DWORD PTR 4[esi]
+ adc ebx, edx
+ mov edx, DWORD PTR 4[edi]
+ adc ecx, 0
+ ; mul a[1]*b[1]
+ mul edx
+ add ebp, eax
+ mov eax, DWORD PTR [esi]
+ adc ebx, edx
+ mov edx, DWORD PTR 8[edi]
+ adc ecx, 0
+ ; mul a[0]*b[2]
+ mul edx
+ add ebp, eax
+ mov eax, DWORD PTR 20[esp]
+ adc ebx, edx
+ mov edx, DWORD PTR [edi]
+ adc ecx, 0
+ mov DWORD PTR 8[eax],ebp
+ mov eax, DWORD PTR 12[esi]
+ ; saved r[2]
+ ; ################## Calculate word 3
+ xor ebp, ebp
+ ; mul a[3]*b[0]
+ mul edx
+ add ebx, eax
+ mov eax, DWORD PTR 8[esi]
+ adc ecx, edx
+ mov edx, DWORD PTR 4[edi]
+ adc ebp, 0
+ ; mul a[2]*b[1]
+ mul edx
+ add ebx, eax
+ mov eax, DWORD PTR 4[esi]
+ adc ecx, edx
+ mov edx, DWORD PTR 8[edi]
+ adc ebp, 0
+ ; mul a[1]*b[2]
+ mul edx
+ add ebx, eax
+ mov eax, DWORD PTR [esi]
+ adc ecx, edx
+ mov edx, DWORD PTR 12[edi]
+ adc ebp, 0
+ ; mul a[0]*b[3]
+ mul edx
+ add ebx, eax
+ mov eax, DWORD PTR 20[esp]
+ adc ecx, edx
+ mov edx, DWORD PTR [edi]
+ adc ebp, 0
+ mov DWORD PTR 12[eax],ebx
+ mov eax, DWORD PTR 16[esi]
+ ; saved r[3]
+ ; ################## Calculate word 4
+ xor ebx, ebx
+ ; mul a[4]*b[0]
+ mul edx
+ add ecx, eax
+ mov eax, DWORD PTR 12[esi]
+ adc ebp, edx
+ mov edx, DWORD PTR 4[edi]
+ adc ebx, 0
+ ; mul a[3]*b[1]
+ mul edx
+ add ecx, eax
+ mov eax, DWORD PTR 8[esi]
+ adc ebp, edx
+ mov edx, DWORD PTR 8[edi]
+ adc ebx, 0
+ ; mul a[2]*b[2]
+ mul edx
+ add ecx, eax
+ mov eax, DWORD PTR 4[esi]
+ adc ebp, edx
+ mov edx, DWORD PTR 12[edi]
+ adc ebx, 0
+ ; mul a[1]*b[3]
+ mul edx
+ add ecx, eax
+ mov eax, DWORD PTR [esi]
+ adc ebp, edx
+ mov edx, DWORD PTR 16[edi]
+ adc ebx, 0
+ ; mul a[0]*b[4]
+ mul edx
+ add ecx, eax
+ mov eax, DWORD PTR 20[esp]
+ adc ebp, edx
+ mov edx, DWORD PTR [edi]
+ adc ebx, 0
+ mov DWORD PTR 16[eax],ecx
+ mov eax, DWORD PTR 20[esi]
+ ; saved r[4]
+ ; ################## Calculate word 5
+ xor ecx, ecx
+ ; mul a[5]*b[0]
+ mul edx
+ add ebp, eax
+ mov eax, DWORD PTR 16[esi]
+ adc ebx, edx
+ mov edx, DWORD PTR 4[edi]
+ adc ecx, 0
+ ; mul a[4]*b[1]
+ mul edx
+ add ebp, eax
+ mov eax, DWORD PTR 12[esi]
+ adc ebx, edx
+ mov edx, DWORD PTR 8[edi]
+ adc ecx, 0
+ ; mul a[3]*b[2]
+ mul edx
+ add ebp, eax
+ mov eax, DWORD PTR 8[esi]
+ adc ebx, edx
+ mov edx, DWORD PTR 12[edi]
+ adc ecx, 0
+ ; mul a[2]*b[3]
+ mul edx
+ add ebp, eax
+ mov eax, DWORD PTR 4[esi]
+ adc ebx, edx
+ mov edx, DWORD PTR 16[edi]
+ adc ecx, 0
+ ; mul a[1]*b[4]
+ mul edx
+ add ebp, eax
+ mov eax, DWORD PTR [esi]
+ adc ebx, edx
+ mov edx, DWORD PTR 20[edi]
+ adc ecx, 0
+ ; mul a[0]*b[5]
+ mul edx
+ add ebp, eax
+ mov eax, DWORD PTR 20[esp]
+ adc ebx, edx
+ mov edx, DWORD PTR [edi]
+ adc ecx, 0
+ mov DWORD PTR 20[eax],ebp
+ mov eax, DWORD PTR 24[esi]
+ ; saved r[5]
+ ; ################## Calculate word 6
+ xor ebp, ebp
+ ; mul a[6]*b[0]
+ mul edx
+ add ebx, eax
+ mov eax, DWORD PTR 20[esi]
+ adc ecx, edx
+ mov edx, DWORD PTR 4[edi]
+ adc ebp, 0
+ ; mul a[5]*b[1]
+ mul edx
+ add ebx, eax
+ mov eax, DWORD PTR 16[esi]
+ adc ecx, edx
+ mov edx, DWORD PTR 8[edi]
+ adc ebp, 0
+ ; mul a[4]*b[2]
+ mul edx
+ add ebx, eax
+ mov eax, DWORD PTR 12[esi]
+ adc ecx, edx
+ mov edx, DWORD PTR 12[edi]
+ adc ebp, 0
+ ; mul a[3]*b[3]
+ mul edx
+ add ebx, eax
+ mov eax, DWORD PTR 8[esi]
+ adc ecx, edx
+ mov edx, DWORD PTR 16[edi]
+ adc ebp, 0
+ ; mul a[2]*b[4]
+ mul edx
+ add ebx, eax
+ mov eax, DWORD PTR 4[esi]
+ adc ecx, edx
+ mov edx, DWORD PTR 20[edi]
+ adc ebp, 0
+ ; mul a[1]*b[5]
+ mul edx
+ add ebx, eax
+ mov eax, DWORD PTR [esi]
+ adc ecx, edx
+ mov edx, DWORD PTR 24[edi]
+ adc ebp, 0
+ ; mul a[0]*b[6]
+ mul edx
+ add ebx, eax
+ mov eax, DWORD PTR 20[esp]
+ adc ecx, edx
+ mov edx, DWORD PTR [edi]
+ adc ebp, 0
+ mov DWORD PTR 24[eax],ebx
+ mov eax, DWORD PTR 28[esi]
+ ; saved r[6]
+ ; ################## Calculate word 7
+ xor ebx, ebx
+ ; mul a[7]*b[0]
+ mul edx
+ add ecx, eax
+ mov eax, DWORD PTR 24[esi]
+ adc ebp, edx
+ mov edx, DWORD PTR 4[edi]
+ adc ebx, 0
+ ; mul a[6]*b[1]
+ mul edx
+ add ecx, eax
+ mov eax, DWORD PTR 20[esi]
+ adc ebp, edx
+ mov edx, DWORD PTR 8[edi]
+ adc ebx, 0
+ ; mul a[5]*b[2]
+ mul edx
+ add ecx, eax
+ mov eax, DWORD PTR 16[esi]
+ adc ebp, edx
+ mov edx, DWORD PTR 12[edi]
+ adc ebx, 0
+ ; mul a[4]*b[3]
+ mul edx
+ add ecx, eax
+ mov eax, DWORD PTR 12[esi]
+ adc ebp, edx
+ mov edx, DWORD PTR 16[edi]
+ adc ebx, 0
+ ; mul a[3]*b[4]
+ mul edx
+ add ecx, eax
+ mov eax, DWORD PTR 8[esi]
+ adc ebp, edx
+ mov edx, DWORD PTR 20[edi]
+ adc ebx, 0
+ ; mul a[2]*b[5]
+ mul edx
+ add ecx, eax
+ mov eax, DWORD PTR 4[esi]
+ adc ebp, edx
+ mov edx, DWORD PTR 24[edi]
+ adc ebx, 0
+ ; mul a[1]*b[6]
+ mul edx
+ add ecx, eax
+ mov eax, DWORD PTR [esi]
+ adc ebp, edx
+ mov edx, DWORD PTR 28[edi]
+ adc ebx, 0
+ ; mul a[0]*b[7]
+ mul edx
+ add ecx, eax
+ mov eax, DWORD PTR 20[esp]
+ adc ebp, edx
+ mov edx, DWORD PTR 4[edi]
+ adc ebx, 0
+ mov DWORD PTR 28[eax],ecx
+ mov eax, DWORD PTR 28[esi]
+ ; saved r[7]
+ ; ################## Calculate word 8
+ xor ecx, ecx
+ ; mul a[7]*b[1]
+ mul edx
+ add ebp, eax
+ mov eax, DWORD PTR 24[esi]
+ adc ebx, edx
+ mov edx, DWORD PTR 8[edi]
+ adc ecx, 0
+ ; mul a[6]*b[2]
+ mul edx
+ add ebp, eax
+ mov eax, DWORD PTR 20[esi]
+ adc ebx, edx
+ mov edx, DWORD PTR 12[edi]
+ adc ecx, 0
+ ; mul a[5]*b[3]
+ mul edx
+ add ebp, eax
+ mov eax, DWORD PTR 16[esi]
+ adc ebx, edx
+ mov edx, DWORD PTR 16[edi]
+ adc ecx, 0
+ ; mul a[4]*b[4]
+ mul edx
+ add ebp, eax
+ mov eax, DWORD PTR 12[esi]
+ adc ebx, edx
+ mov edx, DWORD PTR 20[edi]
+ adc ecx, 0
+ ; mul a[3]*b[5]
+ mul edx
+ add ebp, eax
+ mov eax, DWORD PTR 8[esi]
+ adc ebx, edx
+ mov edx, DWORD PTR 24[edi]
+ adc ecx, 0
+ ; mul a[2]*b[6]
+ mul edx
+ add ebp, eax
+ mov eax, DWORD PTR 4[esi]
+ adc ebx, edx
+ mov edx, DWORD PTR 28[edi]
+ adc ecx, 0
+ ; mul a[1]*b[7]
+ mul edx
+ add ebp, eax
+ mov eax, DWORD PTR 20[esp]
+ adc ebx, edx
+ mov edx, DWORD PTR 8[edi]
+ adc ecx, 0
+ mov DWORD PTR 32[eax],ebp
+ mov eax, DWORD PTR 28[esi]
+ ; saved r[8]
+ ; ################## Calculate word 9
+ xor ebp, ebp
+ ; mul a[7]*b[2]
+ mul edx
+ add ebx, eax
+ mov eax, DWORD PTR 24[esi]
+ adc ecx, edx
+ mov edx, DWORD PTR 12[edi]
+ adc ebp, 0
+ ; mul a[6]*b[3]
+ mul edx
+ add ebx, eax
+ mov eax, DWORD PTR 20[esi]
+ adc ecx, edx
+ mov edx, DWORD PTR 16[edi]
+ adc ebp, 0
+ ; mul a[5]*b[4]
+ mul edx
+ add ebx, eax
+ mov eax, DWORD PTR 16[esi]
+ adc ecx, edx
+ mov edx, DWORD PTR 20[edi]
+ adc ebp, 0
+ ; mul a[4]*b[5]
+ mul edx
+ add ebx, eax
+ mov eax, DWORD PTR 12[esi]
+ adc ecx, edx
+ mov edx, DWORD PTR 24[edi]
+ adc ebp, 0
+ ; mul a[3]*b[6]
+ mul edx
+ add ebx, eax
+ mov eax, DWORD PTR 8[esi]
+ adc ecx, edx
+ mov edx, DWORD PTR 28[edi]
+ adc ebp, 0
+ ; mul a[2]*b[7]
+ mul edx
+ add ebx, eax
+ mov eax, DWORD PTR 20[esp]
+ adc ecx, edx
+ mov edx, DWORD PTR 12[edi]
+ adc ebp, 0
+ mov DWORD PTR 36[eax],ebx
+ mov eax, DWORD PTR 28[esi]
+ ; saved r[9]
+ ; ################## Calculate word 10
+ xor ebx, ebx
+ ; mul a[7]*b[3]
+ mul edx
+ add ecx, eax
+ mov eax, DWORD PTR 24[esi]
+ adc ebp, edx
+ mov edx, DWORD PTR 16[edi]
+ adc ebx, 0
+ ; mul a[6]*b[4]
+ mul edx
+ add ecx, eax
+ mov eax, DWORD PTR 20[esi]
+ adc ebp, edx
+ mov edx, DWORD PTR 20[edi]
+ adc ebx, 0
+ ; mul a[5]*b[5]
+ mul edx
+ add ecx, eax
+ mov eax, DWORD PTR 16[esi]
+ adc ebp, edx
+ mov edx, DWORD PTR 24[edi]
+ adc ebx, 0
+ ; mul a[4]*b[6]
+ mul edx
+ add ecx, eax
+ mov eax, DWORD PTR 12[esi]
+ adc ebp, edx
+ mov edx, DWORD PTR 28[edi]
+ adc ebx, 0
+ ; mul a[3]*b[7]
+ mul edx
+ add ecx, eax
+ mov eax, DWORD PTR 20[esp]
+ adc ebp, edx
+ mov edx, DWORD PTR 16[edi]
+ adc ebx, 0
+ mov DWORD PTR 40[eax],ecx
+ mov eax, DWORD PTR 28[esi]
+ ; saved r[10]
+ ; ################## Calculate word 11
+ xor ecx, ecx
+ ; mul a[7]*b[4]
+ mul edx
+ add ebp, eax
+ mov eax, DWORD PTR 24[esi]
+ adc ebx, edx
+ mov edx, DWORD PTR 20[edi]
+ adc ecx, 0
+ ; mul a[6]*b[5]
+ mul edx
+ add ebp, eax
+ mov eax, DWORD PTR 20[esi]
+ adc ebx, edx
+ mov edx, DWORD PTR 24[edi]
+ adc ecx, 0
+ ; mul a[5]*b[6]
+ mul edx
+ add ebp, eax
+ mov eax, DWORD PTR 16[esi]
+ adc ebx, edx
+ mov edx, DWORD PTR 28[edi]
+ adc ecx, 0
+ ; mul a[4]*b[7]
+ mul edx
+ add ebp, eax
+ mov eax, DWORD PTR 20[esp]
+ adc ebx, edx
+ mov edx, DWORD PTR 20[edi]
+ adc ecx, 0
+ mov DWORD PTR 44[eax],ebp
+ mov eax, DWORD PTR 28[esi]
+ ; saved r[11]
+ ; ################## Calculate word 12
+ xor ebp, ebp
+ ; mul a[7]*b[5]
+ mul edx
+ add ebx, eax
+ mov eax, DWORD PTR 24[esi]
+ adc ecx, edx
+ mov edx, DWORD PTR 24[edi]
+ adc ebp, 0
+ ; mul a[6]*b[6]
+ mul edx
+ add ebx, eax
+ mov eax, DWORD PTR 20[esi]
+ adc ecx, edx
+ mov edx, DWORD PTR 28[edi]
+ adc ebp, 0
+ ; mul a[5]*b[7]
+ mul edx
+ add ebx, eax
+ mov eax, DWORD PTR 20[esp]
+ adc ecx, edx
+ mov edx, DWORD PTR 24[edi]
+ adc ebp, 0
+ mov DWORD PTR 48[eax],ebx
+ mov eax, DWORD PTR 28[esi]
+ ; saved r[12]
+ ; ################## Calculate word 13
+ xor ebx, ebx
+ ; mul a[7]*b[6]
+ mul edx
+ add ecx, eax
+ mov eax, DWORD PTR 24[esi]
+ adc ebp, edx
+ mov edx, DWORD PTR 28[edi]
+ adc ebx, 0
+ ; mul a[6]*b[7]
+ mul edx
+ add ecx, eax
+ mov eax, DWORD PTR 20[esp]
+ adc ebp, edx
+ mov edx, DWORD PTR 28[edi]
+ adc ebx, 0
+ mov DWORD PTR 52[eax],ecx
+ mov eax, DWORD PTR 28[esi]
+ ; saved r[13]
+ ; ################## Calculate word 14
+ xor ecx, ecx
+ ; mul a[7]*b[7]
+ mul edx
+ add ebp, eax
+ mov eax, DWORD PTR 20[esp]
+ adc ebx, edx
+ adc ecx, 0
+ mov DWORD PTR 56[eax],ebp
+ ; saved r[14]
+ ; save r[15]
+ mov DWORD PTR 60[eax],ebx
+ pop ebx
+ pop ebp
+ pop edi
+ pop esi
+ ret
+_bn_mul_comba8 ENDP
+_TEXT ENDS
+_TEXT SEGMENT
+PUBLIC _bn_mul_comba4
+
+_bn_mul_comba4 PROC NEAR
+ push esi
+ mov esi, DWORD PTR 12[esp]
+ push edi
+ mov edi, DWORD PTR 20[esp]
+ push ebp
+ push ebx
+ xor ebx, ebx
+ mov eax, DWORD PTR [esi]
+ xor ecx, ecx
+ mov edx, DWORD PTR [edi]
+ ; ################## Calculate word 0
+ xor ebp, ebp
+ ; mul a[0]*b[0]
+ mul edx
+ add ebx, eax
+ mov eax, DWORD PTR 20[esp]
+ adc ecx, edx
+ mov edx, DWORD PTR [edi]
+ adc ebp, 0
+ mov DWORD PTR [eax],ebx
+ mov eax, DWORD PTR 4[esi]
+ ; saved r[0]
+ ; ################## Calculate word 1
+ xor ebx, ebx
+ ; mul a[1]*b[0]
+ mul edx
+ add ecx, eax
+ mov eax, DWORD PTR [esi]
+ adc ebp, edx
+ mov edx, DWORD PTR 4[edi]
+ adc ebx, 0
+ ; mul a[0]*b[1]
+ mul edx
+ add ecx, eax
+ mov eax, DWORD PTR 20[esp]
+ adc ebp, edx
+ mov edx, DWORD PTR [edi]
+ adc ebx, 0
+ mov DWORD PTR 4[eax],ecx
+ mov eax, DWORD PTR 8[esi]
+ ; saved r[1]
+ ; ################## Calculate word 2
+ xor ecx, ecx
+ ; mul a[2]*b[0]
+ mul edx
+ add ebp, eax
+ mov eax, DWORD PTR 4[esi]
+ adc ebx, edx
+ mov edx, DWORD PTR 4[edi]
+ adc ecx, 0
+ ; mul a[1]*b[1]
+ mul edx
+ add ebp, eax
+ mov eax, DWORD PTR [esi]
+ adc ebx, edx
+ mov edx, DWORD PTR 8[edi]
+ adc ecx, 0
+ ; mul a[0]*b[2]
+ mul edx
+ add ebp, eax
+ mov eax, DWORD PTR 20[esp]
+ adc ebx, edx
+ mov edx, DWORD PTR [edi]
+ adc ecx, 0
+ mov DWORD PTR 8[eax],ebp
+ mov eax, DWORD PTR 12[esi]
+ ; saved r[2]
+ ; ################## Calculate word 3
+ xor ebp, ebp
+ ; mul a[3]*b[0]
+ mul edx
+ add ebx, eax
+ mov eax, DWORD PTR 8[esi]
+ adc ecx, edx
+ mov edx, DWORD PTR 4[edi]
+ adc ebp, 0
+ ; mul a[2]*b[1]
+ mul edx
+ add ebx, eax
+ mov eax, DWORD PTR 4[esi]
+ adc ecx, edx
+ mov edx, DWORD PTR 8[edi]
+ adc ebp, 0
+ ; mul a[1]*b[2]
+ mul edx
+ add ebx, eax
+ mov eax, DWORD PTR [esi]
+ adc ecx, edx
+ mov edx, DWORD PTR 12[edi]
+ adc ebp, 0
+ ; mul a[0]*b[3]
+ mul edx
+ add ebx, eax
+ mov eax, DWORD PTR 20[esp]
+ adc ecx, edx
+ mov edx, DWORD PTR 4[edi]
+ adc ebp, 0
+ mov DWORD PTR 12[eax],ebx
+ mov eax, DWORD PTR 12[esi]
+ ; saved r[3]
+ ; ################## Calculate word 4
+ xor ebx, ebx
+ ; mul a[3]*b[1]
+ mul edx
+ add ecx, eax
+ mov eax, DWORD PTR 8[esi]
+ adc ebp, edx
+ mov edx, DWORD PTR 8[edi]
+ adc ebx, 0
+ ; mul a[2]*b[2]
+ mul edx
+ add ecx, eax
+ mov eax, DWORD PTR 4[esi]
+ adc ebp, edx
+ mov edx, DWORD PTR 12[edi]
+ adc ebx, 0
+ ; mul a[1]*b[3]
+ mul edx
+ add ecx, eax
+ mov eax, DWORD PTR 20[esp]
+ adc ebp, edx
+ mov edx, DWORD PTR 8[edi]
+ adc ebx, 0
+ mov DWORD PTR 16[eax],ecx
+ mov eax, DWORD PTR 12[esi]
+ ; saved r[4]
+ ; ################## Calculate word 5
+ xor ecx, ecx
+ ; mul a[3]*b[2]
+ mul edx
+ add ebp, eax
+ mov eax, DWORD PTR 8[esi]
+ adc ebx, edx
+ mov edx, DWORD PTR 12[edi]
+ adc ecx, 0
+ ; mul a[2]*b[3]
+ mul edx
+ add ebp, eax
+ mov eax, DWORD PTR 20[esp]
+ adc ebx, edx
+ mov edx, DWORD PTR 12[edi]
+ adc ecx, 0
+ mov DWORD PTR 20[eax],ebp
+ mov eax, DWORD PTR 12[esi]
+ ; saved r[5]
+ ; ################## Calculate word 6
+ xor ebp, ebp
+ ; mul a[3]*b[3]
+ mul edx
+ add ebx, eax
+ mov eax, DWORD PTR 20[esp]
+ adc ecx, edx
+ adc ebp, 0
+ mov DWORD PTR 24[eax],ebx
+ ; saved r[6]
+ ; save r[7]
+ mov DWORD PTR 28[eax],ecx
+ pop ebx
+ pop ebp
+ pop edi
+ pop esi
+ ret
+_bn_mul_comba4 ENDP
+_TEXT ENDS
+_TEXT SEGMENT
+PUBLIC _bn_sqr_comba8
+
+_bn_sqr_comba8 PROC NEAR
+ push esi
+ push edi
+ push ebp
+ push ebx
+ mov edi, DWORD PTR 20[esp]
+ mov esi, DWORD PTR 24[esp]
+ xor ebx, ebx
+ xor ecx, ecx
+ mov eax, DWORD PTR [esi]
+ ; ############### Calculate word 0
+ xor ebp, ebp
+ ; sqr a[0]*a[0]
+ mul eax
+ add ebx, eax
+ adc ecx, edx
+ mov edx, DWORD PTR [esi]
+ adc ebp, 0
+ mov DWORD PTR [edi],ebx
+ mov eax, DWORD PTR 4[esi]
+ ; saved r[0]
+ ; ############### Calculate word 1
+ xor ebx, ebx
+ ; sqr a[1]*a[0]
+ mul edx
+ add eax, eax
+ adc edx, edx
+ adc ebx, 0
+ add ecx, eax
+ adc ebp, edx
+ mov eax, DWORD PTR 8[esi]
+ adc ebx, 0
+ mov DWORD PTR 4[edi],ecx
+ mov edx, DWORD PTR [esi]
+ ; saved r[1]
+ ; ############### Calculate word 2
+ xor ecx, ecx
+ ; sqr a[2]*a[0]
+ mul edx
+ add eax, eax
+ adc edx, edx
+ adc ecx, 0
+ add ebp, eax
+ adc ebx, edx
+ mov eax, DWORD PTR 4[esi]
+ adc ecx, 0
+ ; sqr a[1]*a[1]
+ mul eax
+ add ebp, eax
+ adc ebx, edx
+ mov edx, DWORD PTR [esi]
+ adc ecx, 0
+ mov DWORD PTR 8[edi],ebp
+ mov eax, DWORD PTR 12[esi]
+ ; saved r[2]
+ ; ############### Calculate word 3
+ xor ebp, ebp
+ ; sqr a[3]*a[0]
+ mul edx
+ add eax, eax
+ adc edx, edx
+ adc ebp, 0
+ add ebx, eax
+ adc ecx, edx
+ mov eax, DWORD PTR 8[esi]
+ adc ebp, 0
+ mov edx, DWORD PTR 4[esi]
+ ; sqr a[2]*a[1]
+ mul edx
+ add eax, eax
+ adc edx, edx
+ adc ebp, 0
+ add ebx, eax
+ adc ecx, edx
+ mov eax, DWORD PTR 16[esi]
+ adc ebp, 0
+ mov DWORD PTR 12[edi],ebx
+ mov edx, DWORD PTR [esi]
+ ; saved r[3]
+ ; ############### Calculate word 4
+ xor ebx, ebx
+ ; sqr a[4]*a[0]
+ mul edx
+ add eax, eax
+ adc edx, edx
+ adc ebx, 0
+ add ecx, eax
+ adc ebp, edx
+ mov eax, DWORD PTR 12[esi]
+ adc ebx, 0
+ mov edx, DWORD PTR 4[esi]
+ ; sqr a[3]*a[1]
+ mul edx
+ add eax, eax
+ adc edx, edx
+ adc ebx, 0
+ add ecx, eax
+ adc ebp, edx
+ mov eax, DWORD PTR 8[esi]
+ adc ebx, 0
+ ; sqr a[2]*a[2]
+ mul eax
+ add ecx, eax
+ adc ebp, edx
+ mov edx, DWORD PTR [esi]
+ adc ebx, 0
+ mov DWORD PTR 16[edi],ecx
+ mov eax, DWORD PTR 20[esi]
+ ; saved r[4]
+ ; ############### Calculate word 5
+ xor ecx, ecx
+ ; sqr a[5]*a[0]
+ mul edx
+ add eax, eax
+ adc edx, edx
+ adc ecx, 0
+ add ebp, eax
+ adc ebx, edx
+ mov eax, DWORD PTR 16[esi]
+ adc ecx, 0
+ mov edx, DWORD PTR 4[esi]
+ ; sqr a[4]*a[1]
+ mul edx
+ add eax, eax
+ adc edx, edx
+ adc ecx, 0
+ add ebp, eax
+ adc ebx, edx
+ mov eax, DWORD PTR 12[esi]
+ adc ecx, 0
+ mov edx, DWORD PTR 8[esi]
+ ; sqr a[3]*a[2]
+ mul edx
+ add eax, eax
+ adc edx, edx
+ adc ecx, 0
+ add ebp, eax
+ adc ebx, edx
+ mov eax, DWORD PTR 24[esi]
+ adc ecx, 0
+ mov DWORD PTR 20[edi],ebp
+ mov edx, DWORD PTR [esi]
+ ; saved r[5]
+ ; ############### Calculate word 6
+ xor ebp, ebp
+ ; sqr a[6]*a[0]
+ mul edx
+ add eax, eax
+ adc edx, edx
+ adc ebp, 0
+ add ebx, eax
+ adc ecx, edx
+ mov eax, DWORD PTR 20[esi]
+ adc ebp, 0
+ mov edx, DWORD PTR 4[esi]
+ ; sqr a[5]*a[1]
+ mul edx
+ add eax, eax
+ adc edx, edx
+ adc ebp, 0
+ add ebx, eax
+ adc ecx, edx
+ mov eax, DWORD PTR 16[esi]
+ adc ebp, 0
+ mov edx, DWORD PTR 8[esi]
+ ; sqr a[4]*a[2]
+ mul edx
+ add eax, eax
+ adc edx, edx
+ adc ebp, 0
+ add ebx, eax
+ adc ecx, edx
+ mov eax, DWORD PTR 12[esi]
+ adc ebp, 0
+ ; sqr a[3]*a[3]
+ mul eax
+ add ebx, eax
+ adc ecx, edx
+ mov edx, DWORD PTR [esi]
+ adc ebp, 0
+ mov DWORD PTR 24[edi],ebx
+ mov eax, DWORD PTR 28[esi]
+ ; saved r[6]
+ ; ############### Calculate word 7
+ xor ebx, ebx
+ ; sqr a[7]*a[0]
+ mul edx
+ add eax, eax
+ adc edx, edx
+ adc ebx, 0
+ add ecx, eax
+ adc ebp, edx
+ mov eax, DWORD PTR 24[esi]
+ adc ebx, 0
+ mov edx, DWORD PTR 4[esi]
+ ; sqr a[6]*a[1]
+ mul edx
+ add eax, eax
+ adc edx, edx
+ adc ebx, 0
+ add ecx, eax
+ adc ebp, edx
+ mov eax, DWORD PTR 20[esi]
+ adc ebx, 0
+ mov edx, DWORD PTR 8[esi]
+ ; sqr a[5]*a[2]
+ mul edx
+ add eax, eax
+ adc edx, edx
+ adc ebx, 0
+ add ecx, eax
+ adc ebp, edx
+ mov eax, DWORD PTR 16[esi]
+ adc ebx, 0
+ mov edx, DWORD PTR 12[esi]
+ ; sqr a[4]*a[3]
+ mul edx
+ add eax, eax
+ adc edx, edx
+ adc ebx, 0
+ add ecx, eax
+ adc ebp, edx
+ mov eax, DWORD PTR 28[esi]
+ adc ebx, 0
+ mov DWORD PTR 28[edi],ecx
+ mov edx, DWORD PTR 4[esi]
+ ; saved r[7]
+ ; ############### Calculate word 8
+ xor ecx, ecx
+ ; sqr a[7]*a[1]
+ mul edx
+ add eax, eax
+ adc edx, edx
+ adc ecx, 0
+ add ebp, eax
+ adc ebx, edx
+ mov eax, DWORD PTR 24[esi]
+ adc ecx, 0
+ mov edx, DWORD PTR 8[esi]
+ ; sqr a[6]*a[2]
+ mul edx
+ add eax, eax
+ adc edx, edx
+ adc ecx, 0
+ add ebp, eax
+ adc ebx, edx
+ mov eax, DWORD PTR 20[esi]
+ adc ecx, 0
+ mov edx, DWORD PTR 12[esi]
+ ; sqr a[5]*a[3]
+ mul edx
+ add eax, eax
+ adc edx, edx
+ adc ecx, 0
+ add ebp, eax
+ adc ebx, edx
+ mov eax, DWORD PTR 16[esi]
+ adc ecx, 0
+ ; sqr a[4]*a[4]
+ mul eax
+ add ebp, eax
+ adc ebx, edx
+ mov edx, DWORD PTR 8[esi]
+ adc ecx, 0
+ mov DWORD PTR 32[edi],ebp
+ mov eax, DWORD PTR 28[esi]
+ ; saved r[8]
+ ; ############### Calculate word 9
+ xor ebp, ebp
+ ; sqr a[7]*a[2]
+ mul edx
+ add eax, eax
+ adc edx, edx
+ adc ebp, 0
+ add ebx, eax
+ adc ecx, edx
+ mov eax, DWORD PTR 24[esi]
+ adc ebp, 0
+ mov edx, DWORD PTR 12[esi]
+ ; sqr a[6]*a[3]
+ mul edx
+ add eax, eax
+ adc edx, edx
+ adc ebp, 0
+ add ebx, eax
+ adc ecx, edx
+ mov eax, DWORD PTR 20[esi]
+ adc ebp, 0
+ mov edx, DWORD PTR 16[esi]
+ ; sqr a[5]*a[4]
+ mul edx
+ add eax, eax
+ adc edx, edx
+ adc ebp, 0
+ add ebx, eax
+ adc ecx, edx
+ mov eax, DWORD PTR 28[esi]
+ adc ebp, 0
+ mov DWORD PTR 36[edi],ebx
+ mov edx, DWORD PTR 12[esi]
+ ; saved r[9]
+ ; ############### Calculate word 10
+ xor ebx, ebx
+ ; sqr a[7]*a[3]
+ mul edx
+ add eax, eax
+ adc edx, edx
+ adc ebx, 0
+ add ecx, eax
+ adc ebp, edx
+ mov eax, DWORD PTR 24[esi]
+ adc ebx, 0
+ mov edx, DWORD PTR 16[esi]
+ ; sqr a[6]*a[4]
+ mul edx
+ add eax, eax
+ adc edx, edx
+ adc ebx, 0
+ add ecx, eax
+ adc ebp, edx
+ mov eax, DWORD PTR 20[esi]
+ adc ebx, 0
+ ; sqr a[5]*a[5]
+ mul eax
+ add ecx, eax
+ adc ebp, edx
+ mov edx, DWORD PTR 16[esi]
+ adc ebx, 0
+ mov DWORD PTR 40[edi],ecx
+ mov eax, DWORD PTR 28[esi]
+ ; saved r[10]
+ ; ############### Calculate word 11
+ xor ecx, ecx
+ ; sqr a[7]*a[4]
+ mul edx
+ add eax, eax
+ adc edx, edx
+ adc ecx, 0
+ add ebp, eax
+ adc ebx, edx
+ mov eax, DWORD PTR 24[esi]
+ adc ecx, 0
+ mov edx, DWORD PTR 20[esi]
+ ; sqr a[6]*a[5]
+ mul edx
+ add eax, eax
+ adc edx, edx
+ adc ecx, 0
+ add ebp, eax
+ adc ebx, edx
+ mov eax, DWORD PTR 28[esi]
+ adc ecx, 0
+ mov DWORD PTR 44[edi],ebp
+ mov edx, DWORD PTR 20[esi]
+ ; saved r[11]
+ ; ############### Calculate word 12
+ xor ebp, ebp
+ ; sqr a[7]*a[5]
+ mul edx
+ add eax, eax
+ adc edx, edx
+ adc ebp, 0
+ add ebx, eax
+ adc ecx, edx
+ mov eax, DWORD PTR 24[esi]
+ adc ebp, 0
+ ; sqr a[6]*a[6]
+ mul eax
+ add ebx, eax
+ adc ecx, edx
+ mov edx, DWORD PTR 24[esi]
+ adc ebp, 0
+ mov DWORD PTR 48[edi],ebx
+ mov eax, DWORD PTR 28[esi]
+ ; saved r[12]
+ ; ############### Calculate word 13
+ xor ebx, ebx
+ ; sqr a[7]*a[6]
+ mul edx
+ add eax, eax
+ adc edx, edx
+ adc ebx, 0
+ add ecx, eax
+ adc ebp, edx
+ mov eax, DWORD PTR 28[esi]
+ adc ebx, 0
+ mov DWORD PTR 52[edi],ecx
+ ; saved r[13]
+ ; ############### Calculate word 14
+ xor ecx, ecx
+ ; sqr a[7]*a[7]
+ mul eax
+ add ebp, eax
+ adc ebx, edx
+ adc ecx, 0
+ mov DWORD PTR 56[edi],ebp
+ ; saved r[14]
+ mov DWORD PTR 60[edi],ebx
+ pop ebx
+ pop ebp
+ pop edi
+ pop esi
+ ret
+_bn_sqr_comba8 ENDP
+_TEXT ENDS
+_TEXT SEGMENT
+PUBLIC _bn_sqr_comba4
+
+_bn_sqr_comba4 PROC NEAR
+ push esi
+ push edi
+ push ebp
+ push ebx
+ mov edi, DWORD PTR 20[esp]
+ mov esi, DWORD PTR 24[esp]
+ xor ebx, ebx
+ xor ecx, ecx
+ mov eax, DWORD PTR [esi]
+ ; ############### Calculate word 0
+ xor ebp, ebp
+ ; sqr a[0]*a[0]
+ mul eax
+ add ebx, eax
+ adc ecx, edx
+ mov edx, DWORD PTR [esi]
+ adc ebp, 0
+ mov DWORD PTR [edi],ebx
+ mov eax, DWORD PTR 4[esi]
+ ; saved r[0]
+ ; ############### Calculate word 1
+ xor ebx, ebx
+ ; sqr a[1]*a[0]
+ mul edx
+ add eax, eax
+ adc edx, edx
+ adc ebx, 0
+ add ecx, eax
+ adc ebp, edx
+ mov eax, DWORD PTR 8[esi]
+ adc ebx, 0
+ mov DWORD PTR 4[edi],ecx
+ mov edx, DWORD PTR [esi]
+ ; saved r[1]
+ ; ############### Calculate word 2
+ xor ecx, ecx
+ ; sqr a[2]*a[0]
+ mul edx
+ add eax, eax
+ adc edx, edx
+ adc ecx, 0
+ add ebp, eax
+ adc ebx, edx
+ mov eax, DWORD PTR 4[esi]
+ adc ecx, 0
+ ; sqr a[1]*a[1]
+ mul eax
+ add ebp, eax
+ adc ebx, edx
+ mov edx, DWORD PTR [esi]
+ adc ecx, 0
+ mov DWORD PTR 8[edi],ebp
+ mov eax, DWORD PTR 12[esi]
+ ; saved r[2]
+ ; ############### Calculate word 3
+ xor ebp, ebp
+ ; sqr a[3]*a[0]
+ mul edx
+ add eax, eax
+ adc edx, edx
+ adc ebp, 0
+ add ebx, eax
+ adc ecx, edx
+ mov eax, DWORD PTR 8[esi]
+ adc ebp, 0
+ mov edx, DWORD PTR 4[esi]
+ ; sqr a[2]*a[1]
+ mul edx
+ add eax, eax
+ adc edx, edx
+ adc ebp, 0
+ add ebx, eax
+ adc ecx, edx
+ mov eax, DWORD PTR 12[esi]
+ adc ebp, 0
+ mov DWORD PTR 12[edi],ebx
+ mov edx, DWORD PTR 4[esi]
+ ; saved r[3]
+ ; ############### Calculate word 4
+ xor ebx, ebx
+ ; sqr a[3]*a[1]
+ mul edx
+ add eax, eax
+ adc edx, edx
+ adc ebx, 0
+ add ecx, eax
+ adc ebp, edx
+ mov eax, DWORD PTR 8[esi]
+ adc ebx, 0
+ ; sqr a[2]*a[2]
+ mul eax
+ add ecx, eax
+ adc ebp, edx
+ mov edx, DWORD PTR 8[esi]
+ adc ebx, 0
+ mov DWORD PTR 16[edi],ecx
+ mov eax, DWORD PTR 12[esi]
+ ; saved r[4]
+ ; ############### Calculate word 5
+ xor ecx, ecx
+ ; sqr a[3]*a[2]
+ mul edx
+ add eax, eax
+ adc edx, edx
+ adc ecx, 0
+ add ebp, eax
+ adc ebx, edx
+ mov eax, DWORD PTR 12[esi]
+ adc ecx, 0
+ mov DWORD PTR 20[edi],ebp
+ ; saved r[5]
+ ; ############### Calculate word 6
+ xor ebp, ebp
+ ; sqr a[3]*a[3]
+ mul eax
+ add ebx, eax
+ adc ecx, edx
+ adc ebp, 0
+ mov DWORD PTR 24[edi],ebx
+ ; saved r[6]
+ mov DWORD PTR 28[edi],ecx
+ pop ebx
+ pop ebp
+ pop edi
+ pop esi
+ ret
+_bn_sqr_comba4 ENDP
+_TEXT ENDS
+END
diff --git a/crypto/bn/asm/x86w16.asm b/crypto/bn/asm/x86w16.asm
new file mode 100644
index 00000000000..80a9ed6eef1
--- /dev/null
+++ b/crypto/bn/asm/x86w16.asm
@@ -0,0 +1,297 @@
+; Static Name Aliases
+;
+ TITLE bn_mulw.c
+ .8087
+F_TEXT SEGMENT WORD PUBLIC 'CODE'
+F_TEXT ENDS
+_DATA SEGMENT WORD PUBLIC 'DATA'
+_DATA ENDS
+_CONST SEGMENT WORD PUBLIC 'CONST'
+_CONST ENDS
+_BSS SEGMENT WORD PUBLIC 'BSS'
+_BSS ENDS
+DGROUP GROUP _CONST, _BSS, _DATA
+ ASSUME DS: DGROUP, SS: DGROUP
+F_TEXT SEGMENT
+ ASSUME CS: F_TEXT
+ PUBLIC _bn_mul_add_words
+_bn_mul_add_words PROC FAR
+; Line 58
+ push bp
+ push bx
+ push si
+ push di
+ push ds
+ push es
+ mov bp,sp
+; w = 26
+; num = 24
+; ap = 20
+; rp = 16
+ xor si,si ;c=0;
+ mov di,WORD PTR [bp+16] ; load r
+ mov ds,WORD PTR [bp+18] ; load r
+ mov bx,WORD PTR [bp+20] ; load a
+ mov es,WORD PTR [bp+22] ; load a
+ mov cx,WORD PTR [bp+26] ; load w
+ mov bp,WORD PTR [bp+24] ; load num
+
+ shr bp,1 ; div count by 4 and do groups of 4
+ shr bp,1
+ je $L555
+
+$L546:
+ mov ax,cx
+ mul WORD PTR es:[bx] ; w* *a
+ add ax,WORD PTR ds:[di] ; + *r
+ adc dx,0
+ adc ax,si
+ adc dx,0
+ mov WORD PTR ds:[di],ax
+ mov si,dx
+ ;
+ mov ax,cx
+ mul WORD PTR es:[bx+2] ; w* *a
+ add ax,WORD PTR ds:[di+2] ; + *r
+ adc dx,0
+ adc ax,si
+ adc dx,0
+ mov WORD PTR ds:[di+2],ax
+ mov si,dx
+ ;
+ mov ax,cx
+ mul WORD PTR es:[bx+4] ; w* *a
+ add ax,WORD PTR ds:[di+4] ; + *r
+ adc dx,0
+ adc ax,si
+ adc dx,0
+ mov WORD PTR ds:[di+4],ax
+ mov si,dx
+ ;
+ mov ax,cx
+ mul WORD PTR es:[bx+6] ; w* *a
+ add ax,WORD PTR ds:[di+6] ; + *r
+ adc dx,0
+ adc ax,si
+ adc dx,0
+ mov WORD PTR ds:[di+6],ax
+ mov si,dx
+ ;
+ add bx,8
+ add di,8
+ ;
+ dec bp
+ je $L555
+ jmp $L546
+;
+;
+$L555:
+ mov bp,sp
+ mov bp,WORD PTR [bp+24] ; load num
+ and bp,3
+ dec bp
+ js $L547
+
+ mov ax,cx
+ mul WORD PTR es:[bx] ; w* *a
+ add ax,WORD PTR ds:[di] ; + *r
+ adc dx,0
+ adc ax,si
+ adc dx,0
+ mov WORD PTR ds:[di],ax
+ mov si,dx
+ dec bp
+ js $L547 ; Note that we are now testing for -1
+ ;
+ mov ax,cx
+ mul WORD PTR es:[bx+2] ; w* *a
+ add ax,WORD PTR ds:[di+2] ; + *r
+ adc dx,0
+ adc ax,si
+ adc dx,0
+ mov WORD PTR ds:[di+2],ax
+ mov si,dx
+ dec bp
+ js $L547
+ ;
+ mov ax,cx
+ mul WORD PTR es:[bx+4] ; w* *a
+ add ax,WORD PTR ds:[di+4] ; + *r
+ adc dx,0
+ adc ax,si
+ adc dx,0
+ mov WORD PTR ds:[di+4],ax
+ mov si,dx
+$L547:
+ mov ax,si
+ pop es
+ pop ds
+ pop di
+ pop si
+ pop bx
+ pop bp
+ ret
+ nop
+
+_bn_mul_add_words ENDP
+ PUBLIC _bn_mul_words
+_bn_mul_words PROC FAR
+; Line 76
+ push bp
+ push bx
+ push si
+ push di
+ push ds
+ push es
+ xor si,si
+ mov bp,sp
+ mov di,WORD PTR [bp+16] ; r
+ mov ds,WORD PTR [bp+18]
+ mov bx,WORD PTR [bp+20] ; a
+ mov es,WORD PTR [bp+22]
+ mov cx,WORD PTR [bp+26] ; w
+ mov bp,WORD PTR [bp+24] ; num
+$FC743:
+ mov ax,cx
+ mul WORD PTR es:[bx]
+ add ax,si
+ adc dx,0
+ mov WORD PTR ds:[di],ax
+ mov si,dx
+ dec bp
+ je $L764
+ ;
+ mov ax,cx
+ mul WORD PTR es:[bx+2]
+ add ax,si
+ adc dx,0
+ mov WORD PTR ds:[di+2],ax
+ mov si,dx
+ dec bp
+ je $L764
+ ;
+ mov ax,cx
+ mul WORD PTR es:[bx+4]
+ add ax,si
+ adc dx,0
+ mov WORD PTR ds:[di+4],ax
+ mov si,dx
+ dec bp
+ je $L764
+ ;
+ mov ax,cx
+ mul WORD PTR es:[bx+6]
+ add ax,si
+ adc dx,0
+ mov WORD PTR ds:[di+6],ax
+ mov si,dx
+ dec bp
+ je $L764
+ ;
+ add bx,8
+ add di,8
+ jmp $FC743
+ nop
+$L764:
+ mov ax,si
+ pop es
+ pop ds
+ pop di
+ pop si
+ pop bx
+ pop bp
+ ret
+ nop
+_bn_mul_words ENDP
+ PUBLIC _bn_sqr_words
+_bn_sqr_words PROC FAR
+; Line 92
+ push bp
+ push bx
+ push si
+ push di
+ push ds
+ push es
+ mov bp,sp
+ mov si,WORD PTR [bp+16]
+ mov ds,WORD PTR [bp+18]
+ mov di,WORD PTR [bp+20]
+ mov es,WORD PTR [bp+22]
+ mov bx,WORD PTR [bp+24]
+
+ mov bp,bx ; save a memory lookup later
+ shr bx,1 ; div count by 4 and do groups of 4
+ shr bx,1
+ je $L666
+
+$L765:
+ mov ax,WORD PTR es:[di]
+ mul ax
+ mov WORD PTR ds:[si],ax
+ mov WORD PTR ds:[si+2],dx
+ ;
+ mov ax,WORD PTR es:[di+2]
+ mul ax
+ mov WORD PTR ds:[si+4],ax
+ mov WORD PTR ds:[si+6],dx
+ ;
+ mov ax,WORD PTR es:[di+4]
+ mul ax
+ mov WORD PTR ds:[si+8],ax
+ mov WORD PTR ds:[si+10],dx
+ ;
+ mov ax,WORD PTR es:[di+6]
+ mul ax
+ mov WORD PTR ds:[si+12],ax
+ mov WORD PTR ds:[si+14],dx
+ ;
+ add di,8
+ add si,16
+ dec bx
+ je $L666
+ jmp $L765
+$L666:
+ and bp,3
+ dec bp ; The copied value of bx (num)
+ js $L645
+ ;
+ mov ax,WORD PTR es:[di]
+ mul ax
+ mov WORD PTR ds:[si],ax
+ mov WORD PTR ds:[si+2],dx
+ dec bp
+ js $L645
+ ;
+ mov ax,WORD PTR es:[di+2]
+ mul ax
+ mov WORD PTR ds:[si+4],ax
+ mov WORD PTR ds:[si+6],dx
+ dec bp
+ js $L645
+ ;
+ mov ax,WORD PTR es:[di+4]
+ mul ax
+ mov WORD PTR ds:[si+8],ax
+ mov WORD PTR ds:[si+10],dx
+$L645:
+ pop es
+ pop ds
+ pop di
+ pop si
+ pop bx
+ pop bp
+ ret
+
+_bn_sqr_words ENDP
+ PUBLIC _bn_div64
+_bn_div64 PROC FAR
+ push bp
+ mov bp,sp
+ mov dx, WORD PTR [bp+6]
+ mov ax, WORD PTR [bp+8]
+ div WORD PTR [bp+10]
+ pop bp
+ ret
+_bn_div64 ENDP
+F_TEXT ENDS
+END
diff --git a/crypto/bn/asm/x86w32.asm b/crypto/bn/asm/x86w32.asm
new file mode 100644
index 00000000000..957d71e3b18
--- /dev/null
+++ b/crypto/bn/asm/x86w32.asm
@@ -0,0 +1,360 @@
+; Static Name Aliases
+;
+ TITLE bn_mulw.c
+ .386
+F_TEXT SEGMENT WORD USE16 PUBLIC 'CODE'
+F_TEXT ENDS
+_DATA SEGMENT WORD USE16 PUBLIC 'DATA'
+_DATA ENDS
+_CONST SEGMENT WORD USE16 PUBLIC 'CONST'
+_CONST ENDS
+_BSS SEGMENT WORD USE16 PUBLIC 'BSS'
+_BSS ENDS
+DGROUP GROUP _CONST, _BSS, _DATA
+ ASSUME DS: DGROUP, SS: DGROUP
+F_TEXT SEGMENT
+ ASSUME CS: F_TEXT
+ PUBLIC _bn_mul_add_words
+_bn_mul_add_words PROC FAR
+; Line 58
+ push bp
+ push bx
+ push esi
+ push di
+ push ds
+ push es
+ mov bp,sp
+; w = 28
+; num = 26
+; ap = 22
+; rp = 18
+ xor esi,esi ;c=0;
+ mov di,WORD PTR [bp+18] ; load r
+ mov ds,WORD PTR [bp+20] ; load r
+ mov bx,WORD PTR [bp+22] ; load a
+ mov es,WORD PTR [bp+24] ; load a
+ mov ecx,DWORD PTR [bp+28] ; load w
+ mov bp,WORD PTR [bp+26] ; load num
+ shr bp,1 ; div count by 4 and do groups of 4
+ shr bp,1
+ je $L555
+
+$L546:
+ mov eax,ecx
+ mul DWORD PTR es:[bx] ; w* *a
+ add eax,DWORD PTR ds:[di] ; + *r
+ adc edx,0
+ adc eax,esi
+ adc edx,0
+ mov DWORD PTR ds:[di],eax
+ mov esi,edx
+ ;
+ mov eax,ecx
+ mul DWORD PTR es:[bx+4] ; w* *a
+ add eax,DWORD PTR ds:[di+4] ; + *r
+ adc edx,0
+ adc eax,esi
+ adc edx,0
+ mov DWORD PTR ds:[di+4],eax
+ mov esi,edx
+ ;
+ mov eax,ecx
+ mul DWORD PTR es:[bx+8] ; w* *a
+ add eax,DWORD PTR ds:[di+8] ; + *r
+ adc edx,0
+ adc eax,esi
+ adc edx,0
+ mov DWORD PTR ds:[di+8],eax
+ mov esi,edx
+ ;
+ mov eax,ecx
+ mul DWORD PTR es:[bx+12] ; w* *a
+ add eax,DWORD PTR ds:[di+12] ; + *r
+ adc edx,0
+ adc eax,esi
+ adc edx,0
+ mov DWORD PTR ds:[di+12],eax
+ mov esi,edx
+ ;
+ add bx,16
+ add di,16
+ ;
+ dec bp
+ je $L555
+ jmp $L546
+;
+;
+$L555:
+ mov bp,sp
+ mov bp,WORD PTR [bp+26] ; load num
+ and bp,3
+ dec bp
+ js $L547m
+
+ mov eax,ecx
+ mul DWORD PTR es:[bx] ; w* *a
+ add eax,DWORD PTR ds:[di] ; + *r
+ adc edx,0
+ adc eax,esi
+ adc edx,0
+ mov DWORD PTR ds:[di],eax
+ mov esi,edx
+ dec bp
+ js $L547m ; Note that we are now testing for -1
+ ;
+ mov eax,ecx
+ mul DWORD PTR es:[bx+4] ; w* *a
+ add eax,DWORD PTR ds:[di+4] ; + *r
+ adc edx,0
+ adc eax,esi
+ adc edx,0
+ mov DWORD PTR ds:[di+4],eax
+ mov esi,edx
+ dec bp
+ js $L547m
+ ;
+ mov eax,ecx
+ mul DWORD PTR es:[bx+8] ; w* *a
+ add eax,DWORD PTR ds:[di+8] ; + *r
+ adc edx,0
+ adc eax,esi
+ adc edx,0
+ mov DWORD PTR ds:[di+8],eax
+ mov esi,edx
+$L547m:
+ mov eax,esi
+ mov edx,esi
+ shr edx,16
+ pop es
+ pop ds
+ pop di
+ pop esi
+ pop bx
+ pop bp
+ ret
+ nop
+_bn_mul_add_words ENDP
+
+ PUBLIC _bn_mul_words
+_bn_mul_words PROC FAR
+; Line 76
+ push bp
+ push bx
+ push esi
+ push di
+ push ds
+ push es
+ xor esi,esi
+ mov bp,sp
+ mov di,WORD PTR [bp+18] ; r
+ mov ds,WORD PTR [bp+20]
+ mov bx,WORD PTR [bp+22] ; a
+ mov es,WORD PTR [bp+24]
+ mov ecx,DWORD PTR [bp+28] ; w
+ mov bp,WORD PTR [bp+26] ; num
+
+$FC743:
+ mov eax,ecx
+ mul DWORD PTR es:[bx]
+ add eax,esi
+ adc edx,0
+ mov DWORD PTR ds:[di],eax
+ mov esi,edx
+ dec bp
+ je $L764
+ ;
+ mov eax,ecx
+ mul DWORD PTR es:[bx+4]
+ add eax,esi
+ adc edx,0
+ mov DWORD PTR ds:[di+4],eax
+ mov esi,edx
+ dec bp
+ je $L764
+ ;
+ mov eax,ecx
+ mul DWORD PTR es:[bx+8]
+ add eax,esi
+ adc edx,0
+ mov DWORD PTR ds:[di+8],eax
+ mov esi,edx
+ dec bp
+ je $L764
+ ;
+ mov eax,ecx
+ mul DWORD PTR es:[bx+12]
+ add eax,esi
+ adc edx,0
+ mov DWORD PTR ds:[di+12],eax
+ mov esi,edx
+ dec bp
+ je $L764
+ ;
+ add bx,16
+ add di,16
+ jmp $FC743
+ nop
+$L764:
+ mov eax,esi
+ mov edx,esi
+ shr edx,16
+ pop es
+ pop ds
+ pop di
+ pop esi
+ pop bx
+ pop bp
+ ret
+ nop
+_bn_mul_words ENDP
+ PUBLIC _bn_sqr_words
+_bn_sqr_words PROC FAR
+; Line 92
+ push bp
+ push bx
+ push si
+ push di
+ push ds
+ push es
+ mov bp,sp
+ mov si,WORD PTR [bp+16]
+ mov ds,WORD PTR [bp+18]
+ mov di,WORD PTR [bp+20]
+ mov es,WORD PTR [bp+22]
+ mov bx,WORD PTR [bp+24]
+
+ mov bp,bx ; save a memory lookup later
+ shr bx,1 ; div count by 4 and do groups of 4
+ shr bx,1
+ je $L666
+
+$L765:
+ mov eax,DWORD PTR es:[di]
+ mul eax
+ mov DWORD PTR ds:[si],eax
+ mov DWORD PTR ds:[si+4],edx
+ ;
+ mov eax,DWORD PTR es:[di+4]
+ mul eax
+ mov DWORD PTR ds:[si+8],eax
+ mov DWORD PTR ds:[si+12],edx
+ ;
+ mov eax,DWORD PTR es:[di+8]
+ mul eax
+ mov DWORD PTR ds:[si+16],eax
+ mov DWORD PTR ds:[si+20],edx
+ ;
+ mov eax,DWORD PTR es:[di+12]
+ mul eax
+ mov DWORD PTR ds:[si+24],eax
+ mov DWORD PTR ds:[si+28],edx
+ ;
+ add di,16
+ add si,32
+ dec bx
+ je $L666
+ jmp $L765
+$L666:
+ and bp,3
+ dec bp ; The copied value of bx (num)
+ js $L645
+ ;
+ mov eax,DWORD PTR es:[di]
+ mul eax
+ mov DWORD PTR ds:[si],eax
+ mov DWORD PTR ds:[si+4],edx
+ dec bp
+ js $L645
+ ;
+ mov eax,DWORD PTR es:[di+4]
+ mul eax
+ mov DWORD PTR ds:[si+8],eax
+ mov DWORD PTR ds:[si+12],edx
+ dec bp
+ js $L645
+ ;
+ mov eax,DWORD PTR es:[di+8]
+ mul eax
+ mov DWORD PTR ds:[si+16],eax
+ mov DWORD PTR ds:[si+20],edx
+$L645:
+ pop es
+ pop ds
+ pop di
+ pop si
+ pop bx
+ pop bp
+ ret
+_bn_sqr_words ENDP
+
+ PUBLIC _bn_div64
+_bn_div64 PROC FAR
+ push bp
+ mov bp,sp
+ mov edx, DWORD PTR [bp+6]
+ mov eax, DWORD PTR [bp+10]
+ div DWORD PTR [bp+14]
+ mov edx,eax
+ shr edx,16
+ pop bp
+ ret
+_bn_div64 ENDP
+
+ PUBLIC _bn_add_words
+_bn_add_words PROC FAR
+; Line 58
+ push bp
+ push bx
+ push esi
+ push di
+ push ds
+ push es
+ mov bp,sp
+; w = 28
+; num = 26
+; ap = 22
+; rp = 18
+ xor esi,esi ;c=0;
+ mov bx,WORD PTR [bp+18] ; load low r
+ mov si,WORD PTR [bp+22] ; load a
+ mov es,WORD PTR [bp+24] ; load a
+ mov di,WORD PTR [bp+26] ; load b
+ mov ds,WORD PTR [bp+28] ; load b
+
+ mov dx,WORD PTR [bp+30] ; load num
+ xor ecx,ecx
+ dec dx
+ js $L547a
+
+$L5477:
+ mov eax,DWORD PTR es:[si] ; *a
+ add eax,ecx
+ mov ecx,0
+ adc ecx,0
+ add si,4 ; a++
+ add eax,DWORD PTR ds:[di] ; + *b
+ adc ecx,0
+ mov ds,WORD PTR [bp+20]
+ add di,4
+ mov DWORD PTR ds:[bx],eax
+ mov ds,WORD PTR [bp+28]
+ add bx,4
+ dec dx
+ js $L547a ; Note that we are now testing for -1
+ jmp $L5477
+ ;
+$L547a:
+ mov eax,ecx
+ mov edx,ecx
+ shr edx,16
+ pop es
+ pop ds
+ pop di
+ pop esi
+ pop bx
+ pop bp
+ ret
+ nop
+_bn_add_words ENDP
+F_TEXT ENDS
+END