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