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