xref: /netbsd-src/crypto/external/bsd/openssl/lib/libcrypto/arch/powerpc/vpaes-ppc.S (revision 1b3d6f93806f8821fe459e13ad13e605b37c6d43)
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.align	5
233vpaes_encrypt:
234	stwu	1,-232(1)
235	li	10,39
236	li	11,55
237	mflr	6
238	mfspr	7,256
239	stvx	20,10,1
240	addi	10,10,32
241	stvx	21,11,1
242	addi	11,11,32
243	stvx	22,10,1
244	addi	10,10,32
245	stvx	23,11,1
246	addi	11,11,32
247	stvx	24,10,1
248	addi	10,10,32
249	stvx	25,11,1
250	addi	11,11,32
251	stvx	26,10,1
252	addi	10,10,32
253	stvx	27,11,1
254	addi	11,11,32
255	stvx	28,10,1
256	addi	10,10,32
257	stvx	29,11,1
258	addi	11,11,32
259	stvx	30,10,1
260	stvx	31,11,1
261	stw	7,228(1)
262	li	0, -1
263	stw	6,236(1)
264	mtspr	256,0
265
266	bl	_vpaes_encrypt_preheat
267
268	lvsl	27, 0, 3
269	lvx	0, 0, 3
270	addi	3, 3, 15
271	lvsr	29, 0, 4
272	lvsl	31, 0, 5
273	lvx	26, 0, 3
274	vperm	0, 0, 26, 27
275
276	bl	_vpaes_encrypt_core
277
278	andi.	8, 4, 15
279	li	9, 16
280	beq	.Lenc_out_aligned
281
282	vperm	0, 0, 0, 29
283	mtctr	9
284.Lenc_out_unaligned:
285	stvebx	0, 0, 4
286	addi	4, 4, 1
287	bc	16,0,.Lenc_out_unaligned
288	b	.Lenc_done
289
290.align	4
291.Lenc_out_aligned:
292	stvx	0, 0, 4
293.Lenc_done:
294
295	li	10,39
296	li	11,55
297	mtlr	6
298	mtspr	256,7
299	lvx	20,10,1
300	addi	10,10,32
301	lvx	21,11,1
302	addi	11,11,32
303	lvx	22,10,1
304	addi	10,10,32
305	lvx	23,11,1
306	addi	11,11,32
307	lvx	24,10,1
308	addi	10,10,32
309	lvx	25,11,1
310	addi	11,11,32
311	lvx	26,10,1
312	addi	10,10,32
313	lvx	27,11,1
314	addi	11,11,32
315	lvx	28,10,1
316	addi	10,10,32
317	lvx	29,11,1
318	addi	11,11,32
319	lvx	30,10,1
320	lvx	31,11,1
321	addi	1,1,232
322	blr
323.long	0
324.byte	0,12,0x04,1,0x80,0,3,0
325.long	0
326
327
328.align	4
329_vpaes_decrypt_preheat:
330	mflr	8
331	bl	.Lconsts
332	mtlr	8
333	li	11, 0xc0
334	li	10, 0xd0
335	li	9,  0x160
336	li	8,  0x170
337	vxor	7, 7, 7
338	vspltisb	8,4
339	vspltisb	9,0x0f
340	lvx	10, 12, 11
341	li	11, 0x180
342	lvx	11, 12, 10
343	li	10, 0x190
344	lvx	12, 12, 9
345	li	9,  0x1a0
346	lvx	13, 12, 8
347	li	8,  0x1b0
348	lvx	14, 12, 11
349	li	11, 0x1c0
350	lvx	15, 12, 10
351	li	10, 0x1d0
352	lvx	16, 12, 9
353	li	9,  0x1e0
354	lvx	17, 12, 8
355	li	8,  0x1f0
356	lvx	18, 12, 11
357	li	11, 0x200
358	lvx	19, 12, 10
359	li	10, 0x210
360	lvx	20, 12, 9
361	lvx	21, 12, 8
362	lvx	22, 12, 11
363	lvx	23, 12, 10
364	blr
365.long	0
366.byte	0,12,0x14,0,0,0,0,0
367
368
369
370
371
372
373.align	4
374_vpaes_decrypt_core:
375	lwz	8, 240(5)
376	li	9, 16
377	lvx	5, 0, 5
378	li	11, 0x30
379	lvx	6, 9, 5
380	addi	9, 9, 16
381	vperm	5, 5, 6, 31
382	vsrb	1, 0, 8
383	vperm	0, 12, 12, 0
384	vperm	1, 13, 13, 1
385	vxor	0, 0, 5
386	vxor	0, 0, 1
387	mtctr	8
388	b	.Ldec_entry
389
390.align	4
391.Ldec_loop:
392
393
394
395	lvx	0, 12, 11
396
397
398	vperm	4, 16, 7, 2
399	subi	11, 11, 16
400	vperm	1, 17, 7, 3
401	andi.	11, 11, 0x30
402	vxor	5, 5, 4
403
404	vxor	5, 5, 1
405
406
407	vperm	4, 18, 7, 2
408	vperm	5, 5, 7, 0
409	vperm	1, 19, 7, 3
410	vxor	5, 5, 4
411
412	vxor	5, 5, 1
413
414
415	vperm	4, 20, 7, 2
416	vperm	5, 5, 7, 0
417	vperm	1, 21, 7, 3
418	vxor	5, 5, 4
419
420	vxor	5, 5, 1
421
422
423	vperm	4, 22, 7, 2
424	vperm	5, 5, 7, 0
425	vperm	1, 23, 7, 3
426	vxor	0, 5, 4
427	vxor	0, 0, 1
428
429.Ldec_entry:
430
431	vsrb	1, 0, 8
432	vperm	2, 11, 11, 0
433	vxor	0, 0, 1
434	vperm	3, 10, 10, 1
435	vperm	4, 10, 10, 0
436	vand	0, 0, 9
437	vxor	3, 3, 2
438	vxor	4, 4, 2
439	vperm	2, 10, 7, 3
440	vor	5,6,6
441	lvx	6, 9, 5
442	vperm	3, 10, 7, 4
443	addi	9, 9, 16
444	vxor	2, 2, 0
445	vperm	5, 5, 6, 31
446	vxor	3, 3, 1
447	bc	16,0,.Ldec_loop
448
449
450	addi	10, 11, 0x80
451
452	vperm	4, 14, 7, 2
453
454	lvx	2, 12, 10
455	vperm	1, 15, 7, 3
456	vxor	4, 4, 5
457	vxor	0, 1, 4
458	vperm	0, 0, 7, 2
459	blr
460.long	0
461.byte	0,12,0x14,0,0,0,0,0
462
463.globl	vpaes_decrypt
464.type	vpaes_decrypt,@function
465.align	5
466vpaes_decrypt:
467	stwu	1,-232(1)
468	li	10,39
469	li	11,55
470	mflr	6
471	mfspr	7,256
472	stvx	20,10,1
473	addi	10,10,32
474	stvx	21,11,1
475	addi	11,11,32
476	stvx	22,10,1
477	addi	10,10,32
478	stvx	23,11,1
479	addi	11,11,32
480	stvx	24,10,1
481	addi	10,10,32
482	stvx	25,11,1
483	addi	11,11,32
484	stvx	26,10,1
485	addi	10,10,32
486	stvx	27,11,1
487	addi	11,11,32
488	stvx	28,10,1
489	addi	10,10,32
490	stvx	29,11,1
491	addi	11,11,32
492	stvx	30,10,1
493	stvx	31,11,1
494	stw	7,228(1)
495	li	0, -1
496	stw	6,236(1)
497	mtspr	256,0
498
499	bl	_vpaes_decrypt_preheat
500
501	lvsl	27, 0, 3
502	lvx	0, 0, 3
503	addi	3, 3, 15
504	lvsr	29, 0, 4
505	lvsl	31, 0, 5
506	lvx	26, 0, 3
507	vperm	0, 0, 26, 27
508
509	bl	_vpaes_decrypt_core
510
511	andi.	8, 4, 15
512	li	9, 16
513	beq	.Ldec_out_aligned
514
515	vperm	0, 0, 0, 29
516	mtctr	9
517.Ldec_out_unaligned:
518	stvebx	0, 0, 4
519	addi	4, 4, 1
520	bc	16,0,.Ldec_out_unaligned
521	b	.Ldec_done
522
523.align	4
524.Ldec_out_aligned:
525	stvx	0, 0, 4
526.Ldec_done:
527
528	li	10,39
529	li	11,55
530	mtlr	6
531	mtspr	256,7
532	lvx	20,10,1
533	addi	10,10,32
534	lvx	21,11,1
535	addi	11,11,32
536	lvx	22,10,1
537	addi	10,10,32
538	lvx	23,11,1
539	addi	11,11,32
540	lvx	24,10,1
541	addi	10,10,32
542	lvx	25,11,1
543	addi	11,11,32
544	lvx	26,10,1
545	addi	10,10,32
546	lvx	27,11,1
547	addi	11,11,32
548	lvx	28,10,1
549	addi	10,10,32
550	lvx	29,11,1
551	addi	11,11,32
552	lvx	30,10,1
553	lvx	31,11,1
554	addi	1,1,232
555	blr
556.long	0
557.byte	0,12,0x04,1,0x80,0,3,0
558.long	0
559
560
561.globl	vpaes_cbc_encrypt
562.type	vpaes_cbc_encrypt,@function
563.align	5
564vpaes_cbc_encrypt:
565	cmplwi	5,16
566	bltlr
567
568	stwu	1,-240(1)
569	mflr	0
570	li	10,39
571	li	11,55
572	mfspr	12,256
573	stvx	20,10,1
574	addi	10,10,32
575	stvx	21,11,1
576	addi	11,11,32
577	stvx	22,10,1
578	addi	10,10,32
579	stvx	23,11,1
580	addi	11,11,32
581	stvx	24,10,1
582	addi	10,10,32
583	stvx	25,11,1
584	addi	11,11,32
585	stvx	26,10,1
586	addi	10,10,32
587	stvx	27,11,1
588	addi	11,11,32
589	stvx	28,10,1
590	addi	10,10,32
591	stvx	29,11,1
592	addi	11,11,32
593	stvx	30,10,1
594	stvx	31,11,1
595	stw	12,228(1)
596	stw	30,232(1)
597	stw	31,236(1)
598	li	9, -16
599	stw	0, 244(1)
600
601	and	30, 5, 9
602	andi.	9, 4, 15
603	mr	5, 6
604	mr	31, 7
605	li	6, -1
606	mcrf	1, 0
607	mr	7, 12
608	mtspr	256,6
609
610	lvx	24, 0, 31
611	li	9, 15
612	lvsl	27, 0, 31
613	lvx	25, 9, 31
614	vperm	24, 24, 25, 27
615
616	cmpwi	8, 0
617	neg	8, 3
618	vxor	7, 7, 7
619	lvsl	31, 0, 5
620	lvsr	29, 0, 4
621	lvsr	27, 0, 8
622	vnor	30, 7, 7
623	lvx	26, 0, 3
624	vperm	30, 7, 30, 29
625	addi	3, 3, 15
626
627	beq	.Lcbc_decrypt
628
629	bl	_vpaes_encrypt_preheat
630	li	0, 16
631
632	beq	1, .Lcbc_enc_loop
633
634	vor	0,26,26
635	lvx	26, 0, 3
636	addi	3, 3, 16
637	vperm	0, 0, 26, 27
638	vxor	0, 0, 24
639
640	bl	_vpaes_encrypt_core
641
642	andi.	8, 4, 15
643	vor	24,0,0
644	sub	9, 4, 8
645	vperm	28, 0, 0, 29
646
647.Lcbc_enc_head:
648	stvebx	28, 8, 9
649	cmpwi	8, 15
650	addi	8, 8, 1
651	bne	.Lcbc_enc_head
652
653	sub.	30, 30, 0
654	addi	4, 4, 16
655	beq	.Lcbc_unaligned_done
656
657.Lcbc_enc_loop:
658	vor	0,26,26
659	lvx	26, 0, 3
660	addi	3, 3, 16
661	vperm	0, 0, 26, 27
662	vxor	0, 0, 24
663
664	bl	_vpaes_encrypt_core
665
666	vor	24,0,0
667	sub.	30, 30, 0
668	vperm	0, 0, 0, 29
669	vsel	1,28,0,30
670	vor	28,0,0
671	stvx	1, 0, 4
672	addi	4, 4, 16
673	bne	.Lcbc_enc_loop
674
675	b	.Lcbc_done
676
677.align	5
678.Lcbc_decrypt:
679	bl	_vpaes_decrypt_preheat
680	li	0, 16
681
682	beq	1, .Lcbc_dec_loop
683
684	vor	0,26,26
685	lvx	26, 0, 3
686	addi	3, 3, 16
687	vperm	0, 0, 26, 27
688	vor	25,0,0
689
690	bl	_vpaes_decrypt_core
691
692	andi.	8, 4, 15
693	vxor	0, 0, 24
694	vor	24,25,25
695	sub	9, 4, 8
696	vperm	28, 0, 0, 29
697
698.Lcbc_dec_head:
699	stvebx	28, 8, 9
700	cmpwi	8, 15
701	addi	8, 8, 1
702	bne	.Lcbc_dec_head
703
704	sub.	30, 30, 0
705	addi	4, 4, 16
706	beq	.Lcbc_unaligned_done
707
708.Lcbc_dec_loop:
709	vor	0,26,26
710	lvx	26, 0, 3
711	addi	3, 3, 16
712	vperm	0, 0, 26, 27
713	vor	25,0,0
714
715	bl	_vpaes_decrypt_core
716
717	vxor	0, 0, 24
718	vor	24,25,25
719	sub.	30, 30, 0
720	vperm	0, 0, 0, 29
721	vsel	1,28,0,30
722	vor	28,0,0
723	stvx	1, 0, 4
724	addi	4, 4, 16
725	bne	.Lcbc_dec_loop
726
727.Lcbc_done:
728	beq	1, .Lcbc_write_iv
729
730.Lcbc_unaligned_done:
731	andi.	8, 4, 15
732	sub	4, 4, 8
733	li	9, 0
734.Lcbc_tail:
735	stvebx	28, 9, 4
736	addi	9, 9, 1
737	cmpw	9, 8
738	bne	.Lcbc_tail
739
740.Lcbc_write_iv:
741	neg	8, 31
742	li	10, 4
743	lvsl	29, 0, 8
744	li	11, 8
745	li	12, 12
746	vperm	24, 24, 24, 29
747	stvewx	24, 0, 31
748	stvewx	24, 10, 31
749	stvewx	24, 11, 31
750	stvewx	24, 12, 31
751
752	mtspr	256,7
753	li	10,39
754	li	11,55
755	lvx	20,10,1
756	addi	10,10,32
757	lvx	21,11,1
758	addi	11,11,32
759	lvx	22,10,1
760	addi	10,10,32
761	lvx	23,11,1
762	addi	11,11,32
763	lvx	24,10,1
764	addi	10,10,32
765	lvx	25,11,1
766	addi	11,11,32
767	lvx	26,10,1
768	addi	10,10,32
769	lvx	27,11,1
770	addi	11,11,32
771	lvx	28,10,1
772	addi	10,10,32
773	lvx	29,11,1
774	addi	11,11,32
775	lvx	30,10,1
776	lvx	31,11,1
777.Lcbc_abort:
778	lwz	0, 244(1)
779	lwz	30,232(1)
780	lwz	31,236(1)
781	mtlr	0
782	addi	1,1,240
783	blr
784.long	0
785.byte	0,12,0x04,1,0x80,2,6,0
786.long	0
787
788
789
790
791
792
793.align	4
794_vpaes_key_preheat:
795	mflr	8
796	bl	.Lconsts
797	mtlr	8
798	li	11, 0xc0
799	li	10, 0xd0
800	li	9,  0xe0
801	li	8,  0xf0
802
803	vspltisb	8,4
804	vxor	9,9,9
805	lvx	10, 12, 11
806	li	11, 0x120
807	lvx	11, 12, 10
808	li	10, 0x130
809	lvx	12, 12, 9
810	li	9, 0x220
811	lvx	13, 12, 8
812	li	8, 0x230
813
814	lvx	14, 12, 11
815	li	11, 0x240
816	lvx	15, 12, 10
817	li	10, 0x250
818
819	lvx	16, 12, 9
820	li	9, 0x260
821	lvx	17, 12, 8
822	li	8, 0x270
823	lvx	18, 12, 11
824	li	11, 0x280
825	lvx	19, 12, 10
826	li	10, 0x290
827	lvx	20, 12, 9
828	li	9, 0x2a0
829	lvx	21, 12, 8
830	li	8, 0x2b0
831	lvx	22, 12, 11
832	lvx	23, 12, 10
833
834	lvx	24, 12, 9
835	lvx	25, 0, 12
836	lvx	26, 12, 8
837	blr
838.long	0
839.byte	0,12,0x14,0,0,0,0,0
840
841.align	4
842_vpaes_schedule_core:
843	mflr	7
844
845	bl	_vpaes_key_preheat
846
847
848	neg	8, 3
849	lvx	0, 0, 3
850	addi	3, 3, 15
851	lvsr	27, 0, 8
852	lvx	6, 0, 3
853	addi	3, 3, 8
854	vperm	0, 0, 6, 27
855
856
857	vor	3,0,0
858	bl	_vpaes_schedule_transform
859	vor	7,0,0
860
861	bne	1, .Lschedule_am_decrypting
862
863
864	li	8, 0x30
865	li	9, 4
866	li	10, 8
867	li	11, 12
868
869	lvsr	29, 0, 5
870	vnor	30, 9, 9
871	vperm	30, 9, 30, 29
872
873
874	vperm	28, 0, 0, 29
875	stvewx	28, 0, 5
876	stvewx	28, 9, 5
877	stvewx	28, 10, 5
878	addi	10, 12, 0x80
879	stvewx	28, 11, 5
880	b	.Lschedule_go
881
882.Lschedule_am_decrypting:
883	srwi	8, 4, 1
884	andi.	8, 8, 32
885	xori	8, 8, 32
886	addi	10, 12, 0x80
887
888	lvx	1, 8, 10
889	li	9, 4
890	li	10, 8
891	li	11, 12
892	vperm	4, 3, 3, 1
893
894	neg	0, 5
895	lvsl	29, 0, 0
896	vnor	30, 9, 9
897	vperm	30, 30, 9, 29
898
899
900	vperm	28, 4, 4, 29
901	stvewx	28, 0, 5
902	stvewx	28, 9, 5
903	stvewx	28, 10, 5
904	addi	10, 12, 0x80
905	stvewx	28, 11, 5
906	addi	5, 5, 15
907	xori	8, 8, 0x30
908
909.Lschedule_go:
910	cmplwi	4, 192
911	bgt	.Lschedule_256
912	beq	.Lschedule_192
913
914
915
916
917
918
919
920
921
922
923.Lschedule_128:
924	li	0, 10
925	mtctr	0
926
927.Loop_schedule_128:
928	bl	_vpaes_schedule_round
929	bdz	.Lschedule_mangle_last
930	bl	_vpaes_schedule_mangle
931	b	.Loop_schedule_128
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948.align	4
949.Lschedule_192:
950	li	0, 4
951	lvx	0, 0, 3
952	vperm	0, 6, 0, 27
953	vsldoi	0, 3, 0, 8
954	bl	_vpaes_schedule_transform
955	vsldoi	6, 0, 9, 8
956	vsldoi	6, 9, 6, 8
957	mtctr	0
958
959.Loop_schedule_192:
960	bl	_vpaes_schedule_round
961	vsldoi	0, 6, 0, 8
962	bl	_vpaes_schedule_mangle
963	bl	_vpaes_schedule_192_smear
964	bl	_vpaes_schedule_mangle
965	bl	_vpaes_schedule_round
966	bdz	.Lschedule_mangle_last
967	bl	_vpaes_schedule_mangle
968	bl	_vpaes_schedule_192_smear
969	b	.Loop_schedule_192
970
971
972
973
974
975
976
977
978
979
980
981.align	4
982.Lschedule_256:
983	li	0, 7
984	addi	3, 3, 8
985	lvx	0, 0, 3
986	vperm	0, 6, 0, 27
987	bl	_vpaes_schedule_transform
988	mtctr	0
989
990.Loop_schedule_256:
991	bl	_vpaes_schedule_mangle
992	vor	6,0,0
993
994
995	bl	_vpaes_schedule_round
996	bdz	.Lschedule_mangle_last
997	bl	_vpaes_schedule_mangle
998
999
1000	vspltw	0, 0, 3
1001	vor	5,7,7
1002	vor	7,6,6
1003	bl	_vpaes_schedule_low_round
1004	vor	7,5,5
1005
1006	b	.Loop_schedule_256
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017.align	4
1018.Lschedule_mangle_last:
1019
1020	li	11, 0x2e0
1021	li	9,  0x2f0
1022	bne	1, .Lschedule_mangle_last_dec
1023
1024
1025	lvx	1, 8, 10
1026	li	11, 0x2c0
1027	li	9,  0x2d0
1028	vperm	0, 0, 0, 1
1029
1030	lvx	12, 11, 12
1031	lvx	13, 9, 12
1032	addi	5, 5, 16
1033	vxor	0, 0, 26
1034	bl	_vpaes_schedule_transform
1035
1036
1037	vperm	0, 0, 0, 29
1038	li	10, 4
1039	vsel	2,28,0,30
1040	li	11, 8
1041	stvx	2, 0, 5
1042	li	12, 12
1043	stvewx	0, 0, 5
1044	stvewx	0, 10, 5
1045	stvewx	0, 11, 5
1046	stvewx	0, 12, 5
1047	b	.Lschedule_mangle_done
1048
1049.align	4
1050.Lschedule_mangle_last_dec:
1051	lvx	12, 11, 12
1052	lvx	13, 9,  12
1053	addi	5, 5, -16
1054	vxor	0, 0, 26
1055	bl	_vpaes_schedule_transform
1056
1057
1058	addi	9, 5, -15
1059	vperm	0, 0, 0, 29
1060	li	10, 4
1061	vsel	2,28,0,30
1062	li	11, 8
1063	stvx	2, 0, 5
1064	li	12, 12
1065	stvewx	0, 0, 9
1066	stvewx	0, 10, 9
1067	stvewx	0, 11, 9
1068	stvewx	0, 12, 9
1069
1070
1071.Lschedule_mangle_done:
1072	mtlr	7
1073
1074	vxor	0, 0, 0
1075	vxor	1, 1, 1
1076	vxor	2, 2, 2
1077	vxor	3, 3, 3
1078	vxor	4, 4, 4
1079	vxor	5, 5, 5
1080	vxor	6, 6, 6
1081	vxor	7, 7, 7
1082
1083	blr
1084.long	0
1085.byte	0,12,0x14,0,0,0,0,0
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101.align	4
1102_vpaes_schedule_192_smear:
1103	vspltw	0, 7, 3
1104	vsldoi	1, 9, 6, 12
1105	vsldoi	0, 7, 0, 8
1106	vxor	6, 6, 1
1107	vxor	6, 6, 0
1108	vor	0,6,6
1109	vsldoi	6, 6, 9, 8
1110	vsldoi	6, 9, 6, 8
1111	blr
1112.long	0
1113.byte	0,12,0x14,0,0,0,0,0
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133.align	4
1134_vpaes_schedule_round:
1135
1136
1137	vsldoi	1, 24, 9, 15
1138	vsldoi	24, 24, 24, 15
1139	vxor	7, 7, 1
1140
1141
1142	vspltw	0, 0, 3
1143	vsldoi	0, 0, 0, 1
1144
1145
1146
1147
1148_vpaes_schedule_low_round:
1149
1150	vsldoi	1, 9, 7, 12
1151	vxor	7, 7, 1
1152	vspltisb	1,0x0f
1153	vsldoi	4, 9, 7, 8
1154
1155
1156	vand	1, 1, 0
1157	vsrb	0, 0, 8
1158	vxor	7, 7, 4
1159	vperm	2, 11, 9, 1
1160	vxor	1, 1, 0
1161	vperm	3, 10, 9, 0
1162	vxor	3, 3, 2
1163	vperm	4, 10, 9, 1
1164	vxor	7, 7, 26
1165	vperm	3, 10, 9, 3
1166	vxor	4, 4, 2
1167	vperm	2, 10, 9, 4
1168	vxor	3, 3, 1
1169	vxor	2, 2, 0
1170	vperm	4, 15, 9, 3
1171	vperm	1, 14, 9, 2
1172	vxor	1, 1, 4
1173
1174
1175	vxor	0, 1, 7
1176	vxor	7, 1, 7
1177	blr
1178.long	0
1179.byte	0,12,0x14,0,0,0,0,0
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190.align	4
1191_vpaes_schedule_transform:
1192
1193	vsrb	2, 0, 8
1194
1195	vperm	0, 12, 12, 0
1196
1197	vperm	2, 13, 13, 2
1198	vxor	0, 0, 2
1199	blr
1200.long	0
1201.byte	0,12,0x14,0,0,0,0,0
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226.align	4
1227_vpaes_schedule_mangle:
1228
1229
1230	bne	1, .Lschedule_mangle_dec
1231
1232
1233	vxor	4, 0, 26
1234	addi	5, 5, 16
1235	vperm	4, 4, 4, 25
1236	vperm	1, 4, 4, 25
1237	vperm	3, 1, 1, 25
1238	vxor	4, 4, 1
1239	lvx	1, 8, 10
1240	vxor	3, 3, 4
1241
1242	vperm	3, 3, 3, 1
1243	addi	8, 8, -16
1244	andi.	8, 8, 0x30
1245
1246
1247	vperm	1, 3, 3, 29
1248	vsel	2,28,1,30
1249	vor	28,1,1
1250	stvx	2, 0, 5
1251	blr
1252
1253.align	4
1254.Lschedule_mangle_dec:
1255
1256
1257	vsrb	1, 0, 8
1258
1259
1260
1261	vperm	2, 16, 16, 0
1262
1263	vperm	3, 17, 17, 1
1264	vxor	3, 3, 2
1265	vperm	3, 3, 9, 25
1266
1267
1268	vperm	2, 18, 18, 0
1269	vxor	2, 2, 3
1270
1271	vperm	3, 19, 19, 1
1272	vxor	3, 3, 2
1273	vperm	3, 3, 9, 25
1274
1275
1276	vperm	2, 20, 20, 0
1277	vxor	2, 2, 3
1278
1279	vperm	3, 21, 21, 1
1280	vxor	3, 3, 2
1281
1282
1283	vperm	2, 22, 22, 0
1284	vperm	3, 3, 9, 25
1285
1286	vperm	4, 23, 23, 1
1287	lvx	1, 8, 10
1288	vxor	2, 2, 3
1289	vxor	3, 4, 2
1290
1291	addi	5, 5, -16
1292
1293	vperm	3, 3, 3, 1
1294	addi	8, 8, -16
1295	andi.	8, 8, 0x30
1296
1297
1298	vperm	1, 3, 3, 29
1299	vsel	2,28,1,30
1300	vor	28,1,1
1301	stvx	2, 0, 5
1302	blr
1303.long	0
1304.byte	0,12,0x14,0,0,0,0,0
1305
1306.globl	vpaes_set_encrypt_key
1307.type	vpaes_set_encrypt_key,@function
1308.align	5
1309vpaes_set_encrypt_key:
1310	stwu	1,-232(1)
1311	li	10,39
1312	li	11,55
1313	mflr	0
1314	mfspr	6,256
1315	stvx	20,10,1
1316	addi	10,10,32
1317	stvx	21,11,1
1318	addi	11,11,32
1319	stvx	22,10,1
1320	addi	10,10,32
1321	stvx	23,11,1
1322	addi	11,11,32
1323	stvx	24,10,1
1324	addi	10,10,32
1325	stvx	25,11,1
1326	addi	11,11,32
1327	stvx	26,10,1
1328	addi	10,10,32
1329	stvx	27,11,1
1330	addi	11,11,32
1331	stvx	28,10,1
1332	addi	10,10,32
1333	stvx	29,11,1
1334	addi	11,11,32
1335	stvx	30,10,1
1336	stvx	31,11,1
1337	stw	6,228(1)
1338	li	7, -1
1339	stw	0, 236(1)
1340	mtspr	256,7
1341
1342	srwi	9, 4, 5
1343	addi	9, 9, 6
1344	stw	9, 240(5)
1345
1346	.long	0x7c842040
1347	li	8, 0x30
1348	bl	_vpaes_schedule_core
1349
1350	lwz	0, 236(1)
1351	li	10,39
1352	li	11,55
1353	mtspr	256,6
1354	mtlr	0
1355	xor	3, 3, 3
1356	lvx	20,10,1
1357	addi	10,10,32
1358	lvx	21,11,1
1359	addi	11,11,32
1360	lvx	22,10,1
1361	addi	10,10,32
1362	lvx	23,11,1
1363	addi	11,11,32
1364	lvx	24,10,1
1365	addi	10,10,32
1366	lvx	25,11,1
1367	addi	11,11,32
1368	lvx	26,10,1
1369	addi	10,10,32
1370	lvx	27,11,1
1371	addi	11,11,32
1372	lvx	28,10,1
1373	addi	10,10,32
1374	lvx	29,11,1
1375	addi	11,11,32
1376	lvx	30,10,1
1377	lvx	31,11,1
1378	addi	1,1,232
1379	blr
1380.long	0
1381.byte	0,12,0x04,1,0x80,0,3,0
1382.long	0
1383
1384
1385.globl	vpaes_set_decrypt_key
1386.type	vpaes_set_decrypt_key,@function
1387.align	4
1388vpaes_set_decrypt_key:
1389	stwu	1,-232(1)
1390	li	10,39
1391	li	11,55
1392	mflr	0
1393	mfspr	6,256
1394	stvx	20,10,1
1395	addi	10,10,32
1396	stvx	21,11,1
1397	addi	11,11,32
1398	stvx	22,10,1
1399	addi	10,10,32
1400	stvx	23,11,1
1401	addi	11,11,32
1402	stvx	24,10,1
1403	addi	10,10,32
1404	stvx	25,11,1
1405	addi	11,11,32
1406	stvx	26,10,1
1407	addi	10,10,32
1408	stvx	27,11,1
1409	addi	11,11,32
1410	stvx	28,10,1
1411	addi	10,10,32
1412	stvx	29,11,1
1413	addi	11,11,32
1414	stvx	30,10,1
1415	stvx	31,11,1
1416	stw	6,228(1)
1417	li	7, -1
1418	stw	0, 236(1)
1419	mtspr	256,7
1420
1421	srwi	9, 4, 5
1422	addi	9, 9, 6
1423	stw	9, 240(5)
1424
1425	slwi	9, 9, 4
1426	add	5, 5, 9
1427
1428	cmplwi	1, 4, 0
1429	srwi	8, 4, 1
1430	andi.	8, 8, 32
1431	xori	8, 8, 32
1432	bl	_vpaes_schedule_core
1433
1434	lwz	0,  236(1)
1435	li	10,39
1436	li	11,55
1437	mtspr	256,6
1438	mtlr	0
1439	xor	3, 3, 3
1440	lvx	20,10,1
1441	addi	10,10,32
1442	lvx	21,11,1
1443	addi	11,11,32
1444	lvx	22,10,1
1445	addi	10,10,32
1446	lvx	23,11,1
1447	addi	11,11,32
1448	lvx	24,10,1
1449	addi	10,10,32
1450	lvx	25,11,1
1451	addi	11,11,32
1452	lvx	26,10,1
1453	addi	10,10,32
1454	lvx	27,11,1
1455	addi	11,11,32
1456	lvx	28,10,1
1457	addi	10,10,32
1458	lvx	29,11,1
1459	addi	11,11,32
1460	lvx	30,10,1
1461	lvx	31,11,1
1462	addi	1,1,232
1463	blr
1464.long	0
1465.byte	0,12,0x04,1,0x80,0,3,0
1466.long	0
1467
1468