1.text
2
3
4.align	5
5KeccakF1600_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
182KeccakF1600:
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
298dword_le_load:
299	lbzu	0,1(3)
300	lbzu	4,1(3)
301	lbzu	5,1(3)
302	insrdi	0,4,8,48
303	lbzu	4,1(3)
304	insrdi	0,5,8,40
305	lbzu	5,1(3)
306	insrdi	0,4,8,32
307	lbzu	4,1(3)
308	insrdi	0,5,8,24
309	lbzu	5,1(3)
310	insrdi	0,4,8,16
311	lbzu	4,1(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.type	SHA3_absorb,@function
322.section	".opd","aw"
323.align	3
324SHA3_absorb:
325.quad	.SHA3_absorb,.TOC.@tocbase,0
326.previous
327
328.align	5
329.SHA3_absorb:
330	stdu	1,-272(1)
331	mflr	0
332	std	14,128(1)
333	std	15,136(1)
334	std	16,144(1)
335	std	17,152(1)
336	std	18,160(1)
337	std	19,168(1)
338	std	20,176(1)
339	std	21,184(1)
340	std	22,192(1)
341	std	23,200(1)
342	std	24,208(1)
343	std	25,216(1)
344	std	26,224(1)
345	std	27,232(1)
346	std	28,240(1)
347	std	29,248(1)
348	std	30,256(1)
349	std	31,264(1)
350	std	0,288(1)
351
352	bl	PICmeup
353	subi	4,4,1
354	subi	12,12,8
355
356	std	3,48(1)
357	std	4,56(1)
358	std	5,64(1)
359	std	6,72(1)
360	mr	0,6
361	std	12,80(1)
362
363	ld	7,0(3)
364	ld	8,8(3)
365	ld	9,16(3)
366	ld	10,24(3)
367	ld	11,32(3)
368	ld	12,40(3)
369	ld	6,48(3)
370	ld	14,56(3)
371	ld	15,64(3)
372	ld	16,72(3)
373	ld	17,80(3)
374	ld	18,88(3)
375	ld	19,96(3)
376	ld	20,104(3)
377	ld	21,112(3)
378	ld	22,120(3)
379	ld	23,128(3)
380	ld	24,136(3)
381	ld	25,144(3)
382	ld	26,152(3)
383	ld	27,160(3)
384	ld	28,168(3)
385	ld	29,176(3)
386	ld	30,184(3)
387	ld	31,192(3)
388
389	mr	3,4
390	mr	4,5
391	mr	5,0
392
393	b	.Loop_absorb
394
395.align	4
396.Loop_absorb:
397	cmpld	4,5
398	blt	.Labsorbed
399
400	sub	4,4,5
401	srwi	5,5,3
402	std	4,64(1)
403	mtctr	5
404	bl	dword_le_load
405	xor	7,7,0
406	bdz	.Lprocess_block
407	bl	dword_le_load
408	xor	8,8,0
409	bdz	.Lprocess_block
410	bl	dword_le_load
411	xor	9,9,0
412	bdz	.Lprocess_block
413	bl	dword_le_load
414	xor	10,10,0
415	bdz	.Lprocess_block
416	bl	dword_le_load
417	xor	11,11,0
418	bdz	.Lprocess_block
419	bl	dword_le_load
420	xor	12,12,0
421	bdz	.Lprocess_block
422	bl	dword_le_load
423	xor	6,6,0
424	bdz	.Lprocess_block
425	bl	dword_le_load
426	xor	14,14,0
427	bdz	.Lprocess_block
428	bl	dword_le_load
429	xor	15,15,0
430	bdz	.Lprocess_block
431	bl	dword_le_load
432	xor	16,16,0
433	bdz	.Lprocess_block
434	bl	dword_le_load
435	xor	17,17,0
436	bdz	.Lprocess_block
437	bl	dword_le_load
438	xor	18,18,0
439	bdz	.Lprocess_block
440	bl	dword_le_load
441	xor	19,19,0
442	bdz	.Lprocess_block
443	bl	dword_le_load
444	xor	20,20,0
445	bdz	.Lprocess_block
446	bl	dword_le_load
447	xor	21,21,0
448	bdz	.Lprocess_block
449	bl	dword_le_load
450	xor	22,22,0
451	bdz	.Lprocess_block
452	bl	dword_le_load
453	xor	23,23,0
454	bdz	.Lprocess_block
455	bl	dword_le_load
456	xor	24,24,0
457	bdz	.Lprocess_block
458	bl	dword_le_load
459	xor	25,25,0
460	bdz	.Lprocess_block
461	bl	dword_le_load
462	xor	26,26,0
463	bdz	.Lprocess_block
464	bl	dword_le_load
465	xor	27,27,0
466	bdz	.Lprocess_block
467	bl	dword_le_load
468	xor	28,28,0
469	bdz	.Lprocess_block
470	bl	dword_le_load
471	xor	29,29,0
472	bdz	.Lprocess_block
473	bl	dword_le_load
474	xor	30,30,0
475	bdz	.Lprocess_block
476	bl	dword_le_load
477	xor	31,31,0
478
479.Lprocess_block:
480	std	3,56(1)
481
482	bl	KeccakF1600_int
483
484	ld	0,80(1)
485	ld	5,72(1)
486	ld	4,64(1)
487	ld	3,56(1)
488	addic	0,0,-192
489	std	0,80(1)
490
491	b	.Loop_absorb
492
493.align	4
494.Labsorbed:
495	ld	3,48(1)
496	std	7,0(3)
497	std	8,8(3)
498	std	9,16(3)
499	std	10,24(3)
500	std	11,32(3)
501	std	12,40(3)
502	std	6,48(3)
503	std	14,56(3)
504	std	15,64(3)
505	std	16,72(3)
506	std	17,80(3)
507	std	18,88(3)
508	std	19,96(3)
509	std	20,104(3)
510	std	21,112(3)
511	std	22,120(3)
512	std	23,128(3)
513	std	24,136(3)
514	std	25,144(3)
515	std	26,152(3)
516	std	27,160(3)
517	std	28,168(3)
518	std	29,176(3)
519	std	30,184(3)
520	std	31,192(3)
521
522	mr	3,4
523	ld	0,288(1)
524	ld	14,128(1)
525	ld	15,136(1)
526	ld	16,144(1)
527	ld	17,152(1)
528	ld	18,160(1)
529	ld	19,168(1)
530	ld	20,176(1)
531	ld	21,184(1)
532	ld	22,192(1)
533	ld	23,200(1)
534	ld	24,208(1)
535	ld	25,216(1)
536	ld	26,224(1)
537	ld	27,232(1)
538	ld	28,240(1)
539	ld	29,248(1)
540	ld	30,256(1)
541	ld	31,264(1)
542	mtlr	0
543	addi	1,1,272
544	blr
545.long	0
546.byte	0,12,4,1,0x80,18,4,0
547.long	0
548
549.globl	SHA3_squeeze
550.type	SHA3_squeeze,@function
551.section	".opd","aw"
552.align	3
553SHA3_squeeze:
554.quad	.SHA3_squeeze,.TOC.@tocbase,0
555.previous
556
557.align	5
558.SHA3_squeeze:
559	stdu	1,-80(1)
560	mflr	0
561	std	28,48(1)
562	std	29,56(1)
563	std	30,64(1)
564	std	31,72(1)
565	std	0,96(1)
566
567	mr	28,3
568	subi	3,3,8
569	subi	29,4,1
570	mr	30,5
571	mr	31,6
572	b	.Loop_squeeze
573
574.align	4
575.Loop_squeeze:
576	ldu	0,8(3)
577	cmpldi	30,8
578	blt	.Lsqueeze_tail
579
580	stbu	0,1(29)
581	srdi	0,0,8
582	stbu	0,1(29)
583	srdi	0,0,8
584	stbu	0,1(29)
585	srdi	0,0,8
586	stbu	0,1(29)
587	srdi	0,0,8
588	stbu	0,1(29)
589	srdi	0,0,8
590	stbu	0,1(29)
591	srdi	0,0,8
592	stbu	0,1(29)
593	srdi	0,0,8
594	stbu	0,1(29)
595
596	subic.	30,30,8
597	beq	.Lsqueeze_done
598
599	subic.	6,6,8
600	bgt	.Loop_squeeze
601
602	mr	3,28
603	bl	KeccakF1600
604	subi	3,28,8
605	mr	6,31
606	b	.Loop_squeeze
607
608.align	4
609.Lsqueeze_tail:
610	mtctr	30
611.Loop_tail:
612	stbu	0,1(29)
613	srdi	0,0,8
614	bc	16,0,.Loop_tail
615
616.Lsqueeze_done:
617	ld	0,96(1)
618	ld	28,48(1)
619	ld	29,56(1)
620	ld	30,64(1)
621	ld	31,72(1)
622	mtlr	0
623	addi	1,1,80
624	blr
625.long	0
626.byte	0,12,4,1,0x80,4,4,0
627.long	0
628
629.align	6
630PICmeup:
631	mflr	0
632	bcl	20,31,$+4
633	mflr	12
634	addi	12,12,56
635	mtlr	0
636	blr
637.long	0
638.byte	0,12,0x14,0,0,0,0,0
639.space	28
640
641iotas:
642.long	0x00000000,0x00000001
643.long	0x00000000,0x00008082
644.long	0x80000000,0x0000808a
645.long	0x80000000,0x80008000
646.long	0x00000000,0x0000808b
647.long	0x00000000,0x80000001
648.long	0x80000000,0x80008081
649.long	0x80000000,0x00008009
650.long	0x00000000,0x0000008a
651.long	0x00000000,0x00000088
652.long	0x00000000,0x80008009
653.long	0x00000000,0x8000000a
654.long	0x00000000,0x8000808b
655.long	0x80000000,0x0000008b
656.long	0x80000000,0x00008089
657.long	0x80000000,0x00008003
658.long	0x80000000,0x00008002
659.long	0x80000000,0x00000080
660.long	0x00000000,0x0000800a
661.long	0x80000000,0x8000000a
662.long	0x80000000,0x80008081
663.long	0x80000000,0x00008080
664.long	0x00000000,0x80000001
665.long	0x80000000,0x80008008
666
667.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
668.align	2
669