1299966Sjkim# $FreeBSD$
2299966Sjkim# Do not modify. This file is auto-generated from rc4-x86_64.pl.
3238405Sjkim.text
4238405Sjkim
5238405Sjkim
6238405Sjkim.globl	RC4
7238405Sjkim.type	RC4,@function
8238405Sjkim.align	16
9238405SjkimRC4:	orq	%rsi,%rsi
10238405Sjkim	jne	.Lentry
11238405Sjkim	.byte	0xf3,0xc3
12238405Sjkim.Lentry:
13238405Sjkim	pushq	%rbx
14238405Sjkim	pushq	%r12
15238405Sjkim	pushq	%r13
16238405Sjkim.Lprologue:
17238405Sjkim	movq	%rsi,%r11
18238405Sjkim	movq	%rdx,%r12
19238405Sjkim	movq	%rcx,%r13
20238405Sjkim	xorq	%r10,%r10
21238405Sjkim	xorq	%rcx,%rcx
22238405Sjkim
23238405Sjkim	leaq	8(%rdi),%rdi
24238405Sjkim	movb	-8(%rdi),%r10b
25238405Sjkim	movb	-4(%rdi),%cl
26238405Sjkim	cmpl	$-1,256(%rdi)
27238405Sjkim	je	.LRC4_CHAR
28238405Sjkim	movl	OPENSSL_ia32cap_P(%rip),%r8d
29238405Sjkim	xorq	%rbx,%rbx
30238405Sjkim	incb	%r10b
31238405Sjkim	subq	%r10,%rbx
32238405Sjkim	subq	%r12,%r13
33238405Sjkim	movl	(%rdi,%r10,4),%eax
34238405Sjkim	testq	$-16,%r11
35238405Sjkim	jz	.Lloop1
36238405Sjkim	btl	$30,%r8d
37238405Sjkim	jc	.Lintel
38238405Sjkim	andq	$7,%rbx
39238405Sjkim	leaq	1(%r10),%rsi
40238405Sjkim	jz	.Loop8
41238405Sjkim	subq	%rbx,%r11
42238405Sjkim.Loop8_warmup:
43238405Sjkim	addb	%al,%cl
44238405Sjkim	movl	(%rdi,%rcx,4),%edx
45238405Sjkim	movl	%eax,(%rdi,%rcx,4)
46238405Sjkim	movl	%edx,(%rdi,%r10,4)
47238405Sjkim	addb	%dl,%al
48238405Sjkim	incb	%r10b
49238405Sjkim	movl	(%rdi,%rax,4),%edx
50238405Sjkim	movl	(%rdi,%r10,4),%eax
51238405Sjkim	xorb	(%r12),%dl
52238405Sjkim	movb	%dl,(%r13,%r12,1)
53238405Sjkim	leaq	1(%r12),%r12
54238405Sjkim	decq	%rbx
55238405Sjkim	jnz	.Loop8_warmup
56238405Sjkim
57238405Sjkim	leaq	1(%r10),%rsi
58238405Sjkim	jmp	.Loop8
59238405Sjkim.align	16
60238405Sjkim.Loop8:
61238405Sjkim	addb	%al,%cl
62238405Sjkim	movl	(%rdi,%rcx,4),%edx
63238405Sjkim	movl	%eax,(%rdi,%rcx,4)
64238405Sjkim	movl	0(%rdi,%rsi,4),%ebx
65238405Sjkim	rorq	$8,%r8
66238405Sjkim	movl	%edx,0(%rdi,%r10,4)
67238405Sjkim	addb	%al,%dl
68238405Sjkim	movb	(%rdi,%rdx,4),%r8b
69238405Sjkim	addb	%bl,%cl
70238405Sjkim	movl	(%rdi,%rcx,4),%edx
71238405Sjkim	movl	%ebx,(%rdi,%rcx,4)
72238405Sjkim	movl	4(%rdi,%rsi,4),%eax
73238405Sjkim	rorq	$8,%r8
74238405Sjkim	movl	%edx,4(%rdi,%r10,4)
75238405Sjkim	addb	%bl,%dl
76238405Sjkim	movb	(%rdi,%rdx,4),%r8b
77238405Sjkim	addb	%al,%cl
78238405Sjkim	movl	(%rdi,%rcx,4),%edx
79238405Sjkim	movl	%eax,(%rdi,%rcx,4)
80238405Sjkim	movl	8(%rdi,%rsi,4),%ebx
81238405Sjkim	rorq	$8,%r8
82238405Sjkim	movl	%edx,8(%rdi,%r10,4)
83238405Sjkim	addb	%al,%dl
84238405Sjkim	movb	(%rdi,%rdx,4),%r8b
85238405Sjkim	addb	%bl,%cl
86238405Sjkim	movl	(%rdi,%rcx,4),%edx
87238405Sjkim	movl	%ebx,(%rdi,%rcx,4)
88238405Sjkim	movl	12(%rdi,%rsi,4),%eax
89238405Sjkim	rorq	$8,%r8
90238405Sjkim	movl	%edx,12(%rdi,%r10,4)
91238405Sjkim	addb	%bl,%dl
92238405Sjkim	movb	(%rdi,%rdx,4),%r8b
93238405Sjkim	addb	%al,%cl
94238405Sjkim	movl	(%rdi,%rcx,4),%edx
95238405Sjkim	movl	%eax,(%rdi,%rcx,4)
96238405Sjkim	movl	16(%rdi,%rsi,4),%ebx
97238405Sjkim	rorq	$8,%r8
98238405Sjkim	movl	%edx,16(%rdi,%r10,4)
99238405Sjkim	addb	%al,%dl
100238405Sjkim	movb	(%rdi,%rdx,4),%r8b
101238405Sjkim	addb	%bl,%cl
102238405Sjkim	movl	(%rdi,%rcx,4),%edx
103238405Sjkim	movl	%ebx,(%rdi,%rcx,4)
104238405Sjkim	movl	20(%rdi,%rsi,4),%eax
105238405Sjkim	rorq	$8,%r8
106238405Sjkim	movl	%edx,20(%rdi,%r10,4)
107238405Sjkim	addb	%bl,%dl
108238405Sjkim	movb	(%rdi,%rdx,4),%r8b
109238405Sjkim	addb	%al,%cl
110238405Sjkim	movl	(%rdi,%rcx,4),%edx
111238405Sjkim	movl	%eax,(%rdi,%rcx,4)
112238405Sjkim	movl	24(%rdi,%rsi,4),%ebx
113238405Sjkim	rorq	$8,%r8
114238405Sjkim	movl	%edx,24(%rdi,%r10,4)
115238405Sjkim	addb	%al,%dl
116238405Sjkim	movb	(%rdi,%rdx,4),%r8b
117238405Sjkim	addb	$8,%sil
118238405Sjkim	addb	%bl,%cl
119238405Sjkim	movl	(%rdi,%rcx,4),%edx
120238405Sjkim	movl	%ebx,(%rdi,%rcx,4)
121238405Sjkim	movl	-4(%rdi,%rsi,4),%eax
122238405Sjkim	rorq	$8,%r8
123238405Sjkim	movl	%edx,28(%rdi,%r10,4)
124238405Sjkim	addb	%bl,%dl
125238405Sjkim	movb	(%rdi,%rdx,4),%r8b
126238405Sjkim	addb	$8,%r10b
127238405Sjkim	rorq	$8,%r8
128238405Sjkim	subq	$8,%r11
129238405Sjkim
130238405Sjkim	xorq	(%r12),%r8
131238405Sjkim	movq	%r8,(%r13,%r12,1)
132238405Sjkim	leaq	8(%r12),%r12
133238405Sjkim
134238405Sjkim	testq	$-8,%r11
135238405Sjkim	jnz	.Loop8
136238405Sjkim	cmpq	$0,%r11
137238405Sjkim	jne	.Lloop1
138238405Sjkim	jmp	.Lexit
139238405Sjkim
140238405Sjkim.align	16
141238405Sjkim.Lintel:
142238405Sjkim	testq	$-32,%r11
143238405Sjkim	jz	.Lloop1
144238405Sjkim	andq	$15,%rbx
145238405Sjkim	jz	.Loop16_is_hot
146238405Sjkim	subq	%rbx,%r11
147238405Sjkim.Loop16_warmup:
148238405Sjkim	addb	%al,%cl
149238405Sjkim	movl	(%rdi,%rcx,4),%edx
150238405Sjkim	movl	%eax,(%rdi,%rcx,4)
151238405Sjkim	movl	%edx,(%rdi,%r10,4)
152238405Sjkim	addb	%dl,%al
153238405Sjkim	incb	%r10b
154238405Sjkim	movl	(%rdi,%rax,4),%edx
155238405Sjkim	movl	(%rdi,%r10,4),%eax
156238405Sjkim	xorb	(%r12),%dl
157238405Sjkim	movb	%dl,(%r13,%r12,1)
158238405Sjkim	leaq	1(%r12),%r12
159238405Sjkim	decq	%rbx
160238405Sjkim	jnz	.Loop16_warmup
161238405Sjkim
162238405Sjkim	movq	%rcx,%rbx
163238405Sjkim	xorq	%rcx,%rcx
164238405Sjkim	movb	%bl,%cl
165238405Sjkim
166238405Sjkim.Loop16_is_hot:
167238405Sjkim	leaq	(%rdi,%r10,4),%rsi
168238405Sjkim	addb	%al,%cl
169238405Sjkim	movl	(%rdi,%rcx,4),%edx
170238405Sjkim	pxor	%xmm0,%xmm0
171238405Sjkim	movl	%eax,(%rdi,%rcx,4)
172238405Sjkim	addb	%dl,%al
173238405Sjkim	movl	4(%rsi),%ebx
174238405Sjkim	movzbl	%al,%eax
175238405Sjkim	movl	%edx,0(%rsi)
176238405Sjkim	addb	%bl,%cl
177238405Sjkim	pinsrw	$0,(%rdi,%rax,4),%xmm0
178238405Sjkim	jmp	.Loop16_enter
179238405Sjkim.align	16
180238405Sjkim.Loop16:
181238405Sjkim	addb	%al,%cl
182238405Sjkim	movl	(%rdi,%rcx,4),%edx
183238405Sjkim	pxor	%xmm0,%xmm2
184238405Sjkim	psllq	$8,%xmm1
185238405Sjkim	pxor	%xmm0,%xmm0
186238405Sjkim	movl	%eax,(%rdi,%rcx,4)
187238405Sjkim	addb	%dl,%al
188238405Sjkim	movl	4(%rsi),%ebx
189238405Sjkim	movzbl	%al,%eax
190238405Sjkim	movl	%edx,0(%rsi)
191238405Sjkim	pxor	%xmm1,%xmm2
192238405Sjkim	addb	%bl,%cl
193238405Sjkim	pinsrw	$0,(%rdi,%rax,4),%xmm0
194238405Sjkim	movdqu	%xmm2,(%r13,%r12,1)
195238405Sjkim	leaq	16(%r12),%r12
196238405Sjkim.Loop16_enter:
197238405Sjkim	movl	(%rdi,%rcx,4),%edx
198238405Sjkim	pxor	%xmm1,%xmm1
199238405Sjkim	movl	%ebx,(%rdi,%rcx,4)
200238405Sjkim	addb	%dl,%bl
201238405Sjkim	movl	8(%rsi),%eax
202238405Sjkim	movzbl	%bl,%ebx
203238405Sjkim	movl	%edx,4(%rsi)
204238405Sjkim	addb	%al,%cl
205238405Sjkim	pinsrw	$0,(%rdi,%rbx,4),%xmm1
206238405Sjkim	movl	(%rdi,%rcx,4),%edx
207238405Sjkim	movl	%eax,(%rdi,%rcx,4)
208238405Sjkim	addb	%dl,%al
209238405Sjkim	movl	12(%rsi),%ebx
210238405Sjkim	movzbl	%al,%eax
211238405Sjkim	movl	%edx,8(%rsi)
212238405Sjkim	addb	%bl,%cl
213238405Sjkim	pinsrw	$1,(%rdi,%rax,4),%xmm0
214238405Sjkim	movl	(%rdi,%rcx,4),%edx
215238405Sjkim	movl	%ebx,(%rdi,%rcx,4)
216238405Sjkim	addb	%dl,%bl
217238405Sjkim	movl	16(%rsi),%eax
218238405Sjkim	movzbl	%bl,%ebx
219238405Sjkim	movl	%edx,12(%rsi)
220238405Sjkim	addb	%al,%cl
221238405Sjkim	pinsrw	$1,(%rdi,%rbx,4),%xmm1
222238405Sjkim	movl	(%rdi,%rcx,4),%edx
223238405Sjkim	movl	%eax,(%rdi,%rcx,4)
224238405Sjkim	addb	%dl,%al
225238405Sjkim	movl	20(%rsi),%ebx
226238405Sjkim	movzbl	%al,%eax
227238405Sjkim	movl	%edx,16(%rsi)
228238405Sjkim	addb	%bl,%cl
229238405Sjkim	pinsrw	$2,(%rdi,%rax,4),%xmm0
230238405Sjkim	movl	(%rdi,%rcx,4),%edx
231238405Sjkim	movl	%ebx,(%rdi,%rcx,4)
232238405Sjkim	addb	%dl,%bl
233238405Sjkim	movl	24(%rsi),%eax
234238405Sjkim	movzbl	%bl,%ebx
235238405Sjkim	movl	%edx,20(%rsi)
236238405Sjkim	addb	%al,%cl
237238405Sjkim	pinsrw	$2,(%rdi,%rbx,4),%xmm1
238238405Sjkim	movl	(%rdi,%rcx,4),%edx
239238405Sjkim	movl	%eax,(%rdi,%rcx,4)
240238405Sjkim	addb	%dl,%al
241238405Sjkim	movl	28(%rsi),%ebx
242238405Sjkim	movzbl	%al,%eax
243238405Sjkim	movl	%edx,24(%rsi)
244238405Sjkim	addb	%bl,%cl
245238405Sjkim	pinsrw	$3,(%rdi,%rax,4),%xmm0
246238405Sjkim	movl	(%rdi,%rcx,4),%edx
247238405Sjkim	movl	%ebx,(%rdi,%rcx,4)
248238405Sjkim	addb	%dl,%bl
249238405Sjkim	movl	32(%rsi),%eax
250238405Sjkim	movzbl	%bl,%ebx
251238405Sjkim	movl	%edx,28(%rsi)
252238405Sjkim	addb	%al,%cl
253238405Sjkim	pinsrw	$3,(%rdi,%rbx,4),%xmm1
254238405Sjkim	movl	(%rdi,%rcx,4),%edx
255238405Sjkim	movl	%eax,(%rdi,%rcx,4)
256238405Sjkim	addb	%dl,%al
257238405Sjkim	movl	36(%rsi),%ebx
258238405Sjkim	movzbl	%al,%eax
259238405Sjkim	movl	%edx,32(%rsi)
260238405Sjkim	addb	%bl,%cl
261238405Sjkim	pinsrw	$4,(%rdi,%rax,4),%xmm0
262238405Sjkim	movl	(%rdi,%rcx,4),%edx
263238405Sjkim	movl	%ebx,(%rdi,%rcx,4)
264238405Sjkim	addb	%dl,%bl
265238405Sjkim	movl	40(%rsi),%eax
266238405Sjkim	movzbl	%bl,%ebx
267238405Sjkim	movl	%edx,36(%rsi)
268238405Sjkim	addb	%al,%cl
269238405Sjkim	pinsrw	$4,(%rdi,%rbx,4),%xmm1
270238405Sjkim	movl	(%rdi,%rcx,4),%edx
271238405Sjkim	movl	%eax,(%rdi,%rcx,4)
272238405Sjkim	addb	%dl,%al
273238405Sjkim	movl	44(%rsi),%ebx
274238405Sjkim	movzbl	%al,%eax
275238405Sjkim	movl	%edx,40(%rsi)
276238405Sjkim	addb	%bl,%cl
277238405Sjkim	pinsrw	$5,(%rdi,%rax,4),%xmm0
278238405Sjkim	movl	(%rdi,%rcx,4),%edx
279238405Sjkim	movl	%ebx,(%rdi,%rcx,4)
280238405Sjkim	addb	%dl,%bl
281238405Sjkim	movl	48(%rsi),%eax
282238405Sjkim	movzbl	%bl,%ebx
283238405Sjkim	movl	%edx,44(%rsi)
284238405Sjkim	addb	%al,%cl
285238405Sjkim	pinsrw	$5,(%rdi,%rbx,4),%xmm1
286238405Sjkim	movl	(%rdi,%rcx,4),%edx
287238405Sjkim	movl	%eax,(%rdi,%rcx,4)
288238405Sjkim	addb	%dl,%al
289238405Sjkim	movl	52(%rsi),%ebx
290238405Sjkim	movzbl	%al,%eax
291238405Sjkim	movl	%edx,48(%rsi)
292238405Sjkim	addb	%bl,%cl
293238405Sjkim	pinsrw	$6,(%rdi,%rax,4),%xmm0
294238405Sjkim	movl	(%rdi,%rcx,4),%edx
295238405Sjkim	movl	%ebx,(%rdi,%rcx,4)
296238405Sjkim	addb	%dl,%bl
297238405Sjkim	movl	56(%rsi),%eax
298238405Sjkim	movzbl	%bl,%ebx
299238405Sjkim	movl	%edx,52(%rsi)
300238405Sjkim	addb	%al,%cl
301238405Sjkim	pinsrw	$6,(%rdi,%rbx,4),%xmm1
302238405Sjkim	movl	(%rdi,%rcx,4),%edx
303238405Sjkim	movl	%eax,(%rdi,%rcx,4)
304238405Sjkim	addb	%dl,%al
305238405Sjkim	movl	60(%rsi),%ebx
306238405Sjkim	movzbl	%al,%eax
307238405Sjkim	movl	%edx,56(%rsi)
308238405Sjkim	addb	%bl,%cl
309238405Sjkim	pinsrw	$7,(%rdi,%rax,4),%xmm0
310238405Sjkim	addb	$16,%r10b
311238405Sjkim	movdqu	(%r12),%xmm2
312238405Sjkim	movl	(%rdi,%rcx,4),%edx
313238405Sjkim	movl	%ebx,(%rdi,%rcx,4)
314238405Sjkim	addb	%dl,%bl
315238405Sjkim	movzbl	%bl,%ebx
316238405Sjkim	movl	%edx,60(%rsi)
317238405Sjkim	leaq	(%rdi,%r10,4),%rsi
318238405Sjkim	pinsrw	$7,(%rdi,%rbx,4),%xmm1
319238405Sjkim	movl	(%rsi),%eax
320238405Sjkim	movq	%rcx,%rbx
321238405Sjkim	xorq	%rcx,%rcx
322238405Sjkim	subq	$16,%r11
323238405Sjkim	movb	%bl,%cl
324238405Sjkim	testq	$-16,%r11
325238405Sjkim	jnz	.Loop16
326238405Sjkim
327238405Sjkim	psllq	$8,%xmm1
328238405Sjkim	pxor	%xmm0,%xmm2
329238405Sjkim	pxor	%xmm1,%xmm2
330238405Sjkim	movdqu	%xmm2,(%r13,%r12,1)
331238405Sjkim	leaq	16(%r12),%r12
332238405Sjkim
333238405Sjkim	cmpq	$0,%r11
334238405Sjkim	jne	.Lloop1
335238405Sjkim	jmp	.Lexit
336238405Sjkim
337238405Sjkim.align	16
338238405Sjkim.Lloop1:
339238405Sjkim	addb	%al,%cl
340238405Sjkim	movl	(%rdi,%rcx,4),%edx
341238405Sjkim	movl	%eax,(%rdi,%rcx,4)
342238405Sjkim	movl	%edx,(%rdi,%r10,4)
343238405Sjkim	addb	%dl,%al
344238405Sjkim	incb	%r10b
345238405Sjkim	movl	(%rdi,%rax,4),%edx
346238405Sjkim	movl	(%rdi,%r10,4),%eax
347238405Sjkim	xorb	(%r12),%dl
348238405Sjkim	movb	%dl,(%r13,%r12,1)
349238405Sjkim	leaq	1(%r12),%r12
350238405Sjkim	decq	%r11
351238405Sjkim	jnz	.Lloop1
352238405Sjkim	jmp	.Lexit
353238405Sjkim
354238405Sjkim.align	16
355238405Sjkim.LRC4_CHAR:
356238405Sjkim	addb	$1,%r10b
357238405Sjkim	movzbl	(%rdi,%r10,1),%eax
358238405Sjkim	testq	$-8,%r11
359238405Sjkim	jz	.Lcloop1
360238405Sjkim	jmp	.Lcloop8
361238405Sjkim.align	16
362238405Sjkim.Lcloop8:
363238405Sjkim	movl	(%r12),%r8d
364238405Sjkim	movl	4(%r12),%r9d
365238405Sjkim	addb	%al,%cl
366238405Sjkim	leaq	1(%r10),%rsi
367238405Sjkim	movzbl	(%rdi,%rcx,1),%edx
368238405Sjkim	movzbl	%sil,%esi
369238405Sjkim	movzbl	(%rdi,%rsi,1),%ebx
370238405Sjkim	movb	%al,(%rdi,%rcx,1)
371238405Sjkim	cmpq	%rsi,%rcx
372238405Sjkim	movb	%dl,(%rdi,%r10,1)
373238405Sjkim	jne	.Lcmov0
374238405Sjkim	movq	%rax,%rbx
375238405Sjkim.Lcmov0:
376238405Sjkim	addb	%al,%dl
377238405Sjkim	xorb	(%rdi,%rdx,1),%r8b
378238405Sjkim	rorl	$8,%r8d
379238405Sjkim	addb	%bl,%cl
380238405Sjkim	leaq	1(%rsi),%r10
381238405Sjkim	movzbl	(%rdi,%rcx,1),%edx
382238405Sjkim	movzbl	%r10b,%r10d
383238405Sjkim	movzbl	(%rdi,%r10,1),%eax
384238405Sjkim	movb	%bl,(%rdi,%rcx,1)
385238405Sjkim	cmpq	%r10,%rcx
386238405Sjkim	movb	%dl,(%rdi,%rsi,1)
387238405Sjkim	jne	.Lcmov1
388238405Sjkim	movq	%rbx,%rax
389238405Sjkim.Lcmov1:
390238405Sjkim	addb	%bl,%dl
391238405Sjkim	xorb	(%rdi,%rdx,1),%r8b
392238405Sjkim	rorl	$8,%r8d
393238405Sjkim	addb	%al,%cl
394238405Sjkim	leaq	1(%r10),%rsi
395238405Sjkim	movzbl	(%rdi,%rcx,1),%edx
396238405Sjkim	movzbl	%sil,%esi
397238405Sjkim	movzbl	(%rdi,%rsi,1),%ebx
398238405Sjkim	movb	%al,(%rdi,%rcx,1)
399238405Sjkim	cmpq	%rsi,%rcx
400238405Sjkim	movb	%dl,(%rdi,%r10,1)
401238405Sjkim	jne	.Lcmov2
402238405Sjkim	movq	%rax,%rbx
403238405Sjkim.Lcmov2:
404238405Sjkim	addb	%al,%dl
405238405Sjkim	xorb	(%rdi,%rdx,1),%r8b
406238405Sjkim	rorl	$8,%r8d
407238405Sjkim	addb	%bl,%cl
408238405Sjkim	leaq	1(%rsi),%r10
409238405Sjkim	movzbl	(%rdi,%rcx,1),%edx
410238405Sjkim	movzbl	%r10b,%r10d
411238405Sjkim	movzbl	(%rdi,%r10,1),%eax
412238405Sjkim	movb	%bl,(%rdi,%rcx,1)
413238405Sjkim	cmpq	%r10,%rcx
414238405Sjkim	movb	%dl,(%rdi,%rsi,1)
415238405Sjkim	jne	.Lcmov3
416238405Sjkim	movq	%rbx,%rax
417238405Sjkim.Lcmov3:
418238405Sjkim	addb	%bl,%dl
419238405Sjkim	xorb	(%rdi,%rdx,1),%r8b
420238405Sjkim	rorl	$8,%r8d
421238405Sjkim	addb	%al,%cl
422238405Sjkim	leaq	1(%r10),%rsi
423238405Sjkim	movzbl	(%rdi,%rcx,1),%edx
424238405Sjkim	movzbl	%sil,%esi
425238405Sjkim	movzbl	(%rdi,%rsi,1),%ebx
426238405Sjkim	movb	%al,(%rdi,%rcx,1)
427238405Sjkim	cmpq	%rsi,%rcx
428238405Sjkim	movb	%dl,(%rdi,%r10,1)
429238405Sjkim	jne	.Lcmov4
430238405Sjkim	movq	%rax,%rbx
431238405Sjkim.Lcmov4:
432238405Sjkim	addb	%al,%dl
433238405Sjkim	xorb	(%rdi,%rdx,1),%r9b
434238405Sjkim	rorl	$8,%r9d
435238405Sjkim	addb	%bl,%cl
436238405Sjkim	leaq	1(%rsi),%r10
437238405Sjkim	movzbl	(%rdi,%rcx,1),%edx
438238405Sjkim	movzbl	%r10b,%r10d
439238405Sjkim	movzbl	(%rdi,%r10,1),%eax
440238405Sjkim	movb	%bl,(%rdi,%rcx,1)
441238405Sjkim	cmpq	%r10,%rcx
442238405Sjkim	movb	%dl,(%rdi,%rsi,1)
443238405Sjkim	jne	.Lcmov5
444238405Sjkim	movq	%rbx,%rax
445238405Sjkim.Lcmov5:
446238405Sjkim	addb	%bl,%dl
447238405Sjkim	xorb	(%rdi,%rdx,1),%r9b
448238405Sjkim	rorl	$8,%r9d
449238405Sjkim	addb	%al,%cl
450238405Sjkim	leaq	1(%r10),%rsi
451238405Sjkim	movzbl	(%rdi,%rcx,1),%edx
452238405Sjkim	movzbl	%sil,%esi
453238405Sjkim	movzbl	(%rdi,%rsi,1),%ebx
454238405Sjkim	movb	%al,(%rdi,%rcx,1)
455238405Sjkim	cmpq	%rsi,%rcx
456238405Sjkim	movb	%dl,(%rdi,%r10,1)
457238405Sjkim	jne	.Lcmov6
458238405Sjkim	movq	%rax,%rbx
459238405Sjkim.Lcmov6:
460238405Sjkim	addb	%al,%dl
461238405Sjkim	xorb	(%rdi,%rdx,1),%r9b
462238405Sjkim	rorl	$8,%r9d
463238405Sjkim	addb	%bl,%cl
464238405Sjkim	leaq	1(%rsi),%r10
465238405Sjkim	movzbl	(%rdi,%rcx,1),%edx
466238405Sjkim	movzbl	%r10b,%r10d
467238405Sjkim	movzbl	(%rdi,%r10,1),%eax
468238405Sjkim	movb	%bl,(%rdi,%rcx,1)
469238405Sjkim	cmpq	%r10,%rcx
470238405Sjkim	movb	%dl,(%rdi,%rsi,1)
471238405Sjkim	jne	.Lcmov7
472238405Sjkim	movq	%rbx,%rax
473238405Sjkim.Lcmov7:
474238405Sjkim	addb	%bl,%dl
475238405Sjkim	xorb	(%rdi,%rdx,1),%r9b
476238405Sjkim	rorl	$8,%r9d
477238405Sjkim	leaq	-8(%r11),%r11
478238405Sjkim	movl	%r8d,(%r13)
479238405Sjkim	leaq	8(%r12),%r12
480238405Sjkim	movl	%r9d,4(%r13)
481238405Sjkim	leaq	8(%r13),%r13
482238405Sjkim
483238405Sjkim	testq	$-8,%r11
484238405Sjkim	jnz	.Lcloop8
485238405Sjkim	cmpq	$0,%r11
486238405Sjkim	jne	.Lcloop1
487238405Sjkim	jmp	.Lexit
488238405Sjkim.align	16
489238405Sjkim.Lcloop1:
490238405Sjkim	addb	%al,%cl
491238405Sjkim	movzbl	%cl,%ecx
492238405Sjkim	movzbl	(%rdi,%rcx,1),%edx
493238405Sjkim	movb	%al,(%rdi,%rcx,1)
494238405Sjkim	movb	%dl,(%rdi,%r10,1)
495238405Sjkim	addb	%al,%dl
496238405Sjkim	addb	$1,%r10b
497238405Sjkim	movzbl	%dl,%edx
498238405Sjkim	movzbl	%r10b,%r10d
499238405Sjkim	movzbl	(%rdi,%rdx,1),%edx
500238405Sjkim	movzbl	(%rdi,%r10,1),%eax
501238405Sjkim	xorb	(%r12),%dl
502238405Sjkim	leaq	1(%r12),%r12
503238405Sjkim	movb	%dl,(%r13)
504238405Sjkim	leaq	1(%r13),%r13
505238405Sjkim	subq	$1,%r11
506238405Sjkim	jnz	.Lcloop1
507238405Sjkim	jmp	.Lexit
508238405Sjkim
509238405Sjkim.align	16
510238405Sjkim.Lexit:
511238405Sjkim	subb	$1,%r10b
512238405Sjkim	movl	%r10d,-8(%rdi)
513238405Sjkim	movl	%ecx,-4(%rdi)
514238405Sjkim
515238405Sjkim	movq	(%rsp),%r13
516238405Sjkim	movq	8(%rsp),%r12
517238405Sjkim	movq	16(%rsp),%rbx
518238405Sjkim	addq	$24,%rsp
519238405Sjkim.Lepilogue:
520238405Sjkim	.byte	0xf3,0xc3
521238405Sjkim.size	RC4,.-RC4
522238405Sjkim.globl	private_RC4_set_key
523238405Sjkim.type	private_RC4_set_key,@function
524238405Sjkim.align	16
525238405Sjkimprivate_RC4_set_key:
526238405Sjkim	leaq	8(%rdi),%rdi
527238405Sjkim	leaq	(%rdx,%rsi,1),%rdx
528238405Sjkim	negq	%rsi
529238405Sjkim	movq	%rsi,%rcx
530238405Sjkim	xorl	%eax,%eax
531238405Sjkim	xorq	%r9,%r9
532238405Sjkim	xorq	%r10,%r10
533238405Sjkim	xorq	%r11,%r11
534238405Sjkim
535238405Sjkim	movl	OPENSSL_ia32cap_P(%rip),%r8d
536238405Sjkim	btl	$20,%r8d
537238405Sjkim	jc	.Lc1stloop
538238405Sjkim	jmp	.Lw1stloop
539238405Sjkim
540238405Sjkim.align	16
541238405Sjkim.Lw1stloop:
542238405Sjkim	movl	%eax,(%rdi,%rax,4)
543238405Sjkim	addb	$1,%al
544238405Sjkim	jnc	.Lw1stloop
545238405Sjkim
546238405Sjkim	xorq	%r9,%r9
547238405Sjkim	xorq	%r8,%r8
548238405Sjkim.align	16
549238405Sjkim.Lw2ndloop:
550238405Sjkim	movl	(%rdi,%r9,4),%r10d
551238405Sjkim	addb	(%rdx,%rsi,1),%r8b
552238405Sjkim	addb	%r10b,%r8b
553238405Sjkim	addq	$1,%rsi
554238405Sjkim	movl	(%rdi,%r8,4),%r11d
555238405Sjkim	cmovzq	%rcx,%rsi
556238405Sjkim	movl	%r10d,(%rdi,%r8,4)
557238405Sjkim	movl	%r11d,(%rdi,%r9,4)
558238405Sjkim	addb	$1,%r9b
559238405Sjkim	jnc	.Lw2ndloop
560238405Sjkim	jmp	.Lexit_key
561238405Sjkim
562238405Sjkim.align	16
563238405Sjkim.Lc1stloop:
564238405Sjkim	movb	%al,(%rdi,%rax,1)
565238405Sjkim	addb	$1,%al
566238405Sjkim	jnc	.Lc1stloop
567238405Sjkim
568238405Sjkim	xorq	%r9,%r9
569238405Sjkim	xorq	%r8,%r8
570238405Sjkim.align	16
571238405Sjkim.Lc2ndloop:
572238405Sjkim	movb	(%rdi,%r9,1),%r10b
573238405Sjkim	addb	(%rdx,%rsi,1),%r8b
574238405Sjkim	addb	%r10b,%r8b
575238405Sjkim	addq	$1,%rsi
576238405Sjkim	movb	(%rdi,%r8,1),%r11b
577238405Sjkim	jnz	.Lcnowrap
578238405Sjkim	movq	%rcx,%rsi
579238405Sjkim.Lcnowrap:
580238405Sjkim	movb	%r10b,(%rdi,%r8,1)
581238405Sjkim	movb	%r11b,(%rdi,%r9,1)
582238405Sjkim	addb	$1,%r9b
583238405Sjkim	jnc	.Lc2ndloop
584238405Sjkim	movl	$-1,256(%rdi)
585238405Sjkim
586238405Sjkim.align	16
587238405Sjkim.Lexit_key:
588238405Sjkim	xorl	%eax,%eax
589238405Sjkim	movl	%eax,-8(%rdi)
590238405Sjkim	movl	%eax,-4(%rdi)
591238405Sjkim	.byte	0xf3,0xc3
592238405Sjkim.size	private_RC4_set_key,.-private_RC4_set_key
593238405Sjkim
594238405Sjkim.globl	RC4_options
595238405Sjkim.type	RC4_options,@function
596238405Sjkim.align	16
597238405SjkimRC4_options:
598238405Sjkim	leaq	.Lopts(%rip),%rax
599238405Sjkim	movl	OPENSSL_ia32cap_P(%rip),%edx
600238405Sjkim	btl	$20,%edx
601238405Sjkim	jc	.L8xchar
602238405Sjkim	btl	$30,%edx
603238405Sjkim	jnc	.Ldone
604238405Sjkim	addq	$25,%rax
605238405Sjkim	.byte	0xf3,0xc3
606238405Sjkim.L8xchar:
607238405Sjkim	addq	$12,%rax
608238405Sjkim.Ldone:
609238405Sjkim	.byte	0xf3,0xc3
610238405Sjkim.align	64
611238405Sjkim.Lopts:
612238405Sjkim.byte	114,99,52,40,56,120,44,105,110,116,41,0
613238405Sjkim.byte	114,99,52,40,56,120,44,99,104,97,114,41,0
614238405Sjkim.byte	114,99,52,40,49,54,120,44,105,110,116,41,0
615238405Sjkim.byte	82,67,52,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0
616238405Sjkim.align	64
617238405Sjkim.size	RC4_options,.-RC4_options
618