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