1// Copyright 2012 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5// +build amd64,!appengine,!gccgo
6
7// This code was translated into a form compatible with 6a from the public
8// domain sources in SUPERCOP: https://bench.cr.yp.to/supercop.html
9
10// func salsa2020XORKeyStream(out, in *byte, n uint64, nonce, key *byte)
11// This needs up to 64 bytes at 360(SP); hence the non-obvious frame size.
12TEXT ·salsa2020XORKeyStream(SB),0,$456-40 // frame = 424 + 32 byte alignment
13	MOVQ out+0(FP),DI
14	MOVQ in+8(FP),SI
15	MOVQ n+16(FP),DX
16	MOVQ nonce+24(FP),CX
17	MOVQ key+32(FP),R8
18
19	MOVQ SP,R12
20	MOVQ SP,R9
21	ADDQ $31, R9
22	ANDQ $~31, R9
23	MOVQ R9, SP
24
25	MOVQ DX,R9
26	MOVQ CX,DX
27	MOVQ R8,R10
28	CMPQ R9,$0
29	JBE DONE
30	START:
31	MOVL 20(R10),CX
32	MOVL 0(R10),R8
33	MOVL 0(DX),AX
34	MOVL 16(R10),R11
35	MOVL CX,0(SP)
36	MOVL R8, 4 (SP)
37	MOVL AX, 8 (SP)
38	MOVL R11, 12 (SP)
39	MOVL 8(DX),CX
40	MOVL 24(R10),R8
41	MOVL 4(R10),AX
42	MOVL 4(DX),R11
43	MOVL CX,16(SP)
44	MOVL R8, 20 (SP)
45	MOVL AX, 24 (SP)
46	MOVL R11, 28 (SP)
47	MOVL 12(DX),CX
48	MOVL 12(R10),DX
49	MOVL 28(R10),R8
50	MOVL 8(R10),AX
51	MOVL DX,32(SP)
52	MOVL CX, 36 (SP)
53	MOVL R8, 40 (SP)
54	MOVL AX, 44 (SP)
55	MOVQ $1634760805,DX
56	MOVQ $857760878,CX
57	MOVQ $2036477234,R8
58	MOVQ $1797285236,AX
59	MOVL DX,48(SP)
60	MOVL CX, 52 (SP)
61	MOVL R8, 56 (SP)
62	MOVL AX, 60 (SP)
63	CMPQ R9,$256
64	JB BYTESBETWEEN1AND255
65	MOVOA 48(SP),X0
66	PSHUFL $0X55,X0,X1
67	PSHUFL $0XAA,X0,X2
68	PSHUFL $0XFF,X0,X3
69	PSHUFL $0X00,X0,X0
70	MOVOA X1,64(SP)
71	MOVOA X2,80(SP)
72	MOVOA X3,96(SP)
73	MOVOA X0,112(SP)
74	MOVOA 0(SP),X0
75	PSHUFL $0XAA,X0,X1
76	PSHUFL $0XFF,X0,X2
77	PSHUFL $0X00,X0,X3
78	PSHUFL $0X55,X0,X0
79	MOVOA X1,128(SP)
80	MOVOA X2,144(SP)
81	MOVOA X3,160(SP)
82	MOVOA X0,176(SP)
83	MOVOA 16(SP),X0
84	PSHUFL $0XFF,X0,X1
85	PSHUFL $0X55,X0,X2
86	PSHUFL $0XAA,X0,X0
87	MOVOA X1,192(SP)
88	MOVOA X2,208(SP)
89	MOVOA X0,224(SP)
90	MOVOA 32(SP),X0
91	PSHUFL $0X00,X0,X1
92	PSHUFL $0XAA,X0,X2
93	PSHUFL $0XFF,X0,X0
94	MOVOA X1,240(SP)
95	MOVOA X2,256(SP)
96	MOVOA X0,272(SP)
97	BYTESATLEAST256:
98	MOVL 16(SP),DX
99	MOVL  36 (SP),CX
100	MOVL DX,288(SP)
101	MOVL CX,304(SP)
102	SHLQ $32,CX
103	ADDQ CX,DX
104	ADDQ $1,DX
105	MOVQ DX,CX
106	SHRQ $32,CX
107	MOVL DX, 292 (SP)
108	MOVL CX, 308 (SP)
109	ADDQ $1,DX
110	MOVQ DX,CX
111	SHRQ $32,CX
112	MOVL DX, 296 (SP)
113	MOVL CX, 312 (SP)
114	ADDQ $1,DX
115	MOVQ DX,CX
116	SHRQ $32,CX
117	MOVL DX, 300 (SP)
118	MOVL CX, 316 (SP)
119	ADDQ $1,DX
120	MOVQ DX,CX
121	SHRQ $32,CX
122	MOVL DX,16(SP)
123	MOVL CX, 36 (SP)
124	MOVQ R9,352(SP)
125	MOVQ $20,DX
126	MOVOA 64(SP),X0
127	MOVOA 80(SP),X1
128	MOVOA 96(SP),X2
129	MOVOA 256(SP),X3
130	MOVOA 272(SP),X4
131	MOVOA 128(SP),X5
132	MOVOA 144(SP),X6
133	MOVOA 176(SP),X7
134	MOVOA 192(SP),X8
135	MOVOA 208(SP),X9
136	MOVOA 224(SP),X10
137	MOVOA 304(SP),X11
138	MOVOA 112(SP),X12
139	MOVOA 160(SP),X13
140	MOVOA 240(SP),X14
141	MOVOA 288(SP),X15
142	MAINLOOP1:
143	MOVOA X1,320(SP)
144	MOVOA X2,336(SP)
145	MOVOA X13,X1
146	PADDL X12,X1
147	MOVOA X1,X2
148	PSLLL $7,X1
149	PXOR X1,X14
150	PSRLL $25,X2
151	PXOR X2,X14
152	MOVOA X7,X1
153	PADDL X0,X1
154	MOVOA X1,X2
155	PSLLL $7,X1
156	PXOR X1,X11
157	PSRLL $25,X2
158	PXOR X2,X11
159	MOVOA X12,X1
160	PADDL X14,X1
161	MOVOA X1,X2
162	PSLLL $9,X1
163	PXOR X1,X15
164	PSRLL $23,X2
165	PXOR X2,X15
166	MOVOA X0,X1
167	PADDL X11,X1
168	MOVOA X1,X2
169	PSLLL $9,X1
170	PXOR X1,X9
171	PSRLL $23,X2
172	PXOR X2,X9
173	MOVOA X14,X1
174	PADDL X15,X1
175	MOVOA X1,X2
176	PSLLL $13,X1
177	PXOR X1,X13
178	PSRLL $19,X2
179	PXOR X2,X13
180	MOVOA X11,X1
181	PADDL X9,X1
182	MOVOA X1,X2
183	PSLLL $13,X1
184	PXOR X1,X7
185	PSRLL $19,X2
186	PXOR X2,X7
187	MOVOA X15,X1
188	PADDL X13,X1
189	MOVOA X1,X2
190	PSLLL $18,X1
191	PXOR X1,X12
192	PSRLL $14,X2
193	PXOR X2,X12
194	MOVOA 320(SP),X1
195	MOVOA X12,320(SP)
196	MOVOA X9,X2
197	PADDL X7,X2
198	MOVOA X2,X12
199	PSLLL $18,X2
200	PXOR X2,X0
201	PSRLL $14,X12
202	PXOR X12,X0
203	MOVOA X5,X2
204	PADDL X1,X2
205	MOVOA X2,X12
206	PSLLL $7,X2
207	PXOR X2,X3
208	PSRLL $25,X12
209	PXOR X12,X3
210	MOVOA 336(SP),X2
211	MOVOA X0,336(SP)
212	MOVOA X6,X0
213	PADDL X2,X0
214	MOVOA X0,X12
215	PSLLL $7,X0
216	PXOR X0,X4
217	PSRLL $25,X12
218	PXOR X12,X4
219	MOVOA X1,X0
220	PADDL X3,X0
221	MOVOA X0,X12
222	PSLLL $9,X0
223	PXOR X0,X10
224	PSRLL $23,X12
225	PXOR X12,X10
226	MOVOA X2,X0
227	PADDL X4,X0
228	MOVOA X0,X12
229	PSLLL $9,X0
230	PXOR X0,X8
231	PSRLL $23,X12
232	PXOR X12,X8
233	MOVOA X3,X0
234	PADDL X10,X0
235	MOVOA X0,X12
236	PSLLL $13,X0
237	PXOR X0,X5
238	PSRLL $19,X12
239	PXOR X12,X5
240	MOVOA X4,X0
241	PADDL X8,X0
242	MOVOA X0,X12
243	PSLLL $13,X0
244	PXOR X0,X6
245	PSRLL $19,X12
246	PXOR X12,X6
247	MOVOA X10,X0
248	PADDL X5,X0
249	MOVOA X0,X12
250	PSLLL $18,X0
251	PXOR X0,X1
252	PSRLL $14,X12
253	PXOR X12,X1
254	MOVOA 320(SP),X0
255	MOVOA X1,320(SP)
256	MOVOA X4,X1
257	PADDL X0,X1
258	MOVOA X1,X12
259	PSLLL $7,X1
260	PXOR X1,X7
261	PSRLL $25,X12
262	PXOR X12,X7
263	MOVOA X8,X1
264	PADDL X6,X1
265	MOVOA X1,X12
266	PSLLL $18,X1
267	PXOR X1,X2
268	PSRLL $14,X12
269	PXOR X12,X2
270	MOVOA 336(SP),X12
271	MOVOA X2,336(SP)
272	MOVOA X14,X1
273	PADDL X12,X1
274	MOVOA X1,X2
275	PSLLL $7,X1
276	PXOR X1,X5
277	PSRLL $25,X2
278	PXOR X2,X5
279	MOVOA X0,X1
280	PADDL X7,X1
281	MOVOA X1,X2
282	PSLLL $9,X1
283	PXOR X1,X10
284	PSRLL $23,X2
285	PXOR X2,X10
286	MOVOA X12,X1
287	PADDL X5,X1
288	MOVOA X1,X2
289	PSLLL $9,X1
290	PXOR X1,X8
291	PSRLL $23,X2
292	PXOR X2,X8
293	MOVOA X7,X1
294	PADDL X10,X1
295	MOVOA X1,X2
296	PSLLL $13,X1
297	PXOR X1,X4
298	PSRLL $19,X2
299	PXOR X2,X4
300	MOVOA X5,X1
301	PADDL X8,X1
302	MOVOA X1,X2
303	PSLLL $13,X1
304	PXOR X1,X14
305	PSRLL $19,X2
306	PXOR X2,X14
307	MOVOA X10,X1
308	PADDL X4,X1
309	MOVOA X1,X2
310	PSLLL $18,X1
311	PXOR X1,X0
312	PSRLL $14,X2
313	PXOR X2,X0
314	MOVOA 320(SP),X1
315	MOVOA X0,320(SP)
316	MOVOA X8,X0
317	PADDL X14,X0
318	MOVOA X0,X2
319	PSLLL $18,X0
320	PXOR X0,X12
321	PSRLL $14,X2
322	PXOR X2,X12
323	MOVOA X11,X0
324	PADDL X1,X0
325	MOVOA X0,X2
326	PSLLL $7,X0
327	PXOR X0,X6
328	PSRLL $25,X2
329	PXOR X2,X6
330	MOVOA 336(SP),X2
331	MOVOA X12,336(SP)
332	MOVOA X3,X0
333	PADDL X2,X0
334	MOVOA X0,X12
335	PSLLL $7,X0
336	PXOR X0,X13
337	PSRLL $25,X12
338	PXOR X12,X13
339	MOVOA X1,X0
340	PADDL X6,X0
341	MOVOA X0,X12
342	PSLLL $9,X0
343	PXOR X0,X15
344	PSRLL $23,X12
345	PXOR X12,X15
346	MOVOA X2,X0
347	PADDL X13,X0
348	MOVOA X0,X12
349	PSLLL $9,X0
350	PXOR X0,X9
351	PSRLL $23,X12
352	PXOR X12,X9
353	MOVOA X6,X0
354	PADDL X15,X0
355	MOVOA X0,X12
356	PSLLL $13,X0
357	PXOR X0,X11
358	PSRLL $19,X12
359	PXOR X12,X11
360	MOVOA X13,X0
361	PADDL X9,X0
362	MOVOA X0,X12
363	PSLLL $13,X0
364	PXOR X0,X3
365	PSRLL $19,X12
366	PXOR X12,X3
367	MOVOA X15,X0
368	PADDL X11,X0
369	MOVOA X0,X12
370	PSLLL $18,X0
371	PXOR X0,X1
372	PSRLL $14,X12
373	PXOR X12,X1
374	MOVOA X9,X0
375	PADDL X3,X0
376	MOVOA X0,X12
377	PSLLL $18,X0
378	PXOR X0,X2
379	PSRLL $14,X12
380	PXOR X12,X2
381	MOVOA 320(SP),X12
382	MOVOA 336(SP),X0
383	SUBQ $2,DX
384	JA MAINLOOP1
385	PADDL 112(SP),X12
386	PADDL 176(SP),X7
387	PADDL 224(SP),X10
388	PADDL 272(SP),X4
389	MOVD X12,DX
390	MOVD X7,CX
391	MOVD X10,R8
392	MOVD X4,R9
393	PSHUFL $0X39,X12,X12
394	PSHUFL $0X39,X7,X7
395	PSHUFL $0X39,X10,X10
396	PSHUFL $0X39,X4,X4
397	XORL 0(SI),DX
398	XORL 4(SI),CX
399	XORL 8(SI),R8
400	XORL 12(SI),R9
401	MOVL DX,0(DI)
402	MOVL CX,4(DI)
403	MOVL R8,8(DI)
404	MOVL R9,12(DI)
405	MOVD X12,DX
406	MOVD X7,CX
407	MOVD X10,R8
408	MOVD X4,R9
409	PSHUFL $0X39,X12,X12
410	PSHUFL $0X39,X7,X7
411	PSHUFL $0X39,X10,X10
412	PSHUFL $0X39,X4,X4
413	XORL 64(SI),DX
414	XORL 68(SI),CX
415	XORL 72(SI),R8
416	XORL 76(SI),R9
417	MOVL DX,64(DI)
418	MOVL CX,68(DI)
419	MOVL R8,72(DI)
420	MOVL R9,76(DI)
421	MOVD X12,DX
422	MOVD X7,CX
423	MOVD X10,R8
424	MOVD X4,R9
425	PSHUFL $0X39,X12,X12
426	PSHUFL $0X39,X7,X7
427	PSHUFL $0X39,X10,X10
428	PSHUFL $0X39,X4,X4
429	XORL 128(SI),DX
430	XORL 132(SI),CX
431	XORL 136(SI),R8
432	XORL 140(SI),R9
433	MOVL DX,128(DI)
434	MOVL CX,132(DI)
435	MOVL R8,136(DI)
436	MOVL R9,140(DI)
437	MOVD X12,DX
438	MOVD X7,CX
439	MOVD X10,R8
440	MOVD X4,R9
441	XORL 192(SI),DX
442	XORL 196(SI),CX
443	XORL 200(SI),R8
444	XORL 204(SI),R9
445	MOVL DX,192(DI)
446	MOVL CX,196(DI)
447	MOVL R8,200(DI)
448	MOVL R9,204(DI)
449	PADDL 240(SP),X14
450	PADDL 64(SP),X0
451	PADDL 128(SP),X5
452	PADDL 192(SP),X8
453	MOVD X14,DX
454	MOVD X0,CX
455	MOVD X5,R8
456	MOVD X8,R9
457	PSHUFL $0X39,X14,X14
458	PSHUFL $0X39,X0,X0
459	PSHUFL $0X39,X5,X5
460	PSHUFL $0X39,X8,X8
461	XORL 16(SI),DX
462	XORL 20(SI),CX
463	XORL 24(SI),R8
464	XORL 28(SI),R9
465	MOVL DX,16(DI)
466	MOVL CX,20(DI)
467	MOVL R8,24(DI)
468	MOVL R9,28(DI)
469	MOVD X14,DX
470	MOVD X0,CX
471	MOVD X5,R8
472	MOVD X8,R9
473	PSHUFL $0X39,X14,X14
474	PSHUFL $0X39,X0,X0
475	PSHUFL $0X39,X5,X5
476	PSHUFL $0X39,X8,X8
477	XORL 80(SI),DX
478	XORL 84(SI),CX
479	XORL 88(SI),R8
480	XORL 92(SI),R9
481	MOVL DX,80(DI)
482	MOVL CX,84(DI)
483	MOVL R8,88(DI)
484	MOVL R9,92(DI)
485	MOVD X14,DX
486	MOVD X0,CX
487	MOVD X5,R8
488	MOVD X8,R9
489	PSHUFL $0X39,X14,X14
490	PSHUFL $0X39,X0,X0
491	PSHUFL $0X39,X5,X5
492	PSHUFL $0X39,X8,X8
493	XORL 144(SI),DX
494	XORL 148(SI),CX
495	XORL 152(SI),R8
496	XORL 156(SI),R9
497	MOVL DX,144(DI)
498	MOVL CX,148(DI)
499	MOVL R8,152(DI)
500	MOVL R9,156(DI)
501	MOVD X14,DX
502	MOVD X0,CX
503	MOVD X5,R8
504	MOVD X8,R9
505	XORL 208(SI),DX
506	XORL 212(SI),CX
507	XORL 216(SI),R8
508	XORL 220(SI),R9
509	MOVL DX,208(DI)
510	MOVL CX,212(DI)
511	MOVL R8,216(DI)
512	MOVL R9,220(DI)
513	PADDL 288(SP),X15
514	PADDL 304(SP),X11
515	PADDL 80(SP),X1
516	PADDL 144(SP),X6
517	MOVD X15,DX
518	MOVD X11,CX
519	MOVD X1,R8
520	MOVD X6,R9
521	PSHUFL $0X39,X15,X15
522	PSHUFL $0X39,X11,X11
523	PSHUFL $0X39,X1,X1
524	PSHUFL $0X39,X6,X6
525	XORL 32(SI),DX
526	XORL 36(SI),CX
527	XORL 40(SI),R8
528	XORL 44(SI),R9
529	MOVL DX,32(DI)
530	MOVL CX,36(DI)
531	MOVL R8,40(DI)
532	MOVL R9,44(DI)
533	MOVD X15,DX
534	MOVD X11,CX
535	MOVD X1,R8
536	MOVD X6,R9
537	PSHUFL $0X39,X15,X15
538	PSHUFL $0X39,X11,X11
539	PSHUFL $0X39,X1,X1
540	PSHUFL $0X39,X6,X6
541	XORL 96(SI),DX
542	XORL 100(SI),CX
543	XORL 104(SI),R8
544	XORL 108(SI),R9
545	MOVL DX,96(DI)
546	MOVL CX,100(DI)
547	MOVL R8,104(DI)
548	MOVL R9,108(DI)
549	MOVD X15,DX
550	MOVD X11,CX
551	MOVD X1,R8
552	MOVD X6,R9
553	PSHUFL $0X39,X15,X15
554	PSHUFL $0X39,X11,X11
555	PSHUFL $0X39,X1,X1
556	PSHUFL $0X39,X6,X6
557	XORL 160(SI),DX
558	XORL 164(SI),CX
559	XORL 168(SI),R8
560	XORL 172(SI),R9
561	MOVL DX,160(DI)
562	MOVL CX,164(DI)
563	MOVL R8,168(DI)
564	MOVL R9,172(DI)
565	MOVD X15,DX
566	MOVD X11,CX
567	MOVD X1,R8
568	MOVD X6,R9
569	XORL 224(SI),DX
570	XORL 228(SI),CX
571	XORL 232(SI),R8
572	XORL 236(SI),R9
573	MOVL DX,224(DI)
574	MOVL CX,228(DI)
575	MOVL R8,232(DI)
576	MOVL R9,236(DI)
577	PADDL 160(SP),X13
578	PADDL 208(SP),X9
579	PADDL 256(SP),X3
580	PADDL 96(SP),X2
581	MOVD X13,DX
582	MOVD X9,CX
583	MOVD X3,R8
584	MOVD X2,R9
585	PSHUFL $0X39,X13,X13
586	PSHUFL $0X39,X9,X9
587	PSHUFL $0X39,X3,X3
588	PSHUFL $0X39,X2,X2
589	XORL 48(SI),DX
590	XORL 52(SI),CX
591	XORL 56(SI),R8
592	XORL 60(SI),R9
593	MOVL DX,48(DI)
594	MOVL CX,52(DI)
595	MOVL R8,56(DI)
596	MOVL R9,60(DI)
597	MOVD X13,DX
598	MOVD X9,CX
599	MOVD X3,R8
600	MOVD X2,R9
601	PSHUFL $0X39,X13,X13
602	PSHUFL $0X39,X9,X9
603	PSHUFL $0X39,X3,X3
604	PSHUFL $0X39,X2,X2
605	XORL 112(SI),DX
606	XORL 116(SI),CX
607	XORL 120(SI),R8
608	XORL 124(SI),R9
609	MOVL DX,112(DI)
610	MOVL CX,116(DI)
611	MOVL R8,120(DI)
612	MOVL R9,124(DI)
613	MOVD X13,DX
614	MOVD X9,CX
615	MOVD X3,R8
616	MOVD X2,R9
617	PSHUFL $0X39,X13,X13
618	PSHUFL $0X39,X9,X9
619	PSHUFL $0X39,X3,X3
620	PSHUFL $0X39,X2,X2
621	XORL 176(SI),DX
622	XORL 180(SI),CX
623	XORL 184(SI),R8
624	XORL 188(SI),R9
625	MOVL DX,176(DI)
626	MOVL CX,180(DI)
627	MOVL R8,184(DI)
628	MOVL R9,188(DI)
629	MOVD X13,DX
630	MOVD X9,CX
631	MOVD X3,R8
632	MOVD X2,R9
633	XORL 240(SI),DX
634	XORL 244(SI),CX
635	XORL 248(SI),R8
636	XORL 252(SI),R9
637	MOVL DX,240(DI)
638	MOVL CX,244(DI)
639	MOVL R8,248(DI)
640	MOVL R9,252(DI)
641	MOVQ 352(SP),R9
642	SUBQ $256,R9
643	ADDQ $256,SI
644	ADDQ $256,DI
645	CMPQ R9,$256
646	JAE BYTESATLEAST256
647	CMPQ R9,$0
648	JBE DONE
649	BYTESBETWEEN1AND255:
650	CMPQ R9,$64
651	JAE NOCOPY
652	MOVQ DI,DX
653	LEAQ 360(SP),DI
654	MOVQ R9,CX
655	REP; MOVSB
656	LEAQ 360(SP),DI
657	LEAQ 360(SP),SI
658	NOCOPY:
659	MOVQ R9,352(SP)
660	MOVOA 48(SP),X0
661	MOVOA 0(SP),X1
662	MOVOA 16(SP),X2
663	MOVOA 32(SP),X3
664	MOVOA X1,X4
665	MOVQ $20,CX
666	MAINLOOP2:
667	PADDL X0,X4
668	MOVOA X0,X5
669	MOVOA X4,X6
670	PSLLL $7,X4
671	PSRLL $25,X6
672	PXOR X4,X3
673	PXOR X6,X3
674	PADDL X3,X5
675	MOVOA X3,X4
676	MOVOA X5,X6
677	PSLLL $9,X5
678	PSRLL $23,X6
679	PXOR X5,X2
680	PSHUFL $0X93,X3,X3
681	PXOR X6,X2
682	PADDL X2,X4
683	MOVOA X2,X5
684	MOVOA X4,X6
685	PSLLL $13,X4
686	PSRLL $19,X6
687	PXOR X4,X1
688	PSHUFL $0X4E,X2,X2
689	PXOR X6,X1
690	PADDL X1,X5
691	MOVOA X3,X4
692	MOVOA X5,X6
693	PSLLL $18,X5
694	PSRLL $14,X6
695	PXOR X5,X0
696	PSHUFL $0X39,X1,X1
697	PXOR X6,X0
698	PADDL X0,X4
699	MOVOA X0,X5
700	MOVOA X4,X6
701	PSLLL $7,X4
702	PSRLL $25,X6
703	PXOR X4,X1
704	PXOR X6,X1
705	PADDL X1,X5
706	MOVOA X1,X4
707	MOVOA X5,X6
708	PSLLL $9,X5
709	PSRLL $23,X6
710	PXOR X5,X2
711	PSHUFL $0X93,X1,X1
712	PXOR X6,X2
713	PADDL X2,X4
714	MOVOA X2,X5
715	MOVOA X4,X6
716	PSLLL $13,X4
717	PSRLL $19,X6
718	PXOR X4,X3
719	PSHUFL $0X4E,X2,X2
720	PXOR X6,X3
721	PADDL X3,X5
722	MOVOA X1,X4
723	MOVOA X5,X6
724	PSLLL $18,X5
725	PSRLL $14,X6
726	PXOR X5,X0
727	PSHUFL $0X39,X3,X3
728	PXOR X6,X0
729	PADDL X0,X4
730	MOVOA X0,X5
731	MOVOA X4,X6
732	PSLLL $7,X4
733	PSRLL $25,X6
734	PXOR X4,X3
735	PXOR X6,X3
736	PADDL X3,X5
737	MOVOA X3,X4
738	MOVOA X5,X6
739	PSLLL $9,X5
740	PSRLL $23,X6
741	PXOR X5,X2
742	PSHUFL $0X93,X3,X3
743	PXOR X6,X2
744	PADDL X2,X4
745	MOVOA X2,X5
746	MOVOA X4,X6
747	PSLLL $13,X4
748	PSRLL $19,X6
749	PXOR X4,X1
750	PSHUFL $0X4E,X2,X2
751	PXOR X6,X1
752	PADDL X1,X5
753	MOVOA X3,X4
754	MOVOA X5,X6
755	PSLLL $18,X5
756	PSRLL $14,X6
757	PXOR X5,X0
758	PSHUFL $0X39,X1,X1
759	PXOR X6,X0
760	PADDL X0,X4
761	MOVOA X0,X5
762	MOVOA X4,X6
763	PSLLL $7,X4
764	PSRLL $25,X6
765	PXOR X4,X1
766	PXOR X6,X1
767	PADDL X1,X5
768	MOVOA X1,X4
769	MOVOA X5,X6
770	PSLLL $9,X5
771	PSRLL $23,X6
772	PXOR X5,X2
773	PSHUFL $0X93,X1,X1
774	PXOR X6,X2
775	PADDL X2,X4
776	MOVOA X2,X5
777	MOVOA X4,X6
778	PSLLL $13,X4
779	PSRLL $19,X6
780	PXOR X4,X3
781	PSHUFL $0X4E,X2,X2
782	PXOR X6,X3
783	SUBQ $4,CX
784	PADDL X3,X5
785	MOVOA X1,X4
786	MOVOA X5,X6
787	PSLLL $18,X5
788	PXOR X7,X7
789	PSRLL $14,X6
790	PXOR X5,X0
791	PSHUFL $0X39,X3,X3
792	PXOR X6,X0
793	JA MAINLOOP2
794	PADDL 48(SP),X0
795	PADDL 0(SP),X1
796	PADDL 16(SP),X2
797	PADDL 32(SP),X3
798	MOVD X0,CX
799	MOVD X1,R8
800	MOVD X2,R9
801	MOVD X3,AX
802	PSHUFL $0X39,X0,X0
803	PSHUFL $0X39,X1,X1
804	PSHUFL $0X39,X2,X2
805	PSHUFL $0X39,X3,X3
806	XORL 0(SI),CX
807	XORL 48(SI),R8
808	XORL 32(SI),R9
809	XORL 16(SI),AX
810	MOVL CX,0(DI)
811	MOVL R8,48(DI)
812	MOVL R9,32(DI)
813	MOVL AX,16(DI)
814	MOVD X0,CX
815	MOVD X1,R8
816	MOVD X2,R9
817	MOVD X3,AX
818	PSHUFL $0X39,X0,X0
819	PSHUFL $0X39,X1,X1
820	PSHUFL $0X39,X2,X2
821	PSHUFL $0X39,X3,X3
822	XORL 20(SI),CX
823	XORL 4(SI),R8
824	XORL 52(SI),R9
825	XORL 36(SI),AX
826	MOVL CX,20(DI)
827	MOVL R8,4(DI)
828	MOVL R9,52(DI)
829	MOVL AX,36(DI)
830	MOVD X0,CX
831	MOVD X1,R8
832	MOVD X2,R9
833	MOVD X3,AX
834	PSHUFL $0X39,X0,X0
835	PSHUFL $0X39,X1,X1
836	PSHUFL $0X39,X2,X2
837	PSHUFL $0X39,X3,X3
838	XORL 40(SI),CX
839	XORL 24(SI),R8
840	XORL 8(SI),R9
841	XORL 56(SI),AX
842	MOVL CX,40(DI)
843	MOVL R8,24(DI)
844	MOVL R9,8(DI)
845	MOVL AX,56(DI)
846	MOVD X0,CX
847	MOVD X1,R8
848	MOVD X2,R9
849	MOVD X3,AX
850	XORL 60(SI),CX
851	XORL 44(SI),R8
852	XORL 28(SI),R9
853	XORL 12(SI),AX
854	MOVL CX,60(DI)
855	MOVL R8,44(DI)
856	MOVL R9,28(DI)
857	MOVL AX,12(DI)
858	MOVQ 352(SP),R9
859	MOVL 16(SP),CX
860	MOVL  36 (SP),R8
861	ADDQ $1,CX
862	SHLQ $32,R8
863	ADDQ R8,CX
864	MOVQ CX,R8
865	SHRQ $32,R8
866	MOVL CX,16(SP)
867	MOVL R8, 36 (SP)
868	CMPQ R9,$64
869	JA BYTESATLEAST65
870	JAE BYTESATLEAST64
871	MOVQ DI,SI
872	MOVQ DX,DI
873	MOVQ R9,CX
874	REP; MOVSB
875	BYTESATLEAST64:
876	DONE:
877	MOVQ R12,SP
878	RET
879	BYTESATLEAST65:
880	SUBQ $64,R9
881	ADDQ $64,DI
882	ADDQ $64,SI
883	JMP BYTESBETWEEN1AND255
884