Home | History | Annotate | Download | only in bn
      1 %ifidn __OUTPUT_FORMAT__,obj
      2 section	code	use32 class=code align=64
      3 %elifidn __OUTPUT_FORMAT__,win32
      4 %ifdef __YASM_VERSION_ID__
      5 %if __YASM_VERSION_ID__ < 01010000h
      6 %error yasm version 1.1.0 or later needed.
      7 %endif
      8 ; Yasm automatically includes .00 and complains about redefining it.
      9 ; https://www.tortall.net/projects/yasm/manual/html/objfmt-win32-safeseh.html
     10 %else
     11 $@feat.00 equ 1
     12 %endif
     13 section	.text	code align=64
     14 %else
     15 section	.text	code
     16 %endif
     17 ;extern	_OPENSSL_ia32cap_P
     18 global	_bn_mul_add_words
     19 align	16
     20 _bn_mul_add_words:
     21 L$_bn_mul_add_words_begin:
     22 	lea	eax,[_OPENSSL_ia32cap_P]
     23 	bt	DWORD [eax],26
     24 	jnc	NEAR L$000maw_non_sse2
     25 	mov	eax,DWORD [4+esp]
     26 	mov	edx,DWORD [8+esp]
     27 	mov	ecx,DWORD [12+esp]
     28 	movd	mm0,DWORD [16+esp]
     29 	pxor	mm1,mm1
     30 	jmp	NEAR L$001maw_sse2_entry
     31 align	16
     32 L$002maw_sse2_unrolled:
     33 	movd	mm3,DWORD [eax]
     34 	paddq	mm1,mm3
     35 	movd	mm2,DWORD [edx]
     36 	pmuludq	mm2,mm0
     37 	movd	mm4,DWORD [4+edx]
     38 	pmuludq	mm4,mm0
     39 	movd	mm6,DWORD [8+edx]
     40 	pmuludq	mm6,mm0
     41 	movd	mm7,DWORD [12+edx]
     42 	pmuludq	mm7,mm0
     43 	paddq	mm1,mm2
     44 	movd	mm3,DWORD [4+eax]
     45 	paddq	mm3,mm4
     46 	movd	mm5,DWORD [8+eax]
     47 	paddq	mm5,mm6
     48 	movd	mm4,DWORD [12+eax]
     49 	paddq	mm7,mm4
     50 	movd	DWORD [eax],mm1
     51 	movd	mm2,DWORD [16+edx]
     52 	pmuludq	mm2,mm0
     53 	psrlq	mm1,32
     54 	movd	mm4,DWORD [20+edx]
     55 	pmuludq	mm4,mm0
     56 	paddq	mm1,mm3
     57 	movd	mm6,DWORD [24+edx]
     58 	pmuludq	mm6,mm0
     59 	movd	DWORD [4+eax],mm1
     60 	psrlq	mm1,32
     61 	movd	mm3,DWORD [28+edx]
     62 	add	edx,32
     63 	pmuludq	mm3,mm0
     64 	paddq	mm1,mm5
     65 	movd	mm5,DWORD [16+eax]
     66 	paddq	mm2,mm5
     67 	movd	DWORD [8+eax],mm1
     68 	psrlq	mm1,32
     69 	paddq	mm1,mm7
     70 	movd	mm5,DWORD [20+eax]
     71 	paddq	mm4,mm5
     72 	movd	DWORD [12+eax],mm1
     73 	psrlq	mm1,32
     74 	paddq	mm1,mm2
     75 	movd	mm5,DWORD [24+eax]
     76 	paddq	mm6,mm5
     77 	movd	DWORD [16+eax],mm1
     78 	psrlq	mm1,32
     79 	paddq	mm1,mm4
     80 	movd	mm5,DWORD [28+eax]
     81 	paddq	mm3,mm5
     82 	movd	DWORD [20+eax],mm1
     83 	psrlq	mm1,32
     84 	paddq	mm1,mm6
     85 	movd	DWORD [24+eax],mm1
     86 	psrlq	mm1,32
     87 	paddq	mm1,mm3
     88 	movd	DWORD [28+eax],mm1
     89 	lea	eax,[32+eax]
     90 	psrlq	mm1,32
     91 	sub	ecx,8
     92 	jz	NEAR L$003maw_sse2_exit
     93 L$001maw_sse2_entry:
     94 	test	ecx,4294967288
     95 	jnz	NEAR L$002maw_sse2_unrolled
     96 align	4
     97 L$004maw_sse2_loop:
     98 	movd	mm2,DWORD [edx]
     99 	movd	mm3,DWORD [eax]
    100 	pmuludq	mm2,mm0
    101 	lea	edx,[4+edx]
    102 	paddq	mm1,mm3
    103 	paddq	mm1,mm2
    104 	movd	DWORD [eax],mm1
    105 	sub	ecx,1
    106 	psrlq	mm1,32
    107 	lea	eax,[4+eax]
    108 	jnz	NEAR L$004maw_sse2_loop
    109 L$003maw_sse2_exit:
    110 	movd	eax,mm1
    111 	emms
    112 	ret
    113 align	16
    114 L$000maw_non_sse2:
    115 	push	ebp
    116 	push	ebx
    117 	push	esi
    118 	push	edi
    119 	; 
    120 	xor	esi,esi
    121 	mov	edi,DWORD [20+esp]
    122 	mov	ecx,DWORD [28+esp]
    123 	mov	ebx,DWORD [24+esp]
    124 	and	ecx,4294967288
    125 	mov	ebp,DWORD [32+esp]
    126 	push	ecx
    127 	jz	NEAR L$005maw_finish
    128 align	16
    129 L$006maw_loop:
    130 	; Round 0
    131 	mov	eax,DWORD [ebx]
    132 	mul	ebp
    133 	add	eax,esi
    134 	adc	edx,0
    135 	add	eax,DWORD [edi]
    136 	adc	edx,0
    137 	mov	DWORD [edi],eax
    138 	mov	esi,edx
    139 	; Round 4
    140 	mov	eax,DWORD [4+ebx]
    141 	mul	ebp
    142 	add	eax,esi
    143 	adc	edx,0
    144 	add	eax,DWORD [4+edi]
    145 	adc	edx,0
    146 	mov	DWORD [4+edi],eax
    147 	mov	esi,edx
    148 	; Round 8
    149 	mov	eax,DWORD [8+ebx]
    150 	mul	ebp
    151 	add	eax,esi
    152 	adc	edx,0
    153 	add	eax,DWORD [8+edi]
    154 	adc	edx,0
    155 	mov	DWORD [8+edi],eax
    156 	mov	esi,edx
    157 	; Round 12
    158 	mov	eax,DWORD [12+ebx]
    159 	mul	ebp
    160 	add	eax,esi
    161 	adc	edx,0
    162 	add	eax,DWORD [12+edi]
    163 	adc	edx,0
    164 	mov	DWORD [12+edi],eax
    165 	mov	esi,edx
    166 	; Round 16
    167 	mov	eax,DWORD [16+ebx]
    168 	mul	ebp
    169 	add	eax,esi
    170 	adc	edx,0
    171 	add	eax,DWORD [16+edi]
    172 	adc	edx,0
    173 	mov	DWORD [16+edi],eax
    174 	mov	esi,edx
    175 	; Round 20
    176 	mov	eax,DWORD [20+ebx]
    177 	mul	ebp
    178 	add	eax,esi
    179 	adc	edx,0
    180 	add	eax,DWORD [20+edi]
    181 	adc	edx,0
    182 	mov	DWORD [20+edi],eax
    183 	mov	esi,edx
    184 	; Round 24
    185 	mov	eax,DWORD [24+ebx]
    186 	mul	ebp
    187 	add	eax,esi
    188 	adc	edx,0
    189 	add	eax,DWORD [24+edi]
    190 	adc	edx,0
    191 	mov	DWORD [24+edi],eax
    192 	mov	esi,edx
    193 	; Round 28
    194 	mov	eax,DWORD [28+ebx]
    195 	mul	ebp
    196 	add	eax,esi
    197 	adc	edx,0
    198 	add	eax,DWORD [28+edi]
    199 	adc	edx,0
    200 	mov	DWORD [28+edi],eax
    201 	mov	esi,edx
    202 	; 
    203 	sub	ecx,8
    204 	lea	ebx,[32+ebx]
    205 	lea	edi,[32+edi]
    206 	jnz	NEAR L$006maw_loop
    207 L$005maw_finish:
    208 	mov	ecx,DWORD [32+esp]
    209 	and	ecx,7
    210 	jnz	NEAR L$007maw_finish2
    211 	jmp	NEAR L$008maw_end
    212 L$007maw_finish2:
    213 	; Tail Round 0
    214 	mov	eax,DWORD [ebx]
    215 	mul	ebp
    216 	add	eax,esi
    217 	adc	edx,0
    218 	add	eax,DWORD [edi]
    219 	adc	edx,0
    220 	dec	ecx
    221 	mov	DWORD [edi],eax
    222 	mov	esi,edx
    223 	jz	NEAR L$008maw_end
    224 	; Tail Round 1
    225 	mov	eax,DWORD [4+ebx]
    226 	mul	ebp
    227 	add	eax,esi
    228 	adc	edx,0
    229 	add	eax,DWORD [4+edi]
    230 	adc	edx,0
    231 	dec	ecx
    232 	mov	DWORD [4+edi],eax
    233 	mov	esi,edx
    234 	jz	NEAR L$008maw_end
    235 	; Tail Round 2
    236 	mov	eax,DWORD [8+ebx]
    237 	mul	ebp
    238 	add	eax,esi
    239 	adc	edx,0
    240 	add	eax,DWORD [8+edi]
    241 	adc	edx,0
    242 	dec	ecx
    243 	mov	DWORD [8+edi],eax
    244 	mov	esi,edx
    245 	jz	NEAR L$008maw_end
    246 	; Tail Round 3
    247 	mov	eax,DWORD [12+ebx]
    248 	mul	ebp
    249 	add	eax,esi
    250 	adc	edx,0
    251 	add	eax,DWORD [12+edi]
    252 	adc	edx,0
    253 	dec	ecx
    254 	mov	DWORD [12+edi],eax
    255 	mov	esi,edx
    256 	jz	NEAR L$008maw_end
    257 	; Tail Round 4
    258 	mov	eax,DWORD [16+ebx]
    259 	mul	ebp
    260 	add	eax,esi
    261 	adc	edx,0
    262 	add	eax,DWORD [16+edi]
    263 	adc	edx,0
    264 	dec	ecx
    265 	mov	DWORD [16+edi],eax
    266 	mov	esi,edx
    267 	jz	NEAR L$008maw_end
    268 	; Tail Round 5
    269 	mov	eax,DWORD [20+ebx]
    270 	mul	ebp
    271 	add	eax,esi
    272 	adc	edx,0
    273 	add	eax,DWORD [20+edi]
    274 	adc	edx,0
    275 	dec	ecx
    276 	mov	DWORD [20+edi],eax
    277 	mov	esi,edx
    278 	jz	NEAR L$008maw_end
    279 	; Tail Round 6
    280 	mov	eax,DWORD [24+ebx]
    281 	mul	ebp
    282 	add	eax,esi
    283 	adc	edx,0
    284 	add	eax,DWORD [24+edi]
    285 	adc	edx,0
    286 	mov	DWORD [24+edi],eax
    287 	mov	esi,edx
    288 L$008maw_end:
    289 	mov	eax,esi
    290 	pop	ecx
    291 	pop	edi
    292 	pop	esi
    293 	pop	ebx
    294 	pop	ebp
    295 	ret
    296 global	_bn_mul_words
    297 align	16
    298 _bn_mul_words:
    299 L$_bn_mul_words_begin:
    300 	lea	eax,[_OPENSSL_ia32cap_P]
    301 	bt	DWORD [eax],26
    302 	jnc	NEAR L$009mw_non_sse2
    303 	mov	eax,DWORD [4+esp]
    304 	mov	edx,DWORD [8+esp]
    305 	mov	ecx,DWORD [12+esp]
    306 	movd	mm0,DWORD [16+esp]
    307 	pxor	mm1,mm1
    308 align	16
    309 L$010mw_sse2_loop:
    310 	movd	mm2,DWORD [edx]
    311 	pmuludq	mm2,mm0
    312 	lea	edx,[4+edx]
    313 	paddq	mm1,mm2
    314 	movd	DWORD [eax],mm1
    315 	sub	ecx,1
    316 	psrlq	mm1,32
    317 	lea	eax,[4+eax]
    318 	jnz	NEAR L$010mw_sse2_loop
    319 	movd	eax,mm1
    320 	emms
    321 	ret
    322 align	16
    323 L$009mw_non_sse2:
    324 	push	ebp
    325 	push	ebx
    326 	push	esi
    327 	push	edi
    328 	; 
    329 	xor	esi,esi
    330 	mov	edi,DWORD [20+esp]
    331 	mov	ebx,DWORD [24+esp]
    332 	mov	ebp,DWORD [28+esp]
    333 	mov	ecx,DWORD [32+esp]
    334 	and	ebp,4294967288
    335 	jz	NEAR L$011mw_finish
    336 L$012mw_loop:
    337 	; Round 0
    338 	mov	eax,DWORD [ebx]
    339 	mul	ecx
    340 	add	eax,esi
    341 	adc	edx,0
    342 	mov	DWORD [edi],eax
    343 	mov	esi,edx
    344 	; Round 4
    345 	mov	eax,DWORD [4+ebx]
    346 	mul	ecx
    347 	add	eax,esi
    348 	adc	edx,0
    349 	mov	DWORD [4+edi],eax
    350 	mov	esi,edx
    351 	; Round 8
    352 	mov	eax,DWORD [8+ebx]
    353 	mul	ecx
    354 	add	eax,esi
    355 	adc	edx,0
    356 	mov	DWORD [8+edi],eax
    357 	mov	esi,edx
    358 	; Round 12
    359 	mov	eax,DWORD [12+ebx]
    360 	mul	ecx
    361 	add	eax,esi
    362 	adc	edx,0
    363 	mov	DWORD [12+edi],eax
    364 	mov	esi,edx
    365 	; Round 16
    366 	mov	eax,DWORD [16+ebx]
    367 	mul	ecx
    368 	add	eax,esi
    369 	adc	edx,0
    370 	mov	DWORD [16+edi],eax
    371 	mov	esi,edx
    372 	; Round 20
    373 	mov	eax,DWORD [20+ebx]
    374 	mul	ecx
    375 	add	eax,esi
    376 	adc	edx,0
    377 	mov	DWORD [20+edi],eax
    378 	mov	esi,edx
    379 	; Round 24
    380 	mov	eax,DWORD [24+ebx]
    381 	mul	ecx
    382 	add	eax,esi
    383 	adc	edx,0
    384 	mov	DWORD [24+edi],eax
    385 	mov	esi,edx
    386 	; Round 28
    387 	mov	eax,DWORD [28+ebx]
    388 	mul	ecx
    389 	add	eax,esi
    390 	adc	edx,0
    391 	mov	DWORD [28+edi],eax
    392 	mov	esi,edx
    393 	; 
    394 	add	ebx,32
    395 	add	edi,32
    396 	sub	ebp,8
    397 	jz	NEAR L$011mw_finish
    398 	jmp	NEAR L$012mw_loop
    399 L$011mw_finish:
    400 	mov	ebp,DWORD [28+esp]
    401 	and	ebp,7
    402 	jnz	NEAR L$013mw_finish2
    403 	jmp	NEAR L$014mw_end
    404 L$013mw_finish2:
    405 	; Tail Round 0
    406 	mov	eax,DWORD [ebx]
    407 	mul	ecx
    408 	add	eax,esi
    409 	adc	edx,0
    410 	mov	DWORD [edi],eax
    411 	mov	esi,edx
    412 	dec	ebp
    413 	jz	NEAR L$014mw_end
    414 	; Tail Round 1
    415 	mov	eax,DWORD [4+ebx]
    416 	mul	ecx
    417 	add	eax,esi
    418 	adc	edx,0
    419 	mov	DWORD [4+edi],eax
    420 	mov	esi,edx
    421 	dec	ebp
    422 	jz	NEAR L$014mw_end
    423 	; Tail Round 2
    424 	mov	eax,DWORD [8+ebx]
    425 	mul	ecx
    426 	add	eax,esi
    427 	adc	edx,0
    428 	mov	DWORD [8+edi],eax
    429 	mov	esi,edx
    430 	dec	ebp
    431 	jz	NEAR L$014mw_end
    432 	; Tail Round 3
    433 	mov	eax,DWORD [12+ebx]
    434 	mul	ecx
    435 	add	eax,esi
    436 	adc	edx,0
    437 	mov	DWORD [12+edi],eax
    438 	mov	esi,edx
    439 	dec	ebp
    440 	jz	NEAR L$014mw_end
    441 	; Tail Round 4
    442 	mov	eax,DWORD [16+ebx]
    443 	mul	ecx
    444 	add	eax,esi
    445 	adc	edx,0
    446 	mov	DWORD [16+edi],eax
    447 	mov	esi,edx
    448 	dec	ebp
    449 	jz	NEAR L$014mw_end
    450 	; Tail Round 5
    451 	mov	eax,DWORD [20+ebx]
    452 	mul	ecx
    453 	add	eax,esi
    454 	adc	edx,0
    455 	mov	DWORD [20+edi],eax
    456 	mov	esi,edx
    457 	dec	ebp
    458 	jz	NEAR L$014mw_end
    459 	; Tail Round 6
    460 	mov	eax,DWORD [24+ebx]
    461 	mul	ecx
    462 	add	eax,esi
    463 	adc	edx,0
    464 	mov	DWORD [24+edi],eax
    465 	mov	esi,edx
    466 L$014mw_end:
    467 	mov	eax,esi
    468 	pop	edi
    469 	pop	esi
    470 	pop	ebx
    471 	pop	ebp
    472 	ret
    473 global	_bn_sqr_words
    474 align	16
    475 _bn_sqr_words:
    476 L$_bn_sqr_words_begin:
    477 	lea	eax,[_OPENSSL_ia32cap_P]
    478 	bt	DWORD [eax],26
    479 	jnc	NEAR L$015sqr_non_sse2
    480 	mov	eax,DWORD [4+esp]
    481 	mov	edx,DWORD [8+esp]
    482 	mov	ecx,DWORD [12+esp]
    483 align	16
    484 L$016sqr_sse2_loop:
    485 	movd	mm0,DWORD [edx]
    486 	pmuludq	mm0,mm0
    487 	lea	edx,[4+edx]
    488 	movq	[eax],mm0
    489 	sub	ecx,1
    490 	lea	eax,[8+eax]
    491 	jnz	NEAR L$016sqr_sse2_loop
    492 	emms
    493 	ret
    494 align	16
    495 L$015sqr_non_sse2:
    496 	push	ebp
    497 	push	ebx
    498 	push	esi
    499 	push	edi
    500 	; 
    501 	mov	esi,DWORD [20+esp]
    502 	mov	edi,DWORD [24+esp]
    503 	mov	ebx,DWORD [28+esp]
    504 	and	ebx,4294967288
    505 	jz	NEAR L$017sw_finish
    506 L$018sw_loop:
    507 	; Round 0
    508 	mov	eax,DWORD [edi]
    509 	mul	eax
    510 	mov	DWORD [esi],eax
    511 	mov	DWORD [4+esi],edx
    512 	; Round 4
    513 	mov	eax,DWORD [4+edi]
    514 	mul	eax
    515 	mov	DWORD [8+esi],eax
    516 	mov	DWORD [12+esi],edx
    517 	; Round 8
    518 	mov	eax,DWORD [8+edi]
    519 	mul	eax
    520 	mov	DWORD [16+esi],eax
    521 	mov	DWORD [20+esi],edx
    522 	; Round 12
    523 	mov	eax,DWORD [12+edi]
    524 	mul	eax
    525 	mov	DWORD [24+esi],eax
    526 	mov	DWORD [28+esi],edx
    527 	; Round 16
    528 	mov	eax,DWORD [16+edi]
    529 	mul	eax
    530 	mov	DWORD [32+esi],eax
    531 	mov	DWORD [36+esi],edx
    532 	; Round 20
    533 	mov	eax,DWORD [20+edi]
    534 	mul	eax
    535 	mov	DWORD [40+esi],eax
    536 	mov	DWORD [44+esi],edx
    537 	; Round 24
    538 	mov	eax,DWORD [24+edi]
    539 	mul	eax
    540 	mov	DWORD [48+esi],eax
    541 	mov	DWORD [52+esi],edx
    542 	; Round 28
    543 	mov	eax,DWORD [28+edi]
    544 	mul	eax
    545 	mov	DWORD [56+esi],eax
    546 	mov	DWORD [60+esi],edx
    547 	; 
    548 	add	edi,32
    549 	add	esi,64
    550 	sub	ebx,8
    551 	jnz	NEAR L$018sw_loop
    552 L$017sw_finish:
    553 	mov	ebx,DWORD [28+esp]
    554 	and	ebx,7
    555 	jz	NEAR L$019sw_end
    556 	; Tail Round 0
    557 	mov	eax,DWORD [edi]
    558 	mul	eax
    559 	mov	DWORD [esi],eax
    560 	dec	ebx
    561 	mov	DWORD [4+esi],edx
    562 	jz	NEAR L$019sw_end
    563 	; Tail Round 1
    564 	mov	eax,DWORD [4+edi]
    565 	mul	eax
    566 	mov	DWORD [8+esi],eax
    567 	dec	ebx
    568 	mov	DWORD [12+esi],edx
    569 	jz	NEAR L$019sw_end
    570 	; Tail Round 2
    571 	mov	eax,DWORD [8+edi]
    572 	mul	eax
    573 	mov	DWORD [16+esi],eax
    574 	dec	ebx
    575 	mov	DWORD [20+esi],edx
    576 	jz	NEAR L$019sw_end
    577 	; Tail Round 3
    578 	mov	eax,DWORD [12+edi]
    579 	mul	eax
    580 	mov	DWORD [24+esi],eax
    581 	dec	ebx
    582 	mov	DWORD [28+esi],edx
    583 	jz	NEAR L$019sw_end
    584 	; Tail Round 4
    585 	mov	eax,DWORD [16+edi]
    586 	mul	eax
    587 	mov	DWORD [32+esi],eax
    588 	dec	ebx
    589 	mov	DWORD [36+esi],edx
    590 	jz	NEAR L$019sw_end
    591 	; Tail Round 5
    592 	mov	eax,DWORD [20+edi]
    593 	mul	eax
    594 	mov	DWORD [40+esi],eax
    595 	dec	ebx
    596 	mov	DWORD [44+esi],edx
    597 	jz	NEAR L$019sw_end
    598 	; Tail Round 6
    599 	mov	eax,DWORD [24+edi]
    600 	mul	eax
    601 	mov	DWORD [48+esi],eax
    602 	mov	DWORD [52+esi],edx
    603 L$019sw_end:
    604 	pop	edi
    605 	pop	esi
    606 	pop	ebx
    607 	pop	ebp
    608 	ret
    609 global	_bn_div_words
    610 align	16
    611 _bn_div_words:
    612 L$_bn_div_words_begin:
    613 	mov	edx,DWORD [4+esp]
    614 	mov	eax,DWORD [8+esp]
    615 	mov	ecx,DWORD [12+esp]
    616 	div	ecx
    617 	ret
    618 global	_bn_add_words
    619 align	16
    620 _bn_add_words:
    621 L$_bn_add_words_begin:
    622 	push	ebp
    623 	push	ebx
    624 	push	esi
    625 	push	edi
    626 	; 
    627 	mov	ebx,DWORD [20+esp]
    628 	mov	esi,DWORD [24+esp]
    629 	mov	edi,DWORD [28+esp]
    630 	mov	ebp,DWORD [32+esp]
    631 	xor	eax,eax
    632 	and	ebp,4294967288
    633 	jz	NEAR L$020aw_finish
    634 L$021aw_loop:
    635 	; Round 0
    636 	mov	ecx,DWORD [esi]
    637 	mov	edx,DWORD [edi]
    638 	add	ecx,eax
    639 	mov	eax,0
    640 	adc	eax,eax
    641 	add	ecx,edx
    642 	adc	eax,0
    643 	mov	DWORD [ebx],ecx
    644 	; Round 1
    645 	mov	ecx,DWORD [4+esi]
    646 	mov	edx,DWORD [4+edi]
    647 	add	ecx,eax
    648 	mov	eax,0
    649 	adc	eax,eax
    650 	add	ecx,edx
    651 	adc	eax,0
    652 	mov	DWORD [4+ebx],ecx
    653 	; Round 2
    654 	mov	ecx,DWORD [8+esi]
    655 	mov	edx,DWORD [8+edi]
    656 	add	ecx,eax
    657 	mov	eax,0
    658 	adc	eax,eax
    659 	add	ecx,edx
    660 	adc	eax,0
    661 	mov	DWORD [8+ebx],ecx
    662 	; Round 3
    663 	mov	ecx,DWORD [12+esi]
    664 	mov	edx,DWORD [12+edi]
    665 	add	ecx,eax
    666 	mov	eax,0
    667 	adc	eax,eax
    668 	add	ecx,edx
    669 	adc	eax,0
    670 	mov	DWORD [12+ebx],ecx
    671 	; Round 4
    672 	mov	ecx,DWORD [16+esi]
    673 	mov	edx,DWORD [16+edi]
    674 	add	ecx,eax
    675 	mov	eax,0
    676 	adc	eax,eax
    677 	add	ecx,edx
    678 	adc	eax,0
    679 	mov	DWORD [16+ebx],ecx
    680 	; Round 5
    681 	mov	ecx,DWORD [20+esi]
    682 	mov	edx,DWORD [20+edi]
    683 	add	ecx,eax
    684 	mov	eax,0
    685 	adc	eax,eax
    686 	add	ecx,edx
    687 	adc	eax,0
    688 	mov	DWORD [20+ebx],ecx
    689 	; Round 6
    690 	mov	ecx,DWORD [24+esi]
    691 	mov	edx,DWORD [24+edi]
    692 	add	ecx,eax
    693 	mov	eax,0
    694 	adc	eax,eax
    695 	add	ecx,edx
    696 	adc	eax,0
    697 	mov	DWORD [24+ebx],ecx
    698 	; Round 7
    699 	mov	ecx,DWORD [28+esi]
    700 	mov	edx,DWORD [28+edi]
    701 	add	ecx,eax
    702 	mov	eax,0
    703 	adc	eax,eax
    704 	add	ecx,edx
    705 	adc	eax,0
    706 	mov	DWORD [28+ebx],ecx
    707 	; 
    708 	add	esi,32
    709 	add	edi,32
    710 	add	ebx,32
    711 	sub	ebp,8
    712 	jnz	NEAR L$021aw_loop
    713 L$020aw_finish:
    714 	mov	ebp,DWORD [32+esp]
    715 	and	ebp,7
    716 	jz	NEAR L$022aw_end
    717 	; Tail Round 0
    718 	mov	ecx,DWORD [esi]
    719 	mov	edx,DWORD [edi]
    720 	add	ecx,eax
    721 	mov	eax,0
    722 	adc	eax,eax
    723 	add	ecx,edx
    724 	adc	eax,0
    725 	dec	ebp
    726 	mov	DWORD [ebx],ecx
    727 	jz	NEAR L$022aw_end
    728 	; Tail Round 1
    729 	mov	ecx,DWORD [4+esi]
    730 	mov	edx,DWORD [4+edi]
    731 	add	ecx,eax
    732 	mov	eax,0
    733 	adc	eax,eax
    734 	add	ecx,edx
    735 	adc	eax,0
    736 	dec	ebp
    737 	mov	DWORD [4+ebx],ecx
    738 	jz	NEAR L$022aw_end
    739 	; Tail Round 2
    740 	mov	ecx,DWORD [8+esi]
    741 	mov	edx,DWORD [8+edi]
    742 	add	ecx,eax
    743 	mov	eax,0
    744 	adc	eax,eax
    745 	add	ecx,edx
    746 	adc	eax,0
    747 	dec	ebp
    748 	mov	DWORD [8+ebx],ecx
    749 	jz	NEAR L$022aw_end
    750 	; Tail Round 3
    751 	mov	ecx,DWORD [12+esi]
    752 	mov	edx,DWORD [12+edi]
    753 	add	ecx,eax
    754 	mov	eax,0
    755 	adc	eax,eax
    756 	add	ecx,edx
    757 	adc	eax,0
    758 	dec	ebp
    759 	mov	DWORD [12+ebx],ecx
    760 	jz	NEAR L$022aw_end
    761 	; Tail Round 4
    762 	mov	ecx,DWORD [16+esi]
    763 	mov	edx,DWORD [16+edi]
    764 	add	ecx,eax
    765 	mov	eax,0
    766 	adc	eax,eax
    767 	add	ecx,edx
    768 	adc	eax,0
    769 	dec	ebp
    770 	mov	DWORD [16+ebx],ecx
    771 	jz	NEAR L$022aw_end
    772 	; Tail Round 5
    773 	mov	ecx,DWORD [20+esi]
    774 	mov	edx,DWORD [20+edi]
    775 	add	ecx,eax
    776 	mov	eax,0
    777 	adc	eax,eax
    778 	add	ecx,edx
    779 	adc	eax,0
    780 	dec	ebp
    781 	mov	DWORD [20+ebx],ecx
    782 	jz	NEAR L$022aw_end
    783 	; Tail Round 6
    784 	mov	ecx,DWORD [24+esi]
    785 	mov	edx,DWORD [24+edi]
    786 	add	ecx,eax
    787 	mov	eax,0
    788 	adc	eax,eax
    789 	add	ecx,edx
    790 	adc	eax,0
    791 	mov	DWORD [24+ebx],ecx
    792 L$022aw_end:
    793 	pop	edi
    794 	pop	esi
    795 	pop	ebx
    796 	pop	ebp
    797 	ret
    798 global	_bn_sub_words
    799 align	16
    800 _bn_sub_words:
    801 L$_bn_sub_words_begin:
    802 	push	ebp
    803 	push	ebx
    804 	push	esi
    805 	push	edi
    806 	; 
    807 	mov	ebx,DWORD [20+esp]
    808 	mov	esi,DWORD [24+esp]
    809 	mov	edi,DWORD [28+esp]
    810 	mov	ebp,DWORD [32+esp]
    811 	xor	eax,eax
    812 	and	ebp,4294967288
    813 	jz	NEAR L$023aw_finish
    814 L$024aw_loop:
    815 	; Round 0
    816 	mov	ecx,DWORD [esi]
    817 	mov	edx,DWORD [edi]
    818 	sub	ecx,eax
    819 	mov	eax,0
    820 	adc	eax,eax
    821 	sub	ecx,edx
    822 	adc	eax,0
    823 	mov	DWORD [ebx],ecx
    824 	; Round 1
    825 	mov	ecx,DWORD [4+esi]
    826 	mov	edx,DWORD [4+edi]
    827 	sub	ecx,eax
    828 	mov	eax,0
    829 	adc	eax,eax
    830 	sub	ecx,edx
    831 	adc	eax,0
    832 	mov	DWORD [4+ebx],ecx
    833 	; Round 2
    834 	mov	ecx,DWORD [8+esi]
    835 	mov	edx,DWORD [8+edi]
    836 	sub	ecx,eax
    837 	mov	eax,0
    838 	adc	eax,eax
    839 	sub	ecx,edx
    840 	adc	eax,0
    841 	mov	DWORD [8+ebx],ecx
    842 	; Round 3
    843 	mov	ecx,DWORD [12+esi]
    844 	mov	edx,DWORD [12+edi]
    845 	sub	ecx,eax
    846 	mov	eax,0
    847 	adc	eax,eax
    848 	sub	ecx,edx
    849 	adc	eax,0
    850 	mov	DWORD [12+ebx],ecx
    851 	; Round 4
    852 	mov	ecx,DWORD [16+esi]
    853 	mov	edx,DWORD [16+edi]
    854 	sub	ecx,eax
    855 	mov	eax,0
    856 	adc	eax,eax
    857 	sub	ecx,edx
    858 	adc	eax,0
    859 	mov	DWORD [16+ebx],ecx
    860 	; Round 5
    861 	mov	ecx,DWORD [20+esi]
    862 	mov	edx,DWORD [20+edi]
    863 	sub	ecx,eax
    864 	mov	eax,0
    865 	adc	eax,eax
    866 	sub	ecx,edx
    867 	adc	eax,0
    868 	mov	DWORD [20+ebx],ecx
    869 	; Round 6
    870 	mov	ecx,DWORD [24+esi]
    871 	mov	edx,DWORD [24+edi]
    872 	sub	ecx,eax
    873 	mov	eax,0
    874 	adc	eax,eax
    875 	sub	ecx,edx
    876 	adc	eax,0
    877 	mov	DWORD [24+ebx],ecx
    878 	; Round 7
    879 	mov	ecx,DWORD [28+esi]
    880 	mov	edx,DWORD [28+edi]
    881 	sub	ecx,eax
    882 	mov	eax,0
    883 	adc	eax,eax
    884 	sub	ecx,edx
    885 	adc	eax,0
    886 	mov	DWORD [28+ebx],ecx
    887 	; 
    888 	add	esi,32
    889 	add	edi,32
    890 	add	ebx,32
    891 	sub	ebp,8
    892 	jnz	NEAR L$024aw_loop
    893 L$023aw_finish:
    894 	mov	ebp,DWORD [32+esp]
    895 	and	ebp,7
    896 	jz	NEAR L$025aw_end
    897 	; Tail Round 0
    898 	mov	ecx,DWORD [esi]
    899 	mov	edx,DWORD [edi]
    900 	sub	ecx,eax
    901 	mov	eax,0
    902 	adc	eax,eax
    903 	sub	ecx,edx
    904 	adc	eax,0
    905 	dec	ebp
    906 	mov	DWORD [ebx],ecx
    907 	jz	NEAR L$025aw_end
    908 	; Tail Round 1
    909 	mov	ecx,DWORD [4+esi]
    910 	mov	edx,DWORD [4+edi]
    911 	sub	ecx,eax
    912 	mov	eax,0
    913 	adc	eax,eax
    914 	sub	ecx,edx
    915 	adc	eax,0
    916 	dec	ebp
    917 	mov	DWORD [4+ebx],ecx
    918 	jz	NEAR L$025aw_end
    919 	; Tail Round 2
    920 	mov	ecx,DWORD [8+esi]
    921 	mov	edx,DWORD [8+edi]
    922 	sub	ecx,eax
    923 	mov	eax,0
    924 	adc	eax,eax
    925 	sub	ecx,edx
    926 	adc	eax,0
    927 	dec	ebp
    928 	mov	DWORD [8+ebx],ecx
    929 	jz	NEAR L$025aw_end
    930 	; Tail Round 3
    931 	mov	ecx,DWORD [12+esi]
    932 	mov	edx,DWORD [12+edi]
    933 	sub	ecx,eax
    934 	mov	eax,0
    935 	adc	eax,eax
    936 	sub	ecx,edx
    937 	adc	eax,0
    938 	dec	ebp
    939 	mov	DWORD [12+ebx],ecx
    940 	jz	NEAR L$025aw_end
    941 	; Tail Round 4
    942 	mov	ecx,DWORD [16+esi]
    943 	mov	edx,DWORD [16+edi]
    944 	sub	ecx,eax
    945 	mov	eax,0
    946 	adc	eax,eax
    947 	sub	ecx,edx
    948 	adc	eax,0
    949 	dec	ebp
    950 	mov	DWORD [16+ebx],ecx
    951 	jz	NEAR L$025aw_end
    952 	; Tail Round 5
    953 	mov	ecx,DWORD [20+esi]
    954 	mov	edx,DWORD [20+edi]
    955 	sub	ecx,eax
    956 	mov	eax,0
    957 	adc	eax,eax
    958 	sub	ecx,edx
    959 	adc	eax,0
    960 	dec	ebp
    961 	mov	DWORD [20+ebx],ecx
    962 	jz	NEAR L$025aw_end
    963 	; Tail Round 6
    964 	mov	ecx,DWORD [24+esi]
    965 	mov	edx,DWORD [24+edi]
    966 	sub	ecx,eax
    967 	mov	eax,0
    968 	adc	eax,eax
    969 	sub	ecx,edx
    970 	adc	eax,0
    971 	mov	DWORD [24+ebx],ecx
    972 L$025aw_end:
    973 	pop	edi
    974 	pop	esi
    975 	pop	ebx
    976 	pop	ebp
    977 	ret
    978 global	_bn_sub_part_words
    979 align	16
    980 _bn_sub_part_words:
    981 L$_bn_sub_part_words_begin:
    982 	push	ebp
    983 	push	ebx
    984 	push	esi
    985 	push	edi
    986 	; 
    987 	mov	ebx,DWORD [20+esp]
    988 	mov	esi,DWORD [24+esp]
    989 	mov	edi,DWORD [28+esp]
    990 	mov	ebp,DWORD [32+esp]
    991 	xor	eax,eax
    992 	and	ebp,4294967288
    993 	jz	NEAR L$026aw_finish
    994 L$027aw_loop:
    995 	; Round 0
    996 	mov	ecx,DWORD [esi]
    997 	mov	edx,DWORD [edi]
    998 	sub	ecx,eax
    999 	mov	eax,0
   1000 	adc	eax,eax
   1001 	sub	ecx,edx
   1002 	adc	eax,0
   1003 	mov	DWORD [ebx],ecx
   1004 	; Round 1
   1005 	mov	ecx,DWORD [4+esi]
   1006 	mov	edx,DWORD [4+edi]
   1007 	sub	ecx,eax
   1008 	mov	eax,0
   1009 	adc	eax,eax
   1010 	sub	ecx,edx
   1011 	adc	eax,0
   1012 	mov	DWORD [4+ebx],ecx
   1013 	; Round 2
   1014 	mov	ecx,DWORD [8+esi]
   1015 	mov	edx,DWORD [8+edi]
   1016 	sub	ecx,eax
   1017 	mov	eax,0
   1018 	adc	eax,eax
   1019 	sub	ecx,edx
   1020 	adc	eax,0
   1021 	mov	DWORD [8+ebx],ecx
   1022 	; Round 3
   1023 	mov	ecx,DWORD [12+esi]
   1024 	mov	edx,DWORD [12+edi]
   1025 	sub	ecx,eax
   1026 	mov	eax,0
   1027 	adc	eax,eax
   1028 	sub	ecx,edx
   1029 	adc	eax,0
   1030 	mov	DWORD [12+ebx],ecx
   1031 	; Round 4
   1032 	mov	ecx,DWORD [16+esi]
   1033 	mov	edx,DWORD [16+edi]
   1034 	sub	ecx,eax
   1035 	mov	eax,0
   1036 	adc	eax,eax
   1037 	sub	ecx,edx
   1038 	adc	eax,0
   1039 	mov	DWORD [16+ebx],ecx
   1040 	; Round 5
   1041 	mov	ecx,DWORD [20+esi]
   1042 	mov	edx,DWORD [20+edi]
   1043 	sub	ecx,eax
   1044 	mov	eax,0
   1045 	adc	eax,eax
   1046 	sub	ecx,edx
   1047 	adc	eax,0
   1048 	mov	DWORD [20+ebx],ecx
   1049 	; Round 6
   1050 	mov	ecx,DWORD [24+esi]
   1051 	mov	edx,DWORD [24+edi]
   1052 	sub	ecx,eax
   1053 	mov	eax,0
   1054 	adc	eax,eax
   1055 	sub	ecx,edx
   1056 	adc	eax,0
   1057 	mov	DWORD [24+ebx],ecx
   1058 	; Round 7
   1059 	mov	ecx,DWORD [28+esi]
   1060 	mov	edx,DWORD [28+edi]
   1061 	sub	ecx,eax
   1062 	mov	eax,0
   1063 	adc	eax,eax
   1064 	sub	ecx,edx
   1065 	adc	eax,0
   1066 	mov	DWORD [28+ebx],ecx
   1067 	; 
   1068 	add	esi,32
   1069 	add	edi,32
   1070 	add	ebx,32
   1071 	sub	ebp,8
   1072 	jnz	NEAR L$027aw_loop
   1073 L$026aw_finish:
   1074 	mov	ebp,DWORD [32+esp]
   1075 	and	ebp,7
   1076 	jz	NEAR L$028aw_end
   1077 	; Tail Round 0
   1078 	mov	ecx,DWORD [esi]
   1079 	mov	edx,DWORD [edi]
   1080 	sub	ecx,eax
   1081 	mov	eax,0
   1082 	adc	eax,eax
   1083 	sub	ecx,edx
   1084 	adc	eax,0
   1085 	mov	DWORD [ebx],ecx
   1086 	add	esi,4
   1087 	add	edi,4
   1088 	add	ebx,4
   1089 	dec	ebp
   1090 	jz	NEAR L$028aw_end
   1091 	; Tail Round 1
   1092 	mov	ecx,DWORD [esi]
   1093 	mov	edx,DWORD [edi]
   1094 	sub	ecx,eax
   1095 	mov	eax,0
   1096 	adc	eax,eax
   1097 	sub	ecx,edx
   1098 	adc	eax,0
   1099 	mov	DWORD [ebx],ecx
   1100 	add	esi,4
   1101 	add	edi,4
   1102 	add	ebx,4
   1103 	dec	ebp
   1104 	jz	NEAR L$028aw_end
   1105 	; Tail Round 2
   1106 	mov	ecx,DWORD [esi]
   1107 	mov	edx,DWORD [edi]
   1108 	sub	ecx,eax
   1109 	mov	eax,0
   1110 	adc	eax,eax
   1111 	sub	ecx,edx
   1112 	adc	eax,0
   1113 	mov	DWORD [ebx],ecx
   1114 	add	esi,4
   1115 	add	edi,4
   1116 	add	ebx,4
   1117 	dec	ebp
   1118 	jz	NEAR L$028aw_end
   1119 	; Tail Round 3
   1120 	mov	ecx,DWORD [esi]
   1121 	mov	edx,DWORD [edi]
   1122 	sub	ecx,eax
   1123 	mov	eax,0
   1124 	adc	eax,eax
   1125 	sub	ecx,edx
   1126 	adc	eax,0
   1127 	mov	DWORD [ebx],ecx
   1128 	add	esi,4
   1129 	add	edi,4
   1130 	add	ebx,4
   1131 	dec	ebp
   1132 	jz	NEAR L$028aw_end
   1133 	; Tail Round 4
   1134 	mov	ecx,DWORD [esi]
   1135 	mov	edx,DWORD [edi]
   1136 	sub	ecx,eax
   1137 	mov	eax,0
   1138 	adc	eax,eax
   1139 	sub	ecx,edx
   1140 	adc	eax,0
   1141 	mov	DWORD [ebx],ecx
   1142 	add	esi,4
   1143 	add	edi,4
   1144 	add	ebx,4
   1145 	dec	ebp
   1146 	jz	NEAR L$028aw_end
   1147 	; Tail Round 5
   1148 	mov	ecx,DWORD [esi]
   1149 	mov	edx,DWORD [edi]
   1150 	sub	ecx,eax
   1151 	mov	eax,0
   1152 	adc	eax,eax
   1153 	sub	ecx,edx
   1154 	adc	eax,0
   1155 	mov	DWORD [ebx],ecx
   1156 	add	esi,4
   1157 	add	edi,4
   1158 	add	ebx,4
   1159 	dec	ebp
   1160 	jz	NEAR L$028aw_end
   1161 	; Tail Round 6
   1162 	mov	ecx,DWORD [esi]
   1163 	mov	edx,DWORD [edi]
   1164 	sub	ecx,eax
   1165 	mov	eax,0
   1166 	adc	eax,eax
   1167 	sub	ecx,edx
   1168 	adc	eax,0
   1169 	mov	DWORD [ebx],ecx
   1170 	add	esi,4
   1171 	add	edi,4
   1172 	add	ebx,4
   1173 L$028aw_end:
   1174 	cmp	DWORD [36+esp],0
   1175 	je	NEAR L$029pw_end
   1176 	mov	ebp,DWORD [36+esp]
   1177 	cmp	ebp,0
   1178 	je	NEAR L$029pw_end
   1179 	jge	NEAR L$030pw_pos
   1180 	; pw_neg
   1181 	mov	edx,0
   1182 	sub	edx,ebp
   1183 	mov	ebp,edx
   1184 	and	ebp,4294967288
   1185 	jz	NEAR L$031pw_neg_finish
   1186 L$032pw_neg_loop:
   1187 	; dl<0 Round 0
   1188 	mov	ecx,0
   1189 	mov	edx,DWORD [edi]
   1190 	sub	ecx,eax
   1191 	mov	eax,0
   1192 	adc	eax,eax
   1193 	sub	ecx,edx
   1194 	adc	eax,0
   1195 	mov	DWORD [ebx],ecx
   1196 	; dl<0 Round 1
   1197 	mov	ecx,0
   1198 	mov	edx,DWORD [4+edi]
   1199 	sub	ecx,eax
   1200 	mov	eax,0
   1201 	adc	eax,eax
   1202 	sub	ecx,edx
   1203 	adc	eax,0
   1204 	mov	DWORD [4+ebx],ecx
   1205 	; dl<0 Round 2
   1206 	mov	ecx,0
   1207 	mov	edx,DWORD [8+edi]
   1208 	sub	ecx,eax
   1209 	mov	eax,0
   1210 	adc	eax,eax
   1211 	sub	ecx,edx
   1212 	adc	eax,0
   1213 	mov	DWORD [8+ebx],ecx
   1214 	; dl<0 Round 3
   1215 	mov	ecx,0
   1216 	mov	edx,DWORD [12+edi]
   1217 	sub	ecx,eax
   1218 	mov	eax,0
   1219 	adc	eax,eax
   1220 	sub	ecx,edx
   1221 	adc	eax,0
   1222 	mov	DWORD [12+ebx],ecx
   1223 	; dl<0 Round 4
   1224 	mov	ecx,0
   1225 	mov	edx,DWORD [16+edi]
   1226 	sub	ecx,eax
   1227 	mov	eax,0
   1228 	adc	eax,eax
   1229 	sub	ecx,edx
   1230 	adc	eax,0
   1231 	mov	DWORD [16+ebx],ecx
   1232 	; dl<0 Round 5
   1233 	mov	ecx,0
   1234 	mov	edx,DWORD [20+edi]
   1235 	sub	ecx,eax
   1236 	mov	eax,0
   1237 	adc	eax,eax
   1238 	sub	ecx,edx
   1239 	adc	eax,0
   1240 	mov	DWORD [20+ebx],ecx
   1241 	; dl<0 Round 6
   1242 	mov	ecx,0
   1243 	mov	edx,DWORD [24+edi]
   1244 	sub	ecx,eax
   1245 	mov	eax,0
   1246 	adc	eax,eax
   1247 	sub	ecx,edx
   1248 	adc	eax,0
   1249 	mov	DWORD [24+ebx],ecx
   1250 	; dl<0 Round 7
   1251 	mov	ecx,0
   1252 	mov	edx,DWORD [28+edi]
   1253 	sub	ecx,eax
   1254 	mov	eax,0
   1255 	adc	eax,eax
   1256 	sub	ecx,edx
   1257 	adc	eax,0
   1258 	mov	DWORD [28+ebx],ecx
   1259 	; 
   1260 	add	edi,32
   1261 	add	ebx,32
   1262 	sub	ebp,8
   1263 	jnz	NEAR L$032pw_neg_loop
   1264 L$031pw_neg_finish:
   1265 	mov	edx,DWORD [36+esp]
   1266 	mov	ebp,0
   1267 	sub	ebp,edx
   1268 	and	ebp,7
   1269 	jz	NEAR L$029pw_end
   1270 	; dl<0 Tail Round 0
   1271 	mov	ecx,0
   1272 	mov	edx,DWORD [edi]
   1273 	sub	ecx,eax
   1274 	mov	eax,0
   1275 	adc	eax,eax
   1276 	sub	ecx,edx
   1277 	adc	eax,0
   1278 	dec	ebp
   1279 	mov	DWORD [ebx],ecx
   1280 	jz	NEAR L$029pw_end
   1281 	; dl<0 Tail Round 1
   1282 	mov	ecx,0
   1283 	mov	edx,DWORD [4+edi]
   1284 	sub	ecx,eax
   1285 	mov	eax,0
   1286 	adc	eax,eax
   1287 	sub	ecx,edx
   1288 	adc	eax,0
   1289 	dec	ebp
   1290 	mov	DWORD [4+ebx],ecx
   1291 	jz	NEAR L$029pw_end
   1292 	; dl<0 Tail Round 2
   1293 	mov	ecx,0
   1294 	mov	edx,DWORD [8+edi]
   1295 	sub	ecx,eax
   1296 	mov	eax,0
   1297 	adc	eax,eax
   1298 	sub	ecx,edx
   1299 	adc	eax,0
   1300 	dec	ebp
   1301 	mov	DWORD [8+ebx],ecx
   1302 	jz	NEAR L$029pw_end
   1303 	; dl<0 Tail Round 3
   1304 	mov	ecx,0
   1305 	mov	edx,DWORD [12+edi]
   1306 	sub	ecx,eax
   1307 	mov	eax,0
   1308 	adc	eax,eax
   1309 	sub	ecx,edx
   1310 	adc	eax,0
   1311 	dec	ebp
   1312 	mov	DWORD [12+ebx],ecx
   1313 	jz	NEAR L$029pw_end
   1314 	; dl<0 Tail Round 4
   1315 	mov	ecx,0
   1316 	mov	edx,DWORD [16+edi]
   1317 	sub	ecx,eax
   1318 	mov	eax,0
   1319 	adc	eax,eax
   1320 	sub	ecx,edx
   1321 	adc	eax,0
   1322 	dec	ebp
   1323 	mov	DWORD [16+ebx],ecx
   1324 	jz	NEAR L$029pw_end
   1325 	; dl<0 Tail Round 5
   1326 	mov	ecx,0
   1327 	mov	edx,DWORD [20+edi]
   1328 	sub	ecx,eax
   1329 	mov	eax,0
   1330 	adc	eax,eax
   1331 	sub	ecx,edx
   1332 	adc	eax,0
   1333 	dec	ebp
   1334 	mov	DWORD [20+ebx],ecx
   1335 	jz	NEAR L$029pw_end
   1336 	; dl<0 Tail Round 6
   1337 	mov	ecx,0
   1338 	mov	edx,DWORD [24+edi]
   1339 	sub	ecx,eax
   1340 	mov	eax,0
   1341 	adc	eax,eax
   1342 	sub	ecx,edx
   1343 	adc	eax,0
   1344 	mov	DWORD [24+ebx],ecx
   1345 	jmp	NEAR L$029pw_end
   1346 L$030pw_pos:
   1347 	and	ebp,4294967288
   1348 	jz	NEAR L$033pw_pos_finish
   1349 L$034pw_pos_loop:
   1350 	; dl>0 Round 0
   1351 	mov	ecx,DWORD [esi]
   1352 	sub	ecx,eax
   1353 	mov	DWORD [ebx],ecx
   1354 	jnc	NEAR L$035pw_nc0
   1355 	; dl>0 Round 1
   1356 	mov	ecx,DWORD [4+esi]
   1357 	sub	ecx,eax
   1358 	mov	DWORD [4+ebx],ecx
   1359 	jnc	NEAR L$036pw_nc1
   1360 	; dl>0 Round 2
   1361 	mov	ecx,DWORD [8+esi]
   1362 	sub	ecx,eax
   1363 	mov	DWORD [8+ebx],ecx
   1364 	jnc	NEAR L$037pw_nc2
   1365 	; dl>0 Round 3
   1366 	mov	ecx,DWORD [12+esi]
   1367 	sub	ecx,eax
   1368 	mov	DWORD [12+ebx],ecx
   1369 	jnc	NEAR L$038pw_nc3
   1370 	; dl>0 Round 4
   1371 	mov	ecx,DWORD [16+esi]
   1372 	sub	ecx,eax
   1373 	mov	DWORD [16+ebx],ecx
   1374 	jnc	NEAR L$039pw_nc4
   1375 	; dl>0 Round 5
   1376 	mov	ecx,DWORD [20+esi]
   1377 	sub	ecx,eax
   1378 	mov	DWORD [20+ebx],ecx
   1379 	jnc	NEAR L$040pw_nc5
   1380 	; dl>0 Round 6
   1381 	mov	ecx,DWORD [24+esi]
   1382 	sub	ecx,eax
   1383 	mov	DWORD [24+ebx],ecx
   1384 	jnc	NEAR L$041pw_nc6
   1385 	; dl>0 Round 7
   1386 	mov	ecx,DWORD [28+esi]
   1387 	sub	ecx,eax
   1388 	mov	DWORD [28+ebx],ecx
   1389 	jnc	NEAR L$042pw_nc7
   1390 	; 
   1391 	add	esi,32
   1392 	add	ebx,32
   1393 	sub	ebp,8
   1394 	jnz	NEAR L$034pw_pos_loop
   1395 L$033pw_pos_finish:
   1396 	mov	ebp,DWORD [36+esp]
   1397 	and	ebp,7
   1398 	jz	NEAR L$029pw_end
   1399 	; dl>0 Tail Round 0
   1400 	mov	ecx,DWORD [esi]
   1401 	sub	ecx,eax
   1402 	mov	DWORD [ebx],ecx
   1403 	jnc	NEAR L$043pw_tail_nc0
   1404 	dec	ebp
   1405 	jz	NEAR L$029pw_end
   1406 	; dl>0 Tail Round 1
   1407 	mov	ecx,DWORD [4+esi]
   1408 	sub	ecx,eax
   1409 	mov	DWORD [4+ebx],ecx
   1410 	jnc	NEAR L$044pw_tail_nc1
   1411 	dec	ebp
   1412 	jz	NEAR L$029pw_end
   1413 	; dl>0 Tail Round 2
   1414 	mov	ecx,DWORD [8+esi]
   1415 	sub	ecx,eax
   1416 	mov	DWORD [8+ebx],ecx
   1417 	jnc	NEAR L$045pw_tail_nc2
   1418 	dec	ebp
   1419 	jz	NEAR L$029pw_end
   1420 	; dl>0 Tail Round 3
   1421 	mov	ecx,DWORD [12+esi]
   1422 	sub	ecx,eax
   1423 	mov	DWORD [12+ebx],ecx
   1424 	jnc	NEAR L$046pw_tail_nc3
   1425 	dec	ebp
   1426 	jz	NEAR L$029pw_end
   1427 	; dl>0 Tail Round 4
   1428 	mov	ecx,DWORD [16+esi]
   1429 	sub	ecx,eax
   1430 	mov	DWORD [16+ebx],ecx
   1431 	jnc	NEAR L$047pw_tail_nc4
   1432 	dec	ebp
   1433 	jz	NEAR L$029pw_end
   1434 	; dl>0 Tail Round 5
   1435 	mov	ecx,DWORD [20+esi]
   1436 	sub	ecx,eax
   1437 	mov	DWORD [20+ebx],ecx
   1438 	jnc	NEAR L$048pw_tail_nc5
   1439 	dec	ebp
   1440 	jz	NEAR L$029pw_end
   1441 	; dl>0 Tail Round 6
   1442 	mov	ecx,DWORD [24+esi]
   1443 	sub	ecx,eax
   1444 	mov	DWORD [24+ebx],ecx
   1445 	jnc	NEAR L$049pw_tail_nc6
   1446 	mov	eax,1
   1447 	jmp	NEAR L$029pw_end
   1448 L$050pw_nc_loop:
   1449 	mov	ecx,DWORD [esi]
   1450 	mov	DWORD [ebx],ecx
   1451 L$035pw_nc0:
   1452 	mov	ecx,DWORD [4+esi]
   1453 	mov	DWORD [4+ebx],ecx
   1454 L$036pw_nc1:
   1455 	mov	ecx,DWORD [8+esi]
   1456 	mov	DWORD [8+ebx],ecx
   1457 L$037pw_nc2:
   1458 	mov	ecx,DWORD [12+esi]
   1459 	mov	DWORD [12+ebx],ecx
   1460 L$038pw_nc3:
   1461 	mov	ecx,DWORD [16+esi]
   1462 	mov	DWORD [16+ebx],ecx
   1463 L$039pw_nc4:
   1464 	mov	ecx,DWORD [20+esi]
   1465 	mov	DWORD [20+ebx],ecx
   1466 L$040pw_nc5:
   1467 	mov	ecx,DWORD [24+esi]
   1468 	mov	DWORD [24+ebx],ecx
   1469 L$041pw_nc6:
   1470 	mov	ecx,DWORD [28+esi]
   1471 	mov	DWORD [28+ebx],ecx
   1472 L$042pw_nc7:
   1473 	; 
   1474 	add	esi,32
   1475 	add	ebx,32
   1476 	sub	ebp,8
   1477 	jnz	NEAR L$050pw_nc_loop
   1478 	mov	ebp,DWORD [36+esp]
   1479 	and	ebp,7
   1480 	jz	NEAR L$051pw_nc_end
   1481 	mov	ecx,DWORD [esi]
   1482 	mov	DWORD [ebx],ecx
   1483 L$043pw_tail_nc0:
   1484 	dec	ebp
   1485 	jz	NEAR L$051pw_nc_end
   1486 	mov	ecx,DWORD [4+esi]
   1487 	mov	DWORD [4+ebx],ecx
   1488 L$044pw_tail_nc1:
   1489 	dec	ebp
   1490 	jz	NEAR L$051pw_nc_end
   1491 	mov	ecx,DWORD [8+esi]
   1492 	mov	DWORD [8+ebx],ecx
   1493 L$045pw_tail_nc2:
   1494 	dec	ebp
   1495 	jz	NEAR L$051pw_nc_end
   1496 	mov	ecx,DWORD [12+esi]
   1497 	mov	DWORD [12+ebx],ecx
   1498 L$046pw_tail_nc3:
   1499 	dec	ebp
   1500 	jz	NEAR L$051pw_nc_end
   1501 	mov	ecx,DWORD [16+esi]
   1502 	mov	DWORD [16+ebx],ecx
   1503 L$047pw_tail_nc4:
   1504 	dec	ebp
   1505 	jz	NEAR L$051pw_nc_end
   1506 	mov	ecx,DWORD [20+esi]
   1507 	mov	DWORD [20+ebx],ecx
   1508 L$048pw_tail_nc5:
   1509 	dec	ebp
   1510 	jz	NEAR L$051pw_nc_end
   1511 	mov	ecx,DWORD [24+esi]
   1512 	mov	DWORD [24+ebx],ecx
   1513 L$049pw_tail_nc6:
   1514 L$051pw_nc_end:
   1515 	mov	eax,0
   1516 L$029pw_end:
   1517 	pop	edi
   1518 	pop	esi
   1519 	pop	ebx
   1520 	pop	ebp
   1521 	ret
   1522 segment	.bss
   1523 common	_OPENSSL_ia32cap_P 16
   1524