162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
262306a36Sopenharmony_ci/* sha1-armv7-neon.S - ARM/NEON accelerated SHA-1 transform function
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci * Copyright © 2013-2014 Jussi Kivilinna <jussi.kivilinna@iki.fi>
562306a36Sopenharmony_ci */
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#include <linux/linkage.h>
862306a36Sopenharmony_ci#include <asm/assembler.h>
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci.syntax unified
1162306a36Sopenharmony_ci.fpu neon
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci.text
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci/* Context structure */
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci#define state_h0 0
1962306a36Sopenharmony_ci#define state_h1 4
2062306a36Sopenharmony_ci#define state_h2 8
2162306a36Sopenharmony_ci#define state_h3 12
2262306a36Sopenharmony_ci#define state_h4 16
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci/* Constants */
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ci#define K1  0x5A827999
2862306a36Sopenharmony_ci#define K2  0x6ED9EBA1
2962306a36Sopenharmony_ci#define K3  0x8F1BBCDC
3062306a36Sopenharmony_ci#define K4  0xCA62C1D6
3162306a36Sopenharmony_ci.align 4
3262306a36Sopenharmony_ci.LK_VEC:
3362306a36Sopenharmony_ci.LK1:	.long K1, K1, K1, K1
3462306a36Sopenharmony_ci.LK2:	.long K2, K2, K2, K2
3562306a36Sopenharmony_ci.LK3:	.long K3, K3, K3, K3
3662306a36Sopenharmony_ci.LK4:	.long K4, K4, K4, K4
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci/* Register macros */
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci#define RSTATE r0
4262306a36Sopenharmony_ci#define RDATA r1
4362306a36Sopenharmony_ci#define RNBLKS r2
4462306a36Sopenharmony_ci#define ROLDSTACK r3
4562306a36Sopenharmony_ci#define RWK lr
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci#define _a r4
4862306a36Sopenharmony_ci#define _b r5
4962306a36Sopenharmony_ci#define _c r6
5062306a36Sopenharmony_ci#define _d r7
5162306a36Sopenharmony_ci#define _e r8
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci#define RT0 r9
5462306a36Sopenharmony_ci#define RT1 r10
5562306a36Sopenharmony_ci#define RT2 r11
5662306a36Sopenharmony_ci#define RT3 r12
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci#define W0 q0
5962306a36Sopenharmony_ci#define W1 q7
6062306a36Sopenharmony_ci#define W2 q2
6162306a36Sopenharmony_ci#define W3 q3
6262306a36Sopenharmony_ci#define W4 q4
6362306a36Sopenharmony_ci#define W5 q6
6462306a36Sopenharmony_ci#define W6 q5
6562306a36Sopenharmony_ci#define W7 q1
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ci#define tmp0 q8
6862306a36Sopenharmony_ci#define tmp1 q9
6962306a36Sopenharmony_ci#define tmp2 q10
7062306a36Sopenharmony_ci#define tmp3 q11
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ci#define qK1 q12
7362306a36Sopenharmony_ci#define qK2 q13
7462306a36Sopenharmony_ci#define qK3 q14
7562306a36Sopenharmony_ci#define qK4 q15
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ci#ifdef CONFIG_CPU_BIG_ENDIAN
7862306a36Sopenharmony_ci#define ARM_LE(code...)
7962306a36Sopenharmony_ci#else
8062306a36Sopenharmony_ci#define ARM_LE(code...)		code
8162306a36Sopenharmony_ci#endif
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_ci/* Round function macros. */
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_ci#define WK_offs(i) (((i) & 15) * 4)
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_ci#define _R_F1(a,b,c,d,e,i,pre1,pre2,pre3,i16,\
8862306a36Sopenharmony_ci	      W,W_m04,W_m08,W_m12,W_m16,W_m20,W_m24,W_m28) \
8962306a36Sopenharmony_ci	ldr RT3, [sp, WK_offs(i)]; \
9062306a36Sopenharmony_ci		pre1(i16,W,W_m04,W_m08,W_m12,W_m16,W_m20,W_m24,W_m28); \
9162306a36Sopenharmony_ci	bic RT0, d, b; \
9262306a36Sopenharmony_ci	add e, e, a, ror #(32 - 5); \
9362306a36Sopenharmony_ci	and RT1, c, b; \
9462306a36Sopenharmony_ci		pre2(i16,W,W_m04,W_m08,W_m12,W_m16,W_m20,W_m24,W_m28); \
9562306a36Sopenharmony_ci	add RT0, RT0, RT3; \
9662306a36Sopenharmony_ci	add e, e, RT1; \
9762306a36Sopenharmony_ci	ror b, #(32 - 30); \
9862306a36Sopenharmony_ci		pre3(i16,W,W_m04,W_m08,W_m12,W_m16,W_m20,W_m24,W_m28); \
9962306a36Sopenharmony_ci	add e, e, RT0;
10062306a36Sopenharmony_ci
10162306a36Sopenharmony_ci#define _R_F2(a,b,c,d,e,i,pre1,pre2,pre3,i16,\
10262306a36Sopenharmony_ci	      W,W_m04,W_m08,W_m12,W_m16,W_m20,W_m24,W_m28) \
10362306a36Sopenharmony_ci	ldr RT3, [sp, WK_offs(i)]; \
10462306a36Sopenharmony_ci		pre1(i16,W,W_m04,W_m08,W_m12,W_m16,W_m20,W_m24,W_m28); \
10562306a36Sopenharmony_ci	eor RT0, d, b; \
10662306a36Sopenharmony_ci	add e, e, a, ror #(32 - 5); \
10762306a36Sopenharmony_ci	eor RT0, RT0, c; \
10862306a36Sopenharmony_ci		pre2(i16,W,W_m04,W_m08,W_m12,W_m16,W_m20,W_m24,W_m28); \
10962306a36Sopenharmony_ci	add e, e, RT3; \
11062306a36Sopenharmony_ci	ror b, #(32 - 30); \
11162306a36Sopenharmony_ci		pre3(i16,W,W_m04,W_m08,W_m12,W_m16,W_m20,W_m24,W_m28); \
11262306a36Sopenharmony_ci	add e, e, RT0; \
11362306a36Sopenharmony_ci
11462306a36Sopenharmony_ci#define _R_F3(a,b,c,d,e,i,pre1,pre2,pre3,i16,\
11562306a36Sopenharmony_ci	      W,W_m04,W_m08,W_m12,W_m16,W_m20,W_m24,W_m28) \
11662306a36Sopenharmony_ci	ldr RT3, [sp, WK_offs(i)]; \
11762306a36Sopenharmony_ci		pre1(i16,W,W_m04,W_m08,W_m12,W_m16,W_m20,W_m24,W_m28); \
11862306a36Sopenharmony_ci	eor RT0, b, c; \
11962306a36Sopenharmony_ci	and RT1, b, c; \
12062306a36Sopenharmony_ci	add e, e, a, ror #(32 - 5); \
12162306a36Sopenharmony_ci		pre2(i16,W,W_m04,W_m08,W_m12,W_m16,W_m20,W_m24,W_m28); \
12262306a36Sopenharmony_ci	and RT0, RT0, d; \
12362306a36Sopenharmony_ci	add RT1, RT1, RT3; \
12462306a36Sopenharmony_ci	add e, e, RT0; \
12562306a36Sopenharmony_ci	ror b, #(32 - 30); \
12662306a36Sopenharmony_ci		pre3(i16,W,W_m04,W_m08,W_m12,W_m16,W_m20,W_m24,W_m28); \
12762306a36Sopenharmony_ci	add e, e, RT1;
12862306a36Sopenharmony_ci
12962306a36Sopenharmony_ci#define _R_F4(a,b,c,d,e,i,pre1,pre2,pre3,i16,\
13062306a36Sopenharmony_ci	      W,W_m04,W_m08,W_m12,W_m16,W_m20,W_m24,W_m28) \
13162306a36Sopenharmony_ci	_R_F2(a,b,c,d,e,i,pre1,pre2,pre3,i16,\
13262306a36Sopenharmony_ci	      W,W_m04,W_m08,W_m12,W_m16,W_m20,W_m24,W_m28)
13362306a36Sopenharmony_ci
13462306a36Sopenharmony_ci#define _R(a,b,c,d,e,f,i,pre1,pre2,pre3,i16,\
13562306a36Sopenharmony_ci           W,W_m04,W_m08,W_m12,W_m16,W_m20,W_m24,W_m28) \
13662306a36Sopenharmony_ci	_R_##f(a,b,c,d,e,i,pre1,pre2,pre3,i16,\
13762306a36Sopenharmony_ci	       W,W_m04,W_m08,W_m12,W_m16,W_m20,W_m24,W_m28)
13862306a36Sopenharmony_ci
13962306a36Sopenharmony_ci#define R(a,b,c,d,e,f,i) \
14062306a36Sopenharmony_ci	_R_##f(a,b,c,d,e,i,dummy,dummy,dummy,i16,\
14162306a36Sopenharmony_ci	       W,W_m04,W_m08,W_m12,W_m16,W_m20,W_m24,W_m28)
14262306a36Sopenharmony_ci
14362306a36Sopenharmony_ci#define dummy(...)
14462306a36Sopenharmony_ci
14562306a36Sopenharmony_ci
14662306a36Sopenharmony_ci/* Input expansion macros. */
14762306a36Sopenharmony_ci
14862306a36Sopenharmony_ci/********* Precalc macros for rounds 0-15 *************************************/
14962306a36Sopenharmony_ci
15062306a36Sopenharmony_ci#define W_PRECALC_00_15() \
15162306a36Sopenharmony_ci	add       RWK, sp, #(WK_offs(0));			\
15262306a36Sopenharmony_ci	\
15362306a36Sopenharmony_ci	vld1.32   {W0, W7}, [RDATA]!;				\
15462306a36Sopenharmony_ci ARM_LE(vrev32.8  W0, W0;	)	/* big => little */	\
15562306a36Sopenharmony_ci	vld1.32   {W6, W5}, [RDATA]!;				\
15662306a36Sopenharmony_ci	vadd.u32  tmp0, W0, curK;				\
15762306a36Sopenharmony_ci ARM_LE(vrev32.8  W7, W7;	)	/* big => little */	\
15862306a36Sopenharmony_ci ARM_LE(vrev32.8  W6, W6;	)	/* big => little */	\
15962306a36Sopenharmony_ci	vadd.u32  tmp1, W7, curK;				\
16062306a36Sopenharmony_ci ARM_LE(vrev32.8  W5, W5;	)	/* big => little */	\
16162306a36Sopenharmony_ci	vadd.u32  tmp2, W6, curK;				\
16262306a36Sopenharmony_ci	vst1.32   {tmp0, tmp1}, [RWK]!;				\
16362306a36Sopenharmony_ci	vadd.u32  tmp3, W5, curK;				\
16462306a36Sopenharmony_ci	vst1.32   {tmp2, tmp3}, [RWK];				\
16562306a36Sopenharmony_ci
16662306a36Sopenharmony_ci#define WPRECALC_00_15_0(i,W,W_m04,W_m08,W_m12,W_m16,W_m20,W_m24,W_m28) \
16762306a36Sopenharmony_ci	vld1.32   {W0, W7}, [RDATA]!;				\
16862306a36Sopenharmony_ci
16962306a36Sopenharmony_ci#define WPRECALC_00_15_1(i,W,W_m04,W_m08,W_m12,W_m16,W_m20,W_m24,W_m28) \
17062306a36Sopenharmony_ci	add       RWK, sp, #(WK_offs(0));			\
17162306a36Sopenharmony_ci
17262306a36Sopenharmony_ci#define WPRECALC_00_15_2(i,W,W_m04,W_m08,W_m12,W_m16,W_m20,W_m24,W_m28) \
17362306a36Sopenharmony_ci ARM_LE(vrev32.8  W0, W0;	)	/* big => little */	\
17462306a36Sopenharmony_ci
17562306a36Sopenharmony_ci#define WPRECALC_00_15_3(i,W,W_m04,W_m08,W_m12,W_m16,W_m20,W_m24,W_m28) \
17662306a36Sopenharmony_ci	vld1.32   {W6, W5}, [RDATA]!;				\
17762306a36Sopenharmony_ci
17862306a36Sopenharmony_ci#define WPRECALC_00_15_4(i,W,W_m04,W_m08,W_m12,W_m16,W_m20,W_m24,W_m28) \
17962306a36Sopenharmony_ci	vadd.u32  tmp0, W0, curK;				\
18062306a36Sopenharmony_ci
18162306a36Sopenharmony_ci#define WPRECALC_00_15_5(i,W,W_m04,W_m08,W_m12,W_m16,W_m20,W_m24,W_m28) \
18262306a36Sopenharmony_ci ARM_LE(vrev32.8  W7, W7;	)	/* big => little */	\
18362306a36Sopenharmony_ci
18462306a36Sopenharmony_ci#define WPRECALC_00_15_6(i,W,W_m04,W_m08,W_m12,W_m16,W_m20,W_m24,W_m28) \
18562306a36Sopenharmony_ci ARM_LE(vrev32.8  W6, W6;	)	/* big => little */	\
18662306a36Sopenharmony_ci
18762306a36Sopenharmony_ci#define WPRECALC_00_15_7(i,W,W_m04,W_m08,W_m12,W_m16,W_m20,W_m24,W_m28) \
18862306a36Sopenharmony_ci	vadd.u32  tmp1, W7, curK;				\
18962306a36Sopenharmony_ci
19062306a36Sopenharmony_ci#define WPRECALC_00_15_8(i,W,W_m04,W_m08,W_m12,W_m16,W_m20,W_m24,W_m28) \
19162306a36Sopenharmony_ci ARM_LE(vrev32.8  W5, W5;	)	/* big => little */	\
19262306a36Sopenharmony_ci
19362306a36Sopenharmony_ci#define WPRECALC_00_15_9(i,W,W_m04,W_m08,W_m12,W_m16,W_m20,W_m24,W_m28) \
19462306a36Sopenharmony_ci	vadd.u32  tmp2, W6, curK;				\
19562306a36Sopenharmony_ci
19662306a36Sopenharmony_ci#define WPRECALC_00_15_10(i,W,W_m04,W_m08,W_m12,W_m16,W_m20,W_m24,W_m28) \
19762306a36Sopenharmony_ci	vst1.32   {tmp0, tmp1}, [RWK]!;				\
19862306a36Sopenharmony_ci
19962306a36Sopenharmony_ci#define WPRECALC_00_15_11(i,W,W_m04,W_m08,W_m12,W_m16,W_m20,W_m24,W_m28) \
20062306a36Sopenharmony_ci	vadd.u32  tmp3, W5, curK;				\
20162306a36Sopenharmony_ci
20262306a36Sopenharmony_ci#define WPRECALC_00_15_12(i,W,W_m04,W_m08,W_m12,W_m16,W_m20,W_m24,W_m28) \
20362306a36Sopenharmony_ci	vst1.32   {tmp2, tmp3}, [RWK];				\
20462306a36Sopenharmony_ci
20562306a36Sopenharmony_ci
20662306a36Sopenharmony_ci/********* Precalc macros for rounds 16-31 ************************************/
20762306a36Sopenharmony_ci
20862306a36Sopenharmony_ci#define WPRECALC_16_31_0(i,W,W_m04,W_m08,W_m12,W_m16,W_m20,W_m24,W_m28) \
20962306a36Sopenharmony_ci	veor      tmp0, tmp0;			\
21062306a36Sopenharmony_ci	vext.8    W, W_m16, W_m12, #8;		\
21162306a36Sopenharmony_ci
21262306a36Sopenharmony_ci#define WPRECALC_16_31_1(i,W,W_m04,W_m08,W_m12,W_m16,W_m20,W_m24,W_m28) \
21362306a36Sopenharmony_ci	add       RWK, sp, #(WK_offs(i));	\
21462306a36Sopenharmony_ci	vext.8    tmp0, W_m04, tmp0, #4;	\
21562306a36Sopenharmony_ci
21662306a36Sopenharmony_ci#define WPRECALC_16_31_2(i,W,W_m04,W_m08,W_m12,W_m16,W_m20,W_m24,W_m28) \
21762306a36Sopenharmony_ci	veor      tmp0, tmp0, W_m16;		\
21862306a36Sopenharmony_ci	veor.32   W, W, W_m08;			\
21962306a36Sopenharmony_ci
22062306a36Sopenharmony_ci#define WPRECALC_16_31_3(i,W,W_m04,W_m08,W_m12,W_m16,W_m20,W_m24,W_m28) \
22162306a36Sopenharmony_ci	veor      tmp1, tmp1;			\
22262306a36Sopenharmony_ci	veor      W, W, tmp0;			\
22362306a36Sopenharmony_ci
22462306a36Sopenharmony_ci#define WPRECALC_16_31_4(i,W,W_m04,W_m08,W_m12,W_m16,W_m20,W_m24,W_m28) \
22562306a36Sopenharmony_ci	vshl.u32  tmp0, W, #1;			\
22662306a36Sopenharmony_ci
22762306a36Sopenharmony_ci#define WPRECALC_16_31_5(i,W,W_m04,W_m08,W_m12,W_m16,W_m20,W_m24,W_m28) \
22862306a36Sopenharmony_ci	vext.8    tmp1, tmp1, W, #(16-12);	\
22962306a36Sopenharmony_ci	vshr.u32  W, W, #31;			\
23062306a36Sopenharmony_ci
23162306a36Sopenharmony_ci#define WPRECALC_16_31_6(i,W,W_m04,W_m08,W_m12,W_m16,W_m20,W_m24,W_m28) \
23262306a36Sopenharmony_ci	vorr      tmp0, tmp0, W;		\
23362306a36Sopenharmony_ci	vshr.u32  W, tmp1, #30;			\
23462306a36Sopenharmony_ci
23562306a36Sopenharmony_ci#define WPRECALC_16_31_7(i,W,W_m04,W_m08,W_m12,W_m16,W_m20,W_m24,W_m28) \
23662306a36Sopenharmony_ci	vshl.u32  tmp1, tmp1, #2;		\
23762306a36Sopenharmony_ci
23862306a36Sopenharmony_ci#define WPRECALC_16_31_8(i,W,W_m04,W_m08,W_m12,W_m16,W_m20,W_m24,W_m28) \
23962306a36Sopenharmony_ci	veor      tmp0, tmp0, W;		\
24062306a36Sopenharmony_ci
24162306a36Sopenharmony_ci#define WPRECALC_16_31_9(i,W,W_m04,W_m08,W_m12,W_m16,W_m20,W_m24,W_m28) \
24262306a36Sopenharmony_ci	veor      W, tmp0, tmp1;		\
24362306a36Sopenharmony_ci
24462306a36Sopenharmony_ci#define WPRECALC_16_31_10(i,W,W_m04,W_m08,W_m12,W_m16,W_m20,W_m24,W_m28) \
24562306a36Sopenharmony_ci	vadd.u32  tmp0, W, curK;		\
24662306a36Sopenharmony_ci
24762306a36Sopenharmony_ci#define WPRECALC_16_31_11(i,W,W_m04,W_m08,W_m12,W_m16,W_m20,W_m24,W_m28) \
24862306a36Sopenharmony_ci	vst1.32   {tmp0}, [RWK];
24962306a36Sopenharmony_ci
25062306a36Sopenharmony_ci
25162306a36Sopenharmony_ci/********* Precalc macros for rounds 32-79 ************************************/
25262306a36Sopenharmony_ci
25362306a36Sopenharmony_ci#define WPRECALC_32_79_0(i,W,W_m04,W_m08,W_m12,W_m16,W_m20,W_m24,W_m28) \
25462306a36Sopenharmony_ci	veor W, W_m28; \
25562306a36Sopenharmony_ci
25662306a36Sopenharmony_ci#define WPRECALC_32_79_1(i,W,W_m04,W_m08,W_m12,W_m16,W_m20,W_m24,W_m28) \
25762306a36Sopenharmony_ci	vext.8 tmp0, W_m08, W_m04, #8; \
25862306a36Sopenharmony_ci
25962306a36Sopenharmony_ci#define WPRECALC_32_79_2(i,W,W_m04,W_m08,W_m12,W_m16,W_m20,W_m24,W_m28) \
26062306a36Sopenharmony_ci	veor W, W_m16; \
26162306a36Sopenharmony_ci
26262306a36Sopenharmony_ci#define WPRECALC_32_79_3(i,W,W_m04,W_m08,W_m12,W_m16,W_m20,W_m24,W_m28) \
26362306a36Sopenharmony_ci	veor W, tmp0; \
26462306a36Sopenharmony_ci
26562306a36Sopenharmony_ci#define WPRECALC_32_79_4(i,W,W_m04,W_m08,W_m12,W_m16,W_m20,W_m24,W_m28) \
26662306a36Sopenharmony_ci	add RWK, sp, #(WK_offs(i&~3)); \
26762306a36Sopenharmony_ci
26862306a36Sopenharmony_ci#define WPRECALC_32_79_5(i,W,W_m04,W_m08,W_m12,W_m16,W_m20,W_m24,W_m28) \
26962306a36Sopenharmony_ci	vshl.u32 tmp1, W, #2; \
27062306a36Sopenharmony_ci
27162306a36Sopenharmony_ci#define WPRECALC_32_79_6(i,W,W_m04,W_m08,W_m12,W_m16,W_m20,W_m24,W_m28) \
27262306a36Sopenharmony_ci	vshr.u32 tmp0, W, #30; \
27362306a36Sopenharmony_ci
27462306a36Sopenharmony_ci#define WPRECALC_32_79_7(i,W,W_m04,W_m08,W_m12,W_m16,W_m20,W_m24,W_m28) \
27562306a36Sopenharmony_ci	vorr W, tmp0, tmp1; \
27662306a36Sopenharmony_ci
27762306a36Sopenharmony_ci#define WPRECALC_32_79_8(i,W,W_m04,W_m08,W_m12,W_m16,W_m20,W_m24,W_m28) \
27862306a36Sopenharmony_ci	vadd.u32 tmp0, W, curK; \
27962306a36Sopenharmony_ci
28062306a36Sopenharmony_ci#define WPRECALC_32_79_9(i,W,W_m04,W_m08,W_m12,W_m16,W_m20,W_m24,W_m28) \
28162306a36Sopenharmony_ci	vst1.32 {tmp0}, [RWK];
28262306a36Sopenharmony_ci
28362306a36Sopenharmony_ci
28462306a36Sopenharmony_ci/*
28562306a36Sopenharmony_ci * Transform nblks*64 bytes (nblks*16 32-bit words) at DATA.
28662306a36Sopenharmony_ci *
28762306a36Sopenharmony_ci * unsigned int
28862306a36Sopenharmony_ci * sha1_transform_neon (void *ctx, const unsigned char *data,
28962306a36Sopenharmony_ci *                      unsigned int nblks)
29062306a36Sopenharmony_ci */
29162306a36Sopenharmony_ci.align 3
29262306a36Sopenharmony_ciENTRY(sha1_transform_neon)
29362306a36Sopenharmony_ci  /* input:
29462306a36Sopenharmony_ci   *	r0: ctx, CTX
29562306a36Sopenharmony_ci   *	r1: data (64*nblks bytes)
29662306a36Sopenharmony_ci   *	r2: nblks
29762306a36Sopenharmony_ci   */
29862306a36Sopenharmony_ci
29962306a36Sopenharmony_ci  cmp RNBLKS, #0;
30062306a36Sopenharmony_ci  beq .Ldo_nothing;
30162306a36Sopenharmony_ci
30262306a36Sopenharmony_ci  push {r4-r12, lr};
30362306a36Sopenharmony_ci  /*vpush {q4-q7};*/
30462306a36Sopenharmony_ci
30562306a36Sopenharmony_ci  adr RT3, .LK_VEC;
30662306a36Sopenharmony_ci
30762306a36Sopenharmony_ci  mov ROLDSTACK, sp;
30862306a36Sopenharmony_ci
30962306a36Sopenharmony_ci  /* Align stack. */
31062306a36Sopenharmony_ci  sub RT0, sp, #(16*4);
31162306a36Sopenharmony_ci  and RT0, #(~(16-1));
31262306a36Sopenharmony_ci  mov sp, RT0;
31362306a36Sopenharmony_ci
31462306a36Sopenharmony_ci  vld1.32 {qK1-qK2}, [RT3]!; /* Load K1,K2 */
31562306a36Sopenharmony_ci
31662306a36Sopenharmony_ci  /* Get the values of the chaining variables. */
31762306a36Sopenharmony_ci  ldm RSTATE, {_a-_e};
31862306a36Sopenharmony_ci
31962306a36Sopenharmony_ci  vld1.32 {qK3-qK4}, [RT3]; /* Load K3,K4 */
32062306a36Sopenharmony_ci
32162306a36Sopenharmony_ci#undef curK
32262306a36Sopenharmony_ci#define curK qK1
32362306a36Sopenharmony_ci  /* Precalc 0-15. */
32462306a36Sopenharmony_ci  W_PRECALC_00_15();
32562306a36Sopenharmony_ci
32662306a36Sopenharmony_ci.Loop:
32762306a36Sopenharmony_ci  /* Transform 0-15 + Precalc 16-31. */
32862306a36Sopenharmony_ci  _R( _a, _b, _c, _d, _e, F1,  0,
32962306a36Sopenharmony_ci      WPRECALC_16_31_0, WPRECALC_16_31_1, WPRECALC_16_31_2, 16,
33062306a36Sopenharmony_ci      W4, W5, W6, W7, W0, _, _, _ );
33162306a36Sopenharmony_ci  _R( _e, _a, _b, _c, _d, F1,  1,
33262306a36Sopenharmony_ci      WPRECALC_16_31_3, WPRECALC_16_31_4, WPRECALC_16_31_5, 16,
33362306a36Sopenharmony_ci      W4, W5, W6, W7, W0, _, _, _ );
33462306a36Sopenharmony_ci  _R( _d, _e, _a, _b, _c, F1,  2,
33562306a36Sopenharmony_ci      WPRECALC_16_31_6, WPRECALC_16_31_7, WPRECALC_16_31_8, 16,
33662306a36Sopenharmony_ci      W4, W5, W6, W7, W0, _, _, _ );
33762306a36Sopenharmony_ci  _R( _c, _d, _e, _a, _b, F1,  3,
33862306a36Sopenharmony_ci      WPRECALC_16_31_9, WPRECALC_16_31_10,WPRECALC_16_31_11,16,
33962306a36Sopenharmony_ci      W4, W5, W6, W7, W0, _, _, _ );
34062306a36Sopenharmony_ci
34162306a36Sopenharmony_ci#undef curK
34262306a36Sopenharmony_ci#define curK qK2
34362306a36Sopenharmony_ci  _R( _b, _c, _d, _e, _a, F1,  4,
34462306a36Sopenharmony_ci      WPRECALC_16_31_0, WPRECALC_16_31_1, WPRECALC_16_31_2, 20,
34562306a36Sopenharmony_ci      W3, W4, W5, W6, W7, _, _, _ );
34662306a36Sopenharmony_ci  _R( _a, _b, _c, _d, _e, F1,  5,
34762306a36Sopenharmony_ci      WPRECALC_16_31_3, WPRECALC_16_31_4, WPRECALC_16_31_5, 20,
34862306a36Sopenharmony_ci      W3, W4, W5, W6, W7, _, _, _ );
34962306a36Sopenharmony_ci  _R( _e, _a, _b, _c, _d, F1,  6,
35062306a36Sopenharmony_ci      WPRECALC_16_31_6, WPRECALC_16_31_7, WPRECALC_16_31_8, 20,
35162306a36Sopenharmony_ci      W3, W4, W5, W6, W7, _, _, _ );
35262306a36Sopenharmony_ci  _R( _d, _e, _a, _b, _c, F1,  7,
35362306a36Sopenharmony_ci      WPRECALC_16_31_9, WPRECALC_16_31_10,WPRECALC_16_31_11,20,
35462306a36Sopenharmony_ci      W3, W4, W5, W6, W7, _, _, _ );
35562306a36Sopenharmony_ci
35662306a36Sopenharmony_ci  _R( _c, _d, _e, _a, _b, F1,  8,
35762306a36Sopenharmony_ci      WPRECALC_16_31_0, WPRECALC_16_31_1, WPRECALC_16_31_2, 24,
35862306a36Sopenharmony_ci      W2, W3, W4, W5, W6, _, _, _ );
35962306a36Sopenharmony_ci  _R( _b, _c, _d, _e, _a, F1,  9,
36062306a36Sopenharmony_ci      WPRECALC_16_31_3, WPRECALC_16_31_4, WPRECALC_16_31_5, 24,
36162306a36Sopenharmony_ci      W2, W3, W4, W5, W6, _, _, _ );
36262306a36Sopenharmony_ci  _R( _a, _b, _c, _d, _e, F1, 10,
36362306a36Sopenharmony_ci      WPRECALC_16_31_6, WPRECALC_16_31_7, WPRECALC_16_31_8, 24,
36462306a36Sopenharmony_ci      W2, W3, W4, W5, W6, _, _, _ );
36562306a36Sopenharmony_ci  _R( _e, _a, _b, _c, _d, F1, 11,
36662306a36Sopenharmony_ci      WPRECALC_16_31_9, WPRECALC_16_31_10,WPRECALC_16_31_11,24,
36762306a36Sopenharmony_ci      W2, W3, W4, W5, W6, _, _, _ );
36862306a36Sopenharmony_ci
36962306a36Sopenharmony_ci  _R( _d, _e, _a, _b, _c, F1, 12,
37062306a36Sopenharmony_ci      WPRECALC_16_31_0, WPRECALC_16_31_1, WPRECALC_16_31_2, 28,
37162306a36Sopenharmony_ci      W1, W2, W3, W4, W5, _, _, _ );
37262306a36Sopenharmony_ci  _R( _c, _d, _e, _a, _b, F1, 13,
37362306a36Sopenharmony_ci      WPRECALC_16_31_3, WPRECALC_16_31_4, WPRECALC_16_31_5, 28,
37462306a36Sopenharmony_ci      W1, W2, W3, W4, W5, _, _, _ );
37562306a36Sopenharmony_ci  _R( _b, _c, _d, _e, _a, F1, 14,
37662306a36Sopenharmony_ci      WPRECALC_16_31_6, WPRECALC_16_31_7, WPRECALC_16_31_8, 28,
37762306a36Sopenharmony_ci      W1, W2, W3, W4, W5, _, _, _ );
37862306a36Sopenharmony_ci  _R( _a, _b, _c, _d, _e, F1, 15,
37962306a36Sopenharmony_ci      WPRECALC_16_31_9, WPRECALC_16_31_10,WPRECALC_16_31_11,28,
38062306a36Sopenharmony_ci      W1, W2, W3, W4, W5, _, _, _ );
38162306a36Sopenharmony_ci
38262306a36Sopenharmony_ci  /* Transform 16-63 + Precalc 32-79. */
38362306a36Sopenharmony_ci  _R( _e, _a, _b, _c, _d, F1, 16,
38462306a36Sopenharmony_ci      WPRECALC_32_79_0, WPRECALC_32_79_1, WPRECALC_32_79_2, 32,
38562306a36Sopenharmony_ci      W0, W1, W2, W3, W4, W5, W6, W7);
38662306a36Sopenharmony_ci  _R( _d, _e, _a, _b, _c, F1, 17,
38762306a36Sopenharmony_ci      WPRECALC_32_79_3, WPRECALC_32_79_4, WPRECALC_32_79_5, 32,
38862306a36Sopenharmony_ci      W0, W1, W2, W3, W4, W5, W6, W7);
38962306a36Sopenharmony_ci  _R( _c, _d, _e, _a, _b, F1, 18,
39062306a36Sopenharmony_ci      WPRECALC_32_79_6, dummy,            WPRECALC_32_79_7, 32,
39162306a36Sopenharmony_ci      W0, W1, W2, W3, W4, W5, W6, W7);
39262306a36Sopenharmony_ci  _R( _b, _c, _d, _e, _a, F1, 19,
39362306a36Sopenharmony_ci      WPRECALC_32_79_8, dummy,            WPRECALC_32_79_9, 32,
39462306a36Sopenharmony_ci      W0, W1, W2, W3, W4, W5, W6, W7);
39562306a36Sopenharmony_ci
39662306a36Sopenharmony_ci  _R( _a, _b, _c, _d, _e, F2, 20,
39762306a36Sopenharmony_ci      WPRECALC_32_79_0, WPRECALC_32_79_1, WPRECALC_32_79_2, 36,
39862306a36Sopenharmony_ci      W7, W0, W1, W2, W3, W4, W5, W6);
39962306a36Sopenharmony_ci  _R( _e, _a, _b, _c, _d, F2, 21,
40062306a36Sopenharmony_ci      WPRECALC_32_79_3, WPRECALC_32_79_4, WPRECALC_32_79_5, 36,
40162306a36Sopenharmony_ci      W7, W0, W1, W2, W3, W4, W5, W6);
40262306a36Sopenharmony_ci  _R( _d, _e, _a, _b, _c, F2, 22,
40362306a36Sopenharmony_ci      WPRECALC_32_79_6, dummy,            WPRECALC_32_79_7, 36,
40462306a36Sopenharmony_ci      W7, W0, W1, W2, W3, W4, W5, W6);
40562306a36Sopenharmony_ci  _R( _c, _d, _e, _a, _b, F2, 23,
40662306a36Sopenharmony_ci      WPRECALC_32_79_8, dummy,            WPRECALC_32_79_9, 36,
40762306a36Sopenharmony_ci      W7, W0, W1, W2, W3, W4, W5, W6);
40862306a36Sopenharmony_ci
40962306a36Sopenharmony_ci#undef curK
41062306a36Sopenharmony_ci#define curK qK3
41162306a36Sopenharmony_ci  _R( _b, _c, _d, _e, _a, F2, 24,
41262306a36Sopenharmony_ci      WPRECALC_32_79_0, WPRECALC_32_79_1, WPRECALC_32_79_2, 40,
41362306a36Sopenharmony_ci      W6, W7, W0, W1, W2, W3, W4, W5);
41462306a36Sopenharmony_ci  _R( _a, _b, _c, _d, _e, F2, 25,
41562306a36Sopenharmony_ci      WPRECALC_32_79_3, WPRECALC_32_79_4, WPRECALC_32_79_5, 40,
41662306a36Sopenharmony_ci      W6, W7, W0, W1, W2, W3, W4, W5);
41762306a36Sopenharmony_ci  _R( _e, _a, _b, _c, _d, F2, 26,
41862306a36Sopenharmony_ci      WPRECALC_32_79_6, dummy,            WPRECALC_32_79_7, 40,
41962306a36Sopenharmony_ci      W6, W7, W0, W1, W2, W3, W4, W5);
42062306a36Sopenharmony_ci  _R( _d, _e, _a, _b, _c, F2, 27,
42162306a36Sopenharmony_ci      WPRECALC_32_79_8, dummy,            WPRECALC_32_79_9, 40,
42262306a36Sopenharmony_ci      W6, W7, W0, W1, W2, W3, W4, W5);
42362306a36Sopenharmony_ci
42462306a36Sopenharmony_ci  _R( _c, _d, _e, _a, _b, F2, 28,
42562306a36Sopenharmony_ci      WPRECALC_32_79_0, WPRECALC_32_79_1, WPRECALC_32_79_2, 44,
42662306a36Sopenharmony_ci      W5, W6, W7, W0, W1, W2, W3, W4);
42762306a36Sopenharmony_ci  _R( _b, _c, _d, _e, _a, F2, 29,
42862306a36Sopenharmony_ci      WPRECALC_32_79_3, WPRECALC_32_79_4, WPRECALC_32_79_5, 44,
42962306a36Sopenharmony_ci      W5, W6, W7, W0, W1, W2, W3, W4);
43062306a36Sopenharmony_ci  _R( _a, _b, _c, _d, _e, F2, 30,
43162306a36Sopenharmony_ci      WPRECALC_32_79_6, dummy,            WPRECALC_32_79_7, 44,
43262306a36Sopenharmony_ci      W5, W6, W7, W0, W1, W2, W3, W4);
43362306a36Sopenharmony_ci  _R( _e, _a, _b, _c, _d, F2, 31,
43462306a36Sopenharmony_ci      WPRECALC_32_79_8, dummy,            WPRECALC_32_79_9, 44,
43562306a36Sopenharmony_ci      W5, W6, W7, W0, W1, W2, W3, W4);
43662306a36Sopenharmony_ci
43762306a36Sopenharmony_ci  _R( _d, _e, _a, _b, _c, F2, 32,
43862306a36Sopenharmony_ci      WPRECALC_32_79_0, WPRECALC_32_79_1, WPRECALC_32_79_2, 48,
43962306a36Sopenharmony_ci      W4, W5, W6, W7, W0, W1, W2, W3);
44062306a36Sopenharmony_ci  _R( _c, _d, _e, _a, _b, F2, 33,
44162306a36Sopenharmony_ci      WPRECALC_32_79_3, WPRECALC_32_79_4, WPRECALC_32_79_5, 48,
44262306a36Sopenharmony_ci      W4, W5, W6, W7, W0, W1, W2, W3);
44362306a36Sopenharmony_ci  _R( _b, _c, _d, _e, _a, F2, 34,
44462306a36Sopenharmony_ci      WPRECALC_32_79_6, dummy,            WPRECALC_32_79_7, 48,
44562306a36Sopenharmony_ci      W4, W5, W6, W7, W0, W1, W2, W3);
44662306a36Sopenharmony_ci  _R( _a, _b, _c, _d, _e, F2, 35,
44762306a36Sopenharmony_ci      WPRECALC_32_79_8, dummy,            WPRECALC_32_79_9, 48,
44862306a36Sopenharmony_ci      W4, W5, W6, W7, W0, W1, W2, W3);
44962306a36Sopenharmony_ci
45062306a36Sopenharmony_ci  _R( _e, _a, _b, _c, _d, F2, 36,
45162306a36Sopenharmony_ci      WPRECALC_32_79_0, WPRECALC_32_79_1, WPRECALC_32_79_2, 52,
45262306a36Sopenharmony_ci      W3, W4, W5, W6, W7, W0, W1, W2);
45362306a36Sopenharmony_ci  _R( _d, _e, _a, _b, _c, F2, 37,
45462306a36Sopenharmony_ci      WPRECALC_32_79_3, WPRECALC_32_79_4, WPRECALC_32_79_5, 52,
45562306a36Sopenharmony_ci      W3, W4, W5, W6, W7, W0, W1, W2);
45662306a36Sopenharmony_ci  _R( _c, _d, _e, _a, _b, F2, 38,
45762306a36Sopenharmony_ci      WPRECALC_32_79_6, dummy,            WPRECALC_32_79_7, 52,
45862306a36Sopenharmony_ci      W3, W4, W5, W6, W7, W0, W1, W2);
45962306a36Sopenharmony_ci  _R( _b, _c, _d, _e, _a, F2, 39,
46062306a36Sopenharmony_ci      WPRECALC_32_79_8, dummy,            WPRECALC_32_79_9, 52,
46162306a36Sopenharmony_ci      W3, W4, W5, W6, W7, W0, W1, W2);
46262306a36Sopenharmony_ci
46362306a36Sopenharmony_ci  _R( _a, _b, _c, _d, _e, F3, 40,
46462306a36Sopenharmony_ci      WPRECALC_32_79_0, WPRECALC_32_79_1, WPRECALC_32_79_2, 56,
46562306a36Sopenharmony_ci      W2, W3, W4, W5, W6, W7, W0, W1);
46662306a36Sopenharmony_ci  _R( _e, _a, _b, _c, _d, F3, 41,
46762306a36Sopenharmony_ci      WPRECALC_32_79_3, WPRECALC_32_79_4, WPRECALC_32_79_5, 56,
46862306a36Sopenharmony_ci      W2, W3, W4, W5, W6, W7, W0, W1);
46962306a36Sopenharmony_ci  _R( _d, _e, _a, _b, _c, F3, 42,
47062306a36Sopenharmony_ci      WPRECALC_32_79_6, dummy,            WPRECALC_32_79_7, 56,
47162306a36Sopenharmony_ci      W2, W3, W4, W5, W6, W7, W0, W1);
47262306a36Sopenharmony_ci  _R( _c, _d, _e, _a, _b, F3, 43,
47362306a36Sopenharmony_ci      WPRECALC_32_79_8, dummy,            WPRECALC_32_79_9, 56,
47462306a36Sopenharmony_ci      W2, W3, W4, W5, W6, W7, W0, W1);
47562306a36Sopenharmony_ci
47662306a36Sopenharmony_ci#undef curK
47762306a36Sopenharmony_ci#define curK qK4
47862306a36Sopenharmony_ci  _R( _b, _c, _d, _e, _a, F3, 44,
47962306a36Sopenharmony_ci      WPRECALC_32_79_0, WPRECALC_32_79_1, WPRECALC_32_79_2, 60,
48062306a36Sopenharmony_ci      W1, W2, W3, W4, W5, W6, W7, W0);
48162306a36Sopenharmony_ci  _R( _a, _b, _c, _d, _e, F3, 45,
48262306a36Sopenharmony_ci      WPRECALC_32_79_3, WPRECALC_32_79_4, WPRECALC_32_79_5, 60,
48362306a36Sopenharmony_ci      W1, W2, W3, W4, W5, W6, W7, W0);
48462306a36Sopenharmony_ci  _R( _e, _a, _b, _c, _d, F3, 46,
48562306a36Sopenharmony_ci      WPRECALC_32_79_6, dummy,            WPRECALC_32_79_7, 60,
48662306a36Sopenharmony_ci      W1, W2, W3, W4, W5, W6, W7, W0);
48762306a36Sopenharmony_ci  _R( _d, _e, _a, _b, _c, F3, 47,
48862306a36Sopenharmony_ci      WPRECALC_32_79_8, dummy,            WPRECALC_32_79_9, 60,
48962306a36Sopenharmony_ci      W1, W2, W3, W4, W5, W6, W7, W0);
49062306a36Sopenharmony_ci
49162306a36Sopenharmony_ci  _R( _c, _d, _e, _a, _b, F3, 48,
49262306a36Sopenharmony_ci      WPRECALC_32_79_0, WPRECALC_32_79_1, WPRECALC_32_79_2, 64,
49362306a36Sopenharmony_ci      W0, W1, W2, W3, W4, W5, W6, W7);
49462306a36Sopenharmony_ci  _R( _b, _c, _d, _e, _a, F3, 49,
49562306a36Sopenharmony_ci      WPRECALC_32_79_3, WPRECALC_32_79_4, WPRECALC_32_79_5, 64,
49662306a36Sopenharmony_ci      W0, W1, W2, W3, W4, W5, W6, W7);
49762306a36Sopenharmony_ci  _R( _a, _b, _c, _d, _e, F3, 50,
49862306a36Sopenharmony_ci      WPRECALC_32_79_6, dummy,            WPRECALC_32_79_7, 64,
49962306a36Sopenharmony_ci      W0, W1, W2, W3, W4, W5, W6, W7);
50062306a36Sopenharmony_ci  _R( _e, _a, _b, _c, _d, F3, 51,
50162306a36Sopenharmony_ci      WPRECALC_32_79_8, dummy,            WPRECALC_32_79_9, 64,
50262306a36Sopenharmony_ci      W0, W1, W2, W3, W4, W5, W6, W7);
50362306a36Sopenharmony_ci
50462306a36Sopenharmony_ci  _R( _d, _e, _a, _b, _c, F3, 52,
50562306a36Sopenharmony_ci      WPRECALC_32_79_0, WPRECALC_32_79_1, WPRECALC_32_79_2, 68,
50662306a36Sopenharmony_ci      W7, W0, W1, W2, W3, W4, W5, W6);
50762306a36Sopenharmony_ci  _R( _c, _d, _e, _a, _b, F3, 53,
50862306a36Sopenharmony_ci      WPRECALC_32_79_3, WPRECALC_32_79_4, WPRECALC_32_79_5, 68,
50962306a36Sopenharmony_ci      W7, W0, W1, W2, W3, W4, W5, W6);
51062306a36Sopenharmony_ci  _R( _b, _c, _d, _e, _a, F3, 54,
51162306a36Sopenharmony_ci      WPRECALC_32_79_6, dummy,            WPRECALC_32_79_7, 68,
51262306a36Sopenharmony_ci      W7, W0, W1, W2, W3, W4, W5, W6);
51362306a36Sopenharmony_ci  _R( _a, _b, _c, _d, _e, F3, 55,
51462306a36Sopenharmony_ci      WPRECALC_32_79_8, dummy,            WPRECALC_32_79_9, 68,
51562306a36Sopenharmony_ci      W7, W0, W1, W2, W3, W4, W5, W6);
51662306a36Sopenharmony_ci
51762306a36Sopenharmony_ci  _R( _e, _a, _b, _c, _d, F3, 56,
51862306a36Sopenharmony_ci      WPRECALC_32_79_0, WPRECALC_32_79_1, WPRECALC_32_79_2, 72,
51962306a36Sopenharmony_ci      W6, W7, W0, W1, W2, W3, W4, W5);
52062306a36Sopenharmony_ci  _R( _d, _e, _a, _b, _c, F3, 57,
52162306a36Sopenharmony_ci      WPRECALC_32_79_3, WPRECALC_32_79_4, WPRECALC_32_79_5, 72,
52262306a36Sopenharmony_ci      W6, W7, W0, W1, W2, W3, W4, W5);
52362306a36Sopenharmony_ci  _R( _c, _d, _e, _a, _b, F3, 58,
52462306a36Sopenharmony_ci      WPRECALC_32_79_6, dummy,            WPRECALC_32_79_7, 72,
52562306a36Sopenharmony_ci      W6, W7, W0, W1, W2, W3, W4, W5);
52662306a36Sopenharmony_ci  _R( _b, _c, _d, _e, _a, F3, 59,
52762306a36Sopenharmony_ci      WPRECALC_32_79_8, dummy,            WPRECALC_32_79_9, 72,
52862306a36Sopenharmony_ci      W6, W7, W0, W1, W2, W3, W4, W5);
52962306a36Sopenharmony_ci
53062306a36Sopenharmony_ci  subs RNBLKS, #1;
53162306a36Sopenharmony_ci
53262306a36Sopenharmony_ci  _R( _a, _b, _c, _d, _e, F4, 60,
53362306a36Sopenharmony_ci      WPRECALC_32_79_0, WPRECALC_32_79_1, WPRECALC_32_79_2, 76,
53462306a36Sopenharmony_ci      W5, W6, W7, W0, W1, W2, W3, W4);
53562306a36Sopenharmony_ci  _R( _e, _a, _b, _c, _d, F4, 61,
53662306a36Sopenharmony_ci      WPRECALC_32_79_3, WPRECALC_32_79_4, WPRECALC_32_79_5, 76,
53762306a36Sopenharmony_ci      W5, W6, W7, W0, W1, W2, W3, W4);
53862306a36Sopenharmony_ci  _R( _d, _e, _a, _b, _c, F4, 62,
53962306a36Sopenharmony_ci      WPRECALC_32_79_6, dummy,            WPRECALC_32_79_7, 76,
54062306a36Sopenharmony_ci      W5, W6, W7, W0, W1, W2, W3, W4);
54162306a36Sopenharmony_ci  _R( _c, _d, _e, _a, _b, F4, 63,
54262306a36Sopenharmony_ci      WPRECALC_32_79_8, dummy,            WPRECALC_32_79_9, 76,
54362306a36Sopenharmony_ci      W5, W6, W7, W0, W1, W2, W3, W4);
54462306a36Sopenharmony_ci
54562306a36Sopenharmony_ci  beq .Lend;
54662306a36Sopenharmony_ci
54762306a36Sopenharmony_ci  /* Transform 64-79 + Precalc 0-15 of next block. */
54862306a36Sopenharmony_ci#undef curK
54962306a36Sopenharmony_ci#define curK qK1
55062306a36Sopenharmony_ci  _R( _b, _c, _d, _e, _a, F4, 64,
55162306a36Sopenharmony_ci      WPRECALC_00_15_0, dummy, dummy, _, _, _, _, _, _, _, _, _ );
55262306a36Sopenharmony_ci  _R( _a, _b, _c, _d, _e, F4, 65,
55362306a36Sopenharmony_ci      WPRECALC_00_15_1, dummy, dummy, _, _, _, _, _, _, _, _, _ );
55462306a36Sopenharmony_ci  _R( _e, _a, _b, _c, _d, F4, 66,
55562306a36Sopenharmony_ci      WPRECALC_00_15_2, dummy, dummy, _, _, _, _, _, _, _, _, _ );
55662306a36Sopenharmony_ci  _R( _d, _e, _a, _b, _c, F4, 67,
55762306a36Sopenharmony_ci      WPRECALC_00_15_3, dummy, dummy, _, _, _, _, _, _, _, _, _ );
55862306a36Sopenharmony_ci
55962306a36Sopenharmony_ci  _R( _c, _d, _e, _a, _b, F4, 68,
56062306a36Sopenharmony_ci      dummy,            dummy, dummy, _, _, _, _, _, _, _, _, _ );
56162306a36Sopenharmony_ci  _R( _b, _c, _d, _e, _a, F4, 69,
56262306a36Sopenharmony_ci      dummy,            dummy, dummy, _, _, _, _, _, _, _, _, _ );
56362306a36Sopenharmony_ci  _R( _a, _b, _c, _d, _e, F4, 70,
56462306a36Sopenharmony_ci      WPRECALC_00_15_4, dummy, dummy, _, _, _, _, _, _, _, _, _ );
56562306a36Sopenharmony_ci  _R( _e, _a, _b, _c, _d, F4, 71,
56662306a36Sopenharmony_ci      WPRECALC_00_15_5, dummy, dummy, _, _, _, _, _, _, _, _, _ );
56762306a36Sopenharmony_ci
56862306a36Sopenharmony_ci  _R( _d, _e, _a, _b, _c, F4, 72,
56962306a36Sopenharmony_ci      dummy,            dummy, dummy, _, _, _, _, _, _, _, _, _ );
57062306a36Sopenharmony_ci  _R( _c, _d, _e, _a, _b, F4, 73,
57162306a36Sopenharmony_ci      dummy,            dummy, dummy, _, _, _, _, _, _, _, _, _ );
57262306a36Sopenharmony_ci  _R( _b, _c, _d, _e, _a, F4, 74,
57362306a36Sopenharmony_ci      WPRECALC_00_15_6, dummy, dummy, _, _, _, _, _, _, _, _, _ );
57462306a36Sopenharmony_ci  _R( _a, _b, _c, _d, _e, F4, 75,
57562306a36Sopenharmony_ci      WPRECALC_00_15_7, dummy, dummy, _, _, _, _, _, _, _, _, _ );
57662306a36Sopenharmony_ci
57762306a36Sopenharmony_ci  _R( _e, _a, _b, _c, _d, F4, 76,
57862306a36Sopenharmony_ci      WPRECALC_00_15_8, dummy, dummy, _, _, _, _, _, _, _, _, _ );
57962306a36Sopenharmony_ci  _R( _d, _e, _a, _b, _c, F4, 77,
58062306a36Sopenharmony_ci      WPRECALC_00_15_9, dummy, dummy, _, _, _, _, _, _, _, _, _ );
58162306a36Sopenharmony_ci  _R( _c, _d, _e, _a, _b, F4, 78,
58262306a36Sopenharmony_ci      WPRECALC_00_15_10, dummy, dummy, _, _, _, _, _, _, _, _, _ );
58362306a36Sopenharmony_ci  _R( _b, _c, _d, _e, _a, F4, 79,
58462306a36Sopenharmony_ci      WPRECALC_00_15_11, dummy, WPRECALC_00_15_12, _, _, _, _, _, _, _, _, _ );
58562306a36Sopenharmony_ci
58662306a36Sopenharmony_ci  /* Update the chaining variables. */
58762306a36Sopenharmony_ci  ldm RSTATE, {RT0-RT3};
58862306a36Sopenharmony_ci  add _a, RT0;
58962306a36Sopenharmony_ci  ldr RT0, [RSTATE, #state_h4];
59062306a36Sopenharmony_ci  add _b, RT1;
59162306a36Sopenharmony_ci  add _c, RT2;
59262306a36Sopenharmony_ci  add _d, RT3;
59362306a36Sopenharmony_ci  add _e, RT0;
59462306a36Sopenharmony_ci  stm RSTATE, {_a-_e};
59562306a36Sopenharmony_ci
59662306a36Sopenharmony_ci  b .Loop;
59762306a36Sopenharmony_ci
59862306a36Sopenharmony_ci.Lend:
59962306a36Sopenharmony_ci  /* Transform 64-79 */
60062306a36Sopenharmony_ci  R( _b, _c, _d, _e, _a, F4, 64 );
60162306a36Sopenharmony_ci  R( _a, _b, _c, _d, _e, F4, 65 );
60262306a36Sopenharmony_ci  R( _e, _a, _b, _c, _d, F4, 66 );
60362306a36Sopenharmony_ci  R( _d, _e, _a, _b, _c, F4, 67 );
60462306a36Sopenharmony_ci  R( _c, _d, _e, _a, _b, F4, 68 );
60562306a36Sopenharmony_ci  R( _b, _c, _d, _e, _a, F4, 69 );
60662306a36Sopenharmony_ci  R( _a, _b, _c, _d, _e, F4, 70 );
60762306a36Sopenharmony_ci  R( _e, _a, _b, _c, _d, F4, 71 );
60862306a36Sopenharmony_ci  R( _d, _e, _a, _b, _c, F4, 72 );
60962306a36Sopenharmony_ci  R( _c, _d, _e, _a, _b, F4, 73 );
61062306a36Sopenharmony_ci  R( _b, _c, _d, _e, _a, F4, 74 );
61162306a36Sopenharmony_ci  R( _a, _b, _c, _d, _e, F4, 75 );
61262306a36Sopenharmony_ci  R( _e, _a, _b, _c, _d, F4, 76 );
61362306a36Sopenharmony_ci  R( _d, _e, _a, _b, _c, F4, 77 );
61462306a36Sopenharmony_ci  R( _c, _d, _e, _a, _b, F4, 78 );
61562306a36Sopenharmony_ci  R( _b, _c, _d, _e, _a, F4, 79 );
61662306a36Sopenharmony_ci
61762306a36Sopenharmony_ci  mov sp, ROLDSTACK;
61862306a36Sopenharmony_ci
61962306a36Sopenharmony_ci  /* Update the chaining variables. */
62062306a36Sopenharmony_ci  ldm RSTATE, {RT0-RT3};
62162306a36Sopenharmony_ci  add _a, RT0;
62262306a36Sopenharmony_ci  ldr RT0, [RSTATE, #state_h4];
62362306a36Sopenharmony_ci  add _b, RT1;
62462306a36Sopenharmony_ci  add _c, RT2;
62562306a36Sopenharmony_ci  add _d, RT3;
62662306a36Sopenharmony_ci  /*vpop {q4-q7};*/
62762306a36Sopenharmony_ci  add _e, RT0;
62862306a36Sopenharmony_ci  stm RSTATE, {_a-_e};
62962306a36Sopenharmony_ci
63062306a36Sopenharmony_ci  pop {r4-r12, pc};
63162306a36Sopenharmony_ci
63262306a36Sopenharmony_ci.Ldo_nothing:
63362306a36Sopenharmony_ci  bx lr
63462306a36Sopenharmony_ciENDPROC(sha1_transform_neon)
635