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