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