xref: /netbsd-src/crypto/external/bsd/openssl.old/lib/libcrypto/arch/i386/chacha-x86.S (revision 4724848cf0da353df257f730694b7882798e5daf)
1*4724848cSchristos#include <machine/asm.h>
2*4724848cSchristos.text
3*4724848cSchristos.globl	ChaCha20_ctr32
4*4724848cSchristos.type	ChaCha20_ctr32,@function
5*4724848cSchristos.align	16
6*4724848cSchristosChaCha20_ctr32:
7*4724848cSchristos.L_ChaCha20_ctr32_begin:
8*4724848cSchristos	pushl	%ebp
9*4724848cSchristos	pushl	%ebx
10*4724848cSchristos	pushl	%esi
11*4724848cSchristos	pushl	%edi
12*4724848cSchristos	xorl	%eax,%eax
13*4724848cSchristos	cmpl	28(%esp),%eax
14*4724848cSchristos	je	.L000no_data
15*4724848cSchristos	call	.Lpic_point
16*4724848cSchristos.Lpic_point:
17*4724848cSchristos	popl	%eax
18*4724848cSchristos	leal	OPENSSL_ia32cap_P-.Lpic_point(%eax),%ebp
19*4724848cSchristos	testl	$16777216,(%ebp)
20*4724848cSchristos	jz	.L001x86
21*4724848cSchristos	testl	$512,4(%ebp)
22*4724848cSchristos	jz	.L001x86
23*4724848cSchristos	jmp	.Lssse3_shortcut
24*4724848cSchristos.L001x86:
25*4724848cSchristos	movl	32(%esp),%esi
26*4724848cSchristos	movl	36(%esp),%edi
27*4724848cSchristos	subl	$132,%esp
28*4724848cSchristos	movl	(%esi),%eax
29*4724848cSchristos	movl	4(%esi),%ebx
30*4724848cSchristos	movl	8(%esi),%ecx
31*4724848cSchristos	movl	12(%esi),%edx
32*4724848cSchristos	movl	%eax,80(%esp)
33*4724848cSchristos	movl	%ebx,84(%esp)
34*4724848cSchristos	movl	%ecx,88(%esp)
35*4724848cSchristos	movl	%edx,92(%esp)
36*4724848cSchristos	movl	16(%esi),%eax
37*4724848cSchristos	movl	20(%esi),%ebx
38*4724848cSchristos	movl	24(%esi),%ecx
39*4724848cSchristos	movl	28(%esi),%edx
40*4724848cSchristos	movl	%eax,96(%esp)
41*4724848cSchristos	movl	%ebx,100(%esp)
42*4724848cSchristos	movl	%ecx,104(%esp)
43*4724848cSchristos	movl	%edx,108(%esp)
44*4724848cSchristos	movl	(%edi),%eax
45*4724848cSchristos	movl	4(%edi),%ebx
46*4724848cSchristos	movl	8(%edi),%ecx
47*4724848cSchristos	movl	12(%edi),%edx
48*4724848cSchristos	subl	$1,%eax
49*4724848cSchristos	movl	%eax,112(%esp)
50*4724848cSchristos	movl	%ebx,116(%esp)
51*4724848cSchristos	movl	%ecx,120(%esp)
52*4724848cSchristos	movl	%edx,124(%esp)
53*4724848cSchristos	jmp	.L002entry
54*4724848cSchristos.align	16
55*4724848cSchristos.L003outer_loop:
56*4724848cSchristos	movl	%ebx,156(%esp)
57*4724848cSchristos	movl	%eax,152(%esp)
58*4724848cSchristos	movl	%ecx,160(%esp)
59*4724848cSchristos.L002entry:
60*4724848cSchristos	movl	$1634760805,%eax
61*4724848cSchristos	movl	$857760878,4(%esp)
62*4724848cSchristos	movl	$2036477234,8(%esp)
63*4724848cSchristos	movl	$1797285236,12(%esp)
64*4724848cSchristos	movl	84(%esp),%ebx
65*4724848cSchristos	movl	88(%esp),%ebp
66*4724848cSchristos	movl	104(%esp),%ecx
67*4724848cSchristos	movl	108(%esp),%esi
68*4724848cSchristos	movl	116(%esp),%edx
69*4724848cSchristos	movl	120(%esp),%edi
70*4724848cSchristos	movl	%ebx,20(%esp)
71*4724848cSchristos	movl	%ebp,24(%esp)
72*4724848cSchristos	movl	%ecx,40(%esp)
73*4724848cSchristos	movl	%esi,44(%esp)
74*4724848cSchristos	movl	%edx,52(%esp)
75*4724848cSchristos	movl	%edi,56(%esp)
76*4724848cSchristos	movl	92(%esp),%ebx
77*4724848cSchristos	movl	124(%esp),%edi
78*4724848cSchristos	movl	112(%esp),%edx
79*4724848cSchristos	movl	80(%esp),%ebp
80*4724848cSchristos	movl	96(%esp),%ecx
81*4724848cSchristos	movl	100(%esp),%esi
82*4724848cSchristos	addl	$1,%edx
83*4724848cSchristos	movl	%ebx,28(%esp)
84*4724848cSchristos	movl	%edi,60(%esp)
85*4724848cSchristos	movl	%edx,112(%esp)
86*4724848cSchristos	movl	$10,%ebx
87*4724848cSchristos	jmp	.L004loop
88*4724848cSchristos.align	16
89*4724848cSchristos.L004loop:
90*4724848cSchristos	addl	%ebp,%eax
91*4724848cSchristos	movl	%ebx,128(%esp)
92*4724848cSchristos	movl	%ebp,%ebx
93*4724848cSchristos	xorl	%eax,%edx
94*4724848cSchristos	roll	$16,%edx
95*4724848cSchristos	addl	%edx,%ecx
96*4724848cSchristos	xorl	%ecx,%ebx
97*4724848cSchristos	movl	52(%esp),%edi
98*4724848cSchristos	roll	$12,%ebx
99*4724848cSchristos	movl	20(%esp),%ebp
100*4724848cSchristos	addl	%ebx,%eax
101*4724848cSchristos	xorl	%eax,%edx
102*4724848cSchristos	movl	%eax,(%esp)
103*4724848cSchristos	roll	$8,%edx
104*4724848cSchristos	movl	4(%esp),%eax
105*4724848cSchristos	addl	%edx,%ecx
106*4724848cSchristos	movl	%edx,48(%esp)
107*4724848cSchristos	xorl	%ecx,%ebx
108*4724848cSchristos	addl	%ebp,%eax
109*4724848cSchristos	roll	$7,%ebx
110*4724848cSchristos	xorl	%eax,%edi
111*4724848cSchristos	movl	%ecx,32(%esp)
112*4724848cSchristos	roll	$16,%edi
113*4724848cSchristos	movl	%ebx,16(%esp)
114*4724848cSchristos	addl	%edi,%esi
115*4724848cSchristos	movl	40(%esp),%ecx
116*4724848cSchristos	xorl	%esi,%ebp
117*4724848cSchristos	movl	56(%esp),%edx
118*4724848cSchristos	roll	$12,%ebp
119*4724848cSchristos	movl	24(%esp),%ebx
120*4724848cSchristos	addl	%ebp,%eax
121*4724848cSchristos	xorl	%eax,%edi
122*4724848cSchristos	movl	%eax,4(%esp)
123*4724848cSchristos	roll	$8,%edi
124*4724848cSchristos	movl	8(%esp),%eax
125*4724848cSchristos	addl	%edi,%esi
126*4724848cSchristos	movl	%edi,52(%esp)
127*4724848cSchristos	xorl	%esi,%ebp
128*4724848cSchristos	addl	%ebx,%eax
129*4724848cSchristos	roll	$7,%ebp
130*4724848cSchristos	xorl	%eax,%edx
131*4724848cSchristos	movl	%esi,36(%esp)
132*4724848cSchristos	roll	$16,%edx
133*4724848cSchristos	movl	%ebp,20(%esp)
134*4724848cSchristos	addl	%edx,%ecx
135*4724848cSchristos	movl	44(%esp),%esi
136*4724848cSchristos	xorl	%ecx,%ebx
137*4724848cSchristos	movl	60(%esp),%edi
138*4724848cSchristos	roll	$12,%ebx
139*4724848cSchristos	movl	28(%esp),%ebp
140*4724848cSchristos	addl	%ebx,%eax
141*4724848cSchristos	xorl	%eax,%edx
142*4724848cSchristos	movl	%eax,8(%esp)
143*4724848cSchristos	roll	$8,%edx
144*4724848cSchristos	movl	12(%esp),%eax
145*4724848cSchristos	addl	%edx,%ecx
146*4724848cSchristos	movl	%edx,56(%esp)
147*4724848cSchristos	xorl	%ecx,%ebx
148*4724848cSchristos	addl	%ebp,%eax
149*4724848cSchristos	roll	$7,%ebx
150*4724848cSchristos	xorl	%eax,%edi
151*4724848cSchristos	roll	$16,%edi
152*4724848cSchristos	movl	%ebx,24(%esp)
153*4724848cSchristos	addl	%edi,%esi
154*4724848cSchristos	xorl	%esi,%ebp
155*4724848cSchristos	roll	$12,%ebp
156*4724848cSchristos	movl	20(%esp),%ebx
157*4724848cSchristos	addl	%ebp,%eax
158*4724848cSchristos	xorl	%eax,%edi
159*4724848cSchristos	movl	%eax,12(%esp)
160*4724848cSchristos	roll	$8,%edi
161*4724848cSchristos	movl	(%esp),%eax
162*4724848cSchristos	addl	%edi,%esi
163*4724848cSchristos	movl	%edi,%edx
164*4724848cSchristos	xorl	%esi,%ebp
165*4724848cSchristos	addl	%ebx,%eax
166*4724848cSchristos	roll	$7,%ebp
167*4724848cSchristos	xorl	%eax,%edx
168*4724848cSchristos	roll	$16,%edx
169*4724848cSchristos	movl	%ebp,28(%esp)
170*4724848cSchristos	addl	%edx,%ecx
171*4724848cSchristos	xorl	%ecx,%ebx
172*4724848cSchristos	movl	48(%esp),%edi
173*4724848cSchristos	roll	$12,%ebx
174*4724848cSchristos	movl	24(%esp),%ebp
175*4724848cSchristos	addl	%ebx,%eax
176*4724848cSchristos	xorl	%eax,%edx
177*4724848cSchristos	movl	%eax,(%esp)
178*4724848cSchristos	roll	$8,%edx
179*4724848cSchristos	movl	4(%esp),%eax
180*4724848cSchristos	addl	%edx,%ecx
181*4724848cSchristos	movl	%edx,60(%esp)
182*4724848cSchristos	xorl	%ecx,%ebx
183*4724848cSchristos	addl	%ebp,%eax
184*4724848cSchristos	roll	$7,%ebx
185*4724848cSchristos	xorl	%eax,%edi
186*4724848cSchristos	movl	%ecx,40(%esp)
187*4724848cSchristos	roll	$16,%edi
188*4724848cSchristos	movl	%ebx,20(%esp)
189*4724848cSchristos	addl	%edi,%esi
190*4724848cSchristos	movl	32(%esp),%ecx
191*4724848cSchristos	xorl	%esi,%ebp
192*4724848cSchristos	movl	52(%esp),%edx
193*4724848cSchristos	roll	$12,%ebp
194*4724848cSchristos	movl	28(%esp),%ebx
195*4724848cSchristos	addl	%ebp,%eax
196*4724848cSchristos	xorl	%eax,%edi
197*4724848cSchristos	movl	%eax,4(%esp)
198*4724848cSchristos	roll	$8,%edi
199*4724848cSchristos	movl	8(%esp),%eax
200*4724848cSchristos	addl	%edi,%esi
201*4724848cSchristos	movl	%edi,48(%esp)
202*4724848cSchristos	xorl	%esi,%ebp
203*4724848cSchristos	addl	%ebx,%eax
204*4724848cSchristos	roll	$7,%ebp
205*4724848cSchristos	xorl	%eax,%edx
206*4724848cSchristos	movl	%esi,44(%esp)
207*4724848cSchristos	roll	$16,%edx
208*4724848cSchristos	movl	%ebp,24(%esp)
209*4724848cSchristos	addl	%edx,%ecx
210*4724848cSchristos	movl	36(%esp),%esi
211*4724848cSchristos	xorl	%ecx,%ebx
212*4724848cSchristos	movl	56(%esp),%edi
213*4724848cSchristos	roll	$12,%ebx
214*4724848cSchristos	movl	16(%esp),%ebp
215*4724848cSchristos	addl	%ebx,%eax
216*4724848cSchristos	xorl	%eax,%edx
217*4724848cSchristos	movl	%eax,8(%esp)
218*4724848cSchristos	roll	$8,%edx
219*4724848cSchristos	movl	12(%esp),%eax
220*4724848cSchristos	addl	%edx,%ecx
221*4724848cSchristos	movl	%edx,52(%esp)
222*4724848cSchristos	xorl	%ecx,%ebx
223*4724848cSchristos	addl	%ebp,%eax
224*4724848cSchristos	roll	$7,%ebx
225*4724848cSchristos	xorl	%eax,%edi
226*4724848cSchristos	roll	$16,%edi
227*4724848cSchristos	movl	%ebx,28(%esp)
228*4724848cSchristos	addl	%edi,%esi
229*4724848cSchristos	xorl	%esi,%ebp
230*4724848cSchristos	movl	48(%esp),%edx
231*4724848cSchristos	roll	$12,%ebp
232*4724848cSchristos	movl	128(%esp),%ebx
233*4724848cSchristos	addl	%ebp,%eax
234*4724848cSchristos	xorl	%eax,%edi
235*4724848cSchristos	movl	%eax,12(%esp)
236*4724848cSchristos	roll	$8,%edi
237*4724848cSchristos	movl	(%esp),%eax
238*4724848cSchristos	addl	%edi,%esi
239*4724848cSchristos	movl	%edi,56(%esp)
240*4724848cSchristos	xorl	%esi,%ebp
241*4724848cSchristos	roll	$7,%ebp
242*4724848cSchristos	decl	%ebx
243*4724848cSchristos	jnz	.L004loop
244*4724848cSchristos	movl	160(%esp),%ebx
245*4724848cSchristos	addl	$1634760805,%eax
246*4724848cSchristos	addl	80(%esp),%ebp
247*4724848cSchristos	addl	96(%esp),%ecx
248*4724848cSchristos	addl	100(%esp),%esi
249*4724848cSchristos	cmpl	$64,%ebx
250*4724848cSchristos	jb	.L005tail
251*4724848cSchristos	movl	156(%esp),%ebx
252*4724848cSchristos	addl	112(%esp),%edx
253*4724848cSchristos	addl	120(%esp),%edi
254*4724848cSchristos	xorl	(%ebx),%eax
255*4724848cSchristos	xorl	16(%ebx),%ebp
256*4724848cSchristos	movl	%eax,(%esp)
257*4724848cSchristos	movl	152(%esp),%eax
258*4724848cSchristos	xorl	32(%ebx),%ecx
259*4724848cSchristos	xorl	36(%ebx),%esi
260*4724848cSchristos	xorl	48(%ebx),%edx
261*4724848cSchristos	xorl	56(%ebx),%edi
262*4724848cSchristos	movl	%ebp,16(%eax)
263*4724848cSchristos	movl	%ecx,32(%eax)
264*4724848cSchristos	movl	%esi,36(%eax)
265*4724848cSchristos	movl	%edx,48(%eax)
266*4724848cSchristos	movl	%edi,56(%eax)
267*4724848cSchristos	movl	4(%esp),%ebp
268*4724848cSchristos	movl	8(%esp),%ecx
269*4724848cSchristos	movl	12(%esp),%esi
270*4724848cSchristos	movl	20(%esp),%edx
271*4724848cSchristos	movl	24(%esp),%edi
272*4724848cSchristos	addl	$857760878,%ebp
273*4724848cSchristos	addl	$2036477234,%ecx
274*4724848cSchristos	addl	$1797285236,%esi
275*4724848cSchristos	addl	84(%esp),%edx
276*4724848cSchristos	addl	88(%esp),%edi
277*4724848cSchristos	xorl	4(%ebx),%ebp
278*4724848cSchristos	xorl	8(%ebx),%ecx
279*4724848cSchristos	xorl	12(%ebx),%esi
280*4724848cSchristos	xorl	20(%ebx),%edx
281*4724848cSchristos	xorl	24(%ebx),%edi
282*4724848cSchristos	movl	%ebp,4(%eax)
283*4724848cSchristos	movl	%ecx,8(%eax)
284*4724848cSchristos	movl	%esi,12(%eax)
285*4724848cSchristos	movl	%edx,20(%eax)
286*4724848cSchristos	movl	%edi,24(%eax)
287*4724848cSchristos	movl	28(%esp),%ebp
288*4724848cSchristos	movl	40(%esp),%ecx
289*4724848cSchristos	movl	44(%esp),%esi
290*4724848cSchristos	movl	52(%esp),%edx
291*4724848cSchristos	movl	60(%esp),%edi
292*4724848cSchristos	addl	92(%esp),%ebp
293*4724848cSchristos	addl	104(%esp),%ecx
294*4724848cSchristos	addl	108(%esp),%esi
295*4724848cSchristos	addl	116(%esp),%edx
296*4724848cSchristos	addl	124(%esp),%edi
297*4724848cSchristos	xorl	28(%ebx),%ebp
298*4724848cSchristos	xorl	40(%ebx),%ecx
299*4724848cSchristos	xorl	44(%ebx),%esi
300*4724848cSchristos	xorl	52(%ebx),%edx
301*4724848cSchristos	xorl	60(%ebx),%edi
302*4724848cSchristos	leal	64(%ebx),%ebx
303*4724848cSchristos	movl	%ebp,28(%eax)
304*4724848cSchristos	movl	(%esp),%ebp
305*4724848cSchristos	movl	%ecx,40(%eax)
306*4724848cSchristos	movl	160(%esp),%ecx
307*4724848cSchristos	movl	%esi,44(%eax)
308*4724848cSchristos	movl	%edx,52(%eax)
309*4724848cSchristos	movl	%edi,60(%eax)
310*4724848cSchristos	movl	%ebp,(%eax)
311*4724848cSchristos	leal	64(%eax),%eax
312*4724848cSchristos	subl	$64,%ecx
313*4724848cSchristos	jnz	.L003outer_loop
314*4724848cSchristos	jmp	.L006done
315*4724848cSchristos.L005tail:
316*4724848cSchristos	addl	112(%esp),%edx
317*4724848cSchristos	addl	120(%esp),%edi
318*4724848cSchristos	movl	%eax,(%esp)
319*4724848cSchristos	movl	%ebp,16(%esp)
320*4724848cSchristos	movl	%ecx,32(%esp)
321*4724848cSchristos	movl	%esi,36(%esp)
322*4724848cSchristos	movl	%edx,48(%esp)
323*4724848cSchristos	movl	%edi,56(%esp)
324*4724848cSchristos	movl	4(%esp),%ebp
325*4724848cSchristos	movl	8(%esp),%ecx
326*4724848cSchristos	movl	12(%esp),%esi
327*4724848cSchristos	movl	20(%esp),%edx
328*4724848cSchristos	movl	24(%esp),%edi
329*4724848cSchristos	addl	$857760878,%ebp
330*4724848cSchristos	addl	$2036477234,%ecx
331*4724848cSchristos	addl	$1797285236,%esi
332*4724848cSchristos	addl	84(%esp),%edx
333*4724848cSchristos	addl	88(%esp),%edi
334*4724848cSchristos	movl	%ebp,4(%esp)
335*4724848cSchristos	movl	%ecx,8(%esp)
336*4724848cSchristos	movl	%esi,12(%esp)
337*4724848cSchristos	movl	%edx,20(%esp)
338*4724848cSchristos	movl	%edi,24(%esp)
339*4724848cSchristos	movl	28(%esp),%ebp
340*4724848cSchristos	movl	40(%esp),%ecx
341*4724848cSchristos	movl	44(%esp),%esi
342*4724848cSchristos	movl	52(%esp),%edx
343*4724848cSchristos	movl	60(%esp),%edi
344*4724848cSchristos	addl	92(%esp),%ebp
345*4724848cSchristos	addl	104(%esp),%ecx
346*4724848cSchristos	addl	108(%esp),%esi
347*4724848cSchristos	addl	116(%esp),%edx
348*4724848cSchristos	addl	124(%esp),%edi
349*4724848cSchristos	movl	%ebp,28(%esp)
350*4724848cSchristos	movl	156(%esp),%ebp
351*4724848cSchristos	movl	%ecx,40(%esp)
352*4724848cSchristos	movl	152(%esp),%ecx
353*4724848cSchristos	movl	%esi,44(%esp)
354*4724848cSchristos	xorl	%esi,%esi
355*4724848cSchristos	movl	%edx,52(%esp)
356*4724848cSchristos	movl	%edi,60(%esp)
357*4724848cSchristos	xorl	%eax,%eax
358*4724848cSchristos	xorl	%edx,%edx
359*4724848cSchristos.L007tail_loop:
360*4724848cSchristos	movb	(%esi,%ebp,1),%al
361*4724848cSchristos	movb	(%esp,%esi,1),%dl
362*4724848cSchristos	leal	1(%esi),%esi
363*4724848cSchristos	xorb	%dl,%al
364*4724848cSchristos	movb	%al,-1(%ecx,%esi,1)
365*4724848cSchristos	decl	%ebx
366*4724848cSchristos	jnz	.L007tail_loop
367*4724848cSchristos.L006done:
368*4724848cSchristos	addl	$132,%esp
369*4724848cSchristos.L000no_data:
370*4724848cSchristos	popl	%edi
371*4724848cSchristos	popl	%esi
372*4724848cSchristos	popl	%ebx
373*4724848cSchristos	popl	%ebp
374*4724848cSchristos	ret
375*4724848cSchristos.size	ChaCha20_ctr32,.-.L_ChaCha20_ctr32_begin
376*4724848cSchristos.globl	ChaCha20_ssse3
377*4724848cSchristos.type	ChaCha20_ssse3,@function
378*4724848cSchristos.align	16
379*4724848cSchristosChaCha20_ssse3:
380*4724848cSchristos.L_ChaCha20_ssse3_begin:
381*4724848cSchristos	pushl	%ebp
382*4724848cSchristos	pushl	%ebx
383*4724848cSchristos	pushl	%esi
384*4724848cSchristos	pushl	%edi
385*4724848cSchristos.Lssse3_shortcut:
386*4724848cSchristos	movl	20(%esp),%edi
387*4724848cSchristos	movl	24(%esp),%esi
388*4724848cSchristos	movl	28(%esp),%ecx
389*4724848cSchristos	movl	32(%esp),%edx
390*4724848cSchristos	movl	36(%esp),%ebx
391*4724848cSchristos	movl	%esp,%ebp
392*4724848cSchristos	subl	$524,%esp
393*4724848cSchristos	andl	$-64,%esp
394*4724848cSchristos	movl	%ebp,512(%esp)
395*4724848cSchristos	leal	.Lssse3_data-.Lpic_point(%eax),%eax
396*4724848cSchristos	movdqu	(%ebx),%xmm3
397*4724848cSchristos.L0081x:
398*4724848cSchristos	movdqa	32(%eax),%xmm0
399*4724848cSchristos	movdqu	(%edx),%xmm1
400*4724848cSchristos	movdqu	16(%edx),%xmm2
401*4724848cSchristos	movdqa	(%eax),%xmm6
402*4724848cSchristos	movdqa	16(%eax),%xmm7
403*4724848cSchristos	movl	%ebp,48(%esp)
404*4724848cSchristos	movdqa	%xmm0,(%esp)
405*4724848cSchristos	movdqa	%xmm1,16(%esp)
406*4724848cSchristos	movdqa	%xmm2,32(%esp)
407*4724848cSchristos	movdqa	%xmm3,48(%esp)
408*4724848cSchristos	movl	$10,%edx
409*4724848cSchristos	jmp	.L009loop1x
410*4724848cSchristos.align	16
411*4724848cSchristos.L010outer1x:
412*4724848cSchristos	movdqa	80(%eax),%xmm3
413*4724848cSchristos	movdqa	(%esp),%xmm0
414*4724848cSchristos	movdqa	16(%esp),%xmm1
415*4724848cSchristos	movdqa	32(%esp),%xmm2
416*4724848cSchristos	paddd	48(%esp),%xmm3
417*4724848cSchristos	movl	$10,%edx
418*4724848cSchristos	movdqa	%xmm3,48(%esp)
419*4724848cSchristos	jmp	.L009loop1x
420*4724848cSchristos.align	16
421*4724848cSchristos.L009loop1x:
422*4724848cSchristos	paddd	%xmm1,%xmm0
423*4724848cSchristos	pxor	%xmm0,%xmm3
424*4724848cSchristos.byte	102,15,56,0,222
425*4724848cSchristos	paddd	%xmm3,%xmm2
426*4724848cSchristos	pxor	%xmm2,%xmm1
427*4724848cSchristos	movdqa	%xmm1,%xmm4
428*4724848cSchristos	psrld	$20,%xmm1
429*4724848cSchristos	pslld	$12,%xmm4
430*4724848cSchristos	por	%xmm4,%xmm1
431*4724848cSchristos	paddd	%xmm1,%xmm0
432*4724848cSchristos	pxor	%xmm0,%xmm3
433*4724848cSchristos.byte	102,15,56,0,223
434*4724848cSchristos	paddd	%xmm3,%xmm2
435*4724848cSchristos	pxor	%xmm2,%xmm1
436*4724848cSchristos	movdqa	%xmm1,%xmm4
437*4724848cSchristos	psrld	$25,%xmm1
438*4724848cSchristos	pslld	$7,%xmm4
439*4724848cSchristos	por	%xmm4,%xmm1
440*4724848cSchristos	pshufd	$78,%xmm2,%xmm2
441*4724848cSchristos	pshufd	$57,%xmm1,%xmm1
442*4724848cSchristos	pshufd	$147,%xmm3,%xmm3
443*4724848cSchristos	nop
444*4724848cSchristos	paddd	%xmm1,%xmm0
445*4724848cSchristos	pxor	%xmm0,%xmm3
446*4724848cSchristos.byte	102,15,56,0,222
447*4724848cSchristos	paddd	%xmm3,%xmm2
448*4724848cSchristos	pxor	%xmm2,%xmm1
449*4724848cSchristos	movdqa	%xmm1,%xmm4
450*4724848cSchristos	psrld	$20,%xmm1
451*4724848cSchristos	pslld	$12,%xmm4
452*4724848cSchristos	por	%xmm4,%xmm1
453*4724848cSchristos	paddd	%xmm1,%xmm0
454*4724848cSchristos	pxor	%xmm0,%xmm3
455*4724848cSchristos.byte	102,15,56,0,223
456*4724848cSchristos	paddd	%xmm3,%xmm2
457*4724848cSchristos	pxor	%xmm2,%xmm1
458*4724848cSchristos	movdqa	%xmm1,%xmm4
459*4724848cSchristos	psrld	$25,%xmm1
460*4724848cSchristos	pslld	$7,%xmm4
461*4724848cSchristos	por	%xmm4,%xmm1
462*4724848cSchristos	pshufd	$78,%xmm2,%xmm2
463*4724848cSchristos	pshufd	$147,%xmm1,%xmm1
464*4724848cSchristos	pshufd	$57,%xmm3,%xmm3
465*4724848cSchristos	decl	%edx
466*4724848cSchristos	jnz	.L009loop1x
467*4724848cSchristos	paddd	(%esp),%xmm0
468*4724848cSchristos	paddd	16(%esp),%xmm1
469*4724848cSchristos	paddd	32(%esp),%xmm2
470*4724848cSchristos	paddd	48(%esp),%xmm3
471*4724848cSchristos	cmpl	$64,%ecx
472*4724848cSchristos	jb	.L011tail
473*4724848cSchristos	movdqu	(%esi),%xmm4
474*4724848cSchristos	movdqu	16(%esi),%xmm5
475*4724848cSchristos	pxor	%xmm4,%xmm0
476*4724848cSchristos	movdqu	32(%esi),%xmm4
477*4724848cSchristos	pxor	%xmm5,%xmm1
478*4724848cSchristos	movdqu	48(%esi),%xmm5
479*4724848cSchristos	pxor	%xmm4,%xmm2
480*4724848cSchristos	pxor	%xmm5,%xmm3
481*4724848cSchristos	leal	64(%esi),%esi
482*4724848cSchristos	movdqu	%xmm0,(%edi)
483*4724848cSchristos	movdqu	%xmm1,16(%edi)
484*4724848cSchristos	movdqu	%xmm2,32(%edi)
485*4724848cSchristos	movdqu	%xmm3,48(%edi)
486*4724848cSchristos	leal	64(%edi),%edi
487*4724848cSchristos	subl	$64,%ecx
488*4724848cSchristos	jnz	.L010outer1x
489*4724848cSchristos	jmp	.L012done
490*4724848cSchristos.L011tail:
491*4724848cSchristos	movdqa	%xmm0,(%esp)
492*4724848cSchristos	movdqa	%xmm1,16(%esp)
493*4724848cSchristos	movdqa	%xmm2,32(%esp)
494*4724848cSchristos	movdqa	%xmm3,48(%esp)
495*4724848cSchristos	xorl	%eax,%eax
496*4724848cSchristos	xorl	%edx,%edx
497*4724848cSchristos	xorl	%ebp,%ebp
498*4724848cSchristos.L013tail_loop:
499*4724848cSchristos	movb	(%esp,%ebp,1),%al
500*4724848cSchristos	movb	(%esi,%ebp,1),%dl
501*4724848cSchristos	leal	1(%ebp),%ebp
502*4724848cSchristos	xorb	%dl,%al
503*4724848cSchristos	movb	%al,-1(%edi,%ebp,1)
504*4724848cSchristos	decl	%ecx
505*4724848cSchristos	jnz	.L013tail_loop
506*4724848cSchristos.L012done:
507*4724848cSchristos	movl	512(%esp),%esp
508*4724848cSchristos	popl	%edi
509*4724848cSchristos	popl	%esi
510*4724848cSchristos	popl	%ebx
511*4724848cSchristos	popl	%ebp
512*4724848cSchristos	ret
513*4724848cSchristos.size	ChaCha20_ssse3,.-.L_ChaCha20_ssse3_begin
514*4724848cSchristos.align	64
515*4724848cSchristos.Lssse3_data:
516*4724848cSchristos.byte	2,3,0,1,6,7,4,5,10,11,8,9,14,15,12,13
517*4724848cSchristos.byte	3,0,1,2,7,4,5,6,11,8,9,10,15,12,13,14
518*4724848cSchristos.long	1634760805,857760878,2036477234,1797285236
519*4724848cSchristos.long	0,1,2,3
520*4724848cSchristos.long	4,4,4,4
521*4724848cSchristos.long	1,0,0,0
522*4724848cSchristos.long	4,0,0,0
523*4724848cSchristos.long	0,-1,-1,-1
524*4724848cSchristos.align	64
525*4724848cSchristos.byte	67,104,97,67,104,97,50,48,32,102,111,114,32,120,56,54
526*4724848cSchristos.byte	44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32
527*4724848cSchristos.byte	60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111
528*4724848cSchristos.byte	114,103,62,0
529*4724848cSchristos.comm	OPENSSL_ia32cap_P,16,4
530