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