xref: /freebsd/sys/crypto/openssl/powerpc/aes-gcm-ppc.S (revision 7e97c6adffde3bd6f60f042ed2603335c005c6a7)
1/* Do not modify. This file is auto-generated from aes-gcm-ppc.pl. */
2.machine	"any"
3.text
4
5
6
7
8
9.macro	.Loop_aes_middle4x
10	xxlor	19+32, 1, 1
11	xxlor	20+32, 2, 2
12	xxlor	21+32, 3, 3
13	xxlor	22+32, 4, 4
14
15	.long	0x11EF9D08
16	.long	0x12109D08
17	.long	0x12319D08
18	.long	0x12529D08
19
20	.long	0x11EFA508
21	.long	0x1210A508
22	.long	0x1231A508
23	.long	0x1252A508
24
25	.long	0x11EFAD08
26	.long	0x1210AD08
27	.long	0x1231AD08
28	.long	0x1252AD08
29
30	.long	0x11EFB508
31	.long	0x1210B508
32	.long	0x1231B508
33	.long	0x1252B508
34
35	xxlor	19+32, 5, 5
36	xxlor	20+32, 6, 6
37	xxlor	21+32, 7, 7
38	xxlor	22+32, 8, 8
39
40	.long	0x11EF9D08
41	.long	0x12109D08
42	.long	0x12319D08
43	.long	0x12529D08
44
45	.long	0x11EFA508
46	.long	0x1210A508
47	.long	0x1231A508
48	.long	0x1252A508
49
50	.long	0x11EFAD08
51	.long	0x1210AD08
52	.long	0x1231AD08
53	.long	0x1252AD08
54
55	.long	0x11EFB508
56	.long	0x1210B508
57	.long	0x1231B508
58	.long	0x1252B508
59
60	xxlor	23+32, 9, 9
61	.long	0x11EFBD08
62	.long	0x1210BD08
63	.long	0x1231BD08
64	.long	0x1252BD08
65.endm
66
67
68
69
70
71.macro	.Loop_aes_middle8x
72	xxlor	23+32, 1, 1
73	xxlor	24+32, 2, 2
74	xxlor	25+32, 3, 3
75	xxlor	26+32, 4, 4
76
77	.long	0x11EFBD08
78	.long	0x1210BD08
79	.long	0x1231BD08
80	.long	0x1252BD08
81	.long	0x1273BD08
82	.long	0x1294BD08
83	.long	0x12B5BD08
84	.long	0x12D6BD08
85
86	.long	0x11EFC508
87	.long	0x1210C508
88	.long	0x1231C508
89	.long	0x1252C508
90	.long	0x1273C508
91	.long	0x1294C508
92	.long	0x12B5C508
93	.long	0x12D6C508
94
95	.long	0x11EFCD08
96	.long	0x1210CD08
97	.long	0x1231CD08
98	.long	0x1252CD08
99	.long	0x1273CD08
100	.long	0x1294CD08
101	.long	0x12B5CD08
102	.long	0x12D6CD08
103
104	.long	0x11EFD508
105	.long	0x1210D508
106	.long	0x1231D508
107	.long	0x1252D508
108	.long	0x1273D508
109	.long	0x1294D508
110	.long	0x12B5D508
111	.long	0x12D6D508
112
113	xxlor	23+32, 5, 5
114	xxlor	24+32, 6, 6
115	xxlor	25+32, 7, 7
116	xxlor	26+32, 8, 8
117
118	.long	0x11EFBD08
119	.long	0x1210BD08
120	.long	0x1231BD08
121	.long	0x1252BD08
122	.long	0x1273BD08
123	.long	0x1294BD08
124	.long	0x12B5BD08
125	.long	0x12D6BD08
126
127	.long	0x11EFC508
128	.long	0x1210C508
129	.long	0x1231C508
130	.long	0x1252C508
131	.long	0x1273C508
132	.long	0x1294C508
133	.long	0x12B5C508
134	.long	0x12D6C508
135
136	.long	0x11EFCD08
137	.long	0x1210CD08
138	.long	0x1231CD08
139	.long	0x1252CD08
140	.long	0x1273CD08
141	.long	0x1294CD08
142	.long	0x12B5CD08
143	.long	0x12D6CD08
144
145	.long	0x11EFD508
146	.long	0x1210D508
147	.long	0x1231D508
148	.long	0x1252D508
149	.long	0x1273D508
150	.long	0x1294D508
151	.long	0x12B5D508
152	.long	0x12D6D508
153
154	xxlor	23+32, 9, 9
155	.long	0x11EFBD08
156	.long	0x1210BD08
157	.long	0x1231BD08
158	.long	0x1252BD08
159	.long	0x1273BD08
160	.long	0x1294BD08
161	.long	0x12B5BD08
162	.long	0x12D6BD08
163.endm
164
165
166
167
168ppc_aes_gcm_ghash:
169	vxor	15, 15, 0
170
171	xxlxor	29, 29, 29
172
173	.long	0x12EC7CC8
174	.long	0x130984C8
175	.long	0x13268CC8
176	.long	0x134394C8
177
178	vxor	23, 23, 24
179	vxor	23, 23, 25
180	vxor	23, 23, 26
181
182	.long	0x130D7CC8
183	.long	0x132A84C8
184	.long	0x13478CC8
185	.long	0x136494C8
186
187	vxor	24, 24, 25
188	vxor	24, 24, 26
189	vxor	24, 24, 27
190
191
192	.long	0x139714C8
193
194	xxlor	29+32, 29, 29
195	vsldoi	26, 24, 29, 8
196	vsldoi	29, 29, 24, 8
197	vxor	23, 23, 26
198
199	vsldoi	23, 23, 23, 8
200	vxor	23, 23, 28
201
202	.long	0x130E7CC8
203	.long	0x132B84C8
204	.long	0x13488CC8
205	.long	0x136594C8
206
207	vxor	24, 24, 25
208	vxor	24, 24, 26
209	vxor	24, 24, 27
210
211	vxor	24, 24, 29
212
213
214	vsldoi	27, 23, 23, 8
215	.long	0x12F714C8
216	vxor	27, 27, 24
217	vxor	23, 23, 27
218
219	xxlor	32, 23+32, 23+32
220
221	blr
222
223
224
225
226
227.macro	ppc_aes_gcm_ghash2_4x
228
229	vxor	15, 15, 0
230
231	xxlxor	29, 29, 29
232
233	.long	0x12EC7CC8
234	.long	0x130984C8
235	.long	0x13268CC8
236	.long	0x134394C8
237
238	vxor	23, 23, 24
239	vxor	23, 23, 25
240	vxor	23, 23, 26
241
242	.long	0x130D7CC8
243	.long	0x132A84C8
244	.long	0x13478CC8
245	.long	0x136494C8
246
247	vxor	24, 24, 25
248	vxor	24, 24, 26
249
250
251	.long	0x139714C8
252
253	xxlor	29+32, 29, 29
254
255	vxor	24, 24, 27
256	vsldoi	26, 24, 29, 8
257	vsldoi	29, 29, 24, 8
258	vxor	23, 23, 26
259
260	vsldoi	23, 23, 23, 8
261	vxor	23, 23, 28
262
263	.long	0x130E7CC8
264	.long	0x132B84C8
265	.long	0x13488CC8
266	.long	0x136594C8
267
268	vxor	24, 24, 25
269	vxor	24, 24, 26
270	vxor	24, 24, 27
271
272	vxor	24, 24, 29
273
274
275	vsldoi	27, 23, 23, 8
276	.long	0x12F714C8
277	vxor	27, 27, 24
278	vxor	27, 23, 27
279
280
281	.long	0x1309A4C8
282	.long	0x1326ACC8
283	.long	0x1343B4C8
284	vxor	19, 19, 27
285	.long	0x12EC9CC8
286
287	vxor	23, 23, 24
288	vxor	23, 23, 25
289	vxor	23, 23, 26
290
291	.long	0x130D9CC8
292	.long	0x132AA4C8
293	.long	0x1347ACC8
294	.long	0x1364B4C8
295
296	vxor	24, 24, 25
297	vxor	24, 24, 26
298
299
300	.long	0x139714C8
301
302	xxlor	29+32, 29, 29
303
304	vxor	24, 24, 27
305	vsldoi	26, 24, 29, 8
306	vsldoi	29, 29, 24, 8
307	vxor	23, 23, 26
308
309	vsldoi	23, 23, 23, 8
310	vxor	23, 23, 28
311
312	.long	0x130E9CC8
313	.long	0x132BA4C8
314	.long	0x1348ACC8
315	.long	0x1365B4C8
316
317	vxor	24, 24, 25
318	vxor	24, 24, 26
319	vxor	24, 24, 27
320
321	vxor	24, 24, 29
322
323
324	vsldoi	27, 23, 23, 8
325	.long	0x12F714C8
326	vxor	27, 27, 24
327	vxor	23, 23, 27
328
329	xxlor	32, 23+32, 23+32
330
331.endm
332
333
334
335
336.macro	ppc_update_hash_1x
337	vxor	28, 28, 0
338
339	vxor	19, 19, 19
340
341	.long	0x12C3E4C8
342	.long	0x12E4E4C8
343	.long	0x1305E4C8
344
345	.long	0x137614C8
346
347	vsldoi	25, 23, 19, 8
348	vsldoi	26, 19, 23, 8
349	vxor	22, 22, 25
350	vxor	24, 24, 26
351
352	vsldoi	22, 22, 22, 8
353	vxor	22, 22, 27
354
355	vsldoi	20, 22, 22, 8
356	.long	0x12D614C8
357	vxor	20, 20, 24
358	vxor	22, 22, 20
359
360	vor	0,22,22
361
362.endm
363
364
365
366
367
368
369
370
371
372
373
374
375
376.global	ppc_aes_gcm_encrypt
377.align	5
378ppc_aes_gcm_encrypt:
379_ppc_aes_gcm_encrypt:
380
381	stdu	1,-512(1)
382	mflr	0
383
384	std	14,112(1)
385	std	15,120(1)
386	std	16,128(1)
387	std	17,136(1)
388	std	18,144(1)
389	std	19,152(1)
390	std	20,160(1)
391	std	21,168(1)
392	li	9, 256
393	stvx	20, 9, 1
394	addi	9, 9, 16
395	stvx	21, 9, 1
396	addi	9, 9, 16
397	stvx	22, 9, 1
398	addi	9, 9, 16
399	stvx	23, 9, 1
400	addi	9, 9, 16
401	stvx	24, 9, 1
402	addi	9, 9, 16
403	stvx	25, 9, 1
404	addi	9, 9, 16
405	stvx	26, 9, 1
406	addi	9, 9, 16
407	stvx	27, 9, 1
408	addi	9, 9, 16
409	stvx	28, 9, 1
410	addi	9, 9, 16
411	stvx	29, 9, 1
412	addi	9, 9, 16
413	stvx	30, 9, 1
414	addi	9, 9, 16
415	stvx	31, 9, 1
416	std	0, 528(1)
417
418
419	lxvb16x	32, 0, 8
420
421
422	li	10, 32
423	lxvd2x	2+32, 10, 8
424	li	10, 48
425	lxvd2x	3+32, 10, 8
426	li	10, 64
427	lxvd2x	4+32, 10, 8
428	li	10, 80
429	lxvd2x	5+32, 10, 8
430
431	li	10, 96
432	lxvd2x	6+32, 10, 8
433	li	10, 112
434	lxvd2x	7+32, 10, 8
435	li	10, 128
436	lxvd2x	8+32, 10, 8
437
438	li	10, 144
439	lxvd2x	9+32, 10, 8
440	li	10, 160
441	lxvd2x	10+32, 10, 8
442	li	10, 176
443	lxvd2x	11+32, 10, 8
444
445	li	10, 192
446	lxvd2x	12+32, 10, 8
447	li	10, 208
448	lxvd2x	13+32, 10, 8
449	li	10, 224
450	lxvd2x	14+32, 10, 8
451
452
453	lxvb16x	30+32, 0, 7
454
455	mr	12, 5
456	li	11, 0
457
458
459	vxor	31, 31, 31
460	vspltisb	22,1
461	vsldoi	31, 31, 22,1
462
463
464	lxv	0, 0(6)
465	lxv	1, 0x10(6)
466	lxv	2, 0x20(6)
467	lxv	3, 0x30(6)
468	lxv	4, 0x40(6)
469	lxv	5, 0x50(6)
470	lxv	6, 0x60(6)
471	lxv	7, 0x70(6)
472	lxv	8, 0x80(6)
473	lxv	9, 0x90(6)
474	lxv	10, 0xa0(6)
475
476
477	lwz	9,240(6)
478
479
480
481	xxlor	32+29, 0, 0
482	vxor	15, 30, 29
483
484	cmpdi	9, 10
485	beq	.Loop_aes_gcm_8x
486
487
488	lxv	11, 0xb0(6)
489	lxv	12, 0xc0(6)
490
491	cmpdi	9, 12
492	beq	.Loop_aes_gcm_8x
493
494
495	lxv	13, 0xd0(6)
496	lxv	14, 0xe0(6)
497	cmpdi	9, 14
498	beq	.Loop_aes_gcm_8x
499
500	b	aes_gcm_out
501
502.align	5
503.Loop_aes_gcm_8x:
504	mr	14, 3
505	mr	9, 4
506
507
508	li	10, 128
509	divdu	10, 5, 10
510	cmpdi	10, 0
511	beq	.Loop_last_block
512
513	.long	0x13DEF8C0
514	vxor	16, 30, 29
515	.long	0x13DEF8C0
516	vxor	17, 30, 29
517	.long	0x13DEF8C0
518	vxor	18, 30, 29
519	.long	0x13DEF8C0
520	vxor	19, 30, 29
521	.long	0x13DEF8C0
522	vxor	20, 30, 29
523	.long	0x13DEF8C0
524	vxor	21, 30, 29
525	.long	0x13DEF8C0
526	vxor	22, 30, 29
527
528	mtctr	10
529
530	li	15, 16
531	li	16, 32
532	li	17, 48
533	li	18, 64
534	li	19, 80
535	li	20, 96
536	li	21, 112
537
538	lwz	10, 240(6)
539
540.Loop_8x_block:
541
542	lxvb16x	15, 0, 14
543	lxvb16x	16, 15, 14
544	lxvb16x	17, 16, 14
545	lxvb16x	18, 17, 14
546	lxvb16x	19, 18, 14
547	lxvb16x	20, 19, 14
548	lxvb16x	21, 20, 14
549	lxvb16x	22, 21, 14
550	addi	14, 14, 128
551
552.Loop_aes_middle8x
553
554	xxlor	23+32, 10, 10
555
556	cmpdi	10, 10
557	beq	Do_next_ghash
558
559
560	xxlor	24+32, 11, 11
561
562	.long	0x11EFBD08
563	.long	0x1210BD08
564	.long	0x1231BD08
565	.long	0x1252BD08
566	.long	0x1273BD08
567	.long	0x1294BD08
568	.long	0x12B5BD08
569	.long	0x12D6BD08
570
571	.long	0x11EFC508
572	.long	0x1210C508
573	.long	0x1231C508
574	.long	0x1252C508
575	.long	0x1273C508
576	.long	0x1294C508
577	.long	0x12B5C508
578	.long	0x12D6C508
579
580	xxlor	23+32, 12, 12
581
582	cmpdi	10, 12
583	beq	Do_next_ghash
584
585
586	xxlor	24+32, 13, 13
587
588	.long	0x11EFBD08
589	.long	0x1210BD08
590	.long	0x1231BD08
591	.long	0x1252BD08
592	.long	0x1273BD08
593	.long	0x1294BD08
594	.long	0x12B5BD08
595	.long	0x12D6BD08
596
597	.long	0x11EFC508
598	.long	0x1210C508
599	.long	0x1231C508
600	.long	0x1252C508
601	.long	0x1273C508
602	.long	0x1294C508
603	.long	0x12B5C508
604	.long	0x12D6C508
605
606	xxlor	23+32, 14, 14
607
608	cmpdi	10, 14
609	beq	Do_next_ghash
610	b	aes_gcm_out
611
612Do_next_ghash:
613
614
615
616	.long	0x11EFBD09
617	.long	0x1210BD09
618
619	xxlxor	47, 47, 15
620	stxvb16x	47, 0, 9
621	xxlxor	48, 48, 16
622	stxvb16x	48, 15, 9
623
624	.long	0x1231BD09
625	.long	0x1252BD09
626
627	xxlxor	49, 49, 17
628	stxvb16x	49, 16, 9
629	xxlxor	50, 50, 18
630	stxvb16x	50, 17, 9
631
632	.long	0x1273BD09
633	.long	0x1294BD09
634
635	xxlxor	51, 51, 19
636	stxvb16x	51, 18, 9
637	xxlxor	52, 52, 20
638	stxvb16x	52, 19, 9
639
640	.long	0x12B5BD09
641	.long	0x12D6BD09
642
643	xxlxor	53, 53, 21
644	stxvb16x	53, 20, 9
645	xxlxor	54, 54, 22
646	stxvb16x	54, 21, 9
647
648	addi	9, 9, 128
649
650
651	ppc_aes_gcm_ghash2_4x
652
653	xxlor	27+32, 0, 0
654	.long	0x13DEF8C0
655	vor	29,30,30
656	vxor	15, 30, 27
657	.long	0x13DEF8C0
658	vxor	16, 30, 27
659	.long	0x13DEF8C0
660	vxor	17, 30, 27
661	.long	0x13DEF8C0
662	vxor	18, 30, 27
663	.long	0x13DEF8C0
664	vxor	19, 30, 27
665	.long	0x13DEF8C0
666	vxor	20, 30, 27
667	.long	0x13DEF8C0
668	vxor	21, 30, 27
669	.long	0x13DEF8C0
670	vxor	22, 30, 27
671
672	addi	12, 12, -128
673	addi	11, 11, 128
674
675	bdnz	.Loop_8x_block
676
677	vor	30,29,29
678
679.Loop_last_block:
680	cmpdi	12, 0
681	beq	aes_gcm_out
682
683
684	li	10, 16
685	divdu	10, 12, 10
686
687	mtctr	10
688
689	lwz	10, 240(6)
690
691	cmpdi	12, 16
692	blt	Final_block
693
694.macro	.Loop_aes_middle_1x
695	xxlor	19+32, 1, 1
696	xxlor	20+32, 2, 2
697	xxlor	21+32, 3, 3
698	xxlor	22+32, 4, 4
699
700	.long	0x11EF9D08
701	.long	0x11EFA508
702	.long	0x11EFAD08
703	.long	0x11EFB508
704
705	xxlor	19+32, 5, 5
706	xxlor	20+32, 6, 6
707	xxlor	21+32, 7, 7
708	xxlor	22+32, 8, 8
709
710	.long	0x11EF9D08
711	.long	0x11EFA508
712	.long	0x11EFAD08
713	.long	0x11EFB508
714
715	xxlor	19+32, 9, 9
716	.long	0x11EF9D08
717.endm
718
719Next_rem_block:
720	lxvb16x	15, 0, 14
721
722.Loop_aes_middle_1x
723
724	xxlor	23+32, 10, 10
725
726	cmpdi	10, 10
727	beq	Do_next_1x
728
729
730	xxlor	24+32, 11, 11
731
732	.long	0x11EFBD08
733	.long	0x11EFC508
734
735	xxlor	23+32, 12, 12
736
737	cmpdi	10, 12
738	beq	Do_next_1x
739
740
741	xxlor	24+32, 13, 13
742
743	.long	0x11EFBD08
744	.long	0x11EFC508
745
746	xxlor	23+32, 14, 14
747
748	cmpdi	10, 14
749	beq	Do_next_1x
750
751Do_next_1x:
752	.long	0x11EFBD09
753
754	xxlxor	47, 47, 15
755	stxvb16x	47, 0, 9
756	addi	14, 14, 16
757	addi	9, 9, 16
758
759	vor	28,15,15
760	ppc_update_hash_1x
761
762	addi	12, 12, -16
763	addi	11, 11, 16
764	xxlor	19+32, 0, 0
765	.long	0x13DEF8C0
766	vxor	15, 30, 19
767
768	bdnz	Next_rem_block
769
770	cmpdi	12, 0
771	beq	aes_gcm_out
772
773Final_block:
774.Loop_aes_middle_1x
775
776	xxlor	23+32, 10, 10
777
778	cmpdi	10, 10
779	beq	Do_final_1x
780
781
782	xxlor	24+32, 11, 11
783
784	.long	0x11EFBD08
785	.long	0x11EFC508
786
787	xxlor	23+32, 12, 12
788
789	cmpdi	10, 12
790	beq	Do_final_1x
791
792
793	xxlor	24+32, 13, 13
794
795	.long	0x11EFBD08
796	.long	0x11EFC508
797
798	xxlor	23+32, 14, 14
799
800	cmpdi	10, 14
801	beq	Do_final_1x
802
803Do_final_1x:
804	.long	0x11EFBD09
805
806	lxvb16x	15, 0, 14
807	xxlxor	47, 47, 15
808
809
810	li	15, 16
811	sub	15, 15, 12
812
813	vspltisb	16,-1
814	vspltisb	17,0
815	li	10, 192
816	stvx	16, 10, 1
817	addi	10, 10, 16
818	stvx	17, 10, 1
819
820	addi	10, 1, 192
821	lxvb16x	16, 15, 10
822	xxland	47, 47, 16
823
824	vor	28,15,15
825	ppc_update_hash_1x
826
827
828	bl	Write_partial_block
829
830	b	aes_gcm_out
831
832
833
834
835
836
837
838Write_partial_block:
839	li	10, 192
840	stxvb16x	15+32, 10, 1
841
842
843	addi	10, 9, -1
844	addi	16, 1, 191
845
846	mtctr	12
847	li	15, 0
848
849Write_last_byte:
850	lbzu	14, 1(16)
851	stbu	14, 1(10)
852	bdnz	Write_last_byte
853	blr
854
855aes_gcm_out:
856
857	stxvb16x	32, 0, 8
858	add	3, 11, 12
859
860	li	9, 256
861	lvx	20, 9, 1
862	addi	9, 9, 16
863	lvx	21, 9, 1
864	addi	9, 9, 16
865	lvx	22, 9, 1
866	addi	9, 9, 16
867	lvx	23, 9, 1
868	addi	9, 9, 16
869	lvx	24, 9, 1
870	addi	9, 9, 16
871	lvx	25, 9, 1
872	addi	9, 9, 16
873	lvx	26, 9, 1
874	addi	9, 9, 16
875	lvx	27, 9, 1
876	addi	9, 9, 16
877	lvx	28, 9, 1
878	addi	9, 9, 16
879	lvx	29, 9, 1
880	addi	9, 9, 16
881	lvx	30, 9, 1
882	addi	9, 9, 16
883	lvx	31, 9, 1
884
885	ld	0, 528(1)
886	ld	14,112(1)
887	ld	15,120(1)
888	ld	16,128(1)
889	ld	17,136(1)
890	ld	18,144(1)
891	ld	19,152(1)
892	ld	20,160(1)
893	ld	21,168(1)
894
895	mtlr	0
896	addi	1, 1, 512
897	blr
898
899
900
901
902.global	ppc_aes_gcm_decrypt
903.align	5
904ppc_aes_gcm_decrypt:
905_ppc_aes_gcm_decrypt:
906
907	stdu	1,-512(1)
908	mflr	0
909
910	std	14,112(1)
911	std	15,120(1)
912	std	16,128(1)
913	std	17,136(1)
914	std	18,144(1)
915	std	19,152(1)
916	std	20,160(1)
917	std	21,168(1)
918	li	9, 256
919	stvx	20, 9, 1
920	addi	9, 9, 16
921	stvx	21, 9, 1
922	addi	9, 9, 16
923	stvx	22, 9, 1
924	addi	9, 9, 16
925	stvx	23, 9, 1
926	addi	9, 9, 16
927	stvx	24, 9, 1
928	addi	9, 9, 16
929	stvx	25, 9, 1
930	addi	9, 9, 16
931	stvx	26, 9, 1
932	addi	9, 9, 16
933	stvx	27, 9, 1
934	addi	9, 9, 16
935	stvx	28, 9, 1
936	addi	9, 9, 16
937	stvx	29, 9, 1
938	addi	9, 9, 16
939	stvx	30, 9, 1
940	addi	9, 9, 16
941	stvx	31, 9, 1
942	std	0, 528(1)
943
944
945	lxvb16x	32, 0, 8
946
947
948	li	10, 32
949	lxvd2x	2+32, 10, 8
950	li	10, 48
951	lxvd2x	3+32, 10, 8
952	li	10, 64
953	lxvd2x	4+32, 10, 8
954	li	10, 80
955	lxvd2x	5+32, 10, 8
956
957	li	10, 96
958	lxvd2x	6+32, 10, 8
959	li	10, 112
960	lxvd2x	7+32, 10, 8
961	li	10, 128
962	lxvd2x	8+32, 10, 8
963
964	li	10, 144
965	lxvd2x	9+32, 10, 8
966	li	10, 160
967	lxvd2x	10+32, 10, 8
968	li	10, 176
969	lxvd2x	11+32, 10, 8
970
971	li	10, 192
972	lxvd2x	12+32, 10, 8
973	li	10, 208
974	lxvd2x	13+32, 10, 8
975	li	10, 224
976	lxvd2x	14+32, 10, 8
977
978
979	lxvb16x	30+32, 0, 7
980
981	mr	12, 5
982	li	11, 0
983
984
985	vxor	31, 31, 31
986	vspltisb	22,1
987	vsldoi	31, 31, 22,1
988
989
990	lxv	0, 0(6)
991	lxv	1, 0x10(6)
992	lxv	2, 0x20(6)
993	lxv	3, 0x30(6)
994	lxv	4, 0x40(6)
995	lxv	5, 0x50(6)
996	lxv	6, 0x60(6)
997	lxv	7, 0x70(6)
998	lxv	8, 0x80(6)
999	lxv	9, 0x90(6)
1000	lxv	10, 0xa0(6)
1001
1002
1003	lwz	9,240(6)
1004
1005
1006
1007	xxlor	32+29, 0, 0
1008	vxor	15, 30, 29
1009
1010	cmpdi	9, 10
1011	beq	.Loop_aes_gcm_8x_dec
1012
1013
1014	lxv	11, 0xb0(6)
1015	lxv	12, 0xc0(6)
1016
1017	cmpdi	9, 12
1018	beq	.Loop_aes_gcm_8x_dec
1019
1020
1021	lxv	13, 0xd0(6)
1022	lxv	14, 0xe0(6)
1023	cmpdi	9, 14
1024	beq	.Loop_aes_gcm_8x_dec
1025
1026	b	aes_gcm_out
1027
1028.align	5
1029.Loop_aes_gcm_8x_dec:
1030	mr	14, 3
1031	mr	9, 4
1032
1033
1034	li	10, 128
1035	divdu	10, 5, 10
1036	cmpdi	10, 0
1037	beq	.Loop_last_block_dec
1038
1039	.long	0x13DEF8C0
1040	vxor	16, 30, 29
1041	.long	0x13DEF8C0
1042	vxor	17, 30, 29
1043	.long	0x13DEF8C0
1044	vxor	18, 30, 29
1045	.long	0x13DEF8C0
1046	vxor	19, 30, 29
1047	.long	0x13DEF8C0
1048	vxor	20, 30, 29
1049	.long	0x13DEF8C0
1050	vxor	21, 30, 29
1051	.long	0x13DEF8C0
1052	vxor	22, 30, 29
1053
1054	mtctr	10
1055
1056	li	15, 16
1057	li	16, 32
1058	li	17, 48
1059	li	18, 64
1060	li	19, 80
1061	li	20, 96
1062	li	21, 112
1063
1064	lwz	10, 240(6)
1065
1066.Loop_8x_block_dec:
1067
1068	lxvb16x	15, 0, 14
1069	lxvb16x	16, 15, 14
1070	lxvb16x	17, 16, 14
1071	lxvb16x	18, 17, 14
1072	lxvb16x	19, 18, 14
1073	lxvb16x	20, 19, 14
1074	lxvb16x	21, 20, 14
1075	lxvb16x	22, 21, 14
1076	addi	14, 14, 128
1077
1078.Loop_aes_middle8x
1079
1080	xxlor	23+32, 10, 10
1081
1082	cmpdi	10, 10
1083	beq	Do_last_aes_dec
1084
1085
1086	xxlor	24+32, 11, 11
1087
1088	.long	0x11EFBD08
1089	.long	0x1210BD08
1090	.long	0x1231BD08
1091	.long	0x1252BD08
1092	.long	0x1273BD08
1093	.long	0x1294BD08
1094	.long	0x12B5BD08
1095	.long	0x12D6BD08
1096
1097	.long	0x11EFC508
1098	.long	0x1210C508
1099	.long	0x1231C508
1100	.long	0x1252C508
1101	.long	0x1273C508
1102	.long	0x1294C508
1103	.long	0x12B5C508
1104	.long	0x12D6C508
1105
1106	xxlor	23+32, 12, 12
1107
1108	cmpdi	10, 12
1109	beq	Do_last_aes_dec
1110
1111
1112	xxlor	24+32, 13, 13
1113
1114	.long	0x11EFBD08
1115	.long	0x1210BD08
1116	.long	0x1231BD08
1117	.long	0x1252BD08
1118	.long	0x1273BD08
1119	.long	0x1294BD08
1120	.long	0x12B5BD08
1121	.long	0x12D6BD08
1122
1123	.long	0x11EFC508
1124	.long	0x1210C508
1125	.long	0x1231C508
1126	.long	0x1252C508
1127	.long	0x1273C508
1128	.long	0x1294C508
1129	.long	0x12B5C508
1130	.long	0x12D6C508
1131
1132	xxlor	23+32, 14, 14
1133
1134	cmpdi	10, 14
1135	beq	Do_last_aes_dec
1136	b	aes_gcm_out
1137
1138Do_last_aes_dec:
1139
1140
1141
1142	.long	0x11EFBD09
1143	.long	0x1210BD09
1144
1145	xxlxor	47, 47, 15
1146	stxvb16x	47, 0, 9
1147	xxlxor	48, 48, 16
1148	stxvb16x	48, 15, 9
1149
1150	.long	0x1231BD09
1151	.long	0x1252BD09
1152
1153	xxlxor	49, 49, 17
1154	stxvb16x	49, 16, 9
1155	xxlxor	50, 50, 18
1156	stxvb16x	50, 17, 9
1157
1158	.long	0x1273BD09
1159	.long	0x1294BD09
1160
1161	xxlxor	51, 51, 19
1162	stxvb16x	51, 18, 9
1163	xxlxor	52, 52, 20
1164	stxvb16x	52, 19, 9
1165
1166	.long	0x12B5BD09
1167	.long	0x12D6BD09
1168
1169	xxlxor	53, 53, 21
1170	stxvb16x	53, 20, 9
1171	xxlxor	54, 54, 22
1172	stxvb16x	54, 21, 9
1173
1174	addi	9, 9, 128
1175
1176	xxlor	15+32, 15, 15
1177	xxlor	16+32, 16, 16
1178	xxlor	17+32, 17, 17
1179	xxlor	18+32, 18, 18
1180	xxlor	19+32, 19, 19
1181	xxlor	20+32, 20, 20
1182	xxlor	21+32, 21, 21
1183	xxlor	22+32, 22, 22
1184
1185
1186	ppc_aes_gcm_ghash2_4x
1187
1188	xxlor	27+32, 0, 0
1189	.long	0x13DEF8C0
1190	vor	29,30,30
1191	vxor	15, 30, 27
1192	.long	0x13DEF8C0
1193	vxor	16, 30, 27
1194	.long	0x13DEF8C0
1195	vxor	17, 30, 27
1196	.long	0x13DEF8C0
1197	vxor	18, 30, 27
1198	.long	0x13DEF8C0
1199	vxor	19, 30, 27
1200	.long	0x13DEF8C0
1201	vxor	20, 30, 27
1202	.long	0x13DEF8C0
1203	vxor	21, 30, 27
1204	.long	0x13DEF8C0
1205	vxor	22, 30, 27
1206	addi	12, 12, -128
1207	addi	11, 11, 128
1208
1209	bdnz	.Loop_8x_block_dec
1210
1211	vor	30,29,29
1212
1213.Loop_last_block_dec:
1214	cmpdi	12, 0
1215	beq	aes_gcm_out
1216
1217
1218	li	10, 16
1219	divdu	10, 12, 10
1220
1221	mtctr	10
1222
1223	lwz	10,240(6)
1224
1225	cmpdi	12, 16
1226	blt	Final_block_dec
1227
1228Next_rem_block_dec:
1229	lxvb16x	15, 0, 14
1230
1231.Loop_aes_middle_1x
1232
1233	xxlor	23+32, 10, 10
1234
1235	cmpdi	10, 10
1236	beq	Do_next_1x_dec
1237
1238
1239	xxlor	24+32, 11, 11
1240
1241	.long	0x11EFBD08
1242	.long	0x11EFC508
1243
1244	xxlor	23+32, 12, 12
1245
1246	cmpdi	10, 12
1247	beq	Do_next_1x_dec
1248
1249
1250	xxlor	24+32, 13, 13
1251
1252	.long	0x11EFBD08
1253	.long	0x11EFC508
1254
1255	xxlor	23+32, 14, 14
1256
1257	cmpdi	10, 14
1258	beq	Do_next_1x_dec
1259
1260Do_next_1x_dec:
1261	.long	0x11EFBD09
1262
1263	xxlxor	47, 47, 15
1264	stxvb16x	47, 0, 9
1265	addi	14, 14, 16
1266	addi	9, 9, 16
1267
1268	xxlor	28+32, 15, 15
1269	ppc_update_hash_1x
1270
1271	addi	12, 12, -16
1272	addi	11, 11, 16
1273	xxlor	19+32, 0, 0
1274	.long	0x13DEF8C0
1275	vxor	15, 30, 19
1276
1277	bdnz	Next_rem_block_dec
1278
1279	cmpdi	12, 0
1280	beq	aes_gcm_out
1281
1282Final_block_dec:
1283.Loop_aes_middle_1x
1284
1285	xxlor	23+32, 10, 10
1286
1287	cmpdi	10, 10
1288	beq	Do_final_1x_dec
1289
1290
1291	xxlor	24+32, 11, 11
1292
1293	.long	0x11EFBD08
1294	.long	0x11EFC508
1295
1296	xxlor	23+32, 12, 12
1297
1298	cmpdi	10, 12
1299	beq	Do_final_1x_dec
1300
1301
1302	xxlor	24+32, 13, 13
1303
1304	.long	0x11EFBD08
1305	.long	0x11EFC508
1306
1307	xxlor	23+32, 14, 14
1308
1309	cmpdi	10, 14
1310	beq	Do_final_1x_dec
1311
1312Do_final_1x_dec:
1313	.long	0x11EFBD09
1314
1315	lxvb16x	15, 0, 14
1316	xxlxor	47, 47, 15
1317
1318
1319	li	15, 16
1320	sub	15, 15, 12
1321
1322	vspltisb	16,-1
1323	vspltisb	17,0
1324	li	10, 192
1325	stvx	16, 10, 1
1326	addi	10, 10, 16
1327	stvx	17, 10, 1
1328
1329	addi	10, 1, 192
1330	lxvb16x	16, 15, 10
1331	xxland	47, 47, 16
1332
1333	xxlor	28+32, 15, 15
1334	ppc_update_hash_1x
1335
1336
1337	bl	Write_partial_block
1338
1339	b	aes_gcm_out
1340