1default	rel
2%define XMMWORD
3%define YMMWORD
4%define ZMMWORD
5section	.text code align=64
6
7EXTERN	OPENSSL_ia32cap_P
8
9global	asm_RC4
10
11ALIGN	16
12asm_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
75ALIGN	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
156ALIGN	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
195ALIGN	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
353ALIGN	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
370ALIGN	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
377ALIGN	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
504ALIGN	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
525ALIGN	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:
540global	asm_RC4_set_key
541
542ALIGN	16
543asm_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
567ALIGN	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
575ALIGN	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
589ALIGN	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
597ALIGN	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
613ALIGN	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:
622EXTERN	__imp_RtlVirtualUnwind
623
624ALIGN	16
625stream_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
670ALIGN	16
671key_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
724section	.pdata rdata align=4
725ALIGN	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
734section	.xdata rdata align=8
735ALIGN	8
736$L$SEH_info_asm_RC4:
737DB	9,0,0,0
738	DD	stream_se_handler wrt ..imagebase
739$L$SEH_info_asm_RC4_set_key:
740DB	9,0,0,0
741	DD	key_se_handler wrt ..imagebase
742