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