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