xref: /linux/arch/arm/crypto/sha1-armv4-large.S (revision 702648721db590b3425c31ade294000e18808345)
1#define __ARM_ARCH__ __LINUX_ARM_ARCH__
2@ SPDX-License-Identifier: GPL-2.0
3
4@ This code is taken from the OpenSSL project but the author (Andy Polyakov)
5@ has relicensed it under the GPLv2. Therefore this program is free software;
6@ you can redistribute it and/or modify it under the terms of the GNU General
7@ Public License version 2 as published by the Free Software Foundation.
8@
9@ The original headers, including the original license headers, are
10@ included below for completeness.
11
12@ ====================================================================
13@ Written by Andy Polyakov <appro@fy.chalmers.se> for the OpenSSL
14@ project. The module is, however, dual licensed under OpenSSL and
15@ CRYPTOGAMS licenses depending on where you obtain it. For further
16@ details see https://www.openssl.org/~appro/cryptogams/.
17@ ====================================================================
18
19@ sha1_block procedure for ARMv4.
20@
21@ January 2007.
22
23@ Size/performance trade-off
24@ ====================================================================
25@ impl		size in bytes	comp cycles[*]	measured performance
26@ ====================================================================
27@ thumb		304		3212		4420
28@ armv4-small	392/+29%	1958/+64%	2250/+96%
29@ armv4-compact	740/+89%	1552/+26%	1840/+22%
30@ armv4-large	1420/+92%	1307/+19%	1370/+34%[***]
31@ full unroll	~5100/+260%	~1260/+4%	~1300/+5%
32@ ====================================================================
33@ thumb		= same as 'small' but in Thumb instructions[**] and
34@		  with recurring code in two private functions;
35@ small		= detached Xload/update, loops are folded;
36@ compact	= detached Xload/update, 5x unroll;
37@ large		= interleaved Xload/update, 5x unroll;
38@ full unroll	= interleaved Xload/update, full unroll, estimated[!];
39@
40@ [*]	Manually counted instructions in "grand" loop body. Measured
41@	performance is affected by prologue and epilogue overhead,
42@	i-cache availability, branch penalties, etc.
43@ [**]	While each Thumb instruction is twice smaller, they are not as
44@	diverse as ARM ones: e.g., there are only two arithmetic
45@	instructions with 3 arguments, no [fixed] rotate, addressing
46@	modes are limited. As result it takes more instructions to do
47@	the same job in Thumb, therefore the code is never twice as
48@	small and always slower.
49@ [***]	which is also ~35% better than compiler generated code. Dual-
50@	issue Cortex A8 core was measured to process input block in
51@	~990 cycles.
52
53@ August 2010.
54@
55@ Rescheduling for dual-issue pipeline resulted in 13% improvement on
56@ Cortex A8 core and in absolute terms ~870 cycles per input block
57@ [or 13.6 cycles per byte].
58
59@ February 2011.
60@
61@ Profiler-assisted and platform-specific optimization resulted in 10%
62@ improvement on Cortex A8 core and 12.2 cycles per byte.
63
64#include <linux/linkage.h>
65
66.text
67
68.align	2
69ENTRY(sha1_block_data_order)
70	stmdb	sp!,{r4-r12,lr}
71	add	r2,r1,r2,lsl#6	@ r2 to point at the end of r1
72	ldmia	r0,{r3,r4,r5,r6,r7}
73.Lloop:
74	ldr	r8,.LK_00_19
75	mov	r14,sp
76	sub	sp,sp,#15*4
77	mov	r5,r5,ror#30
78	mov	r6,r6,ror#30
79	mov	r7,r7,ror#30		@ [6]
80.L_00_15:
81#if __ARM_ARCH__<7
82	ldrb	r10,[r1,#2]
83	ldrb	r9,[r1,#3]
84	ldrb	r11,[r1,#1]
85	add	r7,r8,r7,ror#2			@ E+=K_00_19
86	ldrb	r12,[r1],#4
87	orr	r9,r9,r10,lsl#8
88	eor	r10,r5,r6			@ F_xx_xx
89	orr	r9,r9,r11,lsl#16
90	add	r7,r7,r3,ror#27			@ E+=ROR(A,27)
91	orr	r9,r9,r12,lsl#24
92#else
93	ldr	r9,[r1],#4			@ handles unaligned
94	add	r7,r8,r7,ror#2			@ E+=K_00_19
95	eor	r10,r5,r6			@ F_xx_xx
96	add	r7,r7,r3,ror#27			@ E+=ROR(A,27)
97#ifdef __ARMEL__
98	rev	r9,r9				@ byte swap
99#endif
100#endif
101	and	r10,r4,r10,ror#2
102	add	r7,r7,r9			@ E+=X[i]
103	eor	r10,r10,r6,ror#2		@ F_00_19(B,C,D)
104	str	r9,[r14,#-4]!
105	add	r7,r7,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	r6,r8,r6,ror#2			@ E+=K_00_19
111	ldrb	r12,[r1],#4
112	orr	r9,r9,r10,lsl#8
113	eor	r10,r4,r5			@ F_xx_xx
114	orr	r9,r9,r11,lsl#16
115	add	r6,r6,r7,ror#27			@ E+=ROR(A,27)
116	orr	r9,r9,r12,lsl#24
117#else
118	ldr	r9,[r1],#4			@ handles unaligned
119	add	r6,r8,r6,ror#2			@ E+=K_00_19
120	eor	r10,r4,r5			@ F_xx_xx
121	add	r6,r6,r7,ror#27			@ E+=ROR(A,27)
122#ifdef __ARMEL__
123	rev	r9,r9				@ byte swap
124#endif
125#endif
126	and	r10,r3,r10,ror#2
127	add	r6,r6,r9			@ E+=X[i]
128	eor	r10,r10,r5,ror#2		@ F_00_19(B,C,D)
129	str	r9,[r14,#-4]!
130	add	r6,r6,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	r5,r8,r5,ror#2			@ E+=K_00_19
136	ldrb	r12,[r1],#4
137	orr	r9,r9,r10,lsl#8
138	eor	r10,r3,r4			@ F_xx_xx
139	orr	r9,r9,r11,lsl#16
140	add	r5,r5,r6,ror#27			@ E+=ROR(A,27)
141	orr	r9,r9,r12,lsl#24
142#else
143	ldr	r9,[r1],#4			@ handles unaligned
144	add	r5,r8,r5,ror#2			@ E+=K_00_19
145	eor	r10,r3,r4			@ F_xx_xx
146	add	r5,r5,r6,ror#27			@ E+=ROR(A,27)
147#ifdef __ARMEL__
148	rev	r9,r9				@ byte swap
149#endif
150#endif
151	and	r10,r7,r10,ror#2
152	add	r5,r5,r9			@ E+=X[i]
153	eor	r10,r10,r4,ror#2		@ F_00_19(B,C,D)
154	str	r9,[r14,#-4]!
155	add	r5,r5,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	r4,r8,r4,ror#2			@ E+=K_00_19
161	ldrb	r12,[r1],#4
162	orr	r9,r9,r10,lsl#8
163	eor	r10,r7,r3			@ F_xx_xx
164	orr	r9,r9,r11,lsl#16
165	add	r4,r4,r5,ror#27			@ E+=ROR(A,27)
166	orr	r9,r9,r12,lsl#24
167#else
168	ldr	r9,[r1],#4			@ handles unaligned
169	add	r4,r8,r4,ror#2			@ E+=K_00_19
170	eor	r10,r7,r3			@ F_xx_xx
171	add	r4,r4,r5,ror#27			@ E+=ROR(A,27)
172#ifdef __ARMEL__
173	rev	r9,r9				@ byte swap
174#endif
175#endif
176	and	r10,r6,r10,ror#2
177	add	r4,r4,r9			@ E+=X[i]
178	eor	r10,r10,r3,ror#2		@ F_00_19(B,C,D)
179	str	r9,[r14,#-4]!
180	add	r4,r4,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	r3,r8,r3,ror#2			@ E+=K_00_19
186	ldrb	r12,[r1],#4
187	orr	r9,r9,r10,lsl#8
188	eor	r10,r6,r7			@ F_xx_xx
189	orr	r9,r9,r11,lsl#16
190	add	r3,r3,r4,ror#27			@ E+=ROR(A,27)
191	orr	r9,r9,r12,lsl#24
192#else
193	ldr	r9,[r1],#4			@ handles unaligned
194	add	r3,r8,r3,ror#2			@ E+=K_00_19
195	eor	r10,r6,r7			@ F_xx_xx
196	add	r3,r3,r4,ror#27			@ E+=ROR(A,27)
197#ifdef __ARMEL__
198	rev	r9,r9				@ byte swap
199#endif
200#endif
201	and	r10,r5,r10,ror#2
202	add	r3,r3,r9			@ E+=X[i]
203	eor	r10,r10,r7,ror#2		@ F_00_19(B,C,D)
204	str	r9,[r14,#-4]!
205	add	r3,r3,r10			@ E+=F_00_19(B,C,D)
206	cmp	r14,sp
207	bne	.L_00_15		@ [((11+4)*5+2)*3]
208	sub	sp,sp,#25*4
209#if __ARM_ARCH__<7
210	ldrb	r10,[r1,#2]
211	ldrb	r9,[r1,#3]
212	ldrb	r11,[r1,#1]
213	add	r7,r8,r7,ror#2			@ E+=K_00_19
214	ldrb	r12,[r1],#4
215	orr	r9,r9,r10,lsl#8
216	eor	r10,r5,r6			@ F_xx_xx
217	orr	r9,r9,r11,lsl#16
218	add	r7,r7,r3,ror#27			@ E+=ROR(A,27)
219	orr	r9,r9,r12,lsl#24
220#else
221	ldr	r9,[r1],#4			@ handles unaligned
222	add	r7,r8,r7,ror#2			@ E+=K_00_19
223	eor	r10,r5,r6			@ F_xx_xx
224	add	r7,r7,r3,ror#27			@ E+=ROR(A,27)
225#ifdef __ARMEL__
226	rev	r9,r9				@ byte swap
227#endif
228#endif
229	and	r10,r4,r10,ror#2
230	add	r7,r7,r9			@ E+=X[i]
231	eor	r10,r10,r6,ror#2		@ F_00_19(B,C,D)
232	str	r9,[r14,#-4]!
233	add	r7,r7,r10			@ E+=F_00_19(B,C,D)
234	ldr	r9,[r14,#15*4]
235	ldr	r10,[r14,#13*4]
236	ldr	r11,[r14,#7*4]
237	add	r6,r8,r6,ror#2			@ E+=K_xx_xx
238	ldr	r12,[r14,#2*4]
239	eor	r9,r9,r10
240	eor	r11,r11,r12			@ 1 cycle stall
241	eor	r10,r4,r5			@ F_xx_xx
242	mov	r9,r9,ror#31
243	add	r6,r6,r7,ror#27			@ E+=ROR(A,27)
244	eor	r9,r9,r11,ror#31
245	str	r9,[r14,#-4]!
246	and r10,r3,r10,ror#2					@ F_xx_xx
247						@ F_xx_xx
248	add	r6,r6,r9			@ E+=X[i]
249	eor	r10,r10,r5,ror#2		@ F_00_19(B,C,D)
250	add	r6,r6,r10			@ E+=F_00_19(B,C,D)
251	ldr	r9,[r14,#15*4]
252	ldr	r10,[r14,#13*4]
253	ldr	r11,[r14,#7*4]
254	add	r5,r8,r5,ror#2			@ E+=K_xx_xx
255	ldr	r12,[r14,#2*4]
256	eor	r9,r9,r10
257	eor	r11,r11,r12			@ 1 cycle stall
258	eor	r10,r3,r4			@ F_xx_xx
259	mov	r9,r9,ror#31
260	add	r5,r5,r6,ror#27			@ E+=ROR(A,27)
261	eor	r9,r9,r11,ror#31
262	str	r9,[r14,#-4]!
263	and r10,r7,r10,ror#2					@ F_xx_xx
264						@ F_xx_xx
265	add	r5,r5,r9			@ E+=X[i]
266	eor	r10,r10,r4,ror#2		@ F_00_19(B,C,D)
267	add	r5,r5,r10			@ E+=F_00_19(B,C,D)
268	ldr	r9,[r14,#15*4]
269	ldr	r10,[r14,#13*4]
270	ldr	r11,[r14,#7*4]
271	add	r4,r8,r4,ror#2			@ E+=K_xx_xx
272	ldr	r12,[r14,#2*4]
273	eor	r9,r9,r10
274	eor	r11,r11,r12			@ 1 cycle stall
275	eor	r10,r7,r3			@ F_xx_xx
276	mov	r9,r9,ror#31
277	add	r4,r4,r5,ror#27			@ E+=ROR(A,27)
278	eor	r9,r9,r11,ror#31
279	str	r9,[r14,#-4]!
280	and r10,r6,r10,ror#2					@ F_xx_xx
281						@ F_xx_xx
282	add	r4,r4,r9			@ E+=X[i]
283	eor	r10,r10,r3,ror#2		@ F_00_19(B,C,D)
284	add	r4,r4,r10			@ E+=F_00_19(B,C,D)
285	ldr	r9,[r14,#15*4]
286	ldr	r10,[r14,#13*4]
287	ldr	r11,[r14,#7*4]
288	add	r3,r8,r3,ror#2			@ E+=K_xx_xx
289	ldr	r12,[r14,#2*4]
290	eor	r9,r9,r10
291	eor	r11,r11,r12			@ 1 cycle stall
292	eor	r10,r6,r7			@ F_xx_xx
293	mov	r9,r9,ror#31
294	add	r3,r3,r4,ror#27			@ E+=ROR(A,27)
295	eor	r9,r9,r11,ror#31
296	str	r9,[r14,#-4]!
297	and r10,r5,r10,ror#2					@ F_xx_xx
298						@ F_xx_xx
299	add	r3,r3,r9			@ E+=X[i]
300	eor	r10,r10,r7,ror#2		@ F_00_19(B,C,D)
301	add	r3,r3,r10			@ E+=F_00_19(B,C,D)
302
303	ldr	r8,.LK_20_39		@ [+15+16*4]
304	cmn	sp,#0			@ [+3], clear carry to denote 20_39
305.L_20_39_or_60_79:
306	ldr	r9,[r14,#15*4]
307	ldr	r10,[r14,#13*4]
308	ldr	r11,[r14,#7*4]
309	add	r7,r8,r7,ror#2			@ E+=K_xx_xx
310	ldr	r12,[r14,#2*4]
311	eor	r9,r9,r10
312	eor	r11,r11,r12			@ 1 cycle stall
313	eor	r10,r5,r6			@ F_xx_xx
314	mov	r9,r9,ror#31
315	add	r7,r7,r3,ror#27			@ E+=ROR(A,27)
316	eor	r9,r9,r11,ror#31
317	str	r9,[r14,#-4]!
318	eor r10,r4,r10,ror#2					@ F_xx_xx
319						@ F_xx_xx
320	add	r7,r7,r9			@ E+=X[i]
321	add	r7,r7,r10			@ E+=F_20_39(B,C,D)
322	ldr	r9,[r14,#15*4]
323	ldr	r10,[r14,#13*4]
324	ldr	r11,[r14,#7*4]
325	add	r6,r8,r6,ror#2			@ E+=K_xx_xx
326	ldr	r12,[r14,#2*4]
327	eor	r9,r9,r10
328	eor	r11,r11,r12			@ 1 cycle stall
329	eor	r10,r4,r5			@ F_xx_xx
330	mov	r9,r9,ror#31
331	add	r6,r6,r7,ror#27			@ E+=ROR(A,27)
332	eor	r9,r9,r11,ror#31
333	str	r9,[r14,#-4]!
334	eor r10,r3,r10,ror#2					@ F_xx_xx
335						@ F_xx_xx
336	add	r6,r6,r9			@ E+=X[i]
337	add	r6,r6,r10			@ E+=F_20_39(B,C,D)
338	ldr	r9,[r14,#15*4]
339	ldr	r10,[r14,#13*4]
340	ldr	r11,[r14,#7*4]
341	add	r5,r8,r5,ror#2			@ E+=K_xx_xx
342	ldr	r12,[r14,#2*4]
343	eor	r9,r9,r10
344	eor	r11,r11,r12			@ 1 cycle stall
345	eor	r10,r3,r4			@ F_xx_xx
346	mov	r9,r9,ror#31
347	add	r5,r5,r6,ror#27			@ E+=ROR(A,27)
348	eor	r9,r9,r11,ror#31
349	str	r9,[r14,#-4]!
350	eor r10,r7,r10,ror#2					@ F_xx_xx
351						@ F_xx_xx
352	add	r5,r5,r9			@ E+=X[i]
353	add	r5,r5,r10			@ E+=F_20_39(B,C,D)
354	ldr	r9,[r14,#15*4]
355	ldr	r10,[r14,#13*4]
356	ldr	r11,[r14,#7*4]
357	add	r4,r8,r4,ror#2			@ E+=K_xx_xx
358	ldr	r12,[r14,#2*4]
359	eor	r9,r9,r10
360	eor	r11,r11,r12			@ 1 cycle stall
361	eor	r10,r7,r3			@ F_xx_xx
362	mov	r9,r9,ror#31
363	add	r4,r4,r5,ror#27			@ E+=ROR(A,27)
364	eor	r9,r9,r11,ror#31
365	str	r9,[r14,#-4]!
366	eor r10,r6,r10,ror#2					@ F_xx_xx
367						@ F_xx_xx
368	add	r4,r4,r9			@ E+=X[i]
369	add	r4,r4,r10			@ E+=F_20_39(B,C,D)
370	ldr	r9,[r14,#15*4]
371	ldr	r10,[r14,#13*4]
372	ldr	r11,[r14,#7*4]
373	add	r3,r8,r3,ror#2			@ E+=K_xx_xx
374	ldr	r12,[r14,#2*4]
375	eor	r9,r9,r10
376	eor	r11,r11,r12			@ 1 cycle stall
377	eor	r10,r6,r7			@ F_xx_xx
378	mov	r9,r9,ror#31
379	add	r3,r3,r4,ror#27			@ E+=ROR(A,27)
380	eor	r9,r9,r11,ror#31
381	str	r9,[r14,#-4]!
382	eor r10,r5,r10,ror#2					@ F_xx_xx
383						@ F_xx_xx
384	add	r3,r3,r9			@ E+=X[i]
385	add	r3,r3,r10			@ E+=F_20_39(B,C,D)
386 ARM(	teq	r14,sp		)	@ preserve carry
387 THUMB(	mov	r11,sp		)
388 THUMB(	teq	r14,r11		)	@ preserve carry
389	bne	.L_20_39_or_60_79	@ [+((12+3)*5+2)*4]
390	bcs	.L_done			@ [+((12+3)*5+2)*4], spare 300 bytes
391
392	ldr	r8,.LK_40_59
393	sub	sp,sp,#20*4		@ [+2]
394.L_40_59:
395	ldr	r9,[r14,#15*4]
396	ldr	r10,[r14,#13*4]
397	ldr	r11,[r14,#7*4]
398	add	r7,r8,r7,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,r5,r6			@ F_xx_xx
403	mov	r9,r9,ror#31
404	add	r7,r7,r3,ror#27			@ E+=ROR(A,27)
405	eor	r9,r9,r11,ror#31
406	str	r9,[r14,#-4]!
407	and r10,r4,r10,ror#2					@ F_xx_xx
408	and r11,r5,r6					@ F_xx_xx
409	add	r7,r7,r9			@ E+=X[i]
410	add	r7,r7,r10			@ E+=F_40_59(B,C,D)
411	add	r7,r7,r11,ror#2
412	ldr	r9,[r14,#15*4]
413	ldr	r10,[r14,#13*4]
414	ldr	r11,[r14,#7*4]
415	add	r6,r8,r6,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,r4,r5			@ F_xx_xx
420	mov	r9,r9,ror#31
421	add	r6,r6,r7,ror#27			@ E+=ROR(A,27)
422	eor	r9,r9,r11,ror#31
423	str	r9,[r14,#-4]!
424	and r10,r3,r10,ror#2					@ F_xx_xx
425	and r11,r4,r5					@ F_xx_xx
426	add	r6,r6,r9			@ E+=X[i]
427	add	r6,r6,r10			@ E+=F_40_59(B,C,D)
428	add	r6,r6,r11,ror#2
429	ldr	r9,[r14,#15*4]
430	ldr	r10,[r14,#13*4]
431	ldr	r11,[r14,#7*4]
432	add	r5,r8,r5,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,r3,r4			@ F_xx_xx
437	mov	r9,r9,ror#31
438	add	r5,r5,r6,ror#27			@ E+=ROR(A,27)
439	eor	r9,r9,r11,ror#31
440	str	r9,[r14,#-4]!
441	and r10,r7,r10,ror#2					@ F_xx_xx
442	and r11,r3,r4					@ F_xx_xx
443	add	r5,r5,r9			@ E+=X[i]
444	add	r5,r5,r10			@ E+=F_40_59(B,C,D)
445	add	r5,r5,r11,ror#2
446	ldr	r9,[r14,#15*4]
447	ldr	r10,[r14,#13*4]
448	ldr	r11,[r14,#7*4]
449	add	r4,r8,r4,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,r7,r3			@ F_xx_xx
454	mov	r9,r9,ror#31
455	add	r4,r4,r5,ror#27			@ E+=ROR(A,27)
456	eor	r9,r9,r11,ror#31
457	str	r9,[r14,#-4]!
458	and r10,r6,r10,ror#2					@ F_xx_xx
459	and r11,r7,r3					@ F_xx_xx
460	add	r4,r4,r9			@ E+=X[i]
461	add	r4,r4,r10			@ E+=F_40_59(B,C,D)
462	add	r4,r4,r11,ror#2
463	ldr	r9,[r14,#15*4]
464	ldr	r10,[r14,#13*4]
465	ldr	r11,[r14,#7*4]
466	add	r3,r8,r3,ror#2			@ E+=K_xx_xx
467	ldr	r12,[r14,#2*4]
468	eor	r9,r9,r10
469	eor	r11,r11,r12			@ 1 cycle stall
470	eor	r10,r6,r7			@ F_xx_xx
471	mov	r9,r9,ror#31
472	add	r3,r3,r4,ror#27			@ E+=ROR(A,27)
473	eor	r9,r9,r11,ror#31
474	str	r9,[r14,#-4]!
475	and r10,r5,r10,ror#2					@ F_xx_xx
476	and r11,r6,r7					@ F_xx_xx
477	add	r3,r3,r9			@ E+=X[i]
478	add	r3,r3,r10			@ E+=F_40_59(B,C,D)
479	add	r3,r3,r11,ror#2
480	cmp	r14,sp
481	bne	.L_40_59		@ [+((12+5)*5+2)*4]
482
483	ldr	r8,.LK_60_79
484	sub	sp,sp,#20*4
485	cmp	sp,#0			@ set carry to denote 60_79
486	b	.L_20_39_or_60_79	@ [+4], spare 300 bytes
487.L_done:
488	add	sp,sp,#80*4		@ "deallocate" stack frame
489	ldmia	r0,{r8,r9,r10,r11,r12}
490	add	r3,r8,r3
491	add	r4,r9,r4
492	add	r5,r10,r5,ror#2
493	add	r6,r11,r6,ror#2
494	add	r7,r12,r7,ror#2
495	stmia	r0,{r3,r4,r5,r6,r7}
496	teq	r1,r2
497	bne	.Lloop			@ [+18], total 1307
498
499	ldmia	sp!,{r4-r12,pc}
500.align	2
501.LK_00_19:	.word	0x5a827999
502.LK_20_39:	.word	0x6ed9eba1
503.LK_40_59:	.word	0x8f1bbcdc
504.LK_60_79:	.word	0xca62c1d6
505ENDPROC(sha1_block_data_order)
506.asciz	"SHA1 block transform for ARMv4, CRYPTOGAMS by <appro@openssl.org>"
507.align	2
508