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