bsaes-armv7.S revision 305153
1/* $FreeBSD: stable/11/secure/lib/libcrypto/arm/bsaes-armv7.S 305153 2016-08-31 20:33:59Z jkim $ */
2/* Do not modify. This file is auto-generated from bsaes-armv7.pl. */
3
4@ ====================================================================
5@ Written by Andy Polyakov <appro@openssl.org> for the OpenSSL
6@ project. The module is, however, dual licensed under OpenSSL and
7@ CRYPTOGAMS licenses depending on where you obtain it. For further
8@ details see http://www.openssl.org/~appro/cryptogams/.
9@
10@ Specific modes and adaptation for Linux kernel by Ard Biesheuvel
11@ <ard.biesheuvel@linaro.org>. Permission to use under GPL terms is
12@ granted.
13@ ====================================================================
14
15@ Bit-sliced AES for ARM NEON
16@
17@ February 2012.
18@
19@ This implementation is direct adaptation of bsaes-x86_64 module for
20@ ARM NEON. Except that this module is endian-neutral [in sense that
21@ it can be compiled for either endianness] by courtesy of vld1.8's
22@ neutrality. Initial version doesn't implement interface to OpenSSL,
23@ only low-level primitives and unsupported entry points, just enough
24@ to collect performance results, which for Cortex-A8 core are:
25@
26@ encrypt	19.5 cycles per byte processed with 128-bit key
27@ decrypt	22.1 cycles per byte processed with 128-bit key
28@ key conv.	440  cycles per 128-bit key/0.18 of 8x block
29@
30@ Snapdragon S4 encrypts byte in 17.6 cycles and decrypts in 19.7,
31@ which is [much] worse than anticipated (for further details see
32@ http://www.openssl.org/~appro/Snapdragon-S4.html).
33@
34@ Cortex-A15 manages in 14.2/16.1 cycles [when integer-only code
35@ manages in 20.0 cycles].
36@
37@ When comparing to x86_64 results keep in mind that NEON unit is
38@ [mostly] single-issue and thus can't [fully] benefit from
39@ instruction-level parallelism. And when comparing to aes-armv4
40@ results keep in mind key schedule conversion overhead (see
41@ bsaes-x86_64.pl for further details)...
42@
43@						<appro@openssl.org>
44
45@ April-August 2013
46@
47@ Add CBC, CTR and XTS subroutines, adapt for kernel use.
48@
49@					<ard.biesheuvel@linaro.org>
50
51#ifndef __KERNEL__
52# include "arm_arch.h"
53
54# define VFP_ABI_PUSH	vstmdb	sp!,{d8-d15}
55# define VFP_ABI_POP	vldmia	sp!,{d8-d15}
56# define VFP_ABI_FRAME	0x40
57#else
58# define VFP_ABI_PUSH
59# define VFP_ABI_POP
60# define VFP_ABI_FRAME	0
61# define BSAES_ASM_EXTENDED_KEY
62# define XTS_CHAIN_TWEAK
63# define __ARM_ARCH__ __LINUX_ARM_ARCH__
64# define __ARM_MAX_ARCH__ __LINUX_ARM_ARCH__
65#endif
66
67#ifdef __thumb__
68# define adrl adr
69#endif
70
71#if __ARM_MAX_ARCH__>=7
72.arch	armv7-a
73.fpu	neon
74
75.text
76.syntax	unified 	@ ARMv7-capable assembler is expected to handle this
77#ifdef __thumb2__
78.thumb
79#else
80.code   32
81#endif
82
83.type	_bsaes_decrypt8,%function
84.align	4
85_bsaes_decrypt8:
86	adr	r6,_bsaes_decrypt8
87	vldmia	r4!, {q9}		@ round 0 key
88	add	r6,r6,#.LM0ISR-_bsaes_decrypt8
89
90	vldmia	r6!, {q8}		@ .LM0ISR
91	veor	q10, q0, q9	@ xor with round0 key
92	veor	q11, q1, q9
93	 vtbl.8	d0, {q10}, d16
94	 vtbl.8	d1, {q10}, d17
95	veor	q12, q2, q9
96	 vtbl.8	d2, {q11}, d16
97	 vtbl.8	d3, {q11}, d17
98	veor	q13, q3, q9
99	 vtbl.8	d4, {q12}, d16
100	 vtbl.8	d5, {q12}, d17
101	veor	q14, q4, q9
102	 vtbl.8	d6, {q13}, d16
103	 vtbl.8	d7, {q13}, d17
104	veor	q15, q5, q9
105	 vtbl.8	d8, {q14}, d16
106	 vtbl.8	d9, {q14}, d17
107	veor	q10, q6, q9
108	 vtbl.8	d10, {q15}, d16
109	 vtbl.8	d11, {q15}, d17
110	veor	q11, q7, q9
111	 vtbl.8	d12, {q10}, d16
112	 vtbl.8	d13, {q10}, d17
113	 vtbl.8	d14, {q11}, d16
114	 vtbl.8	d15, {q11}, d17
115	vmov.i8	q8,#0x55			@ compose .LBS0
116	vmov.i8	q9,#0x33			@ compose .LBS1
117	vshr.u64	q10, q6, #1
118	 vshr.u64	q11, q4, #1
119	veor		q10, q10, q7
120	 veor		q11, q11, q5
121	vand		q10, q10, q8
122	 vand		q11, q11, q8
123	veor		q7, q7, q10
124	vshl.u64	q10, q10, #1
125	 veor		q5, q5, q11
126	 vshl.u64	q11, q11, #1
127	veor		q6, q6, q10
128	 veor		q4, q4, q11
129	vshr.u64	q10, q2, #1
130	 vshr.u64	q11, q0, #1
131	veor		q10, q10, q3
132	 veor		q11, q11, q1
133	vand		q10, q10, q8
134	 vand		q11, q11, q8
135	veor		q3, q3, q10
136	vshl.u64	q10, q10, #1
137	 veor		q1, q1, q11
138	 vshl.u64	q11, q11, #1
139	veor		q2, q2, q10
140	 veor		q0, q0, q11
141	vmov.i8	q8,#0x0f			@ compose .LBS2
142	vshr.u64	q10, q5, #2
143	 vshr.u64	q11, q4, #2
144	veor		q10, q10, q7
145	 veor		q11, q11, q6
146	vand		q10, q10, q9
147	 vand		q11, q11, q9
148	veor		q7, q7, q10
149	vshl.u64	q10, q10, #2
150	 veor		q6, q6, q11
151	 vshl.u64	q11, q11, #2
152	veor		q5, q5, q10
153	 veor		q4, q4, q11
154	vshr.u64	q10, q1, #2
155	 vshr.u64	q11, q0, #2
156	veor		q10, q10, q3
157	 veor		q11, q11, q2
158	vand		q10, q10, q9
159	 vand		q11, q11, q9
160	veor		q3, q3, q10
161	vshl.u64	q10, q10, #2
162	 veor		q2, q2, q11
163	 vshl.u64	q11, q11, #2
164	veor		q1, q1, q10
165	 veor		q0, q0, q11
166	vshr.u64	q10, q3, #4
167	 vshr.u64	q11, q2, #4
168	veor		q10, q10, q7
169	 veor		q11, q11, q6
170	vand		q10, q10, q8
171	 vand		q11, q11, q8
172	veor		q7, q7, q10
173	vshl.u64	q10, q10, #4
174	 veor		q6, q6, q11
175	 vshl.u64	q11, q11, #4
176	veor		q3, q3, q10
177	 veor		q2, q2, q11
178	vshr.u64	q10, q1, #4
179	 vshr.u64	q11, q0, #4
180	veor		q10, q10, q5
181	 veor		q11, q11, q4
182	vand		q10, q10, q8
183	 vand		q11, q11, q8
184	veor		q5, q5, q10
185	vshl.u64	q10, q10, #4
186	 veor		q4, q4, q11
187	 vshl.u64	q11, q11, #4
188	veor		q1, q1, q10
189	 veor		q0, q0, q11
190	sub	r5,r5,#1
191	b	.Ldec_sbox
192.align	4
193.Ldec_loop:
194	vldmia	r4!, {q8-q11}
195	veor	q8, q8, q0
196	veor	q9, q9, q1
197	vtbl.8	d0, {q8}, d24
198	vtbl.8	d1, {q8}, d25
199	vldmia	r4!, {q8}
200	veor	q10, q10, q2
201	vtbl.8	d2, {q9}, d24
202	vtbl.8	d3, {q9}, d25
203	vldmia	r4!, {q9}
204	veor	q11, q11, q3
205	vtbl.8	d4, {q10}, d24
206	vtbl.8	d5, {q10}, d25
207	vldmia	r4!, {q10}
208	vtbl.8	d6, {q11}, d24
209	vtbl.8	d7, {q11}, d25
210	vldmia	r4!, {q11}
211	veor	q8, q8, q4
212	veor	q9, q9, q5
213	vtbl.8	d8, {q8}, d24
214	vtbl.8	d9, {q8}, d25
215	veor	q10, q10, q6
216	vtbl.8	d10, {q9}, d24
217	vtbl.8	d11, {q9}, d25
218	veor	q11, q11, q7
219	vtbl.8	d12, {q10}, d24
220	vtbl.8	d13, {q10}, d25
221	vtbl.8	d14, {q11}, d24
222	vtbl.8	d15, {q11}, d25
223.Ldec_sbox:
224	 veor	q1, q1, q4
225	veor	q3, q3, q4
226
227	veor	q4, q4, q7
228	 veor	q1, q1, q6
229	veor	q2, q2, q7
230	veor	q6, q6, q4
231
232	veor	q0, q0, q1
233	veor	q2, q2, q5
234	 veor	q7, q7, q6
235	veor	q3, q3, q0
236	veor	q5, q5, q0
237	veor	q1, q1, q3
238	veor	q11, q3, q0
239	veor	q10, q7, q4
240	veor	q9, q1, q6
241	veor	q13, q4, q0
242	 vmov	q8, q10
243	veor	q12, q5, q2
244
245	vorr	q10, q10, q9
246	veor	q15, q11, q8
247	vand	q14, q11, q12
248	vorr	q11, q11, q12
249	veor	q12, q12, q9
250	vand	q8, q8, q9
251	veor	q9, q6, q2
252	vand	q15, q15, q12
253	vand	q13, q13, q9
254	veor	q9, q3, q7
255	veor	q12, q1, q5
256	veor	q11, q11, q13
257	veor	q10, q10, q13
258	vand	q13, q9, q12
259	vorr	q9, q9, q12
260	veor	q11, q11, q15
261	veor	q8, q8, q13
262	veor	q10, q10, q14
263	veor	q9, q9, q15
264	veor	q8, q8, q14
265	vand	q12, q4, q6
266	veor	q9, q9, q14
267	vand	q13, q0, q2
268	vand	q14, q7, q1
269	vorr	q15, q3, q5
270	veor	q11, q11, q12
271	veor	q9, q9, q14
272	veor	q8, q8, q15
273	veor	q10, q10, q13
274
275	@ Inv_GF16 	0, 	1, 	2, 	3, s0, s1, s2, s3
276
277	@ new smaller inversion
278
279	vand	q14, q11, q9
280	vmov	q12, q8
281
282	veor	q13, q10, q14
283	veor	q15, q8, q14
284	veor	q14, q8, q14	@ q14=q15
285
286	vbsl	q13, q9, q8
287	vbsl	q15, q11, q10
288	veor	q11, q11, q10
289
290	vbsl	q12, q13, q14
291	vbsl	q8, q14, q13
292
293	vand	q14, q12, q15
294	veor	q9, q9, q8
295
296	veor	q14, q14, q11
297	veor	q12, q5, q2
298	veor	q8, q1, q6
299	veor 	q10, q15, q14
300	vand	q10, q10, q5
301	veor	q5, q5, q1
302	vand	q11, q1, q15
303	vand	q5, q5, q14
304	veor	q1, q11, q10
305	veor	q5, q5, q11
306	veor	q15, q15, q13
307	veor	q14, q14, q9
308	veor	q11, q15, q14
309	 veor 	q10, q13, q9
310	vand	q11, q11, q12
311	 vand	q10, q10, q2
312	veor	q12, q12, q8
313	 veor	q2, q2, q6
314	vand	q8, q8, q15
315	 vand	q6, q6, q13
316	vand	q12, q12, q14
317	 vand	q2, q2, q9
318	veor	q8, q8, q12
319	 veor	q2, q2, q6
320	veor	q12, q12, q11
321	 veor	q6, q6, q10
322	veor	q5, q5, q12
323	veor	q2, q2, q12
324	veor	q1, q1, q8
325	veor	q6, q6, q8
326
327	veor	q12, q3, q0
328	veor	q8, q7, q4
329	veor	q11, q15, q14
330	 veor 	q10, q13, q9
331	vand	q11, q11, q12
332	 vand	q10, q10, q0
333	veor	q12, q12, q8
334	 veor	q0, q0, q4
335	vand	q8, q8, q15
336	 vand	q4, q4, q13
337	vand	q12, q12, q14
338	 vand	q0, q0, q9
339	veor	q8, q8, q12
340	 veor	q0, q0, q4
341	veor	q12, q12, q11
342	 veor	q4, q4, q10
343	veor	q15, q15, q13
344	veor	q14, q14, q9
345	veor 	q10, q15, q14
346	vand	q10, q10, q3
347	veor	q3, q3, q7
348	vand	q11, q7, q15
349	vand	q3, q3, q14
350	veor	q7, q11, q10
351	veor	q3, q3, q11
352	veor	q3, q3, q12
353	veor	q0, q0, q12
354	veor	q7, q7, q8
355	veor	q4, q4, q8
356	veor	q1, q1, q7
357	veor	q6, q6, q5
358
359	veor	q4, q4, q1
360	veor	q2, q2, q7
361	veor	q5, q5, q7
362	veor	q4, q4, q2
363	 veor 	q7, q7, q0
364	veor	q4, q4, q5
365	 veor	q3, q3, q6
366	 veor	q6, q6, q1
367	veor	q3, q3, q4
368
369	veor	q4, q4, q0
370	veor	q7, q7, q3
371	subs	r5,r5,#1
372	bcc	.Ldec_done
373	@ multiplication by 0x05-0x00-0x04-0x00
374	vext.8	q8, q0, q0, #8
375	vext.8	q14, q3, q3, #8
376	vext.8	q15, q5, q5, #8
377	veor	q8, q8, q0
378	vext.8	q9, q1, q1, #8
379	veor	q14, q14, q3
380	vext.8	q10, q6, q6, #8
381	veor	q15, q15, q5
382	vext.8	q11, q4, q4, #8
383	veor	q9, q9, q1
384	vext.8	q12, q2, q2, #8
385	veor	q10, q10, q6
386	vext.8	q13, q7, q7, #8
387	veor	q11, q11, q4
388	veor	q12, q12, q2
389	veor	q13, q13, q7
390
391	 veor	q0, q0, q14
392	 veor	q1, q1, q14
393	 veor	q6, q6, q8
394	 veor	q2, q2, q10
395	 veor	q4, q4, q9
396	 veor	q1, q1, q15
397	 veor	q6, q6, q15
398	 veor	q2, q2, q14
399	 veor	q7, q7, q11
400	 veor	q4, q4, q14
401	 veor	q3, q3, q12
402	 veor	q2, q2, q15
403	 veor	q7, q7, q15
404	 veor	q5, q5, q13
405	vext.8	q8, q0, q0, #12	@ x0 <<< 32
406	vext.8	q9, q1, q1, #12
407	 veor	q0, q0, q8		@ x0 ^ (x0 <<< 32)
408	vext.8	q10, q6, q6, #12
409	 veor	q1, q1, q9
410	vext.8	q11, q4, q4, #12
411	 veor	q6, q6, q10
412	vext.8	q12, q2, q2, #12
413	 veor	q4, q4, q11
414	vext.8	q13, q7, q7, #12
415	 veor	q2, q2, q12
416	vext.8	q14, q3, q3, #12
417	 veor	q7, q7, q13
418	vext.8	q15, q5, q5, #12
419	 veor	q3, q3, q14
420
421	veor	q9, q9, q0
422	 veor	q5, q5, q15
423	 vext.8	q0, q0, q0, #8		@ (x0 ^ (x0 <<< 32)) <<< 64)
424	veor	q10, q10, q1
425	veor	q8, q8, q5
426	veor	q9, q9, q5
427	 vext.8	q1, q1, q1, #8
428	veor	q13, q13, q2
429	 veor	q0, q0, q8
430	veor	q14, q14, q7
431	 veor	q1, q1, q9
432	 vext.8	q8, q2, q2, #8
433	veor	q12, q12, q4
434	 vext.8	q9, q7, q7, #8
435	veor	q15, q15, q3
436	 vext.8	q2, q4, q4, #8
437	veor	q11, q11, q6
438	 vext.8	q7, q5, q5, #8
439	veor	q12, q12, q5
440	 vext.8	q4, q3, q3, #8
441	veor	q11, q11, q5
442	 vext.8	q3, q6, q6, #8
443	veor	q5, q9, q13
444	veor	q11, q11, q2
445	veor	q7, q7, q15
446	veor	q6, q4, q14
447	veor	q4, q8, q12
448	veor	q2, q3, q10
449	vmov	q3, q11
450	 @ vmov	q5, q9
451	vldmia	r6, {q12}		@ .LISR
452	ite	eq				@ Thumb2 thing, sanity check in ARM
453	addeq	r6,r6,#0x10
454	bne	.Ldec_loop
455	vldmia	r6, {q12}		@ .LISRM0
456	b	.Ldec_loop
457.align	4
458.Ldec_done:
459	vmov.i8	q8,#0x55			@ compose .LBS0
460	vmov.i8	q9,#0x33			@ compose .LBS1
461	vshr.u64	q10, q3, #1
462	 vshr.u64	q11, q2, #1
463	veor		q10, q10, q5
464	 veor		q11, q11, q7
465	vand		q10, q10, q8
466	 vand		q11, q11, q8
467	veor		q5, q5, q10
468	vshl.u64	q10, q10, #1
469	 veor		q7, q7, q11
470	 vshl.u64	q11, q11, #1
471	veor		q3, q3, q10
472	 veor		q2, q2, q11
473	vshr.u64	q10, q6, #1
474	 vshr.u64	q11, q0, #1
475	veor		q10, q10, q4
476	 veor		q11, q11, q1
477	vand		q10, q10, q8
478	 vand		q11, q11, q8
479	veor		q4, q4, q10
480	vshl.u64	q10, q10, #1
481	 veor		q1, q1, q11
482	 vshl.u64	q11, q11, #1
483	veor		q6, q6, q10
484	 veor		q0, q0, q11
485	vmov.i8	q8,#0x0f			@ compose .LBS2
486	vshr.u64	q10, q7, #2
487	 vshr.u64	q11, q2, #2
488	veor		q10, q10, q5
489	 veor		q11, q11, q3
490	vand		q10, q10, q9
491	 vand		q11, q11, q9
492	veor		q5, q5, q10
493	vshl.u64	q10, q10, #2
494	 veor		q3, q3, q11
495	 vshl.u64	q11, q11, #2
496	veor		q7, q7, q10
497	 veor		q2, q2, q11
498	vshr.u64	q10, q1, #2
499	 vshr.u64	q11, q0, #2
500	veor		q10, q10, q4
501	 veor		q11, q11, q6
502	vand		q10, q10, q9
503	 vand		q11, q11, q9
504	veor		q4, q4, q10
505	vshl.u64	q10, q10, #2
506	 veor		q6, q6, q11
507	 vshl.u64	q11, q11, #2
508	veor		q1, q1, q10
509	 veor		q0, q0, q11
510	vshr.u64	q10, q4, #4
511	 vshr.u64	q11, q6, #4
512	veor		q10, q10, q5
513	 veor		q11, q11, q3
514	vand		q10, q10, q8
515	 vand		q11, q11, q8
516	veor		q5, q5, q10
517	vshl.u64	q10, q10, #4
518	 veor		q3, q3, q11
519	 vshl.u64	q11, q11, #4
520	veor		q4, q4, q10
521	 veor		q6, q6, q11
522	vshr.u64	q10, q1, #4
523	 vshr.u64	q11, q0, #4
524	veor		q10, q10, q7
525	 veor		q11, q11, q2
526	vand		q10, q10, q8
527	 vand		q11, q11, q8
528	veor		q7, q7, q10
529	vshl.u64	q10, q10, #4
530	 veor		q2, q2, q11
531	 vshl.u64	q11, q11, #4
532	veor		q1, q1, q10
533	 veor		q0, q0, q11
534	vldmia	r4, {q8}			@ last round key
535	veor	q6, q6, q8
536	veor	q4, q4, q8
537	veor	q2, q2, q8
538	veor	q7, q7, q8
539	veor	q3, q3, q8
540	veor	q5, q5, q8
541	veor	q0, q0, q8
542	veor	q1, q1, q8
543	bx	lr
544.size	_bsaes_decrypt8,.-_bsaes_decrypt8
545
546.type	_bsaes_const,%object
547.align	6
548_bsaes_const:
549.LM0ISR:	@ InvShiftRows constants
550	.quad	0x0a0e0206070b0f03, 0x0004080c0d010509
551.LISR:
552	.quad	0x0504070602010003, 0x0f0e0d0c080b0a09
553.LISRM0:
554	.quad	0x01040b0e0205080f, 0x0306090c00070a0d
555.LM0SR:		@ ShiftRows constants
556	.quad	0x0a0e02060f03070b, 0x0004080c05090d01
557.LSR:
558	.quad	0x0504070600030201, 0x0f0e0d0c0a09080b
559.LSRM0:
560	.quad	0x0304090e00050a0f, 0x01060b0c0207080d
561.LM0:
562	.quad	0x02060a0e03070b0f, 0x0004080c0105090d
563.LREVM0SR:
564	.quad	0x090d01050c000408, 0x03070b0f060a0e02
565.asciz	"Bit-sliced AES for NEON, CRYPTOGAMS by <appro@openssl.org>"
566.align	6
567.size	_bsaes_const,.-_bsaes_const
568
569.type	_bsaes_encrypt8,%function
570.align	4
571_bsaes_encrypt8:
572	adr	r6,_bsaes_encrypt8
573	vldmia	r4!, {q9}		@ round 0 key
574	sub	r6,r6,#_bsaes_encrypt8-.LM0SR
575
576	vldmia	r6!, {q8}		@ .LM0SR
577_bsaes_encrypt8_alt:
578	veor	q10, q0, q9	@ xor with round0 key
579	veor	q11, q1, q9
580	 vtbl.8	d0, {q10}, d16
581	 vtbl.8	d1, {q10}, d17
582	veor	q12, q2, q9
583	 vtbl.8	d2, {q11}, d16
584	 vtbl.8	d3, {q11}, d17
585	veor	q13, q3, q9
586	 vtbl.8	d4, {q12}, d16
587	 vtbl.8	d5, {q12}, d17
588	veor	q14, q4, q9
589	 vtbl.8	d6, {q13}, d16
590	 vtbl.8	d7, {q13}, d17
591	veor	q15, q5, q9
592	 vtbl.8	d8, {q14}, d16
593	 vtbl.8	d9, {q14}, d17
594	veor	q10, q6, q9
595	 vtbl.8	d10, {q15}, d16
596	 vtbl.8	d11, {q15}, d17
597	veor	q11, q7, q9
598	 vtbl.8	d12, {q10}, d16
599	 vtbl.8	d13, {q10}, d17
600	 vtbl.8	d14, {q11}, d16
601	 vtbl.8	d15, {q11}, d17
602_bsaes_encrypt8_bitslice:
603	vmov.i8	q8,#0x55			@ compose .LBS0
604	vmov.i8	q9,#0x33			@ compose .LBS1
605	vshr.u64	q10, q6, #1
606	 vshr.u64	q11, q4, #1
607	veor		q10, q10, q7
608	 veor		q11, q11, q5
609	vand		q10, q10, q8
610	 vand		q11, q11, q8
611	veor		q7, q7, q10
612	vshl.u64	q10, q10, #1
613	 veor		q5, q5, q11
614	 vshl.u64	q11, q11, #1
615	veor		q6, q6, q10
616	 veor		q4, q4, q11
617	vshr.u64	q10, q2, #1
618	 vshr.u64	q11, q0, #1
619	veor		q10, q10, q3
620	 veor		q11, q11, q1
621	vand		q10, q10, q8
622	 vand		q11, q11, q8
623	veor		q3, q3, q10
624	vshl.u64	q10, q10, #1
625	 veor		q1, q1, q11
626	 vshl.u64	q11, q11, #1
627	veor		q2, q2, q10
628	 veor		q0, q0, q11
629	vmov.i8	q8,#0x0f			@ compose .LBS2
630	vshr.u64	q10, q5, #2
631	 vshr.u64	q11, q4, #2
632	veor		q10, q10, q7
633	 veor		q11, q11, q6
634	vand		q10, q10, q9
635	 vand		q11, q11, q9
636	veor		q7, q7, q10
637	vshl.u64	q10, q10, #2
638	 veor		q6, q6, q11
639	 vshl.u64	q11, q11, #2
640	veor		q5, q5, q10
641	 veor		q4, q4, q11
642	vshr.u64	q10, q1, #2
643	 vshr.u64	q11, q0, #2
644	veor		q10, q10, q3
645	 veor		q11, q11, q2
646	vand		q10, q10, q9
647	 vand		q11, q11, q9
648	veor		q3, q3, q10
649	vshl.u64	q10, q10, #2
650	 veor		q2, q2, q11
651	 vshl.u64	q11, q11, #2
652	veor		q1, q1, q10
653	 veor		q0, q0, q11
654	vshr.u64	q10, q3, #4
655	 vshr.u64	q11, q2, #4
656	veor		q10, q10, q7
657	 veor		q11, q11, q6
658	vand		q10, q10, q8
659	 vand		q11, q11, q8
660	veor		q7, q7, q10
661	vshl.u64	q10, q10, #4
662	 veor		q6, q6, q11
663	 vshl.u64	q11, q11, #4
664	veor		q3, q3, q10
665	 veor		q2, q2, q11
666	vshr.u64	q10, q1, #4
667	 vshr.u64	q11, q0, #4
668	veor		q10, q10, q5
669	 veor		q11, q11, q4
670	vand		q10, q10, q8
671	 vand		q11, q11, q8
672	veor		q5, q5, q10
673	vshl.u64	q10, q10, #4
674	 veor		q4, q4, q11
675	 vshl.u64	q11, q11, #4
676	veor		q1, q1, q10
677	 veor		q0, q0, q11
678	sub	r5,r5,#1
679	b	.Lenc_sbox
680.align	4
681.Lenc_loop:
682	vldmia	r4!, {q8-q11}
683	veor	q8, q8, q0
684	veor	q9, q9, q1
685	vtbl.8	d0, {q8}, d24
686	vtbl.8	d1, {q8}, d25
687	vldmia	r4!, {q8}
688	veor	q10, q10, q2
689	vtbl.8	d2, {q9}, d24
690	vtbl.8	d3, {q9}, d25
691	vldmia	r4!, {q9}
692	veor	q11, q11, q3
693	vtbl.8	d4, {q10}, d24
694	vtbl.8	d5, {q10}, d25
695	vldmia	r4!, {q10}
696	vtbl.8	d6, {q11}, d24
697	vtbl.8	d7, {q11}, d25
698	vldmia	r4!, {q11}
699	veor	q8, q8, q4
700	veor	q9, q9, q5
701	vtbl.8	d8, {q8}, d24
702	vtbl.8	d9, {q8}, d25
703	veor	q10, q10, q6
704	vtbl.8	d10, {q9}, d24
705	vtbl.8	d11, {q9}, d25
706	veor	q11, q11, q7
707	vtbl.8	d12, {q10}, d24
708	vtbl.8	d13, {q10}, d25
709	vtbl.8	d14, {q11}, d24
710	vtbl.8	d15, {q11}, d25
711.Lenc_sbox:
712	veor	q2, q2, q1
713	veor	q5, q5, q6
714	veor	q3, q3, q0
715	veor	q6, q6, q2
716	veor	q5, q5, q0
717
718	veor	q6, q6, q3
719	veor	q3, q3, q7
720	veor	q7, q7, q5
721	veor	q3, q3, q4
722	veor	q4, q4, q5
723
724	veor	q2, q2, q7
725	veor	q3, q3, q1
726	veor	q1, q1, q5
727	veor	q11, q7, q4
728	veor	q10, q1, q2
729	veor	q9, q5, q3
730	veor	q13, q2, q4
731	 vmov	q8, q10
732	veor	q12, q6, q0
733
734	vorr	q10, q10, q9
735	veor	q15, q11, q8
736	vand	q14, q11, q12
737	vorr	q11, q11, q12
738	veor	q12, q12, q9
739	vand	q8, q8, q9
740	veor	q9, q3, q0
741	vand	q15, q15, q12
742	vand	q13, q13, q9
743	veor	q9, q7, q1
744	veor	q12, q5, q6
745	veor	q11, q11, q13
746	veor	q10, q10, q13
747	vand	q13, q9, q12
748	vorr	q9, q9, q12
749	veor	q11, q11, q15
750	veor	q8, q8, q13
751	veor	q10, q10, q14
752	veor	q9, q9, q15
753	veor	q8, q8, q14
754	vand	q12, q2, q3
755	veor	q9, q9, q14
756	vand	q13, q4, q0
757	vand	q14, q1, q5
758	vorr	q15, q7, q6
759	veor	q11, q11, q12
760	veor	q9, q9, q14
761	veor	q8, q8, q15
762	veor	q10, q10, q13
763
764	@ Inv_GF16 	0, 	1, 	2, 	3, s0, s1, s2, s3
765
766	@ new smaller inversion
767
768	vand	q14, q11, q9
769	vmov	q12, q8
770
771	veor	q13, q10, q14
772	veor	q15, q8, q14
773	veor	q14, q8, q14	@ q14=q15
774
775	vbsl	q13, q9, q8
776	vbsl	q15, q11, q10
777	veor	q11, q11, q10
778
779	vbsl	q12, q13, q14
780	vbsl	q8, q14, q13
781
782	vand	q14, q12, q15
783	veor	q9, q9, q8
784
785	veor	q14, q14, q11
786	veor	q12, q6, q0
787	veor	q8, q5, q3
788	veor 	q10, q15, q14
789	vand	q10, q10, q6
790	veor	q6, q6, q5
791	vand	q11, q5, q15
792	vand	q6, q6, q14
793	veor	q5, q11, q10
794	veor	q6, q6, q11
795	veor	q15, q15, q13
796	veor	q14, q14, q9
797	veor	q11, q15, q14
798	 veor 	q10, q13, q9
799	vand	q11, q11, q12
800	 vand	q10, q10, q0
801	veor	q12, q12, q8
802	 veor	q0, q0, q3
803	vand	q8, q8, q15
804	 vand	q3, q3, q13
805	vand	q12, q12, q14
806	 vand	q0, q0, q9
807	veor	q8, q8, q12
808	 veor	q0, q0, q3
809	veor	q12, q12, q11
810	 veor	q3, q3, q10
811	veor	q6, q6, q12
812	veor	q0, q0, q12
813	veor	q5, q5, q8
814	veor	q3, q3, q8
815
816	veor	q12, q7, q4
817	veor	q8, q1, q2
818	veor	q11, q15, q14
819	 veor 	q10, q13, q9
820	vand	q11, q11, q12
821	 vand	q10, q10, q4
822	veor	q12, q12, q8
823	 veor	q4, q4, q2
824	vand	q8, q8, q15
825	 vand	q2, q2, q13
826	vand	q12, q12, q14
827	 vand	q4, q4, q9
828	veor	q8, q8, q12
829	 veor	q4, q4, q2
830	veor	q12, q12, q11
831	 veor	q2, q2, q10
832	veor	q15, q15, q13
833	veor	q14, q14, q9
834	veor 	q10, q15, q14
835	vand	q10, q10, q7
836	veor	q7, q7, q1
837	vand	q11, q1, q15
838	vand	q7, q7, q14
839	veor	q1, q11, q10
840	veor	q7, q7, q11
841	veor	q7, q7, q12
842	veor	q4, q4, q12
843	veor	q1, q1, q8
844	veor	q2, q2, q8
845	veor	q7, q7, q0
846	veor	q1, q1, q6
847	veor	q6, q6, q0
848	veor	q4, q4, q7
849	veor	q0, q0, q1
850
851	veor	q1, q1, q5
852	veor	q5, q5, q2
853	veor	q2, q2, q3
854	veor	q3, q3, q5
855	veor	q4, q4, q5
856
857	veor	q6, q6, q3
858	subs	r5,r5,#1
859	bcc	.Lenc_done
860	vext.8	q8, q0, q0, #12	@ x0 <<< 32
861	vext.8	q9, q1, q1, #12
862	 veor	q0, q0, q8		@ x0 ^ (x0 <<< 32)
863	vext.8	q10, q4, q4, #12
864	 veor	q1, q1, q9
865	vext.8	q11, q6, q6, #12
866	 veor	q4, q4, q10
867	vext.8	q12, q3, q3, #12
868	 veor	q6, q6, q11
869	vext.8	q13, q7, q7, #12
870	 veor	q3, q3, q12
871	vext.8	q14, q2, q2, #12
872	 veor	q7, q7, q13
873	vext.8	q15, q5, q5, #12
874	 veor	q2, q2, q14
875
876	veor	q9, q9, q0
877	 veor	q5, q5, q15
878	 vext.8	q0, q0, q0, #8		@ (x0 ^ (x0 <<< 32)) <<< 64)
879	veor	q10, q10, q1
880	veor	q8, q8, q5
881	veor	q9, q9, q5
882	 vext.8	q1, q1, q1, #8
883	veor	q13, q13, q3
884	 veor	q0, q0, q8
885	veor	q14, q14, q7
886	 veor	q1, q1, q9
887	 vext.8	q8, q3, q3, #8
888	veor	q12, q12, q6
889	 vext.8	q9, q7, q7, #8
890	veor	q15, q15, q2
891	 vext.8	q3, q6, q6, #8
892	veor	q11, q11, q4
893	 vext.8	q7, q5, q5, #8
894	veor	q12, q12, q5
895	 vext.8	q6, q2, q2, #8
896	veor	q11, q11, q5
897	 vext.8	q2, q4, q4, #8
898	veor	q5, q9, q13
899	veor	q4, q8, q12
900	veor	q3, q3, q11
901	veor	q7, q7, q15
902	veor	q6, q6, q14
903	 @ vmov	q4, q8
904	veor	q2, q2, q10
905	 @ vmov	q5, q9
906	vldmia	r6, {q12}		@ .LSR
907	ite	eq				@ Thumb2 thing, samity check in ARM
908	addeq	r6,r6,#0x10
909	bne	.Lenc_loop
910	vldmia	r6, {q12}		@ .LSRM0
911	b	.Lenc_loop
912.align	4
913.Lenc_done:
914	vmov.i8	q8,#0x55			@ compose .LBS0
915	vmov.i8	q9,#0x33			@ compose .LBS1
916	vshr.u64	q10, q2, #1
917	 vshr.u64	q11, q3, #1
918	veor		q10, q10, q5
919	 veor		q11, q11, q7
920	vand		q10, q10, q8
921	 vand		q11, q11, q8
922	veor		q5, q5, q10
923	vshl.u64	q10, q10, #1
924	 veor		q7, q7, q11
925	 vshl.u64	q11, q11, #1
926	veor		q2, q2, q10
927	 veor		q3, q3, q11
928	vshr.u64	q10, q4, #1
929	 vshr.u64	q11, q0, #1
930	veor		q10, q10, q6
931	 veor		q11, q11, q1
932	vand		q10, q10, q8
933	 vand		q11, q11, q8
934	veor		q6, q6, q10
935	vshl.u64	q10, q10, #1
936	 veor		q1, q1, q11
937	 vshl.u64	q11, q11, #1
938	veor		q4, q4, q10
939	 veor		q0, q0, q11
940	vmov.i8	q8,#0x0f			@ compose .LBS2
941	vshr.u64	q10, q7, #2
942	 vshr.u64	q11, q3, #2
943	veor		q10, q10, q5
944	 veor		q11, q11, q2
945	vand		q10, q10, q9
946	 vand		q11, q11, q9
947	veor		q5, q5, q10
948	vshl.u64	q10, q10, #2
949	 veor		q2, q2, q11
950	 vshl.u64	q11, q11, #2
951	veor		q7, q7, q10
952	 veor		q3, q3, q11
953	vshr.u64	q10, q1, #2
954	 vshr.u64	q11, q0, #2
955	veor		q10, q10, q6
956	 veor		q11, q11, q4
957	vand		q10, q10, q9
958	 vand		q11, q11, q9
959	veor		q6, q6, q10
960	vshl.u64	q10, q10, #2
961	 veor		q4, q4, q11
962	 vshl.u64	q11, q11, #2
963	veor		q1, q1, q10
964	 veor		q0, q0, q11
965	vshr.u64	q10, q6, #4
966	 vshr.u64	q11, q4, #4
967	veor		q10, q10, q5
968	 veor		q11, q11, q2
969	vand		q10, q10, q8
970	 vand		q11, q11, q8
971	veor		q5, q5, q10
972	vshl.u64	q10, q10, #4
973	 veor		q2, q2, q11
974	 vshl.u64	q11, q11, #4
975	veor		q6, q6, q10
976	 veor		q4, q4, q11
977	vshr.u64	q10, q1, #4
978	 vshr.u64	q11, q0, #4
979	veor		q10, q10, q7
980	 veor		q11, q11, q3
981	vand		q10, q10, q8
982	 vand		q11, q11, q8
983	veor		q7, q7, q10
984	vshl.u64	q10, q10, #4
985	 veor		q3, q3, q11
986	 vshl.u64	q11, q11, #4
987	veor		q1, q1, q10
988	 veor		q0, q0, q11
989	vldmia	r4, {q8}			@ last round key
990	veor	q4, q4, q8
991	veor	q6, q6, q8
992	veor	q3, q3, q8
993	veor	q7, q7, q8
994	veor	q2, q2, q8
995	veor	q5, q5, q8
996	veor	q0, q0, q8
997	veor	q1, q1, q8
998	bx	lr
999.size	_bsaes_encrypt8,.-_bsaes_encrypt8
1000.type	_bsaes_key_convert,%function
1001.align	4
1002_bsaes_key_convert:
1003	adr	r6,_bsaes_key_convert
1004	vld1.8	{q7},  [r4]!		@ load round 0 key
1005	sub	r6,r6,#_bsaes_key_convert-.LM0
1006	vld1.8	{q15}, [r4]!		@ load round 1 key
1007
1008	vmov.i8	q8,  #0x01			@ bit masks
1009	vmov.i8	q9,  #0x02
1010	vmov.i8	q10, #0x04
1011	vmov.i8	q11, #0x08
1012	vmov.i8	q12, #0x10
1013	vmov.i8	q13, #0x20
1014	vldmia	r6, {q14}		@ .LM0
1015
1016#ifdef __ARMEL__
1017	vrev32.8	q7,  q7
1018	vrev32.8	q15, q15
1019#endif
1020	sub	r5,r5,#1
1021	vstmia	r12!, {q7}		@ save round 0 key
1022	b	.Lkey_loop
1023
1024.align	4
1025.Lkey_loop:
1026	vtbl.8	d14,{q15},d28
1027	vtbl.8	d15,{q15},d29
1028	vmov.i8	q6,  #0x40
1029	vmov.i8	q15, #0x80
1030
1031	vtst.8	q0, q7, q8
1032	vtst.8	q1, q7, q9
1033	vtst.8	q2, q7, q10
1034	vtst.8	q3, q7, q11
1035	vtst.8	q4, q7, q12
1036	vtst.8	q5, q7, q13
1037	vtst.8	q6, q7, q6
1038	vtst.8	q7, q7, q15
1039	vld1.8	{q15}, [r4]!		@ load next round key
1040	vmvn	q0, q0		@ "pnot"
1041	vmvn	q1, q1
1042	vmvn	q5, q5
1043	vmvn	q6, q6
1044#ifdef __ARMEL__
1045	vrev32.8	q15, q15
1046#endif
1047	subs	r5,r5,#1
1048	vstmia	r12!,{q0-q7}		@ write bit-sliced round key
1049	bne	.Lkey_loop
1050
1051	vmov.i8	q7,#0x63			@ compose .L63
1052	@ don't save last round key
1053	bx	lr
1054.size	_bsaes_key_convert,.-_bsaes_key_convert
1055.extern AES_cbc_encrypt
1056.extern AES_decrypt
1057
1058.global	bsaes_cbc_encrypt
1059.type	bsaes_cbc_encrypt,%function
1060.align	5
1061bsaes_cbc_encrypt:
1062#ifndef	__KERNEL__
1063	cmp	r2, #128
1064#ifndef	__thumb__
1065	blo	AES_cbc_encrypt
1066#else
1067	bhs	1f
1068	b	AES_cbc_encrypt
10691:
1070#endif
1071#endif
1072
1073	@ it is up to the caller to make sure we are called with enc == 0
1074
1075	mov	ip, sp
1076	stmdb	sp!, {r4-r10, lr}
1077	VFP_ABI_PUSH
1078	ldr	r8, [ip]			@ IV is 1st arg on the stack
1079	mov	r2, r2, lsr#4		@ len in 16 byte blocks
1080	sub	sp, #0x10			@ scratch space to carry over the IV
1081	mov	r9, sp				@ save sp
1082
1083	ldr	r10, [r3, #240]		@ get # of rounds
1084#ifndef	BSAES_ASM_EXTENDED_KEY
1085	@ allocate the key schedule on the stack
1086	sub	r12, sp, r10, lsl#7		@ 128 bytes per inner round key
1087	add	r12, #96			@ sifze of bit-slices key schedule
1088
1089	@ populate the key schedule
1090	mov	r4, r3			@ pass key
1091	mov	r5, r10			@ pass # of rounds
1092	mov	sp, r12				@ sp is sp
1093	bl	_bsaes_key_convert
1094	vldmia	sp, {q6}
1095	vstmia	r12,  {q15}		@ save last round key
1096	veor	q7, q7, q6	@ fix up round 0 key
1097	vstmia	sp, {q7}
1098#else
1099	ldr	r12, [r3, #244]
1100	eors	r12, #1
1101	beq	0f
1102
1103	@ populate the key schedule
1104	str	r12, [r3, #244]
1105	mov	r4, r3			@ pass key
1106	mov	r5, r10			@ pass # of rounds
1107	add	r12, r3, #248			@ pass key schedule
1108	bl	_bsaes_key_convert
1109	add	r4, r3, #248
1110	vldmia	r4, {q6}
1111	vstmia	r12, {q15}			@ save last round key
1112	veor	q7, q7, q6	@ fix up round 0 key
1113	vstmia	r4, {q7}
1114
1115.align	2
11160:
1117#endif
1118
1119	vld1.8	{q15}, [r8]		@ load IV
1120	b	.Lcbc_dec_loop
1121
1122.align	4
1123.Lcbc_dec_loop:
1124	subs	r2, r2, #0x8
1125	bmi	.Lcbc_dec_loop_finish
1126
1127	vld1.8	{q0-q1}, [r0]!	@ load input
1128	vld1.8	{q2-q3}, [r0]!
1129#ifndef	BSAES_ASM_EXTENDED_KEY
1130	mov	r4, sp			@ pass the key
1131#else
1132	add	r4, r3, #248
1133#endif
1134	vld1.8	{q4-q5}, [r0]!
1135	mov	r5, r10
1136	vld1.8	{q6-q7}, [r0]
1137	sub	r0, r0, #0x60
1138	vstmia	r9, {q15}			@ put aside IV
1139
1140	bl	_bsaes_decrypt8
1141
1142	vldmia	r9, {q14}			@ reload IV
1143	vld1.8	{q8-q9}, [r0]!	@ reload input
1144	veor	q0, q0, q14	@ ^= IV
1145	vld1.8	{q10-q11}, [r0]!
1146	veor	q1, q1, q8
1147	veor	q6, q6, q9
1148	vld1.8	{q12-q13}, [r0]!
1149	veor	q4, q4, q10
1150	veor	q2, q2, q11
1151	vld1.8	{q14-q15}, [r0]!
1152	veor	q7, q7, q12
1153	vst1.8	{q0-q1}, [r1]!	@ write output
1154	veor	q3, q3, q13
1155	vst1.8	{q6}, [r1]!
1156	veor	q5, q5, q14
1157	vst1.8	{q4}, [r1]!
1158	vst1.8	{q2}, [r1]!
1159	vst1.8	{q7}, [r1]!
1160	vst1.8	{q3}, [r1]!
1161	vst1.8	{q5}, [r1]!
1162
1163	b	.Lcbc_dec_loop
1164
1165.Lcbc_dec_loop_finish:
1166	adds	r2, r2, #8
1167	beq	.Lcbc_dec_done
1168
1169	vld1.8	{q0}, [r0]!		@ load input
1170	cmp	r2, #2
1171	blo	.Lcbc_dec_one
1172	vld1.8	{q1}, [r0]!
1173#ifndef	BSAES_ASM_EXTENDED_KEY
1174	mov	r4, sp			@ pass the key
1175#else
1176	add	r4, r3, #248
1177#endif
1178	mov	r5, r10
1179	vstmia	r9, {q15}			@ put aside IV
1180	beq	.Lcbc_dec_two
1181	vld1.8	{q2}, [r0]!
1182	cmp	r2, #4
1183	blo	.Lcbc_dec_three
1184	vld1.8	{q3}, [r0]!
1185	beq	.Lcbc_dec_four
1186	vld1.8	{q4}, [r0]!
1187	cmp	r2, #6
1188	blo	.Lcbc_dec_five
1189	vld1.8	{q5}, [r0]!
1190	beq	.Lcbc_dec_six
1191	vld1.8	{q6}, [r0]!
1192	sub	r0, r0, #0x70
1193
1194	bl	_bsaes_decrypt8
1195
1196	vldmia	r9, {q14}			@ reload IV
1197	vld1.8	{q8-q9}, [r0]!	@ reload input
1198	veor	q0, q0, q14	@ ^= IV
1199	vld1.8	{q10-q11}, [r0]!
1200	veor	q1, q1, q8
1201	veor	q6, q6, q9
1202	vld1.8	{q12-q13}, [r0]!
1203	veor	q4, q4, q10
1204	veor	q2, q2, q11
1205	vld1.8	{q15}, [r0]!
1206	veor	q7, q7, q12
1207	vst1.8	{q0-q1}, [r1]!	@ write output
1208	veor	q3, q3, q13
1209	vst1.8	{q6}, [r1]!
1210	vst1.8	{q4}, [r1]!
1211	vst1.8	{q2}, [r1]!
1212	vst1.8	{q7}, [r1]!
1213	vst1.8	{q3}, [r1]!
1214	b	.Lcbc_dec_done
1215.align	4
1216.Lcbc_dec_six:
1217	sub	r0, r0, #0x60
1218	bl	_bsaes_decrypt8
1219	vldmia	r9,{q14}			@ reload IV
1220	vld1.8	{q8-q9}, [r0]!	@ reload input
1221	veor	q0, q0, q14	@ ^= IV
1222	vld1.8	{q10-q11}, [r0]!
1223	veor	q1, q1, q8
1224	veor	q6, q6, q9
1225	vld1.8	{q12}, [r0]!
1226	veor	q4, q4, q10
1227	veor	q2, q2, q11
1228	vld1.8	{q15}, [r0]!
1229	veor	q7, q7, q12
1230	vst1.8	{q0-q1}, [r1]!	@ write output
1231	vst1.8	{q6}, [r1]!
1232	vst1.8	{q4}, [r1]!
1233	vst1.8	{q2}, [r1]!
1234	vst1.8	{q7}, [r1]!
1235	b	.Lcbc_dec_done
1236.align	4
1237.Lcbc_dec_five:
1238	sub	r0, r0, #0x50
1239	bl	_bsaes_decrypt8
1240	vldmia	r9, {q14}			@ reload IV
1241	vld1.8	{q8-q9}, [r0]!	@ reload input
1242	veor	q0, q0, q14	@ ^= IV
1243	vld1.8	{q10-q11}, [r0]!
1244	veor	q1, q1, q8
1245	veor	q6, q6, q9
1246	vld1.8	{q15}, [r0]!
1247	veor	q4, q4, q10
1248	vst1.8	{q0-q1}, [r1]!	@ write output
1249	veor	q2, q2, q11
1250	vst1.8	{q6}, [r1]!
1251	vst1.8	{q4}, [r1]!
1252	vst1.8	{q2}, [r1]!
1253	b	.Lcbc_dec_done
1254.align	4
1255.Lcbc_dec_four:
1256	sub	r0, r0, #0x40
1257	bl	_bsaes_decrypt8
1258	vldmia	r9, {q14}			@ reload IV
1259	vld1.8	{q8-q9}, [r0]!	@ reload input
1260	veor	q0, q0, q14	@ ^= IV
1261	vld1.8	{q10}, [r0]!
1262	veor	q1, q1, q8
1263	veor	q6, q6, q9
1264	vld1.8	{q15}, [r0]!
1265	veor	q4, q4, q10
1266	vst1.8	{q0-q1}, [r1]!	@ write output
1267	vst1.8	{q6}, [r1]!
1268	vst1.8	{q4}, [r1]!
1269	b	.Lcbc_dec_done
1270.align	4
1271.Lcbc_dec_three:
1272	sub	r0, r0, #0x30
1273	bl	_bsaes_decrypt8
1274	vldmia	r9, {q14}			@ reload IV
1275	vld1.8	{q8-q9}, [r0]!	@ reload input
1276	veor	q0, q0, q14	@ ^= IV
1277	vld1.8	{q15}, [r0]!
1278	veor	q1, q1, q8
1279	veor	q6, q6, q9
1280	vst1.8	{q0-q1}, [r1]!	@ write output
1281	vst1.8	{q6}, [r1]!
1282	b	.Lcbc_dec_done
1283.align	4
1284.Lcbc_dec_two:
1285	sub	r0, r0, #0x20
1286	bl	_bsaes_decrypt8
1287	vldmia	r9, {q14}			@ reload IV
1288	vld1.8	{q8}, [r0]!		@ reload input
1289	veor	q0, q0, q14	@ ^= IV
1290	vld1.8	{q15}, [r0]!		@ reload input
1291	veor	q1, q1, q8
1292	vst1.8	{q0-q1}, [r1]!	@ write output
1293	b	.Lcbc_dec_done
1294.align	4
1295.Lcbc_dec_one:
1296	sub	r0, r0, #0x10
1297	mov	r10, r1			@ save original out pointer
1298	mov	r1, r9			@ use the iv scratch space as out buffer
1299	mov	r2, r3
1300	vmov	q4,q15		@ just in case ensure that IV
1301	vmov	q5,q0			@ and input are preserved
1302	bl	AES_decrypt
1303	vld1.8	{q0}, [r9,:64]		@ load result
1304	veor	q0, q0, q4	@ ^= IV
1305	vmov	q15, q5		@ q5 holds input
1306	vst1.8	{q0}, [r10]		@ write output
1307
1308.Lcbc_dec_done:
1309#ifndef	BSAES_ASM_EXTENDED_KEY
1310	vmov.i32	q0, #0
1311	vmov.i32	q1, #0
1312.Lcbc_dec_bzero:				@ wipe key schedule [if any]
1313	vstmia		sp!, {q0-q1}
1314	cmp		sp, r9
1315	bne		.Lcbc_dec_bzero
1316#endif
1317
1318	mov	sp, r9
1319	add	sp, #0x10			@ add sp,r9,#0x10 is no good for thumb
1320	vst1.8	{q15}, [r8]		@ return IV
1321	VFP_ABI_POP
1322	ldmia	sp!, {r4-r10, pc}
1323.size	bsaes_cbc_encrypt,.-bsaes_cbc_encrypt
1324.extern	AES_encrypt
1325.global	bsaes_ctr32_encrypt_blocks
1326.type	bsaes_ctr32_encrypt_blocks,%function
1327.align	5
1328bsaes_ctr32_encrypt_blocks:
1329	cmp	r2, #8			@ use plain AES for
1330	blo	.Lctr_enc_short			@ small sizes
1331
1332	mov	ip, sp
1333	stmdb	sp!, {r4-r10, lr}
1334	VFP_ABI_PUSH
1335	ldr	r8, [ip]			@ ctr is 1st arg on the stack
1336	sub	sp, sp, #0x10			@ scratch space to carry over the ctr
1337	mov	r9, sp				@ save sp
1338
1339	ldr	r10, [r3, #240]		@ get # of rounds
1340#ifndef	BSAES_ASM_EXTENDED_KEY
1341	@ allocate the key schedule on the stack
1342	sub	r12, sp, r10, lsl#7		@ 128 bytes per inner round key
1343	add	r12, #96			@ size of bit-sliced key schedule
1344
1345	@ populate the key schedule
1346	mov	r4, r3			@ pass key
1347	mov	r5, r10			@ pass # of rounds
1348	mov	sp, r12				@ sp is sp
1349	bl	_bsaes_key_convert
1350	veor	q7,q7,q15	@ fix up last round key
1351	vstmia	r12, {q7}			@ save last round key
1352
1353	vld1.8	{q0}, [r8]		@ load counter
1354	add	r8, r6, #.LREVM0SR-.LM0	@ borrow r8
1355	vldmia	sp, {q4}		@ load round0 key
1356#else
1357	ldr	r12, [r3, #244]
1358	eors	r12, #1
1359	beq	0f
1360
1361	@ populate the key schedule
1362	str	r12, [r3, #244]
1363	mov	r4, r3			@ pass key
1364	mov	r5, r10			@ pass # of rounds
1365	add	r12, r3, #248			@ pass key schedule
1366	bl	_bsaes_key_convert
1367	veor	q7,q7,q15	@ fix up last round key
1368	vstmia	r12, {q7}			@ save last round key
1369
1370.align	2
13710:	add	r12, r3, #248
1372	vld1.8	{q0}, [r8]		@ load counter
1373	adrl	r8, .LREVM0SR			@ borrow r8
1374	vldmia	r12, {q4}			@ load round0 key
1375	sub	sp, #0x10			@ place for adjusted round0 key
1376#endif
1377
1378	vmov.i32	q8,#1		@ compose 1<<96
1379	veor		q9,q9,q9
1380	vrev32.8	q0,q0
1381	vext.8		q8,q9,q8,#4
1382	vrev32.8	q4,q4
1383	vadd.u32	q9,q8,q8	@ compose 2<<96
1384	vstmia	sp, {q4}		@ save adjusted round0 key
1385	b	.Lctr_enc_loop
1386
1387.align	4
1388.Lctr_enc_loop:
1389	vadd.u32	q10, q8, q9	@ compose 3<<96
1390	vadd.u32	q1, q0, q8	@ +1
1391	vadd.u32	q2, q0, q9	@ +2
1392	vadd.u32	q3, q0, q10	@ +3
1393	vadd.u32	q4, q1, q10
1394	vadd.u32	q5, q2, q10
1395	vadd.u32	q6, q3, q10
1396	vadd.u32	q7, q4, q10
1397	vadd.u32	q10, q5, q10	@ next counter
1398
1399	@ Borrow prologue from _bsaes_encrypt8 to use the opportunity
1400	@ to flip byte order in 32-bit counter
1401
1402	vldmia		sp, {q9}		@ load round0 key
1403#ifndef	BSAES_ASM_EXTENDED_KEY
1404	add		r4, sp, #0x10		@ pass next round key
1405#else
1406	add		r4, r3, #264
1407#endif
1408	vldmia		r8, {q8}			@ .LREVM0SR
1409	mov		r5, r10			@ pass rounds
1410	vstmia		r9, {q10}			@ save next counter
1411	sub		r6, r8, #.LREVM0SR-.LSR	@ pass constants
1412
1413	bl		_bsaes_encrypt8_alt
1414
1415	subs		r2, r2, #8
1416	blo		.Lctr_enc_loop_done
1417
1418	vld1.8		{q8-q9}, [r0]!	@ load input
1419	vld1.8		{q10-q11}, [r0]!
1420	veor		q0, q8
1421	veor		q1, q9
1422	vld1.8		{q12-q13}, [r0]!
1423	veor		q4, q10
1424	veor		q6, q11
1425	vld1.8		{q14-q15}, [r0]!
1426	veor		q3, q12
1427	vst1.8		{q0-q1}, [r1]!	@ write output
1428	veor		q7, q13
1429	veor		q2, q14
1430	vst1.8		{q4}, [r1]!
1431	veor		q5, q15
1432	vst1.8		{q6}, [r1]!
1433	vmov.i32	q8, #1			@ compose 1<<96
1434	vst1.8		{q3}, [r1]!
1435	veor		q9, q9, q9
1436	vst1.8		{q7}, [r1]!
1437	vext.8		q8, q9, q8, #4
1438	vst1.8		{q2}, [r1]!
1439	vadd.u32	q9,q8,q8		@ compose 2<<96
1440	vst1.8		{q5}, [r1]!
1441	vldmia		r9, {q0}			@ load counter
1442
1443	bne		.Lctr_enc_loop
1444	b		.Lctr_enc_done
1445
1446.align	4
1447.Lctr_enc_loop_done:
1448	add		r2, r2, #8
1449	vld1.8		{q8}, [r0]!	@ load input
1450	veor		q0, q8
1451	vst1.8		{q0}, [r1]!	@ write output
1452	cmp		r2, #2
1453	blo		.Lctr_enc_done
1454	vld1.8		{q9}, [r0]!
1455	veor		q1, q9
1456	vst1.8		{q1}, [r1]!
1457	beq		.Lctr_enc_done
1458	vld1.8		{q10}, [r0]!
1459	veor		q4, q10
1460	vst1.8		{q4}, [r1]!
1461	cmp		r2, #4
1462	blo		.Lctr_enc_done
1463	vld1.8		{q11}, [r0]!
1464	veor		q6, q11
1465	vst1.8		{q6}, [r1]!
1466	beq		.Lctr_enc_done
1467	vld1.8		{q12}, [r0]!
1468	veor		q3, q12
1469	vst1.8		{q3}, [r1]!
1470	cmp		r2, #6
1471	blo		.Lctr_enc_done
1472	vld1.8		{q13}, [r0]!
1473	veor		q7, q13
1474	vst1.8		{q7}, [r1]!
1475	beq		.Lctr_enc_done
1476	vld1.8		{q14}, [r0]
1477	veor		q2, q14
1478	vst1.8		{q2}, [r1]!
1479
1480.Lctr_enc_done:
1481	vmov.i32	q0, #0
1482	vmov.i32	q1, #0
1483#ifndef	BSAES_ASM_EXTENDED_KEY
1484.Lctr_enc_bzero:			@ wipe key schedule [if any]
1485	vstmia		sp!, {q0-q1}
1486	cmp		sp, r9
1487	bne		.Lctr_enc_bzero
1488#else
1489	vstmia		sp, {q0-q1}
1490#endif
1491
1492	mov	sp, r9
1493	add	sp, #0x10		@ add sp,r9,#0x10 is no good for thumb
1494	VFP_ABI_POP
1495	ldmia	sp!, {r4-r10, pc}	@ return
1496
1497.align	4
1498.Lctr_enc_short:
1499	ldr	ip, [sp]		@ ctr pointer is passed on stack
1500	stmdb	sp!, {r4-r8, lr}
1501
1502	mov	r4, r0		@ copy arguments
1503	mov	r5, r1
1504	mov	r6, r2
1505	mov	r7, r3
1506	ldr	r8, [ip, #12]		@ load counter LSW
1507	vld1.8	{q1}, [ip]		@ load whole counter value
1508#ifdef __ARMEL__
1509	rev	r8, r8
1510#endif
1511	sub	sp, sp, #0x10
1512	vst1.8	{q1}, [sp,:64]	@ copy counter value
1513	sub	sp, sp, #0x10
1514
1515.Lctr_enc_short_loop:
1516	add	r0, sp, #0x10		@ input counter value
1517	mov	r1, sp			@ output on the stack
1518	mov	r2, r7			@ key
1519
1520	bl	AES_encrypt
1521
1522	vld1.8	{q0}, [r4]!	@ load input
1523	vld1.8	{q1}, [sp,:64]	@ load encrypted counter
1524	add	r8, r8, #1
1525#ifdef __ARMEL__
1526	rev	r0, r8
1527	str	r0, [sp, #0x1c]		@ next counter value
1528#else
1529	str	r8, [sp, #0x1c]		@ next counter value
1530#endif
1531	veor	q0,q0,q1
1532	vst1.8	{q0}, [r5]!	@ store output
1533	subs	r6, r6, #1
1534	bne	.Lctr_enc_short_loop
1535
1536	vmov.i32	q0, #0
1537	vmov.i32	q1, #0
1538	vstmia		sp!, {q0-q1}
1539
1540	ldmia	sp!, {r4-r8, pc}
1541.size	bsaes_ctr32_encrypt_blocks,.-bsaes_ctr32_encrypt_blocks
1542.globl	bsaes_xts_encrypt
1543.type	bsaes_xts_encrypt,%function
1544.align	4
1545bsaes_xts_encrypt:
1546	mov	ip, sp
1547	stmdb	sp!, {r4-r10, lr}		@ 0x20
1548	VFP_ABI_PUSH
1549	mov	r6, sp				@ future r3
1550
1551	mov	r7, r0
1552	mov	r8, r1
1553	mov	r9, r2
1554	mov	r10, r3
1555
1556	sub	r0, sp, #0x10			@ 0x10
1557	bic	r0, #0xf			@ align at 16 bytes
1558	mov	sp, r0
1559
1560#ifdef	XTS_CHAIN_TWEAK
1561	ldr	r0, [ip]			@ pointer to input tweak
1562#else
1563	@ generate initial tweak
1564	ldr	r0, [ip, #4]			@ iv[]
1565	mov	r1, sp
1566	ldr	r2, [ip, #0]			@ key2
1567	bl	AES_encrypt
1568	mov	r0,sp				@ pointer to initial tweak
1569#endif
1570
1571	ldr	r1, [r10, #240]		@ get # of rounds
1572	mov	r3, r6
1573#ifndef	BSAES_ASM_EXTENDED_KEY
1574	@ allocate the key schedule on the stack
1575	sub	r12, sp, r1, lsl#7		@ 128 bytes per inner round key
1576	@ add	r12, #96			@ size of bit-sliced key schedule
1577	sub	r12, #48			@ place for tweak[9]
1578
1579	@ populate the key schedule
1580	mov	r4, r10			@ pass key
1581	mov	r5, r1			@ pass # of rounds
1582	mov	sp, r12
1583	add	r12, #0x90			@ pass key schedule
1584	bl	_bsaes_key_convert
1585	veor	q7, q7, q15	@ fix up last round key
1586	vstmia	r12, {q7}			@ save last round key
1587#else
1588	ldr	r12, [r10, #244]
1589	eors	r12, #1
1590	beq	0f
1591
1592	str	r12, [r10, #244]
1593	mov	r4, r10			@ pass key
1594	mov	r5, r1			@ pass # of rounds
1595	add	r12, r10, #248			@ pass key schedule
1596	bl	_bsaes_key_convert
1597	veor	q7, q7, q15	@ fix up last round key
1598	vstmia	r12, {q7}
1599
1600.align	2
16010:	sub	sp, #0x90			@ place for tweak[9]
1602#endif
1603
1604	vld1.8	{q8}, [r0]			@ initial tweak
1605	adr	r2, .Lxts_magic
1606
1607	subs	r9, #0x80
1608	blo	.Lxts_enc_short
1609	b	.Lxts_enc_loop
1610
1611.align	4
1612.Lxts_enc_loop:
1613	vldmia		r2, {q5}	@ load XTS magic
1614	vshr.s64	q6, q8, #63
1615	mov		r0, sp
1616	vand		q6, q6, q5
1617	vadd.u64	q9, q8, q8
1618	vst1.64		{q8}, [r0,:128]!
1619	vswp		d13,d12
1620	vshr.s64	q7, q9, #63
1621	veor		q9, q9, q6
1622	vand		q7, q7, q5
1623	vadd.u64	q10, q9, q9
1624	vst1.64		{q9}, [r0,:128]!
1625	vswp		d15,d14
1626	vshr.s64	q6, q10, #63
1627	veor		q10, q10, q7
1628	vand		q6, q6, q5
1629	vld1.8		{q0}, [r7]!
1630	vadd.u64	q11, q10, q10
1631	vst1.64		{q10}, [r0,:128]!
1632	vswp		d13,d12
1633	vshr.s64	q7, q11, #63
1634	veor		q11, q11, q6
1635	vand		q7, q7, q5
1636	vld1.8		{q1}, [r7]!
1637	veor		q0, q0, q8
1638	vadd.u64	q12, q11, q11
1639	vst1.64		{q11}, [r0,:128]!
1640	vswp		d15,d14
1641	vshr.s64	q6, q12, #63
1642	veor		q12, q12, q7
1643	vand		q6, q6, q5
1644	vld1.8		{q2}, [r7]!
1645	veor		q1, q1, q9
1646	vadd.u64	q13, q12, q12
1647	vst1.64		{q12}, [r0,:128]!
1648	vswp		d13,d12
1649	vshr.s64	q7, q13, #63
1650	veor		q13, q13, q6
1651	vand		q7, q7, q5
1652	vld1.8		{q3}, [r7]!
1653	veor		q2, q2, q10
1654	vadd.u64	q14, q13, q13
1655	vst1.64		{q13}, [r0,:128]!
1656	vswp		d15,d14
1657	vshr.s64	q6, q14, #63
1658	veor		q14, q14, q7
1659	vand		q6, q6, q5
1660	vld1.8		{q4}, [r7]!
1661	veor		q3, q3, q11
1662	vadd.u64	q15, q14, q14
1663	vst1.64		{q14}, [r0,:128]!
1664	vswp		d13,d12
1665	vshr.s64	q7, q15, #63
1666	veor		q15, q15, q6
1667	vand		q7, q7, q5
1668	vld1.8		{q5}, [r7]!
1669	veor		q4, q4, q12
1670	vadd.u64	q8, q15, q15
1671	vst1.64		{q15}, [r0,:128]!
1672	vswp		d15,d14
1673	veor		q8, q8, q7
1674	vst1.64		{q8}, [r0,:128]		@ next round tweak
1675
1676	vld1.8		{q6-q7}, [r7]!
1677	veor		q5, q5, q13
1678#ifndef	BSAES_ASM_EXTENDED_KEY
1679	add		r4, sp, #0x90			@ pass key schedule
1680#else
1681	add		r4, r10, #248			@ pass key schedule
1682#endif
1683	veor		q6, q6, q14
1684	mov		r5, r1			@ pass rounds
1685	veor		q7, q7, q15
1686	mov		r0, sp
1687
1688	bl		_bsaes_encrypt8
1689
1690	vld1.64		{q8-q9}, [r0,:128]!
1691	vld1.64		{q10-q11}, [r0,:128]!
1692	veor		q0, q0, q8
1693	vld1.64		{q12-q13}, [r0,:128]!
1694	veor		q1, q1, q9
1695	veor		q8, q4, q10
1696	vst1.8		{q0-q1}, [r8]!
1697	veor		q9, q6, q11
1698	vld1.64		{q14-q15}, [r0,:128]!
1699	veor		q10, q3, q12
1700	vst1.8		{q8-q9}, [r8]!
1701	veor		q11, q7, q13
1702	veor		q12, q2, q14
1703	vst1.8		{q10-q11}, [r8]!
1704	veor		q13, q5, q15
1705	vst1.8		{q12-q13}, [r8]!
1706
1707	vld1.64		{q8}, [r0,:128]		@ next round tweak
1708
1709	subs		r9, #0x80
1710	bpl		.Lxts_enc_loop
1711
1712.Lxts_enc_short:
1713	adds		r9, #0x70
1714	bmi		.Lxts_enc_done
1715
1716	vldmia		r2, {q5}	@ load XTS magic
1717	vshr.s64	q7, q8, #63
1718	mov		r0, sp
1719	vand		q7, q7, q5
1720	vadd.u64	q9, q8, q8
1721	vst1.64		{q8}, [r0,:128]!
1722	vswp		d15,d14
1723	vshr.s64	q6, q9, #63
1724	veor		q9, q9, q7
1725	vand		q6, q6, q5
1726	vadd.u64	q10, q9, q9
1727	vst1.64		{q9}, [r0,:128]!
1728	vswp		d13,d12
1729	vshr.s64	q7, q10, #63
1730	veor		q10, q10, q6
1731	vand		q7, q7, q5
1732	vld1.8		{q0}, [r7]!
1733	subs		r9, #0x10
1734	bmi		.Lxts_enc_1
1735	vadd.u64	q11, q10, q10
1736	vst1.64		{q10}, [r0,:128]!
1737	vswp		d15,d14
1738	vshr.s64	q6, q11, #63
1739	veor		q11, q11, q7
1740	vand		q6, q6, q5
1741	vld1.8		{q1}, [r7]!
1742	subs		r9, #0x10
1743	bmi		.Lxts_enc_2
1744	veor		q0, q0, q8
1745	vadd.u64	q12, q11, q11
1746	vst1.64		{q11}, [r0,:128]!
1747	vswp		d13,d12
1748	vshr.s64	q7, q12, #63
1749	veor		q12, q12, q6
1750	vand		q7, q7, q5
1751	vld1.8		{q2}, [r7]!
1752	subs		r9, #0x10
1753	bmi		.Lxts_enc_3
1754	veor		q1, q1, q9
1755	vadd.u64	q13, q12, q12
1756	vst1.64		{q12}, [r0,:128]!
1757	vswp		d15,d14
1758	vshr.s64	q6, q13, #63
1759	veor		q13, q13, q7
1760	vand		q6, q6, q5
1761	vld1.8		{q3}, [r7]!
1762	subs		r9, #0x10
1763	bmi		.Lxts_enc_4
1764	veor		q2, q2, q10
1765	vadd.u64	q14, q13, q13
1766	vst1.64		{q13}, [r0,:128]!
1767	vswp		d13,d12
1768	vshr.s64	q7, q14, #63
1769	veor		q14, q14, q6
1770	vand		q7, q7, q5
1771	vld1.8		{q4}, [r7]!
1772	subs		r9, #0x10
1773	bmi		.Lxts_enc_5
1774	veor		q3, q3, q11
1775	vadd.u64	q15, q14, q14
1776	vst1.64		{q14}, [r0,:128]!
1777	vswp		d15,d14
1778	vshr.s64	q6, q15, #63
1779	veor		q15, q15, q7
1780	vand		q6, q6, q5
1781	vld1.8		{q5}, [r7]!
1782	subs		r9, #0x10
1783	bmi		.Lxts_enc_6
1784	veor		q4, q4, q12
1785	sub		r9, #0x10
1786	vst1.64		{q15}, [r0,:128]		@ next round tweak
1787
1788	vld1.8		{q6}, [r7]!
1789	veor		q5, q5, q13
1790#ifndef	BSAES_ASM_EXTENDED_KEY
1791	add		r4, sp, #0x90			@ pass key schedule
1792#else
1793	add		r4, r10, #248			@ pass key schedule
1794#endif
1795	veor		q6, q6, q14
1796	mov		r5, r1			@ pass rounds
1797	mov		r0, sp
1798
1799	bl		_bsaes_encrypt8
1800
1801	vld1.64		{q8-q9}, [r0,:128]!
1802	vld1.64		{q10-q11}, [r0,:128]!
1803	veor		q0, q0, q8
1804	vld1.64		{q12-q13}, [r0,:128]!
1805	veor		q1, q1, q9
1806	veor		q8, q4, q10
1807	vst1.8		{q0-q1}, [r8]!
1808	veor		q9, q6, q11
1809	vld1.64		{q14}, [r0,:128]!
1810	veor		q10, q3, q12
1811	vst1.8		{q8-q9}, [r8]!
1812	veor		q11, q7, q13
1813	veor		q12, q2, q14
1814	vst1.8		{q10-q11}, [r8]!
1815	vst1.8		{q12}, [r8]!
1816
1817	vld1.64		{q8}, [r0,:128]		@ next round tweak
1818	b		.Lxts_enc_done
1819.align	4
1820.Lxts_enc_6:
1821	vst1.64		{q14}, [r0,:128]		@ next round tweak
1822
1823	veor		q4, q4, q12
1824#ifndef	BSAES_ASM_EXTENDED_KEY
1825	add		r4, sp, #0x90			@ pass key schedule
1826#else
1827	add		r4, r10, #248			@ pass key schedule
1828#endif
1829	veor		q5, q5, q13
1830	mov		r5, r1			@ pass rounds
1831	mov		r0, sp
1832
1833	bl		_bsaes_encrypt8
1834
1835	vld1.64		{q8-q9}, [r0,:128]!
1836	vld1.64		{q10-q11}, [r0,:128]!
1837	veor		q0, q0, q8
1838	vld1.64		{q12-q13}, [r0,:128]!
1839	veor		q1, q1, q9
1840	veor		q8, q4, q10
1841	vst1.8		{q0-q1}, [r8]!
1842	veor		q9, q6, q11
1843	veor		q10, q3, q12
1844	vst1.8		{q8-q9}, [r8]!
1845	veor		q11, q7, q13
1846	vst1.8		{q10-q11}, [r8]!
1847
1848	vld1.64		{q8}, [r0,:128]		@ next round tweak
1849	b		.Lxts_enc_done
1850
1851@ put this in range for both ARM and Thumb mode adr instructions
1852.align	5
1853.Lxts_magic:
1854	.quad	1, 0x87
1855
1856.align	5
1857.Lxts_enc_5:
1858	vst1.64		{q13}, [r0,:128]		@ next round tweak
1859
1860	veor		q3, q3, q11
1861#ifndef	BSAES_ASM_EXTENDED_KEY
1862	add		r4, sp, #0x90			@ pass key schedule
1863#else
1864	add		r4, r10, #248			@ pass key schedule
1865#endif
1866	veor		q4, q4, q12
1867	mov		r5, r1			@ pass rounds
1868	mov		r0, sp
1869
1870	bl		_bsaes_encrypt8
1871
1872	vld1.64		{q8-q9}, [r0,:128]!
1873	vld1.64		{q10-q11}, [r0,:128]!
1874	veor		q0, q0, q8
1875	vld1.64		{q12}, [r0,:128]!
1876	veor		q1, q1, q9
1877	veor		q8, q4, q10
1878	vst1.8		{q0-q1}, [r8]!
1879	veor		q9, q6, q11
1880	veor		q10, q3, q12
1881	vst1.8		{q8-q9}, [r8]!
1882	vst1.8		{q10}, [r8]!
1883
1884	vld1.64		{q8}, [r0,:128]		@ next round tweak
1885	b		.Lxts_enc_done
1886.align	4
1887.Lxts_enc_4:
1888	vst1.64		{q12}, [r0,:128]		@ next round tweak
1889
1890	veor		q2, q2, q10
1891#ifndef	BSAES_ASM_EXTENDED_KEY
1892	add		r4, sp, #0x90			@ pass key schedule
1893#else
1894	add		r4, r10, #248			@ pass key schedule
1895#endif
1896	veor		q3, q3, q11
1897	mov		r5, r1			@ pass rounds
1898	mov		r0, sp
1899
1900	bl		_bsaes_encrypt8
1901
1902	vld1.64		{q8-q9}, [r0,:128]!
1903	vld1.64		{q10-q11}, [r0,:128]!
1904	veor		q0, q0, q8
1905	veor		q1, q1, q9
1906	veor		q8, q4, q10
1907	vst1.8		{q0-q1}, [r8]!
1908	veor		q9, q6, q11
1909	vst1.8		{q8-q9}, [r8]!
1910
1911	vld1.64		{q8}, [r0,:128]		@ next round tweak
1912	b		.Lxts_enc_done
1913.align	4
1914.Lxts_enc_3:
1915	vst1.64		{q11}, [r0,:128]		@ next round tweak
1916
1917	veor		q1, q1, q9
1918#ifndef	BSAES_ASM_EXTENDED_KEY
1919	add		r4, sp, #0x90			@ pass key schedule
1920#else
1921	add		r4, r10, #248			@ pass key schedule
1922#endif
1923	veor		q2, q2, q10
1924	mov		r5, r1			@ pass rounds
1925	mov		r0, sp
1926
1927	bl		_bsaes_encrypt8
1928
1929	vld1.64		{q8-q9}, [r0,:128]!
1930	vld1.64		{q10}, [r0,:128]!
1931	veor		q0, q0, q8
1932	veor		q1, q1, q9
1933	veor		q8, q4, q10
1934	vst1.8		{q0-q1}, [r8]!
1935	vst1.8		{q8}, [r8]!
1936
1937	vld1.64		{q8}, [r0,:128]		@ next round tweak
1938	b		.Lxts_enc_done
1939.align	4
1940.Lxts_enc_2:
1941	vst1.64		{q10}, [r0,:128]		@ next round tweak
1942
1943	veor		q0, q0, q8
1944#ifndef	BSAES_ASM_EXTENDED_KEY
1945	add		r4, sp, #0x90			@ pass key schedule
1946#else
1947	add		r4, r10, #248			@ pass key schedule
1948#endif
1949	veor		q1, q1, q9
1950	mov		r5, r1			@ pass rounds
1951	mov		r0, sp
1952
1953	bl		_bsaes_encrypt8
1954
1955	vld1.64		{q8-q9}, [r0,:128]!
1956	veor		q0, q0, q8
1957	veor		q1, q1, q9
1958	vst1.8		{q0-q1}, [r8]!
1959
1960	vld1.64		{q8}, [r0,:128]		@ next round tweak
1961	b		.Lxts_enc_done
1962.align	4
1963.Lxts_enc_1:
1964	mov		r0, sp
1965	veor		q0, q8
1966	mov		r1, sp
1967	vst1.8		{q0}, [sp,:128]
1968	mov		r2, r10
1969	mov		r4, r3				@ preserve fp
1970
1971	bl		AES_encrypt
1972
1973	vld1.8		{q0}, [sp,:128]
1974	veor		q0, q0, q8
1975	vst1.8		{q0}, [r8]!
1976	mov		r3, r4
1977
1978	vmov		q8, q9		@ next round tweak
1979
1980.Lxts_enc_done:
1981#ifndef	XTS_CHAIN_TWEAK
1982	adds		r9, #0x10
1983	beq		.Lxts_enc_ret
1984	sub		r6, r8, #0x10
1985
1986.Lxts_enc_steal:
1987	ldrb		r0, [r7], #1
1988	ldrb		r1, [r8, #-0x10]
1989	strb		r0, [r8, #-0x10]
1990	strb		r1, [r8], #1
1991
1992	subs		r9, #1
1993	bhi		.Lxts_enc_steal
1994
1995	vld1.8		{q0}, [r6]
1996	mov		r0, sp
1997	veor		q0, q0, q8
1998	mov		r1, sp
1999	vst1.8		{q0}, [sp,:128]
2000	mov		r2, r10
2001	mov		r4, r3			@ preserve fp
2002
2003	bl		AES_encrypt
2004
2005	vld1.8		{q0}, [sp,:128]
2006	veor		q0, q0, q8
2007	vst1.8		{q0}, [r6]
2008	mov		r3, r4
2009#endif
2010
2011.Lxts_enc_ret:
2012	bic		r0, r3, #0xf
2013	vmov.i32	q0, #0
2014	vmov.i32	q1, #0
2015#ifdef	XTS_CHAIN_TWEAK
2016	ldr		r1, [r3, #0x20+VFP_ABI_FRAME]	@ chain tweak
2017#endif
2018.Lxts_enc_bzero:				@ wipe key schedule [if any]
2019	vstmia		sp!, {q0-q1}
2020	cmp		sp, r0
2021	bne		.Lxts_enc_bzero
2022
2023	mov		sp, r3
2024#ifdef	XTS_CHAIN_TWEAK
2025	vst1.8		{q8}, [r1]
2026#endif
2027	VFP_ABI_POP
2028	ldmia		sp!, {r4-r10, pc}	@ return
2029
2030.size	bsaes_xts_encrypt,.-bsaes_xts_encrypt
2031
2032.globl	bsaes_xts_decrypt
2033.type	bsaes_xts_decrypt,%function
2034.align	4
2035bsaes_xts_decrypt:
2036	mov	ip, sp
2037	stmdb	sp!, {r4-r10, lr}		@ 0x20
2038	VFP_ABI_PUSH
2039	mov	r6, sp				@ future r3
2040
2041	mov	r7, r0
2042	mov	r8, r1
2043	mov	r9, r2
2044	mov	r10, r3
2045
2046	sub	r0, sp, #0x10			@ 0x10
2047	bic	r0, #0xf			@ align at 16 bytes
2048	mov	sp, r0
2049
2050#ifdef	XTS_CHAIN_TWEAK
2051	ldr	r0, [ip]			@ pointer to input tweak
2052#else
2053	@ generate initial tweak
2054	ldr	r0, [ip, #4]			@ iv[]
2055	mov	r1, sp
2056	ldr	r2, [ip, #0]			@ key2
2057	bl	AES_encrypt
2058	mov	r0, sp				@ pointer to initial tweak
2059#endif
2060
2061	ldr	r1, [r10, #240]		@ get # of rounds
2062	mov	r3, r6
2063#ifndef	BSAES_ASM_EXTENDED_KEY
2064	@ allocate the key schedule on the stack
2065	sub	r12, sp, r1, lsl#7		@ 128 bytes per inner round key
2066	@ add	r12, #96			@ size of bit-sliced key schedule
2067	sub	r12, #48			@ place for tweak[9]
2068
2069	@ populate the key schedule
2070	mov	r4, r10			@ pass key
2071	mov	r5, r1			@ pass # of rounds
2072	mov	sp, r12
2073	add	r12, #0x90			@ pass key schedule
2074	bl	_bsaes_key_convert
2075	add	r4, sp, #0x90
2076	vldmia	r4, {q6}
2077	vstmia	r12,  {q15}		@ save last round key
2078	veor	q7, q7, q6	@ fix up round 0 key
2079	vstmia	r4, {q7}
2080#else
2081	ldr	r12, [r10, #244]
2082	eors	r12, #1
2083	beq	0f
2084
2085	str	r12, [r10, #244]
2086	mov	r4, r10			@ pass key
2087	mov	r5, r1			@ pass # of rounds
2088	add	r12, r10, #248			@ pass key schedule
2089	bl	_bsaes_key_convert
2090	add	r4, r10, #248
2091	vldmia	r4, {q6}
2092	vstmia	r12,  {q15}		@ save last round key
2093	veor	q7, q7, q6	@ fix up round 0 key
2094	vstmia	r4, {q7}
2095
2096.align	2
20970:	sub	sp, #0x90			@ place for tweak[9]
2098#endif
2099	vld1.8	{q8}, [r0]			@ initial tweak
2100	adr	r2, .Lxts_magic
2101
2102	tst	r9, #0xf			@ if not multiple of 16
2103	it	ne				@ Thumb2 thing, sanity check in ARM
2104	subne	r9, #0x10			@ subtract another 16 bytes
2105	subs	r9, #0x80
2106
2107	blo	.Lxts_dec_short
2108	b	.Lxts_dec_loop
2109
2110.align	4
2111.Lxts_dec_loop:
2112	vldmia		r2, {q5}	@ load XTS magic
2113	vshr.s64	q6, q8, #63
2114	mov		r0, sp
2115	vand		q6, q6, q5
2116	vadd.u64	q9, q8, q8
2117	vst1.64		{q8}, [r0,:128]!
2118	vswp		d13,d12
2119	vshr.s64	q7, q9, #63
2120	veor		q9, q9, q6
2121	vand		q7, q7, q5
2122	vadd.u64	q10, q9, q9
2123	vst1.64		{q9}, [r0,:128]!
2124	vswp		d15,d14
2125	vshr.s64	q6, q10, #63
2126	veor		q10, q10, q7
2127	vand		q6, q6, q5
2128	vld1.8		{q0}, [r7]!
2129	vadd.u64	q11, q10, q10
2130	vst1.64		{q10}, [r0,:128]!
2131	vswp		d13,d12
2132	vshr.s64	q7, q11, #63
2133	veor		q11, q11, q6
2134	vand		q7, q7, q5
2135	vld1.8		{q1}, [r7]!
2136	veor		q0, q0, q8
2137	vadd.u64	q12, q11, q11
2138	vst1.64		{q11}, [r0,:128]!
2139	vswp		d15,d14
2140	vshr.s64	q6, q12, #63
2141	veor		q12, q12, q7
2142	vand		q6, q6, q5
2143	vld1.8		{q2}, [r7]!
2144	veor		q1, q1, q9
2145	vadd.u64	q13, q12, q12
2146	vst1.64		{q12}, [r0,:128]!
2147	vswp		d13,d12
2148	vshr.s64	q7, q13, #63
2149	veor		q13, q13, q6
2150	vand		q7, q7, q5
2151	vld1.8		{q3}, [r7]!
2152	veor		q2, q2, q10
2153	vadd.u64	q14, q13, q13
2154	vst1.64		{q13}, [r0,:128]!
2155	vswp		d15,d14
2156	vshr.s64	q6, q14, #63
2157	veor		q14, q14, q7
2158	vand		q6, q6, q5
2159	vld1.8		{q4}, [r7]!
2160	veor		q3, q3, q11
2161	vadd.u64	q15, q14, q14
2162	vst1.64		{q14}, [r0,:128]!
2163	vswp		d13,d12
2164	vshr.s64	q7, q15, #63
2165	veor		q15, q15, q6
2166	vand		q7, q7, q5
2167	vld1.8		{q5}, [r7]!
2168	veor		q4, q4, q12
2169	vadd.u64	q8, q15, q15
2170	vst1.64		{q15}, [r0,:128]!
2171	vswp		d15,d14
2172	veor		q8, q8, q7
2173	vst1.64		{q8}, [r0,:128]		@ next round tweak
2174
2175	vld1.8		{q6-q7}, [r7]!
2176	veor		q5, q5, q13
2177#ifndef	BSAES_ASM_EXTENDED_KEY
2178	add		r4, sp, #0x90			@ pass key schedule
2179#else
2180	add		r4, r10, #248			@ pass key schedule
2181#endif
2182	veor		q6, q6, q14
2183	mov		r5, r1			@ pass rounds
2184	veor		q7, q7, q15
2185	mov		r0, sp
2186
2187	bl		_bsaes_decrypt8
2188
2189	vld1.64		{q8-q9}, [r0,:128]!
2190	vld1.64		{q10-q11}, [r0,:128]!
2191	veor		q0, q0, q8
2192	vld1.64		{q12-q13}, [r0,:128]!
2193	veor		q1, q1, q9
2194	veor		q8, q6, q10
2195	vst1.8		{q0-q1}, [r8]!
2196	veor		q9, q4, q11
2197	vld1.64		{q14-q15}, [r0,:128]!
2198	veor		q10, q2, q12
2199	vst1.8		{q8-q9}, [r8]!
2200	veor		q11, q7, q13
2201	veor		q12, q3, q14
2202	vst1.8		{q10-q11}, [r8]!
2203	veor		q13, q5, q15
2204	vst1.8		{q12-q13}, [r8]!
2205
2206	vld1.64		{q8}, [r0,:128]		@ next round tweak
2207
2208	subs		r9, #0x80
2209	bpl		.Lxts_dec_loop
2210
2211.Lxts_dec_short:
2212	adds		r9, #0x70
2213	bmi		.Lxts_dec_done
2214
2215	vldmia		r2, {q5}	@ load XTS magic
2216	vshr.s64	q7, q8, #63
2217	mov		r0, sp
2218	vand		q7, q7, q5
2219	vadd.u64	q9, q8, q8
2220	vst1.64		{q8}, [r0,:128]!
2221	vswp		d15,d14
2222	vshr.s64	q6, q9, #63
2223	veor		q9, q9, q7
2224	vand		q6, q6, q5
2225	vadd.u64	q10, q9, q9
2226	vst1.64		{q9}, [r0,:128]!
2227	vswp		d13,d12
2228	vshr.s64	q7, q10, #63
2229	veor		q10, q10, q6
2230	vand		q7, q7, q5
2231	vld1.8		{q0}, [r7]!
2232	subs		r9, #0x10
2233	bmi		.Lxts_dec_1
2234	vadd.u64	q11, q10, q10
2235	vst1.64		{q10}, [r0,:128]!
2236	vswp		d15,d14
2237	vshr.s64	q6, q11, #63
2238	veor		q11, q11, q7
2239	vand		q6, q6, q5
2240	vld1.8		{q1}, [r7]!
2241	subs		r9, #0x10
2242	bmi		.Lxts_dec_2
2243	veor		q0, q0, q8
2244	vadd.u64	q12, q11, q11
2245	vst1.64		{q11}, [r0,:128]!
2246	vswp		d13,d12
2247	vshr.s64	q7, q12, #63
2248	veor		q12, q12, q6
2249	vand		q7, q7, q5
2250	vld1.8		{q2}, [r7]!
2251	subs		r9, #0x10
2252	bmi		.Lxts_dec_3
2253	veor		q1, q1, q9
2254	vadd.u64	q13, q12, q12
2255	vst1.64		{q12}, [r0,:128]!
2256	vswp		d15,d14
2257	vshr.s64	q6, q13, #63
2258	veor		q13, q13, q7
2259	vand		q6, q6, q5
2260	vld1.8		{q3}, [r7]!
2261	subs		r9, #0x10
2262	bmi		.Lxts_dec_4
2263	veor		q2, q2, q10
2264	vadd.u64	q14, q13, q13
2265	vst1.64		{q13}, [r0,:128]!
2266	vswp		d13,d12
2267	vshr.s64	q7, q14, #63
2268	veor		q14, q14, q6
2269	vand		q7, q7, q5
2270	vld1.8		{q4}, [r7]!
2271	subs		r9, #0x10
2272	bmi		.Lxts_dec_5
2273	veor		q3, q3, q11
2274	vadd.u64	q15, q14, q14
2275	vst1.64		{q14}, [r0,:128]!
2276	vswp		d15,d14
2277	vshr.s64	q6, q15, #63
2278	veor		q15, q15, q7
2279	vand		q6, q6, q5
2280	vld1.8		{q5}, [r7]!
2281	subs		r9, #0x10
2282	bmi		.Lxts_dec_6
2283	veor		q4, q4, q12
2284	sub		r9, #0x10
2285	vst1.64		{q15}, [r0,:128]		@ next round tweak
2286
2287	vld1.8		{q6}, [r7]!
2288	veor		q5, q5, q13
2289#ifndef	BSAES_ASM_EXTENDED_KEY
2290	add		r4, sp, #0x90			@ pass key schedule
2291#else
2292	add		r4, r10, #248			@ pass key schedule
2293#endif
2294	veor		q6, q6, q14
2295	mov		r5, r1			@ pass rounds
2296	mov		r0, sp
2297
2298	bl		_bsaes_decrypt8
2299
2300	vld1.64		{q8-q9}, [r0,:128]!
2301	vld1.64		{q10-q11}, [r0,:128]!
2302	veor		q0, q0, q8
2303	vld1.64		{q12-q13}, [r0,:128]!
2304	veor		q1, q1, q9
2305	veor		q8, q6, q10
2306	vst1.8		{q0-q1}, [r8]!
2307	veor		q9, q4, q11
2308	vld1.64		{q14}, [r0,:128]!
2309	veor		q10, q2, q12
2310	vst1.8		{q8-q9}, [r8]!
2311	veor		q11, q7, q13
2312	veor		q12, q3, q14
2313	vst1.8		{q10-q11}, [r8]!
2314	vst1.8		{q12}, [r8]!
2315
2316	vld1.64		{q8}, [r0,:128]		@ next round tweak
2317	b		.Lxts_dec_done
2318.align	4
2319.Lxts_dec_6:
2320	vst1.64		{q14}, [r0,:128]		@ next round tweak
2321
2322	veor		q4, q4, q12
2323#ifndef	BSAES_ASM_EXTENDED_KEY
2324	add		r4, sp, #0x90			@ pass key schedule
2325#else
2326	add		r4, r10, #248			@ pass key schedule
2327#endif
2328	veor		q5, q5, q13
2329	mov		r5, r1			@ pass rounds
2330	mov		r0, sp
2331
2332	bl		_bsaes_decrypt8
2333
2334	vld1.64		{q8-q9}, [r0,:128]!
2335	vld1.64		{q10-q11}, [r0,:128]!
2336	veor		q0, q0, q8
2337	vld1.64		{q12-q13}, [r0,:128]!
2338	veor		q1, q1, q9
2339	veor		q8, q6, q10
2340	vst1.8		{q0-q1}, [r8]!
2341	veor		q9, q4, q11
2342	veor		q10, q2, q12
2343	vst1.8		{q8-q9}, [r8]!
2344	veor		q11, q7, q13
2345	vst1.8		{q10-q11}, [r8]!
2346
2347	vld1.64		{q8}, [r0,:128]		@ next round tweak
2348	b		.Lxts_dec_done
2349.align	4
2350.Lxts_dec_5:
2351	vst1.64		{q13}, [r0,:128]		@ next round tweak
2352
2353	veor		q3, q3, q11
2354#ifndef	BSAES_ASM_EXTENDED_KEY
2355	add		r4, sp, #0x90			@ pass key schedule
2356#else
2357	add		r4, r10, #248			@ pass key schedule
2358#endif
2359	veor		q4, q4, q12
2360	mov		r5, r1			@ pass rounds
2361	mov		r0, sp
2362
2363	bl		_bsaes_decrypt8
2364
2365	vld1.64		{q8-q9}, [r0,:128]!
2366	vld1.64		{q10-q11}, [r0,:128]!
2367	veor		q0, q0, q8
2368	vld1.64		{q12}, [r0,:128]!
2369	veor		q1, q1, q9
2370	veor		q8, q6, q10
2371	vst1.8		{q0-q1}, [r8]!
2372	veor		q9, q4, q11
2373	veor		q10, q2, q12
2374	vst1.8		{q8-q9}, [r8]!
2375	vst1.8		{q10}, [r8]!
2376
2377	vld1.64		{q8}, [r0,:128]		@ next round tweak
2378	b		.Lxts_dec_done
2379.align	4
2380.Lxts_dec_4:
2381	vst1.64		{q12}, [r0,:128]		@ next round tweak
2382
2383	veor		q2, q2, q10
2384#ifndef	BSAES_ASM_EXTENDED_KEY
2385	add		r4, sp, #0x90			@ pass key schedule
2386#else
2387	add		r4, r10, #248			@ pass key schedule
2388#endif
2389	veor		q3, q3, q11
2390	mov		r5, r1			@ pass rounds
2391	mov		r0, sp
2392
2393	bl		_bsaes_decrypt8
2394
2395	vld1.64		{q8-q9}, [r0,:128]!
2396	vld1.64		{q10-q11}, [r0,:128]!
2397	veor		q0, q0, q8
2398	veor		q1, q1, q9
2399	veor		q8, q6, q10
2400	vst1.8		{q0-q1}, [r8]!
2401	veor		q9, q4, q11
2402	vst1.8		{q8-q9}, [r8]!
2403
2404	vld1.64		{q8}, [r0,:128]		@ next round tweak
2405	b		.Lxts_dec_done
2406.align	4
2407.Lxts_dec_3:
2408	vst1.64		{q11}, [r0,:128]		@ next round tweak
2409
2410	veor		q1, q1, q9
2411#ifndef	BSAES_ASM_EXTENDED_KEY
2412	add		r4, sp, #0x90			@ pass key schedule
2413#else
2414	add		r4, r10, #248			@ pass key schedule
2415#endif
2416	veor		q2, q2, q10
2417	mov		r5, r1			@ pass rounds
2418	mov		r0, sp
2419
2420	bl		_bsaes_decrypt8
2421
2422	vld1.64		{q8-q9}, [r0,:128]!
2423	vld1.64		{q10}, [r0,:128]!
2424	veor		q0, q0, q8
2425	veor		q1, q1, q9
2426	veor		q8, q6, q10
2427	vst1.8		{q0-q1}, [r8]!
2428	vst1.8		{q8}, [r8]!
2429
2430	vld1.64		{q8}, [r0,:128]		@ next round tweak
2431	b		.Lxts_dec_done
2432.align	4
2433.Lxts_dec_2:
2434	vst1.64		{q10}, [r0,:128]		@ next round tweak
2435
2436	veor		q0, q0, q8
2437#ifndef	BSAES_ASM_EXTENDED_KEY
2438	add		r4, sp, #0x90			@ pass key schedule
2439#else
2440	add		r4, r10, #248			@ pass key schedule
2441#endif
2442	veor		q1, q1, q9
2443	mov		r5, r1			@ pass rounds
2444	mov		r0, sp
2445
2446	bl		_bsaes_decrypt8
2447
2448	vld1.64		{q8-q9}, [r0,:128]!
2449	veor		q0, q0, q8
2450	veor		q1, q1, q9
2451	vst1.8		{q0-q1}, [r8]!
2452
2453	vld1.64		{q8}, [r0,:128]		@ next round tweak
2454	b		.Lxts_dec_done
2455.align	4
2456.Lxts_dec_1:
2457	mov		r0, sp
2458	veor		q0, q8
2459	mov		r1, sp
2460	vst1.8		{q0}, [sp,:128]
2461	mov		r2, r10
2462	mov		r4, r3				@ preserve fp
2463	mov		r5, r2			@ preserve magic
2464
2465	bl		AES_decrypt
2466
2467	vld1.8		{q0}, [sp,:128]
2468	veor		q0, q0, q8
2469	vst1.8		{q0}, [r8]!
2470	mov		r3, r4
2471	mov		r2, r5
2472
2473	vmov		q8, q9		@ next round tweak
2474
2475.Lxts_dec_done:
2476#ifndef	XTS_CHAIN_TWEAK
2477	adds		r9, #0x10
2478	beq		.Lxts_dec_ret
2479
2480	@ calculate one round of extra tweak for the stolen ciphertext
2481	vldmia		r2, {q5}
2482	vshr.s64	q6, q8, #63
2483	vand		q6, q6, q5
2484	vadd.u64	q9, q8, q8
2485	vswp		d13,d12
2486	veor		q9, q9, q6
2487
2488	@ perform the final decryption with the last tweak value
2489	vld1.8		{q0}, [r7]!
2490	mov		r0, sp
2491	veor		q0, q0, q9
2492	mov		r1, sp
2493	vst1.8		{q0}, [sp,:128]
2494	mov		r2, r10
2495	mov		r4, r3			@ preserve fp
2496
2497	bl		AES_decrypt
2498
2499	vld1.8		{q0}, [sp,:128]
2500	veor		q0, q0, q9
2501	vst1.8		{q0}, [r8]
2502
2503	mov		r6, r8
2504.Lxts_dec_steal:
2505	ldrb		r1, [r8]
2506	ldrb		r0, [r7], #1
2507	strb		r1, [r8, #0x10]
2508	strb		r0, [r8], #1
2509
2510	subs		r9, #1
2511	bhi		.Lxts_dec_steal
2512
2513	vld1.8		{q0}, [r6]
2514	mov		r0, sp
2515	veor		q0, q8
2516	mov		r1, sp
2517	vst1.8		{q0}, [sp,:128]
2518	mov		r2, r10
2519
2520	bl		AES_decrypt
2521
2522	vld1.8		{q0}, [sp,:128]
2523	veor		q0, q0, q8
2524	vst1.8		{q0}, [r6]
2525	mov		r3, r4
2526#endif
2527
2528.Lxts_dec_ret:
2529	bic		r0, r3, #0xf
2530	vmov.i32	q0, #0
2531	vmov.i32	q1, #0
2532#ifdef	XTS_CHAIN_TWEAK
2533	ldr		r1, [r3, #0x20+VFP_ABI_FRAME]	@ chain tweak
2534#endif
2535.Lxts_dec_bzero:				@ wipe key schedule [if any]
2536	vstmia		sp!, {q0-q1}
2537	cmp		sp, r0
2538	bne		.Lxts_dec_bzero
2539
2540	mov		sp, r3
2541#ifdef	XTS_CHAIN_TWEAK
2542	vst1.8		{q8}, [r1]
2543#endif
2544	VFP_ABI_POP
2545	ldmia		sp!, {r4-r10, pc}	@ return
2546
2547.size	bsaes_xts_decrypt,.-bsaes_xts_decrypt
2548#endif
2549