Home | History | Annotate | Download | only in rc4
      1 default	rel
      2 %define XMMWORD
      3 %define YMMWORD
      4 %define ZMMWORD
      5 section	.text code align=64
      6 
      7 EXTERN	OPENSSL_ia32cap_P
      8 
      9 global	asm_RC4
     10 
     11 ALIGN	16
     12 asm_RC4:
     13 	mov	QWORD[8+rsp],rdi	;WIN64 prologue
     14 	mov	QWORD[16+rsp],rsi
     15 	mov	rax,rsp
     16 $L$SEH_begin_asm_RC4:
     17 	mov	rdi,rcx
     18 	mov	rsi,rdx
     19 	mov	rdx,r8
     20 	mov	rcx,r9
     21 
     22 
     23 	or	rsi,rsi
     24 	jne	NEAR $L$entry
     25 	mov	rdi,QWORD[8+rsp]	;WIN64 epilogue
     26 	mov	rsi,QWORD[16+rsp]
     27 	DB	0F3h,0C3h		;repret
     28 $L$entry:
     29 	push	rbx
     30 	push	r12
     31 	push	r13
     32 $L$prologue:
     33 	mov	r11,rsi
     34 	mov	r12,rdx
     35 	mov	r13,rcx
     36 	xor	r10,r10
     37 	xor	rcx,rcx
     38 
     39 	lea	rdi,[8+rdi]
     40 	mov	r10b,BYTE[((-8))+rdi]
     41 	mov	cl,BYTE[((-4))+rdi]
     42 	cmp	DWORD[256+rdi],-1
     43 	je	NEAR $L$RC4_CHAR
     44 	mov	r8d,DWORD[OPENSSL_ia32cap_P]
     45 	xor	rbx,rbx
     46 	inc	r10b
     47 	sub	rbx,r10
     48 	sub	r13,r12
     49 	mov	eax,DWORD[r10*4+rdi]
     50 	test	r11,-16
     51 	jz	NEAR $L$loop1
     52 	bt	r8d,30
     53 	jc	NEAR $L$intel
     54 	and	rbx,7
     55 	lea	rsi,[1+r10]
     56 	jz	NEAR $L$oop8
     57 	sub	r11,rbx
     58 $L$oop8_warmup:
     59 	add	cl,al
     60 	mov	edx,DWORD[rcx*4+rdi]
     61 	mov	DWORD[rcx*4+rdi],eax
     62 	mov	DWORD[r10*4+rdi],edx
     63 	add	al,dl
     64 	inc	r10b
     65 	mov	edx,DWORD[rax*4+rdi]
     66 	mov	eax,DWORD[r10*4+rdi]
     67 	xor	dl,BYTE[r12]
     68 	mov	BYTE[r13*1+r12],dl
     69 	lea	r12,[1+r12]
     70 	dec	rbx
     71 	jnz	NEAR $L$oop8_warmup
     72 
     73 	lea	rsi,[1+r10]
     74 	jmp	NEAR $L$oop8
     75 ALIGN	16
     76 $L$oop8:
     77 	add	cl,al
     78 	mov	edx,DWORD[rcx*4+rdi]
     79 	mov	DWORD[rcx*4+rdi],eax
     80 	mov	ebx,DWORD[rsi*4+rdi]
     81 	ror	r8,8
     82 	mov	DWORD[r10*4+rdi],edx
     83 	add	dl,al
     84 	mov	r8b,BYTE[rdx*4+rdi]
     85 	add	cl,bl
     86 	mov	edx,DWORD[rcx*4+rdi]
     87 	mov	DWORD[rcx*4+rdi],ebx
     88 	mov	eax,DWORD[4+rsi*4+rdi]
     89 	ror	r8,8
     90 	mov	DWORD[4+r10*4+rdi],edx
     91 	add	dl,bl
     92 	mov	r8b,BYTE[rdx*4+rdi]
     93 	add	cl,al
     94 	mov	edx,DWORD[rcx*4+rdi]
     95 	mov	DWORD[rcx*4+rdi],eax
     96 	mov	ebx,DWORD[8+rsi*4+rdi]
     97 	ror	r8,8
     98 	mov	DWORD[8+r10*4+rdi],edx
     99 	add	dl,al
    100 	mov	r8b,BYTE[rdx*4+rdi]
    101 	add	cl,bl
    102 	mov	edx,DWORD[rcx*4+rdi]
    103 	mov	DWORD[rcx*4+rdi],ebx
    104 	mov	eax,DWORD[12+rsi*4+rdi]
    105 	ror	r8,8
    106 	mov	DWORD[12+r10*4+rdi],edx
    107 	add	dl,bl
    108 	mov	r8b,BYTE[rdx*4+rdi]
    109 	add	cl,al
    110 	mov	edx,DWORD[rcx*4+rdi]
    111 	mov	DWORD[rcx*4+rdi],eax
    112 	mov	ebx,DWORD[16+rsi*4+rdi]
    113 	ror	r8,8
    114 	mov	DWORD[16+r10*4+rdi],edx
    115 	add	dl,al
    116 	mov	r8b,BYTE[rdx*4+rdi]
    117 	add	cl,bl
    118 	mov	edx,DWORD[rcx*4+rdi]
    119 	mov	DWORD[rcx*4+rdi],ebx
    120 	mov	eax,DWORD[20+rsi*4+rdi]
    121 	ror	r8,8
    122 	mov	DWORD[20+r10*4+rdi],edx
    123 	add	dl,bl
    124 	mov	r8b,BYTE[rdx*4+rdi]
    125 	add	cl,al
    126 	mov	edx,DWORD[rcx*4+rdi]
    127 	mov	DWORD[rcx*4+rdi],eax
    128 	mov	ebx,DWORD[24+rsi*4+rdi]
    129 	ror	r8,8
    130 	mov	DWORD[24+r10*4+rdi],edx
    131 	add	dl,al
    132 	mov	r8b,BYTE[rdx*4+rdi]
    133 	add	sil,8
    134 	add	cl,bl
    135 	mov	edx,DWORD[rcx*4+rdi]
    136 	mov	DWORD[rcx*4+rdi],ebx
    137 	mov	eax,DWORD[((-4))+rsi*4+rdi]
    138 	ror	r8,8
    139 	mov	DWORD[28+r10*4+rdi],edx
    140 	add	dl,bl
    141 	mov	r8b,BYTE[rdx*4+rdi]
    142 	add	r10b,8
    143 	ror	r8,8
    144 	sub	r11,8
    145 
    146 	xor	r8,QWORD[r12]
    147 	mov	QWORD[r13*1+r12],r8
    148 	lea	r12,[8+r12]
    149 
    150 	test	r11,-8
    151 	jnz	NEAR $L$oop8
    152 	cmp	r11,0
    153 	jne	NEAR $L$loop1
    154 	jmp	NEAR $L$exit
    155 
    156 ALIGN	16
    157 $L$intel:
    158 	test	r11,-32
    159 	jz	NEAR $L$loop1
    160 	and	rbx,15
    161 	jz	NEAR $L$oop16_is_hot
    162 	sub	r11,rbx
    163 $L$oop16_warmup:
    164 	add	cl,al
    165 	mov	edx,DWORD[rcx*4+rdi]
    166 	mov	DWORD[rcx*4+rdi],eax
    167 	mov	DWORD[r10*4+rdi],edx
    168 	add	al,dl
    169 	inc	r10b
    170 	mov	edx,DWORD[rax*4+rdi]
    171 	mov	eax,DWORD[r10*4+rdi]
    172 	xor	dl,BYTE[r12]
    173 	mov	BYTE[r13*1+r12],dl
    174 	lea	r12,[1+r12]
    175 	dec	rbx
    176 	jnz	NEAR $L$oop16_warmup
    177 
    178 	mov	rbx,rcx
    179 	xor	rcx,rcx
    180 	mov	cl,bl
    181 
    182 $L$oop16_is_hot:
    183 	lea	rsi,[r10*4+rdi]
    184 	add	cl,al
    185 	mov	edx,DWORD[rcx*4+rdi]
    186 	pxor	xmm0,xmm0
    187 	mov	DWORD[rcx*4+rdi],eax
    188 	add	al,dl
    189 	mov	ebx,DWORD[4+rsi]
    190 	movzx	eax,al
    191 	mov	DWORD[rsi],edx
    192 	add	cl,bl
    193 	pinsrw	xmm0,WORD[rax*4+rdi],0
    194 	jmp	NEAR $L$oop16_enter
    195 ALIGN	16
    196 $L$oop16:
    197 	add	cl,al
    198 	mov	edx,DWORD[rcx*4+rdi]
    199 	pxor	xmm2,xmm0
    200 	psllq	xmm1,8
    201 	pxor	xmm0,xmm0
    202 	mov	DWORD[rcx*4+rdi],eax
    203 	add	al,dl
    204 	mov	ebx,DWORD[4+rsi]
    205 	movzx	eax,al
    206 	mov	DWORD[rsi],edx
    207 	pxor	xmm2,xmm1
    208 	add	cl,bl
    209 	pinsrw	xmm0,WORD[rax*4+rdi],0
    210 	movdqu	XMMWORD[r13*1+r12],xmm2
    211 	lea	r12,[16+r12]
    212 $L$oop16_enter:
    213 	mov	edx,DWORD[rcx*4+rdi]
    214 	pxor	xmm1,xmm1
    215 	mov	DWORD[rcx*4+rdi],ebx
    216 	add	bl,dl
    217 	mov	eax,DWORD[8+rsi]
    218 	movzx	ebx,bl
    219 	mov	DWORD[4+rsi],edx
    220 	add	cl,al
    221 	pinsrw	xmm1,WORD[rbx*4+rdi],0
    222 	mov	edx,DWORD[rcx*4+rdi]
    223 	mov	DWORD[rcx*4+rdi],eax
    224 	add	al,dl
    225 	mov	ebx,DWORD[12+rsi]
    226 	movzx	eax,al
    227 	mov	DWORD[8+rsi],edx
    228 	add	cl,bl
    229 	pinsrw	xmm0,WORD[rax*4+rdi],1
    230 	mov	edx,DWORD[rcx*4+rdi]
    231 	mov	DWORD[rcx*4+rdi],ebx
    232 	add	bl,dl
    233 	mov	eax,DWORD[16+rsi]
    234 	movzx	ebx,bl
    235 	mov	DWORD[12+rsi],edx
    236 	add	cl,al
    237 	pinsrw	xmm1,WORD[rbx*4+rdi],1
    238 	mov	edx,DWORD[rcx*4+rdi]
    239 	mov	DWORD[rcx*4+rdi],eax
    240 	add	al,dl
    241 	mov	ebx,DWORD[20+rsi]
    242 	movzx	eax,al
    243 	mov	DWORD[16+rsi],edx
    244 	add	cl,bl
    245 	pinsrw	xmm0,WORD[rax*4+rdi],2
    246 	mov	edx,DWORD[rcx*4+rdi]
    247 	mov	DWORD[rcx*4+rdi],ebx
    248 	add	bl,dl
    249 	mov	eax,DWORD[24+rsi]
    250 	movzx	ebx,bl
    251 	mov	DWORD[20+rsi],edx
    252 	add	cl,al
    253 	pinsrw	xmm1,WORD[rbx*4+rdi],2
    254 	mov	edx,DWORD[rcx*4+rdi]
    255 	mov	DWORD[rcx*4+rdi],eax
    256 	add	al,dl
    257 	mov	ebx,DWORD[28+rsi]
    258 	movzx	eax,al
    259 	mov	DWORD[24+rsi],edx
    260 	add	cl,bl
    261 	pinsrw	xmm0,WORD[rax*4+rdi],3
    262 	mov	edx,DWORD[rcx*4+rdi]
    263 	mov	DWORD[rcx*4+rdi],ebx
    264 	add	bl,dl
    265 	mov	eax,DWORD[32+rsi]
    266 	movzx	ebx,bl
    267 	mov	DWORD[28+rsi],edx
    268 	add	cl,al
    269 	pinsrw	xmm1,WORD[rbx*4+rdi],3
    270 	mov	edx,DWORD[rcx*4+rdi]
    271 	mov	DWORD[rcx*4+rdi],eax
    272 	add	al,dl
    273 	mov	ebx,DWORD[36+rsi]
    274 	movzx	eax,al
    275 	mov	DWORD[32+rsi],edx
    276 	add	cl,bl
    277 	pinsrw	xmm0,WORD[rax*4+rdi],4
    278 	mov	edx,DWORD[rcx*4+rdi]
    279 	mov	DWORD[rcx*4+rdi],ebx
    280 	add	bl,dl
    281 	mov	eax,DWORD[40+rsi]
    282 	movzx	ebx,bl
    283 	mov	DWORD[36+rsi],edx
    284 	add	cl,al
    285 	pinsrw	xmm1,WORD[rbx*4+rdi],4
    286 	mov	edx,DWORD[rcx*4+rdi]
    287 	mov	DWORD[rcx*4+rdi],eax
    288 	add	al,dl
    289 	mov	ebx,DWORD[44+rsi]
    290 	movzx	eax,al
    291 	mov	DWORD[40+rsi],edx
    292 	add	cl,bl
    293 	pinsrw	xmm0,WORD[rax*4+rdi],5
    294 	mov	edx,DWORD[rcx*4+rdi]
    295 	mov	DWORD[rcx*4+rdi],ebx
    296 	add	bl,dl
    297 	mov	eax,DWORD[48+rsi]
    298 	movzx	ebx,bl
    299 	mov	DWORD[44+rsi],edx
    300 	add	cl,al
    301 	pinsrw	xmm1,WORD[rbx*4+rdi],5
    302 	mov	edx,DWORD[rcx*4+rdi]
    303 	mov	DWORD[rcx*4+rdi],eax
    304 	add	al,dl
    305 	mov	ebx,DWORD[52+rsi]
    306 	movzx	eax,al
    307 	mov	DWORD[48+rsi],edx
    308 	add	cl,bl
    309 	pinsrw	xmm0,WORD[rax*4+rdi],6
    310 	mov	edx,DWORD[rcx*4+rdi]
    311 	mov	DWORD[rcx*4+rdi],ebx
    312 	add	bl,dl
    313 	mov	eax,DWORD[56+rsi]
    314 	movzx	ebx,bl
    315 	mov	DWORD[52+rsi],edx
    316 	add	cl,al
    317 	pinsrw	xmm1,WORD[rbx*4+rdi],6
    318 	mov	edx,DWORD[rcx*4+rdi]
    319 	mov	DWORD[rcx*4+rdi],eax
    320 	add	al,dl
    321 	mov	ebx,DWORD[60+rsi]
    322 	movzx	eax,al
    323 	mov	DWORD[56+rsi],edx
    324 	add	cl,bl
    325 	pinsrw	xmm0,WORD[rax*4+rdi],7
    326 	add	r10b,16
    327 	movdqu	xmm2,XMMWORD[r12]
    328 	mov	edx,DWORD[rcx*4+rdi]
    329 	mov	DWORD[rcx*4+rdi],ebx
    330 	add	bl,dl
    331 	movzx	ebx,bl
    332 	mov	DWORD[60+rsi],edx
    333 	lea	rsi,[r10*4+rdi]
    334 	pinsrw	xmm1,WORD[rbx*4+rdi],7
    335 	mov	eax,DWORD[rsi]
    336 	mov	rbx,rcx
    337 	xor	rcx,rcx
    338 	sub	r11,16
    339 	mov	cl,bl
    340 	test	r11,-16
    341 	jnz	NEAR $L$oop16
    342 
    343 	psllq	xmm1,8
    344 	pxor	xmm2,xmm0
    345 	pxor	xmm2,xmm1
    346 	movdqu	XMMWORD[r13*1+r12],xmm2
    347 	lea	r12,[16+r12]
    348 
    349 	cmp	r11,0
    350 	jne	NEAR $L$loop1
    351 	jmp	NEAR $L$exit
    352 
    353 ALIGN	16
    354 $L$loop1:
    355 	add	cl,al
    356 	mov	edx,DWORD[rcx*4+rdi]
    357 	mov	DWORD[rcx*4+rdi],eax
    358 	mov	DWORD[r10*4+rdi],edx
    359 	add	al,dl
    360 	inc	r10b
    361 	mov	edx,DWORD[rax*4+rdi]
    362 	mov	eax,DWORD[r10*4+rdi]
    363 	xor	dl,BYTE[r12]
    364 	mov	BYTE[r13*1+r12],dl
    365 	lea	r12,[1+r12]
    366 	dec	r11
    367 	jnz	NEAR $L$loop1
    368 	jmp	NEAR $L$exit
    369 
    370 ALIGN	16
    371 $L$RC4_CHAR:
    372 	add	r10b,1
    373 	movzx	eax,BYTE[r10*1+rdi]
    374 	test	r11,-8
    375 	jz	NEAR $L$cloop1
    376 	jmp	NEAR $L$cloop8
    377 ALIGN	16
    378 $L$cloop8:
    379 	mov	r8d,DWORD[r12]
    380 	mov	r9d,DWORD[4+r12]
    381 	add	cl,al
    382 	lea	rsi,[1+r10]
    383 	movzx	edx,BYTE[rcx*1+rdi]
    384 	movzx	esi,sil
    385 	movzx	ebx,BYTE[rsi*1+rdi]
    386 	mov	BYTE[rcx*1+rdi],al
    387 	cmp	rcx,rsi
    388 	mov	BYTE[r10*1+rdi],dl
    389 	jne	NEAR $L$cmov0
    390 	mov	rbx,rax
    391 $L$cmov0:
    392 	add	dl,al
    393 	xor	r8b,BYTE[rdx*1+rdi]
    394 	ror	r8d,8
    395 	add	cl,bl
    396 	lea	r10,[1+rsi]
    397 	movzx	edx,BYTE[rcx*1+rdi]
    398 	movzx	r10d,r10b
    399 	movzx	eax,BYTE[r10*1+rdi]
    400 	mov	BYTE[rcx*1+rdi],bl
    401 	cmp	rcx,r10
    402 	mov	BYTE[rsi*1+rdi],dl
    403 	jne	NEAR $L$cmov1
    404 	mov	rax,rbx
    405 $L$cmov1:
    406 	add	dl,bl
    407 	xor	r8b,BYTE[rdx*1+rdi]
    408 	ror	r8d,8
    409 	add	cl,al
    410 	lea	rsi,[1+r10]
    411 	movzx	edx,BYTE[rcx*1+rdi]
    412 	movzx	esi,sil
    413 	movzx	ebx,BYTE[rsi*1+rdi]
    414 	mov	BYTE[rcx*1+rdi],al
    415 	cmp	rcx,rsi
    416 	mov	BYTE[r10*1+rdi],dl
    417 	jne	NEAR $L$cmov2
    418 	mov	rbx,rax
    419 $L$cmov2:
    420 	add	dl,al
    421 	xor	r8b,BYTE[rdx*1+rdi]
    422 	ror	r8d,8
    423 	add	cl,bl
    424 	lea	r10,[1+rsi]
    425 	movzx	edx,BYTE[rcx*1+rdi]
    426 	movzx	r10d,r10b
    427 	movzx	eax,BYTE[r10*1+rdi]
    428 	mov	BYTE[rcx*1+rdi],bl
    429 	cmp	rcx,r10
    430 	mov	BYTE[rsi*1+rdi],dl
    431 	jne	NEAR $L$cmov3
    432 	mov	rax,rbx
    433 $L$cmov3:
    434 	add	dl,bl
    435 	xor	r8b,BYTE[rdx*1+rdi]
    436 	ror	r8d,8
    437 	add	cl,al
    438 	lea	rsi,[1+r10]
    439 	movzx	edx,BYTE[rcx*1+rdi]
    440 	movzx	esi,sil
    441 	movzx	ebx,BYTE[rsi*1+rdi]
    442 	mov	BYTE[rcx*1+rdi],al
    443 	cmp	rcx,rsi
    444 	mov	BYTE[r10*1+rdi],dl
    445 	jne	NEAR $L$cmov4
    446 	mov	rbx,rax
    447 $L$cmov4:
    448 	add	dl,al
    449 	xor	r9b,BYTE[rdx*1+rdi]
    450 	ror	r9d,8
    451 	add	cl,bl
    452 	lea	r10,[1+rsi]
    453 	movzx	edx,BYTE[rcx*1+rdi]
    454 	movzx	r10d,r10b
    455 	movzx	eax,BYTE[r10*1+rdi]
    456 	mov	BYTE[rcx*1+rdi],bl
    457 	cmp	rcx,r10
    458 	mov	BYTE[rsi*1+rdi],dl
    459 	jne	NEAR $L$cmov5
    460 	mov	rax,rbx
    461 $L$cmov5:
    462 	add	dl,bl
    463 	xor	r9b,BYTE[rdx*1+rdi]
    464 	ror	r9d,8
    465 	add	cl,al
    466 	lea	rsi,[1+r10]
    467 	movzx	edx,BYTE[rcx*1+rdi]
    468 	movzx	esi,sil
    469 	movzx	ebx,BYTE[rsi*1+rdi]
    470 	mov	BYTE[rcx*1+rdi],al
    471 	cmp	rcx,rsi
    472 	mov	BYTE[r10*1+rdi],dl
    473 	jne	NEAR $L$cmov6
    474 	mov	rbx,rax
    475 $L$cmov6:
    476 	add	dl,al
    477 	xor	r9b,BYTE[rdx*1+rdi]
    478 	ror	r9d,8
    479 	add	cl,bl
    480 	lea	r10,[1+rsi]
    481 	movzx	edx,BYTE[rcx*1+rdi]
    482 	movzx	r10d,r10b
    483 	movzx	eax,BYTE[r10*1+rdi]
    484 	mov	BYTE[rcx*1+rdi],bl
    485 	cmp	rcx,r10
    486 	mov	BYTE[rsi*1+rdi],dl
    487 	jne	NEAR $L$cmov7
    488 	mov	rax,rbx
    489 $L$cmov7:
    490 	add	dl,bl
    491 	xor	r9b,BYTE[rdx*1+rdi]
    492 	ror	r9d,8
    493 	lea	r11,[((-8))+r11]
    494 	mov	DWORD[r13],r8d
    495 	lea	r12,[8+r12]
    496 	mov	DWORD[4+r13],r9d
    497 	lea	r13,[8+r13]
    498 
    499 	test	r11,-8
    500 	jnz	NEAR $L$cloop8
    501 	cmp	r11,0
    502 	jne	NEAR $L$cloop1
    503 	jmp	NEAR $L$exit
    504 ALIGN	16
    505 $L$cloop1:
    506 	add	cl,al
    507 	movzx	ecx,cl
    508 	movzx	edx,BYTE[rcx*1+rdi]
    509 	mov	BYTE[rcx*1+rdi],al
    510 	mov	BYTE[r10*1+rdi],dl
    511 	add	dl,al
    512 	add	r10b,1
    513 	movzx	edx,dl
    514 	movzx	r10d,r10b
    515 	movzx	edx,BYTE[rdx*1+rdi]
    516 	movzx	eax,BYTE[r10*1+rdi]
    517 	xor	dl,BYTE[r12]
    518 	lea	r12,[1+r12]
    519 	mov	BYTE[r13],dl
    520 	lea	r13,[1+r13]
    521 	sub	r11,1
    522 	jnz	NEAR $L$cloop1
    523 	jmp	NEAR $L$exit
    524 
    525 ALIGN	16
    526 $L$exit:
    527 	sub	r10b,1
    528 	mov	DWORD[((-8))+rdi],r10d
    529 	mov	DWORD[((-4))+rdi],ecx
    530 
    531 	mov	r13,QWORD[rsp]
    532 	mov	r12,QWORD[8+rsp]
    533 	mov	rbx,QWORD[16+rsp]
    534 	add	rsp,24
    535 $L$epilogue:
    536 	mov	rdi,QWORD[8+rsp]	;WIN64 epilogue
    537 	mov	rsi,QWORD[16+rsp]
    538 	DB	0F3h,0C3h		;repret
    539 $L$SEH_end_asm_RC4:
    540 global	asm_RC4_set_key
    541 
    542 ALIGN	16
    543 asm_RC4_set_key:
    544 	mov	QWORD[8+rsp],rdi	;WIN64 prologue
    545 	mov	QWORD[16+rsp],rsi
    546 	mov	rax,rsp
    547 $L$SEH_begin_asm_RC4_set_key:
    548 	mov	rdi,rcx
    549 	mov	rsi,rdx
    550 	mov	rdx,r8
    551 
    552 
    553 	lea	rdi,[8+rdi]
    554 	lea	rdx,[rsi*1+rdx]
    555 	neg	rsi
    556 	mov	rcx,rsi
    557 	xor	eax,eax
    558 	xor	r9,r9
    559 	xor	r10,r10
    560 	xor	r11,r11
    561 
    562 	mov	r8d,DWORD[OPENSSL_ia32cap_P]
    563 	bt	r8d,20
    564 	jc	NEAR $L$c1stloop
    565 	jmp	NEAR $L$w1stloop
    566 
    567 ALIGN	16
    568 $L$w1stloop:
    569 	mov	DWORD[rax*4+rdi],eax
    570 	add	al,1
    571 	jnc	NEAR $L$w1stloop
    572 
    573 	xor	r9,r9
    574 	xor	r8,r8
    575 ALIGN	16
    576 $L$w2ndloop:
    577 	mov	r10d,DWORD[r9*4+rdi]
    578 	add	r8b,BYTE[rsi*1+rdx]
    579 	add	r8b,r10b
    580 	add	rsi,1
    581 	mov	r11d,DWORD[r8*4+rdi]
    582 	cmovz	rsi,rcx
    583 	mov	DWORD[r8*4+rdi],r10d
    584 	mov	DWORD[r9*4+rdi],r11d
    585 	add	r9b,1
    586 	jnc	NEAR $L$w2ndloop
    587 	jmp	NEAR $L$exit_key
    588 
    589 ALIGN	16
    590 $L$c1stloop:
    591 	mov	BYTE[rax*1+rdi],al
    592 	add	al,1
    593 	jnc	NEAR $L$c1stloop
    594 
    595 	xor	r9,r9
    596 	xor	r8,r8
    597 ALIGN	16
    598 $L$c2ndloop:
    599 	mov	r10b,BYTE[r9*1+rdi]
    600 	add	r8b,BYTE[rsi*1+rdx]
    601 	add	r8b,r10b
    602 	add	rsi,1
    603 	mov	r11b,BYTE[r8*1+rdi]
    604 	jnz	NEAR $L$cnowrap
    605 	mov	rsi,rcx
    606 $L$cnowrap:
    607 	mov	BYTE[r8*1+rdi],r10b
    608 	mov	BYTE[r9*1+rdi],r11b
    609 	add	r9b,1
    610 	jnc	NEAR $L$c2ndloop
    611 	mov	DWORD[256+rdi],-1
    612 
    613 ALIGN	16
    614 $L$exit_key:
    615 	xor	eax,eax
    616 	mov	DWORD[((-8))+rdi],eax
    617 	mov	DWORD[((-4))+rdi],eax
    618 	mov	rdi,QWORD[8+rsp]	;WIN64 epilogue
    619 	mov	rsi,QWORD[16+rsp]
    620 	DB	0F3h,0C3h		;repret
    621 $L$SEH_end_asm_RC4_set_key:
    622 EXTERN	__imp_RtlVirtualUnwind
    623 
    624 ALIGN	16
    625 stream_se_handler:
    626 	push	rsi
    627 	push	rdi
    628 	push	rbx
    629 	push	rbp
    630 	push	r12
    631 	push	r13
    632 	push	r14
    633 	push	r15
    634 	pushfq
    635 	sub	rsp,64
    636 
    637 	mov	rax,QWORD[120+r8]
    638 	mov	rbx,QWORD[248+r8]
    639 
    640 	lea	r10,[$L$prologue]
    641 	cmp	rbx,r10
    642 	jb	NEAR $L$in_prologue
    643 
    644 	mov	rax,QWORD[152+r8]
    645 
    646 	lea	r10,[$L$epilogue]
    647 	cmp	rbx,r10
    648 	jae	NEAR $L$in_prologue
    649 
    650 	lea	rax,[24+rax]
    651 
    652 	mov	rbx,QWORD[((-8))+rax]
    653 	mov	r12,QWORD[((-16))+rax]
    654 	mov	r13,QWORD[((-24))+rax]
    655 	mov	QWORD[144+r8],rbx
    656 	mov	QWORD[216+r8],r12
    657 	mov	QWORD[224+r8],r13
    658 
    659 $L$in_prologue:
    660 	mov	rdi,QWORD[8+rax]
    661 	mov	rsi,QWORD[16+rax]
    662 	mov	QWORD[152+r8],rax
    663 	mov	QWORD[168+r8],rsi
    664 	mov	QWORD[176+r8],rdi
    665 
    666 	jmp	NEAR $L$common_seh_exit
    667 
    668 
    669 
    670 ALIGN	16
    671 key_se_handler:
    672 	push	rsi
    673 	push	rdi
    674 	push	rbx
    675 	push	rbp
    676 	push	r12
    677 	push	r13
    678 	push	r14
    679 	push	r15
    680 	pushfq
    681 	sub	rsp,64
    682 
    683 	mov	rax,QWORD[152+r8]
    684 	mov	rdi,QWORD[8+rax]
    685 	mov	rsi,QWORD[16+rax]
    686 	mov	QWORD[168+r8],rsi
    687 	mov	QWORD[176+r8],rdi
    688 
    689 $L$common_seh_exit:
    690 
    691 	mov	rdi,QWORD[40+r9]
    692 	mov	rsi,r8
    693 	mov	ecx,154
    694 	DD	0xa548f3fc
    695 
    696 	mov	rsi,r9
    697 	xor	rcx,rcx
    698 	mov	rdx,QWORD[8+rsi]
    699 	mov	r8,QWORD[rsi]
    700 	mov	r9,QWORD[16+rsi]
    701 	mov	r10,QWORD[40+rsi]
    702 	lea	r11,[56+rsi]
    703 	lea	r12,[24+rsi]
    704 	mov	QWORD[32+rsp],r10
    705 	mov	QWORD[40+rsp],r11
    706 	mov	QWORD[48+rsp],r12
    707 	mov	QWORD[56+rsp],rcx
    708 	call	QWORD[__imp_RtlVirtualUnwind]
    709 
    710 	mov	eax,1
    711 	add	rsp,64
    712 	popfq
    713 	pop	r15
    714 	pop	r14
    715 	pop	r13
    716 	pop	r12
    717 	pop	rbp
    718 	pop	rbx
    719 	pop	rdi
    720 	pop	rsi
    721 	DB	0F3h,0C3h		;repret
    722 
    723 
    724 section	.pdata rdata align=4
    725 ALIGN	4
    726 	DD	$L$SEH_begin_asm_RC4 wrt ..imagebase
    727 	DD	$L$SEH_end_asm_RC4 wrt ..imagebase
    728 	DD	$L$SEH_info_asm_RC4 wrt ..imagebase
    729 
    730 	DD	$L$SEH_begin_asm_RC4_set_key wrt ..imagebase
    731 	DD	$L$SEH_end_asm_RC4_set_key wrt ..imagebase
    732 	DD	$L$SEH_info_asm_RC4_set_key wrt ..imagebase
    733 
    734 section	.xdata rdata align=8
    735 ALIGN	8
    736 $L$SEH_info_asm_RC4:
    737 DB	9,0,0,0
    738 	DD	stream_se_handler wrt ..imagebase
    739 $L$SEH_info_asm_RC4_set_key:
    740 DB	9,0,0,0
    741 	DD	key_se_handler wrt ..imagebase
    742