xref: /netbsd-src/crypto/external/bsd/openssl/lib/libcrypto/arch/powerpc64/chacha-ppc.S (revision e0ea3921ea68e51b93ffc215f08ae1647c8e1796)
1.machine	"any"
2.text
3
4.globl	ChaCha20_ctr32_int
5.type	ChaCha20_ctr32_int,@function
6.section	".opd","aw"
7.align	3
8ChaCha20_ctr32_int:
9.quad	.ChaCha20_ctr32_int,.TOC.@tocbase,0
10.previous
11.align	5
12.ChaCha20_ctr32_int:
13__ChaCha20_ctr32_int:
14	cmpldi	5,0
15	beqlr
16
17	stdu	1,-256(1)
18	mflr	0
19
20	std	14,112(1)
21	std	15,120(1)
22	std	16,128(1)
23	std	17,136(1)
24	std	18,144(1)
25	std	19,152(1)
26	std	20,160(1)
27	std	21,168(1)
28	std	22,176(1)
29	std	23,184(1)
30	std	24,192(1)
31	std	25,200(1)
32	std	26,208(1)
33	std	27,216(1)
34	std	28,224(1)
35	std	29,232(1)
36	std	30,240(1)
37	std	31,248(1)
38	std	0,272(1)
39
40	lwz	11,0(7)
41	lwz	12,4(7)
42	lwz	14,8(7)
43	lwz	15,12(7)
44
45	bl	__ChaCha20_1x
46
47	ld	0,272(1)
48	ld	14,112(1)
49	ld	15,120(1)
50	ld	16,128(1)
51	ld	17,136(1)
52	ld	18,144(1)
53	ld	19,152(1)
54	ld	20,160(1)
55	ld	21,168(1)
56	ld	22,176(1)
57	ld	23,184(1)
58	ld	24,192(1)
59	ld	25,200(1)
60	ld	26,208(1)
61	ld	27,216(1)
62	ld	28,224(1)
63	ld	29,232(1)
64	ld	30,240(1)
65	ld	31,248(1)
66	mtlr	0
67	addi	1,1,256
68	blr
69.long	0
70.byte	0,12,4,1,0x80,18,5,0
71.long	0
72
73
74.align	5
75__ChaCha20_1x:
76.Loop_outer:
77	lis	16,0x6170
78	lis	17,0x3320
79	lis	18,0x7962
80	lis	19,0x6b20
81	ori	16,16,0x7865
82	ori	17,17,0x646e
83	ori	18,18,0x2d32
84	ori	19,19,0x6574
85
86	li	0,10
87	lwz	20,0(6)
88	lwz	21,4(6)
89	lwz	22,8(6)
90	lwz	23,12(6)
91	lwz	24,16(6)
92	mr	28,11
93	lwz	25,20(6)
94	mr	29,12
95	lwz	26,24(6)
96	mr	30,14
97	lwz	27,28(6)
98	mr	31,15
99
100	mr	7,20
101	mr	8,21
102	mr	9,22
103	mr	10,23
104
105	mtctr	0
106.Loop:
107	add	16,16,20
108	add	17,17,21
109	add	18,18,22
110	add	19,19,23
111	xor	28,28,16
112	xor	29,29,17
113	xor	30,30,18
114	xor	31,31,19
115	rotlwi	28,28,16
116	rotlwi	29,29,16
117	rotlwi	30,30,16
118	rotlwi	31,31,16
119	add	24,24,28
120	add	25,25,29
121	add	26,26,30
122	add	27,27,31
123	xor	20,20,24
124	xor	21,21,25
125	xor	22,22,26
126	xor	23,23,27
127	rotlwi	20,20,12
128	rotlwi	21,21,12
129	rotlwi	22,22,12
130	rotlwi	23,23,12
131	add	16,16,20
132	add	17,17,21
133	add	18,18,22
134	add	19,19,23
135	xor	28,28,16
136	xor	29,29,17
137	xor	30,30,18
138	xor	31,31,19
139	rotlwi	28,28,8
140	rotlwi	29,29,8
141	rotlwi	30,30,8
142	rotlwi	31,31,8
143	add	24,24,28
144	add	25,25,29
145	add	26,26,30
146	add	27,27,31
147	xor	20,20,24
148	xor	21,21,25
149	xor	22,22,26
150	xor	23,23,27
151	rotlwi	20,20,7
152	rotlwi	21,21,7
153	rotlwi	22,22,7
154	rotlwi	23,23,7
155	add	16,16,21
156	add	17,17,22
157	add	18,18,23
158	add	19,19,20
159	xor	31,31,16
160	xor	28,28,17
161	xor	29,29,18
162	xor	30,30,19
163	rotlwi	31,31,16
164	rotlwi	28,28,16
165	rotlwi	29,29,16
166	rotlwi	30,30,16
167	add	26,26,31
168	add	27,27,28
169	add	24,24,29
170	add	25,25,30
171	xor	21,21,26
172	xor	22,22,27
173	xor	23,23,24
174	xor	20,20,25
175	rotlwi	21,21,12
176	rotlwi	22,22,12
177	rotlwi	23,23,12
178	rotlwi	20,20,12
179	add	16,16,21
180	add	17,17,22
181	add	18,18,23
182	add	19,19,20
183	xor	31,31,16
184	xor	28,28,17
185	xor	29,29,18
186	xor	30,30,19
187	rotlwi	31,31,8
188	rotlwi	28,28,8
189	rotlwi	29,29,8
190	rotlwi	30,30,8
191	add	26,26,31
192	add	27,27,28
193	add	24,24,29
194	add	25,25,30
195	xor	21,21,26
196	xor	22,22,27
197	xor	23,23,24
198	xor	20,20,25
199	rotlwi	21,21,7
200	rotlwi	22,22,7
201	rotlwi	23,23,7
202	rotlwi	20,20,7
203	bc	16,0,.Loop
204
205	subic	5,5,64
206	addi	16,16,0x7865
207	addi	17,17,0x646e
208	addi	18,18,0x2d32
209	addi	19,19,0x6574
210	addis	16,16,0x6170
211	addis	17,17,0x3320
212	addis	18,18,0x7962
213	addis	19,19,0x6b20
214
215	subfe.	0,0,0
216	add	20,20,7
217	lwz	7,16(6)
218	add	21,21,8
219	lwz	8,20(6)
220	add	22,22,9
221	lwz	9,24(6)
222	add	23,23,10
223	lwz	10,28(6)
224	add	24,24,7
225	add	25,25,8
226	add	26,26,9
227	add	27,27,10
228
229	add	28,28,11
230	add	29,29,12
231	add	30,30,14
232	add	31,31,15
233	addi	11,11,1
234	mr	7,16
235	rotlwi	16,16,8
236	rlwimi	16,7,24,0,7
237	rlwimi	16,7,24,16,23
238	mr	8,17
239	rotlwi	17,17,8
240	rlwimi	17,8,24,0,7
241	rlwimi	17,8,24,16,23
242	mr	9,18
243	rotlwi	18,18,8
244	rlwimi	18,9,24,0,7
245	rlwimi	18,9,24,16,23
246	mr	10,19
247	rotlwi	19,19,8
248	rlwimi	19,10,24,0,7
249	rlwimi	19,10,24,16,23
250	mr	7,20
251	rotlwi	20,20,8
252	rlwimi	20,7,24,0,7
253	rlwimi	20,7,24,16,23
254	mr	8,21
255	rotlwi	21,21,8
256	rlwimi	21,8,24,0,7
257	rlwimi	21,8,24,16,23
258	mr	9,22
259	rotlwi	22,22,8
260	rlwimi	22,9,24,0,7
261	rlwimi	22,9,24,16,23
262	mr	10,23
263	rotlwi	23,23,8
264	rlwimi	23,10,24,0,7
265	rlwimi	23,10,24,16,23
266	mr	7,24
267	rotlwi	24,24,8
268	rlwimi	24,7,24,0,7
269	rlwimi	24,7,24,16,23
270	mr	8,25
271	rotlwi	25,25,8
272	rlwimi	25,8,24,0,7
273	rlwimi	25,8,24,16,23
274	mr	9,26
275	rotlwi	26,26,8
276	rlwimi	26,9,24,0,7
277	rlwimi	26,9,24,16,23
278	mr	10,27
279	rotlwi	27,27,8
280	rlwimi	27,10,24,0,7
281	rlwimi	27,10,24,16,23
282	mr	7,28
283	rotlwi	28,28,8
284	rlwimi	28,7,24,0,7
285	rlwimi	28,7,24,16,23
286	mr	8,29
287	rotlwi	29,29,8
288	rlwimi	29,8,24,0,7
289	rlwimi	29,8,24,16,23
290	mr	9,30
291	rotlwi	30,30,8
292	rlwimi	30,9,24,0,7
293	rlwimi	30,9,24,16,23
294	mr	10,31
295	rotlwi	31,31,8
296	rlwimi	31,10,24,0,7
297	rlwimi	31,10,24,16,23
298	bne	.Ltail
299
300	lwz	7,0(4)
301	lwz	8,4(4)
302	cmpldi	5,0
303	lwz	9,8(4)
304	lwz	10,12(4)
305	xor	16,16,7
306	lwz	7,16(4)
307	xor	17,17,8
308	lwz	8,20(4)
309	xor	18,18,9
310	lwz	9,24(4)
311	xor	19,19,10
312	lwz	10,28(4)
313	xor	20,20,7
314	lwz	7,32(4)
315	xor	21,21,8
316	lwz	8,36(4)
317	xor	22,22,9
318	lwz	9,40(4)
319	xor	23,23,10
320	lwz	10,44(4)
321	xor	24,24,7
322	lwz	7,48(4)
323	xor	25,25,8
324	lwz	8,52(4)
325	xor	26,26,9
326	lwz	9,56(4)
327	xor	27,27,10
328	lwz	10,60(4)
329	xor	28,28,7
330	stw	16,0(3)
331	xor	29,29,8
332	stw	17,4(3)
333	xor	30,30,9
334	stw	18,8(3)
335	xor	31,31,10
336	stw	19,12(3)
337	stw	20,16(3)
338	stw	21,20(3)
339	stw	22,24(3)
340	stw	23,28(3)
341	stw	24,32(3)
342	stw	25,36(3)
343	stw	26,40(3)
344	stw	27,44(3)
345	stw	28,48(3)
346	stw	29,52(3)
347	stw	30,56(3)
348	addi	4,4,64
349	stw	31,60(3)
350	addi	3,3,64
351
352	bne	.Loop_outer
353
354	blr
355
356.align	4
357.Ltail:
358	addi	5,5,64
359	subi	4,4,1
360	subi	3,3,1
361	addi	7,1,48-1
362	mtctr	5
363
364	stw	16,48(1)
365	stw	17,52(1)
366	stw	18,56(1)
367	stw	19,60(1)
368	stw	20,64(1)
369	stw	21,68(1)
370	stw	22,72(1)
371	stw	23,76(1)
372	stw	24,80(1)
373	stw	25,84(1)
374	stw	26,88(1)
375	stw	27,92(1)
376	stw	28,96(1)
377	stw	29,100(1)
378	stw	30,104(1)
379	stw	31,108(1)
380
381.Loop_tail:
382	lbzu	11,1(4)
383	lbzu	16,1(7)
384	xor	12,11,16
385	stbu	12,1(3)
386	bc	16,0,.Loop_tail
387
388	stw	1,48(1)
389	stw	1,52(1)
390	stw	1,56(1)
391	stw	1,60(1)
392	stw	1,64(1)
393	stw	1,68(1)
394	stw	1,72(1)
395	stw	1,76(1)
396	stw	1,80(1)
397	stw	1,84(1)
398	stw	1,88(1)
399	stw	1,92(1)
400	stw	1,96(1)
401	stw	1,100(1)
402	stw	1,104(1)
403	stw	1,108(1)
404
405	blr
406.long	0
407.byte	0,12,0x14,0,0,0,0,0
408
409.globl	ChaCha20_ctr32_vmx
410.type	ChaCha20_ctr32_vmx,@function
411.section	".opd","aw"
412.align	3
413ChaCha20_ctr32_vmx:
414.quad	.ChaCha20_ctr32_vmx,.TOC.@tocbase,0
415.previous
416.align	5
417.ChaCha20_ctr32_vmx:
418	cmpldi	5,256
419	blt	__ChaCha20_ctr32_int
420
421	stdu	1,-416(1)
422	mflr	0
423	li	10,127
424	li	11,143
425	mfspr	12,256
426	stvx	23,10,1
427	addi	10,10,32
428	stvx	24,11,1
429	addi	11,11,32
430	stvx	25,10,1
431	addi	10,10,32
432	stvx	26,11,1
433	addi	11,11,32
434	stvx	27,10,1
435	addi	10,10,32
436	stvx	28,11,1
437	addi	11,11,32
438	stvx	29,10,1
439	addi	10,10,32
440	stvx	30,11,1
441	stvx	31,10,1
442	stw	12,268(1)
443	std	14,272(1)
444	std	15,280(1)
445	std	16,288(1)
446	std	17,296(1)
447	std	18,304(1)
448	std	19,312(1)
449	std	20,320(1)
450	std	21,328(1)
451	std	22,336(1)
452	std	23,344(1)
453	std	24,352(1)
454	std	25,360(1)
455	std	26,368(1)
456	std	27,376(1)
457	std	28,384(1)
458	std	29,392(1)
459	std	30,400(1)
460	std	31,408(1)
461	li	12,-4096+511
462	std	0, 432(1)
463	mtspr	256,12
464
465	bl	.Lconsts
466	li	16,16
467	li	17,32
468	li	18,48
469	li	19,64
470	li	20,31
471	li	21,15
472
473	lvx	13,0,6
474	lvsl	29,0,6
475	lvx	14,16,6
476	lvx	27,20,6
477
478	lvx	15,0,7
479	lvsl	30,0,7
480	lvx	28,21,7
481
482	lvx	12,0,12
483	lvx	17,16,12
484	lvx	18,17,12
485	lvx	19,18,12
486	lvx	23,19,12
487
488	vperm	13,13,14,29
489	vperm	14,14,27,29
490	vperm	15,15,28,30
491
492	lwz	11,0(7)
493	lwz	12,4(7)
494	vadduwm	15,15,17
495	lwz	14,8(7)
496	vadduwm	16,15,17
497	lwz	15,12(7)
498	vadduwm	17,16,17
499
500	vxor	29,29,29
501	vspltisw	26,-1
502	lvsl	24,0,4
503	lvsr	25,0,3
504	vperm	26,29,26,25
505
506	lvsl	29,0,16
507	vspltisb	30,3
508	vxor	29,29,30
509	vxor	25,25,30
510	vperm	24,24,24,29
511
512	li	0,10
513	b	.Loop_outer_vmx
514
515.align	4
516.Loop_outer_vmx:
517	lis	16,0x6170
518	lis	17,0x3320
519	vor	0,12,12
520	lis	18,0x7962
521	lis	19,0x6b20
522	vor	4,12,12
523	ori	16,16,0x7865
524	ori	17,17,0x646e
525	vor	8,12,12
526	ori	18,18,0x2d32
527	ori	19,19,0x6574
528	vor	1,13,13
529
530	lwz	20,0(6)
531	vor	5,13,13
532	lwz	21,4(6)
533	vor	9,13,13
534	lwz	22,8(6)
535	vor	2,14,14
536	lwz	23,12(6)
537	vor	6,14,14
538	lwz	24,16(6)
539	vor	10,14,14
540	mr	28,11
541	lwz	25,20(6)
542	vor	3,15,15
543	mr	29,12
544	lwz	26,24(6)
545	vor	7,16,16
546	mr	30,14
547	lwz	27,28(6)
548	vor	11,17,17
549	mr	31,15
550
551	mr	7,20
552	mr	8,21
553	mr	9,22
554	mr	10,23
555
556	vspltisw	27,12
557	vspltisw	28,7
558
559	mtctr	0
560	nop
561.Loop_vmx:
562	vadduwm	0,0,1
563	vadduwm	4,4,5
564	vadduwm	8,8,9
565	add	16,16,20
566	add	17,17,21
567	add	18,18,22
568	vxor	3,3,0
569	vxor	7,7,4
570	vxor	11,11,8
571	add	19,19,23
572	xor	28,28,16
573	xor	29,29,17
574	vperm	3,3,3,19
575	vperm	7,7,7,19
576	vperm	11,11,11,19
577	xor	30,30,18
578	xor	31,31,19
579	rotlwi	28,28,16
580	vadduwm	2,2,3
581	vadduwm	6,6,7
582	vadduwm	10,10,11
583	rotlwi	29,29,16
584	rotlwi	30,30,16
585	rotlwi	31,31,16
586	vxor	1,1,2
587	vxor	5,5,6
588	vxor	9,9,10
589	add	24,24,28
590	add	25,25,29
591	add	26,26,30
592	vrlw	1,1,27
593	vrlw	5,5,27
594	vrlw	9,9,27
595	add	27,27,31
596	xor	20,20,24
597	xor	21,21,25
598	vadduwm	0,0,1
599	vadduwm	4,4,5
600	vadduwm	8,8,9
601	xor	22,22,26
602	xor	23,23,27
603	rotlwi	20,20,12
604	vxor	3,3,0
605	vxor	7,7,4
606	vxor	11,11,8
607	rotlwi	21,21,12
608	rotlwi	22,22,12
609	rotlwi	23,23,12
610	vperm	3,3,3,23
611	vperm	7,7,7,23
612	vperm	11,11,11,23
613	add	16,16,20
614	add	17,17,21
615	add	18,18,22
616	vadduwm	2,2,3
617	vadduwm	6,6,7
618	vadduwm	10,10,11
619	add	19,19,23
620	xor	28,28,16
621	xor	29,29,17
622	vxor	1,1,2
623	vxor	5,5,6
624	vxor	9,9,10
625	xor	30,30,18
626	xor	31,31,19
627	rotlwi	28,28,8
628	vrlw	1,1,28
629	vrlw	5,5,28
630	vrlw	9,9,28
631	rotlwi	29,29,8
632	rotlwi	30,30,8
633	rotlwi	31,31,8
634	vsldoi	2,2,2, 16-8
635	vsldoi	6,6,6, 16-8
636	vsldoi	10,10,10, 16-8
637	add	24,24,28
638	add	25,25,29
639	add	26,26,30
640	vsldoi	1,1,1, 16-12
641	vsldoi	5,5,5, 16-12
642	vsldoi	9,9,9, 16-12
643	add	27,27,31
644	xor	20,20,24
645	xor	21,21,25
646	vsldoi	3,3,3, 16-4
647	vsldoi	7,7,7, 16-4
648	vsldoi	11,11,11, 16-4
649	xor	22,22,26
650	xor	23,23,27
651	rotlwi	20,20,7
652	rotlwi	21,21,7
653	rotlwi	22,22,7
654	rotlwi	23,23,7
655	vadduwm	0,0,1
656	vadduwm	4,4,5
657	vadduwm	8,8,9
658	add	16,16,21
659	add	17,17,22
660	add	18,18,23
661	vxor	3,3,0
662	vxor	7,7,4
663	vxor	11,11,8
664	add	19,19,20
665	xor	31,31,16
666	xor	28,28,17
667	vperm	3,3,3,19
668	vperm	7,7,7,19
669	vperm	11,11,11,19
670	xor	29,29,18
671	xor	30,30,19
672	rotlwi	31,31,16
673	vadduwm	2,2,3
674	vadduwm	6,6,7
675	vadduwm	10,10,11
676	rotlwi	28,28,16
677	rotlwi	29,29,16
678	rotlwi	30,30,16
679	vxor	1,1,2
680	vxor	5,5,6
681	vxor	9,9,10
682	add	26,26,31
683	add	27,27,28
684	add	24,24,29
685	vrlw	1,1,27
686	vrlw	5,5,27
687	vrlw	9,9,27
688	add	25,25,30
689	xor	21,21,26
690	xor	22,22,27
691	vadduwm	0,0,1
692	vadduwm	4,4,5
693	vadduwm	8,8,9
694	xor	23,23,24
695	xor	20,20,25
696	rotlwi	21,21,12
697	vxor	3,3,0
698	vxor	7,7,4
699	vxor	11,11,8
700	rotlwi	22,22,12
701	rotlwi	23,23,12
702	rotlwi	20,20,12
703	vperm	3,3,3,23
704	vperm	7,7,7,23
705	vperm	11,11,11,23
706	add	16,16,21
707	add	17,17,22
708	add	18,18,23
709	vadduwm	2,2,3
710	vadduwm	6,6,7
711	vadduwm	10,10,11
712	add	19,19,20
713	xor	31,31,16
714	xor	28,28,17
715	vxor	1,1,2
716	vxor	5,5,6
717	vxor	9,9,10
718	xor	29,29,18
719	xor	30,30,19
720	rotlwi	31,31,8
721	vrlw	1,1,28
722	vrlw	5,5,28
723	vrlw	9,9,28
724	rotlwi	28,28,8
725	rotlwi	29,29,8
726	rotlwi	30,30,8
727	vsldoi	2,2,2, 16-8
728	vsldoi	6,6,6, 16-8
729	vsldoi	10,10,10, 16-8
730	add	26,26,31
731	add	27,27,28
732	add	24,24,29
733	vsldoi	1,1,1, 16-4
734	vsldoi	5,5,5, 16-4
735	vsldoi	9,9,9, 16-4
736	add	25,25,30
737	xor	21,21,26
738	xor	22,22,27
739	vsldoi	3,3,3, 16-12
740	vsldoi	7,7,7, 16-12
741	vsldoi	11,11,11, 16-12
742	xor	23,23,24
743	xor	20,20,25
744	rotlwi	21,21,7
745	rotlwi	22,22,7
746	rotlwi	23,23,7
747	rotlwi	20,20,7
748	bc	16,0,.Loop_vmx
749
750	subi	5,5,256
751	addi	16,16,0x7865
752	addi	17,17,0x646e
753	addi	18,18,0x2d32
754	addi	19,19,0x6574
755	addis	16,16,0x6170
756	addis	17,17,0x3320
757	addis	18,18,0x7962
758	addis	19,19,0x6b20
759	add	20,20,7
760	lwz	7,16(6)
761	add	21,21,8
762	lwz	8,20(6)
763	add	22,22,9
764	lwz	9,24(6)
765	add	23,23,10
766	lwz	10,28(6)
767	add	24,24,7
768	add	25,25,8
769	add	26,26,9
770	add	27,27,10
771	add	28,28,11
772	add	29,29,12
773	add	30,30,14
774	add	31,31,15
775
776	vadduwm	0,0,12
777	vadduwm	4,4,12
778	vadduwm	8,8,12
779	vadduwm	1,1,13
780	vadduwm	5,5,13
781	vadduwm	9,9,13
782	vadduwm	2,2,14
783	vadduwm	6,6,14
784	vadduwm	10,10,14
785	vadduwm	3,3,15
786	vadduwm	7,7,16
787	vadduwm	11,11,17
788
789	addi	11,11,4
790	vadduwm	15,15,18
791	vadduwm	16,16,18
792	vadduwm	17,17,18
793
794	mr	7,16
795	rotlwi	16,16,8
796	rlwimi	16,7,24,0,7
797	rlwimi	16,7,24,16,23
798	mr	8,17
799	rotlwi	17,17,8
800	rlwimi	17,8,24,0,7
801	rlwimi	17,8,24,16,23
802	mr	9,18
803	rotlwi	18,18,8
804	rlwimi	18,9,24,0,7
805	rlwimi	18,9,24,16,23
806	mr	10,19
807	rotlwi	19,19,8
808	rlwimi	19,10,24,0,7
809	rlwimi	19,10,24,16,23
810	mr	7,20
811	rotlwi	20,20,8
812	rlwimi	20,7,24,0,7
813	rlwimi	20,7,24,16,23
814	mr	8,21
815	rotlwi	21,21,8
816	rlwimi	21,8,24,0,7
817	rlwimi	21,8,24,16,23
818	mr	9,22
819	rotlwi	22,22,8
820	rlwimi	22,9,24,0,7
821	rlwimi	22,9,24,16,23
822	mr	10,23
823	rotlwi	23,23,8
824	rlwimi	23,10,24,0,7
825	rlwimi	23,10,24,16,23
826	mr	7,24
827	rotlwi	24,24,8
828	rlwimi	24,7,24,0,7
829	rlwimi	24,7,24,16,23
830	mr	8,25
831	rotlwi	25,25,8
832	rlwimi	25,8,24,0,7
833	rlwimi	25,8,24,16,23
834	mr	9,26
835	rotlwi	26,26,8
836	rlwimi	26,9,24,0,7
837	rlwimi	26,9,24,16,23
838	mr	10,27
839	rotlwi	27,27,8
840	rlwimi	27,10,24,0,7
841	rlwimi	27,10,24,16,23
842	mr	7,28
843	rotlwi	28,28,8
844	rlwimi	28,7,24,0,7
845	rlwimi	28,7,24,16,23
846	mr	8,29
847	rotlwi	29,29,8
848	rlwimi	29,8,24,0,7
849	rlwimi	29,8,24,16,23
850	mr	9,30
851	rotlwi	30,30,8
852	rlwimi	30,9,24,0,7
853	rlwimi	30,9,24,16,23
854	mr	10,31
855	rotlwi	31,31,8
856	rlwimi	31,10,24,0,7
857	rlwimi	31,10,24,16,23
858	lwz	7,0(4)
859	lwz	8,4(4)
860	lwz	9,8(4)
861	lwz	10,12(4)
862	xor	16,16,7
863	lwz	7,16(4)
864	xor	17,17,8
865	lwz	8,20(4)
866	xor	18,18,9
867	lwz	9,24(4)
868	xor	19,19,10
869	lwz	10,28(4)
870	xor	20,20,7
871	lwz	7,32(4)
872	xor	21,21,8
873	lwz	8,36(4)
874	xor	22,22,9
875	lwz	9,40(4)
876	xor	23,23,10
877	lwz	10,44(4)
878	xor	24,24,7
879	lwz	7,48(4)
880	xor	25,25,8
881	lwz	8,52(4)
882	xor	26,26,9
883	lwz	9,56(4)
884	xor	27,27,10
885	lwz	10,60(4)
886	xor	28,28,7
887	stw	16,0(3)
888	xor	29,29,8
889	stw	17,4(3)
890	xor	30,30,9
891	stw	18,8(3)
892	xor	31,31,10
893	stw	19,12(3)
894	addi	4,4,64
895	stw	20,16(3)
896	li	7,16
897	stw	21,20(3)
898	li	8,32
899	stw	22,24(3)
900	li	9,48
901	stw	23,28(3)
902	li	10,64
903	stw	24,32(3)
904	stw	25,36(3)
905	stw	26,40(3)
906	stw	27,44(3)
907	stw	28,48(3)
908	stw	29,52(3)
909	stw	30,56(3)
910	stw	31,60(3)
911	addi	3,3,64
912
913	lvx	27,0,4
914	lvx	28,7,4
915	lvx	29,8,4
916	lvx	30,9,4
917	lvx	31,10,4
918	addi	4,4,64
919
920	vperm	27,27,28,24
921	vperm	28,28,29,24
922	vperm	29,29,30,24
923	vperm	30,30,31,24
924	vxor	0,0,27
925	vxor	1,1,28
926	lvx	28,7,4
927	vxor	2,2,29
928	lvx	29,8,4
929	vxor	3,3,30
930	lvx	30,9,4
931	lvx	27,10,4
932	addi	4,4,64
933	li	10,63
934	vperm	0,0,0,25
935	vperm	1,1,1,25
936	vperm	2,2,2,25
937	vperm	3,3,3,25
938
939	vperm	31,31,28,24
940	vperm	28,28,29,24
941	vperm	29,29,30,24
942	vperm	30,30,27,24
943	vxor	4,4,31
944	vxor	5,5,28
945	lvx	28,7,4
946	vxor	6,6,29
947	lvx	29,8,4
948	vxor	7,7,30
949	lvx	30,9,4
950	lvx	31,10,4
951	addi	4,4,64
952	vperm	4,4,4,25
953	vperm	5,5,5,25
954	vperm	6,6,6,25
955	vperm	7,7,7,25
956
957	vperm	27,27,28,24
958	vperm	28,28,29,24
959	vperm	29,29,30,24
960	vperm	30,30,31,24
961	vxor	8,8,27
962	vxor	9,9,28
963	vxor	10,10,29
964	vxor	11,11,30
965	vperm	8,8,8,25
966	vperm	9,9,9,25
967	vperm	10,10,10,25
968	vperm	11,11,11,25
969
970	andi.	17,3,15
971	mr	16,3
972
973	vsel	27,0,1,26
974	vsel	28,1,2,26
975	vsel	29,2,3,26
976	vsel	30,3,4,26
977	vsel	1,4,5,26
978	vsel	2,5,6,26
979	vsel	3,6,7,26
980	vsel	4,7,8,26
981	vsel	5,8,9,26
982	vsel	6,9,10,26
983	vsel	7,10,11,26
984
985
986	stvx	27,7,3
987	stvx	28,8,3
988	stvx	29,9,3
989	addi	3,3,64
990	stvx	30,0,3
991	stvx	1,7,3
992	stvx	2,8,3
993	stvx	3,9,3
994	addi	3,3,64
995	stvx	4,0,3
996	stvx	5,7,3
997	stvx	6,8,3
998	stvx	7,9,3
999	addi	3,3,64
1000
1001	beq	.Laligned_vmx
1002
1003	sub	18,3,17
1004	li	19,0
1005.Lunaligned_tail_vmx:
1006	stvebx	11,19,18
1007	addi	19,19,1
1008	cmpw	19,17
1009	bne	.Lunaligned_tail_vmx
1010
1011	sub	18,16,17
1012.Lunaligned_head_vmx:
1013	stvebx	0,17,18
1014	cmpwi	17,15
1015	addi	17,17,1
1016	bne	.Lunaligned_head_vmx
1017
1018	cmpldi	5,255
1019	bgt	.Loop_outer_vmx
1020
1021	b	.Ldone_vmx
1022
1023.align	4
1024.Laligned_vmx:
1025	stvx	0,0,16
1026
1027	cmpldi	5,255
1028	bgt	.Loop_outer_vmx
1029	nop
1030
1031.Ldone_vmx:
1032	cmpldi	5,0
1033	bnel	__ChaCha20_1x
1034
1035	lwz	12,268(1)
1036	li	10,127
1037	li	11,143
1038	mtspr	256,12
1039	lvx	23,10,1
1040	addi	10,10,32
1041	lvx	24,11,1
1042	addi	11,11,32
1043	lvx	25,10,1
1044	addi	10,10,32
1045	lvx	26,11,1
1046	addi	11,11,32
1047	lvx	27,10,1
1048	addi	10,10,32
1049	lvx	28,11,1
1050	addi	11,11,32
1051	lvx	29,10,1
1052	addi	10,10,32
1053	lvx	30,11,1
1054	lvx	31,10,1
1055	ld	0, 432(1)
1056	ld	14,272(1)
1057	ld	15,280(1)
1058	ld	16,288(1)
1059	ld	17,296(1)
1060	ld	18,304(1)
1061	ld	19,312(1)
1062	ld	20,320(1)
1063	ld	21,328(1)
1064	ld	22,336(1)
1065	ld	23,344(1)
1066	ld	24,352(1)
1067	ld	25,360(1)
1068	ld	26,368(1)
1069	ld	27,376(1)
1070	ld	28,384(1)
1071	ld	29,392(1)
1072	ld	30,400(1)
1073	ld	31,408(1)
1074	mtlr	0
1075	addi	1,1,416
1076	blr
1077.long	0
1078.byte	0,12,0x04,1,0x80,18,5,0
1079.long	0
1080
1081
1082.globl	ChaCha20_ctr32_vsx
1083.type	ChaCha20_ctr32_vsx,@function
1084.section	".opd","aw"
1085.align	3
1086ChaCha20_ctr32_vsx:
1087.quad	.ChaCha20_ctr32_vsx,.TOC.@tocbase,0
1088.previous
1089.align	5
1090.ChaCha20_ctr32_vsx:
1091	stdu	1,-224(1)
1092	mflr	0
1093	li	10,127
1094	li	11,143
1095	mfspr	12,256
1096	stvx	26,10,1
1097	addi	10,10,32
1098	stvx	27,11,1
1099	addi	11,11,32
1100	stvx	28,10,1
1101	addi	10,10,32
1102	stvx	29,11,1
1103	addi	11,11,32
1104	stvx	30,10,1
1105	stvx	31,11,1
1106	stw	12,220(1)
1107	li	12,-4096+63
1108	std	0, 240(1)
1109	mtspr	256,12
1110
1111	bl	.Lconsts
1112.long	0x7E006619
1113	addi	12,12,0x50
1114	li	8,16
1115	li	9,32
1116	li	10,48
1117	li	11,64
1118
1119.long	0x7E203619
1120.long	0x7E483619
1121.long	0x7E603E19
1122
1123	vxor	27,27,27
1124.long	0x7F8B6619
1125	vspltw	26,19,0
1126	vsldoi	19,19,27,4
1127	vsldoi	19,27,19,12
1128	vadduwm	26,26,28
1129
1130	lvsl	31,0,8
1131	vspltisb	27,3
1132	vxor	31,31,27
1133
1134	li	0,10
1135	mtctr	0
1136	b	.Loop_outer_vsx
1137
1138.align	5
1139.Loop_outer_vsx:
1140	lvx	0,0,12
1141	lvx	1,8,12
1142	lvx	2,9,12
1143	lvx	3,10,12
1144
1145	vspltw	4,17,0
1146	vspltw	5,17,1
1147	vspltw	6,17,2
1148	vspltw	7,17,3
1149
1150	vspltw	8,18,0
1151	vspltw	9,18,1
1152	vspltw	10,18,2
1153	vspltw	11,18,3
1154
1155	vor	12,26,26
1156	vspltw	13,19,1
1157	vspltw	14,19,2
1158	vspltw	15,19,3
1159
1160	vspltisw	27,-16
1161	vspltisw	28,12
1162	vspltisw	29,8
1163	vspltisw	30,7
1164
1165.Loop_vsx:
1166	vadduwm	0,0,4
1167	vadduwm	1,1,5
1168	vadduwm	2,2,6
1169	vadduwm	3,3,7
1170	vxor	12,12,0
1171	vxor	13,13,1
1172	vxor	14,14,2
1173	vxor	15,15,3
1174	vrlw	12,12,27
1175	vrlw	13,13,27
1176	vrlw	14,14,27
1177	vrlw	15,15,27
1178	vadduwm	8,8,12
1179	vadduwm	9,9,13
1180	vadduwm	10,10,14
1181	vadduwm	11,11,15
1182	vxor	4,4,8
1183	vxor	5,5,9
1184	vxor	6,6,10
1185	vxor	7,7,11
1186	vrlw	4,4,28
1187	vrlw	5,5,28
1188	vrlw	6,6,28
1189	vrlw	7,7,28
1190	vadduwm	0,0,4
1191	vadduwm	1,1,5
1192	vadduwm	2,2,6
1193	vadduwm	3,3,7
1194	vxor	12,12,0
1195	vxor	13,13,1
1196	vxor	14,14,2
1197	vxor	15,15,3
1198	vrlw	12,12,29
1199	vrlw	13,13,29
1200	vrlw	14,14,29
1201	vrlw	15,15,29
1202	vadduwm	8,8,12
1203	vadduwm	9,9,13
1204	vadduwm	10,10,14
1205	vadduwm	11,11,15
1206	vxor	4,4,8
1207	vxor	5,5,9
1208	vxor	6,6,10
1209	vxor	7,7,11
1210	vrlw	4,4,30
1211	vrlw	5,5,30
1212	vrlw	6,6,30
1213	vrlw	7,7,30
1214	vadduwm	0,0,5
1215	vadduwm	1,1,6
1216	vadduwm	2,2,7
1217	vadduwm	3,3,4
1218	vxor	15,15,0
1219	vxor	12,12,1
1220	vxor	13,13,2
1221	vxor	14,14,3
1222	vrlw	15,15,27
1223	vrlw	12,12,27
1224	vrlw	13,13,27
1225	vrlw	14,14,27
1226	vadduwm	10,10,15
1227	vadduwm	11,11,12
1228	vadduwm	8,8,13
1229	vadduwm	9,9,14
1230	vxor	5,5,10
1231	vxor	6,6,11
1232	vxor	7,7,8
1233	vxor	4,4,9
1234	vrlw	5,5,28
1235	vrlw	6,6,28
1236	vrlw	7,7,28
1237	vrlw	4,4,28
1238	vadduwm	0,0,5
1239	vadduwm	1,1,6
1240	vadduwm	2,2,7
1241	vadduwm	3,3,4
1242	vxor	15,15,0
1243	vxor	12,12,1
1244	vxor	13,13,2
1245	vxor	14,14,3
1246	vrlw	15,15,29
1247	vrlw	12,12,29
1248	vrlw	13,13,29
1249	vrlw	14,14,29
1250	vadduwm	10,10,15
1251	vadduwm	11,11,12
1252	vadduwm	8,8,13
1253	vadduwm	9,9,14
1254	vxor	5,5,10
1255	vxor	6,6,11
1256	vxor	7,7,8
1257	vxor	4,4,9
1258	vrlw	5,5,30
1259	vrlw	6,6,30
1260	vrlw	7,7,30
1261	vrlw	4,4,30
1262	bc	16,0,.Loop_vsx
1263
1264	vadduwm	12,12,26
1265
1266.long	0x13600F8C
1267.long	0x13821F8C
1268.long	0x10000E8C
1269.long	0x10421E8C
1270.long	0x13A42F8C
1271.long	0x13C63F8C
1272.long	0xF0201057
1273.long	0xF0601357
1274.long	0xF01BE057
1275.long	0xF05BE357
1276
1277.long	0x10842E8C
1278.long	0x10C63E8C
1279.long	0x13684F8C
1280.long	0x138A5F8C
1281.long	0xF0A43057
1282.long	0xF0E43357
1283.long	0xF09DF057
1284.long	0xF0DDF357
1285
1286.long	0x11084E8C
1287.long	0x114A5E8C
1288.long	0x13AC6F8C
1289.long	0x13CE7F8C
1290.long	0xF1285057
1291.long	0xF1685357
1292.long	0xF11BE057
1293.long	0xF15BE357
1294
1295.long	0x118C6E8C
1296.long	0x11CE7E8C
1297	vspltisw	27,4
1298	vadduwm	26,26,27
1299.long	0xF1AC7057
1300.long	0xF1EC7357
1301.long	0xF19DF057
1302.long	0xF1DDF357
1303
1304	vadduwm	0,0,16
1305	vadduwm	4,4,17
1306	vadduwm	8,8,18
1307	vadduwm	12,12,19
1308
1309	vperm	0,0,0,31
1310	vperm	4,4,4,31
1311	vperm	8,8,8,31
1312	vperm	12,12,12,31
1313
1314	cmpldi	5,0x40
1315	blt	.Ltail_vsx
1316
1317.long	0x7F602619
1318.long	0x7F882619
1319.long	0x7FA92619
1320.long	0x7FCA2619
1321
1322	vxor	27,27,0
1323	vxor	28,28,4
1324	vxor	29,29,8
1325	vxor	30,30,12
1326
1327.long	0x7F601F19
1328.long	0x7F881F19
1329	addi	4,4,0x40
1330.long	0x7FA91F19
1331	subi	5,5,0x40
1332.long	0x7FCA1F19
1333	addi	3,3,0x40
1334	beq	.Ldone_vsx
1335
1336	vadduwm	0,1,16
1337	vadduwm	4,5,17
1338	vadduwm	8,9,18
1339	vadduwm	12,13,19
1340
1341	vperm	0,0,0,31
1342	vperm	4,4,4,31
1343	vperm	8,8,8,31
1344	vperm	12,12,12,31
1345
1346	cmpldi	5,0x40
1347	blt	.Ltail_vsx
1348
1349.long	0x7F602619
1350.long	0x7F882619
1351.long	0x7FA92619
1352.long	0x7FCA2619
1353
1354	vxor	27,27,0
1355	vxor	28,28,4
1356	vxor	29,29,8
1357	vxor	30,30,12
1358
1359.long	0x7F601F19
1360.long	0x7F881F19
1361	addi	4,4,0x40
1362.long	0x7FA91F19
1363	subi	5,5,0x40
1364.long	0x7FCA1F19
1365	addi	3,3,0x40
1366	beq	.Ldone_vsx
1367
1368	vadduwm	0,2,16
1369	vadduwm	4,6,17
1370	vadduwm	8,10,18
1371	vadduwm	12,14,19
1372
1373	vperm	0,0,0,31
1374	vperm	4,4,4,31
1375	vperm	8,8,8,31
1376	vperm	12,12,12,31
1377
1378	cmpldi	5,0x40
1379	blt	.Ltail_vsx
1380
1381.long	0x7F602619
1382.long	0x7F882619
1383.long	0x7FA92619
1384.long	0x7FCA2619
1385
1386	vxor	27,27,0
1387	vxor	28,28,4
1388	vxor	29,29,8
1389	vxor	30,30,12
1390
1391.long	0x7F601F19
1392.long	0x7F881F19
1393	addi	4,4,0x40
1394.long	0x7FA91F19
1395	subi	5,5,0x40
1396.long	0x7FCA1F19
1397	addi	3,3,0x40
1398	beq	.Ldone_vsx
1399
1400	vadduwm	0,3,16
1401	vadduwm	4,7,17
1402	vadduwm	8,11,18
1403	vadduwm	12,15,19
1404
1405	vperm	0,0,0,31
1406	vperm	4,4,4,31
1407	vperm	8,8,8,31
1408	vperm	12,12,12,31
1409
1410	cmpldi	5,0x40
1411	blt	.Ltail_vsx
1412
1413.long	0x7F602619
1414.long	0x7F882619
1415.long	0x7FA92619
1416.long	0x7FCA2619
1417
1418	vxor	27,27,0
1419	vxor	28,28,4
1420	vxor	29,29,8
1421	vxor	30,30,12
1422
1423.long	0x7F601F19
1424.long	0x7F881F19
1425	addi	4,4,0x40
1426.long	0x7FA91F19
1427	subi	5,5,0x40
1428.long	0x7FCA1F19
1429	addi	3,3,0x40
1430	mtctr	0
1431	bne	.Loop_outer_vsx
1432
1433.Ldone_vsx:
1434	lwz	12,220(1)
1435	li	10,127
1436	li	11,143
1437	ld	0, 240(1)
1438	mtspr	256,12
1439	lvx	26,10,1
1440	addi	10,10,32
1441	lvx	27,11,1
1442	addi	11,11,32
1443	lvx	28,10,1
1444	addi	10,10,32
1445	lvx	29,11,1
1446	addi	11,11,32
1447	lvx	30,10,1
1448	lvx	31,11,1
1449	mtlr	0
1450	addi	1,1,224
1451	blr
1452
1453.align	4
1454.Ltail_vsx:
1455	addi	11,1,48
1456	mtctr	5
1457.long	0x7C005F19
1458.long	0x7C885F19
1459.long	0x7D095F19
1460.long	0x7D8A5F19
1461	subi	12,11,1
1462	subi	4,4,1
1463	subi	3,3,1
1464
1465.Loop_tail_vsx:
1466	lbzu	6,1(12)
1467	lbzu	7,1(4)
1468	xor	6,6,7
1469	stbu	6,1(3)
1470	bc	16,0,.Loop_tail_vsx
1471
1472.long	0x7E005F19
1473.long	0x7E085F19
1474.long	0x7E095F19
1475.long	0x7E0A5F19
1476
1477	b	.Ldone_vsx
1478.long	0
1479.byte	0,12,0x04,1,0x80,0,5,0
1480.long	0
1481
1482.align	5
1483.Lconsts:
1484	mflr	0
1485	bcl	20,31,$+4
1486	mflr	12
1487	addi	12,12,56
1488	mtlr	0
1489	blr
1490.long	0
1491.byte	0,12,0x14,0,0,0,0,0
1492.space	28
1493.Lsigma:
1494.long	0x61707865,0x3320646e,0x79622d32,0x6b206574
1495.long	1,0,0,0
1496.long	4,0,0,0
1497.long	0x02030001,0x06070405,0x0a0b0809,0x0e0f0c0d
1498.long	0x01020300,0x05060704,0x090a0b08,0x0d0e0f0c
1499.long	0x61707865,0x61707865,0x61707865,0x61707865
1500.long	0x3320646e,0x3320646e,0x3320646e,0x3320646e
1501.long	0x79622d32,0x79622d32,0x79622d32,0x79622d32
1502.long	0x6b206574,0x6b206574,0x6b206574,0x6b206574
1503.long	0,1,2,3
1504.byte	67,104,97,67,104,97,50,48,32,102,111,114,32,80,111,119,101,114,80,67,47,65,108,116,105,86,101,99,44,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
1505.align	2
1506.align	2
1507