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