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