Home | History | Annotate | Download | only in bn
      1 OPTION	DOTNAME
      2 .text$	SEGMENT ALIGN(256) 'CODE'
      3 
      4 EXTERN	OPENSSL_ia32cap_P:NEAR
      5 
      6 PUBLIC	bn_mul_mont
      7 
      8 ALIGN	16
      9 bn_mul_mont	PROC PUBLIC
     10 	mov	QWORD PTR[8+rsp],rdi	;WIN64 prologue
     11 	mov	QWORD PTR[16+rsp],rsi
     12 	mov	rax,rsp
     13 $L$SEH_begin_bn_mul_mont::
     14 	mov	rdi,rcx
     15 	mov	rsi,rdx
     16 	mov	rdx,r8
     17 	mov	rcx,r9
     18 	mov	r8,QWORD PTR[40+rsp]
     19 	mov	r9,QWORD PTR[48+rsp]
     20 
     21 
     22 	test	r9d,3
     23 	jnz	$L$mul_enter
     24 	cmp	r9d,8
     25 	jb	$L$mul_enter
     26 	cmp	rdx,rsi
     27 	jne	$L$mul4x_enter
     28 	test	r9d,7
     29 	jz	$L$sqr8x_enter
     30 	jmp	$L$mul4x_enter
     31 
     32 ALIGN	16
     33 $L$mul_enter::
     34 	push	rbx
     35 	push	rbp
     36 	push	r12
     37 	push	r13
     38 	push	r14
     39 	push	r15
     40 
     41 	mov	r9d,r9d
     42 	lea	r10,QWORD PTR[2+r9]
     43 	mov	r11,rsp
     44 	neg	r10
     45 	lea	rsp,QWORD PTR[r10*8+rsp]
     46 	and	rsp,-1024
     47 
     48 	mov	QWORD PTR[8+r9*8+rsp],r11
     49 $L$mul_body::
     50 	mov	r12,rdx
     51 	mov	r8,QWORD PTR[r8]
     52 	mov	rbx,QWORD PTR[r12]
     53 	mov	rax,QWORD PTR[rsi]
     54 
     55 	xor	r14,r14
     56 	xor	r15,r15
     57 
     58 	mov	rbp,r8
     59 	mul	rbx
     60 	mov	r10,rax
     61 	mov	rax,QWORD PTR[rcx]
     62 
     63 	imul	rbp,r10
     64 	mov	r11,rdx
     65 
     66 	mul	rbp
     67 	add	r10,rax
     68 	mov	rax,QWORD PTR[8+rsi]
     69 	adc	rdx,0
     70 	mov	r13,rdx
     71 
     72 	lea	r15,QWORD PTR[1+r15]
     73 	jmp	$L$1st_enter
     74 
     75 ALIGN	16
     76 $L$1st::
     77 	add	r13,rax
     78 	mov	rax,QWORD PTR[r15*8+rsi]
     79 	adc	rdx,0
     80 	add	r13,r11
     81 	mov	r11,r10
     82 	adc	rdx,0
     83 	mov	QWORD PTR[((-16))+r15*8+rsp],r13
     84 	mov	r13,rdx
     85 
     86 $L$1st_enter::
     87 	mul	rbx
     88 	add	r11,rax
     89 	mov	rax,QWORD PTR[r15*8+rcx]
     90 	adc	rdx,0
     91 	lea	r15,QWORD PTR[1+r15]
     92 	mov	r10,rdx
     93 
     94 	mul	rbp
     95 	cmp	r15,r9
     96 	jne	$L$1st
     97 
     98 	add	r13,rax
     99 	mov	rax,QWORD PTR[rsi]
    100 	adc	rdx,0
    101 	add	r13,r11
    102 	adc	rdx,0
    103 	mov	QWORD PTR[((-16))+r15*8+rsp],r13
    104 	mov	r13,rdx
    105 	mov	r11,r10
    106 
    107 	xor	rdx,rdx
    108 	add	r13,r11
    109 	adc	rdx,0
    110 	mov	QWORD PTR[((-8))+r9*8+rsp],r13
    111 	mov	QWORD PTR[r9*8+rsp],rdx
    112 
    113 	lea	r14,QWORD PTR[1+r14]
    114 	jmp	$L$outer
    115 ALIGN	16
    116 $L$outer::
    117 	mov	rbx,QWORD PTR[r14*8+r12]
    118 	xor	r15,r15
    119 	mov	rbp,r8
    120 	mov	r10,QWORD PTR[rsp]
    121 	mul	rbx
    122 	add	r10,rax
    123 	mov	rax,QWORD PTR[rcx]
    124 	adc	rdx,0
    125 
    126 	imul	rbp,r10
    127 	mov	r11,rdx
    128 
    129 	mul	rbp
    130 	add	r10,rax
    131 	mov	rax,QWORD PTR[8+rsi]
    132 	adc	rdx,0
    133 	mov	r10,QWORD PTR[8+rsp]
    134 	mov	r13,rdx
    135 
    136 	lea	r15,QWORD PTR[1+r15]
    137 	jmp	$L$inner_enter
    138 
    139 ALIGN	16
    140 $L$inner::
    141 	add	r13,rax
    142 	mov	rax,QWORD PTR[r15*8+rsi]
    143 	adc	rdx,0
    144 	add	r13,r10
    145 	mov	r10,QWORD PTR[r15*8+rsp]
    146 	adc	rdx,0
    147 	mov	QWORD PTR[((-16))+r15*8+rsp],r13
    148 	mov	r13,rdx
    149 
    150 $L$inner_enter::
    151 	mul	rbx
    152 	add	r11,rax
    153 	mov	rax,QWORD PTR[r15*8+rcx]
    154 	adc	rdx,0
    155 	add	r10,r11
    156 	mov	r11,rdx
    157 	adc	r11,0
    158 	lea	r15,QWORD PTR[1+r15]
    159 
    160 	mul	rbp
    161 	cmp	r15,r9
    162 	jne	$L$inner
    163 
    164 	add	r13,rax
    165 	mov	rax,QWORD PTR[rsi]
    166 	adc	rdx,0
    167 	add	r13,r10
    168 	mov	r10,QWORD PTR[r15*8+rsp]
    169 	adc	rdx,0
    170 	mov	QWORD PTR[((-16))+r15*8+rsp],r13
    171 	mov	r13,rdx
    172 
    173 	xor	rdx,rdx
    174 	add	r13,r11
    175 	adc	rdx,0
    176 	add	r13,r10
    177 	adc	rdx,0
    178 	mov	QWORD PTR[((-8))+r9*8+rsp],r13
    179 	mov	QWORD PTR[r9*8+rsp],rdx
    180 
    181 	lea	r14,QWORD PTR[1+r14]
    182 	cmp	r14,r9
    183 	jb	$L$outer
    184 
    185 	xor	r14,r14
    186 	mov	rax,QWORD PTR[rsp]
    187 	lea	rsi,QWORD PTR[rsp]
    188 	mov	r15,r9
    189 	jmp	$L$sub
    190 ALIGN	16
    191 $L$sub::	sbb	rax,QWORD PTR[r14*8+rcx]
    192 	mov	QWORD PTR[r14*8+rdi],rax
    193 	mov	rax,QWORD PTR[8+r14*8+rsi]
    194 	lea	r14,QWORD PTR[1+r14]
    195 	dec	r15
    196 	jnz	$L$sub
    197 
    198 	sbb	rax,0
    199 	xor	r14,r14
    200 	mov	r15,r9
    201 ALIGN	16
    202 $L$copy::
    203 	mov	rsi,QWORD PTR[r14*8+rsp]
    204 	mov	rcx,QWORD PTR[r14*8+rdi]
    205 	xor	rsi,rcx
    206 	and	rsi,rax
    207 	xor	rsi,rcx
    208 	mov	QWORD PTR[r14*8+rsp],r14
    209 	mov	QWORD PTR[r14*8+rdi],rsi
    210 	lea	r14,QWORD PTR[1+r14]
    211 	sub	r15,1
    212 	jnz	$L$copy
    213 
    214 	mov	rsi,QWORD PTR[8+r9*8+rsp]
    215 	mov	rax,1
    216 	mov	r15,QWORD PTR[rsi]
    217 	mov	r14,QWORD PTR[8+rsi]
    218 	mov	r13,QWORD PTR[16+rsi]
    219 	mov	r12,QWORD PTR[24+rsi]
    220 	mov	rbp,QWORD PTR[32+rsi]
    221 	mov	rbx,QWORD PTR[40+rsi]
    222 	lea	rsp,QWORD PTR[48+rsi]
    223 $L$mul_epilogue::
    224 	mov	rdi,QWORD PTR[8+rsp]	;WIN64 epilogue
    225 	mov	rsi,QWORD PTR[16+rsp]
    226 	DB	0F3h,0C3h		;repret
    227 $L$SEH_end_bn_mul_mont::
    228 bn_mul_mont	ENDP
    229 
    230 ALIGN	16
    231 bn_mul4x_mont	PROC PRIVATE
    232 	mov	QWORD PTR[8+rsp],rdi	;WIN64 prologue
    233 	mov	QWORD PTR[16+rsp],rsi
    234 	mov	rax,rsp
    235 $L$SEH_begin_bn_mul4x_mont::
    236 	mov	rdi,rcx
    237 	mov	rsi,rdx
    238 	mov	rdx,r8
    239 	mov	rcx,r9
    240 	mov	r8,QWORD PTR[40+rsp]
    241 	mov	r9,QWORD PTR[48+rsp]
    242 
    243 
    244 $L$mul4x_enter::
    245 	push	rbx
    246 	push	rbp
    247 	push	r12
    248 	push	r13
    249 	push	r14
    250 	push	r15
    251 
    252 	mov	r9d,r9d
    253 	lea	r10,QWORD PTR[4+r9]
    254 	mov	r11,rsp
    255 	neg	r10
    256 	lea	rsp,QWORD PTR[r10*8+rsp]
    257 	and	rsp,-1024
    258 
    259 	mov	QWORD PTR[8+r9*8+rsp],r11
    260 $L$mul4x_body::
    261 	mov	QWORD PTR[16+r9*8+rsp],rdi
    262 	mov	r12,rdx
    263 	mov	r8,QWORD PTR[r8]
    264 	mov	rbx,QWORD PTR[r12]
    265 	mov	rax,QWORD PTR[rsi]
    266 
    267 	xor	r14,r14
    268 	xor	r15,r15
    269 
    270 	mov	rbp,r8
    271 	mul	rbx
    272 	mov	r10,rax
    273 	mov	rax,QWORD PTR[rcx]
    274 
    275 	imul	rbp,r10
    276 	mov	r11,rdx
    277 
    278 	mul	rbp
    279 	add	r10,rax
    280 	mov	rax,QWORD PTR[8+rsi]
    281 	adc	rdx,0
    282 	mov	rdi,rdx
    283 
    284 	mul	rbx
    285 	add	r11,rax
    286 	mov	rax,QWORD PTR[8+rcx]
    287 	adc	rdx,0
    288 	mov	r10,rdx
    289 
    290 	mul	rbp
    291 	add	rdi,rax
    292 	mov	rax,QWORD PTR[16+rsi]
    293 	adc	rdx,0
    294 	add	rdi,r11
    295 	lea	r15,QWORD PTR[4+r15]
    296 	adc	rdx,0
    297 	mov	QWORD PTR[rsp],rdi
    298 	mov	r13,rdx
    299 	jmp	$L$1st4x
    300 ALIGN	16
    301 $L$1st4x::
    302 	mul	rbx
    303 	add	r10,rax
    304 	mov	rax,QWORD PTR[((-16))+r15*8+rcx]
    305 	adc	rdx,0
    306 	mov	r11,rdx
    307 
    308 	mul	rbp
    309 	add	r13,rax
    310 	mov	rax,QWORD PTR[((-8))+r15*8+rsi]
    311 	adc	rdx,0
    312 	add	r13,r10
    313 	adc	rdx,0
    314 	mov	QWORD PTR[((-24))+r15*8+rsp],r13
    315 	mov	rdi,rdx
    316 
    317 	mul	rbx
    318 	add	r11,rax
    319 	mov	rax,QWORD PTR[((-8))+r15*8+rcx]
    320 	adc	rdx,0
    321 	mov	r10,rdx
    322 
    323 	mul	rbp
    324 	add	rdi,rax
    325 	mov	rax,QWORD PTR[r15*8+rsi]
    326 	adc	rdx,0
    327 	add	rdi,r11
    328 	adc	rdx,0
    329 	mov	QWORD PTR[((-16))+r15*8+rsp],rdi
    330 	mov	r13,rdx
    331 
    332 	mul	rbx
    333 	add	r10,rax
    334 	mov	rax,QWORD PTR[r15*8+rcx]
    335 	adc	rdx,0
    336 	mov	r11,rdx
    337 
    338 	mul	rbp
    339 	add	r13,rax
    340 	mov	rax,QWORD PTR[8+r15*8+rsi]
    341 	adc	rdx,0
    342 	add	r13,r10
    343 	adc	rdx,0
    344 	mov	QWORD PTR[((-8))+r15*8+rsp],r13
    345 	mov	rdi,rdx
    346 
    347 	mul	rbx
    348 	add	r11,rax
    349 	mov	rax,QWORD PTR[8+r15*8+rcx]
    350 	adc	rdx,0
    351 	lea	r15,QWORD PTR[4+r15]
    352 	mov	r10,rdx
    353 
    354 	mul	rbp
    355 	add	rdi,rax
    356 	mov	rax,QWORD PTR[((-16))+r15*8+rsi]
    357 	adc	rdx,0
    358 	add	rdi,r11
    359 	adc	rdx,0
    360 	mov	QWORD PTR[((-32))+r15*8+rsp],rdi
    361 	mov	r13,rdx
    362 	cmp	r15,r9
    363 	jb	$L$1st4x
    364 
    365 	mul	rbx
    366 	add	r10,rax
    367 	mov	rax,QWORD PTR[((-16))+r15*8+rcx]
    368 	adc	rdx,0
    369 	mov	r11,rdx
    370 
    371 	mul	rbp
    372 	add	r13,rax
    373 	mov	rax,QWORD PTR[((-8))+r15*8+rsi]
    374 	adc	rdx,0
    375 	add	r13,r10
    376 	adc	rdx,0
    377 	mov	QWORD PTR[((-24))+r15*8+rsp],r13
    378 	mov	rdi,rdx
    379 
    380 	mul	rbx
    381 	add	r11,rax
    382 	mov	rax,QWORD PTR[((-8))+r15*8+rcx]
    383 	adc	rdx,0
    384 	mov	r10,rdx
    385 
    386 	mul	rbp
    387 	add	rdi,rax
    388 	mov	rax,QWORD PTR[rsi]
    389 	adc	rdx,0
    390 	add	rdi,r11
    391 	adc	rdx,0
    392 	mov	QWORD PTR[((-16))+r15*8+rsp],rdi
    393 	mov	r13,rdx
    394 
    395 	xor	rdi,rdi
    396 	add	r13,r10
    397 	adc	rdi,0
    398 	mov	QWORD PTR[((-8))+r15*8+rsp],r13
    399 	mov	QWORD PTR[r15*8+rsp],rdi
    400 
    401 	lea	r14,QWORD PTR[1+r14]
    402 ALIGN	4
    403 $L$outer4x::
    404 	mov	rbx,QWORD PTR[r14*8+r12]
    405 	xor	r15,r15
    406 	mov	r10,QWORD PTR[rsp]
    407 	mov	rbp,r8
    408 	mul	rbx
    409 	add	r10,rax
    410 	mov	rax,QWORD PTR[rcx]
    411 	adc	rdx,0
    412 
    413 	imul	rbp,r10
    414 	mov	r11,rdx
    415 
    416 	mul	rbp
    417 	add	r10,rax
    418 	mov	rax,QWORD PTR[8+rsi]
    419 	adc	rdx,0
    420 	mov	rdi,rdx
    421 
    422 	mul	rbx
    423 	add	r11,rax
    424 	mov	rax,QWORD PTR[8+rcx]
    425 	adc	rdx,0
    426 	add	r11,QWORD PTR[8+rsp]
    427 	adc	rdx,0
    428 	mov	r10,rdx
    429 
    430 	mul	rbp
    431 	add	rdi,rax
    432 	mov	rax,QWORD PTR[16+rsi]
    433 	adc	rdx,0
    434 	add	rdi,r11
    435 	lea	r15,QWORD PTR[4+r15]
    436 	adc	rdx,0
    437 	mov	QWORD PTR[rsp],rdi
    438 	mov	r13,rdx
    439 	jmp	$L$inner4x
    440 ALIGN	16
    441 $L$inner4x::
    442 	mul	rbx
    443 	add	r10,rax
    444 	mov	rax,QWORD PTR[((-16))+r15*8+rcx]
    445 	adc	rdx,0
    446 	add	r10,QWORD PTR[((-16))+r15*8+rsp]
    447 	adc	rdx,0
    448 	mov	r11,rdx
    449 
    450 	mul	rbp
    451 	add	r13,rax
    452 	mov	rax,QWORD PTR[((-8))+r15*8+rsi]
    453 	adc	rdx,0
    454 	add	r13,r10
    455 	adc	rdx,0
    456 	mov	QWORD PTR[((-24))+r15*8+rsp],r13
    457 	mov	rdi,rdx
    458 
    459 	mul	rbx
    460 	add	r11,rax
    461 	mov	rax,QWORD PTR[((-8))+r15*8+rcx]
    462 	adc	rdx,0
    463 	add	r11,QWORD PTR[((-8))+r15*8+rsp]
    464 	adc	rdx,0
    465 	mov	r10,rdx
    466 
    467 	mul	rbp
    468 	add	rdi,rax
    469 	mov	rax,QWORD PTR[r15*8+rsi]
    470 	adc	rdx,0
    471 	add	rdi,r11
    472 	adc	rdx,0
    473 	mov	QWORD PTR[((-16))+r15*8+rsp],rdi
    474 	mov	r13,rdx
    475 
    476 	mul	rbx
    477 	add	r10,rax
    478 	mov	rax,QWORD PTR[r15*8+rcx]
    479 	adc	rdx,0
    480 	add	r10,QWORD PTR[r15*8+rsp]
    481 	adc	rdx,0
    482 	mov	r11,rdx
    483 
    484 	mul	rbp
    485 	add	r13,rax
    486 	mov	rax,QWORD PTR[8+r15*8+rsi]
    487 	adc	rdx,0
    488 	add	r13,r10
    489 	adc	rdx,0
    490 	mov	QWORD PTR[((-8))+r15*8+rsp],r13
    491 	mov	rdi,rdx
    492 
    493 	mul	rbx
    494 	add	r11,rax
    495 	mov	rax,QWORD PTR[8+r15*8+rcx]
    496 	adc	rdx,0
    497 	add	r11,QWORD PTR[8+r15*8+rsp]
    498 	adc	rdx,0
    499 	lea	r15,QWORD PTR[4+r15]
    500 	mov	r10,rdx
    501 
    502 	mul	rbp
    503 	add	rdi,rax
    504 	mov	rax,QWORD PTR[((-16))+r15*8+rsi]
    505 	adc	rdx,0
    506 	add	rdi,r11
    507 	adc	rdx,0
    508 	mov	QWORD PTR[((-32))+r15*8+rsp],rdi
    509 	mov	r13,rdx
    510 	cmp	r15,r9
    511 	jb	$L$inner4x
    512 
    513 	mul	rbx
    514 	add	r10,rax
    515 	mov	rax,QWORD PTR[((-16))+r15*8+rcx]
    516 	adc	rdx,0
    517 	add	r10,QWORD PTR[((-16))+r15*8+rsp]
    518 	adc	rdx,0
    519 	mov	r11,rdx
    520 
    521 	mul	rbp
    522 	add	r13,rax
    523 	mov	rax,QWORD PTR[((-8))+r15*8+rsi]
    524 	adc	rdx,0
    525 	add	r13,r10
    526 	adc	rdx,0
    527 	mov	QWORD PTR[((-24))+r15*8+rsp],r13
    528 	mov	rdi,rdx
    529 
    530 	mul	rbx
    531 	add	r11,rax
    532 	mov	rax,QWORD PTR[((-8))+r15*8+rcx]
    533 	adc	rdx,0
    534 	add	r11,QWORD PTR[((-8))+r15*8+rsp]
    535 	adc	rdx,0
    536 	lea	r14,QWORD PTR[1+r14]
    537 	mov	r10,rdx
    538 
    539 	mul	rbp
    540 	add	rdi,rax
    541 	mov	rax,QWORD PTR[rsi]
    542 	adc	rdx,0
    543 	add	rdi,r11
    544 	adc	rdx,0
    545 	mov	QWORD PTR[((-16))+r15*8+rsp],rdi
    546 	mov	r13,rdx
    547 
    548 	xor	rdi,rdi
    549 	add	r13,r10
    550 	adc	rdi,0
    551 	add	r13,QWORD PTR[r9*8+rsp]
    552 	adc	rdi,0
    553 	mov	QWORD PTR[((-8))+r15*8+rsp],r13
    554 	mov	QWORD PTR[r15*8+rsp],rdi
    555 
    556 	cmp	r14,r9
    557 	jb	$L$outer4x
    558 	mov	rdi,QWORD PTR[16+r9*8+rsp]
    559 	mov	rax,QWORD PTR[rsp]
    560 	mov	rdx,QWORD PTR[8+rsp]
    561 	shr	r9,2
    562 	lea	rsi,QWORD PTR[rsp]
    563 	xor	r14,r14
    564 
    565 	sub	rax,QWORD PTR[rcx]
    566 	mov	rbx,QWORD PTR[16+rsi]
    567 	mov	rbp,QWORD PTR[24+rsi]
    568 	sbb	rdx,QWORD PTR[8+rcx]
    569 	lea	r15,QWORD PTR[((-1))+r9]
    570 	jmp	$L$sub4x
    571 ALIGN	16
    572 $L$sub4x::
    573 	mov	QWORD PTR[r14*8+rdi],rax
    574 	mov	QWORD PTR[8+r14*8+rdi],rdx
    575 	sbb	rbx,QWORD PTR[16+r14*8+rcx]
    576 	mov	rax,QWORD PTR[32+r14*8+rsi]
    577 	mov	rdx,QWORD PTR[40+r14*8+rsi]
    578 	sbb	rbp,QWORD PTR[24+r14*8+rcx]
    579 	mov	QWORD PTR[16+r14*8+rdi],rbx
    580 	mov	QWORD PTR[24+r14*8+rdi],rbp
    581 	sbb	rax,QWORD PTR[32+r14*8+rcx]
    582 	mov	rbx,QWORD PTR[48+r14*8+rsi]
    583 	mov	rbp,QWORD PTR[56+r14*8+rsi]
    584 	sbb	rdx,QWORD PTR[40+r14*8+rcx]
    585 	lea	r14,QWORD PTR[4+r14]
    586 	dec	r15
    587 	jnz	$L$sub4x
    588 
    589 	mov	QWORD PTR[r14*8+rdi],rax
    590 	mov	rax,QWORD PTR[32+r14*8+rsi]
    591 	sbb	rbx,QWORD PTR[16+r14*8+rcx]
    592 	mov	QWORD PTR[8+r14*8+rdi],rdx
    593 	sbb	rbp,QWORD PTR[24+r14*8+rcx]
    594 	mov	QWORD PTR[16+r14*8+rdi],rbx
    595 
    596 	sbb	rax,0
    597 DB 66h, 48h, 0fh, 6eh, 0c0h
    598 	punpcklqdq	xmm0,xmm0
    599 	mov	QWORD PTR[24+r14*8+rdi],rbp
    600 	xor	r14,r14
    601 
    602 	mov	r15,r9
    603 	pxor	xmm5,xmm5
    604 	jmp	$L$copy4x
    605 ALIGN	16
    606 $L$copy4x::
    607 	movdqu	xmm2,XMMWORD PTR[r14*1+rsp]
    608 	movdqu	xmm4,XMMWORD PTR[16+r14*1+rsp]
    609 	movdqu	xmm1,XMMWORD PTR[r14*1+rdi]
    610 	movdqu	xmm3,XMMWORD PTR[16+r14*1+rdi]
    611 	pxor	xmm2,xmm1
    612 	pxor	xmm4,xmm3
    613 	pand	xmm2,xmm0
    614 	pand	xmm4,xmm0
    615 	pxor	xmm2,xmm1
    616 	pxor	xmm4,xmm3
    617 	movdqu	XMMWORD PTR[r14*1+rdi],xmm2
    618 	movdqu	XMMWORD PTR[16+r14*1+rdi],xmm4
    619 	movdqa	XMMWORD PTR[r14*1+rsp],xmm5
    620 	movdqa	XMMWORD PTR[16+r14*1+rsp],xmm5
    621 
    622 	lea	r14,QWORD PTR[32+r14]
    623 	dec	r15
    624 	jnz	$L$copy4x
    625 
    626 	shl	r9,2
    627 	mov	rsi,QWORD PTR[8+r9*8+rsp]
    628 	mov	rax,1
    629 	mov	r15,QWORD PTR[rsi]
    630 	mov	r14,QWORD PTR[8+rsi]
    631 	mov	r13,QWORD PTR[16+rsi]
    632 	mov	r12,QWORD PTR[24+rsi]
    633 	mov	rbp,QWORD PTR[32+rsi]
    634 	mov	rbx,QWORD PTR[40+rsi]
    635 	lea	rsp,QWORD PTR[48+rsi]
    636 $L$mul4x_epilogue::
    637 	mov	rdi,QWORD PTR[8+rsp]	;WIN64 epilogue
    638 	mov	rsi,QWORD PTR[16+rsp]
    639 	DB	0F3h,0C3h		;repret
    640 $L$SEH_end_bn_mul4x_mont::
    641 bn_mul4x_mont	ENDP
    642 EXTERN	bn_sqr8x_internal:NEAR
    643 
    644 
    645 ALIGN	32
    646 bn_sqr8x_mont	PROC PRIVATE
    647 	mov	QWORD PTR[8+rsp],rdi	;WIN64 prologue
    648 	mov	QWORD PTR[16+rsp],rsi
    649 	mov	rax,rsp
    650 $L$SEH_begin_bn_sqr8x_mont::
    651 	mov	rdi,rcx
    652 	mov	rsi,rdx
    653 	mov	rdx,r8
    654 	mov	rcx,r9
    655 	mov	r8,QWORD PTR[40+rsp]
    656 	mov	r9,QWORD PTR[48+rsp]
    657 
    658 
    659 $L$sqr8x_enter::
    660 	mov	rax,rsp
    661 	push	rbx
    662 	push	rbp
    663 	push	r12
    664 	push	r13
    665 	push	r14
    666 	push	r15
    667 
    668 	mov	r10d,r9d
    669 	shl	r9d,3
    670 	shl	r10,3+2
    671 	neg	r9
    672 
    673 
    674 
    675 
    676 
    677 
    678 	lea	r11,QWORD PTR[((-64))+r9*4+rsp]
    679 	mov	r8,QWORD PTR[r8]
    680 	sub	r11,rsi
    681 	and	r11,4095
    682 	cmp	r10,r11
    683 	jb	$L$sqr8x_sp_alt
    684 	sub	rsp,r11
    685 	lea	rsp,QWORD PTR[((-64))+r9*4+rsp]
    686 	jmp	$L$sqr8x_sp_done
    687 
    688 ALIGN	32
    689 $L$sqr8x_sp_alt::
    690 	lea	r10,QWORD PTR[((4096-64))+r9*4]
    691 	lea	rsp,QWORD PTR[((-64))+r9*4+rsp]
    692 	sub	r11,r10
    693 	mov	r10,0
    694 	cmovc	r11,r10
    695 	sub	rsp,r11
    696 $L$sqr8x_sp_done::
    697 	and	rsp,-64
    698 	mov	r10,r9
    699 	neg	r9
    700 
    701 	lea	r11,QWORD PTR[64+r9*2+rsp]
    702 	mov	QWORD PTR[32+rsp],r8
    703 	mov	QWORD PTR[40+rsp],rax
    704 $L$sqr8x_body::
    705 
    706 	mov	rbp,r9
    707 DB	102,73,15,110,211
    708 	shr	rbp,3+2
    709 	mov	eax,DWORD PTR[((OPENSSL_ia32cap_P+8))]
    710 	jmp	$L$sqr8x_copy_n
    711 
    712 ALIGN	32
    713 $L$sqr8x_copy_n::
    714 	movq	xmm0,QWORD PTR[rcx]
    715 	movq	xmm1,QWORD PTR[8+rcx]
    716 	movq	xmm3,QWORD PTR[16+rcx]
    717 	movq	xmm4,QWORD PTR[24+rcx]
    718 	lea	rcx,QWORD PTR[32+rcx]
    719 	movdqa	XMMWORD PTR[r11],xmm0
    720 	movdqa	XMMWORD PTR[16+r11],xmm1
    721 	movdqa	XMMWORD PTR[32+r11],xmm3
    722 	movdqa	XMMWORD PTR[48+r11],xmm4
    723 	lea	r11,QWORD PTR[64+r11]
    724 	dec	rbp
    725 	jnz	$L$sqr8x_copy_n
    726 
    727 	pxor	xmm0,xmm0
    728 DB	102,72,15,110,207
    729 DB	102,73,15,110,218
    730 	call	bn_sqr8x_internal
    731 
    732 	pxor	xmm0,xmm0
    733 	lea	rax,QWORD PTR[48+rsp]
    734 	lea	rdx,QWORD PTR[64+r9*2+rsp]
    735 	shr	r9,3+2
    736 	mov	rsi,QWORD PTR[40+rsp]
    737 	jmp	$L$sqr8x_zero
    738 
    739 ALIGN	32
    740 $L$sqr8x_zero::
    741 	movdqa	XMMWORD PTR[rax],xmm0
    742 	movdqa	XMMWORD PTR[16+rax],xmm0
    743 	movdqa	XMMWORD PTR[32+rax],xmm0
    744 	movdqa	XMMWORD PTR[48+rax],xmm0
    745 	lea	rax,QWORD PTR[64+rax]
    746 	movdqa	XMMWORD PTR[rdx],xmm0
    747 	movdqa	XMMWORD PTR[16+rdx],xmm0
    748 	movdqa	XMMWORD PTR[32+rdx],xmm0
    749 	movdqa	XMMWORD PTR[48+rdx],xmm0
    750 	lea	rdx,QWORD PTR[64+rdx]
    751 	dec	r9
    752 	jnz	$L$sqr8x_zero
    753 
    754 	mov	rax,1
    755 	mov	r15,QWORD PTR[((-48))+rsi]
    756 	mov	r14,QWORD PTR[((-40))+rsi]
    757 	mov	r13,QWORD PTR[((-32))+rsi]
    758 	mov	r12,QWORD PTR[((-24))+rsi]
    759 	mov	rbp,QWORD PTR[((-16))+rsi]
    760 	mov	rbx,QWORD PTR[((-8))+rsi]
    761 	lea	rsp,QWORD PTR[rsi]
    762 $L$sqr8x_epilogue::
    763 	mov	rdi,QWORD PTR[8+rsp]	;WIN64 epilogue
    764 	mov	rsi,QWORD PTR[16+rsp]
    765 	DB	0F3h,0C3h		;repret
    766 $L$SEH_end_bn_sqr8x_mont::
    767 bn_sqr8x_mont	ENDP
    768 DB	77,111,110,116,103,111,109,101,114,121,32,77,117,108,116,105
    769 DB	112,108,105,99,97,116,105,111,110,32,102,111,114,32,120,56
    770 DB	54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83
    771 DB	32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115
    772 DB	115,108,46,111,114,103,62,0
    773 ALIGN	16
    774 EXTERN	__imp_RtlVirtualUnwind:NEAR
    775 
    776 ALIGN	16
    777 mul_handler	PROC PRIVATE
    778 	push	rsi
    779 	push	rdi
    780 	push	rbx
    781 	push	rbp
    782 	push	r12
    783 	push	r13
    784 	push	r14
    785 	push	r15
    786 	pushfq
    787 	sub	rsp,64
    788 
    789 	mov	rax,QWORD PTR[120+r8]
    790 	mov	rbx,QWORD PTR[248+r8]
    791 
    792 	mov	rsi,QWORD PTR[8+r9]
    793 	mov	r11,QWORD PTR[56+r9]
    794 
    795 	mov	r10d,DWORD PTR[r11]
    796 	lea	r10,QWORD PTR[r10*1+rsi]
    797 	cmp	rbx,r10
    798 	jb	$L$common_seh_tail
    799 
    800 	mov	rax,QWORD PTR[152+r8]
    801 
    802 	mov	r10d,DWORD PTR[4+r11]
    803 	lea	r10,QWORD PTR[r10*1+rsi]
    804 	cmp	rbx,r10
    805 	jae	$L$common_seh_tail
    806 
    807 	mov	r10,QWORD PTR[192+r8]
    808 	mov	rax,QWORD PTR[8+r10*8+rax]
    809 	lea	rax,QWORD PTR[48+rax]
    810 
    811 	mov	rbx,QWORD PTR[((-8))+rax]
    812 	mov	rbp,QWORD PTR[((-16))+rax]
    813 	mov	r12,QWORD PTR[((-24))+rax]
    814 	mov	r13,QWORD PTR[((-32))+rax]
    815 	mov	r14,QWORD PTR[((-40))+rax]
    816 	mov	r15,QWORD PTR[((-48))+rax]
    817 	mov	QWORD PTR[144+r8],rbx
    818 	mov	QWORD PTR[160+r8],rbp
    819 	mov	QWORD PTR[216+r8],r12
    820 	mov	QWORD PTR[224+r8],r13
    821 	mov	QWORD PTR[232+r8],r14
    822 	mov	QWORD PTR[240+r8],r15
    823 
    824 	jmp	$L$common_seh_tail
    825 mul_handler	ENDP
    826 
    827 
    828 ALIGN	16
    829 sqr_handler	PROC PRIVATE
    830 	push	rsi
    831 	push	rdi
    832 	push	rbx
    833 	push	rbp
    834 	push	r12
    835 	push	r13
    836 	push	r14
    837 	push	r15
    838 	pushfq
    839 	sub	rsp,64
    840 
    841 	mov	rax,QWORD PTR[120+r8]
    842 	mov	rbx,QWORD PTR[248+r8]
    843 
    844 	mov	rsi,QWORD PTR[8+r9]
    845 	mov	r11,QWORD PTR[56+r9]
    846 
    847 	mov	r10d,DWORD PTR[r11]
    848 	lea	r10,QWORD PTR[r10*1+rsi]
    849 	cmp	rbx,r10
    850 	jb	$L$common_seh_tail
    851 
    852 	mov	rax,QWORD PTR[152+r8]
    853 
    854 	mov	r10d,DWORD PTR[4+r11]
    855 	lea	r10,QWORD PTR[r10*1+rsi]
    856 	cmp	rbx,r10
    857 	jae	$L$common_seh_tail
    858 
    859 	mov	rax,QWORD PTR[40+rax]
    860 
    861 	mov	rbx,QWORD PTR[((-8))+rax]
    862 	mov	rbp,QWORD PTR[((-16))+rax]
    863 	mov	r12,QWORD PTR[((-24))+rax]
    864 	mov	r13,QWORD PTR[((-32))+rax]
    865 	mov	r14,QWORD PTR[((-40))+rax]
    866 	mov	r15,QWORD PTR[((-48))+rax]
    867 	mov	QWORD PTR[144+r8],rbx
    868 	mov	QWORD PTR[160+r8],rbp
    869 	mov	QWORD PTR[216+r8],r12
    870 	mov	QWORD PTR[224+r8],r13
    871 	mov	QWORD PTR[232+r8],r14
    872 	mov	QWORD PTR[240+r8],r15
    873 
    874 $L$common_seh_tail::
    875 	mov	rdi,QWORD PTR[8+rax]
    876 	mov	rsi,QWORD PTR[16+rax]
    877 	mov	QWORD PTR[152+r8],rax
    878 	mov	QWORD PTR[168+r8],rsi
    879 	mov	QWORD PTR[176+r8],rdi
    880 
    881 	mov	rdi,QWORD PTR[40+r9]
    882 	mov	rsi,r8
    883 	mov	ecx,154
    884 	DD	0a548f3fch
    885 
    886 	mov	rsi,r9
    887 	xor	rcx,rcx
    888 	mov	rdx,QWORD PTR[8+rsi]
    889 	mov	r8,QWORD PTR[rsi]
    890 	mov	r9,QWORD PTR[16+rsi]
    891 	mov	r10,QWORD PTR[40+rsi]
    892 	lea	r11,QWORD PTR[56+rsi]
    893 	lea	r12,QWORD PTR[24+rsi]
    894 	mov	QWORD PTR[32+rsp],r10
    895 	mov	QWORD PTR[40+rsp],r11
    896 	mov	QWORD PTR[48+rsp],r12
    897 	mov	QWORD PTR[56+rsp],rcx
    898 	call	QWORD PTR[__imp_RtlVirtualUnwind]
    899 
    900 	mov	eax,1
    901 	add	rsp,64
    902 	popfq
    903 	pop	r15
    904 	pop	r14
    905 	pop	r13
    906 	pop	r12
    907 	pop	rbp
    908 	pop	rbx
    909 	pop	rdi
    910 	pop	rsi
    911 	DB	0F3h,0C3h		;repret
    912 sqr_handler	ENDP
    913 
    914 .text$	ENDS
    915 .pdata	SEGMENT READONLY ALIGN(4)
    916 ALIGN	4
    917 	DD	imagerel $L$SEH_begin_bn_mul_mont
    918 	DD	imagerel $L$SEH_end_bn_mul_mont
    919 	DD	imagerel $L$SEH_info_bn_mul_mont
    920 
    921 	DD	imagerel $L$SEH_begin_bn_mul4x_mont
    922 	DD	imagerel $L$SEH_end_bn_mul4x_mont
    923 	DD	imagerel $L$SEH_info_bn_mul4x_mont
    924 
    925 	DD	imagerel $L$SEH_begin_bn_sqr8x_mont
    926 	DD	imagerel $L$SEH_end_bn_sqr8x_mont
    927 	DD	imagerel $L$SEH_info_bn_sqr8x_mont
    928 .pdata	ENDS
    929 .xdata	SEGMENT READONLY ALIGN(8)
    930 ALIGN	8
    931 $L$SEH_info_bn_mul_mont::
    932 DB	9,0,0,0
    933 	DD	imagerel mul_handler
    934 	DD	imagerel $L$mul_body,imagerel $L$mul_epilogue
    935 $L$SEH_info_bn_mul4x_mont::
    936 DB	9,0,0,0
    937 	DD	imagerel mul_handler
    938 	DD	imagerel $L$mul4x_body,imagerel $L$mul4x_epilogue
    939 $L$SEH_info_bn_sqr8x_mont::
    940 DB	9,0,0,0
    941 	DD	imagerel sqr_handler
    942 	DD	imagerel $L$sqr8x_body,imagerel $L$sqr8x_epilogue
    943 
    944 .xdata	ENDS
    945 END
    946