1 .csect	.text[PR],7
2 
3 
4 .align	5
5 KeccakF1600_int:
6 	li	0,24
7 	mtctr	0
8 	b	Loop
9 .align	4
10 Loop:
11 	xor	0,7,12
12 	std	11,96(1)
13 	xor	3,8,6
14 	std	16,104(1)
15 	xor	4,9,14
16 	std	21,112(1)
17 	xor	5,10,15
18 	std	26,120(1)
19 	xor	11,11,16
20 	xor	0,0,17
21 	xor	3,3,18
22 	xor	4,4,19
23 	xor	5,5,20
24 	xor	11,11,21
25 	xor	0,0,22
26 	xor	3,3,23
27 	xor	4,4,24
28 	xor	5,5,25
29 	xor	11,11,26
30 	xor	0,0,27
31 	xor	4,4,29
32 	xor	3,3,28
33 	xor	5,5,30
34 	rotldi	16,4,1
35 	xor	11,11,31
36 	rotldi	21,5,1
37 	xor	16,16,0
38 	rotldi	26,11,1
39 
40 	xor	8,8,16
41 	xor	6,6,16
42 	xor	18,18,16
43 	xor	23,23,16
44 	xor	28,28,16
45 
46 	rotldi	16,0,1
47 	xor	21,21,3
48 	xor	4,4,26
49 	rotldi	26,3,1
50 	xor	5,5,16
51 	xor	11,11,26
52 
53 	xor	3,   9,21
54 	xor	14,14,21
55 	xor	19,19,21
56 	xor	24,24,21
57 	xor	29,29,21
58 
59 	xor	7,7,11
60 	xor	12,12,11
61 	xor	17,17,11
62 	xor	22,22,11
63 	xor	27,27,11
64 	ld	11,96(1)
65 	xor	0,   10,4
66 	ld	16,104(1)
67 	xor	15,15,4
68 	ld	21,112(1)
69 	xor	20,20,4
70 	ld	26,120(1)
71 	xor	25,25,4
72 	xor	30,30,4
73 
74 	xor	4,   11,5
75 	xor	16,16,5
76 	xor	21,21,5
77 	xor	26,26,5
78 	xor	31,31,5
79 
80 	mr	5,8
81 	rotldi	8,6,44
82 
83 	rotldi	9,19,43
84 
85 	rotldi	10,25,21
86 
87 	rotldi	11,31,14
88 
89 	rotldi	6,16,20
90 	rotldi	19,20,25
91 	rotldi	25,24,15
92 	rotldi	31,28,2
93 
94 	rotldi	16,29,61
95 	rotldi	20,26,8
96 	rotldi	24,18,10
97 	rotldi	28,15,55
98 
99 	rotldi	29,21,39
100 	rotldi	26,30,56
101 	rotldi	18,14,6
102 	rotldi	15,23,45
103 
104 	rotldi	21,27,18
105 	rotldi	30,22,41
106 	rotldi	14,17,3
107 	rotldi	23,12,36
108 
109 	rotldi	12,0,28
110 	rotldi	17,5,1
111 	rotldi	22,4,27
112 	rotldi	27,3,62
113 
114 	andc	0,9,8
115 	andc	3,10,9
116 	andc	4,7,11
117 	andc	5,8,7
118 	xor	7,7,0
119 	andc	0,11,10
120 	xor	8,8,3
121 	ld	3,80(1)
122 	xor	10,10,4
123 	xor	11,11,5
124 	xor	9,9,0
125 	ldu	5,8(3)
126 
127 	andc	0,14,6
128 	std	3,80(1)
129 	andc	3,15,14
130 	andc	4,12,16
131 	xor	7,7,5
132 	andc	5,6,12
133 	xor	12,12,0
134 	andc	0,16,15
135 	xor	6,6,3
136 	xor	15,15,4
137 	xor	16,16,5
138 	xor	14,14,0
139 
140 	andc	0,19,18
141 	andc	3,20,19
142 	andc	4,17,21
143 	andc	5,18,17
144 	xor	17,17,0
145 	andc	0,21,20
146 	xor	18,18,3
147 	xor	20,20,4
148 	xor	21,21,5
149 	xor	19,19,0
150 
151 	andc	0,24,23
152 	andc	3,25,24
153 	andc	4,22,26
154 	andc	5,23,22
155 	xor	22,22,0
156 	andc	0,26,25
157 	xor	23,23,3
158 	xor	25,25,4
159 	xor	26,26,5
160 	xor	24,24,0
161 
162 	andc	0,29,28
163 	andc	3,30,29
164 	andc	4,27,31
165 	andc	5,28,27
166 	xor	27,27,0
167 	andc	0,31,30
168 	xor	28,28,3
169 	xor	30,30,4
170 	xor	31,31,5
171 	xor	29,29,0
172 
173 	bc	16,0,Loop
174 
175 	blr
176 .long	0
177 .byte	0,12,0x14,0,0,0,0,0
178 
179 
180 
181 .align	5
182 KeccakF1600:
183 	stdu	1,-272(1)
184 	mflr	0
185 	std	14,128(1)
186 	std	15,136(1)
187 	std	16,144(1)
188 	std	17,152(1)
189 	std	18,160(1)
190 	std	19,168(1)
191 	std	20,176(1)
192 	std	21,184(1)
193 	std	22,192(1)
194 	std	23,200(1)
195 	std	24,208(1)
196 	std	25,216(1)
197 	std	26,224(1)
198 	std	27,232(1)
199 	std	28,240(1)
200 	std	29,248(1)
201 	std	30,256(1)
202 	std	31,264(1)
203 	std	0,288(1)
204 
205 	bl	PICmeup
206 	subi	12,12,8
207 
208 	std	3,48(1)
209 
210 
211 
212 	std	12,80(1)
213 
214 	ld	7,0(3)
215 	ld	8,8(3)
216 	ld	9,16(3)
217 	ld	10,24(3)
218 	ld	11,32(3)
219 	ld	12,40(3)
220 	ld	6,48(3)
221 	ld	14,56(3)
222 	ld	15,64(3)
223 	ld	16,72(3)
224 	ld	17,80(3)
225 	ld	18,88(3)
226 	ld	19,96(3)
227 	ld	20,104(3)
228 	ld	21,112(3)
229 	ld	22,120(3)
230 	ld	23,128(3)
231 	ld	24,136(3)
232 	ld	25,144(3)
233 	ld	26,152(3)
234 	ld	27,160(3)
235 	ld	28,168(3)
236 	ld	29,176(3)
237 	ld	30,184(3)
238 	ld	31,192(3)
239 
240 	bl	KeccakF1600_int
241 
242 	ld	3,48(1)
243 	std	7,0(3)
244 	std	8,8(3)
245 	std	9,16(3)
246 	std	10,24(3)
247 	std	11,32(3)
248 	std	12,40(3)
249 	std	6,48(3)
250 	std	14,56(3)
251 	std	15,64(3)
252 	std	16,72(3)
253 	std	17,80(3)
254 	std	18,88(3)
255 	std	19,96(3)
256 	std	20,104(3)
257 	std	21,112(3)
258 	std	22,120(3)
259 	std	23,128(3)
260 	std	24,136(3)
261 	std	25,144(3)
262 	std	26,152(3)
263 	std	27,160(3)
264 	std	28,168(3)
265 	std	29,176(3)
266 	std	30,184(3)
267 	std	31,192(3)
268 
269 	ld	0,288(1)
270 	ld	14,128(1)
271 	ld	15,136(1)
272 	ld	16,144(1)
273 	ld	17,152(1)
274 	ld	18,160(1)
275 	ld	19,168(1)
276 	ld	20,176(1)
277 	ld	21,184(1)
278 	ld	22,192(1)
279 	ld	23,200(1)
280 	ld	24,208(1)
281 	ld	25,216(1)
282 	ld	26,224(1)
283 	ld	27,232(1)
284 	ld	28,240(1)
285 	ld	29,248(1)
286 	ld	30,256(1)
287 	ld	31,264(1)
288 	mtlr	0
289 	addi	1,1,272
290 	blr
291 .long	0
292 .byte	0,12,4,1,0x80,18,1,0
293 .long	0
294 
295 
296 
297 .align	5
298 dword_le_load:
299 	lbz	0,1(3)
300 	lbz	4,2(3)
301 	lbz	5,3(3)
302 	insrdi	0,4,8,48
303 	lbz	4,4(3)
304 	insrdi	0,5,8,40
305 	lbz	5,5(3)
306 	insrdi	0,4,8,32
307 	lbz	4,6(3)
308 	insrdi	0,5,8,24
309 	lbz	5,7(3)
310 	insrdi	0,4,8,16
311 	lbzu	4,8(3)
312 	insrdi	0,5,8,8
313 	insrdi	0,4,8,0
314 	blr
315 .long	0
316 .byte	0,12,0x14,0,0,0,1,0
317 .long	0
318 
319 
320 .globl	.SHA3_absorb
321 
322 .align	5
323 .SHA3_absorb:
324 	stdu	1,-272(1)
325 	mflr	0
326 	std	14,128(1)
327 	std	15,136(1)
328 	std	16,144(1)
329 	std	17,152(1)
330 	std	18,160(1)
331 	std	19,168(1)
332 	std	20,176(1)
333 	std	21,184(1)
334 	std	22,192(1)
335 	std	23,200(1)
336 	std	24,208(1)
337 	std	25,216(1)
338 	std	26,224(1)
339 	std	27,232(1)
340 	std	28,240(1)
341 	std	29,248(1)
342 	std	30,256(1)
343 	std	31,264(1)
344 	std	0,288(1)
345 
346 	bl	PICmeup
347 	subi	4,4,1
348 	subi	12,12,8
349 
350 	std	3,48(1)
351 	std	4,56(1)
352 	std	5,64(1)
353 	std	6,72(1)
354 	mr	0,6
355 	std	12,80(1)
356 
357 	ld	7,0(3)
358 	ld	8,8(3)
359 	ld	9,16(3)
360 	ld	10,24(3)
361 	ld	11,32(3)
362 	ld	12,40(3)
363 	ld	6,48(3)
364 	ld	14,56(3)
365 	ld	15,64(3)
366 	ld	16,72(3)
367 	ld	17,80(3)
368 	ld	18,88(3)
369 	ld	19,96(3)
370 	ld	20,104(3)
371 	ld	21,112(3)
372 	ld	22,120(3)
373 	ld	23,128(3)
374 	ld	24,136(3)
375 	ld	25,144(3)
376 	ld	26,152(3)
377 	ld	27,160(3)
378 	ld	28,168(3)
379 	ld	29,176(3)
380 	ld	30,184(3)
381 	ld	31,192(3)
382 
383 	mr	3,4
384 	mr	4,5
385 	mr	5,0
386 
387 	b	Loop_absorb
388 
389 .align	4
390 Loop_absorb:
391 	cmpld	4,5
392 	blt	Labsorbed
393 
394 	sub	4,4,5
395 	srwi	5,5,3
396 	std	4,64(1)
397 	mtctr	5
398 	bl	dword_le_load
399 	xor	7,7,0
400 	bdz	Lprocess_block
401 	bl	dword_le_load
402 	xor	8,8,0
403 	bdz	Lprocess_block
404 	bl	dword_le_load
405 	xor	9,9,0
406 	bdz	Lprocess_block
407 	bl	dword_le_load
408 	xor	10,10,0
409 	bdz	Lprocess_block
410 	bl	dword_le_load
411 	xor	11,11,0
412 	bdz	Lprocess_block
413 	bl	dword_le_load
414 	xor	12,12,0
415 	bdz	Lprocess_block
416 	bl	dword_le_load
417 	xor	6,6,0
418 	bdz	Lprocess_block
419 	bl	dword_le_load
420 	xor	14,14,0
421 	bdz	Lprocess_block
422 	bl	dword_le_load
423 	xor	15,15,0
424 	bdz	Lprocess_block
425 	bl	dword_le_load
426 	xor	16,16,0
427 	bdz	Lprocess_block
428 	bl	dword_le_load
429 	xor	17,17,0
430 	bdz	Lprocess_block
431 	bl	dword_le_load
432 	xor	18,18,0
433 	bdz	Lprocess_block
434 	bl	dword_le_load
435 	xor	19,19,0
436 	bdz	Lprocess_block
437 	bl	dword_le_load
438 	xor	20,20,0
439 	bdz	Lprocess_block
440 	bl	dword_le_load
441 	xor	21,21,0
442 	bdz	Lprocess_block
443 	bl	dword_le_load
444 	xor	22,22,0
445 	bdz	Lprocess_block
446 	bl	dword_le_load
447 	xor	23,23,0
448 	bdz	Lprocess_block
449 	bl	dword_le_load
450 	xor	24,24,0
451 	bdz	Lprocess_block
452 	bl	dword_le_load
453 	xor	25,25,0
454 	bdz	Lprocess_block
455 	bl	dword_le_load
456 	xor	26,26,0
457 	bdz	Lprocess_block
458 	bl	dword_le_load
459 	xor	27,27,0
460 	bdz	Lprocess_block
461 	bl	dword_le_load
462 	xor	28,28,0
463 	bdz	Lprocess_block
464 	bl	dword_le_load
465 	xor	29,29,0
466 	bdz	Lprocess_block
467 	bl	dword_le_load
468 	xor	30,30,0
469 	bdz	Lprocess_block
470 	bl	dword_le_load
471 	xor	31,31,0
472 
473 Lprocess_block:
474 	std	3,56(1)
475 
476 	bl	KeccakF1600_int
477 
478 	ld	0,80(1)
479 	ld	5,72(1)
480 	ld	4,64(1)
481 	ld	3,56(1)
482 	addic	0,0,-192
483 	std	0,80(1)
484 
485 	b	Loop_absorb
486 
487 .align	4
488 Labsorbed:
489 	ld	3,48(1)
490 	std	7,0(3)
491 	std	8,8(3)
492 	std	9,16(3)
493 	std	10,24(3)
494 	std	11,32(3)
495 	std	12,40(3)
496 	std	6,48(3)
497 	std	14,56(3)
498 	std	15,64(3)
499 	std	16,72(3)
500 	std	17,80(3)
501 	std	18,88(3)
502 	std	19,96(3)
503 	std	20,104(3)
504 	std	21,112(3)
505 	std	22,120(3)
506 	std	23,128(3)
507 	std	24,136(3)
508 	std	25,144(3)
509 	std	26,152(3)
510 	std	27,160(3)
511 	std	28,168(3)
512 	std	29,176(3)
513 	std	30,184(3)
514 	std	31,192(3)
515 
516 	mr	3,4
517 	ld	0,288(1)
518 	ld	14,128(1)
519 	ld	15,136(1)
520 	ld	16,144(1)
521 	ld	17,152(1)
522 	ld	18,160(1)
523 	ld	19,168(1)
524 	ld	20,176(1)
525 	ld	21,184(1)
526 	ld	22,192(1)
527 	ld	23,200(1)
528 	ld	24,208(1)
529 	ld	25,216(1)
530 	ld	26,224(1)
531 	ld	27,232(1)
532 	ld	28,240(1)
533 	ld	29,248(1)
534 	ld	30,256(1)
535 	ld	31,264(1)
536 	mtlr	0
537 	addi	1,1,272
538 	blr
539 .long	0
540 .byte	0,12,4,1,0x80,18,4,0
541 .long	0
542 
543 .globl	.SHA3_squeeze
544 
545 .align	5
546 .SHA3_squeeze:
547 	stdu	1,-80(1)
548 	mflr	0
549 	std	28,48(1)
550 	std	29,56(1)
551 	std	30,64(1)
552 	std	31,72(1)
553 	std	0,96(1)
554 
555 	mr	28,3
556 	subi	3,3,8
557 	subi	29,4,1
558 	mr	30,5
559 	mr	31,6
560 	b	Loop_squeeze
561 
562 .align	4
563 Loop_squeeze:
564 	ldu	0,8(3)
565 	cmpldi	30,8
566 	blt	Lsqueeze_tail
567 
568 	stb	0,1(29)
569 	srdi	0,0,8
570 	stb	0,2(29)
571 	srdi	0,0,8
572 	stb	0,3(29)
573 	srdi	0,0,8
574 	stb	0,4(29)
575 	srdi	0,0,8
576 	stb	0,5(29)
577 	srdi	0,0,8
578 	stb	0,6(29)
579 	srdi	0,0,8
580 	stb	0,7(29)
581 	srdi	0,0,8
582 	stbu	0,8(29)
583 
584 	subic.	30,30,8
585 	beq	Lsqueeze_done
586 
587 	subic.	6,6,8
588 	bgt	Loop_squeeze
589 
590 	mr	3,28
591 	bl	KeccakF1600
592 	subi	3,28,8
593 	mr	6,31
594 	b	Loop_squeeze
595 
596 .align	4
597 Lsqueeze_tail:
598 	mtctr	30
599 Loop_tail:
600 	stbu	0,1(29)
601 	srdi	0,0,8
602 	bc	16,0,Loop_tail
603 
604 Lsqueeze_done:
605 	ld	0,96(1)
606 	ld	28,48(1)
607 	ld	29,56(1)
608 	ld	30,64(1)
609 	ld	31,72(1)
610 	mtlr	0
611 	addi	1,1,80
612 	blr
613 .long	0
614 .byte	0,12,4,1,0x80,4,4,0
615 .long	0
616 
617 .align	6
618 PICmeup:
619 	mflr	0
620 	bcl	20,31,$+4
621 	mflr	12
622 	addi	12,12,56
623 	mtlr	0
624 	blr
625 .long	0
626 .byte	0,12,0x14,0,0,0,0,0
627 .space	28
628 
629 iotas:
630 .long	0x00000000,0x00000001
631 .long	0x00000000,0x00008082
632 .long	0x80000000,0x0000808a
633 .long	0x80000000,0x80008000
634 .long	0x00000000,0x0000808b
635 .long	0x00000000,0x80000001
636 .long	0x80000000,0x80008081
637 .long	0x80000000,0x00008009
638 .long	0x00000000,0x0000008a
639 .long	0x00000000,0x00000088
640 .long	0x00000000,0x80008009
641 .long	0x00000000,0x8000000a
642 .long	0x00000000,0x8000808b
643 .long	0x80000000,0x0000008b
644 .long	0x80000000,0x00008089
645 .long	0x80000000,0x00008003
646 .long	0x80000000,0x00008002
647 .long	0x80000000,0x00000080
648 .long	0x00000000,0x0000800a
649 .long	0x80000000,0x8000000a
650 .long	0x80000000,0x80008081
651 .long	0x80000000,0x00008080
652 .long	0x00000000,0x80000001
653 .long	0x80000000,0x80008008
654 
655 .byte	75,101,99,99,97,107,45,49,54,48,48,32,97,98,115,111,114,98,32,97,110,100,32,115,113,117,101,101,122,101,32,102,111,114,32,80,80,67,54,52,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
656 .align	2
657