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