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