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