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