1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch@ ====================================================================
3116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch@ Written by Andy Polyakov <appro@openssl.org> for the OpenSSL
4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch@ project. The module is, however, dual licensed under OpenSSL and
5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch@ CRYPTOGAMS licenses depending on where you obtain it. For further
6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch@ details see http://www.openssl.org/~appro/cryptogams/.
7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch@
8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch@ Specific modes and adaptation for Linux kernel by Ard Biesheuvel
9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch@ <ard.biesheuvel@linaro.org>. Permission to use under GPL terms is
10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch@ granted.
11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch@ ====================================================================
12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch@ Bit-sliced AES for ARM NEON
14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch@
15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch@ February 2012.
16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch@
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch@ This implementation is direct adaptation of bsaes-x86_64 module for
18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch@ ARM NEON. Except that this module is endian-neutral [in sense that
19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch@ it can be compiled for either endianness] by courtesy of vld1.8's
20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch@ neutrality. Initial version doesn't implement interface to OpenSSL,
21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch@ only low-level primitives and unsupported entry points, just enough
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch@ to collect performance results, which for Cortex-A8 core are:
23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch@
24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch@ encrypt	19.5 cycles per byte processed with 128-bit key
25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch@ decrypt	22.1 cycles per byte processed with 128-bit key
26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch@ key conv.	440  cycles per 128-bit key/0.18 of 8x block
27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch@
28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch@ Snapdragon S4 encrypts byte in 17.6 cycles and decrypts in 19.7,
29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch@ which is [much] worse than anticipated (for further details see
30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch@ http://www.openssl.org/~appro/Snapdragon-S4.html).
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch@
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch@ Cortex-A15 manages in 14.2/16.1 cycles [when integer-only code
33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch@ manages in 20.0 cycles].
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch@
35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch@ When comparing to x86_64 results keep in mind that NEON unit is
36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch@ [mostly] single-issue and thus can't [fully] benefit from
37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch@ instruction-level parallelism. And when comparing to aes-armv4
38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch@ results keep in mind key schedule conversion overhead (see
39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch@ bsaes-x86_64.pl for further details)...
40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch@
41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch@						<appro@openssl.org>
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch@ April-August 2013
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch@
45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch@ Add CBC, CTR and XTS subroutines, adapt for kernel use.
46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch@
47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch@					<ard.biesheuvel@linaro.org>
48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(__arm__)
50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#ifndef __KERNEL__
51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch# include "arm_arch.h"
52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch# define VFP_ABI_PUSH	vstmdb	sp!,{d8-d15}
54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch# define VFP_ABI_POP	vldmia	sp!,{d8-d15}
55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch# define VFP_ABI_FRAME	0x40
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#else
57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch# define VFP_ABI_PUSH
58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch# define VFP_ABI_POP
59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch# define VFP_ABI_FRAME	0
60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch# define BSAES_ASM_EXTENDED_KEY
61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch# define XTS_CHAIN_TWEAK
62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch# define __ARM_ARCH__ __LINUX_ARM_ARCH__
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#ifdef __thumb__
66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch# define adrl adr
67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if __ARM_ARCH__>=7
70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.text
71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.syntax	unified 	@ ARMv7-capable assembler is expected to handle this
72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#ifdef __thumb2__
73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.thumb
74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#else
75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.code   32
76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.fpu	neon
79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.type	_bsaes_decrypt8,%function
81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.align	4
82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch_bsaes_decrypt8:
83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	adr	r6,_bsaes_decrypt8
84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vldmia	r4!, {q9}		@ round 0 key
85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	add	r6,r6,#.LM0ISR-_bsaes_decrypt8
86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vldmia	r6!, {q8}		@ .LM0ISR
88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q10, q0, q9	@ xor with round0 key
89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q11, q1, q9
90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vtbl.8	d0, {q10}, d16
91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vtbl.8	d1, {q10}, d17
92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q12, q2, q9
93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vtbl.8	d2, {q11}, d16
94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vtbl.8	d3, {q11}, d17
95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q13, q3, q9
96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vtbl.8	d4, {q12}, d16
97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vtbl.8	d5, {q12}, d17
98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q14, q4, q9
99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vtbl.8	d6, {q13}, d16
100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vtbl.8	d7, {q13}, d17
101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q15, q5, q9
102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vtbl.8	d8, {q14}, d16
103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vtbl.8	d9, {q14}, d17
104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q10, q6, q9
105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vtbl.8	d10, {q15}, d16
106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vtbl.8	d11, {q15}, d17
107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q11, q7, q9
108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vtbl.8	d12, {q10}, d16
109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vtbl.8	d13, {q10}, d17
110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vtbl.8	d14, {q11}, d16
111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vtbl.8	d15, {q11}, d17
112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vmov.i8	q8,#0x55			@ compose .LBS0
113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vmov.i8	q9,#0x33			@ compose .LBS1
114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshr.u64	q10, q6, #1
115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vshr.u64	q11, q4, #1
116116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q10, q10, q7
117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q11, q11, q5
118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand		q10, q10, q8
119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vand		q11, q11, q8
120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q7, q7, q10
121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshl.u64	q10, q10, #1
122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q5, q5, q11
123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vshl.u64	q11, q11, #1
124116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q6, q6, q10
125116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q4, q4, q11
126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshr.u64	q10, q2, #1
127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vshr.u64	q11, q0, #1
128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q10, q10, q3
129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q11, q11, q1
130116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand		q10, q10, q8
131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vand		q11, q11, q8
132116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q3, q3, q10
133116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshl.u64	q10, q10, #1
134116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q1, q1, q11
135116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vshl.u64	q11, q11, #1
136116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q2, q2, q10
137116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q0, q0, q11
138116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vmov.i8	q8,#0x0f			@ compose .LBS2
139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshr.u64	q10, q5, #2
140116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vshr.u64	q11, q4, #2
141116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q10, q10, q7
142116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q11, q11, q6
143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand		q10, q10, q9
144116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vand		q11, q11, q9
145116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q7, q7, q10
146116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshl.u64	q10, q10, #2
147116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q6, q6, q11
148116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vshl.u64	q11, q11, #2
149116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q5, q5, q10
150116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q4, q4, q11
151116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshr.u64	q10, q1, #2
152116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vshr.u64	q11, q0, #2
153116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q10, q10, q3
154116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q11, q11, q2
155116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand		q10, q10, q9
156116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vand		q11, q11, q9
157116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q3, q3, q10
158116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshl.u64	q10, q10, #2
159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q2, q2, q11
160116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vshl.u64	q11, q11, #2
161116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q1, q1, q10
162116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q0, q0, q11
163116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshr.u64	q10, q3, #4
164116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vshr.u64	q11, q2, #4
165116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q10, q10, q7
166116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q11, q11, q6
167116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand		q10, q10, q8
168116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vand		q11, q11, q8
169116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q7, q7, q10
170116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshl.u64	q10, q10, #4
171116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q6, q6, q11
172116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vshl.u64	q11, q11, #4
173116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q3, q3, q10
174116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q2, q2, q11
175116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshr.u64	q10, q1, #4
176116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vshr.u64	q11, q0, #4
177116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q10, q10, q5
178116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q11, q11, q4
179116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand		q10, q10, q8
180116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vand		q11, q11, q8
181116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q5, q5, q10
182116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshl.u64	q10, q10, #4
183116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q4, q4, q11
184116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vshl.u64	q11, q11, #4
185116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q1, q1, q10
186116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q0, q0, q11
187116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	sub	r5,r5,#1
188116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	b	.Ldec_sbox
189116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.align	4
190116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.Ldec_loop:
191116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vldmia	r4!, {q8-q11}
192116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q8, q8, q0
193116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q9, q9, q1
194116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vtbl.8	d0, {q8}, d24
195116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vtbl.8	d1, {q8}, d25
196116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vldmia	r4!, {q8}
197116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q10, q10, q2
198116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vtbl.8	d2, {q9}, d24
199116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vtbl.8	d3, {q9}, d25
200116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vldmia	r4!, {q9}
201116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q11, q11, q3
202116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vtbl.8	d4, {q10}, d24
203116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vtbl.8	d5, {q10}, d25
204116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vldmia	r4!, {q10}
205116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vtbl.8	d6, {q11}, d24
206116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vtbl.8	d7, {q11}, d25
207116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vldmia	r4!, {q11}
208116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q8, q8, q4
209116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q9, q9, q5
210116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vtbl.8	d8, {q8}, d24
211116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vtbl.8	d9, {q8}, d25
212116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q10, q10, q6
213116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vtbl.8	d10, {q9}, d24
214116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vtbl.8	d11, {q9}, d25
215116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q11, q11, q7
216116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vtbl.8	d12, {q10}, d24
217116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vtbl.8	d13, {q10}, d25
218116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vtbl.8	d14, {q11}, d24
219116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vtbl.8	d15, {q11}, d25
220116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.Ldec_sbox:
221116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor	q1, q1, q4
222116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q3, q3, q4
223116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
224116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q4, q4, q7
225116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor	q1, q1, q6
226116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q2, q2, q7
227116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q6, q6, q4
228116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
229116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q0, q0, q1
230116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q2, q2, q5
231116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor	q7, q7, q6
232116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q3, q3, q0
233116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q5, q5, q0
234116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q1, q1, q3
235116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q11, q3, q0
236116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q10, q7, q4
237116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q9, q1, q6
238116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q13, q4, q0
239116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vmov	q8, q10
240116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q12, q5, q2
241116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
242116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vorr	q10, q10, q9
243116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q15, q11, q8
244116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand	q14, q11, q12
245116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vorr	q11, q11, q12
246116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q12, q12, q9
247116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand	q8, q8, q9
248116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q9, q6, q2
249116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand	q15, q15, q12
250116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand	q13, q13, q9
251116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q9, q3, q7
252116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q12, q1, q5
253116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q11, q11, q13
254116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q10, q10, q13
255116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand	q13, q9, q12
256116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vorr	q9, q9, q12
257116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q11, q11, q15
258116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q8, q8, q13
259116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q10, q10, q14
260116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q9, q9, q15
261116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q8, q8, q14
262116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand	q12, q4, q6
263116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q9, q9, q14
264116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand	q13, q0, q2
265116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand	q14, q7, q1
266116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vorr	q15, q3, q5
267116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q11, q11, q12
268116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q9, q9, q14
269116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q8, q8, q15
270116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q10, q10, q13
271116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
272116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	@ Inv_GF16 	0, 	1, 	2, 	3, s0, s1, s2, s3
273116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
274116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	@ new smaller inversion
275116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
276116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand	q14, q11, q9
277116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vmov	q12, q8
278116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
279116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q13, q10, q14
280116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q15, q8, q14
281116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q14, q8, q14	@ q14=q15
282116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
283116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vbsl	q13, q9, q8
284116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vbsl	q15, q11, q10
285116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q11, q11, q10
286116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
287116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vbsl	q12, q13, q14
288116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vbsl	q8, q14, q13
289116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
290116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand	q14, q12, q15
291116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q9, q9, q8
292116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
293116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q14, q14, q11
294116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q12, q5, q2
295116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q8, q1, q6
296116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor 	q10, q15, q14
297116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand	q10, q10, q5
298116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q5, q5, q1
299116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand	q11, q1, q15
300116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand	q5, q5, q14
301116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q1, q11, q10
302116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q5, q5, q11
303116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q15, q15, q13
304116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q14, q14, q9
305116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q11, q15, q14
306116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor 	q10, q13, q9
307116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand	q11, q11, q12
308116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vand	q10, q10, q2
309116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q12, q12, q8
310116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor	q2, q2, q6
311116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand	q8, q8, q15
312116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vand	q6, q6, q13
313116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand	q12, q12, q14
314116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vand	q2, q2, q9
315116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q8, q8, q12
316116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor	q2, q2, q6
317116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q12, q12, q11
318116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor	q6, q6, q10
319116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q5, q5, q12
320116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q2, q2, q12
321116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q1, q1, q8
322116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q6, q6, q8
323116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
324116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q12, q3, q0
325116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q8, q7, q4
326116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q11, q15, q14
327116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor 	q10, q13, q9
328116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand	q11, q11, q12
329116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vand	q10, q10, q0
330116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q12, q12, q8
331116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor	q0, q0, q4
332116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand	q8, q8, q15
333116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vand	q4, q4, q13
334116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand	q12, q12, q14
335116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vand	q0, q0, q9
336116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q8, q8, q12
337116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor	q0, q0, q4
338116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q12, q12, q11
339116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor	q4, q4, q10
340116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q15, q15, q13
341116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q14, q14, q9
342116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor 	q10, q15, q14
343116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand	q10, q10, q3
344116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q3, q3, q7
345116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand	q11, q7, q15
346116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand	q3, q3, q14
347116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q7, q11, q10
348116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q3, q3, q11
349116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q3, q3, q12
350116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q0, q0, q12
351116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q7, q7, q8
352116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q4, q4, q8
353116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q1, q1, q7
354116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q6, q6, q5
355116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
356116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q4, q4, q1
357116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q2, q2, q7
358116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q5, q5, q7
359116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q4, q4, q2
360116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor 	q7, q7, q0
361116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q4, q4, q5
362116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor	q3, q3, q6
363116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor	q6, q6, q1
364116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q3, q3, q4
365116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
366116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q4, q4, q0
367116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q7, q7, q3
368116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	subs	r5,r5,#1
369116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bcc	.Ldec_done
370116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	@ multiplication by 0x05-0x00-0x04-0x00
371116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vext.8	q8, q0, q0, #8
372116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vext.8	q14, q3, q3, #8
373116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vext.8	q15, q5, q5, #8
374116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q8, q8, q0
375116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vext.8	q9, q1, q1, #8
376116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q14, q14, q3
377116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vext.8	q10, q6, q6, #8
378116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q15, q15, q5
379116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vext.8	q11, q4, q4, #8
380116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q9, q9, q1
381116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vext.8	q12, q2, q2, #8
382116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q10, q10, q6
383116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vext.8	q13, q7, q7, #8
384116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q11, q11, q4
385116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q12, q12, q2
386116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q13, q13, q7
387116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
388116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor	q0, q0, q14
389116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor	q1, q1, q14
390116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor	q6, q6, q8
391116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor	q2, q2, q10
392116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor	q4, q4, q9
393116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor	q1, q1, q15
394116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor	q6, q6, q15
395116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor	q2, q2, q14
396116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor	q7, q7, q11
397116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor	q4, q4, q14
398116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor	q3, q3, q12
399116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor	q2, q2, q15
400116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor	q7, q7, q15
401116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor	q5, q5, q13
402116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vext.8	q8, q0, q0, #12	@ x0 <<< 32
403116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vext.8	q9, q1, q1, #12
404116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor	q0, q0, q8		@ x0 ^ (x0 <<< 32)
405116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vext.8	q10, q6, q6, #12
406116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor	q1, q1, q9
407116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vext.8	q11, q4, q4, #12
408116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor	q6, q6, q10
409116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vext.8	q12, q2, q2, #12
410116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor	q4, q4, q11
411116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vext.8	q13, q7, q7, #12
412116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor	q2, q2, q12
413116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vext.8	q14, q3, q3, #12
414116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor	q7, q7, q13
415116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vext.8	q15, q5, q5, #12
416116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor	q3, q3, q14
417116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
418116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q9, q9, q0
419116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor	q5, q5, q15
420116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vext.8	q0, q0, q0, #8		@ (x0 ^ (x0 <<< 32)) <<< 64)
421116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q10, q10, q1
422116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q8, q8, q5
423116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q9, q9, q5
424116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vext.8	q1, q1, q1, #8
425116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q13, q13, q2
426116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor	q0, q0, q8
427116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q14, q14, q7
428116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor	q1, q1, q9
429116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vext.8	q8, q2, q2, #8
430116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q12, q12, q4
431116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vext.8	q9, q7, q7, #8
432116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q15, q15, q3
433116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vext.8	q2, q4, q4, #8
434116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q11, q11, q6
435116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vext.8	q7, q5, q5, #8
436116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q12, q12, q5
437116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vext.8	q4, q3, q3, #8
438116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q11, q11, q5
439116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vext.8	q3, q6, q6, #8
440116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q5, q9, q13
441116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q11, q11, q2
442116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q7, q7, q15
443116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q6, q4, q14
444116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q4, q8, q12
445116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q2, q3, q10
446116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vmov	q3, q11
447116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 @ vmov	q5, q9
448116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vldmia	r6, {q12}		@ .LISR
449116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	ite	eq				@ Thumb2 thing, sanity check in ARM
450116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	addeq	r6,r6,#0x10
451116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bne	.Ldec_loop
452116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vldmia	r6, {q12}		@ .LISRM0
453116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	b	.Ldec_loop
454116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.align	4
455116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.Ldec_done:
456116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vmov.i8	q8,#0x55			@ compose .LBS0
457116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vmov.i8	q9,#0x33			@ compose .LBS1
458116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshr.u64	q10, q3, #1
459116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vshr.u64	q11, q2, #1
460116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q10, q10, q5
461116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q11, q11, q7
462116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand		q10, q10, q8
463116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vand		q11, q11, q8
464116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q5, q5, q10
465116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshl.u64	q10, q10, #1
466116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q7, q7, q11
467116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vshl.u64	q11, q11, #1
468116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q3, q3, q10
469116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q2, q2, q11
470116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshr.u64	q10, q6, #1
471116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vshr.u64	q11, q0, #1
472116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q10, q10, q4
473116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q11, q11, q1
474116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand		q10, q10, q8
475116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vand		q11, q11, q8
476116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q4, q4, q10
477116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshl.u64	q10, q10, #1
478116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q1, q1, q11
479116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vshl.u64	q11, q11, #1
480116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q6, q6, q10
481116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q0, q0, q11
482116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vmov.i8	q8,#0x0f			@ compose .LBS2
483116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshr.u64	q10, q7, #2
484116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vshr.u64	q11, q2, #2
485116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q10, q10, q5
486116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q11, q11, q3
487116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand		q10, q10, q9
488116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vand		q11, q11, q9
489116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q5, q5, q10
490116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshl.u64	q10, q10, #2
491116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q3, q3, q11
492116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vshl.u64	q11, q11, #2
493116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q7, q7, q10
494116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q2, q2, q11
495116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshr.u64	q10, q1, #2
496116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vshr.u64	q11, q0, #2
497116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q10, q10, q4
498116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q11, q11, q6
499116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand		q10, q10, q9
500116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vand		q11, q11, q9
501116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q4, q4, q10
502116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshl.u64	q10, q10, #2
503116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q6, q6, q11
504116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vshl.u64	q11, q11, #2
505116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q1, q1, q10
506116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q0, q0, q11
507116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshr.u64	q10, q4, #4
508116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vshr.u64	q11, q6, #4
509116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q10, q10, q5
510116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q11, q11, q3
511116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand		q10, q10, q8
512116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vand		q11, q11, q8
513116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q5, q5, q10
514116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshl.u64	q10, q10, #4
515116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q3, q3, q11
516116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vshl.u64	q11, q11, #4
517116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q4, q4, q10
518116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q6, q6, q11
519116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshr.u64	q10, q1, #4
520116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vshr.u64	q11, q0, #4
521116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q10, q10, q7
522116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q11, q11, q2
523116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand		q10, q10, q8
524116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vand		q11, q11, q8
525116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q7, q7, q10
526116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshl.u64	q10, q10, #4
527116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q2, q2, q11
528116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vshl.u64	q11, q11, #4
529116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q1, q1, q10
530116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q0, q0, q11
531116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vldmia	r4, {q8}			@ last round key
532116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q6, q6, q8
533116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q4, q4, q8
534116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q2, q2, q8
535116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q7, q7, q8
536116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q3, q3, q8
537116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q5, q5, q8
538116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q0, q0, q8
539116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q1, q1, q8
540116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bx	lr
541116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.size	_bsaes_decrypt8,.-_bsaes_decrypt8
542116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
543116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.type	_bsaes_const,%object
544116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.align	6
545116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch_bsaes_const:
546116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.LM0ISR:	@ InvShiftRows constants
547116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	.quad	0x0a0e0206070b0f03, 0x0004080c0d010509
548116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.LISR:
549116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	.quad	0x0504070602010003, 0x0f0e0d0c080b0a09
550116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.LISRM0:
551116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	.quad	0x01040b0e0205080f, 0x0306090c00070a0d
552116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.LM0SR:		@ ShiftRows constants
553116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	.quad	0x0a0e02060f03070b, 0x0004080c05090d01
554116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.LSR:
555116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	.quad	0x0504070600030201, 0x0f0e0d0c0a09080b
556116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.LSRM0:
557116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	.quad	0x0304090e00050a0f, 0x01060b0c0207080d
558116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.LM0:
559116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	.quad	0x02060a0e03070b0f, 0x0004080c0105090d
560116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.LREVM0SR:
561116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	.quad	0x090d01050c000408, 0x03070b0f060a0e02
562116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.asciz	"Bit-sliced AES for NEON, CRYPTOGAMS by <appro@openssl.org>"
563116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.align	6
564116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.size	_bsaes_const,.-_bsaes_const
565116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
566116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.type	_bsaes_encrypt8,%function
567116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.align	4
568116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch_bsaes_encrypt8:
569116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	adr	r6,_bsaes_encrypt8
570116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vldmia	r4!, {q9}		@ round 0 key
571116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	sub	r6,r6,#_bsaes_encrypt8-.LM0SR
572116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
573116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vldmia	r6!, {q8}		@ .LM0SR
574116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch_bsaes_encrypt8_alt:
575116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q10, q0, q9	@ xor with round0 key
576116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q11, q1, q9
577116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vtbl.8	d0, {q10}, d16
578116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vtbl.8	d1, {q10}, d17
579116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q12, q2, q9
580116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vtbl.8	d2, {q11}, d16
581116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vtbl.8	d3, {q11}, d17
582116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q13, q3, q9
583116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vtbl.8	d4, {q12}, d16
584116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vtbl.8	d5, {q12}, d17
585116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q14, q4, q9
586116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vtbl.8	d6, {q13}, d16
587116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vtbl.8	d7, {q13}, d17
588116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q15, q5, q9
589116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vtbl.8	d8, {q14}, d16
590116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vtbl.8	d9, {q14}, d17
591116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q10, q6, q9
592116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vtbl.8	d10, {q15}, d16
593116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vtbl.8	d11, {q15}, d17
594116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q11, q7, q9
595116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vtbl.8	d12, {q10}, d16
596116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vtbl.8	d13, {q10}, d17
597116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vtbl.8	d14, {q11}, d16
598116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vtbl.8	d15, {q11}, d17
599116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch_bsaes_encrypt8_bitslice:
600116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vmov.i8	q8,#0x55			@ compose .LBS0
601116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vmov.i8	q9,#0x33			@ compose .LBS1
602116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshr.u64	q10, q6, #1
603116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vshr.u64	q11, q4, #1
604116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q10, q10, q7
605116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q11, q11, q5
606116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand		q10, q10, q8
607116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vand		q11, q11, q8
608116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q7, q7, q10
609116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshl.u64	q10, q10, #1
610116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q5, q5, q11
611116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vshl.u64	q11, q11, #1
612116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q6, q6, q10
613116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q4, q4, q11
614116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshr.u64	q10, q2, #1
615116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vshr.u64	q11, q0, #1
616116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q10, q10, q3
617116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q11, q11, q1
618116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand		q10, q10, q8
619116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vand		q11, q11, q8
620116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q3, q3, q10
621116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshl.u64	q10, q10, #1
622116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q1, q1, q11
623116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vshl.u64	q11, q11, #1
624116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q2, q2, q10
625116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q0, q0, q11
626116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vmov.i8	q8,#0x0f			@ compose .LBS2
627116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshr.u64	q10, q5, #2
628116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vshr.u64	q11, q4, #2
629116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q10, q10, q7
630116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q11, q11, q6
631116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand		q10, q10, q9
632116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vand		q11, q11, q9
633116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q7, q7, q10
634116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshl.u64	q10, q10, #2
635116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q6, q6, q11
636116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vshl.u64	q11, q11, #2
637116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q5, q5, q10
638116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q4, q4, q11
639116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshr.u64	q10, q1, #2
640116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vshr.u64	q11, q0, #2
641116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q10, q10, q3
642116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q11, q11, q2
643116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand		q10, q10, q9
644116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vand		q11, q11, q9
645116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q3, q3, q10
646116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshl.u64	q10, q10, #2
647116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q2, q2, q11
648116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vshl.u64	q11, q11, #2
649116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q1, q1, q10
650116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q0, q0, q11
651116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshr.u64	q10, q3, #4
652116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vshr.u64	q11, q2, #4
653116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q10, q10, q7
654116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q11, q11, q6
655116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand		q10, q10, q8
656116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vand		q11, q11, q8
657116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q7, q7, q10
658116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshl.u64	q10, q10, #4
659116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q6, q6, q11
660116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vshl.u64	q11, q11, #4
661116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q3, q3, q10
662116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q2, q2, q11
663116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshr.u64	q10, q1, #4
664116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vshr.u64	q11, q0, #4
665116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q10, q10, q5
666116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q11, q11, q4
667116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand		q10, q10, q8
668116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vand		q11, q11, q8
669116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q5, q5, q10
670116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshl.u64	q10, q10, #4
671116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q4, q4, q11
672116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vshl.u64	q11, q11, #4
673116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q1, q1, q10
674116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q0, q0, q11
675116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	sub	r5,r5,#1
676116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	b	.Lenc_sbox
677116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.align	4
678116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.Lenc_loop:
679116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vldmia	r4!, {q8-q11}
680116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q8, q8, q0
681116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q9, q9, q1
682116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vtbl.8	d0, {q8}, d24
683116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vtbl.8	d1, {q8}, d25
684116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vldmia	r4!, {q8}
685116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q10, q10, q2
686116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vtbl.8	d2, {q9}, d24
687116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vtbl.8	d3, {q9}, d25
688116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vldmia	r4!, {q9}
689116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q11, q11, q3
690116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vtbl.8	d4, {q10}, d24
691116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vtbl.8	d5, {q10}, d25
692116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vldmia	r4!, {q10}
693116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vtbl.8	d6, {q11}, d24
694116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vtbl.8	d7, {q11}, d25
695116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vldmia	r4!, {q11}
696116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q8, q8, q4
697116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q9, q9, q5
698116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vtbl.8	d8, {q8}, d24
699116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vtbl.8	d9, {q8}, d25
700116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q10, q10, q6
701116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vtbl.8	d10, {q9}, d24
702116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vtbl.8	d11, {q9}, d25
703116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q11, q11, q7
704116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vtbl.8	d12, {q10}, d24
705116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vtbl.8	d13, {q10}, d25
706116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vtbl.8	d14, {q11}, d24
707116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vtbl.8	d15, {q11}, d25
708116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.Lenc_sbox:
709116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q2, q2, q1
710116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q5, q5, q6
711116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q3, q3, q0
712116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q6, q6, q2
713116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q5, q5, q0
714116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
715116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q6, q6, q3
716116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q3, q3, q7
717116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q7, q7, q5
718116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q3, q3, q4
719116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q4, q4, q5
720116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
721116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q2, q2, q7
722116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q3, q3, q1
723116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q1, q1, q5
724116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q11, q7, q4
725116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q10, q1, q2
726116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q9, q5, q3
727116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q13, q2, q4
728116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vmov	q8, q10
729116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q12, q6, q0
730116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
731116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vorr	q10, q10, q9
732116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q15, q11, q8
733116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand	q14, q11, q12
734116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vorr	q11, q11, q12
735116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q12, q12, q9
736116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand	q8, q8, q9
737116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q9, q3, q0
738116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand	q15, q15, q12
739116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand	q13, q13, q9
740116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q9, q7, q1
741116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q12, q5, q6
742116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q11, q11, q13
743116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q10, q10, q13
744116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand	q13, q9, q12
745116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vorr	q9, q9, q12
746116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q11, q11, q15
747116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q8, q8, q13
748116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q10, q10, q14
749116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q9, q9, q15
750116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q8, q8, q14
751116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand	q12, q2, q3
752116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q9, q9, q14
753116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand	q13, q4, q0
754116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand	q14, q1, q5
755116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vorr	q15, q7, q6
756116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q11, q11, q12
757116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q9, q9, q14
758116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q8, q8, q15
759116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q10, q10, q13
760116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
761116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	@ Inv_GF16 	0, 	1, 	2, 	3, s0, s1, s2, s3
762116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
763116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	@ new smaller inversion
764116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
765116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand	q14, q11, q9
766116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vmov	q12, q8
767116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
768116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q13, q10, q14
769116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q15, q8, q14
770116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q14, q8, q14	@ q14=q15
771116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
772116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vbsl	q13, q9, q8
773116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vbsl	q15, q11, q10
774116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q11, q11, q10
775116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
776116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vbsl	q12, q13, q14
777116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vbsl	q8, q14, q13
778116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
779116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand	q14, q12, q15
780116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q9, q9, q8
781116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
782116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q14, q14, q11
783116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q12, q6, q0
784116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q8, q5, q3
785116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor 	q10, q15, q14
786116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand	q10, q10, q6
787116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q6, q6, q5
788116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand	q11, q5, q15
789116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand	q6, q6, q14
790116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q5, q11, q10
791116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q6, q6, q11
792116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q15, q15, q13
793116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q14, q14, q9
794116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q11, q15, q14
795116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor 	q10, q13, q9
796116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand	q11, q11, q12
797116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vand	q10, q10, q0
798116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q12, q12, q8
799116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor	q0, q0, q3
800116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand	q8, q8, q15
801116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vand	q3, q3, q13
802116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand	q12, q12, q14
803116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vand	q0, q0, q9
804116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q8, q8, q12
805116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor	q0, q0, q3
806116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q12, q12, q11
807116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor	q3, q3, q10
808116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q6, q6, q12
809116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q0, q0, q12
810116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q5, q5, q8
811116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q3, q3, q8
812116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
813116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q12, q7, q4
814116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q8, q1, q2
815116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q11, q15, q14
816116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor 	q10, q13, q9
817116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand	q11, q11, q12
818116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vand	q10, q10, q4
819116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q12, q12, q8
820116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor	q4, q4, q2
821116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand	q8, q8, q15
822116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vand	q2, q2, q13
823116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand	q12, q12, q14
824116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vand	q4, q4, q9
825116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q8, q8, q12
826116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor	q4, q4, q2
827116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q12, q12, q11
828116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor	q2, q2, q10
829116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q15, q15, q13
830116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q14, q14, q9
831116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor 	q10, q15, q14
832116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand	q10, q10, q7
833116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q7, q7, q1
834116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand	q11, q1, q15
835116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand	q7, q7, q14
836116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q1, q11, q10
837116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q7, q7, q11
838116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q7, q7, q12
839116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q4, q4, q12
840116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q1, q1, q8
841116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q2, q2, q8
842116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q7, q7, q0
843116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q1, q1, q6
844116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q6, q6, q0
845116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q4, q4, q7
846116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q0, q0, q1
847116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
848116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q1, q1, q5
849116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q5, q5, q2
850116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q2, q2, q3
851116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q3, q3, q5
852116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q4, q4, q5
853116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
854116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q6, q6, q3
855116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	subs	r5,r5,#1
856116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bcc	.Lenc_done
857116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vext.8	q8, q0, q0, #12	@ x0 <<< 32
858116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vext.8	q9, q1, q1, #12
859116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor	q0, q0, q8		@ x0 ^ (x0 <<< 32)
860116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vext.8	q10, q4, q4, #12
861116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor	q1, q1, q9
862116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vext.8	q11, q6, q6, #12
863116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor	q4, q4, q10
864116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vext.8	q12, q3, q3, #12
865116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor	q6, q6, q11
866116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vext.8	q13, q7, q7, #12
867116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor	q3, q3, q12
868116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vext.8	q14, q2, q2, #12
869116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor	q7, q7, q13
870116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vext.8	q15, q5, q5, #12
871116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor	q2, q2, q14
872116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
873116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q9, q9, q0
874116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor	q5, q5, q15
875116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vext.8	q0, q0, q0, #8		@ (x0 ^ (x0 <<< 32)) <<< 64)
876116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q10, q10, q1
877116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q8, q8, q5
878116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q9, q9, q5
879116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vext.8	q1, q1, q1, #8
880116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q13, q13, q3
881116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor	q0, q0, q8
882116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q14, q14, q7
883116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor	q1, q1, q9
884116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vext.8	q8, q3, q3, #8
885116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q12, q12, q6
886116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vext.8	q9, q7, q7, #8
887116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q15, q15, q2
888116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vext.8	q3, q6, q6, #8
889116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q11, q11, q4
890116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vext.8	q7, q5, q5, #8
891116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q12, q12, q5
892116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vext.8	q6, q2, q2, #8
893116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q11, q11, q5
894116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vext.8	q2, q4, q4, #8
895116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q5, q9, q13
896116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q4, q8, q12
897116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q3, q3, q11
898116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q7, q7, q15
899116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q6, q6, q14
900116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 @ vmov	q4, q8
901116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q2, q2, q10
902116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 @ vmov	q5, q9
903116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vldmia	r6, {q12}		@ .LSR
904116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	ite	eq				@ Thumb2 thing, samity check in ARM
905116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	addeq	r6,r6,#0x10
906116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bne	.Lenc_loop
907116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vldmia	r6, {q12}		@ .LSRM0
908116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	b	.Lenc_loop
909116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.align	4
910116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.Lenc_done:
911116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vmov.i8	q8,#0x55			@ compose .LBS0
912116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vmov.i8	q9,#0x33			@ compose .LBS1
913116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshr.u64	q10, q2, #1
914116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vshr.u64	q11, q3, #1
915116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q10, q10, q5
916116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q11, q11, q7
917116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand		q10, q10, q8
918116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vand		q11, q11, q8
919116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q5, q5, q10
920116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshl.u64	q10, q10, #1
921116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q7, q7, q11
922116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vshl.u64	q11, q11, #1
923116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q2, q2, q10
924116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q3, q3, q11
925116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshr.u64	q10, q4, #1
926116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vshr.u64	q11, q0, #1
927116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q10, q10, q6
928116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q11, q11, q1
929116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand		q10, q10, q8
930116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vand		q11, q11, q8
931116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q6, q6, q10
932116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshl.u64	q10, q10, #1
933116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q1, q1, q11
934116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vshl.u64	q11, q11, #1
935116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q4, q4, q10
936116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q0, q0, q11
937116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vmov.i8	q8,#0x0f			@ compose .LBS2
938116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshr.u64	q10, q7, #2
939116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vshr.u64	q11, q3, #2
940116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q10, q10, q5
941116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q11, q11, q2
942116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand		q10, q10, q9
943116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vand		q11, q11, q9
944116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q5, q5, q10
945116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshl.u64	q10, q10, #2
946116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q2, q2, q11
947116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vshl.u64	q11, q11, #2
948116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q7, q7, q10
949116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q3, q3, q11
950116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshr.u64	q10, q1, #2
951116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vshr.u64	q11, q0, #2
952116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q10, q10, q6
953116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q11, q11, q4
954116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand		q10, q10, q9
955116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vand		q11, q11, q9
956116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q6, q6, q10
957116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshl.u64	q10, q10, #2
958116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q4, q4, q11
959116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vshl.u64	q11, q11, #2
960116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q1, q1, q10
961116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q0, q0, q11
962116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshr.u64	q10, q6, #4
963116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vshr.u64	q11, q4, #4
964116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q10, q10, q5
965116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q11, q11, q2
966116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand		q10, q10, q8
967116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vand		q11, q11, q8
968116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q5, q5, q10
969116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshl.u64	q10, q10, #4
970116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q2, q2, q11
971116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vshl.u64	q11, q11, #4
972116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q6, q6, q10
973116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q4, q4, q11
974116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshr.u64	q10, q1, #4
975116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vshr.u64	q11, q0, #4
976116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q10, q10, q7
977116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q11, q11, q3
978116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand		q10, q10, q8
979116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vand		q11, q11, q8
980116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q7, q7, q10
981116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshl.u64	q10, q10, #4
982116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q3, q3, q11
983116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 vshl.u64	q11, q11, #4
984116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q1, q1, q10
985116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	 veor		q0, q0, q11
986116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vldmia	r4, {q8}			@ last round key
987116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q4, q4, q8
988116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q6, q6, q8
989116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q3, q3, q8
990116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q7, q7, q8
991116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q2, q2, q8
992116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q5, q5, q8
993116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q0, q0, q8
994116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q1, q1, q8
995116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bx	lr
996116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.size	_bsaes_encrypt8,.-_bsaes_encrypt8
997116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.type	_bsaes_key_convert,%function
998116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.align	4
999116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch_bsaes_key_convert:
1000116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	adr	r6,_bsaes_key_convert
1001116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8	{q7},  [r4]!		@ load round 0 key
1002116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	sub	r6,r6,#_bsaes_key_convert-.LM0
1003116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8	{q15}, [r4]!		@ load round 1 key
1004116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1005116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vmov.i8	q8,  #0x01			@ bit masks
1006116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vmov.i8	q9,  #0x02
1007116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vmov.i8	q10, #0x04
1008116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vmov.i8	q11, #0x08
1009116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vmov.i8	q12, #0x10
1010116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vmov.i8	q13, #0x20
1011116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vldmia	r6, {q14}		@ .LM0
1012116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1013116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#ifdef __ARMEL__
1014116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vrev32.8	q7,  q7
1015116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vrev32.8	q15, q15
1016116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
1017116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	sub	r5,r5,#1
1018116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vstmia	r12!, {q7}		@ save round 0 key
1019116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	b	.Lkey_loop
1020116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1021116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.align	4
1022116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.Lkey_loop:
1023116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vtbl.8	d14,{q15},d28
1024116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vtbl.8	d15,{q15},d29
1025116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vmov.i8	q6,  #0x40
1026116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vmov.i8	q15, #0x80
1027116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1028116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vtst.8	q0, q7, q8
1029116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vtst.8	q1, q7, q9
1030116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vtst.8	q2, q7, q10
1031116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vtst.8	q3, q7, q11
1032116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vtst.8	q4, q7, q12
1033116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vtst.8	q5, q7, q13
1034116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vtst.8	q6, q7, q6
1035116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vtst.8	q7, q7, q15
1036116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8	{q15}, [r4]!		@ load next round key
1037116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vmvn	q0, q0		@ "pnot"
1038116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vmvn	q1, q1
1039116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vmvn	q5, q5
1040116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vmvn	q6, q6
1041116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#ifdef __ARMEL__
1042116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vrev32.8	q15, q15
1043116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
1044116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	subs	r5,r5,#1
1045116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vstmia	r12!,{q0-q7}		@ write bit-sliced round key
1046116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bne	.Lkey_loop
1047116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1048116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vmov.i8	q7,#0x63			@ compose .L63
1049116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	@ don't save last round key
1050116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bx	lr
1051116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.size	_bsaes_key_convert,.-_bsaes_key_convert
1052116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.extern AES_cbc_encrypt
1053116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.extern AES_decrypt
1054116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1055116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.global	bsaes_cbc_encrypt
10565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles).hidden	bsaes_cbc_encrypt
1057116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.type	bsaes_cbc_encrypt,%function
1058116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.align	5
1059116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbsaes_cbc_encrypt:
1060116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#ifndef	__KERNEL__
1061116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	cmp	r2, #128
1062116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#ifndef	__thumb__
1063116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	blo	AES_cbc_encrypt
1064116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#else
1065116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bhs	1f
1066116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	b	AES_cbc_encrypt
1067116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch1:
1068116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
1069116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
1070116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1071116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	@ it is up to the caller to make sure we are called with enc == 0
1072116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1073116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov	ip, sp
1074116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	stmdb	sp!, {r4-r10, lr}
1075116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	VFP_ABI_PUSH
1076116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	ldr	r8, [ip]			@ IV is 1st arg on the stack
1077116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov	r2, r2, lsr#4		@ len in 16 byte blocks
1078116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	sub	sp, #0x10			@ scratch space to carry over the IV
1079116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov	r9, sp				@ save sp
1080116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1081116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	ldr	r10, [r3, #240]		@ get # of rounds
1082116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#ifndef	BSAES_ASM_EXTENDED_KEY
1083116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	@ allocate the key schedule on the stack
1084116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	sub	r12, sp, r10, lsl#7		@ 128 bytes per inner round key
1085116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	add	r12, #96			@ sifze of bit-slices key schedule
1086116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1087116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	@ populate the key schedule
1088116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov	r4, r3			@ pass key
1089116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov	r5, r10			@ pass # of rounds
1090116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov	sp, r12				@ sp is sp
1091116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bl	_bsaes_key_convert
1092116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vldmia	sp, {q6}
1093116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vstmia	r12,  {q15}		@ save last round key
1094116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q7, q7, q6	@ fix up round 0 key
1095116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vstmia	sp, {q7}
1096116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#else
1097116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	ldr	r12, [r3, #244]
1098116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	eors	r12, #1
1099116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	beq	0f
1100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	@ populate the key schedule
1102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	str	r12, [r3, #244]
1103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov	r4, r3			@ pass key
1104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov	r5, r10			@ pass # of rounds
1105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	add	r12, r3, #248			@ pass key schedule
1106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bl	_bsaes_key_convert
1107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	add	r4, r3, #248
1108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vldmia	r4, {q6}
1109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vstmia	r12, {q15}			@ save last round key
1110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q7, q7, q6	@ fix up round 0 key
1111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vstmia	r4, {q7}
1112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.align	2
1114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch0:
1115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
1116116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8	{q15}, [r8]		@ load IV
1118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	b	.Lcbc_dec_loop
1119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.align	4
1121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.Lcbc_dec_loop:
1122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	subs	r2, r2, #0x8
1123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bmi	.Lcbc_dec_loop_finish
1124116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1125116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8	{q0-q1}, [r0]!	@ load input
1126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8	{q2-q3}, [r0]!
1127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#ifndef	BSAES_ASM_EXTENDED_KEY
1128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov	r4, sp			@ pass the key
1129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#else
1130116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	add	r4, r3, #248
1131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
1132116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8	{q4-q5}, [r0]!
1133116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov	r5, r10
1134116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8	{q6-q7}, [r0]
1135116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	sub	r0, r0, #0x60
1136116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vstmia	r9, {q15}			@ put aside IV
1137116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1138116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bl	_bsaes_decrypt8
1139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1140116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vldmia	r9, {q14}			@ reload IV
1141116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8	{q8-q9}, [r0]!	@ reload input
1142116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q0, q0, q14	@ ^= IV
1143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8	{q10-q11}, [r0]!
1144116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q1, q1, q8
1145116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q6, q6, q9
1146116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8	{q12-q13}, [r0]!
1147116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q4, q4, q10
1148116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q2, q2, q11
1149116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8	{q14-q15}, [r0]!
1150116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q7, q7, q12
1151116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8	{q0-q1}, [r1]!	@ write output
1152116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q3, q3, q13
1153116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8	{q6}, [r1]!
1154116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q5, q5, q14
1155116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8	{q4}, [r1]!
1156116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8	{q2}, [r1]!
1157116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8	{q7}, [r1]!
1158116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8	{q3}, [r1]!
1159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8	{q5}, [r1]!
1160116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1161116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	b	.Lcbc_dec_loop
1162116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1163116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.Lcbc_dec_loop_finish:
1164116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	adds	r2, r2, #8
1165116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	beq	.Lcbc_dec_done
1166116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1167116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8	{q0}, [r0]!		@ load input
1168116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	cmp	r2, #2
1169116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	blo	.Lcbc_dec_one
1170116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8	{q1}, [r0]!
1171116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#ifndef	BSAES_ASM_EXTENDED_KEY
1172116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov	r4, sp			@ pass the key
1173116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#else
1174116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	add	r4, r3, #248
1175116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
1176116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov	r5, r10
1177116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vstmia	r9, {q15}			@ put aside IV
1178116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	beq	.Lcbc_dec_two
1179116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8	{q2}, [r0]!
1180116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	cmp	r2, #4
1181116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	blo	.Lcbc_dec_three
1182116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8	{q3}, [r0]!
1183116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	beq	.Lcbc_dec_four
1184116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8	{q4}, [r0]!
1185116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	cmp	r2, #6
1186116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	blo	.Lcbc_dec_five
1187116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8	{q5}, [r0]!
1188116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	beq	.Lcbc_dec_six
1189116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8	{q6}, [r0]!
1190116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	sub	r0, r0, #0x70
1191116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1192116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bl	_bsaes_decrypt8
1193116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1194116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vldmia	r9, {q14}			@ reload IV
1195116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8	{q8-q9}, [r0]!	@ reload input
1196116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q0, q0, q14	@ ^= IV
1197116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8	{q10-q11}, [r0]!
1198116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q1, q1, q8
1199116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q6, q6, q9
1200116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8	{q12-q13}, [r0]!
1201116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q4, q4, q10
1202116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q2, q2, q11
1203116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8	{q15}, [r0]!
1204116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q7, q7, q12
1205116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8	{q0-q1}, [r1]!	@ write output
1206116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q3, q3, q13
1207116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8	{q6}, [r1]!
1208116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8	{q4}, [r1]!
1209116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8	{q2}, [r1]!
1210116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8	{q7}, [r1]!
1211116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8	{q3}, [r1]!
1212116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	b	.Lcbc_dec_done
1213116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.align	4
1214116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.Lcbc_dec_six:
1215116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	sub	r0, r0, #0x60
1216116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bl	_bsaes_decrypt8
1217116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vldmia	r9,{q14}			@ reload IV
1218116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8	{q8-q9}, [r0]!	@ reload input
1219116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q0, q0, q14	@ ^= IV
1220116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8	{q10-q11}, [r0]!
1221116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q1, q1, q8
1222116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q6, q6, q9
1223116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8	{q12}, [r0]!
1224116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q4, q4, q10
1225116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q2, q2, q11
1226116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8	{q15}, [r0]!
1227116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q7, q7, q12
1228116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8	{q0-q1}, [r1]!	@ write output
1229116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8	{q6}, [r1]!
1230116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8	{q4}, [r1]!
1231116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8	{q2}, [r1]!
1232116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8	{q7}, [r1]!
1233116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	b	.Lcbc_dec_done
1234116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.align	4
1235116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.Lcbc_dec_five:
1236116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	sub	r0, r0, #0x50
1237116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bl	_bsaes_decrypt8
1238116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vldmia	r9, {q14}			@ reload IV
1239116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8	{q8-q9}, [r0]!	@ reload input
1240116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q0, q0, q14	@ ^= IV
1241116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8	{q10-q11}, [r0]!
1242116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q1, q1, q8
1243116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q6, q6, q9
1244116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8	{q15}, [r0]!
1245116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q4, q4, q10
1246116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8	{q0-q1}, [r1]!	@ write output
1247116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q2, q2, q11
1248116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8	{q6}, [r1]!
1249116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8	{q4}, [r1]!
1250116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8	{q2}, [r1]!
1251116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	b	.Lcbc_dec_done
1252116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.align	4
1253116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.Lcbc_dec_four:
1254116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	sub	r0, r0, #0x40
1255116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bl	_bsaes_decrypt8
1256116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vldmia	r9, {q14}			@ reload IV
1257116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8	{q8-q9}, [r0]!	@ reload input
1258116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q0, q0, q14	@ ^= IV
1259116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8	{q10}, [r0]!
1260116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q1, q1, q8
1261116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q6, q6, q9
1262116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8	{q15}, [r0]!
1263116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q4, q4, q10
1264116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8	{q0-q1}, [r1]!	@ write output
1265116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8	{q6}, [r1]!
1266116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8	{q4}, [r1]!
1267116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	b	.Lcbc_dec_done
1268116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.align	4
1269116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.Lcbc_dec_three:
1270116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	sub	r0, r0, #0x30
1271116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bl	_bsaes_decrypt8
1272116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vldmia	r9, {q14}			@ reload IV
1273116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8	{q8-q9}, [r0]!	@ reload input
1274116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q0, q0, q14	@ ^= IV
1275116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8	{q15}, [r0]!
1276116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q1, q1, q8
1277116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q6, q6, q9
1278116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8	{q0-q1}, [r1]!	@ write output
1279116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8	{q6}, [r1]!
1280116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	b	.Lcbc_dec_done
1281116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.align	4
1282116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.Lcbc_dec_two:
1283116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	sub	r0, r0, #0x20
1284116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bl	_bsaes_decrypt8
1285116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vldmia	r9, {q14}			@ reload IV
1286116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8	{q8}, [r0]!		@ reload input
1287116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q0, q0, q14	@ ^= IV
1288116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8	{q15}, [r0]!		@ reload input
1289116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q1, q1, q8
1290116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8	{q0-q1}, [r1]!	@ write output
1291116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	b	.Lcbc_dec_done
1292116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.align	4
1293116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.Lcbc_dec_one:
1294116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	sub	r0, r0, #0x10
1295116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov	r10, r1			@ save original out pointer
1296116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov	r1, r9			@ use the iv scratch space as out buffer
1297116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov	r2, r3
1298116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vmov	q4,q15		@ just in case ensure that IV
1299116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vmov	q5,q0			@ and input are preserved
1300116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bl	AES_decrypt
1301116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8	{q0}, [r9,:64]		@ load result
1302116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q0, q0, q4	@ ^= IV
1303116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vmov	q15, q5		@ q5 holds input
1304116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8	{q0}, [r10]		@ write output
1305116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1306116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.Lcbc_dec_done:
1307116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#ifndef	BSAES_ASM_EXTENDED_KEY
1308116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vmov.i32	q0, #0
1309116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vmov.i32	q1, #0
1310116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.Lcbc_dec_bzero:				@ wipe key schedule [if any]
1311116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vstmia		sp!, {q0-q1}
1312116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	cmp		sp, r9
1313116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bne		.Lcbc_dec_bzero
1314116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
1315116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1316116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov	sp, r9
1317116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	add	sp, #0x10			@ add sp,r9,#0x10 is no good for thumb
1318116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8	{q15}, [r8]		@ return IV
1319116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	VFP_ABI_POP
1320116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	ldmia	sp!, {r4-r10, pc}
1321116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.size	bsaes_cbc_encrypt,.-bsaes_cbc_encrypt
1322116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.extern	AES_encrypt
1323116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.global	bsaes_ctr32_encrypt_blocks
13245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles).hidden	bsaes_ctr32_encrypt_blocks
1325116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.type	bsaes_ctr32_encrypt_blocks,%function
1326116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.align	5
1327116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbsaes_ctr32_encrypt_blocks:
1328116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	cmp	r2, #8			@ use plain AES for
1329116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	blo	.Lctr_enc_short			@ small sizes
1330116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1331116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov	ip, sp
1332116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	stmdb	sp!, {r4-r10, lr}
1333116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	VFP_ABI_PUSH
1334116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	ldr	r8, [ip]			@ ctr is 1st arg on the stack
1335116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	sub	sp, sp, #0x10			@ scratch space to carry over the ctr
1336116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov	r9, sp				@ save sp
1337116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1338116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	ldr	r10, [r3, #240]		@ get # of rounds
1339116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#ifndef	BSAES_ASM_EXTENDED_KEY
1340116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	@ allocate the key schedule on the stack
1341116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	sub	r12, sp, r10, lsl#7		@ 128 bytes per inner round key
1342116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	add	r12, #96			@ size of bit-sliced key schedule
1343116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1344116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	@ populate the key schedule
1345116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov	r4, r3			@ pass key
1346116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov	r5, r10			@ pass # of rounds
1347116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov	sp, r12				@ sp is sp
1348116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bl	_bsaes_key_convert
1349116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q7,q7,q15	@ fix up last round key
1350116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vstmia	r12, {q7}			@ save last round key
1351116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1352116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8	{q0}, [r8]		@ load counter
1353116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	add	r8, r6, #.LREVM0SR-.LM0	@ borrow r8
1354116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vldmia	sp, {q4}		@ load round0 key
1355116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#else
1356116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	ldr	r12, [r3, #244]
1357116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	eors	r12, #1
1358116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	beq	0f
1359116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1360116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	@ populate the key schedule
1361116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	str	r12, [r3, #244]
1362116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov	r4, r3			@ pass key
1363116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov	r5, r10			@ pass # of rounds
1364116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	add	r12, r3, #248			@ pass key schedule
1365116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bl	_bsaes_key_convert
1366116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q7,q7,q15	@ fix up last round key
1367116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vstmia	r12, {q7}			@ save last round key
1368116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1369116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.align	2
1370116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch0:	add	r12, r3, #248
1371116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8	{q0}, [r8]		@ load counter
1372116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	adrl	r8, .LREVM0SR			@ borrow r8
1373116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vldmia	r12, {q4}			@ load round0 key
1374116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	sub	sp, #0x10			@ place for adjusted round0 key
1375116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
1376116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1377116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vmov.i32	q8,#1		@ compose 1<<96
1378116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q9,q9,q9
1379116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vrev32.8	q0,q0
1380116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vext.8		q8,q9,q8,#4
1381116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vrev32.8	q4,q4
1382116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vadd.u32	q9,q8,q8	@ compose 2<<96
1383116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vstmia	sp, {q4}		@ save adjusted round0 key
1384116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	b	.Lctr_enc_loop
1385116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1386116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.align	4
1387116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.Lctr_enc_loop:
1388116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vadd.u32	q10, q8, q9	@ compose 3<<96
1389116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vadd.u32	q1, q0, q8	@ +1
1390116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vadd.u32	q2, q0, q9	@ +2
1391116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vadd.u32	q3, q0, q10	@ +3
1392116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vadd.u32	q4, q1, q10
1393116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vadd.u32	q5, q2, q10
1394116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vadd.u32	q6, q3, q10
1395116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vadd.u32	q7, q4, q10
1396116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vadd.u32	q10, q5, q10	@ next counter
1397116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1398116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	@ Borrow prologue from _bsaes_encrypt8 to use the opportunity
1399116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	@ to flip byte order in 32-bit counter
1400116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1401116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vldmia		sp, {q9}		@ load round0 key
1402116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#ifndef	BSAES_ASM_EXTENDED_KEY
1403116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	add		r4, sp, #0x10		@ pass next round key
1404116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#else
1405116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	add		r4, r3, #264
1406116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
1407116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vldmia		r8, {q8}			@ .LREVM0SR
1408116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov		r5, r10			@ pass rounds
1409116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vstmia		r9, {q10}			@ save next counter
1410116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	sub		r6, r8, #.LREVM0SR-.LSR	@ pass constants
1411116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1412116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bl		_bsaes_encrypt8_alt
1413116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1414116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	subs		r2, r2, #8
1415116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	blo		.Lctr_enc_loop_done
1416116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1417116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8		{q8-q9}, [r0]!	@ load input
1418116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8		{q10-q11}, [r0]!
1419116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q0, q8
1420116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q1, q9
1421116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8		{q12-q13}, [r0]!
1422116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q4, q10
1423116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q6, q11
1424116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8		{q14-q15}, [r0]!
1425116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q3, q12
1426116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8		{q0-q1}, [r1]!	@ write output
1427116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q7, q13
1428116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q2, q14
1429116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8		{q4}, [r1]!
1430116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q5, q15
1431116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8		{q6}, [r1]!
1432116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vmov.i32	q8, #1			@ compose 1<<96
1433116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8		{q3}, [r1]!
1434116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q9, q9, q9
1435116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8		{q7}, [r1]!
1436116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vext.8		q8, q9, q8, #4
1437116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8		{q2}, [r1]!
1438116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vadd.u32	q9,q8,q8		@ compose 2<<96
1439116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8		{q5}, [r1]!
1440116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vldmia		r9, {q0}			@ load counter
1441116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1442116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bne		.Lctr_enc_loop
1443116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	b		.Lctr_enc_done
1444116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1445116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.align	4
1446116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.Lctr_enc_loop_done:
1447116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	add		r2, r2, #8
1448116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8		{q8}, [r0]!	@ load input
1449116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q0, q8
1450116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8		{q0}, [r1]!	@ write output
1451116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	cmp		r2, #2
1452116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	blo		.Lctr_enc_done
1453116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8		{q9}, [r0]!
1454116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q1, q9
1455116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8		{q1}, [r1]!
1456116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	beq		.Lctr_enc_done
1457116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8		{q10}, [r0]!
1458116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q4, q10
1459116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8		{q4}, [r1]!
1460116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	cmp		r2, #4
1461116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	blo		.Lctr_enc_done
1462116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8		{q11}, [r0]!
1463116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q6, q11
1464116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8		{q6}, [r1]!
1465116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	beq		.Lctr_enc_done
1466116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8		{q12}, [r0]!
1467116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q3, q12
1468116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8		{q3}, [r1]!
1469116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	cmp		r2, #6
1470116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	blo		.Lctr_enc_done
1471116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8		{q13}, [r0]!
1472116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q7, q13
1473116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8		{q7}, [r1]!
1474116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	beq		.Lctr_enc_done
1475116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8		{q14}, [r0]
1476116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q2, q14
1477116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8		{q2}, [r1]!
1478116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1479116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.Lctr_enc_done:
1480116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vmov.i32	q0, #0
1481116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vmov.i32	q1, #0
1482116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#ifndef	BSAES_ASM_EXTENDED_KEY
1483116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.Lctr_enc_bzero:			@ wipe key schedule [if any]
1484116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vstmia		sp!, {q0-q1}
1485116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	cmp		sp, r9
1486116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bne		.Lctr_enc_bzero
1487116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#else
1488116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vstmia		sp, {q0-q1}
1489116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
1490116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1491116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov	sp, r9
1492116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	add	sp, #0x10		@ add sp,r9,#0x10 is no good for thumb
1493116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	VFP_ABI_POP
1494116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	ldmia	sp!, {r4-r10, pc}	@ return
1495116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1496116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.align	4
1497116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.Lctr_enc_short:
1498116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	ldr	ip, [sp]		@ ctr pointer is passed on stack
1499116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	stmdb	sp!, {r4-r8, lr}
1500116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1501116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov	r4, r0		@ copy arguments
1502116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov	r5, r1
1503116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov	r6, r2
1504116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov	r7, r3
1505116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	ldr	r8, [ip, #12]		@ load counter LSW
1506116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8	{q1}, [ip]		@ load whole counter value
1507116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#ifdef __ARMEL__
1508116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	rev	r8, r8
1509116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
1510116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	sub	sp, sp, #0x10
1511116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8	{q1}, [sp,:64]	@ copy counter value
1512116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	sub	sp, sp, #0x10
1513116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1514116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.Lctr_enc_short_loop:
1515116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	add	r0, sp, #0x10		@ input counter value
1516116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov	r1, sp			@ output on the stack
1517116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov	r2, r7			@ key
1518116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1519116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bl	AES_encrypt
1520116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1521116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8	{q0}, [r4]!	@ load input
1522116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8	{q1}, [sp,:64]	@ load encrypted counter
1523116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	add	r8, r8, #1
1524116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#ifdef __ARMEL__
1525116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	rev	r0, r8
1526116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	str	r0, [sp, #0x1c]		@ next counter value
1527116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#else
1528116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	str	r8, [sp, #0x1c]		@ next counter value
1529116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
1530116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q0,q0,q1
1531116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8	{q0}, [r5]!	@ store output
1532116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	subs	r6, r6, #1
1533116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bne	.Lctr_enc_short_loop
1534116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1535116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vmov.i32	q0, #0
1536116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vmov.i32	q1, #0
1537116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vstmia		sp!, {q0-q1}
1538116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1539116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	ldmia	sp!, {r4-r8, pc}
1540116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.size	bsaes_ctr32_encrypt_blocks,.-bsaes_ctr32_encrypt_blocks
1541116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.globl	bsaes_xts_encrypt
15425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles).hidden	bsaes_xts_encrypt
1543116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.type	bsaes_xts_encrypt,%function
1544116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.align	4
1545116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbsaes_xts_encrypt:
1546116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov	ip, sp
1547116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	stmdb	sp!, {r4-r10, lr}		@ 0x20
1548116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	VFP_ABI_PUSH
1549116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov	r6, sp				@ future r3
1550116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1551116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov	r7, r0
1552116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov	r8, r1
1553116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov	r9, r2
1554116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov	r10, r3
1555116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1556116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	sub	r0, sp, #0x10			@ 0x10
1557116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bic	r0, #0xf			@ align at 16 bytes
1558116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov	sp, r0
1559116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1560116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#ifdef	XTS_CHAIN_TWEAK
1561116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	ldr	r0, [ip]			@ pointer to input tweak
1562116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#else
1563116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	@ generate initial tweak
1564116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	ldr	r0, [ip, #4]			@ iv[]
1565116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov	r1, sp
1566116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	ldr	r2, [ip, #0]			@ key2
1567116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bl	AES_encrypt
1568116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov	r0,sp				@ pointer to initial tweak
1569116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
1570116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1571116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	ldr	r1, [r10, #240]		@ get # of rounds
1572116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov	r3, r6
1573116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#ifndef	BSAES_ASM_EXTENDED_KEY
1574116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	@ allocate the key schedule on the stack
1575116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	sub	r12, sp, r1, lsl#7		@ 128 bytes per inner round key
1576116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	@ add	r12, #96			@ size of bit-sliced key schedule
1577116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	sub	r12, #48			@ place for tweak[9]
1578116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1579116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	@ populate the key schedule
1580116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov	r4, r10			@ pass key
1581116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov	r5, r1			@ pass # of rounds
1582116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov	sp, r12
1583116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	add	r12, #0x90			@ pass key schedule
1584116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bl	_bsaes_key_convert
1585116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q7, q7, q15	@ fix up last round key
1586116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vstmia	r12, {q7}			@ save last round key
1587116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#else
1588116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	ldr	r12, [r10, #244]
1589116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	eors	r12, #1
1590116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	beq	0f
1591116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1592116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	str	r12, [r10, #244]
1593116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov	r4, r10			@ pass key
1594116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov	r5, r1			@ pass # of rounds
1595116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	add	r12, r10, #248			@ pass key schedule
1596116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bl	_bsaes_key_convert
1597116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q7, q7, q15	@ fix up last round key
1598116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vstmia	r12, {q7}
1599116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1600116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.align	2
1601116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch0:	sub	sp, #0x90			@ place for tweak[9]
1602116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
1603116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1604116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8	{q8}, [r0]			@ initial tweak
1605116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	adr	r2, .Lxts_magic
1606116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1607116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	subs	r9, #0x80
1608116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	blo	.Lxts_enc_short
1609116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	b	.Lxts_enc_loop
1610116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1611116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.align	4
1612116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.Lxts_enc_loop:
1613116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vldmia		r2, {q5}	@ load XTS magic
1614116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshr.s64	q6, q8, #63
1615116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov		r0, sp
1616116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand		q6, q6, q5
1617116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vadd.u64	q9, q8, q8
1618116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.64		{q8}, [r0,:128]!
1619116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vswp		d13,d12
1620116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshr.s64	q7, q9, #63
1621116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q9, q9, q6
1622116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand		q7, q7, q5
1623116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vadd.u64	q10, q9, q9
1624116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.64		{q9}, [r0,:128]!
1625116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vswp		d15,d14
1626116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshr.s64	q6, q10, #63
1627116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q10, q10, q7
1628116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand		q6, q6, q5
1629116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8		{q0}, [r7]!
1630116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vadd.u64	q11, q10, q10
1631116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.64		{q10}, [r0,:128]!
1632116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vswp		d13,d12
1633116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshr.s64	q7, q11, #63
1634116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q11, q11, q6
1635116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand		q7, q7, q5
1636116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8		{q1}, [r7]!
1637116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q0, q0, q8
1638116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vadd.u64	q12, q11, q11
1639116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.64		{q11}, [r0,:128]!
1640116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vswp		d15,d14
1641116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshr.s64	q6, q12, #63
1642116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q12, q12, q7
1643116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand		q6, q6, q5
1644116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8		{q2}, [r7]!
1645116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q1, q1, q9
1646116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vadd.u64	q13, q12, q12
1647116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.64		{q12}, [r0,:128]!
1648116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vswp		d13,d12
1649116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshr.s64	q7, q13, #63
1650116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q13, q13, q6
1651116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand		q7, q7, q5
1652116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8		{q3}, [r7]!
1653116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q2, q2, q10
1654116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vadd.u64	q14, q13, q13
1655116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.64		{q13}, [r0,:128]!
1656116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vswp		d15,d14
1657116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshr.s64	q6, q14, #63
1658116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q14, q14, q7
1659116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand		q6, q6, q5
1660116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8		{q4}, [r7]!
1661116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q3, q3, q11
1662116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vadd.u64	q15, q14, q14
1663116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.64		{q14}, [r0,:128]!
1664116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vswp		d13,d12
1665116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshr.s64	q7, q15, #63
1666116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q15, q15, q6
1667116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand		q7, q7, q5
1668116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8		{q5}, [r7]!
1669116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q4, q4, q12
1670116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vadd.u64	q8, q15, q15
1671116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.64		{q15}, [r0,:128]!
1672116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vswp		d15,d14
1673116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q8, q8, q7
1674116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.64		{q8}, [r0,:128]		@ next round tweak
1675116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1676116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8		{q6-q7}, [r7]!
1677116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q5, q5, q13
1678116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#ifndef	BSAES_ASM_EXTENDED_KEY
1679116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	add		r4, sp, #0x90			@ pass key schedule
1680116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#else
1681116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	add		r4, r10, #248			@ pass key schedule
1682116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
1683116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q6, q6, q14
1684116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov		r5, r1			@ pass rounds
1685116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q7, q7, q15
1686116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov		r0, sp
1687116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1688116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bl		_bsaes_encrypt8
1689116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1690116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.64		{q8-q9}, [r0,:128]!
1691116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.64		{q10-q11}, [r0,:128]!
1692116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q0, q0, q8
1693116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.64		{q12-q13}, [r0,:128]!
1694116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q1, q1, q9
1695116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q8, q4, q10
1696116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8		{q0-q1}, [r8]!
1697116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q9, q6, q11
1698116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.64		{q14-q15}, [r0,:128]!
1699116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q10, q3, q12
1700116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8		{q8-q9}, [r8]!
1701116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q11, q7, q13
1702116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q12, q2, q14
1703116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8		{q10-q11}, [r8]!
1704116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q13, q5, q15
1705116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8		{q12-q13}, [r8]!
1706116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1707116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.64		{q8}, [r0,:128]		@ next round tweak
1708116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1709116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	subs		r9, #0x80
1710116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bpl		.Lxts_enc_loop
1711116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1712116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.Lxts_enc_short:
1713116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	adds		r9, #0x70
1714116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bmi		.Lxts_enc_done
1715116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1716116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vldmia		r2, {q5}	@ load XTS magic
1717116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshr.s64	q7, q8, #63
1718116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov		r0, sp
1719116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand		q7, q7, q5
1720116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vadd.u64	q9, q8, q8
1721116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.64		{q8}, [r0,:128]!
1722116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vswp		d15,d14
1723116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshr.s64	q6, q9, #63
1724116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q9, q9, q7
1725116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand		q6, q6, q5
1726116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vadd.u64	q10, q9, q9
1727116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.64		{q9}, [r0,:128]!
1728116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vswp		d13,d12
1729116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshr.s64	q7, q10, #63
1730116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q10, q10, q6
1731116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand		q7, q7, q5
1732116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8		{q0}, [r7]!
1733116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	subs		r9, #0x10
1734116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bmi		.Lxts_enc_1
1735116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vadd.u64	q11, q10, q10
1736116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.64		{q10}, [r0,:128]!
1737116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vswp		d15,d14
1738116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshr.s64	q6, q11, #63
1739116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q11, q11, q7
1740116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand		q6, q6, q5
1741116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8		{q1}, [r7]!
1742116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	subs		r9, #0x10
1743116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bmi		.Lxts_enc_2
1744116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q0, q0, q8
1745116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vadd.u64	q12, q11, q11
1746116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.64		{q11}, [r0,:128]!
1747116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vswp		d13,d12
1748116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshr.s64	q7, q12, #63
1749116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q12, q12, q6
1750116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand		q7, q7, q5
1751116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8		{q2}, [r7]!
1752116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	subs		r9, #0x10
1753116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bmi		.Lxts_enc_3
1754116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q1, q1, q9
1755116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vadd.u64	q13, q12, q12
1756116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.64		{q12}, [r0,:128]!
1757116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vswp		d15,d14
1758116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshr.s64	q6, q13, #63
1759116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q13, q13, q7
1760116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand		q6, q6, q5
1761116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8		{q3}, [r7]!
1762116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	subs		r9, #0x10
1763116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bmi		.Lxts_enc_4
1764116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q2, q2, q10
1765116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vadd.u64	q14, q13, q13
1766116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.64		{q13}, [r0,:128]!
1767116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vswp		d13,d12
1768116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshr.s64	q7, q14, #63
1769116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q14, q14, q6
1770116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand		q7, q7, q5
1771116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8		{q4}, [r7]!
1772116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	subs		r9, #0x10
1773116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bmi		.Lxts_enc_5
1774116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q3, q3, q11
1775116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vadd.u64	q15, q14, q14
1776116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.64		{q14}, [r0,:128]!
1777116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vswp		d15,d14
1778116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshr.s64	q6, q15, #63
1779116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q15, q15, q7
1780116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand		q6, q6, q5
1781116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8		{q5}, [r7]!
1782116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	subs		r9, #0x10
1783116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bmi		.Lxts_enc_6
1784116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q4, q4, q12
1785116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	sub		r9, #0x10
1786116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.64		{q15}, [r0,:128]		@ next round tweak
1787116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1788116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8		{q6}, [r7]!
1789116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q5, q5, q13
1790116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#ifndef	BSAES_ASM_EXTENDED_KEY
1791116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	add		r4, sp, #0x90			@ pass key schedule
1792116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#else
1793116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	add		r4, r10, #248			@ pass key schedule
1794116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
1795116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q6, q6, q14
1796116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov		r5, r1			@ pass rounds
1797116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov		r0, sp
1798116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1799116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bl		_bsaes_encrypt8
1800116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1801116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.64		{q8-q9}, [r0,:128]!
1802116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.64		{q10-q11}, [r0,:128]!
1803116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q0, q0, q8
1804116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.64		{q12-q13}, [r0,:128]!
1805116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q1, q1, q9
1806116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q8, q4, q10
1807116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8		{q0-q1}, [r8]!
1808116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q9, q6, q11
1809116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.64		{q14}, [r0,:128]!
1810116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q10, q3, q12
1811116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8		{q8-q9}, [r8]!
1812116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q11, q7, q13
1813116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q12, q2, q14
1814116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8		{q10-q11}, [r8]!
1815116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8		{q12}, [r8]!
1816116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1817116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.64		{q8}, [r0,:128]		@ next round tweak
1818116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	b		.Lxts_enc_done
1819116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.align	4
1820116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.Lxts_enc_6:
1821116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.64		{q14}, [r0,:128]		@ next round tweak
1822116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1823116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q4, q4, q12
1824116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#ifndef	BSAES_ASM_EXTENDED_KEY
1825116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	add		r4, sp, #0x90			@ pass key schedule
1826116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#else
1827116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	add		r4, r10, #248			@ pass key schedule
1828116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
1829116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q5, q5, q13
1830116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov		r5, r1			@ pass rounds
1831116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov		r0, sp
1832116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1833116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bl		_bsaes_encrypt8
1834116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1835116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.64		{q8-q9}, [r0,:128]!
1836116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.64		{q10-q11}, [r0,:128]!
1837116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q0, q0, q8
1838116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.64		{q12-q13}, [r0,:128]!
1839116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q1, q1, q9
1840116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q8, q4, q10
1841116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8		{q0-q1}, [r8]!
1842116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q9, q6, q11
1843116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q10, q3, q12
1844116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8		{q8-q9}, [r8]!
1845116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q11, q7, q13
1846116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8		{q10-q11}, [r8]!
1847116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1848116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.64		{q8}, [r0,:128]		@ next round tweak
1849116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	b		.Lxts_enc_done
1850116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1851116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch@ put this in range for both ARM and Thumb mode adr instructions
1852116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.align	5
1853116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.Lxts_magic:
1854116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	.quad	1, 0x87
1855116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1856116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.align	5
1857116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.Lxts_enc_5:
1858116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.64		{q13}, [r0,:128]		@ next round tweak
1859116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1860116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q3, q3, q11
1861116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#ifndef	BSAES_ASM_EXTENDED_KEY
1862116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	add		r4, sp, #0x90			@ pass key schedule
1863116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#else
1864116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	add		r4, r10, #248			@ pass key schedule
1865116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
1866116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q4, q4, q12
1867116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov		r5, r1			@ pass rounds
1868116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov		r0, sp
1869116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1870116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bl		_bsaes_encrypt8
1871116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1872116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.64		{q8-q9}, [r0,:128]!
1873116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.64		{q10-q11}, [r0,:128]!
1874116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q0, q0, q8
1875116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.64		{q12}, [r0,:128]!
1876116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q1, q1, q9
1877116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q8, q4, q10
1878116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8		{q0-q1}, [r8]!
1879116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q9, q6, q11
1880116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q10, q3, q12
1881116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8		{q8-q9}, [r8]!
1882116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8		{q10}, [r8]!
1883116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1884116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.64		{q8}, [r0,:128]		@ next round tweak
1885116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	b		.Lxts_enc_done
1886116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.align	4
1887116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.Lxts_enc_4:
1888116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.64		{q12}, [r0,:128]		@ next round tweak
1889116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1890116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q2, q2, q10
1891116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#ifndef	BSAES_ASM_EXTENDED_KEY
1892116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	add		r4, sp, #0x90			@ pass key schedule
1893116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#else
1894116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	add		r4, r10, #248			@ pass key schedule
1895116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
1896116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q3, q3, q11
1897116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov		r5, r1			@ pass rounds
1898116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov		r0, sp
1899116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1900116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bl		_bsaes_encrypt8
1901116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1902116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.64		{q8-q9}, [r0,:128]!
1903116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.64		{q10-q11}, [r0,:128]!
1904116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q0, q0, q8
1905116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q1, q1, q9
1906116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q8, q4, q10
1907116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8		{q0-q1}, [r8]!
1908116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q9, q6, q11
1909116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8		{q8-q9}, [r8]!
1910116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1911116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.64		{q8}, [r0,:128]		@ next round tweak
1912116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	b		.Lxts_enc_done
1913116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.align	4
1914116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.Lxts_enc_3:
1915116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.64		{q11}, [r0,:128]		@ next round tweak
1916116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1917116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q1, q1, q9
1918116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#ifndef	BSAES_ASM_EXTENDED_KEY
1919116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	add		r4, sp, #0x90			@ pass key schedule
1920116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#else
1921116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	add		r4, r10, #248			@ pass key schedule
1922116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
1923116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q2, q2, q10
1924116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov		r5, r1			@ pass rounds
1925116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov		r0, sp
1926116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1927116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bl		_bsaes_encrypt8
1928116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1929116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.64		{q8-q9}, [r0,:128]!
1930116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.64		{q10}, [r0,:128]!
1931116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q0, q0, q8
1932116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q1, q1, q9
1933116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q8, q4, q10
1934116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8		{q0-q1}, [r8]!
1935116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8		{q8}, [r8]!
1936116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1937116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.64		{q8}, [r0,:128]		@ next round tweak
1938116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	b		.Lxts_enc_done
1939116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.align	4
1940116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.Lxts_enc_2:
1941116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.64		{q10}, [r0,:128]		@ next round tweak
1942116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1943116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q0, q0, q8
1944116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#ifndef	BSAES_ASM_EXTENDED_KEY
1945116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	add		r4, sp, #0x90			@ pass key schedule
1946116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#else
1947116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	add		r4, r10, #248			@ pass key schedule
1948116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
1949116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q1, q1, q9
1950116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov		r5, r1			@ pass rounds
1951116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov		r0, sp
1952116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1953116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bl		_bsaes_encrypt8
1954116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1955116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.64		{q8-q9}, [r0,:128]!
1956116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q0, q0, q8
1957116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q1, q1, q9
1958116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8		{q0-q1}, [r8]!
1959116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1960116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.64		{q8}, [r0,:128]		@ next round tweak
1961116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	b		.Lxts_enc_done
1962116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.align	4
1963116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.Lxts_enc_1:
1964116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov		r0, sp
1965116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q0, q8
1966116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov		r1, sp
1967116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8		{q0}, [sp,:128]
1968116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov		r2, r10
1969116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov		r4, r3				@ preserve fp
1970116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1971116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bl		AES_encrypt
1972116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1973116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8		{q0}, [sp,:128]
1974116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q0, q0, q8
1975116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8		{q0}, [r8]!
1976116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov		r3, r4
1977116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1978116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vmov		q8, q9		@ next round tweak
1979116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1980116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.Lxts_enc_done:
1981116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#ifndef	XTS_CHAIN_TWEAK
1982116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	adds		r9, #0x10
1983116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	beq		.Lxts_enc_ret
1984116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	sub		r6, r8, #0x10
1985116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1986116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.Lxts_enc_steal:
1987116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	ldrb		r0, [r7], #1
1988116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	ldrb		r1, [r8, #-0x10]
1989116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	strb		r0, [r8, #-0x10]
1990116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	strb		r1, [r8], #1
1991116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1992116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	subs		r9, #1
1993116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bhi		.Lxts_enc_steal
1994116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1995116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8		{q0}, [r6]
1996116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov		r0, sp
1997116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q0, q0, q8
1998116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov		r1, sp
1999116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8		{q0}, [sp,:128]
2000116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov		r2, r10
2001116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov		r4, r3			@ preserve fp
2002116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2003116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bl		AES_encrypt
2004116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2005116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8		{q0}, [sp,:128]
2006116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q0, q0, q8
2007116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8		{q0}, [r6]
2008116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov		r3, r4
2009116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
2010116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2011116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.Lxts_enc_ret:
2012116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bic		r0, r3, #0xf
2013116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vmov.i32	q0, #0
2014116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vmov.i32	q1, #0
2015116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#ifdef	XTS_CHAIN_TWEAK
2016116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	ldr		r1, [r3, #0x20+VFP_ABI_FRAME]	@ chain tweak
2017116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
2018116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.Lxts_enc_bzero:				@ wipe key schedule [if any]
2019116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vstmia		sp!, {q0-q1}
2020116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	cmp		sp, r0
2021116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bne		.Lxts_enc_bzero
2022116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2023116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov		sp, r3
2024116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#ifdef	XTS_CHAIN_TWEAK
2025116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8		{q8}, [r1]
2026116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
2027116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	VFP_ABI_POP
2028116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	ldmia		sp!, {r4-r10, pc}	@ return
2029116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2030116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.size	bsaes_xts_encrypt,.-bsaes_xts_encrypt
2031116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2032116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.globl	bsaes_xts_decrypt
20335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles).hidden	bsaes_xts_decrypt
2034116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.type	bsaes_xts_decrypt,%function
2035116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.align	4
2036116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbsaes_xts_decrypt:
2037116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov	ip, sp
2038116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	stmdb	sp!, {r4-r10, lr}		@ 0x20
2039116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	VFP_ABI_PUSH
2040116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov	r6, sp				@ future r3
2041116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2042116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov	r7, r0
2043116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov	r8, r1
2044116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov	r9, r2
2045116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov	r10, r3
2046116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2047116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	sub	r0, sp, #0x10			@ 0x10
2048116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bic	r0, #0xf			@ align at 16 bytes
2049116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov	sp, r0
2050116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2051116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#ifdef	XTS_CHAIN_TWEAK
2052116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	ldr	r0, [ip]			@ pointer to input tweak
2053116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#else
2054116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	@ generate initial tweak
2055116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	ldr	r0, [ip, #4]			@ iv[]
2056116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov	r1, sp
2057116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	ldr	r2, [ip, #0]			@ key2
2058116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bl	AES_encrypt
2059116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov	r0, sp				@ pointer to initial tweak
2060116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
2061116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2062116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	ldr	r1, [r10, #240]		@ get # of rounds
2063116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov	r3, r6
2064116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#ifndef	BSAES_ASM_EXTENDED_KEY
2065116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	@ allocate the key schedule on the stack
2066116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	sub	r12, sp, r1, lsl#7		@ 128 bytes per inner round key
2067116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	@ add	r12, #96			@ size of bit-sliced key schedule
2068116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	sub	r12, #48			@ place for tweak[9]
2069116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2070116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	@ populate the key schedule
2071116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov	r4, r10			@ pass key
2072116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov	r5, r1			@ pass # of rounds
2073116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov	sp, r12
2074116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	add	r12, #0x90			@ pass key schedule
2075116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bl	_bsaes_key_convert
2076116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	add	r4, sp, #0x90
2077116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vldmia	r4, {q6}
2078116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vstmia	r12,  {q15}		@ save last round key
2079116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q7, q7, q6	@ fix up round 0 key
2080116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vstmia	r4, {q7}
2081116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#else
2082116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	ldr	r12, [r10, #244]
2083116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	eors	r12, #1
2084116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	beq	0f
2085116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2086116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	str	r12, [r10, #244]
2087116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov	r4, r10			@ pass key
2088116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov	r5, r1			@ pass # of rounds
2089116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	add	r12, r10, #248			@ pass key schedule
2090116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bl	_bsaes_key_convert
2091116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	add	r4, r10, #248
2092116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vldmia	r4, {q6}
2093116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vstmia	r12,  {q15}		@ save last round key
2094116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor	q7, q7, q6	@ fix up round 0 key
2095116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vstmia	r4, {q7}
2096116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2097116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.align	2
2098116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch0:	sub	sp, #0x90			@ place for tweak[9]
2099116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
2100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8	{q8}, [r0]			@ initial tweak
2101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	adr	r2, .Lxts_magic
2102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	tst	r9, #0xf			@ if not multiple of 16
2104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	it	ne				@ Thumb2 thing, sanity check in ARM
2105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	subne	r9, #0x10			@ subtract another 16 bytes
2106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	subs	r9, #0x80
2107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	blo	.Lxts_dec_short
2109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	b	.Lxts_dec_loop
2110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.align	4
2112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.Lxts_dec_loop:
2113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vldmia		r2, {q5}	@ load XTS magic
2114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshr.s64	q6, q8, #63
2115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov		r0, sp
2116116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand		q6, q6, q5
2117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vadd.u64	q9, q8, q8
2118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.64		{q8}, [r0,:128]!
2119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vswp		d13,d12
2120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshr.s64	q7, q9, #63
2121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q9, q9, q6
2122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand		q7, q7, q5
2123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vadd.u64	q10, q9, q9
2124116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.64		{q9}, [r0,:128]!
2125116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vswp		d15,d14
2126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshr.s64	q6, q10, #63
2127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q10, q10, q7
2128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand		q6, q6, q5
2129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8		{q0}, [r7]!
2130116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vadd.u64	q11, q10, q10
2131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.64		{q10}, [r0,:128]!
2132116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vswp		d13,d12
2133116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshr.s64	q7, q11, #63
2134116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q11, q11, q6
2135116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand		q7, q7, q5
2136116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8		{q1}, [r7]!
2137116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q0, q0, q8
2138116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vadd.u64	q12, q11, q11
2139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.64		{q11}, [r0,:128]!
2140116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vswp		d15,d14
2141116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshr.s64	q6, q12, #63
2142116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q12, q12, q7
2143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand		q6, q6, q5
2144116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8		{q2}, [r7]!
2145116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q1, q1, q9
2146116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vadd.u64	q13, q12, q12
2147116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.64		{q12}, [r0,:128]!
2148116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vswp		d13,d12
2149116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshr.s64	q7, q13, #63
2150116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q13, q13, q6
2151116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand		q7, q7, q5
2152116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8		{q3}, [r7]!
2153116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q2, q2, q10
2154116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vadd.u64	q14, q13, q13
2155116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.64		{q13}, [r0,:128]!
2156116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vswp		d15,d14
2157116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshr.s64	q6, q14, #63
2158116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q14, q14, q7
2159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand		q6, q6, q5
2160116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8		{q4}, [r7]!
2161116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q3, q3, q11
2162116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vadd.u64	q15, q14, q14
2163116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.64		{q14}, [r0,:128]!
2164116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vswp		d13,d12
2165116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshr.s64	q7, q15, #63
2166116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q15, q15, q6
2167116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand		q7, q7, q5
2168116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8		{q5}, [r7]!
2169116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q4, q4, q12
2170116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vadd.u64	q8, q15, q15
2171116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.64		{q15}, [r0,:128]!
2172116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vswp		d15,d14
2173116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q8, q8, q7
2174116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.64		{q8}, [r0,:128]		@ next round tweak
2175116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2176116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8		{q6-q7}, [r7]!
2177116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q5, q5, q13
2178116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#ifndef	BSAES_ASM_EXTENDED_KEY
2179116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	add		r4, sp, #0x90			@ pass key schedule
2180116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#else
2181116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	add		r4, r10, #248			@ pass key schedule
2182116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
2183116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q6, q6, q14
2184116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov		r5, r1			@ pass rounds
2185116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q7, q7, q15
2186116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov		r0, sp
2187116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2188116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bl		_bsaes_decrypt8
2189116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2190116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.64		{q8-q9}, [r0,:128]!
2191116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.64		{q10-q11}, [r0,:128]!
2192116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q0, q0, q8
2193116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.64		{q12-q13}, [r0,:128]!
2194116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q1, q1, q9
2195116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q8, q6, q10
2196116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8		{q0-q1}, [r8]!
2197116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q9, q4, q11
2198116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.64		{q14-q15}, [r0,:128]!
2199116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q10, q2, q12
2200116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8		{q8-q9}, [r8]!
2201116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q11, q7, q13
2202116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q12, q3, q14
2203116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8		{q10-q11}, [r8]!
2204116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q13, q5, q15
2205116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8		{q12-q13}, [r8]!
2206116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2207116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.64		{q8}, [r0,:128]		@ next round tweak
2208116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2209116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	subs		r9, #0x80
2210116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bpl		.Lxts_dec_loop
2211116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2212116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.Lxts_dec_short:
2213116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	adds		r9, #0x70
2214116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bmi		.Lxts_dec_done
2215116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2216116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vldmia		r2, {q5}	@ load XTS magic
2217116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshr.s64	q7, q8, #63
2218116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov		r0, sp
2219116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand		q7, q7, q5
2220116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vadd.u64	q9, q8, q8
2221116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.64		{q8}, [r0,:128]!
2222116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vswp		d15,d14
2223116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshr.s64	q6, q9, #63
2224116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q9, q9, q7
2225116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand		q6, q6, q5
2226116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vadd.u64	q10, q9, q9
2227116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.64		{q9}, [r0,:128]!
2228116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vswp		d13,d12
2229116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshr.s64	q7, q10, #63
2230116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q10, q10, q6
2231116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand		q7, q7, q5
2232116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8		{q0}, [r7]!
2233116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	subs		r9, #0x10
2234116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bmi		.Lxts_dec_1
2235116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vadd.u64	q11, q10, q10
2236116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.64		{q10}, [r0,:128]!
2237116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vswp		d15,d14
2238116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshr.s64	q6, q11, #63
2239116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q11, q11, q7
2240116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand		q6, q6, q5
2241116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8		{q1}, [r7]!
2242116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	subs		r9, #0x10
2243116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bmi		.Lxts_dec_2
2244116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q0, q0, q8
2245116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vadd.u64	q12, q11, q11
2246116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.64		{q11}, [r0,:128]!
2247116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vswp		d13,d12
2248116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshr.s64	q7, q12, #63
2249116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q12, q12, q6
2250116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand		q7, q7, q5
2251116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8		{q2}, [r7]!
2252116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	subs		r9, #0x10
2253116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bmi		.Lxts_dec_3
2254116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q1, q1, q9
2255116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vadd.u64	q13, q12, q12
2256116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.64		{q12}, [r0,:128]!
2257116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vswp		d15,d14
2258116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshr.s64	q6, q13, #63
2259116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q13, q13, q7
2260116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand		q6, q6, q5
2261116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8		{q3}, [r7]!
2262116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	subs		r9, #0x10
2263116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bmi		.Lxts_dec_4
2264116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q2, q2, q10
2265116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vadd.u64	q14, q13, q13
2266116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.64		{q13}, [r0,:128]!
2267116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vswp		d13,d12
2268116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshr.s64	q7, q14, #63
2269116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q14, q14, q6
2270116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand		q7, q7, q5
2271116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8		{q4}, [r7]!
2272116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	subs		r9, #0x10
2273116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bmi		.Lxts_dec_5
2274116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q3, q3, q11
2275116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vadd.u64	q15, q14, q14
2276116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.64		{q14}, [r0,:128]!
2277116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vswp		d15,d14
2278116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshr.s64	q6, q15, #63
2279116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q15, q15, q7
2280116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand		q6, q6, q5
2281116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8		{q5}, [r7]!
2282116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	subs		r9, #0x10
2283116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bmi		.Lxts_dec_6
2284116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q4, q4, q12
2285116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	sub		r9, #0x10
2286116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.64		{q15}, [r0,:128]		@ next round tweak
2287116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2288116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8		{q6}, [r7]!
2289116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q5, q5, q13
2290116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#ifndef	BSAES_ASM_EXTENDED_KEY
2291116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	add		r4, sp, #0x90			@ pass key schedule
2292116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#else
2293116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	add		r4, r10, #248			@ pass key schedule
2294116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
2295116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q6, q6, q14
2296116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov		r5, r1			@ pass rounds
2297116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov		r0, sp
2298116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2299116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bl		_bsaes_decrypt8
2300116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2301116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.64		{q8-q9}, [r0,:128]!
2302116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.64		{q10-q11}, [r0,:128]!
2303116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q0, q0, q8
2304116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.64		{q12-q13}, [r0,:128]!
2305116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q1, q1, q9
2306116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q8, q6, q10
2307116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8		{q0-q1}, [r8]!
2308116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q9, q4, q11
2309116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.64		{q14}, [r0,:128]!
2310116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q10, q2, q12
2311116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8		{q8-q9}, [r8]!
2312116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q11, q7, q13
2313116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q12, q3, q14
2314116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8		{q10-q11}, [r8]!
2315116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8		{q12}, [r8]!
2316116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2317116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.64		{q8}, [r0,:128]		@ next round tweak
2318116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	b		.Lxts_dec_done
2319116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.align	4
2320116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.Lxts_dec_6:
2321116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.64		{q14}, [r0,:128]		@ next round tweak
2322116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2323116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q4, q4, q12
2324116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#ifndef	BSAES_ASM_EXTENDED_KEY
2325116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	add		r4, sp, #0x90			@ pass key schedule
2326116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#else
2327116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	add		r4, r10, #248			@ pass key schedule
2328116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
2329116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q5, q5, q13
2330116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov		r5, r1			@ pass rounds
2331116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov		r0, sp
2332116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2333116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bl		_bsaes_decrypt8
2334116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2335116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.64		{q8-q9}, [r0,:128]!
2336116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.64		{q10-q11}, [r0,:128]!
2337116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q0, q0, q8
2338116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.64		{q12-q13}, [r0,:128]!
2339116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q1, q1, q9
2340116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q8, q6, q10
2341116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8		{q0-q1}, [r8]!
2342116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q9, q4, q11
2343116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q10, q2, q12
2344116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8		{q8-q9}, [r8]!
2345116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q11, q7, q13
2346116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8		{q10-q11}, [r8]!
2347116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2348116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.64		{q8}, [r0,:128]		@ next round tweak
2349116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	b		.Lxts_dec_done
2350116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.align	4
2351116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.Lxts_dec_5:
2352116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.64		{q13}, [r0,:128]		@ next round tweak
2353116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2354116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q3, q3, q11
2355116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#ifndef	BSAES_ASM_EXTENDED_KEY
2356116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	add		r4, sp, #0x90			@ pass key schedule
2357116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#else
2358116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	add		r4, r10, #248			@ pass key schedule
2359116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
2360116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q4, q4, q12
2361116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov		r5, r1			@ pass rounds
2362116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov		r0, sp
2363116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2364116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bl		_bsaes_decrypt8
2365116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2366116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.64		{q8-q9}, [r0,:128]!
2367116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.64		{q10-q11}, [r0,:128]!
2368116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q0, q0, q8
2369116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.64		{q12}, [r0,:128]!
2370116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q1, q1, q9
2371116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q8, q6, q10
2372116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8		{q0-q1}, [r8]!
2373116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q9, q4, q11
2374116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q10, q2, q12
2375116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8		{q8-q9}, [r8]!
2376116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8		{q10}, [r8]!
2377116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2378116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.64		{q8}, [r0,:128]		@ next round tweak
2379116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	b		.Lxts_dec_done
2380116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.align	4
2381116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.Lxts_dec_4:
2382116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.64		{q12}, [r0,:128]		@ next round tweak
2383116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2384116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q2, q2, q10
2385116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#ifndef	BSAES_ASM_EXTENDED_KEY
2386116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	add		r4, sp, #0x90			@ pass key schedule
2387116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#else
2388116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	add		r4, r10, #248			@ pass key schedule
2389116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
2390116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q3, q3, q11
2391116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov		r5, r1			@ pass rounds
2392116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov		r0, sp
2393116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2394116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bl		_bsaes_decrypt8
2395116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2396116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.64		{q8-q9}, [r0,:128]!
2397116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.64		{q10-q11}, [r0,:128]!
2398116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q0, q0, q8
2399116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q1, q1, q9
2400116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q8, q6, q10
2401116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8		{q0-q1}, [r8]!
2402116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q9, q4, q11
2403116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8		{q8-q9}, [r8]!
2404116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2405116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.64		{q8}, [r0,:128]		@ next round tweak
2406116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	b		.Lxts_dec_done
2407116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.align	4
2408116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.Lxts_dec_3:
2409116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.64		{q11}, [r0,:128]		@ next round tweak
2410116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2411116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q1, q1, q9
2412116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#ifndef	BSAES_ASM_EXTENDED_KEY
2413116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	add		r4, sp, #0x90			@ pass key schedule
2414116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#else
2415116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	add		r4, r10, #248			@ pass key schedule
2416116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
2417116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q2, q2, q10
2418116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov		r5, r1			@ pass rounds
2419116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov		r0, sp
2420116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2421116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bl		_bsaes_decrypt8
2422116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2423116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.64		{q8-q9}, [r0,:128]!
2424116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.64		{q10}, [r0,:128]!
2425116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q0, q0, q8
2426116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q1, q1, q9
2427116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q8, q6, q10
2428116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8		{q0-q1}, [r8]!
2429116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8		{q8}, [r8]!
2430116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2431116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.64		{q8}, [r0,:128]		@ next round tweak
2432116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	b		.Lxts_dec_done
2433116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.align	4
2434116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.Lxts_dec_2:
2435116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.64		{q10}, [r0,:128]		@ next round tweak
2436116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2437116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q0, q0, q8
2438116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#ifndef	BSAES_ASM_EXTENDED_KEY
2439116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	add		r4, sp, #0x90			@ pass key schedule
2440116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#else
2441116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	add		r4, r10, #248			@ pass key schedule
2442116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
2443116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q1, q1, q9
2444116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov		r5, r1			@ pass rounds
2445116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov		r0, sp
2446116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2447116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bl		_bsaes_decrypt8
2448116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2449116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.64		{q8-q9}, [r0,:128]!
2450116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q0, q0, q8
2451116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q1, q1, q9
2452116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8		{q0-q1}, [r8]!
2453116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2454116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.64		{q8}, [r0,:128]		@ next round tweak
2455116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	b		.Lxts_dec_done
2456116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.align	4
2457116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.Lxts_dec_1:
2458116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov		r0, sp
2459116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q0, q8
2460116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov		r1, sp
2461116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8		{q0}, [sp,:128]
2462116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov		r2, r10
2463116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov		r4, r3				@ preserve fp
2464116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov		r5, r2			@ preserve magic
2465116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2466116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bl		AES_decrypt
2467116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2468116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8		{q0}, [sp,:128]
2469116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q0, q0, q8
2470116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8		{q0}, [r8]!
2471116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov		r3, r4
2472116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov		r2, r5
2473116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2474116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vmov		q8, q9		@ next round tweak
2475116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2476116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.Lxts_dec_done:
2477116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#ifndef	XTS_CHAIN_TWEAK
2478116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	adds		r9, #0x10
2479116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	beq		.Lxts_dec_ret
2480116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2481116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	@ calculate one round of extra tweak for the stolen ciphertext
2482116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vldmia		r2, {q5}
2483116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vshr.s64	q6, q8, #63
2484116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vand		q6, q6, q5
2485116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vadd.u64	q9, q8, q8
2486116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vswp		d13,d12
2487116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q9, q9, q6
2488116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2489116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	@ perform the final decryption with the last tweak value
2490116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8		{q0}, [r7]!
2491116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov		r0, sp
2492116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q0, q0, q9
2493116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov		r1, sp
2494116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8		{q0}, [sp,:128]
2495116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov		r2, r10
2496116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov		r4, r3			@ preserve fp
2497116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2498116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bl		AES_decrypt
2499116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2500116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8		{q0}, [sp,:128]
2501116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q0, q0, q9
2502116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8		{q0}, [r8]
2503116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2504116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov		r6, r8
2505116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.Lxts_dec_steal:
2506116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	ldrb		r1, [r8]
2507116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	ldrb		r0, [r7], #1
2508116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	strb		r1, [r8, #0x10]
2509116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	strb		r0, [r8], #1
2510116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2511116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	subs		r9, #1
2512116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bhi		.Lxts_dec_steal
2513116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2514116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8		{q0}, [r6]
2515116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov		r0, sp
2516116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q0, q8
2517116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov		r1, sp
2518116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8		{q0}, [sp,:128]
2519116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov		r2, r10
2520116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2521116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bl		AES_decrypt
2522116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2523116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vld1.8		{q0}, [sp,:128]
2524116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	veor		q0, q0, q8
2525116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8		{q0}, [r6]
2526116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov		r3, r4
2527116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
2528116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2529116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.Lxts_dec_ret:
2530116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bic		r0, r3, #0xf
2531116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vmov.i32	q0, #0
2532116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vmov.i32	q1, #0
2533116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#ifdef	XTS_CHAIN_TWEAK
2534116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	ldr		r1, [r3, #0x20+VFP_ABI_FRAME]	@ chain tweak
2535116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
2536116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.Lxts_dec_bzero:				@ wipe key schedule [if any]
2537116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vstmia		sp!, {q0-q1}
2538116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	cmp		sp, r0
2539116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	bne		.Lxts_dec_bzero
2540116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2541116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	mov		sp, r3
2542116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#ifdef	XTS_CHAIN_TWEAK
2543116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	vst1.8		{q8}, [r1]
2544116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
2545116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	VFP_ABI_POP
2546116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch	ldmia		sp!, {r4-r10, pc}	@ return
2547116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2548116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch.size	bsaes_xts_decrypt,.-bsaes_xts_decrypt
2549116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
2550116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
2551