cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

sha1-armv4-large.S (13769B)


      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