bsaes-armv7.S revision 326663
1/* $FreeBSD: stable/11/secure/lib/libcrypto/arm/bsaes-armv7.S 326663 2017-12-07 18:04:48Z 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,.
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,.
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,.
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]		@ 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	veor		q4, q4, q12
1822#ifndef	BSAES_ASM_EXTENDED_KEY
1823	add		r4, sp, #0x90			@ pass key schedule
1824#else
1825	add		r4, r10, #248			@ pass key schedule
1826#endif
1827	veor		q5, q5, q13
1828	mov		r5, r1			@ pass rounds
1829	mov		r0, sp
1830
1831	bl		_bsaes_encrypt8
1832
1833	vld1.64		{q8-q9}, [r0,:128]!
1834	vld1.64		{q10-q11}, [r0,:128]!
1835	veor		q0, q0, q8
1836	vld1.64		{q12-q13}, [r0,:128]!
1837	veor		q1, q1, q9
1838	veor		q8, q4, q10
1839	vst1.8		{q0-q1}, [r8]!
1840	veor		q9, q6, q11
1841	veor		q10, q3, q12
1842	vst1.8		{q8-q9}, [r8]!
1843	veor		q11, q7, q13
1844	vst1.8		{q10-q11}, [r8]!
1845
1846	vld1.64		{q8}, [r0,:128]		@ next round tweak
1847	b		.Lxts_enc_done
1848
1849@ put this in range for both ARM and Thumb mode adr instructions
1850.align	5
1851.Lxts_magic:
1852	.quad	1, 0x87
1853
1854.align	5
1855.Lxts_enc_5:
1856	veor		q3, q3, q11
1857#ifndef	BSAES_ASM_EXTENDED_KEY
1858	add		r4, sp, #0x90			@ pass key schedule
1859#else
1860	add		r4, r10, #248			@ pass key schedule
1861#endif
1862	veor		q4, q4, q12
1863	mov		r5, r1			@ pass rounds
1864	mov		r0, sp
1865
1866	bl		_bsaes_encrypt8
1867
1868	vld1.64		{q8-q9}, [r0,:128]!
1869	vld1.64		{q10-q11}, [r0,:128]!
1870	veor		q0, q0, q8
1871	vld1.64		{q12}, [r0,:128]!
1872	veor		q1, q1, q9
1873	veor		q8, q4, q10
1874	vst1.8		{q0-q1}, [r8]!
1875	veor		q9, q6, q11
1876	veor		q10, q3, q12
1877	vst1.8		{q8-q9}, [r8]!
1878	vst1.8		{q10}, [r8]!
1879
1880	vld1.64		{q8}, [r0,:128]		@ next round tweak
1881	b		.Lxts_enc_done
1882.align	4
1883.Lxts_enc_4:
1884	veor		q2, q2, q10
1885#ifndef	BSAES_ASM_EXTENDED_KEY
1886	add		r4, sp, #0x90			@ pass key schedule
1887#else
1888	add		r4, r10, #248			@ pass key schedule
1889#endif
1890	veor		q3, q3, q11
1891	mov		r5, r1			@ pass rounds
1892	mov		r0, sp
1893
1894	bl		_bsaes_encrypt8
1895
1896	vld1.64		{q8-q9}, [r0,:128]!
1897	vld1.64		{q10-q11}, [r0,:128]!
1898	veor		q0, q0, q8
1899	veor		q1, q1, q9
1900	veor		q8, q4, q10
1901	vst1.8		{q0-q1}, [r8]!
1902	veor		q9, q6, q11
1903	vst1.8		{q8-q9}, [r8]!
1904
1905	vld1.64		{q8}, [r0,:128]		@ next round tweak
1906	b		.Lxts_enc_done
1907.align	4
1908.Lxts_enc_3:
1909	veor		q1, q1, q9
1910#ifndef	BSAES_ASM_EXTENDED_KEY
1911	add		r4, sp, #0x90			@ pass key schedule
1912#else
1913	add		r4, r10, #248			@ pass key schedule
1914#endif
1915	veor		q2, q2, q10
1916	mov		r5, r1			@ pass rounds
1917	mov		r0, sp
1918
1919	bl		_bsaes_encrypt8
1920
1921	vld1.64		{q8-q9}, [r0,:128]!
1922	vld1.64		{q10}, [r0,:128]!
1923	veor		q0, q0, q8
1924	veor		q1, q1, q9
1925	veor		q8, q4, q10
1926	vst1.8		{q0-q1}, [r8]!
1927	vst1.8		{q8}, [r8]!
1928
1929	vld1.64		{q8}, [r0,:128]		@ next round tweak
1930	b		.Lxts_enc_done
1931.align	4
1932.Lxts_enc_2:
1933	veor		q0, q0, q8
1934#ifndef	BSAES_ASM_EXTENDED_KEY
1935	add		r4, sp, #0x90			@ pass key schedule
1936#else
1937	add		r4, r10, #248			@ pass key schedule
1938#endif
1939	veor		q1, q1, q9
1940	mov		r5, r1			@ pass rounds
1941	mov		r0, sp
1942
1943	bl		_bsaes_encrypt8
1944
1945	vld1.64		{q8-q9}, [r0,:128]!
1946	veor		q0, q0, q8
1947	veor		q1, q1, q9
1948	vst1.8		{q0-q1}, [r8]!
1949
1950	vld1.64		{q8}, [r0,:128]		@ next round tweak
1951	b		.Lxts_enc_done
1952.align	4
1953.Lxts_enc_1:
1954	mov		r0, sp
1955	veor		q0, q0, q8
1956	mov		r1, sp
1957	vst1.8		{q0}, [sp,:128]
1958	mov		r2, r10
1959	mov		r4, r3				@ preserve fp
1960
1961	bl		AES_encrypt
1962
1963	vld1.8		{q0}, [sp,:128]
1964	veor		q0, q0, q8
1965	vst1.8		{q0}, [r8]!
1966	mov		r3, r4
1967
1968	vmov		q8, q9		@ next round tweak
1969
1970.Lxts_enc_done:
1971#ifndef	XTS_CHAIN_TWEAK
1972	adds		r9, #0x10
1973	beq		.Lxts_enc_ret
1974	sub		r6, r8, #0x10
1975
1976.Lxts_enc_steal:
1977	ldrb		r0, [r7], #1
1978	ldrb		r1, [r8, #-0x10]
1979	strb		r0, [r8, #-0x10]
1980	strb		r1, [r8], #1
1981
1982	subs		r9, #1
1983	bhi		.Lxts_enc_steal
1984
1985	vld1.8		{q0}, [r6]
1986	mov		r0, sp
1987	veor		q0, q0, q8
1988	mov		r1, sp
1989	vst1.8		{q0}, [sp,:128]
1990	mov		r2, r10
1991	mov		r4, r3			@ preserve fp
1992
1993	bl		AES_encrypt
1994
1995	vld1.8		{q0}, [sp,:128]
1996	veor		q0, q0, q8
1997	vst1.8		{q0}, [r6]
1998	mov		r3, r4
1999#endif
2000
2001.Lxts_enc_ret:
2002	bic		r0, r3, #0xf
2003	vmov.i32	q0, #0
2004	vmov.i32	q1, #0
2005#ifdef	XTS_CHAIN_TWEAK
2006	ldr		r1, [r3, #0x20+VFP_ABI_FRAME]	@ chain tweak
2007#endif
2008.Lxts_enc_bzero:				@ wipe key schedule [if any]
2009	vstmia		sp!, {q0-q1}
2010	cmp		sp, r0
2011	bne		.Lxts_enc_bzero
2012
2013	mov		sp, r3
2014#ifdef	XTS_CHAIN_TWEAK
2015	vst1.8		{q8}, [r1]
2016#endif
2017	VFP_ABI_POP
2018	ldmia		sp!, {r4-r10, pc}	@ return
2019
2020.size	bsaes_xts_encrypt,.-bsaes_xts_encrypt
2021
2022.globl	bsaes_xts_decrypt
2023.type	bsaes_xts_decrypt,%function
2024.align	4
2025bsaes_xts_decrypt:
2026	mov	ip, sp
2027	stmdb	sp!, {r4-r10, lr}		@ 0x20
2028	VFP_ABI_PUSH
2029	mov	r6, sp				@ future r3
2030
2031	mov	r7, r0
2032	mov	r8, r1
2033	mov	r9, r2
2034	mov	r10, r3
2035
2036	sub	r0, sp, #0x10			@ 0x10
2037	bic	r0, #0xf			@ align at 16 bytes
2038	mov	sp, r0
2039
2040#ifdef	XTS_CHAIN_TWEAK
2041	ldr	r0, [ip]			@ pointer to input tweak
2042#else
2043	@ generate initial tweak
2044	ldr	r0, [ip, #4]			@ iv[]
2045	mov	r1, sp
2046	ldr	r2, [ip, #0]			@ key2
2047	bl	AES_encrypt
2048	mov	r0, sp				@ pointer to initial tweak
2049#endif
2050
2051	ldr	r1, [r10, #240]		@ get # of rounds
2052	mov	r3, r6
2053#ifndef	BSAES_ASM_EXTENDED_KEY
2054	@ allocate the key schedule on the stack
2055	sub	r12, sp, r1, lsl#7		@ 128 bytes per inner round key
2056	@ add	r12, #96			@ size of bit-sliced key schedule
2057	sub	r12, #48			@ place for tweak[9]
2058
2059	@ populate the key schedule
2060	mov	r4, r10			@ pass key
2061	mov	r5, r1			@ pass # of rounds
2062	mov	sp, r12
2063	add	r12, #0x90			@ pass key schedule
2064	bl	_bsaes_key_convert
2065	add	r4, sp, #0x90
2066	vldmia	r4, {q6}
2067	vstmia	r12,  {q15}		@ save last round key
2068	veor	q7, q7, q6	@ fix up round 0 key
2069	vstmia	r4, {q7}
2070#else
2071	ldr	r12, [r10, #244]
2072	eors	r12, #1
2073	beq	0f
2074
2075	str	r12, [r10, #244]
2076	mov	r4, r10			@ pass key
2077	mov	r5, r1			@ pass # of rounds
2078	add	r12, r10, #248			@ pass key schedule
2079	bl	_bsaes_key_convert
2080	add	r4, r10, #248
2081	vldmia	r4, {q6}
2082	vstmia	r12,  {q15}		@ save last round key
2083	veor	q7, q7, q6	@ fix up round 0 key
2084	vstmia	r4, {q7}
2085
2086.align	2
20870:	sub	sp, #0x90			@ place for tweak[9]
2088#endif
2089	vld1.8	{q8}, [r0]			@ initial tweak
2090	adr	r2, .Lxts_magic
2091
2092	tst	r9, #0xf			@ if not multiple of 16
2093	it	ne				@ Thumb2 thing, sanity check in ARM
2094	subne	r9, #0x10			@ subtract another 16 bytes
2095	subs	r9, #0x80
2096
2097	blo	.Lxts_dec_short
2098	b	.Lxts_dec_loop
2099
2100.align	4
2101.Lxts_dec_loop:
2102	vldmia		r2, {q5}	@ load XTS magic
2103	vshr.s64	q6, q8, #63
2104	mov		r0, sp
2105	vand		q6, q6, q5
2106	vadd.u64	q9, q8, q8
2107	vst1.64		{q8}, [r0,:128]!
2108	vswp		d13,d12
2109	vshr.s64	q7, q9, #63
2110	veor		q9, q9, q6
2111	vand		q7, q7, q5
2112	vadd.u64	q10, q9, q9
2113	vst1.64		{q9}, [r0,:128]!
2114	vswp		d15,d14
2115	vshr.s64	q6, q10, #63
2116	veor		q10, q10, q7
2117	vand		q6, q6, q5
2118	vld1.8		{q0}, [r7]!
2119	vadd.u64	q11, q10, q10
2120	vst1.64		{q10}, [r0,:128]!
2121	vswp		d13,d12
2122	vshr.s64	q7, q11, #63
2123	veor		q11, q11, q6
2124	vand		q7, q7, q5
2125	vld1.8		{q1}, [r7]!
2126	veor		q0, q0, q8
2127	vadd.u64	q12, q11, q11
2128	vst1.64		{q11}, [r0,:128]!
2129	vswp		d15,d14
2130	vshr.s64	q6, q12, #63
2131	veor		q12, q12, q7
2132	vand		q6, q6, q5
2133	vld1.8		{q2}, [r7]!
2134	veor		q1, q1, q9
2135	vadd.u64	q13, q12, q12
2136	vst1.64		{q12}, [r0,:128]!
2137	vswp		d13,d12
2138	vshr.s64	q7, q13, #63
2139	veor		q13, q13, q6
2140	vand		q7, q7, q5
2141	vld1.8		{q3}, [r7]!
2142	veor		q2, q2, q10
2143	vadd.u64	q14, q13, q13
2144	vst1.64		{q13}, [r0,:128]!
2145	vswp		d15,d14
2146	vshr.s64	q6, q14, #63
2147	veor		q14, q14, q7
2148	vand		q6, q6, q5
2149	vld1.8		{q4}, [r7]!
2150	veor		q3, q3, q11
2151	vadd.u64	q15, q14, q14
2152	vst1.64		{q14}, [r0,:128]!
2153	vswp		d13,d12
2154	vshr.s64	q7, q15, #63
2155	veor		q15, q15, q6
2156	vand		q7, q7, q5
2157	vld1.8		{q5}, [r7]!
2158	veor		q4, q4, q12
2159	vadd.u64	q8, q15, q15
2160	vst1.64		{q15}, [r0,:128]!
2161	vswp		d15,d14
2162	veor		q8, q8, q7
2163	vst1.64		{q8}, [r0,:128]		@ next round tweak
2164
2165	vld1.8		{q6-q7}, [r7]!
2166	veor		q5, q5, q13
2167#ifndef	BSAES_ASM_EXTENDED_KEY
2168	add		r4, sp, #0x90			@ pass key schedule
2169#else
2170	add		r4, r10, #248			@ pass key schedule
2171#endif
2172	veor		q6, q6, q14
2173	mov		r5, r1			@ pass rounds
2174	veor		q7, q7, q15
2175	mov		r0, sp
2176
2177	bl		_bsaes_decrypt8
2178
2179	vld1.64		{q8-q9}, [r0,:128]!
2180	vld1.64		{q10-q11}, [r0,:128]!
2181	veor		q0, q0, q8
2182	vld1.64		{q12-q13}, [r0,:128]!
2183	veor		q1, q1, q9
2184	veor		q8, q6, q10
2185	vst1.8		{q0-q1}, [r8]!
2186	veor		q9, q4, q11
2187	vld1.64		{q14-q15}, [r0,:128]!
2188	veor		q10, q2, q12
2189	vst1.8		{q8-q9}, [r8]!
2190	veor		q11, q7, q13
2191	veor		q12, q3, q14
2192	vst1.8		{q10-q11}, [r8]!
2193	veor		q13, q5, q15
2194	vst1.8		{q12-q13}, [r8]!
2195
2196	vld1.64		{q8}, [r0,:128]		@ next round tweak
2197
2198	subs		r9, #0x80
2199	bpl		.Lxts_dec_loop
2200
2201.Lxts_dec_short:
2202	adds		r9, #0x70
2203	bmi		.Lxts_dec_done
2204
2205	vldmia		r2, {q5}	@ load XTS magic
2206	vshr.s64	q7, q8, #63
2207	mov		r0, sp
2208	vand		q7, q7, q5
2209	vadd.u64	q9, q8, q8
2210	vst1.64		{q8}, [r0,:128]!
2211	vswp		d15,d14
2212	vshr.s64	q6, q9, #63
2213	veor		q9, q9, q7
2214	vand		q6, q6, q5
2215	vadd.u64	q10, q9, q9
2216	vst1.64		{q9}, [r0,:128]!
2217	vswp		d13,d12
2218	vshr.s64	q7, q10, #63
2219	veor		q10, q10, q6
2220	vand		q7, q7, q5
2221	vld1.8		{q0}, [r7]!
2222	subs		r9, #0x10
2223	bmi		.Lxts_dec_1
2224	vadd.u64	q11, q10, q10
2225	vst1.64		{q10}, [r0,:128]!
2226	vswp		d15,d14
2227	vshr.s64	q6, q11, #63
2228	veor		q11, q11, q7
2229	vand		q6, q6, q5
2230	vld1.8		{q1}, [r7]!
2231	subs		r9, #0x10
2232	bmi		.Lxts_dec_2
2233	veor		q0, q0, q8
2234	vadd.u64	q12, q11, q11
2235	vst1.64		{q11}, [r0,:128]!
2236	vswp		d13,d12
2237	vshr.s64	q7, q12, #63
2238	veor		q12, q12, q6
2239	vand		q7, q7, q5
2240	vld1.8		{q2}, [r7]!
2241	subs		r9, #0x10
2242	bmi		.Lxts_dec_3
2243	veor		q1, q1, q9
2244	vadd.u64	q13, q12, q12
2245	vst1.64		{q12}, [r0,:128]!
2246	vswp		d15,d14
2247	vshr.s64	q6, q13, #63
2248	veor		q13, q13, q7
2249	vand		q6, q6, q5
2250	vld1.8		{q3}, [r7]!
2251	subs		r9, #0x10
2252	bmi		.Lxts_dec_4
2253	veor		q2, q2, q10
2254	vadd.u64	q14, q13, q13
2255	vst1.64		{q13}, [r0,:128]!
2256	vswp		d13,d12
2257	vshr.s64	q7, q14, #63
2258	veor		q14, q14, q6
2259	vand		q7, q7, q5
2260	vld1.8		{q4}, [r7]!
2261	subs		r9, #0x10
2262	bmi		.Lxts_dec_5
2263	veor		q3, q3, q11
2264	vadd.u64	q15, q14, q14
2265	vst1.64		{q14}, [r0,:128]!
2266	vswp		d15,d14
2267	vshr.s64	q6, q15, #63
2268	veor		q15, q15, q7
2269	vand		q6, q6, q5
2270	vld1.8		{q5}, [r7]!
2271	subs		r9, #0x10
2272	bmi		.Lxts_dec_6
2273	veor		q4, q4, q12
2274	sub		r9, #0x10
2275	vst1.64		{q15}, [r0,:128]		@ next round tweak
2276
2277	vld1.8		{q6}, [r7]!
2278	veor		q5, q5, q13
2279#ifndef	BSAES_ASM_EXTENDED_KEY
2280	add		r4, sp, #0x90			@ pass key schedule
2281#else
2282	add		r4, r10, #248			@ pass key schedule
2283#endif
2284	veor		q6, q6, q14
2285	mov		r5, r1			@ pass rounds
2286	mov		r0, sp
2287
2288	bl		_bsaes_decrypt8
2289
2290	vld1.64		{q8-q9}, [r0,:128]!
2291	vld1.64		{q10-q11}, [r0,:128]!
2292	veor		q0, q0, q8
2293	vld1.64		{q12-q13}, [r0,:128]!
2294	veor		q1, q1, q9
2295	veor		q8, q6, q10
2296	vst1.8		{q0-q1}, [r8]!
2297	veor		q9, q4, q11
2298	vld1.64		{q14}, [r0,:128]!
2299	veor		q10, q2, q12
2300	vst1.8		{q8-q9}, [r8]!
2301	veor		q11, q7, q13
2302	veor		q12, q3, q14
2303	vst1.8		{q10-q11}, [r8]!
2304	vst1.8		{q12}, [r8]!
2305
2306	vld1.64		{q8}, [r0,:128]		@ next round tweak
2307	b		.Lxts_dec_done
2308.align	4
2309.Lxts_dec_6:
2310	vst1.64		{q14}, [r0,:128]		@ next round tweak
2311
2312	veor		q4, q4, q12
2313#ifndef	BSAES_ASM_EXTENDED_KEY
2314	add		r4, sp, #0x90			@ pass key schedule
2315#else
2316	add		r4, r10, #248			@ pass key schedule
2317#endif
2318	veor		q5, q5, q13
2319	mov		r5, r1			@ pass rounds
2320	mov		r0, sp
2321
2322	bl		_bsaes_decrypt8
2323
2324	vld1.64		{q8-q9}, [r0,:128]!
2325	vld1.64		{q10-q11}, [r0,:128]!
2326	veor		q0, q0, q8
2327	vld1.64		{q12-q13}, [r0,:128]!
2328	veor		q1, q1, q9
2329	veor		q8, q6, q10
2330	vst1.8		{q0-q1}, [r8]!
2331	veor		q9, q4, q11
2332	veor		q10, q2, q12
2333	vst1.8		{q8-q9}, [r8]!
2334	veor		q11, q7, q13
2335	vst1.8		{q10-q11}, [r8]!
2336
2337	vld1.64		{q8}, [r0,:128]		@ next round tweak
2338	b		.Lxts_dec_done
2339.align	4
2340.Lxts_dec_5:
2341	veor		q3, q3, q11
2342#ifndef	BSAES_ASM_EXTENDED_KEY
2343	add		r4, sp, #0x90			@ pass key schedule
2344#else
2345	add		r4, r10, #248			@ pass key schedule
2346#endif
2347	veor		q4, q4, q12
2348	mov		r5, r1			@ pass rounds
2349	mov		r0, sp
2350
2351	bl		_bsaes_decrypt8
2352
2353	vld1.64		{q8-q9}, [r0,:128]!
2354	vld1.64		{q10-q11}, [r0,:128]!
2355	veor		q0, q0, q8
2356	vld1.64		{q12}, [r0,:128]!
2357	veor		q1, q1, q9
2358	veor		q8, q6, q10
2359	vst1.8		{q0-q1}, [r8]!
2360	veor		q9, q4, q11
2361	veor		q10, q2, q12
2362	vst1.8		{q8-q9}, [r8]!
2363	vst1.8		{q10}, [r8]!
2364
2365	vld1.64		{q8}, [r0,:128]		@ next round tweak
2366	b		.Lxts_dec_done
2367.align	4
2368.Lxts_dec_4:
2369	veor		q2, q2, q10
2370#ifndef	BSAES_ASM_EXTENDED_KEY
2371	add		r4, sp, #0x90			@ pass key schedule
2372#else
2373	add		r4, r10, #248			@ pass key schedule
2374#endif
2375	veor		q3, q3, q11
2376	mov		r5, r1			@ pass rounds
2377	mov		r0, sp
2378
2379	bl		_bsaes_decrypt8
2380
2381	vld1.64		{q8-q9}, [r0,:128]!
2382	vld1.64		{q10-q11}, [r0,:128]!
2383	veor		q0, q0, q8
2384	veor		q1, q1, q9
2385	veor		q8, q6, q10
2386	vst1.8		{q0-q1}, [r8]!
2387	veor		q9, q4, q11
2388	vst1.8		{q8-q9}, [r8]!
2389
2390	vld1.64		{q8}, [r0,:128]		@ next round tweak
2391	b		.Lxts_dec_done
2392.align	4
2393.Lxts_dec_3:
2394	veor		q1, q1, q9
2395#ifndef	BSAES_ASM_EXTENDED_KEY
2396	add		r4, sp, #0x90			@ pass key schedule
2397#else
2398	add		r4, r10, #248			@ pass key schedule
2399#endif
2400	veor		q2, q2, q10
2401	mov		r5, r1			@ pass rounds
2402	mov		r0, sp
2403
2404	bl		_bsaes_decrypt8
2405
2406	vld1.64		{q8-q9}, [r0,:128]!
2407	vld1.64		{q10}, [r0,:128]!
2408	veor		q0, q0, q8
2409	veor		q1, q1, q9
2410	veor		q8, q6, q10
2411	vst1.8		{q0-q1}, [r8]!
2412	vst1.8		{q8}, [r8]!
2413
2414	vld1.64		{q8}, [r0,:128]		@ next round tweak
2415	b		.Lxts_dec_done
2416.align	4
2417.Lxts_dec_2:
2418	veor		q0, q0, q8
2419#ifndef	BSAES_ASM_EXTENDED_KEY
2420	add		r4, sp, #0x90			@ pass key schedule
2421#else
2422	add		r4, r10, #248			@ pass key schedule
2423#endif
2424	veor		q1, q1, q9
2425	mov		r5, r1			@ pass rounds
2426	mov		r0, sp
2427
2428	bl		_bsaes_decrypt8
2429
2430	vld1.64		{q8-q9}, [r0,:128]!
2431	veor		q0, q0, q8
2432	veor		q1, q1, q9
2433	vst1.8		{q0-q1}, [r8]!
2434
2435	vld1.64		{q8}, [r0,:128]		@ next round tweak
2436	b		.Lxts_dec_done
2437.align	4
2438.Lxts_dec_1:
2439	mov		r0, sp
2440	veor		q0, q0, q8
2441	mov		r1, sp
2442	vst1.8		{q0}, [sp,:128]
2443	mov		r5, r2			@ preserve magic
2444	mov		r2, r10
2445	mov		r4, r3				@ preserve fp
2446
2447	bl		AES_decrypt
2448
2449	vld1.8		{q0}, [sp,:128]
2450	veor		q0, q0, q8
2451	vst1.8		{q0}, [r8]!
2452	mov		r3, r4
2453	mov		r2, r5
2454
2455	vmov		q8, q9		@ next round tweak
2456
2457.Lxts_dec_done:
2458#ifndef	XTS_CHAIN_TWEAK
2459	adds		r9, #0x10
2460	beq		.Lxts_dec_ret
2461
2462	@ calculate one round of extra tweak for the stolen ciphertext
2463	vldmia		r2, {q5}
2464	vshr.s64	q6, q8, #63
2465	vand		q6, q6, q5
2466	vadd.u64	q9, q8, q8
2467	vswp		d13,d12
2468	veor		q9, q9, q6
2469
2470	@ perform the final decryption with the last tweak value
2471	vld1.8		{q0}, [r7]!
2472	mov		r0, sp
2473	veor		q0, q0, q9
2474	mov		r1, sp
2475	vst1.8		{q0}, [sp,:128]
2476	mov		r2, r10
2477	mov		r4, r3			@ preserve fp
2478
2479	bl		AES_decrypt
2480
2481	vld1.8		{q0}, [sp,:128]
2482	veor		q0, q0, q9
2483	vst1.8		{q0}, [r8]
2484
2485	mov		r6, r8
2486.Lxts_dec_steal:
2487	ldrb		r1, [r8]
2488	ldrb		r0, [r7], #1
2489	strb		r1, [r8, #0x10]
2490	strb		r0, [r8], #1
2491
2492	subs		r9, #1
2493	bhi		.Lxts_dec_steal
2494
2495	vld1.8		{q0}, [r6]
2496	mov		r0, sp
2497	veor		q0, q8
2498	mov		r1, sp
2499	vst1.8		{q0}, [sp,:128]
2500	mov		r2, r10
2501
2502	bl		AES_decrypt
2503
2504	vld1.8		{q0}, [sp,:128]
2505	veor		q0, q0, q8
2506	vst1.8		{q0}, [r6]
2507	mov		r3, r4
2508#endif
2509
2510.Lxts_dec_ret:
2511	bic		r0, r3, #0xf
2512	vmov.i32	q0, #0
2513	vmov.i32	q1, #0
2514#ifdef	XTS_CHAIN_TWEAK
2515	ldr		r1, [r3, #0x20+VFP_ABI_FRAME]	@ chain tweak
2516#endif
2517.Lxts_dec_bzero:				@ wipe key schedule [if any]
2518	vstmia		sp!, {q0-q1}
2519	cmp		sp, r0
2520	bne		.Lxts_dec_bzero
2521
2522	mov		sp, r3
2523#ifdef	XTS_CHAIN_TWEAK
2524	vst1.8		{q8}, [r1]
2525#endif
2526	VFP_ABI_POP
2527	ldmia		sp!, {r4-r10, pc}	@ return
2528
2529.size	bsaes_xts_decrypt,.-bsaes_xts_decrypt
2530#endif
2531