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