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