1#if defined(__i386__)
2.file	"rc4-586.S"
3.text
4.globl	_asm_RC4
5.private_extern	_asm_RC4
6.align	4
7_asm_RC4:
8L_asm_RC4_begin:
9	pushl	%ebp
10	pushl	%ebx
11	pushl	%esi
12	pushl	%edi
13	movl	20(%esp),%edi
14	movl	24(%esp),%edx
15	movl	28(%esp),%esi
16	movl	32(%esp),%ebp
17	xorl	%eax,%eax
18	xorl	%ebx,%ebx
19	cmpl	$0,%edx
20	je	L000abort
21	movb	(%edi),%al
22	movb	4(%edi),%bl
23	addl	$8,%edi
24	leal	(%esi,%edx,1),%ecx
25	subl	%esi,%ebp
26	movl	%ecx,24(%esp)
27	incb	%al
28	cmpl	$-1,256(%edi)
29	je	L001RC4_CHAR
30	movl	(%edi,%eax,4),%ecx
31	andl	$-4,%edx
32	jz	L002loop1
33	movl	%ebp,32(%esp)
34	testl	$-8,%edx
35	jz	L003go4loop4
36	call	L004PIC_me_up
37L004PIC_me_up:
38	popl	%ebp
39	movl	L_OPENSSL_ia32cap_P$non_lazy_ptr-L004PIC_me_up(%ebp),%ebp
40	btl	$26,(%ebp)
41	jnc	L003go4loop4
42	movl	32(%esp),%ebp
43	andl	$-8,%edx
44	leal	-8(%esi,%edx,1),%edx
45	movl	%edx,-4(%edi)
46	addb	%cl,%bl
47	movl	(%edi,%ebx,4),%edx
48	movl	%ecx,(%edi,%ebx,4)
49	movl	%edx,(%edi,%eax,4)
50	incl	%eax
51	addl	%ecx,%edx
52	movzbl	%al,%eax
53	movzbl	%dl,%edx
54	movq	(%esi),%mm0
55	movl	(%edi,%eax,4),%ecx
56	movd	(%edi,%edx,4),%mm2
57	jmp	L005loop_mmx_enter
58.align	4,0x90
59L006loop_mmx:
60	addb	%cl,%bl
61	psllq	$56,%mm1
62	movl	(%edi,%ebx,4),%edx
63	movl	%ecx,(%edi,%ebx,4)
64	movl	%edx,(%edi,%eax,4)
65	incl	%eax
66	addl	%ecx,%edx
67	movzbl	%al,%eax
68	movzbl	%dl,%edx
69	pxor	%mm1,%mm2
70	movq	(%esi),%mm0
71	movq	%mm2,-8(%ebp,%esi,1)
72	movl	(%edi,%eax,4),%ecx
73	movd	(%edi,%edx,4),%mm2
74L005loop_mmx_enter:
75	addb	%cl,%bl
76	movl	(%edi,%ebx,4),%edx
77	movl	%ecx,(%edi,%ebx,4)
78	movl	%edx,(%edi,%eax,4)
79	incl	%eax
80	addl	%ecx,%edx
81	movzbl	%al,%eax
82	movzbl	%dl,%edx
83	pxor	%mm0,%mm2
84	movl	(%edi,%eax,4),%ecx
85	movd	(%edi,%edx,4),%mm1
86	addb	%cl,%bl
87	psllq	$8,%mm1
88	movl	(%edi,%ebx,4),%edx
89	movl	%ecx,(%edi,%ebx,4)
90	movl	%edx,(%edi,%eax,4)
91	incl	%eax
92	addl	%ecx,%edx
93	movzbl	%al,%eax
94	movzbl	%dl,%edx
95	pxor	%mm1,%mm2
96	movl	(%edi,%eax,4),%ecx
97	movd	(%edi,%edx,4),%mm1
98	addb	%cl,%bl
99	psllq	$16,%mm1
100	movl	(%edi,%ebx,4),%edx
101	movl	%ecx,(%edi,%ebx,4)
102	movl	%edx,(%edi,%eax,4)
103	incl	%eax
104	addl	%ecx,%edx
105	movzbl	%al,%eax
106	movzbl	%dl,%edx
107	pxor	%mm1,%mm2
108	movl	(%edi,%eax,4),%ecx
109	movd	(%edi,%edx,4),%mm1
110	addb	%cl,%bl
111	psllq	$24,%mm1
112	movl	(%edi,%ebx,4),%edx
113	movl	%ecx,(%edi,%ebx,4)
114	movl	%edx,(%edi,%eax,4)
115	incl	%eax
116	addl	%ecx,%edx
117	movzbl	%al,%eax
118	movzbl	%dl,%edx
119	pxor	%mm1,%mm2
120	movl	(%edi,%eax,4),%ecx
121	movd	(%edi,%edx,4),%mm1
122	addb	%cl,%bl
123	psllq	$32,%mm1
124	movl	(%edi,%ebx,4),%edx
125	movl	%ecx,(%edi,%ebx,4)
126	movl	%edx,(%edi,%eax,4)
127	incl	%eax
128	addl	%ecx,%edx
129	movzbl	%al,%eax
130	movzbl	%dl,%edx
131	pxor	%mm1,%mm2
132	movl	(%edi,%eax,4),%ecx
133	movd	(%edi,%edx,4),%mm1
134	addb	%cl,%bl
135	psllq	$40,%mm1
136	movl	(%edi,%ebx,4),%edx
137	movl	%ecx,(%edi,%ebx,4)
138	movl	%edx,(%edi,%eax,4)
139	incl	%eax
140	addl	%ecx,%edx
141	movzbl	%al,%eax
142	movzbl	%dl,%edx
143	pxor	%mm1,%mm2
144	movl	(%edi,%eax,4),%ecx
145	movd	(%edi,%edx,4),%mm1
146	addb	%cl,%bl
147	psllq	$48,%mm1
148	movl	(%edi,%ebx,4),%edx
149	movl	%ecx,(%edi,%ebx,4)
150	movl	%edx,(%edi,%eax,4)
151	incl	%eax
152	addl	%ecx,%edx
153	movzbl	%al,%eax
154	movzbl	%dl,%edx
155	pxor	%mm1,%mm2
156	movl	(%edi,%eax,4),%ecx
157	movd	(%edi,%edx,4),%mm1
158	movl	%ebx,%edx
159	xorl	%ebx,%ebx
160	movb	%dl,%bl
161	cmpl	-4(%edi),%esi
162	leal	8(%esi),%esi
163	jb	L006loop_mmx
164	psllq	$56,%mm1
165	pxor	%mm1,%mm2
166	movq	%mm2,-8(%ebp,%esi,1)
167	emms
168	cmpl	24(%esp),%esi
169	je	L007done
170	jmp	L002loop1
171.align	4,0x90
172L003go4loop4:
173	leal	-4(%esi,%edx,1),%edx
174	movl	%edx,28(%esp)
175L008loop4:
176	addb	%cl,%bl
177	movl	(%edi,%ebx,4),%edx
178	movl	%ecx,(%edi,%ebx,4)
179	movl	%edx,(%edi,%eax,4)
180	addl	%ecx,%edx
181	incb	%al
182	andl	$255,%edx
183	movl	(%edi,%eax,4),%ecx
184	movl	(%edi,%edx,4),%ebp
185	addb	%cl,%bl
186	movl	(%edi,%ebx,4),%edx
187	movl	%ecx,(%edi,%ebx,4)
188	movl	%edx,(%edi,%eax,4)
189	addl	%ecx,%edx
190	incb	%al
191	andl	$255,%edx
192	rorl	$8,%ebp
193	movl	(%edi,%eax,4),%ecx
194	orl	(%edi,%edx,4),%ebp
195	addb	%cl,%bl
196	movl	(%edi,%ebx,4),%edx
197	movl	%ecx,(%edi,%ebx,4)
198	movl	%edx,(%edi,%eax,4)
199	addl	%ecx,%edx
200	incb	%al
201	andl	$255,%edx
202	rorl	$8,%ebp
203	movl	(%edi,%eax,4),%ecx
204	orl	(%edi,%edx,4),%ebp
205	addb	%cl,%bl
206	movl	(%edi,%ebx,4),%edx
207	movl	%ecx,(%edi,%ebx,4)
208	movl	%edx,(%edi,%eax,4)
209	addl	%ecx,%edx
210	incb	%al
211	andl	$255,%edx
212	rorl	$8,%ebp
213	movl	32(%esp),%ecx
214	orl	(%edi,%edx,4),%ebp
215	rorl	$8,%ebp
216	xorl	(%esi),%ebp
217	cmpl	28(%esp),%esi
218	movl	%ebp,(%ecx,%esi,1)
219	leal	4(%esi),%esi
220	movl	(%edi,%eax,4),%ecx
221	jb	L008loop4
222	cmpl	24(%esp),%esi
223	je	L007done
224	movl	32(%esp),%ebp
225.align	4,0x90
226L002loop1:
227	addb	%cl,%bl
228	movl	(%edi,%ebx,4),%edx
229	movl	%ecx,(%edi,%ebx,4)
230	movl	%edx,(%edi,%eax,4)
231	addl	%ecx,%edx
232	incb	%al
233	andl	$255,%edx
234	movl	(%edi,%edx,4),%edx
235	xorb	(%esi),%dl
236	leal	1(%esi),%esi
237	movl	(%edi,%eax,4),%ecx
238	cmpl	24(%esp),%esi
239	movb	%dl,-1(%ebp,%esi,1)
240	jb	L002loop1
241	jmp	L007done
242.align	4,0x90
243L001RC4_CHAR:
244	movzbl	(%edi,%eax,1),%ecx
245L009cloop1:
246	addb	%cl,%bl
247	movzbl	(%edi,%ebx,1),%edx
248	movb	%cl,(%edi,%ebx,1)
249	movb	%dl,(%edi,%eax,1)
250	addb	%cl,%dl
251	movzbl	(%edi,%edx,1),%edx
252	addb	$1,%al
253	xorb	(%esi),%dl
254	leal	1(%esi),%esi
255	movzbl	(%edi,%eax,1),%ecx
256	cmpl	24(%esp),%esi
257	movb	%dl,-1(%ebp,%esi,1)
258	jb	L009cloop1
259L007done:
260	decb	%al
261	movl	%ebx,-4(%edi)
262	movb	%al,-8(%edi)
263L000abort:
264	popl	%edi
265	popl	%esi
266	popl	%ebx
267	popl	%ebp
268	ret
269.globl	_asm_RC4_set_key
270.private_extern	_asm_RC4_set_key
271.align	4
272_asm_RC4_set_key:
273L_asm_RC4_set_key_begin:
274	pushl	%ebp
275	pushl	%ebx
276	pushl	%esi
277	pushl	%edi
278	movl	20(%esp),%edi
279	movl	24(%esp),%ebp
280	movl	28(%esp),%esi
281	call	L010PIC_me_up
282L010PIC_me_up:
283	popl	%edx
284	movl	L_OPENSSL_ia32cap_P$non_lazy_ptr-L010PIC_me_up(%edx),%edx
285	leal	8(%edi),%edi
286	leal	(%esi,%ebp,1),%esi
287	negl	%ebp
288	xorl	%eax,%eax
289	movl	%ebp,-4(%edi)
290	btl	$20,(%edx)
291	jc	L011c1stloop
292.align	4,0x90
293L012w1stloop:
294	movl	%eax,(%edi,%eax,4)
295	addb	$1,%al
296	jnc	L012w1stloop
297	xorl	%ecx,%ecx
298	xorl	%edx,%edx
299.align	4,0x90
300L013w2ndloop:
301	movl	(%edi,%ecx,4),%eax
302	addb	(%esi,%ebp,1),%dl
303	addb	%al,%dl
304	addl	$1,%ebp
305	movl	(%edi,%edx,4),%ebx
306	jnz	L014wnowrap
307	movl	-4(%edi),%ebp
308L014wnowrap:
309	movl	%eax,(%edi,%edx,4)
310	movl	%ebx,(%edi,%ecx,4)
311	addb	$1,%cl
312	jnc	L013w2ndloop
313	jmp	L015exit
314.align	4,0x90
315L011c1stloop:
316	movb	%al,(%edi,%eax,1)
317	addb	$1,%al
318	jnc	L011c1stloop
319	xorl	%ecx,%ecx
320	xorl	%edx,%edx
321	xorl	%ebx,%ebx
322.align	4,0x90
323L016c2ndloop:
324	movb	(%edi,%ecx,1),%al
325	addb	(%esi,%ebp,1),%dl
326	addb	%al,%dl
327	addl	$1,%ebp
328	movb	(%edi,%edx,1),%bl
329	jnz	L017cnowrap
330	movl	-4(%edi),%ebp
331L017cnowrap:
332	movb	%al,(%edi,%edx,1)
333	movb	%bl,(%edi,%ecx,1)
334	addb	$1,%cl
335	jnc	L016c2ndloop
336	movl	$-1,256(%edi)
337L015exit:
338	xorl	%eax,%eax
339	movl	%eax,-8(%edi)
340	movl	%eax,-4(%edi)
341	popl	%edi
342	popl	%esi
343	popl	%ebx
344	popl	%ebp
345	ret
346.globl	_RC4_options
347.private_extern	_RC4_options
348.align	4
349_RC4_options:
350L_RC4_options_begin:
351	call	L018pic_point
352L018pic_point:
353	popl	%eax
354	leal	L019opts-L018pic_point(%eax),%eax
355	call	L020PIC_me_up
356L020PIC_me_up:
357	popl	%edx
358	movl	L_OPENSSL_ia32cap_P$non_lazy_ptr-L020PIC_me_up(%edx),%edx
359	movl	(%edx),%edx
360	btl	$20,%edx
361	jc	L0211xchar
362	btl	$26,%edx
363	jnc	L022ret
364	addl	$25,%eax
365	ret
366L0211xchar:
367	addl	$12,%eax
368L022ret:
369	ret
370.align	6,0x90
371L019opts:
372.byte	114,99,52,40,52,120,44,105,110,116,41,0
373.byte	114,99,52,40,49,120,44,99,104,97,114,41,0
374.byte	114,99,52,40,56,120,44,109,109,120,41,0
375.byte	82,67,52,32,102,111,114,32,120,56,54,44,32,67,82,89
376.byte	80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114
377.byte	111,64,111,112,101,110,115,115,108,46,111,114,103,62,0
378.align	6,0x90
379.section __IMPORT,__pointers,non_lazy_symbol_pointers
380L_OPENSSL_ia32cap_P$non_lazy_ptr:
381.indirect_symbol	_OPENSSL_ia32cap_P
382.long	0
383#endif
384