1	# $FreeBSD$
2.text
3
4
5.globl	RC4
6.type	RC4,@function
7.align	16
8RC4:	orq	%rsi,%rsi
9	jne	.Lentry
10	.byte	0xf3,0xc3
11.Lentry:
12	pushq	%rbx
13	pushq	%r12
14	pushq	%r13
15.Lprologue:
16	movq	%rsi,%r11
17	movq	%rdx,%r12
18	movq	%rcx,%r13
19	xorq	%r10,%r10
20	xorq	%rcx,%rcx
21
22	leaq	8(%rdi),%rdi
23	movb	-8(%rdi),%r10b
24	movb	-4(%rdi),%cl
25	cmpl	$-1,256(%rdi)
26	je	.LRC4_CHAR
27	movl	OPENSSL_ia32cap_P(%rip),%r8d
28	xorq	%rbx,%rbx
29	incb	%r10b
30	subq	%r10,%rbx
31	subq	%r12,%r13
32	movl	(%rdi,%r10,4),%eax
33	testq	$-16,%r11
34	jz	.Lloop1
35	btl	$30,%r8d
36	jc	.Lintel
37	andq	$7,%rbx
38	leaq	1(%r10),%rsi
39	jz	.Loop8
40	subq	%rbx,%r11
41.Loop8_warmup:
42	addb	%al,%cl
43	movl	(%rdi,%rcx,4),%edx
44	movl	%eax,(%rdi,%rcx,4)
45	movl	%edx,(%rdi,%r10,4)
46	addb	%dl,%al
47	incb	%r10b
48	movl	(%rdi,%rax,4),%edx
49	movl	(%rdi,%r10,4),%eax
50	xorb	(%r12),%dl
51	movb	%dl,(%r13,%r12,1)
52	leaq	1(%r12),%r12
53	decq	%rbx
54	jnz	.Loop8_warmup
55
56	leaq	1(%r10),%rsi
57	jmp	.Loop8
58.align	16
59.Loop8:
60	addb	%al,%cl
61	movl	(%rdi,%rcx,4),%edx
62	movl	%eax,(%rdi,%rcx,4)
63	movl	0(%rdi,%rsi,4),%ebx
64	rorq	$8,%r8
65	movl	%edx,0(%rdi,%r10,4)
66	addb	%al,%dl
67	movb	(%rdi,%rdx,4),%r8b
68	addb	%bl,%cl
69	movl	(%rdi,%rcx,4),%edx
70	movl	%ebx,(%rdi,%rcx,4)
71	movl	4(%rdi,%rsi,4),%eax
72	rorq	$8,%r8
73	movl	%edx,4(%rdi,%r10,4)
74	addb	%bl,%dl
75	movb	(%rdi,%rdx,4),%r8b
76	addb	%al,%cl
77	movl	(%rdi,%rcx,4),%edx
78	movl	%eax,(%rdi,%rcx,4)
79	movl	8(%rdi,%rsi,4),%ebx
80	rorq	$8,%r8
81	movl	%edx,8(%rdi,%r10,4)
82	addb	%al,%dl
83	movb	(%rdi,%rdx,4),%r8b
84	addb	%bl,%cl
85	movl	(%rdi,%rcx,4),%edx
86	movl	%ebx,(%rdi,%rcx,4)
87	movl	12(%rdi,%rsi,4),%eax
88	rorq	$8,%r8
89	movl	%edx,12(%rdi,%r10,4)
90	addb	%bl,%dl
91	movb	(%rdi,%rdx,4),%r8b
92	addb	%al,%cl
93	movl	(%rdi,%rcx,4),%edx
94	movl	%eax,(%rdi,%rcx,4)
95	movl	16(%rdi,%rsi,4),%ebx
96	rorq	$8,%r8
97	movl	%edx,16(%rdi,%r10,4)
98	addb	%al,%dl
99	movb	(%rdi,%rdx,4),%r8b
100	addb	%bl,%cl
101	movl	(%rdi,%rcx,4),%edx
102	movl	%ebx,(%rdi,%rcx,4)
103	movl	20(%rdi,%rsi,4),%eax
104	rorq	$8,%r8
105	movl	%edx,20(%rdi,%r10,4)
106	addb	%bl,%dl
107	movb	(%rdi,%rdx,4),%r8b
108	addb	%al,%cl
109	movl	(%rdi,%rcx,4),%edx
110	movl	%eax,(%rdi,%rcx,4)
111	movl	24(%rdi,%rsi,4),%ebx
112	rorq	$8,%r8
113	movl	%edx,24(%rdi,%r10,4)
114	addb	%al,%dl
115	movb	(%rdi,%rdx,4),%r8b
116	addb	$8,%sil
117	addb	%bl,%cl
118	movl	(%rdi,%rcx,4),%edx
119	movl	%ebx,(%rdi,%rcx,4)
120	movl	-4(%rdi,%rsi,4),%eax
121	rorq	$8,%r8
122	movl	%edx,28(%rdi,%r10,4)
123	addb	%bl,%dl
124	movb	(%rdi,%rdx,4),%r8b
125	addb	$8,%r10b
126	rorq	$8,%r8
127	subq	$8,%r11
128
129	xorq	(%r12),%r8
130	movq	%r8,(%r13,%r12,1)
131	leaq	8(%r12),%r12
132
133	testq	$-8,%r11
134	jnz	.Loop8
135	cmpq	$0,%r11
136	jne	.Lloop1
137	jmp	.Lexit
138
139.align	16
140.Lintel:
141	testq	$-32,%r11
142	jz	.Lloop1
143	andq	$15,%rbx
144	jz	.Loop16_is_hot
145	subq	%rbx,%r11
146.Loop16_warmup:
147	addb	%al,%cl
148	movl	(%rdi,%rcx,4),%edx
149	movl	%eax,(%rdi,%rcx,4)
150	movl	%edx,(%rdi,%r10,4)
151	addb	%dl,%al
152	incb	%r10b
153	movl	(%rdi,%rax,4),%edx
154	movl	(%rdi,%r10,4),%eax
155	xorb	(%r12),%dl
156	movb	%dl,(%r13,%r12,1)
157	leaq	1(%r12),%r12
158	decq	%rbx
159	jnz	.Loop16_warmup
160
161	movq	%rcx,%rbx
162	xorq	%rcx,%rcx
163	movb	%bl,%cl
164
165.Loop16_is_hot:
166	leaq	(%rdi,%r10,4),%rsi
167	addb	%al,%cl
168	movl	(%rdi,%rcx,4),%edx
169	pxor	%xmm0,%xmm0
170	movl	%eax,(%rdi,%rcx,4)
171	addb	%dl,%al
172	movl	4(%rsi),%ebx
173	movzbl	%al,%eax
174	movl	%edx,0(%rsi)
175	addb	%bl,%cl
176	pinsrw	$0,(%rdi,%rax,4),%xmm0
177	jmp	.Loop16_enter
178.align	16
179.Loop16:
180	addb	%al,%cl
181	movl	(%rdi,%rcx,4),%edx
182	pxor	%xmm0,%xmm2
183	psllq	$8,%xmm1
184	pxor	%xmm0,%xmm0
185	movl	%eax,(%rdi,%rcx,4)
186	addb	%dl,%al
187	movl	4(%rsi),%ebx
188	movzbl	%al,%eax
189	movl	%edx,0(%rsi)
190	pxor	%xmm1,%xmm2
191	addb	%bl,%cl
192	pinsrw	$0,(%rdi,%rax,4),%xmm0
193	movdqu	%xmm2,(%r13,%r12,1)
194	leaq	16(%r12),%r12
195.Loop16_enter:
196	movl	(%rdi,%rcx,4),%edx
197	pxor	%xmm1,%xmm1
198	movl	%ebx,(%rdi,%rcx,4)
199	addb	%dl,%bl
200	movl	8(%rsi),%eax
201	movzbl	%bl,%ebx
202	movl	%edx,4(%rsi)
203	addb	%al,%cl
204	pinsrw	$0,(%rdi,%rbx,4),%xmm1
205	movl	(%rdi,%rcx,4),%edx
206	movl	%eax,(%rdi,%rcx,4)
207	addb	%dl,%al
208	movl	12(%rsi),%ebx
209	movzbl	%al,%eax
210	movl	%edx,8(%rsi)
211	addb	%bl,%cl
212	pinsrw	$1,(%rdi,%rax,4),%xmm0
213	movl	(%rdi,%rcx,4),%edx
214	movl	%ebx,(%rdi,%rcx,4)
215	addb	%dl,%bl
216	movl	16(%rsi),%eax
217	movzbl	%bl,%ebx
218	movl	%edx,12(%rsi)
219	addb	%al,%cl
220	pinsrw	$1,(%rdi,%rbx,4),%xmm1
221	movl	(%rdi,%rcx,4),%edx
222	movl	%eax,(%rdi,%rcx,4)
223	addb	%dl,%al
224	movl	20(%rsi),%ebx
225	movzbl	%al,%eax
226	movl	%edx,16(%rsi)
227	addb	%bl,%cl
228	pinsrw	$2,(%rdi,%rax,4),%xmm0
229	movl	(%rdi,%rcx,4),%edx
230	movl	%ebx,(%rdi,%rcx,4)
231	addb	%dl,%bl
232	movl	24(%rsi),%eax
233	movzbl	%bl,%ebx
234	movl	%edx,20(%rsi)
235	addb	%al,%cl
236	pinsrw	$2,(%rdi,%rbx,4),%xmm1
237	movl	(%rdi,%rcx,4),%edx
238	movl	%eax,(%rdi,%rcx,4)
239	addb	%dl,%al
240	movl	28(%rsi),%ebx
241	movzbl	%al,%eax
242	movl	%edx,24(%rsi)
243	addb	%bl,%cl
244	pinsrw	$3,(%rdi,%rax,4),%xmm0
245	movl	(%rdi,%rcx,4),%edx
246	movl	%ebx,(%rdi,%rcx,4)
247	addb	%dl,%bl
248	movl	32(%rsi),%eax
249	movzbl	%bl,%ebx
250	movl	%edx,28(%rsi)
251	addb	%al,%cl
252	pinsrw	$3,(%rdi,%rbx,4),%xmm1
253	movl	(%rdi,%rcx,4),%edx
254	movl	%eax,(%rdi,%rcx,4)
255	addb	%dl,%al
256	movl	36(%rsi),%ebx
257	movzbl	%al,%eax
258	movl	%edx,32(%rsi)
259	addb	%bl,%cl
260	pinsrw	$4,(%rdi,%rax,4),%xmm0
261	movl	(%rdi,%rcx,4),%edx
262	movl	%ebx,(%rdi,%rcx,4)
263	addb	%dl,%bl
264	movl	40(%rsi),%eax
265	movzbl	%bl,%ebx
266	movl	%edx,36(%rsi)
267	addb	%al,%cl
268	pinsrw	$4,(%rdi,%rbx,4),%xmm1
269	movl	(%rdi,%rcx,4),%edx
270	movl	%eax,(%rdi,%rcx,4)
271	addb	%dl,%al
272	movl	44(%rsi),%ebx
273	movzbl	%al,%eax
274	movl	%edx,40(%rsi)
275	addb	%bl,%cl
276	pinsrw	$5,(%rdi,%rax,4),%xmm0
277	movl	(%rdi,%rcx,4),%edx
278	movl	%ebx,(%rdi,%rcx,4)
279	addb	%dl,%bl
280	movl	48(%rsi),%eax
281	movzbl	%bl,%ebx
282	movl	%edx,44(%rsi)
283	addb	%al,%cl
284	pinsrw	$5,(%rdi,%rbx,4),%xmm1
285	movl	(%rdi,%rcx,4),%edx
286	movl	%eax,(%rdi,%rcx,4)
287	addb	%dl,%al
288	movl	52(%rsi),%ebx
289	movzbl	%al,%eax
290	movl	%edx,48(%rsi)
291	addb	%bl,%cl
292	pinsrw	$6,(%rdi,%rax,4),%xmm0
293	movl	(%rdi,%rcx,4),%edx
294	movl	%ebx,(%rdi,%rcx,4)
295	addb	%dl,%bl
296	movl	56(%rsi),%eax
297	movzbl	%bl,%ebx
298	movl	%edx,52(%rsi)
299	addb	%al,%cl
300	pinsrw	$6,(%rdi,%rbx,4),%xmm1
301	movl	(%rdi,%rcx,4),%edx
302	movl	%eax,(%rdi,%rcx,4)
303	addb	%dl,%al
304	movl	60(%rsi),%ebx
305	movzbl	%al,%eax
306	movl	%edx,56(%rsi)
307	addb	%bl,%cl
308	pinsrw	$7,(%rdi,%rax,4),%xmm0
309	addb	$16,%r10b
310	movdqu	(%r12),%xmm2
311	movl	(%rdi,%rcx,4),%edx
312	movl	%ebx,(%rdi,%rcx,4)
313	addb	%dl,%bl
314	movzbl	%bl,%ebx
315	movl	%edx,60(%rsi)
316	leaq	(%rdi,%r10,4),%rsi
317	pinsrw	$7,(%rdi,%rbx,4),%xmm1
318	movl	(%rsi),%eax
319	movq	%rcx,%rbx
320	xorq	%rcx,%rcx
321	subq	$16,%r11
322	movb	%bl,%cl
323	testq	$-16,%r11
324	jnz	.Loop16
325
326	psllq	$8,%xmm1
327	pxor	%xmm0,%xmm2
328	pxor	%xmm1,%xmm2
329	movdqu	%xmm2,(%r13,%r12,1)
330	leaq	16(%r12),%r12
331
332	cmpq	$0,%r11
333	jne	.Lloop1
334	jmp	.Lexit
335
336.align	16
337.Lloop1:
338	addb	%al,%cl
339	movl	(%rdi,%rcx,4),%edx
340	movl	%eax,(%rdi,%rcx,4)
341	movl	%edx,(%rdi,%r10,4)
342	addb	%dl,%al
343	incb	%r10b
344	movl	(%rdi,%rax,4),%edx
345	movl	(%rdi,%r10,4),%eax
346	xorb	(%r12),%dl
347	movb	%dl,(%r13,%r12,1)
348	leaq	1(%r12),%r12
349	decq	%r11
350	jnz	.Lloop1
351	jmp	.Lexit
352
353.align	16
354.LRC4_CHAR:
355	addb	$1,%r10b
356	movzbl	(%rdi,%r10,1),%eax
357	testq	$-8,%r11
358	jz	.Lcloop1
359	jmp	.Lcloop8
360.align	16
361.Lcloop8:
362	movl	(%r12),%r8d
363	movl	4(%r12),%r9d
364	addb	%al,%cl
365	leaq	1(%r10),%rsi
366	movzbl	(%rdi,%rcx,1),%edx
367	movzbl	%sil,%esi
368	movzbl	(%rdi,%rsi,1),%ebx
369	movb	%al,(%rdi,%rcx,1)
370	cmpq	%rsi,%rcx
371	movb	%dl,(%rdi,%r10,1)
372	jne	.Lcmov0
373	movq	%rax,%rbx
374.Lcmov0:
375	addb	%al,%dl
376	xorb	(%rdi,%rdx,1),%r8b
377	rorl	$8,%r8d
378	addb	%bl,%cl
379	leaq	1(%rsi),%r10
380	movzbl	(%rdi,%rcx,1),%edx
381	movzbl	%r10b,%r10d
382	movzbl	(%rdi,%r10,1),%eax
383	movb	%bl,(%rdi,%rcx,1)
384	cmpq	%r10,%rcx
385	movb	%dl,(%rdi,%rsi,1)
386	jne	.Lcmov1
387	movq	%rbx,%rax
388.Lcmov1:
389	addb	%bl,%dl
390	xorb	(%rdi,%rdx,1),%r8b
391	rorl	$8,%r8d
392	addb	%al,%cl
393	leaq	1(%r10),%rsi
394	movzbl	(%rdi,%rcx,1),%edx
395	movzbl	%sil,%esi
396	movzbl	(%rdi,%rsi,1),%ebx
397	movb	%al,(%rdi,%rcx,1)
398	cmpq	%rsi,%rcx
399	movb	%dl,(%rdi,%r10,1)
400	jne	.Lcmov2
401	movq	%rax,%rbx
402.Lcmov2:
403	addb	%al,%dl
404	xorb	(%rdi,%rdx,1),%r8b
405	rorl	$8,%r8d
406	addb	%bl,%cl
407	leaq	1(%rsi),%r10
408	movzbl	(%rdi,%rcx,1),%edx
409	movzbl	%r10b,%r10d
410	movzbl	(%rdi,%r10,1),%eax
411	movb	%bl,(%rdi,%rcx,1)
412	cmpq	%r10,%rcx
413	movb	%dl,(%rdi,%rsi,1)
414	jne	.Lcmov3
415	movq	%rbx,%rax
416.Lcmov3:
417	addb	%bl,%dl
418	xorb	(%rdi,%rdx,1),%r8b
419	rorl	$8,%r8d
420	addb	%al,%cl
421	leaq	1(%r10),%rsi
422	movzbl	(%rdi,%rcx,1),%edx
423	movzbl	%sil,%esi
424	movzbl	(%rdi,%rsi,1),%ebx
425	movb	%al,(%rdi,%rcx,1)
426	cmpq	%rsi,%rcx
427	movb	%dl,(%rdi,%r10,1)
428	jne	.Lcmov4
429	movq	%rax,%rbx
430.Lcmov4:
431	addb	%al,%dl
432	xorb	(%rdi,%rdx,1),%r9b
433	rorl	$8,%r9d
434	addb	%bl,%cl
435	leaq	1(%rsi),%r10
436	movzbl	(%rdi,%rcx,1),%edx
437	movzbl	%r10b,%r10d
438	movzbl	(%rdi,%r10,1),%eax
439	movb	%bl,(%rdi,%rcx,1)
440	cmpq	%r10,%rcx
441	movb	%dl,(%rdi,%rsi,1)
442	jne	.Lcmov5
443	movq	%rbx,%rax
444.Lcmov5:
445	addb	%bl,%dl
446	xorb	(%rdi,%rdx,1),%r9b
447	rorl	$8,%r9d
448	addb	%al,%cl
449	leaq	1(%r10),%rsi
450	movzbl	(%rdi,%rcx,1),%edx
451	movzbl	%sil,%esi
452	movzbl	(%rdi,%rsi,1),%ebx
453	movb	%al,(%rdi,%rcx,1)
454	cmpq	%rsi,%rcx
455	movb	%dl,(%rdi,%r10,1)
456	jne	.Lcmov6
457	movq	%rax,%rbx
458.Lcmov6:
459	addb	%al,%dl
460	xorb	(%rdi,%rdx,1),%r9b
461	rorl	$8,%r9d
462	addb	%bl,%cl
463	leaq	1(%rsi),%r10
464	movzbl	(%rdi,%rcx,1),%edx
465	movzbl	%r10b,%r10d
466	movzbl	(%rdi,%r10,1),%eax
467	movb	%bl,(%rdi,%rcx,1)
468	cmpq	%r10,%rcx
469	movb	%dl,(%rdi,%rsi,1)
470	jne	.Lcmov7
471	movq	%rbx,%rax
472.Lcmov7:
473	addb	%bl,%dl
474	xorb	(%rdi,%rdx,1),%r9b
475	rorl	$8,%r9d
476	leaq	-8(%r11),%r11
477	movl	%r8d,(%r13)
478	leaq	8(%r12),%r12
479	movl	%r9d,4(%r13)
480	leaq	8(%r13),%r13
481
482	testq	$-8,%r11
483	jnz	.Lcloop8
484	cmpq	$0,%r11
485	jne	.Lcloop1
486	jmp	.Lexit
487.align	16
488.Lcloop1:
489	addb	%al,%cl
490	movzbl	%cl,%ecx
491	movzbl	(%rdi,%rcx,1),%edx
492	movb	%al,(%rdi,%rcx,1)
493	movb	%dl,(%rdi,%r10,1)
494	addb	%al,%dl
495	addb	$1,%r10b
496	movzbl	%dl,%edx
497	movzbl	%r10b,%r10d
498	movzbl	(%rdi,%rdx,1),%edx
499	movzbl	(%rdi,%r10,1),%eax
500	xorb	(%r12),%dl
501	leaq	1(%r12),%r12
502	movb	%dl,(%r13)
503	leaq	1(%r13),%r13
504	subq	$1,%r11
505	jnz	.Lcloop1
506	jmp	.Lexit
507
508.align	16
509.Lexit:
510	subb	$1,%r10b
511	movl	%r10d,-8(%rdi)
512	movl	%ecx,-4(%rdi)
513
514	movq	(%rsp),%r13
515	movq	8(%rsp),%r12
516	movq	16(%rsp),%rbx
517	addq	$24,%rsp
518.Lepilogue:
519	.byte	0xf3,0xc3
520.size	RC4,.-RC4
521.globl	private_RC4_set_key
522.type	private_RC4_set_key,@function
523.align	16
524private_RC4_set_key:
525	leaq	8(%rdi),%rdi
526	leaq	(%rdx,%rsi,1),%rdx
527	negq	%rsi
528	movq	%rsi,%rcx
529	xorl	%eax,%eax
530	xorq	%r9,%r9
531	xorq	%r10,%r10
532	xorq	%r11,%r11
533
534	movl	OPENSSL_ia32cap_P(%rip),%r8d
535	btl	$20,%r8d
536	jc	.Lc1stloop
537	jmp	.Lw1stloop
538
539.align	16
540.Lw1stloop:
541	movl	%eax,(%rdi,%rax,4)
542	addb	$1,%al
543	jnc	.Lw1stloop
544
545	xorq	%r9,%r9
546	xorq	%r8,%r8
547.align	16
548.Lw2ndloop:
549	movl	(%rdi,%r9,4),%r10d
550	addb	(%rdx,%rsi,1),%r8b
551	addb	%r10b,%r8b
552	addq	$1,%rsi
553	movl	(%rdi,%r8,4),%r11d
554	cmovzq	%rcx,%rsi
555	movl	%r10d,(%rdi,%r8,4)
556	movl	%r11d,(%rdi,%r9,4)
557	addb	$1,%r9b
558	jnc	.Lw2ndloop
559	jmp	.Lexit_key
560
561.align	16
562.Lc1stloop:
563	movb	%al,(%rdi,%rax,1)
564	addb	$1,%al
565	jnc	.Lc1stloop
566
567	xorq	%r9,%r9
568	xorq	%r8,%r8
569.align	16
570.Lc2ndloop:
571	movb	(%rdi,%r9,1),%r10b
572	addb	(%rdx,%rsi,1),%r8b
573	addb	%r10b,%r8b
574	addq	$1,%rsi
575	movb	(%rdi,%r8,1),%r11b
576	jnz	.Lcnowrap
577	movq	%rcx,%rsi
578.Lcnowrap:
579	movb	%r10b,(%rdi,%r8,1)
580	movb	%r11b,(%rdi,%r9,1)
581	addb	$1,%r9b
582	jnc	.Lc2ndloop
583	movl	$-1,256(%rdi)
584
585.align	16
586.Lexit_key:
587	xorl	%eax,%eax
588	movl	%eax,-8(%rdi)
589	movl	%eax,-4(%rdi)
590	.byte	0xf3,0xc3
591.size	private_RC4_set_key,.-private_RC4_set_key
592
593.globl	RC4_options
594.type	RC4_options,@function
595.align	16
596RC4_options:
597	leaq	.Lopts(%rip),%rax
598	movl	OPENSSL_ia32cap_P(%rip),%edx
599	btl	$20,%edx
600	jc	.L8xchar
601	btl	$30,%edx
602	jnc	.Ldone
603	addq	$25,%rax
604	.byte	0xf3,0xc3
605.L8xchar:
606	addq	$12,%rax
607.Ldone:
608	.byte	0xf3,0xc3
609.align	64
610.Lopts:
611.byte	114,99,52,40,56,120,44,105,110,116,41,0
612.byte	114,99,52,40,56,120,44,99,104,97,114,41,0
613.byte	114,99,52,40,49,54,120,44,105,110,116,41,0
614.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
615.align	64
616.size	RC4_options,.-RC4_options
617