1.machine	"any"
2
3.abiversion	2
4.text
5
6.align	7
7_vpaes_consts:
8.Lk_mc_forward:
9.byte	0x0e,0x0d,0x0c,0x0f,0x0a,0x09,0x08,0x0b,0x06,0x05,0x04,0x07,0x02,0x01,0x00,0x03
10.byte	0x0a,0x09,0x08,0x0b,0x06,0x05,0x04,0x07,0x02,0x01,0x00,0x03,0x0e,0x0d,0x0c,0x0f
11.byte	0x06,0x05,0x04,0x07,0x02,0x01,0x00,0x03,0x0e,0x0d,0x0c,0x0f,0x0a,0x09,0x08,0x0b
12.byte	0x02,0x01,0x00,0x03,0x0e,0x0d,0x0c,0x0f,0x0a,0x09,0x08,0x0b,0x06,0x05,0x04,0x07
13.Lk_mc_backward:
14.byte	0x0c,0x0f,0x0e,0x0d,0x08,0x0b,0x0a,0x09,0x04,0x07,0x06,0x05,0x00,0x03,0x02,0x01
15.byte	0x00,0x03,0x02,0x01,0x0c,0x0f,0x0e,0x0d,0x08,0x0b,0x0a,0x09,0x04,0x07,0x06,0x05
16.byte	0x04,0x07,0x06,0x05,0x00,0x03,0x02,0x01,0x0c,0x0f,0x0e,0x0d,0x08,0x0b,0x0a,0x09
17.byte	0x08,0x0b,0x0a,0x09,0x04,0x07,0x06,0x05,0x00,0x03,0x02,0x01,0x0c,0x0f,0x0e,0x0d
18.Lk_sr:
19.byte	0x0f,0x0e,0x0d,0x0c,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x01,0x00
20.byte	0x0f,0x0a,0x05,0x00,0x0b,0x06,0x01,0x0c,0x07,0x02,0x0d,0x08,0x03,0x0e,0x09,0x04
21.byte	0x0f,0x06,0x0d,0x04,0x0b,0x02,0x09,0x00,0x07,0x0e,0x05,0x0c,0x03,0x0a,0x01,0x08
22.byte	0x0f,0x02,0x05,0x08,0x0b,0x0e,0x01,0x04,0x07,0x0a,0x0d,0x00,0x03,0x06,0x09,0x0c
23
24
25
26
27.Lk_inv:
28.byte	0x04,0x07,0x03,0x09,0x0a,0x0b,0x0c,0x02,0x0e,0x05,0x06,0x0f,0x0d,0x08,0x01,0xf0
29.byte	0x03,0x0d,0x0e,0x0c,0x02,0x05,0x08,0x09,0x01,0x04,0x0a,0x06,0x0f,0x0b,0x07,0xf0
30.Lk_ipt:
31.byte	0xca,0xba,0xe0,0x90,0x52,0x22,0x78,0x08,0xc2,0xb2,0xe8,0x98,0x5a,0x2a,0x70,0x00
32.byte	0xcd,0x80,0xb1,0xfc,0xb0,0xfd,0xcc,0x81,0x4c,0x01,0x30,0x7d,0x31,0x7c,0x4d,0x00
33.Lk_sbo:
34.byte	0x15,0xaa,0xbf,0x7a,0xc5,0x02,0xa8,0x78,0xd0,0xd2,0x6d,0x17,0x6f,0xbd,0xc7,0x00
35.byte	0x8e,0x1e,0x90,0xd1,0x41,0x2b,0x35,0xfa,0xcf,0xe4,0x74,0xa5,0x5f,0xbb,0x6a,0x00
36.Lk_sb1:
37.byte	0x3b,0xf7,0xcc,0xc1,0x0d,0x2e,0xd9,0xef,0x36,0x18,0xd4,0x15,0xfa,0xe2,0x23,0x00
38.byte	0xa5,0xdf,0x7a,0x6e,0x14,0x2a,0xf5,0x44,0xb1,0x9b,0xe1,0x8f,0xcb,0x50,0x3e,0x00
39.Lk_sb2:
40.byte	0xc2,0xa1,0x63,0xc8,0xab,0x82,0x23,0x4a,0x69,0xeb,0x88,0x40,0x0a,0xe1,0x29,0x00
41.byte	0x5e,0xb7,0xe9,0x55,0xbc,0x98,0x2f,0xcd,0xe2,0x7a,0x93,0xc6,0x0b,0x71,0x24,0x00
42
43
44
45
46.Lk_dipt:
47.byte	0x15,0x4a,0x41,0x1e,0x11,0x4e,0x45,0x1a,0x0f,0x50,0x5b,0x04,0x0b,0x54,0x5f,0x00
48.byte	0x12,0x77,0x17,0x72,0xf4,0x91,0xf1,0x94,0x86,0xe3,0x83,0xe6,0x60,0x05,0x65,0x00
49.Lk_dsbo:
50.byte	0xc7,0xaa,0x6d,0xb9,0xd4,0x94,0x3e,0x2d,0x13,0x87,0xea,0x53,0x7e,0xf9,0x40,0x00
51.byte	0xca,0x4b,0x81,0x59,0xd8,0xc5,0x8e,0x9c,0x12,0xd7,0x56,0x0f,0x93,0x44,0x1d,0x00
52.Lk_dsb9:
53.byte	0xca,0xd5,0x1f,0x50,0x4f,0x99,0x4c,0xc9,0x85,0x1c,0x03,0x53,0x9a,0x86,0xd6,0x00
54.byte	0x72,0x5e,0x2c,0x9e,0xb2,0xfb,0xa5,0x65,0xc0,0x3b,0x17,0x89,0xec,0xd7,0x49,0x00
55.Lk_dsbd:
56.byte	0xf5,0x6e,0x9b,0x13,0x88,0x2a,0x44,0x39,0x7d,0x57,0xcc,0xdf,0xe6,0xb1,0xa2,0x00
57.byte	0x29,0x31,0x18,0x0d,0x15,0xde,0xef,0xd3,0x3c,0xe2,0xfa,0xf7,0x24,0xc6,0xcb,0x00
58.Lk_dsbb:
59.byte	0x60,0x26,0x46,0xf6,0xb0,0xf2,0xd4,0x04,0xd0,0x22,0x64,0x92,0x96,0xb4,0x42,0x00
60.byte	0xf3,0xff,0x0c,0x3e,0x32,0x55,0xaa,0x6b,0xc1,0x94,0x98,0xa6,0xcd,0x59,0x67,0x00
61.Lk_dsbe:
62.byte	0x22,0x42,0x60,0x04,0x64,0xb4,0xf6,0xb0,0x46,0xf2,0x92,0x96,0x26,0xd4,0xd0,0x00
63.byte	0x94,0x67,0xf3,0x6b,0x98,0x59,0x3e,0x32,0x0c,0x55,0xa6,0xcd,0xff,0xaa,0xc1,0x00
64
65
66
67
68.Lk_dksd:
69.byte	0x07,0x40,0xe3,0xa4,0x5a,0x1d,0xbe,0xf9,0xfe,0xb9,0x1a,0x5d,0xa3,0xe4,0x47,0x00
70.byte	0x5f,0xdc,0x69,0xea,0xab,0x28,0x9d,0x1e,0x41,0xc2,0x77,0xf4,0xb5,0x36,0x83,0x00
71.Lk_dksb:
72.byte	0x03,0xd6,0x53,0x86,0x1c,0xc9,0x4c,0x99,0x9a,0x4f,0xca,0x1f,0x85,0x50,0xd5,0x00
73.byte	0xd9,0x93,0x25,0x6f,0x7e,0x34,0x82,0xc8,0x11,0x5b,0xed,0xa7,0xb6,0xfc,0x4a,0x00
74.Lk_dkse:
75.byte	0x53,0x85,0x9a,0x4c,0x99,0x4f,0x50,0x86,0xd5,0x03,0x1c,0xca,0x1f,0xc9,0xd6,0x00
76.byte	0xcd,0x5e,0xf9,0x6a,0x20,0xb3,0x14,0x87,0xa2,0x31,0x96,0x05,0x4f,0xdc,0x7b,0xe8
77.Lk_dks9:
78.byte	0x4a,0xed,0x93,0x34,0x82,0x25,0x5b,0xfc,0xb6,0x11,0x6f,0xc8,0x7e,0xd9,0xa7,0x00
79.byte	0x8b,0xb8,0x9f,0xac,0xe9,0xda,0xfd,0xce,0x45,0x76,0x51,0x62,0x27,0x14,0x33,0x00
80
81.Lk_rcon:
82.byte	0xb6,0xee,0x9d,0xaf,0xb9,0x91,0x83,0x1f,0x81,0x7d,0x7c,0x4d,0x08,0x98,0x2a,0x70
83.Lk_s63:
84.byte	0x5b,0x5b,0x5b,0x5b,0x5b,0x5b,0x5b,0x5b,0x5b,0x5b,0x5b,0x5b,0x5b,0x5b,0x5b,0x5b
85
86.Lk_opt:
87.byte	0xf7,0x97,0x41,0x21,0xde,0xbe,0x68,0x08,0xff,0x9f,0x49,0x29,0xd6,0xb6,0x60,0x00
88.byte	0xe1,0x0d,0x5d,0xb1,0xb0,0x5c,0x0c,0xe0,0x01,0xed,0xbd,0x51,0x50,0xbc,0xec,0x00
89.Lk_deskew:
90.byte	0x1d,0xfe,0xb9,0x5a,0x5d,0xbe,0xf9,0x1a,0x07,0xe4,0xa3,0x40,0x47,0xa4,0xe3,0x00
91.byte	0x28,0x41,0xc2,0xab,0xf4,0x9d,0x1e,0x77,0x5f,0x36,0xb5,0xdc,0x83,0xea,0x69,0x00
92.align	5
93.Lconsts:
94	mflr	0
95	bcl	20,31,$+4
96	mflr	12
97	addi	12,12,-0x308
98	mtlr	0
99	blr
100.long	0
101.byte	0,12,0x14,0,0,0,0,0
102.byte	86,101,99,116,111,114,32,80,101,114,109,117,116,97,116,105,111,110,32,65,69,83,32,102,111,114,32,65,108,116,105,86,101,99,44,77,105,107,101,32,72,97,109,98,117,114,103,32,40,83,116,97,110,102,111,114,100,32,85,110,105,118,101,114,115,105,116,121,41,0
103.align	2
104.align	6
105
106
107
108
109
110
111.align	4
112_vpaes_encrypt_preheat:
113	mflr	8
114	bl	.Lconsts
115	mtlr	8
116	li	11, 0xc0
117	li	10, 0xd0
118	li	9,  0xe0
119	li	8,  0xf0
120	vxor	7, 7, 7
121	vspltisb	8,4
122	vspltisb	9,0x0f
123	lvx	10, 12, 11
124	li	11, 0x100
125	lvx	11, 12, 10
126	li	10, 0x110
127	lvx	12, 12, 9
128	li	9,  0x120
129	lvx	13, 12, 8
130	li	8,  0x130
131	lvx	14, 12, 11
132	li	11, 0x140
133	lvx	15, 12, 10
134	li	10, 0x150
135	lvx	16, 12, 9
136	lvx	17, 12, 8
137	lvx	18, 12, 11
138	lvx	19, 12, 10
139	blr
140.long	0
141.byte	0,12,0x14,0,0,0,0,0
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157.align	5
158_vpaes_encrypt_core:
159	lwz	8, 240(5)
160	li	9, 16
161	lvx	5, 0, 5
162	li	11, 0x10
163	lvx	6, 9, 5
164	addi	9, 9, 16
165	vperm	5, 6, 5, 31
166	addi	10, 11, 0x40
167	vsrb	1, 0, 8
168	vperm	0, 12, 12, 0
169	vperm	1, 13, 13, 1
170	vxor	0, 0, 5
171	vxor	0, 0, 1
172	mtctr	8
173	b	.Lenc_entry
174
175.align	4
176.Lenc_loop:
177
178	vperm	4, 17, 7, 2
179	lvx	1, 12, 11
180	addi	11, 11, 16
181	vperm	0, 16, 7, 3
182	vxor	4, 4, 5
183	andi.	11, 11, 0x30
184	vperm	5, 19, 7, 2
185	vxor	0, 0, 4
186	vperm	2, 18, 7, 3
187	lvx	4, 12, 10
188	addi	10, 11, 0x40
189	vperm	3, 0, 7, 1
190	vxor	2, 2, 5
191	vperm	0, 0, 7, 4
192	vxor	3, 3, 2
193	vperm	4, 3, 7, 1
194	vxor	0, 0, 3
195	vxor	0, 0, 4
196
197.Lenc_entry:
198
199	vsrb	1, 0, 8
200	vperm	5, 11, 11, 0
201	vxor	0, 0, 1
202	vperm	3, 10, 10, 1
203	vperm	4, 10, 10, 0
204	vand	0, 0, 9
205	vxor	3, 3, 5
206	vxor	4, 4, 5
207	vperm	2, 10, 7, 3
208	vor	5,6,6
209	lvx	6, 9, 5
210	vperm	3, 10, 7, 4
211	addi	9, 9, 16
212	vxor	2, 2, 0
213	vperm	5, 6, 5, 31
214	vxor	3, 3, 1
215	bdnz	.Lenc_loop
216
217
218	addi	10, 11, 0x80
219
220
221	vperm	4, 14, 7, 2
222	lvx	1, 12, 10
223	vperm	0, 15, 7, 3
224	vxor	4, 4, 5
225	vxor	0, 0, 4
226	vperm	0, 0, 7, 1
227	blr
228.long	0
229.byte	0,12,0x14,0,0,0,0,0
230
231.globl	vpaes_encrypt
232.type	vpaes_encrypt,@function
233.align	5
234vpaes_encrypt:
235.localentry	vpaes_encrypt,0
236
237	stdu	1,-256(1)
238	li	10,63
239	li	11,79
240	mflr	6
241	li	7,-1
242	stvx	20,10,1
243	addi	10,10,32
244	stvx	21,11,1
245	addi	11,11,32
246	stvx	22,10,1
247	addi	10,10,32
248	stvx	23,11,1
249	addi	11,11,32
250	stvx	24,10,1
251	addi	10,10,32
252	stvx	25,11,1
253	addi	11,11,32
254	stvx	26,10,1
255	addi	10,10,32
256	stvx	27,11,1
257	addi	11,11,32
258	stvx	28,10,1
259	addi	10,10,32
260	stvx	29,11,1
261	addi	11,11,32
262	stvx	30,10,1
263	stvx	31,11,1
264	stw	7,252(1)
265	li	0, -1
266	std	6,272(1)
267	or	0,0,0
268
269	bl	_vpaes_encrypt_preheat
270
271	lvsr	27, 0, 3
272	lvx	0, 0, 3
273	addi	3, 3, 15
274	lvsl	29, 0, 4
275	lvsr	31, 0, 5
276	lvx	26, 0, 3
277	vperm	0, 26, 0, 27
278
279	bl	_vpaes_encrypt_core
280
281	andi.	8, 4, 15
282	li	9, 16
283	beq	.Lenc_out_aligned
284
285	vperm	0, 0, 0, 29
286	mtctr	9
287.Lenc_out_unaligned:
288	stvebx	0, 0, 4
289	addi	4, 4, 1
290	bdnz	.Lenc_out_unaligned
291	b	.Lenc_done
292
293.align	4
294.Lenc_out_aligned:
295	stvx	0, 0, 4
296.Lenc_done:
297
298	li	10,63
299	li	11,79
300	mtlr	6
301	or	7,7,7
302	lvx	20,10,1
303	addi	10,10,32
304	lvx	21,11,1
305	addi	11,11,32
306	lvx	22,10,1
307	addi	10,10,32
308	lvx	23,11,1
309	addi	11,11,32
310	lvx	24,10,1
311	addi	10,10,32
312	lvx	25,11,1
313	addi	11,11,32
314	lvx	26,10,1
315	addi	10,10,32
316	lvx	27,11,1
317	addi	11,11,32
318	lvx	28,10,1
319	addi	10,10,32
320	lvx	29,11,1
321	addi	11,11,32
322	lvx	30,10,1
323	lvx	31,11,1
324	addi	1,1,256
325	blr
326.long	0
327.byte	0,12,0x04,1,0x80,0,3,0
328.long	0
329.size	vpaes_encrypt,.-vpaes_encrypt
330
331.align	4
332_vpaes_decrypt_preheat:
333	mflr	8
334	bl	.Lconsts
335	mtlr	8
336	li	11, 0xc0
337	li	10, 0xd0
338	li	9,  0x160
339	li	8,  0x170
340	vxor	7, 7, 7
341	vspltisb	8,4
342	vspltisb	9,0x0f
343	lvx	10, 12, 11
344	li	11, 0x180
345	lvx	11, 12, 10
346	li	10, 0x190
347	lvx	12, 12, 9
348	li	9,  0x1a0
349	lvx	13, 12, 8
350	li	8,  0x1b0
351	lvx	14, 12, 11
352	li	11, 0x1c0
353	lvx	15, 12, 10
354	li	10, 0x1d0
355	lvx	16, 12, 9
356	li	9,  0x1e0
357	lvx	17, 12, 8
358	li	8,  0x1f0
359	lvx	18, 12, 11
360	li	11, 0x200
361	lvx	19, 12, 10
362	li	10, 0x210
363	lvx	20, 12, 9
364	lvx	21, 12, 8
365	lvx	22, 12, 11
366	lvx	23, 12, 10
367	blr
368.long	0
369.byte	0,12,0x14,0,0,0,0,0
370
371
372
373
374
375
376.align	4
377_vpaes_decrypt_core:
378	lwz	8, 240(5)
379	li	9, 16
380	lvx	5, 0, 5
381	li	11, 0x30
382	lvx	6, 9, 5
383	addi	9, 9, 16
384	vperm	5, 6, 5, 31
385	vsrb	1, 0, 8
386	vperm	0, 12, 12, 0
387	vperm	1, 13, 13, 1
388	vxor	0, 0, 5
389	vxor	0, 0, 1
390	mtctr	8
391	b	.Ldec_entry
392
393.align	4
394.Ldec_loop:
395
396
397
398	lvx	0, 12, 11
399
400
401	vperm	4, 16, 7, 2
402	subi	11, 11, 16
403	vperm	1, 17, 7, 3
404	andi.	11, 11, 0x30
405	vxor	5, 5, 4
406
407	vxor	5, 5, 1
408
409
410	vperm	4, 18, 7, 2
411	vperm	5, 5, 7, 0
412	vperm	1, 19, 7, 3
413	vxor	5, 5, 4
414
415	vxor	5, 5, 1
416
417
418	vperm	4, 20, 7, 2
419	vperm	5, 5, 7, 0
420	vperm	1, 21, 7, 3
421	vxor	5, 5, 4
422
423	vxor	5, 5, 1
424
425
426	vperm	4, 22, 7, 2
427	vperm	5, 5, 7, 0
428	vperm	1, 23, 7, 3
429	vxor	0, 5, 4
430	vxor	0, 0, 1
431
432.Ldec_entry:
433
434	vsrb	1, 0, 8
435	vperm	2, 11, 11, 0
436	vxor	0, 0, 1
437	vperm	3, 10, 10, 1
438	vperm	4, 10, 10, 0
439	vand	0, 0, 9
440	vxor	3, 3, 2
441	vxor	4, 4, 2
442	vperm	2, 10, 7, 3
443	vor	5,6,6
444	lvx	6, 9, 5
445	vperm	3, 10, 7, 4
446	addi	9, 9, 16
447	vxor	2, 2, 0
448	vperm	5, 6, 5, 31
449	vxor	3, 3, 1
450	bdnz	.Ldec_loop
451
452
453	addi	10, 11, 0x80
454
455	vperm	4, 14, 7, 2
456
457	lvx	2, 12, 10
458	vperm	1, 15, 7, 3
459	vxor	4, 4, 5
460	vxor	0, 1, 4
461	vperm	0, 0, 7, 2
462	blr
463.long	0
464.byte	0,12,0x14,0,0,0,0,0
465
466.globl	vpaes_decrypt
467.type	vpaes_decrypt,@function
468.align	5
469vpaes_decrypt:
470.localentry	vpaes_decrypt,0
471
472	stdu	1,-256(1)
473	li	10,63
474	li	11,79
475	mflr	6
476	li	7,-1
477	stvx	20,10,1
478	addi	10,10,32
479	stvx	21,11,1
480	addi	11,11,32
481	stvx	22,10,1
482	addi	10,10,32
483	stvx	23,11,1
484	addi	11,11,32
485	stvx	24,10,1
486	addi	10,10,32
487	stvx	25,11,1
488	addi	11,11,32
489	stvx	26,10,1
490	addi	10,10,32
491	stvx	27,11,1
492	addi	11,11,32
493	stvx	28,10,1
494	addi	10,10,32
495	stvx	29,11,1
496	addi	11,11,32
497	stvx	30,10,1
498	stvx	31,11,1
499	stw	7,252(1)
500	li	0, -1
501	std	6,272(1)
502	or	0,0,0
503
504	bl	_vpaes_decrypt_preheat
505
506	lvsr	27, 0, 3
507	lvx	0, 0, 3
508	addi	3, 3, 15
509	lvsl	29, 0, 4
510	lvsr	31, 0, 5
511	lvx	26, 0, 3
512	vperm	0, 26, 0, 27
513
514	bl	_vpaes_decrypt_core
515
516	andi.	8, 4, 15
517	li	9, 16
518	beq	.Ldec_out_aligned
519
520	vperm	0, 0, 0, 29
521	mtctr	9
522.Ldec_out_unaligned:
523	stvebx	0, 0, 4
524	addi	4, 4, 1
525	bdnz	.Ldec_out_unaligned
526	b	.Ldec_done
527
528.align	4
529.Ldec_out_aligned:
530	stvx	0, 0, 4
531.Ldec_done:
532
533	li	10,63
534	li	11,79
535	mtlr	6
536	or	7,7,7
537	lvx	20,10,1
538	addi	10,10,32
539	lvx	21,11,1
540	addi	11,11,32
541	lvx	22,10,1
542	addi	10,10,32
543	lvx	23,11,1
544	addi	11,11,32
545	lvx	24,10,1
546	addi	10,10,32
547	lvx	25,11,1
548	addi	11,11,32
549	lvx	26,10,1
550	addi	10,10,32
551	lvx	27,11,1
552	addi	11,11,32
553	lvx	28,10,1
554	addi	10,10,32
555	lvx	29,11,1
556	addi	11,11,32
557	lvx	30,10,1
558	lvx	31,11,1
559	addi	1,1,256
560	blr
561.long	0
562.byte	0,12,0x04,1,0x80,0,3,0
563.long	0
564.size	vpaes_decrypt,.-vpaes_decrypt
565
566.globl	vpaes_cbc_encrypt
567.type	vpaes_cbc_encrypt,@function
568.align	5
569vpaes_cbc_encrypt:
570.localentry	vpaes_cbc_encrypt,0
571
572	cmpldi	5,16
573	.long	0x4dc00020
574
575	stdu	1,-272(1)
576	mflr	0
577	li	10,63
578	li	11,79
579	li	12,-1
580	stvx	20,10,1
581	addi	10,10,32
582	stvx	21,11,1
583	addi	11,11,32
584	stvx	22,10,1
585	addi	10,10,32
586	stvx	23,11,1
587	addi	11,11,32
588	stvx	24,10,1
589	addi	10,10,32
590	stvx	25,11,1
591	addi	11,11,32
592	stvx	26,10,1
593	addi	10,10,32
594	stvx	27,11,1
595	addi	11,11,32
596	stvx	28,10,1
597	addi	10,10,32
598	stvx	29,11,1
599	addi	11,11,32
600	stvx	30,10,1
601	stvx	31,11,1
602	stw	12,252(1)
603	std	30,256(1)
604	std	31,264(1)
605	li	9, -16
606	std	0, 288(1)
607
608	and	30, 5, 9
609	andi.	9, 4, 15
610	mr	5, 6
611	mr	31, 7
612	li	6, -1
613	mcrf	1, 0
614	mr	7, 12
615	or	6,6,6
616
617	lvx	24, 0, 31
618	li	9, 15
619	lvsr	27, 0, 31
620	lvx	25, 9, 31
621	vperm	24, 25, 24, 27
622
623	cmpwi	8, 0
624	neg	8, 3
625	vxor	7, 7, 7
626	lvsr	31, 0, 5
627	lvsl	29, 0, 4
628	lvsl	27, 0, 8
629	vnor	30, 7, 7
630	lvx	26, 0, 3
631	vperm	30, 30, 7, 29
632	addi	3, 3, 15
633
634	beq	.Lcbc_decrypt
635
636	bl	_vpaes_encrypt_preheat
637	li	0, 16
638
639	beq	1, .Lcbc_enc_loop
640
641	vor	0,26,26
642	lvx	26, 0, 3
643	addi	3, 3, 16
644	vperm	0, 26, 0, 27
645	vxor	0, 0, 24
646
647	bl	_vpaes_encrypt_core
648
649	andi.	8, 4, 15
650	vor	24,0,0
651	sub	9, 4, 8
652	vperm	28, 0, 0, 29
653
654.Lcbc_enc_head:
655	stvebx	28, 8, 9
656	cmpwi	8, 15
657	addi	8, 8, 1
658	bne	.Lcbc_enc_head
659
660	sub.	30, 30, 0
661	addi	4, 4, 16
662	beq	.Lcbc_unaligned_done
663
664.Lcbc_enc_loop:
665	vor	0,26,26
666	lvx	26, 0, 3
667	addi	3, 3, 16
668	vperm	0, 26, 0, 27
669	vxor	0, 0, 24
670
671	bl	_vpaes_encrypt_core
672
673	vor	24,0,0
674	sub.	30, 30, 0
675	vperm	0, 0, 0, 29
676	vsel	1, 28, 0, 30
677	vor	28,0,0
678	stvx	1, 0, 4
679	addi	4, 4, 16
680	bne	.Lcbc_enc_loop
681
682	b	.Lcbc_done
683
684.align	5
685.Lcbc_decrypt:
686	bl	_vpaes_decrypt_preheat
687	li	0, 16
688
689	beq	1, .Lcbc_dec_loop
690
691	vor	0,26,26
692	lvx	26, 0, 3
693	addi	3, 3, 16
694	vperm	0, 26, 0, 27
695	vor	25,0,0
696
697	bl	_vpaes_decrypt_core
698
699	andi.	8, 4, 15
700	vxor	0, 0, 24
701	vor	24,25,25
702	sub	9, 4, 8
703	vperm	28, 0, 0, 29
704
705.Lcbc_dec_head:
706	stvebx	28, 8, 9
707	cmpwi	8, 15
708	addi	8, 8, 1
709	bne	.Lcbc_dec_head
710
711	sub.	30, 30, 0
712	addi	4, 4, 16
713	beq	.Lcbc_unaligned_done
714
715.Lcbc_dec_loop:
716	vor	0,26,26
717	lvx	26, 0, 3
718	addi	3, 3, 16
719	vperm	0, 26, 0, 27
720	vor	25,0,0
721
722	bl	_vpaes_decrypt_core
723
724	vxor	0, 0, 24
725	vor	24,25,25
726	sub.	30, 30, 0
727	vperm	0, 0, 0, 29
728	vsel	1, 28, 0, 30
729	vor	28,0,0
730	stvx	1, 0, 4
731	addi	4, 4, 16
732	bne	.Lcbc_dec_loop
733
734.Lcbc_done:
735	beq	1, .Lcbc_write_iv
736
737.Lcbc_unaligned_done:
738	andi.	8, 4, 15
739	sub	4, 4, 8
740	li	9, 0
741.Lcbc_tail:
742	stvebx	28, 9, 4
743	addi	9, 9, 1
744	cmpw	9, 8
745	bne	.Lcbc_tail
746
747.Lcbc_write_iv:
748	neg	8, 31
749	li	10, 4
750	lvsr	29, 0, 8
751	li	11, 8
752	li	12, 12
753	vperm	24, 24, 24, 29
754	stvewx	24, 0, 31
755	stvewx	24, 10, 31
756	stvewx	24, 11, 31
757	stvewx	24, 12, 31
758
759	or	7,7,7
760	li	10,63
761	li	11,79
762	lvx	20,10,1
763	addi	10,10,32
764	lvx	21,11,1
765	addi	11,11,32
766	lvx	22,10,1
767	addi	10,10,32
768	lvx	23,11,1
769	addi	11,11,32
770	lvx	24,10,1
771	addi	10,10,32
772	lvx	25,11,1
773	addi	11,11,32
774	lvx	26,10,1
775	addi	10,10,32
776	lvx	27,11,1
777	addi	11,11,32
778	lvx	28,10,1
779	addi	10,10,32
780	lvx	29,11,1
781	addi	11,11,32
782	lvx	30,10,1
783	lvx	31,11,1
784.Lcbc_abort:
785	ld	0, 288(1)
786	ld	30,256(1)
787	ld	31,264(1)
788	mtlr	0
789	addi	1,1,272
790	blr
791.long	0
792.byte	0,12,0x04,1,0x80,2,6,0
793.long	0
794.size	vpaes_cbc_encrypt,.-vpaes_cbc_encrypt
795
796
797
798
799
800.align	4
801_vpaes_key_preheat:
802	mflr	8
803	bl	.Lconsts
804	mtlr	8
805	li	11, 0xc0
806	li	10, 0xd0
807	li	9,  0xe0
808	li	8,  0xf0
809
810	vspltisb	8,4
811	vxor	9,9,9
812	lvx	10, 12, 11
813	li	11, 0x120
814	lvx	11, 12, 10
815	li	10, 0x130
816	lvx	12, 12, 9
817	li	9, 0x220
818	lvx	13, 12, 8
819	li	8, 0x230
820
821	lvx	14, 12, 11
822	li	11, 0x240
823	lvx	15, 12, 10
824	li	10, 0x250
825
826	lvx	16, 12, 9
827	li	9, 0x260
828	lvx	17, 12, 8
829	li	8, 0x270
830	lvx	18, 12, 11
831	li	11, 0x280
832	lvx	19, 12, 10
833	li	10, 0x290
834	lvx	20, 12, 9
835	li	9, 0x2a0
836	lvx	21, 12, 8
837	li	8, 0x2b0
838	lvx	22, 12, 11
839	lvx	23, 12, 10
840
841	lvx	24, 12, 9
842	lvx	25, 0, 12
843	lvx	26, 12, 8
844	blr
845.long	0
846.byte	0,12,0x14,0,0,0,0,0
847
848.align	4
849_vpaes_schedule_core:
850	mflr	7
851
852	bl	_vpaes_key_preheat
853
854
855	neg	8, 3
856	lvx	0, 0, 3
857	addi	3, 3, 15
858	lvsl	27, 0, 8
859	lvx	6, 0, 3
860	addi	3, 3, 8
861	vperm	0, 6, 0, 27
862
863
864	vor	3,0,0
865	bl	_vpaes_schedule_transform
866	vor	7,0,0
867
868	bne	1, .Lschedule_am_decrypting
869
870
871	li	8, 0x30
872	li	9, 4
873	li	10, 8
874	li	11, 12
875
876	lvsl	29, 0, 5
877	vnor	30, 9, 9
878	vperm	30, 30, 9, 29
879
880
881	vperm	28, 0, 0, 29
882	stvewx	28, 0, 5
883	stvewx	28, 9, 5
884	stvewx	28, 10, 5
885	addi	10, 12, 0x80
886	stvewx	28, 11, 5
887	b	.Lschedule_go
888
889.Lschedule_am_decrypting:
890	srwi	8, 4, 1
891	andi.	8, 8, 32
892	xori	8, 8, 32
893	addi	10, 12, 0x80
894
895	lvx	1, 8, 10
896	li	9, 4
897	li	10, 8
898	li	11, 12
899	vperm	4, 3, 3, 1
900
901	neg	0, 5
902	lvsr	29, 0, 0
903	vnor	30, 9, 9
904	vperm	30, 9, 30, 29
905
906
907	vperm	28, 4, 4, 29
908	stvewx	28, 0, 5
909	stvewx	28, 9, 5
910	stvewx	28, 10, 5
911	addi	10, 12, 0x80
912	stvewx	28, 11, 5
913	addi	5, 5, 15
914	xori	8, 8, 0x30
915
916.Lschedule_go:
917	cmplwi	4, 192
918	bgt	.Lschedule_256
919	beq	.Lschedule_192
920
921
922
923
924
925
926
927
928
929
930.Lschedule_128:
931	li	0, 10
932	mtctr	0
933
934.Loop_schedule_128:
935	bl	_vpaes_schedule_round
936	bdz	.Lschedule_mangle_last
937	bl	_vpaes_schedule_mangle
938	b	.Loop_schedule_128
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955.align	4
956.Lschedule_192:
957	li	0, 4
958	lvx	0, 0, 3
959	vperm	0, 0, 6, 27
960	vsldoi	0, 0, 3, 16-8
961	bl	_vpaes_schedule_transform
962	vsldoi	6, 9, 0, 16-8
963	vsldoi	6, 6, 9, 16-8
964	mtctr	0
965
966.Loop_schedule_192:
967	bl	_vpaes_schedule_round
968	vsldoi	0, 0, 6, 16-8
969	bl	_vpaes_schedule_mangle
970	bl	_vpaes_schedule_192_smear
971	bl	_vpaes_schedule_mangle
972	bl	_vpaes_schedule_round
973	bdz	.Lschedule_mangle_last
974	bl	_vpaes_schedule_mangle
975	bl	_vpaes_schedule_192_smear
976	b	.Loop_schedule_192
977
978
979
980
981
982
983
984
985
986
987
988.align	4
989.Lschedule_256:
990	li	0, 7
991	addi	3, 3, 8
992	lvx	0, 0, 3
993	vperm	0, 0, 6, 27
994	bl	_vpaes_schedule_transform
995	mtctr	0
996
997.Loop_schedule_256:
998	bl	_vpaes_schedule_mangle
999	vor	6,0,0
1000
1001
1002	bl	_vpaes_schedule_round
1003	bdz	.Lschedule_mangle_last
1004	bl	_vpaes_schedule_mangle
1005
1006
1007	vspltw	0, 0, 3-3
1008	vor	5,7,7
1009	vor	7,6,6
1010	bl	_vpaes_schedule_low_round
1011	vor	7,5,5
1012
1013	b	.Loop_schedule_256
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024.align	4
1025.Lschedule_mangle_last:
1026
1027	li	11, 0x2e0
1028	li	9,  0x2f0
1029	bne	1, .Lschedule_mangle_last_dec
1030
1031
1032	lvx	1, 8, 10
1033	li	11, 0x2c0
1034	li	9,  0x2d0
1035	vperm	0, 0, 0, 1
1036
1037	lvx	12, 11, 12
1038	lvx	13, 9, 12
1039	addi	5, 5, 16
1040	vxor	0, 0, 26
1041	bl	_vpaes_schedule_transform
1042
1043
1044	vperm	0, 0, 0, 29
1045	li	10, 4
1046	vsel	2, 28, 0, 30
1047	li	11, 8
1048	stvx	2, 0, 5
1049	li	12, 12
1050	stvewx	0, 0, 5
1051	stvewx	0, 10, 5
1052	stvewx	0, 11, 5
1053	stvewx	0, 12, 5
1054	b	.Lschedule_mangle_done
1055
1056.align	4
1057.Lschedule_mangle_last_dec:
1058	lvx	12, 11, 12
1059	lvx	13, 9,  12
1060	addi	5, 5, -16
1061	vxor	0, 0, 26
1062	bl	_vpaes_schedule_transform
1063
1064
1065	addi	9, 5, -15
1066	vperm	0, 0, 0, 29
1067	li	10, 4
1068	vsel	2, 28, 0, 30
1069	li	11, 8
1070	stvx	2, 0, 5
1071	li	12, 12
1072	stvewx	0, 0, 9
1073	stvewx	0, 10, 9
1074	stvewx	0, 11, 9
1075	stvewx	0, 12, 9
1076
1077
1078.Lschedule_mangle_done:
1079	mtlr	7
1080
1081	vxor	0, 0, 0
1082	vxor	1, 1, 1
1083	vxor	2, 2, 2
1084	vxor	3, 3, 3
1085	vxor	4, 4, 4
1086	vxor	5, 5, 5
1087	vxor	6, 6, 6
1088	vxor	7, 7, 7
1089
1090	blr
1091.long	0
1092.byte	0,12,0x14,0,0,0,0,0
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108.align	4
1109_vpaes_schedule_192_smear:
1110	vspltw	0, 7, 3-3
1111	vsldoi	1, 6, 9, 16-12
1112	vsldoi	0, 0, 7, 16-8
1113	vxor	6, 6, 1
1114	vxor	6, 6, 0
1115	vor	0,6,6
1116	vsldoi	6, 9, 6, 16-8
1117	vsldoi	6, 6, 9, 16-8
1118	blr
1119.long	0
1120.byte	0,12,0x14,0,0,0,0,0
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140.align	4
1141_vpaes_schedule_round:
1142
1143
1144	vsldoi	1, 9, 24, 16-15
1145	vsldoi	24, 24, 24, 16-15
1146	vxor	7, 7, 1
1147
1148
1149	vspltw	0, 0, 3-3
1150	vsldoi	0, 0, 0, 16-1
1151
1152
1153
1154
1155_vpaes_schedule_low_round:
1156
1157	vsldoi	1, 7, 9, 16-12
1158	vxor	7, 7, 1
1159	vspltisb	1, 0x0f
1160	vsldoi	4, 7, 9, 16-8
1161
1162
1163	vand	1, 1, 0
1164	vsrb	0, 0, 8
1165	vxor	7, 7, 4
1166	vperm	2, 11, 9, 1
1167	vxor	1, 1, 0
1168	vperm	3, 10, 9, 0
1169	vxor	3, 3, 2
1170	vperm	4, 10, 9, 1
1171	vxor	7, 7, 26
1172	vperm	3, 10, 9, 3
1173	vxor	4, 4, 2
1174	vperm	2, 10, 9, 4
1175	vxor	3, 3, 1
1176	vxor	2, 2, 0
1177	vperm	4, 15, 9, 3
1178	vperm	1, 14, 9, 2
1179	vxor	1, 1, 4
1180
1181
1182	vxor	0, 1, 7
1183	vxor	7, 1, 7
1184	blr
1185.long	0
1186.byte	0,12,0x14,0,0,0,0,0
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197.align	4
1198_vpaes_schedule_transform:
1199
1200	vsrb	2, 0, 8
1201
1202	vperm	0, 12, 12, 0
1203
1204	vperm	2, 13, 13, 2
1205	vxor	0, 0, 2
1206	blr
1207.long	0
1208.byte	0,12,0x14,0,0,0,0,0
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233.align	4
1234_vpaes_schedule_mangle:
1235
1236
1237	bne	1, .Lschedule_mangle_dec
1238
1239
1240	vxor	4, 0, 26
1241	addi	5, 5, 16
1242	vperm	4, 4, 4, 25
1243	vperm	1, 4, 4, 25
1244	vperm	3, 1, 1, 25
1245	vxor	4, 4, 1
1246	lvx	1, 8, 10
1247	vxor	3, 3, 4
1248
1249	vperm	3, 3, 3, 1
1250	addi	8, 8, -16
1251	andi.	8, 8, 0x30
1252
1253
1254	vperm	1, 3, 3, 29
1255	vsel	2, 28, 1, 30
1256	vor	28,1,1
1257	stvx	2, 0, 5
1258	blr
1259
1260.align	4
1261.Lschedule_mangle_dec:
1262
1263
1264	vsrb	1, 0, 8
1265
1266
1267
1268	vperm	2, 16, 16, 0
1269
1270	vperm	3, 17, 17, 1
1271	vxor	3, 3, 2
1272	vperm	3, 3, 9, 25
1273
1274
1275	vperm	2, 18, 18, 0
1276	vxor	2, 2, 3
1277
1278	vperm	3, 19, 19, 1
1279	vxor	3, 3, 2
1280	vperm	3, 3, 9, 25
1281
1282
1283	vperm	2, 20, 20, 0
1284	vxor	2, 2, 3
1285
1286	vperm	3, 21, 21, 1
1287	vxor	3, 3, 2
1288
1289
1290	vperm	2, 22, 22, 0
1291	vperm	3, 3, 9, 25
1292
1293	vperm	4, 23, 23, 1
1294	lvx	1, 8, 10
1295	vxor	2, 2, 3
1296	vxor	3, 4, 2
1297
1298	addi	5, 5, -16
1299
1300	vperm	3, 3, 3, 1
1301	addi	8, 8, -16
1302	andi.	8, 8, 0x30
1303
1304
1305	vperm	1, 3, 3, 29
1306	vsel	2, 28, 1, 30
1307	vor	28,1,1
1308	stvx	2, 0, 5
1309	blr
1310.long	0
1311.byte	0,12,0x14,0,0,0,0,0
1312
1313.globl	vpaes_set_encrypt_key
1314.type	vpaes_set_encrypt_key,@function
1315.align	5
1316vpaes_set_encrypt_key:
1317.localentry	vpaes_set_encrypt_key,0
1318
1319	stdu	1,-256(1)
1320	li	10,63
1321	li	11,79
1322	mflr	0
1323	li	6,-1
1324	stvx	20,10,1
1325	addi	10,10,32
1326	stvx	21,11,1
1327	addi	11,11,32
1328	stvx	22,10,1
1329	addi	10,10,32
1330	stvx	23,11,1
1331	addi	11,11,32
1332	stvx	24,10,1
1333	addi	10,10,32
1334	stvx	25,11,1
1335	addi	11,11,32
1336	stvx	26,10,1
1337	addi	10,10,32
1338	stvx	27,11,1
1339	addi	11,11,32
1340	stvx	28,10,1
1341	addi	10,10,32
1342	stvx	29,11,1
1343	addi	11,11,32
1344	stvx	30,10,1
1345	stvx	31,11,1
1346	stw	6,252(1)
1347	li	7, -1
1348	std	0, 272(1)
1349	or	7,7,7
1350
1351	srwi	9, 4, 5
1352	addi	9, 9, 6
1353	stw	9, 240(5)
1354
1355	cmplw	1,4,4
1356	li	8, 0x30
1357	bl	_vpaes_schedule_core
1358
1359	ld	0, 272(1)
1360	li	10,63
1361	li	11,79
1362	or	6,6,6
1363	mtlr	0
1364	xor	3, 3, 3
1365	lvx	20,10,1
1366	addi	10,10,32
1367	lvx	21,11,1
1368	addi	11,11,32
1369	lvx	22,10,1
1370	addi	10,10,32
1371	lvx	23,11,1
1372	addi	11,11,32
1373	lvx	24,10,1
1374	addi	10,10,32
1375	lvx	25,11,1
1376	addi	11,11,32
1377	lvx	26,10,1
1378	addi	10,10,32
1379	lvx	27,11,1
1380	addi	11,11,32
1381	lvx	28,10,1
1382	addi	10,10,32
1383	lvx	29,11,1
1384	addi	11,11,32
1385	lvx	30,10,1
1386	lvx	31,11,1
1387	addi	1,1,256
1388	blr
1389.long	0
1390.byte	0,12,0x04,1,0x80,0,3,0
1391.long	0
1392.size	vpaes_set_encrypt_key,.-vpaes_set_encrypt_key
1393
1394.globl	vpaes_set_decrypt_key
1395.type	vpaes_set_decrypt_key,@function
1396.align	4
1397vpaes_set_decrypt_key:
1398.localentry	vpaes_set_decrypt_key,0
1399
1400	stdu	1,-256(1)
1401	li	10,63
1402	li	11,79
1403	mflr	0
1404	li	6,-1
1405	stvx	20,10,1
1406	addi	10,10,32
1407	stvx	21,11,1
1408	addi	11,11,32
1409	stvx	22,10,1
1410	addi	10,10,32
1411	stvx	23,11,1
1412	addi	11,11,32
1413	stvx	24,10,1
1414	addi	10,10,32
1415	stvx	25,11,1
1416	addi	11,11,32
1417	stvx	26,10,1
1418	addi	10,10,32
1419	stvx	27,11,1
1420	addi	11,11,32
1421	stvx	28,10,1
1422	addi	10,10,32
1423	stvx	29,11,1
1424	addi	11,11,32
1425	stvx	30,10,1
1426	stvx	31,11,1
1427	stw	6,252(1)
1428	li	7, -1
1429	std	0, 272(1)
1430	or	7,7,7
1431
1432	srwi	9, 4, 5
1433	addi	9, 9, 6
1434	stw	9, 240(5)
1435
1436	slwi	9, 9, 4
1437	add	5, 5, 9
1438
1439	cmplwi	1, 4, 0
1440	srwi	8, 4, 1
1441	andi.	8, 8, 32
1442	xori	8, 8, 32
1443	bl	_vpaes_schedule_core
1444
1445	ld	0,  272(1)
1446	li	10,63
1447	li	11,79
1448	or	6,6,6
1449	mtlr	0
1450	xor	3, 3, 3
1451	lvx	20,10,1
1452	addi	10,10,32
1453	lvx	21,11,1
1454	addi	11,11,32
1455	lvx	22,10,1
1456	addi	10,10,32
1457	lvx	23,11,1
1458	addi	11,11,32
1459	lvx	24,10,1
1460	addi	10,10,32
1461	lvx	25,11,1
1462	addi	11,11,32
1463	lvx	26,10,1
1464	addi	10,10,32
1465	lvx	27,11,1
1466	addi	11,11,32
1467	lvx	28,10,1
1468	addi	10,10,32
1469	lvx	29,11,1
1470	addi	11,11,32
1471	lvx	30,10,1
1472	lvx	31,11,1
1473	addi	1,1,256
1474	blr
1475.long	0
1476.byte	0,12,0x04,1,0x80,0,3,0
1477.long	0
1478.size	vpaes_set_decrypt_key,.-vpaes_set_decrypt_key
1479