xref: /aosp_15_r20/external/boringssl/src/gen/bcm/bsaes-armv7-linux.S (revision 8fb009dc861624b67b6cdb62ea21f0f22d0c584b)
1*8fb009dcSAndroid Build Coastguard Worker// This file is generated from a similarly-named Perl script in the BoringSSL
2*8fb009dcSAndroid Build Coastguard Worker// source tree. Do not edit by hand.
3*8fb009dcSAndroid Build Coastguard Worker
4*8fb009dcSAndroid Build Coastguard Worker#include <openssl/asm_base.h>
5*8fb009dcSAndroid Build Coastguard Worker
6*8fb009dcSAndroid Build Coastguard Worker#if !defined(OPENSSL_NO_ASM) && defined(OPENSSL_ARM) && defined(__ELF__)
7*8fb009dcSAndroid Build Coastguard Worker@ Copyright 2012-2016 The OpenSSL Project Authors. All Rights Reserved.
8*8fb009dcSAndroid Build Coastguard Worker@
9*8fb009dcSAndroid Build Coastguard Worker@ Licensed under the OpenSSL license (the "License").  You may not use
10*8fb009dcSAndroid Build Coastguard Worker@ this file except in compliance with the License.  You can obtain a copy
11*8fb009dcSAndroid Build Coastguard Worker@ in the file LICENSE in the source distribution or at
12*8fb009dcSAndroid Build Coastguard Worker@ https://www.openssl.org/source/license.html
13*8fb009dcSAndroid Build Coastguard Worker
14*8fb009dcSAndroid Build Coastguard Worker
15*8fb009dcSAndroid Build Coastguard Worker@ ====================================================================
16*8fb009dcSAndroid Build Coastguard Worker@ Written by Andy Polyakov <appro@openssl.org> for the OpenSSL
17*8fb009dcSAndroid Build Coastguard Worker@ project. The module is, however, dual licensed under OpenSSL and
18*8fb009dcSAndroid Build Coastguard Worker@ CRYPTOGAMS licenses depending on where you obtain it. For further
19*8fb009dcSAndroid Build Coastguard Worker@ details see http://www.openssl.org/~appro/cryptogams/.
20*8fb009dcSAndroid Build Coastguard Worker@
21*8fb009dcSAndroid Build Coastguard Worker@ Specific modes and adaptation for Linux kernel by Ard Biesheuvel
22*8fb009dcSAndroid Build Coastguard Worker@ of Linaro. Permission to use under GPL terms is granted.
23*8fb009dcSAndroid Build Coastguard Worker@ ====================================================================
24*8fb009dcSAndroid Build Coastguard Worker
25*8fb009dcSAndroid Build Coastguard Worker@ Bit-sliced AES for ARM NEON
26*8fb009dcSAndroid Build Coastguard Worker@
27*8fb009dcSAndroid Build Coastguard Worker@ February 2012.
28*8fb009dcSAndroid Build Coastguard Worker@
29*8fb009dcSAndroid Build Coastguard Worker@ This implementation is direct adaptation of bsaes-x86_64 module for
30*8fb009dcSAndroid Build Coastguard Worker@ ARM NEON. Except that this module is endian-neutral [in sense that
31*8fb009dcSAndroid Build Coastguard Worker@ it can be compiled for either endianness] by courtesy of vld1.8's
32*8fb009dcSAndroid Build Coastguard Worker@ neutrality. Initial version doesn't implement interface to OpenSSL,
33*8fb009dcSAndroid Build Coastguard Worker@ only low-level primitives and unsupported entry points, just enough
34*8fb009dcSAndroid Build Coastguard Worker@ to collect performance results, which for Cortex-A8 core are:
35*8fb009dcSAndroid Build Coastguard Worker@
36*8fb009dcSAndroid Build Coastguard Worker@ encrypt	19.5 cycles per byte processed with 128-bit key
37*8fb009dcSAndroid Build Coastguard Worker@ decrypt	22.1 cycles per byte processed with 128-bit key
38*8fb009dcSAndroid Build Coastguard Worker@ key conv.	440  cycles per 128-bit key/0.18 of 8x block
39*8fb009dcSAndroid Build Coastguard Worker@
40*8fb009dcSAndroid Build Coastguard Worker@ Snapdragon S4 encrypts byte in 17.6 cycles and decrypts in 19.7,
41*8fb009dcSAndroid Build Coastguard Worker@ which is [much] worse than anticipated (for further details see
42*8fb009dcSAndroid Build Coastguard Worker@ http://www.openssl.org/~appro/Snapdragon-S4.html).
43*8fb009dcSAndroid Build Coastguard Worker@
44*8fb009dcSAndroid Build Coastguard Worker@ Cortex-A15 manages in 14.2/16.1 cycles [when integer-only code
45*8fb009dcSAndroid Build Coastguard Worker@ manages in 20.0 cycles].
46*8fb009dcSAndroid Build Coastguard Worker@
47*8fb009dcSAndroid Build Coastguard Worker@ When comparing to x86_64 results keep in mind that NEON unit is
48*8fb009dcSAndroid Build Coastguard Worker@ [mostly] single-issue and thus can't [fully] benefit from
49*8fb009dcSAndroid Build Coastguard Worker@ instruction-level parallelism. And when comparing to aes-armv4
50*8fb009dcSAndroid Build Coastguard Worker@ results keep in mind key schedule conversion overhead (see
51*8fb009dcSAndroid Build Coastguard Worker@ bsaes-x86_64.pl for further details)...
52*8fb009dcSAndroid Build Coastguard Worker@
53*8fb009dcSAndroid Build Coastguard Worker@						<[email protected]>
54*8fb009dcSAndroid Build Coastguard Worker
55*8fb009dcSAndroid Build Coastguard Worker@ April-August 2013
56*8fb009dcSAndroid Build Coastguard Worker@ Add CBC, CTR and XTS subroutines and adapt for kernel use; courtesy of Ard.
57*8fb009dcSAndroid Build Coastguard Worker
58*8fb009dcSAndroid Build Coastguard Worker#ifndef __KERNEL__
59*8fb009dcSAndroid Build Coastguard Worker# include <openssl/arm_arch.h>
60*8fb009dcSAndroid Build Coastguard Worker
61*8fb009dcSAndroid Build Coastguard Worker# define VFP_ABI_PUSH	vstmdb	sp!,{d8-d15}
62*8fb009dcSAndroid Build Coastguard Worker# define VFP_ABI_POP	vldmia	sp!,{d8-d15}
63*8fb009dcSAndroid Build Coastguard Worker# define VFP_ABI_FRAME	0x40
64*8fb009dcSAndroid Build Coastguard Worker#else
65*8fb009dcSAndroid Build Coastguard Worker# define VFP_ABI_PUSH
66*8fb009dcSAndroid Build Coastguard Worker# define VFP_ABI_POP
67*8fb009dcSAndroid Build Coastguard Worker# define VFP_ABI_FRAME	0
68*8fb009dcSAndroid Build Coastguard Worker# define BSAES_ASM_EXTENDED_KEY
69*8fb009dcSAndroid Build Coastguard Worker# define XTS_CHAIN_TWEAK
70*8fb009dcSAndroid Build Coastguard Worker# define __ARM_MAX_ARCH__ 7
71*8fb009dcSAndroid Build Coastguard Worker#endif
72*8fb009dcSAndroid Build Coastguard Worker
73*8fb009dcSAndroid Build Coastguard Worker#ifdef __thumb__
74*8fb009dcSAndroid Build Coastguard Worker# define adrl adr
75*8fb009dcSAndroid Build Coastguard Worker#endif
76*8fb009dcSAndroid Build Coastguard Worker
77*8fb009dcSAndroid Build Coastguard Worker#if __ARM_MAX_ARCH__>=7
78*8fb009dcSAndroid Build Coastguard Worker.arch	armv7-a
79*8fb009dcSAndroid Build Coastguard Worker.fpu	neon
80*8fb009dcSAndroid Build Coastguard Worker
81*8fb009dcSAndroid Build Coastguard Worker.text
82*8fb009dcSAndroid Build Coastguard Worker.syntax	unified 	@ ARMv7-capable assembler is expected to handle this
83*8fb009dcSAndroid Build Coastguard Worker#if defined(__thumb2__) && !defined(__APPLE__)
84*8fb009dcSAndroid Build Coastguard Worker.thumb
85*8fb009dcSAndroid Build Coastguard Worker#else
86*8fb009dcSAndroid Build Coastguard Worker.code	32
87*8fb009dcSAndroid Build Coastguard Worker# undef __thumb2__
88*8fb009dcSAndroid Build Coastguard Worker#endif
89*8fb009dcSAndroid Build Coastguard Worker
90*8fb009dcSAndroid Build Coastguard Worker.type	_bsaes_decrypt8,%function
91*8fb009dcSAndroid Build Coastguard Worker.align	4
92*8fb009dcSAndroid Build Coastguard Worker_bsaes_decrypt8:
93*8fb009dcSAndroid Build Coastguard Worker	adr	r6,.
94*8fb009dcSAndroid Build Coastguard Worker	vldmia	r4!, {q9}		@ round 0 key
95*8fb009dcSAndroid Build Coastguard Worker#if defined(__thumb2__) || defined(__APPLE__)
96*8fb009dcSAndroid Build Coastguard Worker	adr	r6,.LM0ISR
97*8fb009dcSAndroid Build Coastguard Worker#else
98*8fb009dcSAndroid Build Coastguard Worker	add	r6,r6,#.LM0ISR-_bsaes_decrypt8
99*8fb009dcSAndroid Build Coastguard Worker#endif
100*8fb009dcSAndroid Build Coastguard Worker
101*8fb009dcSAndroid Build Coastguard Worker	vldmia	r6!, {q8}		@ .LM0ISR
102*8fb009dcSAndroid Build Coastguard Worker	veor	q10, q0, q9	@ xor with round0 key
103*8fb009dcSAndroid Build Coastguard Worker	veor	q11, q1, q9
104*8fb009dcSAndroid Build Coastguard Worker	vtbl.8	d0, {q10}, d16
105*8fb009dcSAndroid Build Coastguard Worker	vtbl.8	d1, {q10}, d17
106*8fb009dcSAndroid Build Coastguard Worker	veor	q12, q2, q9
107*8fb009dcSAndroid Build Coastguard Worker	vtbl.8	d2, {q11}, d16
108*8fb009dcSAndroid Build Coastguard Worker	vtbl.8	d3, {q11}, d17
109*8fb009dcSAndroid Build Coastguard Worker	veor	q13, q3, q9
110*8fb009dcSAndroid Build Coastguard Worker	vtbl.8	d4, {q12}, d16
111*8fb009dcSAndroid Build Coastguard Worker	vtbl.8	d5, {q12}, d17
112*8fb009dcSAndroid Build Coastguard Worker	veor	q14, q4, q9
113*8fb009dcSAndroid Build Coastguard Worker	vtbl.8	d6, {q13}, d16
114*8fb009dcSAndroid Build Coastguard Worker	vtbl.8	d7, {q13}, d17
115*8fb009dcSAndroid Build Coastguard Worker	veor	q15, q5, q9
116*8fb009dcSAndroid Build Coastguard Worker	vtbl.8	d8, {q14}, d16
117*8fb009dcSAndroid Build Coastguard Worker	vtbl.8	d9, {q14}, d17
118*8fb009dcSAndroid Build Coastguard Worker	veor	q10, q6, q9
119*8fb009dcSAndroid Build Coastguard Worker	vtbl.8	d10, {q15}, d16
120*8fb009dcSAndroid Build Coastguard Worker	vtbl.8	d11, {q15}, d17
121*8fb009dcSAndroid Build Coastguard Worker	veor	q11, q7, q9
122*8fb009dcSAndroid Build Coastguard Worker	vtbl.8	d12, {q10}, d16
123*8fb009dcSAndroid Build Coastguard Worker	vtbl.8	d13, {q10}, d17
124*8fb009dcSAndroid Build Coastguard Worker	vtbl.8	d14, {q11}, d16
125*8fb009dcSAndroid Build Coastguard Worker	vtbl.8	d15, {q11}, d17
126*8fb009dcSAndroid Build Coastguard Worker	vmov.i8	q8,#0x55			@ compose .LBS0
127*8fb009dcSAndroid Build Coastguard Worker	vmov.i8	q9,#0x33			@ compose .LBS1
128*8fb009dcSAndroid Build Coastguard Worker	vshr.u64	q10, q6, #1
129*8fb009dcSAndroid Build Coastguard Worker	vshr.u64	q11, q4, #1
130*8fb009dcSAndroid Build Coastguard Worker	veor	q10, q10, q7
131*8fb009dcSAndroid Build Coastguard Worker	veor	q11, q11, q5
132*8fb009dcSAndroid Build Coastguard Worker	vand	q10, q10, q8
133*8fb009dcSAndroid Build Coastguard Worker	vand	q11, q11, q8
134*8fb009dcSAndroid Build Coastguard Worker	veor	q7, q7, q10
135*8fb009dcSAndroid Build Coastguard Worker	vshl.u64	q10, q10, #1
136*8fb009dcSAndroid Build Coastguard Worker	veor	q5, q5, q11
137*8fb009dcSAndroid Build Coastguard Worker	vshl.u64	q11, q11, #1
138*8fb009dcSAndroid Build Coastguard Worker	veor	q6, q6, q10
139*8fb009dcSAndroid Build Coastguard Worker	veor	q4, q4, q11
140*8fb009dcSAndroid Build Coastguard Worker	vshr.u64	q10, q2, #1
141*8fb009dcSAndroid Build Coastguard Worker	vshr.u64	q11, q0, #1
142*8fb009dcSAndroid Build Coastguard Worker	veor	q10, q10, q3
143*8fb009dcSAndroid Build Coastguard Worker	veor	q11, q11, q1
144*8fb009dcSAndroid Build Coastguard Worker	vand	q10, q10, q8
145*8fb009dcSAndroid Build Coastguard Worker	vand	q11, q11, q8
146*8fb009dcSAndroid Build Coastguard Worker	veor	q3, q3, q10
147*8fb009dcSAndroid Build Coastguard Worker	vshl.u64	q10, q10, #1
148*8fb009dcSAndroid Build Coastguard Worker	veor	q1, q1, q11
149*8fb009dcSAndroid Build Coastguard Worker	vshl.u64	q11, q11, #1
150*8fb009dcSAndroid Build Coastguard Worker	veor	q2, q2, q10
151*8fb009dcSAndroid Build Coastguard Worker	veor	q0, q0, q11
152*8fb009dcSAndroid Build Coastguard Worker	vmov.i8	q8,#0x0f			@ compose .LBS2
153*8fb009dcSAndroid Build Coastguard Worker	vshr.u64	q10, q5, #2
154*8fb009dcSAndroid Build Coastguard Worker	vshr.u64	q11, q4, #2
155*8fb009dcSAndroid Build Coastguard Worker	veor	q10, q10, q7
156*8fb009dcSAndroid Build Coastguard Worker	veor	q11, q11, q6
157*8fb009dcSAndroid Build Coastguard Worker	vand	q10, q10, q9
158*8fb009dcSAndroid Build Coastguard Worker	vand	q11, q11, q9
159*8fb009dcSAndroid Build Coastguard Worker	veor	q7, q7, q10
160*8fb009dcSAndroid Build Coastguard Worker	vshl.u64	q10, q10, #2
161*8fb009dcSAndroid Build Coastguard Worker	veor	q6, q6, q11
162*8fb009dcSAndroid Build Coastguard Worker	vshl.u64	q11, q11, #2
163*8fb009dcSAndroid Build Coastguard Worker	veor	q5, q5, q10
164*8fb009dcSAndroid Build Coastguard Worker	veor	q4, q4, q11
165*8fb009dcSAndroid Build Coastguard Worker	vshr.u64	q10, q1, #2
166*8fb009dcSAndroid Build Coastguard Worker	vshr.u64	q11, q0, #2
167*8fb009dcSAndroid Build Coastguard Worker	veor	q10, q10, q3
168*8fb009dcSAndroid Build Coastguard Worker	veor	q11, q11, q2
169*8fb009dcSAndroid Build Coastguard Worker	vand	q10, q10, q9
170*8fb009dcSAndroid Build Coastguard Worker	vand	q11, q11, q9
171*8fb009dcSAndroid Build Coastguard Worker	veor	q3, q3, q10
172*8fb009dcSAndroid Build Coastguard Worker	vshl.u64	q10, q10, #2
173*8fb009dcSAndroid Build Coastguard Worker	veor	q2, q2, q11
174*8fb009dcSAndroid Build Coastguard Worker	vshl.u64	q11, q11, #2
175*8fb009dcSAndroid Build Coastguard Worker	veor	q1, q1, q10
176*8fb009dcSAndroid Build Coastguard Worker	veor	q0, q0, q11
177*8fb009dcSAndroid Build Coastguard Worker	vshr.u64	q10, q3, #4
178*8fb009dcSAndroid Build Coastguard Worker	vshr.u64	q11, q2, #4
179*8fb009dcSAndroid Build Coastguard Worker	veor	q10, q10, q7
180*8fb009dcSAndroid Build Coastguard Worker	veor	q11, q11, q6
181*8fb009dcSAndroid Build Coastguard Worker	vand	q10, q10, q8
182*8fb009dcSAndroid Build Coastguard Worker	vand	q11, q11, q8
183*8fb009dcSAndroid Build Coastguard Worker	veor	q7, q7, q10
184*8fb009dcSAndroid Build Coastguard Worker	vshl.u64	q10, q10, #4
185*8fb009dcSAndroid Build Coastguard Worker	veor	q6, q6, q11
186*8fb009dcSAndroid Build Coastguard Worker	vshl.u64	q11, q11, #4
187*8fb009dcSAndroid Build Coastguard Worker	veor	q3, q3, q10
188*8fb009dcSAndroid Build Coastguard Worker	veor	q2, q2, q11
189*8fb009dcSAndroid Build Coastguard Worker	vshr.u64	q10, q1, #4
190*8fb009dcSAndroid Build Coastguard Worker	vshr.u64	q11, q0, #4
191*8fb009dcSAndroid Build Coastguard Worker	veor	q10, q10, q5
192*8fb009dcSAndroid Build Coastguard Worker	veor	q11, q11, q4
193*8fb009dcSAndroid Build Coastguard Worker	vand	q10, q10, q8
194*8fb009dcSAndroid Build Coastguard Worker	vand	q11, q11, q8
195*8fb009dcSAndroid Build Coastguard Worker	veor	q5, q5, q10
196*8fb009dcSAndroid Build Coastguard Worker	vshl.u64	q10, q10, #4
197*8fb009dcSAndroid Build Coastguard Worker	veor	q4, q4, q11
198*8fb009dcSAndroid Build Coastguard Worker	vshl.u64	q11, q11, #4
199*8fb009dcSAndroid Build Coastguard Worker	veor	q1, q1, q10
200*8fb009dcSAndroid Build Coastguard Worker	veor	q0, q0, q11
201*8fb009dcSAndroid Build Coastguard Worker	sub	r5,r5,#1
202*8fb009dcSAndroid Build Coastguard Worker	b	.Ldec_sbox
203*8fb009dcSAndroid Build Coastguard Worker.align	4
204*8fb009dcSAndroid Build Coastguard Worker.Ldec_loop:
205*8fb009dcSAndroid Build Coastguard Worker	vldmia	r4!, {q8,q9,q10,q11}
206*8fb009dcSAndroid Build Coastguard Worker	veor	q8, q8, q0
207*8fb009dcSAndroid Build Coastguard Worker	veor	q9, q9, q1
208*8fb009dcSAndroid Build Coastguard Worker	vtbl.8	d0, {q8}, d24
209*8fb009dcSAndroid Build Coastguard Worker	vtbl.8	d1, {q8}, d25
210*8fb009dcSAndroid Build Coastguard Worker	vldmia	r4!, {q8}
211*8fb009dcSAndroid Build Coastguard Worker	veor	q10, q10, q2
212*8fb009dcSAndroid Build Coastguard Worker	vtbl.8	d2, {q9}, d24
213*8fb009dcSAndroid Build Coastguard Worker	vtbl.8	d3, {q9}, d25
214*8fb009dcSAndroid Build Coastguard Worker	vldmia	r4!, {q9}
215*8fb009dcSAndroid Build Coastguard Worker	veor	q11, q11, q3
216*8fb009dcSAndroid Build Coastguard Worker	vtbl.8	d4, {q10}, d24
217*8fb009dcSAndroid Build Coastguard Worker	vtbl.8	d5, {q10}, d25
218*8fb009dcSAndroid Build Coastguard Worker	vldmia	r4!, {q10}
219*8fb009dcSAndroid Build Coastguard Worker	vtbl.8	d6, {q11}, d24
220*8fb009dcSAndroid Build Coastguard Worker	vtbl.8	d7, {q11}, d25
221*8fb009dcSAndroid Build Coastguard Worker	vldmia	r4!, {q11}
222*8fb009dcSAndroid Build Coastguard Worker	veor	q8, q8, q4
223*8fb009dcSAndroid Build Coastguard Worker	veor	q9, q9, q5
224*8fb009dcSAndroid Build Coastguard Worker	vtbl.8	d8, {q8}, d24
225*8fb009dcSAndroid Build Coastguard Worker	vtbl.8	d9, {q8}, d25
226*8fb009dcSAndroid Build Coastguard Worker	veor	q10, q10, q6
227*8fb009dcSAndroid Build Coastguard Worker	vtbl.8	d10, {q9}, d24
228*8fb009dcSAndroid Build Coastguard Worker	vtbl.8	d11, {q9}, d25
229*8fb009dcSAndroid Build Coastguard Worker	veor	q11, q11, q7
230*8fb009dcSAndroid Build Coastguard Worker	vtbl.8	d12, {q10}, d24
231*8fb009dcSAndroid Build Coastguard Worker	vtbl.8	d13, {q10}, d25
232*8fb009dcSAndroid Build Coastguard Worker	vtbl.8	d14, {q11}, d24
233*8fb009dcSAndroid Build Coastguard Worker	vtbl.8	d15, {q11}, d25
234*8fb009dcSAndroid Build Coastguard Worker.Ldec_sbox:
235*8fb009dcSAndroid Build Coastguard Worker	veor	q1, q1, q4
236*8fb009dcSAndroid Build Coastguard Worker	veor	q3, q3, q4
237*8fb009dcSAndroid Build Coastguard Worker
238*8fb009dcSAndroid Build Coastguard Worker	veor	q4, q4, q7
239*8fb009dcSAndroid Build Coastguard Worker	veor	q1, q1, q6
240*8fb009dcSAndroid Build Coastguard Worker	veor	q2, q2, q7
241*8fb009dcSAndroid Build Coastguard Worker	veor	q6, q6, q4
242*8fb009dcSAndroid Build Coastguard Worker
243*8fb009dcSAndroid Build Coastguard Worker	veor	q0, q0, q1
244*8fb009dcSAndroid Build Coastguard Worker	veor	q2, q2, q5
245*8fb009dcSAndroid Build Coastguard Worker	veor	q7, q7, q6
246*8fb009dcSAndroid Build Coastguard Worker	veor	q3, q3, q0
247*8fb009dcSAndroid Build Coastguard Worker	veor	q5, q5, q0
248*8fb009dcSAndroid Build Coastguard Worker	veor	q1, q1, q3
249*8fb009dcSAndroid Build Coastguard Worker	veor	q11, q3, q0
250*8fb009dcSAndroid Build Coastguard Worker	veor	q10, q7, q4
251*8fb009dcSAndroid Build Coastguard Worker	veor	q9, q1, q6
252*8fb009dcSAndroid Build Coastguard Worker	veor	q13, q4, q0
253*8fb009dcSAndroid Build Coastguard Worker	vmov	q8, q10
254*8fb009dcSAndroid Build Coastguard Worker	veor	q12, q5, q2
255*8fb009dcSAndroid Build Coastguard Worker
256*8fb009dcSAndroid Build Coastguard Worker	vorr	q10, q10, q9
257*8fb009dcSAndroid Build Coastguard Worker	veor	q15, q11, q8
258*8fb009dcSAndroid Build Coastguard Worker	vand	q14, q11, q12
259*8fb009dcSAndroid Build Coastguard Worker	vorr	q11, q11, q12
260*8fb009dcSAndroid Build Coastguard Worker	veor	q12, q12, q9
261*8fb009dcSAndroid Build Coastguard Worker	vand	q8, q8, q9
262*8fb009dcSAndroid Build Coastguard Worker	veor	q9, q6, q2
263*8fb009dcSAndroid Build Coastguard Worker	vand	q15, q15, q12
264*8fb009dcSAndroid Build Coastguard Worker	vand	q13, q13, q9
265*8fb009dcSAndroid Build Coastguard Worker	veor	q9, q3, q7
266*8fb009dcSAndroid Build Coastguard Worker	veor	q12, q1, q5
267*8fb009dcSAndroid Build Coastguard Worker	veor	q11, q11, q13
268*8fb009dcSAndroid Build Coastguard Worker	veor	q10, q10, q13
269*8fb009dcSAndroid Build Coastguard Worker	vand	q13, q9, q12
270*8fb009dcSAndroid Build Coastguard Worker	vorr	q9, q9, q12
271*8fb009dcSAndroid Build Coastguard Worker	veor	q11, q11, q15
272*8fb009dcSAndroid Build Coastguard Worker	veor	q8, q8, q13
273*8fb009dcSAndroid Build Coastguard Worker	veor	q10, q10, q14
274*8fb009dcSAndroid Build Coastguard Worker	veor	q9, q9, q15
275*8fb009dcSAndroid Build Coastguard Worker	veor	q8, q8, q14
276*8fb009dcSAndroid Build Coastguard Worker	vand	q12, q4, q6
277*8fb009dcSAndroid Build Coastguard Worker	veor	q9, q9, q14
278*8fb009dcSAndroid Build Coastguard Worker	vand	q13, q0, q2
279*8fb009dcSAndroid Build Coastguard Worker	vand	q14, q7, q1
280*8fb009dcSAndroid Build Coastguard Worker	vorr	q15, q3, q5
281*8fb009dcSAndroid Build Coastguard Worker	veor	q11, q11, q12
282*8fb009dcSAndroid Build Coastguard Worker	veor	q9, q9, q14
283*8fb009dcSAndroid Build Coastguard Worker	veor	q8, q8, q15
284*8fb009dcSAndroid Build Coastguard Worker	veor	q10, q10, q13
285*8fb009dcSAndroid Build Coastguard Worker
286*8fb009dcSAndroid Build Coastguard Worker	@ Inv_GF16 	0, 	1, 	2, 	3, s0, s1, s2, s3
287*8fb009dcSAndroid Build Coastguard Worker
288*8fb009dcSAndroid Build Coastguard Worker	@ new smaller inversion
289*8fb009dcSAndroid Build Coastguard Worker
290*8fb009dcSAndroid Build Coastguard Worker	vand	q14, q11, q9
291*8fb009dcSAndroid Build Coastguard Worker	vmov	q12, q8
292*8fb009dcSAndroid Build Coastguard Worker
293*8fb009dcSAndroid Build Coastguard Worker	veor	q13, q10, q14
294*8fb009dcSAndroid Build Coastguard Worker	veor	q15, q8, q14
295*8fb009dcSAndroid Build Coastguard Worker	veor	q14, q8, q14	@ q14=q15
296*8fb009dcSAndroid Build Coastguard Worker
297*8fb009dcSAndroid Build Coastguard Worker	vbsl	q13, q9, q8
298*8fb009dcSAndroid Build Coastguard Worker	vbsl	q15, q11, q10
299*8fb009dcSAndroid Build Coastguard Worker	veor	q11, q11, q10
300*8fb009dcSAndroid Build Coastguard Worker
301*8fb009dcSAndroid Build Coastguard Worker	vbsl	q12, q13, q14
302*8fb009dcSAndroid Build Coastguard Worker	vbsl	q8, q14, q13
303*8fb009dcSAndroid Build Coastguard Worker
304*8fb009dcSAndroid Build Coastguard Worker	vand	q14, q12, q15
305*8fb009dcSAndroid Build Coastguard Worker	veor	q9, q9, q8
306*8fb009dcSAndroid Build Coastguard Worker
307*8fb009dcSAndroid Build Coastguard Worker	veor	q14, q14, q11
308*8fb009dcSAndroid Build Coastguard Worker	veor	q12, q5, q2
309*8fb009dcSAndroid Build Coastguard Worker	veor	q8, q1, q6
310*8fb009dcSAndroid Build Coastguard Worker	veor	q10, q15, q14
311*8fb009dcSAndroid Build Coastguard Worker	vand	q10, q10, q5
312*8fb009dcSAndroid Build Coastguard Worker	veor	q5, q5, q1
313*8fb009dcSAndroid Build Coastguard Worker	vand	q11, q1, q15
314*8fb009dcSAndroid Build Coastguard Worker	vand	q5, q5, q14
315*8fb009dcSAndroid Build Coastguard Worker	veor	q1, q11, q10
316*8fb009dcSAndroid Build Coastguard Worker	veor	q5, q5, q11
317*8fb009dcSAndroid Build Coastguard Worker	veor	q15, q15, q13
318*8fb009dcSAndroid Build Coastguard Worker	veor	q14, q14, q9
319*8fb009dcSAndroid Build Coastguard Worker	veor	q11, q15, q14
320*8fb009dcSAndroid Build Coastguard Worker	veor	q10, q13, q9
321*8fb009dcSAndroid Build Coastguard Worker	vand	q11, q11, q12
322*8fb009dcSAndroid Build Coastguard Worker	vand	q10, q10, q2
323*8fb009dcSAndroid Build Coastguard Worker	veor	q12, q12, q8
324*8fb009dcSAndroid Build Coastguard Worker	veor	q2, q2, q6
325*8fb009dcSAndroid Build Coastguard Worker	vand	q8, q8, q15
326*8fb009dcSAndroid Build Coastguard Worker	vand	q6, q6, q13
327*8fb009dcSAndroid Build Coastguard Worker	vand	q12, q12, q14
328*8fb009dcSAndroid Build Coastguard Worker	vand	q2, q2, q9
329*8fb009dcSAndroid Build Coastguard Worker	veor	q8, q8, q12
330*8fb009dcSAndroid Build Coastguard Worker	veor	q2, q2, q6
331*8fb009dcSAndroid Build Coastguard Worker	veor	q12, q12, q11
332*8fb009dcSAndroid Build Coastguard Worker	veor	q6, q6, q10
333*8fb009dcSAndroid Build Coastguard Worker	veor	q5, q5, q12
334*8fb009dcSAndroid Build Coastguard Worker	veor	q2, q2, q12
335*8fb009dcSAndroid Build Coastguard Worker	veor	q1, q1, q8
336*8fb009dcSAndroid Build Coastguard Worker	veor	q6, q6, q8
337*8fb009dcSAndroid Build Coastguard Worker
338*8fb009dcSAndroid Build Coastguard Worker	veor	q12, q3, q0
339*8fb009dcSAndroid Build Coastguard Worker	veor	q8, q7, q4
340*8fb009dcSAndroid Build Coastguard Worker	veor	q11, q15, q14
341*8fb009dcSAndroid Build Coastguard Worker	veor	q10, q13, q9
342*8fb009dcSAndroid Build Coastguard Worker	vand	q11, q11, q12
343*8fb009dcSAndroid Build Coastguard Worker	vand	q10, q10, q0
344*8fb009dcSAndroid Build Coastguard Worker	veor	q12, q12, q8
345*8fb009dcSAndroid Build Coastguard Worker	veor	q0, q0, q4
346*8fb009dcSAndroid Build Coastguard Worker	vand	q8, q8, q15
347*8fb009dcSAndroid Build Coastguard Worker	vand	q4, q4, q13
348*8fb009dcSAndroid Build Coastguard Worker	vand	q12, q12, q14
349*8fb009dcSAndroid Build Coastguard Worker	vand	q0, q0, q9
350*8fb009dcSAndroid Build Coastguard Worker	veor	q8, q8, q12
351*8fb009dcSAndroid Build Coastguard Worker	veor	q0, q0, q4
352*8fb009dcSAndroid Build Coastguard Worker	veor	q12, q12, q11
353*8fb009dcSAndroid Build Coastguard Worker	veor	q4, q4, q10
354*8fb009dcSAndroid Build Coastguard Worker	veor	q15, q15, q13
355*8fb009dcSAndroid Build Coastguard Worker	veor	q14, q14, q9
356*8fb009dcSAndroid Build Coastguard Worker	veor	q10, q15, q14
357*8fb009dcSAndroid Build Coastguard Worker	vand	q10, q10, q3
358*8fb009dcSAndroid Build Coastguard Worker	veor	q3, q3, q7
359*8fb009dcSAndroid Build Coastguard Worker	vand	q11, q7, q15
360*8fb009dcSAndroid Build Coastguard Worker	vand	q3, q3, q14
361*8fb009dcSAndroid Build Coastguard Worker	veor	q7, q11, q10
362*8fb009dcSAndroid Build Coastguard Worker	veor	q3, q3, q11
363*8fb009dcSAndroid Build Coastguard Worker	veor	q3, q3, q12
364*8fb009dcSAndroid Build Coastguard Worker	veor	q0, q0, q12
365*8fb009dcSAndroid Build Coastguard Worker	veor	q7, q7, q8
366*8fb009dcSAndroid Build Coastguard Worker	veor	q4, q4, q8
367*8fb009dcSAndroid Build Coastguard Worker	veor	q1, q1, q7
368*8fb009dcSAndroid Build Coastguard Worker	veor	q6, q6, q5
369*8fb009dcSAndroid Build Coastguard Worker
370*8fb009dcSAndroid Build Coastguard Worker	veor	q4, q4, q1
371*8fb009dcSAndroid Build Coastguard Worker	veor	q2, q2, q7
372*8fb009dcSAndroid Build Coastguard Worker	veor	q5, q5, q7
373*8fb009dcSAndroid Build Coastguard Worker	veor	q4, q4, q2
374*8fb009dcSAndroid Build Coastguard Worker	veor	q7, q7, q0
375*8fb009dcSAndroid Build Coastguard Worker	veor	q4, q4, q5
376*8fb009dcSAndroid Build Coastguard Worker	veor	q3, q3, q6
377*8fb009dcSAndroid Build Coastguard Worker	veor	q6, q6, q1
378*8fb009dcSAndroid Build Coastguard Worker	veor	q3, q3, q4
379*8fb009dcSAndroid Build Coastguard Worker
380*8fb009dcSAndroid Build Coastguard Worker	veor	q4, q4, q0
381*8fb009dcSAndroid Build Coastguard Worker	veor	q7, q7, q3
382*8fb009dcSAndroid Build Coastguard Worker	subs	r5,r5,#1
383*8fb009dcSAndroid Build Coastguard Worker	bcc	.Ldec_done
384*8fb009dcSAndroid Build Coastguard Worker	@ multiplication by 0x05-0x00-0x04-0x00
385*8fb009dcSAndroid Build Coastguard Worker	vext.8	q8, q0, q0, #8
386*8fb009dcSAndroid Build Coastguard Worker	vext.8	q14, q3, q3, #8
387*8fb009dcSAndroid Build Coastguard Worker	vext.8	q15, q5, q5, #8
388*8fb009dcSAndroid Build Coastguard Worker	veor	q8, q8, q0
389*8fb009dcSAndroid Build Coastguard Worker	vext.8	q9, q1, q1, #8
390*8fb009dcSAndroid Build Coastguard Worker	veor	q14, q14, q3
391*8fb009dcSAndroid Build Coastguard Worker	vext.8	q10, q6, q6, #8
392*8fb009dcSAndroid Build Coastguard Worker	veor	q15, q15, q5
393*8fb009dcSAndroid Build Coastguard Worker	vext.8	q11, q4, q4, #8
394*8fb009dcSAndroid Build Coastguard Worker	veor	q9, q9, q1
395*8fb009dcSAndroid Build Coastguard Worker	vext.8	q12, q2, q2, #8
396*8fb009dcSAndroid Build Coastguard Worker	veor	q10, q10, q6
397*8fb009dcSAndroid Build Coastguard Worker	vext.8	q13, q7, q7, #8
398*8fb009dcSAndroid Build Coastguard Worker	veor	q11, q11, q4
399*8fb009dcSAndroid Build Coastguard Worker	veor	q12, q12, q2
400*8fb009dcSAndroid Build Coastguard Worker	veor	q13, q13, q7
401*8fb009dcSAndroid Build Coastguard Worker
402*8fb009dcSAndroid Build Coastguard Worker	veor	q0, q0, q14
403*8fb009dcSAndroid Build Coastguard Worker	veor	q1, q1, q14
404*8fb009dcSAndroid Build Coastguard Worker	veor	q6, q6, q8
405*8fb009dcSAndroid Build Coastguard Worker	veor	q2, q2, q10
406*8fb009dcSAndroid Build Coastguard Worker	veor	q4, q4, q9
407*8fb009dcSAndroid Build Coastguard Worker	veor	q1, q1, q15
408*8fb009dcSAndroid Build Coastguard Worker	veor	q6, q6, q15
409*8fb009dcSAndroid Build Coastguard Worker	veor	q2, q2, q14
410*8fb009dcSAndroid Build Coastguard Worker	veor	q7, q7, q11
411*8fb009dcSAndroid Build Coastguard Worker	veor	q4, q4, q14
412*8fb009dcSAndroid Build Coastguard Worker	veor	q3, q3, q12
413*8fb009dcSAndroid Build Coastguard Worker	veor	q2, q2, q15
414*8fb009dcSAndroid Build Coastguard Worker	veor	q7, q7, q15
415*8fb009dcSAndroid Build Coastguard Worker	veor	q5, q5, q13
416*8fb009dcSAndroid Build Coastguard Worker	vext.8	q8, q0, q0, #12	@ x0 <<< 32
417*8fb009dcSAndroid Build Coastguard Worker	vext.8	q9, q1, q1, #12
418*8fb009dcSAndroid Build Coastguard Worker	veor	q0, q0, q8		@ x0 ^ (x0 <<< 32)
419*8fb009dcSAndroid Build Coastguard Worker	vext.8	q10, q6, q6, #12
420*8fb009dcSAndroid Build Coastguard Worker	veor	q1, q1, q9
421*8fb009dcSAndroid Build Coastguard Worker	vext.8	q11, q4, q4, #12
422*8fb009dcSAndroid Build Coastguard Worker	veor	q6, q6, q10
423*8fb009dcSAndroid Build Coastguard Worker	vext.8	q12, q2, q2, #12
424*8fb009dcSAndroid Build Coastguard Worker	veor	q4, q4, q11
425*8fb009dcSAndroid Build Coastguard Worker	vext.8	q13, q7, q7, #12
426*8fb009dcSAndroid Build Coastguard Worker	veor	q2, q2, q12
427*8fb009dcSAndroid Build Coastguard Worker	vext.8	q14, q3, q3, #12
428*8fb009dcSAndroid Build Coastguard Worker	veor	q7, q7, q13
429*8fb009dcSAndroid Build Coastguard Worker	vext.8	q15, q5, q5, #12
430*8fb009dcSAndroid Build Coastguard Worker	veor	q3, q3, q14
431*8fb009dcSAndroid Build Coastguard Worker
432*8fb009dcSAndroid Build Coastguard Worker	veor	q9, q9, q0
433*8fb009dcSAndroid Build Coastguard Worker	veor	q5, q5, q15
434*8fb009dcSAndroid Build Coastguard Worker	vext.8	q0, q0, q0, #8		@ (x0 ^ (x0 <<< 32)) <<< 64)
435*8fb009dcSAndroid Build Coastguard Worker	veor	q10, q10, q1
436*8fb009dcSAndroid Build Coastguard Worker	veor	q8, q8, q5
437*8fb009dcSAndroid Build Coastguard Worker	veor	q9, q9, q5
438*8fb009dcSAndroid Build Coastguard Worker	vext.8	q1, q1, q1, #8
439*8fb009dcSAndroid Build Coastguard Worker	veor	q13, q13, q2
440*8fb009dcSAndroid Build Coastguard Worker	veor	q0, q0, q8
441*8fb009dcSAndroid Build Coastguard Worker	veor	q14, q14, q7
442*8fb009dcSAndroid Build Coastguard Worker	veor	q1, q1, q9
443*8fb009dcSAndroid Build Coastguard Worker	vext.8	q8, q2, q2, #8
444*8fb009dcSAndroid Build Coastguard Worker	veor	q12, q12, q4
445*8fb009dcSAndroid Build Coastguard Worker	vext.8	q9, q7, q7, #8
446*8fb009dcSAndroid Build Coastguard Worker	veor	q15, q15, q3
447*8fb009dcSAndroid Build Coastguard Worker	vext.8	q2, q4, q4, #8
448*8fb009dcSAndroid Build Coastguard Worker	veor	q11, q11, q6
449*8fb009dcSAndroid Build Coastguard Worker	vext.8	q7, q5, q5, #8
450*8fb009dcSAndroid Build Coastguard Worker	veor	q12, q12, q5
451*8fb009dcSAndroid Build Coastguard Worker	vext.8	q4, q3, q3, #8
452*8fb009dcSAndroid Build Coastguard Worker	veor	q11, q11, q5
453*8fb009dcSAndroid Build Coastguard Worker	vext.8	q3, q6, q6, #8
454*8fb009dcSAndroid Build Coastguard Worker	veor	q5, q9, q13
455*8fb009dcSAndroid Build Coastguard Worker	veor	q11, q11, q2
456*8fb009dcSAndroid Build Coastguard Worker	veor	q7, q7, q15
457*8fb009dcSAndroid Build Coastguard Worker	veor	q6, q4, q14
458*8fb009dcSAndroid Build Coastguard Worker	veor	q4, q8, q12
459*8fb009dcSAndroid Build Coastguard Worker	veor	q2, q3, q10
460*8fb009dcSAndroid Build Coastguard Worker	vmov	q3, q11
461*8fb009dcSAndroid Build Coastguard Worker	 @ vmov	q5, q9
462*8fb009dcSAndroid Build Coastguard Worker	vldmia	r6, {q12}		@ .LISR
463*8fb009dcSAndroid Build Coastguard Worker	ite	eq				@ Thumb2 thing, sanity check in ARM
464*8fb009dcSAndroid Build Coastguard Worker	addeq	r6,r6,#0x10
465*8fb009dcSAndroid Build Coastguard Worker	bne	.Ldec_loop
466*8fb009dcSAndroid Build Coastguard Worker	vldmia	r6, {q12}		@ .LISRM0
467*8fb009dcSAndroid Build Coastguard Worker	b	.Ldec_loop
468*8fb009dcSAndroid Build Coastguard Worker.align	4
469*8fb009dcSAndroid Build Coastguard Worker.Ldec_done:
470*8fb009dcSAndroid Build Coastguard Worker	vmov.i8	q8,#0x55			@ compose .LBS0
471*8fb009dcSAndroid Build Coastguard Worker	vmov.i8	q9,#0x33			@ compose .LBS1
472*8fb009dcSAndroid Build Coastguard Worker	vshr.u64	q10, q3, #1
473*8fb009dcSAndroid Build Coastguard Worker	vshr.u64	q11, q2, #1
474*8fb009dcSAndroid Build Coastguard Worker	veor	q10, q10, q5
475*8fb009dcSAndroid Build Coastguard Worker	veor	q11, q11, q7
476*8fb009dcSAndroid Build Coastguard Worker	vand	q10, q10, q8
477*8fb009dcSAndroid Build Coastguard Worker	vand	q11, q11, q8
478*8fb009dcSAndroid Build Coastguard Worker	veor	q5, q5, q10
479*8fb009dcSAndroid Build Coastguard Worker	vshl.u64	q10, q10, #1
480*8fb009dcSAndroid Build Coastguard Worker	veor	q7, q7, q11
481*8fb009dcSAndroid Build Coastguard Worker	vshl.u64	q11, q11, #1
482*8fb009dcSAndroid Build Coastguard Worker	veor	q3, q3, q10
483*8fb009dcSAndroid Build Coastguard Worker	veor	q2, q2, q11
484*8fb009dcSAndroid Build Coastguard Worker	vshr.u64	q10, q6, #1
485*8fb009dcSAndroid Build Coastguard Worker	vshr.u64	q11, q0, #1
486*8fb009dcSAndroid Build Coastguard Worker	veor	q10, q10, q4
487*8fb009dcSAndroid Build Coastguard Worker	veor	q11, q11, q1
488*8fb009dcSAndroid Build Coastguard Worker	vand	q10, q10, q8
489*8fb009dcSAndroid Build Coastguard Worker	vand	q11, q11, q8
490*8fb009dcSAndroid Build Coastguard Worker	veor	q4, q4, q10
491*8fb009dcSAndroid Build Coastguard Worker	vshl.u64	q10, q10, #1
492*8fb009dcSAndroid Build Coastguard Worker	veor	q1, q1, q11
493*8fb009dcSAndroid Build Coastguard Worker	vshl.u64	q11, q11, #1
494*8fb009dcSAndroid Build Coastguard Worker	veor	q6, q6, q10
495*8fb009dcSAndroid Build Coastguard Worker	veor	q0, q0, q11
496*8fb009dcSAndroid Build Coastguard Worker	vmov.i8	q8,#0x0f			@ compose .LBS2
497*8fb009dcSAndroid Build Coastguard Worker	vshr.u64	q10, q7, #2
498*8fb009dcSAndroid Build Coastguard Worker	vshr.u64	q11, q2, #2
499*8fb009dcSAndroid Build Coastguard Worker	veor	q10, q10, q5
500*8fb009dcSAndroid Build Coastguard Worker	veor	q11, q11, q3
501*8fb009dcSAndroid Build Coastguard Worker	vand	q10, q10, q9
502*8fb009dcSAndroid Build Coastguard Worker	vand	q11, q11, q9
503*8fb009dcSAndroid Build Coastguard Worker	veor	q5, q5, q10
504*8fb009dcSAndroid Build Coastguard Worker	vshl.u64	q10, q10, #2
505*8fb009dcSAndroid Build Coastguard Worker	veor	q3, q3, q11
506*8fb009dcSAndroid Build Coastguard Worker	vshl.u64	q11, q11, #2
507*8fb009dcSAndroid Build Coastguard Worker	veor	q7, q7, q10
508*8fb009dcSAndroid Build Coastguard Worker	veor	q2, q2, q11
509*8fb009dcSAndroid Build Coastguard Worker	vshr.u64	q10, q1, #2
510*8fb009dcSAndroid Build Coastguard Worker	vshr.u64	q11, q0, #2
511*8fb009dcSAndroid Build Coastguard Worker	veor	q10, q10, q4
512*8fb009dcSAndroid Build Coastguard Worker	veor	q11, q11, q6
513*8fb009dcSAndroid Build Coastguard Worker	vand	q10, q10, q9
514*8fb009dcSAndroid Build Coastguard Worker	vand	q11, q11, q9
515*8fb009dcSAndroid Build Coastguard Worker	veor	q4, q4, q10
516*8fb009dcSAndroid Build Coastguard Worker	vshl.u64	q10, q10, #2
517*8fb009dcSAndroid Build Coastguard Worker	veor	q6, q6, q11
518*8fb009dcSAndroid Build Coastguard Worker	vshl.u64	q11, q11, #2
519*8fb009dcSAndroid Build Coastguard Worker	veor	q1, q1, q10
520*8fb009dcSAndroid Build Coastguard Worker	veor	q0, q0, q11
521*8fb009dcSAndroid Build Coastguard Worker	vshr.u64	q10, q4, #4
522*8fb009dcSAndroid Build Coastguard Worker	vshr.u64	q11, q6, #4
523*8fb009dcSAndroid Build Coastguard Worker	veor	q10, q10, q5
524*8fb009dcSAndroid Build Coastguard Worker	veor	q11, q11, q3
525*8fb009dcSAndroid Build Coastguard Worker	vand	q10, q10, q8
526*8fb009dcSAndroid Build Coastguard Worker	vand	q11, q11, q8
527*8fb009dcSAndroid Build Coastguard Worker	veor	q5, q5, q10
528*8fb009dcSAndroid Build Coastguard Worker	vshl.u64	q10, q10, #4
529*8fb009dcSAndroid Build Coastguard Worker	veor	q3, q3, q11
530*8fb009dcSAndroid Build Coastguard Worker	vshl.u64	q11, q11, #4
531*8fb009dcSAndroid Build Coastguard Worker	veor	q4, q4, q10
532*8fb009dcSAndroid Build Coastguard Worker	veor	q6, q6, q11
533*8fb009dcSAndroid Build Coastguard Worker	vshr.u64	q10, q1, #4
534*8fb009dcSAndroid Build Coastguard Worker	vshr.u64	q11, q0, #4
535*8fb009dcSAndroid Build Coastguard Worker	veor	q10, q10, q7
536*8fb009dcSAndroid Build Coastguard Worker	veor	q11, q11, q2
537*8fb009dcSAndroid Build Coastguard Worker	vand	q10, q10, q8
538*8fb009dcSAndroid Build Coastguard Worker	vand	q11, q11, q8
539*8fb009dcSAndroid Build Coastguard Worker	veor	q7, q7, q10
540*8fb009dcSAndroid Build Coastguard Worker	vshl.u64	q10, q10, #4
541*8fb009dcSAndroid Build Coastguard Worker	veor	q2, q2, q11
542*8fb009dcSAndroid Build Coastguard Worker	vshl.u64	q11, q11, #4
543*8fb009dcSAndroid Build Coastguard Worker	veor	q1, q1, q10
544*8fb009dcSAndroid Build Coastguard Worker	veor	q0, q0, q11
545*8fb009dcSAndroid Build Coastguard Worker	vldmia	r4, {q8}			@ last round key
546*8fb009dcSAndroid Build Coastguard Worker	veor	q6, q6, q8
547*8fb009dcSAndroid Build Coastguard Worker	veor	q4, q4, q8
548*8fb009dcSAndroid Build Coastguard Worker	veor	q2, q2, q8
549*8fb009dcSAndroid Build Coastguard Worker	veor	q7, q7, q8
550*8fb009dcSAndroid Build Coastguard Worker	veor	q3, q3, q8
551*8fb009dcSAndroid Build Coastguard Worker	veor	q5, q5, q8
552*8fb009dcSAndroid Build Coastguard Worker	veor	q0, q0, q8
553*8fb009dcSAndroid Build Coastguard Worker	veor	q1, q1, q8
554*8fb009dcSAndroid Build Coastguard Worker	bx	lr
555*8fb009dcSAndroid Build Coastguard Worker.size	_bsaes_decrypt8,.-_bsaes_decrypt8
556*8fb009dcSAndroid Build Coastguard Worker
557*8fb009dcSAndroid Build Coastguard Worker.type	_bsaes_const,%object
558*8fb009dcSAndroid Build Coastguard Worker.align	6
559*8fb009dcSAndroid Build Coastguard Worker_bsaes_const:
560*8fb009dcSAndroid Build Coastguard Worker.LM0ISR:@ InvShiftRows constants
561*8fb009dcSAndroid Build Coastguard Worker.quad	0x0a0e0206070b0f03, 0x0004080c0d010509
562*8fb009dcSAndroid Build Coastguard Worker.LISR:
563*8fb009dcSAndroid Build Coastguard Worker.quad	0x0504070602010003, 0x0f0e0d0c080b0a09
564*8fb009dcSAndroid Build Coastguard Worker.LISRM0:
565*8fb009dcSAndroid Build Coastguard Worker.quad	0x01040b0e0205080f, 0x0306090c00070a0d
566*8fb009dcSAndroid Build Coastguard Worker.LM0SR:@ ShiftRows constants
567*8fb009dcSAndroid Build Coastguard Worker.quad	0x0a0e02060f03070b, 0x0004080c05090d01
568*8fb009dcSAndroid Build Coastguard Worker.LSR:
569*8fb009dcSAndroid Build Coastguard Worker.quad	0x0504070600030201, 0x0f0e0d0c0a09080b
570*8fb009dcSAndroid Build Coastguard Worker.LSRM0:
571*8fb009dcSAndroid Build Coastguard Worker.quad	0x0304090e00050a0f, 0x01060b0c0207080d
572*8fb009dcSAndroid Build Coastguard Worker.LM0:
573*8fb009dcSAndroid Build Coastguard Worker.quad	0x02060a0e03070b0f, 0x0004080c0105090d
574*8fb009dcSAndroid Build Coastguard Worker.LREVM0SR:
575*8fb009dcSAndroid Build Coastguard Worker.quad	0x090d01050c000408, 0x03070b0f060a0e02
576*8fb009dcSAndroid Build Coastguard Worker.byte	66,105,116,45,115,108,105,99,101,100,32,65,69,83,32,102,111,114,32,78,69,79,78,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0
577*8fb009dcSAndroid Build Coastguard Worker.align	2
578*8fb009dcSAndroid Build Coastguard Worker.align	6
579*8fb009dcSAndroid Build Coastguard Worker.size	_bsaes_const,.-_bsaes_const
580*8fb009dcSAndroid Build Coastguard Worker
581*8fb009dcSAndroid Build Coastguard Worker.type	_bsaes_encrypt8,%function
582*8fb009dcSAndroid Build Coastguard Worker.align	4
583*8fb009dcSAndroid Build Coastguard Worker_bsaes_encrypt8:
584*8fb009dcSAndroid Build Coastguard Worker	adr	r6,.
585*8fb009dcSAndroid Build Coastguard Worker	vldmia	r4!, {q9}		@ round 0 key
586*8fb009dcSAndroid Build Coastguard Worker#if defined(__thumb2__) || defined(__APPLE__)
587*8fb009dcSAndroid Build Coastguard Worker	adr	r6,.LM0SR
588*8fb009dcSAndroid Build Coastguard Worker#else
589*8fb009dcSAndroid Build Coastguard Worker	sub	r6,r6,#_bsaes_encrypt8-.LM0SR
590*8fb009dcSAndroid Build Coastguard Worker#endif
591*8fb009dcSAndroid Build Coastguard Worker
592*8fb009dcSAndroid Build Coastguard Worker	vldmia	r6!, {q8}		@ .LM0SR
593*8fb009dcSAndroid Build Coastguard Worker_bsaes_encrypt8_alt:
594*8fb009dcSAndroid Build Coastguard Worker	veor	q10, q0, q9	@ xor with round0 key
595*8fb009dcSAndroid Build Coastguard Worker	veor	q11, q1, q9
596*8fb009dcSAndroid Build Coastguard Worker	vtbl.8	d0, {q10}, d16
597*8fb009dcSAndroid Build Coastguard Worker	vtbl.8	d1, {q10}, d17
598*8fb009dcSAndroid Build Coastguard Worker	veor	q12, q2, q9
599*8fb009dcSAndroid Build Coastguard Worker	vtbl.8	d2, {q11}, d16
600*8fb009dcSAndroid Build Coastguard Worker	vtbl.8	d3, {q11}, d17
601*8fb009dcSAndroid Build Coastguard Worker	veor	q13, q3, q9
602*8fb009dcSAndroid Build Coastguard Worker	vtbl.8	d4, {q12}, d16
603*8fb009dcSAndroid Build Coastguard Worker	vtbl.8	d5, {q12}, d17
604*8fb009dcSAndroid Build Coastguard Worker	veor	q14, q4, q9
605*8fb009dcSAndroid Build Coastguard Worker	vtbl.8	d6, {q13}, d16
606*8fb009dcSAndroid Build Coastguard Worker	vtbl.8	d7, {q13}, d17
607*8fb009dcSAndroid Build Coastguard Worker	veor	q15, q5, q9
608*8fb009dcSAndroid Build Coastguard Worker	vtbl.8	d8, {q14}, d16
609*8fb009dcSAndroid Build Coastguard Worker	vtbl.8	d9, {q14}, d17
610*8fb009dcSAndroid Build Coastguard Worker	veor	q10, q6, q9
611*8fb009dcSAndroid Build Coastguard Worker	vtbl.8	d10, {q15}, d16
612*8fb009dcSAndroid Build Coastguard Worker	vtbl.8	d11, {q15}, d17
613*8fb009dcSAndroid Build Coastguard Worker	veor	q11, q7, q9
614*8fb009dcSAndroid Build Coastguard Worker	vtbl.8	d12, {q10}, d16
615*8fb009dcSAndroid Build Coastguard Worker	vtbl.8	d13, {q10}, d17
616*8fb009dcSAndroid Build Coastguard Worker	vtbl.8	d14, {q11}, d16
617*8fb009dcSAndroid Build Coastguard Worker	vtbl.8	d15, {q11}, d17
618*8fb009dcSAndroid Build Coastguard Worker_bsaes_encrypt8_bitslice:
619*8fb009dcSAndroid Build Coastguard Worker	vmov.i8	q8,#0x55			@ compose .LBS0
620*8fb009dcSAndroid Build Coastguard Worker	vmov.i8	q9,#0x33			@ compose .LBS1
621*8fb009dcSAndroid Build Coastguard Worker	vshr.u64	q10, q6, #1
622*8fb009dcSAndroid Build Coastguard Worker	vshr.u64	q11, q4, #1
623*8fb009dcSAndroid Build Coastguard Worker	veor	q10, q10, q7
624*8fb009dcSAndroid Build Coastguard Worker	veor	q11, q11, q5
625*8fb009dcSAndroid Build Coastguard Worker	vand	q10, q10, q8
626*8fb009dcSAndroid Build Coastguard Worker	vand	q11, q11, q8
627*8fb009dcSAndroid Build Coastguard Worker	veor	q7, q7, q10
628*8fb009dcSAndroid Build Coastguard Worker	vshl.u64	q10, q10, #1
629*8fb009dcSAndroid Build Coastguard Worker	veor	q5, q5, q11
630*8fb009dcSAndroid Build Coastguard Worker	vshl.u64	q11, q11, #1
631*8fb009dcSAndroid Build Coastguard Worker	veor	q6, q6, q10
632*8fb009dcSAndroid Build Coastguard Worker	veor	q4, q4, q11
633*8fb009dcSAndroid Build Coastguard Worker	vshr.u64	q10, q2, #1
634*8fb009dcSAndroid Build Coastguard Worker	vshr.u64	q11, q0, #1
635*8fb009dcSAndroid Build Coastguard Worker	veor	q10, q10, q3
636*8fb009dcSAndroid Build Coastguard Worker	veor	q11, q11, q1
637*8fb009dcSAndroid Build Coastguard Worker	vand	q10, q10, q8
638*8fb009dcSAndroid Build Coastguard Worker	vand	q11, q11, q8
639*8fb009dcSAndroid Build Coastguard Worker	veor	q3, q3, q10
640*8fb009dcSAndroid Build Coastguard Worker	vshl.u64	q10, q10, #1
641*8fb009dcSAndroid Build Coastguard Worker	veor	q1, q1, q11
642*8fb009dcSAndroid Build Coastguard Worker	vshl.u64	q11, q11, #1
643*8fb009dcSAndroid Build Coastguard Worker	veor	q2, q2, q10
644*8fb009dcSAndroid Build Coastguard Worker	veor	q0, q0, q11
645*8fb009dcSAndroid Build Coastguard Worker	vmov.i8	q8,#0x0f			@ compose .LBS2
646*8fb009dcSAndroid Build Coastguard Worker	vshr.u64	q10, q5, #2
647*8fb009dcSAndroid Build Coastguard Worker	vshr.u64	q11, q4, #2
648*8fb009dcSAndroid Build Coastguard Worker	veor	q10, q10, q7
649*8fb009dcSAndroid Build Coastguard Worker	veor	q11, q11, q6
650*8fb009dcSAndroid Build Coastguard Worker	vand	q10, q10, q9
651*8fb009dcSAndroid Build Coastguard Worker	vand	q11, q11, q9
652*8fb009dcSAndroid Build Coastguard Worker	veor	q7, q7, q10
653*8fb009dcSAndroid Build Coastguard Worker	vshl.u64	q10, q10, #2
654*8fb009dcSAndroid Build Coastguard Worker	veor	q6, q6, q11
655*8fb009dcSAndroid Build Coastguard Worker	vshl.u64	q11, q11, #2
656*8fb009dcSAndroid Build Coastguard Worker	veor	q5, q5, q10
657*8fb009dcSAndroid Build Coastguard Worker	veor	q4, q4, q11
658*8fb009dcSAndroid Build Coastguard Worker	vshr.u64	q10, q1, #2
659*8fb009dcSAndroid Build Coastguard Worker	vshr.u64	q11, q0, #2
660*8fb009dcSAndroid Build Coastguard Worker	veor	q10, q10, q3
661*8fb009dcSAndroid Build Coastguard Worker	veor	q11, q11, q2
662*8fb009dcSAndroid Build Coastguard Worker	vand	q10, q10, q9
663*8fb009dcSAndroid Build Coastguard Worker	vand	q11, q11, q9
664*8fb009dcSAndroid Build Coastguard Worker	veor	q3, q3, q10
665*8fb009dcSAndroid Build Coastguard Worker	vshl.u64	q10, q10, #2
666*8fb009dcSAndroid Build Coastguard Worker	veor	q2, q2, q11
667*8fb009dcSAndroid Build Coastguard Worker	vshl.u64	q11, q11, #2
668*8fb009dcSAndroid Build Coastguard Worker	veor	q1, q1, q10
669*8fb009dcSAndroid Build Coastguard Worker	veor	q0, q0, q11
670*8fb009dcSAndroid Build Coastguard Worker	vshr.u64	q10, q3, #4
671*8fb009dcSAndroid Build Coastguard Worker	vshr.u64	q11, q2, #4
672*8fb009dcSAndroid Build Coastguard Worker	veor	q10, q10, q7
673*8fb009dcSAndroid Build Coastguard Worker	veor	q11, q11, q6
674*8fb009dcSAndroid Build Coastguard Worker	vand	q10, q10, q8
675*8fb009dcSAndroid Build Coastguard Worker	vand	q11, q11, q8
676*8fb009dcSAndroid Build Coastguard Worker	veor	q7, q7, q10
677*8fb009dcSAndroid Build Coastguard Worker	vshl.u64	q10, q10, #4
678*8fb009dcSAndroid Build Coastguard Worker	veor	q6, q6, q11
679*8fb009dcSAndroid Build Coastguard Worker	vshl.u64	q11, q11, #4
680*8fb009dcSAndroid Build Coastguard Worker	veor	q3, q3, q10
681*8fb009dcSAndroid Build Coastguard Worker	veor	q2, q2, q11
682*8fb009dcSAndroid Build Coastguard Worker	vshr.u64	q10, q1, #4
683*8fb009dcSAndroid Build Coastguard Worker	vshr.u64	q11, q0, #4
684*8fb009dcSAndroid Build Coastguard Worker	veor	q10, q10, q5
685*8fb009dcSAndroid Build Coastguard Worker	veor	q11, q11, q4
686*8fb009dcSAndroid Build Coastguard Worker	vand	q10, q10, q8
687*8fb009dcSAndroid Build Coastguard Worker	vand	q11, q11, q8
688*8fb009dcSAndroid Build Coastguard Worker	veor	q5, q5, q10
689*8fb009dcSAndroid Build Coastguard Worker	vshl.u64	q10, q10, #4
690*8fb009dcSAndroid Build Coastguard Worker	veor	q4, q4, q11
691*8fb009dcSAndroid Build Coastguard Worker	vshl.u64	q11, q11, #4
692*8fb009dcSAndroid Build Coastguard Worker	veor	q1, q1, q10
693*8fb009dcSAndroid Build Coastguard Worker	veor	q0, q0, q11
694*8fb009dcSAndroid Build Coastguard Worker	sub	r5,r5,#1
695*8fb009dcSAndroid Build Coastguard Worker	b	.Lenc_sbox
696*8fb009dcSAndroid Build Coastguard Worker.align	4
697*8fb009dcSAndroid Build Coastguard Worker.Lenc_loop:
698*8fb009dcSAndroid Build Coastguard Worker	vldmia	r4!, {q8,q9,q10,q11}
699*8fb009dcSAndroid Build Coastguard Worker	veor	q8, q8, q0
700*8fb009dcSAndroid Build Coastguard Worker	veor	q9, q9, q1
701*8fb009dcSAndroid Build Coastguard Worker	vtbl.8	d0, {q8}, d24
702*8fb009dcSAndroid Build Coastguard Worker	vtbl.8	d1, {q8}, d25
703*8fb009dcSAndroid Build Coastguard Worker	vldmia	r4!, {q8}
704*8fb009dcSAndroid Build Coastguard Worker	veor	q10, q10, q2
705*8fb009dcSAndroid Build Coastguard Worker	vtbl.8	d2, {q9}, d24
706*8fb009dcSAndroid Build Coastguard Worker	vtbl.8	d3, {q9}, d25
707*8fb009dcSAndroid Build Coastguard Worker	vldmia	r4!, {q9}
708*8fb009dcSAndroid Build Coastguard Worker	veor	q11, q11, q3
709*8fb009dcSAndroid Build Coastguard Worker	vtbl.8	d4, {q10}, d24
710*8fb009dcSAndroid Build Coastguard Worker	vtbl.8	d5, {q10}, d25
711*8fb009dcSAndroid Build Coastguard Worker	vldmia	r4!, {q10}
712*8fb009dcSAndroid Build Coastguard Worker	vtbl.8	d6, {q11}, d24
713*8fb009dcSAndroid Build Coastguard Worker	vtbl.8	d7, {q11}, d25
714*8fb009dcSAndroid Build Coastguard Worker	vldmia	r4!, {q11}
715*8fb009dcSAndroid Build Coastguard Worker	veor	q8, q8, q4
716*8fb009dcSAndroid Build Coastguard Worker	veor	q9, q9, q5
717*8fb009dcSAndroid Build Coastguard Worker	vtbl.8	d8, {q8}, d24
718*8fb009dcSAndroid Build Coastguard Worker	vtbl.8	d9, {q8}, d25
719*8fb009dcSAndroid Build Coastguard Worker	veor	q10, q10, q6
720*8fb009dcSAndroid Build Coastguard Worker	vtbl.8	d10, {q9}, d24
721*8fb009dcSAndroid Build Coastguard Worker	vtbl.8	d11, {q9}, d25
722*8fb009dcSAndroid Build Coastguard Worker	veor	q11, q11, q7
723*8fb009dcSAndroid Build Coastguard Worker	vtbl.8	d12, {q10}, d24
724*8fb009dcSAndroid Build Coastguard Worker	vtbl.8	d13, {q10}, d25
725*8fb009dcSAndroid Build Coastguard Worker	vtbl.8	d14, {q11}, d24
726*8fb009dcSAndroid Build Coastguard Worker	vtbl.8	d15, {q11}, d25
727*8fb009dcSAndroid Build Coastguard Worker.Lenc_sbox:
728*8fb009dcSAndroid Build Coastguard Worker	veor	q2, q2, q1
729*8fb009dcSAndroid Build Coastguard Worker	veor	q5, q5, q6
730*8fb009dcSAndroid Build Coastguard Worker	veor	q3, q3, q0
731*8fb009dcSAndroid Build Coastguard Worker	veor	q6, q6, q2
732*8fb009dcSAndroid Build Coastguard Worker	veor	q5, q5, q0
733*8fb009dcSAndroid Build Coastguard Worker
734*8fb009dcSAndroid Build Coastguard Worker	veor	q6, q6, q3
735*8fb009dcSAndroid Build Coastguard Worker	veor	q3, q3, q7
736*8fb009dcSAndroid Build Coastguard Worker	veor	q7, q7, q5
737*8fb009dcSAndroid Build Coastguard Worker	veor	q3, q3, q4
738*8fb009dcSAndroid Build Coastguard Worker	veor	q4, q4, q5
739*8fb009dcSAndroid Build Coastguard Worker
740*8fb009dcSAndroid Build Coastguard Worker	veor	q2, q2, q7
741*8fb009dcSAndroid Build Coastguard Worker	veor	q3, q3, q1
742*8fb009dcSAndroid Build Coastguard Worker	veor	q1, q1, q5
743*8fb009dcSAndroid Build Coastguard Worker	veor	q11, q7, q4
744*8fb009dcSAndroid Build Coastguard Worker	veor	q10, q1, q2
745*8fb009dcSAndroid Build Coastguard Worker	veor	q9, q5, q3
746*8fb009dcSAndroid Build Coastguard Worker	veor	q13, q2, q4
747*8fb009dcSAndroid Build Coastguard Worker	vmov	q8, q10
748*8fb009dcSAndroid Build Coastguard Worker	veor	q12, q6, q0
749*8fb009dcSAndroid Build Coastguard Worker
750*8fb009dcSAndroid Build Coastguard Worker	vorr	q10, q10, q9
751*8fb009dcSAndroid Build Coastguard Worker	veor	q15, q11, q8
752*8fb009dcSAndroid Build Coastguard Worker	vand	q14, q11, q12
753*8fb009dcSAndroid Build Coastguard Worker	vorr	q11, q11, q12
754*8fb009dcSAndroid Build Coastguard Worker	veor	q12, q12, q9
755*8fb009dcSAndroid Build Coastguard Worker	vand	q8, q8, q9
756*8fb009dcSAndroid Build Coastguard Worker	veor	q9, q3, q0
757*8fb009dcSAndroid Build Coastguard Worker	vand	q15, q15, q12
758*8fb009dcSAndroid Build Coastguard Worker	vand	q13, q13, q9
759*8fb009dcSAndroid Build Coastguard Worker	veor	q9, q7, q1
760*8fb009dcSAndroid Build Coastguard Worker	veor	q12, q5, q6
761*8fb009dcSAndroid Build Coastguard Worker	veor	q11, q11, q13
762*8fb009dcSAndroid Build Coastguard Worker	veor	q10, q10, q13
763*8fb009dcSAndroid Build Coastguard Worker	vand	q13, q9, q12
764*8fb009dcSAndroid Build Coastguard Worker	vorr	q9, q9, q12
765*8fb009dcSAndroid Build Coastguard Worker	veor	q11, q11, q15
766*8fb009dcSAndroid Build Coastguard Worker	veor	q8, q8, q13
767*8fb009dcSAndroid Build Coastguard Worker	veor	q10, q10, q14
768*8fb009dcSAndroid Build Coastguard Worker	veor	q9, q9, q15
769*8fb009dcSAndroid Build Coastguard Worker	veor	q8, q8, q14
770*8fb009dcSAndroid Build Coastguard Worker	vand	q12, q2, q3
771*8fb009dcSAndroid Build Coastguard Worker	veor	q9, q9, q14
772*8fb009dcSAndroid Build Coastguard Worker	vand	q13, q4, q0
773*8fb009dcSAndroid Build Coastguard Worker	vand	q14, q1, q5
774*8fb009dcSAndroid Build Coastguard Worker	vorr	q15, q7, q6
775*8fb009dcSAndroid Build Coastguard Worker	veor	q11, q11, q12
776*8fb009dcSAndroid Build Coastguard Worker	veor	q9, q9, q14
777*8fb009dcSAndroid Build Coastguard Worker	veor	q8, q8, q15
778*8fb009dcSAndroid Build Coastguard Worker	veor	q10, q10, q13
779*8fb009dcSAndroid Build Coastguard Worker
780*8fb009dcSAndroid Build Coastguard Worker	@ Inv_GF16 	0, 	1, 	2, 	3, s0, s1, s2, s3
781*8fb009dcSAndroid Build Coastguard Worker
782*8fb009dcSAndroid Build Coastguard Worker	@ new smaller inversion
783*8fb009dcSAndroid Build Coastguard Worker
784*8fb009dcSAndroid Build Coastguard Worker	vand	q14, q11, q9
785*8fb009dcSAndroid Build Coastguard Worker	vmov	q12, q8
786*8fb009dcSAndroid Build Coastguard Worker
787*8fb009dcSAndroid Build Coastguard Worker	veor	q13, q10, q14
788*8fb009dcSAndroid Build Coastguard Worker	veor	q15, q8, q14
789*8fb009dcSAndroid Build Coastguard Worker	veor	q14, q8, q14	@ q14=q15
790*8fb009dcSAndroid Build Coastguard Worker
791*8fb009dcSAndroid Build Coastguard Worker	vbsl	q13, q9, q8
792*8fb009dcSAndroid Build Coastguard Worker	vbsl	q15, q11, q10
793*8fb009dcSAndroid Build Coastguard Worker	veor	q11, q11, q10
794*8fb009dcSAndroid Build Coastguard Worker
795*8fb009dcSAndroid Build Coastguard Worker	vbsl	q12, q13, q14
796*8fb009dcSAndroid Build Coastguard Worker	vbsl	q8, q14, q13
797*8fb009dcSAndroid Build Coastguard Worker
798*8fb009dcSAndroid Build Coastguard Worker	vand	q14, q12, q15
799*8fb009dcSAndroid Build Coastguard Worker	veor	q9, q9, q8
800*8fb009dcSAndroid Build Coastguard Worker
801*8fb009dcSAndroid Build Coastguard Worker	veor	q14, q14, q11
802*8fb009dcSAndroid Build Coastguard Worker	veor	q12, q6, q0
803*8fb009dcSAndroid Build Coastguard Worker	veor	q8, q5, q3
804*8fb009dcSAndroid Build Coastguard Worker	veor	q10, q15, q14
805*8fb009dcSAndroid Build Coastguard Worker	vand	q10, q10, q6
806*8fb009dcSAndroid Build Coastguard Worker	veor	q6, q6, q5
807*8fb009dcSAndroid Build Coastguard Worker	vand	q11, q5, q15
808*8fb009dcSAndroid Build Coastguard Worker	vand	q6, q6, q14
809*8fb009dcSAndroid Build Coastguard Worker	veor	q5, q11, q10
810*8fb009dcSAndroid Build Coastguard Worker	veor	q6, q6, q11
811*8fb009dcSAndroid Build Coastguard Worker	veor	q15, q15, q13
812*8fb009dcSAndroid Build Coastguard Worker	veor	q14, q14, q9
813*8fb009dcSAndroid Build Coastguard Worker	veor	q11, q15, q14
814*8fb009dcSAndroid Build Coastguard Worker	veor	q10, q13, q9
815*8fb009dcSAndroid Build Coastguard Worker	vand	q11, q11, q12
816*8fb009dcSAndroid Build Coastguard Worker	vand	q10, q10, q0
817*8fb009dcSAndroid Build Coastguard Worker	veor	q12, q12, q8
818*8fb009dcSAndroid Build Coastguard Worker	veor	q0, q0, q3
819*8fb009dcSAndroid Build Coastguard Worker	vand	q8, q8, q15
820*8fb009dcSAndroid Build Coastguard Worker	vand	q3, q3, q13
821*8fb009dcSAndroid Build Coastguard Worker	vand	q12, q12, q14
822*8fb009dcSAndroid Build Coastguard Worker	vand	q0, q0, q9
823*8fb009dcSAndroid Build Coastguard Worker	veor	q8, q8, q12
824*8fb009dcSAndroid Build Coastguard Worker	veor	q0, q0, q3
825*8fb009dcSAndroid Build Coastguard Worker	veor	q12, q12, q11
826*8fb009dcSAndroid Build Coastguard Worker	veor	q3, q3, q10
827*8fb009dcSAndroid Build Coastguard Worker	veor	q6, q6, q12
828*8fb009dcSAndroid Build Coastguard Worker	veor	q0, q0, q12
829*8fb009dcSAndroid Build Coastguard Worker	veor	q5, q5, q8
830*8fb009dcSAndroid Build Coastguard Worker	veor	q3, q3, q8
831*8fb009dcSAndroid Build Coastguard Worker
832*8fb009dcSAndroid Build Coastguard Worker	veor	q12, q7, q4
833*8fb009dcSAndroid Build Coastguard Worker	veor	q8, q1, q2
834*8fb009dcSAndroid Build Coastguard Worker	veor	q11, q15, q14
835*8fb009dcSAndroid Build Coastguard Worker	veor	q10, q13, q9
836*8fb009dcSAndroid Build Coastguard Worker	vand	q11, q11, q12
837*8fb009dcSAndroid Build Coastguard Worker	vand	q10, q10, q4
838*8fb009dcSAndroid Build Coastguard Worker	veor	q12, q12, q8
839*8fb009dcSAndroid Build Coastguard Worker	veor	q4, q4, q2
840*8fb009dcSAndroid Build Coastguard Worker	vand	q8, q8, q15
841*8fb009dcSAndroid Build Coastguard Worker	vand	q2, q2, q13
842*8fb009dcSAndroid Build Coastguard Worker	vand	q12, q12, q14
843*8fb009dcSAndroid Build Coastguard Worker	vand	q4, q4, q9
844*8fb009dcSAndroid Build Coastguard Worker	veor	q8, q8, q12
845*8fb009dcSAndroid Build Coastguard Worker	veor	q4, q4, q2
846*8fb009dcSAndroid Build Coastguard Worker	veor	q12, q12, q11
847*8fb009dcSAndroid Build Coastguard Worker	veor	q2, q2, q10
848*8fb009dcSAndroid Build Coastguard Worker	veor	q15, q15, q13
849*8fb009dcSAndroid Build Coastguard Worker	veor	q14, q14, q9
850*8fb009dcSAndroid Build Coastguard Worker	veor	q10, q15, q14
851*8fb009dcSAndroid Build Coastguard Worker	vand	q10, q10, q7
852*8fb009dcSAndroid Build Coastguard Worker	veor	q7, q7, q1
853*8fb009dcSAndroid Build Coastguard Worker	vand	q11, q1, q15
854*8fb009dcSAndroid Build Coastguard Worker	vand	q7, q7, q14
855*8fb009dcSAndroid Build Coastguard Worker	veor	q1, q11, q10
856*8fb009dcSAndroid Build Coastguard Worker	veor	q7, q7, q11
857*8fb009dcSAndroid Build Coastguard Worker	veor	q7, q7, q12
858*8fb009dcSAndroid Build Coastguard Worker	veor	q4, q4, q12
859*8fb009dcSAndroid Build Coastguard Worker	veor	q1, q1, q8
860*8fb009dcSAndroid Build Coastguard Worker	veor	q2, q2, q8
861*8fb009dcSAndroid Build Coastguard Worker	veor	q7, q7, q0
862*8fb009dcSAndroid Build Coastguard Worker	veor	q1, q1, q6
863*8fb009dcSAndroid Build Coastguard Worker	veor	q6, q6, q0
864*8fb009dcSAndroid Build Coastguard Worker	veor	q4, q4, q7
865*8fb009dcSAndroid Build Coastguard Worker	veor	q0, q0, q1
866*8fb009dcSAndroid Build Coastguard Worker
867*8fb009dcSAndroid Build Coastguard Worker	veor	q1, q1, q5
868*8fb009dcSAndroid Build Coastguard Worker	veor	q5, q5, q2
869*8fb009dcSAndroid Build Coastguard Worker	veor	q2, q2, q3
870*8fb009dcSAndroid Build Coastguard Worker	veor	q3, q3, q5
871*8fb009dcSAndroid Build Coastguard Worker	veor	q4, q4, q5
872*8fb009dcSAndroid Build Coastguard Worker
873*8fb009dcSAndroid Build Coastguard Worker	veor	q6, q6, q3
874*8fb009dcSAndroid Build Coastguard Worker	subs	r5,r5,#1
875*8fb009dcSAndroid Build Coastguard Worker	bcc	.Lenc_done
876*8fb009dcSAndroid Build Coastguard Worker	vext.8	q8, q0, q0, #12	@ x0 <<< 32
877*8fb009dcSAndroid Build Coastguard Worker	vext.8	q9, q1, q1, #12
878*8fb009dcSAndroid Build Coastguard Worker	veor	q0, q0, q8		@ x0 ^ (x0 <<< 32)
879*8fb009dcSAndroid Build Coastguard Worker	vext.8	q10, q4, q4, #12
880*8fb009dcSAndroid Build Coastguard Worker	veor	q1, q1, q9
881*8fb009dcSAndroid Build Coastguard Worker	vext.8	q11, q6, q6, #12
882*8fb009dcSAndroid Build Coastguard Worker	veor	q4, q4, q10
883*8fb009dcSAndroid Build Coastguard Worker	vext.8	q12, q3, q3, #12
884*8fb009dcSAndroid Build Coastguard Worker	veor	q6, q6, q11
885*8fb009dcSAndroid Build Coastguard Worker	vext.8	q13, q7, q7, #12
886*8fb009dcSAndroid Build Coastguard Worker	veor	q3, q3, q12
887*8fb009dcSAndroid Build Coastguard Worker	vext.8	q14, q2, q2, #12
888*8fb009dcSAndroid Build Coastguard Worker	veor	q7, q7, q13
889*8fb009dcSAndroid Build Coastguard Worker	vext.8	q15, q5, q5, #12
890*8fb009dcSAndroid Build Coastguard Worker	veor	q2, q2, q14
891*8fb009dcSAndroid Build Coastguard Worker
892*8fb009dcSAndroid Build Coastguard Worker	veor	q9, q9, q0
893*8fb009dcSAndroid Build Coastguard Worker	veor	q5, q5, q15
894*8fb009dcSAndroid Build Coastguard Worker	vext.8	q0, q0, q0, #8		@ (x0 ^ (x0 <<< 32)) <<< 64)
895*8fb009dcSAndroid Build Coastguard Worker	veor	q10, q10, q1
896*8fb009dcSAndroid Build Coastguard Worker	veor	q8, q8, q5
897*8fb009dcSAndroid Build Coastguard Worker	veor	q9, q9, q5
898*8fb009dcSAndroid Build Coastguard Worker	vext.8	q1, q1, q1, #8
899*8fb009dcSAndroid Build Coastguard Worker	veor	q13, q13, q3
900*8fb009dcSAndroid Build Coastguard Worker	veor	q0, q0, q8
901*8fb009dcSAndroid Build Coastguard Worker	veor	q14, q14, q7
902*8fb009dcSAndroid Build Coastguard Worker	veor	q1, q1, q9
903*8fb009dcSAndroid Build Coastguard Worker	vext.8	q8, q3, q3, #8
904*8fb009dcSAndroid Build Coastguard Worker	veor	q12, q12, q6
905*8fb009dcSAndroid Build Coastguard Worker	vext.8	q9, q7, q7, #8
906*8fb009dcSAndroid Build Coastguard Worker	veor	q15, q15, q2
907*8fb009dcSAndroid Build Coastguard Worker	vext.8	q3, q6, q6, #8
908*8fb009dcSAndroid Build Coastguard Worker	veor	q11, q11, q4
909*8fb009dcSAndroid Build Coastguard Worker	vext.8	q7, q5, q5, #8
910*8fb009dcSAndroid Build Coastguard Worker	veor	q12, q12, q5
911*8fb009dcSAndroid Build Coastguard Worker	vext.8	q6, q2, q2, #8
912*8fb009dcSAndroid Build Coastguard Worker	veor	q11, q11, q5
913*8fb009dcSAndroid Build Coastguard Worker	vext.8	q2, q4, q4, #8
914*8fb009dcSAndroid Build Coastguard Worker	veor	q5, q9, q13
915*8fb009dcSAndroid Build Coastguard Worker	veor	q4, q8, q12
916*8fb009dcSAndroid Build Coastguard Worker	veor	q3, q3, q11
917*8fb009dcSAndroid Build Coastguard Worker	veor	q7, q7, q15
918*8fb009dcSAndroid Build Coastguard Worker	veor	q6, q6, q14
919*8fb009dcSAndroid Build Coastguard Worker	 @ vmov	q4, q8
920*8fb009dcSAndroid Build Coastguard Worker	veor	q2, q2, q10
921*8fb009dcSAndroid Build Coastguard Worker	 @ vmov	q5, q9
922*8fb009dcSAndroid Build Coastguard Worker	vldmia	r6, {q12}		@ .LSR
923*8fb009dcSAndroid Build Coastguard Worker	ite	eq				@ Thumb2 thing, samity check in ARM
924*8fb009dcSAndroid Build Coastguard Worker	addeq	r6,r6,#0x10
925*8fb009dcSAndroid Build Coastguard Worker	bne	.Lenc_loop
926*8fb009dcSAndroid Build Coastguard Worker	vldmia	r6, {q12}		@ .LSRM0
927*8fb009dcSAndroid Build Coastguard Worker	b	.Lenc_loop
928*8fb009dcSAndroid Build Coastguard Worker.align	4
929*8fb009dcSAndroid Build Coastguard Worker.Lenc_done:
930*8fb009dcSAndroid Build Coastguard Worker	vmov.i8	q8,#0x55			@ compose .LBS0
931*8fb009dcSAndroid Build Coastguard Worker	vmov.i8	q9,#0x33			@ compose .LBS1
932*8fb009dcSAndroid Build Coastguard Worker	vshr.u64	q10, q2, #1
933*8fb009dcSAndroid Build Coastguard Worker	vshr.u64	q11, q3, #1
934*8fb009dcSAndroid Build Coastguard Worker	veor	q10, q10, q5
935*8fb009dcSAndroid Build Coastguard Worker	veor	q11, q11, q7
936*8fb009dcSAndroid Build Coastguard Worker	vand	q10, q10, q8
937*8fb009dcSAndroid Build Coastguard Worker	vand	q11, q11, q8
938*8fb009dcSAndroid Build Coastguard Worker	veor	q5, q5, q10
939*8fb009dcSAndroid Build Coastguard Worker	vshl.u64	q10, q10, #1
940*8fb009dcSAndroid Build Coastguard Worker	veor	q7, q7, q11
941*8fb009dcSAndroid Build Coastguard Worker	vshl.u64	q11, q11, #1
942*8fb009dcSAndroid Build Coastguard Worker	veor	q2, q2, q10
943*8fb009dcSAndroid Build Coastguard Worker	veor	q3, q3, q11
944*8fb009dcSAndroid Build Coastguard Worker	vshr.u64	q10, q4, #1
945*8fb009dcSAndroid Build Coastguard Worker	vshr.u64	q11, q0, #1
946*8fb009dcSAndroid Build Coastguard Worker	veor	q10, q10, q6
947*8fb009dcSAndroid Build Coastguard Worker	veor	q11, q11, q1
948*8fb009dcSAndroid Build Coastguard Worker	vand	q10, q10, q8
949*8fb009dcSAndroid Build Coastguard Worker	vand	q11, q11, q8
950*8fb009dcSAndroid Build Coastguard Worker	veor	q6, q6, q10
951*8fb009dcSAndroid Build Coastguard Worker	vshl.u64	q10, q10, #1
952*8fb009dcSAndroid Build Coastguard Worker	veor	q1, q1, q11
953*8fb009dcSAndroid Build Coastguard Worker	vshl.u64	q11, q11, #1
954*8fb009dcSAndroid Build Coastguard Worker	veor	q4, q4, q10
955*8fb009dcSAndroid Build Coastguard Worker	veor	q0, q0, q11
956*8fb009dcSAndroid Build Coastguard Worker	vmov.i8	q8,#0x0f			@ compose .LBS2
957*8fb009dcSAndroid Build Coastguard Worker	vshr.u64	q10, q7, #2
958*8fb009dcSAndroid Build Coastguard Worker	vshr.u64	q11, q3, #2
959*8fb009dcSAndroid Build Coastguard Worker	veor	q10, q10, q5
960*8fb009dcSAndroid Build Coastguard Worker	veor	q11, q11, q2
961*8fb009dcSAndroid Build Coastguard Worker	vand	q10, q10, q9
962*8fb009dcSAndroid Build Coastguard Worker	vand	q11, q11, q9
963*8fb009dcSAndroid Build Coastguard Worker	veor	q5, q5, q10
964*8fb009dcSAndroid Build Coastguard Worker	vshl.u64	q10, q10, #2
965*8fb009dcSAndroid Build Coastguard Worker	veor	q2, q2, q11
966*8fb009dcSAndroid Build Coastguard Worker	vshl.u64	q11, q11, #2
967*8fb009dcSAndroid Build Coastguard Worker	veor	q7, q7, q10
968*8fb009dcSAndroid Build Coastguard Worker	veor	q3, q3, q11
969*8fb009dcSAndroid Build Coastguard Worker	vshr.u64	q10, q1, #2
970*8fb009dcSAndroid Build Coastguard Worker	vshr.u64	q11, q0, #2
971*8fb009dcSAndroid Build Coastguard Worker	veor	q10, q10, q6
972*8fb009dcSAndroid Build Coastguard Worker	veor	q11, q11, q4
973*8fb009dcSAndroid Build Coastguard Worker	vand	q10, q10, q9
974*8fb009dcSAndroid Build Coastguard Worker	vand	q11, q11, q9
975*8fb009dcSAndroid Build Coastguard Worker	veor	q6, q6, q10
976*8fb009dcSAndroid Build Coastguard Worker	vshl.u64	q10, q10, #2
977*8fb009dcSAndroid Build Coastguard Worker	veor	q4, q4, q11
978*8fb009dcSAndroid Build Coastguard Worker	vshl.u64	q11, q11, #2
979*8fb009dcSAndroid Build Coastguard Worker	veor	q1, q1, q10
980*8fb009dcSAndroid Build Coastguard Worker	veor	q0, q0, q11
981*8fb009dcSAndroid Build Coastguard Worker	vshr.u64	q10, q6, #4
982*8fb009dcSAndroid Build Coastguard Worker	vshr.u64	q11, q4, #4
983*8fb009dcSAndroid Build Coastguard Worker	veor	q10, q10, q5
984*8fb009dcSAndroid Build Coastguard Worker	veor	q11, q11, q2
985*8fb009dcSAndroid Build Coastguard Worker	vand	q10, q10, q8
986*8fb009dcSAndroid Build Coastguard Worker	vand	q11, q11, q8
987*8fb009dcSAndroid Build Coastguard Worker	veor	q5, q5, q10
988*8fb009dcSAndroid Build Coastguard Worker	vshl.u64	q10, q10, #4
989*8fb009dcSAndroid Build Coastguard Worker	veor	q2, q2, q11
990*8fb009dcSAndroid Build Coastguard Worker	vshl.u64	q11, q11, #4
991*8fb009dcSAndroid Build Coastguard Worker	veor	q6, q6, q10
992*8fb009dcSAndroid Build Coastguard Worker	veor	q4, q4, q11
993*8fb009dcSAndroid Build Coastguard Worker	vshr.u64	q10, q1, #4
994*8fb009dcSAndroid Build Coastguard Worker	vshr.u64	q11, q0, #4
995*8fb009dcSAndroid Build Coastguard Worker	veor	q10, q10, q7
996*8fb009dcSAndroid Build Coastguard Worker	veor	q11, q11, q3
997*8fb009dcSAndroid Build Coastguard Worker	vand	q10, q10, q8
998*8fb009dcSAndroid Build Coastguard Worker	vand	q11, q11, q8
999*8fb009dcSAndroid Build Coastguard Worker	veor	q7, q7, q10
1000*8fb009dcSAndroid Build Coastguard Worker	vshl.u64	q10, q10, #4
1001*8fb009dcSAndroid Build Coastguard Worker	veor	q3, q3, q11
1002*8fb009dcSAndroid Build Coastguard Worker	vshl.u64	q11, q11, #4
1003*8fb009dcSAndroid Build Coastguard Worker	veor	q1, q1, q10
1004*8fb009dcSAndroid Build Coastguard Worker	veor	q0, q0, q11
1005*8fb009dcSAndroid Build Coastguard Worker	vldmia	r4, {q8}			@ last round key
1006*8fb009dcSAndroid Build Coastguard Worker	veor	q4, q4, q8
1007*8fb009dcSAndroid Build Coastguard Worker	veor	q6, q6, q8
1008*8fb009dcSAndroid Build Coastguard Worker	veor	q3, q3, q8
1009*8fb009dcSAndroid Build Coastguard Worker	veor	q7, q7, q8
1010*8fb009dcSAndroid Build Coastguard Worker	veor	q2, q2, q8
1011*8fb009dcSAndroid Build Coastguard Worker	veor	q5, q5, q8
1012*8fb009dcSAndroid Build Coastguard Worker	veor	q0, q0, q8
1013*8fb009dcSAndroid Build Coastguard Worker	veor	q1, q1, q8
1014*8fb009dcSAndroid Build Coastguard Worker	bx	lr
1015*8fb009dcSAndroid Build Coastguard Worker.size	_bsaes_encrypt8,.-_bsaes_encrypt8
1016*8fb009dcSAndroid Build Coastguard Worker.type	_bsaes_key_convert,%function
1017*8fb009dcSAndroid Build Coastguard Worker.align	4
1018*8fb009dcSAndroid Build Coastguard Worker_bsaes_key_convert:
1019*8fb009dcSAndroid Build Coastguard Worker	adr	r6,.
1020*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q7},  [r4]!		@ load round 0 key
1021*8fb009dcSAndroid Build Coastguard Worker#if defined(__thumb2__) || defined(__APPLE__)
1022*8fb009dcSAndroid Build Coastguard Worker	adr	r6,.LM0
1023*8fb009dcSAndroid Build Coastguard Worker#else
1024*8fb009dcSAndroid Build Coastguard Worker	sub	r6,r6,#_bsaes_key_convert-.LM0
1025*8fb009dcSAndroid Build Coastguard Worker#endif
1026*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q15}, [r4]!		@ load round 1 key
1027*8fb009dcSAndroid Build Coastguard Worker
1028*8fb009dcSAndroid Build Coastguard Worker	vmov.i8	q8,  #0x01			@ bit masks
1029*8fb009dcSAndroid Build Coastguard Worker	vmov.i8	q9,  #0x02
1030*8fb009dcSAndroid Build Coastguard Worker	vmov.i8	q10, #0x04
1031*8fb009dcSAndroid Build Coastguard Worker	vmov.i8	q11, #0x08
1032*8fb009dcSAndroid Build Coastguard Worker	vmov.i8	q12, #0x10
1033*8fb009dcSAndroid Build Coastguard Worker	vmov.i8	q13, #0x20
1034*8fb009dcSAndroid Build Coastguard Worker	vldmia	r6, {q14}		@ .LM0
1035*8fb009dcSAndroid Build Coastguard Worker
1036*8fb009dcSAndroid Build Coastguard Worker#ifdef __ARMEL__
1037*8fb009dcSAndroid Build Coastguard Worker	vrev32.8	q7,  q7
1038*8fb009dcSAndroid Build Coastguard Worker	vrev32.8	q15, q15
1039*8fb009dcSAndroid Build Coastguard Worker#endif
1040*8fb009dcSAndroid Build Coastguard Worker	sub	r5,r5,#1
1041*8fb009dcSAndroid Build Coastguard Worker	vstmia	r12!, {q7}		@ save round 0 key
1042*8fb009dcSAndroid Build Coastguard Worker	b	.Lkey_loop
1043*8fb009dcSAndroid Build Coastguard Worker
1044*8fb009dcSAndroid Build Coastguard Worker.align	4
1045*8fb009dcSAndroid Build Coastguard Worker.Lkey_loop:
1046*8fb009dcSAndroid Build Coastguard Worker	vtbl.8	d14,{q15},d28
1047*8fb009dcSAndroid Build Coastguard Worker	vtbl.8	d15,{q15},d29
1048*8fb009dcSAndroid Build Coastguard Worker	vmov.i8	q6,  #0x40
1049*8fb009dcSAndroid Build Coastguard Worker	vmov.i8	q15, #0x80
1050*8fb009dcSAndroid Build Coastguard Worker
1051*8fb009dcSAndroid Build Coastguard Worker	vtst.8	q0, q7, q8
1052*8fb009dcSAndroid Build Coastguard Worker	vtst.8	q1, q7, q9
1053*8fb009dcSAndroid Build Coastguard Worker	vtst.8	q2, q7, q10
1054*8fb009dcSAndroid Build Coastguard Worker	vtst.8	q3, q7, q11
1055*8fb009dcSAndroid Build Coastguard Worker	vtst.8	q4, q7, q12
1056*8fb009dcSAndroid Build Coastguard Worker	vtst.8	q5, q7, q13
1057*8fb009dcSAndroid Build Coastguard Worker	vtst.8	q6, q7, q6
1058*8fb009dcSAndroid Build Coastguard Worker	vtst.8	q7, q7, q15
1059*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q15}, [r4]!		@ load next round key
1060*8fb009dcSAndroid Build Coastguard Worker	vmvn	q0, q0		@ "pnot"
1061*8fb009dcSAndroid Build Coastguard Worker	vmvn	q1, q1
1062*8fb009dcSAndroid Build Coastguard Worker	vmvn	q5, q5
1063*8fb009dcSAndroid Build Coastguard Worker	vmvn	q6, q6
1064*8fb009dcSAndroid Build Coastguard Worker#ifdef __ARMEL__
1065*8fb009dcSAndroid Build Coastguard Worker	vrev32.8	q15, q15
1066*8fb009dcSAndroid Build Coastguard Worker#endif
1067*8fb009dcSAndroid Build Coastguard Worker	subs	r5,r5,#1
1068*8fb009dcSAndroid Build Coastguard Worker	vstmia	r12!,{q0,q1,q2,q3,q4,q5,q6,q7}		@ write bit-sliced round key
1069*8fb009dcSAndroid Build Coastguard Worker	bne	.Lkey_loop
1070*8fb009dcSAndroid Build Coastguard Worker
1071*8fb009dcSAndroid Build Coastguard Worker	vmov.i8	q7,#0x63			@ compose .L63
1072*8fb009dcSAndroid Build Coastguard Worker	@ don't save last round key
1073*8fb009dcSAndroid Build Coastguard Worker	bx	lr
1074*8fb009dcSAndroid Build Coastguard Worker.size	_bsaes_key_convert,.-_bsaes_key_convert
1075*8fb009dcSAndroid Build Coastguard Worker.globl	bsaes_cbc_encrypt
1076*8fb009dcSAndroid Build Coastguard Worker.hidden	bsaes_cbc_encrypt
1077*8fb009dcSAndroid Build Coastguard Worker.type	bsaes_cbc_encrypt,%function
1078*8fb009dcSAndroid Build Coastguard Worker.align	5
1079*8fb009dcSAndroid Build Coastguard Workerbsaes_cbc_encrypt:
1080*8fb009dcSAndroid Build Coastguard Worker	@ In OpenSSL, this function had a fallback to aes_nohw_cbc_encrypt for
1081*8fb009dcSAndroid Build Coastguard Worker	@ short inputs. We patch this out, using bsaes for all input sizes.
1082*8fb009dcSAndroid Build Coastguard Worker
1083*8fb009dcSAndroid Build Coastguard Worker	@ it is up to the caller to make sure we are called with enc == 0
1084*8fb009dcSAndroid Build Coastguard Worker
1085*8fb009dcSAndroid Build Coastguard Worker	mov	ip, sp
1086*8fb009dcSAndroid Build Coastguard Worker	stmdb	sp!, {r4,r5,r6,r7,r8,r9,r10, lr}
1087*8fb009dcSAndroid Build Coastguard Worker	VFP_ABI_PUSH
1088*8fb009dcSAndroid Build Coastguard Worker	ldr	r8, [ip]			@ IV is 1st arg on the stack
1089*8fb009dcSAndroid Build Coastguard Worker	mov	r2, r2, lsr#4		@ len in 16 byte blocks
1090*8fb009dcSAndroid Build Coastguard Worker	sub	sp, #0x10			@ scratch space to carry over the IV
1091*8fb009dcSAndroid Build Coastguard Worker	mov	r9, sp				@ save sp
1092*8fb009dcSAndroid Build Coastguard Worker
1093*8fb009dcSAndroid Build Coastguard Worker	ldr	r10, [r3, #240]		@ get # of rounds
1094*8fb009dcSAndroid Build Coastguard Worker#ifndef	BSAES_ASM_EXTENDED_KEY
1095*8fb009dcSAndroid Build Coastguard Worker	@ allocate the key schedule on the stack
1096*8fb009dcSAndroid Build Coastguard Worker	sub	r12, sp, r10, lsl#7		@ 128 bytes per inner round key
1097*8fb009dcSAndroid Build Coastguard Worker	add	r12, #96			@ sifze of bit-slices key schedule
1098*8fb009dcSAndroid Build Coastguard Worker
1099*8fb009dcSAndroid Build Coastguard Worker	@ populate the key schedule
1100*8fb009dcSAndroid Build Coastguard Worker	mov	r4, r3			@ pass key
1101*8fb009dcSAndroid Build Coastguard Worker	mov	r5, r10			@ pass # of rounds
1102*8fb009dcSAndroid Build Coastguard Worker	mov	sp, r12				@ sp is sp
1103*8fb009dcSAndroid Build Coastguard Worker	bl	_bsaes_key_convert
1104*8fb009dcSAndroid Build Coastguard Worker	vldmia	sp, {q6}
1105*8fb009dcSAndroid Build Coastguard Worker	vstmia	r12,  {q15}		@ save last round key
1106*8fb009dcSAndroid Build Coastguard Worker	veor	q7, q7, q6	@ fix up round 0 key
1107*8fb009dcSAndroid Build Coastguard Worker	vstmia	sp, {q7}
1108*8fb009dcSAndroid Build Coastguard Worker#else
1109*8fb009dcSAndroid Build Coastguard Worker	ldr	r12, [r3, #244]
1110*8fb009dcSAndroid Build Coastguard Worker	eors	r12, #1
1111*8fb009dcSAndroid Build Coastguard Worker	beq	0f
1112*8fb009dcSAndroid Build Coastguard Worker
1113*8fb009dcSAndroid Build Coastguard Worker	@ populate the key schedule
1114*8fb009dcSAndroid Build Coastguard Worker	str	r12, [r3, #244]
1115*8fb009dcSAndroid Build Coastguard Worker	mov	r4, r3			@ pass key
1116*8fb009dcSAndroid Build Coastguard Worker	mov	r5, r10			@ pass # of rounds
1117*8fb009dcSAndroid Build Coastguard Worker	add	r12, r3, #248			@ pass key schedule
1118*8fb009dcSAndroid Build Coastguard Worker	bl	_bsaes_key_convert
1119*8fb009dcSAndroid Build Coastguard Worker	add	r4, r3, #248
1120*8fb009dcSAndroid Build Coastguard Worker	vldmia	r4, {q6}
1121*8fb009dcSAndroid Build Coastguard Worker	vstmia	r12, {q15}			@ save last round key
1122*8fb009dcSAndroid Build Coastguard Worker	veor	q7, q7, q6	@ fix up round 0 key
1123*8fb009dcSAndroid Build Coastguard Worker	vstmia	r4, {q7}
1124*8fb009dcSAndroid Build Coastguard Worker
1125*8fb009dcSAndroid Build Coastguard Worker.align	2
1126*8fb009dcSAndroid Build Coastguard Worker
1127*8fb009dcSAndroid Build Coastguard Worker#endif
1128*8fb009dcSAndroid Build Coastguard Worker
1129*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q15}, [r8]		@ load IV
1130*8fb009dcSAndroid Build Coastguard Worker	b	.Lcbc_dec_loop
1131*8fb009dcSAndroid Build Coastguard Worker
1132*8fb009dcSAndroid Build Coastguard Worker.align	4
1133*8fb009dcSAndroid Build Coastguard Worker.Lcbc_dec_loop:
1134*8fb009dcSAndroid Build Coastguard Worker	subs	r2, r2, #0x8
1135*8fb009dcSAndroid Build Coastguard Worker	bmi	.Lcbc_dec_loop_finish
1136*8fb009dcSAndroid Build Coastguard Worker
1137*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q0,q1}, [r0]!	@ load input
1138*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q2,q3}, [r0]!
1139*8fb009dcSAndroid Build Coastguard Worker#ifndef	BSAES_ASM_EXTENDED_KEY
1140*8fb009dcSAndroid Build Coastguard Worker	mov	r4, sp			@ pass the key
1141*8fb009dcSAndroid Build Coastguard Worker#else
1142*8fb009dcSAndroid Build Coastguard Worker	add	r4, r3, #248
1143*8fb009dcSAndroid Build Coastguard Worker#endif
1144*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q4,q5}, [r0]!
1145*8fb009dcSAndroid Build Coastguard Worker	mov	r5, r10
1146*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q6,q7}, [r0]
1147*8fb009dcSAndroid Build Coastguard Worker	sub	r0, r0, #0x60
1148*8fb009dcSAndroid Build Coastguard Worker	vstmia	r9, {q15}			@ put aside IV
1149*8fb009dcSAndroid Build Coastguard Worker
1150*8fb009dcSAndroid Build Coastguard Worker	bl	_bsaes_decrypt8
1151*8fb009dcSAndroid Build Coastguard Worker
1152*8fb009dcSAndroid Build Coastguard Worker	vldmia	r9, {q14}			@ reload IV
1153*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q8,q9}, [r0]!	@ reload input
1154*8fb009dcSAndroid Build Coastguard Worker	veor	q0, q0, q14	@ ^= IV
1155*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q10,q11}, [r0]!
1156*8fb009dcSAndroid Build Coastguard Worker	veor	q1, q1, q8
1157*8fb009dcSAndroid Build Coastguard Worker	veor	q6, q6, q9
1158*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q12,q13}, [r0]!
1159*8fb009dcSAndroid Build Coastguard Worker	veor	q4, q4, q10
1160*8fb009dcSAndroid Build Coastguard Worker	veor	q2, q2, q11
1161*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q14,q15}, [r0]!
1162*8fb009dcSAndroid Build Coastguard Worker	veor	q7, q7, q12
1163*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q0,q1}, [r1]!	@ write output
1164*8fb009dcSAndroid Build Coastguard Worker	veor	q3, q3, q13
1165*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q6}, [r1]!
1166*8fb009dcSAndroid Build Coastguard Worker	veor	q5, q5, q14
1167*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q4}, [r1]!
1168*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q2}, [r1]!
1169*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q7}, [r1]!
1170*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q3}, [r1]!
1171*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q5}, [r1]!
1172*8fb009dcSAndroid Build Coastguard Worker
1173*8fb009dcSAndroid Build Coastguard Worker	b	.Lcbc_dec_loop
1174*8fb009dcSAndroid Build Coastguard Worker
1175*8fb009dcSAndroid Build Coastguard Worker.Lcbc_dec_loop_finish:
1176*8fb009dcSAndroid Build Coastguard Worker	adds	r2, r2, #8
1177*8fb009dcSAndroid Build Coastguard Worker	beq	.Lcbc_dec_done
1178*8fb009dcSAndroid Build Coastguard Worker
1179*8fb009dcSAndroid Build Coastguard Worker	@ Set up most parameters for the _bsaes_decrypt8 call.
1180*8fb009dcSAndroid Build Coastguard Worker#ifndef	BSAES_ASM_EXTENDED_KEY
1181*8fb009dcSAndroid Build Coastguard Worker	mov	r4, sp			@ pass the key
1182*8fb009dcSAndroid Build Coastguard Worker#else
1183*8fb009dcSAndroid Build Coastguard Worker	add	r4, r3, #248
1184*8fb009dcSAndroid Build Coastguard Worker#endif
1185*8fb009dcSAndroid Build Coastguard Worker	mov	r5, r10
1186*8fb009dcSAndroid Build Coastguard Worker	vstmia	r9, {q15}			@ put aside IV
1187*8fb009dcSAndroid Build Coastguard Worker
1188*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q0}, [r0]!		@ load input
1189*8fb009dcSAndroid Build Coastguard Worker	cmp	r2, #2
1190*8fb009dcSAndroid Build Coastguard Worker	blo	.Lcbc_dec_one
1191*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q1}, [r0]!
1192*8fb009dcSAndroid Build Coastguard Worker	beq	.Lcbc_dec_two
1193*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q2}, [r0]!
1194*8fb009dcSAndroid Build Coastguard Worker	cmp	r2, #4
1195*8fb009dcSAndroid Build Coastguard Worker	blo	.Lcbc_dec_three
1196*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q3}, [r0]!
1197*8fb009dcSAndroid Build Coastguard Worker	beq	.Lcbc_dec_four
1198*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q4}, [r0]!
1199*8fb009dcSAndroid Build Coastguard Worker	cmp	r2, #6
1200*8fb009dcSAndroid Build Coastguard Worker	blo	.Lcbc_dec_five
1201*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q5}, [r0]!
1202*8fb009dcSAndroid Build Coastguard Worker	beq	.Lcbc_dec_six
1203*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q6}, [r0]!
1204*8fb009dcSAndroid Build Coastguard Worker	sub	r0, r0, #0x70
1205*8fb009dcSAndroid Build Coastguard Worker
1206*8fb009dcSAndroid Build Coastguard Worker	bl	_bsaes_decrypt8
1207*8fb009dcSAndroid Build Coastguard Worker
1208*8fb009dcSAndroid Build Coastguard Worker	vldmia	r9, {q14}			@ reload IV
1209*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q8,q9}, [r0]!	@ reload input
1210*8fb009dcSAndroid Build Coastguard Worker	veor	q0, q0, q14	@ ^= IV
1211*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q10,q11}, [r0]!
1212*8fb009dcSAndroid Build Coastguard Worker	veor	q1, q1, q8
1213*8fb009dcSAndroid Build Coastguard Worker	veor	q6, q6, q9
1214*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q12,q13}, [r0]!
1215*8fb009dcSAndroid Build Coastguard Worker	veor	q4, q4, q10
1216*8fb009dcSAndroid Build Coastguard Worker	veor	q2, q2, q11
1217*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q15}, [r0]!
1218*8fb009dcSAndroid Build Coastguard Worker	veor	q7, q7, q12
1219*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q0,q1}, [r1]!	@ write output
1220*8fb009dcSAndroid Build Coastguard Worker	veor	q3, q3, q13
1221*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q6}, [r1]!
1222*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q4}, [r1]!
1223*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q2}, [r1]!
1224*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q7}, [r1]!
1225*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q3}, [r1]!
1226*8fb009dcSAndroid Build Coastguard Worker	b	.Lcbc_dec_done
1227*8fb009dcSAndroid Build Coastguard Worker.align	4
1228*8fb009dcSAndroid Build Coastguard Worker.Lcbc_dec_six:
1229*8fb009dcSAndroid Build Coastguard Worker	sub	r0, r0, #0x60
1230*8fb009dcSAndroid Build Coastguard Worker	bl	_bsaes_decrypt8
1231*8fb009dcSAndroid Build Coastguard Worker	vldmia	r9,{q14}			@ reload IV
1232*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q8,q9}, [r0]!	@ reload input
1233*8fb009dcSAndroid Build Coastguard Worker	veor	q0, q0, q14	@ ^= IV
1234*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q10,q11}, [r0]!
1235*8fb009dcSAndroid Build Coastguard Worker	veor	q1, q1, q8
1236*8fb009dcSAndroid Build Coastguard Worker	veor	q6, q6, q9
1237*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q12}, [r0]!
1238*8fb009dcSAndroid Build Coastguard Worker	veor	q4, q4, q10
1239*8fb009dcSAndroid Build Coastguard Worker	veor	q2, q2, q11
1240*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q15}, [r0]!
1241*8fb009dcSAndroid Build Coastguard Worker	veor	q7, q7, q12
1242*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q0,q1}, [r1]!	@ write output
1243*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q6}, [r1]!
1244*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q4}, [r1]!
1245*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q2}, [r1]!
1246*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q7}, [r1]!
1247*8fb009dcSAndroid Build Coastguard Worker	b	.Lcbc_dec_done
1248*8fb009dcSAndroid Build Coastguard Worker.align	4
1249*8fb009dcSAndroid Build Coastguard Worker.Lcbc_dec_five:
1250*8fb009dcSAndroid Build Coastguard Worker	sub	r0, r0, #0x50
1251*8fb009dcSAndroid Build Coastguard Worker	bl	_bsaes_decrypt8
1252*8fb009dcSAndroid Build Coastguard Worker	vldmia	r9, {q14}			@ reload IV
1253*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q8,q9}, [r0]!	@ reload input
1254*8fb009dcSAndroid Build Coastguard Worker	veor	q0, q0, q14	@ ^= IV
1255*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q10,q11}, [r0]!
1256*8fb009dcSAndroid Build Coastguard Worker	veor	q1, q1, q8
1257*8fb009dcSAndroid Build Coastguard Worker	veor	q6, q6, q9
1258*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q15}, [r0]!
1259*8fb009dcSAndroid Build Coastguard Worker	veor	q4, q4, q10
1260*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q0,q1}, [r1]!	@ write output
1261*8fb009dcSAndroid Build Coastguard Worker	veor	q2, q2, q11
1262*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q6}, [r1]!
1263*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q4}, [r1]!
1264*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q2}, [r1]!
1265*8fb009dcSAndroid Build Coastguard Worker	b	.Lcbc_dec_done
1266*8fb009dcSAndroid Build Coastguard Worker.align	4
1267*8fb009dcSAndroid Build Coastguard Worker.Lcbc_dec_four:
1268*8fb009dcSAndroid Build Coastguard Worker	sub	r0, r0, #0x40
1269*8fb009dcSAndroid Build Coastguard Worker	bl	_bsaes_decrypt8
1270*8fb009dcSAndroid Build Coastguard Worker	vldmia	r9, {q14}			@ reload IV
1271*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q8,q9}, [r0]!	@ reload input
1272*8fb009dcSAndroid Build Coastguard Worker	veor	q0, q0, q14	@ ^= IV
1273*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q10}, [r0]!
1274*8fb009dcSAndroid Build Coastguard Worker	veor	q1, q1, q8
1275*8fb009dcSAndroid Build Coastguard Worker	veor	q6, q6, q9
1276*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q15}, [r0]!
1277*8fb009dcSAndroid Build Coastguard Worker	veor	q4, q4, q10
1278*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q0,q1}, [r1]!	@ write output
1279*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q6}, [r1]!
1280*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q4}, [r1]!
1281*8fb009dcSAndroid Build Coastguard Worker	b	.Lcbc_dec_done
1282*8fb009dcSAndroid Build Coastguard Worker.align	4
1283*8fb009dcSAndroid Build Coastguard Worker.Lcbc_dec_three:
1284*8fb009dcSAndroid Build Coastguard Worker	sub	r0, r0, #0x30
1285*8fb009dcSAndroid Build Coastguard Worker	bl	_bsaes_decrypt8
1286*8fb009dcSAndroid Build Coastguard Worker	vldmia	r9, {q14}			@ reload IV
1287*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q8,q9}, [r0]!	@ reload input
1288*8fb009dcSAndroid Build Coastguard Worker	veor	q0, q0, q14	@ ^= IV
1289*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q15}, [r0]!
1290*8fb009dcSAndroid Build Coastguard Worker	veor	q1, q1, q8
1291*8fb009dcSAndroid Build Coastguard Worker	veor	q6, q6, q9
1292*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q0,q1}, [r1]!	@ write output
1293*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q6}, [r1]!
1294*8fb009dcSAndroid Build Coastguard Worker	b	.Lcbc_dec_done
1295*8fb009dcSAndroid Build Coastguard Worker.align	4
1296*8fb009dcSAndroid Build Coastguard Worker.Lcbc_dec_two:
1297*8fb009dcSAndroid Build Coastguard Worker	sub	r0, r0, #0x20
1298*8fb009dcSAndroid Build Coastguard Worker	bl	_bsaes_decrypt8
1299*8fb009dcSAndroid Build Coastguard Worker	vldmia	r9, {q14}			@ reload IV
1300*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q8}, [r0]!		@ reload input
1301*8fb009dcSAndroid Build Coastguard Worker	veor	q0, q0, q14	@ ^= IV
1302*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q15}, [r0]!		@ reload input
1303*8fb009dcSAndroid Build Coastguard Worker	veor	q1, q1, q8
1304*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q0,q1}, [r1]!	@ write output
1305*8fb009dcSAndroid Build Coastguard Worker	b	.Lcbc_dec_done
1306*8fb009dcSAndroid Build Coastguard Worker.align	4
1307*8fb009dcSAndroid Build Coastguard Worker.Lcbc_dec_one:
1308*8fb009dcSAndroid Build Coastguard Worker	sub	r0, r0, #0x10
1309*8fb009dcSAndroid Build Coastguard Worker	bl	_bsaes_decrypt8
1310*8fb009dcSAndroid Build Coastguard Worker	vldmia	r9, {q14}			@ reload IV
1311*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q15}, [r0]!		@ reload input
1312*8fb009dcSAndroid Build Coastguard Worker	veor	q0, q0, q14	@ ^= IV
1313*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q0}, [r1]!		@ write output
1314*8fb009dcSAndroid Build Coastguard Worker
1315*8fb009dcSAndroid Build Coastguard Worker.Lcbc_dec_done:
1316*8fb009dcSAndroid Build Coastguard Worker#ifndef	BSAES_ASM_EXTENDED_KEY
1317*8fb009dcSAndroid Build Coastguard Worker	vmov.i32	q0, #0
1318*8fb009dcSAndroid Build Coastguard Worker	vmov.i32	q1, #0
1319*8fb009dcSAndroid Build Coastguard Worker.Lcbc_dec_bzero:@ wipe key schedule [if any]
1320*8fb009dcSAndroid Build Coastguard Worker	vstmia	sp!, {q0,q1}
1321*8fb009dcSAndroid Build Coastguard Worker	cmp	sp, r9
1322*8fb009dcSAndroid Build Coastguard Worker	bne	.Lcbc_dec_bzero
1323*8fb009dcSAndroid Build Coastguard Worker#endif
1324*8fb009dcSAndroid Build Coastguard Worker
1325*8fb009dcSAndroid Build Coastguard Worker	mov	sp, r9
1326*8fb009dcSAndroid Build Coastguard Worker	add	sp, #0x10			@ add sp,r9,#0x10 is no good for thumb
1327*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q15}, [r8]		@ return IV
1328*8fb009dcSAndroid Build Coastguard Worker	VFP_ABI_POP
1329*8fb009dcSAndroid Build Coastguard Worker	ldmia	sp!, {r4,r5,r6,r7,r8,r9,r10, pc}
1330*8fb009dcSAndroid Build Coastguard Worker.size	bsaes_cbc_encrypt,.-bsaes_cbc_encrypt
1331*8fb009dcSAndroid Build Coastguard Worker.globl	bsaes_ctr32_encrypt_blocks
1332*8fb009dcSAndroid Build Coastguard Worker.hidden	bsaes_ctr32_encrypt_blocks
1333*8fb009dcSAndroid Build Coastguard Worker.type	bsaes_ctr32_encrypt_blocks,%function
1334*8fb009dcSAndroid Build Coastguard Worker.align	5
1335*8fb009dcSAndroid Build Coastguard Workerbsaes_ctr32_encrypt_blocks:
1336*8fb009dcSAndroid Build Coastguard Worker	@ In OpenSSL, short inputs fall back to aes_nohw_* here. We patch this
1337*8fb009dcSAndroid Build Coastguard Worker	@ out to retain a constant-time implementation.
1338*8fb009dcSAndroid Build Coastguard Worker	mov	ip, sp
1339*8fb009dcSAndroid Build Coastguard Worker	stmdb	sp!, {r4,r5,r6,r7,r8,r9,r10, lr}
1340*8fb009dcSAndroid Build Coastguard Worker	VFP_ABI_PUSH
1341*8fb009dcSAndroid Build Coastguard Worker	ldr	r8, [ip]			@ ctr is 1st arg on the stack
1342*8fb009dcSAndroid Build Coastguard Worker	sub	sp, sp, #0x10			@ scratch space to carry over the ctr
1343*8fb009dcSAndroid Build Coastguard Worker	mov	r9, sp				@ save sp
1344*8fb009dcSAndroid Build Coastguard Worker
1345*8fb009dcSAndroid Build Coastguard Worker	ldr	r10, [r3, #240]		@ get # of rounds
1346*8fb009dcSAndroid Build Coastguard Worker#ifndef	BSAES_ASM_EXTENDED_KEY
1347*8fb009dcSAndroid Build Coastguard Worker	@ allocate the key schedule on the stack
1348*8fb009dcSAndroid Build Coastguard Worker	sub	r12, sp, r10, lsl#7		@ 128 bytes per inner round key
1349*8fb009dcSAndroid Build Coastguard Worker	add	r12, #96			@ size of bit-sliced key schedule
1350*8fb009dcSAndroid Build Coastguard Worker
1351*8fb009dcSAndroid Build Coastguard Worker	@ populate the key schedule
1352*8fb009dcSAndroid Build Coastguard Worker	mov	r4, r3			@ pass key
1353*8fb009dcSAndroid Build Coastguard Worker	mov	r5, r10			@ pass # of rounds
1354*8fb009dcSAndroid Build Coastguard Worker	mov	sp, r12				@ sp is sp
1355*8fb009dcSAndroid Build Coastguard Worker	bl	_bsaes_key_convert
1356*8fb009dcSAndroid Build Coastguard Worker	veor	q7,q7,q15	@ fix up last round key
1357*8fb009dcSAndroid Build Coastguard Worker	vstmia	r12, {q7}			@ save last round key
1358*8fb009dcSAndroid Build Coastguard Worker
1359*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q0}, [r8]		@ load counter
1360*8fb009dcSAndroid Build Coastguard Worker#ifdef	__APPLE__
1361*8fb009dcSAndroid Build Coastguard Worker	mov	r8, #:lower16:(.LREVM0SR-.LM0)
1362*8fb009dcSAndroid Build Coastguard Worker	add	r8, r6, r8
1363*8fb009dcSAndroid Build Coastguard Worker#else
1364*8fb009dcSAndroid Build Coastguard Worker	add	r8, r6, #.LREVM0SR-.LM0	@ borrow r8
1365*8fb009dcSAndroid Build Coastguard Worker#endif
1366*8fb009dcSAndroid Build Coastguard Worker	vldmia	sp, {q4}		@ load round0 key
1367*8fb009dcSAndroid Build Coastguard Worker#else
1368*8fb009dcSAndroid Build Coastguard Worker	ldr	r12, [r3, #244]
1369*8fb009dcSAndroid Build Coastguard Worker	eors	r12, #1
1370*8fb009dcSAndroid Build Coastguard Worker	beq	0f
1371*8fb009dcSAndroid Build Coastguard Worker
1372*8fb009dcSAndroid Build Coastguard Worker	@ populate the key schedule
1373*8fb009dcSAndroid Build Coastguard Worker	str	r12, [r3, #244]
1374*8fb009dcSAndroid Build Coastguard Worker	mov	r4, r3			@ pass key
1375*8fb009dcSAndroid Build Coastguard Worker	mov	r5, r10			@ pass # of rounds
1376*8fb009dcSAndroid Build Coastguard Worker	add	r12, r3, #248			@ pass key schedule
1377*8fb009dcSAndroid Build Coastguard Worker	bl	_bsaes_key_convert
1378*8fb009dcSAndroid Build Coastguard Worker	veor	q7,q7,q15	@ fix up last round key
1379*8fb009dcSAndroid Build Coastguard Worker	vstmia	r12, {q7}			@ save last round key
1380*8fb009dcSAndroid Build Coastguard Worker
1381*8fb009dcSAndroid Build Coastguard Worker.align	2
1382*8fb009dcSAndroid Build Coastguard Worker	add	r12, r3, #248
1383*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q0}, [r8]		@ load counter
1384*8fb009dcSAndroid Build Coastguard Worker	adrl	r8, .LREVM0SR			@ borrow r8
1385*8fb009dcSAndroid Build Coastguard Worker	vldmia	r12, {q4}			@ load round0 key
1386*8fb009dcSAndroid Build Coastguard Worker	sub	sp, #0x10			@ place for adjusted round0 key
1387*8fb009dcSAndroid Build Coastguard Worker#endif
1388*8fb009dcSAndroid Build Coastguard Worker
1389*8fb009dcSAndroid Build Coastguard Worker	vmov.i32	q8,#1		@ compose 1<<96
1390*8fb009dcSAndroid Build Coastguard Worker	veor	q9,q9,q9
1391*8fb009dcSAndroid Build Coastguard Worker	vrev32.8	q0,q0
1392*8fb009dcSAndroid Build Coastguard Worker	vext.8	q8,q9,q8,#4
1393*8fb009dcSAndroid Build Coastguard Worker	vrev32.8	q4,q4
1394*8fb009dcSAndroid Build Coastguard Worker	vadd.u32	q9,q8,q8	@ compose 2<<96
1395*8fb009dcSAndroid Build Coastguard Worker	vstmia	sp, {q4}		@ save adjusted round0 key
1396*8fb009dcSAndroid Build Coastguard Worker	b	.Lctr_enc_loop
1397*8fb009dcSAndroid Build Coastguard Worker
1398*8fb009dcSAndroid Build Coastguard Worker.align	4
1399*8fb009dcSAndroid Build Coastguard Worker.Lctr_enc_loop:
1400*8fb009dcSAndroid Build Coastguard Worker	vadd.u32	q10, q8, q9	@ compose 3<<96
1401*8fb009dcSAndroid Build Coastguard Worker	vadd.u32	q1, q0, q8	@ +1
1402*8fb009dcSAndroid Build Coastguard Worker	vadd.u32	q2, q0, q9	@ +2
1403*8fb009dcSAndroid Build Coastguard Worker	vadd.u32	q3, q0, q10	@ +3
1404*8fb009dcSAndroid Build Coastguard Worker	vadd.u32	q4, q1, q10
1405*8fb009dcSAndroid Build Coastguard Worker	vadd.u32	q5, q2, q10
1406*8fb009dcSAndroid Build Coastguard Worker	vadd.u32	q6, q3, q10
1407*8fb009dcSAndroid Build Coastguard Worker	vadd.u32	q7, q4, q10
1408*8fb009dcSAndroid Build Coastguard Worker	vadd.u32	q10, q5, q10	@ next counter
1409*8fb009dcSAndroid Build Coastguard Worker
1410*8fb009dcSAndroid Build Coastguard Worker	@ Borrow prologue from _bsaes_encrypt8 to use the opportunity
1411*8fb009dcSAndroid Build Coastguard Worker	@ to flip byte order in 32-bit counter
1412*8fb009dcSAndroid Build Coastguard Worker
1413*8fb009dcSAndroid Build Coastguard Worker	vldmia	sp, {q9}		@ load round0 key
1414*8fb009dcSAndroid Build Coastguard Worker#ifndef	BSAES_ASM_EXTENDED_KEY
1415*8fb009dcSAndroid Build Coastguard Worker	add	r4, sp, #0x10		@ pass next round key
1416*8fb009dcSAndroid Build Coastguard Worker#else
1417*8fb009dcSAndroid Build Coastguard Worker	add	r4, r3, #264
1418*8fb009dcSAndroid Build Coastguard Worker#endif
1419*8fb009dcSAndroid Build Coastguard Worker	vldmia	r8, {q8}			@ .LREVM0SR
1420*8fb009dcSAndroid Build Coastguard Worker	mov	r5, r10			@ pass rounds
1421*8fb009dcSAndroid Build Coastguard Worker	vstmia	r9, {q10}			@ save next counter
1422*8fb009dcSAndroid Build Coastguard Worker#ifdef	__APPLE__
1423*8fb009dcSAndroid Build Coastguard Worker	mov	r6, #:lower16:(.LREVM0SR-.LSR)
1424*8fb009dcSAndroid Build Coastguard Worker	sub	r6, r8, r6
1425*8fb009dcSAndroid Build Coastguard Worker#else
1426*8fb009dcSAndroid Build Coastguard Worker	sub	r6, r8, #.LREVM0SR-.LSR	@ pass constants
1427*8fb009dcSAndroid Build Coastguard Worker#endif
1428*8fb009dcSAndroid Build Coastguard Worker
1429*8fb009dcSAndroid Build Coastguard Worker	bl	_bsaes_encrypt8_alt
1430*8fb009dcSAndroid Build Coastguard Worker
1431*8fb009dcSAndroid Build Coastguard Worker	subs	r2, r2, #8
1432*8fb009dcSAndroid Build Coastguard Worker	blo	.Lctr_enc_loop_done
1433*8fb009dcSAndroid Build Coastguard Worker
1434*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q8,q9}, [r0]!	@ load input
1435*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q10,q11}, [r0]!
1436*8fb009dcSAndroid Build Coastguard Worker	veor	q0, q8
1437*8fb009dcSAndroid Build Coastguard Worker	veor	q1, q9
1438*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q12,q13}, [r0]!
1439*8fb009dcSAndroid Build Coastguard Worker	veor	q4, q10
1440*8fb009dcSAndroid Build Coastguard Worker	veor	q6, q11
1441*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q14,q15}, [r0]!
1442*8fb009dcSAndroid Build Coastguard Worker	veor	q3, q12
1443*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q0,q1}, [r1]!	@ write output
1444*8fb009dcSAndroid Build Coastguard Worker	veor	q7, q13
1445*8fb009dcSAndroid Build Coastguard Worker	veor	q2, q14
1446*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q4}, [r1]!
1447*8fb009dcSAndroid Build Coastguard Worker	veor	q5, q15
1448*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q6}, [r1]!
1449*8fb009dcSAndroid Build Coastguard Worker	vmov.i32	q8, #1			@ compose 1<<96
1450*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q3}, [r1]!
1451*8fb009dcSAndroid Build Coastguard Worker	veor	q9, q9, q9
1452*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q7}, [r1]!
1453*8fb009dcSAndroid Build Coastguard Worker	vext.8	q8, q9, q8, #4
1454*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q2}, [r1]!
1455*8fb009dcSAndroid Build Coastguard Worker	vadd.u32	q9,q8,q8		@ compose 2<<96
1456*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q5}, [r1]!
1457*8fb009dcSAndroid Build Coastguard Worker	vldmia	r9, {q0}			@ load counter
1458*8fb009dcSAndroid Build Coastguard Worker
1459*8fb009dcSAndroid Build Coastguard Worker	bne	.Lctr_enc_loop
1460*8fb009dcSAndroid Build Coastguard Worker	b	.Lctr_enc_done
1461*8fb009dcSAndroid Build Coastguard Worker
1462*8fb009dcSAndroid Build Coastguard Worker.align	4
1463*8fb009dcSAndroid Build Coastguard Worker.Lctr_enc_loop_done:
1464*8fb009dcSAndroid Build Coastguard Worker	add	r2, r2, #8
1465*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q8}, [r0]!	@ load input
1466*8fb009dcSAndroid Build Coastguard Worker	veor	q0, q8
1467*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q0}, [r1]!	@ write output
1468*8fb009dcSAndroid Build Coastguard Worker	cmp	r2, #2
1469*8fb009dcSAndroid Build Coastguard Worker	blo	.Lctr_enc_done
1470*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q9}, [r0]!
1471*8fb009dcSAndroid Build Coastguard Worker	veor	q1, q9
1472*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q1}, [r1]!
1473*8fb009dcSAndroid Build Coastguard Worker	beq	.Lctr_enc_done
1474*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q10}, [r0]!
1475*8fb009dcSAndroid Build Coastguard Worker	veor	q4, q10
1476*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q4}, [r1]!
1477*8fb009dcSAndroid Build Coastguard Worker	cmp	r2, #4
1478*8fb009dcSAndroid Build Coastguard Worker	blo	.Lctr_enc_done
1479*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q11}, [r0]!
1480*8fb009dcSAndroid Build Coastguard Worker	veor	q6, q11
1481*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q6}, [r1]!
1482*8fb009dcSAndroid Build Coastguard Worker	beq	.Lctr_enc_done
1483*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q12}, [r0]!
1484*8fb009dcSAndroid Build Coastguard Worker	veor	q3, q12
1485*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q3}, [r1]!
1486*8fb009dcSAndroid Build Coastguard Worker	cmp	r2, #6
1487*8fb009dcSAndroid Build Coastguard Worker	blo	.Lctr_enc_done
1488*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q13}, [r0]!
1489*8fb009dcSAndroid Build Coastguard Worker	veor	q7, q13
1490*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q7}, [r1]!
1491*8fb009dcSAndroid Build Coastguard Worker	beq	.Lctr_enc_done
1492*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q14}, [r0]
1493*8fb009dcSAndroid Build Coastguard Worker	veor	q2, q14
1494*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q2}, [r1]!
1495*8fb009dcSAndroid Build Coastguard Worker
1496*8fb009dcSAndroid Build Coastguard Worker.Lctr_enc_done:
1497*8fb009dcSAndroid Build Coastguard Worker	vmov.i32	q0, #0
1498*8fb009dcSAndroid Build Coastguard Worker	vmov.i32	q1, #0
1499*8fb009dcSAndroid Build Coastguard Worker#ifndef	BSAES_ASM_EXTENDED_KEY
1500*8fb009dcSAndroid Build Coastguard Worker.Lctr_enc_bzero:@ wipe key schedule [if any]
1501*8fb009dcSAndroid Build Coastguard Worker	vstmia	sp!, {q0,q1}
1502*8fb009dcSAndroid Build Coastguard Worker	cmp	sp, r9
1503*8fb009dcSAndroid Build Coastguard Worker	bne	.Lctr_enc_bzero
1504*8fb009dcSAndroid Build Coastguard Worker#else
1505*8fb009dcSAndroid Build Coastguard Worker	vstmia	sp, {q0,q1}
1506*8fb009dcSAndroid Build Coastguard Worker#endif
1507*8fb009dcSAndroid Build Coastguard Worker
1508*8fb009dcSAndroid Build Coastguard Worker	mov	sp, r9
1509*8fb009dcSAndroid Build Coastguard Worker	add	sp, #0x10		@ add sp,r9,#0x10 is no good for thumb
1510*8fb009dcSAndroid Build Coastguard Worker	VFP_ABI_POP
1511*8fb009dcSAndroid Build Coastguard Worker	ldmia	sp!, {r4,r5,r6,r7,r8,r9,r10, pc}	@ return
1512*8fb009dcSAndroid Build Coastguard Worker
1513*8fb009dcSAndroid Build Coastguard Worker	@ OpenSSL contains aes_nohw_* fallback code here. We patch this
1514*8fb009dcSAndroid Build Coastguard Worker	@ out to retain a constant-time implementation.
1515*8fb009dcSAndroid Build Coastguard Worker.size	bsaes_ctr32_encrypt_blocks,.-bsaes_ctr32_encrypt_blocks
1516*8fb009dcSAndroid Build Coastguard Worker#endif
1517*8fb009dcSAndroid Build Coastguard Worker#endif  // !OPENSSL_NO_ASM && defined(OPENSSL_ARM) && defined(__ELF__)
1518