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