diff --git a/wolfcrypt/src/port/arm/armv8-32-sha256-asm.S b/wolfcrypt/src/port/arm/armv8-32-sha256-asm.S index 446d3877c..e705558a9 100644 --- a/wolfcrypt/src/port/arm/armv8-32-sha256-asm.S +++ b/wolfcrypt/src/port/arm/armv8-32-sha256-asm.S @@ -1559,29 +1559,21 @@ Transform_Sha256_Len: L_SHA256_transform_neon_len_begin: # Load W vldm.32 r1!, {d0-d7} -#ifndef WOLFSSL_ARM_ARCH_NO_VREV +#ifndef WOLFSSL_ARM_ARCH_NEON_64BIT vrev32.8 q0, q0 vrev32.8 q1, q1 vrev32.8 q2, q2 vrev32.8 q3, q3 #else - vshl.i16 q4, q0, #8 - vshl.i16 q5, q1, #8 - vsri.i16 q4, q0, #8 - vsri.i16 q5, q1, #8 - vshl.i32 q0, q4, #16 - vshl.i32 q1, q5, #16 - vsri.i32 q0, q4, #16 - vsri.i32 q1, q5, #16 - vshl.i16 q4, q2, #8 - vshl.i16 q5, q3, #8 - vsri.i16 q4, q2, #8 - vsri.i16 q5, q3, #8 - vshl.i32 q2, q4, #16 - vshl.i32 q3, q5, #16 - vsri.i32 q2, q4, #16 - vsri.i32 q3, q5, #16 -#endif /* WOLFSSL_ARM_ARCH_NO_VREV */ + vrev32.8 d0, d0 + vrev32.8 d1, d1 + vrev32.8 d2, d2 + vrev32.8 d3, d3 + vrev32.8 d4, d4 + vrev32.8 d5, d5 + vrev32.8 d6, d6 + vrev32.8 d7, d7 +#endif /* WOLFSSL_ARM_ARCH_NEON_64BIT */ str r1, [sp, #4] mov lr, #3 # Start of 16 rounds diff --git a/wolfcrypt/src/port/arm/armv8-32-sha256-asm_c.c b/wolfcrypt/src/port/arm/armv8-32-sha256-asm_c.c index 5cd910b2a..06ea84e1f 100644 --- a/wolfcrypt/src/port/arm/armv8-32-sha256-asm_c.c +++ b/wolfcrypt/src/port/arm/armv8-32-sha256-asm_c.c @@ -1554,29 +1554,21 @@ void Transform_Sha256_Len(wc_Sha256* sha256, const byte* data, word32 len) "L_SHA256_transform_neon_len_begin_%=: \n\t" /* Load W */ "vldm.32 %[data]!, {d0-d7}\n\t" -#ifndef WOLFSSL_ARM_ARCH_NO_VREV +#ifndef WOLFSSL_ARM_ARCH_NEON_64BIT "vrev32.8 q0, q0\n\t" "vrev32.8 q1, q1\n\t" "vrev32.8 q2, q2\n\t" "vrev32.8 q3, q3\n\t" #else - "vshl.i16 q4, q0, #8\n\t" - "vshl.i16 q5, q1, #8\n\t" - "vsri.i16 q4, q0, #8\n\t" - "vsri.i16 q5, q1, #8\n\t" - "vshl.i32 q0, q4, #16\n\t" - "vshl.i32 q1, q5, #16\n\t" - "vsri.i32 q0, q4, #16\n\t" - "vsri.i32 q1, q5, #16\n\t" - "vshl.i16 q4, q2, #8\n\t" - "vshl.i16 q5, q3, #8\n\t" - "vsri.i16 q4, q2, #8\n\t" - "vsri.i16 q5, q3, #8\n\t" - "vshl.i32 q2, q4, #16\n\t" - "vshl.i32 q3, q5, #16\n\t" - "vsri.i32 q2, q4, #16\n\t" - "vsri.i32 q3, q5, #16\n\t" -#endif /* WOLFSSL_ARM_ARCH_NO_VREV */ + "vrev32.8 d0, d0\n\t" + "vrev32.8 d1, d1\n\t" + "vrev32.8 d2, d2\n\t" + "vrev32.8 d3, d3\n\t" + "vrev32.8 d4, d4\n\t" + "vrev32.8 d5, d5\n\t" + "vrev32.8 d6, d6\n\t" + "vrev32.8 d7, d7\n\t" +#endif /* WOLFSSL_ARM_ARCH_NEON_64BIT */ "str %[data], [sp, #4]\n\t" "mov lr, #3\n\t" /* Start of 16 rounds */ diff --git a/wolfcrypt/src/port/arm/armv8-32-sha512-asm.S b/wolfcrypt/src/port/arm/armv8-32-sha512-asm.S index 4cb888a23..7d4dcdc26 100644 --- a/wolfcrypt/src/port/arm/armv8-32-sha512-asm.S +++ b/wolfcrypt/src/port/arm/armv8-32-sha512-asm.S @@ -4219,7 +4219,7 @@ Transform_Sha512_Len: L_SHA512_transform_neon_len_begin: # Load W vldm.64 r1!, {d16-d31} -#ifndef WOLFSSL_ARM_ARCH_NO_VREV +#ifndef WOLFSSL_ARM_ARCH_NEON_64BIT vrev64.8 q8, q8 vrev64.8 q9, q9 vrev64.8 q10, q10 @@ -4229,55 +4229,23 @@ L_SHA512_transform_neon_len_begin: vrev64.8 q14, q14 vrev64.8 q15, q15 #else - vshl.i16 q4, q8, #8 - vshl.i16 q5, q9, #8 - vsri.i16 q4, q8, #8 - vsri.i16 q5, q9, #8 - vshl.i32 q6, q4, #16 - vshl.i32 q7, q5, #16 - vsri.i32 q6, q4, #16 - vsri.i32 q7, q5, #16 - vshl.i64 q8, q6, #32 - vshl.i64 q9, q7, #32 - vsri.i64 q8, q6, #32 - vsri.i64 q9, q7, #32 - vshl.i16 q4, q10, #8 - vshl.i16 q5, q11, #8 - vsri.i16 q4, q10, #8 - vsri.i16 q5, q11, #8 - vshl.i32 q6, q4, #16 - vshl.i32 q7, q5, #16 - vsri.i32 q6, q4, #16 - vsri.i32 q7, q5, #16 - vshl.i64 q10, q6, #32 - vshl.i64 q11, q7, #32 - vsri.i64 q10, q6, #32 - vsri.i64 q11, q7, #32 - vshl.i16 q4, q12, #8 - vshl.i16 q5, q13, #8 - vsri.i16 q4, q12, #8 - vsri.i16 q5, q13, #8 - vshl.i32 q6, q4, #16 - vshl.i32 q7, q5, #16 - vsri.i32 q6, q4, #16 - vsri.i32 q7, q5, #16 - vshl.i64 q12, q6, #32 - vshl.i64 q13, q7, #32 - vsri.i64 q12, q6, #32 - vsri.i64 q13, q7, #32 - vshl.i16 q4, q14, #8 - vshl.i16 q5, q15, #8 - vsri.i16 q4, q14, #8 - vsri.i16 q5, q15, #8 - vshl.i32 q6, q4, #16 - vshl.i32 q7, q5, #16 - vsri.i32 q6, q4, #16 - vsri.i32 q7, q5, #16 - vshl.i64 q14, q6, #32 - vshl.i64 q15, q7, #32 - vsri.i64 q14, q6, #32 - vsri.i64 q15, q7, #32 -#endif /* WOLFSSL_ARM_ARCH_NO_VREV */ + vrev64.8 d16, d16 + vrev64.8 d17, d17 + vrev64.8 d18, d18 + vrev64.8 d19, d19 + vrev64.8 d20, d20 + vrev64.8 d21, d21 + vrev64.8 d22, d22 + vrev64.8 d23, d23 + vrev64.8 d24, d24 + vrev64.8 d25, d25 + vrev64.8 d26, d26 + vrev64.8 d27, d27 + vrev64.8 d28, d28 + vrev64.8 d29, d29 + vrev64.8 d30, d30 + vrev64.8 d31, d31 +#endif /* WOLFSSL_ARM_ARCH_NEON_64BIT */ adr r3, L_SHA512_transform_neon_len_k mov r12, #4 # Start of 16 rounds @@ -4340,6 +4308,7 @@ L_SHA512_transform_neon_len_start: vadd.i64 d10, d9 vadd.i64 d2, d6 vadd.i64 d6, d10 +#ifndef WOLFSSL_ARM_ARCH_NEON_64BIT # Calc new W[0]-W[1] vext.8 q6, q8, q9, #8 vshl.u64 q4, q15, #45 @@ -4360,6 +4329,47 @@ L_SHA512_transform_neon_len_start: vshr.u64 q6, #7 veor q5, q6 vadd.i64 q8, q5 +#else + # Calc new W[0]-W[1] + vmov d12, d17 + vmov d13, d18 + vshl.u64 d8, d30, #45 + vshl.u64 d9, d31, #45 + vsri.u64 d8, d30, #19 + vsri.u64 d9, d31, #19 + vshl.u64 d10, d30, #3 + vshl.u64 d11, d31, #3 + vsri.u64 d10, d30, #61 + vsri.u64 d11, d31, #61 + veor d10, d8 + veor d11, d9 + vshr.u64 d8, d30, #6 + vshr.u64 d9, d31, #6 + veor d10, d8 + veor d11, d9 + vadd.i64 d16, d10 + vadd.i64 d17, d11 + vmov d14, d25 + vmov d15, d26 + vadd.i64 d16, d14 + vadd.i64 d17, d15 + vshl.u64 d8, d12, #63 + vshl.u64 d9, d13, #63 + vsri.u64 d8, d12, #1 + vsri.u64 d9, d13, #1 + vshl.u64 d10, d12, #56 + vshl.u64 d11, d13, #56 + vsri.u64 d10, d12, #8 + vsri.u64 d11, d13, #8 + veor d10, d8 + veor d11, d9 + vshr.u64 d12, #7 + vshr.u64 d13, #7 + veor d10, d12 + veor d11, d13 + vadd.i64 d16, d10 + vadd.i64 d17, d11 +#endif /* WOLFSSL_ARM_ARCH_NEON_64BIT */ # Round 2 vld1.64 {d12}, [r3:64]! vshl.u64 d8, d2, #50 @@ -4418,6 +4428,7 @@ L_SHA512_transform_neon_len_start: vadd.i64 d10, d9 vadd.i64 d0, d4 vadd.i64 d4, d10 +#ifndef WOLFSSL_ARM_ARCH_NEON_64BIT # Calc new W[2]-W[3] vext.8 q6, q9, q10, #8 vshl.u64 q4, q8, #45 @@ -4438,6 +4449,47 @@ L_SHA512_transform_neon_len_start: vshr.u64 q6, #7 veor q5, q6 vadd.i64 q9, q5 +#else + # Calc new W[2]-W[3] + vmov d12, d19 + vmov d13, d20 + vshl.u64 d8, d16, #45 + vshl.u64 d9, d17, #45 + vsri.u64 d8, d16, #19 + vsri.u64 d9, d17, #19 + vshl.u64 d10, d16, #3 + vshl.u64 d11, d17, #3 + vsri.u64 d10, d16, #61 + vsri.u64 d11, d17, #61 + veor d10, d8 + veor d11, d9 + vshr.u64 d8, d16, #6 + vshr.u64 d9, d17, #6 + veor d10, d8 + veor d11, d9 + vadd.i64 d18, d10 + vadd.i64 d19, d11 + vmov d14, d27 + vmov d15, d28 + vadd.i64 d18, d14 + vadd.i64 d19, d15 + vshl.u64 d8, d12, #63 + vshl.u64 d9, d13, #63 + vsri.u64 d8, d12, #1 + vsri.u64 d9, d13, #1 + vshl.u64 d10, d12, #56 + vshl.u64 d11, d13, #56 + vsri.u64 d10, d12, #8 + vsri.u64 d11, d13, #8 + veor d10, d8 + veor d11, d9 + vshr.u64 d12, #7 + vshr.u64 d13, #7 + veor d10, d12 + veor d11, d13 + vadd.i64 d18, d10 + vadd.i64 d19, d11 +#endif /* WOLFSSL_ARM_ARCH_NEON_64BIT */ # Round 4 vld1.64 {d12}, [r3:64]! vshl.u64 d8, d0, #50 @@ -4496,6 +4548,7 @@ L_SHA512_transform_neon_len_start: vadd.i64 d10, d9 vadd.i64 d6, d2 vadd.i64 d2, d10 +#ifndef WOLFSSL_ARM_ARCH_NEON_64BIT # Calc new W[4]-W[5] vext.8 q6, q10, q11, #8 vshl.u64 q4, q9, #45 @@ -4516,6 +4569,47 @@ L_SHA512_transform_neon_len_start: vshr.u64 q6, #7 veor q5, q6 vadd.i64 q10, q5 +#else + # Calc new W[4]-W[5] + vmov d12, d21 + vmov d13, d22 + vshl.u64 d8, d18, #45 + vshl.u64 d9, d19, #45 + vsri.u64 d8, d18, #19 + vsri.u64 d9, d19, #19 + vshl.u64 d10, d18, #3 + vshl.u64 d11, d19, #3 + vsri.u64 d10, d18, #61 + vsri.u64 d11, d19, #61 + veor d10, d8 + veor d11, d9 + vshr.u64 d8, d18, #6 + vshr.u64 d9, d19, #6 + veor d10, d8 + veor d11, d9 + vadd.i64 d20, d10 + vadd.i64 d21, d11 + vmov d14, d29 + vmov d15, d30 + vadd.i64 d20, d14 + vadd.i64 d21, d15 + vshl.u64 d8, d12, #63 + vshl.u64 d9, d13, #63 + vsri.u64 d8, d12, #1 + vsri.u64 d9, d13, #1 + vshl.u64 d10, d12, #56 + vshl.u64 d11, d13, #56 + vsri.u64 d10, d12, #8 + vsri.u64 d11, d13, #8 + veor d10, d8 + veor d11, d9 + vshr.u64 d12, #7 + vshr.u64 d13, #7 + veor d10, d12 + veor d11, d13 + vadd.i64 d20, d10 + vadd.i64 d21, d11 +#endif /* WOLFSSL_ARM_ARCH_NEON_64BIT */ # Round 6 vld1.64 {d12}, [r3:64]! vshl.u64 d8, d6, #50 @@ -4574,6 +4668,7 @@ L_SHA512_transform_neon_len_start: vadd.i64 d10, d9 vadd.i64 d4, d0 vadd.i64 d0, d10 +#ifndef WOLFSSL_ARM_ARCH_NEON_64BIT # Calc new W[6]-W[7] vext.8 q6, q11, q12, #8 vshl.u64 q4, q10, #45 @@ -4594,6 +4689,47 @@ L_SHA512_transform_neon_len_start: vshr.u64 q6, #7 veor q5, q6 vadd.i64 q11, q5 +#else + # Calc new W[6]-W[7] + vmov d12, d23 + vmov d13, d24 + vshl.u64 d8, d20, #45 + vshl.u64 d9, d21, #45 + vsri.u64 d8, d20, #19 + vsri.u64 d9, d21, #19 + vshl.u64 d10, d20, #3 + vshl.u64 d11, d21, #3 + vsri.u64 d10, d20, #61 + vsri.u64 d11, d21, #61 + veor d10, d8 + veor d11, d9 + vshr.u64 d8, d20, #6 + vshr.u64 d9, d21, #6 + veor d10, d8 + veor d11, d9 + vadd.i64 d22, d10 + vadd.i64 d23, d11 + vmov d14, d31 + vmov d15, d16 + vadd.i64 d22, d14 + vadd.i64 d23, d15 + vshl.u64 d8, d12, #63 + vshl.u64 d9, d13, #63 + vsri.u64 d8, d12, #1 + vsri.u64 d9, d13, #1 + vshl.u64 d10, d12, #56 + vshl.u64 d11, d13, #56 + vsri.u64 d10, d12, #8 + vsri.u64 d11, d13, #8 + veor d10, d8 + veor d11, d9 + vshr.u64 d12, #7 + vshr.u64 d13, #7 + veor d10, d12 + veor d11, d13 + vadd.i64 d22, d10 + vadd.i64 d23, d11 +#endif /* WOLFSSL_ARM_ARCH_NEON_64BIT */ # Round 8 vld1.64 {d12}, [r3:64]! vshl.u64 d8, d4, #50 @@ -4652,6 +4788,7 @@ L_SHA512_transform_neon_len_start: vadd.i64 d10, d9 vadd.i64 d2, d6 vadd.i64 d6, d10 +#ifndef WOLFSSL_ARM_ARCH_NEON_64BIT # Calc new W[8]-W[9] vext.8 q6, q12, q13, #8 vshl.u64 q4, q11, #45 @@ -4672,6 +4809,47 @@ L_SHA512_transform_neon_len_start: vshr.u64 q6, #7 veor q5, q6 vadd.i64 q12, q5 +#else + # Calc new W[8]-W[9] + vmov d12, d25 + vmov d13, d26 + vshl.u64 d8, d22, #45 + vshl.u64 d9, d23, #45 + vsri.u64 d8, d22, #19 + vsri.u64 d9, d23, #19 + vshl.u64 d10, d22, #3 + vshl.u64 d11, d23, #3 + vsri.u64 d10, d22, #61 + vsri.u64 d11, d23, #61 + veor d10, d8 + veor d11, d9 + vshr.u64 d8, d22, #6 + vshr.u64 d9, d23, #6 + veor d10, d8 + veor d11, d9 + vadd.i64 d24, d10 + vadd.i64 d25, d11 + vmov d14, d17 + vmov d15, d18 + vadd.i64 d24, d14 + vadd.i64 d25, d15 + vshl.u64 d8, d12, #63 + vshl.u64 d9, d13, #63 + vsri.u64 d8, d12, #1 + vsri.u64 d9, d13, #1 + vshl.u64 d10, d12, #56 + vshl.u64 d11, d13, #56 + vsri.u64 d10, d12, #8 + vsri.u64 d11, d13, #8 + veor d10, d8 + veor d11, d9 + vshr.u64 d12, #7 + vshr.u64 d13, #7 + veor d10, d12 + veor d11, d13 + vadd.i64 d24, d10 + vadd.i64 d25, d11 +#endif /* WOLFSSL_ARM_ARCH_NEON_64BIT */ # Round 10 vld1.64 {d12}, [r3:64]! vshl.u64 d8, d2, #50 @@ -4730,6 +4908,7 @@ L_SHA512_transform_neon_len_start: vadd.i64 d10, d9 vadd.i64 d0, d4 vadd.i64 d4, d10 +#ifndef WOLFSSL_ARM_ARCH_NEON_64BIT # Calc new W[10]-W[11] vext.8 q6, q13, q14, #8 vshl.u64 q4, q12, #45 @@ -4750,6 +4929,47 @@ L_SHA512_transform_neon_len_start: vshr.u64 q6, #7 veor q5, q6 vadd.i64 q13, q5 +#else + # Calc new W[10]-W[11] + vmov d12, d27 + vmov d13, d28 + vshl.u64 d8, d24, #45 + vshl.u64 d9, d25, #45 + vsri.u64 d8, d24, #19 + vsri.u64 d9, d25, #19 + vshl.u64 d10, d24, #3 + vshl.u64 d11, d25, #3 + vsri.u64 d10, d24, #61 + vsri.u64 d11, d25, #61 + veor d10, d8 + veor d11, d9 + vshr.u64 d8, d24, #6 + vshr.u64 d9, d25, #6 + veor d10, d8 + veor d11, d9 + vadd.i64 d26, d10 + vadd.i64 d27, d11 + vmov d14, d19 + vmov d15, d20 + vadd.i64 d26, d14 + vadd.i64 d27, d15 + vshl.u64 d8, d12, #63 + vshl.u64 d9, d13, #63 + vsri.u64 d8, d12, #1 + vsri.u64 d9, d13, #1 + vshl.u64 d10, d12, #56 + vshl.u64 d11, d13, #56 + vsri.u64 d10, d12, #8 + vsri.u64 d11, d13, #8 + veor d10, d8 + veor d11, d9 + vshr.u64 d12, #7 + vshr.u64 d13, #7 + veor d10, d12 + veor d11, d13 + vadd.i64 d26, d10 + vadd.i64 d27, d11 +#endif /* WOLFSSL_ARM_ARCH_NEON_64BIT */ # Round 12 vld1.64 {d12}, [r3:64]! vshl.u64 d8, d0, #50 @@ -4808,6 +5028,7 @@ L_SHA512_transform_neon_len_start: vadd.i64 d10, d9 vadd.i64 d6, d2 vadd.i64 d2, d10 +#ifndef WOLFSSL_ARM_ARCH_NEON_64BIT # Calc new W[12]-W[13] vext.8 q6, q14, q15, #8 vshl.u64 q4, q13, #45 @@ -4828,6 +5049,47 @@ L_SHA512_transform_neon_len_start: vshr.u64 q6, #7 veor q5, q6 vadd.i64 q14, q5 +#else + # Calc new W[12]-W[13] + vmov d12, d29 + vmov d13, d30 + vshl.u64 d8, d26, #45 + vshl.u64 d9, d27, #45 + vsri.u64 d8, d26, #19 + vsri.u64 d9, d27, #19 + vshl.u64 d10, d26, #3 + vshl.u64 d11, d27, #3 + vsri.u64 d10, d26, #61 + vsri.u64 d11, d27, #61 + veor d10, d8 + veor d11, d9 + vshr.u64 d8, d26, #6 + vshr.u64 d9, d27, #6 + veor d10, d8 + veor d11, d9 + vadd.i64 d28, d10 + vadd.i64 d29, d11 + vmov d14, d21 + vmov d15, d22 + vadd.i64 d28, d14 + vadd.i64 d29, d15 + vshl.u64 d8, d12, #63 + vshl.u64 d9, d13, #63 + vsri.u64 d8, d12, #1 + vsri.u64 d9, d13, #1 + vshl.u64 d10, d12, #56 + vshl.u64 d11, d13, #56 + vsri.u64 d10, d12, #8 + vsri.u64 d11, d13, #8 + veor d10, d8 + veor d11, d9 + vshr.u64 d12, #7 + vshr.u64 d13, #7 + veor d10, d12 + veor d11, d13 + vadd.i64 d28, d10 + vadd.i64 d29, d11 +#endif /* WOLFSSL_ARM_ARCH_NEON_64BIT */ # Round 14 vld1.64 {d12}, [r3:64]! vshl.u64 d8, d6, #50 @@ -4886,6 +5148,7 @@ L_SHA512_transform_neon_len_start: vadd.i64 d10, d9 vadd.i64 d4, d0 vadd.i64 d0, d10 +#ifndef WOLFSSL_ARM_ARCH_NEON_64BIT # Calc new W[14]-W[15] vext.8 q6, q15, q8, #8 vshl.u64 q4, q14, #45 @@ -4906,6 +5169,47 @@ L_SHA512_transform_neon_len_start: vshr.u64 q6, #7 veor q5, q6 vadd.i64 q15, q5 +#else + # Calc new W[14]-W[15] + vmov d12, d31 + vmov d13, d16 + vshl.u64 d8, d28, #45 + vshl.u64 d9, d29, #45 + vsri.u64 d8, d28, #19 + vsri.u64 d9, d29, #19 + vshl.u64 d10, d28, #3 + vshl.u64 d11, d29, #3 + vsri.u64 d10, d28, #61 + vsri.u64 d11, d29, #61 + veor d10, d8 + veor d11, d9 + vshr.u64 d8, d28, #6 + vshr.u64 d9, d29, #6 + veor d10, d8 + veor d11, d9 + vadd.i64 d30, d10 + vadd.i64 d31, d11 + vmov d14, d23 + vmov d15, d24 + vadd.i64 d30, d14 + vadd.i64 d31, d15 + vshl.u64 d8, d12, #63 + vshl.u64 d9, d13, #63 + vsri.u64 d8, d12, #1 + vsri.u64 d9, d13, #1 + vshl.u64 d10, d12, #56 + vshl.u64 d11, d13, #56 + vsri.u64 d10, d12, #8 + vsri.u64 d11, d13, #8 + veor d10, d8 + veor d11, d9 + vshr.u64 d12, #7 + vshr.u64 d13, #7 + veor d10, d12 + veor d11, d13 + vadd.i64 d30, d10 + vadd.i64 d31, d11 +#endif /* WOLFSSL_ARM_ARCH_NEON_64BIT */ subs r12, r12, #1 bne L_SHA512_transform_neon_len_start # Round 0 @@ -5374,10 +5678,21 @@ L_SHA512_transform_neon_len_start: vadd.i64 d0, d10 # Add in digest from start vldm.64 r0, {d8-d15} +#ifndef WOLFSSL_ARM_ARCH_NEON_64BIT vadd.i64 q0, q0, q4 vadd.i64 q1, q1, q5 vadd.i64 q2, q2, q6 vadd.i64 q3, q3, q7 +#else + vadd.i64 d0, d0, d8 + vadd.i64 d1, d1, d9 + vadd.i64 d2, d2, d10 + vadd.i64 d3, d3, d11 + vadd.i64 d4, d4, d12 + vadd.i64 d5, d5, d13 + vadd.i64 d6, d6, d14 + vadd.i64 d7, d7, d15 +#endif /* WOLFSSL_ARM_ARCH_NEON_64BIT */ vstm.64 r0, {d0-d7} subs r2, r2, #0x80 bne L_SHA512_transform_neon_len_begin diff --git a/wolfcrypt/src/port/arm/armv8-32-sha512-asm_c.c b/wolfcrypt/src/port/arm/armv8-32-sha512-asm_c.c index 4d5eb18c1..5c17f0151 100644 --- a/wolfcrypt/src/port/arm/armv8-32-sha512-asm_c.c +++ b/wolfcrypt/src/port/arm/armv8-32-sha512-asm_c.c @@ -3662,7 +3662,7 @@ void Transform_Sha512_Len(wc_Sha512* sha512, const byte* data, word32 len) "L_SHA512_transform_neon_len_begin_%=: \n\t" /* Load W */ "vldm.64 %[data]!, {d16-d31}\n\t" -#ifndef WOLFSSL_ARM_ARCH_NO_VREV +#ifndef WOLFSSL_ARM_ARCH_NEON_64BIT "vrev64.8 q8, q8\n\t" "vrev64.8 q9, q9\n\t" "vrev64.8 q10, q10\n\t" @@ -3672,55 +3672,23 @@ void Transform_Sha512_Len(wc_Sha512* sha512, const byte* data, word32 len) "vrev64.8 q14, q14\n\t" "vrev64.8 q15, q15\n\t" #else - "vshl.i16 q4, q8, #8\n\t" - "vshl.i16 q5, q9, #8\n\t" - "vsri.i16 q4, q8, #8\n\t" - "vsri.i16 q5, q9, #8\n\t" - "vshl.i32 q6, q4, #16\n\t" - "vshl.i32 q7, q5, #16\n\t" - "vsri.i32 q6, q4, #16\n\t" - "vsri.i32 q7, q5, #16\n\t" - "vshl.i64 q8, q6, #32\n\t" - "vshl.i64 q9, q7, #32\n\t" - "vsri.i64 q8, q6, #32\n\t" - "vsri.i64 q9, q7, #32\n\t" - "vshl.i16 q4, q10, #8\n\t" - "vshl.i16 q5, q11, #8\n\t" - "vsri.i16 q4, q10, #8\n\t" - "vsri.i16 q5, q11, #8\n\t" - "vshl.i32 q6, q4, #16\n\t" - "vshl.i32 q7, q5, #16\n\t" - "vsri.i32 q6, q4, #16\n\t" - "vsri.i32 q7, q5, #16\n\t" - "vshl.i64 q10, q6, #32\n\t" - "vshl.i64 q11, q7, #32\n\t" - "vsri.i64 q10, q6, #32\n\t" - "vsri.i64 q11, q7, #32\n\t" - "vshl.i16 q4, q12, #8\n\t" - "vshl.i16 q5, q13, #8\n\t" - "vsri.i16 q4, q12, #8\n\t" - "vsri.i16 q5, q13, #8\n\t" - "vshl.i32 q6, q4, #16\n\t" - "vshl.i32 q7, q5, #16\n\t" - "vsri.i32 q6, q4, #16\n\t" - "vsri.i32 q7, q5, #16\n\t" - "vshl.i64 q12, q6, #32\n\t" - "vshl.i64 q13, q7, #32\n\t" - "vsri.i64 q12, q6, #32\n\t" - "vsri.i64 q13, q7, #32\n\t" - "vshl.i16 q4, q14, #8\n\t" - "vshl.i16 q5, q15, #8\n\t" - "vsri.i16 q4, q14, #8\n\t" - "vsri.i16 q5, q15, #8\n\t" - "vshl.i32 q6, q4, #16\n\t" - "vshl.i32 q7, q5, #16\n\t" - "vsri.i32 q6, q4, #16\n\t" - "vsri.i32 q7, q5, #16\n\t" - "vshl.i64 q14, q6, #32\n\t" - "vshl.i64 q15, q7, #32\n\t" - "vsri.i64 q14, q6, #32\n\t" - "vsri.i64 q15, q7, #32\n\t" -#endif /* WOLFSSL_ARM_ARCH_NO_VREV */ + "vrev64.8 d16, d16\n\t" + "vrev64.8 d17, d17\n\t" + "vrev64.8 d18, d18\n\t" + "vrev64.8 d19, d19\n\t" + "vrev64.8 d20, d20\n\t" + "vrev64.8 d21, d21\n\t" + "vrev64.8 d22, d22\n\t" + "vrev64.8 d23, d23\n\t" + "vrev64.8 d24, d24\n\t" + "vrev64.8 d25, d25\n\t" + "vrev64.8 d26, d26\n\t" + "vrev64.8 d27, d27\n\t" + "vrev64.8 d28, d28\n\t" + "vrev64.8 d29, d29\n\t" + "vrev64.8 d30, d30\n\t" + "vrev64.8 d31, d31\n\t" +#endif /* WOLFSSL_ARM_ARCH_NEON_64BIT */ "mov r3, %[L_SHA512_transform_neon_len_k]\n\t" "mov r12, #4\n\t" /* Start of 16 rounds */ @@ -3784,6 +3752,7 @@ void Transform_Sha512_Len(wc_Sha512* sha512, const byte* data, word32 len) "vadd.i64 d10, d9\n\t" "vadd.i64 d2, d6\n\t" "vadd.i64 d6, d10\n\t" +#ifndef WOLFSSL_ARM_ARCH_NEON_64BIT /* Calc new W[0]-W[1] */ "vext.8 q6, q8, q9, #8\n\t" "vshl.u64 q4, q15, #45\n\t" @@ -3804,6 +3773,47 @@ void Transform_Sha512_Len(wc_Sha512* sha512, const byte* data, word32 len) "vshr.u64 q6, #7\n\t" "veor q5, q6\n\t" "vadd.i64 q8, q5\n\t" +#else + /* Calc new W[0]-W[1] */ + "vmov d12, d17\n\t" + "vmov d13, d18\n\t" + "vshl.u64 d8, d30, #45\n\t" + "vshl.u64 d9, d31, #45\n\t" + "vsri.u64 d8, d30, #19\n\t" + "vsri.u64 d9, d31, #19\n\t" + "vshl.u64 d10, d30, #3\n\t" + "vshl.u64 d11, d31, #3\n\t" + "vsri.u64 d10, d30, #61\n\t" + "vsri.u64 d11, d31, #61\n\t" + "veor d10, d8\n\t" + "veor d11, d9\n\t" + "vshr.u64 d8, d30, #6\n\t" + "vshr.u64 d9, d31, #6\n\t" + "veor d10, d8\n\t" + "veor d11, d9\n\t" + "vadd.i64 d16, d10\n\t" + "vadd.i64 d17, d11\n\t" + "vmov d14, d25\n\t" + "vmov d15, d26\n\t" + "vadd.i64 d16, d14\n\t" + "vadd.i64 d17, d15\n\t" + "vshl.u64 d8, d12, #63\n\t" + "vshl.u64 d9, d13, #63\n\t" + "vsri.u64 d8, d12, #1\n\t" + "vsri.u64 d9, d13, #1\n\t" + "vshl.u64 d10, d12, #56\n\t" + "vshl.u64 d11, d13, #56\n\t" + "vsri.u64 d10, d12, #8\n\t" + "vsri.u64 d11, d13, #8\n\t" + "veor d10, d8\n\t" + "veor d11, d9\n\t" + "vshr.u64 d12, #7\n\t" + "vshr.u64 d13, #7\n\t" + "veor d10, d12\n\t" + "veor d11, d13\n\t" + "vadd.i64 d16, d10\n\t" + "vadd.i64 d17, d11\n\t" +#endif /* WOLFSSL_ARM_ARCH_NEON_64BIT */ /* Round 2 */ "vld1.64 {d12}, [r3]!\n\t" "vshl.u64 d8, d2, #50\n\t" @@ -3862,6 +3872,7 @@ void Transform_Sha512_Len(wc_Sha512* sha512, const byte* data, word32 len) "vadd.i64 d10, d9\n\t" "vadd.i64 d0, d4\n\t" "vadd.i64 d4, d10\n\t" +#ifndef WOLFSSL_ARM_ARCH_NEON_64BIT /* Calc new W[2]-W[3] */ "vext.8 q6, q9, q10, #8\n\t" "vshl.u64 q4, q8, #45\n\t" @@ -3882,6 +3893,47 @@ void Transform_Sha512_Len(wc_Sha512* sha512, const byte* data, word32 len) "vshr.u64 q6, #7\n\t" "veor q5, q6\n\t" "vadd.i64 q9, q5\n\t" +#else + /* Calc new W[2]-W[3] */ + "vmov d12, d19\n\t" + "vmov d13, d20\n\t" + "vshl.u64 d8, d16, #45\n\t" + "vshl.u64 d9, d17, #45\n\t" + "vsri.u64 d8, d16, #19\n\t" + "vsri.u64 d9, d17, #19\n\t" + "vshl.u64 d10, d16, #3\n\t" + "vshl.u64 d11, d17, #3\n\t" + "vsri.u64 d10, d16, #61\n\t" + "vsri.u64 d11, d17, #61\n\t" + "veor d10, d8\n\t" + "veor d11, d9\n\t" + "vshr.u64 d8, d16, #6\n\t" + "vshr.u64 d9, d17, #6\n\t" + "veor d10, d8\n\t" + "veor d11, d9\n\t" + "vadd.i64 d18, d10\n\t" + "vadd.i64 d19, d11\n\t" + "vmov d14, d27\n\t" + "vmov d15, d28\n\t" + "vadd.i64 d18, d14\n\t" + "vadd.i64 d19, d15\n\t" + "vshl.u64 d8, d12, #63\n\t" + "vshl.u64 d9, d13, #63\n\t" + "vsri.u64 d8, d12, #1\n\t" + "vsri.u64 d9, d13, #1\n\t" + "vshl.u64 d10, d12, #56\n\t" + "vshl.u64 d11, d13, #56\n\t" + "vsri.u64 d10, d12, #8\n\t" + "vsri.u64 d11, d13, #8\n\t" + "veor d10, d8\n\t" + "veor d11, d9\n\t" + "vshr.u64 d12, #7\n\t" + "vshr.u64 d13, #7\n\t" + "veor d10, d12\n\t" + "veor d11, d13\n\t" + "vadd.i64 d18, d10\n\t" + "vadd.i64 d19, d11\n\t" +#endif /* WOLFSSL_ARM_ARCH_NEON_64BIT */ /* Round 4 */ "vld1.64 {d12}, [r3]!\n\t" "vshl.u64 d8, d0, #50\n\t" @@ -3940,6 +3992,7 @@ void Transform_Sha512_Len(wc_Sha512* sha512, const byte* data, word32 len) "vadd.i64 d10, d9\n\t" "vadd.i64 d6, d2\n\t" "vadd.i64 d2, d10\n\t" +#ifndef WOLFSSL_ARM_ARCH_NEON_64BIT /* Calc new W[4]-W[5] */ "vext.8 q6, q10, q11, #8\n\t" "vshl.u64 q4, q9, #45\n\t" @@ -3960,6 +4013,47 @@ void Transform_Sha512_Len(wc_Sha512* sha512, const byte* data, word32 len) "vshr.u64 q6, #7\n\t" "veor q5, q6\n\t" "vadd.i64 q10, q5\n\t" +#else + /* Calc new W[4]-W[5] */ + "vmov d12, d21\n\t" + "vmov d13, d22\n\t" + "vshl.u64 d8, d18, #45\n\t" + "vshl.u64 d9, d19, #45\n\t" + "vsri.u64 d8, d18, #19\n\t" + "vsri.u64 d9, d19, #19\n\t" + "vshl.u64 d10, d18, #3\n\t" + "vshl.u64 d11, d19, #3\n\t" + "vsri.u64 d10, d18, #61\n\t" + "vsri.u64 d11, d19, #61\n\t" + "veor d10, d8\n\t" + "veor d11, d9\n\t" + "vshr.u64 d8, d18, #6\n\t" + "vshr.u64 d9, d19, #6\n\t" + "veor d10, d8\n\t" + "veor d11, d9\n\t" + "vadd.i64 d20, d10\n\t" + "vadd.i64 d21, d11\n\t" + "vmov d14, d29\n\t" + "vmov d15, d30\n\t" + "vadd.i64 d20, d14\n\t" + "vadd.i64 d21, d15\n\t" + "vshl.u64 d8, d12, #63\n\t" + "vshl.u64 d9, d13, #63\n\t" + "vsri.u64 d8, d12, #1\n\t" + "vsri.u64 d9, d13, #1\n\t" + "vshl.u64 d10, d12, #56\n\t" + "vshl.u64 d11, d13, #56\n\t" + "vsri.u64 d10, d12, #8\n\t" + "vsri.u64 d11, d13, #8\n\t" + "veor d10, d8\n\t" + "veor d11, d9\n\t" + "vshr.u64 d12, #7\n\t" + "vshr.u64 d13, #7\n\t" + "veor d10, d12\n\t" + "veor d11, d13\n\t" + "vadd.i64 d20, d10\n\t" + "vadd.i64 d21, d11\n\t" +#endif /* WOLFSSL_ARM_ARCH_NEON_64BIT */ /* Round 6 */ "vld1.64 {d12}, [r3]!\n\t" "vshl.u64 d8, d6, #50\n\t" @@ -4018,6 +4112,7 @@ void Transform_Sha512_Len(wc_Sha512* sha512, const byte* data, word32 len) "vadd.i64 d10, d9\n\t" "vadd.i64 d4, d0\n\t" "vadd.i64 d0, d10\n\t" +#ifndef WOLFSSL_ARM_ARCH_NEON_64BIT /* Calc new W[6]-W[7] */ "vext.8 q6, q11, q12, #8\n\t" "vshl.u64 q4, q10, #45\n\t" @@ -4038,6 +4133,47 @@ void Transform_Sha512_Len(wc_Sha512* sha512, const byte* data, word32 len) "vshr.u64 q6, #7\n\t" "veor q5, q6\n\t" "vadd.i64 q11, q5\n\t" +#else + /* Calc new W[6]-W[7] */ + "vmov d12, d23\n\t" + "vmov d13, d24\n\t" + "vshl.u64 d8, d20, #45\n\t" + "vshl.u64 d9, d21, #45\n\t" + "vsri.u64 d8, d20, #19\n\t" + "vsri.u64 d9, d21, #19\n\t" + "vshl.u64 d10, d20, #3\n\t" + "vshl.u64 d11, d21, #3\n\t" + "vsri.u64 d10, d20, #61\n\t" + "vsri.u64 d11, d21, #61\n\t" + "veor d10, d8\n\t" + "veor d11, d9\n\t" + "vshr.u64 d8, d20, #6\n\t" + "vshr.u64 d9, d21, #6\n\t" + "veor d10, d8\n\t" + "veor d11, d9\n\t" + "vadd.i64 d22, d10\n\t" + "vadd.i64 d23, d11\n\t" + "vmov d14, d31\n\t" + "vmov d15, d16\n\t" + "vadd.i64 d22, d14\n\t" + "vadd.i64 d23, d15\n\t" + "vshl.u64 d8, d12, #63\n\t" + "vshl.u64 d9, d13, #63\n\t" + "vsri.u64 d8, d12, #1\n\t" + "vsri.u64 d9, d13, #1\n\t" + "vshl.u64 d10, d12, #56\n\t" + "vshl.u64 d11, d13, #56\n\t" + "vsri.u64 d10, d12, #8\n\t" + "vsri.u64 d11, d13, #8\n\t" + "veor d10, d8\n\t" + "veor d11, d9\n\t" + "vshr.u64 d12, #7\n\t" + "vshr.u64 d13, #7\n\t" + "veor d10, d12\n\t" + "veor d11, d13\n\t" + "vadd.i64 d22, d10\n\t" + "vadd.i64 d23, d11\n\t" +#endif /* WOLFSSL_ARM_ARCH_NEON_64BIT */ /* Round 8 */ "vld1.64 {d12}, [r3]!\n\t" "vshl.u64 d8, d4, #50\n\t" @@ -4096,6 +4232,7 @@ void Transform_Sha512_Len(wc_Sha512* sha512, const byte* data, word32 len) "vadd.i64 d10, d9\n\t" "vadd.i64 d2, d6\n\t" "vadd.i64 d6, d10\n\t" +#ifndef WOLFSSL_ARM_ARCH_NEON_64BIT /* Calc new W[8]-W[9] */ "vext.8 q6, q12, q13, #8\n\t" "vshl.u64 q4, q11, #45\n\t" @@ -4116,6 +4253,47 @@ void Transform_Sha512_Len(wc_Sha512* sha512, const byte* data, word32 len) "vshr.u64 q6, #7\n\t" "veor q5, q6\n\t" "vadd.i64 q12, q5\n\t" +#else + /* Calc new W[8]-W[9] */ + "vmov d12, d25\n\t" + "vmov d13, d26\n\t" + "vshl.u64 d8, d22, #45\n\t" + "vshl.u64 d9, d23, #45\n\t" + "vsri.u64 d8, d22, #19\n\t" + "vsri.u64 d9, d23, #19\n\t" + "vshl.u64 d10, d22, #3\n\t" + "vshl.u64 d11, d23, #3\n\t" + "vsri.u64 d10, d22, #61\n\t" + "vsri.u64 d11, d23, #61\n\t" + "veor d10, d8\n\t" + "veor d11, d9\n\t" + "vshr.u64 d8, d22, #6\n\t" + "vshr.u64 d9, d23, #6\n\t" + "veor d10, d8\n\t" + "veor d11, d9\n\t" + "vadd.i64 d24, d10\n\t" + "vadd.i64 d25, d11\n\t" + "vmov d14, d17\n\t" + "vmov d15, d18\n\t" + "vadd.i64 d24, d14\n\t" + "vadd.i64 d25, d15\n\t" + "vshl.u64 d8, d12, #63\n\t" + "vshl.u64 d9, d13, #63\n\t" + "vsri.u64 d8, d12, #1\n\t" + "vsri.u64 d9, d13, #1\n\t" + "vshl.u64 d10, d12, #56\n\t" + "vshl.u64 d11, d13, #56\n\t" + "vsri.u64 d10, d12, #8\n\t" + "vsri.u64 d11, d13, #8\n\t" + "veor d10, d8\n\t" + "veor d11, d9\n\t" + "vshr.u64 d12, #7\n\t" + "vshr.u64 d13, #7\n\t" + "veor d10, d12\n\t" + "veor d11, d13\n\t" + "vadd.i64 d24, d10\n\t" + "vadd.i64 d25, d11\n\t" +#endif /* WOLFSSL_ARM_ARCH_NEON_64BIT */ /* Round 10 */ "vld1.64 {d12}, [r3]!\n\t" "vshl.u64 d8, d2, #50\n\t" @@ -4174,6 +4352,7 @@ void Transform_Sha512_Len(wc_Sha512* sha512, const byte* data, word32 len) "vadd.i64 d10, d9\n\t" "vadd.i64 d0, d4\n\t" "vadd.i64 d4, d10\n\t" +#ifndef WOLFSSL_ARM_ARCH_NEON_64BIT /* Calc new W[10]-W[11] */ "vext.8 q6, q13, q14, #8\n\t" "vshl.u64 q4, q12, #45\n\t" @@ -4194,6 +4373,47 @@ void Transform_Sha512_Len(wc_Sha512* sha512, const byte* data, word32 len) "vshr.u64 q6, #7\n\t" "veor q5, q6\n\t" "vadd.i64 q13, q5\n\t" +#else + /* Calc new W[10]-W[11] */ + "vmov d12, d27\n\t" + "vmov d13, d28\n\t" + "vshl.u64 d8, d24, #45\n\t" + "vshl.u64 d9, d25, #45\n\t" + "vsri.u64 d8, d24, #19\n\t" + "vsri.u64 d9, d25, #19\n\t" + "vshl.u64 d10, d24, #3\n\t" + "vshl.u64 d11, d25, #3\n\t" + "vsri.u64 d10, d24, #61\n\t" + "vsri.u64 d11, d25, #61\n\t" + "veor d10, d8\n\t" + "veor d11, d9\n\t" + "vshr.u64 d8, d24, #6\n\t" + "vshr.u64 d9, d25, #6\n\t" + "veor d10, d8\n\t" + "veor d11, d9\n\t" + "vadd.i64 d26, d10\n\t" + "vadd.i64 d27, d11\n\t" + "vmov d14, d19\n\t" + "vmov d15, d20\n\t" + "vadd.i64 d26, d14\n\t" + "vadd.i64 d27, d15\n\t" + "vshl.u64 d8, d12, #63\n\t" + "vshl.u64 d9, d13, #63\n\t" + "vsri.u64 d8, d12, #1\n\t" + "vsri.u64 d9, d13, #1\n\t" + "vshl.u64 d10, d12, #56\n\t" + "vshl.u64 d11, d13, #56\n\t" + "vsri.u64 d10, d12, #8\n\t" + "vsri.u64 d11, d13, #8\n\t" + "veor d10, d8\n\t" + "veor d11, d9\n\t" + "vshr.u64 d12, #7\n\t" + "vshr.u64 d13, #7\n\t" + "veor d10, d12\n\t" + "veor d11, d13\n\t" + "vadd.i64 d26, d10\n\t" + "vadd.i64 d27, d11\n\t" +#endif /* WOLFSSL_ARM_ARCH_NEON_64BIT */ /* Round 12 */ "vld1.64 {d12}, [r3]!\n\t" "vshl.u64 d8, d0, #50\n\t" @@ -4252,6 +4472,7 @@ void Transform_Sha512_Len(wc_Sha512* sha512, const byte* data, word32 len) "vadd.i64 d10, d9\n\t" "vadd.i64 d6, d2\n\t" "vadd.i64 d2, d10\n\t" +#ifndef WOLFSSL_ARM_ARCH_NEON_64BIT /* Calc new W[12]-W[13] */ "vext.8 q6, q14, q15, #8\n\t" "vshl.u64 q4, q13, #45\n\t" @@ -4272,6 +4493,47 @@ void Transform_Sha512_Len(wc_Sha512* sha512, const byte* data, word32 len) "vshr.u64 q6, #7\n\t" "veor q5, q6\n\t" "vadd.i64 q14, q5\n\t" +#else + /* Calc new W[12]-W[13] */ + "vmov d12, d29\n\t" + "vmov d13, d30\n\t" + "vshl.u64 d8, d26, #45\n\t" + "vshl.u64 d9, d27, #45\n\t" + "vsri.u64 d8, d26, #19\n\t" + "vsri.u64 d9, d27, #19\n\t" + "vshl.u64 d10, d26, #3\n\t" + "vshl.u64 d11, d27, #3\n\t" + "vsri.u64 d10, d26, #61\n\t" + "vsri.u64 d11, d27, #61\n\t" + "veor d10, d8\n\t" + "veor d11, d9\n\t" + "vshr.u64 d8, d26, #6\n\t" + "vshr.u64 d9, d27, #6\n\t" + "veor d10, d8\n\t" + "veor d11, d9\n\t" + "vadd.i64 d28, d10\n\t" + "vadd.i64 d29, d11\n\t" + "vmov d14, d21\n\t" + "vmov d15, d22\n\t" + "vadd.i64 d28, d14\n\t" + "vadd.i64 d29, d15\n\t" + "vshl.u64 d8, d12, #63\n\t" + "vshl.u64 d9, d13, #63\n\t" + "vsri.u64 d8, d12, #1\n\t" + "vsri.u64 d9, d13, #1\n\t" + "vshl.u64 d10, d12, #56\n\t" + "vshl.u64 d11, d13, #56\n\t" + "vsri.u64 d10, d12, #8\n\t" + "vsri.u64 d11, d13, #8\n\t" + "veor d10, d8\n\t" + "veor d11, d9\n\t" + "vshr.u64 d12, #7\n\t" + "vshr.u64 d13, #7\n\t" + "veor d10, d12\n\t" + "veor d11, d13\n\t" + "vadd.i64 d28, d10\n\t" + "vadd.i64 d29, d11\n\t" +#endif /* WOLFSSL_ARM_ARCH_NEON_64BIT */ /* Round 14 */ "vld1.64 {d12}, [r3]!\n\t" "vshl.u64 d8, d6, #50\n\t" @@ -4330,6 +4592,7 @@ void Transform_Sha512_Len(wc_Sha512* sha512, const byte* data, word32 len) "vadd.i64 d10, d9\n\t" "vadd.i64 d4, d0\n\t" "vadd.i64 d0, d10\n\t" +#ifndef WOLFSSL_ARM_ARCH_NEON_64BIT /* Calc new W[14]-W[15] */ "vext.8 q6, q15, q8, #8\n\t" "vshl.u64 q4, q14, #45\n\t" @@ -4350,6 +4613,47 @@ void Transform_Sha512_Len(wc_Sha512* sha512, const byte* data, word32 len) "vshr.u64 q6, #7\n\t" "veor q5, q6\n\t" "vadd.i64 q15, q5\n\t" +#else + /* Calc new W[14]-W[15] */ + "vmov d12, d31\n\t" + "vmov d13, d16\n\t" + "vshl.u64 d8, d28, #45\n\t" + "vshl.u64 d9, d29, #45\n\t" + "vsri.u64 d8, d28, #19\n\t" + "vsri.u64 d9, d29, #19\n\t" + "vshl.u64 d10, d28, #3\n\t" + "vshl.u64 d11, d29, #3\n\t" + "vsri.u64 d10, d28, #61\n\t" + "vsri.u64 d11, d29, #61\n\t" + "veor d10, d8\n\t" + "veor d11, d9\n\t" + "vshr.u64 d8, d28, #6\n\t" + "vshr.u64 d9, d29, #6\n\t" + "veor d10, d8\n\t" + "veor d11, d9\n\t" + "vadd.i64 d30, d10\n\t" + "vadd.i64 d31, d11\n\t" + "vmov d14, d23\n\t" + "vmov d15, d24\n\t" + "vadd.i64 d30, d14\n\t" + "vadd.i64 d31, d15\n\t" + "vshl.u64 d8, d12, #63\n\t" + "vshl.u64 d9, d13, #63\n\t" + "vsri.u64 d8, d12, #1\n\t" + "vsri.u64 d9, d13, #1\n\t" + "vshl.u64 d10, d12, #56\n\t" + "vshl.u64 d11, d13, #56\n\t" + "vsri.u64 d10, d12, #8\n\t" + "vsri.u64 d11, d13, #8\n\t" + "veor d10, d8\n\t" + "veor d11, d9\n\t" + "vshr.u64 d12, #7\n\t" + "vshr.u64 d13, #7\n\t" + "veor d10, d12\n\t" + "veor d11, d13\n\t" + "vadd.i64 d30, d10\n\t" + "vadd.i64 d31, d11\n\t" +#endif /* WOLFSSL_ARM_ARCH_NEON_64BIT */ "subs r12, r12, #1\n\t" "bne L_SHA512_transform_neon_len_start_%=\n\t" /* Round 0 */ @@ -4818,10 +5122,21 @@ void Transform_Sha512_Len(wc_Sha512* sha512, const byte* data, word32 len) "vadd.i64 d0, d10\n\t" /* Add in digest from start */ "vldm.64 %[sha512], {d8-d15}\n\t" +#ifndef WOLFSSL_ARM_ARCH_NEON_64BIT "vadd.i64 q0, q0, q4\n\t" "vadd.i64 q1, q1, q5\n\t" "vadd.i64 q2, q2, q6\n\t" "vadd.i64 q3, q3, q7\n\t" +#else + "vadd.i64 d0, d0, d8\n\t" + "vadd.i64 d1, d1, d9\n\t" + "vadd.i64 d2, d2, d10\n\t" + "vadd.i64 d3, d3, d11\n\t" + "vadd.i64 d4, d4, d12\n\t" + "vadd.i64 d5, d5, d13\n\t" + "vadd.i64 d6, d6, d14\n\t" + "vadd.i64 d7, d7, d15\n\t" +#endif /* WOLFSSL_ARM_ARCH_NEON_64BIT */ "vstm.64 %[sha512], {d0-d7}\n\t" "subs %[len], %[len], #0x80\n\t" "bne L_SHA512_transform_neon_len_begin_%=\n\t"