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