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