xref: /aosp_15_r20/external/boringssl/src/gen/crypto/chacha-armv4-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#include <openssl/arm_arch.h>
8*8fb009dcSAndroid Build Coastguard Worker
9*8fb009dcSAndroid Build Coastguard Worker@ Silence ARMv8 deprecated IT instruction warnings. This file is used by both
10*8fb009dcSAndroid Build Coastguard Worker@ ARMv7 and ARMv8 processors and does not use ARMv8 instructions.
11*8fb009dcSAndroid Build Coastguard Worker.arch	armv7-a
12*8fb009dcSAndroid Build Coastguard Worker
13*8fb009dcSAndroid Build Coastguard Worker.text
14*8fb009dcSAndroid Build Coastguard Worker#if defined(__thumb2__) || defined(__clang__)
15*8fb009dcSAndroid Build Coastguard Worker.syntax	unified
16*8fb009dcSAndroid Build Coastguard Worker#endif
17*8fb009dcSAndroid Build Coastguard Worker#if defined(__thumb2__)
18*8fb009dcSAndroid Build Coastguard Worker.thumb
19*8fb009dcSAndroid Build Coastguard Worker#else
20*8fb009dcSAndroid Build Coastguard Worker.code	32
21*8fb009dcSAndroid Build Coastguard Worker#endif
22*8fb009dcSAndroid Build Coastguard Worker
23*8fb009dcSAndroid Build Coastguard Worker#if defined(__thumb2__) || defined(__clang__)
24*8fb009dcSAndroid Build Coastguard Worker#define ldrhsb	ldrbhs
25*8fb009dcSAndroid Build Coastguard Worker#endif
26*8fb009dcSAndroid Build Coastguard Worker
27*8fb009dcSAndroid Build Coastguard Worker.align	5
28*8fb009dcSAndroid Build Coastguard Worker.Lsigma:
29*8fb009dcSAndroid Build Coastguard Worker.long	0x61707865,0x3320646e,0x79622d32,0x6b206574	@ endian-neutral
30*8fb009dcSAndroid Build Coastguard Worker.Lone:
31*8fb009dcSAndroid Build Coastguard Worker.long	1,0,0,0
32*8fb009dcSAndroid Build Coastguard Worker
33*8fb009dcSAndroid Build Coastguard Worker.globl	ChaCha20_ctr32_nohw
34*8fb009dcSAndroid Build Coastguard Worker.hidden	ChaCha20_ctr32_nohw
35*8fb009dcSAndroid Build Coastguard Worker.type	ChaCha20_ctr32_nohw,%function
36*8fb009dcSAndroid Build Coastguard Worker.align	5
37*8fb009dcSAndroid Build Coastguard WorkerChaCha20_ctr32_nohw:
38*8fb009dcSAndroid Build Coastguard Worker	ldr	r12,[sp,#0]		@ pull pointer to counter and nonce
39*8fb009dcSAndroid Build Coastguard Worker	stmdb	sp!,{r0,r1,r2,r4-r11,lr}
40*8fb009dcSAndroid Build Coastguard Worker	adr	r14,.Lsigma
41*8fb009dcSAndroid Build Coastguard Worker	ldmia	r12,{r4,r5,r6,r7}		@ load counter and nonce
42*8fb009dcSAndroid Build Coastguard Worker	sub	sp,sp,#4*(16)		@ off-load area
43*8fb009dcSAndroid Build Coastguard Worker	stmdb	sp!,{r4,r5,r6,r7}		@ copy counter and nonce
44*8fb009dcSAndroid Build Coastguard Worker	ldmia	r3,{r4,r5,r6,r7,r8,r9,r10,r11}		@ load key
45*8fb009dcSAndroid Build Coastguard Worker	ldmia	r14,{r0,r1,r2,r3}		@ load sigma
46*8fb009dcSAndroid Build Coastguard Worker	stmdb	sp!,{r4,r5,r6,r7,r8,r9,r10,r11}		@ copy key
47*8fb009dcSAndroid Build Coastguard Worker	stmdb	sp!,{r0,r1,r2,r3}		@ copy sigma
48*8fb009dcSAndroid Build Coastguard Worker	str	r10,[sp,#4*(16+10)]	@ off-load "rx"
49*8fb009dcSAndroid Build Coastguard Worker	str	r11,[sp,#4*(16+11)]	@ off-load "rx"
50*8fb009dcSAndroid Build Coastguard Worker	b	.Loop_outer_enter
51*8fb009dcSAndroid Build Coastguard Worker
52*8fb009dcSAndroid Build Coastguard Worker.align	4
53*8fb009dcSAndroid Build Coastguard Worker.Loop_outer:
54*8fb009dcSAndroid Build Coastguard Worker	ldmia	sp,{r0,r1,r2,r3,r4,r5,r6,r7,r8,r9}		@ load key material
55*8fb009dcSAndroid Build Coastguard Worker	str	r11,[sp,#4*(32+2)]	@ save len
56*8fb009dcSAndroid Build Coastguard Worker	str	r12,  [sp,#4*(32+1)]	@ save inp
57*8fb009dcSAndroid Build Coastguard Worker	str	r14,  [sp,#4*(32+0)]	@ save out
58*8fb009dcSAndroid Build Coastguard Worker.Loop_outer_enter:
59*8fb009dcSAndroid Build Coastguard Worker	ldr	r11, [sp,#4*(15)]
60*8fb009dcSAndroid Build Coastguard Worker	ldr	r12,[sp,#4*(12)]	@ modulo-scheduled load
61*8fb009dcSAndroid Build Coastguard Worker	ldr	r10, [sp,#4*(13)]
62*8fb009dcSAndroid Build Coastguard Worker	ldr	r14,[sp,#4*(14)]
63*8fb009dcSAndroid Build Coastguard Worker	str	r11, [sp,#4*(16+15)]
64*8fb009dcSAndroid Build Coastguard Worker	mov	r11,#10
65*8fb009dcSAndroid Build Coastguard Worker	b	.Loop
66*8fb009dcSAndroid Build Coastguard Worker
67*8fb009dcSAndroid Build Coastguard Worker.align	4
68*8fb009dcSAndroid Build Coastguard Worker.Loop:
69*8fb009dcSAndroid Build Coastguard Worker	subs	r11,r11,#1
70*8fb009dcSAndroid Build Coastguard Worker	add	r0,r0,r4
71*8fb009dcSAndroid Build Coastguard Worker	mov	r12,r12,ror#16
72*8fb009dcSAndroid Build Coastguard Worker	add	r1,r1,r5
73*8fb009dcSAndroid Build Coastguard Worker	mov	r10,r10,ror#16
74*8fb009dcSAndroid Build Coastguard Worker	eor	r12,r12,r0,ror#16
75*8fb009dcSAndroid Build Coastguard Worker	eor	r10,r10,r1,ror#16
76*8fb009dcSAndroid Build Coastguard Worker	add	r8,r8,r12
77*8fb009dcSAndroid Build Coastguard Worker	mov	r4,r4,ror#20
78*8fb009dcSAndroid Build Coastguard Worker	add	r9,r9,r10
79*8fb009dcSAndroid Build Coastguard Worker	mov	r5,r5,ror#20
80*8fb009dcSAndroid Build Coastguard Worker	eor	r4,r4,r8,ror#20
81*8fb009dcSAndroid Build Coastguard Worker	eor	r5,r5,r9,ror#20
82*8fb009dcSAndroid Build Coastguard Worker	add	r0,r0,r4
83*8fb009dcSAndroid Build Coastguard Worker	mov	r12,r12,ror#24
84*8fb009dcSAndroid Build Coastguard Worker	add	r1,r1,r5
85*8fb009dcSAndroid Build Coastguard Worker	mov	r10,r10,ror#24
86*8fb009dcSAndroid Build Coastguard Worker	eor	r12,r12,r0,ror#24
87*8fb009dcSAndroid Build Coastguard Worker	eor	r10,r10,r1,ror#24
88*8fb009dcSAndroid Build Coastguard Worker	add	r8,r8,r12
89*8fb009dcSAndroid Build Coastguard Worker	mov	r4,r4,ror#25
90*8fb009dcSAndroid Build Coastguard Worker	add	r9,r9,r10
91*8fb009dcSAndroid Build Coastguard Worker	mov	r5,r5,ror#25
92*8fb009dcSAndroid Build Coastguard Worker	str	r10,[sp,#4*(16+13)]
93*8fb009dcSAndroid Build Coastguard Worker	ldr	r10,[sp,#4*(16+15)]
94*8fb009dcSAndroid Build Coastguard Worker	eor	r4,r4,r8,ror#25
95*8fb009dcSAndroid Build Coastguard Worker	eor	r5,r5,r9,ror#25
96*8fb009dcSAndroid Build Coastguard Worker	str	r8,[sp,#4*(16+8)]
97*8fb009dcSAndroid Build Coastguard Worker	ldr	r8,[sp,#4*(16+10)]
98*8fb009dcSAndroid Build Coastguard Worker	add	r2,r2,r6
99*8fb009dcSAndroid Build Coastguard Worker	mov	r14,r14,ror#16
100*8fb009dcSAndroid Build Coastguard Worker	str	r9,[sp,#4*(16+9)]
101*8fb009dcSAndroid Build Coastguard Worker	ldr	r9,[sp,#4*(16+11)]
102*8fb009dcSAndroid Build Coastguard Worker	add	r3,r3,r7
103*8fb009dcSAndroid Build Coastguard Worker	mov	r10,r10,ror#16
104*8fb009dcSAndroid Build Coastguard Worker	eor	r14,r14,r2,ror#16
105*8fb009dcSAndroid Build Coastguard Worker	eor	r10,r10,r3,ror#16
106*8fb009dcSAndroid Build Coastguard Worker	add	r8,r8,r14
107*8fb009dcSAndroid Build Coastguard Worker	mov	r6,r6,ror#20
108*8fb009dcSAndroid Build Coastguard Worker	add	r9,r9,r10
109*8fb009dcSAndroid Build Coastguard Worker	mov	r7,r7,ror#20
110*8fb009dcSAndroid Build Coastguard Worker	eor	r6,r6,r8,ror#20
111*8fb009dcSAndroid Build Coastguard Worker	eor	r7,r7,r9,ror#20
112*8fb009dcSAndroid Build Coastguard Worker	add	r2,r2,r6
113*8fb009dcSAndroid Build Coastguard Worker	mov	r14,r14,ror#24
114*8fb009dcSAndroid Build Coastguard Worker	add	r3,r3,r7
115*8fb009dcSAndroid Build Coastguard Worker	mov	r10,r10,ror#24
116*8fb009dcSAndroid Build Coastguard Worker	eor	r14,r14,r2,ror#24
117*8fb009dcSAndroid Build Coastguard Worker	eor	r10,r10,r3,ror#24
118*8fb009dcSAndroid Build Coastguard Worker	add	r8,r8,r14
119*8fb009dcSAndroid Build Coastguard Worker	mov	r6,r6,ror#25
120*8fb009dcSAndroid Build Coastguard Worker	add	r9,r9,r10
121*8fb009dcSAndroid Build Coastguard Worker	mov	r7,r7,ror#25
122*8fb009dcSAndroid Build Coastguard Worker	eor	r6,r6,r8,ror#25
123*8fb009dcSAndroid Build Coastguard Worker	eor	r7,r7,r9,ror#25
124*8fb009dcSAndroid Build Coastguard Worker	add	r0,r0,r5
125*8fb009dcSAndroid Build Coastguard Worker	mov	r10,r10,ror#16
126*8fb009dcSAndroid Build Coastguard Worker	add	r1,r1,r6
127*8fb009dcSAndroid Build Coastguard Worker	mov	r12,r12,ror#16
128*8fb009dcSAndroid Build Coastguard Worker	eor	r10,r10,r0,ror#16
129*8fb009dcSAndroid Build Coastguard Worker	eor	r12,r12,r1,ror#16
130*8fb009dcSAndroid Build Coastguard Worker	add	r8,r8,r10
131*8fb009dcSAndroid Build Coastguard Worker	mov	r5,r5,ror#20
132*8fb009dcSAndroid Build Coastguard Worker	add	r9,r9,r12
133*8fb009dcSAndroid Build Coastguard Worker	mov	r6,r6,ror#20
134*8fb009dcSAndroid Build Coastguard Worker	eor	r5,r5,r8,ror#20
135*8fb009dcSAndroid Build Coastguard Worker	eor	r6,r6,r9,ror#20
136*8fb009dcSAndroid Build Coastguard Worker	add	r0,r0,r5
137*8fb009dcSAndroid Build Coastguard Worker	mov	r10,r10,ror#24
138*8fb009dcSAndroid Build Coastguard Worker	add	r1,r1,r6
139*8fb009dcSAndroid Build Coastguard Worker	mov	r12,r12,ror#24
140*8fb009dcSAndroid Build Coastguard Worker	eor	r10,r10,r0,ror#24
141*8fb009dcSAndroid Build Coastguard Worker	eor	r12,r12,r1,ror#24
142*8fb009dcSAndroid Build Coastguard Worker	add	r8,r8,r10
143*8fb009dcSAndroid Build Coastguard Worker	mov	r5,r5,ror#25
144*8fb009dcSAndroid Build Coastguard Worker	str	r10,[sp,#4*(16+15)]
145*8fb009dcSAndroid Build Coastguard Worker	ldr	r10,[sp,#4*(16+13)]
146*8fb009dcSAndroid Build Coastguard Worker	add	r9,r9,r12
147*8fb009dcSAndroid Build Coastguard Worker	mov	r6,r6,ror#25
148*8fb009dcSAndroid Build Coastguard Worker	eor	r5,r5,r8,ror#25
149*8fb009dcSAndroid Build Coastguard Worker	eor	r6,r6,r9,ror#25
150*8fb009dcSAndroid Build Coastguard Worker	str	r8,[sp,#4*(16+10)]
151*8fb009dcSAndroid Build Coastguard Worker	ldr	r8,[sp,#4*(16+8)]
152*8fb009dcSAndroid Build Coastguard Worker	add	r2,r2,r7
153*8fb009dcSAndroid Build Coastguard Worker	mov	r10,r10,ror#16
154*8fb009dcSAndroid Build Coastguard Worker	str	r9,[sp,#4*(16+11)]
155*8fb009dcSAndroid Build Coastguard Worker	ldr	r9,[sp,#4*(16+9)]
156*8fb009dcSAndroid Build Coastguard Worker	add	r3,r3,r4
157*8fb009dcSAndroid Build Coastguard Worker	mov	r14,r14,ror#16
158*8fb009dcSAndroid Build Coastguard Worker	eor	r10,r10,r2,ror#16
159*8fb009dcSAndroid Build Coastguard Worker	eor	r14,r14,r3,ror#16
160*8fb009dcSAndroid Build Coastguard Worker	add	r8,r8,r10
161*8fb009dcSAndroid Build Coastguard Worker	mov	r7,r7,ror#20
162*8fb009dcSAndroid Build Coastguard Worker	add	r9,r9,r14
163*8fb009dcSAndroid Build Coastguard Worker	mov	r4,r4,ror#20
164*8fb009dcSAndroid Build Coastguard Worker	eor	r7,r7,r8,ror#20
165*8fb009dcSAndroid Build Coastguard Worker	eor	r4,r4,r9,ror#20
166*8fb009dcSAndroid Build Coastguard Worker	add	r2,r2,r7
167*8fb009dcSAndroid Build Coastguard Worker	mov	r10,r10,ror#24
168*8fb009dcSAndroid Build Coastguard Worker	add	r3,r3,r4
169*8fb009dcSAndroid Build Coastguard Worker	mov	r14,r14,ror#24
170*8fb009dcSAndroid Build Coastguard Worker	eor	r10,r10,r2,ror#24
171*8fb009dcSAndroid Build Coastguard Worker	eor	r14,r14,r3,ror#24
172*8fb009dcSAndroid Build Coastguard Worker	add	r8,r8,r10
173*8fb009dcSAndroid Build Coastguard Worker	mov	r7,r7,ror#25
174*8fb009dcSAndroid Build Coastguard Worker	add	r9,r9,r14
175*8fb009dcSAndroid Build Coastguard Worker	mov	r4,r4,ror#25
176*8fb009dcSAndroid Build Coastguard Worker	eor	r7,r7,r8,ror#25
177*8fb009dcSAndroid Build Coastguard Worker	eor	r4,r4,r9,ror#25
178*8fb009dcSAndroid Build Coastguard Worker	bne	.Loop
179*8fb009dcSAndroid Build Coastguard Worker
180*8fb009dcSAndroid Build Coastguard Worker	ldr	r11,[sp,#4*(32+2)]	@ load len
181*8fb009dcSAndroid Build Coastguard Worker
182*8fb009dcSAndroid Build Coastguard Worker	str	r8, [sp,#4*(16+8)]	@ modulo-scheduled store
183*8fb009dcSAndroid Build Coastguard Worker	str	r9, [sp,#4*(16+9)]
184*8fb009dcSAndroid Build Coastguard Worker	str	r12,[sp,#4*(16+12)]
185*8fb009dcSAndroid Build Coastguard Worker	str	r10, [sp,#4*(16+13)]
186*8fb009dcSAndroid Build Coastguard Worker	str	r14,[sp,#4*(16+14)]
187*8fb009dcSAndroid Build Coastguard Worker
188*8fb009dcSAndroid Build Coastguard Worker	@ at this point we have first half of 512-bit result in
189*8fb009dcSAndroid Build Coastguard Worker	@ rx and second half at sp+4*(16+8)
190*8fb009dcSAndroid Build Coastguard Worker
191*8fb009dcSAndroid Build Coastguard Worker	cmp	r11,#64		@ done yet?
192*8fb009dcSAndroid Build Coastguard Worker#ifdef	__thumb2__
193*8fb009dcSAndroid Build Coastguard Worker	itete	lo
194*8fb009dcSAndroid Build Coastguard Worker#endif
195*8fb009dcSAndroid Build Coastguard Worker	addlo	r12,sp,#4*(0)		@ shortcut or ...
196*8fb009dcSAndroid Build Coastguard Worker	ldrhs	r12,[sp,#4*(32+1)]	@ ... load inp
197*8fb009dcSAndroid Build Coastguard Worker	addlo	r14,sp,#4*(0)		@ shortcut or ...
198*8fb009dcSAndroid Build Coastguard Worker	ldrhs	r14,[sp,#4*(32+0)]	@ ... load out
199*8fb009dcSAndroid Build Coastguard Worker
200*8fb009dcSAndroid Build Coastguard Worker	ldr	r8,[sp,#4*(0)]	@ load key material
201*8fb009dcSAndroid Build Coastguard Worker	ldr	r9,[sp,#4*(1)]
202*8fb009dcSAndroid Build Coastguard Worker
203*8fb009dcSAndroid Build Coastguard Worker#if __ARM_ARCH>=6 || !defined(__ARMEB__)
204*8fb009dcSAndroid Build Coastguard Worker# if __ARM_ARCH<7
205*8fb009dcSAndroid Build Coastguard Worker	orr	r10,r12,r14
206*8fb009dcSAndroid Build Coastguard Worker	tst	r10,#3		@ are input and output aligned?
207*8fb009dcSAndroid Build Coastguard Worker	ldr	r10,[sp,#4*(2)]
208*8fb009dcSAndroid Build Coastguard Worker	bne	.Lunaligned
209*8fb009dcSAndroid Build Coastguard Worker	cmp	r11,#64		@ restore flags
210*8fb009dcSAndroid Build Coastguard Worker# else
211*8fb009dcSAndroid Build Coastguard Worker	ldr	r10,[sp,#4*(2)]
212*8fb009dcSAndroid Build Coastguard Worker# endif
213*8fb009dcSAndroid Build Coastguard Worker	ldr	r11,[sp,#4*(3)]
214*8fb009dcSAndroid Build Coastguard Worker
215*8fb009dcSAndroid Build Coastguard Worker	add	r0,r0,r8	@ accumulate key material
216*8fb009dcSAndroid Build Coastguard Worker	add	r1,r1,r9
217*8fb009dcSAndroid Build Coastguard Worker# ifdef	__thumb2__
218*8fb009dcSAndroid Build Coastguard Worker	itt	hs
219*8fb009dcSAndroid Build Coastguard Worker# endif
220*8fb009dcSAndroid Build Coastguard Worker	ldrhs	r8,[r12],#16		@ load input
221*8fb009dcSAndroid Build Coastguard Worker	ldrhs	r9,[r12,#-12]
222*8fb009dcSAndroid Build Coastguard Worker
223*8fb009dcSAndroid Build Coastguard Worker	add	r2,r2,r10
224*8fb009dcSAndroid Build Coastguard Worker	add	r3,r3,r11
225*8fb009dcSAndroid Build Coastguard Worker# ifdef	__thumb2__
226*8fb009dcSAndroid Build Coastguard Worker	itt	hs
227*8fb009dcSAndroid Build Coastguard Worker# endif
228*8fb009dcSAndroid Build Coastguard Worker	ldrhs	r10,[r12,#-8]
229*8fb009dcSAndroid Build Coastguard Worker	ldrhs	r11,[r12,#-4]
230*8fb009dcSAndroid Build Coastguard Worker# if __ARM_ARCH>=6 && defined(__ARMEB__)
231*8fb009dcSAndroid Build Coastguard Worker	rev	r0,r0
232*8fb009dcSAndroid Build Coastguard Worker	rev	r1,r1
233*8fb009dcSAndroid Build Coastguard Worker	rev	r2,r2
234*8fb009dcSAndroid Build Coastguard Worker	rev	r3,r3
235*8fb009dcSAndroid Build Coastguard Worker# endif
236*8fb009dcSAndroid Build Coastguard Worker# ifdef	__thumb2__
237*8fb009dcSAndroid Build Coastguard Worker	itt	hs
238*8fb009dcSAndroid Build Coastguard Worker# endif
239*8fb009dcSAndroid Build Coastguard Worker	eorhs	r0,r0,r8	@ xor with input
240*8fb009dcSAndroid Build Coastguard Worker	eorhs	r1,r1,r9
241*8fb009dcSAndroid Build Coastguard Worker	add	r8,sp,#4*(4)
242*8fb009dcSAndroid Build Coastguard Worker	str	r0,[r14],#16		@ store output
243*8fb009dcSAndroid Build Coastguard Worker# ifdef	__thumb2__
244*8fb009dcSAndroid Build Coastguard Worker	itt	hs
245*8fb009dcSAndroid Build Coastguard Worker# endif
246*8fb009dcSAndroid Build Coastguard Worker	eorhs	r2,r2,r10
247*8fb009dcSAndroid Build Coastguard Worker	eorhs	r3,r3,r11
248*8fb009dcSAndroid Build Coastguard Worker	ldmia	r8,{r8,r9,r10,r11}	@ load key material
249*8fb009dcSAndroid Build Coastguard Worker	str	r1,[r14,#-12]
250*8fb009dcSAndroid Build Coastguard Worker	str	r2,[r14,#-8]
251*8fb009dcSAndroid Build Coastguard Worker	str	r3,[r14,#-4]
252*8fb009dcSAndroid Build Coastguard Worker
253*8fb009dcSAndroid Build Coastguard Worker	add	r4,r4,r8	@ accumulate key material
254*8fb009dcSAndroid Build Coastguard Worker	add	r5,r5,r9
255*8fb009dcSAndroid Build Coastguard Worker# ifdef	__thumb2__
256*8fb009dcSAndroid Build Coastguard Worker	itt	hs
257*8fb009dcSAndroid Build Coastguard Worker# endif
258*8fb009dcSAndroid Build Coastguard Worker	ldrhs	r8,[r12],#16		@ load input
259*8fb009dcSAndroid Build Coastguard Worker	ldrhs	r9,[r12,#-12]
260*8fb009dcSAndroid Build Coastguard Worker	add	r6,r6,r10
261*8fb009dcSAndroid Build Coastguard Worker	add	r7,r7,r11
262*8fb009dcSAndroid Build Coastguard Worker# ifdef	__thumb2__
263*8fb009dcSAndroid Build Coastguard Worker	itt	hs
264*8fb009dcSAndroid Build Coastguard Worker# endif
265*8fb009dcSAndroid Build Coastguard Worker	ldrhs	r10,[r12,#-8]
266*8fb009dcSAndroid Build Coastguard Worker	ldrhs	r11,[r12,#-4]
267*8fb009dcSAndroid Build Coastguard Worker# if __ARM_ARCH>=6 && defined(__ARMEB__)
268*8fb009dcSAndroid Build Coastguard Worker	rev	r4,r4
269*8fb009dcSAndroid Build Coastguard Worker	rev	r5,r5
270*8fb009dcSAndroid Build Coastguard Worker	rev	r6,r6
271*8fb009dcSAndroid Build Coastguard Worker	rev	r7,r7
272*8fb009dcSAndroid Build Coastguard Worker# endif
273*8fb009dcSAndroid Build Coastguard Worker# ifdef	__thumb2__
274*8fb009dcSAndroid Build Coastguard Worker	itt	hs
275*8fb009dcSAndroid Build Coastguard Worker# endif
276*8fb009dcSAndroid Build Coastguard Worker	eorhs	r4,r4,r8
277*8fb009dcSAndroid Build Coastguard Worker	eorhs	r5,r5,r9
278*8fb009dcSAndroid Build Coastguard Worker	add	r8,sp,#4*(8)
279*8fb009dcSAndroid Build Coastguard Worker	str	r4,[r14],#16		@ store output
280*8fb009dcSAndroid Build Coastguard Worker# ifdef	__thumb2__
281*8fb009dcSAndroid Build Coastguard Worker	itt	hs
282*8fb009dcSAndroid Build Coastguard Worker# endif
283*8fb009dcSAndroid Build Coastguard Worker	eorhs	r6,r6,r10
284*8fb009dcSAndroid Build Coastguard Worker	eorhs	r7,r7,r11
285*8fb009dcSAndroid Build Coastguard Worker	str	r5,[r14,#-12]
286*8fb009dcSAndroid Build Coastguard Worker	ldmia	r8,{r8,r9,r10,r11}	@ load key material
287*8fb009dcSAndroid Build Coastguard Worker	str	r6,[r14,#-8]
288*8fb009dcSAndroid Build Coastguard Worker	add	r0,sp,#4*(16+8)
289*8fb009dcSAndroid Build Coastguard Worker	str	r7,[r14,#-4]
290*8fb009dcSAndroid Build Coastguard Worker
291*8fb009dcSAndroid Build Coastguard Worker	ldmia	r0,{r0,r1,r2,r3,r4,r5,r6,r7}	@ load second half
292*8fb009dcSAndroid Build Coastguard Worker
293*8fb009dcSAndroid Build Coastguard Worker	add	r0,r0,r8	@ accumulate key material
294*8fb009dcSAndroid Build Coastguard Worker	add	r1,r1,r9
295*8fb009dcSAndroid Build Coastguard Worker# ifdef	__thumb2__
296*8fb009dcSAndroid Build Coastguard Worker	itt	hs
297*8fb009dcSAndroid Build Coastguard Worker# endif
298*8fb009dcSAndroid Build Coastguard Worker	ldrhs	r8,[r12],#16		@ load input
299*8fb009dcSAndroid Build Coastguard Worker	ldrhs	r9,[r12,#-12]
300*8fb009dcSAndroid Build Coastguard Worker# ifdef	__thumb2__
301*8fb009dcSAndroid Build Coastguard Worker	itt	hi
302*8fb009dcSAndroid Build Coastguard Worker# endif
303*8fb009dcSAndroid Build Coastguard Worker	strhi	r10,[sp,#4*(16+10)]	@ copy "rx" while at it
304*8fb009dcSAndroid Build Coastguard Worker	strhi	r11,[sp,#4*(16+11)]	@ copy "rx" while at it
305*8fb009dcSAndroid Build Coastguard Worker	add	r2,r2,r10
306*8fb009dcSAndroid Build Coastguard Worker	add	r3,r3,r11
307*8fb009dcSAndroid Build Coastguard Worker# ifdef	__thumb2__
308*8fb009dcSAndroid Build Coastguard Worker	itt	hs
309*8fb009dcSAndroid Build Coastguard Worker# endif
310*8fb009dcSAndroid Build Coastguard Worker	ldrhs	r10,[r12,#-8]
311*8fb009dcSAndroid Build Coastguard Worker	ldrhs	r11,[r12,#-4]
312*8fb009dcSAndroid Build Coastguard Worker# if __ARM_ARCH>=6 && defined(__ARMEB__)
313*8fb009dcSAndroid Build Coastguard Worker	rev	r0,r0
314*8fb009dcSAndroid Build Coastguard Worker	rev	r1,r1
315*8fb009dcSAndroid Build Coastguard Worker	rev	r2,r2
316*8fb009dcSAndroid Build Coastguard Worker	rev	r3,r3
317*8fb009dcSAndroid Build Coastguard Worker# endif
318*8fb009dcSAndroid Build Coastguard Worker# ifdef	__thumb2__
319*8fb009dcSAndroid Build Coastguard Worker	itt	hs
320*8fb009dcSAndroid Build Coastguard Worker# endif
321*8fb009dcSAndroid Build Coastguard Worker	eorhs	r0,r0,r8
322*8fb009dcSAndroid Build Coastguard Worker	eorhs	r1,r1,r9
323*8fb009dcSAndroid Build Coastguard Worker	add	r8,sp,#4*(12)
324*8fb009dcSAndroid Build Coastguard Worker	str	r0,[r14],#16		@ store output
325*8fb009dcSAndroid Build Coastguard Worker# ifdef	__thumb2__
326*8fb009dcSAndroid Build Coastguard Worker	itt	hs
327*8fb009dcSAndroid Build Coastguard Worker# endif
328*8fb009dcSAndroid Build Coastguard Worker	eorhs	r2,r2,r10
329*8fb009dcSAndroid Build Coastguard Worker	eorhs	r3,r3,r11
330*8fb009dcSAndroid Build Coastguard Worker	str	r1,[r14,#-12]
331*8fb009dcSAndroid Build Coastguard Worker	ldmia	r8,{r8,r9,r10,r11}	@ load key material
332*8fb009dcSAndroid Build Coastguard Worker	str	r2,[r14,#-8]
333*8fb009dcSAndroid Build Coastguard Worker	str	r3,[r14,#-4]
334*8fb009dcSAndroid Build Coastguard Worker
335*8fb009dcSAndroid Build Coastguard Worker	add	r4,r4,r8	@ accumulate key material
336*8fb009dcSAndroid Build Coastguard Worker	add	r5,r5,r9
337*8fb009dcSAndroid Build Coastguard Worker# ifdef	__thumb2__
338*8fb009dcSAndroid Build Coastguard Worker	itt	hi
339*8fb009dcSAndroid Build Coastguard Worker# endif
340*8fb009dcSAndroid Build Coastguard Worker	addhi	r8,r8,#1		@ next counter value
341*8fb009dcSAndroid Build Coastguard Worker	strhi	r8,[sp,#4*(12)]	@ save next counter value
342*8fb009dcSAndroid Build Coastguard Worker# ifdef	__thumb2__
343*8fb009dcSAndroid Build Coastguard Worker	itt	hs
344*8fb009dcSAndroid Build Coastguard Worker# endif
345*8fb009dcSAndroid Build Coastguard Worker	ldrhs	r8,[r12],#16		@ load input
346*8fb009dcSAndroid Build Coastguard Worker	ldrhs	r9,[r12,#-12]
347*8fb009dcSAndroid Build Coastguard Worker	add	r6,r6,r10
348*8fb009dcSAndroid Build Coastguard Worker	add	r7,r7,r11
349*8fb009dcSAndroid Build Coastguard Worker# ifdef	__thumb2__
350*8fb009dcSAndroid Build Coastguard Worker	itt	hs
351*8fb009dcSAndroid Build Coastguard Worker# endif
352*8fb009dcSAndroid Build Coastguard Worker	ldrhs	r10,[r12,#-8]
353*8fb009dcSAndroid Build Coastguard Worker	ldrhs	r11,[r12,#-4]
354*8fb009dcSAndroid Build Coastguard Worker# if __ARM_ARCH>=6 && defined(__ARMEB__)
355*8fb009dcSAndroid Build Coastguard Worker	rev	r4,r4
356*8fb009dcSAndroid Build Coastguard Worker	rev	r5,r5
357*8fb009dcSAndroid Build Coastguard Worker	rev	r6,r6
358*8fb009dcSAndroid Build Coastguard Worker	rev	r7,r7
359*8fb009dcSAndroid Build Coastguard Worker# endif
360*8fb009dcSAndroid Build Coastguard Worker# ifdef	__thumb2__
361*8fb009dcSAndroid Build Coastguard Worker	itt	hs
362*8fb009dcSAndroid Build Coastguard Worker# endif
363*8fb009dcSAndroid Build Coastguard Worker	eorhs	r4,r4,r8
364*8fb009dcSAndroid Build Coastguard Worker	eorhs	r5,r5,r9
365*8fb009dcSAndroid Build Coastguard Worker# ifdef	__thumb2__
366*8fb009dcSAndroid Build Coastguard Worker	it	ne
367*8fb009dcSAndroid Build Coastguard Worker# endif
368*8fb009dcSAndroid Build Coastguard Worker	ldrne	r8,[sp,#4*(32+2)]	@ re-load len
369*8fb009dcSAndroid Build Coastguard Worker# ifdef	__thumb2__
370*8fb009dcSAndroid Build Coastguard Worker	itt	hs
371*8fb009dcSAndroid Build Coastguard Worker# endif
372*8fb009dcSAndroid Build Coastguard Worker	eorhs	r6,r6,r10
373*8fb009dcSAndroid Build Coastguard Worker	eorhs	r7,r7,r11
374*8fb009dcSAndroid Build Coastguard Worker	str	r4,[r14],#16		@ store output
375*8fb009dcSAndroid Build Coastguard Worker	str	r5,[r14,#-12]
376*8fb009dcSAndroid Build Coastguard Worker# ifdef	__thumb2__
377*8fb009dcSAndroid Build Coastguard Worker	it	hs
378*8fb009dcSAndroid Build Coastguard Worker# endif
379*8fb009dcSAndroid Build Coastguard Worker	subhs	r11,r8,#64		@ len-=64
380*8fb009dcSAndroid Build Coastguard Worker	str	r6,[r14,#-8]
381*8fb009dcSAndroid Build Coastguard Worker	str	r7,[r14,#-4]
382*8fb009dcSAndroid Build Coastguard Worker	bhi	.Loop_outer
383*8fb009dcSAndroid Build Coastguard Worker
384*8fb009dcSAndroid Build Coastguard Worker	beq	.Ldone
385*8fb009dcSAndroid Build Coastguard Worker# if __ARM_ARCH<7
386*8fb009dcSAndroid Build Coastguard Worker	b	.Ltail
387*8fb009dcSAndroid Build Coastguard Worker
388*8fb009dcSAndroid Build Coastguard Worker.align	4
389*8fb009dcSAndroid Build Coastguard Worker.Lunaligned:@ unaligned endian-neutral path
390*8fb009dcSAndroid Build Coastguard Worker	cmp	r11,#64		@ restore flags
391*8fb009dcSAndroid Build Coastguard Worker# endif
392*8fb009dcSAndroid Build Coastguard Worker#endif
393*8fb009dcSAndroid Build Coastguard Worker#if __ARM_ARCH<7
394*8fb009dcSAndroid Build Coastguard Worker	ldr	r11,[sp,#4*(3)]
395*8fb009dcSAndroid Build Coastguard Worker	add	r0,r0,r8		@ accumulate key material
396*8fb009dcSAndroid Build Coastguard Worker	add	r1,r1,r9
397*8fb009dcSAndroid Build Coastguard Worker	add	r2,r2,r10
398*8fb009dcSAndroid Build Coastguard Worker# ifdef	__thumb2__
399*8fb009dcSAndroid Build Coastguard Worker	itete	lo
400*8fb009dcSAndroid Build Coastguard Worker# endif
401*8fb009dcSAndroid Build Coastguard Worker	eorlo	r8,r8,r8		@ zero or ...
402*8fb009dcSAndroid Build Coastguard Worker	ldrhsb	r8,[r12],#16			@ ... load input
403*8fb009dcSAndroid Build Coastguard Worker	eorlo	r9,r9,r9
404*8fb009dcSAndroid Build Coastguard Worker	ldrhsb	r9,[r12,#-12]
405*8fb009dcSAndroid Build Coastguard Worker
406*8fb009dcSAndroid Build Coastguard Worker	add	r3,r3,r11
407*8fb009dcSAndroid Build Coastguard Worker# ifdef	__thumb2__
408*8fb009dcSAndroid Build Coastguard Worker	itete	lo
409*8fb009dcSAndroid Build Coastguard Worker# endif
410*8fb009dcSAndroid Build Coastguard Worker	eorlo	r10,r10,r10
411*8fb009dcSAndroid Build Coastguard Worker	ldrhsb	r10,[r12,#-8]
412*8fb009dcSAndroid Build Coastguard Worker	eorlo	r11,r11,r11
413*8fb009dcSAndroid Build Coastguard Worker	ldrhsb	r11,[r12,#-4]
414*8fb009dcSAndroid Build Coastguard Worker
415*8fb009dcSAndroid Build Coastguard Worker	eor	r0,r8,r0		@ xor with input (or zero)
416*8fb009dcSAndroid Build Coastguard Worker	eor	r1,r9,r1
417*8fb009dcSAndroid Build Coastguard Worker# ifdef	__thumb2__
418*8fb009dcSAndroid Build Coastguard Worker	itt	hs
419*8fb009dcSAndroid Build Coastguard Worker# endif
420*8fb009dcSAndroid Build Coastguard Worker	ldrhsb	r8,[r12,#-15]		@ load more input
421*8fb009dcSAndroid Build Coastguard Worker	ldrhsb	r9,[r12,#-11]
422*8fb009dcSAndroid Build Coastguard Worker	eor	r2,r10,r2
423*8fb009dcSAndroid Build Coastguard Worker	strb	r0,[r14],#16		@ store output
424*8fb009dcSAndroid Build Coastguard Worker	eor	r3,r11,r3
425*8fb009dcSAndroid Build Coastguard Worker# ifdef	__thumb2__
426*8fb009dcSAndroid Build Coastguard Worker	itt	hs
427*8fb009dcSAndroid Build Coastguard Worker# endif
428*8fb009dcSAndroid Build Coastguard Worker	ldrhsb	r10,[r12,#-7]
429*8fb009dcSAndroid Build Coastguard Worker	ldrhsb	r11,[r12,#-3]
430*8fb009dcSAndroid Build Coastguard Worker	strb	r1,[r14,#-12]
431*8fb009dcSAndroid Build Coastguard Worker	eor	r0,r8,r0,lsr#8
432*8fb009dcSAndroid Build Coastguard Worker	strb	r2,[r14,#-8]
433*8fb009dcSAndroid Build Coastguard Worker	eor	r1,r9,r1,lsr#8
434*8fb009dcSAndroid Build Coastguard Worker# ifdef	__thumb2__
435*8fb009dcSAndroid Build Coastguard Worker	itt	hs
436*8fb009dcSAndroid Build Coastguard Worker# endif
437*8fb009dcSAndroid Build Coastguard Worker	ldrhsb	r8,[r12,#-14]		@ load more input
438*8fb009dcSAndroid Build Coastguard Worker	ldrhsb	r9,[r12,#-10]
439*8fb009dcSAndroid Build Coastguard Worker	strb	r3,[r14,#-4]
440*8fb009dcSAndroid Build Coastguard Worker	eor	r2,r10,r2,lsr#8
441*8fb009dcSAndroid Build Coastguard Worker	strb	r0,[r14,#-15]
442*8fb009dcSAndroid Build Coastguard Worker	eor	r3,r11,r3,lsr#8
443*8fb009dcSAndroid Build Coastguard Worker# ifdef	__thumb2__
444*8fb009dcSAndroid Build Coastguard Worker	itt	hs
445*8fb009dcSAndroid Build Coastguard Worker# endif
446*8fb009dcSAndroid Build Coastguard Worker	ldrhsb	r10,[r12,#-6]
447*8fb009dcSAndroid Build Coastguard Worker	ldrhsb	r11,[r12,#-2]
448*8fb009dcSAndroid Build Coastguard Worker	strb	r1,[r14,#-11]
449*8fb009dcSAndroid Build Coastguard Worker	eor	r0,r8,r0,lsr#8
450*8fb009dcSAndroid Build Coastguard Worker	strb	r2,[r14,#-7]
451*8fb009dcSAndroid Build Coastguard Worker	eor	r1,r9,r1,lsr#8
452*8fb009dcSAndroid Build Coastguard Worker# ifdef	__thumb2__
453*8fb009dcSAndroid Build Coastguard Worker	itt	hs
454*8fb009dcSAndroid Build Coastguard Worker# endif
455*8fb009dcSAndroid Build Coastguard Worker	ldrhsb	r8,[r12,#-13]		@ load more input
456*8fb009dcSAndroid Build Coastguard Worker	ldrhsb	r9,[r12,#-9]
457*8fb009dcSAndroid Build Coastguard Worker	strb	r3,[r14,#-3]
458*8fb009dcSAndroid Build Coastguard Worker	eor	r2,r10,r2,lsr#8
459*8fb009dcSAndroid Build Coastguard Worker	strb	r0,[r14,#-14]
460*8fb009dcSAndroid Build Coastguard Worker	eor	r3,r11,r3,lsr#8
461*8fb009dcSAndroid Build Coastguard Worker# ifdef	__thumb2__
462*8fb009dcSAndroid Build Coastguard Worker	itt	hs
463*8fb009dcSAndroid Build Coastguard Worker# endif
464*8fb009dcSAndroid Build Coastguard Worker	ldrhsb	r10,[r12,#-5]
465*8fb009dcSAndroid Build Coastguard Worker	ldrhsb	r11,[r12,#-1]
466*8fb009dcSAndroid Build Coastguard Worker	strb	r1,[r14,#-10]
467*8fb009dcSAndroid Build Coastguard Worker	strb	r2,[r14,#-6]
468*8fb009dcSAndroid Build Coastguard Worker	eor	r0,r8,r0,lsr#8
469*8fb009dcSAndroid Build Coastguard Worker	strb	r3,[r14,#-2]
470*8fb009dcSAndroid Build Coastguard Worker	eor	r1,r9,r1,lsr#8
471*8fb009dcSAndroid Build Coastguard Worker	strb	r0,[r14,#-13]
472*8fb009dcSAndroid Build Coastguard Worker	eor	r2,r10,r2,lsr#8
473*8fb009dcSAndroid Build Coastguard Worker	strb	r1,[r14,#-9]
474*8fb009dcSAndroid Build Coastguard Worker	eor	r3,r11,r3,lsr#8
475*8fb009dcSAndroid Build Coastguard Worker	strb	r2,[r14,#-5]
476*8fb009dcSAndroid Build Coastguard Worker	strb	r3,[r14,#-1]
477*8fb009dcSAndroid Build Coastguard Worker	add	r8,sp,#4*(4+0)
478*8fb009dcSAndroid Build Coastguard Worker	ldmia	r8,{r8,r9,r10,r11}		@ load key material
479*8fb009dcSAndroid Build Coastguard Worker	add	r0,sp,#4*(16+8)
480*8fb009dcSAndroid Build Coastguard Worker	add	r4,r4,r8		@ accumulate key material
481*8fb009dcSAndroid Build Coastguard Worker	add	r5,r5,r9
482*8fb009dcSAndroid Build Coastguard Worker	add	r6,r6,r10
483*8fb009dcSAndroid Build Coastguard Worker# ifdef	__thumb2__
484*8fb009dcSAndroid Build Coastguard Worker	itete	lo
485*8fb009dcSAndroid Build Coastguard Worker# endif
486*8fb009dcSAndroid Build Coastguard Worker	eorlo	r8,r8,r8		@ zero or ...
487*8fb009dcSAndroid Build Coastguard Worker	ldrhsb	r8,[r12],#16			@ ... load input
488*8fb009dcSAndroid Build Coastguard Worker	eorlo	r9,r9,r9
489*8fb009dcSAndroid Build Coastguard Worker	ldrhsb	r9,[r12,#-12]
490*8fb009dcSAndroid Build Coastguard Worker
491*8fb009dcSAndroid Build Coastguard Worker	add	r7,r7,r11
492*8fb009dcSAndroid Build Coastguard Worker# ifdef	__thumb2__
493*8fb009dcSAndroid Build Coastguard Worker	itete	lo
494*8fb009dcSAndroid Build Coastguard Worker# endif
495*8fb009dcSAndroid Build Coastguard Worker	eorlo	r10,r10,r10
496*8fb009dcSAndroid Build Coastguard Worker	ldrhsb	r10,[r12,#-8]
497*8fb009dcSAndroid Build Coastguard Worker	eorlo	r11,r11,r11
498*8fb009dcSAndroid Build Coastguard Worker	ldrhsb	r11,[r12,#-4]
499*8fb009dcSAndroid Build Coastguard Worker
500*8fb009dcSAndroid Build Coastguard Worker	eor	r4,r8,r4		@ xor with input (or zero)
501*8fb009dcSAndroid Build Coastguard Worker	eor	r5,r9,r5
502*8fb009dcSAndroid Build Coastguard Worker# ifdef	__thumb2__
503*8fb009dcSAndroid Build Coastguard Worker	itt	hs
504*8fb009dcSAndroid Build Coastguard Worker# endif
505*8fb009dcSAndroid Build Coastguard Worker	ldrhsb	r8,[r12,#-15]		@ load more input
506*8fb009dcSAndroid Build Coastguard Worker	ldrhsb	r9,[r12,#-11]
507*8fb009dcSAndroid Build Coastguard Worker	eor	r6,r10,r6
508*8fb009dcSAndroid Build Coastguard Worker	strb	r4,[r14],#16		@ store output
509*8fb009dcSAndroid Build Coastguard Worker	eor	r7,r11,r7
510*8fb009dcSAndroid Build Coastguard Worker# ifdef	__thumb2__
511*8fb009dcSAndroid Build Coastguard Worker	itt	hs
512*8fb009dcSAndroid Build Coastguard Worker# endif
513*8fb009dcSAndroid Build Coastguard Worker	ldrhsb	r10,[r12,#-7]
514*8fb009dcSAndroid Build Coastguard Worker	ldrhsb	r11,[r12,#-3]
515*8fb009dcSAndroid Build Coastguard Worker	strb	r5,[r14,#-12]
516*8fb009dcSAndroid Build Coastguard Worker	eor	r4,r8,r4,lsr#8
517*8fb009dcSAndroid Build Coastguard Worker	strb	r6,[r14,#-8]
518*8fb009dcSAndroid Build Coastguard Worker	eor	r5,r9,r5,lsr#8
519*8fb009dcSAndroid Build Coastguard Worker# ifdef	__thumb2__
520*8fb009dcSAndroid Build Coastguard Worker	itt	hs
521*8fb009dcSAndroid Build Coastguard Worker# endif
522*8fb009dcSAndroid Build Coastguard Worker	ldrhsb	r8,[r12,#-14]		@ load more input
523*8fb009dcSAndroid Build Coastguard Worker	ldrhsb	r9,[r12,#-10]
524*8fb009dcSAndroid Build Coastguard Worker	strb	r7,[r14,#-4]
525*8fb009dcSAndroid Build Coastguard Worker	eor	r6,r10,r6,lsr#8
526*8fb009dcSAndroid Build Coastguard Worker	strb	r4,[r14,#-15]
527*8fb009dcSAndroid Build Coastguard Worker	eor	r7,r11,r7,lsr#8
528*8fb009dcSAndroid Build Coastguard Worker# ifdef	__thumb2__
529*8fb009dcSAndroid Build Coastguard Worker	itt	hs
530*8fb009dcSAndroid Build Coastguard Worker# endif
531*8fb009dcSAndroid Build Coastguard Worker	ldrhsb	r10,[r12,#-6]
532*8fb009dcSAndroid Build Coastguard Worker	ldrhsb	r11,[r12,#-2]
533*8fb009dcSAndroid Build Coastguard Worker	strb	r5,[r14,#-11]
534*8fb009dcSAndroid Build Coastguard Worker	eor	r4,r8,r4,lsr#8
535*8fb009dcSAndroid Build Coastguard Worker	strb	r6,[r14,#-7]
536*8fb009dcSAndroid Build Coastguard Worker	eor	r5,r9,r5,lsr#8
537*8fb009dcSAndroid Build Coastguard Worker# ifdef	__thumb2__
538*8fb009dcSAndroid Build Coastguard Worker	itt	hs
539*8fb009dcSAndroid Build Coastguard Worker# endif
540*8fb009dcSAndroid Build Coastguard Worker	ldrhsb	r8,[r12,#-13]		@ load more input
541*8fb009dcSAndroid Build Coastguard Worker	ldrhsb	r9,[r12,#-9]
542*8fb009dcSAndroid Build Coastguard Worker	strb	r7,[r14,#-3]
543*8fb009dcSAndroid Build Coastguard Worker	eor	r6,r10,r6,lsr#8
544*8fb009dcSAndroid Build Coastguard Worker	strb	r4,[r14,#-14]
545*8fb009dcSAndroid Build Coastguard Worker	eor	r7,r11,r7,lsr#8
546*8fb009dcSAndroid Build Coastguard Worker# ifdef	__thumb2__
547*8fb009dcSAndroid Build Coastguard Worker	itt	hs
548*8fb009dcSAndroid Build Coastguard Worker# endif
549*8fb009dcSAndroid Build Coastguard Worker	ldrhsb	r10,[r12,#-5]
550*8fb009dcSAndroid Build Coastguard Worker	ldrhsb	r11,[r12,#-1]
551*8fb009dcSAndroid Build Coastguard Worker	strb	r5,[r14,#-10]
552*8fb009dcSAndroid Build Coastguard Worker	strb	r6,[r14,#-6]
553*8fb009dcSAndroid Build Coastguard Worker	eor	r4,r8,r4,lsr#8
554*8fb009dcSAndroid Build Coastguard Worker	strb	r7,[r14,#-2]
555*8fb009dcSAndroid Build Coastguard Worker	eor	r5,r9,r5,lsr#8
556*8fb009dcSAndroid Build Coastguard Worker	strb	r4,[r14,#-13]
557*8fb009dcSAndroid Build Coastguard Worker	eor	r6,r10,r6,lsr#8
558*8fb009dcSAndroid Build Coastguard Worker	strb	r5,[r14,#-9]
559*8fb009dcSAndroid Build Coastguard Worker	eor	r7,r11,r7,lsr#8
560*8fb009dcSAndroid Build Coastguard Worker	strb	r6,[r14,#-5]
561*8fb009dcSAndroid Build Coastguard Worker	strb	r7,[r14,#-1]
562*8fb009dcSAndroid Build Coastguard Worker	add	r8,sp,#4*(4+4)
563*8fb009dcSAndroid Build Coastguard Worker	ldmia	r8,{r8,r9,r10,r11}		@ load key material
564*8fb009dcSAndroid Build Coastguard Worker	ldmia	r0,{r0,r1,r2,r3,r4,r5,r6,r7}		@ load second half
565*8fb009dcSAndroid Build Coastguard Worker# ifdef	__thumb2__
566*8fb009dcSAndroid Build Coastguard Worker	itt	hi
567*8fb009dcSAndroid Build Coastguard Worker# endif
568*8fb009dcSAndroid Build Coastguard Worker	strhi	r10,[sp,#4*(16+10)]		@ copy "rx"
569*8fb009dcSAndroid Build Coastguard Worker	strhi	r11,[sp,#4*(16+11)]		@ copy "rx"
570*8fb009dcSAndroid Build Coastguard Worker	add	r0,r0,r8		@ accumulate key material
571*8fb009dcSAndroid Build Coastguard Worker	add	r1,r1,r9
572*8fb009dcSAndroid Build Coastguard Worker	add	r2,r2,r10
573*8fb009dcSAndroid Build Coastguard Worker# ifdef	__thumb2__
574*8fb009dcSAndroid Build Coastguard Worker	itete	lo
575*8fb009dcSAndroid Build Coastguard Worker# endif
576*8fb009dcSAndroid Build Coastguard Worker	eorlo	r8,r8,r8		@ zero or ...
577*8fb009dcSAndroid Build Coastguard Worker	ldrhsb	r8,[r12],#16			@ ... load input
578*8fb009dcSAndroid Build Coastguard Worker	eorlo	r9,r9,r9
579*8fb009dcSAndroid Build Coastguard Worker	ldrhsb	r9,[r12,#-12]
580*8fb009dcSAndroid Build Coastguard Worker
581*8fb009dcSAndroid Build Coastguard Worker	add	r3,r3,r11
582*8fb009dcSAndroid Build Coastguard Worker# ifdef	__thumb2__
583*8fb009dcSAndroid Build Coastguard Worker	itete	lo
584*8fb009dcSAndroid Build Coastguard Worker# endif
585*8fb009dcSAndroid Build Coastguard Worker	eorlo	r10,r10,r10
586*8fb009dcSAndroid Build Coastguard Worker	ldrhsb	r10,[r12,#-8]
587*8fb009dcSAndroid Build Coastguard Worker	eorlo	r11,r11,r11
588*8fb009dcSAndroid Build Coastguard Worker	ldrhsb	r11,[r12,#-4]
589*8fb009dcSAndroid Build Coastguard Worker
590*8fb009dcSAndroid Build Coastguard Worker	eor	r0,r8,r0		@ xor with input (or zero)
591*8fb009dcSAndroid Build Coastguard Worker	eor	r1,r9,r1
592*8fb009dcSAndroid Build Coastguard Worker# ifdef	__thumb2__
593*8fb009dcSAndroid Build Coastguard Worker	itt	hs
594*8fb009dcSAndroid Build Coastguard Worker# endif
595*8fb009dcSAndroid Build Coastguard Worker	ldrhsb	r8,[r12,#-15]		@ load more input
596*8fb009dcSAndroid Build Coastguard Worker	ldrhsb	r9,[r12,#-11]
597*8fb009dcSAndroid Build Coastguard Worker	eor	r2,r10,r2
598*8fb009dcSAndroid Build Coastguard Worker	strb	r0,[r14],#16		@ store output
599*8fb009dcSAndroid Build Coastguard Worker	eor	r3,r11,r3
600*8fb009dcSAndroid Build Coastguard Worker# ifdef	__thumb2__
601*8fb009dcSAndroid Build Coastguard Worker	itt	hs
602*8fb009dcSAndroid Build Coastguard Worker# endif
603*8fb009dcSAndroid Build Coastguard Worker	ldrhsb	r10,[r12,#-7]
604*8fb009dcSAndroid Build Coastguard Worker	ldrhsb	r11,[r12,#-3]
605*8fb009dcSAndroid Build Coastguard Worker	strb	r1,[r14,#-12]
606*8fb009dcSAndroid Build Coastguard Worker	eor	r0,r8,r0,lsr#8
607*8fb009dcSAndroid Build Coastguard Worker	strb	r2,[r14,#-8]
608*8fb009dcSAndroid Build Coastguard Worker	eor	r1,r9,r1,lsr#8
609*8fb009dcSAndroid Build Coastguard Worker# ifdef	__thumb2__
610*8fb009dcSAndroid Build Coastguard Worker	itt	hs
611*8fb009dcSAndroid Build Coastguard Worker# endif
612*8fb009dcSAndroid Build Coastguard Worker	ldrhsb	r8,[r12,#-14]		@ load more input
613*8fb009dcSAndroid Build Coastguard Worker	ldrhsb	r9,[r12,#-10]
614*8fb009dcSAndroid Build Coastguard Worker	strb	r3,[r14,#-4]
615*8fb009dcSAndroid Build Coastguard Worker	eor	r2,r10,r2,lsr#8
616*8fb009dcSAndroid Build Coastguard Worker	strb	r0,[r14,#-15]
617*8fb009dcSAndroid Build Coastguard Worker	eor	r3,r11,r3,lsr#8
618*8fb009dcSAndroid Build Coastguard Worker# ifdef	__thumb2__
619*8fb009dcSAndroid Build Coastguard Worker	itt	hs
620*8fb009dcSAndroid Build Coastguard Worker# endif
621*8fb009dcSAndroid Build Coastguard Worker	ldrhsb	r10,[r12,#-6]
622*8fb009dcSAndroid Build Coastguard Worker	ldrhsb	r11,[r12,#-2]
623*8fb009dcSAndroid Build Coastguard Worker	strb	r1,[r14,#-11]
624*8fb009dcSAndroid Build Coastguard Worker	eor	r0,r8,r0,lsr#8
625*8fb009dcSAndroid Build Coastguard Worker	strb	r2,[r14,#-7]
626*8fb009dcSAndroid Build Coastguard Worker	eor	r1,r9,r1,lsr#8
627*8fb009dcSAndroid Build Coastguard Worker# ifdef	__thumb2__
628*8fb009dcSAndroid Build Coastguard Worker	itt	hs
629*8fb009dcSAndroid Build Coastguard Worker# endif
630*8fb009dcSAndroid Build Coastguard Worker	ldrhsb	r8,[r12,#-13]		@ load more input
631*8fb009dcSAndroid Build Coastguard Worker	ldrhsb	r9,[r12,#-9]
632*8fb009dcSAndroid Build Coastguard Worker	strb	r3,[r14,#-3]
633*8fb009dcSAndroid Build Coastguard Worker	eor	r2,r10,r2,lsr#8
634*8fb009dcSAndroid Build Coastguard Worker	strb	r0,[r14,#-14]
635*8fb009dcSAndroid Build Coastguard Worker	eor	r3,r11,r3,lsr#8
636*8fb009dcSAndroid Build Coastguard Worker# ifdef	__thumb2__
637*8fb009dcSAndroid Build Coastguard Worker	itt	hs
638*8fb009dcSAndroid Build Coastguard Worker# endif
639*8fb009dcSAndroid Build Coastguard Worker	ldrhsb	r10,[r12,#-5]
640*8fb009dcSAndroid Build Coastguard Worker	ldrhsb	r11,[r12,#-1]
641*8fb009dcSAndroid Build Coastguard Worker	strb	r1,[r14,#-10]
642*8fb009dcSAndroid Build Coastguard Worker	strb	r2,[r14,#-6]
643*8fb009dcSAndroid Build Coastguard Worker	eor	r0,r8,r0,lsr#8
644*8fb009dcSAndroid Build Coastguard Worker	strb	r3,[r14,#-2]
645*8fb009dcSAndroid Build Coastguard Worker	eor	r1,r9,r1,lsr#8
646*8fb009dcSAndroid Build Coastguard Worker	strb	r0,[r14,#-13]
647*8fb009dcSAndroid Build Coastguard Worker	eor	r2,r10,r2,lsr#8
648*8fb009dcSAndroid Build Coastguard Worker	strb	r1,[r14,#-9]
649*8fb009dcSAndroid Build Coastguard Worker	eor	r3,r11,r3,lsr#8
650*8fb009dcSAndroid Build Coastguard Worker	strb	r2,[r14,#-5]
651*8fb009dcSAndroid Build Coastguard Worker	strb	r3,[r14,#-1]
652*8fb009dcSAndroid Build Coastguard Worker	add	r8,sp,#4*(4+8)
653*8fb009dcSAndroid Build Coastguard Worker	ldmia	r8,{r8,r9,r10,r11}		@ load key material
654*8fb009dcSAndroid Build Coastguard Worker	add	r4,r4,r8		@ accumulate key material
655*8fb009dcSAndroid Build Coastguard Worker# ifdef	__thumb2__
656*8fb009dcSAndroid Build Coastguard Worker	itt	hi
657*8fb009dcSAndroid Build Coastguard Worker# endif
658*8fb009dcSAndroid Build Coastguard Worker	addhi	r8,r8,#1			@ next counter value
659*8fb009dcSAndroid Build Coastguard Worker	strhi	r8,[sp,#4*(12)]		@ save next counter value
660*8fb009dcSAndroid Build Coastguard Worker	add	r5,r5,r9
661*8fb009dcSAndroid Build Coastguard Worker	add	r6,r6,r10
662*8fb009dcSAndroid Build Coastguard Worker# ifdef	__thumb2__
663*8fb009dcSAndroid Build Coastguard Worker	itete	lo
664*8fb009dcSAndroid Build Coastguard Worker# endif
665*8fb009dcSAndroid Build Coastguard Worker	eorlo	r8,r8,r8		@ zero or ...
666*8fb009dcSAndroid Build Coastguard Worker	ldrhsb	r8,[r12],#16			@ ... load input
667*8fb009dcSAndroid Build Coastguard Worker	eorlo	r9,r9,r9
668*8fb009dcSAndroid Build Coastguard Worker	ldrhsb	r9,[r12,#-12]
669*8fb009dcSAndroid Build Coastguard Worker
670*8fb009dcSAndroid Build Coastguard Worker	add	r7,r7,r11
671*8fb009dcSAndroid Build Coastguard Worker# ifdef	__thumb2__
672*8fb009dcSAndroid Build Coastguard Worker	itete	lo
673*8fb009dcSAndroid Build Coastguard Worker# endif
674*8fb009dcSAndroid Build Coastguard Worker	eorlo	r10,r10,r10
675*8fb009dcSAndroid Build Coastguard Worker	ldrhsb	r10,[r12,#-8]
676*8fb009dcSAndroid Build Coastguard Worker	eorlo	r11,r11,r11
677*8fb009dcSAndroid Build Coastguard Worker	ldrhsb	r11,[r12,#-4]
678*8fb009dcSAndroid Build Coastguard Worker
679*8fb009dcSAndroid Build Coastguard Worker	eor	r4,r8,r4		@ xor with input (or zero)
680*8fb009dcSAndroid Build Coastguard Worker	eor	r5,r9,r5
681*8fb009dcSAndroid Build Coastguard Worker# ifdef	__thumb2__
682*8fb009dcSAndroid Build Coastguard Worker	itt	hs
683*8fb009dcSAndroid Build Coastguard Worker# endif
684*8fb009dcSAndroid Build Coastguard Worker	ldrhsb	r8,[r12,#-15]		@ load more input
685*8fb009dcSAndroid Build Coastguard Worker	ldrhsb	r9,[r12,#-11]
686*8fb009dcSAndroid Build Coastguard Worker	eor	r6,r10,r6
687*8fb009dcSAndroid Build Coastguard Worker	strb	r4,[r14],#16		@ store output
688*8fb009dcSAndroid Build Coastguard Worker	eor	r7,r11,r7
689*8fb009dcSAndroid Build Coastguard Worker# ifdef	__thumb2__
690*8fb009dcSAndroid Build Coastguard Worker	itt	hs
691*8fb009dcSAndroid Build Coastguard Worker# endif
692*8fb009dcSAndroid Build Coastguard Worker	ldrhsb	r10,[r12,#-7]
693*8fb009dcSAndroid Build Coastguard Worker	ldrhsb	r11,[r12,#-3]
694*8fb009dcSAndroid Build Coastguard Worker	strb	r5,[r14,#-12]
695*8fb009dcSAndroid Build Coastguard Worker	eor	r4,r8,r4,lsr#8
696*8fb009dcSAndroid Build Coastguard Worker	strb	r6,[r14,#-8]
697*8fb009dcSAndroid Build Coastguard Worker	eor	r5,r9,r5,lsr#8
698*8fb009dcSAndroid Build Coastguard Worker# ifdef	__thumb2__
699*8fb009dcSAndroid Build Coastguard Worker	itt	hs
700*8fb009dcSAndroid Build Coastguard Worker# endif
701*8fb009dcSAndroid Build Coastguard Worker	ldrhsb	r8,[r12,#-14]		@ load more input
702*8fb009dcSAndroid Build Coastguard Worker	ldrhsb	r9,[r12,#-10]
703*8fb009dcSAndroid Build Coastguard Worker	strb	r7,[r14,#-4]
704*8fb009dcSAndroid Build Coastguard Worker	eor	r6,r10,r6,lsr#8
705*8fb009dcSAndroid Build Coastguard Worker	strb	r4,[r14,#-15]
706*8fb009dcSAndroid Build Coastguard Worker	eor	r7,r11,r7,lsr#8
707*8fb009dcSAndroid Build Coastguard Worker# ifdef	__thumb2__
708*8fb009dcSAndroid Build Coastguard Worker	itt	hs
709*8fb009dcSAndroid Build Coastguard Worker# endif
710*8fb009dcSAndroid Build Coastguard Worker	ldrhsb	r10,[r12,#-6]
711*8fb009dcSAndroid Build Coastguard Worker	ldrhsb	r11,[r12,#-2]
712*8fb009dcSAndroid Build Coastguard Worker	strb	r5,[r14,#-11]
713*8fb009dcSAndroid Build Coastguard Worker	eor	r4,r8,r4,lsr#8
714*8fb009dcSAndroid Build Coastguard Worker	strb	r6,[r14,#-7]
715*8fb009dcSAndroid Build Coastguard Worker	eor	r5,r9,r5,lsr#8
716*8fb009dcSAndroid Build Coastguard Worker# ifdef	__thumb2__
717*8fb009dcSAndroid Build Coastguard Worker	itt	hs
718*8fb009dcSAndroid Build Coastguard Worker# endif
719*8fb009dcSAndroid Build Coastguard Worker	ldrhsb	r8,[r12,#-13]		@ load more input
720*8fb009dcSAndroid Build Coastguard Worker	ldrhsb	r9,[r12,#-9]
721*8fb009dcSAndroid Build Coastguard Worker	strb	r7,[r14,#-3]
722*8fb009dcSAndroid Build Coastguard Worker	eor	r6,r10,r6,lsr#8
723*8fb009dcSAndroid Build Coastguard Worker	strb	r4,[r14,#-14]
724*8fb009dcSAndroid Build Coastguard Worker	eor	r7,r11,r7,lsr#8
725*8fb009dcSAndroid Build Coastguard Worker# ifdef	__thumb2__
726*8fb009dcSAndroid Build Coastguard Worker	itt	hs
727*8fb009dcSAndroid Build Coastguard Worker# endif
728*8fb009dcSAndroid Build Coastguard Worker	ldrhsb	r10,[r12,#-5]
729*8fb009dcSAndroid Build Coastguard Worker	ldrhsb	r11,[r12,#-1]
730*8fb009dcSAndroid Build Coastguard Worker	strb	r5,[r14,#-10]
731*8fb009dcSAndroid Build Coastguard Worker	strb	r6,[r14,#-6]
732*8fb009dcSAndroid Build Coastguard Worker	eor	r4,r8,r4,lsr#8
733*8fb009dcSAndroid Build Coastguard Worker	strb	r7,[r14,#-2]
734*8fb009dcSAndroid Build Coastguard Worker	eor	r5,r9,r5,lsr#8
735*8fb009dcSAndroid Build Coastguard Worker	strb	r4,[r14,#-13]
736*8fb009dcSAndroid Build Coastguard Worker	eor	r6,r10,r6,lsr#8
737*8fb009dcSAndroid Build Coastguard Worker	strb	r5,[r14,#-9]
738*8fb009dcSAndroid Build Coastguard Worker	eor	r7,r11,r7,lsr#8
739*8fb009dcSAndroid Build Coastguard Worker	strb	r6,[r14,#-5]
740*8fb009dcSAndroid Build Coastguard Worker	strb	r7,[r14,#-1]
741*8fb009dcSAndroid Build Coastguard Worker# ifdef	__thumb2__
742*8fb009dcSAndroid Build Coastguard Worker	it	ne
743*8fb009dcSAndroid Build Coastguard Worker# endif
744*8fb009dcSAndroid Build Coastguard Worker	ldrne	r8,[sp,#4*(32+2)]		@ re-load len
745*8fb009dcSAndroid Build Coastguard Worker# ifdef	__thumb2__
746*8fb009dcSAndroid Build Coastguard Worker	it	hs
747*8fb009dcSAndroid Build Coastguard Worker# endif
748*8fb009dcSAndroid Build Coastguard Worker	subhs	r11,r8,#64			@ len-=64
749*8fb009dcSAndroid Build Coastguard Worker	bhi	.Loop_outer
750*8fb009dcSAndroid Build Coastguard Worker
751*8fb009dcSAndroid Build Coastguard Worker	beq	.Ldone
752*8fb009dcSAndroid Build Coastguard Worker#endif
753*8fb009dcSAndroid Build Coastguard Worker
754*8fb009dcSAndroid Build Coastguard Worker.Ltail:
755*8fb009dcSAndroid Build Coastguard Worker	ldr	r12,[sp,#4*(32+1)]	@ load inp
756*8fb009dcSAndroid Build Coastguard Worker	add	r9,sp,#4*(0)
757*8fb009dcSAndroid Build Coastguard Worker	ldr	r14,[sp,#4*(32+0)]	@ load out
758*8fb009dcSAndroid Build Coastguard Worker
759*8fb009dcSAndroid Build Coastguard Worker.Loop_tail:
760*8fb009dcSAndroid Build Coastguard Worker	ldrb	r10,[r9],#1	@ read buffer on stack
761*8fb009dcSAndroid Build Coastguard Worker	ldrb	r11,[r12],#1		@ read input
762*8fb009dcSAndroid Build Coastguard Worker	subs	r8,r8,#1
763*8fb009dcSAndroid Build Coastguard Worker	eor	r11,r11,r10
764*8fb009dcSAndroid Build Coastguard Worker	strb	r11,[r14],#1		@ store output
765*8fb009dcSAndroid Build Coastguard Worker	bne	.Loop_tail
766*8fb009dcSAndroid Build Coastguard Worker
767*8fb009dcSAndroid Build Coastguard Worker.Ldone:
768*8fb009dcSAndroid Build Coastguard Worker	add	sp,sp,#4*(32+3)
769*8fb009dcSAndroid Build Coastguard Worker	ldmia	sp!,{r4,r5,r6,r7,r8,r9,r10,r11,pc}
770*8fb009dcSAndroid Build Coastguard Worker.size	ChaCha20_ctr32_nohw,.-ChaCha20_ctr32_nohw
771*8fb009dcSAndroid Build Coastguard Worker#if __ARM_MAX_ARCH__>=7
772*8fb009dcSAndroid Build Coastguard Worker.arch	armv7-a
773*8fb009dcSAndroid Build Coastguard Worker.fpu	neon
774*8fb009dcSAndroid Build Coastguard Worker
775*8fb009dcSAndroid Build Coastguard Worker.globl	ChaCha20_ctr32_neon
776*8fb009dcSAndroid Build Coastguard Worker.hidden	ChaCha20_ctr32_neon
777*8fb009dcSAndroid Build Coastguard Worker.type	ChaCha20_ctr32_neon,%function
778*8fb009dcSAndroid Build Coastguard Worker.align	5
779*8fb009dcSAndroid Build Coastguard WorkerChaCha20_ctr32_neon:
780*8fb009dcSAndroid Build Coastguard Worker	ldr	r12,[sp,#0]		@ pull pointer to counter and nonce
781*8fb009dcSAndroid Build Coastguard Worker	stmdb	sp!,{r0,r1,r2,r4-r11,lr}
782*8fb009dcSAndroid Build Coastguard Worker	adr	r14,.Lsigma
783*8fb009dcSAndroid Build Coastguard Worker	vstmdb	sp!,{d8,d9,d10,d11,d12,d13,d14,d15}		@ ABI spec says so
784*8fb009dcSAndroid Build Coastguard Worker	stmdb	sp!,{r0,r1,r2,r3}
785*8fb009dcSAndroid Build Coastguard Worker
786*8fb009dcSAndroid Build Coastguard Worker	vld1.32	{q1,q2},[r3]		@ load key
787*8fb009dcSAndroid Build Coastguard Worker	ldmia	r3,{r4,r5,r6,r7,r8,r9,r10,r11}		@ load key
788*8fb009dcSAndroid Build Coastguard Worker
789*8fb009dcSAndroid Build Coastguard Worker	sub	sp,sp,#4*(16+16)
790*8fb009dcSAndroid Build Coastguard Worker	vld1.32	{q3},[r12]		@ load counter and nonce
791*8fb009dcSAndroid Build Coastguard Worker	add	r12,sp,#4*8
792*8fb009dcSAndroid Build Coastguard Worker	ldmia	r14,{r0,r1,r2,r3}		@ load sigma
793*8fb009dcSAndroid Build Coastguard Worker	vld1.32	{q0},[r14]!		@ load sigma
794*8fb009dcSAndroid Build Coastguard Worker	vld1.32	{q12},[r14]		@ one
795*8fb009dcSAndroid Build Coastguard Worker	vst1.32	{q2,q3},[r12]		@ copy 1/2key|counter|nonce
796*8fb009dcSAndroid Build Coastguard Worker	vst1.32	{q0,q1},[sp]		@ copy sigma|1/2key
797*8fb009dcSAndroid Build Coastguard Worker
798*8fb009dcSAndroid Build Coastguard Worker	str	r10,[sp,#4*(16+10)]	@ off-load "rx"
799*8fb009dcSAndroid Build Coastguard Worker	str	r11,[sp,#4*(16+11)]	@ off-load "rx"
800*8fb009dcSAndroid Build Coastguard Worker	vshl.i32	d26,d24,#1	@ two
801*8fb009dcSAndroid Build Coastguard Worker	vstr	d24,[sp,#4*(16+0)]
802*8fb009dcSAndroid Build Coastguard Worker	vshl.i32	d28,d24,#2	@ four
803*8fb009dcSAndroid Build Coastguard Worker	vstr	d26,[sp,#4*(16+2)]
804*8fb009dcSAndroid Build Coastguard Worker	vmov	q4,q0
805*8fb009dcSAndroid Build Coastguard Worker	vstr	d28,[sp,#4*(16+4)]
806*8fb009dcSAndroid Build Coastguard Worker	vmov	q8,q0
807*8fb009dcSAndroid Build Coastguard Worker	vmov	q5,q1
808*8fb009dcSAndroid Build Coastguard Worker	vmov	q9,q1
809*8fb009dcSAndroid Build Coastguard Worker	b	.Loop_neon_enter
810*8fb009dcSAndroid Build Coastguard Worker
811*8fb009dcSAndroid Build Coastguard Worker.align	4
812*8fb009dcSAndroid Build Coastguard Worker.Loop_neon_outer:
813*8fb009dcSAndroid Build Coastguard Worker	ldmia	sp,{r0,r1,r2,r3,r4,r5,r6,r7,r8,r9}		@ load key material
814*8fb009dcSAndroid Build Coastguard Worker	cmp	r11,#64*2		@ if len<=64*2
815*8fb009dcSAndroid Build Coastguard Worker	bls	.Lbreak_neon		@ switch to integer-only
816*8fb009dcSAndroid Build Coastguard Worker	vmov	q4,q0
817*8fb009dcSAndroid Build Coastguard Worker	str	r11,[sp,#4*(32+2)]	@ save len
818*8fb009dcSAndroid Build Coastguard Worker	vmov	q8,q0
819*8fb009dcSAndroid Build Coastguard Worker	str	r12,  [sp,#4*(32+1)]	@ save inp
820*8fb009dcSAndroid Build Coastguard Worker	vmov	q5,q1
821*8fb009dcSAndroid Build Coastguard Worker	str	r14,  [sp,#4*(32+0)]	@ save out
822*8fb009dcSAndroid Build Coastguard Worker	vmov	q9,q1
823*8fb009dcSAndroid Build Coastguard Worker.Loop_neon_enter:
824*8fb009dcSAndroid Build Coastguard Worker	ldr	r11, [sp,#4*(15)]
825*8fb009dcSAndroid Build Coastguard Worker	vadd.i32	q7,q3,q12		@ counter+1
826*8fb009dcSAndroid Build Coastguard Worker	ldr	r12,[sp,#4*(12)]	@ modulo-scheduled load
827*8fb009dcSAndroid Build Coastguard Worker	vmov	q6,q2
828*8fb009dcSAndroid Build Coastguard Worker	ldr	r10, [sp,#4*(13)]
829*8fb009dcSAndroid Build Coastguard Worker	vmov	q10,q2
830*8fb009dcSAndroid Build Coastguard Worker	ldr	r14,[sp,#4*(14)]
831*8fb009dcSAndroid Build Coastguard Worker	vadd.i32	q11,q7,q12		@ counter+2
832*8fb009dcSAndroid Build Coastguard Worker	str	r11, [sp,#4*(16+15)]
833*8fb009dcSAndroid Build Coastguard Worker	mov	r11,#10
834*8fb009dcSAndroid Build Coastguard Worker	add	r12,r12,#3	@ counter+3
835*8fb009dcSAndroid Build Coastguard Worker	b	.Loop_neon
836*8fb009dcSAndroid Build Coastguard Worker
837*8fb009dcSAndroid Build Coastguard Worker.align	4
838*8fb009dcSAndroid Build Coastguard Worker.Loop_neon:
839*8fb009dcSAndroid Build Coastguard Worker	subs	r11,r11,#1
840*8fb009dcSAndroid Build Coastguard Worker	vadd.i32	q0,q0,q1
841*8fb009dcSAndroid Build Coastguard Worker	add	r0,r0,r4
842*8fb009dcSAndroid Build Coastguard Worker	vadd.i32	q4,q4,q5
843*8fb009dcSAndroid Build Coastguard Worker	mov	r12,r12,ror#16
844*8fb009dcSAndroid Build Coastguard Worker	vadd.i32	q8,q8,q9
845*8fb009dcSAndroid Build Coastguard Worker	add	r1,r1,r5
846*8fb009dcSAndroid Build Coastguard Worker	veor	q3,q3,q0
847*8fb009dcSAndroid Build Coastguard Worker	mov	r10,r10,ror#16
848*8fb009dcSAndroid Build Coastguard Worker	veor	q7,q7,q4
849*8fb009dcSAndroid Build Coastguard Worker	eor	r12,r12,r0,ror#16
850*8fb009dcSAndroid Build Coastguard Worker	veor	q11,q11,q8
851*8fb009dcSAndroid Build Coastguard Worker	eor	r10,r10,r1,ror#16
852*8fb009dcSAndroid Build Coastguard Worker	vrev32.16	q3,q3
853*8fb009dcSAndroid Build Coastguard Worker	add	r8,r8,r12
854*8fb009dcSAndroid Build Coastguard Worker	vrev32.16	q7,q7
855*8fb009dcSAndroid Build Coastguard Worker	mov	r4,r4,ror#20
856*8fb009dcSAndroid Build Coastguard Worker	vrev32.16	q11,q11
857*8fb009dcSAndroid Build Coastguard Worker	add	r9,r9,r10
858*8fb009dcSAndroid Build Coastguard Worker	vadd.i32	q2,q2,q3
859*8fb009dcSAndroid Build Coastguard Worker	mov	r5,r5,ror#20
860*8fb009dcSAndroid Build Coastguard Worker	vadd.i32	q6,q6,q7
861*8fb009dcSAndroid Build Coastguard Worker	eor	r4,r4,r8,ror#20
862*8fb009dcSAndroid Build Coastguard Worker	vadd.i32	q10,q10,q11
863*8fb009dcSAndroid Build Coastguard Worker	eor	r5,r5,r9,ror#20
864*8fb009dcSAndroid Build Coastguard Worker	veor	q12,q1,q2
865*8fb009dcSAndroid Build Coastguard Worker	add	r0,r0,r4
866*8fb009dcSAndroid Build Coastguard Worker	veor	q13,q5,q6
867*8fb009dcSAndroid Build Coastguard Worker	mov	r12,r12,ror#24
868*8fb009dcSAndroid Build Coastguard Worker	veor	q14,q9,q10
869*8fb009dcSAndroid Build Coastguard Worker	add	r1,r1,r5
870*8fb009dcSAndroid Build Coastguard Worker	vshr.u32	q1,q12,#20
871*8fb009dcSAndroid Build Coastguard Worker	mov	r10,r10,ror#24
872*8fb009dcSAndroid Build Coastguard Worker	vshr.u32	q5,q13,#20
873*8fb009dcSAndroid Build Coastguard Worker	eor	r12,r12,r0,ror#24
874*8fb009dcSAndroid Build Coastguard Worker	vshr.u32	q9,q14,#20
875*8fb009dcSAndroid Build Coastguard Worker	eor	r10,r10,r1,ror#24
876*8fb009dcSAndroid Build Coastguard Worker	vsli.32	q1,q12,#12
877*8fb009dcSAndroid Build Coastguard Worker	add	r8,r8,r12
878*8fb009dcSAndroid Build Coastguard Worker	vsli.32	q5,q13,#12
879*8fb009dcSAndroid Build Coastguard Worker	mov	r4,r4,ror#25
880*8fb009dcSAndroid Build Coastguard Worker	vsli.32	q9,q14,#12
881*8fb009dcSAndroid Build Coastguard Worker	add	r9,r9,r10
882*8fb009dcSAndroid Build Coastguard Worker	vadd.i32	q0,q0,q1
883*8fb009dcSAndroid Build Coastguard Worker	mov	r5,r5,ror#25
884*8fb009dcSAndroid Build Coastguard Worker	vadd.i32	q4,q4,q5
885*8fb009dcSAndroid Build Coastguard Worker	str	r10,[sp,#4*(16+13)]
886*8fb009dcSAndroid Build Coastguard Worker	vadd.i32	q8,q8,q9
887*8fb009dcSAndroid Build Coastguard Worker	ldr	r10,[sp,#4*(16+15)]
888*8fb009dcSAndroid Build Coastguard Worker	veor	q12,q3,q0
889*8fb009dcSAndroid Build Coastguard Worker	eor	r4,r4,r8,ror#25
890*8fb009dcSAndroid Build Coastguard Worker	veor	q13,q7,q4
891*8fb009dcSAndroid Build Coastguard Worker	eor	r5,r5,r9,ror#25
892*8fb009dcSAndroid Build Coastguard Worker	veor	q14,q11,q8
893*8fb009dcSAndroid Build Coastguard Worker	str	r8,[sp,#4*(16+8)]
894*8fb009dcSAndroid Build Coastguard Worker	vshr.u32	q3,q12,#24
895*8fb009dcSAndroid Build Coastguard Worker	ldr	r8,[sp,#4*(16+10)]
896*8fb009dcSAndroid Build Coastguard Worker	vshr.u32	q7,q13,#24
897*8fb009dcSAndroid Build Coastguard Worker	add	r2,r2,r6
898*8fb009dcSAndroid Build Coastguard Worker	vshr.u32	q11,q14,#24
899*8fb009dcSAndroid Build Coastguard Worker	mov	r14,r14,ror#16
900*8fb009dcSAndroid Build Coastguard Worker	vsli.32	q3,q12,#8
901*8fb009dcSAndroid Build Coastguard Worker	str	r9,[sp,#4*(16+9)]
902*8fb009dcSAndroid Build Coastguard Worker	vsli.32	q7,q13,#8
903*8fb009dcSAndroid Build Coastguard Worker	ldr	r9,[sp,#4*(16+11)]
904*8fb009dcSAndroid Build Coastguard Worker	vsli.32	q11,q14,#8
905*8fb009dcSAndroid Build Coastguard Worker	add	r3,r3,r7
906*8fb009dcSAndroid Build Coastguard Worker	vadd.i32	q2,q2,q3
907*8fb009dcSAndroid Build Coastguard Worker	mov	r10,r10,ror#16
908*8fb009dcSAndroid Build Coastguard Worker	vadd.i32	q6,q6,q7
909*8fb009dcSAndroid Build Coastguard Worker	eor	r14,r14,r2,ror#16
910*8fb009dcSAndroid Build Coastguard Worker	vadd.i32	q10,q10,q11
911*8fb009dcSAndroid Build Coastguard Worker	eor	r10,r10,r3,ror#16
912*8fb009dcSAndroid Build Coastguard Worker	veor	q12,q1,q2
913*8fb009dcSAndroid Build Coastguard Worker	add	r8,r8,r14
914*8fb009dcSAndroid Build Coastguard Worker	veor	q13,q5,q6
915*8fb009dcSAndroid Build Coastguard Worker	mov	r6,r6,ror#20
916*8fb009dcSAndroid Build Coastguard Worker	veor	q14,q9,q10
917*8fb009dcSAndroid Build Coastguard Worker	add	r9,r9,r10
918*8fb009dcSAndroid Build Coastguard Worker	vshr.u32	q1,q12,#25
919*8fb009dcSAndroid Build Coastguard Worker	mov	r7,r7,ror#20
920*8fb009dcSAndroid Build Coastguard Worker	vshr.u32	q5,q13,#25
921*8fb009dcSAndroid Build Coastguard Worker	eor	r6,r6,r8,ror#20
922*8fb009dcSAndroid Build Coastguard Worker	vshr.u32	q9,q14,#25
923*8fb009dcSAndroid Build Coastguard Worker	eor	r7,r7,r9,ror#20
924*8fb009dcSAndroid Build Coastguard Worker	vsli.32	q1,q12,#7
925*8fb009dcSAndroid Build Coastguard Worker	add	r2,r2,r6
926*8fb009dcSAndroid Build Coastguard Worker	vsli.32	q5,q13,#7
927*8fb009dcSAndroid Build Coastguard Worker	mov	r14,r14,ror#24
928*8fb009dcSAndroid Build Coastguard Worker	vsli.32	q9,q14,#7
929*8fb009dcSAndroid Build Coastguard Worker	add	r3,r3,r7
930*8fb009dcSAndroid Build Coastguard Worker	vext.8	q2,q2,q2,#8
931*8fb009dcSAndroid Build Coastguard Worker	mov	r10,r10,ror#24
932*8fb009dcSAndroid Build Coastguard Worker	vext.8	q6,q6,q6,#8
933*8fb009dcSAndroid Build Coastguard Worker	eor	r14,r14,r2,ror#24
934*8fb009dcSAndroid Build Coastguard Worker	vext.8	q10,q10,q10,#8
935*8fb009dcSAndroid Build Coastguard Worker	eor	r10,r10,r3,ror#24
936*8fb009dcSAndroid Build Coastguard Worker	vext.8	q1,q1,q1,#4
937*8fb009dcSAndroid Build Coastguard Worker	add	r8,r8,r14
938*8fb009dcSAndroid Build Coastguard Worker	vext.8	q5,q5,q5,#4
939*8fb009dcSAndroid Build Coastguard Worker	mov	r6,r6,ror#25
940*8fb009dcSAndroid Build Coastguard Worker	vext.8	q9,q9,q9,#4
941*8fb009dcSAndroid Build Coastguard Worker	add	r9,r9,r10
942*8fb009dcSAndroid Build Coastguard Worker	vext.8	q3,q3,q3,#12
943*8fb009dcSAndroid Build Coastguard Worker	mov	r7,r7,ror#25
944*8fb009dcSAndroid Build Coastguard Worker	vext.8	q7,q7,q7,#12
945*8fb009dcSAndroid Build Coastguard Worker	eor	r6,r6,r8,ror#25
946*8fb009dcSAndroid Build Coastguard Worker	vext.8	q11,q11,q11,#12
947*8fb009dcSAndroid Build Coastguard Worker	eor	r7,r7,r9,ror#25
948*8fb009dcSAndroid Build Coastguard Worker	vadd.i32	q0,q0,q1
949*8fb009dcSAndroid Build Coastguard Worker	add	r0,r0,r5
950*8fb009dcSAndroid Build Coastguard Worker	vadd.i32	q4,q4,q5
951*8fb009dcSAndroid Build Coastguard Worker	mov	r10,r10,ror#16
952*8fb009dcSAndroid Build Coastguard Worker	vadd.i32	q8,q8,q9
953*8fb009dcSAndroid Build Coastguard Worker	add	r1,r1,r6
954*8fb009dcSAndroid Build Coastguard Worker	veor	q3,q3,q0
955*8fb009dcSAndroid Build Coastguard Worker	mov	r12,r12,ror#16
956*8fb009dcSAndroid Build Coastguard Worker	veor	q7,q7,q4
957*8fb009dcSAndroid Build Coastguard Worker	eor	r10,r10,r0,ror#16
958*8fb009dcSAndroid Build Coastguard Worker	veor	q11,q11,q8
959*8fb009dcSAndroid Build Coastguard Worker	eor	r12,r12,r1,ror#16
960*8fb009dcSAndroid Build Coastguard Worker	vrev32.16	q3,q3
961*8fb009dcSAndroid Build Coastguard Worker	add	r8,r8,r10
962*8fb009dcSAndroid Build Coastguard Worker	vrev32.16	q7,q7
963*8fb009dcSAndroid Build Coastguard Worker	mov	r5,r5,ror#20
964*8fb009dcSAndroid Build Coastguard Worker	vrev32.16	q11,q11
965*8fb009dcSAndroid Build Coastguard Worker	add	r9,r9,r12
966*8fb009dcSAndroid Build Coastguard Worker	vadd.i32	q2,q2,q3
967*8fb009dcSAndroid Build Coastguard Worker	mov	r6,r6,ror#20
968*8fb009dcSAndroid Build Coastguard Worker	vadd.i32	q6,q6,q7
969*8fb009dcSAndroid Build Coastguard Worker	eor	r5,r5,r8,ror#20
970*8fb009dcSAndroid Build Coastguard Worker	vadd.i32	q10,q10,q11
971*8fb009dcSAndroid Build Coastguard Worker	eor	r6,r6,r9,ror#20
972*8fb009dcSAndroid Build Coastguard Worker	veor	q12,q1,q2
973*8fb009dcSAndroid Build Coastguard Worker	add	r0,r0,r5
974*8fb009dcSAndroid Build Coastguard Worker	veor	q13,q5,q6
975*8fb009dcSAndroid Build Coastguard Worker	mov	r10,r10,ror#24
976*8fb009dcSAndroid Build Coastguard Worker	veor	q14,q9,q10
977*8fb009dcSAndroid Build Coastguard Worker	add	r1,r1,r6
978*8fb009dcSAndroid Build Coastguard Worker	vshr.u32	q1,q12,#20
979*8fb009dcSAndroid Build Coastguard Worker	mov	r12,r12,ror#24
980*8fb009dcSAndroid Build Coastguard Worker	vshr.u32	q5,q13,#20
981*8fb009dcSAndroid Build Coastguard Worker	eor	r10,r10,r0,ror#24
982*8fb009dcSAndroid Build Coastguard Worker	vshr.u32	q9,q14,#20
983*8fb009dcSAndroid Build Coastguard Worker	eor	r12,r12,r1,ror#24
984*8fb009dcSAndroid Build Coastguard Worker	vsli.32	q1,q12,#12
985*8fb009dcSAndroid Build Coastguard Worker	add	r8,r8,r10
986*8fb009dcSAndroid Build Coastguard Worker	vsli.32	q5,q13,#12
987*8fb009dcSAndroid Build Coastguard Worker	mov	r5,r5,ror#25
988*8fb009dcSAndroid Build Coastguard Worker	vsli.32	q9,q14,#12
989*8fb009dcSAndroid Build Coastguard Worker	str	r10,[sp,#4*(16+15)]
990*8fb009dcSAndroid Build Coastguard Worker	vadd.i32	q0,q0,q1
991*8fb009dcSAndroid Build Coastguard Worker	ldr	r10,[sp,#4*(16+13)]
992*8fb009dcSAndroid Build Coastguard Worker	vadd.i32	q4,q4,q5
993*8fb009dcSAndroid Build Coastguard Worker	add	r9,r9,r12
994*8fb009dcSAndroid Build Coastguard Worker	vadd.i32	q8,q8,q9
995*8fb009dcSAndroid Build Coastguard Worker	mov	r6,r6,ror#25
996*8fb009dcSAndroid Build Coastguard Worker	veor	q12,q3,q0
997*8fb009dcSAndroid Build Coastguard Worker	eor	r5,r5,r8,ror#25
998*8fb009dcSAndroid Build Coastguard Worker	veor	q13,q7,q4
999*8fb009dcSAndroid Build Coastguard Worker	eor	r6,r6,r9,ror#25
1000*8fb009dcSAndroid Build Coastguard Worker	veor	q14,q11,q8
1001*8fb009dcSAndroid Build Coastguard Worker	str	r8,[sp,#4*(16+10)]
1002*8fb009dcSAndroid Build Coastguard Worker	vshr.u32	q3,q12,#24
1003*8fb009dcSAndroid Build Coastguard Worker	ldr	r8,[sp,#4*(16+8)]
1004*8fb009dcSAndroid Build Coastguard Worker	vshr.u32	q7,q13,#24
1005*8fb009dcSAndroid Build Coastguard Worker	add	r2,r2,r7
1006*8fb009dcSAndroid Build Coastguard Worker	vshr.u32	q11,q14,#24
1007*8fb009dcSAndroid Build Coastguard Worker	mov	r10,r10,ror#16
1008*8fb009dcSAndroid Build Coastguard Worker	vsli.32	q3,q12,#8
1009*8fb009dcSAndroid Build Coastguard Worker	str	r9,[sp,#4*(16+11)]
1010*8fb009dcSAndroid Build Coastguard Worker	vsli.32	q7,q13,#8
1011*8fb009dcSAndroid Build Coastguard Worker	ldr	r9,[sp,#4*(16+9)]
1012*8fb009dcSAndroid Build Coastguard Worker	vsli.32	q11,q14,#8
1013*8fb009dcSAndroid Build Coastguard Worker	add	r3,r3,r4
1014*8fb009dcSAndroid Build Coastguard Worker	vadd.i32	q2,q2,q3
1015*8fb009dcSAndroid Build Coastguard Worker	mov	r14,r14,ror#16
1016*8fb009dcSAndroid Build Coastguard Worker	vadd.i32	q6,q6,q7
1017*8fb009dcSAndroid Build Coastguard Worker	eor	r10,r10,r2,ror#16
1018*8fb009dcSAndroid Build Coastguard Worker	vadd.i32	q10,q10,q11
1019*8fb009dcSAndroid Build Coastguard Worker	eor	r14,r14,r3,ror#16
1020*8fb009dcSAndroid Build Coastguard Worker	veor	q12,q1,q2
1021*8fb009dcSAndroid Build Coastguard Worker	add	r8,r8,r10
1022*8fb009dcSAndroid Build Coastguard Worker	veor	q13,q5,q6
1023*8fb009dcSAndroid Build Coastguard Worker	mov	r7,r7,ror#20
1024*8fb009dcSAndroid Build Coastguard Worker	veor	q14,q9,q10
1025*8fb009dcSAndroid Build Coastguard Worker	add	r9,r9,r14
1026*8fb009dcSAndroid Build Coastguard Worker	vshr.u32	q1,q12,#25
1027*8fb009dcSAndroid Build Coastguard Worker	mov	r4,r4,ror#20
1028*8fb009dcSAndroid Build Coastguard Worker	vshr.u32	q5,q13,#25
1029*8fb009dcSAndroid Build Coastguard Worker	eor	r7,r7,r8,ror#20
1030*8fb009dcSAndroid Build Coastguard Worker	vshr.u32	q9,q14,#25
1031*8fb009dcSAndroid Build Coastguard Worker	eor	r4,r4,r9,ror#20
1032*8fb009dcSAndroid Build Coastguard Worker	vsli.32	q1,q12,#7
1033*8fb009dcSAndroid Build Coastguard Worker	add	r2,r2,r7
1034*8fb009dcSAndroid Build Coastguard Worker	vsli.32	q5,q13,#7
1035*8fb009dcSAndroid Build Coastguard Worker	mov	r10,r10,ror#24
1036*8fb009dcSAndroid Build Coastguard Worker	vsli.32	q9,q14,#7
1037*8fb009dcSAndroid Build Coastguard Worker	add	r3,r3,r4
1038*8fb009dcSAndroid Build Coastguard Worker	vext.8	q2,q2,q2,#8
1039*8fb009dcSAndroid Build Coastguard Worker	mov	r14,r14,ror#24
1040*8fb009dcSAndroid Build Coastguard Worker	vext.8	q6,q6,q6,#8
1041*8fb009dcSAndroid Build Coastguard Worker	eor	r10,r10,r2,ror#24
1042*8fb009dcSAndroid Build Coastguard Worker	vext.8	q10,q10,q10,#8
1043*8fb009dcSAndroid Build Coastguard Worker	eor	r14,r14,r3,ror#24
1044*8fb009dcSAndroid Build Coastguard Worker	vext.8	q1,q1,q1,#12
1045*8fb009dcSAndroid Build Coastguard Worker	add	r8,r8,r10
1046*8fb009dcSAndroid Build Coastguard Worker	vext.8	q5,q5,q5,#12
1047*8fb009dcSAndroid Build Coastguard Worker	mov	r7,r7,ror#25
1048*8fb009dcSAndroid Build Coastguard Worker	vext.8	q9,q9,q9,#12
1049*8fb009dcSAndroid Build Coastguard Worker	add	r9,r9,r14
1050*8fb009dcSAndroid Build Coastguard Worker	vext.8	q3,q3,q3,#4
1051*8fb009dcSAndroid Build Coastguard Worker	mov	r4,r4,ror#25
1052*8fb009dcSAndroid Build Coastguard Worker	vext.8	q7,q7,q7,#4
1053*8fb009dcSAndroid Build Coastguard Worker	eor	r7,r7,r8,ror#25
1054*8fb009dcSAndroid Build Coastguard Worker	vext.8	q11,q11,q11,#4
1055*8fb009dcSAndroid Build Coastguard Worker	eor	r4,r4,r9,ror#25
1056*8fb009dcSAndroid Build Coastguard Worker	bne	.Loop_neon
1057*8fb009dcSAndroid Build Coastguard Worker
1058*8fb009dcSAndroid Build Coastguard Worker	add	r11,sp,#32
1059*8fb009dcSAndroid Build Coastguard Worker	vld1.32	{q12,q13},[sp]		@ load key material
1060*8fb009dcSAndroid Build Coastguard Worker	vld1.32	{q14,q15},[r11]
1061*8fb009dcSAndroid Build Coastguard Worker
1062*8fb009dcSAndroid Build Coastguard Worker	ldr	r11,[sp,#4*(32+2)]	@ load len
1063*8fb009dcSAndroid Build Coastguard Worker
1064*8fb009dcSAndroid Build Coastguard Worker	str	r8, [sp,#4*(16+8)]	@ modulo-scheduled store
1065*8fb009dcSAndroid Build Coastguard Worker	str	r9, [sp,#4*(16+9)]
1066*8fb009dcSAndroid Build Coastguard Worker	str	r12,[sp,#4*(16+12)]
1067*8fb009dcSAndroid Build Coastguard Worker	str	r10, [sp,#4*(16+13)]
1068*8fb009dcSAndroid Build Coastguard Worker	str	r14,[sp,#4*(16+14)]
1069*8fb009dcSAndroid Build Coastguard Worker
1070*8fb009dcSAndroid Build Coastguard Worker	@ at this point we have first half of 512-bit result in
1071*8fb009dcSAndroid Build Coastguard Worker	@ rx and second half at sp+4*(16+8)
1072*8fb009dcSAndroid Build Coastguard Worker
1073*8fb009dcSAndroid Build Coastguard Worker	ldr	r12,[sp,#4*(32+1)]	@ load inp
1074*8fb009dcSAndroid Build Coastguard Worker	ldr	r14,[sp,#4*(32+0)]	@ load out
1075*8fb009dcSAndroid Build Coastguard Worker
1076*8fb009dcSAndroid Build Coastguard Worker	vadd.i32	q0,q0,q12		@ accumulate key material
1077*8fb009dcSAndroid Build Coastguard Worker	vadd.i32	q4,q4,q12
1078*8fb009dcSAndroid Build Coastguard Worker	vadd.i32	q8,q8,q12
1079*8fb009dcSAndroid Build Coastguard Worker	vldr	d24,[sp,#4*(16+0)]	@ one
1080*8fb009dcSAndroid Build Coastguard Worker
1081*8fb009dcSAndroid Build Coastguard Worker	vadd.i32	q1,q1,q13
1082*8fb009dcSAndroid Build Coastguard Worker	vadd.i32	q5,q5,q13
1083*8fb009dcSAndroid Build Coastguard Worker	vadd.i32	q9,q9,q13
1084*8fb009dcSAndroid Build Coastguard Worker	vldr	d26,[sp,#4*(16+2)]	@ two
1085*8fb009dcSAndroid Build Coastguard Worker
1086*8fb009dcSAndroid Build Coastguard Worker	vadd.i32	q2,q2,q14
1087*8fb009dcSAndroid Build Coastguard Worker	vadd.i32	q6,q6,q14
1088*8fb009dcSAndroid Build Coastguard Worker	vadd.i32	q10,q10,q14
1089*8fb009dcSAndroid Build Coastguard Worker	vadd.i32	d14,d14,d24	@ counter+1
1090*8fb009dcSAndroid Build Coastguard Worker	vadd.i32	d22,d22,d26	@ counter+2
1091*8fb009dcSAndroid Build Coastguard Worker
1092*8fb009dcSAndroid Build Coastguard Worker	vadd.i32	q3,q3,q15
1093*8fb009dcSAndroid Build Coastguard Worker	vadd.i32	q7,q7,q15
1094*8fb009dcSAndroid Build Coastguard Worker	vadd.i32	q11,q11,q15
1095*8fb009dcSAndroid Build Coastguard Worker
1096*8fb009dcSAndroid Build Coastguard Worker	cmp	r11,#64*4
1097*8fb009dcSAndroid Build Coastguard Worker	blo	.Ltail_neon
1098*8fb009dcSAndroid Build Coastguard Worker
1099*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q12,q13},[r12]!	@ load input
1100*8fb009dcSAndroid Build Coastguard Worker	mov	r11,sp
1101*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q14,q15},[r12]!
1102*8fb009dcSAndroid Build Coastguard Worker	veor	q0,q0,q12		@ xor with input
1103*8fb009dcSAndroid Build Coastguard Worker	veor	q1,q1,q13
1104*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q12,q13},[r12]!
1105*8fb009dcSAndroid Build Coastguard Worker	veor	q2,q2,q14
1106*8fb009dcSAndroid Build Coastguard Worker	veor	q3,q3,q15
1107*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q14,q15},[r12]!
1108*8fb009dcSAndroid Build Coastguard Worker
1109*8fb009dcSAndroid Build Coastguard Worker	veor	q4,q4,q12
1110*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q0,q1},[r14]!	@ store output
1111*8fb009dcSAndroid Build Coastguard Worker	veor	q5,q5,q13
1112*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q12,q13},[r12]!
1113*8fb009dcSAndroid Build Coastguard Worker	veor	q6,q6,q14
1114*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q2,q3},[r14]!
1115*8fb009dcSAndroid Build Coastguard Worker	veor	q7,q7,q15
1116*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q14,q15},[r12]!
1117*8fb009dcSAndroid Build Coastguard Worker
1118*8fb009dcSAndroid Build Coastguard Worker	veor	q8,q8,q12
1119*8fb009dcSAndroid Build Coastguard Worker	vld1.32	{q0,q1},[r11]!	@ load for next iteration
1120*8fb009dcSAndroid Build Coastguard Worker	veor	d25,d25,d25
1121*8fb009dcSAndroid Build Coastguard Worker	vldr	d24,[sp,#4*(16+4)]	@ four
1122*8fb009dcSAndroid Build Coastguard Worker	veor	q9,q9,q13
1123*8fb009dcSAndroid Build Coastguard Worker	vld1.32	{q2,q3},[r11]
1124*8fb009dcSAndroid Build Coastguard Worker	veor	q10,q10,q14
1125*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q4,q5},[r14]!
1126*8fb009dcSAndroid Build Coastguard Worker	veor	q11,q11,q15
1127*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q6,q7},[r14]!
1128*8fb009dcSAndroid Build Coastguard Worker
1129*8fb009dcSAndroid Build Coastguard Worker	vadd.i32	d6,d6,d24	@ next counter value
1130*8fb009dcSAndroid Build Coastguard Worker	vldr	d24,[sp,#4*(16+0)]	@ one
1131*8fb009dcSAndroid Build Coastguard Worker
1132*8fb009dcSAndroid Build Coastguard Worker	ldmia	sp,{r8,r9,r10,r11}	@ load key material
1133*8fb009dcSAndroid Build Coastguard Worker	add	r0,r0,r8	@ accumulate key material
1134*8fb009dcSAndroid Build Coastguard Worker	ldr	r8,[r12],#16		@ load input
1135*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q8,q9},[r14]!
1136*8fb009dcSAndroid Build Coastguard Worker	add	r1,r1,r9
1137*8fb009dcSAndroid Build Coastguard Worker	ldr	r9,[r12,#-12]
1138*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q10,q11},[r14]!
1139*8fb009dcSAndroid Build Coastguard Worker	add	r2,r2,r10
1140*8fb009dcSAndroid Build Coastguard Worker	ldr	r10,[r12,#-8]
1141*8fb009dcSAndroid Build Coastguard Worker	add	r3,r3,r11
1142*8fb009dcSAndroid Build Coastguard Worker	ldr	r11,[r12,#-4]
1143*8fb009dcSAndroid Build Coastguard Worker# ifdef	__ARMEB__
1144*8fb009dcSAndroid Build Coastguard Worker	rev	r0,r0
1145*8fb009dcSAndroid Build Coastguard Worker	rev	r1,r1
1146*8fb009dcSAndroid Build Coastguard Worker	rev	r2,r2
1147*8fb009dcSAndroid Build Coastguard Worker	rev	r3,r3
1148*8fb009dcSAndroid Build Coastguard Worker# endif
1149*8fb009dcSAndroid Build Coastguard Worker	eor	r0,r0,r8	@ xor with input
1150*8fb009dcSAndroid Build Coastguard Worker	add	r8,sp,#4*(4)
1151*8fb009dcSAndroid Build Coastguard Worker	eor	r1,r1,r9
1152*8fb009dcSAndroid Build Coastguard Worker	str	r0,[r14],#16		@ store output
1153*8fb009dcSAndroid Build Coastguard Worker	eor	r2,r2,r10
1154*8fb009dcSAndroid Build Coastguard Worker	str	r1,[r14,#-12]
1155*8fb009dcSAndroid Build Coastguard Worker	eor	r3,r3,r11
1156*8fb009dcSAndroid Build Coastguard Worker	ldmia	r8,{r8,r9,r10,r11}	@ load key material
1157*8fb009dcSAndroid Build Coastguard Worker	str	r2,[r14,#-8]
1158*8fb009dcSAndroid Build Coastguard Worker	str	r3,[r14,#-4]
1159*8fb009dcSAndroid Build Coastguard Worker
1160*8fb009dcSAndroid Build Coastguard Worker	add	r4,r4,r8	@ accumulate key material
1161*8fb009dcSAndroid Build Coastguard Worker	ldr	r8,[r12],#16		@ load input
1162*8fb009dcSAndroid Build Coastguard Worker	add	r5,r5,r9
1163*8fb009dcSAndroid Build Coastguard Worker	ldr	r9,[r12,#-12]
1164*8fb009dcSAndroid Build Coastguard Worker	add	r6,r6,r10
1165*8fb009dcSAndroid Build Coastguard Worker	ldr	r10,[r12,#-8]
1166*8fb009dcSAndroid Build Coastguard Worker	add	r7,r7,r11
1167*8fb009dcSAndroid Build Coastguard Worker	ldr	r11,[r12,#-4]
1168*8fb009dcSAndroid Build Coastguard Worker# ifdef	__ARMEB__
1169*8fb009dcSAndroid Build Coastguard Worker	rev	r4,r4
1170*8fb009dcSAndroid Build Coastguard Worker	rev	r5,r5
1171*8fb009dcSAndroid Build Coastguard Worker	rev	r6,r6
1172*8fb009dcSAndroid Build Coastguard Worker	rev	r7,r7
1173*8fb009dcSAndroid Build Coastguard Worker# endif
1174*8fb009dcSAndroid Build Coastguard Worker	eor	r4,r4,r8
1175*8fb009dcSAndroid Build Coastguard Worker	add	r8,sp,#4*(8)
1176*8fb009dcSAndroid Build Coastguard Worker	eor	r5,r5,r9
1177*8fb009dcSAndroid Build Coastguard Worker	str	r4,[r14],#16		@ store output
1178*8fb009dcSAndroid Build Coastguard Worker	eor	r6,r6,r10
1179*8fb009dcSAndroid Build Coastguard Worker	str	r5,[r14,#-12]
1180*8fb009dcSAndroid Build Coastguard Worker	eor	r7,r7,r11
1181*8fb009dcSAndroid Build Coastguard Worker	ldmia	r8,{r8,r9,r10,r11}	@ load key material
1182*8fb009dcSAndroid Build Coastguard Worker	str	r6,[r14,#-8]
1183*8fb009dcSAndroid Build Coastguard Worker	add	r0,sp,#4*(16+8)
1184*8fb009dcSAndroid Build Coastguard Worker	str	r7,[r14,#-4]
1185*8fb009dcSAndroid Build Coastguard Worker
1186*8fb009dcSAndroid Build Coastguard Worker	ldmia	r0,{r0,r1,r2,r3,r4,r5,r6,r7}	@ load second half
1187*8fb009dcSAndroid Build Coastguard Worker
1188*8fb009dcSAndroid Build Coastguard Worker	add	r0,r0,r8	@ accumulate key material
1189*8fb009dcSAndroid Build Coastguard Worker	ldr	r8,[r12],#16		@ load input
1190*8fb009dcSAndroid Build Coastguard Worker	add	r1,r1,r9
1191*8fb009dcSAndroid Build Coastguard Worker	ldr	r9,[r12,#-12]
1192*8fb009dcSAndroid Build Coastguard Worker# ifdef	__thumb2__
1193*8fb009dcSAndroid Build Coastguard Worker	it	hi
1194*8fb009dcSAndroid Build Coastguard Worker# endif
1195*8fb009dcSAndroid Build Coastguard Worker	strhi	r10,[sp,#4*(16+10)]	@ copy "rx" while at it
1196*8fb009dcSAndroid Build Coastguard Worker	add	r2,r2,r10
1197*8fb009dcSAndroid Build Coastguard Worker	ldr	r10,[r12,#-8]
1198*8fb009dcSAndroid Build Coastguard Worker# ifdef	__thumb2__
1199*8fb009dcSAndroid Build Coastguard Worker	it	hi
1200*8fb009dcSAndroid Build Coastguard Worker# endif
1201*8fb009dcSAndroid Build Coastguard Worker	strhi	r11,[sp,#4*(16+11)]	@ copy "rx" while at it
1202*8fb009dcSAndroid Build Coastguard Worker	add	r3,r3,r11
1203*8fb009dcSAndroid Build Coastguard Worker	ldr	r11,[r12,#-4]
1204*8fb009dcSAndroid Build Coastguard Worker# ifdef	__ARMEB__
1205*8fb009dcSAndroid Build Coastguard Worker	rev	r0,r0
1206*8fb009dcSAndroid Build Coastguard Worker	rev	r1,r1
1207*8fb009dcSAndroid Build Coastguard Worker	rev	r2,r2
1208*8fb009dcSAndroid Build Coastguard Worker	rev	r3,r3
1209*8fb009dcSAndroid Build Coastguard Worker# endif
1210*8fb009dcSAndroid Build Coastguard Worker	eor	r0,r0,r8
1211*8fb009dcSAndroid Build Coastguard Worker	add	r8,sp,#4*(12)
1212*8fb009dcSAndroid Build Coastguard Worker	eor	r1,r1,r9
1213*8fb009dcSAndroid Build Coastguard Worker	str	r0,[r14],#16		@ store output
1214*8fb009dcSAndroid Build Coastguard Worker	eor	r2,r2,r10
1215*8fb009dcSAndroid Build Coastguard Worker	str	r1,[r14,#-12]
1216*8fb009dcSAndroid Build Coastguard Worker	eor	r3,r3,r11
1217*8fb009dcSAndroid Build Coastguard Worker	ldmia	r8,{r8,r9,r10,r11}	@ load key material
1218*8fb009dcSAndroid Build Coastguard Worker	str	r2,[r14,#-8]
1219*8fb009dcSAndroid Build Coastguard Worker	str	r3,[r14,#-4]
1220*8fb009dcSAndroid Build Coastguard Worker
1221*8fb009dcSAndroid Build Coastguard Worker	add	r4,r4,r8	@ accumulate key material
1222*8fb009dcSAndroid Build Coastguard Worker	add	r8,r8,#4		@ next counter value
1223*8fb009dcSAndroid Build Coastguard Worker	add	r5,r5,r9
1224*8fb009dcSAndroid Build Coastguard Worker	str	r8,[sp,#4*(12)]	@ save next counter value
1225*8fb009dcSAndroid Build Coastguard Worker	ldr	r8,[r12],#16		@ load input
1226*8fb009dcSAndroid Build Coastguard Worker	add	r6,r6,r10
1227*8fb009dcSAndroid Build Coastguard Worker	add	r4,r4,#3		@ counter+3
1228*8fb009dcSAndroid Build Coastguard Worker	ldr	r9,[r12,#-12]
1229*8fb009dcSAndroid Build Coastguard Worker	add	r7,r7,r11
1230*8fb009dcSAndroid Build Coastguard Worker	ldr	r10,[r12,#-8]
1231*8fb009dcSAndroid Build Coastguard Worker	ldr	r11,[r12,#-4]
1232*8fb009dcSAndroid Build Coastguard Worker# ifdef	__ARMEB__
1233*8fb009dcSAndroid Build Coastguard Worker	rev	r4,r4
1234*8fb009dcSAndroid Build Coastguard Worker	rev	r5,r5
1235*8fb009dcSAndroid Build Coastguard Worker	rev	r6,r6
1236*8fb009dcSAndroid Build Coastguard Worker	rev	r7,r7
1237*8fb009dcSAndroid Build Coastguard Worker# endif
1238*8fb009dcSAndroid Build Coastguard Worker	eor	r4,r4,r8
1239*8fb009dcSAndroid Build Coastguard Worker# ifdef	__thumb2__
1240*8fb009dcSAndroid Build Coastguard Worker	it	hi
1241*8fb009dcSAndroid Build Coastguard Worker# endif
1242*8fb009dcSAndroid Build Coastguard Worker	ldrhi	r8,[sp,#4*(32+2)]	@ re-load len
1243*8fb009dcSAndroid Build Coastguard Worker	eor	r5,r5,r9
1244*8fb009dcSAndroid Build Coastguard Worker	eor	r6,r6,r10
1245*8fb009dcSAndroid Build Coastguard Worker	str	r4,[r14],#16		@ store output
1246*8fb009dcSAndroid Build Coastguard Worker	eor	r7,r7,r11
1247*8fb009dcSAndroid Build Coastguard Worker	str	r5,[r14,#-12]
1248*8fb009dcSAndroid Build Coastguard Worker	sub	r11,r8,#64*4	@ len-=64*4
1249*8fb009dcSAndroid Build Coastguard Worker	str	r6,[r14,#-8]
1250*8fb009dcSAndroid Build Coastguard Worker	str	r7,[r14,#-4]
1251*8fb009dcSAndroid Build Coastguard Worker	bhi	.Loop_neon_outer
1252*8fb009dcSAndroid Build Coastguard Worker
1253*8fb009dcSAndroid Build Coastguard Worker	b	.Ldone_neon
1254*8fb009dcSAndroid Build Coastguard Worker
1255*8fb009dcSAndroid Build Coastguard Worker.align	4
1256*8fb009dcSAndroid Build Coastguard Worker.Lbreak_neon:
1257*8fb009dcSAndroid Build Coastguard Worker	@ harmonize NEON and integer-only stack frames: load data
1258*8fb009dcSAndroid Build Coastguard Worker	@ from NEON frame, but save to integer-only one; distance
1259*8fb009dcSAndroid Build Coastguard Worker	@ between the two is 4*(32+4+16-32)=4*(20).
1260*8fb009dcSAndroid Build Coastguard Worker
1261*8fb009dcSAndroid Build Coastguard Worker	str	r11, [sp,#4*(20+32+2)]	@ save len
1262*8fb009dcSAndroid Build Coastguard Worker	add	r11,sp,#4*(32+4)
1263*8fb009dcSAndroid Build Coastguard Worker	str	r12,   [sp,#4*(20+32+1)]	@ save inp
1264*8fb009dcSAndroid Build Coastguard Worker	str	r14,   [sp,#4*(20+32+0)]	@ save out
1265*8fb009dcSAndroid Build Coastguard Worker
1266*8fb009dcSAndroid Build Coastguard Worker	ldr	r12,[sp,#4*(16+10)]
1267*8fb009dcSAndroid Build Coastguard Worker	ldr	r14,[sp,#4*(16+11)]
1268*8fb009dcSAndroid Build Coastguard Worker	vldmia	r11,{d8,d9,d10,d11,d12,d13,d14,d15}			@ fulfill ABI requirement
1269*8fb009dcSAndroid Build Coastguard Worker	str	r12,[sp,#4*(20+16+10)]	@ copy "rx"
1270*8fb009dcSAndroid Build Coastguard Worker	str	r14,[sp,#4*(20+16+11)]	@ copy "rx"
1271*8fb009dcSAndroid Build Coastguard Worker
1272*8fb009dcSAndroid Build Coastguard Worker	ldr	r11, [sp,#4*(15)]
1273*8fb009dcSAndroid Build Coastguard Worker	ldr	r12,[sp,#4*(12)]		@ modulo-scheduled load
1274*8fb009dcSAndroid Build Coastguard Worker	ldr	r10, [sp,#4*(13)]
1275*8fb009dcSAndroid Build Coastguard Worker	ldr	r14,[sp,#4*(14)]
1276*8fb009dcSAndroid Build Coastguard Worker	str	r11, [sp,#4*(20+16+15)]
1277*8fb009dcSAndroid Build Coastguard Worker	add	r11,sp,#4*(20)
1278*8fb009dcSAndroid Build Coastguard Worker	vst1.32	{q0,q1},[r11]!		@ copy key
1279*8fb009dcSAndroid Build Coastguard Worker	add	sp,sp,#4*(20)			@ switch frame
1280*8fb009dcSAndroid Build Coastguard Worker	vst1.32	{q2,q3},[r11]
1281*8fb009dcSAndroid Build Coastguard Worker	mov	r11,#10
1282*8fb009dcSAndroid Build Coastguard Worker	b	.Loop				@ go integer-only
1283*8fb009dcSAndroid Build Coastguard Worker
1284*8fb009dcSAndroid Build Coastguard Worker.align	4
1285*8fb009dcSAndroid Build Coastguard Worker.Ltail_neon:
1286*8fb009dcSAndroid Build Coastguard Worker	cmp	r11,#64*3
1287*8fb009dcSAndroid Build Coastguard Worker	bhs	.L192_or_more_neon
1288*8fb009dcSAndroid Build Coastguard Worker	cmp	r11,#64*2
1289*8fb009dcSAndroid Build Coastguard Worker	bhs	.L128_or_more_neon
1290*8fb009dcSAndroid Build Coastguard Worker	cmp	r11,#64*1
1291*8fb009dcSAndroid Build Coastguard Worker	bhs	.L64_or_more_neon
1292*8fb009dcSAndroid Build Coastguard Worker
1293*8fb009dcSAndroid Build Coastguard Worker	add	r8,sp,#4*(8)
1294*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q0,q1},[sp]
1295*8fb009dcSAndroid Build Coastguard Worker	add	r10,sp,#4*(0)
1296*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q2,q3},[r8]
1297*8fb009dcSAndroid Build Coastguard Worker	b	.Loop_tail_neon
1298*8fb009dcSAndroid Build Coastguard Worker
1299*8fb009dcSAndroid Build Coastguard Worker.align	4
1300*8fb009dcSAndroid Build Coastguard Worker.L64_or_more_neon:
1301*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q12,q13},[r12]!
1302*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q14,q15},[r12]!
1303*8fb009dcSAndroid Build Coastguard Worker	veor	q0,q0,q12
1304*8fb009dcSAndroid Build Coastguard Worker	veor	q1,q1,q13
1305*8fb009dcSAndroid Build Coastguard Worker	veor	q2,q2,q14
1306*8fb009dcSAndroid Build Coastguard Worker	veor	q3,q3,q15
1307*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q0,q1},[r14]!
1308*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q2,q3},[r14]!
1309*8fb009dcSAndroid Build Coastguard Worker
1310*8fb009dcSAndroid Build Coastguard Worker	beq	.Ldone_neon
1311*8fb009dcSAndroid Build Coastguard Worker
1312*8fb009dcSAndroid Build Coastguard Worker	add	r8,sp,#4*(8)
1313*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q4,q5},[sp]
1314*8fb009dcSAndroid Build Coastguard Worker	add	r10,sp,#4*(0)
1315*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q6,q7},[r8]
1316*8fb009dcSAndroid Build Coastguard Worker	sub	r11,r11,#64*1	@ len-=64*1
1317*8fb009dcSAndroid Build Coastguard Worker	b	.Loop_tail_neon
1318*8fb009dcSAndroid Build Coastguard Worker
1319*8fb009dcSAndroid Build Coastguard Worker.align	4
1320*8fb009dcSAndroid Build Coastguard Worker.L128_or_more_neon:
1321*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q12,q13},[r12]!
1322*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q14,q15},[r12]!
1323*8fb009dcSAndroid Build Coastguard Worker	veor	q0,q0,q12
1324*8fb009dcSAndroid Build Coastguard Worker	veor	q1,q1,q13
1325*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q12,q13},[r12]!
1326*8fb009dcSAndroid Build Coastguard Worker	veor	q2,q2,q14
1327*8fb009dcSAndroid Build Coastguard Worker	veor	q3,q3,q15
1328*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q14,q15},[r12]!
1329*8fb009dcSAndroid Build Coastguard Worker
1330*8fb009dcSAndroid Build Coastguard Worker	veor	q4,q4,q12
1331*8fb009dcSAndroid Build Coastguard Worker	veor	q5,q5,q13
1332*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q0,q1},[r14]!
1333*8fb009dcSAndroid Build Coastguard Worker	veor	q6,q6,q14
1334*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q2,q3},[r14]!
1335*8fb009dcSAndroid Build Coastguard Worker	veor	q7,q7,q15
1336*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q4,q5},[r14]!
1337*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q6,q7},[r14]!
1338*8fb009dcSAndroid Build Coastguard Worker
1339*8fb009dcSAndroid Build Coastguard Worker	beq	.Ldone_neon
1340*8fb009dcSAndroid Build Coastguard Worker
1341*8fb009dcSAndroid Build Coastguard Worker	add	r8,sp,#4*(8)
1342*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q8,q9},[sp]
1343*8fb009dcSAndroid Build Coastguard Worker	add	r10,sp,#4*(0)
1344*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q10,q11},[r8]
1345*8fb009dcSAndroid Build Coastguard Worker	sub	r11,r11,#64*2	@ len-=64*2
1346*8fb009dcSAndroid Build Coastguard Worker	b	.Loop_tail_neon
1347*8fb009dcSAndroid Build Coastguard Worker
1348*8fb009dcSAndroid Build Coastguard Worker.align	4
1349*8fb009dcSAndroid Build Coastguard Worker.L192_or_more_neon:
1350*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q12,q13},[r12]!
1351*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q14,q15},[r12]!
1352*8fb009dcSAndroid Build Coastguard Worker	veor	q0,q0,q12
1353*8fb009dcSAndroid Build Coastguard Worker	veor	q1,q1,q13
1354*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q12,q13},[r12]!
1355*8fb009dcSAndroid Build Coastguard Worker	veor	q2,q2,q14
1356*8fb009dcSAndroid Build Coastguard Worker	veor	q3,q3,q15
1357*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q14,q15},[r12]!
1358*8fb009dcSAndroid Build Coastguard Worker
1359*8fb009dcSAndroid Build Coastguard Worker	veor	q4,q4,q12
1360*8fb009dcSAndroid Build Coastguard Worker	veor	q5,q5,q13
1361*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q12,q13},[r12]!
1362*8fb009dcSAndroid Build Coastguard Worker	veor	q6,q6,q14
1363*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q0,q1},[r14]!
1364*8fb009dcSAndroid Build Coastguard Worker	veor	q7,q7,q15
1365*8fb009dcSAndroid Build Coastguard Worker	vld1.8	{q14,q15},[r12]!
1366*8fb009dcSAndroid Build Coastguard Worker
1367*8fb009dcSAndroid Build Coastguard Worker	veor	q8,q8,q12
1368*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q2,q3},[r14]!
1369*8fb009dcSAndroid Build Coastguard Worker	veor	q9,q9,q13
1370*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q4,q5},[r14]!
1371*8fb009dcSAndroid Build Coastguard Worker	veor	q10,q10,q14
1372*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q6,q7},[r14]!
1373*8fb009dcSAndroid Build Coastguard Worker	veor	q11,q11,q15
1374*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q8,q9},[r14]!
1375*8fb009dcSAndroid Build Coastguard Worker	vst1.8	{q10,q11},[r14]!
1376*8fb009dcSAndroid Build Coastguard Worker
1377*8fb009dcSAndroid Build Coastguard Worker	beq	.Ldone_neon
1378*8fb009dcSAndroid Build Coastguard Worker
1379*8fb009dcSAndroid Build Coastguard Worker	ldmia	sp,{r8,r9,r10,r11}	@ load key material
1380*8fb009dcSAndroid Build Coastguard Worker	add	r0,r0,r8	@ accumulate key material
1381*8fb009dcSAndroid Build Coastguard Worker	add	r8,sp,#4*(4)
1382*8fb009dcSAndroid Build Coastguard Worker	add	r1,r1,r9
1383*8fb009dcSAndroid Build Coastguard Worker	add	r2,r2,r10
1384*8fb009dcSAndroid Build Coastguard Worker	add	r3,r3,r11
1385*8fb009dcSAndroid Build Coastguard Worker	ldmia	r8,{r8,r9,r10,r11}	@ load key material
1386*8fb009dcSAndroid Build Coastguard Worker
1387*8fb009dcSAndroid Build Coastguard Worker	add	r4,r4,r8	@ accumulate key material
1388*8fb009dcSAndroid Build Coastguard Worker	add	r8,sp,#4*(8)
1389*8fb009dcSAndroid Build Coastguard Worker	add	r5,r5,r9
1390*8fb009dcSAndroid Build Coastguard Worker	add	r6,r6,r10
1391*8fb009dcSAndroid Build Coastguard Worker	add	r7,r7,r11
1392*8fb009dcSAndroid Build Coastguard Worker	ldmia	r8,{r8,r9,r10,r11}	@ load key material
1393*8fb009dcSAndroid Build Coastguard Worker# ifdef	__ARMEB__
1394*8fb009dcSAndroid Build Coastguard Worker	rev	r0,r0
1395*8fb009dcSAndroid Build Coastguard Worker	rev	r1,r1
1396*8fb009dcSAndroid Build Coastguard Worker	rev	r2,r2
1397*8fb009dcSAndroid Build Coastguard Worker	rev	r3,r3
1398*8fb009dcSAndroid Build Coastguard Worker	rev	r4,r4
1399*8fb009dcSAndroid Build Coastguard Worker	rev	r5,r5
1400*8fb009dcSAndroid Build Coastguard Worker	rev	r6,r6
1401*8fb009dcSAndroid Build Coastguard Worker	rev	r7,r7
1402*8fb009dcSAndroid Build Coastguard Worker# endif
1403*8fb009dcSAndroid Build Coastguard Worker	stmia	sp,{r0,r1,r2,r3,r4,r5,r6,r7}
1404*8fb009dcSAndroid Build Coastguard Worker	add	r0,sp,#4*(16+8)
1405*8fb009dcSAndroid Build Coastguard Worker
1406*8fb009dcSAndroid Build Coastguard Worker	ldmia	r0,{r0,r1,r2,r3,r4,r5,r6,r7}	@ load second half
1407*8fb009dcSAndroid Build Coastguard Worker
1408*8fb009dcSAndroid Build Coastguard Worker	add	r0,r0,r8	@ accumulate key material
1409*8fb009dcSAndroid Build Coastguard Worker	add	r8,sp,#4*(12)
1410*8fb009dcSAndroid Build Coastguard Worker	add	r1,r1,r9
1411*8fb009dcSAndroid Build Coastguard Worker	add	r2,r2,r10
1412*8fb009dcSAndroid Build Coastguard Worker	add	r3,r3,r11
1413*8fb009dcSAndroid Build Coastguard Worker	ldmia	r8,{r8,r9,r10,r11}	@ load key material
1414*8fb009dcSAndroid Build Coastguard Worker
1415*8fb009dcSAndroid Build Coastguard Worker	add	r4,r4,r8	@ accumulate key material
1416*8fb009dcSAndroid Build Coastguard Worker	add	r8,sp,#4*(8)
1417*8fb009dcSAndroid Build Coastguard Worker	add	r5,r5,r9
1418*8fb009dcSAndroid Build Coastguard Worker	add	r4,r4,#3		@ counter+3
1419*8fb009dcSAndroid Build Coastguard Worker	add	r6,r6,r10
1420*8fb009dcSAndroid Build Coastguard Worker	add	r7,r7,r11
1421*8fb009dcSAndroid Build Coastguard Worker	ldr	r11,[sp,#4*(32+2)]	@ re-load len
1422*8fb009dcSAndroid Build Coastguard Worker# ifdef	__ARMEB__
1423*8fb009dcSAndroid Build Coastguard Worker	rev	r0,r0
1424*8fb009dcSAndroid Build Coastguard Worker	rev	r1,r1
1425*8fb009dcSAndroid Build Coastguard Worker	rev	r2,r2
1426*8fb009dcSAndroid Build Coastguard Worker	rev	r3,r3
1427*8fb009dcSAndroid Build Coastguard Worker	rev	r4,r4
1428*8fb009dcSAndroid Build Coastguard Worker	rev	r5,r5
1429*8fb009dcSAndroid Build Coastguard Worker	rev	r6,r6
1430*8fb009dcSAndroid Build Coastguard Worker	rev	r7,r7
1431*8fb009dcSAndroid Build Coastguard Worker# endif
1432*8fb009dcSAndroid Build Coastguard Worker	stmia	r8,{r0,r1,r2,r3,r4,r5,r6,r7}
1433*8fb009dcSAndroid Build Coastguard Worker	add	r10,sp,#4*(0)
1434*8fb009dcSAndroid Build Coastguard Worker	sub	r11,r11,#64*3	@ len-=64*3
1435*8fb009dcSAndroid Build Coastguard Worker
1436*8fb009dcSAndroid Build Coastguard Worker.Loop_tail_neon:
1437*8fb009dcSAndroid Build Coastguard Worker	ldrb	r8,[r10],#1	@ read buffer on stack
1438*8fb009dcSAndroid Build Coastguard Worker	ldrb	r9,[r12],#1		@ read input
1439*8fb009dcSAndroid Build Coastguard Worker	subs	r11,r11,#1
1440*8fb009dcSAndroid Build Coastguard Worker	eor	r8,r8,r9
1441*8fb009dcSAndroid Build Coastguard Worker	strb	r8,[r14],#1		@ store output
1442*8fb009dcSAndroid Build Coastguard Worker	bne	.Loop_tail_neon
1443*8fb009dcSAndroid Build Coastguard Worker
1444*8fb009dcSAndroid Build Coastguard Worker.Ldone_neon:
1445*8fb009dcSAndroid Build Coastguard Worker	add	sp,sp,#4*(32+4)
1446*8fb009dcSAndroid Build Coastguard Worker	vldmia	sp,{d8,d9,d10,d11,d12,d13,d14,d15}
1447*8fb009dcSAndroid Build Coastguard Worker	add	sp,sp,#4*(16+3)
1448*8fb009dcSAndroid Build Coastguard Worker	ldmia	sp!,{r4,r5,r6,r7,r8,r9,r10,r11,pc}
1449*8fb009dcSAndroid Build Coastguard Worker.size	ChaCha20_ctr32_neon,.-ChaCha20_ctr32_neon
1450*8fb009dcSAndroid Build Coastguard Worker#endif
1451*8fb009dcSAndroid Build Coastguard Worker#endif  // !OPENSSL_NO_ASM && defined(OPENSSL_ARM) && defined(__ELF__)
1452